grub-2.14~git20250718.0e36779/0000755000175000017500000000000015036452574012071 500000000000000grub-2.14~git20250718.0e36779/coreboot.cfg0000644000175000017500000000011615000202015014252 00000000000000if test -f (cbfsdisk)/etc/grub.cfg; then source (cbfsdisk)/etc/grub.cfg fi grub-2.14~git20250718.0e36779/configure0000755000175000017500000435111715036452447013733 00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.71 for GRUB 2.14~git20250718.0e36779. # # Report bugs to . # # # Copyright (C) 1992-1996, 1998-2017, 2020-2021 Free Software Foundation, # Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh as_nop=: if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else $as_nop case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi # Reset variables that may have inherited troublesome values from # the environment. # IFS needs to be set, to space, tab, and newline, in precisely that order. # (If _AS_PATH_WALK were called with IFS unset, it would have the # side effect of setting IFS to empty, thus disabling word splitting.) # Quoting is to prevent editors from complaining about space-tab. as_nl=' ' export as_nl IFS=" "" $as_nl" PS1='$ ' PS2='> ' PS4='+ ' # Ensure predictable behavior from utilities with locale-dependent output. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # We cannot yet rely on "unset" to work, but we need these variables # to be unset--not just set to an empty or harmless value--now, to # avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct # also avoids known problems related to "unset" and subshell syntax # in other old shells (e.g. bash 2.01 and pdksh 5.2.14). for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH do eval test \${$as_var+y} \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done # Ensure that fds 0, 1, and 2 are open. if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi if (exec 3>&2) ; then :; else exec 2>/dev/null; fi # The user is always right. if ${PATH_SEPARATOR+false} :; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac test -r "$as_dir$0" && as_myself=$as_dir$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="as_nop=: if test \${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else \$as_nop case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ) then : else \$as_nop exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 blah=\$(echo \$(echo blah)) test x\"\$blah\" = xblah || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null then : as_have_required=yes else $as_nop as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null then : else $as_nop as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && as_run=a "$as_shell" -c "$as_bourne_compatible""$as_required" 2>/dev/null then : CONFIG_SHELL=$as_shell as_have_required=yes if as_run=a "$as_shell" -c "$as_bourne_compatible""$as_suggested" 2>/dev/null then : break 2 fi fi done;; esac as_found=false done IFS=$as_save_IFS if $as_found then : else $as_nop if { test -f "$SHELL" || test -f "$SHELL.exe"; } && as_run=a "$SHELL" -c "$as_bourne_compatible""$as_required" 2>/dev/null then : CONFIG_SHELL=$SHELL as_have_required=yes fi fi if test "x$CONFIG_SHELL" != x then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno then : printf "%s\n" "$0: This script requires a shell more modern than all" printf "%s\n" "$0: the shells that I found on your system." if test ${ZSH_VERSION+y} ; then printf "%s\n" "$0: In particular, zsh $ZSH_VERSION has bugs and should" printf "%s\n" "$0: be upgraded to zsh 4.3.4 or later." else printf "%s\n" "$0: Please tell bug-autoconf@gnu.org and bug-grub@gnu.org $0: about your system, including any error possibly output $0: before this message. Then install a modern shell, or $0: manually run the script under such a shell if you do $0: have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_nop # --------- # Do nothing but, unlike ":", preserve the value of $?. as_fn_nop () { return $? } as_nop=as_fn_nop # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null then : eval 'as_fn_append () { eval $1+=\$2 }' else $as_nop as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null then : eval 'as_fn_arith () { as_val=$(( $* )) }' else $as_nop as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_nop # --------- # Do nothing but, unlike ":", preserve the value of $?. as_fn_nop () { return $? } as_nop=as_fn_nop # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi printf "%s\n" "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { printf "%s\n" "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } # Determine whether it's possible to make 'echo' print without a newline. # These variables are no longer used directly by Autoconf, but are AC_SUBSTed # for compatibility with existing Makefiles. ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac # For backward compatibility with old third-party macros, we provide # the shell variables $as_echo and $as_echo_n. New code should use # AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. as_echo='printf %s\n' as_echo_n='printf %s' rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='GRUB' PACKAGE_TARNAME='grub' PACKAGE_VERSION='2.14~git20250718.0e36779' PACKAGE_STRING='GRUB 2.14~git20250718.0e36779' PACKAGE_BUGREPORT='bug-grub@gnu.org' PACKAGE_URL='' # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_STDIO_H # include #endif #ifdef HAVE_STDLIB_H # include #endif #ifdef HAVE_STRING_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_header_c_list= ac_unique_file="include/grub/dl.h" gl_use_threads_default= gl_use_winpthreads_default= gt_needs= ac_config_libobj_dir=grub-core/lib/gnulib ac_func_c_list= gl_fnmatch_required=POSIX gl_getopt_required=POSIX ac_subst_vars='gltests_LIBOBJDEPS gltests_LTLIBOBJS gltests_LIBOBJS gl_LIBOBJDEPS gl_LTLIBOBJS gl_LIBOBJS am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBOBJS COND_HAVE_PCI_FALSE COND_HAVE_PCI_TRUE COND_HAVE_EXEC_FALSE COND_HAVE_EXEC_TRUE COND_STARFIELD_FALSE COND_STARFIELD_TRUE COND_HAVE_ASM_USCORE_FALSE COND_HAVE_ASM_USCORE_TRUE COND_HAVE_CXX_FALSE COND_HAVE_CXX_TRUE COND_ENABLE_BOOT_TIME_STATS_FALSE COND_ENABLE_BOOT_TIME_STATS_TRUE COND_ENABLE_CACHE_STATS_FALSE COND_ENABLE_CACHE_STATS_TRUE COND_ENABLE_EFIEMU_FALSE COND_ENABLE_EFIEMU_TRUE COND_APPLE_LINKER_FALSE COND_APPLE_LINKER_TRUE HAVE_FONT_SOURCE COND_HAVE_FONT_SOURCE_FALSE COND_HAVE_FONT_SOURCE_TRUE COND_GRUB_PROTECT_FALSE COND_GRUB_PROTECT_TRUE COND_GRUB_MOUNT_FALSE COND_GRUB_MOUNT_TRUE COND_GRUB_MKFONT_FALSE COND_GRUB_MKFONT_TRUE COND_GRUB_EMU_PCI_FALSE COND_GRUB_EMU_PCI_TRUE COND_GRUB_EMU_SDL_FALSE COND_GRUB_EMU_SDL_TRUE COND_GRUB_EMU_SDL2_FALSE COND_GRUB_EMU_SDL2_TRUE COND_MAN_PAGES_FALSE COND_MAN_PAGES_TRUE COND_HOST_ILLUMOS_FALSE COND_HOST_ILLUMOS_TRUE COND_HOST_XNU_FALSE COND_HOST_XNU_TRUE COND_HOST_KFREEBSD_FALSE COND_HOST_KFREEBSD_TRUE COND_HOST_WINDOWS_FALSE COND_HOST_WINDOWS_TRUE COND_HOST_NETBSD_FALSE COND_HOST_NETBSD_TRUE COND_HOST_LINUX_FALSE COND_HOST_LINUX_TRUE COND_HOST_HURD_FALSE COND_HOST_HURD_TRUE COND_x86_64_xen_FALSE COND_x86_64_xen_TRUE COND_x86_64_efi_FALSE COND_x86_64_efi_TRUE COND_sparc64_emu_FALSE COND_sparc64_emu_TRUE COND_sparc64_ieee1275_FALSE COND_sparc64_ieee1275_TRUE COND_riscv64_efi_FALSE COND_riscv64_efi_TRUE COND_riscv32_efi_FALSE COND_riscv32_efi_TRUE COND_riscv64_FALSE COND_riscv64_TRUE COND_riscv32_FALSE COND_riscv32_TRUE COND_powerpc_ieee1275_FALSE COND_powerpc_ieee1275_TRUE COND_mipseb_FALSE COND_mipseb_TRUE COND_mipsel_FALSE COND_mipsel_TRUE COND_mips_qemu_mips_FALSE COND_mips_qemu_mips_TRUE COND_mips_loongson_FALSE COND_mips_loongson_TRUE COND_mips_arc_FALSE COND_mips_arc_TRUE COND_mips_FALSE COND_mips_TRUE COND_loongarch64_efi_FALSE COND_loongarch64_efi_TRUE COND_loongarch64_FALSE COND_loongarch64_TRUE COND_i386_xen_pvh_FALSE COND_i386_xen_pvh_TRUE COND_i386_xen_FALSE COND_i386_xen_TRUE COND_i386_multiboot_FALSE COND_i386_multiboot_TRUE COND_i386_coreboot_FALSE COND_i386_coreboot_TRUE COND_i386_ieee1275_FALSE COND_i386_ieee1275_TRUE COND_i386_qemu_FALSE COND_i386_qemu_TRUE COND_i386_efi_FALSE COND_i386_efi_TRUE COND_i386_pc_FALSE COND_i386_pc_TRUE COND_ia64_efi_FALSE COND_ia64_efi_TRUE COND_arm64_efi_FALSE COND_arm64_efi_TRUE COND_arm64_FALSE COND_arm64_TRUE COND_arm_efi_FALSE COND_arm_efi_TRUE COND_arm_coreboot_FALSE COND_arm_coreboot_TRUE COND_arm_uboot_FALSE COND_arm_uboot_TRUE COND_arm_FALSE COND_arm_TRUE COND_emu_FALSE COND_emu_TRUE COND_real_platform_FALSE COND_real_platform_TRUE BUILD_LIBM HOST_CCASFLAGS HOST_CPPFLAGS HOST_LDFLAGS HOST_CFLAGS TARGET_APPLE_LINKER TARGET_IMG_BASE_LDOPT TARGET_IMG_CFLAGS TARGET_IMG_LDFLAGS TARGET_CCASFLAGS TARGET_CPPFLAGS TARGET_LDFLAGS TARGET_CFLAGS TARGET_CC_VERSION TARGET_MODULE_FORMAT TARGET_OBJ2ELF TARGET_CCAS TARGET_CPP GRUB_PLATFORM GRUB_TARGET_CPU END_SYMBOL BSS_START_SYMBOL HAVE_ASM_USCORE GRUB_BOOT_MACHINE_LINK_ADDR enable_grub_protect LIBTASN1 LIBNVPAIR LIBZFS LIBLZMA LIBGEOM LIBDEVMAPPER enable_grub_mount FUSE_LIBS FUSE_CFLAGS FONT_SOURCE DJVU_FONT_SOURCE BUILD_FREETYPE_LIBS BUILD_FREETYPE_CFLAGS BUILD_WORDS_BIGENDIAN BUILD_SIZEOF_VOID_P BUILD_SIZEOF_LONG enable_grub_mkfont FREETYPE_LIBS FREETYPE_CFLAGS enable_grub_emu_pci enable_grub_emu_sdl enable_grub_emu_sdl2 LIBPCIACCESS LIBSDL HAVE_SDL2 SDL2_LIBS SDL2_CFLAGS BOOT_TIME_STATS DISK_CACHE_STATS COND_MM_DEBUG_FALSE COND_MM_DEBUG_TRUE MM_DEBUG TARGET_NMFLAGS_DEFINED_ONLY TARGET_NMFLAGS_MINUS_P GRUB_STACK_PROTECTOR_INIT TARGET_LDFLAGS_OLDMAGIC EFIEMU64_LINK_FORMAT enable_efiemu TARGET_OBJCONV BUILD_LDFLAGS BUILD_CPPFLAGS BUILD_CFLAGS HOST_CC TARGET_RANLIB TARGET_NM TARGET_STRIP TARGET_OBJCOPY ac_ct_TARGET_CC TARGET_CC LIBGNU_LTLIBDEPS LIBGNU_LIBDEPS GL_CFLAG_GNULIB_WARNINGS GL_CFLAG_ALLOW_WARNINGS gltests_WITNESS GL_COND_OBJ_WMEMPCPY_FALSE GL_COND_OBJ_WMEMPCPY_TRUE GL_COND_OBJ_WMEMCHR_FALSE GL_COND_OBJ_WMEMCHR_TRUE GL_COND_OBJ_WINDOWS_RWLOCK_FALSE GL_COND_OBJ_WINDOWS_RWLOCK_TRUE GL_COND_OBJ_WINDOWS_RECMUTEX_FALSE GL_COND_OBJ_WINDOWS_RECMUTEX_TRUE GL_COND_OBJ_WINDOWS_ONCE_FALSE GL_COND_OBJ_WINDOWS_ONCE_TRUE GL_COND_OBJ_WINDOWS_MUTEX_FALSE GL_COND_OBJ_WINDOWS_MUTEX_TRUE GL_COND_OBJ_WCWIDTH_FALSE GL_COND_OBJ_WCWIDTH_TRUE GL_GNULIB_TOWCTRANS GL_GNULIB_WCTRANS GL_GNULIB_ISWCTYPE GL_GNULIB_WCTYPE GL_GNULIB_ISWXDIGIT GL_GNULIB_ISWDIGIT GL_GNULIB_ISWBLANK REPLACE_TOWLOWER REPLACE_ISWCNTRL HAVE_WCTYPE_H NEXT_AS_FIRST_DIRECTIVE_WCTYPE_H NEXT_WCTYPE_H HAVE_ISWCNTRL REPLACE_ISWXDIGIT REPLACE_ISWDIGIT REPLACE_ISWBLANK HAVE_WCTRANS_T HAVE_WCTYPE_T HAVE_ISWBLANK GL_COND_OBJ_WCRTOMB_FALSE GL_COND_OBJ_WCRTOMB_TRUE HAVE_CRTDEFS_H HAVE_WINT_T NEXT_AS_FIRST_DIRECTIVE_WCHAR_H NEXT_WCHAR_H HAVE_FEATURES_H LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_FALSE LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_TRUE LIBUNISTRING_UNIWIDTH_H LIBUNISTRING_UNITYPES_H HAVE_UNISTD_H NEXT_AS_FIRST_DIRECTIVE_UNISTD_H NEXT_UNISTD_H GL_GNULIB_MDA_TZSET GL_GNULIB_TZSET GL_GNULIB_TIME_RZ GL_GNULIB_TIME_R GL_GNULIB_TIMESPEC_GETRES GL_GNULIB_TIMESPEC_GET GL_GNULIB_TIMEGM GL_GNULIB_STRPTIME GL_GNULIB_STRFTIME GL_GNULIB_NANOSLEEP GL_GNULIB_LOCALTIME GL_GNULIB_MKTIME GL_GNULIB_CTIME TIME_H_DEFINES_TIME_UTC UNISTD_H_DEFINES_STRUCT_TIMESPEC PTHREAD_H_DEFINES_STRUCT_TIMESPEC SYS_TIME_H_DEFINES_STRUCT_TIMESPEC TIME_H_DEFINES_STRUCT_TIMESPEC NEXT_AS_FIRST_DIRECTIVE_TIME_H NEXT_TIME_H REPLACE_LOCALTIME REPLACE_GMTIME GNULIB_GETTIMEOFDAY REPLACE_TZSET REPLACE_TIMEGM REPLACE_STRFTIME REPLACE_NANOSLEEP REPLACE_MKTIME REPLACE_LOCALTIME_R REPLACE_CTIME HAVE_TIMEZONE_T HAVE_TIMESPEC_GETRES HAVE_TIMESPEC_GET HAVE_TIMEGM HAVE_STRPTIME HAVE_NANOSLEEP HAVE_DECL_LOCALTIME_R GL_GENERATE_SYSEXITS_H_FALSE GL_GENERATE_SYSEXITS_H_TRUE SYSEXITS_H HAVE_SYSEXITS_H NEXT_AS_FIRST_DIRECTIVE_SYSEXITS_H NEXT_SYSEXITS_H WINDOWS_STAT_INODES WINDOWS_64_BIT_OFF_T NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H NEXT_SYS_TYPES_H GL_COND_OBJ_STRNLEN_FALSE GL_COND_OBJ_STRNLEN_TRUE GL_COND_OBJ_STRNDUP_FALSE GL_COND_OBJ_STRNDUP_TRUE GL_GNULIB_FFS HAVE_STRINGS_H NEXT_AS_FIRST_DIRECTIVE_STRINGS_H NEXT_STRINGS_H NEXT_AS_FIRST_DIRECTIVE_STRING_H NEXT_STRING_H GL_COND_OBJ_STRERROR_OVERRIDE_FALSE GL_COND_OBJ_STRERROR_OVERRIDE_TRUE GL_COND_OBJ_STRERROR_FALSE GL_COND_OBJ_STRERROR_TRUE GL_COND_OBJ_STRDUP_FALSE GL_COND_OBJ_STRDUP_TRUE GL_COND_OBJ_STRCHRNUL_FALSE GL_COND_OBJ_STRCHRNUL_TRUE GL_COND_OBJ_STRNCASECMP_FALSE GL_COND_OBJ_STRNCASECMP_TRUE GL_COND_OBJ_STRCASECMP_FALSE GL_COND_OBJ_STRCASECMP_TRUE HAVE_DECL_STRNCASECMP HAVE_STRCASECMP HAVE_FFS NEXT_AS_FIRST_DIRECTIVE_STDLIB_H NEXT_STDLIB_H GL_COND_OBJ_STDIO_WRITE_FALSE GL_COND_OBJ_STDIO_WRITE_TRUE GL_COND_OBJ_STDIO_READ_FALSE GL_COND_OBJ_STDIO_READ_TRUE NEXT_AS_FIRST_DIRECTIVE_STDIO_H NEXT_STDIO_H GL_GENERATE_STDINT_H_FALSE GL_GENERATE_STDINT_H_TRUE STDINT_H GL_GENERATE_STDDEF_H_FALSE GL_GENERATE_STDDEF_H_TRUE STDDEF_H GL_GENERATE_STDBOOL_H_FALSE GL_GENERATE_STDBOOL_H_TRUE STDBOOL_H HAVE__BOOL GL_GENERATE_STDALIGN_H_FALSE GL_GENERATE_STDALIGN_H_TRUE STDALIGN_H GL_COND_OBJ_STAT_FALSE GL_COND_OBJ_STAT_TRUE GL_COND_OBJ_SLEEP_FALSE GL_COND_OBJ_SLEEP_TRUE GL_COND_OBJ_SETLOCALE_LOCK_FALSE GL_COND_OBJ_SETLOCALE_LOCK_TRUE GL_COND_OBJ_REGEX_FALSE GL_COND_OBJ_REGEX_TRUE GL_COND_OBJ_REALLOCARRAY_FALSE GL_COND_OBJ_REALLOCARRAY_TRUE GL_COND_OBJ_RAWMEMCHR_FALSE GL_COND_OBJ_RAWMEMCHR_TRUE GL_COND_OBJ_PIPE_FALSE GL_COND_OBJ_PIPE_TRUE GL_COND_OBJ_OPENAT_FALSE GL_COND_OBJ_OPENAT_TRUE GL_COND_OBJ_OPEN_FALSE GL_COND_OBJ_OPEN_TRUE GL_COND_OBJ_NL_LANGINFO_LOCK_FALSE GL_COND_OBJ_NL_LANGINFO_LOCK_TRUE GL_COND_OBJ_NL_LANGINFO_FALSE GL_COND_OBJ_NL_LANGINFO_TRUE LIB_NL_LANGINFO GL_COND_OBJ_MSVC_NOTHROW_FALSE GL_COND_OBJ_MSVC_NOTHROW_TRUE GL_COND_OBJ_MSVC_INVAL_FALSE GL_COND_OBJ_MSVC_INVAL_TRUE GL_COND_OBJ_MEMRCHR_FALSE GL_COND_OBJ_MEMRCHR_TRUE GL_COND_OBJ_MEMPCPY_FALSE GL_COND_OBJ_MEMPCPY_TRUE GL_GNULIB_MDA_STRDUP GL_GNULIB_MDA_MEMCCPY GL_GNULIB_STRVERSCMP GL_GNULIB_STRSIGNAL GL_GNULIB_SIGDESCR_NP GL_GNULIB_SIGABBREV_NP GL_GNULIB_STRERRORNAME_NP GL_GNULIB_STRERROR_R GL_GNULIB_STRERROR GL_GNULIB_MBSTOK_R GL_GNULIB_MBSSEP GL_GNULIB_MBSSPN GL_GNULIB_MBSPBRK GL_GNULIB_MBSCSPN GL_GNULIB_MBSCASESTR GL_GNULIB_MBSPCASECMP GL_GNULIB_MBSNCASECMP GL_GNULIB_MBSCASECMP GL_GNULIB_MBSSTR GL_GNULIB_MBSRCHR GL_GNULIB_MBSCHR GL_GNULIB_MBSNLEN GL_GNULIB_MBSLEN GL_GNULIB_STRTOK_R GL_GNULIB_STRCASESTR GL_GNULIB_STRSTR GL_GNULIB_STRSEP GL_GNULIB_STRPBRK GL_GNULIB_STRNLEN GL_GNULIB_STRNDUP GL_GNULIB_STRNCAT GL_GNULIB_STRDUP GL_GNULIB_STRCHRNUL GL_GNULIB_STPNCPY GL_GNULIB_STPCPY GL_GNULIB_RAWMEMCHR GL_GNULIB_MEMRCHR GL_GNULIB_MEMPCPY GL_GNULIB_MEMMEM GL_GNULIB_MEMCHR GL_GNULIB_FFSLL GL_GNULIB_FFSL GL_GNULIB_EXPLICIT_BZERO GL_COND_OBJ_MEMCHR_FALSE GL_COND_OBJ_MEMCHR_TRUE UNDEFINE_STRTOK_R REPLACE_STRSIGNAL REPLACE_STRERRORNAME_NP REPLACE_STRERROR_R REPLACE_STRERROR REPLACE_STRTOK_R REPLACE_STRCASESTR REPLACE_STRSTR REPLACE_STRNLEN REPLACE_STRNDUP REPLACE_STRNCAT REPLACE_STRDUP REPLACE_STRCHRNUL REPLACE_STPNCPY REPLACE_MEMMEM REPLACE_MEMCHR REPLACE_FFSLL HAVE_STRVERSCMP HAVE_DECL_STRSIGNAL HAVE_SIGDESCR_NP HAVE_SIGABBREV_NP HAVE_STRERRORNAME_NP HAVE_DECL_STRERROR_R HAVE_DECL_STRTOK_R HAVE_STRCASESTR HAVE_STRSEP HAVE_STRPBRK HAVE_DECL_STRNLEN HAVE_DECL_STRNDUP HAVE_DECL_STRDUP HAVE_STRCHRNUL HAVE_STPNCPY HAVE_STPCPY HAVE_RAWMEMCHR HAVE_DECL_MEMRCHR HAVE_MEMPCPY HAVE_DECL_MEMMEM HAVE_FFSLL HAVE_FFSL HAVE_EXPLICIT_BZERO HAVE_MBSLEN GL_COND_OBJ_MBTOWC_FALSE GL_COND_OBJ_MBTOWC_TRUE GL_COND_OBJ_MBSRTOWCS_FALSE GL_COND_OBJ_MBSRTOWCS_TRUE GL_COND_OBJ_MBSINIT_FALSE GL_COND_OBJ_MBSINIT_TRUE HAVE_VISIBILITY CFLAG_VISIBILITY GL_COND_OBJ_MBRTOWC_FALSE GL_COND_OBJ_MBRTOWC_TRUE LIB_MBRTOWC LOCALE_ZH_CN LOCALE_FR_UTF8 LOCALE_JA LTLIBMULTITHREAD LIBMULTITHREAD LTLIBTHREAD LIBTHREAD LIBSTDTHREAD GL_COND_OBJ_LOCALECONV_FALSE GL_COND_OBJ_LOCALECONV_TRUE GL_GNULIB_LOCALENAME GL_GNULIB_DUPLOCALE GL_GNULIB_SETLOCALE_NULL GL_GNULIB_SETLOCALE GL_GNULIB_LOCALECONV NEXT_AS_FIRST_DIRECTIVE_LOCALE_H NEXT_LOCALE_H HAVE_XLOCALE_H NEXT_AS_FIRST_DIRECTIVE_STDDEF_H NEXT_STDDEF_H HAVE_WCHAR_T HAVE_MAX_ALIGN_T REPLACE_NULL LOCALENAME_ENHANCE_LOCALE_FUNCS REPLACE_STRUCT_LCONV REPLACE_FREELOCALE REPLACE_DUPLOCALE REPLACE_NEWLOCALE REPLACE_SETLOCALE REPLACE_LOCALECONV HAVE_FREELOCALE HAVE_DUPLOCALE HAVE_NEWLOCALE LOCALCHARSET_TESTS_ENVIRONMENT GL_GENERATE_LIMITS_H_FALSE GL_GENERATE_LIMITS_H_TRUE LIMITS_H GL_GNULIB_NL_LANGINFO HAVE_LANGINFO_YESEXPR HAVE_LANGINFO_ERA HAVE_LANGINFO_ALTMON HAVE_LANGINFO_T_FMT_AMPM HAVE_LANGINFO_CODESET HAVE_LANGINFO_H NEXT_AS_FIRST_DIRECTIVE_LANGINFO_H NEXT_LANGINFO_H REPLACE_NL_LANGINFO HAVE_NL_LANGINFO GL_COND_OBJ_ISBLANK_FALSE GL_COND_OBJ_ISBLANK_TRUE GL_GNULIB_STRTOUMAX GL_GNULIB_STRTOIMAX GL_GNULIB_IMAXDIV GL_GNULIB_IMAXABS NEXT_AS_FIRST_DIRECTIVE_INTTYPES_H NEXT_INTTYPES_H UINT64_MAX_EQ_ULONG_MAX UINT32_MAX_LT_UINTMAX_MAX PRIPTR_PREFIX INT64_MAX_EQ_LONG_MAX INT32_MAX_LT_INTMAX_MAX REPLACE_STRTOUMAX REPLACE_STRTOIMAX HAVE_IMAXDIV_T HAVE_DECL_STRTOUMAX HAVE_DECL_STRTOIMAX HAVE_DECL_IMAXDIV HAVE_DECL_IMAXABS HAVE_SYS_INTTYPES_H HAVE_SYS_BITYPES_H HAVE_C99_STDINT_H WINT_T_SUFFIX WCHAR_T_SUFFIX SIG_ATOMIC_T_SUFFIX SIZE_T_SUFFIX PTRDIFF_T_SUFFIX HAVE_SIGNED_WINT_T HAVE_SIGNED_WCHAR_T HAVE_SIGNED_SIG_ATOMIC_T BITSIZEOF_WINT_T BITSIZEOF_WCHAR_T BITSIZEOF_SIG_ATOMIC_T BITSIZEOF_SIZE_T BITSIZEOF_PTRDIFF_T APPLE_UNIVERSAL_BUILD HAVE_STDINT_H NEXT_AS_FIRST_DIRECTIVE_STDINT_H NEXT_STDINT_H HAVE_SYS_TYPES_H HAVE_INTTYPES_H HAVE_WCHAR_H GNULIBHEADERS_OVERRIDE_WINT_T NEXT_AS_FIRST_DIRECTIVE_LIMITS_H NEXT_LIMITS_H LIB_HARD_LOCALE LIB_SETLOCALE_NULL LIB_SCHED_YIELD LIBPMULTITHREAD LIBPTHREAD GL_COND_OBJ_GETOPT_FALSE GL_COND_OBJ_GETOPT_TRUE GL_GENERATE_GETOPT_CDEFS_H_FALSE GL_GENERATE_GETOPT_CDEFS_H_TRUE GETOPT_CDEFS_H GL_GENERATE_GETOPT_H_FALSE GL_GENERATE_GETOPT_H_TRUE GETOPT_H HAVE_SYS_CDEFS_H HAVE_GETOPT_H NEXT_AS_FIRST_DIRECTIVE_GETOPT_H NEXT_GETOPT_H GL_COND_OBJ_GETLINE_FALSE GL_COND_OBJ_GETLINE_TRUE GL_COND_OBJ_GETDTABLESIZE_FALSE GL_COND_OBJ_GETDTABLESIZE_TRUE GL_GNULIB_MDA_TEMPNAM GL_GNULIB_MDA_PUTW GL_GNULIB_MDA_GETW GL_GNULIB_MDA_FILENO GL_GNULIB_MDA_FDOPEN GL_GNULIB_MDA_FCLOSEALL GL_GNULIB_VSPRINTF_POSIX GL_GNULIB_VSNPRINTF GL_GNULIB_VPRINTF_POSIX GL_GNULIB_VPRINTF GL_GNULIB_VFPRINTF_POSIX GL_GNULIB_VFPRINTF GL_GNULIB_VDPRINTF GL_GNULIB_VSCANF GL_GNULIB_VFSCANF GL_GNULIB_VASPRINTF GL_GNULIB_TMPFILE GL_GNULIB_STDIO_H_SIGPIPE GL_GNULIB_STDIO_H_NONBLOCKING GL_GNULIB_SPRINTF_POSIX GL_GNULIB_SNPRINTF GL_GNULIB_SCANF GL_GNULIB_RENAMEAT GL_GNULIB_RENAME GL_GNULIB_REMOVE GL_GNULIB_PUTS GL_GNULIB_PUTCHAR GL_GNULIB_PUTC GL_GNULIB_PRINTF_POSIX GL_GNULIB_PRINTF GL_GNULIB_POPEN GL_GNULIB_PERROR GL_GNULIB_PCLOSE GL_GNULIB_OBSTACK_PRINTF_POSIX GL_GNULIB_OBSTACK_PRINTF GL_GNULIB_GETLINE GL_GNULIB_GETDELIM GL_GNULIB_GETCHAR GL_GNULIB_GETC GL_GNULIB_FWRITE GL_GNULIB_FTELLO GL_GNULIB_FTELL GL_GNULIB_FSEEKO GL_GNULIB_FSEEK GL_GNULIB_FSCANF GL_GNULIB_FREOPEN GL_GNULIB_FREAD GL_GNULIB_FPUTS GL_GNULIB_FPUTC GL_GNULIB_FPURGE GL_GNULIB_FPRINTF_POSIX GL_GNULIB_FPRINTF GL_GNULIB_FOPEN_GNU GL_GNULIB_FOPEN GL_GNULIB_FGETS GL_GNULIB_FGETC GL_GNULIB_FFLUSH GL_GNULIB_FDOPEN GL_GNULIB_FCLOSE GL_GNULIB_DPRINTF GL_COND_OBJ_GETDELIM_FALSE GL_COND_OBJ_GETDELIM_TRUE REPLACE_VSPRINTF REPLACE_VSNPRINTF REPLACE_VPRINTF REPLACE_VFPRINTF REPLACE_VDPRINTF REPLACE_VASPRINTF REPLACE_TMPFILE REPLACE_STDIO_WRITE_FUNCS REPLACE_STDIO_READ_FUNCS REPLACE_SPRINTF REPLACE_SNPRINTF REPLACE_RENAMEAT REPLACE_RENAME REPLACE_REMOVE REPLACE_PRINTF REPLACE_POPEN REPLACE_PERROR REPLACE_OBSTACK_PRINTF REPLACE_GETLINE REPLACE_GETDELIM REPLACE_FTELLO REPLACE_FTELL REPLACE_FSEEKO REPLACE_FSEEK REPLACE_FREOPEN REPLACE_FPURGE REPLACE_FPRINTF REPLACE_FOPEN_FOR_FOPEN_GNU REPLACE_FOPEN REPLACE_FFLUSH REPLACE_FDOPEN REPLACE_FCLOSE REPLACE_DPRINTF HAVE_VDPRINTF HAVE_VASPRINTF HAVE_RENAMEAT HAVE_POPEN HAVE_PCLOSE HAVE_FTELLO HAVE_FSEEKO HAVE_DPRINTF HAVE_DECL_VSNPRINTF HAVE_DECL_SNPRINTF HAVE_DECL_OBSTACK_PRINTF HAVE_DECL_GETLINE HAVE_DECL_GETDELIM HAVE_DECL_FTELLO HAVE_DECL_FSEEKO HAVE_DECL_FPURGE HAVE_DECL_FCLOSEALL GL_COND_OBJ_GETCWD_LGPL_FALSE GL_COND_OBJ_GETCWD_LGPL_TRUE GL_GNULIB_MDA_UMASK GL_GNULIB_MDA_MKDIR GL_GNULIB_MDA_CHMOD GL_GNULIB_OVERRIDES_STRUCT_STAT GL_GNULIB_UTIMENSAT GL_GNULIB_STAT GL_GNULIB_MKNODAT GL_GNULIB_MKNOD GL_GNULIB_MKFIFOAT GL_GNULIB_MKFIFO GL_GNULIB_MKDIRAT GL_GNULIB_MKDIR GL_GNULIB_LSTAT GL_GNULIB_LCHMOD GL_GNULIB_GETUMASK GL_GNULIB_FUTIMENS GL_GNULIB_FSTATAT GL_GNULIB_FSTAT GL_GNULIB_FCHMODAT WINDOWS_64_BIT_ST_SIZE WINDOWS_STAT_TIMESPEC NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H NEXT_SYS_STAT_H GL_COND_OBJ_FSTAT_FALSE GL_COND_OBJ_FSTAT_TRUE REPLACE_UTIMENSAT REPLACE_STAT REPLACE_MKNODAT REPLACE_MKNOD REPLACE_MKFIFOAT REPLACE_MKFIFO REPLACE_MKDIR REPLACE_LSTAT REPLACE_FUTIMENS REPLACE_FSTATAT REPLACE_FSTAT REPLACE_FCHMODAT HAVE_UTIMENSAT HAVE_MKNODAT HAVE_MKNOD HAVE_MKFIFOAT HAVE_MKFIFO HAVE_MKDIRAT HAVE_LSTAT HAVE_LCHMOD HAVE_GETUMASK HAVE_FUTIMENS HAVE_FSTATAT HAVE_FCHMODAT GL_COND_OBJ_FREE_FALSE GL_COND_OBJ_FREE_TRUE GL_GENERATE_FNMATCH_H_FALSE GL_GENERATE_FNMATCH_H_TRUE FNMATCH_H GL_GNULIB_FNMATCH HAVE_FNMATCH_H NEXT_AS_FIRST_DIRECTIVE_FNMATCH_H NEXT_FNMATCH_H REPLACE_FNMATCH HAVE_FNMATCH GL_COND_OBJ_ITOLD_FALSE GL_COND_OBJ_ITOLD_TRUE GL_COND_OBJ_FLOAT_FALSE GL_COND_OBJ_FLOAT_TRUE GL_GENERATE_FLOAT_H_FALSE GL_GENERATE_FLOAT_H_TRUE FLOAT_H REPLACE_ITOLD NEXT_AS_FIRST_DIRECTIVE_FLOAT_H NEXT_FLOAT_H NEXT_AS_FIRST_DIRECTIVE_FCNTL_H NEXT_FCNTL_H GL_GNULIB_MDA_OPEN GL_GNULIB_MDA_CREAT GL_GNULIB_OPENAT GL_GNULIB_OPEN GL_GNULIB_NONBLOCKING GL_GNULIB_FCNTL GL_GNULIB_CREAT GL_COND_OBJ_FCNTL_FALSE GL_COND_OBJ_FCNTL_TRUE REPLACE_OPENAT REPLACE_OPEN REPLACE_FCNTL REPLACE_CREAT HAVE_OPENAT HAVE_FCNTL GL_COND_OBJ_FCHDIR_FALSE GL_COND_OBJ_FCHDIR_TRUE GL_COND_OBJ_ERROR_FALSE GL_COND_OBJ_ERROR_TRUE GL_GENERATE_ERRNO_H_FALSE GL_GENERATE_ERRNO_H_TRUE ERRNO_H EOVERFLOW_VALUE EOVERFLOW_HIDDEN ENOLINK_VALUE ENOLINK_HIDDEN EMULTIHOP_VALUE EMULTIHOP_HIDDEN NEXT_AS_FIRST_DIRECTIVE_ERRNO_H NEXT_ERRNO_H GL_COND_OBJ_DUP2_FALSE GL_COND_OBJ_DUP2_TRUE GL_COND_OBJ_DIRFD_FALSE GL_COND_OBJ_DIRFD_TRUE GL_GNULIB_ALPHASORT GL_GNULIB_SCANDIR GL_GNULIB_FDOPENDIR GL_GNULIB_DIRFD GL_GNULIB_CLOSEDIR GL_GNULIB_REWINDDIR GL_GNULIB_READDIR GL_GNULIB_OPENDIR HAVE_DIRENT_H NEXT_AS_FIRST_DIRECTIVE_DIRENT_H NEXT_DIRENT_H REPLACE_FDOPENDIR REPLACE_DIRFD REPLACE_CLOSEDIR REPLACE_OPENDIR HAVE_ALPHASORT HAVE_SCANDIR HAVE_FDOPENDIR HAVE_DECL_FDOPENDIR HAVE_DECL_DIRFD HAVE_CLOSEDIR HAVE_REWINDDIR HAVE_READDIR HAVE_OPENDIR GL_GNULIB_ISBLANK NEXT_AS_FIRST_DIRECTIVE_CTYPE_H NEXT_CTYPE_H PRAGMA_COLUMNS PRAGMA_SYSTEM_HEADER INCLUDE_NEXT_AS_FIRST_DIRECTIVE INCLUDE_NEXT HAVE_ISBLANK GL_COND_OBJ_CLOSE_FALSE GL_COND_OBJ_CLOSE_TRUE HAVE_WINSOCK2_H HAVE_MSVC_INVALID_PARAMETER_HANDLER GL_COND_OBJ_CHDIR_LONG_FALSE GL_COND_OBJ_CHDIR_LONG_TRUE UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS UNISTD_H_HAVE_WINSOCK2_H UNISTD_H_HAVE_SYS_RANDOM_H REPLACE_WRITE REPLACE_USLEEP REPLACE_UNLINKAT REPLACE_UNLINK REPLACE_TTYNAME_R REPLACE_TRUNCATE REPLACE_SYMLINKAT REPLACE_SYMLINK REPLACE_SLEEP REPLACE_RMDIR REPLACE_READLINKAT REPLACE_READLINK REPLACE_READ REPLACE_PWRITE REPLACE_PREAD REPLACE_LSEEK REPLACE_LINKAT REPLACE_LINK REPLACE_LCHOWN REPLACE_ISATTY REPLACE_GETPASS_FOR_GETPASS_GNU REPLACE_GETPASS REPLACE_GETPAGESIZE REPLACE_GETGROUPS REPLACE_GETLOGIN_R REPLACE_GETDTABLESIZE REPLACE_GETDOMAINNAME REPLACE_GETCWD REPLACE_FTRUNCATE REPLACE_FCHOWNAT REPLACE_FACCESSAT REPLACE_EXECVPE REPLACE_EXECVP REPLACE_EXECVE REPLACE_EXECV REPLACE_EXECLP REPLACE_EXECLE REPLACE_EXECL REPLACE_DUP2 REPLACE_DUP REPLACE_COPY_FILE_RANGE REPLACE_CLOSE REPLACE_CHOWN REPLACE_ACCESS HAVE_SYS_PARAM_H HAVE_OS_H HAVE_DECL_TTYNAME_R HAVE_DECL_TRUNCATE HAVE_DECL_SETHOSTNAME HAVE_DECL_GETUSERSHELL HAVE_DECL_GETPAGESIZE HAVE_DECL_GETLOGIN_R HAVE_DECL_GETLOGIN HAVE_DECL_GETDOMAINNAME HAVE_DECL_FDATASYNC HAVE_DECL_FCHDIR HAVE_DECL_EXECVPE HAVE_DECL_ENVIRON HAVE_USLEEP HAVE_UNLINKAT HAVE_SYMLINKAT HAVE_SYMLINK HAVE_SLEEP HAVE_SETHOSTNAME HAVE_READLINKAT HAVE_READLINK HAVE_PWRITE HAVE_PREAD HAVE_PIPE2 HAVE_PIPE HAVE_LINKAT HAVE_LINK HAVE_LCHOWN HAVE_GROUP_MEMBER HAVE_GETPASS HAVE_GETPAGESIZE HAVE_GETLOGIN HAVE_GETHOSTNAME HAVE_GETGROUPS HAVE_GETENTROPY HAVE_GETDTABLESIZE HAVE_FTRUNCATE HAVE_FSYNC HAVE_FDATASYNC HAVE_FCHOWNAT HAVE_FCHDIR HAVE_FACCESSAT HAVE_EXECVPE HAVE_EUIDACCESS HAVE_DUP3 HAVE_COPY_FILE_RANGE HAVE_CHOWN GL_GNULIB_MDA_WRITE GL_GNULIB_MDA_UNLINK GL_GNULIB_MDA_SWAB GL_GNULIB_MDA_RMDIR GL_GNULIB_MDA_READ GL_GNULIB_MDA_LSEEK GL_GNULIB_MDA_ISATTY GL_GNULIB_MDA_GETPID GL_GNULIB_MDA_GETCWD GL_GNULIB_MDA_EXECVPE GL_GNULIB_MDA_EXECVP GL_GNULIB_MDA_EXECVE GL_GNULIB_MDA_EXECV GL_GNULIB_MDA_EXECLP GL_GNULIB_MDA_EXECLE GL_GNULIB_MDA_EXECL GL_GNULIB_MDA_DUP2 GL_GNULIB_MDA_DUP GL_GNULIB_MDA_CLOSE GL_GNULIB_MDA_CHDIR GL_GNULIB_MDA_ACCESS GL_GNULIB_WRITE GL_GNULIB_USLEEP GL_GNULIB_UNLINKAT GL_GNULIB_UNLINK GL_GNULIB_UNISTD_H_SIGPIPE GL_GNULIB_UNISTD_H_NONBLOCKING GL_GNULIB_UNISTD_H_GETOPT GL_GNULIB_TTYNAME_R GL_GNULIB_TRUNCATE GL_GNULIB_SYMLINKAT GL_GNULIB_SYMLINK GL_GNULIB_SLEEP GL_GNULIB_SETHOSTNAME GL_GNULIB_RMDIR GL_GNULIB_READLINKAT GL_GNULIB_READLINK GL_GNULIB_READ GL_GNULIB_PWRITE GL_GNULIB_PREAD GL_GNULIB_PIPE2 GL_GNULIB_PIPE GL_GNULIB_LSEEK GL_GNULIB_LINKAT GL_GNULIB_LINK GL_GNULIB_LCHOWN GL_GNULIB_ISATTY GL_GNULIB_GROUP_MEMBER GL_GNULIB_GETUSERSHELL GL_GNULIB_GETPASS_GNU GL_GNULIB_GETPASS GL_GNULIB_GETPAGESIZE GL_GNULIB_GETOPT_POSIX GL_GNULIB_GETLOGIN_R GL_GNULIB_GETLOGIN GL_GNULIB_GETHOSTNAME GL_GNULIB_GETGROUPS GL_GNULIB_GETENTROPY GL_GNULIB_GETDTABLESIZE GL_GNULIB_GETDOMAINNAME GL_GNULIB_GETCWD GL_GNULIB_FTRUNCATE GL_GNULIB_FSYNC GL_GNULIB_FDATASYNC GL_GNULIB_FCHOWNAT GL_GNULIB_FCHDIR GL_GNULIB_FACCESSAT GL_GNULIB_EXECVPE GL_GNULIB_EXECVP GL_GNULIB_EXECVE GL_GNULIB_EXECV GL_GNULIB_EXECLP GL_GNULIB_EXECLE GL_GNULIB_EXECL GL_GNULIB_EUIDACCESS GL_GNULIB_ENVIRON GL_GNULIB_DUP3 GL_GNULIB_DUP2 GL_GNULIB_DUP GL_GNULIB_COPY_FILE_RANGE GL_GNULIB_CLOSE GL_GNULIB_CHOWN GL_GNULIB_CHDIR GL_GNULIB_ACCESS REPLACE_WCTOMB REPLACE_UNSETENV REPLACE_STRTOULL REPLACE_STRTOUL REPLACE_STRTOLL REPLACE_STRTOLD REPLACE_STRTOL REPLACE_STRTOD REPLACE_SETSTATE REPLACE_SETENV REPLACE_REALPATH REPLACE_REALLOCARRAY REPLACE_REALLOC_FOR_REALLOC_POSIX REPLACE_REALLOC_FOR_REALLOC_GNU REPLACE_RANDOM_R REPLACE_RANDOM REPLACE_QSORT_R REPLACE_PUTENV REPLACE_PTSNAME_R REPLACE_PTSNAME REPLACE_POSIX_MEMALIGN REPLACE_MKSTEMP REPLACE_MBTOWC REPLACE_MALLOC_FOR_MALLOC_POSIX REPLACE_MALLOC_FOR_MALLOC_GNU REPLACE_INITSTATE REPLACE_FREE REPLACE_CANONICALIZE_FILE_NAME REPLACE_CALLOC_FOR_CALLOC_POSIX REPLACE_CALLOC_FOR_CALLOC_GNU REPLACE_ALIGNED_ALLOC HAVE_DECL_UNSETENV HAVE_UNLOCKPT HAVE_SYS_LOADAVG_H HAVE_STRUCT_RANDOM_DATA HAVE_STRTOULL HAVE_STRTOUL HAVE_STRTOLL HAVE_STRTOLD HAVE_STRTOL HAVE_STRTOD HAVE_DECL_SETSTATE HAVE_SETSTATE HAVE_DECL_SETENV HAVE_SETENV HAVE_SECURE_GETENV HAVE_RPMATCH HAVE_REALPATH HAVE_REALLOCARRAY HAVE_RANDOM_R HAVE_RANDOM_H HAVE_RANDOM HAVE_QSORT_R HAVE_PTSNAME_R HAVE_PTSNAME HAVE_POSIX_OPENPT HAVE_POSIX_MEMALIGN HAVE_MKSTEMPS HAVE_MKSTEMP HAVE_MKOSTEMPS HAVE_MKOSTEMP HAVE_MKDTEMP HAVE_MBTOWC HAVE_DECL_INITSTATE HAVE_INITSTATE HAVE_GRANTPT HAVE_GETSUBOPT HAVE_DECL_GETLOADAVG HAVE_DECL_GCVT HAVE_DECL_FCVT HAVE_DECL_ECVT HAVE_CANONICALIZE_FILE_NAME HAVE_ATOLL HAVE_ALIGNED_ALLOC HAVE__EXIT GL_GNULIB_MDA_PUTENV GL_GNULIB_MDA_MKTEMP GL_GNULIB_MDA_GCVT GL_GNULIB_MDA_FCVT GL_GNULIB_MDA_ECVT GL_GNULIB_WCTOMB GL_GNULIB_UNSETENV GL_GNULIB_UNLOCKPT GL_GNULIB_SYSTEM_POSIX GL_GNULIB_STRTOULL GL_GNULIB_STRTOUL GL_GNULIB_STRTOLL GL_GNULIB_STRTOLD GL_GNULIB_STRTOL GL_GNULIB_STRTOD GL_GNULIB_SETENV GL_GNULIB_SECURE_GETENV GL_GNULIB_RPMATCH GL_GNULIB_REALPATH GL_GNULIB_REALLOC_POSIX GL_GNULIB_REALLOC_GNU GL_GNULIB_REALLOCARRAY GL_GNULIB_RANDOM_R GL_GNULIB_RANDOM GL_GNULIB_QSORT_R GL_GNULIB_PUTENV GL_GNULIB_PTSNAME_R GL_GNULIB_PTSNAME GL_GNULIB_POSIX_OPENPT GL_GNULIB_POSIX_MEMALIGN GL_GNULIB_MKSTEMPS GL_GNULIB_MKSTEMP GL_GNULIB_MKOSTEMPS GL_GNULIB_MKOSTEMP GL_GNULIB_MKDTEMP GL_GNULIB_MBTOWC GL_GNULIB_MALLOC_POSIX GL_GNULIB_MALLOC_GNU GL_GNULIB_GRANTPT GL_GNULIB_GETSUBOPT GL_GNULIB_GETLOADAVG GL_GNULIB_FREE_POSIX GL_GNULIB_CANONICALIZE_FILE_NAME GL_GNULIB_CALLOC_POSIX GL_GNULIB_CALLOC_GNU GL_GNULIB_ATOLL GL_GNULIB_ALIGNED_ALLOC GL_GNULIB__EXIT GL_GNULIB_MDA_WCSDUP GL_GNULIB_WCSFTIME GL_GNULIB_WCSWIDTH GL_GNULIB_WCSTOK GL_GNULIB_WCSSTR GL_GNULIB_WCSPBRK GL_GNULIB_WCSSPN GL_GNULIB_WCSCSPN GL_GNULIB_WCSRCHR GL_GNULIB_WCSCHR GL_GNULIB_WCSDUP GL_GNULIB_WCSXFRM GL_GNULIB_WCSCOLL GL_GNULIB_WCSNCASECMP GL_GNULIB_WCSCASECMP GL_GNULIB_WCSNCMP GL_GNULIB_WCSCMP GL_GNULIB_WCSNCAT GL_GNULIB_WCSCAT GL_GNULIB_WCPNCPY GL_GNULIB_WCSNCPY GL_GNULIB_WCPCPY GL_GNULIB_WCSCPY GL_GNULIB_WCSNLEN GL_GNULIB_WCSLEN GL_GNULIB_WMEMSET GL_GNULIB_WMEMPCPY GL_GNULIB_WMEMMOVE GL_GNULIB_WMEMCPY GL_GNULIB_WMEMCMP GL_GNULIB_WMEMCHR GL_GNULIB_WCWIDTH GL_GNULIB_WCSNRTOMBS GL_GNULIB_WCSRTOMBS GL_GNULIB_WCRTOMB GL_GNULIB_MBSNRTOWCS GL_GNULIB_MBSRTOWCS GL_GNULIB_MBRLEN GL_GNULIB_MBRTOWC GL_GNULIB_MBSINIT GL_GNULIB_WCTOB GL_GNULIB_BTOWC GL_COND_OBJ_BTOWC_FALSE GL_COND_OBJ_BTOWC_TRUE LOCALE_FR REPLACE_WCSTOK REPLACE_WCSFTIME REPLACE_WCSWIDTH REPLACE_WCWIDTH REPLACE_WCSNRTOMBS REPLACE_WCSRTOMBS REPLACE_WCRTOMB REPLACE_MBSNRTOWCS REPLACE_MBSRTOWCS REPLACE_MBRLEN REPLACE_MBRTOWC REPLACE_MBSINIT REPLACE_WCTOB REPLACE_BTOWC REPLACE_MBSTATE_T HAVE_DECL_WCWIDTH HAVE_DECL_WCSDUP HAVE_DECL_WCTOB HAVE_WCSFTIME HAVE_WCSWIDTH HAVE_WCSTOK HAVE_WCSSTR HAVE_WCSPBRK HAVE_WCSSPN HAVE_WCSCSPN HAVE_WCSRCHR HAVE_WCSCHR HAVE_WCSDUP HAVE_WCSXFRM HAVE_WCSCOLL HAVE_WCSNCASECMP HAVE_WCSCASECMP HAVE_WCSNCMP HAVE_WCSCMP HAVE_WCSNCAT HAVE_WCSCAT HAVE_WCPNCPY HAVE_WCSNCPY HAVE_WCPCPY HAVE_WCSCPY HAVE_WCSNLEN HAVE_WCSLEN HAVE_WMEMSET HAVE_WMEMPCPY HAVE_WMEMMOVE HAVE_WMEMCPY HAVE_WMEMCMP HAVE_WMEMCHR HAVE_WCSNRTOMBS HAVE_WCSRTOMBS HAVE_WCRTOMB HAVE_MBSNRTOWCS HAVE_MBSRTOWCS HAVE_MBRLEN HAVE_MBRTOWC HAVE_MBSINIT HAVE_BTOWC GL_GENERATE_ALLOCA_H_FALSE GL_GENERATE_ALLOCA_H_TRUE ALLOCA_H HAVE_ALLOCA_H ALLOCA GL_COND_LIBTOOL_FALSE GL_COND_LIBTOOL_TRUE BUILD_SHEBANG BUILD_EXEEXT BUILD_CC LIBUTIL HELP2MAN POSUB LTLIBINTL LIBINTL INTLLIBS LTLIBICONV LIBICONV INTL_MACOSX_LIBS XGETTEXT_EXTRA_OPTIONS MSGMERGE XGETTEXT_015 XGETTEXT GMSGFMT_015 MSGFMT_015 GMSGFMT MSGFMT GETTEXT_MACRO_VERSION USE_NLS SED HAVE_CXX pkgpyexecdir pyexecdir pkgpythondir pythondir PYTHON_EXEC_PREFIX PYTHON_PREFIX PYTHON_PLATFORM PYTHON_VERSION PYTHON am__fastdepCCAS_FALSE am__fastdepCCAS_TRUE CCASDEPMODE CCASFLAGS CCAS am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE ac_ct_CXX CXXFLAGS CXX ARFLAGS AR EGREP GREP CPP LN_S YFLAGS LEXLIB LEX_OUTPUT_ROOT LEX RANLIB YACC CMP grubdirname bootdirname platform host_kernel TARGET_DECOMPRESSOR_LINK_ADDR TARGET_LINK_ADDR grub_file grub_render_label grub_sparc64_setup grub_set_default grub_script_check grub_reboot grub_protect grub_probe grub_mkrescue grub_mkrelpath grub_mkpasswd_pbkdf2 grub_mklayout grub_glue_efi grub_mkimage grub_mkfont grub_mkconfig grub_install grub_editenv grub_bios_setup PKG_CONFIG_LIBDIR PKG_CONFIG_PATH PKG_CONFIG AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V CSCOPE ETAGS CTAGS am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__include DEPDIR am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_os target_vendor target_cpu target host_os host_vendor host_cpu host build_os build_vendor build_cpu build OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir runstatedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL am__quote' ac_subst_files='' ac_user_opts=' enable_option_checking enable_dependency_tracking enable_silent_rules with_platform with_bootdir with_grubdir enable_largefile enable_year2038 enable_threads with_python_sys_prefix with_python_prefix with_python_exec_prefix enable_nls with_gnu_ld enable_rpath with_libiconv_prefix with_libintl_prefix enable_cross_guesses with_included_regex enable_efiemu enable_stack_protector enable_mm_debug enable_cache_stats enable_boot_time enable_grub_emu_sdl2 enable_grub_emu_sdl enable_grub_emu_pci enable_grub_mkfont enable_grub_themes with_dejavufont with_unifont enable_grub_mount enable_device_mapper enable_liblzma enable_libzfs enable_grub_protect enable_werror ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS PKG_CONFIG PKG_CONFIG_PATH PKG_CONFIG_LIBDIR YACC YFLAGS CPP CXX CXXFLAGS CCC CCAS CCASFLAGS PYTHON SDL2_CFLAGS SDL2_LIBS FREETYPE_CFLAGS FREETYPE_LIBS BUILD_FREETYPE_CFLAGS BUILD_FREETYPE_LIBS FUSE_CFLAGS FUSE_LIBS' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: \`$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: \`$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -runstatedir | --runstatedir | --runstatedi | --runstated \ | --runstate | --runstat | --runsta | --runst | --runs \ | --run | --ru | --r) ac_prev=runstatedir ;; -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ | --run=* | --ru=* | --r=*) runstatedir=$ac_optarg ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: \`$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: \`$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. printf "%s\n" "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && printf "%s\n" "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir runstatedir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures GRUB 2.14~git20250718.0e36779 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/grub] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] --target=TARGET configure for building compilers for TARGET [HOST] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of GRUB 2.14~git20250718.0e36779:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-dependency-tracking do not reject slow dependency extractors --disable-dependency-tracking speeds up one-time build --enable-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") --disable-largefile omit support for large files --disable-year2038 omit support for timestamps past the year 2038 --enable-threads={isoc|posix|isoc+posix|windows} specify multithreading API --disable-threads build without multithread safety --disable-nls do not use Native Language Support --disable-rpath do not hardcode runtime library paths --enable-cross-guesses={conservative|risky} specify policy for cross-compilation guesses --enable-efiemu build and install the efiemu runtimes (default=guessed) --enable-stack-protector enable the stack protector --enable-mm-debug include memory manager debugging --enable-cache-stats enable disk cache statistics collection --enable-boot-time enable boot time statistics collection --enable-grub-emu-sdl2 build and install the `grub-emu' debugging utility with SDL2 support (default=guessed) --enable-grub-emu-sdl build and install the `grub-emu' debugging utility with SDL support (default=guessed) --enable-grub-emu-pci build and install the `grub-emu' debugging utility with PCI support (potentially dangerous) (default=no) --enable-grub-mkfont build and install the `grub-mkfont' utility (default=guessed) --enable-grub-themes build and install GRUB themes (default=guessed) --enable-grub-mount build and install the `grub-mount' utility (default=guessed) --enable-device-mapper enable Linux device-mapper support (default=guessed) --enable-liblzma enable liblzma integration (default=guessed) --enable-libzfs enable libzfs integration (default=guessed) --enable-grub-protect build and install the `grub-protect' utility (default=guessed) --disable-werror do not use -Werror when building GRUB Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-platform=PLATFORM select the host platform [[guessed]] --with-bootdir=DIR set the name of /boot directory [[guessed]] --with-grubdir=DIR set the name of grub directory [[guessed]] --with-python-sys-prefix use Python's sys.prefix and sys.exec_prefix values --with-python_prefix override the default PYTHON_PREFIX --with-python_exec_prefix override the default PYTHON_EXEC_PREFIX --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-libiconv-prefix[=DIR] search for libiconv in DIR/include and DIR/lib --without-libiconv-prefix don't search for libiconv in includedir and libdir --with-libintl-prefix[=DIR] search for libintl in DIR/include and DIR/lib --without-libintl-prefix don't search for libintl in includedir and libdir --without-included-regex don't compile regex; this is the default on systems with recent-enough versions of the GNU C Library (use with caution on other systems). --with-dejavufont=FILE set the DejeVu source [[guessed]] --with-unifont=FILE set the unifont source [[guessed]] Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory PKG_CONFIG path to pkg-config utility PKG_CONFIG_PATH directories to add to pkg-config's search path PKG_CONFIG_LIBDIR path overriding pkg-config's built-in search path YACC The `Yet Another Compiler Compiler' implementation to use. Defaults to the first program found out of: `bison -y', `byacc', `yacc'. YFLAGS The list of arguments that will be passed by default to $YACC. This script will default YFLAGS to the empty string to avoid a default value of `-d' given by some make applications. CPP C preprocessor CXX C++ compiler command CXXFLAGS C++ compiler flags CCAS assembler compiler command (defaults to CC) CCASFLAGS assembler compiler flags (defaults to CFLAGS) PYTHON the Python interpreter SDL2_CFLAGS C compiler flags for SDL2, overriding pkg-config SDL2_LIBS linker flags for SDL2, overriding pkg-config FREETYPE_CFLAGS C compiler flags for FREETYPE, overriding pkg-config FREETYPE_LIBS linker flags for FREETYPE, overriding pkg-config BUILD_FREETYPE_CFLAGS C compiler flags for BUILD_FREETYPE, overriding pkg-config BUILD_FREETYPE_LIBS linker flags for BUILD_FREETYPE, overriding pkg-config FUSE_CFLAGS C compiler flags for FUSE, overriding pkg-config FUSE_LIBS linker flags for FUSE, overriding pkg-config Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for configure.gnu first; this name is used for a wrapper for # Metaconfig's "Configure" on case-insensitive file systems. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else printf "%s\n" "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF GRUB configure 2.14~git20250718.0e36779 generated by GNU Autoconf 2.71 Copyright (C) 2021 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest.beam if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext then : ac_retval=0 else $as_nop printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 printf %s "checking for $2... " >&6; } if eval test \${$3+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO" then : eval "$3=yes" else $as_nop eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi eval ac_res=\$$3 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest.beam conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext } then : ac_retval=0 else $as_nop printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err } then : ac_retval=0 else $as_nop printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest.beam if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext then : ac_retval=0 else $as_nop printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_c_try_run LINENO # ---------------------- # Try to run conftest.$ac_ext, and return whether this succeeded. Assumes that # executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; } then : ac_retval=0 else $as_nop printf "%s\n" "$as_me: program exited with status $ac_status" >&5 printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_compute_int LINENO EXPR VAR INCLUDES # -------------------------------------------- # Tries to find the compile-time value of EXPR in a program that includes # INCLUDES, setting VAR accordingly. Returns whether the value could be # computed ac_fn_c_compute_int () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if test "$cross_compiling" = yes; then # Depending upon the size, compute the lo and hi bounds. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main (void) { static int test_array [1 - 2 * !(($2) >= 0)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_lo=0 ac_mid=0 while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main (void) { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_hi=$ac_mid; break else $as_nop as_fn_arith $ac_mid + 1 && ac_lo=$as_val if test $ac_lo -le $ac_mid; then ac_lo= ac_hi= break fi as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext done else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main (void) { static int test_array [1 - 2 * !(($2) < 0)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_hi=-1 ac_mid=-1 while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main (void) { static int test_array [1 - 2 * !(($2) >= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_lo=$ac_mid; break else $as_nop as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val if test $ac_mid -le $ac_hi; then ac_lo= ac_hi= break fi as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext done else $as_nop ac_lo= ac_hi= fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext # Binary search between lo and hi bounds. while test "x$ac_lo" != "x$ac_hi"; do as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main (void) { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_hi=$ac_mid else $as_nop as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext done case $ac_lo in #(( ?*) eval "$3=\$ac_lo"; ac_retval=0 ;; '') ac_retval=1 ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 static long int longval (void) { return $2; } static unsigned long int ulongval (void) { return $2; } #include #include int main (void) { FILE *f = fopen ("conftest.val", "w"); if (! f) return 1; if (($2) < 0) { long int i = longval (); if (i != ($2)) return 1; fprintf (f, "%ld", i); } else { unsigned long int i = ulongval (); if (i != ($2)) return 1; fprintf (f, "%lu", i); } /* Do not output a trailing newline, as this causes \r\n confusion on some platforms. */ return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO" then : echo >>conftest.val; read $3 &5 printf %s "checking for $2... " >&6; } if eval test \${$3+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. */ #include #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main (void) { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : eval "$3=yes" else $as_nop eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES # ---------------------------------------------------- # Tries to find if the field MEMBER exists in type AGGR, after including # INCLUDES, setting cache variable VAR accordingly. ac_fn_c_check_member () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5 printf %s "checking for $2.$3... " >&6; } if eval test \${$4+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int main (void) { static $2 ac_aggr; if (ac_aggr.$3) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : eval "$4=yes" else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int main (void) { static $2 ac_aggr; if (sizeof ac_aggr.$3) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : eval "$4=yes" else $as_nop eval "$4=no" fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi eval ac_res=\$$4 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_member # ac_fn_c_check_type LINENO TYPE VAR INCLUDES # ------------------------------------------- # Tests whether TYPE exists after having included INCLUDES, setting cache # variable VAR accordingly. ac_fn_c_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 printf %s "checking for $2... " >&6; } if eval test \${$3+y} then : printf %s "(cached) " >&6 else $as_nop eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main (void) { if (sizeof ($2)) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main (void) { if (sizeof (($2))) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : else $as_nop eval "$3=yes" fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi eval ac_res=\$$3 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_type # ac_fn_check_decl LINENO SYMBOL VAR INCLUDES EXTRA-OPTIONS FLAG-VAR # ------------------------------------------------------------------ # Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR # accordingly. Pass EXTRA-OPTIONS to the compiler, using FLAG-VAR. ac_fn_check_decl () { ac_save_ac_compile="$ac_compile" if test -n "$ac_compile_for_check_decl"; then ac_compile="$ac_compile_for_check_decl" fi as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack as_decl_name=`echo $2|sed 's/ *(.*//'` { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5 printf %s "checking whether $as_decl_name is declared... " >&6; } if eval test \${$3+y} then : printf %s "(cached) " >&6 else $as_nop as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'` eval ac_save_FLAGS=\$$6 as_fn_append $6 " $5" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main (void) { #ifndef $as_decl_name #ifdef __cplusplus (void) $as_decl_use; #else (void) $as_decl_name; #endif #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : eval "$3=yes" else $as_nop eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext eval $6=\$ac_save_FLAGS fi eval ac_res=\$$3 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno ac_compile="$ac_save_ac_compile" } # ac_fn_check_decl ac_configure_args_raw= for ac_arg do case $ac_arg in *\'*) ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append ac_configure_args_raw " '$ac_arg'" done case $ac_configure_args_raw in *$as_nl*) ac_safe_unquote= ;; *) ac_unsafe_z='|&;<>()$`\\"*?[ '' ' # This string ends in space, tab. ac_unsafe_a="$ac_unsafe_z#~" ac_safe_unquote="s/ '\\([^$ac_unsafe_a][^$ac_unsafe_z]*\\)'/ \\1/g" ac_configure_args_raw=` printf "%s\n" "$ac_configure_args_raw" | sed "$ac_safe_unquote"`;; esac cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by GRUB $as_me 2.14~git20250718.0e36779, which was generated by GNU Autoconf 2.71. Invocation command line was $ $0$ac_configure_args_raw _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac printf "%s\n" "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Sanitize IFS. IFS=" "" $as_nl" # Save into config.log some information that might help in debugging. { echo printf "%s\n" "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo printf "%s\n" "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac printf "%s\n" "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then printf "%s\n" "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac printf "%s\n" "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then printf "%s\n" "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && printf "%s\n" "$as_me: caught signal $ac_signal" printf "%s\n" "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h printf "%s\n" "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. printf "%s\n" "#define PACKAGE_NAME \"$PACKAGE_NAME\"" >>confdefs.h printf "%s\n" "#define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"" >>confdefs.h printf "%s\n" "#define PACKAGE_VERSION \"$PACKAGE_VERSION\"" >>confdefs.h printf "%s\n" "#define PACKAGE_STRING \"$PACKAGE_STRING\"" >>confdefs.h printf "%s\n" "#define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"" >>confdefs.h printf "%s\n" "#define PACKAGE_URL \"$PACKAGE_URL\"" >>confdefs.h # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. if test -n "$CONFIG_SITE"; then ac_site_files="$CONFIG_SITE" elif test "x$prefix" != xNONE; then ac_site_files="$prefix/share/config.site $prefix/etc/config.site" else ac_site_files="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" fi for ac_site_file in $ac_site_files do case $ac_site_file in #( */*) : ;; #( *) : ac_site_file=./$ac_site_file ;; esac if test -f "$ac_site_file" && test -r "$ac_site_file"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 printf "%s\n" "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 printf "%s\n" "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 printf "%s\n" "$as_me: creating cache $cache_file" >&6;} >$cache_file fi as_fn_append ac_header_c_list " stdio.h stdio_h HAVE_STDIO_H" # Test code for whether the C compiler supports C89 (global declarations) ac_c_conftest_c89_globals=' /* Does the compiler advertise C89 conformance? Do not test the value of __STDC__, because some compilers set it to 0 while being otherwise adequately conformant. */ #if !defined __STDC__ # error "Compiler does not advertise C89 conformance" #endif #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7 src/conf.sh. */ struct buf { int x; }; struct buf * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not \xHH hex character constants. These do not provoke an error unfortunately, instead are silently treated as an "x". The following induces an error, until -std is added to get proper ANSI mode. Curiously \x00 != x always comes out true, for an array size at least. It is necessary to write \x00 == 0 to get something that is true only with -std. */ int osf4_cc_array ['\''\x00'\'' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) '\''x'\'' int xlc6_cc_array[FOO(a) == '\''x'\'' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, int *(*)(struct buf *, struct stat *, int), int, int);' # Test code for whether the C compiler supports C89 (body of main). ac_c_conftest_c89_main=' ok |= (argc == 0 || f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]); ' # Test code for whether the C compiler supports C99 (global declarations) ac_c_conftest_c99_globals=' // Does the compiler advertise C99 conformance? #if !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L # error "Compiler does not advertise C99 conformance" #endif #include extern int puts (const char *); extern int printf (const char *, ...); extern int dprintf (int, const char *, ...); extern void *malloc (size_t); // Check varargs macros. These examples are taken from C99 6.10.3.5. // dprintf is used instead of fprintf to avoid needing to declare // FILE and stderr. #define debug(...) dprintf (2, __VA_ARGS__) #define showlist(...) puts (#__VA_ARGS__) #define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__)) static void test_varargs_macros (void) { int x = 1234; int y = 5678; debug ("Flag"); debug ("X = %d\n", x); showlist (The first, second, and third items.); report (x>y, "x is %d but y is %d", x, y); } // Check long long types. #define BIG64 18446744073709551615ull #define BIG32 4294967295ul #define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0) #if !BIG_OK #error "your preprocessor is broken" #endif #if BIG_OK #else #error "your preprocessor is broken" #endif static long long int bignum = -9223372036854775807LL; static unsigned long long int ubignum = BIG64; struct incomplete_array { int datasize; double data[]; }; struct named_init { int number; const wchar_t *name; double average; }; typedef const char *ccp; static inline int test_restrict (ccp restrict text) { // See if C++-style comments work. // Iterate through items via the restricted pointer. // Also check for declarations in for loops. for (unsigned int i = 0; *(text+i) != '\''\0'\''; ++i) continue; return 0; } // Check varargs and va_copy. static bool test_varargs (const char *format, ...) { va_list args; va_start (args, format); va_list args_copy; va_copy (args_copy, args); const char *str = ""; int number = 0; float fnumber = 0; while (*format) { switch (*format++) { case '\''s'\'': // string str = va_arg (args_copy, const char *); break; case '\''d'\'': // int number = va_arg (args_copy, int); break; case '\''f'\'': // float fnumber = va_arg (args_copy, double); break; default: break; } } va_end (args_copy); va_end (args); return *str && number && fnumber; } ' # Test code for whether the C compiler supports C99 (body of main). ac_c_conftest_c99_main=' // Check bool. _Bool success = false; success |= (argc != 0); // Check restrict. if (test_restrict ("String literal") == 0) success = true; char *restrict newvar = "Another string"; // Check varargs. success &= test_varargs ("s, d'\'' f .", "string", 65, 34.234); test_varargs_macros (); // Check flexible array members. struct incomplete_array *ia = malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10)); ia->datasize = 10; for (int i = 0; i < ia->datasize; ++i) ia->data[i] = i * 1.234; // Check named initializers. struct named_init ni = { .number = 34, .name = L"Test wide string", .average = 543.34343, }; ni.number = 58; int dynamic_array[ni.number]; dynamic_array[0] = argv[0][0]; dynamic_array[ni.number - 1] = 543; // work around unused variable warnings ok |= (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == '\''x'\'' || dynamic_array[ni.number - 1] != 543); ' # Test code for whether the C compiler supports C11 (global declarations) ac_c_conftest_c11_globals=' // Does the compiler advertise C11 conformance? #if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112L # error "Compiler does not advertise C11 conformance" #endif // Check _Alignas. char _Alignas (double) aligned_as_double; char _Alignas (0) no_special_alignment; extern char aligned_as_int; char _Alignas (0) _Alignas (int) aligned_as_int; // Check _Alignof. enum { int_alignment = _Alignof (int), int_array_alignment = _Alignof (int[100]), char_alignment = _Alignof (char) }; _Static_assert (0 < -_Alignof (int), "_Alignof is signed"); // Check _Noreturn. int _Noreturn does_not_return (void) { for (;;) continue; } // Check _Static_assert. struct test_static_assert { int x; _Static_assert (sizeof (int) <= sizeof (long int), "_Static_assert does not work in struct"); long int y; }; // Check UTF-8 literals. #define u8 syntax error! char const utf8_literal[] = u8"happens to be ASCII" "another string"; // Check duplicate typedefs. typedef long *long_ptr; typedef long int *long_ptr; typedef long_ptr long_ptr; // Anonymous structures and unions -- taken from C11 6.7.2.1 Example 1. struct anonymous { union { struct { int i; int j; }; struct { int k; long int l; } w; }; int m; } v1; ' # Test code for whether the C compiler supports C11 (body of main). ac_c_conftest_c11_main=' _Static_assert ((offsetof (struct anonymous, i) == offsetof (struct anonymous, w.k)), "Anonymous union alignment botch"); v1.i = 2; v1.w.k = 5; ok |= v1.i != 5; ' # Test code for whether the C compiler supports C11 (complete). ac_c_conftest_c11_program="${ac_c_conftest_c89_globals} ${ac_c_conftest_c99_globals} ${ac_c_conftest_c11_globals} int main (int argc, char **argv) { int ok = 0; ${ac_c_conftest_c89_main} ${ac_c_conftest_c99_main} ${ac_c_conftest_c11_main} return ok; } " # Test code for whether the C compiler supports C99 (complete). ac_c_conftest_c99_program="${ac_c_conftest_c89_globals} ${ac_c_conftest_c99_globals} int main (int argc, char **argv) { int ok = 0; ${ac_c_conftest_c89_main} ${ac_c_conftest_c99_main} return ok; } " # Test code for whether the C compiler supports C89 (complete). ac_c_conftest_c89_program="${ac_c_conftest_c89_globals} int main (int argc, char **argv) { int ok = 0; ${ac_c_conftest_c89_main} return ok; } " as_fn_append ac_header_c_list " stdlib.h stdlib_h HAVE_STDLIB_H" as_fn_append ac_header_c_list " string.h string_h HAVE_STRING_H" as_fn_append ac_header_c_list " inttypes.h inttypes_h HAVE_INTTYPES_H" as_fn_append ac_header_c_list " stdint.h stdint_h HAVE_STDINT_H" as_fn_append ac_header_c_list " strings.h strings_h HAVE_STRINGS_H" as_fn_append ac_header_c_list " sys/stat.h sys_stat_h HAVE_SYS_STAT_H" as_fn_append ac_header_c_list " sys/types.h sys_types_h HAVE_SYS_TYPES_H" as_fn_append ac_header_c_list " unistd.h unistd_h HAVE_UNISTD_H" as_fn_append ac_header_c_list " wchar.h wchar_h HAVE_WCHAR_H" as_fn_append ac_header_c_list " minix/config.h minix_config_h HAVE_MINIX_CONFIG_H" # Test code for whether the C++ compiler supports C++98 (global declarations) ac_cxx_conftest_cxx98_globals=' // Does the compiler advertise C++98 conformance? #if !defined __cplusplus || __cplusplus < 199711L # error "Compiler does not advertise C++98 conformance" #endif // These inclusions are to reject old compilers that // lack the unsuffixed header files. #include #include // and are *not* freestanding headers in C++98. extern void assert (int); namespace std { extern int strcmp (const char *, const char *); } // Namespaces, exceptions, and templates were all added after "C++ 2.0". using std::exception; using std::strcmp; namespace { void test_exception_syntax() { try { throw "test"; } catch (const char *s) { // Extra parentheses suppress a warning when building autoconf itself, // due to lint rules shared with more typical C programs. assert (!(strcmp) (s, "test")); } } template struct test_template { T const val; explicit test_template(T t) : val(t) {} template T add(U u) { return static_cast(u) + val; } }; } // anonymous namespace ' # Test code for whether the C++ compiler supports C++98 (body of main) ac_cxx_conftest_cxx98_main=' assert (argc); assert (! argv[0]); { test_exception_syntax (); test_template tt (2.0); assert (tt.add (4) == 6.0); assert (true && !false); } ' # Test code for whether the C++ compiler supports C++11 (global declarations) ac_cxx_conftest_cxx11_globals=' // Does the compiler advertise C++ 2011 conformance? #if !defined __cplusplus || __cplusplus < 201103L # error "Compiler does not advertise C++11 conformance" #endif namespace cxx11test { constexpr int get_val() { return 20; } struct testinit { int i; double d; }; class delegate { public: delegate(int n) : n(n) {} delegate(): delegate(2354) {} virtual int getval() { return this->n; }; protected: int n; }; class overridden : public delegate { public: overridden(int n): delegate(n) {} virtual int getval() override final { return this->n * 2; } }; class nocopy { public: nocopy(int i): i(i) {} nocopy() = default; nocopy(const nocopy&) = delete; nocopy & operator=(const nocopy&) = delete; private: int i; }; // for testing lambda expressions template Ret eval(Fn f, Ret v) { return f(v); } // for testing variadic templates and trailing return types template auto sum(V first) -> V { return first; } template auto sum(V first, Args... rest) -> V { return first + sum(rest...); } } ' # Test code for whether the C++ compiler supports C++11 (body of main) ac_cxx_conftest_cxx11_main=' { // Test auto and decltype auto a1 = 6538; auto a2 = 48573953.4; auto a3 = "String literal"; int total = 0; for (auto i = a3; *i; ++i) { total += *i; } decltype(a2) a4 = 34895.034; } { // Test constexpr short sa[cxx11test::get_val()] = { 0 }; } { // Test initializer lists cxx11test::testinit il = { 4323, 435234.23544 }; } { // Test range-based for int array[] = {9, 7, 13, 15, 4, 18, 12, 10, 5, 3, 14, 19, 17, 8, 6, 20, 16, 2, 11, 1}; for (auto &x : array) { x += 23; } } { // Test lambda expressions using cxx11test::eval; assert (eval ([](int x) { return x*2; }, 21) == 42); double d = 2.0; assert (eval ([&](double x) { return d += x; }, 3.0) == 5.0); assert (d == 5.0); assert (eval ([=](double x) mutable { return d += x; }, 4.0) == 9.0); assert (d == 5.0); } { // Test use of variadic templates using cxx11test::sum; auto a = sum(1); auto b = sum(1, 2); auto c = sum(1.0, 2.0, 3.0); } { // Test constructor delegation cxx11test::delegate d1; cxx11test::delegate d2(); cxx11test::delegate d3(45); } { // Test override and final cxx11test::overridden o1(55464); } { // Test nullptr char *c = nullptr; } { // Test template brackets test_template<::test_template> v(test_template(12)); } { // Unicode literals char const *utf8 = u8"UTF-8 string \u2500"; char16_t const *utf16 = u"UTF-8 string \u2500"; char32_t const *utf32 = U"UTF-32 string \u2500"; } ' # Test code for whether the C compiler supports C++11 (complete). ac_cxx_conftest_cxx11_program="${ac_cxx_conftest_cxx98_globals} ${ac_cxx_conftest_cxx11_globals} int main (int argc, char **argv) { int ok = 0; ${ac_cxx_conftest_cxx98_main} ${ac_cxx_conftest_cxx11_main} return ok; } " # Test code for whether the C compiler supports C++98 (complete). ac_cxx_conftest_cxx98_program="${ac_cxx_conftest_cxx98_globals} int main (int argc, char **argv) { int ok = 0; ${ac_cxx_conftest_cxx98_main} return ok; } " gt_needs="$gt_needs " as_fn_append ac_func_c_list " flockfile HAVE_FLOCKFILE" as_fn_append ac_func_c_list " funlockfile HAVE_FUNLOCKFILE" as_fn_append ac_header_c_list " features.h features_h HAVE_FEATURES_H" as_fn_append ac_header_c_list " linewrap.h linewrap_h HAVE_LINEWRAP_H" as_fn_append ac_func_c_list " btowc HAVE_BTOWC" as_fn_append ac_header_c_list " sys/param.h sys_param_h HAVE_SYS_PARAM_H" as_fn_append ac_func_c_list " _set_invalid_parameter_handler HAVE__SET_INVALID_PARAMETER_HANDLER" as_fn_append ac_header_c_list " sys/socket.h sys_socket_h HAVE_SYS_SOCKET_H" as_fn_append ac_func_c_list " fchdir HAVE_FCHDIR" as_fn_append ac_header_c_list " dirent.h dirent_h HAVE_DIRENT_H" as_fn_append ac_func_c_list " fcntl HAVE_FCNTL" as_fn_append ac_func_c_list " symlink HAVE_SYMLINK" as_fn_append ac_func_c_list " mempcpy HAVE_MEMPCPY" as_fn_append ac_header_c_list " fnmatch.h fnmatch_h HAVE_FNMATCH_H" as_fn_append ac_func_c_list " fnmatch HAVE_FNMATCH" as_fn_append ac_func_c_list " mbsrtowcs HAVE_MBSRTOWCS" as_fn_append ac_func_c_list " getdelim HAVE_GETDELIM" as_fn_append ac_func_c_list " getdtablesize HAVE_GETDTABLESIZE" gl_getopt_required=GNU as_fn_append ac_header_c_list " getopt.h getopt_h HAVE_GETOPT_H" as_fn_append ac_header_c_list " sys/cdefs.h sys_cdefs_h HAVE_SYS_CDEFS_H" as_fn_append ac_func_c_list " getprogname HAVE_GETPROGNAME" as_fn_append ac_func_c_list " getexecname HAVE_GETEXECNAME" as_fn_append ac_header_c_list " threads.h threads_h HAVE_THREADS_H" as_fn_append ac_header_c_list " limits.h limits_h HAVE_LIMITS_H" as_fn_append ac_func_c_list " isblank HAVE_ISBLANK" as_fn_append ac_header_c_list " langinfo.h langinfo_h HAVE_LANGINFO_H" as_fn_append ac_header_c_list " xlocale.h xlocale_h HAVE_XLOCALE_H" as_fn_append ac_func_c_list " mbsinit HAVE_MBSINIT" as_fn_append ac_func_c_list " mbrtowc HAVE_MBRTOWC" as_fn_append ac_func_c_list " isascii HAVE_ISASCII" as_fn_append ac_header_c_list " sys/mman.h sys_mman_h HAVE_SYS_MMAN_H" as_fn_append ac_func_c_list " mprotect HAVE_MPROTECT" as_fn_append ac_func_c_list " nl_langinfo HAVE_NL_LANGINFO" as_fn_append ac_func_c_list " lstat HAVE_LSTAT" as_fn_append ac_func_c_list " openat HAVE_OPENAT" as_fn_append ac_func_c_list " pipe HAVE_PIPE" as_fn_append ac_header_c_list " malloc.h malloc_h HAVE_MALLOC_H" as_fn_append ac_func_c_list " iswctype HAVE_ISWCTYPE" as_fn_append ac_func_c_list " sleep HAVE_SLEEP" as_fn_append ac_header_c_list " sys/time.h sys_time_h HAVE_SYS_TIME_H" as_fn_append ac_func_c_list " strndup HAVE_STRNDUP" as_fn_append ac_header_c_list " sysexits.h sysexits_h HAVE_SYSEXITS_H" as_fn_append ac_func_c_list " vasnprintf HAVE_VASNPRINTF" as_fn_append ac_func_c_list " snprintf HAVE_SNPRINTF" as_fn_append ac_header_c_list " crtdefs.h crtdefs_h HAVE_CRTDEFS_H" as_fn_append ac_func_c_list " wcrtomb HAVE_WCRTOMB" as_fn_append ac_func_c_list " iswcntrl HAVE_ISWCNTRL" as_fn_append ac_header_c_list " wctype.h wctype_h HAVE_WCTYPE_H" as_fn_append ac_func_c_list " wcwidth HAVE_WCWIDTH" as_fn_append ac_func_c_list " wmempcpy HAVE_WMEMPCPY" # Auxiliary files required by this configure script. ac_aux_files="config.rpath missing install-sh config.guess config.sub compile" # Locations in which to look for auxiliary files. ac_aux_dir_candidates="${srcdir}/build-aux" # Search for a directory containing all of the required auxiliary files, # $ac_aux_files, from the $PATH-style list $ac_aux_dir_candidates. # If we don't find one directory that contains all the files we need, # we report the set of missing files from the *first* directory in # $ac_aux_dir_candidates and give up. ac_missing_aux_files="" ac_first_candidate=: printf "%s\n" "$as_me:${as_lineno-$LINENO}: looking for aux files: $ac_aux_files" >&5 as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in $ac_aux_dir_candidates do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac as_found=: printf "%s\n" "$as_me:${as_lineno-$LINENO}: trying $as_dir" >&5 ac_aux_dir_found=yes ac_install_sh= for ac_aux in $ac_aux_files do # As a special case, if "install-sh" is required, that requirement # can be satisfied by any of "install-sh", "install.sh", or "shtool", # and $ac_install_sh is set appropriately for whichever one is found. if test x"$ac_aux" = x"install-sh" then if test -f "${as_dir}install-sh"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install-sh found" >&5 ac_install_sh="${as_dir}install-sh -c" elif test -f "${as_dir}install.sh"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install.sh found" >&5 ac_install_sh="${as_dir}install.sh -c" elif test -f "${as_dir}shtool"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}shtool found" >&5 ac_install_sh="${as_dir}shtool install -c" else ac_aux_dir_found=no if $ac_first_candidate; then ac_missing_aux_files="${ac_missing_aux_files} install-sh" else break fi fi else if test -f "${as_dir}${ac_aux}"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}${ac_aux} found" >&5 else ac_aux_dir_found=no if $ac_first_candidate; then ac_missing_aux_files="${ac_missing_aux_files} ${ac_aux}" else break fi fi fi done if test "$ac_aux_dir_found" = yes; then ac_aux_dir="$as_dir" break fi ac_first_candidate=false as_found=false done IFS=$as_save_IFS if $as_found then : else $as_nop as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. if test -f "${ac_aux_dir}config.guess"; then ac_config_guess="$SHELL ${ac_aux_dir}config.guess" fi if test -f "${ac_aux_dir}config.sub"; then ac_config_sub="$SHELL ${ac_aux_dir}config.sub" fi if test -f "$ac_aux_dir/configure"; then ac_configure="$SHELL ${ac_aux_dir}configure" fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 printf "%s\n" "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 printf "%s\n" "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 printf "%s\n" "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 printf "%s\n" "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 printf "%s\n" "$as_me: former value: \`$ac_old_val'" >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 printf "%s\n" "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`printf "%s\n" "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 printf "%s\n" "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`${MAKE-make} distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu case "$ERROR_PLATFORM_NOT_SUPPORT_SSP" in #( n | no | nO | N | No | NO) : ERROR_PLATFORM_NOT_SUPPORT_SSP=no ;; #( *) : ERROR_PLATFORM_NOT_SUPPORT_SSP=yes ;; esac # We don't want -g -O2 by default in CFLAGS : ${CFLAGS=""} # Expand $ac_aux_dir to an absolute path. am_aux_dir=`cd "$ac_aux_dir" && pwd` ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then if test "$as_dir$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args. set dummy ${ac_tool_prefix}clang; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}clang" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "clang", so it can be a program name with args. set dummy clang; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="clang" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi fi test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion -version; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 printf %s "checking whether the C compiler works... " >&6; } ac_link_default=`printf "%s\n" "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test ${ac_cv_exeext+y} && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else $as_nop ac_file='' fi if test -z "$ac_file" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 printf %s "checking for C compiler default output file name... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 printf "%s\n" "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 printf %s "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else $as_nop { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 printf "%s\n" "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 printf %s "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 printf "%s\n" "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 printf %s "checking for suffix of object files... " >&6; } if test ${ac_cv_objext+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_nop printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 printf "%s\n" "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5 printf %s "checking whether the compiler supports GNU C... " >&6; } if test ${ac_cv_c_compiler_gnu+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_compiler_gnu=yes else $as_nop ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; } ac_compiler_gnu=$ac_cv_c_compiler_gnu if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+y} ac_save_CFLAGS=$CFLAGS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 printf %s "checking whether $CC accepts -g... " >&6; } if test ${ac_cv_prog_cc_g+y} then : printf %s "(cached) " >&6 else $as_nop ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_g=yes else $as_nop CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : else $as_nop ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 printf "%s\n" "$ac_cv_prog_cc_g" >&6; } if test $ac_test_CFLAGS; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi ac_prog_cc_stdc=no if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5 printf %s "checking for $CC option to enable C11 features... " >&6; } if test ${ac_cv_prog_cc_c11+y} then : printf %s "(cached) " >&6 else $as_nop ac_cv_prog_cc_c11=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c11_program _ACEOF for ac_arg in '' -std=gnu11 do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c11=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c11" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi if test "x$ac_cv_prog_cc_c11" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else $as_nop if test "x$ac_cv_prog_cc_c11" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5 printf "%s\n" "$ac_cv_prog_cc_c11" >&6; } CC="$CC $ac_cv_prog_cc_c11" fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11 ac_prog_cc_stdc=c11 fi fi if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5 printf %s "checking for $CC option to enable C99 features... " >&6; } if test ${ac_cv_prog_cc_c99+y} then : printf %s "(cached) " >&6 else $as_nop ac_cv_prog_cc_c99=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c99_program _ACEOF for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99= do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c99=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c99" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi if test "x$ac_cv_prog_cc_c99" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else $as_nop if test "x$ac_cv_prog_cc_c99" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 printf "%s\n" "$ac_cv_prog_cc_c99" >&6; } CC="$CC $ac_cv_prog_cc_c99" fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 ac_prog_cc_stdc=c99 fi fi if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5 printf %s "checking for $CC option to enable C89 features... " >&6; } if test ${ac_cv_prog_cc_c89+y} then : printf %s "(cached) " >&6 else $as_nop ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c89_program _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi if test "x$ac_cv_prog_cc_c89" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else $as_nop if test "x$ac_cv_prog_cc_c89" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 printf "%s\n" "$ac_cv_prog_cc_c89" >&6; } CC="$CC $ac_cv_prog_cc_c89" fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 ac_prog_cc_stdc=c89 fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 printf %s "checking whether $CC understands -c and -o together... " >&6; } if test ${am_cv_prog_cc_c_o+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 printf "%s\n" "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler is clang" >&5 printf %s "checking whether the compiler is clang... " >&6; } if test ${gl_cv_compiler_clang+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __clang__ barfbarf #endif int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : gl_cv_compiler_clang=no else $as_nop gl_cv_compiler_clang=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_compiler_clang" >&5 printf "%s\n" "$gl_cv_compiler_clang" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for compiler option needed when checking for declarations" >&5 printf %s "checking for compiler option needed when checking for declarations... " >&6; } if test ${gl_cv_compiler_check_decl_option+y} then : printf %s "(cached) " >&6 else $as_nop if test $gl_cv_compiler_clang = yes; then save_ac_compile="$ac_compile" ac_compile="$ac_compile -Werror=implicit-function-declaration" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : gl_cv_compiler_check_decl_option='-Werror=implicit-function-declaration' else $as_nop gl_cv_compiler_check_decl_option=none fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_compile="$save_ac_compile" else gl_cv_compiler_check_decl_option=none fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_compiler_check_decl_option" >&5 printf "%s\n" "$gl_cv_compiler_check_decl_option" >&6; } if test "x$gl_cv_compiler_check_decl_option" != xnone; then ac_compile_for_check_decl="$ac_compile $gl_cv_compiler_check_decl_option" else ac_compile_for_check_decl="$ac_compile" fi ac_header= ac_cache= for ac_item in $ac_header_c_list do if test $ac_cache; then ac_fn_c_check_header_compile "$LINENO" $ac_header ac_cv_header_$ac_cache "$ac_includes_default" if eval test \"x\$ac_cv_header_$ac_cache\" = xyes; then printf "%s\n" "#define $ac_item 1" >> confdefs.h fi ac_header= ac_cache= elif test $ac_header; then ac_cache=$ac_item else ac_header=$ac_item fi done if test $ac_cv_header_stdlib_h = yes && test $ac_cv_header_string_h = yes then : printf "%s\n" "#define STDC_HEADERS 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether it is safe to define __EXTENSIONS__" >&5 printf %s "checking whether it is safe to define __EXTENSIONS__... " >&6; } if test ${ac_cv_safe_to_define___extensions__+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ # define __EXTENSIONS__ 1 $ac_includes_default int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_safe_to_define___extensions__=yes else $as_nop ac_cv_safe_to_define___extensions__=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_safe_to_define___extensions__" >&5 printf "%s\n" "$ac_cv_safe_to_define___extensions__" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether _XOPEN_SOURCE should be defined" >&5 printf %s "checking whether _XOPEN_SOURCE should be defined... " >&6; } if test ${ac_cv_should_define__xopen_source+y} then : printf %s "(cached) " >&6 else $as_nop ac_cv_should_define__xopen_source=no if test $ac_cv_header_wchar_h = yes then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include mbstate_t x; int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _XOPEN_SOURCE 500 #include mbstate_t x; int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_should_define__xopen_source=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_should_define__xopen_source" >&5 printf "%s\n" "$ac_cv_should_define__xopen_source" >&6; } printf "%s\n" "#define _ALL_SOURCE 1" >>confdefs.h printf "%s\n" "#define _DARWIN_C_SOURCE 1" >>confdefs.h printf "%s\n" "#define _GNU_SOURCE 1" >>confdefs.h printf "%s\n" "#define _HPUX_ALT_XOPEN_SOCKET_API 1" >>confdefs.h printf "%s\n" "#define _NETBSD_SOURCE 1" >>confdefs.h printf "%s\n" "#define _OPENBSD_SOURCE 1" >>confdefs.h printf "%s\n" "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h printf "%s\n" "#define __STDC_WANT_IEC_60559_ATTRIBS_EXT__ 1" >>confdefs.h printf "%s\n" "#define __STDC_WANT_IEC_60559_BFP_EXT__ 1" >>confdefs.h printf "%s\n" "#define __STDC_WANT_IEC_60559_DFP_EXT__ 1" >>confdefs.h printf "%s\n" "#define __STDC_WANT_IEC_60559_FUNCS_EXT__ 1" >>confdefs.h printf "%s\n" "#define __STDC_WANT_IEC_60559_TYPES_EXT__ 1" >>confdefs.h printf "%s\n" "#define __STDC_WANT_LIB_EXT2__ 1" >>confdefs.h printf "%s\n" "#define __STDC_WANT_MATH_SPEC_FUNCS__ 1" >>confdefs.h printf "%s\n" "#define _TANDEM_SOURCE 1" >>confdefs.h if test $ac_cv_header_minix_config_h = yes then : MINIX=yes printf "%s\n" "#define _MINIX 1" >>confdefs.h printf "%s\n" "#define _POSIX_SOURCE 1" >>confdefs.h printf "%s\n" "#define _POSIX_1_SOURCE 2" >>confdefs.h else $as_nop MINIX= fi if test $ac_cv_safe_to_define___extensions__ = yes then : printf "%s\n" "#define __EXTENSIONS__ 1" >>confdefs.h fi if test $ac_cv_should_define__xopen_source = yes then : printf "%s\n" "#define _XOPEN_SOURCE 500" >>confdefs.h fi # Checks for build, host and target systems. # Make sure we can run config.sub. $SHELL "${ac_aux_dir}config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL ${ac_aux_dir}config.sub" "$LINENO" 5 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 printf %s "checking build system type... " >&6; } if test ${ac_cv_build+y} then : printf %s "(cached) " >&6 else $as_nop ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "${ac_aux_dir}config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "${ac_aux_dir}config.sub" $ac_build_alias` || as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $ac_build_alias failed" "$LINENO" 5 fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 printf "%s\n" "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 printf %s "checking host system type... " >&6; } if test ${ac_cv_host+y} then : printf %s "(cached) " >&6 else $as_nop if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "${ac_aux_dir}config.sub" $host_alias` || as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $host_alias failed" "$LINENO" 5 fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 printf "%s\n" "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac save_program_prefix="${program_prefix}" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking target system type" >&5 printf %s "checking target system type... " >&6; } if test ${ac_cv_target+y} then : printf %s "(cached) " >&6 else $as_nop if test "x$target_alias" = x; then ac_cv_target=$ac_cv_host else ac_cv_target=`$SHELL "${ac_aux_dir}config.sub" $target_alias` || as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $target_alias failed" "$LINENO" 5 fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5 printf "%s\n" "$ac_cv_target" >&6; } case $ac_cv_target in *-*-*) ;; *) as_fn_error $? "invalid value of canonical target" "$LINENO" 5;; esac target=$ac_cv_target ac_save_IFS=$IFS; IFS='-' set x $ac_cv_target shift target_cpu=$1 target_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: target_os=$* IFS=$ac_save_IFS case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac # The aliases save the names the user supplied, while $host etc. # will get canonicalized. test -n "$target_alias" && test "$program_prefix$program_suffix$program_transform_name" = \ NONENONEs,x,x, && program_prefix=${target_alias}- program_prefix="${save_program_prefix}" am__api_version='1.16' # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 printf %s "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if test ${ac_cv_path_install+y} then : printf %s "(cached) " >&6 else $as_nop as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac # Account for fact that we put trailing slashes in our PATH walk. case $as_dir in #(( ./ | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir/" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test ${ac_cv_path_install+y}; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 printf "%s\n" "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 printf %s "checking whether build environment is sane... " >&6; } # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi if test "$2" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi rm -f conftest.file test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`printf "%s\n" "$program_transform_name" | sed "$ac_script"` if test x"${MISSING+set}" != xset; then MISSING="\${SHELL} '$am_aux_dir/missing'" fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 printf "%s\n" "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_STRIP+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 printf "%s\n" "$STRIP" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_STRIP+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 printf "%s\n" "$ac_ct_STRIP" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a race-free mkdir -p" >&5 printf %s "checking for a race-free mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if test ${ac_cv_path_mkdir+y} then : printf %s "(cached) " >&6 else $as_nop as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext" || continue case `"$as_dir$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir ('*'coreutils) '* | \ 'BusyBox '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test ${ac_cv_path_mkdir+y}; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 printf "%s\n" "$MKDIR_P" >&6; } for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_AWK+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 printf "%s\n" "$AWK" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$AWK" && break done { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 printf %s "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`printf "%s\n" "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval test \${ac_cv_prog_make_${ac_make}_set+y} then : printf %s "(cached) " >&6 else $as_nop cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } SET_MAKE= else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports the include directive" >&5 printf %s "checking whether ${MAKE-make} supports the include directive... " >&6; } cat > confinc.mk << 'END' am__doit: @echo this is the am__doit target >confinc.out .PHONY: am__doit END am__include="#" am__quote= # BSD make does it like this. echo '.include "confinc.mk" # ignored' > confmf.BSD # Other make implementations (GNU, Solaris 10, AIX) do it like this. echo 'include confinc.mk # ignored' > confmf.GNU _am_result=no for s in GNU BSD; do { echo "$as_me:$LINENO: ${MAKE-make} -f confmf.$s && cat confinc.out" >&5 (${MAKE-make} -f confmf.$s && cat confinc.out) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } case $?:`cat confinc.out 2>/dev/null` in #( '0:this is the am__doit target') : case $s in #( BSD) : am__include='.include' am__quote='"' ;; #( *) : am__include='include' am__quote='' ;; esac ;; #( *) : ;; esac if test "$am__include" != "#"; then _am_result="yes ($s style)" break fi done rm -f confinc.* confmf.* { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${_am_result}" >&5 printf "%s\n" "${_am_result}" >&6; } # Check whether --enable-dependency-tracking was given. if test ${enable_dependency_tracking+y} then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi # Check whether --enable-silent-rules was given. if test ${enable_silent_rules+y} then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=1;; esac am_make=${MAKE-make} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 printf %s "checking whether $am_make supports nested variables... " >&6; } if test ${am_cv_make_support_nested_variables+y} then : printf %s "(cached) " >&6 else $as_nop if printf "%s\n" 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 printf "%s\n" "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='grub' VERSION='2.14~git20250718.0e36779' printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h printf "%s\n" "#define VERSION \"$VERSION\"" >>confdefs.h # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # mkdir_p='$(MKDIR_P)' # We need awk for the "check" target (and possibly the TAP driver). The # system "awk" is bad on some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar pax cpio none' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' depcc="$CC" am_compiler_list= { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 printf %s "checking dependency style of $depcc... " >&6; } if test ${am_cv_CC_dependencies_compiler_type+y} then : printf %s "(cached) " >&6 else $as_nop if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 printf "%s\n" "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi # Variables for tags utilities; see am/tags.am if test -z "$CTAGS"; then CTAGS=ctags fi if test -z "$ETAGS"; then ETAGS=etags fi if test -z "$CSCOPE"; then CSCOPE=cscope fi # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 fi fi ac_config_headers="$ac_config_headers config-util.h" # Explicitly check for pkg-config early on, since otherwise conditional # calls are problematic. if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_path_PKG_CONFIG+y} then : printf %s "(cached) " >&6 else $as_nop case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_path_PKG_CONFIG="$as_dir$ac_word$ac_exec_ext" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 printf "%s\n" "$PKG_CONFIG" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_path_ac_pt_PKG_CONFIG+y} then : printf %s "(cached) " >&6 else $as_nop case $ac_pt_PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_PKG_CONFIG="$as_dir$ac_word$ac_exec_ext" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 printf "%s\n" "$ac_pt_PKG_CONFIG" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_pt_PKG_CONFIG" = x; then PKG_CONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac PKG_CONFIG=$ac_pt_PKG_CONFIG fi else PKG_CONFIG="$ac_cv_path_PKG_CONFIG" fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.9.0 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 printf %s "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } PKG_CONFIG="" fi fi # Program name transformations grub_bios_setup=`printf "%s\n" grub-bios-setup | sed "$program_transform_name"` grub_editenv=`printf "%s\n" grub-editenv | sed "$program_transform_name"` grub_install=`printf "%s\n" grub-install | sed "$program_transform_name"` grub_mkconfig=`printf "%s\n" grub-mkconfig | sed "$program_transform_name"` grub_mkfont=`printf "%s\n" grub-mkfont | sed "$program_transform_name"` grub_mkimage=`printf "%s\n" grub-mkimage | sed "$program_transform_name"` grub_glue_efi=`printf "%s\n" grub-glue-efi | sed "$program_transform_name"` grub_mklayout=`printf "%s\n" grub-mklayout | sed "$program_transform_name"` grub_mkpasswd_pbkdf2=`printf "%s\n" grub-mkpasswd-pbkdf2 | sed "$program_transform_name"` grub_mkrelpath=`printf "%s\n" grub-mkrelpath | sed "$program_transform_name"` grub_mkrescue=`printf "%s\n" grub-mkrescue | sed "$program_transform_name"` grub_probe=`printf "%s\n" grub-probe | sed "$program_transform_name"` grub_protect=`printf "%s\n" grub-protect | sed "$program_transform_name"` grub_reboot=`printf "%s\n" grub-reboot | sed "$program_transform_name"` grub_script_check=`printf "%s\n" grub-script-check | sed "$program_transform_name"` grub_set_default=`printf "%s\n" grub-set-default | sed "$program_transform_name"` grub_sparc64_setup=`printf "%s\n" grub-sparc64-setup | sed "$program_transform_name"` grub_render_label=`printf "%s\n" grub-render-label | sed "$program_transform_name"` grub_file=`printf "%s\n" grub-file | sed "$program_transform_name"` # Allow HOST_CC to override CC. if test "x$HOST_CC" != x; then CC=$HOST_CC fi # Optimization flag. Allow user to override. if test "x$TARGET_CFLAGS" = x; then TARGET_CFLAGS=-Os fi # Enable support for "restrict" keyword and other # features from gnu99 C language standard. BUILD_CFLAGS="-std=gnu99 -fno-common $BUILD_CFLAGS" HOST_CFLAGS="-std=gnu99 -fno-common $HOST_CFLAGS" TARGET_CFLAGS="-std=gnu99 -fno-common $TARGET_CFLAGS" # Default HOST_CPPFLAGS HOST_CPPFLAGS="$HOST_CPPFLAGS -Wall -W" HOST_CPPFLAGS="$HOST_CPPFLAGS -DGRUB_UTIL=1" TARGET_CPPFLAGS="$TARGET_CPPFLAGS -Wall -W" case "$target_cpu" in i[3456]86) target_cpu=i386 ;; amd64) target_cpu=x86_64 ;; sparc) target_cpu=sparc64 ;; mipsel|mips64el) target_cpu=mipsel machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_CPU_MIPSEL=1" ;; mips|mips64) target_cpu=mips machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_CPU_MIPS=1" ;; arm*) target_cpu=arm ;; aarch64*) target_cpu=arm64 ;; loongarch64) target_cpu=loongarch64 ;; riscv32*) target_cpu=riscv32 ;; riscv64*) target_cpu=riscv64 ;; esac # Specify the platform (such as firmware). # Check whether --with-platform was given. if test ${with_platform+y} then : withval=$with_platform; fi # Guess the platform if not specified. if test "x$with_platform" = x; then case "$target_cpu"-"$target_vendor" in i386-apple) platform=efi ;; i386-*) platform=pc ;; x86_64-apple) platform=efi ;; x86_64-*) platform=pc ;; powerpc-*) platform=ieee1275 ;; powerpc64-*) platform=ieee1275 ;; powerpc64le-*) platform=ieee1275 ;; sparc64-*) platform=ieee1275 ;; mipsel-*) platform=loongson ;; mips-*) platform=arc ;; ia64-*) platform=efi ;; arm-*) platform=uboot ;; arm64-*) platform=efi ;; loongarch64-*) platform=efi;; riscv32-*) platform=efi ;; riscv64-*) platform=efi ;; *) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: unsupported CPU: \"$target_cpu\" - only building utilities" >&5 printf "%s\n" "$as_me: WARNING: unsupported CPU: \"$target_cpu\" - only building utilities" >&2;} platform=none ;; esac else platform="$with_platform" fi case "$target_cpu"-"$platform" in x86_64-efi) ;; x86_64-emu) ;; x86_64-xen) ;; x86_64-none) ;; x86_64-*) target_cpu=i386 ;; powerpc64-ieee1275) target_cpu=powerpc ;; powerpc64le-ieee1275) target_cpu=powerpc ;; esac # Check if the platform is supported, make final adjustments. case "$target_cpu"-"$platform" in i386-efi) ;; x86_64-efi) ;; i386-xen) ;; i386-xen_pvh) ;; x86_64-xen) ;; i386-pc) ;; i386-multiboot) ;; i386-coreboot) ;; i386-linuxbios) platform=coreboot ;; i386-ieee1275) ;; i386-qemu) ;; powerpc-ieee1275) ;; sparc64-ieee1275) ;; ia64-efi) ;; mips-qemu_mips) ;; mips-qemu-mips) platform=qemu_mips;; mips-arc) ;; mipsel-arc) ;; mipsel-qemu_mips) ;; mipsel-qemu-mips) platform=qemu_mips;; mipsel-yeeloong) platform=loongson ;; mipsel-fuloong) platform=loongson ;; mipsel-loongson) ;; arm-uboot) ;; arm-coreboot) ;; arm-efi) ;; arm64-efi) ;; loongarch64-efi) ;; riscv32-efi) ;; riscv64-efi) ;; *-emu) ;; *-none) ;; *) as_fn_error $? "platform \"$platform\" is not supported for target CPU \"$target_cpu\"" "$LINENO" 5 ;; esac if test x$platform != xemu ; then case "$target_cpu" in i386 | powerpc) target_m32=1 ;; x86_64 | sparc64) target_m64=1 ;; esac fi if test x"$target_cpu-$platform" = xsparc64-emu ; then target_m64=1 fi case "$target_os" in windows* | mingw32*) target_os=cygwin ;; esac # This normalizes the names, and creates a new variable ("host_kernel") # while at it, since the mapping is not always 1:1 (e.g. different OSes # using the same kernel type). case "$host_os" in gnu*) host_kernel=hurd ;; linux*) host_kernel=linux ;; freebsd* | kfreebsd*-gnu) host_kernel=kfreebsd ;; netbsd*) host_kernel=netbsd ;; solaris*) host_kernel=illumos ;; darwin*) host_kernel=xnu ;; cygwin | windows* | mingw32*) host_kernel=windows ;; esac case "$host_os" in cygwin) have_exec=y ;; windows* | mingw32*) have_exec=n ;; aros*) have_exec=n ;; *) have_exec=y;; esac case "$platform" in coreboot) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_COREBOOT=1" ;; multiboot) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_MULTIBOOT=1" ;; efi) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_EFI=1" ;; xen) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_XEN=1" ;; xen_pvh) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_XEN_PVH=1" ;; ieee1275) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_IEEE1275=1" ;; uboot) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_UBOOT=1" ;; qemu) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_QEMU=1" ;; pc) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_PCBIOS=1" ;; emu) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_EMU=1" ;; loongson) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_MIPS_LOONGSON=1" ;; qemu_mips) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_MIPS_QEMU_MIPS=1" ;; arc) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_ARC=1" ;; esac if test x${target_cpu} = xmipsel ; then machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE=`echo mips_$platform | sed y,abcdefghijklmnopqrstuvwxyz,ABCDEFGHIJKLMNOPQRSTUVWXYZ,`" else machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE=`echo ${target_cpu}_$platform | sed y,abcdefghijklmnopqrstuvwxyz,ABCDEFGHIJKLMNOPQRSTUVWXYZ,`" fi case "${target_cpu}-$platform" in mips-arc) TARGET_LINK_ADDR=0x88200000 TARGET_DECOMPRESSOR_LINK_ADDR=0x88100000 ;; mipsel-arc) TARGET_LINK_ADDR=0x80700000 TARGET_DECOMPRESSOR_LINK_ADDR=0x80600000 ;; mips*-qemu_mips | mips*-loongson) TARGET_DECOMPRESSOR_LINK_ADDR=0x80100000 ;; esac TARGET_CPPFLAGS="$TARGET_CPPFLAGS $machine_CPPFLAGS" # Define default variables have_with_bootdir=n # Check whether --with-bootdir was given. if test ${with_bootdir+y} then : withval=$with_bootdir; have_with_bootdir=y else $as_nop have_with_bootdir=n fi if test x$have_with_bootdir = xy; then bootdirname="$with_bootdir" else case "$host_os" in netbsd* | openbsd*) # Because /boot is used for the boot block in NetBSD and OpenBSD, bootdirname='' ;; *) bootdirname='boot' ;; esac fi printf "%s\n" "#define GRUB_BOOT_DIR_NAME \"$bootdirname\"" >>confdefs.h # Check whether --with-grubdir was given. if test ${with_grubdir+y} then : withval=$with_grubdir; grubdirname="$with_grubdir" else $as_nop grubdirname="$PACKAGE" fi printf "%s\n" "#define GRUB_DIR_NAME \"$grubdirname\"" >>confdefs.h # # Checks for build programs. # # Although cmp is listed in the GNU Coding Standards as a command which # can used directly, OpenBSD lacks cmp in the default installation. for ac_prog in cmp do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CMP+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$CMP"; then ac_cv_prog_CMP="$CMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CMP="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CMP=$ac_cv_prog_CMP if test -n "$CMP"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CMP" >&5 printf "%s\n" "$CMP" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$CMP" && break done if test "x$CMP" = x; then as_fn_error $? "cmp is not found" "$LINENO" 5 fi for ac_prog in bison do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_YACC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$YACC"; then ac_cv_prog_YACC="$YACC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_YACC="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi YACC=$ac_cv_prog_YACC if test -n "$YACC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $YACC" >&5 printf "%s\n" "$YACC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$YACC" && break done if test "x$YACC" = x; then as_fn_error $? "bison is not found" "$LINENO" 5 fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_RANLIB+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 printf "%s\n" "$RANLIB" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_RANLIB+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 printf "%s\n" "$ac_ct_RANLIB" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_AWK+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 printf "%s\n" "$AWK" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$AWK" && break done for ac_prog in flex lex do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_LEX+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$LEX"; then ac_cv_prog_LEX="$LEX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_LEX="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi LEX=$ac_cv_prog_LEX if test -n "$LEX"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LEX" >&5 printf "%s\n" "$LEX" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$LEX" && break done test -n "$LEX" || LEX=":" if test "x$LEX" != "x:"; then cat >conftest.l <<_ACEOF %{ #ifdef __cplusplus extern "C" #endif int yywrap(void); %} %% a { ECHO; } b { REJECT; } c { yymore (); } d { yyless (1); } e { /* IRIX 6.5 flex 2.5.4 underquotes its yyless argument. */ #ifdef __cplusplus yyless ((yyinput () != 0)); #else yyless ((input () != 0)); #endif } f { unput (yytext[0]); } . { BEGIN INITIAL; } %% #ifdef YYTEXT_POINTER extern char *yytext; #endif int yywrap (void) { return 1; } int main (void) { return ! yylex (); } _ACEOF { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for lex output file root" >&5 printf %s "checking for lex output file root... " >&6; } if test ${ac_cv_prog_lex_root+y} then : printf %s "(cached) " >&6 else $as_nop ac_cv_prog_lex_root=unknown { { ac_try="$LEX conftest.l" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$LEX conftest.l") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && if test -f lex.yy.c; then ac_cv_prog_lex_root=lex.yy elif test -f lexyy.c; then ac_cv_prog_lex_root=lexyy fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_lex_root" >&5 printf "%s\n" "$ac_cv_prog_lex_root" >&6; } if test "$ac_cv_prog_lex_root" = unknown then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cannot find output from $LEX; giving up on $LEX" >&5 printf "%s\n" "$as_me: WARNING: cannot find output from $LEX; giving up on $LEX" >&2;} LEX=: LEXLIB= fi LEX_OUTPUT_ROOT=$ac_cv_prog_lex_root if test ${LEXLIB+y} then : else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for lex library" >&5 printf %s "checking for lex library... " >&6; } if test ${ac_cv_lib_lex+y} then : printf %s "(cached) " >&6 else $as_nop ac_save_LIBS="$LIBS" ac_found=false for ac_cv_lib_lex in 'none needed' -lfl -ll 'not found'; do case $ac_cv_lib_lex in #( 'none needed') : ;; #( 'not found') : break ;; #( *) : LIBS="$ac_cv_lib_lex $ac_save_LIBS" ;; #( *) : ;; esac cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ `cat $LEX_OUTPUT_ROOT.c` _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_found=: fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext if $ac_found; then break fi done LIBS="$ac_save_LIBS" fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lex" >&5 printf "%s\n" "$ac_cv_lib_lex" >&6; } if test "$ac_cv_lib_lex" = 'not found' then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: required lex library not found; giving up on $LEX" >&5 printf "%s\n" "$as_me: WARNING: required lex library not found; giving up on $LEX" >&2;} LEX=: LEXLIB= elif test "$ac_cv_lib_lex" = 'none needed' then : LEXLIB='' else $as_nop LEXLIB=$ac_cv_lib_lex fi fi if test "$LEX" != : then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether yytext is a pointer" >&5 printf %s "checking whether yytext is a pointer... " >&6; } if test ${ac_cv_prog_lex_yytext_pointer+y} then : printf %s "(cached) " >&6 else $as_nop # POSIX says lex can declare yytext either as a pointer or an array; the # default is implementation-dependent. Figure out which it is, since # not all implementations provide the %pointer and %array declarations. ac_cv_prog_lex_yytext_pointer=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define YYTEXT_POINTER 1 `cat $LEX_OUTPUT_ROOT.c` _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_lex_yytext_pointer=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_lex_yytext_pointer" >&5 printf "%s\n" "$ac_cv_prog_lex_yytext_pointer" >&6; } if test $ac_cv_prog_lex_yytext_pointer = yes; then printf "%s\n" "#define YYTEXT_POINTER 1" >>confdefs.h fi fi rm -f conftest.l $LEX_OUTPUT_ROOT.c fi for ac_prog in 'bison -y' byacc do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_YACC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$YACC"; then ac_cv_prog_YACC="$YACC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_YACC="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi YACC=$ac_cv_prog_YACC if test -n "$YACC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $YACC" >&5 printf "%s\n" "$YACC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$YACC" && break done test -n "$YACC" || YACC="yacc" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 printf %s "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`printf "%s\n" "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval test \${ac_cv_prog_make_${ac_make}_set+y} then : printf %s "(cached) " >&6 else $as_nop cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } SET_MAKE= else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 printf %s "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 printf "%s\n" "no, using $LN_S" >&6; } fi if test "x$LEX" = "x:"; then as_fn_error $? "flex is not found" "$LINENO" 5 else version=`$LEX --version | $AWK '{ split($2,x,"."); print x[1]*10000+x[2]*100+x[3]; }'` if test -n "$version" -a "$version" -ge 20535; then : else as_fn_error $? "flex is too old. GRUB requires 2.5.35 or above" "$LINENO" 5 fi fi # These are not a "must". for ac_prog in makeinfo true do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_path_MAKEINFO+y} then : printf %s "(cached) " >&6 else $as_nop case $MAKEINFO in [\\/]* | ?:[\\/]*) ac_cv_path_MAKEINFO="$MAKEINFO" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_path_MAKEINFO="$as_dir$ac_word$ac_exec_ext" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi MAKEINFO=$ac_cv_path_MAKEINFO if test -n "$MAKEINFO"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MAKEINFO" >&5 printf "%s\n" "$MAKEINFO" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$MAKEINFO" && break done # # Checks for host programs. # ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then if test "$as_dir$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args. set dummy ${ac_tool_prefix}clang; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}clang" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "clang", so it can be a program name with args. set dummy clang; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="clang" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi fi test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion -version; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5 printf %s "checking whether the compiler supports GNU C... " >&6; } if test ${ac_cv_c_compiler_gnu+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_compiler_gnu=yes else $as_nop ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; } ac_compiler_gnu=$ac_cv_c_compiler_gnu if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+y} ac_save_CFLAGS=$CFLAGS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 printf %s "checking whether $CC accepts -g... " >&6; } if test ${ac_cv_prog_cc_g+y} then : printf %s "(cached) " >&6 else $as_nop ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_g=yes else $as_nop CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : else $as_nop ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 printf "%s\n" "$ac_cv_prog_cc_g" >&6; } if test $ac_test_CFLAGS; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi ac_prog_cc_stdc=no if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5 printf %s "checking for $CC option to enable C11 features... " >&6; } if test ${ac_cv_prog_cc_c11+y} then : printf %s "(cached) " >&6 else $as_nop ac_cv_prog_cc_c11=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c11_program _ACEOF for ac_arg in '' -std=gnu11 do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c11=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c11" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi if test "x$ac_cv_prog_cc_c11" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else $as_nop if test "x$ac_cv_prog_cc_c11" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5 printf "%s\n" "$ac_cv_prog_cc_c11" >&6; } CC="$CC $ac_cv_prog_cc_c11" fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11 ac_prog_cc_stdc=c11 fi fi if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5 printf %s "checking for $CC option to enable C99 features... " >&6; } if test ${ac_cv_prog_cc_c99+y} then : printf %s "(cached) " >&6 else $as_nop ac_cv_prog_cc_c99=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c99_program _ACEOF for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99= do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c99=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c99" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi if test "x$ac_cv_prog_cc_c99" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else $as_nop if test "x$ac_cv_prog_cc_c99" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 printf "%s\n" "$ac_cv_prog_cc_c99" >&6; } CC="$CC $ac_cv_prog_cc_c99" fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 ac_prog_cc_stdc=c99 fi fi if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5 printf %s "checking for $CC option to enable C89 features... " >&6; } if test ${ac_cv_prog_cc_c89+y} then : printf %s "(cached) " >&6 else $as_nop ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c89_program _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi if test "x$ac_cv_prog_cc_c89" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else $as_nop if test "x$ac_cv_prog_cc_c89" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 printf "%s\n" "$ac_cv_prog_cc_c89" >&6; } CC="$CC $ac_cv_prog_cc_c89" fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 ac_prog_cc_stdc=c89 fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 printf %s "checking whether $CC understands -c and -o together... " >&6; } if test ${am_cv_prog_cc_c_o+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 printf "%s\n" "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler is clang" >&5 printf %s "checking whether the compiler is clang... " >&6; } if test ${gl_cv_compiler_clang+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __clang__ barfbarf #endif int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : gl_cv_compiler_clang=no else $as_nop gl_cv_compiler_clang=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_compiler_clang" >&5 printf "%s\n" "$gl_cv_compiler_clang" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for compiler option needed when checking for declarations" >&5 printf %s "checking for compiler option needed when checking for declarations... " >&6; } if test ${gl_cv_compiler_check_decl_option+y} then : printf %s "(cached) " >&6 else $as_nop if test $gl_cv_compiler_clang = yes; then save_ac_compile="$ac_compile" ac_compile="$ac_compile -Werror=implicit-function-declaration" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : gl_cv_compiler_check_decl_option='-Werror=implicit-function-declaration' else $as_nop gl_cv_compiler_check_decl_option=none fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_compile="$save_ac_compile" else gl_cv_compiler_check_decl_option=none fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_compiler_check_decl_option" >&5 printf "%s\n" "$gl_cv_compiler_check_decl_option" >&6; } if test "x$gl_cv_compiler_check_decl_option" != xnone; then ac_compile_for_check_decl="$ac_compile $gl_cv_compiler_check_decl_option" else ac_compile_for_check_decl="$ac_compile" fi case "$host_os" in openbsd*) printf "%s\n" "#define _ISOC11_SOURCE 1" >>confdefs.h ;; esac ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 printf %s "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if test ${ac_cv_prog_CPP+y} then : printf %s "(cached) " >&6 else $as_nop # Double quotes because $CC needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" cpp /lib/cpp do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO" then : else $as_nop # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO" then : # Broken: success on invalid input. continue else $as_nop # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 printf "%s\n" "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO" then : else $as_nop # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO" then : # Broken: success on invalid input. continue else $as_nop # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok then : else $as_nop { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 printf %s "checking for grep that handles long lines and -e... " >&6; } if test ${ac_cv_path_GREP+y} then : printf %s "(cached) " >&6 else $as_nop if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_prog in grep ggrep do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 printf %s 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" printf "%s\n" 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 printf "%s\n" "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 printf %s "checking for egrep... " >&6; } if test ${ac_cv_path_EGREP+y} then : printf %s "(cached) " >&6 else $as_nop if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_prog in egrep do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 printf %s 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" printf "%s\n" 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 printf "%s\n" "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for Minix Amsterdam compiler" >&5 printf %s "checking for Minix Amsterdam compiler... " >&6; } if test ${gl_cv_c_amsterdam_compiler+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __ACK__ Amsterdam #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "Amsterdam" >/dev/null 2>&1 then : gl_cv_c_amsterdam_compiler=yes else $as_nop gl_cv_c_amsterdam_compiler=no fi rm -rf conftest* fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_c_amsterdam_compiler" >&5 printf "%s\n" "$gl_cv_c_amsterdam_compiler" >&6; } if test $gl_cv_c_amsterdam_compiler = yes; then if test -z "$AR"; then AR='cc -c.a' fi if test -z "$ARFLAGS"; then ARFLAGS='-o' fi else : fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. set dummy ${ac_tool_prefix}ar; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_AR+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_AR="${ac_tool_prefix}ar" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 printf "%s\n" "$AR" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_AR"; then ac_ct_AR=$AR # Extract the first word of "ar", so it can be a program name with args. set dummy ar; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_AR+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="ar" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 printf "%s\n" "$ac_ct_AR" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_AR" = x; then AR="ar" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi else AR="$ac_cv_prog_AR" fi if test -z "$ARFLAGS"; then ARFLAGS='cr' fi if test -z "$RANLIB"; then if test $gl_cv_c_amsterdam_compiler = yes; then RANLIB=':' else if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_RANLIB+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 printf "%s\n" "$RANLIB" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_RANLIB+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 printf "%s\n" "$ac_ct_RANLIB" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi fi fi # Check whether --enable-largefile was given. if test ${enable_largefile+y} then : enableval=$enable_largefile; fi if test "$enable_largefile" != no then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5 printf %s "checking for special C compiler options needed for large files... " >&6; } if test ${ac_cv_sys_largefile_CC+y} then : printf %s "(cached) " >&6 else $as_nop ac_cv_sys_largefile_CC=no if test "$GCC" != yes; then ac_save_CC=$CC while :; do # IRIX 6.2 and later do not support large files by default, # so use the C compiler's -n32 option if that helps. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : break fi rm -f core conftest.err conftest.$ac_objext conftest.beam CC="$CC -n32" if ac_fn_c_try_compile "$LINENO" then : ac_cv_sys_largefile_CC=' -n32'; break fi rm -f core conftest.err conftest.$ac_objext conftest.beam break done CC=$ac_save_CC rm -f conftest.$ac_ext fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5 printf "%s\n" "$ac_cv_sys_largefile_CC" >&6; } if test "$ac_cv_sys_largefile_CC" != no; then CC=$CC$ac_cv_sys_largefile_CC fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5 printf %s "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; } if test ${ac_cv_sys_file_offset_bits+y} then : printf %s "(cached) " >&6 else $as_nop while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_sys_file_offset_bits=no; break fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #undef _FILE_OFFSET_BITS #define _FILE_OFFSET_BITS 64 #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_sys_file_offset_bits=64; break fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cv_sys_file_offset_bits=unknown break done fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5 printf "%s\n" "$ac_cv_sys_file_offset_bits" >&6; } case $ac_cv_sys_file_offset_bits in #( no | unknown) ;; *) printf "%s\n" "#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits" >>confdefs.h ;; esac rm -rf conftest* case $ac_cv_sys_file_offset_bits in #( unknown) : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5 printf %s "checking for _LARGE_FILES value needed for large files... " >&6; } if test ${ac_cv_sys_large_files+y} then : printf %s "(cached) " >&6 else $as_nop while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_sys_large_files=no; break fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #undef _LARGE_FILES #define _LARGE_FILES 1 #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_sys_large_files=1; break fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cv_sys_large_files=unknown break done fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5 printf "%s\n" "$ac_cv_sys_large_files" >&6; } case $ac_cv_sys_large_files in #( no | unknown) ;; *) printf "%s\n" "#define _LARGE_FILES $ac_cv_sys_large_files" >>confdefs.h ;; esac rm -rf conftest* ;; #( 64) : # Check whether --enable-year2038 was given. if test ${enable_year2038+y} then : enableval=$enable_year2038; fi if test "$enable_year2038" != no then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for time_t past the year 2038" >&5 printf %s "checking for time_t past the year 2038... " >&6; } if test ${gl_cv_type_time_t_y2038+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* Check that time_t can represent 2**32 - 1 correctly. */ #define LARGE_TIME_T \\ ((time_t) (((time_t) 1 << 30) - 1 + 3 * ((time_t) 1 << 30))) int verify_time_t_range[(LARGE_TIME_T / 65537 == 65535 && LARGE_TIME_T % 65537 == 0) ? 1 : -1]; _ACEOF if ac_fn_c_try_compile "$LINENO" then : gl_cv_type_time_t_y2038=yes else $as_nop gl_cv_type_time_t_y2038=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_type_time_t_y2038" >&5 printf "%s\n" "$gl_cv_type_time_t_y2038" >&6; } if test "$gl_cv_type_time_t_y2038" = no; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for 64-bit time_t with _TIME_BITS=64" >&5 printf %s "checking for 64-bit time_t with _TIME_BITS=64... " >&6; } if test ${gl_cv_type_time_t_bits_macro+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _TIME_BITS 64 #define _FILE_OFFSET_BITS 64 #include /* Check that time_t can represent 2**32 - 1 correctly. */ #define LARGE_TIME_T \\ ((time_t) (((time_t) 1 << 30) - 1 + 3 * ((time_t) 1 << 30))) int verify_time_t_range[(LARGE_TIME_T / 65537 == 65535 && LARGE_TIME_T % 65537 == 0) ? 1 : -1]; _ACEOF if ac_fn_c_try_compile "$LINENO" then : gl_cv_type_time_t_bits_macro=yes else $as_nop gl_cv_type_time_t_bits_macro=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_type_time_t_bits_macro" >&5 printf "%s\n" "$gl_cv_type_time_t_bits_macro" >&6; } if test "$gl_cv_type_time_t_bits_macro" = yes; then printf "%s\n" "#define _TIME_BITS 64" >>confdefs.h printf "%s\n" "#define _FILE_OFFSET_BITS 64" >>confdefs.h gl_cv_type_time_t_y2038=yes fi fi if test $gl_cv_type_time_t_y2038 = no; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef _USE_32BIT_TIME_T int ok; #else error fail #endif _ACEOF if ac_fn_c_try_compile "$LINENO" then : { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The 'time_t' type stops working after January 2038. Remove _USE_32BIT_TIME_T from the compiler flags. See \`config.log' for more details" "$LINENO" 5; } else $as_nop # If not cross-compiling and says we should check, # and 'touch' works with a large timestamp, then evidently wider time_t # is desired and supported, so fail and ask the builder to fix the # problem. Otherwise, just warn the builder. if test "$gl_warned_about_y2038" != yes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: The 'time_t' type stops working after January 2038, and this package needs a wider 'time_t' type if there is any way to access timestamps after that. Configure with 'CC=\"${CC} -m64\"' perhaps?" >&5 printf "%s\n" "$as_me: WARNING: The 'time_t' type stops working after January 2038, and this package needs a wider 'time_t' type if there is any way to access timestamps after that. Configure with 'CC=\"${CC} -m64\"' perhaps?" >&2;} gl_warned_about_y2038=yes fi fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi ;; #( *) : ;; esac fi case "$host_os" in mingw*) printf "%s\n" "#define __MINGW_USE_VC2005_COMPAT 1" >>confdefs.h ;; esac # Check whether --enable-threads was given. if test ${enable_threads+y} then : enableval=$enable_threads; gl_use_threads=$enableval else $as_nop if test -n "$gl_use_threads_default"; then gl_use_threads="$gl_use_threads_default" else case "$host_os" in osf*) gl_use_threads=no ;; cygwin*) case `uname -r` in 1.[0-5].*) gl_use_threads=no ;; *) gl_use_threads=yes ;; esac ;; mingw*) case "$gl_use_winpthreads_default" in yes) gl_use_threads=posix ;; no) gl_use_threads=windows ;; *) gl_use_threads=yes ;; esac ;; *) gl_use_threads=yes ;; esac fi fi if test "$gl_use_threads" = yes \ || test "$gl_use_threads" = isoc \ || test "$gl_use_threads" = posix \ || test "$gl_use_threads" = isoc+posix; then # For using or : if test -z "$gl_anythreadlib_early_done"; then case "$host_os" in osf*) # On OSF/1, the compiler needs the flag -D_REENTRANT so that it # groks . cc also understands the flag -pthread, but # we don't use it because 1. gcc-2.95 doesn't understand -pthread, # 2. putting a flag into CPPFLAGS that has an effect on the linker # causes the AC_LINK_IFELSE test below to succeed unexpectedly, # leading to wrong values of LIBTHREAD and LTLIBTHREAD. CPPFLAGS="$CPPFLAGS -D_REENTRANT" ;; esac # Some systems optimize for single-threaded programs by default, and # need special flags to disable these optimizations. For example, the # definition of 'errno' in . case "$host_os" in aix* | freebsd*) CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE" ;; solaris*) CPPFLAGS="$CPPFLAGS -D_REENTRANT" ;; esac gl_anythreadlib_early_done=done fi fi # Pre-early section. # Code from module absolute-header: # Code from module alloca: # Code from module alloca-opt: # Code from module argp: # Code from module assure: # Code from module at-internal: # Code from module attribute: # Code from module base64: # Code from module basename-lgpl: # Code from module btowc: # Code from module builtin-expect: # Code from module c99: # Code from module calloc-gnu: # Code from module calloc-posix: # Code from module chdir: # Code from module chdir-long: # Code from module cloexec: # Code from module close: # Code from module ctype: # Code from module dirent: # Code from module dirfd: # Code from module double-slash-root: # Code from module dup2: # Code from module dynarray: # Code from module errno: # Code from module error: # Code from module exitfail: # Code from module extensions: # Code from module extern-inline: # Code from module fchdir: # Code from module fcntl: # Code from module fcntl-h: # Code from module fd-hook: # Code from module fd-safer-flag: # Code from module filename: # Code from module filenamecat-lgpl: # Code from module flexmember: # Code from module float: # Code from module fnmatch: # Code from module fnmatch-h: # Code from module free-posix: # Code from module fstat: # Code from module gen-header: # Code from module getcwd-lgpl: # Code from module getdelim: # Code from module getdtablesize: # Code from module getline: # Code from module getopt-gnu: # Code from module getopt-posix: # Code from module getprogname: # Code from module gettext-h: # Code from module gitlog-to-changelog: # Code from module hard-locale: # Code from module ialloc: # Code from module idx: # Code from module include_next: # Code from module intprops: # Code from module inttypes-incomplete: # Code from module isblank: # Code from module langinfo: # Code from module largefile: # Code from module libc-config: # Code from module limits-h: # Code from module localcharset: # Code from module locale: # Code from module localeconv: # Code from module lock: # Code from module malloc-gnu: # Code from module malloc-posix: # Code from module malloca: # Code from module mbrtowc: # Code from module mbsinit: # Code from module mbsrtowcs: # Code from module mbswidth: # Code from module mbtowc: # Code from module memchr: # Code from module mempcpy: # Code from module memrchr: # Code from module msvc-inval: # Code from module msvc-nothrow: # Code from module multiarch: # Code from module nl_langinfo: # Code from module nocrash: # Code from module open: # Code from module openat: # Code from module openat-die: # Code from module openat-h: # Code from module pathmax: # Code from module pipe-posix: # Code from module progname: # Code from module rawmemchr: # Code from module realloc-gnu: # Code from module realloc-posix: # Code from module reallocarray: # Code from module regex: # Code from module save-cwd: # Code from module setlocale-null: # Code from module size_max: # Code from module sleep: # Code from module snippet/_Noreturn: # Code from module snippet/arg-nonnull: # Code from module snippet/c++defs: # Code from module snippet/warn-on-use: # Code from module ssize_t: # Code from module stat: # Code from module stat-time: # Code from module std-gnu11: # Code from module stdalign: # Code from module stdbool: # Code from module stddef: # Code from module stdint: # Code from module stdio: # Code from module stdlib: # Code from module strcase: # Code from module strchrnul: # Code from module strdup-posix: # Code from module streq: # Code from module strerror: # Code from module strerror-override: # Code from module string: # Code from module strings: # Code from module strndup: # Code from module strnlen: # Code from module strnlen1: # Code from module sys_stat: # Code from module sys_types: # Code from module sysexits: # Code from module threadlib: # Code from module time: # Code from module unistd: # Code from module unistd-safer: # Code from module unitypes: # Code from module uniwidth/base: # Code from module uniwidth/width: # Code from module vararrays: # Code from module vasnprintf: # Code from module verify: # Code from module vsnprintf: # Code from module wchar: # Code from module wcrtomb: # Code from module wctype-h: # Code from module wcwidth: # Code from module windows-mutex: # Code from module windows-once: # Code from module windows-recmutex: # Code from module windows-rwlock: # Code from module wmemchr: # Code from module wmempcpy: # Code from module xalloc-oversized: # Code from module xsize: ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC clang++ do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CXX+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 printf "%s\n" "$CXX" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC clang++ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CXX+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 printf "%s\n" "$ac_ct_CXX" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C++" >&5 printf %s "checking whether the compiler supports GNU C++... " >&6; } if test ${ac_cv_cxx_compiler_gnu+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : ac_compiler_gnu=yes else $as_nop ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 printf "%s\n" "$ac_cv_cxx_compiler_gnu" >&6; } ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+y} ac_save_CXXFLAGS=$CXXFLAGS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 printf %s "checking whether $CXX accepts -g... " >&6; } if test ${ac_cv_prog_cxx_g+y} then : printf %s "(cached) " >&6 else $as_nop ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : ac_cv_prog_cxx_g=yes else $as_nop CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : else $as_nop ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 printf "%s\n" "$ac_cv_prog_cxx_g" >&6; } if test $ac_test_CXXFLAGS; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_prog_cxx_stdcxx=no if test x$ac_prog_cxx_stdcxx = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++11 features" >&5 printf %s "checking for $CXX option to enable C++11 features... " >&6; } if test ${ac_cv_prog_cxx_cxx11+y} then : printf %s "(cached) " >&6 else $as_nop ac_cv_prog_cxx_cxx11=no ac_save_CXX=$CXX cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_cxx_conftest_cxx11_program _ACEOF for ac_arg in '' -std=gnu++11 -std=gnu++0x -std=c++11 -std=c++0x -qlanglvl=extended0x -AA do CXX="$ac_save_CXX $ac_arg" if ac_fn_cxx_try_compile "$LINENO" then : ac_cv_prog_cxx_cxx11=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cxx_cxx11" != "xno" && break done rm -f conftest.$ac_ext CXX=$ac_save_CXX fi if test "x$ac_cv_prog_cxx_cxx11" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else $as_nop if test "x$ac_cv_prog_cxx_cxx11" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_cxx11" >&5 printf "%s\n" "$ac_cv_prog_cxx_cxx11" >&6; } CXX="$CXX $ac_cv_prog_cxx_cxx11" fi ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx11 ac_prog_cxx_stdcxx=cxx11 fi fi if test x$ac_prog_cxx_stdcxx = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++98 features" >&5 printf %s "checking for $CXX option to enable C++98 features... " >&6; } if test ${ac_cv_prog_cxx_cxx98+y} then : printf %s "(cached) " >&6 else $as_nop ac_cv_prog_cxx_cxx98=no ac_save_CXX=$CXX cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_cxx_conftest_cxx98_program _ACEOF for ac_arg in '' -std=gnu++98 -std=c++98 -qlanglvl=extended -AA do CXX="$ac_save_CXX $ac_arg" if ac_fn_cxx_try_compile "$LINENO" then : ac_cv_prog_cxx_cxx98=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cxx_cxx98" != "xno" && break done rm -f conftest.$ac_ext CXX=$ac_save_CXX fi if test "x$ac_cv_prog_cxx_cxx98" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else $as_nop if test "x$ac_cv_prog_cxx_cxx98" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_cxx98" >&5 printf "%s\n" "$ac_cv_prog_cxx_cxx98" >&6; } CXX="$CXX $ac_cv_prog_cxx_cxx98" fi ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx98 ac_prog_cxx_stdcxx=cxx98 fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CXX" am_compiler_list= { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 printf %s "checking dependency style of $depcc... " >&6; } if test ${am_cv_CXX_dependencies_compiler_type+y} then : printf %s "(cached) " >&6 else $as_nop if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 printf "%s\n" "$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= fi # By default we simply use the C compiler to build assembly code. test "${CCAS+set}" = set || CCAS=$CC test "${CCASFLAGS+set}" = set || CCASFLAGS=$CFLAGS depcc="$CCAS" am_compiler_list= { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 printf %s "checking dependency style of $depcc... " >&6; } if test ${am_cv_CCAS_dependencies_compiler_type+y} then : printf %s "(cached) " >&6 else $as_nop if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CCAS_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CCAS_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CCAS_dependencies_compiler_type=none fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CCAS_dependencies_compiler_type" >&5 printf "%s\n" "$am_cv_CCAS_dependencies_compiler_type" >&6; } CCASDEPMODE=depmode=$am_cv_CCAS_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CCAS_dependencies_compiler_type" = gcc3; then am__fastdepCCAS_TRUE= am__fastdepCCAS_FALSE='#' else am__fastdepCCAS_TRUE='#' am__fastdepCCAS_FALSE= fi if test -n "$PYTHON"; then # If the user set $PYTHON, use it and don't search something else. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $PYTHON version is >= 2.6" >&5 printf %s "checking whether $PYTHON version is >= 2.6... " >&6; } prog="import sys # split strings by '.' and convert to numeric. Append some zeros # because we need at least 4 digits for the hex conversion. # map returns an iterator in Python 3.0 and a list in 2.x minver = list(map(int, '2.6'.split('.'))) + [0, 0, 0] minverhex = 0 # xrange is not present in Python 3.0 and range returns an iterator for i in list(range(0, 4)): minverhex = (minverhex << 8) + minver[i] sys.exit(sys.hexversion < minverhex)" if { echo "$as_me:$LINENO: $PYTHON -c "$prog"" >&5 ($PYTHON -c "$prog") >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } as_fn_error $? "Python interpreter is too old" "$LINENO" 5 fi am_display_PYTHON=$PYTHON else # Otherwise, try each interpreter until we find one that satisfies # VERSION. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a Python interpreter with version >= 2.6" >&5 printf %s "checking for a Python interpreter with version >= 2.6... " >&6; } if test ${am_cv_pathless_PYTHON+y} then : printf %s "(cached) " >&6 else $as_nop for am_cv_pathless_PYTHON in python python2 python3 python3.11 python3.10 python3.9 python3.8 python3.7 python3.6 python3.5 python3.4 python3.3 python3.2 python3.1 python3.0 python2.7 python2.6 python2.5 python2.4 python2.3 python2.2 python2.1 python2.0 none; do test "$am_cv_pathless_PYTHON" = none && break prog="import sys # split strings by '.' and convert to numeric. Append some zeros # because we need at least 4 digits for the hex conversion. # map returns an iterator in Python 3.0 and a list in 2.x minver = list(map(int, '2.6'.split('.'))) + [0, 0, 0] minverhex = 0 # xrange is not present in Python 3.0 and range returns an iterator for i in list(range(0, 4)): minverhex = (minverhex << 8) + minver[i] sys.exit(sys.hexversion < minverhex)" if { echo "$as_me:$LINENO: $am_cv_pathless_PYTHON -c "$prog"" >&5 ($am_cv_pathless_PYTHON -c "$prog") >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } then : break fi done fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_pathless_PYTHON" >&5 printf "%s\n" "$am_cv_pathless_PYTHON" >&6; } # Set $PYTHON to the absolute path of $am_cv_pathless_PYTHON. if test "$am_cv_pathless_PYTHON" = none; then PYTHON=: else # Extract the first word of "$am_cv_pathless_PYTHON", so it can be a program name with args. set dummy $am_cv_pathless_PYTHON; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_path_PYTHON+y} then : printf %s "(cached) " >&6 else $as_nop case $PYTHON in [\\/]* | ?:[\\/]*) ac_cv_path_PYTHON="$PYTHON" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_path_PYTHON="$as_dir$ac_word$ac_exec_ext" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PYTHON=$ac_cv_path_PYTHON if test -n "$PYTHON"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PYTHON" >&5 printf "%s\n" "$PYTHON" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi am_display_PYTHON=$am_cv_pathless_PYTHON fi if test "$PYTHON" = :; then as_fn_error $? "no suitable Python interpreter found" "$LINENO" 5 else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON version" >&5 printf %s "checking for $am_display_PYTHON version... " >&6; } if test ${am_cv_python_version+y} then : printf %s "(cached) " >&6 else $as_nop am_cv_python_version=`$PYTHON -c "import sys; print ('%u.%u' % sys.version_info[:2])"` fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_version" >&5 printf "%s\n" "$am_cv_python_version" >&6; } PYTHON_VERSION=$am_cv_python_version { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON platform" >&5 printf %s "checking for $am_display_PYTHON platform... " >&6; } if test ${am_cv_python_platform+y} then : printf %s "(cached) " >&6 else $as_nop am_cv_python_platform=`$PYTHON -c "import sys; sys.stdout.write(sys.platform)"` fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_platform" >&5 printf "%s\n" "$am_cv_python_platform" >&6; } PYTHON_PLATFORM=$am_cv_python_platform if test "x$prefix" = xNONE; then am__usable_prefix=$ac_default_prefix else am__usable_prefix=$prefix fi # Allow user to request using sys.* values from Python, # instead of the GNU $prefix values. # Check whether --with-python-sys-prefix was given. if test ${with_python_sys_prefix+y} then : withval=$with_python_sys_prefix; am_use_python_sys=: else $as_nop am_use_python_sys=false fi # Allow user to override whatever the default Python prefix is. # Check whether --with-python_prefix was given. if test ${with_python_prefix+y} then : withval=$with_python_prefix; am_python_prefix_subst=$withval am_cv_python_prefix=$withval { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for explicit $am_display_PYTHON prefix" >&5 printf %s "checking for explicit $am_display_PYTHON prefix... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_prefix" >&5 printf "%s\n" "$am_cv_python_prefix" >&6; } else $as_nop if $am_use_python_sys; then # using python sys.prefix value, not GNU { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for python default $am_display_PYTHON prefix" >&5 printf %s "checking for python default $am_display_PYTHON prefix... " >&6; } if test ${am_cv_python_prefix+y} then : printf %s "(cached) " >&6 else $as_nop am_cv_python_prefix=`$PYTHON -c "import sys; sys.stdout.write(sys.prefix)"` fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_prefix" >&5 printf "%s\n" "$am_cv_python_prefix" >&6; } case $am_cv_python_prefix in $am__usable_prefix*) am__strip_prefix=`echo "$am__usable_prefix" | sed 's|.|.|g'` am_python_prefix_subst=`echo "$am_cv_python_prefix" | sed "s,^$am__strip_prefix,\\${prefix},"` ;; *) am_python_prefix_subst=$am_cv_python_prefix ;; esac else # using GNU prefix value, not python sys.prefix am_python_prefix_subst='${prefix}' am_python_prefix=$am_python_prefix_subst { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU default $am_display_PYTHON prefix" >&5 printf %s "checking for GNU default $am_display_PYTHON prefix... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_python_prefix" >&5 printf "%s\n" "$am_python_prefix" >&6; } fi fi # Substituting python_prefix_subst value. PYTHON_PREFIX=$am_python_prefix_subst # emacs-page Now do it all over again for Python exec_prefix, but with yet # another conditional: fall back to regular prefix if that was specified. # Check whether --with-python_exec_prefix was given. if test ${with_python_exec_prefix+y} then : withval=$with_python_exec_prefix; am_python_exec_prefix_subst=$withval am_cv_python_exec_prefix=$withval { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for explicit $am_display_PYTHON exec_prefix" >&5 printf %s "checking for explicit $am_display_PYTHON exec_prefix... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_exec_prefix" >&5 printf "%s\n" "$am_cv_python_exec_prefix" >&6; } else $as_nop # no explicit --with-python_exec_prefix, but if # --with-python_prefix was given, use its value for python_exec_prefix too. if test -n "$with_python_prefix" then : am_python_exec_prefix_subst=$with_python_prefix am_cv_python_exec_prefix=$with_python_prefix { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for python_prefix-given $am_display_PYTHON exec_prefix" >&5 printf %s "checking for python_prefix-given $am_display_PYTHON exec_prefix... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_exec_prefix" >&5 printf "%s\n" "$am_cv_python_exec_prefix" >&6; } else $as_nop # Set am__usable_exec_prefix whether using GNU or Python values, # since we use that variable for pyexecdir. if test "x$exec_prefix" = xNONE; then am__usable_exec_prefix=$am__usable_prefix else am__usable_exec_prefix=$exec_prefix fi # if $am_use_python_sys; then # using python sys.exec_prefix, not GNU { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for python default $am_display_PYTHON exec_prefix" >&5 printf %s "checking for python default $am_display_PYTHON exec_prefix... " >&6; } if test ${am_cv_python_exec_prefix+y} then : printf %s "(cached) " >&6 else $as_nop am_cv_python_exec_prefix=`$PYTHON -c "import sys; sys.stdout.write(sys.exec_prefix)"` fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_exec_prefix" >&5 printf "%s\n" "$am_cv_python_exec_prefix" >&6; } case $am_cv_python_exec_prefix in $am__usable_exec_prefix*) am__strip_prefix=`echo "$am__usable_exec_prefix" | sed 's|.|.|g'` am_python_exec_prefix_subst=`echo "$am_cv_python_exec_prefix" | sed "s,^$am__strip_prefix,\\${exec_prefix},"` ;; *) am_python_exec_prefix_subst=$am_cv_python_exec_prefix ;; esac else # using GNU $exec_prefix, not python sys.exec_prefix am_python_exec_prefix_subst='${exec_prefix}' am_python_exec_prefix=$am_python_exec_prefix_subst { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU default $am_display_PYTHON exec_prefix" >&5 printf %s "checking for GNU default $am_display_PYTHON exec_prefix... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_python_exec_prefix" >&5 printf "%s\n" "$am_python_exec_prefix" >&6; } fi fi fi # Substituting python_exec_prefix_subst. PYTHON_EXEC_PREFIX=$am_python_exec_prefix_subst # Factor out some code duplication into this shell variable. am_python_setup_sysconfig="\ import sys # Prefer sysconfig over distutils.sysconfig, for better compatibility # with python 3.x. See automake bug#10227. try: import sysconfig except ImportError: can_use_sysconfig = 0 else: can_use_sysconfig = 1 # Can't use sysconfig in CPython 2.7, since it's broken in virtualenvs: # try: from platform import python_implementation if python_implementation() == 'CPython' and sys.version[:3] == '2.7': can_use_sysconfig = 0 except ImportError: pass" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON script directory (pythondir)" >&5 printf %s "checking for $am_display_PYTHON script directory (pythondir)... " >&6; } if test ${am_cv_python_pythondir+y} then : printf %s "(cached) " >&6 else $as_nop if test "x$am_cv_python_prefix" = x; then am_py_prefix=$am__usable_prefix else am_py_prefix=$am_cv_python_prefix fi am_cv_python_pythondir=`$PYTHON -c " $am_python_setup_sysconfig if can_use_sysconfig: if hasattr(sysconfig, 'get_default_scheme'): scheme = sysconfig.get_default_scheme() else: scheme = sysconfig._get_default_scheme() if scheme == 'posix_local': # Debian's default scheme installs to /usr/local/ but we want to find headers in /usr/ scheme = 'posix_prefix' sitedir = sysconfig.get_path('purelib', scheme, vars={'base':'$am_py_prefix'}) else: from distutils import sysconfig sitedir = sysconfig.get_python_lib(0, 0, prefix='$am_py_prefix') sys.stdout.write(sitedir)"` # case $am_cv_python_pythondir in $am_py_prefix*) am__strip_prefix=`echo "$am_py_prefix" | sed 's|.|.|g'` am_cv_python_pythondir=`echo "$am_cv_python_pythondir" | sed "s,^$am__strip_prefix,\\${PYTHON_PREFIX},"` ;; *) case $am_py_prefix in /usr|/System*) ;; *) am_cv_python_pythondir="\${PYTHON_PREFIX}/lib/python$PYTHON_VERSION/site-packages" ;; esac ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_pythondir" >&5 printf "%s\n" "$am_cv_python_pythondir" >&6; } pythondir=$am_cv_python_pythondir pkgpythondir=\${pythondir}/$PACKAGE { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON extension module directory (pyexecdir)" >&5 printf %s "checking for $am_display_PYTHON extension module directory (pyexecdir)... " >&6; } if test ${am_cv_python_pyexecdir+y} then : printf %s "(cached) " >&6 else $as_nop if test "x$am_cv_python_exec_prefix" = x; then am_py_exec_prefix=$am__usable_exec_prefix else am_py_exec_prefix=$am_cv_python_exec_prefix fi am_cv_python_pyexecdir=`$PYTHON -c " $am_python_setup_sysconfig if can_use_sysconfig: if hasattr(sysconfig, 'get_default_scheme'): scheme = sysconfig.get_default_scheme() else: scheme = sysconfig._get_default_scheme() if scheme == 'posix_local': # Debian's default scheme installs to /usr/local/ but we want to find headers in /usr/ scheme = 'posix_prefix' sitedir = sysconfig.get_path('platlib', scheme, vars={'platbase':'$am_py_exec_prefix'}) else: from distutils import sysconfig sitedir = sysconfig.get_python_lib(1, 0, prefix='$am_py_exec_prefix') sys.stdout.write(sitedir)"` # case $am_cv_python_pyexecdir in $am_py_exec_prefix*) am__strip_prefix=`echo "$am_py_exec_prefix" | sed 's|.|.|g'` am_cv_python_pyexecdir=`echo "$am_cv_python_pyexecdir" | sed "s,^$am__strip_prefix,\\${PYTHON_EXEC_PREFIX},"` ;; *) case $am_py_exec_prefix in /usr|/System*) ;; *) am_cv_python_pyexecdir="\${PYTHON_EXEC_PREFIX}/lib/python$PYTHON_VERSION/site-packages" ;; esac ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_pyexecdir" >&5 printf "%s\n" "$am_cv_python_pyexecdir" >&6; } pyexecdir=$am_cv_python_pyexecdir pkgpyexecdir=\${pyexecdir}/$PACKAGE fi # Must be GCC. test "x$GCC" = xyes || as_fn_error $? "GCC is required" "$LINENO" 5 # Extract the first word of "$CXX", so it can be a program name with args. set dummy $CXX; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_HAVE_CXX+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$HAVE_CXX"; then ac_cv_prog_HAVE_CXX="$HAVE_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_HAVE_CXX="yes" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_HAVE_CXX" && ac_cv_prog_HAVE_CXX="no" fi fi HAVE_CXX=$ac_cv_prog_HAVE_CXX if test -n "$HAVE_CXX"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $HAVE_CXX" >&5 printf "%s\n" "$HAVE_CXX" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 printf %s "checking for a sed that does not truncate output... " >&6; } if test ${ac_cv_path_SED+y} then : printf %s "(cached) " >&6 else $as_nop ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed { ac_script=; unset ac_script;} if test -z "$SED"; then ac_path_SED_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_prog in sed gsed do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; *) ac_count=0 printf %s 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" printf "%s\n" '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_SED_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_SED="$ac_path_SED" ac_path_SED_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_SED_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 printf "%s\n" "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether NLS is requested" >&5 printf %s "checking whether NLS is requested... " >&6; } # Check whether --enable-nls was given. if test ${enable_nls+y} then : enableval=$enable_nls; USE_NLS=$enableval else $as_nop USE_NLS=yes fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5 printf "%s\n" "$USE_NLS" >&6; } GETTEXT_MACRO_VERSION=0.18 # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which # contains only /bin. Note that ksh looks also at the FPATH variable, # so we have to set that as well for the test. PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \ && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \ || PATH_SEPARATOR=';' } fi # Find out how to test for executable files. Don't use a zero-byte file, # as systems may use methods other than mode bits to determine executability. cat >conf$$.file <<_ASEOF #! /bin/sh exit 0 _ASEOF chmod +x conf$$.file if test -x conf$$.file >/dev/null 2>&1; then ac_executable_p="test -x" else ac_executable_p="test -f" fi rm -f conf$$.file # Extract the first word of "msgfmt", so it can be a program name with args. set dummy msgfmt; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_path_MSGFMT+y} then : printf %s "(cached) " >&6 else $as_nop case "$MSGFMT" in [\\/]* | ?:[\\/]*) ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path. ;; *) ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$ac_save_IFS" test -z "$ac_dir" && ac_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then echo "$as_me: trying $ac_dir/$ac_word..." >&5 if $ac_dir/$ac_word --statistics /dev/null >&5 2>&1 && (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then ac_cv_path_MSGFMT="$ac_dir/$ac_word$ac_exec_ext" break 2 fi fi done done IFS="$ac_save_IFS" test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT=":" ;; esac fi MSGFMT="$ac_cv_path_MSGFMT" if test "$MSGFMT" != ":"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MSGFMT" >&5 printf "%s\n" "$MSGFMT" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi # Extract the first word of "gmsgfmt", so it can be a program name with args. set dummy gmsgfmt; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_path_GMSGFMT+y} then : printf %s "(cached) " >&6 else $as_nop case $GMSGFMT in [\\/]* | ?:[\\/]*) ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_path_GMSGFMT="$as_dir$ac_word$ac_exec_ext" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT" ;; esac fi GMSGFMT=$ac_cv_path_GMSGFMT if test -n "$GMSGFMT"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $GMSGFMT" >&5 printf "%s\n" "$GMSGFMT" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi case `$MSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) MSGFMT_015=: ;; *) MSGFMT_015=$MSGFMT ;; esac case `$GMSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) GMSGFMT_015=: ;; *) GMSGFMT_015=$GMSGFMT ;; esac # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which # contains only /bin. Note that ksh looks also at the FPATH variable, # so we have to set that as well for the test. PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \ && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \ || PATH_SEPARATOR=';' } fi # Find out how to test for executable files. Don't use a zero-byte file, # as systems may use methods other than mode bits to determine executability. cat >conf$$.file <<_ASEOF #! /bin/sh exit 0 _ASEOF chmod +x conf$$.file if test -x conf$$.file >/dev/null 2>&1; then ac_executable_p="test -x" else ac_executable_p="test -f" fi rm -f conf$$.file # Extract the first word of "xgettext", so it can be a program name with args. set dummy xgettext; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_path_XGETTEXT+y} then : printf %s "(cached) " >&6 else $as_nop case "$XGETTEXT" in [\\/]* | ?:[\\/]*) ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path. ;; *) ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$ac_save_IFS" test -z "$ac_dir" && ac_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then echo "$as_me: trying $ac_dir/$ac_word..." >&5 if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >&5 2>&1 && (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then ac_cv_path_XGETTEXT="$ac_dir/$ac_word$ac_exec_ext" break 2 fi fi done done IFS="$ac_save_IFS" test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":" ;; esac fi XGETTEXT="$ac_cv_path_XGETTEXT" if test "$XGETTEXT" != ":"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $XGETTEXT" >&5 printf "%s\n" "$XGETTEXT" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi rm -f messages.po case `$XGETTEXT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) XGETTEXT_015=: ;; *) XGETTEXT_015=$XGETTEXT ;; esac # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which # contains only /bin. Note that ksh looks also at the FPATH variable, # so we have to set that as well for the test. PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \ && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \ || PATH_SEPARATOR=';' } fi # Find out how to test for executable files. Don't use a zero-byte file, # as systems may use methods other than mode bits to determine executability. cat >conf$$.file <<_ASEOF #! /bin/sh exit 0 _ASEOF chmod +x conf$$.file if test -x conf$$.file >/dev/null 2>&1; then ac_executable_p="test -x" else ac_executable_p="test -f" fi rm -f conf$$.file # Extract the first word of "msgmerge", so it can be a program name with args. set dummy msgmerge; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_path_MSGMERGE+y} then : printf %s "(cached) " >&6 else $as_nop case "$MSGMERGE" in [\\/]* | ?:[\\/]*) ac_cv_path_MSGMERGE="$MSGMERGE" # Let the user override the test with a path. ;; *) ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$ac_save_IFS" test -z "$ac_dir" && ac_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then echo "$as_me: trying $ac_dir/$ac_word..." >&5 if $ac_dir/$ac_word --update -q /dev/null /dev/null >&5 2>&1; then ac_cv_path_MSGMERGE="$ac_dir/$ac_word$ac_exec_ext" break 2 fi fi done done IFS="$ac_save_IFS" test -z "$ac_cv_path_MSGMERGE" && ac_cv_path_MSGMERGE=":" ;; esac fi MSGMERGE="$ac_cv_path_MSGMERGE" if test "$MSGMERGE" != ":"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MSGMERGE" >&5 printf "%s\n" "$MSGMERGE" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$localedir" || localedir='${datadir}/locale' test -n "${XGETTEXT_EXTRA_OPTIONS+set}" || XGETTEXT_EXTRA_OPTIONS= ac_config_commands="$ac_config_commands po-directories" if test "X$prefix" = "XNONE"; then acl_final_prefix="$ac_default_prefix" else acl_final_prefix="$prefix" fi if test "X$exec_prefix" = "XNONE"; then acl_final_exec_prefix='${prefix}' else acl_final_exec_prefix="$exec_prefix" fi acl_save_prefix="$prefix" prefix="$acl_final_prefix" eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" prefix="$acl_save_prefix" # Check whether --with-gnu-ld was given. if test ${with_gnu_ld+y} then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else $as_nop with_gnu_ld=no fi # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which # contains only /bin. Note that ksh looks also at the FPATH variable, # so we have to set that as well for the test. PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \ && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \ || PATH_SEPARATOR=';' } fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 printf %s "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`echo "$ac_prog"| sed 's%\\\\%/%g'` while echo "$ac_prog" | grep "$re_direlt" > /dev/null 2>&1; do ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 printf %s "checking for GNU ld... " >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 printf %s "checking for non-GNU ld... " >&6; } fi if test ${acl_cv_path_LD+y} then : printf %s "(cached) " >&6 else $as_nop if test -z "$LD"; then acl_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$acl_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then acl_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$acl_cv_path_LD" -v 2>&1 &5 printf "%s\n" "$LD" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 printf %s "checking if the linker ($LD) is GNU ld... " >&6; } if test ${acl_cv_prog_gnu_ld+y} then : printf %s "(cached) " >&6 else $as_nop # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 printf "%s\n" "$acl_cv_prog_gnu_ld" >&6; } with_gnu_ld=$acl_cv_prog_gnu_ld { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for shared library run path origin" >&5 printf %s "checking for shared library run path origin... " >&6; } if test ${acl_cv_rpath+y} then : printf %s "(cached) " >&6 else $as_nop CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh . ./conftest.sh rm -f ./conftest.sh acl_cv_rpath=done fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $acl_cv_rpath" >&5 printf "%s\n" "$acl_cv_rpath" >&6; } wl="$acl_cv_wl" acl_libext="$acl_cv_libext" acl_shlibext="$acl_cv_shlibext" acl_libname_spec="$acl_cv_libname_spec" acl_library_names_spec="$acl_cv_library_names_spec" acl_hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" acl_hardcode_direct="$acl_cv_hardcode_direct" acl_hardcode_minus_L="$acl_cv_hardcode_minus_L" # Check whether --enable-rpath was given. if test ${enable_rpath+y} then : enableval=$enable_rpath; : else $as_nop enable_rpath=yes fi acl_libdirstem=lib acl_libdirstem2= case "$host_os" in solaris*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for 64-bit host" >&5 printf %s "checking for 64-bit host... " >&6; } if test ${gl_cv_solaris_64bit+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef _LP64 sixtyfour bits #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "sixtyfour bits" >/dev/null 2>&1 then : gl_cv_solaris_64bit=yes else $as_nop gl_cv_solaris_64bit=no fi rm -rf conftest* fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_solaris_64bit" >&5 printf "%s\n" "$gl_cv_solaris_64bit" >&6; } if test $gl_cv_solaris_64bit = yes; then acl_libdirstem=lib/64 case "$host_cpu" in sparc*) acl_libdirstem2=lib/sparcv9 ;; i*86 | x86_64) acl_libdirstem2=lib/amd64 ;; esac fi ;; *) searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'` if test -n "$searchpath"; then acl_save_IFS="${IFS= }"; IFS=":" for searchdir in $searchpath; do if test -d "$searchdir"; then case "$searchdir" in */lib64/ | */lib64 ) acl_libdirstem=lib64 ;; */../ | */.. ) # Better ignore directories of this form. They are misleading. ;; *) searchdir=`cd "$searchdir" && pwd` case "$searchdir" in */lib64 ) acl_libdirstem=lib64 ;; esac ;; esac fi done IFS="$acl_save_IFS" fi ;; esac test -n "$acl_libdirstem2" || acl_libdirstem2="$acl_libdirstem" use_additional=yes acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" # Check whether --with-libiconv-prefix was given. if test ${with_libiconv_prefix+y} then : withval=$with_libiconv_prefix; if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" if test "$acl_libdirstem2" != "$acl_libdirstem" \ && ! test -d "$withval/$acl_libdirstem"; then additional_libdir="$withval/$acl_libdirstem2" fi fi fi fi LIBICONV= LTLIBICONV= INCICONV= LIBICONV_PREFIX= HAVE_LIBICONV= rpathdirs= ltrpathdirs= names_already_handled= names_next_round='iconv ' while test -n "$names_next_round"; do names_this_round="$names_next_round" names_next_round= for name in $names_this_round; do already_handled= for n in $names_already_handled; do if test "$n" = "$name"; then already_handled=yes break fi done if test -z "$already_handled"; then names_already_handled="$names_already_handled $name" uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./+-|ABCDEFGHIJKLMNOPQRSTUVWXYZ____|'` eval value=\"\$HAVE_LIB$uppername\" if test -n "$value"; then if test "$value" = yes; then eval value=\"\$LIB$uppername\" test -z "$value" || LIBICONV="${LIBICONV}${LIBICONV:+ }$value" eval value=\"\$LTLIB$uppername\" test -z "$value" || LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$value" else : fi else found_dir= found_la= found_so= found_a= eval libname=\"$acl_libname_spec\" # typically: libname=lib$name if test -n "$acl_shlibext"; then shrext=".$acl_shlibext" # typically: shrext=.so else shrext= fi if test $use_additional = yes; then dir="$additional_libdir" if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi fi if test "X$found_dir" = "X"; then for x in $LDFLAGS $LTLIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" case "$x" in -L*) dir=`echo "X$x" | sed -e 's/^X-L//'` if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi ;; esac if test "X$found_dir" != "X"; then break fi done fi if test "X$found_dir" != "X"; then LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$found_dir -l$name" if test "X$found_so" != "X"; then if test "$enable_rpath" = no \ || test "X$found_dir" = "X/usr/$acl_libdirstem" \ || test "X$found_dir" = "X/usr/$acl_libdirstem2"; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" else haveit= for x in $ltrpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $found_dir" fi if test "$acl_hardcode_direct" = yes; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" else if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" haveit= for x in $rpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $found_dir" fi else haveit= for x in $LDFLAGS $LIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir" fi if test "$acl_hardcode_minus_L" != no; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" else LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name" fi fi fi fi else if test "X$found_a" != "X"; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_a" else LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir -l$name" fi fi additional_includedir= case "$found_dir" in */$acl_libdirstem | */$acl_libdirstem/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` if test "$name" = 'iconv'; then LIBICONV_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; */$acl_libdirstem2 | */$acl_libdirstem2/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'` if test "$name" = 'iconv'; then LIBICONV_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; esac if test "X$additional_includedir" != "X"; then if test "X$additional_includedir" != "X/usr/include"; then haveit= if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then for x in $CPPFLAGS $INCICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_includedir"; then INCICONV="${INCICONV}${INCICONV:+ }-I$additional_includedir" fi fi fi fi fi if test -n "$found_la"; then save_libdir="$libdir" case "$found_la" in */* | *\\*) . "$found_la" ;; *) . "./$found_la" ;; esac libdir="$save_libdir" for dep in $dependency_libs; do case "$dep" in -L*) additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` if test "X$additional_libdir" != "X/usr/$acl_libdirstem" \ && test "X$additional_libdir" != "X/usr/$acl_libdirstem2"; then haveit= if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem" \ || test "X$additional_libdir" = "X/usr/local/$acl_libdirstem2"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then haveit= for x in $LDFLAGS $LIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LIBICONV="${LIBICONV}${LIBICONV:+ }-L$additional_libdir" fi fi haveit= for x in $LDFLAGS $LTLIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$additional_libdir" fi fi fi fi ;; -R*) dir=`echo "X$dep" | sed -e 's/^X-R//'` if test "$enable_rpath" != no; then haveit= for x in $rpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $dir" fi haveit= for x in $ltrpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $dir" fi fi ;; -l*) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` ;; *.la) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` ;; *) LIBICONV="${LIBICONV}${LIBICONV:+ }$dep" LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$dep" ;; esac done fi else LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name" LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-l$name" fi fi fi done done if test "X$rpathdirs" != "X"; then if test -n "$acl_hardcode_libdir_separator"; then alldirs= for found_dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir" done acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBICONV="${LIBICONV}${LIBICONV:+ }$flag" else for found_dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$found_dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBICONV="${LIBICONV}${LIBICONV:+ }$flag" done fi fi if test "X$ltrpathdirs" != "X"; then for found_dir in $ltrpathdirs; do LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-R$found_dir" done fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for CFPreferencesCopyAppValue" >&5 printf %s "checking for CFPreferencesCopyAppValue... " >&6; } if test ${gt_cv_func_CFPreferencesCopyAppValue+y} then : printf %s "(cached) " >&6 else $as_nop gt_save_LIBS="$LIBS" LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { CFPreferencesCopyAppValue(NULL, NULL) ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : gt_cv_func_CFPreferencesCopyAppValue=yes else $as_nop gt_cv_func_CFPreferencesCopyAppValue=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS="$gt_save_LIBS" fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_CFPreferencesCopyAppValue" >&5 printf "%s\n" "$gt_cv_func_CFPreferencesCopyAppValue" >&6; } if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then printf "%s\n" "#define HAVE_CFPREFERENCESCOPYAPPVALUE 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for CFLocaleCopyCurrent" >&5 printf %s "checking for CFLocaleCopyCurrent... " >&6; } if test ${gt_cv_func_CFLocaleCopyCurrent+y} then : printf %s "(cached) " >&6 else $as_nop gt_save_LIBS="$LIBS" LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { CFLocaleCopyCurrent(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : gt_cv_func_CFLocaleCopyCurrent=yes else $as_nop gt_cv_func_CFLocaleCopyCurrent=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS="$gt_save_LIBS" fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_CFLocaleCopyCurrent" >&5 printf "%s\n" "$gt_cv_func_CFLocaleCopyCurrent" >&6; } if test $gt_cv_func_CFLocaleCopyCurrent = yes; then printf "%s\n" "#define HAVE_CFLOCALECOPYCURRENT 1" >>confdefs.h fi INTL_MACOSX_LIBS= if test $gt_cv_func_CFPreferencesCopyAppValue = yes || test $gt_cv_func_CFLocaleCopyCurrent = yes; then INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation" fi LIBINTL= LTLIBINTL= POSUB= case " $gt_needs " in *" need-formatstring-macros "*) gt_api_version=3 ;; *" need-ngettext "*) gt_api_version=2 ;; *) gt_api_version=1 ;; esac gt_func_gnugettext_libc="gt_cv_func_gnugettext${gt_api_version}_libc" gt_func_gnugettext_libintl="gt_cv_func_gnugettext${gt_api_version}_libintl" if test "$USE_NLS" = "yes"; then gt_use_preinstalled_gnugettext=no if test $gt_api_version -ge 3; then gt_revision_test_code=' #ifndef __GNU_GETTEXT_SUPPORTED_REVISION #define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) #endif typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; ' else gt_revision_test_code= fi if test $gt_api_version -ge 2; then gt_expression_test_code=' + * ngettext ("", "", 0)' else gt_expression_test_code= fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU gettext in libc" >&5 printf %s "checking for GNU gettext in libc... " >&6; } if eval test \${$gt_func_gnugettext_libc+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include $gt_revision_test_code extern int _nl_msg_cat_cntr; extern int *_nl_domain_bindings; int main (void) { bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_domain_bindings ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : eval "$gt_func_gnugettext_libc=yes" else $as_nop eval "$gt_func_gnugettext_libc=no" fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$gt_func_gnugettext_libc { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then am_save_CPPFLAGS="$CPPFLAGS" for element in $INCICONV; do haveit= for x in $CPPFLAGS; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X$element"; then haveit=yes break fi done if test -z "$haveit"; then CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element" fi done { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for iconv" >&5 printf %s "checking for iconv... " >&6; } if test ${am_cv_func_iconv+y} then : printf %s "(cached) " >&6 else $as_nop am_cv_func_iconv="no, consider installing GNU libiconv" am_cv_lib_iconv=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main (void) { iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : am_cv_func_iconv=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext if test "$am_cv_func_iconv" != yes; then am_save_LIBS="$LIBS" LIBS="$LIBS $LIBICONV" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main (void) { iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : am_cv_lib_iconv=yes am_cv_func_iconv=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS="$am_save_LIBS" fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv" >&5 printf "%s\n" "$am_cv_func_iconv" >&6; } if test "$am_cv_func_iconv" = yes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working iconv" >&5 printf %s "checking for working iconv... " >&6; } if test ${am_cv_func_iconv_works+y} then : printf %s "(cached) " >&6 else $as_nop am_save_LIBS="$LIBS" if test $am_cv_lib_iconv = yes; then LIBS="$LIBS $LIBICONV" fi if test "$cross_compiling" = yes then : case "$host_os" in aix* | hpux*) am_cv_func_iconv_works="guessing no" ;; *) am_cv_func_iconv_works="guessing yes" ;; esac else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { int result = 0; /* Test against AIX 5.1 bug: Failures are not distinguishable from successful returns. */ { iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8"); if (cd_utf8_to_88591 != (iconv_t)(-1)) { static const char input[] = "\342\202\254"; /* EURO SIGN */ char buf[10]; const char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_utf8_to_88591, (char **) &inptr, &inbytesleft, &outptr, &outbytesleft); if (res == 0) result |= 1; iconv_close (cd_utf8_to_88591); } } /* Test against Solaris 10 bug: Failures are not distinguishable from successful returns. */ { iconv_t cd_ascii_to_88591 = iconv_open ("ISO8859-1", "646"); if (cd_ascii_to_88591 != (iconv_t)(-1)) { static const char input[] = "\263"; char buf[10]; const char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_ascii_to_88591, (char **) &inptr, &inbytesleft, &outptr, &outbytesleft); if (res == 0) result |= 2; iconv_close (cd_ascii_to_88591); } } /* Test against AIX 6.1..7.1 bug: Buffer overrun. */ { iconv_t cd_88591_to_utf8 = iconv_open ("UTF-8", "ISO-8859-1"); if (cd_88591_to_utf8 != (iconv_t)(-1)) { static const char input[] = "\304"; static char buf[2] = { (char)0xDE, (char)0xAD }; const char *inptr = input; size_t inbytesleft = 1; char *outptr = buf; size_t outbytesleft = 1; size_t res = iconv (cd_88591_to_utf8, (char **) &inptr, &inbytesleft, &outptr, &outbytesleft); if (res != (size_t)(-1) || outptr - buf > 1 || buf[1] != (char)0xAD) result |= 4; iconv_close (cd_88591_to_utf8); } } #if 0 /* This bug could be worked around by the caller. */ /* Test against HP-UX 11.11 bug: Positive return value instead of 0. */ { iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591"); if (cd_88591_to_utf8 != (iconv_t)(-1)) { static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337"; char buf[50]; const char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_88591_to_utf8, (char **) &inptr, &inbytesleft, &outptr, &outbytesleft); if ((int)res > 0) result |= 8; iconv_close (cd_88591_to_utf8); } } #endif /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is provided. */ if (/* Try standardized names. */ iconv_open ("UTF-8", "EUC-JP") == (iconv_t)(-1) /* Try IRIX, OSF/1 names. */ && iconv_open ("UTF-8", "eucJP") == (iconv_t)(-1) /* Try AIX names. */ && iconv_open ("UTF-8", "IBM-eucJP") == (iconv_t)(-1) /* Try HP-UX names. */ && iconv_open ("utf8", "eucJP") == (iconv_t)(-1)) result |= 16; return result; } _ACEOF if ac_fn_c_try_run "$LINENO" then : am_cv_func_iconv_works=yes else $as_nop am_cv_func_iconv_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi LIBS="$am_save_LIBS" fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv_works" >&5 printf "%s\n" "$am_cv_func_iconv_works" >&6; } case "$am_cv_func_iconv_works" in *no) am_func_iconv=no am_cv_lib_iconv=no ;; *) am_func_iconv=yes ;; esac else am_func_iconv=no am_cv_lib_iconv=no fi if test "$am_func_iconv" = yes; then printf "%s\n" "#define HAVE_ICONV 1" >>confdefs.h fi if test "$am_cv_lib_iconv" = yes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to link with libiconv" >&5 printf %s "checking how to link with libiconv... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LIBICONV" >&5 printf "%s\n" "$LIBICONV" >&6; } else CPPFLAGS="$am_save_CPPFLAGS" LIBICONV= LTLIBICONV= fi use_additional=yes acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" # Check whether --with-libintl-prefix was given. if test ${with_libintl_prefix+y} then : withval=$with_libintl_prefix; if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" if test "$acl_libdirstem2" != "$acl_libdirstem" \ && ! test -d "$withval/$acl_libdirstem"; then additional_libdir="$withval/$acl_libdirstem2" fi fi fi fi LIBINTL= LTLIBINTL= INCINTL= LIBINTL_PREFIX= HAVE_LIBINTL= rpathdirs= ltrpathdirs= names_already_handled= names_next_round='intl ' while test -n "$names_next_round"; do names_this_round="$names_next_round" names_next_round= for name in $names_this_round; do already_handled= for n in $names_already_handled; do if test "$n" = "$name"; then already_handled=yes break fi done if test -z "$already_handled"; then names_already_handled="$names_already_handled $name" uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./+-|ABCDEFGHIJKLMNOPQRSTUVWXYZ____|'` eval value=\"\$HAVE_LIB$uppername\" if test -n "$value"; then if test "$value" = yes; then eval value=\"\$LIB$uppername\" test -z "$value" || LIBINTL="${LIBINTL}${LIBINTL:+ }$value" eval value=\"\$LTLIB$uppername\" test -z "$value" || LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$value" else : fi else found_dir= found_la= found_so= found_a= eval libname=\"$acl_libname_spec\" # typically: libname=lib$name if test -n "$acl_shlibext"; then shrext=".$acl_shlibext" # typically: shrext=.so else shrext= fi if test $use_additional = yes; then dir="$additional_libdir" if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi fi if test "X$found_dir" = "X"; then for x in $LDFLAGS $LTLIBINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" case "$x" in -L*) dir=`echo "X$x" | sed -e 's/^X-L//'` if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi ;; esac if test "X$found_dir" != "X"; then break fi done fi if test "X$found_dir" != "X"; then LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$found_dir -l$name" if test "X$found_so" != "X"; then if test "$enable_rpath" = no \ || test "X$found_dir" = "X/usr/$acl_libdirstem" \ || test "X$found_dir" = "X/usr/$acl_libdirstem2"; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" else haveit= for x in $ltrpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $found_dir" fi if test "$acl_hardcode_direct" = yes; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" else if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" haveit= for x in $rpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $found_dir" fi else haveit= for x in $LDFLAGS $LIBINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir" fi if test "$acl_hardcode_minus_L" != no; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" else LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name" fi fi fi fi else if test "X$found_a" != "X"; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_a" else LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir -l$name" fi fi additional_includedir= case "$found_dir" in */$acl_libdirstem | */$acl_libdirstem/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` if test "$name" = 'intl'; then LIBINTL_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; */$acl_libdirstem2 | */$acl_libdirstem2/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'` if test "$name" = 'intl'; then LIBINTL_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; esac if test "X$additional_includedir" != "X"; then if test "X$additional_includedir" != "X/usr/include"; then haveit= if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then for x in $CPPFLAGS $INCINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_includedir"; then INCINTL="${INCINTL}${INCINTL:+ }-I$additional_includedir" fi fi fi fi fi if test -n "$found_la"; then save_libdir="$libdir" case "$found_la" in */* | *\\*) . "$found_la" ;; *) . "./$found_la" ;; esac libdir="$save_libdir" for dep in $dependency_libs; do case "$dep" in -L*) additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` if test "X$additional_libdir" != "X/usr/$acl_libdirstem" \ && test "X$additional_libdir" != "X/usr/$acl_libdirstem2"; then haveit= if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem" \ || test "X$additional_libdir" = "X/usr/local/$acl_libdirstem2"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then haveit= for x in $LDFLAGS $LIBINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LIBINTL="${LIBINTL}${LIBINTL:+ }-L$additional_libdir" fi fi haveit= for x in $LDFLAGS $LTLIBINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$additional_libdir" fi fi fi fi ;; -R*) dir=`echo "X$dep" | sed -e 's/^X-R//'` if test "$enable_rpath" != no; then haveit= for x in $rpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $dir" fi haveit= for x in $ltrpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $dir" fi fi ;; -l*) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` ;; *.la) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` ;; *) LIBINTL="${LIBINTL}${LIBINTL:+ }$dep" LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$dep" ;; esac done fi else LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name" LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-l$name" fi fi fi done done if test "X$rpathdirs" != "X"; then if test -n "$acl_hardcode_libdir_separator"; then alldirs= for found_dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir" done acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBINTL="${LIBINTL}${LIBINTL:+ }$flag" else for found_dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$found_dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBINTL="${LIBINTL}${LIBINTL:+ }$flag" done fi fi if test "X$ltrpathdirs" != "X"; then for found_dir in $ltrpathdirs; do LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-R$found_dir" done fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU gettext in libintl" >&5 printf %s "checking for GNU gettext in libintl... " >&6; } if eval test \${$gt_func_gnugettext_libintl+y} then : printf %s "(cached) " >&6 else $as_nop gt_save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $INCINTL" gt_save_LIBS="$LIBS" LIBS="$LIBS $LIBINTL" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include $gt_revision_test_code extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias (const char *); int main (void) { bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("") ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : eval "$gt_func_gnugettext_libintl=yes" else $as_nop eval "$gt_func_gnugettext_libintl=no" fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" != yes; } && test -n "$LIBICONV"; then LIBS="$LIBS $LIBICONV" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include $gt_revision_test_code extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias (const char *); int main (void) { bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("") ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : LIBINTL="$LIBINTL $LIBICONV" LTLIBINTL="$LTLIBINTL $LTLIBICONV" eval "$gt_func_gnugettext_libintl=yes" fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext fi CPPFLAGS="$gt_save_CPPFLAGS" LIBS="$gt_save_LIBS" fi eval ac_res=\$$gt_func_gnugettext_libintl { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } fi if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" = "yes"; } \ || { { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; } \ && test "$PACKAGE" != gettext-runtime \ && test "$PACKAGE" != gettext-tools; }; then gt_use_preinstalled_gnugettext=yes else LIBINTL= LTLIBINTL= INCINTL= fi if test -n "$INTL_MACOSX_LIBS"; then if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then LIBINTL="$LIBINTL $INTL_MACOSX_LIBS" LTLIBINTL="$LTLIBINTL $INTL_MACOSX_LIBS" fi fi if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then printf "%s\n" "#define ENABLE_NLS 1" >>confdefs.h else USE_NLS=no fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to use NLS" >&5 printf %s "checking whether to use NLS... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5 printf "%s\n" "$USE_NLS" >&6; } if test "$USE_NLS" = "yes"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking where the gettext function comes from" >&5 printf %s "checking where the gettext function comes from... " >&6; } if test "$gt_use_preinstalled_gnugettext" = "yes"; then if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then gt_source="external libintl" else gt_source="libc" fi else gt_source="included intl directory" fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gt_source" >&5 printf "%s\n" "$gt_source" >&6; } fi if test "$USE_NLS" = "yes"; then if test "$gt_use_preinstalled_gnugettext" = "yes"; then if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to link with libintl" >&5 printf %s "checking how to link with libintl... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LIBINTL" >&5 printf "%s\n" "$LIBINTL" >&6; } for element in $INCINTL; do haveit= for x in $CPPFLAGS; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X$element"; then haveit=yes break fi done if test -z "$haveit"; then CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element" fi done fi printf "%s\n" "#define HAVE_GETTEXT 1" >>confdefs.h printf "%s\n" "#define HAVE_DCGETTEXT 1" >>confdefs.h fi POSUB=po fi INTLLIBS="$LIBINTL" # Check whether --enable-largefile was given. if test ${enable_largefile+y} then : enableval=$enable_largefile; fi if test "$enable_largefile" != no then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5 printf %s "checking for special C compiler options needed for large files... " >&6; } if test ${ac_cv_sys_largefile_CC+y} then : printf %s "(cached) " >&6 else $as_nop ac_cv_sys_largefile_CC=no if test "$GCC" != yes; then ac_save_CC=$CC while :; do # IRIX 6.2 and later do not support large files by default, # so use the C compiler's -n32 option if that helps. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : break fi rm -f core conftest.err conftest.$ac_objext conftest.beam CC="$CC -n32" if ac_fn_c_try_compile "$LINENO" then : ac_cv_sys_largefile_CC=' -n32'; break fi rm -f core conftest.err conftest.$ac_objext conftest.beam break done CC=$ac_save_CC rm -f conftest.$ac_ext fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5 printf "%s\n" "$ac_cv_sys_largefile_CC" >&6; } if test "$ac_cv_sys_largefile_CC" != no; then CC=$CC$ac_cv_sys_largefile_CC fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5 printf %s "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; } if test ${ac_cv_sys_file_offset_bits+y} then : printf %s "(cached) " >&6 else $as_nop while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_sys_file_offset_bits=no; break fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #undef _FILE_OFFSET_BITS #define _FILE_OFFSET_BITS 64 #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_sys_file_offset_bits=64; break fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cv_sys_file_offset_bits=unknown break done fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5 printf "%s\n" "$ac_cv_sys_file_offset_bits" >&6; } case $ac_cv_sys_file_offset_bits in #( no | unknown) ;; *) printf "%s\n" "#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits" >>confdefs.h ;; esac rm -rf conftest* case $ac_cv_sys_file_offset_bits in #( unknown) : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5 printf %s "checking for _LARGE_FILES value needed for large files... " >&6; } if test ${ac_cv_sys_large_files+y} then : printf %s "(cached) " >&6 else $as_nop while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_sys_large_files=no; break fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #undef _LARGE_FILES #define _LARGE_FILES 1 #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_sys_large_files=1; break fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cv_sys_large_files=unknown break done fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5 printf "%s\n" "$ac_cv_sys_large_files" >&6; } case $ac_cv_sys_large_files in #( no | unknown) ;; *) printf "%s\n" "#define _LARGE_FILES $ac_cv_sys_large_files" >>confdefs.h ;; esac rm -rf conftest* ;; #( 64) : # Check whether --enable-year2038 was given. if test ${enable_year2038+y} then : enableval=$enable_year2038; fi if test "$enable_year2038" != no then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for time_t past the year 2038" >&5 printf %s "checking for time_t past the year 2038... " >&6; } if test ${gl_cv_type_time_t_y2038+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* Check that time_t can represent 2**32 - 1 correctly. */ #define LARGE_TIME_T \\ ((time_t) (((time_t) 1 << 30) - 1 + 3 * ((time_t) 1 << 30))) int verify_time_t_range[(LARGE_TIME_T / 65537 == 65535 && LARGE_TIME_T % 65537 == 0) ? 1 : -1]; _ACEOF if ac_fn_c_try_compile "$LINENO" then : gl_cv_type_time_t_y2038=yes else $as_nop gl_cv_type_time_t_y2038=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_type_time_t_y2038" >&5 printf "%s\n" "$gl_cv_type_time_t_y2038" >&6; } if test "$gl_cv_type_time_t_y2038" = no; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for 64-bit time_t with _TIME_BITS=64" >&5 printf %s "checking for 64-bit time_t with _TIME_BITS=64... " >&6; } if test ${gl_cv_type_time_t_bits_macro+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _TIME_BITS 64 #define _FILE_OFFSET_BITS 64 #include /* Check that time_t can represent 2**32 - 1 correctly. */ #define LARGE_TIME_T \\ ((time_t) (((time_t) 1 << 30) - 1 + 3 * ((time_t) 1 << 30))) int verify_time_t_range[(LARGE_TIME_T / 65537 == 65535 && LARGE_TIME_T % 65537 == 0) ? 1 : -1]; _ACEOF if ac_fn_c_try_compile "$LINENO" then : gl_cv_type_time_t_bits_macro=yes else $as_nop gl_cv_type_time_t_bits_macro=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_type_time_t_bits_macro" >&5 printf "%s\n" "$gl_cv_type_time_t_bits_macro" >&6; } if test "$gl_cv_type_time_t_bits_macro" = yes; then printf "%s\n" "#define _TIME_BITS 64" >>confdefs.h printf "%s\n" "#define _FILE_OFFSET_BITS 64" >>confdefs.h gl_cv_type_time_t_y2038=yes fi fi if test $gl_cv_type_time_t_y2038 = no; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef _USE_32BIT_TIME_T int ok; #else error fail #endif _ACEOF if ac_fn_c_try_compile "$LINENO" then : { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The 'time_t' type stops working after January 2038. Remove _USE_32BIT_TIME_T from the compiler flags. See \`config.log' for more details" "$LINENO" 5; } else $as_nop # If not cross-compiling and says we should check, # and 'touch' works with a large timestamp, then evidently wider time_t # is desired and supported, so fail and ask the builder to fix the # problem. Otherwise, just warn the builder. if test "$gl_warned_about_y2038" != yes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: The 'time_t' type stops working after January 2038, and this package needs a wider 'time_t' type if there is any way to access timestamps after that. Configure with 'CC=\"${CC} -m64\"' perhaps?" >&5 printf "%s\n" "$as_me: WARNING: The 'time_t' type stops working after January 2038, and this package needs a wider 'time_t' type if there is any way to access timestamps after that. Configure with 'CC=\"${CC} -m64\"' perhaps?" >&2;} gl_warned_about_y2038=yes fi fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi ;; #( *) : ;; esac fi PLATFORMS_PCI=" $(PYTHONPATH="${srcdir}" $PYTHON -c 'import gentpl; print(" ".join(gentpl.GROUPS["pci"]))') " if test x"${PLATFORMS_PCI##* ${target_cpu}_${platform} *}" = x ; then have_pci=y fi # Identify characteristics of the host architecture. unset ac_cv_c_bigendian if test x"$target_cpu-$platform" = xsparc64-emu ; then CFLAGS="$CFLAGS -m64" HOST_CFLAGS="$HOST_CFLAGS -m64" fi CPPFLAGS="$CPPFLAGS -D_FILE_OFFSET_BITS=64" HOST_CPPFLAGS="$HOST_CPPFLAGS -D_FILE_OFFSET_BITS=64" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 printf %s "checking whether byte ordering is bigendian... " >&6; } if test ${ac_cv_c_bigendian+y} then : printf %s "(cached) " >&6 else $as_nop ac_cv_c_bigendian=unknown # See if we're dealing with a universal compiler. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __APPLE_CC__ not a universal capable compiler #endif typedef int dummy; _ACEOF if ac_fn_c_try_compile "$LINENO" then : # Check for potential -arch flags. It is not universal unless # there are at least two -arch flags with different values. ac_arch= ac_prev= for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do if test -n "$ac_prev"; then case $ac_word in i?86 | x86_64 | ppc | ppc64) if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then ac_arch=$ac_word else ac_cv_c_bigendian=universal break fi ;; esac ac_prev= elif test "x$ac_word" = "x-arch"; then ac_prev=arch fi done fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext if test $ac_cv_c_bigendian = unknown; then # See if sys/param.h defines the BYTE_ORDER macro. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main (void) { #if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ && LITTLE_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : # It does; now see whether it defined to BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main (void) { #if BYTE_ORDER != BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_c_bigendian=yes else $as_nop ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # See if defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { #if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : # It does; now see whether it defined to _BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { #ifndef _BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_c_bigendian=yes else $as_nop ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # Compile a test program. if test "$cross_compiling" = yes then : # Try to guess by grepping values from an object file. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ unsigned short int ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; unsigned short int ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; int use_ascii (int i) { return ascii_mm[i] + ascii_ii[i]; } unsigned short int ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; unsigned short int ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; int use_ebcdic (int i) { return ebcdic_mm[i] + ebcdic_ii[i]; } extern int foo; int main (void) { return use_ascii (foo) == use_ebcdic (foo); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then ac_cv_c_bigendian=yes fi if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then if test "$ac_cv_c_bigendian" = unknown; then ac_cv_c_bigendian=no else # finding both strings is unlikely to happen, but who knows? ac_cv_c_bigendian=unknown fi fi fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main (void) { /* Are we little or big endian? From Harbison&Steele. */ union { long int l; char c[sizeof (long int)]; } u; u.l = 1; return u.c[sizeof (long int) - 1] == 1; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO" then : ac_cv_c_bigendian=no else $as_nop ac_cv_c_bigendian=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 printf "%s\n" "$ac_cv_c_bigendian" >&6; } case $ac_cv_c_bigendian in #( yes) printf "%s\n" "#define WORDS_BIGENDIAN 1" >>confdefs.h ;; #( no) ;; #( universal) printf "%s\n" "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h ;; #( *) as_fn_error $? "unknown endianness presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; esac # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of void *" >&5 printf %s "checking size of void *... " >&6; } if test ${ac_cv_sizeof_void_p+y} then : printf %s "(cached) " >&6 else $as_nop if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void *))" "ac_cv_sizeof_void_p" "$ac_includes_default" then : else $as_nop if test "$ac_cv_type_void_p" = yes; then { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (void *) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_void_p=0 fi fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_void_p" >&5 printf "%s\n" "$ac_cv_sizeof_void_p" >&6; } printf "%s\n" "#define SIZEOF_VOID_P $ac_cv_sizeof_void_p" >>confdefs.h # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of long" >&5 printf %s "checking size of long... " >&6; } if test ${ac_cv_sizeof_long+y} then : printf %s "(cached) " >&6 else $as_nop if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long))" "ac_cv_sizeof_long" "$ac_includes_default" then : else $as_nop if test "$ac_cv_type_long" = yes; then { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (long) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_long=0 fi fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long" >&5 printf "%s\n" "$ac_cv_sizeof_long" >&6; } printf "%s\n" "#define SIZEOF_LONG $ac_cv_sizeof_long" >>confdefs.h case "$host_os" in cygwin | windows* | mingw32*) HOST_CPPFLAGS="$HOST_CPPFLAGS -DUNICODE=1 -D_WIN32_WINNT=0x0500" CPPFLAGS="$CPPFLAGS -DUNICODE=1 -D_WIN32_WINNT=0x0500" # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of TCHAR" >&5 printf %s "checking size of TCHAR... " >&6; } if test ${ac_cv_sizeof_TCHAR+y} then : printf %s "(cached) " >&6 else $as_nop if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (TCHAR))" "ac_cv_sizeof_TCHAR" "#include " then : else $as_nop if test "$ac_cv_type_TCHAR" = yes; then { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (TCHAR) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_TCHAR=0 fi fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_TCHAR" >&5 printf "%s\n" "$ac_cv_sizeof_TCHAR" >&6; } printf "%s\n" "#define SIZEOF_TCHAR $ac_cv_sizeof_TCHAR" >>confdefs.h ;; esac case "$host_os" in cygwin | windows* | mingw32* | aros*) ;; *) # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of off_t" >&5 printf %s "checking size of off_t... " >&6; } if test ${ac_cv_sizeof_off_t+y} then : printf %s "(cached) " >&6 else $as_nop if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (off_t))" "ac_cv_sizeof_off_t" "$ac_includes_default" then : else $as_nop if test "$ac_cv_type_off_t" = yes; then { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (off_t) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_off_t=0 fi fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_off_t" >&5 printf "%s\n" "$ac_cv_sizeof_off_t" >&6; } printf "%s\n" "#define SIZEOF_OFF_T $ac_cv_sizeof_off_t" >>confdefs.h if test x"$ac_cv_sizeof_off_t" != x8 ; then # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of off64_t" >&5 printf %s "checking size of off64_t... " >&6; } if test ${ac_cv_sizeof_off64_t+y} then : printf %s "(cached) " >&6 else $as_nop if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (off64_t))" "ac_cv_sizeof_off64_t" "$ac_includes_default" then : else $as_nop if test "$ac_cv_type_off64_t" = yes; then { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (off64_t) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_off64_t=0 fi fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_off64_t" >&5 printf "%s\n" "$ac_cv_sizeof_off64_t" >&6; } printf "%s\n" "#define SIZEOF_OFF64_T $ac_cv_sizeof_off64_t" >>confdefs.h test x"$ac_cv_sizeof_off64_t" = x8 || as_fn_error $? "Large file support is required" "$LINENO" 5 fi;; esac if test x$USE_NLS = xno; then HOST_CFLAGS="$HOST_CFLAGS -fno-builtin-gettext" fi if test "x$cross_compiling" = xyes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cannot generate manual pages while cross compiling" >&5 printf "%s\n" "$as_me: WARNING: cannot generate manual pages while cross compiling" >&2;} else # Extract the first word of "help2man", so it can be a program name with args. set dummy help2man; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_path_HELP2MAN+y} then : printf %s "(cached) " >&6 else $as_nop case $HELP2MAN in [\\/]* | ?:[\\/]*) ac_cv_path_HELP2MAN="$HELP2MAN" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_path_HELP2MAN="$as_dir$ac_word$ac_exec_ext" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi HELP2MAN=$ac_cv_path_HELP2MAN if test -n "$HELP2MAN"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $HELP2MAN" >&5 printf "%s\n" "$HELP2MAN" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi # Check for functions and headers. ac_fn_c_check_func "$LINENO" "posix_memalign" "ac_cv_func_posix_memalign" if test "x$ac_cv_func_posix_memalign" = xyes then : printf "%s\n" "#define HAVE_POSIX_MEMALIGN 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "memalign" "ac_cv_func_memalign" if test "x$ac_cv_func_memalign" = xyes then : printf "%s\n" "#define HAVE_MEMALIGN 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "getextmntent" "ac_cv_func_getextmntent" if test "x$ac_cv_func_getextmntent" = xyes then : printf "%s\n" "#define HAVE_GETEXTMNTENT 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "atexit" "ac_cv_func_atexit" if test "x$ac_cv_func_atexit" = xyes then : printf "%s\n" "#define HAVE_ATEXIT 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "sys/param.h" "ac_cv_header_sys_param_h" "$ac_includes_default" if test "x$ac_cv_header_sys_param_h" = xyes then : printf "%s\n" "#define HAVE_SYS_PARAM_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "sys/mount.h" "ac_cv_header_sys_mount_h" "$ac_includes_default" if test "x$ac_cv_header_sys_mount_h" = xyes then : printf "%s\n" "#define HAVE_SYS_MOUNT_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "sys/mnttab.h" "ac_cv_header_sys_mnttab_h" "$ac_includes_default" if test "x$ac_cv_header_sys_mnttab_h" = xyes then : printf "%s\n" "#define HAVE_SYS_MNTTAB_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "limits.h" "ac_cv_header_limits_h" "$ac_includes_default" if test "x$ac_cv_header_limits_h" = xyes then : printf "%s\n" "#define HAVE_LIMITS_H 1" >>confdefs.h fi # glibc 2.25 still includes sys/sysmacros.h in sys/types.h but emits deprecation # warning which causes compilation failure later with -Werror. So use -Werror here # as well to force proper sys/sysmacros.h detection. Used in include/grub/osdep/major.h. SAVED_CFLAGS="$CFLAGS" CFLAGS="$HOST_CFLAGS -Werror" ac_fn_c_check_header_compile "$LINENO" "sys/mkdev.h" "ac_cv_header_sys_mkdev_h" "$ac_includes_default" if test "x$ac_cv_header_sys_mkdev_h" = xyes then : printf "%s\n" "#define MAJOR_IN_MKDEV 1" >>confdefs.h fi if test $ac_cv_header_sys_mkdev_h = no; then ac_fn_c_check_header_compile "$LINENO" "sys/sysmacros.h" "ac_cv_header_sys_sysmacros_h" "$ac_includes_default" if test "x$ac_cv_header_sys_sysmacros_h" = xyes then : printf "%s\n" "#define MAJOR_IN_SYSMACROS 1" >>confdefs.h fi fi CFLAGS="$SAVED_CFLAGS" ac_fn_c_check_member "$LINENO" "struct statfs" "f_fstypename" "ac_cv_member_struct_statfs_f_fstypename" "$ac_includes_default #include #include " if test "x$ac_cv_member_struct_statfs_f_fstypename" = xyes then : printf "%s\n" "#define HAVE_STRUCT_STATFS_F_FSTYPENAME 1" >>confdefs.h fi ac_fn_c_check_member "$LINENO" "struct statfs" "f_mntfromname" "ac_cv_member_struct_statfs_f_mntfromname" "$ac_includes_default #include #include " if test "x$ac_cv_member_struct_statfs_f_mntfromname" = xyes then : printf "%s\n" "#define HAVE_STRUCT_STATFS_F_MNTFROMNAME 1" >>confdefs.h fi # For opendisk() and getrawpartition() on NetBSD. # Used in util/deviceiter.c and in util/hostdisk.c. ac_fn_c_check_header_compile "$LINENO" "util.h" "ac_cv_header_util_h" "$ac_includes_default" if test "x$ac_cv_header_util_h" = xyes then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for opendisk in -lutil" >&5 printf %s "checking for opendisk in -lutil... " >&6; } if test ${ac_cv_lib_util_opendisk+y} then : printf %s "(cached) " >&6 else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-lutil $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ char opendisk (); int main (void) { return opendisk (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_util_opendisk=yes else $as_nop ac_cv_lib_util_opendisk=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_util_opendisk" >&5 printf "%s\n" "$ac_cv_lib_util_opendisk" >&6; } if test "x$ac_cv_lib_util_opendisk" = xyes then : LIBUTIL="-lutil" printf "%s\n" "#define HAVE_OPENDISK 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for getrawpartition in -lutil" >&5 printf %s "checking for getrawpartition in -lutil... " >&6; } if test ${ac_cv_lib_util_getrawpartition+y} then : printf %s "(cached) " >&6 else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-lutil $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ char getrawpartition (); int main (void) { return getrawpartition (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_util_getrawpartition=yes else $as_nop ac_cv_lib_util_getrawpartition=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_util_getrawpartition" >&5 printf "%s\n" "$ac_cv_lib_util_getrawpartition" >&6; } if test "x$ac_cv_lib_util_getrawpartition" = xyes then : LIBUTIL="-lutil" printf "%s\n" "#define HAVE_GETRAWPARTITION 1" >>confdefs.h fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether -Wtrampolines work" >&5 printf %s "checking whether -Wtrampolines work... " >&6; } if test ${grub_cv_host_cc_wtrampolines+y} then : printf %s "(cached) " >&6 else $as_nop SAVED_CFLAGS="$CFLAGS" CFLAGS="$HOST_CFLAGS -Wtrampolines -Werror" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int va_arg_func (int fixed, va_list args); int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : grub_cv_host_cc_wtrampolines=yes else $as_nop grub_cv_host_cc_wtrampolines=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext CFLAGS="$SAVED_CFLAGS" fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $grub_cv_host_cc_wtrampolines" >&5 printf "%s\n" "$grub_cv_host_cc_wtrampolines" >&6; } if test x"$grub_host_cv_cc_wtrampolines" = xyes ; then HOST_CFLAGS="$HOST_CFLAGS -Wtrampolines" fi # # Check for host and build compilers. # HOST_CC=$CC for ac_prog in gcc egcs cc do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_BUILD_CC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$BUILD_CC"; then ac_cv_prog_BUILD_CC="$BUILD_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_BUILD_CC="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi BUILD_CC=$ac_cv_prog_BUILD_CC if test -n "$BUILD_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $BUILD_CC" >&5 printf "%s\n" "$BUILD_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$BUILD_CC" && break done test -z "$BUILD_CC" && as_fn_error $? "none of gcc, egcs and cc is found. set BUILD_CC manually." "$LINENO" 5 BUILD_CPP="$BUILD_CC -E" case "$build_os" in haiku*) BUILD_LIBM= ;; *) BUILD_LIBM=-lm ;; esac case "$build_os" in cygwin*|mingw32*|mingw64*) BUILD_EXEEXT=.exe ;; *) BUILD_EXEEXT= ;; esac # In some build environments like termux /bin/sh is not a valid # shebang. Use $SHELL instead if it's executable and /bin/sh isn't BUILD_SHEBANG=/bin/sh for she in /bin/sh "$SHELL"; do if test -x "$she" ; then BUILD_SHEBANG="$she" fi done # For gnulib. # Check whether --enable-cross-guesses was given. if test ${enable_cross_guesses+y} then : enableval=$enable_cross_guesses; if test "x$enableval" != xconservative && test "x$enableval" != xrisky; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: invalid argument supplied to --enable-cross-guesses" >&5 printf "%s\n" "$as_me: WARNING: invalid argument supplied to --enable-cross-guesses" >&2;} enableval=conservative fi gl_cross_guesses="$enableval" else $as_nop gl_cross_guesses=conservative fi if test $gl_cross_guesses = risky; then gl_cross_guess_normal="guessing yes" gl_cross_guess_inverted="guessing no" else gl_cross_guess_normal="guessing no" gl_cross_guess_inverted="guessing yes" fi LIBC_FATAL_STDERR_=1 export LIBC_FATAL_STDERR_ ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" if test "x$ac_cv_type_size_t" = xyes then : else $as_nop printf "%s\n" "#define size_t unsigned int" >>confdefs.h fi # The Ultrix 4.2 mips builtin alloca declared by alloca.h only works # for constant arguments. Useless! { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working alloca.h" >&5 printf %s "checking for working alloca.h... " >&6; } if test ${ac_cv_working_alloca_h+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { char *p = (char *) alloca (2 * sizeof (int)); if (p) return 0; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_working_alloca_h=yes else $as_nop ac_cv_working_alloca_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_working_alloca_h" >&5 printf "%s\n" "$ac_cv_working_alloca_h" >&6; } if test $ac_cv_working_alloca_h = yes; then printf "%s\n" "#define HAVE_ALLOCA_H 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for alloca" >&5 printf %s "checking for alloca... " >&6; } if test ${ac_cv_func_alloca_works+y} then : printf %s "(cached) " >&6 else $as_nop if test $ac_cv_working_alloca_h = yes; then ac_cv_func_alloca_works=yes else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #ifndef alloca # ifdef __GNUC__ # define alloca __builtin_alloca # elif defined _MSC_VER # include # define alloca _alloca # else # ifdef __cplusplus extern "C" # endif void *alloca (size_t); # endif #endif int main (void) { char *p = (char *) alloca (1); if (p) return 0; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_func_alloca_works=yes else $as_nop ac_cv_func_alloca_works=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_alloca_works" >&5 printf "%s\n" "$ac_cv_func_alloca_works" >&6; } fi if test $ac_cv_func_alloca_works = yes; then printf "%s\n" "#define HAVE_ALLOCA 1" >>confdefs.h else # The SVR3 libPW and SVR4 libucb both contain incompatible functions # that cause trouble. Some versions do not even contain alloca or # contain a buggy version. If you still want to use their alloca, # use ar to extract alloca.o from them instead of compiling alloca.c. ALLOCA=\${LIBOBJDIR}alloca.$ac_objext printf "%s\n" "#define C_ALLOCA 1" >>confdefs.h { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking stack direction for C alloca" >&5 printf %s "checking stack direction for C alloca... " >&6; } if test ${ac_cv_c_stack_direction+y} then : printf %s "(cached) " >&6 else $as_nop if test "$cross_compiling" = yes then : ac_cv_c_stack_direction=0 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int find_stack_direction (int *addr, int depth) { int dir, dummy = 0; if (! addr) addr = &dummy; *addr = addr < &dummy ? 1 : addr == &dummy ? 0 : -1; dir = depth ? find_stack_direction (addr, depth - 1) : 0; return dir + dummy; } int main (int argc, char **argv) { return find_stack_direction (0, argc + !argv + 20) < 0; } _ACEOF if ac_fn_c_try_run "$LINENO" then : ac_cv_c_stack_direction=1 else $as_nop ac_cv_c_stack_direction=-1 fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_stack_direction" >&5 printf "%s\n" "$ac_cv_c_stack_direction" >&6; } printf "%s\n" "#define STACK_DIRECTION $ac_cv_c_stack_direction" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 printf %s "checking for inline... " >&6; } if test ${ac_cv_c_inline+y} then : printf %s "(cached) " >&6 else $as_nop ac_cv_c_inline=no for ac_kw in inline __inline__ __inline; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __cplusplus typedef int foo_t; static $ac_kw foo_t static_foo (void) {return 0; } $ac_kw foo_t foo (void) {return 0; } #endif _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_c_inline=$ac_kw fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext test "$ac_cv_c_inline" != no && break done fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 printf "%s\n" "$ac_cv_c_inline" >&6; } case $ac_cv_c_inline in inline | yes) ;; *) case $ac_cv_c_inline in no) ac_val=;; *) ac_val=$ac_cv_c_inline;; esac cat >>confdefs.h <<_ACEOF #ifndef __cplusplus #define inline $ac_val #endif _ACEOF ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C/C++ restrict keyword" >&5 printf %s "checking for C/C++ restrict keyword... " >&6; } if test ${ac_cv_c_restrict+y} then : printf %s "(cached) " >&6 else $as_nop ac_cv_c_restrict=no # Put '__restrict__' first, to avoid problems with glibc and non-GCC; see: # https://lists.gnu.org/archive/html/bug-autoconf/2016-02/msg00006.html # Put 'restrict' last, because C++ lacks it. for ac_kw in __restrict__ __restrict _Restrict restrict; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ typedef int *int_ptr; int foo (int_ptr $ac_kw ip) { return ip[0]; } int bar (int [$ac_kw]); /* Catch GCC bug 14050. */ int bar (int ip[$ac_kw]) { return ip[0]; } int main (void) { int s[1]; int *$ac_kw t = s; t[0] = 0; return foo (t) + bar (t); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_c_restrict=$ac_kw fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext test "$ac_cv_c_restrict" != no && break done fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_restrict" >&5 printf "%s\n" "$ac_cv_c_restrict" >&6; } case $ac_cv_c_restrict in restrict) ;; no) printf "%s\n" "#define restrict /**/" >>confdefs.h ;; *) printf "%s\n" "#define restrict $ac_cv_c_restrict" >>confdefs.h ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC options needed to detect all undeclared functions" >&5 printf %s "checking for $CC options needed to detect all undeclared functions... " >&6; } if test ${ac_cv_c_undeclared_builtin_options+y} then : printf %s "(cached) " >&6 else $as_nop ac_save_CFLAGS=$CFLAGS ac_cv_c_undeclared_builtin_options='cannot detect' for ac_arg in '' -fno-builtin; do CFLAGS="$ac_save_CFLAGS $ac_arg" # This test program should *not* compile successfully. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { (void) strchr; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : else $as_nop # This test program should compile successfully. # No library function is consistently available on # freestanding implementations, so test against a dummy # declaration. Include always-available headers on the # off chance that they somehow elicit warnings. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include extern void ac_decl (int, char *); int main (void) { (void) ac_decl (0, (char *) 0); (void) ac_decl; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : if test x"$ac_arg" = x then : ac_cv_c_undeclared_builtin_options='none needed' else $as_nop ac_cv_c_undeclared_builtin_options=$ac_arg fi break fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext done CFLAGS=$ac_save_CFLAGS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_undeclared_builtin_options" >&5 printf "%s\n" "$ac_cv_c_undeclared_builtin_options" >&6; } case $ac_cv_c_undeclared_builtin_options in #( 'cannot detect') : { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot make $CC report undeclared builtins See \`config.log' for more details" "$LINENO" 5; } ;; #( 'none needed') : ac_c_undeclared_builtin_options='' ;; #( *) : ac_c_undeclared_builtin_options=$ac_cv_c_undeclared_builtin_options ;; esac ac_fn_check_decl "$LINENO" "clearerr_unlocked" "ac_cv_have_decl_clearerr_unlocked" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_clearerr_unlocked" = xyes then : ac_have_decl=1 else $as_nop ac_have_decl=0 fi printf "%s\n" "#define HAVE_DECL_CLEARERR_UNLOCKED $ac_have_decl" >>confdefs.h ac_fn_check_decl "$LINENO" "feof_unlocked" "ac_cv_have_decl_feof_unlocked" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_feof_unlocked" = xyes then : ac_have_decl=1 else $as_nop ac_have_decl=0 fi printf "%s\n" "#define HAVE_DECL_FEOF_UNLOCKED $ac_have_decl" >>confdefs.h ac_fn_check_decl "$LINENO" "ferror_unlocked" "ac_cv_have_decl_ferror_unlocked" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_ferror_unlocked" = xyes then : ac_have_decl=1 else $as_nop ac_have_decl=0 fi printf "%s\n" "#define HAVE_DECL_FERROR_UNLOCKED $ac_have_decl" >>confdefs.h ac_fn_check_decl "$LINENO" "fflush_unlocked" "ac_cv_have_decl_fflush_unlocked" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_fflush_unlocked" = xyes then : ac_have_decl=1 else $as_nop ac_have_decl=0 fi printf "%s\n" "#define HAVE_DECL_FFLUSH_UNLOCKED $ac_have_decl" >>confdefs.h ac_fn_check_decl "$LINENO" "fgets_unlocked" "ac_cv_have_decl_fgets_unlocked" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_fgets_unlocked" = xyes then : ac_have_decl=1 else $as_nop ac_have_decl=0 fi printf "%s\n" "#define HAVE_DECL_FGETS_UNLOCKED $ac_have_decl" >>confdefs.h ac_fn_check_decl "$LINENO" "fputc_unlocked" "ac_cv_have_decl_fputc_unlocked" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_fputc_unlocked" = xyes then : ac_have_decl=1 else $as_nop ac_have_decl=0 fi printf "%s\n" "#define HAVE_DECL_FPUTC_UNLOCKED $ac_have_decl" >>confdefs.h ac_fn_check_decl "$LINENO" "fputs_unlocked" "ac_cv_have_decl_fputs_unlocked" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_fputs_unlocked" = xyes then : ac_have_decl=1 else $as_nop ac_have_decl=0 fi printf "%s\n" "#define HAVE_DECL_FPUTS_UNLOCKED $ac_have_decl" >>confdefs.h ac_fn_check_decl "$LINENO" "fread_unlocked" "ac_cv_have_decl_fread_unlocked" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_fread_unlocked" = xyes then : ac_have_decl=1 else $as_nop ac_have_decl=0 fi printf "%s\n" "#define HAVE_DECL_FREAD_UNLOCKED $ac_have_decl" >>confdefs.h ac_fn_check_decl "$LINENO" "fwrite_unlocked" "ac_cv_have_decl_fwrite_unlocked" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_fwrite_unlocked" = xyes then : ac_have_decl=1 else $as_nop ac_have_decl=0 fi printf "%s\n" "#define HAVE_DECL_FWRITE_UNLOCKED $ac_have_decl" >>confdefs.h ac_fn_check_decl "$LINENO" "getc_unlocked" "ac_cv_have_decl_getc_unlocked" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_getc_unlocked" = xyes then : ac_have_decl=1 else $as_nop ac_have_decl=0 fi printf "%s\n" "#define HAVE_DECL_GETC_UNLOCKED $ac_have_decl" >>confdefs.h ac_fn_check_decl "$LINENO" "getchar_unlocked" "ac_cv_have_decl_getchar_unlocked" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_getchar_unlocked" = xyes then : ac_have_decl=1 else $as_nop ac_have_decl=0 fi printf "%s\n" "#define HAVE_DECL_GETCHAR_UNLOCKED $ac_have_decl" >>confdefs.h ac_fn_check_decl "$LINENO" "putc_unlocked" "ac_cv_have_decl_putc_unlocked" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_putc_unlocked" = xyes then : ac_have_decl=1 else $as_nop ac_have_decl=0 fi printf "%s\n" "#define HAVE_DECL_PUTC_UNLOCKED $ac_have_decl" >>confdefs.h ac_fn_check_decl "$LINENO" "putchar_unlocked" "ac_cv_have_decl_putchar_unlocked" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_putchar_unlocked" = xyes then : ac_have_decl=1 else $as_nop ac_have_decl=0 fi printf "%s\n" "#define HAVE_DECL_PUTCHAR_UNLOCKED $ac_have_decl" >>confdefs.h ac_func= for ac_item in $ac_func_c_list do if test $ac_func; then ac_fn_c_check_func "$LINENO" $ac_func ac_cv_func_$ac_func if eval test \"x\$ac_cv_func_$ac_func\" = xyes; then echo "#define $ac_item 1" >> confdefs.h fi ac_func= else ac_func=$ac_item fi done ac_fn_check_decl "$LINENO" "strerror_r" "ac_cv_have_decl_strerror_r" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_strerror_r" = xyes then : ac_have_decl=1 else $as_nop ac_have_decl=0 fi printf "%s\n" "#define HAVE_DECL_STRERROR_R $ac_have_decl" >>confdefs.h if test $ac_cv_have_decl_strerror_r = yes; then # For backward compatibility's sake, define HAVE_STRERROR_R. # (We used to run AC_CHECK_FUNCS_ONCE for strerror_r, as well # as AC_CHECK_DECLS_ONCE.) printf "%s\n" "#define HAVE_STRERROR_R 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether strerror_r returns char *" >&5 printf %s "checking whether strerror_r returns char *... " >&6; } if test ${ac_cv_func_strerror_r_char_p+y} then : printf %s "(cached) " >&6 else $as_nop ac_cv_func_strerror_r_char_p=no if test $ac_cv_have_decl_strerror_r = yes; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { char buf[100]; char x = *strerror_r (0, buf, sizeof buf); char *p = strerror_r (0, buf, sizeof buf); return !p || x; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_func_strerror_r_char_p=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_strerror_r_char_p" >&5 printf "%s\n" "$ac_cv_func_strerror_r_char_p" >&6; } if test $ac_cv_func_strerror_r_char_p = yes; then printf "%s\n" "#define STRERROR_R_CHAR_P 1" >>confdefs.h fi XGETTEXT_EXTRA_OPTIONS= HAVE_BTOWC=1; HAVE_MBSINIT=1; HAVE_MBRTOWC=1; HAVE_MBRLEN=1; HAVE_MBSRTOWCS=1; HAVE_MBSNRTOWCS=1; HAVE_WCRTOMB=1; HAVE_WCSRTOMBS=1; HAVE_WCSNRTOMBS=1; HAVE_WMEMCHR=1; HAVE_WMEMCMP=1; HAVE_WMEMCPY=1; HAVE_WMEMMOVE=1; HAVE_WMEMPCPY=1; HAVE_WMEMSET=1; HAVE_WCSLEN=1; HAVE_WCSNLEN=1; HAVE_WCSCPY=1; HAVE_WCPCPY=1; HAVE_WCSNCPY=1; HAVE_WCPNCPY=1; HAVE_WCSCAT=1; HAVE_WCSNCAT=1; HAVE_WCSCMP=1; HAVE_WCSNCMP=1; HAVE_WCSCASECMP=1; HAVE_WCSNCASECMP=1; HAVE_WCSCOLL=1; HAVE_WCSXFRM=1; HAVE_WCSDUP=1; HAVE_WCSCHR=1; HAVE_WCSRCHR=1; HAVE_WCSCSPN=1; HAVE_WCSSPN=1; HAVE_WCSPBRK=1; HAVE_WCSSTR=1; HAVE_WCSTOK=1; HAVE_WCSWIDTH=1; HAVE_WCSFTIME=1; HAVE_DECL_WCTOB=1; HAVE_DECL_WCSDUP=1; HAVE_DECL_WCWIDTH=1; REPLACE_MBSTATE_T=0; REPLACE_BTOWC=0; REPLACE_WCTOB=0; REPLACE_MBSINIT=0; REPLACE_MBRTOWC=0; REPLACE_MBRLEN=0; REPLACE_MBSRTOWCS=0; REPLACE_MBSNRTOWCS=0; REPLACE_WCRTOMB=0; REPLACE_WCSRTOMBS=0; REPLACE_WCSNRTOMBS=0; REPLACE_WCWIDTH=0; REPLACE_WCSWIDTH=0; REPLACE_WCSFTIME=0; REPLACE_WCSTOK=0; { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether uses 'inline' correctly" >&5 printf %s "checking whether uses 'inline' correctly... " >&6; } if test ${gl_cv_header_wchar_h_correct_inline+y} then : printf %s "(cached) " >&6 else $as_nop gl_cv_header_wchar_h_correct_inline=yes case "$host_os" in *-gnu* | gnu*) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define wcstod renamed_wcstod #include extern int zero (void); int main () { return zero(); } _ACEOF save_ac_compile="$ac_compile" ac_compile=`echo "$save_ac_compile" | sed s/conftest/conftest1/` if echo '#include "conftest.c"' >conftest1.c \ && { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define wcstod renamed_wcstod #include int zero (void) { return 0; } _ACEOF ac_compile=`echo "$save_ac_compile" | sed s/conftest/conftest2/` if echo '#include "conftest.c"' >conftest2.c \ && { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then if $CC -o conftest$ac_exeext $CFLAGS $LDFLAGS conftest1.$ac_objext conftest2.$ac_objext $LIBS >&5 2>&1; then : else gl_cv_header_wchar_h_correct_inline=no fi fi fi ac_compile="$save_ac_compile" rm -f conftest12.c conftest12.$ac_objext conftest$ac_exeext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_wchar_h_correct_inline" >&5 printf "%s\n" "$gl_cv_header_wchar_h_correct_inline" >&6; } if test $gl_cv_header_wchar_h_correct_inline = no; then as_fn_error $? " cannot be used with this compiler ($CC $CFLAGS $CPPFLAGS). This is a known interoperability problem of glibc <= 2.5 with gcc >= 4.3 in C99 mode. You have four options: - Add the flag -fgnu89-inline to CC and reconfigure, or - Fix your include files, using parts of , or - Use a gcc version older than 4.3, or - Don't use the flags -std=c99 or -std=gnu99. Configuration aborted." "$LINENO" 5 fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for nl_langinfo and CODESET" >&5 printf %s "checking for nl_langinfo and CODESET... " >&6; } if test ${am_cv_langinfo_codeset+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { char* cs = nl_langinfo(CODESET); return !cs; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : am_cv_langinfo_codeset=yes else $as_nop am_cv_langinfo_codeset=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_langinfo_codeset" >&5 printf "%s\n" "$am_cv_langinfo_codeset" >&6; } if test $am_cv_langinfo_codeset = yes; then printf "%s\n" "#define HAVE_LANGINFO_CODESET 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a traditional french locale" >&5 printf %s "checking for a traditional french locale... " >&6; } if test ${gt_cv_locale_fr+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if HAVE_LANGINFO_CODESET # include #endif #include #include struct tm t; char buf[16]; int main () { /* On BeOS and Haiku, locales are not implemented in libc. Rather, libintl imitates locale dependent behaviour by looking at the environment variables, and all locales use the UTF-8 encoding. */ #if defined __BEOS__ || defined __HAIKU__ return 1; #else /* Check whether the given locale name is recognized by the system. */ # if defined _WIN32 && !defined __CYGWIN__ /* On native Windows, setlocale(category, "") looks at the system settings, not at the environment variables. Also, when an encoding suffix such as ".65001" or ".54936" is specified, it succeeds but sets the LC_CTYPE category of the locale to "C". */ if (setlocale (LC_ALL, getenv ("LC_ALL")) == NULL || strcmp (setlocale (LC_CTYPE, NULL), "C") == 0) return 1; # else if (setlocale (LC_ALL, "") == NULL) return 1; # endif /* Check whether nl_langinfo(CODESET) is nonempty and not "ASCII" or "646". On Mac OS X 10.3.5 (Darwin 7.5) in the fr_FR locale, nl_langinfo(CODESET) is empty, and the behaviour of Tcl 8.4 in this locale is not useful. On OpenBSD 4.0, when an unsupported locale is specified, setlocale() succeeds but then nl_langinfo(CODESET) is "646". In this situation, some unit tests fail. On MirBSD 10, when an unsupported locale is specified, setlocale() succeeds but then nl_langinfo(CODESET) is "UTF-8". */ # if HAVE_LANGINFO_CODESET { const char *cs = nl_langinfo (CODESET); if (cs[0] == '\0' || strcmp (cs, "ASCII") == 0 || strcmp (cs, "646") == 0 || strcmp (cs, "UTF-8") == 0) return 1; } # endif # ifdef __CYGWIN__ /* On Cygwin, avoid locale names without encoding suffix, because the locale_charset() function relies on the encoding suffix. Note that LC_ALL is set on the command line. */ if (strchr (getenv ("LC_ALL"), '.') == NULL) return 1; # endif /* Check whether in the abbreviation of the second month, the second character (should be U+00E9: LATIN SMALL LETTER E WITH ACUTE) is only one byte long. This excludes the UTF-8 encoding. */ t.tm_year = 1975 - 1900; t.tm_mon = 2 - 1; t.tm_mday = 4; if (strftime (buf, sizeof (buf), "%b", &t) < 3 || buf[2] != 'v') return 1; # if !defined __BIONIC__ /* Bionic libc's 'struct lconv' is just a dummy. */ /* Check whether the decimal separator is a comma. On NetBSD 3.0 in the fr_FR.ISO8859-1 locale, localeconv()->decimal_point are nl_langinfo(RADIXCHAR) are both ".". */ if (localeconv () ->decimal_point[0] != ',') return 1; # endif return 0; #endif } _ACEOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest$ac_exeext; then case "$host_os" in # Handle native Windows specially, because there setlocale() interprets # "ar" as "Arabic" or "Arabic_Saudi Arabia.1256", # "fr" or "fra" as "French" or "French_France.1252", # "ge"(!) or "deu"(!) as "German" or "German_Germany.1252", # "ja" as "Japanese" or "Japanese_Japan.932", # and similar. mingw*) # Test for the native Windows locale name. if (LC_ALL=French_France.1252 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then gt_cv_locale_fr=French_France.1252 else # None found. gt_cv_locale_fr=none fi ;; *) # Setting LC_ALL is not enough. Need to set LC_TIME to empty, because # otherwise on Mac OS X 10.3.5 the LC_TIME=C from the beginning of the # configure script would override the LC_ALL setting. Likewise for # LC_CTYPE, which is also set at the beginning of the configure script. # Test for the usual locale name. if (LC_ALL=fr_FR LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then gt_cv_locale_fr=fr_FR else # Test for the locale name with explicit encoding suffix. if (LC_ALL=fr_FR.ISO-8859-1 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then gt_cv_locale_fr=fr_FR.ISO-8859-1 else # Test for the AIX, OSF/1, FreeBSD, NetBSD, OpenBSD locale name. if (LC_ALL=fr_FR.ISO8859-1 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then gt_cv_locale_fr=fr_FR.ISO8859-1 else # Test for the HP-UX locale name. if (LC_ALL=fr_FR.iso88591 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then gt_cv_locale_fr=fr_FR.iso88591 else # Test for the Solaris 7 locale name. if (LC_ALL=fr LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then gt_cv_locale_fr=fr else # None found. gt_cv_locale_fr=none fi fi fi fi fi ;; esac fi rm -fr conftest* fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gt_cv_locale_fr" >&5 printf "%s\n" "$gt_cv_locale_fr" >&6; } LOCALE_FR=$gt_cv_locale_fr GL_GNULIB_BTOWC=0 GL_GNULIB_WCTOB=0 GL_GNULIB_MBSINIT=0 GL_GNULIB_MBRTOWC=0 GL_GNULIB_MBRLEN=0 GL_GNULIB_MBSRTOWCS=0 GL_GNULIB_MBSNRTOWCS=0 GL_GNULIB_WCRTOMB=0 GL_GNULIB_WCSRTOMBS=0 GL_GNULIB_WCSNRTOMBS=0 GL_GNULIB_WCWIDTH=0 GL_GNULIB_WMEMCHR=0 GL_GNULIB_WMEMCMP=0 GL_GNULIB_WMEMCPY=0 GL_GNULIB_WMEMMOVE=0 GL_GNULIB_WMEMPCPY=0 GL_GNULIB_WMEMSET=0 GL_GNULIB_WCSLEN=0 GL_GNULIB_WCSNLEN=0 GL_GNULIB_WCSCPY=0 GL_GNULIB_WCPCPY=0 GL_GNULIB_WCSNCPY=0 GL_GNULIB_WCPNCPY=0 GL_GNULIB_WCSCAT=0 GL_GNULIB_WCSNCAT=0 GL_GNULIB_WCSCMP=0 GL_GNULIB_WCSNCMP=0 GL_GNULIB_WCSCASECMP=0 GL_GNULIB_WCSNCASECMP=0 GL_GNULIB_WCSCOLL=0 GL_GNULIB_WCSXFRM=0 GL_GNULIB_WCSDUP=0 GL_GNULIB_WCSCHR=0 GL_GNULIB_WCSRCHR=0 GL_GNULIB_WCSCSPN=0 GL_GNULIB_WCSSPN=0 GL_GNULIB_WCSPBRK=0 GL_GNULIB_WCSSTR=0 GL_GNULIB_WCSTOK=0 GL_GNULIB_WCSWIDTH=0 GL_GNULIB_WCSFTIME=0 GL_GNULIB_MDA_WCSDUP=1 GL_GNULIB__EXIT=0 GL_GNULIB_ALIGNED_ALLOC=0 GL_GNULIB_ATOLL=0 GL_GNULIB_CALLOC_GNU=0 GL_GNULIB_CALLOC_POSIX=0 GL_GNULIB_CANONICALIZE_FILE_NAME=0 GL_GNULIB_FREE_POSIX=0 GL_GNULIB_GETLOADAVG=0 GL_GNULIB_GETSUBOPT=0 GL_GNULIB_GRANTPT=0 GL_GNULIB_MALLOC_GNU=0 GL_GNULIB_MALLOC_POSIX=0 GL_GNULIB_MBTOWC=0 GL_GNULIB_MKDTEMP=0 GL_GNULIB_MKOSTEMP=0 GL_GNULIB_MKOSTEMPS=0 GL_GNULIB_MKSTEMP=0 GL_GNULIB_MKSTEMPS=0 GL_GNULIB_POSIX_MEMALIGN=0 GL_GNULIB_POSIX_OPENPT=0 GL_GNULIB_PTSNAME=0 GL_GNULIB_PTSNAME_R=0 GL_GNULIB_PUTENV=0 GL_GNULIB_QSORT_R=0 GL_GNULIB_RANDOM=0 GL_GNULIB_RANDOM_R=0 GL_GNULIB_REALLOCARRAY=0 GL_GNULIB_REALLOC_GNU=0 GL_GNULIB_REALLOC_POSIX=0 GL_GNULIB_REALPATH=0 GL_GNULIB_RPMATCH=0 GL_GNULIB_SECURE_GETENV=0 GL_GNULIB_SETENV=0 GL_GNULIB_STRTOD=0 GL_GNULIB_STRTOL=0 GL_GNULIB_STRTOLD=0 GL_GNULIB_STRTOLL=0 GL_GNULIB_STRTOUL=0 GL_GNULIB_STRTOULL=0 GL_GNULIB_SYSTEM_POSIX=0 GL_GNULIB_UNLOCKPT=0 GL_GNULIB_UNSETENV=0 GL_GNULIB_WCTOMB=0 GL_GNULIB_MDA_ECVT=1 GL_GNULIB_MDA_FCVT=1 GL_GNULIB_MDA_GCVT=1 GL_GNULIB_MDA_MKTEMP=1 GL_GNULIB_MDA_PUTENV=1 HAVE__EXIT=1; HAVE_ALIGNED_ALLOC=1; HAVE_ATOLL=1; HAVE_CANONICALIZE_FILE_NAME=1; HAVE_DECL_ECVT=1; HAVE_DECL_FCVT=1; HAVE_DECL_GCVT=1; HAVE_DECL_GETLOADAVG=1; HAVE_GETSUBOPT=1; HAVE_GRANTPT=1; HAVE_INITSTATE=1; HAVE_DECL_INITSTATE=1; HAVE_MBTOWC=1; HAVE_MKDTEMP=1; HAVE_MKOSTEMP=1; HAVE_MKOSTEMPS=1; HAVE_MKSTEMP=1; HAVE_MKSTEMPS=1; HAVE_POSIX_MEMALIGN=1; HAVE_POSIX_OPENPT=1; HAVE_PTSNAME=1; HAVE_PTSNAME_R=1; HAVE_QSORT_R=1; HAVE_RANDOM=1; HAVE_RANDOM_H=1; HAVE_RANDOM_R=1; HAVE_REALLOCARRAY=1; HAVE_REALPATH=1; HAVE_RPMATCH=1; HAVE_SECURE_GETENV=1; HAVE_SETENV=1; HAVE_DECL_SETENV=1; HAVE_SETSTATE=1; HAVE_DECL_SETSTATE=1; HAVE_STRTOD=1; HAVE_STRTOL=1; HAVE_STRTOLD=1; HAVE_STRTOLL=1; HAVE_STRTOUL=1; HAVE_STRTOULL=1; HAVE_STRUCT_RANDOM_DATA=1; HAVE_SYS_LOADAVG_H=0; HAVE_UNLOCKPT=1; HAVE_DECL_UNSETENV=1; REPLACE_ALIGNED_ALLOC=0; REPLACE_CALLOC_FOR_CALLOC_GNU=0; REPLACE_CALLOC_FOR_CALLOC_POSIX=0; REPLACE_CANONICALIZE_FILE_NAME=0; REPLACE_FREE=0; REPLACE_INITSTATE=0; REPLACE_MALLOC_FOR_MALLOC_GNU=0; REPLACE_MALLOC_FOR_MALLOC_POSIX=0; REPLACE_MBTOWC=0; REPLACE_MKSTEMP=0; REPLACE_POSIX_MEMALIGN=0; REPLACE_PTSNAME=0; REPLACE_PTSNAME_R=0; REPLACE_PUTENV=0; REPLACE_QSORT_R=0; REPLACE_RANDOM=0; REPLACE_RANDOM_R=0; REPLACE_REALLOC_FOR_REALLOC_GNU=0; REPLACE_REALLOC_FOR_REALLOC_POSIX=0; REPLACE_REALLOCARRAY=0; REPLACE_REALPATH=0; REPLACE_SETENV=0; REPLACE_SETSTATE=0; REPLACE_STRTOD=0; REPLACE_STRTOL=0; REPLACE_STRTOLD=0; REPLACE_STRTOLL=0; REPLACE_STRTOUL=0; REPLACE_STRTOULL=0; REPLACE_UNSETENV=0; REPLACE_WCTOMB=0; { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether malloc is ptrdiff_t safe" >&5 printf %s "checking whether malloc is ptrdiff_t safe... " >&6; } if test ${gl_cv_malloc_ptrdiff+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { /* 64-bit ptrdiff_t is so wide that no practical platform can exceed it. */ #define WIDE_PTRDIFF (PTRDIFF_MAX >> 31 >> 31 != 0) /* On rare machines where size_t fits in ptrdiff_t there is no problem. */ #define NARROW_SIZE (SIZE_MAX <= PTRDIFF_MAX) /* glibc 2.30 and later malloc refuses to exceed ptrdiff_t bounds even on 32-bit platforms. We don't know which non-glibc systems are safe. */ #define KNOWN_SAFE (2 < __GLIBC__ + (30 <= __GLIBC_MINOR__)) #if WIDE_PTRDIFF || NARROW_SIZE || KNOWN_SAFE return 0; #else #error "malloc might not be ptrdiff_t safe" syntax error #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : gl_cv_malloc_ptrdiff=yes else $as_nop gl_cv_malloc_ptrdiff=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_malloc_ptrdiff" >&5 printf "%s\n" "$gl_cv_malloc_ptrdiff" >&6; } test "$gl_cv_malloc_ptrdiff" = yes || REPLACE_MALLOC_FOR_MALLOC_POSIX=1 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether malloc, realloc, calloc set errno on failure" >&5 printf %s "checking whether malloc, realloc, calloc set errno on failure... " >&6; } if test ${gl_cv_func_malloc_posix+y} then : printf %s "(cached) " >&6 else $as_nop case "$host_os" in mingw*) gl_cv_func_malloc_posix=no ;; irix* | solaris*) gl_cv_func_malloc_posix=no ;; *) gl_cv_func_malloc_posix=yes ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_malloc_posix" >&5 printf "%s\n" "$gl_cv_func_malloc_posix" >&6; } if test "$gl_cv_func_malloc_posix" = yes; then printf "%s\n" "#define HAVE_MALLOC_POSIX 1" >>confdefs.h else REPLACE_MALLOC_FOR_MALLOC_POSIX=1 fi if test $REPLACE_MALLOC_FOR_MALLOC_POSIX = 1; then REPLACE_CALLOC_FOR_CALLOC_POSIX=1 fi GL_GNULIB_ACCESS=0 GL_GNULIB_CHDIR=0 GL_GNULIB_CHOWN=0 GL_GNULIB_CLOSE=0 GL_GNULIB_COPY_FILE_RANGE=0 GL_GNULIB_DUP=0 GL_GNULIB_DUP2=0 GL_GNULIB_DUP3=0 GL_GNULIB_ENVIRON=0 GL_GNULIB_EUIDACCESS=0 GL_GNULIB_EXECL=0 GL_GNULIB_EXECLE=0 GL_GNULIB_EXECLP=0 GL_GNULIB_EXECV=0 GL_GNULIB_EXECVE=0 GL_GNULIB_EXECVP=0 GL_GNULIB_EXECVPE=0 GL_GNULIB_FACCESSAT=0 GL_GNULIB_FCHDIR=0 GL_GNULIB_FCHOWNAT=0 GL_GNULIB_FDATASYNC=0 GL_GNULIB_FSYNC=0 GL_GNULIB_FTRUNCATE=0 GL_GNULIB_GETCWD=0 GL_GNULIB_GETDOMAINNAME=0 GL_GNULIB_GETDTABLESIZE=0 GL_GNULIB_GETENTROPY=0 GL_GNULIB_GETGROUPS=0 GL_GNULIB_GETHOSTNAME=0 GL_GNULIB_GETLOGIN=0 GL_GNULIB_GETLOGIN_R=0 GL_GNULIB_GETOPT_POSIX=0 GL_GNULIB_GETPAGESIZE=0 GL_GNULIB_GETPASS=0 GL_GNULIB_GETPASS_GNU=0 GL_GNULIB_GETUSERSHELL=0 GL_GNULIB_GROUP_MEMBER=0 GL_GNULIB_ISATTY=0 GL_GNULIB_LCHOWN=0 GL_GNULIB_LINK=0 GL_GNULIB_LINKAT=0 GL_GNULIB_LSEEK=0 GL_GNULIB_PIPE=0 GL_GNULIB_PIPE2=0 GL_GNULIB_PREAD=0 GL_GNULIB_PWRITE=0 GL_GNULIB_READ=0 GL_GNULIB_READLINK=0 GL_GNULIB_READLINKAT=0 GL_GNULIB_RMDIR=0 GL_GNULIB_SETHOSTNAME=0 GL_GNULIB_SLEEP=0 GL_GNULIB_SYMLINK=0 GL_GNULIB_SYMLINKAT=0 GL_GNULIB_TRUNCATE=0 GL_GNULIB_TTYNAME_R=0 GL_GNULIB_UNISTD_H_GETOPT=0 GL_GNULIB_UNISTD_H_NONBLOCKING=0 GL_GNULIB_UNISTD_H_SIGPIPE=0 GL_GNULIB_UNLINK=0 GL_GNULIB_UNLINKAT=0 GL_GNULIB_USLEEP=0 GL_GNULIB_WRITE=0 GL_GNULIB_MDA_ACCESS=1 GL_GNULIB_MDA_CHDIR=1 GL_GNULIB_MDA_CLOSE=1 GL_GNULIB_MDA_DUP=1 GL_GNULIB_MDA_DUP2=1 GL_GNULIB_MDA_EXECL=1 GL_GNULIB_MDA_EXECLE=1 GL_GNULIB_MDA_EXECLP=1 GL_GNULIB_MDA_EXECV=1 GL_GNULIB_MDA_EXECVE=1 GL_GNULIB_MDA_EXECVP=1 GL_GNULIB_MDA_EXECVPE=1 GL_GNULIB_MDA_GETCWD=1 GL_GNULIB_MDA_GETPID=1 GL_GNULIB_MDA_ISATTY=1 GL_GNULIB_MDA_LSEEK=1 GL_GNULIB_MDA_READ=1 GL_GNULIB_MDA_RMDIR=1 GL_GNULIB_MDA_SWAB=1 GL_GNULIB_MDA_UNLINK=1 GL_GNULIB_MDA_WRITE=1 HAVE_CHOWN=1; HAVE_COPY_FILE_RANGE=1; HAVE_DUP3=1; HAVE_EUIDACCESS=1; HAVE_EXECVPE=1; HAVE_FACCESSAT=1; HAVE_FCHDIR=1; HAVE_FCHOWNAT=1; HAVE_FDATASYNC=1; HAVE_FSYNC=1; HAVE_FTRUNCATE=1; HAVE_GETDTABLESIZE=1; HAVE_GETENTROPY=1; HAVE_GETGROUPS=1; HAVE_GETHOSTNAME=1; HAVE_GETLOGIN=1; HAVE_GETPAGESIZE=1; HAVE_GETPASS=1; HAVE_GROUP_MEMBER=1; HAVE_LCHOWN=1; HAVE_LINK=1; HAVE_LINKAT=1; HAVE_PIPE=1; HAVE_PIPE2=1; HAVE_PREAD=1; HAVE_PWRITE=1; HAVE_READLINK=1; HAVE_READLINKAT=1; HAVE_SETHOSTNAME=1; HAVE_SLEEP=1; HAVE_SYMLINK=1; HAVE_SYMLINKAT=1; HAVE_UNLINKAT=1; HAVE_USLEEP=1; HAVE_DECL_ENVIRON=1; HAVE_DECL_EXECVPE=1; HAVE_DECL_FCHDIR=1; HAVE_DECL_FDATASYNC=1; HAVE_DECL_GETDOMAINNAME=1; HAVE_DECL_GETLOGIN=1; HAVE_DECL_GETLOGIN_R=1; HAVE_DECL_GETPAGESIZE=1; HAVE_DECL_GETUSERSHELL=1; HAVE_DECL_SETHOSTNAME=1; HAVE_DECL_TRUNCATE=1; HAVE_DECL_TTYNAME_R=1; HAVE_OS_H=0; HAVE_SYS_PARAM_H=0; REPLACE_ACCESS=0; REPLACE_CHOWN=0; REPLACE_CLOSE=0; REPLACE_COPY_FILE_RANGE=0; REPLACE_DUP=0; REPLACE_DUP2=0; REPLACE_EXECL=0; REPLACE_EXECLE=0; REPLACE_EXECLP=0; REPLACE_EXECV=0; REPLACE_EXECVE=0; REPLACE_EXECVP=0; REPLACE_EXECVPE=0; REPLACE_FACCESSAT=0; REPLACE_FCHOWNAT=0; REPLACE_FTRUNCATE=0; REPLACE_GETCWD=0; REPLACE_GETDOMAINNAME=0; REPLACE_GETDTABLESIZE=0; REPLACE_GETLOGIN_R=0; REPLACE_GETGROUPS=0; REPLACE_GETPAGESIZE=0; REPLACE_GETPASS=0; REPLACE_GETPASS_FOR_GETPASS_GNU=0; REPLACE_ISATTY=0; REPLACE_LCHOWN=0; REPLACE_LINK=0; REPLACE_LINKAT=0; REPLACE_LSEEK=0; REPLACE_PREAD=0; REPLACE_PWRITE=0; REPLACE_READ=0; REPLACE_READLINK=0; REPLACE_READLINKAT=0; REPLACE_RMDIR=0; REPLACE_SLEEP=0; REPLACE_SYMLINK=0; REPLACE_SYMLINKAT=0; REPLACE_TRUNCATE=0; REPLACE_TTYNAME_R=0; REPLACE_UNLINK=0; REPLACE_UNLINKAT=0; REPLACE_USLEEP=0; REPLACE_WRITE=0; UNISTD_H_HAVE_SYS_RANDOM_H=0; UNISTD_H_HAVE_WINSOCK2_H=0; UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS=0; if test $ac_cv_func__set_invalid_parameter_handler = yes; then HAVE_MSVC_INVALID_PARAMETER_HANDLER=1 printf "%s\n" "#define HAVE_MSVC_INVALID_PARAMETER_HANDLER 1" >>confdefs.h else HAVE_MSVC_INVALID_PARAMETER_HANDLER=0 fi HAVE_ISBLANK=1; { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the preprocessor supports include_next" >&5 printf %s "checking whether the preprocessor supports include_next... " >&6; } if test ${gl_cv_have_include_next+y} then : printf %s "(cached) " >&6 else $as_nop rm -rf conftestd1a conftestd1b conftestd2 mkdir conftestd1a conftestd1b conftestd2 cat < conftestd1a/conftest.h #define DEFINED_IN_CONFTESTD1 #include_next #ifdef DEFINED_IN_CONFTESTD2 int foo; #else #error "include_next doesn't work" #endif EOF cat < conftestd1b/conftest.h #define DEFINED_IN_CONFTESTD1 #include #include_next #ifdef DEFINED_IN_CONFTESTD2 int foo; #else #error "include_next doesn't work" #endif EOF cat < conftestd2/conftest.h #ifndef DEFINED_IN_CONFTESTD1 #error "include_next test doesn't work" #endif #define DEFINED_IN_CONFTESTD2 EOF gl_save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$gl_save_CPPFLAGS -Iconftestd1b -Iconftestd2" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_compile "$LINENO" then : gl_cv_have_include_next=yes else $as_nop CPPFLAGS="$gl_save_CPPFLAGS -Iconftestd1a -Iconftestd2" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_compile "$LINENO" then : gl_cv_have_include_next=buggy else $as_nop gl_cv_have_include_next=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext CPPFLAGS="$gl_save_CPPFLAGS" rm -rf conftestd1a conftestd1b conftestd2 fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_have_include_next" >&5 printf "%s\n" "$gl_cv_have_include_next" >&6; } PRAGMA_SYSTEM_HEADER= if test $gl_cv_have_include_next = yes; then INCLUDE_NEXT=include_next INCLUDE_NEXT_AS_FIRST_DIRECTIVE=include_next if test -n "$GCC"; then PRAGMA_SYSTEM_HEADER='#pragma GCC system_header' fi else if test $gl_cv_have_include_next = buggy; then INCLUDE_NEXT=include INCLUDE_NEXT_AS_FIRST_DIRECTIVE=include_next else INCLUDE_NEXT=include INCLUDE_NEXT_AS_FIRST_DIRECTIVE=include fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether source code line length is unlimited" >&5 printf %s "checking whether source code line length is unlimited... " >&6; } if test ${gl_cv_source_line_length_unlimited+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __TANDEM choke me #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "choke me" >/dev/null 2>&1 then : gl_cv_source_line_length_unlimited=no else $as_nop gl_cv_source_line_length_unlimited=yes fi rm -rf conftest* fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_source_line_length_unlimited" >&5 printf "%s\n" "$gl_cv_source_line_length_unlimited" >&6; } if test $gl_cv_source_line_length_unlimited = no; then PRAGMA_COLUMNS="#pragma COLUMNS 10000" else PRAGMA_COLUMNS= fi if test $gl_cv_have_include_next = yes; then gl_cv_next_ctype_h='<'ctype.h'>' else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 printf %s "checking absolute name of ... " >&6; } if test ${gl_cv_next_ctype_h+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'ctype.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_absolute_ctype_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"` gl_header=$gl_cv_absolute_ctype_h gl_cv_next_ctype_h='"'$gl_header'"' fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_ctype_h" >&5 printf "%s\n" "$gl_cv_next_ctype_h" >&6; } fi NEXT_CTYPE_H=$gl_cv_next_ctype_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'ctype.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_ctype_h fi NEXT_AS_FIRST_DIRECTIVE_CTYPE_H=$gl_next_as_first_directive GL_GNULIB_ISBLANK=0 HAVE_OPENDIR=1; HAVE_READDIR=1; HAVE_REWINDDIR=1; HAVE_CLOSEDIR=1; HAVE_DECL_DIRFD=1; HAVE_DECL_FDOPENDIR=1; HAVE_FDOPENDIR=1; HAVE_SCANDIR=1; HAVE_ALPHASORT=1; REPLACE_OPENDIR=0; REPLACE_CLOSEDIR=0; REPLACE_DIRFD=0; REPLACE_FDOPENDIR=0; if test $gl_cv_have_include_next = yes; then gl_cv_next_dirent_h='<'dirent.h'>' else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 printf %s "checking absolute name of ... " >&6; } if test ${gl_cv_next_dirent_h+y} then : printf %s "(cached) " >&6 else $as_nop if test $ac_cv_header_dirent_h = yes; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'dirent.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_absolute_dirent_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"` gl_header=$gl_cv_absolute_dirent_h gl_cv_next_dirent_h='"'$gl_header'"' else gl_cv_next_dirent_h='<'dirent.h'>' fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_dirent_h" >&5 printf "%s\n" "$gl_cv_next_dirent_h" >&6; } fi NEXT_DIRENT_H=$gl_cv_next_dirent_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'dirent.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_dirent_h fi NEXT_AS_FIRST_DIRECTIVE_DIRENT_H=$gl_next_as_first_directive if test $ac_cv_header_dirent_h = yes; then HAVE_DIRENT_H=1 else HAVE_DIRENT_H=0 fi GL_GNULIB_OPENDIR=0 GL_GNULIB_READDIR=0 GL_GNULIB_REWINDDIR=0 GL_GNULIB_CLOSEDIR=0 GL_GNULIB_DIRFD=0 GL_GNULIB_FDOPENDIR=0 GL_GNULIB_SCANDIR=0 GL_GNULIB_ALPHASORT=0 gl_mda_defines=' #if defined _WIN32 && !defined __CYGWIN__ #define access _access #define chdir _chdir #define chmod _chmod #define close _close #define creat _creat #define dup _dup #define dup2 _dup2 #define ecvt _ecvt #define execl _execl #define execle _execle #define execlp _execlp #define execv _execv #define execve _execve #define execvp _execvp #define execvpe _execvpe #define fcloseall _fcloseall #define fcvt _fcvt #define fdopen _fdopen #define fileno _fileno #define gcvt _gcvt #define getcwd _getcwd #define getpid _getpid #define getw _getw #define isatty _isatty #define j0 _j0 #define j1 _j1 #define jn _jn #define lfind _lfind #define lsearch _lsearch #define lseek _lseek #define memccpy _memccpy #define mkdir _mkdir #define mktemp _mktemp #define open _open #define putenv _putenv #define putw _putw #define read _read #define rmdir _rmdir #define strdup _strdup #define swab _swab #define tempnam _tempnam #define tzset _tzset #define umask _umask #define unlink _unlink #define utime _utime #define wcsdup _wcsdup #define write _write #define y0 _y0 #define y1 _y1 #define yn _yn #endif ' { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for complete errno.h" >&5 printf %s "checking for complete errno.h... " >&6; } if test ${gl_cv_header_errno_h_complete+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #if !defined ETXTBSY booboo #endif #if !defined ENOMSG booboo #endif #if !defined EIDRM booboo #endif #if !defined ENOLINK booboo #endif #if !defined EPROTO booboo #endif #if !defined EMULTIHOP booboo #endif #if !defined EBADMSG booboo #endif #if !defined EOVERFLOW booboo #endif #if !defined ENOTSUP booboo #endif #if !defined ENETRESET booboo #endif #if !defined ECONNABORTED booboo #endif #if !defined ESTALE booboo #endif #if !defined EDQUOT booboo #endif #if !defined ECANCELED booboo #endif #if !defined EOWNERDEAD booboo #endif #if !defined ENOTRECOVERABLE booboo #endif #if !defined EILSEQ booboo #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "booboo" >/dev/null 2>&1 then : gl_cv_header_errno_h_complete=no else $as_nop gl_cv_header_errno_h_complete=yes fi rm -rf conftest* fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_errno_h_complete" >&5 printf "%s\n" "$gl_cv_header_errno_h_complete" >&6; } if test $gl_cv_header_errno_h_complete = yes; then GL_GENERATE_ERRNO_H=false else if test $gl_cv_have_include_next = yes; then gl_cv_next_errno_h='<'errno.h'>' else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 printf %s "checking absolute name of ... " >&6; } if test ${gl_cv_next_errno_h+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'errno.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_absolute_errno_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"` gl_header=$gl_cv_absolute_errno_h gl_cv_next_errno_h='"'$gl_header'"' fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_errno_h" >&5 printf "%s\n" "$gl_cv_next_errno_h" >&6; } fi NEXT_ERRNO_H=$gl_cv_next_errno_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'errno.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_errno_h fi NEXT_AS_FIRST_DIRECTIVE_ERRNO_H=$gl_next_as_first_directive GL_GENERATE_ERRNO_H=true fi if $GL_GENERATE_ERRNO_H; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for EMULTIHOP value" >&5 printf %s "checking for EMULTIHOP value... " >&6; } if test ${gl_cv_header_errno_h_EMULTIHOP+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef EMULTIHOP yes #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "yes" >/dev/null 2>&1 then : gl_cv_header_errno_h_EMULTIHOP=yes else $as_nop gl_cv_header_errno_h_EMULTIHOP=no fi rm -rf conftest* if test $gl_cv_header_errno_h_EMULTIHOP = no; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _XOPEN_SOURCE_EXTENDED 1 #include #ifdef EMULTIHOP yes #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "yes" >/dev/null 2>&1 then : gl_cv_header_errno_h_EMULTIHOP=hidden fi rm -rf conftest* if test $gl_cv_header_errno_h_EMULTIHOP = hidden; then if ac_fn_c_compute_int "$LINENO" "EMULTIHOP" "gl_cv_header_errno_h_EMULTIHOP" " #define _XOPEN_SOURCE_EXTENDED 1 #include /* The following two lines are a workaround against an autoconf-2.52 bug. */ #include #include " then : fi fi fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_errno_h_EMULTIHOP" >&5 printf "%s\n" "$gl_cv_header_errno_h_EMULTIHOP" >&6; } case $gl_cv_header_errno_h_EMULTIHOP in yes | no) EMULTIHOP_HIDDEN=0; EMULTIHOP_VALUE= ;; *) EMULTIHOP_HIDDEN=1; EMULTIHOP_VALUE="$gl_cv_header_errno_h_EMULTIHOP" ;; esac fi if $GL_GENERATE_ERRNO_H; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ENOLINK value" >&5 printf %s "checking for ENOLINK value... " >&6; } if test ${gl_cv_header_errno_h_ENOLINK+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef ENOLINK yes #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "yes" >/dev/null 2>&1 then : gl_cv_header_errno_h_ENOLINK=yes else $as_nop gl_cv_header_errno_h_ENOLINK=no fi rm -rf conftest* if test $gl_cv_header_errno_h_ENOLINK = no; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _XOPEN_SOURCE_EXTENDED 1 #include #ifdef ENOLINK yes #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "yes" >/dev/null 2>&1 then : gl_cv_header_errno_h_ENOLINK=hidden fi rm -rf conftest* if test $gl_cv_header_errno_h_ENOLINK = hidden; then if ac_fn_c_compute_int "$LINENO" "ENOLINK" "gl_cv_header_errno_h_ENOLINK" " #define _XOPEN_SOURCE_EXTENDED 1 #include /* The following two lines are a workaround against an autoconf-2.52 bug. */ #include #include " then : fi fi fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_errno_h_ENOLINK" >&5 printf "%s\n" "$gl_cv_header_errno_h_ENOLINK" >&6; } case $gl_cv_header_errno_h_ENOLINK in yes | no) ENOLINK_HIDDEN=0; ENOLINK_VALUE= ;; *) ENOLINK_HIDDEN=1; ENOLINK_VALUE="$gl_cv_header_errno_h_ENOLINK" ;; esac fi if $GL_GENERATE_ERRNO_H; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for EOVERFLOW value" >&5 printf %s "checking for EOVERFLOW value... " >&6; } if test ${gl_cv_header_errno_h_EOVERFLOW+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef EOVERFLOW yes #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "yes" >/dev/null 2>&1 then : gl_cv_header_errno_h_EOVERFLOW=yes else $as_nop gl_cv_header_errno_h_EOVERFLOW=no fi rm -rf conftest* if test $gl_cv_header_errno_h_EOVERFLOW = no; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _XOPEN_SOURCE_EXTENDED 1 #include #ifdef EOVERFLOW yes #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "yes" >/dev/null 2>&1 then : gl_cv_header_errno_h_EOVERFLOW=hidden fi rm -rf conftest* if test $gl_cv_header_errno_h_EOVERFLOW = hidden; then if ac_fn_c_compute_int "$LINENO" "EOVERFLOW" "gl_cv_header_errno_h_EOVERFLOW" " #define _XOPEN_SOURCE_EXTENDED 1 #include /* The following two lines are a workaround against an autoconf-2.52 bug. */ #include #include " then : fi fi fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_errno_h_EOVERFLOW" >&5 printf "%s\n" "$gl_cv_header_errno_h_EOVERFLOW" >&6; } case $gl_cv_header_errno_h_EOVERFLOW in yes | no) EOVERFLOW_HIDDEN=0; EOVERFLOW_VALUE= ;; *) EOVERFLOW_HIDDEN=1; EOVERFLOW_VALUE="$gl_cv_header_errno_h_EOVERFLOW" ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ctype.h defines __header_inline" >&5 printf %s "checking whether ctype.h defines __header_inline... " >&6; } if test ${gl_cv_have___header_inline+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifndef __header_inline #error " does not define __header_inline" #endif _ACEOF if ac_fn_c_try_cpp "$LINENO" then : gl_cv_have___header_inline=yes else $as_nop gl_cv_have___header_inline=no fi rm -f conftest.err conftest.i conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_have___header_inline" >&5 printf "%s\n" "$gl_cv_have___header_inline" >&6; } if test "$gl_cv_have___header_inline" = yes; then printf "%s\n" "#define HAVE___HEADER_INLINE 1" >>confdefs.h fi ac_fn_check_decl "$LINENO" "fchdir" "ac_cv_have_decl_fchdir" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_fchdir" = xyes then : ac_have_decl=1 else $as_nop ac_have_decl=0 fi printf "%s\n" "#define HAVE_DECL_FCHDIR $ac_have_decl" >>confdefs.h HAVE_FCNTL=1; HAVE_OPENAT=1; REPLACE_CREAT=0; REPLACE_FCNTL=0; REPLACE_OPEN=0; REPLACE_OPENAT=0; GL_GNULIB_CREAT=0 GL_GNULIB_FCNTL=0 GL_GNULIB_NONBLOCKING=0 GL_GNULIB_OPEN=0 GL_GNULIB_OPENAT=0 GL_GNULIB_MDA_CREAT=1 GL_GNULIB_MDA_OPEN=1 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working fcntl.h" >&5 printf %s "checking for working fcntl.h... " >&6; } if test ${gl_cv_header_working_fcntl_h+y} then : printf %s "(cached) " >&6 else $as_nop if test "$cross_compiling" = yes then : case "$host_os" in # Guess 'no' on native Windows. mingw*) gl_cv_header_working_fcntl_h='no' ;; *) gl_cv_header_working_fcntl_h=cross-compiling ;; esac else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if HAVE_UNISTD_H # include #else /* on Windows with MSVC */ # include # include # defined sleep(n) _sleep ((n) * 1000) #endif #include $gl_mda_defines #ifndef O_NOATIME #define O_NOATIME 0 #endif #ifndef O_NOFOLLOW #define O_NOFOLLOW 0 #endif static int const constants[] = { O_CREAT, O_EXCL, O_NOCTTY, O_TRUNC, O_APPEND, O_NONBLOCK, O_SYNC, O_ACCMODE, O_RDONLY, O_RDWR, O_WRONLY }; int main (void) { int result = !constants; #if HAVE_SYMLINK { static char const sym[] = "conftest.sym"; if (symlink ("/dev/null", sym) != 0) result |= 2; else { int fd = open (sym, O_WRONLY | O_NOFOLLOW | O_CREAT, 0); if (fd >= 0) { close (fd); result |= 4; } } if (unlink (sym) != 0 || symlink (".", sym) != 0) result |= 2; else { int fd = open (sym, O_RDONLY | O_NOFOLLOW); if (fd >= 0) { close (fd); result |= 4; } } unlink (sym); } #endif { static char const file[] = "confdefs.h"; int fd = open (file, O_RDONLY | O_NOATIME); if (fd < 0) result |= 8; else { struct stat st0; if (fstat (fd, &st0) != 0) result |= 16; else { char c; sleep (1); if (read (fd, &c, 1) != 1) result |= 24; else { if (close (fd) != 0) result |= 32; else { struct stat st1; if (stat (file, &st1) != 0) result |= 40; else if (st0.st_atime != st1.st_atime) result |= 64; } } } } } return result; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO" then : gl_cv_header_working_fcntl_h=yes else $as_nop case $? in #( 4) gl_cv_header_working_fcntl_h='no (bad O_NOFOLLOW)';; #( 64) gl_cv_header_working_fcntl_h='no (bad O_NOATIME)';; #( 68) gl_cv_header_working_fcntl_h='no (bad O_NOATIME, O_NOFOLLOW)';; #( *) gl_cv_header_working_fcntl_h='no';; esac fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_working_fcntl_h" >&5 printf "%s\n" "$gl_cv_header_working_fcntl_h" >&6; } case $gl_cv_header_working_fcntl_h in #( *O_NOATIME* | no | cross-compiling) ac_val=0;; #( *) ac_val=1;; esac printf "%s\n" "#define HAVE_WORKING_O_NOATIME $ac_val" >>confdefs.h case $gl_cv_header_working_fcntl_h in #( *O_NOFOLLOW* | no | cross-compiling) ac_val=0;; #( *) ac_val=1;; esac printf "%s\n" "#define HAVE_WORKING_O_NOFOLLOW $ac_val" >>confdefs.h ac_fn_c_check_type "$LINENO" "pid_t" "ac_cv_type_pid_t" "$ac_includes_default " if test "x$ac_cv_type_pid_t" = xyes then : else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined _WIN64 && !defined __CYGWIN__ LLP64 #endif int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_pid_type='int' else $as_nop ac_pid_type='__int64' fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext printf "%s\n" "#define pid_t $ac_pid_type" >>confdefs.h fi ac_fn_c_check_type "$LINENO" "mode_t" "ac_cv_type_mode_t" "$ac_includes_default" if test "x$ac_cv_type_mode_t" = xyes then : else $as_nop printf "%s\n" "#define mode_t int" >>confdefs.h fi if test $gl_cv_have_include_next = yes; then gl_cv_next_fcntl_h='<'fcntl.h'>' else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 printf %s "checking absolute name of ... " >&6; } if test ${gl_cv_next_fcntl_h+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'fcntl.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_absolute_fcntl_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"` gl_header=$gl_cv_absolute_fcntl_h gl_cv_next_fcntl_h='"'$gl_header'"' fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_fcntl_h" >&5 printf "%s\n" "$gl_cv_next_fcntl_h" >&6; } fi NEXT_FCNTL_H=$gl_cv_next_fcntl_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'fcntl.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_fcntl_h fi NEXT_AS_FIRST_DIRECTIVE_FCNTL_H=$gl_next_as_first_directive HAVE_FNMATCH=1; REPLACE_FNMATCH=0; if test $gl_cv_have_include_next = yes; then gl_cv_next_fnmatch_h='<'fnmatch.h'>' else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 printf %s "checking absolute name of ... " >&6; } if test ${gl_cv_next_fnmatch_h+y} then : printf %s "(cached) " >&6 else $as_nop if test $ac_cv_header_fnmatch_h = yes; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'fnmatch.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_absolute_fnmatch_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"` gl_header=$gl_cv_absolute_fnmatch_h gl_cv_next_fnmatch_h='"'$gl_header'"' else gl_cv_next_fnmatch_h='<'fnmatch.h'>' fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_fnmatch_h" >&5 printf "%s\n" "$gl_cv_next_fnmatch_h" >&6; } fi NEXT_FNMATCH_H=$gl_cv_next_fnmatch_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'fnmatch.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_fnmatch_h fi NEXT_AS_FIRST_DIRECTIVE_FNMATCH_H=$gl_next_as_first_directive if test $ac_cv_header_fnmatch_h = yes; then HAVE_FNMATCH_H=1 else HAVE_FNMATCH_H=0 fi GL_GENERATE_FNMATCH_H=false if false; then GL_GENERATE_FNMATCH_H=true else if test $ac_cv_header_fnmatch_h != yes; then GL_GENERATE_FNMATCH_H=true fi fi GL_GNULIB_FNMATCH=0 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for mbstate_t" >&5 printf %s "checking for mbstate_t... " >&6; } if test ${ac_cv_type_mbstate_t+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default #include int main (void) { mbstate_t x; return sizeof x; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_type_mbstate_t=yes else $as_nop ac_cv_type_mbstate_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_mbstate_t" >&5 printf "%s\n" "$ac_cv_type_mbstate_t" >&6; } if test $ac_cv_type_mbstate_t = yes; then printf "%s\n" "#define HAVE_MBSTATE_T 1" >>confdefs.h else printf "%s\n" "#define mbstate_t int" >>confdefs.h fi HAVE_FCHMODAT=1; HAVE_FSTATAT=1; HAVE_FUTIMENS=1; HAVE_GETUMASK=1; HAVE_LCHMOD=1; HAVE_LSTAT=1; HAVE_MKDIRAT=1; HAVE_MKFIFO=1; HAVE_MKFIFOAT=1; HAVE_MKNOD=1; HAVE_MKNODAT=1; HAVE_UTIMENSAT=1; REPLACE_FCHMODAT=0; REPLACE_FSTAT=0; REPLACE_FSTATAT=0; REPLACE_FUTIMENS=0; REPLACE_LSTAT=0; REPLACE_MKDIR=0; REPLACE_MKFIFO=0; REPLACE_MKFIFOAT=0; REPLACE_MKNOD=0; REPLACE_MKNODAT=0; REPLACE_STAT=0; REPLACE_UTIMENSAT=0; { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether stat file-mode macros are broken" >&5 printf %s "checking whether stat file-mode macros are broken... " >&6; } if test ${ac_cv_header_stat_broken+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if defined S_ISBLK && defined S_IFDIR extern char c1[S_ISBLK (S_IFDIR) ? -1 : 1]; #endif #if defined S_ISBLK && defined S_IFCHR extern char c2[S_ISBLK (S_IFCHR) ? -1 : 1]; #endif #if defined S_ISLNK && defined S_IFREG extern char c3[S_ISLNK (S_IFREG) ? -1 : 1]; #endif #if defined S_ISSOCK && defined S_IFREG extern char c4[S_ISSOCK (S_IFREG) ? -1 : 1]; #endif _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_header_stat_broken=no else $as_nop ac_cv_header_stat_broken=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stat_broken" >&5 printf "%s\n" "$ac_cv_header_stat_broken" >&6; } if test $ac_cv_header_stat_broken = yes; then printf "%s\n" "#define STAT_MACROS_BROKEN 1" >>confdefs.h fi case "$host_os" in mingw*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for 64-bit off_t" >&5 printf %s "checking for 64-bit off_t... " >&6; } if test ${gl_cv_type_off_t_64+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int verify_off_t_size[sizeof (off_t) >= 8 ? 1 : -1]; int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : gl_cv_type_off_t_64=yes else $as_nop gl_cv_type_off_t_64=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_type_off_t_64" >&5 printf "%s\n" "$gl_cv_type_off_t_64" >&6; } if test $gl_cv_type_off_t_64 = no; then WINDOWS_64_BIT_OFF_T=1 else WINDOWS_64_BIT_OFF_T=0 fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for 64-bit st_size" >&5 printf %s "checking for 64-bit st_size... " >&6; } if test ${gl_cv_member_st_size_64+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include struct stat buf; int verify_st_size_size[sizeof (buf.st_size) >= 8 ? 1 : -1]; int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : gl_cv_member_st_size_64=yes else $as_nop gl_cv_member_st_size_64=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_member_st_size_64" >&5 printf "%s\n" "$gl_cv_member_st_size_64" >&6; } if test $gl_cv_member_st_size_64 = no; then WINDOWS_64_BIT_ST_SIZE=1 else WINDOWS_64_BIT_ST_SIZE=0 fi ;; *) WINDOWS_64_BIT_OFF_T=0 WINDOWS_64_BIT_ST_SIZE=0 ;; esac if test $gl_cv_have_include_next = yes; then gl_cv_next_sys_stat_h='<'sys/stat.h'>' else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 printf %s "checking absolute name of ... " >&6; } if test ${gl_cv_next_sys_stat_h+y} then : printf %s "(cached) " >&6 else $as_nop if test $ac_cv_header_sys_stat_h = yes; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'sys/stat.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_absolute_sys_stat_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"` gl_header=$gl_cv_absolute_sys_stat_h gl_cv_next_sys_stat_h='"'$gl_header'"' else gl_cv_next_sys_stat_h='<'sys/stat.h'>' fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_sys_stat_h" >&5 printf "%s\n" "$gl_cv_next_sys_stat_h" >&6; } fi NEXT_SYS_STAT_H=$gl_cv_next_sys_stat_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'sys/stat.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_sys_stat_h fi NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H=$gl_next_as_first_directive WINDOWS_STAT_TIMESPEC=0 ac_fn_c_check_type "$LINENO" "nlink_t" "ac_cv_type_nlink_t" "#include #include " if test "x$ac_cv_type_nlink_t" = xyes then : else $as_nop printf "%s\n" "#define nlink_t int" >>confdefs.h fi case "$host_os" in mingw*) ac_fn_c_check_header_compile "$LINENO" "sdkddkver.h" "ac_cv_header_sdkddkver_h" "$ac_includes_default" if test "x$ac_cv_header_sdkddkver_h" = xyes then : printf "%s\n" "#define HAVE_SDKDDKVER_H 1" >>confdefs.h fi ;; esac GL_GNULIB_FCHMODAT=0 GL_GNULIB_FSTAT=0 GL_GNULIB_FSTATAT=0 GL_GNULIB_FUTIMENS=0 GL_GNULIB_GETUMASK=0 GL_GNULIB_LCHMOD=0 GL_GNULIB_LSTAT=0 GL_GNULIB_MKDIR=0 GL_GNULIB_MKDIRAT=0 GL_GNULIB_MKFIFO=0 GL_GNULIB_MKFIFOAT=0 GL_GNULIB_MKNOD=0 GL_GNULIB_MKNODAT=0 GL_GNULIB_STAT=0 GL_GNULIB_UTIMENSAT=0 GL_GNULIB_OVERRIDES_STRUCT_STAT=0 GL_GNULIB_MDA_CHMOD=1 GL_GNULIB_MDA_MKDIR=1 GL_GNULIB_MDA_UMASK=1 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether getcwd (NULL, 0) allocates memory for result" >&5 printf %s "checking whether getcwd (NULL, 0) allocates memory for result... " >&6; } if test ${gl_cv_func_getcwd_null+y} then : printf %s "(cached) " >&6 else $as_nop if test "$cross_compiling" = yes then : case "$host_os" in # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_getcwd_null="guessing yes";; # Guess yes on musl systems. *-musl*) gl_cv_func_getcwd_null="guessing yes";; # Guess yes on Cygwin. cygwin*) gl_cv_func_getcwd_null="guessing yes";; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_getcwd_null="$gl_cross_guess_normal";; esac else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ # include # if HAVE_UNISTD_H # include # else /* on Windows with MSVC */ # include # endif $gl_mda_defines # ifndef getcwd char *getcwd (); # endif int main (void) { #if defined _WIN32 && ! defined __CYGWIN__ /* mingw cwd does not start with '/', but _getcwd does allocate. However, mingw fails to honor non-zero size. */ #else if (chdir ("/") != 0) return 1; else { char *f = getcwd (NULL, 0); if (! f) return 2; if (f[0] != '/') { free (f); return 3; } if (f[1] != '\0') { free (f); return 4; } free (f); return 0; } #endif ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO" then : gl_cv_func_getcwd_null=yes else $as_nop gl_cv_func_getcwd_null=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_getcwd_null" >&5 printf "%s\n" "$gl_cv_func_getcwd_null" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for getcwd with POSIX signature" >&5 printf %s "checking for getcwd with POSIX signature... " >&6; } if test ${gl_cv_func_getcwd_posix_signature+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include $gl_mda_defines int main (void) { extern #ifdef __cplusplus "C" #endif char *getcwd (char *, size_t); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : gl_cv_func_getcwd_posix_signature=yes else $as_nop gl_cv_func_getcwd_posix_signature=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_getcwd_posix_signature" >&5 printf "%s\n" "$gl_cv_func_getcwd_posix_signature" >&6; } HAVE_DECL_FCLOSEALL=1; HAVE_DECL_FPURGE=1; HAVE_DECL_FSEEKO=1; HAVE_DECL_FTELLO=1; HAVE_DECL_GETDELIM=1; HAVE_DECL_GETLINE=1; HAVE_DECL_OBSTACK_PRINTF=1; HAVE_DECL_SNPRINTF=1; HAVE_DECL_VSNPRINTF=1; HAVE_DPRINTF=1; HAVE_FSEEKO=1; HAVE_FTELLO=1; HAVE_PCLOSE=1; HAVE_POPEN=1; HAVE_RENAMEAT=1; HAVE_VASPRINTF=1; HAVE_VDPRINTF=1; REPLACE_DPRINTF=0; REPLACE_FCLOSE=0; REPLACE_FDOPEN=0; REPLACE_FFLUSH=0; REPLACE_FOPEN=0; REPLACE_FOPEN_FOR_FOPEN_GNU=0; REPLACE_FPRINTF=0; REPLACE_FPURGE=0; REPLACE_FREOPEN=0; REPLACE_FSEEK=0; REPLACE_FSEEKO=0; REPLACE_FTELL=0; REPLACE_FTELLO=0; REPLACE_GETDELIM=0; REPLACE_GETLINE=0; REPLACE_OBSTACK_PRINTF=0; REPLACE_PERROR=0; REPLACE_POPEN=0; REPLACE_PRINTF=0; REPLACE_REMOVE=0; REPLACE_RENAME=0; REPLACE_RENAMEAT=0; REPLACE_SNPRINTF=0; REPLACE_SPRINTF=0; REPLACE_STDIO_READ_FUNCS=0; REPLACE_STDIO_WRITE_FUNCS=0; REPLACE_TMPFILE=0; REPLACE_VASPRINTF=0; REPLACE_VDPRINTF=0; REPLACE_VFPRINTF=0; REPLACE_VPRINTF=0; REPLACE_VSNPRINTF=0; REPLACE_VSPRINTF=0; ac_fn_check_decl "$LINENO" "getdelim" "ac_cv_have_decl_getdelim" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_getdelim" = xyes then : ac_have_decl=1 else $as_nop ac_have_decl=0 fi printf "%s\n" "#define HAVE_DECL_GETDELIM $ac_have_decl" >>confdefs.h GL_GNULIB_DPRINTF=0 GL_GNULIB_FCLOSE=0 GL_GNULIB_FDOPEN=0 GL_GNULIB_FFLUSH=0 GL_GNULIB_FGETC=0 GL_GNULIB_FGETS=0 GL_GNULIB_FOPEN=0 GL_GNULIB_FOPEN_GNU=0 GL_GNULIB_FPRINTF=0 GL_GNULIB_FPRINTF_POSIX=0 GL_GNULIB_FPURGE=0 GL_GNULIB_FPUTC=0 GL_GNULIB_FPUTS=0 GL_GNULIB_FREAD=0 GL_GNULIB_FREOPEN=0 GL_GNULIB_FSCANF=0 GL_GNULIB_FSEEK=0 GL_GNULIB_FSEEKO=0 GL_GNULIB_FTELL=0 GL_GNULIB_FTELLO=0 GL_GNULIB_FWRITE=0 GL_GNULIB_GETC=0 GL_GNULIB_GETCHAR=0 GL_GNULIB_GETDELIM=0 GL_GNULIB_GETLINE=0 GL_GNULIB_OBSTACK_PRINTF=0 GL_GNULIB_OBSTACK_PRINTF_POSIX=0 GL_GNULIB_PCLOSE=0 GL_GNULIB_PERROR=0 GL_GNULIB_POPEN=0 GL_GNULIB_PRINTF=0 GL_GNULIB_PRINTF_POSIX=0 GL_GNULIB_PUTC=0 GL_GNULIB_PUTCHAR=0 GL_GNULIB_PUTS=0 GL_GNULIB_REMOVE=0 GL_GNULIB_RENAME=0 GL_GNULIB_RENAMEAT=0 GL_GNULIB_SCANF=0 GL_GNULIB_SNPRINTF=0 GL_GNULIB_SPRINTF_POSIX=0 GL_GNULIB_STDIO_H_NONBLOCKING=0 GL_GNULIB_STDIO_H_SIGPIPE=0 GL_GNULIB_TMPFILE=0 GL_GNULIB_VASPRINTF=0 GL_GNULIB_VFSCANF=0 GL_GNULIB_VSCANF=0 GL_GNULIB_VDPRINTF=0 GL_GNULIB_VFPRINTF=0 GL_GNULIB_VFPRINTF_POSIX=0 GL_GNULIB_VPRINTF=0 GL_GNULIB_VPRINTF_POSIX=0 GL_GNULIB_VSNPRINTF=0 GL_GNULIB_VSPRINTF_POSIX=0 GL_GNULIB_MDA_FCLOSEALL=1 GL_GNULIB_MDA_FDOPEN=1 GL_GNULIB_MDA_FILENO=1 GL_GNULIB_MDA_GETW=1 GL_GNULIB_MDA_PUTW=1 GL_GNULIB_MDA_TEMPNAM=1 ac_fn_check_decl "$LINENO" "getdtablesize" "ac_cv_have_decl_getdtablesize" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_getdtablesize" = xyes then : ac_have_decl=1 else $as_nop ac_have_decl=0 fi printf "%s\n" "#define HAVE_DECL_GETDTABLESIZE $ac_have_decl" >>confdefs.h ac_fn_check_decl "$LINENO" "getline" "ac_cv_have_decl_getline" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_getline" = xyes then : ac_have_decl=1 else $as_nop ac_have_decl=0 fi printf "%s\n" "#define HAVE_DECL_GETLINE $ac_have_decl" >>confdefs.h if test $gl_cv_have_include_next = yes; then gl_cv_next_getopt_h='<'getopt.h'>' else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 printf %s "checking absolute name of ... " >&6; } if test ${gl_cv_next_getopt_h+y} then : printf %s "(cached) " >&6 else $as_nop if test $ac_cv_header_getopt_h = yes; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'getopt.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_absolute_getopt_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"` gl_header=$gl_cv_absolute_getopt_h gl_cv_next_getopt_h='"'$gl_header'"' else gl_cv_next_getopt_h='<'getopt.h'>' fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_getopt_h" >&5 printf "%s\n" "$gl_cv_next_getopt_h" >&6; } fi NEXT_GETOPT_H=$gl_cv_next_getopt_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'getopt.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_getopt_h fi NEXT_AS_FIRST_DIRECTIVE_GETOPT_H=$gl_next_as_first_directive if test $ac_cv_header_getopt_h = yes; then HAVE_GETOPT_H=1 else HAVE_GETOPT_H=0 fi gl_replace_getopt= if test -z "$gl_replace_getopt" && test $gl_getopt_required = GNU; then for ac_header in getopt.h do : ac_fn_c_check_header_compile "$LINENO" "getopt.h" "ac_cv_header_getopt_h" "$ac_includes_default" if test "x$ac_cv_header_getopt_h" = xyes then : printf "%s\n" "#define HAVE_GETOPT_H 1" >>confdefs.h else $as_nop gl_replace_getopt=yes fi done fi if test -z "$gl_replace_getopt" && test $gl_getopt_required = GNU; then for ac_func in getopt_long_only do : ac_fn_c_check_func "$LINENO" "getopt_long_only" "ac_cv_func_getopt_long_only" if test "x$ac_cv_func_getopt_long_only" = xyes then : printf "%s\n" "#define HAVE_GETOPT_LONG_ONLY 1" >>confdefs.h else $as_nop gl_replace_getopt=yes fi done fi if test -z "$gl_replace_getopt"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether getopt is POSIX compatible" >&5 printf %s "checking whether getopt is POSIX compatible... " >&6; } if test ${gl_cv_func_getopt_posix+y} then : printf %s "(cached) " >&6 else $as_nop if test $cross_compiling = no; then if test "$cross_compiling" = yes then : { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run test program while cross compiling See \`config.log' for more details" "$LINENO" 5; } else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { static char program[] = "program"; static char a[] = "-a"; static char foo[] = "foo"; static char bar[] = "bar"; char *argv[] = { program, a, foo, bar, NULL }; int c; c = getopt (4, argv, "ab"); if (!(c == 'a')) return 1; c = getopt (4, argv, "ab"); if (!(c == -1)) return 2; if (!(optind == 2)) return 3; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO" then : gl_cv_func_getopt_posix=maybe else $as_nop gl_cv_func_getopt_posix=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi if test $gl_cv_func_getopt_posix = maybe; then if test "$cross_compiling" = yes then : { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run test program while cross compiling See \`config.log' for more details" "$LINENO" 5; } else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { static char program[] = "program"; static char donald[] = "donald"; static char p[] = "-p"; static char billy[] = "billy"; static char duck[] = "duck"; static char a[] = "-a"; static char bar[] = "bar"; char *argv[] = { program, donald, p, billy, duck, a, bar, NULL }; int c; c = getopt (7, argv, "+abp:q:"); if (!(c == -1)) return 4; if (!(strcmp (argv[0], "program") == 0)) return 5; if (!(strcmp (argv[1], "donald") == 0)) return 6; if (!(strcmp (argv[2], "-p") == 0)) return 7; if (!(strcmp (argv[3], "billy") == 0)) return 8; if (!(strcmp (argv[4], "duck") == 0)) return 9; if (!(strcmp (argv[5], "-a") == 0)) return 10; if (!(strcmp (argv[6], "bar") == 0)) return 11; if (!(optind == 1)) return 12; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO" then : gl_cv_func_getopt_posix=maybe else $as_nop gl_cv_func_getopt_posix=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi if test $gl_cv_func_getopt_posix = maybe; then if test "$cross_compiling" = yes then : { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run test program while cross compiling See \`config.log' for more details" "$LINENO" 5; } else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { static char program[] = "program"; static char ab[] = "-ab"; char *argv[3] = { program, ab, NULL }; if (getopt (2, argv, "ab:") != 'a') return 13; if (getopt (2, argv, "ab:") != '?') return 14; if (optopt != 'b') return 15; if (optind != 2) return 16; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO" then : gl_cv_func_getopt_posix=yes else $as_nop gl_cv_func_getopt_posix=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi else case "$host_os" in darwin* | aix* | mingw*) gl_cv_func_getopt_posix="guessing no";; *) gl_cv_func_getopt_posix="guessing yes";; esac fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_getopt_posix" >&5 printf "%s\n" "$gl_cv_func_getopt_posix" >&6; } case "$gl_cv_func_getopt_posix" in *no) gl_replace_getopt=yes ;; esac fi if test -z "$gl_replace_getopt" && test $gl_getopt_required = GNU; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working GNU getopt function" >&5 printf %s "checking for working GNU getopt function... " >&6; } if test ${gl_cv_func_getopt_gnu+y} then : printf %s "(cached) " >&6 else $as_nop # Even with POSIXLY_CORRECT, the GNU extension of leading '-' in the # optstring is necessary for programs like m4 that have POSIX-mandated # semantics for supporting options interspersed with files. # Also, since getopt_long is a GNU extension, we require optind=0. # Bash ties 'set -o posix' to a non-exported POSIXLY_CORRECT; # so take care to revert to the correct (non-)export state. gl_awk_probe='BEGIN { if ("POSIXLY_CORRECT" in ENVIRON) print "x" }' case ${POSIXLY_CORRECT+x}`$AWK "$gl_awk_probe" conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include #if defined __MACH__ && defined __APPLE__ /* Avoid a crash on Mac OS X. */ #include #include #include #include #include #include /* The exception port on which our thread listens. */ static mach_port_t our_exception_port; /* The main function of the thread listening for exceptions of type EXC_BAD_ACCESS. */ static void * mach_exception_thread (void *arg) { /* Buffer for a message to be received. */ struct { mach_msg_header_t head; mach_msg_body_t msgh_body; char data[1024]; } msg; mach_msg_return_t retval; /* Wait for a message on the exception port. */ retval = mach_msg (&msg.head, MACH_RCV_MSG | MACH_RCV_LARGE, 0, sizeof (msg), our_exception_port, MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL); if (retval != MACH_MSG_SUCCESS) abort (); exit (1); } static void nocrash_init (void) { mach_port_t self = mach_task_self (); /* Allocate a port on which the thread shall listen for exceptions. */ if (mach_port_allocate (self, MACH_PORT_RIGHT_RECEIVE, &our_exception_port) == KERN_SUCCESS) { /* See https://web.mit.edu/darwin/src/modules/xnu/osfmk/man/mach_port_insert_right.html. */ if (mach_port_insert_right (self, our_exception_port, our_exception_port, MACH_MSG_TYPE_MAKE_SEND) == KERN_SUCCESS) { /* The exceptions we want to catch. Only EXC_BAD_ACCESS is interesting for us. */ exception_mask_t mask = EXC_MASK_BAD_ACCESS; /* Create the thread listening on the exception port. */ pthread_attr_t attr; pthread_t thread; if (pthread_attr_init (&attr) == 0 && pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED) == 0 && pthread_create (&thread, &attr, mach_exception_thread, NULL) == 0) { pthread_attr_destroy (&attr); /* Replace the exception port info for these exceptions with our own. Note that we replace the exception port for the entire task, not only for a particular thread. This has the effect that when our exception port gets the message, the thread specific exception port has already been asked, and we don't need to bother about it. See https://web.mit.edu/darwin/src/modules/xnu/osfmk/man/task_set_exception_ports.html. */ task_set_exception_ports (self, mask, our_exception_port, EXCEPTION_DEFAULT, MACHINE_THREAD_STATE); } } } } #elif defined _WIN32 && ! defined __CYGWIN__ /* Avoid a crash on native Windows. */ #define WIN32_LEAN_AND_MEAN #include #include static LONG WINAPI exception_filter (EXCEPTION_POINTERS *ExceptionInfo) { switch (ExceptionInfo->ExceptionRecord->ExceptionCode) { case EXCEPTION_ACCESS_VIOLATION: case EXCEPTION_IN_PAGE_ERROR: case EXCEPTION_STACK_OVERFLOW: case EXCEPTION_GUARD_PAGE: case EXCEPTION_PRIV_INSTRUCTION: case EXCEPTION_ILLEGAL_INSTRUCTION: case EXCEPTION_DATATYPE_MISALIGNMENT: case EXCEPTION_ARRAY_BOUNDS_EXCEEDED: case EXCEPTION_NONCONTINUABLE_EXCEPTION: exit (1); } return EXCEPTION_CONTINUE_SEARCH; } static void nocrash_init (void) { SetUnhandledExceptionFilter ((LPTOP_LEVEL_EXCEPTION_FILTER) exception_filter); } #else /* Avoid a crash on POSIX systems. */ #include #include /* A POSIX signal handler. */ static void exception_handler (int sig) { _exit (1); } static void nocrash_init (void) { #ifdef SIGSEGV signal (SIGSEGV, exception_handler); #endif #ifdef SIGBUS signal (SIGBUS, exception_handler); #endif } #endif int main (void) { int result = 0; nocrash_init(); /* This code succeeds on glibc 2.8, OpenBSD 4.0, Cygwin, mingw, and fails on Mac OS X 10.5, AIX 5.2, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10. */ { static char conftest[] = "conftest"; static char plus[] = "-+"; char *argv[3] = { conftest, plus, NULL }; opterr = 0; if (getopt (2, argv, "+a") != '?') result |= 1; } /* This code succeeds on glibc 2.8, mingw, and fails on Mac OS X 10.5, OpenBSD 4.0, AIX 5.2, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x. */ { static char program[] = "program"; static char p[] = "-p"; static char foo[] = "foo"; static char bar[] = "bar"; char *argv[] = { program, p, foo, bar, NULL }; optind = 1; if (getopt (4, argv, "p::") != 'p') result |= 2; else if (optarg != NULL) result |= 4; else if (getopt (4, argv, "p::") != -1) result |= 6; else if (optind != 2) result |= 8; } /* This code succeeds on glibc 2.8 and fails on Cygwin 1.7.0. */ { static char program[] = "program"; static char foo[] = "foo"; static char p[] = "-p"; char *argv[] = { program, foo, p, NULL }; optind = 0; if (getopt (3, argv, "-p") != 1) result |= 16; else if (getopt (3, argv, "-p") != 'p') result |= 16; } /* This code fails on glibc 2.11. */ { static char program[] = "program"; static char b[] = "-b"; static char a[] = "-a"; char *argv[] = { program, b, a, NULL }; optind = opterr = 0; if (getopt (3, argv, "+:a:b") != 'b') result |= 32; else if (getopt (3, argv, "+:a:b") != ':') result |= 32; } /* This code dumps core on glibc 2.14. */ { static char program[] = "program"; static char w[] = "-W"; static char dummy[] = "dummy"; char *argv[] = { program, w, dummy, NULL }; optind = opterr = 1; if (getopt (3, argv, "W;") != 'W') result |= 64; } return result; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO" then : gl_cv_func_getopt_gnu=yes else $as_nop gl_cv_func_getopt_gnu=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi case $gl_had_POSIXLY_CORRECT in exported) ;; yes) { POSIXLY_CORRECT=; unset POSIXLY_CORRECT;}; POSIXLY_CORRECT=1 ;; *) { POSIXLY_CORRECT=; unset POSIXLY_CORRECT;} ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_getopt_gnu" >&5 printf "%s\n" "$gl_cv_func_getopt_gnu" >&6; } if test "$gl_cv_func_getopt_gnu" != yes; then gl_replace_getopt=yes else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working GNU getopt_long function" >&5 printf %s "checking for working GNU getopt_long function... " >&6; } if test ${gl_cv_func_getopt_long_gnu+y} then : printf %s "(cached) " >&6 else $as_nop if test "$cross_compiling" = yes then : case "$host_os" in openbsd*) gl_cv_func_getopt_long_gnu="guessing no";; *) gl_cv_func_getopt_long_gnu="guessing yes";; esac else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main (void) { static const struct option long_options[] = { { "xtremely-",no_argument, NULL, 1003 }, { "xtra", no_argument, NULL, 1001 }, { "xtreme", no_argument, NULL, 1002 }, { "xtremely", no_argument, NULL, 1003 }, { NULL, 0, NULL, 0 } }; /* This code fails on OpenBSD 5.0. */ { static char program[] = "program"; static char xtremel[] = "--xtremel"; char *argv[] = { program, xtremel, NULL }; int option_index; optind = 1; opterr = 0; if (getopt_long (2, argv, "", long_options, &option_index) != 1003) return 1; } return 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO" then : gl_cv_func_getopt_long_gnu=yes else $as_nop gl_cv_func_getopt_long_gnu=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_getopt_long_gnu" >&5 printf "%s\n" "$gl_cv_func_getopt_long_gnu" >&6; } case "$gl_cv_func_getopt_long_gnu" in *yes) ;; *) gl_replace_getopt=yes ;; esac fi fi if test -z "$gl_pthreadlib_body_done"; then gl_pthread_api=no LIBPTHREAD= LIBPMULTITHREAD= # On OSF/1, the compiler needs the flag -pthread or -D_REENTRANT so that # it groks . It's added above, in gl_ANYTHREADLIB_EARLY. ac_fn_c_check_header_compile "$LINENO" "pthread.h" "ac_cv_header_pthread_h" "$ac_includes_default" if test "x$ac_cv_header_pthread_h" = xyes then : gl_have_pthread_h=yes else $as_nop gl_have_pthread_h=no fi if test "$gl_have_pthread_h" = yes; then # Other possible tests: # -lpthreads (FSU threads, PCthreads) # -lgthreads # Test whether both pthread_mutex_lock and pthread_mutexattr_init exist # in libc. IRIX 6.5 has the first one in both libc and libpthread, but # the second one only in libpthread, and lock.c needs it. # # If -pthread works, prefer it to -lpthread, since Ubuntu 14.04 # needs -pthread for some reason. See: # https://lists.gnu.org/r/bug-gnulib/2014-09/msg00023.html save_LIBS=$LIBS for gl_pthread in '' '-pthread'; do LIBS="$LIBS $gl_pthread" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include pthread_mutex_t m; pthread_mutexattr_t ma; int main (void) { pthread_mutex_lock (&m); pthread_mutexattr_init (&ma); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : gl_pthread_api=yes LIBPTHREAD=$gl_pthread LIBPMULTITHREAD=$gl_pthread fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$save_LIBS test $gl_pthread_api = yes && break done echo "$as_me:19081: gl_pthread_api=$gl_pthread_api" >&5 echo "$as_me:19082: LIBPTHREAD=$LIBPTHREAD" >&5 gl_pthread_in_glibc=no # On Linux with glibc >= 2.34, libc contains the fully functional # pthread functions. case "$host_os" in linux*) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef __GNU_LIBRARY__ #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 34) || (__GLIBC__ > 2) Lucky user #endif #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "Lucky user" >/dev/null 2>&1 then : gl_pthread_in_glibc=yes fi rm -rf conftest* ;; esac echo "$as_me:19108: gl_pthread_in_glibc=$gl_pthread_in_glibc" >&5 # Test for libpthread by looking for pthread_kill. (Not pthread_self, # since it is defined as a macro on OSF/1.) if test $gl_pthread_api = yes && test -z "$LIBPTHREAD"; then # The program links fine without libpthread. But it may actually # need to link with libpthread in order to create multiple threads. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pthread_kill in -lpthread" >&5 printf %s "checking for pthread_kill in -lpthread... " >&6; } if test ${ac_cv_lib_pthread_pthread_kill+y} then : printf %s "(cached) " >&6 else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-lpthread $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ char pthread_kill (); int main (void) { return pthread_kill (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_pthread_pthread_kill=yes else $as_nop ac_cv_lib_pthread_pthread_kill=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_kill" >&5 printf "%s\n" "$ac_cv_lib_pthread_pthread_kill" >&6; } if test "x$ac_cv_lib_pthread_pthread_kill" = xyes then : if test $gl_pthread_in_glibc = yes; then LIBPMULTITHREAD= else LIBPMULTITHREAD=-lpthread # On Solaris and HP-UX, most pthread functions exist also in libc. # Therefore pthread_in_use() needs to actually try to create a # thread: pthread_create from libc will fail, whereas # pthread_create will actually create a thread. # On Solaris 10 or newer, this test is no longer needed, because # libc contains the fully functional pthread functions. case "$host_os" in solaris | solaris2.1-9 | solaris2.1-9.* | hpux*) printf "%s\n" "#define PTHREAD_IN_USE_DETECTION_HARD 1" >>confdefs.h esac fi fi elif test $gl_pthread_api != yes; then # Some library is needed. Try libpthread and libc_r. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pthread_kill in -lpthread" >&5 printf %s "checking for pthread_kill in -lpthread... " >&6; } if test ${ac_cv_lib_pthread_pthread_kill+y} then : printf %s "(cached) " >&6 else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-lpthread $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ char pthread_kill (); int main (void) { return pthread_kill (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_pthread_pthread_kill=yes else $as_nop ac_cv_lib_pthread_pthread_kill=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_kill" >&5 printf "%s\n" "$ac_cv_lib_pthread_pthread_kill" >&6; } if test "x$ac_cv_lib_pthread_pthread_kill" = xyes then : gl_pthread_api=yes LIBPTHREAD=-lpthread LIBPMULTITHREAD=-lpthread fi if test $gl_pthread_api != yes; then # For FreeBSD 4. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pthread_kill in -lc_r" >&5 printf %s "checking for pthread_kill in -lc_r... " >&6; } if test ${ac_cv_lib_c_r_pthread_kill+y} then : printf %s "(cached) " >&6 else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-lc_r $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ char pthread_kill (); int main (void) { return pthread_kill (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_c_r_pthread_kill=yes else $as_nop ac_cv_lib_c_r_pthread_kill=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_r_pthread_kill" >&5 printf "%s\n" "$ac_cv_lib_c_r_pthread_kill" >&6; } if test "x$ac_cv_lib_c_r_pthread_kill" = xyes then : gl_pthread_api=yes LIBPTHREAD=-lc_r LIBPMULTITHREAD=-lc_r fi fi fi echo "$as_me:19262: LIBPMULTITHREAD=$LIBPMULTITHREAD" >&5 fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether POSIX threads API is available" >&5 printf %s "checking whether POSIX threads API is available... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_pthread_api" >&5 printf "%s\n" "$gl_pthread_api" >&6; } if test $gl_pthread_api = yes; then printf "%s\n" "#define HAVE_PTHREAD_API 1" >>confdefs.h fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { sched_yield (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : LIB_SCHED_YIELD= else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sched_yield in -lrt" >&5 printf %s "checking for sched_yield in -lrt... " >&6; } if test ${ac_cv_lib_rt_sched_yield+y} then : printf %s "(cached) " >&6 else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-lrt $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ char sched_yield (); int main (void) { return sched_yield (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_rt_sched_yield=yes else $as_nop ac_cv_lib_rt_sched_yield=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rt_sched_yield" >&5 printf "%s\n" "$ac_cv_lib_rt_sched_yield" >&6; } if test "x$ac_cv_lib_rt_sched_yield" = xyes then : LIB_SCHED_YIELD=-lrt else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sched_yield in -lposix4" >&5 printf %s "checking for sched_yield in -lposix4... " >&6; } if test ${ac_cv_lib_posix4_sched_yield+y} then : printf %s "(cached) " >&6 else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-lposix4 $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ char sched_yield (); int main (void) { return sched_yield (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_posix4_sched_yield=yes else $as_nop ac_cv_lib_posix4_sched_yield=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_posix4_sched_yield" >&5 printf "%s\n" "$ac_cv_lib_posix4_sched_yield" >&6; } if test "x$ac_cv_lib_posix4_sched_yield" = xyes then : LIB_SCHED_YIELD=-lposix4 fi fi fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext gl_pthreadlib_body_done=done fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether setlocale (LC_ALL, NULL) is multithread-safe" >&5 printf %s "checking whether setlocale (LC_ALL, NULL) is multithread-safe... " >&6; } if test ${gl_cv_func_setlocale_null_all_mtsafe+y} then : printf %s "(cached) " >&6 else $as_nop case "$host_os" in # Guess no on musl libc, macOS, FreeBSD, NetBSD, OpenBSD, AIX, Haiku, Cygwin. *-musl* | darwin* | freebsd* | midnightbsd* | netbsd* | openbsd* | aix* | haiku* | cygwin*) gl_cv_func_setlocale_null_all_mtsafe=no ;; # Guess yes on glibc, HP-UX, IRIX, Solaris, native Windows. *-gnu* | gnu* | hpux* | irix* | solaris* | mingw*) gl_cv_func_setlocale_null_all_mtsafe=yes ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_setlocale_null_all_mtsafe="$gl_cross_guess_normal" ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_setlocale_null_all_mtsafe" >&5 printf "%s\n" "$gl_cv_func_setlocale_null_all_mtsafe" >&6; } case "$host_os" in mingw*) ;; *) if test $gl_pthread_api = no && test $ac_cv_header_threads_h = no; then gl_cv_func_setlocale_null_all_mtsafe="trivially yes" fi ;; esac case "$gl_cv_func_setlocale_null_all_mtsafe" in *yes) SETLOCALE_NULL_ALL_MTSAFE=1 ;; *) SETLOCALE_NULL_ALL_MTSAFE=0 ;; esac printf "%s\n" "#define SETLOCALE_NULL_ALL_MTSAFE $SETLOCALE_NULL_ALL_MTSAFE" >>confdefs.h { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether setlocale (category, NULL) is multithread-safe" >&5 printf %s "checking whether setlocale (category, NULL) is multithread-safe... " >&6; } if test ${gl_cv_func_setlocale_null_one_mtsafe+y} then : printf %s "(cached) " >&6 else $as_nop case "$host_os" in # Guess no on OpenBSD, AIX. openbsd* | aix*) gl_cv_func_setlocale_null_one_mtsafe=no ;; # Guess yes on glibc, musl libc, macOS, FreeBSD, NetBSD, HP-UX, IRIX, Solaris, Haiku, Cygwin, native Windows. *-gnu* | gnu* | *-musl* | darwin* | freebsd* | midnightbsd* | netbsd* | hpux* | irix* | solaris* | haiku* | cygwin* | mingw*) gl_cv_func_setlocale_null_one_mtsafe=yes ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_setlocale_null_one_mtsafe="$gl_cross_guess_normal" ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_setlocale_null_one_mtsafe" >&5 printf "%s\n" "$gl_cv_func_setlocale_null_one_mtsafe" >&6; } case "$host_os" in mingw*) ;; *) if test $gl_pthread_api = no && test $ac_cv_header_threads_h = no; then gl_cv_func_setlocale_null_one_mtsafe="trivially yes" fi ;; esac case "$gl_cv_func_setlocale_null_one_mtsafe" in *yes) SETLOCALE_NULL_ONE_MTSAFE=1 ;; *) SETLOCALE_NULL_ONE_MTSAFE=0 ;; esac printf "%s\n" "#define SETLOCALE_NULL_ONE_MTSAFE $SETLOCALE_NULL_ONE_MTSAFE" >>confdefs.h if test $SETLOCALE_NULL_ALL_MTSAFE = 0 || test $SETLOCALE_NULL_ONE_MTSAFE = 0; then case "$host_os" in mingw*) LIB_SETLOCALE_NULL= ;; *) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether imported symbols can be declared weak" >&5 printf %s "checking whether imported symbols can be declared weak... " >&6; } if test ${gl_cv_have_weak+y} then : printf %s "(cached) " >&6 else $as_nop case "$host_os" in cygwin*) gl_cv_have_weak="guessing no" ;; *) gl_cv_have_weak=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ extern void xyzzy (); #pragma weak xyzzy int main (void) { xyzzy(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : gl_cv_have_weak=maybe fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext if test $gl_cv_have_weak = maybe; then if test "$cross_compiling" = yes then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __ELF__ Extensible Linking Format #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "Extensible Linking Format" >/dev/null 2>&1 then : gl_cv_have_weak="guessing yes" else $as_nop gl_cv_have_weak="guessing no" fi rm -rf conftest* else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #pragma weak fputs int main () { return (fputs == NULL); } _ACEOF if ac_fn_c_try_run "$LINENO" then : gl_cv_have_weak=yes else $as_nop gl_cv_have_weak=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi ;; esac case " $LDFLAGS " in *" -static "*) gl_cv_have_weak=no ;; esac case "$gl_cv_have_weak" in *yes) case "$host_os" in freebsd* | dragonfly* | midnightbsd*) : > conftest1.c $CC $CPPFLAGS $CFLAGS $LDFLAGS -fPIC -shared -o libempty.so conftest1.c -lpthread >&5 2>&1 cat < conftest2.c #include #pragma weak pthread_mutexattr_gettype int main () { return (pthread_mutexattr_gettype != NULL); } EOF $CC $CPPFLAGS $CFLAGS $LDFLAGS -o conftest conftest2.c libempty.so >&5 2>&1 \ || gl_cv_have_weak=no rm -f conftest1.c libempty.so conftest2.c conftest ;; esac ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_have_weak" >&5 printf "%s\n" "$gl_cv_have_weak" >&6; } case "$gl_cv_have_weak" in *yes) printf "%s\n" "#define HAVE_WEAK_SYMBOLS 1" >>confdefs.h ;; esac case "$gl_cv_have_weak" in *yes) LIB_SETLOCALE_NULL= ;; *) LIB_SETLOCALE_NULL="$LIBPTHREAD" ;; esac ;; esac else LIB_SETLOCALE_NULL= fi if test $gl_cv_have_include_next = yes; then gl_cv_next_limits_h='<'limits.h'>' else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 printf %s "checking absolute name of ... " >&6; } if test ${gl_cv_next_limits_h+y} then : printf %s "(cached) " >&6 else $as_nop if test $ac_cv_header_limits_h = yes; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'limits.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_absolute_limits_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"` gl_header=$gl_cv_absolute_limits_h gl_cv_next_limits_h='"'$gl_header'"' else gl_cv_next_limits_h='<'limits.h'>' fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_limits_h" >&5 printf "%s\n" "$gl_cv_next_limits_h" >&6; } fi NEXT_LIMITS_H=$gl_cv_next_limits_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'limits.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_limits_h fi NEXT_AS_FIRST_DIRECTIVE_LIMITS_H=$gl_next_as_first_directive { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether limits.h has WORD_BIT, BOOL_WIDTH etc." >&5 printf %s "checking whether limits.h has WORD_BIT, BOOL_WIDTH etc.... " >&6; } if test ${gl_cv_header_limits_width+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __STDC_WANT_IEC_60559_BFP_EXT__ #define __STDC_WANT_IEC_60559_BFP_EXT__ 1 #endif #include long long llm = LLONG_MAX; int wb = WORD_BIT; int ullw = ULLONG_WIDTH; int bw = BOOL_WIDTH; int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : gl_cv_header_limits_width=yes else $as_nop gl_cv_header_limits_width=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_limits_width" >&5 printf "%s\n" "$gl_cv_header_limits_width" >&6; } if test "$gl_cv_header_limits_width" = yes; then GL_GENERATE_LIMITS_H=false else GL_GENERATE_LIMITS_H=true fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for wint_t" >&5 printf %s "checking for wint_t... " >&6; } if test ${gt_cv_c_wint_t+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include wint_t foo = (wchar_t)'\0'; int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : gt_cv_c_wint_t=yes else $as_nop gt_cv_c_wint_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gt_cv_c_wint_t" >&5 printf "%s\n" "$gt_cv_c_wint_t" >&6; } if test $gt_cv_c_wint_t = yes; then printf "%s\n" "#define HAVE_WINT_T 1" >>confdefs.h { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether wint_t is large enough" >&5 printf %s "checking whether wint_t is large enough... " >&6; } if test ${gl_cv_type_wint_t_large_enough+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int verify[sizeof (wint_t) < sizeof (int) ? -1 : 1]; int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : gl_cv_type_wint_t_large_enough=yes else $as_nop gl_cv_type_wint_t_large_enough=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_type_wint_t_large_enough" >&5 printf "%s\n" "$gl_cv_type_wint_t_large_enough" >&6; } if test $gl_cv_type_wint_t_large_enough = no; then GNULIBHEADERS_OVERRIDE_WINT_T=1 else GNULIBHEADERS_OVERRIDE_WINT_T=0 fi else GNULIBHEADERS_OVERRIDE_WINT_T=0 fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler produces multi-arch binaries" >&5 printf %s "checking whether the compiler produces multi-arch binaries... " >&6; } if test ${gl_cv_c_multiarch+y} then : printf %s "(cached) " >&6 else $as_nop gl_cv_c_multiarch=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __APPLE_CC__ not a universal capable compiler #endif typedef int dummy; _ACEOF if ac_fn_c_try_compile "$LINENO" then : arch= prev= for word in ${CC} ${CFLAGS} ${CPPFLAGS} ${LDFLAGS}; do if test -n "$prev"; then case $word in i?86 | x86_64 | ppc | ppc64 | arm | arm64) if test -z "$arch" || test "$arch" = "$word"; then arch="$word" else gl_cv_c_multiarch=yes fi ;; esac prev= else if test "x$word" = "x-arch"; then prev=arch fi fi done fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_c_multiarch" >&5 printf "%s\n" "$gl_cv_c_multiarch" >&6; } if test $gl_cv_c_multiarch = yes; then APPLE_UNIVERSAL_BUILD=1 else APPLE_UNIVERSAL_BUILD=0 fi printf "%s\n" "#define HAVE_LONG_LONG_INT 1" >>confdefs.h printf "%s\n" "#define HAVE_UNSIGNED_LONG_LONG_INT 1" >>confdefs.h if test $ac_cv_header_wchar_h = yes; then HAVE_WCHAR_H=1 else HAVE_WCHAR_H=0 fi if test $ac_cv_header_inttypes_h = yes; then HAVE_INTTYPES_H=1 else HAVE_INTTYPES_H=0 fi if test $ac_cv_header_sys_types_h = yes; then HAVE_SYS_TYPES_H=1 else HAVE_SYS_TYPES_H=0 fi if test $gl_cv_have_include_next = yes; then gl_cv_next_stdint_h='<'stdint.h'>' else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 printf %s "checking absolute name of ... " >&6; } if test ${gl_cv_next_stdint_h+y} then : printf %s "(cached) " >&6 else $as_nop if test $ac_cv_header_stdint_h = yes; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'stdint.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_absolute_stdint_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"` gl_header=$gl_cv_absolute_stdint_h gl_cv_next_stdint_h='"'$gl_header'"' else gl_cv_next_stdint_h='<'stdint.h'>' fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_stdint_h" >&5 printf "%s\n" "$gl_cv_next_stdint_h" >&6; } fi NEXT_STDINT_H=$gl_cv_next_stdint_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'stdint.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_stdint_h fi NEXT_AS_FIRST_DIRECTIVE_STDINT_H=$gl_next_as_first_directive if test $ac_cv_header_stdint_h = yes; then HAVE_STDINT_H=1 else HAVE_STDINT_H=0 fi if test $ac_cv_header_stdint_h = yes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether stdint.h conforms to C99" >&5 printf %s "checking whether stdint.h conforms to C99... " >&6; } if test ${gl_cv_header_working_stdint_h+y} then : printf %s "(cached) " >&6 else $as_nop gl_cv_header_working_stdint_h=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1 /* work if build isn't clean */ #define __STDC_CONSTANT_MACROS 1 #define __STDC_LIMIT_MACROS 1 #include /* Dragonfly defines WCHAR_MIN, WCHAR_MAX only in . */ #if !(defined WCHAR_MIN && defined WCHAR_MAX) #error "WCHAR_MIN, WCHAR_MAX not defined in " #endif #include #include #if HAVE_WCHAR_H # include #endif #ifdef INT8_MAX int8_t a1 = INT8_MAX; int8_t a1min = INT8_MIN; #endif #ifdef INT16_MAX int16_t a2 = INT16_MAX; int16_t a2min = INT16_MIN; #endif #ifdef INT32_MAX int32_t a3 = INT32_MAX; int32_t a3min = INT32_MIN; #endif #ifdef INT64_MAX int64_t a4 = INT64_MAX; int64_t a4min = INT64_MIN; #endif #ifdef UINT8_MAX uint8_t b1 = UINT8_MAX; #else typedef int b1[(unsigned char) -1 != 255 ? 1 : -1]; #endif #ifdef UINT16_MAX uint16_t b2 = UINT16_MAX; #endif #ifdef UINT32_MAX uint32_t b3 = UINT32_MAX; #endif #ifdef UINT64_MAX uint64_t b4 = UINT64_MAX; #endif int_least8_t c1 = INT8_C (0x7f); int_least8_t c1max = INT_LEAST8_MAX; int_least8_t c1min = INT_LEAST8_MIN; int_least16_t c2 = INT16_C (0x7fff); int_least16_t c2max = INT_LEAST16_MAX; int_least16_t c2min = INT_LEAST16_MIN; int_least32_t c3 = INT32_C (0x7fffffff); int_least32_t c3max = INT_LEAST32_MAX; int_least32_t c3min = INT_LEAST32_MIN; int_least64_t c4 = INT64_C (0x7fffffffffffffff); int_least64_t c4max = INT_LEAST64_MAX; int_least64_t c4min = INT_LEAST64_MIN; uint_least8_t d1 = UINT8_C (0xff); uint_least8_t d1max = UINT_LEAST8_MAX; uint_least16_t d2 = UINT16_C (0xffff); uint_least16_t d2max = UINT_LEAST16_MAX; uint_least32_t d3 = UINT32_C (0xffffffff); uint_least32_t d3max = UINT_LEAST32_MAX; uint_least64_t d4 = UINT64_C (0xffffffffffffffff); uint_least64_t d4max = UINT_LEAST64_MAX; int_fast8_t e1 = INT_FAST8_MAX; int_fast8_t e1min = INT_FAST8_MIN; int_fast16_t e2 = INT_FAST16_MAX; int_fast16_t e2min = INT_FAST16_MIN; int_fast32_t e3 = INT_FAST32_MAX; int_fast32_t e3min = INT_FAST32_MIN; int_fast64_t e4 = INT_FAST64_MAX; int_fast64_t e4min = INT_FAST64_MIN; uint_fast8_t f1 = UINT_FAST8_MAX; uint_fast16_t f2 = UINT_FAST16_MAX; uint_fast32_t f3 = UINT_FAST32_MAX; uint_fast64_t f4 = UINT_FAST64_MAX; #ifdef INTPTR_MAX intptr_t g = INTPTR_MAX; intptr_t gmin = INTPTR_MIN; #endif #ifdef UINTPTR_MAX uintptr_t h = UINTPTR_MAX; #endif intmax_t i = INTMAX_MAX; uintmax_t j = UINTMAX_MAX; /* Check that SIZE_MAX has the correct type, if possible. */ #if 201112 <= __STDC_VERSION__ int k = _Generic (SIZE_MAX, size_t: 0); #elif (2 <= __GNUC__ || 4 <= __clang_major__ || defined __IBM__TYPEOF__ \ || (0x5110 <= __SUNPRO_C && !__STDC__)) extern size_t k; extern __typeof__ (SIZE_MAX) k; #endif #include /* for CHAR_BIT */ #define TYPE_MINIMUM(t) \ ((t) ((t) 0 < (t) -1 ? (t) 0 : ~ TYPE_MAXIMUM (t))) #define TYPE_MAXIMUM(t) \ ((t) ((t) 0 < (t) -1 \ ? (t) -1 \ : ((((t) 1 << (sizeof (t) * CHAR_BIT - 2)) - 1) * 2 + 1))) struct s { int check_PTRDIFF: PTRDIFF_MIN == TYPE_MINIMUM (ptrdiff_t) && PTRDIFF_MAX == TYPE_MAXIMUM (ptrdiff_t) ? 1 : -1; /* Detect bug in FreeBSD 6.0/ia64 and FreeBSD 13.0/arm64. */ int check_SIG_ATOMIC: SIG_ATOMIC_MIN == TYPE_MINIMUM (sig_atomic_t) && SIG_ATOMIC_MAX == TYPE_MAXIMUM (sig_atomic_t) ? 1 : -1; int check_SIZE: SIZE_MAX == TYPE_MAXIMUM (size_t) ? 1 : -1; int check_WCHAR: WCHAR_MIN == TYPE_MINIMUM (wchar_t) && WCHAR_MAX == TYPE_MAXIMUM (wchar_t) ? 1 : -1; /* Detect bug in mingw. */ int check_WINT: WINT_MIN == TYPE_MINIMUM (wint_t) && WINT_MAX == TYPE_MAXIMUM (wint_t) ? 1 : -1; /* Detect bugs in glibc 2.4 and Solaris 10 stdint.h, among others. */ int check_UINT8_C: (-1 < UINT8_C (0)) == (-1 < (uint_least8_t) 0) ? 1 : -1; int check_UINT16_C: (-1 < UINT16_C (0)) == (-1 < (uint_least16_t) 0) ? 1 : -1; /* Detect bugs in OpenBSD 3.9 stdint.h. */ #ifdef UINT8_MAX int check_uint8: (uint8_t) -1 == UINT8_MAX ? 1 : -1; #endif #ifdef UINT16_MAX int check_uint16: (uint16_t) -1 == UINT16_MAX ? 1 : -1; #endif #ifdef UINT32_MAX int check_uint32: (uint32_t) -1 == UINT32_MAX ? 1 : -1; #endif #ifdef UINT64_MAX int check_uint64: (uint64_t) -1 == UINT64_MAX ? 1 : -1; #endif int check_uint_least8: (uint_least8_t) -1 == UINT_LEAST8_MAX ? 1 : -1; int check_uint_least16: (uint_least16_t) -1 == UINT_LEAST16_MAX ? 1 : -1; int check_uint_least32: (uint_least32_t) -1 == UINT_LEAST32_MAX ? 1 : -1; int check_uint_least64: (uint_least64_t) -1 == UINT_LEAST64_MAX ? 1 : -1; int check_uint_fast8: (uint_fast8_t) -1 == UINT_FAST8_MAX ? 1 : -1; int check_uint_fast16: (uint_fast16_t) -1 == UINT_FAST16_MAX ? 1 : -1; int check_uint_fast32: (uint_fast32_t) -1 == UINT_FAST32_MAX ? 1 : -1; int check_uint_fast64: (uint_fast64_t) -1 == UINT_FAST64_MAX ? 1 : -1; int check_uintptr: (uintptr_t) -1 == UINTPTR_MAX ? 1 : -1; int check_uintmax: (uintmax_t) -1 == UINTMAX_MAX ? 1 : -1; int check_size: (size_t) -1 == SIZE_MAX ? 1 : -1; }; int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : if test "$cross_compiling" = yes then : case "$host_os" in # Guess yes on native Windows. mingw*) gl_cv_header_working_stdint_h="guessing yes" ;; # In general, assume it works. *) gl_cv_header_working_stdint_h="guessing yes" ;; esac else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1 /* work if build isn't clean */ #define __STDC_CONSTANT_MACROS 1 #define __STDC_LIMIT_MACROS 1 #include #include #include #if HAVE_WCHAR_H # include #endif #include #include #define MVAL(macro) MVAL1(macro) #define MVAL1(expression) #expression static const char *macro_values[] = { #ifdef INT8_MAX MVAL (INT8_MAX), #endif #ifdef INT16_MAX MVAL (INT16_MAX), #endif #ifdef INT32_MAX MVAL (INT32_MAX), #endif #ifdef INT64_MAX MVAL (INT64_MAX), #endif #ifdef UINT8_MAX MVAL (UINT8_MAX), #endif #ifdef UINT16_MAX MVAL (UINT16_MAX), #endif #ifdef UINT32_MAX MVAL (UINT32_MAX), #endif #ifdef UINT64_MAX MVAL (UINT64_MAX), #endif NULL }; int main (void) { const char **mv; for (mv = macro_values; *mv != NULL; mv++) { const char *value = *mv; /* Test whether it looks like a cast expression. */ if (strncmp (value, "((unsigned int)"/*)*/, 15) == 0 || strncmp (value, "((unsigned short)"/*)*/, 17) == 0 || strncmp (value, "((unsigned char)"/*)*/, 16) == 0 || strncmp (value, "((int)"/*)*/, 6) == 0 || strncmp (value, "((signed short)"/*)*/, 15) == 0 || strncmp (value, "((signed char)"/*)*/, 14) == 0) return mv - macro_values + 1; } return 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO" then : gl_cv_header_working_stdint_h=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_working_stdint_h" >&5 printf "%s\n" "$gl_cv_header_working_stdint_h" >&6; } fi HAVE_C99_STDINT_H=0 HAVE_SYS_BITYPES_H=0 HAVE_SYS_INTTYPES_H=0 GL_GENERATE_STDINT_H=true case "$gl_cv_header_working_stdint_h" in *yes) HAVE_C99_STDINT_H=1 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether stdint.h works without ISO C predefines" >&5 printf %s "checking whether stdint.h works without ISO C predefines... " >&6; } if test ${gl_cv_header_stdint_without_STDC_macros+y} then : printf %s "(cached) " >&6 else $as_nop gl_cv_header_stdint_without_STDC_macros=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1 /* work if build isn't clean */ #include #include #include #if HAVE_WCHAR_H # include #endif intmax_t im = INTMAX_MAX; int32_t i32 = INT32_C (0x7fffffff); int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : gl_cv_header_stdint_without_STDC_macros=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_stdint_without_STDC_macros" >&5 printf "%s\n" "$gl_cv_header_stdint_without_STDC_macros" >&6; } if test $gl_cv_header_stdint_without_STDC_macros = no; then printf "%s\n" "#define __STDC_CONSTANT_MACROS 1" >>confdefs.h printf "%s\n" "#define __STDC_LIMIT_MACROS 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether stdint.h has UINTMAX_WIDTH etc." >&5 printf %s "checking whether stdint.h has UINTMAX_WIDTH etc.... " >&6; } if test ${gl_cv_header_stdint_width+y} then : printf %s "(cached) " >&6 else $as_nop gl_cv_header_stdint_width=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Work if build is not clean. */ #define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1 #ifndef __STDC_WANT_IEC_60559_BFP_EXT__ #define __STDC_WANT_IEC_60559_BFP_EXT__ 1 #endif #include #include #include #if HAVE_WCHAR_H # include #endif int iw = UINTMAX_WIDTH; int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : gl_cv_header_stdint_width=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_stdint_width" >&5 printf "%s\n" "$gl_cv_header_stdint_width" >&6; } if test "$gl_cv_header_stdint_width" = yes; then GL_GENERATE_STDINT_H=false fi ;; *) ac_fn_c_check_header_compile "$LINENO" "sys/inttypes.h" "ac_cv_header_sys_inttypes_h" "$ac_includes_default" if test "x$ac_cv_header_sys_inttypes_h" = xyes then : printf "%s\n" "#define HAVE_SYS_INTTYPES_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "sys/bitypes.h" "ac_cv_header_sys_bitypes_h" "$ac_includes_default" if test "x$ac_cv_header_sys_bitypes_h" = xyes then : printf "%s\n" "#define HAVE_SYS_BITYPES_H 1" >>confdefs.h fi if test $ac_cv_header_sys_inttypes_h = yes; then HAVE_SYS_INTTYPES_H=1 fi if test $ac_cv_header_sys_bitypes_h = yes; then HAVE_SYS_BITYPES_H=1 fi if test $APPLE_UNIVERSAL_BUILD = 0; then for gltype in ptrdiff_t size_t ; do { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for bit size of $gltype" >&5 printf %s "checking for bit size of $gltype... " >&6; } if eval test \${gl_cv_bitsizeof_${gltype}+y} then : printf %s "(cached) " >&6 else $as_nop if ac_fn_c_compute_int "$LINENO" "sizeof ($gltype) * CHAR_BIT" "result" " #include #include #if HAVE_WCHAR_H # include #endif #include " then : else $as_nop result=unknown fi eval gl_cv_bitsizeof_${gltype}=\$result fi eval ac_res=\$gl_cv_bitsizeof_${gltype} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } eval result=\$gl_cv_bitsizeof_${gltype} if test $result = unknown; then result=0 fi GLTYPE=`echo "$gltype" | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'` printf "%s\n" "#define BITSIZEOF_${GLTYPE} $result" >>confdefs.h eval BITSIZEOF_${GLTYPE}=\$result done fi for gltype in sig_atomic_t wchar_t wint_t ; do { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for bit size of $gltype" >&5 printf %s "checking for bit size of $gltype... " >&6; } if eval test \${gl_cv_bitsizeof_${gltype}+y} then : printf %s "(cached) " >&6 else $as_nop if ac_fn_c_compute_int "$LINENO" "sizeof ($gltype) * CHAR_BIT" "result" " #include #include #if HAVE_WCHAR_H # include #endif #include " then : else $as_nop result=unknown fi eval gl_cv_bitsizeof_${gltype}=\$result fi eval ac_res=\$gl_cv_bitsizeof_${gltype} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } eval result=\$gl_cv_bitsizeof_${gltype} if test $result = unknown; then result=0 fi GLTYPE=`echo "$gltype" | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'` printf "%s\n" "#define BITSIZEOF_${GLTYPE} $result" >>confdefs.h eval BITSIZEOF_${GLTYPE}=\$result done for gltype in sig_atomic_t wchar_t wint_t ; do { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $gltype is signed" >&5 printf %s "checking whether $gltype is signed... " >&6; } if eval test \${gl_cv_type_${gltype}_signed+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if HAVE_WCHAR_H # include #endif int verify[2 * (($gltype) -1 < ($gltype) 0) - 1]; int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : result=yes else $as_nop result=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext eval gl_cv_type_${gltype}_signed=\$result fi eval ac_res=\$gl_cv_type_${gltype}_signed { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } eval result=\$gl_cv_type_${gltype}_signed GLTYPE=`echo $gltype | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'` if test "$result" = yes; then printf "%s\n" "#define HAVE_SIGNED_${GLTYPE} 1" >>confdefs.h eval HAVE_SIGNED_${GLTYPE}=1 else eval HAVE_SIGNED_${GLTYPE}=0 fi done gl_cv_type_ptrdiff_t_signed=yes gl_cv_type_size_t_signed=no if test $APPLE_UNIVERSAL_BUILD = 0; then for gltype in ptrdiff_t size_t ; do { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $gltype integer literal suffix" >&5 printf %s "checking for $gltype integer literal suffix... " >&6; } if eval test \${gl_cv_type_${gltype}_suffix+y} then : printf %s "(cached) " >&6 else $as_nop eval gl_cv_type_${gltype}_suffix=no eval result=\$gl_cv_type_${gltype}_signed if test "$result" = yes; then glsufu= else glsufu=u fi for glsuf in "$glsufu" ${glsufu}l ${glsufu}ll ${glsufu}i64; do case $glsuf in '') gltype1='int';; l) gltype1='long int';; ll) gltype1='long long int';; i64) gltype1='__int64';; u) gltype1='unsigned int';; ul) gltype1='unsigned long int';; ull) gltype1='unsigned long long int';; ui64)gltype1='unsigned __int64';; esac cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if HAVE_WCHAR_H # include #endif extern $gltype foo; extern $gltype1 foo; int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : eval gl_cv_type_${gltype}_suffix=\$glsuf fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext eval result=\$gl_cv_type_${gltype}_suffix test "$result" != no && break done fi eval ac_res=\$gl_cv_type_${gltype}_suffix { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } GLTYPE=`echo $gltype | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'` eval result=\$gl_cv_type_${gltype}_suffix test "$result" = no && result= eval ${GLTYPE}_SUFFIX=\$result printf "%s\n" "#define ${GLTYPE}_SUFFIX $result" >>confdefs.h done fi for gltype in sig_atomic_t wchar_t wint_t ; do { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $gltype integer literal suffix" >&5 printf %s "checking for $gltype integer literal suffix... " >&6; } if eval test \${gl_cv_type_${gltype}_suffix+y} then : printf %s "(cached) " >&6 else $as_nop eval gl_cv_type_${gltype}_suffix=no eval result=\$gl_cv_type_${gltype}_signed if test "$result" = yes; then glsufu= else glsufu=u fi for glsuf in "$glsufu" ${glsufu}l ${glsufu}ll ${glsufu}i64; do case $glsuf in '') gltype1='int';; l) gltype1='long int';; ll) gltype1='long long int';; i64) gltype1='__int64';; u) gltype1='unsigned int';; ul) gltype1='unsigned long int';; ull) gltype1='unsigned long long int';; ui64)gltype1='unsigned __int64';; esac cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if HAVE_WCHAR_H # include #endif extern $gltype foo; extern $gltype1 foo; int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : eval gl_cv_type_${gltype}_suffix=\$glsuf fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext eval result=\$gl_cv_type_${gltype}_suffix test "$result" != no && break done fi eval ac_res=\$gl_cv_type_${gltype}_suffix { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } GLTYPE=`echo $gltype | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'` eval result=\$gl_cv_type_${gltype}_suffix test "$result" = no && result= eval ${GLTYPE}_SUFFIX=\$result printf "%s\n" "#define ${GLTYPE}_SUFFIX $result" >>confdefs.h done if test $GNULIBHEADERS_OVERRIDE_WINT_T = 1; then BITSIZEOF_WINT_T=32 fi ;; esac GL_GENERATE_LIMITS_H=true HAVE_DECL_IMAXABS=1; HAVE_DECL_IMAXDIV=1; HAVE_DECL_STRTOIMAX=1; HAVE_DECL_STRTOUMAX=1; HAVE_IMAXDIV_T=1; REPLACE_STRTOIMAX=0; REPLACE_STRTOUMAX=0; INT32_MAX_LT_INTMAX_MAX=1; INT64_MAX_EQ_LONG_MAX='defined _LP64'; PRIPTR_PREFIX=__PRIPTR_PREFIX; UINT32_MAX_LT_UINTMAX_MAX=1; UINT64_MAX_EQ_ULONG_MAX='defined _LP64'; if test $gl_cv_have_include_next = yes; then gl_cv_next_inttypes_h='<'inttypes.h'>' else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 printf %s "checking absolute name of ... " >&6; } if test ${gl_cv_next_inttypes_h+y} then : printf %s "(cached) " >&6 else $as_nop if test $ac_cv_header_inttypes_h = yes; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'inttypes.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_absolute_inttypes_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"` gl_header=$gl_cv_absolute_inttypes_h gl_cv_next_inttypes_h='"'$gl_header'"' else gl_cv_next_inttypes_h='<'inttypes.h'>' fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_inttypes_h" >&5 printf "%s\n" "$gl_cv_next_inttypes_h" >&6; } fi NEXT_INTTYPES_H=$gl_cv_next_inttypes_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'inttypes.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_inttypes_h fi NEXT_AS_FIRST_DIRECTIVE_INTTYPES_H=$gl_next_as_first_directive GL_GNULIB_IMAXABS=0 GL_GNULIB_IMAXDIV=0 GL_GNULIB_STRTOIMAX=0 GL_GNULIB_STRTOUMAX=0 HAVE_NL_LANGINFO=1; REPLACE_NL_LANGINFO=0; if test $gl_cv_have_include_next = yes; then gl_cv_next_langinfo_h='<'langinfo.h'>' else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 printf %s "checking absolute name of ... " >&6; } if test ${gl_cv_next_langinfo_h+y} then : printf %s "(cached) " >&6 else $as_nop if test $ac_cv_header_langinfo_h = yes; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'langinfo.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_absolute_langinfo_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"` gl_header=$gl_cv_absolute_langinfo_h gl_cv_next_langinfo_h='"'$gl_header'"' else gl_cv_next_langinfo_h='<'langinfo.h'>' fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_langinfo_h" >&5 printf "%s\n" "$gl_cv_next_langinfo_h" >&6; } fi NEXT_LANGINFO_H=$gl_cv_next_langinfo_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'langinfo.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_langinfo_h fi NEXT_AS_FIRST_DIRECTIVE_LANGINFO_H=$gl_next_as_first_directive HAVE_LANGINFO_CODESET=0 HAVE_LANGINFO_T_FMT_AMPM=0 HAVE_LANGINFO_ALTMON=0 HAVE_LANGINFO_ERA=0 HAVE_LANGINFO_YESEXPR=0 if test $ac_cv_header_langinfo_h = yes; then HAVE_LANGINFO_H=1 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether langinfo.h defines CODESET" >&5 printf %s "checking whether langinfo.h defines CODESET... " >&6; } if test ${gl_cv_header_langinfo_codeset+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int a = CODESET; int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : gl_cv_header_langinfo_codeset=yes else $as_nop gl_cv_header_langinfo_codeset=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_langinfo_codeset" >&5 printf "%s\n" "$gl_cv_header_langinfo_codeset" >&6; } if test $gl_cv_header_langinfo_codeset = yes; then HAVE_LANGINFO_CODESET=1 fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether langinfo.h defines T_FMT_AMPM" >&5 printf %s "checking whether langinfo.h defines T_FMT_AMPM... " >&6; } if test ${gl_cv_header_langinfo_t_fmt_ampm+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int a = T_FMT_AMPM; int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : gl_cv_header_langinfo_t_fmt_ampm=yes else $as_nop gl_cv_header_langinfo_t_fmt_ampm=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_langinfo_t_fmt_ampm" >&5 printf "%s\n" "$gl_cv_header_langinfo_t_fmt_ampm" >&6; } if test $gl_cv_header_langinfo_t_fmt_ampm = yes; then HAVE_LANGINFO_T_FMT_AMPM=1 fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether langinfo.h defines ALTMON_1" >&5 printf %s "checking whether langinfo.h defines ALTMON_1... " >&6; } if test ${gl_cv_header_langinfo_altmon+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int a = ALTMON_1; int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : gl_cv_header_langinfo_altmon=yes else $as_nop gl_cv_header_langinfo_altmon=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_langinfo_altmon" >&5 printf "%s\n" "$gl_cv_header_langinfo_altmon" >&6; } if test $gl_cv_header_langinfo_altmon = yes; then HAVE_LANGINFO_ALTMON=1 fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether langinfo.h defines ERA" >&5 printf %s "checking whether langinfo.h defines ERA... " >&6; } if test ${gl_cv_header_langinfo_era+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int a = ERA; int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : gl_cv_header_langinfo_era=yes else $as_nop gl_cv_header_langinfo_era=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_langinfo_era" >&5 printf "%s\n" "$gl_cv_header_langinfo_era" >&6; } if test $gl_cv_header_langinfo_era = yes; then HAVE_LANGINFO_ERA=1 fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether langinfo.h defines YESEXPR" >&5 printf %s "checking whether langinfo.h defines YESEXPR... " >&6; } if test ${gl_cv_header_langinfo_yesexpr+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int a = YESEXPR; int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : gl_cv_header_langinfo_yesexpr=yes else $as_nop gl_cv_header_langinfo_yesexpr=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_langinfo_yesexpr" >&5 printf "%s\n" "$gl_cv_header_langinfo_yesexpr" >&6; } if test $gl_cv_header_langinfo_yesexpr = yes; then HAVE_LANGINFO_YESEXPR=1 fi else HAVE_LANGINFO_H=0 fi GL_GNULIB_NL_LANGINFO=0 HAVE_NEWLOCALE=1; HAVE_DUPLOCALE=1; HAVE_FREELOCALE=1; REPLACE_LOCALECONV=0; REPLACE_SETLOCALE=0; REPLACE_NEWLOCALE=0; REPLACE_DUPLOCALE=0; REPLACE_FREELOCALE=0; REPLACE_STRUCT_LCONV=0; LOCALENAME_ENHANCE_LOCALE_FUNCS=0; REPLACE_NULL=0; HAVE_MAX_ALIGN_T=1; HAVE_WCHAR_T=1; { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for wchar_t" >&5 printf %s "checking for wchar_t... " >&6; } if test ${gt_cv_c_wchar_t+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include wchar_t foo = (wchar_t)'\0'; int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : gt_cv_c_wchar_t=yes else $as_nop gt_cv_c_wchar_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gt_cv_c_wchar_t" >&5 printf "%s\n" "$gt_cv_c_wchar_t" >&6; } if test $gt_cv_c_wchar_t = yes; then printf "%s\n" "#define HAVE_WCHAR_T 1" >>confdefs.h fi GL_GENERATE_STDDEF_H=false { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for good max_align_t" >&5 printf %s "checking for good max_align_t... " >&6; } if test ${gl_cv_type_max_align_t+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include unsigned int s = sizeof (max_align_t); #if defined __GNUC__ || defined __clang__ || defined __IBM__ALIGNOF__ int check1[2 * (__alignof__ (double) <= __alignof__ (max_align_t)) - 1]; int check2[2 * (__alignof__ (long double) <= __alignof__ (max_align_t)) - 1]; #endif typedef struct { char a; max_align_t b; } max_helper; typedef struct { char a; long b; } long_helper; typedef struct { char a; double b; } double_helper; typedef struct { char a; long double b; } long_double_helper; int check3[2 * (offsetof (long_helper, b) <= offsetof (max_helper, b)) - 1]; int check4[2 * (offsetof (double_helper, b) <= offsetof (max_helper, b)) - 1]; int check5[2 * (offsetof (long_double_helper, b) <= offsetof (max_helper, b)) - 1]; int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : gl_cv_type_max_align_t=yes else $as_nop gl_cv_type_max_align_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_type_max_align_t" >&5 printf "%s\n" "$gl_cv_type_max_align_t" >&6; } if test $gl_cv_type_max_align_t = no; then HAVE_MAX_ALIGN_T=0 GL_GENERATE_STDDEF_H=true fi if test $gt_cv_c_wchar_t = no; then HAVE_WCHAR_T=0 GL_GENERATE_STDDEF_H=true fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether NULL can be used in arbitrary expressions" >&5 printf %s "checking whether NULL can be used in arbitrary expressions... " >&6; } if test ${gl_cv_decl_null_works+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int test[2 * (sizeof NULL == sizeof (void *)) -1]; int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : gl_cv_decl_null_works=yes else $as_nop gl_cv_decl_null_works=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_decl_null_works" >&5 printf "%s\n" "$gl_cv_decl_null_works" >&6; } if test $gl_cv_decl_null_works = no; then REPLACE_NULL=1 GL_GENERATE_STDDEF_H=true fi if $GL_GENERATE_STDDEF_H; then if test $gl_cv_have_include_next = yes; then gl_cv_next_stddef_h='<'stddef.h'>' else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 printf %s "checking absolute name of ... " >&6; } if test ${gl_cv_next_stddef_h+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'stddef.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_absolute_stddef_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"` gl_header=$gl_cv_absolute_stddef_h gl_cv_next_stddef_h='"'$gl_header'"' fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_stddef_h" >&5 printf "%s\n" "$gl_cv_next_stddef_h" >&6; } fi NEXT_STDDEF_H=$gl_cv_next_stddef_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'stddef.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_stddef_h fi NEXT_AS_FIRST_DIRECTIVE_STDDEF_H=$gl_next_as_first_directive fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether locale.h defines locale_t" >&5 printf %s "checking whether locale.h defines locale_t... " >&6; } if test ${gl_cv_header_locale_has_locale_t+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include locale_t x; int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : gl_cv_header_locale_has_locale_t=yes else $as_nop gl_cv_header_locale_has_locale_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_locale_has_locale_t" >&5 printf "%s\n" "$gl_cv_header_locale_has_locale_t" >&6; } if test $ac_cv_header_xlocale_h = yes; then HAVE_XLOCALE_H=1 if test $gl_cv_header_locale_has_locale_t = yes; then gl_cv_header_locale_h_needs_xlocale_h=no else gl_cv_header_locale_h_needs_xlocale_h=yes fi HAVE_LOCALE_T=1 else HAVE_XLOCALE_H=0 gl_cv_header_locale_h_needs_xlocale_h=no if test $gl_cv_header_locale_has_locale_t = yes; then HAVE_LOCALE_T=1 else HAVE_LOCALE_T=0 fi fi case "$host_os" in solaris*) printf "%s\n" "#define _LCONV_C99 1" >>confdefs.h ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether locale.h conforms to POSIX:2001" >&5 printf %s "checking whether locale.h conforms to POSIX:2001... " >&6; } if test ${gl_cv_header_locale_h_posix2001+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int x = LC_MESSAGES; int y = sizeof (((struct lconv *) 0)->decimal_point); int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : gl_cv_header_locale_h_posix2001=yes else $as_nop gl_cv_header_locale_h_posix2001=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_locale_h_posix2001" >&5 printf "%s\n" "$gl_cv_header_locale_h_posix2001" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether struct lconv is properly defined" >&5 printf %s "checking whether struct lconv is properly defined... " >&6; } if test ${gl_cv_sys_struct_lconv_ok+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include struct lconv l; int x = sizeof (l.decimal_point); int y = sizeof (l.int_p_cs_precedes); int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : gl_cv_sys_struct_lconv_ok=yes else $as_nop gl_cv_sys_struct_lconv_ok=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_sys_struct_lconv_ok" >&5 printf "%s\n" "$gl_cv_sys_struct_lconv_ok" >&6; } if test $gl_cv_sys_struct_lconv_ok = no; then case "$host_os" in mingw*) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef _MSC_VER Special #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "Special" >/dev/null 2>&1 then : else $as_nop REPLACE_STRUCT_LCONV=1 fi rm -rf conftest* ;; *) REPLACE_STRUCT_LCONV=1 ;; esac fi if test $gl_cv_have_include_next = yes; then gl_cv_next_locale_h='<'locale.h'>' else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 printf %s "checking absolute name of ... " >&6; } if test ${gl_cv_next_locale_h+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'locale.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_absolute_locale_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"` gl_header=$gl_cv_absolute_locale_h gl_cv_next_locale_h='"'$gl_header'"' fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_locale_h" >&5 printf "%s\n" "$gl_cv_next_locale_h" >&6; } fi NEXT_LOCALE_H=$gl_cv_next_locale_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'locale.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_locale_h fi NEXT_AS_FIRST_DIRECTIVE_LOCALE_H=$gl_next_as_first_directive GL_GNULIB_LOCALECONV=0 GL_GNULIB_SETLOCALE=0 GL_GNULIB_SETLOCALE_NULL=0 GL_GNULIB_DUPLOCALE=0 GL_GNULIB_LOCALENAME=0 gl_threads_api=none LIBTHREAD= LTLIBTHREAD= LIBMULTITHREAD= LTLIBMULTITHREAD= if test "$gl_use_threads" != no; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether imported symbols can be declared weak" >&5 printf %s "checking whether imported symbols can be declared weak... " >&6; } if test ${gl_cv_have_weak+y} then : printf %s "(cached) " >&6 else $as_nop case "$host_os" in cygwin*) gl_cv_have_weak="guessing no" ;; *) gl_cv_have_weak=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ extern void xyzzy (); #pragma weak xyzzy int main (void) { xyzzy(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : gl_cv_have_weak=maybe fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext if test $gl_cv_have_weak = maybe; then if test "$cross_compiling" = yes then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __ELF__ Extensible Linking Format #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "Extensible Linking Format" >/dev/null 2>&1 then : gl_cv_have_weak="guessing yes" else $as_nop gl_cv_have_weak="guessing no" fi rm -rf conftest* else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #pragma weak fputs int main () { return (fputs == NULL); } _ACEOF if ac_fn_c_try_run "$LINENO" then : gl_cv_have_weak=yes else $as_nop gl_cv_have_weak=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi ;; esac case " $LDFLAGS " in *" -static "*) gl_cv_have_weak=no ;; esac case "$gl_cv_have_weak" in *yes) case "$host_os" in freebsd* | dragonfly* | midnightbsd*) : > conftest1.c $CC $CPPFLAGS $CFLAGS $LDFLAGS -fPIC -shared -o libempty.so conftest1.c -lpthread >&5 2>&1 cat < conftest2.c #include #pragma weak pthread_mutexattr_gettype int main () { return (pthread_mutexattr_gettype != NULL); } EOF $CC $CPPFLAGS $CFLAGS $LDFLAGS -o conftest conftest2.c libempty.so >&5 2>&1 \ || gl_cv_have_weak=no rm -f conftest1.c libempty.so conftest2.c conftest ;; esac ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_have_weak" >&5 printf "%s\n" "$gl_cv_have_weak" >&6; } case "$gl_cv_have_weak" in *yes) printf "%s\n" "#define HAVE_WEAK_SYMBOLS 1" >>confdefs.h ;; esac if case "$gl_cv_have_weak" in *yes) true;; *) false;; esac; then : fi if test "$gl_use_threads" = isoc || test "$gl_use_threads" = isoc+posix; then gl_have_isoc_threads="$ac_cv_header_threads_h" fi if test "$gl_use_threads" = yes \ || test "$gl_use_threads" = posix \ || test "$gl_use_threads" = isoc+posix; then if test -z "$gl_pthreadlib_body_done"; then gl_pthread_api=no LIBPTHREAD= LIBPMULTITHREAD= # On OSF/1, the compiler needs the flag -pthread or -D_REENTRANT so that # it groks . It's added above, in gl_ANYTHREADLIB_EARLY. ac_fn_c_check_header_compile "$LINENO" "pthread.h" "ac_cv_header_pthread_h" "$ac_includes_default" if test "x$ac_cv_header_pthread_h" = xyes then : gl_have_pthread_h=yes else $as_nop gl_have_pthread_h=no fi if test "$gl_have_pthread_h" = yes; then # Other possible tests: # -lpthreads (FSU threads, PCthreads) # -lgthreads # Test whether both pthread_mutex_lock and pthread_mutexattr_init exist # in libc. IRIX 6.5 has the first one in both libc and libpthread, but # the second one only in libpthread, and lock.c needs it. # # If -pthread works, prefer it to -lpthread, since Ubuntu 14.04 # needs -pthread for some reason. See: # https://lists.gnu.org/r/bug-gnulib/2014-09/msg00023.html save_LIBS=$LIBS for gl_pthread in '' '-pthread'; do LIBS="$LIBS $gl_pthread" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include pthread_mutex_t m; pthread_mutexattr_t ma; int main (void) { pthread_mutex_lock (&m); pthread_mutexattr_init (&ma); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : gl_pthread_api=yes LIBPTHREAD=$gl_pthread LIBPMULTITHREAD=$gl_pthread fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$save_LIBS test $gl_pthread_api = yes && break done echo "$as_me:21728: gl_pthread_api=$gl_pthread_api" >&5 echo "$as_me:21729: LIBPTHREAD=$LIBPTHREAD" >&5 gl_pthread_in_glibc=no # On Linux with glibc >= 2.34, libc contains the fully functional # pthread functions. case "$host_os" in linux*) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef __GNU_LIBRARY__ #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 34) || (__GLIBC__ > 2) Lucky user #endif #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "Lucky user" >/dev/null 2>&1 then : gl_pthread_in_glibc=yes fi rm -rf conftest* ;; esac echo "$as_me:21755: gl_pthread_in_glibc=$gl_pthread_in_glibc" >&5 # Test for libpthread by looking for pthread_kill. (Not pthread_self, # since it is defined as a macro on OSF/1.) if test $gl_pthread_api = yes && test -z "$LIBPTHREAD"; then # The program links fine without libpthread. But it may actually # need to link with libpthread in order to create multiple threads. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pthread_kill in -lpthread" >&5 printf %s "checking for pthread_kill in -lpthread... " >&6; } if test ${ac_cv_lib_pthread_pthread_kill+y} then : printf %s "(cached) " >&6 else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-lpthread $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ char pthread_kill (); int main (void) { return pthread_kill (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_pthread_pthread_kill=yes else $as_nop ac_cv_lib_pthread_pthread_kill=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_kill" >&5 printf "%s\n" "$ac_cv_lib_pthread_pthread_kill" >&6; } if test "x$ac_cv_lib_pthread_pthread_kill" = xyes then : if test $gl_pthread_in_glibc = yes; then LIBPMULTITHREAD= else LIBPMULTITHREAD=-lpthread # On Solaris and HP-UX, most pthread functions exist also in libc. # Therefore pthread_in_use() needs to actually try to create a # thread: pthread_create from libc will fail, whereas # pthread_create will actually create a thread. # On Solaris 10 or newer, this test is no longer needed, because # libc contains the fully functional pthread functions. case "$host_os" in solaris | solaris2.1-9 | solaris2.1-9.* | hpux*) printf "%s\n" "#define PTHREAD_IN_USE_DETECTION_HARD 1" >>confdefs.h esac fi fi elif test $gl_pthread_api != yes; then # Some library is needed. Try libpthread and libc_r. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pthread_kill in -lpthread" >&5 printf %s "checking for pthread_kill in -lpthread... " >&6; } if test ${ac_cv_lib_pthread_pthread_kill+y} then : printf %s "(cached) " >&6 else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-lpthread $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ char pthread_kill (); int main (void) { return pthread_kill (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_pthread_pthread_kill=yes else $as_nop ac_cv_lib_pthread_pthread_kill=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_kill" >&5 printf "%s\n" "$ac_cv_lib_pthread_pthread_kill" >&6; } if test "x$ac_cv_lib_pthread_pthread_kill" = xyes then : gl_pthread_api=yes LIBPTHREAD=-lpthread LIBPMULTITHREAD=-lpthread fi if test $gl_pthread_api != yes; then # For FreeBSD 4. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pthread_kill in -lc_r" >&5 printf %s "checking for pthread_kill in -lc_r... " >&6; } if test ${ac_cv_lib_c_r_pthread_kill+y} then : printf %s "(cached) " >&6 else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-lc_r $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ char pthread_kill (); int main (void) { return pthread_kill (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_c_r_pthread_kill=yes else $as_nop ac_cv_lib_c_r_pthread_kill=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_r_pthread_kill" >&5 printf "%s\n" "$ac_cv_lib_c_r_pthread_kill" >&6; } if test "x$ac_cv_lib_c_r_pthread_kill" = xyes then : gl_pthread_api=yes LIBPTHREAD=-lc_r LIBPMULTITHREAD=-lc_r fi fi fi echo "$as_me:21909: LIBPMULTITHREAD=$LIBPMULTITHREAD" >&5 fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether POSIX threads API is available" >&5 printf %s "checking whether POSIX threads API is available... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_pthread_api" >&5 printf "%s\n" "$gl_pthread_api" >&6; } if test $gl_pthread_api = yes; then printf "%s\n" "#define HAVE_PTHREAD_API 1" >>confdefs.h fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { sched_yield (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : LIB_SCHED_YIELD= else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sched_yield in -lrt" >&5 printf %s "checking for sched_yield in -lrt... " >&6; } if test ${ac_cv_lib_rt_sched_yield+y} then : printf %s "(cached) " >&6 else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-lrt $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ char sched_yield (); int main (void) { return sched_yield (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_rt_sched_yield=yes else $as_nop ac_cv_lib_rt_sched_yield=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rt_sched_yield" >&5 printf "%s\n" "$ac_cv_lib_rt_sched_yield" >&6; } if test "x$ac_cv_lib_rt_sched_yield" = xyes then : LIB_SCHED_YIELD=-lrt else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sched_yield in -lposix4" >&5 printf %s "checking for sched_yield in -lposix4... " >&6; } if test ${ac_cv_lib_posix4_sched_yield+y} then : printf %s "(cached) " >&6 else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-lposix4 $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ char sched_yield (); int main (void) { return sched_yield (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_posix4_sched_yield=yes else $as_nop ac_cv_lib_posix4_sched_yield=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_posix4_sched_yield" >&5 printf "%s\n" "$ac_cv_lib_posix4_sched_yield" >&6; } if test "x$ac_cv_lib_posix4_sched_yield" = xyes then : LIB_SCHED_YIELD=-lposix4 fi fi fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext gl_pthreadlib_body_done=done fi LIBTHREAD=$LIBPTHREAD LTLIBTHREAD=$LIBPTHREAD LIBMULTITHREAD=$LIBPMULTITHREAD LTLIBMULTITHREAD=$LIBPMULTITHREAD if test $gl_pthread_api = yes; then if test "$gl_use_threads" = isoc+posix && test "$gl_have_isoc_threads" = yes; then gl_threads_api='isoc+posix' printf "%s\n" "#define USE_ISOC_AND_POSIX_THREADS 1" >>confdefs.h LIBTHREAD= LTLIBTHREAD= else gl_threads_api=posix printf "%s\n" "#define USE_POSIX_THREADS 1" >>confdefs.h if test -z "$LIBMULTITHREAD" && test -z "$LTLIBMULTITHREAD"; then printf "%s\n" "#define USE_POSIX_THREADS_FROM_LIBC 1" >>confdefs.h else if case "$gl_cv_have_weak" in *yes) true;; *) false;; esac; then printf "%s\n" "#define USE_POSIX_THREADS_WEAK 1" >>confdefs.h LIBTHREAD= LTLIBTHREAD= else case "$host_os" in freebsd* | dragonfly* | midnightbsd*) if test "x$LIBTHREAD" != "x$LIBMULTITHREAD"; then printf "%s\n" "#define PTHREAD_IN_USE_DETECTION_HARD 1" >>confdefs.h fi ;; esac fi fi fi fi fi if test $gl_threads_api = none; then if test "$gl_use_threads" = isoc && test "$gl_have_isoc_threads" = yes; then if test -z "$gl_stdthreadlib_body_done"; then case "$host_os" in mingw*) LIBSTDTHREAD= ;; *) if test -z "$gl_pthreadlib_body_done"; then gl_pthread_api=no LIBPTHREAD= LIBPMULTITHREAD= # On OSF/1, the compiler needs the flag -pthread or -D_REENTRANT so that # it groks . It's added above, in gl_ANYTHREADLIB_EARLY. ac_fn_c_check_header_compile "$LINENO" "pthread.h" "ac_cv_header_pthread_h" "$ac_includes_default" if test "x$ac_cv_header_pthread_h" = xyes then : gl_have_pthread_h=yes else $as_nop gl_have_pthread_h=no fi if test "$gl_have_pthread_h" = yes; then # Other possible tests: # -lpthreads (FSU threads, PCthreads) # -lgthreads # Test whether both pthread_mutex_lock and pthread_mutexattr_init exist # in libc. IRIX 6.5 has the first one in both libc and libpthread, but # the second one only in libpthread, and lock.c needs it. # # If -pthread works, prefer it to -lpthread, since Ubuntu 14.04 # needs -pthread for some reason. See: # https://lists.gnu.org/r/bug-gnulib/2014-09/msg00023.html save_LIBS=$LIBS for gl_pthread in '' '-pthread'; do LIBS="$LIBS $gl_pthread" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include pthread_mutex_t m; pthread_mutexattr_t ma; int main (void) { pthread_mutex_lock (&m); pthread_mutexattr_init (&ma); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : gl_pthread_api=yes LIBPTHREAD=$gl_pthread LIBPMULTITHREAD=$gl_pthread fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$save_LIBS test $gl_pthread_api = yes && break done echo "$as_me:22137: gl_pthread_api=$gl_pthread_api" >&5 echo "$as_me:22138: LIBPTHREAD=$LIBPTHREAD" >&5 gl_pthread_in_glibc=no # On Linux with glibc >= 2.34, libc contains the fully functional # pthread functions. case "$host_os" in linux*) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef __GNU_LIBRARY__ #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 34) || (__GLIBC__ > 2) Lucky user #endif #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "Lucky user" >/dev/null 2>&1 then : gl_pthread_in_glibc=yes fi rm -rf conftest* ;; esac echo "$as_me:22164: gl_pthread_in_glibc=$gl_pthread_in_glibc" >&5 # Test for libpthread by looking for pthread_kill. (Not pthread_self, # since it is defined as a macro on OSF/1.) if test $gl_pthread_api = yes && test -z "$LIBPTHREAD"; then # The program links fine without libpthread. But it may actually # need to link with libpthread in order to create multiple threads. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pthread_kill in -lpthread" >&5 printf %s "checking for pthread_kill in -lpthread... " >&6; } if test ${ac_cv_lib_pthread_pthread_kill+y} then : printf %s "(cached) " >&6 else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-lpthread $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ char pthread_kill (); int main (void) { return pthread_kill (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_pthread_pthread_kill=yes else $as_nop ac_cv_lib_pthread_pthread_kill=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_kill" >&5 printf "%s\n" "$ac_cv_lib_pthread_pthread_kill" >&6; } if test "x$ac_cv_lib_pthread_pthread_kill" = xyes then : if test $gl_pthread_in_glibc = yes; then LIBPMULTITHREAD= else LIBPMULTITHREAD=-lpthread # On Solaris and HP-UX, most pthread functions exist also in libc. # Therefore pthread_in_use() needs to actually try to create a # thread: pthread_create from libc will fail, whereas # pthread_create will actually create a thread. # On Solaris 10 or newer, this test is no longer needed, because # libc contains the fully functional pthread functions. case "$host_os" in solaris | solaris2.1-9 | solaris2.1-9.* | hpux*) printf "%s\n" "#define PTHREAD_IN_USE_DETECTION_HARD 1" >>confdefs.h esac fi fi elif test $gl_pthread_api != yes; then # Some library is needed. Try libpthread and libc_r. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pthread_kill in -lpthread" >&5 printf %s "checking for pthread_kill in -lpthread... " >&6; } if test ${ac_cv_lib_pthread_pthread_kill+y} then : printf %s "(cached) " >&6 else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-lpthread $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ char pthread_kill (); int main (void) { return pthread_kill (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_pthread_pthread_kill=yes else $as_nop ac_cv_lib_pthread_pthread_kill=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_kill" >&5 printf "%s\n" "$ac_cv_lib_pthread_pthread_kill" >&6; } if test "x$ac_cv_lib_pthread_pthread_kill" = xyes then : gl_pthread_api=yes LIBPTHREAD=-lpthread LIBPMULTITHREAD=-lpthread fi if test $gl_pthread_api != yes; then # For FreeBSD 4. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pthread_kill in -lc_r" >&5 printf %s "checking for pthread_kill in -lc_r... " >&6; } if test ${ac_cv_lib_c_r_pthread_kill+y} then : printf %s "(cached) " >&6 else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-lc_r $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ char pthread_kill (); int main (void) { return pthread_kill (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_c_r_pthread_kill=yes else $as_nop ac_cv_lib_c_r_pthread_kill=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_r_pthread_kill" >&5 printf "%s\n" "$ac_cv_lib_c_r_pthread_kill" >&6; } if test "x$ac_cv_lib_c_r_pthread_kill" = xyes then : gl_pthread_api=yes LIBPTHREAD=-lc_r LIBPMULTITHREAD=-lc_r fi fi fi echo "$as_me:22318: LIBPMULTITHREAD=$LIBPMULTITHREAD" >&5 fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether POSIX threads API is available" >&5 printf %s "checking whether POSIX threads API is available... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_pthread_api" >&5 printf "%s\n" "$gl_pthread_api" >&6; } if test $gl_pthread_api = yes; then printf "%s\n" "#define HAVE_PTHREAD_API 1" >>confdefs.h fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { sched_yield (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : LIB_SCHED_YIELD= else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sched_yield in -lrt" >&5 printf %s "checking for sched_yield in -lrt... " >&6; } if test ${ac_cv_lib_rt_sched_yield+y} then : printf %s "(cached) " >&6 else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-lrt $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ char sched_yield (); int main (void) { return sched_yield (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_rt_sched_yield=yes else $as_nop ac_cv_lib_rt_sched_yield=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rt_sched_yield" >&5 printf "%s\n" "$ac_cv_lib_rt_sched_yield" >&6; } if test "x$ac_cv_lib_rt_sched_yield" = xyes then : LIB_SCHED_YIELD=-lrt else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sched_yield in -lposix4" >&5 printf %s "checking for sched_yield in -lposix4... " >&6; } if test ${ac_cv_lib_posix4_sched_yield+y} then : printf %s "(cached) " >&6 else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-lposix4 $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ char sched_yield (); int main (void) { return sched_yield (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_posix4_sched_yield=yes else $as_nop ac_cv_lib_posix4_sched_yield=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_posix4_sched_yield" >&5 printf "%s\n" "$ac_cv_lib_posix4_sched_yield" >&6; } if test "x$ac_cv_lib_posix4_sched_yield" = xyes then : LIB_SCHED_YIELD=-lposix4 fi fi fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext gl_pthreadlib_body_done=done fi if test $ac_cv_header_threads_h = yes; then ac_fn_c_check_func "$LINENO" "thrd_create" "ac_cv_func_thrd_create" if test "x$ac_cv_func_thrd_create" = xyes then : printf "%s\n" "#define HAVE_THRD_CREATE 1" >>confdefs.h fi if test $ac_cv_func_thrd_create = yes; then LIBSTDTHREAD= else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for thrd_create in -lstdthreads" >&5 printf %s "checking for thrd_create in -lstdthreads... " >&6; } if test ${ac_cv_lib_stdthreads_thrd_create+y} then : printf %s "(cached) " >&6 else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-lstdthreads $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ char thrd_create (); int main (void) { return thrd_create (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_stdthreads_thrd_create=yes else $as_nop ac_cv_lib_stdthreads_thrd_create=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_stdthreads_thrd_create" >&5 printf "%s\n" "$ac_cv_lib_stdthreads_thrd_create" >&6; } if test "x$ac_cv_lib_stdthreads_thrd_create" = xyes then : LIBSTDTHREAD='-lstdthreads -lpthread' else $as_nop LIBSTDTHREAD="$LIBPMULTITHREAD" fi fi else LIBSTDTHREAD="$LIBPMULTITHREAD $LIB_SCHED_YIELD" fi ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ISO C threads API is available" >&5 printf %s "checking whether ISO C threads API is available... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_threads_h" >&5 printf "%s\n" "$ac_cv_header_threads_h" >&6; } gl_stdthreadlib_body_done=done fi LIBTHREAD=$LIBSTDTHREAD LTLIBTHREAD=$LIBSTDTHREAD LIBMULTITHREAD=$LIBSTDTHREAD LTLIBMULTITHREAD=$LIBSTDTHREAD gl_threads_api=isoc printf "%s\n" "#define USE_ISOC_THREADS 1" >>confdefs.h fi fi if test $gl_threads_api = none; then case "$gl_use_threads" in yes | windows | win32) # The 'win32' is for backward compatibility. if { case "$host_os" in mingw*) true;; *) false;; esac }; then gl_threads_api=windows printf "%s\n" "#define USE_WINDOWS_THREADS 1" >>confdefs.h fi ;; esac fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for multithread API to use" >&5 printf %s "checking for multithread API to use... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_threads_api" >&5 printf "%s\n" "$gl_threads_api" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether malloc (0) returns nonnull" >&5 printf %s "checking whether malloc (0) returns nonnull... " >&6; } if test ${ac_cv_func_malloc_0_nonnull+y} then : printf %s "(cached) " >&6 else $as_nop if test "$cross_compiling" = yes then : case "$host_os" in # Guess yes on platforms where we know the result. *-gnu* | freebsd* | netbsd* | openbsd* | bitrig* \ | gnu* | *-musl* | midnightbsd* \ | hpux* | solaris* | cygwin* | mingw* | msys* ) ac_cv_func_malloc_0_nonnull="guessing yes" ;; # If we don't know, obey --enable-cross-guesses. *) ac_cv_func_malloc_0_nonnull="$gl_cross_guess_normal" ;; esac else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { void *p = malloc (0); int result = !p; free (p); return result; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO" then : ac_cv_func_malloc_0_nonnull=yes else $as_nop ac_cv_func_malloc_0_nonnull=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_malloc_0_nonnull" >&5 printf "%s\n" "$ac_cv_func_malloc_0_nonnull" >&6; } case $ac_cv_func_malloc_0_nonnull in #( *yes) : gl_cv_func_malloc_0_nonnull=1 ;; #( *) : gl_cv_func_malloc_0_nonnull=0 ;; esac printf "%s\n" "#define MALLOC_0_IS_NONNULL $gl_cv_func_malloc_0_nonnull" >>confdefs.h { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a traditional japanese locale" >&5 printf %s "checking for a traditional japanese locale... " >&6; } if test ${gt_cv_locale_ja+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if HAVE_LANGINFO_CODESET # include #endif #include #include struct tm t; char buf[16]; int main () { /* On BeOS and Haiku, locales are not implemented in libc. Rather, libintl imitates locale dependent behaviour by looking at the environment variables, and all locales use the UTF-8 encoding. */ #if defined __BEOS__ || defined __HAIKU__ return 1; #else /* Check whether the given locale name is recognized by the system. */ # if defined _WIN32 && !defined __CYGWIN__ /* On native Windows, setlocale(category, "") looks at the system settings, not at the environment variables. Also, when an encoding suffix such as ".65001" or ".54936" is specified, it succeeds but sets the LC_CTYPE category of the locale to "C". */ if (setlocale (LC_ALL, getenv ("LC_ALL")) == NULL || strcmp (setlocale (LC_CTYPE, NULL), "C") == 0) return 1; # else if (setlocale (LC_ALL, "") == NULL) return 1; # endif /* Check whether nl_langinfo(CODESET) is nonempty and not "ASCII" or "646". On Mac OS X 10.3.5 (Darwin 7.5) in the fr_FR locale, nl_langinfo(CODESET) is empty, and the behaviour of Tcl 8.4 in this locale is not useful. On OpenBSD 4.0, when an unsupported locale is specified, setlocale() succeeds but then nl_langinfo(CODESET) is "646". In this situation, some unit tests fail. On MirBSD 10, when an unsupported locale is specified, setlocale() succeeds but then nl_langinfo(CODESET) is "UTF-8". */ # if HAVE_LANGINFO_CODESET { const char *cs = nl_langinfo (CODESET); if (cs[0] == '\0' || strcmp (cs, "ASCII") == 0 || strcmp (cs, "646") == 0 || strcmp (cs, "UTF-8") == 0) return 1; } # endif # ifdef __CYGWIN__ /* On Cygwin, avoid locale names without encoding suffix, because the locale_charset() function relies on the encoding suffix. Note that LC_ALL is set on the command line. */ if (strchr (getenv ("LC_ALL"), '.') == NULL) return 1; # endif /* Check whether MB_CUR_MAX is > 1. This excludes the dysfunctional locales on Cygwin 1.5.x. */ if (MB_CUR_MAX == 1) return 1; /* Check whether in a month name, no byte in the range 0x80..0x9F occurs. This excludes the UTF-8 encoding (except on MirBSD). */ { const char *p; t.tm_year = 1975 - 1900; t.tm_mon = 2 - 1; t.tm_mday = 4; if (strftime (buf, sizeof (buf), "%B", &t) < 2) return 1; for (p = buf; *p != '\0'; p++) if ((unsigned char) *p >= 0x80 && (unsigned char) *p < 0xa0) return 1; } return 0; #endif } _ACEOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest$ac_exeext; then case "$host_os" in # Handle native Windows specially, because there setlocale() interprets # "ar" as "Arabic" or "Arabic_Saudi Arabia.1256", # "fr" or "fra" as "French" or "French_France.1252", # "ge"(!) or "deu"(!) as "German" or "German_Germany.1252", # "ja" as "Japanese" or "Japanese_Japan.932", # and similar. mingw*) # Note that on native Windows, the Japanese locale is # Japanese_Japan.932, and CP932 is very different from EUC-JP, so we # cannot use it here. gt_cv_locale_ja=none ;; *) # Setting LC_ALL is not enough. Need to set LC_TIME to empty, because # otherwise on Mac OS X 10.3.5 the LC_TIME=C from the beginning of the # configure script would override the LC_ALL setting. Likewise for # LC_CTYPE, which is also set at the beginning of the configure script. # Test for the AIX locale name. if (LC_ALL=ja_JP LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then gt_cv_locale_ja=ja_JP else # Test for the locale name with explicit encoding suffix. if (LC_ALL=ja_JP.EUC-JP LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then gt_cv_locale_ja=ja_JP.EUC-JP else # Test for the HP-UX, OSF/1, NetBSD locale name. if (LC_ALL=ja_JP.eucJP LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then gt_cv_locale_ja=ja_JP.eucJP else # Test for the IRIX, FreeBSD locale name. if (LC_ALL=ja_JP.EUC LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then gt_cv_locale_ja=ja_JP.EUC else # Test for the Solaris 7 locale name. if (LC_ALL=ja LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then gt_cv_locale_ja=ja else # Special test for NetBSD 1.6. if test -f /usr/share/locale/ja_JP.eucJP/LC_CTYPE; then gt_cv_locale_ja=ja_JP.eucJP else # None found. gt_cv_locale_ja=none fi fi fi fi fi fi ;; esac fi rm -fr conftest* fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gt_cv_locale_ja" >&5 printf "%s\n" "$gt_cv_locale_ja" >&6; } LOCALE_JA=$gt_cv_locale_ja { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a french Unicode locale" >&5 printf %s "checking for a french Unicode locale... " >&6; } if test ${gt_cv_locale_fr_utf8+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if HAVE_LANGINFO_CODESET # include #endif #include #include struct tm t; char buf[16]; int main () { /* On BeOS and Haiku, locales are not implemented in libc. Rather, libintl imitates locale dependent behaviour by looking at the environment variables, and all locales use the UTF-8 encoding. */ #if !(defined __BEOS__ || defined __HAIKU__) /* Check whether the given locale name is recognized by the system. */ # if defined _WIN32 && !defined __CYGWIN__ /* On native Windows, setlocale(category, "") looks at the system settings, not at the environment variables. Also, when an encoding suffix such as ".65001" or ".54936" is specified, it succeeds but sets the LC_CTYPE category of the locale to "C". */ if (setlocale (LC_ALL, getenv ("LC_ALL")) == NULL || strcmp (setlocale (LC_CTYPE, NULL), "C") == 0) return 1; # else if (setlocale (LC_ALL, "") == NULL) return 1; # endif /* Check whether nl_langinfo(CODESET) is nonempty and not "ASCII" or "646". On Mac OS X 10.3.5 (Darwin 7.5) in the fr_FR locale, nl_langinfo(CODESET) is empty, and the behaviour of Tcl 8.4 in this locale is not useful. On OpenBSD 4.0, when an unsupported locale is specified, setlocale() succeeds but then nl_langinfo(CODESET) is "646". In this situation, some unit tests fail. */ # if HAVE_LANGINFO_CODESET { const char *cs = nl_langinfo (CODESET); if (cs[0] == '\0' || strcmp (cs, "ASCII") == 0 || strcmp (cs, "646") == 0) return 1; } # endif # ifdef __CYGWIN__ /* On Cygwin, avoid locale names without encoding suffix, because the locale_charset() function relies on the encoding suffix. Note that LC_ALL is set on the command line. */ if (strchr (getenv ("LC_ALL"), '.') == NULL) return 1; # endif /* Check whether in the abbreviation of the second month, the second character (should be U+00E9: LATIN SMALL LETTER E WITH ACUTE) is two bytes long, with UTF-8 encoding. */ t.tm_year = 1975 - 1900; t.tm_mon = 2 - 1; t.tm_mday = 4; if (strftime (buf, sizeof (buf), "%b", &t) < 4 || buf[1] != (char) 0xc3 || buf[2] != (char) 0xa9 || buf[3] != 'v') return 1; #endif #if !defined __BIONIC__ /* Bionic libc's 'struct lconv' is just a dummy. */ /* Check whether the decimal separator is a comma. On NetBSD 3.0 in the fr_FR.ISO8859-1 locale, localeconv()->decimal_point are nl_langinfo(RADIXCHAR) are both ".". */ if (localeconv () ->decimal_point[0] != ',') return 1; #endif return 0; } _ACEOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest$ac_exeext; then case "$host_os" in # Handle native Windows specially, because there setlocale() interprets # "ar" as "Arabic" or "Arabic_Saudi Arabia.1256", # "fr" or "fra" as "French" or "French_France.1252", # "ge"(!) or "deu"(!) as "German" or "German_Germany.1252", # "ja" as "Japanese" or "Japanese_Japan.932", # and similar. mingw*) # Test for the hypothetical native Windows locale name. if (LC_ALL=French_France.65001 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then gt_cv_locale_fr_utf8=French_France.65001 else # None found. gt_cv_locale_fr_utf8=none fi ;; *) # Setting LC_ALL is not enough. Need to set LC_TIME to empty, because # otherwise on Mac OS X 10.3.5 the LC_TIME=C from the beginning of the # configure script would override the LC_ALL setting. Likewise for # LC_CTYPE, which is also set at the beginning of the configure script. # Test for the usual locale name. if (LC_ALL=fr_FR LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then gt_cv_locale_fr_utf8=fr_FR else # Test for the locale name with explicit encoding suffix. if (LC_ALL=fr_FR.UTF-8 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then gt_cv_locale_fr_utf8=fr_FR.UTF-8 else # Test for the Solaris 7 locale name. if (LC_ALL=fr.UTF-8 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then gt_cv_locale_fr_utf8=fr.UTF-8 else # None found. gt_cv_locale_fr_utf8=none fi fi fi ;; esac fi rm -fr conftest* fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gt_cv_locale_fr_utf8" >&5 printf "%s\n" "$gt_cv_locale_fr_utf8" >&6; } LOCALE_FR_UTF8=$gt_cv_locale_fr_utf8 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a transitional chinese locale" >&5 printf %s "checking for a transitional chinese locale... " >&6; } if test ${gt_cv_locale_zh_CN+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #if HAVE_LANGINFO_CODESET # include #endif #include #include struct tm t; char buf[16]; int main () { /* On BeOS and Haiku, locales are not implemented in libc. Rather, libintl imitates locale dependent behaviour by looking at the environment variables, and all locales use the UTF-8 encoding. */ #if defined __BEOS__ || defined __HAIKU__ return 1; #else /* Check whether the given locale name is recognized by the system. */ # if defined _WIN32 && !defined __CYGWIN__ /* On native Windows, setlocale(category, "") looks at the system settings, not at the environment variables. Also, when an encoding suffix such as ".65001" or ".54936" is specified, it succeeds but sets the LC_CTYPE category of the locale to "C". */ if (setlocale (LC_ALL, getenv ("LC_ALL")) == NULL || strcmp (setlocale (LC_CTYPE, NULL), "C") == 0) return 1; # else if (setlocale (LC_ALL, "") == NULL) return 1; # endif /* Check whether nl_langinfo(CODESET) is nonempty and not "ASCII" or "646". On Mac OS X 10.3.5 (Darwin 7.5) in the fr_FR locale, nl_langinfo(CODESET) is empty, and the behaviour of Tcl 8.4 in this locale is not useful. On OpenBSD 4.0, when an unsupported locale is specified, setlocale() succeeds but then nl_langinfo(CODESET) is "646". In this situation, some unit tests fail. On MirBSD 10, when an unsupported locale is specified, setlocale() succeeds but then nl_langinfo(CODESET) is "UTF-8". */ # if HAVE_LANGINFO_CODESET { const char *cs = nl_langinfo (CODESET); if (cs[0] == '\0' || strcmp (cs, "ASCII") == 0 || strcmp (cs, "646") == 0 || strcmp (cs, "UTF-8") == 0) return 1; } # endif # ifdef __CYGWIN__ /* On Cygwin, avoid locale names without encoding suffix, because the locale_charset() function relies on the encoding suffix. Note that LC_ALL is set on the command line. */ if (strchr (getenv ("LC_ALL"), '.') == NULL) return 1; # endif /* Check whether in a month name, no byte in the range 0x80..0x9F occurs. This excludes the UTF-8 encoding (except on MirBSD). */ { const char *p; t.tm_year = 1975 - 1900; t.tm_mon = 2 - 1; t.tm_mday = 4; if (strftime (buf, sizeof (buf), "%B", &t) < 2) return 1; for (p = buf; *p != '\0'; p++) if ((unsigned char) *p >= 0x80 && (unsigned char) *p < 0xa0) return 1; } /* Check whether a typical GB18030 multibyte sequence is recognized as a single wide character. This excludes the GB2312 and GBK encodings. */ if (mblen ("\203\062\332\066", 5) != 4) return 1; return 0; #endif } _ACEOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest$ac_exeext; then case "$host_os" in # Handle native Windows specially, because there setlocale() interprets # "ar" as "Arabic" or "Arabic_Saudi Arabia.1256", # "fr" or "fra" as "French" or "French_France.1252", # "ge"(!) or "deu"(!) as "German" or "German_Germany.1252", # "ja" as "Japanese" or "Japanese_Japan.932", # and similar. mingw*) # Test for the hypothetical native Windows locale name. if (LC_ALL=Chinese_China.54936 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then gt_cv_locale_zh_CN=Chinese_China.54936 else # None found. gt_cv_locale_zh_CN=none fi ;; solaris2.8) # On Solaris 8, the locales zh_CN.GB18030, zh_CN.GBK, zh.GBK are # broken. One witness is the test case in gl_MBRTOWC_SANITYCHECK. # Another witness is that "LC_ALL=zh_CN.GB18030 bash -c true" dumps core. gt_cv_locale_zh_CN=none ;; *) # Setting LC_ALL is not enough. Need to set LC_TIME to empty, because # otherwise on Mac OS X 10.3.5 the LC_TIME=C from the beginning of the # configure script would override the LC_ALL setting. Likewise for # LC_CTYPE, which is also set at the beginning of the configure script. # Test for the locale name without encoding suffix. if (LC_ALL=zh_CN LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then gt_cv_locale_zh_CN=zh_CN else # Test for the locale name with explicit encoding suffix. if (LC_ALL=zh_CN.GB18030 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then gt_cv_locale_zh_CN=zh_CN.GB18030 else # None found. gt_cv_locale_zh_CN=none fi fi ;; esac else # If there was a link error, due to mblen(), the system is so old that # it certainly doesn't have a chinese locale. gt_cv_locale_zh_CN=none fi rm -fr conftest* fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gt_cv_locale_zh_CN" >&5 printf "%s\n" "$gt_cv_locale_zh_CN" >&6; } LOCALE_ZH_CN=$gt_cv_locale_zh_CN # Check for mmap(). Don't use AC_FUNC_MMAP, because it checks too much: it # fails on HP-UX 11, because MAP_FIXED mappings do not work. But this is # irrelevant for anonymous mappings. ac_fn_c_check_func "$LINENO" "mmap" "ac_cv_func_mmap" if test "x$ac_cv_func_mmap" = xyes then : gl_have_mmap=yes else $as_nop gl_have_mmap=no fi # Try to allow MAP_ANONYMOUS. gl_have_mmap_anonymous=no if test $gl_have_mmap = yes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for MAP_ANONYMOUS" >&5 printf %s "checking for MAP_ANONYMOUS... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef MAP_ANONYMOUS I cannot identify this map #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "I cannot identify this map" >/dev/null 2>&1 then : gl_have_mmap_anonymous=yes fi rm -rf conftest* if test $gl_have_mmap_anonymous != yes; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef MAP_ANON I cannot identify this map #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "I cannot identify this map" >/dev/null 2>&1 then : printf "%s\n" "#define MAP_ANONYMOUS MAP_ANON" >>confdefs.h gl_have_mmap_anonymous=yes fi rm -rf conftest* fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_have_mmap_anonymous" >&5 printf "%s\n" "$gl_have_mmap_anonymous" >&6; } if test $gl_have_mmap_anonymous = yes; then printf "%s\n" "#define HAVE_MAP_ANONYMOUS 1" >>confdefs.h fi fi HAVE_MBSLEN=0; HAVE_EXPLICIT_BZERO=1; HAVE_FFSL=1; HAVE_FFSLL=1; HAVE_DECL_MEMMEM=1; HAVE_MEMPCPY=1; HAVE_DECL_MEMRCHR=1; HAVE_RAWMEMCHR=1; HAVE_STPCPY=1; HAVE_STPNCPY=1; HAVE_STRCHRNUL=1; HAVE_DECL_STRDUP=1; HAVE_DECL_STRNDUP=1; HAVE_DECL_STRNLEN=1; HAVE_STRPBRK=1; HAVE_STRSEP=1; HAVE_STRCASESTR=1; HAVE_DECL_STRTOK_R=1; HAVE_DECL_STRERROR_R=1; HAVE_STRERRORNAME_NP=1; HAVE_SIGABBREV_NP=1; HAVE_SIGDESCR_NP=1; HAVE_DECL_STRSIGNAL=1; HAVE_STRVERSCMP=1; REPLACE_FFSLL=0; REPLACE_MEMCHR=0; REPLACE_MEMMEM=0; REPLACE_STPNCPY=0; REPLACE_STRCHRNUL=0; REPLACE_STRDUP=0; REPLACE_STRNCAT=0; REPLACE_STRNDUP=0; REPLACE_STRNLEN=0; REPLACE_STRSTR=0; REPLACE_STRCASESTR=0; REPLACE_STRTOK_R=0; REPLACE_STRERROR=0; REPLACE_STRERROR_R=0; REPLACE_STRERRORNAME_NP=0; REPLACE_STRSIGNAL=0; UNDEFINE_STRTOK_R=0; # Detect platform-specific bugs in some versions of glibc: # memchr should not dereference anything with length 0 # https://bugzilla.redhat.com/show_bug.cgi?id=499689 # memchr should not dereference overestimated length after a match # https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=521737 # https://sourceware.org/bugzilla/show_bug.cgi?id=10162 # memchr should cast the second argument to 'unsigned char'. # This bug exists in Android 4.3. # Assume that memchr works on platforms that lack mprotect. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether memchr works" >&5 printf %s "checking whether memchr works... " >&6; } if test ${gl_cv_func_memchr_works+y} then : printf %s "(cached) " >&6 else $as_nop if test "$cross_compiling" = yes then : case "$host_os" in # Guess no on Android. linux*-android*) gl_cv_func_memchr_works="guessing no" ;; # Guess yes on native Windows. mingw*) gl_cv_func_memchr_works="guessing yes" ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_memchr_works="$gl_cross_guess_normal" ;; esac else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #if HAVE_SYS_MMAN_H # include # include # include # include # ifndef MAP_FILE # define MAP_FILE 0 # endif #endif int main (void) { int result = 0; char *fence = NULL; #if HAVE_SYS_MMAN_H && HAVE_MPROTECT # if HAVE_MAP_ANONYMOUS const int flags = MAP_ANONYMOUS | MAP_PRIVATE; const int fd = -1; # else /* !HAVE_MAP_ANONYMOUS */ const int flags = MAP_FILE | MAP_PRIVATE; int fd = open ("/dev/zero", O_RDONLY, 0666); if (fd >= 0) # endif { int pagesize = getpagesize (); char *two_pages = (char *) mmap (NULL, 2 * pagesize, PROT_READ | PROT_WRITE, flags, fd, 0); if (two_pages != (char *)(-1) && mprotect (two_pages + pagesize, pagesize, PROT_NONE) == 0) fence = two_pages + pagesize; } #endif if (fence) { /* Test against bugs on glibc systems. */ if (memchr (fence, 0, 0)) result |= 1; strcpy (fence - 9, "12345678"); if (memchr (fence - 9, 0, 79) != fence - 1) result |= 2; if (memchr (fence - 1, 0, 3) != fence - 1) result |= 4; /* Test against bug on AIX 7.2. */ if (memchr (fence - 4, '6', 16) != fence - 4) result |= 8; } /* Test against bug on Android 4.3. */ { char input[3]; input[0] = 'a'; input[1] = 'b'; input[2] = 'c'; if (memchr (input, 0x789abc00 | 'b', 3) != input + 1) result |= 16; } return result; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO" then : gl_cv_func_memchr_works=yes else $as_nop gl_cv_func_memchr_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_memchr_works" >&5 printf "%s\n" "$gl_cv_func_memchr_works" >&6; } case "$gl_cv_func_memchr_works" in *yes) ;; *) REPLACE_MEMCHR=1 ;; esac GL_GNULIB_EXPLICIT_BZERO=0 GL_GNULIB_FFSL=0 GL_GNULIB_FFSLL=0 GL_GNULIB_MEMCHR=0 GL_GNULIB_MEMMEM=0 GL_GNULIB_MEMPCPY=0 GL_GNULIB_MEMRCHR=0 GL_GNULIB_RAWMEMCHR=0 GL_GNULIB_STPCPY=0 GL_GNULIB_STPNCPY=0 GL_GNULIB_STRCHRNUL=0 GL_GNULIB_STRDUP=0 GL_GNULIB_STRNCAT=0 GL_GNULIB_STRNDUP=0 GL_GNULIB_STRNLEN=0 GL_GNULIB_STRPBRK=0 GL_GNULIB_STRSEP=0 GL_GNULIB_STRSTR=0 GL_GNULIB_STRCASESTR=0 GL_GNULIB_STRTOK_R=0 GL_GNULIB_MBSLEN=0 GL_GNULIB_MBSNLEN=0 GL_GNULIB_MBSCHR=0 GL_GNULIB_MBSRCHR=0 GL_GNULIB_MBSSTR=0 GL_GNULIB_MBSCASECMP=0 GL_GNULIB_MBSNCASECMP=0 GL_GNULIB_MBSPCASECMP=0 GL_GNULIB_MBSCASESTR=0 GL_GNULIB_MBSCSPN=0 GL_GNULIB_MBSPBRK=0 GL_GNULIB_MBSSPN=0 GL_GNULIB_MBSSEP=0 GL_GNULIB_MBSTOK_R=0 GL_GNULIB_STRERROR=0 GL_GNULIB_STRERROR_R=0 GL_GNULIB_STRERRORNAME_NP=0 GL_GNULIB_SIGABBREV_NP=0 GL_GNULIB_SIGDESCR_NP=0 GL_GNULIB_STRSIGNAL=0 GL_GNULIB_STRVERSCMP=0 GL_GNULIB_MDA_MEMCCPY=1 GL_GNULIB_MDA_STRDUP=1 ac_fn_check_decl "$LINENO" "memrchr" "ac_cv_have_decl_memrchr" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_memrchr" = xyes then : ac_have_decl=1 else $as_nop ac_have_decl=0 fi printf "%s\n" "#define HAVE_DECL_MEMRCHR $ac_have_decl" >>confdefs.h { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for O_CLOEXEC" >&5 printf %s "checking for O_CLOEXEC... " >&6; } if test ${gl_cv_macro_O_CLOEXEC+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifndef O_CLOEXEC choke me; #endif int main (void) { return O_CLOEXEC; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : gl_cv_macro_O_CLOEXEC=yes else $as_nop gl_cv_macro_O_CLOEXEC=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_macro_O_CLOEXEC" >&5 printf "%s\n" "$gl_cv_macro_O_CLOEXEC" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for promoted mode_t type" >&5 printf %s "checking for promoted mode_t type... " >&6; } if test ${gl_cv_promoted_mode_t+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { typedef int array[2 * (sizeof (mode_t) < sizeof (int)) - 1]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : gl_cv_promoted_mode_t='int' else $as_nop gl_cv_promoted_mode_t='mode_t' fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_promoted_mode_t" >&5 printf "%s\n" "$gl_cv_promoted_mode_t" >&6; } printf "%s\n" "#define PROMOTED_MODE_T $gl_cv_promoted_mode_t" >>confdefs.h { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether lstat correctly handles trailing slash" >&5 printf %s "checking whether lstat correctly handles trailing slash... " >&6; } if test ${gl_cv_func_lstat_dereferences_slashed_symlink+y} then : printf %s "(cached) " >&6 else $as_nop rm -f conftest.sym conftest.file echo >conftest.file if test "$cross_compiling" = yes then : case "$host_os" in linux-* | linux) # Guess yes on Linux systems. gl_cv_func_lstat_dereferences_slashed_symlink="guessing yes" ;; *-gnu* | gnu*) # Guess yes on glibc systems. gl_cv_func_lstat_dereferences_slashed_symlink="guessing yes" ;; mingw*) # Guess no on native Windows. gl_cv_func_lstat_dereferences_slashed_symlink="guessing no" ;; *) # If we don't know, obey --enable-cross-guesses. gl_cv_func_lstat_dereferences_slashed_symlink="$gl_cross_guess_normal" ;; esac else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main (void) { struct stat sbuf; if (symlink ("conftest.file", "conftest.sym") != 0) return 1; /* Linux will dereference the symlink and fail, as required by POSIX. That is better in the sense that it means we will not have to compile and use the lstat wrapper. */ return lstat ("conftest.sym/", &sbuf) == 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO" then : gl_cv_func_lstat_dereferences_slashed_symlink=yes else $as_nop gl_cv_func_lstat_dereferences_slashed_symlink=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f conftest.sym conftest.file fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_lstat_dereferences_slashed_symlink" >&5 printf "%s\n" "$gl_cv_func_lstat_dereferences_slashed_symlink" >&6; } case "$gl_cv_func_lstat_dereferences_slashed_symlink" in *yes) printf "%s\n" "#define LSTAT_FOLLOWS_SLASHED_SYMLINK 1" >>confdefs.h ;; esac if test $REPLACE_MALLOC_FOR_MALLOC_POSIX = 1; then REPLACE_REALLOC_FOR_REALLOC_POSIX=1 fi ac_fn_check_decl "$LINENO" "alarm" "ac_cv_have_decl_alarm" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_alarm" = xyes then : ac_have_decl=1 else $as_nop ac_have_decl=0 fi printf "%s\n" "#define HAVE_DECL_ALARM $ac_have_decl" >>confdefs.h { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for stdbool.h that conforms to C99" >&5 printf %s "checking for stdbool.h that conforms to C99... " >&6; } if test ${ac_cv_header_stdbool_h+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef __cplusplus typedef bool Bool; #else typedef _Bool Bool; #ifndef bool "error: bool is not defined" #endif #ifndef false "error: false is not defined" #endif #if false "error: false is not 0" #endif #ifndef true "error: true is not defined" #endif #if true != 1 "error: true is not 1" #endif #endif #ifndef __bool_true_false_are_defined "error: __bool_true_false_are_defined is not defined" #endif struct s { Bool s: 1; Bool t; bool u: 1; bool v; } s; char a[true == 1 ? 1 : -1]; char b[false == 0 ? 1 : -1]; char c[__bool_true_false_are_defined == 1 ? 1 : -1]; char d[(bool) 0.5 == true ? 1 : -1]; /* See body of main program for 'e'. */ char f[(Bool) 0.0 == false ? 1 : -1]; char g[true]; char h[sizeof (Bool)]; char i[sizeof s.t]; enum { j = false, k = true, l = false * true, m = true * 256 }; /* The following fails for HP aC++/ANSI C B3910B A.05.55 [Dec 04 2003]. */ Bool n[m]; char o[sizeof n == m * sizeof n[0] ? 1 : -1]; char p[-1 - (Bool) 0 < 0 && -1 - (bool) 0 < 0 ? 1 : -1]; /* Catch a bug in an HP-UX C compiler. See https://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html https://lists.gnu.org/r/bug-coreutils/2005-11/msg00161.html */ Bool q = true; Bool *pq = &q; bool *qq = &q; int main (void) { bool e = &s; *pq |= q; *pq |= ! q; *qq |= q; *qq |= ! q; /* Refer to every declared value, to avoid compiler optimizations. */ return (!a + !b + !c + !d + !e + !f + !g + !h + !i + !!j + !k + !!l + !m + !n + !o + !p + !q + !pq + !qq); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_header_stdbool_h=yes else $as_nop ac_cv_header_stdbool_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdbool_h" >&5 printf "%s\n" "$ac_cv_header_stdbool_h" >&6; } ac_fn_c_check_type "$LINENO" "_Bool" "ac_cv_type__Bool" "$ac_includes_default" if test "x$ac_cv_type__Bool" = xyes then : printf "%s\n" "#define HAVE__BOOL 1" >>confdefs.h fi ac_fn_check_decl "$LINENO" "fcloseall" "ac_cv_have_decl_fcloseall" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_fcloseall" = xyes then : ac_have_decl=1 else $as_nop ac_have_decl=0 fi printf "%s\n" "#define HAVE_DECL_FCLOSEALL $ac_have_decl" >>confdefs.h printf "%s\n" "#define __USE_MINGW_ANSI_STDIO 1" >>confdefs.h if test $gl_cv_have_include_next = yes; then gl_cv_next_stdio_h='<'stdio.h'>' else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 printf %s "checking absolute name of ... " >&6; } if test ${gl_cv_next_stdio_h+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'stdio.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_absolute_stdio_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"` gl_header=$gl_cv_absolute_stdio_h gl_cv_next_stdio_h='"'$gl_header'"' fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_stdio_h" >&5 printf "%s\n" "$gl_cv_next_stdio_h" >&6; } fi NEXT_STDIO_H=$gl_cv_next_stdio_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'stdio.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_stdio_h fi NEXT_AS_FIRST_DIRECTIVE_STDIO_H=$gl_next_as_first_directive { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking which flavor of printf attribute matches inttypes macros" >&5 printf %s "checking which flavor of printf attribute matches inttypes macros... " >&6; } if test ${gl_cv_func_printf_attribute_flavor+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define __STDC_FORMAT_MACROS 1 #include #include /* For non-mingw systems, compilation will trivially succeed. For mingw, compilation will succeed for older mingw (system printf, "I64d") and fail for newer mingw (gnu printf, "lld"). */ #if (defined _WIN32 && ! defined __CYGWIN__) && \ (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)) extern char PRIdMAX_probe[sizeof PRIdMAX == sizeof "I64d" ? 1 : -1]; #endif int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : gl_cv_func_printf_attribute_flavor=system else $as_nop gl_cv_func_printf_attribute_flavor=gnu fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_attribute_flavor" >&5 printf "%s\n" "$gl_cv_func_printf_attribute_flavor" >&6; } if test "$gl_cv_func_printf_attribute_flavor" = gnu; then printf "%s\n" "#define GNULIB_PRINTF_ATTRIBUTE_FLAVOR_GNU 1" >>confdefs.h fi if test $ac_cv_have_decl_fcloseall = no; then HAVE_DECL_FCLOSEALL=0 fi ac_fn_check_decl "$LINENO" "ecvt" "ac_cv_have_decl_ecvt" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_ecvt" = xyes then : ac_have_decl=1 else $as_nop ac_have_decl=0 fi printf "%s\n" "#define HAVE_DECL_ECVT $ac_have_decl" >>confdefs.h ac_fn_check_decl "$LINENO" "fcvt" "ac_cv_have_decl_fcvt" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_fcvt" = xyes then : ac_have_decl=1 else $as_nop ac_have_decl=0 fi printf "%s\n" "#define HAVE_DECL_FCVT $ac_have_decl" >>confdefs.h ac_fn_check_decl "$LINENO" "gcvt" "ac_cv_have_decl_gcvt" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_gcvt" = xyes then : ac_have_decl=1 else $as_nop ac_have_decl=0 fi printf "%s\n" "#define HAVE_DECL_GCVT $ac_have_decl" >>confdefs.h if test $gl_cv_have_include_next = yes; then gl_cv_next_stdlib_h='<'stdlib.h'>' else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 printf %s "checking absolute name of ... " >&6; } if test ${gl_cv_next_stdlib_h+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'stdlib.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_absolute_stdlib_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"` gl_header=$gl_cv_absolute_stdlib_h gl_cv_next_stdlib_h='"'$gl_header'"' fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_stdlib_h" >&5 printf "%s\n" "$gl_cv_next_stdlib_h" >&6; } fi NEXT_STDLIB_H=$gl_cv_next_stdlib_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'stdlib.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_stdlib_h fi NEXT_AS_FIRST_DIRECTIVE_STDLIB_H=$gl_next_as_first_directive if test $ac_cv_have_decl_ecvt = no; then HAVE_DECL_ECVT=0 fi if test $ac_cv_have_decl_fcvt = no; then HAVE_DECL_FCVT=0 fi if test $ac_cv_have_decl_gcvt = no; then HAVE_DECL_GCVT=0 fi HAVE_FFS=1; HAVE_STRCASECMP=1; HAVE_DECL_STRNCASECMP=1; ac_fn_check_decl "$LINENO" "strdup" "ac_cv_have_decl_strdup" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_strdup" = xyes then : ac_have_decl=1 else $as_nop ac_have_decl=0 fi printf "%s\n" "#define HAVE_DECL_STRDUP $ac_have_decl" >>confdefs.h REPLACE_STRERROR_0=0 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether strerror(0) succeeds" >&5 printf %s "checking whether strerror(0) succeeds... " >&6; } if test ${gl_cv_func_strerror_0_works+y} then : printf %s "(cached) " >&6 else $as_nop if test "$cross_compiling" = yes then : case "$host_os" in # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_strerror_0_works="guessing yes" ;; # Guess yes on musl systems. *-musl*) gl_cv_func_strerror_0_works="guessing yes" ;; # Guess yes on native Windows. mingw*) gl_cv_func_strerror_0_works="guessing yes" ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_strerror_0_works="$gl_cross_guess_normal" ;; esac else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main (void) { int result = 0; char *str; errno = 0; str = strerror (0); if (!*str) result |= 1; if (errno) result |= 2; if (strstr (str, "nknown") || strstr (str, "ndefined")) result |= 4; return result; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO" then : gl_cv_func_strerror_0_works=yes else $as_nop gl_cv_func_strerror_0_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_strerror_0_works" >&5 printf "%s\n" "$gl_cv_func_strerror_0_works" >&6; } case "$gl_cv_func_strerror_0_works" in *yes) ;; *) REPLACE_STRERROR_0=1 printf "%s\n" "#define REPLACE_STRERROR_0 1" >>confdefs.h ;; esac if test $gl_cv_have_include_next = yes; then gl_cv_next_string_h='<'string.h'>' else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 printf %s "checking absolute name of ... " >&6; } if test ${gl_cv_next_string_h+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'string.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_absolute_string_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"` gl_header=$gl_cv_absolute_string_h gl_cv_next_string_h='"'$gl_header'"' fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_string_h" >&5 printf "%s\n" "$gl_cv_next_string_h" >&6; } fi NEXT_STRING_H=$gl_cv_next_string_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'string.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_string_h fi NEXT_AS_FIRST_DIRECTIVE_STRING_H=$gl_next_as_first_directive if test $gl_cv_have_include_next = yes; then gl_cv_next_strings_h='<'strings.h'>' else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 printf %s "checking absolute name of ... " >&6; } if test ${gl_cv_next_strings_h+y} then : printf %s "(cached) " >&6 else $as_nop if test $ac_cv_header_strings_h = yes; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'strings.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_absolute_strings_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"` gl_header=$gl_cv_absolute_strings_h gl_cv_next_strings_h='"'$gl_header'"' else gl_cv_next_strings_h='<'strings.h'>' fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_strings_h" >&5 printf "%s\n" "$gl_cv_next_strings_h" >&6; } fi NEXT_STRINGS_H=$gl_cv_next_strings_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'strings.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_strings_h fi NEXT_AS_FIRST_DIRECTIVE_STRINGS_H=$gl_next_as_first_directive if test $ac_cv_header_strings_h = yes; then HAVE_STRINGS_H=1 else HAVE_STRINGS_H=0 fi GL_GNULIB_FFS=0 ac_fn_check_decl "$LINENO" "strndup" "ac_cv_have_decl_strndup" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_strndup" = xyes then : ac_have_decl=1 else $as_nop ac_have_decl=0 fi printf "%s\n" "#define HAVE_DECL_STRNDUP $ac_have_decl" >>confdefs.h ac_fn_check_decl "$LINENO" "strnlen" "ac_cv_have_decl_strnlen" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_strnlen" = xyes then : ac_have_decl=1 else $as_nop ac_have_decl=0 fi printf "%s\n" "#define HAVE_DECL_STRNLEN $ac_have_decl" >>confdefs.h printf "%s\n" "#define _USE_STD_STAT 1" >>confdefs.h if test $gl_cv_have_include_next = yes; then gl_cv_next_sys_types_h='<'sys/types.h'>' else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 printf %s "checking absolute name of ... " >&6; } if test ${gl_cv_next_sys_types_h+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'sys/types.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_absolute_sys_types_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"` gl_header=$gl_cv_absolute_sys_types_h gl_cv_next_sys_types_h='"'$gl_header'"' fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_sys_types_h" >&5 printf "%s\n" "$gl_cv_next_sys_types_h" >&6; } fi NEXT_SYS_TYPES_H=$gl_cv_next_sys_types_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'sys/types.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_sys_types_h fi NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H=$gl_next_as_first_directive WINDOWS_STAT_INODES=0 HAVE_DECL_LOCALTIME_R=1; HAVE_NANOSLEEP=1; HAVE_STRPTIME=1; HAVE_TIMEGM=1; HAVE_TIMESPEC_GET=1; HAVE_TIMESPEC_GETRES=1; HAVE_TIMEZONE_T=0; REPLACE_CTIME=GNULIB_PORTCHECK; REPLACE_LOCALTIME_R=GNULIB_PORTCHECK; REPLACE_MKTIME=GNULIB_PORTCHECK; REPLACE_NANOSLEEP=GNULIB_PORTCHECK; REPLACE_STRFTIME=GNULIB_PORTCHECK; REPLACE_TIMEGM=GNULIB_PORTCHECK; REPLACE_TZSET=GNULIB_PORTCHECK; : ${GNULIB_GETTIMEOFDAY=0}; REPLACE_GMTIME=0; REPLACE_LOCALTIME=0; { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for struct timespec in " >&5 printf %s "checking for struct timespec in ... " >&6; } if test ${gl_cv_sys_struct_timespec_in_time_h+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { static struct timespec x; x.tv_sec = x.tv_nsec; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : gl_cv_sys_struct_timespec_in_time_h=yes else $as_nop gl_cv_sys_struct_timespec_in_time_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_sys_struct_timespec_in_time_h" >&5 printf "%s\n" "$gl_cv_sys_struct_timespec_in_time_h" >&6; } TIME_H_DEFINES_STRUCT_TIMESPEC=0 SYS_TIME_H_DEFINES_STRUCT_TIMESPEC=0 PTHREAD_H_DEFINES_STRUCT_TIMESPEC=0 UNISTD_H_DEFINES_STRUCT_TIMESPEC=0 if test $gl_cv_sys_struct_timespec_in_time_h = yes; then TIME_H_DEFINES_STRUCT_TIMESPEC=1 else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for struct timespec in " >&5 printf %s "checking for struct timespec in ... " >&6; } if test ${gl_cv_sys_struct_timespec_in_sys_time_h+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { static struct timespec x; x.tv_sec = x.tv_nsec; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : gl_cv_sys_struct_timespec_in_sys_time_h=yes else $as_nop gl_cv_sys_struct_timespec_in_sys_time_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_sys_struct_timespec_in_sys_time_h" >&5 printf "%s\n" "$gl_cv_sys_struct_timespec_in_sys_time_h" >&6; } if test $gl_cv_sys_struct_timespec_in_sys_time_h = yes; then SYS_TIME_H_DEFINES_STRUCT_TIMESPEC=1 else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for struct timespec in " >&5 printf %s "checking for struct timespec in ... " >&6; } if test ${gl_cv_sys_struct_timespec_in_pthread_h+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { static struct timespec x; x.tv_sec = x.tv_nsec; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : gl_cv_sys_struct_timespec_in_pthread_h=yes else $as_nop gl_cv_sys_struct_timespec_in_pthread_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_sys_struct_timespec_in_pthread_h" >&5 printf "%s\n" "$gl_cv_sys_struct_timespec_in_pthread_h" >&6; } if test $gl_cv_sys_struct_timespec_in_pthread_h = yes; then PTHREAD_H_DEFINES_STRUCT_TIMESPEC=1 else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for struct timespec in " >&5 printf %s "checking for struct timespec in ... " >&6; } if test ${gl_cv_sys_struct_timespec_in_unistd_h+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { static struct timespec x; x.tv_sec = x.tv_nsec; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : gl_cv_sys_struct_timespec_in_unistd_h=yes else $as_nop gl_cv_sys_struct_timespec_in_unistd_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_sys_struct_timespec_in_unistd_h" >&5 printf "%s\n" "$gl_cv_sys_struct_timespec_in_unistd_h" >&6; } if test $gl_cv_sys_struct_timespec_in_unistd_h = yes; then UNISTD_H_DEFINES_STRUCT_TIMESPEC=1 fi fi fi fi if test $gl_cv_have_include_next = yes; then gl_cv_next_time_h='<'time.h'>' else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 printf %s "checking absolute name of ... " >&6; } if test ${gl_cv_next_time_h+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'time.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_absolute_time_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"` gl_header=$gl_cv_absolute_time_h gl_cv_next_time_h='"'$gl_header'"' fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_time_h" >&5 printf "%s\n" "$gl_cv_next_time_h" >&6; } fi NEXT_TIME_H=$gl_cv_next_time_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'time.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_time_h fi NEXT_AS_FIRST_DIRECTIVE_TIME_H=$gl_next_as_first_directive { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for TIME_UTC in " >&5 printf %s "checking for TIME_UTC in ... " >&6; } if test ${gl_cv_time_h_has_TIME_UTC+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { static int x = TIME_UTC; x++; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : gl_cv_time_h_has_TIME_UTC=yes else $as_nop gl_cv_time_h_has_TIME_UTC=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_time_h_has_TIME_UTC" >&5 printf "%s\n" "$gl_cv_time_h_has_TIME_UTC" >&6; } if test $gl_cv_time_h_has_TIME_UTC = yes; then TIME_H_DEFINES_TIME_UTC=1 else TIME_H_DEFINES_TIME_UTC=0 fi GL_GNULIB_CTIME=0 GL_GNULIB_MKTIME=0 GL_GNULIB_LOCALTIME=0 GL_GNULIB_NANOSLEEP=0 GL_GNULIB_STRFTIME=0 GL_GNULIB_STRPTIME=0 GL_GNULIB_TIMEGM=0 GL_GNULIB_TIMESPEC_GET=0 GL_GNULIB_TIMESPEC_GETRES=0 GL_GNULIB_TIME_R=0 GL_GNULIB_TIME_RZ=0 GL_GNULIB_TZSET=0 GL_GNULIB_MDA_TZSET=1 ac_fn_check_decl "$LINENO" "execvpe" "ac_cv_have_decl_execvpe" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_execvpe" = xyes then : ac_have_decl=1 else $as_nop ac_have_decl=0 fi printf "%s\n" "#define HAVE_DECL_EXECVPE $ac_have_decl" >>confdefs.h if test $gl_cv_have_include_next = yes; then gl_cv_next_unistd_h='<'unistd.h'>' else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 printf %s "checking absolute name of ... " >&6; } if test ${gl_cv_next_unistd_h+y} then : printf %s "(cached) " >&6 else $as_nop if test $ac_cv_header_unistd_h = yes; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'unistd.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_absolute_unistd_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"` gl_header=$gl_cv_absolute_unistd_h gl_cv_next_unistd_h='"'$gl_header'"' else gl_cv_next_unistd_h='<'unistd.h'>' fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_unistd_h" >&5 printf "%s\n" "$gl_cv_next_unistd_h" >&6; } fi NEXT_UNISTD_H=$gl_cv_next_unistd_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'unistd.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_unistd_h fi NEXT_AS_FIRST_DIRECTIVE_UNISTD_H=$gl_next_as_first_directive if test $ac_cv_header_unistd_h = yes; then HAVE_UNISTD_H=1 else HAVE_UNISTD_H=0 fi if test $ac_cv_have_decl_execvpe = no; then HAVE_DECL_EXECVPE=0 fi gl_libunistring_sed_extract_major='/^[0-9]/{s/^\([0-9]*\).*/\1/p;q;} i\ 0 q ' gl_libunistring_sed_extract_minor='/^[0-9][0-9]*[.][0-9]/{s/^[0-9]*[.]\([0-9]*\).*/\1/p;q;} i\ 0 q ' gl_libunistring_sed_extract_subminor='/^[0-9][0-9]*[.][0-9][0-9]*[.][0-9]/{s/^[0-9]*[.][0-9]*[.]\([0-9]*\).*/\1/p;q;} i\ 0 q ' if test "$HAVE_LIBUNISTRING" = yes; then LIBUNISTRING_VERSION_MAJOR=`echo "$LIBUNISTRING_VERSION" | sed -n -e "$gl_libunistring_sed_extract_major"` LIBUNISTRING_VERSION_MINOR=`echo "$LIBUNISTRING_VERSION" | sed -n -e "$gl_libunistring_sed_extract_minor"` LIBUNISTRING_VERSION_SUBMINOR=`echo "$LIBUNISTRING_VERSION" | sed -n -e "$gl_libunistring_sed_extract_subminor"` fi if test $ac_cv_header_features_h = yes; then HAVE_FEATURES_H=1 else HAVE_FEATURES_H=0 fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for inttypes.h" >&5 printf %s "checking for inttypes.h... " >&6; } if test ${gl_cv_header_inttypes_h+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main (void) { uintmax_t i = (uintmax_t) -1; return !i; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : gl_cv_header_inttypes_h=yes else $as_nop gl_cv_header_inttypes_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_inttypes_h" >&5 printf "%s\n" "$gl_cv_header_inttypes_h" >&6; } if test $gl_cv_header_inttypes_h = yes; then printf "%s\n" "#define HAVE_INTTYPES_H_WITH_UINTMAX 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for stdint.h" >&5 printf %s "checking for stdint.h... " >&6; } if test ${gl_cv_header_stdint_h+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main (void) { uintmax_t i = (uintmax_t) -1; return !i; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : gl_cv_header_stdint_h=yes else $as_nop gl_cv_header_stdint_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_stdint_h" >&5 printf "%s\n" "$gl_cv_header_stdint_h" >&6; } if test $gl_cv_header_stdint_h = yes; then printf "%s\n" "#define HAVE_STDINT_H_WITH_UINTMAX 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for intmax_t" >&5 printf %s "checking for intmax_t... " >&6; } if test ${gt_cv_c_intmax_t+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if HAVE_STDINT_H_WITH_UINTMAX #include #endif #if HAVE_INTTYPES_H_WITH_UINTMAX #include #endif int main (void) { intmax_t x = -1; return !x; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : gt_cv_c_intmax_t=yes else $as_nop gt_cv_c_intmax_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gt_cv_c_intmax_t" >&5 printf "%s\n" "$gt_cv_c_intmax_t" >&6; } if test $gt_cv_c_intmax_t = yes; then printf "%s\n" "#define HAVE_INTMAX_T 1" >>confdefs.h else printf "%s\n" "#define intmax_t long long" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking where to find the exponent in a 'double'" >&5 printf %s "checking where to find the exponent in a 'double'... " >&6; } if test ${gl_cv_cc_double_expbit0+y} then : printf %s "(cached) " >&6 else $as_nop if test "$cross_compiling" = yes then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined arm || defined __arm || defined __arm__ mixed_endianness #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "mixed_endianness" >/dev/null 2>&1 then : gl_cv_cc_double_expbit0="unknown" else $as_nop : if test ${ac_cv_c_bigendian+y} then : printf %s "(cached) " >&6 else $as_nop ac_cv_c_bigendian=unknown # See if we're dealing with a universal compiler. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __APPLE_CC__ not a universal capable compiler #endif typedef int dummy; _ACEOF if ac_fn_c_try_compile "$LINENO" then : # Check for potential -arch flags. It is not universal unless # there are at least two -arch flags with different values. ac_arch= ac_prev= for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do if test -n "$ac_prev"; then case $ac_word in i?86 | x86_64 | ppc | ppc64) if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then ac_arch=$ac_word else ac_cv_c_bigendian=universal break fi ;; esac ac_prev= elif test "x$ac_word" = "x-arch"; then ac_prev=arch fi done fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext if test $ac_cv_c_bigendian = unknown; then # See if sys/param.h defines the BYTE_ORDER macro. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main (void) { #if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ && LITTLE_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : # It does; now see whether it defined to BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main (void) { #if BYTE_ORDER != BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_c_bigendian=yes else $as_nop ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # See if defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { #if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : # It does; now see whether it defined to _BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { #ifndef _BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_c_bigendian=yes else $as_nop ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # Compile a test program. if test "$cross_compiling" = yes then : # Try to guess by grepping values from an object file. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ unsigned short int ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; unsigned short int ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; int use_ascii (int i) { return ascii_mm[i] + ascii_ii[i]; } unsigned short int ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; unsigned short int ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; int use_ebcdic (int i) { return ebcdic_mm[i] + ebcdic_ii[i]; } extern int foo; int main (void) { return use_ascii (foo) == use_ebcdic (foo); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then ac_cv_c_bigendian=yes fi if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then if test "$ac_cv_c_bigendian" = unknown; then ac_cv_c_bigendian=no else # finding both strings is unlikely to happen, but who knows? ac_cv_c_bigendian=unknown fi fi fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main (void) { /* Are we little or big endian? From Harbison&Steele. */ union { long int l; char c[sizeof (long int)]; } u; u.l = 1; return u.c[sizeof (long int) - 1] == 1; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO" then : ac_cv_c_bigendian=no else $as_nop ac_cv_c_bigendian=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi : case $ac_cv_c_bigendian in #( yes) gl_cv_cc_double_expbit0="word 0 bit 20";; #( no) gl_cv_cc_double_expbit0="word 1 bit 20" ;; #( universal) printf "%s\n" "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h ;; #( *) gl_cv_cc_double_expbit0="unknown" ;; esac fi rm -rf conftest* else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include #define NWORDS \ ((sizeof (double) + sizeof (unsigned int) - 1) / sizeof (unsigned int)) typedef union { double value; unsigned int word[NWORDS]; } memory_double; static unsigned int ored_words[NWORDS]; static unsigned int anded_words[NWORDS]; static void add_to_ored_words (double x) { memory_double m; size_t i; /* Clear it first, in case sizeof (double) < sizeof (memory_double). */ memset (&m, 0, sizeof (memory_double)); m.value = x; for (i = 0; i < NWORDS; i++) { ored_words[i] |= m.word[i]; anded_words[i] &= m.word[i]; } } int main () { size_t j; FILE *fp = fopen ("conftest.out", "w"); if (fp == NULL) return 1; for (j = 0; j < NWORDS; j++) anded_words[j] = ~ (unsigned int) 0; add_to_ored_words (0.25); add_to_ored_words (0.5); add_to_ored_words (1.0); add_to_ored_words (2.0); add_to_ored_words (4.0); /* Remove bits that are common (e.g. if representation of the first mantissa bit is explicit). */ for (j = 0; j < NWORDS; j++) ored_words[j] &= ~anded_words[j]; /* Now find the nonzero word. */ for (j = 0; j < NWORDS; j++) if (ored_words[j] != 0) break; if (j < NWORDS) { size_t i; for (i = j + 1; i < NWORDS; i++) if (ored_words[i] != 0) { fprintf (fp, "unknown"); return (fclose (fp) != 0); } for (i = 0; ; i++) if ((ored_words[j] >> i) & 1) { fprintf (fp, "word %d bit %d", (int) j, (int) i); return (fclose (fp) != 0); } } fprintf (fp, "unknown"); return (fclose (fp) != 0); } _ACEOF if ac_fn_c_try_run "$LINENO" then : gl_cv_cc_double_expbit0=`cat conftest.out` else $as_nop gl_cv_cc_double_expbit0="unknown" fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f conftest.out fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_double_expbit0" >&5 printf "%s\n" "$gl_cv_cc_double_expbit0" >&6; } case "$gl_cv_cc_double_expbit0" in word*bit*) word=`echo "$gl_cv_cc_double_expbit0" | sed -e 's/word //' -e 's/ bit.*//'` bit=`echo "$gl_cv_cc_double_expbit0" | sed -e 's/word.*bit //'` printf "%s\n" "#define DBL_EXPBIT0_WORD $word" >>confdefs.h printf "%s\n" "#define DBL_EXPBIT0_BIT $bit" >>confdefs.h ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether snprintf returns a byte count as in C99" >&5 printf %s "checking whether snprintf returns a byte count as in C99... " >&6; } if test ${gl_cv_func_snprintf_retval_c99+y} then : printf %s "(cached) " >&6 else $as_nop if test "$cross_compiling" = yes then : case "$host_os" in # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_snprintf_retval_c99="guessing yes";; # Guess yes on musl systems. *-musl*) gl_cv_func_snprintf_retval_c99="guessing yes";; # Guess yes on FreeBSD >= 5. freebsd[1-4].*) gl_cv_func_snprintf_retval_c99="guessing no";; freebsd* | kfreebsd*) gl_cv_func_snprintf_retval_c99="guessing yes";; midnightbsd*) gl_cv_func_snprintf_retval_c99="guessing yes";; # Guess yes on Mac OS X >= 10.3. darwin[1-6].*) gl_cv_func_snprintf_retval_c99="guessing no";; darwin*) gl_cv_func_snprintf_retval_c99="guessing yes";; # Guess yes on OpenBSD >= 3.9. openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*) gl_cv_func_snprintf_retval_c99="guessing no";; openbsd*) gl_cv_func_snprintf_retval_c99="guessing yes";; # Guess yes on Solaris >= 2.10. solaris2.[1-9][0-9]*) gl_cv_func_printf_sizes_c99="guessing yes";; solaris*) gl_cv_func_printf_sizes_c99="guessing no";; # Guess yes on AIX >= 4. aix[1-3]*) gl_cv_func_snprintf_retval_c99="guessing no";; aix*) gl_cv_func_snprintf_retval_c99="guessing yes";; # Guess yes on NetBSD >= 3. netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*) gl_cv_func_snprintf_retval_c99="guessing no";; netbsd*) gl_cv_func_snprintf_retval_c99="guessing yes";; # Guess yes on BeOS. beos*) gl_cv_func_snprintf_retval_c99="guessing yes";; # Guess yes on Android. linux*-android*) gl_cv_func_snprintf_retval_c99="guessing yes";; # Guess yes on MSVC, no on mingw. mingw*) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef _MSC_VER Known #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "Known" >/dev/null 2>&1 then : gl_cv_func_snprintf_retval_c99="guessing yes" else $as_nop gl_cv_func_snprintf_retval_c99="guessing no" fi rm -rf conftest* ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_snprintf_retval_c99="$gl_cross_guess_normal";; esac else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if HAVE_SNPRINTF # define my_snprintf snprintf #else # include static int my_snprintf (char *buf, int size, const char *format, ...) { va_list args; int ret; va_start (args, format); ret = vsnprintf (buf, size, format, args); va_end (args); return ret; } #endif static char buf[100]; int main () { strcpy (buf, "ABCDEF"); if (my_snprintf (buf, 3, "%d %d", 4567, 89) != 7) return 1; if (my_snprintf (buf, 0, "%d %d", 4567, 89) != 7) return 2; if (my_snprintf (NULL, 0, "%d %d", 4567, 89) != 7) return 3; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO" then : gl_cv_func_snprintf_retval_c99=yes else $as_nop gl_cv_func_snprintf_retval_c99=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_snprintf_retval_c99" >&5 printf "%s\n" "$gl_cv_func_snprintf_retval_c99" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether snprintf truncates the result as in C99" >&5 printf %s "checking whether snprintf truncates the result as in C99... " >&6; } if test ${gl_cv_func_snprintf_truncation_c99+y} then : printf %s "(cached) " >&6 else $as_nop if test "$cross_compiling" = yes then : case "$host_os" in # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_snprintf_truncation_c99="guessing yes";; # Guess yes on musl systems. *-musl*) gl_cv_func_snprintf_truncation_c99="guessing yes";; # Guess yes on FreeBSD >= 5. freebsd[1-4].*) gl_cv_func_snprintf_truncation_c99="guessing no";; freebsd* | kfreebsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";; midnightbsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";; # Guess yes on Mac OS X >= 10.3. darwin[1-6].*) gl_cv_func_snprintf_truncation_c99="guessing no";; darwin*) gl_cv_func_snprintf_truncation_c99="guessing yes";; # Guess yes on OpenBSD >= 3.9. openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*) gl_cv_func_snprintf_truncation_c99="guessing no";; openbsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";; # Guess yes on Solaris >= 2.6. solaris2.[0-5] | solaris2.[0-5].*) gl_cv_func_snprintf_truncation_c99="guessing no";; solaris*) gl_cv_func_snprintf_truncation_c99="guessing yes";; # Guess yes on AIX >= 4. aix[1-3]*) gl_cv_func_snprintf_truncation_c99="guessing no";; aix*) gl_cv_func_snprintf_truncation_c99="guessing yes";; # Guess yes on HP-UX >= 11. hpux[7-9]* | hpux10*) gl_cv_func_snprintf_truncation_c99="guessing no";; hpux*) gl_cv_func_snprintf_truncation_c99="guessing yes";; # Guess yes on IRIX >= 6.5. irix6.5) gl_cv_func_snprintf_truncation_c99="guessing yes";; # Guess yes on OSF/1 >= 5. osf[3-4]*) gl_cv_func_snprintf_truncation_c99="guessing no";; osf*) gl_cv_func_snprintf_truncation_c99="guessing yes";; # Guess yes on NetBSD >= 3. netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*) gl_cv_func_snprintf_truncation_c99="guessing no";; netbsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";; # Guess yes on BeOS. beos*) gl_cv_func_snprintf_truncation_c99="guessing yes";; # Guess yes on Android. linux*-android*) gl_cv_func_snprintf_truncation_c99="guessing yes";; # Guess no on native Windows. mingw*) gl_cv_func_snprintf_truncation_c99="guessing no";; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_snprintf_truncation_c99="$gl_cross_guess_normal";; esac else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if HAVE_SNPRINTF # define my_snprintf snprintf #else # include static int my_snprintf (char *buf, int size, const char *format, ...) { va_list args; int ret; va_start (args, format); ret = vsnprintf (buf, size, format, args); va_end (args); return ret; } #endif static char buf[100]; int main () { strcpy (buf, "ABCDEF"); my_snprintf (buf, 3, "%d %d", 4567, 89); if (memcmp (buf, "45\0DEF", 6) != 0) return 1; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO" then : gl_cv_func_snprintf_truncation_c99=yes else $as_nop gl_cv_func_snprintf_truncation_c99=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_snprintf_truncation_c99" >&5 printf "%s\n" "$gl_cv_func_snprintf_truncation_c99" >&6; } ac_fn_c_check_func "$LINENO" "snprintf" "ac_cv_func_snprintf" if test "x$ac_cv_func_snprintf" = xyes then : printf "%s\n" "#define HAVE_SNPRINTF 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "strnlen" "ac_cv_func_strnlen" if test "x$ac_cv_func_strnlen" = xyes then : printf "%s\n" "#define HAVE_STRNLEN 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "wcslen" "ac_cv_func_wcslen" if test "x$ac_cv_func_wcslen" = xyes then : printf "%s\n" "#define HAVE_WCSLEN 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "wcsnlen" "ac_cv_func_wcsnlen" if test "x$ac_cv_func_wcsnlen" = xyes then : printf "%s\n" "#define HAVE_WCSNLEN 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "mbrtowc" "ac_cv_func_mbrtowc" if test "x$ac_cv_func_mbrtowc" = xyes then : printf "%s\n" "#define HAVE_MBRTOWC 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "wcrtomb" "ac_cv_func_wcrtomb" if test "x$ac_cv_func_wcrtomb" = xyes then : printf "%s\n" "#define HAVE_WCRTOMB 1" >>confdefs.h fi ac_fn_check_decl "$LINENO" "_snprintf" "ac_cv_have_decl__snprintf" "#include " "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl__snprintf" = xyes then : ac_have_decl=1 else $as_nop ac_have_decl=0 fi printf "%s\n" "#define HAVE_DECL__SNPRINTF $ac_have_decl" >>confdefs.h case "$gl_cv_func_snprintf_retval_c99" in *yes) printf "%s\n" "#define HAVE_SNPRINTF_RETVAL_C99 1" >>confdefs.h ;; esac case "$gl_cv_func_snprintf_truncation_c99" in *yes) printf "%s\n" "#define HAVE_SNPRINTF_TRUNCATION_C99 1" >>confdefs.h ;; esac ac_fn_check_decl "$LINENO" "vsnprintf" "ac_cv_have_decl_vsnprintf" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_vsnprintf" = xyes then : ac_have_decl=1 else $as_nop ac_have_decl=0 fi printf "%s\n" "#define HAVE_DECL_VSNPRINTF $ac_have_decl" >>confdefs.h if test $ac_cv_header_crtdefs_h = yes; then HAVE_CRTDEFS_H=1 else HAVE_CRTDEFS_H=0 fi if test $gl_cv_have_include_next = yes; then gl_cv_next_wchar_h='<'wchar.h'>' else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 printf %s "checking absolute name of ... " >&6; } if test ${gl_cv_next_wchar_h+y} then : printf %s "(cached) " >&6 else $as_nop if test $ac_cv_header_wchar_h = yes; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'wchar.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_absolute_wchar_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"` gl_header=$gl_cv_absolute_wchar_h gl_cv_next_wchar_h='"'$gl_header'"' else gl_cv_next_wchar_h='<'wchar.h'>' fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_wchar_h" >&5 printf "%s\n" "$gl_cv_next_wchar_h" >&6; } fi NEXT_WCHAR_H=$gl_cv_next_wchar_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'wchar.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_wchar_h fi NEXT_AS_FIRST_DIRECTIVE_WCHAR_H=$gl_next_as_first_directive if test $ac_cv_header_wchar_h = yes; then HAVE_WCHAR_H=1 else HAVE_WCHAR_H=0 fi if test $gt_cv_c_wint_t = yes; then HAVE_WINT_T=1 else HAVE_WINT_T=0 fi ac_fn_check_decl "$LINENO" "wcsdup" "ac_cv_have_decl_wcsdup" " #include " "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_wcsdup" = xyes then : ac_have_decl=1 else $as_nop ac_have_decl=0 fi printf "%s\n" "#define HAVE_DECL_WCSDUP $ac_have_decl" >>confdefs.h if test $ac_cv_have_decl_wcsdup = no; then HAVE_DECL_WCSDUP=0 fi HAVE_ISWBLANK=1; HAVE_WCTYPE_T=1; HAVE_WCTRANS_T=1; REPLACE_ISWBLANK=0; REPLACE_ISWDIGIT=0; REPLACE_ISWXDIGIT=0; if test $ac_cv_func_iswcntrl = yes; then HAVE_ISWCNTRL=1 else HAVE_ISWCNTRL=0 fi if test $gt_cv_c_wint_t = yes; then HAVE_WINT_T=1 else HAVE_WINT_T=0 fi if test $gl_cv_have_include_next = yes; then gl_cv_next_wctype_h='<'wctype.h'>' else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 printf %s "checking absolute name of ... " >&6; } if test ${gl_cv_next_wctype_h+y} then : printf %s "(cached) " >&6 else $as_nop if test $ac_cv_header_wctype_h = yes; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'wctype.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_absolute_wctype_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"` gl_header=$gl_cv_absolute_wctype_h gl_cv_next_wctype_h='"'$gl_header'"' else gl_cv_next_wctype_h='<'wctype.h'>' fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_wctype_h" >&5 printf "%s\n" "$gl_cv_next_wctype_h" >&6; } fi NEXT_WCTYPE_H=$gl_cv_next_wctype_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'wctype.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_wctype_h fi NEXT_AS_FIRST_DIRECTIVE_WCTYPE_H=$gl_next_as_first_directive if test $ac_cv_header_wctype_h = yes; then if test $ac_cv_func_iswcntrl = yes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether iswcntrl works" >&5 printf %s "checking whether iswcntrl works... " >&6; } if test ${gl_cv_func_iswcntrl_works+y} then : printf %s "(cached) " >&6 else $as_nop if test "$cross_compiling" = yes then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #if __GNU_LIBRARY__ == 1 Linux libc5 i18n is broken. #endif int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : gl_cv_func_iswcntrl_works="guessing yes" else $as_nop gl_cv_func_iswcntrl_works="guessing no" fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { return iswprint ('x') == 0; } _ACEOF if ac_fn_c_try_run "$LINENO" then : gl_cv_func_iswcntrl_works=yes else $as_nop gl_cv_func_iswcntrl_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_iswcntrl_works" >&5 printf "%s\n" "$gl_cv_func_iswcntrl_works" >&6; } fi HAVE_WCTYPE_H=1 else HAVE_WCTYPE_H=0 fi if test $GNULIBHEADERS_OVERRIDE_WINT_T = 1; then REPLACE_ISWCNTRL=1 else case "$gl_cv_func_iswcntrl_works" in *yes) REPLACE_ISWCNTRL=0 ;; *) REPLACE_ISWCNTRL=1 ;; esac fi if test $HAVE_ISWCNTRL = 0 || test $REPLACE_ISWCNTRL = 1; then : fi if test $REPLACE_ISWCNTRL = 1; then REPLACE_TOWLOWER=1 else ac_fn_c_check_func "$LINENO" "towlower" "ac_cv_func_towlower" if test "x$ac_cv_func_towlower" = xyes then : printf "%s\n" "#define HAVE_TOWLOWER 1" >>confdefs.h fi if test $ac_cv_func_towlower = yes; then REPLACE_TOWLOWER=0 else ac_fn_check_decl "$LINENO" "towlower" "ac_cv_have_decl_towlower" "#include #if HAVE_WCTYPE_H # include #endif " "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_towlower" = xyes then : ac_have_decl=1 else $as_nop ac_have_decl=0 fi printf "%s\n" "#define HAVE_DECL_TOWLOWER $ac_have_decl" >>confdefs.h if test $ac_cv_have_decl_towlower = yes; then REPLACE_TOWLOWER=1 else REPLACE_TOWLOWER=0 fi fi fi if test $HAVE_ISWCNTRL = 0 || test $REPLACE_TOWLOWER = 1; then : fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for wctype_t" >&5 printf %s "checking for wctype_t... " >&6; } if test ${gl_cv_type_wctype_t+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #if HAVE_WCTYPE_H # include #endif wctype_t a; int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : gl_cv_type_wctype_t=yes else $as_nop gl_cv_type_wctype_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_type_wctype_t" >&5 printf "%s\n" "$gl_cv_type_wctype_t" >&6; } if test $gl_cv_type_wctype_t = no; then HAVE_WCTYPE_T=0 fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for wctrans_t" >&5 printf %s "checking for wctrans_t... " >&6; } if test ${gl_cv_type_wctrans_t+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include wctrans_t a; int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : gl_cv_type_wctrans_t=yes else $as_nop gl_cv_type_wctrans_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_type_wctrans_t" >&5 printf "%s\n" "$gl_cv_type_wctrans_t" >&6; } if test $gl_cv_type_wctrans_t = no; then HAVE_WCTRANS_T=0 fi GL_GNULIB_ISWBLANK=0 GL_GNULIB_ISWDIGIT=0 GL_GNULIB_ISWXDIGIT=0 GL_GNULIB_WCTYPE=0 GL_GNULIB_ISWCTYPE=0 GL_GNULIB_WCTRANS=0 GL_GNULIB_TOWCTRANS=0 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler option to allow warnings" >&5 printf %s "checking for C compiler option to allow warnings... " >&6; } if test ${gl_cv_cc_wallow+y} then : printf %s "(cached) " >&6 else $as_nop rm -f conftest* echo 'int dummy;' > conftest.c { ac_try='${CC-cc} $CFLAGS $CPPFLAGS -c conftest.c 2>conftest1.err' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 (eval $ac_try) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; } >/dev/null { ac_try='${CC-cc} $CFLAGS $CPPFLAGS -Wno-error -c conftest.c 2>conftest2.err' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 (eval $ac_try) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; } >/dev/null if test $? = 0 && test `wc -l < conftest1.err` = `wc -l < conftest2.err`; then gl_cv_cc_wallow='-Wno-error' else gl_cv_cc_wallow=none fi rm -f conftest* fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_wallow" >&5 printf "%s\n" "$gl_cv_cc_wallow" >&6; } case "$gl_cv_cc_wallow" in none) GL_CFLAG_ALLOW_WARNINGS='' ;; *) GL_CFLAG_ALLOW_WARNINGS="$gl_cv_cc_wallow" ;; esac GL_CFLAG_GNULIB_WARNINGS='' if test -n "$GL_CFLAG_ALLOW_WARNINGS"; then cat > conftest.c <<\EOF #if __GNUC__ >= 3 || (__clang_major__ + (__clang_minor__ >= 9) > 3) -Wno-cast-qual -Wno-conversion -Wno-float-equal -Wno-sign-compare -Wno-undef -Wno-unused-function -Wno-unused-parameter #endif #if __GNUC__ + (__GNUC_MINOR__ >= 9) > 4 || (__clang_major__ + (__clang_minor__ >= 9) > 3) -Wno-float-conversion #endif #if __GNUC__ >= 7 || (__clang_major__ + (__clang_minor__ >= 9) > 3) -Wimplicit-fallthrough #endif #if __GNUC__ + (__GNUC_MINOR__ >= 8) > 4 || (__clang_major__ + (__clang_minor__ >= 9) > 3) -Wno-pedantic #endif #if __GNUC__ + (__GNUC_MINOR__ >= 3) > 4 || (__clang_major__ + (__clang_minor__ >= 9) > 3) -Wno-sign-conversion -Wno-type-limits #endif #if __GNUC__ + (__GNUC_MINOR__ >= 5) > 4 -Wno-unsuffixed-float-constants #endif EOF gl_command="$CC $CFLAGS $CPPFLAGS -E conftest.c > conftest.out" if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gl_command\""; } >&5 (eval $gl_command) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then gl_options=`grep -v '#' conftest.out` for word in $gl_options; do GL_CFLAG_GNULIB_WARNINGS="$GL_CFLAG_GNULIB_WARNINGS $word" done fi rm -f conftest.c conftest.out fi if false; then GL_COND_LIBTOOL_TRUE= GL_COND_LIBTOOL_FALSE='#' else GL_COND_LIBTOOL_TRUE='#' GL_COND_LIBTOOL_FALSE= fi gl_cond_libtool=false gl_libdeps= gl_ltlibdeps= gl_m4_base='m4' gl_source_base='grub-core/lib/gnulib' gl_source_base_prefix= if test $ac_cv_func_alloca_works = no; then : fi # Define an additional variable used in the Makefile substitution. if test $ac_cv_working_alloca_h = yes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for alloca as a compiler built-in" >&5 printf %s "checking for alloca as a compiler built-in... " >&6; } if test ${gl_cv_rpl_alloca+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined __GNUC__ || defined _AIX || defined _MSC_VER Need own alloca #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "Need own alloca" >/dev/null 2>&1 then : gl_cv_rpl_alloca=yes else $as_nop gl_cv_rpl_alloca=no fi rm -rf conftest* fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_rpl_alloca" >&5 printf "%s\n" "$gl_cv_rpl_alloca" >&6; } if test $gl_cv_rpl_alloca = yes; then printf "%s\n" "#define HAVE_ALLOCA 1" >>confdefs.h GL_GENERATE_ALLOCA_H=true else GL_GENERATE_ALLOCA_H=false fi else GL_GENERATE_ALLOCA_H=true fi if test $ac_cv_working_alloca_h = yes; then HAVE_ALLOCA_H=1 else HAVE_ALLOCA_H=0 fi case "$GL_GENERATE_ALLOCA_H" in false) ALLOCA_H='' ;; true) if test -z "$ALLOCA_H"; then ALLOCA_H="${gl_source_base_prefix}alloca.h" fi ;; *) echo "*** GL_GENERATE_ALLOCA_H is not set correctly" 1>&2; exit 1 ;; esac if $GL_GENERATE_ALLOCA_H; then GL_GENERATE_ALLOCA_H_TRUE= GL_GENERATE_ALLOCA_H_FALSE='#' else GL_GENERATE_ALLOCA_H_TRUE='#' GL_GENERATE_ALLOCA_H_FALSE= fi : if test -z "${GL_GENERATE_ALLOCA_H_TRUE}" && test -z "${GL_GENERATE_ALLOCA_H_FALSE}"; then GL_GENERATE_ALLOCA_H_TRUE='#' GL_GENERATE_ALLOCA_H_FALSE='#' fi ac_fn_check_decl "$LINENO" "program_invocation_name" "ac_cv_have_decl_program_invocation_name" "#include " "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_program_invocation_name" = xyes then : ac_have_decl=1 else $as_nop ac_have_decl=0 fi printf "%s\n" "#define HAVE_DECL_PROGRAM_INVOCATION_NAME $ac_have_decl" >>confdefs.h if test $ac_have_decl = 1 then : else $as_nop printf "%s\n" "#define GNULIB_PROGRAM_INVOCATION_NAME 1" >>confdefs.h fi ac_fn_check_decl "$LINENO" "program_invocation_short_name" "ac_cv_have_decl_program_invocation_short_name" "#include " "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_program_invocation_short_name" = xyes then : ac_have_decl=1 else $as_nop ac_have_decl=0 fi printf "%s\n" "#define HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME $ac_have_decl" >>confdefs.h if test $ac_have_decl = 1 then : else $as_nop printf "%s\n" "#define GNULIB_PROGRAM_INVOCATION_SHORT_NAME 1" >>confdefs.h fi # Check if program_invocation_name and program_invocation_short_name # are defined elsewhere. It is improbable that only one of them will # be defined and other not, I prefer to stay on the safe side and to # test each one separately. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether program_invocation_name is defined" >&5 printf %s "checking whether program_invocation_name is defined... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ extern char *program_invocation_name; int main (void) { program_invocation_name = "test"; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : printf "%s\n" "#define HAVE_PROGRAM_INVOCATION_NAME 1" >>confdefs.h { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether program_invocation_short_name is defined" >&5 printf %s "checking whether program_invocation_short_name is defined... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ extern char *program_invocation_short_name; int main (void) { program_invocation_short_name = "test"; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : printf "%s\n" "#define HAVE_PROGRAM_INVOCATION_SHORT_NAME 1" >>confdefs.h { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext XGETTEXT_EXTRA_OPTIONS="$XGETTEXT_EXTRA_OPTIONS --flag=argp_error:2:c-format" XGETTEXT_EXTRA_OPTIONS="$XGETTEXT_EXTRA_OPTIONS --flag=argp_failure:4:c-format" if test $ac_cv_func_btowc = no; then HAVE_BTOWC=0 else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether btowc(0) is correct" >&5 printf %s "checking whether btowc(0) is correct... " >&6; } if test ${gl_cv_func_btowc_nul+y} then : printf %s "(cached) " >&6 else $as_nop if test "$cross_compiling" = yes then : case "$host_os" in # Guess no on Cygwin. cygwin*) gl_cv_func_btowc_nul="guessing no" ;; # Guess yes on native Windows. mingw*) gl_cv_func_btowc_nul="guessing yes" ;; # Guess yes otherwise. *) gl_cv_func_btowc_nul="guessing yes" ;; esac else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { if (btowc ('\0') != 0) return 1; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO" then : gl_cv_func_btowc_nul=yes else $as_nop gl_cv_func_btowc_nul=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_btowc_nul" >&5 printf "%s\n" "$gl_cv_func_btowc_nul" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether btowc(EOF) is correct" >&5 printf %s "checking whether btowc(EOF) is correct... " >&6; } if test ${gl_cv_func_btowc_eof+y} then : printf %s "(cached) " >&6 else $as_nop case "$host_os" in # Guess no on IRIX. irix*) gl_cv_func_btowc_eof="guessing no" ;; # Guess yes on native Windows. mingw*) gl_cv_func_btowc_eof="guessing yes" ;; # Guess yes otherwise. *) gl_cv_func_btowc_eof="guessing yes" ;; esac if test $LOCALE_FR != none; then if test "$cross_compiling" = yes then : : else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { if (setlocale (LC_ALL, "$LOCALE_FR") != NULL) { if (btowc (EOF) != WEOF) return 1; } return 0; } _ACEOF if ac_fn_c_try_run "$LINENO" then : gl_cv_func_btowc_eof=yes else $as_nop gl_cv_func_btowc_eof=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_btowc_eof" >&5 printf "%s\n" "$gl_cv_func_btowc_eof" >&6; } case "$gl_cv_func_btowc_nul" in *yes) ;; *) REPLACE_BTOWC=1 ;; esac case "$gl_cv_func_btowc_eof" in *yes) ;; *) REPLACE_BTOWC=1 ;; esac fi if test $HAVE_BTOWC = 0 || test $REPLACE_BTOWC = 1; then GL_COND_OBJ_BTOWC_TRUE= GL_COND_OBJ_BTOWC_FALSE='#' else GL_COND_OBJ_BTOWC_TRUE='#' GL_COND_OBJ_BTOWC_FALSE= fi : if test -z "${GL_COND_OBJ_BTOWC_TRUE}" && test -z "${GL_COND_OBJ_BTOWC_FALSE}"; then GL_COND_OBJ_BTOWC_TRUE='#' GL_COND_OBJ_BTOWC_FALSE='#' fi if test -z "$GL_COND_OBJ_BTOWC_TRUE"; then : : fi GL_GNULIB_BTOWC=1 printf "%s\n" "#define GNULIB_TEST_BTOWC 1" >>confdefs.h { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for __builtin_expect" >&5 printf %s "checking for __builtin_expect... " >&6; } if test ${gl_cv___builtin_expect+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (int argc, char **argv) { argc = __builtin_expect (argc, 100); return argv[argc != 100][0]; } _ACEOF if ac_fn_c_try_link "$LINENO" then : gl_cv___builtin_expect=yes else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (int argc, char **argv) { argc = __builtin_expect (argc, 100); return argv[argc != 100][0]; } _ACEOF if ac_fn_c_try_link "$LINENO" then : gl_cv___builtin_expect="in " else $as_nop gl_cv___builtin_expect=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv___builtin_expect" >&5 printf "%s\n" "$gl_cv___builtin_expect" >&6; } if test "$gl_cv___builtin_expect" = yes; then printf "%s\n" "#define HAVE___BUILTIN_EXPECT 1" >>confdefs.h elif test "$gl_cv___builtin_expect" = "in "; then printf "%s\n" "#define HAVE___BUILTIN_EXPECT 2" >>confdefs.h fi REPLACE_CALLOC_FOR_CALLOC_GNU="$REPLACE_CALLOC_FOR_CALLOC_POSIX" if test $REPLACE_CALLOC_FOR_CALLOC_GNU = 0; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether calloc (0, n) and calloc (n, 0) return nonnull" >&5 printf %s "checking whether calloc (0, n) and calloc (n, 0) return nonnull... " >&6; } if test ${ac_cv_func_calloc_0_nonnull+y} then : printf %s "(cached) " >&6 else $as_nop if test $cross_compiling != yes; then ac_cv_func_calloc_0_nonnull=yes if test "$cross_compiling" = yes then : { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run test program while cross compiling See \`config.log' for more details" "$LINENO" 5; } else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main (void) { int result = 0; char * volatile p = calloc (0, 0); if (!p) result |= 1; free (p); return result; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO" then : else $as_nop ac_cv_func_calloc_0_nonnull=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi else case "$host_os" in # Guess yes on glibc systems. *-gnu* | gnu*) ac_cv_func_calloc_0_nonnull="guessing yes" ;; # Guess yes on musl systems. *-musl*) ac_cv_func_calloc_0_nonnull="guessing yes" ;; # Guess yes on native Windows. mingw*) ac_cv_func_calloc_0_nonnull="guessing yes" ;; # If we don't know, obey --enable-cross-guesses. *) ac_cv_func_calloc_0_nonnull="$gl_cross_guess_normal" ;; esac fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_calloc_0_nonnull" >&5 printf "%s\n" "$ac_cv_func_calloc_0_nonnull" >&6; } case $ac_cv_func_calloc_0_nonnull in #( *yes) : ;; #( *) : REPLACE_CALLOC_FOR_CALLOC_GNU=1 ;; esac fi if test $REPLACE_CALLOC_FOR_CALLOC_GNU = 1; then gl_LIBOBJS="$gl_LIBOBJS calloc.$ac_objext" fi GL_GNULIB_CALLOC_GNU=1 printf "%s\n" "#define GNULIB_TEST_CALLOC_GNU 1" >>confdefs.h if test $REPLACE_MALLOC_FOR_MALLOC_POSIX = 1; then REPLACE_CALLOC_FOR_CALLOC_POSIX=1 fi if test $REPLACE_CALLOC_FOR_CALLOC_POSIX = 1; then gl_LIBOBJS="$gl_LIBOBJS calloc.$ac_objext" fi GL_GNULIB_CALLOC_POSIX=1 printf "%s\n" "#define GNULIB_TEST_CALLOC_POSIX 1" >>confdefs.h GL_GNULIB_CHDIR=1 printf "%s\n" "#define GNULIB_TEST_CHDIR 1" >>confdefs.h { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether this system supports file names of any length" >&5 printf %s "checking whether this system supports file names of any length... " >&6; } if test ${gl_cv_have_unlimited_file_name_length+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Arrange to define PATH_MAX, like "pathmax.h" does. */ #if HAVE_UNISTD_H # include #endif #include #if defined HAVE_SYS_PARAM_H && !defined PATH_MAX && !defined MAXPATHLEN # include #endif #if !defined PATH_MAX && defined MAXPATHLEN # define PATH_MAX MAXPATHLEN #endif #ifdef __hpux # undef PATH_MAX # define PATH_MAX 1024 #endif #if defined _WIN32 && ! defined __CYGWIN__ # undef PATH_MAX # define PATH_MAX 260 #endif #ifdef PATH_MAX have_arbitrary_file_name_length_limit #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "have_arbitrary_file_name_length_limit" >/dev/null 2>&1 then : gl_cv_have_unlimited_file_name_length=no else $as_nop gl_cv_have_unlimited_file_name_length=yes fi rm -rf conftest* fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_have_unlimited_file_name_length" >&5 printf "%s\n" "$gl_cv_have_unlimited_file_name_length" >&6; } if test $gl_cv_have_unlimited_file_name_length = no; then GL_COND_OBJ_CHDIR_LONG_TRUE= GL_COND_OBJ_CHDIR_LONG_FALSE='#' else GL_COND_OBJ_CHDIR_LONG_TRUE='#' GL_COND_OBJ_CHDIR_LONG_FALSE= fi : if test -z "${GL_COND_OBJ_CHDIR_LONG_TRUE}" && test -z "${GL_COND_OBJ_CHDIR_LONG_FALSE}"; then GL_COND_OBJ_CHDIR_LONG_TRUE='#' GL_COND_OBJ_CHDIR_LONG_FALSE='#' fi if test -z "$GL_COND_OBJ_CHDIR_LONG_TRUE"; then : : fi printf "%s\n" "#define GNULIB_TEST_CLOEXEC 1" >>confdefs.h if test $HAVE_MSVC_INVALID_PARAMETER_HANDLER = 1; then REPLACE_CLOSE=1 fi if test $ac_cv_header_sys_socket_h != yes; then ac_fn_c_check_header_compile "$LINENO" "winsock2.h" "ac_cv_header_winsock2_h" "$ac_includes_default" if test "x$ac_cv_header_winsock2_h" = xyes then : printf "%s\n" "#define HAVE_WINSOCK2_H 1" >>confdefs.h fi fi if test "$ac_cv_header_winsock2_h" = yes; then HAVE_WINSOCK2_H=1 UNISTD_H_HAVE_WINSOCK2_H=1 SYS_IOCTL_H_HAVE_WINSOCK2_H=1 else HAVE_WINSOCK2_H=0 fi if test $UNISTD_H_HAVE_WINSOCK2_H = 1; then REPLACE_CLOSE=1 fi if test $REPLACE_CLOSE = 0; then if test $ac_cv_func_fchdir = no; then HAVE_FCHDIR=0 fi if test $HAVE_FCHDIR = 0; then REPLACE_CLOSE=1 fi fi if test $REPLACE_CLOSE = 1; then GL_COND_OBJ_CLOSE_TRUE= GL_COND_OBJ_CLOSE_FALSE='#' else GL_COND_OBJ_CLOSE_TRUE='#' GL_COND_OBJ_CLOSE_FALSE= fi : if test -z "${GL_COND_OBJ_CLOSE_TRUE}" && test -z "${GL_COND_OBJ_CLOSE_FALSE}"; then GL_COND_OBJ_CLOSE_TRUE='#' GL_COND_OBJ_CLOSE_FALSE='#' fi GL_GNULIB_CLOSE=1 printf "%s\n" "#define GNULIB_TEST_CLOSE 1" >>confdefs.h ac_fn_c_check_func "$LINENO" "dirfd" "ac_cv_func_dirfd" if test "x$ac_cv_func_dirfd" = xyes then : printf "%s\n" "#define HAVE_DIRFD 1" >>confdefs.h fi ac_fn_check_decl "$LINENO" "dirfd" "ac_cv_have_decl_dirfd" "#include #include " "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_dirfd" = xyes then : ac_have_decl=1 else $as_nop ac_have_decl=0 fi printf "%s\n" "#define HAVE_DECL_DIRFD $ac_have_decl" >>confdefs.h if test $ac_cv_have_decl_dirfd = no; then HAVE_DECL_DIRFD=0 fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether dirfd is a macro" >&5 printf %s "checking whether dirfd is a macro... " >&6; } if test ${gl_cv_func_dirfd_macro+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #ifdef dirfd dirent_header_defines_dirfd #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "dirent_header_defines_dirfd" >/dev/null 2>&1 then : gl_cv_func_dirfd_macro=yes else $as_nop gl_cv_func_dirfd_macro=no fi rm -rf conftest* fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_dirfd_macro" >&5 printf "%s\n" "$gl_cv_func_dirfd_macro" >&6; } # Use the replacement if we have no function or macro with that name, # or if OS/2 kLIBC whose dirfd() does not work. # Replace only if the system declares dirfd already. case $ac_cv_func_dirfd,$gl_cv_func_dirfd_macro,$host_os,$ac_cv_have_decl_dirfd in no,no,*,yes | *,*,os2*,yes) REPLACE_DIRFD=1 printf "%s\n" "#define REPLACE_DIRFD 1" >>confdefs.h ;; esac if test $ac_cv_func_dirfd = no && test $gl_cv_func_dirfd_macro = no || test $REPLACE_DIRFD = 1; then GL_COND_OBJ_DIRFD_TRUE= GL_COND_OBJ_DIRFD_FALSE='#' else GL_COND_OBJ_DIRFD_TRUE='#' GL_COND_OBJ_DIRFD_FALSE= fi : if test -z "${GL_COND_OBJ_DIRFD_TRUE}" && test -z "${GL_COND_OBJ_DIRFD_FALSE}"; then GL_COND_OBJ_DIRFD_TRUE='#' GL_COND_OBJ_DIRFD_FALSE='#' fi if test -z "$GL_COND_OBJ_DIRFD_TRUE"; then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to get the file descriptor associated with an open DIR*" >&5 printf %s "checking how to get the file descriptor associated with an open DIR*... " >&6; } if test ${gl_cv_sys_dir_fd_member_name+y} then : printf %s "(cached) " >&6 else $as_nop dirfd_save_CFLAGS=$CFLAGS for ac_expr in d_fd dd_fd; do CFLAGS="$CFLAGS -DDIR_FD_MEMBER_NAME=$ac_expr" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main (void) { DIR *dir_p = opendir("."); (void) dir_p->DIR_FD_MEMBER_NAME; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : dir_fd_found=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext CFLAGS=$dirfd_save_CFLAGS test "$dir_fd_found" = yes && break done test "$dir_fd_found" = yes || ac_expr=no_such_member gl_cv_sys_dir_fd_member_name=$ac_expr fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_sys_dir_fd_member_name" >&5 printf "%s\n" "$gl_cv_sys_dir_fd_member_name" >&6; } if test $gl_cv_sys_dir_fd_member_name != no_such_member; then printf "%s\n" "#define DIR_FD_MEMBER_NAME $gl_cv_sys_dir_fd_member_name" >>confdefs.h fi fi GL_GNULIB_DIRFD=1 printf "%s\n" "#define GNULIB_TEST_DIRFD 1" >>confdefs.h { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether // is distinct from /" >&5 printf %s "checking whether // is distinct from /... " >&6; } if test ${gl_cv_double_slash_root+y} then : printf %s "(cached) " >&6 else $as_nop if test x"$cross_compiling" = xyes ; then # When cross-compiling, there is no way to tell whether // is special # short of a list of hosts. However, the only known hosts to date # that have a distinct // are Apollo DomainOS (too old to port to), # Cygwin, and z/OS. If anyone knows of another system for which // has # special semantics and is distinct from /, please report it to # . case $host in *-cygwin | i370-ibm-openedition) gl_cv_double_slash_root=yes ;; *) # Be optimistic and assume that / and // are the same when we # don't know. gl_cv_double_slash_root='unknown, assuming no' ;; esac else set x `ls -di / // 2>/dev/null` if test "$2" = "$4" && wc //dev/null >/dev/null 2>&1; then gl_cv_double_slash_root=no else gl_cv_double_slash_root=yes fi fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_double_slash_root" >&5 printf "%s\n" "$gl_cv_double_slash_root" >&6; } if test "$gl_cv_double_slash_root" = yes; then printf "%s\n" "#define DOUBLE_SLASH_IS_DISTINCT_ROOT 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether dup2 works" >&5 printf %s "checking whether dup2 works... " >&6; } if test ${gl_cv_func_dup2_works+y} then : printf %s "(cached) " >&6 else $as_nop if test "$cross_compiling" = yes then : case "$host_os" in mingw*) # on this platform, dup2 always returns 0 for success gl_cv_func_dup2_works="guessing no" ;; cygwin*) # on cygwin 1.5.x, dup2(1,1) returns 0 gl_cv_func_dup2_works="guessing no" ;; aix* | freebsd*) # on AIX 7.1 and FreeBSD 6.1, dup2 (1,toobig) gives EMFILE, # not EBADF. gl_cv_func_dup2_works="guessing no" ;; haiku*) # on Haiku alpha 2, dup2(1, 1) resets FD_CLOEXEC. gl_cv_func_dup2_works="guessing no" ;; *-android*) # implemented using dup3(), which fails if oldfd == newfd gl_cv_func_dup2_works="guessing no" ;; os2*) # on OS/2 kLIBC, dup2() does not work on a directory fd. gl_cv_func_dup2_works="guessing no" ;; *) gl_cv_func_dup2_works="guessing yes" ;; esac else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include #include $gl_mda_defines #ifndef RLIM_SAVED_CUR # define RLIM_SAVED_CUR RLIM_INFINITY #endif #ifndef RLIM_SAVED_MAX # define RLIM_SAVED_MAX RLIM_INFINITY #endif int main (void) { int result = 0; int bad_fd = INT_MAX; struct rlimit rlim; if (getrlimit (RLIMIT_NOFILE, &rlim) == 0 && 0 <= rlim.rlim_cur && rlim.rlim_cur <= INT_MAX && rlim.rlim_cur != RLIM_INFINITY && rlim.rlim_cur != RLIM_SAVED_MAX && rlim.rlim_cur != RLIM_SAVED_CUR) bad_fd = rlim.rlim_cur; #ifdef FD_CLOEXEC if (fcntl (1, F_SETFD, FD_CLOEXEC) == -1) result |= 1; #endif if (dup2 (1, 1) != 1) result |= 2; #ifdef FD_CLOEXEC if (fcntl (1, F_GETFD) != FD_CLOEXEC) result |= 4; #endif close (0); if (dup2 (0, 0) != -1) result |= 8; /* Many gnulib modules require POSIX conformance of EBADF. */ if (dup2 (2, bad_fd) == -1 && errno != EBADF) result |= 16; /* Flush out some cygwin core dumps. */ if (dup2 (2, -1) != -1 || errno != EBADF) result |= 32; dup2 (2, 255); dup2 (2, 256); /* On OS/2 kLIBC, dup2() does not work on a directory fd. */ { int fd = open (".", O_RDONLY); if (fd == -1) result |= 64; else if (dup2 (fd, fd + 1) == -1) result |= 128; close (fd); } return result; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO" then : gl_cv_func_dup2_works=yes else $as_nop gl_cv_func_dup2_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_dup2_works" >&5 printf "%s\n" "$gl_cv_func_dup2_works" >&6; } case "$gl_cv_func_dup2_works" in *yes) ;; *) REPLACE_DUP2=1 ac_fn_c_check_func "$LINENO" "setdtablesize" "ac_cv_func_setdtablesize" if test "x$ac_cv_func_setdtablesize" = xyes then : printf "%s\n" "#define HAVE_SETDTABLESIZE 1" >>confdefs.h fi ;; esac if test $ac_cv_func_fchdir = no; then HAVE_FCHDIR=0 fi if test $HAVE_FCHDIR = 0; then REPLACE_DUP2=1 fi if test $REPLACE_DUP2 = 1; then GL_COND_OBJ_DUP2_TRUE= GL_COND_OBJ_DUP2_FALSE='#' else GL_COND_OBJ_DUP2_TRUE='#' GL_COND_OBJ_DUP2_FALSE= fi : if test -z "${GL_COND_OBJ_DUP2_TRUE}" && test -z "${GL_COND_OBJ_DUP2_FALSE}"; then GL_COND_OBJ_DUP2_TRUE='#' GL_COND_OBJ_DUP2_FALSE='#' fi if test -z "$GL_COND_OBJ_DUP2_TRUE"; then : fi GL_GNULIB_DUP2=1 printf "%s\n" "#define GNULIB_TEST_DUP2 1" >>confdefs.h case "$GL_GENERATE_ERRNO_H" in false) ERRNO_H='' ;; true) if test -z "$ERRNO_H"; then ERRNO_H="${gl_source_base_prefix}errno.h" fi ;; *) echo "*** GL_GENERATE_ERRNO_H is not set correctly" 1>&2; exit 1 ;; esac if $GL_GENERATE_ERRNO_H; then GL_GENERATE_ERRNO_H_TRUE= GL_GENERATE_ERRNO_H_FALSE='#' else GL_GENERATE_ERRNO_H_TRUE='#' GL_GENERATE_ERRNO_H_FALSE= fi : if test -z "${GL_GENERATE_ERRNO_H_TRUE}" && test -z "${GL_GENERATE_ERRNO_H_FALSE}"; then GL_GENERATE_ERRNO_H_TRUE='#' GL_GENERATE_ERRNO_H_FALSE='#' fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for error_at_line" >&5 printf %s "checking for error_at_line... " >&6; } if test ${ac_cv_lib_error_at_line+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { error_at_line (0, 0, "", 0, "an error occurred"); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_error_at_line=yes else $as_nop ac_cv_lib_error_at_line=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_error_at_line" >&5 printf "%s\n" "$ac_cv_lib_error_at_line" >&6; } if test "$ac_cv_lib_error_at_line" = no; then GL_COND_OBJ_ERROR_TRUE= GL_COND_OBJ_ERROR_FALSE='#' else GL_COND_OBJ_ERROR_TRUE='#' GL_COND_OBJ_ERROR_FALSE= fi : if test -z "${GL_COND_OBJ_ERROR_TRUE}" && test -z "${GL_COND_OBJ_ERROR_FALSE}"; then GL_COND_OBJ_ERROR_TRUE='#' GL_COND_OBJ_ERROR_FALSE='#' fi if test -z "$GL_COND_OBJ_ERROR_TRUE"; then : : fi XGETTEXT_EXTRA_OPTIONS="$XGETTEXT_EXTRA_OPTIONS --flag=error:3:c-format" XGETTEXT_EXTRA_OPTIONS="$XGETTEXT_EXTRA_OPTIONS --flag=error_at_line:5:c-format" if test $ac_cv_have_decl_fchdir = no; then HAVE_DECL_FCHDIR=0 fi if test $HAVE_FCHDIR = 0; then printf "%s\n" "#define REPLACE_FCHDIR 1" >>confdefs.h { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether open can visit directories" >&5 printf %s "checking whether open can visit directories... " >&6; } if test ${gl_cv_func_open_directory_works+y} then : printf %s "(cached) " >&6 else $as_nop if test "$cross_compiling" = yes then : case "$host_os" in # Guess yes on Linux systems. linux-* | linux) gl_cv_func_open_directory_works="guessing yes" ;; # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_open_directory_works="guessing yes" ;; # Guess no on native Windows. mingw*) gl_cv_func_open_directory_works="guessing no" ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_open_directory_works="$gl_cross_guess_normal" ;; esac else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include $gl_mda_defines int main (void) { return open(".", O_RDONLY) < 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO" then : gl_cv_func_open_directory_works=yes else $as_nop gl_cv_func_open_directory_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_open_directory_works" >&5 printf "%s\n" "$gl_cv_func_open_directory_works" >&6; } case "$gl_cv_func_open_directory_works" in *yes) ;; *) printf "%s\n" "#define REPLACE_OPEN_DIRECTORY 1" >>confdefs.h ;; esac fi if test $HAVE_FCHDIR = 0; then GL_COND_OBJ_FCHDIR_TRUE= GL_COND_OBJ_FCHDIR_FALSE='#' else GL_COND_OBJ_FCHDIR_TRUE='#' GL_COND_OBJ_FCHDIR_FALSE= fi : if test -z "${GL_COND_OBJ_FCHDIR_TRUE}" && test -z "${GL_COND_OBJ_FCHDIR_FALSE}"; then GL_COND_OBJ_FCHDIR_TRUE='#' GL_COND_OBJ_FCHDIR_FALSE='#' fi if test -z "$GL_COND_OBJ_FCHDIR_TRUE"; then : : fi GL_GNULIB_FCHDIR=1 printf "%s\n" "#define GNULIB_TEST_FCHDIR 1" >>confdefs.h if test $ac_cv_func_fcntl = no; then if test $ac_cv_func_fcntl = no; then HAVE_FCNTL=0 else REPLACE_FCNTL=1 fi else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether fcntl handles F_DUPFD correctly" >&5 printf %s "checking whether fcntl handles F_DUPFD correctly... " >&6; } if test ${gl_cv_func_fcntl_f_dupfd_works+y} then : printf %s "(cached) " >&6 else $as_nop if test "$cross_compiling" = yes then : case $host_os in aix* | cygwin* | haiku*) gl_cv_func_fcntl_f_dupfd_works="guessing no" ;; *) gl_cv_func_fcntl_f_dupfd_works="guessing yes" ;; esac else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include #include $gl_mda_defines #ifndef RLIM_SAVED_CUR # define RLIM_SAVED_CUR RLIM_INFINITY #endif #ifndef RLIM_SAVED_MAX # define RLIM_SAVED_MAX RLIM_INFINITY #endif int main (void) { int result = 0; int bad_fd = INT_MAX; struct rlimit rlim; if (getrlimit (RLIMIT_NOFILE, &rlim) == 0 && 0 <= rlim.rlim_cur && rlim.rlim_cur <= INT_MAX && rlim.rlim_cur != RLIM_INFINITY && rlim.rlim_cur != RLIM_SAVED_MAX && rlim.rlim_cur != RLIM_SAVED_CUR) bad_fd = rlim.rlim_cur; if (fcntl (0, F_DUPFD, -1) != -1) result |= 1; if (errno != EINVAL) result |= 2; if (fcntl (0, F_DUPFD, bad_fd) != -1) result |= 4; if (errno != EINVAL) result |= 8; /* On OS/2 kLIBC, F_DUPFD does not work on a directory fd */ { int fd; fd = open (".", O_RDONLY); if (fd == -1) result |= 16; else if (fcntl (fd, F_DUPFD, STDERR_FILENO + 1) == -1) result |= 32; close (fd); } return result; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO" then : gl_cv_func_fcntl_f_dupfd_works=yes else $as_nop gl_cv_func_fcntl_f_dupfd_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_fcntl_f_dupfd_works" >&5 printf "%s\n" "$gl_cv_func_fcntl_f_dupfd_works" >&6; } case $gl_cv_func_fcntl_f_dupfd_works in *yes) ;; *) if test $ac_cv_func_fcntl = no; then HAVE_FCNTL=0 else REPLACE_FCNTL=1 fi printf "%s\n" "#define FCNTL_DUPFD_BUGGY 1" >>confdefs.h ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether fcntl understands F_DUPFD_CLOEXEC" >&5 printf %s "checking whether fcntl understands F_DUPFD_CLOEXEC... " >&6; } if test ${gl_cv_func_fcntl_f_dupfd_cloexec+y} then : printf %s "(cached) " >&6 else $as_nop if test "$cross_compiling" = yes then : case "$host_os" in # Guess no on NetBSD. netbsd*) gl_cv_func_fcntl_f_dupfd_cloexec="guessing no" ;; *) gl_cv_func_fcntl_f_dupfd_cloexec="$gl_cross_guess_normal" ;; esac else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main (int argc, char *argv[]) { if (argc == 1) /* parent process */ { if (fcntl (1, F_DUPFD_CLOEXEC, 10) < 0) return 1; return execl ("./conftest", "./conftest", "child", NULL); } else /* child process */ return (fcntl (10, F_GETFL) < 0 ? 0 : 42); } _ACEOF if ac_fn_c_try_run "$LINENO" then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __linux__ /* The Linux kernel only added F_DUPFD_CLOEXEC in 2.6.24, so we always replace it to support the semantics on older kernels that failed with EINVAL. */ choke me #endif int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : gl_cv_func_fcntl_f_dupfd_cloexec=yes else $as_nop gl_cv_func_fcntl_f_dupfd_cloexec="needs runtime check" fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext else $as_nop gl_cv_func_fcntl_f_dupfd_cloexec=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_fcntl_f_dupfd_cloexec" >&5 printf "%s\n" "$gl_cv_func_fcntl_f_dupfd_cloexec" >&6; } case "$gl_cv_func_fcntl_f_dupfd_cloexec" in *yes) ;; *) if test $ac_cv_func_fcntl = no; then HAVE_FCNTL=0 else REPLACE_FCNTL=1 fi ;; esac fi if test $ac_cv_func_fchdir = no; then HAVE_FCHDIR=0 fi if test $HAVE_FCHDIR = 0; then if test $ac_cv_func_fcntl = no; then HAVE_FCNTL=0 else REPLACE_FCNTL=1 fi fi if test $HAVE_FCNTL = 0 || test $REPLACE_FCNTL = 1; then GL_COND_OBJ_FCNTL_TRUE= GL_COND_OBJ_FCNTL_FALSE='#' else GL_COND_OBJ_FCNTL_TRUE='#' GL_COND_OBJ_FCNTL_FALSE= fi : if test -z "${GL_COND_OBJ_FCNTL_TRUE}" && test -z "${GL_COND_OBJ_FCNTL_FALSE}"; then GL_COND_OBJ_FCNTL_TRUE='#' GL_COND_OBJ_FCNTL_FALSE='#' fi GL_GNULIB_FCNTL=1 printf "%s\n" "#define GNULIB_TEST_FCNTL 1" >>confdefs.h printf "%s\n" "#define GNULIB_FD_SAFER_FLAG 1" >>confdefs.h { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for flexible array member" >&5 printf %s "checking for flexible array member... " >&6; } if test ${ac_cv_c_flexmember+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include struct m { struct m *next, **list; char name[]; }; struct s { struct s *p; struct m *m; int n; double d[]; }; int main (void) { int m = getchar (); size_t nbytes = offsetof (struct s, d) + m * sizeof (double); nbytes += sizeof (struct s) - 1; nbytes -= nbytes % sizeof (struct s); struct s *p = malloc (nbytes); p->p = p; p->m = NULL; p->d[0] = 0.0; return p->d != (double *) NULL; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_c_flexmember=yes else $as_nop ac_cv_c_flexmember=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_flexmember" >&5 printf "%s\n" "$ac_cv_c_flexmember" >&6; } if test $ac_cv_c_flexmember = yes; then printf "%s\n" "#define FLEXIBLE_ARRAY_MEMBER /**/" >>confdefs.h else printf "%s\n" "#define FLEXIBLE_ARRAY_MEMBER 1" >>confdefs.h fi GL_GENERATE_FLOAT_H=false REPLACE_FLOAT_LDBL=0 case "$host_os" in aix* | beos* | openbsd* | mirbsd* | irix*) GL_GENERATE_FLOAT_H=true ;; freebsd* | dragonfly*) case "$host_cpu" in i[34567]86 ) GL_GENERATE_FLOAT_H=true ;; x86_64 ) # On x86_64 systems, the C compiler may still be generating # 32-bit code. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined __LP64__ || defined __x86_64__ || defined __amd64__ int ok; #else error fail #endif _ACEOF if ac_fn_c_try_compile "$LINENO" then : else $as_nop GL_GENERATE_FLOAT_H=true fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac ;; linux*) case "$host_cpu" in powerpc*) GL_GENERATE_FLOAT_H=true ;; esac ;; esac case "$host_os" in aix* | freebsd* | dragonfly* | linux*) if $GL_GENERATE_FLOAT_H; then REPLACE_FLOAT_LDBL=1 fi ;; esac REPLACE_ITOLD=0 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether conversion from 'int' to 'long double' works" >&5 printf %s "checking whether conversion from 'int' to 'long double' works... " >&6; } if test ${gl_cv_func_itold_works+y} then : printf %s "(cached) " >&6 else $as_nop if test "$cross_compiling" = yes then : case "$host" in sparc*-*-linux*) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined __LP64__ || defined __arch64__ int ok; #else error fail #endif _ACEOF if ac_fn_c_try_compile "$LINENO" then : gl_cv_func_itold_works="guessing no" else $as_nop gl_cv_func_itold_works="guessing yes" fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; # Guess yes on native Windows. mingw*) gl_cv_func_itold_works="guessing yes" ;; *) gl_cv_func_itold_works="guessing yes" ;; esac else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int i = -1; volatile long double ld; int main () { ld += i * 1.0L; if (ld > 0) return 1; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO" then : gl_cv_func_itold_works=yes else $as_nop gl_cv_func_itold_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_itold_works" >&5 printf "%s\n" "$gl_cv_func_itold_works" >&6; } case "$gl_cv_func_itold_works" in *no) REPLACE_ITOLD=1 GL_GENERATE_FLOAT_H=true ;; esac if $GL_GENERATE_FLOAT_H; then if test $gl_cv_have_include_next = yes; then gl_cv_next_float_h='<'float.h'>' else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 printf %s "checking absolute name of ... " >&6; } if test ${gl_cv_next_float_h+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'float.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_absolute_float_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"` gl_header=$gl_cv_absolute_float_h gl_cv_next_float_h='"'$gl_header'"' fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_float_h" >&5 printf "%s\n" "$gl_cv_next_float_h" >&6; } fi NEXT_FLOAT_H=$gl_cv_next_float_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'float.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_float_h fi NEXT_AS_FIRST_DIRECTIVE_FLOAT_H=$gl_next_as_first_directive fi case "$GL_GENERATE_FLOAT_H" in false) FLOAT_H='' ;; true) if test -z "$FLOAT_H"; then FLOAT_H="${gl_source_base_prefix}float.h" fi ;; *) echo "*** GL_GENERATE_FLOAT_H is not set correctly" 1>&2; exit 1 ;; esac if $GL_GENERATE_FLOAT_H; then GL_GENERATE_FLOAT_H_TRUE= GL_GENERATE_FLOAT_H_FALSE='#' else GL_GENERATE_FLOAT_H_TRUE='#' GL_GENERATE_FLOAT_H_FALSE= fi : if test -z "${GL_GENERATE_FLOAT_H_TRUE}" && test -z "${GL_GENERATE_FLOAT_H_FALSE}"; then GL_GENERATE_FLOAT_H_TRUE='#' GL_GENERATE_FLOAT_H_FALSE='#' fi if test $REPLACE_FLOAT_LDBL = 1; then GL_COND_OBJ_FLOAT_TRUE= GL_COND_OBJ_FLOAT_FALSE='#' else GL_COND_OBJ_FLOAT_TRUE='#' GL_COND_OBJ_FLOAT_FALSE= fi : if test -z "${GL_COND_OBJ_FLOAT_TRUE}" && test -z "${GL_COND_OBJ_FLOAT_FALSE}"; then GL_COND_OBJ_FLOAT_TRUE='#' GL_COND_OBJ_FLOAT_FALSE='#' fi if test $REPLACE_ITOLD = 1; then GL_COND_OBJ_ITOLD_TRUE= GL_COND_OBJ_ITOLD_FALSE='#' else GL_COND_OBJ_ITOLD_TRUE='#' GL_COND_OBJ_ITOLD_FALSE= fi : if test -z "${GL_COND_OBJ_ITOLD_TRUE}" && test -z "${GL_COND_OBJ_ITOLD_FALSE}"; then GL_COND_OBJ_ITOLD_TRUE='#' GL_COND_OBJ_ITOLD_FALSE='#' fi gl_fnmatch_required_lowercase=` echo $gl_fnmatch_required | LC_ALL=C tr '[A-Z]' '[a-z]' ` if test $ac_cv_func_fnmatch = no; then HAVE_FNMATCH=0 else gl_fnmatch_cache_var="gl_cv_func_fnmatch_${gl_fnmatch_required_lowercase}" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working $gl_fnmatch_required fnmatch" >&5 printf %s "checking for working $gl_fnmatch_required fnmatch... " >&6; } if eval test \${$gl_fnmatch_cache_var+y} then : printf %s "(cached) " >&6 else $as_nop if test $gl_fnmatch_required = GNU; then gl_fnmatch_gnu_start= gl_fnmatch_gnu_end= else gl_fnmatch_gnu_start='#if 0' gl_fnmatch_gnu_end='#endif' fi if test "$cross_compiling" = yes then : case "$host_os" in # Guess yes on musl systems. *-musl*) eval "$gl_fnmatch_cache_var=\"guessing yes\"" ;; # Guess no otherwise, even on glibc systems. *) eval "$gl_fnmatch_cache_var=\"guessing no\"" ;; esac else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include static int y (char const *pattern, char const *string, int flags) { return fnmatch (pattern, string, flags) == 0; } static int n (char const *pattern, char const *string, int flags) { return fnmatch (pattern, string, flags) == FNM_NOMATCH; } int main (void) { char const *Apat = 'A' < '\\\\' ? "[A-\\\\\\\\]" : "[\\\\\\\\-A]"; char const *apat = 'a' < '\\\\' ? "[a-\\\\\\\\]" : "[\\\\\\\\-a]"; static char const A_1[] = { 'A' - 1, 0 }; static char const A01[] = { 'A' + 1, 0 }; static char const a_1[] = { 'a' - 1, 0 }; static char const a01[] = { 'a' + 1, 0 }; static char const bs_1[] = { '\\\\' - 1, 0 }; static char const bs01[] = { '\\\\' + 1, 0 }; int result = 0; if (!n ("a*", "", 0)) return 1; if (!y ("a*", "abc", 0)) return 1; if (!y ("[/b", "[/b", 0)) /*"]]"*/ /* glibc Bugzilla bug 12378 */ return 1; if (!n ("d*/*1", "d/s/1", FNM_PATHNAME)) return 2; if (!y ("a\\\\bc", "abc", 0)) return 3; if (!n ("a\\\\bc", "abc", FNM_NOESCAPE)) return 3; if (!y ("*x", ".x", 0)) return 4; if (!n ("*x", ".x", FNM_PERIOD)) return 4; if (!y (Apat, "\\\\", 0)) return 5; if (!y (Apat, "A", 0)) return 5; if (!y (apat, "\\\\", 0)) return 5; if (!y (apat, "a", 0)) return 5; if (!(n (Apat, A_1, 0) == ('A' < '\\\\'))) return 5; if (!(n (apat, a_1, 0) == ('a' < '\\\\'))) return 5; if (!(y (Apat, A01, 0) == ('A' < '\\\\'))) return 5; if (!(y (apat, a01, 0) == ('a' < '\\\\'))) return 5; if (!(y (Apat, bs_1, 0) == ('A' < '\\\\'))) return 5; if (!(y (apat, bs_1, 0) == ('a' < '\\\\'))) return 5; if (!(n (Apat, bs01, 0) == ('A' < '\\\\'))) return 5; if (!(n (apat, bs01, 0) == ('a' < '\\\\'))) return 5; $gl_fnmatch_gnu_start if (!y ("xxXX", "xXxX", FNM_CASEFOLD)) result |= 8; if (!y ("a++(x|yy)b", "a+xyyyyxb", FNM_EXTMATCH)) result |= 16; if (!n ("d*/*1", "d/s/1", FNM_FILE_NAME)) result |= 32; if (!y ("*", "x", FNM_FILE_NAME | FNM_LEADING_DIR)) result |= 64; if (!y ("x*", "x/y/z", FNM_FILE_NAME | FNM_LEADING_DIR)) result |= 64; if (!y ("*c*", "c/x", FNM_FILE_NAME | FNM_LEADING_DIR)) result |= 64; $gl_fnmatch_gnu_end return result; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO" then : eval "$gl_fnmatch_cache_var=yes" else $as_nop eval "$gl_fnmatch_cache_var=no" fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi eval ac_res=\$$gl_fnmatch_cache_var { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } eval "gl_fnmatch_result=\"\$$gl_fnmatch_cache_var\"" case "$gl_fnmatch_result" in *yes) ;; *) REPLACE_FNMATCH=1 ;; esac fi if test $HAVE_FNMATCH = 0 || test $REPLACE_FNMATCH = 1; then GL_GENERATE_FNMATCH_H=true fi case "$GL_GENERATE_FNMATCH_H" in false) FNMATCH_H='' ;; true) if test -z "$FNMATCH_H"; then FNMATCH_H="${gl_source_base_prefix}fnmatch.h" fi ;; *) echo "*** GL_GENERATE_FNMATCH_H is not set correctly" 1>&2; exit 1 ;; esac if $GL_GENERATE_FNMATCH_H; then GL_GENERATE_FNMATCH_H_TRUE= GL_GENERATE_FNMATCH_H_FALSE='#' else GL_GENERATE_FNMATCH_H_TRUE='#' GL_GENERATE_FNMATCH_H_FALSE= fi : if test -z "${GL_GENERATE_FNMATCH_H_TRUE}" && test -z "${GL_GENERATE_FNMATCH_H_FALSE}"; then GL_GENERATE_FNMATCH_H_TRUE='#' GL_GENERATE_FNMATCH_H_FALSE='#' fi if test $HAVE_FNMATCH = 0 || test $REPLACE_FNMATCH = 1; then gl_LIBOBJS="$gl_LIBOBJS fnmatch.$ac_objext" fi GL_GNULIB_FNMATCH=1 printf "%s\n" "#define GNULIB_TEST_FNMATCH 1" >>confdefs.h case "$GL_GENERATE_FNMATCH_H" in false) FNMATCH_H='' ;; true) if test -z "$FNMATCH_H"; then FNMATCH_H="${gl_source_base_prefix}fnmatch.h" fi ;; *) echo "*** GL_GENERATE_FNMATCH_H is not set correctly" 1>&2; exit 1 ;; esac if $GL_GENERATE_FNMATCH_H; then GL_GENERATE_FNMATCH_H_TRUE= GL_GENERATE_FNMATCH_H_FALSE='#' else GL_GENERATE_FNMATCH_H_TRUE='#' GL_GENERATE_FNMATCH_H_FALSE= fi : if test -z "${GL_GENERATE_FNMATCH_H_TRUE}" && test -z "${GL_GENERATE_FNMATCH_H_FALSE}"; then GL_GENERATE_FNMATCH_H_TRUE='#' GL_GENERATE_FNMATCH_H_FALSE='#' fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether free is known to preserve errno" >&5 printf %s "checking whether free is known to preserve errno... " >&6; } if test ${gl_cv_func_free_preserves_errno+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { #if 2 < __GLIBC__ + (33 <= __GLIBC_MINOR__) #elif defined __OpenBSD__ #elif defined __sun #else #error "'free' is not known to preserve errno" #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : gl_cv_func_free_preserves_errno=yes else $as_nop gl_cv_func_free_preserves_errno=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_free_preserves_errno" >&5 printf "%s\n" "$gl_cv_func_free_preserves_errno" >&6; } case $gl_cv_func_free_preserves_errno in *yes) printf "%s\n" "#define HAVE_FREE_POSIX 1" >>confdefs.h ;; *) REPLACE_FREE=1 ;; esac if test $REPLACE_FREE = 1; then GL_COND_OBJ_FREE_TRUE= GL_COND_OBJ_FREE_FALSE='#' else GL_COND_OBJ_FREE_TRUE='#' GL_COND_OBJ_FREE_FALSE= fi : if test -z "${GL_COND_OBJ_FREE_TRUE}" && test -z "${GL_COND_OBJ_FREE_FALSE}"; then GL_COND_OBJ_FREE_TRUE='#' GL_COND_OBJ_FREE_FALSE='#' fi if test -z "$GL_COND_OBJ_FREE_TRUE"; then : : fi GL_GNULIB_FREE_POSIX=1 printf "%s\n" "#define GNULIB_TEST_FREE_POSIX 1" >>confdefs.h case "$host_os" in mingw* | solaris*) REPLACE_FSTAT=1 ;; esac if test $ac_cv_func_fchdir = no; then HAVE_FCHDIR=0 fi if test $HAVE_FCHDIR = 0; then case "$gl_cv_func_open_directory_works" in *yes) ;; *) REPLACE_FSTAT=1 ;; esac fi if test $REPLACE_FSTAT = 1; then GL_COND_OBJ_FSTAT_TRUE= GL_COND_OBJ_FSTAT_FALSE='#' else GL_COND_OBJ_FSTAT_TRUE='#' GL_COND_OBJ_FSTAT_FALSE= fi : if test -z "${GL_COND_OBJ_FSTAT_TRUE}" && test -z "${GL_COND_OBJ_FSTAT_FALSE}"; then GL_COND_OBJ_FSTAT_TRUE='#' GL_COND_OBJ_FSTAT_FALSE='#' fi if test -z "$GL_COND_OBJ_FSTAT_TRUE"; then : case "$host_os" in mingw*) gl_LIBOBJS="$gl_LIBOBJS stat-w32.$ac_objext" ;; esac : fi GL_GNULIB_FSTAT=1 printf "%s\n" "#define GNULIB_TEST_FSTAT 1" >>confdefs.h case $gl_cv_func_getcwd_null,$gl_cv_func_getcwd_posix_signature in *yes,yes) ;; *) REPLACE_GETCWD=1 ;; esac if test $REPLACE_GETCWD = 1; then GL_COND_OBJ_GETCWD_LGPL_TRUE= GL_COND_OBJ_GETCWD_LGPL_FALSE='#' else GL_COND_OBJ_GETCWD_LGPL_TRUE='#' GL_COND_OBJ_GETCWD_LGPL_FALSE= fi : if test -z "${GL_COND_OBJ_GETCWD_LGPL_TRUE}" && test -z "${GL_COND_OBJ_GETCWD_LGPL_FALSE}"; then GL_COND_OBJ_GETCWD_LGPL_TRUE='#' GL_COND_OBJ_GETCWD_LGPL_FALSE='#' fi GL_GNULIB_GETCWD=1 printf "%s\n" "#define GNULIB_TEST_GETCWD 1" >>confdefs.h if test $ac_cv_func_getdelim = yes; then HAVE_GETDELIM=1 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working getdelim function" >&5 printf %s "checking for working getdelim function... " >&6; } if test ${gl_cv_func_working_getdelim+y} then : printf %s "(cached) " >&6 else $as_nop echo fooNbarN | tr -d '\012' | tr N '\012' > conftest.data if test "$cross_compiling" = yes then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef __GNU_LIBRARY__ #if (__GLIBC__ >= 2) && !defined __UCLIBC__ Lucky GNU user #endif #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "Lucky GNU user" >/dev/null 2>&1 then : gl_cv_func_working_getdelim="guessing yes" else $as_nop case "$host_os" in *-musl*) gl_cv_func_working_getdelim="guessing yes" ;; *) gl_cv_func_working_getdelim="$gl_cross_guess_normal" ;; esac fi rm -rf conftest* else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ # include # include # include int main () { FILE *in = fopen ("./conftest.data", "r"); if (!in) return 1; { /* Test result for a NULL buffer and a zero size. Based on a test program from Karl Heuer. */ char *line = NULL; size_t siz = 0; int len = getdelim (&line, &siz, '\n', in); if (!(len == 4 && line && strcmp (line, "foo\n") == 0)) { free (line); fclose (in); return 2; } free (line); } { /* Test result for a NULL buffer and a non-zero size. This crashes on FreeBSD 8.0. */ char *line = NULL; size_t siz = (size_t)(~0) / 4; if (getdelim (&line, &siz, '\n', in) == -1) { fclose (in); return 3; } free (line); } fclose (in); return 0; } _ACEOF if ac_fn_c_try_run "$LINENO" then : gl_cv_func_working_getdelim=yes else $as_nop gl_cv_func_working_getdelim=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_working_getdelim" >&5 printf "%s\n" "$gl_cv_func_working_getdelim" >&6; } case "$gl_cv_func_working_getdelim" in *yes) ;; *) REPLACE_GETDELIM=1 ;; esac else HAVE_GETDELIM=0 fi if test $ac_cv_have_decl_getdelim = no; then HAVE_DECL_GETDELIM=0 fi if test $HAVE_GETDELIM = 0 || test $REPLACE_GETDELIM = 1; then GL_COND_OBJ_GETDELIM_TRUE= GL_COND_OBJ_GETDELIM_FALSE='#' else GL_COND_OBJ_GETDELIM_TRUE='#' GL_COND_OBJ_GETDELIM_FALSE= fi : if test -z "${GL_COND_OBJ_GETDELIM_TRUE}" && test -z "${GL_COND_OBJ_GETDELIM_FALSE}"; then GL_COND_OBJ_GETDELIM_TRUE='#' GL_COND_OBJ_GETDELIM_FALSE='#' fi if test -z "$GL_COND_OBJ_GETDELIM_TRUE"; then : ac_fn_c_check_func "$LINENO" "flockfile" "ac_cv_func_flockfile" if test "x$ac_cv_func_flockfile" = xyes then : printf "%s\n" "#define HAVE_FLOCKFILE 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "funlockfile" "ac_cv_func_funlockfile" if test "x$ac_cv_func_funlockfile" = xyes then : printf "%s\n" "#define HAVE_FUNLOCKFILE 1" >>confdefs.h fi ac_fn_check_decl "$LINENO" "getc_unlocked" "ac_cv_have_decl_getc_unlocked" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_getc_unlocked" = xyes then : ac_have_decl=1 else $as_nop ac_have_decl=0 fi printf "%s\n" "#define HAVE_DECL_GETC_UNLOCKED $ac_have_decl" >>confdefs.h fi GL_GNULIB_GETDELIM=1 printf "%s\n" "#define GNULIB_TEST_GETDELIM 1" >>confdefs.h if test $ac_cv_func_getdtablesize = yes && test $ac_cv_have_decl_getdtablesize = yes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether getdtablesize works" >&5 printf %s "checking whether getdtablesize works... " >&6; } if test ${gl_cv_func_getdtablesize_works+y} then : printf %s "(cached) " >&6 else $as_nop case "$host_os" in vms*) gl_cv_func_getdtablesize_works="no (limitation)" ;; *) if test "$cross_compiling" = yes then : case "$host_os" in cygwin*) # on cygwin 1.5.25, getdtablesize() automatically grows gl_cv_func_getdtablesize_works="guessing no" ;; *) gl_cv_func_getdtablesize_works="guessing yes" ;; esac else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include $gl_mda_defines int main (void) { int size = getdtablesize(); if (dup2 (0, getdtablesize()) != -1) return 1; if (size != getdtablesize()) return 2; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO" then : gl_cv_func_getdtablesize_works=yes else $as_nop gl_cv_func_getdtablesize_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_getdtablesize_works" >&5 printf "%s\n" "$gl_cv_func_getdtablesize_works" >&6; } case "$gl_cv_func_getdtablesize_works" in *yes | "no (limitation)") ;; *) REPLACE_GETDTABLESIZE=1 ;; esac else HAVE_GETDTABLESIZE=0 fi if test $HAVE_GETDTABLESIZE = 0 || test $REPLACE_GETDTABLESIZE = 1; then GL_COND_OBJ_GETDTABLESIZE_TRUE= GL_COND_OBJ_GETDTABLESIZE_FALSE='#' else GL_COND_OBJ_GETDTABLESIZE_TRUE='#' GL_COND_OBJ_GETDTABLESIZE_FALSE= fi : if test -z "${GL_COND_OBJ_GETDTABLESIZE_TRUE}" && test -z "${GL_COND_OBJ_GETDTABLESIZE_FALSE}"; then GL_COND_OBJ_GETDTABLESIZE_TRUE='#' GL_COND_OBJ_GETDTABLESIZE_FALSE='#' fi if test -z "$GL_COND_OBJ_GETDTABLESIZE_TRUE"; then : : fi GL_GNULIB_GETDTABLESIZE=1 printf "%s\n" "#define GNULIB_TEST_GETDTABLESIZE 1" >>confdefs.h gl_getline_needs_run_time_check=no ac_fn_c_check_func "$LINENO" "getline" "ac_cv_func_getline" if test "x$ac_cv_func_getline" = xyes then : gl_getline_needs_run_time_check=yes else $as_nop am_cv_func_working_getline=no fi if test $gl_getline_needs_run_time_check = yes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working getline function" >&5 printf %s "checking for working getline function... " >&6; } if test ${am_cv_func_working_getline+y} then : printf %s "(cached) " >&6 else $as_nop echo fooNbarN | tr -d '\012' | tr N '\012' > conftest.data if test "$cross_compiling" = yes then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef __GNU_LIBRARY__ #if (__GLIBC__ >= 2) && !defined __UCLIBC__ Lucky GNU user #endif #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "Lucky GNU user" >/dev/null 2>&1 then : am_cv_func_working_getline="guessing yes" else $as_nop case "$host_os" in *-musl*) am_cv_func_working_getline="guessing yes" ;; *) am_cv_func_working_getline="$gl_cross_guess_normal" ;; esac fi rm -rf conftest* else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ # include # include # include int main () { FILE *in = fopen ("./conftest.data", "r"); if (!in) return 1; { /* Test result for a NULL buffer and a zero size. Based on a test program from Karl Heuer. */ char *line = NULL; size_t siz = 0; int len = getline (&line, &siz, in); if (!(len == 4 && line && strcmp (line, "foo\n") == 0)) { free (line); fclose (in); return 2; } free (line); } { /* Test result for a NULL buffer and a non-zero size. This crashes on FreeBSD 8.0. */ char *line = NULL; size_t siz = (size_t)(~0) / 4; if (getline (&line, &siz, in) == -1) { fclose (in); return 3; } free (line); } fclose (in); return 0; } _ACEOF if ac_fn_c_try_run "$LINENO" then : am_cv_func_working_getline=yes else $as_nop am_cv_func_working_getline=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_working_getline" >&5 printf "%s\n" "$am_cv_func_working_getline" >&6; } fi if test $ac_cv_have_decl_getline = no; then HAVE_DECL_GETLINE=0 fi case "$am_cv_func_working_getline" in *yes) ;; *) REPLACE_GETLINE=1 ;; esac if test $REPLACE_GETLINE = 1; then GL_COND_OBJ_GETLINE_TRUE= GL_COND_OBJ_GETLINE_FALSE='#' else GL_COND_OBJ_GETLINE_TRUE='#' GL_COND_OBJ_GETLINE_FALSE= fi : if test -z "${GL_COND_OBJ_GETLINE_TRUE}" && test -z "${GL_COND_OBJ_GETLINE_FALSE}"; then GL_COND_OBJ_GETLINE_TRUE='#' GL_COND_OBJ_GETLINE_FALSE='#' fi if test -z "$GL_COND_OBJ_GETLINE_TRUE"; then : : fi GL_GNULIB_GETLINE=1 printf "%s\n" "#define GNULIB_TEST_GETLINE 1" >>confdefs.h REPLACE_GETOPT=1 GL_GENERATE_GETOPT_H=false GL_GENERATE_GETOPT_CDEFS_H=false if test $REPLACE_GETOPT = 1; then if test $ac_cv_header_sys_cdefs_h = yes; then HAVE_SYS_CDEFS_H=1 else HAVE_SYS_CDEFS_H=0 fi printf "%s\n" "#define __GETOPT_PREFIX rpl_" >>confdefs.h GL_GENERATE_GETOPT_H=true GL_GENERATE_GETOPT_CDEFS_H=true fi case "$GL_GENERATE_GETOPT_H" in false) GETOPT_H='' ;; true) if test -z "$GETOPT_H"; then GETOPT_H="${gl_source_base_prefix}getopt.h" fi ;; *) echo "*** GL_GENERATE_GETOPT_H is not set correctly" 1>&2; exit 1 ;; esac if $GL_GENERATE_GETOPT_H; then GL_GENERATE_GETOPT_H_TRUE= GL_GENERATE_GETOPT_H_FALSE='#' else GL_GENERATE_GETOPT_H_TRUE='#' GL_GENERATE_GETOPT_H_FALSE= fi : if test -z "${GL_GENERATE_GETOPT_H_TRUE}" && test -z "${GL_GENERATE_GETOPT_H_FALSE}"; then GL_GENERATE_GETOPT_H_TRUE='#' GL_GENERATE_GETOPT_H_FALSE='#' fi case "$GL_GENERATE_GETOPT_CDEFS_H" in false) GETOPT_CDEFS_H='' ;; true) if test -z "$GETOPT_CDEFS_H"; then GETOPT_CDEFS_H="${gl_source_base_prefix}getopt-cdefs.h" fi ;; *) echo "*** GL_GENERATE_GETOPT_CDEFS_H is not set correctly" 1>&2; exit 1 ;; esac if $GL_GENERATE_GETOPT_CDEFS_H; then GL_GENERATE_GETOPT_CDEFS_H_TRUE= GL_GENERATE_GETOPT_CDEFS_H_FALSE='#' else GL_GENERATE_GETOPT_CDEFS_H_TRUE='#' GL_GENERATE_GETOPT_CDEFS_H_FALSE= fi : if test -z "${GL_GENERATE_GETOPT_CDEFS_H_TRUE}" && test -z "${GL_GENERATE_GETOPT_CDEFS_H_FALSE}"; then GL_GENERATE_GETOPT_CDEFS_H_TRUE='#' GL_GENERATE_GETOPT_CDEFS_H_FALSE='#' fi if test $REPLACE_GETOPT = 1; then GL_COND_OBJ_GETOPT_TRUE= GL_COND_OBJ_GETOPT_FALSE='#' else GL_COND_OBJ_GETOPT_TRUE='#' GL_COND_OBJ_GETOPT_FALSE= fi : if test -z "${GL_COND_OBJ_GETOPT_TRUE}" && test -z "${GL_COND_OBJ_GETOPT_FALSE}"; then GL_COND_OBJ_GETOPT_TRUE='#' GL_COND_OBJ_GETOPT_FALSE='#' fi if test -z "$GL_COND_OBJ_GETOPT_TRUE"; then : GL_GNULIB_UNISTD_H_GETOPT=1 fi GL_GNULIB_GETOPT_POSIX=1 printf "%s\n" "#define GNULIB_TEST_GETOPT_POSIX 1" >>confdefs.h ac_found=0 ac_fn_check_decl "$LINENO" "program_invocation_name" "ac_cv_have_decl_program_invocation_name" "#include " "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_program_invocation_name" = xyes then : ac_have_decl=1 else $as_nop ac_have_decl=0 fi printf "%s\n" "#define HAVE_DECL_PROGRAM_INVOCATION_NAME $ac_have_decl" >>confdefs.h if test $ac_have_decl = 1 then : ac_found=1 fi ac_fn_check_decl "$LINENO" "program_invocation_short_name" "ac_cv_have_decl_program_invocation_short_name" "#include " "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_program_invocation_short_name" = xyes then : ac_have_decl=1 else $as_nop ac_have_decl=0 fi printf "%s\n" "#define HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME $ac_have_decl" >>confdefs.h if test $ac_have_decl = 1 then : ac_found=1 fi ac_fn_check_decl "$LINENO" "__argv" "ac_cv_have_decl___argv" "#include " "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl___argv" = xyes then : ac_have_decl=1 else $as_nop ac_have_decl=0 fi printf "%s\n" "#define HAVE_DECL___ARGV $ac_have_decl" >>confdefs.h if test $ac_have_decl = 1 then : ac_found=1 fi # Incur the cost of this test only if none of the above worked. if test $ac_found = 0; then # On OpenBSD 5.1, using the global __progname variable appears to be # the only way to implement getprogname. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether __progname is defined in default libraries" >&5 printf %s "checking whether __progname is defined in default libraries... " >&6; } if test ${gl_cv_var___progname+y} then : printf %s "(cached) " >&6 else $as_nop gl_cv_var___progname= cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ extern char *__progname; int main (void) { return *__progname; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : gl_cv_var___progname=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_var___progname" >&5 printf "%s\n" "$gl_cv_var___progname" >&6; } if test "$gl_cv_var___progname" = yes; then printf "%s\n" "#define HAVE_VAR___PROGNAME 1" >>confdefs.h fi fi LIB_HARD_LOCALE="$LIB_SETLOCALE_NULL" if test $ac_cv_func_isblank = no; then HAVE_ISBLANK=0 fi if test $HAVE_ISBLANK = 0; then GL_COND_OBJ_ISBLANK_TRUE= GL_COND_OBJ_ISBLANK_FALSE='#' else GL_COND_OBJ_ISBLANK_TRUE='#' GL_COND_OBJ_ISBLANK_FALSE= fi : if test -z "${GL_COND_OBJ_ISBLANK_TRUE}" && test -z "${GL_COND_OBJ_ISBLANK_FALSE}"; then GL_COND_OBJ_ISBLANK_TRUE='#' GL_COND_OBJ_ISBLANK_FALSE='#' fi printf "%s\n" "#define GNULIB_ISBLANK 1" >>confdefs.h GL_GNULIB_ISBLANK=1 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports the __inline keyword" >&5 printf %s "checking whether the compiler supports the __inline keyword... " >&6; } if test ${gl_cv_c___inline+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ typedef int foo_t; static __inline foo_t foo (void) { return 0; } int main (void) { return foo (); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : gl_cv_c___inline=yes else $as_nop gl_cv_c___inline=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_c___inline" >&5 printf "%s\n" "$gl_cv_c___inline" >&6; } if test $gl_cv_c___inline = yes; then printf "%s\n" "#define HAVE___INLINE 1" >>confdefs.h fi case "$GL_GENERATE_LIMITS_H" in false) LIMITS_H='' ;; true) if test -z "$LIMITS_H"; then LIMITS_H="${gl_source_base_prefix}limits.h" fi ;; *) echo "*** GL_GENERATE_LIMITS_H is not set correctly" 1>&2; exit 1 ;; esac if $GL_GENERATE_LIMITS_H; then GL_GENERATE_LIMITS_H_TRUE= GL_GENERATE_LIMITS_H_FALSE='#' else GL_GENERATE_LIMITS_H_TRUE='#' GL_GENERATE_LIMITS_H_FALSE= fi : if test -z "${GL_GENERATE_LIMITS_H_TRUE}" && test -z "${GL_GENERATE_LIMITS_H_FALSE}"; then GL_GENERATE_LIMITS_H_TRUE='#' GL_GENERATE_LIMITS_H_FALSE='#' fi LOCALCHARSET_TESTS_ENVIRONMENT= if test $REPLACE_STRUCT_LCONV = 1; then REPLACE_LOCALECONV=1 fi if test $REPLACE_LOCALECONV = 1; then GL_COND_OBJ_LOCALECONV_TRUE= GL_COND_OBJ_LOCALECONV_FALSE='#' else GL_COND_OBJ_LOCALECONV_TRUE='#' GL_COND_OBJ_LOCALECONV_FALSE= fi : if test -z "${GL_COND_OBJ_LOCALECONV_TRUE}" && test -z "${GL_COND_OBJ_LOCALECONV_FALSE}"; then GL_COND_OBJ_LOCALECONV_TRUE='#' GL_COND_OBJ_LOCALECONV_FALSE='#' fi if test -z "$GL_COND_OBJ_LOCALECONV_TRUE"; then : ac_fn_c_check_member "$LINENO" "struct lconv" "decimal_point" "ac_cv_member_struct_lconv_decimal_point" "#include " if test "x$ac_cv_member_struct_lconv_decimal_point" = xyes then : printf "%s\n" "#define HAVE_STRUCT_LCONV_DECIMAL_POINT 1" >>confdefs.h fi fi GL_GNULIB_LOCALECONV=1 printf "%s\n" "#define GNULIB_TEST_LOCALECONV 1" >>confdefs.h if test "$gl_threads_api" = posix; then # OSF/1 4.0 and Mac OS X 10.1 lack the pthread_rwlock_t type and the # pthread_rwlock_* functions. has_rwlock=false ac_fn_c_check_type "$LINENO" "pthread_rwlock_t" "ac_cv_type_pthread_rwlock_t" "#include " if test "x$ac_cv_type_pthread_rwlock_t" = xyes then : has_rwlock=true printf "%s\n" "#define HAVE_PTHREAD_RWLOCK 1" >>confdefs.h fi if $has_rwlock; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether pthread_rwlock_rdlock prefers a writer to a reader" >&5 printf %s "checking whether pthread_rwlock_rdlock prefers a writer to a reader... " >&6; } if test ${gl_cv_pthread_rwlock_rdlock_prefer_writer+y} then : printf %s "(cached) " >&6 else $as_nop save_LIBS="$LIBS" LIBS="$LIBS $LIBMULTITHREAD" if test "$cross_compiling" = yes then : case "$host_os" in # Guess no on glibc systems. *-gnu* | gnu*) gl_cv_pthread_rwlock_rdlock_prefer_writer="guessing no" ;; # Guess no on musl systems. *-musl*) gl_cv_pthread_rwlock_rdlock_prefer_writer="guessing no" ;; # Guess no on bionic systems. *-android*) gl_cv_pthread_rwlock_rdlock_prefer_writer="guessing no" ;; # Guess yes on native Windows with the mingw-w64 winpthreads library. # Guess no on native Windows with the gnulib windows-rwlock module. mingw*) if test "$gl_use_threads" = yes || test "$gl_use_threads" = posix; then gl_cv_pthread_rwlock_rdlock_prefer_writer="guessing yes" else gl_cv_pthread_rwlock_rdlock_prefer_writer="guessing no" fi ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_pthread_rwlock_rdlock_prefer_writer="$gl_cross_guess_normal" ;; esac else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include #define SUCCEED() exit (0) #define FAILURE() exit (1) #define UNEXPECTED(n) (exit (10 + (n))) /* The main thread creates the waiting writer and the requesting reader threads in the default way; this guarantees that they have the same priority. We can reuse the main thread as first reader thread. */ static pthread_rwlock_t lock; static pthread_t reader1; static pthread_t writer; static pthread_t reader2; static pthread_t timer; /* Used to pass control from writer to reader2 and from reader2 to timer, as in a relay race. Passing control from one running thread to another running thread is most likely faster than to create the second thread. */ static pthread_mutex_t baton; static void * timer_func (void *ignored) { /* Step 13 (can be before or after step 12): The timer thread takes the baton, then waits a moment to make sure it can tell whether the second reader thread is blocked at step 12. */ if (pthread_mutex_lock (&baton)) UNEXPECTED (13); usleep (100000); /* By the time we get here, it's clear that the second reader thread is blocked at step 12. This is the desired behaviour. */ SUCCEED (); } static void * reader2_func (void *ignored) { int err; /* Step 8 (can be before or after step 7): The second reader thread takes the baton, then waits a moment to make sure the writer thread has reached step 7. */ if (pthread_mutex_lock (&baton)) UNEXPECTED (8); usleep (100000); /* Step 9: The second reader thread requests the lock. */ err = pthread_rwlock_tryrdlock (&lock); if (err == 0) FAILURE (); else if (err != EBUSY) UNEXPECTED (9); /* Step 10: Launch a timer, to test whether the next call blocks. */ if (pthread_create (&timer, NULL, timer_func, NULL)) UNEXPECTED (10); /* Step 11: Release the baton. */ if (pthread_mutex_unlock (&baton)) UNEXPECTED (11); /* Step 12: The second reader thread requests the lock. */ err = pthread_rwlock_rdlock (&lock); if (err == 0) FAILURE (); else UNEXPECTED (12); } static void * writer_func (void *ignored) { /* Step 4: Take the baton, so that the second reader thread does not go ahead too early. */ if (pthread_mutex_lock (&baton)) UNEXPECTED (4); /* Step 5: Create the second reader thread. */ if (pthread_create (&reader2, NULL, reader2_func, NULL)) UNEXPECTED (5); /* Step 6: Release the baton. */ if (pthread_mutex_unlock (&baton)) UNEXPECTED (6); /* Step 7: The writer thread requests the lock. */ if (pthread_rwlock_wrlock (&lock)) UNEXPECTED (7); return NULL; } int main () { reader1 = pthread_self (); /* Step 1: The main thread initializes the lock and the baton. */ if (pthread_rwlock_init (&lock, NULL)) UNEXPECTED (1); if (pthread_mutex_init (&baton, NULL)) UNEXPECTED (1); /* Step 2: The main thread acquires the lock as a reader. */ if (pthread_rwlock_rdlock (&lock)) UNEXPECTED (2); /* Step 3: Create the writer thread. */ if (pthread_create (&writer, NULL, writer_func, NULL)) UNEXPECTED (3); /* Job done. Go to sleep. */ for (;;) { sleep (1); } } _ACEOF if ac_fn_c_try_run "$LINENO" then : gl_cv_pthread_rwlock_rdlock_prefer_writer=yes else $as_nop gl_cv_pthread_rwlock_rdlock_prefer_writer=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi LIBS="$save_LIBS" fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_pthread_rwlock_rdlock_prefer_writer" >&5 printf "%s\n" "$gl_cv_pthread_rwlock_rdlock_prefer_writer" >&6; } case "$gl_cv_pthread_rwlock_rdlock_prefer_writer" in *yes) printf "%s\n" "#define HAVE_PTHREAD_RWLOCK_RDLOCK_PREFER_WRITER 1" >>confdefs.h ;; esac fi # glibc defines PTHREAD_MUTEX_RECURSIVE as enum, not as a macro. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { #if __FreeBSD__ == 4 error "No, in FreeBSD 4.0 recursive mutexes actually don't work." #elif (defined __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ \ && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1070) error "No, in Mac OS X < 10.7 recursive mutexes actually don't work." #else int x = (int)PTHREAD_MUTEX_RECURSIVE; return !x; #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : printf "%s\n" "#define HAVE_PTHREAD_MUTEX_RECURSIVE 1" >>confdefs.h fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi : printf "%s\n" "#define GNULIB_LOCK 1" >>confdefs.h REPLACE_MALLOC_FOR_MALLOC_GNU="$REPLACE_MALLOC_FOR_MALLOC_POSIX" if test $REPLACE_MALLOC_FOR_MALLOC_GNU = 0; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether malloc (0) returns nonnull" >&5 printf %s "checking whether malloc (0) returns nonnull... " >&6; } if test ${ac_cv_func_malloc_0_nonnull+y} then : printf %s "(cached) " >&6 else $as_nop if test "$cross_compiling" = yes then : case "$host_os" in # Guess yes on platforms where we know the result. *-gnu* | freebsd* | netbsd* | openbsd* | bitrig* \ | gnu* | *-musl* | midnightbsd* \ | hpux* | solaris* | cygwin* | mingw* | msys* ) ac_cv_func_malloc_0_nonnull="guessing yes" ;; # If we don't know, obey --enable-cross-guesses. *) ac_cv_func_malloc_0_nonnull="$gl_cross_guess_normal" ;; esac else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { void *p = malloc (0); int result = !p; free (p); return result; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO" then : ac_cv_func_malloc_0_nonnull=yes else $as_nop ac_cv_func_malloc_0_nonnull=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_malloc_0_nonnull" >&5 printf "%s\n" "$ac_cv_func_malloc_0_nonnull" >&6; } case $ac_cv_func_malloc_0_nonnull in #( *yes) : ;; #( *) : REPLACE_MALLOC_FOR_MALLOC_GNU=1 ;; esac fi if test $REPLACE_MALLOC_FOR_MALLOC_GNU = 1; then gl_LIBOBJS="$gl_LIBOBJS malloc.$ac_objext" fi GL_GNULIB_MALLOC_GNU=1 printf "%s\n" "#define GNULIB_TEST_MALLOC_GNU 1" >>confdefs.h if test $REPLACE_MALLOC_FOR_MALLOC_POSIX = 1; then gl_LIBOBJS="$gl_LIBOBJS malloc.$ac_objext" fi GL_GNULIB_MALLOC_POSIX=1 printf "%s\n" "#define GNULIB_TEST_MALLOC_POSIX 1" >>confdefs.h if case "$host_os" in mingw*) true ;; *) test $ac_cv_func_mbsinit = yes ;; esac \ && test $ac_cv_func_mbrtowc = yes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether mbrtowc handles incomplete characters" >&5 printf %s "checking whether mbrtowc handles incomplete characters... " >&6; } if test ${gl_cv_func_mbrtowc_incomplete_state+y} then : printf %s "(cached) " >&6 else $as_nop case "$host_os" in # Guess no on AIX and OSF/1. aix* | osf*) gl_cv_func_mbrtowc_incomplete_state="guessing no" ;; # Guess yes otherwise. *) gl_cv_func_mbrtowc_incomplete_state="guessing yes" ;; esac if test $LOCALE_JA != none; then if test "$cross_compiling" = yes then : : else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { if (setlocale (LC_ALL, "$LOCALE_JA") != NULL) { const char input[] = "B\217\253\344\217\251\316er"; /* "Büßer" */ mbstate_t state; wchar_t wc; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2)) if (mbsinit (&state)) return 2; } return 0; } _ACEOF if ac_fn_c_try_run "$LINENO" then : gl_cv_func_mbrtowc_incomplete_state=yes else $as_nop gl_cv_func_mbrtowc_incomplete_state=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi else if test $LOCALE_FR_UTF8 != none; then if test "$cross_compiling" = yes then : : else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL) { const char input[] = "B\303\274\303\237er"; /* "Büßer" */ mbstate_t state; wchar_t wc; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2)) if (mbsinit (&state)) return 2; } return 0; } _ACEOF if ac_fn_c_try_run "$LINENO" then : gl_cv_func_mbrtowc_incomplete_state=yes else $as_nop gl_cv_func_mbrtowc_incomplete_state=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mbrtowc_incomplete_state" >&5 printf "%s\n" "$gl_cv_func_mbrtowc_incomplete_state" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether mbrtowc works as well as mbtowc" >&5 printf %s "checking whether mbrtowc works as well as mbtowc... " >&6; } if test ${gl_cv_func_mbrtowc_sanitycheck+y} then : printf %s "(cached) " >&6 else $as_nop case "$host_os" in # Guess no on Solaris 8. solaris2.8) gl_cv_func_mbrtowc_sanitycheck="guessing no" ;; # Guess yes otherwise. *) gl_cv_func_mbrtowc_sanitycheck="guessing yes" ;; esac if test $LOCALE_ZH_CN != none; then if test "$cross_compiling" = yes then : : else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { /* This fails on Solaris 8: mbrtowc returns 2, and sets wc to 0x00F0. mbtowc returns 4 (correct) and sets wc to 0x5EDC. */ if (setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL) { char input[] = "B\250\271\201\060\211\070er"; /* "Büßer" */ mbstate_t state; wchar_t wc; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (&wc, input + 3, 6, &state) != 4 && mbtowc (&wc, input + 3, 6) == 4) return 2; } return 0; } _ACEOF if ac_fn_c_try_run "$LINENO" then : gl_cv_func_mbrtowc_sanitycheck=yes else $as_nop gl_cv_func_mbrtowc_sanitycheck=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mbrtowc_sanitycheck" >&5 printf "%s\n" "$gl_cv_func_mbrtowc_sanitycheck" >&6; } REPLACE_MBSTATE_T=0 case "$gl_cv_func_mbrtowc_incomplete_state" in *yes) ;; *) REPLACE_MBSTATE_T=1 ;; esac case "$gl_cv_func_mbrtowc_sanitycheck" in *yes) ;; *) REPLACE_MBSTATE_T=1 ;; esac else REPLACE_MBSTATE_T=1 fi if test $ac_cv_func_mbrtowc = no; then HAVE_MBRTOWC=0 ac_fn_check_decl "$LINENO" "mbrtowc" "ac_cv_have_decl_mbrtowc" " #include " "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_mbrtowc" = xyes then : ac_have_decl=1 else $as_nop ac_have_decl=0 fi printf "%s\n" "#define HAVE_DECL_MBRTOWC $ac_have_decl" >>confdefs.h if test $ac_cv_have_decl_mbrtowc = yes; then REPLACE_MBRTOWC=1 fi else if test $REPLACE_MBSTATE_T = 1; then REPLACE_MBRTOWC=1 else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether mbrtowc handles a NULL pwc argument" >&5 printf %s "checking whether mbrtowc handles a NULL pwc argument... " >&6; } if test ${gl_cv_func_mbrtowc_null_arg1+y} then : printf %s "(cached) " >&6 else $as_nop case "$host_os" in # Guess no on Solaris. solaris*) gl_cv_func_mbrtowc_null_arg1="guessing no" ;; # Guess yes otherwise. *) gl_cv_func_mbrtowc_null_arg1="guessing yes" ;; esac if test $LOCALE_FR_UTF8 != none; then if test "$cross_compiling" = yes then : : else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { int result = 0; if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL) { char input[] = "\303\237er"; mbstate_t state; wchar_t wc; size_t ret; memset (&state, '\0', sizeof (mbstate_t)); wc = (wchar_t) 0xBADFACE; ret = mbrtowc (&wc, input, 5, &state); if (ret != 2) result |= 1; if (!mbsinit (&state)) result |= 2; memset (&state, '\0', sizeof (mbstate_t)); ret = mbrtowc (NULL, input, 5, &state); if (ret != 2) /* Solaris 7 fails here: ret is -1. */ result |= 4; if (!mbsinit (&state)) result |= 8; } return result; } _ACEOF if ac_fn_c_try_run "$LINENO" then : gl_cv_func_mbrtowc_null_arg1=yes else $as_nop gl_cv_func_mbrtowc_null_arg1=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mbrtowc_null_arg1" >&5 printf "%s\n" "$gl_cv_func_mbrtowc_null_arg1" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether mbrtowc handles a NULL string argument" >&5 printf %s "checking whether mbrtowc handles a NULL string argument... " >&6; } if test ${gl_cv_func_mbrtowc_null_arg2+y} then : printf %s "(cached) " >&6 else $as_nop case "$host_os" in # Guess no on OSF/1. osf*) gl_cv_func_mbrtowc_null_arg2="guessing no" ;; # Guess yes otherwise. *) gl_cv_func_mbrtowc_null_arg2="guessing yes" ;; esac if test $LOCALE_FR_UTF8 != none; then if test "$cross_compiling" = yes then : : else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL) { mbstate_t state; wchar_t wc; int ret; memset (&state, '\0', sizeof (mbstate_t)); wc = (wchar_t) 0xBADFACE; mbrtowc (&wc, NULL, 5, &state); /* Check that wc was not modified. */ if (wc != (wchar_t) 0xBADFACE) return 2; } return 0; } _ACEOF if ac_fn_c_try_run "$LINENO" then : gl_cv_func_mbrtowc_null_arg2=yes else $as_nop gl_cv_func_mbrtowc_null_arg2=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mbrtowc_null_arg2" >&5 printf "%s\n" "$gl_cv_func_mbrtowc_null_arg2" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether mbrtowc has a correct return value" >&5 printf %s "checking whether mbrtowc has a correct return value... " >&6; } if test ${gl_cv_func_mbrtowc_retval+y} then : printf %s "(cached) " >&6 else $as_nop case "$host_os" in # Guess no on HP-UX, Solaris, native Windows. hpux* | solaris* | mingw*) gl_cv_func_mbrtowc_retval="guessing no" ;; # Guess yes otherwise. *) gl_cv_func_mbrtowc_retval="guessing yes" ;; esac if test $LOCALE_FR_UTF8 != none || test $LOCALE_JA != none \ || { case "$host_os" in mingw*) true;; *) false;; esac; }; then if test "$cross_compiling" = yes then : : else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { int result = 0; int found_some_locale = 0; /* This fails on Solaris. */ if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL) { char input[] = "B\303\274\303\237er"; /* "Büßer" */ mbstate_t state; wchar_t wc; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2)) { input[1] = '\0'; if (mbrtowc (&wc, input + 2, 5, &state) != 1) result |= 1; } found_some_locale = 1; } /* This fails on HP-UX 11.11. */ if (setlocale (LC_ALL, "$LOCALE_JA") != NULL) { char input[] = "B\217\253\344\217\251\316er"; /* "Büßer" */ mbstate_t state; wchar_t wc; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2)) { input[1] = '\0'; if (mbrtowc (&wc, input + 2, 5, &state) != 2) result |= 2; } found_some_locale = 1; } /* This fails on native Windows. */ if (setlocale (LC_ALL, "Japanese_Japan.932") != NULL) { char input[] = "<\223\372\226\173\214\352>"; /* "<日本語>" */ mbstate_t state; wchar_t wc; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (&wc, input + 3, 1, &state) == (size_t)(-2)) { input[3] = '\0'; if (mbrtowc (&wc, input + 4, 4, &state) != 1) result |= 4; } found_some_locale = 1; } if (setlocale (LC_ALL, "Chinese_Taiwan.950") != NULL) { char input[] = "<\244\351\245\273\273\171>"; /* "<日本語>" */ mbstate_t state; wchar_t wc; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (&wc, input + 3, 1, &state) == (size_t)(-2)) { input[3] = '\0'; if (mbrtowc (&wc, input + 4, 4, &state) != 1) result |= 8; } found_some_locale = 1; } if (setlocale (LC_ALL, "Chinese_China.936") != NULL) { char input[] = "<\310\325\261\276\325\132>"; /* "<日本語>" */ mbstate_t state; wchar_t wc; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (&wc, input + 3, 1, &state) == (size_t)(-2)) { input[3] = '\0'; if (mbrtowc (&wc, input + 4, 4, &state) != 1) result |= 16; } found_some_locale = 1; } return (found_some_locale ? result : 77); } _ACEOF if ac_fn_c_try_run "$LINENO" then : gl_cv_func_mbrtowc_retval=yes else $as_nop if test $? != 77; then gl_cv_func_mbrtowc_retval=no fi fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mbrtowc_retval" >&5 printf "%s\n" "$gl_cv_func_mbrtowc_retval" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether mbrtowc returns 0 when parsing a NUL character" >&5 printf %s "checking whether mbrtowc returns 0 when parsing a NUL character... " >&6; } if test ${gl_cv_func_mbrtowc_nul_retval+y} then : printf %s "(cached) " >&6 else $as_nop case "$host_os" in # Guess no on Solaris 8 and 9. solaris2.[89]) gl_cv_func_mbrtowc_nul_retval="guessing no" ;; # Guess yes otherwise. *) gl_cv_func_mbrtowc_nul_retval="guessing yes" ;; esac if test $LOCALE_ZH_CN != none; then if test "$cross_compiling" = yes then : : else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { /* This fails on Solaris 8 and 9. */ if (setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL) { mbstate_t state; wchar_t wc; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (&wc, "", 1, &state) != 0) return 2; } return 0; } _ACEOF if ac_fn_c_try_run "$LINENO" then : gl_cv_func_mbrtowc_nul_retval=yes else $as_nop gl_cv_func_mbrtowc_nul_retval=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mbrtowc_nul_retval" >&5 printf "%s\n" "$gl_cv_func_mbrtowc_nul_retval" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether mbrtowc stores incomplete characters" >&5 printf %s "checking whether mbrtowc stores incomplete characters... " >&6; } if test ${gl_cv_func_mbrtowc_stores_incomplete+y} then : printf %s "(cached) " >&6 else $as_nop case "$host_os" in # Guess yes on native Windows. mingw*) gl_cv_func_mbrtowc_stores_incomplete="guessing yes" ;; *) gl_cv_func_mbrtowc_stores_incomplete="guessing no" ;; esac case "$host_os" in mingw*) if test "$cross_compiling" = yes then : : else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { int result = 0; if (setlocale (LC_ALL, "French_France.65001") != NULL) { wchar_t wc = (wchar_t) 0xBADFACE; mbstate_t state; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (&wc, "\303", 1, &state) == (size_t)(-2) && wc != (wchar_t) 0xBADFACE) result |= 1; } if (setlocale (LC_ALL, "Japanese_Japan.932") != NULL) { wchar_t wc = (wchar_t) 0xBADFACE; mbstate_t state; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (&wc, "\226", 1, &state) == (size_t)(-2) && wc != (wchar_t) 0xBADFACE) result |= 2; } if (setlocale (LC_ALL, "Chinese_Taiwan.950") != NULL) { wchar_t wc = (wchar_t) 0xBADFACE; mbstate_t state; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (&wc, "\245", 1, &state) == (size_t)(-2) && wc != (wchar_t) 0xBADFACE) result |= 4; } if (setlocale (LC_ALL, "Chinese_China.936") != NULL) { wchar_t wc = (wchar_t) 0xBADFACE; mbstate_t state; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (&wc, "\261", 1, &state) == (size_t)(-2) && wc != (wchar_t) 0xBADFACE) result |= 8; } return result; } _ACEOF if ac_fn_c_try_run "$LINENO" then : gl_cv_func_mbrtowc_stores_incomplete=no else $as_nop gl_cv_func_mbrtowc_stores_incomplete=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi ;; *) if test $LOCALE_FR_UTF8 != none; then if test "$cross_compiling" = yes then : : else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL) { wchar_t wc = (wchar_t) 0xBADFACE; mbstate_t state; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (&wc, "\303", 1, &state) == (size_t)(-2) && wc != (wchar_t) 0xBADFACE) return 1; } return 0; } _ACEOF if ac_fn_c_try_run "$LINENO" then : gl_cv_func_mbrtowc_stores_incomplete=no else $as_nop gl_cv_func_mbrtowc_stores_incomplete=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mbrtowc_stores_incomplete" >&5 printf "%s\n" "$gl_cv_func_mbrtowc_stores_incomplete" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether mbrtowc works on empty input" >&5 printf %s "checking whether mbrtowc works on empty input... " >&6; } if test ${gl_cv_func_mbrtowc_empty_input+y} then : printf %s "(cached) " >&6 else $as_nop case "$host_os" in # Guess no on AIX and glibc systems. aix* | *-gnu* | gnu*) gl_cv_func_mbrtowc_empty_input="guessing no" ;; # Guess yes on native Windows. mingw*) gl_cv_func_mbrtowc_empty_input="guessing yes" ;; *) gl_cv_func_mbrtowc_empty_input="guessing yes" ;; esac if test "$cross_compiling" = yes then : : else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include static wchar_t wc; static mbstate_t mbs; int main (void) { return mbrtowc (&wc, "", 0, &mbs) != (size_t) -2; } _ACEOF if ac_fn_c_try_run "$LINENO" then : gl_cv_func_mbrtowc_empty_input=yes else $as_nop gl_cv_func_mbrtowc_empty_input=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mbrtowc_empty_input" >&5 printf "%s\n" "$gl_cv_func_mbrtowc_empty_input" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C locale is free of encoding errors" >&5 printf %s "checking whether the C locale is free of encoding errors... " >&6; } if test ${gl_cv_func_mbrtowc_C_locale_sans_EILSEQ+y} then : printf %s "(cached) " >&6 else $as_nop gl_cv_func_mbrtowc_C_locale_sans_EILSEQ="$gl_cross_guess_normal" if test "$cross_compiling" = yes then : case "$host_os" in # Guess yes on native Windows. mingw*) gl_cv_func_mbrtowc_C_locale_sans_EILSEQ="guessing yes" ;; esac else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main (void) { int i; char *locale = setlocale (LC_ALL, "C"); if (! locale) return 2; for (i = CHAR_MIN; i <= CHAR_MAX; i++) { char c = i; wchar_t wc; mbstate_t mbs = { 0, }; size_t ss = mbrtowc (&wc, &c, 1, &mbs); if (1 < ss) return 3; } return 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO" then : gl_cv_func_mbrtowc_C_locale_sans_EILSEQ=yes else $as_nop gl_cv_func_mbrtowc_C_locale_sans_EILSEQ=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mbrtowc_C_locale_sans_EILSEQ" >&5 printf "%s\n" "$gl_cv_func_mbrtowc_C_locale_sans_EILSEQ" >&6; } case "$gl_cv_func_mbrtowc_null_arg1" in *yes) ;; *) printf "%s\n" "#define MBRTOWC_NULL_ARG1_BUG 1" >>confdefs.h REPLACE_MBRTOWC=1 ;; esac case "$gl_cv_func_mbrtowc_null_arg2" in *yes) ;; *) printf "%s\n" "#define MBRTOWC_NULL_ARG2_BUG 1" >>confdefs.h REPLACE_MBRTOWC=1 ;; esac case "$gl_cv_func_mbrtowc_retval" in *yes) ;; *) printf "%s\n" "#define MBRTOWC_RETVAL_BUG 1" >>confdefs.h REPLACE_MBRTOWC=1 ;; esac case "$gl_cv_func_mbrtowc_nul_retval" in *yes) ;; *) printf "%s\n" "#define MBRTOWC_NUL_RETVAL_BUG 1" >>confdefs.h REPLACE_MBRTOWC=1 ;; esac case "$gl_cv_func_mbrtowc_stores_incomplete" in *no) ;; *) printf "%s\n" "#define MBRTOWC_STORES_INCOMPLETE_BUG 1" >>confdefs.h REPLACE_MBRTOWC=1 ;; esac case "$gl_cv_func_mbrtowc_empty_input" in *yes) ;; *) printf "%s\n" "#define MBRTOWC_EMPTY_INPUT_BUG 1" >>confdefs.h REPLACE_MBRTOWC=1 ;; esac case "$gl_cv_func_mbrtowc_C_locale_sans_EILSEQ" in *yes) ;; *) printf "%s\n" "#define MBRTOWC_IN_C_LOCALE_MAYBE_EILSEQ 1" >>confdefs.h REPLACE_MBRTOWC=1 ;; esac fi fi if test $REPLACE_MBSTATE_T = 1; then case "$host_os" in mingw*) LIB_MBRTOWC= ;; *) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether imported symbols can be declared weak" >&5 printf %s "checking whether imported symbols can be declared weak... " >&6; } if test ${gl_cv_have_weak+y} then : printf %s "(cached) " >&6 else $as_nop case "$host_os" in cygwin*) gl_cv_have_weak="guessing no" ;; *) gl_cv_have_weak=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ extern void xyzzy (); #pragma weak xyzzy int main (void) { xyzzy(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : gl_cv_have_weak=maybe fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext if test $gl_cv_have_weak = maybe; then if test "$cross_compiling" = yes then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __ELF__ Extensible Linking Format #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "Extensible Linking Format" >/dev/null 2>&1 then : gl_cv_have_weak="guessing yes" else $as_nop gl_cv_have_weak="guessing no" fi rm -rf conftest* else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #pragma weak fputs int main () { return (fputs == NULL); } _ACEOF if ac_fn_c_try_run "$LINENO" then : gl_cv_have_weak=yes else $as_nop gl_cv_have_weak=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi ;; esac case " $LDFLAGS " in *" -static "*) gl_cv_have_weak=no ;; esac case "$gl_cv_have_weak" in *yes) case "$host_os" in freebsd* | dragonfly* | midnightbsd*) : > conftest1.c $CC $CPPFLAGS $CFLAGS $LDFLAGS -fPIC -shared -o libempty.so conftest1.c -lpthread >&5 2>&1 cat < conftest2.c #include #pragma weak pthread_mutexattr_gettype int main () { return (pthread_mutexattr_gettype != NULL); } EOF $CC $CPPFLAGS $CFLAGS $LDFLAGS -o conftest conftest2.c libempty.so >&5 2>&1 \ || gl_cv_have_weak=no rm -f conftest1.c libempty.so conftest2.c conftest ;; esac ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_have_weak" >&5 printf "%s\n" "$gl_cv_have_weak" >&6; } case "$gl_cv_have_weak" in *yes) printf "%s\n" "#define HAVE_WEAK_SYMBOLS 1" >>confdefs.h ;; esac case "$gl_cv_have_weak" in *yes) LIB_MBRTOWC= ;; *) LIB_MBRTOWC="$LIBPTHREAD" ;; esac ;; esac else LIB_MBRTOWC= fi if test $HAVE_MBRTOWC = 0 || test $REPLACE_MBRTOWC = 1; then GL_COND_OBJ_MBRTOWC_TRUE= GL_COND_OBJ_MBRTOWC_FALSE='#' else GL_COND_OBJ_MBRTOWC_TRUE='#' GL_COND_OBJ_MBRTOWC_FALSE= fi : if test -z "${GL_COND_OBJ_MBRTOWC_TRUE}" && test -z "${GL_COND_OBJ_MBRTOWC_FALSE}"; then GL_COND_OBJ_MBRTOWC_TRUE='#' GL_COND_OBJ_MBRTOWC_FALSE='#' fi if test -z "$GL_COND_OBJ_MBRTOWC_TRUE"; then : if test $REPLACE_MBSTATE_T = 1; then gl_LIBOBJS="$gl_LIBOBJS lc-charset-dispatch.$ac_objext" gl_LIBOBJS="$gl_LIBOBJS mbtowc-lock.$ac_objext" CFLAG_VISIBILITY= HAVE_VISIBILITY=0 if test -n "$GCC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the -Werror option is usable" >&5 printf %s "checking whether the -Werror option is usable... " >&6; } if test ${gl_cv_cc_vis_werror+y} then : printf %s "(cached) " >&6 else $as_nop gl_save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -Werror" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : gl_cv_cc_vis_werror=yes else $as_nop gl_cv_cc_vis_werror=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext CFLAGS="$gl_save_CFLAGS" fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_vis_werror" >&5 printf "%s\n" "$gl_cv_cc_vis_werror" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for simple visibility declarations" >&5 printf %s "checking for simple visibility declarations... " >&6; } if test ${gl_cv_cc_visibility+y} then : printf %s "(cached) " >&6 else $as_nop gl_save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -fvisibility=hidden" if test $gl_cv_cc_vis_werror = yes; then CFLAGS="$CFLAGS -Werror" fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ extern __attribute__((__visibility__("hidden"))) int hiddenvar; extern __attribute__((__visibility__("default"))) int exportedvar; extern __attribute__((__visibility__("hidden"))) int hiddenfunc (void); extern __attribute__((__visibility__("default"))) int exportedfunc (void); void dummyfunc (void); int hiddenvar; int exportedvar; int hiddenfunc (void) { return 51; } int exportedfunc (void) { return 1225736919; } void dummyfunc (void) {} int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : gl_cv_cc_visibility=yes else $as_nop gl_cv_cc_visibility=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext CFLAGS="$gl_save_CFLAGS" fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_visibility" >&5 printf "%s\n" "$gl_cv_cc_visibility" >&6; } if test $gl_cv_cc_visibility = yes; then CFLAG_VISIBILITY="-fvisibility=hidden" HAVE_VISIBILITY=1 fi fi printf "%s\n" "#define HAVE_VISIBILITY $HAVE_VISIBILITY" >>confdefs.h fi : fi GL_GNULIB_MBRTOWC=1 printf "%s\n" "#define GNULIB_TEST_MBRTOWC 1" >>confdefs.h if case "$host_os" in mingw*) true ;; *) test $ac_cv_func_mbsinit = yes ;; esac \ && test $ac_cv_func_mbrtowc = yes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether mbrtowc handles incomplete characters" >&5 printf %s "checking whether mbrtowc handles incomplete characters... " >&6; } if test ${gl_cv_func_mbrtowc_incomplete_state+y} then : printf %s "(cached) " >&6 else $as_nop case "$host_os" in # Guess no on AIX and OSF/1. aix* | osf*) gl_cv_func_mbrtowc_incomplete_state="guessing no" ;; # Guess yes otherwise. *) gl_cv_func_mbrtowc_incomplete_state="guessing yes" ;; esac if test $LOCALE_JA != none; then if test "$cross_compiling" = yes then : : else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { if (setlocale (LC_ALL, "$LOCALE_JA") != NULL) { const char input[] = "B\217\253\344\217\251\316er"; /* "Büßer" */ mbstate_t state; wchar_t wc; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2)) if (mbsinit (&state)) return 2; } return 0; } _ACEOF if ac_fn_c_try_run "$LINENO" then : gl_cv_func_mbrtowc_incomplete_state=yes else $as_nop gl_cv_func_mbrtowc_incomplete_state=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi else if test $LOCALE_FR_UTF8 != none; then if test "$cross_compiling" = yes then : : else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL) { const char input[] = "B\303\274\303\237er"; /* "Büßer" */ mbstate_t state; wchar_t wc; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2)) if (mbsinit (&state)) return 2; } return 0; } _ACEOF if ac_fn_c_try_run "$LINENO" then : gl_cv_func_mbrtowc_incomplete_state=yes else $as_nop gl_cv_func_mbrtowc_incomplete_state=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mbrtowc_incomplete_state" >&5 printf "%s\n" "$gl_cv_func_mbrtowc_incomplete_state" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether mbrtowc works as well as mbtowc" >&5 printf %s "checking whether mbrtowc works as well as mbtowc... " >&6; } if test ${gl_cv_func_mbrtowc_sanitycheck+y} then : printf %s "(cached) " >&6 else $as_nop case "$host_os" in # Guess no on Solaris 8. solaris2.8) gl_cv_func_mbrtowc_sanitycheck="guessing no" ;; # Guess yes otherwise. *) gl_cv_func_mbrtowc_sanitycheck="guessing yes" ;; esac if test $LOCALE_ZH_CN != none; then if test "$cross_compiling" = yes then : : else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { /* This fails on Solaris 8: mbrtowc returns 2, and sets wc to 0x00F0. mbtowc returns 4 (correct) and sets wc to 0x5EDC. */ if (setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL) { char input[] = "B\250\271\201\060\211\070er"; /* "Büßer" */ mbstate_t state; wchar_t wc; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (&wc, input + 3, 6, &state) != 4 && mbtowc (&wc, input + 3, 6) == 4) return 2; } return 0; } _ACEOF if ac_fn_c_try_run "$LINENO" then : gl_cv_func_mbrtowc_sanitycheck=yes else $as_nop gl_cv_func_mbrtowc_sanitycheck=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mbrtowc_sanitycheck" >&5 printf "%s\n" "$gl_cv_func_mbrtowc_sanitycheck" >&6; } REPLACE_MBSTATE_T=0 case "$gl_cv_func_mbrtowc_incomplete_state" in *yes) ;; *) REPLACE_MBSTATE_T=1 ;; esac case "$gl_cv_func_mbrtowc_sanitycheck" in *yes) ;; *) REPLACE_MBSTATE_T=1 ;; esac else REPLACE_MBSTATE_T=1 fi if test $ac_cv_func_mbsinit = no; then HAVE_MBSINIT=0 ac_fn_check_decl "$LINENO" "mbsinit" "ac_cv_have_decl_mbsinit" " #include " "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_mbsinit" = xyes then : ac_have_decl=1 else $as_nop ac_have_decl=0 fi printf "%s\n" "#define HAVE_DECL_MBSINIT $ac_have_decl" >>confdefs.h if test $ac_cv_have_decl_mbsinit = yes; then REPLACE_MBSINIT=1 fi else if test $REPLACE_MBSTATE_T = 1; then REPLACE_MBSINIT=1 else case "$host_os" in mingw*) REPLACE_MBSINIT=1 ;; esac fi fi if test $HAVE_MBSINIT = 0 || test $REPLACE_MBSINIT = 1; then GL_COND_OBJ_MBSINIT_TRUE= GL_COND_OBJ_MBSINIT_FALSE='#' else GL_COND_OBJ_MBSINIT_TRUE='#' GL_COND_OBJ_MBSINIT_FALSE= fi : if test -z "${GL_COND_OBJ_MBSINIT_TRUE}" && test -z "${GL_COND_OBJ_MBSINIT_FALSE}"; then GL_COND_OBJ_MBSINIT_TRUE='#' GL_COND_OBJ_MBSINIT_FALSE='#' fi if test -z "$GL_COND_OBJ_MBSINIT_TRUE"; then : : fi GL_GNULIB_MBSINIT=1 printf "%s\n" "#define GNULIB_TEST_MBSINIT 1" >>confdefs.h if case "$host_os" in mingw*) true ;; *) test $ac_cv_func_mbsinit = yes ;; esac \ && test $ac_cv_func_mbrtowc = yes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether mbrtowc handles incomplete characters" >&5 printf %s "checking whether mbrtowc handles incomplete characters... " >&6; } if test ${gl_cv_func_mbrtowc_incomplete_state+y} then : printf %s "(cached) " >&6 else $as_nop case "$host_os" in # Guess no on AIX and OSF/1. aix* | osf*) gl_cv_func_mbrtowc_incomplete_state="guessing no" ;; # Guess yes otherwise. *) gl_cv_func_mbrtowc_incomplete_state="guessing yes" ;; esac if test $LOCALE_JA != none; then if test "$cross_compiling" = yes then : : else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { if (setlocale (LC_ALL, "$LOCALE_JA") != NULL) { const char input[] = "B\217\253\344\217\251\316er"; /* "Büßer" */ mbstate_t state; wchar_t wc; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2)) if (mbsinit (&state)) return 2; } return 0; } _ACEOF if ac_fn_c_try_run "$LINENO" then : gl_cv_func_mbrtowc_incomplete_state=yes else $as_nop gl_cv_func_mbrtowc_incomplete_state=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi else if test $LOCALE_FR_UTF8 != none; then if test "$cross_compiling" = yes then : : else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL) { const char input[] = "B\303\274\303\237er"; /* "Büßer" */ mbstate_t state; wchar_t wc; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2)) if (mbsinit (&state)) return 2; } return 0; } _ACEOF if ac_fn_c_try_run "$LINENO" then : gl_cv_func_mbrtowc_incomplete_state=yes else $as_nop gl_cv_func_mbrtowc_incomplete_state=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mbrtowc_incomplete_state" >&5 printf "%s\n" "$gl_cv_func_mbrtowc_incomplete_state" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether mbrtowc works as well as mbtowc" >&5 printf %s "checking whether mbrtowc works as well as mbtowc... " >&6; } if test ${gl_cv_func_mbrtowc_sanitycheck+y} then : printf %s "(cached) " >&6 else $as_nop case "$host_os" in # Guess no on Solaris 8. solaris2.8) gl_cv_func_mbrtowc_sanitycheck="guessing no" ;; # Guess yes otherwise. *) gl_cv_func_mbrtowc_sanitycheck="guessing yes" ;; esac if test $LOCALE_ZH_CN != none; then if test "$cross_compiling" = yes then : : else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { /* This fails on Solaris 8: mbrtowc returns 2, and sets wc to 0x00F0. mbtowc returns 4 (correct) and sets wc to 0x5EDC. */ if (setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL) { char input[] = "B\250\271\201\060\211\070er"; /* "Büßer" */ mbstate_t state; wchar_t wc; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (&wc, input + 3, 6, &state) != 4 && mbtowc (&wc, input + 3, 6) == 4) return 2; } return 0; } _ACEOF if ac_fn_c_try_run "$LINENO" then : gl_cv_func_mbrtowc_sanitycheck=yes else $as_nop gl_cv_func_mbrtowc_sanitycheck=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mbrtowc_sanitycheck" >&5 printf "%s\n" "$gl_cv_func_mbrtowc_sanitycheck" >&6; } REPLACE_MBSTATE_T=0 case "$gl_cv_func_mbrtowc_incomplete_state" in *yes) ;; *) REPLACE_MBSTATE_T=1 ;; esac case "$gl_cv_func_mbrtowc_sanitycheck" in *yes) ;; *) REPLACE_MBSTATE_T=1 ;; esac else REPLACE_MBSTATE_T=1 fi if test $ac_cv_func_mbsrtowcs = no; then HAVE_MBSRTOWCS=0 ac_fn_check_decl "$LINENO" "mbsrtowcs" "ac_cv_have_decl_mbsrtowcs" " #include " "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_mbsrtowcs" = xyes then : ac_have_decl=1 else $as_nop ac_have_decl=0 fi printf "%s\n" "#define HAVE_DECL_MBSRTOWCS $ac_have_decl" >>confdefs.h if test $ac_cv_have_decl_mbsrtowcs = yes; then REPLACE_MBSRTOWCS=1 fi else if test $REPLACE_MBSTATE_T = 1; then REPLACE_MBSRTOWCS=1 else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether mbsrtowcs works" >&5 printf %s "checking whether mbsrtowcs works... " >&6; } if test ${gl_cv_func_mbsrtowcs_works+y} then : printf %s "(cached) " >&6 else $as_nop case "$host_os" in # Guess no on HP-UX, Solaris, mingw. hpux* | solaris* | mingw*) gl_cv_func_mbsrtowcs_works="guessing no" ;; # Guess yes otherwise. *) gl_cv_func_mbsrtowcs_works="guessing yes" ;; esac if test $LOCALE_FR != none || test $LOCALE_FR_UTF8 != none || test $LOCALE_JA != none || test $LOCALE_ZH_CN != none; then if test "$cross_compiling" = yes then : : else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { int result = 0; /* Test whether the function supports a NULL destination argument. This fails on native Windows. */ if (setlocale (LC_ALL, "$LOCALE_FR") != NULL) { const char input[] = "\337er"; const char *src = input; mbstate_t state; memset (&state, '\0', sizeof (mbstate_t)); if (mbsrtowcs (NULL, &src, 1, &state) != 3 || src != input) result |= 1; } /* Test whether the function works when started with a conversion state in non-initial state. This fails on HP-UX 11.11 and Solaris 10. */ if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL) { const char input[] = "B\303\274\303\237er"; mbstate_t state; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (NULL, input + 1, 1, &state) == (size_t)(-2)) if (!mbsinit (&state)) { const char *src = input + 2; if (mbsrtowcs (NULL, &src, 10, &state) != 4) result |= 2; } } if (setlocale (LC_ALL, "$LOCALE_JA") != NULL) { const char input[] = "<\306\374\313\334\270\354>"; mbstate_t state; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (NULL, input + 3, 1, &state) == (size_t)(-2)) if (!mbsinit (&state)) { const char *src = input + 4; if (mbsrtowcs (NULL, &src, 10, &state) != 3) result |= 4; } } if (setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL) { const char input[] = "B\250\271\201\060\211\070er"; mbstate_t state; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (NULL, input + 1, 1, &state) == (size_t)(-2)) if (!mbsinit (&state)) { const char *src = input + 2; if (mbsrtowcs (NULL, &src, 10, &state) != 4) result |= 8; } } return result; } _ACEOF if ac_fn_c_try_run "$LINENO" then : gl_cv_func_mbsrtowcs_works=yes else $as_nop gl_cv_func_mbsrtowcs_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mbsrtowcs_works" >&5 printf "%s\n" "$gl_cv_func_mbsrtowcs_works" >&6; } case "$gl_cv_func_mbsrtowcs_works" in *yes) ;; *) REPLACE_MBSRTOWCS=1 ;; esac fi fi if test $HAVE_MBSRTOWCS = 0 || test $REPLACE_MBSRTOWCS = 1; then GL_COND_OBJ_MBSRTOWCS_TRUE= GL_COND_OBJ_MBSRTOWCS_FALSE='#' else GL_COND_OBJ_MBSRTOWCS_TRUE='#' GL_COND_OBJ_MBSRTOWCS_FALSE= fi : if test -z "${GL_COND_OBJ_MBSRTOWCS_TRUE}" && test -z "${GL_COND_OBJ_MBSRTOWCS_FALSE}"; then GL_COND_OBJ_MBSRTOWCS_TRUE='#' GL_COND_OBJ_MBSRTOWCS_FALSE='#' fi if test -z "$GL_COND_OBJ_MBSRTOWCS_TRUE"; then : gl_LIBOBJS="$gl_LIBOBJS mbsrtowcs-state.$ac_objext" : fi GL_GNULIB_MBSRTOWCS=1 printf "%s\n" "#define GNULIB_TEST_MBSRTOWCS 1" >>confdefs.h { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether mbswidth is declared in " >&5 printf %s "checking whether mbswidth is declared in ... " >&6; } if test ${ac_cv_have_decl_mbswidth+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { char *p = (char *) mbswidth; return !p; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_have_decl_mbswidth=yes else $as_nop ac_cv_have_decl_mbswidth=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_decl_mbswidth" >&5 printf "%s\n" "$ac_cv_have_decl_mbswidth" >&6; } if test $ac_cv_have_decl_mbswidth = yes; then ac_val=1 else ac_val=0 fi printf "%s\n" "#define HAVE_DECL_MBSWIDTH_IN_WCHAR_H $ac_val" >>confdefs.h { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for mbstate_t" >&5 printf %s "checking for mbstate_t... " >&6; } if test ${ac_cv_type_mbstate_t+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default #include int main (void) { mbstate_t x; return sizeof x; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_type_mbstate_t=yes else $as_nop ac_cv_type_mbstate_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_mbstate_t" >&5 printf "%s\n" "$ac_cv_type_mbstate_t" >&6; } if test $ac_cv_type_mbstate_t = yes; then printf "%s\n" "#define HAVE_MBSTATE_T 1" >>confdefs.h else printf "%s\n" "#define mbstate_t int" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "mbtowc" "ac_cv_func_mbtowc" if test "x$ac_cv_func_mbtowc" = xyes then : printf "%s\n" "#define HAVE_MBTOWC 1" >>confdefs.h fi if test $ac_cv_func_mbtowc = no; then HAVE_MBTOWC=0 else if false; then REPLACE_MBTOWC=1 fi fi if test $HAVE_MBTOWC = 0 || test $REPLACE_MBTOWC = 1; then GL_COND_OBJ_MBTOWC_TRUE= GL_COND_OBJ_MBTOWC_FALSE='#' else GL_COND_OBJ_MBTOWC_TRUE='#' GL_COND_OBJ_MBTOWC_FALSE= fi : if test -z "${GL_COND_OBJ_MBTOWC_TRUE}" && test -z "${GL_COND_OBJ_MBTOWC_FALSE}"; then GL_COND_OBJ_MBTOWC_TRUE='#' GL_COND_OBJ_MBTOWC_FALSE='#' fi if test -z "$GL_COND_OBJ_MBTOWC_TRUE"; then : : fi GL_GNULIB_MBTOWC=1 printf "%s\n" "#define GNULIB_TEST_MBTOWC 1" >>confdefs.h if test $REPLACE_MEMCHR = 1; then GL_COND_OBJ_MEMCHR_TRUE= GL_COND_OBJ_MEMCHR_FALSE='#' else GL_COND_OBJ_MEMCHR_TRUE='#' GL_COND_OBJ_MEMCHR_FALSE= fi : if test -z "${GL_COND_OBJ_MEMCHR_TRUE}" && test -z "${GL_COND_OBJ_MEMCHR_FALSE}"; then GL_COND_OBJ_MEMCHR_TRUE='#' GL_COND_OBJ_MEMCHR_FALSE='#' fi if test -z "$GL_COND_OBJ_MEMCHR_TRUE"; then : ac_fn_c_check_header_compile "$LINENO" "bp-sym.h" "ac_cv_header_bp_sym_h" "$ac_includes_default" if test "x$ac_cv_header_bp_sym_h" = xyes then : printf "%s\n" "#define HAVE_BP_SYM_H 1" >>confdefs.h fi fi GL_GNULIB_MEMCHR=1 printf "%s\n" "#define GNULIB_TEST_MEMCHR 1" >>confdefs.h ac_fn_c_check_func "$LINENO" "mempcpy" "ac_cv_func_mempcpy" if test "x$ac_cv_func_mempcpy" = xyes then : printf "%s\n" "#define HAVE_MEMPCPY 1" >>confdefs.h fi if test $ac_cv_func_mempcpy = no; then HAVE_MEMPCPY=0 fi if test $HAVE_MEMPCPY = 0; then GL_COND_OBJ_MEMPCPY_TRUE= GL_COND_OBJ_MEMPCPY_FALSE='#' else GL_COND_OBJ_MEMPCPY_TRUE='#' GL_COND_OBJ_MEMPCPY_FALSE= fi : if test -z "${GL_COND_OBJ_MEMPCPY_TRUE}" && test -z "${GL_COND_OBJ_MEMPCPY_FALSE}"; then GL_COND_OBJ_MEMPCPY_TRUE='#' GL_COND_OBJ_MEMPCPY_FALSE='#' fi if test -z "$GL_COND_OBJ_MEMPCPY_TRUE"; then : : fi GL_GNULIB_MEMPCPY=1 printf "%s\n" "#define GNULIB_TEST_MEMPCPY 1" >>confdefs.h if test $ac_cv_have_decl_memrchr = no; then HAVE_DECL_MEMRCHR=0 fi ac_fn_c_check_func "$LINENO" "memrchr" "ac_cv_func_memrchr" if test "x$ac_cv_func_memrchr" = xyes then : printf "%s\n" "#define HAVE_MEMRCHR 1" >>confdefs.h fi if test $ac_cv_func_memrchr = no; then GL_COND_OBJ_MEMRCHR_TRUE= GL_COND_OBJ_MEMRCHR_FALSE='#' else GL_COND_OBJ_MEMRCHR_TRUE='#' GL_COND_OBJ_MEMRCHR_FALSE= fi : if test -z "${GL_COND_OBJ_MEMRCHR_TRUE}" && test -z "${GL_COND_OBJ_MEMRCHR_FALSE}"; then GL_COND_OBJ_MEMRCHR_TRUE='#' GL_COND_OBJ_MEMRCHR_FALSE='#' fi if test -z "$GL_COND_OBJ_MEMRCHR_TRUE"; then : : fi GL_GNULIB_MEMRCHR=1 printf "%s\n" "#define GNULIB_TEST_MEMRCHR 1" >>confdefs.h if test $HAVE_MSVC_INVALID_PARAMETER_HANDLER = 1; then GL_COND_OBJ_MSVC_INVAL_TRUE= GL_COND_OBJ_MSVC_INVAL_FALSE='#' else GL_COND_OBJ_MSVC_INVAL_TRUE='#' GL_COND_OBJ_MSVC_INVAL_FALSE= fi : if test -z "${GL_COND_OBJ_MSVC_INVAL_TRUE}" && test -z "${GL_COND_OBJ_MSVC_INVAL_FALSE}"; then GL_COND_OBJ_MSVC_INVAL_TRUE='#' GL_COND_OBJ_MSVC_INVAL_FALSE='#' fi if test $HAVE_MSVC_INVALID_PARAMETER_HANDLER = 1; then GL_COND_OBJ_MSVC_NOTHROW_TRUE= GL_COND_OBJ_MSVC_NOTHROW_FALSE='#' else GL_COND_OBJ_MSVC_NOTHROW_TRUE='#' GL_COND_OBJ_MSVC_NOTHROW_FALSE= fi : if test -z "${GL_COND_OBJ_MSVC_NOTHROW_TRUE}" && test -z "${GL_COND_OBJ_MSVC_NOTHROW_FALSE}"; then GL_COND_OBJ_MSVC_NOTHROW_TRUE='#' GL_COND_OBJ_MSVC_NOTHROW_FALSE='#' fi printf "%s\n" "#define GNULIB_MSVC_NOTHROW 1" >>confdefs.h if test $ac_cv_func_nl_langinfo = yes; then # On Irix 6.5, YESEXPR is defined, but nl_langinfo(YESEXPR) is broken. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether YESEXPR works" >&5 printf %s "checking whether YESEXPR works... " >&6; } if test ${gl_cv_func_nl_langinfo_yesexpr_works+y} then : printf %s "(cached) " >&6 else $as_nop if test "$cross_compiling" = yes then : case "$host_os" in # Guess no on irix systems. irix*) gl_cv_func_nl_langinfo_yesexpr_works="guessing no";; # Guess yes elsewhere. *) gl_cv_func_nl_langinfo_yesexpr_works="guessing yes";; esac else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { return !*nl_langinfo(YESEXPR); ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO" then : gl_cv_func_nl_langinfo_yesexpr_works=yes else $as_nop gl_cv_func_nl_langinfo_yesexpr_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_nl_langinfo_yesexpr_works" >&5 printf "%s\n" "$gl_cv_func_nl_langinfo_yesexpr_works" >&6; } case $gl_cv_func_nl_langinfo_yesexpr_works in *yes) FUNC_NL_LANGINFO_YESEXPR_WORKS=1 ;; *) FUNC_NL_LANGINFO_YESEXPR_WORKS=0 ;; esac printf "%s\n" "#define FUNC_NL_LANGINFO_YESEXPR_WORKS $FUNC_NL_LANGINFO_YESEXPR_WORKS" >>confdefs.h # On Solaris 10 and Solaris 11.3, nl_langinfo is not multithread-safe. case "$host_os" in solaris*) NL_LANGINFO_MTSAFE=0 ;; *) NL_LANGINFO_MTSAFE=1 ;; esac printf "%s\n" "#define NL_LANGINFO_MTSAFE $NL_LANGINFO_MTSAFE" >>confdefs.h if test $HAVE_LANGINFO_CODESET = 1 \ && test $HAVE_LANGINFO_T_FMT_AMPM = 1 \ && test $HAVE_LANGINFO_ALTMON = 1 \ && test $HAVE_LANGINFO_ERA = 1 \ && test $FUNC_NL_LANGINFO_YESEXPR_WORKS = 1 \ && test $NL_LANGINFO_MTSAFE = 1; then : else REPLACE_NL_LANGINFO=1 printf "%s\n" "#define REPLACE_NL_LANGINFO 1" >>confdefs.h fi else HAVE_NL_LANGINFO=0 fi if test $HAVE_NL_LANGINFO = 0 || test $HAVE_LANGINFO_CODESET = 0; then LIB_NL_LANGINFO="$LIB_SETLOCALE_NULL" else LIB_NL_LANGINFO= fi if test $HAVE_NL_LANGINFO = 0 || test $REPLACE_NL_LANGINFO = 1; then GL_COND_OBJ_NL_LANGINFO_TRUE= GL_COND_OBJ_NL_LANGINFO_FALSE='#' else GL_COND_OBJ_NL_LANGINFO_TRUE='#' GL_COND_OBJ_NL_LANGINFO_FALSE= fi : if test -z "${GL_COND_OBJ_NL_LANGINFO_TRUE}" && test -z "${GL_COND_OBJ_NL_LANGINFO_FALSE}"; then GL_COND_OBJ_NL_LANGINFO_TRUE='#' GL_COND_OBJ_NL_LANGINFO_FALSE='#' fi if test $REPLACE_NL_LANGINFO = 1 && test $NL_LANGINFO_MTSAFE = 0; then GL_COND_OBJ_NL_LANGINFO_LOCK_TRUE= GL_COND_OBJ_NL_LANGINFO_LOCK_FALSE='#' else GL_COND_OBJ_NL_LANGINFO_LOCK_TRUE='#' GL_COND_OBJ_NL_LANGINFO_LOCK_FALSE= fi : if test -z "${GL_COND_OBJ_NL_LANGINFO_LOCK_TRUE}" && test -z "${GL_COND_OBJ_NL_LANGINFO_LOCK_FALSE}"; then GL_COND_OBJ_NL_LANGINFO_LOCK_TRUE='#' GL_COND_OBJ_NL_LANGINFO_LOCK_FALSE='#' fi if test $REPLACE_NL_LANGINFO = 1 && test $NL_LANGINFO_MTSAFE = 0; then CFLAG_VISIBILITY= HAVE_VISIBILITY=0 if test -n "$GCC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the -Werror option is usable" >&5 printf %s "checking whether the -Werror option is usable... " >&6; } if test ${gl_cv_cc_vis_werror+y} then : printf %s "(cached) " >&6 else $as_nop gl_save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -Werror" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : gl_cv_cc_vis_werror=yes else $as_nop gl_cv_cc_vis_werror=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext CFLAGS="$gl_save_CFLAGS" fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_vis_werror" >&5 printf "%s\n" "$gl_cv_cc_vis_werror" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for simple visibility declarations" >&5 printf %s "checking for simple visibility declarations... " >&6; } if test ${gl_cv_cc_visibility+y} then : printf %s "(cached) " >&6 else $as_nop gl_save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -fvisibility=hidden" if test $gl_cv_cc_vis_werror = yes; then CFLAGS="$CFLAGS -Werror" fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ extern __attribute__((__visibility__("hidden"))) int hiddenvar; extern __attribute__((__visibility__("default"))) int exportedvar; extern __attribute__((__visibility__("hidden"))) int hiddenfunc (void); extern __attribute__((__visibility__("default"))) int exportedfunc (void); void dummyfunc (void); int hiddenvar; int exportedvar; int hiddenfunc (void) { return 51; } int exportedfunc (void) { return 1225736919; } void dummyfunc (void) {} int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : gl_cv_cc_visibility=yes else $as_nop gl_cv_cc_visibility=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext CFLAGS="$gl_save_CFLAGS" fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_visibility" >&5 printf "%s\n" "$gl_cv_cc_visibility" >&6; } if test $gl_cv_cc_visibility = yes; then CFLAG_VISIBILITY="-fvisibility=hidden" HAVE_VISIBILITY=1 fi fi printf "%s\n" "#define HAVE_VISIBILITY $HAVE_VISIBILITY" >>confdefs.h fi GL_GNULIB_NL_LANGINFO=1 printf "%s\n" "#define GNULIB_TEST_NL_LANGINFO 1" >>confdefs.h case "$host_os" in mingw* | pw*) REPLACE_OPEN=1 ;; *) if test "$gl_cv_macro_O_CLOEXEC" != yes; then REPLACE_OPEN=1 fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether open recognizes a trailing slash" >&5 printf %s "checking whether open recognizes a trailing slash... " >&6; } if test ${gl_cv_func_open_slash+y} then : printf %s "(cached) " >&6 else $as_nop # Assume that if we have lstat, we can also check symlinks. if test $ac_cv_func_lstat = yes; then touch conftest.tmp ln -s conftest.tmp conftest.lnk fi if test "$cross_compiling" = yes then : case "$host_os" in freebsd* | aix* | hpux* | solaris2.[0-9] | solaris2.[0-9].*) gl_cv_func_open_slash="guessing no" ;; *) gl_cv_func_open_slash="guessing yes" ;; esac else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #if HAVE_UNISTD_H # include #endif $gl_mda_defines int main () { int result = 0; #if HAVE_LSTAT if (open ("conftest.lnk/", O_RDONLY) != -1) result |= 1; #endif if (open ("conftest.sl/", O_CREAT, 0600) >= 0) result |= 2; return result; } _ACEOF if ac_fn_c_try_run "$LINENO" then : gl_cv_func_open_slash=yes else $as_nop gl_cv_func_open_slash=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f conftest.sl conftest.tmp conftest.lnk fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_open_slash" >&5 printf "%s\n" "$gl_cv_func_open_slash" >&6; } case "$gl_cv_func_open_slash" in *no) printf "%s\n" "#define OPEN_TRAILING_SLASH_BUG 1" >>confdefs.h ;; esac case "$gl_cv_func_open_slash" in *no) REPLACE_OPEN=1 ;; esac ;; esac if test $REPLACE_OPEN = 0; then if test $ac_cv_func_fchdir = no; then HAVE_FCHDIR=0 fi if test $HAVE_FCHDIR = 0; then REPLACE_OPEN=1 fi fi if test $REPLACE_OPEN = 1; then GL_COND_OBJ_OPEN_TRUE= GL_COND_OBJ_OPEN_FALSE='#' else GL_COND_OBJ_OPEN_TRUE='#' GL_COND_OBJ_OPEN_FALSE= fi : if test -z "${GL_COND_OBJ_OPEN_TRUE}" && test -z "${GL_COND_OBJ_OPEN_FALSE}"; then GL_COND_OBJ_OPEN_TRUE='#' GL_COND_OBJ_OPEN_FALSE='#' fi if test -z "$GL_COND_OBJ_OPEN_TRUE"; then : : fi GL_GNULIB_OPEN=1 printf "%s\n" "#define GNULIB_TEST_OPEN 1" >>confdefs.h case $ac_cv_func_openat+$gl_cv_func_lstat_dereferences_slashed_symlink+$gl_cv_macro_O_CLOEXEC in yes+*yes+yes) ;; yes+*) # Solaris 10 lacks O_CLOEXEC. # Solaris 9 has *at functions, but uniformly mishandles trailing # slash in all of them. REPLACE_OPENAT=1 ;; *) HAVE_OPENAT=0 ;; esac if test $HAVE_OPENAT = 0 || test $REPLACE_OPENAT = 1; then GL_COND_OBJ_OPENAT_TRUE= GL_COND_OBJ_OPENAT_FALSE='#' else GL_COND_OBJ_OPENAT_TRUE='#' GL_COND_OBJ_OPENAT_FALSE= fi : if test -z "${GL_COND_OBJ_OPENAT_TRUE}" && test -z "${GL_COND_OBJ_OPENAT_FALSE}"; then GL_COND_OBJ_OPENAT_TRUE='#' GL_COND_OBJ_OPENAT_FALSE='#' fi if test -z "$GL_COND_OBJ_OPENAT_TRUE"; then : : fi printf "%s\n" "#define GNULIB_OPENAT 1" >>confdefs.h GL_GNULIB_OPENAT=1 printf "%s\n" "#define GNULIB_TEST_OPENAT 1" >>confdefs.h if test $ac_cv_func_pipe != yes; then HAVE_PIPE=0 fi if test $HAVE_PIPE = 0; then GL_COND_OBJ_PIPE_TRUE= GL_COND_OBJ_PIPE_FALSE='#' else GL_COND_OBJ_PIPE_TRUE='#' GL_COND_OBJ_PIPE_FALSE= fi : if test -z "${GL_COND_OBJ_PIPE_TRUE}" && test -z "${GL_COND_OBJ_PIPE_FALSE}"; then GL_COND_OBJ_PIPE_TRUE='#' GL_COND_OBJ_PIPE_FALSE='#' fi GL_GNULIB_PIPE=1 printf "%s\n" "#define GNULIB_TEST_PIPE 1" >>confdefs.h ac_fn_check_decl "$LINENO" "program_invocation_name" "ac_cv_have_decl_program_invocation_name" "#include " "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_program_invocation_name" = xyes then : ac_have_decl=1 else $as_nop ac_have_decl=0 fi printf "%s\n" "#define HAVE_DECL_PROGRAM_INVOCATION_NAME $ac_have_decl" >>confdefs.h ac_fn_check_decl "$LINENO" "program_invocation_short_name" "ac_cv_have_decl_program_invocation_short_name" "#include " "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_program_invocation_short_name" = xyes then : ac_have_decl=1 else $as_nop ac_have_decl=0 fi printf "%s\n" "#define HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME $ac_have_decl" >>confdefs.h ac_fn_c_check_func "$LINENO" "rawmemchr" "ac_cv_func_rawmemchr" if test "x$ac_cv_func_rawmemchr" = xyes then : printf "%s\n" "#define HAVE_RAWMEMCHR 1" >>confdefs.h fi if test $ac_cv_func_rawmemchr = no; then HAVE_RAWMEMCHR=0 fi if test $HAVE_RAWMEMCHR = 0; then GL_COND_OBJ_RAWMEMCHR_TRUE= GL_COND_OBJ_RAWMEMCHR_FALSE='#' else GL_COND_OBJ_RAWMEMCHR_TRUE='#' GL_COND_OBJ_RAWMEMCHR_FALSE= fi : if test -z "${GL_COND_OBJ_RAWMEMCHR_TRUE}" && test -z "${GL_COND_OBJ_RAWMEMCHR_FALSE}"; then GL_COND_OBJ_RAWMEMCHR_TRUE='#' GL_COND_OBJ_RAWMEMCHR_FALSE='#' fi if test -z "$GL_COND_OBJ_RAWMEMCHR_TRUE"; then : : fi GL_GNULIB_RAWMEMCHR=1 printf "%s\n" "#define GNULIB_TEST_RAWMEMCHR 1" >>confdefs.h if test $REPLACE_REALLOC_FOR_REALLOC_GNU = 0; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether realloc (0, 0) returns nonnull" >&5 printf %s "checking whether realloc (0, 0) returns nonnull... " >&6; } if test ${ac_cv_func_realloc_0_nonnull+y} then : printf %s "(cached) " >&6 else $as_nop if test "$cross_compiling" = yes then : case "$host_os" in # Guess yes on platforms where we know the result. *-gnu* | freebsd* | netbsd* | openbsd* | bitrig* \ | gnu* | *-musl* | midnightbsd* \ | hpux* | solaris* | cygwin* | mingw* | msys* ) ac_cv_func_realloc_0_nonnull="guessing yes" ;; # If we don't know, obey --enable-cross-guesses. *) ac_cv_func_realloc_0_nonnull="$gl_cross_guess_normal" ;; esac else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { void *p = realloc (0, 0); int result = !p; free (p); return result; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO" then : ac_cv_func_realloc_0_nonnull=yes else $as_nop ac_cv_func_realloc_0_nonnull=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_realloc_0_nonnull" >&5 printf "%s\n" "$ac_cv_func_realloc_0_nonnull" >&6; } case $ac_cv_func_realloc_0_nonnull in #( *yes) : ;; #( *) : REPLACE_REALLOC_FOR_REALLOC_GNU=1 ;; esac fi if test $REPLACE_REALLOC_FOR_REALLOC_GNU = 1; then gl_LIBOBJS="$gl_LIBOBJS realloc.$ac_objext" fi GL_GNULIB_REALLOC_GNU=1 printf "%s\n" "#define GNULIB_TEST_REALLOC_GNU 1" >>confdefs.h if test $REPLACE_MALLOC_FOR_MALLOC_POSIX = 1; then REPLACE_REALLOC_FOR_REALLOC_POSIX=1 fi if test $REPLACE_REALLOC_FOR_REALLOC_POSIX = 1; then gl_LIBOBJS="$gl_LIBOBJS realloc.$ac_objext" fi GL_GNULIB_REALLOC_POSIX=1 printf "%s\n" "#define GNULIB_TEST_REALLOC_POSIX 1" >>confdefs.h ac_fn_c_check_func "$LINENO" "reallocarray" "ac_cv_func_reallocarray" if test "x$ac_cv_func_reallocarray" = xyes then : printf "%s\n" "#define HAVE_REALLOCARRAY 1" >>confdefs.h fi if test "$ac_cv_func_reallocarray" = no; then HAVE_REALLOCARRAY=0 elif test "$gl_cv_malloc_ptrdiff" = no; then REPLACE_REALLOCARRAY=1 fi if test $HAVE_REALLOCARRAY = 0 || test $REPLACE_REALLOCARRAY = 1; then GL_COND_OBJ_REALLOCARRAY_TRUE= GL_COND_OBJ_REALLOCARRAY_FALSE='#' else GL_COND_OBJ_REALLOCARRAY_TRUE='#' GL_COND_OBJ_REALLOCARRAY_FALSE= fi : if test -z "${GL_COND_OBJ_REALLOCARRAY_TRUE}" && test -z "${GL_COND_OBJ_REALLOCARRAY_FALSE}"; then GL_COND_OBJ_REALLOCARRAY_TRUE='#' GL_COND_OBJ_REALLOCARRAY_FALSE='#' fi if test -z "$GL_COND_OBJ_REALLOCARRAY_TRUE"; then : : fi printf "%s\n" "#define GNULIB_REALLOCARRAY 1" >>confdefs.h GL_GNULIB_REALLOCARRAY=1 printf "%s\n" "#define GNULIB_TEST_REALLOCARRAY 1" >>confdefs.h # Check whether --with-included-regex was given. if test ${with_included_regex+y} then : withval=$with_included_regex; fi case $with_included_regex in #( yes|no) ac_use_included_regex=$with_included_regex ;; '') # If the system regex support is good enough that it passes the # following run test, then default to *not* using the included regex.c. # If cross compiling, assume the test would fail and use the included # regex.c. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working re_compile_pattern" >&5 printf %s "checking for working re_compile_pattern... " >&6; } if test ${gl_cv_func_re_compile_pattern_working+y} then : printf %s "(cached) " >&6 else $as_nop if test "$cross_compiling" = yes then : case "$host_os" in # Guess no on native Windows. mingw*) gl_cv_func_re_compile_pattern_working="guessing no" ;; # Otherwise obey --enable-cross-guesses. *) gl_cv_func_re_compile_pattern_working="$gl_cross_guess_normal" ;; esac else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include #if defined M_CHECK_ACTION || HAVE_DECL_ALARM # include # include #endif #if HAVE_MALLOC_H # include #endif #ifdef M_CHECK_ACTION /* Exit with distinguishable exit code. */ static void sigabrt_no_core (int sig) { raise (SIGTERM); } #endif int main (void) { int result = 0; static struct re_pattern_buffer regex; unsigned char folded_chars[UCHAR_MAX + 1]; int i; const char *s; struct re_registers regs; /* Some builds of glibc go into an infinite loop on this test. Use alarm to force death, and mallopt to avoid malloc recursion in diagnosing the corrupted heap. */ #if HAVE_DECL_ALARM signal (SIGALRM, SIG_DFL); alarm (2); #endif #ifdef M_CHECK_ACTION signal (SIGABRT, sigabrt_no_core); mallopt (M_CHECK_ACTION, 2); #endif if (setlocale (LC_ALL, "en_US.UTF-8")) { { /* https://sourceware.org/ml/libc-hacker/2006-09/msg00008.html This test needs valgrind to catch the bug on Debian GNU/Linux 3.1 x86, but it might catch the bug better on other platforms and it shouldn't hurt to try the test here. */ static char const pat[] = "insert into"; static char const data[] = "\xFF\0\x12\xA2\xAA\xC4\xB1,K\x12\xC4\xB1*\xACK"; re_set_syntax (RE_SYNTAX_GREP | RE_HAT_LISTS_NOT_NEWLINE | RE_ICASE); memset (®ex, 0, sizeof regex); s = re_compile_pattern (pat, sizeof pat - 1, ®ex); if (s) result |= 1; else { if (re_search (®ex, data, sizeof data - 1, 0, sizeof data - 1, ®s) != -1) result |= 1; regfree (®ex); } } { /* This test is from glibc bug 15078. The test case is from Andreas Schwab in . */ static char const pat[] = "[^x]x"; static char const data[] = /* */ "\xe1\x80\x80" "\xe1\x80\xbb" "\xe1\x80\xbd" "\xe1\x80\x94" "\xe1\x80\xba" "\xe1\x80\xaf" "\xe1\x80\x95" "\xe1\x80\xba" "x"; re_set_syntax (0); memset (®ex, 0, sizeof regex); s = re_compile_pattern (pat, sizeof pat - 1, ®ex); if (s) result |= 1; else { i = re_search (®ex, data, sizeof data - 1, 0, sizeof data - 1, 0); if (i != 0 && i != 21) result |= 1; regfree (®ex); } } if (! setlocale (LC_ALL, "C")) return 1; } /* This test is from glibc bug 3957, reported by Andrew Mackey. */ re_set_syntax (RE_SYNTAX_EGREP | RE_HAT_LISTS_NOT_NEWLINE); memset (®ex, 0, sizeof regex); s = re_compile_pattern ("a[^x]b", 6, ®ex); if (s) result |= 2; else { /* This should fail, but succeeds for glibc-2.5. */ if (re_search (®ex, "a\nb", 3, 0, 3, ®s) != -1) result |= 2; regfree (®ex); } /* This regular expression is from Spencer ere test number 75 in grep-2.3. */ re_set_syntax (RE_SYNTAX_POSIX_EGREP); memset (®ex, 0, sizeof regex); for (i = 0; i <= UCHAR_MAX; i++) folded_chars[i] = i; regex.translate = folded_chars; s = re_compile_pattern ("a[[:]:]]b\n", 11, ®ex); /* This should fail with _Invalid character class name_ error. */ if (!s) { result |= 4; regfree (®ex); } /* Ensure that [b-a] is diagnosed as invalid, when using RE_NO_EMPTY_RANGES. */ re_set_syntax (RE_SYNTAX_POSIX_EGREP | RE_NO_EMPTY_RANGES); memset (®ex, 0, sizeof regex); s = re_compile_pattern ("a[b-a]", 6, ®ex); if (s == 0) { result |= 8; regfree (®ex); } /* This should succeed, but does not for glibc-2.1.3. */ memset (®ex, 0, sizeof regex); s = re_compile_pattern ("{1", 2, ®ex); if (s) result |= 8; else regfree (®ex); /* The following example is derived from a problem report against gawk from Jorge Stolfi . */ memset (®ex, 0, sizeof regex); s = re_compile_pattern ("[an\371]*n", 7, ®ex); if (s) result |= 8; else { /* This should match, but does not for glibc-2.2.1. */ if (re_match (®ex, "an", 2, 0, ®s) != 2) result |= 8; else { free (regs.start); free (regs.end); } regfree (®ex); } memset (®ex, 0, sizeof regex); s = re_compile_pattern ("x", 1, ®ex); if (s) result |= 8; else { /* glibc-2.2.93 does not work with a negative RANGE argument. */ if (re_search (®ex, "wxy", 3, 2, -2, ®s) != 1) result |= 8; else { free (regs.start); free (regs.end); } regfree (®ex); } /* The version of regex.c in older versions of gnulib ignored RE_ICASE. Detect that problem too. */ re_set_syntax (RE_SYNTAX_EMACS | RE_ICASE); memset (®ex, 0, sizeof regex); s = re_compile_pattern ("x", 1, ®ex); if (s) result |= 16; else { if (re_search (®ex, "WXY", 3, 0, 3, ®s) < 0) result |= 16; else { free (regs.start); free (regs.end); } regfree (®ex); } /* Catch a bug reported by Vin Shelton in https://lists.gnu.org/r/bug-coreutils/2007-06/msg00089.html */ re_set_syntax (RE_SYNTAX_POSIX_BASIC & ~RE_CONTEXT_INVALID_DUP & ~RE_NO_EMPTY_RANGES); memset (®ex, 0, sizeof regex); s = re_compile_pattern ("[[:alnum:]_-]\\\\+\$", 16, ®ex); if (s) result |= 32; else regfree (®ex); /* REG_STARTEND was added to glibc on 2004-01-15. Reject older versions. */ if (! REG_STARTEND) result |= 64; /* Matching with the compiled form of this regexp would provoke an assertion failure prior to glibc-2.28: regexec.c:1375: pop_fail_stack: Assertion 'num >= 0' failed With glibc-2.28, compilation fails and reports the invalid back reference. */ re_set_syntax (RE_SYNTAX_POSIX_EGREP); memset (®ex, 0, sizeof regex); s = re_compile_pattern ("0|()0|\\\\1|0", 10, ®ex); if (!s) { memset (®s, 0, sizeof regs); i = re_search (®ex, "x", 1, 0, 1, ®s); if (i != -1) result |= 64; if (0 <= i) { free (regs.start); free (regs.end); } regfree (®ex); } else { if (strcmp (s, "Invalid back reference")) result |= 64; } /* glibc bug 11053. */ re_set_syntax (RE_SYNTAX_POSIX_BASIC); memset (®ex, 0, sizeof regex); static char const pat_sub2[] = "\\\\(a*\\\\)*a*\\\\1"; s = re_compile_pattern (pat_sub2, sizeof pat_sub2 - 1, ®ex); if (s) result |= 64; else { memset (®s, 0, sizeof regs); static char const data[] = "a"; int datalen = sizeof data - 1; i = re_search (®ex, data, datalen, 0, datalen, ®s); if (i != 0) result |= 64; else if (regs.num_regs < 2) result |= 64; else if (! (regs.start[0] == 0 && regs.end[0] == 1)) result |= 64; else if (! (regs.start[1] == 0 && regs.end[1] == 0)) result |= 64; regfree (®ex); free (regs.start); free (regs.end); } #if 0 /* It would be nice to reject hosts whose regoff_t values are too narrow (including glibc on hosts with 64-bit ptrdiff_t and 32-bit int), but we should wait until glibc implements this feature. Otherwise, support for equivalence classes and multibyte collation symbols would always be broken except when compiling --without-included-regex. */ if (sizeof (regoff_t) < sizeof (ptrdiff_t) || sizeof (regoff_t) < sizeof (ssize_t)) result |= 64; #endif return result; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO" then : gl_cv_func_re_compile_pattern_working=yes else $as_nop gl_cv_func_re_compile_pattern_working=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_re_compile_pattern_working" >&5 printf "%s\n" "$gl_cv_func_re_compile_pattern_working" >&6; } case "$gl_cv_func_re_compile_pattern_working" in #( *yes) ac_use_included_regex=no;; #( *no) ac_use_included_regex=yes;; esac ;; *) as_fn_error $? "Invalid value for --with-included-regex: $with_included_regex" "$LINENO" 5 ;; esac if test $ac_use_included_regex = yes; then printf "%s\n" "#define _REGEX_INCLUDE_LIMITS_H 1" >>confdefs.h printf "%s\n" "#define _REGEX_LARGE_OFFSETS 1" >>confdefs.h printf "%s\n" "#define re_syntax_options rpl_re_syntax_options" >>confdefs.h printf "%s\n" "#define re_set_syntax rpl_re_set_syntax" >>confdefs.h printf "%s\n" "#define re_compile_pattern rpl_re_compile_pattern" >>confdefs.h printf "%s\n" "#define re_compile_fastmap rpl_re_compile_fastmap" >>confdefs.h printf "%s\n" "#define re_search rpl_re_search" >>confdefs.h printf "%s\n" "#define re_search_2 rpl_re_search_2" >>confdefs.h printf "%s\n" "#define re_match rpl_re_match" >>confdefs.h printf "%s\n" "#define re_match_2 rpl_re_match_2" >>confdefs.h printf "%s\n" "#define re_set_registers rpl_re_set_registers" >>confdefs.h printf "%s\n" "#define re_comp rpl_re_comp" >>confdefs.h printf "%s\n" "#define re_exec rpl_re_exec" >>confdefs.h printf "%s\n" "#define regcomp rpl_regcomp" >>confdefs.h printf "%s\n" "#define regexec rpl_regexec" >>confdefs.h printf "%s\n" "#define regerror rpl_regerror" >>confdefs.h printf "%s\n" "#define regfree rpl_regfree" >>confdefs.h fi if test $ac_use_included_regex = yes; then GL_COND_OBJ_REGEX_TRUE= GL_COND_OBJ_REGEX_FALSE='#' else GL_COND_OBJ_REGEX_TRUE='#' GL_COND_OBJ_REGEX_FALSE= fi : if test -z "${GL_COND_OBJ_REGEX_TRUE}" && test -z "${GL_COND_OBJ_REGEX_FALSE}"; then GL_COND_OBJ_REGEX_TRUE='#' GL_COND_OBJ_REGEX_FALSE='#' fi if test -z "$GL_COND_OBJ_REGEX_TRUE"; then : ac_fn_c_check_header_compile "$LINENO" "libintl.h" "ac_cv_header_libintl_h" "$ac_includes_default" if test "x$ac_cv_header_libintl_h" = xyes then : printf "%s\n" "#define HAVE_LIBINTL_H 1" >>confdefs.h fi ac_fn_check_decl "$LINENO" "isblank" "ac_cv_have_decl_isblank" "#include " "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_isblank" = xyes then : ac_have_decl=1 else $as_nop ac_have_decl=0 fi printf "%s\n" "#define HAVE_DECL_ISBLANK $ac_have_decl" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether setlocale (LC_ALL, NULL) is multithread-safe" >&5 printf %s "checking whether setlocale (LC_ALL, NULL) is multithread-safe... " >&6; } if test ${gl_cv_func_setlocale_null_all_mtsafe+y} then : printf %s "(cached) " >&6 else $as_nop case "$host_os" in # Guess no on musl libc, macOS, FreeBSD, NetBSD, OpenBSD, AIX, Haiku, Cygwin. *-musl* | darwin* | freebsd* | midnightbsd* | netbsd* | openbsd* | aix* | haiku* | cygwin*) gl_cv_func_setlocale_null_all_mtsafe=no ;; # Guess yes on glibc, HP-UX, IRIX, Solaris, native Windows. *-gnu* | gnu* | hpux* | irix* | solaris* | mingw*) gl_cv_func_setlocale_null_all_mtsafe=yes ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_setlocale_null_all_mtsafe="$gl_cross_guess_normal" ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_setlocale_null_all_mtsafe" >&5 printf "%s\n" "$gl_cv_func_setlocale_null_all_mtsafe" >&6; } case "$host_os" in mingw*) ;; *) if test $gl_pthread_api = no && test $ac_cv_header_threads_h = no; then gl_cv_func_setlocale_null_all_mtsafe="trivially yes" fi ;; esac case "$gl_cv_func_setlocale_null_all_mtsafe" in *yes) SETLOCALE_NULL_ALL_MTSAFE=1 ;; *) SETLOCALE_NULL_ALL_MTSAFE=0 ;; esac printf "%s\n" "#define SETLOCALE_NULL_ALL_MTSAFE $SETLOCALE_NULL_ALL_MTSAFE" >>confdefs.h { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether setlocale (category, NULL) is multithread-safe" >&5 printf %s "checking whether setlocale (category, NULL) is multithread-safe... " >&6; } if test ${gl_cv_func_setlocale_null_one_mtsafe+y} then : printf %s "(cached) " >&6 else $as_nop case "$host_os" in # Guess no on OpenBSD, AIX. openbsd* | aix*) gl_cv_func_setlocale_null_one_mtsafe=no ;; # Guess yes on glibc, musl libc, macOS, FreeBSD, NetBSD, HP-UX, IRIX, Solaris, Haiku, Cygwin, native Windows. *-gnu* | gnu* | *-musl* | darwin* | freebsd* | midnightbsd* | netbsd* | hpux* | irix* | solaris* | haiku* | cygwin* | mingw*) gl_cv_func_setlocale_null_one_mtsafe=yes ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_setlocale_null_one_mtsafe="$gl_cross_guess_normal" ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_setlocale_null_one_mtsafe" >&5 printf "%s\n" "$gl_cv_func_setlocale_null_one_mtsafe" >&6; } case "$host_os" in mingw*) ;; *) if test $gl_pthread_api = no && test $ac_cv_header_threads_h = no; then gl_cv_func_setlocale_null_one_mtsafe="trivially yes" fi ;; esac case "$gl_cv_func_setlocale_null_one_mtsafe" in *yes) SETLOCALE_NULL_ONE_MTSAFE=1 ;; *) SETLOCALE_NULL_ONE_MTSAFE=0 ;; esac printf "%s\n" "#define SETLOCALE_NULL_ONE_MTSAFE $SETLOCALE_NULL_ONE_MTSAFE" >>confdefs.h if test $SETLOCALE_NULL_ALL_MTSAFE = 0 || test $SETLOCALE_NULL_ONE_MTSAFE = 0; then case "$host_os" in mingw*) LIB_SETLOCALE_NULL= ;; *) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether imported symbols can be declared weak" >&5 printf %s "checking whether imported symbols can be declared weak... " >&6; } if test ${gl_cv_have_weak+y} then : printf %s "(cached) " >&6 else $as_nop case "$host_os" in cygwin*) gl_cv_have_weak="guessing no" ;; *) gl_cv_have_weak=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ extern void xyzzy (); #pragma weak xyzzy int main (void) { xyzzy(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : gl_cv_have_weak=maybe fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext if test $gl_cv_have_weak = maybe; then if test "$cross_compiling" = yes then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __ELF__ Extensible Linking Format #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "Extensible Linking Format" >/dev/null 2>&1 then : gl_cv_have_weak="guessing yes" else $as_nop gl_cv_have_weak="guessing no" fi rm -rf conftest* else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #pragma weak fputs int main () { return (fputs == NULL); } _ACEOF if ac_fn_c_try_run "$LINENO" then : gl_cv_have_weak=yes else $as_nop gl_cv_have_weak=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi ;; esac case " $LDFLAGS " in *" -static "*) gl_cv_have_weak=no ;; esac case "$gl_cv_have_weak" in *yes) case "$host_os" in freebsd* | dragonfly* | midnightbsd*) : > conftest1.c $CC $CPPFLAGS $CFLAGS $LDFLAGS -fPIC -shared -o libempty.so conftest1.c -lpthread >&5 2>&1 cat < conftest2.c #include #pragma weak pthread_mutexattr_gettype int main () { return (pthread_mutexattr_gettype != NULL); } EOF $CC $CPPFLAGS $CFLAGS $LDFLAGS -o conftest conftest2.c libempty.so >&5 2>&1 \ || gl_cv_have_weak=no rm -f conftest1.c libempty.so conftest2.c conftest ;; esac ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_have_weak" >&5 printf "%s\n" "$gl_cv_have_weak" >&6; } case "$gl_cv_have_weak" in *yes) printf "%s\n" "#define HAVE_WEAK_SYMBOLS 1" >>confdefs.h ;; esac case "$gl_cv_have_weak" in *yes) LIB_SETLOCALE_NULL= ;; *) LIB_SETLOCALE_NULL="$LIBPTHREAD" ;; esac ;; esac else LIB_SETLOCALE_NULL= fi if test $SETLOCALE_NULL_ALL_MTSAFE = 0 || test $SETLOCALE_NULL_ONE_MTSAFE = 0; then GL_COND_OBJ_SETLOCALE_LOCK_TRUE= GL_COND_OBJ_SETLOCALE_LOCK_FALSE='#' else GL_COND_OBJ_SETLOCALE_LOCK_TRUE='#' GL_COND_OBJ_SETLOCALE_LOCK_FALSE= fi : if test -z "${GL_COND_OBJ_SETLOCALE_LOCK_TRUE}" && test -z "${GL_COND_OBJ_SETLOCALE_LOCK_FALSE}"; then GL_COND_OBJ_SETLOCALE_LOCK_TRUE='#' GL_COND_OBJ_SETLOCALE_LOCK_FALSE='#' fi if test -z "$GL_COND_OBJ_SETLOCALE_LOCK_TRUE"; then : CFLAG_VISIBILITY= HAVE_VISIBILITY=0 if test -n "$GCC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the -Werror option is usable" >&5 printf %s "checking whether the -Werror option is usable... " >&6; } if test ${gl_cv_cc_vis_werror+y} then : printf %s "(cached) " >&6 else $as_nop gl_save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -Werror" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : gl_cv_cc_vis_werror=yes else $as_nop gl_cv_cc_vis_werror=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext CFLAGS="$gl_save_CFLAGS" fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_vis_werror" >&5 printf "%s\n" "$gl_cv_cc_vis_werror" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for simple visibility declarations" >&5 printf %s "checking for simple visibility declarations... " >&6; } if test ${gl_cv_cc_visibility+y} then : printf %s "(cached) " >&6 else $as_nop gl_save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -fvisibility=hidden" if test $gl_cv_cc_vis_werror = yes; then CFLAGS="$CFLAGS -Werror" fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ extern __attribute__((__visibility__("hidden"))) int hiddenvar; extern __attribute__((__visibility__("default"))) int exportedvar; extern __attribute__((__visibility__("hidden"))) int hiddenfunc (void); extern __attribute__((__visibility__("default"))) int exportedfunc (void); void dummyfunc (void); int hiddenvar; int exportedvar; int hiddenfunc (void) { return 51; } int exportedfunc (void) { return 1225736919; } void dummyfunc (void) {} int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : gl_cv_cc_visibility=yes else $as_nop gl_cv_cc_visibility=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext CFLAGS="$gl_save_CFLAGS" fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_visibility" >&5 printf "%s\n" "$gl_cv_cc_visibility" >&6; } if test $gl_cv_cc_visibility = yes; then CFLAG_VISIBILITY="-fvisibility=hidden" HAVE_VISIBILITY=1 fi fi printf "%s\n" "#define HAVE_VISIBILITY $HAVE_VISIBILITY" >>confdefs.h fi GL_GNULIB_SETLOCALE_NULL=1 printf "%s\n" "#define GNULIB_TEST_SETLOCALE_NULL 1" >>confdefs.h ac_fn_c_check_header_compile "$LINENO" "stdint.h" "ac_cv_header_stdint_h" "$ac_includes_default" if test "x$ac_cv_header_stdint_h" = xyes then : printf "%s\n" "#define HAVE_STDINT_H 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for SIZE_MAX" >&5 printf %s "checking for SIZE_MAX... " >&6; } if test ${gl_cv_size_max+y} then : printf %s "(cached) " >&6 else $as_nop gl_cv_size_max=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #if HAVE_STDINT_H #include #endif #ifdef SIZE_MAX Found it #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "Found it" >/dev/null 2>&1 then : gl_cv_size_max=yes fi rm -rf conftest* if test $gl_cv_size_max != yes; then if ac_fn_c_compute_int "$LINENO" "sizeof (size_t) * CHAR_BIT - 1" "size_t_bits_minus_1" "#include #include " then : else $as_nop size_t_bits_minus_1= fi if ac_fn_c_compute_int "$LINENO" "sizeof (size_t) <= sizeof (unsigned int)" "fits_in_uint" "#include " then : else $as_nop fits_in_uint= fi if test -n "$size_t_bits_minus_1" && test -n "$fits_in_uint"; then if test $fits_in_uint = 1; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include extern size_t foo; extern unsigned long foo; int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : fits_in_uint=0 fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi if test $fits_in_uint = 1; then gl_cv_size_max="(((1U << $size_t_bits_minus_1) - 1) * 2 + 1)" else gl_cv_size_max="(((1UL << $size_t_bits_minus_1) - 1) * 2 + 1)" fi else gl_cv_size_max='((size_t)~(size_t)0)' fi fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_size_max" >&5 printf "%s\n" "$gl_cv_size_max" >&6; } if test "$gl_cv_size_max" != yes; then printf "%s\n" "#define SIZE_MAX $gl_cv_size_max" >>confdefs.h fi ac_fn_check_decl "$LINENO" "sleep" "ac_cv_have_decl_sleep" "#include " "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_sleep" = xyes then : ac_have_decl=1 else $as_nop ac_have_decl=0 fi printf "%s\n" "#define HAVE_DECL_SLEEP $ac_have_decl" >>confdefs.h if test $ac_cv_have_decl_sleep != yes; then HAVE_SLEEP=0 else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working sleep" >&5 printf %s "checking for working sleep... " >&6; } if test ${gl_cv_func_sleep_works+y} then : printf %s "(cached) " >&6 else $as_nop if test "$cross_compiling" = yes then : case "$host_os" in # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_sleep_works="guessing yes" ;; # Guess yes on musl systems. *-musl*) gl_cv_func_sleep_works="guessing yes" ;; # Guess no on native Windows. mingw*) gl_cv_func_sleep_works="guessing no" ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_sleep_works="$gl_cross_guess_normal" ;; esac else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include static void handle_alarm (int sig) { if (sig != SIGALRM) _exit (2); } int main (void) { /* Failure to compile this test due to missing alarm is okay, since all such platforms (mingw) also lack sleep. */ unsigned int pentecost = 50 * 24 * 60 * 60; /* 50 days. */ unsigned int remaining; signal (SIGALRM, handle_alarm); alarm (1); remaining = sleep (pentecost); if (remaining > pentecost) return 3; if (remaining <= pentecost - 10) return 4; return 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO" then : gl_cv_func_sleep_works=yes else $as_nop gl_cv_func_sleep_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_sleep_works" >&5 printf "%s\n" "$gl_cv_func_sleep_works" >&6; } case "$gl_cv_func_sleep_works" in *yes) ;; *) REPLACE_SLEEP=1 ;; esac fi if test $HAVE_SLEEP = 0 || test $REPLACE_SLEEP = 1; then GL_COND_OBJ_SLEEP_TRUE= GL_COND_OBJ_SLEEP_FALSE='#' else GL_COND_OBJ_SLEEP_TRUE='#' GL_COND_OBJ_SLEEP_FALSE= fi : if test -z "${GL_COND_OBJ_SLEEP_TRUE}" && test -z "${GL_COND_OBJ_SLEEP_FALSE}"; then GL_COND_OBJ_SLEEP_TRUE='#' GL_COND_OBJ_SLEEP_FALSE='#' fi GL_GNULIB_SLEEP=1 printf "%s\n" "#define GNULIB_TEST_SLEEP 1" >>confdefs.h { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ssize_t" >&5 printf %s "checking for ssize_t... " >&6; } if test ${gt_cv_ssize_t+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { int x = sizeof (ssize_t *) + sizeof (ssize_t); return !x; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : gt_cv_ssize_t=yes else $as_nop gt_cv_ssize_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gt_cv_ssize_t" >&5 printf "%s\n" "$gt_cv_ssize_t" >&6; } if test $gt_cv_ssize_t = no; then printf "%s\n" "#define ssize_t int" >>confdefs.h fi case "$host_os" in mingw*) REPLACE_STAT=1 ;; *) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether stat handles trailing slashes on files" >&5 printf %s "checking whether stat handles trailing slashes on files... " >&6; } if test ${gl_cv_func_stat_file_slash+y} then : printf %s "(cached) " >&6 else $as_nop touch conftest.tmp # Assume that if we have lstat, we can also check symlinks. if test $ac_cv_func_lstat = yes; then ln -s conftest.tmp conftest.lnk fi if test "$cross_compiling" = yes then : case "$host_os" in # Guess yes on Linux systems. linux-* | linux) gl_cv_func_stat_file_slash="guessing yes" ;; # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_stat_file_slash="guessing yes" ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_stat_file_slash="$gl_cross_guess_normal" ;; esac else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { int result = 0; struct stat st; if (!stat ("conftest.tmp/", &st)) result |= 1; #if HAVE_LSTAT if (!stat ("conftest.lnk/", &st)) result |= 2; #endif return result; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO" then : gl_cv_func_stat_file_slash=yes else $as_nop gl_cv_func_stat_file_slash=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f conftest.tmp conftest.lnk fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_stat_file_slash" >&5 printf "%s\n" "$gl_cv_func_stat_file_slash" >&6; } case $gl_cv_func_stat_file_slash in *no) REPLACE_STAT=1 printf "%s\n" "#define REPLACE_FUNC_STAT_FILE 1" >>confdefs.h ;; esac case $host_os in solaris*) REPLACE_FSTAT=1 ;; esac ;; esac if test $REPLACE_STAT = 1; then GL_COND_OBJ_STAT_TRUE= GL_COND_OBJ_STAT_FALSE='#' else GL_COND_OBJ_STAT_TRUE='#' GL_COND_OBJ_STAT_FALSE= fi : if test -z "${GL_COND_OBJ_STAT_TRUE}" && test -z "${GL_COND_OBJ_STAT_FALSE}"; then GL_COND_OBJ_STAT_TRUE='#' GL_COND_OBJ_STAT_FALSE='#' fi if test -z "$GL_COND_OBJ_STAT_TRUE"; then : case "$host_os" in mingw*) gl_LIBOBJS="$gl_LIBOBJS stat-w32.$ac_objext" ;; esac : fi GL_GNULIB_STAT=1 printf "%s\n" "#define GNULIB_TEST_STAT 1" >>confdefs.h ac_fn_c_check_member "$LINENO" "struct stat" "st_atim.tv_nsec" "ac_cv_member_struct_stat_st_atim_tv_nsec" "#include #include " if test "x$ac_cv_member_struct_stat_st_atim_tv_nsec" = xyes then : printf "%s\n" "#define HAVE_STRUCT_STAT_ST_ATIM_TV_NSEC 1" >>confdefs.h { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether struct stat.st_atim is of type struct timespec" >&5 printf %s "checking whether struct stat.st_atim is of type struct timespec... " >&6; } if test ${ac_cv_typeof_struct_stat_st_atim_is_struct_timespec+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if HAVE_SYS_TIME_H # include #endif #include struct timespec ts; struct stat st; int main (void) { st.st_atim = ts; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_typeof_struct_stat_st_atim_is_struct_timespec=yes else $as_nop ac_cv_typeof_struct_stat_st_atim_is_struct_timespec=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_typeof_struct_stat_st_atim_is_struct_timespec" >&5 printf "%s\n" "$ac_cv_typeof_struct_stat_st_atim_is_struct_timespec" >&6; } if test $ac_cv_typeof_struct_stat_st_atim_is_struct_timespec = yes; then printf "%s\n" "#define TYPEOF_STRUCT_STAT_ST_ATIM_IS_STRUCT_TIMESPEC 1" >>confdefs.h fi else $as_nop ac_fn_c_check_member "$LINENO" "struct stat" "st_atimespec.tv_nsec" "ac_cv_member_struct_stat_st_atimespec_tv_nsec" "#include #include " if test "x$ac_cv_member_struct_stat_st_atimespec_tv_nsec" = xyes then : printf "%s\n" "#define HAVE_STRUCT_STAT_ST_ATIMESPEC_TV_NSEC 1" >>confdefs.h else $as_nop ac_fn_c_check_member "$LINENO" "struct stat" "st_atimensec" "ac_cv_member_struct_stat_st_atimensec" "#include #include " if test "x$ac_cv_member_struct_stat_st_atimensec" = xyes then : printf "%s\n" "#define HAVE_STRUCT_STAT_ST_ATIMENSEC 1" >>confdefs.h else $as_nop ac_fn_c_check_member "$LINENO" "struct stat" "st_atim.st__tim.tv_nsec" "ac_cv_member_struct_stat_st_atim_st__tim_tv_nsec" "#include #include " if test "x$ac_cv_member_struct_stat_st_atim_st__tim_tv_nsec" = xyes then : printf "%s\n" "#define HAVE_STRUCT_STAT_ST_ATIM_ST__TIM_TV_NSEC 1" >>confdefs.h fi fi fi fi ac_fn_c_check_member "$LINENO" "struct stat" "st_birthtimespec.tv_nsec" "ac_cv_member_struct_stat_st_birthtimespec_tv_nsec" "#include #include " if test "x$ac_cv_member_struct_stat_st_birthtimespec_tv_nsec" = xyes then : printf "%s\n" "#define HAVE_STRUCT_STAT_ST_BIRTHTIMESPEC_TV_NSEC 1" >>confdefs.h else $as_nop ac_fn_c_check_member "$LINENO" "struct stat" "st_birthtimensec" "ac_cv_member_struct_stat_st_birthtimensec" "#include #include " if test "x$ac_cv_member_struct_stat_st_birthtimensec" = xyes then : printf "%s\n" "#define HAVE_STRUCT_STAT_ST_BIRTHTIMENSEC 1" >>confdefs.h else $as_nop ac_fn_c_check_member "$LINENO" "struct stat" "st_birthtim.tv_nsec" "ac_cv_member_struct_stat_st_birthtim_tv_nsec" "#include #include " if test "x$ac_cv_member_struct_stat_st_birthtim_tv_nsec" = xyes then : printf "%s\n" "#define HAVE_STRUCT_STAT_ST_BIRTHTIM_TV_NSEC 1" >>confdefs.h fi fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working stdalign.h" >&5 printf %s "checking for working stdalign.h... " >&6; } if test ${gl_cv_header_working_stdalign_h+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include /* Test that alignof yields a result consistent with offsetof. This catches GCC bug 52023 . */ #ifdef __cplusplus template struct alignof_helper { char a; t b; }; # define ao(type) offsetof (alignof_helper, b) #else # define ao(type) offsetof (struct { char a; type b; }, b) #endif char test_double[ao (double) % _Alignof (double) == 0 ? 1 : -1]; char test_long[ao (long int) % _Alignof (long int) == 0 ? 1 : -1]; char test_alignof[alignof (double) == _Alignof (double) ? 1 : -1]; /* Test _Alignas only on platforms where gnulib can help. */ #if \ ((defined __cplusplus && 201103 <= __cplusplus) \ || (__TINYC__ && defined __attribute__) \ || (defined __APPLE__ && defined __MACH__ \ ? 4 < __GNUC__ + (1 <= __GNUC_MINOR__) \ : __GNUC__) \ || (__ia64 && (61200 <= __HP_cc || 61200 <= __HP_aCC)) \ || __ICC || 0x590 <= __SUNPRO_C || 0x0600 <= __xlC__ \ || 1300 <= _MSC_VER) struct alignas_test { char c; char alignas (8) alignas_8; }; char test_alignas[offsetof (struct alignas_test, alignas_8) == 8 ? 1 : -1]; #endif int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : gl_cv_header_working_stdalign_h=yes else $as_nop gl_cv_header_working_stdalign_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_working_stdalign_h" >&5 printf "%s\n" "$gl_cv_header_working_stdalign_h" >&6; } if test $gl_cv_header_working_stdalign_h = yes; then GL_GENERATE_STDALIGN_H=false else GL_GENERATE_STDALIGN_H=true fi case "$GL_GENERATE_STDALIGN_H" in false) STDALIGN_H='' ;; true) if test -z "$STDALIGN_H"; then STDALIGN_H="${gl_source_base_prefix}stdalign.h" fi ;; *) echo "*** GL_GENERATE_STDALIGN_H is not set correctly" 1>&2; exit 1 ;; esac if $GL_GENERATE_STDALIGN_H; then GL_GENERATE_STDALIGN_H_TRUE= GL_GENERATE_STDALIGN_H_FALSE='#' else GL_GENERATE_STDALIGN_H_TRUE='#' GL_GENERATE_STDALIGN_H_FALSE= fi : if test -z "${GL_GENERATE_STDALIGN_H_TRUE}" && test -z "${GL_GENERATE_STDALIGN_H_FALSE}"; then GL_GENERATE_STDALIGN_H_TRUE='#' GL_GENERATE_STDALIGN_H_FALSE='#' fi if test "$ac_cv_header_stdbool_h" = yes; then case "$host_os" in solaris*) if test -z "$GCC"; then GL_GENERATE_STDBOOL_H=true else GL_GENERATE_STDBOOL_H=false fi ;; *) GL_GENERATE_STDBOOL_H=false ;; esac else GL_GENERATE_STDBOOL_H=true fi if test "$ac_cv_type__Bool" = yes; then HAVE__BOOL=1 else HAVE__BOOL=0 fi case "$GL_GENERATE_STDBOOL_H" in false) STDBOOL_H='' ;; true) if test -z "$STDBOOL_H"; then STDBOOL_H="${gl_source_base_prefix}stdbool.h" fi ;; *) echo "*** GL_GENERATE_STDBOOL_H is not set correctly" 1>&2; exit 1 ;; esac if $GL_GENERATE_STDBOOL_H; then GL_GENERATE_STDBOOL_H_TRUE= GL_GENERATE_STDBOOL_H_FALSE='#' else GL_GENERATE_STDBOOL_H_TRUE='#' GL_GENERATE_STDBOOL_H_FALSE= fi : if test -z "${GL_GENERATE_STDBOOL_H_TRUE}" && test -z "${GL_GENERATE_STDBOOL_H_FALSE}"; then GL_GENERATE_STDBOOL_H_TRUE='#' GL_GENERATE_STDBOOL_H_FALSE='#' fi case "$GL_GENERATE_STDDEF_H" in false) STDDEF_H='' ;; true) if test -z "$STDDEF_H"; then STDDEF_H="${gl_source_base_prefix}stddef.h" fi ;; *) echo "*** GL_GENERATE_STDDEF_H is not set correctly" 1>&2; exit 1 ;; esac if $GL_GENERATE_STDDEF_H; then GL_GENERATE_STDDEF_H_TRUE= GL_GENERATE_STDDEF_H_FALSE='#' else GL_GENERATE_STDDEF_H_TRUE='#' GL_GENERATE_STDDEF_H_FALSE= fi : if test -z "${GL_GENERATE_STDDEF_H_TRUE}" && test -z "${GL_GENERATE_STDDEF_H_FALSE}"; then GL_GENERATE_STDDEF_H_TRUE='#' GL_GENERATE_STDDEF_H_FALSE='#' fi case "$GL_GENERATE_STDINT_H" in false) STDINT_H='' ;; true) if test -z "$STDINT_H"; then STDINT_H="${gl_source_base_prefix}stdint.h" fi ;; *) echo "*** GL_GENERATE_STDINT_H is not set correctly" 1>&2; exit 1 ;; esac if $GL_GENERATE_STDINT_H; then GL_GENERATE_STDINT_H_TRUE= GL_GENERATE_STDINT_H_FALSE='#' else GL_GENERATE_STDINT_H_TRUE='#' GL_GENERATE_STDINT_H_FALSE= fi : if test -z "${GL_GENERATE_STDINT_H_TRUE}" && test -z "${GL_GENERATE_STDINT_H_FALSE}"; then GL_GENERATE_STDINT_H_TRUE='#' GL_GENERATE_STDINT_H_FALSE='#' fi case "$GL_GENERATE_LIMITS_H" in false) LIMITS_H='' ;; true) if test -z "$LIMITS_H"; then LIMITS_H="${gl_source_base_prefix}limits.h" fi ;; *) echo "*** GL_GENERATE_LIMITS_H is not set correctly" 1>&2; exit 1 ;; esac if $GL_GENERATE_LIMITS_H; then GL_GENERATE_LIMITS_H_TRUE= GL_GENERATE_LIMITS_H_FALSE='#' else GL_GENERATE_LIMITS_H_TRUE='#' GL_GENERATE_LIMITS_H_FALSE= fi : if test -z "${GL_GENERATE_LIMITS_H_TRUE}" && test -z "${GL_GENERATE_LIMITS_H_FALSE}"; then GL_GENERATE_LIMITS_H_TRUE='#' GL_GENERATE_LIMITS_H_FALSE='#' fi if test $REPLACE_STDIO_READ_FUNCS = 1; then GL_COND_OBJ_STDIO_READ_TRUE= GL_COND_OBJ_STDIO_READ_FALSE='#' else GL_COND_OBJ_STDIO_READ_TRUE='#' GL_COND_OBJ_STDIO_READ_FALSE= fi : if test -z "${GL_COND_OBJ_STDIO_READ_TRUE}" && test -z "${GL_COND_OBJ_STDIO_READ_FALSE}"; then GL_COND_OBJ_STDIO_READ_TRUE='#' GL_COND_OBJ_STDIO_READ_FALSE='#' fi if test $REPLACE_STDIO_WRITE_FUNCS = 1; then GL_COND_OBJ_STDIO_WRITE_TRUE= GL_COND_OBJ_STDIO_WRITE_FALSE='#' else GL_COND_OBJ_STDIO_WRITE_TRUE='#' GL_COND_OBJ_STDIO_WRITE_FALSE= fi : if test -z "${GL_COND_OBJ_STDIO_WRITE_TRUE}" && test -z "${GL_COND_OBJ_STDIO_WRITE_FALSE}"; then GL_COND_OBJ_STDIO_WRITE_TRUE='#' GL_COND_OBJ_STDIO_WRITE_FALSE='#' fi GL_GNULIB_FSCANF=1 printf "%s\n" "#define GNULIB_TEST_FSCANF 1" >>confdefs.h printf "%s\n" "#define GNULIB_FSCANF 1" >>confdefs.h GL_GNULIB_SCANF=1 printf "%s\n" "#define GNULIB_TEST_SCANF 1" >>confdefs.h printf "%s\n" "#define GNULIB_SCANF 1" >>confdefs.h GL_GNULIB_FGETC=1 printf "%s\n" "#define GNULIB_TEST_FGETC 1" >>confdefs.h GL_GNULIB_GETC=1 printf "%s\n" "#define GNULIB_TEST_GETC 1" >>confdefs.h GL_GNULIB_GETCHAR=1 printf "%s\n" "#define GNULIB_TEST_GETCHAR 1" >>confdefs.h GL_GNULIB_FGETS=1 printf "%s\n" "#define GNULIB_TEST_FGETS 1" >>confdefs.h GL_GNULIB_FREAD=1 printf "%s\n" "#define GNULIB_TEST_FREAD 1" >>confdefs.h GL_GNULIB_FPRINTF=1 printf "%s\n" "#define GNULIB_TEST_FPRINTF 1" >>confdefs.h GL_GNULIB_PRINTF=1 printf "%s\n" "#define GNULIB_TEST_PRINTF 1" >>confdefs.h GL_GNULIB_VFPRINTF=1 printf "%s\n" "#define GNULIB_TEST_VFPRINTF 1" >>confdefs.h GL_GNULIB_VPRINTF=1 printf "%s\n" "#define GNULIB_TEST_VPRINTF 1" >>confdefs.h GL_GNULIB_FPUTC=1 printf "%s\n" "#define GNULIB_TEST_FPUTC 1" >>confdefs.h GL_GNULIB_PUTC=1 printf "%s\n" "#define GNULIB_TEST_PUTC 1" >>confdefs.h GL_GNULIB_PUTCHAR=1 printf "%s\n" "#define GNULIB_TEST_PUTCHAR 1" >>confdefs.h GL_GNULIB_FPUTS=1 printf "%s\n" "#define GNULIB_TEST_FPUTS 1" >>confdefs.h GL_GNULIB_PUTS=1 printf "%s\n" "#define GNULIB_TEST_PUTS 1" >>confdefs.h GL_GNULIB_FWRITE=1 printf "%s\n" "#define GNULIB_TEST_FWRITE 1" >>confdefs.h ac_fn_c_check_func "$LINENO" "strcasecmp" "ac_cv_func_strcasecmp" if test "x$ac_cv_func_strcasecmp" = xyes then : printf "%s\n" "#define HAVE_STRCASECMP 1" >>confdefs.h fi if test $ac_cv_func_strcasecmp = no; then HAVE_STRCASECMP=0 fi ac_fn_c_check_func "$LINENO" "strncasecmp" "ac_cv_func_strncasecmp" if test "x$ac_cv_func_strncasecmp" = xyes then : printf "%s\n" "#define HAVE_STRNCASECMP 1" >>confdefs.h fi if test $ac_cv_func_strncasecmp = yes; then HAVE_STRNCASECMP=1 else HAVE_STRNCASECMP=0 fi ac_fn_check_decl "$LINENO" "strncasecmp" "ac_cv_have_decl_strncasecmp" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_strncasecmp" = xyes then : ac_have_decl=1 else $as_nop ac_have_decl=0 fi printf "%s\n" "#define HAVE_DECL_STRNCASECMP $ac_have_decl" >>confdefs.h if test $ac_cv_have_decl_strncasecmp = no; then HAVE_DECL_STRNCASECMP=0 fi if test $HAVE_STRCASECMP = 0; then GL_COND_OBJ_STRCASECMP_TRUE= GL_COND_OBJ_STRCASECMP_FALSE='#' else GL_COND_OBJ_STRCASECMP_TRUE='#' GL_COND_OBJ_STRCASECMP_FALSE= fi : if test -z "${GL_COND_OBJ_STRCASECMP_TRUE}" && test -z "${GL_COND_OBJ_STRCASECMP_FALSE}"; then GL_COND_OBJ_STRCASECMP_TRUE='#' GL_COND_OBJ_STRCASECMP_FALSE='#' fi if test -z "$GL_COND_OBJ_STRCASECMP_TRUE"; then : : fi if test $HAVE_STRNCASECMP = 0; then GL_COND_OBJ_STRNCASECMP_TRUE= GL_COND_OBJ_STRNCASECMP_FALSE='#' else GL_COND_OBJ_STRNCASECMP_TRUE='#' GL_COND_OBJ_STRNCASECMP_FALSE= fi : if test -z "${GL_COND_OBJ_STRNCASECMP_TRUE}" && test -z "${GL_COND_OBJ_STRNCASECMP_FALSE}"; then GL_COND_OBJ_STRNCASECMP_TRUE='#' GL_COND_OBJ_STRNCASECMP_FALSE='#' fi if test -z "$GL_COND_OBJ_STRNCASECMP_TRUE"; then : : fi ac_fn_c_check_func "$LINENO" "strchrnul" "ac_cv_func_strchrnul" if test "x$ac_cv_func_strchrnul" = xyes then : printf "%s\n" "#define HAVE_STRCHRNUL 1" >>confdefs.h fi if test $ac_cv_func_strchrnul = no; then HAVE_STRCHRNUL=0 else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether strchrnul works" >&5 printf %s "checking whether strchrnul works... " >&6; } if test ${gl_cv_func_strchrnul_works+y} then : printf %s "(cached) " >&6 else $as_nop if test "$cross_compiling" = yes then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined __CYGWIN__ #include #if CYGWIN_VERSION_DLL_COMBINED > CYGWIN_VERSION_DLL_MAKE_COMBINED (1007, 9) Lucky user #endif #else Lucky user #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "Lucky user" >/dev/null 2>&1 then : gl_cv_func_strchrnul_works="guessing yes" else $as_nop gl_cv_func_strchrnul_works="guessing no" fi rm -rf conftest* else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* for strchrnul */ int main (void) { const char *buf = "a"; return strchrnul (buf, 'b') != buf + 1; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO" then : gl_cv_func_strchrnul_works=yes else $as_nop gl_cv_func_strchrnul_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_strchrnul_works" >&5 printf "%s\n" "$gl_cv_func_strchrnul_works" >&6; } case "$gl_cv_func_strchrnul_works" in *yes) ;; *) REPLACE_STRCHRNUL=1 ;; esac fi if test $HAVE_STRCHRNUL = 0 || test $REPLACE_STRCHRNUL = 1; then GL_COND_OBJ_STRCHRNUL_TRUE= GL_COND_OBJ_STRCHRNUL_FALSE='#' else GL_COND_OBJ_STRCHRNUL_TRUE='#' GL_COND_OBJ_STRCHRNUL_FALSE= fi : if test -z "${GL_COND_OBJ_STRCHRNUL_TRUE}" && test -z "${GL_COND_OBJ_STRCHRNUL_FALSE}"; then GL_COND_OBJ_STRCHRNUL_TRUE='#' GL_COND_OBJ_STRCHRNUL_FALSE='#' fi if test -z "$GL_COND_OBJ_STRCHRNUL_TRUE"; then : : fi GL_GNULIB_STRCHRNUL=1 printf "%s\n" "#define GNULIB_TEST_STRCHRNUL 1" >>confdefs.h if test $gl_cv_func_malloc_posix != yes; then REPLACE_STRDUP=1 fi if test $ac_cv_have_decl_strdup = no; then HAVE_DECL_STRDUP=0 fi if test $REPLACE_STRDUP = 1; then GL_COND_OBJ_STRDUP_TRUE= GL_COND_OBJ_STRDUP_FALSE='#' else GL_COND_OBJ_STRDUP_TRUE='#' GL_COND_OBJ_STRDUP_FALSE= fi : if test -z "${GL_COND_OBJ_STRDUP_TRUE}" && test -z "${GL_COND_OBJ_STRDUP_FALSE}"; then GL_COND_OBJ_STRDUP_TRUE='#' GL_COND_OBJ_STRDUP_FALSE='#' fi if test -z "$GL_COND_OBJ_STRDUP_TRUE"; then : : fi GL_GNULIB_STRDUP=1 printf "%s\n" "#define GNULIB_TEST_STRDUP 1" >>confdefs.h if test "$GL_GENERATE_ERRNO_H:$REPLACE_STRERROR_0" = false:0; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working strerror function" >&5 printf %s "checking for working strerror function... " >&6; } if test ${gl_cv_func_working_strerror+y} then : printf %s "(cached) " >&6 else $as_nop if test "$cross_compiling" = yes then : case "$host_os" in # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_working_strerror="guessing yes" ;; # Guess yes on musl systems. *-musl*) gl_cv_func_working_strerror="guessing yes" ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_working_strerror="$gl_cross_guess_normal" ;; esac else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { if (!*strerror (-2)) return 1; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO" then : gl_cv_func_working_strerror=yes else $as_nop gl_cv_func_working_strerror=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_working_strerror" >&5 printf "%s\n" "$gl_cv_func_working_strerror" >&6; } case "$gl_cv_func_working_strerror" in *yes) ;; *) REPLACE_STRERROR=1 ;; esac else REPLACE_STRERROR=1 fi if test $REPLACE_STRERROR = 1; then GL_COND_OBJ_STRERROR_TRUE= GL_COND_OBJ_STRERROR_FALSE='#' else GL_COND_OBJ_STRERROR_TRUE='#' GL_COND_OBJ_STRERROR_FALSE= fi : if test -z "${GL_COND_OBJ_STRERROR_TRUE}" && test -z "${GL_COND_OBJ_STRERROR_FALSE}"; then GL_COND_OBJ_STRERROR_TRUE='#' GL_COND_OBJ_STRERROR_FALSE='#' fi printf "%s\n" "#define GNULIB_STRERROR 1" >>confdefs.h GL_GNULIB_STRERROR=1 printf "%s\n" "#define GNULIB_TEST_STRERROR 1" >>confdefs.h if test -n "$ERRNO_H" || test $REPLACE_STRERROR_0 = 1; then GL_COND_OBJ_STRERROR_OVERRIDE_TRUE= GL_COND_OBJ_STRERROR_OVERRIDE_FALSE='#' else GL_COND_OBJ_STRERROR_OVERRIDE_TRUE='#' GL_COND_OBJ_STRERROR_OVERRIDE_FALSE= fi : if test -z "${GL_COND_OBJ_STRERROR_OVERRIDE_TRUE}" && test -z "${GL_COND_OBJ_STRERROR_OVERRIDE_FALSE}"; then GL_COND_OBJ_STRERROR_OVERRIDE_TRUE='#' GL_COND_OBJ_STRERROR_OVERRIDE_FALSE='#' fi if test -z "$GL_COND_OBJ_STRERROR_OVERRIDE_TRUE"; then : if test $ac_cv_header_sys_socket_h != yes; then ac_fn_c_check_header_compile "$LINENO" "winsock2.h" "ac_cv_header_winsock2_h" "$ac_includes_default" if test "x$ac_cv_header_winsock2_h" = xyes then : printf "%s\n" "#define HAVE_WINSOCK2_H 1" >>confdefs.h fi fi if test "$ac_cv_header_winsock2_h" = yes; then HAVE_WINSOCK2_H=1 UNISTD_H_HAVE_WINSOCK2_H=1 SYS_IOCTL_H_HAVE_WINSOCK2_H=1 else HAVE_WINSOCK2_H=0 fi fi if test $ac_cv_have_decl_strndup = no; then HAVE_DECL_STRNDUP=0 fi if test $ac_cv_func_strndup = yes; then HAVE_STRNDUP=1 # AIX 4.3.3, AIX 5.1 have a function that fails to add the terminating '\0'. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working strndup" >&5 printf %s "checking for working strndup... " >&6; } if test ${gl_cv_func_strndup_works+y} then : printf %s "(cached) " >&6 else $as_nop if test "$cross_compiling" = yes then : case $host_os in aix | aix[3-6]*) gl_cv_func_strndup_works="guessing no";; *) gl_cv_func_strndup_works="guessing yes";; esac else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main (void) { #if !HAVE_DECL_STRNDUP extern #ifdef __cplusplus "C" #endif char *strndup (const char *, size_t); #endif int result; char *s; s = strndup ("some longer string", 15); free (s); s = strndup ("shorter string", 13); result = s[13] != '\0'; free (s); return result; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO" then : gl_cv_func_strndup_works=yes else $as_nop gl_cv_func_strndup_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_strndup_works" >&5 printf "%s\n" "$gl_cv_func_strndup_works" >&6; } case $gl_cv_func_strndup_works in *no) REPLACE_STRNDUP=1 ;; esac else HAVE_STRNDUP=0 fi if test $HAVE_STRNDUP = 0 || test $REPLACE_STRNDUP = 1; then GL_COND_OBJ_STRNDUP_TRUE= GL_COND_OBJ_STRNDUP_FALSE='#' else GL_COND_OBJ_STRNDUP_TRUE='#' GL_COND_OBJ_STRNDUP_FALSE= fi : if test -z "${GL_COND_OBJ_STRNDUP_TRUE}" && test -z "${GL_COND_OBJ_STRNDUP_FALSE}"; then GL_COND_OBJ_STRNDUP_TRUE='#' GL_COND_OBJ_STRNDUP_FALSE='#' fi GL_GNULIB_STRNDUP=1 printf "%s\n" "#define GNULIB_TEST_STRNDUP 1" >>confdefs.h if test $ac_cv_have_decl_strnlen = no; then HAVE_DECL_STRNLEN=0 else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working strnlen" >&5 printf %s "checking for working strnlen... " >&6; } if test ${ac_cv_func_strnlen_working+y} then : printf %s "(cached) " >&6 else $as_nop if test "$cross_compiling" = yes then : # Guess no on AIX systems, yes otherwise. case "$host_os" in aix*) ac_cv_func_strnlen_working=no;; *) ac_cv_func_strnlen_working=yes;; esac else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main (void) { #define S "foobar" #define S_LEN (sizeof S - 1) /* At least one implementation is buggy: that of AIX 4.3 would give strnlen (S, 1) == 3. */ int i; for (i = 0; i < S_LEN + 1; ++i) { int expected = i <= S_LEN ? i : S_LEN; if (strnlen (S, i) != expected) return 1; } return 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO" then : ac_cv_func_strnlen_working=yes else $as_nop ac_cv_func_strnlen_working=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_strnlen_working" >&5 printf "%s\n" "$ac_cv_func_strnlen_working" >&6; } test $ac_cv_func_strnlen_working = no && : if test $ac_cv_func_strnlen_working = no; then REPLACE_STRNLEN=1 fi fi if test $HAVE_DECL_STRNLEN = 0 || test $REPLACE_STRNLEN = 1; then GL_COND_OBJ_STRNLEN_TRUE= GL_COND_OBJ_STRNLEN_FALSE='#' else GL_COND_OBJ_STRNLEN_TRUE='#' GL_COND_OBJ_STRNLEN_FALSE= fi : if test -z "${GL_COND_OBJ_STRNLEN_TRUE}" && test -z "${GL_COND_OBJ_STRNLEN_FALSE}"; then GL_COND_OBJ_STRNLEN_TRUE='#' GL_COND_OBJ_STRNLEN_FALSE='#' fi if test -z "$GL_COND_OBJ_STRNLEN_TRUE"; then : : fi GL_GNULIB_STRNLEN=1 printf "%s\n" "#define GNULIB_TEST_STRNLEN 1" >>confdefs.h if test $ac_cv_header_sysexits_h = yes; then HAVE_SYSEXITS_H=1 if test $gl_cv_have_include_next = yes; then gl_cv_next_sysexits_h='<'sysexits.h'>' else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of " >&5 printf %s "checking absolute name of ... " >&6; } if test ${gl_cv_next_sysexits_h+y} then : printf %s "(cached) " >&6 else $as_nop if test $ac_cv_header_sysexits_h = yes; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac case "$host_os" in mingw*) gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo 'sysexits.h' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' gl_cv_absolute_sysexits_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 | sed -n "$gl_absolute_header_sed"` gl_header=$gl_cv_absolute_sysexits_h gl_cv_next_sysexits_h='"'$gl_header'"' else gl_cv_next_sysexits_h='<'sysexits.h'>' fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_sysexits_h" >&5 printf "%s\n" "$gl_cv_next_sysexits_h" >&6; } fi NEXT_SYSEXITS_H=$gl_cv_next_sysexits_h if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'sysexits.h'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=$gl_cv_next_sysexits_h fi NEXT_AS_FIRST_DIRECTIVE_SYSEXITS_H=$gl_next_as_first_directive cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { switch (0) { case EX_OK: case EX_USAGE: case EX_DATAERR: case EX_NOINPUT: case EX_NOUSER: case EX_NOHOST: case EX_UNAVAILABLE: case EX_SOFTWARE: case EX_OSERR: case EX_OSFILE: case EX_CANTCREAT: case EX_IOERR: case EX_TEMPFAIL: case EX_PROTOCOL: case EX_NOPERM: case EX_CONFIG: break; } ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : GL_GENERATE_SYSEXITS_H=false else $as_nop GL_GENERATE_SYSEXITS_H=true fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext else HAVE_SYSEXITS_H=0 GL_GENERATE_SYSEXITS_H=true fi case "$GL_GENERATE_SYSEXITS_H" in false) SYSEXITS_H='' ;; true) if test -z "$SYSEXITS_H"; then SYSEXITS_H="${gl_source_base_prefix}sysexits.h" fi ;; *) echo "*** GL_GENERATE_SYSEXITS_H is not set correctly" 1>&2; exit 1 ;; esac if $GL_GENERATE_SYSEXITS_H; then GL_GENERATE_SYSEXITS_H_TRUE= GL_GENERATE_SYSEXITS_H_FALSE='#' else GL_GENERATE_SYSEXITS_H_TRUE='#' GL_GENERATE_SYSEXITS_H_FALSE= fi : if test -z "${GL_GENERATE_SYSEXITS_H_TRUE}" && test -z "${GL_GENERATE_SYSEXITS_H_FALSE}"; then GL_GENERATE_SYSEXITS_H_TRUE='#' GL_GENERATE_SYSEXITS_H_FALSE='#' fi if { test "$HAVE_LIBUNISTRING" != yes \ || { test $LIBUNISTRING_VERSION_MAJOR -lt 0 \ || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \ && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \ || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 11 } } } } }; then if test -z "$LIBUNISTRING_UNITYPES_H"; then LIBUNISTRING_UNITYPES_H="${gl_source_base_prefix}unitypes.h" fi else LIBUNISTRING_UNITYPES_H= fi if { test "$HAVE_LIBUNISTRING" != yes \ || { test $LIBUNISTRING_VERSION_MAJOR -lt 0 \ || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \ && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \ || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 11 } } } } }; then if test -z "$LIBUNISTRING_UNIWIDTH_H"; then LIBUNISTRING_UNIWIDTH_H="${gl_source_base_prefix}uniwidth.h" fi else LIBUNISTRING_UNIWIDTH_H= fi if { test "$HAVE_LIBUNISTRING" != yes \ || { test $LIBUNISTRING_VERSION_MAJOR -lt 0 \ || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \ && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \ || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 11 } } } } }; then LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_TRUE= LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_FALSE='#' else LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_TRUE='#' LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_FALSE= fi : if test -z "${LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_TRUE}" && test -z "${LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_FALSE}"; then LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_TRUE='#' LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_FALSE='#' fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for variable-length arrays" >&5 printf %s "checking for variable-length arrays... " >&6; } if test ${ac_cv_c_vararrays+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC_NO_VLA__ defined #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "defined" >/dev/null 2>&1 then : ac_cv_c_vararrays='no: __STDC_NO_VLA__ is defined' else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Test for VLA support. This test is partly inspired from examples in the C standard. Use at least two VLA functions to detect the GCC 3.4.3 bug described in: https://lists.gnu.org/archive/html/bug-gnulib/2014-08/msg00014.html */ #ifdef __STDC_NO_VLA__ syntax error; #else extern int n; int B[100]; int fvla (int m, int C[m][m]); int simple (int count, int all[static count]) { return all[count - 1]; } int fvla (int m, int C[m][m]) { typedef int VLA[m][m]; VLA x; int D[m]; static int (*q)[m] = &B; int (*s)[n] = q; return C && &x[0][0] == &D[0] && &D[0] == s[0]; } #endif int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_c_vararrays=yes else $as_nop ac_cv_c_vararrays=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -rf conftest* fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_vararrays" >&5 printf "%s\n" "$ac_cv_c_vararrays" >&6; } if test "$ac_cv_c_vararrays" = yes; then printf "%s\n" "#define HAVE_C_VARARRAYS 1" >>confdefs.h elif test "$ac_cv_c_vararrays" = no; then printf "%s\n" "#define __STDC_NO_VLA__ 1" >>confdefs.h fi if test $ac_cv_func_vasnprintf = no; then gl_LIBOBJS="$gl_LIBOBJS vasnprintf.$ac_objext" gl_LIBOBJS="$gl_LIBOBJS printf-args.$ac_objext" gl_LIBOBJS="$gl_LIBOBJS printf-parse.$ac_objext" gl_LIBOBJS="$gl_LIBOBJS asnprintf.$ac_objext" if test $ac_cv_func_vasnprintf = yes; then printf "%s\n" "#define REPLACE_VASNPRINTF 1" >>confdefs.h fi ac_fn_c_check_type "$LINENO" "ptrdiff_t" "ac_cv_type_ptrdiff_t" "$ac_includes_default" if test "x$ac_cv_type_ptrdiff_t" = xyes then : else $as_nop printf "%s\n" "#define ptrdiff_t long" >>confdefs.h fi fi gl_cv_func_vsnprintf_usable=no ac_fn_c_check_func "$LINENO" "vsnprintf" "ac_cv_func_vsnprintf" if test "x$ac_cv_func_vsnprintf" = xyes then : printf "%s\n" "#define HAVE_VSNPRINTF 1" >>confdefs.h fi if test $ac_cv_func_vsnprintf = yes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether snprintf respects a size of 1" >&5 printf %s "checking whether snprintf respects a size of 1... " >&6; } if test ${gl_cv_func_snprintf_size1+y} then : printf %s "(cached) " >&6 else $as_nop if test "$cross_compiling" = yes then : case "$host_os" in # Guess yes on Android. linux*-android*) gl_cv_func_snprintf_size1="guessing yes" ;; # Guess yes on native Windows. mingw*) gl_cv_func_snprintf_size1="guessing yes" ;; *) gl_cv_func_snprintf_size1="guessing yes" ;; esac else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #if HAVE_SNPRINTF # define my_snprintf snprintf #else # include static int my_snprintf (char *buf, int size, const char *format, ...) { va_list args; int ret; va_start (args, format); ret = vsnprintf (buf, size, format, args); va_end (args); return ret; } #endif int main() { static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' }; my_snprintf (buf, 1, "%d", 12345); return buf[1] != 'E'; } _ACEOF if ac_fn_c_try_run "$LINENO" then : gl_cv_func_snprintf_size1=yes else $as_nop gl_cv_func_snprintf_size1=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_snprintf_size1" >&5 printf "%s\n" "$gl_cv_func_snprintf_size1" >&6; } case "$gl_cv_func_snprintf_size1" in *yes) case "$gl_cv_func_snprintf_retval_c99" in *yes) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether printf supports POSIX/XSI format strings with positions" >&5 printf %s "checking whether printf supports POSIX/XSI format strings with positions... " >&6; } if test ${gl_cv_func_printf_positions+y} then : printf %s "(cached) " >&6 else $as_nop if test "$cross_compiling" = yes then : case "$host_os" in netbsd[1-3]* | netbsdelf[1-3]* | netbsdaout[1-3]* | netbsdcoff[1-3]*) gl_cv_func_printf_positions="guessing no";; beos*) gl_cv_func_printf_positions="guessing no";; # Guess yes on Android. linux*-android*) gl_cv_func_printf_positions="guessing yes";; # Guess no on native Windows. mingw* | pw*) gl_cv_func_printf_positions="guessing no";; *) gl_cv_func_printf_positions="guessing yes";; esac else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include /* The string "%2$d %1$d", with dollar characters protected from the shell's dollar expansion (possibly an autoconf bug). */ static char format[] = { '%', '2', '$', 'd', ' ', '%', '1', '$', 'd', '\0' }; static char buf[100]; int main () { sprintf (buf, format, 33, 55); return (strcmp (buf, "55 33") != 0); } _ACEOF if ac_fn_c_try_run "$LINENO" then : gl_cv_func_printf_positions=yes else $as_nop gl_cv_func_printf_positions=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_positions" >&5 printf "%s\n" "$gl_cv_func_printf_positions" >&6; } case "$gl_cv_func_printf_positions" in *yes) gl_cv_func_vsnprintf_usable=yes ;; esac ;; esac ;; esac fi if test $gl_cv_func_vsnprintf_usable = no; then gl_LIBOBJS="$gl_LIBOBJS vsnprintf.$ac_objext" if test $ac_cv_func_vsnprintf = yes; then REPLACE_VSNPRINTF=1 else if test $ac_cv_have_decl_vsnprintf = yes; then REPLACE_VSNPRINTF=1 fi fi : fi if test $ac_cv_have_decl_vsnprintf = no; then HAVE_DECL_VSNPRINTF=0 fi GL_GNULIB_VSNPRINTF=1 printf "%s\n" "#define GNULIB_TEST_VSNPRINTF 1" >>confdefs.h if case "$host_os" in mingw*) true ;; *) test $ac_cv_func_mbsinit = yes ;; esac \ && test $ac_cv_func_mbrtowc = yes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether mbrtowc handles incomplete characters" >&5 printf %s "checking whether mbrtowc handles incomplete characters... " >&6; } if test ${gl_cv_func_mbrtowc_incomplete_state+y} then : printf %s "(cached) " >&6 else $as_nop case "$host_os" in # Guess no on AIX and OSF/1. aix* | osf*) gl_cv_func_mbrtowc_incomplete_state="guessing no" ;; # Guess yes otherwise. *) gl_cv_func_mbrtowc_incomplete_state="guessing yes" ;; esac if test $LOCALE_JA != none; then if test "$cross_compiling" = yes then : : else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { if (setlocale (LC_ALL, "$LOCALE_JA") != NULL) { const char input[] = "B\217\253\344\217\251\316er"; /* "Büßer" */ mbstate_t state; wchar_t wc; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2)) if (mbsinit (&state)) return 2; } return 0; } _ACEOF if ac_fn_c_try_run "$LINENO" then : gl_cv_func_mbrtowc_incomplete_state=yes else $as_nop gl_cv_func_mbrtowc_incomplete_state=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi else if test $LOCALE_FR_UTF8 != none; then if test "$cross_compiling" = yes then : : else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL) { const char input[] = "B\303\274\303\237er"; /* "Büßer" */ mbstate_t state; wchar_t wc; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2)) if (mbsinit (&state)) return 2; } return 0; } _ACEOF if ac_fn_c_try_run "$LINENO" then : gl_cv_func_mbrtowc_incomplete_state=yes else $as_nop gl_cv_func_mbrtowc_incomplete_state=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mbrtowc_incomplete_state" >&5 printf "%s\n" "$gl_cv_func_mbrtowc_incomplete_state" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether mbrtowc works as well as mbtowc" >&5 printf %s "checking whether mbrtowc works as well as mbtowc... " >&6; } if test ${gl_cv_func_mbrtowc_sanitycheck+y} then : printf %s "(cached) " >&6 else $as_nop case "$host_os" in # Guess no on Solaris 8. solaris2.8) gl_cv_func_mbrtowc_sanitycheck="guessing no" ;; # Guess yes otherwise. *) gl_cv_func_mbrtowc_sanitycheck="guessing yes" ;; esac if test $LOCALE_ZH_CN != none; then if test "$cross_compiling" = yes then : : else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { /* This fails on Solaris 8: mbrtowc returns 2, and sets wc to 0x00F0. mbtowc returns 4 (correct) and sets wc to 0x5EDC. */ if (setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL) { char input[] = "B\250\271\201\060\211\070er"; /* "Büßer" */ mbstate_t state; wchar_t wc; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (&wc, input + 3, 6, &state) != 4 && mbtowc (&wc, input + 3, 6) == 4) return 2; } return 0; } _ACEOF if ac_fn_c_try_run "$LINENO" then : gl_cv_func_mbrtowc_sanitycheck=yes else $as_nop gl_cv_func_mbrtowc_sanitycheck=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mbrtowc_sanitycheck" >&5 printf "%s\n" "$gl_cv_func_mbrtowc_sanitycheck" >&6; } REPLACE_MBSTATE_T=0 case "$gl_cv_func_mbrtowc_incomplete_state" in *yes) ;; *) REPLACE_MBSTATE_T=1 ;; esac case "$gl_cv_func_mbrtowc_sanitycheck" in *yes) ;; *) REPLACE_MBSTATE_T=1 ;; esac else REPLACE_MBSTATE_T=1 fi if test $ac_cv_func_wcrtomb = no; then HAVE_WCRTOMB=0 ac_fn_check_decl "$LINENO" "wcrtomb" "ac_cv_have_decl_wcrtomb" " #include " "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_wcrtomb" = xyes then : ac_have_decl=1 else $as_nop ac_have_decl=0 fi printf "%s\n" "#define HAVE_DECL_WCRTOMB $ac_have_decl" >>confdefs.h if test $ac_cv_have_decl_wcrtomb = yes; then REPLACE_WCRTOMB=1 fi else if test $REPLACE_WCRTOMB = 0; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether wcrtomb works in the C locale" >&5 printf %s "checking whether wcrtomb works in the C locale... " >&6; } if test ${gl_cv_func_wcrtomb_works+y} then : printf %s "(cached) " >&6 else $as_nop if test "$cross_compiling" = yes then : case "$host_os" in # Guess no on Android. linux*-android*) gl_cv_func_wcrtomb_works="guessing no";; # Guess yes otherwise. *) gl_cv_func_wcrtomb_works="guessing yes";; esac else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { mbstate_t state; char out[64]; int count; memset (&state, 0, sizeof (state)); out[0] = 'x'; count = wcrtomb (out, L'a', &state); return !(count == 1 && out[0] == 'a'); } _ACEOF if ac_fn_c_try_run "$LINENO" then : gl_cv_func_wcrtomb_works=yes else $as_nop gl_cv_func_wcrtomb_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_wcrtomb_works" >&5 printf "%s\n" "$gl_cv_func_wcrtomb_works" >&6; } case "$gl_cv_func_wcrtomb_works" in *yes) ;; *) printf "%s\n" "#define WCRTOMB_C_LOCALE_BUG 1" >>confdefs.h REPLACE_WCRTOMB=1 ;; esac fi if test $REPLACE_WCRTOMB = 0; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether wcrtomb return value is correct" >&5 printf %s "checking whether wcrtomb return value is correct... " >&6; } if test ${gl_cv_func_wcrtomb_retval+y} then : printf %s "(cached) " >&6 else $as_nop case "$host_os" in # Guess no on AIX 4, OSF/1, Solaris, native Windows. aix4* | osf* | solaris* | mingw*) gl_cv_func_wcrtomb_retval="guessing no" ;; # Guess yes otherwise. *) gl_cv_func_wcrtomb_retval="guessing yes" ;; esac if test $LOCALE_FR != none || test $LOCALE_FR_UTF8 != none || test $LOCALE_JA != none || test $LOCALE_ZH_CN != none; then if test "$cross_compiling" = yes then : : else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { int result = 0; if (setlocale (LC_ALL, "$LOCALE_FR") != NULL) { if (wcrtomb (NULL, 0, NULL) != 1) result |= 1; } if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL) { if (wcrtomb (NULL, 0, NULL) != 1) result |= 2; { wchar_t wc = (wchar_t) 0xBADFACE; if (mbtowc (&wc, "\303\274", 2) == 2) if (wcrtomb (NULL, wc, NULL) != 1) result |= 2; } } if (setlocale (LC_ALL, "$LOCALE_JA") != NULL) { if (wcrtomb (NULL, 0, NULL) != 1) result |= 4; } if (setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL) { if (wcrtomb (NULL, 0, NULL) != 1) result |= 8; } return result; } _ACEOF if ac_fn_c_try_run "$LINENO" then : gl_cv_func_wcrtomb_retval=yes else $as_nop gl_cv_func_wcrtomb_retval=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_wcrtomb_retval" >&5 printf "%s\n" "$gl_cv_func_wcrtomb_retval" >&6; } case "$gl_cv_func_wcrtomb_retval" in *yes) ;; *) printf "%s\n" "#define WCRTOMB_RETVAL_BUG 1" >>confdefs.h REPLACE_WCRTOMB=1 ;; esac fi fi if test $HAVE_WCRTOMB = 0 || test $REPLACE_WCRTOMB = 1; then GL_COND_OBJ_WCRTOMB_TRUE= GL_COND_OBJ_WCRTOMB_FALSE='#' else GL_COND_OBJ_WCRTOMB_TRUE='#' GL_COND_OBJ_WCRTOMB_FALSE= fi : if test -z "${GL_COND_OBJ_WCRTOMB_TRUE}" && test -z "${GL_COND_OBJ_WCRTOMB_FALSE}"; then GL_COND_OBJ_WCRTOMB_TRUE='#' GL_COND_OBJ_WCRTOMB_FALSE='#' fi if test -z "$GL_COND_OBJ_WCRTOMB_TRUE"; then : : fi GL_GNULIB_WCRTOMB=1 printf "%s\n" "#define GNULIB_TEST_WCRTOMB 1" >>confdefs.h ac_fn_check_decl "$LINENO" "wcwidth" "ac_cv_have_decl_wcwidth" " #include " "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_wcwidth" = xyes then : ac_have_decl=1 else $as_nop ac_have_decl=0 fi printf "%s\n" "#define HAVE_DECL_WCWIDTH $ac_have_decl" >>confdefs.h if test $ac_cv_have_decl_wcwidth != yes; then HAVE_DECL_WCWIDTH=0 fi if test $ac_cv_func_wcwidth != yes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether wcwidth is a macro" >&5 printf %s "checking whether wcwidth is a macro... " >&6; } if test ${gl_cv_func_wcwidth_macro+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef wcwidth wchar_header_defines_wcwidth #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "wchar_header_defines_wcwidth" >/dev/null 2>&1 then : gl_cv_func_wcwidth_macro=yes else $as_nop gl_cv_func_wcwidth_macro=no fi rm -rf conftest* fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_wcwidth_macro" >&5 printf "%s\n" "$gl_cv_func_wcwidth_macro" >&6; } fi if test $ac_cv_func_wcwidth = yes || test $gl_cv_func_wcwidth_macro = yes; then HAVE_WCWIDTH=1 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether wcwidth works reasonably in UTF-8 locales" >&5 printf %s "checking whether wcwidth works reasonably in UTF-8 locales... " >&6; } if test ${gl_cv_func_wcwidth_works+y} then : printf %s "(cached) " >&6 else $as_nop if test "$cross_compiling" = yes then : case "$host_os" in # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_wcwidth_works="guessing yes";; # Guess yes on musl systems. *-musl*) gl_cv_func_wcwidth_works="guessing yes";; # Guess yes on AIX 7 systems. aix[7-9]*) gl_cv_func_wcwidth_works="guessing yes";; *) gl_cv_func_wcwidth_works="$gl_cross_guess_normal";; esac else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if !HAVE_DECL_WCWIDTH extern # ifdef __cplusplus "C" # endif int wcwidth (int); #endif int main () { int result = 0; if (setlocale (LC_ALL, "en_US.UTF-8") != NULL) { if (wcwidth (0x0301) > 0) result |= 1; if (wcwidth (0x05B0) > 0) result |= 2; if (wcwidth (0x200B) > 0) result |= 4; if (wcwidth (0xFF1A) == 0) result |= 8; if (wcwidth (0x2202) > 1) result |= 16; } return result; } _ACEOF if ac_fn_c_try_run "$LINENO" then : gl_cv_func_wcwidth_works=yes else $as_nop gl_cv_func_wcwidth_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_wcwidth_works" >&5 printf "%s\n" "$gl_cv_func_wcwidth_works" >&6; } case "$gl_cv_func_wcwidth_works" in *yes) ;; *no) REPLACE_WCWIDTH=1 ;; esac else HAVE_WCWIDTH=0 fi if test $HAVE_WCWIDTH = 0 || test $REPLACE_WCWIDTH = 1; then GL_COND_OBJ_WCWIDTH_TRUE= GL_COND_OBJ_WCWIDTH_FALSE='#' else GL_COND_OBJ_WCWIDTH_TRUE='#' GL_COND_OBJ_WCWIDTH_FALSE= fi : if test -z "${GL_COND_OBJ_WCWIDTH_TRUE}" && test -z "${GL_COND_OBJ_WCWIDTH_FALSE}"; then GL_COND_OBJ_WCWIDTH_TRUE='#' GL_COND_OBJ_WCWIDTH_FALSE='#' fi if test -z "$GL_COND_OBJ_WCWIDTH_TRUE"; then : : fi GL_GNULIB_WCWIDTH=1 printf "%s\n" "#define GNULIB_TEST_WCWIDTH 1" >>confdefs.h if case "$host_os" in mingw*) true;; *) false;; esac; then GL_COND_OBJ_WINDOWS_MUTEX_TRUE= GL_COND_OBJ_WINDOWS_MUTEX_FALSE='#' else GL_COND_OBJ_WINDOWS_MUTEX_TRUE='#' GL_COND_OBJ_WINDOWS_MUTEX_FALSE= fi : if test -z "${GL_COND_OBJ_WINDOWS_MUTEX_TRUE}" && test -z "${GL_COND_OBJ_WINDOWS_MUTEX_FALSE}"; then GL_COND_OBJ_WINDOWS_MUTEX_TRUE='#' GL_COND_OBJ_WINDOWS_MUTEX_FALSE='#' fi if case "$host_os" in mingw*) true;; *) false;; esac; then GL_COND_OBJ_WINDOWS_ONCE_TRUE= GL_COND_OBJ_WINDOWS_ONCE_FALSE='#' else GL_COND_OBJ_WINDOWS_ONCE_TRUE='#' GL_COND_OBJ_WINDOWS_ONCE_FALSE= fi : if test -z "${GL_COND_OBJ_WINDOWS_ONCE_TRUE}" && test -z "${GL_COND_OBJ_WINDOWS_ONCE_FALSE}"; then GL_COND_OBJ_WINDOWS_ONCE_TRUE='#' GL_COND_OBJ_WINDOWS_ONCE_FALSE='#' fi if case "$host_os" in mingw*) true;; *) false;; esac; then GL_COND_OBJ_WINDOWS_RECMUTEX_TRUE= GL_COND_OBJ_WINDOWS_RECMUTEX_FALSE='#' else GL_COND_OBJ_WINDOWS_RECMUTEX_TRUE='#' GL_COND_OBJ_WINDOWS_RECMUTEX_FALSE= fi : if test -z "${GL_COND_OBJ_WINDOWS_RECMUTEX_TRUE}" && test -z "${GL_COND_OBJ_WINDOWS_RECMUTEX_FALSE}"; then GL_COND_OBJ_WINDOWS_RECMUTEX_TRUE='#' GL_COND_OBJ_WINDOWS_RECMUTEX_FALSE='#' fi if case "$host_os" in mingw*) true;; *) false;; esac; then GL_COND_OBJ_WINDOWS_RWLOCK_TRUE= GL_COND_OBJ_WINDOWS_RWLOCK_FALSE='#' else GL_COND_OBJ_WINDOWS_RWLOCK_TRUE='#' GL_COND_OBJ_WINDOWS_RWLOCK_FALSE= fi : if test -z "${GL_COND_OBJ_WINDOWS_RWLOCK_TRUE}" && test -z "${GL_COND_OBJ_WINDOWS_RWLOCK_FALSE}"; then GL_COND_OBJ_WINDOWS_RWLOCK_TRUE='#' GL_COND_OBJ_WINDOWS_RWLOCK_FALSE='#' fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for wmemchr" >&5 printf %s "checking for wmemchr... " >&6; } if test ${gl_cv_func_wmemchr+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { return ! wmemchr ((const wchar_t *) 0, (wchar_t) ' ', 0); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : gl_cv_func_wmemchr=yes else $as_nop gl_cv_func_wmemchr=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_wmemchr" >&5 printf "%s\n" "$gl_cv_func_wmemchr" >&6; } if test $gl_cv_func_wmemchr = no; then HAVE_WMEMCHR=0 fi if test $HAVE_WMEMCHR = 0; then GL_COND_OBJ_WMEMCHR_TRUE= GL_COND_OBJ_WMEMCHR_FALSE='#' else GL_COND_OBJ_WMEMCHR_TRUE='#' GL_COND_OBJ_WMEMCHR_FALSE= fi : if test -z "${GL_COND_OBJ_WMEMCHR_TRUE}" && test -z "${GL_COND_OBJ_WMEMCHR_FALSE}"; then GL_COND_OBJ_WMEMCHR_TRUE='#' GL_COND_OBJ_WMEMCHR_FALSE='#' fi GL_GNULIB_WMEMCHR=1 printf "%s\n" "#define GNULIB_TEST_WMEMCHR 1" >>confdefs.h if test $ac_cv_func_wmempcpy = no; then HAVE_WMEMPCPY=0 fi if test $HAVE_WMEMPCPY = 0; then GL_COND_OBJ_WMEMPCPY_TRUE= GL_COND_OBJ_WMEMPCPY_FALSE='#' else GL_COND_OBJ_WMEMPCPY_TRUE='#' GL_COND_OBJ_WMEMPCPY_FALSE= fi : if test -z "${GL_COND_OBJ_WMEMPCPY_TRUE}" && test -z "${GL_COND_OBJ_WMEMPCPY_FALSE}"; then GL_COND_OBJ_WMEMPCPY_TRUE='#' GL_COND_OBJ_WMEMPCPY_FALSE='#' fi GL_GNULIB_WMEMPCPY=1 printf "%s\n" "#define GNULIB_TEST_WMEMPCPY 1" >>confdefs.h ac_fn_c_check_header_compile "$LINENO" "stdint.h" "ac_cv_header_stdint_h" "$ac_includes_default" if test "x$ac_cv_header_stdint_h" = xyes then : printf "%s\n" "#define HAVE_STDINT_H 1" >>confdefs.h fi # End of code from modules gltests_libdeps= gltests_ltlibdeps= gl_source_base='tests' gl_source_base_prefix= gltests_WITNESS=IN_`echo "${PACKAGE-$PACKAGE_TARNAME}" | LC_ALL=C tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ | LC_ALL=C sed -e 's/[^A-Z0-9_]/_/g'`_GNULIB_TESTS gl_module_indicator_condition=$gltests_WITNESS LIBGNU_LIBDEPS="$gl_libdeps" LIBGNU_LTLIBDEPS="$gl_ltlibdeps" WARN_FLAGS="-Wall -W -Wshadow -Wpointer-arith -Wundef -Wchar-subscripts -Wcomment -Wdeprecated-declarations -Wdisabled-optimization -Wdiv-by-zero -Wfloat-equal -Wformat-extra-args -Wformat-security -Wformat-y2k -Wimplicit -Wimplicit-function-declaration -Wimplicit-int -Wmain -Wmissing-braces -Wmissing-format-attribute -Wmultichar -Wparentheses -Wreturn-type -Wsequence-point -Wshadow -Wsign-compare -Wswitch -Wtrigraphs -Wunknown-pragmas -Wunused -Wunused-function -Wunused-label -Wunused-parameter -Wunused-value -Wunused-variable -Wwrite-strings -Wnested-externs -Wstrict-prototypes" EXTRA_WARN_FLAGS="-Wextra -Wattributes -Wendif-labels -Winit-self -Wint-to-pointer-cast -Winvalid-pch -Wmissing-field-initializers -Wnonnull -Woverflow -Wvla -Wpointer-to-int-cast -Wstrict-aliasing -Wvariadic-macros -Wvolatile-register-var -Wpointer-sign -Wmissing-include-dirs -Wmissing-prototypes -Wmissing-declarations -Wformat=2" HOST_CFLAGS="$HOST_CFLAGS $WARN_FLAGS -Wcast-align" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking which extra warnings work" >&5 printf %s "checking which extra warnings work... " >&6; } if test ${grub_cv_cc_w_extra_flags+y} then : printf %s "(cached) " >&6 else $as_nop SAVED_CFLAGS="$CFLAGS" grub_cv_cc_w_extra_flags= for x in $EXTRA_WARN_FLAGS; do CFLAGS="$HOST_CFLAGS $x -Werror" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : flag=1 else $as_nop flag=0 fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext if test x$flag = x1 ; then grub_cv_cc_w_extra_flags="$grub_cv_cc_w_extra_flags $x" fi done CFLAGS="$SAVED_CFLAGS" fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $grub_cv_cc_w_extra_flags" >&5 printf "%s\n" "$grub_cv_cc_w_extra_flags" >&6; } HOST_CFLAGS="$HOST_CFLAGS $grub_cv_cc_w_extra_flags" # # Check for target programs. # # Find tools for the target. if test "x$target_alias" != x && test "x$host_alias" != "x$target_alias"; then tmp_ac_tool_prefix="$ac_tool_prefix" ac_tool_prefix=$target_alias- if test -n "$ac_tool_prefix"; then for ac_prog in gcc egcs cc do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_TARGET_CC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$TARGET_CC"; then ac_cv_prog_TARGET_CC="$TARGET_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_TARGET_CC="$ac_tool_prefix$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi TARGET_CC=$ac_cv_prog_TARGET_CC if test -n "$TARGET_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $TARGET_CC" >&5 printf "%s\n" "$TARGET_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$TARGET_CC" && break done fi if test -z "$TARGET_CC"; then ac_ct_TARGET_CC=$TARGET_CC for ac_prog in gcc egcs cc do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_TARGET_CC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_TARGET_CC"; then ac_cv_prog_ac_ct_TARGET_CC="$ac_ct_TARGET_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_TARGET_CC="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_TARGET_CC=$ac_cv_prog_ac_ct_TARGET_CC if test -n "$ac_ct_TARGET_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_TARGET_CC" >&5 printf "%s\n" "$ac_ct_TARGET_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$ac_ct_TARGET_CC" && break done if test "x$ac_ct_TARGET_CC" = x; then TARGET_CC="as_fn_error $? "none of gcc, egcs and cc is found. set TARGET_CC manually." "$LINENO" 5" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac TARGET_CC=$ac_ct_TARGET_CC fi fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objcopy", so it can be a program name with args. set dummy ${ac_tool_prefix}objcopy; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_TARGET_OBJCOPY+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$TARGET_OBJCOPY"; then ac_cv_prog_TARGET_OBJCOPY="$TARGET_OBJCOPY" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_TARGET_OBJCOPY="${ac_tool_prefix}objcopy" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi TARGET_OBJCOPY=$ac_cv_prog_TARGET_OBJCOPY if test -n "$TARGET_OBJCOPY"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $TARGET_OBJCOPY" >&5 printf "%s\n" "$TARGET_OBJCOPY" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_TARGET_OBJCOPY"; then ac_ct_TARGET_OBJCOPY=$TARGET_OBJCOPY # Extract the first word of "objcopy", so it can be a program name with args. set dummy objcopy; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_TARGET_OBJCOPY+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_TARGET_OBJCOPY"; then ac_cv_prog_ac_ct_TARGET_OBJCOPY="$ac_ct_TARGET_OBJCOPY" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_TARGET_OBJCOPY="objcopy" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_TARGET_OBJCOPY=$ac_cv_prog_ac_ct_TARGET_OBJCOPY if test -n "$ac_ct_TARGET_OBJCOPY"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_TARGET_OBJCOPY" >&5 printf "%s\n" "$ac_ct_TARGET_OBJCOPY" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_TARGET_OBJCOPY" = x; then TARGET_OBJCOPY="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac TARGET_OBJCOPY=$ac_ct_TARGET_OBJCOPY fi else TARGET_OBJCOPY="$ac_cv_prog_TARGET_OBJCOPY" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_TARGET_STRIP+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$TARGET_STRIP"; then ac_cv_prog_TARGET_STRIP="$TARGET_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_TARGET_STRIP="${ac_tool_prefix}strip" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi TARGET_STRIP=$ac_cv_prog_TARGET_STRIP if test -n "$TARGET_STRIP"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $TARGET_STRIP" >&5 printf "%s\n" "$TARGET_STRIP" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_TARGET_STRIP"; then ac_ct_TARGET_STRIP=$TARGET_STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_TARGET_STRIP+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_TARGET_STRIP"; then ac_cv_prog_ac_ct_TARGET_STRIP="$ac_ct_TARGET_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_TARGET_STRIP="strip" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_TARGET_STRIP=$ac_cv_prog_ac_ct_TARGET_STRIP if test -n "$ac_ct_TARGET_STRIP"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_TARGET_STRIP" >&5 printf "%s\n" "$ac_ct_TARGET_STRIP" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_TARGET_STRIP" = x; then TARGET_STRIP="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac TARGET_STRIP=$ac_ct_TARGET_STRIP fi else TARGET_STRIP="$ac_cv_prog_TARGET_STRIP" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}nm", so it can be a program name with args. set dummy ${ac_tool_prefix}nm; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_TARGET_NM+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$TARGET_NM"; then ac_cv_prog_TARGET_NM="$TARGET_NM" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_TARGET_NM="${ac_tool_prefix}nm" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi TARGET_NM=$ac_cv_prog_TARGET_NM if test -n "$TARGET_NM"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $TARGET_NM" >&5 printf "%s\n" "$TARGET_NM" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_TARGET_NM"; then ac_ct_TARGET_NM=$TARGET_NM # Extract the first word of "nm", so it can be a program name with args. set dummy nm; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_TARGET_NM+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_TARGET_NM"; then ac_cv_prog_ac_ct_TARGET_NM="$ac_ct_TARGET_NM" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_TARGET_NM="nm" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_TARGET_NM=$ac_cv_prog_ac_ct_TARGET_NM if test -n "$ac_ct_TARGET_NM"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_TARGET_NM" >&5 printf "%s\n" "$ac_ct_TARGET_NM" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_TARGET_NM" = x; then TARGET_NM="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac TARGET_NM=$ac_ct_TARGET_NM fi else TARGET_NM="$ac_cv_prog_TARGET_NM" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_TARGET_RANLIB+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$TARGET_RANLIB"; then ac_cv_prog_TARGET_RANLIB="$TARGET_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_TARGET_RANLIB="${ac_tool_prefix}ranlib" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi TARGET_RANLIB=$ac_cv_prog_TARGET_RANLIB if test -n "$TARGET_RANLIB"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $TARGET_RANLIB" >&5 printf "%s\n" "$TARGET_RANLIB" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_TARGET_RANLIB"; then ac_ct_TARGET_RANLIB=$TARGET_RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_TARGET_RANLIB+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_TARGET_RANLIB"; then ac_cv_prog_ac_ct_TARGET_RANLIB="$ac_ct_TARGET_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_TARGET_RANLIB="ranlib" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_TARGET_RANLIB=$ac_cv_prog_ac_ct_TARGET_RANLIB if test -n "$ac_ct_TARGET_RANLIB"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_TARGET_RANLIB" >&5 printf "%s\n" "$ac_ct_TARGET_RANLIB" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_TARGET_RANLIB" = x; then TARGET_RANLIB="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac TARGET_RANLIB=$ac_ct_TARGET_RANLIB fi else TARGET_RANLIB="$ac_cv_prog_TARGET_RANLIB" fi ac_tool_prefix="$tmp_ac_tool_prefix" else if test "x$TARGET_CC" = x; then TARGET_CC=$CC fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objcopy", so it can be a program name with args. set dummy ${ac_tool_prefix}objcopy; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_TARGET_OBJCOPY+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$TARGET_OBJCOPY"; then ac_cv_prog_TARGET_OBJCOPY="$TARGET_OBJCOPY" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_TARGET_OBJCOPY="${ac_tool_prefix}objcopy" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi TARGET_OBJCOPY=$ac_cv_prog_TARGET_OBJCOPY if test -n "$TARGET_OBJCOPY"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $TARGET_OBJCOPY" >&5 printf "%s\n" "$TARGET_OBJCOPY" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_TARGET_OBJCOPY"; then ac_ct_TARGET_OBJCOPY=$TARGET_OBJCOPY # Extract the first word of "objcopy", so it can be a program name with args. set dummy objcopy; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_TARGET_OBJCOPY+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_TARGET_OBJCOPY"; then ac_cv_prog_ac_ct_TARGET_OBJCOPY="$ac_ct_TARGET_OBJCOPY" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_TARGET_OBJCOPY="objcopy" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_TARGET_OBJCOPY=$ac_cv_prog_ac_ct_TARGET_OBJCOPY if test -n "$ac_ct_TARGET_OBJCOPY"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_TARGET_OBJCOPY" >&5 printf "%s\n" "$ac_ct_TARGET_OBJCOPY" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_TARGET_OBJCOPY" = x; then TARGET_OBJCOPY="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac TARGET_OBJCOPY=$ac_ct_TARGET_OBJCOPY fi else TARGET_OBJCOPY="$ac_cv_prog_TARGET_OBJCOPY" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_TARGET_STRIP+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$TARGET_STRIP"; then ac_cv_prog_TARGET_STRIP="$TARGET_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_TARGET_STRIP="${ac_tool_prefix}strip" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi TARGET_STRIP=$ac_cv_prog_TARGET_STRIP if test -n "$TARGET_STRIP"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $TARGET_STRIP" >&5 printf "%s\n" "$TARGET_STRIP" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_TARGET_STRIP"; then ac_ct_TARGET_STRIP=$TARGET_STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_TARGET_STRIP+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_TARGET_STRIP"; then ac_cv_prog_ac_ct_TARGET_STRIP="$ac_ct_TARGET_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_TARGET_STRIP="strip" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_TARGET_STRIP=$ac_cv_prog_ac_ct_TARGET_STRIP if test -n "$ac_ct_TARGET_STRIP"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_TARGET_STRIP" >&5 printf "%s\n" "$ac_ct_TARGET_STRIP" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_TARGET_STRIP" = x; then TARGET_STRIP="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac TARGET_STRIP=$ac_ct_TARGET_STRIP fi else TARGET_STRIP="$ac_cv_prog_TARGET_STRIP" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}nm", so it can be a program name with args. set dummy ${ac_tool_prefix}nm; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_TARGET_NM+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$TARGET_NM"; then ac_cv_prog_TARGET_NM="$TARGET_NM" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_TARGET_NM="${ac_tool_prefix}nm" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi TARGET_NM=$ac_cv_prog_TARGET_NM if test -n "$TARGET_NM"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $TARGET_NM" >&5 printf "%s\n" "$TARGET_NM" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_TARGET_NM"; then ac_ct_TARGET_NM=$TARGET_NM # Extract the first word of "nm", so it can be a program name with args. set dummy nm; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_TARGET_NM+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_TARGET_NM"; then ac_cv_prog_ac_ct_TARGET_NM="$ac_ct_TARGET_NM" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_TARGET_NM="nm" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_TARGET_NM=$ac_cv_prog_ac_ct_TARGET_NM if test -n "$ac_ct_TARGET_NM"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_TARGET_NM" >&5 printf "%s\n" "$ac_ct_TARGET_NM" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_TARGET_NM" = x; then TARGET_NM="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac TARGET_NM=$ac_ct_TARGET_NM fi else TARGET_NM="$ac_cv_prog_TARGET_NM" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_TARGET_RANLIB+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$TARGET_RANLIB"; then ac_cv_prog_TARGET_RANLIB="$TARGET_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_TARGET_RANLIB="${ac_tool_prefix}ranlib" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi TARGET_RANLIB=$ac_cv_prog_TARGET_RANLIB if test -n "$TARGET_RANLIB"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $TARGET_RANLIB" >&5 printf "%s\n" "$TARGET_RANLIB" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_TARGET_RANLIB"; then ac_ct_TARGET_RANLIB=$TARGET_RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_TARGET_RANLIB+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_TARGET_RANLIB"; then ac_cv_prog_ac_ct_TARGET_RANLIB="$ac_ct_TARGET_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_TARGET_RANLIB="ranlib" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_TARGET_RANLIB=$ac_cv_prog_ac_ct_TARGET_RANLIB if test -n "$ac_ct_TARGET_RANLIB"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_TARGET_RANLIB" >&5 printf "%s\n" "$ac_ct_TARGET_RANLIB" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_TARGET_RANLIB" = x; then TARGET_RANLIB="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac TARGET_RANLIB=$ac_ct_TARGET_RANLIB fi else TARGET_RANLIB="$ac_cv_prog_TARGET_RANLIB" fi fi # Test the C compiler for the target environment. tmp_CC="$CC" tmp_CFLAGS="$CFLAGS" tmp_LDFLAGS="$LDFLAGS" tmp_CPPFLAGS="$CPPFLAGS" tmp_LIBS="$LIBS" CC="$TARGET_CC" CFLAGS="$TARGET_CFLAGS" CPPFLAGS="$TARGET_CPPFLAGS" LDFLAGS="$TARGET_LDFLAGS" LIBS="" if test "x$target_m32" = x1; then # Force 32-bit mode. TARGET_CFLAGS="$TARGET_CFLAGS -m32" TARGET_CCASFLAGS="$TARGET_CCASFLAGS -m32" TARGET_CPPFLAGS="$TARGET_CPPFLAGS -m32" TARGET_LDFLAGS="$TARGET_LDFLAGS -m32" TARGET_MODULE_FORMAT="elf32" fi if test "x$target_m64" = x1; then # Force 64-bit mode. TARGET_CFLAGS="$TARGET_CFLAGS -m64" TARGET_CCASFLAGS="$TARGET_CCASFLAGS -m64" TARGET_CPPFLAGS="$TARGET_CPPFLAGS -m64" TARGET_LDFLAGS="$TARGET_LDFLAGS -m64" TARGET_MODULE_FORMAT="elf64" fi # debug flags. TARGET_CFLAGS="$TARGET_CFLAGS $WARN_FLAGS -g -Wredundant-decls -Wmissing-prototypes -Wmissing-declarations" TARGET_CCASFLAGS="$TARGET_CCASFLAGS -g" if test "x$target_cpu" != xi386 && test "x$target_cpu" != xx86_64; then TARGET_CFLAGS="$TARGET_CFLAGS -Wcast-align" fi TARGET_CC_VERSION="$(LC_ALL=C $TARGET_CC --version | head -n1)" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking which extra warnings work" >&5 printf %s "checking which extra warnings work... " >&6; } if test ${grub_cv_target_cc_w_extra_flags+y} then : printf %s "(cached) " >&6 else $as_nop LDFLAGS="$TARGET_LDFLAGS -nostdlib -static" grub_cv_target_cc_w_extra_flags= for x in $EXTRA_WARN_FLAGS; do CFLAGS="$TARGET_CFLAGS $x -Werror" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ asm (".globl start; start:"); void __main (void); void __main (void) {} int main (void); int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : flag=1 else $as_nop flag=0 fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext if test x$flag = x1 ; then grub_cv_target_cc_w_extra_flags="$grub_cv_target_cc_w_extra_flags $x" fi done fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $grub_cv_target_cc_w_extra_flags" >&5 printf "%s\n" "$grub_cv_target_cc_w_extra_flags" >&6; } TARGET_CFLAGS="$TARGET_CFLAGS $grub_cv_target_cc_w_extra_flags" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if compiling with clang" >&5 printf %s "checking if compiling with clang... " >&6; } if test ${grub_cv_cc_target_clang+y} then : printf %s "(cached) " >&6 else $as_nop CFLAGS="$TARGET_CFLAGS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { #ifdef __clang__ #error "is clang" #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : grub_cv_cc_target_clang=no else $as_nop grub_cv_cc_target_clang=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $grub_cv_cc_target_clang" >&5 printf "%s\n" "$grub_cv_cc_target_clang" >&6; } if test x$target_cpu = xpowerpc -o x$target_cpu = xmips; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for options to get big-endian compilation" >&5 printf %s "checking for options to get big-endian compilation... " >&6; } if test ${grub_cv_target_cc_big_endian+y} then : printf %s "(cached) " >&6 else $as_nop grub_cv_target_cc_big_endian=no for cand in "-target $target_cpu -Wl,-EB" "-target $target_cpu" \ "-target $target_cpu-linux-gnu -Wl,-EB" "-target $target_cpu-linux-gnu" \ "-EB" "-mbig-endian"; do if test x"$grub_cv_target_cc_big_endian" != xno ; then break fi CFLAGS="$TARGET_CFLAGS $cand -Werror" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__) && (__ORDER_BIG_ENDIAN__ != __BYTE_ORDER__) #error still little endian #endif asm (".globl start; start:"); asm (".globl _start; _start:"); asm (".globl __start; __start:"); void __main (void); void __main (void) {} int main (void); int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : grub_cv_target_cc_big_endian="$cand" fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext done fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $grub_cv_target_cc_big_endian" >&5 printf "%s\n" "$grub_cv_target_cc_big_endian" >&6; } if test x"$grub_cv_target_cc_big_endian" = xno ; then as_fn_error $? "could not force big-endian" "$LINENO" 5 fi skip_linkflags="$(echo "$grub_cv_target_cc_big_endian"|sed 's@-Wl,-EB@@')" TARGET_CFLAGS="$TARGET_CFLAGS $skip_linkflags" TARGET_CPPFLAGS="$TARGET_CPPFLAGS $skip_linkflags" TARGET_CCASFLAGS="$TARGET_CCASFLAGS $skip_linkflags" TARGET_LDFLAGS="$TARGET_LDFLAGS $grub_cv_target_cc_big_endian" elif test x$target_cpu = xmipsel; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for options to get little-endian compilation" >&5 printf %s "checking for options to get little-endian compilation... " >&6; } if test ${grub_cv_target_cc_little_endian+y} then : printf %s "(cached) " >&6 else $as_nop grub_cv_target_cc_little_endian=no for cand in "-target $target_cpu -Wl,-EL" "-target $target_cpu" \ "-target $target_cpu-linux-gnu -Wl,-EL" "-target $target_cpu-linux-gnu" \ "-EL"; do if test x"$grub_cv_target_cc_little_endian" != xno ; then break fi CFLAGS="$TARGET_CFLAGS $cand -Werror" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__) && (__ORDER_BIG_ENDIAN__ == __BYTE_ORDER__) #error still big endian #endif asm (".globl start; start:"); asm (".globl _start; _start:"); asm (".globl __start; __start:"); void __main (void); void __main (void) {} int main (void); int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : grub_cv_target_cc_little_endian="$cand" fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext done fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $grub_cv_target_cc_little_endian" >&5 printf "%s\n" "$grub_cv_target_cc_little_endian" >&6; } if test x"$grub_cv_target_cc_little_endian" = xno ; then as_fn_error $? "could not force little-endian" "$LINENO" 5 fi skip_linkflags="$(echo "$grub_cv_target_cc_little_endian"|sed 's@-Wl,-EL@@')" TARGET_CFLAGS="$TARGET_CFLAGS $skip_linkflags" TARGET_CPPFLAGS="$TARGET_CPPFLAGS $skip_linkflags" TARGET_CCASFLAGS="$TARGET_CCASFLAGS $skip_linkflags" TARGET_LDFLAGS="$TARGET_LDFLAGS $grub_cv_target_cc_little_endian" fi # GRUB code is N32-compliant but it's experimental and we would prefer to # avoid having too much variety when it doesn't result in any real improvement. # Moreover N64 isn't supported. if test "x$target_cpu" = xmips || test "x$target_cpu" = xmipsel ; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for options to force MIPS o32 ABI" >&5 printf %s "checking for options to force MIPS o32 ABI... " >&6; } if test ${grub_cv_target_cc_mips_o32_abi+y} then : printf %s "(cached) " >&6 else $as_nop grub_cv_target_cc_mips_o32_abi=no for arg in "" "-mabi=32" "-target $target_cpu -mabi=32" ; do if test x"$grub_cv_target_cc_mips_o32_abi" != xno ; then break fi CFLAGS="$TARGET_CFLAGS $arg -Werror" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if !defined(_ABIO32) || !defined(_MIPS_SIM) || (_MIPS_SIM != _ABIO32) #error not o32 ABI #endif asm (".globl start; start:"); asm (".globl _start; _start:"); asm (".globl __start; __start:"); void __main (void); void __main (void) {} int main (void); int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : grub_cv_target_cc_mips_o32_abi="$arg" fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext done fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $grub_cv_target_cc_mips_o32_abi" >&5 printf "%s\n" "$grub_cv_target_cc_mips_o32_abi" >&6; } if test x"$grub_cv_target_cc_mips_o32_abi" = xno ; then as_fn_error $? "could not force MIPS o32 ABI" "$LINENO" 5 fi TARGET_CFLAGS="$TARGET_CFLAGS $grub_cv_target_cc_mips_o32_abi" TARGET_CCASFLAGS="$TARGET_CCASFLAGS $grub_cv_target_cc_mips_o32_abi" fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for options to compile assembly" >&5 printf %s "checking for options to compile assembly... " >&6; } if test ${grub_cv_cc_target_asm_compile+y} then : printf %s "(cached) " >&6 else $as_nop test_program= case "x$target_cpu-$platform" in xmips-* | xmipsel-*) test_program=mips ;; xi386-pc) test_program=i386-pc ;; xi386-* | xx86_64-*) test_program=i386 ;; xpowerpc-* | xsparc64-* | xarm-*) test_program=$target_cpu ;; esac if test x"$test_program" = x ; then grub_cv_cc_target_asm_compile= else found=no for arg in "" "-no-integrated-as"; do cmdline="$TARGET_CC -c -o /dev/null $TARGET_CCASFLAGS $arg $TARGET_CPPFLAGS $srcdir/asm-tests/$test_program.S" echo "Running $cmdline" >&5 if $cmdline >&5 2>&5; then grub_cv_cc_target_asm_compile="$arg" found=yes break fi done if test x"$found" = xno ; then as_fn_error $? "could not compile assembly" "$LINENO" 5 fi fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $grub_cv_cc_target_asm_compile" >&5 printf "%s\n" "$grub_cv_cc_target_asm_compile" >&6; } TARGET_CCASFLAGS="$TARGET_CCASFLAGS $grub_cv_cc_target_asm_compile" if test "x$target_cpu" = xi386 && test "x$platform" != xemu; then TARGET_CFLAGS="$TARGET_CFLAGS -march=i386" fi if test "x$grub_cv_cc_target_clang" = xno && test "x$target_cpu" = xi386 && test "x$platform" != xemu && test "x$platform" != xefi; then TARGET_CFLAGS="$TARGET_CFLAGS -mrtd -mregparm=3" fi # on mips redirect cache flushing function to non-existant one. if test "x$target_cpu" = xmips || test "x$target_cpu" = xmipsel ; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether -mflush-func=grub_red_herring works" >&5 printf %s "checking whether -mflush-func=grub_red_herring works... " >&6; } if test ${grub_cv_cc_mflush_func+y} then : printf %s "(cached) " >&6 else $as_nop CFLAGS="$TARGET_CFLAGS -mflush-func=grub_red_herring -Werror" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : grub_cv_cc_mflush_func=yes else $as_nop grub_cv_cc_mflush_func=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $grub_cv_cc_mflush_func" >&5 printf "%s\n" "$grub_cv_cc_mflush_func" >&6; } if test "x$grub_cv_cc_mflush_func" = xyes; then TARGET_CFLAGS="$TARGET_CFLAGS -mflush-func=grub_red_herring" fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether -mno-gpopt works" >&5 printf %s "checking whether -mno-gpopt works... " >&6; } if test ${grub_cv_cc_mno_gpopt+y} then : printf %s "(cached) " >&6 else $as_nop CFLAGS="$TARGET_CFLAGS -mno-gpopt -Werror" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : grub_cv_cc_mno_gpopt=yes else $as_nop grub_cv_cc_mno_gpopt=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $grub_cv_cc_mno_gpopt" >&5 printf "%s\n" "$grub_cv_cc_mno_gpopt" >&6; } if test "x$grub_cv_cc_mno_gpopt" = xyes; then TARGET_CFLAGS="$TARGET_CFLAGS -mno-gpopt" fi fi # Force no alignment to save space on i386. if test "x$target_cpu" = xi386; then TARGET_CFLAGS="$TARGET_CFLAGS -falign-functions=1" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether -falign-loops works" >&5 printf %s "checking whether -falign-loops works... " >&6; } if test ${grub_cv_cc_falign_loop+y} then : printf %s "(cached) " >&6 else $as_nop CFLAGS="$TARGET_CFLAGS -falign-loops=1 -Werror" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : grub_cv_cc_falign_loop=yes else $as_nop grub_cv_cc_falign_loop=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $grub_cv_cc_falign_loop" >&5 printf "%s\n" "$grub_cv_cc_falign_loop" >&6; } if test "x$grub_cv_cc_falign_loop" = xyes; then TARGET_CFLAGS="$TARGET_CFLAGS -falign-loops=1" fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether -falign-jumps works" >&5 printf %s "checking whether -falign-jumps works... " >&6; } if test ${grub_cv_cc_falign_jumps+y} then : printf %s "(cached) " >&6 else $as_nop CFLAGS="$TARGET_CFLAGS -falign-jumps=1 -Werror" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : grub_cv_cc_falign_jumps=yes else $as_nop grub_cv_cc_falign_jumps=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $grub_cv_cc_falign_jumps" >&5 printf "%s\n" "$grub_cv_cc_falign_jumps" >&6; } if test "x$grub_cv_cc_falign_jumps" = xyes; then TARGET_CFLAGS="$TARGET_CFLAGS -falign-jumps=1" fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether -freg-struct-return works" >&5 printf %s "checking whether -freg-struct-return works... " >&6; } if test ${grub_cv_cc_freg_struct_return+y} then : printf %s "(cached) " >&6 else $as_nop CFLAGS="$TARGET_CFLAGS -freg-struct-return -Werror" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : grub_cv_cc_freg_struct_return=yes else $as_nop grub_cv_cc_freg_struct_return=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $grub_cv_cc_freg_struct_return" >&5 printf "%s\n" "$grub_cv_cc_freg_struct_return" >&6; } if test "x$grub_cv_cc_freg_struct_return" = xyes; then TARGET_CFLAGS="$TARGET_CFLAGS -freg-struct-return" fi if ( test "x$target_cpu" = xi386 || test "x$target_cpu" = xx86_64 ) && test "x$platform" != xemu; then # Some toolchains enable these features by default, but they need # registers that aren't set up properly in GRUB. TARGET_CFLAGS="$TARGET_CFLAGS -mno-mmx -mno-sse -mno-sse2 -mno-sse3 -mno-3dnow" fi if ( test "x$target_cpu" = xi386 || test "x$target_cpu" = xx86_64 ); then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether -Wa,-mx86-used-note works" >&5 printf %s "checking whether -Wa,-mx86-used-note works... " >&6; } if test ${grub_cv_cc_mx86_used_note+y} then : printf %s "(cached) " >&6 else $as_nop CFLAGS="$TARGET_CFLAGS -Wa,-mx86-used-note=no -Werror" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : grub_cv_cc_mx86_used_note=yes else $as_nop grub_cv_cc_mx86_used_note=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $grub_cv_cc_mx86_used_note" >&5 printf "%s\n" "$grub_cv_cc_mx86_used_note" >&6; } if test "x$grub_cv_cc_mx86_used_note" = xyes; then TARGET_CFLAGS="$TARGET_CFLAGS -Wa,-mx86-used-note=no" TARGET_CCASFLAGS="$TARGET_CCASFLAGS -Wa,-mx86-used-note=no" fi fi if test "x$target_cpu" = xloongarch64; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether _mno_explicit_relocs works" >&5 printf %s "checking whether _mno_explicit_relocs works... " >&6; } if test ${grub_cv_cc_mno_explicit_relocs+y} then : printf %s "(cached) " >&6 else $as_nop CFLAGS="$TARGET_CFLAGS -mno-explicit-relocs -Werror" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : grub_cv_cc_mno_explicit_relocs=yes else $as_nop grub_cv_cc_mno_explicit_relocs=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $grub_cv_cc_mno_explicit_relocs" >&5 printf "%s\n" "$grub_cv_cc_mno_explicit_relocs" >&6; } if test "x$grub_cv_cc_mno_explicit_relocs" = xyes; then TARGET_CFLAGS="$TARGET_CFLAGS -mno-explicit-relocs -fno-plt" TARGET_CCASFLAGS="$TARGET_CCASFLAGS -mno-explicit-relocs -fno-plt" fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for no-relax options" >&5 printf %s "checking for no-relax options... " >&6; } if test ${grub_cv_target_cc_mno_relax+y} then : printf %s "(cached) " >&6 else $as_nop grub_cv_target_cc_mno_relax=no for cand in "-mno-relax" "-Wa,-mno-relax"; do if test x"$grub_cv_target_cc_mno_relax" != xno ; then break fi CFLAGS="$TARGET_CFLAGS $cand -Werror" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ asm (".globl start; start:"); void __main (void); void __main (void) {} int main (void); int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : grub_cv_target_cc_mno_relax="$cand" fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext done fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $grub_cv_target_cc_mno_relax" >&5 printf "%s\n" "$grub_cv_target_cc_mno_relax" >&6; } CFLAGS="$TARGET_CFLAGS" if test x"$grub_cv_target_cc_mno_relax" != xno ; then TARGET_CFLAGS="$TARGET_CFLAGS $grub_cv_target_cc_mno_relax" TARGET_CCASFLAGS="$TARGET_CCASFLAGS $grub_cv_target_cc_mno_relax" fi TARGET_CFLAGS="$TARGET_CFLAGS -Wa,-mla-global-with-abs" TARGET_CCASFLAGS="$TARGET_CCASFLAGS -Wa,-mla-global-with-abs" fi if test "x$target_cpu" = xriscv64 || test "x$target_cpu" = xriscv32; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for no-relax options" >&5 printf %s "checking for no-relax options... " >&6; } if test ${grub_cv_target_cc_mno_relax+y} then : printf %s "(cached) " >&6 else $as_nop grub_cv_target_cc_mno_relax=no for cand in "-mno-relax" "-Wa,-mno-relax"; do if test x"$grub_cv_target_cc_mno_relax" != xno ; then break fi CFLAGS="$TARGET_CFLAGS $cand -Werror" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ asm (".globl start; start:"); void __main (void); void __main (void) {} int main (void); int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : grub_cv_target_cc_mno_relax="$cand" fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext done fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $grub_cv_target_cc_mno_relax" >&5 printf "%s\n" "$grub_cv_target_cc_mno_relax" >&6; } CFLAGS="$TARGET_CFLAGS" if test x"$grub_cv_target_cc_mno_relax" != xno ; then TARGET_CFLAGS="$TARGET_CFLAGS $grub_cv_target_cc_mno_relax" TARGET_CCASFLAGS="$TARGET_CCASFLAGS $grub_cv_target_cc_mno_relax" fi fi # GRUB doesn't use float or doubles at all. Yet some toolchains may decide # that floats are a good fit to run instead of what's written in the code. # Given that floating point unit is disabled (if present to begin with) # when GRUB is running which may result in various hard crashes. if test x"$platform" != xemu ; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for options to get soft-float" >&5 printf %s "checking for options to get soft-float... " >&6; } if test ${grub_cv_target_cc_soft_float+y} then : printf %s "(cached) " >&6 else $as_nop grub_cv_target_cc_soft_float=no if test "x$target_cpu" = xarm64; then CFLAGS="$TARGET_CFLAGS -mgeneral-regs-only -Werror" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : grub_cv_target_cc_soft_float="-mgeneral-regs-only" fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi if test "x$target_cpu" = xriscv32; then CFLAGS="$TARGET_CFLAGS -march=rv32imac -mabi=ilp32 -Werror" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : grub_cv_target_cc_soft_float="-march=rv32imac -mabi=ilp32" fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext # ISA spec version 20191213 factored out extensions Zicsr and Zifencei CFLAGS="$TARGET_CFLAGS -march=rv32imac_zicsr_zifencei -mabi=ilp32 -Werror" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : grub_cv_target_cc_soft_float="-march=rv32imac_zicsr_zifencei -mabi=ilp32" fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi if test "x$target_cpu" = xriscv64; then CFLAGS="$TARGET_CFLAGS -march=rv64imac -mabi=lp64 -Werror" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : grub_cv_target_cc_soft_float="-march=rv64imac -mabi=lp64" fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext # ISA spec version 20191213 factored out extensions Zicsr and Zifencei CFLAGS="$TARGET_CFLAGS -march=rv64imac_zicsr_zifencei -mabi=lp64 -Werror" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : grub_cv_target_cc_soft_float="-march=rv64imac_zicsr_zifencei -mabi=lp64" fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi if test "x$target_cpu" = xia64; then CFLAGS="$TARGET_CFLAGS -mno-inline-float-divide -mno-inline-sqrt -Werror" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : grub_cv_target_cc_soft_float="-mno-inline-float-divide -mno-inline-sqrt" fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi if test "x$target_cpu" = xsh4; then CFLAGS="$TARGET_CFLAGS -m4-nofpu -Werror" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : grub_cv_target_cc_soft_float="-m4-nofpu" fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi for cand in "-msoft-float -Xclang -msoft-float -Xclang -no-implicit-float" \ "-Xclang -msoft-float -Xclang -no-implicit-float" \ "-Xclang -msoft-float" "-msoft-float"; do if test x"$grub_cv_target_cc_soft_float" != xno ; then break fi CFLAGS="$TARGET_CFLAGS $cand -Werror" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : grub_cv_target_cc_soft_float="$cand" fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext done fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $grub_cv_target_cc_soft_float" >&5 printf "%s\n" "$grub_cv_target_cc_soft_float" >&6; } if test x"$grub_cv_target_cc_soft_float" = xno ; then as_fn_error $? "could not force soft-float" "$LINENO" 5 fi case x"$grub_cv_target_cc_soft_float" in x*"-Xclang"*) # A trick so that clang doesn't see it on link stаge TARGET_CPPFLAGS="$TARGET_CPPFLAGS $grub_cv_target_cc_soft_float" ;; *) TARGET_CFLAGS="$TARGET_CFLAGS $grub_cv_target_cc_soft_float" ;; esac TARGET_CCASFLAGS="$TARGET_CCASFLAGS $grub_cv_target_cc_soft_float" fi if test x"$target_cpu" = xsparc64 ; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for options to reserve application registers" >&5 printf %s "checking for options to reserve application registers... " >&6; } if test ${grub_cv_target_cc_mno_app_regs+y} then : printf %s "(cached) " >&6 else $as_nop grub_cv_target_cc_mno_app_regs=no for cand in "-mllvm -sparc-reserve-app-registers" \ "-mno-app-regs"; do if test x"$grub_cv_target_cc_mno_app_regs" != xno ; then break fi CFLAGS="$TARGET_CFLAGS $cand -Werror" CPPFLAGS="$TARGET_CPPFLAGS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : grub_cv_target_cc_mno_app_regs="$cand" fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext done fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $grub_cv_target_cc_mno_app_regs" >&5 printf "%s\n" "$grub_cv_target_cc_mno_app_regs" >&6; } if test x"$grub_cv_target_cc_mno_app_regs" = xno ; then as_fn_error $? "could not reserve application registers" "$LINENO" 5 fi if test x"$grub_cv_target_cc_mno_app_regs" = x"-mllvm -sparc-reserve-app-registers" ; then # A trick so that clang doesn't see it on link stаge TARGET_CPPFLAGS="$TARGET_CPPFLAGS $grub_cv_target_cc_mno_app_regs" else TARGET_CFLAGS="$TARGET_CFLAGS $grub_cv_target_cc_mno_app_regs" fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for no-relax options" >&5 printf %s "checking for no-relax options... " >&6; } if test ${grub_cv_target_cc_mno_relax+y} then : printf %s "(cached) " >&6 else $as_nop grub_cv_target_cc_mno_relax=no for cand in "-mno-relax" "-Wl,--no-relax"; do if test x"$grub_cv_target_cc_mno_relax" != xno ; then break fi LDFLAGS="$TARGET_LDFLAGS $cand -nostdlib -static" CFLAGS="$TARGET_CFLAGS -Werror" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ asm (".globl start; start:"); void __main (void); void __main (void) {} int main (void); int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : grub_cv_target_cc_mno_relax="$cand" fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext done fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $grub_cv_target_cc_mno_relax" >&5 printf "%s\n" "$grub_cv_target_cc_mno_relax" >&6; } LDFLAGS="$TARGET_LDFLAGS" CFLAGS="$TARGET_CFLAGS" if test x"$grub_cv_target_cc_mno_relax" = xno ; then as_fn_error $? "could not find no-relax options" "$LINENO" 5 fi TARGET_LDFLAGS="$TARGET_LDFLAGS $grub_cv_target_cc_mno_relax" fi # The backtrace module relies on frame pointers and the default optimization # level, -Os, omits them. Make sure they are enabled. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether -fno-omit-frame-pointer works" >&5 printf %s "checking whether -fno-omit-frame-pointer works... " >&6; } if test ${grub_cv_cc_fno_omit_frame_pointer+y} then : printf %s "(cached) " >&6 else $as_nop CFLAGS="$TARGET_CFLAGS -fno-omit-frame-pointer" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : grub_cv_cc_fno_omit_frame_pointer=yes else $as_nop grub_cv_cc_fno_omit_frame_pointer=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $grub_cv_cc_fno_omit_frame_pointer" >&5 printf "%s\n" "$grub_cv_cc_fno_omit_frame_pointer" >&6; } if test "x$grub_cv_cc_fno_omit_frame_pointer" = xyes; then TARGET_CFLAGS="$TARGET_CFLAGS -fno-omit-frame-pointer" fi # By default, GCC 4.4 generates .eh_frame sections containing unwind # information in some cases where it previously did not. GRUB doesn't need # these and they just use up vital space. Restore the old compiler # behaviour. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether -fno-dwarf2-cfi-asm works" >&5 printf %s "checking whether -fno-dwarf2-cfi-asm works... " >&6; } if test ${grub_cv_cc_fno_dwarf2_cfi_asm+y} then : printf %s "(cached) " >&6 else $as_nop CFLAGS="$TARGET_CFLAGS -fno-dwarf2-cfi-asm" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : grub_cv_cc_fno_dwarf2_cfi_asm=yes else $as_nop grub_cv_cc_fno_dwarf2_cfi_asm=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $grub_cv_cc_fno_dwarf2_cfi_asm" >&5 printf "%s\n" "$grub_cv_cc_fno_dwarf2_cfi_asm" >&6; } if test "x$grub_cv_cc_fno_dwarf2_cfi_asm" = xyes; then TARGET_CFLAGS="$TARGET_CFLAGS -fno-dwarf2-cfi-asm" fi if test x"$target_os" = xcygwin; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether option -fno-reorder-functions works" >&5 printf %s "checking whether option -fno-reorder-functions works... " >&6; } if test ${grub_cv_cc_no_reorder_functions+y} then : printf %s "(cached) " >&6 else $as_nop CFLAGS="$TARGET_CFLAGS -fno-reorder-functions" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : grub_cv_cc_no_reorder_functions=yes else $as_nop grub_cv_cc_no_reorder_functions=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $grub_cv_cc_no_reorder_functions" >&5 printf "%s\n" "$grub_cv_cc_no_reorder_functions" >&6; } fi if test x"$target_os" = xcygwin && test "x$grub_cv_cc_no_reorder_functions" = xyes; then TARGET_CFLAGS="$TARGET_CFLAGS -fno-reorder-functions" fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether -mno-stack-arg-probe works" >&5 printf %s "checking whether -mno-stack-arg-probe works... " >&6; } if test ${grub_cv_cc_mno_stack_arg_probe+y} then : printf %s "(cached) " >&6 else $as_nop CFLAGS="$TARGET_CFLAGS -mno-stack-arg-probe" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : grub_cv_cc_mno_stack_arg_probe=yes else $as_nop grub_cv_cc_mno_stack_arg_probe=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $grub_cv_cc_mno_stack_arg_probe" >&5 printf "%s\n" "$grub_cv_cc_mno_stack_arg_probe" >&6; } if test "x$grub_cv_cc_mno_stack_arg_probe" = xyes; then TARGET_CFLAGS="$TARGET_CFLAGS -mno-stack-arg-probe" fi # By default, GCC 4.6 generates .eh_frame sections containing unwind # information in some cases where it previously did not. GRUB doesn't need # these and they just use up vital space. Restore the old compiler # behaviour. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether -fno-asynchronous-unwind-tables works" >&5 printf %s "checking whether -fno-asynchronous-unwind-tables works... " >&6; } if test ${grub_cv_cc_fno_asynchronous_unwind_tables+y} then : printf %s "(cached) " >&6 else $as_nop CFLAGS="$TARGET_CFLAGS -fno-asynchronous-unwind-tables" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : grub_cv_cc_fno_asynchronous_unwind_tables=yes else $as_nop grub_cv_cc_fno_asynchronous_unwind_tables=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $grub_cv_cc_fno_asynchronous_unwind_tables" >&5 printf "%s\n" "$grub_cv_cc_fno_asynchronous_unwind_tables" >&6; } if test "x$grub_cv_cc_fno_asynchronous_unwind_tables" = xyes; then TARGET_CFLAGS="$TARGET_CFLAGS -fno-asynchronous-unwind-tables" fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether -fno-unwind-tables works" >&5 printf %s "checking whether -fno-unwind-tables works... " >&6; } if test ${grub_cv_cc_fno_unwind_tables+y} then : printf %s "(cached) " >&6 else $as_nop CFLAGS="$TARGET_CFLAGS -fno-unwind-tables" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : grub_cv_cc_fno_unwind_tables=yes else $as_nop grub_cv_cc_fno_unwind_tables=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $grub_cv_cc_fno_unwind_tables" >&5 printf "%s\n" "$grub_cv_cc_fno_unwind_tables" >&6; } if test "x$grub_cv_cc_fno_unwind_tables" = xyes; then TARGET_CFLAGS="$TARGET_CFLAGS -fno-unwind-tables" fi # Do not generate .ident sections. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether -fno-ident works" >&5 printf %s "checking whether -fno-ident works... " >&6; } if test ${grub_cv_cc_fno_ident+y} then : printf %s "(cached) " >&6 else $as_nop CFLAGS="$TARGET_CFLAGS -fno-ident" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : grub_cv_cc_fno_ident=yes else $as_nop grub_cv_cc_fno_ident=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $grub_cv_cc_fno_ident" >&5 printf "%s\n" "$grub_cv_cc_fno_ident" >&6; } if test "x$grub_cv_cc_fno_ident" = xyes; then TARGET_CFLAGS="$TARGET_CFLAGS -fno-ident" fi CFLAGS="$TARGET_CFLAGS" if test x"$platform" = xemu ; then TARGET_OBJ2ELF= grub_cv_target_cc_link_format= case "$host_os" in *darwin* | *mac*) grub_cv_target_cc_link_format="-arch,${target_cpu}" TARGET_LDFLAGS="$TARGET_LDFLAGS -Wl,$grub_cv_target_cc_link_format" ;; *windows* | *cygwin* | *mingw*) if test x${target_cpu} = xi386 ; then grub_cv_target_cc_link_format=-mi386pe TARGET_OBJ2ELF='./build-grub-pe2elf$(BUILD_EXEEXT)' fi if test x${target_cpu} = xx86_64 ; then grub_cv_target_cc_link_format=-mi386pep TARGET_OBJ2ELF='./build-grub-pep2elf$(BUILD_EXEEXT)' fi TARGET_LDFLAGS="$TARGET_LDFLAGS -Wl,$grub_cv_target_cc_link_format" ;; esac elif test x"$target_cpu" = xi386 || test x"$target_cpu" = xx86_64; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for target linking format" >&5 printf %s "checking for target linking format... " >&6; } if test ${grub_cv_target_cc_link_format+y} then : printf %s "(cached) " >&6 else $as_nop grub_cv_target_cc_link_format=unknown for format in -melf_${target_cpu} -melf_${target_cpu}_fbsd -melf_${target_cpu}_obsd -melf_${target_cpu}_haiku -mi386pe -mi386pep -arch,${target_cpu}; do if test x${target_cpu} != xi386 && test x$format = x-mi386pe; then continue fi if test x${target_cpu} != xx86_64 && test x$format = x-mi386pep; then continue fi CFLAGS="$TARGET_CFLAGS" LDFLAGS="$TARGET_LDFLAGS -Wl,$format -nostdlib -static" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ asm (".globl start; start:"); asm (".globl _start; _start:"); asm (".globl __start; __start:"); void __main (void); void __main (void) {} int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : flag=1 else $as_nop flag=0 fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext if test x"$flag" = x1; then grub_cv_target_cc_link_format="$format" break fi done fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $grub_cv_target_cc_link_format" >&5 printf "%s\n" "$grub_cv_target_cc_link_format" >&6; } if test x"$grub_cv_target_cc_link_format" = xunknown; then as_fn_error $? "no suitable link format found" "$LINENO" 5 fi TARGET_LDFLAGS="$TARGET_LDFLAGS -Wl,$grub_cv_target_cc_link_format" if test x"$grub_cv_target_cc_link_format" = x-mi386pe ; then TARGET_OBJ2ELF='./build-grub-pe2elf$(BUILD_EXEEXT)' fi if test x"$grub_cv_target_cc_link_format" = x-mi386pep ; then TARGET_OBJ2ELF='./build-grub-pep2elf$(BUILD_EXEEXT)' fi fi if test x$grub_cv_target_cc_link_format = x-arch,i386 || test x$grub_cv_target_cc_link_format = x-arch,x86_64; then TARGET_APPLE_LINKER=1 # Extract the first word of "objconv", so it can be a program name with args. set dummy objconv; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_TARGET_OBJCONV+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$TARGET_OBJCONV"; then ac_cv_prog_TARGET_OBJCONV="$TARGET_OBJCONV" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_TARGET_OBJCONV="objconv" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi TARGET_OBJCONV=$ac_cv_prog_TARGET_OBJCONV if test -n "$TARGET_OBJCONV"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $TARGET_OBJCONV" >&5 printf "%s\n" "$TARGET_OBJCONV" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$TARGET_OBJCONV" = x ; then # Extract the first word of "objconv", so it can be a program name with args. set dummy objconv; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_TARGET_OBJCONV+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$TARGET_OBJCONV"; then ac_cv_prog_TARGET_OBJCONV="$TARGET_OBJCONV" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in . do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_TARGET_OBJCONV="./objconv" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi TARGET_OBJCONV=$ac_cv_prog_TARGET_OBJCONV if test -n "$TARGET_OBJCONV"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $TARGET_OBJCONV" >&5 printf "%s\n" "$TARGET_OBJCONV" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test "x$TARGET_OBJCONV" = x ; then as_fn_error $? "objconv not found which is required when building with apple compiler" "$LINENO" 5 fi TARGET_IMG_LDSCRIPT= TARGET_IMG_CFLAGS="-static" TARGET_IMG_LDFLAGS='-nostdlib -static -Wl,-preload -Wl,-segalign,20' TARGET_IMG_LDFLAGS_AC='-nostdlib -static -Wl,-preload -Wl,-segalign,20' TARGET_IMG_BASE_LDOPT="-Wl,-image_base" TARGET_LDFLAGS_OLDMAGIC="" elif test x$grub_cv_target_cc_link_format = x-mi386pe || test x$grub_cv_target_cc_link_format = x-mi386pep ; then TARGET_APPLE_LINKER=0 TARGET_LDFLAGS_OLDMAGIC="-Wl,-N" TARGET_IMG_LDSCRIPT='$(top_srcdir)'"/conf/i386-cygwin-img-ld.sc" TARGET_IMG_LDFLAGS="-Wl,-T${TARGET_IMG_LDSCRIPT}" TARGET_IMG_LDFLAGS_AC="-Wl,-T${srcdir}/conf/i386-cygwin-img-ld.sc" TARGET_IMG_BASE_LDOPT="-Wl,-Ttext" TARGET_IMG_CFLAGS= else TARGET_APPLE_LINKER=0 TARGET_LDFLAGS_OLDMAGIC="-Wl,-N" TARGET_IMG_LDSCRIPT= TARGET_IMG_LDFLAGS='-Wl,-N' TARGET_IMG_LDFLAGS_AC='-Wl,-N' TARGET_IMG_BASE_LDOPT="-Wl,-Ttext" TARGET_IMG_CFLAGS= fi CFLAGS="$TARGET_CFLAGS" # Check whether --enable-efiemu was given. if test ${enable_efiemu+y} then : enableval=$enable_efiemu; fi if test x"$enable_efiemu" = xno ; then efiemu_excuse="explicitly disabled" fi if test x"$grub_cv_target_cc_link_format" = x-mi386pe || test x"$grub_cv_target_cc_link_format" = x-mi386pep ; then efiemu_excuse="not available on cygwin" fi if test x"$target_cpu" != xi386 ; then efiemu_excuse="only available on i386" fi if test x"$platform" = xefi ; then efiemu_excuse="not available on efi" fi if test x"$efiemu_excuse" = x ; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether options required for efiemu work" >&5 printf %s "checking whether options required for efiemu work... " >&6; } if test ${grub_cv_cc_efiemu+y} then : printf %s "(cached) " >&6 else $as_nop CFLAGS="-m64 -nostdlib -O2 -mcmodel=large -mno-red-zone" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : grub_cv_cc_efiemu=yes else $as_nop grub_cv_cc_efiemu=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $grub_cv_cc_efiemu" >&5 printf "%s\n" "$grub_cv_cc_efiemu" >&6; } if test x$grub_cv_cc_efiemu = xno; then efiemu_excuse="cannot compile with -m64 -mcmodel=large -mno-red-zone -nostdlib" fi fi if test x"$efiemu_excuse" = x ; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for efiemu64 linking format" >&5 printf %s "checking for efiemu64 linking format... " >&6; } if test ${grub_cv_target_cc_efiemu64_link_format+y} then : printf %s "(cached) " >&6 else $as_nop grub_cv_target_cc_efiemu64_link_format=unknown for format in -melf_x86_64 -melf_x86_64_fbsd -melf_x86_64_obsd -melf_x86_64_haiku -arch,x86_64; do CFLAGS="-m64 -nostdlib -O2 -mcmodel=large -mno-red-zone" LDFLAGS="-m64 -Wl,$format -nostdlib -static" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ asm (".globl start; start:"); asm (".globl _start; _start:"); asm (".globl __start; __start:"); void __main (void); void __main (void) {} int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : flag=1 else $as_nop flag=0 fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext if test x"$flag" = x1; then grub_cv_target_cc_efiemu64_link_format="$format" break fi done fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $grub_cv_target_cc_efiemu64_link_format" >&5 printf "%s\n" "$grub_cv_target_cc_efiemu64_link_format" >&6; } if test x"$grub_cv_target_cc_efiemu64_link_format" = xunknown; then efiemu_excuse="no suitable link format for efiemu64 found" else EFIEMU64_LINK_FORMAT="-Wl,$grub_cv_target_cc_efiemu64_link_format" fi fi if test x"$enable_efiemu" = xyes && test x"$efiemu_excuse" != x ; then as_fn_error $? "efiemu runtime was explicitly requested but can't be compiled ($efiemu_excuse)" "$LINENO" 5 fi if test x"$efiemu_excuse" = x ; then enable_efiemu=yes else enable_efiemu=no fi CFLAGS="$TARGET_CFLAGS" LDFLAGS="$TARGET_LDFLAGS" if test "$target_cpu" = x86_64 || test "$target_cpu" = sparc64 || test "$target_cpu" = riscv64 ; then # Use large model to support 4G memory { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether option -mcmodel=large works" >&5 printf %s "checking whether option -mcmodel=large works... " >&6; } if test ${grub_cv_cc_mcmodel+y} then : printf %s "(cached) " >&6 else $as_nop CFLAGS="$TARGET_CFLAGS -mcmodel=large" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : grub_cv_cc_mcmodel=yes else $as_nop grub_cv_cc_mcmodel=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $grub_cv_cc_mcmodel" >&5 printf "%s\n" "$grub_cv_cc_mcmodel" >&6; } if test "x$grub_cv_cc_mcmodel" = xyes; then TARGET_CFLAGS="$TARGET_CFLAGS -mcmodel=large" elif test "$target_cpu" = sparc64 || test "$target_cpu" = riscv64; then TARGET_CFLAGS="$TARGET_CFLAGS -mcmodel=medany" fi fi if test "$target_cpu"-"$platform" = x86_64-efi; then # EFI writes to stack below %rsp, we must not use the red zone { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether option -mno-red-zone works" >&5 printf %s "checking whether option -mno-red-zone works... " >&6; } if test ${grub_cv_cc_no_red_zone+y} then : printf %s "(cached) " >&6 else $as_nop CFLAGS="$TARGET_CFLAGS -mno-red-zone" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : grub_cv_cc_no_red_zone=yes else $as_nop grub_cv_cc_no_red_zone=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $grub_cv_cc_no_red_zone" >&5 printf "%s\n" "$grub_cv_cc_no_red_zone" >&6; } if test "x$grub_cv_cc_no_red_zone" = xno; then as_fn_error $? "-mno-red-zone not supported, upgrade your gcc" "$LINENO" 5 fi TARGET_CFLAGS="$TARGET_CFLAGS -mno-red-zone" fi if test "x$target_cpu" = xarm; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for options to disable movt and movw" >&5 printf %s "checking for options to disable movt and movw... " >&6; } if test ${grub_cv_target_cc_mno_movt+y} then : printf %s "(cached) " >&6 else $as_nop grub_cv_target_cc_mno_movt=no for cand in "-mno-movt" \ "-mllvm -arm-use-movt=0" \ "-mword-relocations"; do if test x"$grub_cv_target_cc_mno_movt" != xno ; then break fi CFLAGS="$TARGET_CFLAGS $cand -Werror" CPPFLAGS="$TARGET_CPPFLAGS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : grub_cv_target_cc_mno_movt="$cand" fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext done fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $grub_cv_target_cc_mno_movt" >&5 printf "%s\n" "$grub_cv_target_cc_mno_movt" >&6; } if test x"$grub_cv_target_cc_mno_movt" != xno ; then # A trick so that clang doesn't see it on link stage TARGET_CPPFLAGS="$TARGET_CPPFLAGS $grub_cv_target_cc_mno_movt" fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether option -mthumb-interwork works" >&5 printf %s "checking whether option -mthumb-interwork works... " >&6; } if test ${grub_cv_cc_mthumb_interwork+y} then : printf %s "(cached) " >&6 else $as_nop CFLAGS="$TARGET_CFLAGS -mthumb-interwork -Werror" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : grub_cv_cc_mthumb_interwork=yes else $as_nop grub_cv_cc_mthumb_interwork=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $grub_cv_cc_mthumb_interwork" >&5 printf "%s\n" "$grub_cv_cc_mthumb_interwork" >&6; } if test "x$grub_cv_cc_mthumb_interwork" = xyes; then TARGET_CFLAGS="$TARGET_CFLAGS -mthumb-interwork" # Clang defaults to thumb interworking elif test "x$grub_cv_cc_target_clang" = xno ; then as_fn_error $? "your compiler doesn't support -mthumb-interwork" "$LINENO" 5 fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether option -Qn works" >&5 printf %s "checking whether option -Qn works... " >&6; } if test ${grub_cv_target_cc_qn+y} then : printf %s "(cached) " >&6 else $as_nop CFLAGS="$TARGET_CFLAGS -Qn -Qunused-arguments -Werror" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : grub_cv_target_cc_qn=yes else $as_nop grub_cv_target_cc_qn=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $grub_cv_target_cc_qn" >&5 printf "%s\n" "$grub_cv_target_cc_qn" >&6; } if test "x$grub_cv_target_cc_qn" = xyes; then TARGET_CFLAGS="$TARGET_CFLAGS -Qn -Qunused-arguments" fi # # Compiler features. # CFLAGS="$TARGET_CFLAGS" # Position independent executable. # Position independent executable. pie_possible=yes { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether \`$CC' has \`-fPIE' as default" >&5 printf %s "checking whether \`$CC' has \`-fPIE' as default... " >&6; } # Is this a reliable test case? cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __PIE__ int main() { return 0; } #else #error NO __PIE__ DEFINED #endif _ACEOF # `$CC -c -o ...' might not be portable. But, oh, well... Is calling # `ac_compile' like this correct, after all? if eval "$ac_compile -S -o conftest.s" 2> /dev/null; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } # Should we clear up other files as well, having called `AC_LANG_CONFTEST'? rm -f conftest.s else pie_possible=no { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether linker accepts -no-pie" >&5 printf %s "checking whether linker accepts -no-pie... " >&6; } if test ${grub_cv_cc_ld_no_pie+y} then : printf %s "(cached) " >&6 else $as_nop save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -no-pie -nostdlib -Werror" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : grub_cv_cc_ld_no_pie=yes else $as_nop grub_cv_cc_ld_no_pie=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $grub_cv_cc_ld_no_pie" >&5 printf "%s\n" "$grub_cv_cc_ld_no_pie" >&6; } nopie_possible=no if test "x$grub_cv_cc_ld_no_pie" = xyes ; then nopie_possible=yes fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether linker accepts -nopie" >&5 printf %s "checking whether linker accepts -nopie... " >&6; } if test ${grub_cv_cc_ld_no_pie_oneword+y} then : printf %s "(cached) " >&6 else $as_nop save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -nopie -nostdlib -Werror" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : grub_cv_cc_ld_no_pie_oneword=yes else $as_nop grub_cv_cc_ld_no_pie_oneword=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $grub_cv_cc_ld_no_pie_oneword" >&5 printf "%s\n" "$grub_cv_cc_ld_no_pie_oneword" >&6; } nopie_oneword_possible=no if test "x$grub_cv_cc_ld_no_pie_oneword" = xyes ; then nopie_oneword_possible=yes fi # Position independent executable. link_nopie_needed=no { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether linker needs disabling of PIE to work" >&5 printf %s "checking whether linker needs disabling of PIE to work... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ _ACEOF if eval "$ac_compile -Wl,-r -nostdlib -Werror -o conftest.o" 2> /dev/null; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } # Should we clear up other files as well, having called `AC_LANG_CONFTEST'? rm -f conftest.o else link_nopie_needed=yes { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } fi # Need that, because some distributions ship compilers that include # `-fPIE' or '-fpie' and '-pie' in the default specs. if [ x"$pie_possible" = xyes ]; then TARGET_CFLAGS="$TARGET_CFLAGS -fno-PIE -fno-pie" TARGET_CCASFLAGS="$TARGET_CCASFLAGS -fno-PIE -fno-pie" fi if [ x"$link_nopie_needed" = xyes ] || [ x"$pie_possible" = xyes ]; then if [ x"$nopie_possible" = xyes ]; then TARGET_LDFLAGS="$TARGET_LDFLAGS -no-pie" fi if [ x"$nopie_oneword_possible" = xyes ]; then TARGET_LDFLAGS="$TARGET_LDFLAGS -nopie" fi fi CFLAGS="$TARGET_CFLAGS" LDFLAGS="$TARGET_LDFLAGS" # Position independent executable. # Position independent executable. pic_possible=yes { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether \`$CC' has \`-fPIC' as default" >&5 printf %s "checking whether \`$CC' has \`-fPIC' as default... " >&6; } # Is this a reliable test case? cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __PIC__ int main() { return 0; } #else #error NO __PIC__ DEFINED #endif _ACEOF # `$CC -c -o ...' might not be portable. But, oh, well... Is calling # `ac_compile' like this correct, after all? if eval "$ac_compile -S -o conftest.s" 2> /dev/null; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } # Should we clear up other files as well, having called `AC_LANG_CONFTEST'? rm -f conftest.s else pic_possible=no { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi # On most platforms we don't want PIC as it only makes relocations harder # and code less efficient. On mips we want to have one got table per module # and reload $gp in every function. # GCC implements it using symbol __gnu_local_gp in non-PIC as well. # However with clang we need PIC for this reloading to happen. # With arm64 we need relocations that are in some way representable in # PE as we need to support arm64-efi. Without -fPIC clang generates # movk's which aren't representable. # Since default varies across dictributions use either -fPIC or -fno-PIC # explicitly. if ( test x$target_cpu = xmips || test x$target_cpu = xmipsel || test x$target_cpu = xarm64 ) && test "x$grub_cv_cc_target_clang" = xyes ; then TARGET_CFLAGS="$TARGET_CFLAGS -fPIC" elif [ x"$pic_possible" = xyes ]; then TARGET_CFLAGS="$TARGET_CFLAGS -fno-PIC" fi CFLAGS="$TARGET_CFLAGS" # Stack smashing protector. # Stack smashing protector. ssp_possible=yes { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether \`$CC' accepts \`-fstack-protector'" >&5 printf %s "checking whether \`$CC' accepts \`-fstack-protector'... " >&6; } # Is this a reliable test case? cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ void foo (void) { volatile char a[8]; a[3]; } _ACEOF # `$CC -c -o ...' might not be portable. But, oh, well... Is calling # `ac_compile' like this correct, after all? if eval "$ac_compile -S -fstack-protector -o conftest.s" 2> /dev/null; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } # Should we clear up other files as well, having called `AC_LANG_CONFTEST'? rm -f conftest.s else ssp_possible=no { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi # Strong stack smashing protector. ssp_strong_possible=yes { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether \`$CC' accepts \`-fstack-protector-strong'" >&5 printf %s "checking whether \`$CC' accepts \`-fstack-protector-strong'... " >&6; } # Is this a reliable test case? cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ void foo (void) { volatile char a[8]; a[3]; } _ACEOF # `$CC -c -o ...' might not be portable. But, oh, well... Is calling # `ac_compile' like this correct, after all? if eval "$ac_compile -S -fstack-protector-strong -o conftest.s" 2> /dev/null; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } # Should we clear up other files as well, having called `AC_LANG_CONFTEST'? rm -f conftest.s else ssp_strong_possible=no { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi # Global stack smashing protector. ssp_global_possible=yes { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether \`$CC' accepts \`-mstack-protector-guard=global'" >&5 printf %s "checking whether \`$CC' accepts \`-mstack-protector-guard=global'... " >&6; } # Is this a reliable test case? cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ void foo (void) { volatile char a[8]; a[3]; } _ACEOF # `$CC -c -o ...' might not be portable. But, oh, well... Is calling # `ac_compile' like this correct, after all? if eval "$ac_compile -S -fstack-protector -mstack-protector-guard=global -o conftest.s" 2> /dev/null; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } # Should we clear up other files as well, having called `AC_LANG_CONFTEST'? rm -f conftest.s else ssp_global_possible=no { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi # Check whether --enable-stack-protector was given. if test ${enable_stack_protector+y} then : enableval=$enable_stack_protector; else $as_nop enable_stack_protector=no fi if test "x$enable_stack_protector" = xno; then if test "x$ssp_possible" = xyes; then # Need that, because some distributions ship compilers that include # `-fstack-protector' in the default specs. TARGET_CFLAGS="$TARGET_CFLAGS -fno-stack-protector" fi elif test "x$platform" != xefi; then if test "$ERROR_PLATFORM_NOT_SUPPORT_SSP" = "yes"; then as_fn_error $? "--enable-stack-protector is only supported on EFI platforms" "$LINENO" 5 else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: --enable-stack-protector is only supported on EFI platforms" >&5 printf "%s\n" "$as_me: WARNING: --enable-stack-protector is only supported on EFI platforms" >&2;} fi enable_stack_protector=no elif test "x$ssp_global_possible" != xyes; then as_fn_error $? "--enable-stack-protector is not supported (compiler doesn't support -mstack-protector-guard=global)" "$LINENO" 5 else TARGET_CFLAGS="$TARGET_CFLAGS -mstack-protector-guard=global" if test "x$enable_stack_protector" = xyes; then if test "x$ssp_possible" != xyes; then as_fn_error $? "--enable-stack-protector is not supported (compiler doesn't support -fstack-protector)" "$LINENO" 5 fi TARGET_CFLAGS="$TARGET_CFLAGS -fstack-protector" elif test "x$enable_stack_protector" = xstrong; then if test "x$ssp_strong_possible" != xyes; then as_fn_error $? "--enable-stack-protector=strong is not supported (compiler doesn't support -fstack-protector-strong)" "$LINENO" 5 fi TARGET_CFLAGS="$TARGET_CFLAGS -fstack-protector-strong" else # Note, -fstack-protector-all requires that the protector is disabled for # functions that appear in the call stack when the canary is initialized. as_fn_error $? "invalid value $enable_stack_protector for --enable-stack-protector" "$LINENO" 5 fi TARGET_CPPFLAGS="$TARGET_CPPFLAGS -DGRUB_STACK_PROTECTOR=1" if test -n "$SOURCE_DATE_EPOCH"; then GRUB_STACK_PROTECTOR_INIT="0x00f2b7e2$(printf "%x" "$SOURCE_DATE_EPOCH" | sed 's/.*\(........\)$/\1/')" elif test -r /dev/urandom; then # Generate the 8 byte stack protector canary at build time if /dev/urandom # is able to be read. The first byte should be NUL to filter out string # buffer overflow attacks. GRUB_STACK_PROTECTOR_INIT="$($PYTHON -c 'import codecs; rf=open("/dev/urandom", "rb"); print("0x00"+codecs.encode(rf.read(7), "hex").decode("ascii"))')" else # Some hosts may not have a urandom, e.g. Windows, so use statically # generated random bytes GRUB_STACK_PROTECTOR_INIT="0x00f2b7e2f193b25c" fi if test x"$target_m32" = x1 ; then # Make sure that the canary default value is 24-bits by only using the # lower 3 bytes on 32 bit systems. This allows the upper byte to be NUL # to filter out string buffer overflow attacks. GRUB_STACK_PROTECTOR_INIT="0x00$(echo "$GRUB_STACK_PROTECTOR_INIT" | sed 's/.*\(......\)$/\1/')" fi fi CFLAGS="$TARGET_CFLAGS" # Smashing stack arg probe. sap_possible=yes { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether \`$CC' accepts \`-mstack-arg-probe'" >&5 printf %s "checking whether \`$CC' accepts \`-mstack-arg-probe'... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ void foo (void) { volatile char a[8]; a[3]; } _ACEOF if eval "$ac_compile -S -mstack-arg-probe -Werror -o conftest.s" 2> /dev/null; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } # Should we clear up other files as well, having called `AC_LANG_CONFTEST'? rm -f conftest.s else sap_possible=no { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi # Cygwin's GCC uses alloca() to probe the stackframe on static # stack allocations above some threshold. if test x"$sap_possible" = xyes; then TARGET_CFLAGS="$TARGET_CFLAGS -mno-stack-arg-probe" fi CFLAGS="$TARGET_CFLAGS" # -mno-unaligned-access -mstrict-align if test "$target_cpu" = arm; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for compile options to get strict alignment" >&5 printf %s "checking for compile options to get strict alignment... " >&6; } if test ${grub_cv_target_cc_strict_align+y} then : printf %s "(cached) " >&6 else $as_nop grub_cv_target_cc_strict_align= for arg in -mno-unaligned-access "-Xclang -mstrict-align" -mstrict-align; do CFLAGS="$TARGET_CFLAGS $arg -Werror" LDFLAGS="$TARGET_LDFLAGS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : flag=1 else $as_nop flag=0 fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext if test x"$flag" = x1; then grub_cv_target_cc_strict_align="$arg" break fi done fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $grub_cv_target_cc_strict_align" >&5 printf "%s\n" "$grub_cv_target_cc_strict_align" >&6; } TARGET_CFLAGS="$TARGET_CFLAGS $grub_cv_target_cc_strict_align" if test x"$grub_cv_target_cc_strict_align" = x"-Xclang -mstrict-align"; then TARGET_LDFLAGS="$TARGET_LDFLAGS -Qunused-arguments" fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if compiler generates unaligned accesses" >&5 printf %s "checking if compiler generates unaligned accesses... " >&6; } if test ${grub_cv_cc_target_emits_unaligned+y} then : printf %s "(cached) " >&6 else $as_nop CFLAGS="$TARGET_CFLAGS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { #ifdef __ARM_FEATURE_UNALIGNED #error "unaligned" #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : grub_cv_cc_target_emits_unaligned=no else $as_nop grub_cv_cc_target_emits_unaligned=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $grub_cv_cc_target_emits_unaligned" >&5 printf "%s\n" "$grub_cv_cc_target_emits_unaligned" >&6; } if test x$grub_cv_cc_target_emits_unaligned = xyes; then as_fn_error $? "compiler generates unaligned accesses" "$LINENO" 5 fi fi # Set them to their new values for the tests below. CC="$TARGET_CC" CPPFLAGS="$TARGET_CPPFLAGS" # Check for libgcc symbols if test x"$platform" = xemu; then CFLAGS="$TARGET_CFLAGS -Wno-error" ac_fn_c_check_func "$LINENO" "__udivsi3" "ac_cv_func___udivsi3" if test "x$ac_cv_func___udivsi3" = xyes then : printf "%s\n" "#define HAVE___UDIVSI3 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "__umodsi3" "ac_cv_func___umodsi3" if test "x$ac_cv_func___umodsi3" = xyes then : printf "%s\n" "#define HAVE___UMODSI3 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "__divsi3" "ac_cv_func___divsi3" if test "x$ac_cv_func___divsi3" = xyes then : printf "%s\n" "#define HAVE___DIVSI3 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "__modsi3" "ac_cv_func___modsi3" if test "x$ac_cv_func___modsi3" = xyes then : printf "%s\n" "#define HAVE___MODSI3 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "__divdi3" "ac_cv_func___divdi3" if test "x$ac_cv_func___divdi3" = xyes then : printf "%s\n" "#define HAVE___DIVDI3 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "__moddi3" "ac_cv_func___moddi3" if test "x$ac_cv_func___moddi3" = xyes then : printf "%s\n" "#define HAVE___MODDI3 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "__udivdi3" "ac_cv_func___udivdi3" if test "x$ac_cv_func___udivdi3" = xyes then : printf "%s\n" "#define HAVE___UDIVDI3 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "__umoddi3" "ac_cv_func___umoddi3" if test "x$ac_cv_func___umoddi3" = xyes then : printf "%s\n" "#define HAVE___UMODDI3 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "__ctzdi2" "ac_cv_func___ctzdi2" if test "x$ac_cv_func___ctzdi2" = xyes then : printf "%s\n" "#define HAVE___CTZDI2 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "__ctzsi2" "ac_cv_func___ctzsi2" if test "x$ac_cv_func___ctzsi2" = xyes then : printf "%s\n" "#define HAVE___CTZSI2 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "__clzdi2" "ac_cv_func___clzdi2" if test "x$ac_cv_func___clzdi2" = xyes then : printf "%s\n" "#define HAVE___CLZDI2 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "__aeabi_uidiv" "ac_cv_func___aeabi_uidiv" if test "x$ac_cv_func___aeabi_uidiv" = xyes then : printf "%s\n" "#define HAVE___AEABI_UIDIV 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "__aeabi_uidivmod" "ac_cv_func___aeabi_uidivmod" if test "x$ac_cv_func___aeabi_uidivmod" = xyes then : printf "%s\n" "#define HAVE___AEABI_UIDIVMOD 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "__aeabi_idiv" "ac_cv_func___aeabi_idiv" if test "x$ac_cv_func___aeabi_idiv" = xyes then : printf "%s\n" "#define HAVE___AEABI_IDIV 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "__aeabi_idivmod" "ac_cv_func___aeabi_idivmod" if test "x$ac_cv_func___aeabi_idivmod" = xyes then : printf "%s\n" "#define HAVE___AEABI_IDIVMOD 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "__aeabi_ulcmp" "ac_cv_func___aeabi_ulcmp" if test "x$ac_cv_func___aeabi_ulcmp" = xyes then : printf "%s\n" "#define HAVE___AEABI_ULCMP 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "__muldi3" "ac_cv_func___muldi3" if test "x$ac_cv_func___muldi3" = xyes then : printf "%s\n" "#define HAVE___MULDI3 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "__aeabi_lmul" "ac_cv_func___aeabi_lmul" if test "x$ac_cv_func___aeabi_lmul" = xyes then : printf "%s\n" "#define HAVE___AEABI_LMUL 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "__aeabi_memcpy" "ac_cv_func___aeabi_memcpy" if test "x$ac_cv_func___aeabi_memcpy" = xyes then : printf "%s\n" "#define HAVE___AEABI_MEMCPY 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "__aeabi_memcpy4" "ac_cv_func___aeabi_memcpy4" if test "x$ac_cv_func___aeabi_memcpy4" = xyes then : printf "%s\n" "#define HAVE___AEABI_MEMCPY4 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "__aeabi_memcpy8" "ac_cv_func___aeabi_memcpy8" if test "x$ac_cv_func___aeabi_memcpy8" = xyes then : printf "%s\n" "#define HAVE___AEABI_MEMCPY8 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "__aeabi_memclr" "ac_cv_func___aeabi_memclr" if test "x$ac_cv_func___aeabi_memclr" = xyes then : printf "%s\n" "#define HAVE___AEABI_MEMCLR 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "__aeabi_memclr4" "ac_cv_func___aeabi_memclr4" if test "x$ac_cv_func___aeabi_memclr4" = xyes then : printf "%s\n" "#define HAVE___AEABI_MEMCLR4 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "__aeabi_memclr8" "ac_cv_func___aeabi_memclr8" if test "x$ac_cv_func___aeabi_memclr8" = xyes then : printf "%s\n" "#define HAVE___AEABI_MEMCLR8 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "__aeabi_memset" "ac_cv_func___aeabi_memset" if test "x$ac_cv_func___aeabi_memset" = xyes then : printf "%s\n" "#define HAVE___AEABI_MEMSET 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "__aeabi_lasr" "ac_cv_func___aeabi_lasr" if test "x$ac_cv_func___aeabi_lasr" = xyes then : printf "%s\n" "#define HAVE___AEABI_LASR 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "__aeabi_llsl" "ac_cv_func___aeabi_llsl" if test "x$ac_cv_func___aeabi_llsl" = xyes then : printf "%s\n" "#define HAVE___AEABI_LLSL 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "__aeabi_llsr" "ac_cv_func___aeabi_llsr" if test "x$ac_cv_func___aeabi_llsr" = xyes then : printf "%s\n" "#define HAVE___AEABI_LLSR 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "_restgpr_14_x" "ac_cv_func__restgpr_14_x" if test "x$ac_cv_func__restgpr_14_x" = xyes then : printf "%s\n" "#define HAVE__RESTGPR_14_X 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "__ucmpdi2" "ac_cv_func___ucmpdi2" if test "x$ac_cv_func___ucmpdi2" = xyes then : printf "%s\n" "#define HAVE___UCMPDI2 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "__ashldi3" "ac_cv_func___ashldi3" if test "x$ac_cv_func___ashldi3" = xyes then : printf "%s\n" "#define HAVE___ASHLDI3 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "__ashrdi3" "ac_cv_func___ashrdi3" if test "x$ac_cv_func___ashrdi3" = xyes then : printf "%s\n" "#define HAVE___ASHRDI3 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "__lshrdi3" "ac_cv_func___lshrdi3" if test "x$ac_cv_func___lshrdi3" = xyes then : printf "%s\n" "#define HAVE___LSHRDI3 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "__bswapsi2" "ac_cv_func___bswapsi2" if test "x$ac_cv_func___bswapsi2" = xyes then : printf "%s\n" "#define HAVE___BSWAPSI2 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "__bswapdi2" "ac_cv_func___bswapdi2" if test "x$ac_cv_func___bswapdi2" = xyes then : printf "%s\n" "#define HAVE___BSWAPDI2 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "__bzero" "ac_cv_func___bzero" if test "x$ac_cv_func___bzero" = xyes then : printf "%s\n" "#define HAVE___BZERO 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "__register_frame_info" "ac_cv_func___register_frame_info" if test "x$ac_cv_func___register_frame_info" = xyes then : printf "%s\n" "#define HAVE___REGISTER_FRAME_INFO 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "__deregister_frame_info" "ac_cv_func___deregister_frame_info" if test "x$ac_cv_func___deregister_frame_info" = xyes then : printf "%s\n" "#define HAVE___DEREGISTER_FRAME_INFO 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "___chkstk_ms" "ac_cv_func____chkstk_ms" if test "x$ac_cv_func____chkstk_ms" = xyes then : printf "%s\n" "#define HAVE____CHKSTK_MS 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "__chkstk_ms" "ac_cv_func___chkstk_ms" if test "x$ac_cv_func___chkstk_ms" = xyes then : printf "%s\n" "#define HAVE___CHKSTK_MS 1" >>confdefs.h fi fi if test "x$TARGET_APPLE_LINKER" = x1 ; then CFLAGS="$TARGET_CFLAGS -nostdlib -static" else CFLAGS="$TARGET_CFLAGS -nostdlib" fi LIBS="" # Defined in acinclude.m4. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if C symbols get an underscore after compilation" >&5 printf %s "checking if C symbols get an underscore after compilation... " >&6; } if test ${grub_cv_asm_uscore+y} then : printf %s "(cached) " >&6 else $as_nop cat > conftest.c <<\EOF int func (int *); int func (int *list) { *list = 0; return *list; } EOF if { ac_try='${CC-cc} ${CFLAGS} -S conftest.c' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 (eval $ac_try) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; } && test -s conftest.s; then true else as_fn_error $? "${CC-cc} failed to produce assembly code" "$LINENO" 5 fi if $EGREP '(^|^_[:alnum])_func' conftest.s >/dev/null 2>&1; then HAVE_ASM_USCORE=1 grub_cv_asm_uscore=yes else HAVE_ASM_USCORE=0 grub_cv_asm_uscore=no fi rm -f conftest* fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $grub_cv_asm_uscore" >&5 printf "%s\n" "$grub_cv_asm_uscore" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether target compiler is working" >&5 printf %s "checking whether target compiler is working... " >&6; } if test ${grub_cv_prog_target_cc+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ asm (".globl start; start:"); void __main (void); void __main (void) {} int main (void); int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : grub_cv_prog_target_cc=yes else $as_nop grub_cv_prog_target_cc=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $grub_cv_prog_target_cc" >&5 printf "%s\n" "$grub_cv_prog_target_cc" >&6; } if test "x$grub_cv_prog_target_cc" = xno; then as_fn_error $? "cannot compile for the target" "$LINENO" 5 fi if test "x$TARGET_APPLE_LINKER" != x1 ; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${TARGET_OBJCOPY} works for absolute addresses" >&5 printf %s "checking whether ${TARGET_OBJCOPY} works for absolute addresses... " >&6; } if test ${grub_cv_prog_objcopy_absolute+y} then : printf %s "(cached) " >&6 else $as_nop cat > conftest.c <<\EOF void cmain (void); void cmain (void) { *((int *) 0x1000) = 2; } EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest.o; then : else as_fn_error $? "${CC-cc} cannot compile C source code" "$LINENO" 5 fi grub_cv_prog_objcopy_absolute=yes for link_addr in 0x2000 0x8000 0x7C00; do if { ac_try='${CC-cc} ${TARGET_CFLAGS} ${TARGET_LDFLAGS} -nostdlib ${TARGET_IMG_LDFLAGS_AC} ${TARGET_IMG_BASE_LDOPT},$link_addr conftest.o -o conftest.exec' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 (eval $ac_try) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : else as_fn_error $? "${CC-cc} cannot link at address $link_addr" "$LINENO" 5 fi if { ac_try='${TARGET_OBJCOPY-objcopy} --only-section=.text -O binary conftest.exec conftest' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 (eval $ac_try) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : else as_fn_error $? "${TARGET_OBJCOPY-objcopy} cannot create binary files" "$LINENO" 5 fi if test ! -f conftest.old || { ac_try='cmp -s conftest.old conftest' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 (eval $ac_try) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then mv -f conftest conftest.old else grub_cv_prog_objcopy_absolute=no break fi done rm -f conftest* fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $grub_cv_prog_objcopy_absolute" >&5 printf "%s\n" "$grub_cv_prog_objcopy_absolute" >&6; } if test "x$grub_cv_prog_objcopy_absolute" = xno; then as_fn_error $? "GRUB requires a working absolute objcopy; upgrade your binutils" "$LINENO" 5 fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether linker accepts --build-id=none" >&5 printf %s "checking whether linker accepts --build-id=none... " >&6; } if test ${grub_cv_prog_ld_build_id_none+y} then : printf %s "(cached) " >&6 else $as_nop save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -Wl,--build-id=none" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : grub_cv_prog_ld_build_id_none=yes else $as_nop grub_cv_prog_ld_build_id_none=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $grub_cv_prog_ld_build_id_none" >&5 printf "%s\n" "$grub_cv_prog_ld_build_id_none" >&6; } if test "x$grub_cv_prog_ld_build_id_none" = xyes; then TARGET_LDFLAGS="$TARGET_LDFLAGS -Wl,--build-id=none" fi if test "x$target_cpu" = xi386; then if test "$platform" != emu && test "x$TARGET_APPLE_LINKER" != x1 ; then if test ! -z "$TARGET_IMG_LDSCRIPT"; then # Check symbols provided by linker script. CFLAGS="$TARGET_CFLAGS -nostdlib ${TARGET_IMG_LDFLAGS_AC} ${TARGET_IMG_BASE_LDOPT},0x8000" fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if __bss_start is defined by the compiler" >&5 printf %s "checking if __bss_start is defined by the compiler... " >&6; } if test ${grub_cv_check_uscore_uscore_bss_start_symbol+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ asm (".globl start; start:"); void __main (void); void __main (void) {} int main (void); int main (void) { asm ("incl __bss_start") ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : grub_cv_check_uscore_uscore_bss_start_symbol=yes else $as_nop grub_cv_check_uscore_uscore_bss_start_symbol=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $grub_cv_check_uscore_uscore_bss_start_symbol" >&5 printf "%s\n" "$grub_cv_check_uscore_uscore_bss_start_symbol" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if edata is defined by the compiler" >&5 printf %s "checking if edata is defined by the compiler... " >&6; } if test ${grub_cv_check_edata_symbol+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ asm (".globl start; start:"); void __main (void); void __main (void) {} int main (void); int main (void) { asm ("incl edata") ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : grub_cv_check_edata_symbol=yes else $as_nop grub_cv_check_edata_symbol=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $grub_cv_check_edata_symbol" >&5 printf "%s\n" "$grub_cv_check_edata_symbol" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if _edata is defined by the compiler" >&5 printf %s "checking if _edata is defined by the compiler... " >&6; } if test ${grub_cv_check_uscore_edata_symbol+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ asm (".globl start; start:"); void __main (void); void __main (void) {} int main (void); int main (void) { asm ("incl _edata") ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : grub_cv_check_uscore_edata_symbol=yes else $as_nop grub_cv_check_uscore_edata_symbol=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $grub_cv_check_uscore_edata_symbol" >&5 printf "%s\n" "$grub_cv_check_uscore_edata_symbol" >&6; } if test "x$grub_cv_check_uscore_uscore_bss_start_symbol" = xyes; then BSS_START_SYMBOL=__bss_start elif test "x$grub_cv_check_edata_symbol" = xyes; then BSS_START_SYMBOL=edata elif test "x$grub_cv_check_uscore_edata_symbol" = xyes; then BSS_START_SYMBOL=_edata else as_fn_error $? "none of __bss_start, edata or _edata is defined" "$LINENO" 5 fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if end is defined by the compiler" >&5 printf %s "checking if end is defined by the compiler... " >&6; } if test ${grub_cv_check_end_symbol+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ asm (".globl start; start:"); void __main (void); void __main (void) {} int main (void); int main (void) { asm ("incl end") ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : grub_cv_check_end_symbol=yes else $as_nop grub_cv_check_end_symbol=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $grub_cv_check_end_symbol" >&5 printf "%s\n" "$grub_cv_check_end_symbol" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if _end is defined by the compiler" >&5 printf %s "checking if _end is defined by the compiler... " >&6; } if test ${grub_cv_check_uscore_end_symbol+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ asm (".globl start; start:"); void __main (void); void __main (void) {} int main (void); int main (void) { asm ("incl _end") ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : grub_cv_check_uscore_end_symbol=yes else $as_nop grub_cv_check_uscore_end_symbol=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $grub_cv_check_uscore_end_symbol" >&5 printf "%s\n" "$grub_cv_check_uscore_end_symbol" >&6; } if test "x$grub_cv_check_end_symbol" = xyes; then END_SYMBOL=end elif test "x$grub_cv_check_uscore_end_symbol" = xyes; then END_SYMBOL=_end else as_fn_error $? "neither end nor _end is defined" "$LINENO" 5 fi fi CFLAGS="$TARGET_CFLAGS" fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether nm works" >&5 printf %s "checking whether nm works... " >&6; } if test ${grub_cv_prog_nm_works+y} then : printf %s "(cached) " >&6 else $as_nop nm_works_tmp_dir="$(mktemp -d "./confXXXXXX")" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF $TARGET_CC $TARGET_CFLAGS -c conftest.c -o "$nm_works_tmp_dir/ef" if $TARGET_NM "$nm_works_tmp_dir/ef" > /dev/null; then grub_cv_prog_nm_works=yes else grub_cv_prog_nm_minus_p=no fi rm "$nm_works_tmp_dir/ef" rmdir "$nm_works_tmp_dir" fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $grub_cv_prog_nm_works" >&5 printf "%s\n" "$grub_cv_prog_nm_works" >&6; } if test "x$grub_cv_prog_nm_works" != xyes; then as_fn_error $? "nm does not work" "$LINENO" 5 fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether nm accepts -P" >&5 printf %s "checking whether nm accepts -P... " >&6; } if test ${grub_cv_prog_nm_minus_p+y} then : printf %s "(cached) " >&6 else $as_nop nm_minus_p_tmp_dir="$(mktemp -d "./confXXXXXX")" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF $TARGET_CC $TARGET_CFLAGS -c conftest.c -o "$nm_minus_p_tmp_dir/ef" if $TARGET_NM -P "$nm_minus_p_tmp_dir/ef" 2>&1 > /dev/null; then grub_cv_prog_nm_minus_p=yes else grub_cv_prog_nm_minus_p=no fi rm "$nm_minus_p_tmp_dir/ef" rmdir "$nm_minus_p_tmp_dir" fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $grub_cv_prog_nm_minus_p" >&5 printf "%s\n" "$grub_cv_prog_nm_minus_p" >&6; } if test "x$grub_cv_prog_nm_minus_p" = xyes; then TARGET_NMFLAGS_MINUS_P="-P" else TARGET_NMFLAGS_MINUS_P= fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether nm accepts --defined-only" >&5 printf %s "checking whether nm accepts --defined-only... " >&6; } if test ${grub_cv_prog_nm_defined_only+y} then : printf %s "(cached) " >&6 else $as_nop nm_defined_only_tmp_dir="$(mktemp -d "./confXXXXXX")" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF $TARGET_CC $TARGET_CFLAGS -c conftest.c -o "$nm_defined_only_tmp_dir/ef" if $TARGET_NM --defined-only "$nm_defined_only_tmp_dir/ef" 2>&1 > /dev/null; then grub_cv_prog_nm_defined_only=yes else grub_cv_prog_nm_defined_only=no fi rm "$nm_defined_only_tmp_dir/ef" rmdir "$nm_defined_only_tmp_dir" fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $grub_cv_prog_nm_defined_only" >&5 printf "%s\n" "$grub_cv_prog_nm_defined_only" >&6; } if test "x$grub_cv_prog_nm_defined_only" = xyes; then TARGET_NMFLAGS_DEFINED_ONLY=--defined-only else TARGET_NMFLAGS_DEFINED_ONLY= fi if test "$platform" != emu; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether -nostdinc -isystem works" >&5 printf %s "checking whether -nostdinc -isystem works... " >&6; } if test ${grub_cv_cc_isystem+y} then : printf %s "(cached) " >&6 else $as_nop SAVED_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$TARGET_CPPFLAGS -nostdlib -nostdinc -isystem `$TARGET_CC -print-file-name=include`" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int va_arg_func (int fixed, va_list args); int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : grub_cv_cc_isystem=yes else $as_nop grub_cv_cc_isystem=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext CPPFLAGS="$SAVED_CPPFLAGS" fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $grub_cv_cc_isystem" >&5 printf "%s\n" "$grub_cv_cc_isystem" >&6; } if test x"$grub_cv_cc_isystem" = xyes ; then TARGET_CPPFLAGS="$TARGET_CPPFLAGS -nostdinc -isystem `$TARGET_CC -print-file-name=include`" fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether -Wtrampolines work" >&5 printf %s "checking whether -Wtrampolines work... " >&6; } if test ${grub_cv_cc_wtrampolines+y} then : printf %s "(cached) " >&6 else $as_nop CFLAGS="$TARGET_CFLAGS -Wtrampolines -Werror" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int va_arg_func (int fixed, va_list args); int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : grub_cv_cc_wtrampolines=yes else $as_nop grub_cv_cc_wtrampolines=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $grub_cv_cc_wtrampolines" >&5 printf "%s\n" "$grub_cv_cc_wtrampolines" >&6; } if test x"$grub_cv_cc_wtrampolines" = xyes ; then TARGET_CFLAGS="$TARGET_CFLAGS -Wtrampolines" fi # Restore the flags. CC="$tmp_CC" CFLAGS="$tmp_CFLAGS" CPPFLAGS="$tmp_CPPFLAGS" LDFLAGS="$tmp_LDFLAGS" LIBS="$tmp_LIBS" # # Check for options. # # Memory manager debugging. # Check whether --enable-mm-debug was given. if test ${enable_mm_debug+y} then : enableval=$enable_mm_debug; fi if test x$enable_mm_debug = xyes; then MM_DEBUG=1 else MM_DEBUG=0 fi if test x$MM_DEBUG = x1; then COND_MM_DEBUG_TRUE= COND_MM_DEBUG_FALSE='#' else COND_MM_DEBUG_TRUE='#' COND_MM_DEBUG_FALSE= fi # Check whether --enable-cache-stats was given. if test ${enable_cache_stats+y} then : enableval=$enable_cache_stats; fi if test x$enable_cache_stats = xyes; then DISK_CACHE_STATS=1 else DISK_CACHE_STATS=0 fi # Check whether --enable-boot-time was given. if test ${enable_boot_time+y} then : enableval=$enable_boot_time; fi if test x$enable_boot_time = xyes; then BOOT_TIME_STATS=1 else BOOT_TIME_STATS=0 fi # Check whether --enable-grub-emu-sdl2 was given. if test ${enable_grub_emu_sdl2+y} then : enableval=$enable_grub_emu_sdl2; fi # Check whether --enable-grub-emu-sdl was given. if test ${enable_grub_emu_sdl+y} then : enableval=$enable_grub_emu_sdl; fi # Check whether --enable-grub-emu-pci was given. if test ${enable_grub_emu_pci+y} then : enableval=$enable_grub_emu_pci; fi if test "$platform" = emu; then if test x"$enable_grub_emu_sdl2" = xno ; then grub_emu_sdl2_excuse="explicitly disabled" fi if [ x"$grub_emu_sdl2_excuse" = x ]; then # Check for libSDL libraries. pkg_failed=no { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sdl2" >&5 printf %s "checking for sdl2... " >&6; } if test -n "$SDL2_CFLAGS"; then pkg_cv_SDL2_CFLAGS="$SDL2_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"sdl2\""; } >&5 ($PKG_CONFIG --exists --print-errors "sdl2") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_SDL2_CFLAGS=`$PKG_CONFIG --cflags "sdl2" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$SDL2_LIBS"; then pkg_cv_SDL2_LIBS="$SDL2_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"sdl2\""; } >&5 ($PKG_CONFIG --exists --print-errors "sdl2") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_SDL2_LIBS=`$PKG_CONFIG --libs "sdl2" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then SDL2_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "sdl2" 2>&1` else SDL2_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "sdl2" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$SDL2_PKG_ERRORS" >&5 grub_emu_sdl2_excuse="libSDL2 libraries are required to build \`grub-emu' with SDL2 support" elif test $pkg_failed = untried; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } grub_emu_sdl2_excuse="libSDL2 libraries are required to build \`grub-emu' with SDL2 support" else SDL2_CFLAGS=$pkg_cv_SDL2_CFLAGS SDL2_LIBS=$pkg_cv_SDL2_LIBS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } printf "%s\n" "#define HAVE_SDL2 1" >>confdefs.h fi fi if test x"$enable_grub_emu_sdl2" = xyes && test x"$grub_emu_sdl2_excuse" != x ; then as_fn_error $? "SDL2 support for grub-emu was explicitly requested but can't be compiled ($grub_emu_sdl2_excuse)" "$LINENO" 5 fi if test x"$grub_emu_sdl2_excuse" = x ; then enable_grub_emu_sdl2=yes else enable_grub_emu_sdl2=no fi if test x"$enable_grub_emu_sdl2" = xyes ; then grub_emu_sdl_excuse="disabled by sdl2" fi if test x"$enable_grub_emu_sdl" = xno ; then grub_emu_sdl_excuse="explicitly disabled" fi if [ x"$grub_emu_sdl_excuse" = x ]; then # Check for libSDL libraries. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for SDL_Init in -lSDL" >&5 printf %s "checking for SDL_Init in -lSDL... " >&6; } if test ${ac_cv_lib_SDL_SDL_Init+y} then : printf %s "(cached) " >&6 else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-lSDL $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ char SDL_Init (); int main (void) { return SDL_Init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_SDL_SDL_Init=yes else $as_nop ac_cv_lib_SDL_SDL_Init=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_SDL_SDL_Init" >&5 printf "%s\n" "$ac_cv_lib_SDL_SDL_Init" >&6; } if test "x$ac_cv_lib_SDL_SDL_Init" = xyes then : LIBSDL="-lSDL" else $as_nop grub_emu_sdl_excuse="libSDL libraries are required to build \`grub-emu' with SDL support" fi fi if [ x"$grub_emu_sdl_excuse" = x ]; then # Check for headers. for ac_header in SDL/SDL.h do : ac_fn_c_check_header_compile "$LINENO" "SDL/SDL.h" "ac_cv_header_SDL_SDL_h" "$ac_includes_default" if test "x$ac_cv_header_SDL_SDL_h" = xyes then : printf "%s\n" "#define HAVE_SDL_SDL_H 1" >>confdefs.h else $as_nop grub_emu_sdl_excuse="libSDL header file is required to build \`grub-emu' with SDL support" fi done fi if test x"$enable_grub_emu_sdl" = xyes && test x"$grub_emu_sdl_excuse" != x ; then as_fn_error $? "SDL support for grub-emu was explicitly requested but can't be compiled ($grub_emu_sdl_excuse)" "$LINENO" 5 fi if test x"$grub_emu_sdl_excuse" = x ; then enable_grub_emu_sdl=yes else enable_grub_emu_sdl=no fi if test x"$enable_grub_emu_pci" != xyes ; then grub_emu_pci_excuse="not enabled" fi if [ x"$grub_emu_pci_excuse" = x ]; then # Check for libpci libraries. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pci_system_init in -lpciaccess" >&5 printf %s "checking for pci_system_init in -lpciaccess... " >&6; } if test ${ac_cv_lib_pciaccess_pci_system_init+y} then : printf %s "(cached) " >&6 else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-lpciaccess $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ char pci_system_init (); int main (void) { return pci_system_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_pciaccess_pci_system_init=yes else $as_nop ac_cv_lib_pciaccess_pci_system_init=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pciaccess_pci_system_init" >&5 printf "%s\n" "$ac_cv_lib_pciaccess_pci_system_init" >&6; } if test "x$ac_cv_lib_pciaccess_pci_system_init" = xyes then : LIBPCIACCESS="-lpciaccess" else $as_nop grub_emu_pci_excuse="need libpciaccess library" fi fi if [ x"$grub_emu_pci_excuse" = x ]; then # Check for headers. for ac_header in pciaccess.h do : ac_fn_c_check_header_compile "$LINENO" "pciaccess.h" "ac_cv_header_pciaccess_h" "$ac_includes_default" if test "x$ac_cv_header_pciaccess_h" = xyes then : printf "%s\n" "#define HAVE_PCIACCESS_H 1" >>confdefs.h else $as_nop grub_emu_pci_excuse="need libpciaccess headers" fi done fi if test x"$grub_emu_pci_excuse" = x ; then enable_grub_emu_pci=yes else enable_grub_emu_pci=no fi else # Ignore --enable-emu-* if platform is not emu enable_grub_emu_sdl2=no enable_grub_emu_sdl=no enable_grub_emu_pci=no fi # Check whether --enable-grub-mkfont was given. if test ${enable_grub_mkfont+y} then : enableval=$enable_grub_mkfont; fi if test x"$enable_grub_mkfont" = xno ; then grub_mkfont_excuse="explicitly disabled" fi unset ac_cv_header_ft2build_h if test x"$grub_mkfont_excuse" = x ; then # Check for freetype libraries. pkg_failed=no { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for freetype2" >&5 printf %s "checking for freetype2... " >&6; } if test -n "$FREETYPE_CFLAGS"; then pkg_cv_FREETYPE_CFLAGS="$FREETYPE_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"freetype2\""; } >&5 ($PKG_CONFIG --exists --print-errors "freetype2") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_FREETYPE_CFLAGS=`$PKG_CONFIG --cflags "freetype2" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$FREETYPE_LIBS"; then pkg_cv_FREETYPE_LIBS="$FREETYPE_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"freetype2\""; } >&5 ($PKG_CONFIG --exists --print-errors "freetype2") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_FREETYPE_LIBS=`$PKG_CONFIG --libs "freetype2" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then FREETYPE_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "freetype2" 2>&1` else FREETYPE_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "freetype2" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$FREETYPE_PKG_ERRORS" >&5 grub_mkfont_excuse="need freetype2 library" elif test $pkg_failed = untried; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } grub_mkfont_excuse="need freetype2 library" else FREETYPE_CFLAGS=$pkg_cv_FREETYPE_CFLAGS FREETYPE_LIBS=$pkg_cv_FREETYPE_LIBS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } SAVED_CPPFLAGS="$CPPFLAGS" SAVED_LIBS="$LIBS" CPPFLAGS="$CPPFLAGS $FREETYPE_CFLAGS" LIBS="$LIBS $FREETYPE_LIBS" for ac_header in ft2build.h do : ac_fn_c_check_header_compile "$LINENO" "ft2build.h" "ac_cv_header_ft2build_h" "$ac_includes_default" if test "x$ac_cv_header_ft2build_h" = xyes then : printf "%s\n" "#define HAVE_FT2BUILD_H 1" >>confdefs.h else $as_nop grub_mkfont_excuse="need freetype2 headers" fi done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ char FT_Load_Glyph (); int main (void) { return FT_Load_Glyph (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : else $as_nop grub_mkfont_excuse="freetype2 library unusable" fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext CPPFLAGS="$SAVED_CPPFLAGS" LIBS="$SAVED_LIBS" fi if test x"$grub_mkfont_excuse" = x && test x"$host_kernel" = xnetbsd ; then FREETYPE_LIBS="$FREETYPE_LIBS -Wl,-R,/usr/pkg/lib" ; fi fi if test x"$enable_grub_mkfont" = xyes && test x"$grub_mkfont_excuse" != x ; then as_fn_error $? "grub-mkfont was explicitly requested but can't be compiled ($grub_mkfont_excuse)" "$LINENO" 5 fi if test x"$grub_mkfont_excuse" = x ; then enable_grub_mkfont=yes else enable_grub_mkfont=no fi SAVED_CC="$CC" SAVED_CPP="$CPP" SAVED_CFLAGS="$CFLAGS" SAVED_CPPFLAGS="$CPPFLAGS" SAVED_LDFLAGS="$LDFLAGS" CC="$BUILD_CC" CPP="$BUILD_CPP" CFLAGS="$BUILD_CFLAGS" CPPFLAGS="$BUILD_CPPFLAGS" LDFLAGS="$BUILD_LDFLAGS" unset ac_cv_c_bigendian unset ac_cv_header_ft2build_h if ac_fn_c_compute_int "$LINENO" "sizeof (void *)" "BUILD_SIZEOF_VOID_P" "" then : fi if ac_fn_c_compute_int "$LINENO" "sizeof (long)" "BUILD_SIZEOF_LONG" "" then : fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 printf %s "checking whether byte ordering is bigendian... " >&6; } if test ${ac_cv_c_bigendian+y} then : printf %s "(cached) " >&6 else $as_nop ac_cv_c_bigendian=unknown # See if we're dealing with a universal compiler. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __APPLE_CC__ not a universal capable compiler #endif typedef int dummy; _ACEOF if ac_fn_c_try_compile "$LINENO" then : # Check for potential -arch flags. It is not universal unless # there are at least two -arch flags with different values. ac_arch= ac_prev= for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do if test -n "$ac_prev"; then case $ac_word in i?86 | x86_64 | ppc | ppc64) if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then ac_arch=$ac_word else ac_cv_c_bigendian=universal break fi ;; esac ac_prev= elif test "x$ac_word" = "x-arch"; then ac_prev=arch fi done fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext if test $ac_cv_c_bigendian = unknown; then # See if sys/param.h defines the BYTE_ORDER macro. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main (void) { #if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ && LITTLE_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : # It does; now see whether it defined to BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main (void) { #if BYTE_ORDER != BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_c_bigendian=yes else $as_nop ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # See if defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { #if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : # It does; now see whether it defined to _BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { #ifndef _BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_c_bigendian=yes else $as_nop ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # Compile a test program. if test "$cross_compiling" = yes then : # Try to guess by grepping values from an object file. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ unsigned short int ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; unsigned short int ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; int use_ascii (int i) { return ascii_mm[i] + ascii_ii[i]; } unsigned short int ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; unsigned short int ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; int use_ebcdic (int i) { return ebcdic_mm[i] + ebcdic_ii[i]; } extern int foo; int main (void) { return use_ascii (foo) == use_ebcdic (foo); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then ac_cv_c_bigendian=yes fi if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then if test "$ac_cv_c_bigendian" = unknown; then ac_cv_c_bigendian=no else # finding both strings is unlikely to happen, but who knows? ac_cv_c_bigendian=unknown fi fi fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main (void) { /* Are we little or big endian? From Harbison&Steele. */ union { long int l; char c[sizeof (long int)]; } u; u.l = 1; return u.c[sizeof (long int) - 1] == 1; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO" then : ac_cv_c_bigendian=no else $as_nop ac_cv_c_bigendian=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 printf "%s\n" "$ac_cv_c_bigendian" >&6; } case $ac_cv_c_bigendian in #( yes) BUILD_WORDS_BIGENDIAN=1;; #( no) BUILD_WORDS_BIGENDIAN=0 ;; #( universal) BUILD_WORDS_BIGENDIAN=err ;; #( *) BUILD_WORDS_BIGENDIAN=err ;; esac if test x$BUILD_WORDS_BIGENDIAN = xerr ; then as_fn_error $? "couldnt determine build endianness" "$LINENO" 5 fi if test x"$grub_build_mkfont_excuse" = x ; then # Check for freetype libraries. SAVED_PKG_CONFIG="$PKG_CONFIG" test -z "$BUILD_PKG_CONFIG" || PKG_CONFIG="$BUILD_PKG_CONFIG" pkg_failed=no { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for freetype2" >&5 printf %s "checking for freetype2... " >&6; } if test -n "$BUILD_FREETYPE_CFLAGS"; then pkg_cv_BUILD_FREETYPE_CFLAGS="$BUILD_FREETYPE_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"freetype2\""; } >&5 ($PKG_CONFIG --exists --print-errors "freetype2") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_BUILD_FREETYPE_CFLAGS=`$PKG_CONFIG --cflags "freetype2" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$BUILD_FREETYPE_LIBS"; then pkg_cv_BUILD_FREETYPE_LIBS="$BUILD_FREETYPE_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"freetype2\""; } >&5 ($PKG_CONFIG --exists --print-errors "freetype2") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_BUILD_FREETYPE_LIBS=`$PKG_CONFIG --libs "freetype2" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then BUILD_FREETYPE_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "freetype2" 2>&1` else BUILD_FREETYPE_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "freetype2" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$BUILD_FREETYPE_PKG_ERRORS" >&5 grub_build_mkfont_excuse="need freetype2 library" elif test $pkg_failed = untried; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } grub_build_mkfont_excuse="need freetype2 library" else BUILD_FREETYPE_CFLAGS=$pkg_cv_BUILD_FREETYPE_CFLAGS BUILD_FREETYPE_LIBS=$pkg_cv_BUILD_FREETYPE_LIBS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } SAVED_CPPFLAGS_2="$CPPFLAGS" SAVED_LIBS="$LIBS" CPPFLAGS="$CPPFLAGS $BUILD_FREETYPE_CFLAGS" LIBS="$LIBS $BUILD_FREETYPE_LIBS" for ac_header in ft2build.h do : ac_fn_c_check_header_compile "$LINENO" "ft2build.h" "ac_cv_header_ft2build_h" "$ac_includes_default" if test "x$ac_cv_header_ft2build_h" = xyes then : printf "%s\n" "#define HAVE_FT2BUILD_H 1" >>confdefs.h else $as_nop grub_build_mkfont_excuse="need freetype2 headers" fi done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ char FT_Load_Glyph (); int main (void) { return FT_Load_Glyph (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : else $as_nop grub_build_mkfont_excuse="freetype2 library unusable" fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS="$SAVED_LIBS" CPPFLAGS="$SAVED_CPPFLAGS_2" fi if test x"$grub_build_mkfont_excuse" = x ; then case x"$build_os" in xnetbsd*) BUILD_FREETYPE_LIBS="$BUILD_FREETYPE_LIBS -Wl,-R,/usr/pkg/lib" ;; esac fi PKG_CONFIG="$SAVED_PKG_CONFIG" fi if test x"$enable_build_grub_mkfont" = xyes && test x"$grub_build_mkfont_excuse" != x ; then as_fn_error $? "build-grub-mkfont was explicitly requested but can't be compiled ($grub_build_mkfont_excuse)" "$LINENO" 5 fi if test x"$grub_build_mkfont_excuse" = x ; then enable_build_grub_mkfont=yes else enable_build_grub_mkfont=no fi if test x"$enable_build_grub_mkfont" = xno && ( test "x$platform" = xqemu || test "x$platform" = xloongson || test "x$platform" = xqemu_mips || test "x$platform" = xcoreboot ); then if test x"$grub_build_mkfont_excuse" = x ; then as_fn_error $? "qemu, coreboot and loongson ports need build-time grub-mkfont" "$LINENO" 5 else as_fn_error $? "qemu, coreboot and loongson ports need build-time grub-mkfont ($grub_build_mkfont_excuse)" "$LINENO" 5 fi fi CC="$SAVED_CC" CPP="$SAVED_CPP" CFLAGS="$SAVED_CFLAGS" CPPFLAGS="$SAVED_CPPFLAGS" LDFLAGS="$SAVED_LDFLAGS" starfield_excuse= # Check whether --enable-grub-themes was given. if test ${enable_grub_themes+y} then : enableval=$enable_grub_themes; fi if test x"$enable_grub_themes" = xno ; then starfield_excuse="explicitly disabled" fi if test x"$starfield_excuse" = x && test x"$enable_build_grub_mkfont" = xno ; then starfield_excuse="No build-time grub-mkfont" fi # Check whether --with-dejavufont was given. if test ${with_dejavufont+y} then : withval=$with_dejavufont; fi if test "x$with_dejavufont" = x; then # search in well-known directories if test x"$starfield_excuse" = x; then for ext in pcf pcf.gz bdf bdf.gz ttf ttf.gz; do for dir in . /usr/src /usr/share/fonts/X11/misc /usr/share/fonts/truetype/ttf-dejavu /usr/share/fonts/dejavu /usr/share/fonts/truetype /usr/pkg/share/fonts/X11/TTF /usr/local/share/fonts/dejavu /usr/X11R6/lib/X11/fonts/TTF /usr/share/fonts/dejavu-sans-fonts /usr/share/fonts/truetype/dejavu; do if test -f "$dir/DejaVuSans.$ext"; then DJVU_FONT_SOURCE="$dir/DejaVuSans.$ext" break 2 fi done done if test "x$DJVU_FONT_SOURCE" = x; then starfield_excuse="No DejaVu found" fi fi else DJVU_FONT_SOURCE="$with_dejavufont" fi if test x"$enable_grub_themes" = xyes && test x"$starfield_excuse" != x; then as_fn_error $? "themes were explicitly requested but requirements are not satisfied ($starfield_excuse)" "$LINENO" 5 fi # Check whether --with-unifont was given. if test ${with_unifont+y} then : withval=$with_unifont; fi if test "x$with_unifont" = x; then # search in well-known directories for ext in pcf pcf.gz bdf bdf.gz ttf ttf.gz otf otf.gz; do for dir in . /usr/src /usr/share/fonts/X11/misc /usr/share/fonts/unifont /usr/share/fonts/uni /usr/share/fonts/truetype/unifont /usr/share/fonts/misc /usr/pkg/share/fonts/X11/misc /usr/local/share/fonts/gnu-unifont /usr/local/share/fonts/unifont; do if test -f "$dir/unifont.$ext"; then md5="$(md5sum "$dir/unifont.$ext"|awk '{ print $1; }')" # PCF and BDF from version 6.3 isn't hanled properly by libfreetype. if test "$md5" = 0a54834d2788c83886a3e1785a6a1e61 || test "$md5" = 28f2565c7a41d8d407e2551159385edb || test "$md5" = dae5e588461b3b92b87b6ffee734f936 || test "$md5" = 4a3d687aa5bb329ed05f4263a1016791 ; then continue fi FONT_SOURCE="$dir/unifont.$ext" break 2 fi done done else FONT_SOURCE="$with_unifont" fi if test x"$enable_build_grub_mkfont" = xno ; then FONT_SOURCE= fi if test "x$FONT_SOURCE" = x && ( test "x$platform" = xqemu || test "x$platform" = xloongson || test "x$platform" = xqemu_mips || test "x$platform" = xcoreboot ); then if test x"$grub_build_mkfont_excuse" = x ; then as_fn_error $? "qemu, coreboot and loongson ports need unifont" "$LINENO" 5 else as_fn_error $? "qemu, coreboot and loongson ports need unifont ($grub_build_mkfont_excuse)" "$LINENO" 5 fi fi if test x"$FONT_SOURCE" = x && test x"$DJVU_FONT_SOURCE" = x && test x"$grub_build_mkfont_excuse" = x; then grub_build_mkfont_excuse="no fonts" fi # Check whether --enable-grub-mount was given. if test ${enable_grub_mount+y} then : enableval=$enable_grub_mount; fi if test x"$enable_grub_mount" = xno ; then grub_mount_excuse="explicitly disabled" fi if test x"$grub_mount_excuse" = x ; then pkg_failed=no { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for fuse3" >&5 printf %s "checking for fuse3... " >&6; } if test -n "$FUSE_CFLAGS"; then pkg_cv_FUSE_CFLAGS="$FUSE_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"fuse3\""; } >&5 ($PKG_CONFIG --exists --print-errors "fuse3") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_FUSE_CFLAGS=`$PKG_CONFIG --cflags "fuse3" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$FUSE_LIBS"; then pkg_cv_FUSE_LIBS="$FUSE_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"fuse3\""; } >&5 ($PKG_CONFIG --exists --print-errors "fuse3") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_FUSE_LIBS=`$PKG_CONFIG --libs "fuse3" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then FUSE_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "fuse3" 2>&1` else FUSE_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "fuse3" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$FUSE_PKG_ERRORS" >&5 pkg_failed=no { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for fuse" >&5 printf %s "checking for fuse... " >&6; } if test -n "$FUSE_CFLAGS"; then pkg_cv_FUSE_CFLAGS="$FUSE_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"fuse\""; } >&5 ($PKG_CONFIG --exists --print-errors "fuse") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_FUSE_CFLAGS=`$PKG_CONFIG --cflags "fuse" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$FUSE_LIBS"; then pkg_cv_FUSE_LIBS="$FUSE_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"fuse\""; } >&5 ($PKG_CONFIG --exists --print-errors "fuse") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_FUSE_LIBS=`$PKG_CONFIG --libs "fuse" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then FUSE_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "fuse" 2>&1` else FUSE_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "fuse" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$FUSE_PKG_ERRORS" >&5 grub_mount_excuse="need fuse or fuse3 libraries" elif test $pkg_failed = untried; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } grub_mount_excuse="need fuse or fuse3 libraries" else FUSE_CFLAGS=$pkg_cv_FUSE_CFLAGS FUSE_LIBS=$pkg_cv_FUSE_LIBS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } FUSE_CFLAGS="$FUSE_CFLAGS -DFUSE_USE_VERSION=26" fi elif test $pkg_failed = untried; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } pkg_failed=no { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for fuse" >&5 printf %s "checking for fuse... " >&6; } if test -n "$FUSE_CFLAGS"; then pkg_cv_FUSE_CFLAGS="$FUSE_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"fuse\""; } >&5 ($PKG_CONFIG --exists --print-errors "fuse") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_FUSE_CFLAGS=`$PKG_CONFIG --cflags "fuse" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$FUSE_LIBS"; then pkg_cv_FUSE_LIBS="$FUSE_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"fuse\""; } >&5 ($PKG_CONFIG --exists --print-errors "fuse") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_FUSE_LIBS=`$PKG_CONFIG --libs "fuse" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then FUSE_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "fuse" 2>&1` else FUSE_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "fuse" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$FUSE_PKG_ERRORS" >&5 grub_mount_excuse="need fuse or fuse3 libraries" elif test $pkg_failed = untried; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } grub_mount_excuse="need fuse or fuse3 libraries" else FUSE_CFLAGS=$pkg_cv_FUSE_CFLAGS FUSE_LIBS=$pkg_cv_FUSE_LIBS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } FUSE_CFLAGS="$FUSE_CFLAGS -DFUSE_USE_VERSION=26" fi else FUSE_CFLAGS=$pkg_cv_FUSE_CFLAGS FUSE_LIBS=$pkg_cv_FUSE_LIBS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } FUSE_CFLAGS="$FUSE_CFLAGS -DFUSE_USE_VERSION=32" fi fi if test x"$enable_grub_mount" = xyes && test x"$grub_mount_excuse" != x ; then as_fn_error $? "grub-mount was explicitly requested but can't be compiled ($grub_mount_excuse)" "$LINENO" 5 fi if test x"$grub_mount_excuse" = x ; then enable_grub_mount=yes else enable_grub_mount=no fi # Check whether --enable-device-mapper was given. if test ${enable_device_mapper+y} then : enableval=$enable_device_mapper; fi if test x"$enable_device_mapper" = xno ; then device_mapper_excuse="explicitly disabled" fi if test x"$device_mapper_excuse" = x ; then # Check for device-mapper header. ac_fn_c_check_header_compile "$LINENO" "libdevmapper.h" "ac_cv_header_libdevmapper_h" "$ac_includes_default" if test "x$ac_cv_header_libdevmapper_h" = xyes then : else $as_nop device_mapper_excuse="need libdevmapper header" fi fi if test x"$device_mapper_excuse" = x ; then # Check for device-mapper library. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dm_task_create in -ldevmapper" >&5 printf %s "checking for dm_task_create in -ldevmapper... " >&6; } if test ${ac_cv_lib_devmapper_dm_task_create+y} then : printf %s "(cached) " >&6 else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-ldevmapper $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ char dm_task_create (); int main (void) { return dm_task_create (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_devmapper_dm_task_create=yes else $as_nop ac_cv_lib_devmapper_dm_task_create=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_devmapper_dm_task_create" >&5 printf "%s\n" "$ac_cv_lib_devmapper_dm_task_create" >&6; } if test "x$ac_cv_lib_devmapper_dm_task_create" = xyes then : printf "%s\n" "#define HAVE_LIBDEVMAPPER 1" >>confdefs.h LIBS="-ldevmapper $LIBS" else $as_nop device_mapper_excuse="need devmapper library" fi fi if test x"$device_mapper_excuse" = x ; then # Check for device-mapper library. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dm_log_with_errno_init in -ldevmapper" >&5 printf %s "checking for dm_log_with_errno_init in -ldevmapper... " >&6; } if test ${ac_cv_lib_devmapper_dm_log_with_errno_init+y} then : printf %s "(cached) " >&6 else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-ldevmapper $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ char dm_log_with_errno_init (); int main (void) { return dm_log_with_errno_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_devmapper_dm_log_with_errno_init=yes else $as_nop ac_cv_lib_devmapper_dm_log_with_errno_init=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_devmapper_dm_log_with_errno_init" >&5 printf "%s\n" "$ac_cv_lib_devmapper_dm_log_with_errno_init" >&6; } if test "x$ac_cv_lib_devmapper_dm_log_with_errno_init" = xyes then : printf "%s\n" "#define HAVE_LIBDEVMAPPER 1" >>confdefs.h LIBS="-ldevmapper $LIBS" else $as_nop device_mapper_excuse="need devmapper library" fi fi if test x"$device_mapper_excuse" = x ; then LIBDEVMAPPER="-ldevmapper" printf "%s\n" "#define HAVE_DEVICE_MAPPER 1" >>confdefs.h fi LIBGEOM= if test x$host_kernel = xkfreebsd; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for geom_gettree in -lgeom" >&5 printf %s "checking for geom_gettree in -lgeom... " >&6; } if test ${ac_cv_lib_geom_geom_gettree+y} then : printf %s "(cached) " >&6 else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-lgeom $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ char geom_gettree (); int main (void) { return geom_gettree (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_geom_geom_gettree=yes else $as_nop ac_cv_lib_geom_geom_gettree=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_geom_geom_gettree" >&5 printf "%s\n" "$ac_cv_lib_geom_geom_gettree" >&6; } if test "x$ac_cv_lib_geom_geom_gettree" = xyes then : printf "%s\n" "#define HAVE_LIBGEOM 1" >>confdefs.h LIBS="-lgeom $LIBS" else $as_nop as_fn_error $? "Your platform requires libgeom" "$LINENO" 5 fi LIBGEOM="-lgeom" fi # Check whether --enable-liblzma was given. if test ${enable_liblzma+y} then : enableval=$enable_liblzma; fi if test x"$enable_liblzma" = xno ; then liblzma_excuse="explicitly disabled" fi if test x"$liblzma_excuse" = x ; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for lzma_code in -llzma" >&5 printf %s "checking for lzma_code in -llzma... " >&6; } if test ${ac_cv_lib_lzma_lzma_code+y} then : printf %s "(cached) " >&6 else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-llzma $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ char lzma_code (); int main (void) { return lzma_code (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_lzma_lzma_code=yes else $as_nop ac_cv_lib_lzma_lzma_code=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lzma_lzma_code" >&5 printf "%s\n" "$ac_cv_lib_lzma_lzma_code" >&6; } if test "x$ac_cv_lib_lzma_lzma_code" = xyes then : printf "%s\n" "#define HAVE_LIBLZMA 1" >>confdefs.h LIBS="-llzma $LIBS" else $as_nop liblzma_excuse="need lzma library" fi fi if test x"$liblzma_excuse" = x ; then ac_fn_c_check_header_compile "$LINENO" "lzma.h" "ac_cv_header_lzma_h" "$ac_includes_default" if test "x$ac_cv_header_lzma_h" = xyes then : else $as_nop liblzma_excuse="need lzma header" fi fi if test x"$enable_liblzma" = xyes && test x"$liblzma_excuse" != x ; then as_fn_error $? "liblzma support was explicitly requested but requirements are not satisfied ($liblzma_excuse)" "$LINENO" 5 fi if test x"$liblzma_excuse" = x ; then LIBLZMA="-llzma" printf "%s\n" "#define USE_LIBLZMA 1" >>confdefs.h fi # Check whether --enable-libzfs was given. if test ${enable_libzfs+y} then : enableval=$enable_libzfs; fi if test x"$enable_libzfs" = xno ; then libzfs_excuse="explicitly disabled" fi if test x"$libzfs_excuse" = x ; then # Only check for system headers if libzfs support has not been disabled. ac_fn_c_check_header_compile "$LINENO" "libzfs.h" "ac_cv_header_libzfs_h" "$ac_includes_default" if test "x$ac_cv_header_libzfs_h" = xyes then : printf "%s\n" "#define HAVE_LIBZFS_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "libnvpair.h" "ac_cv_header_libnvpair_h" "$ac_includes_default" if test "x$ac_cv_header_libnvpair_h" = xyes then : printf "%s\n" "#define HAVE_LIBNVPAIR_H 1" >>confdefs.h fi fi if test x"$libzfs_excuse" = x ; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libzfs_init in -lzfs" >&5 printf %s "checking for libzfs_init in -lzfs... " >&6; } if test ${ac_cv_lib_zfs_libzfs_init+y} then : printf %s "(cached) " >&6 else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-lzfs $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ char libzfs_init (); int main (void) { return libzfs_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_zfs_libzfs_init=yes else $as_nop ac_cv_lib_zfs_libzfs_init=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_zfs_libzfs_init" >&5 printf "%s\n" "$ac_cv_lib_zfs_libzfs_init" >&6; } if test "x$ac_cv_lib_zfs_libzfs_init" = xyes then : printf "%s\n" "#define HAVE_LIBZFS 1" >>confdefs.h LIBS="-lzfs $LIBS" else $as_nop libzfs_excuse="need zfs library" fi fi if test x"$libzfs_excuse" = x ; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for nvlist_lookup_string in -lnvpair" >&5 printf %s "checking for nvlist_lookup_string in -lnvpair... " >&6; } if test ${ac_cv_lib_nvpair_nvlist_lookup_string+y} then : printf %s "(cached) " >&6 else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-lnvpair $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ char nvlist_lookup_string (); int main (void) { return nvlist_lookup_string (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_nvpair_nvlist_lookup_string=yes else $as_nop ac_cv_lib_nvpair_nvlist_lookup_string=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nvpair_nvlist_lookup_string" >&5 printf "%s\n" "$ac_cv_lib_nvpair_nvlist_lookup_string" >&6; } if test "x$ac_cv_lib_nvpair_nvlist_lookup_string" = xyes then : have_normal_nvpair=yes else $as_nop have_normal_nvpair=no fi if test x"$have_normal_nvpair" = xno ; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for opensolaris_nvlist_lookup_string in -lnvpair" >&5 printf %s "checking for opensolaris_nvlist_lookup_string in -lnvpair... " >&6; } if test ${ac_cv_lib_nvpair_opensolaris_nvlist_lookup_string+y} then : printf %s "(cached) " >&6 else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-lnvpair $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ char opensolaris_nvlist_lookup_string (); int main (void) { return opensolaris_nvlist_lookup_string (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_nvpair_opensolaris_nvlist_lookup_string=yes else $as_nop ac_cv_lib_nvpair_opensolaris_nvlist_lookup_string=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nvpair_opensolaris_nvlist_lookup_string" >&5 printf "%s\n" "$ac_cv_lib_nvpair_opensolaris_nvlist_lookup_string" >&6; } if test "x$ac_cv_lib_nvpair_opensolaris_nvlist_lookup_string" = xyes then : have_prefixed_nvpair=yes else $as_nop have_prefixed_nvpair=no fi if test x"$have_prefixed_nvpair" = xyes ; then printf "%s\n" "#define GRUB_UTIL_NVPAIR_IS_PREFIXED 1" >>confdefs.h else libzfs_excuse="need nvpair library" fi fi fi if test x"$enable_libzfs" = xyes && test x"$libzfs_excuse" != x ; then as_fn_error $? "libzfs support was explicitly requested but requirements are not satisfied ($libzfs_excuse)" "$LINENO" 5 fi if test x"$libzfs_excuse" = x ; then # We need both libzfs and libnvpair for a successful build. LIBZFS="-lzfs" LIBNVPAIR="-lnvpair" printf "%s\n" "#define USE_LIBZFS 1" >>confdefs.h fi # Check whether --enable-grub-protect was given. if test ${enable_grub_protect+y} then : enableval=$enable_grub_protect; fi if test x"$enable_grub_protect" = xno ; then grub_protect_excuse="explicitly disabled" fi LIBTASN1= if test x"$grub_protect_excuse" = x ; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for asn1_write_value in -ltasn1" >&5 printf %s "checking for asn1_write_value in -ltasn1... " >&6; } if test ${ac_cv_lib_tasn1_asn1_write_value+y} then : printf %s "(cached) " >&6 else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-ltasn1 $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ char asn1_write_value (); int main (void) { return asn1_write_value (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_tasn1_asn1_write_value=yes else $as_nop ac_cv_lib_tasn1_asn1_write_value=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_tasn1_asn1_write_value" >&5 printf "%s\n" "$ac_cv_lib_tasn1_asn1_write_value" >&6; } if test "x$ac_cv_lib_tasn1_asn1_write_value" = xyes then : LIBTASN1="-ltasn1" else $as_nop grub_protect_excuse="need libtasn1 library" fi fi if test x"$enable_grub_protect" = xyes && test x"$grub_protect_excuse" != x ; then as_fn_error $? "grub-protect was explicitly requested but can't be compiled ($grub_protect_excuse)" "$LINENO" 5 fi if test x"$grub_protect_excuse" = x ; then enable_grub_protect=yes else enable_grub_protect=no fi LIBS="" if test x$target_cpu = xi386 -a x$platform = xqemu then : GRUB_BOOT_MACHINE_LINK_ADDR=0xffe00 fi # Check whether --enable-werror was given. if test ${enable_werror+y} then : enableval=$enable_werror; fi if test x"$enable_werror" != xno ; then TARGET_CFLAGS="$TARGET_CFLAGS -Werror" HOST_CFLAGS="$HOST_CFLAGS -Werror" if test "x$grub_cv_cc_target_clang" = xyes; then TARGET_CFLAGS="$TARGET_CFLAGS -Wno-error=vla" HOST_CFLAGS="$HOST_CFLAGS -Wno-error=vla" fi fi TARGET_CPP="$TARGET_CC -E" TARGET_CCAS=$TARGET_CC # Includes which include make-time substitutions. They must come last # as to avoid executing top_builddir in shell. HOST_CPPFLAGS="$HOST_CPPFLAGS -I\$(top_builddir)/include" TARGET_CPPFLAGS="$TARGET_CPPFLAGS -I\$(top_srcdir)/include" TARGET_CPPFLAGS="$TARGET_CPPFLAGS -I\$(top_builddir)/include" GRUB_TARGET_CPU="${target_cpu}" GRUB_PLATFORM="${platform}" # # Automake conditionals # if test x$platform != xnone; then COND_real_platform_TRUE= COND_real_platform_FALSE='#' else COND_real_platform_TRUE='#' COND_real_platform_FALSE= fi if test x$platform = xemu; then COND_emu_TRUE= COND_emu_FALSE='#' else COND_emu_TRUE='#' COND_emu_FALSE= fi if test x$target_cpu = xarm ; then COND_arm_TRUE= COND_arm_FALSE='#' else COND_arm_TRUE='#' COND_arm_FALSE= fi if test x$target_cpu = xarm -a x$platform = xuboot; then COND_arm_uboot_TRUE= COND_arm_uboot_FALSE='#' else COND_arm_uboot_TRUE='#' COND_arm_uboot_FALSE= fi if test x$target_cpu = xarm -a x$platform = xcoreboot; then COND_arm_coreboot_TRUE= COND_arm_coreboot_FALSE='#' else COND_arm_coreboot_TRUE='#' COND_arm_coreboot_FALSE= fi if test x$target_cpu = xarm -a x$platform = xefi; then COND_arm_efi_TRUE= COND_arm_efi_FALSE='#' else COND_arm_efi_TRUE='#' COND_arm_efi_FALSE= fi if test x$target_cpu = xarm64 ; then COND_arm64_TRUE= COND_arm64_FALSE='#' else COND_arm64_TRUE='#' COND_arm64_FALSE= fi if test x$target_cpu = xarm64 -a x$platform = xefi; then COND_arm64_efi_TRUE= COND_arm64_efi_FALSE='#' else COND_arm64_efi_TRUE='#' COND_arm64_efi_FALSE= fi if test x$target_cpu = xia64 -a x$platform = xefi; then COND_ia64_efi_TRUE= COND_ia64_efi_FALSE='#' else COND_ia64_efi_TRUE='#' COND_ia64_efi_FALSE= fi if test x$target_cpu = xi386 -a x$platform = xpc; then COND_i386_pc_TRUE= COND_i386_pc_FALSE='#' else COND_i386_pc_TRUE='#' COND_i386_pc_FALSE= fi if test x$target_cpu = xi386 -a x$platform = xefi; then COND_i386_efi_TRUE= COND_i386_efi_FALSE='#' else COND_i386_efi_TRUE='#' COND_i386_efi_FALSE= fi if test x$target_cpu = xi386 -a x$platform = xqemu; then COND_i386_qemu_TRUE= COND_i386_qemu_FALSE='#' else COND_i386_qemu_TRUE='#' COND_i386_qemu_FALSE= fi if test x$target_cpu = xi386 -a x$platform = xieee1275; then COND_i386_ieee1275_TRUE= COND_i386_ieee1275_FALSE='#' else COND_i386_ieee1275_TRUE='#' COND_i386_ieee1275_FALSE= fi if test x$target_cpu = xi386 -a x$platform = xcoreboot; then COND_i386_coreboot_TRUE= COND_i386_coreboot_FALSE='#' else COND_i386_coreboot_TRUE='#' COND_i386_coreboot_FALSE= fi if test x$target_cpu = xi386 -a x$platform = xmultiboot; then COND_i386_multiboot_TRUE= COND_i386_multiboot_FALSE='#' else COND_i386_multiboot_TRUE='#' COND_i386_multiboot_FALSE= fi if test x$target_cpu = xi386 -a x$platform = xxen; then COND_i386_xen_TRUE= COND_i386_xen_FALSE='#' else COND_i386_xen_TRUE='#' COND_i386_xen_FALSE= fi if test x$target_cpu = xi386 -a x$platform = xxen_pvh; then COND_i386_xen_pvh_TRUE= COND_i386_xen_pvh_FALSE='#' else COND_i386_xen_pvh_TRUE='#' COND_i386_xen_pvh_FALSE= fi if test x$target_cpu = xloongarch64; then COND_loongarch64_TRUE= COND_loongarch64_FALSE='#' else COND_loongarch64_TRUE='#' COND_loongarch64_FALSE= fi if test x$target_cpu = xloongarch64 -a x$platform = xefi; then COND_loongarch64_efi_TRUE= COND_loongarch64_efi_FALSE='#' else COND_loongarch64_efi_TRUE='#' COND_loongarch64_efi_FALSE= fi if test x$target_cpu = xmips -o x$target_cpu = xmipsel; then COND_mips_TRUE= COND_mips_FALSE='#' else COND_mips_TRUE='#' COND_mips_FALSE= fi if test "(" x$target_cpu = xmips -o x$target_cpu = xmipsel ")" -a x$platform = xarc; then COND_mips_arc_TRUE= COND_mips_arc_FALSE='#' else COND_mips_arc_TRUE='#' COND_mips_arc_FALSE= fi if test x$target_cpu = xmipsel -a x$platform = xloongson; then COND_mips_loongson_TRUE= COND_mips_loongson_FALSE='#' else COND_mips_loongson_TRUE='#' COND_mips_loongson_FALSE= fi if test "(" x$target_cpu = xmips -o x$target_cpu = xmipsel ")" -a x$platform = xqemu_mips; then COND_mips_qemu_mips_TRUE= COND_mips_qemu_mips_FALSE='#' else COND_mips_qemu_mips_TRUE='#' COND_mips_qemu_mips_FALSE= fi if test x$target_cpu = xmipsel; then COND_mipsel_TRUE= COND_mipsel_FALSE='#' else COND_mipsel_TRUE='#' COND_mipsel_FALSE= fi if test x$target_cpu = xmips; then COND_mipseb_TRUE= COND_mipseb_FALSE='#' else COND_mipseb_TRUE='#' COND_mipseb_FALSE= fi if test x$target_cpu = xpowerpc -a x$platform = xieee1275; then COND_powerpc_ieee1275_TRUE= COND_powerpc_ieee1275_FALSE='#' else COND_powerpc_ieee1275_TRUE='#' COND_powerpc_ieee1275_FALSE= fi if test x$target_cpu = xriscv32 ; then COND_riscv32_TRUE= COND_riscv32_FALSE='#' else COND_riscv32_TRUE='#' COND_riscv32_FALSE= fi if test x$target_cpu = xriscv64 ; then COND_riscv64_TRUE= COND_riscv64_FALSE='#' else COND_riscv64_TRUE='#' COND_riscv64_FALSE= fi if test x$target_cpu = xriscv32 -a x$platform = xefi; then COND_riscv32_efi_TRUE= COND_riscv32_efi_FALSE='#' else COND_riscv32_efi_TRUE='#' COND_riscv32_efi_FALSE= fi if test x$target_cpu = xriscv64 -a x$platform = xefi; then COND_riscv64_efi_TRUE= COND_riscv64_efi_FALSE='#' else COND_riscv64_efi_TRUE='#' COND_riscv64_efi_FALSE= fi if test x$target_cpu = xsparc64 -a x$platform = xieee1275; then COND_sparc64_ieee1275_TRUE= COND_sparc64_ieee1275_FALSE='#' else COND_sparc64_ieee1275_TRUE='#' COND_sparc64_ieee1275_FALSE= fi if test x$target_cpu = xsparc64 -a x$platform = xemu; then COND_sparc64_emu_TRUE= COND_sparc64_emu_FALSE='#' else COND_sparc64_emu_TRUE='#' COND_sparc64_emu_FALSE= fi if test x$target_cpu = xx86_64 -a x$platform = xefi; then COND_x86_64_efi_TRUE= COND_x86_64_efi_FALSE='#' else COND_x86_64_efi_TRUE='#' COND_x86_64_efi_FALSE= fi if test x$target_cpu = xx86_64 -a x$platform = xxen; then COND_x86_64_xen_TRUE= COND_x86_64_xen_FALSE='#' else COND_x86_64_xen_TRUE='#' COND_x86_64_xen_FALSE= fi if test x$host_kernel = xhurd; then COND_HOST_HURD_TRUE= COND_HOST_HURD_FALSE='#' else COND_HOST_HURD_TRUE='#' COND_HOST_HURD_FALSE= fi if test x$host_kernel = xlinux; then COND_HOST_LINUX_TRUE= COND_HOST_LINUX_FALSE='#' else COND_HOST_LINUX_TRUE='#' COND_HOST_LINUX_FALSE= fi if test x$host_kernel = xnetbsd; then COND_HOST_NETBSD_TRUE= COND_HOST_NETBSD_FALSE='#' else COND_HOST_NETBSD_TRUE='#' COND_HOST_NETBSD_FALSE= fi if test x$host_kernel = xwindows; then COND_HOST_WINDOWS_TRUE= COND_HOST_WINDOWS_FALSE='#' else COND_HOST_WINDOWS_TRUE='#' COND_HOST_WINDOWS_FALSE= fi if test x$host_kernel = xkfreebsd; then COND_HOST_KFREEBSD_TRUE= COND_HOST_KFREEBSD_FALSE='#' else COND_HOST_KFREEBSD_TRUE='#' COND_HOST_KFREEBSD_FALSE= fi if test x$host_kernel = xxnu; then COND_HOST_XNU_TRUE= COND_HOST_XNU_FALSE='#' else COND_HOST_XNU_TRUE='#' COND_HOST_XNU_FALSE= fi if test x$host_kernel = xillumos; then COND_HOST_ILLUMOS_TRUE= COND_HOST_ILLUMOS_FALSE='#' else COND_HOST_ILLUMOS_TRUE='#' COND_HOST_ILLUMOS_FALSE= fi if test x$cross_compiling = xno -a x$HELP2MAN != x; then COND_MAN_PAGES_TRUE= COND_MAN_PAGES_FALSE='#' else COND_MAN_PAGES_TRUE='#' COND_MAN_PAGES_FALSE= fi if test x$enable_grub_emu_sdl2 = xyes; then COND_GRUB_EMU_SDL2_TRUE= COND_GRUB_EMU_SDL2_FALSE='#' else COND_GRUB_EMU_SDL2_TRUE='#' COND_GRUB_EMU_SDL2_FALSE= fi if test x$enable_grub_emu_sdl = xyes; then COND_GRUB_EMU_SDL_TRUE= COND_GRUB_EMU_SDL_FALSE='#' else COND_GRUB_EMU_SDL_TRUE='#' COND_GRUB_EMU_SDL_FALSE= fi if test x$enable_grub_emu_pci = xyes; then COND_GRUB_EMU_PCI_TRUE= COND_GRUB_EMU_PCI_FALSE='#' else COND_GRUB_EMU_PCI_TRUE='#' COND_GRUB_EMU_PCI_FALSE= fi if test x$enable_grub_mkfont = xyes; then COND_GRUB_MKFONT_TRUE= COND_GRUB_MKFONT_FALSE='#' else COND_GRUB_MKFONT_TRUE='#' COND_GRUB_MKFONT_FALSE= fi if test x$enable_grub_mount = xyes; then COND_GRUB_MOUNT_TRUE= COND_GRUB_MOUNT_FALSE='#' else COND_GRUB_MOUNT_TRUE='#' COND_GRUB_MOUNT_FALSE= fi if test x$enable_grub_protect = xyes; then COND_GRUB_PROTECT_TRUE= COND_GRUB_PROTECT_FALSE='#' else COND_GRUB_PROTECT_TRUE='#' COND_GRUB_PROTECT_FALSE= fi if test x$FONT_SOURCE != x; then COND_HAVE_FONT_SOURCE_TRUE= COND_HAVE_FONT_SOURCE_FALSE='#' else COND_HAVE_FONT_SOURCE_TRUE='#' COND_HAVE_FONT_SOURCE_FALSE= fi if test x$FONT_SOURCE != x ; then HAVE_FONT_SOURCE=1 else HAVE_FONT_SOURCE=0 fi if test x$TARGET_APPLE_LINKER = x1; then COND_APPLE_LINKER_TRUE= COND_APPLE_LINKER_FALSE='#' else COND_APPLE_LINKER_TRUE='#' COND_APPLE_LINKER_FALSE= fi if test x$enable_efiemu = xyes; then COND_ENABLE_EFIEMU_TRUE= COND_ENABLE_EFIEMU_FALSE='#' else COND_ENABLE_EFIEMU_TRUE='#' COND_ENABLE_EFIEMU_FALSE= fi if test x$DISK_CACHE_STATS = x1; then COND_ENABLE_CACHE_STATS_TRUE= COND_ENABLE_CACHE_STATS_FALSE='#' else COND_ENABLE_CACHE_STATS_TRUE='#' COND_ENABLE_CACHE_STATS_FALSE= fi if test x$BOOT_TIME_STATS = x1; then COND_ENABLE_BOOT_TIME_STATS_TRUE= COND_ENABLE_BOOT_TIME_STATS_FALSE='#' else COND_ENABLE_BOOT_TIME_STATS_TRUE='#' COND_ENABLE_BOOT_TIME_STATS_FALSE= fi if test x$HAVE_CXX = xyes; then COND_HAVE_CXX_TRUE= COND_HAVE_CXX_FALSE='#' else COND_HAVE_CXX_TRUE='#' COND_HAVE_CXX_FALSE= fi if test x$HAVE_ASM_USCORE = x1; then COND_HAVE_ASM_USCORE_TRUE= COND_HAVE_ASM_USCORE_FALSE='#' else COND_HAVE_ASM_USCORE_TRUE='#' COND_HAVE_ASM_USCORE_FALSE= fi if test "x$starfield_excuse" = x; then COND_STARFIELD_TRUE= COND_STARFIELD_FALSE='#' else COND_STARFIELD_TRUE='#' COND_STARFIELD_FALSE= fi if test "x$have_exec" = xy; then COND_HAVE_EXEC_TRUE= COND_HAVE_EXEC_FALSE='#' else COND_HAVE_EXEC_TRUE='#' COND_HAVE_EXEC_FALSE= fi if test "x$have_pci" = xy; then COND_HAVE_PCI_TRUE= COND_HAVE_PCI_FALSE='#' else COND_HAVE_PCI_TRUE='#' COND_HAVE_PCI_FALSE= fi test "x$prefix" = xNONE && prefix="$ac_default_prefix" test "x$exec_prefix" = xNONE && exec_prefix="${prefix}" datarootdir="$(eval echo "$datarootdir")" grub_libdir="$(eval echo "$libdir")" grub_localedir="$(eval echo "$localedir")" grub_datadir="$(eval echo "$datadir")" grub_sysconfdir="$(eval echo "$sysconfdir")" printf "%s\n" "#define LOCALEDIR \"$grub_localedir\"" >>confdefs.h printf "%s\n" "#define GRUB_LIBDIR \"$grub_libdir\"" >>confdefs.h printf "%s\n" "#define GRUB_DATADIR \"$grub_datadir\"" >>confdefs.h printf "%s\n" "#define GRUB_SYSCONFDIR \"$grub_sysconfdir\"" >>confdefs.h # Output files. if test "$platform" != none; then cpudir="${target_cpu}" if test x${cpudir} = xmipsel; then cpudir=mips; fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ln -s can handle directories properly" >&5 printf %s "checking whether ln -s can handle directories properly... " >&6; } mkdir testdir 2>/dev/null case $srcdir in [\\/$]* | ?:[\\/]* ) reldir=$srcdir/include/grub/util ;; *) reldir=../$srcdir/include/grub/util ;; esac if ln -s $reldir testdir/util 2>/dev/null && rm -f testdir/util 2>/dev/null ; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } link_dir=yes else link_dir=no { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi rm -rf testdir if test x"$link_dir" = xyes ; then ac_config_links="$ac_config_links include/grub/cpu:include/grub/$cpudir" if test "$platform" != emu ; then ac_config_links="$ac_config_links include/grub/machine:include/grub/$cpudir/$platform" fi else mkdir -p include/grub 2>/dev/null rm -rf include/grub/cpu cp -rp $srcdir/include/grub/$cpudir include/grub/cpu 2>/dev/null if test "$platform" != emu ; then rm -rf include/grub/machine cp -rp $srcdir/include/grub/$cpudir/$platform include/grub/machine 2>/dev/null fi fi else # Just enough to stop the compiler failing with -I$(srcdir)/include. mkdir -p include 2>/dev/null rm -rf include/grub/cpu include/grub/machine fi ac_config_files="$ac_config_files Makefile" ac_config_files="$ac_config_files grub-core/Makefile" ac_config_files="$ac_config_files grub-core/lib/gnulib/Makefile" ac_config_files="$ac_config_files po/Makefile.in" ac_config_files="$ac_config_files docs/Makefile" ac_config_files="$ac_config_files util/bash-completion.d/Makefile" ac_config_files="$ac_config_files stamp-h" ac_config_files="$ac_config_files config.h" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test ${\1+y} || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 printf "%s\n" "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 printf "%s\n" "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`printf "%s\n" "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 printf %s "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: done" >&5 printf "%s\n" "done" >&6; } if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCCAS_TRUE}" && test -z "${am__fastdepCCAS_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCCAS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${GL_COND_LIBTOOL_TRUE}" && test -z "${GL_COND_LIBTOOL_FALSE}"; then as_fn_error $? "conditional \"GL_COND_LIBTOOL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi gl_libobjs= gl_ltlibobjs= gl_libobjdeps= if test -n "$gl_LIBOBJS"; then # Remove the extension. sed_drop_objext='s/\.o$//;s/\.obj$//' sed_dirname1='s,//*,/,g' sed_dirname2='s,\(.\)/$,\1,' sed_dirname3='s,^[^/]*$,.,' sed_dirname4='s,\(.\)/[^/]*$,\1,' sed_basename1='s,.*/,,' for i in `for i in $gl_LIBOBJS; do echo "$i"; done | sed -e "$sed_drop_objext" | sort | uniq`; do gl_libobjs="$gl_libobjs $i.$ac_objext" gl_ltlibobjs="$gl_ltlibobjs $i.lo" i_dir=`echo "$i" | sed -e "$sed_dirname1" -e "$sed_dirname2" -e "$sed_dirname3" -e "$sed_dirname4"` i_base=`echo "$i" | sed -e "$sed_basename1"` gl_libobjdeps="$gl_libobjdeps $i_dir/\$(DEPDIR)/$i_base.Po" done fi gl_LIBOBJS=$gl_libobjs gl_LTLIBOBJS=$gl_ltlibobjs gl_LIBOBJDEPS=$gl_libobjdeps gltests_libobjs= gltests_ltlibobjs= gltests_libobjdeps= if test -n "$gltests_LIBOBJS"; then # Remove the extension. sed_drop_objext='s/\.o$//;s/\.obj$//' sed_dirname1='s,//*,/,g' sed_dirname2='s,\(.\)/$,\1,' sed_dirname3='s,^[^/]*$,.,' sed_dirname4='s,\(.\)/[^/]*$,\1,' sed_basename1='s,.*/,,' for i in `for i in $gltests_LIBOBJS; do echo "$i"; done | sed -e "$sed_drop_objext" | sort | uniq`; do gltests_libobjs="$gltests_libobjs $i.$ac_objext" gltests_ltlibobjs="$gltests_ltlibobjs $i.lo" i_dir=`echo "$i" | sed -e "$sed_dirname1" -e "$sed_dirname2" -e "$sed_dirname3" -e "$sed_dirname4"` i_base=`echo "$i" | sed -e "$sed_basename1"` gltests_libobjdeps="$gltests_libobjdeps $i_dir/\$(DEPDIR)/$i_base.Po" done fi gltests_LIBOBJS=$gltests_libobjs gltests_LTLIBOBJS=$gltests_ltlibobjs gltests_LIBOBJDEPS=$gltests_libobjdeps if test -z "${COND_MM_DEBUG_TRUE}" && test -z "${COND_MM_DEBUG_FALSE}"; then as_fn_error $? "conditional \"COND_MM_DEBUG\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COND_real_platform_TRUE}" && test -z "${COND_real_platform_FALSE}"; then as_fn_error $? "conditional \"COND_real_platform\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COND_emu_TRUE}" && test -z "${COND_emu_FALSE}"; then as_fn_error $? "conditional \"COND_emu\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COND_arm_TRUE}" && test -z "${COND_arm_FALSE}"; then as_fn_error $? "conditional \"COND_arm\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COND_arm_uboot_TRUE}" && test -z "${COND_arm_uboot_FALSE}"; then as_fn_error $? "conditional \"COND_arm_uboot\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COND_arm_coreboot_TRUE}" && test -z "${COND_arm_coreboot_FALSE}"; then as_fn_error $? "conditional \"COND_arm_coreboot\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COND_arm_efi_TRUE}" && test -z "${COND_arm_efi_FALSE}"; then as_fn_error $? "conditional \"COND_arm_efi\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COND_arm64_TRUE}" && test -z "${COND_arm64_FALSE}"; then as_fn_error $? "conditional \"COND_arm64\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COND_arm64_efi_TRUE}" && test -z "${COND_arm64_efi_FALSE}"; then as_fn_error $? "conditional \"COND_arm64_efi\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COND_ia64_efi_TRUE}" && test -z "${COND_ia64_efi_FALSE}"; then as_fn_error $? "conditional \"COND_ia64_efi\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COND_i386_pc_TRUE}" && test -z "${COND_i386_pc_FALSE}"; then as_fn_error $? "conditional \"COND_i386_pc\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COND_i386_efi_TRUE}" && test -z "${COND_i386_efi_FALSE}"; then as_fn_error $? "conditional \"COND_i386_efi\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COND_i386_qemu_TRUE}" && test -z "${COND_i386_qemu_FALSE}"; then as_fn_error $? "conditional \"COND_i386_qemu\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COND_i386_ieee1275_TRUE}" && test -z "${COND_i386_ieee1275_FALSE}"; then as_fn_error $? "conditional \"COND_i386_ieee1275\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COND_i386_coreboot_TRUE}" && test -z "${COND_i386_coreboot_FALSE}"; then as_fn_error $? "conditional \"COND_i386_coreboot\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COND_i386_multiboot_TRUE}" && test -z "${COND_i386_multiboot_FALSE}"; then as_fn_error $? "conditional \"COND_i386_multiboot\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COND_i386_xen_TRUE}" && test -z "${COND_i386_xen_FALSE}"; then as_fn_error $? "conditional \"COND_i386_xen\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COND_i386_xen_pvh_TRUE}" && test -z "${COND_i386_xen_pvh_FALSE}"; then as_fn_error $? "conditional \"COND_i386_xen_pvh\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COND_loongarch64_TRUE}" && test -z "${COND_loongarch64_FALSE}"; then as_fn_error $? "conditional \"COND_loongarch64\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COND_loongarch64_efi_TRUE}" && test -z "${COND_loongarch64_efi_FALSE}"; then as_fn_error $? "conditional \"COND_loongarch64_efi\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COND_mips_TRUE}" && test -z "${COND_mips_FALSE}"; then as_fn_error $? "conditional \"COND_mips\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COND_mips_arc_TRUE}" && test -z "${COND_mips_arc_FALSE}"; then as_fn_error $? "conditional \"COND_mips_arc\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COND_mips_loongson_TRUE}" && test -z "${COND_mips_loongson_FALSE}"; then as_fn_error $? "conditional \"COND_mips_loongson\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COND_mips_qemu_mips_TRUE}" && test -z "${COND_mips_qemu_mips_FALSE}"; then as_fn_error $? "conditional \"COND_mips_qemu_mips\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COND_mipsel_TRUE}" && test -z "${COND_mipsel_FALSE}"; then as_fn_error $? "conditional \"COND_mipsel\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COND_mipseb_TRUE}" && test -z "${COND_mipseb_FALSE}"; then as_fn_error $? "conditional \"COND_mipseb\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COND_powerpc_ieee1275_TRUE}" && test -z "${COND_powerpc_ieee1275_FALSE}"; then as_fn_error $? "conditional \"COND_powerpc_ieee1275\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COND_riscv32_TRUE}" && test -z "${COND_riscv32_FALSE}"; then as_fn_error $? "conditional \"COND_riscv32\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COND_riscv64_TRUE}" && test -z "${COND_riscv64_FALSE}"; then as_fn_error $? "conditional \"COND_riscv64\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COND_riscv32_efi_TRUE}" && test -z "${COND_riscv32_efi_FALSE}"; then as_fn_error $? "conditional \"COND_riscv32_efi\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COND_riscv64_efi_TRUE}" && test -z "${COND_riscv64_efi_FALSE}"; then as_fn_error $? "conditional \"COND_riscv64_efi\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COND_sparc64_ieee1275_TRUE}" && test -z "${COND_sparc64_ieee1275_FALSE}"; then as_fn_error $? "conditional \"COND_sparc64_ieee1275\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COND_sparc64_emu_TRUE}" && test -z "${COND_sparc64_emu_FALSE}"; then as_fn_error $? "conditional \"COND_sparc64_emu\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COND_x86_64_efi_TRUE}" && test -z "${COND_x86_64_efi_FALSE}"; then as_fn_error $? "conditional \"COND_x86_64_efi\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COND_x86_64_xen_TRUE}" && test -z "${COND_x86_64_xen_FALSE}"; then as_fn_error $? "conditional \"COND_x86_64_xen\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COND_HOST_HURD_TRUE}" && test -z "${COND_HOST_HURD_FALSE}"; then as_fn_error $? "conditional \"COND_HOST_HURD\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COND_HOST_LINUX_TRUE}" && test -z "${COND_HOST_LINUX_FALSE}"; then as_fn_error $? "conditional \"COND_HOST_LINUX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COND_HOST_NETBSD_TRUE}" && test -z "${COND_HOST_NETBSD_FALSE}"; then as_fn_error $? "conditional \"COND_HOST_NETBSD\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COND_HOST_WINDOWS_TRUE}" && test -z "${COND_HOST_WINDOWS_FALSE}"; then as_fn_error $? "conditional \"COND_HOST_WINDOWS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COND_HOST_KFREEBSD_TRUE}" && test -z "${COND_HOST_KFREEBSD_FALSE}"; then as_fn_error $? "conditional \"COND_HOST_KFREEBSD\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COND_HOST_XNU_TRUE}" && test -z "${COND_HOST_XNU_FALSE}"; then as_fn_error $? "conditional \"COND_HOST_XNU\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COND_HOST_ILLUMOS_TRUE}" && test -z "${COND_HOST_ILLUMOS_FALSE}"; then as_fn_error $? "conditional \"COND_HOST_ILLUMOS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COND_MAN_PAGES_TRUE}" && test -z "${COND_MAN_PAGES_FALSE}"; then as_fn_error $? "conditional \"COND_MAN_PAGES\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COND_GRUB_EMU_SDL2_TRUE}" && test -z "${COND_GRUB_EMU_SDL2_FALSE}"; then as_fn_error $? "conditional \"COND_GRUB_EMU_SDL2\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COND_GRUB_EMU_SDL_TRUE}" && test -z "${COND_GRUB_EMU_SDL_FALSE}"; then as_fn_error $? "conditional \"COND_GRUB_EMU_SDL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COND_GRUB_EMU_PCI_TRUE}" && test -z "${COND_GRUB_EMU_PCI_FALSE}"; then as_fn_error $? "conditional \"COND_GRUB_EMU_PCI\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COND_GRUB_MKFONT_TRUE}" && test -z "${COND_GRUB_MKFONT_FALSE}"; then as_fn_error $? "conditional \"COND_GRUB_MKFONT\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COND_GRUB_MOUNT_TRUE}" && test -z "${COND_GRUB_MOUNT_FALSE}"; then as_fn_error $? "conditional \"COND_GRUB_MOUNT\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COND_GRUB_PROTECT_TRUE}" && test -z "${COND_GRUB_PROTECT_FALSE}"; then as_fn_error $? "conditional \"COND_GRUB_PROTECT\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COND_HAVE_FONT_SOURCE_TRUE}" && test -z "${COND_HAVE_FONT_SOURCE_FALSE}"; then as_fn_error $? "conditional \"COND_HAVE_FONT_SOURCE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COND_APPLE_LINKER_TRUE}" && test -z "${COND_APPLE_LINKER_FALSE}"; then as_fn_error $? "conditional \"COND_APPLE_LINKER\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COND_ENABLE_EFIEMU_TRUE}" && test -z "${COND_ENABLE_EFIEMU_FALSE}"; then as_fn_error $? "conditional \"COND_ENABLE_EFIEMU\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COND_ENABLE_CACHE_STATS_TRUE}" && test -z "${COND_ENABLE_CACHE_STATS_FALSE}"; then as_fn_error $? "conditional \"COND_ENABLE_CACHE_STATS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COND_ENABLE_BOOT_TIME_STATS_TRUE}" && test -z "${COND_ENABLE_BOOT_TIME_STATS_FALSE}"; then as_fn_error $? "conditional \"COND_ENABLE_BOOT_TIME_STATS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COND_HAVE_CXX_TRUE}" && test -z "${COND_HAVE_CXX_FALSE}"; then as_fn_error $? "conditional \"COND_HAVE_CXX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COND_HAVE_ASM_USCORE_TRUE}" && test -z "${COND_HAVE_ASM_USCORE_FALSE}"; then as_fn_error $? "conditional \"COND_HAVE_ASM_USCORE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COND_STARFIELD_TRUE}" && test -z "${COND_STARFIELD_FALSE}"; then as_fn_error $? "conditional \"COND_STARFIELD\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COND_HAVE_EXEC_TRUE}" && test -z "${COND_HAVE_EXEC_FALSE}"; then as_fn_error $? "conditional \"COND_HAVE_EXEC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COND_HAVE_PCI_TRUE}" && test -z "${COND_HAVE_PCI_FALSE}"; then as_fn_error $? "conditional \"COND_HAVE_PCI\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 printf "%s\n" "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh as_nop=: if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else $as_nop case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi # Reset variables that may have inherited troublesome values from # the environment. # IFS needs to be set, to space, tab, and newline, in precisely that order. # (If _AS_PATH_WALK were called with IFS unset, it would have the # side effect of setting IFS to empty, thus disabling word splitting.) # Quoting is to prevent editors from complaining about space-tab. as_nl=' ' export as_nl IFS=" "" $as_nl" PS1='$ ' PS2='> ' PS4='+ ' # Ensure predictable behavior from utilities with locale-dependent output. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # We cannot yet rely on "unset" to work, but we need these variables # to be unset--not just set to an empty or harmless value--now, to # avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct # also avoids known problems related to "unset" and subshell syntax # in other old shells (e.g. bash 2.01 and pdksh 5.2.14). for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH do eval test \${$as_var+y} \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done # Ensure that fds 0, 1, and 2 are open. if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi if (exec 3>&2) ; then :; else exec 2>/dev/null; fi # The user is always right. if ${PATH_SEPARATOR+false} :; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac test -r "$as_dir$0" && as_myself=$as_dir$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi printf "%s\n" "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null then : eval 'as_fn_append () { eval $1+=\$2 }' else $as_nop as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null then : eval 'as_fn_arith () { as_val=$(( $* )) }' else $as_nop as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # Determine whether it's possible to make 'echo' print without a newline. # These variables are no longer used directly by Autoconf, but are AC_SUBSTed # for compatibility with existing Makefiles. ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac # For backward compatibility with old third-party macros, we provide # the shell variables $as_echo and $as_echo_n. New code should use # AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. as_echo='printf %s\n' as_echo_n='printf %s' rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by GRUB $as_me 2.14~git20250718.0e36779, which was generated by GNU Autoconf 2.71. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_links="$ac_config_links" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration links: $config_links Configuration commands: $config_commands Report bugs to ." _ACEOF ac_cs_config=`printf "%s\n" "$ac_configure_args" | sed "$ac_safe_unquote"` ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\''/g"` cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\ GRUB config.status 2.14~git20250718.0e36779 configured by $0, generated by GNU Autoconf 2.71, with options \\"\$ac_cs_config\\" Copyright (C) 2021 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) printf "%s\n" "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) printf "%s\n" "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) printf "%s\n" "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \printf "%s\n" "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX printf "%s\n" "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}" # Capture the value of obsolete ALL_LINGUAS because we need it to compute # POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES, CATALOGS. But hide it # from automake < 1.5. eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"' # Capture the value of LINGUAS because we need it to compute CATALOGS. LINGUAS="${LINGUAS-%UNSET%}" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "config-util.h") CONFIG_HEADERS="$CONFIG_HEADERS config-util.h" ;; "po-directories") CONFIG_COMMANDS="$CONFIG_COMMANDS po-directories" ;; "include/grub/cpu") CONFIG_LINKS="$CONFIG_LINKS include/grub/cpu:include/grub/$cpudir" ;; "include/grub/machine") CONFIG_LINKS="$CONFIG_LINKS include/grub/machine:include/grub/$cpudir/$platform" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "grub-core/Makefile") CONFIG_FILES="$CONFIG_FILES grub-core/Makefile" ;; "grub-core/lib/gnulib/Makefile") CONFIG_FILES="$CONFIG_FILES grub-core/lib/gnulib/Makefile" ;; "po/Makefile.in") CONFIG_FILES="$CONFIG_FILES po/Makefile.in" ;; "docs/Makefile") CONFIG_FILES="$CONFIG_FILES docs/Makefile" ;; "util/bash-completion.d/Makefile") CONFIG_FILES="$CONFIG_FILES util/bash-completion.d/Makefile" ;; "stamp-h") CONFIG_FILES="$CONFIG_FILES stamp-h" ;; "config.h") CONFIG_FILES="$CONFIG_FILES config.h" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test ${CONFIG_FILES+y} || CONFIG_FILES=$config_files test ${CONFIG_HEADERS+y} || CONFIG_HEADERS=$config_headers test ${CONFIG_LINKS+y} || CONFIG_LINKS=$config_links test ${CONFIG_COMMANDS+y} || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :L $CONFIG_LINKS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`printf "%s\n" "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` printf "%s\n" "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 printf "%s\n" "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`printf "%s\n" "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 printf "%s\n" "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 printf "%s\n" "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { printf "%s\n" "/* $configure_input */" >&1 \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 printf "%s\n" "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else printf "%s\n" "/* $configure_input */" >&1 \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :L) # # CONFIG_LINK # if test "$ac_source" = "$ac_file" && test "$srcdir" = '.'; then : else # Prefer the file from the source tree if names are identical. if test "$ac_source" = "$ac_file" || test ! -r "$ac_source"; then ac_source=$srcdir/$ac_source fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: linking $ac_source to $ac_file" >&5 printf "%s\n" "$as_me: linking $ac_source to $ac_file" >&6;} if test ! -r "$ac_source"; then as_fn_error $? "$ac_source: file not found" "$LINENO" 5 fi rm -f "$ac_file" # Try a relative symlink, then a hard link, then a copy. case $ac_source in [\\/$]* | ?:[\\/]* ) ac_rel_source=$ac_source ;; *) ac_rel_source=$ac_top_build_prefix$ac_source ;; esac ln -s "$ac_rel_source" "$ac_file" 2>/dev/null || ln "$ac_source" "$ac_file" 2>/dev/null || cp -p "$ac_source" "$ac_file" || as_fn_error $? "cannot link or copy $ac_source to $ac_file" "$LINENO" 5 fi ;; :C) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 printf "%s\n" "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. # TODO: see whether this extra hack can be removed once we start # requiring Autoconf 2.70 or later. case $CONFIG_FILES in #( *\'*) : eval set x "$CONFIG_FILES" ;; #( *) : set x $CONFIG_FILES ;; #( *) : ;; esac shift # Used to flag and report bootstrapping failures. am_rc=0 for am_mf do # Strip MF so we end up with the name of the file. am_mf=`printf "%s\n" "$am_mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile which includes # dependency-tracking related rules and includes. # Grep'ing the whole file directly is not great: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \ || continue am_dirpart=`$as_dirname -- "$am_mf" || $as_expr X"$am_mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$am_mf" : 'X\(//\)[^/]' \| \ X"$am_mf" : 'X\(//\)$' \| \ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$am_mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` am_filepart=`$as_basename -- "$am_mf" || $as_expr X/"$am_mf" : '.*/\([^/][^/]*\)/*$' \| \ X"$am_mf" : 'X\(//\)$' \| \ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X/"$am_mf" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` { echo "$as_me:$LINENO: cd "$am_dirpart" \ && sed -e '/# am--include-marker/d' "$am_filepart" \ | $MAKE -f - am--depfiles" >&5 (cd "$am_dirpart" \ && sed -e '/# am--include-marker/d' "$am_filepart" \ | $MAKE -f - am--depfiles) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } || am_rc=$? done if test $am_rc -ne 0; then { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "Something went wrong bootstrapping makefile fragments for automatic dependency tracking. If GNU make was not used, consider re-running the configure script with MAKE=\"gmake\" (or whatever is necessary). You can also try re-running configure with the '--disable-dependency-tracking' option to at least be able to build the package (albeit without support for automatic dependency tracking). See \`config.log' for more details" "$LINENO" 5; } fi { am_dirpart=; unset am_dirpart;} { am_filepart=; unset am_filepart;} { am_mf=; unset am_mf;} { am_rc=; unset am_rc;} rm -f conftest-deps.mk } ;; "po-directories":C) for ac_file in $CONFIG_FILES; do # Support "outfile[:infile[:infile...]]" case "$ac_file" in *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; esac # PO directories have a Makefile.in generated from Makefile.in.in. case "$ac_file" in */Makefile.in) # Adjust a relative srcdir. ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` ac_dir_suffix=/`echo "$ac_dir"|sed 's%^\./%%'` ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` # In autoconf-2.13 it is called $ac_given_srcdir. # In autoconf-2.50 it is called $srcdir. test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" case "$ac_given_srcdir" in .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; /*) top_srcdir="$ac_given_srcdir" ;; *) top_srcdir="$ac_dots$ac_given_srcdir" ;; esac # Treat a directory as a PO directory if and only if it has a # POTFILES.in file. This allows packages to have multiple PO # directories under different names or in different locations. if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then rm -f "$ac_dir/POTFILES" test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES" gt_tab=`printf '\t'` cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ${gt_tab}]*\$/d" -e "s,.*, $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES" POMAKEFILEDEPS="POTFILES.in" # ALL_LINGUAS, POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES depend # on $ac_dir but don't depend on user-specified configuration # parameters. if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then # The LINGUAS file contains the set of available languages. if test -n "$OBSOLETE_ALL_LINGUAS"; then test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete" fi ALL_LINGUAS_=`sed -e "/^#/d" -e "s/#.*//" "$ac_given_srcdir/$ac_dir/LINGUAS"` # Hide the ALL_LINGUAS assignment from automake < 1.5. eval 'ALL_LINGUAS''=$ALL_LINGUAS_' POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS" else # The set of available languages was given in configure.in. # Hide the ALL_LINGUAS assignment from automake < 1.5. eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS' fi # Compute POFILES # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po) # Compute UPDATEPOFILES # as $(foreach lang, $(ALL_LINGUAS), $(lang).po-update) # Compute DUMMYPOFILES # as $(foreach lang, $(ALL_LINGUAS), $(lang).nop) # Compute GMOFILES # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo) case "$ac_given_srcdir" in .) srcdirpre= ;; *) srcdirpre='$(srcdir)/' ;; esac POFILES= UPDATEPOFILES= DUMMYPOFILES= GMOFILES= for lang in $ALL_LINGUAS; do POFILES="$POFILES $srcdirpre$lang.po" UPDATEPOFILES="$UPDATEPOFILES $lang.po-update" DUMMYPOFILES="$DUMMYPOFILES $lang.nop" GMOFILES="$GMOFILES $srcdirpre$lang.gmo" done # CATALOGS depends on both $ac_dir and the user's LINGUAS # environment variable. INST_LINGUAS= if test -n "$ALL_LINGUAS"; then for presentlang in $ALL_LINGUAS; do useit=no if test "%UNSET%" != "$LINGUAS"; then desiredlanguages="$LINGUAS" else desiredlanguages="$ALL_LINGUAS" fi for desiredlang in $desiredlanguages; do # Use the presentlang catalog if desiredlang is # a. equal to presentlang, or # b. a variant of presentlang (because in this case, # presentlang can be used as a fallback for messages # which are not translated in the desiredlang catalog). case "$desiredlang" in "$presentlang"*) useit=yes;; esac done if test $useit = yes; then INST_LINGUAS="$INST_LINGUAS $presentlang" fi done fi CATALOGS= if test -n "$INST_LINGUAS"; then for lang in $INST_LINGUAS; do CATALOGS="$CATALOGS $lang.gmo" done fi test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile" sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile" for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do if test -f "$f"; then case "$f" in *.orig | *.bak | *~) ;; *) cat "$f" >> "$ac_dir/Makefile" ;; esac fi done fi ;; esac done ;; "stamp-h":F) echo timestamp > stamp-h ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi echo "*******************************************************" echo GRUB2 will be compiled with following components: echo Platform: "$target_cpu"-"$platform" if [ x"$platform" = xemu ]; then if [ x"$grub_emu_sdl2_excuse" = x ]; then echo SDL2 support for grub-emu: Yes else echo SDL2 support for grub-emu: No "($grub_emu_sdl2_excuse)" fi if [ x"$grub_emu_sdl_excuse" = x ]; then echo SDL support for grub-emu: Yes else echo SDL support for grub-emu: No "($grub_emu_sdl_excuse)" fi if [ x"$grub_emu_pci_excuse" = x ]; then echo PCI support for grub-emu: Yes else echo PCI support for grub-emu: No "($grub_emu_pci_excuse)" fi fi if test x"$device_mapper_excuse" = x ; then echo With devmapper support: Yes else echo With devmapper support: No "($device_mapper_excuse)" fi if [ x"$enable_mm_debug" = xyes ]; then echo With memory debugging: Yes else echo With memory debugging: No fi if [ x"$enable_cache_stats" = xyes ]; then echo With disk cache statistics: Yes else echo With disk cache statistics: No fi if [ x"$enable_boot_time" = xyes ]; then echo With boot time statistics: Yes else echo With boot time statistics: No fi if [ x"$efiemu_excuse" = x ]; then echo efiemu runtime: Yes else echo efiemu runtime: No "($efiemu_excuse)" fi if [ x"$grub_mkfont_excuse" = x ]; then echo grub-mkfont: Yes else echo grub-mkfont: No "($grub_mkfont_excuse)" fi if [ x"$grub_mount_excuse" = x ]; then echo grub-mount: Yes else echo grub-mount: No "($grub_mount_excuse)" fi if [ x"$grub_protect_excuse" = x ]; then echo grub-protect: Yes else echo grub-protect: No "($grub_protect_excuse)" fi if [ x"$starfield_excuse" = x ]; then echo starfield theme: Yes echo With DejaVuSans font from $DJVU_FONT_SOURCE else echo starfield theme: No "($starfield_excuse)" fi if [ x"$libzfs_excuse" = x ]; then echo With libzfs support: Yes else echo With libzfs support: No "($libzfs_excuse)" fi if [ x"$grub_build_mkfont_excuse" = x ]; then echo Build-time grub-mkfont: Yes if test "x$FONT_SOURCE" = x ; then echo "Without unifont" else echo "With unifont from $FONT_SOURCE" fi else echo Build-time grub-mkfont: No "($grub_build_mkfont_excuse)" echo "Without unifont (no build-time grub-mkfont)" fi if test x"$liblzma_excuse" != x ; then echo "Without liblzma (no support for XZ-compressed mips images) ($liblzma_excuse)" else echo "With liblzma from $LIBLZMA (support for XZ-compressed mips images)" fi if test "x$enable_stack_protector" != xno; then echo "With stack smashing protector: Yes" else echo "With stack smashing protector: No" fi echo "*******************************************************" grub-2.14~git20250718.0e36779/asm-tests/0000755000175000017500000000000015002425525013776 500000000000000grub-2.14~git20250718.0e36779/asm-tests/powerpc.S0000644000175000017500000000031215002425525015515 00000000000000/* clang <= 3.3 doesn't handle most of ppc assembly, not even inline assembly used by gcrypt */ /* Cache invalidation loop is a fair test. */ li 5, 0 1: icbi 5, 3 addi 5, 5, 32 cmpw 5, 4 blt 1b grub-2.14~git20250718.0e36779/asm-tests/i386.S0000644000175000017500000000011115002425525014524 00000000000000/* on x86 old clang doesn't support .code16 */ .code16 movb %al, %bl grub-2.14~git20250718.0e36779/asm-tests/i386-pc.S0000644000175000017500000000064115002425525015134 00000000000000/* on x86 old clang doesn't support .code16 newer clang supports it but creates 6-byte jumps instead of 3-byte ones which makes us go over boot sector size. Starting with 3.9 clang emits 3-byte jumps but still creates 8-bytes movl instead of 5-bytes, so code overflows into data. */ .code16 jmp far .org 4 jmp nearer .org 6 movl nearer, %ebx .org 11 .space 100 nearer: .space 200 far: .byte 0 grub-2.14~git20250718.0e36779/asm-tests/sparc64.S0000644000175000017500000000026015002425525015322 00000000000000 .text 1: /* A small list of examples of what clang doesn't support. */ clr %o0 lduw [%o4 + 4], %o4 and %o6, ~0xff, %o6 stw %o5, [%o3] bne,pt %icc, 1b nop grub-2.14~git20250718.0e36779/asm-tests/arm.S0000644000175000017500000000040115002425525014614 00000000000000/* on arm clang doesn't support .arch directive */ .text .syntax unified #if !defined (__thumb2__) .arch armv7a .arm #else .arch armv7 .thumb #endif mcr p15, 0, r11, c7, c14, 2 /* clang restricts access to dsb/isb despite .arch */ dsb isb grub-2.14~git20250718.0e36779/asm-tests/mips.S0000644000175000017500000000030615002425525015011 00000000000000/* on mips clang doesn't support privilegied instructions, doubleword store/load and crashes with hand-written assembly */ .set mips3 sync ld $t2, 0($t1) a: addiu $t1, $s0, (b - a) b: nop grub-2.14~git20250718.0e36779/geninit.sh0000644000175000017500000000324215000202015013751 00000000000000#! /bin/sh # # Copyright (C) 2002,2005,2007 Free Software Foundation, Inc. # # This gensymlist.sh is free software; the author # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. cat <. */ #include EOF for mod in "$@"; do echo "extern void grub_${mod}_init (void);" echo "extern void grub_${mod}_fini (void);" done cat <DIR_FD_MEMBER_NAME) #else # define DIR_TO_FD(Dir_p) -1 #endif /* Define to 1 if // is a file system root distinct from /. */ #undef DOUBLE_SLASH_IS_DISTINCT_ROOT /* Define to 1 if translation of program messages to the user's native language is requested. */ #undef ENABLE_NLS /* Define this to 1 if F_DUPFD behavior does not match POSIX */ #undef FCNTL_DUPFD_BUGGY /* Define to nothing if C supports flexible array members, and to 1 if it does not. That way, with a declaration like 'struct s { int n; short d[FLEXIBLE_ARRAY_MEMBER]; };', the struct hack can be used with pre-C99 compilers. Use 'FLEXSIZEOF (struct s, d, N * sizeof (short))' to calculate the size in bytes of such a struct containing an N-element array. */ #undef FLEXIBLE_ARRAY_MEMBER /* Define to 1 if nl_langinfo (YESEXPR) returns a non-empty string. */ #undef FUNC_NL_LANGINFO_YESEXPR_WORKS /* Define to a C preprocessor expression that evaluates to 1 or 0, depending whether the gnulib module fd-safer-flag shall be considered present. */ #undef GNULIB_FD_SAFER_FLAG /* Define to a C preprocessor expression that evaluates to 1 or 0, depending whether the gnulib module fscanf shall be considered present. */ #undef GNULIB_FSCANF /* Define to a C preprocessor expression that evaluates to 1 or 0, depending whether the gnulib module isblank shall be considered present. */ #undef GNULIB_ISBLANK /* Define to a C preprocessor expression that evaluates to 1 or 0, depending whether the gnulib module lock shall be considered present. */ #undef GNULIB_LOCK /* Define to a C preprocessor expression that evaluates to 1 or 0, depending whether the gnulib module msvc-nothrow shall be considered present. */ #undef GNULIB_MSVC_NOTHROW /* Define to a C preprocessor expression that evaluates to 1 or 0, depending whether the gnulib module openat shall be considered present. */ #undef GNULIB_OPENAT /* Define to 1 if printf and friends should be labeled with attribute "__gnu_printf__" instead of "__printf__" */ #undef GNULIB_PRINTF_ATTRIBUTE_FLAVOR_GNU /* Define to 1 to add extern declaration of program_invocation_name to argp.h */ #undef GNULIB_PROGRAM_INVOCATION_NAME /* Define to 1 to add extern declaration of program_invocation_short_name to argp.h */ #undef GNULIB_PROGRAM_INVOCATION_SHORT_NAME /* Define to a C preprocessor expression that evaluates to 1 or 0, depending whether the gnulib module reallocarray shall be considered present. */ #undef GNULIB_REALLOCARRAY /* Define to a C preprocessor expression that evaluates to 1 or 0, depending whether the gnulib module scanf shall be considered present. */ #undef GNULIB_SCANF /* Define to a C preprocessor expression that evaluates to 1 or 0, depending whether the gnulib module strerror shall be considered present. */ #undef GNULIB_STRERROR /* Define to 1 when the gnulib module btowc should be tested. */ #undef GNULIB_TEST_BTOWC /* Define to 1 when the gnulib module calloc-gnu should be tested. */ #undef GNULIB_TEST_CALLOC_GNU /* Define to 1 when the gnulib module calloc-posix should be tested. */ #undef GNULIB_TEST_CALLOC_POSIX /* Define to 1 when the gnulib module chdir should be tested. */ #undef GNULIB_TEST_CHDIR /* Define to 1 when the gnulib module cloexec should be tested. */ #undef GNULIB_TEST_CLOEXEC /* Define to 1 when the gnulib module close should be tested. */ #undef GNULIB_TEST_CLOSE /* Define to 1 when the gnulib module dirfd should be tested. */ #undef GNULIB_TEST_DIRFD /* Define to 1 when the gnulib module dup2 should be tested. */ #undef GNULIB_TEST_DUP2 /* Define to 1 when the gnulib module fchdir should be tested. */ #undef GNULIB_TEST_FCHDIR /* Define to 1 when the gnulib module fcntl should be tested. */ #undef GNULIB_TEST_FCNTL /* Define to 1 when the gnulib module fgetc should be tested. */ #undef GNULIB_TEST_FGETC /* Define to 1 when the gnulib module fgets should be tested. */ #undef GNULIB_TEST_FGETS /* Define to 1 when the gnulib module fnmatch should be tested. */ #undef GNULIB_TEST_FNMATCH /* Define to 1 when the gnulib module fprintf should be tested. */ #undef GNULIB_TEST_FPRINTF /* Define to 1 when the gnulib module fputc should be tested. */ #undef GNULIB_TEST_FPUTC /* Define to 1 when the gnulib module fputs should be tested. */ #undef GNULIB_TEST_FPUTS /* Define to 1 when the gnulib module fread should be tested. */ #undef GNULIB_TEST_FREAD /* Define to 1 when the gnulib module free-posix should be tested. */ #undef GNULIB_TEST_FREE_POSIX /* Define to 1 when the gnulib module fscanf should be tested. */ #undef GNULIB_TEST_FSCANF /* Define to 1 when the gnulib module fstat should be tested. */ #undef GNULIB_TEST_FSTAT /* Define to 1 when the gnulib module fwrite should be tested. */ #undef GNULIB_TEST_FWRITE /* Define to 1 when the gnulib module getc should be tested. */ #undef GNULIB_TEST_GETC /* Define to 1 when the gnulib module getchar should be tested. */ #undef GNULIB_TEST_GETCHAR /* Define to 1 when the gnulib module getcwd should be tested. */ #undef GNULIB_TEST_GETCWD /* Define to 1 when the gnulib module getdelim should be tested. */ #undef GNULIB_TEST_GETDELIM /* Define to 1 when the gnulib module getdtablesize should be tested. */ #undef GNULIB_TEST_GETDTABLESIZE /* Define to 1 when the gnulib module getline should be tested. */ #undef GNULIB_TEST_GETLINE /* Define to 1 when the gnulib module getopt-posix should be tested. */ #undef GNULIB_TEST_GETOPT_POSIX /* Define to 1 when the gnulib module localeconv should be tested. */ #undef GNULIB_TEST_LOCALECONV /* Define to 1 when the gnulib module malloc-gnu should be tested. */ #undef GNULIB_TEST_MALLOC_GNU /* Define to 1 when the gnulib module malloc-posix should be tested. */ #undef GNULIB_TEST_MALLOC_POSIX /* Define to 1 when the gnulib module mbrtowc should be tested. */ #undef GNULIB_TEST_MBRTOWC /* Define to 1 when the gnulib module mbsinit should be tested. */ #undef GNULIB_TEST_MBSINIT /* Define to 1 when the gnulib module mbsrtowcs should be tested. */ #undef GNULIB_TEST_MBSRTOWCS /* Define to 1 when the gnulib module mbtowc should be tested. */ #undef GNULIB_TEST_MBTOWC /* Define to 1 when the gnulib module memchr should be tested. */ #undef GNULIB_TEST_MEMCHR /* Define to 1 when the gnulib module mempcpy should be tested. */ #undef GNULIB_TEST_MEMPCPY /* Define to 1 when the gnulib module memrchr should be tested. */ #undef GNULIB_TEST_MEMRCHR /* Define to 1 when the gnulib module nl_langinfo should be tested. */ #undef GNULIB_TEST_NL_LANGINFO /* Define to 1 when the gnulib module open should be tested. */ #undef GNULIB_TEST_OPEN /* Define to 1 when the gnulib module openat should be tested. */ #undef GNULIB_TEST_OPENAT /* Define to 1 when the gnulib module pipe should be tested. */ #undef GNULIB_TEST_PIPE /* Define to 1 when the gnulib module printf should be tested. */ #undef GNULIB_TEST_PRINTF /* Define to 1 when the gnulib module putc should be tested. */ #undef GNULIB_TEST_PUTC /* Define to 1 when the gnulib module putchar should be tested. */ #undef GNULIB_TEST_PUTCHAR /* Define to 1 when the gnulib module puts should be tested. */ #undef GNULIB_TEST_PUTS /* Define to 1 when the gnulib module rawmemchr should be tested. */ #undef GNULIB_TEST_RAWMEMCHR /* Define to 1 when the gnulib module reallocarray should be tested. */ #undef GNULIB_TEST_REALLOCARRAY /* Define to 1 when the gnulib module realloc-gnu should be tested. */ #undef GNULIB_TEST_REALLOC_GNU /* Define to 1 when the gnulib module realloc-posix should be tested. */ #undef GNULIB_TEST_REALLOC_POSIX /* Define to 1 when the gnulib module scanf should be tested. */ #undef GNULIB_TEST_SCANF /* Define to 1 when the gnulib module setlocale_null should be tested. */ #undef GNULIB_TEST_SETLOCALE_NULL /* Define to 1 when the gnulib module sleep should be tested. */ #undef GNULIB_TEST_SLEEP /* Define to 1 when the gnulib module stat should be tested. */ #undef GNULIB_TEST_STAT /* Define to 1 when the gnulib module strchrnul should be tested. */ #undef GNULIB_TEST_STRCHRNUL /* Define to 1 when the gnulib module strdup should be tested. */ #undef GNULIB_TEST_STRDUP /* Define to 1 when the gnulib module strerror should be tested. */ #undef GNULIB_TEST_STRERROR /* Define to 1 when the gnulib module strndup should be tested. */ #undef GNULIB_TEST_STRNDUP /* Define to 1 when the gnulib module strnlen should be tested. */ #undef GNULIB_TEST_STRNLEN /* Define to 1 when the gnulib module vfprintf should be tested. */ #undef GNULIB_TEST_VFPRINTF /* Define to 1 when the gnulib module vprintf should be tested. */ #undef GNULIB_TEST_VPRINTF /* Define to 1 when the gnulib module vsnprintf should be tested. */ #undef GNULIB_TEST_VSNPRINTF /* Define to 1 when the gnulib module wcrtomb should be tested. */ #undef GNULIB_TEST_WCRTOMB /* Define to 1 when the gnulib module wcwidth should be tested. */ #undef GNULIB_TEST_WCWIDTH /* Define to 1 when the gnulib module wmemchr should be tested. */ #undef GNULIB_TEST_WMEMCHR /* Define to 1 when the gnulib module wmempcpy should be tested. */ #undef GNULIB_TEST_WMEMPCPY /* Default boot directory name */ #undef GRUB_BOOT_DIR_NAME /* Data dir */ #undef GRUB_DATADIR /* Default grub directory name */ #undef GRUB_DIR_NAME /* Library dir */ #undef GRUB_LIBDIR /* Configuration dir */ #undef GRUB_SYSCONFDIR /* Define to 1 if libnvpair symbols are prefixed with opensolaris_. */ #undef GRUB_UTIL_NVPAIR_IS_PREFIXED /* Define to 1 if you have 'alloca' after including , a header that may be supplied by this distribution. */ #undef HAVE_ALLOCA /* Define to 1 if works. */ #undef HAVE_ALLOCA_H /* Define to 1 if you have the `atexit' function. */ #undef HAVE_ATEXIT /* Define to 1 if you have the header file. */ #undef HAVE_BP_SYM_H /* Define to 1 if you have the `btowc' function. */ #undef HAVE_BTOWC /* Define to 1 if you have the Mac OS X function CFLocaleCopyCurrent in the CoreFoundation framework. */ #undef HAVE_CFLOCALECOPYCURRENT /* Define to 1 if you have the Mac OS X function CFPreferencesCopyAppValue in the CoreFoundation framework. */ #undef HAVE_CFPREFERENCESCOPYAPPVALUE /* Define to 1 if you have the header file. */ #undef HAVE_CRTDEFS_H /* Define to 1 if C supports variable-length arrays. */ #undef HAVE_C_VARARRAYS /* Define if the GNU dcgettext() function is already present or preinstalled. */ #undef HAVE_DCGETTEXT /* Define to 1 if you have the declaration of `alarm', and to 0 if you don't. */ #undef HAVE_DECL_ALARM /* Define to 1 if you have the declaration of `clearerr_unlocked', and to 0 if you don't. */ #undef HAVE_DECL_CLEARERR_UNLOCKED /* Define to 1 if you have the declaration of `dirfd', and to 0 if you don't. */ #undef HAVE_DECL_DIRFD /* Define to 1 if you have the declaration of `ecvt', and to 0 if you don't. */ #undef HAVE_DECL_ECVT /* Define to 1 if you have the declaration of `execvpe', and to 0 if you don't. */ #undef HAVE_DECL_EXECVPE /* Define to 1 if you have the declaration of `fchdir', and to 0 if you don't. */ #undef HAVE_DECL_FCHDIR /* Define to 1 if you have the declaration of `fcloseall', and to 0 if you don't. */ #undef HAVE_DECL_FCLOSEALL /* Define to 1 if you have the declaration of `fcvt', and to 0 if you don't. */ #undef HAVE_DECL_FCVT /* Define to 1 if you have the declaration of `feof_unlocked', and to 0 if you don't. */ #undef HAVE_DECL_FEOF_UNLOCKED /* Define to 1 if you have the declaration of `ferror_unlocked', and to 0 if you don't. */ #undef HAVE_DECL_FERROR_UNLOCKED /* Define to 1 if you have the declaration of `fflush_unlocked', and to 0 if you don't. */ #undef HAVE_DECL_FFLUSH_UNLOCKED /* Define to 1 if you have the declaration of `fgets_unlocked', and to 0 if you don't. */ #undef HAVE_DECL_FGETS_UNLOCKED /* Define to 1 if you have the declaration of `fputc_unlocked', and to 0 if you don't. */ #undef HAVE_DECL_FPUTC_UNLOCKED /* Define to 1 if you have the declaration of `fputs_unlocked', and to 0 if you don't. */ #undef HAVE_DECL_FPUTS_UNLOCKED /* Define to 1 if you have the declaration of `fread_unlocked', and to 0 if you don't. */ #undef HAVE_DECL_FREAD_UNLOCKED /* Define to 1 if you have the declaration of `fwrite_unlocked', and to 0 if you don't. */ #undef HAVE_DECL_FWRITE_UNLOCKED /* Define to 1 if you have the declaration of `gcvt', and to 0 if you don't. */ #undef HAVE_DECL_GCVT /* Define to 1 if you have the declaration of `getchar_unlocked', and to 0 if you don't. */ #undef HAVE_DECL_GETCHAR_UNLOCKED /* Define to 1 if you have the declaration of `getc_unlocked', and to 0 if you don't. */ #undef HAVE_DECL_GETC_UNLOCKED /* Define to 1 if you have the declaration of `getdelim', and to 0 if you don't. */ #undef HAVE_DECL_GETDELIM /* Define to 1 if you have the declaration of `getdtablesize', and to 0 if you don't. */ #undef HAVE_DECL_GETDTABLESIZE /* Define to 1 if you have the declaration of `getline', and to 0 if you don't. */ #undef HAVE_DECL_GETLINE /* Define to 1 if you have the declaration of `isblank', and to 0 if you don't. */ #undef HAVE_DECL_ISBLANK /* Define to 1 if you have the declaration of `mbrtowc', and to 0 if you don't. */ #undef HAVE_DECL_MBRTOWC /* Define to 1 if you have the declaration of `mbsinit', and to 0 if you don't. */ #undef HAVE_DECL_MBSINIT /* Define to 1 if you have the declaration of `mbsrtowcs', and to 0 if you don't. */ #undef HAVE_DECL_MBSRTOWCS /* Define to 1 if you have a declaration of mbswidth() in , and to 0 otherwise. */ #undef HAVE_DECL_MBSWIDTH_IN_WCHAR_H /* Define to 1 if you have the declaration of `memrchr', and to 0 if you don't. */ #undef HAVE_DECL_MEMRCHR /* Define to 1 if you have the declaration of `program_invocation_name', and to 0 if you don't. */ #undef HAVE_DECL_PROGRAM_INVOCATION_NAME /* Define to 1 if you have the declaration of `program_invocation_short_name', and to 0 if you don't. */ #undef HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME /* Define to 1 if you have the declaration of `putchar_unlocked', and to 0 if you don't. */ #undef HAVE_DECL_PUTCHAR_UNLOCKED /* Define to 1 if you have the declaration of `putc_unlocked', and to 0 if you don't. */ #undef HAVE_DECL_PUTC_UNLOCKED /* Define to 1 if you have the declaration of `sleep', and to 0 if you don't. */ #undef HAVE_DECL_SLEEP /* Define to 1 if you have the declaration of `strdup', and to 0 if you don't. */ #undef HAVE_DECL_STRDUP /* Define to 1 if you have the declaration of `strerror_r', and to 0 if you don't. */ #undef HAVE_DECL_STRERROR_R /* Define to 1 if you have the declaration of `strncasecmp', and to 0 if you don't. */ #undef HAVE_DECL_STRNCASECMP /* Define to 1 if you have the declaration of `strndup', and to 0 if you don't. */ #undef HAVE_DECL_STRNDUP /* Define to 1 if you have the declaration of `strnlen', and to 0 if you don't. */ #undef HAVE_DECL_STRNLEN /* Define to 1 if you have the declaration of `towlower', and to 0 if you don't. */ #undef HAVE_DECL_TOWLOWER /* Define to 1 if you have the declaration of `vsnprintf', and to 0 if you don't. */ #undef HAVE_DECL_VSNPRINTF /* Define to 1 if you have the declaration of `wcrtomb', and to 0 if you don't. */ #undef HAVE_DECL_WCRTOMB /* Define to 1 if you have the declaration of `wcsdup', and to 0 if you don't. */ #undef HAVE_DECL_WCSDUP /* Define to 1 if you have the declaration of `wcwidth', and to 0 if you don't. */ #undef HAVE_DECL_WCWIDTH /* Define to 1 if you have the declaration of `_snprintf', and to 0 if you don't. */ #undef HAVE_DECL__SNPRINTF /* Define to 1 if you have the declaration of `__argv', and to 0 if you don't. */ #undef HAVE_DECL___ARGV /* Define to 1 if you have the devmapper library. */ #undef HAVE_DEVICE_MAPPER /* Define to 1 if you have the header file. */ #undef HAVE_DIRENT_H /* Define to 1 if you have the `dirfd' function. */ #undef HAVE_DIRFD /* Define to 1 if you have the `fchdir' function. */ #undef HAVE_FCHDIR /* Define to 1 if you have the `fcntl' function. */ #undef HAVE_FCNTL /* Define to 1 if you have the header file. */ #undef HAVE_FEATURES_H /* Define to 1 if you have the `flockfile' function. */ #undef HAVE_FLOCKFILE /* Define to 1 if you have the `fnmatch' function. */ #undef HAVE_FNMATCH /* Define to 1 if you have the header file. */ #undef HAVE_FNMATCH_H /* Define if the 'free' function is guaranteed to preserve errno. */ #undef HAVE_FREE_POSIX /* Define to 1 if you have the header file. */ #undef HAVE_FT2BUILD_H /* Define to 1 if you have the `funlockfile' function. */ #undef HAVE_FUNLOCKFILE /* Define to 1 if you have the `getdelim' function. */ #undef HAVE_GETDELIM /* Define to 1 if you have the `getdtablesize' function. */ #undef HAVE_GETDTABLESIZE /* Define to 1 if you have the `getexecname' function. */ #undef HAVE_GETEXECNAME /* Define to 1 if you have the `getextmntent' function. */ #undef HAVE_GETEXTMNTENT /* Define to 1 if you have the header file. */ #undef HAVE_GETOPT_H /* Define to 1 if you have the `getopt_long_only' function. */ #undef HAVE_GETOPT_LONG_ONLY /* Define to 1 if you have the `getprogname' function. */ #undef HAVE_GETPROGNAME /* Define if getrawpartition() in -lutil can be used */ #undef HAVE_GETRAWPARTITION /* Define if the GNU gettext() function is already present or preinstalled. */ #undef HAVE_GETTEXT /* Define if you have the iconv() function and it works. */ #undef HAVE_ICONV /* Define if you have the 'intmax_t' type in or . */ #undef HAVE_INTMAX_T /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define if exists, doesn't clash with , and declares uintmax_t. */ #undef HAVE_INTTYPES_H_WITH_UINTMAX /* Define to 1 if you have the `isascii' function. */ #undef HAVE_ISASCII /* Define to 1 if you have the `isblank' function. */ #undef HAVE_ISBLANK /* Define to 1 if you have the `iswcntrl' function. */ #undef HAVE_ISWCNTRL /* Define to 1 if you have the `iswctype' function. */ #undef HAVE_ISWCTYPE /* Define if you have and nl_langinfo(CODESET). */ #undef HAVE_LANGINFO_CODESET /* Define to 1 if you have the header file. */ #undef HAVE_LANGINFO_H /* Define to 1 if you have the `devmapper' library (-ldevmapper). */ #undef HAVE_LIBDEVMAPPER /* Define to 1 if you have the `geom' library (-lgeom). */ #undef HAVE_LIBGEOM /* Define to 1 if you have the header file. */ #undef HAVE_LIBINTL_H /* Define to 1 if you have the `lzma' library (-llzma). */ #undef HAVE_LIBLZMA /* Define to 1 if you have the header file. */ #undef HAVE_LIBNVPAIR_H /* Define to 1 if you have the `zfs' library (-lzfs). */ #undef HAVE_LIBZFS /* Define to 1 if you have the header file. */ #undef HAVE_LIBZFS_H /* Define to 1 if you have the header file. */ #undef HAVE_LIMITS_H /* Define to 1 if you have the header file. */ #undef HAVE_LINEWRAP_H /* Define to 1 if the system has the type 'long long int'. */ #undef HAVE_LONG_LONG_INT /* Define to 1 if you have the `lstat' function. */ #undef HAVE_LSTAT /* Define to 1 if you have the header file. */ #undef HAVE_MALLOC_H /* Define if malloc, realloc, and calloc set errno on allocation failure. */ #undef HAVE_MALLOC_POSIX /* Define to 1 if mmap()'s MAP_ANONYMOUS flag is available after including config.h and . */ #undef HAVE_MAP_ANONYMOUS /* Define to 1 if you have the `mbrtowc' function. */ #undef HAVE_MBRTOWC /* Define to 1 if you have the `mbsinit' function. */ #undef HAVE_MBSINIT /* Define to 1 if you have the `mbsrtowcs' function. */ #undef HAVE_MBSRTOWCS /* Define to 1 if declares mbstate_t. */ #undef HAVE_MBSTATE_T /* Define to 1 if you have the `mbtowc' function. */ #undef HAVE_MBTOWC /* Define to 1 if you have the `memalign' function. */ #undef HAVE_MEMALIGN /* Define to 1 if you have the `mempcpy' function. */ #undef HAVE_MEMPCPY /* Define to 1 if you have the `memrchr' function. */ #undef HAVE_MEMRCHR /* Define to 1 if you have the header file. */ #undef HAVE_MINIX_CONFIG_H /* Define to 1 if you have the `mprotect' function. */ #undef HAVE_MPROTECT /* Define to 1 on MSVC platforms that have the "invalid parameter handler" concept. */ #undef HAVE_MSVC_INVALID_PARAMETER_HANDLER /* Define to 1 if you have the `nl_langinfo' function. */ #undef HAVE_NL_LANGINFO /* Define to 1 if you have the `openat' function. */ #undef HAVE_OPENAT /* Define if opendisk() in -lutil can be used */ #undef HAVE_OPENDISK /* Define to 1 if you have the header file. */ #undef HAVE_PCIACCESS_H /* Define to 1 if you have the `pipe' function. */ #undef HAVE_PIPE /* Define to 1 if you have the `posix_memalign' function. */ #undef HAVE_POSIX_MEMALIGN /* Define if program_invocation_name is defined */ #undef HAVE_PROGRAM_INVOCATION_NAME /* Define if program_invocation_short_name is defined */ #undef HAVE_PROGRAM_INVOCATION_SHORT_NAME /* Define if you have the header and the POSIX threads API. */ #undef HAVE_PTHREAD_API /* Define if the defines PTHREAD_MUTEX_RECURSIVE. */ #undef HAVE_PTHREAD_MUTEX_RECURSIVE /* Define if the POSIX multithreading library has read/write locks. */ #undef HAVE_PTHREAD_RWLOCK /* Define if the 'pthread_rwlock_rdlock' function prefers a writer to a reader. */ #undef HAVE_PTHREAD_RWLOCK_RDLOCK_PREFER_WRITER /* Define to 1 if you have the `rawmemchr' function. */ #undef HAVE_RAWMEMCHR /* Define to 1 if you have the `reallocarray' function. */ #undef HAVE_REALLOCARRAY /* Define to 1 if you have the header file. */ #undef HAVE_SDKDDKVER_H /* Define to 1 if you have SDL2 library. */ #undef HAVE_SDL2 /* Define to 1 if you have the header file. */ #undef HAVE_SDL_SDL_H /* Define to 1 if you have the `setdtablesize' function. */ #undef HAVE_SETDTABLESIZE /* Define to 1 if 'sig_atomic_t' is a signed integer type. */ #undef HAVE_SIGNED_SIG_ATOMIC_T /* Define to 1 if 'wchar_t' is a signed integer type. */ #undef HAVE_SIGNED_WCHAR_T /* Define to 1 if 'wint_t' is a signed integer type. */ #undef HAVE_SIGNED_WINT_T /* Define to 1 if you have the `sleep' function. */ #undef HAVE_SLEEP /* Define to 1 if you have the `snprintf' function. */ #undef HAVE_SNPRINTF /* Define if the return value of the snprintf function is the number of of bytes (excluding the terminating NUL) that would have been produced if the buffer had been large enough. */ #undef HAVE_SNPRINTF_RETVAL_C99 /* Define if the string produced by the snprintf function is always NUL terminated. */ #undef HAVE_SNPRINTF_TRUNCATION_C99 /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define if exists, doesn't clash with , and declares uintmax_t. */ #undef HAVE_STDINT_H_WITH_UINTMAX /* Define to 1 if you have the header file. */ #undef HAVE_STDIO_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the `strcasecmp' function. */ #undef HAVE_STRCASECMP /* Define to 1 if you have the `strchrnul' function. */ #undef HAVE_STRCHRNUL /* Define if you have `strerror_r'. */ #undef HAVE_STRERROR_R /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the `strncasecmp' function. */ #undef HAVE_STRNCASECMP /* Define to 1 if you have the `strndup' function. */ #undef HAVE_STRNDUP /* Define to 1 if you have the `strnlen' function. */ #undef HAVE_STRNLEN /* Define to 1 if `decimal_point' is a member of `struct lconv'. */ #undef HAVE_STRUCT_LCONV_DECIMAL_POINT /* Define to 1 if `f_fstypename' is a member of `struct statfs'. */ #undef HAVE_STRUCT_STATFS_F_FSTYPENAME /* Define to 1 if `f_mntfromname' is a member of `struct statfs'. */ #undef HAVE_STRUCT_STATFS_F_MNTFROMNAME /* Define to 1 if `st_atimensec' is a member of `struct stat'. */ #undef HAVE_STRUCT_STAT_ST_ATIMENSEC /* Define to 1 if `st_atimespec.tv_nsec' is a member of `struct stat'. */ #undef HAVE_STRUCT_STAT_ST_ATIMESPEC_TV_NSEC /* Define to 1 if `st_atim.st__tim.tv_nsec' is a member of `struct stat'. */ #undef HAVE_STRUCT_STAT_ST_ATIM_ST__TIM_TV_NSEC /* Define to 1 if `st_atim.tv_nsec' is a member of `struct stat'. */ #undef HAVE_STRUCT_STAT_ST_ATIM_TV_NSEC /* Define to 1 if `st_birthtimensec' is a member of `struct stat'. */ #undef HAVE_STRUCT_STAT_ST_BIRTHTIMENSEC /* Define to 1 if `st_birthtimespec.tv_nsec' is a member of `struct stat'. */ #undef HAVE_STRUCT_STAT_ST_BIRTHTIMESPEC_TV_NSEC /* Define to 1 if `st_birthtim.tv_nsec' is a member of `struct stat'. */ #undef HAVE_STRUCT_STAT_ST_BIRTHTIM_TV_NSEC /* Define to 1 if you have the `symlink' function. */ #undef HAVE_SYMLINK /* Define to 1 if you have the header file. */ #undef HAVE_SYSEXITS_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_BITYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_CDEFS_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_INTTYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_MMAN_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_MNTTAB_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_MOUNT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_PARAM_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SOCKET_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TIME_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the `thrd_create' function. */ #undef HAVE_THRD_CREATE /* Define to 1 if you have the header file. */ #undef HAVE_THREADS_H /* Define to 1 if you have the `towlower' function. */ #undef HAVE_TOWLOWER /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to 1 if the system has the type 'unsigned long long int'. */ #undef HAVE_UNSIGNED_LONG_LONG_INT /* Define if you have a global __progname variable */ #undef HAVE_VAR___PROGNAME /* Define to 1 if you have the `vasnprintf' function. */ #undef HAVE_VASNPRINTF /* Define to 1 or 0, depending whether the compiler supports simple visibility declarations. */ #undef HAVE_VISIBILITY /* Define to 1 if you have the `vsnprintf' function. */ #undef HAVE_VSNPRINTF /* Define to 1 if you have the header file. */ #undef HAVE_WCHAR_H /* Define if you have the 'wchar_t' type. */ #undef HAVE_WCHAR_T /* Define to 1 if you have the `wcrtomb' function. */ #undef HAVE_WCRTOMB /* Define to 1 if you have the `wcslen' function. */ #undef HAVE_WCSLEN /* Define to 1 if you have the `wcsnlen' function. */ #undef HAVE_WCSNLEN /* Define to 1 if you have the header file. */ #undef HAVE_WCTYPE_H /* Define to 1 if you have the `wcwidth' function. */ #undef HAVE_WCWIDTH /* Define to 1 if the compiler and linker support weak declarations of symbols. */ #undef HAVE_WEAK_SYMBOLS /* Define to 1 if you have the header file. */ #undef HAVE_WINSOCK2_H /* Define if you have the 'wint_t' type. */ #undef HAVE_WINT_T /* Define to 1 if you have the `wmempcpy' function. */ #undef HAVE_WMEMPCPY /* Define to 1 if O_NOATIME works. */ #undef HAVE_WORKING_O_NOATIME /* Define to 1 if O_NOFOLLOW works. */ #undef HAVE_WORKING_O_NOFOLLOW /* Define to 1 if you have the header file. */ #undef HAVE_XLOCALE_H /* Define to 1 if the system has the type `_Bool'. */ #undef HAVE__BOOL /* Define to 1 if you have the `_restgpr_14_x' function. */ #undef HAVE__RESTGPR_14_X /* Define to 1 if you have the `_set_invalid_parameter_handler' function. */ #undef HAVE__SET_INVALID_PARAMETER_HANDLER /* Define to 1 if you have the `__aeabi_idiv' function. */ #undef HAVE___AEABI_IDIV /* Define to 1 if you have the `__aeabi_idivmod' function. */ #undef HAVE___AEABI_IDIVMOD /* Define to 1 if you have the `__aeabi_lasr' function. */ #undef HAVE___AEABI_LASR /* Define to 1 if you have the `__aeabi_llsl' function. */ #undef HAVE___AEABI_LLSL /* Define to 1 if you have the `__aeabi_llsr' function. */ #undef HAVE___AEABI_LLSR /* Define to 1 if you have the `__aeabi_lmul' function. */ #undef HAVE___AEABI_LMUL /* Define to 1 if you have the `__aeabi_memclr' function. */ #undef HAVE___AEABI_MEMCLR /* Define to 1 if you have the `__aeabi_memclr4' function. */ #undef HAVE___AEABI_MEMCLR4 /* Define to 1 if you have the `__aeabi_memclr8' function. */ #undef HAVE___AEABI_MEMCLR8 /* Define to 1 if you have the `__aeabi_memcpy' function. */ #undef HAVE___AEABI_MEMCPY /* Define to 1 if you have the `__aeabi_memcpy4' function. */ #undef HAVE___AEABI_MEMCPY4 /* Define to 1 if you have the `__aeabi_memcpy8' function. */ #undef HAVE___AEABI_MEMCPY8 /* Define to 1 if you have the `__aeabi_memset' function. */ #undef HAVE___AEABI_MEMSET /* Define to 1 if you have the `__aeabi_uidiv' function. */ #undef HAVE___AEABI_UIDIV /* Define to 1 if you have the `__aeabi_uidivmod' function. */ #undef HAVE___AEABI_UIDIVMOD /* Define to 1 if you have the `__aeabi_ulcmp' function. */ #undef HAVE___AEABI_ULCMP /* Define to 1 if you have the `__ashldi3' function. */ #undef HAVE___ASHLDI3 /* Define to 1 if you have the `__ashrdi3' function. */ #undef HAVE___ASHRDI3 /* Define to 1 if you have the `__bswapdi2' function. */ #undef HAVE___BSWAPDI2 /* Define to 1 if you have the `__bswapsi2' function. */ #undef HAVE___BSWAPSI2 /* Define to 1 if the compiler supports __builtin_expect, and to 2 if does. */ #undef HAVE___BUILTIN_EXPECT #ifndef HAVE___BUILTIN_EXPECT # define __builtin_expect(e, c) (e) #elif HAVE___BUILTIN_EXPECT == 2 # include #endif /* Define to 1 if you have the `__bzero' function. */ #undef HAVE___BZERO /* Define to 1 if you have the `__chkstk_ms' function. */ #undef HAVE___CHKSTK_MS /* Define to 1 if you have the `__clzdi2' function. */ #undef HAVE___CLZDI2 /* Define to 1 if you have the `__ctzdi2' function. */ #undef HAVE___CTZDI2 /* Define to 1 if you have the `__ctzsi2' function. */ #undef HAVE___CTZSI2 /* Define to 1 if you have the `__deregister_frame_info' function. */ #undef HAVE___DEREGISTER_FRAME_INFO /* Define to 1 if you have the `__divdi3' function. */ #undef HAVE___DIVDI3 /* Define to 1 if you have the `__divsi3' function. */ #undef HAVE___DIVSI3 /* Define to 1 if ctype.h defines __header_inline. */ #undef HAVE___HEADER_INLINE /* Please see the Gnulib manual for how to use these macros. Suppress extern inline with HP-UX cc, as it appears to be broken; see . Suppress extern inline with Sun C in standards-conformance mode, as it mishandles inline functions that call each other. E.g., for 'inline void f (void) { } inline void g (void) { f (); }', c99 incorrectly complains 'reference to static identifier "f" in extern inline function'. This bug was observed with Oracle Developer Studio 12.6 (Sun C 5.15 SunOS_sparc 2017/05/30). Suppress extern inline (with or without __attribute__ ((__gnu_inline__))) on configurations that mistakenly use 'static inline' to implement functions or macros in standard C headers like . For example, if isdigit is mistakenly implemented via a static inline function, a program containing an extern inline function that calls isdigit may not work since the C standard prohibits extern inline functions from calling static functions (ISO C 99 section 6.7.4.(3). This bug is known to occur on: OS X 10.8 and earlier; see: https://lists.gnu.org/r/bug-gnulib/2012-12/msg00023.html DragonFly; see http://muscles.dragonflybsd.org/bulk/clang-master-potential/20141111_102002/logs/ah-tty-0.3.12.log FreeBSD; see: https://lists.gnu.org/r/bug-gnulib/2014-07/msg00104.html OS X 10.9 has a macro __header_inline indicating the bug is fixed for C and for clang but remains for g++; see . Assume DragonFly and FreeBSD will be similar. GCC 4.3 and above with -std=c99 or -std=gnu99 implements ISO C99 inline semantics, unless -fgnu89-inline is used. It defines a macro __GNUC_STDC_INLINE__ to indicate this situation or a macro __GNUC_GNU_INLINE__ to indicate the opposite situation. GCC 4.2 with -std=c99 or -std=gnu99 implements the GNU C inline semantics but warns, unless -fgnu89-inline is used: warning: C99 inline functions are not supported; using GNU89 warning: to disable this warning use -fgnu89-inline or the gnu_inline function attribute It defines a macro __GNUC_GNU_INLINE__ to indicate this situation. */ #if (((defined __APPLE__ && defined __MACH__) \ || defined __DragonFly__ || defined __FreeBSD__) \ && (defined HAVE___HEADER_INLINE \ ? (defined __cplusplus && defined __GNUC_STDC_INLINE__ \ && ! defined __clang__) \ : ((! defined _DONT_USE_CTYPE_INLINE_ \ && (defined __GNUC__ || defined __cplusplus)) \ || (defined _FORTIFY_SOURCE && 0 < _FORTIFY_SOURCE \ && defined __GNUC__ && ! defined __cplusplus)))) # define _GL_EXTERN_INLINE_STDHEADER_BUG #endif #if ((__GNUC__ \ ? defined __GNUC_STDC_INLINE__ && __GNUC_STDC_INLINE__ \ : (199901L <= __STDC_VERSION__ \ && !defined __HP_cc \ && !defined __PGI \ && !(defined __SUNPRO_C && __STDC__))) \ && !defined _GL_EXTERN_INLINE_STDHEADER_BUG) # define _GL_INLINE inline # define _GL_EXTERN_INLINE extern inline # define _GL_EXTERN_INLINE_IN_USE #elif (2 < __GNUC__ + (7 <= __GNUC_MINOR__) && !defined __STRICT_ANSI__ \ && !defined _GL_EXTERN_INLINE_STDHEADER_BUG) # if defined __GNUC_GNU_INLINE__ && __GNUC_GNU_INLINE__ /* __gnu_inline__ suppresses a GCC 4.2 diagnostic. */ # define _GL_INLINE extern inline __attribute__ ((__gnu_inline__)) # else # define _GL_INLINE extern inline # endif # define _GL_EXTERN_INLINE extern # define _GL_EXTERN_INLINE_IN_USE #else # define _GL_INLINE _GL_UNUSED static # define _GL_EXTERN_INLINE _GL_UNUSED static #endif /* In GCC 4.6 (inclusive) to 5.1 (exclusive), suppress bogus "no previous prototype for 'FOO'" and "no previous declaration for 'FOO'" diagnostics, when FOO is an inline function in the header; see and . */ #if __GNUC__ == 4 && 6 <= __GNUC_MINOR__ # if defined __GNUC_STDC_INLINE__ && __GNUC_STDC_INLINE__ # define _GL_INLINE_HEADER_CONST_PRAGMA # else # define _GL_INLINE_HEADER_CONST_PRAGMA \ _Pragma ("GCC diagnostic ignored \"-Wsuggest-attribute=const\"") # endif # define _GL_INLINE_HEADER_BEGIN \ _Pragma ("GCC diagnostic push") \ _Pragma ("GCC diagnostic ignored \"-Wmissing-prototypes\"") \ _Pragma ("GCC diagnostic ignored \"-Wmissing-declarations\"") \ _GL_INLINE_HEADER_CONST_PRAGMA # define _GL_INLINE_HEADER_END \ _Pragma ("GCC diagnostic pop") #else # define _GL_INLINE_HEADER_BEGIN # define _GL_INLINE_HEADER_END #endif /* Define to 1 if the compiler supports the keyword '__inline'. */ #undef HAVE___INLINE /* Define to 1 if you have the `__lshrdi3' function. */ #undef HAVE___LSHRDI3 /* Define to 1 if you have the `__moddi3' function. */ #undef HAVE___MODDI3 /* Define to 1 if you have the `__modsi3' function. */ #undef HAVE___MODSI3 /* Define to 1 if you have the `__muldi3' function. */ #undef HAVE___MULDI3 /* Define to 1 if you have the `__register_frame_info' function. */ #undef HAVE___REGISTER_FRAME_INFO /* Define to 1 if you have the `__ucmpdi2' function. */ #undef HAVE___UCMPDI2 /* Define to 1 if you have the `__udivdi3' function. */ #undef HAVE___UDIVDI3 /* Define to 1 if you have the `__udivsi3' function. */ #undef HAVE___UDIVSI3 /* Define to 1 if you have the `__umoddi3' function. */ #undef HAVE___UMODDI3 /* Define to 1 if you have the `__umodsi3' function. */ #undef HAVE___UMODSI3 /* Define to 1 if you have the `___chkstk_ms' function. */ #undef HAVE____CHKSTK_MS /* Locale dir */ #undef LOCALEDIR /* Define to 1 if 'lstat' dereferences a symlink specified with a trailing slash. */ #undef LSTAT_FOLLOWS_SLASHED_SYMLINK /* Define to 1 if `major', `minor', and `makedev' are declared in . */ #undef MAJOR_IN_MKDEV /* Define to 1 if `major', `minor', and `makedev' are declared in . */ #undef MAJOR_IN_SYSMACROS /* If malloc(0) is != NULL, define this to 1. Otherwise define this to 0. */ #undef MALLOC_0_IS_NONNULL /* Define to a substitute value for mmap()'s MAP_ANONYMOUS flag. */ #undef MAP_ANONYMOUS /* Define if the mbrtowc function does not return (size_t) -2 for empty input. */ #undef MBRTOWC_EMPTY_INPUT_BUG /* Define if the mbrtowc function may signal encoding errors in the C locale. */ #undef MBRTOWC_IN_C_LOCALE_MAYBE_EILSEQ /* Define if the mbrtowc function has the NULL pwc argument bug. */ #undef MBRTOWC_NULL_ARG1_BUG /* Define if the mbrtowc function has the NULL string argument bug. */ #undef MBRTOWC_NULL_ARG2_BUG /* Define if the mbrtowc function does not return 0 for a NUL character. */ #undef MBRTOWC_NUL_RETVAL_BUG /* Define if the mbrtowc function returns a wrong return value. */ #undef MBRTOWC_RETVAL_BUG /* Define if the mbrtowc function stores a wide character when reporting incomplete input. */ #undef MBRTOWC_STORES_INCOMPLETE_BUG /* Use GNU style printf and scanf. */ #ifndef __USE_MINGW_ANSI_STDIO # undef __USE_MINGW_ANSI_STDIO #endif /* Define to 1 if nl_langinfo is multithread-safe. */ #undef NL_LANGINFO_MTSAFE /* Define to 1 if open() fails to recognize a trailing slash. */ #undef OPEN_TRAILING_SLASH_BUG /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Define to the type that is the result of default argument promotions of type mode_t. */ #undef PROMOTED_MODE_T /* Define if the pthread_in_use() detection is hard. */ #undef PTHREAD_IN_USE_DETECTION_HARD /* Define to l, ll, u, ul, ull, etc., as suitable for constants of type 'ptrdiff_t'. */ #undef PTRDIFF_T_SUFFIX /* Define to 1 if gnulib's dirfd() replacement is used. */ #undef REPLACE_DIRFD /* Define to 1 if gnulib's fchdir() replacement is used. */ #undef REPLACE_FCHDIR /* Define to 1 if stat needs help when passed a file name with a trailing slash */ #undef REPLACE_FUNC_STAT_FILE /* Define if nl_langinfo exists but is overridden by gnulib. */ #undef REPLACE_NL_LANGINFO /* Define to 1 if open() should work around the inability to open a directory. */ #undef REPLACE_OPEN_DIRECTORY /* Define to 1 if strerror(0) does not return a message implying success. */ #undef REPLACE_STRERROR_0 /* Define if vasnprintf exists but is overridden by gnulib. */ #undef REPLACE_VASNPRINTF /* Define to 1 if setlocale (LC_ALL, NULL) is multithread-safe. */ #undef SETLOCALE_NULL_ALL_MTSAFE /* Define to 1 if setlocale (category, NULL) is multithread-safe. */ #undef SETLOCALE_NULL_ONE_MTSAFE /* Define to l, ll, u, ul, ull, etc., as suitable for constants of type 'sig_atomic_t'. */ #undef SIG_ATOMIC_T_SUFFIX /* The size of `long', as computed by sizeof. */ #undef SIZEOF_LONG /* The size of `off64_t', as computed by sizeof. */ #undef SIZEOF_OFF64_T /* The size of `off_t', as computed by sizeof. */ #undef SIZEOF_OFF_T /* The size of `TCHAR', as computed by sizeof. */ #undef SIZEOF_TCHAR /* The size of `void *', as computed by sizeof. */ #undef SIZEOF_VOID_P /* Define as the maximum value of type 'size_t', if the system doesn't define it. */ #ifndef SIZE_MAX # undef SIZE_MAX #endif /* Define to l, ll, u, ul, ull, etc., as suitable for constants of type 'size_t'. */ #undef SIZE_T_SUFFIX /* If using the C implementation of alloca, define if you know the direction of stack growth for your system; otherwise it will be automatically deduced at runtime. STACK_DIRECTION > 0 => grows toward higher addresses STACK_DIRECTION < 0 => grows toward lower addresses STACK_DIRECTION = 0 => direction of growth unknown */ #undef STACK_DIRECTION /* Define to 1 if the `S_IS*' macros in do not work properly. */ #undef STAT_MACROS_BROKEN /* Define to 1 if all of the C90 standard headers exist (not just the ones required in a freestanding environment). This macro is provided for backward compatibility; new code need not use it. */ #undef STDC_HEADERS /* Define to 1 if strerror_r returns char *. */ #undef STRERROR_R_CHAR_P /* Define to 1 if the type of the st_atim member of a struct stat is struct timespec. */ #undef TYPEOF_STRUCT_STAT_ST_ATIM_IS_STRUCT_TIMESPEC /* Define if the combination of the ISO C and POSIX multithreading APIs can be used. */ #undef USE_ISOC_AND_POSIX_THREADS /* Define if the ISO C multithreading library can be used. */ #undef USE_ISOC_THREADS /* Define to 1 if you have the LZMA library. */ #undef USE_LIBLZMA /* Define to 1 if ZFS library should be used. */ #undef USE_LIBZFS /* Define if the POSIX multithreading library can be used. */ #undef USE_POSIX_THREADS /* Define if references to the POSIX multithreading library are satisfied by libc. */ #undef USE_POSIX_THREADS_FROM_LIBC /* Define if references to the POSIX multithreading library should be made weak. */ #undef USE_POSIX_THREADS_WEAK /* Enable extensions on AIX 3, Interix. */ #ifndef _ALL_SOURCE # undef _ALL_SOURCE #endif /* Enable general extensions on macOS. */ #ifndef _DARWIN_C_SOURCE # undef _DARWIN_C_SOURCE #endif /* Enable general extensions on Solaris. */ #ifndef __EXTENSIONS__ # undef __EXTENSIONS__ #endif /* Enable GNU extensions on systems that have them. */ #ifndef _GNU_SOURCE # undef _GNU_SOURCE #endif /* Enable X/Open compliant socket functions that do not require linking with -lxnet on HP-UX 11.11. */ #ifndef _HPUX_ALT_XOPEN_SOCKET_API # undef _HPUX_ALT_XOPEN_SOCKET_API #endif /* Identify the host operating system as Minix. This macro does not affect the system headers' behavior. A future release of Autoconf may stop defining this macro. */ #ifndef _MINIX # undef _MINIX #endif /* Enable general extensions on NetBSD. Enable NetBSD compatibility extensions on Minix. */ #ifndef _NETBSD_SOURCE # undef _NETBSD_SOURCE #endif /* Enable OpenBSD compatibility extensions on NetBSD. Oddly enough, this does nothing on OpenBSD. */ #ifndef _OPENBSD_SOURCE # undef _OPENBSD_SOURCE #endif /* Define to 1 if needed for POSIX-compatible behavior. */ #ifndef _POSIX_SOURCE # undef _POSIX_SOURCE #endif /* Define to 2 if needed for POSIX-compatible behavior. */ #ifndef _POSIX_1_SOURCE # undef _POSIX_1_SOURCE #endif /* Enable POSIX-compatible threading on Solaris. */ #ifndef _POSIX_PTHREAD_SEMANTICS # undef _POSIX_PTHREAD_SEMANTICS #endif /* Enable extensions specified by ISO/IEC TS 18661-5:2014. */ #ifndef __STDC_WANT_IEC_60559_ATTRIBS_EXT__ # undef __STDC_WANT_IEC_60559_ATTRIBS_EXT__ #endif /* Enable extensions specified by ISO/IEC TS 18661-1:2014. */ #ifndef __STDC_WANT_IEC_60559_BFP_EXT__ # undef __STDC_WANT_IEC_60559_BFP_EXT__ #endif /* Enable extensions specified by ISO/IEC TS 18661-2:2015. */ #ifndef __STDC_WANT_IEC_60559_DFP_EXT__ # undef __STDC_WANT_IEC_60559_DFP_EXT__ #endif /* Enable extensions specified by ISO/IEC TS 18661-4:2015. */ #ifndef __STDC_WANT_IEC_60559_FUNCS_EXT__ # undef __STDC_WANT_IEC_60559_FUNCS_EXT__ #endif /* Enable extensions specified by ISO/IEC TS 18661-3:2015. */ #ifndef __STDC_WANT_IEC_60559_TYPES_EXT__ # undef __STDC_WANT_IEC_60559_TYPES_EXT__ #endif /* Enable extensions specified by ISO/IEC TR 24731-2:2010. */ #ifndef __STDC_WANT_LIB_EXT2__ # undef __STDC_WANT_LIB_EXT2__ #endif /* Enable extensions specified by ISO/IEC 24747:2009. */ #ifndef __STDC_WANT_MATH_SPEC_FUNCS__ # undef __STDC_WANT_MATH_SPEC_FUNCS__ #endif /* Enable extensions on HP NonStop. */ #ifndef _TANDEM_SOURCE # undef _TANDEM_SOURCE #endif /* Enable X/Open extensions. Define to 500 only if necessary to make mbstate_t available. */ #ifndef _XOPEN_SOURCE # undef _XOPEN_SOURCE #endif /* Define if the native Windows multithreading API can be used. */ #undef USE_WINDOWS_THREADS /* Version number of package */ #undef VERSION /* Define to l, ll, u, ul, ull, etc., as suitable for constants of type 'wchar_t'. */ #undef WCHAR_T_SUFFIX /* Define if the wcrtomb function does not work in the C locale. */ #undef WCRTOMB_C_LOCALE_BUG /* Define if the wcrtomb function has an incorrect return value. */ #undef WCRTOMB_RETVAL_BUG /* Define to l, ll, u, ul, ull, etc., as suitable for constants of type 'wint_t'. */ #undef WINT_T_SUFFIX /* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most significant byte first (like Motorola and SPARC, unlike Intel). */ #if defined AC_APPLE_UNIVERSAL_BUILD # if defined __BIG_ENDIAN__ # define WORDS_BIGENDIAN 1 # endif #else # ifndef WORDS_BIGENDIAN # undef WORDS_BIGENDIAN # endif #endif /* Define to 1 if `lex' declares `yytext' as a `char *' by default, not a `char[]'. */ #undef YYTEXT_POINTER /* Number of bits in a file offset, on hosts where this is settable. */ #undef _FILE_OFFSET_BITS /* True if the compiler says it groks GNU C version MAJOR.MINOR. */ #if defined __GNUC__ && defined __GNUC_MINOR__ # define _GL_GNUC_PREREQ(major, minor) \ ((major) < __GNUC__ + ((minor) <= __GNUC_MINOR__)) #else # define _GL_GNUC_PREREQ(major, minor) 0 #endif /* Define to enable the declarations of ISO C 11 types and functions. */ #undef _ISOC11_SOURCE /* Define for large files, on AIX-style hosts. */ #undef _LARGE_FILES /* Define to 1 on Solaris. */ #undef _LCONV_C99 /* The _Noreturn keyword of C11. */ #ifndef _Noreturn # if (defined __cplusplus \ && ((201103 <= __cplusplus && !(__GNUC__ == 4 && __GNUC_MINOR__ == 7)) \ || (defined _MSC_VER && 1900 <= _MSC_VER)) \ && 0) /* [[noreturn]] is not practically usable, because with it the syntax extern _Noreturn void func (...); would not be valid; such a declaration would only be valid with 'extern' and '_Noreturn' swapped, or without the 'extern' keyword. However, some AIX system header files and several gnulib header files use precisely this syntax with 'extern'. */ # define _Noreturn [[noreturn]] # elif ((!defined __cplusplus || defined __clang__) \ && (201112 <= (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0) \ || (!defined __STRICT_ANSI__ \ && (_GL_GNUC_PREREQ (4, 7) \ || (defined __apple_build_version__ \ ? 6000000 <= __apple_build_version__ \ : 3 < __clang_major__ + (5 <= __clang_minor__)))))) /* _Noreturn works as-is. */ # elif _GL_GNUC_PREREQ (2, 8) || defined __clang__ || 0x5110 <= __SUNPRO_C # define _Noreturn __attribute__ ((__noreturn__)) # elif 1200 <= (defined _MSC_VER ? _MSC_VER : 0) # define _Noreturn __declspec (noreturn) # else # define _Noreturn # endif #endif /* Define if you want to include , so that it consistently overrides 's RE_DUP_MAX. */ #undef _REGEX_INCLUDE_LIMITS_H /* Define if you want regoff_t to be at least as wide POSIX requires. */ #undef _REGEX_LARGE_OFFSETS /* Number of bits in a timestamp, on hosts where this is settable. */ #undef _TIME_BITS /* For standard stat data types on VMS. */ #undef _USE_STD_STAT /* Define to rpl_ if the getopt replacement functions and variables should be used. */ #undef __GETOPT_PREFIX /* For 64-bit time_t on 32-bit mingw. */ #undef __MINGW_USE_VC2005_COMPAT /* Define to 1 if the system predates C++11. */ #undef __STDC_CONSTANT_MACROS /* Define to 1 if the system predates C++11. */ #undef __STDC_LIMIT_MACROS /* Define to 1 if C does not support variable-length arrays, and if the compiler does not already define this. */ #undef __STDC_NO_VLA__ /* The _GL_ASYNC_SAFE marker should be attached to functions that are signal handlers (for signals other than SIGABRT, SIGPIPE) or can be invoked from such signal handlers. Such functions have some restrictions: * All functions that it calls should be marked _GL_ASYNC_SAFE as well, or should be listed as async-signal-safe in POSIX section 2.4.3. Note that malloc(), sprintf(), and fwrite(), in particular, are NOT async-signal-safe. * All memory locations (variables and struct fields) that these functions access must be marked 'volatile'. This holds for both read and write accesses. Otherwise the compiler might optimize away stores to and reads from such locations that occur in the program, depending on its data flow analysis. For example, when the program contains a loop that is intended to inspect a variable set from within a signal handler while (!signal_occurred) ; the compiler is allowed to transform this into an endless loop if the variable 'signal_occurred' is not declared 'volatile'. Additionally, recall that: * A signal handler should not modify errno (except if it is a handler for a fatal signal and ends by raising the same signal again, thus provoking the termination of the process). If it invokes a function that may clobber errno, it needs to save and restore the value of errno. */ #define _GL_ASYNC_SAFE /* Attributes. */ #if (defined __has_attribute \ && (!defined __clang_minor__ \ || 3 < __clang_major__ + (5 <= __clang_minor__))) # define _GL_HAS_ATTRIBUTE(attr) __has_attribute (__##attr##__) #else # define _GL_HAS_ATTRIBUTE(attr) _GL_ATTR_##attr # define _GL_ATTR_alloc_size _GL_GNUC_PREREQ (4, 3) # define _GL_ATTR_always_inline _GL_GNUC_PREREQ (3, 2) # define _GL_ATTR_artificial _GL_GNUC_PREREQ (4, 3) # define _GL_ATTR_cold _GL_GNUC_PREREQ (4, 3) # define _GL_ATTR_const _GL_GNUC_PREREQ (2, 95) # define _GL_ATTR_deprecated _GL_GNUC_PREREQ (3, 1) # define _GL_ATTR_diagnose_if 0 # define _GL_ATTR_error _GL_GNUC_PREREQ (4, 3) # define _GL_ATTR_externally_visible _GL_GNUC_PREREQ (4, 1) # define _GL_ATTR_fallthrough _GL_GNUC_PREREQ (7, 0) # define _GL_ATTR_format _GL_GNUC_PREREQ (2, 7) # define _GL_ATTR_leaf _GL_GNUC_PREREQ (4, 6) # define _GL_ATTR_malloc _GL_GNUC_PREREQ (3, 0) # ifdef _ICC # define _GL_ATTR_may_alias 0 # else # define _GL_ATTR_may_alias _GL_GNUC_PREREQ (3, 3) # endif # define _GL_ATTR_noinline _GL_GNUC_PREREQ (3, 1) # define _GL_ATTR_nonnull _GL_GNUC_PREREQ (3, 3) # define _GL_ATTR_nonstring _GL_GNUC_PREREQ (8, 0) # define _GL_ATTR_nothrow _GL_GNUC_PREREQ (3, 3) # define _GL_ATTR_packed _GL_GNUC_PREREQ (2, 7) # define _GL_ATTR_pure _GL_GNUC_PREREQ (2, 96) # define _GL_ATTR_returns_nonnull _GL_GNUC_PREREQ (4, 9) # define _GL_ATTR_sentinel _GL_GNUC_PREREQ (4, 0) # define _GL_ATTR_unused _GL_GNUC_PREREQ (2, 7) # define _GL_ATTR_warn_unused_result _GL_GNUC_PREREQ (3, 4) #endif #ifdef __has_c_attribute # define _GL_HAS_C_ATTRIBUTE(attr) __has_c_attribute (__##attr##__) #else # define _GL_HAS_C_ATTRIBUTE(attr) 0 #endif /* _GL_ATTRIBUTE_ALLOC_SIZE ((N)) declares that the Nth argument of the function is the size of the returned memory block. _GL_ATTRIBUTE_ALLOC_SIZE ((M, N)) declares that the Mth argument multiplied by the Nth argument of the function is the size of the returned memory block. */ /* Applies to: function, pointer to function, function types. */ #if _GL_HAS_ATTRIBUTE (alloc_size) # define _GL_ATTRIBUTE_ALLOC_SIZE(args) __attribute__ ((__alloc_size__ args)) #else # define _GL_ATTRIBUTE_ALLOC_SIZE(args) #endif /* _GL_ATTRIBUTE_ALWAYS_INLINE tells that the compiler should always inline the function and report an error if it cannot do so. */ /* Applies to: function. */ #if _GL_HAS_ATTRIBUTE (always_inline) # define _GL_ATTRIBUTE_ALWAYS_INLINE __attribute__ ((__always_inline__)) #else # define _GL_ATTRIBUTE_ALWAYS_INLINE #endif /* _GL_ATTRIBUTE_ARTIFICIAL declares that the function is not important to show in stack traces when debugging. The compiler should omit the function from stack traces. */ /* Applies to: function. */ #if _GL_HAS_ATTRIBUTE (artificial) # define _GL_ATTRIBUTE_ARTIFICIAL __attribute__ ((__artificial__)) #else # define _GL_ATTRIBUTE_ARTIFICIAL #endif /* _GL_ATTRIBUTE_COLD declares that the function is rarely executed. */ /* Applies to: functions. */ /* Avoid __attribute__ ((cold)) on MinGW; see thread starting at . Also, Oracle Studio 12.6 requires 'cold' not '__cold__'. */ #if _GL_HAS_ATTRIBUTE (cold) && !defined __MINGW32__ # ifndef __SUNPRO_C # define _GL_ATTRIBUTE_COLD __attribute__ ((__cold__)) # else # define _GL_ATTRIBUTE_COLD __attribute__ ((cold)) # endif #else # define _GL_ATTRIBUTE_COLD #endif /* _GL_ATTRIBUTE_CONST declares that it is OK for a compiler to omit duplicate calls to the function with the same arguments. This attribute is safe for a function that neither depends on nor affects observable state, and always returns exactly once - e.g., does not loop forever, and does not call longjmp. (This attribute is stricter than _GL_ATTRIBUTE_PURE.) */ /* Applies to: functions. */ #if _GL_HAS_ATTRIBUTE (const) # define _GL_ATTRIBUTE_CONST __attribute__ ((__const__)) #else # define _GL_ATTRIBUTE_CONST #endif /* _GL_ATTRIBUTE_DEALLOC (F, I) declares that the function returns pointers that can be freed by passing them as the Ith argument to the function F. _GL_ATTRIBUTE_DEALLOC_FREE declares that the function returns pointers that can be freed via 'free'; it can be used only after declaring 'free'. */ /* Applies to: functions. Cannot be used on inline functions. */ #if _GL_GNUC_PREREQ (11, 0) # define _GL_ATTRIBUTE_DEALLOC(f, i) __attribute__ ((__malloc__ (f, i))) #else # define _GL_ATTRIBUTE_DEALLOC(f, i) #endif /* If gnulib's or has already defined this macro, continue to use this earlier definition, since may not have been included yet. */ #ifndef _GL_ATTRIBUTE_DEALLOC_FREE # define _GL_ATTRIBUTE_DEALLOC_FREE _GL_ATTRIBUTE_DEALLOC (free, 1) #endif /* _GL_ATTRIBUTE_DEPRECATED: Declares that an entity is deprecated. The compiler may warn if the entity is used. */ /* Applies to: - function, variable, - struct, union, struct/union member, - enumeration, enumeration item, - typedef, in C++ also: namespace, class, template specialization. */ #if _GL_HAS_C_ATTRIBUTE (deprecated) # define _GL_ATTRIBUTE_DEPRECATED [[__deprecated__]] #elif _GL_HAS_ATTRIBUTE (deprecated) # define _GL_ATTRIBUTE_DEPRECATED __attribute__ ((__deprecated__)) #else # define _GL_ATTRIBUTE_DEPRECATED #endif /* _GL_ATTRIBUTE_ERROR(msg) requests an error if a function is called and the function call is not optimized away. _GL_ATTRIBUTE_WARNING(msg) requests a warning if a function is called and the function call is not optimized away. */ /* Applies to: functions. */ #if _GL_HAS_ATTRIBUTE (error) # define _GL_ATTRIBUTE_ERROR(msg) __attribute__ ((__error__ (msg))) # define _GL_ATTRIBUTE_WARNING(msg) __attribute__ ((__warning__ (msg))) #elif _GL_HAS_ATTRIBUTE (diagnose_if) # define _GL_ATTRIBUTE_ERROR(msg) __attribute__ ((__diagnose_if__ (1, msg, "error"))) # define _GL_ATTRIBUTE_WARNING(msg) __attribute__ ((__diagnose_if__ (1, msg, "warning"))) #else # define _GL_ATTRIBUTE_ERROR(msg) # define _GL_ATTRIBUTE_WARNING(msg) #endif /* _GL_ATTRIBUTE_EXTERNALLY_VISIBLE declares that the entity should remain visible to debuggers etc., even with '-fwhole-program'. */ /* Applies to: functions, variables. */ #if _GL_HAS_ATTRIBUTE (externally_visible) # define _GL_ATTRIBUTE_EXTERNALLY_VISIBLE __attribute__ ((externally_visible)) #else # define _GL_ATTRIBUTE_EXTERNALLY_VISIBLE #endif /* _GL_ATTRIBUTE_FALLTHROUGH declares that it is not a programming mistake if the control flow falls through to the immediately following 'case' or 'default' label. The compiler should not warn in this case. */ /* Applies to: Empty statement (;), inside a 'switch' statement. */ /* Always expands to something. */ #if _GL_HAS_C_ATTRIBUTE (fallthrough) # define _GL_ATTRIBUTE_FALLTHROUGH [[__fallthrough__]] #elif _GL_HAS_ATTRIBUTE (fallthrough) # define _GL_ATTRIBUTE_FALLTHROUGH __attribute__ ((__fallthrough__)) #else # define _GL_ATTRIBUTE_FALLTHROUGH ((void) 0) #endif /* _GL_ATTRIBUTE_FORMAT ((ARCHETYPE, STRING-INDEX, FIRST-TO-CHECK)) declares that the STRING-INDEXth function argument is a format string of style ARCHETYPE, which is one of: printf, gnu_printf scanf, gnu_scanf, strftime, gnu_strftime, strfmon, or the same thing prefixed and suffixed with '__'. If FIRST-TO-CHECK is not 0, arguments starting at FIRST-TO_CHECK are suitable for the format string. */ /* Applies to: functions. */ #if _GL_HAS_ATTRIBUTE (format) # define _GL_ATTRIBUTE_FORMAT(spec) __attribute__ ((__format__ spec)) #else # define _GL_ATTRIBUTE_FORMAT(spec) #endif /* _GL_ATTRIBUTE_LEAF declares that if the function is called from some other compilation unit, it executes code from that unit only by return or by exception handling. This declaration lets the compiler optimize that unit more aggressively. */ /* Applies to: functions. */ #if _GL_HAS_ATTRIBUTE (leaf) # define _GL_ATTRIBUTE_LEAF __attribute__ ((__leaf__)) #else # define _GL_ATTRIBUTE_LEAF #endif /* _GL_ATTRIBUTE_MALLOC declares that the function returns a pointer to freshly allocated memory. */ /* Applies to: functions. */ #if _GL_HAS_ATTRIBUTE (malloc) # define _GL_ATTRIBUTE_MALLOC __attribute__ ((__malloc__)) #else # define _GL_ATTRIBUTE_MALLOC #endif /* _GL_ATTRIBUTE_MAY_ALIAS declares that pointers to the type may point to the same storage as pointers to other types. Thus this declaration disables strict aliasing optimization. */ /* Applies to: types. */ /* Oracle Studio 12.6 mishandles may_alias despite __has_attribute OK. */ #if _GL_HAS_ATTRIBUTE (may_alias) && !defined __SUNPRO_C # define _GL_ATTRIBUTE_MAY_ALIAS __attribute__ ((__may_alias__)) #else # define _GL_ATTRIBUTE_MAY_ALIAS #endif /* _GL_ATTRIBUTE_MAYBE_UNUSED declares that it is not a programming mistake if the entity is not used. The compiler should not warn if the entity is not used. */ /* Applies to: - function, variable, - struct, union, struct/union member, - enumeration, enumeration item, - typedef, in C++ also: class. */ /* In C++ and C2x, this is spelled [[__maybe_unused__]]. GCC's syntax is __attribute__ ((__unused__)). clang supports both syntaxes. */ #if _GL_HAS_C_ATTRIBUTE (maybe_unused) # define _GL_ATTRIBUTE_MAYBE_UNUSED [[__maybe_unused__]] #else # define _GL_ATTRIBUTE_MAYBE_UNUSED _GL_ATTRIBUTE_UNUSED #endif /* Alternative spelling of this macro, for convenience. */ #define _GL_UNUSED _GL_ATTRIBUTE_MAYBE_UNUSED /* Earlier spellings of this macro. */ #define _UNUSED_PARAMETER_ _GL_ATTRIBUTE_MAYBE_UNUSED /* _GL_ATTRIBUTE_NODISCARD declares that the caller of the function should not discard the return value. The compiler may warn if the caller does not use the return value, unless the caller uses something like ignore_value. */ /* Applies to: function, enumeration, class. */ #if _GL_HAS_C_ATTRIBUTE (nodiscard) # define _GL_ATTRIBUTE_NODISCARD [[__nodiscard__]] #elif _GL_HAS_ATTRIBUTE (warn_unused_result) # define _GL_ATTRIBUTE_NODISCARD __attribute__ ((__warn_unused_result__)) #else # define _GL_ATTRIBUTE_NODISCARD #endif /* _GL_ATTRIBUTE_NOINLINE tells that the compiler should not inline the function. */ /* Applies to: functions. */ #if _GL_HAS_ATTRIBUTE (noinline) # define _GL_ATTRIBUTE_NOINLINE __attribute__ ((__noinline__)) #else # define _GL_ATTRIBUTE_NOINLINE #endif /* _GL_ATTRIBUTE_NONNULL ((N1, N2,...)) declares that the arguments N1, N2,... must not be NULL. _GL_ATTRIBUTE_NONNULL () declares that all pointer arguments must not be null. */ /* Applies to: functions. */ #if _GL_HAS_ATTRIBUTE (nonnull) # define _GL_ATTRIBUTE_NONNULL(args) __attribute__ ((__nonnull__ args)) #else # define _GL_ATTRIBUTE_NONNULL(args) #endif /* _GL_ATTRIBUTE_NONSTRING declares that the contents of a character array is not meant to be NUL-terminated. */ /* Applies to: struct/union members and variables that are arrays of element type '[[un]signed] char'. */ #if _GL_HAS_ATTRIBUTE (nonstring) # define _GL_ATTRIBUTE_NONSTRING __attribute__ ((__nonstring__)) #else # define _GL_ATTRIBUTE_NONSTRING #endif /* There is no _GL_ATTRIBUTE_NORETURN; use _Noreturn instead. */ /* _GL_ATTRIBUTE_NOTHROW declares that the function does not throw exceptions. */ /* Applies to: functions. */ #if _GL_HAS_ATTRIBUTE (nothrow) && !defined __cplusplus # define _GL_ATTRIBUTE_NOTHROW __attribute__ ((__nothrow__)) #else # define _GL_ATTRIBUTE_NOTHROW #endif /* _GL_ATTRIBUTE_PACKED declares: For struct members: The member has the smallest possible alignment. For struct, union, class: All members have the smallest possible alignment, minimizing the memory required. */ /* Applies to: struct members, struct, union, in C++ also: class. */ #if _GL_HAS_ATTRIBUTE (packed) # define _GL_ATTRIBUTE_PACKED __attribute__ ((__packed__)) #else # define _GL_ATTRIBUTE_PACKED #endif /* _GL_ATTRIBUTE_PURE declares that It is OK for a compiler to omit duplicate calls to the function with the same arguments if observable state is not changed between calls. This attribute is safe for a function that does not affect observable state, and always returns exactly once. (This attribute is looser than _GL_ATTRIBUTE_CONST.) */ /* Applies to: functions. */ #if _GL_HAS_ATTRIBUTE (pure) # define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__)) #else # define _GL_ATTRIBUTE_PURE #endif /* _GL_ATTRIBUTE_RETURNS_NONNULL declares that the function's return value is a non-NULL pointer. */ /* Applies to: functions. */ #if _GL_HAS_ATTRIBUTE (returns_nonnull) # define _GL_ATTRIBUTE_RETURNS_NONNULL __attribute__ ((__returns_nonnull__)) #else # define _GL_ATTRIBUTE_RETURNS_NONNULL #endif /* _GL_ATTRIBUTE_SENTINEL(pos) declares that the variadic function expects a trailing NULL argument. _GL_ATTRIBUTE_SENTINEL () - The last argument is NULL (requires C99). _GL_ATTRIBUTE_SENTINEL ((N)) - The (N+1)st argument from the end is NULL. */ /* Applies to: functions. */ #if _GL_HAS_ATTRIBUTE (sentinel) # define _GL_ATTRIBUTE_SENTINEL(pos) __attribute__ ((__sentinel__ pos)) #else # define _GL_ATTRIBUTE_SENTINEL(pos) #endif /* A helper macro. Don't use it directly. */ #if _GL_HAS_ATTRIBUTE (unused) # define _GL_ATTRIBUTE_UNUSED __attribute__ ((__unused__)) #else # define _GL_ATTRIBUTE_UNUSED #endif /* _GL_UNUSED_LABEL; declares that it is not a programming mistake if the immediately preceding label is not used. The compiler should not warn if the label is not used. */ /* Applies to: label (both in C and C++). */ /* Note that g++ < 4.5 does not support the '__attribute__ ((__unused__)) ;' syntax. But clang does. */ #if !(defined __cplusplus && !_GL_GNUC_PREREQ (4, 5)) || defined __clang__ # define _GL_UNUSED_LABEL _GL_ATTRIBUTE_UNUSED #else # define _GL_UNUSED_LABEL #endif /* Define to `__inline__' or `__inline' if that's what the C compiler calls it, or to nothing if 'inline' is not supported under any name. */ #ifndef __cplusplus #undef inline #endif /* Define to long or long long if and don't define. */ #undef intmax_t /* Work around a bug in Apple GCC 4.0.1 build 5465: In C99 mode, it supports the ISO C 99 semantics of 'extern inline' (unlike the GNU C semantics of earlier versions), but does not display it by setting __GNUC_STDC_INLINE__. __APPLE__ && __MACH__ test for Mac OS X. __APPLE_CC__ tests for the Apple compiler and its version. __STDC_VERSION__ tests for the C99 mode. */ #if defined __APPLE__ && defined __MACH__ && __APPLE_CC__ >= 5465 && !defined __cplusplus && __STDC_VERSION__ >= 199901L && !defined __GNUC_STDC_INLINE__ # define __GNUC_STDC_INLINE__ 1 #endif /* Define to a type if does not define. */ #undef mbstate_t /* _GL_CMP (n1, n2) performs a three-valued comparison on n1 vs. n2, where n1 and n2 are expressions without side effects, that evaluate to real numbers (excluding NaN). It returns 1 if n1 > n2 0 if n1 == n2 -1 if n1 < n2 The naïve code (n1 > n2 ? 1 : n1 < n2 ? -1 : 0) produces a conditional jump with nearly all GCC versions up to GCC 10. This variant (n1 < n2 ? -1 : n1 > n2) produces a conditional with many GCC versions up to GCC 9. The better code (n1 > n2) - (n1 < n2) from Hacker's Delight § 2-9 avoids conditional jumps in all GCC versions >= 3.4. */ #define _GL_CMP(n1, n2) (((n1) > (n2)) - ((n1) < (n2))) /* Define to `int' if does not define. */ #undef mode_t /* Define to the type of st_nlink in struct stat, or a supertype. */ #undef nlink_t /* Define as a signed integer type capable of holding a process identifier. */ #undef pid_t /* Define as the type of the result of subtracting two pointers, if the system doesn't define it. */ #undef ptrdiff_t /* Define to rpl_re_comp if the replacement should be used. */ #undef re_comp /* Define to rpl_re_compile_fastmap if the replacement should be used. */ #undef re_compile_fastmap /* Define to rpl_re_compile_pattern if the replacement should be used. */ #undef re_compile_pattern /* Define to rpl_re_exec if the replacement should be used. */ #undef re_exec /* Define to rpl_re_match if the replacement should be used. */ #undef re_match /* Define to rpl_re_match_2 if the replacement should be used. */ #undef re_match_2 /* Define to rpl_re_search if the replacement should be used. */ #undef re_search /* Define to rpl_re_search_2 if the replacement should be used. */ #undef re_search_2 /* Define to rpl_re_set_registers if the replacement should be used. */ #undef re_set_registers /* Define to rpl_re_set_syntax if the replacement should be used. */ #undef re_set_syntax /* Define to rpl_re_syntax_options if the replacement should be used. */ #undef re_syntax_options /* Define to rpl_regcomp if the replacement should be used. */ #undef regcomp /* Define to rpl_regerror if the replacement should be used. */ #undef regerror /* Define to rpl_regexec if the replacement should be used. */ #undef regexec /* Define to rpl_regfree if the replacement should be used. */ #undef regfree /* Define to the equivalent of the C99 'restrict' keyword, or to nothing if this is not supported. Do not define if restrict is supported only directly. */ #undef restrict /* Work around a bug in older versions of Sun C++, which did not #define __restrict__ or support _Restrict or __restrict__ even though the corresponding Sun C compiler ended up with "#define restrict _Restrict" or "#define restrict __restrict__" in the previous line. This workaround can be removed once we assume Oracle Developer Studio 12.5 (2016) or later. */ #if defined __SUNPRO_CC && !defined __RESTRICT && !defined __restrict__ # define _Restrict # define __restrict__ #endif /* Define to `unsigned int' if does not define. */ #undef size_t /* Define as a signed type of the same size as size_t. */ #undef ssize_t /* This definition is a duplicate of the one in unitypes.h. It is here so that we can cope with an older version of unitypes.h that does not contain this definition and that is pre-installed among the public header files. */ # if defined __restrict \ || 2 < __GNUC__ + (95 <= __GNUC_MINOR__) \ || __clang_major__ >= 3 # define _UC_RESTRICT __restrict # elif 199901L <= __STDC_VERSION__ || defined restrict # define _UC_RESTRICT restrict # else # define _UC_RESTRICT # endif grub-2.14~git20250718.0e36779/AUTHORS0000644000175000017500000000123515000202015013030 00000000000000The following authors assigned copyright on their work to the Free Software Foundation: Yoshinori K. Okuji designed and implemented the initial version. Jeroen Dekkers added initrd support, Multiboot support, and fixed bugs in ext2fs. Marco Gerards added ext2fs support, grub-emu, a new command-line engine, and fixed many bugs. Omniflux added terminfo and serial support. Vincent Pelletier added Sparc64 support. Hollis Blanchard implemented many parts of PowerPC support. Tomas Ebenlendr added the command chainloader into the normal mode, fixed some bugs. Guillem Jover merged architecture-independent ELF support code. Vesa Jaaskelainen added VBE support. grub-2.14~git20250718.0e36779/Makefile.utilgcry.def0000644000175000017500000000405015036452441016037 00000000000000AutoGen definitions Makefile.tpl; library = { name = libgrubgcry.a; cflags = '$(CFLAGS_GCRY)'; cppflags = '$(CPPFLAGS_GCRY)'; extra_dist = grub-core/lib/libgcrypt-grub/cipher/ChangeLog; common = grub-core/lib/libgcrypt-grub/src/const-time.c; common = grub-core/lib/libgcrypt-grub/cipher/arcfour.c; common = grub-core/lib/libgcrypt-grub/cipher/aria.c; common = grub-core/lib/libgcrypt-grub/cipher/blake2.c; common = grub-core/lib/libgcrypt-grub/cipher/blowfish.c; common = grub-core/lib/libgcrypt-grub/cipher/camellia-glue.c; common = grub-core/lib/libgcrypt-grub/cipher/camellia.c; common = grub-core/lib/libgcrypt-grub/cipher/cast5.c; common = grub-core/lib/libgcrypt-grub/cipher/crc.c; common = grub-core/lib/libgcrypt-grub/cipher/des.c; common = grub-core/lib/libgcrypt-grub/cipher/gost28147.c; common = grub-core/lib/libgcrypt-grub/cipher/gostr3411-94.c; common = grub-core/lib/libgcrypt-grub/cipher/idea.c; common = grub-core/lib/libgcrypt-grub/cipher/keccak.c; common = grub-core/lib/libgcrypt-grub/cipher/md4.c; common = grub-core/lib/libgcrypt-grub/cipher/md5.c; common = grub-core/lib/libgcrypt-grub/cipher/rfc2268.c; common = grub-core/lib/libgcrypt-grub/cipher/rijndael.c; common = grub-core/lib/libgcrypt-grub/cipher/rmd160.c; common = grub-core/lib/libgcrypt-grub/cipher/salsa20.c; common = grub-core/lib/libgcrypt-grub/cipher/seed.c; common = grub-core/lib/libgcrypt-grub/cipher/serpent.c; common = grub-core/lib/libgcrypt-grub/cipher/sha1.c; common = grub-core/lib/libgcrypt-grub/cipher/sha256.c; common = grub-core/lib/libgcrypt-grub/cipher/sha512.c; common = grub-core/lib/libgcrypt-grub/cipher/hash-common.c; common = grub-core/lib/libgcrypt-grub/cipher/sm3.c; common = grub-core/lib/libgcrypt-grub/cipher/sm4.c; common = grub-core/lib/libgcrypt-grub/cipher/stribog.c; common = grub-core/lib/libgcrypt-grub/cipher/tiger.c; common = grub-core/lib/libgcrypt-grub/cipher/twofish.c; common = grub-core/lib/libgcrypt-grub/cipher/whirlpool.c; common = grub-core/lib/libgcrypt-grub/cipher/init.c; }; grub-2.14~git20250718.0e36779/stamp-h.in0000644000175000017500000000001215036452442013675 00000000000000timestamp grub-2.14~git20250718.0e36779/configure.ac0000644000175000017500000024172115036452412014275 00000000000000# -*- autoconf -*- # Process this file with autoconf to produce a configure script. # Copyright (C) 2002,2003,2004,2005,2006,2007,2008,2009,2010 Free Software Foundation, Inc. # # This configure.ac is free software; the author # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. dnl This configure script is complicated, because GRUB needs to deal dnl with three potentially different types: dnl dnl build -- the environment for building GRUB dnl host -- the environment for running utilities dnl target -- the environment for running GRUB dnl dnl In addition, GRUB needs to deal with a platform specification dnl which specifies the system running GRUB, such as firmware. dnl This is necessary because the target type in autoconf does not dnl describe such a system very well. dnl dnl The current strategy is to use variables with no prefix (such as dnl CC, CFLAGS, etc.) for the host and target type, variables with dnl prefix "BUILD_" (such as BUILD_CC, BUILD_CFLAGS, etc.) for the dnl build type, variables with prefix "HOST_" (such as HOST_CC, dnl HOST_CFLAGS, etc.) for the host type and variables with the prefix dnl "TARGET_" (such as TARGET_CC, TARGET_CFLAGS, etc.) are used for dnl the target type. See INSTALL for full list of variables and dnl description of the relationships between them. AC_INIT([GRUB],[2.14~git20250718.0e36779],[bug-grub@gnu.org]) AS_CASE(["$ERROR_PLATFORM_NOT_SUPPORT_SSP"], [n | no | nO | N | No | NO], [ERROR_PLATFORM_NOT_SUPPORT_SSP=no], [ERROR_PLATFORM_NOT_SUPPORT_SSP=yes]) # We don't want -g -O2 by default in CFLAGS : ${CFLAGS=""} AC_USE_SYSTEM_EXTENSIONS AC_CONFIG_AUX_DIR([build-aux]) # Checks for build, host and target systems. AC_CANONICAL_BUILD AC_CANONICAL_HOST save_program_prefix="${program_prefix}" AC_CANONICAL_TARGET program_prefix="${save_program_prefix}" AM_INIT_AUTOMAKE([1.11]) AC_PREREQ(2.64) AC_CONFIG_SRCDIR([include/grub/dl.h]) AC_CONFIG_HEADERS([config-util.h]) # Explicitly check for pkg-config early on, since otherwise conditional # calls are problematic. PKG_PROG_PKG_CONFIG # Program name transformations AC_ARG_PROGRAM grub_TRANSFORM([grub-bios-setup]) grub_TRANSFORM([grub-editenv]) grub_TRANSFORM([grub-install]) grub_TRANSFORM([grub-mkconfig]) grub_TRANSFORM([grub-mkfont]) grub_TRANSFORM([grub-mkimage]) grub_TRANSFORM([grub-glue-efi]) grub_TRANSFORM([grub-mklayout]) grub_TRANSFORM([grub-mkpasswd-pbkdf2]) grub_TRANSFORM([grub-mkrelpath]) grub_TRANSFORM([grub-mkrescue]) grub_TRANSFORM([grub-probe]) grub_TRANSFORM([grub-protect]) grub_TRANSFORM([grub-reboot]) grub_TRANSFORM([grub-script-check]) grub_TRANSFORM([grub-set-default]) grub_TRANSFORM([grub-sparc64-setup]) grub_TRANSFORM([grub-render-label]) grub_TRANSFORM([grub-file]) # Allow HOST_CC to override CC. if test "x$HOST_CC" != x; then CC=$HOST_CC fi # Optimization flag. Allow user to override. if test "x$TARGET_CFLAGS" = x; then TARGET_CFLAGS=-Os fi # Enable support for "restrict" keyword and other # features from gnu99 C language standard. BUILD_CFLAGS="-std=gnu99 -fno-common $BUILD_CFLAGS" HOST_CFLAGS="-std=gnu99 -fno-common $HOST_CFLAGS" TARGET_CFLAGS="-std=gnu99 -fno-common $TARGET_CFLAGS" # Default HOST_CPPFLAGS HOST_CPPFLAGS="$HOST_CPPFLAGS -Wall -W" HOST_CPPFLAGS="$HOST_CPPFLAGS -DGRUB_UTIL=1" TARGET_CPPFLAGS="$TARGET_CPPFLAGS -Wall -W" case "$target_cpu" in i[[3456]]86) target_cpu=i386 ;; amd64) target_cpu=x86_64 ;; sparc) target_cpu=sparc64 ;; mipsel|mips64el) target_cpu=mipsel machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_CPU_MIPSEL=1" ;; mips|mips64) target_cpu=mips machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_CPU_MIPS=1" ;; arm*) target_cpu=arm ;; aarch64*) target_cpu=arm64 ;; loongarch64) target_cpu=loongarch64 ;; riscv32*) target_cpu=riscv32 ;; riscv64*) target_cpu=riscv64 ;; esac # Specify the platform (such as firmware). AC_ARG_WITH([platform], AS_HELP_STRING([--with-platform=PLATFORM], [select the host platform [[guessed]]])) # Guess the platform if not specified. if test "x$with_platform" = x; then case "$target_cpu"-"$target_vendor" in i386-apple) platform=efi ;; i386-*) platform=pc ;; x86_64-apple) platform=efi ;; x86_64-*) platform=pc ;; powerpc-*) platform=ieee1275 ;; powerpc64-*) platform=ieee1275 ;; powerpc64le-*) platform=ieee1275 ;; sparc64-*) platform=ieee1275 ;; mipsel-*) platform=loongson ;; mips-*) platform=arc ;; ia64-*) platform=efi ;; arm-*) platform=uboot ;; arm64-*) platform=efi ;; loongarch64-*) platform=efi;; riscv32-*) platform=efi ;; riscv64-*) platform=efi ;; *) AC_MSG_WARN([unsupported CPU: "$target_cpu" - only building utilities]) platform=none ;; esac else platform="$with_platform" fi case "$target_cpu"-"$platform" in x86_64-efi) ;; x86_64-emu) ;; x86_64-xen) ;; x86_64-none) ;; x86_64-*) target_cpu=i386 ;; powerpc64-ieee1275) target_cpu=powerpc ;; powerpc64le-ieee1275) target_cpu=powerpc ;; esac # Check if the platform is supported, make final adjustments. case "$target_cpu"-"$platform" in i386-efi) ;; x86_64-efi) ;; i386-xen) ;; i386-xen_pvh) ;; x86_64-xen) ;; i386-pc) ;; i386-multiboot) ;; i386-coreboot) ;; i386-linuxbios) platform=coreboot ;; i386-ieee1275) ;; i386-qemu) ;; powerpc-ieee1275) ;; sparc64-ieee1275) ;; ia64-efi) ;; mips-qemu_mips) ;; mips-qemu-mips) platform=qemu_mips;; mips-arc) ;; mipsel-arc) ;; mipsel-qemu_mips) ;; mipsel-qemu-mips) platform=qemu_mips;; mipsel-yeeloong) platform=loongson ;; mipsel-fuloong) platform=loongson ;; mipsel-loongson) ;; arm-uboot) ;; arm-coreboot) ;; arm-efi) ;; arm64-efi) ;; loongarch64-efi) ;; riscv32-efi) ;; riscv64-efi) ;; *-emu) ;; *-none) ;; *) AC_MSG_ERROR([platform "$platform" is not supported for target CPU "$target_cpu"]) ;; esac if test x$platform != xemu ; then case "$target_cpu" in i386 | powerpc) target_m32=1 ;; x86_64 | sparc64) target_m64=1 ;; esac fi if test x"$target_cpu-$platform" = xsparc64-emu ; then target_m64=1 fi case "$target_os" in windows* | mingw32*) target_os=cygwin ;; esac # This normalizes the names, and creates a new variable ("host_kernel") # while at it, since the mapping is not always 1:1 (e.g. different OSes # using the same kernel type). case "$host_os" in gnu*) host_kernel=hurd ;; linux*) host_kernel=linux ;; freebsd* | kfreebsd*-gnu) host_kernel=kfreebsd ;; netbsd*) host_kernel=netbsd ;; solaris*) host_kernel=illumos ;; darwin*) host_kernel=xnu ;; cygwin | windows* | mingw32*) host_kernel=windows ;; esac case "$host_os" in cygwin) have_exec=y ;; windows* | mingw32*) have_exec=n ;; aros*) have_exec=n ;; *) have_exec=y;; esac case "$platform" in coreboot) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_COREBOOT=1" ;; multiboot) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_MULTIBOOT=1" ;; efi) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_EFI=1" ;; xen) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_XEN=1" ;; xen_pvh) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_XEN_PVH=1" ;; ieee1275) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_IEEE1275=1" ;; uboot) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_UBOOT=1" ;; qemu) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_QEMU=1" ;; pc) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_PCBIOS=1" ;; emu) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_EMU=1" ;; loongson) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_MIPS_LOONGSON=1" ;; qemu_mips) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_MIPS_QEMU_MIPS=1" ;; arc) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_ARC=1" ;; esac if test x${target_cpu} = xmipsel ; then machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE=`echo mips_$platform | sed y,abcdefghijklmnopqrstuvwxyz,ABCDEFGHIJKLMNOPQRSTUVWXYZ,`" else machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE=`echo ${target_cpu}_$platform | sed y,abcdefghijklmnopqrstuvwxyz,ABCDEFGHIJKLMNOPQRSTUVWXYZ,`" fi case "${target_cpu}-$platform" in mips-arc) TARGET_LINK_ADDR=0x88200000 TARGET_DECOMPRESSOR_LINK_ADDR=0x88100000 ;; mipsel-arc) TARGET_LINK_ADDR=0x80700000 TARGET_DECOMPRESSOR_LINK_ADDR=0x80600000 ;; mips*-qemu_mips | mips*-loongson) TARGET_DECOMPRESSOR_LINK_ADDR=0x80100000 ;; esac AC_SUBST(TARGET_LINK_ADDR) AC_SUBST(TARGET_DECOMPRESSOR_LINK_ADDR) TARGET_CPPFLAGS="$TARGET_CPPFLAGS $machine_CPPFLAGS" AC_SUBST(host_cpu) AC_SUBST(host_os) AC_SUBST(host_kernel) AC_SUBST(target_cpu) AC_SUBST(platform) # Define default variables have_with_bootdir=n AC_ARG_WITH([bootdir], AS_HELP_STRING([--with-bootdir=DIR], [set the name of /boot directory [[guessed]]]), [have_with_bootdir=y], [have_with_bootdir=n]) if test x$have_with_bootdir = xy; then bootdirname="$with_bootdir" else case "$host_os" in netbsd* | openbsd*) # Because /boot is used for the boot block in NetBSD and OpenBSD, bootdirname='' ;; *) bootdirname='boot' ;; esac fi AC_SUBST(bootdirname) AC_DEFINE_UNQUOTED(GRUB_BOOT_DIR_NAME, "$bootdirname", [Default boot directory name]) AC_ARG_WITH([grubdir], AS_HELP_STRING([--with-grubdir=DIR], [set the name of grub directory [[guessed]]]), [grubdirname="$with_grubdir"], [grubdirname="$PACKAGE"]) AC_SUBST(grubdirname) AC_DEFINE_UNQUOTED(GRUB_DIR_NAME, "$grubdirname", [Default grub directory name]) # # Checks for build programs. # # Although cmp is listed in the GNU Coding Standards as a command which # can used directly, OpenBSD lacks cmp in the default installation. AC_CHECK_PROGS([CMP], [cmp]) if test "x$CMP" = x; then AC_MSG_ERROR([cmp is not found]) fi AC_CHECK_PROGS([YACC], [bison]) if test "x$YACC" = x; then AC_MSG_ERROR([bison is not found]) fi AC_PROG_RANLIB AC_PROG_INSTALL AC_PROG_AWK AC_PROG_LEX([noyywrap]) AC_PROG_YACC AC_PROG_MAKE_SET AC_PROG_MKDIR_P AC_PROG_LN_S if test "x$LEX" = "x:"; then AC_MSG_ERROR([flex is not found]) else version=`$LEX --version | $AWK '{ split($2,x,"."); print x[[1]]*10000+x[[2]]*100+x[[3]]; }'` if test -n "$version" -a "$version" -ge 20535; then : else AC_MSG_ERROR([flex is too old. GRUB requires 2.5.35 or above]) fi fi # These are not a "must". AC_PATH_PROGS(MAKEINFO, makeinfo true) # # Checks for host programs. # AC_PROG_CC gl_EARLY AC_PROG_CXX AM_PROG_CC_C_O AM_PROG_AS AM_PATH_PYTHON([2.6]) # Must be GCC. test "x$GCC" = xyes || AC_MSG_ERROR([GCC is required]) AC_CHECK_PROG(HAVE_CXX, $CXX, yes, no) AM_GNU_GETTEXT([external]) AM_GNU_GETTEXT_VERSION([0.18.3]) AC_SYS_LARGEFILE PLATFORMS_PCI=" $(PYTHONPATH="${srcdir}" $PYTHON -c 'import gentpl; print(" ".join(gentpl.GROUPS[["pci"]]))') " if test x"${PLATFORMS_PCI##* ${target_cpu}_${platform} *}" = x ; then have_pci=y fi # Identify characteristics of the host architecture. unset ac_cv_c_bigendian if test x"$target_cpu-$platform" = xsparc64-emu ; then CFLAGS="$CFLAGS -m64" HOST_CFLAGS="$HOST_CFLAGS -m64" fi CPPFLAGS="$CPPFLAGS -D_FILE_OFFSET_BITS=64" HOST_CPPFLAGS="$HOST_CPPFLAGS -D_FILE_OFFSET_BITS=64" AC_C_BIGENDIAN AC_CHECK_SIZEOF(void *) AC_CHECK_SIZEOF(long) case "$host_os" in cygwin | windows* | mingw32*) HOST_CPPFLAGS="$HOST_CPPFLAGS -DUNICODE=1 -D_WIN32_WINNT=0x0500" CPPFLAGS="$CPPFLAGS -DUNICODE=1 -D_WIN32_WINNT=0x0500" AC_CHECK_SIZEOF(TCHAR,,[#include ]) ;; esac case "$host_os" in cygwin | windows* | mingw32* | aros*) ;; *) AC_CHECK_SIZEOF(off_t) if test x"$ac_cv_sizeof_off_t" != x8 ; then AC_CHECK_SIZEOF(off64_t) test x"$ac_cv_sizeof_off64_t" = x8 || AC_MSG_ERROR([Large file support is required]) fi;; esac if test x$USE_NLS = xno; then HOST_CFLAGS="$HOST_CFLAGS -fno-builtin-gettext" fi if test "x$cross_compiling" = xyes; then AC_MSG_WARN([cannot generate manual pages while cross compiling]) else AC_PATH_PROG(HELP2MAN, help2man) fi # Check for functions and headers. AC_CHECK_FUNCS(posix_memalign memalign getextmntent atexit) AC_CHECK_HEADERS(sys/param.h sys/mount.h sys/mnttab.h limits.h) # glibc 2.25 still includes sys/sysmacros.h in sys/types.h but emits deprecation # warning which causes compilation failure later with -Werror. So use -Werror here # as well to force proper sys/sysmacros.h detection. Used in include/grub/osdep/major.h. SAVED_CFLAGS="$CFLAGS" CFLAGS="$HOST_CFLAGS -Werror" AC_HEADER_MAJOR CFLAGS="$SAVED_CFLAGS" AC_CHECK_MEMBERS([struct statfs.f_fstypename],,,[$ac_includes_default #include #include ]) AC_CHECK_MEMBERS([struct statfs.f_mntfromname],,,[$ac_includes_default #include #include ]) # For opendisk() and getrawpartition() on NetBSD. # Used in util/deviceiter.c and in util/hostdisk.c. AC_CHECK_HEADER([util.h], [ AC_CHECK_LIB([util], [opendisk], [ LIBUTIL="-lutil" AC_DEFINE(HAVE_OPENDISK, 1, [Define if opendisk() in -lutil can be used]) ]) AC_CHECK_LIB([util], [getrawpartition], [ LIBUTIL="-lutil" AC_DEFINE(HAVE_GETRAWPARTITION, 1, [Define if getrawpartition() in -lutil can be used]) ]) ]) AC_SUBST([LIBUTIL]) AC_CACHE_CHECK([whether -Wtrampolines work], [grub_cv_host_cc_wtrampolines], [ SAVED_CFLAGS="$CFLAGS" CFLAGS="$HOST_CFLAGS -Wtrampolines -Werror" AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include int va_arg_func (int fixed, va_list args);]], [[]])], [grub_cv_host_cc_wtrampolines=yes], [grub_cv_host_cc_wtrampolines=no]) CFLAGS="$SAVED_CFLAGS" ]) if test x"$grub_host_cv_cc_wtrampolines" = xyes ; then HOST_CFLAGS="$HOST_CFLAGS -Wtrampolines" fi # # Check for host and build compilers. # HOST_CC=$CC AC_CHECK_PROGS(BUILD_CC, [gcc egcs cc]) test -z "$BUILD_CC" && AC_MSG_ERROR([none of gcc, egcs and cc is found. set BUILD_CC manually.]) BUILD_CPP="$BUILD_CC -E" case "$build_os" in haiku*) BUILD_LIBM= ;; *) BUILD_LIBM=-lm ;; esac dnl FIXME proper test seems to require too deep dive into Autoconf internals. dnl For now just list known platforms that we support. case "$build_os" in cygwin*|mingw32*|mingw64*) BUILD_EXEEXT=.exe ;; *) BUILD_EXEEXT= ;; esac AC_SUBST(BUILD_EXEEXT) # In some build environments like termux /bin/sh is not a valid # shebang. Use $SHELL instead if it's executable and /bin/sh isn't BUILD_SHEBANG=/bin/sh for she in /bin/sh "$SHELL"; do if test -x "$she" ; then BUILD_SHEBANG="$she" fi done AC_SUBST(BUILD_SHEBANG) # For gnulib. gl_INIT WARN_FLAGS="-Wall -W -Wshadow -Wpointer-arith -Wundef -Wchar-subscripts -Wcomment -Wdeprecated-declarations -Wdisabled-optimization -Wdiv-by-zero -Wfloat-equal -Wformat-extra-args -Wformat-security -Wformat-y2k -Wimplicit -Wimplicit-function-declaration -Wimplicit-int -Wmain -Wmissing-braces -Wmissing-format-attribute -Wmultichar -Wparentheses -Wreturn-type -Wsequence-point -Wshadow -Wsign-compare -Wswitch -Wtrigraphs -Wunknown-pragmas -Wunused -Wunused-function -Wunused-label -Wunused-parameter -Wunused-value -Wunused-variable -Wwrite-strings -Wnested-externs -Wstrict-prototypes" EXTRA_WARN_FLAGS="-Wextra -Wattributes -Wendif-labels -Winit-self -Wint-to-pointer-cast -Winvalid-pch -Wmissing-field-initializers -Wnonnull -Woverflow -Wvla -Wpointer-to-int-cast -Wstrict-aliasing -Wvariadic-macros -Wvolatile-register-var -Wpointer-sign -Wmissing-include-dirs -Wmissing-prototypes -Wmissing-declarations -Wformat=2" HOST_CFLAGS="$HOST_CFLAGS $WARN_FLAGS -Wcast-align" AC_CACHE_CHECK([which extra warnings work], [grub_cv_cc_w_extra_flags], [ SAVED_CFLAGS="$CFLAGS" grub_cv_cc_w_extra_flags= for x in $EXTRA_WARN_FLAGS; do CFLAGS="$HOST_CFLAGS $x -Werror" AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[]])], [flag=1], [flag=0]) if test x$flag = x1 ; then grub_cv_cc_w_extra_flags="$grub_cv_cc_w_extra_flags $x" fi done CFLAGS="$SAVED_CFLAGS" ]) HOST_CFLAGS="$HOST_CFLAGS $grub_cv_cc_w_extra_flags" # # Check for target programs. # # Find tools for the target. if test "x$target_alias" != x && test "x$host_alias" != "x$target_alias"; then tmp_ac_tool_prefix="$ac_tool_prefix" ac_tool_prefix=$target_alias- AC_CHECK_TOOLS(TARGET_CC, [gcc egcs cc], [AC_MSG_ERROR([none of gcc, egcs and cc is found. set TARGET_CC manually.])]) AC_CHECK_TOOL(TARGET_OBJCOPY, objcopy) AC_CHECK_TOOL(TARGET_STRIP, strip) AC_CHECK_TOOL(TARGET_NM, nm) AC_CHECK_TOOL(TARGET_RANLIB, ranlib) ac_tool_prefix="$tmp_ac_tool_prefix" else if test "x$TARGET_CC" = x; then TARGET_CC=$CC fi AC_CHECK_TOOL(TARGET_OBJCOPY, objcopy) AC_CHECK_TOOL(TARGET_STRIP, strip) AC_CHECK_TOOL(TARGET_NM, nm) AC_CHECK_TOOL(TARGET_RANLIB, ranlib) fi AC_SUBST(HOST_CC) AC_SUBST(BUILD_CC) AC_SUBST(BUILD_CFLAGS) AC_SUBST(BUILD_CPPFLAGS) AC_SUBST(BUILD_LDFLAGS) AC_SUBST(TARGET_CC) AC_SUBST(TARGET_NM) AC_SUBST(TARGET_RANLIB) AC_SUBST(TARGET_STRIP) AC_SUBST(TARGET_OBJCOPY) # Test the C compiler for the target environment. tmp_CC="$CC" tmp_CFLAGS="$CFLAGS" tmp_LDFLAGS="$LDFLAGS" tmp_CPPFLAGS="$CPPFLAGS" tmp_LIBS="$LIBS" CC="$TARGET_CC" CFLAGS="$TARGET_CFLAGS" CPPFLAGS="$TARGET_CPPFLAGS" LDFLAGS="$TARGET_LDFLAGS" LIBS="" if test "x$target_m32" = x1; then # Force 32-bit mode. TARGET_CFLAGS="$TARGET_CFLAGS -m32" TARGET_CCASFLAGS="$TARGET_CCASFLAGS -m32" TARGET_CPPFLAGS="$TARGET_CPPFLAGS -m32" TARGET_LDFLAGS="$TARGET_LDFLAGS -m32" TARGET_MODULE_FORMAT="elf32" fi if test "x$target_m64" = x1; then # Force 64-bit mode. TARGET_CFLAGS="$TARGET_CFLAGS -m64" TARGET_CCASFLAGS="$TARGET_CCASFLAGS -m64" TARGET_CPPFLAGS="$TARGET_CPPFLAGS -m64" TARGET_LDFLAGS="$TARGET_LDFLAGS -m64" TARGET_MODULE_FORMAT="elf64" fi # debug flags. TARGET_CFLAGS="$TARGET_CFLAGS $WARN_FLAGS -g -Wredundant-decls -Wmissing-prototypes -Wmissing-declarations" TARGET_CCASFLAGS="$TARGET_CCASFLAGS -g" if test "x$target_cpu" != xi386 && test "x$target_cpu" != xx86_64; then TARGET_CFLAGS="$TARGET_CFLAGS -Wcast-align" fi TARGET_CC_VERSION="$(LC_ALL=C $TARGET_CC --version | head -n1)" AC_CACHE_CHECK([which extra warnings work], [grub_cv_target_cc_w_extra_flags], [ LDFLAGS="$TARGET_LDFLAGS -nostdlib -static" grub_cv_target_cc_w_extra_flags= for x in $EXTRA_WARN_FLAGS; do CFLAGS="$TARGET_CFLAGS $x -Werror" AC_LINK_IFELSE([AC_LANG_PROGRAM([[ asm (".globl start; start:"); void __main (void); void __main (void) {} int main (void); ]], [[]])], [flag=1], [flag=0]) if test x$flag = x1 ; then grub_cv_target_cc_w_extra_flags="$grub_cv_target_cc_w_extra_flags $x" fi done ]) TARGET_CFLAGS="$TARGET_CFLAGS $grub_cv_target_cc_w_extra_flags" AC_CACHE_CHECK([if compiling with clang], [grub_cv_cc_target_clang], [ CFLAGS="$TARGET_CFLAGS" AC_COMPILE_IFELSE( [AC_LANG_PROGRAM([], [[ #ifdef __clang__ #error "is clang" #endif ]])], [grub_cv_cc_target_clang=no], [grub_cv_cc_target_clang=yes])]) if test x$target_cpu = xpowerpc -o x$target_cpu = xmips; then AC_CACHE_CHECK([for options to get big-endian compilation], grub_cv_target_cc_big_endian, [ grub_cv_target_cc_big_endian=no for cand in "-target $target_cpu -Wl,-EB" "-target $target_cpu" \ "-target $target_cpu-linux-gnu -Wl,-EB" "-target $target_cpu-linux-gnu" \ "-EB" "-mbig-endian"; do if test x"$grub_cv_target_cc_big_endian" != xno ; then break fi CFLAGS="$TARGET_CFLAGS $cand -Werror" AC_LINK_IFELSE([AC_LANG_PROGRAM([[ #if defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__) && (__ORDER_BIG_ENDIAN__ != __BYTE_ORDER__) #error still little endian #endif asm (".globl start; start:"); asm (".globl _start; _start:"); asm (".globl __start; __start:"); void __main (void); void __main (void) {} int main (void); ]], [[]])], [grub_cv_target_cc_big_endian="$cand"], []) done ]) if test x"$grub_cv_target_cc_big_endian" = xno ; then AC_MSG_ERROR([could not force big-endian]) fi skip_linkflags="$(echo "$grub_cv_target_cc_big_endian"|sed 's@-Wl,-EB@@')" TARGET_CFLAGS="$TARGET_CFLAGS $skip_linkflags" TARGET_CPPFLAGS="$TARGET_CPPFLAGS $skip_linkflags" TARGET_CCASFLAGS="$TARGET_CCASFLAGS $skip_linkflags" TARGET_LDFLAGS="$TARGET_LDFLAGS $grub_cv_target_cc_big_endian" elif test x$target_cpu = xmipsel; then AC_CACHE_CHECK([for options to get little-endian compilation], grub_cv_target_cc_little_endian, [ grub_cv_target_cc_little_endian=no for cand in "-target $target_cpu -Wl,-EL" "-target $target_cpu" \ "-target $target_cpu-linux-gnu -Wl,-EL" "-target $target_cpu-linux-gnu" \ "-EL"; do if test x"$grub_cv_target_cc_little_endian" != xno ; then break fi CFLAGS="$TARGET_CFLAGS $cand -Werror" AC_LINK_IFELSE([AC_LANG_PROGRAM([[ #if defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__) && (__ORDER_BIG_ENDIAN__ == __BYTE_ORDER__) #error still big endian #endif asm (".globl start; start:"); asm (".globl _start; _start:"); asm (".globl __start; __start:"); void __main (void); void __main (void) {} int main (void); ]], [[]])], [grub_cv_target_cc_little_endian="$cand"], []) done ]) if test x"$grub_cv_target_cc_little_endian" = xno ; then AC_MSG_ERROR([could not force little-endian]) fi skip_linkflags="$(echo "$grub_cv_target_cc_little_endian"|sed 's@-Wl,-EL@@')" TARGET_CFLAGS="$TARGET_CFLAGS $skip_linkflags" TARGET_CPPFLAGS="$TARGET_CPPFLAGS $skip_linkflags" TARGET_CCASFLAGS="$TARGET_CCASFLAGS $skip_linkflags" TARGET_LDFLAGS="$TARGET_LDFLAGS $grub_cv_target_cc_little_endian" fi # GRUB code is N32-compliant but it's experimental and we would prefer to # avoid having too much variety when it doesn't result in any real improvement. # Moreover N64 isn't supported. if test "x$target_cpu" = xmips || test "x$target_cpu" = xmipsel ; then AC_CACHE_CHECK([for options to force MIPS o32 ABI], grub_cv_target_cc_mips_o32_abi, [ grub_cv_target_cc_mips_o32_abi=no for arg in "" "-mabi=32" "-target $target_cpu -mabi=32" ; do if test x"$grub_cv_target_cc_mips_o32_abi" != xno ; then break fi CFLAGS="$TARGET_CFLAGS $arg -Werror" AC_LINK_IFELSE([AC_LANG_PROGRAM([[ #if !defined(_ABIO32) || !defined(_MIPS_SIM) || (_MIPS_SIM != _ABIO32) #error not o32 ABI #endif asm (".globl start; start:"); asm (".globl _start; _start:"); asm (".globl __start; __start:"); void __main (void); void __main (void) {} int main (void); ]], [[]])], [grub_cv_target_cc_mips_o32_abi="$arg"], []) done ]) if test x"$grub_cv_target_cc_mips_o32_abi" = xno ; then AC_MSG_ERROR([could not force MIPS o32 ABI]) fi TARGET_CFLAGS="$TARGET_CFLAGS $grub_cv_target_cc_mips_o32_abi" TARGET_CCASFLAGS="$TARGET_CCASFLAGS $grub_cv_target_cc_mips_o32_abi" fi AC_CACHE_CHECK([for options to compile assembly], [grub_cv_cc_target_asm_compile], [ test_program= case "x$target_cpu-$platform" in xmips-* | xmipsel-*) test_program=mips ;; xi386-pc) test_program=i386-pc ;; xi386-* | xx86_64-*) test_program=i386 ;; xpowerpc-* | xsparc64-* | xarm-*) test_program=$target_cpu ;; esac if test x"$test_program" = x ; then grub_cv_cc_target_asm_compile= else found=no for arg in "" "-no-integrated-as"; do cmdline="$TARGET_CC -c -o /dev/null $TARGET_CCASFLAGS $arg $TARGET_CPPFLAGS $srcdir/asm-tests/$test_program.S" echo "Running $cmdline" >&AS_MESSAGE_LOG_FD if $cmdline >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD; then grub_cv_cc_target_asm_compile="$arg" found=yes break fi done if test x"$found" = xno ; then AC_MSG_ERROR([could not compile assembly]) fi fi ]) TARGET_CCASFLAGS="$TARGET_CCASFLAGS $grub_cv_cc_target_asm_compile" if test "x$target_cpu" = xi386 && test "x$platform" != xemu; then TARGET_CFLAGS="$TARGET_CFLAGS -march=i386" fi if test "x$grub_cv_cc_target_clang" = xno && test "x$target_cpu" = xi386 && test "x$platform" != xemu && test "x$platform" != xefi; then TARGET_CFLAGS="$TARGET_CFLAGS -mrtd -mregparm=3" fi # on mips redirect cache flushing function to non-existant one. if test "x$target_cpu" = xmips || test "x$target_cpu" = xmipsel ; then AC_CACHE_CHECK([whether -mflush-func=grub_red_herring works], [grub_cv_cc_mflush_func], [ CFLAGS="$TARGET_CFLAGS -mflush-func=grub_red_herring -Werror" AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])], [grub_cv_cc_mflush_func=yes], [grub_cv_cc_mflush_func=no]) ]) if test "x$grub_cv_cc_mflush_func" = xyes; then TARGET_CFLAGS="$TARGET_CFLAGS -mflush-func=grub_red_herring" fi AC_CACHE_CHECK([whether -mno-gpopt works], [grub_cv_cc_mno_gpopt], [ CFLAGS="$TARGET_CFLAGS -mno-gpopt -Werror" AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])], [grub_cv_cc_mno_gpopt=yes], [grub_cv_cc_mno_gpopt=no]) ]) if test "x$grub_cv_cc_mno_gpopt" = xyes; then TARGET_CFLAGS="$TARGET_CFLAGS -mno-gpopt" fi fi # Force no alignment to save space on i386. if test "x$target_cpu" = xi386; then TARGET_CFLAGS="$TARGET_CFLAGS -falign-functions=1" AC_CACHE_CHECK([whether -falign-loops works], [grub_cv_cc_falign_loop], [ CFLAGS="$TARGET_CFLAGS -falign-loops=1 -Werror" AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])], [grub_cv_cc_falign_loop=yes], [grub_cv_cc_falign_loop=no]) ]) if test "x$grub_cv_cc_falign_loop" = xyes; then TARGET_CFLAGS="$TARGET_CFLAGS -falign-loops=1" fi AC_CACHE_CHECK([whether -falign-jumps works], [grub_cv_cc_falign_jumps], [ CFLAGS="$TARGET_CFLAGS -falign-jumps=1 -Werror" AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])], [grub_cv_cc_falign_jumps=yes], [grub_cv_cc_falign_jumps=no]) ]) if test "x$grub_cv_cc_falign_jumps" = xyes; then TARGET_CFLAGS="$TARGET_CFLAGS -falign-jumps=1" fi fi AC_CACHE_CHECK([whether -freg-struct-return works], [grub_cv_cc_freg_struct_return], [ CFLAGS="$TARGET_CFLAGS -freg-struct-return -Werror" AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])], [grub_cv_cc_freg_struct_return=yes], [grub_cv_cc_freg_struct_return=no]) ]) if test "x$grub_cv_cc_freg_struct_return" = xyes; then TARGET_CFLAGS="$TARGET_CFLAGS -freg-struct-return" fi if ( test "x$target_cpu" = xi386 || test "x$target_cpu" = xx86_64 ) && test "x$platform" != xemu; then # Some toolchains enable these features by default, but they need # registers that aren't set up properly in GRUB. TARGET_CFLAGS="$TARGET_CFLAGS -mno-mmx -mno-sse -mno-sse2 -mno-sse3 -mno-3dnow" fi if ( test "x$target_cpu" = xi386 || test "x$target_cpu" = xx86_64 ); then AC_CACHE_CHECK([whether -Wa,-mx86-used-note works], [grub_cv_cc_mx86_used_note], [ CFLAGS="$TARGET_CFLAGS -Wa,-mx86-used-note=no -Werror" AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])], [grub_cv_cc_mx86_used_note=yes], [grub_cv_cc_mx86_used_note=no]) ]) if test "x$grub_cv_cc_mx86_used_note" = xyes; then TARGET_CFLAGS="$TARGET_CFLAGS -Wa,-mx86-used-note=no" TARGET_CCASFLAGS="$TARGET_CCASFLAGS -Wa,-mx86-used-note=no" fi fi if test "x$target_cpu" = xloongarch64; then AC_CACHE_CHECK([whether _mno_explicit_relocs works], [grub_cv_cc_mno_explicit_relocs], [ CFLAGS="$TARGET_CFLAGS -mno-explicit-relocs -Werror" AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])], [grub_cv_cc_mno_explicit_relocs=yes], [grub_cv_cc_mno_explicit_relocs=no]) ]) if test "x$grub_cv_cc_mno_explicit_relocs" = xyes; then TARGET_CFLAGS="$TARGET_CFLAGS -mno-explicit-relocs -fno-plt" TARGET_CCASFLAGS="$TARGET_CCASFLAGS -mno-explicit-relocs -fno-plt" fi AC_CACHE_CHECK([for no-relax options], grub_cv_target_cc_mno_relax, [ grub_cv_target_cc_mno_relax=no for cand in "-mno-relax" "-Wa,-mno-relax"; do if test x"$grub_cv_target_cc_mno_relax" != xno ; then break fi CFLAGS="$TARGET_CFLAGS $cand -Werror" AC_LINK_IFELSE([AC_LANG_PROGRAM([[ asm (".globl start; start:"); void __main (void); void __main (void) {} int main (void); ]], [[]])], [grub_cv_target_cc_mno_relax="$cand"], []) done ]) CFLAGS="$TARGET_CFLAGS" if test x"$grub_cv_target_cc_mno_relax" != xno ; then TARGET_CFLAGS="$TARGET_CFLAGS $grub_cv_target_cc_mno_relax" TARGET_CCASFLAGS="$TARGET_CCASFLAGS $grub_cv_target_cc_mno_relax" fi TARGET_CFLAGS="$TARGET_CFLAGS -Wa,-mla-global-with-abs" TARGET_CCASFLAGS="$TARGET_CCASFLAGS -Wa,-mla-global-with-abs" fi if test "x$target_cpu" = xriscv64 || test "x$target_cpu" = xriscv32; then AC_CACHE_CHECK([for no-relax options], grub_cv_target_cc_mno_relax, [ grub_cv_target_cc_mno_relax=no for cand in "-mno-relax" "-Wa,-mno-relax"; do if test x"$grub_cv_target_cc_mno_relax" != xno ; then break fi CFLAGS="$TARGET_CFLAGS $cand -Werror" AC_LINK_IFELSE([AC_LANG_PROGRAM([[ asm (".globl start; start:"); void __main (void); void __main (void) {} int main (void); ]], [[]])], [grub_cv_target_cc_mno_relax="$cand"], []) done ]) CFLAGS="$TARGET_CFLAGS" if test x"$grub_cv_target_cc_mno_relax" != xno ; then TARGET_CFLAGS="$TARGET_CFLAGS $grub_cv_target_cc_mno_relax" TARGET_CCASFLAGS="$TARGET_CCASFLAGS $grub_cv_target_cc_mno_relax" fi fi # GRUB doesn't use float or doubles at all. Yet some toolchains may decide # that floats are a good fit to run instead of what's written in the code. # Given that floating point unit is disabled (if present to begin with) # when GRUB is running which may result in various hard crashes. if test x"$platform" != xemu ; then AC_CACHE_CHECK([for options to get soft-float], grub_cv_target_cc_soft_float, [ grub_cv_target_cc_soft_float=no if test "x$target_cpu" = xarm64; then CFLAGS="$TARGET_CFLAGS -mgeneral-regs-only -Werror" AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])], [grub_cv_target_cc_soft_float="-mgeneral-regs-only"], []) fi if test "x$target_cpu" = xriscv32; then CFLAGS="$TARGET_CFLAGS -march=rv32imac -mabi=ilp32 -Werror" AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])], [grub_cv_target_cc_soft_float="-march=rv32imac -mabi=ilp32"], []) # ISA spec version 20191213 factored out extensions Zicsr and Zifencei CFLAGS="$TARGET_CFLAGS -march=rv32imac_zicsr_zifencei -mabi=ilp32 -Werror" AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])], [grub_cv_target_cc_soft_float="-march=rv32imac_zicsr_zifencei -mabi=ilp32"], []) fi if test "x$target_cpu" = xriscv64; then CFLAGS="$TARGET_CFLAGS -march=rv64imac -mabi=lp64 -Werror" AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])], [grub_cv_target_cc_soft_float="-march=rv64imac -mabi=lp64"], []) # ISA spec version 20191213 factored out extensions Zicsr and Zifencei CFLAGS="$TARGET_CFLAGS -march=rv64imac_zicsr_zifencei -mabi=lp64 -Werror" AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])], [grub_cv_target_cc_soft_float="-march=rv64imac_zicsr_zifencei -mabi=lp64"], []) fi if test "x$target_cpu" = xia64; then CFLAGS="$TARGET_CFLAGS -mno-inline-float-divide -mno-inline-sqrt -Werror" AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])], [grub_cv_target_cc_soft_float="-mno-inline-float-divide -mno-inline-sqrt"], []) fi if test "x$target_cpu" = xsh4; then CFLAGS="$TARGET_CFLAGS -m4-nofpu -Werror" AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])], [grub_cv_target_cc_soft_float="-m4-nofpu"], []) fi for cand in "-msoft-float -Xclang -msoft-float -Xclang -no-implicit-float" \ "-Xclang -msoft-float -Xclang -no-implicit-float" \ "-Xclang -msoft-float" "-msoft-float"; do if test x"$grub_cv_target_cc_soft_float" != xno ; then break fi CFLAGS="$TARGET_CFLAGS $cand -Werror" AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])], [grub_cv_target_cc_soft_float="$cand"], []) done ]) if test x"$grub_cv_target_cc_soft_float" = xno ; then AC_MSG_ERROR([could not force soft-float]) fi case x"$grub_cv_target_cc_soft_float" in x*"-Xclang"*) # A trick so that clang doesn't see it on link stаge TARGET_CPPFLAGS="$TARGET_CPPFLAGS $grub_cv_target_cc_soft_float" ;; *) TARGET_CFLAGS="$TARGET_CFLAGS $grub_cv_target_cc_soft_float" ;; esac TARGET_CCASFLAGS="$TARGET_CCASFLAGS $grub_cv_target_cc_soft_float" fi if test x"$target_cpu" = xsparc64 ; then AC_CACHE_CHECK([for options to reserve application registers], grub_cv_target_cc_mno_app_regs, [ grub_cv_target_cc_mno_app_regs=no for cand in "-mllvm -sparc-reserve-app-registers" \ "-mno-app-regs"; do if test x"$grub_cv_target_cc_mno_app_regs" != xno ; then break fi CFLAGS="$TARGET_CFLAGS $cand -Werror" CPPFLAGS="$TARGET_CPPFLAGS" AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])], [grub_cv_target_cc_mno_app_regs="$cand"], []) done ]) if test x"$grub_cv_target_cc_mno_app_regs" = xno ; then AC_MSG_ERROR([could not reserve application registers]) fi if test x"$grub_cv_target_cc_mno_app_regs" = x"-mllvm -sparc-reserve-app-registers" ; then # A trick so that clang doesn't see it on link stаge TARGET_CPPFLAGS="$TARGET_CPPFLAGS $grub_cv_target_cc_mno_app_regs" else TARGET_CFLAGS="$TARGET_CFLAGS $grub_cv_target_cc_mno_app_regs" fi AC_CACHE_CHECK([for no-relax options], grub_cv_target_cc_mno_relax, [ grub_cv_target_cc_mno_relax=no for cand in "-mno-relax" "-Wl,--no-relax"; do if test x"$grub_cv_target_cc_mno_relax" != xno ; then break fi LDFLAGS="$TARGET_LDFLAGS $cand -nostdlib -static" CFLAGS="$TARGET_CFLAGS -Werror" AC_LINK_IFELSE([AC_LANG_PROGRAM([[ asm (".globl start; start:"); void __main (void); void __main (void) {} int main (void); ]], [[]])], [grub_cv_target_cc_mno_relax="$cand"], []) done ]) LDFLAGS="$TARGET_LDFLAGS" CFLAGS="$TARGET_CFLAGS" if test x"$grub_cv_target_cc_mno_relax" = xno ; then AC_MSG_ERROR([could not find no-relax options]) fi TARGET_LDFLAGS="$TARGET_LDFLAGS $grub_cv_target_cc_mno_relax" fi # The backtrace module relies on frame pointers and the default optimization # level, -Os, omits them. Make sure they are enabled. AC_CACHE_CHECK([whether -fno-omit-frame-pointer works], [grub_cv_cc_fno_omit_frame_pointer], [ CFLAGS="$TARGET_CFLAGS -fno-omit-frame-pointer" AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])], [grub_cv_cc_fno_omit_frame_pointer=yes], [grub_cv_cc_fno_omit_frame_pointer=no]) ]) if test "x$grub_cv_cc_fno_omit_frame_pointer" = xyes; then TARGET_CFLAGS="$TARGET_CFLAGS -fno-omit-frame-pointer" fi # By default, GCC 4.4 generates .eh_frame sections containing unwind # information in some cases where it previously did not. GRUB doesn't need # these and they just use up vital space. Restore the old compiler # behaviour. AC_CACHE_CHECK([whether -fno-dwarf2-cfi-asm works], [grub_cv_cc_fno_dwarf2_cfi_asm], [ CFLAGS="$TARGET_CFLAGS -fno-dwarf2-cfi-asm" AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])], [grub_cv_cc_fno_dwarf2_cfi_asm=yes], [grub_cv_cc_fno_dwarf2_cfi_asm=no]) ]) if test "x$grub_cv_cc_fno_dwarf2_cfi_asm" = xyes; then TARGET_CFLAGS="$TARGET_CFLAGS -fno-dwarf2-cfi-asm" fi if test x"$target_os" = xcygwin; then AC_CACHE_CHECK([whether option -fno-reorder-functions works], grub_cv_cc_no_reorder_functions, [ CFLAGS="$TARGET_CFLAGS -fno-reorder-functions" AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])], [grub_cv_cc_no_reorder_functions=yes], [grub_cv_cc_no_reorder_functions=no]) ]) fi if test x"$target_os" = xcygwin && test "x$grub_cv_cc_no_reorder_functions" = xyes; then TARGET_CFLAGS="$TARGET_CFLAGS -fno-reorder-functions" fi AC_CACHE_CHECK([whether -mno-stack-arg-probe works], [grub_cv_cc_mno_stack_arg_probe], [ CFLAGS="$TARGET_CFLAGS -mno-stack-arg-probe" AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])], [grub_cv_cc_mno_stack_arg_probe=yes], [grub_cv_cc_mno_stack_arg_probe=no]) ]) if test "x$grub_cv_cc_mno_stack_arg_probe" = xyes; then TARGET_CFLAGS="$TARGET_CFLAGS -mno-stack-arg-probe" fi # By default, GCC 4.6 generates .eh_frame sections containing unwind # information in some cases where it previously did not. GRUB doesn't need # these and they just use up vital space. Restore the old compiler # behaviour. AC_CACHE_CHECK([whether -fno-asynchronous-unwind-tables works], [grub_cv_cc_fno_asynchronous_unwind_tables], [ CFLAGS="$TARGET_CFLAGS -fno-asynchronous-unwind-tables" AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])], [grub_cv_cc_fno_asynchronous_unwind_tables=yes], [grub_cv_cc_fno_asynchronous_unwind_tables=no]) ]) if test "x$grub_cv_cc_fno_asynchronous_unwind_tables" = xyes; then TARGET_CFLAGS="$TARGET_CFLAGS -fno-asynchronous-unwind-tables" fi AC_CACHE_CHECK([whether -fno-unwind-tables works], [grub_cv_cc_fno_unwind_tables], [ CFLAGS="$TARGET_CFLAGS -fno-unwind-tables" AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])], [grub_cv_cc_fno_unwind_tables=yes], [grub_cv_cc_fno_unwind_tables=no]) ]) if test "x$grub_cv_cc_fno_unwind_tables" = xyes; then TARGET_CFLAGS="$TARGET_CFLAGS -fno-unwind-tables" fi # Do not generate .ident sections. AC_CACHE_CHECK([whether -fno-ident works], [grub_cv_cc_fno_ident], [ CFLAGS="$TARGET_CFLAGS -fno-ident" AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])], [grub_cv_cc_fno_ident=yes], [grub_cv_cc_fno_ident=no]) ]) if test "x$grub_cv_cc_fno_ident" = xyes; then TARGET_CFLAGS="$TARGET_CFLAGS -fno-ident" fi CFLAGS="$TARGET_CFLAGS" if test x"$platform" = xemu ; then TARGET_OBJ2ELF= grub_cv_target_cc_link_format= case "$host_os" in *darwin* | *mac*) grub_cv_target_cc_link_format="-arch,${target_cpu}" TARGET_LDFLAGS="$TARGET_LDFLAGS -Wl,$grub_cv_target_cc_link_format" ;; *windows* | *cygwin* | *mingw*) if test x${target_cpu} = xi386 ; then grub_cv_target_cc_link_format=-mi386pe TARGET_OBJ2ELF='./build-grub-pe2elf$(BUILD_EXEEXT)' fi if test x${target_cpu} = xx86_64 ; then grub_cv_target_cc_link_format=-mi386pep TARGET_OBJ2ELF='./build-grub-pep2elf$(BUILD_EXEEXT)' fi TARGET_LDFLAGS="$TARGET_LDFLAGS -Wl,$grub_cv_target_cc_link_format" ;; esac elif test x"$target_cpu" = xi386 || test x"$target_cpu" = xx86_64; then AC_CACHE_CHECK([for target linking format], [grub_cv_target_cc_link_format], [ grub_cv_target_cc_link_format=unknown for format in -melf_${target_cpu} -melf_${target_cpu}_fbsd -melf_${target_cpu}_obsd -melf_${target_cpu}_haiku -mi386pe -mi386pep -arch,${target_cpu}; do if test x${target_cpu} != xi386 && test x$format = x-mi386pe; then continue fi if test x${target_cpu} != xx86_64 && test x$format = x-mi386pep; then continue fi CFLAGS="$TARGET_CFLAGS" LDFLAGS="$TARGET_LDFLAGS -Wl,$format -nostdlib -static" AC_LINK_IFELSE([AC_LANG_PROGRAM([[ asm (".globl start; start:"); asm (".globl _start; _start:"); asm (".globl __start; __start:"); void __main (void); void __main (void) {} ]], [[]])], [flag=1], [flag=0]) if test x"$flag" = x1; then grub_cv_target_cc_link_format="$format" break fi done]) if test x"$grub_cv_target_cc_link_format" = xunknown; then AC_MSG_ERROR([no suitable link format found]) fi TARGET_LDFLAGS="$TARGET_LDFLAGS -Wl,$grub_cv_target_cc_link_format" if test x"$grub_cv_target_cc_link_format" = x-mi386pe ; then TARGET_OBJ2ELF='./build-grub-pe2elf$(BUILD_EXEEXT)' fi if test x"$grub_cv_target_cc_link_format" = x-mi386pep ; then TARGET_OBJ2ELF='./build-grub-pep2elf$(BUILD_EXEEXT)' fi fi if test x$grub_cv_target_cc_link_format = x-arch,i386 || test x$grub_cv_target_cc_link_format = x-arch,x86_64; then TARGET_APPLE_LINKER=1 AC_CHECK_PROG([TARGET_OBJCONV], [objconv], [objconv], []) if test "x$TARGET_OBJCONV" = x ; then AC_CHECK_PROG([TARGET_OBJCONV], [objconv], [./objconv], [], [.]) fi if test "x$TARGET_OBJCONV" = x ; then AC_MSG_ERROR([objconv not found which is required when building with apple compiler]) fi TARGET_IMG_LDSCRIPT= TARGET_IMG_CFLAGS="-static" TARGET_IMG_LDFLAGS='-nostdlib -static -Wl,-preload -Wl,-segalign,20' TARGET_IMG_LDFLAGS_AC='-nostdlib -static -Wl,-preload -Wl,-segalign,20' TARGET_IMG_BASE_LDOPT="-Wl,-image_base" TARGET_LDFLAGS_OLDMAGIC="" elif test x$grub_cv_target_cc_link_format = x-mi386pe || test x$grub_cv_target_cc_link_format = x-mi386pep ; then TARGET_APPLE_LINKER=0 TARGET_LDFLAGS_OLDMAGIC="-Wl,-N" TARGET_IMG_LDSCRIPT='$(top_srcdir)'"/conf/i386-cygwin-img-ld.sc" TARGET_IMG_LDFLAGS="-Wl,-T${TARGET_IMG_LDSCRIPT}" TARGET_IMG_LDFLAGS_AC="-Wl,-T${srcdir}/conf/i386-cygwin-img-ld.sc" TARGET_IMG_BASE_LDOPT="-Wl,-Ttext" TARGET_IMG_CFLAGS= else TARGET_APPLE_LINKER=0 TARGET_LDFLAGS_OLDMAGIC="-Wl,-N" TARGET_IMG_LDSCRIPT= TARGET_IMG_LDFLAGS='-Wl,-N' TARGET_IMG_LDFLAGS_AC='-Wl,-N' TARGET_IMG_BASE_LDOPT="-Wl,-Ttext" TARGET_IMG_CFLAGS= fi CFLAGS="$TARGET_CFLAGS" AC_ARG_ENABLE([efiemu], [AS_HELP_STRING([--enable-efiemu], [build and install the efiemu runtimes (default=guessed)])]) if test x"$enable_efiemu" = xno ; then efiemu_excuse="explicitly disabled" fi if test x"$grub_cv_target_cc_link_format" = x-mi386pe || test x"$grub_cv_target_cc_link_format" = x-mi386pep ; then efiemu_excuse="not available on cygwin" fi if test x"$target_cpu" != xi386 ; then efiemu_excuse="only available on i386" fi if test x"$platform" = xefi ; then efiemu_excuse="not available on efi" fi if test x"$efiemu_excuse" = x ; then AC_CACHE_CHECK([whether options required for efiemu work], grub_cv_cc_efiemu, [ CFLAGS="-m64 -nostdlib -O2 -mcmodel=large -mno-red-zone" AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])], [grub_cv_cc_efiemu=yes], [grub_cv_cc_efiemu=no]) ]) if test x$grub_cv_cc_efiemu = xno; then efiemu_excuse="cannot compile with -m64 -mcmodel=large -mno-red-zone -nostdlib" fi fi if test x"$efiemu_excuse" = x ; then AC_CACHE_CHECK([for efiemu64 linking format], [grub_cv_target_cc_efiemu64_link_format], [ grub_cv_target_cc_efiemu64_link_format=unknown for format in -melf_x86_64 -melf_x86_64_fbsd -melf_x86_64_obsd -melf_x86_64_haiku -arch,x86_64; do CFLAGS="-m64 -nostdlib -O2 -mcmodel=large -mno-red-zone" LDFLAGS="-m64 -Wl,$format -nostdlib -static" AC_LINK_IFELSE([AC_LANG_PROGRAM([[ asm (".globl start; start:"); asm (".globl _start; _start:"); asm (".globl __start; __start:"); void __main (void); void __main (void) {} ]], [[]])], [flag=1], [flag=0]) if test x"$flag" = x1; then grub_cv_target_cc_efiemu64_link_format="$format" break fi done]) if test x"$grub_cv_target_cc_efiemu64_link_format" = xunknown; then efiemu_excuse="no suitable link format for efiemu64 found" else EFIEMU64_LINK_FORMAT="-Wl,$grub_cv_target_cc_efiemu64_link_format" fi fi if test x"$enable_efiemu" = xyes && test x"$efiemu_excuse" != x ; then AC_MSG_ERROR([efiemu runtime was explicitly requested but can't be compiled ($efiemu_excuse)]) fi if test x"$efiemu_excuse" = x ; then enable_efiemu=yes else enable_efiemu=no fi AC_SUBST([enable_efiemu]) AC_SUBST([EFIEMU64_LINK_FORMAT]) CFLAGS="$TARGET_CFLAGS" AC_SUBST(TARGET_LDFLAGS_OLDMAGIC) LDFLAGS="$TARGET_LDFLAGS" if test "$target_cpu" = x86_64 || test "$target_cpu" = sparc64 || test "$target_cpu" = riscv64 ; then # Use large model to support 4G memory AC_CACHE_CHECK([whether option -mcmodel=large works], grub_cv_cc_mcmodel, [ CFLAGS="$TARGET_CFLAGS -mcmodel=large" AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])], [grub_cv_cc_mcmodel=yes], [grub_cv_cc_mcmodel=no]) ]) if test "x$grub_cv_cc_mcmodel" = xyes; then TARGET_CFLAGS="$TARGET_CFLAGS -mcmodel=large" elif test "$target_cpu" = sparc64 || test "$target_cpu" = riscv64; then TARGET_CFLAGS="$TARGET_CFLAGS -mcmodel=medany" fi fi if test "$target_cpu"-"$platform" = x86_64-efi; then # EFI writes to stack below %rsp, we must not use the red zone AC_CACHE_CHECK([whether option -mno-red-zone works], grub_cv_cc_no_red_zone, [ CFLAGS="$TARGET_CFLAGS -mno-red-zone" AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])], [grub_cv_cc_no_red_zone=yes], [grub_cv_cc_no_red_zone=no]) ]) if test "x$grub_cv_cc_no_red_zone" = xno; then AC_MSG_ERROR([-mno-red-zone not supported, upgrade your gcc]) fi TARGET_CFLAGS="$TARGET_CFLAGS -mno-red-zone" fi if test "x$target_cpu" = xarm; then AC_CACHE_CHECK([for options to disable movt and movw], grub_cv_target_cc_mno_movt, [ grub_cv_target_cc_mno_movt=no for cand in "-mno-movt" \ "-mllvm -arm-use-movt=0" \ "-mword-relocations"; do if test x"$grub_cv_target_cc_mno_movt" != xno ; then break fi CFLAGS="$TARGET_CFLAGS $cand -Werror" CPPFLAGS="$TARGET_CPPFLAGS" AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])], [grub_cv_target_cc_mno_movt="$cand"], []) done ]) if test x"$grub_cv_target_cc_mno_movt" != xno ; then # A trick so that clang doesn't see it on link stage TARGET_CPPFLAGS="$TARGET_CPPFLAGS $grub_cv_target_cc_mno_movt" fi AC_CACHE_CHECK([whether option -mthumb-interwork works], grub_cv_cc_mthumb_interwork, [ CFLAGS="$TARGET_CFLAGS -mthumb-interwork -Werror" AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])], [grub_cv_cc_mthumb_interwork=yes], [grub_cv_cc_mthumb_interwork=no]) ]) if test "x$grub_cv_cc_mthumb_interwork" = xyes; then TARGET_CFLAGS="$TARGET_CFLAGS -mthumb-interwork" # Clang defaults to thumb interworking elif test "x$grub_cv_cc_target_clang" = xno ; then AC_MSG_ERROR([your compiler doesn't support -mthumb-interwork]) fi fi AC_CACHE_CHECK([whether option -Qn works], grub_cv_target_cc_qn, [ CFLAGS="$TARGET_CFLAGS -Qn -Qunused-arguments -Werror" AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])], [grub_cv_target_cc_qn=yes], [grub_cv_target_cc_qn=no])]) if test "x$grub_cv_target_cc_qn" = xyes; then TARGET_CFLAGS="$TARGET_CFLAGS -Qn -Qunused-arguments" fi # # Compiler features. # CFLAGS="$TARGET_CFLAGS" # Position independent executable. grub_CHECK_PIE grub_CHECK_NO_PIE grub_CHECK_NO_PIE_ONEWORD grub_CHECK_LINK_PIE [# Need that, because some distributions ship compilers that include # `-fPIE' or '-fpie' and '-pie' in the default specs. if [ x"$pie_possible" = xyes ]; then TARGET_CFLAGS="$TARGET_CFLAGS -fno-PIE -fno-pie" TARGET_CCASFLAGS="$TARGET_CCASFLAGS -fno-PIE -fno-pie" fi if [ x"$link_nopie_needed" = xyes ] || [ x"$pie_possible" = xyes ]; then if [ x"$nopie_possible" = xyes ]; then TARGET_LDFLAGS="$TARGET_LDFLAGS -no-pie" fi if [ x"$nopie_oneword_possible" = xyes ]; then TARGET_LDFLAGS="$TARGET_LDFLAGS -nopie" fi fi] CFLAGS="$TARGET_CFLAGS" LDFLAGS="$TARGET_LDFLAGS" # Position independent executable. grub_CHECK_PIC [# On most platforms we don't want PIC as it only makes relocations harder # and code less efficient. On mips we want to have one got table per module # and reload $gp in every function. # GCC implements it using symbol __gnu_local_gp in non-PIC as well. # However with clang we need PIC for this reloading to happen. # With arm64 we need relocations that are in some way representable in # PE as we need to support arm64-efi. Without -fPIC clang generates # movk's which aren't representable. # Since default varies across dictributions use either -fPIC or -fno-PIC # explicitly. if ( test x$target_cpu = xmips || test x$target_cpu = xmipsel || test x$target_cpu = xarm64 ) && test "x$grub_cv_cc_target_clang" = xyes ; then TARGET_CFLAGS="$TARGET_CFLAGS -fPIC" elif [ x"$pic_possible" = xyes ]; then TARGET_CFLAGS="$TARGET_CFLAGS -fno-PIC" fi] CFLAGS="$TARGET_CFLAGS" # Stack smashing protector. grub_CHECK_STACK_PROTECTOR AC_ARG_ENABLE([stack-protector], AS_HELP_STRING([--enable-stack-protector], [enable the stack protector]), [], [enable_stack_protector=no]) if test "x$enable_stack_protector" = xno; then if test "x$ssp_possible" = xyes; then # Need that, because some distributions ship compilers that include # `-fstack-protector' in the default specs. TARGET_CFLAGS="$TARGET_CFLAGS -fno-stack-protector" fi elif test "x$platform" != xefi; then if test "$ERROR_PLATFORM_NOT_SUPPORT_SSP" = "yes"; then AC_MSG_ERROR([--enable-stack-protector is only supported on EFI platforms]) else AC_MSG_WARN([--enable-stack-protector is only supported on EFI platforms]) fi enable_stack_protector=no elif test "x$ssp_global_possible" != xyes; then AC_MSG_ERROR([--enable-stack-protector is not supported (compiler doesn't support -mstack-protector-guard=global)]) else TARGET_CFLAGS="$TARGET_CFLAGS -mstack-protector-guard=global" if test "x$enable_stack_protector" = xyes; then if test "x$ssp_possible" != xyes; then AC_MSG_ERROR([--enable-stack-protector is not supported (compiler doesn't support -fstack-protector)]) fi TARGET_CFLAGS="$TARGET_CFLAGS -fstack-protector" elif test "x$enable_stack_protector" = xstrong; then if test "x$ssp_strong_possible" != xyes; then AC_MSG_ERROR([--enable-stack-protector=strong is not supported (compiler doesn't support -fstack-protector-strong)]) fi TARGET_CFLAGS="$TARGET_CFLAGS -fstack-protector-strong" else # Note, -fstack-protector-all requires that the protector is disabled for # functions that appear in the call stack when the canary is initialized. AC_MSG_ERROR([invalid value $enable_stack_protector for --enable-stack-protector]) fi TARGET_CPPFLAGS="$TARGET_CPPFLAGS -DGRUB_STACK_PROTECTOR=1" if test -n "$SOURCE_DATE_EPOCH"; then GRUB_STACK_PROTECTOR_INIT="0x00f2b7e2$(printf "%x" "$SOURCE_DATE_EPOCH" | sed 's/.*\(........\)$/\1/')" elif test -r /dev/urandom; then # Generate the 8 byte stack protector canary at build time if /dev/urandom # is able to be read. The first byte should be NUL to filter out string # buffer overflow attacks. GRUB_STACK_PROTECTOR_INIT="$($PYTHON -c 'import codecs; rf=open("/dev/urandom", "rb"); print("0x00"+codecs.encode(rf.read(7), "hex").decode("ascii"))')" else # Some hosts may not have a urandom, e.g. Windows, so use statically # generated random bytes GRUB_STACK_PROTECTOR_INIT="0x00f2b7e2f193b25c" fi if test x"$target_m32" = x1 ; then # Make sure that the canary default value is 24-bits by only using the # lower 3 bytes on 32 bit systems. This allows the upper byte to be NUL # to filter out string buffer overflow attacks. GRUB_STACK_PROTECTOR_INIT="0x00$(echo "$GRUB_STACK_PROTECTOR_INIT" | sed 's/.*\(......\)$/\1/')" fi AC_SUBST([GRUB_STACK_PROTECTOR_INIT]) fi CFLAGS="$TARGET_CFLAGS" grub_CHECK_STACK_ARG_PROBE # Cygwin's GCC uses alloca() to probe the stackframe on static # stack allocations above some threshold. if test x"$sap_possible" = xyes; then TARGET_CFLAGS="$TARGET_CFLAGS -mno-stack-arg-probe" fi CFLAGS="$TARGET_CFLAGS" # -mno-unaligned-access -mstrict-align if test "$target_cpu" = arm; then AC_CACHE_CHECK([for compile options to get strict alignment], [grub_cv_target_cc_strict_align], [ grub_cv_target_cc_strict_align= for arg in -mno-unaligned-access "-Xclang -mstrict-align" -mstrict-align; do CFLAGS="$TARGET_CFLAGS $arg -Werror" LDFLAGS="$TARGET_LDFLAGS" AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])], [flag=1], [flag=0]) if test x"$flag" = x1; then grub_cv_target_cc_strict_align="$arg" break fi done]) TARGET_CFLAGS="$TARGET_CFLAGS $grub_cv_target_cc_strict_align" if test x"$grub_cv_target_cc_strict_align" = x"-Xclang -mstrict-align"; then TARGET_LDFLAGS="$TARGET_LDFLAGS -Qunused-arguments" fi AC_CACHE_CHECK([if compiler generates unaligned accesses], [grub_cv_cc_target_emits_unaligned], [CFLAGS="$TARGET_CFLAGS" AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [[ #ifdef __ARM_FEATURE_UNALIGNED #error "unaligned" #endif ]])], [grub_cv_cc_target_emits_unaligned=no], [grub_cv_cc_target_emits_unaligned=yes])]) if test x$grub_cv_cc_target_emits_unaligned = xyes; then AC_MSG_ERROR([compiler generates unaligned accesses]) fi fi # Set them to their new values for the tests below. CC="$TARGET_CC" CPPFLAGS="$TARGET_CPPFLAGS" # Check for libgcc symbols if test x"$platform" = xemu; then CFLAGS="$TARGET_CFLAGS -Wno-error" AC_CHECK_FUNCS(__udivsi3 __umodsi3 __divsi3 __modsi3 __divdi3 __moddi3 __udivdi3 __umoddi3 __ctzdi2 __ctzsi2 __clzdi2 __aeabi_uidiv __aeabi_uidivmod __aeabi_idiv __aeabi_idivmod __aeabi_ulcmp __muldi3 __aeabi_lmul __aeabi_memcpy __aeabi_memcpy4 __aeabi_memcpy8 __aeabi_memclr __aeabi_memclr4 __aeabi_memclr8 __aeabi_memset __aeabi_lasr __aeabi_llsl __aeabi_llsr _restgpr_14_x __ucmpdi2 __ashldi3 __ashrdi3 __lshrdi3 __bswapsi2 __bswapdi2 __bzero __register_frame_info __deregister_frame_info ___chkstk_ms __chkstk_ms) fi if test "x$TARGET_APPLE_LINKER" = x1 ; then CFLAGS="$TARGET_CFLAGS -nostdlib -static" else CFLAGS="$TARGET_CFLAGS -nostdlib" fi LIBS="" # Defined in acinclude.m4. grub_ASM_USCORE grub_PROG_TARGET_CC if test "x$TARGET_APPLE_LINKER" != x1 ; then grub_PROG_OBJCOPY_ABSOLUTE fi grub_PROG_LD_BUILD_ID_NONE if test "x$target_cpu" = xi386; then if test "$platform" != emu && test "x$TARGET_APPLE_LINKER" != x1 ; then if test ! -z "$TARGET_IMG_LDSCRIPT"; then # Check symbols provided by linker script. CFLAGS="$TARGET_CFLAGS -nostdlib ${TARGET_IMG_LDFLAGS_AC} ${TARGET_IMG_BASE_LDOPT},0x8000" fi grub_CHECK_BSS_START_SYMBOL grub_CHECK_END_SYMBOL fi CFLAGS="$TARGET_CFLAGS" fi grub_PROG_NM_WORKS grub_PROG_NM_MINUS_P grub_PROG_NM_DEFINED_ONLY AC_SUBST(TARGET_NMFLAGS_MINUS_P) AC_SUBST(TARGET_NMFLAGS_DEFINED_ONLY) if test "$platform" != emu; then AC_CACHE_CHECK([whether -nostdinc -isystem works], [grub_cv_cc_isystem], [ SAVED_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$TARGET_CPPFLAGS -nostdlib -nostdinc -isystem `$TARGET_CC -print-file-name=include`" AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include #include int va_arg_func (int fixed, va_list args);]], [[]])], [grub_cv_cc_isystem=yes], [grub_cv_cc_isystem=no]) CPPFLAGS="$SAVED_CPPFLAGS" ]) if test x"$grub_cv_cc_isystem" = xyes ; then TARGET_CPPFLAGS="$TARGET_CPPFLAGS -nostdinc -isystem `$TARGET_CC -print-file-name=include`" fi fi AC_CACHE_CHECK([whether -Wtrampolines work], [grub_cv_cc_wtrampolines], [ CFLAGS="$TARGET_CFLAGS -Wtrampolines -Werror" AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include int va_arg_func (int fixed, va_list args);]], [[]])], [grub_cv_cc_wtrampolines=yes], [grub_cv_cc_wtrampolines=no]) ]) if test x"$grub_cv_cc_wtrampolines" = xyes ; then TARGET_CFLAGS="$TARGET_CFLAGS -Wtrampolines" fi # Restore the flags. CC="$tmp_CC" CFLAGS="$tmp_CFLAGS" CPPFLAGS="$tmp_CPPFLAGS" LDFLAGS="$tmp_LDFLAGS" LIBS="$tmp_LIBS" # # Check for options. # # Memory manager debugging. AC_ARG_ENABLE([mm-debug], AS_HELP_STRING([--enable-mm-debug], [include memory manager debugging])) if test x$enable_mm_debug = xyes; then MM_DEBUG=1 else MM_DEBUG=0 fi AC_SUBST([MM_DEBUG]) AM_CONDITIONAL([COND_MM_DEBUG], [test x$MM_DEBUG = x1]) AC_ARG_ENABLE([cache-stats], AS_HELP_STRING([--enable-cache-stats], [enable disk cache statistics collection])) if test x$enable_cache_stats = xyes; then DISK_CACHE_STATS=1 else DISK_CACHE_STATS=0 fi AC_SUBST([DISK_CACHE_STATS]) AC_ARG_ENABLE([boot-time], AS_HELP_STRING([--enable-boot-time], [enable boot time statistics collection])) if test x$enable_boot_time = xyes; then BOOT_TIME_STATS=1 else BOOT_TIME_STATS=0 fi AC_SUBST([BOOT_TIME_STATS]) AC_ARG_ENABLE([grub-emu-sdl2], [AS_HELP_STRING([--enable-grub-emu-sdl2], [build and install the `grub-emu' debugging utility with SDL2 support (default=guessed)])]) AC_ARG_ENABLE([grub-emu-sdl], [AS_HELP_STRING([--enable-grub-emu-sdl], [build and install the `grub-emu' debugging utility with SDL support (default=guessed)])]) AC_ARG_ENABLE([grub-emu-pci], [AS_HELP_STRING([--enable-grub-emu-pci], [build and install the `grub-emu' debugging utility with PCI support (potentially dangerous) (default=no)])]) if test "$platform" = emu; then if test x"$enable_grub_emu_sdl2" = xno ; then grub_emu_sdl2_excuse="explicitly disabled" fi [if [ x"$grub_emu_sdl2_excuse" = x ]; then # Check for libSDL libraries.] PKG_CHECK_MODULES([SDL2], [sdl2], [ AC_DEFINE([HAVE_SDL2], [1], [Define to 1 if you have SDL2 library.]) AC_SUBST(HAVE_SDL2)], [grub_emu_sdl2_excuse="libSDL2 libraries are required to build \`grub-emu' with SDL2 support"]) [fi] if test x"$enable_grub_emu_sdl2" = xyes && test x"$grub_emu_sdl2_excuse" != x ; then AC_MSG_ERROR([SDL2 support for grub-emu was explicitly requested but can't be compiled ($grub_emu_sdl2_excuse)]) fi if test x"$grub_emu_sdl2_excuse" = x ; then enable_grub_emu_sdl2=yes else enable_grub_emu_sdl2=no fi if test x"$enable_grub_emu_sdl2" = xyes ; then grub_emu_sdl_excuse="disabled by sdl2" fi if test x"$enable_grub_emu_sdl" = xno ; then grub_emu_sdl_excuse="explicitly disabled" fi [if [ x"$grub_emu_sdl_excuse" = x ]; then # Check for libSDL libraries.] AC_CHECK_LIB([SDL], [SDL_Init], [LIBSDL="-lSDL"], [grub_emu_sdl_excuse=["libSDL libraries are required to build \`grub-emu' with SDL support"]]) AC_SUBST([LIBSDL]) [fi] [if [ x"$grub_emu_sdl_excuse" = x ]; then # Check for headers.] AC_CHECK_HEADERS([SDL/SDL.h], [], [grub_emu_sdl_excuse=["libSDL header file is required to build \`grub-emu' with SDL support"]]) [fi] if test x"$enable_grub_emu_sdl" = xyes && test x"$grub_emu_sdl_excuse" != x ; then AC_MSG_ERROR([SDL support for grub-emu was explicitly requested but can't be compiled ($grub_emu_sdl_excuse)]) fi if test x"$grub_emu_sdl_excuse" = x ; then enable_grub_emu_sdl=yes else enable_grub_emu_sdl=no fi if test x"$enable_grub_emu_pci" != xyes ; then grub_emu_pci_excuse="not enabled" fi [if [ x"$grub_emu_pci_excuse" = x ]; then # Check for libpci libraries.] AC_CHECK_LIB([pciaccess], [pci_system_init], [LIBPCIACCESS="-lpciaccess"], [grub_emu_pci_excuse=["need libpciaccess library"]]) AC_SUBST([LIBPCIACCESS]) [fi] [if [ x"$grub_emu_pci_excuse" = x ]; then # Check for headers.] AC_CHECK_HEADERS([pciaccess.h], [], [grub_emu_pci_excuse=["need libpciaccess headers"]]) [fi] if test x"$grub_emu_pci_excuse" = x ; then enable_grub_emu_pci=yes else enable_grub_emu_pci=no fi AC_SUBST([enable_grub_emu_sdl2]) AC_SUBST([enable_grub_emu_sdl]) AC_SUBST([enable_grub_emu_pci]) else # Ignore --enable-emu-* if platform is not emu enable_grub_emu_sdl2=no enable_grub_emu_sdl=no enable_grub_emu_pci=no fi AC_ARG_ENABLE([grub-mkfont], [AS_HELP_STRING([--enable-grub-mkfont], [build and install the `grub-mkfont' utility (default=guessed)])]) if test x"$enable_grub_mkfont" = xno ; then grub_mkfont_excuse="explicitly disabled" fi unset ac_cv_header_ft2build_h if test x"$grub_mkfont_excuse" = x ; then # Check for freetype libraries. PKG_CHECK_MODULES([FREETYPE], [freetype2], [ SAVED_CPPFLAGS="$CPPFLAGS" SAVED_LIBS="$LIBS" CPPFLAGS="$CPPFLAGS $FREETYPE_CFLAGS" LIBS="$LIBS $FREETYPE_LIBS" AC_CHECK_HEADERS([ft2build.h], [], [grub_mkfont_excuse=["need freetype2 headers"]]) AC_LINK_IFELSE([AC_LANG_CALL([], [FT_Load_Glyph])], [], [grub_mkfont_excuse=["freetype2 library unusable"]]) CPPFLAGS="$SAVED_CPPFLAGS" LIBS="$SAVED_LIBS" ], [grub_mkfont_excuse=["need freetype2 library"]]) if test x"$grub_mkfont_excuse" = x && test x"$host_kernel" = xnetbsd ; then FREETYPE_LIBS="$FREETYPE_LIBS -Wl,-R,/usr/pkg/lib" ; fi fi if test x"$enable_grub_mkfont" = xyes && test x"$grub_mkfont_excuse" != x ; then AC_MSG_ERROR([grub-mkfont was explicitly requested but can't be compiled ($grub_mkfont_excuse)]) fi if test x"$grub_mkfont_excuse" = x ; then enable_grub_mkfont=yes else enable_grub_mkfont=no fi AC_SUBST([enable_grub_mkfont]) SAVED_CC="$CC" SAVED_CPP="$CPP" SAVED_CFLAGS="$CFLAGS" SAVED_CPPFLAGS="$CPPFLAGS" SAVED_LDFLAGS="$LDFLAGS" CC="$BUILD_CC" CPP="$BUILD_CPP" CFLAGS="$BUILD_CFLAGS" CPPFLAGS="$BUILD_CPPFLAGS" LDFLAGS="$BUILD_LDFLAGS" unset ac_cv_c_bigendian unset ac_cv_header_ft2build_h AC_COMPUTE_INT([BUILD_SIZEOF_VOID_P], [sizeof (void *)]) AC_COMPUTE_INT([BUILD_SIZEOF_LONG], [sizeof (long)]) AC_C_BIGENDIAN([BUILD_WORDS_BIGENDIAN=1], [BUILD_WORDS_BIGENDIAN=0], [BUILD_WORDS_BIGENDIAN=err], [BUILD_WORDS_BIGENDIAN=err]) if test x$BUILD_WORDS_BIGENDIAN = xerr ; then AC_MSG_ERROR([couldnt determine build endianness]) fi AC_SUBST([BUILD_SIZEOF_LONG]) AC_SUBST([BUILD_SIZEOF_VOID_P]) AC_SUBST([BUILD_WORDS_BIGENDIAN]) if test x"$grub_build_mkfont_excuse" = x ; then # Check for freetype libraries. SAVED_PKG_CONFIG="$PKG_CONFIG" test -z "$BUILD_PKG_CONFIG" || PKG_CONFIG="$BUILD_PKG_CONFIG" PKG_CHECK_MODULES([BUILD_FREETYPE], [freetype2], [ SAVED_CPPFLAGS_2="$CPPFLAGS" SAVED_LIBS="$LIBS" CPPFLAGS="$CPPFLAGS $BUILD_FREETYPE_CFLAGS" LIBS="$LIBS $BUILD_FREETYPE_LIBS" AC_CHECK_HEADERS([ft2build.h], [], [grub_build_mkfont_excuse=["need freetype2 headers"]]) AC_LINK_IFELSE([AC_LANG_CALL([], [FT_Load_Glyph])], [], [grub_build_mkfont_excuse=["freetype2 library unusable"]]) LIBS="$SAVED_LIBS" CPPFLAGS="$SAVED_CPPFLAGS_2" ], [grub_build_mkfont_excuse=["need freetype2 library"]]) if test x"$grub_build_mkfont_excuse" = x ; then case x"$build_os" in xnetbsd*) BUILD_FREETYPE_LIBS="$BUILD_FREETYPE_LIBS -Wl,-R,/usr/pkg/lib" ;; esac fi PKG_CONFIG="$SAVED_PKG_CONFIG" fi if test x"$enable_build_grub_mkfont" = xyes && test x"$grub_build_mkfont_excuse" != x ; then AC_MSG_ERROR([build-grub-mkfont was explicitly requested but can't be compiled ($grub_build_mkfont_excuse)]) fi if test x"$grub_build_mkfont_excuse" = x ; then enable_build_grub_mkfont=yes else enable_build_grub_mkfont=no fi if test x"$enable_build_grub_mkfont" = xno && ( test "x$platform" = xqemu || test "x$platform" = xloongson || test "x$platform" = xqemu_mips || test "x$platform" = xcoreboot ); then if test x"$grub_build_mkfont_excuse" = x ; then AC_MSG_ERROR([qemu, coreboot and loongson ports need build-time grub-mkfont]) else AC_MSG_ERROR([qemu, coreboot and loongson ports need build-time grub-mkfont ($grub_build_mkfont_excuse)]) fi fi CC="$SAVED_CC" CPP="$SAVED_CPP" CFLAGS="$SAVED_CFLAGS" CPPFLAGS="$SAVED_CPPFLAGS" LDFLAGS="$SAVED_LDFLAGS" starfield_excuse= AC_ARG_ENABLE([grub-themes], [AS_HELP_STRING([--enable-grub-themes], [build and install GRUB themes (default=guessed)])]) if test x"$enable_grub_themes" = xno ; then starfield_excuse="explicitly disabled" fi if test x"$starfield_excuse" = x && test x"$enable_build_grub_mkfont" = xno ; then starfield_excuse="No build-time grub-mkfont" fi AC_ARG_WITH([dejavufont], AS_HELP_STRING([--with-dejavufont=FILE], [set the DejeVu source [[guessed]]])) if test "x$with_dejavufont" = x; then # search in well-known directories if test x"$starfield_excuse" = x; then for ext in pcf pcf.gz bdf bdf.gz ttf ttf.gz; do for dir in . /usr/src /usr/share/fonts/X11/misc /usr/share/fonts/truetype/ttf-dejavu /usr/share/fonts/dejavu /usr/share/fonts/truetype /usr/pkg/share/fonts/X11/TTF /usr/local/share/fonts/dejavu /usr/X11R6/lib/X11/fonts/TTF /usr/share/fonts/dejavu-sans-fonts /usr/share/fonts/truetype/dejavu; do if test -f "$dir/DejaVuSans.$ext"; then DJVU_FONT_SOURCE="$dir/DejaVuSans.$ext" break 2 fi done done if test "x$DJVU_FONT_SOURCE" = x; then starfield_excuse="No DejaVu found" fi fi else DJVU_FONT_SOURCE="$with_dejavufont" fi if test x"$enable_grub_themes" = xyes && test x"$starfield_excuse" != x; then AC_MSG_ERROR([themes were explicitly requested but requirements are not satisfied ($starfield_excuse)]) fi AC_SUBST([DJVU_FONT_SOURCE]) AC_ARG_WITH([unifont], AS_HELP_STRING([--with-unifont=FILE], [set the unifont source [[guessed]]])) if test "x$with_unifont" = x; then # search in well-known directories for ext in pcf pcf.gz bdf bdf.gz ttf ttf.gz otf otf.gz; do for dir in . /usr/src /usr/share/fonts/X11/misc /usr/share/fonts/unifont /usr/share/fonts/uni /usr/share/fonts/truetype/unifont /usr/share/fonts/misc /usr/pkg/share/fonts/X11/misc /usr/local/share/fonts/gnu-unifont /usr/local/share/fonts/unifont; do if test -f "$dir/unifont.$ext"; then md5="$(md5sum "$dir/unifont.$ext"|awk '{ print $1; }')" # PCF and BDF from version 6.3 isn't hanled properly by libfreetype. if test "$md5" = 0a54834d2788c83886a3e1785a6a1e61 || test "$md5" = 28f2565c7a41d8d407e2551159385edb || test "$md5" = dae5e588461b3b92b87b6ffee734f936 || test "$md5" = 4a3d687aa5bb329ed05f4263a1016791 ; then continue fi FONT_SOURCE="$dir/unifont.$ext" break 2 fi done done else FONT_SOURCE="$with_unifont" fi if test x"$enable_build_grub_mkfont" = xno ; then FONT_SOURCE= fi if test "x$FONT_SOURCE" = x && ( test "x$platform" = xqemu || test "x$platform" = xloongson || test "x$platform" = xqemu_mips || test "x$platform" = xcoreboot ); then if test x"$grub_build_mkfont_excuse" = x ; then AC_MSG_ERROR([qemu, coreboot and loongson ports need unifont]) else AC_MSG_ERROR([qemu, coreboot and loongson ports need unifont ($grub_build_mkfont_excuse)]) fi fi AC_SUBST([FONT_SOURCE]) if test x"$FONT_SOURCE" = x && test x"$DJVU_FONT_SOURCE" = x && test x"$grub_build_mkfont_excuse" = x; then grub_build_mkfont_excuse="no fonts" fi AC_ARG_ENABLE([grub-mount], [AS_HELP_STRING([--enable-grub-mount], [build and install the `grub-mount' utility (default=guessed)])]) if test x"$enable_grub_mount" = xno ; then grub_mount_excuse="explicitly disabled" fi if test x"$grub_mount_excuse" = x ; then PKG_CHECK_MODULES([FUSE], [fuse3], [FUSE_CFLAGS="$FUSE_CFLAGS -DFUSE_USE_VERSION=32"], [ PKG_CHECK_MODULES([FUSE], [fuse], [FUSE_CFLAGS="$FUSE_CFLAGS -DFUSE_USE_VERSION=26"], [ grub_mount_excuse="need fuse or fuse3 libraries" ]) ]) fi if test x"$enable_grub_mount" = xyes && test x"$grub_mount_excuse" != x ; then AC_MSG_ERROR([grub-mount was explicitly requested but can't be compiled ($grub_mount_excuse)]) fi if test x"$grub_mount_excuse" = x ; then enable_grub_mount=yes else enable_grub_mount=no fi AC_SUBST([enable_grub_mount]) AC_ARG_ENABLE([device-mapper], [AS_HELP_STRING([--enable-device-mapper], [enable Linux device-mapper support (default=guessed)])]) if test x"$enable_device_mapper" = xno ; then device_mapper_excuse="explicitly disabled" fi if test x"$device_mapper_excuse" = x ; then # Check for device-mapper header. AC_CHECK_HEADER([libdevmapper.h], [], [device_mapper_excuse="need libdevmapper header"]) fi if test x"$device_mapper_excuse" = x ; then # Check for device-mapper library. AC_CHECK_LIB([devmapper], [dm_task_create], [], [device_mapper_excuse="need devmapper library"]) fi if test x"$device_mapper_excuse" = x ; then # Check for device-mapper library. AC_CHECK_LIB([devmapper], [dm_log_with_errno_init], [], [device_mapper_excuse="need devmapper library"]) fi if test x"$device_mapper_excuse" = x ; then LIBDEVMAPPER="-ldevmapper" AC_DEFINE([HAVE_DEVICE_MAPPER], [1], [Define to 1 if you have the devmapper library.]) fi AC_SUBST([LIBDEVMAPPER]) LIBGEOM= if test x$host_kernel = xkfreebsd; then AC_CHECK_LIB([geom], [geom_gettree], [], [AC_MSG_ERROR([Your platform requires libgeom])]) LIBGEOM="-lgeom" fi AC_SUBST([LIBGEOM]) AC_ARG_ENABLE([liblzma], [AS_HELP_STRING([--enable-liblzma], [enable liblzma integration (default=guessed)])]) if test x"$enable_liblzma" = xno ; then liblzma_excuse="explicitly disabled" fi if test x"$liblzma_excuse" = x ; then AC_CHECK_LIB([lzma], [lzma_code], [],[liblzma_excuse="need lzma library"]) fi if test x"$liblzma_excuse" = x ; then AC_CHECK_HEADER([lzma.h], [], [liblzma_excuse="need lzma header"]) fi if test x"$enable_liblzma" = xyes && test x"$liblzma_excuse" != x ; then AC_MSG_ERROR([liblzma support was explicitly requested but requirements are not satisfied ($liblzma_excuse)]) fi if test x"$liblzma_excuse" = x ; then LIBLZMA="-llzma" AC_DEFINE([USE_LIBLZMA], [1], [Define to 1 if you have the LZMA library.]) fi AC_SUBST([LIBLZMA]) AC_ARG_ENABLE([libzfs], [AS_HELP_STRING([--enable-libzfs], [enable libzfs integration (default=guessed)])]) if test x"$enable_libzfs" = xno ; then libzfs_excuse="explicitly disabled" fi if test x"$libzfs_excuse" = x ; then # Only check for system headers if libzfs support has not been disabled. AC_CHECK_HEADERS(libzfs.h libnvpair.h) fi if test x"$libzfs_excuse" = x ; then AC_CHECK_LIB([zfs], [libzfs_init], [], [libzfs_excuse="need zfs library"]) fi if test x"$libzfs_excuse" = x ; then AC_CHECK_LIB([nvpair], [nvlist_lookup_string], [have_normal_nvpair=yes], [have_normal_nvpair=no]) if test x"$have_normal_nvpair" = xno ; then AC_CHECK_LIB([nvpair], [opensolaris_nvlist_lookup_string], [have_prefixed_nvpair=yes], [have_prefixed_nvpair=no]) if test x"$have_prefixed_nvpair" = xyes ; then AC_DEFINE([GRUB_UTIL_NVPAIR_IS_PREFIXED], [1], [Define to 1 if libnvpair symbols are prefixed with opensolaris_.]) else libzfs_excuse="need nvpair library" fi fi fi if test x"$enable_libzfs" = xyes && test x"$libzfs_excuse" != x ; then AC_MSG_ERROR([libzfs support was explicitly requested but requirements are not satisfied ($libzfs_excuse)]) fi if test x"$libzfs_excuse" = x ; then # We need both libzfs and libnvpair for a successful build. LIBZFS="-lzfs" LIBNVPAIR="-lnvpair" AC_DEFINE([USE_LIBZFS], [1], [Define to 1 if ZFS library should be used.]) fi AC_SUBST([LIBZFS]) AC_SUBST([LIBNVPAIR]) AC_ARG_ENABLE([grub-protect], [AS_HELP_STRING([--enable-grub-protect], [build and install the `grub-protect' utility (default=guessed)])]) if test x"$enable_grub_protect" = xno ; then grub_protect_excuse="explicitly disabled" fi LIBTASN1= if test x"$grub_protect_excuse" = x ; then AC_CHECK_LIB([tasn1], [asn1_write_value], [LIBTASN1="-ltasn1"], [grub_protect_excuse="need libtasn1 library"]) fi AC_SUBST([LIBTASN1]) if test x"$enable_grub_protect" = xyes && test x"$grub_protect_excuse" != x ; then AC_MSG_ERROR([grub-protect was explicitly requested but can't be compiled ($grub_protect_excuse)]) fi if test x"$grub_protect_excuse" = x ; then enable_grub_protect=yes else enable_grub_protect=no fi AC_SUBST([enable_grub_protect]) LIBS="" AC_SUBST([FONT_SOURCE]) AS_IF([test x$target_cpu = xi386 -a x$platform = xqemu], [AC_SUBST([GRUB_BOOT_MACHINE_LINK_ADDR], 0xffe00)]) AC_SUBST(HAVE_ASM_USCORE) AC_SUBST(BSS_START_SYMBOL) AC_SUBST(END_SYMBOL) AC_SUBST(PACKAGE) AC_SUBST(VERSION) AC_ARG_ENABLE([werror], [AS_HELP_STRING([--disable-werror], [do not use -Werror when building GRUB])]) if test x"$enable_werror" != xno ; then TARGET_CFLAGS="$TARGET_CFLAGS -Werror" HOST_CFLAGS="$HOST_CFLAGS -Werror" if test "x$grub_cv_cc_target_clang" = xyes; then TARGET_CFLAGS="$TARGET_CFLAGS -Wno-error=vla" HOST_CFLAGS="$HOST_CFLAGS -Wno-error=vla" fi fi TARGET_CPP="$TARGET_CC -E" TARGET_CCAS=$TARGET_CC # Includes which include make-time substitutions. They must come last # as to avoid executing top_builddir in shell. HOST_CPPFLAGS="$HOST_CPPFLAGS -I\$(top_builddir)/include" TARGET_CPPFLAGS="$TARGET_CPPFLAGS -I\$(top_srcdir)/include" TARGET_CPPFLAGS="$TARGET_CPPFLAGS -I\$(top_builddir)/include" GRUB_TARGET_CPU="${target_cpu}" GRUB_PLATFORM="${platform}" AC_SUBST(GRUB_TARGET_CPU) AC_SUBST(GRUB_PLATFORM) AC_SUBST(TARGET_OBJCONV) AC_SUBST(TARGET_CPP) AC_SUBST(TARGET_CCAS) AC_SUBST(TARGET_OBJ2ELF) AC_SUBST(TARGET_MODULE_FORMAT) AC_SUBST(TARGET_CC_VERSION) AC_SUBST(TARGET_CFLAGS) AC_SUBST(TARGET_LDFLAGS) AC_SUBST(TARGET_CPPFLAGS) AC_SUBST(TARGET_CCASFLAGS) AC_SUBST(TARGET_IMG_LDFLAGS) AC_SUBST(TARGET_IMG_CFLAGS) AC_SUBST(TARGET_IMG_BASE_LDOPT) AC_SUBST(TARGET_APPLE_LINKER) AC_SUBST(HOST_CFLAGS) AC_SUBST(HOST_LDFLAGS) AC_SUBST(HOST_CPPFLAGS) AC_SUBST(HOST_CCASFLAGS) AC_SUBST(BUILD_LIBM) # # Automake conditionals # AM_CONDITIONAL([COND_real_platform], [test x$platform != xnone]) AM_CONDITIONAL([COND_emu], [test x$platform = xemu]) AM_CONDITIONAL([COND_arm], [test x$target_cpu = xarm ]) AM_CONDITIONAL([COND_arm_uboot], [test x$target_cpu = xarm -a x$platform = xuboot]) AM_CONDITIONAL([COND_arm_coreboot], [test x$target_cpu = xarm -a x$platform = xcoreboot]) AM_CONDITIONAL([COND_arm_efi], [test x$target_cpu = xarm -a x$platform = xefi]) AM_CONDITIONAL([COND_arm64], [test x$target_cpu = xarm64 ]) AM_CONDITIONAL([COND_arm64_efi], [test x$target_cpu = xarm64 -a x$platform = xefi]) AM_CONDITIONAL([COND_ia64_efi], [test x$target_cpu = xia64 -a x$platform = xefi]) AM_CONDITIONAL([COND_i386_pc], [test x$target_cpu = xi386 -a x$platform = xpc]) AM_CONDITIONAL([COND_i386_efi], [test x$target_cpu = xi386 -a x$platform = xefi]) AM_CONDITIONAL([COND_i386_qemu], [test x$target_cpu = xi386 -a x$platform = xqemu]) AM_CONDITIONAL([COND_i386_ieee1275], [test x$target_cpu = xi386 -a x$platform = xieee1275]) AM_CONDITIONAL([COND_i386_coreboot], [test x$target_cpu = xi386 -a x$platform = xcoreboot]) AM_CONDITIONAL([COND_i386_multiboot], [test x$target_cpu = xi386 -a x$platform = xmultiboot]) AM_CONDITIONAL([COND_i386_xen], [test x$target_cpu = xi386 -a x$platform = xxen]) AM_CONDITIONAL([COND_i386_xen_pvh], [test x$target_cpu = xi386 -a x$platform = xxen_pvh]) AM_CONDITIONAL([COND_loongarch64], [test x$target_cpu = xloongarch64]) AM_CONDITIONAL([COND_loongarch64_efi], [test x$target_cpu = xloongarch64 -a x$platform = xefi]) AM_CONDITIONAL([COND_mips], [test x$target_cpu = xmips -o x$target_cpu = xmipsel]) AM_CONDITIONAL([COND_mips_arc], [test "(" x$target_cpu = xmips -o x$target_cpu = xmipsel ")" -a x$platform = xarc]) AM_CONDITIONAL([COND_mips_loongson], [test x$target_cpu = xmipsel -a x$platform = xloongson]) AM_CONDITIONAL([COND_mips_qemu_mips], [test "(" x$target_cpu = xmips -o x$target_cpu = xmipsel ")" -a x$platform = xqemu_mips]) AM_CONDITIONAL([COND_mipsel], [test x$target_cpu = xmipsel]) AM_CONDITIONAL([COND_mipseb], [test x$target_cpu = xmips]) AM_CONDITIONAL([COND_powerpc_ieee1275], [test x$target_cpu = xpowerpc -a x$platform = xieee1275]) AM_CONDITIONAL([COND_riscv32], [test x$target_cpu = xriscv32 ]) AM_CONDITIONAL([COND_riscv64], [test x$target_cpu = xriscv64 ]) AM_CONDITIONAL([COND_riscv32_efi], [test x$target_cpu = xriscv32 -a x$platform = xefi]) AM_CONDITIONAL([COND_riscv64_efi], [test x$target_cpu = xriscv64 -a x$platform = xefi]) AM_CONDITIONAL([COND_sparc64_ieee1275], [test x$target_cpu = xsparc64 -a x$platform = xieee1275]) AM_CONDITIONAL([COND_sparc64_emu], [test x$target_cpu = xsparc64 -a x$platform = xemu]) AM_CONDITIONAL([COND_x86_64_efi], [test x$target_cpu = xx86_64 -a x$platform = xefi]) AM_CONDITIONAL([COND_x86_64_xen], [test x$target_cpu = xx86_64 -a x$platform = xxen]) AM_CONDITIONAL([COND_HOST_HURD], [test x$host_kernel = xhurd]) AM_CONDITIONAL([COND_HOST_LINUX], [test x$host_kernel = xlinux]) AM_CONDITIONAL([COND_HOST_NETBSD], [test x$host_kernel = xnetbsd]) AM_CONDITIONAL([COND_HOST_WINDOWS], [test x$host_kernel = xwindows]) AM_CONDITIONAL([COND_HOST_KFREEBSD], [test x$host_kernel = xkfreebsd]) AM_CONDITIONAL([COND_HOST_XNU], [test x$host_kernel = xxnu]) AM_CONDITIONAL([COND_HOST_ILLUMOS], [test x$host_kernel = xillumos]) AM_CONDITIONAL([COND_MAN_PAGES], [test x$cross_compiling = xno -a x$HELP2MAN != x]) AM_CONDITIONAL([COND_GRUB_EMU_SDL2], [test x$enable_grub_emu_sdl2 = xyes]) AM_CONDITIONAL([COND_GRUB_EMU_SDL], [test x$enable_grub_emu_sdl = xyes]) AM_CONDITIONAL([COND_GRUB_EMU_PCI], [test x$enable_grub_emu_pci = xyes]) AM_CONDITIONAL([COND_GRUB_MKFONT], [test x$enable_grub_mkfont = xyes]) AM_CONDITIONAL([COND_GRUB_MOUNT], [test x$enable_grub_mount = xyes]) AM_CONDITIONAL([COND_GRUB_PROTECT], [test x$enable_grub_protect = xyes]) AM_CONDITIONAL([COND_HAVE_FONT_SOURCE], [test x$FONT_SOURCE != x]) if test x$FONT_SOURCE != x ; then HAVE_FONT_SOURCE=1 else HAVE_FONT_SOURCE=0 fi AC_SUBST(HAVE_FONT_SOURCE) AM_CONDITIONAL([COND_APPLE_LINKER], [test x$TARGET_APPLE_LINKER = x1]) AM_CONDITIONAL([COND_ENABLE_EFIEMU], [test x$enable_efiemu = xyes]) AM_CONDITIONAL([COND_ENABLE_CACHE_STATS], [test x$DISK_CACHE_STATS = x1]) AM_CONDITIONAL([COND_ENABLE_BOOT_TIME_STATS], [test x$BOOT_TIME_STATS = x1]) AM_CONDITIONAL([COND_HAVE_CXX], [test x$HAVE_CXX = xyes]) AM_CONDITIONAL([COND_HAVE_ASM_USCORE], [test x$HAVE_ASM_USCORE = x1]) AM_CONDITIONAL([COND_STARFIELD], [test "x$starfield_excuse" = x]) AM_CONDITIONAL([COND_HAVE_EXEC], [test "x$have_exec" = xy]) AM_CONDITIONAL([COND_HAVE_PCI], [test "x$have_pci" = xy]) test "x$prefix" = xNONE && prefix="$ac_default_prefix" test "x$exec_prefix" = xNONE && exec_prefix="${prefix}" datarootdir="$(eval echo "$datarootdir")" grub_libdir="$(eval echo "$libdir")" grub_localedir="$(eval echo "$localedir")" grub_datadir="$(eval echo "$datadir")" grub_sysconfdir="$(eval echo "$sysconfdir")" AC_DEFINE_UNQUOTED(LOCALEDIR, "$grub_localedir", [Locale dir]) AC_DEFINE_UNQUOTED(GRUB_LIBDIR, "$grub_libdir", [Library dir]) AC_DEFINE_UNQUOTED(GRUB_DATADIR, "$grub_datadir", [Data dir]) AC_DEFINE_UNQUOTED(GRUB_SYSCONFDIR, "$grub_sysconfdir", [Configuration dir]) # Output files. if test "$platform" != none; then cpudir="${target_cpu}" if test x${cpudir} = xmipsel; then cpudir=mips; fi grub_CHECK_LINK_DIR if test x"$link_dir" = xyes ; then AC_CONFIG_LINKS([include/grub/cpu:include/grub/$cpudir]) if test "$platform" != emu ; then AC_CONFIG_LINKS([include/grub/machine:include/grub/$cpudir/$platform]) fi else mkdir -p include/grub 2>/dev/null rm -rf include/grub/cpu cp -rp $srcdir/include/grub/$cpudir include/grub/cpu 2>/dev/null if test "$platform" != emu ; then rm -rf include/grub/machine cp -rp $srcdir/include/grub/$cpudir/$platform include/grub/machine 2>/dev/null fi fi else # Just enough to stop the compiler failing with -I$(srcdir)/include. mkdir -p include 2>/dev/null rm -rf include/grub/cpu include/grub/machine fi AC_CONFIG_FILES([Makefile]) AC_CONFIG_FILES([grub-core/Makefile]) AC_CONFIG_FILES([grub-core/lib/gnulib/Makefile]) AC_CONFIG_FILES([po/Makefile.in]) AC_CONFIG_FILES([docs/Makefile]) AC_CONFIG_FILES([util/bash-completion.d/Makefile]) AC_CONFIG_FILES([stamp-h], [echo timestamp > stamp-h]) AC_CONFIG_FILES([config.h]) AC_OUTPUT [ echo "*******************************************************" echo GRUB2 will be compiled with following components: echo Platform: "$target_cpu"-"$platform" if [ x"$platform" = xemu ]; then if [ x"$grub_emu_sdl2_excuse" = x ]; then echo SDL2 support for grub-emu: Yes else echo SDL2 support for grub-emu: No "($grub_emu_sdl2_excuse)" fi if [ x"$grub_emu_sdl_excuse" = x ]; then echo SDL support for grub-emu: Yes else echo SDL support for grub-emu: No "($grub_emu_sdl_excuse)" fi if [ x"$grub_emu_pci_excuse" = x ]; then echo PCI support for grub-emu: Yes else echo PCI support for grub-emu: No "($grub_emu_pci_excuse)" fi fi if test x"$device_mapper_excuse" = x ; then echo With devmapper support: Yes else echo With devmapper support: No "($device_mapper_excuse)" fi if [ x"$enable_mm_debug" = xyes ]; then echo With memory debugging: Yes else echo With memory debugging: No fi if [ x"$enable_cache_stats" = xyes ]; then echo With disk cache statistics: Yes else echo With disk cache statistics: No fi if [ x"$enable_boot_time" = xyes ]; then echo With boot time statistics: Yes else echo With boot time statistics: No fi if [ x"$efiemu_excuse" = x ]; then echo efiemu runtime: Yes else echo efiemu runtime: No "($efiemu_excuse)" fi if [ x"$grub_mkfont_excuse" = x ]; then echo grub-mkfont: Yes else echo grub-mkfont: No "($grub_mkfont_excuse)" fi if [ x"$grub_mount_excuse" = x ]; then echo grub-mount: Yes else echo grub-mount: No "($grub_mount_excuse)" fi if [ x"$grub_protect_excuse" = x ]; then echo grub-protect: Yes else echo grub-protect: No "($grub_protect_excuse)" fi if [ x"$starfield_excuse" = x ]; then echo starfield theme: Yes echo With DejaVuSans font from $DJVU_FONT_SOURCE else echo starfield theme: No "($starfield_excuse)" fi if [ x"$libzfs_excuse" = x ]; then echo With libzfs support: Yes else echo With libzfs support: No "($libzfs_excuse)" fi if [ x"$grub_build_mkfont_excuse" = x ]; then echo Build-time grub-mkfont: Yes if test "x$FONT_SOURCE" = x ; then echo "Without unifont" else echo "With unifont from $FONT_SOURCE" fi else echo Build-time grub-mkfont: No "($grub_build_mkfont_excuse)" echo "Without unifont (no build-time grub-mkfont)" fi if test x"$liblzma_excuse" != x ; then echo "Without liblzma (no support for XZ-compressed mips images) ($liblzma_excuse)" else echo "With liblzma from $LIBLZMA (support for XZ-compressed mips images)" fi if test "x$enable_stack_protector" != xno; then echo "With stack smashing protector: Yes" else echo "With stack smashing protector: No" fi echo "*******************************************************" ] grub-2.14~git20250718.0e36779/build-aux/0000755000175000017500000000000015036452574013763 500000000000000grub-2.14~git20250718.0e36779/build-aux/gitlog-to-changelog0000755000175000017500000004026015036447601017460 00000000000000#!/bin/sh #! -*-perl-*- # Convert git log output to ChangeLog format. # Copyright (C) 2008-2022 Free Software Foundation, Inc. # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # Written by Jim Meyering # This is a prologue that allows to run a perl script as an executable # on systems that are compliant to a POSIX version before POSIX:2017. # On such systems, the usual invocation of an executable through execlp() # or execvp() fails with ENOEXEC if it is a script that does not start # with a #! line. The script interpreter mentioned in the #! line has # to be /bin/sh, because on GuixSD systems that is the only program that # has a fixed file name. The second line is essential for perl and is # also useful for editing this file in Emacs. The next two lines below # are valid code in both sh and perl. When executed by sh, they re-execute # the script through the perl program found in $PATH. The '-x' option # is essential as well; without it, perl would re-execute the script # through /bin/sh. When executed by perl, the next two lines are a no-op. eval 'exec perl -wSx "$0" "$@"' if 0; my $VERSION = '2022-01-27 18:49'; # UTC # The definition above must lie within the first 8 lines in order # for the Emacs time-stamp write hook (at end) to update it. # If you change this file with Emacs, please let the write hook # do its job. Otherwise, update this string manually. use strict; use warnings; use Getopt::Long; use POSIX qw(strftime); (my $ME = $0) =~ s|.*/||; # use File::Coda; # https://meyering.net/code/Coda/ END { defined fileno STDOUT or return; close STDOUT and return; warn "$ME: failed to close standard output: $!\n"; $? ||= 1; } sub usage ($) { my ($exit_code) = @_; my $STREAM = ($exit_code == 0 ? *STDOUT : *STDERR); if ($exit_code != 0) { print $STREAM "Try '$ME --help' for more information.\n"; } else { print $STREAM < ChangeLog $ME -- -n 5 foo > last-5-commits-to-branch-foo SPECIAL SYNTAX: The following types of strings are interpreted specially when they appear at the beginning of a log message line. They are not copied to the output. Copyright-paperwork-exempt: Yes Append the "(tiny change)" notation to the usual "date name email" ChangeLog header to mark a change that does not require a copyright assignment. Co-authored-by: Joe User List the specified name and email address on a second ChangeLog header, denoting a co-author. Signed-off-by: Joe User These lines are simply elided. In a FILE specified via --amend, comment lines (starting with "#") are ignored. FILE must consist of pairs where SHA is a 40-byte SHA1 (alone on a line) referring to a commit in the current project, and CODE refers to one or more consecutive lines of Perl code. Pairs must be separated by one or more blank line. Here is sample input for use with --amend=FILE, from coreutils: 3a169f4c5d9159283548178668d2fae6fced3030 # fix typo in title: s/all tile types/all file types/ 1379ed974f1fa39b12e2ffab18b3f7a607082202 # Due to a bug in vc-dwim, I mis-attributed a patch by Paul to myself. # Change the author to be Paul. Note the escaped "@": s,Jim .*>,Paul Eggert , EOF } exit $exit_code; } # If the string $S is a well-behaved file name, simply return it. # If it contains white space, quotes, etc., quote it, and return the new string. sub shell_quote($) { my ($s) = @_; if ($s =~ m![^\w+/.,-]!) { # Convert each single quote to '\'' $s =~ s/\'/\'\\\'\'/g; # Then single quote the string. $s = "'$s'"; } return $s; } sub quoted_cmd(@) { return join (' ', map {shell_quote $_} @_); } # Parse file F. # Comment lines (starting with "#") are ignored. # F must consist of pairs where SHA is a 40-byte SHA1 # (alone on a line) referring to a commit in the current project, and # CODE refers to one or more consecutive lines of Perl code. # Pairs must be separated by one or more blank line. sub parse_amend_file($) { my ($f) = @_; open F, '<', $f or die "$ME: $f: failed to open for reading: $!\n"; my $fail; my $h = {}; my $in_code = 0; my $sha; while (defined (my $line = )) { $line =~ /^\#/ and next; chomp $line; $line eq '' and $in_code = 0, next; if (!$in_code) { $line =~ /^([[:xdigit:]]{40})$/ or (warn "$ME: $f:$.: invalid line; expected an SHA1\n"), $fail = 1, next; $sha = lc $1; $in_code = 1; exists $h->{$sha} and (warn "$ME: $f:$.: duplicate SHA1\n"), $fail = 1, next; } else { $h->{$sha} ||= ''; $h->{$sha} .= "$line\n"; } } close F; $fail and exit 1; return $h; } # git_dir_option $SRCDIR # # From $SRCDIR, the --git-dir option to pass to git (none if $SRCDIR # is undef). Return as a list (0 or 1 element). sub git_dir_option($) { my ($srcdir) = @_; my @res = (); if (defined $srcdir) { my $qdir = shell_quote $srcdir; my $cmd = "cd $qdir && git rev-parse --show-toplevel"; my $qcmd = shell_quote $cmd; my $git_dir = qx($cmd); defined $git_dir or die "$ME: cannot run $qcmd: $!\n"; $? == 0 or die "$ME: $qcmd had unexpected exit code or signal ($?)\n"; chomp $git_dir; push @res, "--git-dir=$git_dir/.git"; } @res; } { my $since_date; my $until_date; my $format_string = '%s%n%b%n'; my $amend_file; my $append_dot = 0; my $cluster = 1; my $ignore_matching; my $ignore_line; my $strip_tab = 0; my $strip_cherry_pick = 0; my $srcdir; GetOptions ( help => sub { usage 0 }, version => sub { print "$ME version $VERSION\n"; exit }, 'since=s' => \$since_date, 'until=s' => \$until_date, 'format=s' => \$format_string, 'amend=s' => \$amend_file, 'append-dot' => \$append_dot, 'cluster!' => \$cluster, 'ignore-matching=s' => \$ignore_matching, 'ignore-line=s' => \$ignore_line, 'strip-tab' => \$strip_tab, 'strip-cherry-pick' => \$strip_cherry_pick, 'srcdir=s' => \$srcdir, ) or usage 1; defined $since_date and unshift @ARGV, "--since=$since_date"; defined $until_date and unshift @ARGV, "--until=$until_date"; # This is a hash that maps an SHA1 to perl code (i.e., s/old/new/) # that makes a correction in the log or attribution of that commit. my $amend_code = defined $amend_file ? parse_amend_file $amend_file : {}; my @cmd = ('git', git_dir_option $srcdir, qw(log --log-size), '--pretty=format:%H:%ct %an <%ae>%n%n'.$format_string, @ARGV); open PIPE, '-|', @cmd or die ("$ME: failed to run '". quoted_cmd (@cmd) ."': $!\n" . "(Is your Git too old? Version 1.5.1 or later is required.)\n"); my $prev_multi_paragraph; my $prev_date_line = ''; my @prev_coauthors = (); my @skipshas = (); while (1) { defined (my $in = ) or last; $in =~ /^log size (\d+)$/ or die "$ME:$.: Invalid line (expected log size):\n$in"; my $log_nbytes = $1; my $log; my $n_read = read PIPE, $log, $log_nbytes; $n_read == $log_nbytes or die "$ME:$.: unexpected EOF\n"; # Extract leading hash. my ($sha, $rest) = split ':', $log, 2; defined $sha or die "$ME:$.: malformed log entry\n"; $sha =~ /^[[:xdigit:]]{40}$/ or die "$ME:$.: invalid SHA1: $sha\n"; my $skipflag = 0; if (@skipshas) { foreach(@skipshas) { if ($sha =~ /^$_/) { $skipflag = $_; last; } } } # If this commit's log requires any transformation, do it now. my $code = $amend_code->{$sha}; if (defined $code) { eval 'use Safe'; my $s = new Safe; # Put the unpreprocessed entry into "$_". $_ = $rest; # Let $code operate on it, safely. my $r = $s->reval("$code") or die "$ME:$.:$sha: failed to eval \"$code\":\n$@\n"; # Note that we've used this entry. delete $amend_code->{$sha}; # Update $rest upon success. $rest = $_; } # Remove lines inserted by "git cherry-pick". if ($strip_cherry_pick) { $rest =~ s/^\s*Conflicts:\n.*//sm; $rest =~ s/^\s*\(cherry picked from commit [\da-f]+\)\n//m; } my @line = split /[ \t]*\n/, $rest; my $author_line = shift @line; defined $author_line or die "$ME:$.: unexpected EOF\n"; $author_line =~ /^(\d+) (.*>)$/ or die "$ME:$.: Invalid line " . "(expected date/author/email):\n$author_line\n"; # Format 'Copyright-paperwork-exempt: Yes' as a standard ChangeLog # `(tiny change)' annotation. my $tiny = (grep (/^(?:Copyright-paperwork-exempt|Tiny-change):\s+[Yy]es$/, @line) ? ' (tiny change)' : ''); my $date_line = sprintf "%s %s$tiny\n", strftime ("%Y-%m-%d", localtime ($1)), $2; my @coauthors = grep /^Co-authored-by:.*$/, @line; # Omit meta-data lines we've already interpreted. @line = grep !/^(?:Signed-off-by:[ ].*>$ |Co-authored-by:[ ] |Copyright-paperwork-exempt:[ ] |Tiny-change:[ ] )/x, @line; # Remove leading and trailing blank lines. if (@line) { while ($line[0] =~ /^\s*$/) { shift @line; } while ($line[$#line] =~ /^\s*$/) { pop @line; } } # Handle Emacs gitmerge.el "skipped" commits. # Yes, this should be controlled by an option. So sue me. if ( grep /^(; )?Merge from /, @line ) { my $found = 0; foreach (@line) { if (grep /^The following commit.*skipped:$/, $_) { $found = 1; ## Reset at each merge to reduce chance of false matches. @skipshas = (); next; } if ($found && $_ =~ /^([[:xdigit:]]{7,}) [^ ]/) { push ( @skipshas, $1 ); } } } # Ignore commits that match the --ignore-matching pattern, if specified. if (defined $ignore_matching && @line && $line[0] =~ /$ignore_matching/) { $skipflag = 1; } elsif ($skipflag) { ## Perhaps only warn if a pattern matches more than once? warn "$ME: warning: skipping $sha due to $skipflag\n"; } if (! $skipflag) { if (defined $ignore_line && @line) { @line = grep ! /$ignore_line/, @line; while ($line[$#line] =~ /^\s*$/) { pop @line; } } # Record whether there are two or more paragraphs. my $multi_paragraph = grep /^\s*$/, @line; # Format 'Co-authored-by: A U Thor ' lines in # standard multi-author ChangeLog format. for (@coauthors) { s/^Co-authored-by:\s*/\t /; s/\s*/ or warn "$ME: warning: missing email address for " . substr ($_, 5) . "\n"; } # If clustering of commit messages has been disabled, if this header # would be different from the previous date/name/etc. header, # or if this or the previous entry consists of two or more paragraphs, # then print the header. if ( ! $cluster || $date_line ne $prev_date_line || "@coauthors" ne "@prev_coauthors" || $multi_paragraph || $prev_multi_paragraph) { $prev_date_line eq '' or print "\n"; print $date_line; @coauthors and print join ("\n", @coauthors), "\n"; } $prev_date_line = $date_line; @prev_coauthors = @coauthors; $prev_multi_paragraph = $multi_paragraph; # If there were any lines if (@line == 0) { warn "$ME: warning: empty commit message:\n" . " commit $sha\n $date_line\n"; } else { if ($append_dot) { # If the first line of the message has enough room, then if (length $line[0] < 72) { # append a dot if there is no other punctuation or blank # at the end. $line[0] =~ /[[:punct:]\s]$/ or $line[0] .= '.'; } } # Remove one additional leading TAB from each line. $strip_tab and map { s/^\t// } @line; # Prefix each non-empty line with a TAB. @line = map { length $_ ? "\t$_" : '' } @line; print "\n", join ("\n", @line), "\n"; } } defined ($in = ) or last; $in ne "\n" and die "$ME:$.: unexpected line:\n$in"; } close PIPE or die "$ME: error closing pipe from " . quoted_cmd (@cmd) . "\n"; # FIXME-someday: include $PROCESS_STATUS in the diagnostic # Complain about any unused entry in the --amend=F specified file. my $fail = 0; foreach my $sha (keys %$amend_code) { warn "$ME:$amend_file: unused entry: $sha\n"; $fail = 1; } exit $fail; } # Local Variables: # mode: perl # indent-tabs-mode: nil # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-line-limit: 50 # time-stamp-start: "my $VERSION = '" # time-stamp-format: "%:y-%02m-%02d %02H:%02M" # time-stamp-time-zone: "UTC0" # time-stamp-end: "'; # UTC" # End: grub-2.14~git20250718.0e36779/build-aux/config.rpath0000755000175000017500000004443515036447570016225 00000000000000#! /bin/sh # Output a system dependent set of variables, describing how to set the # run time search path of shared libraries in an executable. # # Copyright 1996-2013 Free Software Foundation, Inc. # Taken from GNU libtool, 2001 # Originally by Gordon Matzigkeit , 1996 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # # The first argument passed to this file is the canonical host specification, # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # The environment variables CC, GCC, LDFLAGS, LD, with_gnu_ld # should be set by the caller. # # The set of defined variables is at the end of this script. # Known limitations: # - On IRIX 6.5 with CC="cc", the run time search patch must not be longer # than 256 bytes, otherwise the compiler driver will dump core. The only # known workaround is to choose shorter directory names for the build # directory and/or the installation directory. # All known linkers require a '.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a shrext=.so host="$1" host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` # Code taken from libtool.m4's _LT_CC_BASENAME. for cc_temp in $CC""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`echo "$cc_temp" | sed -e 's%^.*/%%'` # Code taken from libtool.m4's _LT_COMPILER_PIC. wl= if test "$GCC" = yes; then wl='-Wl,' else case "$host_os" in aix*) wl='-Wl,' ;; mingw* | cygwin* | pw32* | os2* | cegcc*) ;; hpux9* | hpux10* | hpux11*) wl='-Wl,' ;; irix5* | irix6* | nonstopux*) wl='-Wl,' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in ecc*) wl='-Wl,' ;; icc* | ifort*) wl='-Wl,' ;; lf95*) wl='-Wl,' ;; nagfor*) wl='-Wl,-Wl,,' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) wl='-Wl,' ;; ccc*) wl='-Wl,' ;; xl* | bgxl* | bgf* | mpixl*) wl='-Wl,' ;; como) wl='-lopt=' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ F* | *Sun*Fortran*) wl= ;; *Sun\ C*) wl='-Wl,' ;; esac ;; esac ;; newsos6) ;; *nto* | *qnx*) ;; osf3* | osf4* | osf5*) wl='-Wl,' ;; rdos*) ;; solaris*) case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) wl='-Qoption ld ' ;; *) wl='-Wl,' ;; esac ;; sunos4*) wl='-Qoption ld ' ;; sysv4 | sysv4.2uw2* | sysv4.3*) wl='-Wl,' ;; sysv4*MP*) ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) wl='-Wl,' ;; unicos*) wl='-Wl,' ;; uts4*) ;; esac fi # Code taken from libtool.m4's _LT_LINKER_SHLIBS. hardcode_libdir_flag_spec= hardcode_libdir_separator= hardcode_direct=no hardcode_minus_L=no case "$host_os" in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; esac ld_shlibs=yes if test "$with_gnu_ld" = yes; then # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. # Unlike libtool, we use -rpath here, not --rpath, since the documented # option of GNU ld is called -rpath, not --rpath. hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' case "$host_os" in aix[3-9]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs=no fi ;; amigaos*) case "$host_cpu" in powerpc) ;; m68k) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; beos*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then : else ld_shlibs=no fi ;; haiku*) ;; interix[3-9]*) hardcode_direct=no hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; netbsd*) ;; solaris*) if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then ld_shlibs=no elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs=no ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' else ld_shlibs=no fi ;; esac ;; sunos4*) hardcode_direct=yes ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; esac if test "$ld_shlibs" = no; then hardcode_libdir_flag_spec= fi else case "$host_os" in aix3*) # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test "$GCC" = yes; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac fi hardcode_direct=yes hardcode_libdir_separator=':' if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && \ strings "$collect2name" | grep resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct=unsupported hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi ;; esac fi # Begin _LT_AC_SYS_LIBPATH_AIX. echo 'int main () { return 0; }' > conftest.c ${CC} ${LDFLAGS} conftest.c -o conftest aix_libpath=`dump -H conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` fi if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib" fi rm -f conftest.c conftest # End _LT_AC_SYS_LIBPATH_AIX. if test "$aix_use_runtimelinking" = yes; then hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' else hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" fi fi ;; amigaos*) case "$host_cpu" in powerpc) ;; m68k) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; bsdi[45]*) ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec=' ' libext=lib ;; darwin* | rhapsody*) hardcode_direct=no if { case $cc_basename in ifort*) true;; *) test "$GCC" = yes;; esac; }; then : else ld_shlibs=no fi ;; dgux*) hardcode_libdir_flag_spec='-L$libdir' ;; freebsd2.2*) hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes ;; freebsd2*) hardcode_direct=yes hardcode_minus_L=yes ;; freebsd* | dragonfly*) hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes ;; hpux9*) hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; hpux10*) if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes fi ;; hpux11*) if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: case $host_cpu in hppa*64*|ia64*) hardcode_direct=no ;; *) hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; netbsd*) hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes ;; newsos6) hardcode_direct=yes hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct=yes if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then hardcode_libdir_flag_spec='${wl}-rpath,$libdir' else case "$host_os" in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) hardcode_libdir_flag_spec='-R$libdir' ;; *) hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; esac fi else ld_shlibs=no fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; osf3*) hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) if test "$GCC" = yes; then hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' else # Both cc and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi hardcode_libdir_separator=: ;; solaris*) hardcode_libdir_flag_spec='-R$libdir' ;; sunos4*) hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes ;; sysv4) case $host_vendor in sni) hardcode_direct=yes # is this really true??? ;; siemens) hardcode_direct=no ;; motorola) hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac ;; sysv4.3*) ;; sysv4*MP*) if test -d /usr/nec; then ld_shlibs=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) ;; sysv5* | sco3.2v5* | sco5v6*) hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' hardcode_libdir_separator=':' ;; uts4*) hardcode_libdir_flag_spec='-L$libdir' ;; *) ld_shlibs=no ;; esac fi # Check dynamic linker characteristics # Code taken from libtool.m4's _LT_SYS_DYNAMIC_LINKER. # Unlike libtool.m4, here we don't care about _all_ names of the library, but # only about the one the linker finds when passed -lNAME. This is the last # element of library_names_spec in libtool.m4, or possibly two of them if the # linker has special search rules. library_names_spec= # the last element of library_names_spec in libtool.m4 libname_spec='lib$name' case "$host_os" in aix3*) library_names_spec='$libname.a' ;; aix[4-9]*) library_names_spec='$libname$shrext' ;; amigaos*) case "$host_cpu" in powerpc*) library_names_spec='$libname$shrext' ;; m68k) library_names_spec='$libname.a' ;; esac ;; beos*) library_names_spec='$libname$shrext' ;; bsdi[45]*) library_names_spec='$libname$shrext' ;; cygwin* | mingw* | pw32* | cegcc*) shrext=.dll library_names_spec='$libname.dll.a $libname.lib' ;; darwin* | rhapsody*) shrext=.dylib library_names_spec='$libname$shrext' ;; dgux*) library_names_spec='$libname$shrext' ;; freebsd* | dragonfly*) case "$host_os" in freebsd[123]*) library_names_spec='$libname$shrext$versuffix' ;; *) library_names_spec='$libname$shrext' ;; esac ;; gnu*) library_names_spec='$libname$shrext' ;; haiku*) library_names_spec='$libname$shrext' ;; hpux9* | hpux10* | hpux11*) case $host_cpu in ia64*) shrext=.so ;; hppa*64*) shrext=.sl ;; *) shrext=.sl ;; esac library_names_spec='$libname$shrext' ;; interix[3-9]*) library_names_spec='$libname$shrext' ;; irix5* | irix6* | nonstopux*) library_names_spec='$libname$shrext' case "$host_os" in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= ;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 ;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 ;; *) libsuff= shlibsuff= ;; esac ;; esac ;; linux*oldld* | linux*aout* | linux*coff*) ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) library_names_spec='$libname$shrext' ;; knetbsd*-gnu) library_names_spec='$libname$shrext' ;; netbsd*) library_names_spec='$libname$shrext' ;; newsos6) library_names_spec='$libname$shrext' ;; *nto* | *qnx*) library_names_spec='$libname$shrext' ;; openbsd*) library_names_spec='$libname$shrext$versuffix' ;; os2*) libname_spec='$name' shrext=.dll library_names_spec='$libname.a' ;; osf3* | osf4* | osf5*) library_names_spec='$libname$shrext' ;; rdos*) ;; solaris*) library_names_spec='$libname$shrext' ;; sunos4*) library_names_spec='$libname$shrext$versuffix' ;; sysv4 | sysv4.3*) library_names_spec='$libname$shrext' ;; sysv4*MP*) library_names_spec='$libname$shrext' ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) library_names_spec='$libname$shrext' ;; tpf*) library_names_spec='$libname$shrext' ;; uts4*) library_names_spec='$libname$shrext' ;; esac sed_quote_subst='s/\(["`$\\]\)/\\\1/g' escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"` shlibext=`echo "$shrext" | sed -e 's,^\.,,'` escaped_libname_spec=`echo "X$libname_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` escaped_library_names_spec=`echo "X$library_names_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` LC_ALL=C sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' <, 1996. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try '$0 --help' for more information" exit 1 fi case $1 in --is-lightweight) # Used by our autoconf macros to check whether the available missing # script is modern enough. exit 0 ;; --run) # Back-compat with the calling convention used by older automake. shift ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due to PROGRAM being missing or too old. Options: -h, --help display this help and exit -v, --version output version information and exit Supported PROGRAM values: aclocal autoconf autoheader autom4te automake makeinfo bison yacc flex lex help2man Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and 'g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: unknown '$1' option" echo 1>&2 "Try '$0 --help' for more information" exit 1 ;; esac # Run the given program, remember its exit status. "$@"; st=$? # If it succeeded, we are done. test $st -eq 0 && exit 0 # Also exit now if we it failed (or wasn't found), and '--version' was # passed; such an option is passed most likely to detect whether the # program is present and works. case $2 in --version|--help) exit $st;; esac # Exit code 63 means version mismatch. This often happens when the user # tries to use an ancient version of a tool on a file that requires a # minimum version. if test $st -eq 63; then msg="probably too old" elif test $st -eq 127; then # Program was missing. msg="missing on your system" else # Program was found and executed, but failed. Give up. exit $st fi perl_URL=https://www.perl.org/ flex_URL=https://github.com/westes/flex gnu_software_URL=https://www.gnu.org/software program_details () { case $1 in aclocal|automake) echo "The '$1' program is part of the GNU Automake package:" echo "<$gnu_software_URL/automake>" echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/autoconf>" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; autoconf|autom4te|autoheader) echo "The '$1' program is part of the GNU Autoconf package:" echo "<$gnu_software_URL/autoconf/>" echo "It also requires GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; esac } give_advice () { # Normalize program name to check for. normalized_program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` printf '%s\n' "'$1' is $msg." configure_deps="'configure.ac' or m4 files included by 'configure.ac'" case $normalized_program in autoconf*) echo "You should only need it if you modified 'configure.ac'," echo "or m4 files included by it." program_details 'autoconf' ;; autoheader*) echo "You should only need it if you modified 'acconfig.h' or" echo "$configure_deps." program_details 'autoheader' ;; automake*) echo "You should only need it if you modified 'Makefile.am' or" echo "$configure_deps." program_details 'automake' ;; aclocal*) echo "You should only need it if you modified 'acinclude.m4' or" echo "$configure_deps." program_details 'aclocal' ;; autom4te*) echo "You might have modified some maintainer files that require" echo "the 'autom4te' program to be rebuilt." program_details 'autom4te' ;; bison*|yacc*) echo "You should only need it if you modified a '.y' file." echo "You may want to install the GNU Bison package:" echo "<$gnu_software_URL/bison/>" ;; lex*|flex*) echo "You should only need it if you modified a '.l' file." echo "You may want to install the Fast Lexical Analyzer package:" echo "<$flex_URL>" ;; help2man*) echo "You should only need it if you modified a dependency" \ "of a man page." echo "You may want to install the GNU Help2man package:" echo "<$gnu_software_URL/help2man/>" ;; makeinfo*) echo "You should only need it if you modified a '.texi' file, or" echo "any other file indirectly affecting the aspect of the manual." echo "You might want to install the Texinfo package:" echo "<$gnu_software_URL/texinfo/>" echo "The spurious makeinfo call might also be the consequence of" echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" echo "want to install GNU make:" echo "<$gnu_software_URL/make/>" ;; *) echo "You might have modified some files without having the proper" echo "tools for further handling them. Check the 'README' file, it" echo "often tells you about the needed prerequisites for installing" echo "this package. You may also peek at any GNU archive site, in" echo "case some other package contains this missing '$1' program." ;; esac } give_advice "$1" | sed -e '1s/^/WARNING: /' \ -e '2,$s/^/ /' >&2 # Propagate the correct exit status (expected to be 127 for a program # not found, 63 for a program that failed due to version mismatch). exit $st # Local variables: # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: grub-2.14~git20250718.0e36779/build-aux/install-sh0000755000175000017500000003577615036452451015723 00000000000000#!/bin/sh # install - install a program, script, or datafile scriptversion=2020-11-14.01; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # 'make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. tab=' ' nl=' ' IFS=" $tab$nl" # Set DOITPROG to "echo" to test this script. doit=${DOITPROG-} doit_exec=${doit:-exec} # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_mkdir= # Desired mode of installed file. mode=0755 # Create dirs (including intermediate dirs) using mode 755. # This is like GNU 'install' as of coreutils 8.32 (2020). mkdir_umask=22 backupsuffix= chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false is_target_a_directory=possibly usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -p pass -p to $cpprog. -s $stripprog installed files. -S SUFFIX attempt to back up existing files, with suffix SUFFIX. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG By default, rm is invoked with -f; when overridden with RMPROG, it's up to you to specify -f if you want it. If -S is not specified, no backups are attempted. Email bug reports to bug-automake@gnu.org. Automake home page: https://www.gnu.org/software/automake/ " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -p) cpprog="$cpprog -p";; -s) stripcmd=$stripprog;; -S) backupsuffix="$2" shift;; -t) is_target_a_directory=always dst_arg=$2 # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac shift;; -T) is_target_a_directory=never;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done # We allow the use of options -d and -T together, by making -d # take the precedence; this is for compatibility with GNU install. if test -n "$dir_arg"; then if test -n "$dst_arg"; then echo "$0: target directory not allowed when installing a directory." >&2 exit 1 fi fi if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call 'install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then if test $# -gt 1 || test "$is_target_a_directory" = always; then if test ! -d "$dst_arg"; then echo "$0: $dst_arg: Is not a directory." >&2 exit 1 fi fi fi if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names problematic for 'test' and other utilities. case $src in -* | [=\(\)!]) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? # Don't chown directories that already exist. if test $dstdir_status = 0; then chowncmd="" fi else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # If destination is a directory, append the input filename. if test -d "$dst"; then if test "$is_target_a_directory" = never; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dstbase=`basename "$src"` case $dst in */) dst=$dst$dstbase;; *) dst=$dst/$dstbase;; esac dstdir_status=0 else dstdir=`dirname "$dst"` test -d "$dstdir" dstdir_status=$? fi fi case $dstdir in */) dstdirslash=$dstdir;; *) dstdirslash=$dstdir/;; esac obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false # The $RANDOM variable is not portable (e.g., dash). Use it # here however when possible just to lower collision chance. tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap ' ret=$? rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null exit $ret ' 0 # Because "mkdir -p" follows existing symlinks and we likely work # directly in world-writeable /tmp, make sure that the '$tmpdir' # directory is successfully created first before we actually test # 'mkdir -p'. if (umask $mkdir_umask && $mkdirprog $mkdir_mode "$tmpdir" && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. test_tmpdir="$tmpdir/a" ls_ld_tmpdir=`ls -ld "$test_tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null fi trap '' 0;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; [-=\(\)!]*) prefix='./';; *) prefix='';; esac oIFS=$IFS IFS=/ set -f set fnord $dstdir shift set +f IFS=$oIFS prefixes= for d do test X"$d" = X && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=${dstdirslash}_inst.$$_ rmtmp=${dstdirslash}_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && { test -z "$stripcmd" || { # Create $dsttmp read-write so that cp doesn't create it read-only, # which would cause strip to fail. if test -z "$doit"; then : >"$dsttmp" # No need to fork-exec 'touch'. else $doit touch "$dsttmp" fi } } && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # If $backupsuffix is set, and the file being installed # already exists, attempt a backup. Don't worry if it fails, # e.g., if mv doesn't support -f. if test -n "$backupsuffix" && test -f "$dst"; then $doit $mvcmd -f "$dst" "$dst$backupsuffix" 2>/dev/null fi # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: grub-2.14~git20250718.0e36779/build-aux/config.sub0000755000175000017500000010511615036447566015677 00000000000000#! /bin/sh # Configuration validation subroutine script. # Copyright 1992-2021 Free Software Foundation, Inc. # shellcheck disable=SC2006,SC2268 # see below for rationale timestamp='2021-12-25' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # Please send patches to . # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: # https://git.savannah.gnu.org/cgit/config.git/plain/config.sub # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. # The "shellcheck disable" line above the timestamp inhibits complaints # about features and limitations of the classic Bourne shell that were # superseded or lifted in POSIX. However, this script identifies a wide # variety of pre-POSIX systems that do not have POSIX shells at all, and # even some reasonably current systems (Solaris 10 as case-in-point) still # have a pre-POSIX /bin/sh. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS Canonicalize a configuration name. Options: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright 1992-2021 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; *local*) # First pass through any local machine types. echo "$1" exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Split fields of configuration type # shellcheck disable=SC2162 saved_IFS=$IFS IFS="-" read field1 field2 field3 field4 <&2 exit 1 ;; *-*-*-*) basic_machine=$field1-$field2 basic_os=$field3-$field4 ;; *-*-*) # Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two # parts maybe_os=$field2-$field3 case $maybe_os in nto-qnx* | linux-* | uclinux-uclibc* \ | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \ | netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \ | storm-chaos* | os2-emx* | rtmk-nova*) basic_machine=$field1 basic_os=$maybe_os ;; android-linux) basic_machine=$field1-unknown basic_os=linux-android ;; *) basic_machine=$field1-$field2 basic_os=$field3 ;; esac ;; *-*) # A lone config we happen to match not fitting any pattern case $field1-$field2 in decstation-3100) basic_machine=mips-dec basic_os= ;; *-*) # Second component is usually, but not always the OS case $field2 in # Prevent following clause from handling this valid os sun*os*) basic_machine=$field1 basic_os=$field2 ;; zephyr*) basic_machine=$field1-unknown basic_os=$field2 ;; # Manufacturers dec* | mips* | sequent* | encore* | pc533* | sgi* | sony* \ | att* | 7300* | 3300* | delta* | motorola* | sun[234]* \ | unicom* | ibm* | next | hp | isi* | apollo | altos* \ | convergent* | ncr* | news | 32* | 3600* | 3100* \ | hitachi* | c[123]* | convex* | sun | crds | omron* | dg \ | ultra | tti* | harris | dolphin | highlevel | gould \ | cbm | ns | masscomp | apple | axis | knuth | cray \ | microblaze* | sim | cisco \ | oki | wec | wrs | winbond) basic_machine=$field1-$field2 basic_os= ;; *) basic_machine=$field1 basic_os=$field2 ;; esac ;; esac ;; *) # Convert single-component short-hands not valid as part of # multi-component configurations. case $field1 in 386bsd) basic_machine=i386-pc basic_os=bsd ;; a29khif) basic_machine=a29k-amd basic_os=udi ;; adobe68k) basic_machine=m68010-adobe basic_os=scout ;; alliant) basic_machine=fx80-alliant basic_os= ;; altos | altos3068) basic_machine=m68k-altos basic_os= ;; am29k) basic_machine=a29k-none basic_os=bsd ;; amdahl) basic_machine=580-amdahl basic_os=sysv ;; amiga) basic_machine=m68k-unknown basic_os= ;; amigaos | amigados) basic_machine=m68k-unknown basic_os=amigaos ;; amigaunix | amix) basic_machine=m68k-unknown basic_os=sysv4 ;; apollo68) basic_machine=m68k-apollo basic_os=sysv ;; apollo68bsd) basic_machine=m68k-apollo basic_os=bsd ;; aros) basic_machine=i386-pc basic_os=aros ;; aux) basic_machine=m68k-apple basic_os=aux ;; balance) basic_machine=ns32k-sequent basic_os=dynix ;; blackfin) basic_machine=bfin-unknown basic_os=linux ;; cegcc) basic_machine=arm-unknown basic_os=cegcc ;; convex-c1) basic_machine=c1-convex basic_os=bsd ;; convex-c2) basic_machine=c2-convex basic_os=bsd ;; convex-c32) basic_machine=c32-convex basic_os=bsd ;; convex-c34) basic_machine=c34-convex basic_os=bsd ;; convex-c38) basic_machine=c38-convex basic_os=bsd ;; cray) basic_machine=j90-cray basic_os=unicos ;; crds | unos) basic_machine=m68k-crds basic_os= ;; da30) basic_machine=m68k-da30 basic_os= ;; decstation | pmax | pmin | dec3100 | decstatn) basic_machine=mips-dec basic_os= ;; delta88) basic_machine=m88k-motorola basic_os=sysv3 ;; dicos) basic_machine=i686-pc basic_os=dicos ;; djgpp) basic_machine=i586-pc basic_os=msdosdjgpp ;; ebmon29k) basic_machine=a29k-amd basic_os=ebmon ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson basic_os=ose ;; gmicro) basic_machine=tron-gmicro basic_os=sysv ;; go32) basic_machine=i386-pc basic_os=go32 ;; h8300hms) basic_machine=h8300-hitachi basic_os=hms ;; h8300xray) basic_machine=h8300-hitachi basic_os=xray ;; h8500hms) basic_machine=h8500-hitachi basic_os=hms ;; harris) basic_machine=m88k-harris basic_os=sysv3 ;; hp300 | hp300hpux) basic_machine=m68k-hp basic_os=hpux ;; hp300bsd) basic_machine=m68k-hp basic_os=bsd ;; hppaosf) basic_machine=hppa1.1-hp basic_os=osf ;; hppro) basic_machine=hppa1.1-hp basic_os=proelf ;; i386mach) basic_machine=i386-mach basic_os=mach ;; isi68 | isi) basic_machine=m68k-isi basic_os=sysv ;; m68knommu) basic_machine=m68k-unknown basic_os=linux ;; magnum | m3230) basic_machine=mips-mips basic_os=sysv ;; merlin) basic_machine=ns32k-utek basic_os=sysv ;; mingw64) basic_machine=x86_64-pc basic_os=mingw64 ;; mingw32) basic_machine=i686-pc basic_os=mingw32 ;; mingw32ce) basic_machine=arm-unknown basic_os=mingw32ce ;; monitor) basic_machine=m68k-rom68k basic_os=coff ;; morphos) basic_machine=powerpc-unknown basic_os=morphos ;; moxiebox) basic_machine=moxie-unknown basic_os=moxiebox ;; msdos) basic_machine=i386-pc basic_os=msdos ;; msys) basic_machine=i686-pc basic_os=msys ;; mvs) basic_machine=i370-ibm basic_os=mvs ;; nacl) basic_machine=le32-unknown basic_os=nacl ;; ncr3000) basic_machine=i486-ncr basic_os=sysv4 ;; netbsd386) basic_machine=i386-pc basic_os=netbsd ;; netwinder) basic_machine=armv4l-rebel basic_os=linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony basic_os=newsos ;; news1000) basic_machine=m68030-sony basic_os=newsos ;; necv70) basic_machine=v70-nec basic_os=sysv ;; nh3000) basic_machine=m68k-harris basic_os=cxux ;; nh[45]000) basic_machine=m88k-harris basic_os=cxux ;; nindy960) basic_machine=i960-intel basic_os=nindy ;; mon960) basic_machine=i960-intel basic_os=mon960 ;; nonstopux) basic_machine=mips-compaq basic_os=nonstopux ;; os400) basic_machine=powerpc-ibm basic_os=os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson basic_os=ose ;; os68k) basic_machine=m68k-none basic_os=os68k ;; paragon) basic_machine=i860-intel basic_os=osf ;; parisc) basic_machine=hppa-unknown basic_os=linux ;; psp) basic_machine=mipsallegrexel-sony basic_os=psp ;; pw32) basic_machine=i586-unknown basic_os=pw32 ;; rdos | rdos64) basic_machine=x86_64-pc basic_os=rdos ;; rdos32) basic_machine=i386-pc basic_os=rdos ;; rom68k) basic_machine=m68k-rom68k basic_os=coff ;; sa29200) basic_machine=a29k-amd basic_os=udi ;; sei) basic_machine=mips-sei basic_os=seiux ;; sequent) basic_machine=i386-sequent basic_os= ;; sps7) basic_machine=m68k-bull basic_os=sysv2 ;; st2000) basic_machine=m68k-tandem basic_os= ;; stratus) basic_machine=i860-stratus basic_os=sysv4 ;; sun2) basic_machine=m68000-sun basic_os= ;; sun2os3) basic_machine=m68000-sun basic_os=sunos3 ;; sun2os4) basic_machine=m68000-sun basic_os=sunos4 ;; sun3) basic_machine=m68k-sun basic_os= ;; sun3os3) basic_machine=m68k-sun basic_os=sunos3 ;; sun3os4) basic_machine=m68k-sun basic_os=sunos4 ;; sun4) basic_machine=sparc-sun basic_os= ;; sun4os3) basic_machine=sparc-sun basic_os=sunos3 ;; sun4os4) basic_machine=sparc-sun basic_os=sunos4 ;; sun4sol2) basic_machine=sparc-sun basic_os=solaris2 ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun basic_os= ;; sv1) basic_machine=sv1-cray basic_os=unicos ;; symmetry) basic_machine=i386-sequent basic_os=dynix ;; t3e) basic_machine=alphaev5-cray basic_os=unicos ;; t90) basic_machine=t90-cray basic_os=unicos ;; toad1) basic_machine=pdp10-xkl basic_os=tops20 ;; tpf) basic_machine=s390x-ibm basic_os=tpf ;; udi29k) basic_machine=a29k-amd basic_os=udi ;; ultra3) basic_machine=a29k-nyu basic_os=sym1 ;; v810 | necv810) basic_machine=v810-nec basic_os=none ;; vaxv) basic_machine=vax-dec basic_os=sysv ;; vms) basic_machine=vax-dec basic_os=vms ;; vsta) basic_machine=i386-pc basic_os=vsta ;; vxworks960) basic_machine=i960-wrs basic_os=vxworks ;; vxworks68) basic_machine=m68k-wrs basic_os=vxworks ;; vxworks29k) basic_machine=a29k-wrs basic_os=vxworks ;; xbox) basic_machine=i686-pc basic_os=mingw32 ;; ymp) basic_machine=ymp-cray basic_os=unicos ;; *) basic_machine=$1 basic_os= ;; esac ;; esac # Decode 1-component or ad-hoc basic machines case $basic_machine in # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) cpu=hppa1.1 vendor=winbond ;; op50n) cpu=hppa1.1 vendor=oki ;; op60c) cpu=hppa1.1 vendor=oki ;; ibm*) cpu=i370 vendor=ibm ;; orion105) cpu=clipper vendor=highlevel ;; mac | mpw | mac-mpw) cpu=m68k vendor=apple ;; pmac | pmac-mpw) cpu=powerpc vendor=apple ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) cpu=m68000 vendor=att ;; 3b*) cpu=we32k vendor=att ;; bluegene*) cpu=powerpc vendor=ibm basic_os=cnk ;; decsystem10* | dec10*) cpu=pdp10 vendor=dec basic_os=tops10 ;; decsystem20* | dec20*) cpu=pdp10 vendor=dec basic_os=tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) cpu=m68k vendor=motorola ;; dpx2*) cpu=m68k vendor=bull basic_os=sysv3 ;; encore | umax | mmax) cpu=ns32k vendor=encore ;; elxsi) cpu=elxsi vendor=elxsi basic_os=${basic_os:-bsd} ;; fx2800) cpu=i860 vendor=alliant ;; genix) cpu=ns32k vendor=ns ;; h3050r* | hiux*) cpu=hppa1.1 vendor=hitachi basic_os=hiuxwe2 ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) cpu=hppa1.0 vendor=hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) cpu=m68000 vendor=hp ;; hp9k3[2-9][0-9]) cpu=m68k vendor=hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) cpu=hppa1.0 vendor=hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) cpu=hppa1.1 vendor=hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp cpu=hppa1.1 vendor=hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp cpu=hppa1.1 vendor=hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) cpu=hppa1.1 vendor=hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) cpu=hppa1.0 vendor=hp ;; i*86v32) cpu=`echo "$1" | sed -e 's/86.*/86/'` vendor=pc basic_os=sysv32 ;; i*86v4*) cpu=`echo "$1" | sed -e 's/86.*/86/'` vendor=pc basic_os=sysv4 ;; i*86v) cpu=`echo "$1" | sed -e 's/86.*/86/'` vendor=pc basic_os=sysv ;; i*86sol2) cpu=`echo "$1" | sed -e 's/86.*/86/'` vendor=pc basic_os=solaris2 ;; j90 | j90-cray) cpu=j90 vendor=cray basic_os=${basic_os:-unicos} ;; iris | iris4d) cpu=mips vendor=sgi case $basic_os in irix*) ;; *) basic_os=irix4 ;; esac ;; miniframe) cpu=m68000 vendor=convergent ;; *mint | mint[0-9]* | *MiNT | *MiNT[0-9]*) cpu=m68k vendor=atari basic_os=mint ;; news-3600 | risc-news) cpu=mips vendor=sony basic_os=newsos ;; next | m*-next) cpu=m68k vendor=next case $basic_os in openstep*) ;; nextstep*) ;; ns2*) basic_os=nextstep2 ;; *) basic_os=nextstep3 ;; esac ;; np1) cpu=np1 vendor=gould ;; op50n-* | op60c-*) cpu=hppa1.1 vendor=oki basic_os=proelf ;; pa-hitachi) cpu=hppa1.1 vendor=hitachi basic_os=hiuxwe2 ;; pbd) cpu=sparc vendor=tti ;; pbb) cpu=m68k vendor=tti ;; pc532) cpu=ns32k vendor=pc532 ;; pn) cpu=pn vendor=gould ;; power) cpu=power vendor=ibm ;; ps2) cpu=i386 vendor=ibm ;; rm[46]00) cpu=mips vendor=siemens ;; rtpc | rtpc-*) cpu=romp vendor=ibm ;; sde) cpu=mipsisa32 vendor=sde basic_os=${basic_os:-elf} ;; simso-wrs) cpu=sparclite vendor=wrs basic_os=vxworks ;; tower | tower-32) cpu=m68k vendor=ncr ;; vpp*|vx|vx-*) cpu=f301 vendor=fujitsu ;; w65) cpu=w65 vendor=wdc ;; w89k-*) cpu=hppa1.1 vendor=winbond basic_os=proelf ;; none) cpu=none vendor=none ;; leon|leon[3-9]) cpu=sparc vendor=$basic_machine ;; leon-*|leon[3-9]-*) cpu=sparc vendor=`echo "$basic_machine" | sed 's/-.*//'` ;; *-*) # shellcheck disable=SC2162 saved_IFS=$IFS IFS="-" read cpu vendor <&2 exit 1 ;; esac ;; esac # Here we canonicalize certain aliases for manufacturers. case $vendor in digital*) vendor=dec ;; commodore*) vendor=cbm ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if test x$basic_os != x then # First recognize some ad-hoc cases, or perhaps split kernel-os, or else just # set os. case $basic_os in gnu/linux*) kernel=linux os=`echo "$basic_os" | sed -e 's|gnu/linux|gnu|'` ;; os2-emx) kernel=os2 os=`echo "$basic_os" | sed -e 's|os2-emx|emx|'` ;; nto-qnx*) kernel=nto os=`echo "$basic_os" | sed -e 's|nto-qnx|qnx|'` ;; *-*) # shellcheck disable=SC2162 saved_IFS=$IFS IFS="-" read kernel os <&2 exit 1 ;; esac # As a final step for OS-related things, validate the OS-kernel combination # (given a valid OS), if there is a kernel. case $kernel-$os in linux-gnu* | linux-dietlibc* | linux-android* | linux-newlib* \ | linux-musl* | linux-relibc* | linux-uclibc* ) ;; uclinux-uclibc* ) ;; -dietlibc* | -newlib* | -musl* | -relibc* | -uclibc* ) # These are just libc implementations, not actual OSes, and thus # require a kernel. echo "Invalid configuration \`$1': libc \`$os' needs explicit kernel." 1>&2 exit 1 ;; kfreebsd*-gnu* | kopensolaris*-gnu*) ;; vxworks-simlinux | vxworks-simwindows | vxworks-spe) ;; nto-qnx*) ;; os2-emx) ;; *-eabi* | *-gnueabi*) ;; -*) # Blank kernel with real OS is always fine. ;; *-*) echo "Invalid configuration \`$1': Kernel \`$kernel' not known to work with OS \`$os'." 1>&2 exit 1 ;; esac # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. case $vendor in unknown) case $cpu-$os in *-riscix*) vendor=acorn ;; *-sunos*) vendor=sun ;; *-cnk* | *-aix*) vendor=ibm ;; *-beos*) vendor=be ;; *-hpux*) vendor=hp ;; *-mpeix*) vendor=hp ;; *-hiux*) vendor=hitachi ;; *-unos*) vendor=crds ;; *-dgux*) vendor=dg ;; *-luna*) vendor=omron ;; *-genix*) vendor=ns ;; *-clix*) vendor=intergraph ;; *-mvs* | *-opened*) vendor=ibm ;; *-os400*) vendor=ibm ;; s390-* | s390x-*) vendor=ibm ;; *-ptx*) vendor=sequent ;; *-tpf*) vendor=ibm ;; *-vxsim* | *-vxworks* | *-windiss*) vendor=wrs ;; *-aux*) vendor=apple ;; *-hms*) vendor=hitachi ;; *-mpw* | *-macos*) vendor=apple ;; *-*mint | *-mint[0-9]* | *-*MiNT | *-MiNT[0-9]*) vendor=atari ;; *-vos*) vendor=stratus ;; esac ;; esac echo "$cpu-$vendor-${kernel:+$kernel-}$os" exit # Local variables: # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: grub-2.14~git20250718.0e36779/build-aux/mdate-sh0000755000175000017500000001373215036447566015346 00000000000000#!/bin/sh # Get modification time of a file or directory and pretty-print it. scriptversion=2018-03-07.03; # UTC # Copyright (C) 1995-2022 Free Software Foundation, Inc. # written by Ulrich Drepper , June 1995 # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST fi case $1 in '') echo "$0: No file. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: mdate-sh [--help] [--version] FILE Pretty-print the modification day of FILE, in the format: 1 January 1970 Report bugs to . EOF exit $? ;; -v | --v*) echo "mdate-sh $scriptversion" exit $? ;; esac error () { echo "$0: $1" >&2 exit 1 } # Prevent date giving response in another language. LANG=C export LANG LC_ALL=C export LC_ALL LC_TIME=C export LC_TIME # Use UTC to get reproducible result. TZ=UTC0 export TZ # GNU ls changes its time format in response to the TIME_STYLE # variable. Since we cannot assume 'unset' works, revert this # variable to its documented default. if test "${TIME_STYLE+set}" = set; then TIME_STYLE=posix-long-iso export TIME_STYLE fi save_arg1=$1 # Find out how to get the extended ls output of a file or directory. if ls -L /dev/null 1>/dev/null 2>&1; then ls_command='ls -L -l -d' else ls_command='ls -l -d' fi # Avoid user/group names that might have spaces, when possible. if ls -n /dev/null 1>/dev/null 2>&1; then ls_command="$ls_command -n" fi # A 'ls -l' line looks as follows on OS/2. # drwxrwx--- 0 Aug 11 2001 foo # This differs from Unix, which adds ownership information. # drwxrwx--- 2 root root 4096 Aug 11 2001 foo # # To find the date, we split the line on spaces and iterate on words # until we find a month. This cannot work with files whose owner is a # user named "Jan", or "Feb", etc. However, it's unlikely that '/' # will be owned by a user whose name is a month. So we first look at # the extended ls output of the root directory to decide how many # words should be skipped to get the date. # On HPUX /bin/sh, "set" interprets "-rw-r--r--" as options, so the "x" below. set x`$ls_command /` # Find which argument is the month. month= command= until test $month do test $# -gt 0 || error "failed parsing '$ls_command /' output" shift # Add another shift to the command. command="$command shift;" case $1 in Jan) month=January; nummonth=1;; Feb) month=February; nummonth=2;; Mar) month=March; nummonth=3;; Apr) month=April; nummonth=4;; May) month=May; nummonth=5;; Jun) month=June; nummonth=6;; Jul) month=July; nummonth=7;; Aug) month=August; nummonth=8;; Sep) month=September; nummonth=9;; Oct) month=October; nummonth=10;; Nov) month=November; nummonth=11;; Dec) month=December; nummonth=12;; esac done test -n "$month" || error "failed parsing '$ls_command /' output" # Get the extended ls output of the file or directory. set dummy x`eval "$ls_command \"\\\$save_arg1\""` # Remove all preceding arguments eval $command # Because of the dummy argument above, month is in $2. # # On a POSIX system, we should have # # $# = 5 # $1 = file size # $2 = month # $3 = day # $4 = year or time # $5 = filename # # On Darwin 7.7.0 and 7.6.0, we have # # $# = 4 # $1 = day # $2 = month # $3 = year or time # $4 = filename # Get the month. case $2 in Jan) month=January; nummonth=1;; Feb) month=February; nummonth=2;; Mar) month=March; nummonth=3;; Apr) month=April; nummonth=4;; May) month=May; nummonth=5;; Jun) month=June; nummonth=6;; Jul) month=July; nummonth=7;; Aug) month=August; nummonth=8;; Sep) month=September; nummonth=9;; Oct) month=October; nummonth=10;; Nov) month=November; nummonth=11;; Dec) month=December; nummonth=12;; esac case $3 in ???*) day=$1;; *) day=$3; shift;; esac # Here we have to deal with the problem that the ls output gives either # the time of day or the year. case $3 in *:*) set `date`; eval year=\$$# case $2 in Jan) nummonthtod=1;; Feb) nummonthtod=2;; Mar) nummonthtod=3;; Apr) nummonthtod=4;; May) nummonthtod=5;; Jun) nummonthtod=6;; Jul) nummonthtod=7;; Aug) nummonthtod=8;; Sep) nummonthtod=9;; Oct) nummonthtod=10;; Nov) nummonthtod=11;; Dec) nummonthtod=12;; esac # For the first six month of the year the time notation can also # be used for files modified in the last year. if (expr $nummonth \> $nummonthtod) > /dev/null; then year=`expr $year - 1` fi;; *) year=$3;; esac # The result. echo $day $month $year # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: grub-2.14~git20250718.0e36779/build-aux/compile0000755000175000017500000001635015036452451015260 00000000000000#! /bin/sh # Wrapper for compilers which do not understand '-c -o'. scriptversion=2018-03-07.03; # UTC # Copyright (C) 1999-2021 Free Software Foundation, Inc. # Written by Tom Tromey . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . nl=' ' # We need space, tab and new line, in precisely that order. Quoting is # there to prevent tools from complaining about whitespace usage. IFS=" "" $nl" file_conv= # func_file_conv build_file lazy # Convert a $build file to $host form and store it in $file # Currently only supports Windows hosts. If the determined conversion # type is listed in (the comma separated) LAZY, no conversion will # take place. func_file_conv () { file=$1 case $file in / | /[!/]*) # absolute file, and not a UNC file if test -z "$file_conv"; then # lazily determine how to convert abs files case `uname -s` in MINGW*) file_conv=mingw ;; CYGWIN* | MSYS*) file_conv=cygwin ;; *) file_conv=wine ;; esac fi case $file_conv/,$2, in *,$file_conv,*) ;; mingw/*) file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` ;; cygwin/* | msys/*) file=`cygpath -m "$file" || echo "$file"` ;; wine/*) file=`winepath -w "$file" || echo "$file"` ;; esac ;; esac } # func_cl_dashL linkdir # Make cl look for libraries in LINKDIR func_cl_dashL () { func_file_conv "$1" if test -z "$lib_path"; then lib_path=$file else lib_path="$lib_path;$file" fi linker_opts="$linker_opts -LIBPATH:$file" } # func_cl_dashl library # Do a library search-path lookup for cl func_cl_dashl () { lib=$1 found=no save_IFS=$IFS IFS=';' for dir in $lib_path $LIB do IFS=$save_IFS if $shared && test -f "$dir/$lib.dll.lib"; then found=yes lib=$dir/$lib.dll.lib break fi if test -f "$dir/$lib.lib"; then found=yes lib=$dir/$lib.lib break fi if test -f "$dir/lib$lib.a"; then found=yes lib=$dir/lib$lib.a break fi done IFS=$save_IFS if test "$found" != yes; then lib=$lib.lib fi } # func_cl_wrapper cl arg... # Adjust compile command to suit cl func_cl_wrapper () { # Assume a capable shell lib_path= shared=: linker_opts= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. eat=1 case $2 in *.o | *.[oO][bB][jJ]) func_file_conv "$2" set x "$@" -Fo"$file" shift ;; *) func_file_conv "$2" set x "$@" -Fe"$file" shift ;; esac ;; -I) eat=1 func_file_conv "$2" mingw set x "$@" -I"$file" shift ;; -I*) func_file_conv "${1#-I}" mingw set x "$@" -I"$file" shift ;; -l) eat=1 func_cl_dashl "$2" set x "$@" "$lib" shift ;; -l*) func_cl_dashl "${1#-l}" set x "$@" "$lib" shift ;; -L) eat=1 func_cl_dashL "$2" ;; -L*) func_cl_dashL "${1#-L}" ;; -static) shared=false ;; -Wl,*) arg=${1#-Wl,} save_ifs="$IFS"; IFS=',' for flag in $arg; do IFS="$save_ifs" linker_opts="$linker_opts $flag" done IFS="$save_ifs" ;; -Xlinker) eat=1 linker_opts="$linker_opts $2" ;; -*) set x "$@" "$1" shift ;; *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) func_file_conv "$1" set x "$@" -Tp"$file" shift ;; *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) func_file_conv "$1" mingw set x "$@" "$file" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -n "$linker_opts"; then linker_opts="-link$linker_opts" fi exec "$@" $linker_opts exit 1 } eat= case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: compile [--help] [--version] PROGRAM [ARGS] Wrapper for compilers which do not understand '-c -o'. Remove '-o dest.o' from ARGS, run PROGRAM with the remaining arguments, and rename the output as expected. If you are trying to build a whole package this is not the right script to run: please start by reading the file 'INSTALL'. Report bugs to . EOF exit $? ;; -v | --v*) echo "compile $scriptversion" exit $? ;; cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ icl | *[/\\]icl | icl.exe | *[/\\]icl.exe ) func_cl_wrapper "$@" # Doesn't return... ;; esac ofile= cfile= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. # So we strip '-o arg' only if arg is an object. eat=1 case $2 in *.o | *.obj) ofile=$2 ;; *) set x "$@" -o "$2" shift ;; esac ;; *.c) cfile=$1 set x "$@" "$1" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -z "$ofile" || test -z "$cfile"; then # If no '-o' option was seen then we might have been invoked from a # pattern rule where we don't need one. That is ok -- this is a # normal compilation that the losing compiler can handle. If no # '.c' file was seen then we are probably linking. That is also # ok. exec "$@" fi # Name of file we expect compiler to create. cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` # Create the lock directory. # Note: use '[/\\:.-]' here to ensure that we don't use the same name # that we are using for the .o file. Also, base the name on the expected # object file name, since that is what matters with a parallel build. lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d while true; do if mkdir "$lockdir" >/dev/null 2>&1; then break fi sleep 1 done # FIXME: race condition here if user kills between mkdir and trap. trap "rmdir '$lockdir'; exit 1" 1 2 15 # Run the compile. "$@" ret=$? if test -f "$cofile"; then test "$cofile" = "$ofile" || mv "$cofile" "$ofile" elif test -f "${cofile}bj"; then test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" fi rmdir "$lockdir" exit $ret # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: grub-2.14~git20250718.0e36779/build-aux/texinfo.tex0000644000175000017500000133166515036447566016125 00000000000000% texinfo.tex -- TeX macros to handle Texinfo files. % % Load plain if necessary, i.e., if running under initex. \expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi % \def\texinfoversion{2022-01-02.12} % % Copyright 1985, 1986, 1988, 1990-2021 Free Software Foundation, Inc. % % This texinfo.tex file is free software: you can redistribute it and/or % modify it under the terms of the GNU General Public License as % published by the Free Software Foundation, either version 3 of the % License, or (at your option) any later version. % % This texinfo.tex file is distributed in the hope that it will be % useful, but WITHOUT ANY WARRANTY; without even the implied warranty % of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU % General Public License for more details. % % You should have received a copy of the GNU General Public License % along with this program. If not, see . % % As a special exception, when this file is read by TeX when processing % a Texinfo source document, you may use the result without % restriction. This Exception is an additional permission under section 7 % of the GNU General Public License, version 3 ("GPLv3"). % % Please try the latest version of texinfo.tex before submitting bug % reports; you can get the latest version from: % https://ftp.gnu.org/gnu/texinfo/ (the Texinfo release area), or % https://ftpmirror.gnu.org/texinfo/ (same, via a mirror), or % https://www.gnu.org/software/texinfo/ (the Texinfo home page) % The texinfo.tex in any given distribution could well be out % of date, so if that's what you're using, please check. % % Send bug reports to bug-texinfo@gnu.org. Please include a % complete document in each bug report with which we can reproduce the % problem. Patches are, of course, greatly appreciated. % % To process a Texinfo manual with TeX, it's most reliable to use the % texi2dvi shell script that comes with the distribution. For a simple % manual foo.texi, however, you can get away with this: % tex foo.texi % texindex foo.?? % tex foo.texi % tex foo.texi % dvips foo.dvi -o # or whatever; this makes foo.ps. % The extra TeX runs get the cross-reference information correct. % Sometimes one run after texindex suffices, and sometimes you need more % than two; texi2dvi does it as many times as necessary. % % It is possible to adapt texinfo.tex for other languages, to some % extent. You can get the existing language-specific files from the % full Texinfo distribution. % % The GNU Texinfo home page is https://www.gnu.org/software/texinfo. \message{Loading texinfo [version \texinfoversion]:} % If in a .fmt file, print the version number % and turn on active characters that we couldn't do earlier because % they might have appeared in the input file name. \everyjob{\message{[Texinfo version \texinfoversion]}% \catcode`+=\active \catcode`\_=\active} % LaTeX's \typeout. This ensures that the messages it is used for % are identical in format to the corresponding ones from latex/pdflatex. \def\typeout{\immediate\write17}% \chardef\other=12 % We never want plain's \outer definition of \+ in Texinfo. % For @tex, we can use \tabalign. \let\+ = \relax % Save some plain tex macros whose names we will redefine. \let\ptexb=\b \let\ptexbullet=\bullet \let\ptexc=\c \let\ptexcomma=\, \let\ptexdot=\. \let\ptexdots=\dots \let\ptexend=\end \let\ptexequiv=\equiv \let\ptexexclam=\! \let\ptexfootnote=\footnote \let\ptexgtr=> \let\ptexhat=^ \let\ptexi=\i \let\ptexindent=\indent \let\ptexinsert=\insert \let\ptexlbrace=\{ \let\ptexless=< \let\ptexnewwrite\newwrite \let\ptexnoindent=\noindent \let\ptexplus=+ \let\ptexraggedright=\raggedright \let\ptexrbrace=\} \let\ptexslash=\/ \let\ptexsp=\sp \let\ptexstar=\* \let\ptexsup=\sup \let\ptext=\t \let\ptextop=\top {\catcode`\'=\active \global\let\ptexquoteright'}% active in plain's math mode % If this character appears in an error message or help string, it % starts a new line in the output. \newlinechar = `^^J % Use TeX 3.0's \inputlineno to get the line number, for better error % messages, but if we're using an old version of TeX, don't do anything. % \ifx\inputlineno\thisisundefined \let\linenumber = \empty % Pre-3.0. \else \def\linenumber{l.\the\inputlineno:\space} \fi % Set up fixed words for English if not already set. \ifx\putwordAppendix\undefined \gdef\putwordAppendix{Appendix}\fi \ifx\putwordChapter\undefined \gdef\putwordChapter{Chapter}\fi \ifx\putworderror\undefined \gdef\putworderror{error}\fi \ifx\putwordfile\undefined \gdef\putwordfile{file}\fi \ifx\putwordin\undefined \gdef\putwordin{in}\fi \ifx\putwordIndexIsEmpty\undefined \gdef\putwordIndexIsEmpty{(Index is empty)}\fi \ifx\putwordIndexNonexistent\undefined \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi \ifx\putwordInfo\undefined \gdef\putwordInfo{Info}\fi \ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi \ifx\putwordMethodon\undefined \gdef\putwordMethodon{Method on}\fi \ifx\putwordNoTitle\undefined \gdef\putwordNoTitle{No Title}\fi \ifx\putwordof\undefined \gdef\putwordof{of}\fi \ifx\putwordon\undefined \gdef\putwordon{on}\fi \ifx\putwordpage\undefined \gdef\putwordpage{page}\fi \ifx\putwordsection\undefined \gdef\putwordsection{section}\fi \ifx\putwordSection\undefined \gdef\putwordSection{Section}\fi \ifx\putwordsee\undefined \gdef\putwordsee{see}\fi \ifx\putwordSee\undefined \gdef\putwordSee{See}\fi \ifx\putwordShortTOC\undefined \gdef\putwordShortTOC{Short Contents}\fi \ifx\putwordTOC\undefined \gdef\putwordTOC{Table of Contents}\fi % \ifx\putwordMJan\undefined \gdef\putwordMJan{January}\fi \ifx\putwordMFeb\undefined \gdef\putwordMFeb{February}\fi \ifx\putwordMMar\undefined \gdef\putwordMMar{March}\fi \ifx\putwordMApr\undefined \gdef\putwordMApr{April}\fi \ifx\putwordMMay\undefined \gdef\putwordMMay{May}\fi \ifx\putwordMJun\undefined \gdef\putwordMJun{June}\fi \ifx\putwordMJul\undefined \gdef\putwordMJul{July}\fi \ifx\putwordMAug\undefined \gdef\putwordMAug{August}\fi \ifx\putwordMSep\undefined \gdef\putwordMSep{September}\fi \ifx\putwordMOct\undefined \gdef\putwordMOct{October}\fi \ifx\putwordMNov\undefined \gdef\putwordMNov{November}\fi \ifx\putwordMDec\undefined \gdef\putwordMDec{December}\fi % \ifx\putwordDefmac\undefined \gdef\putwordDefmac{Macro}\fi \ifx\putwordDefspec\undefined \gdef\putwordDefspec{Special Form}\fi \ifx\putwordDefvar\undefined \gdef\putwordDefvar{Variable}\fi \ifx\putwordDefopt\undefined \gdef\putwordDefopt{User Option}\fi \ifx\putwordDeffunc\undefined \gdef\putwordDeffunc{Function}\fi % Give the space character the catcode for a space. \def\spaceisspace{\catcode`\ =10\relax} % Likewise for ^^M, the end of line character. \def\endlineisspace{\catcode13=10\relax} \chardef\dashChar = `\- \chardef\slashChar = `\/ \chardef\underChar = `\_ % Ignore a token. % \def\gobble#1{} % The following is used inside several \edef's. \def\makecsname#1{\expandafter\noexpand\csname#1\endcsname} % Hyphenation fixes. \hyphenation{ Flor-i-da Ghost-script Ghost-view Mac-OS Post-Script ap-pen-dix bit-map bit-maps data-base data-bases eshell fall-ing half-way long-est man-u-script man-u-scripts mini-buf-fer mini-buf-fers over-view par-a-digm par-a-digms rath-er rec-tan-gu-lar ro-bot-ics se-vere-ly set-up spa-ces spell-ing spell-ings stand-alone strong-est time-stamp time-stamps which-ever white-space wide-spread wrap-around } % Sometimes it is convenient to have everything in the transcript file % and nothing on the terminal. We don't just call \tracingall here, % since that produces some useless output on the terminal. We also make % some effort to order the tracing commands to reduce output in the log % file; cf. trace.sty in LaTeX. % \def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}% \def\loggingall{% \tracingstats2 \tracingpages1 \tracinglostchars2 % 2 gives us more in etex \tracingparagraphs1 \tracingoutput1 \tracingmacros2 \tracingrestores1 \showboxbreadth\maxdimen \showboxdepth\maxdimen \ifx\eTeXversion\thisisundefined\else % etex gives us more logging \tracingscantokens1 \tracingifs1 \tracinggroups1 \tracingnesting2 \tracingassigns1 \fi \tracingcommands3 % 3 gives us more in etex \errorcontextlines16 }% % @errormsg{MSG}. Do the index-like expansions on MSG, but if things % aren't perfect, it's not the end of the world, being an error message, % after all. % \def\errormsg{\begingroup \indexnofonts \doerrormsg} \def\doerrormsg#1{\errmessage{#1}} % add check for \lastpenalty to plain's definitions. If the last thing % we did was a \nobreak, we don't want to insert more space. % \def\smallbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\smallskipamount \removelastskip\penalty-50\smallskip\fi\fi} \def\medbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\medskipamount \removelastskip\penalty-100\medskip\fi\fi} \def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount \removelastskip\penalty-200\bigskip\fi\fi} % Output routine % % For a final copy, take out the rectangles % that mark overfull boxes (in case you have decided % that the text looks ok even though it passes the margin). % \def\finalout{\overfullrule=0pt } \newdimen\outerhsize \newdimen\outervsize % set by the paper size routines \newdimen\topandbottommargin \topandbottommargin=.75in % Output a mark which sets \thischapter, \thissection and \thiscolor. % We dump everything together because we only have one kind of mark. % This works because we only use \botmark / \topmark, not \firstmark. % % A mark contains a subexpression of the \ifcase ... \fi construct. % \get*marks macros below extract the needed part using \ifcase. % % Another complication is to let the user choose whether \thischapter % (\thissection) refers to the chapter (section) in effect at the top % of a page, or that at the bottom of a page. % \domark is called twice inside \chapmacro, to add one % mark before the section break, and one after. % In the second call \prevchapterdefs is the same as \currentchapterdefs, % and \prevsectiondefs is the same as \currentsectiondefs. % Then if the page is not broken at the mark, some of the previous % section appears on the page, and we can get the name of this section % from \firstmark for @everyheadingmarks top. % @everyheadingmarks bottom uses \botmark. % % See page 260 of The TeXbook. \def\domark{% \toks0=\expandafter{\currentchapterdefs}% \toks2=\expandafter{\currentsectiondefs}% \toks4=\expandafter{\prevchapterdefs}% \toks6=\expandafter{\prevsectiondefs}% \toks8=\expandafter{\currentcolordefs}% \mark{% \the\toks0 \the\toks2 % 0: marks for @everyheadingmarks top \noexpand\or \the\toks4 \the\toks6 % 1: for @everyheadingmarks bottom \noexpand\else \the\toks8 % 2: color marks }% } % \gettopheadingmarks, \getbottomheadingmarks, % \getcolormarks - extract needed part of mark. % % \topmark doesn't work for the very first chapter (after the title % page or the contents), so we use \firstmark there -- this gets us % the mark with the chapter defs, unless the user sneaks in, e.g., % @setcolor (or @url, or @link, etc.) between @contents and the very % first @chapter. \def\gettopheadingmarks{% \ifcase0\the\savedtopmark\fi \ifx\thischapter\empty \ifcase0\firstmark\fi \fi } \def\getbottomheadingmarks{\ifcase1\botmark\fi} \def\getcolormarks{\ifcase2\the\savedtopmark\fi} % Avoid "undefined control sequence" errors. \def\currentchapterdefs{} \def\currentsectiondefs{} \def\currentsection{} \def\prevchapterdefs{} \def\prevsectiondefs{} \def\currentcolordefs{} % Margin to add to right of even pages, to left of odd pages. \newdimen\bindingoffset \newdimen\normaloffset \newdimen\txipagewidth \newdimen\txipageheight % Main output routine. % \chardef\PAGE = 255 \newtoks\defaultoutput \defaultoutput = {\savetopmark\onepageout{\pagecontents\PAGE}} \output=\expandafter{\the\defaultoutput} \newbox\headlinebox \newbox\footlinebox % When outputting the double column layout for indices, an output routine % is run several times, which hides the original value of \topmark. This % can lead to a page heading being output and duplicating the chapter heading % of the index. Hence, save the contents of \topmark at the beginning of % the output routine. The saved contents are valid until we actually % \shipout a page. % % (We used to run a short output routine to actually set \topmark and % \firstmark to the right values, but if this was called with an empty page % containing whatsits for writing index entries, the whatsits would be thrown % away and the index auxiliary file would remain empty.) % \newtoks\savedtopmark \newif\iftopmarksaved \topmarksavedtrue \def\savetopmark{% \iftopmarksaved\else \global\savedtopmark=\expandafter{\topmark}% \global\topmarksavedtrue \fi } % \onepageout takes a vbox as an argument. % \shipout a vbox for a single page, adding an optional header, footer % and footnote. This also causes index entries for this page to be written % to the auxiliary files. % \def\onepageout#1{% \hoffset=\normaloffset % \ifodd\pageno \advance\hoffset by \bindingoffset \else \advance\hoffset by -\bindingoffset\fi % \checkchapterpage % % Retrieve the information for the headings from the marks in the page, % and call Plain TeX's \makeheadline and \makefootline, which use the % values in \headline and \footline. % % Common context changes for both heading and footing. % Do this outside of the \shipout so @code etc. will be expanded in % the headline as they should be, not taken literally (outputting ''code). \def\commonheadfootline{\let\hsize=\txipagewidth \texinfochars} % \ifodd\pageno \getoddheadingmarks \else \getevenheadingmarks \fi \global\setbox\headlinebox = \vbox{\commonheadfootline \makeheadline}% \ifodd\pageno \getoddfootingmarks \else \getevenfootingmarks \fi \global\setbox\footlinebox = \vbox{\commonheadfootline \makefootline}% % {% % Set context for writing to auxiliary files like index files. % Have to do this stuff outside the \shipout because we want it to % take effect in \write's, yet the group defined by the \vbox ends % before the \shipout runs. % \atdummies % don't expand commands in the output. \turnoffactive \shipout\vbox{% % Do this early so pdf references go to the beginning of the page. \ifpdfmakepagedest \pdfdest name{\the\pageno} xyz\fi % \unvbox\headlinebox \pagebody{#1}% \ifdim\ht\footlinebox > 0pt % Only leave this space if the footline is nonempty. % (We lessened \vsize for it in \oddfootingyyy.) % The \baselineskip=24pt in plain's \makefootline has no effect. \vskip 24pt \unvbox\footlinebox \fi % }% }% \global\topmarksavedfalse \advancepageno \ifnum\outputpenalty>-20000 \else\dosupereject\fi } \newinsert\margin \dimen\margin=\maxdimen % Main part of page, including any footnotes \def\pagebody#1{\vbox to\txipageheight{\boxmaxdepth=\maxdepth #1}} {\catcode`\@ =11 \gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi % marginal hacks, juha@viisa.uucp (Juha Takala) \ifvoid\margin\else % marginal info is present \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi \dimen@=\dp#1\relax \unvbox#1\relax \ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi \ifr@ggedbottom \kern-\dimen@ \vfil \fi} } % Check if we are on the first page of a chapter. Used for printing headings. \newif\ifchapterpage \def\checkchapterpage{% % Get the chapter that was current at the end of the last page \ifcase1\the\savedtopmark\fi \let\prevchaptername\thischaptername % \ifodd\pageno \getoddheadingmarks \else \getevenheadingmarks \fi \let\curchaptername\thischaptername % \ifx\curchaptername\prevchaptername \chapterpagefalse \else \chapterpagetrue \fi } % Argument parsing % Parse an argument, then pass it to #1. The argument is the rest of % the input line (except we remove a trailing comment). #1 should be a % macro which expects an ordinary undelimited TeX argument. % For example, \def\foo{\parsearg\fooxxx}. % \def\parsearg{\parseargusing{}} \def\parseargusing#1#2{% \def\argtorun{#2}% \begingroup \obeylines \spaceisspace #1% \parseargline\empty% Insert the \empty token, see \finishparsearg below. } {\obeylines % \gdef\parseargline#1^^M{% \endgroup % End of the group started in \parsearg. \argremovecomment #1\comment\ArgTerm% }% } % First remove any @comment, then any @c comment. Pass the result on to % \argcheckspaces. \def\argremovecomment#1\comment#2\ArgTerm{\argremovec #1\c\ArgTerm} \def\argremovec#1\c#2\ArgTerm{\argcheckspaces#1\^^M\ArgTerm} % Each occurrence of `\^^M' or `\^^M' is replaced by a single space. % % \argremovec might leave us with trailing space, e.g., % @end itemize @c foo % This space token undergoes the same procedure and is eventually removed % by \finishparsearg. % \def\argcheckspaces#1\^^M{\argcheckspacesX#1\^^M \^^M} \def\argcheckspacesX#1 \^^M{\argcheckspacesY#1\^^M} \def\argcheckspacesY#1\^^M#2\^^M#3\ArgTerm{% \def\temp{#3}% \ifx\temp\empty % Do not use \next, perhaps the caller of \parsearg uses it; reuse \temp: \let\temp\finishparsearg \else \let\temp\argcheckspaces \fi % Put the space token in: \temp#1 #3\ArgTerm } % If a _delimited_ argument is enclosed in braces, they get stripped; so % to get _exactly_ the rest of the line, we had to prevent such situation. % We prepended an \empty token at the very beginning and we expand it now, % just before passing the control to \argtorun. % (Similarly, we have to think about #3 of \argcheckspacesY above: it is % either the null string, or it ends with \^^M---thus there is no danger % that a pair of braces would be stripped. % % But first, we have to remove the trailing space token. % \def\finishparsearg#1 \ArgTerm{\expandafter\argtorun\expandafter{#1}} % \parseargdef - define a command taking an argument on the line % % \parseargdef\foo{...} % is roughly equivalent to % \def\foo{\parsearg\Xfoo} % \def\Xfoo#1{...} \def\parseargdef#1{% \expandafter \doparseargdef \csname\string#1\endcsname #1% } \def\doparseargdef#1#2{% \def#2{\parsearg#1}% \def#1##1% } % Several utility definitions with active space: { \obeyspaces \gdef\obeyedspace{ } % Make each space character in the input produce a normal interword % space in the output. Don't allow a line break at this space, as this % is used only in environments like @example, where each line of input % should produce a line of output anyway. % \gdef\sepspaces{\obeyspaces\let =\tie} % If an index command is used in an @example environment, any spaces % therein should become regular spaces in the raw index file, not the % expansion of \tie (\leavevmode \penalty \@M \ ). \gdef\unsepspaces{\let =\space} } \def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next} % Define the framework for environments in texinfo.tex. It's used like this: % % \envdef\foo{...} % \def\Efoo{...} % % It's the responsibility of \envdef to insert \begingroup before the % actual body; @end closes the group after calling \Efoo. \envdef also % defines \thisenv, so the current environment is known; @end checks % whether the environment name matches. The \checkenv macro can also be % used to check whether the current environment is the one expected. % % Non-false conditionals (@iftex, @ifset) don't fit into this, so they % are not treated as environments; they don't open a group. (The % implementation of @end takes care not to call \endgroup in this % special case.) % At run-time, environments start with this: \def\startenvironment#1{\begingroup\def\thisenv{#1}} % initialize \let\thisenv\empty % ... but they get defined via ``\envdef\foo{...}'': \long\def\envdef#1#2{\def#1{\startenvironment#1#2}} \def\envparseargdef#1#2{\parseargdef#1{\startenvironment#1#2}} % Check whether we're in the right environment: \def\checkenv#1{% \def\temp{#1}% \ifx\thisenv\temp \else \badenverr \fi } % Environment mismatch, #1 expected: \def\badenverr{% \errhelp = \EMsimple \errmessage{This command can appear only \inenvironment\temp, not \inenvironment\thisenv}% } \def\inenvironment#1{% \ifx#1\empty outside of any environment% \else in environment \expandafter\string#1% \fi } % @end foo calls \checkenv and executes the definition of \Efoo. \parseargdef\end{% \if 1\csname iscond.#1\endcsname \else % The general wording of \badenverr may not be ideal. \expandafter\checkenv\csname#1\endcsname \csname E#1\endcsname \endgroup \fi } \newhelp\EMsimple{Press RETURN to continue.} % Be sure we're in horizontal mode when doing a tie, since we make space % equivalent to this in @example-like environments. Otherwise, a space % at the beginning of a line will start with \penalty -- and % since \penalty is valid in vertical mode, we'd end up putting the % penalty on the vertical list instead of in the new paragraph. {\catcode`@ = 11 % Avoid using \@M directly, because that causes trouble % if the definition is written into an index file. \global\let\tiepenalty = \@M \gdef\tie{\leavevmode\penalty\tiepenalty\ } } % @: forces normal size whitespace following. \def\:{\spacefactor=1000 } % @* forces a line break. \def\*{\unskip\hfil\break\hbox{}\ignorespaces} % @/ allows a line break. \let\/=\allowbreak % @. is an end-of-sentence period. \def\.{.\spacefactor=\endofsentencespacefactor\space} % @! is an end-of-sentence bang. \def\!{!\spacefactor=\endofsentencespacefactor\space} % @? is an end-of-sentence query. \def\?{?\spacefactor=\endofsentencespacefactor\space} % @frenchspacing on|off says whether to put extra space after punctuation. % \def\onword{on} \def\offword{off} % \parseargdef\frenchspacing{% \def\temp{#1}% \ifx\temp\onword \plainfrenchspacing \else\ifx\temp\offword \plainnonfrenchspacing \else \errhelp = \EMsimple \errmessage{Unknown @frenchspacing option `\temp', must be on|off}% \fi\fi } % @w prevents a word break. Without the \leavevmode, @w at the % beginning of a paragraph, when TeX is still in vertical mode, would % produce a whole line of output instead of starting the paragraph. \def\w#1{\leavevmode\hbox{#1}} % @group ... @end group forces ... to be all on one page, by enclosing % it in a TeX vbox. We use \vtop instead of \vbox to construct the box % to keep its height that of a normal line. According to the rules for % \topskip (p.114 of the TeXbook), the glue inserted is % max (\topskip - \ht (first item), 0). If that height is large, % therefore, no glue is inserted, and the space between the headline and % the text is small, which looks bad. % % Another complication is that the group might be very large. This can % cause the glue on the previous page to be unduly stretched, because it % does not have much material. In this case, it's better to add an % explicit \vfill so that the extra space is at the bottom. The % threshold for doing this is if the group is more than \vfilllimit % percent of a page (\vfilllimit can be changed inside of @tex). % \newbox\groupbox \def\vfilllimit{0.7} % \envdef\group{% \ifnum\catcode`\^^M=\active \else \errhelp = \groupinvalidhelp \errmessage{@group invalid in context where filling is enabled}% \fi \startsavinginserts % \setbox\groupbox = \vtop\bgroup % Do @comment since we are called inside an environment such as % @example, where each end-of-line in the input causes an % end-of-line in the output. We don't want the end-of-line after % the `@group' to put extra space in the output. Since @group % should appear on a line by itself (according to the Texinfo % manual), we don't worry about eating any user text. \comment } % % The \vtop produces a box with normal height and large depth; thus, TeX puts % \baselineskip glue before it, and (when the next line of text is done) % \lineskip glue after it. Thus, space below is not quite equal to space % above. But it's pretty close. \def\Egroup{% % To get correct interline space between the last line of the group % and the first line afterwards, we have to propagate \prevdepth. \endgraf % Not \par, as it may have been set to \lisppar. \global\dimen1 = \prevdepth \egroup % End the \vtop. \addgroupbox \prevdepth = \dimen1 \checkinserts } \def\addgroupbox{ % \dimen0 is the vertical size of the group's box. \dimen0 = \ht\groupbox \advance\dimen0 by \dp\groupbox % \dimen2 is how much space is left on the page (more or less). \dimen2 = \txipageheight \advance\dimen2 by -\pagetotal % if the group doesn't fit on the current page, and it's a big big % group, force a page break. \ifdim \dimen0 > \dimen2 \ifdim \pagetotal < \vfilllimit\txipageheight \page \fi \fi \box\groupbox } % % TeX puts in an \escapechar (i.e., `@') at the beginning of the help % message, so this ends up printing `@group can only ...'. % \newhelp\groupinvalidhelp{% group can only be used in environments such as @example,^^J% where each line of input produces a line of output.} % @need space-in-mils % forces a page break if there is not space-in-mils remaining. \newdimen\mil \mil=0.001in \parseargdef\need{% % Ensure vertical mode, so we don't make a big box in the middle of a % paragraph. \par % % If the @need value is less than one line space, it's useless. \dimen0 = #1\mil \dimen2 = \ht\strutbox \advance\dimen2 by \dp\strutbox \ifdim\dimen0 > \dimen2 % % Do a \strut just to make the height of this box be normal, so the % normal leading is inserted relative to the preceding line. % And a page break here is fine. \vtop to #1\mil{\strut\vfil}% % % TeX does not even consider page breaks if a penalty added to the % main vertical list is 10000 or more. But in order to see if the % empty box we just added fits on the page, we must make it consider % page breaks. On the other hand, we don't want to actually break the % page after the empty box. So we use a penalty of 9999. % % There is an extremely small chance that TeX will actually break the % page at this \penalty, if there are no other feasible breakpoints in % sight. (If the user is using lots of big @group commands, which % almost-but-not-quite fill up a page, TeX will have a hard time doing % good page breaking, for example.) However, I could not construct an % example where a page broke at this \penalty; if it happens in a real % document, then we can reconsider our strategy. \penalty9999 % % Back up by the size of the box, whether we did a page break or not. \kern -#1\mil % % Do not allow a page break right after this kern. \nobreak \fi } % @br forces paragraph break (and is undocumented). \let\br = \par % @page forces the start of a new page. % \def\page{\par\vfill\supereject} % @exdent text.... % outputs text on separate line in roman font, starting at standard page margin % This records the amount of indent in the innermost environment. % That's how much \exdent should take out. \newskip\exdentamount % This defn is used inside fill environments such as @defun. \parseargdef\exdent{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break} % This defn is used inside nofill environments such as @example. \parseargdef\nofillexdent{{\advance \leftskip by -\exdentamount \leftline{\hskip\leftskip{\rm#1}}}} % @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current % paragraph. For more general purposes, use the \margin insertion % class. WHICH is `l' or `r'. Not documented, written for gawk manual. % \newskip\inmarginspacing \inmarginspacing=1cm \def\strutdepth{\dp\strutbox} % \def\doinmargin#1#2{\strut\vadjust{% \nobreak \kern-\strutdepth \vtop to \strutdepth{% \baselineskip=\strutdepth \vss % if you have multiple lines of stuff to put here, you'll need to % make the vbox yourself of the appropriate size. \ifx#1l% \llap{\ignorespaces #2\hskip\inmarginspacing}% \else \rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}% \fi \null }% }} \def\inleftmargin{\doinmargin l} \def\inrightmargin{\doinmargin r} % % @inmargin{TEXT [, RIGHT-TEXT]} % (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right; % else use TEXT for both). % \def\inmargin#1{\parseinmargin #1,,\finish} \def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing. \setbox0 = \hbox{\ignorespaces #2}% \ifdim\wd0 > 0pt \def\lefttext{#1}% have both texts \def\righttext{#2}% \else \def\lefttext{#1}% have only one text \def\righttext{#1}% \fi % \ifodd\pageno \def\temp{\inrightmargin\righttext}% odd page -> outside is right margin \else \def\temp{\inleftmargin\lefttext}% \fi \temp } % @include FILE -- \input text of FILE. % \def\include{\parseargusing\filenamecatcodes\includezzz} \def\includezzz#1{% \pushthisfilestack \def\thisfile{#1}% {% \makevalueexpandable % we want to expand any @value in FILE. \turnoffactive % and allow special characters in the expansion \indexnofonts % Allow `@@' and other weird things in file names. \wlog{texinfo.tex: doing @include of #1^^J}% \edef\temp{\noexpand\input #1 }% % % This trickery is to read FILE outside of a group, in case it makes % definitions, etc. \expandafter }\temp \popthisfilestack } \def\filenamecatcodes{% \catcode`\\=\other \catcode`~=\other \catcode`^=\other \catcode`_=\other \catcode`|=\other \catcode`<=\other \catcode`>=\other \catcode`+=\other \catcode`-=\other \catcode`\`=\other \catcode`\'=\other } \def\pushthisfilestack{% \expandafter\pushthisfilestackX\popthisfilestack\StackTerm } \def\pushthisfilestackX{% \expandafter\pushthisfilestackY\thisfile\StackTerm } \def\pushthisfilestackY #1\StackTerm #2\StackTerm {% \gdef\popthisfilestack{\gdef\thisfile{#1}\gdef\popthisfilestack{#2}}% } \def\popthisfilestack{\errthisfilestackempty} \def\errthisfilestackempty{\errmessage{Internal error: the stack of filenames is empty.}} % \def\thisfile{} % @center line % outputs that line, centered. % \parseargdef\center{% \ifhmode \let\centersub\centerH \else \let\centersub\centerV \fi \centersub{\hfil \ignorespaces#1\unskip \hfil}% \let\centersub\relax % don't let the definition persist, just in case } \def\centerH#1{{% \hfil\break \advance\hsize by -\leftskip \advance\hsize by -\rightskip \line{#1}% \break }} % \newcount\centerpenalty \def\centerV#1{% % The idea here is the same as in \startdefun, \cartouche, etc.: if % @center is the first thing after a section heading, we need to wipe % out the negative parskip inserted by \sectionheading, but still % prevent a page break here. \centerpenalty = \lastpenalty \ifnum\centerpenalty>10000 \vskip\parskip \fi \ifnum\centerpenalty>9999 \penalty\centerpenalty \fi \line{\kern\leftskip #1\kern\rightskip}% } % @sp n outputs n lines of vertical space % \parseargdef\sp{\vskip #1\baselineskip} % @comment ...line which is ignored... % @c is the same as @comment % @ignore ... @end ignore is another way to write a comment \def\c{\begingroup \catcode`\^^M=\active% \catcode`\@=\other \catcode`\{=\other \catcode`\}=\other% \cxxx} {\catcode`\^^M=\active \gdef\cxxx#1^^M{\endgroup}} % \let\comment\c % @paragraphindent NCHARS % We'll use ems for NCHARS, close enough. % NCHARS can also be the word `asis' or `none'. % We cannot feasibly implement @paragraphindent asis, though. % \def\asisword{asis} % no translation, these are keywords \def\noneword{none} % \parseargdef\paragraphindent{% \def\temp{#1}% \ifx\temp\asisword \else \ifx\temp\noneword \defaultparindent = 0pt \else \defaultparindent = #1em \fi \fi \parindent = \defaultparindent } % @exampleindent NCHARS % We'll use ems for NCHARS like @paragraphindent. % It seems @exampleindent asis isn't necessary, but % I preserve it to make it similar to @paragraphindent. \parseargdef\exampleindent{% \def\temp{#1}% \ifx\temp\asisword \else \ifx\temp\noneword \lispnarrowing = 0pt \else \lispnarrowing = #1em \fi \fi } % @firstparagraphindent WORD % If WORD is `none', then suppress indentation of the first paragraph % after a section heading. If WORD is `insert', then do indent at such % paragraphs. % % The paragraph indentation is suppressed or not by calling % \suppressfirstparagraphindent, which the sectioning commands do. % We switch the definition of this back and forth according to WORD. % By default, we suppress indentation. % \def\suppressfirstparagraphindent{\dosuppressfirstparagraphindent} \def\insertword{insert} % \parseargdef\firstparagraphindent{% \def\temp{#1}% \ifx\temp\noneword \let\suppressfirstparagraphindent = \dosuppressfirstparagraphindent \else\ifx\temp\insertword \let\suppressfirstparagraphindent = \relax \else \errhelp = \EMsimple \errmessage{Unknown @firstparagraphindent option `\temp'}% \fi\fi } % Here is how we actually suppress indentation. Redefine \everypar to % \kern backwards by \parindent, and then reset itself to empty. % % We also make \indent itself not actually do anything until the next % paragraph. % \gdef\dosuppressfirstparagraphindent{% \gdef\indent {\restorefirstparagraphindent \indent}% \gdef\noindent{\restorefirstparagraphindent \noindent}% \global\everypar = {\kern -\parindent \restorefirstparagraphindent}% } % \gdef\restorefirstparagraphindent{% \global\let\indent = \ptexindent \global\let\noindent = \ptexnoindent \global\everypar = {}% } % leave vertical mode without cancelling any first paragraph indent \gdef\imageindent{% \toks0=\everypar \everypar={}% \ptexnoindent \global\everypar=\toks0 } % @refill is a no-op. \let\refill=\relax % @setfilename INFO-FILENAME - ignored \let\setfilename=\comment % @bye. \outer\def\bye{\chappager\pagelabels\tracingstats=1\ptexend} \message{pdf,} % adobe `portable' document format \newcount\tempnum \newcount\lnkcount \newtoks\filename \newcount\filenamelength \newcount\pgn \newtoks\toksA \newtoks\toksB \newtoks\toksC \newtoks\toksD \newbox\boxA \newbox\boxB \newcount\countA \newif\ifpdf \newif\ifpdfmakepagedest % % For LuaTeX % \newif\iftxiuseunicodedestname \txiuseunicodedestnamefalse % For pdfTeX etc. \ifx\luatexversion\thisisundefined \else % Use Unicode destination names \txiuseunicodedestnametrue % Escape PDF strings with converting UTF-16 from UTF-8 \begingroup \catcode`\%=12 \directlua{ function UTF16oct(str) tex.sprint(string.char(0x5c) .. '376' .. string.char(0x5c) .. '377') for c in string.utfvalues(str) do if c < 0x10000 then tex.sprint( string.format(string.char(0x5c) .. string.char(0x25) .. '03o' .. string.char(0x5c) .. string.char(0x25) .. '03o', math.floor(c / 256), math.floor(c % 256))) else c = c - 0x10000 local c_hi = c / 1024 + 0xd800 local c_lo = c % 1024 + 0xdc00 tex.sprint( string.format(string.char(0x5c) .. string.char(0x25) .. '03o' .. string.char(0x5c) .. string.char(0x25) .. '03o' .. string.char(0x5c) .. string.char(0x25) .. '03o' .. string.char(0x5c) .. string.char(0x25) .. '03o', math.floor(c_hi / 256), math.floor(c_hi % 256), math.floor(c_lo / 256), math.floor(c_lo % 256))) end end end } \endgroup \def\pdfescapestrutfsixteen#1{\directlua{UTF16oct('\luaescapestring{#1}')}} % Escape PDF strings without converting \begingroup \directlua{ function PDFescstr(str) for c in string.bytes(str) do if c <= 0x20 or c >= 0x80 or c == 0x28 or c == 0x29 or c == 0x5c then tex.sprint(-2, string.format(string.char(0x5c) .. string.char(0x25) .. '03o', c)) else tex.sprint(-2, string.char(c)) end end end } % The -2 in the arguments here gives all the input to TeX catcode 12 % (other) or 10 (space), preventing undefined control sequence errors. See % https://lists.gnu.org/archive/html/bug-texinfo/2019-08/msg00031.html % \endgroup \def\pdfescapestring#1{\directlua{PDFescstr('\luaescapestring{#1}')}} \ifnum\luatexversion>84 % For LuaTeX >= 0.85 \def\pdfdest{\pdfextension dest} \let\pdfoutput\outputmode \def\pdfliteral{\pdfextension literal} \def\pdfcatalog{\pdfextension catalog} \def\pdftexversion{\numexpr\pdffeedback version\relax} \let\pdfximage\saveimageresource \let\pdfrefximage\useimageresource \let\pdflastximage\lastsavedimageresourceindex \def\pdfendlink{\pdfextension endlink\relax} \def\pdfoutline{\pdfextension outline} \def\pdfstartlink{\pdfextension startlink} \def\pdffontattr{\pdfextension fontattr} \def\pdfobj{\pdfextension obj} \def\pdflastobj{\numexpr\pdffeedback lastobj\relax} \let\pdfpagewidth\pagewidth \let\pdfpageheight\pageheight \edef\pdfhorigin{\pdfvariable horigin} \edef\pdfvorigin{\pdfvariable vorigin} \fi \fi % when pdftex is run in dvi mode, \pdfoutput is defined (so \pdfoutput=1 % can be set). So we test for \relax and 0 as well as being undefined. \ifx\pdfoutput\thisisundefined \else \ifx\pdfoutput\relax \else \ifcase\pdfoutput \else \pdftrue \fi \fi \fi \newif\ifpdforxetex \pdforxetexfalse \ifpdf \pdforxetextrue \fi \ifx\XeTeXrevision\thisisundefined\else \pdforxetextrue \fi % Output page labels information. % See PDF reference v.1.7 p.594, section 8.3.1. \ifpdf \def\pagelabels{% \def\title{0 << /P (T-) /S /D >>}% \edef\roman{\the\romancount << /S /r >>}% \edef\arabic{\the\arabiccount << /S /D >>}% % % Page label ranges must be increasing. Remove any duplicates. % (There is a slight chance of this being wrong if e.g. there is % a @contents but no @titlepage, etc.) % \ifnum\romancount=0 \def\roman{}\fi \ifnum\arabiccount=0 \def\title{}% \else \ifnum\romancount=\arabiccount \def\roman{}\fi \fi % \ifnum\romancount<\arabiccount \pdfcatalog{/PageLabels << /Nums [\title \roman \arabic ] >> }\relax \else \pdfcatalog{/PageLabels << /Nums [\title \arabic \roman ] >> }\relax \fi } \else \let\pagelabels\relax \fi \newcount\pagecount \pagecount=0 \newcount\romancount \romancount=0 \newcount\arabiccount \arabiccount=0 \ifpdf \let\ptxadvancepageno\advancepageno \def\advancepageno{% \ptxadvancepageno\global\advance\pagecount by 1 } \fi % PDF uses PostScript string constants for the names of xref targets, % for display in the outlines, and in other places. Thus, we have to % double any backslashes. Otherwise, a name like "\node" will be % interpreted as a newline (\n), followed by o, d, e. Not good. % % See http://www.ntg.nl/pipermail/ntg-pdftex/2004-July/000654.html and % related messages. The final outcome is that it is up to the TeX user % to double the backslashes and otherwise make the string valid, so % that's what we do. pdftex 1.30.0 (ca.2005) introduced a primitive to % do this reliably, so we use it. % #1 is a control sequence in which to do the replacements, % which we \xdef. \def\txiescapepdf#1{% \ifx\pdfescapestring\thisisundefined % No primitive available; should we give a warning or log? % Many times it won't matter. \xdef#1{#1}% \else % The expandable \pdfescapestring primitive escapes parentheses, % backslashes, and other special chars. \xdef#1{\pdfescapestring{#1}}% \fi } \def\txiescapepdfutfsixteen#1{% \ifx\pdfescapestrutfsixteen\thisisundefined % No UTF-16 converting macro available. \txiescapepdf{#1}% \else \xdef#1{\pdfescapestrutfsixteen{#1}}% \fi } \newhelp\nopdfimagehelp{Texinfo supports .png, .jpg, .jpeg, and .pdf images with PDF output, and none of those formats could be found. (.eps cannot be supported due to the design of the PDF format; use regular TeX (DVI output) for that.)} \ifpdf % % Color manipulation macros using ideas from pdfcolor.tex, % except using rgb instead of cmyk; the latter is said to render as a % very dark gray on-screen and a very dark halftone in print, instead % of actual black. The dark red here is dark enough to print on paper as % nearly black, but still distinguishable for online viewing. We use % black by default, though. \def\rgbDarkRed{0.50 0.09 0.12} \def\rgbBlack{0 0 0} % % rg sets the color for filling (usual text, etc.); % RG sets the color for stroking (thin rules, e.g., normal _'s). \def\pdfsetcolor#1{\pdfliteral{#1 rg #1 RG}} % % Set color, and create a mark which defines \thiscolor accordingly, % so that \makeheadline knows which color to restore. \def\setcolor#1{% \xdef\currentcolordefs{\gdef\noexpand\thiscolor{#1}}% \domark \pdfsetcolor{#1}% } % \def\maincolor{\rgbBlack} \pdfsetcolor{\maincolor} \edef\thiscolor{\maincolor} \def\currentcolordefs{} % \def\makefootline{% \baselineskip24pt \line{\pdfsetcolor{\maincolor}\the\footline}% } % \def\makeheadline{% \vbox to 0pt{% \vskip-22.5pt \line{% \vbox to8.5pt{}% % Extract \thiscolor definition from the marks. \getcolormarks % Typeset the headline with \maincolor, then restore the color. \pdfsetcolor{\maincolor}\the\headline\pdfsetcolor{\thiscolor}% }% \vss }% \nointerlineskip } % % \pdfcatalog{/PageMode /UseOutlines} % % #1 is image name, #2 width (might be empty/whitespace), #3 height (ditto). \def\dopdfimage#1#2#3{% \def\pdfimagewidth{#2}\setbox0 = \hbox{\ignorespaces #2}% \def\pdfimageheight{#3}\setbox2 = \hbox{\ignorespaces #3}% % % pdftex (and the PDF format) support .pdf, .png, .jpg (among % others). Let's try in that order, PDF first since if % someone has a scalable image, presumably better to use that than a % bitmap. \let\pdfimgext=\empty \begingroup \openin 1 #1.pdf \ifeof 1 \openin 1 #1.PDF \ifeof 1 \openin 1 #1.png \ifeof 1 \openin 1 #1.jpg \ifeof 1 \openin 1 #1.jpeg \ifeof 1 \openin 1 #1.JPG \ifeof 1 \errhelp = \nopdfimagehelp \errmessage{Could not find image file #1 for pdf}% \else \gdef\pdfimgext{JPG}% \fi \else \gdef\pdfimgext{jpeg}% \fi \else \gdef\pdfimgext{jpg}% \fi \else \gdef\pdfimgext{png}% \fi \else \gdef\pdfimgext{PDF}% \fi \else \gdef\pdfimgext{pdf}% \fi \closein 1 \endgroup % % without \immediate, ancient pdftex seg faults when the same image is % included twice. (Version 3.14159-pre-1.0-unofficial-20010704.) \ifnum\pdftexversion < 14 \immediate\pdfimage \else \immediate\pdfximage \fi \ifdim \wd0 >0pt width \pdfimagewidth \fi \ifdim \wd2 >0pt height \pdfimageheight \fi \ifnum\pdftexversion<13 #1.\pdfimgext \else {#1.\pdfimgext}% \fi \ifnum\pdftexversion < 14 \else \pdfrefximage \pdflastximage \fi} % \def\setpdfdestname#1{{% % We have to set dummies so commands such as @code, and characters % such as \, aren't expanded when present in a section title. \indexnofonts \makevalueexpandable \turnoffactive \iftxiuseunicodedestname \ifx \declaredencoding \latone % Pass through Latin-1 characters. % LuaTeX with byte wise I/O converts Latin-1 characters to Unicode. \else \ifx \declaredencoding \utfeight % Pass through Unicode characters. \else % Use ASCII approximations in destination names. \passthroughcharsfalse \fi \fi \else % Use ASCII approximations in destination names. \passthroughcharsfalse \fi \def\pdfdestname{#1}% \txiescapepdf\pdfdestname }} % \def\setpdfoutlinetext#1{{% \indexnofonts \makevalueexpandable \turnoffactive \ifx \declaredencoding \latone % The PDF format can use an extended form of Latin-1 in bookmark % strings. See Appendix D of the PDF Reference, Sixth Edition, for % the "PDFDocEncoding". \passthroughcharstrue % Pass through Latin-1 characters. % LuaTeX: Convert to Unicode % pdfTeX: Use Latin-1 as PDFDocEncoding \def\pdfoutlinetext{#1}% \else \ifx \declaredencoding \utfeight \ifx\luatexversion\thisisundefined % For pdfTeX with UTF-8. % TODO: the PDF format can use UTF-16 in bookmark strings, % but the code for this isn't done yet. % Use ASCII approximations. \passthroughcharsfalse \def\pdfoutlinetext{#1}% \else % For LuaTeX with UTF-8. % Pass through Unicode characters for title texts. \passthroughcharstrue \def\pdfoutlinetext{#1}% \fi \else % For non-Latin-1 or non-UTF-8 encodings. % Use ASCII approximations. \passthroughcharsfalse \def\pdfoutlinetext{#1}% \fi \fi % LuaTeX: Convert to UTF-16 % pdfTeX: Use Latin-1 as PDFDocEncoding \txiescapepdfutfsixteen\pdfoutlinetext }} % \def\pdfmkdest#1{% \setpdfdestname{#1}% \safewhatsit{\pdfdest name{\pdfdestname} xyz}% } % % used to mark target names; must be expandable. \def\pdfmkpgn#1{#1} % % by default, use black for everything. \def\urlcolor{\rgbBlack} \def\linkcolor{\rgbBlack} \def\endlink{\setcolor{\maincolor}\pdfendlink} % % Adding outlines to PDF; macros for calculating structure of outlines % come from Petr Olsak \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0% \else \csname#1\endcsname \fi} \def\advancenumber#1{\tempnum=\expnumber{#1}\relax \advance\tempnum by 1 \expandafter\xdef\csname#1\endcsname{\the\tempnum}} % % #1 is the section text, which is what will be displayed in the % outline by the pdf viewer. #2 is the pdf expression for the number % of subentries (or empty, for subsubsections). #3 is the node text, % which might be empty if this toc entry had no corresponding node. % #4 is the page number % \def\dopdfoutline#1#2#3#4{% % Generate a link to the node text if that exists; else, use the % page number. We could generate a destination for the section % text in the case where a section has no node, but it doesn't % seem worth the trouble, since most documents are normally structured. \setpdfoutlinetext{#1} \setpdfdestname{#3} \ifx\pdfdestname\empty \def\pdfdestname{#4}% \fi % \pdfoutline goto name{\pdfmkpgn{\pdfdestname}}#2{\pdfoutlinetext}% } % \def\pdfmakeoutlines{% \begingroup % Read toc silently, to get counts of subentries for \pdfoutline. \def\partentry##1##2##3##4{}% ignore parts in the outlines \def\numchapentry##1##2##3##4{% \def\thischapnum{##2}% \def\thissecnum{0}% \def\thissubsecnum{0}% }% \def\numsecentry##1##2##3##4{% \advancenumber{chap\thischapnum}% \def\thissecnum{##2}% \def\thissubsecnum{0}% }% \def\numsubsecentry##1##2##3##4{% \advancenumber{sec\thissecnum}% \def\thissubsecnum{##2}% }% \def\numsubsubsecentry##1##2##3##4{% \advancenumber{subsec\thissubsecnum}% }% \def\thischapnum{0}% \def\thissecnum{0}% \def\thissubsecnum{0}% % % use \def rather than \let here because we redefine \chapentry et % al. a second time, below. \def\appentry{\numchapentry}% \def\appsecentry{\numsecentry}% \def\appsubsecentry{\numsubsecentry}% \def\appsubsubsecentry{\numsubsubsecentry}% \def\unnchapentry{\numchapentry}% \def\unnsecentry{\numsecentry}% \def\unnsubsecentry{\numsubsecentry}% \def\unnsubsubsecentry{\numsubsubsecentry}% \readdatafile{toc}% % % Read toc second time, this time actually producing the outlines. % The `-' means take the \expnumber as the absolute number of % subentries, which we calculated on our first read of the .toc above. % % We use the node names as the destinations. % % Currently we prefix the section name with the section number % for chapter and appendix headings only in order to avoid too much % horizontal space being required in the PDF viewer. \def\numchapentry##1##2##3##4{% \dopdfoutline{##2 ##1}{count-\expnumber{chap##2}}{##3}{##4}}% \def\unnchapentry##1##2##3##4{% \dopdfoutline{##1}{count-\expnumber{chap##2}}{##3}{##4}}% \def\numsecentry##1##2##3##4{% \dopdfoutline{##1}{count-\expnumber{sec##2}}{##3}{##4}}% \def\numsubsecentry##1##2##3##4{% \dopdfoutline{##1}{count-\expnumber{subsec##2}}{##3}{##4}}% \def\numsubsubsecentry##1##2##3##4{% count is always zero \dopdfoutline{##1}{}{##3}{##4}}% % % PDF outlines are displayed using system fonts, instead of % document fonts. Therefore we cannot use special characters, % since the encoding is unknown. For example, the eogonek from % Latin 2 (0xea) gets translated to a | character. Info from % Staszek Wawrykiewicz, 19 Jan 2004 04:09:24 +0100. % % TODO this right, we have to translate 8-bit characters to % their "best" equivalent, based on the @documentencoding. Too % much work for too little return. Just use the ASCII equivalents % we use for the index sort strings. % \indexnofonts \setupdatafile % We can have normal brace characters in the PDF outlines, unlike % Texinfo index files. So set that up. \def\{{\lbracecharliteral}% \def\}{\rbracecharliteral}% \catcode`\\=\active \otherbackslash \input \tocreadfilename \endgroup } {\catcode`[=1 \catcode`]=2 \catcode`{=\other \catcode`}=\other \gdef\lbracecharliteral[{]% \gdef\rbracecharliteral[}]% ] % \def\skipspaces#1{\def\PP{#1}\def\D{|}% \ifx\PP\D\let\nextsp\relax \else\let\nextsp\skipspaces \addtokens{\filename}{\PP}% \advance\filenamelength by 1 \fi \nextsp} \def\getfilename#1{% \filenamelength=0 % If we don't expand the argument now, \skipspaces will get % snagged on things like "@value{foo}". \edef\temp{#1}% \expandafter\skipspaces\temp|\relax } \ifnum\pdftexversion < 14 \let \startlink \pdfannotlink \else \let \startlink \pdfstartlink \fi % make a live url in pdf output. \def\pdfurl#1{% \begingroup % it seems we really need yet another set of dummies; have not % tried to figure out what each command should do in the context % of @url. for now, just make @/ a no-op, that's the only one % people have actually reported a problem with. % \normalturnoffactive \def\@{@}% \let\/=\empty \makevalueexpandable % do we want to go so far as to use \indexnofonts instead of just % special-casing \var here? \def\var##1{##1}% % \leavevmode\setcolor{\urlcolor}% \startlink attr{/Border [0 0 0]}% user{/Subtype /Link /A << /S /URI /URI (#1) >>}% \endgroup} % \pdfgettoks - Surround page numbers in #1 with @pdflink. #1 may % be a simple number, or a list of numbers in the case of an index % entry. \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}} \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks} \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks} \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}} \def\maketoks{% \expandafter\poptoks\the\toksA|ENDTOKS|\relax \ifx\first0\adn0 \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3 \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6 \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9 \else \ifnum0=\countA\else\makelink\fi \ifx\first.\let\next=\done\else \let\next=\maketoks \addtokens{\toksB}{\the\toksD} \ifx\first,\addtokens{\toksB}{\space}\fi \fi \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \next} \def\makelink{\addtokens{\toksB}% {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0} \def\pdflink#1{% \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}} \setcolor{\linkcolor}#1\endlink} \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st} \else % non-pdf mode \let\pdfmkdest = \gobble \let\pdfurl = \gobble \let\endlink = \relax \let\setcolor = \gobble \let\pdfsetcolor = \gobble \let\pdfmakeoutlines = \relax \fi % \ifx\pdfoutput % % For XeTeX % \ifx\XeTeXrevision\thisisundefined \else % % XeTeX version check % \ifnum\strcmp{\the\XeTeXversion\XeTeXrevision}{0.99996}>-1 % TeX Live 2016 contains XeTeX 0.99996 and xdvipdfmx 20160307. % It can use the `dvipdfmx:config' special (from TeX Live SVN r40941). % For avoiding PDF destination name replacement, we use this special % instead of xdvipdfmx's command line option `-C 0x0010'. \special{dvipdfmx:config C 0x0010} % XeTeX 0.99995+ comes with xdvipdfmx 20160307+. % It can handle Unicode destination names for PDF. \txiuseunicodedestnametrue \else % XeTeX < 0.99996 (TeX Live < 2016) cannot use the % `dvipdfmx:config' special. % So for avoiding PDF destination name replacement, % xdvipdfmx's command line option `-C 0x0010' is necessary. % % XeTeX < 0.99995 can not handle Unicode destination names for PDF % because xdvipdfmx 20150315 has a UTF-16 conversion issue. % It is fixed by xdvipdfmx 20160106 (TeX Live SVN r39753). \txiuseunicodedestnamefalse \fi % % Color support % \def\rgbDarkRed{0.50 0.09 0.12} \def\rgbBlack{0 0 0} % \def\pdfsetcolor#1{\special{pdf:scolor [#1]}} % % Set color, and create a mark which defines \thiscolor accordingly, % so that \makeheadline knows which color to restore. \def\setcolor#1{% \xdef\currentcolordefs{\gdef\noexpand\thiscolor{#1}}% \domark \pdfsetcolor{#1}% } % \def\maincolor{\rgbBlack} \pdfsetcolor{\maincolor} \edef\thiscolor{\maincolor} \def\currentcolordefs{} % \def\makefootline{% \baselineskip24pt \line{\pdfsetcolor{\maincolor}\the\footline}% } % \def\makeheadline{% \vbox to 0pt{% \vskip-22.5pt \line{% \vbox to8.5pt{}% % Extract \thiscolor definition from the marks. \getcolormarks % Typeset the headline with \maincolor, then restore the color. \pdfsetcolor{\maincolor}\the\headline\pdfsetcolor{\thiscolor}% }% \vss }% \nointerlineskip } % % PDF outline support % % Emulate pdfTeX primitive \def\pdfdest name#1 xyz{% \special{pdf:dest (#1) [@thispage /XYZ @xpos @ypos null]}% } % \def\setpdfdestname#1{{% % We have to set dummies so commands such as @code, and characters % such as \, aren't expanded when present in a section title. \indexnofonts \makevalueexpandable \turnoffactive \iftxiuseunicodedestname % Pass through Unicode characters. \else % Use ASCII approximations in destination names. \passthroughcharsfalse \fi \def\pdfdestname{#1}% \txiescapepdf\pdfdestname }} % \def\setpdfoutlinetext#1{{% \turnoffactive % Always use Unicode characters in title texts. \def\pdfoutlinetext{#1}% % For XeTeX, xdvipdfmx converts to UTF-16. % So we do not convert. \txiescapepdf\pdfoutlinetext }} % \def\pdfmkdest#1{% \setpdfdestname{#1}% \safewhatsit{\pdfdest name{\pdfdestname} xyz}% } % % by default, use black for everything. \def\urlcolor{\rgbBlack} \def\linkcolor{\rgbBlack} \def\endlink{\setcolor{\maincolor}\pdfendlink} % \def\dopdfoutline#1#2#3#4{% \setpdfoutlinetext{#1} \setpdfdestname{#3} \ifx\pdfdestname\empty \def\pdfdestname{#4}% \fi % \special{pdf:out [-] #2 << /Title (\pdfoutlinetext) /A << /S /GoTo /D (\pdfdestname) >> >> }% } % \def\pdfmakeoutlines{% \begingroup % % For XeTeX, counts of subentries are not necessary. % Therefore, we read toc only once. % % We use node names as destinations. % % Currently we prefix the section name with the section number % for chapter and appendix headings only in order to avoid too much % horizontal space being required in the PDF viewer. \def\partentry##1##2##3##4{}% ignore parts in the outlines \def\numchapentry##1##2##3##4{% \dopdfoutline{##2 ##1}{1}{##3}{##4}}% \def\numsecentry##1##2##3##4{% \dopdfoutline{##1}{2}{##3}{##4}}% \def\numsubsecentry##1##2##3##4{% \dopdfoutline{##1}{3}{##3}{##4}}% \def\numsubsubsecentry##1##2##3##4{% \dopdfoutline{##1}{4}{##3}{##4}}% % \let\appentry\numchapentry% \let\appsecentry\numsecentry% \let\appsubsecentry\numsubsecentry% \let\appsubsubsecentry\numsubsubsecentry% \def\unnchapentry##1##2##3##4{% \dopdfoutline{##1}{1}{##3}{##4}}% \let\unnsecentry\numsecentry% \let\unnsubsecentry\numsubsecentry% \let\unnsubsubsecentry\numsubsubsecentry% % % For XeTeX, xdvipdfmx converts strings to UTF-16. % Therefore, the encoding and the language may not be considered. % \indexnofonts \setupdatafile % We can have normal brace characters in the PDF outlines, unlike % Texinfo index files. So set that up. \def\{{\lbracecharliteral}% \def\}{\rbracecharliteral}% \catcode`\\=\active \otherbackslash \input \tocreadfilename \endgroup } {\catcode`[=1 \catcode`]=2 \catcode`{=\other \catcode`}=\other \gdef\lbracecharliteral[{]% \gdef\rbracecharliteral[}]% ] \special{pdf:docview << /PageMode /UseOutlines >> } % ``\special{pdf:tounicode ...}'' is not necessary % because xdvipdfmx converts strings from UTF-8 to UTF-16 without it. % However, due to a UTF-16 conversion issue of xdvipdfmx 20150315, % ``\special{pdf:dest ...}'' cannot handle non-ASCII strings. % It is fixed by xdvipdfmx 20160106 (TeX Live SVN r39753). % \def\skipspaces#1{\def\PP{#1}\def\D{|}% \ifx\PP\D\let\nextsp\relax \else\let\nextsp\skipspaces \addtokens{\filename}{\PP}% \advance\filenamelength by 1 \fi \nextsp} \def\getfilename#1{% \filenamelength=0 % If we don't expand the argument now, \skipspaces will get % snagged on things like "@value{foo}". \edef\temp{#1}% \expandafter\skipspaces\temp|\relax } % make a live url in pdf output. \def\pdfurl#1{% \begingroup % it seems we really need yet another set of dummies; have not % tried to figure out what each command should do in the context % of @url. for now, just make @/ a no-op, that's the only one % people have actually reported a problem with. % \normalturnoffactive \def\@{@}% \let\/=\empty \makevalueexpandable % do we want to go so far as to use \indexnofonts instead of just % special-casing \var here? \def\var##1{##1}% % \leavevmode\setcolor{\urlcolor}% \special{pdf:bann << /Border [0 0 0] /Subtype /Link /A << /S /URI /URI (#1) >> >>}% \endgroup} \def\endlink{\setcolor{\maincolor}\special{pdf:eann}} \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}} \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks} \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks} \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}} \def\maketoks{% \expandafter\poptoks\the\toksA|ENDTOKS|\relax \ifx\first0\adn0 \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3 \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6 \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9 \else \ifnum0=\countA\else\makelink\fi \ifx\first.\let\next=\done\else \let\next=\maketoks \addtokens{\toksB}{\the\toksD} \ifx\first,\addtokens{\toksB}{\space}\fi \fi \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \next} \def\makelink{\addtokens{\toksB}% {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0} \def\pdflink#1{% \special{pdf:bann << /Border [0 0 0] /Type /Annot /Subtype /Link /A << /S /GoTo /D (#1) >> >>}% \setcolor{\linkcolor}#1\endlink} \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st} % % % @image support % % #1 is image name, #2 width (might be empty/whitespace), #3 height (ditto). \def\doxeteximage#1#2#3{% \def\xeteximagewidth{#2}\setbox0 = \hbox{\ignorespaces #2}% \def\xeteximageheight{#3}\setbox2 = \hbox{\ignorespaces #3}% % % XeTeX (and the PDF format) supports .pdf, .png, .jpg (among % others). Let's try in that order, PDF first since if % someone has a scalable image, presumably better to use that than a % bitmap. \let\xeteximgext=\empty \begingroup \openin 1 #1.pdf \ifeof 1 \openin 1 #1.PDF \ifeof 1 \openin 1 #1.png \ifeof 1 \openin 1 #1.jpg \ifeof 1 \openin 1 #1.jpeg \ifeof 1 \openin 1 #1.JPG \ifeof 1 \errmessage{Could not find image file #1 for XeTeX}% \else \gdef\xeteximgext{JPG}% \fi \else \gdef\xeteximgext{jpeg}% \fi \else \gdef\xeteximgext{jpg}% \fi \else \gdef\xeteximgext{png}% \fi \else \gdef\xeteximgext{PDF}% \fi \else \gdef\xeteximgext{pdf}% \fi \closein 1 \endgroup % % Putting an \hbox around the image can prevent an over-long line % after the image. \hbox\bgroup \def\xetexpdfext{pdf}% \ifx\xeteximgext\xetexpdfext \XeTeXpdffile "#1".\xeteximgext "" \else \def\xetexpdfext{PDF}% \ifx\xeteximgext\xetexpdfext \XeTeXpdffile "#1".\xeteximgext "" \else \XeTeXpicfile "#1".\xeteximgext "" \fi \fi \ifdim \wd0 >0pt width \xeteximagewidth \fi \ifdim \wd2 >0pt height \xeteximageheight \fi \relax \egroup } \fi % \message{fonts,} % Set the baselineskip to #1, and the lineskip and strut size % correspondingly. There is no deep meaning behind these magic numbers % used as factors; they just match (closely enough) what Knuth defined. % \def\lineskipfactor{.08333} \def\strutheightpercent{.70833} \def\strutdepthpercent {.29167} % % can get a sort of poor man's double spacing by redefining this. \def\baselinefactor{1} % \newdimen\textleading \def\setleading#1{% \dimen0 = #1\relax \normalbaselineskip = \baselinefactor\dimen0 \normallineskip = \lineskipfactor\normalbaselineskip \normalbaselines \setbox\strutbox =\hbox{% \vrule width0pt height\strutheightpercent\baselineskip depth \strutdepthpercent \baselineskip }% } % PDF CMaps. See also LaTeX's t1.cmap. % % do nothing with this by default. \expandafter\let\csname cmapOT1\endcsname\gobble \expandafter\let\csname cmapOT1IT\endcsname\gobble \expandafter\let\csname cmapOT1TT\endcsname\gobble % if we are producing pdf, and we have \pdffontattr, then define cmaps. % (\pdffontattr was introduced many years ago, but people still run % older pdftex's; it's easy to conditionalize, so we do.) \ifpdf \ifx\pdffontattr\thisisundefined \else \begingroup \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (TeX-OT1-0) %%Title: (TeX-OT1-0 TeX OT1 0) %%Version: 1.000 %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (TeX) /Ordering (OT1) /Supplement 0 >> def /CMapName /TeX-OT1-0 def /CMapType 2 def 1 begincodespacerange <00> <7F> endcodespacerange 8 beginbfrange <00> <01> <0393> <09> <0A> <03A8> <23> <26> <0023> <28> <3B> <0028> <3F> <5B> <003F> <5D> <5E> <005D> <61> <7A> <0061> <7B> <7C> <2013> endbfrange 40 beginbfchar <02> <0398> <03> <039B> <04> <039E> <05> <03A0> <06> <03A3> <07> <03D2> <08> <03A6> <0B> <00660066> <0C> <00660069> <0D> <0066006C> <0E> <006600660069> <0F> <00660066006C> <10> <0131> <11> <0237> <12> <0060> <13> <00B4> <14> <02C7> <15> <02D8> <16> <00AF> <17> <02DA> <18> <00B8> <19> <00DF> <1A> <00E6> <1B> <0153> <1C> <00F8> <1D> <00C6> <1E> <0152> <1F> <00D8> <21> <0021> <22> <201D> <27> <2019> <3C> <00A1> <3D> <003D> <3E> <00BF> <5C> <201C> <5F> <02D9> <60> <2018> <7D> <02DD> <7E> <007E> <7F> <00A8> endbfchar endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF }\endgroup \expandafter\edef\csname cmapOT1\endcsname#1{% \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% }% % % \cmapOT1IT \begingroup \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (TeX-OT1IT-0) %%Title: (TeX-OT1IT-0 TeX OT1IT 0) %%Version: 1.000 %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (TeX) /Ordering (OT1IT) /Supplement 0 >> def /CMapName /TeX-OT1IT-0 def /CMapType 2 def 1 begincodespacerange <00> <7F> endcodespacerange 8 beginbfrange <00> <01> <0393> <09> <0A> <03A8> <25> <26> <0025> <28> <3B> <0028> <3F> <5B> <003F> <5D> <5E> <005D> <61> <7A> <0061> <7B> <7C> <2013> endbfrange 42 beginbfchar <02> <0398> <03> <039B> <04> <039E> <05> <03A0> <06> <03A3> <07> <03D2> <08> <03A6> <0B> <00660066> <0C> <00660069> <0D> <0066006C> <0E> <006600660069> <0F> <00660066006C> <10> <0131> <11> <0237> <12> <0060> <13> <00B4> <14> <02C7> <15> <02D8> <16> <00AF> <17> <02DA> <18> <00B8> <19> <00DF> <1A> <00E6> <1B> <0153> <1C> <00F8> <1D> <00C6> <1E> <0152> <1F> <00D8> <21> <0021> <22> <201D> <23> <0023> <24> <00A3> <27> <2019> <3C> <00A1> <3D> <003D> <3E> <00BF> <5C> <201C> <5F> <02D9> <60> <2018> <7D> <02DD> <7E> <007E> <7F> <00A8> endbfchar endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF }\endgroup \expandafter\edef\csname cmapOT1IT\endcsname#1{% \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% }% % % \cmapOT1TT \begingroup \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (TeX-OT1TT-0) %%Title: (TeX-OT1TT-0 TeX OT1TT 0) %%Version: 1.000 %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (TeX) /Ordering (OT1TT) /Supplement 0 >> def /CMapName /TeX-OT1TT-0 def /CMapType 2 def 1 begincodespacerange <00> <7F> endcodespacerange 5 beginbfrange <00> <01> <0393> <09> <0A> <03A8> <21> <26> <0021> <28> <5F> <0028> <61> <7E> <0061> endbfrange 32 beginbfchar <02> <0398> <03> <039B> <04> <039E> <05> <03A0> <06> <03A3> <07> <03D2> <08> <03A6> <0B> <2191> <0C> <2193> <0D> <0027> <0E> <00A1> <0F> <00BF> <10> <0131> <11> <0237> <12> <0060> <13> <00B4> <14> <02C7> <15> <02D8> <16> <00AF> <17> <02DA> <18> <00B8> <19> <00DF> <1A> <00E6> <1B> <0153> <1C> <00F8> <1D> <00C6> <1E> <0152> <1F> <00D8> <20> <2423> <27> <2019> <60> <2018> <7F> <00A8> endbfchar endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF }\endgroup \expandafter\edef\csname cmapOT1TT\endcsname#1{% \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% }% \fi\fi % Set the font macro #1 to the font named \fontprefix#2. % #3 is the font's design size, #4 is a scale factor, #5 is the CMap % encoding (only OT1, OT1IT and OT1TT are allowed, or empty to omit). % Example: % #1 = \textrm % #2 = \rmshape % #3 = 10 % #4 = \mainmagstep % #5 = OT1 % \def\setfont#1#2#3#4#5{% \font#1=\fontprefix#2#3 scaled #4 \csname cmap#5\endcsname#1% } % This is what gets called when #5 of \setfont is empty. \let\cmap\gobble % % (end of cmaps) % Use cm as the default font prefix. % To specify the font prefix, you must define \fontprefix % before you read in texinfo.tex. \ifx\fontprefix\thisisundefined \def\fontprefix{cm} \fi % Support font families that don't use the same naming scheme as CM. \def\rmshape{r} \def\rmbshape{bx} % where the normal face is bold \def\bfshape{b} \def\bxshape{bx} \def\ttshape{tt} \def\ttbshape{tt} \def\ttslshape{sltt} \def\itshape{ti} \def\itbshape{bxti} \def\slshape{sl} \def\slbshape{bxsl} \def\sfshape{ss} \def\sfbshape{ss} \def\scshape{csc} \def\scbshape{csc} % Definitions for a main text size of 11pt. (The default in Texinfo.) % \def\definetextfontsizexi{% % Text fonts (11.2pt, magstep1). \def\textnominalsize{11pt} \edef\mainmagstep{\magstephalf} \setfont\textrm\rmshape{10}{\mainmagstep}{OT1} \setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT} \setfont\textbf\bfshape{10}{\mainmagstep}{OT1} \setfont\textit\itshape{10}{\mainmagstep}{OT1IT} \setfont\textsl\slshape{10}{\mainmagstep}{OT1} \setfont\textsf\sfshape{10}{\mainmagstep}{OT1} \setfont\textsc\scshape{10}{\mainmagstep}{OT1} \setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT} \font\texti=cmmi10 scaled \mainmagstep \font\textsy=cmsy10 scaled \mainmagstep \def\textecsize{1095} % A few fonts for @defun names and args. \setfont\defbf\bfshape{10}{\magstep1}{OT1} \setfont\deftt\ttshape{10}{\magstep1}{OT1TT} \setfont\defsl\slshape{10}{\magstep1}{OT1} \setfont\defttsl\ttslshape{10}{\magstep1}{OT1TT} \def\df{\let\ttfont=\deftt \let\bffont = \defbf \let\ttslfont=\defttsl \let\slfont=\defsl \bf} % Fonts for indices, footnotes, small examples (9pt). \def\smallnominalsize{9pt} \setfont\smallrm\rmshape{9}{1000}{OT1} \setfont\smalltt\ttshape{9}{1000}{OT1TT} \setfont\smallbf\bfshape{10}{900}{OT1} \setfont\smallit\itshape{9}{1000}{OT1IT} \setfont\smallsl\slshape{9}{1000}{OT1} \setfont\smallsf\sfshape{9}{1000}{OT1} \setfont\smallsc\scshape{10}{900}{OT1} \setfont\smallttsl\ttslshape{10}{900}{OT1TT} \font\smalli=cmmi9 \font\smallsy=cmsy9 \def\smallecsize{0900} % Fonts for small examples (8pt). \def\smallernominalsize{8pt} \setfont\smallerrm\rmshape{8}{1000}{OT1} \setfont\smallertt\ttshape{8}{1000}{OT1TT} \setfont\smallerbf\bfshape{10}{800}{OT1} \setfont\smallerit\itshape{8}{1000}{OT1IT} \setfont\smallersl\slshape{8}{1000}{OT1} \setfont\smallersf\sfshape{8}{1000}{OT1} \setfont\smallersc\scshape{10}{800}{OT1} \setfont\smallerttsl\ttslshape{10}{800}{OT1TT} \font\smalleri=cmmi8 \font\smallersy=cmsy8 \def\smallerecsize{0800} % Fonts for math mode superscripts (7pt). \def\sevennominalsize{7pt} \setfont\sevenrm\rmshape{7}{1000}{OT1} \setfont\seventt\ttshape{10}{700}{OT1TT} \setfont\sevenbf\bfshape{10}{700}{OT1} \setfont\sevenit\itshape{7}{1000}{OT1IT} \setfont\sevensl\slshape{10}{700}{OT1} \setfont\sevensf\sfshape{10}{700}{OT1} \setfont\sevensc\scshape{10}{700}{OT1} \setfont\seventtsl\ttslshape{10}{700}{OT1TT} \font\seveni=cmmi7 \font\sevensy=cmsy7 \def\sevenecsize{0700} % Fonts for title page (20.4pt): \def\titlenominalsize{20pt} \setfont\titlerm\rmbshape{12}{\magstep3}{OT1} \setfont\titleit\itbshape{10}{\magstep4}{OT1IT} \setfont\titlesl\slbshape{10}{\magstep4}{OT1} \setfont\titlett\ttbshape{12}{\magstep3}{OT1TT} \setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT} \setfont\titlesf\sfbshape{17}{\magstep1}{OT1} \let\titlebf=\titlerm \setfont\titlesc\scbshape{10}{\magstep4}{OT1} \font\titlei=cmmi12 scaled \magstep3 \font\titlesy=cmsy10 scaled \magstep4 \def\titleecsize{2074} % Chapter (and unnumbered) fonts (17.28pt). \def\chapnominalsize{17pt} \setfont\chaprm\rmbshape{12}{\magstep2}{OT1} \setfont\chapit\itbshape{10}{\magstep3}{OT1IT} \setfont\chapsl\slbshape{10}{\magstep3}{OT1} \setfont\chaptt\ttbshape{12}{\magstep2}{OT1TT} \setfont\chapttsl\ttslshape{10}{\magstep3}{OT1TT} \setfont\chapsf\sfbshape{17}{1000}{OT1} \let\chapbf=\chaprm \setfont\chapsc\scbshape{10}{\magstep3}{OT1} \font\chapi=cmmi12 scaled \magstep2 \font\chapsy=cmsy10 scaled \magstep3 \def\chapecsize{1728} % Section fonts (14.4pt). \def\secnominalsize{14pt} \setfont\secrm\rmbshape{12}{\magstep1}{OT1} \setfont\secrmnotbold\rmshape{12}{\magstep1}{OT1} \setfont\secit\itbshape{10}{\magstep2}{OT1IT} \setfont\secsl\slbshape{10}{\magstep2}{OT1} \setfont\sectt\ttbshape{12}{\magstep1}{OT1TT} \setfont\secttsl\ttslshape{10}{\magstep2}{OT1TT} \setfont\secsf\sfbshape{12}{\magstep1}{OT1} \let\secbf\secrm \setfont\secsc\scbshape{10}{\magstep2}{OT1} \font\seci=cmmi12 scaled \magstep1 \font\secsy=cmsy10 scaled \magstep2 \def\sececsize{1440} % Subsection fonts (13.15pt). \def\ssecnominalsize{13pt} \setfont\ssecrm\rmbshape{12}{\magstephalf}{OT1} \setfont\ssecit\itbshape{10}{1315}{OT1IT} \setfont\ssecsl\slbshape{10}{1315}{OT1} \setfont\ssectt\ttbshape{12}{\magstephalf}{OT1TT} \setfont\ssecttsl\ttslshape{10}{1315}{OT1TT} \setfont\ssecsf\sfbshape{12}{\magstephalf}{OT1} \let\ssecbf\ssecrm \setfont\ssecsc\scbshape{10}{1315}{OT1} \font\sseci=cmmi12 scaled \magstephalf \font\ssecsy=cmsy10 scaled 1315 \def\ssececsize{1200} % Reduced fonts for @acronym in text (10pt). \def\reducednominalsize{10pt} \setfont\reducedrm\rmshape{10}{1000}{OT1} \setfont\reducedtt\ttshape{10}{1000}{OT1TT} \setfont\reducedbf\bfshape{10}{1000}{OT1} \setfont\reducedit\itshape{10}{1000}{OT1IT} \setfont\reducedsl\slshape{10}{1000}{OT1} \setfont\reducedsf\sfshape{10}{1000}{OT1} \setfont\reducedsc\scshape{10}{1000}{OT1} \setfont\reducedttsl\ttslshape{10}{1000}{OT1TT} \font\reducedi=cmmi10 \font\reducedsy=cmsy10 \def\reducedecsize{1000} \textleading = 13.2pt % line spacing for 11pt CM \textfonts % reset the current fonts \rm } % end of 11pt text font size definitions, \definetextfontsizexi % Definitions to make the main text be 10pt Computer Modern, with % section, chapter, etc., sizes following suit. This is for the GNU % Press printing of the Emacs 22 manual. Maybe other manuals in the % future. Used with @smallbook, which sets the leading to 12pt. % \def\definetextfontsizex{% % Text fonts (10pt). \def\textnominalsize{10pt} \edef\mainmagstep{1000} \setfont\textrm\rmshape{10}{\mainmagstep}{OT1} \setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT} \setfont\textbf\bfshape{10}{\mainmagstep}{OT1} \setfont\textit\itshape{10}{\mainmagstep}{OT1IT} \setfont\textsl\slshape{10}{\mainmagstep}{OT1} \setfont\textsf\sfshape{10}{\mainmagstep}{OT1} \setfont\textsc\scshape{10}{\mainmagstep}{OT1} \setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT} \font\texti=cmmi10 scaled \mainmagstep \font\textsy=cmsy10 scaled \mainmagstep \def\textecsize{1000} % A few fonts for @defun names and args. \setfont\defbf\bfshape{10}{\magstephalf}{OT1} \setfont\deftt\ttshape{10}{\magstephalf}{OT1TT} \setfont\defsl\slshape{10}{\magstephalf}{OT1} \setfont\defttsl\ttslshape{10}{\magstephalf}{OT1TT} \def\df{\let\ttfont=\deftt \let\bffont = \defbf \let\slfont=\defsl \let\ttslfont=\defttsl \bf} % Fonts for indices, footnotes, small examples (9pt). \def\smallnominalsize{9pt} \setfont\smallrm\rmshape{9}{1000}{OT1} \setfont\smalltt\ttshape{9}{1000}{OT1TT} \setfont\smallbf\bfshape{10}{900}{OT1} \setfont\smallit\itshape{9}{1000}{OT1IT} \setfont\smallsl\slshape{9}{1000}{OT1} \setfont\smallsf\sfshape{9}{1000}{OT1} \setfont\smallsc\scshape{10}{900}{OT1} \setfont\smallttsl\ttslshape{10}{900}{OT1TT} \font\smalli=cmmi9 \font\smallsy=cmsy9 \def\smallecsize{0900} % Fonts for small examples (8pt). \def\smallernominalsize{8pt} \setfont\smallerrm\rmshape{8}{1000}{OT1} \setfont\smallertt\ttshape{8}{1000}{OT1TT} \setfont\smallerbf\bfshape{10}{800}{OT1} \setfont\smallerit\itshape{8}{1000}{OT1IT} \setfont\smallersl\slshape{8}{1000}{OT1} \setfont\smallersf\sfshape{8}{1000}{OT1} \setfont\smallersc\scshape{10}{800}{OT1} \setfont\smallerttsl\ttslshape{10}{800}{OT1TT} \font\smalleri=cmmi8 \font\smallersy=cmsy8 \def\smallerecsize{0800} % Fonts for math mode superscripts (7pt). \def\sevennominalsize{7pt} \setfont\sevenrm\rmshape{7}{1000}{OT1} \setfont\seventt\ttshape{10}{700}{OT1TT} \setfont\sevenbf\bfshape{10}{700}{OT1} \setfont\sevenit\itshape{7}{1000}{OT1IT} \setfont\sevensl\slshape{10}{700}{OT1} \setfont\sevensf\sfshape{10}{700}{OT1} \setfont\sevensc\scshape{10}{700}{OT1} \setfont\seventtsl\ttslshape{10}{700}{OT1TT} \font\seveni=cmmi7 \font\sevensy=cmsy7 \def\sevenecsize{0700} % Fonts for title page (20.4pt): \def\titlenominalsize{20pt} \setfont\titlerm\rmbshape{12}{\magstep3}{OT1} \setfont\titleit\itbshape{10}{\magstep4}{OT1IT} \setfont\titlesl\slbshape{10}{\magstep4}{OT1} \setfont\titlett\ttbshape{12}{\magstep3}{OT1TT} \setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT} \setfont\titlesf\sfbshape{17}{\magstep1}{OT1} \let\titlebf=\titlerm \setfont\titlesc\scbshape{10}{\magstep4}{OT1} \font\titlei=cmmi12 scaled \magstep3 \font\titlesy=cmsy10 scaled \magstep4 \def\titleecsize{2074} % Chapter fonts (14.4pt). \def\chapnominalsize{14pt} \setfont\chaprm\rmbshape{12}{\magstep1}{OT1} \setfont\chapit\itbshape{10}{\magstep2}{OT1IT} \setfont\chapsl\slbshape{10}{\magstep2}{OT1} \setfont\chaptt\ttbshape{12}{\magstep1}{OT1TT} \setfont\chapttsl\ttslshape{10}{\magstep2}{OT1TT} \setfont\chapsf\sfbshape{12}{\magstep1}{OT1} \let\chapbf\chaprm \setfont\chapsc\scbshape{10}{\magstep2}{OT1} \font\chapi=cmmi12 scaled \magstep1 \font\chapsy=cmsy10 scaled \magstep2 \def\chapecsize{1440} % Section fonts (12pt). \def\secnominalsize{12pt} \setfont\secrm\rmbshape{12}{1000}{OT1} \setfont\secit\itbshape{10}{\magstep1}{OT1IT} \setfont\secsl\slbshape{10}{\magstep1}{OT1} \setfont\sectt\ttbshape{12}{1000}{OT1TT} \setfont\secttsl\ttslshape{10}{\magstep1}{OT1TT} \setfont\secsf\sfbshape{12}{1000}{OT1} \let\secbf\secrm \setfont\secsc\scbshape{10}{\magstep1}{OT1} \font\seci=cmmi12 \font\secsy=cmsy10 scaled \magstep1 \def\sececsize{1200} % Subsection fonts (10pt). \def\ssecnominalsize{10pt} \setfont\ssecrm\rmbshape{10}{1000}{OT1} \setfont\ssecit\itbshape{10}{1000}{OT1IT} \setfont\ssecsl\slbshape{10}{1000}{OT1} \setfont\ssectt\ttbshape{10}{1000}{OT1TT} \setfont\ssecttsl\ttslshape{10}{1000}{OT1TT} \setfont\ssecsf\sfbshape{10}{1000}{OT1} \let\ssecbf\ssecrm \setfont\ssecsc\scbshape{10}{1000}{OT1} \font\sseci=cmmi10 \font\ssecsy=cmsy10 \def\ssececsize{1000} % Reduced fonts for @acronym in text (9pt). \def\reducednominalsize{9pt} \setfont\reducedrm\rmshape{9}{1000}{OT1} \setfont\reducedtt\ttshape{9}{1000}{OT1TT} \setfont\reducedbf\bfshape{10}{900}{OT1} \setfont\reducedit\itshape{9}{1000}{OT1IT} \setfont\reducedsl\slshape{9}{1000}{OT1} \setfont\reducedsf\sfshape{9}{1000}{OT1} \setfont\reducedsc\scshape{10}{900}{OT1} \setfont\reducedttsl\ttslshape{10}{900}{OT1TT} \font\reducedi=cmmi9 \font\reducedsy=cmsy9 \def\reducedecsize{0900} \divide\parskip by 2 % reduce space between paragraphs \textleading = 12pt % line spacing for 10pt CM \textfonts % reset the current fonts \rm } % end of 10pt text font size definitions, \definetextfontsizex % Fonts for short table of contents. \setfont\shortcontrm\rmshape{12}{1000}{OT1} \setfont\shortcontbf\bfshape{10}{\magstep1}{OT1} % no cmb12 \setfont\shortcontsl\slshape{12}{1000}{OT1} \setfont\shortconttt\ttshape{12}{1000}{OT1TT} % We provide the user-level command % @fonttextsize 10 % (or 11) to redefine the text font size. pt is assumed. % \def\xiword{11} \def\xword{10} \def\xwordpt{10pt} % \parseargdef\fonttextsize{% \def\textsizearg{#1}% %\wlog{doing @fonttextsize \textsizearg}% % % Set \globaldefs so that documents can use this inside @tex, since % makeinfo 4.8 does not support it, but we need it nonetheless. % \begingroup \globaldefs=1 \ifx\textsizearg\xword \definetextfontsizex \else \ifx\textsizearg\xiword \definetextfontsizexi \else \errhelp=\EMsimple \errmessage{@fonttextsize only supports `10' or `11', not `\textsizearg'} \fi\fi \endgroup } % % Change the current font style to #1, remembering it in \curfontstyle. % For now, we do not accumulate font styles: @b{@i{foo}} prints foo in % italics, not bold italics. % \def\setfontstyle#1{% \def\curfontstyle{#1}% not as a control sequence, because we are \edef'd. \csname #1font\endcsname % change the current font } \def\rm{\fam=0 \setfontstyle{rm}} \def\it{\fam=\itfam \setfontstyle{it}} \def\sl{\fam=\slfam \setfontstyle{sl}} \def\bf{\fam=\bffam \setfontstyle{bf}}\def\bfstylename{bf} \def\tt{\fam=\ttfam \setfontstyle{tt}}\def\ttstylename{tt} % Texinfo sort of supports the sans serif font style, which plain TeX does not. % So we set up a \sf. \newfam\sffam \def\sf{\fam=\sffam \setfontstyle{sf}} % We don't need math for this font style. \def\ttsl{\setfontstyle{ttsl}} % In order for the font changes to affect most math symbols and letters, % we have to define the \textfont of the standard families. % We don't bother to reset \scriptscriptfont; awaiting user need. % \def\resetmathfonts{% \textfont0=\rmfont \textfont1=\ifont \textfont2=\syfont \textfont\itfam=\itfont \textfont\slfam=\slfont \textfont\bffam=\bffont \textfont\ttfam=\ttfont \textfont\sffam=\sffont % % Fonts for superscript. Note that the 7pt fonts are used regardless % of the current font size. \scriptfont0=\sevenrm \scriptfont1=\seveni \scriptfont2=\sevensy \scriptfont\itfam=\sevenit \scriptfont\slfam=\sevensl \scriptfont\bffam=\sevenbf \scriptfont\ttfam=\seventt \scriptfont\sffam=\sevensf } % % The font-changing commands (all called \...fonts) redefine the meanings % of \STYLEfont, instead of just \STYLE. We do this because \STYLE needs % to also set the current \fam for math mode. Our \STYLE (e.g., \rm) % commands hardwire \STYLEfont to set the current font. % % The fonts used for \ifont are for "math italics" (\itfont is for italics % in regular text). \syfont is also used in math mode only. % % Each font-changing command also sets the names \lsize (one size lower) % and \lllsize (three sizes lower). These relative commands are used % in, e.g., the LaTeX logo and acronyms. % % This all needs generalizing, badly. % \def\assignfonts#1{% \expandafter\let\expandafter\rmfont\csname #1rm\endcsname \expandafter\let\expandafter\itfont\csname #1it\endcsname \expandafter\let\expandafter\slfont\csname #1sl\endcsname \expandafter\let\expandafter\bffont\csname #1bf\endcsname \expandafter\let\expandafter\ttfont\csname #1tt\endcsname \expandafter\let\expandafter\smallcaps\csname #1sc\endcsname \expandafter\let\expandafter\sffont \csname #1sf\endcsname \expandafter\let\expandafter\ifont \csname #1i\endcsname \expandafter\let\expandafter\syfont \csname #1sy\endcsname \expandafter\let\expandafter\ttslfont\csname #1ttsl\endcsname } \newif\ifrmisbold % Select smaller font size with the current style. Used to change font size % in, e.g., the LaTeX logo and acronyms. If we are using bold fonts for % normal roman text, also use bold fonts for roman text in the smaller size. \def\switchtolllsize{% \expandafter\assignfonts\expandafter{\lllsize}% \ifrmisbold \let\rmfont\bffont \fi \csname\curfontstyle\endcsname }% \def\switchtolsize{% \expandafter\assignfonts\expandafter{\lsize}% \ifrmisbold \let\rmfont\bffont \fi \csname\curfontstyle\endcsname }% \def\definefontsetatsize#1#2#3#4#5{% \expandafter\def\csname #1fonts\endcsname{% \def\curfontsize{#1}% \def\lsize{#2}\def\lllsize{#3}% \csname rmisbold#5\endcsname \assignfonts{#1}% \resetmathfonts \setleading{#4}% }} \definefontsetatsize{text} {reduced}{smaller}{\textleading}{false} \definefontsetatsize{title} {chap} {subsec} {27pt} {true} \definefontsetatsize{chap} {sec} {text} {19pt} {true} \definefontsetatsize{sec} {subsec} {reduced}{17pt} {true} \definefontsetatsize{ssec} {text} {small} {15pt} {true} \definefontsetatsize{reduced}{small} {smaller}{10.5pt}{false} \definefontsetatsize{small} {smaller}{smaller}{10.5pt}{false} \definefontsetatsize{smaller}{smaller}{smaller}{9.5pt} {false} \def\titlefont#1{{\titlefonts\rm #1}} \let\subsecfonts = \ssecfonts \let\subsubsecfonts = \ssecfonts % Define these just so they can be easily changed for other fonts. \def\angleleft{$\langle$} \def\angleright{$\rangle$} % Set the fonts to use with the @small... environments. \let\smallexamplefonts = \smallfonts % About \smallexamplefonts. If we use \smallfonts (9pt), @smallexample % can fit this many characters: % 8.5x11=86 smallbook=72 a4=90 a5=69 % If we use \scriptfonts (8pt), then we can fit this many characters: % 8.5x11=90+ smallbook=80 a4=90+ a5=77 % For me, subjectively, the few extra characters that fit aren't worth % the additional smallness of 8pt. So I'm making the default 9pt. % % By the way, for comparison, here's what fits with @example (10pt): % 8.5x11=71 smallbook=60 a4=75 a5=58 % --karl, 24jan03. % Set up the default fonts, so we can use them for creating boxes. % \definetextfontsizexi % Check if we are currently using a typewriter font. Since all the % Computer Modern typewriter fonts have zero interword stretch (and % shrink), and it is reasonable to expect all typewriter fonts to have % this property, we can check that font parameter. % \def\ifmonospace{\ifdim\fontdimen3\font=0pt } { \catcode`\'=\active \catcode`\`=\active \gdef\setcodequotes{\let`\codequoteleft \let'\codequoteright} \gdef\setregularquotes{\let`\lq \let'\rq} } % Allow an option to not use regular directed right quote/apostrophe % (char 0x27), but instead the undirected quote from cmtt (char 0x0d). % The undirected quote is ugly, so don't make it the default, but it % works for pasting with more pdf viewers (at least evince), the % lilypond developers report. xpdf does work with the regular 0x27. % \def\codequoteright{% \ifmonospace \expandafter\ifx\csname SETtxicodequoteundirected\endcsname\relax \expandafter\ifx\csname SETcodequoteundirected\endcsname\relax '% \else \char'15 \fi \else \char'15 \fi \else '% \fi } % % and a similar option for the left quote char vs. a grave accent. % Modern fonts display ASCII 0x60 as a grave accent, so some people like % the code environments to do likewise. % \def\codequoteleft{% \ifmonospace \expandafter\ifx\csname SETtxicodequotebacktick\endcsname\relax \expandafter\ifx\csname SETcodequotebacktick\endcsname\relax % [Knuth] pp. 380,381,391 % \relax disables Spanish ligatures ?` and !` of \tt font. \relax`% \else \char'22 \fi \else \char'22 \fi \else \relax`% \fi } % Commands to set the quote options. % \parseargdef\codequoteundirected{% \def\temp{#1}% \ifx\temp\onword \expandafter\let\csname SETtxicodequoteundirected\endcsname = t% \else\ifx\temp\offword \expandafter\let\csname SETtxicodequoteundirected\endcsname = \relax \else \errhelp = \EMsimple \errmessage{Unknown @codequoteundirected value `\temp', must be on|off}% \fi\fi } % \parseargdef\codequotebacktick{% \def\temp{#1}% \ifx\temp\onword \expandafter\let\csname SETtxicodequotebacktick\endcsname = t% \else\ifx\temp\offword \expandafter\let\csname SETtxicodequotebacktick\endcsname = \relax \else \errhelp = \EMsimple \errmessage{Unknown @codequotebacktick value `\temp', must be on|off}% \fi\fi } % [Knuth] pp. 380,381,391, disable Spanish ligatures ?` and !` of \tt font. \def\noligaturesquoteleft{\relax\lq} % Count depth in font-changes, for error checks \newcount\fontdepth \fontdepth=0 % Font commands. % #1 is the font command (\sl or \it), #2 is the text to slant. % If we are in a monospaced environment, however, 1) always use \ttsl, % and 2) do not add an italic correction. \def\dosmartslant#1#2{% \ifusingtt {{\ttsl #2}\let\next=\relax}% {\def\next{{#1#2}\futurelet\next\smartitaliccorrection}}% \next } \def\smartslanted{\dosmartslant\sl} \def\smartitalic{\dosmartslant\it} % Output an italic correction unless \next (presumed to be the following % character) is such as not to need one. \def\smartitaliccorrection{% \ifx\next,% \else\ifx\next-% \else\ifx\next.% \else\ifx\next\.% \else\ifx\next\comma% \else\ptexslash \fi\fi\fi\fi\fi \aftersmartic } % Unconditional use \ttsl, and no ic. @var is set to this for defuns. \def\ttslanted#1{{\ttsl #1}} % @cite is like \smartslanted except unconditionally use \sl. We never want % ttsl for book titles, do we? \def\cite#1{{\sl #1}\futurelet\next\smartitaliccorrection} \def\aftersmartic{} \def\var#1{% \let\saveaftersmartic = \aftersmartic \def\aftersmartic{\null\let\aftersmartic=\saveaftersmartic}% \smartslanted{#1}% } \let\i=\smartitalic \let\slanted=\smartslanted \let\dfn=\smartslanted \let\emph=\smartitalic % Explicit font changes: @r, @sc, undocumented @ii. \def\r#1{{\rm #1}} % roman font \def\sc#1{{\smallcaps#1}} % smallcaps font \def\ii#1{{\it #1}} % italic font % @b, explicit bold. Also @strong. \def\b#1{{\bf #1}} \let\strong=\b % @sansserif, explicit sans. \def\sansserif#1{{\sf #1}} % We can't just use \exhyphenpenalty, because that only has effect at % the end of a paragraph. Restore normal hyphenation at the end of the % group within which \nohyphenation is presumably called. % \def\nohyphenation{\hyphenchar\font = -1 \aftergroup\restorehyphenation} \def\restorehyphenation{\hyphenchar\font = `- } % Set sfcode to normal for the chars that usually have another value. % Can't use plain's \frenchspacing because it uses the `\x notation, and % sometimes \x has an active definition that messes things up. % \catcode`@=11 \def\plainfrenchspacing{% \sfcode`\.=\@m \sfcode`\?=\@m \sfcode`\!=\@m \sfcode`\:=\@m \sfcode`\;=\@m \sfcode`\,=\@m \def\endofsentencespacefactor{1000}% for @. and friends } \def\plainnonfrenchspacing{% \sfcode`\.3000\sfcode`\?3000\sfcode`\!3000 \sfcode`\:2000\sfcode`\;1500\sfcode`\,1250 \def\endofsentencespacefactor{3000}% for @. and friends } \catcode`@=\other \def\endofsentencespacefactor{3000}% default % @t, explicit typewriter. \def\t#1{% {\tt \plainfrenchspacing #1}% \null } % @samp. \def\samp#1{{\setcodequotes\lq\tclose{#1}\rq\null}} % @indicateurl is \samp, that is, with quotes. \let\indicateurl=\samp % @code (and similar) prints in typewriter, but with spaces the same % size as normal in the surrounding text, without hyphenation, etc. % This is a subroutine for that. \def\tclose#1{% {% % Change normal interword space to be same as for the current font. \spaceskip = \fontdimen2\font % % Switch to typewriter. \tt % % But `\ ' produces the large typewriter interword space. \def\ {{\spaceskip = 0pt{} }}% % % Turn off hyphenation. \nohyphenation % \plainfrenchspacing #1% }% \null % reset spacefactor to 1000 } % We *must* turn on hyphenation at `-' and `_' in @code. % (But see \codedashfinish below.) % Otherwise, it is too hard to avoid overfull hboxes % in the Emacs manual, the Library manual, etc. % % Unfortunately, TeX uses one parameter (\hyphenchar) to control % both hyphenation at - and hyphenation within words. % We must therefore turn them both off (\tclose does that) % and arrange explicitly to hyphenate at a dash. -- rms. { \catcode`\-=\active \catcode`\_=\active \catcode`\'=\active \catcode`\`=\active \global\let'=\rq \global\let`=\lq % default definitions % \global\def\code{\begingroup \setcodequotes \catcode\dashChar=\active \catcode\underChar=\active \ifallowcodebreaks \let-\codedash \let_\codeunder \else \let-\normaldash \let_\realunder \fi % Given -foo (with a single dash), we do not want to allow a break % after the hyphen. \global\let\codedashprev=\codedash % \codex } % \gdef\codedash{\futurelet\next\codedashfinish} \gdef\codedashfinish{% \normaldash % always output the dash character itself. % % Now, output a discretionary to allow a line break, unless % (a) the next character is a -, or % (b) the preceding character is a -. % E.g., given --posix, we do not want to allow a break after either -. % Given --foo-bar, we do want to allow a break between the - and the b. \ifx\next\codedash \else \ifx\codedashprev\codedash \else \discretionary{}{}{}\fi \fi % we need the space after the = for the case when \next itself is a % space token; it would get swallowed otherwise. As in @code{- a}. \global\let\codedashprev= \next } } \def\normaldash{-} % \def\codex #1{\tclose{#1}\endgroup} \def\codeunder{% % this is all so @math{@code{var_name}+1} can work. In math mode, _ % is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.) % will therefore expand the active definition of _, which is us % (inside @code that is), therefore an endless loop. \ifusingtt{\ifmmode \mathchar"075F % class 0=ordinary, family 7=ttfam, pos 0x5F=_. \else\normalunderscore \fi \discretionary{}{}{}}% {\_}% } % An additional complication: the above will allow breaks after, e.g., % each of the four underscores in __typeof__. This is bad. % @allowcodebreaks provides a document-level way to turn breaking at - % and _ on and off. % \newif\ifallowcodebreaks \allowcodebreakstrue \def\keywordtrue{true} \def\keywordfalse{false} \parseargdef\allowcodebreaks{% \def\txiarg{#1}% \ifx\txiarg\keywordtrue \allowcodebreakstrue \else\ifx\txiarg\keywordfalse \allowcodebreaksfalse \else \errhelp = \EMsimple \errmessage{Unknown @allowcodebreaks option `\txiarg', must be true|false}% \fi\fi } % For @command, @env, @file, @option quotes seem unnecessary, % so use \code rather than \samp. \let\command=\code \let\env=\code \let\file=\code \let\option=\code % @uref (abbreviation for `urlref') aka @url takes an optional % (comma-separated) second argument specifying the text to display and % an optional third arg as text to display instead of (rather than in % addition to) the url itself. First (mandatory) arg is the url. % TeX-only option to allow changing PDF output to show only the second % arg (if given), and not the url (which is then just the link target). \newif\ifurefurlonlylink % The default \pretolerance setting stops the penalty inserted in % \urefallowbreak being a discouragement to line breaking. Set it to % a negative value for this paragraph only. Hopefully this does not % conflict with redefinitions of \par done elsewhere. \def\nopretolerance{% \pretolerance=-1 \def\par{\endgraf\pretolerance=100 \let\par\endgraf}% } % The main macro is \urefbreak, which allows breaking at expected % places within the url. \def\urefbreak{\nopretolerance \begingroup \urefcatcodes \dourefbreak} \let\uref=\urefbreak % \def\dourefbreak#1{\urefbreakfinish #1,,,\finish} \def\urefbreakfinish#1,#2,#3,#4\finish{% doesn't work in @example \unsepspaces \pdfurl{#1}% \setbox0 = \hbox{\ignorespaces #3}% \ifdim\wd0 > 0pt \unhbox0 % third arg given, show only that \else \setbox0 = \hbox{\ignorespaces #2}% look for second arg \ifdim\wd0 > 0pt \ifpdf % For pdfTeX and LuaTeX \ifurefurlonlylink % PDF plus option to not display url, show just arg \unhbox0 \else % PDF, normally display both arg and url for consistency, % visibility, if the pdf is eventually used to print, etc. \unhbox0\ (\urefcode{#1})% \fi \else \ifx\XeTeXrevision\thisisundefined \unhbox0\ (\urefcode{#1})% DVI, always show arg and url \else % For XeTeX \ifurefurlonlylink % PDF plus option to not display url, show just arg \unhbox0 \else % PDF, normally display both arg and url for consistency, % visibility, if the pdf is eventually used to print, etc. \unhbox0\ (\urefcode{#1})% \fi \fi \fi \else \urefcode{#1}% only url given, so show it \fi \fi \endlink \endgroup} % Allow line breaks around only a few characters (only). \def\urefcatcodes{% \catcode`\&=\active \catcode`\.=\active \catcode`\#=\active \catcode`\?=\active \catcode`\/=\active } { \urefcatcodes % \global\def\urefcode{\begingroup \setcodequotes \urefcatcodes \let&\urefcodeamp \let.\urefcodedot \let#\urefcodehash \let?\urefcodequest \let/\urefcodeslash \codex } % % By default, they are just regular characters. \global\def&{\normalamp} \global\def.{\normaldot} \global\def#{\normalhash} \global\def?{\normalquest} \global\def/{\normalslash} } \def\urefcodeamp{\urefprebreak \&\urefpostbreak} \def\urefcodedot{\urefprebreak .\urefpostbreak} \def\urefcodehash{\urefprebreak \#\urefpostbreak} \def\urefcodequest{\urefprebreak ?\urefpostbreak} \def\urefcodeslash{\futurelet\next\urefcodeslashfinish} { \catcode`\/=\active \global\def\urefcodeslashfinish{% \urefprebreak \slashChar % Allow line break only after the final / in a sequence of % slashes, to avoid line break between the slashes in http://. \ifx\next/\else \urefpostbreak \fi } } % By default we'll break after the special characters, but some people like to % break before the special chars, so allow that. Also allow no breaking at % all, for manual control. % \parseargdef\urefbreakstyle{% \def\txiarg{#1}% \ifx\txiarg\wordnone \def\urefprebreak{\nobreak}\def\urefpostbreak{\nobreak} \else\ifx\txiarg\wordbefore \def\urefprebreak{\urefallowbreak}\def\urefpostbreak{\nobreak} \else\ifx\txiarg\wordafter \def\urefprebreak{\nobreak}\def\urefpostbreak{\urefallowbreak} \else \errhelp = \EMsimple \errmessage{Unknown @urefbreakstyle setting `\txiarg'}% \fi\fi\fi } \def\wordafter{after} \def\wordbefore{before} \def\wordnone{none} % Allow a ragged right output to aid breaking long URL's. There can % be a break at the \allowbreak with no extra glue (if the existing stretch in % the line is sufficient), a break at the \penalty with extra glue added % at the end of the line, or no break at all here. % Changing the value of the penalty and/or the amount of stretch affects how % preferable one choice is over the other. \def\urefallowbreak{% \penalty0\relax \hskip 0pt plus 2 em\relax \penalty1000\relax \hskip 0pt plus -2 em\relax } \urefbreakstyle after % @url synonym for @uref, since that's how everyone uses it. % \let\url=\uref % rms does not like angle brackets --karl, 17may97. % So now @email is just like @uref, unless we are pdf. % %\def\email#1{\angleleft{\tt #1}\angleright} \ifpdforxetex \def\email#1{\doemail#1,,\finish} \def\doemail#1,#2,#3\finish{\begingroup \unsepspaces \pdfurl{mailto:#1}% \setbox0 = \hbox{\ignorespaces #2}% \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi \endlink \endgroup} \else \let\email=\uref \fi % @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always), % `example' (@kbd uses ttsl only inside of @example and friends), % or `code' (@kbd uses normal tty font always). \parseargdef\kbdinputstyle{% \def\txiarg{#1}% \ifx\txiarg\worddistinct \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}% \else\ifx\txiarg\wordexample \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}% \else\ifx\txiarg\wordcode \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}% \else \errhelp = \EMsimple \errmessage{Unknown @kbdinputstyle setting `\txiarg'}% \fi\fi\fi } \def\worddistinct{distinct} \def\wordexample{example} \def\wordcode{code} % Default is `distinct'. \kbdinputstyle distinct % @kbd is like @code, except that if the argument is just one @key command, % then @kbd has no effect. \def\kbd#1{{\def\look{#1}\expandafter\kbdsub\look??\par}} \def\xkey{\key} \def\kbdsub#1#2#3\par{% \def\one{#1}\def\three{#3}\def\threex{??}% \ifx\one\xkey\ifx\threex\three \key{#2}% \else{\tclose{\kbdfont\setcodequotes\look}}\fi \else{\tclose{\kbdfont\setcodequotes\look}}\fi } % definition of @key that produces a lozenge. Doesn't adjust to text size. %\setfont\keyrm\rmshape{8}{1000}{OT1} %\font\keysy=cmsy9 %\def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{% % \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{% % \vbox{\hrule\kern-0.4pt % \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}% % \kern-0.4pt\hrule}% % \kern-.06em\raise0.4pt\hbox{\angleright}}}} % definition of @key with no lozenge. % \def\key#1{{\setregularquotes \nohyphenation \tt #1}\null} % @clicksequence{File @click{} Open ...} \def\clicksequence#1{\begingroup #1\endgroup} % @clickstyle @arrow (by default) \parseargdef\clickstyle{\def\click{#1}} \def\click{\arrow} % Typeset a dimension, e.g., `in' or `pt'. The only reason for the % argument is to make the input look right: @dmn{pt} instead of @dmn{}pt. % \def\dmn#1{\thinspace #1} % @acronym for "FBI", "NATO", and the like. % We print this one point size smaller, since it's intended for % all-uppercase. % \def\acronym#1{\doacronym #1,,\finish} \def\doacronym#1,#2,#3\finish{% {\switchtolsize #1}% \def\temp{#2}% \ifx\temp\empty \else \space ({\unsepspaces \ignorespaces \temp \unskip})% \fi \null % reset \spacefactor=1000 } % @abbr for "Comput. J." and the like. % No font change, but don't do end-of-sentence spacing. % \def\abbr#1{\doabbr #1,,\finish} \def\doabbr#1,#2,#3\finish{% {\plainfrenchspacing #1}% \def\temp{#2}% \ifx\temp\empty \else \space ({\unsepspaces \ignorespaces \temp \unskip})% \fi \null % reset \spacefactor=1000 } % @asis just yields its argument. Used with @table, for example. % \def\asis#1{#1} % @math outputs its argument in math mode. % % One complication: _ usually means subscripts, but it could also mean % an actual _ character, as in @math{@var{some_variable} + 1}. So make % _ active, and distinguish by seeing if the current family is \slfam, % which is what @var uses. { \catcode`\_ = \active \gdef\mathunderscore{% \catcode`\_=\active \def_{\ifnum\fam=\slfam \_\else\sb\fi}% } } % Another complication: we want \\ (and @\) to output a math (or tt) \. % FYI, plain.tex uses \\ as a temporary control sequence (for no % particular reason), but this is not advertised and we don't care. % % The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\. \def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi} % \def\math{% \ifmmode\else % only go into math if not in math mode already \tex \mathunderscore \let\\ = \mathbackslash \mathactive % make the texinfo accent commands work in math mode \let\"=\ddot \let\'=\acute \let\==\bar \let\^=\hat \let\`=\grave \let\u=\breve \let\v=\check \let\~=\tilde \let\dotaccent=\dot % have to provide another name for sup operator \let\mathopsup=\sup $\expandafter\finishmath\fi } \def\finishmath#1{#1$\endgroup} % Close the group opened by \tex. % Some active characters (such as <) are spaced differently in math. % We have to reset their definitions in case the @math was an argument % to a command which sets the catcodes (such as @item or @section). % { \catcode`^ = \active \catcode`< = \active \catcode`> = \active \catcode`+ = \active \catcode`' = \active \gdef\mathactive{% \let^ = \ptexhat \let< = \ptexless \let> = \ptexgtr \let+ = \ptexplus \let' = \ptexquoteright } } % for @sub and @sup, if in math mode, just do a normal sub/superscript. % If in text, use math to place as sub/superscript, but switch % into text mode, with smaller fonts. This is a different font than the % one used for real math sub/superscripts (8pt vs. 7pt), but let's not % fix it (significant additions to font machinery) until someone notices. % \def\sub{\ifmmode \expandafter\sb \else \expandafter\finishsub\fi} \def\finishsub#1{$\sb{\hbox{\switchtolllsize #1}}$}% % \def\sup{\ifmmode \expandafter\ptexsp \else \expandafter\finishsup\fi} \def\finishsup#1{$\ptexsp{\hbox{\switchtolllsize #1}}$}% % provide this command from LaTeX as it is very common \def\frac#1#2{{{#1}\over{#2}}} % @displaymath. % \globaldefs is needed to recognize the end lines in \tex and % \end tex. Set \thisenv as @end displaymath is seen before @end tex. {\obeylines \globaldefs=1 \envdef\displaymath{% \tex% \def\thisenv{\displaymath}% \begingroup\let\end\displaymathend% $$% } \def\displaymathend{$$\endgroup\end}% \def\Edisplaymath{% \def\thisenv{\tex}% \end tex }} % @inlinefmt{FMTNAME,PROCESSED-TEXT} and @inlineraw{FMTNAME,RAW-TEXT}. % Ignore unless FMTNAME == tex; then it is like @iftex and @tex, % except specified as a normal braced arg, so no newlines to worry about. % \def\outfmtnametex{tex} % \long\def\inlinefmt#1{\doinlinefmt #1,\finish} \long\def\doinlinefmt#1,#2,\finish{% \def\inlinefmtname{#1}% \ifx\inlinefmtname\outfmtnametex \ignorespaces #2\fi } % % @inlinefmtifelse{FMTNAME,THEN-TEXT,ELSE-TEXT} expands THEN-TEXT if % FMTNAME is tex, else ELSE-TEXT. \long\def\inlinefmtifelse#1{\doinlinefmtifelse #1,,,\finish} \long\def\doinlinefmtifelse#1,#2,#3,#4,\finish{% \def\inlinefmtname{#1}% \ifx\inlinefmtname\outfmtnametex \ignorespaces #2\else \ignorespaces #3\fi } % % For raw, must switch into @tex before parsing the argument, to avoid % setting catcodes prematurely. Doing it this way means that, for % example, @inlineraw{html, foo{bar} gets a parse error instead of being % ignored. But this isn't important because if people want a literal % *right* brace they would have to use a command anyway, so they may as % well use a command to get a left brace too. We could re-use the % delimiter character idea from \verb, but it seems like overkill. % \long\def\inlineraw{\tex \doinlineraw} \long\def\doinlineraw#1{\doinlinerawtwo #1,\finish} \def\doinlinerawtwo#1,#2,\finish{% \def\inlinerawname{#1}% \ifx\inlinerawname\outfmtnametex \ignorespaces #2\fi \endgroup % close group opened by \tex. } % @inlineifset{VAR, TEXT} expands TEXT if VAR is @set. % \long\def\inlineifset#1{\doinlineifset #1,\finish} \long\def\doinlineifset#1,#2,\finish{% \def\inlinevarname{#1}% \expandafter\ifx\csname SET\inlinevarname\endcsname\relax \else\ignorespaces#2\fi } % @inlineifclear{VAR, TEXT} expands TEXT if VAR is not @set. % \long\def\inlineifclear#1{\doinlineifclear #1,\finish} \long\def\doinlineifclear#1,#2,\finish{% \def\inlinevarname{#1}% \expandafter\ifx\csname SET\inlinevarname\endcsname\relax \ignorespaces#2\fi } \message{glyphs,} % and logos. % @@ prints an @, as does @atchar{}. \def\@{\char64 } \let\atchar=\@ % @{ @} @lbracechar{} @rbracechar{} all generate brace characters. \def\lbracechar{{\ifmonospace\char123\else\ensuremath\lbrace\fi}} \def\rbracechar{{\ifmonospace\char125\else\ensuremath\rbrace\fi}} \let\{=\lbracechar \let\}=\rbracechar % @comma{} to avoid , parsing problems. \let\comma = , % Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent % Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H. \let\, = \ptexc \let\dotaccent = \ptexdot \def\ringaccent#1{{\accent23 #1}} \let\tieaccent = \ptext \let\ubaraccent = \ptexb \let\udotaccent = \d % Other special characters: @questiondown @exclamdown @ordf @ordm % Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss. \def\questiondown{?`} \def\exclamdown{!`} \def\ordf{\leavevmode\raise1ex\hbox{\switchtolllsize \underbar{a}}} \def\ordm{\leavevmode\raise1ex\hbox{\switchtolllsize \underbar{o}}} % Dotless i and dotless j, used for accents. \def\imacro{i} \def\jmacro{j} \def\dotless#1{% \def\temp{#1}% \ifx\temp\imacro \ifmmode\imath \else\ptexi \fi \else\ifx\temp\jmacro \ifmmode\jmath \else\j \fi \else \errmessage{@dotless can be used only with i or j}% \fi\fi } % The \TeX{} logo, as in plain, but resetting the spacing so that a % period following counts as ending a sentence. (Idea found in latex.) % \edef\TeX{\TeX \spacefactor=1000 } % @LaTeX{} logo. Not quite the same results as the definition in % latex.ltx, since we use a different font for the raised A; it's most % convenient for us to use an explicitly smaller font, rather than using % the \scriptstyle font (since we don't reset \scriptstyle and % \scriptscriptstyle). % \def\LaTeX{% L\kern-.36em {\setbox0=\hbox{T}% \vbox to \ht0{\hbox{% \ifx\textnominalsize\xwordpt % for 10pt running text, lllsize (8pt) is too small for the A in LaTeX. % Revert to plain's \scriptsize, which is 7pt. \count255=\the\fam $\fam\count255 \scriptstyle A$% \else % For 11pt, we can use our lllsize. \switchtolllsize A% \fi }% \vss }}% \kern-.15em \TeX } % Some math mode symbols. Define \ensuremath to switch into math mode % unless we are already there. Expansion tricks may not be needed here, % but safer, and can't hurt. \def\ensuremath{\ifmmode \expandafter\asis \else\expandafter\ensuredmath \fi} \def\ensuredmath#1{$\relax#1$} % \def\bullet{\ensuremath\ptexbullet} \def\geq{\ensuremath\ge} \def\leq{\ensuremath\le} \def\minus{\ensuremath-} % @dots{} outputs an ellipsis using the current font. % We do .5em per period so that it has the same spacing in the cm % typewriter fonts as three actual period characters; on the other hand, % in other typewriter fonts three periods are wider than 1.5em. So do % whichever is larger. % \def\dots{% \leavevmode \setbox0=\hbox{...}% get width of three periods \ifdim\wd0 > 1.5em \dimen0 = \wd0 \else \dimen0 = 1.5em \fi \hbox to \dimen0{% \hskip 0pt plus.25fil .\hskip 0pt plus1fil .\hskip 0pt plus1fil .\hskip 0pt plus.5fil }% } % @enddots{} is an end-of-sentence ellipsis. % \def\enddots{% \dots \spacefactor=\endofsentencespacefactor } % @point{}, @result{}, @expansion{}, @print{}, @equiv{}. % % Since these characters are used in examples, they should be an even number of % \tt widths. Each \tt character is 1en, so two makes it 1em. % \def\point{$\star$} \def\arrow{\leavevmode\raise.05ex\hbox to 1em{\hfil$\rightarrow$\hfil}} \def\result{\leavevmode\raise.05ex\hbox to 1em{\hfil$\Rightarrow$\hfil}} \def\expansion{\leavevmode\hbox to 1em{\hfil$\mapsto$\hfil}} \def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}} \def\equiv{\leavevmode\hbox to 1em{\hfil$\ptexequiv$\hfil}} % The @error{} command. % Adapted from the TeXbook's \boxit. % \newbox\errorbox % {\ttfont \global\dimen0 = 3em}% Width of the box. \dimen2 = .55pt % Thickness of rules % The text. (`r' is open on the right, `e' somewhat less so on the left.) \setbox0 = \hbox{\kern-.75pt \reducedsf \putworderror\kern-1.5pt} % \setbox\errorbox=\hbox to \dimen0{\hfil \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right. \advance\hsize by -2\dimen2 % Rules. \vbox{% \hrule height\dimen2 \hbox{\vrule width\dimen2 \kern3pt % Space to left of text. \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below. \kern3pt\vrule width\dimen2}% Space to right. \hrule height\dimen2} \hfil} % \def\error{\leavevmode\lower.7ex\copy\errorbox} % @pounds{} is a sterling sign, which Knuth put in the CM italic font. % \def\pounds{\ifmonospace{\ecfont\char"BF}\else{\it\$}\fi} % @euro{} comes from a separate font, depending on the current style. % We use the free feym* fonts from the eurosym package by Henrik % Theiling, which support regular, slanted, bold and bold slanted (and % "outlined" (blackboard board, sort of) versions, which we don't need). % It is available from http://www.ctan.org/tex-archive/fonts/eurosym. % % Although only regular is the truly official Euro symbol, we ignore % that. The Euro is designed to be slightly taller than the regular % font height. % % feymr - regular % feymo - slanted % feybr - bold % feybo - bold slanted % % There is no good (free) typewriter version, to my knowledge. % A feymr10 euro is ~7.3pt wide, while a normal cmtt10 char is ~5.25pt wide. % Hmm. % % Also doesn't work in math. Do we need to do math with euro symbols? % Hope not. % % \def\euro{{\eurofont e}} \def\eurofont{% % We set the font at each command, rather than predefining it in % \textfonts and the other font-switching commands, so that % installations which never need the symbol don't have to have the % font installed. % % There is only one designed size (nominal 10pt), so we always scale % that to the current nominal size. % % By the way, simply using "at 1em" works for cmr10 and the like, but % does not work for cmbx10 and other extended/shrunken fonts. % \def\eurosize{\csname\curfontsize nominalsize\endcsname}% % \ifx\curfontstyle\bfstylename % bold: \font\thiseurofont = \ifusingit{feybo10}{feybr10} at \eurosize \else % regular: \font\thiseurofont = \ifusingit{feymo10}{feymr10} at \eurosize \fi \thiseurofont } % Glyphs from the EC fonts. We don't use \let for the aliases, because % sometimes we redefine the original macro, and the alias should reflect % the redefinition. % % Use LaTeX names for the Icelandic letters. \def\DH{{\ecfont \char"D0}} % Eth \def\dh{{\ecfont \char"F0}} % eth \def\TH{{\ecfont \char"DE}} % Thorn \def\th{{\ecfont \char"FE}} % thorn % \def\guillemetleft{{\ecfont \char"13}} \def\guillemotleft{\guillemetleft} \def\guillemetright{{\ecfont \char"14}} \def\guillemotright{\guillemetright} \def\guilsinglleft{{\ecfont \char"0E}} \def\guilsinglright{{\ecfont \char"0F}} \def\quotedblbase{{\ecfont \char"12}} \def\quotesinglbase{{\ecfont \char"0D}} % \def\L{{\ecfont \char"8A}} % L with stroke \def\l{{\ecfont \char"AA}} % l with stroke % % This positioning is not perfect (see the ogonek LaTeX package), but % we have the precomposed glyphs for the most common cases. We put the % tests to use those glyphs in the single \ogonek macro so we have fewer % dummy definitions to worry about for index entries, etc. % % ogonek is also used with other letters in Lithuanian (IOU), but using % the precomposed glyphs for those is not so easy since they aren't in % the same EC font. \def\ogonek#1{{% \def\temp{#1}% \ifx\temp\macrocharA\Aogonek \else\ifx\temp\macrochara\aogonek \else\ifx\temp\macrocharE\Eogonek \else\ifx\temp\macrochare\eogonek \else \ecfont \setbox0=\hbox{#1}% \ifdim\ht0=1ex\accent"0C #1% \else\ooalign{\unhbox0\crcr\hidewidth\char"0C \hidewidth}% \fi \fi\fi\fi\fi }% } \def\Aogonek{{\ecfont \char"81}}\def\macrocharA{A} \def\aogonek{{\ecfont \char"A1}}\def\macrochara{a} \def\Eogonek{{\ecfont \char"86}}\def\macrocharE{E} \def\eogonek{{\ecfont \char"A6}}\def\macrochare{e} % % Use the European Computer Modern fonts (cm-super in outline format) % for non-CM glyphs. That is ec* for regular text and tc* for the text % companion symbols (LaTeX TS1 encoding). Both are part of the ec % package and follow the same conventions. % \def\ecfont{\etcfont{e}} \def\tcfont{\etcfont{t}} % \def\etcfont#1{% % We can't distinguish serif/sans and italic/slanted, but this % is used for crude hacks anyway (like adding French and German % quotes to documents typeset with CM, where we lose kerning), so % hopefully nobody will notice/care. \edef\ecsize{\csname\curfontsize ecsize\endcsname}% \edef\nominalsize{\csname\curfontsize nominalsize\endcsname}% \ifmonospace % typewriter: \font\thisecfont = #1ctt\ecsize \space at \nominalsize \else \ifx\curfontstyle\bfstylename % bold: \font\thisecfont = #1cb\ifusingit{i}{x}\ecsize \space at \nominalsize \else % regular: \font\thisecfont = #1c\ifusingit{ti}{rm}\ecsize \space at \nominalsize \fi \fi \thisecfont } % @registeredsymbol - R in a circle. The font for the R should really % be smaller yet, but lllsize is the best we can do for now. % Adapted from the plain.tex definition of \copyright. % \def\registeredsymbol{% $^{{\ooalign{\hfil\raise.07ex\hbox{\switchtolllsize R}% \hfil\crcr\Orb}}% }$% } % @textdegree - the normal degrees sign. % \def\textdegree{$^\circ$} % Laurent Siebenmann reports \Orb undefined with: % Textures 1.7.7 (preloaded format=plain 93.10.14) (68K) 16 APR 2004 02:38 % so we'll define it if necessary. % \ifx\Orb\thisisundefined \def\Orb{\mathhexbox20D} \fi % Quotes. \chardef\quoteleft=`\` \chardef\quoteright=`\' % only change font for tt for correct kerning and to avoid using % \ecfont unless necessary. \def\quotedblleft{% \ifmonospace{\ecfont\char"10}\else{\char"5C}\fi } \def\quotedblright{% \ifmonospace{\ecfont\char"11}\else{\char`\"}\fi } \message{page headings,} \newskip\titlepagetopglue \titlepagetopglue = 1.5in \newskip\titlepagebottomglue \titlepagebottomglue = 2pc % First the title page. Must do @settitle before @titlepage. \newif\ifseenauthor \newif\iffinishedtitlepage % @setcontentsaftertitlepage used to do an implicit @contents or % @shortcontents after @end titlepage, but it is now obsolete. \def\setcontentsaftertitlepage{% \errmessage{@setcontentsaftertitlepage has been removed as a Texinfo command; move your @contents command if you want the contents after the title page.}}% \def\setshortcontentsaftertitlepage{% \errmessage{@setshortcontentsaftertitlepage has been removed as a Texinfo command; move your @shortcontents and @contents commands if you want the contents after the title page.}}% \parseargdef\shorttitlepage{% \begingroup \hbox{}\vskip 1.5in \chaprm \centerline{#1}% \endgroup\page\hbox{}\page} \envdef\titlepage{% % Open one extra group, as we want to close it in the middle of \Etitlepage. \begingroup \parindent=0pt \textfonts % Leave some space at the very top of the page. \vglue\titlepagetopglue % No rule at page bottom unless we print one at the top with @title. \finishedtitlepagetrue % % Most title ``pages'' are actually two pages long, with space % at the top of the second. We don't want the ragged left on the second. \let\oldpage = \page \def\page{% \iffinishedtitlepage\else \finishtitlepage \fi \let\page = \oldpage \page \null }% } \def\Etitlepage{% \iffinishedtitlepage\else \finishtitlepage \fi % It is important to do the page break before ending the group, % because the headline and footline are only empty inside the group. % If we use the new definition of \page, we always get a blank page % after the title page, which we certainly don't want. \oldpage \endgroup % % Need this before the \...aftertitlepage checks so that if they are % in effect the toc pages will come out with page numbers. \HEADINGSon } \def\finishtitlepage{% \vskip4pt \hrule height 2pt width \hsize \vskip\titlepagebottomglue \finishedtitlepagetrue } % Settings used for typesetting titles: no hyphenation, no indentation, % don't worry much about spacing, ragged right. This should be used % inside a \vbox, and fonts need to be set appropriately first. \par should % be specified before the end of the \vbox, since a vbox is a group. % \def\raggedtitlesettings{% \rm \hyphenpenalty=10000 \parindent=0pt \tolerance=5000 \ptexraggedright } % Macros to be used within @titlepage: \let\subtitlerm=\rmfont \def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines} \parseargdef\title{% \checkenv\titlepage \vbox{\titlefonts \raggedtitlesettings #1\par}% % print a rule at the page bottom also. \finishedtitlepagefalse \vskip4pt \hrule height 4pt width \hsize \vskip4pt } \parseargdef\subtitle{% \checkenv\titlepage {\subtitlefont \rightline{#1}}% } % @author should come last, but may come many times. % It can also be used inside @quotation. % \parseargdef\author{% \def\temp{\quotation}% \ifx\thisenv\temp \def\quotationauthor{#1}% printed in \Equotation. \else \checkenv\titlepage \ifseenauthor\else \vskip 0pt plus 1filll \seenauthortrue \fi {\secfonts\rm \leftline{#1}}% \fi } % Set up page headings and footings. \let\thispage=\folio \newtoks\evenheadline % headline on even pages \newtoks\oddheadline % headline on odd pages \newtoks\evenchapheadline% headline on even pages with a new chapter \newtoks\oddchapheadline % headline on odd pages with a new chapter \newtoks\evenfootline % footline on even pages \newtoks\oddfootline % footline on odd pages % Now make \makeheadline and \makefootline in Plain TeX use those variables \headline={{\textfonts\rm \ifchapterpage \ifodd\pageno\the\oddchapheadline\else\the\evenchapheadline\fi \else \ifodd\pageno\the\oddheadline\else\the\evenheadline\fi \fi}} \footline={{\textfonts\rm \ifodd\pageno \the\oddfootline \else \the\evenfootline \fi}\HEADINGShook} \let\HEADINGShook=\relax % Commands to set those variables. % For example, this is what @headings on does % @evenheading @thistitle|@thispage|@thischapter % @oddheading @thischapter|@thispage|@thistitle % @evenfooting @thisfile|| % @oddfooting ||@thisfile \def\evenheading{\parsearg\evenheadingxxx} \def\evenheadingxxx #1{\evenheadingyyy #1\|\|\|\|\finish} \def\evenheadingyyy #1\|#2\|#3\|#4\finish{% \global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}} \global\evenchapheadline=\evenheadline} \def\oddheading{\parsearg\oddheadingxxx} \def\oddheadingxxx #1{\oddheadingyyy #1\|\|\|\|\finish} \def\oddheadingyyy #1\|#2\|#3\|#4\finish{% \global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}% \global\oddchapheadline=\oddheadline} \parseargdef\everyheading{\oddheadingxxx{#1}\evenheadingxxx{#1}}% \def\evenfooting{\parsearg\evenfootingxxx} \def\evenfootingxxx #1{\evenfootingyyy #1\|\|\|\|\finish} \def\evenfootingyyy #1\|#2\|#3\|#4\finish{% \global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} \def\oddfooting{\parsearg\oddfootingxxx} \def\oddfootingxxx #1{\oddfootingyyy #1\|\|\|\|\finish} \def\oddfootingyyy #1\|#2\|#3\|#4\finish{% \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}% % % Leave some space for the footline. Hopefully ok to assume % @evenfooting will not be used by itself. \global\advance\txipageheight by -12pt \global\advance\vsize by -12pt } \parseargdef\everyfooting{\oddfootingxxx{#1}\evenfootingxxx{#1}} % @evenheadingmarks top \thischapter <- chapter at the top of a page % @evenheadingmarks bottom \thischapter <- chapter at the bottom of a page % % The same set of arguments for: % % @oddheadingmarks % @evenfootingmarks % @oddfootingmarks % @everyheadingmarks % @everyfootingmarks % These define \getoddheadingmarks, \getevenheadingmarks, % \getoddfootingmarks, and \getevenfootingmarks, each to one of % \gettopheadingmarks, \getbottomheadingmarks. % \def\evenheadingmarks{\headingmarks{even}{heading}} \def\oddheadingmarks{\headingmarks{odd}{heading}} \def\evenfootingmarks{\headingmarks{even}{footing}} \def\oddfootingmarks{\headingmarks{odd}{footing}} \parseargdef\everyheadingmarks{\headingmarks{even}{heading}{#1} \headingmarks{odd}{heading}{#1} } \parseargdef\everyfootingmarks{\headingmarks{even}{footing}{#1} \headingmarks{odd}{footing}{#1} } % #1 = even/odd, #2 = heading/footing, #3 = top/bottom. \def\headingmarks#1#2#3 {% \expandafter\let\expandafter\temp \csname get#3headingmarks\endcsname \global\expandafter\let\csname get#1#2marks\endcsname \temp } \everyheadingmarks bottom \everyfootingmarks bottom % @headings double turns headings on for double-sided printing. % @headings single turns headings on for single-sided printing. % @headings off turns them off. % @headings on same as @headings double, retained for compatibility. % @headings after turns on double-sided headings after this page. % @headings doubleafter turns on double-sided headings after this page. % @headings singleafter turns on single-sided headings after this page. % By default, they are off at the start of a document, % and turned `on' after @end titlepage. \parseargdef\headings{\csname HEADINGS#1\endcsname} \def\headingsoff{% non-global headings elimination \evenheadline={\hfil}\evenfootline={\hfil}\evenchapheadline={\hfil}% \oddheadline={\hfil}\oddfootline={\hfil}\oddchapheadline={\hfil}% } \def\HEADINGSoff{{\globaldefs=1 \headingsoff}} % global setting \HEADINGSoff % it's the default % When we turn headings on, set the page number to 1. \def\pageone{ \global\pageno=1 \global\arabiccount = \pagecount } % For double-sided printing, put current file name in lower left corner, % chapter name on inside top of right hand pages, document % title on inside top of left hand pages, and page numbers on outside top % edge of all pages. \def\HEADINGSdouble{% \pageone \HEADINGSdoublex } \let\contentsalignmacro = \chappager % For single-sided printing, chapter title goes across top left of page, % page number on top right. \def\HEADINGSsingle{% \pageone \HEADINGSsinglex } \def\HEADINGSon{\HEADINGSdouble} \def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex} \let\HEADINGSdoubleafter=\HEADINGSafter \def\HEADINGSdoublex{% \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\folio\hfil\thistitle}} \global\oddheadline={\line{\thischapter\hfil\folio}} \global\evenchapheadline={\line{\folio\hfil}} \global\oddchapheadline={\line{\hfil\folio}} \global\let\contentsalignmacro = \chapoddpage } \def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex} \def\HEADINGSsinglex{% \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\thischapter\hfil\folio}} \global\oddheadline={\line{\thischapter\hfil\folio}} \global\evenchapheadline={\line{\hfil\folio}} \global\oddchapheadline={\line{\hfil\folio}} \global\let\contentsalignmacro = \chappager } % for @setchapternewpage off \def\HEADINGSsinglechapoff{% \pageone \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\thischapter\hfil\folio}} \global\oddheadline={\line{\thischapter\hfil\folio}} \global\evenchapheadline=\evenheadline \global\oddchapheadline=\oddheadline \global\let\contentsalignmacro = \chappager } % Subroutines used in generating headings % This produces Day Month Year style of output. % Only define if not already defined, in case a txi-??.tex file has set % up a different format (e.g., txi-cs.tex does this). \ifx\today\thisisundefined \def\today{% \number\day\space \ifcase\month \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec \fi \space\number\year} \fi % @settitle line... specifies the title of the document, for headings. % It generates no output of its own. \def\thistitle{\putwordNoTitle} \def\settitle{\parsearg{\gdef\thistitle}} \message{tables,} % Tables -- @table, @ftable, @vtable, @item(x). % default indentation of table text \newdimen\tableindent \tableindent=.8in % default indentation of @itemize and @enumerate text \newdimen\itemindent \itemindent=.3in % margin between end of table item and start of table text. \newdimen\itemmargin \itemmargin=.1in % used internally for \itemindent minus \itemmargin \newdimen\itemmax % Note @table, @ftable, and @vtable define @item, @itemx, etc., with % these defs. % They also define \itemindex % to index the item name in whatever manner is desired (perhaps none). \newif\ifitemxneedsnegativevskip \def\itemxpar{\par\ifitemxneedsnegativevskip\nobreak\vskip-\parskip\nobreak\fi} \def\internalBitem{\smallbreak \parsearg\itemzzz} \def\internalBitemx{\itemxpar \parsearg\itemzzz} \def\itemzzz #1{\begingroup % \advance\hsize by -\rightskip \advance\hsize by -\tableindent \setbox0=\hbox{\itemindicate{#1}}% \itemindex{#1}% \nobreak % This prevents a break before @itemx. % % If the item text does not fit in the space we have, put it on a line % by itself, and do not allow a page break either before or after that % line. We do not start a paragraph here because then if the next % command is, e.g., @kindex, the whatsit would get put into the % horizontal list on a line by itself, resulting in extra blank space. \ifdim \wd0>\itemmax % % Make this a paragraph so we get the \parskip glue and wrapping, % but leave it ragged-right. \begingroup \advance\leftskip by-\tableindent \advance\hsize by\tableindent \advance\rightskip by0pt plus1fil\relax \leavevmode\unhbox0\par \endgroup % % We're going to be starting a paragraph, but we don't want the % \parskip glue -- logically it's part of the @item we just started. \nobreak \vskip-\parskip % % Stop a page break at the \parskip glue coming up. However, if % what follows is an environment such as @example, there will be no % \parskip glue; then the negative vskip we just inserted would % cause the example and the item to crash together. So we use this % bizarre value of 10001 as a signal to \aboveenvbreak to insert % \parskip glue after all. Section titles are handled this way also. % \penalty 10001 \endgroup \itemxneedsnegativevskipfalse \else % The item text fits into the space. Start a paragraph, so that the % following text (if any) will end up on the same line. \noindent % Do this with kerns and \unhbox so that if there is a footnote in % the item text, it can migrate to the main vertical list and % eventually be printed. \nobreak\kern-\tableindent \dimen0 = \itemmax \advance\dimen0 by \itemmargin \advance\dimen0 by -\wd0 \unhbox0 \nobreak\kern\dimen0 \endgroup \itemxneedsnegativevskiptrue \fi } \def\item{\errmessage{@item while not in a list environment}} \def\itemx{\errmessage{@itemx while not in a list environment}} % @table, @ftable, @vtable. \envdef\table{% \let\itemindex\gobble \tablecheck{table}% } \envdef\ftable{% \def\itemindex ##1{\doind {fn}{\code{##1}}}% \tablecheck{ftable}% } \envdef\vtable{% \def\itemindex ##1{\doind {vr}{\code{##1}}}% \tablecheck{vtable}% } \def\tablecheck#1{% \ifnum \the\catcode`\^^M=\active \endgroup \errmessage{This command won't work in this context; perhaps the problem is that we are \inenvironment\thisenv}% \def\next{\doignore{#1}}% \else \let\next\tablex \fi \next } \def\tablex#1{% \def\itemindicate{#1}% \parsearg\tabley } \def\tabley#1{% {% \makevalueexpandable \edef\temp{\noexpand\tablez #1\space\space\space}% \expandafter }\temp \endtablez } \def\tablez #1 #2 #3 #4\endtablez{% \aboveenvbreak \ifnum 0#1>0 \advance \leftskip by #1\mil \fi \ifnum 0#2>0 \tableindent=#2\mil \fi \ifnum 0#3>0 \advance \rightskip by #3\mil \fi \itemmax=\tableindent \advance \itemmax by -\itemmargin \advance \leftskip by \tableindent \exdentamount=\tableindent \parindent = 0pt \parskip = \smallskipamount \ifdim \parskip=0pt \parskip=2pt \fi \let\item = \internalBitem \let\itemx = \internalBitemx } \def\Etable{\endgraf\afterenvbreak} \let\Eftable\Etable \let\Evtable\Etable \let\Eitemize\Etable \let\Eenumerate\Etable % This is the counter used by @enumerate, which is really @itemize \newcount \itemno \envdef\itemize{\parsearg\doitemize} \def\doitemize#1{% \aboveenvbreak \itemmax=\itemindent \advance\itemmax by -\itemmargin \advance\leftskip by \itemindent \exdentamount=\itemindent \parindent=0pt \parskip=\smallskipamount \ifdim\parskip=0pt \parskip=2pt \fi % % Try typesetting the item mark so that if the document erroneously says % something like @itemize @samp (intending @table), there's an error % right away at the @itemize. It's not the best error message in the % world, but it's better than leaving it to the @item. This means if % the user wants an empty mark, they have to say @w{} not just @w. \def\itemcontents{#1}% \setbox0 = \hbox{\itemcontents}% % % @itemize with no arg is equivalent to @itemize @bullet. \ifx\itemcontents\empty\def\itemcontents{\bullet}\fi % \let\item=\itemizeitem } % Definition of @item while inside @itemize and @enumerate. % \def\itemizeitem{% \advance\itemno by 1 % for enumerations {\let\par=\endgraf \smallbreak}% reasonable place to break {% % If the document has an @itemize directly after a section title, a % \nobreak will be last on the list, and \sectionheading will have % done a \vskip-\parskip. In that case, we don't want to zero % parskip, or the item text will crash with the heading. On the % other hand, when there is normal text preceding the item (as there % usually is), we do want to zero parskip, or there would be too much % space. In that case, we won't have a \nobreak before. At least % that's the theory. \ifnum\lastpenalty<10000 \parskip=0in \fi \noindent \hbox to 0pt{\hss \itemcontents \kern\itemmargin}% % \ifinner\else \vadjust{\penalty 1200}% not good to break after first line of item. \fi % We can be in inner vertical mode in a footnote, although an % @itemize looks awful there. }% \flushcr } % \splitoff TOKENS\endmark defines \first to be the first token in % TOKENS, and \rest to be the remainder. % \def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}% % Allow an optional argument of an uppercase letter, lowercase letter, % or number, to specify the first label in the enumerated list. No % argument is the same as `1'. % \envparseargdef\enumerate{\enumeratey #1 \endenumeratey} \def\enumeratey #1 #2\endenumeratey{% % If we were given no argument, pretend we were given `1'. \def\thearg{#1}% \ifx\thearg\empty \def\thearg{1}\fi % % Detect if the argument is a single token. If so, it might be a % letter. Otherwise, the only valid thing it can be is a number. % (We will always have one token, because of the test we just made. % This is a good thing, since \splitoff doesn't work given nothing at % all -- the first parameter is undelimited.) \expandafter\splitoff\thearg\endmark \ifx\rest\empty % Only one token in the argument. It could still be anything. % A ``lowercase letter'' is one whose \lccode is nonzero. % An ``uppercase letter'' is one whose \lccode is both nonzero, and % not equal to itself. % Otherwise, we assume it's a number. % % We need the \relax at the end of the \ifnum lines to stop TeX from % continuing to look for a . % \ifnum\lccode\expandafter`\thearg=0\relax \numericenumerate % a number (we hope) \else % It's a letter. \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax \lowercaseenumerate % lowercase letter \else \uppercaseenumerate % uppercase letter \fi \fi \else % Multiple tokens in the argument. We hope it's a number. \numericenumerate \fi } % An @enumerate whose labels are integers. The starting integer is % given in \thearg. % \def\numericenumerate{% \itemno = \thearg \startenumeration{\the\itemno}% } % The starting (lowercase) letter is in \thearg. \def\lowercaseenumerate{% \itemno = \expandafter`\thearg \startenumeration{% % Be sure we're not beyond the end of the alphabet. \ifnum\itemno=0 \errmessage{No more lowercase letters in @enumerate; get a bigger alphabet}% \fi \char\lccode\itemno }% } % The starting (uppercase) letter is in \thearg. \def\uppercaseenumerate{% \itemno = \expandafter`\thearg \startenumeration{% % Be sure we're not beyond the end of the alphabet. \ifnum\itemno=0 \errmessage{No more uppercase letters in @enumerate; get a bigger alphabet} \fi \char\uccode\itemno }% } % Call \doitemize, adding a period to the first argument and supplying the % common last two arguments. Also subtract one from the initial value in % \itemno, since @item increments \itemno. % \def\startenumeration#1{% \advance\itemno by -1 \doitemize{#1.}\flushcr } % @multitable macros % Macros used to set up halign preamble: % \let\endsetuptable\relax \def\xendsetuptable{\endsetuptable} \let\columnfractions\relax \def\xcolumnfractions{\columnfractions} \newif\ifsetpercent % #1 is the @columnfraction, usually a decimal number like .5, but might % be just 1. We just use it, whatever it is. % \def\pickupwholefraction#1 {% \global\advance\colcount by 1 \expandafter\xdef\csname col\the\colcount\endcsname{#1\hsize}% \setuptable } \newcount\colcount \def\setuptable#1{% \def\firstarg{#1}% \ifx\firstarg\xendsetuptable \let\go = \relax \else \ifx\firstarg\xcolumnfractions \global\setpercenttrue \else \ifsetpercent \let\go\pickupwholefraction \else \global\advance\colcount by 1 \setbox0=\hbox{#1\unskip\space}% Add a normal word space as a % separator; typically that is always in the input, anyway. \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}% \fi \fi \ifx\go\pickupwholefraction % Put the argument back for the \pickupwholefraction call, so % we'll always have a period there to be parsed. \def\go{\pickupwholefraction#1}% \else \let\go = \setuptable \fi% \fi \go } % @headitem starts a heading row, which we typeset in bold. Assignments % have to be global since we are inside the implicit group of an % alignment entry. \everycr below resets \everytab so we don't have to % undo it ourselves. \def\headitemfont{\b}% for people to use in the template row; not changeable \def\headitem{% \checkenv\multitable \crcr \gdef\headitemcrhook{\nobreak}% attempt to avoid page break after headings \global\everytab={\bf}% can't use \headitemfont since the parsing differs \the\everytab % for the first item }% % % default for tables with no headings. \let\headitemcrhook=\relax % \def\tab{\checkenv\multitable &\the\everytab}% \newtoks\everytab % insert after every tab. % \envdef\multitable{% \vskip\parskip \startsavinginserts % % @item within a multitable starts a normal row. % We use \def instead of \let so that if one of the multitable entries % contains an @itemize, we don't choke on the \item (seen as \crcr aka % \endtemplate) expanding \doitemize. \def\item{\crcr}% % \tolerance=9500 \hbadness=9500 \parskip=0pt \parindent=6pt \overfullrule=0pt \global\colcount=0 % \everycr = {% \noalign{% \global\everytab={}% Reset from possible headitem. \global\colcount=0 % Reset the column counter. % % Check for saved footnotes, etc.: \checkinserts % % Perhaps a \nobreak, then reset: \headitemcrhook \global\let\headitemcrhook=\relax }% }% % \parsearg\domultitable } \def\domultitable#1{% % To parse everything between @multitable and @item: \setuptable#1 \endsetuptable % % This preamble sets up a generic column definition, which will % be used as many times as user calls for columns. % \vtop will set a single line and will also let text wrap and % continue for many paragraphs if desired. \halign\bgroup &% \global\advance\colcount by 1 \strut \vtop{% \advance\hsize by -1\leftskip % Find the correct column width \hsize=\expandafter\csname col\the\colcount\endcsname % \rightskip=0pt \ifnum\colcount=1 \advance\hsize by\leftskip % Add indent of surrounding text \else % In order to keep entries from bumping into each other. \leftskip=12pt \ifsetpercent \else % If a template has been used \advance\hsize by \leftskip \fi \fi \noindent\ignorespaces##\unskip\strut }\cr } \def\Emultitable{% \crcr \egroup % end the \halign \global\setpercentfalse } \message{conditionals,} % @iftex, @ifnotdocbook, @ifnothtml, @ifnotinfo, @ifnotplaintext, % @ifnotxml always succeed. They currently do nothing; we don't % attempt to check whether the conditionals are properly nested. But we % have to remember that they are conditionals, so that @end doesn't % attempt to close an environment group. % \def\makecond#1{% \expandafter\let\csname #1\endcsname = \relax \expandafter\let\csname iscond.#1\endcsname = 1 } \makecond{iftex} \makecond{ifnotdocbook} \makecond{ifnothtml} \makecond{ifnotinfo} \makecond{ifnotplaintext} \makecond{ifnotxml} % Ignore @ignore, @ifhtml, @ifinfo, and the like. % \def\direntry{\doignore{direntry}} \def\documentdescription{\doignore{documentdescription}} \def\docbook{\doignore{docbook}} \def\html{\doignore{html}} \def\ifdocbook{\doignore{ifdocbook}} \def\ifhtml{\doignore{ifhtml}} \def\ifinfo{\doignore{ifinfo}} \def\ifnottex{\doignore{ifnottex}} \def\ifplaintext{\doignore{ifplaintext}} \def\ifxml{\doignore{ifxml}} \def\ignore{\doignore{ignore}} \def\menu{\doignore{menu}} \def\xml{\doignore{xml}} % Ignore text until a line `@end #1', keeping track of nested conditionals. % % A count to remember the depth of nesting. \newcount\doignorecount \def\doignore#1{\begingroup % Scan in ``verbatim'' mode: \obeylines \catcode`\@ = \other \catcode`\{ = \other \catcode`\} = \other % % Make sure that spaces turn into tokens that match what \doignoretext wants. \spaceisspace % % Count number of #1's that we've seen. \doignorecount = 0 % % Swallow text until we reach the matching `@end #1'. \dodoignore{#1}% } { \catcode`_=11 % We want to use \_STOP_ which cannot appear in texinfo source. \obeylines % % \gdef\dodoignore#1{% % #1 contains the command name as a string, e.g., `ifinfo'. % % Define a command to find the next `@end #1'. \long\def\doignoretext##1^^M@end #1{% \doignoretextyyy##1^^M@#1\_STOP_}% % % And this command to find another #1 command, at the beginning of a % line. (Otherwise, we would consider a line `@c @ifset', for % example, to count as an @ifset for nesting.) \long\def\doignoretextyyy##1^^M@#1##2\_STOP_{\doignoreyyy{##2}\_STOP_}% % % And now expand that command. \doignoretext ^^M% }% } \def\doignoreyyy#1{% \def\temp{#1}% \ifx\temp\empty % Nothing found. \let\next\doignoretextzzz \else % Found a nested condition, ... \advance\doignorecount by 1 \let\next\doignoretextyyy % ..., look for another. % If we're here, #1 ends with ^^M\ifinfo (for example). \fi \next #1% the token \_STOP_ is present just after this macro. } % We have to swallow the remaining "\_STOP_". % \def\doignoretextzzz#1{% \ifnum\doignorecount = 0 % We have just found the outermost @end. \let\next\enddoignore \else % Still inside a nested condition. \advance\doignorecount by -1 \let\next\doignoretext % Look for the next @end. \fi \next } % Finish off ignored text. { \obeylines% % Ignore anything after the last `@end #1'; this matters in verbatim % environments, where otherwise the newline after an ignored conditional % would result in a blank line in the output. \gdef\enddoignore#1^^M{\endgroup\ignorespaces}% } % @set VAR sets the variable VAR to an empty value. % @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE. % % Since we want to separate VAR from REST-OF-LINE (which might be % empty), we can't just use \parsearg; we have to insert a space of our % own to delimit the rest of the line, and then take it out again if we % didn't need it. % We rely on the fact that \parsearg sets \catcode`\ =10. % \parseargdef\set{\setyyy#1 \endsetyyy} \def\setyyy#1 #2\endsetyyy{% {% \makevalueexpandable \def\temp{#2}% \edef\next{\gdef\makecsname{SET#1}}% \ifx\temp\empty \next{}% \else \setzzz#2\endsetzzz \fi }% } % Remove the trailing space \setxxx inserted. \def\setzzz#1 \endsetzzz{\next{#1}} % @clear VAR clears (i.e., unsets) the variable VAR. % \parseargdef\clear{% {% \makevalueexpandable \global\expandafter\let\csname SET#1\endcsname=\relax }% } % @value{foo} gets the text saved in variable foo. \def\value{\begingroup\makevalueexpandable\valuexxx} \def\valuexxx#1{\expandablevalue{#1}\endgroup} { \catcode`\-=\active \catcode`\_=\active % \gdef\makevalueexpandable{% \let\value = \expandablevalue % We don't want these characters active, ... \catcode`\-=\other \catcode`\_=\other % ..., but we might end up with active ones in the argument if % we're called from @code, as @code{@value{foo-bar_}}, though. % So \let them to their normal equivalents. \let-\normaldash \let_\normalunderscore } } \def\expandablevalue#1{% \expandafter\ifx\csname SET#1\endcsname\relax {[No value for ``#1'']}% \message{Variable `#1', used in @value, is not set.}% \else \csname SET#1\endcsname \fi } % Like \expandablevalue, but completely expandable (the \message in the % definition above operates at the execution level of TeX). Used when % writing to auxiliary files, due to the expansion that \write does. % If flag is undefined, pass through an unexpanded @value command: maybe it % will be set by the time it is read back in. % % NB flag names containing - or _ may not work here. \def\dummyvalue#1{% \expandafter\ifx\csname SET#1\endcsname\relax \string\value{#1}% \else \csname SET#1\endcsname \fi } % Used for @value's in index entries to form the sort key: expand the @value % if possible, otherwise sort late. \def\indexnofontsvalue#1{% \expandafter\ifx\csname SET#1\endcsname\relax ZZZZZZZ% \else \csname SET#1\endcsname \fi } % @ifset VAR ... @end ifset reads the `...' iff VAR has been defined % with @set. % % To get the special treatment we need for `@end ifset,' we call % \makecond and then redefine. % \makecond{ifset} \def\ifset{\parsearg{\doifset{\let\next=\ifsetfail}}} \def\doifset#1#2{% {% \makevalueexpandable \let\next=\empty \expandafter\ifx\csname SET#2\endcsname\relax #1% If not set, redefine \next. \fi \expandafter }\next } \def\ifsetfail{\doignore{ifset}} % @ifclear VAR ... @end executes the `...' iff VAR has never been % defined with @set, or has been undefined with @clear. % % The `\else' inside the `\doifset' parameter is a trick to reuse the % above code: if the variable is not set, do nothing, if it is set, % then redefine \next to \ifclearfail. % \makecond{ifclear} \def\ifclear{\parsearg{\doifset{\else \let\next=\ifclearfail}}} \def\ifclearfail{\doignore{ifclear}} % @ifcommandisdefined CMD ... @end executes the `...' if CMD (written % without the @) is in fact defined. We can only feasibly check at the % TeX level, so something like `mathcode' is going to considered % defined even though it is not a Texinfo command. % \makecond{ifcommanddefined} \def\ifcommanddefined{\parsearg{\doifcmddefined{\let\next=\ifcmddefinedfail}}} % \def\doifcmddefined#1#2{{% \makevalueexpandable \let\next=\empty \expandafter\ifx\csname #2\endcsname\relax #1% If not defined, \let\next as above. \fi \expandafter }\next } \def\ifcmddefinedfail{\doignore{ifcommanddefined}} % @ifcommandnotdefined CMD ... handled similar to @ifclear above. \makecond{ifcommandnotdefined} \def\ifcommandnotdefined{% \parsearg{\doifcmddefined{\else \let\next=\ifcmdnotdefinedfail}}} \def\ifcmdnotdefinedfail{\doignore{ifcommandnotdefined}} % Set the `txicommandconditionals' variable, so documents have a way to % test if the @ifcommand...defined conditionals are available. \set txicommandconditionals % @dircategory CATEGORY -- specify a category of the dir file % which this file should belong to. Ignore this in TeX. \let\dircategory=\comment % @defininfoenclose. \let\definfoenclose=\comment \message{indexing,} % Index generation facilities % Define \newwrite to be identical to plain tex's \newwrite % except not \outer, so it can be used within macros and \if's. \edef\newwrite{\makecsname{ptexnewwrite}} % \newindex {foo} defines an index named IX. % It automatically defines \IXindex such that % \IXindex ...rest of line... puts an entry in the index IX. % It also defines \IXindfile to be the number of the output channel for % the file that accumulates this index. The file's extension is IX. % The name of an index should be no more than 2 characters long % for the sake of vms. % \def\newindex#1{% \expandafter\chardef\csname#1indfile\endcsname=0 \expandafter\xdef\csname#1index\endcsname{% % Define @#1index \noexpand\doindex{#1}} } % @defindex foo == \newindex{foo} % \def\defindex{\parsearg\newindex} % Define @defcodeindex, like @defindex except put all entries in @code. % \def\defcodeindex{\parsearg\newcodeindex} % \def\newcodeindex#1{% \expandafter\chardef\csname#1indfile\endcsname=0 \expandafter\xdef\csname#1index\endcsname{% \noexpand\docodeindex{#1}}% } % The default indices: \newindex{cp}% concepts, \newcodeindex{fn}% functions, \newcodeindex{vr}% variables, \newcodeindex{tp}% types, \newcodeindex{ky}% keys \newcodeindex{pg}% and programs. % @synindex foo bar makes index foo feed into index bar. % Do this instead of @defindex foo if you don't want it as a separate index. % % @syncodeindex foo bar similar, but put all entries made for index foo % inside @code. % \def\synindex#1 #2 {\dosynindex\doindex{#1}{#2}} \def\syncodeindex#1 #2 {\dosynindex\docodeindex{#1}{#2}} % #1 is \doindex or \docodeindex, #2 the index getting redefined (foo), % #3 the target index (bar). \def\dosynindex#1#2#3{% \requireopenindexfile{#3}% % redefine \fooindfile: \expandafter\let\expandafter\temp\expandafter=\csname#3indfile\endcsname \expandafter\let\csname#2indfile\endcsname=\temp % redefine \fooindex: \expandafter\xdef\csname#2index\endcsname{\noexpand#1{#3}}% } % Define \doindex, the driver for all index macros. % Argument #1 is generated by the calling \fooindex macro, % and it is the two-letter name of the index. \def\doindex#1{\edef\indexname{#1}\parsearg\doindexxxx} \def\doindexxxx #1{\doind{\indexname}{#1}} % like the previous two, but they put @code around the argument. \def\docodeindex#1{\edef\indexname{#1}\parsearg\docodeindexxxx} \def\docodeindexxxx #1{\docind{\indexname}{#1}} % Used for the aux, toc and index files to prevent expansion of Texinfo % commands. % \def\atdummies{% \definedummyletter\@% \definedummyletter\ % \definedummyletter\{% \definedummyletter\}% \definedummyletter\&% % % Do the redefinitions. \definedummies \otherbackslash } % \definedummyword defines \#1 as \string\#1\space, thus effectively % preventing its expansion. This is used only for control words, % not control letters, because the \space would be incorrect for % control characters, but is needed to separate the control word % from whatever follows. % % These can be used both for control words that take an argument and % those that do not. If it is followed by {arg} in the input, then % that will dutifully get written to the index (or wherever). % % For control letters, we have \definedummyletter, which omits the % space. % \def\definedummyword #1{\def#1{\string#1\space}}% \def\definedummyletter#1{\def#1{\string#1}}% \let\definedummyaccent\definedummyletter % Called from \atdummies to prevent the expansion of commands. % \def\definedummies{% % \let\commondummyword\definedummyword \let\commondummyletter\definedummyletter \let\commondummyaccent\definedummyaccent \commondummiesnofonts % \definedummyletter\_% \definedummyletter\-% % % Non-English letters. \definedummyword\AA \definedummyword\AE \definedummyword\DH \definedummyword\L \definedummyword\O \definedummyword\OE \definedummyword\TH \definedummyword\aa \definedummyword\ae \definedummyword\dh \definedummyword\exclamdown \definedummyword\l \definedummyword\o \definedummyword\oe \definedummyword\ordf \definedummyword\ordm \definedummyword\questiondown \definedummyword\ss \definedummyword\th % % Although these internal commands shouldn't show up, sometimes they do. \definedummyword\bf \definedummyword\gtr \definedummyword\hat \definedummyword\less \definedummyword\sf \definedummyword\sl \definedummyword\tclose \definedummyword\tt % \definedummyword\LaTeX \definedummyword\TeX % % Assorted special characters. \definedummyword\ampchar \definedummyword\atchar \definedummyword\arrow \definedummyword\backslashchar \definedummyword\bullet \definedummyword\comma \definedummyword\copyright \definedummyword\registeredsymbol \definedummyword\dots \definedummyword\enddots \definedummyword\entrybreak \definedummyword\equiv \definedummyword\error \definedummyword\euro \definedummyword\expansion \definedummyword\geq \definedummyword\guillemetleft \definedummyword\guillemetright \definedummyword\guilsinglleft \definedummyword\guilsinglright \definedummyword\lbracechar \definedummyword\leq \definedummyword\mathopsup \definedummyword\minus \definedummyword\ogonek \definedummyword\pounds \definedummyword\point \definedummyword\print \definedummyword\quotedblbase \definedummyword\quotedblleft \definedummyword\quotedblright \definedummyword\quoteleft \definedummyword\quoteright \definedummyword\quotesinglbase \definedummyword\rbracechar \definedummyword\result \definedummyword\sub \definedummyword\sup \definedummyword\textdegree % \definedummyword\subentry % % We want to disable all macros so that they are not expanded by \write. \macrolist \let\value\dummyvalue % \normalturnoffactive } % \commondummiesnofonts: common to \definedummies and \indexnofonts. % Define \commondummyletter, \commondummyaccent and \commondummyword before % using. Used for accents, font commands, and various control letters. % \def\commondummiesnofonts{% % Control letters and accents. \commondummyletter\!% \commondummyaccent\"% \commondummyaccent\'% \commondummyletter\*% \commondummyaccent\,% \commondummyletter\.% \commondummyletter\/% \commondummyletter\:% \commondummyaccent\=% \commondummyletter\?% \commondummyaccent\^% \commondummyaccent\`% \commondummyaccent\~% \commondummyword\u \commondummyword\v \commondummyword\H \commondummyword\dotaccent \commondummyword\ogonek \commondummyword\ringaccent \commondummyword\tieaccent \commondummyword\ubaraccent \commondummyword\udotaccent \commondummyword\dotless % % Texinfo font commands. \commondummyword\b \commondummyword\i \commondummyword\r \commondummyword\sansserif \commondummyword\sc \commondummyword\slanted \commondummyword\t % % Commands that take arguments. \commondummyword\abbr \commondummyword\acronym \commondummyword\anchor \commondummyword\cite \commondummyword\code \commondummyword\command \commondummyword\dfn \commondummyword\dmn \commondummyword\email \commondummyword\emph \commondummyword\env \commondummyword\file \commondummyword\image \commondummyword\indicateurl \commondummyword\inforef \commondummyword\kbd \commondummyword\key \commondummyword\math \commondummyword\option \commondummyword\pxref \commondummyword\ref \commondummyword\samp \commondummyword\strong \commondummyword\tie \commondummyword\U \commondummyword\uref \commondummyword\url \commondummyword\var \commondummyword\verb \commondummyword\w \commondummyword\xref } \let\indexlbrace\relax \let\indexrbrace\relax \let\indexatchar\relax \let\indexbackslash\relax {\catcode`\@=0 \catcode`\\=13 @gdef@backslashdisappear{@def\{}} } { \catcode`\<=13 \catcode`\-=13 \catcode`\`=13 \gdef\indexnonalnumdisappear{% \expandafter\ifx\csname SETtxiindexlquoteignore\endcsname\relax\else % @set txiindexlquoteignore makes us ignore left quotes in the sort term. % (Introduced for FSFS 2nd ed.) \let`=\empty \fi % \expandafter\ifx\csname SETtxiindexbackslashignore\endcsname\relax\else \backslashdisappear \fi % \expandafter\ifx\csname SETtxiindexhyphenignore\endcsname\relax\else \def-{}% \fi \expandafter\ifx\csname SETtxiindexlessthanignore\endcsname\relax\else \def<{}% \fi \expandafter\ifx\csname SETtxiindexatsignignore\endcsname\relax\else \def\@{}% \fi } \gdef\indexnonalnumreappear{% \let-\normaldash \let<\normalless } } % \indexnofonts is used when outputting the strings to sort the index % by, and when constructing control sequence names. It eliminates all % control sequences and just writes whatever the best ASCII sort string % would be for a given command (usually its argument). % \def\indexnofonts{% % Accent commands should become @asis. \def\commondummyaccent##1{\let##1\asis}% % We can just ignore other control letters. \def\commondummyletter##1{\let##1\empty}% % All control words become @asis by default; overrides below. \let\commondummyword\commondummyaccent \commondummiesnofonts % % Don't no-op \tt, since it isn't a user-level command % and is used in the definitions of the active chars like <, >, |, etc. % Likewise with the other plain tex font commands. %\let\tt=\asis % \def\ { }% \def\@{@}% \def\_{\normalunderscore}% \def\-{}% @- shouldn't affect sorting % \uccode`\1=`\{ \uppercase{\def\{{1}}% \uccode`\1=`\} \uppercase{\def\}{1}}% \let\lbracechar\{% \let\rbracechar\}% % % Non-English letters. \def\AA{AA}% \def\AE{AE}% \def\DH{DZZ}% \def\L{L}% \def\OE{OE}% \def\O{O}% \def\TH{TH}% \def\aa{aa}% \def\ae{ae}% \def\dh{dzz}% \def\exclamdown{!}% \def\l{l}% \def\oe{oe}% \def\ordf{a}% \def\ordm{o}% \def\o{o}% \def\questiondown{?}% \def\ss{ss}% \def\th{th}% % \let\do\indexnofontsdef % \do\LaTeX{LaTeX}% \do\TeX{TeX}% % % Assorted special characters. \do\atchar{@}% \do\arrow{->}% \do\bullet{bullet}% \do\comma{,}% \do\copyright{copyright}% \do\dots{...}% \do\enddots{...}% \do\equiv{==}% \do\error{error}% \do\euro{euro}% \do\expansion{==>}% \do\geq{>=}% \do\guillemetleft{<<}% \do\guillemetright{>>}% \do\guilsinglleft{<}% \do\guilsinglright{>}% \do\leq{<=}% \do\lbracechar{\{}% \do\minus{-}% \do\point{.}% \do\pounds{pounds}% \do\print{-|}% \do\quotedblbase{"}% \do\quotedblleft{"}% \do\quotedblright{"}% \do\quoteleft{`}% \do\quoteright{'}% \do\quotesinglbase{,}% \do\rbracechar{\}}% \do\registeredsymbol{R}% \do\result{=>}% \do\textdegree{o}% % % We need to get rid of all macros, leaving only the arguments (if present). % Of course this is not nearly correct, but it is the best we can do for now. % makeinfo does not expand macros in the argument to @deffn, which ends up % writing an index entry, and texindex isn't prepared for an index sort entry % that starts with \. % % Since macro invocations are followed by braces, we can just redefine them % to take a single TeX argument. The case of a macro invocation that % goes to end-of-line is not handled. % \macrolist \let\value\indexnofontsvalue } % Give the control sequence a definition that removes the {} that follows % its use, e.g. @AA{} -> AA \def\indexnofontsdef#1#2{\def#1##1{#2}}% % #1 is the index name, #2 is the entry text. \def\doind#1#2{% \iflinks {% % \requireopenindexfile{#1}% \edef\writeto{\csname#1indfile\endcsname}% % \def\indextext{#2}% \safewhatsit\doindwrite }% \fi } % Same as \doind, but for code indices \def\docind#1#2{% \iflinks {% % \requireopenindexfile{#1}% \edef\writeto{\csname#1indfile\endcsname}% % \def\indextext{#2}% \safewhatsit\docindwrite }% \fi } % Check if an index file has been opened, and if not, open it. \def\requireopenindexfile#1{% \ifnum\csname #1indfile\endcsname=0 \expandafter\newwrite \csname#1indfile\endcsname \edef\suffix{#1}% % A .fls suffix would conflict with the file extension for the output % of -recorder, so use .f1s instead. \ifx\suffix\indexisfl\def\suffix{f1}\fi % Open the file \immediate\openout\csname#1indfile\endcsname \jobname.\suffix % Using \immediate above here prevents an object entering into the current % box, which could confound checks such as those in \safewhatsit for % preceding skips. \typeout{Writing index file \jobname.\suffix}% \fi} \def\indexisfl{fl} % Definition for writing index entry sort key. { \catcode`\-=13 \gdef\indexwritesortas{% \begingroup \indexnonalnumreappear \indexwritesortasxxx} \gdef\indexwritesortasxxx#1{% \xdef\indexsortkey{#1}\endgroup} } \def\indexwriteseealso#1{ \gdef\pagenumbertext{\string\seealso{#1}}% } \def\indexwriteseeentry#1{ \gdef\pagenumbertext{\string\seeentry{#1}}% } % The default definitions \def\sortas#1{}% \def\seealso#1{\i{\putwordSeeAlso}\ #1}% for sorted index file only \def\putwordSeeAlso{See also} \def\seeentry#1{\i{\putwordSee}\ #1}% for sorted index file only % Given index entry text like "aaa @subentry bbb @sortas{ZZZ}": % * Set \bracedtext to "{aaa}{bbb}" % * Set \fullindexsortkey to "aaa @subentry ZZZ" % * If @seealso occurs, set \pagenumbertext % \def\splitindexentry#1{% \gdef\fullindexsortkey{}% \xdef\bracedtext{}% \def\sep{}% \def\seealso##1{}% \def\seeentry##1{}% \expandafter\doindexsegment#1\subentry\finish\subentry } % append the results from the next segment \def\doindexsegment#1\subentry{% \def\segment{#1}% \ifx\segment\isfinish \else % % Fully expand the segment, throwing away any @sortas directives, and % trim spaces. \edef\trimmed{\segment}% \edef\trimmed{\expandafter\eatspaces\expandafter{\trimmed}}% \ifincodeindex \edef\trimmed{\noexpand\code{\trimmed}}% \fi % \xdef\bracedtext{\bracedtext{\trimmed}}% % % Get the string to sort by. Process the segment with all % font commands turned off. \bgroup \let\sortas\indexwritesortas \let\seealso\indexwriteseealso \let\seeentry\indexwriteseeentry \indexnofonts % The braces around the commands are recognized by texindex. \def\lbracechar{{\string\indexlbrace}}% \def\rbracechar{{\string\indexrbrace}}% \let\{=\lbracechar \let\}=\rbracechar \def\@{{\string\indexatchar}}% \def\atchar##1{\@}% \def\backslashchar{{\string\indexbackslash}}% \uccode`\~=`\\ \uppercase{\let~\backslashchar}% % \let\indexsortkey\empty \global\let\pagenumbertext\empty % Execute the segment and throw away the typeset output. This executes % any @sortas or @seealso commands in this segment. \setbox\dummybox = \hbox{\segment}% \ifx\indexsortkey\empty{% \indexnonalnumdisappear \xdef\trimmed{\segment}% \xdef\trimmed{\expandafter\eatspaces\expandafter{\trimmed}}% \xdef\indexsortkey{\trimmed}% \ifx\indexsortkey\empty\xdef\indexsortkey{ }\fi }\fi % % Append to \fullindexsortkey. \edef\tmp{\gdef\noexpand\fullindexsortkey{% \fullindexsortkey\sep\indexsortkey}}% \tmp \egroup \def\sep{\subentry}% % \expandafter\doindexsegment \fi } \def\isfinish{\finish}% \newbox\dummybox % used above \let\subentry\relax % Use \ instead of @ in index files. To support old texi2dvi and texindex. % This works without changing the escape character used in the toc or aux % files because the index entries are fully expanded here, and \string uses % the current value of \escapechar. \def\escapeisbackslash{\escapechar=`\\} % Use \ in index files by default. texi2dvi didn't support @ as the escape % character (as it checked for "\entry" in the files, and not "@entry"). When % the new version of texi2dvi has had a chance to become more prevalent, then % the escape character can change back to @ again. This should be an easy % change to make now because both @ and \ are only used as escape characters in % index files, never standing for themselves. % \set txiindexescapeisbackslash % Write the entry in \indextext to the index file. % \newif\ifincodeindex \def\doindwrite{\incodeindexfalse\doindwritex} \def\docindwrite{\incodeindextrue\doindwritex} \def\doindwritex{% \maybemarginindex % \atdummies % \expandafter\ifx\csname SETtxiindexescapeisbackslash\endcsname\relax\else \escapeisbackslash \fi % % For texindex which always views { and } as separators. \def\{{\lbracechar{}}% \def\}{\rbracechar{}}% \uccode`\~=`\\ \uppercase{\def~{\backslashchar{}}}% % % Split the entry into primary entry and any subentries, and get the index % sort key. \splitindexentry\indextext % % Set up the complete index entry, with both the sort key and % the original text, including any font commands. We write % three arguments to \entry to the .?? file (four in the % subentry case), texindex reduces to two when writing the .??s % sorted result. % \edef\temp{% \write\writeto{% \string\entry{\fullindexsortkey}% {\ifx\pagenumbertext\empty\noexpand\folio\else\pagenumbertext\fi}% \bracedtext}% }% \temp } % Put the index entry in the margin if desired (undocumented). \def\maybemarginindex{% \ifx\SETmarginindex\relax\else \insert\margin{\hbox{\vrule height8pt depth3pt width0pt \relax\indextext}}% \fi } \let\SETmarginindex=\relax % Take care of unwanted page breaks/skips around a whatsit: % % If a skip is the last thing on the list now, preserve it % by backing up by \lastskip, doing the \write, then inserting % the skip again. Otherwise, the whatsit generated by the % \write or \pdfdest will make \lastskip zero. The result is that % sequences like this: % @end defun % @tindex whatever % @defun ... % will have extra space inserted, because the \medbreak in the % start of the @defun won't see the skip inserted by the @end of % the previous defun. % % But don't do any of this if we're not in vertical mode. We % don't want to do a \vskip and prematurely end a paragraph. % % Avoid page breaks due to these extra skips, too. % % But wait, there is a catch there: % We'll have to check whether \lastskip is zero skip. \ifdim is not % sufficient for this purpose, as it ignores stretch and shrink parts % of the skip. The only way seems to be to check the textual % representation of the skip. % % The following is almost like \def\zeroskipmacro{0.0pt} except that % the ``p'' and ``t'' characters have catcode \other, not 11 (letter). % \edef\zeroskipmacro{\expandafter\the\csname z@skip\endcsname} % \newskip\whatsitskip \newcount\whatsitpenalty % % ..., ready, GO: % \def\safewhatsit#1{\ifhmode #1% \else % \lastskip and \lastpenalty cannot both be nonzero simultaneously. \whatsitskip = \lastskip \edef\lastskipmacro{\the\lastskip}% \whatsitpenalty = \lastpenalty % % If \lastskip is nonzero, that means the last item was a % skip. And since a skip is discardable, that means this % -\whatsitskip glue we're inserting is preceded by a % non-discardable item, therefore it is not a potential % breakpoint, therefore no \nobreak needed. \ifx\lastskipmacro\zeroskipmacro \else \vskip-\whatsitskip \fi % #1% % \ifx\lastskipmacro\zeroskipmacro % If \lastskip was zero, perhaps the last item was a penalty, and % perhaps it was >=10000, e.g., a \nobreak. In that case, we want % to re-insert the same penalty (values >10000 are used for various % signals); since we just inserted a non-discardable item, any % following glue (such as a \parskip) would be a breakpoint. For example: % @deffn deffn-whatever % @vindex index-whatever % Description. % would allow a break between the index-whatever whatsit % and the "Description." paragraph. \ifnum\whatsitpenalty>9999 \penalty\whatsitpenalty \fi \else % On the other hand, if we had a nonzero \lastskip, % this make-up glue would be preceded by a non-discardable item % (the whatsit from the \write), so we must insert a \nobreak. \nobreak\vskip\whatsitskip \fi \fi} % The index entry written in the file actually looks like % \entry {sortstring}{page}{topic} % or % \entry {sortstring}{page}{topic}{subtopic} % The texindex program reads in these files and writes files % containing these kinds of lines: % \initial {c} % before the first topic whose initial is c % \entry {topic}{pagelist} % for a topic that is used without subtopics % \primary {topic} % \entry {topic}{} % for the beginning of a topic that is used with subtopics % \secondary {subtopic}{pagelist} % for each subtopic. % \secondary {subtopic}{} % for a subtopic with sub-subtopics % \tertiary {subtopic}{subsubtopic}{pagelist} % for each sub-subtopic. % Define the user-accessible indexing commands % @findex, @vindex, @kindex, @cindex. \def\findex {\fnindex} \def\kindex {\kyindex} \def\cindex {\cpindex} \def\vindex {\vrindex} \def\tindex {\tpindex} \def\pindex {\pgindex} % Define the macros used in formatting output of the sorted index material. % @printindex causes a particular index (the ??s file) to get printed. % It does not print any chapter heading (usually an @unnumbered). % \parseargdef\printindex{\begingroup \dobreak \chapheadingskip{10000}% % \smallfonts \rm \tolerance = 9500 \plainfrenchspacing \everypar = {}% don't want the \kern\-parindent from indentation suppression. % % See comment in \requireopenindexfile. \def\indexname{#1}\ifx\indexname\indexisfl\def\indexname{f1}\fi % % See if the index file exists and is nonempty. \openin 1 \jobname.\indexname s \ifeof 1 % \enddoublecolumns gets confused if there is no text in the index, % and it loses the chapter title and the aux file entries for the % index. The easiest way to prevent this problem is to make sure % there is some text. \putwordIndexNonexistent \typeout{No file \jobname.\indexname s.}% \else % If the index file exists but is empty, then \openin leaves \ifeof % false. We have to make TeX try to read something from the file, so % it can discover if there is anything in it. \read 1 to \thisline \ifeof 1 \putwordIndexIsEmpty \else \expandafter\printindexzz\thisline\relax\relax\finish% \fi \fi \closein 1 \endgroup} % If the index file starts with a backslash, forgo reading the index % file altogether. If somebody upgrades texinfo.tex they may still have % old index files using \ as the escape character. Reading this would % at best lead to typesetting garbage, at worst a TeX syntax error. \def\printindexzz#1#2\finish{% \expandafter\ifx\csname SETtxiindexescapeisbackslash\endcsname\relax \uccode`\~=`\\ \uppercase{\if\noexpand~}\noexpand#1 \expandafter\ifx\csname SETtxiskipindexfileswithbackslash\endcsname\relax \errmessage{% ERROR: A sorted index file in an obsolete format was skipped. To fix this problem, please upgrade your version of 'texi2dvi' or 'texi2pdf' to that at . If you are using an old version of 'texindex' (part of the Texinfo distribution), you may also need to upgrade to a newer version (at least 6.0). You may be able to typeset the index if you run 'texindex \jobname.\indexname' yourself. You could also try setting the 'txiindexescapeisbackslash' flag by running a command like 'texi2dvi -t "@set txiindexescapeisbackslash" \jobname.texi'. If you do this, Texinfo will try to use index files in the old format. If you continue to have problems, deleting the index files and starting again might help (with 'rm \jobname.?? \jobname.??s')% }% \else (Skipped sorted index file in obsolete format) \fi \else \begindoublecolumns \input \jobname.\indexname s \enddoublecolumns \fi \else \begindoublecolumns \catcode`\\=0\relax % % Make @ an escape character to give macros a chance to work. This % should work because we (hopefully) don't otherwise use @ in index files. %\catcode`\@=12\relax \catcode`\@=0\relax \input \jobname.\indexname s \enddoublecolumns \fi } % These macros are used by the sorted index file itself. % Change them to control the appearance of the index. {\catcode`\/=13 \catcode`\-=13 \catcode`\^=13 \catcode`\~=13 \catcode`\_=13 \catcode`\|=13 \catcode`\<=13 \catcode`\>=13 \catcode`\+=13 \catcode`\"=13 \catcode`\$=3 \gdef\initialglyphs{% % special control sequences used in the index sort key \let\indexlbrace\{% \let\indexrbrace\}% \let\indexatchar\@% \def\indexbackslash{\math{\backslash}}% % % Some changes for non-alphabetic characters. Using the glyphs from the % math fonts looks more consistent than the typewriter font used elsewhere % for these characters. \uccode`\~=`\\ \uppercase{\def~{\math{\backslash}}} % % In case @\ is used for backslash \uppercase{\let\\=~} % Can't get bold backslash so don't use bold forward slash \catcode`\/=13 \def/{{\secrmnotbold \normalslash}}% \def-{{\normaldash\normaldash}}% en dash `--' \def^{{\chapbf \normalcaret}}% \def~{{\chapbf \normaltilde}}% \def\_{% \leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em }% \def|{$\vert$}% \def<{$\less$}% \def>{$\gtr$}% \def+{$\normalplus$}% }} \def\initial{% \bgroup \initialglyphs \initialx } \def\initialx#1{% % Remove any glue we may have, we'll be inserting our own. \removelastskip % % We like breaks before the index initials, so insert a bonus. % The glue before the bonus allows a little bit of space at the % bottom of a column to reduce an increase in inter-line spacing. \nobreak \vskip 0pt plus 5\baselineskip \penalty -300 \vskip 0pt plus -5\baselineskip % % Typeset the initial. Making this add up to a whole number of % baselineskips increases the chance of the dots lining up from column % to column. It still won't often be perfect, because of the stretch % we need before each entry, but it's better. % % No shrink because it confuses \balancecolumns. \vskip 1.67\baselineskip plus 1\baselineskip \leftline{\secfonts \kern-0.05em \secbf #1}% % \secfonts is inside the argument of \leftline so that the change of % \baselineskip will not affect any glue inserted before the vbox that % \leftline creates. % Do our best not to break after the initial. \nobreak \vskip .33\baselineskip plus .1\baselineskip \egroup % \initialglyphs } \newdimen\entryrightmargin \entryrightmargin=0pt % \entry typesets a paragraph consisting of the text (#1), dot leaders, and % then page number (#2) flushed to the right margin. It is used for index % and table of contents entries. The paragraph is indented by \leftskip. % \def\entry{% \begingroup % % Start a new paragraph if necessary, so our assignments below can't % affect previous text. \par % % No extra space above this paragraph. \parskip = 0in % % When reading the text of entry, convert explicit line breaks % from @* into spaces. The user might give these in long section % titles, for instance. \def\*{\unskip\space\ignorespaces}% \def\entrybreak{\hfil\break}% An undocumented command % % Swallow the left brace of the text (first parameter): \afterassignment\doentry \let\temp = } \def\entrybreak{\unskip\space\ignorespaces}% \def\doentry{% % Save the text of the entry \global\setbox\boxA=\hbox\bgroup \bgroup % Instead of the swallowed brace. \noindent \aftergroup\finishentry % And now comes the text of the entry. % Not absorbing as a macro argument reduces the chance of problems % with catcodes occurring. } {\catcode`\@=11 \gdef\finishentry#1{% \egroup % end box A \dimen@ = \wd\boxA % Length of text of entry \global\setbox\boxA=\hbox\bgroup \unhbox\boxA % #1 is the page number. % % Get the width of the page numbers, and only use % leaders if they are present. \global\setbox\boxB = \hbox{#1}% \ifdim\wd\boxB = 0pt \null\nobreak\hfill\ % \else % \null\nobreak\indexdotfill % Have leaders before the page number. % \ifpdforxetex \pdfgettoks#1.% \hskip\skip\thinshrinkable\the\toksA \else \hskip\skip\thinshrinkable #1% \fi \fi \egroup % end \boxA \ifdim\wd\boxB = 0pt \noindent\unhbox\boxA\par \nobreak \else\bgroup % We want the text of the entries to be aligned to the left, and the % page numbers to be aligned to the right. % \parindent = 0pt \advance\leftskip by 0pt plus 1fil \advance\leftskip by 0pt plus -1fill \rightskip = 0pt plus -1fil \advance\rightskip by 0pt plus 1fill % Cause last line, which could consist of page numbers on their own % if the list of page numbers is long, to be aligned to the right. \parfillskip=0pt plus -1fill % \advance\rightskip by \entryrightmargin % Determine how far we can stretch into the margin. % This allows, e.g., "Appendix H GNU Free Documentation License" to % fit on one line in @letterpaper format. \ifdim\entryrightmargin>2.1em \dimen@i=2.1em \else \dimen@i=0em \fi \advance \parfillskip by 0pt minus 1\dimen@i % \dimen@ii = \hsize \advance\dimen@ii by -1\leftskip \advance\dimen@ii by -1\entryrightmargin \advance\dimen@ii by 1\dimen@i \ifdim\wd\boxA > \dimen@ii % If the entry doesn't fit in one line \ifdim\dimen@ > 0.8\dimen@ii % due to long index text % Try to split the text roughly evenly. \dimen@ will be the length of % the first line. \dimen@ = 0.7\dimen@ \dimen@ii = \hsize \ifnum\dimen@>\dimen@ii % If the entry is too long (for example, if it needs more than % two lines), use all the space in the first line. \dimen@ = \dimen@ii \fi \advance\leftskip by 0pt plus 1fill % ragged right \advance \dimen@ by 1\rightskip \parshape = 2 0pt \dimen@ 0em \dimen@ii % Ideally we'd add a finite glue at the end of the first line only, % instead of using \parshape with explicit line lengths, but TeX % doesn't seem to provide a way to do such a thing. % % Indent all lines but the first one. \advance\leftskip by 1em \advance\parindent by -1em \fi\fi \indent % start paragraph \unhbox\boxA % % Do not prefer a separate line ending with a hyphen to fewer lines. \finalhyphendemerits = 0 % % Word spacing - no stretch \spaceskip=\fontdimen2\font minus \fontdimen4\font % \linepenalty=1000 % Discourage line breaks. \hyphenpenalty=5000 % Discourage hyphenation. % \par % format the paragraph \egroup % The \vbox \fi \endgroup }} \newskip\thinshrinkable \skip\thinshrinkable=.15em minus .15em % Like plain.tex's \dotfill, except uses up at least 1 em. % The filll stretch here overpowers both the fil and fill stretch to push % the page number to the right. \def\indexdotfill{\cleaders \hbox{$\mathsurround=0pt \mkern1.5mu.\mkern1.5mu$}\hskip 1em plus 1filll} \def\primary #1{\line{#1\hfil}} \def\secondary{\indententry{0.5cm}} \def\tertiary{\indententry{1cm}} \def\indententry#1#2#3{% \bgroup \leftskip=#1 \entry{#2}{#3}% \egroup } % Define two-column mode, which we use to typeset indexes. % Adapted from the TeXbook, page 416, which is to say, % the manmac.tex format used to print the TeXbook itself. \catcode`\@=11 % private names \newbox\partialpage \newdimen\doublecolumnhsize \def\begindoublecolumns{\begingroup % ended by \enddoublecolumns % If not much space left on page, start a new page. \ifdim\pagetotal>0.8\vsize\vfill\eject\fi % % Grab any single-column material above us. \output = {% \savetopmark % \global\setbox\partialpage = \vbox{% % Unvbox the main output page. \unvbox\PAGE \kern-\topskip \kern\baselineskip }% }% \eject % run that output routine to set \partialpage % % Use the double-column output routine for subsequent pages. \output = {\doublecolumnout}% % % Change the page size parameters. We could do this once outside this % routine, in each of @smallbook, @afourpaper, and the default 8.5x11 % format, but then we repeat the same computation. Repeating a couple % of assignments once per index is clearly meaningless for the % execution time, so we may as well do it in one place. % % First we halve the line length, less a little for the gutter between % the columns. We compute the gutter based on the line length, so it % changes automatically with the paper format. The magic constant % below is chosen so that the gutter has the same value (well, +-<1pt) % as it did when we hard-coded it. % % We put the result in a separate register, \doublecolumhsize, so we % can restore it in \pagesofar, after \hsize itself has (potentially) % been clobbered. % \doublecolumnhsize = \hsize \advance\doublecolumnhsize by -.04154\hsize \divide\doublecolumnhsize by 2 \hsize = \doublecolumnhsize % % Get the available space for the double columns -- the normal % (undoubled) page height minus any material left over from the % previous page. \advance\vsize by -\ht\partialpage \vsize = 2\vsize % % For the benefit of balancing columns \advance\baselineskip by 0pt plus 0.5pt } % The double-column output routine for all double-column pages except % the last, which is done by \balancecolumns. % \def\doublecolumnout{% % \savetopmark \splittopskip=\topskip \splitmaxdepth=\maxdepth \dimen@ = \vsize \divide\dimen@ by 2 % % box0 will be the left-hand column, box2 the right. \setbox0=\vsplit\PAGE to\dimen@ \setbox2=\vsplit\PAGE to\dimen@ \global\advance\vsize by 2\ht\partialpage \onepageout\pagesofar % empty except for the first time we are called \unvbox\PAGE \penalty\outputpenalty } % % Re-output the contents of the output page -- any previous material, % followed by the two boxes we just split, in box0 and box2. \def\pagesofar{% \unvbox\partialpage % \hsize = \doublecolumnhsize \wd0=\hsize \wd2=\hsize \hbox to\txipagewidth{\box0\hfil\box2}% } % Finished with double columns. \def\enddoublecolumns{% % The following penalty ensures that the page builder is exercised % _before_ we change the output routine. This is necessary in the % following situation: % % The last section of the index consists only of a single entry. % Before this section, \pagetotal is less than \pagegoal, so no % break occurs before the last section starts. However, the last % section, consisting of \initial and the single \entry, does not % fit on the page and has to be broken off. Without the following % penalty the page builder will not be exercised until \eject % below, and by that time we'll already have changed the output % routine to the \balancecolumns version, so the next-to-last % double-column page will be processed with \balancecolumns, which % is wrong: The two columns will go to the main vertical list, with % the broken-off section in the recent contributions. As soon as % the output routine finishes, TeX starts reconsidering the page % break. The two columns and the broken-off section both fit on the % page, because the two columns now take up only half of the page % goal. When TeX sees \eject from below which follows the final % section, it invokes the new output routine that we've set after % \balancecolumns below; \onepageout will try to fit the two columns % and the final section into the vbox of \txipageheight (see % \pagebody), causing an overfull box. % % Note that glue won't work here, because glue does not exercise the % page builder, unlike penalties (see The TeXbook, pp. 280-281). \penalty0 % \output = {% % Split the last of the double-column material. \savetopmark \balancecolumns }% \eject % call the \output just set \ifdim\pagetotal=0pt % Having called \balancecolumns once, we do not % want to call it again. Therefore, reset \output to its normal % definition right away. \global\output=\expandafter{\the\defaultoutput} % \endgroup % started in \begindoublecolumns % Leave the double-column material on the current page, no automatic % page break. \box\balancedcolumns % % \pagegoal was set to the doubled \vsize above, since we restarted % the current page. We're now back to normal single-column % typesetting, so reset \pagegoal to the normal \vsize. \global\vsize = \txipageheight % \pagegoal = \txipageheight % \else % We had some left-over material. This might happen when \doublecolumnout % is called in \balancecolumns. Try again. \expandafter\enddoublecolumns \fi } \newbox\balancedcolumns \setbox\balancedcolumns=\vbox{shouldnt see this}% % % Only called for the last of the double column material. \doublecolumnout % does the others. \def\balancecolumns{% \setbox0 = \vbox{\unvbox\PAGE}% like \box255 but more efficient, see p.120. \dimen@ = \ht0 \ifdim\dimen@<7\baselineskip % Don't split a short final column in two. \setbox2=\vbox{}% \global\setbox\balancedcolumns=\vbox{\pagesofar}% \else % double the leading vertical space \advance\dimen@ by \topskip \advance\dimen@ by-\baselineskip \divide\dimen@ by 2 % target to split to \dimen@ii = \dimen@ \splittopskip = \topskip % Loop until left column is at least as high as the right column. {% \vbadness = 10000 \loop \global\setbox3 = \copy0 \global\setbox1 = \vsplit3 to \dimen@ \ifdim\ht1<\ht3 \global\advance\dimen@ by 1pt \repeat }% % Now the left column is in box 1, and the right column in box 3. % % Check whether the left column has come out higher than the page itself. % (Note that we have doubled \vsize for the double columns, so % the actual height of the page is 0.5\vsize). \ifdim2\ht1>\vsize % It appears that we have been called upon to balance too much material. % Output some of it with \doublecolumnout, leaving the rest on the page. \setbox\PAGE=\box0 \doublecolumnout \else % Compare the heights of the two columns. \ifdim4\ht1>5\ht3 % Column heights are too different, so don't make their bottoms % flush with each other. \setbox2=\vbox to \ht1 {\unvbox3\vfill}% \setbox0=\vbox to \ht1 {\unvbox1\vfill}% \else % Make column bottoms flush with each other. \setbox2=\vbox to\ht1{\unvbox3\unskip}% \setbox0=\vbox to\ht1{\unvbox1\unskip}% \fi \global\setbox\balancedcolumns=\vbox{\pagesofar}% \fi \fi % } \catcode`\@ = \other \message{sectioning,} % Chapters, sections, etc. % Let's start with @part. \outer\parseargdef\part{\partzzz{#1}} \def\partzzz#1{% \chapoddpage \null \vskip.3\vsize % move it down on the page a bit \begingroup \noindent \titlefonts\rm #1\par % the text \let\lastnode=\empty % no node to associate with \writetocentry{part}{#1}{}% but put it in the toc \headingsoff % no headline or footline on the part page % This outputs a mark at the end of the page that clears \thischapter % and \thissection, as is done in \startcontents. \let\pchapsepmacro\relax \chapmacro{}{Yomitfromtoc}{}% \chapoddpage \endgroup } % \unnumberedno is an oxymoron. But we count the unnumbered % sections so that we can refer to them unambiguously in the pdf % outlines by their "section number". We avoid collisions with chapter % numbers by starting them at 10000. (If a document ever has 10000 % chapters, we're in trouble anyway, I'm sure.) \newcount\unnumberedno \unnumberedno = 10000 \newcount\chapno \newcount\secno \secno=0 \newcount\subsecno \subsecno=0 \newcount\subsubsecno \subsubsecno=0 % This counter is funny since it counts through charcodes of letters A, B, ... \newcount\appendixno \appendixno = `\@ % % \def\appendixletter{\char\the\appendixno} % We do the following ugly conditional instead of the above simple % construct for the sake of pdftex, which needs the actual % letter in the expansion, not just typeset. % \def\appendixletter{% \ifnum\appendixno=`A A% \else\ifnum\appendixno=`B B% \else\ifnum\appendixno=`C C% \else\ifnum\appendixno=`D D% \else\ifnum\appendixno=`E E% \else\ifnum\appendixno=`F F% \else\ifnum\appendixno=`G G% \else\ifnum\appendixno=`H H% \else\ifnum\appendixno=`I I% \else\ifnum\appendixno=`J J% \else\ifnum\appendixno=`K K% \else\ifnum\appendixno=`L L% \else\ifnum\appendixno=`M M% \else\ifnum\appendixno=`N N% \else\ifnum\appendixno=`O O% \else\ifnum\appendixno=`P P% \else\ifnum\appendixno=`Q Q% \else\ifnum\appendixno=`R R% \else\ifnum\appendixno=`S S% \else\ifnum\appendixno=`T T% \else\ifnum\appendixno=`U U% \else\ifnum\appendixno=`V V% \else\ifnum\appendixno=`W W% \else\ifnum\appendixno=`X X% \else\ifnum\appendixno=`Y Y% \else\ifnum\appendixno=`Z Z% % The \the is necessary, despite appearances, because \appendixletter is % expanded while writing the .toc file. \char\appendixno is not % expandable, thus it is written literally, thus all appendixes come out % with the same letter (or @) in the toc without it. \else\char\the\appendixno \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi} % Each @chapter defines these (using marks) as the number+name, number % and name of the chapter. Page headings and footings can use % these. @section does likewise. \def\thischapter{} \def\thischapternum{} \def\thischaptername{} \def\thissection{} \def\thissectionnum{} \def\thissectionname{} \newcount\absseclevel % used to calculate proper heading level \newcount\secbase\secbase=0 % @raisesections/@lowersections modify this count % @raisesections: treat @section as chapter, @subsection as section, etc. \def\raisesections{\global\advance\secbase by -1} % @lowersections: treat @chapter as section, @section as subsection, etc. \def\lowersections{\global\advance\secbase by 1} % we only have subsub. \chardef\maxseclevel = 3 % % A numbered section within an unnumbered changes to unnumbered too. % To achieve this, remember the "biggest" unnum. sec. we are currently in: \chardef\unnlevel = \maxseclevel % % Trace whether the current chapter is an appendix or not: % \chapheadtype is "N" or "A", unnumbered chapters are ignored. \def\chapheadtype{N} % Choose a heading macro % #1 is heading type % #2 is heading level % #3 is text for heading \def\genhead#1#2#3{% % Compute the abs. sec. level: \absseclevel=#2 \advance\absseclevel by \secbase % Make sure \absseclevel doesn't fall outside the range: \ifnum \absseclevel < 0 \absseclevel = 0 \else \ifnum \absseclevel > 3 \absseclevel = 3 \fi \fi % The heading type: \def\headtype{#1}% \if \headtype U% \ifnum \absseclevel < \unnlevel \chardef\unnlevel = \absseclevel \fi \else % Check for appendix sections: \ifnum \absseclevel = 0 \edef\chapheadtype{\headtype}% \else \if \headtype A\if \chapheadtype N% \errmessage{@appendix... within a non-appendix chapter}% \fi\fi \fi % Check for numbered within unnumbered: \ifnum \absseclevel > \unnlevel \def\headtype{U}% \else \chardef\unnlevel = 3 \fi \fi % Now print the heading: \if \headtype U% \ifcase\absseclevel \unnumberedzzz{#3}% \or \unnumberedseczzz{#3}% \or \unnumberedsubseczzz{#3}% \or \unnumberedsubsubseczzz{#3}% \fi \else \if \headtype A% \ifcase\absseclevel \appendixzzz{#3}% \or \appendixsectionzzz{#3}% \or \appendixsubseczzz{#3}% \or \appendixsubsubseczzz{#3}% \fi \else \ifcase\absseclevel \chapterzzz{#3}% \or \seczzz{#3}% \or \numberedsubseczzz{#3}% \or \numberedsubsubseczzz{#3}% \fi \fi \fi \suppressfirstparagraphindent } % an interface: \def\numhead{\genhead N} \def\apphead{\genhead A} \def\unnmhead{\genhead U} % @chapter, @appendix, @unnumbered. Increment top-level counter, reset % all lower-level sectioning counters to zero. % % Also set \chaplevelprefix, which we prepend to @float sequence numbers % (e.g., figures), q.v. By default (before any chapter), that is empty. \let\chaplevelprefix = \empty % \outer\parseargdef\chapter{\numhead0{#1}} % normally numhead0 calls chapterzzz \def\chapterzzz#1{% % section resetting is \global in case the chapter is in a group, such % as an @include file. \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 \global\advance\chapno by 1 % % Used for \float. \gdef\chaplevelprefix{\the\chapno.}% \resetallfloatnos % % \putwordChapter can contain complex things in translations. \toks0=\expandafter{\putwordChapter}% \message{\the\toks0 \space \the\chapno}% % % Write the actual heading. \chapmacro{#1}{Ynumbered}{\the\chapno}% % % So @section and the like are numbered underneath this chapter. \global\let\section = \numberedsec \global\let\subsection = \numberedsubsec \global\let\subsubsection = \numberedsubsubsec } \outer\parseargdef\appendix{\apphead0{#1}} % normally calls appendixzzz % \def\appendixzzz#1{% \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 \global\advance\appendixno by 1 \gdef\chaplevelprefix{\appendixletter.}% \resetallfloatnos % % \putwordAppendix can contain complex things in translations. \toks0=\expandafter{\putwordAppendix}% \message{\the\toks0 \space \appendixletter}% % \chapmacro{#1}{Yappendix}{\appendixletter}% % \global\let\section = \appendixsec \global\let\subsection = \appendixsubsec \global\let\subsubsection = \appendixsubsubsec } % normally unnmhead0 calls unnumberedzzz: \outer\parseargdef\unnumbered{\unnmhead0{#1}} \def\unnumberedzzz#1{% \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 \global\advance\unnumberedno by 1 % % Since an unnumbered has no number, no prefix for figures. \global\let\chaplevelprefix = \empty \resetallfloatnos % % This used to be simply \message{#1}, but TeX fully expands the % argument to \message. Therefore, if #1 contained @-commands, TeX % expanded them. For example, in `@unnumbered The @cite{Book}', TeX % expanded @cite (which turns out to cause errors because \cite is meant % to be executed, not expanded). % % Anyway, we don't want the fully-expanded definition of @cite to appear % as a result of the \message, we just want `@cite' itself. We use % \the to achieve this: TeX expands \the only once, % simply yielding the contents of . (We also do this for % the toc entries.) \toks0 = {#1}% \message{(\the\toks0)}% % \chapmacro{#1}{Ynothing}{\the\unnumberedno}% % \global\let\section = \unnumberedsec \global\let\subsection = \unnumberedsubsec \global\let\subsubsection = \unnumberedsubsubsec } % @centerchap is like @unnumbered, but the heading is centered. \outer\parseargdef\centerchap{% \let\centerparametersmaybe = \centerparameters \unnmhead0{#1}% \let\centerparametersmaybe = \relax } % @top is like @unnumbered. \let\top\unnumbered % Sections. % \outer\parseargdef\numberedsec{\numhead1{#1}} % normally calls seczzz \def\seczzz#1{% \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 \sectionheading{#1}{sec}{Ynumbered}{\the\chapno.\the\secno}% } % normally calls appendixsectionzzz: \outer\parseargdef\appendixsection{\apphead1{#1}} \def\appendixsectionzzz#1{% \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 \sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}% } \let\appendixsec\appendixsection % normally calls unnumberedseczzz: \outer\parseargdef\unnumberedsec{\unnmhead1{#1}} \def\unnumberedseczzz#1{% \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}% } % Subsections. % % normally calls numberedsubseczzz: \outer\parseargdef\numberedsubsec{\numhead2{#1}} \def\numberedsubseczzz#1{% \global\subsubsecno=0 \global\advance\subsecno by 1 \sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}% } % normally calls appendixsubseczzz: \outer\parseargdef\appendixsubsec{\apphead2{#1}} \def\appendixsubseczzz#1{% \global\subsubsecno=0 \global\advance\subsecno by 1 \sectionheading{#1}{subsec}{Yappendix}% {\appendixletter.\the\secno.\the\subsecno}% } % normally calls unnumberedsubseczzz: \outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}} \def\unnumberedsubseczzz#1{% \global\subsubsecno=0 \global\advance\subsecno by 1 \sectionheading{#1}{subsec}{Ynothing}% {\the\unnumberedno.\the\secno.\the\subsecno}% } % Subsubsections. % % normally numberedsubsubseczzz: \outer\parseargdef\numberedsubsubsec{\numhead3{#1}} \def\numberedsubsubseczzz#1{% \global\advance\subsubsecno by 1 \sectionheading{#1}{subsubsec}{Ynumbered}% {\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}% } % normally appendixsubsubseczzz: \outer\parseargdef\appendixsubsubsec{\apphead3{#1}} \def\appendixsubsubseczzz#1{% \global\advance\subsubsecno by 1 \sectionheading{#1}{subsubsec}{Yappendix}% {\appendixletter.\the\secno.\the\subsecno.\the\subsubsecno}% } % normally unnumberedsubsubseczzz: \outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}} \def\unnumberedsubsubseczzz#1{% \global\advance\subsubsecno by 1 \sectionheading{#1}{subsubsec}{Ynothing}% {\the\unnumberedno.\the\secno.\the\subsecno.\the\subsubsecno}% } % These macros control what the section commands do, according % to what kind of chapter we are in (ordinary, appendix, or unnumbered). % Define them by default for a numbered chapter. \let\section = \numberedsec \let\subsection = \numberedsubsec \let\subsubsection = \numberedsubsubsec % Define @majorheading, @heading and @subheading \def\majorheading{% {\advance\chapheadingskip by 10pt \chapbreak }% \parsearg\chapheadingzzz } \def\chapheading{\chapbreak \parsearg\chapheadingzzz} \def\chapheadingzzz#1{% \vbox{\chapfonts \raggedtitlesettings #1\par}% \nobreak\bigskip \nobreak \suppressfirstparagraphindent } % @heading, @subheading, @subsubheading. \parseargdef\heading{\sectionheading{#1}{sec}{Yomitfromtoc}{} \suppressfirstparagraphindent} \parseargdef\subheading{\sectionheading{#1}{subsec}{Yomitfromtoc}{} \suppressfirstparagraphindent} \parseargdef\subsubheading{\sectionheading{#1}{subsubsec}{Yomitfromtoc}{} \suppressfirstparagraphindent} % These macros generate a chapter, section, etc. heading only % (including whitespace, linebreaking, etc. around it), % given all the information in convenient, parsed form. % Args are the skip and penalty (usually negative) \def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi} % Parameter controlling skip before chapter headings (if needed) \newskip\chapheadingskip % Define plain chapter starts, and page on/off switching for it. \def\chapbreak{\dobreak \chapheadingskip {-4000}} % Start a new page \def\chappager{\par\vfill\supereject} % \chapoddpage - start on an odd page for a new chapter % Because \domark is called before \chapoddpage, the filler page will % get the headings for the next chapter, which is wrong. But we don't % care -- we just disable all headings on the filler page. \def\chapoddpage{% \chappager \ifodd\pageno \else \begingroup \headingsoff \null \chappager \endgroup \fi } \parseargdef\setchapternewpage{\csname CHAPPAG#1\endcsname} \def\CHAPPAGoff{% \global\let\contentsalignmacro = \chappager \global\let\pchapsepmacro=\chapbreak \global\def\HEADINGSon{\HEADINGSsinglechapoff}} \def\CHAPPAGon{% \global\let\contentsalignmacro = \chappager \global\let\pchapsepmacro=\chappager \global\def\HEADINGSon{\HEADINGSsingle}} \def\CHAPPAGodd{% \global\let\contentsalignmacro = \chapoddpage \global\let\pchapsepmacro=\chapoddpage \global\def\HEADINGSon{\HEADINGSdouble}} \CHAPPAGon % \chapmacro - Chapter opening. % % #1 is the text, #2 is the section type (Ynumbered, Ynothing, % Yappendix, Yomitfromtoc), #3 the chapter number. % Not used for @heading series. % % To test against our argument. \def\Ynothingkeyword{Ynothing} \def\Yappendixkeyword{Yappendix} \def\Yomitfromtockeyword{Yomitfromtoc} % \def\chapmacro#1#2#3{% \expandafter\ifx\thisenv\titlepage\else \checkenv{}% chapters, etc., should not start inside an environment. \fi % Insert the first mark before the heading break (see notes for \domark). \let\prevchapterdefs=\currentchapterdefs \let\prevsectiondefs=\currentsectiondefs \gdef\currentsectiondefs{\gdef\thissectionname{}\gdef\thissectionnum{}% \gdef\thissection{}}% % \def\temptype{#2}% \ifx\temptype\Ynothingkeyword \gdef\currentchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}% \gdef\thischapter{\thischaptername}}% \else\ifx\temptype\Yomitfromtockeyword \gdef\currentchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}% \gdef\thischapter{}}% \else\ifx\temptype\Yappendixkeyword \toks0={#1}% \xdef\currentchapterdefs{% \gdef\noexpand\thischaptername{\the\toks0}% \gdef\noexpand\thischapternum{\appendixletter}% % \noexpand\putwordAppendix avoids expanding indigestible % commands in some of the translations. \gdef\noexpand\thischapter{\noexpand\putwordAppendix{} \noexpand\thischapternum: \noexpand\thischaptername}% }% \else \toks0={#1}% \xdef\currentchapterdefs{% \gdef\noexpand\thischaptername{\the\toks0}% \gdef\noexpand\thischapternum{\the\chapno}% % \noexpand\putwordChapter avoids expanding indigestible % commands in some of the translations. \gdef\noexpand\thischapter{\noexpand\putwordChapter{} \noexpand\thischapternum: \noexpand\thischaptername}% }% \fi\fi\fi % % Output the mark. Pass it through \safewhatsit, to take care of % the preceding space. \safewhatsit\domark % % Insert the chapter heading break. \pchapsepmacro % % Now the second mark, after the heading break. No break points % between here and the heading. \let\prevchapterdefs=\currentchapterdefs \let\prevsectiondefs=\currentsectiondefs \domark % {% \chapfonts \rm \let\footnote=\errfootnoteheading % give better error message % % Have to define \currentsection before calling \donoderef, because the % xref code eventually uses it. On the other hand, it has to be called % after \pchapsepmacro, or the headline will change too soon. \gdef\currentsection{#1}% % % Only insert the separating space if we have a chapter/appendix % number, and don't print the unnumbered ``number''. \ifx\temptype\Ynothingkeyword \setbox0 = \hbox{}% \def\toctype{unnchap}% \else\ifx\temptype\Yomitfromtockeyword \setbox0 = \hbox{}% contents like unnumbered, but no toc entry \def\toctype{omit}% \else\ifx\temptype\Yappendixkeyword \setbox0 = \hbox{\putwordAppendix{} #3\enspace}% \def\toctype{app}% \else \setbox0 = \hbox{#3\enspace}% \def\toctype{numchap}% \fi\fi\fi % % Write the toc entry for this chapter. Must come before the % \donoderef, because we include the current node name in the toc % entry, and \donoderef resets it to empty. \writetocentry{\toctype}{#1}{#3}% % % For pdftex, we have to write out the node definition (aka, make % the pdfdest) after any page break, but before the actual text has % been typeset. If the destination for the pdf outline is after the % text, then jumping from the outline may wind up with the text not % being visible, for instance under high magnification. \donoderef{#2}% % % Typeset the actual heading. \nobreak % Avoid page breaks at the interline glue. \vbox{\raggedtitlesettings \hangindent=\wd0 \centerparametersmaybe \unhbox0 #1\par}% }% \nobreak\bigskip % no page break after a chapter title \nobreak } % @centerchap -- centered and unnumbered. \let\centerparametersmaybe = \relax \def\centerparameters{% \advance\rightskip by 3\rightskip \leftskip = \rightskip \parfillskip = 0pt } % Section titles. These macros combine the section number parts and % call the generic \sectionheading to do the printing. % \newskip\secheadingskip \def\secheadingbreak{\dobreak \secheadingskip{-1000}} % Subsection titles. \newskip\subsecheadingskip \def\subsecheadingbreak{\dobreak \subsecheadingskip{-500}} % Subsubsection titles. \def\subsubsecheadingskip{\subsecheadingskip} \def\subsubsecheadingbreak{\subsecheadingbreak} % Print any size, any type, section title. % % #1 is the text of the title, % #2 is the section level (sec/subsec/subsubsec), % #3 is the section type (Ynumbered, Ynothing, Yappendix, Yomitfromtoc), % #4 is the section number. % \def\seckeyword{sec} % \def\sectionheading#1#2#3#4{% {% \def\sectionlevel{#2}% \def\temptype{#3}% % % It is ok for the @heading series commands to appear inside an % environment (it's been historically allowed, though the logic is % dubious), but not the others. \ifx\temptype\Yomitfromtockeyword\else \checkenv{}% non-@*heading should not be in an environment. \fi \let\footnote=\errfootnoteheading % % Switch to the right set of fonts. \csname #2fonts\endcsname \rm % % Insert first mark before the heading break (see notes for \domark). \let\prevsectiondefs=\currentsectiondefs \ifx\temptype\Ynothingkeyword \ifx\sectionlevel\seckeyword \gdef\currentsectiondefs{\gdef\thissectionname{#1}\gdef\thissectionnum{}% \gdef\thissection{\thissectionname}}% \fi \else\ifx\temptype\Yomitfromtockeyword % Don't redefine \thissection. \else\ifx\temptype\Yappendixkeyword \ifx\sectionlevel\seckeyword \toks0={#1}% \xdef\currentsectiondefs{% \gdef\noexpand\thissectionname{\the\toks0}% \gdef\noexpand\thissectionnum{#4}% % \noexpand\putwordSection avoids expanding indigestible % commands in some of the translations. \gdef\noexpand\thissection{\noexpand\putwordSection{} \noexpand\thissectionnum: \noexpand\thissectionname}% }% \fi \else \ifx\sectionlevel\seckeyword \toks0={#1}% \xdef\currentsectiondefs{% \gdef\noexpand\thissectionname{\the\toks0}% \gdef\noexpand\thissectionnum{#4}% % \noexpand\putwordSection avoids expanding indigestible % commands in some of the translations. \gdef\noexpand\thissection{\noexpand\putwordSection{} \noexpand\thissectionnum: \noexpand\thissectionname}% }% \fi \fi\fi\fi % % Go into vertical mode. Usually we'll already be there, but we % don't want the following whatsit to end up in a preceding paragraph % if the document didn't happen to have a blank line. \par % % Output the mark. Pass it through \safewhatsit, to take care of % the preceding space. \safewhatsit\domark % % Insert space above the heading. \csname #2headingbreak\endcsname % % Now the second mark, after the heading break. No break points % between here and the heading. \global\let\prevsectiondefs=\currentsectiondefs \domark % % Only insert the space after the number if we have a section number. \ifx\temptype\Ynothingkeyword \setbox0 = \hbox{}% \def\toctype{unn}% \gdef\currentsection{#1}% \else\ifx\temptype\Yomitfromtockeyword % for @headings -- no section number, don't include in toc, % and don't redefine \currentsection. \setbox0 = \hbox{}% \def\toctype{omit}% \let\sectionlevel=\empty \else\ifx\temptype\Yappendixkeyword \setbox0 = \hbox{#4\enspace}% \def\toctype{app}% \gdef\currentsection{#1}% \else \setbox0 = \hbox{#4\enspace}% \def\toctype{num}% \gdef\currentsection{#1}% \fi\fi\fi % % Write the toc entry (before \donoderef). See comments in \chapmacro. \writetocentry{\toctype\sectionlevel}{#1}{#4}% % % Write the node reference (= pdf destination for pdftex). % Again, see comments in \chapmacro. \donoderef{#3}% % % Interline glue will be inserted when the vbox is completed. % That glue will be a valid breakpoint for the page, since it'll be % preceded by a whatsit (usually from the \donoderef, or from the % \writetocentry if there was no node). We don't want to allow that % break, since then the whatsits could end up on page n while the % section is on page n+1, thus toc/etc. are wrong. Debian bug 276000. \nobreak % % Output the actual section heading. \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \ptexraggedright \hangindent=\wd0 % zero if no section number \unhbox0 #1}% }% % Add extra space after the heading -- half of whatever came above it. % Don't allow stretch, though. \kern .5 \csname #2headingskip\endcsname % % Do not let the kern be a potential breakpoint, as it would be if it % was followed by glue. \nobreak % % We'll almost certainly start a paragraph next, so don't let that % glue accumulate. (Not a breakpoint because it's preceded by a % discardable item.) However, when a paragraph is not started next % (\startdefun, \cartouche, \center, etc.), this needs to be wiped out % or the negative glue will cause weirdly wrong output, typically % obscuring the section heading with something else. \vskip-\parskip % % This is so the last item on the main vertical list is a known % \penalty > 10000, so \startdefun, etc., can recognize the situation % and do the needful. \penalty 10001 } \message{toc,} % Table of contents. \newwrite\tocfile % Write an entry to the toc file, opening it if necessary. % Called from @chapter, etc. % % Example usage: \writetocentry{sec}{Section Name}{\the\chapno.\the\secno} % We append the current node name (if any) and page number as additional % arguments for the \{chap,sec,...}entry macros which will eventually % read this. The node name is used in the pdf outlines as the % destination to jump to. % % We open the .toc file for writing here instead of at @setfilename (or % any other fixed time) so that @contents can be anywhere in the document. % But if #1 is `omit', then we don't do anything. This is used for the % table of contents chapter openings themselves. % \newif\iftocfileopened \def\omitkeyword{omit}% % \def\writetocentry#1#2#3{% \edef\writetoctype{#1}% \ifx\writetoctype\omitkeyword \else \iftocfileopened\else \immediate\openout\tocfile = \jobname.toc \global\tocfileopenedtrue \fi % \iflinks {\atdummies \edef\temp{% \write\tocfile{@#1entry{#2}{#3}{\lastnode}{\noexpand\folio}}}% \temp }% \fi \fi % % Tell \shipout to create a pdf destination on each page, if we're % writing pdf. These are used in the table of contents. We can't % just write one on every page because the title pages are numbered % 1 and 2 (the page numbers aren't printed), and so are the first % two pages of the document. Thus, we'd have two destinations named % `1', and two named `2'. \ifpdforxetex \global\pdfmakepagedesttrue \fi } % These characters do not print properly in the Computer Modern roman % fonts, so we must take special care. This is more or less redundant % with the Texinfo input format setup at the end of this file. % \def\activecatcodes{% \catcode`\"=\active \catcode`\$=\active \catcode`\<=\active \catcode`\>=\active \catcode`\\=\active \catcode`\^=\active \catcode`\_=\active \catcode`\|=\active \catcode`\~=\active } % Read the toc file, which is essentially Texinfo input. \def\readtocfile{% \setupdatafile \activecatcodes \input \tocreadfilename } \newskip\contentsrightmargin \contentsrightmargin=1in \newcount\savepageno \newcount\lastnegativepageno \lastnegativepageno = -1 % Prepare to read what we've written to \tocfile. % \def\startcontents#1{% % If @setchapternewpage on, and @headings double, the contents should % start on an odd page, unlike chapters. \contentsalignmacro \immediate\closeout\tocfile % % Don't need to put `Contents' or `Short Contents' in the headline. % It is abundantly clear what they are. \chapmacro{#1}{Yomitfromtoc}{}% % \savepageno = \pageno \begingroup % Set up to handle contents files properly. \raggedbottom % Worry more about breakpoints than the bottom. \entryrightmargin=\contentsrightmargin % Don't use the full line length. % % Roman numerals for page numbers. \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi \def\thistitle{}% no title in double-sided headings % Record where the Roman numerals started. \ifnum\romancount=0 \global\romancount=\pagecount \fi } % redefined for the two-volume lispref. We always output on % \jobname.toc even if this is redefined. % \def\tocreadfilename{\jobname.toc} % Normal (long) toc. % \def\contents{% \startcontents{\putwordTOC}% \openin 1 \tocreadfilename\space \ifeof 1 \else \readtocfile \fi \vfill \eject \contentsalignmacro % in case @setchapternewpage odd is in effect \ifeof 1 \else \pdfmakeoutlines \fi \closein 1 \endgroup \contentsendroman } % And just the chapters. \def\summarycontents{% \startcontents{\putwordShortTOC}% % \let\partentry = \shortpartentry \let\numchapentry = \shortchapentry \let\appentry = \shortchapentry \let\unnchapentry = \shortunnchapentry % We want a true roman here for the page numbers. \secfonts \let\rm=\shortcontrm \let\bf=\shortcontbf \let\sl=\shortcontsl \let\tt=\shortconttt \rm \hyphenpenalty = 10000 \advance\baselineskip by 1pt % Open it up a little. \def\numsecentry##1##2##3##4{} \let\appsecentry = \numsecentry \let\unnsecentry = \numsecentry \let\numsubsecentry = \numsecentry \let\appsubsecentry = \numsecentry \let\unnsubsecentry = \numsecentry \let\numsubsubsecentry = \numsecentry \let\appsubsubsecentry = \numsecentry \let\unnsubsubsecentry = \numsecentry \openin 1 \tocreadfilename\space \ifeof 1 \else \readtocfile \fi \closein 1 \vfill \eject \contentsalignmacro % in case @setchapternewpage odd is in effect \endgroup \contentsendroman } \let\shortcontents = \summarycontents % Get ready to use Arabic numerals again \def\contentsendroman{% \lastnegativepageno = \pageno \global\pageno = \savepageno % % If \romancount > \arabiccount, the contents are at the end of the % document. Otherwise, advance where the Arabic numerals start for % the page numbers. \ifnum\romancount>\arabiccount\else\global\arabiccount=\pagecount\fi } % Typeset the label for a chapter or appendix for the short contents. % The arg is, e.g., `A' for an appendix, or `3' for a chapter. % \def\shortchaplabel#1{% % This space should be enough, since a single number is .5em, and the % widest letter (M) is 1em, at least in the Computer Modern fonts. % But use \hss just in case. % (This space doesn't include the extra space that gets added after % the label; that gets put in by \shortchapentry above.) % % We'd like to right-justify chapter numbers, but that looks strange % with appendix letters. And right-justifying numbers and % left-justifying letters looks strange when there is less than 10 % chapters. Have to read the whole toc once to know how many chapters % there are before deciding ... \hbox to 1em{#1\hss}% } % These macros generate individual entries in the table of contents. % The first argument is the chapter or section name. % The last argument is the page number. % The arguments in between are the chapter number, section number, ... % Parts, in the main contents. Replace the part number, which doesn't % exist, with an empty box. Let's hope all the numbers have the same width. % Also ignore the page number, which is conventionally not printed. \def\numeralbox{\setbox0=\hbox{8}\hbox to \wd0{\hfil}} \def\partentry#1#2#3#4{% % Add stretch and a bonus for breaking the page before the part heading. % This reduces the chance of the page being broken immediately after the % part heading, before a following chapter heading. \vskip 0pt plus 5\baselineskip \penalty-300 \vskip 0pt plus -5\baselineskip \dochapentry{\numeralbox\labelspace#1}{}% } % % Parts, in the short toc. \def\shortpartentry#1#2#3#4{% \penalty-300 \vskip.5\baselineskip plus.15\baselineskip minus.1\baselineskip \shortchapentry{{\bf #1}}{\numeralbox}{}{}% } % Chapters, in the main contents. \def\numchapentry#1#2#3#4{\dochapentry{#2\labelspace#1}{#4}} % Chapters, in the short toc. % See comments in \dochapentry re vbox and related settings. \def\shortchapentry#1#2#3#4{% \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#4\egroup}% } % Appendices, in the main contents. % Need the word Appendix, and a fixed-size box. % \def\appendixbox#1{% % We use M since it's probably the widest letter. \setbox0 = \hbox{\putwordAppendix{} M}% \hbox to \wd0{\putwordAppendix{} #1\hss}} % \def\appentry#1#2#3#4{\dochapentry{\appendixbox{#2}\hskip.7em#1}{#4}} % Unnumbered chapters. \def\unnchapentry#1#2#3#4{\dochapentry{#1}{#4}} \def\shortunnchapentry#1#2#3#4{\tocentry{#1}{\doshortpageno\bgroup#4\egroup}} % Sections. \def\numsecentry#1#2#3#4{\dosecentry{#2\labelspace#1}{#4}} \let\appsecentry=\numsecentry \def\unnsecentry#1#2#3#4{\dosecentry{#1}{#4}} % Subsections. \def\numsubsecentry#1#2#3#4{\dosubsecentry{#2\labelspace#1}{#4}} \let\appsubsecentry=\numsubsecentry \def\unnsubsecentry#1#2#3#4{\dosubsecentry{#1}{#4}} % And subsubsections. \def\numsubsubsecentry#1#2#3#4{\dosubsubsecentry{#2\labelspace#1}{#4}} \let\appsubsubsecentry=\numsubsubsecentry \def\unnsubsubsecentry#1#2#3#4{\dosubsubsecentry{#1}{#4}} % This parameter controls the indentation of the various levels. % Same as \defaultparindent. \newdimen\tocindent \tocindent = 15pt % Now for the actual typesetting. In all these, #1 is the text and #2 is the % page number. % % If the toc has to be broken over pages, we want it to be at chapters % if at all possible; hence the \penalty. \def\dochapentry#1#2{% \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip \begingroup % Move the page numbers slightly to the right \advance\entryrightmargin by -0.05em \chapentryfonts \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup \nobreak\vskip .25\baselineskip plus.1\baselineskip } \def\dosecentry#1#2{\begingroup \secentryfonts \leftskip=\tocindent \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup} \def\dosubsecentry#1#2{\begingroup \subsecentryfonts \leftskip=2\tocindent \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup} \def\dosubsubsecentry#1#2{\begingroup \subsubsecentryfonts \leftskip=3\tocindent \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup} % We use the same \entry macro as for the index entries. \let\tocentry = \entry % Space between chapter (or whatever) number and the title. \def\labelspace{\hskip1em \relax} \def\dopageno#1{{\rm #1}} \def\doshortpageno#1{{\rm #1}} \def\chapentryfonts{\secfonts \rm} \def\secentryfonts{\textfonts} \def\subsecentryfonts{\textfonts} \def\subsubsecentryfonts{\textfonts} \message{environments,} % @foo ... @end foo. % @tex ... @end tex escapes into raw TeX temporarily. % One exception: @ is still an escape character, so that @end tex works. % But \@ or @@ will get a plain @ character. \envdef\tex{% \setregularquotes \catcode `\\=0 \catcode `\{=1 \catcode `\}=2 \catcode `\$=3 \catcode `\&=4 \catcode `\#=6 \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie \catcode `\%=14 \catcode `\+=\other \catcode `\"=\other \catcode `\|=\other \catcode `\<=\other \catcode `\>=\other \catcode `\`=\other \catcode `\'=\other % % ' is active in math mode (mathcode"8000). So reset it, and all our % other math active characters (just in case), to plain's definitions. \mathactive % % Inverse of the list at the beginning of the file. \let\b=\ptexb \let\bullet=\ptexbullet \let\c=\ptexc \let\,=\ptexcomma \let\.=\ptexdot \let\dots=\ptexdots \let\equiv=\ptexequiv \let\!=\ptexexclam \let\i=\ptexi \let\indent=\ptexindent \let\noindent=\ptexnoindent \let\{=\ptexlbrace \let\+=\tabalign \let\}=\ptexrbrace \let\/=\ptexslash \let\sp=\ptexsp \let\*=\ptexstar %\let\sup=\ptexsup % do not redefine, we want @sup to work in math mode \let\t=\ptext \expandafter \let\csname top\endcsname=\ptextop % we've made it outer \let\frenchspacing=\plainfrenchspacing % \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}% \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}% \def\@{@}% } % There is no need to define \Etex. % Define @lisp ... @end lisp. % @lisp environment forms a group so it can rebind things, % including the definition of @end lisp (which normally is erroneous). % Amount to narrow the margins by for @lisp. \newskip\lispnarrowing \lispnarrowing=0.4in % This is the definition that ^^M gets inside @lisp, @example, and other % such environments. \null is better than a space, since it doesn't % have any width. \def\lisppar{\null\endgraf} % This space is always present above and below environments. \newskip\envskipamount \envskipamount = 0pt % Make spacing and below environment symmetrical. We use \parskip here % to help in doing that, since in @example-like environments \parskip % is reset to zero; thus the \afterenvbreak inserts no space -- but the % start of the next paragraph will insert \parskip. % \def\aboveenvbreak{{% % =10000 instead of <10000 because of a special case in \itemzzz and % \sectionheading, q.v. \ifnum \lastpenalty=10000 \else \advance\envskipamount by \parskip \endgraf \ifdim\lastskip<\envskipamount \removelastskip \ifnum\lastpenalty<10000 % Penalize breaking before the environment, because preceding text % often leads into it. \penalty100 \fi \vskip\envskipamount \fi \fi }} \def\afterenvbreak{{% % =10000 instead of <10000 because of a special case in \itemzzz and % \sectionheading, q.v. \ifnum \lastpenalty=10000 \else \advance\envskipamount by \parskip \endgraf \ifdim\lastskip<\envskipamount \removelastskip % it's not a good place to break if the last penalty was \nobreak % or better ... \ifnum\lastpenalty<10000 \penalty-50 \fi \vskip\envskipamount \fi \fi }} % \nonarrowing is a flag. If "set", @lisp etc don't narrow margins; it will % also clear it, so that its embedded environments do the narrowing again. \let\nonarrowing=\relax % @cartouche ... @end cartouche: draw rectangle w/rounded corners around % environment contents. % \def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth \def\ctr{{\hskip 6pt\circle\char'010}} \def\cbl{{\circle\char'012\hskip -6pt}} \def\cbr{{\hskip 6pt\circle\char'011}} \def\carttop{\hbox to \cartouter{\hskip\lskip \ctl\leaders\hrule height\circthick\hfil\ctr \hskip\rskip}} \def\cartbot{\hbox to \cartouter{\hskip\lskip \cbl\leaders\hrule height\circthick\hfil\cbr \hskip\rskip}} % \newskip\lskip\newskip\rskip % only require the font if @cartouche is actually used \def\cartouchefontdefs{% \font\circle=lcircle10\relax \circthick=\fontdimen8\circle } \newdimen\circthick \newdimen\cartouter\newdimen\cartinner \newskip\normbskip\newskip\normpskip\newskip\normlskip \envdef\cartouche{% \cartouchefontdefs \ifhmode\par\fi % can't be in the midst of a paragraph. \startsavinginserts \lskip=\leftskip \rskip=\rightskip \leftskip=0pt\rightskip=0pt % we want these *outside*. \cartinner=\hsize \advance\cartinner by-\lskip \advance\cartinner by-\rskip \cartouter=\hsize \advance\cartouter by 18.4pt % allow for 3pt kerns on either % side, and for 6pt waste from % each corner char, and rule thickness \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip % % If this cartouche directly follows a sectioning command, we need the % \parskip glue (backspaced over by default) or the cartouche can % collide with the section heading. \ifnum\lastpenalty>10000 \vskip\parskip \penalty\lastpenalty \fi % \setbox\groupbox=\vbox\bgroup \baselineskip=0pt\parskip=0pt\lineskip=0pt \carttop \hbox\bgroup \hskip\lskip \vrule\kern3pt \vbox\bgroup \kern3pt \hsize=\cartinner \baselineskip=\normbskip \lineskip=\normlskip \parskip=\normpskip \vskip -\parskip \comment % For explanation, see the end of def\group. } \def\Ecartouche{% \ifhmode\par\fi \kern3pt \egroup \kern3pt\vrule \hskip\rskip \egroup \cartbot \egroup \addgroupbox \checkinserts } % This macro is called at the beginning of all the @example variants, % inside a group. \newdimen\nonfillparindent \def\nonfillstart{% \aboveenvbreak \ifdim\hfuzz < 12pt \hfuzz = 12pt \fi % Don't be fussy \sepspaces % Make spaces be word-separators rather than space tokens. \let\par = \lisppar % don't ignore blank lines \obeylines % each line of input is a line of output \parskip = 0pt % Turn off paragraph indentation but redefine \indent to emulate % the normal \indent. \nonfillparindent=\parindent \parindent = 0pt \let\indent\nonfillindent % \emergencystretch = 0pt % don't try to avoid overfull boxes \ifx\nonarrowing\relax \advance \leftskip by \lispnarrowing \exdentamount=\lispnarrowing \else \let\nonarrowing = \relax \fi \let\exdent=\nofillexdent } \begingroup \obeyspaces % We want to swallow spaces (but not other tokens) after the fake % @indent in our nonfill-environments, where spaces are normally % active and set to @tie, resulting in them not being ignored after % @indent. \gdef\nonfillindent{\futurelet\temp\nonfillindentcheck}% \gdef\nonfillindentcheck{% \ifx\temp % \expandafter\nonfillindentgobble% \else% \leavevmode\nonfillindentbox% \fi% }% \endgroup \def\nonfillindentgobble#1{\nonfillindent} \def\nonfillindentbox{\hbox to \nonfillparindent{\hss}} % If you want all examples etc. small: @set dispenvsize small. % If you want even small examples the full size: @set dispenvsize nosmall. % This affects the following displayed environments: % @example, @display, @format, @lisp, @verbatim % \def\smallword{small} \def\nosmallword{nosmall} \let\SETdispenvsize\relax \def\setnormaldispenv{% \ifx\SETdispenvsize\smallword % end paragraph for sake of leading, in case document has no blank % line. This is redundant with what happens in \aboveenvbreak, but % we need to do it before changing the fonts, and it's inconvenient % to change the fonts afterward. \ifnum \lastpenalty=10000 \else \endgraf \fi \smallexamplefonts \rm \fi } \def\setsmalldispenv{% \ifx\SETdispenvsize\nosmallword \else \ifnum \lastpenalty=10000 \else \endgraf \fi \smallexamplefonts \rm \fi } % We often define two environments, @foo and @smallfoo. % Let's do it in one command. #1 is the env name, #2 the definition. \def\makedispenvdef#1#2{% \expandafter\envdef\csname#1\endcsname {\setnormaldispenv #2}% \expandafter\envdef\csname small#1\endcsname {\setsmalldispenv #2}% \expandafter\let\csname E#1\endcsname \afterenvbreak \expandafter\let\csname Esmall#1\endcsname \afterenvbreak } % Define two environment synonyms (#1 and #2) for an environment. \def\maketwodispenvdef#1#2#3{% \makedispenvdef{#1}{#3}% \makedispenvdef{#2}{#3}% } % % @lisp: indented, narrowed, typewriter font; % @example: same as @lisp. % % @smallexample and @smalllisp: use smaller fonts. % Originally contributed by Pavel@xerox. % \maketwodispenvdef{lisp}{example}{% \nonfillstart \tt\setcodequotes \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special. \parsearg\gobble } % @display/@smalldisplay: same as @lisp except keep current font. % \makedispenvdef{display}{% \nonfillstart \gobble } % @format/@smallformat: same as @display except don't narrow margins. % \makedispenvdef{format}{% \let\nonarrowing = t% \nonfillstart \gobble } % @flushleft: same as @format, but doesn't obey \SETdispenvsize. \envdef\flushleft{% \let\nonarrowing = t% \nonfillstart \gobble } \let\Eflushleft = \afterenvbreak % @flushright. % \envdef\flushright{% \let\nonarrowing = t% \nonfillstart \advance\leftskip by 0pt plus 1fill\relax \gobble } \let\Eflushright = \afterenvbreak % @raggedright does more-or-less normal line breaking but no right % justification. From plain.tex. \envdef\raggedright{% \rightskip0pt plus2.4em \spaceskip.3333em \xspaceskip.5em\relax } \let\Eraggedright\par \envdef\raggedleft{% \parindent=0pt \leftskip0pt plus2em \spaceskip.3333em \xspaceskip.5em \parfillskip=0pt \hbadness=10000 % Last line will usually be underfull, so turn off % badness reporting. } \let\Eraggedleft\par \envdef\raggedcenter{% \parindent=0pt \rightskip0pt plus1em \leftskip0pt plus1em \spaceskip.3333em \xspaceskip.5em \parfillskip=0pt \hbadness=10000 % Last line will usually be underfull, so turn off % badness reporting. } \let\Eraggedcenter\par % @quotation does normal linebreaking (hence we can't use \nonfillstart) % and narrows the margins. We keep \parskip nonzero in general, since % we're doing normal filling. So, when using \aboveenvbreak and % \afterenvbreak, temporarily make \parskip 0. % \makedispenvdef{quotation}{\quotationstart} % \def\quotationstart{% \indentedblockstart % same as \indentedblock, but increase right margin too. \ifx\nonarrowing\relax \advance\rightskip by \lispnarrowing \fi \parsearg\quotationlabel } % We have retained a nonzero parskip for the environment, since we're % doing normal filling. % \def\Equotation{% \par \ifx\quotationauthor\thisisundefined\else % indent a bit. \leftline{\kern 2\leftskip \sl ---\quotationauthor}% \fi {\parskip=0pt \afterenvbreak}% } \def\Esmallquotation{\Equotation} % If we're given an argument, typeset it in bold with a colon after. \def\quotationlabel#1{% \def\temp{#1}% \ifx\temp\empty \else {\bf #1: }% \fi } % @indentedblock is like @quotation, but indents only on the left and % has no optional argument. % \makedispenvdef{indentedblock}{\indentedblockstart} % \def\indentedblockstart{% {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip \parindent=0pt % % @cartouche defines \nonarrowing to inhibit narrowing at next level down. \ifx\nonarrowing\relax \advance\leftskip by \lispnarrowing \exdentamount = \lispnarrowing \else \let\nonarrowing = \relax \fi } % Keep a nonzero parskip for the environment, since we're doing normal filling. % \def\Eindentedblock{% \par {\parskip=0pt \afterenvbreak}% } \def\Esmallindentedblock{\Eindentedblock} % LaTeX-like @verbatim...@end verbatim and @verb{...} % If we want to allow any as delimiter, % we need the curly braces so that makeinfo sees the @verb command, eg: % `@verbx...x' would look like the '@verbx' command. --janneke@gnu.org % % [Knuth]: Donald Ervin Knuth, 1996. The TeXbook. % % [Knuth] p.344; only we need to do the other characters Texinfo sets % active too. Otherwise, they get lost as the first character on a % verbatim line. \def\dospecials{% \do\ \do\\\do\{\do\}\do\$\do\&% \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~% \do\<\do\>\do\|\do\@\do+\do\"% % Don't do the quotes -- if we do, @set txicodequoteundirected and % @set txicodequotebacktick will not have effect on @verb and % @verbatim, and ?` and !` ligatures won't get disabled. %\do\`\do\'% } % % [Knuth] p. 380 \def\uncatcodespecials{% \def\do##1{\catcode`##1=\other}\dospecials} % % Setup for the @verb command. % % Eight spaces for a tab \begingroup \catcode`\^^I=\active \gdef\tabeightspaces{\catcode`\^^I=\active\def^^I{\ \ \ \ \ \ \ \ }} \endgroup % \def\setupverb{% \tt % easiest (and conventionally used) font for verbatim \def\par{\leavevmode\endgraf}% \setcodequotes \tabeightspaces % Respect line breaks, % print special symbols as themselves, and % make each space count % must do in this order: \obeylines \uncatcodespecials \sepspaces } % Setup for the @verbatim environment % % Real tab expansion. \newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount % % We typeset each line of the verbatim in an \hbox, so we can handle % tabs. \newbox\verbbox \def\starttabbox{\setbox\verbbox=\hbox\bgroup} % \begingroup \catcode`\^^I=\active \gdef\tabexpand{% \catcode`\^^I=\active \def^^I{\leavevmode\egroup \dimen\verbbox=\wd\verbbox % the width so far, or since the previous tab \divide\dimen\verbbox by\tabw \multiply\dimen\verbbox by\tabw % compute previous multiple of \tabw \advance\dimen\verbbox by\tabw % advance to next multiple of \tabw \wd\verbbox=\dimen\verbbox \leavevmode\box\verbbox \starttabbox }% } \endgroup % start the verbatim environment. \def\setupverbatim{% \let\nonarrowing = t% \nonfillstart \tt % easiest (and conventionally used) font for verbatim \def\par{\egroup\leavevmode\box\verbbox\endgraf\starttabbox}% \tabexpand \setcodequotes % Respect line breaks, % print special symbols as themselves, and % make each space count. % Must do in this order: \obeylines \uncatcodespecials \sepspaces } % Do the @verb magic: verbatim text is quoted by unique % delimiter characters. Before first delimiter expect a % right brace, after last delimiter expect closing brace: % % \def\doverb'{'#1'}'{#1} % % [Knuth] p. 382; only eat outer {} \begingroup \catcode`[=1\catcode`]=2\catcode`\{=\other\catcode`\}=\other \gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next] \endgroup % \def\verb{\begingroup\setupverb\doverb} % % % Do the @verbatim magic: define the macro \doverbatim so that % the (first) argument ends when '@end verbatim' is reached, ie: % % \def\doverbatim#1@end verbatim{#1} % % For Texinfo it's a lot easier than for LaTeX, % because texinfo's \verbatim doesn't stop at '\end{verbatim}': % we need not redefine '\', '{' and '}'. % % Inspired by LaTeX's verbatim command set [latex.ltx] % \begingroup \catcode`\ =\active \obeylines % % ignore everything up to the first ^^M, that's the newline at the end % of the @verbatim input line itself. Otherwise we get an extra blank % line in the output. \xdef\doverbatim#1^^M#2@end verbatim{% \starttabbox#2\egroup\noexpand\end\gobble verbatim}% % We really want {...\end verbatim} in the body of the macro, but % without the active space; thus we have to use \xdef and \gobble. % The \egroup ends the \verbbox started at the end of the last line in % the block. \endgroup % \envdef\verbatim{% \setnormaldispenv\setupverbatim\doverbatim } \let\Everbatim = \afterenvbreak % @verbatiminclude FILE - insert text of file in verbatim environment. % \def\verbatiminclude{\parseargusing\filenamecatcodes\doverbatiminclude} % \def\doverbatiminclude#1{% {% \makevalueexpandable \setupverbatim {% \indexnofonts % Allow `@@' and other weird things in file names. \wlog{texinfo.tex: doing @verbatiminclude of #1^^J}% \edef\tmp{\noexpand\input #1 } \expandafter }\expandafter\starttabbox\tmp\egroup \afterenvbreak }% } % @copying ... @end copying. % Save the text away for @insertcopying later. % % We save the uninterpreted tokens, rather than creating a box. % Saving the text in a box would be much easier, but then all the % typesetting commands (@smallbook, font changes, etc.) have to be done % beforehand -- and a) we want @copying to be done first in the source % file; b) letting users define the frontmatter in as flexible order as % possible is desirable. % \def\copying{\checkenv{}\begingroup\scanargctxt\docopying} \def\docopying#1@end copying{\endgroup\def\copyingtext{#1}} % \def\insertcopying{% \begingroup \parindent = 0pt % paragraph indentation looks wrong on title page \scanexp\copyingtext \endgroup } \message{defuns,} % @defun etc. \newskip\defbodyindent \defbodyindent=.4in \newskip\defargsindent \defargsindent=50pt \newskip\deflastargmargin \deflastargmargin=18pt \newcount\defunpenalty % Start the processing of @deffn: \def\startdefun{% \ifnum\lastpenalty<10000 \medbreak \defunpenalty=10003 % Will keep this @deffn together with the % following @def command, see below. \else % If there are two @def commands in a row, we'll have a \nobreak, % which is there to keep the function description together with its % header. But if there's nothing but headers, we need to allow a % break somewhere. Check specifically for penalty 10002, inserted % by \printdefunline, instead of 10000, since the sectioning % commands also insert a nobreak penalty, and we don't want to allow % a break between a section heading and a defun. % % As a further refinement, we avoid "club" headers by signalling % with penalty of 10003 after the very first @deffn in the % sequence (see above), and penalty of 10002 after any following % @def command. \ifnum\lastpenalty=10002 \penalty2000 \else \defunpenalty=10002 \fi % % Similarly, after a section heading, do not allow a break. % But do insert the glue. \medskip % preceded by discardable penalty, so not a breakpoint \fi % \parindent=0in \advance\leftskip by \defbodyindent \exdentamount=\defbodyindent } \def\dodefunx#1{% % First, check whether we are in the right environment: \checkenv#1% % % As above, allow line break if we have multiple x headers in a row. % It's not a great place, though. \ifnum\lastpenalty=10002 \penalty3000 \else \defunpenalty=10002 \fi % % And now, it's time to reuse the body of the original defun: \expandafter\gobbledefun#1% } \def\gobbledefun#1\startdefun{} % \printdefunline \deffnheader{text} % \def\printdefunline#1#2{% \begingroup \plainfrenchspacing % call \deffnheader: #1#2 \endheader % common ending: \interlinepenalty = 10000 \advance\rightskip by 0pt plus 1fil\relax \endgraf \nobreak\vskip -\parskip \penalty\defunpenalty % signal to \startdefun and \dodefunx % Some of the @defun-type tags do not enable magic parentheses, % rendering the following check redundant. But we don't optimize. \checkparencounts \endgroup } \def\Edefun{\endgraf\medbreak} % \makedefun{deffn} creates \deffn, \deffnx and \Edeffn; % the only thing remaining is to define \deffnheader. % \def\makedefun#1{% \expandafter\let\csname E#1\endcsname = \Edefun \edef\temp{\noexpand\domakedefun \makecsname{#1}\makecsname{#1x}\makecsname{#1header}}% \temp } % \domakedefun \deffn \deffnx \deffnheader { (defn. of \deffnheader) } % % Define \deffn and \deffnx, without parameters. % \deffnheader has to be defined explicitly. % \def\domakedefun#1#2#3{% \envdef#1{% \startdefun \doingtypefnfalse % distinguish typed functions from all else \parseargusing\activeparens{\printdefunline#3}% }% \def#2{\dodefunx#1}% \def#3% } \newif\ifdoingtypefn % doing typed function? \newif\ifrettypeownline % typeset return type on its own line? % @deftypefnnewline on|off says whether the return type of typed functions % are printed on their own line. This affects @deftypefn, @deftypefun, % @deftypeop, and @deftypemethod. % \parseargdef\deftypefnnewline{% \def\temp{#1}% \ifx\temp\onword \expandafter\let\csname SETtxideftypefnnl\endcsname = \empty \else\ifx\temp\offword \expandafter\let\csname SETtxideftypefnnl\endcsname = \relax \else \errhelp = \EMsimple \errmessage{Unknown @txideftypefnnl value `\temp', must be on|off}% \fi\fi } % \dosubind {index}{topic}{subtopic} % % If SUBTOPIC is present, precede it with a space, and call \doind. % (At some time during the 20th century, this made a two-level entry in an % index such as the operation index. Nobody seemed to notice the change in % behaviour though.) \def\dosubind#1#2#3{% \def\thirdarg{#3}% \ifx\thirdarg\empty \doind{#1}{#2}% \else \doind{#1}{#2\space#3}% \fi } % Untyped functions: % @deffn category name args \makedefun{deffn}{\deffngeneral{}} % @deffn category class name args \makedefun{defop}#1 {\defopon{#1\ \putwordon}} % \defopon {category on}class name args \def\defopon#1#2 {\deffngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} } % \deffngeneral {subind}category name args % \def\deffngeneral#1#2 #3 #4\endheader{% \dosubind{fn}{\code{#3}}{#1}% \defname{#2}{}{#3}\magicamp\defunargs{#4\unskip}% } % Typed functions: % @deftypefn category type name args \makedefun{deftypefn}{\deftypefngeneral{}} % @deftypeop category class type name args \makedefun{deftypeop}#1 {\deftypeopon{#1\ \putwordon}} % \deftypeopon {category on}class type name args \def\deftypeopon#1#2 {\deftypefngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} } % \deftypefngeneral {subind}category type name args % \def\deftypefngeneral#1#2 #3 #4 #5\endheader{% \dosubind{fn}{\code{#4}}{#1}% \doingtypefntrue \defname{#2}{#3}{#4}\defunargs{#5\unskip}% } % Typed variables: % @deftypevr category type var args \makedefun{deftypevr}{\deftypecvgeneral{}} % @deftypecv category class type var args \makedefun{deftypecv}#1 {\deftypecvof{#1\ \putwordof}} % \deftypecvof {category of}class type var args \def\deftypecvof#1#2 {\deftypecvgeneral{\putwordof\ \code{#2}}{#1\ \code{#2}} } % \deftypecvgeneral {subind}category type var args % \def\deftypecvgeneral#1#2 #3 #4 #5\endheader{% \dosubind{vr}{\code{#4}}{#1}% \defname{#2}{#3}{#4}\defunargs{#5\unskip}% } % Untyped variables: % @defvr category var args \makedefun{defvr}#1 {\deftypevrheader{#1} {} } % @defcv category class var args \makedefun{defcv}#1 {\defcvof{#1\ \putwordof}} % \defcvof {category of}class var args \def\defcvof#1#2 {\deftypecvof{#1}#2 {} } % Types: % @deftp category name args \makedefun{deftp}#1 #2 #3\endheader{% \doind{tp}{\code{#2}}% \defname{#1}{}{#2}\defunargs{#3\unskip}% } % Remaining @defun-like shortcuts: \makedefun{defun}{\deffnheader{\putwordDeffunc} } \makedefun{defmac}{\deffnheader{\putwordDefmac} } \makedefun{defspec}{\deffnheader{\putwordDefspec} } \makedefun{deftypefun}{\deftypefnheader{\putwordDeffunc} } \makedefun{defvar}{\defvrheader{\putwordDefvar} } \makedefun{defopt}{\defvrheader{\putwordDefopt} } \makedefun{deftypevar}{\deftypevrheader{\putwordDefvar} } \makedefun{defmethod}{\defopon\putwordMethodon} \makedefun{deftypemethod}{\deftypeopon\putwordMethodon} \makedefun{defivar}{\defcvof\putwordInstanceVariableof} \makedefun{deftypeivar}{\deftypecvof\putwordInstanceVariableof} % \defname, which formats the name of the @def (not the args). % #1 is the category, such as "Function". % #2 is the return type, if any. % #3 is the function name. % % We are followed by (but not passed) the arguments, if any. % \def\defname#1#2#3{% \par % Get the values of \leftskip and \rightskip as they were outside the @def... \advance\leftskip by -\defbodyindent % % Determine if we are typesetting the return type of a typed function % on a line by itself. \rettypeownlinefalse \ifdoingtypefn % doing a typed function specifically? % then check user option for putting return type on its own line: \expandafter\ifx\csname SETtxideftypefnnl\endcsname\relax \else \rettypeownlinetrue \fi \fi % % How we'll format the category name. Putting it in brackets helps % distinguish it from the body text that may end up on the next line % just below it. \def\temp{#1}% \setbox0=\hbox{\kern\deflastargmargin \ifx\temp\empty\else [\rm\temp]\fi} % % Figure out line sizes for the paragraph shape. We'll always have at % least two. \tempnum = 2 % % The first line needs space for \box0; but if \rightskip is nonzero, % we need only space for the part of \box0 which exceeds it: \dimen0=\hsize \advance\dimen0 by -\wd0 \advance\dimen0 by \rightskip % % If doing a return type on its own line, we'll have another line. \ifrettypeownline \advance\tempnum by 1 \def\maybeshapeline{0in \hsize}% \else \def\maybeshapeline{}% \fi % % The continuations: \dimen2=\hsize \advance\dimen2 by -\defargsindent % % The final paragraph shape: \parshape \tempnum 0in \dimen0 \maybeshapeline \defargsindent \dimen2 % % Put the category name at the right margin. \noindent \hbox to 0pt{% \hfil\box0 \kern-\hsize % \hsize has to be shortened this way: \kern\leftskip % Intentionally do not respect \rightskip, since we need the space. }% % % Allow all lines to be underfull without complaint: \tolerance=10000 \hbadness=10000 \exdentamount=\defbodyindent {% % defun fonts. We use typewriter by default (used to be bold) because: % . we're printing identifiers, they should be in tt in principle. % . in languages with many accents, such as Czech or French, it's % common to leave accents off identifiers. The result looks ok in % tt, but exceedingly strange in rm. % . we don't want -- and --- to be treated as ligatures. % . this still does not fix the ?` and !` ligatures, but so far no % one has made identifiers using them :). \df \tt \def\temp{#2}% text of the return type \ifx\temp\empty\else \tclose{\temp}% typeset the return type \ifrettypeownline % put return type on its own line; prohibit line break following: \hfil\vadjust{\nobreak}\break \else \space % type on same line, so just followed by a space \fi \fi % no return type #3% output function name }% {\rm\enskip}% hskip 0.5 em of \rmfont % \boldbrax % arguments will be output next, if any. } % Print arguments in slanted roman (not ttsl), inconsistently with using % tt for the name. This is because literal text is sometimes needed in % the argument list (groff manual), and ttsl and tt are not very % distinguishable. Prevent hyphenation at `-' chars. % \def\defunargs#1{% % use sl by default (not ttsl), % tt for the names. \df \sl \hyphenchar\font=0 % % On the other hand, if an argument has two dashes (for instance), we % want a way to get ttsl. We used to recommend @var for that, so % leave the code in, but it's strange for @var to lead to typewriter. % Nowadays we recommend @code, since the difference between a ttsl hyphen % and a tt hyphen is pretty tiny. @code also disables ?` !`. \def\var##1{{\setregularquotes\ttslanted{##1}}}% #1% \sl\hyphenchar\font=45 } % We want ()&[] to print specially on the defun line. % \def\activeparens{% \catcode`\(=\active \catcode`\)=\active \catcode`\[=\active \catcode`\]=\active \catcode`\&=\active } % Make control sequences which act like normal parenthesis chars. \let\lparen = ( \let\rparen = ) % Be sure that we always have a definition for `(', etc. For example, % if the fn name has parens in it, \boldbrax will not be in effect yet, % so TeX would otherwise complain about undefined control sequence. { \activeparens \global\let(=\lparen \global\let)=\rparen \global\let[=\lbrack \global\let]=\rbrack \global\let& = \& \gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb} \gdef\magicamp{\let&=\amprm} } \let\ampchar\& \newcount\parencount % If we encounter &foo, then turn on ()-hacking afterwards \newif\ifampseen \def\amprm#1 {\ampseentrue{\bf\ }} \def\parenfont{% \ifampseen % At the first level, print parens in roman, % otherwise use the default font. \ifnum \parencount=1 \rm \fi \else % The \sf parens (in \boldbrax) actually are a little bolder than % the contained text. This is especially needed for [ and ] . \sf \fi } \def\infirstlevel#1{% \ifampseen \ifnum\parencount=1 #1% \fi \fi } \def\bfafterword#1 {#1 \bf} \def\opnr{% \global\advance\parencount by 1 {\parenfont(}% \infirstlevel \bfafterword } \def\clnr{% {\parenfont)}% \infirstlevel \sl \global\advance\parencount by -1 } \newcount\brackcount \def\lbrb{% \global\advance\brackcount by 1 {\bf[}% } \def\rbrb{% {\bf]}% \global\advance\brackcount by -1 } \def\checkparencounts{% \ifnum\parencount=0 \else \badparencount \fi \ifnum\brackcount=0 \else \badbrackcount \fi } % these should not use \errmessage; the glibc manual, at least, actually % has such constructs (when documenting function pointers). \def\badparencount{% \message{Warning: unbalanced parentheses in @def...}% \global\parencount=0 } \def\badbrackcount{% \message{Warning: unbalanced square brackets in @def...}% \global\brackcount=0 } \message{macros,} % @macro. % To do this right we need a feature of e-TeX, \scantokens, % which we arrange to emulate with a temporary file in ordinary TeX. \ifx\eTeXversion\thisisundefined \newwrite\macscribble \def\scantokens#1{% \toks0={#1}% \immediate\openout\macscribble=\jobname.tmp \immediate\write\macscribble{\the\toks0}% \immediate\closeout\macscribble \input \jobname.tmp } \fi \let\E=\expandafter % Used at the time of macro expansion. % Argument is macro body with arguments substituted \def\scanmacro#1{% \newlinechar`\^^M % expand the expansion of \eatleadingcr twice to maybe remove a leading % newline (and \else and \fi tokens), then call \eatspaces on the result. \def\xeatspaces##1{% \E\E\E\E\E\E\E\eatspaces\E\E\E\E\E\E\E{\eatleadingcr##1% }}% \def\xempty##1{}% % % Process the macro body under the current catcode regime. \scantokens{#1@comment}% % % The \comment is to remove the \newlinechar added by \scantokens, and % can be noticed by \parsearg. Note \c isn't used because this means cedilla % in math mode. } % Used for copying and captions \def\scanexp#1{% \expandafter\scanmacro\expandafter{#1}% } \newcount\paramno % Count of parameters \newtoks\macname % Macro name \newif\ifrecursive % Is it recursive? % List of all defined macros in the form % \commondummyword\macro1\commondummyword\macro2... % Currently is also contains all @aliases; the list can be split % if there is a need. \def\macrolist{} % Add the macro to \macrolist \def\addtomacrolist#1{\expandafter \addtomacrolistxxx \csname#1\endcsname} \def\addtomacrolistxxx#1{% \toks0 = \expandafter{\macrolist\commondummyword#1}% \xdef\macrolist{\the\toks0}% } % Utility routines. % This does \let #1 = #2, with \csnames; that is, % \let \csname#1\endcsname = \csname#2\endcsname % (except of course we have to play expansion games). % \def\cslet#1#2{% \expandafter\let \csname#1\expandafter\endcsname \csname#2\endcsname } % Trim leading and trailing spaces off a string. % Concepts from aro-bend problem 15 (see CTAN). {\catcode`\@=11 \gdef\eatspaces #1{\expandafter\trim@\expandafter{#1 }} \gdef\trim@ #1{\trim@@ @#1 @ #1 @ @@} \gdef\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @} \def\unbrace#1{#1} \unbrace{\gdef\trim@@@ #1 } #2@{#1} } {\catcode`\^^M=\other% \gdef\eatleadingcr#1{\if\noexpand#1\noexpand^^M\else\E#1\fi}}% % Warning: this won't work for a delimited argument % or for an empty argument % Trim a single trailing ^^M off a string. {\catcode`\^^M=\other \catcode`\Q=3% \gdef\eatcr #1{\eatcra #1Q^^MQ}% \gdef\eatcra#1^^MQ{\eatcrb#1Q}% \gdef\eatcrb#1Q#2Q{#1}% } % Macro bodies are absorbed as an argument in a context where % all characters are catcode 10, 11 or 12, except \ which is active % (as in normal texinfo). It is necessary to change the definition of \ % to recognize macro arguments; this is the job of \mbodybackslash. % % Non-ASCII encodings make 8-bit characters active, so un-activate % them to avoid their expansion. Must do this non-globally, to % confine the change to the current group. % % It's necessary to have hard CRs when the macro is executed. This is % done by making ^^M (\endlinechar) catcode 12 when reading the macro % body, and then making it the \newlinechar in \scanmacro. % \def\scanctxt{% used as subroutine \catcode`\"=\other \catcode`\+=\other \catcode`\<=\other \catcode`\>=\other \catcode`\^=\other \catcode`\_=\other \catcode`\|=\other \catcode`\~=\other \passthroughcharstrue } \def\scanargctxt{% used for copying and captions, not macros. \scanctxt \catcode`\@=\other \catcode`\\=\other \catcode`\^^M=\other } \def\macrobodyctxt{% used for @macro definitions \scanctxt \catcode`\ =\other \catcode`\@=\other \catcode`\{=\other \catcode`\}=\other \catcode`\^^M=\other \usembodybackslash } % Used when scanning braced macro arguments. Note, however, that catcode % changes here are ineffectual if the macro invocation was nested inside % an argument to another Texinfo command. \def\macroargctxt{% \scanctxt \catcode`\ =\active \catcode`\@=\other \catcode`\^^M=\other \catcode`\\=\active } \def\macrolineargctxt{% used for whole-line arguments without braces \scanctxt \catcode`\@=\other \catcode`\{=\other \catcode`\}=\other } % \mbodybackslash is the definition of \ in @macro bodies. % It maps \foo\ => \csname macarg.foo\endcsname => #N % where N is the macro parameter number. % We define \csname macarg.\endcsname to be \realbackslash, so % \\ in macro replacement text gets you a backslash. % {\catcode`@=0 @catcode`@\=@active @gdef@usembodybackslash{@let\=@mbodybackslash} @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname} } \expandafter\def\csname macarg.\endcsname{\realbackslash} \def\margbackslash#1{\char`\#1 } \def\macro{\recursivefalse\parsearg\macroxxx} \def\rmacro{\recursivetrue\parsearg\macroxxx} \def\macroxxx#1{% \getargs{#1}% now \macname is the macname and \argl the arglist \ifx\argl\empty % no arguments \paramno=0\relax \else \expandafter\parsemargdef \argl;% \if\paramno>256\relax \ifx\eTeXversion\thisisundefined \errhelp = \EMsimple \errmessage{You need eTeX to compile a file with macros with more than 256 arguments} \fi \fi \fi \if1\csname ismacro.\the\macname\endcsname \message{Warning: redefining \the\macname}% \else \expandafter\ifx\csname \the\macname\endcsname \relax \else \errmessage{Macro name \the\macname\space already defined}\fi \global\cslet{macsave.\the\macname}{\the\macname}% \global\expandafter\let\csname ismacro.\the\macname\endcsname=1% \addtomacrolist{\the\macname}% \fi \begingroup \macrobodyctxt \ifrecursive \expandafter\parsermacbody \else \expandafter\parsemacbody \fi} \parseargdef\unmacro{% \if1\csname ismacro.#1\endcsname \global\cslet{#1}{macsave.#1}% \global\expandafter\let \csname ismacro.#1\endcsname=0% % Remove the macro name from \macrolist: \begingroup \expandafter\let\csname#1\endcsname \relax \let\commondummyword\unmacrodo \xdef\macrolist{\macrolist}% \endgroup \else \errmessage{Macro #1 not defined}% \fi } % Called by \do from \dounmacro on each macro. The idea is to omit any % macro definitions that have been changed to \relax. % \def\unmacrodo#1{% \ifx #1\relax % remove this \else \noexpand\commondummyword \noexpand#1% \fi } % \getargs -- Parse the arguments to a @macro line. Set \macname to % the name of the macro, and \argl to the braced argument list. \def\getargs#1{\getargsxxx#1{}} \def\getargsxxx#1#{\getmacname #1 \relax\getmacargs} \def\getmacname#1 #2\relax{\macname={#1}} \def\getmacargs#1{\def\argl{#1}} % This made use of the feature that if the last token of a % is #, then the preceding argument is delimited by % an opening brace, and that opening brace is not consumed. % Parse the optional {params} list to @macro or @rmacro. % Set \paramno to the number of arguments, % and \paramlist to a parameter text for the macro (e.g. #1,#2,#3 for a % three-param macro.) Define \macarg.BLAH for each BLAH in the params % list to some hook where the argument is to be expanded. If there are % less than 10 arguments that hook is to be replaced by ##N where N % is the position in that list, that is to say the macro arguments are to be % defined `a la TeX in the macro body. % % That gets used by \mbodybackslash (above). % % If there are 10 or more arguments, a different technique is used: see % \parsemmanyargdef. % \def\parsemargdef#1;{% \paramno=0\def\paramlist{}% \let\hash\relax % \hash is redefined to `#' later to get it into definitions \let\xeatspaces\relax \let\xempty\relax \parsemargdefxxx#1,;,% \ifnum\paramno<10\relax\else \paramno0\relax \parsemmanyargdef@@#1,;,% 10 or more arguments \fi } \def\parsemargdefxxx#1,{% \if#1;\let\next=\relax \else \let\next=\parsemargdefxxx \advance\paramno by 1 \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname {\xeatspaces{\hash\the\paramno\noexpand\xempty{}}}% \edef\paramlist{\paramlist\hash\the\paramno,}% \fi\next} % the \xempty{} is to give \eatleadingcr an argument in the case of an % empty macro argument. % \parsemacbody, \parsermacbody % % Read recursive and nonrecursive macro bodies. (They're different since % rec and nonrec macros end differently.) % % We are in \macrobodyctxt, and the \xdef causes backslashshes in the macro % body to be transformed. % Set \macrobody to the body of the macro, and call \defmacro. % {\catcode`\ =\other\long\gdef\parsemacbody#1@end macro{% \xdef\macrobody{\eatcr{#1}}\endgroup\defmacro}}% {\catcode`\ =\other\long\gdef\parsermacbody#1@end rmacro{% \xdef\macrobody{\eatcr{#1}}\endgroup\defmacro}}% % Make @ a letter, so that we can make private-to-Texinfo macro names. \edef\texiatcatcode{\the\catcode`\@} \catcode `@=11\relax %%%%%%%%%%%%%% Code for > 10 arguments only %%%%%%%%%%%%%%%%%% % If there are 10 or more arguments, a different technique is used, where the % hook remains in the body, and when macro is to be expanded the body is % processed again to replace the arguments. % % In that case, the hook is \the\toks N-1, and we simply set \toks N-1 to the % argument N value and then \edef the body (nothing else will expand because of % the catcode regime under which the body was input). % % If you compile with TeX (not eTeX), and you have macros with 10 or more % arguments, no macro can have more than 256 arguments (else error). % % In case that there are 10 or more arguments we parse again the arguments % list to set new definitions for the \macarg.BLAH macros corresponding to % each BLAH argument. It was anyhow needed to parse already once this list % in order to count the arguments, and as macros with at most 9 arguments % are by far more frequent than macro with 10 or more arguments, defining % twice the \macarg.BLAH macros does not cost too much processing power. \def\parsemmanyargdef@@#1,{% \if#1;\let\next=\relax \else \let\next=\parsemmanyargdef@@ \edef\tempb{\eatspaces{#1}}% \expandafter\def\expandafter\tempa \expandafter{\csname macarg.\tempb\endcsname}% % Note that we need some extra \noexpand\noexpand, this is because we % don't want \the to be expanded in the \parsermacbody as it uses an % \xdef . \expandafter\edef\tempa {\noexpand\noexpand\noexpand\the\toks\the\paramno}% \advance\paramno by 1\relax \fi\next} \let\endargs@\relax \let\nil@\relax \def\nilm@{\nil@}% \long\def\nillm@{\nil@}% % This macro is expanded during the Texinfo macro expansion, not during its % definition. It gets all the arguments' values and assigns them to macros % macarg.ARGNAME % % #1 is the macro name % #2 is the list of argument names % #3 is the list of argument values \def\getargvals@#1#2#3{% \def\macargdeflist@{}% \def\saveparamlist@{#2}% Need to keep a copy for parameter expansion. \def\paramlist{#2,\nil@}% \def\macroname{#1}% \begingroup \macroargctxt \def\argvaluelist{#3,\nil@}% \def\@tempa{#3}% \ifx\@tempa\empty \setemptyargvalues@ \else \getargvals@@ \fi } \def\getargvals@@{% \ifx\paramlist\nilm@ % Some sanity check needed here that \argvaluelist is also empty. \ifx\argvaluelist\nillm@ \else \errhelp = \EMsimple \errmessage{Too many arguments in macro `\macroname'!}% \fi \let\next\macargexpandinbody@ \else \ifx\argvaluelist\nillm@ % No more arguments values passed to macro. Set remaining named-arg % macros to empty. \let\next\setemptyargvalues@ \else % pop current arg name into \@tempb \def\@tempa##1{\pop@{\@tempb}{\paramlist}##1\endargs@}% \expandafter\@tempa\expandafter{\paramlist}% % pop current argument value into \@tempc \def\@tempa##1{\longpop@{\@tempc}{\argvaluelist}##1\endargs@}% \expandafter\@tempa\expandafter{\argvaluelist}% % Here \@tempb is the current arg name and \@tempc is the current arg value. % First place the new argument macro definition into \@tempd \expandafter\macname\expandafter{\@tempc}% \expandafter\let\csname macarg.\@tempb\endcsname\relax \expandafter\def\expandafter\@tempe\expandafter{% \csname macarg.\@tempb\endcsname}% \edef\@tempd{\long\def\@tempe{\the\macname}}% \push@\@tempd\macargdeflist@ \let\next\getargvals@@ \fi \fi \next } \def\push@#1#2{% \expandafter\expandafter\expandafter\def \expandafter\expandafter\expandafter#2% \expandafter\expandafter\expandafter{% \expandafter#1#2}% } % Replace arguments by their values in the macro body, and place the result % in macro \@tempa. % \def\macvalstoargs@{% % To do this we use the property that token registers that are \the'ed % within an \edef expand only once. So we are going to place all argument % values into respective token registers. % % First we save the token context, and initialize argument numbering. \begingroup \paramno0\relax % Then, for each argument number #N, we place the corresponding argument % value into a new token list register \toks#N \expandafter\putargsintokens@\saveparamlist@,;,% % Then, we expand the body so that argument are replaced by their % values. The trick for values not to be expanded themselves is that they % are within tokens and that tokens expand only once in an \edef . \edef\@tempc{\csname mac.\macroname .body\endcsname}% % Now we restore the token stack pointer to free the token list registers % which we have used, but we make sure that expanded body is saved after % group. \expandafter \endgroup \expandafter\def\expandafter\@tempa\expandafter{\@tempc}% } % Define the named-macro outside of this group and then close this group. % \def\macargexpandinbody@{% \expandafter \endgroup \macargdeflist@ % First the replace in body the macro arguments by their values, the result % is in \@tempa . \macvalstoargs@ % Then we point at the \norecurse or \gobble (for recursive) macro value % with \@tempb . \expandafter\let\expandafter\@tempb\csname mac.\macroname .recurse\endcsname % Depending on whether it is recursive or not, we need some tailing % \egroup . \ifx\@tempb\gobble \let\@tempc\relax \else \let\@tempc\egroup \fi % And now we do the real job: \edef\@tempd{\noexpand\@tempb{\macroname}\noexpand\scanmacro{\@tempa}\@tempc}% \@tempd } \def\putargsintokens@#1,{% \if#1;\let\next\relax \else \let\next\putargsintokens@ % First we allocate the new token list register, and give it a temporary % alias \@tempb . \toksdef\@tempb\the\paramno % Then we place the argument value into that token list register. \expandafter\let\expandafter\@tempa\csname macarg.#1\endcsname \expandafter\@tempb\expandafter{\@tempa}% \advance\paramno by 1\relax \fi \next } % Trailing missing arguments are set to empty. % \def\setemptyargvalues@{% \ifx\paramlist\nilm@ \let\next\macargexpandinbody@ \else \expandafter\setemptyargvaluesparser@\paramlist\endargs@ \let\next\setemptyargvalues@ \fi \next } \def\setemptyargvaluesparser@#1,#2\endargs@{% \expandafter\def\expandafter\@tempa\expandafter{% \expandafter\def\csname macarg.#1\endcsname{}}% \push@\@tempa\macargdeflist@ \def\paramlist{#2}% } % #1 is the element target macro % #2 is the list macro % #3,#4\endargs@ is the list value \def\pop@#1#2#3,#4\endargs@{% \def#1{#3}% \def#2{#4}% } \long\def\longpop@#1#2#3,#4\endargs@{% \long\def#1{#3}% \long\def#2{#4}% } %%%%%%%%%%%%%% End of code for > 10 arguments %%%%%%%%%%%%%%%%%% % This defines a Texinfo @macro or @rmacro, called by \parsemacbody. % \macrobody has the body of the macro in it, with placeholders for % its parameters, looking like "\xeatspaces{\hash 1}". % \paramno is the number of parameters % \paramlist is a TeX parameter text, e.g. "#1,#2,#3," % There are four cases: macros of zero, one, up to nine, and many arguments. % \xdef is used so that macro definitions will survive the file % they're defined in: @include reads the file inside a group. % \def\defmacro{% \let\hash=##% convert placeholders to macro parameter chars \ifnum\paramno=1 \def\xeatspaces##1{##1}% % This removes the pair of braces around the argument. We don't % use \eatspaces, because this can cause ends of lines to be lost % when the argument to \eatspaces is read, leading to line-based % commands like "@itemize" not being read correctly. \else \let\xeatspaces\relax % suppress expansion \fi \ifcase\paramno % 0 \expandafter\xdef\csname\the\macname\endcsname{% \bgroup \noexpand\spaceisspace \noexpand\endlineisspace \noexpand\expandafter % skip any whitespace after the macro name. \expandafter\noexpand\csname\the\macname @@@\endcsname}% \expandafter\xdef\csname\the\macname @@@\endcsname{% \egroup \noexpand\scanmacro{\macrobody}}% \or % 1 \expandafter\xdef\csname\the\macname\endcsname{% \bgroup \noexpand\braceorline \expandafter\noexpand\csname\the\macname @@@\endcsname}% \expandafter\xdef\csname\the\macname @@@\endcsname##1{% \egroup \noexpand\scanmacro{\macrobody}% }% \else % at most 9 \ifnum\paramno<10\relax % @MACNAME sets the context for reading the macro argument % @MACNAME@@ gets the argument, processes backslashes and appends a % comma. % @MACNAME@@@ removes braces surrounding the argument list. % @MACNAME@@@@ scans the macro body with arguments substituted. \expandafter\xdef\csname\the\macname\endcsname{% \bgroup \noexpand\expandafter % This \expandafter skip any spaces after the \noexpand\macroargctxt % macro before we change the catcode of space. \noexpand\expandafter \expandafter\noexpand\csname\the\macname @@\endcsname}% \expandafter\xdef\csname\the\macname @@\endcsname##1{% \noexpand\passargtomacro \expandafter\noexpand\csname\the\macname @@@\endcsname{##1,}}% \expandafter\xdef\csname\the\macname @@@\endcsname##1{% \expandafter\noexpand\csname\the\macname @@@@\endcsname ##1}% \expandafter\expandafter \expandafter\xdef \expandafter\expandafter \csname\the\macname @@@@\endcsname\paramlist{% \egroup\noexpand\scanmacro{\macrobody}}% \else % 10 or more: \expandafter\xdef\csname\the\macname\endcsname{% \noexpand\getargvals@{\the\macname}{\argl}% }% \global\expandafter\let\csname mac.\the\macname .body\endcsname\macrobody \global\expandafter\let\csname mac.\the\macname .recurse\endcsname\gobble \fi \fi} \catcode `\@\texiatcatcode\relax % end private-to-Texinfo catcodes \def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % {\catcode`\@=0 \catcode`\\=13 % We need to manipulate \ so use @ as escape @catcode`@_=11 % private names @catcode`@!=11 % used as argument separator % \passargtomacro#1#2 - % Call #1 with a list of tokens #2, with any doubled backslashes in #2 % compressed to one. % % This implementation works by expansion, and not execution (so we cannot use % \def or similar). This reduces the risk of this failing in contexts where % complete expansion is done with no execution (for example, in writing out to % an auxiliary file for an index entry). % % State is kept in the input stream: the argument passed to % @look_ahead, @gobble_and_check_finish and @add_segment is % % THE_MACRO ARG_RESULT ! {PENDING_BS} NEXT_TOKEN (... rest of input) % % where: % THE_MACRO - name of the macro we want to call % ARG_RESULT - argument list we build to pass to that macro % PENDING_BS - either a backslash or nothing % NEXT_TOKEN - used to look ahead in the input stream to see what's coming next @gdef@passargtomacro#1#2{% @add_segment #1!{}@relax#2\@_finish\% } @gdef@_finish{@_finishx} @global@let@_finishx@relax % #1 - THE_MACRO ARG_RESULT % #2 - PENDING_BS % #3 - NEXT_TOKEN % #4 used to look ahead % % If the next token is not a backslash, process the rest of the argument; % otherwise, remove the next token. @gdef@look_ahead#1!#2#3#4{% @ifx#4\% @expandafter@gobble_and_check_finish @else @expandafter@add_segment @fi#1!{#2}#4#4% } % #1 - THE_MACRO ARG_RESULT % #2 - PENDING_BS % #3 - NEXT_TOKEN % #4 should be a backslash, which is gobbled. % #5 looks ahead % % Double backslash found. Add a single backslash, and look ahead. @gdef@gobble_and_check_finish#1!#2#3#4#5{% @add_segment#1\!{}#5#5% } @gdef@is_fi{@fi} % #1 - THE_MACRO ARG_RESULT % #2 - PENDING_BS % #3 - NEXT_TOKEN % #4 is input stream until next backslash % % Input stream is either at the start of the argument, or just after a % backslash sequence, either a lone backslash, or a doubled backslash. % NEXT_TOKEN contains the first token in the input stream: if it is \finish, % finish; otherwise, append to ARG_RESULT the segment of the argument up until % the next backslash. PENDING_BACKSLASH contains a backslash to represent % a backslash just before the start of the input stream that has not been % added to ARG_RESULT. @gdef@add_segment#1!#2#3#4\{% @ifx#3@_finish @call_the_macro#1!% @else % append the pending backslash to the result, followed by the next segment @expandafter@is_fi@look_ahead#1#2#4!{\}@fi % this @fi is discarded by @look_ahead. % we can't get rid of it with \expandafter because we don't know how % long #4 is. } % #1 - THE_MACRO % #2 - ARG_RESULT % #3 discards the res of the conditional in @add_segment, and @is_fi ends the % conditional. @gdef@call_the_macro#1#2!#3@fi{@is_fi #1{#2}} } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \braceorline MAC is used for a one-argument macro MAC. It checks % whether the next non-whitespace character is a {. It sets the context % for reading the argument (slightly different in the two cases). Then, % to read the argument, in the whole-line case, it then calls the regular % \parsearg MAC; in the lbrace case, it calls \passargtomacro MAC. % \def\braceorline#1{\let\macnamexxx=#1\futurelet\nchar\braceorlinexxx} \def\braceorlinexxx{% \ifx\nchar\bgroup \macroargctxt \expandafter\passargtomacro \else \macrolineargctxt\expandafter\parsearg \fi \macnamexxx} % @alias. % We need some trickery to remove the optional spaces around the equal % sign. Make them active and then expand them all to nothing. % \def\alias{\parseargusing\obeyspaces\aliasxxx} \def\aliasxxx #1{\aliasyyy#1\relax} \def\aliasyyy #1=#2\relax{% {% \expandafter\let\obeyedspace=\empty \addtomacrolist{#1}% \xdef\next{\global\let\makecsname{#1}=\makecsname{#2}}% }% \next } \message{cross references,} \newwrite\auxfile \newif\ifhavexrefs % True if xref values are known. \newif\ifwarnedxrefs % True if we warned once that they aren't known. % @inforef is relatively simple. \def\inforef #1{\inforefzzz #1,,,,**} \def\inforefzzz #1,#2,#3,#4**{% \putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}}, node \samp{\ignorespaces#1{}}} % @node's only job in TeX is to define \lastnode, which is used in % cross-references. The @node line might or might not have commas, and % might or might not have spaces before the first comma, like: % @node foo , bar , ... % We don't want such trailing spaces in the node name. % \parseargdef\node{\checkenv{}\donode #1 ,\finishnodeparse} % % also remove a trailing comma, in case of something like this: % @node Help-Cross, , , Cross-refs \def\donode#1 ,#2\finishnodeparse{\dodonode #1,\finishnodeparse} \def\dodonode#1,#2\finishnodeparse{\gdef\lastnode{#1}\omittopnode} % Used so that the @top node doesn't have to be wrapped in an @ifnottex % conditional. % \doignore goes to more effort to skip nested conditionals but we don't need % that here. \def\omittopnode{% \ifx\lastnode\wordTop \expandafter\ignorenode\fi } \def\wordTop{Top} % Until the next @node or @bye command, divert output to a box that is not % output. \def\ignorenode{\setbox\dummybox\vbox\bgroup\def\node{\egroup\node}% \ignorenodebye } {\let\bye\relax \gdef\ignorenodebye{\let\bye\ignorenodebyedef} \gdef\ignorenodebyedef{\egroup(`Top' node ignored)\bye}} % The redefinition of \bye here is because it is declared \outer \let\lastnode=\empty % Write a cross-reference definition for the current node. #1 is the % type (Ynumbered, Yappendix, Ynothing). % \def\donoderef#1{% \ifx\lastnode\empty\else \setref{\lastnode}{#1}% \global\let\lastnode=\empty \fi } % @anchor{NAME} -- define xref target at arbitrary point. % \newcount\savesfregister % \def\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi} \def\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi} \def\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces} % \setref{NAME}{SNT} defines a cross-reference point NAME (a node or an % anchor), which consists of three parts: % 1) NAME-title - the current sectioning name taken from \currentsection, % or the anchor name. % 2) NAME-snt - section number and type, passed as the SNT arg, or % empty for anchors. % 3) NAME-pg - the page number. % % This is called from \donoderef, \anchor, and \dofloat. In the case of % floats, there is an additional part, which is not written here: % 4) NAME-lof - the text as it should appear in a @listoffloats. % \def\setref#1#2{% \pdfmkdest{#1}% \iflinks {% \requireauxfile \atdummies % preserve commands, but don't expand them % match definition in \xrdef, \refx, \xrefX. \def\value##1{##1}% \edef\writexrdef##1##2{% \write\auxfile{@xrdef{#1-% #1 of \setref, expanded by the \edef ##1}{##2}}% these are parameters of \writexrdef }% \toks0 = \expandafter{\currentsection}% \immediate \writexrdef{title}{\the\toks0 }% \immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc. \safewhatsit{\writexrdef{pg}{\folio}}% will be written later, at \shipout }% \fi } % @xrefautosectiontitle on|off says whether @section(ing) names are used % automatically in xrefs, if the third arg is not explicitly specified. % This was provided as a "secret" @set xref-automatic-section-title % variable, now it's official. % \parseargdef\xrefautomaticsectiontitle{% \def\temp{#1}% \ifx\temp\onword \expandafter\let\csname SETxref-automatic-section-title\endcsname = \empty \else\ifx\temp\offword \expandafter\let\csname SETxref-automatic-section-title\endcsname = \relax \else \errhelp = \EMsimple \errmessage{Unknown @xrefautomaticsectiontitle value `\temp', must be on|off}% \fi\fi } % % @xref, @pxref, and @ref generate cross-references. For \xrefX, #1 is % the node name, #2 the name of the Info cross-reference, #3 the printed % node name, #4 the name of the Info file, #5 the name of the printed % manual. All but the node name can be omitted. % \def\pxref{\putwordsee{} \xrefXX} \def\xref{\putwordSee{} \xrefXX} \def\ref{\xrefXX} \def\xrefXX#1{\def\xrefXXarg{#1}\futurelet\tokenafterxref\xrefXXX} \def\xrefXXX{\expandafter\xrefX\expandafter[\xrefXXarg,,,,,,,]} % \newbox\toprefbox \newbox\printedrefnamebox \newbox\infofilenamebox \newbox\printedmanualbox % \def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup \unsepspaces % % Get args without leading/trailing spaces. \def\printedrefname{\ignorespaces #3}% \setbox\printedrefnamebox = \hbox{\printedrefname\unskip}% % \def\infofilename{\ignorespaces #4}% \setbox\infofilenamebox = \hbox{\infofilename\unskip}% % \def\printedmanual{\ignorespaces #5}% \setbox\printedmanualbox = \hbox{\printedmanual\unskip}% % % If the printed reference name (arg #3) was not explicitly given in % the @xref, figure out what we want to use. \ifdim \wd\printedrefnamebox = 0pt % No printed node name was explicitly given. \expandafter\ifx\csname SETxref-automatic-section-title\endcsname \relax % Not auto section-title: use node name inside the square brackets. \def\printedrefname{\ignorespaces #1}% \else % Auto section-title: use chapter/section title inside % the square brackets if we have it. \ifdim \wd\printedmanualbox > 0pt % It is in another manual, so we don't have it; use node name. \def\printedrefname{\ignorespaces #1}% \else \ifhavexrefs % We (should) know the real title if we have the xref values. \def\printedrefname{\refx{#1-title}}% \else % Otherwise just copy the Info node name. \def\printedrefname{\ignorespaces #1}% \fi% \fi \fi \fi % % Make link in pdf output. \ifpdf % For pdfTeX and LuaTeX {\indexnofonts \makevalueexpandable \turnoffactive % This expands tokens, so do it after making catcode changes, so _ % etc. don't get their TeX definitions. This ignores all spaces in % #4, including (wrongly) those in the middle of the filename. \getfilename{#4}% % % This (wrongly) does not take account of leading or trailing % spaces in #1, which should be ignored. \setpdfdestname{#1}% % \ifx\pdfdestname\empty \def\pdfdestname{Top}% no empty targets \fi % \leavevmode \startlink attr{/Border [0 0 0]}% \ifnum\filenamelength>0 goto file{\the\filename.pdf} name{\pdfdestname}% \else goto name{\pdfmkpgn{\pdfdestname}}% \fi }% \setcolor{\linkcolor}% \else \ifx\XeTeXrevision\thisisundefined \else % For XeTeX {\indexnofonts \makevalueexpandable \turnoffactive % This expands tokens, so do it after making catcode changes, so _ % etc. don't get their TeX definitions. This ignores all spaces in % #4, including (wrongly) those in the middle of the filename. \getfilename{#4}% % % This (wrongly) does not take account of leading or trailing % spaces in #1, which should be ignored. \setpdfdestname{#1}% % \ifx\pdfdestname\empty \def\pdfdestname{Top}% no empty targets \fi % \leavevmode \ifnum\filenamelength>0 % With default settings, % XeTeX (xdvipdfmx) replaces link destination names with integers. % In this case, the replaced destination names of % remote PDFs are no longer known. In order to avoid a replacement, % you can use xdvipdfmx's command line option `-C 0x0010'. % If you use XeTeX 0.99996+ (TeX Live 2016+), % this command line option is no longer necessary % because we can use the `dvipdfmx:config' special. \special{pdf:bann << /Border [0 0 0] /Type /Annot /Subtype /Link /A << /S /GoToR /F (\the\filename.pdf) /D (\pdfdestname) >> >>}% \else \special{pdf:bann << /Border [0 0 0] /Type /Annot /Subtype /Link /A << /S /GoTo /D (\pdfdestname) >> >>}% \fi }% \setcolor{\linkcolor}% \fi \fi {% % Have to otherify everything special to allow the \csname to % include an _ in the xref name, etc. \indexnofonts \turnoffactive \def\value##1{##1}% \expandafter\global\expandafter\let\expandafter\Xthisreftitle \csname XR#1-title\endcsname }% % % Float references are printed completely differently: "Figure 1.2" % instead of "[somenode], p.3". \iffloat distinguishes them by % \Xthisreftitle being set to a magic string. \iffloat\Xthisreftitle % If the user specified the print name (third arg) to the ref, % print it instead of our usual "Figure 1.2". \ifdim\wd\printedrefnamebox = 0pt \refx{#1-snt}% \else \printedrefname \fi % % If the user also gave the printed manual name (fifth arg), append % "in MANUALNAME". \ifdim \wd\printedmanualbox > 0pt \space \putwordin{} \cite{\printedmanual}% \fi \else % node/anchor (non-float) references. % % If we use \unhbox to print the node names, TeX does not insert % empty discretionaries after hyphens, which means that it will not % find a line break at a hyphen in a node names. Since some manuals % are best written with fairly long node names, containing hyphens, % this is a loss. Therefore, we give the text of the node name % again, so it is as if TeX is seeing it for the first time. % \ifdim \wd\printedmanualbox > 0pt % Cross-manual reference with a printed manual name. % \crossmanualxref{\cite{\printedmanual\unskip}}% % \else\ifdim \wd\infofilenamebox > 0pt % Cross-manual reference with only an info filename (arg 4), no % printed manual name (arg 5). This is essentially the same as % the case above; we output the filename, since we have nothing else. % \crossmanualxref{\code{\infofilename\unskip}}% % \else % Reference within this manual. % % Only output a following space if the -snt ref is nonempty, as the ref % will be empty for @unnumbered and @anchor. \setbox2 = \hbox{\ignorespaces \refx{#1-snt}}% \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi % % output the `[mynode]' via the macro below so it can be overridden. \xrefprintnodename\printedrefname % \expandafter\ifx\csname SETtxiomitxrefpg\endcsname\relax % But we always want a comma and a space: ,\space % % output the `page 3'. \turnoffactive \putwordpage\tie\refx{#1-pg}% % Add a , if xref followed by a space \if\space\noexpand\tokenafterxref ,% \else\ifx\ \tokenafterxref ,% @TAB \else\ifx\*\tokenafterxref ,% @* \else\ifx\ \tokenafterxref ,% @SPACE \else\ifx\ \tokenafterxref ,% @NL \else\ifx\tie\tokenafterxref ,% @tie \fi\fi\fi\fi\fi\fi \fi \fi\fi \fi \endlink \endgroup} % Output a cross-manual xref to #1. Used just above (twice). % % Only include the text "Section ``foo'' in" if the foo is neither % missing or Top. Thus, @xref{,,,foo,The Foo Manual} outputs simply % "see The Foo Manual", the idea being to refer to the whole manual. % % But, this being TeX, we can't easily compare our node name against the % string "Top" while ignoring the possible spaces before and after in % the input. By adding the arbitrary 7sp below, we make it much less % likely that a real node name would have the same width as "Top" (e.g., % in a monospaced font). Hopefully it will never happen in practice. % % For the same basic reason, we retypeset the "Top" at every % reference, since the current font is indeterminate. % \def\crossmanualxref#1{% \setbox\toprefbox = \hbox{Top\kern7sp}% \setbox2 = \hbox{\ignorespaces \printedrefname \unskip \kern7sp}% \ifdim \wd2 > 7sp % nonempty? \ifdim \wd2 = \wd\toprefbox \else % same as Top? \putwordSection{} ``\printedrefname'' \putwordin{}\space \fi \fi #1% } % This macro is called from \xrefX for the `[nodename]' part of xref % output. It's a separate macro only so it can be changed more easily, % since square brackets don't work well in some documents. Particularly % one that Bob is working on :). % \def\xrefprintnodename#1{[#1]} % Things referred to by \setref. % \def\Ynothing{} \def\Yomitfromtoc{} \def\Ynumbered{% \ifnum\secno=0 \putwordChapter@tie \the\chapno \else \ifnum\subsecno=0 \putwordSection@tie \the\chapno.\the\secno \else \ifnum\subsubsecno=0 \putwordSection@tie \the\chapno.\the\secno.\the\subsecno \else \putwordSection@tie \the\chapno.\the\secno.\the\subsecno.\the\subsubsecno \fi\fi\fi } \def\Yappendix{% \ifnum\secno=0 \putwordAppendix@tie @char\the\appendixno{}% \else \ifnum\subsecno=0 \putwordSection@tie @char\the\appendixno.\the\secno \else \ifnum\subsubsecno=0 \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno \else \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno \fi\fi\fi } % \refx{NAME} - reference a cross-reference string named NAME. \def\refx#1{% \requireauxfile {% \indexnofonts \turnoffactive \def\value##1{##1}% \expandafter\global\expandafter\let\expandafter\thisrefX \csname XR#1\endcsname }% \ifx\thisrefX\relax % If not defined, say something at least. \angleleft un\-de\-fined\angleright \iflinks \ifhavexrefs {\toks0 = {#1}% avoid expansion of possibly-complex value \message{\linenumber Undefined cross reference `\the\toks0'.}}% \else \ifwarnedxrefs\else \global\warnedxrefstrue \message{Cross reference values unknown; you must run TeX again.}% \fi \fi \fi \else % It's defined, so just use it. \thisrefX \fi } % This is the macro invoked by entries in the aux file. Define a control % sequence for a cross-reference target (we prepend XR to the control sequence % name to avoid collisions). The value is the page number. If this is a float % type, we have more work to do. % \def\xrdef#1#2{% {% Expand the node or anchor name to remove control sequences. % \turnoffactive stops 8-bit characters being changed to commands % like @'e. \refx does the same to retrieve the value in the definition. \indexnofonts \turnoffactive \def\value##1{##1}% \xdef\safexrefname{#1}% }% % \bgroup \expandafter\gdef\csname XR\safexrefname\endcsname{#2}% \egroup % We put the \gdef inside a group to avoid the definitions building up on % TeX's save stack, which can cause it to run out of space for aux files with % thousands of lines. \gdef doesn't use the save stack, but \csname does % when it defines an unknown control sequence as \relax. % % Was that xref control sequence that we just defined for a float? \expandafter\iffloat\csname XR\safexrefname\endcsname % it was a float, and we have the (safe) float type in \iffloattype. \expandafter\let\expandafter\floatlist \csname floatlist\iffloattype\endcsname % % Is this the first time we've seen this float type? \expandafter\ifx\floatlist\relax \toks0 = {\do}% yes, so just \do \else % had it before, so preserve previous elements in list. \toks0 = \expandafter{\floatlist\do}% \fi % % Remember this xref in the control sequence \floatlistFLOATTYPE, % for later use in \listoffloats. \expandafter\xdef\csname floatlist\iffloattype\endcsname{\the\toks0 {\safexrefname}}% \fi } % If working on a large document in chapters, it is convenient to % be able to disable indexing, cross-referencing, and contents, for test runs. % This is done with @novalidate at the beginning of the file. % \newif\iflinks \linkstrue % by default we want the aux files. \let\novalidate = \linksfalse % Used when writing to the aux file, or when using data from it. \def\requireauxfile{% \iflinks \tryauxfile % Open the new aux file. TeX will close it automatically at exit. \immediate\openout\auxfile=\jobname.aux \fi \global\let\requireauxfile=\relax % Only do this once. } % Read the last existing aux file, if any. No error if none exists. % \def\tryauxfile{% \openin 1 \jobname.aux \ifeof 1 \else \readdatafile{aux}% \global\havexrefstrue \fi \closein 1 } \def\setupdatafile{% \catcode`\^^@=\other \catcode`\^^A=\other \catcode`\^^B=\other \catcode`\^^C=\other \catcode`\^^D=\other \catcode`\^^E=\other \catcode`\^^F=\other \catcode`\^^G=\other \catcode`\^^H=\other \catcode`\^^K=\other \catcode`\^^L=\other \catcode`\^^N=\other \catcode`\^^P=\other \catcode`\^^Q=\other \catcode`\^^R=\other \catcode`\^^S=\other \catcode`\^^T=\other \catcode`\^^U=\other \catcode`\^^V=\other \catcode`\^^W=\other \catcode`\^^X=\other \catcode`\^^Z=\other \catcode`\^^[=\other \catcode`\^^\=\other \catcode`\^^]=\other \catcode`\^^^=\other \catcode`\^^_=\other \catcode`\^=\other % % Special characters. Should be turned off anyway, but... \catcode`\~=\other \catcode`\[=\other \catcode`\]=\other \catcode`\"=\other \catcode`\_=\active \catcode`\|=\active \catcode`\<=\active \catcode`\>=\active \catcode`\$=\other \catcode`\#=\other \catcode`\&=\other \catcode`\%=\other \catcode`+=\other % avoid \+ for paranoia even though we've turned it off % \catcode`\\=\active % % @ is our escape character in .aux files, and we need braces. \catcode`\{=1 \catcode`\}=2 \catcode`\@=0 } \def\readdatafile#1{% \begingroup \setupdatafile \input\jobname.#1 \endgroup} \message{insertions,} % including footnotes. \newcount \footnoteno % The trailing space in the following definition for supereject is % vital for proper filling; pages come out unaligned when you do a % pagealignmacro call if that space before the closing brace is % removed. (Generally, numeric constants should always be followed by a % space to prevent strange expansion errors.) \def\supereject{\par\penalty -20000\footnoteno =0 } % @footnotestyle is meaningful for Info output only. \let\footnotestyle=\comment {\catcode `\@=11 % % Auto-number footnotes. Otherwise like plain. \gdef\footnote{% \global\advance\footnoteno by \@ne \edef\thisfootno{$^{\the\footnoteno}$}% % % In case the footnote comes at the end of a sentence, preserve the % extra spacing after we do the footnote number. \let\@sf\empty \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\ptexslash\fi % % Remove inadvertent blank space before typesetting the footnote number. \unskip \thisfootno\@sf \dofootnote }% % Don't bother with the trickery in plain.tex to not require the % footnote text as a parameter. Our footnotes don't need to be so general. % % Oh yes, they do; otherwise, @ifset (and anything else that uses % \parseargline) fails inside footnotes because the tokens are fixed when % the footnote is read. --karl, 16nov96. % \gdef\dofootnote{% \insert\footins\bgroup % % Nested footnotes are not supported in TeX, that would take a lot % more work. (\startsavinginserts does not suffice.) \let\footnote=\errfootnotenest % % We want to typeset this text as a normal paragraph, even if the % footnote reference occurs in (for example) a display environment. % So reset some parameters. \hsize=\txipagewidth \interlinepenalty\interfootnotelinepenalty \splittopskip\ht\strutbox % top baseline for broken footnotes \splitmaxdepth\dp\strutbox \floatingpenalty\@MM \leftskip\z@skip \rightskip\z@skip \spaceskip\z@skip \xspaceskip\z@skip \parindent\defaultparindent % \smallfonts \rm % % Because we use hanging indentation in footnotes, a @noindent appears % to exdent this text, so make it be a no-op. makeinfo does not use % hanging indentation so @noindent can still be needed within footnote % text after an @example or the like (not that this is good style). \let\noindent = \relax % % Hang the footnote text off the number. Use \everypar in case the % footnote extends for more than one paragraph. \everypar = {\hang}% \textindent{\thisfootno}% % % Don't crash into the line above the footnote text. Since this % expands into a box, it must come within the paragraph, lest it % provide a place where TeX can split the footnote. \footstrut % % Invoke rest of plain TeX footnote routine. \futurelet\next\fo@t } }%end \catcode `\@=11 \def\errfootnotenest{% \errhelp=\EMsimple \errmessage{Nested footnotes not supported in texinfo.tex, even though they work in makeinfo; sorry} } \def\errfootnoteheading{% \errhelp=\EMsimple \errmessage{Footnotes in chapters, sections, etc., are not supported} } % In case a @footnote appears in a vbox, save the footnote text and create % the real \insert just after the vbox finished. Otherwise, the insertion % would be lost. % Similarly, if a @footnote appears inside an alignment, save the footnote % text to a box and make the \insert when a row of the table is finished. % And the same can be done for other insert classes. --kasal, 16nov03. % % Replace the \insert primitive by a cheating macro. % Deeper inside, just make sure that the saved insertions are not spilled % out prematurely. % \def\startsavinginserts{% \ifx \insert\ptexinsert \let\insert\saveinsert \else \let\checkinserts\relax \fi } % This \insert replacement works for both \insert\footins{foo} and % \insert\footins\bgroup foo\egroup, but it doesn't work for \insert27{foo}. % \def\saveinsert#1{% \edef\next{\noexpand\savetobox \makeSAVEname#1}% \afterassignment\next % swallow the left brace \let\temp = } \def\makeSAVEname#1{\makecsname{SAVE\expandafter\gobble\string#1}} \def\savetobox#1{\global\setbox#1 = \vbox\bgroup \unvbox#1} \def\checksaveins#1{\ifvoid#1\else \placesaveins#1\fi} \def\placesaveins#1{% \ptexinsert \csname\expandafter\gobblesave\string#1\endcsname {\box#1}% } % eat @SAVE -- beware, all of them have catcode \other: { \def\dospecials{\do S\do A\do V\do E} \uncatcodespecials % ;-) \gdef\gobblesave @SAVE{} } % initialization: \def\newsaveins #1{% \edef\next{\noexpand\newsaveinsX \makeSAVEname#1}% \next } \def\newsaveinsX #1{% \csname newbox\endcsname #1% \expandafter\def\expandafter\checkinserts\expandafter{\checkinserts \checksaveins #1}% } % initialize: \let\checkinserts\empty \newsaveins\footins \newsaveins\margin % @image. We use the macros from epsf.tex to support this. % If epsf.tex is not installed and @image is used, we complain. % % Check for and read epsf.tex up front. If we read it only at @image % time, we might be inside a group, and then its definitions would get % undone and the next image would fail. \openin 1 = epsf.tex \ifeof 1 \else % Do not bother showing banner with epsf.tex v2.7k (available in % doc/epsf.tex and on ctan). \def\epsfannounce{\toks0 = }% \input epsf.tex \fi \closein 1 % % We will only complain once about lack of epsf.tex. \newif\ifwarnednoepsf \newhelp\noepsfhelp{epsf.tex must be installed for images to work. It is also included in the Texinfo distribution, or you can get it from https://ctan.org/texarchive/macros/texinfo/texinfo/doc/epsf.tex.} % \def\image#1{% \ifx\epsfbox\thisisundefined \ifwarnednoepsf \else \errhelp = \noepsfhelp \errmessage{epsf.tex not found, images will be ignored}% \global\warnednoepsftrue \fi \else \imagexxx #1,,,,,\finish \fi } % % Arguments to @image: % #1 is (mandatory) image filename; we tack on .eps extension. % #2 is (optional) width, #3 is (optional) height. % #4 is (ignored optional) html alt text. % #5 is (ignored optional) extension. % #6 is just the usual extra ignored arg for parsing stuff. \newif\ifimagevmode \def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup \catcode`\^^M = 5 % in case we're inside an example \normalturnoffactive % allow _ et al. in names \makevalueexpandable % If the image is by itself, center it. \ifvmode \imagevmodetrue \else \ifx\centersub\centerV % for @center @image, we need a vbox so we can have our vertical space \imagevmodetrue \vbox\bgroup % vbox has better behavior than vtop herev \fi\fi % \ifimagevmode \medskip % Usually we'll have text after the image which will insert % \parskip glue, so insert it here too to equalize the space % above and below. \nobreak\vskip\parskip \nobreak \fi % % Leave vertical mode so that indentation from an enclosing % environment such as @quotation is respected. % However, if we're at the top level, we don't want the % normal paragraph indentation. % On the other hand, if we are in the case of @center @image, we don't % want to start a paragraph, which will create a hsize-width box and % eradicate the centering. \ifx\centersub\centerV \else \imageindent \fi % % Output the image. \ifpdf % For pdfTeX and LuaTeX <= 0.80 \dopdfimage{#1}{#2}{#3}% \else \ifx\XeTeXrevision\thisisundefined % For epsf.tex % \epsfbox itself resets \epsf?size at each figure. \setbox0 = \hbox{\ignorespaces #2}% \ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi \setbox0 = \hbox{\ignorespaces #3}% \ifdim\wd0 > 0pt \epsfysize=#3\relax \fi \epsfbox{#1.eps}% \else % For XeTeX \doxeteximage{#1}{#2}{#3}% \fi \fi % \ifimagevmode \medskip % space after a standalone image \fi \ifx\centersub\centerV \egroup \fi \endgroup} % @float FLOATTYPE,LABEL,LOC ... @end float for displayed figures, tables, % etc. We don't actually implement floating yet, we always include the % float "here". But it seemed the best name for the future. % \envparseargdef\float{\eatcommaspace\eatcommaspace\dofloat#1, , ,\finish} % There may be a space before second and/or third parameter; delete it. \def\eatcommaspace#1, {#1,} % #1 is the optional FLOATTYPE, the text label for this float, typically % "Figure", "Table", "Example", etc. Can't contain commas. If omitted, % this float will not be numbered and cannot be referred to. % % #2 is the optional xref label. Also must be present for the float to % be referable. % % #3 is the optional positioning argument; for now, it is ignored. It % will somehow specify the positions allowed to float to (here, top, bottom). % % We keep a separate counter for each FLOATTYPE, which we reset at each % chapter-level command. \let\resetallfloatnos=\empty % \def\dofloat#1,#2,#3,#4\finish{% \let\thiscaption=\empty \let\thisshortcaption=\empty % % don't lose footnotes inside @float. % % BEWARE: when the floats start float, we have to issue warning whenever an % insert appears inside a float which could possibly float. --kasal, 26may04 % \startsavinginserts % % We can't be used inside a paragraph. \par % \vtop\bgroup \def\floattype{#1}% \def\floatlabel{#2}% \def\floatloc{#3}% we do nothing with this yet. % \ifx\floattype\empty \let\safefloattype=\empty \else {% % the floattype might have accents or other special characters, % but we need to use it in a control sequence name. \indexnofonts \turnoffactive \xdef\safefloattype{\floattype}% }% \fi % % If label is given but no type, we handle that as the empty type. \ifx\floatlabel\empty \else % We want each FLOATTYPE to be numbered separately (Figure 1, % Table 1, Figure 2, ...). (And if no label, no number.) % \expandafter\getfloatno\csname\safefloattype floatno\endcsname \global\advance\floatno by 1 % {% % This magic value for \currentsection is output by \setref as the % XREFLABEL-title value. \xrefX uses it to distinguish float % labels (which have a completely different output format) from % node and anchor labels. And \xrdef uses it to construct the % lists of floats. % \edef\currentsection{\floatmagic=\safefloattype}% \setref{\floatlabel}{Yfloat}% }% \fi % % start with \parskip glue, I guess. \vskip\parskip % % Don't suppress indentation if a float happens to start a section. \restorefirstparagraphindent } % we have these possibilities: % @float Foo,lbl & @caption{Cap}: Foo 1.1: Cap % @float Foo,lbl & no caption: Foo 1.1 % @float Foo & @caption{Cap}: Foo: Cap % @float Foo & no caption: Foo % @float ,lbl & Caption{Cap}: 1.1: Cap % @float ,lbl & no caption: 1.1 % @float & @caption{Cap}: Cap % @float & no caption: % \def\Efloat{% \let\floatident = \empty % % In all cases, if we have a float type, it comes first. \ifx\floattype\empty \else \def\floatident{\floattype}\fi % % If we have an xref label, the number comes next. \ifx\floatlabel\empty \else \ifx\floattype\empty \else % if also had float type, need tie first. \appendtomacro\floatident{\tie}% \fi % the number. \appendtomacro\floatident{\chaplevelprefix\the\floatno}% \fi % % Start the printed caption with what we've constructed in % \floatident, but keep it separate; we need \floatident again. \let\captionline = \floatident % \ifx\thiscaption\empty \else \ifx\floatident\empty \else \appendtomacro\captionline{: }% had ident, so need a colon between \fi % % caption text. \appendtomacro\captionline{\scanexp\thiscaption}% \fi % % If we have anything to print, print it, with space before. % Eventually this needs to become an \insert. \ifx\captionline\empty \else \vskip.5\parskip \captionline % % Space below caption. \vskip\parskip \fi % % If have an xref label, write the list of floats info. Do this % after the caption, to avoid chance of it being a breakpoint. \ifx\floatlabel\empty \else % Write the text that goes in the lof to the aux file as % \floatlabel-lof. Besides \floatident, we include the short % caption if specified, else the full caption if specified, else nothing. {% \requireauxfile \atdummies % \ifx\thisshortcaption\empty \def\gtemp{\thiscaption}% \else \def\gtemp{\thisshortcaption}% \fi \immediate\write\auxfile{@xrdef{\floatlabel-lof}{\floatident \ifx\gtemp\empty \else : \gtemp \fi}}% }% \fi \egroup % end of \vtop % \checkinserts } % Append the tokens #2 to the definition of macro #1, not expanding either. % \def\appendtomacro#1#2{% \expandafter\def\expandafter#1\expandafter{#1#2}% } % @caption, @shortcaption % \def\caption{\docaption\thiscaption} \def\shortcaption{\docaption\thisshortcaption} \def\docaption{\checkenv\float \bgroup\scanargctxt\defcaption} \def\defcaption#1#2{\egroup \def#1{#2}} % The parameter is the control sequence identifying the counter we are % going to use. Create it if it doesn't exist and assign it to \floatno. \def\getfloatno#1{% \ifx#1\relax % Haven't seen this figure type before. \csname newcount\endcsname #1% % % Remember to reset this floatno at the next chap. \expandafter\gdef\expandafter\resetallfloatnos \expandafter{\resetallfloatnos #1=0 }% \fi \let\floatno#1% } % \setref calls this to get the XREFLABEL-snt value. We want an @xref % to the FLOATLABEL to expand to "Figure 3.1". We call \setref when we % first read the @float command. % \def\Yfloat{\floattype@tie \chaplevelprefix\the\floatno}% % Magic string used for the XREFLABEL-title value, so \xrefX can % distinguish floats from other xref types. \def\floatmagic{!!float!!} % #1 is the control sequence we are passed; we expand into a conditional % which is true if #1 represents a float ref. That is, the magic % \currentsection value which we \setref above. % \def\iffloat#1{\expandafter\doiffloat#1==\finish} % % #1 is (maybe) the \floatmagic string. If so, #2 will be the % (safe) float type for this float. We set \iffloattype to #2. % \def\doiffloat#1=#2=#3\finish{% \def\temp{#1}% \def\iffloattype{#2}% \ifx\temp\floatmagic } % @listoffloats FLOATTYPE - print a list of floats like a table of contents. % \parseargdef\listoffloats{% \def\floattype{#1}% floattype {% % the floattype might have accents or other special characters, % but we need to use it in a control sequence name. \indexnofonts \turnoffactive \xdef\safefloattype{\floattype}% }% % % \xrdef saves the floats as a \do-list in \floatlistSAFEFLOATTYPE. \expandafter\ifx\csname floatlist\safefloattype\endcsname \relax \ifhavexrefs % if the user said @listoffloats foo but never @float foo. \message{\linenumber No `\safefloattype' floats to list.}% \fi \else \begingroup \leftskip=\tocindent % indent these entries like a toc \let\do=\listoffloatsdo \csname floatlist\safefloattype\endcsname \endgroup \fi } % This is called on each entry in a list of floats. We're passed the % xref label, in the form LABEL-title, which is how we save it in the % aux file. We strip off the -title and look up \XRLABEL-lof, which % has the text we're supposed to typeset here. % % Figures without xref labels will not be included in the list (since % they won't appear in the aux file). % \def\listoffloatsdo#1{\listoffloatsdoentry#1\finish} \def\listoffloatsdoentry#1-title\finish{{% % Can't fully expand XR#1-lof because it can contain anything. Just % pass the control sequence. On the other hand, XR#1-pg is just the % page number, and we want to fully expand that so we can get a link % in pdf output. \toksA = \expandafter{\csname XR#1-lof\endcsname}% % % use the same \entry macro we use to generate the TOC and index. \edef\writeentry{\noexpand\entry{\the\toksA}{\csname XR#1-pg\endcsname}}% \writeentry }} \message{localization,} % For single-language documents, @documentlanguage is usually given very % early, just after @documentencoding. Single argument is the language % (de) or locale (de_DE) abbreviation. % { \catcode`\_ = \active \globaldefs=1 \parseargdef\documentlanguage{% \tex % read txi-??.tex file in plain TeX. % Read the file by the name they passed if it exists. \let_ = \normalunderscore % normal _ character for filename test \openin 1 txi-#1.tex \ifeof 1 \documentlanguagetrywithoutunderscore #1_\finish \else \globaldefs = 1 % everything in the txi-LL files needs to persist \input txi-#1.tex \fi \closein 1 \endgroup % end raw TeX } % % If they passed de_DE, and txi-de_DE.tex doesn't exist, % try txi-de.tex. % \gdef\documentlanguagetrywithoutunderscore#1_#2\finish{% \openin 1 txi-#1.tex \ifeof 1 \errhelp = \nolanghelp \errmessage{Cannot read language file txi-#1.tex}% \else \globaldefs = 1 % everything in the txi-LL files needs to persist \input txi-#1.tex \fi \closein 1 } }% end of special _ catcode % \newhelp\nolanghelp{The given language definition file cannot be found or is empty. Maybe you need to install it? Putting it in the current directory should work if nowhere else does.} % This macro is called from txi-??.tex files; the first argument is the % \language name to set (without the "\lang@" prefix), the second and % third args are \{left,right}hyphenmin. % % The language names to pass are determined when the format is built. % See the etex.log file created at that time, e.g., % /usr/local/texlive/2008/texmf-var/web2c/pdftex/etex.log. % % With TeX Live 2008, etex now includes hyphenation patterns for all % available languages. This means we can support hyphenation in % Texinfo, at least to some extent. (This still doesn't solve the % accented characters problem.) % \catcode`@=11 \def\txisetlanguage#1#2#3{% % do not set the language if the name is undefined in the current TeX. \expandafter\ifx\csname lang@#1\endcsname \relax \message{no patterns for #1}% \else \global\language = \csname lang@#1\endcsname \fi % but there is no harm in adjusting the hyphenmin values regardless. \global\lefthyphenmin = #2\relax \global\righthyphenmin = #3\relax } % XeTeX and LuaTeX can handle Unicode natively. % Their default I/O uses UTF-8 sequences instead of a byte-wise operation. % Other TeX engines' I/O (pdfTeX, etc.) is byte-wise. % \newif\iftxinativeunicodecapable \newif\iftxiusebytewiseio \ifx\XeTeXrevision\thisisundefined \ifx\luatexversion\thisisundefined \txinativeunicodecapablefalse \txiusebytewiseiotrue \else \txinativeunicodecapabletrue \txiusebytewiseiofalse \fi \else \txinativeunicodecapabletrue \txiusebytewiseiofalse \fi % Set I/O by bytes instead of UTF-8 sequence for XeTeX and LuaTex % for non-UTF-8 (byte-wise) encodings. % \def\setbytewiseio{% \ifx\XeTeXrevision\thisisundefined \else \XeTeXdefaultencoding "bytes" % For subsequent files to be read \XeTeXinputencoding "bytes" % For document root file % Unfortunately, there seems to be no corresponding XeTeX command for % output encoding. This is a problem for auxiliary index and TOC files. % The only solution would be perhaps to write out @U{...} sequences in % place of non-ASCII characters. \fi \ifx\luatexversion\thisisundefined \else \directlua{ local utf8_char, byte, gsub = unicode.utf8.char, string.byte, string.gsub local function convert_char (char) return utf8_char(byte(char)) end local function convert_line (line) return gsub(line, ".", convert_char) end callback.register("process_input_buffer", convert_line) local function convert_line_out (line) local line_out = "" for c in string.utfvalues(line) do line_out = line_out .. string.char(c) end return line_out end callback.register("process_output_buffer", convert_line_out) } \fi \txiusebytewiseiotrue } % Helpers for encodings. % Set the catcode of characters 128 through 255 to the specified number. % \def\setnonasciicharscatcode#1{% \count255=128 \loop\ifnum\count255<256 \global\catcode\count255=#1\relax \advance\count255 by 1 \repeat } \def\setnonasciicharscatcodenonglobal#1{% \count255=128 \loop\ifnum\count255<256 \catcode\count255=#1\relax \advance\count255 by 1 \repeat } % @documentencoding sets the definition of non-ASCII characters % according to the specified encoding. % \def\documentencoding{\parseargusing\filenamecatcodes\documentencodingzzz} \def\documentencodingzzz#1{% % % Encoding being declared for the document. \def\declaredencoding{\csname #1.enc\endcsname}% % % Supported encodings: names converted to tokens in order to be able % to compare them with \ifx. \def\ascii{\csname US-ASCII.enc\endcsname}% \def\latnine{\csname ISO-8859-15.enc\endcsname}% \def\latone{\csname ISO-8859-1.enc\endcsname}% \def\lattwo{\csname ISO-8859-2.enc\endcsname}% \def\utfeight{\csname UTF-8.enc\endcsname}% % \ifx \declaredencoding \ascii \asciichardefs % \else \ifx \declaredencoding \lattwo \iftxinativeunicodecapable \setbytewiseio \fi \setnonasciicharscatcode\active \lattwochardefs % \else \ifx \declaredencoding \latone \iftxinativeunicodecapable \setbytewiseio \fi \setnonasciicharscatcode\active \latonechardefs % \else \ifx \declaredencoding \latnine \iftxinativeunicodecapable \setbytewiseio \fi \setnonasciicharscatcode\active \latninechardefs % \else \ifx \declaredencoding \utfeight \iftxinativeunicodecapable % For native Unicode handling (XeTeX and LuaTeX) \nativeunicodechardefs \else % For treating UTF-8 as byte sequences (TeX, eTeX and pdfTeX) \setnonasciicharscatcode\active % since we already invoked \utfeightchardefs at the top level % (below), do not re-invoke it, otherwise our check for duplicated % definitions gets triggered. Making non-ascii chars active is % sufficient. \fi % \else \message{Ignoring unknown document encoding: #1.}% % \fi % utfeight \fi % latnine \fi % latone \fi % lattwo \fi % ascii % \ifx\XeTeXrevision\thisisundefined \else \ifx \declaredencoding \utfeight \else \ifx \declaredencoding \ascii \else \message{Warning: XeTeX with non-UTF-8 encodings cannot handle % non-ASCII characters in auxiliary files.}% \fi \fi \fi } % emacs-page % A message to be logged when using a character that isn't available % the default font encoding (OT1). % \def\missingcharmsg#1{\message{Character missing, sorry: #1.}} % Take account of \c (plain) vs. \, (Texinfo) difference. \def\cedilla#1{\ifx\c\ptexc\c{#1}\else\,{#1}\fi} % First, make active non-ASCII characters in order for them to be % correctly categorized when TeX reads the replacement text of % macros containing the character definitions. \setnonasciicharscatcode\active % \def\gdefchar#1#2{% \gdef#1{% \ifpassthroughchars \string#1% \else #2% \fi }} % Latin1 (ISO-8859-1) character definitions. \def\latonechardefs{% \gdefchar^^a0{\tie} \gdefchar^^a1{\exclamdown} \gdefchar^^a2{{\tcfont \char162}} % cent \gdefchar^^a3{\pounds{}} \gdefchar^^a4{{\tcfont \char164}} % currency \gdefchar^^a5{{\tcfont \char165}} % yen \gdefchar^^a6{{\tcfont \char166}} % broken bar \gdefchar^^a7{\S} \gdefchar^^a8{\"{}} \gdefchar^^a9{\copyright{}} \gdefchar^^aa{\ordf} \gdefchar^^ab{\guillemetleft{}} \gdefchar^^ac{\ensuremath\lnot} \gdefchar^^ad{\-} \gdefchar^^ae{\registeredsymbol{}} \gdefchar^^af{\={}} % \gdefchar^^b0{\textdegree} \gdefchar^^b1{$\pm$} \gdefchar^^b2{$^2$} \gdefchar^^b3{$^3$} \gdefchar^^b4{\'{}} \gdefchar^^b5{$\mu$} \gdefchar^^b6{\P} \gdefchar^^b7{\ensuremath\cdot} \gdefchar^^b8{\cedilla\ } \gdefchar^^b9{$^1$} \gdefchar^^ba{\ordm} \gdefchar^^bb{\guillemetright{}} \gdefchar^^bc{$1\over4$} \gdefchar^^bd{$1\over2$} \gdefchar^^be{$3\over4$} \gdefchar^^bf{\questiondown} % \gdefchar^^c0{\`A} \gdefchar^^c1{\'A} \gdefchar^^c2{\^A} \gdefchar^^c3{\~A} \gdefchar^^c4{\"A} \gdefchar^^c5{\ringaccent A} \gdefchar^^c6{\AE} \gdefchar^^c7{\cedilla C} \gdefchar^^c8{\`E} \gdefchar^^c9{\'E} \gdefchar^^ca{\^E} \gdefchar^^cb{\"E} \gdefchar^^cc{\`I} \gdefchar^^cd{\'I} \gdefchar^^ce{\^I} \gdefchar^^cf{\"I} % \gdefchar^^d0{\DH} \gdefchar^^d1{\~N} \gdefchar^^d2{\`O} \gdefchar^^d3{\'O} \gdefchar^^d4{\^O} \gdefchar^^d5{\~O} \gdefchar^^d6{\"O} \gdefchar^^d7{$\times$} \gdefchar^^d8{\O} \gdefchar^^d9{\`U} \gdefchar^^da{\'U} \gdefchar^^db{\^U} \gdefchar^^dc{\"U} \gdefchar^^dd{\'Y} \gdefchar^^de{\TH} \gdefchar^^df{\ss} % \gdefchar^^e0{\`a} \gdefchar^^e1{\'a} \gdefchar^^e2{\^a} \gdefchar^^e3{\~a} \gdefchar^^e4{\"a} \gdefchar^^e5{\ringaccent a} \gdefchar^^e6{\ae} \gdefchar^^e7{\cedilla c} \gdefchar^^e8{\`e} \gdefchar^^e9{\'e} \gdefchar^^ea{\^e} \gdefchar^^eb{\"e} \gdefchar^^ec{\`{\dotless i}} \gdefchar^^ed{\'{\dotless i}} \gdefchar^^ee{\^{\dotless i}} \gdefchar^^ef{\"{\dotless i}} % \gdefchar^^f0{\dh} \gdefchar^^f1{\~n} \gdefchar^^f2{\`o} \gdefchar^^f3{\'o} \gdefchar^^f4{\^o} \gdefchar^^f5{\~o} \gdefchar^^f6{\"o} \gdefchar^^f7{$\div$} \gdefchar^^f8{\o} \gdefchar^^f9{\`u} \gdefchar^^fa{\'u} \gdefchar^^fb{\^u} \gdefchar^^fc{\"u} \gdefchar^^fd{\'y} \gdefchar^^fe{\th} \gdefchar^^ff{\"y} } % Latin9 (ISO-8859-15) encoding character definitions. \def\latninechardefs{% % Encoding is almost identical to Latin1. \latonechardefs % \gdefchar^^a4{\euro{}} \gdefchar^^a6{\v S} \gdefchar^^a8{\v s} \gdefchar^^b4{\v Z} \gdefchar^^b8{\v z} \gdefchar^^bc{\OE} \gdefchar^^bd{\oe} \gdefchar^^be{\"Y} } % Latin2 (ISO-8859-2) character definitions. \def\lattwochardefs{% \gdefchar^^a0{\tie} \gdefchar^^a1{\ogonek{A}} \gdefchar^^a2{\u{}} \gdefchar^^a3{\L} \gdefchar^^a4{\missingcharmsg{CURRENCY SIGN}} \gdefchar^^a5{\v L} \gdefchar^^a6{\'S} \gdefchar^^a7{\S} \gdefchar^^a8{\"{}} \gdefchar^^a9{\v S} \gdefchar^^aa{\cedilla S} \gdefchar^^ab{\v T} \gdefchar^^ac{\'Z} \gdefchar^^ad{\-} \gdefchar^^ae{\v Z} \gdefchar^^af{\dotaccent Z} % \gdefchar^^b0{\textdegree{}} \gdefchar^^b1{\ogonek{a}} \gdefchar^^b2{\ogonek{ }} \gdefchar^^b3{\l} \gdefchar^^b4{\'{}} \gdefchar^^b5{\v l} \gdefchar^^b6{\'s} \gdefchar^^b7{\v{}} \gdefchar^^b8{\cedilla\ } \gdefchar^^b9{\v s} \gdefchar^^ba{\cedilla s} \gdefchar^^bb{\v t} \gdefchar^^bc{\'z} \gdefchar^^bd{\H{}} \gdefchar^^be{\v z} \gdefchar^^bf{\dotaccent z} % \gdefchar^^c0{\'R} \gdefchar^^c1{\'A} \gdefchar^^c2{\^A} \gdefchar^^c3{\u A} \gdefchar^^c4{\"A} \gdefchar^^c5{\'L} \gdefchar^^c6{\'C} \gdefchar^^c7{\cedilla C} \gdefchar^^c8{\v C} \gdefchar^^c9{\'E} \gdefchar^^ca{\ogonek{E}} \gdefchar^^cb{\"E} \gdefchar^^cc{\v E} \gdefchar^^cd{\'I} \gdefchar^^ce{\^I} \gdefchar^^cf{\v D} % \gdefchar^^d0{\DH} \gdefchar^^d1{\'N} \gdefchar^^d2{\v N} \gdefchar^^d3{\'O} \gdefchar^^d4{\^O} \gdefchar^^d5{\H O} \gdefchar^^d6{\"O} \gdefchar^^d7{$\times$} \gdefchar^^d8{\v R} \gdefchar^^d9{\ringaccent U} \gdefchar^^da{\'U} \gdefchar^^db{\H U} \gdefchar^^dc{\"U} \gdefchar^^dd{\'Y} \gdefchar^^de{\cedilla T} \gdefchar^^df{\ss} % \gdefchar^^e0{\'r} \gdefchar^^e1{\'a} \gdefchar^^e2{\^a} \gdefchar^^e3{\u a} \gdefchar^^e4{\"a} \gdefchar^^e5{\'l} \gdefchar^^e6{\'c} \gdefchar^^e7{\cedilla c} \gdefchar^^e8{\v c} \gdefchar^^e9{\'e} \gdefchar^^ea{\ogonek{e}} \gdefchar^^eb{\"e} \gdefchar^^ec{\v e} \gdefchar^^ed{\'{\dotless{i}}} \gdefchar^^ee{\^{\dotless{i}}} \gdefchar^^ef{\v d} % \gdefchar^^f0{\dh} \gdefchar^^f1{\'n} \gdefchar^^f2{\v n} \gdefchar^^f3{\'o} \gdefchar^^f4{\^o} \gdefchar^^f5{\H o} \gdefchar^^f6{\"o} \gdefchar^^f7{$\div$} \gdefchar^^f8{\v r} \gdefchar^^f9{\ringaccent u} \gdefchar^^fa{\'u} \gdefchar^^fb{\H u} \gdefchar^^fc{\"u} \gdefchar^^fd{\'y} \gdefchar^^fe{\cedilla t} \gdefchar^^ff{\dotaccent{}} } % UTF-8 character definitions. % % This code to support UTF-8 is based on LaTeX's utf8.def, with some % changes for Texinfo conventions. It is included here under the GPL by % permission from Frank Mittelbach and the LaTeX team. % \newcount\countUTFx \newcount\countUTFy \newcount\countUTFz \gdef\UTFviiiTwoOctets#1#2{\expandafter \UTFviiiDefined\csname u8:#1\string #2\endcsname} % \gdef\UTFviiiThreeOctets#1#2#3{\expandafter \UTFviiiDefined\csname u8:#1\string #2\string #3\endcsname} % \gdef\UTFviiiFourOctets#1#2#3#4{\expandafter \UTFviiiDefined\csname u8:#1\string #2\string #3\string #4\endcsname} \gdef\UTFviiiDefined#1{% \ifx #1\relax \message{\linenumber Unicode char \string #1 not defined for Texinfo}% \else \expandafter #1% \fi } % Give non-ASCII bytes the active definitions for processing UTF-8 sequences \begingroup \catcode`\~13 \catcode`\$12 \catcode`\"12 % Loop from \countUTFx to \countUTFy, performing \UTFviiiTmp % substituting ~ and $ with a character token of that value. \def\UTFviiiLoop{% \global\catcode\countUTFx\active \uccode`\~\countUTFx \uccode`\$\countUTFx \uppercase\expandafter{\UTFviiiTmp}% \advance\countUTFx by 1 \ifnum\countUTFx < \countUTFy \expandafter\UTFviiiLoop \fi} % For bytes other than the first in a UTF-8 sequence. Not expected to % be expanded except when writing to auxiliary files. \countUTFx = "80 \countUTFy = "C2 \def\UTFviiiTmp{% \gdef~{% \ifpassthroughchars $\fi}}% \UTFviiiLoop \countUTFx = "C2 \countUTFy = "E0 \def\UTFviiiTmp{% \gdef~{% \ifpassthroughchars $% \else\expandafter\UTFviiiTwoOctets\expandafter$\fi}}% \UTFviiiLoop \countUTFx = "E0 \countUTFy = "F0 \def\UTFviiiTmp{% \gdef~{% \ifpassthroughchars $% \else\expandafter\UTFviiiThreeOctets\expandafter$\fi}}% \UTFviiiLoop \countUTFx = "F0 \countUTFy = "F4 \def\UTFviiiTmp{% \gdef~{% \ifpassthroughchars $% \else\expandafter\UTFviiiFourOctets\expandafter$\fi }}% \UTFviiiLoop \endgroup \def\globallet{\global\let} % save some \expandafter's below % @U{xxxx} to produce U+xxxx, if we support it. \def\U#1{% \expandafter\ifx\csname uni:#1\endcsname \relax \iftxinativeunicodecapable % All Unicode characters can be used if native Unicode handling is % active. However, if the font does not have the glyph, % letters are missing. \begingroup \uccode`\.="#1\relax \uppercase{.} \endgroup \else \errhelp = \EMsimple \errmessage{Unicode character U+#1 not supported, sorry}% \fi \else \csname uni:#1\endcsname \fi } % These macros are used here to construct the name of a control % sequence to be defined. \def\UTFviiiTwoOctetsName#1#2{% \csname u8:#1\string #2\endcsname}% \def\UTFviiiThreeOctetsName#1#2#3{% \csname u8:#1\string #2\string #3\endcsname}% \def\UTFviiiFourOctetsName#1#2#3#4{% \csname u8:#1\string #2\string #3\string #4\endcsname}% % For UTF-8 byte sequences (TeX, e-TeX and pdfTeX), % provide a definition macro to replace a Unicode character; % this gets used by the @U command % \begingroup \catcode`\"=12 \catcode`\<=12 \catcode`\.=12 \catcode`\,=12 \catcode`\;=12 \catcode`\!=12 \catcode`\~=13 \gdef\DeclareUnicodeCharacterUTFviii#1#2{% \countUTFz = "#1\relax \begingroup \parseXMLCharref % Give \u8:... its definition. The sequence of seven \expandafter's % expands after the \gdef three times, e.g. % % 1. \UTFviiTwoOctetsName B1 B2 % 2. \csname u8:B1 \string B2 \endcsname % 3. \u8: B1 B2 (a single control sequence token) % \expandafter\expandafter \expandafter\expandafter \expandafter\expandafter \expandafter\gdef \UTFviiiTmp{#2}% % \expandafter\ifx\csname uni:#1\endcsname \relax \else \message{Internal error, already defined: #1}% \fi % % define an additional control sequence for this code point. \expandafter\globallet\csname uni:#1\endcsname \UTFviiiTmp \endgroup} % % Given the value in \countUTFz as a Unicode code point, set \UTFviiiTmp % to the corresponding UTF-8 sequence. \gdef\parseXMLCharref{% \ifnum\countUTFz < "A0\relax \errhelp = \EMsimple \errmessage{Cannot define Unicode char value < 00A0}% \else\ifnum\countUTFz < "800\relax \parseUTFviiiA,% \parseUTFviiiB C\UTFviiiTwoOctetsName.,% \else\ifnum\countUTFz < "10000\relax \parseUTFviiiA;% \parseUTFviiiA,% \parseUTFviiiB E\UTFviiiThreeOctetsName.{,;}% \else \parseUTFviiiA;% \parseUTFviiiA,% \parseUTFviiiA!% \parseUTFviiiB F\UTFviiiFourOctetsName.{!,;}% \fi\fi\fi } % Extract a byte from the end of the UTF-8 representation of \countUTFx. % It must be a non-initial byte in the sequence. % Change \uccode of #1 for it to be used in \parseUTFviiiB as one % of the bytes. \gdef\parseUTFviiiA#1{% \countUTFx = \countUTFz \divide\countUTFz by 64 \countUTFy = \countUTFz % Save to be the future value of \countUTFz. \multiply\countUTFz by 64 % \countUTFz is now \countUTFx with the last 5 bits cleared. Subtract % in order to get the last five bits. \advance\countUTFx by -\countUTFz % Convert this to the byte in the UTF-8 sequence. \advance\countUTFx by 128 \uccode `#1\countUTFx \countUTFz = \countUTFy} % Used to put a UTF-8 byte sequence into \UTFviiiTmp % #1 is the increment for \countUTFz to yield a the first byte of the UTF-8 % sequence. % #2 is one of the \UTFviii*OctetsName macros. % #3 is always a full stop (.) % #4 is a template for the other bytes in the sequence. The values for these % bytes is substituted in here with \uppercase using the \uccode's. \gdef\parseUTFviiiB#1#2#3#4{% \advance\countUTFz by "#10\relax \uccode `#3\countUTFz \uppercase{\gdef\UTFviiiTmp{#2#3#4}}} \endgroup % For native Unicode handling (XeTeX and LuaTeX), % provide a definition macro that sets a catcode to `other' non-globally % \def\DeclareUnicodeCharacterNativeOther#1#2{% \catcode"#1=\other } % https://en.wikipedia.org/wiki/Plane_(Unicode)#Basic_M % U+0000..U+007F = https://en.wikipedia.org/wiki/Basic_Latin_(Unicode_block) % U+0080..U+00FF = https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block) % U+0100..U+017F = https://en.wikipedia.org/wiki/Latin_Extended-A % U+0180..U+024F = https://en.wikipedia.org/wiki/Latin_Extended-B % % Many of our renditions are less than wonderful, and all the missing % characters are available somewhere. Loading the necessary fonts % awaits user request. We can't truly support Unicode without % reimplementing everything that's been done in LaTeX for many years, % plus probably using luatex or xetex, and who knows what else. % We won't be doing that here in this simple file. But we can try to at % least make most of the characters not bomb out. % \def\unicodechardefs{% \DeclareUnicodeCharacter{00A0}{\tie}% \DeclareUnicodeCharacter{00A1}{\exclamdown}% \DeclareUnicodeCharacter{00A2}{{\tcfont \char162}}% 0242=cent \DeclareUnicodeCharacter{00A3}{\pounds{}}% \DeclareUnicodeCharacter{00A4}{{\tcfont \char164}}% 0244=currency \DeclareUnicodeCharacter{00A5}{{\tcfont \char165}}% 0245=yen \DeclareUnicodeCharacter{00A6}{{\tcfont \char166}}% 0246=brokenbar \DeclareUnicodeCharacter{00A7}{\S}% \DeclareUnicodeCharacter{00A8}{\"{ }}% \DeclareUnicodeCharacter{00A9}{\copyright{}}% \DeclareUnicodeCharacter{00AA}{\ordf}% \DeclareUnicodeCharacter{00AB}{\guillemetleft{}}% \DeclareUnicodeCharacter{00AC}{\ensuremath\lnot}% \DeclareUnicodeCharacter{00AD}{\-}% \DeclareUnicodeCharacter{00AE}{\registeredsymbol{}}% \DeclareUnicodeCharacter{00AF}{\={ }}% % \DeclareUnicodeCharacter{00B0}{\ringaccent{ }}% \DeclareUnicodeCharacter{00B1}{\ensuremath\pm}% \DeclareUnicodeCharacter{00B2}{$^2$}% \DeclareUnicodeCharacter{00B3}{$^3$}% \DeclareUnicodeCharacter{00B4}{\'{ }}% \DeclareUnicodeCharacter{00B5}{$\mu$}% \DeclareUnicodeCharacter{00B6}{\P}% \DeclareUnicodeCharacter{00B7}{\ensuremath\cdot}% \DeclareUnicodeCharacter{00B8}{\cedilla{ }}% \DeclareUnicodeCharacter{00B9}{$^1$}% \DeclareUnicodeCharacter{00BA}{\ordm}% \DeclareUnicodeCharacter{00BB}{\guillemetright{}}% \DeclareUnicodeCharacter{00BC}{$1\over4$}% \DeclareUnicodeCharacter{00BD}{$1\over2$}% \DeclareUnicodeCharacter{00BE}{$3\over4$}% \DeclareUnicodeCharacter{00BF}{\questiondown}% % \DeclareUnicodeCharacter{00C0}{\`A}% \DeclareUnicodeCharacter{00C1}{\'A}% \DeclareUnicodeCharacter{00C2}{\^A}% \DeclareUnicodeCharacter{00C3}{\~A}% \DeclareUnicodeCharacter{00C4}{\"A}% \DeclareUnicodeCharacter{00C5}{\AA}% \DeclareUnicodeCharacter{00C6}{\AE}% \DeclareUnicodeCharacter{00C7}{\cedilla{C}}% \DeclareUnicodeCharacter{00C8}{\`E}% \DeclareUnicodeCharacter{00C9}{\'E}% \DeclareUnicodeCharacter{00CA}{\^E}% \DeclareUnicodeCharacter{00CB}{\"E}% \DeclareUnicodeCharacter{00CC}{\`I}% \DeclareUnicodeCharacter{00CD}{\'I}% \DeclareUnicodeCharacter{00CE}{\^I}% \DeclareUnicodeCharacter{00CF}{\"I}% % \DeclareUnicodeCharacter{00D0}{\DH}% \DeclareUnicodeCharacter{00D1}{\~N}% \DeclareUnicodeCharacter{00D2}{\`O}% \DeclareUnicodeCharacter{00D3}{\'O}% \DeclareUnicodeCharacter{00D4}{\^O}% \DeclareUnicodeCharacter{00D5}{\~O}% \DeclareUnicodeCharacter{00D6}{\"O}% \DeclareUnicodeCharacter{00D7}{\ensuremath\times}% \DeclareUnicodeCharacter{00D8}{\O}% \DeclareUnicodeCharacter{00D9}{\`U}% \DeclareUnicodeCharacter{00DA}{\'U}% \DeclareUnicodeCharacter{00DB}{\^U}% \DeclareUnicodeCharacter{00DC}{\"U}% \DeclareUnicodeCharacter{00DD}{\'Y}% \DeclareUnicodeCharacter{00DE}{\TH}% \DeclareUnicodeCharacter{00DF}{\ss}% % \DeclareUnicodeCharacter{00E0}{\`a}% \DeclareUnicodeCharacter{00E1}{\'a}% \DeclareUnicodeCharacter{00E2}{\^a}% \DeclareUnicodeCharacter{00E3}{\~a}% \DeclareUnicodeCharacter{00E4}{\"a}% \DeclareUnicodeCharacter{00E5}{\aa}% \DeclareUnicodeCharacter{00E6}{\ae}% \DeclareUnicodeCharacter{00E7}{\cedilla{c}}% \DeclareUnicodeCharacter{00E8}{\`e}% \DeclareUnicodeCharacter{00E9}{\'e}% \DeclareUnicodeCharacter{00EA}{\^e}% \DeclareUnicodeCharacter{00EB}{\"e}% \DeclareUnicodeCharacter{00EC}{\`{\dotless{i}}}% \DeclareUnicodeCharacter{00ED}{\'{\dotless{i}}}% \DeclareUnicodeCharacter{00EE}{\^{\dotless{i}}}% \DeclareUnicodeCharacter{00EF}{\"{\dotless{i}}}% % \DeclareUnicodeCharacter{00F0}{\dh}% \DeclareUnicodeCharacter{00F1}{\~n}% \DeclareUnicodeCharacter{00F2}{\`o}% \DeclareUnicodeCharacter{00F3}{\'o}% \DeclareUnicodeCharacter{00F4}{\^o}% \DeclareUnicodeCharacter{00F5}{\~o}% \DeclareUnicodeCharacter{00F6}{\"o}% \DeclareUnicodeCharacter{00F7}{\ensuremath\div}% \DeclareUnicodeCharacter{00F8}{\o}% \DeclareUnicodeCharacter{00F9}{\`u}% \DeclareUnicodeCharacter{00FA}{\'u}% \DeclareUnicodeCharacter{00FB}{\^u}% \DeclareUnicodeCharacter{00FC}{\"u}% \DeclareUnicodeCharacter{00FD}{\'y}% \DeclareUnicodeCharacter{00FE}{\th}% \DeclareUnicodeCharacter{00FF}{\"y}% % \DeclareUnicodeCharacter{0100}{\=A}% \DeclareUnicodeCharacter{0101}{\=a}% \DeclareUnicodeCharacter{0102}{\u{A}}% \DeclareUnicodeCharacter{0103}{\u{a}}% \DeclareUnicodeCharacter{0104}{\ogonek{A}}% \DeclareUnicodeCharacter{0105}{\ogonek{a}}% \DeclareUnicodeCharacter{0106}{\'C}% \DeclareUnicodeCharacter{0107}{\'c}% \DeclareUnicodeCharacter{0108}{\^C}% \DeclareUnicodeCharacter{0109}{\^c}% \DeclareUnicodeCharacter{010A}{\dotaccent{C}}% \DeclareUnicodeCharacter{010B}{\dotaccent{c}}% \DeclareUnicodeCharacter{010C}{\v{C}}% \DeclareUnicodeCharacter{010D}{\v{c}}% \DeclareUnicodeCharacter{010E}{\v{D}}% \DeclareUnicodeCharacter{010F}{d'}% % \DeclareUnicodeCharacter{0110}{\DH}% \DeclareUnicodeCharacter{0111}{\dh}% \DeclareUnicodeCharacter{0112}{\=E}% \DeclareUnicodeCharacter{0113}{\=e}% \DeclareUnicodeCharacter{0114}{\u{E}}% \DeclareUnicodeCharacter{0115}{\u{e}}% \DeclareUnicodeCharacter{0116}{\dotaccent{E}}% \DeclareUnicodeCharacter{0117}{\dotaccent{e}}% \DeclareUnicodeCharacter{0118}{\ogonek{E}}% \DeclareUnicodeCharacter{0119}{\ogonek{e}}% \DeclareUnicodeCharacter{011A}{\v{E}}% \DeclareUnicodeCharacter{011B}{\v{e}}% \DeclareUnicodeCharacter{011C}{\^G}% \DeclareUnicodeCharacter{011D}{\^g}% \DeclareUnicodeCharacter{011E}{\u{G}}% \DeclareUnicodeCharacter{011F}{\u{g}}% % \DeclareUnicodeCharacter{0120}{\dotaccent{G}}% \DeclareUnicodeCharacter{0121}{\dotaccent{g}}% \DeclareUnicodeCharacter{0122}{\cedilla{G}}% \DeclareUnicodeCharacter{0123}{\cedilla{g}}% \DeclareUnicodeCharacter{0124}{\^H}% \DeclareUnicodeCharacter{0125}{\^h}% \DeclareUnicodeCharacter{0126}{\missingcharmsg{H WITH STROKE}}% \DeclareUnicodeCharacter{0127}{\missingcharmsg{h WITH STROKE}}% \DeclareUnicodeCharacter{0128}{\~I}% \DeclareUnicodeCharacter{0129}{\~{\dotless{i}}}% \DeclareUnicodeCharacter{012A}{\=I}% \DeclareUnicodeCharacter{012B}{\={\dotless{i}}}% \DeclareUnicodeCharacter{012C}{\u{I}}% \DeclareUnicodeCharacter{012D}{\u{\dotless{i}}}% \DeclareUnicodeCharacter{012E}{\ogonek{I}}% \DeclareUnicodeCharacter{012F}{\ogonek{i}}% % \DeclareUnicodeCharacter{0130}{\dotaccent{I}}% \DeclareUnicodeCharacter{0131}{\dotless{i}}% \DeclareUnicodeCharacter{0132}{IJ}% \DeclareUnicodeCharacter{0133}{ij}% \DeclareUnicodeCharacter{0134}{\^J}% \DeclareUnicodeCharacter{0135}{\^{\dotless{j}}}% \DeclareUnicodeCharacter{0136}{\cedilla{K}}% \DeclareUnicodeCharacter{0137}{\cedilla{k}}% \DeclareUnicodeCharacter{0138}{\ensuremath\kappa}% \DeclareUnicodeCharacter{0139}{\'L}% \DeclareUnicodeCharacter{013A}{\'l}% \DeclareUnicodeCharacter{013B}{\cedilla{L}}% \DeclareUnicodeCharacter{013C}{\cedilla{l}}% \DeclareUnicodeCharacter{013D}{L'}% should kern \DeclareUnicodeCharacter{013E}{l'}% should kern \DeclareUnicodeCharacter{013F}{L\U{00B7}}% % \DeclareUnicodeCharacter{0140}{l\U{00B7}}% \DeclareUnicodeCharacter{0141}{\L}% \DeclareUnicodeCharacter{0142}{\l}% \DeclareUnicodeCharacter{0143}{\'N}% \DeclareUnicodeCharacter{0144}{\'n}% \DeclareUnicodeCharacter{0145}{\cedilla{N}}% \DeclareUnicodeCharacter{0146}{\cedilla{n}}% \DeclareUnicodeCharacter{0147}{\v{N}}% \DeclareUnicodeCharacter{0148}{\v{n}}% \DeclareUnicodeCharacter{0149}{'n}% \DeclareUnicodeCharacter{014A}{\missingcharmsg{ENG}}% \DeclareUnicodeCharacter{014B}{\missingcharmsg{eng}}% \DeclareUnicodeCharacter{014C}{\=O}% \DeclareUnicodeCharacter{014D}{\=o}% \DeclareUnicodeCharacter{014E}{\u{O}}% \DeclareUnicodeCharacter{014F}{\u{o}}% % \DeclareUnicodeCharacter{0150}{\H{O}}% \DeclareUnicodeCharacter{0151}{\H{o}}% \DeclareUnicodeCharacter{0152}{\OE}% \DeclareUnicodeCharacter{0153}{\oe}% \DeclareUnicodeCharacter{0154}{\'R}% \DeclareUnicodeCharacter{0155}{\'r}% \DeclareUnicodeCharacter{0156}{\cedilla{R}}% \DeclareUnicodeCharacter{0157}{\cedilla{r}}% \DeclareUnicodeCharacter{0158}{\v{R}}% \DeclareUnicodeCharacter{0159}{\v{r}}% \DeclareUnicodeCharacter{015A}{\'S}% \DeclareUnicodeCharacter{015B}{\'s}% \DeclareUnicodeCharacter{015C}{\^S}% \DeclareUnicodeCharacter{015D}{\^s}% \DeclareUnicodeCharacter{015E}{\cedilla{S}}% \DeclareUnicodeCharacter{015F}{\cedilla{s}}% % \DeclareUnicodeCharacter{0160}{\v{S}}% \DeclareUnicodeCharacter{0161}{\v{s}}% \DeclareUnicodeCharacter{0162}{\cedilla{T}}% \DeclareUnicodeCharacter{0163}{\cedilla{t}}% \DeclareUnicodeCharacter{0164}{\v{T}}% \DeclareUnicodeCharacter{0165}{\v{t}}% \DeclareUnicodeCharacter{0166}{\missingcharmsg{H WITH STROKE}}% \DeclareUnicodeCharacter{0167}{\missingcharmsg{h WITH STROKE}}% \DeclareUnicodeCharacter{0168}{\~U}% \DeclareUnicodeCharacter{0169}{\~u}% \DeclareUnicodeCharacter{016A}{\=U}% \DeclareUnicodeCharacter{016B}{\=u}% \DeclareUnicodeCharacter{016C}{\u{U}}% \DeclareUnicodeCharacter{016D}{\u{u}}% \DeclareUnicodeCharacter{016E}{\ringaccent{U}}% \DeclareUnicodeCharacter{016F}{\ringaccent{u}}% % \DeclareUnicodeCharacter{0170}{\H{U}}% \DeclareUnicodeCharacter{0171}{\H{u}}% \DeclareUnicodeCharacter{0172}{\ogonek{U}}% \DeclareUnicodeCharacter{0173}{\ogonek{u}}% \DeclareUnicodeCharacter{0174}{\^W}% \DeclareUnicodeCharacter{0175}{\^w}% \DeclareUnicodeCharacter{0176}{\^Y}% \DeclareUnicodeCharacter{0177}{\^y}% \DeclareUnicodeCharacter{0178}{\"Y}% \DeclareUnicodeCharacter{0179}{\'Z}% \DeclareUnicodeCharacter{017A}{\'z}% \DeclareUnicodeCharacter{017B}{\dotaccent{Z}}% \DeclareUnicodeCharacter{017C}{\dotaccent{z}}% \DeclareUnicodeCharacter{017D}{\v{Z}}% \DeclareUnicodeCharacter{017E}{\v{z}}% \DeclareUnicodeCharacter{017F}{\missingcharmsg{LONG S}}% % \DeclareUnicodeCharacter{01C4}{D\v{Z}}% \DeclareUnicodeCharacter{01C5}{D\v{z}}% \DeclareUnicodeCharacter{01C6}{d\v{z}}% \DeclareUnicodeCharacter{01C7}{LJ}% \DeclareUnicodeCharacter{01C8}{Lj}% \DeclareUnicodeCharacter{01C9}{lj}% \DeclareUnicodeCharacter{01CA}{NJ}% \DeclareUnicodeCharacter{01CB}{Nj}% \DeclareUnicodeCharacter{01CC}{nj}% \DeclareUnicodeCharacter{01CD}{\v{A}}% \DeclareUnicodeCharacter{01CE}{\v{a}}% \DeclareUnicodeCharacter{01CF}{\v{I}}% % \DeclareUnicodeCharacter{01D0}{\v{\dotless{i}}}% \DeclareUnicodeCharacter{01D1}{\v{O}}% \DeclareUnicodeCharacter{01D2}{\v{o}}% \DeclareUnicodeCharacter{01D3}{\v{U}}% \DeclareUnicodeCharacter{01D4}{\v{u}}% % \DeclareUnicodeCharacter{01E2}{\={\AE}}% \DeclareUnicodeCharacter{01E3}{\={\ae}}% \DeclareUnicodeCharacter{01E6}{\v{G}}% \DeclareUnicodeCharacter{01E7}{\v{g}}% \DeclareUnicodeCharacter{01E8}{\v{K}}% \DeclareUnicodeCharacter{01E9}{\v{k}}% % \DeclareUnicodeCharacter{01F0}{\v{\dotless{j}}}% \DeclareUnicodeCharacter{01F1}{DZ}% \DeclareUnicodeCharacter{01F2}{Dz}% \DeclareUnicodeCharacter{01F3}{dz}% \DeclareUnicodeCharacter{01F4}{\'G}% \DeclareUnicodeCharacter{01F5}{\'g}% \DeclareUnicodeCharacter{01F8}{\`N}% \DeclareUnicodeCharacter{01F9}{\`n}% \DeclareUnicodeCharacter{01FC}{\'{\AE}}% \DeclareUnicodeCharacter{01FD}{\'{\ae}}% \DeclareUnicodeCharacter{01FE}{\'{\O}}% \DeclareUnicodeCharacter{01FF}{\'{\o}}% % \DeclareUnicodeCharacter{021E}{\v{H}}% \DeclareUnicodeCharacter{021F}{\v{h}}% % \DeclareUnicodeCharacter{0226}{\dotaccent{A}}% \DeclareUnicodeCharacter{0227}{\dotaccent{a}}% \DeclareUnicodeCharacter{0228}{\cedilla{E}}% \DeclareUnicodeCharacter{0229}{\cedilla{e}}% \DeclareUnicodeCharacter{022E}{\dotaccent{O}}% \DeclareUnicodeCharacter{022F}{\dotaccent{o}}% % \DeclareUnicodeCharacter{0232}{\=Y}% \DeclareUnicodeCharacter{0233}{\=y}% \DeclareUnicodeCharacter{0237}{\dotless{j}}% % \DeclareUnicodeCharacter{02BC}{'}% % \DeclareUnicodeCharacter{02DB}{\ogonek{ }}% % % Greek letters upper case \DeclareUnicodeCharacter{0391}{{\it A}}% \DeclareUnicodeCharacter{0392}{{\it B}}% \DeclareUnicodeCharacter{0393}{\ensuremath{\mit\Gamma}}% \DeclareUnicodeCharacter{0394}{\ensuremath{\mit\Delta}}% \DeclareUnicodeCharacter{0395}{{\it E}}% \DeclareUnicodeCharacter{0396}{{\it Z}}% \DeclareUnicodeCharacter{0397}{{\it H}}% \DeclareUnicodeCharacter{0398}{\ensuremath{\mit\Theta}}% \DeclareUnicodeCharacter{0399}{{\it I}}% \DeclareUnicodeCharacter{039A}{{\it K}}% \DeclareUnicodeCharacter{039B}{\ensuremath{\mit\Lambda}}% \DeclareUnicodeCharacter{039C}{{\it M}}% \DeclareUnicodeCharacter{039D}{{\it N}}% \DeclareUnicodeCharacter{039E}{\ensuremath{\mit\Xi}}% \DeclareUnicodeCharacter{039F}{{\it O}}% \DeclareUnicodeCharacter{03A0}{\ensuremath{\mit\Pi}}% \DeclareUnicodeCharacter{03A1}{{\it P}}% %\DeclareUnicodeCharacter{03A2}{} % none - corresponds to final sigma \DeclareUnicodeCharacter{03A3}{\ensuremath{\mit\Sigma}}% \DeclareUnicodeCharacter{03A4}{{\it T}}% \DeclareUnicodeCharacter{03A5}{\ensuremath{\mit\Upsilon}}% \DeclareUnicodeCharacter{03A6}{\ensuremath{\mit\Phi}}% \DeclareUnicodeCharacter{03A7}{{\it X}}% \DeclareUnicodeCharacter{03A8}{\ensuremath{\mit\Psi}}% \DeclareUnicodeCharacter{03A9}{\ensuremath{\mit\Omega}}% % % Vowels with accents \DeclareUnicodeCharacter{0390}{\ensuremath{\ddot{\acute\iota}}}% \DeclareUnicodeCharacter{03AC}{\ensuremath{\acute\alpha}}% \DeclareUnicodeCharacter{03AD}{\ensuremath{\acute\epsilon}}% \DeclareUnicodeCharacter{03AE}{\ensuremath{\acute\eta}}% \DeclareUnicodeCharacter{03AF}{\ensuremath{\acute\iota}}% \DeclareUnicodeCharacter{03B0}{\ensuremath{\acute{\ddot\upsilon}}}% % % Standalone accent \DeclareUnicodeCharacter{0384}{\ensuremath{\acute{\ }}}% % % Greek letters lower case \DeclareUnicodeCharacter{03B1}{\ensuremath\alpha}% \DeclareUnicodeCharacter{03B2}{\ensuremath\beta}% \DeclareUnicodeCharacter{03B3}{\ensuremath\gamma}% \DeclareUnicodeCharacter{03B4}{\ensuremath\delta}% \DeclareUnicodeCharacter{03B5}{\ensuremath\epsilon}% \DeclareUnicodeCharacter{03B6}{\ensuremath\zeta}% \DeclareUnicodeCharacter{03B7}{\ensuremath\eta}% \DeclareUnicodeCharacter{03B8}{\ensuremath\theta}% \DeclareUnicodeCharacter{03B9}{\ensuremath\iota}% \DeclareUnicodeCharacter{03BA}{\ensuremath\kappa}% \DeclareUnicodeCharacter{03BB}{\ensuremath\lambda}% \DeclareUnicodeCharacter{03BC}{\ensuremath\mu}% \DeclareUnicodeCharacter{03BD}{\ensuremath\nu}% \DeclareUnicodeCharacter{03BE}{\ensuremath\xi}% \DeclareUnicodeCharacter{03BF}{{\it o}}% omicron \DeclareUnicodeCharacter{03C0}{\ensuremath\pi}% \DeclareUnicodeCharacter{03C1}{\ensuremath\rho}% \DeclareUnicodeCharacter{03C2}{\ensuremath\varsigma}% \DeclareUnicodeCharacter{03C3}{\ensuremath\sigma}% \DeclareUnicodeCharacter{03C4}{\ensuremath\tau}% \DeclareUnicodeCharacter{03C5}{\ensuremath\upsilon}% \DeclareUnicodeCharacter{03C6}{\ensuremath\phi}% \DeclareUnicodeCharacter{03C7}{\ensuremath\chi}% \DeclareUnicodeCharacter{03C8}{\ensuremath\psi}% \DeclareUnicodeCharacter{03C9}{\ensuremath\omega}% % % More Greek vowels with accents \DeclareUnicodeCharacter{03CA}{\ensuremath{\ddot\iota}}% \DeclareUnicodeCharacter{03CB}{\ensuremath{\ddot\upsilon}}% \DeclareUnicodeCharacter{03CC}{\ensuremath{\acute o}}% \DeclareUnicodeCharacter{03CD}{\ensuremath{\acute\upsilon}}% \DeclareUnicodeCharacter{03CE}{\ensuremath{\acute\omega}}% % % Variant Greek letters \DeclareUnicodeCharacter{03D1}{\ensuremath\vartheta}% \DeclareUnicodeCharacter{03D6}{\ensuremath\varpi}% \DeclareUnicodeCharacter{03F1}{\ensuremath\varrho}% % \DeclareUnicodeCharacter{1E02}{\dotaccent{B}}% \DeclareUnicodeCharacter{1E03}{\dotaccent{b}}% \DeclareUnicodeCharacter{1E04}{\udotaccent{B}}% \DeclareUnicodeCharacter{1E05}{\udotaccent{b}}% \DeclareUnicodeCharacter{1E06}{\ubaraccent{B}}% \DeclareUnicodeCharacter{1E07}{\ubaraccent{b}}% \DeclareUnicodeCharacter{1E0A}{\dotaccent{D}}% \DeclareUnicodeCharacter{1E0B}{\dotaccent{d}}% \DeclareUnicodeCharacter{1E0C}{\udotaccent{D}}% \DeclareUnicodeCharacter{1E0D}{\udotaccent{d}}% \DeclareUnicodeCharacter{1E0E}{\ubaraccent{D}}% \DeclareUnicodeCharacter{1E0F}{\ubaraccent{d}}% % \DeclareUnicodeCharacter{1E1E}{\dotaccent{F}}% \DeclareUnicodeCharacter{1E1F}{\dotaccent{f}}% % \DeclareUnicodeCharacter{1E20}{\=G}% \DeclareUnicodeCharacter{1E21}{\=g}% \DeclareUnicodeCharacter{1E22}{\dotaccent{H}}% \DeclareUnicodeCharacter{1E23}{\dotaccent{h}}% \DeclareUnicodeCharacter{1E24}{\udotaccent{H}}% \DeclareUnicodeCharacter{1E25}{\udotaccent{h}}% \DeclareUnicodeCharacter{1E26}{\"H}% \DeclareUnicodeCharacter{1E27}{\"h}% % \DeclareUnicodeCharacter{1E30}{\'K}% \DeclareUnicodeCharacter{1E31}{\'k}% \DeclareUnicodeCharacter{1E32}{\udotaccent{K}}% \DeclareUnicodeCharacter{1E33}{\udotaccent{k}}% \DeclareUnicodeCharacter{1E34}{\ubaraccent{K}}% \DeclareUnicodeCharacter{1E35}{\ubaraccent{k}}% \DeclareUnicodeCharacter{1E36}{\udotaccent{L}}% \DeclareUnicodeCharacter{1E37}{\udotaccent{l}}% \DeclareUnicodeCharacter{1E3A}{\ubaraccent{L}}% \DeclareUnicodeCharacter{1E3B}{\ubaraccent{l}}% \DeclareUnicodeCharacter{1E3E}{\'M}% \DeclareUnicodeCharacter{1E3F}{\'m}% % \DeclareUnicodeCharacter{1E40}{\dotaccent{M}}% \DeclareUnicodeCharacter{1E41}{\dotaccent{m}}% \DeclareUnicodeCharacter{1E42}{\udotaccent{M}}% \DeclareUnicodeCharacter{1E43}{\udotaccent{m}}% \DeclareUnicodeCharacter{1E44}{\dotaccent{N}}% \DeclareUnicodeCharacter{1E45}{\dotaccent{n}}% \DeclareUnicodeCharacter{1E46}{\udotaccent{N}}% \DeclareUnicodeCharacter{1E47}{\udotaccent{n}}% \DeclareUnicodeCharacter{1E48}{\ubaraccent{N}}% \DeclareUnicodeCharacter{1E49}{\ubaraccent{n}}% % \DeclareUnicodeCharacter{1E54}{\'P}% \DeclareUnicodeCharacter{1E55}{\'p}% \DeclareUnicodeCharacter{1E56}{\dotaccent{P}}% \DeclareUnicodeCharacter{1E57}{\dotaccent{p}}% \DeclareUnicodeCharacter{1E58}{\dotaccent{R}}% \DeclareUnicodeCharacter{1E59}{\dotaccent{r}}% \DeclareUnicodeCharacter{1E5A}{\udotaccent{R}}% \DeclareUnicodeCharacter{1E5B}{\udotaccent{r}}% \DeclareUnicodeCharacter{1E5E}{\ubaraccent{R}}% \DeclareUnicodeCharacter{1E5F}{\ubaraccent{r}}% % \DeclareUnicodeCharacter{1E60}{\dotaccent{S}}% \DeclareUnicodeCharacter{1E61}{\dotaccent{s}}% \DeclareUnicodeCharacter{1E62}{\udotaccent{S}}% \DeclareUnicodeCharacter{1E63}{\udotaccent{s}}% \DeclareUnicodeCharacter{1E6A}{\dotaccent{T}}% \DeclareUnicodeCharacter{1E6B}{\dotaccent{t}}% \DeclareUnicodeCharacter{1E6C}{\udotaccent{T}}% \DeclareUnicodeCharacter{1E6D}{\udotaccent{t}}% \DeclareUnicodeCharacter{1E6E}{\ubaraccent{T}}% \DeclareUnicodeCharacter{1E6F}{\ubaraccent{t}}% % \DeclareUnicodeCharacter{1E7C}{\~V}% \DeclareUnicodeCharacter{1E7D}{\~v}% \DeclareUnicodeCharacter{1E7E}{\udotaccent{V}}% \DeclareUnicodeCharacter{1E7F}{\udotaccent{v}}% % \DeclareUnicodeCharacter{1E80}{\`W}% \DeclareUnicodeCharacter{1E81}{\`w}% \DeclareUnicodeCharacter{1E82}{\'W}% \DeclareUnicodeCharacter{1E83}{\'w}% \DeclareUnicodeCharacter{1E84}{\"W}% \DeclareUnicodeCharacter{1E85}{\"w}% \DeclareUnicodeCharacter{1E86}{\dotaccent{W}}% \DeclareUnicodeCharacter{1E87}{\dotaccent{w}}% \DeclareUnicodeCharacter{1E88}{\udotaccent{W}}% \DeclareUnicodeCharacter{1E89}{\udotaccent{w}}% \DeclareUnicodeCharacter{1E8A}{\dotaccent{X}}% \DeclareUnicodeCharacter{1E8B}{\dotaccent{x}}% \DeclareUnicodeCharacter{1E8C}{\"X}% \DeclareUnicodeCharacter{1E8D}{\"x}% \DeclareUnicodeCharacter{1E8E}{\dotaccent{Y}}% \DeclareUnicodeCharacter{1E8F}{\dotaccent{y}}% % \DeclareUnicodeCharacter{1E90}{\^Z}% \DeclareUnicodeCharacter{1E91}{\^z}% \DeclareUnicodeCharacter{1E92}{\udotaccent{Z}}% \DeclareUnicodeCharacter{1E93}{\udotaccent{z}}% \DeclareUnicodeCharacter{1E94}{\ubaraccent{Z}}% \DeclareUnicodeCharacter{1E95}{\ubaraccent{z}}% \DeclareUnicodeCharacter{1E96}{\ubaraccent{h}}% \DeclareUnicodeCharacter{1E97}{\"t}% \DeclareUnicodeCharacter{1E98}{\ringaccent{w}}% \DeclareUnicodeCharacter{1E99}{\ringaccent{y}}% % \DeclareUnicodeCharacter{1EA0}{\udotaccent{A}}% \DeclareUnicodeCharacter{1EA1}{\udotaccent{a}}% % \DeclareUnicodeCharacter{1EB8}{\udotaccent{E}}% \DeclareUnicodeCharacter{1EB9}{\udotaccent{e}}% \DeclareUnicodeCharacter{1EBC}{\~E}% \DeclareUnicodeCharacter{1EBD}{\~e}% % \DeclareUnicodeCharacter{1ECA}{\udotaccent{I}}% \DeclareUnicodeCharacter{1ECB}{\udotaccent{i}}% \DeclareUnicodeCharacter{1ECC}{\udotaccent{O}}% \DeclareUnicodeCharacter{1ECD}{\udotaccent{o}}% % \DeclareUnicodeCharacter{1EE4}{\udotaccent{U}}% \DeclareUnicodeCharacter{1EE5}{\udotaccent{u}}% % \DeclareUnicodeCharacter{1EF2}{\`Y}% \DeclareUnicodeCharacter{1EF3}{\`y}% \DeclareUnicodeCharacter{1EF4}{\udotaccent{Y}}% % \DeclareUnicodeCharacter{1EF8}{\~Y}% \DeclareUnicodeCharacter{1EF9}{\~y}% % % Punctuation \DeclareUnicodeCharacter{2013}{--}% \DeclareUnicodeCharacter{2014}{---}% \DeclareUnicodeCharacter{2018}{\quoteleft{}}% \DeclareUnicodeCharacter{2019}{\quoteright{}}% \DeclareUnicodeCharacter{201A}{\quotesinglbase{}}% \DeclareUnicodeCharacter{201C}{\quotedblleft{}}% \DeclareUnicodeCharacter{201D}{\quotedblright{}}% \DeclareUnicodeCharacter{201E}{\quotedblbase{}}% \DeclareUnicodeCharacter{2020}{\ensuremath\dagger}% \DeclareUnicodeCharacter{2021}{\ensuremath\ddagger}% \DeclareUnicodeCharacter{2022}{\bullet{}}% \DeclareUnicodeCharacter{202F}{\thinspace}% \DeclareUnicodeCharacter{2026}{\dots{}}% \DeclareUnicodeCharacter{2039}{\guilsinglleft{}}% \DeclareUnicodeCharacter{203A}{\guilsinglright{}}% % \DeclareUnicodeCharacter{20AC}{\euro{}}% % \DeclareUnicodeCharacter{2192}{\expansion{}}% \DeclareUnicodeCharacter{21D2}{\result{}}% % % Mathematical symbols \DeclareUnicodeCharacter{2200}{\ensuremath\forall}% \DeclareUnicodeCharacter{2203}{\ensuremath\exists}% \DeclareUnicodeCharacter{2208}{\ensuremath\in}% \DeclareUnicodeCharacter{2212}{\minus{}}% \DeclareUnicodeCharacter{2217}{\ast}% \DeclareUnicodeCharacter{221E}{\ensuremath\infty}% \DeclareUnicodeCharacter{2225}{\ensuremath\parallel}% \DeclareUnicodeCharacter{2227}{\ensuremath\wedge}% \DeclareUnicodeCharacter{2229}{\ensuremath\cap}% \DeclareUnicodeCharacter{2261}{\equiv{}}% \DeclareUnicodeCharacter{2264}{\ensuremath\leq}% \DeclareUnicodeCharacter{2265}{\ensuremath\geq}% \DeclareUnicodeCharacter{2282}{\ensuremath\subset}% \DeclareUnicodeCharacter{2287}{\ensuremath\supseteq}% % \DeclareUnicodeCharacter{2016}{\ensuremath\Vert}% \DeclareUnicodeCharacter{2032}{\ensuremath\prime}% \DeclareUnicodeCharacter{210F}{\ensuremath\hbar}% \DeclareUnicodeCharacter{2111}{\ensuremath\Im}% \DeclareUnicodeCharacter{2113}{\ensuremath\ell}% \DeclareUnicodeCharacter{2118}{\ensuremath\wp}% \DeclareUnicodeCharacter{211C}{\ensuremath\Re}% \DeclareUnicodeCharacter{2135}{\ensuremath\aleph}% \DeclareUnicodeCharacter{2190}{\ensuremath\leftarrow}% \DeclareUnicodeCharacter{2191}{\ensuremath\uparrow}% \DeclareUnicodeCharacter{2193}{\ensuremath\downarrow}% \DeclareUnicodeCharacter{2194}{\ensuremath\leftrightarrow}% \DeclareUnicodeCharacter{2195}{\ensuremath\updownarrow}% \DeclareUnicodeCharacter{2196}{\ensuremath\nwarrow}% \DeclareUnicodeCharacter{2197}{\ensuremath\nearrow}% \DeclareUnicodeCharacter{2198}{\ensuremath\searrow}% \DeclareUnicodeCharacter{2199}{\ensuremath\swarrow}% \DeclareUnicodeCharacter{21A6}{\ensuremath\mapsto}% \DeclareUnicodeCharacter{21A9}{\ensuremath\hookleftarrow}% \DeclareUnicodeCharacter{21AA}{\ensuremath\hookrightarrow}% \DeclareUnicodeCharacter{21BC}{\ensuremath\leftharpoonup}% \DeclareUnicodeCharacter{21BD}{\ensuremath\leftharpoondown}% \DeclareUnicodeCharacter{21C0}{\ensuremath\rightharpoonup}% \DeclareUnicodeCharacter{21C1}{\ensuremath\rightharpoondown}% \DeclareUnicodeCharacter{21CC}{\ensuremath\rightleftharpoons}% \DeclareUnicodeCharacter{21D0}{\ensuremath\Leftarrow}% \DeclareUnicodeCharacter{21D1}{\ensuremath\Uparrow}% \DeclareUnicodeCharacter{21D3}{\ensuremath\Downarrow}% \DeclareUnicodeCharacter{21D4}{\ensuremath\Leftrightarrow}% \DeclareUnicodeCharacter{21D5}{\ensuremath\Updownarrow}% \DeclareUnicodeCharacter{2202}{\ensuremath\partial}% \DeclareUnicodeCharacter{2205}{\ensuremath\emptyset}% \DeclareUnicodeCharacter{2207}{\ensuremath\nabla}% \DeclareUnicodeCharacter{2209}{\ensuremath\notin}% \DeclareUnicodeCharacter{220B}{\ensuremath\owns}% \DeclareUnicodeCharacter{220F}{\ensuremath\prod}% \DeclareUnicodeCharacter{2210}{\ensuremath\coprod}% \DeclareUnicodeCharacter{2211}{\ensuremath\sum}% \DeclareUnicodeCharacter{2213}{\ensuremath\mp}% \DeclareUnicodeCharacter{2218}{\ensuremath\circ}% \DeclareUnicodeCharacter{221A}{\ensuremath\surd}% \DeclareUnicodeCharacter{221D}{\ensuremath\propto}% \DeclareUnicodeCharacter{2220}{\ensuremath\angle}% \DeclareUnicodeCharacter{2223}{\ensuremath\mid}% \DeclareUnicodeCharacter{2228}{\ensuremath\vee}% \DeclareUnicodeCharacter{222A}{\ensuremath\cup}% \DeclareUnicodeCharacter{222B}{\ensuremath\smallint}% \DeclareUnicodeCharacter{222E}{\ensuremath\oint}% \DeclareUnicodeCharacter{223C}{\ensuremath\sim}% \DeclareUnicodeCharacter{2240}{\ensuremath\wr}% \DeclareUnicodeCharacter{2243}{\ensuremath\simeq}% \DeclareUnicodeCharacter{2245}{\ensuremath\cong}% \DeclareUnicodeCharacter{2248}{\ensuremath\approx}% \DeclareUnicodeCharacter{224D}{\ensuremath\asymp}% \DeclareUnicodeCharacter{2250}{\ensuremath\doteq}% \DeclareUnicodeCharacter{2260}{\ensuremath\neq}% \DeclareUnicodeCharacter{226A}{\ensuremath\ll}% \DeclareUnicodeCharacter{226B}{\ensuremath\gg}% \DeclareUnicodeCharacter{227A}{\ensuremath\prec}% \DeclareUnicodeCharacter{227B}{\ensuremath\succ}% \DeclareUnicodeCharacter{2283}{\ensuremath\supset}% \DeclareUnicodeCharacter{2286}{\ensuremath\subseteq}% \DeclareUnicodeCharacter{228E}{\ensuremath\uplus}% \DeclareUnicodeCharacter{2291}{\ensuremath\sqsubseteq}% \DeclareUnicodeCharacter{2292}{\ensuremath\sqsupseteq}% \DeclareUnicodeCharacter{2293}{\ensuremath\sqcap}% \DeclareUnicodeCharacter{2294}{\ensuremath\sqcup}% \DeclareUnicodeCharacter{2295}{\ensuremath\oplus}% \DeclareUnicodeCharacter{2296}{\ensuremath\ominus}% \DeclareUnicodeCharacter{2297}{\ensuremath\otimes}% \DeclareUnicodeCharacter{2298}{\ensuremath\oslash}% \DeclareUnicodeCharacter{2299}{\ensuremath\odot}% \DeclareUnicodeCharacter{22A2}{\ensuremath\vdash}% \DeclareUnicodeCharacter{22A3}{\ensuremath\dashv}% \DeclareUnicodeCharacter{22A4}{\ensuremath\ptextop}% \DeclareUnicodeCharacter{22A5}{\ensuremath\bot}% \DeclareUnicodeCharacter{22A8}{\ensuremath\models}% \DeclareUnicodeCharacter{22C0}{\ensuremath\bigwedge}% \DeclareUnicodeCharacter{22C1}{\ensuremath\bigvee}% \DeclareUnicodeCharacter{22C2}{\ensuremath\bigcap}% \DeclareUnicodeCharacter{22C3}{\ensuremath\bigcup}% \DeclareUnicodeCharacter{22C4}{\ensuremath\diamond}% \DeclareUnicodeCharacter{22C5}{\ensuremath\cdot}% \DeclareUnicodeCharacter{22C6}{\ensuremath\star}% \DeclareUnicodeCharacter{22C8}{\ensuremath\bowtie}% \DeclareUnicodeCharacter{2308}{\ensuremath\lceil}% \DeclareUnicodeCharacter{2309}{\ensuremath\rceil}% \DeclareUnicodeCharacter{230A}{\ensuremath\lfloor}% \DeclareUnicodeCharacter{230B}{\ensuremath\rfloor}% \DeclareUnicodeCharacter{2322}{\ensuremath\frown}% \DeclareUnicodeCharacter{2323}{\ensuremath\smile}% % \DeclareUnicodeCharacter{25B3}{\ensuremath\triangle}% \DeclareUnicodeCharacter{25B7}{\ensuremath\triangleright}% \DeclareUnicodeCharacter{25BD}{\ensuremath\bigtriangledown}% \DeclareUnicodeCharacter{25C1}{\ensuremath\triangleleft}% \DeclareUnicodeCharacter{25C7}{\ensuremath\diamond}% \DeclareUnicodeCharacter{2660}{\ensuremath\spadesuit}% \DeclareUnicodeCharacter{2661}{\ensuremath\heartsuit}% \DeclareUnicodeCharacter{2662}{\ensuremath\diamondsuit}% \DeclareUnicodeCharacter{2663}{\ensuremath\clubsuit}% \DeclareUnicodeCharacter{266D}{\ensuremath\flat}% \DeclareUnicodeCharacter{266E}{\ensuremath\natural}% \DeclareUnicodeCharacter{266F}{\ensuremath\sharp}% \DeclareUnicodeCharacter{26AA}{\ensuremath\bigcirc}% \DeclareUnicodeCharacter{27B9}{\ensuremath\rangle}% \DeclareUnicodeCharacter{27C2}{\ensuremath\perp}% \DeclareUnicodeCharacter{27E8}{\ensuremath\langle}% \DeclareUnicodeCharacter{27F5}{\ensuremath\longleftarrow}% \DeclareUnicodeCharacter{27F6}{\ensuremath\longrightarrow}% \DeclareUnicodeCharacter{27F7}{\ensuremath\longleftrightarrow}% \DeclareUnicodeCharacter{27FC}{\ensuremath\longmapsto}% \DeclareUnicodeCharacter{29F5}{\ensuremath\setminus}% \DeclareUnicodeCharacter{2A00}{\ensuremath\bigodot}% \DeclareUnicodeCharacter{2A01}{\ensuremath\bigoplus}% \DeclareUnicodeCharacter{2A02}{\ensuremath\bigotimes}% \DeclareUnicodeCharacter{2A04}{\ensuremath\biguplus}% \DeclareUnicodeCharacter{2A06}{\ensuremath\bigsqcup}% \DeclareUnicodeCharacter{2A3F}{\ensuremath\amalg}% \DeclareUnicodeCharacter{2AAF}{\ensuremath\preceq}% \DeclareUnicodeCharacter{2AB0}{\ensuremath\succeq}% % \global\mathchardef\checkmark="1370% actually the square root sign \DeclareUnicodeCharacter{2713}{\ensuremath\checkmark}% }% end of \unicodechardefs % UTF-8 byte sequence (pdfTeX) definitions (replacing and @U command) % It makes the setting that replace UTF-8 byte sequence. \def\utfeightchardefs{% \let\DeclareUnicodeCharacter\DeclareUnicodeCharacterUTFviii \unicodechardefs } % Whether the active definitions of non-ASCII characters expand to % non-active tokens with the same character code. This is used to % write characters literally, instead of using active definitions for % printing the correct glyphs. \newif\ifpassthroughchars \passthroughcharsfalse % For native Unicode handling (XeTeX and LuaTeX), % provide a definition macro to replace/pass-through a Unicode character % \def\DeclareUnicodeCharacterNative#1#2{% \catcode"#1=\active \def\dodeclareunicodecharacternative##1##2##3{% \begingroup \uccode`\~="##2\relax \uppercase{\gdef~}{% \ifpassthroughchars ##1% \else ##3% \fi } \endgroup } \begingroup \uccode`\.="#1\relax \uppercase{\def\UTFNativeTmp{.}}% \expandafter\dodeclareunicodecharacternative\UTFNativeTmp{#1}{#2}% \endgroup } % Native Unicode handling (XeTeX and LuaTeX) character replacing definition. % It activates the setting that replaces Unicode characters. \def\nativeunicodechardefs{% \let\DeclareUnicodeCharacter\DeclareUnicodeCharacterNative \unicodechardefs } % For native Unicode handling (XeTeX and LuaTeX), % make the character token expand % to the sequences given in \unicodechardefs for printing. \def\DeclareUnicodeCharacterNativeAtU#1#2{% \def\UTFAtUTmp{#2} \expandafter\globallet\csname uni:#1\endcsname \UTFAtUTmp } % @U command definitions for native Unicode handling (XeTeX and LuaTeX). \def\nativeunicodechardefsatu{% \let\DeclareUnicodeCharacter\DeclareUnicodeCharacterNativeAtU \unicodechardefs } % US-ASCII character definitions. \def\asciichardefs{% nothing need be done \relax } % Define all Unicode characters we know about. This makes UTF-8 the default % input encoding and allows @U to work. \iftxinativeunicodecapable \nativeunicodechardefsatu \else \utfeightchardefs \fi \message{formatting,} \newdimen\defaultparindent \defaultparindent = 15pt \chapheadingskip = 15pt plus 4pt minus 2pt \secheadingskip = 12pt plus 3pt minus 2pt \subsecheadingskip = 9pt plus 2pt minus 2pt % Prevent underfull vbox error messages. \vbadness = 10000 % Don't be very finicky about underfull hboxes, either. \hbadness = 6666 % Following George Bush, get rid of widows and orphans. \widowpenalty=10000 \clubpenalty=10000 % Use TeX 3.0's \emergencystretch to help line breaking, but if we're % using an old version of TeX, don't do anything. We want the amount of % stretch added to depend on the line length, hence the dependence on % \hsize. We call this whenever the paper size is set. % \def\setemergencystretch{% \ifx\emergencystretch\thisisundefined % Allow us to assign to \emergencystretch anyway. \def\emergencystretch{\dimen0}% \else \emergencystretch = .15\hsize \fi } % Parameters in order: 1) textheight; 2) textwidth; % 3) voffset; 4) hoffset; 5) binding offset; 6) topskip; % 7) physical page height; 8) physical page width. % % We also call \setleading{\textleading}, so the caller should define % \textleading. The caller should also set \parskip. % \def\internalpagesizes#1#2#3#4#5#6#7#8{% \voffset = #3\relax \topskip = #6\relax \splittopskip = \topskip % \vsize = #1\relax \advance\vsize by \topskip \outervsize = \vsize \advance\outervsize by 2\topandbottommargin \txipageheight = \vsize % \hsize = #2\relax \outerhsize = \hsize \advance\outerhsize by 0.5in \txipagewidth = \hsize % \normaloffset = #4\relax \bindingoffset = #5\relax % \ifpdf \pdfpageheight #7\relax \pdfpagewidth #8\relax % if we don't reset these, they will remain at "1 true in" of % whatever layout pdftex was dumped with. \pdfhorigin = 1 true in \pdfvorigin = 1 true in \else \ifx\XeTeXrevision\thisisundefined \special{papersize=#8,#7}% \else \pdfpageheight #7\relax \pdfpagewidth #8\relax % XeTeX does not have \pdfhorigin and \pdfvorigin. \fi \fi % \setleading{\textleading} % \parindent = \defaultparindent \setemergencystretch } % @letterpaper (the default). \def\letterpaper{{\globaldefs = 1 \parskip = 3pt plus 2pt minus 1pt \textleading = 13.2pt % % If page is nothing but text, make it come out even. \internalpagesizes{607.2pt}{6in}% that's 46 lines {\voffset}{.25in}% {\bindingoffset}{36pt}% {11in}{8.5in}% }} % Use @smallbook to reset parameters for 7x9.25 trim size. \def\smallbook{{\globaldefs = 1 \parskip = 2pt plus 1pt \textleading = 12pt % \internalpagesizes{7.5in}{5in}% {-.2in}{0in}% {\bindingoffset}{16pt}% {9.25in}{7in}% % \lispnarrowing = 0.3in \tolerance = 700 \contentsrightmargin = 0pt \defbodyindent = .5cm }} % Use @afourpaper to print on European A4 paper. \def\afourpaper{{\globaldefs = 1 \parskip = 3pt plus 2pt minus 1pt \textleading = 13.2pt % % Double-side printing via postscript on Laserjet 4050 % prints double-sided nicely when \bindingoffset=10mm and \hoffset=-6mm. % To change the settings for a different printer or situation, adjust % \normaloffset until the front-side and back-side texts align. Then % do the same for \bindingoffset. You can set these for testing in % your texinfo source file like this: % @tex % \global\normaloffset = -6mm % \global\bindingoffset = 10mm % @end tex \internalpagesizes{673.2pt}{160mm}% that's 51 lines {\voffset}{\hoffset}% {\bindingoffset}{44pt}% {297mm}{210mm}% % \tolerance = 700 \contentsrightmargin = 0pt \defbodyindent = 5mm }} % Use @afivepaper to print on European A5 paper. % From romildo@urano.iceb.ufop.br, 2 July 2000. % He also recommends making @example and @lisp be small. \def\afivepaper{{\globaldefs = 1 \parskip = 2pt plus 1pt minus 0.1pt \textleading = 12.5pt % \internalpagesizes{160mm}{120mm}% {\voffset}{\hoffset}% {\bindingoffset}{8pt}% {210mm}{148mm}% % \lispnarrowing = 0.2in \tolerance = 800 \contentsrightmargin = 0pt \defbodyindent = 2mm \tableindent = 12mm }} % A specific text layout, 24x15cm overall, intended for A4 paper. \def\afourlatex{{\globaldefs = 1 \afourpaper \internalpagesizes{237mm}{150mm}% {\voffset}{4.6mm}% {\bindingoffset}{7mm}% {297mm}{210mm}% % % Must explicitly reset to 0 because we call \afourpaper. \globaldefs = 0 }} % Use @afourwide to print on A4 paper in landscape format. \def\afourwide{{\globaldefs = 1 \afourpaper \internalpagesizes{241mm}{165mm}% {\voffset}{-2.95mm}% {\bindingoffset}{7mm}% {297mm}{210mm}% \globaldefs = 0 }} \def\bsixpaper{{\globaldefs = 1 \afourpaper \internalpagesizes{140mm}{100mm}% {-6.35mm}{-12.7mm}% {\bindingoffset}{14pt}% {176mm}{125mm}% \let\SETdispenvsize=\smallword \lispnarrowing = 0.2in \globaldefs = 0 }} % @pagesizes TEXTHEIGHT[,TEXTWIDTH] % Perhaps we should allow setting the margins, \topskip, \parskip, % and/or leading, also. Or perhaps we should compute them somehow. % \parseargdef\pagesizes{\pagesizesyyy #1,,\finish} \def\pagesizesyyy#1,#2,#3\finish{{% \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi \globaldefs = 1 % \parskip = 3pt plus 2pt minus 1pt \setleading{\textleading}% % \dimen0 = #1\relax \advance\dimen0 by 2.5in % default 1in margin above heading line % and 1.5in to include heading, footing and % bottom margin % \dimen2 = \hsize \advance\dimen2 by 2in % default to 1 inch margin on each side % \internalpagesizes{#1}{\hsize}% {\voffset}{\normaloffset}% {\bindingoffset}{44pt}% {\dimen0}{\dimen2}% }} % Set default to letter. % \letterpaper % Default value of \hfuzz, for suppressing warnings about overfull hboxes. \hfuzz = 1pt \message{and turning on texinfo input format.} \def^^L{\par} % remove \outer, so ^L can appear in an @comment % DEL is a comment character, in case @c does not suffice. \catcode`\^^? = 14 % Define macros to output various characters with catcode for normal text. \catcode`\"=\other \def\normaldoublequote{"} \catcode`\$=\other \def\normaldollar{$}%$ font-lock fix \catcode`\+=\other \def\normalplus{+} \catcode`\<=\other \def\normalless{<} \catcode`\>=\other \def\normalgreater{>} \catcode`\^=\other \def\normalcaret{^} \catcode`\_=\other \def\normalunderscore{_} \catcode`\|=\other \def\normalverticalbar{|} \catcode`\~=\other \def\normaltilde{~} % This macro is used to make a character print one way in \tt % (where it can probably be output as-is), and another way in other fonts, % where something hairier probably needs to be done. % % #1 is what to print if we are indeed using \tt; #2 is what to print % otherwise. Since all the Computer Modern typewriter fonts have zero % interword stretch (and shrink), and it is reasonable to expect all % typewriter fonts to have this, we can check that font parameter. % \def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi} % Same as above, but check for italic font. Actually this also catches % non-italic slanted fonts since it is impossible to distinguish them from % italic fonts. But since this is only used by $ and it uses \sl anyway % this is not a problem. \def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi} % Set catcodes for Texinfo file % Active characters for printing the wanted glyph. % Most of these we simply print from the \tt font, but for some, we can % use math or other variants that look better in normal text. % \catcode`\"=\active \def\activedoublequote{{\tt\char34}} \let"=\activedoublequote \catcode`\~=\active \def\activetilde{{\tt\char126}} \let~ = \activetilde \chardef\hatchar=`\^ \catcode`\^=\active \def\activehat{{\tt \hatchar}} \let^ = \activehat \catcode`\_=\active \def_{\ifusingtt\normalunderscore\_} \def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em } \let\realunder=_ \catcode`\|=\active \def|{{\tt\char124}} \chardef \less=`\< \catcode`\<=\active \def\activeless{{\tt \less}}\let< = \activeless \chardef \gtr=`\> \catcode`\>=\active \def\activegtr{{\tt \gtr}}\let> = \activegtr \catcode`\+=\active \def+{{\tt \char 43}} \catcode`\$=\active \def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix \catcode`\-=\active \let-=\normaldash % used for headline/footline in the output routine, in case the page % breaks in the middle of an @tex block. \def\texinfochars{% \let< = \activeless \let> = \activegtr \let~ = \activetilde \let^ = \activehat \setregularquotes \let\b = \strong \let\i = \smartitalic % in principle, all other definitions in \tex have to be undone too. } % Used sometimes to turn off (effectively) the active characters even after % parsing them. \def\turnoffactive{% \normalturnoffactive \otherbackslash } \catcode`\@=0 % \backslashcurfont outputs one backslash character in current font, % as in \char`\\. \global\chardef\backslashcurfont=`\\ % \realbackslash is an actual character `\' with catcode other. {\catcode`\\=\other @gdef@realbackslash{\}} % In Texinfo, backslash is an active character; it prints the backslash % in fixed width font. \catcode`\\=\active % @ for escape char from now on. % Print a typewriter backslash. For math mode, we can't simply use % \backslashcurfont: the story here is that in math mode, the \char % of \backslashcurfont ends up printing the roman \ from the math symbol % font (because \char in math mode uses the \mathcode, and plain.tex % sets \mathcode`\\="026E). Hence we use an explicit \mathchar, % which is the decimal equivalent of "715c (class 7, e.g., use \fam; % ignored family value; char position "5C). We can't use " for the % usual hex value because it has already been made active. @def@ttbackslash{{@tt @ifmmode @mathchar29020 @else @backslashcurfont @fi}} @let@backslashchar = @ttbackslash % @backslashchar{} is for user documents. % \otherbackslash defines an active \ to be a literal `\' character with % catcode other. @gdef@otherbackslash{@let\=@realbackslash} % Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of % the literal character `\'. % {@catcode`- = @active @gdef@normalturnoffactive{% @passthroughcharstrue @let-=@normaldash @let"=@normaldoublequote @let$=@normaldollar %$ font-lock fix @let+=@normalplus @let<=@normalless @let>=@normalgreater @let^=@normalcaret @let_=@normalunderscore @let|=@normalverticalbar @let~=@normaltilde @let\=@ttbackslash @setregularquotes @unsepspaces } } % If a .fmt file is being used, characters that might appear in a file % name cannot be active until we have parsed the command line. % So turn them off again, and have @fixbackslash turn them back on. @catcode`+=@other @catcode`@_=@other % \enablebackslashhack - allow file to begin `\input texinfo' % % If a .fmt file is being used, we don't want the `\input texinfo' to show up. % That is what \eatinput is for; after that, the `\' should revert to printing % a backslash. % If the file did not have a `\input texinfo', then it is turned off after % the first line; otherwise the first `\' in the file would cause an error. % This is used on the very last line of this file, texinfo.tex. % We also use @c to call @fixbackslash, in case ends of lines are hidden. { @catcode`@^=7 @catcode`@^^M=13@gdef@enablebackslashhack{% @global@let\ = @eatinput% @catcode`@^^M=13% @def@c{@fixbackslash@c}% % Definition for the newline at the end of this file. @def ^^M{@let^^M@secondlinenl}% % Definition for a newline in the main Texinfo file. @gdef @secondlinenl{@fixbackslash}% % In case the first line has a whole-line command on it @let@originalparsearg@parsearg @def@parsearg{@fixbackslash@originalparsearg} }} {@catcode`@^=7 @catcode`@^^M=13% @gdef@eatinput input texinfo#1^^M{@fixbackslash}} % Emergency active definition of newline, in case an active newline token % appears by mistake. {@catcode`@^=7 @catcode13=13% @gdef@enableemergencynewline{% @gdef^^M{% @par% %@par% }}} @gdef@fixbackslash{% @ifx\@eatinput @let\ = @ttbackslash @fi @catcode13=5 % regular end of line @enableemergencynewline @let@c=@comment @let@parsearg@originalparsearg % Also turn back on active characters that might appear in the input % file name, in case not using a pre-dumped format. @catcode`+=@active @catcode`@_=@active % % If texinfo.cnf is present on the system, read it. % Useful for site-wide @afourpaper, etc. This macro, @fixbackslash, gets % called at the beginning of every Texinfo file. Not opening texinfo.cnf % directly in this file, texinfo.tex, makes it possible to make a format % file for Texinfo. % @openin 1 texinfo.cnf @ifeof 1 @else @input texinfo.cnf @fi @closein 1 } % Say @foo, not \foo, in error messages. @escapechar = `@@ % These (along with & and #) are made active for url-breaking, so need % active definitions as the normal characters. @def@normaldot{.} @def@normalquest{?} @def@normalslash{/} % These look ok in all fonts, so just make them not special. % @hashchar{} gets its own user-level command, because of #line. @catcode`@& = @other @def@normalamp{&} @catcode`@# = @other @def@normalhash{#} @catcode`@% = @other @def@normalpercent{%} @let @hashchar = @normalhash @c Finally, make ` and ' active, so that txicodequoteundirected and @c txicodequotebacktick work right in, e.g., @w{@code{`foo'}}. If we @c don't make ` and ' active, @code will not get them as active chars. @c Do this last of all since we use ` in the previous @catcode assignments. @catcode`@'=@active @catcode`@`=@active @setregularquotes @c Local variables: @c eval: (add-hook 'before-save-hook 'time-stamp nil t) @c time-stamp-pattern: "texinfoversion{%Y-%02m-%02d.%02H}" @c page-delimiter: "^\\\\message\\|emacs-page" @c End: @c vim:sw=2: @enablebackslashhack grub-2.14~git20250718.0e36779/build-aux/depcomp0000755000175000017500000005577615036447566015311 00000000000000#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2018-03-07.03; # UTC # Copyright (C) 1999-2022 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by 'PROGRAMS ARGS'. object Object file output by 'PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputting dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac # Get the directory component of the given path, and save it in the # global variables '$dir'. Note that this directory component will # be either empty or ending with a '/' character. This is deliberate. set_dir_from () { case $1 in */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; *) dir=;; esac } # Get the suffix-stripped basename of the given path, and save it the # global variable '$base'. set_base_from () { base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` } # If no dependency file was actually created by the compiler invocation, # we still have to create a dummy depfile, to avoid errors with the # Makefile "include basename.Plo" scheme. make_dummy_depfile () { echo "#dummy" > "$depfile" } # Factor out some common post-processing of the generated depfile. # Requires the auxiliary global variable '$tmpdepfile' to be set. aix_post_process_depfile () { # If the compiler actually managed to produce a dependency file, # post-process it. if test -f "$tmpdepfile"; then # Each line is of the form 'foo.o: dependency.h'. # Do two passes, one to just change these to # $object: dependency.h # and one to simply output # dependency.h: # which is needed to avoid the deleted-header problem. { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" } > "$depfile" rm -f "$tmpdepfile" else make_dummy_depfile fi } # A tabulation character. tab=' ' # A newline character. nl=' ' # Character ranges might be problematic outside the C locale. # These definitions help. upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ lower=abcdefghijklmnopqrstuvwxyz alpha=${upper}${lower} if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Avoid interferences from the environment. gccflag= dashmflag= # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi cygpath_u="cygpath -u -f -" if test "$depmode" = msvcmsys; then # This is just like msvisualcpp but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvisualcpp fi if test "$depmode" = msvc7msys; then # This is just like msvc7 but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvc7 fi if test "$depmode" = xlc; then # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. gccflag=-qmakedep=gcc,-MF depmode=gcc fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. ## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. ## (see the conditional assignment to $gccflag above). ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). Also, it might not be ## supported by the other compilers which use the 'gcc' depmode. ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The second -e expression handles DOS-style file names with drive # letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the "deleted header file" problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. ## Some versions of gcc put a space before the ':'. On the theory ## that the space means something, we add a space to the output as ## well. hp depmode also adds that space, but also prefixes the VPATH ## to the object. Take care to not repeat it in the output. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like '#:fec' to the end of the # dependency line. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ | tr "$nl" ' ' >> "$depfile" echo >> "$depfile" # The second pass generates a dummy entry for each header file. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" ;; xlc) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts '$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u tmpdepfile3=$dir.libs/$base.u "$@" -Wc,-M else tmpdepfile1=$dir$base.u tmpdepfile2=$dir$base.u tmpdepfile3=$dir$base.u "$@" -M fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done aix_post_process_depfile ;; tcc) # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 # FIXME: That version still under development at the moment of writing. # Make that this statement remains true also for stable, released # versions. # It will wrap lines (doesn't matter whether long or short) with a # trailing '\', as in: # # foo.o : \ # foo.c \ # foo.h \ # # It will put a trailing '\' even on the last line, and will use leading # spaces rather than leading tabs (at least since its commit 0394caf7 # "Emit spaces for -MD"). "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. # We have to change lines of the first kind to '$object: \'. sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" # And for each line of the second kind, we have to emit a 'dep.h:' # dummy dependency, to avoid the deleted-header problem. sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" rm -f "$tmpdepfile" ;; ## The order of this option in the case statement is important, since the ## shell code in configure will try each of these formats in the order ## listed in this file. A plain '-MD' option would be understood by many ## compilers, so we must ensure this comes after the gcc and icc options. pgcc) # Portland's C compiler understands '-MD'. # Will always output deps to 'file.d' where file is the root name of the # source file under compilation, even if file resides in a subdirectory. # The object file name does not affect the name of the '.d' file. # pgcc 10.2 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using '\' : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... set_dir_from "$object" # Use the source, not the object, to determine the base name, since # that's sadly what pgcc will do too. set_base_from "$source" tmpdepfile=$base.d # For projects that build the same source file twice into different object # files, the pgcc approach of using the *source* file root name can cause # problems in parallel builds. Use a locking strategy to avoid stomping on # the same $tmpdepfile. lockdir=$base.d-lock trap " echo '$0: caught signal, cleaning up...' >&2 rmdir '$lockdir' exit 1 " 1 2 13 15 numtries=100 i=$numtries while test $i -gt 0; do # mkdir is a portable test-and-set. if mkdir "$lockdir" 2>/dev/null; then # This process acquired the lock. "$@" -MD stat=$? # Release the lock. rmdir "$lockdir" break else # If the lock is being held by a different process, wait # until the winning process is done or we timeout. while test -d "$lockdir" && test $i -gt 0; do sleep 1 i=`expr $i - 1` done fi i=`expr $i - 1` done trap - 1 2 13 15 if test $i -le 0; then echo "$0: failed to acquire lock after $numtries attempts" >&2 echo "$0: check lockdir '$lockdir'" >&2 exit 1 fi if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" # Add 'dependent.h:' lines. sed -ne '2,${ s/^ *// s/ \\*$// s/$/:/ p }' "$tmpdepfile" >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in 'foo.d' instead, so we check for that too. # Subdirectories are respected. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then # Libtool generates 2 separate objects for the 2 libraries. These # two compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir$base.o.d # libtool 1.5 tmpdepfile2=$dir.libs/$base.o.d # Likewise. tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d "$@" -MD fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done # Same post-processing that is required for AIX mode. aix_post_process_depfile ;; msvc7) if test "$libtool" = yes; then showIncludes=-Wc,-showIncludes else showIncludes=-showIncludes fi "$@" $showIncludes > "$tmpdepfile" stat=$? grep -v '^Note: including file: ' "$tmpdepfile" if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The first sed program below extracts the file names and escapes # backslashes for cygpath. The second sed program outputs the file # name when reading, but also accumulates all include files in the # hold buffer in order to output them again at the end. This only # works with sed implementations that can handle large buffers. sed < "$tmpdepfile" -n ' /^Note: including file: *\(.*\)/ { s//\1/ s/\\/\\\\/g p }' | $cygpath_u | sort -u | sed -n ' s/ /\\ /g s/\(.*\)/'"$tab"'\1 \\/p s/.\(.*\) \\/\1:/ H $ { s/.*/'"$tab"'/ G p }' >> "$depfile" echo >> "$depfile" # make sure the fragment doesn't end with a backslash rm -f "$tmpdepfile" ;; msvc7msys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for ':' # in the target name. This is to cope with DOS-style filenames: # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. "$@" $dashmflag | sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this sed invocation # correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # X makedepend shift cleared=no eat=no for arg do case $cleared in no) set ""; shift cleared=yes ;; esac if test $eat = yes; then eat=no continue fi case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -arch) eat=yes ;; -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix=`echo "$object" | sed 's/^.*\././'` touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" # makedepend may prepend the VPATH from the source file name to the object. # No need to regex-escape $object, excess matching of '.' is harmless. sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process the last invocation # correctly. Breaking it into two sed invocations is a workaround. sed '1,2d' "$tmpdepfile" \ | tr ' ' "$nl" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E \ | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi IFS=" " for arg do case "$arg" in -o) shift ;; $object) shift ;; "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E 2>/dev/null | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" echo "$tab" >> "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; msvcmsys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: grub-2.14~git20250718.0e36779/build-aux/test-driver0000755000175000017500000001141715036452452016100 00000000000000#! /bin/sh # test-driver - basic testsuite driver script. scriptversion=2018-03-07.03; # UTC # Copyright (C) 2011-2021 Free Software Foundation, Inc. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . # Make unconditional expansion of undefined variables an error. This # helps a lot in preventing typo-related bugs. set -u usage_error () { echo "$0: $*" >&2 print_usage >&2 exit 2 } print_usage () { cat <"$log_file" "$@" >>"$log_file" 2>&1 estatus=$? if test $enable_hard_errors = no && test $estatus -eq 99; then tweaked_estatus=1 else tweaked_estatus=$estatus fi case $tweaked_estatus:$expect_failure in 0:yes) col=$red res=XPASS recheck=yes gcopy=yes;; 0:*) col=$grn res=PASS recheck=no gcopy=no;; 77:*) col=$blu res=SKIP recheck=no gcopy=yes;; 99:*) col=$mgn res=ERROR recheck=yes gcopy=yes;; *:yes) col=$lgn res=XFAIL recheck=no gcopy=yes;; *:*) col=$red res=FAIL recheck=yes gcopy=yes;; esac # Report the test outcome and exit status in the logs, so that one can # know whether the test passed or failed simply by looking at the '.log' # file, without the need of also peaking into the corresponding '.trs' # file (automake bug#11814). echo "$res $test_name (exit status: $estatus)" >>"$log_file" # Report outcome to console. echo "${col}${res}${std}: $test_name" # Register the test result, and other relevant metadata. echo ":test-result: $res" > $trs_file echo ":global-test-result: $res" >> $trs_file echo ":recheck: $recheck" >> $trs_file echo ":copy-in-global-log: $gcopy" >> $trs_file # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: grub-2.14~git20250718.0e36779/build-aux/config.guess0000755000175000017500000014051215036452451016220 00000000000000#! /bin/sh # Attempt to guess a canonical system name. # Copyright 1992-2022 Free Software Foundation, Inc. # shellcheck disable=SC2006,SC2268 # see below for rationale timestamp='2022-01-09' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # # Originally written by Per Bothner; maintained since 2000 by Ben Elliston. # # You can get the latest version of this script from: # https://git.savannah.gnu.org/cgit/config.git/plain/config.guess # # Please send patches to . # The "shellcheck disable" line above the timestamp inhibits complaints # about features and limitations of the classic Bourne shell that were # superseded or lifted in POSIX. However, this script identifies a wide # variety of pre-POSIX systems that do not have POSIX shells at all, and # even some reasonably current systems (Solaris 10 as case-in-point) still # have a pre-POSIX /bin/sh. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Options: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright 1992-2022 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi # Just in case it came from the environment. GUESS= # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. tmp= # shellcheck disable=SC2172 trap 'test -z "$tmp" || rm -fr "$tmp"' 0 1 2 13 15 set_cc_for_build() { # prevent multiple calls if $tmp is already set test "$tmp" && return 0 : "${TMPDIR=/tmp}" # shellcheck disable=SC2039,SC3028 { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir "$tmp" 2>/dev/null) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir "$tmp" 2>/dev/null) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } dummy=$tmp/dummy case ${CC_FOR_BUILD-},${HOST_CC-},${CC-} in ,,) echo "int x;" > "$dummy.c" for driver in cc gcc c89 c99 ; do if ($driver -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then CC_FOR_BUILD=$driver break fi done if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac } # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if test -f /.attbin/uname ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown case $UNAME_SYSTEM in Linux|GNU|GNU/*) LIBC=unknown set_cc_for_build cat <<-EOF > "$dummy.c" #include #if defined(__UCLIBC__) LIBC=uclibc #elif defined(__dietlibc__) LIBC=dietlibc #elif defined(__GLIBC__) LIBC=gnu #else #include /* First heuristic to detect musl libc. */ #ifdef __DEFINED_va_list LIBC=musl #endif #endif EOF cc_set_libc=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` eval "$cc_set_libc" # Second heuristic to detect musl libc. if [ "$LIBC" = unknown ] && command -v ldd >/dev/null && ldd --version 2>&1 | grep -q ^musl; then LIBC=musl fi # If the system lacks a compiler, then just pick glibc. # We could probably try harder. if [ "$LIBC" = unknown ]; then LIBC=gnu fi ;; esac # Note: order is significant - the case branches are not exclusive. case $UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ /sbin/sysctl -n hw.machine_arch 2>/dev/null || \ /usr/sbin/sysctl -n hw.machine_arch 2>/dev/null || \ echo unknown)` case $UNAME_MACHINE_ARCH in aarch64eb) machine=aarch64_be-unknown ;; armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; earmv*) arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'` endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'` machine=${arch}${endian}-unknown ;; *) machine=$UNAME_MACHINE_ARCH-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently (or will in the future) and ABI. case $UNAME_MACHINE_ARCH in earm*) os=netbsdelf ;; arm*|i386|m68k|ns32k|sh3*|sparc|vax) set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # Determine ABI tags. case $UNAME_MACHINE_ARCH in earm*) expr='s/^earmv[0-9]/-eabi/;s/eb$//' abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"` ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case $UNAME_VERSION in Debian*) release='-gnu' ;; *) release=`echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. GUESS=$machine-${os}${release}${abi-} ;; *:Bitrig:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` GUESS=$UNAME_MACHINE_ARCH-unknown-bitrig$UNAME_RELEASE ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` GUESS=$UNAME_MACHINE_ARCH-unknown-openbsd$UNAME_RELEASE ;; *:SecBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/SecBSD.//'` GUESS=$UNAME_MACHINE_ARCH-unknown-secbsd$UNAME_RELEASE ;; *:LibertyBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` GUESS=$UNAME_MACHINE_ARCH-unknown-libertybsd$UNAME_RELEASE ;; *:MidnightBSD:*:*) GUESS=$UNAME_MACHINE-unknown-midnightbsd$UNAME_RELEASE ;; *:ekkoBSD:*:*) GUESS=$UNAME_MACHINE-unknown-ekkobsd$UNAME_RELEASE ;; *:SolidBSD:*:*) GUESS=$UNAME_MACHINE-unknown-solidbsd$UNAME_RELEASE ;; *:OS108:*:*) GUESS=$UNAME_MACHINE-unknown-os108_$UNAME_RELEASE ;; macppc:MirBSD:*:*) GUESS=powerpc-unknown-mirbsd$UNAME_RELEASE ;; *:MirBSD:*:*) GUESS=$UNAME_MACHINE-unknown-mirbsd$UNAME_RELEASE ;; *:Sortix:*:*) GUESS=$UNAME_MACHINE-unknown-sortix ;; *:Twizzler:*:*) GUESS=$UNAME_MACHINE-unknown-twizzler ;; *:Redox:*:*) GUESS=$UNAME_MACHINE-unknown-redox ;; mips:OSF1:*.*) GUESS=mips-dec-osf1 ;; alpha:OSF1:*:*) # Reset EXIT trap before exiting to avoid spurious non-zero exit code. trap '' 0 case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case $ALPHA_CPU_TYPE in "EV4 (21064)") UNAME_MACHINE=alpha ;; "EV4.5 (21064)") UNAME_MACHINE=alpha ;; "LCA4 (21066/21068)") UNAME_MACHINE=alpha ;; "EV5 (21164)") UNAME_MACHINE=alphaev5 ;; "EV5.6 (21164A)") UNAME_MACHINE=alphaev56 ;; "EV5.6 (21164PC)") UNAME_MACHINE=alphapca56 ;; "EV5.7 (21164PC)") UNAME_MACHINE=alphapca57 ;; "EV6 (21264)") UNAME_MACHINE=alphaev6 ;; "EV6.7 (21264A)") UNAME_MACHINE=alphaev67 ;; "EV6.8CB (21264C)") UNAME_MACHINE=alphaev68 ;; "EV6.8AL (21264B)") UNAME_MACHINE=alphaev68 ;; "EV6.8CX (21264D)") UNAME_MACHINE=alphaev68 ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE=alphaev69 ;; "EV7 (21364)") UNAME_MACHINE=alphaev7 ;; "EV7.9 (21364A)") UNAME_MACHINE=alphaev79 ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. OSF_REL=`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` GUESS=$UNAME_MACHINE-dec-osf$OSF_REL ;; Amiga*:UNIX_System_V:4.0:*) GUESS=m68k-unknown-sysv4 ;; *:[Aa]miga[Oo][Ss]:*:*) GUESS=$UNAME_MACHINE-unknown-amigaos ;; *:[Mm]orph[Oo][Ss]:*:*) GUESS=$UNAME_MACHINE-unknown-morphos ;; *:OS/390:*:*) GUESS=i370-ibm-openedition ;; *:z/VM:*:*) GUESS=s390-ibm-zvmoe ;; *:OS400:*:*) GUESS=powerpc-ibm-os400 ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) GUESS=arm-acorn-riscix$UNAME_RELEASE ;; arm*:riscos:*:*|arm*:RISCOS:*:*) GUESS=arm-unknown-riscos ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) GUESS=hppa1.1-hitachi-hiuxmpp ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. case `(/bin/universe) 2>/dev/null` in att) GUESS=pyramid-pyramid-sysv3 ;; *) GUESS=pyramid-pyramid-bsd ;; esac ;; NILE*:*:*:dcosx) GUESS=pyramid-pyramid-svr4 ;; DRS?6000:unix:4.0:6*) GUESS=sparc-icl-nx6 ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) GUESS=sparc-icl-nx7 ;; esac ;; s390x:SunOS:*:*) SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` GUESS=$UNAME_MACHINE-ibm-solaris2$SUN_REL ;; sun4H:SunOS:5.*:*) SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` GUESS=sparc-hal-solaris2$SUN_REL ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` GUESS=sparc-sun-solaris2$SUN_REL ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) GUESS=i386-pc-auroraux$UNAME_RELEASE ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) set_cc_for_build SUN_ARCH=i386 # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if test "$CC_FOR_BUILD" != no_compiler_found; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -m64 -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH=x86_64 fi fi SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` GUESS=$SUN_ARCH-pc-solaris2$SUN_REL ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` GUESS=sparc-sun-solaris3$SUN_REL ;; sun4*:SunOS:*:*) case `/usr/bin/arch -k` in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/'` GUESS=sparc-sun-sunos$SUN_REL ;; sun3*:SunOS:*:*) GUESS=m68k-sun-sunos$UNAME_RELEASE ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3 case `/bin/arch` in sun3) GUESS=m68k-sun-sunos$UNAME_RELEASE ;; sun4) GUESS=sparc-sun-sunos$UNAME_RELEASE ;; esac ;; aushp:SunOS:*:*) GUESS=sparc-auspex-sunos$UNAME_RELEASE ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) GUESS=m68k-atari-mint$UNAME_RELEASE ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) GUESS=m68k-atari-mint$UNAME_RELEASE ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) GUESS=m68k-atari-mint$UNAME_RELEASE ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) GUESS=m68k-milan-mint$UNAME_RELEASE ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) GUESS=m68k-hades-mint$UNAME_RELEASE ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) GUESS=m68k-unknown-mint$UNAME_RELEASE ;; m68k:machten:*:*) GUESS=m68k-apple-machten$UNAME_RELEASE ;; powerpc:machten:*:*) GUESS=powerpc-apple-machten$UNAME_RELEASE ;; RISC*:Mach:*:*) GUESS=mips-dec-mach_bsd4.3 ;; RISC*:ULTRIX:*:*) GUESS=mips-dec-ultrix$UNAME_RELEASE ;; VAX*:ULTRIX*:*:*) GUESS=vax-dec-ultrix$UNAME_RELEASE ;; 2020:CLIX:*:* | 2430:CLIX:*:*) GUESS=clipper-intergraph-clix$UNAME_RELEASE ;; mips:*:*:UMIPS | mips:*:*:RISCos) set_cc_for_build sed 's/^ //' << EOF > "$dummy.c" #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o "$dummy" "$dummy.c" && dummyarg=`echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`"$dummy" "$dummyarg"` && { echo "$SYSTEM_NAME"; exit; } GUESS=mips-mips-riscos$UNAME_RELEASE ;; Motorola:PowerMAX_OS:*:*) GUESS=powerpc-motorola-powermax ;; Motorola:*:4.3:PL8-*) GUESS=powerpc-harris-powermax ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) GUESS=powerpc-harris-powermax ;; Night_Hawk:Power_UNIX:*:*) GUESS=powerpc-harris-powerunix ;; m88k:CX/UX:7*:*) GUESS=m88k-harris-cxux7 ;; m88k:*:4*:R4*) GUESS=m88k-motorola-sysv4 ;; m88k:*:3*:R3*) GUESS=m88k-motorola-sysv3 ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if test "$UNAME_PROCESSOR" = mc88100 || test "$UNAME_PROCESSOR" = mc88110 then if test "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx || \ test "$TARGET_BINARY_INTERFACE"x = x then GUESS=m88k-dg-dgux$UNAME_RELEASE else GUESS=m88k-dg-dguxbcs$UNAME_RELEASE fi else GUESS=i586-dg-dgux$UNAME_RELEASE fi ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) GUESS=m88k-dolphin-sysv3 ;; M88*:*:R3*:*) # Delta 88k system running SVR3 GUESS=m88k-motorola-sysv3 ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) GUESS=m88k-tektronix-sysv3 ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) GUESS=m68k-tektronix-bsd ;; *:IRIX*:*:*) IRIX_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/g'` GUESS=mips-sgi-irix$IRIX_REL ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. GUESS=romp-ibm-aix # uname -m gives an 8 hex-code CPU id ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) GUESS=i386-ibm-aix ;; ia64:AIX:*:*) if test -x /usr/bin/oslevel ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=$UNAME_VERSION.$UNAME_RELEASE fi GUESS=$UNAME_MACHINE-ibm-aix$IBM_REV ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then set_cc_for_build sed 's/^ //' << EOF > "$dummy.c" #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` then GUESS=$SYSTEM_NAME else GUESS=rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then GUESS=rs6000-ibm-aix3.2.4 else GUESS=rs6000-ibm-aix3.2 fi ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if test -x /usr/bin/lslpp ; then IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | \ awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` else IBM_REV=$UNAME_VERSION.$UNAME_RELEASE fi GUESS=$IBM_ARCH-ibm-aix$IBM_REV ;; *:AIX:*:*) GUESS=rs6000-ibm-aix ;; ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*) GUESS=romp-ibm-bsd4.4 ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and GUESS=romp-ibm-bsd$UNAME_RELEASE # 4.3 with uname added to ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) GUESS=rs6000-bull-bosx ;; DPX/2?00:B.O.S.:*:*) GUESS=m68k-bull-sysv3 ;; 9000/[34]??:4.3bsd:1.*:*) GUESS=m68k-hp-bsd ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) GUESS=m68k-hp-bsd4.4 ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*.[0B]*//'` case $UNAME_MACHINE in 9000/31?) HP_ARCH=m68000 ;; 9000/[34]??) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if test -x /usr/bin/getconf; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case $sc_cpu_version in 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case $sc_kernel_bits in 32) HP_ARCH=hppa2.0n ;; 64) HP_ARCH=hppa2.0w ;; '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20 esac ;; esac fi if test "$HP_ARCH" = ""; then set_cc_for_build sed 's/^ //' << EOF > "$dummy.c" #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=`"$dummy"` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if test "$HP_ARCH" = hppa2.0w then set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then HP_ARCH=hppa2.0w else HP_ARCH=hppa64 fi fi GUESS=$HP_ARCH-hp-hpux$HPUX_REV ;; ia64:HP-UX:*:*) HPUX_REV=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*.[0B]*//'` GUESS=ia64-hp-hpux$HPUX_REV ;; 3050*:HI-UX:*:*) set_cc_for_build sed 's/^ //' << EOF > "$dummy.c" #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` && { echo "$SYSTEM_NAME"; exit; } GUESS=unknown-hitachi-hiuxwe2 ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*) GUESS=hppa1.1-hp-bsd ;; 9000/8??:4.3bsd:*:*) GUESS=hppa1.0-hp-bsd ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) GUESS=hppa1.0-hp-mpeix ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*) GUESS=hppa1.1-hp-osf ;; hp8??:OSF1:*:*) GUESS=hppa1.0-hp-osf ;; i*86:OSF1:*:*) if test -x /usr/sbin/sysversion ; then GUESS=$UNAME_MACHINE-unknown-osf1mk else GUESS=$UNAME_MACHINE-unknown-osf1 fi ;; parisc*:Lites*:*:*) GUESS=hppa1.1-hp-lites ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) GUESS=c1-convex-bsd ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) GUESS=c34-convex-bsd ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) GUESS=c38-convex-bsd ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) GUESS=c4-convex-bsd ;; CRAY*Y-MP:*:*:*) CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` GUESS=ymp-cray-unicos$CRAY_REL ;; CRAY*[A-Z]90:*:*:*) echo "$UNAME_MACHINE"-cray-unicos"$UNAME_RELEASE" \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` GUESS=t90-cray-unicos$CRAY_REL ;; CRAY*T3E:*:*:*) CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` GUESS=alphaev5-cray-unicosmk$CRAY_REL ;; CRAY*SV1:*:*:*) CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` GUESS=sv1-cray-unicos$CRAY_REL ;; *:UNICOS/mp:*:*) CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` GUESS=craynv-cray-unicosmp$CRAY_REL ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` FUJITSU_REL=`echo "$UNAME_RELEASE" | sed -e 's/ /_/'` GUESS=${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL} ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` FUJITSU_REL=`echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'` GUESS=sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL} ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) GUESS=$UNAME_MACHINE-pc-bsdi$UNAME_RELEASE ;; sparc*:BSD/OS:*:*) GUESS=sparc-unknown-bsdi$UNAME_RELEASE ;; *:BSD/OS:*:*) GUESS=$UNAME_MACHINE-unknown-bsdi$UNAME_RELEASE ;; arm:FreeBSD:*:*) UNAME_PROCESSOR=`uname -p` set_cc_for_build if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabi else FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabihf fi ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` case $UNAME_PROCESSOR in amd64) UNAME_PROCESSOR=x86_64 ;; i386) UNAME_PROCESSOR=i586 ;; esac FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL ;; i*:CYGWIN*:*) GUESS=$UNAME_MACHINE-pc-cygwin ;; *:MINGW64*:*) GUESS=$UNAME_MACHINE-pc-mingw64 ;; *:MINGW*:*) GUESS=$UNAME_MACHINE-pc-mingw32 ;; *:MSYS*:*) GUESS=$UNAME_MACHINE-pc-msys ;; i*:PW*:*) GUESS=$UNAME_MACHINE-pc-pw32 ;; *:SerenityOS:*:*) GUESS=$UNAME_MACHINE-pc-serenity ;; *:Interix*:*) case $UNAME_MACHINE in x86) GUESS=i586-pc-interix$UNAME_RELEASE ;; authenticamd | genuineintel | EM64T) GUESS=x86_64-unknown-interix$UNAME_RELEASE ;; IA64) GUESS=ia64-unknown-interix$UNAME_RELEASE ;; esac ;; i*:UWIN*:*) GUESS=$UNAME_MACHINE-pc-uwin ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) GUESS=x86_64-pc-cygwin ;; prep*:SunOS:5.*:*) SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` GUESS=powerpcle-unknown-solaris2$SUN_REL ;; *:GNU:*:*) # the GNU system GNU_ARCH=`echo "$UNAME_MACHINE" | sed -e 's,[-/].*$,,'` GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's,/.*$,,'` GUESS=$GNU_ARCH-unknown-$LIBC$GNU_REL ;; *:GNU/*:*:*) # other systems with GNU libc and userland GNU_SYS=`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"` GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` GUESS=$UNAME_MACHINE-unknown-$GNU_SYS$GNU_REL-$LIBC ;; *:Minix:*:*) GUESS=$UNAME_MACHINE-unknown-minix ;; aarch64:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' /proc/cpuinfo 2>/dev/null` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC=gnulibc1 ; fi GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; arc:Linux:*:* | arceb:Linux:*:* | arc32:Linux:*:* | arc64:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; arm*:Linux:*:*) set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then GUESS=$UNAME_MACHINE-unknown-linux-$LIBC else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabi else GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabihf fi fi ;; avr32*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; cris:Linux:*:*) GUESS=$UNAME_MACHINE-axis-linux-$LIBC ;; crisv32:Linux:*:*) GUESS=$UNAME_MACHINE-axis-linux-$LIBC ;; e2k:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; frv:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; hexagon:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; i*86:Linux:*:*) GUESS=$UNAME_MACHINE-pc-linux-$LIBC ;; ia64:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; k1om:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; loongarch32:Linux:*:* | loongarch64:Linux:*:* | loongarchx32:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; m32r*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; m68*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; mips:Linux:*:* | mips64:Linux:*:*) set_cc_for_build IS_GLIBC=0 test x"${LIBC}" = xgnu && IS_GLIBC=1 sed 's/^ //' << EOF > "$dummy.c" #undef CPU #undef mips #undef mipsel #undef mips64 #undef mips64el #if ${IS_GLIBC} && defined(_ABI64) LIBCABI=gnuabi64 #else #if ${IS_GLIBC} && defined(_ABIN32) LIBCABI=gnuabin32 #else LIBCABI=${LIBC} #endif #endif #if ${IS_GLIBC} && defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 CPU=mipsisa64r6 #else #if ${IS_GLIBC} && !defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 CPU=mipsisa32r6 #else #if defined(__mips64) CPU=mips64 #else CPU=mips #endif #endif #endif #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) MIPS_ENDIAN=el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) MIPS_ENDIAN= #else MIPS_ENDIAN= #endif #endif EOF cc_set_vars=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU\|^MIPS_ENDIAN\|^LIBCABI'` eval "$cc_set_vars" test "x$CPU" != x && { echo "$CPU${MIPS_ENDIAN}-unknown-linux-$LIBCABI"; exit; } ;; mips64el:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; openrisc*:Linux:*:*) GUESS=or1k-unknown-linux-$LIBC ;; or32:Linux:*:* | or1k*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; padre:Linux:*:*) GUESS=sparc-unknown-linux-$LIBC ;; parisc64:Linux:*:* | hppa64:Linux:*:*) GUESS=hppa64-unknown-linux-$LIBC ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) GUESS=hppa1.1-unknown-linux-$LIBC ;; PA8*) GUESS=hppa2.0-unknown-linux-$LIBC ;; *) GUESS=hppa-unknown-linux-$LIBC ;; esac ;; ppc64:Linux:*:*) GUESS=powerpc64-unknown-linux-$LIBC ;; ppc:Linux:*:*) GUESS=powerpc-unknown-linux-$LIBC ;; ppc64le:Linux:*:*) GUESS=powerpc64le-unknown-linux-$LIBC ;; ppcle:Linux:*:*) GUESS=powerpcle-unknown-linux-$LIBC ;; riscv32:Linux:*:* | riscv32be:Linux:*:* | riscv64:Linux:*:* | riscv64be:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; s390:Linux:*:* | s390x:Linux:*:*) GUESS=$UNAME_MACHINE-ibm-linux-$LIBC ;; sh64*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; sh*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; sparc:Linux:*:* | sparc64:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; tile*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; vax:Linux:*:*) GUESS=$UNAME_MACHINE-dec-linux-$LIBC ;; x86_64:Linux:*:*) set_cc_for_build LIBCABI=$LIBC if test "$CC_FOR_BUILD" != no_compiler_found; then if (echo '#ifdef __ILP32__'; echo IS_X32; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_X32 >/dev/null then LIBCABI=${LIBC}x32 fi fi GUESS=$UNAME_MACHINE-pc-linux-$LIBCABI ;; xtensa*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. GUESS=i386-sequent-sysv4 ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. GUESS=$UNAME_MACHINE-pc-sysv4.2uw$UNAME_VERSION ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. GUESS=$UNAME_MACHINE-pc-os2-emx ;; i*86:XTS-300:*:STOP) GUESS=$UNAME_MACHINE-unknown-stop ;; i*86:atheos:*:*) GUESS=$UNAME_MACHINE-unknown-atheos ;; i*86:syllable:*:*) GUESS=$UNAME_MACHINE-pc-syllable ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) GUESS=i386-unknown-lynxos$UNAME_RELEASE ;; i*86:*DOS:*:*) GUESS=$UNAME_MACHINE-pc-msdosdjgpp ;; i*86:*:4.*:*) UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then GUESS=$UNAME_MACHINE-univel-sysv$UNAME_REL else GUESS=$UNAME_MACHINE-pc-sysv$UNAME_REL fi ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac GUESS=$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 GUESS=$UNAME_MACHINE-pc-sco$UNAME_REL else GUESS=$UNAME_MACHINE-pc-sysv32 fi ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configure will decide that # this is a cross-build. GUESS=i586-pc-msdosdjgpp ;; Intel:Mach:3*:*) GUESS=i386-pc-mach3 ;; paragon:*:*:*) GUESS=i860-intel-osf1 ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then GUESS=i860-stardent-sysv$UNAME_RELEASE # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. GUESS=i860-unknown-sysv$UNAME_RELEASE # Unknown i860-SVR4 fi ;; mini*:CTIX:SYS*5:*) # "miniframe" GUESS=m68010-convergent-sysv ;; mc68k:UNIX:SYSTEM5:3.51m) GUESS=m68k-convergent-sysv ;; M680?0:D-NIX:5.3:*) GUESS=m68k-diab-dnix ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) GUESS=m68k-unknown-lynxos$UNAME_RELEASE ;; mc68030:UNIX_System_V:4.*:*) GUESS=m68k-atari-sysv4 ;; TSUNAMI:LynxOS:2.*:*) GUESS=sparc-unknown-lynxos$UNAME_RELEASE ;; rs6000:LynxOS:2.*:*) GUESS=rs6000-unknown-lynxos$UNAME_RELEASE ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) GUESS=powerpc-unknown-lynxos$UNAME_RELEASE ;; SM[BE]S:UNIX_SV:*:*) GUESS=mips-dde-sysv$UNAME_RELEASE ;; RM*:ReliantUNIX-*:*:*) GUESS=mips-sni-sysv4 ;; RM*:SINIX-*:*:*) GUESS=mips-sni-sysv4 ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` GUESS=$UNAME_MACHINE-sni-sysv4 else GUESS=ns32k-sni-sysv fi ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says GUESS=i586-unisys-sysv4 ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm GUESS=hppa1.1-stratus-sysv4 ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. GUESS=i860-stratus-sysv4 ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. GUESS=$UNAME_MACHINE-stratus-vos ;; *:VOS:*:*) # From Paul.Green@stratus.com. GUESS=hppa1.1-stratus-vos ;; mc68*:A/UX:*:*) GUESS=m68k-apple-aux$UNAME_RELEASE ;; news*:NEWS-OS:6*:*) GUESS=mips-sony-newsos6 ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if test -d /usr/nec; then GUESS=mips-nec-sysv$UNAME_RELEASE else GUESS=mips-unknown-sysv$UNAME_RELEASE fi ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. GUESS=powerpc-be-beos ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. GUESS=powerpc-apple-beos ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. GUESS=i586-pc-beos ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. GUESS=i586-pc-haiku ;; x86_64:Haiku:*:*) GUESS=x86_64-unknown-haiku ;; SX-4:SUPER-UX:*:*) GUESS=sx4-nec-superux$UNAME_RELEASE ;; SX-5:SUPER-UX:*:*) GUESS=sx5-nec-superux$UNAME_RELEASE ;; SX-6:SUPER-UX:*:*) GUESS=sx6-nec-superux$UNAME_RELEASE ;; SX-7:SUPER-UX:*:*) GUESS=sx7-nec-superux$UNAME_RELEASE ;; SX-8:SUPER-UX:*:*) GUESS=sx8-nec-superux$UNAME_RELEASE ;; SX-8R:SUPER-UX:*:*) GUESS=sx8r-nec-superux$UNAME_RELEASE ;; SX-ACE:SUPER-UX:*:*) GUESS=sxace-nec-superux$UNAME_RELEASE ;; Power*:Rhapsody:*:*) GUESS=powerpc-apple-rhapsody$UNAME_RELEASE ;; *:Rhapsody:*:*) GUESS=$UNAME_MACHINE-apple-rhapsody$UNAME_RELEASE ;; arm64:Darwin:*:*) GUESS=aarch64-apple-darwin$UNAME_RELEASE ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` case $UNAME_PROCESSOR in unknown) UNAME_PROCESSOR=powerpc ;; esac if command -v xcode-select > /dev/null 2> /dev/null && \ ! xcode-select --print-path > /dev/null 2> /dev/null ; then # Avoid executing cc if there is no toolchain installed as # cc will be a stub that puts up a graphical alert # prompting the user to install developer tools. CC_FOR_BUILD=no_compiler_found else set_cc_for_build fi if test "$CC_FOR_BUILD" != no_compiler_found; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then case $UNAME_PROCESSOR in i386) UNAME_PROCESSOR=x86_64 ;; powerpc) UNAME_PROCESSOR=powerpc64 ;; esac fi # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_PPC >/dev/null then UNAME_PROCESSOR=powerpc fi elif test "$UNAME_PROCESSOR" = i386 ; then # uname -m returns i386 or x86_64 UNAME_PROCESSOR=$UNAME_MACHINE fi GUESS=$UNAME_PROCESSOR-apple-darwin$UNAME_RELEASE ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = x86; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi GUESS=$UNAME_PROCESSOR-$UNAME_MACHINE-nto-qnx$UNAME_RELEASE ;; *:QNX:*:4*) GUESS=i386-pc-qnx ;; NEO-*:NONSTOP_KERNEL:*:*) GUESS=neo-tandem-nsk$UNAME_RELEASE ;; NSE-*:NONSTOP_KERNEL:*:*) GUESS=nse-tandem-nsk$UNAME_RELEASE ;; NSR-*:NONSTOP_KERNEL:*:*) GUESS=nsr-tandem-nsk$UNAME_RELEASE ;; NSV-*:NONSTOP_KERNEL:*:*) GUESS=nsv-tandem-nsk$UNAME_RELEASE ;; NSX-*:NONSTOP_KERNEL:*:*) GUESS=nsx-tandem-nsk$UNAME_RELEASE ;; *:NonStop-UX:*:*) GUESS=mips-compaq-nonstopux ;; BS2000:POSIX*:*:*) GUESS=bs2000-siemens-sysv ;; DS/*:UNIX_System_V:*:*) GUESS=$UNAME_MACHINE-$UNAME_SYSTEM-$UNAME_RELEASE ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "${cputype-}" = 386; then UNAME_MACHINE=i386 elif test "x${cputype-}" != x; then UNAME_MACHINE=$cputype fi GUESS=$UNAME_MACHINE-unknown-plan9 ;; *:TOPS-10:*:*) GUESS=pdp10-unknown-tops10 ;; *:TENEX:*:*) GUESS=pdp10-unknown-tenex ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) GUESS=pdp10-dec-tops20 ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) GUESS=pdp10-xkl-tops20 ;; *:TOPS-20:*:*) GUESS=pdp10-unknown-tops20 ;; *:ITS:*:*) GUESS=pdp10-unknown-its ;; SEI:*:*:SEIUX) GUESS=mips-sei-seiux$UNAME_RELEASE ;; *:DragonFly:*:*) DRAGONFLY_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` GUESS=$UNAME_MACHINE-unknown-dragonfly$DRAGONFLY_REL ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case $UNAME_MACHINE in A*) GUESS=alpha-dec-vms ;; I*) GUESS=ia64-dec-vms ;; V*) GUESS=vax-dec-vms ;; esac ;; *:XENIX:*:SysV) GUESS=i386-pc-xenix ;; i*86:skyos:*:*) SKYOS_REL=`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'` GUESS=$UNAME_MACHINE-pc-skyos$SKYOS_REL ;; i*86:rdos:*:*) GUESS=$UNAME_MACHINE-pc-rdos ;; i*86:Fiwix:*:*) GUESS=$UNAME_MACHINE-pc-fiwix ;; *:AROS:*:*) GUESS=$UNAME_MACHINE-unknown-aros ;; x86_64:VMkernel:*:*) GUESS=$UNAME_MACHINE-unknown-esx ;; amd64:Isilon\ OneFS:*:*) GUESS=x86_64-unknown-onefs ;; *:Unleashed:*:*) GUESS=$UNAME_MACHINE-unknown-unleashed$UNAME_RELEASE ;; esac # Do we have a guess based on uname results? if test "x$GUESS" != x; then echo "$GUESS" exit fi # No uname command or uname output not recognized. set_cc_for_build cat > "$dummy.c" < #include #endif #if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) #if defined (vax) || defined (__vax) || defined (__vax__) || defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) #include #if defined(_SIZE_T_) || defined(SIGLOST) #include #endif #endif #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) #if !defined (ultrix) #include #if defined (BSD) #if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); #else #if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); #else printf ("vax-dec-bsd\n"); exit (0); #endif #endif #else printf ("vax-dec-bsd\n"); exit (0); #endif #else #if defined(_SIZE_T_) || defined(SIGLOST) struct utsname un; uname (&un); printf ("vax-dec-ultrix%s\n", un.release); exit (0); #else printf ("vax-dec-ultrix\n"); exit (0); #endif #endif #endif #if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) #if defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) #if defined(_SIZE_T_) || defined(SIGLOST) struct utsname *un; uname (&un); printf ("mips-dec-ultrix%s\n", un.release); exit (0); #else printf ("mips-dec-ultrix\n"); exit (0); #endif #endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null && SYSTEM_NAME=`"$dummy"` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. test -d /usr/apollo && { echo "$ISP-apollo-$SYSTYPE"; exit; } echo "$0: unable to guess system type" >&2 case $UNAME_MACHINE:$UNAME_SYSTEM in mips:Linux | mips64:Linux) # If we got here on MIPS GNU/Linux, output extra information. cat >&2 <&2 <&2 </dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = "$UNAME_MACHINE" UNAME_RELEASE = "$UNAME_RELEASE" UNAME_SYSTEM = "$UNAME_SYSTEM" UNAME_VERSION = "$UNAME_VERSION" EOF fi exit 1 # Local variables: # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: grub-2.14~git20250718.0e36779/Makefile.in0000644000175000017500000571741315036452452014073 00000000000000# Makefile.in generated by automake 1.16.5 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2021 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # -*- makefile -*- VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ @COND_real_platform_TRUE@am__append_1 = grub-core @COND_arm64_TRUE@am__append_2 = -mcmodel=large @COND_powerpc_ieee1275_TRUE@am__append_3 = -mcpu=powerpc @COND_HAVE_PCI_TRUE@am__append_4 = -DGRUB_HAS_PCI @COND_HAVE_ASM_USCORE_TRUE@@COND_emu_FALSE@am__append_5 = -Wl,--defsym=_malloc=_grub_malloc -Wl,--defsym=_free=_grub_free @COND_HAVE_ASM_USCORE_FALSE@@COND_emu_FALSE@am__append_6 = -Wl,--defsym=malloc=grub_malloc -Wl,--defsym=free=grub_free bin_PROGRAMS = grub-mkimage$(EXEEXT) $(am__EXEEXT_1) \ grub-mkrelpath$(EXEEXT) grub-script-check$(EXEEXT) \ grub-editenv$(EXEEXT) grub-mkpasswd-pbkdf2$(EXEEXT) \ $(am__EXEEXT_2) grub-fstest$(EXEEXT) $(am__EXEEXT_3) \ $(am__EXEEXT_4) grub-mklayout$(EXEEXT) $(am__EXEEXT_5) \ grub-mkstandalone$(EXEEXT) grub-mknetdir$(EXEEXT) \ grub-menulst2cfg$(EXEEXT) grub-syslinux2cfg$(EXEEXT) \ grub-glue-efi$(EXEEXT) grub-render-label$(EXEEXT) \ grub-file$(EXEEXT) noinst_PROGRAMS = platform_PROGRAMS = sbin_PROGRAMS = grub-probe$(EXEEXT) grub-bios-setup$(EXEEXT) \ grub-sparc64-setup$(EXEEXT) grub-ofpathname$(EXEEXT) \ grub-macbless$(EXEEXT) grub-install$(EXEEXT) @COND_MAN_PAGES_TRUE@am__append_7 = grub-mkimage.1 @COND_MAN_PAGES_TRUE@am__append_8 = grub-mkimage.1 @COND_GRUB_PROTECT_TRUE@am__append_9 = grub-protect @COND_GRUB_PROTECT_TRUE@@COND_MAN_PAGES_TRUE@am__append_10 = grub-protect.1 @COND_GRUB_PROTECT_TRUE@@COND_MAN_PAGES_TRUE@am__append_11 = grub-protect.1 @COND_GRUB_PROTECT_TRUE@am__append_12 = @COND_GRUB_PROTECT_TRUE@am__append_13 = $(nodist_grub_protect_SOURCES) @COND_GRUB_PROTECT_TRUE@am__append_14 = $(nodist_grub_protect_SOURCES) @COND_MAN_PAGES_TRUE@am__append_15 = grub-mkrelpath.1 \ @COND_MAN_PAGES_TRUE@ grub-script-check.1 grub-editenv.1 \ @COND_MAN_PAGES_TRUE@ grub-mkpasswd-pbkdf2.1 @COND_MAN_PAGES_TRUE@am__append_16 = grub-mkrelpath.1 @COND_MAN_PAGES_TRUE@am__append_17 = grub-script-check.1 @COND_MAN_PAGES_TRUE@am__append_18 = grub-editenv.1 @COND_MAN_PAGES_TRUE@am__append_19 = grub-mkpasswd-pbkdf2.1 @COND_APPLE_LINKER_TRUE@am__append_20 = grub-macho2img @COND_APPLE_LINKER_TRUE@@COND_MAN_PAGES_TRUE@am__append_21 = grub-macho2img.1 @COND_APPLE_LINKER_TRUE@@COND_MAN_PAGES_TRUE@am__append_22 = grub-macho2img.1 @COND_APPLE_LINKER_TRUE@am__append_23 = @COND_APPLE_LINKER_TRUE@am__append_24 = $(nodist_grub_macho2img_SOURCES) @COND_APPLE_LINKER_TRUE@am__append_25 = $(nodist_grub_macho2img_SOURCES) @COND_MAN_PAGES_TRUE@am__append_26 = grub-fstest.1 @COND_MAN_PAGES_TRUE@am__append_27 = grub-fstest.1 @COND_GRUB_MOUNT_TRUE@am__append_28 = grub-mount @COND_GRUB_MOUNT_TRUE@@COND_MAN_PAGES_TRUE@am__append_29 = grub-mount.1 @COND_GRUB_MOUNT_TRUE@@COND_MAN_PAGES_TRUE@am__append_30 = grub-mount.1 @COND_GRUB_MOUNT_TRUE@am__append_31 = @COND_GRUB_MOUNT_TRUE@am__append_32 = $(nodist_grub_mount_SOURCES) @COND_GRUB_MOUNT_TRUE@am__append_33 = $(nodist_grub_mount_SOURCES) @COND_GRUB_MKFONT_TRUE@am__append_34 = grub-mkfont @COND_GRUB_MKFONT_TRUE@@COND_MAN_PAGES_TRUE@am__append_35 = grub-mkfont.1 @COND_GRUB_MKFONT_TRUE@@COND_MAN_PAGES_TRUE@am__append_36 = grub-mkfont.1 @COND_GRUB_MKFONT_TRUE@am__append_37 = @COND_GRUB_MKFONT_TRUE@am__append_38 = $(nodist_grub_mkfont_SOURCES) @COND_GRUB_MKFONT_TRUE@am__append_39 = $(nodist_grub_mkfont_SOURCES) @COND_MAN_PAGES_TRUE@am__append_40 = grub-probe.8 grub-bios-setup.8 \ @COND_MAN_PAGES_TRUE@ grub-sparc64-setup.8 grub-ofpathname.8 \ @COND_MAN_PAGES_TRUE@ grub-mklayout.1 grub-macbless.8 @COND_MAN_PAGES_TRUE@am__append_41 = grub-probe.8 @COND_MAN_PAGES_TRUE@am__append_42 = grub-bios-setup.8 @COND_MAN_PAGES_TRUE@am__append_43 = grub-sparc64-setup.8 @COND_MAN_PAGES_TRUE@am__append_44 = grub-ofpathname.8 @COND_MAN_PAGES_TRUE@am__append_45 = grub-mklayout.1 @COND_MAN_PAGES_TRUE@am__append_46 = grub-macbless.8 @COND_HAVE_EXEC_TRUE@am__append_47 = grub-mkrescue @COND_HAVE_EXEC_TRUE@@COND_MAN_PAGES_TRUE@am__append_48 = grub-mkrescue.1 @COND_HAVE_EXEC_TRUE@@COND_MAN_PAGES_TRUE@am__append_49 = grub-mkrescue.1 @COND_HAVE_EXEC_TRUE@am__append_50 = grub-core/osdep/unix/compress.c grub-core/osdep/basic/compress.c @COND_HAVE_EXEC_TRUE@am__append_51 = $(nodist_grub_mkrescue_SOURCES) @COND_HAVE_EXEC_TRUE@am__append_52 = $(nodist_grub_mkrescue_SOURCES) @COND_MAN_PAGES_TRUE@am__append_53 = grub-mkstandalone.1 \ @COND_MAN_PAGES_TRUE@ grub-install.8 grub-mknetdir.1 \ @COND_MAN_PAGES_TRUE@ grub-menulst2cfg.1 grub-syslinux2cfg.1 \ @COND_MAN_PAGES_TRUE@ grub-glue-efi.1 grub-render-label.1 \ @COND_MAN_PAGES_TRUE@ grub-file.1 grub-mkconfig.8 \ @COND_MAN_PAGES_TRUE@ grub-set-default.8 grub-reboot.8 \ @COND_MAN_PAGES_TRUE@ grub-kbdcomp.1 @COND_MAN_PAGES_TRUE@am__append_54 = grub-mkstandalone.1 @COND_MAN_PAGES_TRUE@am__append_55 = grub-install.8 @COND_MAN_PAGES_TRUE@am__append_56 = grub-mknetdir.1 @COND_HAVE_CXX_TRUE@am__append_57 = priority_queue_unit_test @COND_HAVE_CXX_TRUE@am__append_58 = @COND_HAVE_CXX_TRUE@am__append_59 = $(nodist_priority_queue_unit_test_SOURCES) @COND_HAVE_CXX_TRUE@am__append_60 = $(nodist_priority_queue_unit_test_SOURCES) @COND_MAN_PAGES_TRUE@am__append_61 = grub-menulst2cfg.1 @COND_MAN_PAGES_TRUE@am__append_62 = grub-syslinux2cfg.1 @COND_MAN_PAGES_TRUE@am__append_63 = grub-glue-efi.1 @COND_MAN_PAGES_TRUE@am__append_64 = grub-render-label.1 @COND_MAN_PAGES_TRUE@am__append_65 = grub-file.1 @COND_HOST_WINDOWS_TRUE@am__append_66 = 10_windows @COND_HOST_WINDOWS_TRUE@am__append_67 = 10_windows @COND_HOST_WINDOWS_TRUE@am__append_68 = @COND_HOST_WINDOWS_TRUE@am__append_69 = util/grub.d/10_windows.in @COND_HOST_HURD_TRUE@am__append_70 = 10_hurd @COND_HOST_HURD_TRUE@am__append_71 = 10_hurd @COND_HOST_HURD_TRUE@am__append_72 = @COND_HOST_HURD_TRUE@am__append_73 = util/grub.d/10_hurd.in @COND_HOST_KFREEBSD_TRUE@am__append_74 = 10_kfreebsd @COND_HOST_KFREEBSD_TRUE@am__append_75 = 10_kfreebsd @COND_HOST_KFREEBSD_TRUE@am__append_76 = @COND_HOST_KFREEBSD_TRUE@am__append_77 = util/grub.d/10_kfreebsd.in @COND_HOST_ILLUMOS_TRUE@am__append_78 = 10_illumos @COND_HOST_ILLUMOS_TRUE@am__append_79 = 10_illumos @COND_HOST_ILLUMOS_TRUE@am__append_80 = @COND_HOST_ILLUMOS_TRUE@am__append_81 = util/grub.d/10_illumos.in @COND_HOST_NETBSD_TRUE@am__append_82 = 10_netbsd @COND_HOST_NETBSD_TRUE@am__append_83 = 10_netbsd @COND_HOST_NETBSD_TRUE@am__append_84 = @COND_HOST_NETBSD_TRUE@am__append_85 = util/grub.d/10_netbsd.in @COND_HOST_LINUX_TRUE@am__append_86 = 10_linux @COND_HOST_LINUX_TRUE@am__append_87 = 10_linux @COND_HOST_LINUX_TRUE@am__append_88 = @COND_HOST_LINUX_TRUE@am__append_89 = util/grub.d/10_linux.in @COND_HOST_XNU_TRUE@am__append_90 = 10_xnu @COND_HOST_XNU_TRUE@am__append_91 = 10_xnu @COND_HOST_XNU_TRUE@am__append_92 = @COND_HOST_XNU_TRUE@am__append_93 = util/grub.d/10_xnu.in @COND_HOST_LINUX_TRUE@am__append_94 = 20_linux_xen @COND_HOST_LINUX_TRUE@am__append_95 = 20_linux_xen @COND_HOST_LINUX_TRUE@am__append_96 = @COND_HOST_LINUX_TRUE@am__append_97 = util/grub.d/20_linux_xen.in @COND_MAN_PAGES_TRUE@am__append_98 = grub-mkconfig.8 @COND_MAN_PAGES_TRUE@am__append_99 = grub-set-default.8 @COND_MAN_PAGES_TRUE@am__append_100 = grub-reboot.8 @COND_MAN_PAGES_TRUE@am__append_101 = grub-kbdcomp.1 check_PROGRAMS = $(am__EXEEXT_7) $(am__EXEEXT_8) @COND_HAVE_FONT_SOURCE_TRUE@am__append_102 = unicode.pf2 ascii.pf2 euro.pf2 ascii.h widthspec.h @COND_STARFIELD_TRUE@am__append_103 = dejavu_10.pf2 dejavu_12.pf2 \ @COND_STARFIELD_TRUE@ dejavu_14.pf2 dejavu_bold_14.pf2 \ @COND_STARFIELD_TRUE@ dejavu_16.pf2 @COND_real_platform_TRUE@am__append_104 = linux.init.i386 kfreebsd.init.i386 linux.init.x86_64 linux-initramfs.i386 linux-initramfs.x86_64 subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/00gnulib.m4 \ $(top_srcdir)/m4/__inline.m4 \ $(top_srcdir)/m4/absolute-header.m4 $(top_srcdir)/m4/alloca.m4 \ $(top_srcdir)/m4/argp.m4 $(top_srcdir)/m4/base64.m4 \ $(top_srcdir)/m4/btowc.m4 $(top_srcdir)/m4/builtin-expect.m4 \ $(top_srcdir)/m4/calloc.m4 $(top_srcdir)/m4/chdir-long.m4 \ $(top_srcdir)/m4/close.m4 $(top_srcdir)/m4/codeset.m4 \ $(top_srcdir)/m4/ctype_h.m4 $(top_srcdir)/m4/dirent_h.m4 \ $(top_srcdir)/m4/dirfd.m4 \ $(top_srcdir)/m4/double-slash-root.m4 $(top_srcdir)/m4/dup2.m4 \ $(top_srcdir)/m4/eealloc.m4 $(top_srcdir)/m4/errno_h.m4 \ $(top_srcdir)/m4/error.m4 $(top_srcdir)/m4/exponentd.m4 \ $(top_srcdir)/m4/extensions.m4 \ $(top_srcdir)/m4/extern-inline.m4 $(top_srcdir)/m4/fchdir.m4 \ $(top_srcdir)/m4/fcntl-o.m4 $(top_srcdir)/m4/fcntl.m4 \ $(top_srcdir)/m4/fcntl_h.m4 $(top_srcdir)/m4/filenamecat.m4 \ $(top_srcdir)/m4/flexmember.m4 $(top_srcdir)/m4/float_h.m4 \ $(top_srcdir)/m4/fnmatch.m4 $(top_srcdir)/m4/fnmatch_h.m4 \ $(top_srcdir)/m4/free.m4 $(top_srcdir)/m4/fstat.m4 \ $(top_srcdir)/m4/getcwd.m4 $(top_srcdir)/m4/getdelim.m4 \ $(top_srcdir)/m4/getdtablesize.m4 $(top_srcdir)/m4/getline.m4 \ $(top_srcdir)/m4/getopt.m4 $(top_srcdir)/m4/getprogname.m4 \ $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/gnulib-common.m4 \ $(top_srcdir)/m4/gnulib-comp.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/include_next.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/intmax_t.m4 \ $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ $(top_srcdir)/m4/isblank.m4 $(top_srcdir)/m4/langinfo_h.m4 \ $(top_srcdir)/m4/largefile.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libunistring-base.m4 \ $(top_srcdir)/m4/limits-h.m4 $(top_srcdir)/m4/localcharset.m4 \ $(top_srcdir)/m4/locale-fr.m4 $(top_srcdir)/m4/locale-ja.m4 \ $(top_srcdir)/m4/locale-zh.m4 $(top_srcdir)/m4/locale_h.m4 \ $(top_srcdir)/m4/localeconv.m4 $(top_srcdir)/m4/lock.m4 \ $(top_srcdir)/m4/lstat.m4 $(top_srcdir)/m4/malloc.m4 \ $(top_srcdir)/m4/malloca.m4 $(top_srcdir)/m4/mbrtowc.m4 \ $(top_srcdir)/m4/mbsinit.m4 $(top_srcdir)/m4/mbsrtowcs.m4 \ $(top_srcdir)/m4/mbstate_t.m4 $(top_srcdir)/m4/mbswidth.m4 \ $(top_srcdir)/m4/mbtowc.m4 $(top_srcdir)/m4/memchr.m4 \ $(top_srcdir)/m4/mempcpy.m4 $(top_srcdir)/m4/memrchr.m4 \ $(top_srcdir)/m4/mmap-anon.m4 $(top_srcdir)/m4/mode_t.m4 \ $(top_srcdir)/m4/msvc-inval.m4 \ $(top_srcdir)/m4/msvc-nothrow.m4 $(top_srcdir)/m4/multiarch.m4 \ $(top_srcdir)/m4/nl_langinfo.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/nocrash.m4 $(top_srcdir)/m4/off_t.m4 \ $(top_srcdir)/m4/open-cloexec.m4 \ $(top_srcdir)/m4/open-slash.m4 $(top_srcdir)/m4/open.m4 \ $(top_srcdir)/m4/openat.m4 $(top_srcdir)/m4/pathmax.m4 \ $(top_srcdir)/m4/pipe.m4 $(top_srcdir)/m4/po.m4 \ $(top_srcdir)/m4/printf.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/m4/pthread_rwlock_rdlock.m4 \ $(top_srcdir)/m4/rawmemchr.m4 $(top_srcdir)/m4/realloc.m4 \ $(top_srcdir)/m4/reallocarray.m4 $(top_srcdir)/m4/regex.m4 \ $(top_srcdir)/m4/save-cwd.m4 \ $(top_srcdir)/m4/setlocale_null.m4 \ $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/sleep.m4 \ $(top_srcdir)/m4/ssize_t.m4 $(top_srcdir)/m4/stat-time.m4 \ $(top_srcdir)/m4/stat.m4 $(top_srcdir)/m4/stdalign.m4 \ $(top_srcdir)/m4/stdbool.m4 $(top_srcdir)/m4/stddef_h.m4 \ $(top_srcdir)/m4/stdint.m4 $(top_srcdir)/m4/stdint_h.m4 \ $(top_srcdir)/m4/stdio_h.m4 $(top_srcdir)/m4/stdlib_h.m4 \ $(top_srcdir)/m4/strcase.m4 $(top_srcdir)/m4/strchrnul.m4 \ $(top_srcdir)/m4/strdup.m4 $(top_srcdir)/m4/strerror.m4 \ $(top_srcdir)/m4/string_h.m4 $(top_srcdir)/m4/strings_h.m4 \ $(top_srcdir)/m4/strndup.m4 $(top_srcdir)/m4/strnlen.m4 \ $(top_srcdir)/m4/sys_socket_h.m4 \ $(top_srcdir)/m4/sys_stat_h.m4 $(top_srcdir)/m4/sys_types_h.m4 \ $(top_srcdir)/m4/sysexits.m4 $(top_srcdir)/m4/threadlib.m4 \ $(top_srcdir)/m4/time_h.m4 $(top_srcdir)/m4/unistd-safer.m4 \ $(top_srcdir)/m4/unistd_h.m4 $(top_srcdir)/m4/vasnprintf.m4 \ $(top_srcdir)/m4/visibility.m4 $(top_srcdir)/m4/vsnprintf.m4 \ $(top_srcdir)/m4/warn-on-use.m4 $(top_srcdir)/m4/wchar_h.m4 \ $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wcrtomb.m4 \ $(top_srcdir)/m4/wctype_h.m4 $(top_srcdir)/m4/wcwidth.m4 \ $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/wmemchr.m4 \ $(top_srcdir)/m4/wmempcpy.m4 $(top_srcdir)/m4/xsize.m4 \ $(top_srcdir)/m4/year2038.m4 $(top_srcdir)/m4/zzgnulib.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ $(am__configure_deps) $(dist_grubconf_DATA) \ $(am__dist_noinst_DATA_DIST) $(am__DIST_COMMON) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_HEADER = config-util.h CONFIG_CLEAN_FILES = stamp-h config.h include/grub/cpu \ include/grub/machine CONFIG_CLEAN_VPATH_FILES = @COND_GRUB_PROTECT_TRUE@am__EXEEXT_1 = grub-protect$(EXEEXT) @COND_APPLE_LINKER_TRUE@am__EXEEXT_2 = grub-macho2img$(EXEEXT) @COND_GRUB_MOUNT_TRUE@am__EXEEXT_3 = grub-mount$(EXEEXT) @COND_GRUB_MKFONT_TRUE@am__EXEEXT_4 = grub-mkfont$(EXEEXT) @COND_HAVE_EXEC_TRUE@am__EXEEXT_5 = grub-mkrescue$(EXEEXT) am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(platformdir)" \ "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(bindir)" \ "$(DESTDIR)$(grubconfdir)" "$(DESTDIR)$(platformdir)" \ "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(man1dir)" \ "$(DESTDIR)$(man8dir)" "$(DESTDIR)$(grubconfdir)" \ "$(DESTDIR)$(pkgdatadir)" "$(DESTDIR)$(platformdir)" \ "$(DESTDIR)$(starfielddir)" "$(DESTDIR)$(platformdir)" @COND_HAVE_CXX_TRUE@am__EXEEXT_6 = priority_queue_unit_test$(EXEEXT) am__EXEEXT_7 = example_unit_test$(EXEEXT) printf_test$(EXEEXT) \ date_test$(EXEEXT) $(am__EXEEXT_6) cmp_test$(EXEEXT) am__EXEEXT_8 = PROGRAMS = $(bin_PROGRAMS) $(noinst_PROGRAMS) $(platform_PROGRAMS) \ $(sbin_PROGRAMS) LIBRARIES = $(noinst_LIBRARIES) AM_V_AR = $(am__v_AR_@AM_V@) am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) am__v_AR_0 = @echo " AR " $@; am__v_AR_1 = libgrubgcry_a_AR = $(AR) $(ARFLAGS) libgrubgcry_a_LIBADD = am__dirstamp = $(am__leading_dot)dirstamp am_libgrubgcry_a_OBJECTS = grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-arcfour.$(OBJEXT) \ grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-aria.$(OBJEXT) \ grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-blake2.$(OBJEXT) \ grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-blowfish.$(OBJEXT) \ grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-camellia-glue.$(OBJEXT) \ grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-camellia.$(OBJEXT) \ grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-cast5.$(OBJEXT) \ grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-crc.$(OBJEXT) \ grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-des.$(OBJEXT) \ grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-gost28147.$(OBJEXT) \ grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-gostr3411-94.$(OBJEXT) \ grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-hash-common.$(OBJEXT) \ grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-idea.$(OBJEXT) \ grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-init.$(OBJEXT) \ grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-keccak.$(OBJEXT) \ grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-md4.$(OBJEXT) \ grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-md5.$(OBJEXT) \ grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-rfc2268.$(OBJEXT) \ grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-rijndael.$(OBJEXT) \ grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-rmd160.$(OBJEXT) \ grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-salsa20.$(OBJEXT) \ grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-seed.$(OBJEXT) \ grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-serpent.$(OBJEXT) \ grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-sha1.$(OBJEXT) \ grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-sha256.$(OBJEXT) \ grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-sha512.$(OBJEXT) \ grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-sm3.$(OBJEXT) \ grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-sm4.$(OBJEXT) \ grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-stribog.$(OBJEXT) \ grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-tiger.$(OBJEXT) \ grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-twofish.$(OBJEXT) \ grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-whirlpool.$(OBJEXT) \ grub-core/lib/libgcrypt-grub/src/libgrubgcry_a-const-time.$(OBJEXT) nodist_libgrubgcry_a_OBJECTS = libgrubgcry_a_OBJECTS = $(am_libgrubgcry_a_OBJECTS) \ $(nodist_libgrubgcry_a_OBJECTS) libgrubkern_a_AR = $(AR) $(ARFLAGS) libgrubkern_a_LIBADD = am_libgrubkern_a_OBJECTS = \ grub-core/commands/libgrubkern_a-extcmd.$(OBJEXT) \ grub-core/disk/libgrubkern_a-AFSplitter.$(OBJEXT) \ grub-core/disk/libgrubkern_a-cryptodisk.$(OBJEXT) \ grub-core/disk/libgrubkern_a-diskfilter.$(OBJEXT) \ grub-core/disk/libgrubkern_a-geli.$(OBJEXT) \ grub-core/disk/libgrubkern_a-key_protector.$(OBJEXT) \ grub-core/disk/libgrubkern_a-ldm.$(OBJEXT) \ grub-core/disk/libgrubkern_a-luks.$(OBJEXT) \ grub-core/disk/libgrubkern_a-luks2.$(OBJEXT) \ grub-core/fs/libgrubkern_a-archelp.$(OBJEXT) \ grub-core/fs/libgrubkern_a-proc.$(OBJEXT) \ grub-core/kern/libgrubkern_a-command.$(OBJEXT) \ grub-core/kern/libgrubkern_a-device.$(OBJEXT) \ grub-core/kern/libgrubkern_a-disk.$(OBJEXT) \ grub-core/kern/emu/libgrubkern_a-hostdisk.$(OBJEXT) \ grub-core/kern/emu/libgrubkern_a-misc.$(OBJEXT) \ grub-core/kern/emu/libgrubkern_a-mm.$(OBJEXT) \ grub-core/kern/libgrubkern_a-env.$(OBJEXT) \ grub-core/kern/libgrubkern_a-err.$(OBJEXT) \ grub-core/kern/libgrubkern_a-file.$(OBJEXT) \ grub-core/kern/libgrubkern_a-fs.$(OBJEXT) \ grub-core/kern/libgrubkern_a-list.$(OBJEXT) \ grub-core/kern/libgrubkern_a-misc.$(OBJEXT) \ grub-core/kern/libgrubkern_a-partition.$(OBJEXT) \ grub-core/lib/libgrubkern_a-arg.$(OBJEXT) \ grub-core/lib/libgrubkern_a-crypto.$(OBJEXT) \ grub-core/lib/libgrubkern_a-disk.$(OBJEXT) \ grub-core/lib/json/libgrubkern_a-json.$(OBJEXT) \ grub-core/lib/libgrubkern_a-pbkdf2.$(OBJEXT) \ grub-core/osdep/devmapper/libgrubkern_a-getroot.$(OBJEXT) \ grub-core/osdep/devmapper/libgrubkern_a-hostdisk.$(OBJEXT) \ grub-core/osdep/libgrubkern_a-exec.$(OBJEXT) \ grub-core/osdep/libgrubkern_a-getroot.$(OBJEXT) \ grub-core/osdep/libgrubkern_a-hostdisk.$(OBJEXT) \ grub-core/osdep/libgrubkern_a-password.$(OBJEXT) \ grub-core/osdep/libgrubkern_a-relpath.$(OBJEXT) \ grub-core/osdep/libgrubkern_a-sleep.$(OBJEXT) \ grub-core/osdep/unix/libgrubkern_a-getroot.$(OBJEXT) \ grub-core/osdep/unix/libgrubkern_a-hostdisk.$(OBJEXT) \ grub-core/partmap/libgrubkern_a-gpt.$(OBJEXT) \ grub-core/partmap/libgrubkern_a-msdos.$(OBJEXT) \ util/libgrubkern_a-getroot.$(OBJEXT) \ util/libgrubkern_a-misc.$(OBJEXT) nodist_libgrubkern_a_OBJECTS = libgrubkern_a_OBJECTS = $(am_libgrubkern_a_OBJECTS) \ $(nodist_libgrubkern_a_OBJECTS) libgrubmods_a_AR = $(AR) $(ARFLAGS) libgrubmods_a_LIBADD = am_libgrubmods_a_OBJECTS = \ grub-core/commands/libgrubmods_a-blocklist.$(OBJEXT) \ grub-core/commands/libgrubmods_a-ls.$(OBJEXT) \ grub-core/commands/libgrubmods_a-macbless.$(OBJEXT) \ grub-core/commands/libgrubmods_a-testload.$(OBJEXT) \ grub-core/commands/libgrubmods_a-xnu_uuid.$(OBJEXT) \ grub-core/disk/libgrubmods_a-dmraid_nvidia.$(OBJEXT) \ grub-core/disk/libgrubmods_a-loopback.$(OBJEXT) \ grub-core/disk/libgrubmods_a-lvm.$(OBJEXT) \ grub-core/disk/libgrubmods_a-mdraid1x_linux.$(OBJEXT) \ grub-core/disk/libgrubmods_a-mdraid_linux.$(OBJEXT) \ grub-core/disk/libgrubmods_a-mdraid_linux_be.$(OBJEXT) \ grub-core/disk/libgrubmods_a-raid5_recover.$(OBJEXT) \ grub-core/disk/libgrubmods_a-raid6_recover.$(OBJEXT) \ grub-core/font/libgrubmods_a-font.$(OBJEXT) \ grub-core/fs/libgrubmods_a-affs.$(OBJEXT) \ grub-core/fs/libgrubmods_a-afs.$(OBJEXT) \ grub-core/fs/libgrubmods_a-bfs.$(OBJEXT) \ grub-core/fs/libgrubmods_a-btrfs.$(OBJEXT) \ grub-core/fs/libgrubmods_a-cbfs.$(OBJEXT) \ grub-core/fs/libgrubmods_a-cpio.$(OBJEXT) \ grub-core/fs/libgrubmods_a-cpio_be.$(OBJEXT) \ grub-core/fs/libgrubmods_a-erofs.$(OBJEXT) \ grub-core/fs/libgrubmods_a-exfat.$(OBJEXT) \ grub-core/fs/libgrubmods_a-ext2.$(OBJEXT) \ grub-core/fs/libgrubmods_a-f2fs.$(OBJEXT) \ grub-core/fs/libgrubmods_a-fat.$(OBJEXT) \ grub-core/fs/libgrubmods_a-fshelp.$(OBJEXT) \ grub-core/fs/libgrubmods_a-hfs.$(OBJEXT) \ grub-core/fs/libgrubmods_a-hfsplus.$(OBJEXT) \ grub-core/fs/libgrubmods_a-hfspluscomp.$(OBJEXT) \ grub-core/fs/libgrubmods_a-iso9660.$(OBJEXT) \ grub-core/fs/libgrubmods_a-jfs.$(OBJEXT) \ grub-core/fs/libgrubmods_a-minix.$(OBJEXT) \ grub-core/fs/libgrubmods_a-minix2.$(OBJEXT) \ grub-core/fs/libgrubmods_a-minix2_be.$(OBJEXT) \ grub-core/fs/libgrubmods_a-minix3.$(OBJEXT) \ grub-core/fs/libgrubmods_a-minix3_be.$(OBJEXT) \ grub-core/fs/libgrubmods_a-minix_be.$(OBJEXT) \ grub-core/fs/libgrubmods_a-newc.$(OBJEXT) \ grub-core/fs/libgrubmods_a-nilfs2.$(OBJEXT) \ grub-core/fs/libgrubmods_a-ntfs.$(OBJEXT) \ grub-core/fs/libgrubmods_a-ntfscomp.$(OBJEXT) \ grub-core/fs/libgrubmods_a-odc.$(OBJEXT) \ grub-core/fs/libgrubmods_a-reiserfs.$(OBJEXT) \ grub-core/fs/libgrubmods_a-romfs.$(OBJEXT) \ grub-core/fs/libgrubmods_a-sfs.$(OBJEXT) \ grub-core/fs/libgrubmods_a-squash4.$(OBJEXT) \ grub-core/fs/libgrubmods_a-tar.$(OBJEXT) \ grub-core/fs/libgrubmods_a-udf.$(OBJEXT) \ grub-core/fs/libgrubmods_a-ufs.$(OBJEXT) \ grub-core/fs/libgrubmods_a-ufs2.$(OBJEXT) \ grub-core/fs/libgrubmods_a-ufs_be.$(OBJEXT) \ grub-core/fs/libgrubmods_a-xfs.$(OBJEXT) \ grub-core/fs/zfs/libgrubmods_a-zfs.$(OBJEXT) \ grub-core/fs/zfs/libgrubmods_a-zfs_fletcher.$(OBJEXT) \ grub-core/fs/zfs/libgrubmods_a-zfs_lz4.$(OBJEXT) \ grub-core/fs/zfs/libgrubmods_a-zfs_lzjb.$(OBJEXT) \ grub-core/fs/zfs/libgrubmods_a-zfs_sha256.$(OBJEXT) \ grub-core/fs/zfs/libgrubmods_a-zfscrypt.$(OBJEXT) \ grub-core/fs/zfs/libgrubmods_a-zfsinfo.$(OBJEXT) \ grub-core/gfxmenu/libgrubmods_a-font.$(OBJEXT) \ grub-core/io/libgrubmods_a-bufio.$(OBJEXT) \ grub-core/io/libgrubmods_a-gzio.$(OBJEXT) \ grub-core/io/libgrubmods_a-lzopio.$(OBJEXT) \ grub-core/io/libgrubmods_a-xzio.$(OBJEXT) \ grub-core/kern/arm/libgrubmods_a-dl_helper.$(OBJEXT) \ grub-core/kern/arm64/libgrubmods_a-dl_helper.$(OBJEXT) \ grub-core/kern/ia64/libgrubmods_a-dl_helper.$(OBJEXT) \ grub-core/kern/loongarch64/libgrubmods_a-dl_helper.$(OBJEXT) \ grub-core/lib/libgrubmods_a-LzFind.$(OBJEXT) \ grub-core/lib/libgrubmods_a-LzmaEnc.$(OBJEXT) \ grub-core/lib/libgrubmods_a-adler32.$(OBJEXT) \ grub-core/lib/libgrubmods_a-crc.$(OBJEXT) \ grub-core/lib/libgrubmods_a-crc64.$(OBJEXT) \ grub-core/lib/libgrubmods_a-datetime.$(OBJEXT) \ grub-core/lib/libgrubmods_a-envblk.$(OBJEXT) \ grub-core/lib/libgrubmods_a-hexdump.$(OBJEXT) \ grub-core/lib/minilzo/libgrubmods_a-minilzo.$(OBJEXT) \ grub-core/lib/xzembed/libgrubmods_a-xz_dec_bcj.$(OBJEXT) \ grub-core/lib/xzembed/libgrubmods_a-xz_dec_lzma2.$(OBJEXT) \ grub-core/lib/xzembed/libgrubmods_a-xz_dec_stream.$(OBJEXT) \ grub-core/lib/zstd/libgrubmods_a-debug.$(OBJEXT) \ grub-core/lib/zstd/libgrubmods_a-entropy_common.$(OBJEXT) \ grub-core/lib/zstd/libgrubmods_a-error_private.$(OBJEXT) \ grub-core/lib/zstd/libgrubmods_a-fse_decompress.$(OBJEXT) \ grub-core/lib/zstd/libgrubmods_a-huf_decompress.$(OBJEXT) \ grub-core/lib/zstd/libgrubmods_a-module.$(OBJEXT) \ grub-core/lib/zstd/libgrubmods_a-xxhash.$(OBJEXT) \ grub-core/lib/zstd/libgrubmods_a-zstd_common.$(OBJEXT) \ grub-core/lib/zstd/libgrubmods_a-zstd_decompress.$(OBJEXT) \ grub-core/normal/libgrubmods_a-charset.$(OBJEXT) \ grub-core/normal/libgrubmods_a-misc.$(OBJEXT) \ grub-core/partmap/libgrubmods_a-acorn.$(OBJEXT) \ grub-core/partmap/libgrubmods_a-amiga.$(OBJEXT) \ grub-core/partmap/libgrubmods_a-apple.$(OBJEXT) \ grub-core/partmap/libgrubmods_a-bsdlabel.$(OBJEXT) \ grub-core/partmap/libgrubmods_a-dfly.$(OBJEXT) \ grub-core/partmap/libgrubmods_a-dvh.$(OBJEXT) \ grub-core/partmap/libgrubmods_a-plan.$(OBJEXT) \ grub-core/partmap/libgrubmods_a-sun.$(OBJEXT) \ grub-core/partmap/libgrubmods_a-sunpc.$(OBJEXT) \ grub-core/script/libgrubmods_a-argv.$(OBJEXT) \ grub-core/script/libgrubmods_a-function.$(OBJEXT) \ grub-core/script/libgrubmods_a-lexer.$(OBJEXT) \ grub-core/script/libgrubmods_a-main.$(OBJEXT) \ grub-core/script/libgrubmods_a-script.$(OBJEXT) \ grub-core/libgrubmods_a-unidata.$(OBJEXT) \ grub-core/video/libgrubmods_a-capture.$(OBJEXT) \ grub-core/video/libgrubmods_a-colors.$(OBJEXT) \ grub-core/video/fb/libgrubmods_a-fbblit.$(OBJEXT) \ grub-core/video/fb/libgrubmods_a-fbfill.$(OBJEXT) \ grub-core/video/fb/libgrubmods_a-fbutil.$(OBJEXT) \ grub-core/video/fb/libgrubmods_a-video_fb.$(OBJEXT) \ grub-core/video/libgrubmods_a-video.$(OBJEXT) nodist_libgrubmods_a_OBJECTS = \ libgrubmods_a-grub_script.tab.$(OBJEXT) \ libgrubmods_a-grub_script.yy.$(OBJEXT) \ libgrubmods_a-libgrub_a_init.$(OBJEXT) libgrubmods_a_OBJECTS = $(am_libgrubmods_a_OBJECTS) \ $(nodist_libgrubmods_a_OBJECTS) am_cmp_test_OBJECTS = grub-core/kern/cmp_test-list.$(OBJEXT) \ grub-core/kern/cmp_test-misc.$(OBJEXT) \ grub-core/tests/lib/cmp_test-test.$(OBJEXT) \ tests/cmp_test-cmp_unit_test.$(OBJEXT) \ tests/lib/cmp_test-unit_test.$(OBJEXT) nodist_cmp_test_OBJECTS = cmp_test_OBJECTS = $(am_cmp_test_OBJECTS) $(nodist_cmp_test_OBJECTS) am__DEPENDENCIES_1 = cmp_test_DEPENDENCIES = libgrubmods.a libgrubgcry.a libgrubkern.a \ grub-core/lib/gnulib/libgnu.a $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) cmp_test_LINK = $(CCLD) $(cmp_test_CFLAGS) $(CFLAGS) \ $(cmp_test_LDFLAGS) $(LDFLAGS) -o $@ am_date_test_OBJECTS = grub-core/kern/date_test-list.$(OBJEXT) \ grub-core/kern/date_test-misc.$(OBJEXT) \ grub-core/tests/lib/date_test-test.$(OBJEXT) \ tests/date_test-date_unit_test.$(OBJEXT) \ tests/lib/date_test-unit_test.$(OBJEXT) nodist_date_test_OBJECTS = date_test_OBJECTS = $(am_date_test_OBJECTS) \ $(nodist_date_test_OBJECTS) date_test_DEPENDENCIES = libgrubmods.a libgrubgcry.a libgrubkern.a \ grub-core/lib/gnulib/libgnu.a $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) date_test_LINK = $(CCLD) $(date_test_CFLAGS) $(CFLAGS) \ $(date_test_LDFLAGS) $(LDFLAGS) -o $@ am_example_unit_test_OBJECTS = \ grub-core/kern/example_unit_test-list.$(OBJEXT) \ grub-core/kern/example_unit_test-misc.$(OBJEXT) \ grub-core/tests/lib/example_unit_test-test.$(OBJEXT) \ tests/example_unit_test-example_unit_test.$(OBJEXT) \ tests/lib/example_unit_test-unit_test.$(OBJEXT) nodist_example_unit_test_OBJECTS = example_unit_test_OBJECTS = $(am_example_unit_test_OBJECTS) \ $(nodist_example_unit_test_OBJECTS) example_unit_test_DEPENDENCIES = libgrubmods.a libgrubgcry.a \ libgrubkern.a grub-core/lib/gnulib/libgnu.a \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) example_unit_test_LINK = $(CCLD) $(example_unit_test_CFLAGS) $(CFLAGS) \ $(example_unit_test_LDFLAGS) $(LDFLAGS) -o $@ am_grub_bios_setup_OBJECTS = \ grub-core/kern/emu/grub_bios_setup-argp_common.$(OBJEXT) \ grub-core/lib/grub_bios_setup-reed_solomon.$(OBJEXT) \ grub-core/osdep/grub_bios_setup-blocklist.$(OBJEXT) \ grub-core/osdep/grub_bios_setup-init.$(OBJEXT) \ util/grub_bios_setup-grub-setup.$(OBJEXT) \ util/grub_bios_setup-setup_bios.$(OBJEXT) nodist_grub_bios_setup_OBJECTS = grub_bios_setup_OBJECTS = $(am_grub_bios_setup_OBJECTS) \ $(nodist_grub_bios_setup_OBJECTS) grub_bios_setup_DEPENDENCIES = libgrubmods.a libgrubkern.a \ libgrubgcry.a grub-core/lib/gnulib/libgnu.a \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) grub_bios_setup_LINK = $(CCLD) $(grub_bios_setup_CFLAGS) $(CFLAGS) \ $(grub_bios_setup_LDFLAGS) $(LDFLAGS) -o $@ am_grub_editenv_OBJECTS = \ grub-core/osdep/grub_editenv-compress.$(OBJEXT) \ grub-core/osdep/grub_editenv-config.$(OBJEXT) \ grub-core/osdep/grub_editenv-init.$(OBJEXT) \ util/grub_editenv-config.$(OBJEXT) \ util/grub_editenv-editenv.$(OBJEXT) \ util/grub_editenv-grub-editenv.$(OBJEXT) \ util/grub_editenv-grub-install-common.$(OBJEXT) \ util/grub_editenv-grub-mkimage32.$(OBJEXT) \ util/grub_editenv-grub-mkimage64.$(OBJEXT) \ util/grub_editenv-mkimage.$(OBJEXT) \ util/grub_editenv-resolve.$(OBJEXT) nodist_grub_editenv_OBJECTS = grub_editenv_OBJECTS = $(am_grub_editenv_OBJECTS) \ $(nodist_grub_editenv_OBJECTS) grub_editenv_DEPENDENCIES = $(am__DEPENDENCIES_1) libgrubmods.a \ libgrubgcry.a libgrubkern.a grub-core/lib/gnulib/libgnu.a \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) grub_editenv_LINK = $(CCLD) $(grub_editenv_CFLAGS) $(CFLAGS) \ $(grub_editenv_LDFLAGS) $(LDFLAGS) -o $@ am_grub_file_OBJECTS = grub-core/commands/grub_file-file.$(OBJEXT) \ grub-core/commands/grub_file-file32.$(OBJEXT) \ grub-core/commands/grub_file-file64.$(OBJEXT) \ grub-core/disk/grub_file-host.$(OBJEXT) \ grub-core/io/grub_file-offset.$(OBJEXT) \ grub-core/kern/grub_file-elf.$(OBJEXT) \ grub-core/kern/emu/grub_file-hostfs.$(OBJEXT) \ grub-core/loader/i386/grub_file-xen_file.$(OBJEXT) \ grub-core/loader/i386/grub_file-xen_file32.$(OBJEXT) \ grub-core/loader/i386/grub_file-xen_file64.$(OBJEXT) \ grub-core/loader/grub_file-lzss.$(OBJEXT) \ grub-core/loader/grub_file-macho.$(OBJEXT) \ grub-core/loader/grub_file-macho32.$(OBJEXT) \ grub-core/loader/grub_file-macho64.$(OBJEXT) \ grub-core/osdep/grub_file-init.$(OBJEXT) \ util/grub_file-grub-file.$(OBJEXT) \ util/grub_file-render-label.$(OBJEXT) nodist_grub_file_OBJECTS = grub_file_OBJECTS = $(am_grub_file_OBJECTS) \ $(nodist_grub_file_OBJECTS) grub_file_DEPENDENCIES = libgrubmods.a libgrubgcry.a libgrubkern.a \ grub-core/lib/gnulib/libgnu.a $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) grub_file_LINK = $(CCLD) $(grub_file_CFLAGS) $(CFLAGS) \ $(grub_file_LDFLAGS) $(LDFLAGS) -o $@ am_grub_fstest_OBJECTS = grub-core/disk/grub_fstest-host.$(OBJEXT) \ grub-core/kern/emu/grub_fstest-hostfs.$(OBJEXT) \ grub-core/osdep/grub_fstest-init.$(OBJEXT) \ util/grub_fstest-grub-fstest.$(OBJEXT) nodist_grub_fstest_OBJECTS = grub_fstest-grub_fstest_init.$(OBJEXT) grub_fstest_OBJECTS = $(am_grub_fstest_OBJECTS) \ $(nodist_grub_fstest_OBJECTS) grub_fstest_DEPENDENCIES = libgrubmods.a libgrubgcry.a libgrubkern.a \ grub-core/lib/gnulib/libgnu.a $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) grub_fstest_LINK = $(CCLD) $(grub_fstest_CFLAGS) $(CFLAGS) \ $(grub_fstest_LDFLAGS) $(LDFLAGS) -o $@ am_grub_glue_efi_OBJECTS = \ grub-core/kern/emu/grub_glue_efi-argp_common.$(OBJEXT) \ grub-core/osdep/grub_glue_efi-init.$(OBJEXT) \ util/grub_glue_efi-glue-efi.$(OBJEXT) \ util/grub_glue_efi-grub-glue-efi.$(OBJEXT) nodist_grub_glue_efi_OBJECTS = grub_glue_efi_OBJECTS = $(am_grub_glue_efi_OBJECTS) \ $(nodist_grub_glue_efi_OBJECTS) grub_glue_efi_DEPENDENCIES = libgrubmods.a libgrubgcry.a libgrubkern.a \ grub-core/lib/gnulib/libgnu.a $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) grub_glue_efi_LINK = $(CCLD) $(grub_glue_efi_CFLAGS) $(CFLAGS) \ $(grub_glue_efi_LDFLAGS) $(LDFLAGS) -o $@ am_grub_install_OBJECTS = grub-core/disk/grub_install-host.$(OBJEXT) \ grub-core/kern/emu/grub_install-argp_common.$(OBJEXT) \ grub-core/kern/emu/grub_install-hostfs.$(OBJEXT) \ grub-core/lib/grub_install-reed_solomon.$(OBJEXT) \ grub-core/osdep/grub_install-blocklist.$(OBJEXT) \ grub-core/osdep/grub_install-compress.$(OBJEXT) \ grub-core/osdep/grub_install-config.$(OBJEXT) \ grub-core/osdep/grub_install-init.$(OBJEXT) \ grub-core/osdep/grub_install-ofpath.$(OBJEXT) \ grub-core/osdep/grub_install-platform.$(OBJEXT) \ grub-core/osdep/grub_install-platform_unix.$(OBJEXT) \ grub-core/osdep/grub_install-random.$(OBJEXT) \ util/grub_install-config.$(OBJEXT) \ util/grub_install-editenv.$(OBJEXT) \ util/grub_install-grub-install-common.$(OBJEXT) \ util/grub_install-grub-install.$(OBJEXT) \ util/grub_install-grub-mkimage32.$(OBJEXT) \ util/grub_install-grub-mkimage64.$(OBJEXT) \ util/grub_install-mkimage.$(OBJEXT) \ util/grub_install-probe.$(OBJEXT) \ util/grub_install-render-label.$(OBJEXT) \ util/grub_install-resolve.$(OBJEXT) \ util/grub_install-setup_bios.$(OBJEXT) \ util/grub_install-setup_sparc.$(OBJEXT) nodist_grub_install_OBJECTS = grub_install_OBJECTS = $(am_grub_install_OBJECTS) \ $(nodist_grub_install_OBJECTS) grub_install_DEPENDENCIES = $(am__DEPENDENCIES_1) libgrubmods.a \ libgrubgcry.a libgrubkern.a grub-core/lib/gnulib/libgnu.a \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) grub_install_LINK = $(CCLD) $(grub_install_CFLAGS) $(CFLAGS) \ $(grub_install_LDFLAGS) $(LDFLAGS) -o $@ am_grub_macbless_OBJECTS = \ grub-core/kern/emu/grub_macbless-argp_common.$(OBJEXT) \ grub-core/osdep/grub_macbless-init.$(OBJEXT) \ util/grub_macbless-grub-macbless.$(OBJEXT) nodist_grub_macbless_OBJECTS = grub_macbless_OBJECTS = $(am_grub_macbless_OBJECTS) \ $(nodist_grub_macbless_OBJECTS) grub_macbless_DEPENDENCIES = libgrubmods.a libgrubgcry.a libgrubkern.a \ grub-core/lib/gnulib/libgnu.a $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) grub_macbless_LINK = $(CCLD) $(grub_macbless_CFLAGS) $(CFLAGS) \ $(grub_macbless_LDFLAGS) $(LDFLAGS) -o $@ am__grub_macho2img_SOURCES_DIST = util/grub-macho2img.c @COND_APPLE_LINKER_TRUE@am_grub_macho2img_OBJECTS = util/grub_macho2img-grub-macho2img.$(OBJEXT) nodist_grub_macho2img_OBJECTS = grub_macho2img_OBJECTS = $(am_grub_macho2img_OBJECTS) \ $(nodist_grub_macho2img_OBJECTS) grub_macho2img_DEPENDENCIES = grub_macho2img_LINK = $(CCLD) $(grub_macho2img_CFLAGS) $(CFLAGS) \ $(grub_macho2img_LDFLAGS) $(LDFLAGS) -o $@ am_grub_menulst2cfg_OBJECTS = grub-core/lib/i386/pc/grub_menulst2cfg-vesa_modes_table.$(OBJEXT) \ grub-core/lib/grub_menulst2cfg-legacy_parse.$(OBJEXT) \ grub-core/osdep/grub_menulst2cfg-init.$(OBJEXT) \ util/grub_menulst2cfg-grub-menulst2cfg.$(OBJEXT) nodist_grub_menulst2cfg_OBJECTS = grub_menulst2cfg_OBJECTS = $(am_grub_menulst2cfg_OBJECTS) \ $(nodist_grub_menulst2cfg_OBJECTS) grub_menulst2cfg_DEPENDENCIES = libgrubmods.a libgrubgcry.a \ libgrubkern.a grub-core/lib/gnulib/libgnu.a \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) grub_menulst2cfg_LINK = $(CCLD) $(grub_menulst2cfg_CFLAGS) $(CFLAGS) \ $(grub_menulst2cfg_LDFLAGS) $(LDFLAGS) -o $@ am__grub_mkfont_SOURCES_DIST = grub-core/kern/emu/argp_common.c \ grub-core/osdep/init.c util/grub-mkfont.c @COND_GRUB_MKFONT_TRUE@am_grub_mkfont_OBJECTS = grub-core/kern/emu/grub_mkfont-argp_common.$(OBJEXT) \ @COND_GRUB_MKFONT_TRUE@ grub-core/osdep/grub_mkfont-init.$(OBJEXT) \ @COND_GRUB_MKFONT_TRUE@ util/grub_mkfont-grub-mkfont.$(OBJEXT) nodist_grub_mkfont_OBJECTS = grub_mkfont_OBJECTS = $(am_grub_mkfont_OBJECTS) \ $(nodist_grub_mkfont_OBJECTS) @COND_GRUB_MKFONT_TRUE@grub_mkfont_DEPENDENCIES = libgrubmods.a \ @COND_GRUB_MKFONT_TRUE@ libgrubgcry.a libgrubkern.a \ @COND_GRUB_MKFONT_TRUE@ grub-core/lib/gnulib/libgnu.a \ @COND_GRUB_MKFONT_TRUE@ $(am__DEPENDENCIES_1) \ @COND_GRUB_MKFONT_TRUE@ $(am__DEPENDENCIES_1) \ @COND_GRUB_MKFONT_TRUE@ $(am__DEPENDENCIES_1) \ @COND_GRUB_MKFONT_TRUE@ $(am__DEPENDENCIES_1) \ @COND_GRUB_MKFONT_TRUE@ $(am__DEPENDENCIES_1) \ @COND_GRUB_MKFONT_TRUE@ $(am__DEPENDENCIES_1) grub_mkfont_LINK = $(CCLD) $(grub_mkfont_CFLAGS) $(CFLAGS) \ $(grub_mkfont_LDFLAGS) $(LDFLAGS) -o $@ am_grub_mkimage_OBJECTS = \ grub-core/kern/emu/grub_mkimage-argp_common.$(OBJEXT) \ grub-core/osdep/grub_mkimage-config.$(OBJEXT) \ grub-core/osdep/grub_mkimage-init.$(OBJEXT) \ util/grub_mkimage-config.$(OBJEXT) \ util/grub_mkimage-grub-mkimage.$(OBJEXT) \ util/grub_mkimage-grub-mkimage32.$(OBJEXT) \ util/grub_mkimage-grub-mkimage64.$(OBJEXT) \ util/grub_mkimage-mkimage.$(OBJEXT) \ util/grub_mkimage-resolve.$(OBJEXT) nodist_grub_mkimage_OBJECTS = grub_mkimage_OBJECTS = $(am_grub_mkimage_OBJECTS) \ $(nodist_grub_mkimage_OBJECTS) grub_mkimage_DEPENDENCIES = libgrubmods.a libgrubgcry.a libgrubkern.a \ grub-core/lib/gnulib/libgnu.a $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) grub_mkimage_LINK = $(CCLD) $(grub_mkimage_CFLAGS) $(CFLAGS) \ $(grub_mkimage_LDFLAGS) $(LDFLAGS) -o $@ am_grub_mklayout_OBJECTS = \ grub-core/kern/emu/grub_mklayout-argp_common.$(OBJEXT) \ grub-core/osdep/grub_mklayout-init.$(OBJEXT) \ util/grub_mklayout-grub-mklayout.$(OBJEXT) nodist_grub_mklayout_OBJECTS = grub_mklayout_OBJECTS = $(am_grub_mklayout_OBJECTS) \ $(nodist_grub_mklayout_OBJECTS) grub_mklayout_DEPENDENCIES = libgrubmods.a libgrubgcry.a libgrubkern.a \ grub-core/lib/gnulib/libgnu.a $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) grub_mklayout_LINK = $(CCLD) $(grub_mklayout_CFLAGS) $(CFLAGS) \ $(grub_mklayout_LDFLAGS) $(LDFLAGS) -o $@ am_grub_mknetdir_OBJECTS = \ grub-core/kern/emu/grub_mknetdir-argp_common.$(OBJEXT) \ grub-core/lib/grub_mknetdir-reed_solomon.$(OBJEXT) \ grub-core/osdep/grub_mknetdir-blocklist.$(OBJEXT) \ grub-core/osdep/grub_mknetdir-compress.$(OBJEXT) \ grub-core/osdep/grub_mknetdir-config.$(OBJEXT) \ grub-core/osdep/grub_mknetdir-init.$(OBJEXT) \ grub-core/osdep/grub_mknetdir-ofpath.$(OBJEXT) \ grub-core/osdep/grub_mknetdir-platform.$(OBJEXT) \ grub-core/osdep/grub_mknetdir-platform_unix.$(OBJEXT) \ grub-core/osdep/grub_mknetdir-random.$(OBJEXT) \ util/grub_mknetdir-config.$(OBJEXT) \ util/grub_mknetdir-editenv.$(OBJEXT) \ util/grub_mknetdir-grub-install-common.$(OBJEXT) \ util/grub_mknetdir-grub-mkimage32.$(OBJEXT) \ util/grub_mknetdir-grub-mkimage64.$(OBJEXT) \ util/grub_mknetdir-grub-mknetdir.$(OBJEXT) \ util/grub_mknetdir-mkimage.$(OBJEXT) \ util/grub_mknetdir-resolve.$(OBJEXT) \ util/grub_mknetdir-setup_bios.$(OBJEXT) \ util/grub_mknetdir-setup_sparc.$(OBJEXT) nodist_grub_mknetdir_OBJECTS = grub_mknetdir_OBJECTS = $(am_grub_mknetdir_OBJECTS) \ $(nodist_grub_mknetdir_OBJECTS) grub_mknetdir_DEPENDENCIES = $(am__DEPENDENCIES_1) libgrubmods.a \ libgrubgcry.a libgrubkern.a grub-core/lib/gnulib/libgnu.a \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) grub_mknetdir_LINK = $(CCLD) $(grub_mknetdir_CFLAGS) $(CFLAGS) \ $(grub_mknetdir_LDFLAGS) $(LDFLAGS) -o $@ am_grub_mkpasswd_pbkdf2_OBJECTS = \ grub-core/kern/emu/grub_mkpasswd_pbkdf2-argp_common.$(OBJEXT) \ grub-core/osdep/grub_mkpasswd_pbkdf2-init.$(OBJEXT) \ grub-core/osdep/grub_mkpasswd_pbkdf2-random.$(OBJEXT) \ util/grub_mkpasswd_pbkdf2-grub-mkpasswd-pbkdf2.$(OBJEXT) nodist_grub_mkpasswd_pbkdf2_OBJECTS = grub_mkpasswd_pbkdf2_OBJECTS = $(am_grub_mkpasswd_pbkdf2_OBJECTS) \ $(nodist_grub_mkpasswd_pbkdf2_OBJECTS) grub_mkpasswd_pbkdf2_DEPENDENCIES = libgrubmods.a libgrubgcry.a \ libgrubkern.a grub-core/lib/gnulib/libgnu.a \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) grub_mkpasswd_pbkdf2_LINK = $(CCLD) $(grub_mkpasswd_pbkdf2_CFLAGS) \ $(CFLAGS) $(grub_mkpasswd_pbkdf2_LDFLAGS) $(LDFLAGS) -o $@ am_grub_mkrelpath_OBJECTS = \ grub-core/kern/emu/grub_mkrelpath-argp_common.$(OBJEXT) \ grub-core/osdep/grub_mkrelpath-init.$(OBJEXT) \ util/grub_mkrelpath-grub-mkrelpath.$(OBJEXT) nodist_grub_mkrelpath_OBJECTS = grub_mkrelpath_OBJECTS = $(am_grub_mkrelpath_OBJECTS) \ $(nodist_grub_mkrelpath_OBJECTS) grub_mkrelpath_DEPENDENCIES = libgrubmods.a libgrubgcry.a \ libgrubkern.a grub-core/lib/gnulib/libgnu.a \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) grub_mkrelpath_LINK = $(CCLD) $(grub_mkrelpath_CFLAGS) $(CFLAGS) \ $(grub_mkrelpath_LDFLAGS) $(LDFLAGS) -o $@ am__grub_mkrescue_SOURCES_DIST = grub-core/disk/host.c \ grub-core/kern/emu/argp_common.c grub-core/kern/emu/hostfs.c \ grub-core/lib/reed_solomon.c grub-core/osdep/blocklist.c \ grub-core/osdep/compress.c grub-core/osdep/config.c \ grub-core/osdep/init.c grub-core/osdep/ofpath.c \ grub-core/osdep/platform.c grub-core/osdep/platform_unix.c \ grub-core/osdep/random.c util/config.c util/editenv.c \ util/glue-efi.c util/grub-install-common.c \ util/grub-mkimage32.c util/grub-mkimage64.c \ util/grub-mkrescue.c util/mkimage.c util/render-label.c \ util/resolve.c util/setup_bios.c util/setup_sparc.c @COND_HAVE_EXEC_TRUE@am_grub_mkrescue_OBJECTS = grub-core/disk/grub_mkrescue-host.$(OBJEXT) \ @COND_HAVE_EXEC_TRUE@ grub-core/kern/emu/grub_mkrescue-argp_common.$(OBJEXT) \ @COND_HAVE_EXEC_TRUE@ grub-core/kern/emu/grub_mkrescue-hostfs.$(OBJEXT) \ @COND_HAVE_EXEC_TRUE@ grub-core/lib/grub_mkrescue-reed_solomon.$(OBJEXT) \ @COND_HAVE_EXEC_TRUE@ grub-core/osdep/grub_mkrescue-blocklist.$(OBJEXT) \ @COND_HAVE_EXEC_TRUE@ grub-core/osdep/grub_mkrescue-compress.$(OBJEXT) \ @COND_HAVE_EXEC_TRUE@ grub-core/osdep/grub_mkrescue-config.$(OBJEXT) \ @COND_HAVE_EXEC_TRUE@ grub-core/osdep/grub_mkrescue-init.$(OBJEXT) \ @COND_HAVE_EXEC_TRUE@ grub-core/osdep/grub_mkrescue-ofpath.$(OBJEXT) \ @COND_HAVE_EXEC_TRUE@ grub-core/osdep/grub_mkrescue-platform.$(OBJEXT) \ @COND_HAVE_EXEC_TRUE@ grub-core/osdep/grub_mkrescue-platform_unix.$(OBJEXT) \ @COND_HAVE_EXEC_TRUE@ grub-core/osdep/grub_mkrescue-random.$(OBJEXT) \ @COND_HAVE_EXEC_TRUE@ util/grub_mkrescue-config.$(OBJEXT) \ @COND_HAVE_EXEC_TRUE@ util/grub_mkrescue-editenv.$(OBJEXT) \ @COND_HAVE_EXEC_TRUE@ util/grub_mkrescue-glue-efi.$(OBJEXT) \ @COND_HAVE_EXEC_TRUE@ util/grub_mkrescue-grub-install-common.$(OBJEXT) \ @COND_HAVE_EXEC_TRUE@ util/grub_mkrescue-grub-mkimage32.$(OBJEXT) \ @COND_HAVE_EXEC_TRUE@ util/grub_mkrescue-grub-mkimage64.$(OBJEXT) \ @COND_HAVE_EXEC_TRUE@ util/grub_mkrescue-grub-mkrescue.$(OBJEXT) \ @COND_HAVE_EXEC_TRUE@ util/grub_mkrescue-mkimage.$(OBJEXT) \ @COND_HAVE_EXEC_TRUE@ util/grub_mkrescue-render-label.$(OBJEXT) \ @COND_HAVE_EXEC_TRUE@ util/grub_mkrescue-resolve.$(OBJEXT) \ @COND_HAVE_EXEC_TRUE@ util/grub_mkrescue-setup_bios.$(OBJEXT) \ @COND_HAVE_EXEC_TRUE@ util/grub_mkrescue-setup_sparc.$(OBJEXT) nodist_grub_mkrescue_OBJECTS = grub_mkrescue_OBJECTS = $(am_grub_mkrescue_OBJECTS) \ $(nodist_grub_mkrescue_OBJECTS) @COND_HAVE_EXEC_TRUE@grub_mkrescue_DEPENDENCIES = \ @COND_HAVE_EXEC_TRUE@ $(am__DEPENDENCIES_1) libgrubmods.a \ @COND_HAVE_EXEC_TRUE@ libgrubgcry.a libgrubkern.a \ @COND_HAVE_EXEC_TRUE@ grub-core/lib/gnulib/libgnu.a \ @COND_HAVE_EXEC_TRUE@ $(am__DEPENDENCIES_1) \ @COND_HAVE_EXEC_TRUE@ $(am__DEPENDENCIES_1) \ @COND_HAVE_EXEC_TRUE@ $(am__DEPENDENCIES_1) \ @COND_HAVE_EXEC_TRUE@ $(am__DEPENDENCIES_1) \ @COND_HAVE_EXEC_TRUE@ $(am__DEPENDENCIES_1) \ @COND_HAVE_EXEC_TRUE@ $(am__DEPENDENCIES_1) grub_mkrescue_LINK = $(CCLD) $(grub_mkrescue_CFLAGS) $(CFLAGS) \ $(grub_mkrescue_LDFLAGS) $(LDFLAGS) -o $@ am_grub_mkstandalone_OBJECTS = \ grub-core/disk/grub_mkstandalone-host.$(OBJEXT) \ grub-core/kern/emu/grub_mkstandalone-argp_common.$(OBJEXT) \ grub-core/kern/emu/grub_mkstandalone-hostfs.$(OBJEXT) \ grub-core/lib/grub_mkstandalone-reed_solomon.$(OBJEXT) \ grub-core/osdep/grub_mkstandalone-blocklist.$(OBJEXT) \ grub-core/osdep/grub_mkstandalone-compress.$(OBJEXT) \ grub-core/osdep/grub_mkstandalone-config.$(OBJEXT) \ grub-core/osdep/grub_mkstandalone-init.$(OBJEXT) \ grub-core/osdep/grub_mkstandalone-ofpath.$(OBJEXT) \ grub-core/osdep/grub_mkstandalone-platform.$(OBJEXT) \ grub-core/osdep/grub_mkstandalone-platform_unix.$(OBJEXT) \ grub-core/osdep/grub_mkstandalone-random.$(OBJEXT) \ util/grub_mkstandalone-config.$(OBJEXT) \ util/grub_mkstandalone-editenv.$(OBJEXT) \ util/grub_mkstandalone-glue-efi.$(OBJEXT) \ util/grub_mkstandalone-grub-install-common.$(OBJEXT) \ util/grub_mkstandalone-grub-mkimage32.$(OBJEXT) \ util/grub_mkstandalone-grub-mkimage64.$(OBJEXT) \ util/grub_mkstandalone-grub-mkstandalone.$(OBJEXT) \ util/grub_mkstandalone-mkimage.$(OBJEXT) \ util/grub_mkstandalone-render-label.$(OBJEXT) \ util/grub_mkstandalone-resolve.$(OBJEXT) \ util/grub_mkstandalone-setup_bios.$(OBJEXT) \ util/grub_mkstandalone-setup_sparc.$(OBJEXT) nodist_grub_mkstandalone_OBJECTS = grub_mkstandalone_OBJECTS = $(am_grub_mkstandalone_OBJECTS) \ $(nodist_grub_mkstandalone_OBJECTS) grub_mkstandalone_DEPENDENCIES = $(am__DEPENDENCIES_1) libgrubmods.a \ libgrubgcry.a libgrubkern.a grub-core/lib/gnulib/libgnu.a \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) grub_mkstandalone_LINK = $(CCLD) $(grub_mkstandalone_CFLAGS) $(CFLAGS) \ $(grub_mkstandalone_LDFLAGS) $(LDFLAGS) -o $@ am__grub_mount_SOURCES_DIST = grub-core/disk/host.c \ grub-core/kern/emu/hostfs.c grub-core/osdep/init.c \ util/grub-mount.c @COND_GRUB_MOUNT_TRUE@am_grub_mount_OBJECTS = grub-core/disk/grub_mount-host.$(OBJEXT) \ @COND_GRUB_MOUNT_TRUE@ grub-core/kern/emu/grub_mount-hostfs.$(OBJEXT) \ @COND_GRUB_MOUNT_TRUE@ grub-core/osdep/grub_mount-init.$(OBJEXT) \ @COND_GRUB_MOUNT_TRUE@ util/grub_mount-grub-mount.$(OBJEXT) @COND_GRUB_MOUNT_TRUE@nodist_grub_mount_OBJECTS = \ @COND_GRUB_MOUNT_TRUE@ grub_mount-grub_fstest_init.$(OBJEXT) grub_mount_OBJECTS = $(am_grub_mount_OBJECTS) \ $(nodist_grub_mount_OBJECTS) @COND_GRUB_MOUNT_TRUE@grub_mount_DEPENDENCIES = libgrubmods.a \ @COND_GRUB_MOUNT_TRUE@ libgrubgcry.a libgrubkern.a \ @COND_GRUB_MOUNT_TRUE@ grub-core/lib/gnulib/libgnu.a \ @COND_GRUB_MOUNT_TRUE@ $(am__DEPENDENCIES_1) \ @COND_GRUB_MOUNT_TRUE@ $(am__DEPENDENCIES_1) \ @COND_GRUB_MOUNT_TRUE@ $(am__DEPENDENCIES_1) \ @COND_GRUB_MOUNT_TRUE@ $(am__DEPENDENCIES_1) \ @COND_GRUB_MOUNT_TRUE@ $(am__DEPENDENCIES_1) \ @COND_GRUB_MOUNT_TRUE@ $(am__DEPENDENCIES_1) grub_mount_LINK = $(CCLD) $(grub_mount_CFLAGS) $(CFLAGS) \ $(grub_mount_LDFLAGS) $(LDFLAGS) -o $@ am_grub_ofpathname_OBJECTS = \ grub-core/osdep/grub_ofpathname-init.$(OBJEXT) \ grub-core/osdep/grub_ofpathname-ofpath.$(OBJEXT) \ util/ieee1275/grub_ofpathname-grub-ofpathname.$(OBJEXT) nodist_grub_ofpathname_OBJECTS = grub_ofpathname_OBJECTS = $(am_grub_ofpathname_OBJECTS) \ $(nodist_grub_ofpathname_OBJECTS) grub_ofpathname_DEPENDENCIES = libgrubmods.a libgrubgcry.a \ libgrubkern.a grub-core/lib/gnulib/libgnu.a \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) grub_ofpathname_LINK = $(CCLD) $(grub_ofpathname_CFLAGS) $(CFLAGS) \ $(grub_ofpathname_LDFLAGS) $(LDFLAGS) -o $@ am_grub_probe_OBJECTS = \ grub-core/kern/emu/grub_probe-argp_common.$(OBJEXT) \ grub-core/osdep/grub_probe-init.$(OBJEXT) \ grub-core/osdep/grub_probe-ofpath.$(OBJEXT) \ util/grub_probe-grub-probe.$(OBJEXT) \ util/grub_probe-probe.$(OBJEXT) nodist_grub_probe_OBJECTS = grub_probe_OBJECTS = $(am_grub_probe_OBJECTS) \ $(nodist_grub_probe_OBJECTS) grub_probe_DEPENDENCIES = libgrubmods.a libgrubgcry.a libgrubkern.a \ grub-core/lib/gnulib/libgnu.a $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) grub_probe_LINK = $(CCLD) $(grub_probe_CFLAGS) $(CFLAGS) \ $(grub_probe_LDFLAGS) $(LDFLAGS) -o $@ am__grub_protect_SOURCES_DIST = \ grub-core/commands/tpm2_key_protector/args.c \ grub-core/commands/tpm2_key_protector/tpm2key_asn1_tab.c \ grub-core/kern/emu/argp_common.c grub-core/lib/tss2/buffer.c \ grub-core/lib/tss2/tpm2_cmd.c grub-core/lib/tss2/tss2_mu.c \ grub-core/osdep/init.c util/grub-protect.c util/probe.c @COND_GRUB_PROTECT_TRUE@am_grub_protect_OBJECTS = grub-core/commands/tpm2_key_protector/grub_protect-args.$(OBJEXT) \ @COND_GRUB_PROTECT_TRUE@ grub-core/commands/tpm2_key_protector/grub_protect-tpm2key_asn1_tab.$(OBJEXT) \ @COND_GRUB_PROTECT_TRUE@ grub-core/kern/emu/grub_protect-argp_common.$(OBJEXT) \ @COND_GRUB_PROTECT_TRUE@ grub-core/lib/tss2/grub_protect-buffer.$(OBJEXT) \ @COND_GRUB_PROTECT_TRUE@ grub-core/lib/tss2/grub_protect-tpm2_cmd.$(OBJEXT) \ @COND_GRUB_PROTECT_TRUE@ grub-core/lib/tss2/grub_protect-tss2_mu.$(OBJEXT) \ @COND_GRUB_PROTECT_TRUE@ grub-core/osdep/grub_protect-init.$(OBJEXT) \ @COND_GRUB_PROTECT_TRUE@ util/grub_protect-grub-protect.$(OBJEXT) \ @COND_GRUB_PROTECT_TRUE@ util/grub_protect-probe.$(OBJEXT) nodist_grub_protect_OBJECTS = grub_protect_OBJECTS = $(am_grub_protect_OBJECTS) \ $(nodist_grub_protect_OBJECTS) @COND_GRUB_PROTECT_TRUE@grub_protect_DEPENDENCIES = libgrubmods.a \ @COND_GRUB_PROTECT_TRUE@ libgrubgcry.a libgrubkern.a \ @COND_GRUB_PROTECT_TRUE@ grub-core/lib/gnulib/libgnu.a \ @COND_GRUB_PROTECT_TRUE@ $(am__DEPENDENCIES_1) \ @COND_GRUB_PROTECT_TRUE@ $(am__DEPENDENCIES_1) \ @COND_GRUB_PROTECT_TRUE@ $(am__DEPENDENCIES_1) \ @COND_GRUB_PROTECT_TRUE@ $(am__DEPENDENCIES_1) \ @COND_GRUB_PROTECT_TRUE@ $(am__DEPENDENCIES_1) \ @COND_GRUB_PROTECT_TRUE@ $(am__DEPENDENCIES_1) \ @COND_GRUB_PROTECT_TRUE@ $(am__DEPENDENCIES_1) grub_protect_LINK = $(CCLD) $(grub_protect_CFLAGS) $(CFLAGS) \ $(grub_protect_LDFLAGS) $(LDFLAGS) -o $@ am_grub_render_label_OBJECTS = \ grub-core/disk/grub_render_label-host.$(OBJEXT) \ grub-core/kern/emu/grub_render_label-argp_common.$(OBJEXT) \ grub-core/kern/emu/grub_render_label-hostfs.$(OBJEXT) \ grub-core/osdep/grub_render_label-init.$(OBJEXT) \ util/grub_render_label-grub-render-label.$(OBJEXT) \ util/grub_render_label-render-label.$(OBJEXT) nodist_grub_render_label_OBJECTS = grub_render_label_OBJECTS = $(am_grub_render_label_OBJECTS) \ $(nodist_grub_render_label_OBJECTS) grub_render_label_DEPENDENCIES = libgrubmods.a libgrubgcry.a \ libgrubkern.a grub-core/lib/gnulib/libgnu.a \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) grub_render_label_LINK = $(CCLD) $(grub_render_label_CFLAGS) $(CFLAGS) \ $(grub_render_label_LDFLAGS) $(LDFLAGS) -o $@ am_grub_script_check_OBJECTS = \ grub-core/kern/emu/grub_script_check-argp_common.$(OBJEXT) \ grub-core/osdep/grub_script_check-init.$(OBJEXT) \ util/grub_script_check-grub-script-check.$(OBJEXT) nodist_grub_script_check_OBJECTS = grub_script_check_OBJECTS = $(am_grub_script_check_OBJECTS) \ $(nodist_grub_script_check_OBJECTS) grub_script_check_DEPENDENCIES = libgrubmods.a libgrubgcry.a \ libgrubkern.a grub-core/lib/gnulib/libgnu.a \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) grub_script_check_LINK = $(CCLD) $(grub_script_check_CFLAGS) $(CFLAGS) \ $(grub_script_check_LDFLAGS) $(LDFLAGS) -o $@ am_grub_sparc64_setup_OBJECTS = \ grub-core/kern/emu/grub_sparc64_setup-argp_common.$(OBJEXT) \ grub-core/lib/grub_sparc64_setup-reed_solomon.$(OBJEXT) \ grub-core/osdep/grub_sparc64_setup-blocklist.$(OBJEXT) \ grub-core/osdep/grub_sparc64_setup-init.$(OBJEXT) \ grub-core/osdep/grub_sparc64_setup-ofpath.$(OBJEXT) \ util/grub_sparc64_setup-grub-setup.$(OBJEXT) \ util/grub_sparc64_setup-setup_sparc.$(OBJEXT) nodist_grub_sparc64_setup_OBJECTS = grub_sparc64_setup_OBJECTS = $(am_grub_sparc64_setup_OBJECTS) \ $(nodist_grub_sparc64_setup_OBJECTS) grub_sparc64_setup_DEPENDENCIES = libgrubmods.a libgrubkern.a \ libgrubgcry.a grub-core/lib/gnulib/libgnu.a \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) grub_sparc64_setup_LINK = $(CCLD) $(grub_sparc64_setup_CFLAGS) \ $(CFLAGS) $(grub_sparc64_setup_LDFLAGS) $(LDFLAGS) -o $@ am_grub_syslinux2cfg_OBJECTS = \ grub-core/disk/grub_syslinux2cfg-host.$(OBJEXT) \ grub-core/kern/emu/grub_syslinux2cfg-argp_common.$(OBJEXT) \ grub-core/kern/emu/grub_syslinux2cfg-hostfs.$(OBJEXT) \ grub-core/lib/grub_syslinux2cfg-getline.$(OBJEXT) \ grub-core/lib/grub_syslinux2cfg-syslinux_parse.$(OBJEXT) \ grub-core/osdep/grub_syslinux2cfg-init.$(OBJEXT) \ util/grub_syslinux2cfg-grub-syslinux2cfg.$(OBJEXT) nodist_grub_syslinux2cfg_OBJECTS = grub_syslinux2cfg_OBJECTS = $(am_grub_syslinux2cfg_OBJECTS) \ $(nodist_grub_syslinux2cfg_OBJECTS) grub_syslinux2cfg_DEPENDENCIES = libgrubmods.a libgrubgcry.a \ libgrubkern.a grub-core/lib/gnulib/libgnu.a \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) grub_syslinux2cfg_LINK = $(CCLD) $(grub_syslinux2cfg_CFLAGS) $(CFLAGS) \ $(grub_syslinux2cfg_LDFLAGS) $(LDFLAGS) -o $@ am_printf_test_OBJECTS = grub-core/kern/printf_test-list.$(OBJEXT) \ grub-core/kern/printf_test-misc.$(OBJEXT) \ grub-core/tests/lib/printf_test-test.$(OBJEXT) \ tests/lib/printf_test-unit_test.$(OBJEXT) \ tests/printf_test-printf_unit_test.$(OBJEXT) nodist_printf_test_OBJECTS = printf_test_OBJECTS = $(am_printf_test_OBJECTS) \ $(nodist_printf_test_OBJECTS) printf_test_DEPENDENCIES = libgrubmods.a libgrubgcry.a libgrubkern.a \ grub-core/lib/gnulib/libgnu.a $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) printf_test_LINK = $(CCLD) $(printf_test_CFLAGS) $(CFLAGS) \ $(printf_test_LDFLAGS) $(LDFLAGS) -o $@ am__priority_queue_unit_test_SOURCES_DIST = grub-core/kern/list.c \ grub-core/kern/misc.c grub-core/lib/priority_queue.c \ grub-core/tests/lib/test.c tests/lib/unit_test.c \ tests/priority_queue_unit_test.cc @COND_HAVE_CXX_TRUE@am_priority_queue_unit_test_OBJECTS = grub-core/kern/priority_queue_unit_test-list.$(OBJEXT) \ @COND_HAVE_CXX_TRUE@ grub-core/kern/priority_queue_unit_test-misc.$(OBJEXT) \ @COND_HAVE_CXX_TRUE@ grub-core/lib/priority_queue_unit_test-priority_queue.$(OBJEXT) \ @COND_HAVE_CXX_TRUE@ grub-core/tests/lib/priority_queue_unit_test-test.$(OBJEXT) \ @COND_HAVE_CXX_TRUE@ tests/lib/priority_queue_unit_test-unit_test.$(OBJEXT) \ @COND_HAVE_CXX_TRUE@ tests/priority_queue_unit_test-priority_queue_unit_test.$(OBJEXT) nodist_priority_queue_unit_test_OBJECTS = priority_queue_unit_test_OBJECTS = \ $(am_priority_queue_unit_test_OBJECTS) \ $(nodist_priority_queue_unit_test_OBJECTS) @COND_HAVE_CXX_TRUE@priority_queue_unit_test_DEPENDENCIES = \ @COND_HAVE_CXX_TRUE@ libgrubmods.a libgrubgcry.a libgrubkern.a \ @COND_HAVE_CXX_TRUE@ grub-core/lib/gnulib/libgnu.a \ @COND_HAVE_CXX_TRUE@ $(am__DEPENDENCIES_1) \ @COND_HAVE_CXX_TRUE@ $(am__DEPENDENCIES_1) \ @COND_HAVE_CXX_TRUE@ $(am__DEPENDENCIES_1) \ @COND_HAVE_CXX_TRUE@ $(am__DEPENDENCIES_1) priority_queue_unit_test_LINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \ $(priority_queue_unit_test_LDFLAGS) $(LDFLAGS) -o $@ am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } SCRIPTS = $(bin_SCRIPTS) $(grubconf_SCRIPTS) $(noinst_SCRIPTS) \ $(platform_SCRIPTS) $(sbin_SCRIPTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/grub_fstest-grub_fstest_init.Po \ ./$(DEPDIR)/grub_mount-grub_fstest_init.Po \ ./$(DEPDIR)/libgrubmods_a-grub_script.tab.Po \ ./$(DEPDIR)/libgrubmods_a-grub_script.yy.Po \ ./$(DEPDIR)/libgrubmods_a-libgrub_a_init.Po \ grub-core/$(DEPDIR)/libgrubmods_a-unidata.Po \ grub-core/commands/$(DEPDIR)/grub_file-file.Po \ grub-core/commands/$(DEPDIR)/grub_file-file32.Po \ grub-core/commands/$(DEPDIR)/grub_file-file64.Po \ grub-core/commands/$(DEPDIR)/libgrubkern_a-extcmd.Po \ grub-core/commands/$(DEPDIR)/libgrubmods_a-blocklist.Po \ grub-core/commands/$(DEPDIR)/libgrubmods_a-ls.Po \ grub-core/commands/$(DEPDIR)/libgrubmods_a-macbless.Po \ grub-core/commands/$(DEPDIR)/libgrubmods_a-testload.Po \ grub-core/commands/$(DEPDIR)/libgrubmods_a-xnu_uuid.Po \ grub-core/commands/tpm2_key_protector/$(DEPDIR)/grub_protect-args.Po \ grub-core/commands/tpm2_key_protector/$(DEPDIR)/grub_protect-tpm2key_asn1_tab.Po \ grub-core/disk/$(DEPDIR)/grub_file-host.Po \ grub-core/disk/$(DEPDIR)/grub_fstest-host.Po \ grub-core/disk/$(DEPDIR)/grub_install-host.Po \ grub-core/disk/$(DEPDIR)/grub_mkrescue-host.Po \ grub-core/disk/$(DEPDIR)/grub_mkstandalone-host.Po \ grub-core/disk/$(DEPDIR)/grub_mount-host.Po \ grub-core/disk/$(DEPDIR)/grub_render_label-host.Po \ grub-core/disk/$(DEPDIR)/grub_syslinux2cfg-host.Po \ grub-core/disk/$(DEPDIR)/libgrubkern_a-AFSplitter.Po \ grub-core/disk/$(DEPDIR)/libgrubkern_a-cryptodisk.Po \ grub-core/disk/$(DEPDIR)/libgrubkern_a-diskfilter.Po \ grub-core/disk/$(DEPDIR)/libgrubkern_a-geli.Po \ grub-core/disk/$(DEPDIR)/libgrubkern_a-key_protector.Po \ grub-core/disk/$(DEPDIR)/libgrubkern_a-ldm.Po \ grub-core/disk/$(DEPDIR)/libgrubkern_a-luks.Po \ grub-core/disk/$(DEPDIR)/libgrubkern_a-luks2.Po \ grub-core/disk/$(DEPDIR)/libgrubmods_a-dmraid_nvidia.Po \ grub-core/disk/$(DEPDIR)/libgrubmods_a-loopback.Po \ grub-core/disk/$(DEPDIR)/libgrubmods_a-lvm.Po \ grub-core/disk/$(DEPDIR)/libgrubmods_a-mdraid1x_linux.Po \ grub-core/disk/$(DEPDIR)/libgrubmods_a-mdraid_linux.Po \ grub-core/disk/$(DEPDIR)/libgrubmods_a-mdraid_linux_be.Po \ grub-core/disk/$(DEPDIR)/libgrubmods_a-raid5_recover.Po \ grub-core/disk/$(DEPDIR)/libgrubmods_a-raid6_recover.Po \ grub-core/font/$(DEPDIR)/libgrubmods_a-font.Po \ grub-core/fs/$(DEPDIR)/libgrubkern_a-archelp.Po \ grub-core/fs/$(DEPDIR)/libgrubkern_a-proc.Po \ grub-core/fs/$(DEPDIR)/libgrubmods_a-affs.Po \ grub-core/fs/$(DEPDIR)/libgrubmods_a-afs.Po \ grub-core/fs/$(DEPDIR)/libgrubmods_a-bfs.Po \ grub-core/fs/$(DEPDIR)/libgrubmods_a-btrfs.Po \ grub-core/fs/$(DEPDIR)/libgrubmods_a-cbfs.Po \ grub-core/fs/$(DEPDIR)/libgrubmods_a-cpio.Po \ grub-core/fs/$(DEPDIR)/libgrubmods_a-cpio_be.Po \ grub-core/fs/$(DEPDIR)/libgrubmods_a-erofs.Po \ grub-core/fs/$(DEPDIR)/libgrubmods_a-exfat.Po \ grub-core/fs/$(DEPDIR)/libgrubmods_a-ext2.Po \ grub-core/fs/$(DEPDIR)/libgrubmods_a-f2fs.Po \ grub-core/fs/$(DEPDIR)/libgrubmods_a-fat.Po \ grub-core/fs/$(DEPDIR)/libgrubmods_a-fshelp.Po \ grub-core/fs/$(DEPDIR)/libgrubmods_a-hfs.Po \ grub-core/fs/$(DEPDIR)/libgrubmods_a-hfsplus.Po \ grub-core/fs/$(DEPDIR)/libgrubmods_a-hfspluscomp.Po \ grub-core/fs/$(DEPDIR)/libgrubmods_a-iso9660.Po \ grub-core/fs/$(DEPDIR)/libgrubmods_a-jfs.Po \ grub-core/fs/$(DEPDIR)/libgrubmods_a-minix.Po \ grub-core/fs/$(DEPDIR)/libgrubmods_a-minix2.Po \ grub-core/fs/$(DEPDIR)/libgrubmods_a-minix2_be.Po \ grub-core/fs/$(DEPDIR)/libgrubmods_a-minix3.Po \ grub-core/fs/$(DEPDIR)/libgrubmods_a-minix3_be.Po \ grub-core/fs/$(DEPDIR)/libgrubmods_a-minix_be.Po \ grub-core/fs/$(DEPDIR)/libgrubmods_a-newc.Po \ grub-core/fs/$(DEPDIR)/libgrubmods_a-nilfs2.Po \ grub-core/fs/$(DEPDIR)/libgrubmods_a-ntfs.Po \ grub-core/fs/$(DEPDIR)/libgrubmods_a-ntfscomp.Po \ grub-core/fs/$(DEPDIR)/libgrubmods_a-odc.Po \ grub-core/fs/$(DEPDIR)/libgrubmods_a-reiserfs.Po \ grub-core/fs/$(DEPDIR)/libgrubmods_a-romfs.Po \ grub-core/fs/$(DEPDIR)/libgrubmods_a-sfs.Po \ grub-core/fs/$(DEPDIR)/libgrubmods_a-squash4.Po \ grub-core/fs/$(DEPDIR)/libgrubmods_a-tar.Po \ grub-core/fs/$(DEPDIR)/libgrubmods_a-udf.Po \ grub-core/fs/$(DEPDIR)/libgrubmods_a-ufs.Po \ grub-core/fs/$(DEPDIR)/libgrubmods_a-ufs2.Po \ grub-core/fs/$(DEPDIR)/libgrubmods_a-ufs_be.Po \ grub-core/fs/$(DEPDIR)/libgrubmods_a-xfs.Po \ grub-core/fs/zfs/$(DEPDIR)/libgrubmods_a-zfs.Po \ grub-core/fs/zfs/$(DEPDIR)/libgrubmods_a-zfs_fletcher.Po \ grub-core/fs/zfs/$(DEPDIR)/libgrubmods_a-zfs_lz4.Po \ grub-core/fs/zfs/$(DEPDIR)/libgrubmods_a-zfs_lzjb.Po \ grub-core/fs/zfs/$(DEPDIR)/libgrubmods_a-zfs_sha256.Po \ grub-core/fs/zfs/$(DEPDIR)/libgrubmods_a-zfscrypt.Po \ grub-core/fs/zfs/$(DEPDIR)/libgrubmods_a-zfsinfo.Po \ grub-core/gfxmenu/$(DEPDIR)/libgrubmods_a-font.Po \ grub-core/io/$(DEPDIR)/grub_file-offset.Po \ grub-core/io/$(DEPDIR)/libgrubmods_a-bufio.Po \ grub-core/io/$(DEPDIR)/libgrubmods_a-gzio.Po \ grub-core/io/$(DEPDIR)/libgrubmods_a-lzopio.Po \ grub-core/io/$(DEPDIR)/libgrubmods_a-xzio.Po \ grub-core/kern/$(DEPDIR)/cmp_test-list.Po \ grub-core/kern/$(DEPDIR)/cmp_test-misc.Po \ grub-core/kern/$(DEPDIR)/date_test-list.Po \ grub-core/kern/$(DEPDIR)/date_test-misc.Po \ grub-core/kern/$(DEPDIR)/example_unit_test-list.Po \ grub-core/kern/$(DEPDIR)/example_unit_test-misc.Po \ grub-core/kern/$(DEPDIR)/grub_file-elf.Po \ grub-core/kern/$(DEPDIR)/libgrubkern_a-command.Po \ grub-core/kern/$(DEPDIR)/libgrubkern_a-device.Po \ grub-core/kern/$(DEPDIR)/libgrubkern_a-disk.Po \ grub-core/kern/$(DEPDIR)/libgrubkern_a-env.Po \ grub-core/kern/$(DEPDIR)/libgrubkern_a-err.Po \ grub-core/kern/$(DEPDIR)/libgrubkern_a-file.Po \ grub-core/kern/$(DEPDIR)/libgrubkern_a-fs.Po \ grub-core/kern/$(DEPDIR)/libgrubkern_a-list.Po \ grub-core/kern/$(DEPDIR)/libgrubkern_a-misc.Po \ grub-core/kern/$(DEPDIR)/libgrubkern_a-partition.Po \ grub-core/kern/$(DEPDIR)/printf_test-list.Po \ grub-core/kern/$(DEPDIR)/printf_test-misc.Po \ grub-core/kern/$(DEPDIR)/priority_queue_unit_test-list.Po \ grub-core/kern/$(DEPDIR)/priority_queue_unit_test-misc.Po \ grub-core/kern/arm/$(DEPDIR)/libgrubmods_a-dl_helper.Po \ grub-core/kern/arm64/$(DEPDIR)/libgrubmods_a-dl_helper.Po \ grub-core/kern/emu/$(DEPDIR)/grub_bios_setup-argp_common.Po \ grub-core/kern/emu/$(DEPDIR)/grub_file-hostfs.Po \ grub-core/kern/emu/$(DEPDIR)/grub_fstest-hostfs.Po \ grub-core/kern/emu/$(DEPDIR)/grub_glue_efi-argp_common.Po \ grub-core/kern/emu/$(DEPDIR)/grub_install-argp_common.Po \ grub-core/kern/emu/$(DEPDIR)/grub_install-hostfs.Po \ grub-core/kern/emu/$(DEPDIR)/grub_macbless-argp_common.Po \ grub-core/kern/emu/$(DEPDIR)/grub_mkfont-argp_common.Po \ grub-core/kern/emu/$(DEPDIR)/grub_mkimage-argp_common.Po \ grub-core/kern/emu/$(DEPDIR)/grub_mklayout-argp_common.Po \ grub-core/kern/emu/$(DEPDIR)/grub_mknetdir-argp_common.Po \ grub-core/kern/emu/$(DEPDIR)/grub_mkpasswd_pbkdf2-argp_common.Po \ grub-core/kern/emu/$(DEPDIR)/grub_mkrelpath-argp_common.Po \ grub-core/kern/emu/$(DEPDIR)/grub_mkrescue-argp_common.Po \ grub-core/kern/emu/$(DEPDIR)/grub_mkrescue-hostfs.Po \ grub-core/kern/emu/$(DEPDIR)/grub_mkstandalone-argp_common.Po \ grub-core/kern/emu/$(DEPDIR)/grub_mkstandalone-hostfs.Po \ grub-core/kern/emu/$(DEPDIR)/grub_mount-hostfs.Po \ grub-core/kern/emu/$(DEPDIR)/grub_probe-argp_common.Po \ grub-core/kern/emu/$(DEPDIR)/grub_protect-argp_common.Po \ grub-core/kern/emu/$(DEPDIR)/grub_render_label-argp_common.Po \ grub-core/kern/emu/$(DEPDIR)/grub_render_label-hostfs.Po \ grub-core/kern/emu/$(DEPDIR)/grub_script_check-argp_common.Po \ grub-core/kern/emu/$(DEPDIR)/grub_sparc64_setup-argp_common.Po \ grub-core/kern/emu/$(DEPDIR)/grub_syslinux2cfg-argp_common.Po \ grub-core/kern/emu/$(DEPDIR)/grub_syslinux2cfg-hostfs.Po \ grub-core/kern/emu/$(DEPDIR)/libgrubkern_a-hostdisk.Po \ grub-core/kern/emu/$(DEPDIR)/libgrubkern_a-misc.Po \ grub-core/kern/emu/$(DEPDIR)/libgrubkern_a-mm.Po \ grub-core/kern/ia64/$(DEPDIR)/libgrubmods_a-dl_helper.Po \ grub-core/kern/loongarch64/$(DEPDIR)/libgrubmods_a-dl_helper.Po \ grub-core/lib/$(DEPDIR)/grub_bios_setup-reed_solomon.Po \ grub-core/lib/$(DEPDIR)/grub_install-reed_solomon.Po \ grub-core/lib/$(DEPDIR)/grub_menulst2cfg-legacy_parse.Po \ grub-core/lib/$(DEPDIR)/grub_mknetdir-reed_solomon.Po \ grub-core/lib/$(DEPDIR)/grub_mkrescue-reed_solomon.Po \ grub-core/lib/$(DEPDIR)/grub_mkstandalone-reed_solomon.Po \ grub-core/lib/$(DEPDIR)/grub_sparc64_setup-reed_solomon.Po \ grub-core/lib/$(DEPDIR)/grub_syslinux2cfg-getline.Po \ grub-core/lib/$(DEPDIR)/grub_syslinux2cfg-syslinux_parse.Po \ grub-core/lib/$(DEPDIR)/libgrubkern_a-arg.Po \ grub-core/lib/$(DEPDIR)/libgrubkern_a-crypto.Po \ grub-core/lib/$(DEPDIR)/libgrubkern_a-disk.Po \ grub-core/lib/$(DEPDIR)/libgrubkern_a-pbkdf2.Po \ grub-core/lib/$(DEPDIR)/libgrubmods_a-LzFind.Po \ grub-core/lib/$(DEPDIR)/libgrubmods_a-LzmaEnc.Po \ grub-core/lib/$(DEPDIR)/libgrubmods_a-adler32.Po \ grub-core/lib/$(DEPDIR)/libgrubmods_a-crc.Po \ grub-core/lib/$(DEPDIR)/libgrubmods_a-crc64.Po \ grub-core/lib/$(DEPDIR)/libgrubmods_a-datetime.Po \ grub-core/lib/$(DEPDIR)/libgrubmods_a-envblk.Po \ grub-core/lib/$(DEPDIR)/libgrubmods_a-hexdump.Po \ grub-core/lib/$(DEPDIR)/priority_queue_unit_test-priority_queue.Po \ grub-core/lib/i386/pc/$(DEPDIR)/grub_menulst2cfg-vesa_modes_table.Po \ grub-core/lib/json/$(DEPDIR)/libgrubkern_a-json.Po \ grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-arcfour.Po \ grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-aria.Po \ grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-blake2.Po \ grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-blowfish.Po \ grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-camellia-glue.Po \ grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-camellia.Po \ grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-cast5.Po \ grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-crc.Po \ grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-des.Po \ grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-gost28147.Po \ grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-gostr3411-94.Po \ grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-hash-common.Po \ grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-idea.Po \ grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-init.Po \ grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-keccak.Po \ grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-md4.Po \ grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-md5.Po \ grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-rfc2268.Po \ grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-rijndael.Po \ grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-rmd160.Po \ grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-salsa20.Po \ grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-seed.Po \ grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-serpent.Po \ grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-sha1.Po \ grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-sha256.Po \ grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-sha512.Po \ grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-sm3.Po \ grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-sm4.Po \ grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-stribog.Po \ grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-tiger.Po \ grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-twofish.Po \ grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-whirlpool.Po \ grub-core/lib/libgcrypt-grub/src/$(DEPDIR)/libgrubgcry_a-const-time.Po \ grub-core/lib/minilzo/$(DEPDIR)/libgrubmods_a-minilzo.Po \ grub-core/lib/tss2/$(DEPDIR)/grub_protect-buffer.Po \ grub-core/lib/tss2/$(DEPDIR)/grub_protect-tpm2_cmd.Po \ grub-core/lib/tss2/$(DEPDIR)/grub_protect-tss2_mu.Po \ grub-core/lib/xzembed/$(DEPDIR)/libgrubmods_a-xz_dec_bcj.Po \ grub-core/lib/xzembed/$(DEPDIR)/libgrubmods_a-xz_dec_lzma2.Po \ grub-core/lib/xzembed/$(DEPDIR)/libgrubmods_a-xz_dec_stream.Po \ grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-debug.Po \ grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-entropy_common.Po \ grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-error_private.Po \ grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-fse_decompress.Po \ grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-huf_decompress.Po \ grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-module.Po \ grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-xxhash.Po \ grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-zstd_common.Po \ grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-zstd_decompress.Po \ grub-core/loader/$(DEPDIR)/grub_file-lzss.Po \ grub-core/loader/$(DEPDIR)/grub_file-macho.Po \ grub-core/loader/$(DEPDIR)/grub_file-macho32.Po \ grub-core/loader/$(DEPDIR)/grub_file-macho64.Po \ grub-core/loader/i386/$(DEPDIR)/grub_file-xen_file.Po \ grub-core/loader/i386/$(DEPDIR)/grub_file-xen_file32.Po \ grub-core/loader/i386/$(DEPDIR)/grub_file-xen_file64.Po \ grub-core/normal/$(DEPDIR)/libgrubmods_a-charset.Po \ grub-core/normal/$(DEPDIR)/libgrubmods_a-misc.Po \ grub-core/osdep/$(DEPDIR)/grub_bios_setup-blocklist.Po \ grub-core/osdep/$(DEPDIR)/grub_bios_setup-init.Po \ grub-core/osdep/$(DEPDIR)/grub_editenv-compress.Po \ grub-core/osdep/$(DEPDIR)/grub_editenv-config.Po \ grub-core/osdep/$(DEPDIR)/grub_editenv-init.Po \ grub-core/osdep/$(DEPDIR)/grub_file-init.Po \ grub-core/osdep/$(DEPDIR)/grub_fstest-init.Po \ grub-core/osdep/$(DEPDIR)/grub_glue_efi-init.Po \ grub-core/osdep/$(DEPDIR)/grub_install-blocklist.Po \ grub-core/osdep/$(DEPDIR)/grub_install-compress.Po \ grub-core/osdep/$(DEPDIR)/grub_install-config.Po \ grub-core/osdep/$(DEPDIR)/grub_install-init.Po \ grub-core/osdep/$(DEPDIR)/grub_install-ofpath.Po \ grub-core/osdep/$(DEPDIR)/grub_install-platform.Po \ grub-core/osdep/$(DEPDIR)/grub_install-platform_unix.Po \ grub-core/osdep/$(DEPDIR)/grub_install-random.Po \ grub-core/osdep/$(DEPDIR)/grub_macbless-init.Po \ grub-core/osdep/$(DEPDIR)/grub_menulst2cfg-init.Po \ grub-core/osdep/$(DEPDIR)/grub_mkfont-init.Po \ grub-core/osdep/$(DEPDIR)/grub_mkimage-config.Po \ grub-core/osdep/$(DEPDIR)/grub_mkimage-init.Po \ grub-core/osdep/$(DEPDIR)/grub_mklayout-init.Po \ grub-core/osdep/$(DEPDIR)/grub_mknetdir-blocklist.Po \ grub-core/osdep/$(DEPDIR)/grub_mknetdir-compress.Po \ grub-core/osdep/$(DEPDIR)/grub_mknetdir-config.Po \ grub-core/osdep/$(DEPDIR)/grub_mknetdir-init.Po \ grub-core/osdep/$(DEPDIR)/grub_mknetdir-ofpath.Po \ grub-core/osdep/$(DEPDIR)/grub_mknetdir-platform.Po \ grub-core/osdep/$(DEPDIR)/grub_mknetdir-platform_unix.Po \ grub-core/osdep/$(DEPDIR)/grub_mknetdir-random.Po \ grub-core/osdep/$(DEPDIR)/grub_mkpasswd_pbkdf2-init.Po \ grub-core/osdep/$(DEPDIR)/grub_mkpasswd_pbkdf2-random.Po \ grub-core/osdep/$(DEPDIR)/grub_mkrelpath-init.Po \ grub-core/osdep/$(DEPDIR)/grub_mkrescue-blocklist.Po \ grub-core/osdep/$(DEPDIR)/grub_mkrescue-compress.Po \ grub-core/osdep/$(DEPDIR)/grub_mkrescue-config.Po \ grub-core/osdep/$(DEPDIR)/grub_mkrescue-init.Po \ grub-core/osdep/$(DEPDIR)/grub_mkrescue-ofpath.Po \ grub-core/osdep/$(DEPDIR)/grub_mkrescue-platform.Po \ grub-core/osdep/$(DEPDIR)/grub_mkrescue-platform_unix.Po \ grub-core/osdep/$(DEPDIR)/grub_mkrescue-random.Po \ grub-core/osdep/$(DEPDIR)/grub_mkstandalone-blocklist.Po \ grub-core/osdep/$(DEPDIR)/grub_mkstandalone-compress.Po \ grub-core/osdep/$(DEPDIR)/grub_mkstandalone-config.Po \ grub-core/osdep/$(DEPDIR)/grub_mkstandalone-init.Po \ grub-core/osdep/$(DEPDIR)/grub_mkstandalone-ofpath.Po \ grub-core/osdep/$(DEPDIR)/grub_mkstandalone-platform.Po \ grub-core/osdep/$(DEPDIR)/grub_mkstandalone-platform_unix.Po \ grub-core/osdep/$(DEPDIR)/grub_mkstandalone-random.Po \ grub-core/osdep/$(DEPDIR)/grub_mount-init.Po \ grub-core/osdep/$(DEPDIR)/grub_ofpathname-init.Po \ grub-core/osdep/$(DEPDIR)/grub_ofpathname-ofpath.Po \ grub-core/osdep/$(DEPDIR)/grub_probe-init.Po \ grub-core/osdep/$(DEPDIR)/grub_probe-ofpath.Po \ grub-core/osdep/$(DEPDIR)/grub_protect-init.Po \ grub-core/osdep/$(DEPDIR)/grub_render_label-init.Po \ grub-core/osdep/$(DEPDIR)/grub_script_check-init.Po \ grub-core/osdep/$(DEPDIR)/grub_sparc64_setup-blocklist.Po \ grub-core/osdep/$(DEPDIR)/grub_sparc64_setup-init.Po \ grub-core/osdep/$(DEPDIR)/grub_sparc64_setup-ofpath.Po \ grub-core/osdep/$(DEPDIR)/grub_syslinux2cfg-init.Po \ grub-core/osdep/$(DEPDIR)/libgrubkern_a-exec.Po \ grub-core/osdep/$(DEPDIR)/libgrubkern_a-getroot.Po \ grub-core/osdep/$(DEPDIR)/libgrubkern_a-hostdisk.Po \ grub-core/osdep/$(DEPDIR)/libgrubkern_a-password.Po \ grub-core/osdep/$(DEPDIR)/libgrubkern_a-relpath.Po \ grub-core/osdep/$(DEPDIR)/libgrubkern_a-sleep.Po \ grub-core/osdep/devmapper/$(DEPDIR)/libgrubkern_a-getroot.Po \ grub-core/osdep/devmapper/$(DEPDIR)/libgrubkern_a-hostdisk.Po \ grub-core/osdep/unix/$(DEPDIR)/libgrubkern_a-getroot.Po \ grub-core/osdep/unix/$(DEPDIR)/libgrubkern_a-hostdisk.Po \ grub-core/partmap/$(DEPDIR)/libgrubkern_a-gpt.Po \ grub-core/partmap/$(DEPDIR)/libgrubkern_a-msdos.Po \ grub-core/partmap/$(DEPDIR)/libgrubmods_a-acorn.Po \ grub-core/partmap/$(DEPDIR)/libgrubmods_a-amiga.Po \ grub-core/partmap/$(DEPDIR)/libgrubmods_a-apple.Po \ grub-core/partmap/$(DEPDIR)/libgrubmods_a-bsdlabel.Po \ grub-core/partmap/$(DEPDIR)/libgrubmods_a-dfly.Po \ grub-core/partmap/$(DEPDIR)/libgrubmods_a-dvh.Po \ grub-core/partmap/$(DEPDIR)/libgrubmods_a-plan.Po \ grub-core/partmap/$(DEPDIR)/libgrubmods_a-sun.Po \ grub-core/partmap/$(DEPDIR)/libgrubmods_a-sunpc.Po \ grub-core/script/$(DEPDIR)/libgrubmods_a-argv.Po \ grub-core/script/$(DEPDIR)/libgrubmods_a-function.Po \ grub-core/script/$(DEPDIR)/libgrubmods_a-lexer.Po \ grub-core/script/$(DEPDIR)/libgrubmods_a-main.Po \ grub-core/script/$(DEPDIR)/libgrubmods_a-script.Po \ grub-core/tests/lib/$(DEPDIR)/cmp_test-test.Po \ grub-core/tests/lib/$(DEPDIR)/date_test-test.Po \ grub-core/tests/lib/$(DEPDIR)/example_unit_test-test.Po \ grub-core/tests/lib/$(DEPDIR)/printf_test-test.Po \ grub-core/tests/lib/$(DEPDIR)/priority_queue_unit_test-test.Po \ grub-core/video/$(DEPDIR)/libgrubmods_a-capture.Po \ grub-core/video/$(DEPDIR)/libgrubmods_a-colors.Po \ grub-core/video/$(DEPDIR)/libgrubmods_a-video.Po \ grub-core/video/fb/$(DEPDIR)/libgrubmods_a-fbblit.Po \ grub-core/video/fb/$(DEPDIR)/libgrubmods_a-fbfill.Po \ grub-core/video/fb/$(DEPDIR)/libgrubmods_a-fbutil.Po \ grub-core/video/fb/$(DEPDIR)/libgrubmods_a-video_fb.Po \ tests/$(DEPDIR)/cmp_test-cmp_unit_test.Po \ tests/$(DEPDIR)/date_test-date_unit_test.Po \ tests/$(DEPDIR)/example_unit_test-example_unit_test.Po \ tests/$(DEPDIR)/printf_test-printf_unit_test.Po \ tests/$(DEPDIR)/priority_queue_unit_test-priority_queue_unit_test.Po \ tests/lib/$(DEPDIR)/cmp_test-unit_test.Po \ tests/lib/$(DEPDIR)/date_test-unit_test.Po \ tests/lib/$(DEPDIR)/example_unit_test-unit_test.Po \ tests/lib/$(DEPDIR)/printf_test-unit_test.Po \ tests/lib/$(DEPDIR)/priority_queue_unit_test-unit_test.Po \ util/$(DEPDIR)/grub_bios_setup-grub-setup.Po \ util/$(DEPDIR)/grub_bios_setup-setup_bios.Po \ util/$(DEPDIR)/grub_editenv-config.Po \ util/$(DEPDIR)/grub_editenv-editenv.Po \ util/$(DEPDIR)/grub_editenv-grub-editenv.Po \ util/$(DEPDIR)/grub_editenv-grub-install-common.Po \ util/$(DEPDIR)/grub_editenv-grub-mkimage32.Po \ util/$(DEPDIR)/grub_editenv-grub-mkimage64.Po \ util/$(DEPDIR)/grub_editenv-mkimage.Po \ util/$(DEPDIR)/grub_editenv-resolve.Po \ util/$(DEPDIR)/grub_file-grub-file.Po \ util/$(DEPDIR)/grub_file-render-label.Po \ util/$(DEPDIR)/grub_fstest-grub-fstest.Po \ util/$(DEPDIR)/grub_glue_efi-glue-efi.Po \ util/$(DEPDIR)/grub_glue_efi-grub-glue-efi.Po \ util/$(DEPDIR)/grub_install-config.Po \ util/$(DEPDIR)/grub_install-editenv.Po \ util/$(DEPDIR)/grub_install-grub-install-common.Po \ util/$(DEPDIR)/grub_install-grub-install.Po \ util/$(DEPDIR)/grub_install-grub-mkimage32.Po \ util/$(DEPDIR)/grub_install-grub-mkimage64.Po \ util/$(DEPDIR)/grub_install-mkimage.Po \ util/$(DEPDIR)/grub_install-probe.Po \ util/$(DEPDIR)/grub_install-render-label.Po \ util/$(DEPDIR)/grub_install-resolve.Po \ util/$(DEPDIR)/grub_install-setup_bios.Po \ util/$(DEPDIR)/grub_install-setup_sparc.Po \ util/$(DEPDIR)/grub_macbless-grub-macbless.Po \ util/$(DEPDIR)/grub_macho2img-grub-macho2img.Po \ util/$(DEPDIR)/grub_menulst2cfg-grub-menulst2cfg.Po \ util/$(DEPDIR)/grub_mkfont-grub-mkfont.Po \ util/$(DEPDIR)/grub_mkimage-config.Po \ util/$(DEPDIR)/grub_mkimage-grub-mkimage.Po \ util/$(DEPDIR)/grub_mkimage-grub-mkimage32.Po \ util/$(DEPDIR)/grub_mkimage-grub-mkimage64.Po \ util/$(DEPDIR)/grub_mkimage-mkimage.Po \ util/$(DEPDIR)/grub_mkimage-resolve.Po \ util/$(DEPDIR)/grub_mklayout-grub-mklayout.Po \ util/$(DEPDIR)/grub_mknetdir-config.Po \ util/$(DEPDIR)/grub_mknetdir-editenv.Po \ util/$(DEPDIR)/grub_mknetdir-grub-install-common.Po \ util/$(DEPDIR)/grub_mknetdir-grub-mkimage32.Po \ util/$(DEPDIR)/grub_mknetdir-grub-mkimage64.Po \ util/$(DEPDIR)/grub_mknetdir-grub-mknetdir.Po \ util/$(DEPDIR)/grub_mknetdir-mkimage.Po \ util/$(DEPDIR)/grub_mknetdir-resolve.Po \ util/$(DEPDIR)/grub_mknetdir-setup_bios.Po \ util/$(DEPDIR)/grub_mknetdir-setup_sparc.Po \ util/$(DEPDIR)/grub_mkpasswd_pbkdf2-grub-mkpasswd-pbkdf2.Po \ util/$(DEPDIR)/grub_mkrelpath-grub-mkrelpath.Po \ util/$(DEPDIR)/grub_mkrescue-config.Po \ util/$(DEPDIR)/grub_mkrescue-editenv.Po \ util/$(DEPDIR)/grub_mkrescue-glue-efi.Po \ util/$(DEPDIR)/grub_mkrescue-grub-install-common.Po \ util/$(DEPDIR)/grub_mkrescue-grub-mkimage32.Po \ util/$(DEPDIR)/grub_mkrescue-grub-mkimage64.Po \ util/$(DEPDIR)/grub_mkrescue-grub-mkrescue.Po \ util/$(DEPDIR)/grub_mkrescue-mkimage.Po \ util/$(DEPDIR)/grub_mkrescue-render-label.Po \ util/$(DEPDIR)/grub_mkrescue-resolve.Po \ util/$(DEPDIR)/grub_mkrescue-setup_bios.Po \ util/$(DEPDIR)/grub_mkrescue-setup_sparc.Po \ util/$(DEPDIR)/grub_mkstandalone-config.Po \ util/$(DEPDIR)/grub_mkstandalone-editenv.Po \ util/$(DEPDIR)/grub_mkstandalone-glue-efi.Po \ util/$(DEPDIR)/grub_mkstandalone-grub-install-common.Po \ util/$(DEPDIR)/grub_mkstandalone-grub-mkimage32.Po \ util/$(DEPDIR)/grub_mkstandalone-grub-mkimage64.Po \ util/$(DEPDIR)/grub_mkstandalone-grub-mkstandalone.Po \ util/$(DEPDIR)/grub_mkstandalone-mkimage.Po \ util/$(DEPDIR)/grub_mkstandalone-render-label.Po \ util/$(DEPDIR)/grub_mkstandalone-resolve.Po \ util/$(DEPDIR)/grub_mkstandalone-setup_bios.Po \ util/$(DEPDIR)/grub_mkstandalone-setup_sparc.Po \ util/$(DEPDIR)/grub_mount-grub-mount.Po \ util/$(DEPDIR)/grub_probe-grub-probe.Po \ util/$(DEPDIR)/grub_probe-probe.Po \ util/$(DEPDIR)/grub_protect-grub-protect.Po \ util/$(DEPDIR)/grub_protect-probe.Po \ util/$(DEPDIR)/grub_render_label-grub-render-label.Po \ util/$(DEPDIR)/grub_render_label-render-label.Po \ util/$(DEPDIR)/grub_script_check-grub-script-check.Po \ util/$(DEPDIR)/grub_sparc64_setup-grub-setup.Po \ util/$(DEPDIR)/grub_sparc64_setup-setup_sparc.Po \ util/$(DEPDIR)/grub_syslinux2cfg-grub-syslinux2cfg.Po \ util/$(DEPDIR)/libgrubkern_a-getroot.Po \ util/$(DEPDIR)/libgrubkern_a-misc.Po \ util/ieee1275/$(DEPDIR)/grub_ofpathname-grub-ofpathname.Po am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = SOURCES = $(libgrubgcry_a_SOURCES) $(nodist_libgrubgcry_a_SOURCES) \ $(libgrubkern_a_SOURCES) $(nodist_libgrubkern_a_SOURCES) \ $(libgrubmods_a_SOURCES) $(nodist_libgrubmods_a_SOURCES) \ $(cmp_test_SOURCES) $(nodist_cmp_test_SOURCES) \ $(date_test_SOURCES) $(nodist_date_test_SOURCES) \ $(example_unit_test_SOURCES) \ $(nodist_example_unit_test_SOURCES) $(grub_bios_setup_SOURCES) \ $(nodist_grub_bios_setup_SOURCES) $(grub_editenv_SOURCES) \ $(nodist_grub_editenv_SOURCES) $(grub_file_SOURCES) \ $(nodist_grub_file_SOURCES) $(grub_fstest_SOURCES) \ $(nodist_grub_fstest_SOURCES) $(grub_glue_efi_SOURCES) \ $(nodist_grub_glue_efi_SOURCES) $(grub_install_SOURCES) \ $(nodist_grub_install_SOURCES) $(grub_macbless_SOURCES) \ $(nodist_grub_macbless_SOURCES) $(grub_macho2img_SOURCES) \ $(nodist_grub_macho2img_SOURCES) $(grub_menulst2cfg_SOURCES) \ $(nodist_grub_menulst2cfg_SOURCES) $(grub_mkfont_SOURCES) \ $(nodist_grub_mkfont_SOURCES) $(grub_mkimage_SOURCES) \ $(nodist_grub_mkimage_SOURCES) $(grub_mklayout_SOURCES) \ $(nodist_grub_mklayout_SOURCES) $(grub_mknetdir_SOURCES) \ $(nodist_grub_mknetdir_SOURCES) \ $(grub_mkpasswd_pbkdf2_SOURCES) \ $(nodist_grub_mkpasswd_pbkdf2_SOURCES) \ $(grub_mkrelpath_SOURCES) $(nodist_grub_mkrelpath_SOURCES) \ $(grub_mkrescue_SOURCES) $(nodist_grub_mkrescue_SOURCES) \ $(grub_mkstandalone_SOURCES) \ $(nodist_grub_mkstandalone_SOURCES) $(grub_mount_SOURCES) \ $(nodist_grub_mount_SOURCES) $(grub_ofpathname_SOURCES) \ $(nodist_grub_ofpathname_SOURCES) $(grub_probe_SOURCES) \ $(nodist_grub_probe_SOURCES) $(grub_protect_SOURCES) \ $(nodist_grub_protect_SOURCES) $(grub_render_label_SOURCES) \ $(nodist_grub_render_label_SOURCES) \ $(grub_script_check_SOURCES) \ $(nodist_grub_script_check_SOURCES) \ $(grub_sparc64_setup_SOURCES) \ $(nodist_grub_sparc64_setup_SOURCES) \ $(grub_syslinux2cfg_SOURCES) \ $(nodist_grub_syslinux2cfg_SOURCES) $(printf_test_SOURCES) \ $(nodist_printf_test_SOURCES) \ $(priority_queue_unit_test_SOURCES) \ $(nodist_priority_queue_unit_test_SOURCES) DIST_SOURCES = $(libgrubgcry_a_SOURCES) $(libgrubkern_a_SOURCES) \ $(libgrubmods_a_SOURCES) $(cmp_test_SOURCES) \ $(date_test_SOURCES) $(example_unit_test_SOURCES) \ $(grub_bios_setup_SOURCES) $(grub_editenv_SOURCES) \ $(grub_file_SOURCES) $(grub_fstest_SOURCES) \ $(grub_glue_efi_SOURCES) $(grub_install_SOURCES) \ $(grub_macbless_SOURCES) $(am__grub_macho2img_SOURCES_DIST) \ $(grub_menulst2cfg_SOURCES) $(am__grub_mkfont_SOURCES_DIST) \ $(grub_mkimage_SOURCES) $(grub_mklayout_SOURCES) \ $(grub_mknetdir_SOURCES) $(grub_mkpasswd_pbkdf2_SOURCES) \ $(grub_mkrelpath_SOURCES) $(am__grub_mkrescue_SOURCES_DIST) \ $(grub_mkstandalone_SOURCES) $(am__grub_mount_SOURCES_DIST) \ $(grub_ofpathname_SOURCES) $(grub_probe_SOURCES) \ $(am__grub_protect_SOURCES_DIST) $(grub_render_label_SOURCES) \ $(grub_script_check_SOURCES) $(grub_sparc64_setup_SOURCES) \ $(grub_syslinux2cfg_SOURCES) $(printf_test_SOURCES) \ $(am__priority_queue_unit_test_SOURCES_DIST) RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac man1dir = $(mandir)/man1 man8dir = $(mandir)/man8 NROFF = nroff MANS = $(man_MANS) am__dist_noinst_DATA_DIST = grub-core/kern/disk_common.c \ grub-core/osdep/unix/relpath.c grub-core/osdep/aros/relpath.c \ grub-core/osdep/windows/relpath.c \ grub-core/lib/libgcrypt-grub/cipher/ChangeLog \ grub-core/osdep/aros/config.c grub-core/osdep/windows/config.c \ grub-core/osdep/unix/config.c util/grub-mkimagexx.c \ grub-core/osdep/unix/compress.c \ grub-core/osdep/basic/compress.c util/setup.c \ grub-core/osdep/generic/blocklist.c \ grub-core/osdep/linux/blocklist.c \ grub-core/osdep/windows/blocklist.c \ grub-core/osdep/linux/platform.c \ grub-core/osdep/windows/platform.c \ grub-core/osdep/basic/platform.c \ grub-core/osdep/basic/no_platform.c \ grub-core/osdep/unix/platform.c util/grub.d/00_header.in \ util/grub.d/10_windows.in util/grub.d/10_hurd.in \ util/grub.d/10_kfreebsd.in util/grub.d/10_illumos.in \ util/grub.d/10_netbsd.in util/grub.d/10_linux.in \ util/grub.d/10_xnu.in util/grub.d/20_linux_xen.in \ util/grub.d/25_bli.in util/grub.d/30_os-prober.in \ util/grub.d/30_uefi-firmware.in util/grub.d/40_custom.in \ util/grub.d/41_custom.in util/grub-mkconfig.in \ util/grub-set-default.in util/grub-reboot.in \ util/grub-mkconfig_lib.in util/grub-kbdcomp.in \ tests/util/grub-shell.in tests/util/grub-shell-tester.in \ tests/util/grub-shell-luks-tester.in \ tests/util/grub-fs-tester.in tests/erofs_test.in \ tests/ext234_test.in tests/squashfs_test.in \ tests/iso9660_test.in tests/hfsplus_test.in tests/ntfs_test.in \ tests/reiserfs_test.in tests/fat_test.in tests/minixfs_test.in \ tests/xfs_test.in tests/f2fs_test.in tests/nilfs2_test.in \ tests/romfs_test.in tests/exfat_test.in tests/tar_test.in \ tests/udf_test.in tests/hfs_test.in tests/jfs_test.in \ tests/btrfs_test.in tests/zfs_test.in tests/cpio_test.in \ tests/example_scripted_test.in tests/gettext_strings_test.in \ tests/pata_test.in tests/ahci_test.in tests/uhci_test.in \ tests/ohci_test.in tests/ehci_test.in \ tests/example_grub_script_test.in tests/grub_script_eval.in \ tests/grub_script_test.in tests/grub_script_echo1.in \ tests/grub_script_leading_whitespace.in \ tests/grub_script_echo_keywords.in tests/grub_script_vars1.in \ tests/grub_script_for1.in tests/grub_script_while1.in \ tests/grub_script_if.in tests/grub_script_blanklines.in \ tests/grub_script_final_semicolon.in \ tests/grub_script_dollar.in tests/grub_script_comments.in \ tests/grub_script_functions.in tests/grub_script_break.in \ tests/grub_script_continue.in tests/grub_script_shift.in \ tests/grub_script_blockarg.in tests/grub_script_setparams.in \ tests/grub_script_return.in tests/grub_cmd_cryptomount.in \ tests/grub_cmd_regexp.in tests/grub_cmd_date.in \ tests/grub_cmd_set_date.in tests/grub_cmd_sleep.in \ tests/grub_script_expansion.in tests/grub_script_not.in \ tests/grub_script_no_commands.in tests/partmap_test.in \ tests/hddboot_test.in tests/fddboot_test.in \ tests/cdboot_test.in tests/netboot_test.in \ tests/serial_test.in tests/pseries_test.in \ tests/core_compress_test.in tests/xzcompress_test.in \ tests/gzcompress_test.in tests/lzocompress_test.in \ tests/grub_cmd_echo.in tests/help_test.in \ tests/grub_script_gettext.in tests/grub_script_escape_comma.in \ tests/grub_script_strcmp.in tests/test_sha512sum.in \ tests/test_unset.in tests/grub_func_test.in \ tests/grub_cmd_tr.in tests/file_filter_test.in \ tests/grub_cmd_test.in tests/syslinux_test.in \ tests/luks1_test.in tests/luks2_test.in tests/asn1_test.in \ tests/tpm2_key_protector_test.in DATA = $(dist_grubconf_DATA) $(dist_noinst_DATA) $(noinst_DATA) \ $(pkgdata_DATA) $(platform_DATA) $(starfield_DATA) HEADERS = $(nodist_platform_HEADERS) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ cscope check recheck distdir distdir-am dist dist-all \ distcheck am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) \ config-util.h.in # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' RECHECK_LOGS = $(TEST_LOGS) TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/build-aux/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/build-aux/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DIST_SUBDIRS = grub-core/lib/gnulib . grub-core po docs \ util/bash-completion.d am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.util.am \ $(srcdir)/config-util.h.in $(srcdir)/config.h.in \ $(srcdir)/stamp-h.in $(top_srcdir)/build-aux/compile \ $(top_srcdir)/build-aux/config.guess \ $(top_srcdir)/build-aux/config.rpath \ $(top_srcdir)/build-aux/config.sub \ $(top_srcdir)/build-aux/depcomp \ $(top_srcdir)/build-aux/install-sh \ $(top_srcdir)/build-aux/missing \ $(top_srcdir)/build-aux/test-driver \ $(top_srcdir)/conf/Makefile.common \ $(top_srcdir)/conf/Makefile.extra-dist ABOUT-NLS AUTHORS \ COPYING ChangeLog INSTALL NEWS README THANKS TODO \ build-aux/compile build-aux/config.guess \ build-aux/config.rpath build-aux/config.sub build-aux/depcomp \ build-aux/install-sh build-aux/mdate-sh build-aux/missing \ build-aux/texinfo.tex DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__post_remove_distdir = $(am__remove_distdir) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best DIST_TARGETS = dist-gzip # Exists only to be overridden by the user if desired. AM_DISTCHECK_DVI_TARGET = dvi distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ ALLOCA_H = @ALLOCA_H@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ APPLE_UNIVERSAL_BUILD = @APPLE_UNIVERSAL_BUILD@ AR = @AR@ ARFLAGS = @ARFLAGS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BITSIZEOF_PTRDIFF_T = @BITSIZEOF_PTRDIFF_T@ BITSIZEOF_SIG_ATOMIC_T = @BITSIZEOF_SIG_ATOMIC_T@ BITSIZEOF_SIZE_T = @BITSIZEOF_SIZE_T@ BITSIZEOF_WCHAR_T = @BITSIZEOF_WCHAR_T@ BITSIZEOF_WINT_T = @BITSIZEOF_WINT_T@ BOOT_TIME_STATS = @BOOT_TIME_STATS@ BSS_START_SYMBOL = @BSS_START_SYMBOL@ BUILD_CC = @BUILD_CC@ BUILD_CFLAGS = @BUILD_CFLAGS@ BUILD_CPPFLAGS = @BUILD_CPPFLAGS@ $(CPPFLAGS_DEFAULT) BUILD_EXEEXT = @BUILD_EXEEXT@ BUILD_FREETYPE_CFLAGS = @BUILD_FREETYPE_CFLAGS@ BUILD_FREETYPE_LIBS = @BUILD_FREETYPE_LIBS@ BUILD_LDFLAGS = @BUILD_LDFLAGS@ BUILD_LIBM = @BUILD_LIBM@ BUILD_SHEBANG = @BUILD_SHEBANG@ BUILD_SIZEOF_LONG = @BUILD_SIZEOF_LONG@ BUILD_SIZEOF_VOID_P = @BUILD_SIZEOF_VOID_P@ BUILD_WORDS_BIGENDIAN = @BUILD_WORDS_BIGENDIAN@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CFLAG_VISIBILITY = @CFLAG_VISIBILITY@ CMP = @CMP@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = .deps-util DISK_CACHE_STATS = @DISK_CACHE_STATS@ DJVU_FONT_SOURCE = @DJVU_FONT_SOURCE@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EFIEMU64_LINK_FORMAT = @EFIEMU64_LINK_FORMAT@ EGREP = @EGREP@ EMULTIHOP_HIDDEN = @EMULTIHOP_HIDDEN@ EMULTIHOP_VALUE = @EMULTIHOP_VALUE@ END_SYMBOL = @END_SYMBOL@ ENOLINK_HIDDEN = @ENOLINK_HIDDEN@ ENOLINK_VALUE = @ENOLINK_VALUE@ EOVERFLOW_HIDDEN = @EOVERFLOW_HIDDEN@ EOVERFLOW_VALUE = @EOVERFLOW_VALUE@ ERRNO_H = @ERRNO_H@ ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FLOAT_H = @FLOAT_H@ FNMATCH_H = @FNMATCH_H@ FONT_SOURCE = @FONT_SOURCE@ FREETYPE_CFLAGS = @FREETYPE_CFLAGS@ FREETYPE_LIBS = @FREETYPE_LIBS@ FUSE_CFLAGS = @FUSE_CFLAGS@ FUSE_LIBS = @FUSE_LIBS@ GETOPT_CDEFS_H = @GETOPT_CDEFS_H@ GETOPT_H = @GETOPT_H@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GL_CFLAG_ALLOW_WARNINGS = @GL_CFLAG_ALLOW_WARNINGS@ GL_CFLAG_GNULIB_WARNINGS = @GL_CFLAG_GNULIB_WARNINGS@ GL_GNULIB_ACCESS = @GL_GNULIB_ACCESS@ GL_GNULIB_ALIGNED_ALLOC = @GL_GNULIB_ALIGNED_ALLOC@ GL_GNULIB_ALPHASORT = @GL_GNULIB_ALPHASORT@ GL_GNULIB_ATOLL = @GL_GNULIB_ATOLL@ GL_GNULIB_BTOWC = @GL_GNULIB_BTOWC@ GL_GNULIB_CALLOC_GNU = @GL_GNULIB_CALLOC_GNU@ GL_GNULIB_CALLOC_POSIX = @GL_GNULIB_CALLOC_POSIX@ GL_GNULIB_CANONICALIZE_FILE_NAME = @GL_GNULIB_CANONICALIZE_FILE_NAME@ GL_GNULIB_CHDIR = @GL_GNULIB_CHDIR@ GL_GNULIB_CHOWN = @GL_GNULIB_CHOWN@ GL_GNULIB_CLOSE = @GL_GNULIB_CLOSE@ GL_GNULIB_CLOSEDIR = @GL_GNULIB_CLOSEDIR@ GL_GNULIB_COPY_FILE_RANGE = @GL_GNULIB_COPY_FILE_RANGE@ GL_GNULIB_CREAT = @GL_GNULIB_CREAT@ GL_GNULIB_CTIME = @GL_GNULIB_CTIME@ GL_GNULIB_DIRFD = @GL_GNULIB_DIRFD@ GL_GNULIB_DPRINTF = @GL_GNULIB_DPRINTF@ GL_GNULIB_DUP = @GL_GNULIB_DUP@ GL_GNULIB_DUP2 = @GL_GNULIB_DUP2@ GL_GNULIB_DUP3 = @GL_GNULIB_DUP3@ GL_GNULIB_DUPLOCALE = @GL_GNULIB_DUPLOCALE@ GL_GNULIB_ENVIRON = @GL_GNULIB_ENVIRON@ GL_GNULIB_EUIDACCESS = @GL_GNULIB_EUIDACCESS@ GL_GNULIB_EXECL = @GL_GNULIB_EXECL@ GL_GNULIB_EXECLE = @GL_GNULIB_EXECLE@ GL_GNULIB_EXECLP = @GL_GNULIB_EXECLP@ GL_GNULIB_EXECV = @GL_GNULIB_EXECV@ GL_GNULIB_EXECVE = @GL_GNULIB_EXECVE@ GL_GNULIB_EXECVP = @GL_GNULIB_EXECVP@ GL_GNULIB_EXECVPE = @GL_GNULIB_EXECVPE@ GL_GNULIB_EXPLICIT_BZERO = @GL_GNULIB_EXPLICIT_BZERO@ GL_GNULIB_FACCESSAT = @GL_GNULIB_FACCESSAT@ GL_GNULIB_FCHDIR = @GL_GNULIB_FCHDIR@ GL_GNULIB_FCHMODAT = @GL_GNULIB_FCHMODAT@ GL_GNULIB_FCHOWNAT = @GL_GNULIB_FCHOWNAT@ GL_GNULIB_FCLOSE = @GL_GNULIB_FCLOSE@ GL_GNULIB_FCNTL = @GL_GNULIB_FCNTL@ GL_GNULIB_FDATASYNC = @GL_GNULIB_FDATASYNC@ GL_GNULIB_FDOPEN = @GL_GNULIB_FDOPEN@ GL_GNULIB_FDOPENDIR = @GL_GNULIB_FDOPENDIR@ GL_GNULIB_FFLUSH = @GL_GNULIB_FFLUSH@ GL_GNULIB_FFS = @GL_GNULIB_FFS@ GL_GNULIB_FFSL = @GL_GNULIB_FFSL@ GL_GNULIB_FFSLL = @GL_GNULIB_FFSLL@ GL_GNULIB_FGETC = @GL_GNULIB_FGETC@ GL_GNULIB_FGETS = @GL_GNULIB_FGETS@ GL_GNULIB_FNMATCH = @GL_GNULIB_FNMATCH@ GL_GNULIB_FOPEN = @GL_GNULIB_FOPEN@ GL_GNULIB_FOPEN_GNU = @GL_GNULIB_FOPEN_GNU@ GL_GNULIB_FPRINTF = @GL_GNULIB_FPRINTF@ GL_GNULIB_FPRINTF_POSIX = @GL_GNULIB_FPRINTF_POSIX@ GL_GNULIB_FPURGE = @GL_GNULIB_FPURGE@ GL_GNULIB_FPUTC = @GL_GNULIB_FPUTC@ GL_GNULIB_FPUTS = @GL_GNULIB_FPUTS@ GL_GNULIB_FREAD = @GL_GNULIB_FREAD@ GL_GNULIB_FREE_POSIX = @GL_GNULIB_FREE_POSIX@ GL_GNULIB_FREOPEN = @GL_GNULIB_FREOPEN@ GL_GNULIB_FSCANF = @GL_GNULIB_FSCANF@ GL_GNULIB_FSEEK = @GL_GNULIB_FSEEK@ GL_GNULIB_FSEEKO = @GL_GNULIB_FSEEKO@ GL_GNULIB_FSTAT = @GL_GNULIB_FSTAT@ GL_GNULIB_FSTATAT = @GL_GNULIB_FSTATAT@ GL_GNULIB_FSYNC = @GL_GNULIB_FSYNC@ GL_GNULIB_FTELL = @GL_GNULIB_FTELL@ GL_GNULIB_FTELLO = @GL_GNULIB_FTELLO@ GL_GNULIB_FTRUNCATE = @GL_GNULIB_FTRUNCATE@ GL_GNULIB_FUTIMENS = @GL_GNULIB_FUTIMENS@ GL_GNULIB_FWRITE = @GL_GNULIB_FWRITE@ GL_GNULIB_GETC = @GL_GNULIB_GETC@ GL_GNULIB_GETCHAR = @GL_GNULIB_GETCHAR@ GL_GNULIB_GETCWD = @GL_GNULIB_GETCWD@ GL_GNULIB_GETDELIM = @GL_GNULIB_GETDELIM@ GL_GNULIB_GETDOMAINNAME = @GL_GNULIB_GETDOMAINNAME@ GL_GNULIB_GETDTABLESIZE = @GL_GNULIB_GETDTABLESIZE@ GL_GNULIB_GETENTROPY = @GL_GNULIB_GETENTROPY@ GL_GNULIB_GETGROUPS = @GL_GNULIB_GETGROUPS@ GL_GNULIB_GETHOSTNAME = @GL_GNULIB_GETHOSTNAME@ GL_GNULIB_GETLINE = @GL_GNULIB_GETLINE@ GL_GNULIB_GETLOADAVG = @GL_GNULIB_GETLOADAVG@ GL_GNULIB_GETLOGIN = @GL_GNULIB_GETLOGIN@ GL_GNULIB_GETLOGIN_R = @GL_GNULIB_GETLOGIN_R@ GL_GNULIB_GETOPT_POSIX = @GL_GNULIB_GETOPT_POSIX@ GL_GNULIB_GETPAGESIZE = @GL_GNULIB_GETPAGESIZE@ GL_GNULIB_GETPASS = @GL_GNULIB_GETPASS@ GL_GNULIB_GETPASS_GNU = @GL_GNULIB_GETPASS_GNU@ GL_GNULIB_GETSUBOPT = @GL_GNULIB_GETSUBOPT@ GL_GNULIB_GETUMASK = @GL_GNULIB_GETUMASK@ GL_GNULIB_GETUSERSHELL = @GL_GNULIB_GETUSERSHELL@ GL_GNULIB_GRANTPT = @GL_GNULIB_GRANTPT@ GL_GNULIB_GROUP_MEMBER = @GL_GNULIB_GROUP_MEMBER@ GL_GNULIB_IMAXABS = @GL_GNULIB_IMAXABS@ GL_GNULIB_IMAXDIV = @GL_GNULIB_IMAXDIV@ GL_GNULIB_ISATTY = @GL_GNULIB_ISATTY@ GL_GNULIB_ISBLANK = @GL_GNULIB_ISBLANK@ GL_GNULIB_ISWBLANK = @GL_GNULIB_ISWBLANK@ GL_GNULIB_ISWCTYPE = @GL_GNULIB_ISWCTYPE@ GL_GNULIB_ISWDIGIT = @GL_GNULIB_ISWDIGIT@ GL_GNULIB_ISWXDIGIT = @GL_GNULIB_ISWXDIGIT@ GL_GNULIB_LCHMOD = @GL_GNULIB_LCHMOD@ GL_GNULIB_LCHOWN = @GL_GNULIB_LCHOWN@ GL_GNULIB_LINK = @GL_GNULIB_LINK@ GL_GNULIB_LINKAT = @GL_GNULIB_LINKAT@ GL_GNULIB_LOCALECONV = @GL_GNULIB_LOCALECONV@ GL_GNULIB_LOCALENAME = @GL_GNULIB_LOCALENAME@ GL_GNULIB_LOCALTIME = @GL_GNULIB_LOCALTIME@ GL_GNULIB_LSEEK = @GL_GNULIB_LSEEK@ GL_GNULIB_LSTAT = @GL_GNULIB_LSTAT@ GL_GNULIB_MALLOC_GNU = @GL_GNULIB_MALLOC_GNU@ GL_GNULIB_MALLOC_POSIX = @GL_GNULIB_MALLOC_POSIX@ GL_GNULIB_MBRLEN = @GL_GNULIB_MBRLEN@ GL_GNULIB_MBRTOWC = @GL_GNULIB_MBRTOWC@ GL_GNULIB_MBSCASECMP = @GL_GNULIB_MBSCASECMP@ GL_GNULIB_MBSCASESTR = @GL_GNULIB_MBSCASESTR@ GL_GNULIB_MBSCHR = @GL_GNULIB_MBSCHR@ GL_GNULIB_MBSCSPN = @GL_GNULIB_MBSCSPN@ GL_GNULIB_MBSINIT = @GL_GNULIB_MBSINIT@ GL_GNULIB_MBSLEN = @GL_GNULIB_MBSLEN@ GL_GNULIB_MBSNCASECMP = @GL_GNULIB_MBSNCASECMP@ GL_GNULIB_MBSNLEN = @GL_GNULIB_MBSNLEN@ GL_GNULIB_MBSNRTOWCS = @GL_GNULIB_MBSNRTOWCS@ GL_GNULIB_MBSPBRK = @GL_GNULIB_MBSPBRK@ GL_GNULIB_MBSPCASECMP = @GL_GNULIB_MBSPCASECMP@ GL_GNULIB_MBSRCHR = @GL_GNULIB_MBSRCHR@ GL_GNULIB_MBSRTOWCS = @GL_GNULIB_MBSRTOWCS@ GL_GNULIB_MBSSEP = @GL_GNULIB_MBSSEP@ GL_GNULIB_MBSSPN = @GL_GNULIB_MBSSPN@ GL_GNULIB_MBSSTR = @GL_GNULIB_MBSSTR@ GL_GNULIB_MBSTOK_R = @GL_GNULIB_MBSTOK_R@ GL_GNULIB_MBTOWC = @GL_GNULIB_MBTOWC@ GL_GNULIB_MDA_ACCESS = @GL_GNULIB_MDA_ACCESS@ GL_GNULIB_MDA_CHDIR = @GL_GNULIB_MDA_CHDIR@ GL_GNULIB_MDA_CHMOD = @GL_GNULIB_MDA_CHMOD@ GL_GNULIB_MDA_CLOSE = @GL_GNULIB_MDA_CLOSE@ GL_GNULIB_MDA_CREAT = @GL_GNULIB_MDA_CREAT@ GL_GNULIB_MDA_DUP = @GL_GNULIB_MDA_DUP@ GL_GNULIB_MDA_DUP2 = @GL_GNULIB_MDA_DUP2@ GL_GNULIB_MDA_ECVT = @GL_GNULIB_MDA_ECVT@ GL_GNULIB_MDA_EXECL = @GL_GNULIB_MDA_EXECL@ GL_GNULIB_MDA_EXECLE = @GL_GNULIB_MDA_EXECLE@ GL_GNULIB_MDA_EXECLP = @GL_GNULIB_MDA_EXECLP@ GL_GNULIB_MDA_EXECV = @GL_GNULIB_MDA_EXECV@ GL_GNULIB_MDA_EXECVE = @GL_GNULIB_MDA_EXECVE@ GL_GNULIB_MDA_EXECVP = @GL_GNULIB_MDA_EXECVP@ GL_GNULIB_MDA_EXECVPE = @GL_GNULIB_MDA_EXECVPE@ GL_GNULIB_MDA_FCLOSEALL = @GL_GNULIB_MDA_FCLOSEALL@ GL_GNULIB_MDA_FCVT = @GL_GNULIB_MDA_FCVT@ GL_GNULIB_MDA_FDOPEN = @GL_GNULIB_MDA_FDOPEN@ GL_GNULIB_MDA_FILENO = @GL_GNULIB_MDA_FILENO@ GL_GNULIB_MDA_GCVT = @GL_GNULIB_MDA_GCVT@ GL_GNULIB_MDA_GETCWD = @GL_GNULIB_MDA_GETCWD@ GL_GNULIB_MDA_GETPID = @GL_GNULIB_MDA_GETPID@ GL_GNULIB_MDA_GETW = @GL_GNULIB_MDA_GETW@ GL_GNULIB_MDA_ISATTY = @GL_GNULIB_MDA_ISATTY@ GL_GNULIB_MDA_LSEEK = @GL_GNULIB_MDA_LSEEK@ GL_GNULIB_MDA_MEMCCPY = @GL_GNULIB_MDA_MEMCCPY@ GL_GNULIB_MDA_MKDIR = @GL_GNULIB_MDA_MKDIR@ GL_GNULIB_MDA_MKTEMP = @GL_GNULIB_MDA_MKTEMP@ GL_GNULIB_MDA_OPEN = @GL_GNULIB_MDA_OPEN@ GL_GNULIB_MDA_PUTENV = @GL_GNULIB_MDA_PUTENV@ GL_GNULIB_MDA_PUTW = @GL_GNULIB_MDA_PUTW@ GL_GNULIB_MDA_READ = @GL_GNULIB_MDA_READ@ GL_GNULIB_MDA_RMDIR = @GL_GNULIB_MDA_RMDIR@ GL_GNULIB_MDA_STRDUP = @GL_GNULIB_MDA_STRDUP@ GL_GNULIB_MDA_SWAB = @GL_GNULIB_MDA_SWAB@ GL_GNULIB_MDA_TEMPNAM = @GL_GNULIB_MDA_TEMPNAM@ GL_GNULIB_MDA_TZSET = @GL_GNULIB_MDA_TZSET@ GL_GNULIB_MDA_UMASK = @GL_GNULIB_MDA_UMASK@ GL_GNULIB_MDA_UNLINK = @GL_GNULIB_MDA_UNLINK@ GL_GNULIB_MDA_WCSDUP = @GL_GNULIB_MDA_WCSDUP@ GL_GNULIB_MDA_WRITE = @GL_GNULIB_MDA_WRITE@ GL_GNULIB_MEMCHR = @GL_GNULIB_MEMCHR@ GL_GNULIB_MEMMEM = @GL_GNULIB_MEMMEM@ GL_GNULIB_MEMPCPY = @GL_GNULIB_MEMPCPY@ GL_GNULIB_MEMRCHR = @GL_GNULIB_MEMRCHR@ GL_GNULIB_MKDIR = @GL_GNULIB_MKDIR@ GL_GNULIB_MKDIRAT = @GL_GNULIB_MKDIRAT@ GL_GNULIB_MKDTEMP = @GL_GNULIB_MKDTEMP@ GL_GNULIB_MKFIFO = @GL_GNULIB_MKFIFO@ GL_GNULIB_MKFIFOAT = @GL_GNULIB_MKFIFOAT@ GL_GNULIB_MKNOD = @GL_GNULIB_MKNOD@ GL_GNULIB_MKNODAT = @GL_GNULIB_MKNODAT@ GL_GNULIB_MKOSTEMP = @GL_GNULIB_MKOSTEMP@ GL_GNULIB_MKOSTEMPS = @GL_GNULIB_MKOSTEMPS@ GL_GNULIB_MKSTEMP = @GL_GNULIB_MKSTEMP@ GL_GNULIB_MKSTEMPS = @GL_GNULIB_MKSTEMPS@ GL_GNULIB_MKTIME = @GL_GNULIB_MKTIME@ GL_GNULIB_NANOSLEEP = @GL_GNULIB_NANOSLEEP@ GL_GNULIB_NL_LANGINFO = @GL_GNULIB_NL_LANGINFO@ GL_GNULIB_NONBLOCKING = @GL_GNULIB_NONBLOCKING@ GL_GNULIB_OBSTACK_PRINTF = @GL_GNULIB_OBSTACK_PRINTF@ GL_GNULIB_OBSTACK_PRINTF_POSIX = @GL_GNULIB_OBSTACK_PRINTF_POSIX@ GL_GNULIB_OPEN = @GL_GNULIB_OPEN@ GL_GNULIB_OPENAT = @GL_GNULIB_OPENAT@ GL_GNULIB_OPENDIR = @GL_GNULIB_OPENDIR@ GL_GNULIB_OVERRIDES_STRUCT_STAT = @GL_GNULIB_OVERRIDES_STRUCT_STAT@ GL_GNULIB_PCLOSE = @GL_GNULIB_PCLOSE@ GL_GNULIB_PERROR = @GL_GNULIB_PERROR@ GL_GNULIB_PIPE = @GL_GNULIB_PIPE@ GL_GNULIB_PIPE2 = @GL_GNULIB_PIPE2@ GL_GNULIB_POPEN = @GL_GNULIB_POPEN@ GL_GNULIB_POSIX_MEMALIGN = @GL_GNULIB_POSIX_MEMALIGN@ GL_GNULIB_POSIX_OPENPT = @GL_GNULIB_POSIX_OPENPT@ GL_GNULIB_PREAD = @GL_GNULIB_PREAD@ GL_GNULIB_PRINTF = @GL_GNULIB_PRINTF@ GL_GNULIB_PRINTF_POSIX = @GL_GNULIB_PRINTF_POSIX@ GL_GNULIB_PTSNAME = @GL_GNULIB_PTSNAME@ GL_GNULIB_PTSNAME_R = @GL_GNULIB_PTSNAME_R@ GL_GNULIB_PUTC = @GL_GNULIB_PUTC@ GL_GNULIB_PUTCHAR = @GL_GNULIB_PUTCHAR@ GL_GNULIB_PUTENV = @GL_GNULIB_PUTENV@ GL_GNULIB_PUTS = @GL_GNULIB_PUTS@ GL_GNULIB_PWRITE = @GL_GNULIB_PWRITE@ GL_GNULIB_QSORT_R = @GL_GNULIB_QSORT_R@ GL_GNULIB_RANDOM = @GL_GNULIB_RANDOM@ GL_GNULIB_RANDOM_R = @GL_GNULIB_RANDOM_R@ GL_GNULIB_RAWMEMCHR = @GL_GNULIB_RAWMEMCHR@ GL_GNULIB_READ = @GL_GNULIB_READ@ GL_GNULIB_READDIR = @GL_GNULIB_READDIR@ GL_GNULIB_READLINK = @GL_GNULIB_READLINK@ GL_GNULIB_READLINKAT = @GL_GNULIB_READLINKAT@ GL_GNULIB_REALLOCARRAY = @GL_GNULIB_REALLOCARRAY@ GL_GNULIB_REALLOC_GNU = @GL_GNULIB_REALLOC_GNU@ GL_GNULIB_REALLOC_POSIX = @GL_GNULIB_REALLOC_POSIX@ GL_GNULIB_REALPATH = @GL_GNULIB_REALPATH@ GL_GNULIB_REMOVE = @GL_GNULIB_REMOVE@ GL_GNULIB_RENAME = @GL_GNULIB_RENAME@ GL_GNULIB_RENAMEAT = @GL_GNULIB_RENAMEAT@ GL_GNULIB_REWINDDIR = @GL_GNULIB_REWINDDIR@ GL_GNULIB_RMDIR = @GL_GNULIB_RMDIR@ GL_GNULIB_RPMATCH = @GL_GNULIB_RPMATCH@ GL_GNULIB_SCANDIR = @GL_GNULIB_SCANDIR@ GL_GNULIB_SCANF = @GL_GNULIB_SCANF@ GL_GNULIB_SECURE_GETENV = @GL_GNULIB_SECURE_GETENV@ GL_GNULIB_SETENV = @GL_GNULIB_SETENV@ GL_GNULIB_SETHOSTNAME = @GL_GNULIB_SETHOSTNAME@ GL_GNULIB_SETLOCALE = @GL_GNULIB_SETLOCALE@ GL_GNULIB_SETLOCALE_NULL = @GL_GNULIB_SETLOCALE_NULL@ GL_GNULIB_SIGABBREV_NP = @GL_GNULIB_SIGABBREV_NP@ GL_GNULIB_SIGDESCR_NP = @GL_GNULIB_SIGDESCR_NP@ GL_GNULIB_SLEEP = @GL_GNULIB_SLEEP@ GL_GNULIB_SNPRINTF = @GL_GNULIB_SNPRINTF@ GL_GNULIB_SPRINTF_POSIX = @GL_GNULIB_SPRINTF_POSIX@ GL_GNULIB_STAT = @GL_GNULIB_STAT@ GL_GNULIB_STDIO_H_NONBLOCKING = @GL_GNULIB_STDIO_H_NONBLOCKING@ GL_GNULIB_STDIO_H_SIGPIPE = @GL_GNULIB_STDIO_H_SIGPIPE@ GL_GNULIB_STPCPY = @GL_GNULIB_STPCPY@ GL_GNULIB_STPNCPY = @GL_GNULIB_STPNCPY@ GL_GNULIB_STRCASESTR = @GL_GNULIB_STRCASESTR@ GL_GNULIB_STRCHRNUL = @GL_GNULIB_STRCHRNUL@ GL_GNULIB_STRDUP = @GL_GNULIB_STRDUP@ GL_GNULIB_STRERROR = @GL_GNULIB_STRERROR@ GL_GNULIB_STRERRORNAME_NP = @GL_GNULIB_STRERRORNAME_NP@ GL_GNULIB_STRERROR_R = @GL_GNULIB_STRERROR_R@ GL_GNULIB_STRFTIME = @GL_GNULIB_STRFTIME@ GL_GNULIB_STRNCAT = @GL_GNULIB_STRNCAT@ GL_GNULIB_STRNDUP = @GL_GNULIB_STRNDUP@ GL_GNULIB_STRNLEN = @GL_GNULIB_STRNLEN@ GL_GNULIB_STRPBRK = @GL_GNULIB_STRPBRK@ GL_GNULIB_STRPTIME = @GL_GNULIB_STRPTIME@ GL_GNULIB_STRSEP = @GL_GNULIB_STRSEP@ GL_GNULIB_STRSIGNAL = @GL_GNULIB_STRSIGNAL@ GL_GNULIB_STRSTR = @GL_GNULIB_STRSTR@ GL_GNULIB_STRTOD = @GL_GNULIB_STRTOD@ GL_GNULIB_STRTOIMAX = @GL_GNULIB_STRTOIMAX@ GL_GNULIB_STRTOK_R = @GL_GNULIB_STRTOK_R@ GL_GNULIB_STRTOL = @GL_GNULIB_STRTOL@ GL_GNULIB_STRTOLD = @GL_GNULIB_STRTOLD@ GL_GNULIB_STRTOLL = @GL_GNULIB_STRTOLL@ GL_GNULIB_STRTOUL = @GL_GNULIB_STRTOUL@ GL_GNULIB_STRTOULL = @GL_GNULIB_STRTOULL@ GL_GNULIB_STRTOUMAX = @GL_GNULIB_STRTOUMAX@ GL_GNULIB_STRVERSCMP = @GL_GNULIB_STRVERSCMP@ GL_GNULIB_SYMLINK = @GL_GNULIB_SYMLINK@ GL_GNULIB_SYMLINKAT = @GL_GNULIB_SYMLINKAT@ GL_GNULIB_SYSTEM_POSIX = @GL_GNULIB_SYSTEM_POSIX@ GL_GNULIB_TIMEGM = @GL_GNULIB_TIMEGM@ GL_GNULIB_TIMESPEC_GET = @GL_GNULIB_TIMESPEC_GET@ GL_GNULIB_TIMESPEC_GETRES = @GL_GNULIB_TIMESPEC_GETRES@ GL_GNULIB_TIME_R = @GL_GNULIB_TIME_R@ GL_GNULIB_TIME_RZ = @GL_GNULIB_TIME_RZ@ GL_GNULIB_TMPFILE = @GL_GNULIB_TMPFILE@ GL_GNULIB_TOWCTRANS = @GL_GNULIB_TOWCTRANS@ GL_GNULIB_TRUNCATE = @GL_GNULIB_TRUNCATE@ GL_GNULIB_TTYNAME_R = @GL_GNULIB_TTYNAME_R@ GL_GNULIB_TZSET = @GL_GNULIB_TZSET@ GL_GNULIB_UNISTD_H_GETOPT = @GL_GNULIB_UNISTD_H_GETOPT@ GL_GNULIB_UNISTD_H_NONBLOCKING = @GL_GNULIB_UNISTD_H_NONBLOCKING@ GL_GNULIB_UNISTD_H_SIGPIPE = @GL_GNULIB_UNISTD_H_SIGPIPE@ GL_GNULIB_UNLINK = @GL_GNULIB_UNLINK@ GL_GNULIB_UNLINKAT = @GL_GNULIB_UNLINKAT@ GL_GNULIB_UNLOCKPT = @GL_GNULIB_UNLOCKPT@ GL_GNULIB_UNSETENV = @GL_GNULIB_UNSETENV@ GL_GNULIB_USLEEP = @GL_GNULIB_USLEEP@ GL_GNULIB_UTIMENSAT = @GL_GNULIB_UTIMENSAT@ GL_GNULIB_VASPRINTF = @GL_GNULIB_VASPRINTF@ GL_GNULIB_VDPRINTF = @GL_GNULIB_VDPRINTF@ GL_GNULIB_VFPRINTF = @GL_GNULIB_VFPRINTF@ GL_GNULIB_VFPRINTF_POSIX = @GL_GNULIB_VFPRINTF_POSIX@ GL_GNULIB_VFSCANF = @GL_GNULIB_VFSCANF@ GL_GNULIB_VPRINTF = @GL_GNULIB_VPRINTF@ GL_GNULIB_VPRINTF_POSIX = @GL_GNULIB_VPRINTF_POSIX@ GL_GNULIB_VSCANF = @GL_GNULIB_VSCANF@ GL_GNULIB_VSNPRINTF = @GL_GNULIB_VSNPRINTF@ GL_GNULIB_VSPRINTF_POSIX = @GL_GNULIB_VSPRINTF_POSIX@ GL_GNULIB_WCPCPY = @GL_GNULIB_WCPCPY@ GL_GNULIB_WCPNCPY = @GL_GNULIB_WCPNCPY@ GL_GNULIB_WCRTOMB = @GL_GNULIB_WCRTOMB@ GL_GNULIB_WCSCASECMP = @GL_GNULIB_WCSCASECMP@ GL_GNULIB_WCSCAT = @GL_GNULIB_WCSCAT@ GL_GNULIB_WCSCHR = @GL_GNULIB_WCSCHR@ GL_GNULIB_WCSCMP = @GL_GNULIB_WCSCMP@ GL_GNULIB_WCSCOLL = @GL_GNULIB_WCSCOLL@ GL_GNULIB_WCSCPY = @GL_GNULIB_WCSCPY@ GL_GNULIB_WCSCSPN = @GL_GNULIB_WCSCSPN@ GL_GNULIB_WCSDUP = @GL_GNULIB_WCSDUP@ GL_GNULIB_WCSFTIME = @GL_GNULIB_WCSFTIME@ GL_GNULIB_WCSLEN = @GL_GNULIB_WCSLEN@ GL_GNULIB_WCSNCASECMP = @GL_GNULIB_WCSNCASECMP@ GL_GNULIB_WCSNCAT = @GL_GNULIB_WCSNCAT@ GL_GNULIB_WCSNCMP = @GL_GNULIB_WCSNCMP@ GL_GNULIB_WCSNCPY = @GL_GNULIB_WCSNCPY@ GL_GNULIB_WCSNLEN = @GL_GNULIB_WCSNLEN@ GL_GNULIB_WCSNRTOMBS = @GL_GNULIB_WCSNRTOMBS@ GL_GNULIB_WCSPBRK = @GL_GNULIB_WCSPBRK@ GL_GNULIB_WCSRCHR = @GL_GNULIB_WCSRCHR@ GL_GNULIB_WCSRTOMBS = @GL_GNULIB_WCSRTOMBS@ GL_GNULIB_WCSSPN = @GL_GNULIB_WCSSPN@ GL_GNULIB_WCSSTR = @GL_GNULIB_WCSSTR@ GL_GNULIB_WCSTOK = @GL_GNULIB_WCSTOK@ GL_GNULIB_WCSWIDTH = @GL_GNULIB_WCSWIDTH@ GL_GNULIB_WCSXFRM = @GL_GNULIB_WCSXFRM@ GL_GNULIB_WCTOB = @GL_GNULIB_WCTOB@ GL_GNULIB_WCTOMB = @GL_GNULIB_WCTOMB@ GL_GNULIB_WCTRANS = @GL_GNULIB_WCTRANS@ GL_GNULIB_WCTYPE = @GL_GNULIB_WCTYPE@ GL_GNULIB_WCWIDTH = @GL_GNULIB_WCWIDTH@ GL_GNULIB_WMEMCHR = @GL_GNULIB_WMEMCHR@ GL_GNULIB_WMEMCMP = @GL_GNULIB_WMEMCMP@ GL_GNULIB_WMEMCPY = @GL_GNULIB_WMEMCPY@ GL_GNULIB_WMEMMOVE = @GL_GNULIB_WMEMMOVE@ GL_GNULIB_WMEMPCPY = @GL_GNULIB_WMEMPCPY@ GL_GNULIB_WMEMSET = @GL_GNULIB_WMEMSET@ GL_GNULIB_WRITE = @GL_GNULIB_WRITE@ GL_GNULIB__EXIT = @GL_GNULIB__EXIT@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GNULIBHEADERS_OVERRIDE_WINT_T = @GNULIBHEADERS_OVERRIDE_WINT_T@ GNULIB_GETTIMEOFDAY = @GNULIB_GETTIMEOFDAY@ GREP = @GREP@ GRUB_BOOT_MACHINE_LINK_ADDR = @GRUB_BOOT_MACHINE_LINK_ADDR@ GRUB_PLATFORM = @GRUB_PLATFORM@ GRUB_STACK_PROTECTOR_INIT = @GRUB_STACK_PROTECTOR_INIT@ GRUB_TARGET_CPU = @GRUB_TARGET_CPU@ HAVE_ALIGNED_ALLOC = @HAVE_ALIGNED_ALLOC@ HAVE_ALLOCA_H = @HAVE_ALLOCA_H@ HAVE_ALPHASORT = @HAVE_ALPHASORT@ HAVE_ASM_USCORE = @HAVE_ASM_USCORE@ HAVE_ATOLL = @HAVE_ATOLL@ HAVE_BTOWC = @HAVE_BTOWC@ HAVE_C99_STDINT_H = @HAVE_C99_STDINT_H@ HAVE_CANONICALIZE_FILE_NAME = @HAVE_CANONICALIZE_FILE_NAME@ HAVE_CHOWN = @HAVE_CHOWN@ HAVE_CLOSEDIR = @HAVE_CLOSEDIR@ HAVE_COPY_FILE_RANGE = @HAVE_COPY_FILE_RANGE@ HAVE_CRTDEFS_H = @HAVE_CRTDEFS_H@ HAVE_CXX = @HAVE_CXX@ HAVE_DECL_DIRFD = @HAVE_DECL_DIRFD@ HAVE_DECL_ECVT = @HAVE_DECL_ECVT@ HAVE_DECL_ENVIRON = @HAVE_DECL_ENVIRON@ HAVE_DECL_EXECVPE = @HAVE_DECL_EXECVPE@ HAVE_DECL_FCHDIR = @HAVE_DECL_FCHDIR@ HAVE_DECL_FCLOSEALL = @HAVE_DECL_FCLOSEALL@ HAVE_DECL_FCVT = @HAVE_DECL_FCVT@ HAVE_DECL_FDATASYNC = @HAVE_DECL_FDATASYNC@ HAVE_DECL_FDOPENDIR = @HAVE_DECL_FDOPENDIR@ HAVE_DECL_FPURGE = @HAVE_DECL_FPURGE@ HAVE_DECL_FSEEKO = @HAVE_DECL_FSEEKO@ HAVE_DECL_FTELLO = @HAVE_DECL_FTELLO@ HAVE_DECL_GCVT = @HAVE_DECL_GCVT@ HAVE_DECL_GETDELIM = @HAVE_DECL_GETDELIM@ HAVE_DECL_GETDOMAINNAME = @HAVE_DECL_GETDOMAINNAME@ HAVE_DECL_GETLINE = @HAVE_DECL_GETLINE@ HAVE_DECL_GETLOADAVG = @HAVE_DECL_GETLOADAVG@ HAVE_DECL_GETLOGIN = @HAVE_DECL_GETLOGIN@ HAVE_DECL_GETLOGIN_R = @HAVE_DECL_GETLOGIN_R@ HAVE_DECL_GETPAGESIZE = @HAVE_DECL_GETPAGESIZE@ HAVE_DECL_GETUSERSHELL = @HAVE_DECL_GETUSERSHELL@ HAVE_DECL_IMAXABS = @HAVE_DECL_IMAXABS@ HAVE_DECL_IMAXDIV = @HAVE_DECL_IMAXDIV@ HAVE_DECL_INITSTATE = @HAVE_DECL_INITSTATE@ HAVE_DECL_LOCALTIME_R = @HAVE_DECL_LOCALTIME_R@ HAVE_DECL_MEMMEM = @HAVE_DECL_MEMMEM@ HAVE_DECL_MEMRCHR = @HAVE_DECL_MEMRCHR@ HAVE_DECL_OBSTACK_PRINTF = @HAVE_DECL_OBSTACK_PRINTF@ HAVE_DECL_SETENV = @HAVE_DECL_SETENV@ HAVE_DECL_SETHOSTNAME = @HAVE_DECL_SETHOSTNAME@ HAVE_DECL_SETSTATE = @HAVE_DECL_SETSTATE@ HAVE_DECL_SNPRINTF = @HAVE_DECL_SNPRINTF@ HAVE_DECL_STRDUP = @HAVE_DECL_STRDUP@ HAVE_DECL_STRERROR_R = @HAVE_DECL_STRERROR_R@ HAVE_DECL_STRNCASECMP = @HAVE_DECL_STRNCASECMP@ HAVE_DECL_STRNDUP = @HAVE_DECL_STRNDUP@ HAVE_DECL_STRNLEN = @HAVE_DECL_STRNLEN@ HAVE_DECL_STRSIGNAL = @HAVE_DECL_STRSIGNAL@ HAVE_DECL_STRTOIMAX = @HAVE_DECL_STRTOIMAX@ HAVE_DECL_STRTOK_R = @HAVE_DECL_STRTOK_R@ HAVE_DECL_STRTOUMAX = @HAVE_DECL_STRTOUMAX@ HAVE_DECL_TRUNCATE = @HAVE_DECL_TRUNCATE@ HAVE_DECL_TTYNAME_R = @HAVE_DECL_TTYNAME_R@ HAVE_DECL_UNSETENV = @HAVE_DECL_UNSETENV@ HAVE_DECL_VSNPRINTF = @HAVE_DECL_VSNPRINTF@ HAVE_DECL_WCSDUP = @HAVE_DECL_WCSDUP@ HAVE_DECL_WCTOB = @HAVE_DECL_WCTOB@ HAVE_DECL_WCWIDTH = @HAVE_DECL_WCWIDTH@ HAVE_DIRENT_H = @HAVE_DIRENT_H@ HAVE_DPRINTF = @HAVE_DPRINTF@ HAVE_DUP3 = @HAVE_DUP3@ HAVE_DUPLOCALE = @HAVE_DUPLOCALE@ HAVE_EUIDACCESS = @HAVE_EUIDACCESS@ HAVE_EXECVPE = @HAVE_EXECVPE@ HAVE_EXPLICIT_BZERO = @HAVE_EXPLICIT_BZERO@ HAVE_FACCESSAT = @HAVE_FACCESSAT@ HAVE_FCHDIR = @HAVE_FCHDIR@ HAVE_FCHMODAT = @HAVE_FCHMODAT@ HAVE_FCHOWNAT = @HAVE_FCHOWNAT@ HAVE_FCNTL = @HAVE_FCNTL@ HAVE_FDATASYNC = @HAVE_FDATASYNC@ HAVE_FDOPENDIR = @HAVE_FDOPENDIR@ HAVE_FEATURES_H = @HAVE_FEATURES_H@ HAVE_FFS = @HAVE_FFS@ HAVE_FFSL = @HAVE_FFSL@ HAVE_FFSLL = @HAVE_FFSLL@ HAVE_FNMATCH = @HAVE_FNMATCH@ HAVE_FNMATCH_H = @HAVE_FNMATCH_H@ HAVE_FONT_SOURCE = @HAVE_FONT_SOURCE@ HAVE_FREELOCALE = @HAVE_FREELOCALE@ HAVE_FSEEKO = @HAVE_FSEEKO@ HAVE_FSTATAT = @HAVE_FSTATAT@ HAVE_FSYNC = @HAVE_FSYNC@ HAVE_FTELLO = @HAVE_FTELLO@ HAVE_FTRUNCATE = @HAVE_FTRUNCATE@ HAVE_FUTIMENS = @HAVE_FUTIMENS@ HAVE_GETDTABLESIZE = @HAVE_GETDTABLESIZE@ HAVE_GETENTROPY = @HAVE_GETENTROPY@ HAVE_GETGROUPS = @HAVE_GETGROUPS@ HAVE_GETHOSTNAME = @HAVE_GETHOSTNAME@ HAVE_GETLOGIN = @HAVE_GETLOGIN@ HAVE_GETOPT_H = @HAVE_GETOPT_H@ HAVE_GETPAGESIZE = @HAVE_GETPAGESIZE@ HAVE_GETPASS = @HAVE_GETPASS@ HAVE_GETSUBOPT = @HAVE_GETSUBOPT@ HAVE_GETUMASK = @HAVE_GETUMASK@ HAVE_GRANTPT = @HAVE_GRANTPT@ HAVE_GROUP_MEMBER = @HAVE_GROUP_MEMBER@ HAVE_IMAXDIV_T = @HAVE_IMAXDIV_T@ HAVE_INITSTATE = @HAVE_INITSTATE@ HAVE_INTTYPES_H = @HAVE_INTTYPES_H@ HAVE_ISBLANK = @HAVE_ISBLANK@ HAVE_ISWBLANK = @HAVE_ISWBLANK@ HAVE_ISWCNTRL = @HAVE_ISWCNTRL@ HAVE_LANGINFO_ALTMON = @HAVE_LANGINFO_ALTMON@ HAVE_LANGINFO_CODESET = @HAVE_LANGINFO_CODESET@ HAVE_LANGINFO_ERA = @HAVE_LANGINFO_ERA@ HAVE_LANGINFO_H = @HAVE_LANGINFO_H@ HAVE_LANGINFO_T_FMT_AMPM = @HAVE_LANGINFO_T_FMT_AMPM@ HAVE_LANGINFO_YESEXPR = @HAVE_LANGINFO_YESEXPR@ HAVE_LCHMOD = @HAVE_LCHMOD@ HAVE_LCHOWN = @HAVE_LCHOWN@ HAVE_LINK = @HAVE_LINK@ HAVE_LINKAT = @HAVE_LINKAT@ HAVE_LSTAT = @HAVE_LSTAT@ HAVE_MAX_ALIGN_T = @HAVE_MAX_ALIGN_T@ HAVE_MBRLEN = @HAVE_MBRLEN@ HAVE_MBRTOWC = @HAVE_MBRTOWC@ HAVE_MBSINIT = @HAVE_MBSINIT@ HAVE_MBSLEN = @HAVE_MBSLEN@ HAVE_MBSNRTOWCS = @HAVE_MBSNRTOWCS@ HAVE_MBSRTOWCS = @HAVE_MBSRTOWCS@ HAVE_MBTOWC = @HAVE_MBTOWC@ HAVE_MEMPCPY = @HAVE_MEMPCPY@ HAVE_MKDIRAT = @HAVE_MKDIRAT@ HAVE_MKDTEMP = @HAVE_MKDTEMP@ HAVE_MKFIFO = @HAVE_MKFIFO@ HAVE_MKFIFOAT = @HAVE_MKFIFOAT@ HAVE_MKNOD = @HAVE_MKNOD@ HAVE_MKNODAT = @HAVE_MKNODAT@ HAVE_MKOSTEMP = @HAVE_MKOSTEMP@ HAVE_MKOSTEMPS = @HAVE_MKOSTEMPS@ HAVE_MKSTEMP = @HAVE_MKSTEMP@ HAVE_MKSTEMPS = @HAVE_MKSTEMPS@ HAVE_MSVC_INVALID_PARAMETER_HANDLER = @HAVE_MSVC_INVALID_PARAMETER_HANDLER@ HAVE_NANOSLEEP = @HAVE_NANOSLEEP@ HAVE_NEWLOCALE = @HAVE_NEWLOCALE@ HAVE_NL_LANGINFO = @HAVE_NL_LANGINFO@ HAVE_OPENAT = @HAVE_OPENAT@ HAVE_OPENDIR = @HAVE_OPENDIR@ HAVE_OS_H = @HAVE_OS_H@ HAVE_PCLOSE = @HAVE_PCLOSE@ HAVE_PIPE = @HAVE_PIPE@ HAVE_PIPE2 = @HAVE_PIPE2@ HAVE_POPEN = @HAVE_POPEN@ HAVE_POSIX_MEMALIGN = @HAVE_POSIX_MEMALIGN@ HAVE_POSIX_OPENPT = @HAVE_POSIX_OPENPT@ HAVE_PREAD = @HAVE_PREAD@ HAVE_PTSNAME = @HAVE_PTSNAME@ HAVE_PTSNAME_R = @HAVE_PTSNAME_R@ HAVE_PWRITE = @HAVE_PWRITE@ HAVE_QSORT_R = @HAVE_QSORT_R@ HAVE_RANDOM = @HAVE_RANDOM@ HAVE_RANDOM_H = @HAVE_RANDOM_H@ HAVE_RANDOM_R = @HAVE_RANDOM_R@ HAVE_RAWMEMCHR = @HAVE_RAWMEMCHR@ HAVE_READDIR = @HAVE_READDIR@ HAVE_READLINK = @HAVE_READLINK@ HAVE_READLINKAT = @HAVE_READLINKAT@ HAVE_REALLOCARRAY = @HAVE_REALLOCARRAY@ HAVE_REALPATH = @HAVE_REALPATH@ HAVE_RENAMEAT = @HAVE_RENAMEAT@ HAVE_REWINDDIR = @HAVE_REWINDDIR@ HAVE_RPMATCH = @HAVE_RPMATCH@ HAVE_SCANDIR = @HAVE_SCANDIR@ HAVE_SDL2 = @HAVE_SDL2@ HAVE_SECURE_GETENV = @HAVE_SECURE_GETENV@ HAVE_SETENV = @HAVE_SETENV@ HAVE_SETHOSTNAME = @HAVE_SETHOSTNAME@ HAVE_SETSTATE = @HAVE_SETSTATE@ HAVE_SIGABBREV_NP = @HAVE_SIGABBREV_NP@ HAVE_SIGDESCR_NP = @HAVE_SIGDESCR_NP@ HAVE_SIGNED_SIG_ATOMIC_T = @HAVE_SIGNED_SIG_ATOMIC_T@ HAVE_SIGNED_WCHAR_T = @HAVE_SIGNED_WCHAR_T@ HAVE_SIGNED_WINT_T = @HAVE_SIGNED_WINT_T@ HAVE_SLEEP = @HAVE_SLEEP@ HAVE_STDINT_H = @HAVE_STDINT_H@ HAVE_STPCPY = @HAVE_STPCPY@ HAVE_STPNCPY = @HAVE_STPNCPY@ HAVE_STRCASECMP = @HAVE_STRCASECMP@ HAVE_STRCASESTR = @HAVE_STRCASESTR@ HAVE_STRCHRNUL = @HAVE_STRCHRNUL@ HAVE_STRERRORNAME_NP = @HAVE_STRERRORNAME_NP@ HAVE_STRINGS_H = @HAVE_STRINGS_H@ HAVE_STRPBRK = @HAVE_STRPBRK@ HAVE_STRPTIME = @HAVE_STRPTIME@ HAVE_STRSEP = @HAVE_STRSEP@ HAVE_STRTOD = @HAVE_STRTOD@ HAVE_STRTOL = @HAVE_STRTOL@ HAVE_STRTOLD = @HAVE_STRTOLD@ HAVE_STRTOLL = @HAVE_STRTOLL@ HAVE_STRTOUL = @HAVE_STRTOUL@ HAVE_STRTOULL = @HAVE_STRTOULL@ HAVE_STRUCT_RANDOM_DATA = @HAVE_STRUCT_RANDOM_DATA@ HAVE_STRVERSCMP = @HAVE_STRVERSCMP@ HAVE_SYMLINK = @HAVE_SYMLINK@ HAVE_SYMLINKAT = @HAVE_SYMLINKAT@ HAVE_SYSEXITS_H = @HAVE_SYSEXITS_H@ HAVE_SYS_BITYPES_H = @HAVE_SYS_BITYPES_H@ HAVE_SYS_CDEFS_H = @HAVE_SYS_CDEFS_H@ HAVE_SYS_INTTYPES_H = @HAVE_SYS_INTTYPES_H@ HAVE_SYS_LOADAVG_H = @HAVE_SYS_LOADAVG_H@ HAVE_SYS_PARAM_H = @HAVE_SYS_PARAM_H@ HAVE_SYS_TYPES_H = @HAVE_SYS_TYPES_H@ HAVE_TIMEGM = @HAVE_TIMEGM@ HAVE_TIMESPEC_GET = @HAVE_TIMESPEC_GET@ HAVE_TIMESPEC_GETRES = @HAVE_TIMESPEC_GETRES@ HAVE_TIMEZONE_T = @HAVE_TIMEZONE_T@ HAVE_UNISTD_H = @HAVE_UNISTD_H@ HAVE_UNLINKAT = @HAVE_UNLINKAT@ HAVE_UNLOCKPT = @HAVE_UNLOCKPT@ HAVE_USLEEP = @HAVE_USLEEP@ HAVE_UTIMENSAT = @HAVE_UTIMENSAT@ HAVE_VASPRINTF = @HAVE_VASPRINTF@ HAVE_VDPRINTF = @HAVE_VDPRINTF@ HAVE_VISIBILITY = @HAVE_VISIBILITY@ HAVE_WCHAR_H = @HAVE_WCHAR_H@ HAVE_WCHAR_T = @HAVE_WCHAR_T@ HAVE_WCPCPY = @HAVE_WCPCPY@ HAVE_WCPNCPY = @HAVE_WCPNCPY@ HAVE_WCRTOMB = @HAVE_WCRTOMB@ HAVE_WCSCASECMP = @HAVE_WCSCASECMP@ HAVE_WCSCAT = @HAVE_WCSCAT@ HAVE_WCSCHR = @HAVE_WCSCHR@ HAVE_WCSCMP = @HAVE_WCSCMP@ HAVE_WCSCOLL = @HAVE_WCSCOLL@ HAVE_WCSCPY = @HAVE_WCSCPY@ HAVE_WCSCSPN = @HAVE_WCSCSPN@ HAVE_WCSDUP = @HAVE_WCSDUP@ HAVE_WCSFTIME = @HAVE_WCSFTIME@ HAVE_WCSLEN = @HAVE_WCSLEN@ HAVE_WCSNCASECMP = @HAVE_WCSNCASECMP@ HAVE_WCSNCAT = @HAVE_WCSNCAT@ HAVE_WCSNCMP = @HAVE_WCSNCMP@ HAVE_WCSNCPY = @HAVE_WCSNCPY@ HAVE_WCSNLEN = @HAVE_WCSNLEN@ HAVE_WCSNRTOMBS = @HAVE_WCSNRTOMBS@ HAVE_WCSPBRK = @HAVE_WCSPBRK@ HAVE_WCSRCHR = @HAVE_WCSRCHR@ HAVE_WCSRTOMBS = @HAVE_WCSRTOMBS@ HAVE_WCSSPN = @HAVE_WCSSPN@ HAVE_WCSSTR = @HAVE_WCSSTR@ HAVE_WCSTOK = @HAVE_WCSTOK@ HAVE_WCSWIDTH = @HAVE_WCSWIDTH@ HAVE_WCSXFRM = @HAVE_WCSXFRM@ HAVE_WCTRANS_T = @HAVE_WCTRANS_T@ HAVE_WCTYPE_H = @HAVE_WCTYPE_H@ HAVE_WCTYPE_T = @HAVE_WCTYPE_T@ HAVE_WINSOCK2_H = @HAVE_WINSOCK2_H@ HAVE_WINT_T = @HAVE_WINT_T@ HAVE_WMEMCHR = @HAVE_WMEMCHR@ HAVE_WMEMCMP = @HAVE_WMEMCMP@ HAVE_WMEMCPY = @HAVE_WMEMCPY@ HAVE_WMEMMOVE = @HAVE_WMEMMOVE@ HAVE_WMEMPCPY = @HAVE_WMEMPCPY@ HAVE_WMEMSET = @HAVE_WMEMSET@ HAVE_XLOCALE_H = @HAVE_XLOCALE_H@ HAVE__BOOL = @HAVE__BOOL@ HAVE__EXIT = @HAVE__EXIT@ HELP2MAN = @HELP2MAN@ HOST_CC = @HOST_CC@ HOST_CCASFLAGS = @HOST_CCASFLAGS@ HOST_CFLAGS = @HOST_CFLAGS@ HOST_CPPFLAGS = @HOST_CPPFLAGS@ HOST_LDFLAGS = @HOST_LDFLAGS@ INCLUDE_NEXT = @INCLUDE_NEXT@ INCLUDE_NEXT_AS_FIRST_DIRECTIVE = @INCLUDE_NEXT_AS_FIRST_DIRECTIVE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INT32_MAX_LT_INTMAX_MAX = @INT32_MAX_LT_INTMAX_MAX@ INT64_MAX_EQ_LONG_MAX = @INT64_MAX_EQ_LONG_MAX@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBDEVMAPPER = @LIBDEVMAPPER@ LIBGEOM = @LIBGEOM@ LIBGNU_LIBDEPS = @LIBGNU_LIBDEPS@ LIBGNU_LTLIBDEPS = @LIBGNU_LTLIBDEPS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBLZMA = @LIBLZMA@ LIBMULTITHREAD = @LIBMULTITHREAD@ LIBNVPAIR = @LIBNVPAIR@ LIBOBJS = @LIBOBJS@ LIBPCIACCESS = @LIBPCIACCESS@ LIBPMULTITHREAD = @LIBPMULTITHREAD@ LIBPTHREAD = @LIBPTHREAD@ LIBS = @LIBS@ LIBSDL = @LIBSDL@ LIBSTDTHREAD = @LIBSTDTHREAD@ LIBTASN1 = @LIBTASN1@ LIBTHREAD = @LIBTHREAD@ LIBUNISTRING_UNITYPES_H = @LIBUNISTRING_UNITYPES_H@ LIBUNISTRING_UNIWIDTH_H = @LIBUNISTRING_UNIWIDTH_H@ LIBUTIL = @LIBUTIL@ LIBZFS = @LIBZFS@ LIB_HARD_LOCALE = @LIB_HARD_LOCALE@ LIB_MBRTOWC = @LIB_MBRTOWC@ LIB_NL_LANGINFO = @LIB_NL_LANGINFO@ LIB_SCHED_YIELD = @LIB_SCHED_YIELD@ LIB_SETLOCALE_NULL = @LIB_SETLOCALE_NULL@ LIMITS_H = @LIMITS_H@ LN_S = @LN_S@ LOCALCHARSET_TESTS_ENVIRONMENT = @LOCALCHARSET_TESTS_ENVIRONMENT@ LOCALENAME_ENHANCE_LOCALE_FUNCS = @LOCALENAME_ENHANCE_LOCALE_FUNCS@ LOCALE_FR = @LOCALE_FR@ LOCALE_FR_UTF8 = @LOCALE_FR_UTF8@ LOCALE_JA = @LOCALE_JA@ LOCALE_ZH_CN = @LOCALE_ZH_CN@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBMULTITHREAD = @LTLIBMULTITHREAD@ LTLIBOBJS = @LTLIBOBJS@ LTLIBTHREAD = @LTLIBTHREAD@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MM_DEBUG = @MM_DEBUG@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NEXT_AS_FIRST_DIRECTIVE_CTYPE_H = @NEXT_AS_FIRST_DIRECTIVE_CTYPE_H@ NEXT_AS_FIRST_DIRECTIVE_DIRENT_H = @NEXT_AS_FIRST_DIRECTIVE_DIRENT_H@ NEXT_AS_FIRST_DIRECTIVE_ERRNO_H = @NEXT_AS_FIRST_DIRECTIVE_ERRNO_H@ NEXT_AS_FIRST_DIRECTIVE_FCNTL_H = @NEXT_AS_FIRST_DIRECTIVE_FCNTL_H@ NEXT_AS_FIRST_DIRECTIVE_FLOAT_H = @NEXT_AS_FIRST_DIRECTIVE_FLOAT_H@ NEXT_AS_FIRST_DIRECTIVE_FNMATCH_H = @NEXT_AS_FIRST_DIRECTIVE_FNMATCH_H@ NEXT_AS_FIRST_DIRECTIVE_GETOPT_H = @NEXT_AS_FIRST_DIRECTIVE_GETOPT_H@ NEXT_AS_FIRST_DIRECTIVE_INTTYPES_H = @NEXT_AS_FIRST_DIRECTIVE_INTTYPES_H@ NEXT_AS_FIRST_DIRECTIVE_LANGINFO_H = @NEXT_AS_FIRST_DIRECTIVE_LANGINFO_H@ NEXT_AS_FIRST_DIRECTIVE_LIMITS_H = @NEXT_AS_FIRST_DIRECTIVE_LIMITS_H@ NEXT_AS_FIRST_DIRECTIVE_LOCALE_H = @NEXT_AS_FIRST_DIRECTIVE_LOCALE_H@ NEXT_AS_FIRST_DIRECTIVE_STDDEF_H = @NEXT_AS_FIRST_DIRECTIVE_STDDEF_H@ NEXT_AS_FIRST_DIRECTIVE_STDINT_H = @NEXT_AS_FIRST_DIRECTIVE_STDINT_H@ NEXT_AS_FIRST_DIRECTIVE_STDIO_H = @NEXT_AS_FIRST_DIRECTIVE_STDIO_H@ NEXT_AS_FIRST_DIRECTIVE_STDLIB_H = @NEXT_AS_FIRST_DIRECTIVE_STDLIB_H@ NEXT_AS_FIRST_DIRECTIVE_STRINGS_H = @NEXT_AS_FIRST_DIRECTIVE_STRINGS_H@ NEXT_AS_FIRST_DIRECTIVE_STRING_H = @NEXT_AS_FIRST_DIRECTIVE_STRING_H@ NEXT_AS_FIRST_DIRECTIVE_SYSEXITS_H = @NEXT_AS_FIRST_DIRECTIVE_SYSEXITS_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H@ NEXT_AS_FIRST_DIRECTIVE_TIME_H = @NEXT_AS_FIRST_DIRECTIVE_TIME_H@ NEXT_AS_FIRST_DIRECTIVE_UNISTD_H = @NEXT_AS_FIRST_DIRECTIVE_UNISTD_H@ NEXT_AS_FIRST_DIRECTIVE_WCHAR_H = @NEXT_AS_FIRST_DIRECTIVE_WCHAR_H@ NEXT_AS_FIRST_DIRECTIVE_WCTYPE_H = @NEXT_AS_FIRST_DIRECTIVE_WCTYPE_H@ NEXT_CTYPE_H = @NEXT_CTYPE_H@ NEXT_DIRENT_H = @NEXT_DIRENT_H@ NEXT_ERRNO_H = @NEXT_ERRNO_H@ NEXT_FCNTL_H = @NEXT_FCNTL_H@ NEXT_FLOAT_H = @NEXT_FLOAT_H@ NEXT_FNMATCH_H = @NEXT_FNMATCH_H@ NEXT_GETOPT_H = @NEXT_GETOPT_H@ NEXT_INTTYPES_H = @NEXT_INTTYPES_H@ NEXT_LANGINFO_H = @NEXT_LANGINFO_H@ NEXT_LIMITS_H = @NEXT_LIMITS_H@ NEXT_LOCALE_H = @NEXT_LOCALE_H@ NEXT_STDDEF_H = @NEXT_STDDEF_H@ NEXT_STDINT_H = @NEXT_STDINT_H@ NEXT_STDIO_H = @NEXT_STDIO_H@ NEXT_STDLIB_H = @NEXT_STDLIB_H@ NEXT_STRINGS_H = @NEXT_STRINGS_H@ NEXT_STRING_H = @NEXT_STRING_H@ NEXT_SYSEXITS_H = @NEXT_SYSEXITS_H@ NEXT_SYS_STAT_H = @NEXT_SYS_STAT_H@ NEXT_SYS_TYPES_H = @NEXT_SYS_TYPES_H@ NEXT_TIME_H = @NEXT_TIME_H@ NEXT_UNISTD_H = @NEXT_UNISTD_H@ NEXT_WCHAR_H = @NEXT_WCHAR_H@ NEXT_WCTYPE_H = @NEXT_WCTYPE_H@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POSUB = @POSUB@ PRAGMA_COLUMNS = @PRAGMA_COLUMNS@ PRAGMA_SYSTEM_HEADER = @PRAGMA_SYSTEM_HEADER@ PRIPTR_PREFIX = @PRIPTR_PREFIX@ PTHREAD_H_DEFINES_STRUCT_TIMESPEC = @PTHREAD_H_DEFINES_STRUCT_TIMESPEC@ PTRDIFF_T_SUFFIX = @PTRDIFF_T_SUFFIX@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ REPLACE_ACCESS = @REPLACE_ACCESS@ REPLACE_ALIGNED_ALLOC = @REPLACE_ALIGNED_ALLOC@ REPLACE_BTOWC = @REPLACE_BTOWC@ REPLACE_CALLOC_FOR_CALLOC_GNU = @REPLACE_CALLOC_FOR_CALLOC_GNU@ REPLACE_CALLOC_FOR_CALLOC_POSIX = @REPLACE_CALLOC_FOR_CALLOC_POSIX@ REPLACE_CANONICALIZE_FILE_NAME = @REPLACE_CANONICALIZE_FILE_NAME@ REPLACE_CHOWN = @REPLACE_CHOWN@ REPLACE_CLOSE = @REPLACE_CLOSE@ REPLACE_CLOSEDIR = @REPLACE_CLOSEDIR@ REPLACE_COPY_FILE_RANGE = @REPLACE_COPY_FILE_RANGE@ REPLACE_CREAT = @REPLACE_CREAT@ REPLACE_CTIME = @REPLACE_CTIME@ REPLACE_DIRFD = @REPLACE_DIRFD@ REPLACE_DPRINTF = @REPLACE_DPRINTF@ REPLACE_DUP = @REPLACE_DUP@ REPLACE_DUP2 = @REPLACE_DUP2@ REPLACE_DUPLOCALE = @REPLACE_DUPLOCALE@ REPLACE_EXECL = @REPLACE_EXECL@ REPLACE_EXECLE = @REPLACE_EXECLE@ REPLACE_EXECLP = @REPLACE_EXECLP@ REPLACE_EXECV = @REPLACE_EXECV@ REPLACE_EXECVE = @REPLACE_EXECVE@ REPLACE_EXECVP = @REPLACE_EXECVP@ REPLACE_EXECVPE = @REPLACE_EXECVPE@ REPLACE_FACCESSAT = @REPLACE_FACCESSAT@ REPLACE_FCHMODAT = @REPLACE_FCHMODAT@ REPLACE_FCHOWNAT = @REPLACE_FCHOWNAT@ REPLACE_FCLOSE = @REPLACE_FCLOSE@ REPLACE_FCNTL = @REPLACE_FCNTL@ REPLACE_FDOPEN = @REPLACE_FDOPEN@ REPLACE_FDOPENDIR = @REPLACE_FDOPENDIR@ REPLACE_FFLUSH = @REPLACE_FFLUSH@ REPLACE_FFSLL = @REPLACE_FFSLL@ REPLACE_FNMATCH = @REPLACE_FNMATCH@ REPLACE_FOPEN = @REPLACE_FOPEN@ REPLACE_FOPEN_FOR_FOPEN_GNU = @REPLACE_FOPEN_FOR_FOPEN_GNU@ REPLACE_FPRINTF = @REPLACE_FPRINTF@ REPLACE_FPURGE = @REPLACE_FPURGE@ REPLACE_FREE = @REPLACE_FREE@ REPLACE_FREELOCALE = @REPLACE_FREELOCALE@ REPLACE_FREOPEN = @REPLACE_FREOPEN@ REPLACE_FSEEK = @REPLACE_FSEEK@ REPLACE_FSEEKO = @REPLACE_FSEEKO@ REPLACE_FSTAT = @REPLACE_FSTAT@ REPLACE_FSTATAT = @REPLACE_FSTATAT@ REPLACE_FTELL = @REPLACE_FTELL@ REPLACE_FTELLO = @REPLACE_FTELLO@ REPLACE_FTRUNCATE = @REPLACE_FTRUNCATE@ REPLACE_FUTIMENS = @REPLACE_FUTIMENS@ REPLACE_GETCWD = @REPLACE_GETCWD@ REPLACE_GETDELIM = @REPLACE_GETDELIM@ REPLACE_GETDOMAINNAME = @REPLACE_GETDOMAINNAME@ REPLACE_GETDTABLESIZE = @REPLACE_GETDTABLESIZE@ REPLACE_GETGROUPS = @REPLACE_GETGROUPS@ REPLACE_GETLINE = @REPLACE_GETLINE@ REPLACE_GETLOGIN_R = @REPLACE_GETLOGIN_R@ REPLACE_GETPAGESIZE = @REPLACE_GETPAGESIZE@ REPLACE_GETPASS = @REPLACE_GETPASS@ REPLACE_GETPASS_FOR_GETPASS_GNU = @REPLACE_GETPASS_FOR_GETPASS_GNU@ REPLACE_GMTIME = @REPLACE_GMTIME@ REPLACE_INITSTATE = @REPLACE_INITSTATE@ REPLACE_ISATTY = @REPLACE_ISATTY@ REPLACE_ISWBLANK = @REPLACE_ISWBLANK@ REPLACE_ISWCNTRL = @REPLACE_ISWCNTRL@ REPLACE_ISWDIGIT = @REPLACE_ISWDIGIT@ REPLACE_ISWXDIGIT = @REPLACE_ISWXDIGIT@ REPLACE_ITOLD = @REPLACE_ITOLD@ REPLACE_LCHOWN = @REPLACE_LCHOWN@ REPLACE_LINK = @REPLACE_LINK@ REPLACE_LINKAT = @REPLACE_LINKAT@ REPLACE_LOCALECONV = @REPLACE_LOCALECONV@ REPLACE_LOCALTIME = @REPLACE_LOCALTIME@ REPLACE_LOCALTIME_R = @REPLACE_LOCALTIME_R@ REPLACE_LSEEK = @REPLACE_LSEEK@ REPLACE_LSTAT = @REPLACE_LSTAT@ REPLACE_MALLOC_FOR_MALLOC_GNU = @REPLACE_MALLOC_FOR_MALLOC_GNU@ REPLACE_MALLOC_FOR_MALLOC_POSIX = @REPLACE_MALLOC_FOR_MALLOC_POSIX@ REPLACE_MBRLEN = @REPLACE_MBRLEN@ REPLACE_MBRTOWC = @REPLACE_MBRTOWC@ REPLACE_MBSINIT = @REPLACE_MBSINIT@ REPLACE_MBSNRTOWCS = @REPLACE_MBSNRTOWCS@ REPLACE_MBSRTOWCS = @REPLACE_MBSRTOWCS@ REPLACE_MBSTATE_T = @REPLACE_MBSTATE_T@ REPLACE_MBTOWC = @REPLACE_MBTOWC@ REPLACE_MEMCHR = @REPLACE_MEMCHR@ REPLACE_MEMMEM = @REPLACE_MEMMEM@ REPLACE_MKDIR = @REPLACE_MKDIR@ REPLACE_MKFIFO = @REPLACE_MKFIFO@ REPLACE_MKFIFOAT = @REPLACE_MKFIFOAT@ REPLACE_MKNOD = @REPLACE_MKNOD@ REPLACE_MKNODAT = @REPLACE_MKNODAT@ REPLACE_MKSTEMP = @REPLACE_MKSTEMP@ REPLACE_MKTIME = @REPLACE_MKTIME@ REPLACE_NANOSLEEP = @REPLACE_NANOSLEEP@ REPLACE_NEWLOCALE = @REPLACE_NEWLOCALE@ REPLACE_NL_LANGINFO = @REPLACE_NL_LANGINFO@ REPLACE_NULL = @REPLACE_NULL@ REPLACE_OBSTACK_PRINTF = @REPLACE_OBSTACK_PRINTF@ REPLACE_OPEN = @REPLACE_OPEN@ REPLACE_OPENAT = @REPLACE_OPENAT@ REPLACE_OPENDIR = @REPLACE_OPENDIR@ REPLACE_PERROR = @REPLACE_PERROR@ REPLACE_POPEN = @REPLACE_POPEN@ REPLACE_POSIX_MEMALIGN = @REPLACE_POSIX_MEMALIGN@ REPLACE_PREAD = @REPLACE_PREAD@ REPLACE_PRINTF = @REPLACE_PRINTF@ REPLACE_PTSNAME = @REPLACE_PTSNAME@ REPLACE_PTSNAME_R = @REPLACE_PTSNAME_R@ REPLACE_PUTENV = @REPLACE_PUTENV@ REPLACE_PWRITE = @REPLACE_PWRITE@ REPLACE_QSORT_R = @REPLACE_QSORT_R@ REPLACE_RANDOM = @REPLACE_RANDOM@ REPLACE_RANDOM_R = @REPLACE_RANDOM_R@ REPLACE_READ = @REPLACE_READ@ REPLACE_READLINK = @REPLACE_READLINK@ REPLACE_READLINKAT = @REPLACE_READLINKAT@ REPLACE_REALLOCARRAY = @REPLACE_REALLOCARRAY@ REPLACE_REALLOC_FOR_REALLOC_GNU = @REPLACE_REALLOC_FOR_REALLOC_GNU@ REPLACE_REALLOC_FOR_REALLOC_POSIX = @REPLACE_REALLOC_FOR_REALLOC_POSIX@ REPLACE_REALPATH = @REPLACE_REALPATH@ REPLACE_REMOVE = @REPLACE_REMOVE@ REPLACE_RENAME = @REPLACE_RENAME@ REPLACE_RENAMEAT = @REPLACE_RENAMEAT@ REPLACE_RMDIR = @REPLACE_RMDIR@ REPLACE_SETENV = @REPLACE_SETENV@ REPLACE_SETLOCALE = @REPLACE_SETLOCALE@ REPLACE_SETSTATE = @REPLACE_SETSTATE@ REPLACE_SLEEP = @REPLACE_SLEEP@ REPLACE_SNPRINTF = @REPLACE_SNPRINTF@ REPLACE_SPRINTF = @REPLACE_SPRINTF@ REPLACE_STAT = @REPLACE_STAT@ REPLACE_STDIO_READ_FUNCS = @REPLACE_STDIO_READ_FUNCS@ REPLACE_STDIO_WRITE_FUNCS = @REPLACE_STDIO_WRITE_FUNCS@ REPLACE_STPNCPY = @REPLACE_STPNCPY@ REPLACE_STRCASESTR = @REPLACE_STRCASESTR@ REPLACE_STRCHRNUL = @REPLACE_STRCHRNUL@ REPLACE_STRDUP = @REPLACE_STRDUP@ REPLACE_STRERROR = @REPLACE_STRERROR@ REPLACE_STRERRORNAME_NP = @REPLACE_STRERRORNAME_NP@ REPLACE_STRERROR_R = @REPLACE_STRERROR_R@ REPLACE_STRFTIME = @REPLACE_STRFTIME@ REPLACE_STRNCAT = @REPLACE_STRNCAT@ REPLACE_STRNDUP = @REPLACE_STRNDUP@ REPLACE_STRNLEN = @REPLACE_STRNLEN@ REPLACE_STRSIGNAL = @REPLACE_STRSIGNAL@ REPLACE_STRSTR = @REPLACE_STRSTR@ REPLACE_STRTOD = @REPLACE_STRTOD@ REPLACE_STRTOIMAX = @REPLACE_STRTOIMAX@ REPLACE_STRTOK_R = @REPLACE_STRTOK_R@ REPLACE_STRTOL = @REPLACE_STRTOL@ REPLACE_STRTOLD = @REPLACE_STRTOLD@ REPLACE_STRTOLL = @REPLACE_STRTOLL@ REPLACE_STRTOUL = @REPLACE_STRTOUL@ REPLACE_STRTOULL = @REPLACE_STRTOULL@ REPLACE_STRTOUMAX = @REPLACE_STRTOUMAX@ REPLACE_STRUCT_LCONV = @REPLACE_STRUCT_LCONV@ REPLACE_SYMLINK = @REPLACE_SYMLINK@ REPLACE_SYMLINKAT = @REPLACE_SYMLINKAT@ REPLACE_TIMEGM = @REPLACE_TIMEGM@ REPLACE_TMPFILE = @REPLACE_TMPFILE@ REPLACE_TOWLOWER = @REPLACE_TOWLOWER@ REPLACE_TRUNCATE = @REPLACE_TRUNCATE@ REPLACE_TTYNAME_R = @REPLACE_TTYNAME_R@ REPLACE_TZSET = @REPLACE_TZSET@ REPLACE_UNLINK = @REPLACE_UNLINK@ REPLACE_UNLINKAT = @REPLACE_UNLINKAT@ REPLACE_UNSETENV = @REPLACE_UNSETENV@ REPLACE_USLEEP = @REPLACE_USLEEP@ REPLACE_UTIMENSAT = @REPLACE_UTIMENSAT@ REPLACE_VASPRINTF = @REPLACE_VASPRINTF@ REPLACE_VDPRINTF = @REPLACE_VDPRINTF@ REPLACE_VFPRINTF = @REPLACE_VFPRINTF@ REPLACE_VPRINTF = @REPLACE_VPRINTF@ REPLACE_VSNPRINTF = @REPLACE_VSNPRINTF@ REPLACE_VSPRINTF = @REPLACE_VSPRINTF@ REPLACE_WCRTOMB = @REPLACE_WCRTOMB@ REPLACE_WCSFTIME = @REPLACE_WCSFTIME@ REPLACE_WCSNRTOMBS = @REPLACE_WCSNRTOMBS@ REPLACE_WCSRTOMBS = @REPLACE_WCSRTOMBS@ REPLACE_WCSTOK = @REPLACE_WCSTOK@ REPLACE_WCSWIDTH = @REPLACE_WCSWIDTH@ REPLACE_WCTOB = @REPLACE_WCTOB@ REPLACE_WCTOMB = @REPLACE_WCTOMB@ REPLACE_WCWIDTH = @REPLACE_WCWIDTH@ REPLACE_WRITE = @REPLACE_WRITE@ SDL2_CFLAGS = @SDL2_CFLAGS@ SDL2_LIBS = @SDL2_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIG_ATOMIC_T_SUFFIX = @SIG_ATOMIC_T_SUFFIX@ SIZE_T_SUFFIX = @SIZE_T_SUFFIX@ STDALIGN_H = @STDALIGN_H@ STDBOOL_H = @STDBOOL_H@ STDDEF_H = @STDDEF_H@ STDINT_H = @STDINT_H@ STRIP = @STRIP@ SYSEXITS_H = @SYSEXITS_H@ SYS_TIME_H_DEFINES_STRUCT_TIMESPEC = @SYS_TIME_H_DEFINES_STRUCT_TIMESPEC@ TARGET_APPLE_LINKER = @TARGET_APPLE_LINKER@ TARGET_CC = @TARGET_CC@ TARGET_CCAS = @TARGET_CCAS@ TARGET_CCASFLAGS = @TARGET_CCASFLAGS@ TARGET_CC_VERSION = @TARGET_CC_VERSION@ TARGET_CFLAGS = @TARGET_CFLAGS@ TARGET_CPP = @TARGET_CPP@ TARGET_CPPFLAGS = @TARGET_CPPFLAGS@ TARGET_DECOMPRESSOR_LINK_ADDR = @TARGET_DECOMPRESSOR_LINK_ADDR@ TARGET_IMG_BASE_LDOPT = @TARGET_IMG_BASE_LDOPT@ TARGET_IMG_CFLAGS = @TARGET_IMG_CFLAGS@ TARGET_IMG_LDFLAGS = @TARGET_IMG_LDFLAGS@ TARGET_LDFLAGS = @TARGET_LDFLAGS@ TARGET_LDFLAGS_OLDMAGIC = @TARGET_LDFLAGS_OLDMAGIC@ TARGET_LINK_ADDR = @TARGET_LINK_ADDR@ TARGET_MODULE_FORMAT = @TARGET_MODULE_FORMAT@ TARGET_NM = @TARGET_NM@ TARGET_NMFLAGS_DEFINED_ONLY = @TARGET_NMFLAGS_DEFINED_ONLY@ TARGET_NMFLAGS_MINUS_P = @TARGET_NMFLAGS_MINUS_P@ TARGET_OBJ2ELF = @TARGET_OBJ2ELF@ TARGET_OBJCONV = @TARGET_OBJCONV@ TARGET_OBJCOPY = @TARGET_OBJCOPY@ TARGET_RANLIB = @TARGET_RANLIB@ TARGET_STRIP = @TARGET_STRIP@ TIME_H_DEFINES_STRUCT_TIMESPEC = @TIME_H_DEFINES_STRUCT_TIMESPEC@ TIME_H_DEFINES_TIME_UTC = @TIME_H_DEFINES_TIME_UTC@ UINT32_MAX_LT_UINTMAX_MAX = @UINT32_MAX_LT_UINTMAX_MAX@ UINT64_MAX_EQ_ULONG_MAX = @UINT64_MAX_EQ_ULONG_MAX@ UNDEFINE_STRTOK_R = @UNDEFINE_STRTOK_R@ UNISTD_H_DEFINES_STRUCT_TIMESPEC = @UNISTD_H_DEFINES_STRUCT_TIMESPEC@ UNISTD_H_HAVE_SYS_RANDOM_H = @UNISTD_H_HAVE_SYS_RANDOM_H@ UNISTD_H_HAVE_WINSOCK2_H = @UNISTD_H_HAVE_WINSOCK2_H@ UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS = @UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WCHAR_T_SUFFIX = @WCHAR_T_SUFFIX@ WINDOWS_64_BIT_OFF_T = @WINDOWS_64_BIT_OFF_T@ WINDOWS_64_BIT_ST_SIZE = @WINDOWS_64_BIT_ST_SIZE@ WINDOWS_STAT_INODES = @WINDOWS_STAT_INODES@ WINDOWS_STAT_TIMESPEC = @WINDOWS_STAT_TIMESPEC@ WINT_T_SUFFIX = @WINT_T_SUFFIX@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_TARGET_CC = @ac_ct_TARGET_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ bootdirname = @bootdirname@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ enable_efiemu = @enable_efiemu@ enable_grub_emu_pci = @enable_grub_emu_pci@ enable_grub_emu_sdl = @enable_grub_emu_sdl@ enable_grub_emu_sdl2 = @enable_grub_emu_sdl2@ enable_grub_mkfont = @enable_grub_mkfont@ enable_grub_mount = @enable_grub_mount@ enable_grub_protect = @enable_grub_protect@ exec_prefix = @exec_prefix@ gl_LIBOBJDEPS = @gl_LIBOBJDEPS@ gl_LIBOBJS = @gl_LIBOBJS@ gl_LTLIBOBJS = @gl_LTLIBOBJS@ gltests_LIBOBJDEPS = @gltests_LIBOBJDEPS@ gltests_LIBOBJS = @gltests_LIBOBJS@ gltests_LTLIBOBJS = @gltests_LTLIBOBJS@ gltests_WITNESS = @gltests_WITNESS@ grub_bios_setup = @grub_bios_setup@ grub_editenv = @grub_editenv@ grub_file = @grub_file@ grub_glue_efi = @grub_glue_efi@ grub_install = @grub_install@ grub_mkconfig = @grub_mkconfig@ grub_mkfont = @grub_mkfont@ grub_mkimage = @grub_mkimage@ grub_mklayout = @grub_mklayout@ grub_mkpasswd_pbkdf2 = @grub_mkpasswd_pbkdf2@ grub_mkrelpath = @grub_mkrelpath@ grub_mkrescue = @grub_mkrescue@ grub_probe = @grub_probe@ grub_protect = @grub_protect@ grub_reboot = @grub_reboot@ grub_render_label = @grub_render_label@ grub_script_check = @grub_script_check@ grub_set_default = @grub_set_default@ grub_sparc64_setup = @grub_sparc64_setup@ grubdirname = @grubdirname@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_kernel = @host_kernel@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AUTOMAKE_OPTIONS = subdir-objects -Wno-portability SUBDIRS = grub-core/lib/gnulib . $(am__append_1) po docs \ util/bash-completion.d CFLAGS_PLATFORM = $(am__append_2) $(am__append_3) $(am__append_4) @COND_arm_TRUE@@COND_emu_FALSE@LDFLAGS_PLATFORM = -Wl,--wrap=__clear_cache # Platform specific options @COND_sparc64_ieee1275_TRUE@LDFLAGS_PLATFORM = -Wl,-melf64_sparc # Other options CPPFLAGS_DEFAULT = -DGRUB_FILE=\"$(subst $(srcdir)/,,$<)\" \ -I$(builddir) -I$(srcdir) -I$(top_builddir) -I$(top_srcdir) \ -I$(top_srcdir)/include -I$(top_builddir)/include \ -I$(top_srcdir)/grub-core/lib/libgcrypt-grub/src/ CCASFLAGS_DEFAULT = $(CPPFLAGS_DEFAULT) -DASM_FILE=1 CFLAGS_KERNEL = $(CFLAGS_PLATFORM) -ffreestanding LDFLAGS_KERNEL = $(LDFLAGS_PLATFORM) -nostdlib \ $(TARGET_LDFLAGS_OLDMAGIC) $(am__append_5) $(am__append_6) CPPFLAGS_KERNEL = $(CPPFLAGS_CPU) $(CPPFLAGS_PLATFORM) -DGRUB_KERNEL=1 CCASFLAGS_KERNEL = $(CCASFLAGS_CPU) $(CCASFLAGS_PLATFORM) STRIPFLAGS_KERNEL = -R .rel.dyn -R .reginfo -R .note -R .comment -R .drectve -R .note.gnu.gold-version -R .MIPS.abiflags -R .ARM.exidx CFLAGS_MODULE = $(CFLAGS_PLATFORM) -ffreestanding LDFLAGS_MODULE = $(LDFLAGS_PLATFORM) -nostdlib $(TARGET_LDFLAGS_OLDMAGIC) -Wl,-r CPPFLAGS_MODULE = $(CPPFLAGS_CPU) $(CPPFLAGS_PLATFORM) CCASFLAGS_MODULE = $(CCASFLAGS_CPU) $(CCASFLAGS_PLATFORM) CFLAGS_IMAGE = $(CFLAGS_PLATFORM) -fno-builtin LDFLAGS_IMAGE = $(LDFLAGS_PLATFORM) -nostdlib $(TARGET_LDFLAGS_OLDMAGIC) -Wl,-S CPPFLAGS_IMAGE = $(CPPFLAGS_CPU) $(CPPFLAGS_PLATFORM) CCASFLAGS_IMAGE = $(CCASFLAGS_CPU) $(CCASFLAGS_PLATFORM) CFLAGS_PROGRAM = $(CFLAGS_GNULIB) LDFLAGS_PROGRAM = $(LDFLAGS_GNULIB) CPPFLAGS_PROGRAM = $(CPPFLAGS_GNULIB) CCASFLAGS_PROGRAM = $(CCASFLAGS_GNULIB) CFLAGS_LIBRARY = CPPFLAGS_LIBRARY = CCASFLAGS_LIBRARY = # Other variables grubconfdir = $(sysconfdir)/grub.d platformdir = $(pkglibdir)/$(target_cpu)-$(platform) starfielddir = $(pkgdatadir)/themes/starfield CFLAGS_GNULIB = -Wno-undef -Wno-sign-compare -Wno-unused -Wno-unused-parameter -Wno-redundant-decls -Wno-unreachable-code -Wno-conversion -Wno-error=attributes CPPFLAGS_GNULIB = -I$(top_builddir)/grub-core/lib/gnulib -I$(top_srcdir)/grub-core/lib/gnulib CFLAGS_POSIX = -fno-builtin CPPFLAGS_POSIX = -I$(top_srcdir)/grub-core/lib/posix_wrap CFLAGS_GCRY = -Wno-sign-compare -Wno-missing-field-initializers -Wno-redundant-decls -Wno-undef $(CFLAGS_POSIX) CPPFLAGS_GCRY = -I$(top_srcdir)/grub-core/lib/libgcrypt_wrap $(CPPFLAGS_POSIX) -D_GCRYPT_IN_LIBGCRYPT=1 -D_GCRYPT_CONFIG_H_INCLUDED=1 -I$(top_srcdir)/include/grub/gcrypt CPPFLAGS_EFIEMU = -I$(top_srcdir)/grub-core/efiemu/runtime # List file macros for recognizing /interesting/ modules CPPFLAGS_FS_LIST = -Dgrub_fs_register=FS_LIST_MARKER CPPFLAGS_VIDEO_LIST = -Dgrub_video_register=VIDEO_LIST_MARKER CPPFLAGS_PARTMAP_LIST = -Dgrub_partition_map_register=PARTMAP_LIST_MARKER CPPFLAGS_PARTTOOL_LIST = -Dgrub_parttool_register=PARTTOOL_LIST_MARKER CPPFLAGS_TERMINAL_LIST = '-Dgrub_term_register_input(...)=INPUT_TERMINAL_LIST_MARKER(__VA_ARGS__)' \ '-Dgrub_term_register_output(...)=OUTPUT_TERMINAL_LIST_MARKER(__VA_ARGS__)' CPPFLAGS_COMMAND_LIST = '-Dgrub_register_command(...)=COMMAND_LIST_MARKER(__VA_ARGS__)' \ '-Dgrub_register_command_lockdown(...)=COMMAND_LOCKDOWN_LIST_MARKER(__VA_ARGS__)' \ '-Dgrub_register_extcmd(...)=EXTCOMMAND_LIST_MARKER(__VA_ARGS__)' \ '-Dgrub_register_extcmd_lockdown(...)=EXTCOMMAND_LOCKDOWN_LIST_MARKER(__VA_ARGS__)' \ '-Dgrub_register_command_p1(...)=P1COMMAND_LIST_MARKER(__VA_ARGS__)' CPPFLAGS_FDT_LIST := '-Dgrub_fdtbus_register(...)=FDT_DRIVER_LIST_MARKER(__VA_ARGS__)' CPPFLAGS_MARKER = $(CPPFLAGS_FS_LIST) $(CPPFLAGS_VIDEO_LIST) \ $(CPPFLAGS_PARTTOOL_LIST) $(CPPFLAGS_PARTMAP_LIST) \ $(CPPFLAGS_TERMINAL_LIST) $(CPPFLAGS_COMMAND_LIST) \ $(CPPFLAGS_FDT_LIST) # Define these variables to calm down automake IMG_FILES = MOD_FILES = MODULE_FILES = MARKER_FILES = KERNEL_HEADER_FILES = EXTRA_DEPS = bin_SCRIPTS = grub-kbdcomp check_SCRIPTS_native = erofs_test ext234_test squashfs_test \ iso9660_test hfsplus_test ntfs_test reiserfs_test fat_test \ minixfs_test xfs_test f2fs_test nilfs2_test romfs_test \ exfat_test tar_test udf_test hfs_test jfs_test btrfs_test \ zfs_test cpio_test example_scripted_test gettext_strings_test \ grub_script_blanklines grub_script_final_semicolon \ grub_script_dollar grub_script_no_commands syslinux_test \ luks1_test luks2_test asn1_test tpm2_key_protector_test check_SCRIPTS_nonnative = pata_test ahci_test uhci_test ohci_test \ ehci_test example_grub_script_test grub_script_eval \ grub_script_test grub_script_echo1 \ grub_script_leading_whitespace grub_script_echo_keywords \ grub_script_vars1 grub_script_for1 grub_script_while1 \ grub_script_if grub_script_comments grub_script_functions \ grub_script_break grub_script_continue grub_script_shift \ grub_script_blockarg grub_script_setparams grub_script_return \ grub_cmd_cryptomount grub_cmd_regexp grub_cmd_date \ grub_cmd_set_date grub_cmd_sleep grub_script_expansion \ grub_script_not partmap_test hddboot_test fddboot_test \ cdboot_test netboot_test serial_test pseries_test \ core_compress_test xzcompress_test gzcompress_test \ lzocompress_test grub_cmd_echo help_test grub_script_gettext \ grub_script_escape_comma grub_script_strcmp test_sha512sum \ test_unset grub_func_test grub_cmd_tr file_filter_test \ grub_cmd_test check_PROGRAMS_native = example_unit_test printf_test date_test \ $(am__append_57) cmp_test check_PROGRAMS_nonnative = dist_grubconf_DATA = util/grub.d/README dist_noinst_DATA = grub-core/kern/disk_common.c \ grub-core/osdep/unix/relpath.c grub-core/osdep/aros/relpath.c \ grub-core/osdep/windows/relpath.c \ grub-core/lib/libgcrypt-grub/cipher/ChangeLog \ grub-core/osdep/aros/config.c grub-core/osdep/windows/config.c \ grub-core/osdep/unix/config.c util/grub-mkimagexx.c \ $(am__append_12) grub-core/osdep/unix/compress.c \ grub-core/osdep/basic/compress.c $(am__append_23) \ $(am__append_31) $(am__append_37) util/setup.c \ grub-core/osdep/generic/blocklist.c \ grub-core/osdep/linux/blocklist.c \ grub-core/osdep/windows/blocklist.c $(am__append_50) \ grub-core/osdep/linux/platform.c \ grub-core/osdep/windows/platform.c \ grub-core/osdep/basic/platform.c \ grub-core/osdep/basic/no_platform.c \ grub-core/osdep/unix/platform.c $(am__append_58) \ util/grub.d/00_header.in $(am__append_69) $(am__append_73) \ $(am__append_77) $(am__append_81) $(am__append_85) \ $(am__append_89) $(am__append_93) $(am__append_97) \ util/grub.d/25_bli.in util/grub.d/30_os-prober.in \ util/grub.d/30_uefi-firmware.in util/grub.d/40_custom.in \ util/grub.d/41_custom.in util/grub-mkconfig.in \ util/grub-set-default.in util/grub-reboot.in \ util/grub-mkconfig_lib.in util/grub-kbdcomp.in \ tests/util/grub-shell.in tests/util/grub-shell-tester.in \ tests/util/grub-shell-luks-tester.in \ tests/util/grub-fs-tester.in tests/erofs_test.in \ tests/ext234_test.in tests/squashfs_test.in \ tests/iso9660_test.in tests/hfsplus_test.in tests/ntfs_test.in \ tests/reiserfs_test.in tests/fat_test.in tests/minixfs_test.in \ tests/xfs_test.in tests/f2fs_test.in tests/nilfs2_test.in \ tests/romfs_test.in tests/exfat_test.in tests/tar_test.in \ tests/udf_test.in tests/hfs_test.in tests/jfs_test.in \ tests/btrfs_test.in tests/zfs_test.in tests/cpio_test.in \ tests/example_scripted_test.in tests/gettext_strings_test.in \ tests/pata_test.in tests/ahci_test.in tests/uhci_test.in \ tests/ohci_test.in tests/ehci_test.in \ tests/example_grub_script_test.in tests/grub_script_eval.in \ tests/grub_script_test.in tests/grub_script_echo1.in \ tests/grub_script_leading_whitespace.in \ tests/grub_script_echo_keywords.in tests/grub_script_vars1.in \ tests/grub_script_for1.in tests/grub_script_while1.in \ tests/grub_script_if.in tests/grub_script_blanklines.in \ tests/grub_script_final_semicolon.in \ tests/grub_script_dollar.in tests/grub_script_comments.in \ tests/grub_script_functions.in tests/grub_script_break.in \ tests/grub_script_continue.in tests/grub_script_shift.in \ tests/grub_script_blockarg.in tests/grub_script_setparams.in \ tests/grub_script_return.in tests/grub_cmd_cryptomount.in \ tests/grub_cmd_regexp.in tests/grub_cmd_date.in \ tests/grub_cmd_set_date.in tests/grub_cmd_sleep.in \ tests/grub_script_expansion.in tests/grub_script_not.in \ tests/grub_script_no_commands.in tests/partmap_test.in \ tests/hddboot_test.in tests/fddboot_test.in \ tests/cdboot_test.in tests/netboot_test.in \ tests/serial_test.in tests/pseries_test.in \ tests/core_compress_test.in tests/xzcompress_test.in \ tests/gzcompress_test.in tests/lzocompress_test.in \ tests/grub_cmd_echo.in tests/help_test.in \ tests/grub_script_gettext.in tests/grub_script_escape_comma.in \ tests/grub_script_strcmp.in tests/test_sha512sum.in \ tests/test_unset.in tests/grub_func_test.in \ tests/grub_cmd_tr.in tests/file_filter_test.in \ tests/grub_cmd_test.in tests/syslinux_test.in \ tests/luks1_test.in tests/luks2_test.in tests/asn1_test.in \ tests/tpm2_key_protector_test.in grubconf_SCRIPTS = 00_header $(am__append_66) $(am__append_70) \ $(am__append_74) $(am__append_78) $(am__append_82) \ $(am__append_86) $(am__append_90) $(am__append_94) 25_bli \ 30_os-prober 30_uefi-firmware 40_custom 41_custom man_MANS = $(am__append_7) $(am__append_10) $(am__append_15) \ $(am__append_21) $(am__append_26) $(am__append_29) \ $(am__append_35) $(am__append_40) $(am__append_48) \ $(am__append_53) noinst_DATA = noinst_SCRIPTS = grub-mkconfig_lib grub-shell grub-shell-tester \ grub-shell-luks-tester grub-fs-tester noinst_LIBRARIES = libgrubkern.a libgrubmods.a libgrubgcry.a pkgdata_DATA = $(am__append_102) grub-mkconfig_lib platform_DATA = platform_SCRIPTS = sbin_SCRIPTS = grub-mkconfig grub-set-default grub-reboot EXTRA_DIST = autogen.sh geninit.sh gentpl.py Makefile.util.def \ Makefile.utilgcry.def asm-tests unicode util/import_gcry.py \ util/import_unicode.py docs/man docs/autoiso.cfg docs/grub.cfg \ docs/osdetect.cfg conf/i386-cygwin-img-ld.sc \ grub-core/Makefile.core.def grub-core/Makefile.gcry.def \ grub-core/genmoddep.awk grub-core/genmod.sh.in \ grub-core/gensyminfo.sh.in grub-core/gensymlist.sh \ grub-core/genemuinit.sh grub-core/genemuinitheader.sh \ grub-core/lib/gnulib-patches/fix-width.patch \ grub-core/lib/gnulib-patches/fix-regcomp-resource-leak.patch \ grub-core/lib/gnulib-patches/fix-regexec-resource-leak.patch \ grub-core/lib/gnulib-patches/fix-gcc-15-compile.patch \ grub-core/lib/gnulib-patches/fix-unused-value.patch \ grub-core/lib/libgcrypt \ grub-core/lib/libgcrypt-grub/mpi/generic $(shell find \ $(top_srcdir)/include -name '*.h') $(shell find \ $(top_srcdir)/grub-core/lib -name '*.h') \ grub-core/efiemu/runtime/config.h \ grub-core/tests/asn1/asn1_test.h $(shell find \ $(top_srcdir)/grub-core/tests/asn1/tests -name '*.h') $(shell \ find $(top_srcdir)/grub-core/commands/tpm2_key_protector -name \ '*.h') grub-core/lib/LzmaDec.c grub-core/fs/cpio_common.c BUGS \ util/i386/efi/grub-dumpdevtree util/spkmodem-recv.c \ util/import_gcrypth.sed util/bin2h.c util/grub-gen-asciih.c \ util/grub-gen-widthspec.c util/grub-module-verifier.c \ util/grub-module-verifier32.c util/grub-module-verifier64.c \ util/grub-module-verifierXX.c util/grub-pe2elf.c \ m4/gnulib-cache.m4 m4/glibc2.m4 m4/gnulib-tool.m4 \ m4/intdiv0.m4 m4/intl.m4 m4/intldir.m4 m4/intmax.m4 \ m4/inttypes-pri.m4 m4/lcmessage.m4 m4/lock.m4 \ m4/printf-posix.m4 m4/threadlib.m4 m4/uintmax_t.m4 \ m4/visibility.m4 m4/math_h.m4 grub-core/osdep/apple/hostdisk.c \ grub-core/osdep/aros/hostdisk.c \ grub-core/osdep/basic/hostdisk.c \ grub-core/osdep/bsd/hostdisk.c \ grub-core/osdep/freebsd/hostdisk.c \ grub-core/osdep/hurd/hostdisk.c \ grub-core/osdep/linux/hostdisk.c \ grub-core/osdep/windows/hostdisk.c \ grub-core/osdep/sun/hostdisk.c \ grub-core/osdep/haiku/hostdisk.c grub-core/osdep/basic/init.c \ grub-core/osdep/windows/init.c grub-core/osdep/apple/getroot.c \ grub-core/osdep/aros/getroot.c grub-core/osdep/basic/getroot.c \ grub-core/osdep/bsd/getroot.c \ grub-core/osdep/windows/getroot.c \ grub-core/osdep/freebsd/getroot.c \ grub-core/osdep/hurd/getroot.c grub-core/osdep/linux/getroot.c \ grub-core/osdep/sun/getroot.c grub-core/osdep/haiku/getroot.c \ grub-core/osdep/basic/random.c grub-core/osdep/basic/ofpath.c \ grub-core/osdep/unix/password.c grub-core/osdep/unix/random.c \ grub-core/osdep/unix/sleep.c grub-core/osdep/linux/ofpath.c \ grub-core/osdep/windows/password.c \ grub-core/osdep/windows/random.c \ grub-core/osdep/windows/sleep.c \ po/gettext-patches/0001-Support-POTFILES-shell.patch \ po/gettext-patches/0002-Handle-gettext_printf-shell-function.patch \ po/gettext-patches/0003-Make-msgfmt-output-in-little-endian.patch \ po/gettext-patches/0004-Use-SHELL-rather-than-bin-sh.patch \ po/POTFILES-shell.in po/README po/Rules-translit \ po/Rules-windowsdir po/arabic.sed po/cyrillic.sed po/greek.sed \ po/grub.d.sed po/hebrew.sed \ tests/dfly-mbr-mbexample.mbr.img.gz \ tests/dfly-mbr-mbexample.dfly.img.gz coreboot.cfg \ tests/file_filter/file tests/file_filter/file.gz \ tests/file_filter/file.gz.sig tests/file_filter/file.lzop \ tests/file_filter/file.lzop.sig tests/file_filter/file.xz \ tests/file_filter/file.xz.sig tests/file_filter/keys \ tests/file_filter/keys.pub tests/file_filter/test.cfg \ tests/syslinux/ubuntu10.04/isolinux/prompt.cfg \ tests/syslinux/ubuntu10.04/isolinux/gfxboot.cfg \ tests/syslinux/ubuntu10.04/isolinux/adtxt.cfg \ tests/syslinux/ubuntu10.04/isolinux/isolinux.cfg \ tests/syslinux/ubuntu10.04/isolinux/exithelp.cfg \ tests/syslinux/ubuntu10.04/isolinux/txt.cfg \ tests/syslinux/ubuntu10.04/isolinux/menu.cfg \ tests/syslinux/ubuntu10.04/isolinux/stdmenu.cfg \ tests/syslinux/ubuntu10.04/isolinux/dtmenu.cfg \ tests/syslinux/ubuntu10.04/isolinux/po4a.cfg \ tests/syslinux/ubuntu10.04/isolinux/rqtxt.cfg \ tests/syslinux/ubuntu10.04_grub.cfg.in $(am__append_68) \ $(am__append_72) $(am__append_76) $(am__append_80) \ $(am__append_84) $(am__append_88) $(am__append_92) \ $(am__append_96) po/exclude.pot util/garbage-gen.c \ $(starfield_theme_files) \ $(srcdir)/themes/starfield/src/slider_s.xcf \ $(srcdir)/themes/starfield/src/slider_n.xcf \ $(srcdir)/themes/starfield/src/slider_c.xcf \ $(srcdir)/themes/starfield/src/blob_nw.xcf \ $(srcdir)/themes/starfield/src/bootmenu/center.xcf \ $(srcdir)/themes/starfield/src/bootmenu/corner.xcf \ $(srcdir)/themes/starfield/src/bootmenu/side.xcf \ $(srcdir)/themes/starfield/src/terminalbox/side.xcf \ $(srcdir)/themes/starfield/src/terminalbox/corner.xcf \ $(srcdir)/themes/starfield/src/terminalbox/center.xcf \ grub-core/tests/boot/kbsd.init-i386.S \ grub-core/tests/boot/kbsd.init-x86_64.S \ grub-core/tests/boot/kbsd.spec.txt \ grub-core/tests/boot/kernel-8086.S \ grub-core/tests/boot/kernel-i386.S \ grub-core/tests/boot/kfreebsd-aout.cfg \ grub-core/tests/boot/kfreebsd.cfg \ grub-core/tests/boot/kfreebsd.init-i386.S \ grub-core/tests/boot/kfreebsd.init-x86_64.S \ grub-core/tests/boot/knetbsd.cfg \ grub-core/tests/boot/kopenbsd.cfg \ grub-core/tests/boot/kopenbsdlabel.txt \ grub-core/tests/boot/linux16.cfg \ grub-core/tests/boot/linux.cfg \ grub-core/tests/boot/linux.init-i386.S \ grub-core/tests/boot/linux.init-mips.S \ grub-core/tests/boot/linux.init-ppc.S \ grub-core/tests/boot/linux.init-x86_64.S \ grub-core/tests/boot/linux-ppc.cfg \ grub-core/tests/boot/multiboot2.cfg \ grub-core/tests/boot/multiboot.cfg \ grub-core/tests/boot/ntldr.cfg \ grub-core/tests/boot/pc-chainloader.cfg \ grub-core/tests/boot/qemu-shutdown-x86.S linguas.sh CLEANFILES = $(nodist_libgrubkern_a_SOURCES) \ $(nodist_libgrubmods_a_SOURCES) \ $(nodist_libgrubgcry_a_SOURCES) $(am__append_8) \ $(nodist_grub_mkimage_SOURCES) $(am__append_11) \ $(am__append_14) $(am__append_16) \ $(nodist_grub_mkrelpath_SOURCES) $(am__append_17) \ $(nodist_grub_script_check_SOURCES) $(am__append_18) \ $(nodist_grub_editenv_SOURCES) $(am__append_19) \ $(nodist_grub_mkpasswd_pbkdf2_SOURCES) $(am__append_22) \ $(am__append_25) $(am__append_27) \ $(nodist_grub_fstest_SOURCES) $(am__append_30) \ $(am__append_33) $(am__append_36) $(am__append_39) \ $(am__append_41) $(nodist_grub_probe_SOURCES) $(am__append_42) \ $(nodist_grub_bios_setup_SOURCES) $(am__append_43) \ $(nodist_grub_sparc64_setup_SOURCES) $(am__append_44) \ $(nodist_grub_ofpathname_SOURCES) $(am__append_45) \ $(nodist_grub_mklayout_SOURCES) $(am__append_46) \ $(nodist_grub_macbless_SOURCES) $(am__append_49) \ $(am__append_52) $(am__append_54) \ $(nodist_grub_mkstandalone_SOURCES) $(am__append_55) \ $(nodist_grub_install_SOURCES) $(am__append_56) \ $(nodist_grub_mknetdir_SOURCES) \ $(nodist_example_unit_test_SOURCES) \ $(nodist_printf_test_SOURCES) $(nodist_date_test_SOURCES) \ $(am__append_60) $(nodist_cmp_test_SOURCES) $(am__append_61) \ $(nodist_grub_menulst2cfg_SOURCES) $(am__append_62) \ $(nodist_grub_syslinux2cfg_SOURCES) $(am__append_63) \ $(nodist_grub_glue_efi_SOURCES) $(am__append_64) \ $(nodist_grub_render_label_SOURCES) $(am__append_65) \ $(nodist_grub_file_SOURCES) 00_header $(am__append_67) \ $(am__append_71) $(am__append_75) $(am__append_79) \ $(am__append_83) $(am__append_87) $(am__append_91) \ $(am__append_95) 25_bli 30_os-prober 30_uefi-firmware \ 40_custom 41_custom $(am__append_98) grub-mkconfig \ $(am__append_99) grub-set-default $(am__append_100) \ grub-reboot grub-mkconfig_lib $(am__append_101) grub-kbdcomp \ grub-shell grub-shell-tester grub-shell-luks-tester \ grub-fs-tester erofs_test ext234_test squashfs_test \ iso9660_test hfsplus_test ntfs_test reiserfs_test fat_test \ minixfs_test xfs_test f2fs_test nilfs2_test romfs_test \ exfat_test tar_test udf_test hfs_test jfs_test btrfs_test \ zfs_test cpio_test example_scripted_test gettext_strings_test \ pata_test ahci_test uhci_test ohci_test ehci_test \ example_grub_script_test grub_script_eval grub_script_test \ grub_script_echo1 grub_script_leading_whitespace \ grub_script_echo_keywords grub_script_vars1 grub_script_for1 \ grub_script_while1 grub_script_if grub_script_blanklines \ grub_script_final_semicolon grub_script_dollar \ grub_script_comments grub_script_functions grub_script_break \ grub_script_continue grub_script_shift grub_script_blockarg \ grub_script_setparams grub_script_return grub_cmd_cryptomount \ grub_cmd_regexp grub_cmd_date grub_cmd_set_date grub_cmd_sleep \ grub_script_expansion grub_script_not grub_script_no_commands \ partmap_test hddboot_test fddboot_test cdboot_test \ netboot_test serial_test pseries_test core_compress_test \ xzcompress_test gzcompress_test lzocompress_test grub_cmd_echo \ help_test grub_script_gettext grub_script_escape_comma \ grub_script_strcmp test_sha512sum test_unset grub_func_test \ grub_cmd_tr file_filter_test grub_cmd_test syslinux_test \ luks1_test luks2_test asn1_test tpm2_key_protector_test \ grub_script.tab.c grub_script.tab.h grub_script.yy.c \ grub_script.yy.h libgrub.pp libgrub_a_init.lst \ libgrub_a_init.c grub_fstest.pp grub_fstest_init.lst \ grub_fstest_init.c build-grub-mkfont$(BUILD_EXEEXT) \ garbage-gen$(BUILD_EXEEXT) \ build-grub-gen-asciih$(BUILD_EXEEXT) \ build-grub-gen-widthspec$(BUILD_EXEEXT) $(am__append_103) \ unicode.pf2 ascii.pf2 euro.pf2 ascii.h widthspec.h \ $(am__append_104) tests/syslinux/ubuntu10.04_grub.cfg BUILT_SOURCES = $(nodist_libgrubkern_a_SOURCES) \ $(nodist_libgrubmods_a_SOURCES) \ $(nodist_libgrubgcry_a_SOURCES) $(nodist_grub_mkimage_SOURCES) \ $(am__append_13) $(nodist_grub_mkrelpath_SOURCES) \ $(nodist_grub_script_check_SOURCES) \ $(nodist_grub_editenv_SOURCES) \ $(nodist_grub_mkpasswd_pbkdf2_SOURCES) $(am__append_24) \ $(nodist_grub_fstest_SOURCES) $(am__append_32) \ $(am__append_38) $(nodist_grub_probe_SOURCES) \ $(nodist_grub_bios_setup_SOURCES) \ $(nodist_grub_sparc64_setup_SOURCES) \ $(nodist_grub_ofpathname_SOURCES) \ $(nodist_grub_mklayout_SOURCES) \ $(nodist_grub_macbless_SOURCES) $(am__append_51) \ $(nodist_grub_mkstandalone_SOURCES) \ $(nodist_grub_install_SOURCES) $(nodist_grub_mknetdir_SOURCES) \ $(nodist_example_unit_test_SOURCES) \ $(nodist_printf_test_SOURCES) $(nodist_date_test_SOURCES) \ $(am__append_59) $(nodist_cmp_test_SOURCES) \ $(nodist_grub_menulst2cfg_SOURCES) \ $(nodist_grub_syslinux2cfg_SOURCES) \ $(nodist_grub_glue_efi_SOURCES) \ $(nodist_grub_render_label_SOURCES) \ $(nodist_grub_file_SOURCES) AM_CFLAGS = $(HOST_CFLAGS) AM_LDFLAGS = $(HOST_LDFLAGS) AM_CPPFLAGS = $(HOST_CPPFLAGS) $(CPPFLAGS_DEFAULT) AM_CCASFLAGS = $(HOST_CCASFLAGS) $(CCASFLAGS_DEFAULT) ACLOCAL_AMFLAGS = -I m4 libgrubkern_a_SOURCES = grub-core/commands/extcmd.c \ grub-core/disk/AFSplitter.c grub-core/disk/cryptodisk.c \ grub-core/disk/diskfilter.c grub-core/disk/geli.c \ grub-core/disk/key_protector.c grub-core/disk/ldm.c \ grub-core/disk/luks.c grub-core/disk/luks2.c \ grub-core/fs/archelp.c grub-core/fs/proc.c \ grub-core/kern/command.c grub-core/kern/device.c \ grub-core/kern/disk.c grub-core/kern/emu/hostdisk.c \ grub-core/kern/emu/misc.c grub-core/kern/emu/mm.c \ grub-core/kern/env.c grub-core/kern/err.c \ grub-core/kern/file.c grub-core/kern/fs.c \ grub-core/kern/list.c grub-core/kern/misc.c \ grub-core/kern/partition.c grub-core/lib/arg.c \ grub-core/lib/crypto.c grub-core/lib/disk.c \ grub-core/lib/json/json.c grub-core/lib/pbkdf2.c \ grub-core/osdep/devmapper/getroot.c \ grub-core/osdep/devmapper/hostdisk.c grub-core/osdep/exec.c \ grub-core/osdep/getroot.c grub-core/osdep/hostdisk.c \ grub-core/osdep/password.c grub-core/osdep/relpath.c \ grub-core/osdep/sleep.c grub-core/osdep/unix/getroot.c \ grub-core/osdep/unix/hostdisk.c grub-core/partmap/gpt.c \ grub-core/partmap/msdos.c util/getroot.c util/misc.c nodist_libgrubkern_a_SOURCES = libgrubkern_a_CFLAGS = $(AM_CFLAGS) $(CFLAGS_LIBRARY) $(CFLAGS_GNULIB) libgrubkern_a_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS_LIBRARY) \ $(CPPFLAGS_GNULIB) -I$(srcdir)/grub-core/lib/json libgrubkern_a_CCASFLAGS = $(AM_CCASFLAGS) $(CCASFLAGS_LIBRARY) libgrubmods_a_SOURCES = grub-core/commands/blocklist.c \ grub-core/commands/ls.c grub-core/commands/macbless.c \ grub-core/commands/testload.c grub-core/commands/xnu_uuid.c \ grub-core/disk/dmraid_nvidia.c grub-core/disk/loopback.c \ grub-core/disk/lvm.c grub-core/disk/mdraid1x_linux.c \ grub-core/disk/mdraid_linux.c grub-core/disk/mdraid_linux_be.c \ grub-core/disk/raid5_recover.c grub-core/disk/raid6_recover.c \ grub-core/font/font.c grub-core/fs/affs.c grub-core/fs/afs.c \ grub-core/fs/bfs.c grub-core/fs/btrfs.c grub-core/fs/cbfs.c \ grub-core/fs/cpio.c grub-core/fs/cpio_be.c \ grub-core/fs/erofs.c grub-core/fs/exfat.c grub-core/fs/ext2.c \ grub-core/fs/f2fs.c grub-core/fs/fat.c grub-core/fs/fshelp.c \ grub-core/fs/hfs.c grub-core/fs/hfsplus.c \ grub-core/fs/hfspluscomp.c grub-core/fs/iso9660.c \ grub-core/fs/jfs.c grub-core/fs/minix.c grub-core/fs/minix2.c \ grub-core/fs/minix2_be.c grub-core/fs/minix3.c \ grub-core/fs/minix3_be.c grub-core/fs/minix_be.c \ grub-core/fs/newc.c grub-core/fs/nilfs2.c grub-core/fs/ntfs.c \ grub-core/fs/ntfscomp.c grub-core/fs/odc.c \ grub-core/fs/reiserfs.c grub-core/fs/romfs.c \ grub-core/fs/sfs.c grub-core/fs/squash4.c grub-core/fs/tar.c \ grub-core/fs/udf.c grub-core/fs/ufs.c grub-core/fs/ufs2.c \ grub-core/fs/ufs_be.c grub-core/fs/xfs.c \ grub-core/fs/zfs/zfs.c grub-core/fs/zfs/zfs_fletcher.c \ grub-core/fs/zfs/zfs_lz4.c grub-core/fs/zfs/zfs_lzjb.c \ grub-core/fs/zfs/zfs_sha256.c grub-core/fs/zfs/zfscrypt.c \ grub-core/fs/zfs/zfsinfo.c grub-core/gfxmenu/font.c \ grub-core/io/bufio.c grub-core/io/gzio.c grub-core/io/lzopio.c \ grub-core/io/xzio.c grub-core/kern/arm/dl_helper.c \ grub-core/kern/arm64/dl_helper.c \ grub-core/kern/ia64/dl_helper.c \ grub-core/kern/loongarch64/dl_helper.c grub-core/lib/LzFind.c \ grub-core/lib/LzmaEnc.c grub-core/lib/adler32.c \ grub-core/lib/crc.c grub-core/lib/crc64.c \ grub-core/lib/datetime.c grub-core/lib/envblk.c \ grub-core/lib/hexdump.c grub-core/lib/minilzo/minilzo.c \ grub-core/lib/xzembed/xz_dec_bcj.c \ grub-core/lib/xzembed/xz_dec_lzma2.c \ grub-core/lib/xzembed/xz_dec_stream.c \ grub-core/lib/zstd/debug.c grub-core/lib/zstd/entropy_common.c \ grub-core/lib/zstd/error_private.c \ grub-core/lib/zstd/fse_decompress.c \ grub-core/lib/zstd/huf_decompress.c \ grub-core/lib/zstd/module.c grub-core/lib/zstd/xxhash.c \ grub-core/lib/zstd/zstd_common.c \ grub-core/lib/zstd/zstd_decompress.c \ grub-core/normal/charset.c grub-core/normal/misc.c \ grub-core/partmap/acorn.c grub-core/partmap/amiga.c \ grub-core/partmap/apple.c grub-core/partmap/bsdlabel.c \ grub-core/partmap/dfly.c grub-core/partmap/dvh.c \ grub-core/partmap/plan.c grub-core/partmap/sun.c \ grub-core/partmap/sunpc.c grub-core/script/argv.c \ grub-core/script/function.c grub-core/script/lexer.c \ grub-core/script/main.c grub-core/script/script.c \ grub-core/unidata.c grub-core/video/capture.c \ grub-core/video/colors.c grub-core/video/fb/fbblit.c \ grub-core/video/fb/fbfill.c grub-core/video/fb/fbutil.c \ grub-core/video/fb/video_fb.c grub-core/video/video.c nodist_libgrubmods_a_SOURCES = grub_script.tab.c grub_script.tab.h \ grub_script.yy.c grub_script.yy.h libgrub_a_init.c libgrubmods_a_CFLAGS = $(AM_CFLAGS) $(CFLAGS_LIBRARY) -fno-builtin \ -Wno-undef -Wno-unused-but-set-variable libgrubmods_a_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS_LIBRARY) \ -I$(srcdir)/grub-core/lib/minilzo \ -I$(srcdir)/grub-core/lib/xzembed \ -I$(srcdir)/grub-core/lib/zstd -DMINILZO_HAVE_CONFIG_H libgrubmods_a_CCASFLAGS = $(AM_CCASFLAGS) $(CCASFLAGS_LIBRARY) libgrubgcry_a_SOURCES = grub-core/lib/libgcrypt-grub/cipher/arcfour.c \ grub-core/lib/libgcrypt-grub/cipher/aria.c \ grub-core/lib/libgcrypt-grub/cipher/blake2.c \ grub-core/lib/libgcrypt-grub/cipher/blowfish.c \ grub-core/lib/libgcrypt-grub/cipher/camellia-glue.c \ grub-core/lib/libgcrypt-grub/cipher/camellia.c \ grub-core/lib/libgcrypt-grub/cipher/cast5.c \ grub-core/lib/libgcrypt-grub/cipher/crc.c \ grub-core/lib/libgcrypt-grub/cipher/des.c \ grub-core/lib/libgcrypt-grub/cipher/gost28147.c \ grub-core/lib/libgcrypt-grub/cipher/gostr3411-94.c \ grub-core/lib/libgcrypt-grub/cipher/hash-common.c \ grub-core/lib/libgcrypt-grub/cipher/idea.c \ grub-core/lib/libgcrypt-grub/cipher/init.c \ grub-core/lib/libgcrypt-grub/cipher/keccak.c \ grub-core/lib/libgcrypt-grub/cipher/md4.c \ grub-core/lib/libgcrypt-grub/cipher/md5.c \ grub-core/lib/libgcrypt-grub/cipher/rfc2268.c \ grub-core/lib/libgcrypt-grub/cipher/rijndael.c \ grub-core/lib/libgcrypt-grub/cipher/rmd160.c \ grub-core/lib/libgcrypt-grub/cipher/salsa20.c \ grub-core/lib/libgcrypt-grub/cipher/seed.c \ grub-core/lib/libgcrypt-grub/cipher/serpent.c \ grub-core/lib/libgcrypt-grub/cipher/sha1.c \ grub-core/lib/libgcrypt-grub/cipher/sha256.c \ grub-core/lib/libgcrypt-grub/cipher/sha512.c \ grub-core/lib/libgcrypt-grub/cipher/sm3.c \ grub-core/lib/libgcrypt-grub/cipher/sm4.c \ grub-core/lib/libgcrypt-grub/cipher/stribog.c \ grub-core/lib/libgcrypt-grub/cipher/tiger.c \ grub-core/lib/libgcrypt-grub/cipher/twofish.c \ grub-core/lib/libgcrypt-grub/cipher/whirlpool.c \ grub-core/lib/libgcrypt-grub/src/const-time.c nodist_libgrubgcry_a_SOURCES = libgrubgcry_a_CFLAGS = $(AM_CFLAGS) $(CFLAGS_LIBRARY) $(CFLAGS_GCRY) libgrubgcry_a_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS_LIBRARY) \ $(CPPFLAGS_GCRY) libgrubgcry_a_CCASFLAGS = $(AM_CCASFLAGS) $(CCASFLAGS_LIBRARY) grub_mkimage_SOURCES = grub-core/kern/emu/argp_common.c grub-core/osdep/config.c grub-core/osdep/init.c util/config.c util/grub-mkimage.c util/grub-mkimage32.c util/grub-mkimage64.c util/mkimage.c util/resolve.c nodist_grub_mkimage_SOURCES = grub_mkimage_LDADD = libgrubmods.a libgrubgcry.a libgrubkern.a grub-core/lib/gnulib/libgnu.a $(LIBLZMA) $(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM) grub_mkimage_CFLAGS = $(AM_CFLAGS) $(CFLAGS_PROGRAM) grub_mkimage_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_PROGRAM) grub_mkimage_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS_PROGRAM) grub_mkimage_CCASFLAGS = $(AM_CCASFLAGS) $(CCASFLAGS_PROGRAM) @COND_GRUB_PROTECT_TRUE@grub_protect_SOURCES = grub-core/commands/tpm2_key_protector/args.c grub-core/commands/tpm2_key_protector/tpm2key_asn1_tab.c grub-core/kern/emu/argp_common.c grub-core/lib/tss2/buffer.c grub-core/lib/tss2/tpm2_cmd.c grub-core/lib/tss2/tss2_mu.c grub-core/osdep/init.c util/grub-protect.c util/probe.c @COND_GRUB_PROTECT_TRUE@nodist_grub_protect_SOURCES = @COND_GRUB_PROTECT_TRUE@grub_protect_LDADD = libgrubmods.a libgrubgcry.a libgrubkern.a grub-core/lib/gnulib/libgnu.a $(LIBTASN1) $(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM) @COND_GRUB_PROTECT_TRUE@grub_protect_CFLAGS = $(AM_CFLAGS) $(CFLAGS_PROGRAM) -I$(srcdir)/grub-core/lib/tss2 -I$(srcdir)/grub-core/commands/tpm2_key_protector @COND_GRUB_PROTECT_TRUE@grub_protect_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_PROGRAM) @COND_GRUB_PROTECT_TRUE@grub_protect_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS_PROGRAM) @COND_GRUB_PROTECT_TRUE@grub_protect_CCASFLAGS = $(AM_CCASFLAGS) $(CCASFLAGS_PROGRAM) grub_mkrelpath_SOURCES = grub-core/kern/emu/argp_common.c grub-core/osdep/init.c util/grub-mkrelpath.c nodist_grub_mkrelpath_SOURCES = grub_mkrelpath_LDADD = libgrubmods.a libgrubgcry.a libgrubkern.a grub-core/lib/gnulib/libgnu.a $(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM) grub_mkrelpath_CFLAGS = $(AM_CFLAGS) $(CFLAGS_PROGRAM) grub_mkrelpath_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_PROGRAM) grub_mkrelpath_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS_PROGRAM) grub_mkrelpath_CCASFLAGS = $(AM_CCASFLAGS) $(CCASFLAGS_PROGRAM) grub_script_check_SOURCES = grub-core/kern/emu/argp_common.c grub-core/osdep/init.c util/grub-script-check.c nodist_grub_script_check_SOURCES = grub_script_check_LDADD = libgrubmods.a libgrubgcry.a libgrubkern.a grub-core/lib/gnulib/libgnu.a $(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM) grub_script_check_CFLAGS = $(AM_CFLAGS) $(CFLAGS_PROGRAM) grub_script_check_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_PROGRAM) grub_script_check_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS_PROGRAM) grub_script_check_CCASFLAGS = $(AM_CCASFLAGS) $(CCASFLAGS_PROGRAM) grub_editenv_SOURCES = grub-core/osdep/compress.c grub-core/osdep/config.c grub-core/osdep/init.c util/config.c util/editenv.c util/grub-editenv.c util/grub-install-common.c util/grub-mkimage32.c util/grub-mkimage64.c util/mkimage.c util/resolve.c nodist_grub_editenv_SOURCES = grub_editenv_LDADD = $(LIBLZMA) libgrubmods.a libgrubgcry.a libgrubkern.a grub-core/lib/gnulib/libgnu.a $(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM) grub_editenv_CFLAGS = $(AM_CFLAGS) $(CFLAGS_PROGRAM) grub_editenv_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_PROGRAM) grub_editenv_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS_PROGRAM) grub_editenv_CCASFLAGS = $(AM_CCASFLAGS) $(CCASFLAGS_PROGRAM) grub_mkpasswd_pbkdf2_SOURCES = grub-core/kern/emu/argp_common.c grub-core/osdep/init.c grub-core/osdep/random.c util/grub-mkpasswd-pbkdf2.c nodist_grub_mkpasswd_pbkdf2_SOURCES = grub_mkpasswd_pbkdf2_LDADD = libgrubmods.a libgrubgcry.a libgrubkern.a grub-core/lib/gnulib/libgnu.a $(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM) grub_mkpasswd_pbkdf2_CFLAGS = $(AM_CFLAGS) $(CFLAGS_PROGRAM) grub_mkpasswd_pbkdf2_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_PROGRAM) grub_mkpasswd_pbkdf2_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS_PROGRAM) grub_mkpasswd_pbkdf2_CCASFLAGS = $(AM_CCASFLAGS) $(CCASFLAGS_PROGRAM) @COND_APPLE_LINKER_TRUE@grub_macho2img_SOURCES = util/grub-macho2img.c @COND_APPLE_LINKER_TRUE@nodist_grub_macho2img_SOURCES = @COND_APPLE_LINKER_TRUE@grub_macho2img_LDADD = @COND_APPLE_LINKER_TRUE@grub_macho2img_CFLAGS = $(AM_CFLAGS) $(CFLAGS_PROGRAM) @COND_APPLE_LINKER_TRUE@grub_macho2img_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_PROGRAM) @COND_APPLE_LINKER_TRUE@grub_macho2img_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS_PROGRAM) @COND_APPLE_LINKER_TRUE@grub_macho2img_CCASFLAGS = $(AM_CCASFLAGS) $(CCASFLAGS_PROGRAM) grub_fstest_SOURCES = grub-core/disk/host.c grub-core/kern/emu/hostfs.c grub-core/osdep/init.c util/grub-fstest.c nodist_grub_fstest_SOURCES = grub_fstest_init.c grub_fstest_LDADD = libgrubmods.a libgrubgcry.a libgrubkern.a grub-core/lib/gnulib/libgnu.a $(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM) grub_fstest_CFLAGS = $(AM_CFLAGS) $(CFLAGS_PROGRAM) grub_fstest_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_PROGRAM) grub_fstest_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS_PROGRAM) grub_fstest_CCASFLAGS = $(AM_CCASFLAGS) $(CCASFLAGS_PROGRAM) @COND_GRUB_MOUNT_TRUE@grub_mount_SOURCES = grub-core/disk/host.c grub-core/kern/emu/hostfs.c grub-core/osdep/init.c util/grub-mount.c @COND_GRUB_MOUNT_TRUE@nodist_grub_mount_SOURCES = grub_fstest_init.c @COND_GRUB_MOUNT_TRUE@grub_mount_LDADD = libgrubmods.a libgrubgcry.a libgrubkern.a grub-core/lib/gnulib/libgnu.a $(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM) $(FUSE_LIBS) @COND_GRUB_MOUNT_TRUE@grub_mount_CFLAGS = $(AM_CFLAGS) $(CFLAGS_PROGRAM) $(FUSE_CFLAGS) @COND_GRUB_MOUNT_TRUE@grub_mount_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_PROGRAM) @COND_GRUB_MOUNT_TRUE@grub_mount_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS_PROGRAM) @COND_GRUB_MOUNT_TRUE@grub_mount_CCASFLAGS = $(AM_CCASFLAGS) $(CCASFLAGS_PROGRAM) @COND_GRUB_MKFONT_TRUE@grub_mkfont_SOURCES = grub-core/kern/emu/argp_common.c grub-core/osdep/init.c util/grub-mkfont.c @COND_GRUB_MKFONT_TRUE@nodist_grub_mkfont_SOURCES = @COND_GRUB_MKFONT_TRUE@grub_mkfont_LDADD = libgrubmods.a libgrubgcry.a libgrubkern.a grub-core/lib/gnulib/libgnu.a $(FREETYPE_LIBS) $(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM) @COND_GRUB_MKFONT_TRUE@grub_mkfont_CFLAGS = $(AM_CFLAGS) $(CFLAGS_PROGRAM) $(FREETYPE_CFLAGS) @COND_GRUB_MKFONT_TRUE@grub_mkfont_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_PROGRAM) @COND_GRUB_MKFONT_TRUE@grub_mkfont_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS_PROGRAM) -DGRUB_MKFONT=1 @COND_GRUB_MKFONT_TRUE@grub_mkfont_CCASFLAGS = $(AM_CCASFLAGS) $(CCASFLAGS_PROGRAM) grub_probe_SOURCES = grub-core/kern/emu/argp_common.c grub-core/osdep/init.c grub-core/osdep/ofpath.c util/grub-probe.c util/probe.c nodist_grub_probe_SOURCES = grub_probe_LDADD = libgrubmods.a libgrubgcry.a libgrubkern.a grub-core/lib/gnulib/libgnu.a $(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM) grub_probe_CFLAGS = $(AM_CFLAGS) $(CFLAGS_PROGRAM) grub_probe_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_PROGRAM) grub_probe_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS_PROGRAM) grub_probe_CCASFLAGS = $(AM_CCASFLAGS) $(CCASFLAGS_PROGRAM) grub_bios_setup_SOURCES = grub-core/kern/emu/argp_common.c grub-core/lib/reed_solomon.c grub-core/osdep/blocklist.c grub-core/osdep/init.c util/grub-setup.c util/setup_bios.c nodist_grub_bios_setup_SOURCES = grub_bios_setup_LDADD = libgrubmods.a libgrubkern.a libgrubgcry.a grub-core/lib/gnulib/libgnu.a $(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM) grub_bios_setup_CFLAGS = $(AM_CFLAGS) $(CFLAGS_PROGRAM) grub_bios_setup_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_PROGRAM) grub_bios_setup_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS_PROGRAM) -DGRUB_SETUP_FUNC=grub_util_bios_setup grub_bios_setup_CCASFLAGS = $(AM_CCASFLAGS) $(CCASFLAGS_PROGRAM) grub_sparc64_setup_SOURCES = grub-core/kern/emu/argp_common.c grub-core/lib/reed_solomon.c grub-core/osdep/blocklist.c grub-core/osdep/init.c grub-core/osdep/ofpath.c util/grub-setup.c util/setup_sparc.c nodist_grub_sparc64_setup_SOURCES = grub_sparc64_setup_LDADD = libgrubmods.a libgrubkern.a libgrubgcry.a grub-core/lib/gnulib/libgnu.a $(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM) grub_sparc64_setup_CFLAGS = $(AM_CFLAGS) $(CFLAGS_PROGRAM) grub_sparc64_setup_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_PROGRAM) grub_sparc64_setup_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS_PROGRAM) -DGRUB_SETUP_FUNC=grub_util_sparc_setup grub_sparc64_setup_CCASFLAGS = $(AM_CCASFLAGS) $(CCASFLAGS_PROGRAM) grub_ofpathname_SOURCES = grub-core/osdep/init.c grub-core/osdep/ofpath.c util/ieee1275/grub-ofpathname.c nodist_grub_ofpathname_SOURCES = grub_ofpathname_LDADD = libgrubmods.a libgrubgcry.a libgrubkern.a grub-core/lib/gnulib/libgnu.a $(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM) grub_ofpathname_CFLAGS = $(AM_CFLAGS) $(CFLAGS_PROGRAM) grub_ofpathname_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_PROGRAM) grub_ofpathname_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS_PROGRAM) grub_ofpathname_CCASFLAGS = $(AM_CCASFLAGS) $(CCASFLAGS_PROGRAM) grub_mklayout_SOURCES = grub-core/kern/emu/argp_common.c grub-core/osdep/init.c util/grub-mklayout.c nodist_grub_mklayout_SOURCES = grub_mklayout_LDADD = libgrubmods.a libgrubgcry.a libgrubkern.a grub-core/lib/gnulib/libgnu.a $(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM) grub_mklayout_CFLAGS = $(AM_CFLAGS) $(CFLAGS_PROGRAM) grub_mklayout_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_PROGRAM) grub_mklayout_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS_PROGRAM) grub_mklayout_CCASFLAGS = $(AM_CCASFLAGS) $(CCASFLAGS_PROGRAM) grub_macbless_SOURCES = grub-core/kern/emu/argp_common.c grub-core/osdep/init.c util/grub-macbless.c nodist_grub_macbless_SOURCES = grub_macbless_LDADD = libgrubmods.a libgrubgcry.a libgrubkern.a grub-core/lib/gnulib/libgnu.a $(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM) grub_macbless_CFLAGS = $(AM_CFLAGS) $(CFLAGS_PROGRAM) grub_macbless_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_PROGRAM) grub_macbless_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS_PROGRAM) grub_macbless_CCASFLAGS = $(AM_CCASFLAGS) $(CCASFLAGS_PROGRAM) @COND_HAVE_EXEC_TRUE@grub_mkrescue_SOURCES = grub-core/disk/host.c grub-core/kern/emu/argp_common.c grub-core/kern/emu/hostfs.c grub-core/lib/reed_solomon.c grub-core/osdep/blocklist.c grub-core/osdep/compress.c grub-core/osdep/config.c grub-core/osdep/init.c grub-core/osdep/ofpath.c grub-core/osdep/platform.c grub-core/osdep/platform_unix.c grub-core/osdep/random.c util/config.c util/editenv.c util/glue-efi.c util/grub-install-common.c util/grub-mkimage32.c util/grub-mkimage64.c util/grub-mkrescue.c util/mkimage.c util/render-label.c util/resolve.c util/setup_bios.c util/setup_sparc.c @COND_HAVE_EXEC_TRUE@nodist_grub_mkrescue_SOURCES = @COND_HAVE_EXEC_TRUE@grub_mkrescue_LDADD = $(LIBLZMA) libgrubmods.a libgrubgcry.a libgrubkern.a grub-core/lib/gnulib/libgnu.a $(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM) @COND_HAVE_EXEC_TRUE@grub_mkrescue_CFLAGS = $(AM_CFLAGS) $(CFLAGS_PROGRAM) @COND_HAVE_EXEC_TRUE@grub_mkrescue_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_PROGRAM) @COND_HAVE_EXEC_TRUE@grub_mkrescue_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS_PROGRAM) @COND_HAVE_EXEC_TRUE@grub_mkrescue_CCASFLAGS = $(AM_CCASFLAGS) $(CCASFLAGS_PROGRAM) grub_mkstandalone_SOURCES = grub-core/disk/host.c grub-core/kern/emu/argp_common.c grub-core/kern/emu/hostfs.c grub-core/lib/reed_solomon.c grub-core/osdep/blocklist.c grub-core/osdep/compress.c grub-core/osdep/config.c grub-core/osdep/init.c grub-core/osdep/ofpath.c grub-core/osdep/platform.c grub-core/osdep/platform_unix.c grub-core/osdep/random.c util/config.c util/editenv.c util/glue-efi.c util/grub-install-common.c util/grub-mkimage32.c util/grub-mkimage64.c util/grub-mkstandalone.c util/mkimage.c util/render-label.c util/resolve.c util/setup_bios.c util/setup_sparc.c nodist_grub_mkstandalone_SOURCES = grub_mkstandalone_LDADD = $(LIBLZMA) libgrubmods.a libgrubgcry.a libgrubkern.a grub-core/lib/gnulib/libgnu.a $(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM) grub_mkstandalone_CFLAGS = $(AM_CFLAGS) $(CFLAGS_PROGRAM) grub_mkstandalone_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_PROGRAM) grub_mkstandalone_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS_PROGRAM) grub_mkstandalone_CCASFLAGS = $(AM_CCASFLAGS) $(CCASFLAGS_PROGRAM) grub_install_SOURCES = grub-core/disk/host.c grub-core/kern/emu/argp_common.c grub-core/kern/emu/hostfs.c grub-core/lib/reed_solomon.c grub-core/osdep/blocklist.c grub-core/osdep/compress.c grub-core/osdep/config.c grub-core/osdep/init.c grub-core/osdep/ofpath.c grub-core/osdep/platform.c grub-core/osdep/platform_unix.c grub-core/osdep/random.c util/config.c util/editenv.c util/grub-install-common.c util/grub-install.c util/grub-mkimage32.c util/grub-mkimage64.c util/mkimage.c util/probe.c util/render-label.c util/resolve.c util/setup_bios.c util/setup_sparc.c nodist_grub_install_SOURCES = grub_install_LDADD = $(LIBLZMA) libgrubmods.a libgrubgcry.a libgrubkern.a grub-core/lib/gnulib/libgnu.a $(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM) grub_install_CFLAGS = $(AM_CFLAGS) $(CFLAGS_PROGRAM) grub_install_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_PROGRAM) grub_install_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS_PROGRAM) grub_install_CCASFLAGS = $(AM_CCASFLAGS) $(CCASFLAGS_PROGRAM) grub_mknetdir_SOURCES = grub-core/kern/emu/argp_common.c grub-core/lib/reed_solomon.c grub-core/osdep/blocklist.c grub-core/osdep/compress.c grub-core/osdep/config.c grub-core/osdep/init.c grub-core/osdep/ofpath.c grub-core/osdep/platform.c grub-core/osdep/platform_unix.c grub-core/osdep/random.c util/config.c util/editenv.c util/grub-install-common.c util/grub-mkimage32.c util/grub-mkimage64.c util/grub-mknetdir.c util/mkimage.c util/resolve.c util/setup_bios.c util/setup_sparc.c nodist_grub_mknetdir_SOURCES = grub_mknetdir_LDADD = $(LIBLZMA) libgrubmods.a libgrubgcry.a libgrubkern.a grub-core/lib/gnulib/libgnu.a $(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM) grub_mknetdir_CFLAGS = $(AM_CFLAGS) $(CFLAGS_PROGRAM) grub_mknetdir_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_PROGRAM) grub_mknetdir_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS_PROGRAM) grub_mknetdir_CCASFLAGS = $(AM_CCASFLAGS) $(CCASFLAGS_PROGRAM) example_unit_test_SOURCES = grub-core/kern/list.c grub-core/kern/misc.c grub-core/tests/lib/test.c tests/example_unit_test.c tests/lib/unit_test.c nodist_example_unit_test_SOURCES = example_unit_test_LDADD = libgrubmods.a libgrubgcry.a libgrubkern.a grub-core/lib/gnulib/libgnu.a $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM) example_unit_test_CFLAGS = $(AM_CFLAGS) $(CFLAGS_PROGRAM) example_unit_test_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_PROGRAM) example_unit_test_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS_PROGRAM) example_unit_test_CCASFLAGS = $(AM_CCASFLAGS) $(CCASFLAGS_PROGRAM) printf_test_SOURCES = grub-core/kern/list.c grub-core/kern/misc.c grub-core/tests/lib/test.c tests/lib/unit_test.c tests/printf_unit_test.c nodist_printf_test_SOURCES = printf_test_LDADD = libgrubmods.a libgrubgcry.a libgrubkern.a grub-core/lib/gnulib/libgnu.a $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM) printf_test_CFLAGS = $(AM_CFLAGS) $(CFLAGS_PROGRAM) printf_test_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_PROGRAM) printf_test_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS_PROGRAM) printf_test_CCASFLAGS = $(AM_CCASFLAGS) $(CCASFLAGS_PROGRAM) date_test_SOURCES = grub-core/kern/list.c grub-core/kern/misc.c grub-core/tests/lib/test.c tests/date_unit_test.c tests/lib/unit_test.c nodist_date_test_SOURCES = date_test_LDADD = libgrubmods.a libgrubgcry.a libgrubkern.a grub-core/lib/gnulib/libgnu.a $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM) date_test_CFLAGS = $(AM_CFLAGS) $(CFLAGS_PROGRAM) date_test_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_PROGRAM) date_test_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS_PROGRAM) date_test_CCASFLAGS = $(AM_CCASFLAGS) $(CCASFLAGS_PROGRAM) @COND_HAVE_CXX_TRUE@priority_queue_unit_test_SOURCES = grub-core/kern/list.c grub-core/kern/misc.c grub-core/lib/priority_queue.c grub-core/tests/lib/test.c tests/lib/unit_test.c tests/priority_queue_unit_test.cc @COND_HAVE_CXX_TRUE@nodist_priority_queue_unit_test_SOURCES = @COND_HAVE_CXX_TRUE@priority_queue_unit_test_LDADD = libgrubmods.a libgrubgcry.a libgrubkern.a grub-core/lib/gnulib/libgnu.a $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM) @COND_HAVE_CXX_TRUE@priority_queue_unit_test_CFLAGS = $(AM_CFLAGS) $(CFLAGS_PROGRAM) @COND_HAVE_CXX_TRUE@priority_queue_unit_test_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_PROGRAM) @COND_HAVE_CXX_TRUE@priority_queue_unit_test_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS_PROGRAM) @COND_HAVE_CXX_TRUE@priority_queue_unit_test_CCASFLAGS = $(AM_CCASFLAGS) $(CCASFLAGS_PROGRAM) cmp_test_SOURCES = grub-core/kern/list.c grub-core/kern/misc.c grub-core/tests/lib/test.c tests/cmp_unit_test.c tests/lib/unit_test.c nodist_cmp_test_SOURCES = cmp_test_LDADD = libgrubmods.a libgrubgcry.a libgrubkern.a grub-core/lib/gnulib/libgnu.a $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM) cmp_test_CFLAGS = $(AM_CFLAGS) $(CFLAGS_PROGRAM) cmp_test_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_PROGRAM) cmp_test_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS_PROGRAM) cmp_test_CCASFLAGS = $(AM_CCASFLAGS) $(CCASFLAGS_PROGRAM) grub_menulst2cfg_SOURCES = grub-core/lib/i386/pc/vesa_modes_table.c grub-core/lib/legacy_parse.c grub-core/osdep/init.c util/grub-menulst2cfg.c nodist_grub_menulst2cfg_SOURCES = grub_menulst2cfg_LDADD = libgrubmods.a libgrubgcry.a libgrubkern.a grub-core/lib/gnulib/libgnu.a $(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM) grub_menulst2cfg_CFLAGS = $(AM_CFLAGS) $(CFLAGS_PROGRAM) grub_menulst2cfg_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_PROGRAM) grub_menulst2cfg_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS_PROGRAM) grub_menulst2cfg_CCASFLAGS = $(AM_CCASFLAGS) $(CCASFLAGS_PROGRAM) grub_syslinux2cfg_SOURCES = grub-core/disk/host.c grub-core/kern/emu/argp_common.c grub-core/kern/emu/hostfs.c grub-core/lib/getline.c grub-core/lib/syslinux_parse.c grub-core/osdep/init.c util/grub-syslinux2cfg.c nodist_grub_syslinux2cfg_SOURCES = grub_syslinux2cfg_LDADD = libgrubmods.a libgrubgcry.a libgrubkern.a grub-core/lib/gnulib/libgnu.a $(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM) grub_syslinux2cfg_CFLAGS = $(AM_CFLAGS) $(CFLAGS_PROGRAM) grub_syslinux2cfg_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_PROGRAM) grub_syslinux2cfg_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS_PROGRAM) grub_syslinux2cfg_CCASFLAGS = $(AM_CCASFLAGS) $(CCASFLAGS_PROGRAM) grub_glue_efi_SOURCES = grub-core/kern/emu/argp_common.c grub-core/osdep/init.c util/glue-efi.c util/grub-glue-efi.c nodist_grub_glue_efi_SOURCES = grub_glue_efi_LDADD = libgrubmods.a libgrubgcry.a libgrubkern.a grub-core/lib/gnulib/libgnu.a $(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM) grub_glue_efi_CFLAGS = $(AM_CFLAGS) $(CFLAGS_PROGRAM) grub_glue_efi_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_PROGRAM) grub_glue_efi_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS_PROGRAM) grub_glue_efi_CCASFLAGS = $(AM_CCASFLAGS) $(CCASFLAGS_PROGRAM) grub_render_label_SOURCES = grub-core/disk/host.c grub-core/kern/emu/argp_common.c grub-core/kern/emu/hostfs.c grub-core/osdep/init.c util/grub-render-label.c util/render-label.c nodist_grub_render_label_SOURCES = grub_render_label_LDADD = libgrubmods.a libgrubgcry.a libgrubkern.a grub-core/lib/gnulib/libgnu.a $(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM) grub_render_label_CFLAGS = $(AM_CFLAGS) $(CFLAGS_PROGRAM) grub_render_label_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_PROGRAM) grub_render_label_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS_PROGRAM) grub_render_label_CCASFLAGS = $(AM_CCASFLAGS) $(CCASFLAGS_PROGRAM) grub_file_SOURCES = grub-core/commands/file.c grub-core/commands/file32.c grub-core/commands/file64.c grub-core/disk/host.c grub-core/io/offset.c grub-core/kern/elf.c grub-core/kern/emu/hostfs.c grub-core/loader/i386/xen_file.c grub-core/loader/i386/xen_file32.c grub-core/loader/i386/xen_file64.c grub-core/loader/lzss.c grub-core/loader/macho.c grub-core/loader/macho32.c grub-core/loader/macho64.c grub-core/osdep/init.c util/grub-file.c util/render-label.c nodist_grub_file_SOURCES = grub_file_LDADD = libgrubmods.a libgrubgcry.a libgrubkern.a grub-core/lib/gnulib/libgnu.a $(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM) grub_file_CFLAGS = $(AM_CFLAGS) $(CFLAGS_PROGRAM) grub_file_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_PROGRAM) grub_file_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS_PROGRAM) grub_file_CCASFLAGS = $(AM_CCASFLAGS) $(CCASFLAGS_PROGRAM) check_SCRIPTS = $(check_SCRIPTS_native) $(check_SCRIPTS_nonnative) TESTS = $(check_SCRIPTS) $(check_PROGRAMS) starfield_theme_files = $(srcdir)/themes/starfield/blob_w.png \ $(srcdir)/themes/starfield/boot_menu_c.png \ $(srcdir)/themes/starfield/boot_menu_e.png \ $(srcdir)/themes/starfield/boot_menu_ne.png \ $(srcdir)/themes/starfield/boot_menu_n.png \ $(srcdir)/themes/starfield/boot_menu_nw.png \ $(srcdir)/themes/starfield/boot_menu_se.png \ $(srcdir)/themes/starfield/boot_menu_s.png \ $(srcdir)/themes/starfield/boot_menu_sw.png \ $(srcdir)/themes/starfield/boot_menu_w.png \ $(srcdir)/themes/starfield/slider_c.png \ $(srcdir)/themes/starfield/slider_n.png \ $(srcdir)/themes/starfield/slider_s.png \ $(srcdir)/themes/starfield/starfield.png \ $(srcdir)/themes/starfield/terminal_box_c.png \ $(srcdir)/themes/starfield/terminal_box_e.png \ $(srcdir)/themes/starfield/terminal_box_ne.png \ $(srcdir)/themes/starfield/terminal_box_n.png \ $(srcdir)/themes/starfield/terminal_box_nw.png \ $(srcdir)/themes/starfield/terminal_box_se.png \ $(srcdir)/themes/starfield/terminal_box_s.png \ $(srcdir)/themes/starfield/terminal_box_sw.png \ $(srcdir)/themes/starfield/terminal_box_w.png \ $(srcdir)/themes/starfield/theme.txt \ $(srcdir)/themes/starfield/README \ $(srcdir)/themes/starfield/COPYING.CC-BY-SA-3.0 @COND_STARFIELD_FALSE@starfield_DATA = @COND_STARFIELD_TRUE@starfield_DATA = dejavu_10.pf2 dejavu_12.pf2 dejavu_bold_14.pf2 dejavu_14.pf2 dejavu_16.pf2 $(starfield_theme_files) # Arrows and lines are needed to draw the menu, so always include them UNICODE_ARROWS = 0x2190-0x2193 UNICODE_LINES = 0x2501-0x251B # Install config.h into platformdir nodist_platform_HEADERS = config.h @COND_i386_coreboot_TRUE@@COND_real_platform_TRUE@QEMU32 = qemu-system-i386 @COND_i386_efi_TRUE@@COND_real_platform_TRUE@QEMU32 = qemu-system-i386 @COND_i386_ieee1275_TRUE@@COND_real_platform_TRUE@QEMU32 = qemu-system-i386 @COND_i386_multiboot_TRUE@@COND_real_platform_TRUE@QEMU32 = qemu-system-i386 @COND_i386_pc_TRUE@@COND_real_platform_TRUE@QEMU32 = qemu-system-i386 @COND_i386_qemu_TRUE@@COND_real_platform_TRUE@QEMU32 = qemu-system-i386 @COND_real_platform_TRUE@@COND_x86_64_efi_TRUE@QEMU32 = qemu-system-x86_64 @COND_i386_coreboot_TRUE@@COND_real_platform_TRUE@MINIMUM_CPU_LINUX = pentium2 @COND_i386_efi_TRUE@@COND_real_platform_TRUE@MINIMUM_CPU_LINUX = pentium2 @COND_i386_ieee1275_TRUE@@COND_real_platform_TRUE@MINIMUM_CPU_LINUX = pentium2 @COND_i386_multiboot_TRUE@@COND_real_platform_TRUE@MINIMUM_CPU_LINUX = pentium2 @COND_i386_pc_TRUE@@COND_real_platform_TRUE@MINIMUM_CPU_LINUX = pentium2 @COND_i386_qemu_TRUE@@COND_real_platform_TRUE@MINIMUM_CPU_LINUX = pentium2 @COND_real_platform_TRUE@@COND_x86_64_efi_TRUE@MINIMUM_CPU_LINUX = core2duo @COND_i386_coreboot_TRUE@@COND_real_platform_TRUE@BOOTCHECKS = bootcheck-kfreebsd-aout bootcheck-kopenbsd-i386 bootcheck-kopenbsd-x86_64 bootcheck-multiboot bootcheck-multiboot2 bootcheck-linux-i386 bootcheck-linux-x86_64 bootcheck-knetbsd-x86_64 bootcheck-kfreebsd-x86_64 bootcheck-kfreebsd-i386 # NetBSD has no support for finding ACPI on EFI @COND_i386_efi_TRUE@@COND_real_platform_TRUE@BOOTCHECKS = bootcheck-kfreebsd-aout bootcheck-kopenbsd-i386 bootcheck-kopenbsd-x86_64 bootcheck-multiboot bootcheck-multiboot2 bootcheck-linux-i386 bootcheck-linux-x86_64 bootcheck-kfreebsd-x86_64 bootcheck-kfreebsd-i386 # *BSD requires ACPI #legacy protocol (linux16) makes early BIOS calls. @COND_i386_ieee1275_TRUE@@COND_real_platform_TRUE@BOOTCHECKS = bootcheck-kfreebsd-aout bootcheck-multiboot bootcheck-multiboot2 bootcheck-linux-i386 bootcheck-linux-x86_64 # *BSD requires ACPI @COND_i386_multiboot_TRUE@@COND_real_platform_TRUE@BOOTCHECKS = bootcheck-kfreebsd-aout bootcheck-multiboot bootcheck-multiboot2 bootcheck-linux-i386 bootcheck-linux-x86_64 #pc chainloader by definition is only for i386-pc #ntldr and bootmgr require BIOS. #legacy protocol (linux16) makes early BIOS calls. # 32-bit NetBSD crashes early on non-BIOS @COND_i386_pc_TRUE@@COND_real_platform_TRUE@BOOTCHECKS = bootcheck-kfreebsd-aout bootcheck-kopenbsd-i386 bootcheck-kopenbsd-x86_64 bootcheck-multiboot bootcheck-multiboot2 bootcheck-linux-i386 bootcheck-linux-x86_64 bootcheck-knetbsd-x86_64 bootcheck-kfreebsd-x86_64 bootcheck-kfreebsd-i386 bootcheck-pc-chainloader bootcheck-ntldr bootcheck-linux16-i386 bootcheck-linux16-x86_64 bootcheck-knetbsd-i386 # *BSD requires ACPI @COND_i386_qemu_TRUE@@COND_real_platform_TRUE@BOOTCHECKS = bootcheck-kfreebsd-aout bootcheck-multiboot bootcheck-multiboot2 bootcheck-linux-i386 bootcheck-linux-x86_64 @COND_mips_loongson_TRUE@@COND_real_platform_TRUE@BOOTCHECKS = bootcheck-linux-loongson @COND_mips_qemu_mips_TRUE@@COND_mipseb_TRUE@@COND_real_platform_TRUE@BOOTCHECKS = bootcheck-linux-mips @COND_mips_qemu_mips_TRUE@@COND_mipsel_TRUE@@COND_real_platform_TRUE@BOOTCHECKS = bootcheck-linux-mipsel @COND_powerpc_ieee1275_TRUE@@COND_real_platform_TRUE@BOOTCHECKS = bootcheck-linux-ppc # NetBSD has no support for finding ACPI on EFI @COND_real_platform_TRUE@@COND_x86_64_efi_TRUE@BOOTCHECKS = bootcheck-kfreebsd-aout bootcheck-kopenbsd-i386 bootcheck-kopenbsd-x86_64 bootcheck-multiboot bootcheck-multiboot2 bootcheck-linux-i386 bootcheck-linux-x86_64 bootcheck-kfreebsd-x86_64 bootcheck-kfreebsd-i386 # Randomly generated @COND_real_platform_TRUE@SUCCESSFUL_BOOT_STRING = 3e49994fd5d82b7c9298d672d774080d # tianocore cd access is very slow @COND_real_platform_TRUE@BOOTCHECK_TIMEOUT = 180 windowsdir = $(top_builddir)/$(PACKAGE)-$(VERSION)-for-windows windowszip = $(top_builddir)/$(PACKAGE)-$(VERSION)-for-windows.zip changelog_start_date = 2015-01-23 gitlog_to_changelog = $(top_srcdir)/build-aux/gitlog-to-changelog all: $(BUILT_SOURCES) config-util.h $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: .SUFFIXES: .c .cc .log .o .obj .test .test$(EXEEXT) .trs am--refresh: Makefile @: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(top_srcdir)/conf/Makefile.common $(top_srcdir)/conf/Makefile.extra-dist $(srcdir)/Makefile.util.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles);; \ esac; $(top_srcdir)/conf/Makefile.common $(top_srcdir)/conf/Makefile.extra-dist $(srcdir)/Makefile.util.am $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): config-util.h: stamp-h1 @test -f $@ || rm -f stamp-h1 @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1 stamp-h1: $(srcdir)/config-util.h.in $(top_builddir)/config.status @rm -f stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status config-util.h $(srcdir)/config-util.h.in: $(am__configure_deps) ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) rm -f stamp-h1 touch $@ distclean-hdr: -rm -f config-util.h stamp-h1 stamp-h: $(top_builddir)/config.status $(srcdir)/stamp-h.in cd $(top_builddir) && $(SHELL) ./config.status $@ config.h: $(top_builddir)/config.status $(srcdir)/config.h.in cd $(top_builddir) && $(SHELL) ./config.status $@ install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) clean-checkPROGRAMS: -test -z "$(check_PROGRAMS)" || rm -f $(check_PROGRAMS) clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) install-platformPROGRAMS: $(platform_PROGRAMS) @$(NORMAL_INSTALL) @list='$(platform_PROGRAMS)'; test -n "$(platformdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(platformdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(platformdir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(platformdir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(platformdir)$$dir" || exit $$?; \ } \ ; done uninstall-platformPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(platform_PROGRAMS)'; test -n "$(platformdir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(platformdir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(platformdir)" && rm -f $$files clean-platformPROGRAMS: -test -z "$(platform_PROGRAMS)" || rm -f $(platform_PROGRAMS) install-sbinPROGRAMS: $(sbin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(sbin_PROGRAMS)'; test -n "$(sbindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(sbindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(sbindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(sbindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(sbindir)$$dir" || exit $$?; \ } \ ; done uninstall-sbinPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(sbin_PROGRAMS)'; test -n "$(sbindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(sbindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(sbindir)" && rm -f $$files clean-sbinPROGRAMS: -test -z "$(sbin_PROGRAMS)" || rm -f $(sbin_PROGRAMS) clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) grub-core/lib/libgcrypt-grub/cipher/$(am__dirstamp): @$(MKDIR_P) grub-core/lib/libgcrypt-grub/cipher @: > grub-core/lib/libgcrypt-grub/cipher/$(am__dirstamp) grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR) @: > grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/$(am__dirstamp) grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-arcfour.$(OBJEXT): \ grub-core/lib/libgcrypt-grub/cipher/$(am__dirstamp) \ grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/$(am__dirstamp) grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-aria.$(OBJEXT): \ grub-core/lib/libgcrypt-grub/cipher/$(am__dirstamp) \ grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/$(am__dirstamp) grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-blake2.$(OBJEXT): \ grub-core/lib/libgcrypt-grub/cipher/$(am__dirstamp) \ grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/$(am__dirstamp) grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-blowfish.$(OBJEXT): \ grub-core/lib/libgcrypt-grub/cipher/$(am__dirstamp) \ grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/$(am__dirstamp) grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-camellia-glue.$(OBJEXT): \ grub-core/lib/libgcrypt-grub/cipher/$(am__dirstamp) \ grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/$(am__dirstamp) grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-camellia.$(OBJEXT): \ grub-core/lib/libgcrypt-grub/cipher/$(am__dirstamp) \ grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/$(am__dirstamp) grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-cast5.$(OBJEXT): \ grub-core/lib/libgcrypt-grub/cipher/$(am__dirstamp) \ grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/$(am__dirstamp) grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-crc.$(OBJEXT): \ grub-core/lib/libgcrypt-grub/cipher/$(am__dirstamp) \ grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/$(am__dirstamp) grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-des.$(OBJEXT): \ grub-core/lib/libgcrypt-grub/cipher/$(am__dirstamp) \ grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/$(am__dirstamp) grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-gost28147.$(OBJEXT): \ grub-core/lib/libgcrypt-grub/cipher/$(am__dirstamp) \ grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/$(am__dirstamp) grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-gostr3411-94.$(OBJEXT): \ grub-core/lib/libgcrypt-grub/cipher/$(am__dirstamp) \ grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/$(am__dirstamp) grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-hash-common.$(OBJEXT): \ grub-core/lib/libgcrypt-grub/cipher/$(am__dirstamp) \ grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/$(am__dirstamp) grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-idea.$(OBJEXT): \ grub-core/lib/libgcrypt-grub/cipher/$(am__dirstamp) \ grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/$(am__dirstamp) grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-init.$(OBJEXT): \ grub-core/lib/libgcrypt-grub/cipher/$(am__dirstamp) \ grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/$(am__dirstamp) grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-keccak.$(OBJEXT): \ grub-core/lib/libgcrypt-grub/cipher/$(am__dirstamp) \ grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/$(am__dirstamp) grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-md4.$(OBJEXT): \ grub-core/lib/libgcrypt-grub/cipher/$(am__dirstamp) \ grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/$(am__dirstamp) grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-md5.$(OBJEXT): \ grub-core/lib/libgcrypt-grub/cipher/$(am__dirstamp) \ grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/$(am__dirstamp) grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-rfc2268.$(OBJEXT): \ grub-core/lib/libgcrypt-grub/cipher/$(am__dirstamp) \ grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/$(am__dirstamp) grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-rijndael.$(OBJEXT): \ grub-core/lib/libgcrypt-grub/cipher/$(am__dirstamp) \ grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/$(am__dirstamp) grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-rmd160.$(OBJEXT): \ grub-core/lib/libgcrypt-grub/cipher/$(am__dirstamp) \ grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/$(am__dirstamp) grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-salsa20.$(OBJEXT): \ grub-core/lib/libgcrypt-grub/cipher/$(am__dirstamp) \ grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/$(am__dirstamp) grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-seed.$(OBJEXT): \ grub-core/lib/libgcrypt-grub/cipher/$(am__dirstamp) \ grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/$(am__dirstamp) grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-serpent.$(OBJEXT): \ grub-core/lib/libgcrypt-grub/cipher/$(am__dirstamp) \ grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/$(am__dirstamp) grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-sha1.$(OBJEXT): \ grub-core/lib/libgcrypt-grub/cipher/$(am__dirstamp) \ grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/$(am__dirstamp) grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-sha256.$(OBJEXT): \ grub-core/lib/libgcrypt-grub/cipher/$(am__dirstamp) \ grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/$(am__dirstamp) grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-sha512.$(OBJEXT): \ grub-core/lib/libgcrypt-grub/cipher/$(am__dirstamp) \ grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/$(am__dirstamp) grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-sm3.$(OBJEXT): \ grub-core/lib/libgcrypt-grub/cipher/$(am__dirstamp) \ grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/$(am__dirstamp) grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-sm4.$(OBJEXT): \ grub-core/lib/libgcrypt-grub/cipher/$(am__dirstamp) \ grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/$(am__dirstamp) grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-stribog.$(OBJEXT): \ grub-core/lib/libgcrypt-grub/cipher/$(am__dirstamp) \ grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/$(am__dirstamp) grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-tiger.$(OBJEXT): \ grub-core/lib/libgcrypt-grub/cipher/$(am__dirstamp) \ grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/$(am__dirstamp) grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-twofish.$(OBJEXT): \ grub-core/lib/libgcrypt-grub/cipher/$(am__dirstamp) \ grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/$(am__dirstamp) grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-whirlpool.$(OBJEXT): \ grub-core/lib/libgcrypt-grub/cipher/$(am__dirstamp) \ grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/$(am__dirstamp) grub-core/lib/libgcrypt-grub/src/$(am__dirstamp): @$(MKDIR_P) grub-core/lib/libgcrypt-grub/src @: > grub-core/lib/libgcrypt-grub/src/$(am__dirstamp) grub-core/lib/libgcrypt-grub/src/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) grub-core/lib/libgcrypt-grub/src/$(DEPDIR) @: > grub-core/lib/libgcrypt-grub/src/$(DEPDIR)/$(am__dirstamp) grub-core/lib/libgcrypt-grub/src/libgrubgcry_a-const-time.$(OBJEXT): \ grub-core/lib/libgcrypt-grub/src/$(am__dirstamp) \ grub-core/lib/libgcrypt-grub/src/$(DEPDIR)/$(am__dirstamp) libgrubgcry.a: $(libgrubgcry_a_OBJECTS) $(libgrubgcry_a_DEPENDENCIES) $(EXTRA_libgrubgcry_a_DEPENDENCIES) $(AM_V_at)-rm -f libgrubgcry.a $(AM_V_AR)$(libgrubgcry_a_AR) libgrubgcry.a $(libgrubgcry_a_OBJECTS) $(libgrubgcry_a_LIBADD) $(AM_V_at)$(RANLIB) libgrubgcry.a grub-core/commands/$(am__dirstamp): @$(MKDIR_P) grub-core/commands @: > grub-core/commands/$(am__dirstamp) grub-core/commands/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) grub-core/commands/$(DEPDIR) @: > grub-core/commands/$(DEPDIR)/$(am__dirstamp) grub-core/commands/libgrubkern_a-extcmd.$(OBJEXT): \ grub-core/commands/$(am__dirstamp) \ grub-core/commands/$(DEPDIR)/$(am__dirstamp) grub-core/disk/$(am__dirstamp): @$(MKDIR_P) grub-core/disk @: > grub-core/disk/$(am__dirstamp) grub-core/disk/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) grub-core/disk/$(DEPDIR) @: > grub-core/disk/$(DEPDIR)/$(am__dirstamp) grub-core/disk/libgrubkern_a-AFSplitter.$(OBJEXT): \ grub-core/disk/$(am__dirstamp) \ grub-core/disk/$(DEPDIR)/$(am__dirstamp) grub-core/disk/libgrubkern_a-cryptodisk.$(OBJEXT): \ grub-core/disk/$(am__dirstamp) \ grub-core/disk/$(DEPDIR)/$(am__dirstamp) grub-core/disk/libgrubkern_a-diskfilter.$(OBJEXT): \ grub-core/disk/$(am__dirstamp) \ grub-core/disk/$(DEPDIR)/$(am__dirstamp) grub-core/disk/libgrubkern_a-geli.$(OBJEXT): \ grub-core/disk/$(am__dirstamp) \ grub-core/disk/$(DEPDIR)/$(am__dirstamp) grub-core/disk/libgrubkern_a-key_protector.$(OBJEXT): \ grub-core/disk/$(am__dirstamp) \ grub-core/disk/$(DEPDIR)/$(am__dirstamp) grub-core/disk/libgrubkern_a-ldm.$(OBJEXT): \ grub-core/disk/$(am__dirstamp) \ grub-core/disk/$(DEPDIR)/$(am__dirstamp) grub-core/disk/libgrubkern_a-luks.$(OBJEXT): \ grub-core/disk/$(am__dirstamp) \ grub-core/disk/$(DEPDIR)/$(am__dirstamp) grub-core/disk/libgrubkern_a-luks2.$(OBJEXT): \ grub-core/disk/$(am__dirstamp) \ grub-core/disk/$(DEPDIR)/$(am__dirstamp) grub-core/fs/$(am__dirstamp): @$(MKDIR_P) grub-core/fs @: > grub-core/fs/$(am__dirstamp) grub-core/fs/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) grub-core/fs/$(DEPDIR) @: > grub-core/fs/$(DEPDIR)/$(am__dirstamp) grub-core/fs/libgrubkern_a-archelp.$(OBJEXT): \ grub-core/fs/$(am__dirstamp) \ grub-core/fs/$(DEPDIR)/$(am__dirstamp) grub-core/fs/libgrubkern_a-proc.$(OBJEXT): \ grub-core/fs/$(am__dirstamp) \ grub-core/fs/$(DEPDIR)/$(am__dirstamp) grub-core/kern/$(am__dirstamp): @$(MKDIR_P) grub-core/kern @: > grub-core/kern/$(am__dirstamp) grub-core/kern/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) grub-core/kern/$(DEPDIR) @: > grub-core/kern/$(DEPDIR)/$(am__dirstamp) grub-core/kern/libgrubkern_a-command.$(OBJEXT): \ grub-core/kern/$(am__dirstamp) \ grub-core/kern/$(DEPDIR)/$(am__dirstamp) grub-core/kern/libgrubkern_a-device.$(OBJEXT): \ grub-core/kern/$(am__dirstamp) \ grub-core/kern/$(DEPDIR)/$(am__dirstamp) grub-core/kern/libgrubkern_a-disk.$(OBJEXT): \ grub-core/kern/$(am__dirstamp) \ grub-core/kern/$(DEPDIR)/$(am__dirstamp) grub-core/kern/emu/$(am__dirstamp): @$(MKDIR_P) grub-core/kern/emu @: > grub-core/kern/emu/$(am__dirstamp) grub-core/kern/emu/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) grub-core/kern/emu/$(DEPDIR) @: > grub-core/kern/emu/$(DEPDIR)/$(am__dirstamp) grub-core/kern/emu/libgrubkern_a-hostdisk.$(OBJEXT): \ grub-core/kern/emu/$(am__dirstamp) \ grub-core/kern/emu/$(DEPDIR)/$(am__dirstamp) grub-core/kern/emu/libgrubkern_a-misc.$(OBJEXT): \ grub-core/kern/emu/$(am__dirstamp) \ grub-core/kern/emu/$(DEPDIR)/$(am__dirstamp) grub-core/kern/emu/libgrubkern_a-mm.$(OBJEXT): \ grub-core/kern/emu/$(am__dirstamp) \ grub-core/kern/emu/$(DEPDIR)/$(am__dirstamp) grub-core/kern/libgrubkern_a-env.$(OBJEXT): \ grub-core/kern/$(am__dirstamp) \ grub-core/kern/$(DEPDIR)/$(am__dirstamp) grub-core/kern/libgrubkern_a-err.$(OBJEXT): \ grub-core/kern/$(am__dirstamp) \ grub-core/kern/$(DEPDIR)/$(am__dirstamp) grub-core/kern/libgrubkern_a-file.$(OBJEXT): \ grub-core/kern/$(am__dirstamp) \ grub-core/kern/$(DEPDIR)/$(am__dirstamp) grub-core/kern/libgrubkern_a-fs.$(OBJEXT): \ grub-core/kern/$(am__dirstamp) \ grub-core/kern/$(DEPDIR)/$(am__dirstamp) grub-core/kern/libgrubkern_a-list.$(OBJEXT): \ grub-core/kern/$(am__dirstamp) \ grub-core/kern/$(DEPDIR)/$(am__dirstamp) grub-core/kern/libgrubkern_a-misc.$(OBJEXT): \ grub-core/kern/$(am__dirstamp) \ grub-core/kern/$(DEPDIR)/$(am__dirstamp) grub-core/kern/libgrubkern_a-partition.$(OBJEXT): \ grub-core/kern/$(am__dirstamp) \ grub-core/kern/$(DEPDIR)/$(am__dirstamp) grub-core/lib/$(am__dirstamp): @$(MKDIR_P) grub-core/lib @: > grub-core/lib/$(am__dirstamp) grub-core/lib/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) grub-core/lib/$(DEPDIR) @: > grub-core/lib/$(DEPDIR)/$(am__dirstamp) grub-core/lib/libgrubkern_a-arg.$(OBJEXT): \ grub-core/lib/$(am__dirstamp) \ grub-core/lib/$(DEPDIR)/$(am__dirstamp) grub-core/lib/libgrubkern_a-crypto.$(OBJEXT): \ grub-core/lib/$(am__dirstamp) \ grub-core/lib/$(DEPDIR)/$(am__dirstamp) grub-core/lib/libgrubkern_a-disk.$(OBJEXT): \ grub-core/lib/$(am__dirstamp) \ grub-core/lib/$(DEPDIR)/$(am__dirstamp) grub-core/lib/json/$(am__dirstamp): @$(MKDIR_P) grub-core/lib/json @: > grub-core/lib/json/$(am__dirstamp) grub-core/lib/json/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) grub-core/lib/json/$(DEPDIR) @: > grub-core/lib/json/$(DEPDIR)/$(am__dirstamp) grub-core/lib/json/libgrubkern_a-json.$(OBJEXT): \ grub-core/lib/json/$(am__dirstamp) \ grub-core/lib/json/$(DEPDIR)/$(am__dirstamp) grub-core/lib/libgrubkern_a-pbkdf2.$(OBJEXT): \ grub-core/lib/$(am__dirstamp) \ grub-core/lib/$(DEPDIR)/$(am__dirstamp) grub-core/osdep/devmapper/$(am__dirstamp): @$(MKDIR_P) grub-core/osdep/devmapper @: > grub-core/osdep/devmapper/$(am__dirstamp) grub-core/osdep/devmapper/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) grub-core/osdep/devmapper/$(DEPDIR) @: > grub-core/osdep/devmapper/$(DEPDIR)/$(am__dirstamp) grub-core/osdep/devmapper/libgrubkern_a-getroot.$(OBJEXT): \ grub-core/osdep/devmapper/$(am__dirstamp) \ grub-core/osdep/devmapper/$(DEPDIR)/$(am__dirstamp) grub-core/osdep/devmapper/libgrubkern_a-hostdisk.$(OBJEXT): \ grub-core/osdep/devmapper/$(am__dirstamp) \ grub-core/osdep/devmapper/$(DEPDIR)/$(am__dirstamp) grub-core/osdep/$(am__dirstamp): @$(MKDIR_P) grub-core/osdep @: > grub-core/osdep/$(am__dirstamp) grub-core/osdep/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) grub-core/osdep/$(DEPDIR) @: > grub-core/osdep/$(DEPDIR)/$(am__dirstamp) grub-core/osdep/libgrubkern_a-exec.$(OBJEXT): \ grub-core/osdep/$(am__dirstamp) \ grub-core/osdep/$(DEPDIR)/$(am__dirstamp) grub-core/osdep/libgrubkern_a-getroot.$(OBJEXT): \ grub-core/osdep/$(am__dirstamp) \ grub-core/osdep/$(DEPDIR)/$(am__dirstamp) grub-core/osdep/libgrubkern_a-hostdisk.$(OBJEXT): \ grub-core/osdep/$(am__dirstamp) \ grub-core/osdep/$(DEPDIR)/$(am__dirstamp) grub-core/osdep/libgrubkern_a-password.$(OBJEXT): \ grub-core/osdep/$(am__dirstamp) \ grub-core/osdep/$(DEPDIR)/$(am__dirstamp) grub-core/osdep/libgrubkern_a-relpath.$(OBJEXT): \ grub-core/osdep/$(am__dirstamp) \ grub-core/osdep/$(DEPDIR)/$(am__dirstamp) grub-core/osdep/libgrubkern_a-sleep.$(OBJEXT): \ grub-core/osdep/$(am__dirstamp) \ grub-core/osdep/$(DEPDIR)/$(am__dirstamp) grub-core/osdep/unix/$(am__dirstamp): @$(MKDIR_P) grub-core/osdep/unix @: > grub-core/osdep/unix/$(am__dirstamp) grub-core/osdep/unix/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) grub-core/osdep/unix/$(DEPDIR) @: > grub-core/osdep/unix/$(DEPDIR)/$(am__dirstamp) grub-core/osdep/unix/libgrubkern_a-getroot.$(OBJEXT): \ grub-core/osdep/unix/$(am__dirstamp) \ grub-core/osdep/unix/$(DEPDIR)/$(am__dirstamp) grub-core/osdep/unix/libgrubkern_a-hostdisk.$(OBJEXT): \ grub-core/osdep/unix/$(am__dirstamp) \ grub-core/osdep/unix/$(DEPDIR)/$(am__dirstamp) grub-core/partmap/$(am__dirstamp): @$(MKDIR_P) grub-core/partmap @: > grub-core/partmap/$(am__dirstamp) grub-core/partmap/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) grub-core/partmap/$(DEPDIR) @: > grub-core/partmap/$(DEPDIR)/$(am__dirstamp) grub-core/partmap/libgrubkern_a-gpt.$(OBJEXT): \ grub-core/partmap/$(am__dirstamp) \ grub-core/partmap/$(DEPDIR)/$(am__dirstamp) grub-core/partmap/libgrubkern_a-msdos.$(OBJEXT): \ grub-core/partmap/$(am__dirstamp) \ grub-core/partmap/$(DEPDIR)/$(am__dirstamp) util/$(am__dirstamp): @$(MKDIR_P) util @: > util/$(am__dirstamp) util/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) util/$(DEPDIR) @: > util/$(DEPDIR)/$(am__dirstamp) util/libgrubkern_a-getroot.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) util/libgrubkern_a-misc.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) libgrubkern.a: $(libgrubkern_a_OBJECTS) $(libgrubkern_a_DEPENDENCIES) $(EXTRA_libgrubkern_a_DEPENDENCIES) $(AM_V_at)-rm -f libgrubkern.a $(AM_V_AR)$(libgrubkern_a_AR) libgrubkern.a $(libgrubkern_a_OBJECTS) $(libgrubkern_a_LIBADD) $(AM_V_at)$(RANLIB) libgrubkern.a grub-core/commands/libgrubmods_a-blocklist.$(OBJEXT): \ grub-core/commands/$(am__dirstamp) \ grub-core/commands/$(DEPDIR)/$(am__dirstamp) grub-core/commands/libgrubmods_a-ls.$(OBJEXT): \ grub-core/commands/$(am__dirstamp) \ grub-core/commands/$(DEPDIR)/$(am__dirstamp) grub-core/commands/libgrubmods_a-macbless.$(OBJEXT): \ grub-core/commands/$(am__dirstamp) \ grub-core/commands/$(DEPDIR)/$(am__dirstamp) grub-core/commands/libgrubmods_a-testload.$(OBJEXT): \ grub-core/commands/$(am__dirstamp) \ grub-core/commands/$(DEPDIR)/$(am__dirstamp) grub-core/commands/libgrubmods_a-xnu_uuid.$(OBJEXT): \ grub-core/commands/$(am__dirstamp) \ grub-core/commands/$(DEPDIR)/$(am__dirstamp) grub-core/disk/libgrubmods_a-dmraid_nvidia.$(OBJEXT): \ grub-core/disk/$(am__dirstamp) \ grub-core/disk/$(DEPDIR)/$(am__dirstamp) grub-core/disk/libgrubmods_a-loopback.$(OBJEXT): \ grub-core/disk/$(am__dirstamp) \ grub-core/disk/$(DEPDIR)/$(am__dirstamp) grub-core/disk/libgrubmods_a-lvm.$(OBJEXT): \ grub-core/disk/$(am__dirstamp) \ grub-core/disk/$(DEPDIR)/$(am__dirstamp) grub-core/disk/libgrubmods_a-mdraid1x_linux.$(OBJEXT): \ grub-core/disk/$(am__dirstamp) \ grub-core/disk/$(DEPDIR)/$(am__dirstamp) grub-core/disk/libgrubmods_a-mdraid_linux.$(OBJEXT): \ grub-core/disk/$(am__dirstamp) \ grub-core/disk/$(DEPDIR)/$(am__dirstamp) grub-core/disk/libgrubmods_a-mdraid_linux_be.$(OBJEXT): \ grub-core/disk/$(am__dirstamp) \ grub-core/disk/$(DEPDIR)/$(am__dirstamp) grub-core/disk/libgrubmods_a-raid5_recover.$(OBJEXT): \ grub-core/disk/$(am__dirstamp) \ grub-core/disk/$(DEPDIR)/$(am__dirstamp) grub-core/disk/libgrubmods_a-raid6_recover.$(OBJEXT): \ grub-core/disk/$(am__dirstamp) \ grub-core/disk/$(DEPDIR)/$(am__dirstamp) grub-core/font/$(am__dirstamp): @$(MKDIR_P) grub-core/font @: > grub-core/font/$(am__dirstamp) grub-core/font/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) grub-core/font/$(DEPDIR) @: > grub-core/font/$(DEPDIR)/$(am__dirstamp) grub-core/font/libgrubmods_a-font.$(OBJEXT): \ grub-core/font/$(am__dirstamp) \ grub-core/font/$(DEPDIR)/$(am__dirstamp) grub-core/fs/libgrubmods_a-affs.$(OBJEXT): \ grub-core/fs/$(am__dirstamp) \ grub-core/fs/$(DEPDIR)/$(am__dirstamp) grub-core/fs/libgrubmods_a-afs.$(OBJEXT): \ grub-core/fs/$(am__dirstamp) \ grub-core/fs/$(DEPDIR)/$(am__dirstamp) grub-core/fs/libgrubmods_a-bfs.$(OBJEXT): \ grub-core/fs/$(am__dirstamp) \ grub-core/fs/$(DEPDIR)/$(am__dirstamp) grub-core/fs/libgrubmods_a-btrfs.$(OBJEXT): \ grub-core/fs/$(am__dirstamp) \ grub-core/fs/$(DEPDIR)/$(am__dirstamp) grub-core/fs/libgrubmods_a-cbfs.$(OBJEXT): \ grub-core/fs/$(am__dirstamp) \ grub-core/fs/$(DEPDIR)/$(am__dirstamp) grub-core/fs/libgrubmods_a-cpio.$(OBJEXT): \ grub-core/fs/$(am__dirstamp) \ grub-core/fs/$(DEPDIR)/$(am__dirstamp) grub-core/fs/libgrubmods_a-cpio_be.$(OBJEXT): \ grub-core/fs/$(am__dirstamp) \ grub-core/fs/$(DEPDIR)/$(am__dirstamp) grub-core/fs/libgrubmods_a-erofs.$(OBJEXT): \ grub-core/fs/$(am__dirstamp) \ grub-core/fs/$(DEPDIR)/$(am__dirstamp) grub-core/fs/libgrubmods_a-exfat.$(OBJEXT): \ grub-core/fs/$(am__dirstamp) \ grub-core/fs/$(DEPDIR)/$(am__dirstamp) grub-core/fs/libgrubmods_a-ext2.$(OBJEXT): \ grub-core/fs/$(am__dirstamp) \ grub-core/fs/$(DEPDIR)/$(am__dirstamp) grub-core/fs/libgrubmods_a-f2fs.$(OBJEXT): \ grub-core/fs/$(am__dirstamp) \ grub-core/fs/$(DEPDIR)/$(am__dirstamp) grub-core/fs/libgrubmods_a-fat.$(OBJEXT): \ grub-core/fs/$(am__dirstamp) \ grub-core/fs/$(DEPDIR)/$(am__dirstamp) grub-core/fs/libgrubmods_a-fshelp.$(OBJEXT): \ grub-core/fs/$(am__dirstamp) \ grub-core/fs/$(DEPDIR)/$(am__dirstamp) grub-core/fs/libgrubmods_a-hfs.$(OBJEXT): \ grub-core/fs/$(am__dirstamp) \ grub-core/fs/$(DEPDIR)/$(am__dirstamp) grub-core/fs/libgrubmods_a-hfsplus.$(OBJEXT): \ grub-core/fs/$(am__dirstamp) \ grub-core/fs/$(DEPDIR)/$(am__dirstamp) grub-core/fs/libgrubmods_a-hfspluscomp.$(OBJEXT): \ grub-core/fs/$(am__dirstamp) \ grub-core/fs/$(DEPDIR)/$(am__dirstamp) grub-core/fs/libgrubmods_a-iso9660.$(OBJEXT): \ grub-core/fs/$(am__dirstamp) \ grub-core/fs/$(DEPDIR)/$(am__dirstamp) grub-core/fs/libgrubmods_a-jfs.$(OBJEXT): \ grub-core/fs/$(am__dirstamp) \ grub-core/fs/$(DEPDIR)/$(am__dirstamp) grub-core/fs/libgrubmods_a-minix.$(OBJEXT): \ grub-core/fs/$(am__dirstamp) \ grub-core/fs/$(DEPDIR)/$(am__dirstamp) grub-core/fs/libgrubmods_a-minix2.$(OBJEXT): \ grub-core/fs/$(am__dirstamp) \ grub-core/fs/$(DEPDIR)/$(am__dirstamp) grub-core/fs/libgrubmods_a-minix2_be.$(OBJEXT): \ grub-core/fs/$(am__dirstamp) \ grub-core/fs/$(DEPDIR)/$(am__dirstamp) grub-core/fs/libgrubmods_a-minix3.$(OBJEXT): \ grub-core/fs/$(am__dirstamp) \ grub-core/fs/$(DEPDIR)/$(am__dirstamp) grub-core/fs/libgrubmods_a-minix3_be.$(OBJEXT): \ grub-core/fs/$(am__dirstamp) \ grub-core/fs/$(DEPDIR)/$(am__dirstamp) grub-core/fs/libgrubmods_a-minix_be.$(OBJEXT): \ grub-core/fs/$(am__dirstamp) \ grub-core/fs/$(DEPDIR)/$(am__dirstamp) grub-core/fs/libgrubmods_a-newc.$(OBJEXT): \ grub-core/fs/$(am__dirstamp) \ grub-core/fs/$(DEPDIR)/$(am__dirstamp) grub-core/fs/libgrubmods_a-nilfs2.$(OBJEXT): \ grub-core/fs/$(am__dirstamp) \ grub-core/fs/$(DEPDIR)/$(am__dirstamp) grub-core/fs/libgrubmods_a-ntfs.$(OBJEXT): \ grub-core/fs/$(am__dirstamp) \ grub-core/fs/$(DEPDIR)/$(am__dirstamp) grub-core/fs/libgrubmods_a-ntfscomp.$(OBJEXT): \ grub-core/fs/$(am__dirstamp) \ grub-core/fs/$(DEPDIR)/$(am__dirstamp) grub-core/fs/libgrubmods_a-odc.$(OBJEXT): \ grub-core/fs/$(am__dirstamp) \ grub-core/fs/$(DEPDIR)/$(am__dirstamp) grub-core/fs/libgrubmods_a-reiserfs.$(OBJEXT): \ grub-core/fs/$(am__dirstamp) \ grub-core/fs/$(DEPDIR)/$(am__dirstamp) grub-core/fs/libgrubmods_a-romfs.$(OBJEXT): \ grub-core/fs/$(am__dirstamp) \ grub-core/fs/$(DEPDIR)/$(am__dirstamp) grub-core/fs/libgrubmods_a-sfs.$(OBJEXT): \ grub-core/fs/$(am__dirstamp) \ grub-core/fs/$(DEPDIR)/$(am__dirstamp) grub-core/fs/libgrubmods_a-squash4.$(OBJEXT): \ grub-core/fs/$(am__dirstamp) \ grub-core/fs/$(DEPDIR)/$(am__dirstamp) grub-core/fs/libgrubmods_a-tar.$(OBJEXT): \ grub-core/fs/$(am__dirstamp) \ grub-core/fs/$(DEPDIR)/$(am__dirstamp) grub-core/fs/libgrubmods_a-udf.$(OBJEXT): \ grub-core/fs/$(am__dirstamp) \ grub-core/fs/$(DEPDIR)/$(am__dirstamp) grub-core/fs/libgrubmods_a-ufs.$(OBJEXT): \ grub-core/fs/$(am__dirstamp) \ grub-core/fs/$(DEPDIR)/$(am__dirstamp) grub-core/fs/libgrubmods_a-ufs2.$(OBJEXT): \ grub-core/fs/$(am__dirstamp) \ grub-core/fs/$(DEPDIR)/$(am__dirstamp) grub-core/fs/libgrubmods_a-ufs_be.$(OBJEXT): \ grub-core/fs/$(am__dirstamp) \ grub-core/fs/$(DEPDIR)/$(am__dirstamp) grub-core/fs/libgrubmods_a-xfs.$(OBJEXT): \ grub-core/fs/$(am__dirstamp) \ grub-core/fs/$(DEPDIR)/$(am__dirstamp) grub-core/fs/zfs/$(am__dirstamp): @$(MKDIR_P) grub-core/fs/zfs @: > grub-core/fs/zfs/$(am__dirstamp) grub-core/fs/zfs/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) grub-core/fs/zfs/$(DEPDIR) @: > grub-core/fs/zfs/$(DEPDIR)/$(am__dirstamp) grub-core/fs/zfs/libgrubmods_a-zfs.$(OBJEXT): \ grub-core/fs/zfs/$(am__dirstamp) \ grub-core/fs/zfs/$(DEPDIR)/$(am__dirstamp) grub-core/fs/zfs/libgrubmods_a-zfs_fletcher.$(OBJEXT): \ grub-core/fs/zfs/$(am__dirstamp) \ grub-core/fs/zfs/$(DEPDIR)/$(am__dirstamp) grub-core/fs/zfs/libgrubmods_a-zfs_lz4.$(OBJEXT): \ grub-core/fs/zfs/$(am__dirstamp) \ grub-core/fs/zfs/$(DEPDIR)/$(am__dirstamp) grub-core/fs/zfs/libgrubmods_a-zfs_lzjb.$(OBJEXT): \ grub-core/fs/zfs/$(am__dirstamp) \ grub-core/fs/zfs/$(DEPDIR)/$(am__dirstamp) grub-core/fs/zfs/libgrubmods_a-zfs_sha256.$(OBJEXT): \ grub-core/fs/zfs/$(am__dirstamp) \ grub-core/fs/zfs/$(DEPDIR)/$(am__dirstamp) grub-core/fs/zfs/libgrubmods_a-zfscrypt.$(OBJEXT): \ grub-core/fs/zfs/$(am__dirstamp) \ grub-core/fs/zfs/$(DEPDIR)/$(am__dirstamp) grub-core/fs/zfs/libgrubmods_a-zfsinfo.$(OBJEXT): \ grub-core/fs/zfs/$(am__dirstamp) \ grub-core/fs/zfs/$(DEPDIR)/$(am__dirstamp) grub-core/gfxmenu/$(am__dirstamp): @$(MKDIR_P) grub-core/gfxmenu @: > grub-core/gfxmenu/$(am__dirstamp) grub-core/gfxmenu/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) grub-core/gfxmenu/$(DEPDIR) @: > grub-core/gfxmenu/$(DEPDIR)/$(am__dirstamp) grub-core/gfxmenu/libgrubmods_a-font.$(OBJEXT): \ grub-core/gfxmenu/$(am__dirstamp) \ grub-core/gfxmenu/$(DEPDIR)/$(am__dirstamp) grub-core/io/$(am__dirstamp): @$(MKDIR_P) grub-core/io @: > grub-core/io/$(am__dirstamp) grub-core/io/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) grub-core/io/$(DEPDIR) @: > grub-core/io/$(DEPDIR)/$(am__dirstamp) grub-core/io/libgrubmods_a-bufio.$(OBJEXT): \ grub-core/io/$(am__dirstamp) \ grub-core/io/$(DEPDIR)/$(am__dirstamp) grub-core/io/libgrubmods_a-gzio.$(OBJEXT): \ grub-core/io/$(am__dirstamp) \ grub-core/io/$(DEPDIR)/$(am__dirstamp) grub-core/io/libgrubmods_a-lzopio.$(OBJEXT): \ grub-core/io/$(am__dirstamp) \ grub-core/io/$(DEPDIR)/$(am__dirstamp) grub-core/io/libgrubmods_a-xzio.$(OBJEXT): \ grub-core/io/$(am__dirstamp) \ grub-core/io/$(DEPDIR)/$(am__dirstamp) grub-core/kern/arm/$(am__dirstamp): @$(MKDIR_P) grub-core/kern/arm @: > grub-core/kern/arm/$(am__dirstamp) grub-core/kern/arm/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) grub-core/kern/arm/$(DEPDIR) @: > grub-core/kern/arm/$(DEPDIR)/$(am__dirstamp) grub-core/kern/arm/libgrubmods_a-dl_helper.$(OBJEXT): \ grub-core/kern/arm/$(am__dirstamp) \ grub-core/kern/arm/$(DEPDIR)/$(am__dirstamp) grub-core/kern/arm64/$(am__dirstamp): @$(MKDIR_P) grub-core/kern/arm64 @: > grub-core/kern/arm64/$(am__dirstamp) grub-core/kern/arm64/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) grub-core/kern/arm64/$(DEPDIR) @: > grub-core/kern/arm64/$(DEPDIR)/$(am__dirstamp) grub-core/kern/arm64/libgrubmods_a-dl_helper.$(OBJEXT): \ grub-core/kern/arm64/$(am__dirstamp) \ grub-core/kern/arm64/$(DEPDIR)/$(am__dirstamp) grub-core/kern/ia64/$(am__dirstamp): @$(MKDIR_P) grub-core/kern/ia64 @: > grub-core/kern/ia64/$(am__dirstamp) grub-core/kern/ia64/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) grub-core/kern/ia64/$(DEPDIR) @: > grub-core/kern/ia64/$(DEPDIR)/$(am__dirstamp) grub-core/kern/ia64/libgrubmods_a-dl_helper.$(OBJEXT): \ grub-core/kern/ia64/$(am__dirstamp) \ grub-core/kern/ia64/$(DEPDIR)/$(am__dirstamp) grub-core/kern/loongarch64/$(am__dirstamp): @$(MKDIR_P) grub-core/kern/loongarch64 @: > grub-core/kern/loongarch64/$(am__dirstamp) grub-core/kern/loongarch64/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) grub-core/kern/loongarch64/$(DEPDIR) @: > grub-core/kern/loongarch64/$(DEPDIR)/$(am__dirstamp) grub-core/kern/loongarch64/libgrubmods_a-dl_helper.$(OBJEXT): \ grub-core/kern/loongarch64/$(am__dirstamp) \ grub-core/kern/loongarch64/$(DEPDIR)/$(am__dirstamp) grub-core/lib/libgrubmods_a-LzFind.$(OBJEXT): \ grub-core/lib/$(am__dirstamp) \ grub-core/lib/$(DEPDIR)/$(am__dirstamp) grub-core/lib/libgrubmods_a-LzmaEnc.$(OBJEXT): \ grub-core/lib/$(am__dirstamp) \ grub-core/lib/$(DEPDIR)/$(am__dirstamp) grub-core/lib/libgrubmods_a-adler32.$(OBJEXT): \ grub-core/lib/$(am__dirstamp) \ grub-core/lib/$(DEPDIR)/$(am__dirstamp) grub-core/lib/libgrubmods_a-crc.$(OBJEXT): \ grub-core/lib/$(am__dirstamp) \ grub-core/lib/$(DEPDIR)/$(am__dirstamp) grub-core/lib/libgrubmods_a-crc64.$(OBJEXT): \ grub-core/lib/$(am__dirstamp) \ grub-core/lib/$(DEPDIR)/$(am__dirstamp) grub-core/lib/libgrubmods_a-datetime.$(OBJEXT): \ grub-core/lib/$(am__dirstamp) \ grub-core/lib/$(DEPDIR)/$(am__dirstamp) grub-core/lib/libgrubmods_a-envblk.$(OBJEXT): \ grub-core/lib/$(am__dirstamp) \ grub-core/lib/$(DEPDIR)/$(am__dirstamp) grub-core/lib/libgrubmods_a-hexdump.$(OBJEXT): \ grub-core/lib/$(am__dirstamp) \ grub-core/lib/$(DEPDIR)/$(am__dirstamp) grub-core/lib/minilzo/$(am__dirstamp): @$(MKDIR_P) grub-core/lib/minilzo @: > grub-core/lib/minilzo/$(am__dirstamp) grub-core/lib/minilzo/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) grub-core/lib/minilzo/$(DEPDIR) @: > grub-core/lib/minilzo/$(DEPDIR)/$(am__dirstamp) grub-core/lib/minilzo/libgrubmods_a-minilzo.$(OBJEXT): \ grub-core/lib/minilzo/$(am__dirstamp) \ grub-core/lib/minilzo/$(DEPDIR)/$(am__dirstamp) grub-core/lib/xzembed/$(am__dirstamp): @$(MKDIR_P) grub-core/lib/xzembed @: > grub-core/lib/xzembed/$(am__dirstamp) grub-core/lib/xzembed/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) grub-core/lib/xzembed/$(DEPDIR) @: > grub-core/lib/xzembed/$(DEPDIR)/$(am__dirstamp) grub-core/lib/xzembed/libgrubmods_a-xz_dec_bcj.$(OBJEXT): \ grub-core/lib/xzembed/$(am__dirstamp) \ grub-core/lib/xzembed/$(DEPDIR)/$(am__dirstamp) grub-core/lib/xzembed/libgrubmods_a-xz_dec_lzma2.$(OBJEXT): \ grub-core/lib/xzembed/$(am__dirstamp) \ grub-core/lib/xzembed/$(DEPDIR)/$(am__dirstamp) grub-core/lib/xzembed/libgrubmods_a-xz_dec_stream.$(OBJEXT): \ grub-core/lib/xzembed/$(am__dirstamp) \ grub-core/lib/xzembed/$(DEPDIR)/$(am__dirstamp) grub-core/lib/zstd/$(am__dirstamp): @$(MKDIR_P) grub-core/lib/zstd @: > grub-core/lib/zstd/$(am__dirstamp) grub-core/lib/zstd/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) grub-core/lib/zstd/$(DEPDIR) @: > grub-core/lib/zstd/$(DEPDIR)/$(am__dirstamp) grub-core/lib/zstd/libgrubmods_a-debug.$(OBJEXT): \ grub-core/lib/zstd/$(am__dirstamp) \ grub-core/lib/zstd/$(DEPDIR)/$(am__dirstamp) grub-core/lib/zstd/libgrubmods_a-entropy_common.$(OBJEXT): \ grub-core/lib/zstd/$(am__dirstamp) \ grub-core/lib/zstd/$(DEPDIR)/$(am__dirstamp) grub-core/lib/zstd/libgrubmods_a-error_private.$(OBJEXT): \ grub-core/lib/zstd/$(am__dirstamp) \ grub-core/lib/zstd/$(DEPDIR)/$(am__dirstamp) grub-core/lib/zstd/libgrubmods_a-fse_decompress.$(OBJEXT): \ grub-core/lib/zstd/$(am__dirstamp) \ grub-core/lib/zstd/$(DEPDIR)/$(am__dirstamp) grub-core/lib/zstd/libgrubmods_a-huf_decompress.$(OBJEXT): \ grub-core/lib/zstd/$(am__dirstamp) \ grub-core/lib/zstd/$(DEPDIR)/$(am__dirstamp) grub-core/lib/zstd/libgrubmods_a-module.$(OBJEXT): \ grub-core/lib/zstd/$(am__dirstamp) \ grub-core/lib/zstd/$(DEPDIR)/$(am__dirstamp) grub-core/lib/zstd/libgrubmods_a-xxhash.$(OBJEXT): \ grub-core/lib/zstd/$(am__dirstamp) \ grub-core/lib/zstd/$(DEPDIR)/$(am__dirstamp) grub-core/lib/zstd/libgrubmods_a-zstd_common.$(OBJEXT): \ grub-core/lib/zstd/$(am__dirstamp) \ grub-core/lib/zstd/$(DEPDIR)/$(am__dirstamp) grub-core/lib/zstd/libgrubmods_a-zstd_decompress.$(OBJEXT): \ grub-core/lib/zstd/$(am__dirstamp) \ grub-core/lib/zstd/$(DEPDIR)/$(am__dirstamp) grub-core/normal/$(am__dirstamp): @$(MKDIR_P) grub-core/normal @: > grub-core/normal/$(am__dirstamp) grub-core/normal/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) grub-core/normal/$(DEPDIR) @: > grub-core/normal/$(DEPDIR)/$(am__dirstamp) grub-core/normal/libgrubmods_a-charset.$(OBJEXT): \ grub-core/normal/$(am__dirstamp) \ grub-core/normal/$(DEPDIR)/$(am__dirstamp) grub-core/normal/libgrubmods_a-misc.$(OBJEXT): \ grub-core/normal/$(am__dirstamp) \ grub-core/normal/$(DEPDIR)/$(am__dirstamp) grub-core/partmap/libgrubmods_a-acorn.$(OBJEXT): \ grub-core/partmap/$(am__dirstamp) \ grub-core/partmap/$(DEPDIR)/$(am__dirstamp) grub-core/partmap/libgrubmods_a-amiga.$(OBJEXT): \ grub-core/partmap/$(am__dirstamp) \ grub-core/partmap/$(DEPDIR)/$(am__dirstamp) grub-core/partmap/libgrubmods_a-apple.$(OBJEXT): \ grub-core/partmap/$(am__dirstamp) \ grub-core/partmap/$(DEPDIR)/$(am__dirstamp) grub-core/partmap/libgrubmods_a-bsdlabel.$(OBJEXT): \ grub-core/partmap/$(am__dirstamp) \ grub-core/partmap/$(DEPDIR)/$(am__dirstamp) grub-core/partmap/libgrubmods_a-dfly.$(OBJEXT): \ grub-core/partmap/$(am__dirstamp) \ grub-core/partmap/$(DEPDIR)/$(am__dirstamp) grub-core/partmap/libgrubmods_a-dvh.$(OBJEXT): \ grub-core/partmap/$(am__dirstamp) \ grub-core/partmap/$(DEPDIR)/$(am__dirstamp) grub-core/partmap/libgrubmods_a-plan.$(OBJEXT): \ grub-core/partmap/$(am__dirstamp) \ grub-core/partmap/$(DEPDIR)/$(am__dirstamp) grub-core/partmap/libgrubmods_a-sun.$(OBJEXT): \ grub-core/partmap/$(am__dirstamp) \ grub-core/partmap/$(DEPDIR)/$(am__dirstamp) grub-core/partmap/libgrubmods_a-sunpc.$(OBJEXT): \ grub-core/partmap/$(am__dirstamp) \ grub-core/partmap/$(DEPDIR)/$(am__dirstamp) grub-core/script/$(am__dirstamp): @$(MKDIR_P) grub-core/script @: > grub-core/script/$(am__dirstamp) grub-core/script/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) grub-core/script/$(DEPDIR) @: > grub-core/script/$(DEPDIR)/$(am__dirstamp) grub-core/script/libgrubmods_a-argv.$(OBJEXT): \ grub-core/script/$(am__dirstamp) \ grub-core/script/$(DEPDIR)/$(am__dirstamp) grub-core/script/libgrubmods_a-function.$(OBJEXT): \ grub-core/script/$(am__dirstamp) \ grub-core/script/$(DEPDIR)/$(am__dirstamp) grub-core/script/libgrubmods_a-lexer.$(OBJEXT): \ grub-core/script/$(am__dirstamp) \ grub-core/script/$(DEPDIR)/$(am__dirstamp) grub-core/script/libgrubmods_a-main.$(OBJEXT): \ grub-core/script/$(am__dirstamp) \ grub-core/script/$(DEPDIR)/$(am__dirstamp) grub-core/script/libgrubmods_a-script.$(OBJEXT): \ grub-core/script/$(am__dirstamp) \ grub-core/script/$(DEPDIR)/$(am__dirstamp) grub-core/$(am__dirstamp): @$(MKDIR_P) grub-core @: > grub-core/$(am__dirstamp) grub-core/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) grub-core/$(DEPDIR) @: > grub-core/$(DEPDIR)/$(am__dirstamp) grub-core/libgrubmods_a-unidata.$(OBJEXT): grub-core/$(am__dirstamp) \ grub-core/$(DEPDIR)/$(am__dirstamp) grub-core/video/$(am__dirstamp): @$(MKDIR_P) grub-core/video @: > grub-core/video/$(am__dirstamp) grub-core/video/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) grub-core/video/$(DEPDIR) @: > grub-core/video/$(DEPDIR)/$(am__dirstamp) grub-core/video/libgrubmods_a-capture.$(OBJEXT): \ grub-core/video/$(am__dirstamp) \ grub-core/video/$(DEPDIR)/$(am__dirstamp) grub-core/video/libgrubmods_a-colors.$(OBJEXT): \ grub-core/video/$(am__dirstamp) \ grub-core/video/$(DEPDIR)/$(am__dirstamp) grub-core/video/fb/$(am__dirstamp): @$(MKDIR_P) grub-core/video/fb @: > grub-core/video/fb/$(am__dirstamp) grub-core/video/fb/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) grub-core/video/fb/$(DEPDIR) @: > grub-core/video/fb/$(DEPDIR)/$(am__dirstamp) grub-core/video/fb/libgrubmods_a-fbblit.$(OBJEXT): \ grub-core/video/fb/$(am__dirstamp) \ grub-core/video/fb/$(DEPDIR)/$(am__dirstamp) grub-core/video/fb/libgrubmods_a-fbfill.$(OBJEXT): \ grub-core/video/fb/$(am__dirstamp) \ grub-core/video/fb/$(DEPDIR)/$(am__dirstamp) grub-core/video/fb/libgrubmods_a-fbutil.$(OBJEXT): \ grub-core/video/fb/$(am__dirstamp) \ grub-core/video/fb/$(DEPDIR)/$(am__dirstamp) grub-core/video/fb/libgrubmods_a-video_fb.$(OBJEXT): \ grub-core/video/fb/$(am__dirstamp) \ grub-core/video/fb/$(DEPDIR)/$(am__dirstamp) grub-core/video/libgrubmods_a-video.$(OBJEXT): \ grub-core/video/$(am__dirstamp) \ grub-core/video/$(DEPDIR)/$(am__dirstamp) libgrubmods.a: $(libgrubmods_a_OBJECTS) $(libgrubmods_a_DEPENDENCIES) $(EXTRA_libgrubmods_a_DEPENDENCIES) $(AM_V_at)-rm -f libgrubmods.a $(AM_V_AR)$(libgrubmods_a_AR) libgrubmods.a $(libgrubmods_a_OBJECTS) $(libgrubmods_a_LIBADD) $(AM_V_at)$(RANLIB) libgrubmods.a grub-core/kern/cmp_test-list.$(OBJEXT): \ grub-core/kern/$(am__dirstamp) \ grub-core/kern/$(DEPDIR)/$(am__dirstamp) grub-core/kern/cmp_test-misc.$(OBJEXT): \ grub-core/kern/$(am__dirstamp) \ grub-core/kern/$(DEPDIR)/$(am__dirstamp) grub-core/tests/lib/$(am__dirstamp): @$(MKDIR_P) grub-core/tests/lib @: > grub-core/tests/lib/$(am__dirstamp) grub-core/tests/lib/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) grub-core/tests/lib/$(DEPDIR) @: > grub-core/tests/lib/$(DEPDIR)/$(am__dirstamp) grub-core/tests/lib/cmp_test-test.$(OBJEXT): \ grub-core/tests/lib/$(am__dirstamp) \ grub-core/tests/lib/$(DEPDIR)/$(am__dirstamp) tests/$(am__dirstamp): @$(MKDIR_P) tests @: > tests/$(am__dirstamp) tests/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) tests/$(DEPDIR) @: > tests/$(DEPDIR)/$(am__dirstamp) tests/cmp_test-cmp_unit_test.$(OBJEXT): tests/$(am__dirstamp) \ tests/$(DEPDIR)/$(am__dirstamp) tests/lib/$(am__dirstamp): @$(MKDIR_P) tests/lib @: > tests/lib/$(am__dirstamp) tests/lib/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) tests/lib/$(DEPDIR) @: > tests/lib/$(DEPDIR)/$(am__dirstamp) tests/lib/cmp_test-unit_test.$(OBJEXT): tests/lib/$(am__dirstamp) \ tests/lib/$(DEPDIR)/$(am__dirstamp) cmp_test$(EXEEXT): $(cmp_test_OBJECTS) $(cmp_test_DEPENDENCIES) $(EXTRA_cmp_test_DEPENDENCIES) @rm -f cmp_test$(EXEEXT) $(AM_V_CCLD)$(cmp_test_LINK) $(cmp_test_OBJECTS) $(cmp_test_LDADD) $(LIBS) grub-core/kern/date_test-list.$(OBJEXT): \ grub-core/kern/$(am__dirstamp) \ grub-core/kern/$(DEPDIR)/$(am__dirstamp) grub-core/kern/date_test-misc.$(OBJEXT): \ grub-core/kern/$(am__dirstamp) \ grub-core/kern/$(DEPDIR)/$(am__dirstamp) grub-core/tests/lib/date_test-test.$(OBJEXT): \ grub-core/tests/lib/$(am__dirstamp) \ grub-core/tests/lib/$(DEPDIR)/$(am__dirstamp) tests/date_test-date_unit_test.$(OBJEXT): tests/$(am__dirstamp) \ tests/$(DEPDIR)/$(am__dirstamp) tests/lib/date_test-unit_test.$(OBJEXT): tests/lib/$(am__dirstamp) \ tests/lib/$(DEPDIR)/$(am__dirstamp) date_test$(EXEEXT): $(date_test_OBJECTS) $(date_test_DEPENDENCIES) $(EXTRA_date_test_DEPENDENCIES) @rm -f date_test$(EXEEXT) $(AM_V_CCLD)$(date_test_LINK) $(date_test_OBJECTS) $(date_test_LDADD) $(LIBS) grub-core/kern/example_unit_test-list.$(OBJEXT): \ grub-core/kern/$(am__dirstamp) \ grub-core/kern/$(DEPDIR)/$(am__dirstamp) grub-core/kern/example_unit_test-misc.$(OBJEXT): \ grub-core/kern/$(am__dirstamp) \ grub-core/kern/$(DEPDIR)/$(am__dirstamp) grub-core/tests/lib/example_unit_test-test.$(OBJEXT): \ grub-core/tests/lib/$(am__dirstamp) \ grub-core/tests/lib/$(DEPDIR)/$(am__dirstamp) tests/example_unit_test-example_unit_test.$(OBJEXT): \ tests/$(am__dirstamp) tests/$(DEPDIR)/$(am__dirstamp) tests/lib/example_unit_test-unit_test.$(OBJEXT): \ tests/lib/$(am__dirstamp) tests/lib/$(DEPDIR)/$(am__dirstamp) example_unit_test$(EXEEXT): $(example_unit_test_OBJECTS) $(example_unit_test_DEPENDENCIES) $(EXTRA_example_unit_test_DEPENDENCIES) @rm -f example_unit_test$(EXEEXT) $(AM_V_CCLD)$(example_unit_test_LINK) $(example_unit_test_OBJECTS) $(example_unit_test_LDADD) $(LIBS) grub-core/kern/emu/grub_bios_setup-argp_common.$(OBJEXT): \ grub-core/kern/emu/$(am__dirstamp) \ grub-core/kern/emu/$(DEPDIR)/$(am__dirstamp) grub-core/lib/grub_bios_setup-reed_solomon.$(OBJEXT): \ grub-core/lib/$(am__dirstamp) \ grub-core/lib/$(DEPDIR)/$(am__dirstamp) grub-core/osdep/grub_bios_setup-blocklist.$(OBJEXT): \ grub-core/osdep/$(am__dirstamp) \ grub-core/osdep/$(DEPDIR)/$(am__dirstamp) grub-core/osdep/grub_bios_setup-init.$(OBJEXT): \ grub-core/osdep/$(am__dirstamp) \ grub-core/osdep/$(DEPDIR)/$(am__dirstamp) util/grub_bios_setup-grub-setup.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) util/grub_bios_setup-setup_bios.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) grub-bios-setup$(EXEEXT): $(grub_bios_setup_OBJECTS) $(grub_bios_setup_DEPENDENCIES) $(EXTRA_grub_bios_setup_DEPENDENCIES) @rm -f grub-bios-setup$(EXEEXT) $(AM_V_CCLD)$(grub_bios_setup_LINK) $(grub_bios_setup_OBJECTS) $(grub_bios_setup_LDADD) $(LIBS) grub-core/osdep/grub_editenv-compress.$(OBJEXT): \ grub-core/osdep/$(am__dirstamp) \ grub-core/osdep/$(DEPDIR)/$(am__dirstamp) grub-core/osdep/grub_editenv-config.$(OBJEXT): \ grub-core/osdep/$(am__dirstamp) \ grub-core/osdep/$(DEPDIR)/$(am__dirstamp) grub-core/osdep/grub_editenv-init.$(OBJEXT): \ grub-core/osdep/$(am__dirstamp) \ grub-core/osdep/$(DEPDIR)/$(am__dirstamp) util/grub_editenv-config.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) util/grub_editenv-editenv.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) util/grub_editenv-grub-editenv.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) util/grub_editenv-grub-install-common.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) util/grub_editenv-grub-mkimage32.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) util/grub_editenv-grub-mkimage64.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) util/grub_editenv-mkimage.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) util/grub_editenv-resolve.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) grub-editenv$(EXEEXT): $(grub_editenv_OBJECTS) $(grub_editenv_DEPENDENCIES) $(EXTRA_grub_editenv_DEPENDENCIES) @rm -f grub-editenv$(EXEEXT) $(AM_V_CCLD)$(grub_editenv_LINK) $(grub_editenv_OBJECTS) $(grub_editenv_LDADD) $(LIBS) grub-core/commands/grub_file-file.$(OBJEXT): \ grub-core/commands/$(am__dirstamp) \ grub-core/commands/$(DEPDIR)/$(am__dirstamp) grub-core/commands/grub_file-file32.$(OBJEXT): \ grub-core/commands/$(am__dirstamp) \ grub-core/commands/$(DEPDIR)/$(am__dirstamp) grub-core/commands/grub_file-file64.$(OBJEXT): \ grub-core/commands/$(am__dirstamp) \ grub-core/commands/$(DEPDIR)/$(am__dirstamp) grub-core/disk/grub_file-host.$(OBJEXT): \ grub-core/disk/$(am__dirstamp) \ grub-core/disk/$(DEPDIR)/$(am__dirstamp) grub-core/io/grub_file-offset.$(OBJEXT): grub-core/io/$(am__dirstamp) \ grub-core/io/$(DEPDIR)/$(am__dirstamp) grub-core/kern/grub_file-elf.$(OBJEXT): \ grub-core/kern/$(am__dirstamp) \ grub-core/kern/$(DEPDIR)/$(am__dirstamp) grub-core/kern/emu/grub_file-hostfs.$(OBJEXT): \ grub-core/kern/emu/$(am__dirstamp) \ grub-core/kern/emu/$(DEPDIR)/$(am__dirstamp) grub-core/loader/i386/$(am__dirstamp): @$(MKDIR_P) grub-core/loader/i386 @: > grub-core/loader/i386/$(am__dirstamp) grub-core/loader/i386/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) grub-core/loader/i386/$(DEPDIR) @: > grub-core/loader/i386/$(DEPDIR)/$(am__dirstamp) grub-core/loader/i386/grub_file-xen_file.$(OBJEXT): \ grub-core/loader/i386/$(am__dirstamp) \ grub-core/loader/i386/$(DEPDIR)/$(am__dirstamp) grub-core/loader/i386/grub_file-xen_file32.$(OBJEXT): \ grub-core/loader/i386/$(am__dirstamp) \ grub-core/loader/i386/$(DEPDIR)/$(am__dirstamp) grub-core/loader/i386/grub_file-xen_file64.$(OBJEXT): \ grub-core/loader/i386/$(am__dirstamp) \ grub-core/loader/i386/$(DEPDIR)/$(am__dirstamp) grub-core/loader/$(am__dirstamp): @$(MKDIR_P) grub-core/loader @: > grub-core/loader/$(am__dirstamp) grub-core/loader/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) grub-core/loader/$(DEPDIR) @: > grub-core/loader/$(DEPDIR)/$(am__dirstamp) grub-core/loader/grub_file-lzss.$(OBJEXT): \ grub-core/loader/$(am__dirstamp) \ grub-core/loader/$(DEPDIR)/$(am__dirstamp) grub-core/loader/grub_file-macho.$(OBJEXT): \ grub-core/loader/$(am__dirstamp) \ grub-core/loader/$(DEPDIR)/$(am__dirstamp) grub-core/loader/grub_file-macho32.$(OBJEXT): \ grub-core/loader/$(am__dirstamp) \ grub-core/loader/$(DEPDIR)/$(am__dirstamp) grub-core/loader/grub_file-macho64.$(OBJEXT): \ grub-core/loader/$(am__dirstamp) \ grub-core/loader/$(DEPDIR)/$(am__dirstamp) grub-core/osdep/grub_file-init.$(OBJEXT): \ grub-core/osdep/$(am__dirstamp) \ grub-core/osdep/$(DEPDIR)/$(am__dirstamp) util/grub_file-grub-file.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) util/grub_file-render-label.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) grub-file$(EXEEXT): $(grub_file_OBJECTS) $(grub_file_DEPENDENCIES) $(EXTRA_grub_file_DEPENDENCIES) @rm -f grub-file$(EXEEXT) $(AM_V_CCLD)$(grub_file_LINK) $(grub_file_OBJECTS) $(grub_file_LDADD) $(LIBS) grub-core/disk/grub_fstest-host.$(OBJEXT): \ grub-core/disk/$(am__dirstamp) \ grub-core/disk/$(DEPDIR)/$(am__dirstamp) grub-core/kern/emu/grub_fstest-hostfs.$(OBJEXT): \ grub-core/kern/emu/$(am__dirstamp) \ grub-core/kern/emu/$(DEPDIR)/$(am__dirstamp) grub-core/osdep/grub_fstest-init.$(OBJEXT): \ grub-core/osdep/$(am__dirstamp) \ grub-core/osdep/$(DEPDIR)/$(am__dirstamp) util/grub_fstest-grub-fstest.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) grub-fstest$(EXEEXT): $(grub_fstest_OBJECTS) $(grub_fstest_DEPENDENCIES) $(EXTRA_grub_fstest_DEPENDENCIES) @rm -f grub-fstest$(EXEEXT) $(AM_V_CCLD)$(grub_fstest_LINK) $(grub_fstest_OBJECTS) $(grub_fstest_LDADD) $(LIBS) grub-core/kern/emu/grub_glue_efi-argp_common.$(OBJEXT): \ grub-core/kern/emu/$(am__dirstamp) \ grub-core/kern/emu/$(DEPDIR)/$(am__dirstamp) grub-core/osdep/grub_glue_efi-init.$(OBJEXT): \ grub-core/osdep/$(am__dirstamp) \ grub-core/osdep/$(DEPDIR)/$(am__dirstamp) util/grub_glue_efi-glue-efi.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) util/grub_glue_efi-grub-glue-efi.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) grub-glue-efi$(EXEEXT): $(grub_glue_efi_OBJECTS) $(grub_glue_efi_DEPENDENCIES) $(EXTRA_grub_glue_efi_DEPENDENCIES) @rm -f grub-glue-efi$(EXEEXT) $(AM_V_CCLD)$(grub_glue_efi_LINK) $(grub_glue_efi_OBJECTS) $(grub_glue_efi_LDADD) $(LIBS) grub-core/disk/grub_install-host.$(OBJEXT): \ grub-core/disk/$(am__dirstamp) \ grub-core/disk/$(DEPDIR)/$(am__dirstamp) grub-core/kern/emu/grub_install-argp_common.$(OBJEXT): \ grub-core/kern/emu/$(am__dirstamp) \ grub-core/kern/emu/$(DEPDIR)/$(am__dirstamp) grub-core/kern/emu/grub_install-hostfs.$(OBJEXT): \ grub-core/kern/emu/$(am__dirstamp) \ grub-core/kern/emu/$(DEPDIR)/$(am__dirstamp) grub-core/lib/grub_install-reed_solomon.$(OBJEXT): \ grub-core/lib/$(am__dirstamp) \ grub-core/lib/$(DEPDIR)/$(am__dirstamp) grub-core/osdep/grub_install-blocklist.$(OBJEXT): \ grub-core/osdep/$(am__dirstamp) \ grub-core/osdep/$(DEPDIR)/$(am__dirstamp) grub-core/osdep/grub_install-compress.$(OBJEXT): \ grub-core/osdep/$(am__dirstamp) \ grub-core/osdep/$(DEPDIR)/$(am__dirstamp) grub-core/osdep/grub_install-config.$(OBJEXT): \ grub-core/osdep/$(am__dirstamp) \ grub-core/osdep/$(DEPDIR)/$(am__dirstamp) grub-core/osdep/grub_install-init.$(OBJEXT): \ grub-core/osdep/$(am__dirstamp) \ grub-core/osdep/$(DEPDIR)/$(am__dirstamp) grub-core/osdep/grub_install-ofpath.$(OBJEXT): \ grub-core/osdep/$(am__dirstamp) \ grub-core/osdep/$(DEPDIR)/$(am__dirstamp) grub-core/osdep/grub_install-platform.$(OBJEXT): \ grub-core/osdep/$(am__dirstamp) \ grub-core/osdep/$(DEPDIR)/$(am__dirstamp) grub-core/osdep/grub_install-platform_unix.$(OBJEXT): \ grub-core/osdep/$(am__dirstamp) \ grub-core/osdep/$(DEPDIR)/$(am__dirstamp) grub-core/osdep/grub_install-random.$(OBJEXT): \ grub-core/osdep/$(am__dirstamp) \ grub-core/osdep/$(DEPDIR)/$(am__dirstamp) util/grub_install-config.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) util/grub_install-editenv.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) util/grub_install-grub-install-common.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) util/grub_install-grub-install.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) util/grub_install-grub-mkimage32.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) util/grub_install-grub-mkimage64.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) util/grub_install-mkimage.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) util/grub_install-probe.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) util/grub_install-render-label.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) util/grub_install-resolve.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) util/grub_install-setup_bios.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) util/grub_install-setup_sparc.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) grub-install$(EXEEXT): $(grub_install_OBJECTS) $(grub_install_DEPENDENCIES) $(EXTRA_grub_install_DEPENDENCIES) @rm -f grub-install$(EXEEXT) $(AM_V_CCLD)$(grub_install_LINK) $(grub_install_OBJECTS) $(grub_install_LDADD) $(LIBS) grub-core/kern/emu/grub_macbless-argp_common.$(OBJEXT): \ grub-core/kern/emu/$(am__dirstamp) \ grub-core/kern/emu/$(DEPDIR)/$(am__dirstamp) grub-core/osdep/grub_macbless-init.$(OBJEXT): \ grub-core/osdep/$(am__dirstamp) \ grub-core/osdep/$(DEPDIR)/$(am__dirstamp) util/grub_macbless-grub-macbless.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) grub-macbless$(EXEEXT): $(grub_macbless_OBJECTS) $(grub_macbless_DEPENDENCIES) $(EXTRA_grub_macbless_DEPENDENCIES) @rm -f grub-macbless$(EXEEXT) $(AM_V_CCLD)$(grub_macbless_LINK) $(grub_macbless_OBJECTS) $(grub_macbless_LDADD) $(LIBS) util/grub_macho2img-grub-macho2img.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) grub-macho2img$(EXEEXT): $(grub_macho2img_OBJECTS) $(grub_macho2img_DEPENDENCIES) $(EXTRA_grub_macho2img_DEPENDENCIES) @rm -f grub-macho2img$(EXEEXT) $(AM_V_CCLD)$(grub_macho2img_LINK) $(grub_macho2img_OBJECTS) $(grub_macho2img_LDADD) $(LIBS) grub-core/lib/i386/pc/$(am__dirstamp): @$(MKDIR_P) grub-core/lib/i386/pc @: > grub-core/lib/i386/pc/$(am__dirstamp) grub-core/lib/i386/pc/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) grub-core/lib/i386/pc/$(DEPDIR) @: > grub-core/lib/i386/pc/$(DEPDIR)/$(am__dirstamp) grub-core/lib/i386/pc/grub_menulst2cfg-vesa_modes_table.$(OBJEXT): \ grub-core/lib/i386/pc/$(am__dirstamp) \ grub-core/lib/i386/pc/$(DEPDIR)/$(am__dirstamp) grub-core/lib/grub_menulst2cfg-legacy_parse.$(OBJEXT): \ grub-core/lib/$(am__dirstamp) \ grub-core/lib/$(DEPDIR)/$(am__dirstamp) grub-core/osdep/grub_menulst2cfg-init.$(OBJEXT): \ grub-core/osdep/$(am__dirstamp) \ grub-core/osdep/$(DEPDIR)/$(am__dirstamp) util/grub_menulst2cfg-grub-menulst2cfg.$(OBJEXT): \ util/$(am__dirstamp) util/$(DEPDIR)/$(am__dirstamp) grub-menulst2cfg$(EXEEXT): $(grub_menulst2cfg_OBJECTS) $(grub_menulst2cfg_DEPENDENCIES) $(EXTRA_grub_menulst2cfg_DEPENDENCIES) @rm -f grub-menulst2cfg$(EXEEXT) $(AM_V_CCLD)$(grub_menulst2cfg_LINK) $(grub_menulst2cfg_OBJECTS) $(grub_menulst2cfg_LDADD) $(LIBS) grub-core/kern/emu/grub_mkfont-argp_common.$(OBJEXT): \ grub-core/kern/emu/$(am__dirstamp) \ grub-core/kern/emu/$(DEPDIR)/$(am__dirstamp) grub-core/osdep/grub_mkfont-init.$(OBJEXT): \ grub-core/osdep/$(am__dirstamp) \ grub-core/osdep/$(DEPDIR)/$(am__dirstamp) util/grub_mkfont-grub-mkfont.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) grub-mkfont$(EXEEXT): $(grub_mkfont_OBJECTS) $(grub_mkfont_DEPENDENCIES) $(EXTRA_grub_mkfont_DEPENDENCIES) @rm -f grub-mkfont$(EXEEXT) $(AM_V_CCLD)$(grub_mkfont_LINK) $(grub_mkfont_OBJECTS) $(grub_mkfont_LDADD) $(LIBS) grub-core/kern/emu/grub_mkimage-argp_common.$(OBJEXT): \ grub-core/kern/emu/$(am__dirstamp) \ grub-core/kern/emu/$(DEPDIR)/$(am__dirstamp) grub-core/osdep/grub_mkimage-config.$(OBJEXT): \ grub-core/osdep/$(am__dirstamp) \ grub-core/osdep/$(DEPDIR)/$(am__dirstamp) grub-core/osdep/grub_mkimage-init.$(OBJEXT): \ grub-core/osdep/$(am__dirstamp) \ grub-core/osdep/$(DEPDIR)/$(am__dirstamp) util/grub_mkimage-config.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) util/grub_mkimage-grub-mkimage.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) util/grub_mkimage-grub-mkimage32.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) util/grub_mkimage-grub-mkimage64.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) util/grub_mkimage-mkimage.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) util/grub_mkimage-resolve.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) grub-mkimage$(EXEEXT): $(grub_mkimage_OBJECTS) $(grub_mkimage_DEPENDENCIES) $(EXTRA_grub_mkimage_DEPENDENCIES) @rm -f grub-mkimage$(EXEEXT) $(AM_V_CCLD)$(grub_mkimage_LINK) $(grub_mkimage_OBJECTS) $(grub_mkimage_LDADD) $(LIBS) grub-core/kern/emu/grub_mklayout-argp_common.$(OBJEXT): \ grub-core/kern/emu/$(am__dirstamp) \ grub-core/kern/emu/$(DEPDIR)/$(am__dirstamp) grub-core/osdep/grub_mklayout-init.$(OBJEXT): \ grub-core/osdep/$(am__dirstamp) \ grub-core/osdep/$(DEPDIR)/$(am__dirstamp) util/grub_mklayout-grub-mklayout.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) grub-mklayout$(EXEEXT): $(grub_mklayout_OBJECTS) $(grub_mklayout_DEPENDENCIES) $(EXTRA_grub_mklayout_DEPENDENCIES) @rm -f grub-mklayout$(EXEEXT) $(AM_V_CCLD)$(grub_mklayout_LINK) $(grub_mklayout_OBJECTS) $(grub_mklayout_LDADD) $(LIBS) grub-core/kern/emu/grub_mknetdir-argp_common.$(OBJEXT): \ grub-core/kern/emu/$(am__dirstamp) \ grub-core/kern/emu/$(DEPDIR)/$(am__dirstamp) grub-core/lib/grub_mknetdir-reed_solomon.$(OBJEXT): \ grub-core/lib/$(am__dirstamp) \ grub-core/lib/$(DEPDIR)/$(am__dirstamp) grub-core/osdep/grub_mknetdir-blocklist.$(OBJEXT): \ grub-core/osdep/$(am__dirstamp) \ grub-core/osdep/$(DEPDIR)/$(am__dirstamp) grub-core/osdep/grub_mknetdir-compress.$(OBJEXT): \ grub-core/osdep/$(am__dirstamp) \ grub-core/osdep/$(DEPDIR)/$(am__dirstamp) grub-core/osdep/grub_mknetdir-config.$(OBJEXT): \ grub-core/osdep/$(am__dirstamp) \ grub-core/osdep/$(DEPDIR)/$(am__dirstamp) grub-core/osdep/grub_mknetdir-init.$(OBJEXT): \ grub-core/osdep/$(am__dirstamp) \ grub-core/osdep/$(DEPDIR)/$(am__dirstamp) grub-core/osdep/grub_mknetdir-ofpath.$(OBJEXT): \ grub-core/osdep/$(am__dirstamp) \ grub-core/osdep/$(DEPDIR)/$(am__dirstamp) grub-core/osdep/grub_mknetdir-platform.$(OBJEXT): \ grub-core/osdep/$(am__dirstamp) \ grub-core/osdep/$(DEPDIR)/$(am__dirstamp) grub-core/osdep/grub_mknetdir-platform_unix.$(OBJEXT): \ grub-core/osdep/$(am__dirstamp) \ grub-core/osdep/$(DEPDIR)/$(am__dirstamp) grub-core/osdep/grub_mknetdir-random.$(OBJEXT): \ grub-core/osdep/$(am__dirstamp) \ grub-core/osdep/$(DEPDIR)/$(am__dirstamp) util/grub_mknetdir-config.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) util/grub_mknetdir-editenv.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) util/grub_mknetdir-grub-install-common.$(OBJEXT): \ util/$(am__dirstamp) util/$(DEPDIR)/$(am__dirstamp) util/grub_mknetdir-grub-mkimage32.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) util/grub_mknetdir-grub-mkimage64.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) util/grub_mknetdir-grub-mknetdir.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) util/grub_mknetdir-mkimage.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) util/grub_mknetdir-resolve.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) util/grub_mknetdir-setup_bios.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) util/grub_mknetdir-setup_sparc.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) grub-mknetdir$(EXEEXT): $(grub_mknetdir_OBJECTS) $(grub_mknetdir_DEPENDENCIES) $(EXTRA_grub_mknetdir_DEPENDENCIES) @rm -f grub-mknetdir$(EXEEXT) $(AM_V_CCLD)$(grub_mknetdir_LINK) $(grub_mknetdir_OBJECTS) $(grub_mknetdir_LDADD) $(LIBS) grub-core/kern/emu/grub_mkpasswd_pbkdf2-argp_common.$(OBJEXT): \ grub-core/kern/emu/$(am__dirstamp) \ grub-core/kern/emu/$(DEPDIR)/$(am__dirstamp) grub-core/osdep/grub_mkpasswd_pbkdf2-init.$(OBJEXT): \ grub-core/osdep/$(am__dirstamp) \ grub-core/osdep/$(DEPDIR)/$(am__dirstamp) grub-core/osdep/grub_mkpasswd_pbkdf2-random.$(OBJEXT): \ grub-core/osdep/$(am__dirstamp) \ grub-core/osdep/$(DEPDIR)/$(am__dirstamp) util/grub_mkpasswd_pbkdf2-grub-mkpasswd-pbkdf2.$(OBJEXT): \ util/$(am__dirstamp) util/$(DEPDIR)/$(am__dirstamp) grub-mkpasswd-pbkdf2$(EXEEXT): $(grub_mkpasswd_pbkdf2_OBJECTS) $(grub_mkpasswd_pbkdf2_DEPENDENCIES) $(EXTRA_grub_mkpasswd_pbkdf2_DEPENDENCIES) @rm -f grub-mkpasswd-pbkdf2$(EXEEXT) $(AM_V_CCLD)$(grub_mkpasswd_pbkdf2_LINK) $(grub_mkpasswd_pbkdf2_OBJECTS) $(grub_mkpasswd_pbkdf2_LDADD) $(LIBS) grub-core/kern/emu/grub_mkrelpath-argp_common.$(OBJEXT): \ grub-core/kern/emu/$(am__dirstamp) \ grub-core/kern/emu/$(DEPDIR)/$(am__dirstamp) grub-core/osdep/grub_mkrelpath-init.$(OBJEXT): \ grub-core/osdep/$(am__dirstamp) \ grub-core/osdep/$(DEPDIR)/$(am__dirstamp) util/grub_mkrelpath-grub-mkrelpath.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) grub-mkrelpath$(EXEEXT): $(grub_mkrelpath_OBJECTS) $(grub_mkrelpath_DEPENDENCIES) $(EXTRA_grub_mkrelpath_DEPENDENCIES) @rm -f grub-mkrelpath$(EXEEXT) $(AM_V_CCLD)$(grub_mkrelpath_LINK) $(grub_mkrelpath_OBJECTS) $(grub_mkrelpath_LDADD) $(LIBS) grub-core/disk/grub_mkrescue-host.$(OBJEXT): \ grub-core/disk/$(am__dirstamp) \ grub-core/disk/$(DEPDIR)/$(am__dirstamp) grub-core/kern/emu/grub_mkrescue-argp_common.$(OBJEXT): \ grub-core/kern/emu/$(am__dirstamp) \ grub-core/kern/emu/$(DEPDIR)/$(am__dirstamp) grub-core/kern/emu/grub_mkrescue-hostfs.$(OBJEXT): \ grub-core/kern/emu/$(am__dirstamp) \ grub-core/kern/emu/$(DEPDIR)/$(am__dirstamp) grub-core/lib/grub_mkrescue-reed_solomon.$(OBJEXT): \ grub-core/lib/$(am__dirstamp) \ grub-core/lib/$(DEPDIR)/$(am__dirstamp) grub-core/osdep/grub_mkrescue-blocklist.$(OBJEXT): \ grub-core/osdep/$(am__dirstamp) \ grub-core/osdep/$(DEPDIR)/$(am__dirstamp) grub-core/osdep/grub_mkrescue-compress.$(OBJEXT): \ grub-core/osdep/$(am__dirstamp) \ grub-core/osdep/$(DEPDIR)/$(am__dirstamp) grub-core/osdep/grub_mkrescue-config.$(OBJEXT): \ grub-core/osdep/$(am__dirstamp) \ grub-core/osdep/$(DEPDIR)/$(am__dirstamp) grub-core/osdep/grub_mkrescue-init.$(OBJEXT): \ grub-core/osdep/$(am__dirstamp) \ grub-core/osdep/$(DEPDIR)/$(am__dirstamp) grub-core/osdep/grub_mkrescue-ofpath.$(OBJEXT): \ grub-core/osdep/$(am__dirstamp) \ grub-core/osdep/$(DEPDIR)/$(am__dirstamp) grub-core/osdep/grub_mkrescue-platform.$(OBJEXT): \ grub-core/osdep/$(am__dirstamp) \ grub-core/osdep/$(DEPDIR)/$(am__dirstamp) grub-core/osdep/grub_mkrescue-platform_unix.$(OBJEXT): \ grub-core/osdep/$(am__dirstamp) \ grub-core/osdep/$(DEPDIR)/$(am__dirstamp) grub-core/osdep/grub_mkrescue-random.$(OBJEXT): \ grub-core/osdep/$(am__dirstamp) \ grub-core/osdep/$(DEPDIR)/$(am__dirstamp) util/grub_mkrescue-config.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) util/grub_mkrescue-editenv.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) util/grub_mkrescue-glue-efi.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) util/grub_mkrescue-grub-install-common.$(OBJEXT): \ util/$(am__dirstamp) util/$(DEPDIR)/$(am__dirstamp) util/grub_mkrescue-grub-mkimage32.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) util/grub_mkrescue-grub-mkimage64.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) util/grub_mkrescue-grub-mkrescue.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) util/grub_mkrescue-mkimage.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) util/grub_mkrescue-render-label.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) util/grub_mkrescue-resolve.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) util/grub_mkrescue-setup_bios.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) util/grub_mkrescue-setup_sparc.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) grub-mkrescue$(EXEEXT): $(grub_mkrescue_OBJECTS) $(grub_mkrescue_DEPENDENCIES) $(EXTRA_grub_mkrescue_DEPENDENCIES) @rm -f grub-mkrescue$(EXEEXT) $(AM_V_CCLD)$(grub_mkrescue_LINK) $(grub_mkrescue_OBJECTS) $(grub_mkrescue_LDADD) $(LIBS) grub-core/disk/grub_mkstandalone-host.$(OBJEXT): \ grub-core/disk/$(am__dirstamp) \ grub-core/disk/$(DEPDIR)/$(am__dirstamp) grub-core/kern/emu/grub_mkstandalone-argp_common.$(OBJEXT): \ grub-core/kern/emu/$(am__dirstamp) \ grub-core/kern/emu/$(DEPDIR)/$(am__dirstamp) grub-core/kern/emu/grub_mkstandalone-hostfs.$(OBJEXT): \ grub-core/kern/emu/$(am__dirstamp) \ grub-core/kern/emu/$(DEPDIR)/$(am__dirstamp) grub-core/lib/grub_mkstandalone-reed_solomon.$(OBJEXT): \ grub-core/lib/$(am__dirstamp) \ grub-core/lib/$(DEPDIR)/$(am__dirstamp) grub-core/osdep/grub_mkstandalone-blocklist.$(OBJEXT): \ grub-core/osdep/$(am__dirstamp) \ grub-core/osdep/$(DEPDIR)/$(am__dirstamp) grub-core/osdep/grub_mkstandalone-compress.$(OBJEXT): \ grub-core/osdep/$(am__dirstamp) \ grub-core/osdep/$(DEPDIR)/$(am__dirstamp) grub-core/osdep/grub_mkstandalone-config.$(OBJEXT): \ grub-core/osdep/$(am__dirstamp) \ grub-core/osdep/$(DEPDIR)/$(am__dirstamp) grub-core/osdep/grub_mkstandalone-init.$(OBJEXT): \ grub-core/osdep/$(am__dirstamp) \ grub-core/osdep/$(DEPDIR)/$(am__dirstamp) grub-core/osdep/grub_mkstandalone-ofpath.$(OBJEXT): \ grub-core/osdep/$(am__dirstamp) \ grub-core/osdep/$(DEPDIR)/$(am__dirstamp) grub-core/osdep/grub_mkstandalone-platform.$(OBJEXT): \ grub-core/osdep/$(am__dirstamp) \ grub-core/osdep/$(DEPDIR)/$(am__dirstamp) grub-core/osdep/grub_mkstandalone-platform_unix.$(OBJEXT): \ grub-core/osdep/$(am__dirstamp) \ grub-core/osdep/$(DEPDIR)/$(am__dirstamp) grub-core/osdep/grub_mkstandalone-random.$(OBJEXT): \ grub-core/osdep/$(am__dirstamp) \ grub-core/osdep/$(DEPDIR)/$(am__dirstamp) util/grub_mkstandalone-config.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) util/grub_mkstandalone-editenv.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) util/grub_mkstandalone-glue-efi.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) util/grub_mkstandalone-grub-install-common.$(OBJEXT): \ util/$(am__dirstamp) util/$(DEPDIR)/$(am__dirstamp) util/grub_mkstandalone-grub-mkimage32.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) util/grub_mkstandalone-grub-mkimage64.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) util/grub_mkstandalone-grub-mkstandalone.$(OBJEXT): \ util/$(am__dirstamp) util/$(DEPDIR)/$(am__dirstamp) util/grub_mkstandalone-mkimage.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) util/grub_mkstandalone-render-label.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) util/grub_mkstandalone-resolve.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) util/grub_mkstandalone-setup_bios.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) util/grub_mkstandalone-setup_sparc.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) grub-mkstandalone$(EXEEXT): $(grub_mkstandalone_OBJECTS) $(grub_mkstandalone_DEPENDENCIES) $(EXTRA_grub_mkstandalone_DEPENDENCIES) @rm -f grub-mkstandalone$(EXEEXT) $(AM_V_CCLD)$(grub_mkstandalone_LINK) $(grub_mkstandalone_OBJECTS) $(grub_mkstandalone_LDADD) $(LIBS) grub-core/disk/grub_mount-host.$(OBJEXT): \ grub-core/disk/$(am__dirstamp) \ grub-core/disk/$(DEPDIR)/$(am__dirstamp) grub-core/kern/emu/grub_mount-hostfs.$(OBJEXT): \ grub-core/kern/emu/$(am__dirstamp) \ grub-core/kern/emu/$(DEPDIR)/$(am__dirstamp) grub-core/osdep/grub_mount-init.$(OBJEXT): \ grub-core/osdep/$(am__dirstamp) \ grub-core/osdep/$(DEPDIR)/$(am__dirstamp) util/grub_mount-grub-mount.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) grub-mount$(EXEEXT): $(grub_mount_OBJECTS) $(grub_mount_DEPENDENCIES) $(EXTRA_grub_mount_DEPENDENCIES) @rm -f grub-mount$(EXEEXT) $(AM_V_CCLD)$(grub_mount_LINK) $(grub_mount_OBJECTS) $(grub_mount_LDADD) $(LIBS) grub-core/osdep/grub_ofpathname-init.$(OBJEXT): \ grub-core/osdep/$(am__dirstamp) \ grub-core/osdep/$(DEPDIR)/$(am__dirstamp) grub-core/osdep/grub_ofpathname-ofpath.$(OBJEXT): \ grub-core/osdep/$(am__dirstamp) \ grub-core/osdep/$(DEPDIR)/$(am__dirstamp) util/ieee1275/$(am__dirstamp): @$(MKDIR_P) util/ieee1275 @: > util/ieee1275/$(am__dirstamp) util/ieee1275/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) util/ieee1275/$(DEPDIR) @: > util/ieee1275/$(DEPDIR)/$(am__dirstamp) util/ieee1275/grub_ofpathname-grub-ofpathname.$(OBJEXT): \ util/ieee1275/$(am__dirstamp) \ util/ieee1275/$(DEPDIR)/$(am__dirstamp) grub-ofpathname$(EXEEXT): $(grub_ofpathname_OBJECTS) $(grub_ofpathname_DEPENDENCIES) $(EXTRA_grub_ofpathname_DEPENDENCIES) @rm -f grub-ofpathname$(EXEEXT) $(AM_V_CCLD)$(grub_ofpathname_LINK) $(grub_ofpathname_OBJECTS) $(grub_ofpathname_LDADD) $(LIBS) grub-core/kern/emu/grub_probe-argp_common.$(OBJEXT): \ grub-core/kern/emu/$(am__dirstamp) \ grub-core/kern/emu/$(DEPDIR)/$(am__dirstamp) grub-core/osdep/grub_probe-init.$(OBJEXT): \ grub-core/osdep/$(am__dirstamp) \ grub-core/osdep/$(DEPDIR)/$(am__dirstamp) grub-core/osdep/grub_probe-ofpath.$(OBJEXT): \ grub-core/osdep/$(am__dirstamp) \ grub-core/osdep/$(DEPDIR)/$(am__dirstamp) util/grub_probe-grub-probe.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) util/grub_probe-probe.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) grub-probe$(EXEEXT): $(grub_probe_OBJECTS) $(grub_probe_DEPENDENCIES) $(EXTRA_grub_probe_DEPENDENCIES) @rm -f grub-probe$(EXEEXT) $(AM_V_CCLD)$(grub_probe_LINK) $(grub_probe_OBJECTS) $(grub_probe_LDADD) $(LIBS) grub-core/commands/tpm2_key_protector/$(am__dirstamp): @$(MKDIR_P) grub-core/commands/tpm2_key_protector @: > grub-core/commands/tpm2_key_protector/$(am__dirstamp) grub-core/commands/tpm2_key_protector/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) grub-core/commands/tpm2_key_protector/$(DEPDIR) @: > grub-core/commands/tpm2_key_protector/$(DEPDIR)/$(am__dirstamp) grub-core/commands/tpm2_key_protector/grub_protect-args.$(OBJEXT): \ grub-core/commands/tpm2_key_protector/$(am__dirstamp) \ grub-core/commands/tpm2_key_protector/$(DEPDIR)/$(am__dirstamp) grub-core/commands/tpm2_key_protector/grub_protect-tpm2key_asn1_tab.$(OBJEXT): \ grub-core/commands/tpm2_key_protector/$(am__dirstamp) \ grub-core/commands/tpm2_key_protector/$(DEPDIR)/$(am__dirstamp) grub-core/kern/emu/grub_protect-argp_common.$(OBJEXT): \ grub-core/kern/emu/$(am__dirstamp) \ grub-core/kern/emu/$(DEPDIR)/$(am__dirstamp) grub-core/lib/tss2/$(am__dirstamp): @$(MKDIR_P) grub-core/lib/tss2 @: > grub-core/lib/tss2/$(am__dirstamp) grub-core/lib/tss2/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) grub-core/lib/tss2/$(DEPDIR) @: > grub-core/lib/tss2/$(DEPDIR)/$(am__dirstamp) grub-core/lib/tss2/grub_protect-buffer.$(OBJEXT): \ grub-core/lib/tss2/$(am__dirstamp) \ grub-core/lib/tss2/$(DEPDIR)/$(am__dirstamp) grub-core/lib/tss2/grub_protect-tpm2_cmd.$(OBJEXT): \ grub-core/lib/tss2/$(am__dirstamp) \ grub-core/lib/tss2/$(DEPDIR)/$(am__dirstamp) grub-core/lib/tss2/grub_protect-tss2_mu.$(OBJEXT): \ grub-core/lib/tss2/$(am__dirstamp) \ grub-core/lib/tss2/$(DEPDIR)/$(am__dirstamp) grub-core/osdep/grub_protect-init.$(OBJEXT): \ grub-core/osdep/$(am__dirstamp) \ grub-core/osdep/$(DEPDIR)/$(am__dirstamp) util/grub_protect-grub-protect.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) util/grub_protect-probe.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) grub-protect$(EXEEXT): $(grub_protect_OBJECTS) $(grub_protect_DEPENDENCIES) $(EXTRA_grub_protect_DEPENDENCIES) @rm -f grub-protect$(EXEEXT) $(AM_V_CCLD)$(grub_protect_LINK) $(grub_protect_OBJECTS) $(grub_protect_LDADD) $(LIBS) grub-core/disk/grub_render_label-host.$(OBJEXT): \ grub-core/disk/$(am__dirstamp) \ grub-core/disk/$(DEPDIR)/$(am__dirstamp) grub-core/kern/emu/grub_render_label-argp_common.$(OBJEXT): \ grub-core/kern/emu/$(am__dirstamp) \ grub-core/kern/emu/$(DEPDIR)/$(am__dirstamp) grub-core/kern/emu/grub_render_label-hostfs.$(OBJEXT): \ grub-core/kern/emu/$(am__dirstamp) \ grub-core/kern/emu/$(DEPDIR)/$(am__dirstamp) grub-core/osdep/grub_render_label-init.$(OBJEXT): \ grub-core/osdep/$(am__dirstamp) \ grub-core/osdep/$(DEPDIR)/$(am__dirstamp) util/grub_render_label-grub-render-label.$(OBJEXT): \ util/$(am__dirstamp) util/$(DEPDIR)/$(am__dirstamp) util/grub_render_label-render-label.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) grub-render-label$(EXEEXT): $(grub_render_label_OBJECTS) $(grub_render_label_DEPENDENCIES) $(EXTRA_grub_render_label_DEPENDENCIES) @rm -f grub-render-label$(EXEEXT) $(AM_V_CCLD)$(grub_render_label_LINK) $(grub_render_label_OBJECTS) $(grub_render_label_LDADD) $(LIBS) grub-core/kern/emu/grub_script_check-argp_common.$(OBJEXT): \ grub-core/kern/emu/$(am__dirstamp) \ grub-core/kern/emu/$(DEPDIR)/$(am__dirstamp) grub-core/osdep/grub_script_check-init.$(OBJEXT): \ grub-core/osdep/$(am__dirstamp) \ grub-core/osdep/$(DEPDIR)/$(am__dirstamp) util/grub_script_check-grub-script-check.$(OBJEXT): \ util/$(am__dirstamp) util/$(DEPDIR)/$(am__dirstamp) grub-script-check$(EXEEXT): $(grub_script_check_OBJECTS) $(grub_script_check_DEPENDENCIES) $(EXTRA_grub_script_check_DEPENDENCIES) @rm -f grub-script-check$(EXEEXT) $(AM_V_CCLD)$(grub_script_check_LINK) $(grub_script_check_OBJECTS) $(grub_script_check_LDADD) $(LIBS) grub-core/kern/emu/grub_sparc64_setup-argp_common.$(OBJEXT): \ grub-core/kern/emu/$(am__dirstamp) \ grub-core/kern/emu/$(DEPDIR)/$(am__dirstamp) grub-core/lib/grub_sparc64_setup-reed_solomon.$(OBJEXT): \ grub-core/lib/$(am__dirstamp) \ grub-core/lib/$(DEPDIR)/$(am__dirstamp) grub-core/osdep/grub_sparc64_setup-blocklist.$(OBJEXT): \ grub-core/osdep/$(am__dirstamp) \ grub-core/osdep/$(DEPDIR)/$(am__dirstamp) grub-core/osdep/grub_sparc64_setup-init.$(OBJEXT): \ grub-core/osdep/$(am__dirstamp) \ grub-core/osdep/$(DEPDIR)/$(am__dirstamp) grub-core/osdep/grub_sparc64_setup-ofpath.$(OBJEXT): \ grub-core/osdep/$(am__dirstamp) \ grub-core/osdep/$(DEPDIR)/$(am__dirstamp) util/grub_sparc64_setup-grub-setup.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) util/grub_sparc64_setup-setup_sparc.$(OBJEXT): util/$(am__dirstamp) \ util/$(DEPDIR)/$(am__dirstamp) grub-sparc64-setup$(EXEEXT): $(grub_sparc64_setup_OBJECTS) $(grub_sparc64_setup_DEPENDENCIES) $(EXTRA_grub_sparc64_setup_DEPENDENCIES) @rm -f grub-sparc64-setup$(EXEEXT) $(AM_V_CCLD)$(grub_sparc64_setup_LINK) $(grub_sparc64_setup_OBJECTS) $(grub_sparc64_setup_LDADD) $(LIBS) grub-core/disk/grub_syslinux2cfg-host.$(OBJEXT): \ grub-core/disk/$(am__dirstamp) \ grub-core/disk/$(DEPDIR)/$(am__dirstamp) grub-core/kern/emu/grub_syslinux2cfg-argp_common.$(OBJEXT): \ grub-core/kern/emu/$(am__dirstamp) \ grub-core/kern/emu/$(DEPDIR)/$(am__dirstamp) grub-core/kern/emu/grub_syslinux2cfg-hostfs.$(OBJEXT): \ grub-core/kern/emu/$(am__dirstamp) \ grub-core/kern/emu/$(DEPDIR)/$(am__dirstamp) grub-core/lib/grub_syslinux2cfg-getline.$(OBJEXT): \ grub-core/lib/$(am__dirstamp) \ grub-core/lib/$(DEPDIR)/$(am__dirstamp) grub-core/lib/grub_syslinux2cfg-syslinux_parse.$(OBJEXT): \ grub-core/lib/$(am__dirstamp) \ grub-core/lib/$(DEPDIR)/$(am__dirstamp) grub-core/osdep/grub_syslinux2cfg-init.$(OBJEXT): \ grub-core/osdep/$(am__dirstamp) \ grub-core/osdep/$(DEPDIR)/$(am__dirstamp) util/grub_syslinux2cfg-grub-syslinux2cfg.$(OBJEXT): \ util/$(am__dirstamp) util/$(DEPDIR)/$(am__dirstamp) grub-syslinux2cfg$(EXEEXT): $(grub_syslinux2cfg_OBJECTS) $(grub_syslinux2cfg_DEPENDENCIES) $(EXTRA_grub_syslinux2cfg_DEPENDENCIES) @rm -f grub-syslinux2cfg$(EXEEXT) $(AM_V_CCLD)$(grub_syslinux2cfg_LINK) $(grub_syslinux2cfg_OBJECTS) $(grub_syslinux2cfg_LDADD) $(LIBS) grub-core/kern/printf_test-list.$(OBJEXT): \ grub-core/kern/$(am__dirstamp) \ grub-core/kern/$(DEPDIR)/$(am__dirstamp) grub-core/kern/printf_test-misc.$(OBJEXT): \ grub-core/kern/$(am__dirstamp) \ grub-core/kern/$(DEPDIR)/$(am__dirstamp) grub-core/tests/lib/printf_test-test.$(OBJEXT): \ grub-core/tests/lib/$(am__dirstamp) \ grub-core/tests/lib/$(DEPDIR)/$(am__dirstamp) tests/lib/printf_test-unit_test.$(OBJEXT): tests/lib/$(am__dirstamp) \ tests/lib/$(DEPDIR)/$(am__dirstamp) tests/printf_test-printf_unit_test.$(OBJEXT): tests/$(am__dirstamp) \ tests/$(DEPDIR)/$(am__dirstamp) printf_test$(EXEEXT): $(printf_test_OBJECTS) $(printf_test_DEPENDENCIES) $(EXTRA_printf_test_DEPENDENCIES) @rm -f printf_test$(EXEEXT) $(AM_V_CCLD)$(printf_test_LINK) $(printf_test_OBJECTS) $(printf_test_LDADD) $(LIBS) grub-core/kern/priority_queue_unit_test-list.$(OBJEXT): \ grub-core/kern/$(am__dirstamp) \ grub-core/kern/$(DEPDIR)/$(am__dirstamp) grub-core/kern/priority_queue_unit_test-misc.$(OBJEXT): \ grub-core/kern/$(am__dirstamp) \ grub-core/kern/$(DEPDIR)/$(am__dirstamp) grub-core/lib/priority_queue_unit_test-priority_queue.$(OBJEXT): \ grub-core/lib/$(am__dirstamp) \ grub-core/lib/$(DEPDIR)/$(am__dirstamp) grub-core/tests/lib/priority_queue_unit_test-test.$(OBJEXT): \ grub-core/tests/lib/$(am__dirstamp) \ grub-core/tests/lib/$(DEPDIR)/$(am__dirstamp) tests/lib/priority_queue_unit_test-unit_test.$(OBJEXT): \ tests/lib/$(am__dirstamp) tests/lib/$(DEPDIR)/$(am__dirstamp) tests/priority_queue_unit_test-priority_queue_unit_test.$(OBJEXT): \ tests/$(am__dirstamp) tests/$(DEPDIR)/$(am__dirstamp) priority_queue_unit_test$(EXEEXT): $(priority_queue_unit_test_OBJECTS) $(priority_queue_unit_test_DEPENDENCIES) $(EXTRA_priority_queue_unit_test_DEPENDENCIES) @rm -f priority_queue_unit_test$(EXEEXT) $(AM_V_CXXLD)$(priority_queue_unit_test_LINK) $(priority_queue_unit_test_OBJECTS) $(priority_queue_unit_test_LDADD) $(LIBS) install-binSCRIPTS: $(bin_SCRIPTS) @$(NORMAL_INSTALL) @list='$(bin_SCRIPTS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(bin_SCRIPTS)'; test -n "$(bindir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ dir='$(DESTDIR)$(bindir)'; $(am__uninstall_files_from_dir) install-grubconfSCRIPTS: $(grubconf_SCRIPTS) @$(NORMAL_INSTALL) @list='$(grubconf_SCRIPTS)'; test -n "$(grubconfdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(grubconfdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(grubconfdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(grubconfdir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(grubconfdir)$$dir" || exit $$?; \ } \ ; done uninstall-grubconfSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(grubconf_SCRIPTS)'; test -n "$(grubconfdir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ dir='$(DESTDIR)$(grubconfdir)'; $(am__uninstall_files_from_dir) install-platformSCRIPTS: $(platform_SCRIPTS) @$(NORMAL_INSTALL) @list='$(platform_SCRIPTS)'; test -n "$(platformdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(platformdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(platformdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(platformdir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(platformdir)$$dir" || exit $$?; \ } \ ; done uninstall-platformSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(platform_SCRIPTS)'; test -n "$(platformdir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ dir='$(DESTDIR)$(platformdir)'; $(am__uninstall_files_from_dir) install-sbinSCRIPTS: $(sbin_SCRIPTS) @$(NORMAL_INSTALL) @list='$(sbin_SCRIPTS)'; test -n "$(sbindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(sbindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(sbindir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(sbindir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(sbindir)$$dir" || exit $$?; \ } \ ; done uninstall-sbinSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(sbin_SCRIPTS)'; test -n "$(sbindir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ dir='$(DESTDIR)$(sbindir)'; $(am__uninstall_files_from_dir) mostlyclean-compile: -rm -f *.$(OBJEXT) -rm -f grub-core/*.$(OBJEXT) -rm -f grub-core/commands/*.$(OBJEXT) -rm -f grub-core/commands/tpm2_key_protector/*.$(OBJEXT) -rm -f grub-core/disk/*.$(OBJEXT) -rm -f grub-core/font/*.$(OBJEXT) -rm -f grub-core/fs/*.$(OBJEXT) -rm -f grub-core/fs/zfs/*.$(OBJEXT) -rm -f grub-core/gfxmenu/*.$(OBJEXT) -rm -f grub-core/io/*.$(OBJEXT) -rm -f grub-core/kern/*.$(OBJEXT) -rm -f grub-core/kern/arm/*.$(OBJEXT) -rm -f grub-core/kern/arm64/*.$(OBJEXT) -rm -f grub-core/kern/emu/*.$(OBJEXT) -rm -f grub-core/kern/ia64/*.$(OBJEXT) -rm -f grub-core/kern/loongarch64/*.$(OBJEXT) -rm -f grub-core/lib/*.$(OBJEXT) -rm -f grub-core/lib/i386/pc/*.$(OBJEXT) -rm -f grub-core/lib/json/*.$(OBJEXT) -rm -f grub-core/lib/libgcrypt-grub/cipher/*.$(OBJEXT) -rm -f grub-core/lib/libgcrypt-grub/src/*.$(OBJEXT) -rm -f grub-core/lib/minilzo/*.$(OBJEXT) -rm -f grub-core/lib/tss2/*.$(OBJEXT) -rm -f grub-core/lib/xzembed/*.$(OBJEXT) -rm -f grub-core/lib/zstd/*.$(OBJEXT) -rm -f grub-core/loader/*.$(OBJEXT) -rm -f grub-core/loader/i386/*.$(OBJEXT) -rm -f grub-core/normal/*.$(OBJEXT) -rm -f grub-core/osdep/*.$(OBJEXT) -rm -f grub-core/osdep/devmapper/*.$(OBJEXT) -rm -f grub-core/osdep/unix/*.$(OBJEXT) -rm -f grub-core/partmap/*.$(OBJEXT) -rm -f grub-core/script/*.$(OBJEXT) -rm -f grub-core/tests/lib/*.$(OBJEXT) -rm -f grub-core/video/*.$(OBJEXT) -rm -f grub-core/video/fb/*.$(OBJEXT) -rm -f tests/*.$(OBJEXT) -rm -f tests/lib/*.$(OBJEXT) -rm -f util/*.$(OBJEXT) -rm -f util/ieee1275/*.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/grub_fstest-grub_fstest_init.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/grub_mount-grub_fstest_init.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgrubmods_a-grub_script.tab.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgrubmods_a-grub_script.yy.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgrubmods_a-libgrub_a_init.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/$(DEPDIR)/libgrubmods_a-unidata.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/commands/$(DEPDIR)/grub_file-file.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/commands/$(DEPDIR)/grub_file-file32.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/commands/$(DEPDIR)/grub_file-file64.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/commands/$(DEPDIR)/libgrubkern_a-extcmd.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/commands/$(DEPDIR)/libgrubmods_a-blocklist.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/commands/$(DEPDIR)/libgrubmods_a-ls.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/commands/$(DEPDIR)/libgrubmods_a-macbless.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/commands/$(DEPDIR)/libgrubmods_a-testload.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/commands/$(DEPDIR)/libgrubmods_a-xnu_uuid.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/commands/tpm2_key_protector/$(DEPDIR)/grub_protect-args.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/commands/tpm2_key_protector/$(DEPDIR)/grub_protect-tpm2key_asn1_tab.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/disk/$(DEPDIR)/grub_file-host.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/disk/$(DEPDIR)/grub_fstest-host.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/disk/$(DEPDIR)/grub_install-host.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/disk/$(DEPDIR)/grub_mkrescue-host.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/disk/$(DEPDIR)/grub_mkstandalone-host.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/disk/$(DEPDIR)/grub_mount-host.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/disk/$(DEPDIR)/grub_render_label-host.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/disk/$(DEPDIR)/grub_syslinux2cfg-host.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/disk/$(DEPDIR)/libgrubkern_a-AFSplitter.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/disk/$(DEPDIR)/libgrubkern_a-cryptodisk.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/disk/$(DEPDIR)/libgrubkern_a-diskfilter.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/disk/$(DEPDIR)/libgrubkern_a-geli.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/disk/$(DEPDIR)/libgrubkern_a-key_protector.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/disk/$(DEPDIR)/libgrubkern_a-ldm.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/disk/$(DEPDIR)/libgrubkern_a-luks.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/disk/$(DEPDIR)/libgrubkern_a-luks2.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/disk/$(DEPDIR)/libgrubmods_a-dmraid_nvidia.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/disk/$(DEPDIR)/libgrubmods_a-loopback.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/disk/$(DEPDIR)/libgrubmods_a-lvm.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/disk/$(DEPDIR)/libgrubmods_a-mdraid1x_linux.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/disk/$(DEPDIR)/libgrubmods_a-mdraid_linux.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/disk/$(DEPDIR)/libgrubmods_a-mdraid_linux_be.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/disk/$(DEPDIR)/libgrubmods_a-raid5_recover.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/disk/$(DEPDIR)/libgrubmods_a-raid6_recover.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/font/$(DEPDIR)/libgrubmods_a-font.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/fs/$(DEPDIR)/libgrubkern_a-archelp.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/fs/$(DEPDIR)/libgrubkern_a-proc.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/fs/$(DEPDIR)/libgrubmods_a-affs.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/fs/$(DEPDIR)/libgrubmods_a-afs.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/fs/$(DEPDIR)/libgrubmods_a-bfs.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/fs/$(DEPDIR)/libgrubmods_a-btrfs.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/fs/$(DEPDIR)/libgrubmods_a-cbfs.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/fs/$(DEPDIR)/libgrubmods_a-cpio.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/fs/$(DEPDIR)/libgrubmods_a-cpio_be.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/fs/$(DEPDIR)/libgrubmods_a-erofs.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/fs/$(DEPDIR)/libgrubmods_a-exfat.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/fs/$(DEPDIR)/libgrubmods_a-ext2.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/fs/$(DEPDIR)/libgrubmods_a-f2fs.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/fs/$(DEPDIR)/libgrubmods_a-fat.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/fs/$(DEPDIR)/libgrubmods_a-fshelp.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/fs/$(DEPDIR)/libgrubmods_a-hfs.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/fs/$(DEPDIR)/libgrubmods_a-hfsplus.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/fs/$(DEPDIR)/libgrubmods_a-hfspluscomp.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/fs/$(DEPDIR)/libgrubmods_a-iso9660.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/fs/$(DEPDIR)/libgrubmods_a-jfs.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/fs/$(DEPDIR)/libgrubmods_a-minix.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/fs/$(DEPDIR)/libgrubmods_a-minix2.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/fs/$(DEPDIR)/libgrubmods_a-minix2_be.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/fs/$(DEPDIR)/libgrubmods_a-minix3.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/fs/$(DEPDIR)/libgrubmods_a-minix3_be.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/fs/$(DEPDIR)/libgrubmods_a-minix_be.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/fs/$(DEPDIR)/libgrubmods_a-newc.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/fs/$(DEPDIR)/libgrubmods_a-nilfs2.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/fs/$(DEPDIR)/libgrubmods_a-ntfs.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/fs/$(DEPDIR)/libgrubmods_a-ntfscomp.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/fs/$(DEPDIR)/libgrubmods_a-odc.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/fs/$(DEPDIR)/libgrubmods_a-reiserfs.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/fs/$(DEPDIR)/libgrubmods_a-romfs.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/fs/$(DEPDIR)/libgrubmods_a-sfs.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/fs/$(DEPDIR)/libgrubmods_a-squash4.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/fs/$(DEPDIR)/libgrubmods_a-tar.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/fs/$(DEPDIR)/libgrubmods_a-udf.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/fs/$(DEPDIR)/libgrubmods_a-ufs.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/fs/$(DEPDIR)/libgrubmods_a-ufs2.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/fs/$(DEPDIR)/libgrubmods_a-ufs_be.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/fs/$(DEPDIR)/libgrubmods_a-xfs.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/fs/zfs/$(DEPDIR)/libgrubmods_a-zfs.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/fs/zfs/$(DEPDIR)/libgrubmods_a-zfs_fletcher.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/fs/zfs/$(DEPDIR)/libgrubmods_a-zfs_lz4.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/fs/zfs/$(DEPDIR)/libgrubmods_a-zfs_lzjb.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/fs/zfs/$(DEPDIR)/libgrubmods_a-zfs_sha256.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/fs/zfs/$(DEPDIR)/libgrubmods_a-zfscrypt.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/fs/zfs/$(DEPDIR)/libgrubmods_a-zfsinfo.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/gfxmenu/$(DEPDIR)/libgrubmods_a-font.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/io/$(DEPDIR)/grub_file-offset.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/io/$(DEPDIR)/libgrubmods_a-bufio.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/io/$(DEPDIR)/libgrubmods_a-gzio.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/io/$(DEPDIR)/libgrubmods_a-lzopio.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/io/$(DEPDIR)/libgrubmods_a-xzio.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/kern/$(DEPDIR)/cmp_test-list.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/kern/$(DEPDIR)/cmp_test-misc.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/kern/$(DEPDIR)/date_test-list.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/kern/$(DEPDIR)/date_test-misc.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/kern/$(DEPDIR)/example_unit_test-list.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/kern/$(DEPDIR)/example_unit_test-misc.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/kern/$(DEPDIR)/grub_file-elf.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/kern/$(DEPDIR)/libgrubkern_a-command.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/kern/$(DEPDIR)/libgrubkern_a-device.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/kern/$(DEPDIR)/libgrubkern_a-disk.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/kern/$(DEPDIR)/libgrubkern_a-env.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/kern/$(DEPDIR)/libgrubkern_a-err.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/kern/$(DEPDIR)/libgrubkern_a-file.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/kern/$(DEPDIR)/libgrubkern_a-fs.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/kern/$(DEPDIR)/libgrubkern_a-list.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/kern/$(DEPDIR)/libgrubkern_a-misc.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/kern/$(DEPDIR)/libgrubkern_a-partition.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/kern/$(DEPDIR)/printf_test-list.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/kern/$(DEPDIR)/printf_test-misc.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/kern/$(DEPDIR)/priority_queue_unit_test-list.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/kern/$(DEPDIR)/priority_queue_unit_test-misc.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/kern/arm/$(DEPDIR)/libgrubmods_a-dl_helper.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/kern/arm64/$(DEPDIR)/libgrubmods_a-dl_helper.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/kern/emu/$(DEPDIR)/grub_bios_setup-argp_common.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/kern/emu/$(DEPDIR)/grub_file-hostfs.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/kern/emu/$(DEPDIR)/grub_fstest-hostfs.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/kern/emu/$(DEPDIR)/grub_glue_efi-argp_common.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/kern/emu/$(DEPDIR)/grub_install-argp_common.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/kern/emu/$(DEPDIR)/grub_install-hostfs.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/kern/emu/$(DEPDIR)/grub_macbless-argp_common.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/kern/emu/$(DEPDIR)/grub_mkfont-argp_common.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/kern/emu/$(DEPDIR)/grub_mkimage-argp_common.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/kern/emu/$(DEPDIR)/grub_mklayout-argp_common.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/kern/emu/$(DEPDIR)/grub_mknetdir-argp_common.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/kern/emu/$(DEPDIR)/grub_mkpasswd_pbkdf2-argp_common.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/kern/emu/$(DEPDIR)/grub_mkrelpath-argp_common.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/kern/emu/$(DEPDIR)/grub_mkrescue-argp_common.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/kern/emu/$(DEPDIR)/grub_mkrescue-hostfs.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/kern/emu/$(DEPDIR)/grub_mkstandalone-argp_common.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/kern/emu/$(DEPDIR)/grub_mkstandalone-hostfs.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/kern/emu/$(DEPDIR)/grub_mount-hostfs.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/kern/emu/$(DEPDIR)/grub_probe-argp_common.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/kern/emu/$(DEPDIR)/grub_protect-argp_common.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/kern/emu/$(DEPDIR)/grub_render_label-argp_common.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/kern/emu/$(DEPDIR)/grub_render_label-hostfs.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/kern/emu/$(DEPDIR)/grub_script_check-argp_common.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/kern/emu/$(DEPDIR)/grub_sparc64_setup-argp_common.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/kern/emu/$(DEPDIR)/grub_syslinux2cfg-argp_common.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/kern/emu/$(DEPDIR)/grub_syslinux2cfg-hostfs.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/kern/emu/$(DEPDIR)/libgrubkern_a-hostdisk.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/kern/emu/$(DEPDIR)/libgrubkern_a-misc.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/kern/emu/$(DEPDIR)/libgrubkern_a-mm.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/kern/ia64/$(DEPDIR)/libgrubmods_a-dl_helper.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/kern/loongarch64/$(DEPDIR)/libgrubmods_a-dl_helper.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/lib/$(DEPDIR)/grub_bios_setup-reed_solomon.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/lib/$(DEPDIR)/grub_install-reed_solomon.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/lib/$(DEPDIR)/grub_menulst2cfg-legacy_parse.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/lib/$(DEPDIR)/grub_mknetdir-reed_solomon.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/lib/$(DEPDIR)/grub_mkrescue-reed_solomon.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/lib/$(DEPDIR)/grub_mkstandalone-reed_solomon.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/lib/$(DEPDIR)/grub_sparc64_setup-reed_solomon.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/lib/$(DEPDIR)/grub_syslinux2cfg-getline.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/lib/$(DEPDIR)/grub_syslinux2cfg-syslinux_parse.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/lib/$(DEPDIR)/libgrubkern_a-arg.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/lib/$(DEPDIR)/libgrubkern_a-crypto.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/lib/$(DEPDIR)/libgrubkern_a-disk.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/lib/$(DEPDIR)/libgrubkern_a-pbkdf2.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/lib/$(DEPDIR)/libgrubmods_a-LzFind.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/lib/$(DEPDIR)/libgrubmods_a-LzmaEnc.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/lib/$(DEPDIR)/libgrubmods_a-adler32.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/lib/$(DEPDIR)/libgrubmods_a-crc.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/lib/$(DEPDIR)/libgrubmods_a-crc64.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/lib/$(DEPDIR)/libgrubmods_a-datetime.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/lib/$(DEPDIR)/libgrubmods_a-envblk.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/lib/$(DEPDIR)/libgrubmods_a-hexdump.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/lib/$(DEPDIR)/priority_queue_unit_test-priority_queue.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/lib/i386/pc/$(DEPDIR)/grub_menulst2cfg-vesa_modes_table.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/lib/json/$(DEPDIR)/libgrubkern_a-json.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-arcfour.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-aria.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-blake2.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-blowfish.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-camellia-glue.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-camellia.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-cast5.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-crc.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-des.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-gost28147.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-gostr3411-94.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-hash-common.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-idea.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-init.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-keccak.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-md4.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-md5.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-rfc2268.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-rijndael.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-rmd160.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-salsa20.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-seed.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-serpent.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-sha1.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-sha256.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-sha512.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-sm3.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-sm4.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-stribog.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-tiger.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-twofish.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-whirlpool.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/lib/libgcrypt-grub/src/$(DEPDIR)/libgrubgcry_a-const-time.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/lib/minilzo/$(DEPDIR)/libgrubmods_a-minilzo.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/lib/tss2/$(DEPDIR)/grub_protect-buffer.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/lib/tss2/$(DEPDIR)/grub_protect-tpm2_cmd.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/lib/tss2/$(DEPDIR)/grub_protect-tss2_mu.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/lib/xzembed/$(DEPDIR)/libgrubmods_a-xz_dec_bcj.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/lib/xzembed/$(DEPDIR)/libgrubmods_a-xz_dec_lzma2.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/lib/xzembed/$(DEPDIR)/libgrubmods_a-xz_dec_stream.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-debug.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-entropy_common.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-error_private.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-fse_decompress.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-huf_decompress.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-module.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-xxhash.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-zstd_common.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-zstd_decompress.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/loader/$(DEPDIR)/grub_file-lzss.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/loader/$(DEPDIR)/grub_file-macho.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/loader/$(DEPDIR)/grub_file-macho32.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/loader/$(DEPDIR)/grub_file-macho64.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/loader/i386/$(DEPDIR)/grub_file-xen_file.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/loader/i386/$(DEPDIR)/grub_file-xen_file32.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/loader/i386/$(DEPDIR)/grub_file-xen_file64.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/normal/$(DEPDIR)/libgrubmods_a-charset.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/normal/$(DEPDIR)/libgrubmods_a-misc.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/osdep/$(DEPDIR)/grub_bios_setup-blocklist.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/osdep/$(DEPDIR)/grub_bios_setup-init.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/osdep/$(DEPDIR)/grub_editenv-compress.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/osdep/$(DEPDIR)/grub_editenv-config.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/osdep/$(DEPDIR)/grub_editenv-init.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/osdep/$(DEPDIR)/grub_file-init.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/osdep/$(DEPDIR)/grub_fstest-init.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/osdep/$(DEPDIR)/grub_glue_efi-init.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/osdep/$(DEPDIR)/grub_install-blocklist.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/osdep/$(DEPDIR)/grub_install-compress.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/osdep/$(DEPDIR)/grub_install-config.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/osdep/$(DEPDIR)/grub_install-init.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/osdep/$(DEPDIR)/grub_install-ofpath.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/osdep/$(DEPDIR)/grub_install-platform.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/osdep/$(DEPDIR)/grub_install-platform_unix.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/osdep/$(DEPDIR)/grub_install-random.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/osdep/$(DEPDIR)/grub_macbless-init.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/osdep/$(DEPDIR)/grub_menulst2cfg-init.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/osdep/$(DEPDIR)/grub_mkfont-init.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/osdep/$(DEPDIR)/grub_mkimage-config.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/osdep/$(DEPDIR)/grub_mkimage-init.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/osdep/$(DEPDIR)/grub_mklayout-init.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/osdep/$(DEPDIR)/grub_mknetdir-blocklist.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/osdep/$(DEPDIR)/grub_mknetdir-compress.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/osdep/$(DEPDIR)/grub_mknetdir-config.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/osdep/$(DEPDIR)/grub_mknetdir-init.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/osdep/$(DEPDIR)/grub_mknetdir-ofpath.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/osdep/$(DEPDIR)/grub_mknetdir-platform.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/osdep/$(DEPDIR)/grub_mknetdir-platform_unix.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/osdep/$(DEPDIR)/grub_mknetdir-random.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/osdep/$(DEPDIR)/grub_mkpasswd_pbkdf2-init.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/osdep/$(DEPDIR)/grub_mkpasswd_pbkdf2-random.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/osdep/$(DEPDIR)/grub_mkrelpath-init.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/osdep/$(DEPDIR)/grub_mkrescue-blocklist.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/osdep/$(DEPDIR)/grub_mkrescue-compress.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/osdep/$(DEPDIR)/grub_mkrescue-config.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/osdep/$(DEPDIR)/grub_mkrescue-init.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/osdep/$(DEPDIR)/grub_mkrescue-ofpath.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/osdep/$(DEPDIR)/grub_mkrescue-platform.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/osdep/$(DEPDIR)/grub_mkrescue-platform_unix.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/osdep/$(DEPDIR)/grub_mkrescue-random.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/osdep/$(DEPDIR)/grub_mkstandalone-blocklist.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/osdep/$(DEPDIR)/grub_mkstandalone-compress.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/osdep/$(DEPDIR)/grub_mkstandalone-config.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/osdep/$(DEPDIR)/grub_mkstandalone-init.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/osdep/$(DEPDIR)/grub_mkstandalone-ofpath.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/osdep/$(DEPDIR)/grub_mkstandalone-platform.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/osdep/$(DEPDIR)/grub_mkstandalone-platform_unix.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/osdep/$(DEPDIR)/grub_mkstandalone-random.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/osdep/$(DEPDIR)/grub_mount-init.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/osdep/$(DEPDIR)/grub_ofpathname-init.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/osdep/$(DEPDIR)/grub_ofpathname-ofpath.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/osdep/$(DEPDIR)/grub_probe-init.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/osdep/$(DEPDIR)/grub_probe-ofpath.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/osdep/$(DEPDIR)/grub_protect-init.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/osdep/$(DEPDIR)/grub_render_label-init.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/osdep/$(DEPDIR)/grub_script_check-init.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/osdep/$(DEPDIR)/grub_sparc64_setup-blocklist.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/osdep/$(DEPDIR)/grub_sparc64_setup-init.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/osdep/$(DEPDIR)/grub_sparc64_setup-ofpath.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/osdep/$(DEPDIR)/grub_syslinux2cfg-init.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/osdep/$(DEPDIR)/libgrubkern_a-exec.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/osdep/$(DEPDIR)/libgrubkern_a-getroot.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/osdep/$(DEPDIR)/libgrubkern_a-hostdisk.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/osdep/$(DEPDIR)/libgrubkern_a-password.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/osdep/$(DEPDIR)/libgrubkern_a-relpath.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/osdep/$(DEPDIR)/libgrubkern_a-sleep.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/osdep/devmapper/$(DEPDIR)/libgrubkern_a-getroot.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/osdep/devmapper/$(DEPDIR)/libgrubkern_a-hostdisk.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/osdep/unix/$(DEPDIR)/libgrubkern_a-getroot.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/osdep/unix/$(DEPDIR)/libgrubkern_a-hostdisk.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/partmap/$(DEPDIR)/libgrubkern_a-gpt.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/partmap/$(DEPDIR)/libgrubkern_a-msdos.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/partmap/$(DEPDIR)/libgrubmods_a-acorn.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/partmap/$(DEPDIR)/libgrubmods_a-amiga.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/partmap/$(DEPDIR)/libgrubmods_a-apple.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/partmap/$(DEPDIR)/libgrubmods_a-bsdlabel.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/partmap/$(DEPDIR)/libgrubmods_a-dfly.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/partmap/$(DEPDIR)/libgrubmods_a-dvh.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/partmap/$(DEPDIR)/libgrubmods_a-plan.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/partmap/$(DEPDIR)/libgrubmods_a-sun.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/partmap/$(DEPDIR)/libgrubmods_a-sunpc.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/script/$(DEPDIR)/libgrubmods_a-argv.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/script/$(DEPDIR)/libgrubmods_a-function.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/script/$(DEPDIR)/libgrubmods_a-lexer.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/script/$(DEPDIR)/libgrubmods_a-main.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/script/$(DEPDIR)/libgrubmods_a-script.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/tests/lib/$(DEPDIR)/cmp_test-test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/tests/lib/$(DEPDIR)/date_test-test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/tests/lib/$(DEPDIR)/example_unit_test-test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/tests/lib/$(DEPDIR)/printf_test-test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/tests/lib/$(DEPDIR)/priority_queue_unit_test-test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/video/$(DEPDIR)/libgrubmods_a-capture.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/video/$(DEPDIR)/libgrubmods_a-colors.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/video/$(DEPDIR)/libgrubmods_a-video.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/video/fb/$(DEPDIR)/libgrubmods_a-fbblit.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/video/fb/$(DEPDIR)/libgrubmods_a-fbfill.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/video/fb/$(DEPDIR)/libgrubmods_a-fbutil.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@grub-core/video/fb/$(DEPDIR)/libgrubmods_a-video_fb.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/cmp_test-cmp_unit_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/date_test-date_unit_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/example_unit_test-example_unit_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/printf_test-printf_unit_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/priority_queue_unit_test-priority_queue_unit_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@tests/lib/$(DEPDIR)/cmp_test-unit_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@tests/lib/$(DEPDIR)/date_test-unit_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@tests/lib/$(DEPDIR)/example_unit_test-unit_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@tests/lib/$(DEPDIR)/printf_test-unit_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@tests/lib/$(DEPDIR)/priority_queue_unit_test-unit_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_bios_setup-grub-setup.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_bios_setup-setup_bios.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_editenv-config.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_editenv-editenv.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_editenv-grub-editenv.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_editenv-grub-install-common.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_editenv-grub-mkimage32.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_editenv-grub-mkimage64.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_editenv-mkimage.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_editenv-resolve.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_file-grub-file.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_file-render-label.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_fstest-grub-fstest.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_glue_efi-glue-efi.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_glue_efi-grub-glue-efi.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_install-config.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_install-editenv.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_install-grub-install-common.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_install-grub-install.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_install-grub-mkimage32.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_install-grub-mkimage64.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_install-mkimage.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_install-probe.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_install-render-label.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_install-resolve.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_install-setup_bios.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_install-setup_sparc.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_macbless-grub-macbless.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_macho2img-grub-macho2img.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_menulst2cfg-grub-menulst2cfg.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_mkfont-grub-mkfont.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_mkimage-config.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_mkimage-grub-mkimage.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_mkimage-grub-mkimage32.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_mkimage-grub-mkimage64.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_mkimage-mkimage.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_mkimage-resolve.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_mklayout-grub-mklayout.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_mknetdir-config.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_mknetdir-editenv.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_mknetdir-grub-install-common.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_mknetdir-grub-mkimage32.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_mknetdir-grub-mkimage64.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_mknetdir-grub-mknetdir.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_mknetdir-mkimage.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_mknetdir-resolve.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_mknetdir-setup_bios.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_mknetdir-setup_sparc.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_mkpasswd_pbkdf2-grub-mkpasswd-pbkdf2.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_mkrelpath-grub-mkrelpath.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_mkrescue-config.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_mkrescue-editenv.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_mkrescue-glue-efi.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_mkrescue-grub-install-common.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_mkrescue-grub-mkimage32.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_mkrescue-grub-mkimage64.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_mkrescue-grub-mkrescue.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_mkrescue-mkimage.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_mkrescue-render-label.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_mkrescue-resolve.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_mkrescue-setup_bios.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_mkrescue-setup_sparc.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_mkstandalone-config.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_mkstandalone-editenv.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_mkstandalone-glue-efi.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_mkstandalone-grub-install-common.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_mkstandalone-grub-mkimage32.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_mkstandalone-grub-mkimage64.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_mkstandalone-grub-mkstandalone.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_mkstandalone-mkimage.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_mkstandalone-render-label.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_mkstandalone-resolve.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_mkstandalone-setup_bios.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_mkstandalone-setup_sparc.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_mount-grub-mount.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_probe-grub-probe.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_probe-probe.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_protect-grub-protect.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_protect-probe.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_render_label-grub-render-label.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_render_label-render-label.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_script_check-grub-script-check.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_sparc64_setup-grub-setup.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_sparc64_setup-setup_sparc.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/grub_syslinux2cfg-grub-syslinux2cfg.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/libgrubkern_a-getroot.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/libgrubkern_a-misc.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@util/ieee1275/$(DEPDIR)/grub_ofpathname-grub-ofpathname.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-arcfour.o: grub-core/lib/libgcrypt-grub/cipher/arcfour.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-arcfour.o -MD -MP -MF grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-arcfour.Tpo -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-arcfour.o `test -f 'grub-core/lib/libgcrypt-grub/cipher/arcfour.c' || echo '$(srcdir)/'`grub-core/lib/libgcrypt-grub/cipher/arcfour.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-arcfour.Tpo grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-arcfour.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/libgcrypt-grub/cipher/arcfour.c' object='grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-arcfour.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-arcfour.o `test -f 'grub-core/lib/libgcrypt-grub/cipher/arcfour.c' || echo '$(srcdir)/'`grub-core/lib/libgcrypt-grub/cipher/arcfour.c grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-arcfour.obj: grub-core/lib/libgcrypt-grub/cipher/arcfour.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-arcfour.obj -MD -MP -MF grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-arcfour.Tpo -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-arcfour.obj `if test -f 'grub-core/lib/libgcrypt-grub/cipher/arcfour.c'; then $(CYGPATH_W) 'grub-core/lib/libgcrypt-grub/cipher/arcfour.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/libgcrypt-grub/cipher/arcfour.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-arcfour.Tpo grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-arcfour.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/libgcrypt-grub/cipher/arcfour.c' object='grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-arcfour.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-arcfour.obj `if test -f 'grub-core/lib/libgcrypt-grub/cipher/arcfour.c'; then $(CYGPATH_W) 'grub-core/lib/libgcrypt-grub/cipher/arcfour.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/libgcrypt-grub/cipher/arcfour.c'; fi` grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-aria.o: grub-core/lib/libgcrypt-grub/cipher/aria.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-aria.o -MD -MP -MF grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-aria.Tpo -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-aria.o `test -f 'grub-core/lib/libgcrypt-grub/cipher/aria.c' || echo '$(srcdir)/'`grub-core/lib/libgcrypt-grub/cipher/aria.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-aria.Tpo grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-aria.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/libgcrypt-grub/cipher/aria.c' object='grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-aria.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-aria.o `test -f 'grub-core/lib/libgcrypt-grub/cipher/aria.c' || echo '$(srcdir)/'`grub-core/lib/libgcrypt-grub/cipher/aria.c grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-aria.obj: grub-core/lib/libgcrypt-grub/cipher/aria.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-aria.obj -MD -MP -MF grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-aria.Tpo -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-aria.obj `if test -f 'grub-core/lib/libgcrypt-grub/cipher/aria.c'; then $(CYGPATH_W) 'grub-core/lib/libgcrypt-grub/cipher/aria.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/libgcrypt-grub/cipher/aria.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-aria.Tpo grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-aria.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/libgcrypt-grub/cipher/aria.c' object='grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-aria.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-aria.obj `if test -f 'grub-core/lib/libgcrypt-grub/cipher/aria.c'; then $(CYGPATH_W) 'grub-core/lib/libgcrypt-grub/cipher/aria.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/libgcrypt-grub/cipher/aria.c'; fi` grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-blake2.o: grub-core/lib/libgcrypt-grub/cipher/blake2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-blake2.o -MD -MP -MF grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-blake2.Tpo -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-blake2.o `test -f 'grub-core/lib/libgcrypt-grub/cipher/blake2.c' || echo '$(srcdir)/'`grub-core/lib/libgcrypt-grub/cipher/blake2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-blake2.Tpo grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-blake2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/libgcrypt-grub/cipher/blake2.c' object='grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-blake2.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-blake2.o `test -f 'grub-core/lib/libgcrypt-grub/cipher/blake2.c' || echo '$(srcdir)/'`grub-core/lib/libgcrypt-grub/cipher/blake2.c grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-blake2.obj: grub-core/lib/libgcrypt-grub/cipher/blake2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-blake2.obj -MD -MP -MF grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-blake2.Tpo -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-blake2.obj `if test -f 'grub-core/lib/libgcrypt-grub/cipher/blake2.c'; then $(CYGPATH_W) 'grub-core/lib/libgcrypt-grub/cipher/blake2.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/libgcrypt-grub/cipher/blake2.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-blake2.Tpo grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-blake2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/libgcrypt-grub/cipher/blake2.c' object='grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-blake2.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-blake2.obj `if test -f 'grub-core/lib/libgcrypt-grub/cipher/blake2.c'; then $(CYGPATH_W) 'grub-core/lib/libgcrypt-grub/cipher/blake2.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/libgcrypt-grub/cipher/blake2.c'; fi` grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-blowfish.o: grub-core/lib/libgcrypt-grub/cipher/blowfish.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-blowfish.o -MD -MP -MF grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-blowfish.Tpo -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-blowfish.o `test -f 'grub-core/lib/libgcrypt-grub/cipher/blowfish.c' || echo '$(srcdir)/'`grub-core/lib/libgcrypt-grub/cipher/blowfish.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-blowfish.Tpo grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-blowfish.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/libgcrypt-grub/cipher/blowfish.c' object='grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-blowfish.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-blowfish.o `test -f 'grub-core/lib/libgcrypt-grub/cipher/blowfish.c' || echo '$(srcdir)/'`grub-core/lib/libgcrypt-grub/cipher/blowfish.c grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-blowfish.obj: grub-core/lib/libgcrypt-grub/cipher/blowfish.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-blowfish.obj -MD -MP -MF grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-blowfish.Tpo -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-blowfish.obj `if test -f 'grub-core/lib/libgcrypt-grub/cipher/blowfish.c'; then $(CYGPATH_W) 'grub-core/lib/libgcrypt-grub/cipher/blowfish.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/libgcrypt-grub/cipher/blowfish.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-blowfish.Tpo grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-blowfish.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/libgcrypt-grub/cipher/blowfish.c' object='grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-blowfish.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-blowfish.obj `if test -f 'grub-core/lib/libgcrypt-grub/cipher/blowfish.c'; then $(CYGPATH_W) 'grub-core/lib/libgcrypt-grub/cipher/blowfish.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/libgcrypt-grub/cipher/blowfish.c'; fi` grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-camellia-glue.o: grub-core/lib/libgcrypt-grub/cipher/camellia-glue.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-camellia-glue.o -MD -MP -MF grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-camellia-glue.Tpo -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-camellia-glue.o `test -f 'grub-core/lib/libgcrypt-grub/cipher/camellia-glue.c' || echo '$(srcdir)/'`grub-core/lib/libgcrypt-grub/cipher/camellia-glue.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-camellia-glue.Tpo grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-camellia-glue.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/libgcrypt-grub/cipher/camellia-glue.c' object='grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-camellia-glue.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-camellia-glue.o `test -f 'grub-core/lib/libgcrypt-grub/cipher/camellia-glue.c' || echo '$(srcdir)/'`grub-core/lib/libgcrypt-grub/cipher/camellia-glue.c grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-camellia-glue.obj: grub-core/lib/libgcrypt-grub/cipher/camellia-glue.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-camellia-glue.obj -MD -MP -MF grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-camellia-glue.Tpo -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-camellia-glue.obj `if test -f 'grub-core/lib/libgcrypt-grub/cipher/camellia-glue.c'; then $(CYGPATH_W) 'grub-core/lib/libgcrypt-grub/cipher/camellia-glue.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/libgcrypt-grub/cipher/camellia-glue.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-camellia-glue.Tpo grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-camellia-glue.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/libgcrypt-grub/cipher/camellia-glue.c' object='grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-camellia-glue.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-camellia-glue.obj `if test -f 'grub-core/lib/libgcrypt-grub/cipher/camellia-glue.c'; then $(CYGPATH_W) 'grub-core/lib/libgcrypt-grub/cipher/camellia-glue.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/libgcrypt-grub/cipher/camellia-glue.c'; fi` grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-camellia.o: grub-core/lib/libgcrypt-grub/cipher/camellia.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-camellia.o -MD -MP -MF grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-camellia.Tpo -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-camellia.o `test -f 'grub-core/lib/libgcrypt-grub/cipher/camellia.c' || echo '$(srcdir)/'`grub-core/lib/libgcrypt-grub/cipher/camellia.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-camellia.Tpo grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-camellia.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/libgcrypt-grub/cipher/camellia.c' object='grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-camellia.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-camellia.o `test -f 'grub-core/lib/libgcrypt-grub/cipher/camellia.c' || echo '$(srcdir)/'`grub-core/lib/libgcrypt-grub/cipher/camellia.c grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-camellia.obj: grub-core/lib/libgcrypt-grub/cipher/camellia.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-camellia.obj -MD -MP -MF grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-camellia.Tpo -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-camellia.obj `if test -f 'grub-core/lib/libgcrypt-grub/cipher/camellia.c'; then $(CYGPATH_W) 'grub-core/lib/libgcrypt-grub/cipher/camellia.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/libgcrypt-grub/cipher/camellia.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-camellia.Tpo grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-camellia.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/libgcrypt-grub/cipher/camellia.c' object='grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-camellia.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-camellia.obj `if test -f 'grub-core/lib/libgcrypt-grub/cipher/camellia.c'; then $(CYGPATH_W) 'grub-core/lib/libgcrypt-grub/cipher/camellia.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/libgcrypt-grub/cipher/camellia.c'; fi` grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-cast5.o: grub-core/lib/libgcrypt-grub/cipher/cast5.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-cast5.o -MD -MP -MF grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-cast5.Tpo -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-cast5.o `test -f 'grub-core/lib/libgcrypt-grub/cipher/cast5.c' || echo '$(srcdir)/'`grub-core/lib/libgcrypt-grub/cipher/cast5.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-cast5.Tpo grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-cast5.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/libgcrypt-grub/cipher/cast5.c' object='grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-cast5.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-cast5.o `test -f 'grub-core/lib/libgcrypt-grub/cipher/cast5.c' || echo '$(srcdir)/'`grub-core/lib/libgcrypt-grub/cipher/cast5.c grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-cast5.obj: grub-core/lib/libgcrypt-grub/cipher/cast5.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-cast5.obj -MD -MP -MF grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-cast5.Tpo -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-cast5.obj `if test -f 'grub-core/lib/libgcrypt-grub/cipher/cast5.c'; then $(CYGPATH_W) 'grub-core/lib/libgcrypt-grub/cipher/cast5.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/libgcrypt-grub/cipher/cast5.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-cast5.Tpo grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-cast5.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/libgcrypt-grub/cipher/cast5.c' object='grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-cast5.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-cast5.obj `if test -f 'grub-core/lib/libgcrypt-grub/cipher/cast5.c'; then $(CYGPATH_W) 'grub-core/lib/libgcrypt-grub/cipher/cast5.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/libgcrypt-grub/cipher/cast5.c'; fi` grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-crc.o: grub-core/lib/libgcrypt-grub/cipher/crc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-crc.o -MD -MP -MF grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-crc.Tpo -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-crc.o `test -f 'grub-core/lib/libgcrypt-grub/cipher/crc.c' || echo '$(srcdir)/'`grub-core/lib/libgcrypt-grub/cipher/crc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-crc.Tpo grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-crc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/libgcrypt-grub/cipher/crc.c' object='grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-crc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-crc.o `test -f 'grub-core/lib/libgcrypt-grub/cipher/crc.c' || echo '$(srcdir)/'`grub-core/lib/libgcrypt-grub/cipher/crc.c grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-crc.obj: grub-core/lib/libgcrypt-grub/cipher/crc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-crc.obj -MD -MP -MF grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-crc.Tpo -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-crc.obj `if test -f 'grub-core/lib/libgcrypt-grub/cipher/crc.c'; then $(CYGPATH_W) 'grub-core/lib/libgcrypt-grub/cipher/crc.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/libgcrypt-grub/cipher/crc.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-crc.Tpo grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-crc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/libgcrypt-grub/cipher/crc.c' object='grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-crc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-crc.obj `if test -f 'grub-core/lib/libgcrypt-grub/cipher/crc.c'; then $(CYGPATH_W) 'grub-core/lib/libgcrypt-grub/cipher/crc.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/libgcrypt-grub/cipher/crc.c'; fi` grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-des.o: grub-core/lib/libgcrypt-grub/cipher/des.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-des.o -MD -MP -MF grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-des.Tpo -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-des.o `test -f 'grub-core/lib/libgcrypt-grub/cipher/des.c' || echo '$(srcdir)/'`grub-core/lib/libgcrypt-grub/cipher/des.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-des.Tpo grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-des.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/libgcrypt-grub/cipher/des.c' object='grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-des.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-des.o `test -f 'grub-core/lib/libgcrypt-grub/cipher/des.c' || echo '$(srcdir)/'`grub-core/lib/libgcrypt-grub/cipher/des.c grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-des.obj: grub-core/lib/libgcrypt-grub/cipher/des.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-des.obj -MD -MP -MF grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-des.Tpo -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-des.obj `if test -f 'grub-core/lib/libgcrypt-grub/cipher/des.c'; then $(CYGPATH_W) 'grub-core/lib/libgcrypt-grub/cipher/des.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/libgcrypt-grub/cipher/des.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-des.Tpo grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-des.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/libgcrypt-grub/cipher/des.c' object='grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-des.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-des.obj `if test -f 'grub-core/lib/libgcrypt-grub/cipher/des.c'; then $(CYGPATH_W) 'grub-core/lib/libgcrypt-grub/cipher/des.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/libgcrypt-grub/cipher/des.c'; fi` grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-gost28147.o: grub-core/lib/libgcrypt-grub/cipher/gost28147.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-gost28147.o -MD -MP -MF grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-gost28147.Tpo -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-gost28147.o `test -f 'grub-core/lib/libgcrypt-grub/cipher/gost28147.c' || echo '$(srcdir)/'`grub-core/lib/libgcrypt-grub/cipher/gost28147.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-gost28147.Tpo grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-gost28147.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/libgcrypt-grub/cipher/gost28147.c' object='grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-gost28147.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-gost28147.o `test -f 'grub-core/lib/libgcrypt-grub/cipher/gost28147.c' || echo '$(srcdir)/'`grub-core/lib/libgcrypt-grub/cipher/gost28147.c grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-gost28147.obj: grub-core/lib/libgcrypt-grub/cipher/gost28147.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-gost28147.obj -MD -MP -MF grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-gost28147.Tpo -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-gost28147.obj `if test -f 'grub-core/lib/libgcrypt-grub/cipher/gost28147.c'; then $(CYGPATH_W) 'grub-core/lib/libgcrypt-grub/cipher/gost28147.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/libgcrypt-grub/cipher/gost28147.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-gost28147.Tpo grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-gost28147.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/libgcrypt-grub/cipher/gost28147.c' object='grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-gost28147.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-gost28147.obj `if test -f 'grub-core/lib/libgcrypt-grub/cipher/gost28147.c'; then $(CYGPATH_W) 'grub-core/lib/libgcrypt-grub/cipher/gost28147.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/libgcrypt-grub/cipher/gost28147.c'; fi` grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-gostr3411-94.o: grub-core/lib/libgcrypt-grub/cipher/gostr3411-94.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-gostr3411-94.o -MD -MP -MF grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-gostr3411-94.Tpo -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-gostr3411-94.o `test -f 'grub-core/lib/libgcrypt-grub/cipher/gostr3411-94.c' || echo '$(srcdir)/'`grub-core/lib/libgcrypt-grub/cipher/gostr3411-94.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-gostr3411-94.Tpo grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-gostr3411-94.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/libgcrypt-grub/cipher/gostr3411-94.c' object='grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-gostr3411-94.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-gostr3411-94.o `test -f 'grub-core/lib/libgcrypt-grub/cipher/gostr3411-94.c' || echo '$(srcdir)/'`grub-core/lib/libgcrypt-grub/cipher/gostr3411-94.c grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-gostr3411-94.obj: grub-core/lib/libgcrypt-grub/cipher/gostr3411-94.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-gostr3411-94.obj -MD -MP -MF grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-gostr3411-94.Tpo -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-gostr3411-94.obj `if test -f 'grub-core/lib/libgcrypt-grub/cipher/gostr3411-94.c'; then $(CYGPATH_W) 'grub-core/lib/libgcrypt-grub/cipher/gostr3411-94.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/libgcrypt-grub/cipher/gostr3411-94.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-gostr3411-94.Tpo grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-gostr3411-94.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/libgcrypt-grub/cipher/gostr3411-94.c' object='grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-gostr3411-94.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-gostr3411-94.obj `if test -f 'grub-core/lib/libgcrypt-grub/cipher/gostr3411-94.c'; then $(CYGPATH_W) 'grub-core/lib/libgcrypt-grub/cipher/gostr3411-94.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/libgcrypt-grub/cipher/gostr3411-94.c'; fi` grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-hash-common.o: grub-core/lib/libgcrypt-grub/cipher/hash-common.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-hash-common.o -MD -MP -MF grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-hash-common.Tpo -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-hash-common.o `test -f 'grub-core/lib/libgcrypt-grub/cipher/hash-common.c' || echo '$(srcdir)/'`grub-core/lib/libgcrypt-grub/cipher/hash-common.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-hash-common.Tpo grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-hash-common.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/libgcrypt-grub/cipher/hash-common.c' object='grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-hash-common.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-hash-common.o `test -f 'grub-core/lib/libgcrypt-grub/cipher/hash-common.c' || echo '$(srcdir)/'`grub-core/lib/libgcrypt-grub/cipher/hash-common.c grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-hash-common.obj: grub-core/lib/libgcrypt-grub/cipher/hash-common.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-hash-common.obj -MD -MP -MF grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-hash-common.Tpo -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-hash-common.obj `if test -f 'grub-core/lib/libgcrypt-grub/cipher/hash-common.c'; then $(CYGPATH_W) 'grub-core/lib/libgcrypt-grub/cipher/hash-common.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/libgcrypt-grub/cipher/hash-common.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-hash-common.Tpo grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-hash-common.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/libgcrypt-grub/cipher/hash-common.c' object='grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-hash-common.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-hash-common.obj `if test -f 'grub-core/lib/libgcrypt-grub/cipher/hash-common.c'; then $(CYGPATH_W) 'grub-core/lib/libgcrypt-grub/cipher/hash-common.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/libgcrypt-grub/cipher/hash-common.c'; fi` grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-idea.o: grub-core/lib/libgcrypt-grub/cipher/idea.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-idea.o -MD -MP -MF grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-idea.Tpo -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-idea.o `test -f 'grub-core/lib/libgcrypt-grub/cipher/idea.c' || echo '$(srcdir)/'`grub-core/lib/libgcrypt-grub/cipher/idea.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-idea.Tpo grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-idea.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/libgcrypt-grub/cipher/idea.c' object='grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-idea.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-idea.o `test -f 'grub-core/lib/libgcrypt-grub/cipher/idea.c' || echo '$(srcdir)/'`grub-core/lib/libgcrypt-grub/cipher/idea.c grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-idea.obj: grub-core/lib/libgcrypt-grub/cipher/idea.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-idea.obj -MD -MP -MF grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-idea.Tpo -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-idea.obj `if test -f 'grub-core/lib/libgcrypt-grub/cipher/idea.c'; then $(CYGPATH_W) 'grub-core/lib/libgcrypt-grub/cipher/idea.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/libgcrypt-grub/cipher/idea.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-idea.Tpo grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-idea.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/libgcrypt-grub/cipher/idea.c' object='grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-idea.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-idea.obj `if test -f 'grub-core/lib/libgcrypt-grub/cipher/idea.c'; then $(CYGPATH_W) 'grub-core/lib/libgcrypt-grub/cipher/idea.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/libgcrypt-grub/cipher/idea.c'; fi` grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-init.o: grub-core/lib/libgcrypt-grub/cipher/init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-init.o -MD -MP -MF grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-init.Tpo -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-init.o `test -f 'grub-core/lib/libgcrypt-grub/cipher/init.c' || echo '$(srcdir)/'`grub-core/lib/libgcrypt-grub/cipher/init.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-init.Tpo grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/libgcrypt-grub/cipher/init.c' object='grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-init.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-init.o `test -f 'grub-core/lib/libgcrypt-grub/cipher/init.c' || echo '$(srcdir)/'`grub-core/lib/libgcrypt-grub/cipher/init.c grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-init.obj: grub-core/lib/libgcrypt-grub/cipher/init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-init.obj -MD -MP -MF grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-init.Tpo -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-init.obj `if test -f 'grub-core/lib/libgcrypt-grub/cipher/init.c'; then $(CYGPATH_W) 'grub-core/lib/libgcrypt-grub/cipher/init.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/libgcrypt-grub/cipher/init.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-init.Tpo grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/libgcrypt-grub/cipher/init.c' object='grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-init.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-init.obj `if test -f 'grub-core/lib/libgcrypt-grub/cipher/init.c'; then $(CYGPATH_W) 'grub-core/lib/libgcrypt-grub/cipher/init.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/libgcrypt-grub/cipher/init.c'; fi` grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-keccak.o: grub-core/lib/libgcrypt-grub/cipher/keccak.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-keccak.o -MD -MP -MF grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-keccak.Tpo -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-keccak.o `test -f 'grub-core/lib/libgcrypt-grub/cipher/keccak.c' || echo '$(srcdir)/'`grub-core/lib/libgcrypt-grub/cipher/keccak.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-keccak.Tpo grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-keccak.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/libgcrypt-grub/cipher/keccak.c' object='grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-keccak.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-keccak.o `test -f 'grub-core/lib/libgcrypt-grub/cipher/keccak.c' || echo '$(srcdir)/'`grub-core/lib/libgcrypt-grub/cipher/keccak.c grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-keccak.obj: grub-core/lib/libgcrypt-grub/cipher/keccak.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-keccak.obj -MD -MP -MF grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-keccak.Tpo -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-keccak.obj `if test -f 'grub-core/lib/libgcrypt-grub/cipher/keccak.c'; then $(CYGPATH_W) 'grub-core/lib/libgcrypt-grub/cipher/keccak.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/libgcrypt-grub/cipher/keccak.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-keccak.Tpo grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-keccak.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/libgcrypt-grub/cipher/keccak.c' object='grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-keccak.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-keccak.obj `if test -f 'grub-core/lib/libgcrypt-grub/cipher/keccak.c'; then $(CYGPATH_W) 'grub-core/lib/libgcrypt-grub/cipher/keccak.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/libgcrypt-grub/cipher/keccak.c'; fi` grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-md4.o: grub-core/lib/libgcrypt-grub/cipher/md4.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-md4.o -MD -MP -MF grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-md4.Tpo -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-md4.o `test -f 'grub-core/lib/libgcrypt-grub/cipher/md4.c' || echo '$(srcdir)/'`grub-core/lib/libgcrypt-grub/cipher/md4.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-md4.Tpo grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-md4.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/libgcrypt-grub/cipher/md4.c' object='grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-md4.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-md4.o `test -f 'grub-core/lib/libgcrypt-grub/cipher/md4.c' || echo '$(srcdir)/'`grub-core/lib/libgcrypt-grub/cipher/md4.c grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-md4.obj: grub-core/lib/libgcrypt-grub/cipher/md4.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-md4.obj -MD -MP -MF grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-md4.Tpo -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-md4.obj `if test -f 'grub-core/lib/libgcrypt-grub/cipher/md4.c'; then $(CYGPATH_W) 'grub-core/lib/libgcrypt-grub/cipher/md4.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/libgcrypt-grub/cipher/md4.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-md4.Tpo grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-md4.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/libgcrypt-grub/cipher/md4.c' object='grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-md4.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-md4.obj `if test -f 'grub-core/lib/libgcrypt-grub/cipher/md4.c'; then $(CYGPATH_W) 'grub-core/lib/libgcrypt-grub/cipher/md4.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/libgcrypt-grub/cipher/md4.c'; fi` grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-md5.o: grub-core/lib/libgcrypt-grub/cipher/md5.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-md5.o -MD -MP -MF grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-md5.Tpo -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-md5.o `test -f 'grub-core/lib/libgcrypt-grub/cipher/md5.c' || echo '$(srcdir)/'`grub-core/lib/libgcrypt-grub/cipher/md5.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-md5.Tpo grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-md5.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/libgcrypt-grub/cipher/md5.c' object='grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-md5.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-md5.o `test -f 'grub-core/lib/libgcrypt-grub/cipher/md5.c' || echo '$(srcdir)/'`grub-core/lib/libgcrypt-grub/cipher/md5.c grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-md5.obj: grub-core/lib/libgcrypt-grub/cipher/md5.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-md5.obj -MD -MP -MF grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-md5.Tpo -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-md5.obj `if test -f 'grub-core/lib/libgcrypt-grub/cipher/md5.c'; then $(CYGPATH_W) 'grub-core/lib/libgcrypt-grub/cipher/md5.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/libgcrypt-grub/cipher/md5.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-md5.Tpo grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-md5.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/libgcrypt-grub/cipher/md5.c' object='grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-md5.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-md5.obj `if test -f 'grub-core/lib/libgcrypt-grub/cipher/md5.c'; then $(CYGPATH_W) 'grub-core/lib/libgcrypt-grub/cipher/md5.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/libgcrypt-grub/cipher/md5.c'; fi` grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-rfc2268.o: grub-core/lib/libgcrypt-grub/cipher/rfc2268.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-rfc2268.o -MD -MP -MF grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-rfc2268.Tpo -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-rfc2268.o `test -f 'grub-core/lib/libgcrypt-grub/cipher/rfc2268.c' || echo '$(srcdir)/'`grub-core/lib/libgcrypt-grub/cipher/rfc2268.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-rfc2268.Tpo grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-rfc2268.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/libgcrypt-grub/cipher/rfc2268.c' object='grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-rfc2268.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-rfc2268.o `test -f 'grub-core/lib/libgcrypt-grub/cipher/rfc2268.c' || echo '$(srcdir)/'`grub-core/lib/libgcrypt-grub/cipher/rfc2268.c grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-rfc2268.obj: grub-core/lib/libgcrypt-grub/cipher/rfc2268.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-rfc2268.obj -MD -MP -MF grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-rfc2268.Tpo -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-rfc2268.obj `if test -f 'grub-core/lib/libgcrypt-grub/cipher/rfc2268.c'; then $(CYGPATH_W) 'grub-core/lib/libgcrypt-grub/cipher/rfc2268.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/libgcrypt-grub/cipher/rfc2268.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-rfc2268.Tpo grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-rfc2268.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/libgcrypt-grub/cipher/rfc2268.c' object='grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-rfc2268.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-rfc2268.obj `if test -f 'grub-core/lib/libgcrypt-grub/cipher/rfc2268.c'; then $(CYGPATH_W) 'grub-core/lib/libgcrypt-grub/cipher/rfc2268.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/libgcrypt-grub/cipher/rfc2268.c'; fi` grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-rijndael.o: grub-core/lib/libgcrypt-grub/cipher/rijndael.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-rijndael.o -MD -MP -MF grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-rijndael.Tpo -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-rijndael.o `test -f 'grub-core/lib/libgcrypt-grub/cipher/rijndael.c' || echo '$(srcdir)/'`grub-core/lib/libgcrypt-grub/cipher/rijndael.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-rijndael.Tpo grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-rijndael.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/libgcrypt-grub/cipher/rijndael.c' object='grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-rijndael.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-rijndael.o `test -f 'grub-core/lib/libgcrypt-grub/cipher/rijndael.c' || echo '$(srcdir)/'`grub-core/lib/libgcrypt-grub/cipher/rijndael.c grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-rijndael.obj: grub-core/lib/libgcrypt-grub/cipher/rijndael.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-rijndael.obj -MD -MP -MF grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-rijndael.Tpo -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-rijndael.obj `if test -f 'grub-core/lib/libgcrypt-grub/cipher/rijndael.c'; then $(CYGPATH_W) 'grub-core/lib/libgcrypt-grub/cipher/rijndael.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/libgcrypt-grub/cipher/rijndael.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-rijndael.Tpo grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-rijndael.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/libgcrypt-grub/cipher/rijndael.c' object='grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-rijndael.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-rijndael.obj `if test -f 'grub-core/lib/libgcrypt-grub/cipher/rijndael.c'; then $(CYGPATH_W) 'grub-core/lib/libgcrypt-grub/cipher/rijndael.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/libgcrypt-grub/cipher/rijndael.c'; fi` grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-rmd160.o: grub-core/lib/libgcrypt-grub/cipher/rmd160.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-rmd160.o -MD -MP -MF grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-rmd160.Tpo -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-rmd160.o `test -f 'grub-core/lib/libgcrypt-grub/cipher/rmd160.c' || echo '$(srcdir)/'`grub-core/lib/libgcrypt-grub/cipher/rmd160.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-rmd160.Tpo grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-rmd160.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/libgcrypt-grub/cipher/rmd160.c' object='grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-rmd160.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-rmd160.o `test -f 'grub-core/lib/libgcrypt-grub/cipher/rmd160.c' || echo '$(srcdir)/'`grub-core/lib/libgcrypt-grub/cipher/rmd160.c grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-rmd160.obj: grub-core/lib/libgcrypt-grub/cipher/rmd160.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-rmd160.obj -MD -MP -MF grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-rmd160.Tpo -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-rmd160.obj `if test -f 'grub-core/lib/libgcrypt-grub/cipher/rmd160.c'; then $(CYGPATH_W) 'grub-core/lib/libgcrypt-grub/cipher/rmd160.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/libgcrypt-grub/cipher/rmd160.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-rmd160.Tpo grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-rmd160.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/libgcrypt-grub/cipher/rmd160.c' object='grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-rmd160.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-rmd160.obj `if test -f 'grub-core/lib/libgcrypt-grub/cipher/rmd160.c'; then $(CYGPATH_W) 'grub-core/lib/libgcrypt-grub/cipher/rmd160.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/libgcrypt-grub/cipher/rmd160.c'; fi` grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-salsa20.o: grub-core/lib/libgcrypt-grub/cipher/salsa20.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-salsa20.o -MD -MP -MF grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-salsa20.Tpo -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-salsa20.o `test -f 'grub-core/lib/libgcrypt-grub/cipher/salsa20.c' || echo '$(srcdir)/'`grub-core/lib/libgcrypt-grub/cipher/salsa20.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-salsa20.Tpo grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-salsa20.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/libgcrypt-grub/cipher/salsa20.c' object='grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-salsa20.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-salsa20.o `test -f 'grub-core/lib/libgcrypt-grub/cipher/salsa20.c' || echo '$(srcdir)/'`grub-core/lib/libgcrypt-grub/cipher/salsa20.c grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-salsa20.obj: grub-core/lib/libgcrypt-grub/cipher/salsa20.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-salsa20.obj -MD -MP -MF grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-salsa20.Tpo -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-salsa20.obj `if test -f 'grub-core/lib/libgcrypt-grub/cipher/salsa20.c'; then $(CYGPATH_W) 'grub-core/lib/libgcrypt-grub/cipher/salsa20.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/libgcrypt-grub/cipher/salsa20.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-salsa20.Tpo grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-salsa20.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/libgcrypt-grub/cipher/salsa20.c' object='grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-salsa20.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-salsa20.obj `if test -f 'grub-core/lib/libgcrypt-grub/cipher/salsa20.c'; then $(CYGPATH_W) 'grub-core/lib/libgcrypt-grub/cipher/salsa20.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/libgcrypt-grub/cipher/salsa20.c'; fi` grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-seed.o: grub-core/lib/libgcrypt-grub/cipher/seed.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-seed.o -MD -MP -MF grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-seed.Tpo -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-seed.o `test -f 'grub-core/lib/libgcrypt-grub/cipher/seed.c' || echo '$(srcdir)/'`grub-core/lib/libgcrypt-grub/cipher/seed.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-seed.Tpo grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-seed.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/libgcrypt-grub/cipher/seed.c' object='grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-seed.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-seed.o `test -f 'grub-core/lib/libgcrypt-grub/cipher/seed.c' || echo '$(srcdir)/'`grub-core/lib/libgcrypt-grub/cipher/seed.c grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-seed.obj: grub-core/lib/libgcrypt-grub/cipher/seed.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-seed.obj -MD -MP -MF grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-seed.Tpo -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-seed.obj `if test -f 'grub-core/lib/libgcrypt-grub/cipher/seed.c'; then $(CYGPATH_W) 'grub-core/lib/libgcrypt-grub/cipher/seed.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/libgcrypt-grub/cipher/seed.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-seed.Tpo grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-seed.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/libgcrypt-grub/cipher/seed.c' object='grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-seed.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-seed.obj `if test -f 'grub-core/lib/libgcrypt-grub/cipher/seed.c'; then $(CYGPATH_W) 'grub-core/lib/libgcrypt-grub/cipher/seed.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/libgcrypt-grub/cipher/seed.c'; fi` grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-serpent.o: grub-core/lib/libgcrypt-grub/cipher/serpent.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-serpent.o -MD -MP -MF grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-serpent.Tpo -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-serpent.o `test -f 'grub-core/lib/libgcrypt-grub/cipher/serpent.c' || echo '$(srcdir)/'`grub-core/lib/libgcrypt-grub/cipher/serpent.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-serpent.Tpo grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-serpent.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/libgcrypt-grub/cipher/serpent.c' object='grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-serpent.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-serpent.o `test -f 'grub-core/lib/libgcrypt-grub/cipher/serpent.c' || echo '$(srcdir)/'`grub-core/lib/libgcrypt-grub/cipher/serpent.c grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-serpent.obj: grub-core/lib/libgcrypt-grub/cipher/serpent.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-serpent.obj -MD -MP -MF grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-serpent.Tpo -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-serpent.obj `if test -f 'grub-core/lib/libgcrypt-grub/cipher/serpent.c'; then $(CYGPATH_W) 'grub-core/lib/libgcrypt-grub/cipher/serpent.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/libgcrypt-grub/cipher/serpent.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-serpent.Tpo grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-serpent.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/libgcrypt-grub/cipher/serpent.c' object='grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-serpent.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-serpent.obj `if test -f 'grub-core/lib/libgcrypt-grub/cipher/serpent.c'; then $(CYGPATH_W) 'grub-core/lib/libgcrypt-grub/cipher/serpent.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/libgcrypt-grub/cipher/serpent.c'; fi` grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-sha1.o: grub-core/lib/libgcrypt-grub/cipher/sha1.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-sha1.o -MD -MP -MF grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-sha1.Tpo -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-sha1.o `test -f 'grub-core/lib/libgcrypt-grub/cipher/sha1.c' || echo '$(srcdir)/'`grub-core/lib/libgcrypt-grub/cipher/sha1.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-sha1.Tpo grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-sha1.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/libgcrypt-grub/cipher/sha1.c' object='grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-sha1.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-sha1.o `test -f 'grub-core/lib/libgcrypt-grub/cipher/sha1.c' || echo '$(srcdir)/'`grub-core/lib/libgcrypt-grub/cipher/sha1.c grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-sha1.obj: grub-core/lib/libgcrypt-grub/cipher/sha1.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-sha1.obj -MD -MP -MF grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-sha1.Tpo -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-sha1.obj `if test -f 'grub-core/lib/libgcrypt-grub/cipher/sha1.c'; then $(CYGPATH_W) 'grub-core/lib/libgcrypt-grub/cipher/sha1.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/libgcrypt-grub/cipher/sha1.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-sha1.Tpo grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-sha1.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/libgcrypt-grub/cipher/sha1.c' object='grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-sha1.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-sha1.obj `if test -f 'grub-core/lib/libgcrypt-grub/cipher/sha1.c'; then $(CYGPATH_W) 'grub-core/lib/libgcrypt-grub/cipher/sha1.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/libgcrypt-grub/cipher/sha1.c'; fi` grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-sha256.o: grub-core/lib/libgcrypt-grub/cipher/sha256.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-sha256.o -MD -MP -MF grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-sha256.Tpo -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-sha256.o `test -f 'grub-core/lib/libgcrypt-grub/cipher/sha256.c' || echo '$(srcdir)/'`grub-core/lib/libgcrypt-grub/cipher/sha256.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-sha256.Tpo grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-sha256.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/libgcrypt-grub/cipher/sha256.c' object='grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-sha256.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-sha256.o `test -f 'grub-core/lib/libgcrypt-grub/cipher/sha256.c' || echo '$(srcdir)/'`grub-core/lib/libgcrypt-grub/cipher/sha256.c grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-sha256.obj: grub-core/lib/libgcrypt-grub/cipher/sha256.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-sha256.obj -MD -MP -MF grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-sha256.Tpo -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-sha256.obj `if test -f 'grub-core/lib/libgcrypt-grub/cipher/sha256.c'; then $(CYGPATH_W) 'grub-core/lib/libgcrypt-grub/cipher/sha256.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/libgcrypt-grub/cipher/sha256.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-sha256.Tpo grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-sha256.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/libgcrypt-grub/cipher/sha256.c' object='grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-sha256.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-sha256.obj `if test -f 'grub-core/lib/libgcrypt-grub/cipher/sha256.c'; then $(CYGPATH_W) 'grub-core/lib/libgcrypt-grub/cipher/sha256.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/libgcrypt-grub/cipher/sha256.c'; fi` grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-sha512.o: grub-core/lib/libgcrypt-grub/cipher/sha512.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-sha512.o -MD -MP -MF grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-sha512.Tpo -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-sha512.o `test -f 'grub-core/lib/libgcrypt-grub/cipher/sha512.c' || echo '$(srcdir)/'`grub-core/lib/libgcrypt-grub/cipher/sha512.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-sha512.Tpo grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-sha512.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/libgcrypt-grub/cipher/sha512.c' object='grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-sha512.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-sha512.o `test -f 'grub-core/lib/libgcrypt-grub/cipher/sha512.c' || echo '$(srcdir)/'`grub-core/lib/libgcrypt-grub/cipher/sha512.c grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-sha512.obj: grub-core/lib/libgcrypt-grub/cipher/sha512.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-sha512.obj -MD -MP -MF grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-sha512.Tpo -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-sha512.obj `if test -f 'grub-core/lib/libgcrypt-grub/cipher/sha512.c'; then $(CYGPATH_W) 'grub-core/lib/libgcrypt-grub/cipher/sha512.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/libgcrypt-grub/cipher/sha512.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-sha512.Tpo grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-sha512.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/libgcrypt-grub/cipher/sha512.c' object='grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-sha512.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-sha512.obj `if test -f 'grub-core/lib/libgcrypt-grub/cipher/sha512.c'; then $(CYGPATH_W) 'grub-core/lib/libgcrypt-grub/cipher/sha512.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/libgcrypt-grub/cipher/sha512.c'; fi` grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-sm3.o: grub-core/lib/libgcrypt-grub/cipher/sm3.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-sm3.o -MD -MP -MF grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-sm3.Tpo -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-sm3.o `test -f 'grub-core/lib/libgcrypt-grub/cipher/sm3.c' || echo '$(srcdir)/'`grub-core/lib/libgcrypt-grub/cipher/sm3.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-sm3.Tpo grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-sm3.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/libgcrypt-grub/cipher/sm3.c' object='grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-sm3.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-sm3.o `test -f 'grub-core/lib/libgcrypt-grub/cipher/sm3.c' || echo '$(srcdir)/'`grub-core/lib/libgcrypt-grub/cipher/sm3.c grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-sm3.obj: grub-core/lib/libgcrypt-grub/cipher/sm3.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-sm3.obj -MD -MP -MF grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-sm3.Tpo -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-sm3.obj `if test -f 'grub-core/lib/libgcrypt-grub/cipher/sm3.c'; then $(CYGPATH_W) 'grub-core/lib/libgcrypt-grub/cipher/sm3.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/libgcrypt-grub/cipher/sm3.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-sm3.Tpo grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-sm3.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/libgcrypt-grub/cipher/sm3.c' object='grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-sm3.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-sm3.obj `if test -f 'grub-core/lib/libgcrypt-grub/cipher/sm3.c'; then $(CYGPATH_W) 'grub-core/lib/libgcrypt-grub/cipher/sm3.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/libgcrypt-grub/cipher/sm3.c'; fi` grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-sm4.o: grub-core/lib/libgcrypt-grub/cipher/sm4.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-sm4.o -MD -MP -MF grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-sm4.Tpo -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-sm4.o `test -f 'grub-core/lib/libgcrypt-grub/cipher/sm4.c' || echo '$(srcdir)/'`grub-core/lib/libgcrypt-grub/cipher/sm4.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-sm4.Tpo grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-sm4.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/libgcrypt-grub/cipher/sm4.c' object='grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-sm4.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-sm4.o `test -f 'grub-core/lib/libgcrypt-grub/cipher/sm4.c' || echo '$(srcdir)/'`grub-core/lib/libgcrypt-grub/cipher/sm4.c grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-sm4.obj: grub-core/lib/libgcrypt-grub/cipher/sm4.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-sm4.obj -MD -MP -MF grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-sm4.Tpo -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-sm4.obj `if test -f 'grub-core/lib/libgcrypt-grub/cipher/sm4.c'; then $(CYGPATH_W) 'grub-core/lib/libgcrypt-grub/cipher/sm4.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/libgcrypt-grub/cipher/sm4.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-sm4.Tpo grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-sm4.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/libgcrypt-grub/cipher/sm4.c' object='grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-sm4.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-sm4.obj `if test -f 'grub-core/lib/libgcrypt-grub/cipher/sm4.c'; then $(CYGPATH_W) 'grub-core/lib/libgcrypt-grub/cipher/sm4.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/libgcrypt-grub/cipher/sm4.c'; fi` grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-stribog.o: grub-core/lib/libgcrypt-grub/cipher/stribog.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-stribog.o -MD -MP -MF grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-stribog.Tpo -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-stribog.o `test -f 'grub-core/lib/libgcrypt-grub/cipher/stribog.c' || echo '$(srcdir)/'`grub-core/lib/libgcrypt-grub/cipher/stribog.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-stribog.Tpo grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-stribog.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/libgcrypt-grub/cipher/stribog.c' object='grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-stribog.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-stribog.o `test -f 'grub-core/lib/libgcrypt-grub/cipher/stribog.c' || echo '$(srcdir)/'`grub-core/lib/libgcrypt-grub/cipher/stribog.c grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-stribog.obj: grub-core/lib/libgcrypt-grub/cipher/stribog.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-stribog.obj -MD -MP -MF grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-stribog.Tpo -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-stribog.obj `if test -f 'grub-core/lib/libgcrypt-grub/cipher/stribog.c'; then $(CYGPATH_W) 'grub-core/lib/libgcrypt-grub/cipher/stribog.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/libgcrypt-grub/cipher/stribog.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-stribog.Tpo grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-stribog.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/libgcrypt-grub/cipher/stribog.c' object='grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-stribog.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-stribog.obj `if test -f 'grub-core/lib/libgcrypt-grub/cipher/stribog.c'; then $(CYGPATH_W) 'grub-core/lib/libgcrypt-grub/cipher/stribog.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/libgcrypt-grub/cipher/stribog.c'; fi` grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-tiger.o: grub-core/lib/libgcrypt-grub/cipher/tiger.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-tiger.o -MD -MP -MF grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-tiger.Tpo -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-tiger.o `test -f 'grub-core/lib/libgcrypt-grub/cipher/tiger.c' || echo '$(srcdir)/'`grub-core/lib/libgcrypt-grub/cipher/tiger.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-tiger.Tpo grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-tiger.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/libgcrypt-grub/cipher/tiger.c' object='grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-tiger.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-tiger.o `test -f 'grub-core/lib/libgcrypt-grub/cipher/tiger.c' || echo '$(srcdir)/'`grub-core/lib/libgcrypt-grub/cipher/tiger.c grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-tiger.obj: grub-core/lib/libgcrypt-grub/cipher/tiger.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-tiger.obj -MD -MP -MF grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-tiger.Tpo -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-tiger.obj `if test -f 'grub-core/lib/libgcrypt-grub/cipher/tiger.c'; then $(CYGPATH_W) 'grub-core/lib/libgcrypt-grub/cipher/tiger.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/libgcrypt-grub/cipher/tiger.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-tiger.Tpo grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-tiger.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/libgcrypt-grub/cipher/tiger.c' object='grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-tiger.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-tiger.obj `if test -f 'grub-core/lib/libgcrypt-grub/cipher/tiger.c'; then $(CYGPATH_W) 'grub-core/lib/libgcrypt-grub/cipher/tiger.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/libgcrypt-grub/cipher/tiger.c'; fi` grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-twofish.o: grub-core/lib/libgcrypt-grub/cipher/twofish.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-twofish.o -MD -MP -MF grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-twofish.Tpo -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-twofish.o `test -f 'grub-core/lib/libgcrypt-grub/cipher/twofish.c' || echo '$(srcdir)/'`grub-core/lib/libgcrypt-grub/cipher/twofish.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-twofish.Tpo grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-twofish.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/libgcrypt-grub/cipher/twofish.c' object='grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-twofish.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-twofish.o `test -f 'grub-core/lib/libgcrypt-grub/cipher/twofish.c' || echo '$(srcdir)/'`grub-core/lib/libgcrypt-grub/cipher/twofish.c grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-twofish.obj: grub-core/lib/libgcrypt-grub/cipher/twofish.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-twofish.obj -MD -MP -MF grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-twofish.Tpo -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-twofish.obj `if test -f 'grub-core/lib/libgcrypt-grub/cipher/twofish.c'; then $(CYGPATH_W) 'grub-core/lib/libgcrypt-grub/cipher/twofish.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/libgcrypt-grub/cipher/twofish.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-twofish.Tpo grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-twofish.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/libgcrypt-grub/cipher/twofish.c' object='grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-twofish.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-twofish.obj `if test -f 'grub-core/lib/libgcrypt-grub/cipher/twofish.c'; then $(CYGPATH_W) 'grub-core/lib/libgcrypt-grub/cipher/twofish.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/libgcrypt-grub/cipher/twofish.c'; fi` grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-whirlpool.o: grub-core/lib/libgcrypt-grub/cipher/whirlpool.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-whirlpool.o -MD -MP -MF grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-whirlpool.Tpo -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-whirlpool.o `test -f 'grub-core/lib/libgcrypt-grub/cipher/whirlpool.c' || echo '$(srcdir)/'`grub-core/lib/libgcrypt-grub/cipher/whirlpool.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-whirlpool.Tpo grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-whirlpool.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/libgcrypt-grub/cipher/whirlpool.c' object='grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-whirlpool.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-whirlpool.o `test -f 'grub-core/lib/libgcrypt-grub/cipher/whirlpool.c' || echo '$(srcdir)/'`grub-core/lib/libgcrypt-grub/cipher/whirlpool.c grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-whirlpool.obj: grub-core/lib/libgcrypt-grub/cipher/whirlpool.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-whirlpool.obj -MD -MP -MF grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-whirlpool.Tpo -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-whirlpool.obj `if test -f 'grub-core/lib/libgcrypt-grub/cipher/whirlpool.c'; then $(CYGPATH_W) 'grub-core/lib/libgcrypt-grub/cipher/whirlpool.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/libgcrypt-grub/cipher/whirlpool.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-whirlpool.Tpo grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-whirlpool.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/libgcrypt-grub/cipher/whirlpool.c' object='grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-whirlpool.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgcrypt-grub/cipher/libgrubgcry_a-whirlpool.obj `if test -f 'grub-core/lib/libgcrypt-grub/cipher/whirlpool.c'; then $(CYGPATH_W) 'grub-core/lib/libgcrypt-grub/cipher/whirlpool.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/libgcrypt-grub/cipher/whirlpool.c'; fi` grub-core/lib/libgcrypt-grub/src/libgrubgcry_a-const-time.o: grub-core/lib/libgcrypt-grub/src/const-time.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgcrypt-grub/src/libgrubgcry_a-const-time.o -MD -MP -MF grub-core/lib/libgcrypt-grub/src/$(DEPDIR)/libgrubgcry_a-const-time.Tpo -c -o grub-core/lib/libgcrypt-grub/src/libgrubgcry_a-const-time.o `test -f 'grub-core/lib/libgcrypt-grub/src/const-time.c' || echo '$(srcdir)/'`grub-core/lib/libgcrypt-grub/src/const-time.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/libgcrypt-grub/src/$(DEPDIR)/libgrubgcry_a-const-time.Tpo grub-core/lib/libgcrypt-grub/src/$(DEPDIR)/libgrubgcry_a-const-time.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/libgcrypt-grub/src/const-time.c' object='grub-core/lib/libgcrypt-grub/src/libgrubgcry_a-const-time.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgcrypt-grub/src/libgrubgcry_a-const-time.o `test -f 'grub-core/lib/libgcrypt-grub/src/const-time.c' || echo '$(srcdir)/'`grub-core/lib/libgcrypt-grub/src/const-time.c grub-core/lib/libgcrypt-grub/src/libgrubgcry_a-const-time.obj: grub-core/lib/libgcrypt-grub/src/const-time.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgcrypt-grub/src/libgrubgcry_a-const-time.obj -MD -MP -MF grub-core/lib/libgcrypt-grub/src/$(DEPDIR)/libgrubgcry_a-const-time.Tpo -c -o grub-core/lib/libgcrypt-grub/src/libgrubgcry_a-const-time.obj `if test -f 'grub-core/lib/libgcrypt-grub/src/const-time.c'; then $(CYGPATH_W) 'grub-core/lib/libgcrypt-grub/src/const-time.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/libgcrypt-grub/src/const-time.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/libgcrypt-grub/src/$(DEPDIR)/libgrubgcry_a-const-time.Tpo grub-core/lib/libgcrypt-grub/src/$(DEPDIR)/libgrubgcry_a-const-time.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/libgcrypt-grub/src/const-time.c' object='grub-core/lib/libgcrypt-grub/src/libgrubgcry_a-const-time.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubgcry_a_CPPFLAGS) $(CPPFLAGS) $(libgrubgcry_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgcrypt-grub/src/libgrubgcry_a-const-time.obj `if test -f 'grub-core/lib/libgcrypt-grub/src/const-time.c'; then $(CYGPATH_W) 'grub-core/lib/libgcrypt-grub/src/const-time.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/libgcrypt-grub/src/const-time.c'; fi` grub-core/commands/libgrubkern_a-extcmd.o: grub-core/commands/extcmd.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/commands/libgrubkern_a-extcmd.o -MD -MP -MF grub-core/commands/$(DEPDIR)/libgrubkern_a-extcmd.Tpo -c -o grub-core/commands/libgrubkern_a-extcmd.o `test -f 'grub-core/commands/extcmd.c' || echo '$(srcdir)/'`grub-core/commands/extcmd.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/commands/$(DEPDIR)/libgrubkern_a-extcmd.Tpo grub-core/commands/$(DEPDIR)/libgrubkern_a-extcmd.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/commands/extcmd.c' object='grub-core/commands/libgrubkern_a-extcmd.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/commands/libgrubkern_a-extcmd.o `test -f 'grub-core/commands/extcmd.c' || echo '$(srcdir)/'`grub-core/commands/extcmd.c grub-core/commands/libgrubkern_a-extcmd.obj: grub-core/commands/extcmd.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/commands/libgrubkern_a-extcmd.obj -MD -MP -MF grub-core/commands/$(DEPDIR)/libgrubkern_a-extcmd.Tpo -c -o grub-core/commands/libgrubkern_a-extcmd.obj `if test -f 'grub-core/commands/extcmd.c'; then $(CYGPATH_W) 'grub-core/commands/extcmd.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/commands/extcmd.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/commands/$(DEPDIR)/libgrubkern_a-extcmd.Tpo grub-core/commands/$(DEPDIR)/libgrubkern_a-extcmd.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/commands/extcmd.c' object='grub-core/commands/libgrubkern_a-extcmd.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/commands/libgrubkern_a-extcmd.obj `if test -f 'grub-core/commands/extcmd.c'; then $(CYGPATH_W) 'grub-core/commands/extcmd.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/commands/extcmd.c'; fi` grub-core/disk/libgrubkern_a-AFSplitter.o: grub-core/disk/AFSplitter.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/disk/libgrubkern_a-AFSplitter.o -MD -MP -MF grub-core/disk/$(DEPDIR)/libgrubkern_a-AFSplitter.Tpo -c -o grub-core/disk/libgrubkern_a-AFSplitter.o `test -f 'grub-core/disk/AFSplitter.c' || echo '$(srcdir)/'`grub-core/disk/AFSplitter.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/disk/$(DEPDIR)/libgrubkern_a-AFSplitter.Tpo grub-core/disk/$(DEPDIR)/libgrubkern_a-AFSplitter.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/disk/AFSplitter.c' object='grub-core/disk/libgrubkern_a-AFSplitter.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/disk/libgrubkern_a-AFSplitter.o `test -f 'grub-core/disk/AFSplitter.c' || echo '$(srcdir)/'`grub-core/disk/AFSplitter.c grub-core/disk/libgrubkern_a-AFSplitter.obj: grub-core/disk/AFSplitter.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/disk/libgrubkern_a-AFSplitter.obj -MD -MP -MF grub-core/disk/$(DEPDIR)/libgrubkern_a-AFSplitter.Tpo -c -o grub-core/disk/libgrubkern_a-AFSplitter.obj `if test -f 'grub-core/disk/AFSplitter.c'; then $(CYGPATH_W) 'grub-core/disk/AFSplitter.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/disk/AFSplitter.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/disk/$(DEPDIR)/libgrubkern_a-AFSplitter.Tpo grub-core/disk/$(DEPDIR)/libgrubkern_a-AFSplitter.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/disk/AFSplitter.c' object='grub-core/disk/libgrubkern_a-AFSplitter.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/disk/libgrubkern_a-AFSplitter.obj `if test -f 'grub-core/disk/AFSplitter.c'; then $(CYGPATH_W) 'grub-core/disk/AFSplitter.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/disk/AFSplitter.c'; fi` grub-core/disk/libgrubkern_a-cryptodisk.o: grub-core/disk/cryptodisk.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/disk/libgrubkern_a-cryptodisk.o -MD -MP -MF grub-core/disk/$(DEPDIR)/libgrubkern_a-cryptodisk.Tpo -c -o grub-core/disk/libgrubkern_a-cryptodisk.o `test -f 'grub-core/disk/cryptodisk.c' || echo '$(srcdir)/'`grub-core/disk/cryptodisk.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/disk/$(DEPDIR)/libgrubkern_a-cryptodisk.Tpo grub-core/disk/$(DEPDIR)/libgrubkern_a-cryptodisk.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/disk/cryptodisk.c' object='grub-core/disk/libgrubkern_a-cryptodisk.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/disk/libgrubkern_a-cryptodisk.o `test -f 'grub-core/disk/cryptodisk.c' || echo '$(srcdir)/'`grub-core/disk/cryptodisk.c grub-core/disk/libgrubkern_a-cryptodisk.obj: grub-core/disk/cryptodisk.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/disk/libgrubkern_a-cryptodisk.obj -MD -MP -MF grub-core/disk/$(DEPDIR)/libgrubkern_a-cryptodisk.Tpo -c -o grub-core/disk/libgrubkern_a-cryptodisk.obj `if test -f 'grub-core/disk/cryptodisk.c'; then $(CYGPATH_W) 'grub-core/disk/cryptodisk.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/disk/cryptodisk.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/disk/$(DEPDIR)/libgrubkern_a-cryptodisk.Tpo grub-core/disk/$(DEPDIR)/libgrubkern_a-cryptodisk.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/disk/cryptodisk.c' object='grub-core/disk/libgrubkern_a-cryptodisk.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/disk/libgrubkern_a-cryptodisk.obj `if test -f 'grub-core/disk/cryptodisk.c'; then $(CYGPATH_W) 'grub-core/disk/cryptodisk.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/disk/cryptodisk.c'; fi` grub-core/disk/libgrubkern_a-diskfilter.o: grub-core/disk/diskfilter.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/disk/libgrubkern_a-diskfilter.o -MD -MP -MF grub-core/disk/$(DEPDIR)/libgrubkern_a-diskfilter.Tpo -c -o grub-core/disk/libgrubkern_a-diskfilter.o `test -f 'grub-core/disk/diskfilter.c' || echo '$(srcdir)/'`grub-core/disk/diskfilter.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/disk/$(DEPDIR)/libgrubkern_a-diskfilter.Tpo grub-core/disk/$(DEPDIR)/libgrubkern_a-diskfilter.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/disk/diskfilter.c' object='grub-core/disk/libgrubkern_a-diskfilter.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/disk/libgrubkern_a-diskfilter.o `test -f 'grub-core/disk/diskfilter.c' || echo '$(srcdir)/'`grub-core/disk/diskfilter.c grub-core/disk/libgrubkern_a-diskfilter.obj: grub-core/disk/diskfilter.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/disk/libgrubkern_a-diskfilter.obj -MD -MP -MF grub-core/disk/$(DEPDIR)/libgrubkern_a-diskfilter.Tpo -c -o grub-core/disk/libgrubkern_a-diskfilter.obj `if test -f 'grub-core/disk/diskfilter.c'; then $(CYGPATH_W) 'grub-core/disk/diskfilter.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/disk/diskfilter.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/disk/$(DEPDIR)/libgrubkern_a-diskfilter.Tpo grub-core/disk/$(DEPDIR)/libgrubkern_a-diskfilter.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/disk/diskfilter.c' object='grub-core/disk/libgrubkern_a-diskfilter.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/disk/libgrubkern_a-diskfilter.obj `if test -f 'grub-core/disk/diskfilter.c'; then $(CYGPATH_W) 'grub-core/disk/diskfilter.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/disk/diskfilter.c'; fi` grub-core/disk/libgrubkern_a-geli.o: grub-core/disk/geli.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/disk/libgrubkern_a-geli.o -MD -MP -MF grub-core/disk/$(DEPDIR)/libgrubkern_a-geli.Tpo -c -o grub-core/disk/libgrubkern_a-geli.o `test -f 'grub-core/disk/geli.c' || echo '$(srcdir)/'`grub-core/disk/geli.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/disk/$(DEPDIR)/libgrubkern_a-geli.Tpo grub-core/disk/$(DEPDIR)/libgrubkern_a-geli.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/disk/geli.c' object='grub-core/disk/libgrubkern_a-geli.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/disk/libgrubkern_a-geli.o `test -f 'grub-core/disk/geli.c' || echo '$(srcdir)/'`grub-core/disk/geli.c grub-core/disk/libgrubkern_a-geli.obj: grub-core/disk/geli.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/disk/libgrubkern_a-geli.obj -MD -MP -MF grub-core/disk/$(DEPDIR)/libgrubkern_a-geli.Tpo -c -o grub-core/disk/libgrubkern_a-geli.obj `if test -f 'grub-core/disk/geli.c'; then $(CYGPATH_W) 'grub-core/disk/geli.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/disk/geli.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/disk/$(DEPDIR)/libgrubkern_a-geli.Tpo grub-core/disk/$(DEPDIR)/libgrubkern_a-geli.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/disk/geli.c' object='grub-core/disk/libgrubkern_a-geli.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/disk/libgrubkern_a-geli.obj `if test -f 'grub-core/disk/geli.c'; then $(CYGPATH_W) 'grub-core/disk/geli.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/disk/geli.c'; fi` grub-core/disk/libgrubkern_a-key_protector.o: grub-core/disk/key_protector.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/disk/libgrubkern_a-key_protector.o -MD -MP -MF grub-core/disk/$(DEPDIR)/libgrubkern_a-key_protector.Tpo -c -o grub-core/disk/libgrubkern_a-key_protector.o `test -f 'grub-core/disk/key_protector.c' || echo '$(srcdir)/'`grub-core/disk/key_protector.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/disk/$(DEPDIR)/libgrubkern_a-key_protector.Tpo grub-core/disk/$(DEPDIR)/libgrubkern_a-key_protector.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/disk/key_protector.c' object='grub-core/disk/libgrubkern_a-key_protector.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/disk/libgrubkern_a-key_protector.o `test -f 'grub-core/disk/key_protector.c' || echo '$(srcdir)/'`grub-core/disk/key_protector.c grub-core/disk/libgrubkern_a-key_protector.obj: grub-core/disk/key_protector.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/disk/libgrubkern_a-key_protector.obj -MD -MP -MF grub-core/disk/$(DEPDIR)/libgrubkern_a-key_protector.Tpo -c -o grub-core/disk/libgrubkern_a-key_protector.obj `if test -f 'grub-core/disk/key_protector.c'; then $(CYGPATH_W) 'grub-core/disk/key_protector.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/disk/key_protector.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/disk/$(DEPDIR)/libgrubkern_a-key_protector.Tpo grub-core/disk/$(DEPDIR)/libgrubkern_a-key_protector.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/disk/key_protector.c' object='grub-core/disk/libgrubkern_a-key_protector.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/disk/libgrubkern_a-key_protector.obj `if test -f 'grub-core/disk/key_protector.c'; then $(CYGPATH_W) 'grub-core/disk/key_protector.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/disk/key_protector.c'; fi` grub-core/disk/libgrubkern_a-ldm.o: grub-core/disk/ldm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/disk/libgrubkern_a-ldm.o -MD -MP -MF grub-core/disk/$(DEPDIR)/libgrubkern_a-ldm.Tpo -c -o grub-core/disk/libgrubkern_a-ldm.o `test -f 'grub-core/disk/ldm.c' || echo '$(srcdir)/'`grub-core/disk/ldm.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/disk/$(DEPDIR)/libgrubkern_a-ldm.Tpo grub-core/disk/$(DEPDIR)/libgrubkern_a-ldm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/disk/ldm.c' object='grub-core/disk/libgrubkern_a-ldm.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/disk/libgrubkern_a-ldm.o `test -f 'grub-core/disk/ldm.c' || echo '$(srcdir)/'`grub-core/disk/ldm.c grub-core/disk/libgrubkern_a-ldm.obj: grub-core/disk/ldm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/disk/libgrubkern_a-ldm.obj -MD -MP -MF grub-core/disk/$(DEPDIR)/libgrubkern_a-ldm.Tpo -c -o grub-core/disk/libgrubkern_a-ldm.obj `if test -f 'grub-core/disk/ldm.c'; then $(CYGPATH_W) 'grub-core/disk/ldm.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/disk/ldm.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/disk/$(DEPDIR)/libgrubkern_a-ldm.Tpo grub-core/disk/$(DEPDIR)/libgrubkern_a-ldm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/disk/ldm.c' object='grub-core/disk/libgrubkern_a-ldm.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/disk/libgrubkern_a-ldm.obj `if test -f 'grub-core/disk/ldm.c'; then $(CYGPATH_W) 'grub-core/disk/ldm.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/disk/ldm.c'; fi` grub-core/disk/libgrubkern_a-luks.o: grub-core/disk/luks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/disk/libgrubkern_a-luks.o -MD -MP -MF grub-core/disk/$(DEPDIR)/libgrubkern_a-luks.Tpo -c -o grub-core/disk/libgrubkern_a-luks.o `test -f 'grub-core/disk/luks.c' || echo '$(srcdir)/'`grub-core/disk/luks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/disk/$(DEPDIR)/libgrubkern_a-luks.Tpo grub-core/disk/$(DEPDIR)/libgrubkern_a-luks.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/disk/luks.c' object='grub-core/disk/libgrubkern_a-luks.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/disk/libgrubkern_a-luks.o `test -f 'grub-core/disk/luks.c' || echo '$(srcdir)/'`grub-core/disk/luks.c grub-core/disk/libgrubkern_a-luks.obj: grub-core/disk/luks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/disk/libgrubkern_a-luks.obj -MD -MP -MF grub-core/disk/$(DEPDIR)/libgrubkern_a-luks.Tpo -c -o grub-core/disk/libgrubkern_a-luks.obj `if test -f 'grub-core/disk/luks.c'; then $(CYGPATH_W) 'grub-core/disk/luks.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/disk/luks.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/disk/$(DEPDIR)/libgrubkern_a-luks.Tpo grub-core/disk/$(DEPDIR)/libgrubkern_a-luks.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/disk/luks.c' object='grub-core/disk/libgrubkern_a-luks.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/disk/libgrubkern_a-luks.obj `if test -f 'grub-core/disk/luks.c'; then $(CYGPATH_W) 'grub-core/disk/luks.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/disk/luks.c'; fi` grub-core/disk/libgrubkern_a-luks2.o: grub-core/disk/luks2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/disk/libgrubkern_a-luks2.o -MD -MP -MF grub-core/disk/$(DEPDIR)/libgrubkern_a-luks2.Tpo -c -o grub-core/disk/libgrubkern_a-luks2.o `test -f 'grub-core/disk/luks2.c' || echo '$(srcdir)/'`grub-core/disk/luks2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/disk/$(DEPDIR)/libgrubkern_a-luks2.Tpo grub-core/disk/$(DEPDIR)/libgrubkern_a-luks2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/disk/luks2.c' object='grub-core/disk/libgrubkern_a-luks2.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/disk/libgrubkern_a-luks2.o `test -f 'grub-core/disk/luks2.c' || echo '$(srcdir)/'`grub-core/disk/luks2.c grub-core/disk/libgrubkern_a-luks2.obj: grub-core/disk/luks2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/disk/libgrubkern_a-luks2.obj -MD -MP -MF grub-core/disk/$(DEPDIR)/libgrubkern_a-luks2.Tpo -c -o grub-core/disk/libgrubkern_a-luks2.obj `if test -f 'grub-core/disk/luks2.c'; then $(CYGPATH_W) 'grub-core/disk/luks2.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/disk/luks2.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/disk/$(DEPDIR)/libgrubkern_a-luks2.Tpo grub-core/disk/$(DEPDIR)/libgrubkern_a-luks2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/disk/luks2.c' object='grub-core/disk/libgrubkern_a-luks2.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/disk/libgrubkern_a-luks2.obj `if test -f 'grub-core/disk/luks2.c'; then $(CYGPATH_W) 'grub-core/disk/luks2.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/disk/luks2.c'; fi` grub-core/fs/libgrubkern_a-archelp.o: grub-core/fs/archelp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubkern_a-archelp.o -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubkern_a-archelp.Tpo -c -o grub-core/fs/libgrubkern_a-archelp.o `test -f 'grub-core/fs/archelp.c' || echo '$(srcdir)/'`grub-core/fs/archelp.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubkern_a-archelp.Tpo grub-core/fs/$(DEPDIR)/libgrubkern_a-archelp.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/archelp.c' object='grub-core/fs/libgrubkern_a-archelp.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubkern_a-archelp.o `test -f 'grub-core/fs/archelp.c' || echo '$(srcdir)/'`grub-core/fs/archelp.c grub-core/fs/libgrubkern_a-archelp.obj: grub-core/fs/archelp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubkern_a-archelp.obj -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubkern_a-archelp.Tpo -c -o grub-core/fs/libgrubkern_a-archelp.obj `if test -f 'grub-core/fs/archelp.c'; then $(CYGPATH_W) 'grub-core/fs/archelp.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/archelp.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubkern_a-archelp.Tpo grub-core/fs/$(DEPDIR)/libgrubkern_a-archelp.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/archelp.c' object='grub-core/fs/libgrubkern_a-archelp.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubkern_a-archelp.obj `if test -f 'grub-core/fs/archelp.c'; then $(CYGPATH_W) 'grub-core/fs/archelp.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/archelp.c'; fi` grub-core/fs/libgrubkern_a-proc.o: grub-core/fs/proc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubkern_a-proc.o -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubkern_a-proc.Tpo -c -o grub-core/fs/libgrubkern_a-proc.o `test -f 'grub-core/fs/proc.c' || echo '$(srcdir)/'`grub-core/fs/proc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubkern_a-proc.Tpo grub-core/fs/$(DEPDIR)/libgrubkern_a-proc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/proc.c' object='grub-core/fs/libgrubkern_a-proc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubkern_a-proc.o `test -f 'grub-core/fs/proc.c' || echo '$(srcdir)/'`grub-core/fs/proc.c grub-core/fs/libgrubkern_a-proc.obj: grub-core/fs/proc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubkern_a-proc.obj -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubkern_a-proc.Tpo -c -o grub-core/fs/libgrubkern_a-proc.obj `if test -f 'grub-core/fs/proc.c'; then $(CYGPATH_W) 'grub-core/fs/proc.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/proc.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubkern_a-proc.Tpo grub-core/fs/$(DEPDIR)/libgrubkern_a-proc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/proc.c' object='grub-core/fs/libgrubkern_a-proc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubkern_a-proc.obj `if test -f 'grub-core/fs/proc.c'; then $(CYGPATH_W) 'grub-core/fs/proc.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/proc.c'; fi` grub-core/kern/libgrubkern_a-command.o: grub-core/kern/command.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/kern/libgrubkern_a-command.o -MD -MP -MF grub-core/kern/$(DEPDIR)/libgrubkern_a-command.Tpo -c -o grub-core/kern/libgrubkern_a-command.o `test -f 'grub-core/kern/command.c' || echo '$(srcdir)/'`grub-core/kern/command.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/$(DEPDIR)/libgrubkern_a-command.Tpo grub-core/kern/$(DEPDIR)/libgrubkern_a-command.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/command.c' object='grub-core/kern/libgrubkern_a-command.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/kern/libgrubkern_a-command.o `test -f 'grub-core/kern/command.c' || echo '$(srcdir)/'`grub-core/kern/command.c grub-core/kern/libgrubkern_a-command.obj: grub-core/kern/command.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/kern/libgrubkern_a-command.obj -MD -MP -MF grub-core/kern/$(DEPDIR)/libgrubkern_a-command.Tpo -c -o grub-core/kern/libgrubkern_a-command.obj `if test -f 'grub-core/kern/command.c'; then $(CYGPATH_W) 'grub-core/kern/command.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/command.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/$(DEPDIR)/libgrubkern_a-command.Tpo grub-core/kern/$(DEPDIR)/libgrubkern_a-command.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/command.c' object='grub-core/kern/libgrubkern_a-command.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/kern/libgrubkern_a-command.obj `if test -f 'grub-core/kern/command.c'; then $(CYGPATH_W) 'grub-core/kern/command.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/command.c'; fi` grub-core/kern/libgrubkern_a-device.o: grub-core/kern/device.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/kern/libgrubkern_a-device.o -MD -MP -MF grub-core/kern/$(DEPDIR)/libgrubkern_a-device.Tpo -c -o grub-core/kern/libgrubkern_a-device.o `test -f 'grub-core/kern/device.c' || echo '$(srcdir)/'`grub-core/kern/device.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/$(DEPDIR)/libgrubkern_a-device.Tpo grub-core/kern/$(DEPDIR)/libgrubkern_a-device.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/device.c' object='grub-core/kern/libgrubkern_a-device.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/kern/libgrubkern_a-device.o `test -f 'grub-core/kern/device.c' || echo '$(srcdir)/'`grub-core/kern/device.c grub-core/kern/libgrubkern_a-device.obj: grub-core/kern/device.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/kern/libgrubkern_a-device.obj -MD -MP -MF grub-core/kern/$(DEPDIR)/libgrubkern_a-device.Tpo -c -o grub-core/kern/libgrubkern_a-device.obj `if test -f 'grub-core/kern/device.c'; then $(CYGPATH_W) 'grub-core/kern/device.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/device.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/$(DEPDIR)/libgrubkern_a-device.Tpo grub-core/kern/$(DEPDIR)/libgrubkern_a-device.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/device.c' object='grub-core/kern/libgrubkern_a-device.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/kern/libgrubkern_a-device.obj `if test -f 'grub-core/kern/device.c'; then $(CYGPATH_W) 'grub-core/kern/device.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/device.c'; fi` grub-core/kern/libgrubkern_a-disk.o: grub-core/kern/disk.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/kern/libgrubkern_a-disk.o -MD -MP -MF grub-core/kern/$(DEPDIR)/libgrubkern_a-disk.Tpo -c -o grub-core/kern/libgrubkern_a-disk.o `test -f 'grub-core/kern/disk.c' || echo '$(srcdir)/'`grub-core/kern/disk.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/$(DEPDIR)/libgrubkern_a-disk.Tpo grub-core/kern/$(DEPDIR)/libgrubkern_a-disk.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/disk.c' object='grub-core/kern/libgrubkern_a-disk.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/kern/libgrubkern_a-disk.o `test -f 'grub-core/kern/disk.c' || echo '$(srcdir)/'`grub-core/kern/disk.c grub-core/kern/libgrubkern_a-disk.obj: grub-core/kern/disk.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/kern/libgrubkern_a-disk.obj -MD -MP -MF grub-core/kern/$(DEPDIR)/libgrubkern_a-disk.Tpo -c -o grub-core/kern/libgrubkern_a-disk.obj `if test -f 'grub-core/kern/disk.c'; then $(CYGPATH_W) 'grub-core/kern/disk.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/disk.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/$(DEPDIR)/libgrubkern_a-disk.Tpo grub-core/kern/$(DEPDIR)/libgrubkern_a-disk.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/disk.c' object='grub-core/kern/libgrubkern_a-disk.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/kern/libgrubkern_a-disk.obj `if test -f 'grub-core/kern/disk.c'; then $(CYGPATH_W) 'grub-core/kern/disk.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/disk.c'; fi` grub-core/kern/emu/libgrubkern_a-hostdisk.o: grub-core/kern/emu/hostdisk.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/kern/emu/libgrubkern_a-hostdisk.o -MD -MP -MF grub-core/kern/emu/$(DEPDIR)/libgrubkern_a-hostdisk.Tpo -c -o grub-core/kern/emu/libgrubkern_a-hostdisk.o `test -f 'grub-core/kern/emu/hostdisk.c' || echo '$(srcdir)/'`grub-core/kern/emu/hostdisk.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/emu/$(DEPDIR)/libgrubkern_a-hostdisk.Tpo grub-core/kern/emu/$(DEPDIR)/libgrubkern_a-hostdisk.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/emu/hostdisk.c' object='grub-core/kern/emu/libgrubkern_a-hostdisk.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/kern/emu/libgrubkern_a-hostdisk.o `test -f 'grub-core/kern/emu/hostdisk.c' || echo '$(srcdir)/'`grub-core/kern/emu/hostdisk.c grub-core/kern/emu/libgrubkern_a-hostdisk.obj: grub-core/kern/emu/hostdisk.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/kern/emu/libgrubkern_a-hostdisk.obj -MD -MP -MF grub-core/kern/emu/$(DEPDIR)/libgrubkern_a-hostdisk.Tpo -c -o grub-core/kern/emu/libgrubkern_a-hostdisk.obj `if test -f 'grub-core/kern/emu/hostdisk.c'; then $(CYGPATH_W) 'grub-core/kern/emu/hostdisk.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/emu/hostdisk.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/emu/$(DEPDIR)/libgrubkern_a-hostdisk.Tpo grub-core/kern/emu/$(DEPDIR)/libgrubkern_a-hostdisk.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/emu/hostdisk.c' object='grub-core/kern/emu/libgrubkern_a-hostdisk.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/kern/emu/libgrubkern_a-hostdisk.obj `if test -f 'grub-core/kern/emu/hostdisk.c'; then $(CYGPATH_W) 'grub-core/kern/emu/hostdisk.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/emu/hostdisk.c'; fi` grub-core/kern/emu/libgrubkern_a-misc.o: grub-core/kern/emu/misc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/kern/emu/libgrubkern_a-misc.o -MD -MP -MF grub-core/kern/emu/$(DEPDIR)/libgrubkern_a-misc.Tpo -c -o grub-core/kern/emu/libgrubkern_a-misc.o `test -f 'grub-core/kern/emu/misc.c' || echo '$(srcdir)/'`grub-core/kern/emu/misc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/emu/$(DEPDIR)/libgrubkern_a-misc.Tpo grub-core/kern/emu/$(DEPDIR)/libgrubkern_a-misc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/emu/misc.c' object='grub-core/kern/emu/libgrubkern_a-misc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/kern/emu/libgrubkern_a-misc.o `test -f 'grub-core/kern/emu/misc.c' || echo '$(srcdir)/'`grub-core/kern/emu/misc.c grub-core/kern/emu/libgrubkern_a-misc.obj: grub-core/kern/emu/misc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/kern/emu/libgrubkern_a-misc.obj -MD -MP -MF grub-core/kern/emu/$(DEPDIR)/libgrubkern_a-misc.Tpo -c -o grub-core/kern/emu/libgrubkern_a-misc.obj `if test -f 'grub-core/kern/emu/misc.c'; then $(CYGPATH_W) 'grub-core/kern/emu/misc.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/emu/misc.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/emu/$(DEPDIR)/libgrubkern_a-misc.Tpo grub-core/kern/emu/$(DEPDIR)/libgrubkern_a-misc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/emu/misc.c' object='grub-core/kern/emu/libgrubkern_a-misc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/kern/emu/libgrubkern_a-misc.obj `if test -f 'grub-core/kern/emu/misc.c'; then $(CYGPATH_W) 'grub-core/kern/emu/misc.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/emu/misc.c'; fi` grub-core/kern/emu/libgrubkern_a-mm.o: grub-core/kern/emu/mm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/kern/emu/libgrubkern_a-mm.o -MD -MP -MF grub-core/kern/emu/$(DEPDIR)/libgrubkern_a-mm.Tpo -c -o grub-core/kern/emu/libgrubkern_a-mm.o `test -f 'grub-core/kern/emu/mm.c' || echo '$(srcdir)/'`grub-core/kern/emu/mm.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/emu/$(DEPDIR)/libgrubkern_a-mm.Tpo grub-core/kern/emu/$(DEPDIR)/libgrubkern_a-mm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/emu/mm.c' object='grub-core/kern/emu/libgrubkern_a-mm.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/kern/emu/libgrubkern_a-mm.o `test -f 'grub-core/kern/emu/mm.c' || echo '$(srcdir)/'`grub-core/kern/emu/mm.c grub-core/kern/emu/libgrubkern_a-mm.obj: grub-core/kern/emu/mm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/kern/emu/libgrubkern_a-mm.obj -MD -MP -MF grub-core/kern/emu/$(DEPDIR)/libgrubkern_a-mm.Tpo -c -o grub-core/kern/emu/libgrubkern_a-mm.obj `if test -f 'grub-core/kern/emu/mm.c'; then $(CYGPATH_W) 'grub-core/kern/emu/mm.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/emu/mm.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/emu/$(DEPDIR)/libgrubkern_a-mm.Tpo grub-core/kern/emu/$(DEPDIR)/libgrubkern_a-mm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/emu/mm.c' object='grub-core/kern/emu/libgrubkern_a-mm.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/kern/emu/libgrubkern_a-mm.obj `if test -f 'grub-core/kern/emu/mm.c'; then $(CYGPATH_W) 'grub-core/kern/emu/mm.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/emu/mm.c'; fi` grub-core/kern/libgrubkern_a-env.o: grub-core/kern/env.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/kern/libgrubkern_a-env.o -MD -MP -MF grub-core/kern/$(DEPDIR)/libgrubkern_a-env.Tpo -c -o grub-core/kern/libgrubkern_a-env.o `test -f 'grub-core/kern/env.c' || echo '$(srcdir)/'`grub-core/kern/env.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/$(DEPDIR)/libgrubkern_a-env.Tpo grub-core/kern/$(DEPDIR)/libgrubkern_a-env.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/env.c' object='grub-core/kern/libgrubkern_a-env.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/kern/libgrubkern_a-env.o `test -f 'grub-core/kern/env.c' || echo '$(srcdir)/'`grub-core/kern/env.c grub-core/kern/libgrubkern_a-env.obj: grub-core/kern/env.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/kern/libgrubkern_a-env.obj -MD -MP -MF grub-core/kern/$(DEPDIR)/libgrubkern_a-env.Tpo -c -o grub-core/kern/libgrubkern_a-env.obj `if test -f 'grub-core/kern/env.c'; then $(CYGPATH_W) 'grub-core/kern/env.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/env.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/$(DEPDIR)/libgrubkern_a-env.Tpo grub-core/kern/$(DEPDIR)/libgrubkern_a-env.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/env.c' object='grub-core/kern/libgrubkern_a-env.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/kern/libgrubkern_a-env.obj `if test -f 'grub-core/kern/env.c'; then $(CYGPATH_W) 'grub-core/kern/env.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/env.c'; fi` grub-core/kern/libgrubkern_a-err.o: grub-core/kern/err.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/kern/libgrubkern_a-err.o -MD -MP -MF grub-core/kern/$(DEPDIR)/libgrubkern_a-err.Tpo -c -o grub-core/kern/libgrubkern_a-err.o `test -f 'grub-core/kern/err.c' || echo '$(srcdir)/'`grub-core/kern/err.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/$(DEPDIR)/libgrubkern_a-err.Tpo grub-core/kern/$(DEPDIR)/libgrubkern_a-err.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/err.c' object='grub-core/kern/libgrubkern_a-err.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/kern/libgrubkern_a-err.o `test -f 'grub-core/kern/err.c' || echo '$(srcdir)/'`grub-core/kern/err.c grub-core/kern/libgrubkern_a-err.obj: grub-core/kern/err.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/kern/libgrubkern_a-err.obj -MD -MP -MF grub-core/kern/$(DEPDIR)/libgrubkern_a-err.Tpo -c -o grub-core/kern/libgrubkern_a-err.obj `if test -f 'grub-core/kern/err.c'; then $(CYGPATH_W) 'grub-core/kern/err.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/err.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/$(DEPDIR)/libgrubkern_a-err.Tpo grub-core/kern/$(DEPDIR)/libgrubkern_a-err.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/err.c' object='grub-core/kern/libgrubkern_a-err.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/kern/libgrubkern_a-err.obj `if test -f 'grub-core/kern/err.c'; then $(CYGPATH_W) 'grub-core/kern/err.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/err.c'; fi` grub-core/kern/libgrubkern_a-file.o: grub-core/kern/file.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/kern/libgrubkern_a-file.o -MD -MP -MF grub-core/kern/$(DEPDIR)/libgrubkern_a-file.Tpo -c -o grub-core/kern/libgrubkern_a-file.o `test -f 'grub-core/kern/file.c' || echo '$(srcdir)/'`grub-core/kern/file.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/$(DEPDIR)/libgrubkern_a-file.Tpo grub-core/kern/$(DEPDIR)/libgrubkern_a-file.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/file.c' object='grub-core/kern/libgrubkern_a-file.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/kern/libgrubkern_a-file.o `test -f 'grub-core/kern/file.c' || echo '$(srcdir)/'`grub-core/kern/file.c grub-core/kern/libgrubkern_a-file.obj: grub-core/kern/file.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/kern/libgrubkern_a-file.obj -MD -MP -MF grub-core/kern/$(DEPDIR)/libgrubkern_a-file.Tpo -c -o grub-core/kern/libgrubkern_a-file.obj `if test -f 'grub-core/kern/file.c'; then $(CYGPATH_W) 'grub-core/kern/file.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/file.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/$(DEPDIR)/libgrubkern_a-file.Tpo grub-core/kern/$(DEPDIR)/libgrubkern_a-file.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/file.c' object='grub-core/kern/libgrubkern_a-file.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/kern/libgrubkern_a-file.obj `if test -f 'grub-core/kern/file.c'; then $(CYGPATH_W) 'grub-core/kern/file.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/file.c'; fi` grub-core/kern/libgrubkern_a-fs.o: grub-core/kern/fs.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/kern/libgrubkern_a-fs.o -MD -MP -MF grub-core/kern/$(DEPDIR)/libgrubkern_a-fs.Tpo -c -o grub-core/kern/libgrubkern_a-fs.o `test -f 'grub-core/kern/fs.c' || echo '$(srcdir)/'`grub-core/kern/fs.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/$(DEPDIR)/libgrubkern_a-fs.Tpo grub-core/kern/$(DEPDIR)/libgrubkern_a-fs.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/fs.c' object='grub-core/kern/libgrubkern_a-fs.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/kern/libgrubkern_a-fs.o `test -f 'grub-core/kern/fs.c' || echo '$(srcdir)/'`grub-core/kern/fs.c grub-core/kern/libgrubkern_a-fs.obj: grub-core/kern/fs.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/kern/libgrubkern_a-fs.obj -MD -MP -MF grub-core/kern/$(DEPDIR)/libgrubkern_a-fs.Tpo -c -o grub-core/kern/libgrubkern_a-fs.obj `if test -f 'grub-core/kern/fs.c'; then $(CYGPATH_W) 'grub-core/kern/fs.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/fs.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/$(DEPDIR)/libgrubkern_a-fs.Tpo grub-core/kern/$(DEPDIR)/libgrubkern_a-fs.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/fs.c' object='grub-core/kern/libgrubkern_a-fs.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/kern/libgrubkern_a-fs.obj `if test -f 'grub-core/kern/fs.c'; then $(CYGPATH_W) 'grub-core/kern/fs.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/fs.c'; fi` grub-core/kern/libgrubkern_a-list.o: grub-core/kern/list.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/kern/libgrubkern_a-list.o -MD -MP -MF grub-core/kern/$(DEPDIR)/libgrubkern_a-list.Tpo -c -o grub-core/kern/libgrubkern_a-list.o `test -f 'grub-core/kern/list.c' || echo '$(srcdir)/'`grub-core/kern/list.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/$(DEPDIR)/libgrubkern_a-list.Tpo grub-core/kern/$(DEPDIR)/libgrubkern_a-list.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/list.c' object='grub-core/kern/libgrubkern_a-list.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/kern/libgrubkern_a-list.o `test -f 'grub-core/kern/list.c' || echo '$(srcdir)/'`grub-core/kern/list.c grub-core/kern/libgrubkern_a-list.obj: grub-core/kern/list.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/kern/libgrubkern_a-list.obj -MD -MP -MF grub-core/kern/$(DEPDIR)/libgrubkern_a-list.Tpo -c -o grub-core/kern/libgrubkern_a-list.obj `if test -f 'grub-core/kern/list.c'; then $(CYGPATH_W) 'grub-core/kern/list.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/list.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/$(DEPDIR)/libgrubkern_a-list.Tpo grub-core/kern/$(DEPDIR)/libgrubkern_a-list.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/list.c' object='grub-core/kern/libgrubkern_a-list.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/kern/libgrubkern_a-list.obj `if test -f 'grub-core/kern/list.c'; then $(CYGPATH_W) 'grub-core/kern/list.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/list.c'; fi` grub-core/kern/libgrubkern_a-misc.o: grub-core/kern/misc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/kern/libgrubkern_a-misc.o -MD -MP -MF grub-core/kern/$(DEPDIR)/libgrubkern_a-misc.Tpo -c -o grub-core/kern/libgrubkern_a-misc.o `test -f 'grub-core/kern/misc.c' || echo '$(srcdir)/'`grub-core/kern/misc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/$(DEPDIR)/libgrubkern_a-misc.Tpo grub-core/kern/$(DEPDIR)/libgrubkern_a-misc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/misc.c' object='grub-core/kern/libgrubkern_a-misc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/kern/libgrubkern_a-misc.o `test -f 'grub-core/kern/misc.c' || echo '$(srcdir)/'`grub-core/kern/misc.c grub-core/kern/libgrubkern_a-misc.obj: grub-core/kern/misc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/kern/libgrubkern_a-misc.obj -MD -MP -MF grub-core/kern/$(DEPDIR)/libgrubkern_a-misc.Tpo -c -o grub-core/kern/libgrubkern_a-misc.obj `if test -f 'grub-core/kern/misc.c'; then $(CYGPATH_W) 'grub-core/kern/misc.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/misc.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/$(DEPDIR)/libgrubkern_a-misc.Tpo grub-core/kern/$(DEPDIR)/libgrubkern_a-misc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/misc.c' object='grub-core/kern/libgrubkern_a-misc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/kern/libgrubkern_a-misc.obj `if test -f 'grub-core/kern/misc.c'; then $(CYGPATH_W) 'grub-core/kern/misc.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/misc.c'; fi` grub-core/kern/libgrubkern_a-partition.o: grub-core/kern/partition.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/kern/libgrubkern_a-partition.o -MD -MP -MF grub-core/kern/$(DEPDIR)/libgrubkern_a-partition.Tpo -c -o grub-core/kern/libgrubkern_a-partition.o `test -f 'grub-core/kern/partition.c' || echo '$(srcdir)/'`grub-core/kern/partition.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/$(DEPDIR)/libgrubkern_a-partition.Tpo grub-core/kern/$(DEPDIR)/libgrubkern_a-partition.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/partition.c' object='grub-core/kern/libgrubkern_a-partition.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/kern/libgrubkern_a-partition.o `test -f 'grub-core/kern/partition.c' || echo '$(srcdir)/'`grub-core/kern/partition.c grub-core/kern/libgrubkern_a-partition.obj: grub-core/kern/partition.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/kern/libgrubkern_a-partition.obj -MD -MP -MF grub-core/kern/$(DEPDIR)/libgrubkern_a-partition.Tpo -c -o grub-core/kern/libgrubkern_a-partition.obj `if test -f 'grub-core/kern/partition.c'; then $(CYGPATH_W) 'grub-core/kern/partition.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/partition.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/$(DEPDIR)/libgrubkern_a-partition.Tpo grub-core/kern/$(DEPDIR)/libgrubkern_a-partition.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/partition.c' object='grub-core/kern/libgrubkern_a-partition.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/kern/libgrubkern_a-partition.obj `if test -f 'grub-core/kern/partition.c'; then $(CYGPATH_W) 'grub-core/kern/partition.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/partition.c'; fi` grub-core/lib/libgrubkern_a-arg.o: grub-core/lib/arg.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgrubkern_a-arg.o -MD -MP -MF grub-core/lib/$(DEPDIR)/libgrubkern_a-arg.Tpo -c -o grub-core/lib/libgrubkern_a-arg.o `test -f 'grub-core/lib/arg.c' || echo '$(srcdir)/'`grub-core/lib/arg.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/$(DEPDIR)/libgrubkern_a-arg.Tpo grub-core/lib/$(DEPDIR)/libgrubkern_a-arg.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/arg.c' object='grub-core/lib/libgrubkern_a-arg.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgrubkern_a-arg.o `test -f 'grub-core/lib/arg.c' || echo '$(srcdir)/'`grub-core/lib/arg.c grub-core/lib/libgrubkern_a-arg.obj: grub-core/lib/arg.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgrubkern_a-arg.obj -MD -MP -MF grub-core/lib/$(DEPDIR)/libgrubkern_a-arg.Tpo -c -o grub-core/lib/libgrubkern_a-arg.obj `if test -f 'grub-core/lib/arg.c'; then $(CYGPATH_W) 'grub-core/lib/arg.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/arg.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/$(DEPDIR)/libgrubkern_a-arg.Tpo grub-core/lib/$(DEPDIR)/libgrubkern_a-arg.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/arg.c' object='grub-core/lib/libgrubkern_a-arg.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgrubkern_a-arg.obj `if test -f 'grub-core/lib/arg.c'; then $(CYGPATH_W) 'grub-core/lib/arg.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/arg.c'; fi` grub-core/lib/libgrubkern_a-crypto.o: grub-core/lib/crypto.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgrubkern_a-crypto.o -MD -MP -MF grub-core/lib/$(DEPDIR)/libgrubkern_a-crypto.Tpo -c -o grub-core/lib/libgrubkern_a-crypto.o `test -f 'grub-core/lib/crypto.c' || echo '$(srcdir)/'`grub-core/lib/crypto.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/$(DEPDIR)/libgrubkern_a-crypto.Tpo grub-core/lib/$(DEPDIR)/libgrubkern_a-crypto.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/crypto.c' object='grub-core/lib/libgrubkern_a-crypto.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgrubkern_a-crypto.o `test -f 'grub-core/lib/crypto.c' || echo '$(srcdir)/'`grub-core/lib/crypto.c grub-core/lib/libgrubkern_a-crypto.obj: grub-core/lib/crypto.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgrubkern_a-crypto.obj -MD -MP -MF grub-core/lib/$(DEPDIR)/libgrubkern_a-crypto.Tpo -c -o grub-core/lib/libgrubkern_a-crypto.obj `if test -f 'grub-core/lib/crypto.c'; then $(CYGPATH_W) 'grub-core/lib/crypto.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/crypto.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/$(DEPDIR)/libgrubkern_a-crypto.Tpo grub-core/lib/$(DEPDIR)/libgrubkern_a-crypto.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/crypto.c' object='grub-core/lib/libgrubkern_a-crypto.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgrubkern_a-crypto.obj `if test -f 'grub-core/lib/crypto.c'; then $(CYGPATH_W) 'grub-core/lib/crypto.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/crypto.c'; fi` grub-core/lib/libgrubkern_a-disk.o: grub-core/lib/disk.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgrubkern_a-disk.o -MD -MP -MF grub-core/lib/$(DEPDIR)/libgrubkern_a-disk.Tpo -c -o grub-core/lib/libgrubkern_a-disk.o `test -f 'grub-core/lib/disk.c' || echo '$(srcdir)/'`grub-core/lib/disk.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/$(DEPDIR)/libgrubkern_a-disk.Tpo grub-core/lib/$(DEPDIR)/libgrubkern_a-disk.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/disk.c' object='grub-core/lib/libgrubkern_a-disk.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgrubkern_a-disk.o `test -f 'grub-core/lib/disk.c' || echo '$(srcdir)/'`grub-core/lib/disk.c grub-core/lib/libgrubkern_a-disk.obj: grub-core/lib/disk.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgrubkern_a-disk.obj -MD -MP -MF grub-core/lib/$(DEPDIR)/libgrubkern_a-disk.Tpo -c -o grub-core/lib/libgrubkern_a-disk.obj `if test -f 'grub-core/lib/disk.c'; then $(CYGPATH_W) 'grub-core/lib/disk.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/disk.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/$(DEPDIR)/libgrubkern_a-disk.Tpo grub-core/lib/$(DEPDIR)/libgrubkern_a-disk.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/disk.c' object='grub-core/lib/libgrubkern_a-disk.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgrubkern_a-disk.obj `if test -f 'grub-core/lib/disk.c'; then $(CYGPATH_W) 'grub-core/lib/disk.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/disk.c'; fi` grub-core/lib/json/libgrubkern_a-json.o: grub-core/lib/json/json.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/json/libgrubkern_a-json.o -MD -MP -MF grub-core/lib/json/$(DEPDIR)/libgrubkern_a-json.Tpo -c -o grub-core/lib/json/libgrubkern_a-json.o `test -f 'grub-core/lib/json/json.c' || echo '$(srcdir)/'`grub-core/lib/json/json.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/json/$(DEPDIR)/libgrubkern_a-json.Tpo grub-core/lib/json/$(DEPDIR)/libgrubkern_a-json.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/json/json.c' object='grub-core/lib/json/libgrubkern_a-json.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/json/libgrubkern_a-json.o `test -f 'grub-core/lib/json/json.c' || echo '$(srcdir)/'`grub-core/lib/json/json.c grub-core/lib/json/libgrubkern_a-json.obj: grub-core/lib/json/json.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/json/libgrubkern_a-json.obj -MD -MP -MF grub-core/lib/json/$(DEPDIR)/libgrubkern_a-json.Tpo -c -o grub-core/lib/json/libgrubkern_a-json.obj `if test -f 'grub-core/lib/json/json.c'; then $(CYGPATH_W) 'grub-core/lib/json/json.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/json/json.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/json/$(DEPDIR)/libgrubkern_a-json.Tpo grub-core/lib/json/$(DEPDIR)/libgrubkern_a-json.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/json/json.c' object='grub-core/lib/json/libgrubkern_a-json.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/json/libgrubkern_a-json.obj `if test -f 'grub-core/lib/json/json.c'; then $(CYGPATH_W) 'grub-core/lib/json/json.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/json/json.c'; fi` grub-core/lib/libgrubkern_a-pbkdf2.o: grub-core/lib/pbkdf2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgrubkern_a-pbkdf2.o -MD -MP -MF grub-core/lib/$(DEPDIR)/libgrubkern_a-pbkdf2.Tpo -c -o grub-core/lib/libgrubkern_a-pbkdf2.o `test -f 'grub-core/lib/pbkdf2.c' || echo '$(srcdir)/'`grub-core/lib/pbkdf2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/$(DEPDIR)/libgrubkern_a-pbkdf2.Tpo grub-core/lib/$(DEPDIR)/libgrubkern_a-pbkdf2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/pbkdf2.c' object='grub-core/lib/libgrubkern_a-pbkdf2.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgrubkern_a-pbkdf2.o `test -f 'grub-core/lib/pbkdf2.c' || echo '$(srcdir)/'`grub-core/lib/pbkdf2.c grub-core/lib/libgrubkern_a-pbkdf2.obj: grub-core/lib/pbkdf2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgrubkern_a-pbkdf2.obj -MD -MP -MF grub-core/lib/$(DEPDIR)/libgrubkern_a-pbkdf2.Tpo -c -o grub-core/lib/libgrubkern_a-pbkdf2.obj `if test -f 'grub-core/lib/pbkdf2.c'; then $(CYGPATH_W) 'grub-core/lib/pbkdf2.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/pbkdf2.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/$(DEPDIR)/libgrubkern_a-pbkdf2.Tpo grub-core/lib/$(DEPDIR)/libgrubkern_a-pbkdf2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/pbkdf2.c' object='grub-core/lib/libgrubkern_a-pbkdf2.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgrubkern_a-pbkdf2.obj `if test -f 'grub-core/lib/pbkdf2.c'; then $(CYGPATH_W) 'grub-core/lib/pbkdf2.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/pbkdf2.c'; fi` grub-core/osdep/devmapper/libgrubkern_a-getroot.o: grub-core/osdep/devmapper/getroot.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/osdep/devmapper/libgrubkern_a-getroot.o -MD -MP -MF grub-core/osdep/devmapper/$(DEPDIR)/libgrubkern_a-getroot.Tpo -c -o grub-core/osdep/devmapper/libgrubkern_a-getroot.o `test -f 'grub-core/osdep/devmapper/getroot.c' || echo '$(srcdir)/'`grub-core/osdep/devmapper/getroot.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/devmapper/$(DEPDIR)/libgrubkern_a-getroot.Tpo grub-core/osdep/devmapper/$(DEPDIR)/libgrubkern_a-getroot.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/devmapper/getroot.c' object='grub-core/osdep/devmapper/libgrubkern_a-getroot.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/devmapper/libgrubkern_a-getroot.o `test -f 'grub-core/osdep/devmapper/getroot.c' || echo '$(srcdir)/'`grub-core/osdep/devmapper/getroot.c grub-core/osdep/devmapper/libgrubkern_a-getroot.obj: grub-core/osdep/devmapper/getroot.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/osdep/devmapper/libgrubkern_a-getroot.obj -MD -MP -MF grub-core/osdep/devmapper/$(DEPDIR)/libgrubkern_a-getroot.Tpo -c -o grub-core/osdep/devmapper/libgrubkern_a-getroot.obj `if test -f 'grub-core/osdep/devmapper/getroot.c'; then $(CYGPATH_W) 'grub-core/osdep/devmapper/getroot.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/devmapper/getroot.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/devmapper/$(DEPDIR)/libgrubkern_a-getroot.Tpo grub-core/osdep/devmapper/$(DEPDIR)/libgrubkern_a-getroot.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/devmapper/getroot.c' object='grub-core/osdep/devmapper/libgrubkern_a-getroot.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/devmapper/libgrubkern_a-getroot.obj `if test -f 'grub-core/osdep/devmapper/getroot.c'; then $(CYGPATH_W) 'grub-core/osdep/devmapper/getroot.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/devmapper/getroot.c'; fi` grub-core/osdep/devmapper/libgrubkern_a-hostdisk.o: grub-core/osdep/devmapper/hostdisk.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/osdep/devmapper/libgrubkern_a-hostdisk.o -MD -MP -MF grub-core/osdep/devmapper/$(DEPDIR)/libgrubkern_a-hostdisk.Tpo -c -o grub-core/osdep/devmapper/libgrubkern_a-hostdisk.o `test -f 'grub-core/osdep/devmapper/hostdisk.c' || echo '$(srcdir)/'`grub-core/osdep/devmapper/hostdisk.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/devmapper/$(DEPDIR)/libgrubkern_a-hostdisk.Tpo grub-core/osdep/devmapper/$(DEPDIR)/libgrubkern_a-hostdisk.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/devmapper/hostdisk.c' object='grub-core/osdep/devmapper/libgrubkern_a-hostdisk.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/devmapper/libgrubkern_a-hostdisk.o `test -f 'grub-core/osdep/devmapper/hostdisk.c' || echo '$(srcdir)/'`grub-core/osdep/devmapper/hostdisk.c grub-core/osdep/devmapper/libgrubkern_a-hostdisk.obj: grub-core/osdep/devmapper/hostdisk.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/osdep/devmapper/libgrubkern_a-hostdisk.obj -MD -MP -MF grub-core/osdep/devmapper/$(DEPDIR)/libgrubkern_a-hostdisk.Tpo -c -o grub-core/osdep/devmapper/libgrubkern_a-hostdisk.obj `if test -f 'grub-core/osdep/devmapper/hostdisk.c'; then $(CYGPATH_W) 'grub-core/osdep/devmapper/hostdisk.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/devmapper/hostdisk.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/devmapper/$(DEPDIR)/libgrubkern_a-hostdisk.Tpo grub-core/osdep/devmapper/$(DEPDIR)/libgrubkern_a-hostdisk.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/devmapper/hostdisk.c' object='grub-core/osdep/devmapper/libgrubkern_a-hostdisk.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/devmapper/libgrubkern_a-hostdisk.obj `if test -f 'grub-core/osdep/devmapper/hostdisk.c'; then $(CYGPATH_W) 'grub-core/osdep/devmapper/hostdisk.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/devmapper/hostdisk.c'; fi` grub-core/osdep/libgrubkern_a-exec.o: grub-core/osdep/exec.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/osdep/libgrubkern_a-exec.o -MD -MP -MF grub-core/osdep/$(DEPDIR)/libgrubkern_a-exec.Tpo -c -o grub-core/osdep/libgrubkern_a-exec.o `test -f 'grub-core/osdep/exec.c' || echo '$(srcdir)/'`grub-core/osdep/exec.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/libgrubkern_a-exec.Tpo grub-core/osdep/$(DEPDIR)/libgrubkern_a-exec.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/exec.c' object='grub-core/osdep/libgrubkern_a-exec.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/libgrubkern_a-exec.o `test -f 'grub-core/osdep/exec.c' || echo '$(srcdir)/'`grub-core/osdep/exec.c grub-core/osdep/libgrubkern_a-exec.obj: grub-core/osdep/exec.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/osdep/libgrubkern_a-exec.obj -MD -MP -MF grub-core/osdep/$(DEPDIR)/libgrubkern_a-exec.Tpo -c -o grub-core/osdep/libgrubkern_a-exec.obj `if test -f 'grub-core/osdep/exec.c'; then $(CYGPATH_W) 'grub-core/osdep/exec.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/exec.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/libgrubkern_a-exec.Tpo grub-core/osdep/$(DEPDIR)/libgrubkern_a-exec.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/exec.c' object='grub-core/osdep/libgrubkern_a-exec.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/libgrubkern_a-exec.obj `if test -f 'grub-core/osdep/exec.c'; then $(CYGPATH_W) 'grub-core/osdep/exec.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/exec.c'; fi` grub-core/osdep/libgrubkern_a-getroot.o: grub-core/osdep/getroot.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/osdep/libgrubkern_a-getroot.o -MD -MP -MF grub-core/osdep/$(DEPDIR)/libgrubkern_a-getroot.Tpo -c -o grub-core/osdep/libgrubkern_a-getroot.o `test -f 'grub-core/osdep/getroot.c' || echo '$(srcdir)/'`grub-core/osdep/getroot.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/libgrubkern_a-getroot.Tpo grub-core/osdep/$(DEPDIR)/libgrubkern_a-getroot.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/getroot.c' object='grub-core/osdep/libgrubkern_a-getroot.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/libgrubkern_a-getroot.o `test -f 'grub-core/osdep/getroot.c' || echo '$(srcdir)/'`grub-core/osdep/getroot.c grub-core/osdep/libgrubkern_a-getroot.obj: grub-core/osdep/getroot.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/osdep/libgrubkern_a-getroot.obj -MD -MP -MF grub-core/osdep/$(DEPDIR)/libgrubkern_a-getroot.Tpo -c -o grub-core/osdep/libgrubkern_a-getroot.obj `if test -f 'grub-core/osdep/getroot.c'; then $(CYGPATH_W) 'grub-core/osdep/getroot.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/getroot.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/libgrubkern_a-getroot.Tpo grub-core/osdep/$(DEPDIR)/libgrubkern_a-getroot.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/getroot.c' object='grub-core/osdep/libgrubkern_a-getroot.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/libgrubkern_a-getroot.obj `if test -f 'grub-core/osdep/getroot.c'; then $(CYGPATH_W) 'grub-core/osdep/getroot.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/getroot.c'; fi` grub-core/osdep/libgrubkern_a-hostdisk.o: grub-core/osdep/hostdisk.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/osdep/libgrubkern_a-hostdisk.o -MD -MP -MF grub-core/osdep/$(DEPDIR)/libgrubkern_a-hostdisk.Tpo -c -o grub-core/osdep/libgrubkern_a-hostdisk.o `test -f 'grub-core/osdep/hostdisk.c' || echo '$(srcdir)/'`grub-core/osdep/hostdisk.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/libgrubkern_a-hostdisk.Tpo grub-core/osdep/$(DEPDIR)/libgrubkern_a-hostdisk.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/hostdisk.c' object='grub-core/osdep/libgrubkern_a-hostdisk.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/libgrubkern_a-hostdisk.o `test -f 'grub-core/osdep/hostdisk.c' || echo '$(srcdir)/'`grub-core/osdep/hostdisk.c grub-core/osdep/libgrubkern_a-hostdisk.obj: grub-core/osdep/hostdisk.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/osdep/libgrubkern_a-hostdisk.obj -MD -MP -MF grub-core/osdep/$(DEPDIR)/libgrubkern_a-hostdisk.Tpo -c -o grub-core/osdep/libgrubkern_a-hostdisk.obj `if test -f 'grub-core/osdep/hostdisk.c'; then $(CYGPATH_W) 'grub-core/osdep/hostdisk.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/hostdisk.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/libgrubkern_a-hostdisk.Tpo grub-core/osdep/$(DEPDIR)/libgrubkern_a-hostdisk.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/hostdisk.c' object='grub-core/osdep/libgrubkern_a-hostdisk.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/libgrubkern_a-hostdisk.obj `if test -f 'grub-core/osdep/hostdisk.c'; then $(CYGPATH_W) 'grub-core/osdep/hostdisk.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/hostdisk.c'; fi` grub-core/osdep/libgrubkern_a-password.o: grub-core/osdep/password.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/osdep/libgrubkern_a-password.o -MD -MP -MF grub-core/osdep/$(DEPDIR)/libgrubkern_a-password.Tpo -c -o grub-core/osdep/libgrubkern_a-password.o `test -f 'grub-core/osdep/password.c' || echo '$(srcdir)/'`grub-core/osdep/password.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/libgrubkern_a-password.Tpo grub-core/osdep/$(DEPDIR)/libgrubkern_a-password.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/password.c' object='grub-core/osdep/libgrubkern_a-password.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/libgrubkern_a-password.o `test -f 'grub-core/osdep/password.c' || echo '$(srcdir)/'`grub-core/osdep/password.c grub-core/osdep/libgrubkern_a-password.obj: grub-core/osdep/password.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/osdep/libgrubkern_a-password.obj -MD -MP -MF grub-core/osdep/$(DEPDIR)/libgrubkern_a-password.Tpo -c -o grub-core/osdep/libgrubkern_a-password.obj `if test -f 'grub-core/osdep/password.c'; then $(CYGPATH_W) 'grub-core/osdep/password.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/password.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/libgrubkern_a-password.Tpo grub-core/osdep/$(DEPDIR)/libgrubkern_a-password.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/password.c' object='grub-core/osdep/libgrubkern_a-password.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/libgrubkern_a-password.obj `if test -f 'grub-core/osdep/password.c'; then $(CYGPATH_W) 'grub-core/osdep/password.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/password.c'; fi` grub-core/osdep/libgrubkern_a-relpath.o: grub-core/osdep/relpath.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/osdep/libgrubkern_a-relpath.o -MD -MP -MF grub-core/osdep/$(DEPDIR)/libgrubkern_a-relpath.Tpo -c -o grub-core/osdep/libgrubkern_a-relpath.o `test -f 'grub-core/osdep/relpath.c' || echo '$(srcdir)/'`grub-core/osdep/relpath.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/libgrubkern_a-relpath.Tpo grub-core/osdep/$(DEPDIR)/libgrubkern_a-relpath.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/relpath.c' object='grub-core/osdep/libgrubkern_a-relpath.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/libgrubkern_a-relpath.o `test -f 'grub-core/osdep/relpath.c' || echo '$(srcdir)/'`grub-core/osdep/relpath.c grub-core/osdep/libgrubkern_a-relpath.obj: grub-core/osdep/relpath.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/osdep/libgrubkern_a-relpath.obj -MD -MP -MF grub-core/osdep/$(DEPDIR)/libgrubkern_a-relpath.Tpo -c -o grub-core/osdep/libgrubkern_a-relpath.obj `if test -f 'grub-core/osdep/relpath.c'; then $(CYGPATH_W) 'grub-core/osdep/relpath.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/relpath.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/libgrubkern_a-relpath.Tpo grub-core/osdep/$(DEPDIR)/libgrubkern_a-relpath.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/relpath.c' object='grub-core/osdep/libgrubkern_a-relpath.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/libgrubkern_a-relpath.obj `if test -f 'grub-core/osdep/relpath.c'; then $(CYGPATH_W) 'grub-core/osdep/relpath.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/relpath.c'; fi` grub-core/osdep/libgrubkern_a-sleep.o: grub-core/osdep/sleep.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/osdep/libgrubkern_a-sleep.o -MD -MP -MF grub-core/osdep/$(DEPDIR)/libgrubkern_a-sleep.Tpo -c -o grub-core/osdep/libgrubkern_a-sleep.o `test -f 'grub-core/osdep/sleep.c' || echo '$(srcdir)/'`grub-core/osdep/sleep.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/libgrubkern_a-sleep.Tpo grub-core/osdep/$(DEPDIR)/libgrubkern_a-sleep.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/sleep.c' object='grub-core/osdep/libgrubkern_a-sleep.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/libgrubkern_a-sleep.o `test -f 'grub-core/osdep/sleep.c' || echo '$(srcdir)/'`grub-core/osdep/sleep.c grub-core/osdep/libgrubkern_a-sleep.obj: grub-core/osdep/sleep.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/osdep/libgrubkern_a-sleep.obj -MD -MP -MF grub-core/osdep/$(DEPDIR)/libgrubkern_a-sleep.Tpo -c -o grub-core/osdep/libgrubkern_a-sleep.obj `if test -f 'grub-core/osdep/sleep.c'; then $(CYGPATH_W) 'grub-core/osdep/sleep.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/sleep.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/libgrubkern_a-sleep.Tpo grub-core/osdep/$(DEPDIR)/libgrubkern_a-sleep.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/sleep.c' object='grub-core/osdep/libgrubkern_a-sleep.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/libgrubkern_a-sleep.obj `if test -f 'grub-core/osdep/sleep.c'; then $(CYGPATH_W) 'grub-core/osdep/sleep.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/sleep.c'; fi` grub-core/osdep/unix/libgrubkern_a-getroot.o: grub-core/osdep/unix/getroot.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/osdep/unix/libgrubkern_a-getroot.o -MD -MP -MF grub-core/osdep/unix/$(DEPDIR)/libgrubkern_a-getroot.Tpo -c -o grub-core/osdep/unix/libgrubkern_a-getroot.o `test -f 'grub-core/osdep/unix/getroot.c' || echo '$(srcdir)/'`grub-core/osdep/unix/getroot.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/unix/$(DEPDIR)/libgrubkern_a-getroot.Tpo grub-core/osdep/unix/$(DEPDIR)/libgrubkern_a-getroot.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/unix/getroot.c' object='grub-core/osdep/unix/libgrubkern_a-getroot.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/unix/libgrubkern_a-getroot.o `test -f 'grub-core/osdep/unix/getroot.c' || echo '$(srcdir)/'`grub-core/osdep/unix/getroot.c grub-core/osdep/unix/libgrubkern_a-getroot.obj: grub-core/osdep/unix/getroot.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/osdep/unix/libgrubkern_a-getroot.obj -MD -MP -MF grub-core/osdep/unix/$(DEPDIR)/libgrubkern_a-getroot.Tpo -c -o grub-core/osdep/unix/libgrubkern_a-getroot.obj `if test -f 'grub-core/osdep/unix/getroot.c'; then $(CYGPATH_W) 'grub-core/osdep/unix/getroot.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/unix/getroot.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/unix/$(DEPDIR)/libgrubkern_a-getroot.Tpo grub-core/osdep/unix/$(DEPDIR)/libgrubkern_a-getroot.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/unix/getroot.c' object='grub-core/osdep/unix/libgrubkern_a-getroot.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/unix/libgrubkern_a-getroot.obj `if test -f 'grub-core/osdep/unix/getroot.c'; then $(CYGPATH_W) 'grub-core/osdep/unix/getroot.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/unix/getroot.c'; fi` grub-core/osdep/unix/libgrubkern_a-hostdisk.o: grub-core/osdep/unix/hostdisk.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/osdep/unix/libgrubkern_a-hostdisk.o -MD -MP -MF grub-core/osdep/unix/$(DEPDIR)/libgrubkern_a-hostdisk.Tpo -c -o grub-core/osdep/unix/libgrubkern_a-hostdisk.o `test -f 'grub-core/osdep/unix/hostdisk.c' || echo '$(srcdir)/'`grub-core/osdep/unix/hostdisk.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/unix/$(DEPDIR)/libgrubkern_a-hostdisk.Tpo grub-core/osdep/unix/$(DEPDIR)/libgrubkern_a-hostdisk.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/unix/hostdisk.c' object='grub-core/osdep/unix/libgrubkern_a-hostdisk.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/unix/libgrubkern_a-hostdisk.o `test -f 'grub-core/osdep/unix/hostdisk.c' || echo '$(srcdir)/'`grub-core/osdep/unix/hostdisk.c grub-core/osdep/unix/libgrubkern_a-hostdisk.obj: grub-core/osdep/unix/hostdisk.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/osdep/unix/libgrubkern_a-hostdisk.obj -MD -MP -MF grub-core/osdep/unix/$(DEPDIR)/libgrubkern_a-hostdisk.Tpo -c -o grub-core/osdep/unix/libgrubkern_a-hostdisk.obj `if test -f 'grub-core/osdep/unix/hostdisk.c'; then $(CYGPATH_W) 'grub-core/osdep/unix/hostdisk.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/unix/hostdisk.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/unix/$(DEPDIR)/libgrubkern_a-hostdisk.Tpo grub-core/osdep/unix/$(DEPDIR)/libgrubkern_a-hostdisk.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/unix/hostdisk.c' object='grub-core/osdep/unix/libgrubkern_a-hostdisk.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/unix/libgrubkern_a-hostdisk.obj `if test -f 'grub-core/osdep/unix/hostdisk.c'; then $(CYGPATH_W) 'grub-core/osdep/unix/hostdisk.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/unix/hostdisk.c'; fi` grub-core/partmap/libgrubkern_a-gpt.o: grub-core/partmap/gpt.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/partmap/libgrubkern_a-gpt.o -MD -MP -MF grub-core/partmap/$(DEPDIR)/libgrubkern_a-gpt.Tpo -c -o grub-core/partmap/libgrubkern_a-gpt.o `test -f 'grub-core/partmap/gpt.c' || echo '$(srcdir)/'`grub-core/partmap/gpt.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/partmap/$(DEPDIR)/libgrubkern_a-gpt.Tpo grub-core/partmap/$(DEPDIR)/libgrubkern_a-gpt.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/partmap/gpt.c' object='grub-core/partmap/libgrubkern_a-gpt.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/partmap/libgrubkern_a-gpt.o `test -f 'grub-core/partmap/gpt.c' || echo '$(srcdir)/'`grub-core/partmap/gpt.c grub-core/partmap/libgrubkern_a-gpt.obj: grub-core/partmap/gpt.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/partmap/libgrubkern_a-gpt.obj -MD -MP -MF grub-core/partmap/$(DEPDIR)/libgrubkern_a-gpt.Tpo -c -o grub-core/partmap/libgrubkern_a-gpt.obj `if test -f 'grub-core/partmap/gpt.c'; then $(CYGPATH_W) 'grub-core/partmap/gpt.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/partmap/gpt.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/partmap/$(DEPDIR)/libgrubkern_a-gpt.Tpo grub-core/partmap/$(DEPDIR)/libgrubkern_a-gpt.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/partmap/gpt.c' object='grub-core/partmap/libgrubkern_a-gpt.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/partmap/libgrubkern_a-gpt.obj `if test -f 'grub-core/partmap/gpt.c'; then $(CYGPATH_W) 'grub-core/partmap/gpt.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/partmap/gpt.c'; fi` grub-core/partmap/libgrubkern_a-msdos.o: grub-core/partmap/msdos.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/partmap/libgrubkern_a-msdos.o -MD -MP -MF grub-core/partmap/$(DEPDIR)/libgrubkern_a-msdos.Tpo -c -o grub-core/partmap/libgrubkern_a-msdos.o `test -f 'grub-core/partmap/msdos.c' || echo '$(srcdir)/'`grub-core/partmap/msdos.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/partmap/$(DEPDIR)/libgrubkern_a-msdos.Tpo grub-core/partmap/$(DEPDIR)/libgrubkern_a-msdos.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/partmap/msdos.c' object='grub-core/partmap/libgrubkern_a-msdos.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/partmap/libgrubkern_a-msdos.o `test -f 'grub-core/partmap/msdos.c' || echo '$(srcdir)/'`grub-core/partmap/msdos.c grub-core/partmap/libgrubkern_a-msdos.obj: grub-core/partmap/msdos.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT grub-core/partmap/libgrubkern_a-msdos.obj -MD -MP -MF grub-core/partmap/$(DEPDIR)/libgrubkern_a-msdos.Tpo -c -o grub-core/partmap/libgrubkern_a-msdos.obj `if test -f 'grub-core/partmap/msdos.c'; then $(CYGPATH_W) 'grub-core/partmap/msdos.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/partmap/msdos.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/partmap/$(DEPDIR)/libgrubkern_a-msdos.Tpo grub-core/partmap/$(DEPDIR)/libgrubkern_a-msdos.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/partmap/msdos.c' object='grub-core/partmap/libgrubkern_a-msdos.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o grub-core/partmap/libgrubkern_a-msdos.obj `if test -f 'grub-core/partmap/msdos.c'; then $(CYGPATH_W) 'grub-core/partmap/msdos.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/partmap/msdos.c'; fi` util/libgrubkern_a-getroot.o: util/getroot.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT util/libgrubkern_a-getroot.o -MD -MP -MF util/$(DEPDIR)/libgrubkern_a-getroot.Tpo -c -o util/libgrubkern_a-getroot.o `test -f 'util/getroot.c' || echo '$(srcdir)/'`util/getroot.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/libgrubkern_a-getroot.Tpo util/$(DEPDIR)/libgrubkern_a-getroot.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/getroot.c' object='util/libgrubkern_a-getroot.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o util/libgrubkern_a-getroot.o `test -f 'util/getroot.c' || echo '$(srcdir)/'`util/getroot.c util/libgrubkern_a-getroot.obj: util/getroot.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT util/libgrubkern_a-getroot.obj -MD -MP -MF util/$(DEPDIR)/libgrubkern_a-getroot.Tpo -c -o util/libgrubkern_a-getroot.obj `if test -f 'util/getroot.c'; then $(CYGPATH_W) 'util/getroot.c'; else $(CYGPATH_W) '$(srcdir)/util/getroot.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/libgrubkern_a-getroot.Tpo util/$(DEPDIR)/libgrubkern_a-getroot.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/getroot.c' object='util/libgrubkern_a-getroot.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o util/libgrubkern_a-getroot.obj `if test -f 'util/getroot.c'; then $(CYGPATH_W) 'util/getroot.c'; else $(CYGPATH_W) '$(srcdir)/util/getroot.c'; fi` util/libgrubkern_a-misc.o: util/misc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT util/libgrubkern_a-misc.o -MD -MP -MF util/$(DEPDIR)/libgrubkern_a-misc.Tpo -c -o util/libgrubkern_a-misc.o `test -f 'util/misc.c' || echo '$(srcdir)/'`util/misc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/libgrubkern_a-misc.Tpo util/$(DEPDIR)/libgrubkern_a-misc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/misc.c' object='util/libgrubkern_a-misc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o util/libgrubkern_a-misc.o `test -f 'util/misc.c' || echo '$(srcdir)/'`util/misc.c util/libgrubkern_a-misc.obj: util/misc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -MT util/libgrubkern_a-misc.obj -MD -MP -MF util/$(DEPDIR)/libgrubkern_a-misc.Tpo -c -o util/libgrubkern_a-misc.obj `if test -f 'util/misc.c'; then $(CYGPATH_W) 'util/misc.c'; else $(CYGPATH_W) '$(srcdir)/util/misc.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/libgrubkern_a-misc.Tpo util/$(DEPDIR)/libgrubkern_a-misc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/misc.c' object='util/libgrubkern_a-misc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) $(libgrubkern_a_CFLAGS) $(CFLAGS) -c -o util/libgrubkern_a-misc.obj `if test -f 'util/misc.c'; then $(CYGPATH_W) 'util/misc.c'; else $(CYGPATH_W) '$(srcdir)/util/misc.c'; fi` grub-core/commands/libgrubmods_a-blocklist.o: grub-core/commands/blocklist.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/commands/libgrubmods_a-blocklist.o -MD -MP -MF grub-core/commands/$(DEPDIR)/libgrubmods_a-blocklist.Tpo -c -o grub-core/commands/libgrubmods_a-blocklist.o `test -f 'grub-core/commands/blocklist.c' || echo '$(srcdir)/'`grub-core/commands/blocklist.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/commands/$(DEPDIR)/libgrubmods_a-blocklist.Tpo grub-core/commands/$(DEPDIR)/libgrubmods_a-blocklist.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/commands/blocklist.c' object='grub-core/commands/libgrubmods_a-blocklist.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/commands/libgrubmods_a-blocklist.o `test -f 'grub-core/commands/blocklist.c' || echo '$(srcdir)/'`grub-core/commands/blocklist.c grub-core/commands/libgrubmods_a-blocklist.obj: grub-core/commands/blocklist.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/commands/libgrubmods_a-blocklist.obj -MD -MP -MF grub-core/commands/$(DEPDIR)/libgrubmods_a-blocklist.Tpo -c -o grub-core/commands/libgrubmods_a-blocklist.obj `if test -f 'grub-core/commands/blocklist.c'; then $(CYGPATH_W) 'grub-core/commands/blocklist.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/commands/blocklist.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/commands/$(DEPDIR)/libgrubmods_a-blocklist.Tpo grub-core/commands/$(DEPDIR)/libgrubmods_a-blocklist.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/commands/blocklist.c' object='grub-core/commands/libgrubmods_a-blocklist.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/commands/libgrubmods_a-blocklist.obj `if test -f 'grub-core/commands/blocklist.c'; then $(CYGPATH_W) 'grub-core/commands/blocklist.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/commands/blocklist.c'; fi` grub-core/commands/libgrubmods_a-ls.o: grub-core/commands/ls.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/commands/libgrubmods_a-ls.o -MD -MP -MF grub-core/commands/$(DEPDIR)/libgrubmods_a-ls.Tpo -c -o grub-core/commands/libgrubmods_a-ls.o `test -f 'grub-core/commands/ls.c' || echo '$(srcdir)/'`grub-core/commands/ls.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/commands/$(DEPDIR)/libgrubmods_a-ls.Tpo grub-core/commands/$(DEPDIR)/libgrubmods_a-ls.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/commands/ls.c' object='grub-core/commands/libgrubmods_a-ls.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/commands/libgrubmods_a-ls.o `test -f 'grub-core/commands/ls.c' || echo '$(srcdir)/'`grub-core/commands/ls.c grub-core/commands/libgrubmods_a-ls.obj: grub-core/commands/ls.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/commands/libgrubmods_a-ls.obj -MD -MP -MF grub-core/commands/$(DEPDIR)/libgrubmods_a-ls.Tpo -c -o grub-core/commands/libgrubmods_a-ls.obj `if test -f 'grub-core/commands/ls.c'; then $(CYGPATH_W) 'grub-core/commands/ls.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/commands/ls.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/commands/$(DEPDIR)/libgrubmods_a-ls.Tpo grub-core/commands/$(DEPDIR)/libgrubmods_a-ls.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/commands/ls.c' object='grub-core/commands/libgrubmods_a-ls.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/commands/libgrubmods_a-ls.obj `if test -f 'grub-core/commands/ls.c'; then $(CYGPATH_W) 'grub-core/commands/ls.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/commands/ls.c'; fi` grub-core/commands/libgrubmods_a-macbless.o: grub-core/commands/macbless.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/commands/libgrubmods_a-macbless.o -MD -MP -MF grub-core/commands/$(DEPDIR)/libgrubmods_a-macbless.Tpo -c -o grub-core/commands/libgrubmods_a-macbless.o `test -f 'grub-core/commands/macbless.c' || echo '$(srcdir)/'`grub-core/commands/macbless.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/commands/$(DEPDIR)/libgrubmods_a-macbless.Tpo grub-core/commands/$(DEPDIR)/libgrubmods_a-macbless.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/commands/macbless.c' object='grub-core/commands/libgrubmods_a-macbless.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/commands/libgrubmods_a-macbless.o `test -f 'grub-core/commands/macbless.c' || echo '$(srcdir)/'`grub-core/commands/macbless.c grub-core/commands/libgrubmods_a-macbless.obj: grub-core/commands/macbless.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/commands/libgrubmods_a-macbless.obj -MD -MP -MF grub-core/commands/$(DEPDIR)/libgrubmods_a-macbless.Tpo -c -o grub-core/commands/libgrubmods_a-macbless.obj `if test -f 'grub-core/commands/macbless.c'; then $(CYGPATH_W) 'grub-core/commands/macbless.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/commands/macbless.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/commands/$(DEPDIR)/libgrubmods_a-macbless.Tpo grub-core/commands/$(DEPDIR)/libgrubmods_a-macbless.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/commands/macbless.c' object='grub-core/commands/libgrubmods_a-macbless.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/commands/libgrubmods_a-macbless.obj `if test -f 'grub-core/commands/macbless.c'; then $(CYGPATH_W) 'grub-core/commands/macbless.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/commands/macbless.c'; fi` grub-core/commands/libgrubmods_a-testload.o: grub-core/commands/testload.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/commands/libgrubmods_a-testload.o -MD -MP -MF grub-core/commands/$(DEPDIR)/libgrubmods_a-testload.Tpo -c -o grub-core/commands/libgrubmods_a-testload.o `test -f 'grub-core/commands/testload.c' || echo '$(srcdir)/'`grub-core/commands/testload.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/commands/$(DEPDIR)/libgrubmods_a-testload.Tpo grub-core/commands/$(DEPDIR)/libgrubmods_a-testload.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/commands/testload.c' object='grub-core/commands/libgrubmods_a-testload.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/commands/libgrubmods_a-testload.o `test -f 'grub-core/commands/testload.c' || echo '$(srcdir)/'`grub-core/commands/testload.c grub-core/commands/libgrubmods_a-testload.obj: grub-core/commands/testload.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/commands/libgrubmods_a-testload.obj -MD -MP -MF grub-core/commands/$(DEPDIR)/libgrubmods_a-testload.Tpo -c -o grub-core/commands/libgrubmods_a-testload.obj `if test -f 'grub-core/commands/testload.c'; then $(CYGPATH_W) 'grub-core/commands/testload.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/commands/testload.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/commands/$(DEPDIR)/libgrubmods_a-testload.Tpo grub-core/commands/$(DEPDIR)/libgrubmods_a-testload.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/commands/testload.c' object='grub-core/commands/libgrubmods_a-testload.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/commands/libgrubmods_a-testload.obj `if test -f 'grub-core/commands/testload.c'; then $(CYGPATH_W) 'grub-core/commands/testload.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/commands/testload.c'; fi` grub-core/commands/libgrubmods_a-xnu_uuid.o: grub-core/commands/xnu_uuid.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/commands/libgrubmods_a-xnu_uuid.o -MD -MP -MF grub-core/commands/$(DEPDIR)/libgrubmods_a-xnu_uuid.Tpo -c -o grub-core/commands/libgrubmods_a-xnu_uuid.o `test -f 'grub-core/commands/xnu_uuid.c' || echo '$(srcdir)/'`grub-core/commands/xnu_uuid.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/commands/$(DEPDIR)/libgrubmods_a-xnu_uuid.Tpo grub-core/commands/$(DEPDIR)/libgrubmods_a-xnu_uuid.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/commands/xnu_uuid.c' object='grub-core/commands/libgrubmods_a-xnu_uuid.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/commands/libgrubmods_a-xnu_uuid.o `test -f 'grub-core/commands/xnu_uuid.c' || echo '$(srcdir)/'`grub-core/commands/xnu_uuid.c grub-core/commands/libgrubmods_a-xnu_uuid.obj: grub-core/commands/xnu_uuid.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/commands/libgrubmods_a-xnu_uuid.obj -MD -MP -MF grub-core/commands/$(DEPDIR)/libgrubmods_a-xnu_uuid.Tpo -c -o grub-core/commands/libgrubmods_a-xnu_uuid.obj `if test -f 'grub-core/commands/xnu_uuid.c'; then $(CYGPATH_W) 'grub-core/commands/xnu_uuid.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/commands/xnu_uuid.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/commands/$(DEPDIR)/libgrubmods_a-xnu_uuid.Tpo grub-core/commands/$(DEPDIR)/libgrubmods_a-xnu_uuid.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/commands/xnu_uuid.c' object='grub-core/commands/libgrubmods_a-xnu_uuid.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/commands/libgrubmods_a-xnu_uuid.obj `if test -f 'grub-core/commands/xnu_uuid.c'; then $(CYGPATH_W) 'grub-core/commands/xnu_uuid.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/commands/xnu_uuid.c'; fi` grub-core/disk/libgrubmods_a-dmraid_nvidia.o: grub-core/disk/dmraid_nvidia.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/disk/libgrubmods_a-dmraid_nvidia.o -MD -MP -MF grub-core/disk/$(DEPDIR)/libgrubmods_a-dmraid_nvidia.Tpo -c -o grub-core/disk/libgrubmods_a-dmraid_nvidia.o `test -f 'grub-core/disk/dmraid_nvidia.c' || echo '$(srcdir)/'`grub-core/disk/dmraid_nvidia.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/disk/$(DEPDIR)/libgrubmods_a-dmraid_nvidia.Tpo grub-core/disk/$(DEPDIR)/libgrubmods_a-dmraid_nvidia.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/disk/dmraid_nvidia.c' object='grub-core/disk/libgrubmods_a-dmraid_nvidia.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/disk/libgrubmods_a-dmraid_nvidia.o `test -f 'grub-core/disk/dmraid_nvidia.c' || echo '$(srcdir)/'`grub-core/disk/dmraid_nvidia.c grub-core/disk/libgrubmods_a-dmraid_nvidia.obj: grub-core/disk/dmraid_nvidia.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/disk/libgrubmods_a-dmraid_nvidia.obj -MD -MP -MF grub-core/disk/$(DEPDIR)/libgrubmods_a-dmraid_nvidia.Tpo -c -o grub-core/disk/libgrubmods_a-dmraid_nvidia.obj `if test -f 'grub-core/disk/dmraid_nvidia.c'; then $(CYGPATH_W) 'grub-core/disk/dmraid_nvidia.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/disk/dmraid_nvidia.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/disk/$(DEPDIR)/libgrubmods_a-dmraid_nvidia.Tpo grub-core/disk/$(DEPDIR)/libgrubmods_a-dmraid_nvidia.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/disk/dmraid_nvidia.c' object='grub-core/disk/libgrubmods_a-dmraid_nvidia.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/disk/libgrubmods_a-dmraid_nvidia.obj `if test -f 'grub-core/disk/dmraid_nvidia.c'; then $(CYGPATH_W) 'grub-core/disk/dmraid_nvidia.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/disk/dmraid_nvidia.c'; fi` grub-core/disk/libgrubmods_a-loopback.o: grub-core/disk/loopback.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/disk/libgrubmods_a-loopback.o -MD -MP -MF grub-core/disk/$(DEPDIR)/libgrubmods_a-loopback.Tpo -c -o grub-core/disk/libgrubmods_a-loopback.o `test -f 'grub-core/disk/loopback.c' || echo '$(srcdir)/'`grub-core/disk/loopback.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/disk/$(DEPDIR)/libgrubmods_a-loopback.Tpo grub-core/disk/$(DEPDIR)/libgrubmods_a-loopback.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/disk/loopback.c' object='grub-core/disk/libgrubmods_a-loopback.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/disk/libgrubmods_a-loopback.o `test -f 'grub-core/disk/loopback.c' || echo '$(srcdir)/'`grub-core/disk/loopback.c grub-core/disk/libgrubmods_a-loopback.obj: grub-core/disk/loopback.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/disk/libgrubmods_a-loopback.obj -MD -MP -MF grub-core/disk/$(DEPDIR)/libgrubmods_a-loopback.Tpo -c -o grub-core/disk/libgrubmods_a-loopback.obj `if test -f 'grub-core/disk/loopback.c'; then $(CYGPATH_W) 'grub-core/disk/loopback.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/disk/loopback.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/disk/$(DEPDIR)/libgrubmods_a-loopback.Tpo grub-core/disk/$(DEPDIR)/libgrubmods_a-loopback.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/disk/loopback.c' object='grub-core/disk/libgrubmods_a-loopback.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/disk/libgrubmods_a-loopback.obj `if test -f 'grub-core/disk/loopback.c'; then $(CYGPATH_W) 'grub-core/disk/loopback.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/disk/loopback.c'; fi` grub-core/disk/libgrubmods_a-lvm.o: grub-core/disk/lvm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/disk/libgrubmods_a-lvm.o -MD -MP -MF grub-core/disk/$(DEPDIR)/libgrubmods_a-lvm.Tpo -c -o grub-core/disk/libgrubmods_a-lvm.o `test -f 'grub-core/disk/lvm.c' || echo '$(srcdir)/'`grub-core/disk/lvm.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/disk/$(DEPDIR)/libgrubmods_a-lvm.Tpo grub-core/disk/$(DEPDIR)/libgrubmods_a-lvm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/disk/lvm.c' object='grub-core/disk/libgrubmods_a-lvm.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/disk/libgrubmods_a-lvm.o `test -f 'grub-core/disk/lvm.c' || echo '$(srcdir)/'`grub-core/disk/lvm.c grub-core/disk/libgrubmods_a-lvm.obj: grub-core/disk/lvm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/disk/libgrubmods_a-lvm.obj -MD -MP -MF grub-core/disk/$(DEPDIR)/libgrubmods_a-lvm.Tpo -c -o grub-core/disk/libgrubmods_a-lvm.obj `if test -f 'grub-core/disk/lvm.c'; then $(CYGPATH_W) 'grub-core/disk/lvm.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/disk/lvm.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/disk/$(DEPDIR)/libgrubmods_a-lvm.Tpo grub-core/disk/$(DEPDIR)/libgrubmods_a-lvm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/disk/lvm.c' object='grub-core/disk/libgrubmods_a-lvm.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/disk/libgrubmods_a-lvm.obj `if test -f 'grub-core/disk/lvm.c'; then $(CYGPATH_W) 'grub-core/disk/lvm.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/disk/lvm.c'; fi` grub-core/disk/libgrubmods_a-mdraid1x_linux.o: grub-core/disk/mdraid1x_linux.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/disk/libgrubmods_a-mdraid1x_linux.o -MD -MP -MF grub-core/disk/$(DEPDIR)/libgrubmods_a-mdraid1x_linux.Tpo -c -o grub-core/disk/libgrubmods_a-mdraid1x_linux.o `test -f 'grub-core/disk/mdraid1x_linux.c' || echo '$(srcdir)/'`grub-core/disk/mdraid1x_linux.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/disk/$(DEPDIR)/libgrubmods_a-mdraid1x_linux.Tpo grub-core/disk/$(DEPDIR)/libgrubmods_a-mdraid1x_linux.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/disk/mdraid1x_linux.c' object='grub-core/disk/libgrubmods_a-mdraid1x_linux.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/disk/libgrubmods_a-mdraid1x_linux.o `test -f 'grub-core/disk/mdraid1x_linux.c' || echo '$(srcdir)/'`grub-core/disk/mdraid1x_linux.c grub-core/disk/libgrubmods_a-mdraid1x_linux.obj: grub-core/disk/mdraid1x_linux.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/disk/libgrubmods_a-mdraid1x_linux.obj -MD -MP -MF grub-core/disk/$(DEPDIR)/libgrubmods_a-mdraid1x_linux.Tpo -c -o grub-core/disk/libgrubmods_a-mdraid1x_linux.obj `if test -f 'grub-core/disk/mdraid1x_linux.c'; then $(CYGPATH_W) 'grub-core/disk/mdraid1x_linux.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/disk/mdraid1x_linux.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/disk/$(DEPDIR)/libgrubmods_a-mdraid1x_linux.Tpo grub-core/disk/$(DEPDIR)/libgrubmods_a-mdraid1x_linux.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/disk/mdraid1x_linux.c' object='grub-core/disk/libgrubmods_a-mdraid1x_linux.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/disk/libgrubmods_a-mdraid1x_linux.obj `if test -f 'grub-core/disk/mdraid1x_linux.c'; then $(CYGPATH_W) 'grub-core/disk/mdraid1x_linux.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/disk/mdraid1x_linux.c'; fi` grub-core/disk/libgrubmods_a-mdraid_linux.o: grub-core/disk/mdraid_linux.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/disk/libgrubmods_a-mdraid_linux.o -MD -MP -MF grub-core/disk/$(DEPDIR)/libgrubmods_a-mdraid_linux.Tpo -c -o grub-core/disk/libgrubmods_a-mdraid_linux.o `test -f 'grub-core/disk/mdraid_linux.c' || echo '$(srcdir)/'`grub-core/disk/mdraid_linux.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/disk/$(DEPDIR)/libgrubmods_a-mdraid_linux.Tpo grub-core/disk/$(DEPDIR)/libgrubmods_a-mdraid_linux.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/disk/mdraid_linux.c' object='grub-core/disk/libgrubmods_a-mdraid_linux.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/disk/libgrubmods_a-mdraid_linux.o `test -f 'grub-core/disk/mdraid_linux.c' || echo '$(srcdir)/'`grub-core/disk/mdraid_linux.c grub-core/disk/libgrubmods_a-mdraid_linux.obj: grub-core/disk/mdraid_linux.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/disk/libgrubmods_a-mdraid_linux.obj -MD -MP -MF grub-core/disk/$(DEPDIR)/libgrubmods_a-mdraid_linux.Tpo -c -o grub-core/disk/libgrubmods_a-mdraid_linux.obj `if test -f 'grub-core/disk/mdraid_linux.c'; then $(CYGPATH_W) 'grub-core/disk/mdraid_linux.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/disk/mdraid_linux.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/disk/$(DEPDIR)/libgrubmods_a-mdraid_linux.Tpo grub-core/disk/$(DEPDIR)/libgrubmods_a-mdraid_linux.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/disk/mdraid_linux.c' object='grub-core/disk/libgrubmods_a-mdraid_linux.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/disk/libgrubmods_a-mdraid_linux.obj `if test -f 'grub-core/disk/mdraid_linux.c'; then $(CYGPATH_W) 'grub-core/disk/mdraid_linux.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/disk/mdraid_linux.c'; fi` grub-core/disk/libgrubmods_a-mdraid_linux_be.o: grub-core/disk/mdraid_linux_be.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/disk/libgrubmods_a-mdraid_linux_be.o -MD -MP -MF grub-core/disk/$(DEPDIR)/libgrubmods_a-mdraid_linux_be.Tpo -c -o grub-core/disk/libgrubmods_a-mdraid_linux_be.o `test -f 'grub-core/disk/mdraid_linux_be.c' || echo '$(srcdir)/'`grub-core/disk/mdraid_linux_be.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/disk/$(DEPDIR)/libgrubmods_a-mdraid_linux_be.Tpo grub-core/disk/$(DEPDIR)/libgrubmods_a-mdraid_linux_be.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/disk/mdraid_linux_be.c' object='grub-core/disk/libgrubmods_a-mdraid_linux_be.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/disk/libgrubmods_a-mdraid_linux_be.o `test -f 'grub-core/disk/mdraid_linux_be.c' || echo '$(srcdir)/'`grub-core/disk/mdraid_linux_be.c grub-core/disk/libgrubmods_a-mdraid_linux_be.obj: grub-core/disk/mdraid_linux_be.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/disk/libgrubmods_a-mdraid_linux_be.obj -MD -MP -MF grub-core/disk/$(DEPDIR)/libgrubmods_a-mdraid_linux_be.Tpo -c -o grub-core/disk/libgrubmods_a-mdraid_linux_be.obj `if test -f 'grub-core/disk/mdraid_linux_be.c'; then $(CYGPATH_W) 'grub-core/disk/mdraid_linux_be.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/disk/mdraid_linux_be.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/disk/$(DEPDIR)/libgrubmods_a-mdraid_linux_be.Tpo grub-core/disk/$(DEPDIR)/libgrubmods_a-mdraid_linux_be.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/disk/mdraid_linux_be.c' object='grub-core/disk/libgrubmods_a-mdraid_linux_be.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/disk/libgrubmods_a-mdraid_linux_be.obj `if test -f 'grub-core/disk/mdraid_linux_be.c'; then $(CYGPATH_W) 'grub-core/disk/mdraid_linux_be.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/disk/mdraid_linux_be.c'; fi` grub-core/disk/libgrubmods_a-raid5_recover.o: grub-core/disk/raid5_recover.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/disk/libgrubmods_a-raid5_recover.o -MD -MP -MF grub-core/disk/$(DEPDIR)/libgrubmods_a-raid5_recover.Tpo -c -o grub-core/disk/libgrubmods_a-raid5_recover.o `test -f 'grub-core/disk/raid5_recover.c' || echo '$(srcdir)/'`grub-core/disk/raid5_recover.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/disk/$(DEPDIR)/libgrubmods_a-raid5_recover.Tpo grub-core/disk/$(DEPDIR)/libgrubmods_a-raid5_recover.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/disk/raid5_recover.c' object='grub-core/disk/libgrubmods_a-raid5_recover.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/disk/libgrubmods_a-raid5_recover.o `test -f 'grub-core/disk/raid5_recover.c' || echo '$(srcdir)/'`grub-core/disk/raid5_recover.c grub-core/disk/libgrubmods_a-raid5_recover.obj: grub-core/disk/raid5_recover.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/disk/libgrubmods_a-raid5_recover.obj -MD -MP -MF grub-core/disk/$(DEPDIR)/libgrubmods_a-raid5_recover.Tpo -c -o grub-core/disk/libgrubmods_a-raid5_recover.obj `if test -f 'grub-core/disk/raid5_recover.c'; then $(CYGPATH_W) 'grub-core/disk/raid5_recover.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/disk/raid5_recover.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/disk/$(DEPDIR)/libgrubmods_a-raid5_recover.Tpo grub-core/disk/$(DEPDIR)/libgrubmods_a-raid5_recover.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/disk/raid5_recover.c' object='grub-core/disk/libgrubmods_a-raid5_recover.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/disk/libgrubmods_a-raid5_recover.obj `if test -f 'grub-core/disk/raid5_recover.c'; then $(CYGPATH_W) 'grub-core/disk/raid5_recover.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/disk/raid5_recover.c'; fi` grub-core/disk/libgrubmods_a-raid6_recover.o: grub-core/disk/raid6_recover.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/disk/libgrubmods_a-raid6_recover.o -MD -MP -MF grub-core/disk/$(DEPDIR)/libgrubmods_a-raid6_recover.Tpo -c -o grub-core/disk/libgrubmods_a-raid6_recover.o `test -f 'grub-core/disk/raid6_recover.c' || echo '$(srcdir)/'`grub-core/disk/raid6_recover.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/disk/$(DEPDIR)/libgrubmods_a-raid6_recover.Tpo grub-core/disk/$(DEPDIR)/libgrubmods_a-raid6_recover.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/disk/raid6_recover.c' object='grub-core/disk/libgrubmods_a-raid6_recover.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/disk/libgrubmods_a-raid6_recover.o `test -f 'grub-core/disk/raid6_recover.c' || echo '$(srcdir)/'`grub-core/disk/raid6_recover.c grub-core/disk/libgrubmods_a-raid6_recover.obj: grub-core/disk/raid6_recover.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/disk/libgrubmods_a-raid6_recover.obj -MD -MP -MF grub-core/disk/$(DEPDIR)/libgrubmods_a-raid6_recover.Tpo -c -o grub-core/disk/libgrubmods_a-raid6_recover.obj `if test -f 'grub-core/disk/raid6_recover.c'; then $(CYGPATH_W) 'grub-core/disk/raid6_recover.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/disk/raid6_recover.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/disk/$(DEPDIR)/libgrubmods_a-raid6_recover.Tpo grub-core/disk/$(DEPDIR)/libgrubmods_a-raid6_recover.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/disk/raid6_recover.c' object='grub-core/disk/libgrubmods_a-raid6_recover.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/disk/libgrubmods_a-raid6_recover.obj `if test -f 'grub-core/disk/raid6_recover.c'; then $(CYGPATH_W) 'grub-core/disk/raid6_recover.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/disk/raid6_recover.c'; fi` grub-core/font/libgrubmods_a-font.o: grub-core/font/font.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/font/libgrubmods_a-font.o -MD -MP -MF grub-core/font/$(DEPDIR)/libgrubmods_a-font.Tpo -c -o grub-core/font/libgrubmods_a-font.o `test -f 'grub-core/font/font.c' || echo '$(srcdir)/'`grub-core/font/font.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/font/$(DEPDIR)/libgrubmods_a-font.Tpo grub-core/font/$(DEPDIR)/libgrubmods_a-font.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/font/font.c' object='grub-core/font/libgrubmods_a-font.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/font/libgrubmods_a-font.o `test -f 'grub-core/font/font.c' || echo '$(srcdir)/'`grub-core/font/font.c grub-core/font/libgrubmods_a-font.obj: grub-core/font/font.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/font/libgrubmods_a-font.obj -MD -MP -MF grub-core/font/$(DEPDIR)/libgrubmods_a-font.Tpo -c -o grub-core/font/libgrubmods_a-font.obj `if test -f 'grub-core/font/font.c'; then $(CYGPATH_W) 'grub-core/font/font.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/font/font.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/font/$(DEPDIR)/libgrubmods_a-font.Tpo grub-core/font/$(DEPDIR)/libgrubmods_a-font.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/font/font.c' object='grub-core/font/libgrubmods_a-font.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/font/libgrubmods_a-font.obj `if test -f 'grub-core/font/font.c'; then $(CYGPATH_W) 'grub-core/font/font.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/font/font.c'; fi` grub-core/fs/libgrubmods_a-affs.o: grub-core/fs/affs.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-affs.o -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-affs.Tpo -c -o grub-core/fs/libgrubmods_a-affs.o `test -f 'grub-core/fs/affs.c' || echo '$(srcdir)/'`grub-core/fs/affs.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-affs.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-affs.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/affs.c' object='grub-core/fs/libgrubmods_a-affs.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-affs.o `test -f 'grub-core/fs/affs.c' || echo '$(srcdir)/'`grub-core/fs/affs.c grub-core/fs/libgrubmods_a-affs.obj: grub-core/fs/affs.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-affs.obj -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-affs.Tpo -c -o grub-core/fs/libgrubmods_a-affs.obj `if test -f 'grub-core/fs/affs.c'; then $(CYGPATH_W) 'grub-core/fs/affs.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/affs.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-affs.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-affs.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/affs.c' object='grub-core/fs/libgrubmods_a-affs.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-affs.obj `if test -f 'grub-core/fs/affs.c'; then $(CYGPATH_W) 'grub-core/fs/affs.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/affs.c'; fi` grub-core/fs/libgrubmods_a-afs.o: grub-core/fs/afs.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-afs.o -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-afs.Tpo -c -o grub-core/fs/libgrubmods_a-afs.o `test -f 'grub-core/fs/afs.c' || echo '$(srcdir)/'`grub-core/fs/afs.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-afs.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-afs.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/afs.c' object='grub-core/fs/libgrubmods_a-afs.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-afs.o `test -f 'grub-core/fs/afs.c' || echo '$(srcdir)/'`grub-core/fs/afs.c grub-core/fs/libgrubmods_a-afs.obj: grub-core/fs/afs.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-afs.obj -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-afs.Tpo -c -o grub-core/fs/libgrubmods_a-afs.obj `if test -f 'grub-core/fs/afs.c'; then $(CYGPATH_W) 'grub-core/fs/afs.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/afs.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-afs.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-afs.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/afs.c' object='grub-core/fs/libgrubmods_a-afs.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-afs.obj `if test -f 'grub-core/fs/afs.c'; then $(CYGPATH_W) 'grub-core/fs/afs.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/afs.c'; fi` grub-core/fs/libgrubmods_a-bfs.o: grub-core/fs/bfs.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-bfs.o -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-bfs.Tpo -c -o grub-core/fs/libgrubmods_a-bfs.o `test -f 'grub-core/fs/bfs.c' || echo '$(srcdir)/'`grub-core/fs/bfs.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-bfs.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-bfs.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/bfs.c' object='grub-core/fs/libgrubmods_a-bfs.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-bfs.o `test -f 'grub-core/fs/bfs.c' || echo '$(srcdir)/'`grub-core/fs/bfs.c grub-core/fs/libgrubmods_a-bfs.obj: grub-core/fs/bfs.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-bfs.obj -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-bfs.Tpo -c -o grub-core/fs/libgrubmods_a-bfs.obj `if test -f 'grub-core/fs/bfs.c'; then $(CYGPATH_W) 'grub-core/fs/bfs.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/bfs.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-bfs.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-bfs.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/bfs.c' object='grub-core/fs/libgrubmods_a-bfs.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-bfs.obj `if test -f 'grub-core/fs/bfs.c'; then $(CYGPATH_W) 'grub-core/fs/bfs.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/bfs.c'; fi` grub-core/fs/libgrubmods_a-btrfs.o: grub-core/fs/btrfs.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-btrfs.o -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-btrfs.Tpo -c -o grub-core/fs/libgrubmods_a-btrfs.o `test -f 'grub-core/fs/btrfs.c' || echo '$(srcdir)/'`grub-core/fs/btrfs.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-btrfs.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-btrfs.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/btrfs.c' object='grub-core/fs/libgrubmods_a-btrfs.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-btrfs.o `test -f 'grub-core/fs/btrfs.c' || echo '$(srcdir)/'`grub-core/fs/btrfs.c grub-core/fs/libgrubmods_a-btrfs.obj: grub-core/fs/btrfs.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-btrfs.obj -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-btrfs.Tpo -c -o grub-core/fs/libgrubmods_a-btrfs.obj `if test -f 'grub-core/fs/btrfs.c'; then $(CYGPATH_W) 'grub-core/fs/btrfs.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/btrfs.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-btrfs.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-btrfs.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/btrfs.c' object='grub-core/fs/libgrubmods_a-btrfs.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-btrfs.obj `if test -f 'grub-core/fs/btrfs.c'; then $(CYGPATH_W) 'grub-core/fs/btrfs.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/btrfs.c'; fi` grub-core/fs/libgrubmods_a-cbfs.o: grub-core/fs/cbfs.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-cbfs.o -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-cbfs.Tpo -c -o grub-core/fs/libgrubmods_a-cbfs.o `test -f 'grub-core/fs/cbfs.c' || echo '$(srcdir)/'`grub-core/fs/cbfs.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-cbfs.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-cbfs.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/cbfs.c' object='grub-core/fs/libgrubmods_a-cbfs.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-cbfs.o `test -f 'grub-core/fs/cbfs.c' || echo '$(srcdir)/'`grub-core/fs/cbfs.c grub-core/fs/libgrubmods_a-cbfs.obj: grub-core/fs/cbfs.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-cbfs.obj -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-cbfs.Tpo -c -o grub-core/fs/libgrubmods_a-cbfs.obj `if test -f 'grub-core/fs/cbfs.c'; then $(CYGPATH_W) 'grub-core/fs/cbfs.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/cbfs.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-cbfs.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-cbfs.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/cbfs.c' object='grub-core/fs/libgrubmods_a-cbfs.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-cbfs.obj `if test -f 'grub-core/fs/cbfs.c'; then $(CYGPATH_W) 'grub-core/fs/cbfs.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/cbfs.c'; fi` grub-core/fs/libgrubmods_a-cpio.o: grub-core/fs/cpio.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-cpio.o -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-cpio.Tpo -c -o grub-core/fs/libgrubmods_a-cpio.o `test -f 'grub-core/fs/cpio.c' || echo '$(srcdir)/'`grub-core/fs/cpio.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-cpio.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-cpio.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/cpio.c' object='grub-core/fs/libgrubmods_a-cpio.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-cpio.o `test -f 'grub-core/fs/cpio.c' || echo '$(srcdir)/'`grub-core/fs/cpio.c grub-core/fs/libgrubmods_a-cpio.obj: grub-core/fs/cpio.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-cpio.obj -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-cpio.Tpo -c -o grub-core/fs/libgrubmods_a-cpio.obj `if test -f 'grub-core/fs/cpio.c'; then $(CYGPATH_W) 'grub-core/fs/cpio.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/cpio.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-cpio.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-cpio.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/cpio.c' object='grub-core/fs/libgrubmods_a-cpio.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-cpio.obj `if test -f 'grub-core/fs/cpio.c'; then $(CYGPATH_W) 'grub-core/fs/cpio.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/cpio.c'; fi` grub-core/fs/libgrubmods_a-cpio_be.o: grub-core/fs/cpio_be.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-cpio_be.o -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-cpio_be.Tpo -c -o grub-core/fs/libgrubmods_a-cpio_be.o `test -f 'grub-core/fs/cpio_be.c' || echo '$(srcdir)/'`grub-core/fs/cpio_be.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-cpio_be.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-cpio_be.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/cpio_be.c' object='grub-core/fs/libgrubmods_a-cpio_be.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-cpio_be.o `test -f 'grub-core/fs/cpio_be.c' || echo '$(srcdir)/'`grub-core/fs/cpio_be.c grub-core/fs/libgrubmods_a-cpio_be.obj: grub-core/fs/cpio_be.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-cpio_be.obj -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-cpio_be.Tpo -c -o grub-core/fs/libgrubmods_a-cpio_be.obj `if test -f 'grub-core/fs/cpio_be.c'; then $(CYGPATH_W) 'grub-core/fs/cpio_be.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/cpio_be.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-cpio_be.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-cpio_be.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/cpio_be.c' object='grub-core/fs/libgrubmods_a-cpio_be.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-cpio_be.obj `if test -f 'grub-core/fs/cpio_be.c'; then $(CYGPATH_W) 'grub-core/fs/cpio_be.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/cpio_be.c'; fi` grub-core/fs/libgrubmods_a-erofs.o: grub-core/fs/erofs.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-erofs.o -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-erofs.Tpo -c -o grub-core/fs/libgrubmods_a-erofs.o `test -f 'grub-core/fs/erofs.c' || echo '$(srcdir)/'`grub-core/fs/erofs.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-erofs.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-erofs.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/erofs.c' object='grub-core/fs/libgrubmods_a-erofs.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-erofs.o `test -f 'grub-core/fs/erofs.c' || echo '$(srcdir)/'`grub-core/fs/erofs.c grub-core/fs/libgrubmods_a-erofs.obj: grub-core/fs/erofs.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-erofs.obj -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-erofs.Tpo -c -o grub-core/fs/libgrubmods_a-erofs.obj `if test -f 'grub-core/fs/erofs.c'; then $(CYGPATH_W) 'grub-core/fs/erofs.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/erofs.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-erofs.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-erofs.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/erofs.c' object='grub-core/fs/libgrubmods_a-erofs.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-erofs.obj `if test -f 'grub-core/fs/erofs.c'; then $(CYGPATH_W) 'grub-core/fs/erofs.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/erofs.c'; fi` grub-core/fs/libgrubmods_a-exfat.o: grub-core/fs/exfat.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-exfat.o -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-exfat.Tpo -c -o grub-core/fs/libgrubmods_a-exfat.o `test -f 'grub-core/fs/exfat.c' || echo '$(srcdir)/'`grub-core/fs/exfat.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-exfat.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-exfat.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/exfat.c' object='grub-core/fs/libgrubmods_a-exfat.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-exfat.o `test -f 'grub-core/fs/exfat.c' || echo '$(srcdir)/'`grub-core/fs/exfat.c grub-core/fs/libgrubmods_a-exfat.obj: grub-core/fs/exfat.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-exfat.obj -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-exfat.Tpo -c -o grub-core/fs/libgrubmods_a-exfat.obj `if test -f 'grub-core/fs/exfat.c'; then $(CYGPATH_W) 'grub-core/fs/exfat.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/exfat.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-exfat.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-exfat.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/exfat.c' object='grub-core/fs/libgrubmods_a-exfat.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-exfat.obj `if test -f 'grub-core/fs/exfat.c'; then $(CYGPATH_W) 'grub-core/fs/exfat.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/exfat.c'; fi` grub-core/fs/libgrubmods_a-ext2.o: grub-core/fs/ext2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-ext2.o -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-ext2.Tpo -c -o grub-core/fs/libgrubmods_a-ext2.o `test -f 'grub-core/fs/ext2.c' || echo '$(srcdir)/'`grub-core/fs/ext2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-ext2.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-ext2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/ext2.c' object='grub-core/fs/libgrubmods_a-ext2.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-ext2.o `test -f 'grub-core/fs/ext2.c' || echo '$(srcdir)/'`grub-core/fs/ext2.c grub-core/fs/libgrubmods_a-ext2.obj: grub-core/fs/ext2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-ext2.obj -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-ext2.Tpo -c -o grub-core/fs/libgrubmods_a-ext2.obj `if test -f 'grub-core/fs/ext2.c'; then $(CYGPATH_W) 'grub-core/fs/ext2.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/ext2.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-ext2.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-ext2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/ext2.c' object='grub-core/fs/libgrubmods_a-ext2.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-ext2.obj `if test -f 'grub-core/fs/ext2.c'; then $(CYGPATH_W) 'grub-core/fs/ext2.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/ext2.c'; fi` grub-core/fs/libgrubmods_a-f2fs.o: grub-core/fs/f2fs.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-f2fs.o -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-f2fs.Tpo -c -o grub-core/fs/libgrubmods_a-f2fs.o `test -f 'grub-core/fs/f2fs.c' || echo '$(srcdir)/'`grub-core/fs/f2fs.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-f2fs.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-f2fs.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/f2fs.c' object='grub-core/fs/libgrubmods_a-f2fs.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-f2fs.o `test -f 'grub-core/fs/f2fs.c' || echo '$(srcdir)/'`grub-core/fs/f2fs.c grub-core/fs/libgrubmods_a-f2fs.obj: grub-core/fs/f2fs.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-f2fs.obj -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-f2fs.Tpo -c -o grub-core/fs/libgrubmods_a-f2fs.obj `if test -f 'grub-core/fs/f2fs.c'; then $(CYGPATH_W) 'grub-core/fs/f2fs.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/f2fs.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-f2fs.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-f2fs.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/f2fs.c' object='grub-core/fs/libgrubmods_a-f2fs.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-f2fs.obj `if test -f 'grub-core/fs/f2fs.c'; then $(CYGPATH_W) 'grub-core/fs/f2fs.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/f2fs.c'; fi` grub-core/fs/libgrubmods_a-fat.o: grub-core/fs/fat.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-fat.o -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-fat.Tpo -c -o grub-core/fs/libgrubmods_a-fat.o `test -f 'grub-core/fs/fat.c' || echo '$(srcdir)/'`grub-core/fs/fat.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-fat.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-fat.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/fat.c' object='grub-core/fs/libgrubmods_a-fat.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-fat.o `test -f 'grub-core/fs/fat.c' || echo '$(srcdir)/'`grub-core/fs/fat.c grub-core/fs/libgrubmods_a-fat.obj: grub-core/fs/fat.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-fat.obj -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-fat.Tpo -c -o grub-core/fs/libgrubmods_a-fat.obj `if test -f 'grub-core/fs/fat.c'; then $(CYGPATH_W) 'grub-core/fs/fat.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/fat.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-fat.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-fat.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/fat.c' object='grub-core/fs/libgrubmods_a-fat.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-fat.obj `if test -f 'grub-core/fs/fat.c'; then $(CYGPATH_W) 'grub-core/fs/fat.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/fat.c'; fi` grub-core/fs/libgrubmods_a-fshelp.o: grub-core/fs/fshelp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-fshelp.o -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-fshelp.Tpo -c -o grub-core/fs/libgrubmods_a-fshelp.o `test -f 'grub-core/fs/fshelp.c' || echo '$(srcdir)/'`grub-core/fs/fshelp.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-fshelp.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-fshelp.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/fshelp.c' object='grub-core/fs/libgrubmods_a-fshelp.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-fshelp.o `test -f 'grub-core/fs/fshelp.c' || echo '$(srcdir)/'`grub-core/fs/fshelp.c grub-core/fs/libgrubmods_a-fshelp.obj: grub-core/fs/fshelp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-fshelp.obj -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-fshelp.Tpo -c -o grub-core/fs/libgrubmods_a-fshelp.obj `if test -f 'grub-core/fs/fshelp.c'; then $(CYGPATH_W) 'grub-core/fs/fshelp.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/fshelp.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-fshelp.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-fshelp.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/fshelp.c' object='grub-core/fs/libgrubmods_a-fshelp.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-fshelp.obj `if test -f 'grub-core/fs/fshelp.c'; then $(CYGPATH_W) 'grub-core/fs/fshelp.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/fshelp.c'; fi` grub-core/fs/libgrubmods_a-hfs.o: grub-core/fs/hfs.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-hfs.o -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-hfs.Tpo -c -o grub-core/fs/libgrubmods_a-hfs.o `test -f 'grub-core/fs/hfs.c' || echo '$(srcdir)/'`grub-core/fs/hfs.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-hfs.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-hfs.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/hfs.c' object='grub-core/fs/libgrubmods_a-hfs.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-hfs.o `test -f 'grub-core/fs/hfs.c' || echo '$(srcdir)/'`grub-core/fs/hfs.c grub-core/fs/libgrubmods_a-hfs.obj: grub-core/fs/hfs.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-hfs.obj -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-hfs.Tpo -c -o grub-core/fs/libgrubmods_a-hfs.obj `if test -f 'grub-core/fs/hfs.c'; then $(CYGPATH_W) 'grub-core/fs/hfs.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/hfs.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-hfs.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-hfs.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/hfs.c' object='grub-core/fs/libgrubmods_a-hfs.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-hfs.obj `if test -f 'grub-core/fs/hfs.c'; then $(CYGPATH_W) 'grub-core/fs/hfs.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/hfs.c'; fi` grub-core/fs/libgrubmods_a-hfsplus.o: grub-core/fs/hfsplus.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-hfsplus.o -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-hfsplus.Tpo -c -o grub-core/fs/libgrubmods_a-hfsplus.o `test -f 'grub-core/fs/hfsplus.c' || echo '$(srcdir)/'`grub-core/fs/hfsplus.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-hfsplus.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-hfsplus.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/hfsplus.c' object='grub-core/fs/libgrubmods_a-hfsplus.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-hfsplus.o `test -f 'grub-core/fs/hfsplus.c' || echo '$(srcdir)/'`grub-core/fs/hfsplus.c grub-core/fs/libgrubmods_a-hfsplus.obj: grub-core/fs/hfsplus.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-hfsplus.obj -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-hfsplus.Tpo -c -o grub-core/fs/libgrubmods_a-hfsplus.obj `if test -f 'grub-core/fs/hfsplus.c'; then $(CYGPATH_W) 'grub-core/fs/hfsplus.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/hfsplus.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-hfsplus.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-hfsplus.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/hfsplus.c' object='grub-core/fs/libgrubmods_a-hfsplus.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-hfsplus.obj `if test -f 'grub-core/fs/hfsplus.c'; then $(CYGPATH_W) 'grub-core/fs/hfsplus.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/hfsplus.c'; fi` grub-core/fs/libgrubmods_a-hfspluscomp.o: grub-core/fs/hfspluscomp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-hfspluscomp.o -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-hfspluscomp.Tpo -c -o grub-core/fs/libgrubmods_a-hfspluscomp.o `test -f 'grub-core/fs/hfspluscomp.c' || echo '$(srcdir)/'`grub-core/fs/hfspluscomp.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-hfspluscomp.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-hfspluscomp.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/hfspluscomp.c' object='grub-core/fs/libgrubmods_a-hfspluscomp.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-hfspluscomp.o `test -f 'grub-core/fs/hfspluscomp.c' || echo '$(srcdir)/'`grub-core/fs/hfspluscomp.c grub-core/fs/libgrubmods_a-hfspluscomp.obj: grub-core/fs/hfspluscomp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-hfspluscomp.obj -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-hfspluscomp.Tpo -c -o grub-core/fs/libgrubmods_a-hfspluscomp.obj `if test -f 'grub-core/fs/hfspluscomp.c'; then $(CYGPATH_W) 'grub-core/fs/hfspluscomp.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/hfspluscomp.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-hfspluscomp.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-hfspluscomp.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/hfspluscomp.c' object='grub-core/fs/libgrubmods_a-hfspluscomp.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-hfspluscomp.obj `if test -f 'grub-core/fs/hfspluscomp.c'; then $(CYGPATH_W) 'grub-core/fs/hfspluscomp.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/hfspluscomp.c'; fi` grub-core/fs/libgrubmods_a-iso9660.o: grub-core/fs/iso9660.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-iso9660.o -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-iso9660.Tpo -c -o grub-core/fs/libgrubmods_a-iso9660.o `test -f 'grub-core/fs/iso9660.c' || echo '$(srcdir)/'`grub-core/fs/iso9660.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-iso9660.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-iso9660.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/iso9660.c' object='grub-core/fs/libgrubmods_a-iso9660.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-iso9660.o `test -f 'grub-core/fs/iso9660.c' || echo '$(srcdir)/'`grub-core/fs/iso9660.c grub-core/fs/libgrubmods_a-iso9660.obj: grub-core/fs/iso9660.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-iso9660.obj -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-iso9660.Tpo -c -o grub-core/fs/libgrubmods_a-iso9660.obj `if test -f 'grub-core/fs/iso9660.c'; then $(CYGPATH_W) 'grub-core/fs/iso9660.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/iso9660.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-iso9660.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-iso9660.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/iso9660.c' object='grub-core/fs/libgrubmods_a-iso9660.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-iso9660.obj `if test -f 'grub-core/fs/iso9660.c'; then $(CYGPATH_W) 'grub-core/fs/iso9660.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/iso9660.c'; fi` grub-core/fs/libgrubmods_a-jfs.o: grub-core/fs/jfs.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-jfs.o -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-jfs.Tpo -c -o grub-core/fs/libgrubmods_a-jfs.o `test -f 'grub-core/fs/jfs.c' || echo '$(srcdir)/'`grub-core/fs/jfs.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-jfs.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-jfs.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/jfs.c' object='grub-core/fs/libgrubmods_a-jfs.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-jfs.o `test -f 'grub-core/fs/jfs.c' || echo '$(srcdir)/'`grub-core/fs/jfs.c grub-core/fs/libgrubmods_a-jfs.obj: grub-core/fs/jfs.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-jfs.obj -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-jfs.Tpo -c -o grub-core/fs/libgrubmods_a-jfs.obj `if test -f 'grub-core/fs/jfs.c'; then $(CYGPATH_W) 'grub-core/fs/jfs.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/jfs.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-jfs.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-jfs.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/jfs.c' object='grub-core/fs/libgrubmods_a-jfs.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-jfs.obj `if test -f 'grub-core/fs/jfs.c'; then $(CYGPATH_W) 'grub-core/fs/jfs.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/jfs.c'; fi` grub-core/fs/libgrubmods_a-minix.o: grub-core/fs/minix.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-minix.o -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-minix.Tpo -c -o grub-core/fs/libgrubmods_a-minix.o `test -f 'grub-core/fs/minix.c' || echo '$(srcdir)/'`grub-core/fs/minix.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-minix.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-minix.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/minix.c' object='grub-core/fs/libgrubmods_a-minix.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-minix.o `test -f 'grub-core/fs/minix.c' || echo '$(srcdir)/'`grub-core/fs/minix.c grub-core/fs/libgrubmods_a-minix.obj: grub-core/fs/minix.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-minix.obj -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-minix.Tpo -c -o grub-core/fs/libgrubmods_a-minix.obj `if test -f 'grub-core/fs/minix.c'; then $(CYGPATH_W) 'grub-core/fs/minix.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/minix.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-minix.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-minix.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/minix.c' object='grub-core/fs/libgrubmods_a-minix.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-minix.obj `if test -f 'grub-core/fs/minix.c'; then $(CYGPATH_W) 'grub-core/fs/minix.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/minix.c'; fi` grub-core/fs/libgrubmods_a-minix2.o: grub-core/fs/minix2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-minix2.o -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-minix2.Tpo -c -o grub-core/fs/libgrubmods_a-minix2.o `test -f 'grub-core/fs/minix2.c' || echo '$(srcdir)/'`grub-core/fs/minix2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-minix2.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-minix2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/minix2.c' object='grub-core/fs/libgrubmods_a-minix2.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-minix2.o `test -f 'grub-core/fs/minix2.c' || echo '$(srcdir)/'`grub-core/fs/minix2.c grub-core/fs/libgrubmods_a-minix2.obj: grub-core/fs/minix2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-minix2.obj -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-minix2.Tpo -c -o grub-core/fs/libgrubmods_a-minix2.obj `if test -f 'grub-core/fs/minix2.c'; then $(CYGPATH_W) 'grub-core/fs/minix2.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/minix2.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-minix2.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-minix2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/minix2.c' object='grub-core/fs/libgrubmods_a-minix2.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-minix2.obj `if test -f 'grub-core/fs/minix2.c'; then $(CYGPATH_W) 'grub-core/fs/minix2.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/minix2.c'; fi` grub-core/fs/libgrubmods_a-minix2_be.o: grub-core/fs/minix2_be.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-minix2_be.o -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-minix2_be.Tpo -c -o grub-core/fs/libgrubmods_a-minix2_be.o `test -f 'grub-core/fs/minix2_be.c' || echo '$(srcdir)/'`grub-core/fs/minix2_be.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-minix2_be.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-minix2_be.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/minix2_be.c' object='grub-core/fs/libgrubmods_a-minix2_be.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-minix2_be.o `test -f 'grub-core/fs/minix2_be.c' || echo '$(srcdir)/'`grub-core/fs/minix2_be.c grub-core/fs/libgrubmods_a-minix2_be.obj: grub-core/fs/minix2_be.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-minix2_be.obj -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-minix2_be.Tpo -c -o grub-core/fs/libgrubmods_a-minix2_be.obj `if test -f 'grub-core/fs/minix2_be.c'; then $(CYGPATH_W) 'grub-core/fs/minix2_be.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/minix2_be.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-minix2_be.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-minix2_be.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/minix2_be.c' object='grub-core/fs/libgrubmods_a-minix2_be.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-minix2_be.obj `if test -f 'grub-core/fs/minix2_be.c'; then $(CYGPATH_W) 'grub-core/fs/minix2_be.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/minix2_be.c'; fi` grub-core/fs/libgrubmods_a-minix3.o: grub-core/fs/minix3.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-minix3.o -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-minix3.Tpo -c -o grub-core/fs/libgrubmods_a-minix3.o `test -f 'grub-core/fs/minix3.c' || echo '$(srcdir)/'`grub-core/fs/minix3.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-minix3.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-minix3.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/minix3.c' object='grub-core/fs/libgrubmods_a-minix3.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-minix3.o `test -f 'grub-core/fs/minix3.c' || echo '$(srcdir)/'`grub-core/fs/minix3.c grub-core/fs/libgrubmods_a-minix3.obj: grub-core/fs/minix3.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-minix3.obj -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-minix3.Tpo -c -o grub-core/fs/libgrubmods_a-minix3.obj `if test -f 'grub-core/fs/minix3.c'; then $(CYGPATH_W) 'grub-core/fs/minix3.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/minix3.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-minix3.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-minix3.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/minix3.c' object='grub-core/fs/libgrubmods_a-minix3.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-minix3.obj `if test -f 'grub-core/fs/minix3.c'; then $(CYGPATH_W) 'grub-core/fs/minix3.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/minix3.c'; fi` grub-core/fs/libgrubmods_a-minix3_be.o: grub-core/fs/minix3_be.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-minix3_be.o -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-minix3_be.Tpo -c -o grub-core/fs/libgrubmods_a-minix3_be.o `test -f 'grub-core/fs/minix3_be.c' || echo '$(srcdir)/'`grub-core/fs/minix3_be.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-minix3_be.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-minix3_be.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/minix3_be.c' object='grub-core/fs/libgrubmods_a-minix3_be.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-minix3_be.o `test -f 'grub-core/fs/minix3_be.c' || echo '$(srcdir)/'`grub-core/fs/minix3_be.c grub-core/fs/libgrubmods_a-minix3_be.obj: grub-core/fs/minix3_be.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-minix3_be.obj -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-minix3_be.Tpo -c -o grub-core/fs/libgrubmods_a-minix3_be.obj `if test -f 'grub-core/fs/minix3_be.c'; then $(CYGPATH_W) 'grub-core/fs/minix3_be.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/minix3_be.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-minix3_be.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-minix3_be.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/minix3_be.c' object='grub-core/fs/libgrubmods_a-minix3_be.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-minix3_be.obj `if test -f 'grub-core/fs/minix3_be.c'; then $(CYGPATH_W) 'grub-core/fs/minix3_be.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/minix3_be.c'; fi` grub-core/fs/libgrubmods_a-minix_be.o: grub-core/fs/minix_be.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-minix_be.o -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-minix_be.Tpo -c -o grub-core/fs/libgrubmods_a-minix_be.o `test -f 'grub-core/fs/minix_be.c' || echo '$(srcdir)/'`grub-core/fs/minix_be.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-minix_be.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-minix_be.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/minix_be.c' object='grub-core/fs/libgrubmods_a-minix_be.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-minix_be.o `test -f 'grub-core/fs/minix_be.c' || echo '$(srcdir)/'`grub-core/fs/minix_be.c grub-core/fs/libgrubmods_a-minix_be.obj: grub-core/fs/minix_be.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-minix_be.obj -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-minix_be.Tpo -c -o grub-core/fs/libgrubmods_a-minix_be.obj `if test -f 'grub-core/fs/minix_be.c'; then $(CYGPATH_W) 'grub-core/fs/minix_be.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/minix_be.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-minix_be.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-minix_be.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/minix_be.c' object='grub-core/fs/libgrubmods_a-minix_be.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-minix_be.obj `if test -f 'grub-core/fs/minix_be.c'; then $(CYGPATH_W) 'grub-core/fs/minix_be.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/minix_be.c'; fi` grub-core/fs/libgrubmods_a-newc.o: grub-core/fs/newc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-newc.o -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-newc.Tpo -c -o grub-core/fs/libgrubmods_a-newc.o `test -f 'grub-core/fs/newc.c' || echo '$(srcdir)/'`grub-core/fs/newc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-newc.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-newc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/newc.c' object='grub-core/fs/libgrubmods_a-newc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-newc.o `test -f 'grub-core/fs/newc.c' || echo '$(srcdir)/'`grub-core/fs/newc.c grub-core/fs/libgrubmods_a-newc.obj: grub-core/fs/newc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-newc.obj -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-newc.Tpo -c -o grub-core/fs/libgrubmods_a-newc.obj `if test -f 'grub-core/fs/newc.c'; then $(CYGPATH_W) 'grub-core/fs/newc.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/newc.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-newc.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-newc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/newc.c' object='grub-core/fs/libgrubmods_a-newc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-newc.obj `if test -f 'grub-core/fs/newc.c'; then $(CYGPATH_W) 'grub-core/fs/newc.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/newc.c'; fi` grub-core/fs/libgrubmods_a-nilfs2.o: grub-core/fs/nilfs2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-nilfs2.o -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-nilfs2.Tpo -c -o grub-core/fs/libgrubmods_a-nilfs2.o `test -f 'grub-core/fs/nilfs2.c' || echo '$(srcdir)/'`grub-core/fs/nilfs2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-nilfs2.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-nilfs2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/nilfs2.c' object='grub-core/fs/libgrubmods_a-nilfs2.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-nilfs2.o `test -f 'grub-core/fs/nilfs2.c' || echo '$(srcdir)/'`grub-core/fs/nilfs2.c grub-core/fs/libgrubmods_a-nilfs2.obj: grub-core/fs/nilfs2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-nilfs2.obj -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-nilfs2.Tpo -c -o grub-core/fs/libgrubmods_a-nilfs2.obj `if test -f 'grub-core/fs/nilfs2.c'; then $(CYGPATH_W) 'grub-core/fs/nilfs2.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/nilfs2.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-nilfs2.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-nilfs2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/nilfs2.c' object='grub-core/fs/libgrubmods_a-nilfs2.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-nilfs2.obj `if test -f 'grub-core/fs/nilfs2.c'; then $(CYGPATH_W) 'grub-core/fs/nilfs2.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/nilfs2.c'; fi` grub-core/fs/libgrubmods_a-ntfs.o: grub-core/fs/ntfs.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-ntfs.o -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-ntfs.Tpo -c -o grub-core/fs/libgrubmods_a-ntfs.o `test -f 'grub-core/fs/ntfs.c' || echo '$(srcdir)/'`grub-core/fs/ntfs.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-ntfs.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-ntfs.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/ntfs.c' object='grub-core/fs/libgrubmods_a-ntfs.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-ntfs.o `test -f 'grub-core/fs/ntfs.c' || echo '$(srcdir)/'`grub-core/fs/ntfs.c grub-core/fs/libgrubmods_a-ntfs.obj: grub-core/fs/ntfs.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-ntfs.obj -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-ntfs.Tpo -c -o grub-core/fs/libgrubmods_a-ntfs.obj `if test -f 'grub-core/fs/ntfs.c'; then $(CYGPATH_W) 'grub-core/fs/ntfs.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/ntfs.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-ntfs.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-ntfs.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/ntfs.c' object='grub-core/fs/libgrubmods_a-ntfs.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-ntfs.obj `if test -f 'grub-core/fs/ntfs.c'; then $(CYGPATH_W) 'grub-core/fs/ntfs.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/ntfs.c'; fi` grub-core/fs/libgrubmods_a-ntfscomp.o: grub-core/fs/ntfscomp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-ntfscomp.o -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-ntfscomp.Tpo -c -o grub-core/fs/libgrubmods_a-ntfscomp.o `test -f 'grub-core/fs/ntfscomp.c' || echo '$(srcdir)/'`grub-core/fs/ntfscomp.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-ntfscomp.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-ntfscomp.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/ntfscomp.c' object='grub-core/fs/libgrubmods_a-ntfscomp.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-ntfscomp.o `test -f 'grub-core/fs/ntfscomp.c' || echo '$(srcdir)/'`grub-core/fs/ntfscomp.c grub-core/fs/libgrubmods_a-ntfscomp.obj: grub-core/fs/ntfscomp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-ntfscomp.obj -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-ntfscomp.Tpo -c -o grub-core/fs/libgrubmods_a-ntfscomp.obj `if test -f 'grub-core/fs/ntfscomp.c'; then $(CYGPATH_W) 'grub-core/fs/ntfscomp.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/ntfscomp.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-ntfscomp.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-ntfscomp.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/ntfscomp.c' object='grub-core/fs/libgrubmods_a-ntfscomp.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-ntfscomp.obj `if test -f 'grub-core/fs/ntfscomp.c'; then $(CYGPATH_W) 'grub-core/fs/ntfscomp.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/ntfscomp.c'; fi` grub-core/fs/libgrubmods_a-odc.o: grub-core/fs/odc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-odc.o -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-odc.Tpo -c -o grub-core/fs/libgrubmods_a-odc.o `test -f 'grub-core/fs/odc.c' || echo '$(srcdir)/'`grub-core/fs/odc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-odc.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-odc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/odc.c' object='grub-core/fs/libgrubmods_a-odc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-odc.o `test -f 'grub-core/fs/odc.c' || echo '$(srcdir)/'`grub-core/fs/odc.c grub-core/fs/libgrubmods_a-odc.obj: grub-core/fs/odc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-odc.obj -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-odc.Tpo -c -o grub-core/fs/libgrubmods_a-odc.obj `if test -f 'grub-core/fs/odc.c'; then $(CYGPATH_W) 'grub-core/fs/odc.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/odc.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-odc.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-odc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/odc.c' object='grub-core/fs/libgrubmods_a-odc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-odc.obj `if test -f 'grub-core/fs/odc.c'; then $(CYGPATH_W) 'grub-core/fs/odc.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/odc.c'; fi` grub-core/fs/libgrubmods_a-reiserfs.o: grub-core/fs/reiserfs.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-reiserfs.o -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-reiserfs.Tpo -c -o grub-core/fs/libgrubmods_a-reiserfs.o `test -f 'grub-core/fs/reiserfs.c' || echo '$(srcdir)/'`grub-core/fs/reiserfs.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-reiserfs.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-reiserfs.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/reiserfs.c' object='grub-core/fs/libgrubmods_a-reiserfs.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-reiserfs.o `test -f 'grub-core/fs/reiserfs.c' || echo '$(srcdir)/'`grub-core/fs/reiserfs.c grub-core/fs/libgrubmods_a-reiserfs.obj: grub-core/fs/reiserfs.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-reiserfs.obj -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-reiserfs.Tpo -c -o grub-core/fs/libgrubmods_a-reiserfs.obj `if test -f 'grub-core/fs/reiserfs.c'; then $(CYGPATH_W) 'grub-core/fs/reiserfs.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/reiserfs.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-reiserfs.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-reiserfs.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/reiserfs.c' object='grub-core/fs/libgrubmods_a-reiserfs.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-reiserfs.obj `if test -f 'grub-core/fs/reiserfs.c'; then $(CYGPATH_W) 'grub-core/fs/reiserfs.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/reiserfs.c'; fi` grub-core/fs/libgrubmods_a-romfs.o: grub-core/fs/romfs.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-romfs.o -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-romfs.Tpo -c -o grub-core/fs/libgrubmods_a-romfs.o `test -f 'grub-core/fs/romfs.c' || echo '$(srcdir)/'`grub-core/fs/romfs.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-romfs.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-romfs.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/romfs.c' object='grub-core/fs/libgrubmods_a-romfs.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-romfs.o `test -f 'grub-core/fs/romfs.c' || echo '$(srcdir)/'`grub-core/fs/romfs.c grub-core/fs/libgrubmods_a-romfs.obj: grub-core/fs/romfs.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-romfs.obj -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-romfs.Tpo -c -o grub-core/fs/libgrubmods_a-romfs.obj `if test -f 'grub-core/fs/romfs.c'; then $(CYGPATH_W) 'grub-core/fs/romfs.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/romfs.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-romfs.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-romfs.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/romfs.c' object='grub-core/fs/libgrubmods_a-romfs.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-romfs.obj `if test -f 'grub-core/fs/romfs.c'; then $(CYGPATH_W) 'grub-core/fs/romfs.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/romfs.c'; fi` grub-core/fs/libgrubmods_a-sfs.o: grub-core/fs/sfs.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-sfs.o -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-sfs.Tpo -c -o grub-core/fs/libgrubmods_a-sfs.o `test -f 'grub-core/fs/sfs.c' || echo '$(srcdir)/'`grub-core/fs/sfs.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-sfs.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-sfs.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/sfs.c' object='grub-core/fs/libgrubmods_a-sfs.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-sfs.o `test -f 'grub-core/fs/sfs.c' || echo '$(srcdir)/'`grub-core/fs/sfs.c grub-core/fs/libgrubmods_a-sfs.obj: grub-core/fs/sfs.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-sfs.obj -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-sfs.Tpo -c -o grub-core/fs/libgrubmods_a-sfs.obj `if test -f 'grub-core/fs/sfs.c'; then $(CYGPATH_W) 'grub-core/fs/sfs.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/sfs.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-sfs.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-sfs.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/sfs.c' object='grub-core/fs/libgrubmods_a-sfs.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-sfs.obj `if test -f 'grub-core/fs/sfs.c'; then $(CYGPATH_W) 'grub-core/fs/sfs.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/sfs.c'; fi` grub-core/fs/libgrubmods_a-squash4.o: grub-core/fs/squash4.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-squash4.o -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-squash4.Tpo -c -o grub-core/fs/libgrubmods_a-squash4.o `test -f 'grub-core/fs/squash4.c' || echo '$(srcdir)/'`grub-core/fs/squash4.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-squash4.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-squash4.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/squash4.c' object='grub-core/fs/libgrubmods_a-squash4.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-squash4.o `test -f 'grub-core/fs/squash4.c' || echo '$(srcdir)/'`grub-core/fs/squash4.c grub-core/fs/libgrubmods_a-squash4.obj: grub-core/fs/squash4.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-squash4.obj -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-squash4.Tpo -c -o grub-core/fs/libgrubmods_a-squash4.obj `if test -f 'grub-core/fs/squash4.c'; then $(CYGPATH_W) 'grub-core/fs/squash4.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/squash4.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-squash4.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-squash4.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/squash4.c' object='grub-core/fs/libgrubmods_a-squash4.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-squash4.obj `if test -f 'grub-core/fs/squash4.c'; then $(CYGPATH_W) 'grub-core/fs/squash4.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/squash4.c'; fi` grub-core/fs/libgrubmods_a-tar.o: grub-core/fs/tar.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-tar.o -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-tar.Tpo -c -o grub-core/fs/libgrubmods_a-tar.o `test -f 'grub-core/fs/tar.c' || echo '$(srcdir)/'`grub-core/fs/tar.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-tar.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-tar.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/tar.c' object='grub-core/fs/libgrubmods_a-tar.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-tar.o `test -f 'grub-core/fs/tar.c' || echo '$(srcdir)/'`grub-core/fs/tar.c grub-core/fs/libgrubmods_a-tar.obj: grub-core/fs/tar.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-tar.obj -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-tar.Tpo -c -o grub-core/fs/libgrubmods_a-tar.obj `if test -f 'grub-core/fs/tar.c'; then $(CYGPATH_W) 'grub-core/fs/tar.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/tar.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-tar.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-tar.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/tar.c' object='grub-core/fs/libgrubmods_a-tar.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-tar.obj `if test -f 'grub-core/fs/tar.c'; then $(CYGPATH_W) 'grub-core/fs/tar.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/tar.c'; fi` grub-core/fs/libgrubmods_a-udf.o: grub-core/fs/udf.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-udf.o -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-udf.Tpo -c -o grub-core/fs/libgrubmods_a-udf.o `test -f 'grub-core/fs/udf.c' || echo '$(srcdir)/'`grub-core/fs/udf.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-udf.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-udf.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/udf.c' object='grub-core/fs/libgrubmods_a-udf.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-udf.o `test -f 'grub-core/fs/udf.c' || echo '$(srcdir)/'`grub-core/fs/udf.c grub-core/fs/libgrubmods_a-udf.obj: grub-core/fs/udf.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-udf.obj -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-udf.Tpo -c -o grub-core/fs/libgrubmods_a-udf.obj `if test -f 'grub-core/fs/udf.c'; then $(CYGPATH_W) 'grub-core/fs/udf.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/udf.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-udf.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-udf.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/udf.c' object='grub-core/fs/libgrubmods_a-udf.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-udf.obj `if test -f 'grub-core/fs/udf.c'; then $(CYGPATH_W) 'grub-core/fs/udf.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/udf.c'; fi` grub-core/fs/libgrubmods_a-ufs.o: grub-core/fs/ufs.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-ufs.o -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-ufs.Tpo -c -o grub-core/fs/libgrubmods_a-ufs.o `test -f 'grub-core/fs/ufs.c' || echo '$(srcdir)/'`grub-core/fs/ufs.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-ufs.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-ufs.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/ufs.c' object='grub-core/fs/libgrubmods_a-ufs.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-ufs.o `test -f 'grub-core/fs/ufs.c' || echo '$(srcdir)/'`grub-core/fs/ufs.c grub-core/fs/libgrubmods_a-ufs.obj: grub-core/fs/ufs.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-ufs.obj -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-ufs.Tpo -c -o grub-core/fs/libgrubmods_a-ufs.obj `if test -f 'grub-core/fs/ufs.c'; then $(CYGPATH_W) 'grub-core/fs/ufs.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/ufs.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-ufs.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-ufs.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/ufs.c' object='grub-core/fs/libgrubmods_a-ufs.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-ufs.obj `if test -f 'grub-core/fs/ufs.c'; then $(CYGPATH_W) 'grub-core/fs/ufs.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/ufs.c'; fi` grub-core/fs/libgrubmods_a-ufs2.o: grub-core/fs/ufs2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-ufs2.o -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-ufs2.Tpo -c -o grub-core/fs/libgrubmods_a-ufs2.o `test -f 'grub-core/fs/ufs2.c' || echo '$(srcdir)/'`grub-core/fs/ufs2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-ufs2.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-ufs2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/ufs2.c' object='grub-core/fs/libgrubmods_a-ufs2.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-ufs2.o `test -f 'grub-core/fs/ufs2.c' || echo '$(srcdir)/'`grub-core/fs/ufs2.c grub-core/fs/libgrubmods_a-ufs2.obj: grub-core/fs/ufs2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-ufs2.obj -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-ufs2.Tpo -c -o grub-core/fs/libgrubmods_a-ufs2.obj `if test -f 'grub-core/fs/ufs2.c'; then $(CYGPATH_W) 'grub-core/fs/ufs2.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/ufs2.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-ufs2.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-ufs2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/ufs2.c' object='grub-core/fs/libgrubmods_a-ufs2.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-ufs2.obj `if test -f 'grub-core/fs/ufs2.c'; then $(CYGPATH_W) 'grub-core/fs/ufs2.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/ufs2.c'; fi` grub-core/fs/libgrubmods_a-ufs_be.o: grub-core/fs/ufs_be.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-ufs_be.o -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-ufs_be.Tpo -c -o grub-core/fs/libgrubmods_a-ufs_be.o `test -f 'grub-core/fs/ufs_be.c' || echo '$(srcdir)/'`grub-core/fs/ufs_be.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-ufs_be.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-ufs_be.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/ufs_be.c' object='grub-core/fs/libgrubmods_a-ufs_be.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-ufs_be.o `test -f 'grub-core/fs/ufs_be.c' || echo '$(srcdir)/'`grub-core/fs/ufs_be.c grub-core/fs/libgrubmods_a-ufs_be.obj: grub-core/fs/ufs_be.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-ufs_be.obj -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-ufs_be.Tpo -c -o grub-core/fs/libgrubmods_a-ufs_be.obj `if test -f 'grub-core/fs/ufs_be.c'; then $(CYGPATH_W) 'grub-core/fs/ufs_be.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/ufs_be.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-ufs_be.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-ufs_be.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/ufs_be.c' object='grub-core/fs/libgrubmods_a-ufs_be.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-ufs_be.obj `if test -f 'grub-core/fs/ufs_be.c'; then $(CYGPATH_W) 'grub-core/fs/ufs_be.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/ufs_be.c'; fi` grub-core/fs/libgrubmods_a-xfs.o: grub-core/fs/xfs.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-xfs.o -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-xfs.Tpo -c -o grub-core/fs/libgrubmods_a-xfs.o `test -f 'grub-core/fs/xfs.c' || echo '$(srcdir)/'`grub-core/fs/xfs.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-xfs.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-xfs.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/xfs.c' object='grub-core/fs/libgrubmods_a-xfs.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-xfs.o `test -f 'grub-core/fs/xfs.c' || echo '$(srcdir)/'`grub-core/fs/xfs.c grub-core/fs/libgrubmods_a-xfs.obj: grub-core/fs/xfs.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/libgrubmods_a-xfs.obj -MD -MP -MF grub-core/fs/$(DEPDIR)/libgrubmods_a-xfs.Tpo -c -o grub-core/fs/libgrubmods_a-xfs.obj `if test -f 'grub-core/fs/xfs.c'; then $(CYGPATH_W) 'grub-core/fs/xfs.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/xfs.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/$(DEPDIR)/libgrubmods_a-xfs.Tpo grub-core/fs/$(DEPDIR)/libgrubmods_a-xfs.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/xfs.c' object='grub-core/fs/libgrubmods_a-xfs.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/libgrubmods_a-xfs.obj `if test -f 'grub-core/fs/xfs.c'; then $(CYGPATH_W) 'grub-core/fs/xfs.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/xfs.c'; fi` grub-core/fs/zfs/libgrubmods_a-zfs.o: grub-core/fs/zfs/zfs.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/zfs/libgrubmods_a-zfs.o -MD -MP -MF grub-core/fs/zfs/$(DEPDIR)/libgrubmods_a-zfs.Tpo -c -o grub-core/fs/zfs/libgrubmods_a-zfs.o `test -f 'grub-core/fs/zfs/zfs.c' || echo '$(srcdir)/'`grub-core/fs/zfs/zfs.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/zfs/$(DEPDIR)/libgrubmods_a-zfs.Tpo grub-core/fs/zfs/$(DEPDIR)/libgrubmods_a-zfs.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/zfs/zfs.c' object='grub-core/fs/zfs/libgrubmods_a-zfs.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/zfs/libgrubmods_a-zfs.o `test -f 'grub-core/fs/zfs/zfs.c' || echo '$(srcdir)/'`grub-core/fs/zfs/zfs.c grub-core/fs/zfs/libgrubmods_a-zfs.obj: grub-core/fs/zfs/zfs.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/zfs/libgrubmods_a-zfs.obj -MD -MP -MF grub-core/fs/zfs/$(DEPDIR)/libgrubmods_a-zfs.Tpo -c -o grub-core/fs/zfs/libgrubmods_a-zfs.obj `if test -f 'grub-core/fs/zfs/zfs.c'; then $(CYGPATH_W) 'grub-core/fs/zfs/zfs.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/zfs/zfs.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/zfs/$(DEPDIR)/libgrubmods_a-zfs.Tpo grub-core/fs/zfs/$(DEPDIR)/libgrubmods_a-zfs.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/zfs/zfs.c' object='grub-core/fs/zfs/libgrubmods_a-zfs.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/zfs/libgrubmods_a-zfs.obj `if test -f 'grub-core/fs/zfs/zfs.c'; then $(CYGPATH_W) 'grub-core/fs/zfs/zfs.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/zfs/zfs.c'; fi` grub-core/fs/zfs/libgrubmods_a-zfs_fletcher.o: grub-core/fs/zfs/zfs_fletcher.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/zfs/libgrubmods_a-zfs_fletcher.o -MD -MP -MF grub-core/fs/zfs/$(DEPDIR)/libgrubmods_a-zfs_fletcher.Tpo -c -o grub-core/fs/zfs/libgrubmods_a-zfs_fletcher.o `test -f 'grub-core/fs/zfs/zfs_fletcher.c' || echo '$(srcdir)/'`grub-core/fs/zfs/zfs_fletcher.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/zfs/$(DEPDIR)/libgrubmods_a-zfs_fletcher.Tpo grub-core/fs/zfs/$(DEPDIR)/libgrubmods_a-zfs_fletcher.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/zfs/zfs_fletcher.c' object='grub-core/fs/zfs/libgrubmods_a-zfs_fletcher.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/zfs/libgrubmods_a-zfs_fletcher.o `test -f 'grub-core/fs/zfs/zfs_fletcher.c' || echo '$(srcdir)/'`grub-core/fs/zfs/zfs_fletcher.c grub-core/fs/zfs/libgrubmods_a-zfs_fletcher.obj: grub-core/fs/zfs/zfs_fletcher.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/zfs/libgrubmods_a-zfs_fletcher.obj -MD -MP -MF grub-core/fs/zfs/$(DEPDIR)/libgrubmods_a-zfs_fletcher.Tpo -c -o grub-core/fs/zfs/libgrubmods_a-zfs_fletcher.obj `if test -f 'grub-core/fs/zfs/zfs_fletcher.c'; then $(CYGPATH_W) 'grub-core/fs/zfs/zfs_fletcher.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/zfs/zfs_fletcher.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/zfs/$(DEPDIR)/libgrubmods_a-zfs_fletcher.Tpo grub-core/fs/zfs/$(DEPDIR)/libgrubmods_a-zfs_fletcher.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/zfs/zfs_fletcher.c' object='grub-core/fs/zfs/libgrubmods_a-zfs_fletcher.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/zfs/libgrubmods_a-zfs_fletcher.obj `if test -f 'grub-core/fs/zfs/zfs_fletcher.c'; then $(CYGPATH_W) 'grub-core/fs/zfs/zfs_fletcher.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/zfs/zfs_fletcher.c'; fi` grub-core/fs/zfs/libgrubmods_a-zfs_lz4.o: grub-core/fs/zfs/zfs_lz4.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/zfs/libgrubmods_a-zfs_lz4.o -MD -MP -MF grub-core/fs/zfs/$(DEPDIR)/libgrubmods_a-zfs_lz4.Tpo -c -o grub-core/fs/zfs/libgrubmods_a-zfs_lz4.o `test -f 'grub-core/fs/zfs/zfs_lz4.c' || echo '$(srcdir)/'`grub-core/fs/zfs/zfs_lz4.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/zfs/$(DEPDIR)/libgrubmods_a-zfs_lz4.Tpo grub-core/fs/zfs/$(DEPDIR)/libgrubmods_a-zfs_lz4.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/zfs/zfs_lz4.c' object='grub-core/fs/zfs/libgrubmods_a-zfs_lz4.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/zfs/libgrubmods_a-zfs_lz4.o `test -f 'grub-core/fs/zfs/zfs_lz4.c' || echo '$(srcdir)/'`grub-core/fs/zfs/zfs_lz4.c grub-core/fs/zfs/libgrubmods_a-zfs_lz4.obj: grub-core/fs/zfs/zfs_lz4.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/zfs/libgrubmods_a-zfs_lz4.obj -MD -MP -MF grub-core/fs/zfs/$(DEPDIR)/libgrubmods_a-zfs_lz4.Tpo -c -o grub-core/fs/zfs/libgrubmods_a-zfs_lz4.obj `if test -f 'grub-core/fs/zfs/zfs_lz4.c'; then $(CYGPATH_W) 'grub-core/fs/zfs/zfs_lz4.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/zfs/zfs_lz4.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/zfs/$(DEPDIR)/libgrubmods_a-zfs_lz4.Tpo grub-core/fs/zfs/$(DEPDIR)/libgrubmods_a-zfs_lz4.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/zfs/zfs_lz4.c' object='grub-core/fs/zfs/libgrubmods_a-zfs_lz4.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/zfs/libgrubmods_a-zfs_lz4.obj `if test -f 'grub-core/fs/zfs/zfs_lz4.c'; then $(CYGPATH_W) 'grub-core/fs/zfs/zfs_lz4.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/zfs/zfs_lz4.c'; fi` grub-core/fs/zfs/libgrubmods_a-zfs_lzjb.o: grub-core/fs/zfs/zfs_lzjb.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/zfs/libgrubmods_a-zfs_lzjb.o -MD -MP -MF grub-core/fs/zfs/$(DEPDIR)/libgrubmods_a-zfs_lzjb.Tpo -c -o grub-core/fs/zfs/libgrubmods_a-zfs_lzjb.o `test -f 'grub-core/fs/zfs/zfs_lzjb.c' || echo '$(srcdir)/'`grub-core/fs/zfs/zfs_lzjb.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/zfs/$(DEPDIR)/libgrubmods_a-zfs_lzjb.Tpo grub-core/fs/zfs/$(DEPDIR)/libgrubmods_a-zfs_lzjb.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/zfs/zfs_lzjb.c' object='grub-core/fs/zfs/libgrubmods_a-zfs_lzjb.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/zfs/libgrubmods_a-zfs_lzjb.o `test -f 'grub-core/fs/zfs/zfs_lzjb.c' || echo '$(srcdir)/'`grub-core/fs/zfs/zfs_lzjb.c grub-core/fs/zfs/libgrubmods_a-zfs_lzjb.obj: grub-core/fs/zfs/zfs_lzjb.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/zfs/libgrubmods_a-zfs_lzjb.obj -MD -MP -MF grub-core/fs/zfs/$(DEPDIR)/libgrubmods_a-zfs_lzjb.Tpo -c -o grub-core/fs/zfs/libgrubmods_a-zfs_lzjb.obj `if test -f 'grub-core/fs/zfs/zfs_lzjb.c'; then $(CYGPATH_W) 'grub-core/fs/zfs/zfs_lzjb.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/zfs/zfs_lzjb.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/zfs/$(DEPDIR)/libgrubmods_a-zfs_lzjb.Tpo grub-core/fs/zfs/$(DEPDIR)/libgrubmods_a-zfs_lzjb.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/zfs/zfs_lzjb.c' object='grub-core/fs/zfs/libgrubmods_a-zfs_lzjb.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/zfs/libgrubmods_a-zfs_lzjb.obj `if test -f 'grub-core/fs/zfs/zfs_lzjb.c'; then $(CYGPATH_W) 'grub-core/fs/zfs/zfs_lzjb.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/zfs/zfs_lzjb.c'; fi` grub-core/fs/zfs/libgrubmods_a-zfs_sha256.o: grub-core/fs/zfs/zfs_sha256.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/zfs/libgrubmods_a-zfs_sha256.o -MD -MP -MF grub-core/fs/zfs/$(DEPDIR)/libgrubmods_a-zfs_sha256.Tpo -c -o grub-core/fs/zfs/libgrubmods_a-zfs_sha256.o `test -f 'grub-core/fs/zfs/zfs_sha256.c' || echo '$(srcdir)/'`grub-core/fs/zfs/zfs_sha256.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/zfs/$(DEPDIR)/libgrubmods_a-zfs_sha256.Tpo grub-core/fs/zfs/$(DEPDIR)/libgrubmods_a-zfs_sha256.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/zfs/zfs_sha256.c' object='grub-core/fs/zfs/libgrubmods_a-zfs_sha256.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/zfs/libgrubmods_a-zfs_sha256.o `test -f 'grub-core/fs/zfs/zfs_sha256.c' || echo '$(srcdir)/'`grub-core/fs/zfs/zfs_sha256.c grub-core/fs/zfs/libgrubmods_a-zfs_sha256.obj: grub-core/fs/zfs/zfs_sha256.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/zfs/libgrubmods_a-zfs_sha256.obj -MD -MP -MF grub-core/fs/zfs/$(DEPDIR)/libgrubmods_a-zfs_sha256.Tpo -c -o grub-core/fs/zfs/libgrubmods_a-zfs_sha256.obj `if test -f 'grub-core/fs/zfs/zfs_sha256.c'; then $(CYGPATH_W) 'grub-core/fs/zfs/zfs_sha256.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/zfs/zfs_sha256.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/zfs/$(DEPDIR)/libgrubmods_a-zfs_sha256.Tpo grub-core/fs/zfs/$(DEPDIR)/libgrubmods_a-zfs_sha256.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/zfs/zfs_sha256.c' object='grub-core/fs/zfs/libgrubmods_a-zfs_sha256.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/zfs/libgrubmods_a-zfs_sha256.obj `if test -f 'grub-core/fs/zfs/zfs_sha256.c'; then $(CYGPATH_W) 'grub-core/fs/zfs/zfs_sha256.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/zfs/zfs_sha256.c'; fi` grub-core/fs/zfs/libgrubmods_a-zfscrypt.o: grub-core/fs/zfs/zfscrypt.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/zfs/libgrubmods_a-zfscrypt.o -MD -MP -MF grub-core/fs/zfs/$(DEPDIR)/libgrubmods_a-zfscrypt.Tpo -c -o grub-core/fs/zfs/libgrubmods_a-zfscrypt.o `test -f 'grub-core/fs/zfs/zfscrypt.c' || echo '$(srcdir)/'`grub-core/fs/zfs/zfscrypt.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/zfs/$(DEPDIR)/libgrubmods_a-zfscrypt.Tpo grub-core/fs/zfs/$(DEPDIR)/libgrubmods_a-zfscrypt.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/zfs/zfscrypt.c' object='grub-core/fs/zfs/libgrubmods_a-zfscrypt.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/zfs/libgrubmods_a-zfscrypt.o `test -f 'grub-core/fs/zfs/zfscrypt.c' || echo '$(srcdir)/'`grub-core/fs/zfs/zfscrypt.c grub-core/fs/zfs/libgrubmods_a-zfscrypt.obj: grub-core/fs/zfs/zfscrypt.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/zfs/libgrubmods_a-zfscrypt.obj -MD -MP -MF grub-core/fs/zfs/$(DEPDIR)/libgrubmods_a-zfscrypt.Tpo -c -o grub-core/fs/zfs/libgrubmods_a-zfscrypt.obj `if test -f 'grub-core/fs/zfs/zfscrypt.c'; then $(CYGPATH_W) 'grub-core/fs/zfs/zfscrypt.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/zfs/zfscrypt.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/zfs/$(DEPDIR)/libgrubmods_a-zfscrypt.Tpo grub-core/fs/zfs/$(DEPDIR)/libgrubmods_a-zfscrypt.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/zfs/zfscrypt.c' object='grub-core/fs/zfs/libgrubmods_a-zfscrypt.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/zfs/libgrubmods_a-zfscrypt.obj `if test -f 'grub-core/fs/zfs/zfscrypt.c'; then $(CYGPATH_W) 'grub-core/fs/zfs/zfscrypt.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/zfs/zfscrypt.c'; fi` grub-core/fs/zfs/libgrubmods_a-zfsinfo.o: grub-core/fs/zfs/zfsinfo.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/zfs/libgrubmods_a-zfsinfo.o -MD -MP -MF grub-core/fs/zfs/$(DEPDIR)/libgrubmods_a-zfsinfo.Tpo -c -o grub-core/fs/zfs/libgrubmods_a-zfsinfo.o `test -f 'grub-core/fs/zfs/zfsinfo.c' || echo '$(srcdir)/'`grub-core/fs/zfs/zfsinfo.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/zfs/$(DEPDIR)/libgrubmods_a-zfsinfo.Tpo grub-core/fs/zfs/$(DEPDIR)/libgrubmods_a-zfsinfo.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/zfs/zfsinfo.c' object='grub-core/fs/zfs/libgrubmods_a-zfsinfo.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/zfs/libgrubmods_a-zfsinfo.o `test -f 'grub-core/fs/zfs/zfsinfo.c' || echo '$(srcdir)/'`grub-core/fs/zfs/zfsinfo.c grub-core/fs/zfs/libgrubmods_a-zfsinfo.obj: grub-core/fs/zfs/zfsinfo.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/fs/zfs/libgrubmods_a-zfsinfo.obj -MD -MP -MF grub-core/fs/zfs/$(DEPDIR)/libgrubmods_a-zfsinfo.Tpo -c -o grub-core/fs/zfs/libgrubmods_a-zfsinfo.obj `if test -f 'grub-core/fs/zfs/zfsinfo.c'; then $(CYGPATH_W) 'grub-core/fs/zfs/zfsinfo.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/zfs/zfsinfo.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/fs/zfs/$(DEPDIR)/libgrubmods_a-zfsinfo.Tpo grub-core/fs/zfs/$(DEPDIR)/libgrubmods_a-zfsinfo.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/fs/zfs/zfsinfo.c' object='grub-core/fs/zfs/libgrubmods_a-zfsinfo.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/fs/zfs/libgrubmods_a-zfsinfo.obj `if test -f 'grub-core/fs/zfs/zfsinfo.c'; then $(CYGPATH_W) 'grub-core/fs/zfs/zfsinfo.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/fs/zfs/zfsinfo.c'; fi` grub-core/gfxmenu/libgrubmods_a-font.o: grub-core/gfxmenu/font.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/gfxmenu/libgrubmods_a-font.o -MD -MP -MF grub-core/gfxmenu/$(DEPDIR)/libgrubmods_a-font.Tpo -c -o grub-core/gfxmenu/libgrubmods_a-font.o `test -f 'grub-core/gfxmenu/font.c' || echo '$(srcdir)/'`grub-core/gfxmenu/font.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/gfxmenu/$(DEPDIR)/libgrubmods_a-font.Tpo grub-core/gfxmenu/$(DEPDIR)/libgrubmods_a-font.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/gfxmenu/font.c' object='grub-core/gfxmenu/libgrubmods_a-font.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/gfxmenu/libgrubmods_a-font.o `test -f 'grub-core/gfxmenu/font.c' || echo '$(srcdir)/'`grub-core/gfxmenu/font.c grub-core/gfxmenu/libgrubmods_a-font.obj: grub-core/gfxmenu/font.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/gfxmenu/libgrubmods_a-font.obj -MD -MP -MF grub-core/gfxmenu/$(DEPDIR)/libgrubmods_a-font.Tpo -c -o grub-core/gfxmenu/libgrubmods_a-font.obj `if test -f 'grub-core/gfxmenu/font.c'; then $(CYGPATH_W) 'grub-core/gfxmenu/font.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/gfxmenu/font.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/gfxmenu/$(DEPDIR)/libgrubmods_a-font.Tpo grub-core/gfxmenu/$(DEPDIR)/libgrubmods_a-font.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/gfxmenu/font.c' object='grub-core/gfxmenu/libgrubmods_a-font.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/gfxmenu/libgrubmods_a-font.obj `if test -f 'grub-core/gfxmenu/font.c'; then $(CYGPATH_W) 'grub-core/gfxmenu/font.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/gfxmenu/font.c'; fi` grub-core/io/libgrubmods_a-bufio.o: grub-core/io/bufio.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/io/libgrubmods_a-bufio.o -MD -MP -MF grub-core/io/$(DEPDIR)/libgrubmods_a-bufio.Tpo -c -o grub-core/io/libgrubmods_a-bufio.o `test -f 'grub-core/io/bufio.c' || echo '$(srcdir)/'`grub-core/io/bufio.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/io/$(DEPDIR)/libgrubmods_a-bufio.Tpo grub-core/io/$(DEPDIR)/libgrubmods_a-bufio.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/io/bufio.c' object='grub-core/io/libgrubmods_a-bufio.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/io/libgrubmods_a-bufio.o `test -f 'grub-core/io/bufio.c' || echo '$(srcdir)/'`grub-core/io/bufio.c grub-core/io/libgrubmods_a-bufio.obj: grub-core/io/bufio.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/io/libgrubmods_a-bufio.obj -MD -MP -MF grub-core/io/$(DEPDIR)/libgrubmods_a-bufio.Tpo -c -o grub-core/io/libgrubmods_a-bufio.obj `if test -f 'grub-core/io/bufio.c'; then $(CYGPATH_W) 'grub-core/io/bufio.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/io/bufio.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/io/$(DEPDIR)/libgrubmods_a-bufio.Tpo grub-core/io/$(DEPDIR)/libgrubmods_a-bufio.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/io/bufio.c' object='grub-core/io/libgrubmods_a-bufio.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/io/libgrubmods_a-bufio.obj `if test -f 'grub-core/io/bufio.c'; then $(CYGPATH_W) 'grub-core/io/bufio.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/io/bufio.c'; fi` grub-core/io/libgrubmods_a-gzio.o: grub-core/io/gzio.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/io/libgrubmods_a-gzio.o -MD -MP -MF grub-core/io/$(DEPDIR)/libgrubmods_a-gzio.Tpo -c -o grub-core/io/libgrubmods_a-gzio.o `test -f 'grub-core/io/gzio.c' || echo '$(srcdir)/'`grub-core/io/gzio.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/io/$(DEPDIR)/libgrubmods_a-gzio.Tpo grub-core/io/$(DEPDIR)/libgrubmods_a-gzio.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/io/gzio.c' object='grub-core/io/libgrubmods_a-gzio.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/io/libgrubmods_a-gzio.o `test -f 'grub-core/io/gzio.c' || echo '$(srcdir)/'`grub-core/io/gzio.c grub-core/io/libgrubmods_a-gzio.obj: grub-core/io/gzio.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/io/libgrubmods_a-gzio.obj -MD -MP -MF grub-core/io/$(DEPDIR)/libgrubmods_a-gzio.Tpo -c -o grub-core/io/libgrubmods_a-gzio.obj `if test -f 'grub-core/io/gzio.c'; then $(CYGPATH_W) 'grub-core/io/gzio.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/io/gzio.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/io/$(DEPDIR)/libgrubmods_a-gzio.Tpo grub-core/io/$(DEPDIR)/libgrubmods_a-gzio.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/io/gzio.c' object='grub-core/io/libgrubmods_a-gzio.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/io/libgrubmods_a-gzio.obj `if test -f 'grub-core/io/gzio.c'; then $(CYGPATH_W) 'grub-core/io/gzio.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/io/gzio.c'; fi` grub-core/io/libgrubmods_a-lzopio.o: grub-core/io/lzopio.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/io/libgrubmods_a-lzopio.o -MD -MP -MF grub-core/io/$(DEPDIR)/libgrubmods_a-lzopio.Tpo -c -o grub-core/io/libgrubmods_a-lzopio.o `test -f 'grub-core/io/lzopio.c' || echo '$(srcdir)/'`grub-core/io/lzopio.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/io/$(DEPDIR)/libgrubmods_a-lzopio.Tpo grub-core/io/$(DEPDIR)/libgrubmods_a-lzopio.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/io/lzopio.c' object='grub-core/io/libgrubmods_a-lzopio.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/io/libgrubmods_a-lzopio.o `test -f 'grub-core/io/lzopio.c' || echo '$(srcdir)/'`grub-core/io/lzopio.c grub-core/io/libgrubmods_a-lzopio.obj: grub-core/io/lzopio.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/io/libgrubmods_a-lzopio.obj -MD -MP -MF grub-core/io/$(DEPDIR)/libgrubmods_a-lzopio.Tpo -c -o grub-core/io/libgrubmods_a-lzopio.obj `if test -f 'grub-core/io/lzopio.c'; then $(CYGPATH_W) 'grub-core/io/lzopio.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/io/lzopio.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/io/$(DEPDIR)/libgrubmods_a-lzopio.Tpo grub-core/io/$(DEPDIR)/libgrubmods_a-lzopio.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/io/lzopio.c' object='grub-core/io/libgrubmods_a-lzopio.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/io/libgrubmods_a-lzopio.obj `if test -f 'grub-core/io/lzopio.c'; then $(CYGPATH_W) 'grub-core/io/lzopio.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/io/lzopio.c'; fi` grub-core/io/libgrubmods_a-xzio.o: grub-core/io/xzio.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/io/libgrubmods_a-xzio.o -MD -MP -MF grub-core/io/$(DEPDIR)/libgrubmods_a-xzio.Tpo -c -o grub-core/io/libgrubmods_a-xzio.o `test -f 'grub-core/io/xzio.c' || echo '$(srcdir)/'`grub-core/io/xzio.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/io/$(DEPDIR)/libgrubmods_a-xzio.Tpo grub-core/io/$(DEPDIR)/libgrubmods_a-xzio.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/io/xzio.c' object='grub-core/io/libgrubmods_a-xzio.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/io/libgrubmods_a-xzio.o `test -f 'grub-core/io/xzio.c' || echo '$(srcdir)/'`grub-core/io/xzio.c grub-core/io/libgrubmods_a-xzio.obj: grub-core/io/xzio.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/io/libgrubmods_a-xzio.obj -MD -MP -MF grub-core/io/$(DEPDIR)/libgrubmods_a-xzio.Tpo -c -o grub-core/io/libgrubmods_a-xzio.obj `if test -f 'grub-core/io/xzio.c'; then $(CYGPATH_W) 'grub-core/io/xzio.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/io/xzio.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/io/$(DEPDIR)/libgrubmods_a-xzio.Tpo grub-core/io/$(DEPDIR)/libgrubmods_a-xzio.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/io/xzio.c' object='grub-core/io/libgrubmods_a-xzio.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/io/libgrubmods_a-xzio.obj `if test -f 'grub-core/io/xzio.c'; then $(CYGPATH_W) 'grub-core/io/xzio.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/io/xzio.c'; fi` grub-core/kern/arm/libgrubmods_a-dl_helper.o: grub-core/kern/arm/dl_helper.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/kern/arm/libgrubmods_a-dl_helper.o -MD -MP -MF grub-core/kern/arm/$(DEPDIR)/libgrubmods_a-dl_helper.Tpo -c -o grub-core/kern/arm/libgrubmods_a-dl_helper.o `test -f 'grub-core/kern/arm/dl_helper.c' || echo '$(srcdir)/'`grub-core/kern/arm/dl_helper.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/arm/$(DEPDIR)/libgrubmods_a-dl_helper.Tpo grub-core/kern/arm/$(DEPDIR)/libgrubmods_a-dl_helper.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/arm/dl_helper.c' object='grub-core/kern/arm/libgrubmods_a-dl_helper.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/kern/arm/libgrubmods_a-dl_helper.o `test -f 'grub-core/kern/arm/dl_helper.c' || echo '$(srcdir)/'`grub-core/kern/arm/dl_helper.c grub-core/kern/arm/libgrubmods_a-dl_helper.obj: grub-core/kern/arm/dl_helper.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/kern/arm/libgrubmods_a-dl_helper.obj -MD -MP -MF grub-core/kern/arm/$(DEPDIR)/libgrubmods_a-dl_helper.Tpo -c -o grub-core/kern/arm/libgrubmods_a-dl_helper.obj `if test -f 'grub-core/kern/arm/dl_helper.c'; then $(CYGPATH_W) 'grub-core/kern/arm/dl_helper.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/arm/dl_helper.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/arm/$(DEPDIR)/libgrubmods_a-dl_helper.Tpo grub-core/kern/arm/$(DEPDIR)/libgrubmods_a-dl_helper.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/arm/dl_helper.c' object='grub-core/kern/arm/libgrubmods_a-dl_helper.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/kern/arm/libgrubmods_a-dl_helper.obj `if test -f 'grub-core/kern/arm/dl_helper.c'; then $(CYGPATH_W) 'grub-core/kern/arm/dl_helper.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/arm/dl_helper.c'; fi` grub-core/kern/arm64/libgrubmods_a-dl_helper.o: grub-core/kern/arm64/dl_helper.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/kern/arm64/libgrubmods_a-dl_helper.o -MD -MP -MF grub-core/kern/arm64/$(DEPDIR)/libgrubmods_a-dl_helper.Tpo -c -o grub-core/kern/arm64/libgrubmods_a-dl_helper.o `test -f 'grub-core/kern/arm64/dl_helper.c' || echo '$(srcdir)/'`grub-core/kern/arm64/dl_helper.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/arm64/$(DEPDIR)/libgrubmods_a-dl_helper.Tpo grub-core/kern/arm64/$(DEPDIR)/libgrubmods_a-dl_helper.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/arm64/dl_helper.c' object='grub-core/kern/arm64/libgrubmods_a-dl_helper.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/kern/arm64/libgrubmods_a-dl_helper.o `test -f 'grub-core/kern/arm64/dl_helper.c' || echo '$(srcdir)/'`grub-core/kern/arm64/dl_helper.c grub-core/kern/arm64/libgrubmods_a-dl_helper.obj: grub-core/kern/arm64/dl_helper.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/kern/arm64/libgrubmods_a-dl_helper.obj -MD -MP -MF grub-core/kern/arm64/$(DEPDIR)/libgrubmods_a-dl_helper.Tpo -c -o grub-core/kern/arm64/libgrubmods_a-dl_helper.obj `if test -f 'grub-core/kern/arm64/dl_helper.c'; then $(CYGPATH_W) 'grub-core/kern/arm64/dl_helper.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/arm64/dl_helper.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/arm64/$(DEPDIR)/libgrubmods_a-dl_helper.Tpo grub-core/kern/arm64/$(DEPDIR)/libgrubmods_a-dl_helper.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/arm64/dl_helper.c' object='grub-core/kern/arm64/libgrubmods_a-dl_helper.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/kern/arm64/libgrubmods_a-dl_helper.obj `if test -f 'grub-core/kern/arm64/dl_helper.c'; then $(CYGPATH_W) 'grub-core/kern/arm64/dl_helper.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/arm64/dl_helper.c'; fi` grub-core/kern/ia64/libgrubmods_a-dl_helper.o: grub-core/kern/ia64/dl_helper.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/kern/ia64/libgrubmods_a-dl_helper.o -MD -MP -MF grub-core/kern/ia64/$(DEPDIR)/libgrubmods_a-dl_helper.Tpo -c -o grub-core/kern/ia64/libgrubmods_a-dl_helper.o `test -f 'grub-core/kern/ia64/dl_helper.c' || echo '$(srcdir)/'`grub-core/kern/ia64/dl_helper.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/ia64/$(DEPDIR)/libgrubmods_a-dl_helper.Tpo grub-core/kern/ia64/$(DEPDIR)/libgrubmods_a-dl_helper.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/ia64/dl_helper.c' object='grub-core/kern/ia64/libgrubmods_a-dl_helper.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/kern/ia64/libgrubmods_a-dl_helper.o `test -f 'grub-core/kern/ia64/dl_helper.c' || echo '$(srcdir)/'`grub-core/kern/ia64/dl_helper.c grub-core/kern/ia64/libgrubmods_a-dl_helper.obj: grub-core/kern/ia64/dl_helper.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/kern/ia64/libgrubmods_a-dl_helper.obj -MD -MP -MF grub-core/kern/ia64/$(DEPDIR)/libgrubmods_a-dl_helper.Tpo -c -o grub-core/kern/ia64/libgrubmods_a-dl_helper.obj `if test -f 'grub-core/kern/ia64/dl_helper.c'; then $(CYGPATH_W) 'grub-core/kern/ia64/dl_helper.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/ia64/dl_helper.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/ia64/$(DEPDIR)/libgrubmods_a-dl_helper.Tpo grub-core/kern/ia64/$(DEPDIR)/libgrubmods_a-dl_helper.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/ia64/dl_helper.c' object='grub-core/kern/ia64/libgrubmods_a-dl_helper.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/kern/ia64/libgrubmods_a-dl_helper.obj `if test -f 'grub-core/kern/ia64/dl_helper.c'; then $(CYGPATH_W) 'grub-core/kern/ia64/dl_helper.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/ia64/dl_helper.c'; fi` grub-core/kern/loongarch64/libgrubmods_a-dl_helper.o: grub-core/kern/loongarch64/dl_helper.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/kern/loongarch64/libgrubmods_a-dl_helper.o -MD -MP -MF grub-core/kern/loongarch64/$(DEPDIR)/libgrubmods_a-dl_helper.Tpo -c -o grub-core/kern/loongarch64/libgrubmods_a-dl_helper.o `test -f 'grub-core/kern/loongarch64/dl_helper.c' || echo '$(srcdir)/'`grub-core/kern/loongarch64/dl_helper.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/loongarch64/$(DEPDIR)/libgrubmods_a-dl_helper.Tpo grub-core/kern/loongarch64/$(DEPDIR)/libgrubmods_a-dl_helper.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/loongarch64/dl_helper.c' object='grub-core/kern/loongarch64/libgrubmods_a-dl_helper.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/kern/loongarch64/libgrubmods_a-dl_helper.o `test -f 'grub-core/kern/loongarch64/dl_helper.c' || echo '$(srcdir)/'`grub-core/kern/loongarch64/dl_helper.c grub-core/kern/loongarch64/libgrubmods_a-dl_helper.obj: grub-core/kern/loongarch64/dl_helper.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/kern/loongarch64/libgrubmods_a-dl_helper.obj -MD -MP -MF grub-core/kern/loongarch64/$(DEPDIR)/libgrubmods_a-dl_helper.Tpo -c -o grub-core/kern/loongarch64/libgrubmods_a-dl_helper.obj `if test -f 'grub-core/kern/loongarch64/dl_helper.c'; then $(CYGPATH_W) 'grub-core/kern/loongarch64/dl_helper.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/loongarch64/dl_helper.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/loongarch64/$(DEPDIR)/libgrubmods_a-dl_helper.Tpo grub-core/kern/loongarch64/$(DEPDIR)/libgrubmods_a-dl_helper.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/loongarch64/dl_helper.c' object='grub-core/kern/loongarch64/libgrubmods_a-dl_helper.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/kern/loongarch64/libgrubmods_a-dl_helper.obj `if test -f 'grub-core/kern/loongarch64/dl_helper.c'; then $(CYGPATH_W) 'grub-core/kern/loongarch64/dl_helper.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/loongarch64/dl_helper.c'; fi` grub-core/lib/libgrubmods_a-LzFind.o: grub-core/lib/LzFind.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgrubmods_a-LzFind.o -MD -MP -MF grub-core/lib/$(DEPDIR)/libgrubmods_a-LzFind.Tpo -c -o grub-core/lib/libgrubmods_a-LzFind.o `test -f 'grub-core/lib/LzFind.c' || echo '$(srcdir)/'`grub-core/lib/LzFind.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/$(DEPDIR)/libgrubmods_a-LzFind.Tpo grub-core/lib/$(DEPDIR)/libgrubmods_a-LzFind.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/LzFind.c' object='grub-core/lib/libgrubmods_a-LzFind.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgrubmods_a-LzFind.o `test -f 'grub-core/lib/LzFind.c' || echo '$(srcdir)/'`grub-core/lib/LzFind.c grub-core/lib/libgrubmods_a-LzFind.obj: grub-core/lib/LzFind.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgrubmods_a-LzFind.obj -MD -MP -MF grub-core/lib/$(DEPDIR)/libgrubmods_a-LzFind.Tpo -c -o grub-core/lib/libgrubmods_a-LzFind.obj `if test -f 'grub-core/lib/LzFind.c'; then $(CYGPATH_W) 'grub-core/lib/LzFind.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/LzFind.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/$(DEPDIR)/libgrubmods_a-LzFind.Tpo grub-core/lib/$(DEPDIR)/libgrubmods_a-LzFind.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/LzFind.c' object='grub-core/lib/libgrubmods_a-LzFind.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgrubmods_a-LzFind.obj `if test -f 'grub-core/lib/LzFind.c'; then $(CYGPATH_W) 'grub-core/lib/LzFind.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/LzFind.c'; fi` grub-core/lib/libgrubmods_a-LzmaEnc.o: grub-core/lib/LzmaEnc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgrubmods_a-LzmaEnc.o -MD -MP -MF grub-core/lib/$(DEPDIR)/libgrubmods_a-LzmaEnc.Tpo -c -o grub-core/lib/libgrubmods_a-LzmaEnc.o `test -f 'grub-core/lib/LzmaEnc.c' || echo '$(srcdir)/'`grub-core/lib/LzmaEnc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/$(DEPDIR)/libgrubmods_a-LzmaEnc.Tpo grub-core/lib/$(DEPDIR)/libgrubmods_a-LzmaEnc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/LzmaEnc.c' object='grub-core/lib/libgrubmods_a-LzmaEnc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgrubmods_a-LzmaEnc.o `test -f 'grub-core/lib/LzmaEnc.c' || echo '$(srcdir)/'`grub-core/lib/LzmaEnc.c grub-core/lib/libgrubmods_a-LzmaEnc.obj: grub-core/lib/LzmaEnc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgrubmods_a-LzmaEnc.obj -MD -MP -MF grub-core/lib/$(DEPDIR)/libgrubmods_a-LzmaEnc.Tpo -c -o grub-core/lib/libgrubmods_a-LzmaEnc.obj `if test -f 'grub-core/lib/LzmaEnc.c'; then $(CYGPATH_W) 'grub-core/lib/LzmaEnc.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/LzmaEnc.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/$(DEPDIR)/libgrubmods_a-LzmaEnc.Tpo grub-core/lib/$(DEPDIR)/libgrubmods_a-LzmaEnc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/LzmaEnc.c' object='grub-core/lib/libgrubmods_a-LzmaEnc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgrubmods_a-LzmaEnc.obj `if test -f 'grub-core/lib/LzmaEnc.c'; then $(CYGPATH_W) 'grub-core/lib/LzmaEnc.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/LzmaEnc.c'; fi` grub-core/lib/libgrubmods_a-adler32.o: grub-core/lib/adler32.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgrubmods_a-adler32.o -MD -MP -MF grub-core/lib/$(DEPDIR)/libgrubmods_a-adler32.Tpo -c -o grub-core/lib/libgrubmods_a-adler32.o `test -f 'grub-core/lib/adler32.c' || echo '$(srcdir)/'`grub-core/lib/adler32.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/$(DEPDIR)/libgrubmods_a-adler32.Tpo grub-core/lib/$(DEPDIR)/libgrubmods_a-adler32.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/adler32.c' object='grub-core/lib/libgrubmods_a-adler32.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgrubmods_a-adler32.o `test -f 'grub-core/lib/adler32.c' || echo '$(srcdir)/'`grub-core/lib/adler32.c grub-core/lib/libgrubmods_a-adler32.obj: grub-core/lib/adler32.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgrubmods_a-adler32.obj -MD -MP -MF grub-core/lib/$(DEPDIR)/libgrubmods_a-adler32.Tpo -c -o grub-core/lib/libgrubmods_a-adler32.obj `if test -f 'grub-core/lib/adler32.c'; then $(CYGPATH_W) 'grub-core/lib/adler32.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/adler32.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/$(DEPDIR)/libgrubmods_a-adler32.Tpo grub-core/lib/$(DEPDIR)/libgrubmods_a-adler32.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/adler32.c' object='grub-core/lib/libgrubmods_a-adler32.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgrubmods_a-adler32.obj `if test -f 'grub-core/lib/adler32.c'; then $(CYGPATH_W) 'grub-core/lib/adler32.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/adler32.c'; fi` grub-core/lib/libgrubmods_a-crc.o: grub-core/lib/crc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgrubmods_a-crc.o -MD -MP -MF grub-core/lib/$(DEPDIR)/libgrubmods_a-crc.Tpo -c -o grub-core/lib/libgrubmods_a-crc.o `test -f 'grub-core/lib/crc.c' || echo '$(srcdir)/'`grub-core/lib/crc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/$(DEPDIR)/libgrubmods_a-crc.Tpo grub-core/lib/$(DEPDIR)/libgrubmods_a-crc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/crc.c' object='grub-core/lib/libgrubmods_a-crc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgrubmods_a-crc.o `test -f 'grub-core/lib/crc.c' || echo '$(srcdir)/'`grub-core/lib/crc.c grub-core/lib/libgrubmods_a-crc.obj: grub-core/lib/crc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgrubmods_a-crc.obj -MD -MP -MF grub-core/lib/$(DEPDIR)/libgrubmods_a-crc.Tpo -c -o grub-core/lib/libgrubmods_a-crc.obj `if test -f 'grub-core/lib/crc.c'; then $(CYGPATH_W) 'grub-core/lib/crc.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/crc.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/$(DEPDIR)/libgrubmods_a-crc.Tpo grub-core/lib/$(DEPDIR)/libgrubmods_a-crc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/crc.c' object='grub-core/lib/libgrubmods_a-crc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgrubmods_a-crc.obj `if test -f 'grub-core/lib/crc.c'; then $(CYGPATH_W) 'grub-core/lib/crc.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/crc.c'; fi` grub-core/lib/libgrubmods_a-crc64.o: grub-core/lib/crc64.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgrubmods_a-crc64.o -MD -MP -MF grub-core/lib/$(DEPDIR)/libgrubmods_a-crc64.Tpo -c -o grub-core/lib/libgrubmods_a-crc64.o `test -f 'grub-core/lib/crc64.c' || echo '$(srcdir)/'`grub-core/lib/crc64.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/$(DEPDIR)/libgrubmods_a-crc64.Tpo grub-core/lib/$(DEPDIR)/libgrubmods_a-crc64.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/crc64.c' object='grub-core/lib/libgrubmods_a-crc64.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgrubmods_a-crc64.o `test -f 'grub-core/lib/crc64.c' || echo '$(srcdir)/'`grub-core/lib/crc64.c grub-core/lib/libgrubmods_a-crc64.obj: grub-core/lib/crc64.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgrubmods_a-crc64.obj -MD -MP -MF grub-core/lib/$(DEPDIR)/libgrubmods_a-crc64.Tpo -c -o grub-core/lib/libgrubmods_a-crc64.obj `if test -f 'grub-core/lib/crc64.c'; then $(CYGPATH_W) 'grub-core/lib/crc64.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/crc64.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/$(DEPDIR)/libgrubmods_a-crc64.Tpo grub-core/lib/$(DEPDIR)/libgrubmods_a-crc64.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/crc64.c' object='grub-core/lib/libgrubmods_a-crc64.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgrubmods_a-crc64.obj `if test -f 'grub-core/lib/crc64.c'; then $(CYGPATH_W) 'grub-core/lib/crc64.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/crc64.c'; fi` grub-core/lib/libgrubmods_a-datetime.o: grub-core/lib/datetime.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgrubmods_a-datetime.o -MD -MP -MF grub-core/lib/$(DEPDIR)/libgrubmods_a-datetime.Tpo -c -o grub-core/lib/libgrubmods_a-datetime.o `test -f 'grub-core/lib/datetime.c' || echo '$(srcdir)/'`grub-core/lib/datetime.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/$(DEPDIR)/libgrubmods_a-datetime.Tpo grub-core/lib/$(DEPDIR)/libgrubmods_a-datetime.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/datetime.c' object='grub-core/lib/libgrubmods_a-datetime.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgrubmods_a-datetime.o `test -f 'grub-core/lib/datetime.c' || echo '$(srcdir)/'`grub-core/lib/datetime.c grub-core/lib/libgrubmods_a-datetime.obj: grub-core/lib/datetime.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgrubmods_a-datetime.obj -MD -MP -MF grub-core/lib/$(DEPDIR)/libgrubmods_a-datetime.Tpo -c -o grub-core/lib/libgrubmods_a-datetime.obj `if test -f 'grub-core/lib/datetime.c'; then $(CYGPATH_W) 'grub-core/lib/datetime.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/datetime.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/$(DEPDIR)/libgrubmods_a-datetime.Tpo grub-core/lib/$(DEPDIR)/libgrubmods_a-datetime.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/datetime.c' object='grub-core/lib/libgrubmods_a-datetime.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgrubmods_a-datetime.obj `if test -f 'grub-core/lib/datetime.c'; then $(CYGPATH_W) 'grub-core/lib/datetime.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/datetime.c'; fi` grub-core/lib/libgrubmods_a-envblk.o: grub-core/lib/envblk.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgrubmods_a-envblk.o -MD -MP -MF grub-core/lib/$(DEPDIR)/libgrubmods_a-envblk.Tpo -c -o grub-core/lib/libgrubmods_a-envblk.o `test -f 'grub-core/lib/envblk.c' || echo '$(srcdir)/'`grub-core/lib/envblk.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/$(DEPDIR)/libgrubmods_a-envblk.Tpo grub-core/lib/$(DEPDIR)/libgrubmods_a-envblk.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/envblk.c' object='grub-core/lib/libgrubmods_a-envblk.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgrubmods_a-envblk.o `test -f 'grub-core/lib/envblk.c' || echo '$(srcdir)/'`grub-core/lib/envblk.c grub-core/lib/libgrubmods_a-envblk.obj: grub-core/lib/envblk.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgrubmods_a-envblk.obj -MD -MP -MF grub-core/lib/$(DEPDIR)/libgrubmods_a-envblk.Tpo -c -o grub-core/lib/libgrubmods_a-envblk.obj `if test -f 'grub-core/lib/envblk.c'; then $(CYGPATH_W) 'grub-core/lib/envblk.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/envblk.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/$(DEPDIR)/libgrubmods_a-envblk.Tpo grub-core/lib/$(DEPDIR)/libgrubmods_a-envblk.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/envblk.c' object='grub-core/lib/libgrubmods_a-envblk.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgrubmods_a-envblk.obj `if test -f 'grub-core/lib/envblk.c'; then $(CYGPATH_W) 'grub-core/lib/envblk.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/envblk.c'; fi` grub-core/lib/libgrubmods_a-hexdump.o: grub-core/lib/hexdump.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgrubmods_a-hexdump.o -MD -MP -MF grub-core/lib/$(DEPDIR)/libgrubmods_a-hexdump.Tpo -c -o grub-core/lib/libgrubmods_a-hexdump.o `test -f 'grub-core/lib/hexdump.c' || echo '$(srcdir)/'`grub-core/lib/hexdump.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/$(DEPDIR)/libgrubmods_a-hexdump.Tpo grub-core/lib/$(DEPDIR)/libgrubmods_a-hexdump.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/hexdump.c' object='grub-core/lib/libgrubmods_a-hexdump.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgrubmods_a-hexdump.o `test -f 'grub-core/lib/hexdump.c' || echo '$(srcdir)/'`grub-core/lib/hexdump.c grub-core/lib/libgrubmods_a-hexdump.obj: grub-core/lib/hexdump.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/libgrubmods_a-hexdump.obj -MD -MP -MF grub-core/lib/$(DEPDIR)/libgrubmods_a-hexdump.Tpo -c -o grub-core/lib/libgrubmods_a-hexdump.obj `if test -f 'grub-core/lib/hexdump.c'; then $(CYGPATH_W) 'grub-core/lib/hexdump.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/hexdump.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/$(DEPDIR)/libgrubmods_a-hexdump.Tpo grub-core/lib/$(DEPDIR)/libgrubmods_a-hexdump.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/hexdump.c' object='grub-core/lib/libgrubmods_a-hexdump.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/libgrubmods_a-hexdump.obj `if test -f 'grub-core/lib/hexdump.c'; then $(CYGPATH_W) 'grub-core/lib/hexdump.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/hexdump.c'; fi` grub-core/lib/minilzo/libgrubmods_a-minilzo.o: grub-core/lib/minilzo/minilzo.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/minilzo/libgrubmods_a-minilzo.o -MD -MP -MF grub-core/lib/minilzo/$(DEPDIR)/libgrubmods_a-minilzo.Tpo -c -o grub-core/lib/minilzo/libgrubmods_a-minilzo.o `test -f 'grub-core/lib/minilzo/minilzo.c' || echo '$(srcdir)/'`grub-core/lib/minilzo/minilzo.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/minilzo/$(DEPDIR)/libgrubmods_a-minilzo.Tpo grub-core/lib/minilzo/$(DEPDIR)/libgrubmods_a-minilzo.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/minilzo/minilzo.c' object='grub-core/lib/minilzo/libgrubmods_a-minilzo.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/minilzo/libgrubmods_a-minilzo.o `test -f 'grub-core/lib/minilzo/minilzo.c' || echo '$(srcdir)/'`grub-core/lib/minilzo/minilzo.c grub-core/lib/minilzo/libgrubmods_a-minilzo.obj: grub-core/lib/minilzo/minilzo.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/minilzo/libgrubmods_a-minilzo.obj -MD -MP -MF grub-core/lib/minilzo/$(DEPDIR)/libgrubmods_a-minilzo.Tpo -c -o grub-core/lib/minilzo/libgrubmods_a-minilzo.obj `if test -f 'grub-core/lib/minilzo/minilzo.c'; then $(CYGPATH_W) 'grub-core/lib/minilzo/minilzo.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/minilzo/minilzo.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/minilzo/$(DEPDIR)/libgrubmods_a-minilzo.Tpo grub-core/lib/minilzo/$(DEPDIR)/libgrubmods_a-minilzo.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/minilzo/minilzo.c' object='grub-core/lib/minilzo/libgrubmods_a-minilzo.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/minilzo/libgrubmods_a-minilzo.obj `if test -f 'grub-core/lib/minilzo/minilzo.c'; then $(CYGPATH_W) 'grub-core/lib/minilzo/minilzo.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/minilzo/minilzo.c'; fi` grub-core/lib/xzembed/libgrubmods_a-xz_dec_bcj.o: grub-core/lib/xzembed/xz_dec_bcj.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/xzembed/libgrubmods_a-xz_dec_bcj.o -MD -MP -MF grub-core/lib/xzembed/$(DEPDIR)/libgrubmods_a-xz_dec_bcj.Tpo -c -o grub-core/lib/xzembed/libgrubmods_a-xz_dec_bcj.o `test -f 'grub-core/lib/xzembed/xz_dec_bcj.c' || echo '$(srcdir)/'`grub-core/lib/xzembed/xz_dec_bcj.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/xzembed/$(DEPDIR)/libgrubmods_a-xz_dec_bcj.Tpo grub-core/lib/xzembed/$(DEPDIR)/libgrubmods_a-xz_dec_bcj.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/xzembed/xz_dec_bcj.c' object='grub-core/lib/xzembed/libgrubmods_a-xz_dec_bcj.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/xzembed/libgrubmods_a-xz_dec_bcj.o `test -f 'grub-core/lib/xzembed/xz_dec_bcj.c' || echo '$(srcdir)/'`grub-core/lib/xzembed/xz_dec_bcj.c grub-core/lib/xzembed/libgrubmods_a-xz_dec_bcj.obj: grub-core/lib/xzembed/xz_dec_bcj.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/xzembed/libgrubmods_a-xz_dec_bcj.obj -MD -MP -MF grub-core/lib/xzembed/$(DEPDIR)/libgrubmods_a-xz_dec_bcj.Tpo -c -o grub-core/lib/xzembed/libgrubmods_a-xz_dec_bcj.obj `if test -f 'grub-core/lib/xzembed/xz_dec_bcj.c'; then $(CYGPATH_W) 'grub-core/lib/xzembed/xz_dec_bcj.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/xzembed/xz_dec_bcj.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/xzembed/$(DEPDIR)/libgrubmods_a-xz_dec_bcj.Tpo grub-core/lib/xzembed/$(DEPDIR)/libgrubmods_a-xz_dec_bcj.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/xzembed/xz_dec_bcj.c' object='grub-core/lib/xzembed/libgrubmods_a-xz_dec_bcj.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/xzembed/libgrubmods_a-xz_dec_bcj.obj `if test -f 'grub-core/lib/xzembed/xz_dec_bcj.c'; then $(CYGPATH_W) 'grub-core/lib/xzembed/xz_dec_bcj.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/xzembed/xz_dec_bcj.c'; fi` grub-core/lib/xzembed/libgrubmods_a-xz_dec_lzma2.o: grub-core/lib/xzembed/xz_dec_lzma2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/xzembed/libgrubmods_a-xz_dec_lzma2.o -MD -MP -MF grub-core/lib/xzembed/$(DEPDIR)/libgrubmods_a-xz_dec_lzma2.Tpo -c -o grub-core/lib/xzembed/libgrubmods_a-xz_dec_lzma2.o `test -f 'grub-core/lib/xzembed/xz_dec_lzma2.c' || echo '$(srcdir)/'`grub-core/lib/xzembed/xz_dec_lzma2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/xzembed/$(DEPDIR)/libgrubmods_a-xz_dec_lzma2.Tpo grub-core/lib/xzembed/$(DEPDIR)/libgrubmods_a-xz_dec_lzma2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/xzembed/xz_dec_lzma2.c' object='grub-core/lib/xzembed/libgrubmods_a-xz_dec_lzma2.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/xzembed/libgrubmods_a-xz_dec_lzma2.o `test -f 'grub-core/lib/xzembed/xz_dec_lzma2.c' || echo '$(srcdir)/'`grub-core/lib/xzembed/xz_dec_lzma2.c grub-core/lib/xzembed/libgrubmods_a-xz_dec_lzma2.obj: grub-core/lib/xzembed/xz_dec_lzma2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/xzembed/libgrubmods_a-xz_dec_lzma2.obj -MD -MP -MF grub-core/lib/xzembed/$(DEPDIR)/libgrubmods_a-xz_dec_lzma2.Tpo -c -o grub-core/lib/xzembed/libgrubmods_a-xz_dec_lzma2.obj `if test -f 'grub-core/lib/xzembed/xz_dec_lzma2.c'; then $(CYGPATH_W) 'grub-core/lib/xzembed/xz_dec_lzma2.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/xzembed/xz_dec_lzma2.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/xzembed/$(DEPDIR)/libgrubmods_a-xz_dec_lzma2.Tpo grub-core/lib/xzembed/$(DEPDIR)/libgrubmods_a-xz_dec_lzma2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/xzembed/xz_dec_lzma2.c' object='grub-core/lib/xzembed/libgrubmods_a-xz_dec_lzma2.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/xzembed/libgrubmods_a-xz_dec_lzma2.obj `if test -f 'grub-core/lib/xzembed/xz_dec_lzma2.c'; then $(CYGPATH_W) 'grub-core/lib/xzembed/xz_dec_lzma2.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/xzembed/xz_dec_lzma2.c'; fi` grub-core/lib/xzembed/libgrubmods_a-xz_dec_stream.o: grub-core/lib/xzembed/xz_dec_stream.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/xzembed/libgrubmods_a-xz_dec_stream.o -MD -MP -MF grub-core/lib/xzembed/$(DEPDIR)/libgrubmods_a-xz_dec_stream.Tpo -c -o grub-core/lib/xzembed/libgrubmods_a-xz_dec_stream.o `test -f 'grub-core/lib/xzembed/xz_dec_stream.c' || echo '$(srcdir)/'`grub-core/lib/xzembed/xz_dec_stream.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/xzembed/$(DEPDIR)/libgrubmods_a-xz_dec_stream.Tpo grub-core/lib/xzembed/$(DEPDIR)/libgrubmods_a-xz_dec_stream.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/xzembed/xz_dec_stream.c' object='grub-core/lib/xzembed/libgrubmods_a-xz_dec_stream.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/xzembed/libgrubmods_a-xz_dec_stream.o `test -f 'grub-core/lib/xzembed/xz_dec_stream.c' || echo '$(srcdir)/'`grub-core/lib/xzembed/xz_dec_stream.c grub-core/lib/xzembed/libgrubmods_a-xz_dec_stream.obj: grub-core/lib/xzembed/xz_dec_stream.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/xzembed/libgrubmods_a-xz_dec_stream.obj -MD -MP -MF grub-core/lib/xzembed/$(DEPDIR)/libgrubmods_a-xz_dec_stream.Tpo -c -o grub-core/lib/xzembed/libgrubmods_a-xz_dec_stream.obj `if test -f 'grub-core/lib/xzembed/xz_dec_stream.c'; then $(CYGPATH_W) 'grub-core/lib/xzembed/xz_dec_stream.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/xzembed/xz_dec_stream.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/xzembed/$(DEPDIR)/libgrubmods_a-xz_dec_stream.Tpo grub-core/lib/xzembed/$(DEPDIR)/libgrubmods_a-xz_dec_stream.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/xzembed/xz_dec_stream.c' object='grub-core/lib/xzembed/libgrubmods_a-xz_dec_stream.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/xzembed/libgrubmods_a-xz_dec_stream.obj `if test -f 'grub-core/lib/xzembed/xz_dec_stream.c'; then $(CYGPATH_W) 'grub-core/lib/xzembed/xz_dec_stream.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/xzembed/xz_dec_stream.c'; fi` grub-core/lib/zstd/libgrubmods_a-debug.o: grub-core/lib/zstd/debug.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/zstd/libgrubmods_a-debug.o -MD -MP -MF grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-debug.Tpo -c -o grub-core/lib/zstd/libgrubmods_a-debug.o `test -f 'grub-core/lib/zstd/debug.c' || echo '$(srcdir)/'`grub-core/lib/zstd/debug.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-debug.Tpo grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-debug.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/zstd/debug.c' object='grub-core/lib/zstd/libgrubmods_a-debug.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/zstd/libgrubmods_a-debug.o `test -f 'grub-core/lib/zstd/debug.c' || echo '$(srcdir)/'`grub-core/lib/zstd/debug.c grub-core/lib/zstd/libgrubmods_a-debug.obj: grub-core/lib/zstd/debug.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/zstd/libgrubmods_a-debug.obj -MD -MP -MF grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-debug.Tpo -c -o grub-core/lib/zstd/libgrubmods_a-debug.obj `if test -f 'grub-core/lib/zstd/debug.c'; then $(CYGPATH_W) 'grub-core/lib/zstd/debug.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/zstd/debug.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-debug.Tpo grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-debug.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/zstd/debug.c' object='grub-core/lib/zstd/libgrubmods_a-debug.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/zstd/libgrubmods_a-debug.obj `if test -f 'grub-core/lib/zstd/debug.c'; then $(CYGPATH_W) 'grub-core/lib/zstd/debug.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/zstd/debug.c'; fi` grub-core/lib/zstd/libgrubmods_a-entropy_common.o: grub-core/lib/zstd/entropy_common.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/zstd/libgrubmods_a-entropy_common.o -MD -MP -MF grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-entropy_common.Tpo -c -o grub-core/lib/zstd/libgrubmods_a-entropy_common.o `test -f 'grub-core/lib/zstd/entropy_common.c' || echo '$(srcdir)/'`grub-core/lib/zstd/entropy_common.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-entropy_common.Tpo grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-entropy_common.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/zstd/entropy_common.c' object='grub-core/lib/zstd/libgrubmods_a-entropy_common.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/zstd/libgrubmods_a-entropy_common.o `test -f 'grub-core/lib/zstd/entropy_common.c' || echo '$(srcdir)/'`grub-core/lib/zstd/entropy_common.c grub-core/lib/zstd/libgrubmods_a-entropy_common.obj: grub-core/lib/zstd/entropy_common.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/zstd/libgrubmods_a-entropy_common.obj -MD -MP -MF grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-entropy_common.Tpo -c -o grub-core/lib/zstd/libgrubmods_a-entropy_common.obj `if test -f 'grub-core/lib/zstd/entropy_common.c'; then $(CYGPATH_W) 'grub-core/lib/zstd/entropy_common.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/zstd/entropy_common.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-entropy_common.Tpo grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-entropy_common.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/zstd/entropy_common.c' object='grub-core/lib/zstd/libgrubmods_a-entropy_common.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/zstd/libgrubmods_a-entropy_common.obj `if test -f 'grub-core/lib/zstd/entropy_common.c'; then $(CYGPATH_W) 'grub-core/lib/zstd/entropy_common.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/zstd/entropy_common.c'; fi` grub-core/lib/zstd/libgrubmods_a-error_private.o: grub-core/lib/zstd/error_private.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/zstd/libgrubmods_a-error_private.o -MD -MP -MF grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-error_private.Tpo -c -o grub-core/lib/zstd/libgrubmods_a-error_private.o `test -f 'grub-core/lib/zstd/error_private.c' || echo '$(srcdir)/'`grub-core/lib/zstd/error_private.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-error_private.Tpo grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-error_private.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/zstd/error_private.c' object='grub-core/lib/zstd/libgrubmods_a-error_private.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/zstd/libgrubmods_a-error_private.o `test -f 'grub-core/lib/zstd/error_private.c' || echo '$(srcdir)/'`grub-core/lib/zstd/error_private.c grub-core/lib/zstd/libgrubmods_a-error_private.obj: grub-core/lib/zstd/error_private.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/zstd/libgrubmods_a-error_private.obj -MD -MP -MF grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-error_private.Tpo -c -o grub-core/lib/zstd/libgrubmods_a-error_private.obj `if test -f 'grub-core/lib/zstd/error_private.c'; then $(CYGPATH_W) 'grub-core/lib/zstd/error_private.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/zstd/error_private.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-error_private.Tpo grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-error_private.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/zstd/error_private.c' object='grub-core/lib/zstd/libgrubmods_a-error_private.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/zstd/libgrubmods_a-error_private.obj `if test -f 'grub-core/lib/zstd/error_private.c'; then $(CYGPATH_W) 'grub-core/lib/zstd/error_private.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/zstd/error_private.c'; fi` grub-core/lib/zstd/libgrubmods_a-fse_decompress.o: grub-core/lib/zstd/fse_decompress.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/zstd/libgrubmods_a-fse_decompress.o -MD -MP -MF grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-fse_decompress.Tpo -c -o grub-core/lib/zstd/libgrubmods_a-fse_decompress.o `test -f 'grub-core/lib/zstd/fse_decompress.c' || echo '$(srcdir)/'`grub-core/lib/zstd/fse_decompress.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-fse_decompress.Tpo grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-fse_decompress.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/zstd/fse_decompress.c' object='grub-core/lib/zstd/libgrubmods_a-fse_decompress.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/zstd/libgrubmods_a-fse_decompress.o `test -f 'grub-core/lib/zstd/fse_decompress.c' || echo '$(srcdir)/'`grub-core/lib/zstd/fse_decompress.c grub-core/lib/zstd/libgrubmods_a-fse_decompress.obj: grub-core/lib/zstd/fse_decompress.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/zstd/libgrubmods_a-fse_decompress.obj -MD -MP -MF grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-fse_decompress.Tpo -c -o grub-core/lib/zstd/libgrubmods_a-fse_decompress.obj `if test -f 'grub-core/lib/zstd/fse_decompress.c'; then $(CYGPATH_W) 'grub-core/lib/zstd/fse_decompress.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/zstd/fse_decompress.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-fse_decompress.Tpo grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-fse_decompress.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/zstd/fse_decompress.c' object='grub-core/lib/zstd/libgrubmods_a-fse_decompress.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/zstd/libgrubmods_a-fse_decompress.obj `if test -f 'grub-core/lib/zstd/fse_decompress.c'; then $(CYGPATH_W) 'grub-core/lib/zstd/fse_decompress.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/zstd/fse_decompress.c'; fi` grub-core/lib/zstd/libgrubmods_a-huf_decompress.o: grub-core/lib/zstd/huf_decompress.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/zstd/libgrubmods_a-huf_decompress.o -MD -MP -MF grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-huf_decompress.Tpo -c -o grub-core/lib/zstd/libgrubmods_a-huf_decompress.o `test -f 'grub-core/lib/zstd/huf_decompress.c' || echo '$(srcdir)/'`grub-core/lib/zstd/huf_decompress.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-huf_decompress.Tpo grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-huf_decompress.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/zstd/huf_decompress.c' object='grub-core/lib/zstd/libgrubmods_a-huf_decompress.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/zstd/libgrubmods_a-huf_decompress.o `test -f 'grub-core/lib/zstd/huf_decompress.c' || echo '$(srcdir)/'`grub-core/lib/zstd/huf_decompress.c grub-core/lib/zstd/libgrubmods_a-huf_decompress.obj: grub-core/lib/zstd/huf_decompress.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/zstd/libgrubmods_a-huf_decompress.obj -MD -MP -MF grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-huf_decompress.Tpo -c -o grub-core/lib/zstd/libgrubmods_a-huf_decompress.obj `if test -f 'grub-core/lib/zstd/huf_decompress.c'; then $(CYGPATH_W) 'grub-core/lib/zstd/huf_decompress.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/zstd/huf_decompress.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-huf_decompress.Tpo grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-huf_decompress.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/zstd/huf_decompress.c' object='grub-core/lib/zstd/libgrubmods_a-huf_decompress.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/zstd/libgrubmods_a-huf_decompress.obj `if test -f 'grub-core/lib/zstd/huf_decompress.c'; then $(CYGPATH_W) 'grub-core/lib/zstd/huf_decompress.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/zstd/huf_decompress.c'; fi` grub-core/lib/zstd/libgrubmods_a-module.o: grub-core/lib/zstd/module.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/zstd/libgrubmods_a-module.o -MD -MP -MF grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-module.Tpo -c -o grub-core/lib/zstd/libgrubmods_a-module.o `test -f 'grub-core/lib/zstd/module.c' || echo '$(srcdir)/'`grub-core/lib/zstd/module.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-module.Tpo grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-module.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/zstd/module.c' object='grub-core/lib/zstd/libgrubmods_a-module.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/zstd/libgrubmods_a-module.o `test -f 'grub-core/lib/zstd/module.c' || echo '$(srcdir)/'`grub-core/lib/zstd/module.c grub-core/lib/zstd/libgrubmods_a-module.obj: grub-core/lib/zstd/module.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/zstd/libgrubmods_a-module.obj -MD -MP -MF grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-module.Tpo -c -o grub-core/lib/zstd/libgrubmods_a-module.obj `if test -f 'grub-core/lib/zstd/module.c'; then $(CYGPATH_W) 'grub-core/lib/zstd/module.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/zstd/module.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-module.Tpo grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-module.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/zstd/module.c' object='grub-core/lib/zstd/libgrubmods_a-module.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/zstd/libgrubmods_a-module.obj `if test -f 'grub-core/lib/zstd/module.c'; then $(CYGPATH_W) 'grub-core/lib/zstd/module.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/zstd/module.c'; fi` grub-core/lib/zstd/libgrubmods_a-xxhash.o: grub-core/lib/zstd/xxhash.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/zstd/libgrubmods_a-xxhash.o -MD -MP -MF grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-xxhash.Tpo -c -o grub-core/lib/zstd/libgrubmods_a-xxhash.o `test -f 'grub-core/lib/zstd/xxhash.c' || echo '$(srcdir)/'`grub-core/lib/zstd/xxhash.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-xxhash.Tpo grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-xxhash.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/zstd/xxhash.c' object='grub-core/lib/zstd/libgrubmods_a-xxhash.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/zstd/libgrubmods_a-xxhash.o `test -f 'grub-core/lib/zstd/xxhash.c' || echo '$(srcdir)/'`grub-core/lib/zstd/xxhash.c grub-core/lib/zstd/libgrubmods_a-xxhash.obj: grub-core/lib/zstd/xxhash.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/zstd/libgrubmods_a-xxhash.obj -MD -MP -MF grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-xxhash.Tpo -c -o grub-core/lib/zstd/libgrubmods_a-xxhash.obj `if test -f 'grub-core/lib/zstd/xxhash.c'; then $(CYGPATH_W) 'grub-core/lib/zstd/xxhash.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/zstd/xxhash.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-xxhash.Tpo grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-xxhash.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/zstd/xxhash.c' object='grub-core/lib/zstd/libgrubmods_a-xxhash.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/zstd/libgrubmods_a-xxhash.obj `if test -f 'grub-core/lib/zstd/xxhash.c'; then $(CYGPATH_W) 'grub-core/lib/zstd/xxhash.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/zstd/xxhash.c'; fi` grub-core/lib/zstd/libgrubmods_a-zstd_common.o: grub-core/lib/zstd/zstd_common.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/zstd/libgrubmods_a-zstd_common.o -MD -MP -MF grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-zstd_common.Tpo -c -o grub-core/lib/zstd/libgrubmods_a-zstd_common.o `test -f 'grub-core/lib/zstd/zstd_common.c' || echo '$(srcdir)/'`grub-core/lib/zstd/zstd_common.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-zstd_common.Tpo grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-zstd_common.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/zstd/zstd_common.c' object='grub-core/lib/zstd/libgrubmods_a-zstd_common.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/zstd/libgrubmods_a-zstd_common.o `test -f 'grub-core/lib/zstd/zstd_common.c' || echo '$(srcdir)/'`grub-core/lib/zstd/zstd_common.c grub-core/lib/zstd/libgrubmods_a-zstd_common.obj: grub-core/lib/zstd/zstd_common.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/zstd/libgrubmods_a-zstd_common.obj -MD -MP -MF grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-zstd_common.Tpo -c -o grub-core/lib/zstd/libgrubmods_a-zstd_common.obj `if test -f 'grub-core/lib/zstd/zstd_common.c'; then $(CYGPATH_W) 'grub-core/lib/zstd/zstd_common.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/zstd/zstd_common.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-zstd_common.Tpo grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-zstd_common.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/zstd/zstd_common.c' object='grub-core/lib/zstd/libgrubmods_a-zstd_common.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/zstd/libgrubmods_a-zstd_common.obj `if test -f 'grub-core/lib/zstd/zstd_common.c'; then $(CYGPATH_W) 'grub-core/lib/zstd/zstd_common.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/zstd/zstd_common.c'; fi` grub-core/lib/zstd/libgrubmods_a-zstd_decompress.o: grub-core/lib/zstd/zstd_decompress.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/zstd/libgrubmods_a-zstd_decompress.o -MD -MP -MF grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-zstd_decompress.Tpo -c -o grub-core/lib/zstd/libgrubmods_a-zstd_decompress.o `test -f 'grub-core/lib/zstd/zstd_decompress.c' || echo '$(srcdir)/'`grub-core/lib/zstd/zstd_decompress.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-zstd_decompress.Tpo grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-zstd_decompress.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/zstd/zstd_decompress.c' object='grub-core/lib/zstd/libgrubmods_a-zstd_decompress.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/zstd/libgrubmods_a-zstd_decompress.o `test -f 'grub-core/lib/zstd/zstd_decompress.c' || echo '$(srcdir)/'`grub-core/lib/zstd/zstd_decompress.c grub-core/lib/zstd/libgrubmods_a-zstd_decompress.obj: grub-core/lib/zstd/zstd_decompress.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/lib/zstd/libgrubmods_a-zstd_decompress.obj -MD -MP -MF grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-zstd_decompress.Tpo -c -o grub-core/lib/zstd/libgrubmods_a-zstd_decompress.obj `if test -f 'grub-core/lib/zstd/zstd_decompress.c'; then $(CYGPATH_W) 'grub-core/lib/zstd/zstd_decompress.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/zstd/zstd_decompress.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-zstd_decompress.Tpo grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-zstd_decompress.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/zstd/zstd_decompress.c' object='grub-core/lib/zstd/libgrubmods_a-zstd_decompress.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/lib/zstd/libgrubmods_a-zstd_decompress.obj `if test -f 'grub-core/lib/zstd/zstd_decompress.c'; then $(CYGPATH_W) 'grub-core/lib/zstd/zstd_decompress.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/zstd/zstd_decompress.c'; fi` grub-core/normal/libgrubmods_a-charset.o: grub-core/normal/charset.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/normal/libgrubmods_a-charset.o -MD -MP -MF grub-core/normal/$(DEPDIR)/libgrubmods_a-charset.Tpo -c -o grub-core/normal/libgrubmods_a-charset.o `test -f 'grub-core/normal/charset.c' || echo '$(srcdir)/'`grub-core/normal/charset.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/normal/$(DEPDIR)/libgrubmods_a-charset.Tpo grub-core/normal/$(DEPDIR)/libgrubmods_a-charset.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/normal/charset.c' object='grub-core/normal/libgrubmods_a-charset.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/normal/libgrubmods_a-charset.o `test -f 'grub-core/normal/charset.c' || echo '$(srcdir)/'`grub-core/normal/charset.c grub-core/normal/libgrubmods_a-charset.obj: grub-core/normal/charset.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/normal/libgrubmods_a-charset.obj -MD -MP -MF grub-core/normal/$(DEPDIR)/libgrubmods_a-charset.Tpo -c -o grub-core/normal/libgrubmods_a-charset.obj `if test -f 'grub-core/normal/charset.c'; then $(CYGPATH_W) 'grub-core/normal/charset.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/normal/charset.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/normal/$(DEPDIR)/libgrubmods_a-charset.Tpo grub-core/normal/$(DEPDIR)/libgrubmods_a-charset.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/normal/charset.c' object='grub-core/normal/libgrubmods_a-charset.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/normal/libgrubmods_a-charset.obj `if test -f 'grub-core/normal/charset.c'; then $(CYGPATH_W) 'grub-core/normal/charset.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/normal/charset.c'; fi` grub-core/normal/libgrubmods_a-misc.o: grub-core/normal/misc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/normal/libgrubmods_a-misc.o -MD -MP -MF grub-core/normal/$(DEPDIR)/libgrubmods_a-misc.Tpo -c -o grub-core/normal/libgrubmods_a-misc.o `test -f 'grub-core/normal/misc.c' || echo '$(srcdir)/'`grub-core/normal/misc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/normal/$(DEPDIR)/libgrubmods_a-misc.Tpo grub-core/normal/$(DEPDIR)/libgrubmods_a-misc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/normal/misc.c' object='grub-core/normal/libgrubmods_a-misc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/normal/libgrubmods_a-misc.o `test -f 'grub-core/normal/misc.c' || echo '$(srcdir)/'`grub-core/normal/misc.c grub-core/normal/libgrubmods_a-misc.obj: grub-core/normal/misc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/normal/libgrubmods_a-misc.obj -MD -MP -MF grub-core/normal/$(DEPDIR)/libgrubmods_a-misc.Tpo -c -o grub-core/normal/libgrubmods_a-misc.obj `if test -f 'grub-core/normal/misc.c'; then $(CYGPATH_W) 'grub-core/normal/misc.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/normal/misc.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/normal/$(DEPDIR)/libgrubmods_a-misc.Tpo grub-core/normal/$(DEPDIR)/libgrubmods_a-misc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/normal/misc.c' object='grub-core/normal/libgrubmods_a-misc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/normal/libgrubmods_a-misc.obj `if test -f 'grub-core/normal/misc.c'; then $(CYGPATH_W) 'grub-core/normal/misc.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/normal/misc.c'; fi` grub-core/partmap/libgrubmods_a-acorn.o: grub-core/partmap/acorn.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/partmap/libgrubmods_a-acorn.o -MD -MP -MF grub-core/partmap/$(DEPDIR)/libgrubmods_a-acorn.Tpo -c -o grub-core/partmap/libgrubmods_a-acorn.o `test -f 'grub-core/partmap/acorn.c' || echo '$(srcdir)/'`grub-core/partmap/acorn.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/partmap/$(DEPDIR)/libgrubmods_a-acorn.Tpo grub-core/partmap/$(DEPDIR)/libgrubmods_a-acorn.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/partmap/acorn.c' object='grub-core/partmap/libgrubmods_a-acorn.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/partmap/libgrubmods_a-acorn.o `test -f 'grub-core/partmap/acorn.c' || echo '$(srcdir)/'`grub-core/partmap/acorn.c grub-core/partmap/libgrubmods_a-acorn.obj: grub-core/partmap/acorn.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/partmap/libgrubmods_a-acorn.obj -MD -MP -MF grub-core/partmap/$(DEPDIR)/libgrubmods_a-acorn.Tpo -c -o grub-core/partmap/libgrubmods_a-acorn.obj `if test -f 'grub-core/partmap/acorn.c'; then $(CYGPATH_W) 'grub-core/partmap/acorn.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/partmap/acorn.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/partmap/$(DEPDIR)/libgrubmods_a-acorn.Tpo grub-core/partmap/$(DEPDIR)/libgrubmods_a-acorn.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/partmap/acorn.c' object='grub-core/partmap/libgrubmods_a-acorn.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/partmap/libgrubmods_a-acorn.obj `if test -f 'grub-core/partmap/acorn.c'; then $(CYGPATH_W) 'grub-core/partmap/acorn.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/partmap/acorn.c'; fi` grub-core/partmap/libgrubmods_a-amiga.o: grub-core/partmap/amiga.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/partmap/libgrubmods_a-amiga.o -MD -MP -MF grub-core/partmap/$(DEPDIR)/libgrubmods_a-amiga.Tpo -c -o grub-core/partmap/libgrubmods_a-amiga.o `test -f 'grub-core/partmap/amiga.c' || echo '$(srcdir)/'`grub-core/partmap/amiga.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/partmap/$(DEPDIR)/libgrubmods_a-amiga.Tpo grub-core/partmap/$(DEPDIR)/libgrubmods_a-amiga.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/partmap/amiga.c' object='grub-core/partmap/libgrubmods_a-amiga.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/partmap/libgrubmods_a-amiga.o `test -f 'grub-core/partmap/amiga.c' || echo '$(srcdir)/'`grub-core/partmap/amiga.c grub-core/partmap/libgrubmods_a-amiga.obj: grub-core/partmap/amiga.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/partmap/libgrubmods_a-amiga.obj -MD -MP -MF grub-core/partmap/$(DEPDIR)/libgrubmods_a-amiga.Tpo -c -o grub-core/partmap/libgrubmods_a-amiga.obj `if test -f 'grub-core/partmap/amiga.c'; then $(CYGPATH_W) 'grub-core/partmap/amiga.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/partmap/amiga.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/partmap/$(DEPDIR)/libgrubmods_a-amiga.Tpo grub-core/partmap/$(DEPDIR)/libgrubmods_a-amiga.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/partmap/amiga.c' object='grub-core/partmap/libgrubmods_a-amiga.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/partmap/libgrubmods_a-amiga.obj `if test -f 'grub-core/partmap/amiga.c'; then $(CYGPATH_W) 'grub-core/partmap/amiga.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/partmap/amiga.c'; fi` grub-core/partmap/libgrubmods_a-apple.o: grub-core/partmap/apple.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/partmap/libgrubmods_a-apple.o -MD -MP -MF grub-core/partmap/$(DEPDIR)/libgrubmods_a-apple.Tpo -c -o grub-core/partmap/libgrubmods_a-apple.o `test -f 'grub-core/partmap/apple.c' || echo '$(srcdir)/'`grub-core/partmap/apple.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/partmap/$(DEPDIR)/libgrubmods_a-apple.Tpo grub-core/partmap/$(DEPDIR)/libgrubmods_a-apple.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/partmap/apple.c' object='grub-core/partmap/libgrubmods_a-apple.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/partmap/libgrubmods_a-apple.o `test -f 'grub-core/partmap/apple.c' || echo '$(srcdir)/'`grub-core/partmap/apple.c grub-core/partmap/libgrubmods_a-apple.obj: grub-core/partmap/apple.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/partmap/libgrubmods_a-apple.obj -MD -MP -MF grub-core/partmap/$(DEPDIR)/libgrubmods_a-apple.Tpo -c -o grub-core/partmap/libgrubmods_a-apple.obj `if test -f 'grub-core/partmap/apple.c'; then $(CYGPATH_W) 'grub-core/partmap/apple.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/partmap/apple.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/partmap/$(DEPDIR)/libgrubmods_a-apple.Tpo grub-core/partmap/$(DEPDIR)/libgrubmods_a-apple.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/partmap/apple.c' object='grub-core/partmap/libgrubmods_a-apple.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/partmap/libgrubmods_a-apple.obj `if test -f 'grub-core/partmap/apple.c'; then $(CYGPATH_W) 'grub-core/partmap/apple.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/partmap/apple.c'; fi` grub-core/partmap/libgrubmods_a-bsdlabel.o: grub-core/partmap/bsdlabel.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/partmap/libgrubmods_a-bsdlabel.o -MD -MP -MF grub-core/partmap/$(DEPDIR)/libgrubmods_a-bsdlabel.Tpo -c -o grub-core/partmap/libgrubmods_a-bsdlabel.o `test -f 'grub-core/partmap/bsdlabel.c' || echo '$(srcdir)/'`grub-core/partmap/bsdlabel.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/partmap/$(DEPDIR)/libgrubmods_a-bsdlabel.Tpo grub-core/partmap/$(DEPDIR)/libgrubmods_a-bsdlabel.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/partmap/bsdlabel.c' object='grub-core/partmap/libgrubmods_a-bsdlabel.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/partmap/libgrubmods_a-bsdlabel.o `test -f 'grub-core/partmap/bsdlabel.c' || echo '$(srcdir)/'`grub-core/partmap/bsdlabel.c grub-core/partmap/libgrubmods_a-bsdlabel.obj: grub-core/partmap/bsdlabel.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/partmap/libgrubmods_a-bsdlabel.obj -MD -MP -MF grub-core/partmap/$(DEPDIR)/libgrubmods_a-bsdlabel.Tpo -c -o grub-core/partmap/libgrubmods_a-bsdlabel.obj `if test -f 'grub-core/partmap/bsdlabel.c'; then $(CYGPATH_W) 'grub-core/partmap/bsdlabel.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/partmap/bsdlabel.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/partmap/$(DEPDIR)/libgrubmods_a-bsdlabel.Tpo grub-core/partmap/$(DEPDIR)/libgrubmods_a-bsdlabel.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/partmap/bsdlabel.c' object='grub-core/partmap/libgrubmods_a-bsdlabel.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/partmap/libgrubmods_a-bsdlabel.obj `if test -f 'grub-core/partmap/bsdlabel.c'; then $(CYGPATH_W) 'grub-core/partmap/bsdlabel.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/partmap/bsdlabel.c'; fi` grub-core/partmap/libgrubmods_a-dfly.o: grub-core/partmap/dfly.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/partmap/libgrubmods_a-dfly.o -MD -MP -MF grub-core/partmap/$(DEPDIR)/libgrubmods_a-dfly.Tpo -c -o grub-core/partmap/libgrubmods_a-dfly.o `test -f 'grub-core/partmap/dfly.c' || echo '$(srcdir)/'`grub-core/partmap/dfly.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/partmap/$(DEPDIR)/libgrubmods_a-dfly.Tpo grub-core/partmap/$(DEPDIR)/libgrubmods_a-dfly.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/partmap/dfly.c' object='grub-core/partmap/libgrubmods_a-dfly.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/partmap/libgrubmods_a-dfly.o `test -f 'grub-core/partmap/dfly.c' || echo '$(srcdir)/'`grub-core/partmap/dfly.c grub-core/partmap/libgrubmods_a-dfly.obj: grub-core/partmap/dfly.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/partmap/libgrubmods_a-dfly.obj -MD -MP -MF grub-core/partmap/$(DEPDIR)/libgrubmods_a-dfly.Tpo -c -o grub-core/partmap/libgrubmods_a-dfly.obj `if test -f 'grub-core/partmap/dfly.c'; then $(CYGPATH_W) 'grub-core/partmap/dfly.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/partmap/dfly.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/partmap/$(DEPDIR)/libgrubmods_a-dfly.Tpo grub-core/partmap/$(DEPDIR)/libgrubmods_a-dfly.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/partmap/dfly.c' object='grub-core/partmap/libgrubmods_a-dfly.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/partmap/libgrubmods_a-dfly.obj `if test -f 'grub-core/partmap/dfly.c'; then $(CYGPATH_W) 'grub-core/partmap/dfly.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/partmap/dfly.c'; fi` grub-core/partmap/libgrubmods_a-dvh.o: grub-core/partmap/dvh.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/partmap/libgrubmods_a-dvh.o -MD -MP -MF grub-core/partmap/$(DEPDIR)/libgrubmods_a-dvh.Tpo -c -o grub-core/partmap/libgrubmods_a-dvh.o `test -f 'grub-core/partmap/dvh.c' || echo '$(srcdir)/'`grub-core/partmap/dvh.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/partmap/$(DEPDIR)/libgrubmods_a-dvh.Tpo grub-core/partmap/$(DEPDIR)/libgrubmods_a-dvh.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/partmap/dvh.c' object='grub-core/partmap/libgrubmods_a-dvh.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/partmap/libgrubmods_a-dvh.o `test -f 'grub-core/partmap/dvh.c' || echo '$(srcdir)/'`grub-core/partmap/dvh.c grub-core/partmap/libgrubmods_a-dvh.obj: grub-core/partmap/dvh.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/partmap/libgrubmods_a-dvh.obj -MD -MP -MF grub-core/partmap/$(DEPDIR)/libgrubmods_a-dvh.Tpo -c -o grub-core/partmap/libgrubmods_a-dvh.obj `if test -f 'grub-core/partmap/dvh.c'; then $(CYGPATH_W) 'grub-core/partmap/dvh.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/partmap/dvh.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/partmap/$(DEPDIR)/libgrubmods_a-dvh.Tpo grub-core/partmap/$(DEPDIR)/libgrubmods_a-dvh.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/partmap/dvh.c' object='grub-core/partmap/libgrubmods_a-dvh.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/partmap/libgrubmods_a-dvh.obj `if test -f 'grub-core/partmap/dvh.c'; then $(CYGPATH_W) 'grub-core/partmap/dvh.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/partmap/dvh.c'; fi` grub-core/partmap/libgrubmods_a-plan.o: grub-core/partmap/plan.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/partmap/libgrubmods_a-plan.o -MD -MP -MF grub-core/partmap/$(DEPDIR)/libgrubmods_a-plan.Tpo -c -o grub-core/partmap/libgrubmods_a-plan.o `test -f 'grub-core/partmap/plan.c' || echo '$(srcdir)/'`grub-core/partmap/plan.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/partmap/$(DEPDIR)/libgrubmods_a-plan.Tpo grub-core/partmap/$(DEPDIR)/libgrubmods_a-plan.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/partmap/plan.c' object='grub-core/partmap/libgrubmods_a-plan.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/partmap/libgrubmods_a-plan.o `test -f 'grub-core/partmap/plan.c' || echo '$(srcdir)/'`grub-core/partmap/plan.c grub-core/partmap/libgrubmods_a-plan.obj: grub-core/partmap/plan.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/partmap/libgrubmods_a-plan.obj -MD -MP -MF grub-core/partmap/$(DEPDIR)/libgrubmods_a-plan.Tpo -c -o grub-core/partmap/libgrubmods_a-plan.obj `if test -f 'grub-core/partmap/plan.c'; then $(CYGPATH_W) 'grub-core/partmap/plan.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/partmap/plan.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/partmap/$(DEPDIR)/libgrubmods_a-plan.Tpo grub-core/partmap/$(DEPDIR)/libgrubmods_a-plan.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/partmap/plan.c' object='grub-core/partmap/libgrubmods_a-plan.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/partmap/libgrubmods_a-plan.obj `if test -f 'grub-core/partmap/plan.c'; then $(CYGPATH_W) 'grub-core/partmap/plan.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/partmap/plan.c'; fi` grub-core/partmap/libgrubmods_a-sun.o: grub-core/partmap/sun.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/partmap/libgrubmods_a-sun.o -MD -MP -MF grub-core/partmap/$(DEPDIR)/libgrubmods_a-sun.Tpo -c -o grub-core/partmap/libgrubmods_a-sun.o `test -f 'grub-core/partmap/sun.c' || echo '$(srcdir)/'`grub-core/partmap/sun.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/partmap/$(DEPDIR)/libgrubmods_a-sun.Tpo grub-core/partmap/$(DEPDIR)/libgrubmods_a-sun.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/partmap/sun.c' object='grub-core/partmap/libgrubmods_a-sun.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/partmap/libgrubmods_a-sun.o `test -f 'grub-core/partmap/sun.c' || echo '$(srcdir)/'`grub-core/partmap/sun.c grub-core/partmap/libgrubmods_a-sun.obj: grub-core/partmap/sun.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/partmap/libgrubmods_a-sun.obj -MD -MP -MF grub-core/partmap/$(DEPDIR)/libgrubmods_a-sun.Tpo -c -o grub-core/partmap/libgrubmods_a-sun.obj `if test -f 'grub-core/partmap/sun.c'; then $(CYGPATH_W) 'grub-core/partmap/sun.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/partmap/sun.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/partmap/$(DEPDIR)/libgrubmods_a-sun.Tpo grub-core/partmap/$(DEPDIR)/libgrubmods_a-sun.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/partmap/sun.c' object='grub-core/partmap/libgrubmods_a-sun.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/partmap/libgrubmods_a-sun.obj `if test -f 'grub-core/partmap/sun.c'; then $(CYGPATH_W) 'grub-core/partmap/sun.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/partmap/sun.c'; fi` grub-core/partmap/libgrubmods_a-sunpc.o: grub-core/partmap/sunpc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/partmap/libgrubmods_a-sunpc.o -MD -MP -MF grub-core/partmap/$(DEPDIR)/libgrubmods_a-sunpc.Tpo -c -o grub-core/partmap/libgrubmods_a-sunpc.o `test -f 'grub-core/partmap/sunpc.c' || echo '$(srcdir)/'`grub-core/partmap/sunpc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/partmap/$(DEPDIR)/libgrubmods_a-sunpc.Tpo grub-core/partmap/$(DEPDIR)/libgrubmods_a-sunpc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/partmap/sunpc.c' object='grub-core/partmap/libgrubmods_a-sunpc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/partmap/libgrubmods_a-sunpc.o `test -f 'grub-core/partmap/sunpc.c' || echo '$(srcdir)/'`grub-core/partmap/sunpc.c grub-core/partmap/libgrubmods_a-sunpc.obj: grub-core/partmap/sunpc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/partmap/libgrubmods_a-sunpc.obj -MD -MP -MF grub-core/partmap/$(DEPDIR)/libgrubmods_a-sunpc.Tpo -c -o grub-core/partmap/libgrubmods_a-sunpc.obj `if test -f 'grub-core/partmap/sunpc.c'; then $(CYGPATH_W) 'grub-core/partmap/sunpc.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/partmap/sunpc.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/partmap/$(DEPDIR)/libgrubmods_a-sunpc.Tpo grub-core/partmap/$(DEPDIR)/libgrubmods_a-sunpc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/partmap/sunpc.c' object='grub-core/partmap/libgrubmods_a-sunpc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/partmap/libgrubmods_a-sunpc.obj `if test -f 'grub-core/partmap/sunpc.c'; then $(CYGPATH_W) 'grub-core/partmap/sunpc.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/partmap/sunpc.c'; fi` grub-core/script/libgrubmods_a-argv.o: grub-core/script/argv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/script/libgrubmods_a-argv.o -MD -MP -MF grub-core/script/$(DEPDIR)/libgrubmods_a-argv.Tpo -c -o grub-core/script/libgrubmods_a-argv.o `test -f 'grub-core/script/argv.c' || echo '$(srcdir)/'`grub-core/script/argv.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/script/$(DEPDIR)/libgrubmods_a-argv.Tpo grub-core/script/$(DEPDIR)/libgrubmods_a-argv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/script/argv.c' object='grub-core/script/libgrubmods_a-argv.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/script/libgrubmods_a-argv.o `test -f 'grub-core/script/argv.c' || echo '$(srcdir)/'`grub-core/script/argv.c grub-core/script/libgrubmods_a-argv.obj: grub-core/script/argv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/script/libgrubmods_a-argv.obj -MD -MP -MF grub-core/script/$(DEPDIR)/libgrubmods_a-argv.Tpo -c -o grub-core/script/libgrubmods_a-argv.obj `if test -f 'grub-core/script/argv.c'; then $(CYGPATH_W) 'grub-core/script/argv.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/script/argv.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/script/$(DEPDIR)/libgrubmods_a-argv.Tpo grub-core/script/$(DEPDIR)/libgrubmods_a-argv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/script/argv.c' object='grub-core/script/libgrubmods_a-argv.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/script/libgrubmods_a-argv.obj `if test -f 'grub-core/script/argv.c'; then $(CYGPATH_W) 'grub-core/script/argv.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/script/argv.c'; fi` grub-core/script/libgrubmods_a-function.o: grub-core/script/function.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/script/libgrubmods_a-function.o -MD -MP -MF grub-core/script/$(DEPDIR)/libgrubmods_a-function.Tpo -c -o grub-core/script/libgrubmods_a-function.o `test -f 'grub-core/script/function.c' || echo '$(srcdir)/'`grub-core/script/function.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/script/$(DEPDIR)/libgrubmods_a-function.Tpo grub-core/script/$(DEPDIR)/libgrubmods_a-function.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/script/function.c' object='grub-core/script/libgrubmods_a-function.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/script/libgrubmods_a-function.o `test -f 'grub-core/script/function.c' || echo '$(srcdir)/'`grub-core/script/function.c grub-core/script/libgrubmods_a-function.obj: grub-core/script/function.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/script/libgrubmods_a-function.obj -MD -MP -MF grub-core/script/$(DEPDIR)/libgrubmods_a-function.Tpo -c -o grub-core/script/libgrubmods_a-function.obj `if test -f 'grub-core/script/function.c'; then $(CYGPATH_W) 'grub-core/script/function.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/script/function.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/script/$(DEPDIR)/libgrubmods_a-function.Tpo grub-core/script/$(DEPDIR)/libgrubmods_a-function.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/script/function.c' object='grub-core/script/libgrubmods_a-function.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/script/libgrubmods_a-function.obj `if test -f 'grub-core/script/function.c'; then $(CYGPATH_W) 'grub-core/script/function.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/script/function.c'; fi` grub-core/script/libgrubmods_a-lexer.o: grub-core/script/lexer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/script/libgrubmods_a-lexer.o -MD -MP -MF grub-core/script/$(DEPDIR)/libgrubmods_a-lexer.Tpo -c -o grub-core/script/libgrubmods_a-lexer.o `test -f 'grub-core/script/lexer.c' || echo '$(srcdir)/'`grub-core/script/lexer.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/script/$(DEPDIR)/libgrubmods_a-lexer.Tpo grub-core/script/$(DEPDIR)/libgrubmods_a-lexer.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/script/lexer.c' object='grub-core/script/libgrubmods_a-lexer.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/script/libgrubmods_a-lexer.o `test -f 'grub-core/script/lexer.c' || echo '$(srcdir)/'`grub-core/script/lexer.c grub-core/script/libgrubmods_a-lexer.obj: grub-core/script/lexer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/script/libgrubmods_a-lexer.obj -MD -MP -MF grub-core/script/$(DEPDIR)/libgrubmods_a-lexer.Tpo -c -o grub-core/script/libgrubmods_a-lexer.obj `if test -f 'grub-core/script/lexer.c'; then $(CYGPATH_W) 'grub-core/script/lexer.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/script/lexer.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/script/$(DEPDIR)/libgrubmods_a-lexer.Tpo grub-core/script/$(DEPDIR)/libgrubmods_a-lexer.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/script/lexer.c' object='grub-core/script/libgrubmods_a-lexer.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/script/libgrubmods_a-lexer.obj `if test -f 'grub-core/script/lexer.c'; then $(CYGPATH_W) 'grub-core/script/lexer.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/script/lexer.c'; fi` grub-core/script/libgrubmods_a-main.o: grub-core/script/main.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/script/libgrubmods_a-main.o -MD -MP -MF grub-core/script/$(DEPDIR)/libgrubmods_a-main.Tpo -c -o grub-core/script/libgrubmods_a-main.o `test -f 'grub-core/script/main.c' || echo '$(srcdir)/'`grub-core/script/main.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/script/$(DEPDIR)/libgrubmods_a-main.Tpo grub-core/script/$(DEPDIR)/libgrubmods_a-main.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/script/main.c' object='grub-core/script/libgrubmods_a-main.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/script/libgrubmods_a-main.o `test -f 'grub-core/script/main.c' || echo '$(srcdir)/'`grub-core/script/main.c grub-core/script/libgrubmods_a-main.obj: grub-core/script/main.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/script/libgrubmods_a-main.obj -MD -MP -MF grub-core/script/$(DEPDIR)/libgrubmods_a-main.Tpo -c -o grub-core/script/libgrubmods_a-main.obj `if test -f 'grub-core/script/main.c'; then $(CYGPATH_W) 'grub-core/script/main.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/script/main.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/script/$(DEPDIR)/libgrubmods_a-main.Tpo grub-core/script/$(DEPDIR)/libgrubmods_a-main.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/script/main.c' object='grub-core/script/libgrubmods_a-main.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/script/libgrubmods_a-main.obj `if test -f 'grub-core/script/main.c'; then $(CYGPATH_W) 'grub-core/script/main.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/script/main.c'; fi` grub-core/script/libgrubmods_a-script.o: grub-core/script/script.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/script/libgrubmods_a-script.o -MD -MP -MF grub-core/script/$(DEPDIR)/libgrubmods_a-script.Tpo -c -o grub-core/script/libgrubmods_a-script.o `test -f 'grub-core/script/script.c' || echo '$(srcdir)/'`grub-core/script/script.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/script/$(DEPDIR)/libgrubmods_a-script.Tpo grub-core/script/$(DEPDIR)/libgrubmods_a-script.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/script/script.c' object='grub-core/script/libgrubmods_a-script.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/script/libgrubmods_a-script.o `test -f 'grub-core/script/script.c' || echo '$(srcdir)/'`grub-core/script/script.c grub-core/script/libgrubmods_a-script.obj: grub-core/script/script.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/script/libgrubmods_a-script.obj -MD -MP -MF grub-core/script/$(DEPDIR)/libgrubmods_a-script.Tpo -c -o grub-core/script/libgrubmods_a-script.obj `if test -f 'grub-core/script/script.c'; then $(CYGPATH_W) 'grub-core/script/script.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/script/script.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/script/$(DEPDIR)/libgrubmods_a-script.Tpo grub-core/script/$(DEPDIR)/libgrubmods_a-script.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/script/script.c' object='grub-core/script/libgrubmods_a-script.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/script/libgrubmods_a-script.obj `if test -f 'grub-core/script/script.c'; then $(CYGPATH_W) 'grub-core/script/script.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/script/script.c'; fi` grub-core/libgrubmods_a-unidata.o: grub-core/unidata.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/libgrubmods_a-unidata.o -MD -MP -MF grub-core/$(DEPDIR)/libgrubmods_a-unidata.Tpo -c -o grub-core/libgrubmods_a-unidata.o `test -f 'grub-core/unidata.c' || echo '$(srcdir)/'`grub-core/unidata.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/$(DEPDIR)/libgrubmods_a-unidata.Tpo grub-core/$(DEPDIR)/libgrubmods_a-unidata.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/unidata.c' object='grub-core/libgrubmods_a-unidata.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/libgrubmods_a-unidata.o `test -f 'grub-core/unidata.c' || echo '$(srcdir)/'`grub-core/unidata.c grub-core/libgrubmods_a-unidata.obj: grub-core/unidata.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/libgrubmods_a-unidata.obj -MD -MP -MF grub-core/$(DEPDIR)/libgrubmods_a-unidata.Tpo -c -o grub-core/libgrubmods_a-unidata.obj `if test -f 'grub-core/unidata.c'; then $(CYGPATH_W) 'grub-core/unidata.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/unidata.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/$(DEPDIR)/libgrubmods_a-unidata.Tpo grub-core/$(DEPDIR)/libgrubmods_a-unidata.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/unidata.c' object='grub-core/libgrubmods_a-unidata.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/libgrubmods_a-unidata.obj `if test -f 'grub-core/unidata.c'; then $(CYGPATH_W) 'grub-core/unidata.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/unidata.c'; fi` grub-core/video/libgrubmods_a-capture.o: grub-core/video/capture.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/video/libgrubmods_a-capture.o -MD -MP -MF grub-core/video/$(DEPDIR)/libgrubmods_a-capture.Tpo -c -o grub-core/video/libgrubmods_a-capture.o `test -f 'grub-core/video/capture.c' || echo '$(srcdir)/'`grub-core/video/capture.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/video/$(DEPDIR)/libgrubmods_a-capture.Tpo grub-core/video/$(DEPDIR)/libgrubmods_a-capture.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/video/capture.c' object='grub-core/video/libgrubmods_a-capture.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/video/libgrubmods_a-capture.o `test -f 'grub-core/video/capture.c' || echo '$(srcdir)/'`grub-core/video/capture.c grub-core/video/libgrubmods_a-capture.obj: grub-core/video/capture.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/video/libgrubmods_a-capture.obj -MD -MP -MF grub-core/video/$(DEPDIR)/libgrubmods_a-capture.Tpo -c -o grub-core/video/libgrubmods_a-capture.obj `if test -f 'grub-core/video/capture.c'; then $(CYGPATH_W) 'grub-core/video/capture.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/video/capture.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/video/$(DEPDIR)/libgrubmods_a-capture.Tpo grub-core/video/$(DEPDIR)/libgrubmods_a-capture.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/video/capture.c' object='grub-core/video/libgrubmods_a-capture.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/video/libgrubmods_a-capture.obj `if test -f 'grub-core/video/capture.c'; then $(CYGPATH_W) 'grub-core/video/capture.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/video/capture.c'; fi` grub-core/video/libgrubmods_a-colors.o: grub-core/video/colors.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/video/libgrubmods_a-colors.o -MD -MP -MF grub-core/video/$(DEPDIR)/libgrubmods_a-colors.Tpo -c -o grub-core/video/libgrubmods_a-colors.o `test -f 'grub-core/video/colors.c' || echo '$(srcdir)/'`grub-core/video/colors.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/video/$(DEPDIR)/libgrubmods_a-colors.Tpo grub-core/video/$(DEPDIR)/libgrubmods_a-colors.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/video/colors.c' object='grub-core/video/libgrubmods_a-colors.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/video/libgrubmods_a-colors.o `test -f 'grub-core/video/colors.c' || echo '$(srcdir)/'`grub-core/video/colors.c grub-core/video/libgrubmods_a-colors.obj: grub-core/video/colors.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/video/libgrubmods_a-colors.obj -MD -MP -MF grub-core/video/$(DEPDIR)/libgrubmods_a-colors.Tpo -c -o grub-core/video/libgrubmods_a-colors.obj `if test -f 'grub-core/video/colors.c'; then $(CYGPATH_W) 'grub-core/video/colors.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/video/colors.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/video/$(DEPDIR)/libgrubmods_a-colors.Tpo grub-core/video/$(DEPDIR)/libgrubmods_a-colors.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/video/colors.c' object='grub-core/video/libgrubmods_a-colors.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/video/libgrubmods_a-colors.obj `if test -f 'grub-core/video/colors.c'; then $(CYGPATH_W) 'grub-core/video/colors.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/video/colors.c'; fi` grub-core/video/fb/libgrubmods_a-fbblit.o: grub-core/video/fb/fbblit.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/video/fb/libgrubmods_a-fbblit.o -MD -MP -MF grub-core/video/fb/$(DEPDIR)/libgrubmods_a-fbblit.Tpo -c -o grub-core/video/fb/libgrubmods_a-fbblit.o `test -f 'grub-core/video/fb/fbblit.c' || echo '$(srcdir)/'`grub-core/video/fb/fbblit.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/video/fb/$(DEPDIR)/libgrubmods_a-fbblit.Tpo grub-core/video/fb/$(DEPDIR)/libgrubmods_a-fbblit.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/video/fb/fbblit.c' object='grub-core/video/fb/libgrubmods_a-fbblit.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/video/fb/libgrubmods_a-fbblit.o `test -f 'grub-core/video/fb/fbblit.c' || echo '$(srcdir)/'`grub-core/video/fb/fbblit.c grub-core/video/fb/libgrubmods_a-fbblit.obj: grub-core/video/fb/fbblit.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/video/fb/libgrubmods_a-fbblit.obj -MD -MP -MF grub-core/video/fb/$(DEPDIR)/libgrubmods_a-fbblit.Tpo -c -o grub-core/video/fb/libgrubmods_a-fbblit.obj `if test -f 'grub-core/video/fb/fbblit.c'; then $(CYGPATH_W) 'grub-core/video/fb/fbblit.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/video/fb/fbblit.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/video/fb/$(DEPDIR)/libgrubmods_a-fbblit.Tpo grub-core/video/fb/$(DEPDIR)/libgrubmods_a-fbblit.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/video/fb/fbblit.c' object='grub-core/video/fb/libgrubmods_a-fbblit.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/video/fb/libgrubmods_a-fbblit.obj `if test -f 'grub-core/video/fb/fbblit.c'; then $(CYGPATH_W) 'grub-core/video/fb/fbblit.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/video/fb/fbblit.c'; fi` grub-core/video/fb/libgrubmods_a-fbfill.o: grub-core/video/fb/fbfill.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/video/fb/libgrubmods_a-fbfill.o -MD -MP -MF grub-core/video/fb/$(DEPDIR)/libgrubmods_a-fbfill.Tpo -c -o grub-core/video/fb/libgrubmods_a-fbfill.o `test -f 'grub-core/video/fb/fbfill.c' || echo '$(srcdir)/'`grub-core/video/fb/fbfill.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/video/fb/$(DEPDIR)/libgrubmods_a-fbfill.Tpo grub-core/video/fb/$(DEPDIR)/libgrubmods_a-fbfill.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/video/fb/fbfill.c' object='grub-core/video/fb/libgrubmods_a-fbfill.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/video/fb/libgrubmods_a-fbfill.o `test -f 'grub-core/video/fb/fbfill.c' || echo '$(srcdir)/'`grub-core/video/fb/fbfill.c grub-core/video/fb/libgrubmods_a-fbfill.obj: grub-core/video/fb/fbfill.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/video/fb/libgrubmods_a-fbfill.obj -MD -MP -MF grub-core/video/fb/$(DEPDIR)/libgrubmods_a-fbfill.Tpo -c -o grub-core/video/fb/libgrubmods_a-fbfill.obj `if test -f 'grub-core/video/fb/fbfill.c'; then $(CYGPATH_W) 'grub-core/video/fb/fbfill.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/video/fb/fbfill.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/video/fb/$(DEPDIR)/libgrubmods_a-fbfill.Tpo grub-core/video/fb/$(DEPDIR)/libgrubmods_a-fbfill.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/video/fb/fbfill.c' object='grub-core/video/fb/libgrubmods_a-fbfill.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/video/fb/libgrubmods_a-fbfill.obj `if test -f 'grub-core/video/fb/fbfill.c'; then $(CYGPATH_W) 'grub-core/video/fb/fbfill.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/video/fb/fbfill.c'; fi` grub-core/video/fb/libgrubmods_a-fbutil.o: grub-core/video/fb/fbutil.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/video/fb/libgrubmods_a-fbutil.o -MD -MP -MF grub-core/video/fb/$(DEPDIR)/libgrubmods_a-fbutil.Tpo -c -o grub-core/video/fb/libgrubmods_a-fbutil.o `test -f 'grub-core/video/fb/fbutil.c' || echo '$(srcdir)/'`grub-core/video/fb/fbutil.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/video/fb/$(DEPDIR)/libgrubmods_a-fbutil.Tpo grub-core/video/fb/$(DEPDIR)/libgrubmods_a-fbutil.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/video/fb/fbutil.c' object='grub-core/video/fb/libgrubmods_a-fbutil.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/video/fb/libgrubmods_a-fbutil.o `test -f 'grub-core/video/fb/fbutil.c' || echo '$(srcdir)/'`grub-core/video/fb/fbutil.c grub-core/video/fb/libgrubmods_a-fbutil.obj: grub-core/video/fb/fbutil.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/video/fb/libgrubmods_a-fbutil.obj -MD -MP -MF grub-core/video/fb/$(DEPDIR)/libgrubmods_a-fbutil.Tpo -c -o grub-core/video/fb/libgrubmods_a-fbutil.obj `if test -f 'grub-core/video/fb/fbutil.c'; then $(CYGPATH_W) 'grub-core/video/fb/fbutil.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/video/fb/fbutil.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/video/fb/$(DEPDIR)/libgrubmods_a-fbutil.Tpo grub-core/video/fb/$(DEPDIR)/libgrubmods_a-fbutil.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/video/fb/fbutil.c' object='grub-core/video/fb/libgrubmods_a-fbutil.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/video/fb/libgrubmods_a-fbutil.obj `if test -f 'grub-core/video/fb/fbutil.c'; then $(CYGPATH_W) 'grub-core/video/fb/fbutil.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/video/fb/fbutil.c'; fi` grub-core/video/fb/libgrubmods_a-video_fb.o: grub-core/video/fb/video_fb.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/video/fb/libgrubmods_a-video_fb.o -MD -MP -MF grub-core/video/fb/$(DEPDIR)/libgrubmods_a-video_fb.Tpo -c -o grub-core/video/fb/libgrubmods_a-video_fb.o `test -f 'grub-core/video/fb/video_fb.c' || echo '$(srcdir)/'`grub-core/video/fb/video_fb.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/video/fb/$(DEPDIR)/libgrubmods_a-video_fb.Tpo grub-core/video/fb/$(DEPDIR)/libgrubmods_a-video_fb.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/video/fb/video_fb.c' object='grub-core/video/fb/libgrubmods_a-video_fb.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/video/fb/libgrubmods_a-video_fb.o `test -f 'grub-core/video/fb/video_fb.c' || echo '$(srcdir)/'`grub-core/video/fb/video_fb.c grub-core/video/fb/libgrubmods_a-video_fb.obj: grub-core/video/fb/video_fb.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/video/fb/libgrubmods_a-video_fb.obj -MD -MP -MF grub-core/video/fb/$(DEPDIR)/libgrubmods_a-video_fb.Tpo -c -o grub-core/video/fb/libgrubmods_a-video_fb.obj `if test -f 'grub-core/video/fb/video_fb.c'; then $(CYGPATH_W) 'grub-core/video/fb/video_fb.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/video/fb/video_fb.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/video/fb/$(DEPDIR)/libgrubmods_a-video_fb.Tpo grub-core/video/fb/$(DEPDIR)/libgrubmods_a-video_fb.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/video/fb/video_fb.c' object='grub-core/video/fb/libgrubmods_a-video_fb.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/video/fb/libgrubmods_a-video_fb.obj `if test -f 'grub-core/video/fb/video_fb.c'; then $(CYGPATH_W) 'grub-core/video/fb/video_fb.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/video/fb/video_fb.c'; fi` grub-core/video/libgrubmods_a-video.o: grub-core/video/video.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/video/libgrubmods_a-video.o -MD -MP -MF grub-core/video/$(DEPDIR)/libgrubmods_a-video.Tpo -c -o grub-core/video/libgrubmods_a-video.o `test -f 'grub-core/video/video.c' || echo '$(srcdir)/'`grub-core/video/video.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/video/$(DEPDIR)/libgrubmods_a-video.Tpo grub-core/video/$(DEPDIR)/libgrubmods_a-video.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/video/video.c' object='grub-core/video/libgrubmods_a-video.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/video/libgrubmods_a-video.o `test -f 'grub-core/video/video.c' || echo '$(srcdir)/'`grub-core/video/video.c grub-core/video/libgrubmods_a-video.obj: grub-core/video/video.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT grub-core/video/libgrubmods_a-video.obj -MD -MP -MF grub-core/video/$(DEPDIR)/libgrubmods_a-video.Tpo -c -o grub-core/video/libgrubmods_a-video.obj `if test -f 'grub-core/video/video.c'; then $(CYGPATH_W) 'grub-core/video/video.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/video/video.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/video/$(DEPDIR)/libgrubmods_a-video.Tpo grub-core/video/$(DEPDIR)/libgrubmods_a-video.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/video/video.c' object='grub-core/video/libgrubmods_a-video.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o grub-core/video/libgrubmods_a-video.obj `if test -f 'grub-core/video/video.c'; then $(CYGPATH_W) 'grub-core/video/video.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/video/video.c'; fi` libgrubmods_a-grub_script.tab.o: grub_script.tab.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT libgrubmods_a-grub_script.tab.o -MD -MP -MF $(DEPDIR)/libgrubmods_a-grub_script.tab.Tpo -c -o libgrubmods_a-grub_script.tab.o `test -f 'grub_script.tab.c' || echo '$(srcdir)/'`grub_script.tab.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgrubmods_a-grub_script.tab.Tpo $(DEPDIR)/libgrubmods_a-grub_script.tab.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub_script.tab.c' object='libgrubmods_a-grub_script.tab.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o libgrubmods_a-grub_script.tab.o `test -f 'grub_script.tab.c' || echo '$(srcdir)/'`grub_script.tab.c libgrubmods_a-grub_script.tab.obj: grub_script.tab.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT libgrubmods_a-grub_script.tab.obj -MD -MP -MF $(DEPDIR)/libgrubmods_a-grub_script.tab.Tpo -c -o libgrubmods_a-grub_script.tab.obj `if test -f 'grub_script.tab.c'; then $(CYGPATH_W) 'grub_script.tab.c'; else $(CYGPATH_W) '$(srcdir)/grub_script.tab.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgrubmods_a-grub_script.tab.Tpo $(DEPDIR)/libgrubmods_a-grub_script.tab.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub_script.tab.c' object='libgrubmods_a-grub_script.tab.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o libgrubmods_a-grub_script.tab.obj `if test -f 'grub_script.tab.c'; then $(CYGPATH_W) 'grub_script.tab.c'; else $(CYGPATH_W) '$(srcdir)/grub_script.tab.c'; fi` libgrubmods_a-grub_script.yy.o: grub_script.yy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT libgrubmods_a-grub_script.yy.o -MD -MP -MF $(DEPDIR)/libgrubmods_a-grub_script.yy.Tpo -c -o libgrubmods_a-grub_script.yy.o `test -f 'grub_script.yy.c' || echo '$(srcdir)/'`grub_script.yy.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgrubmods_a-grub_script.yy.Tpo $(DEPDIR)/libgrubmods_a-grub_script.yy.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub_script.yy.c' object='libgrubmods_a-grub_script.yy.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o libgrubmods_a-grub_script.yy.o `test -f 'grub_script.yy.c' || echo '$(srcdir)/'`grub_script.yy.c libgrubmods_a-grub_script.yy.obj: grub_script.yy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT libgrubmods_a-grub_script.yy.obj -MD -MP -MF $(DEPDIR)/libgrubmods_a-grub_script.yy.Tpo -c -o libgrubmods_a-grub_script.yy.obj `if test -f 'grub_script.yy.c'; then $(CYGPATH_W) 'grub_script.yy.c'; else $(CYGPATH_W) '$(srcdir)/grub_script.yy.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgrubmods_a-grub_script.yy.Tpo $(DEPDIR)/libgrubmods_a-grub_script.yy.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub_script.yy.c' object='libgrubmods_a-grub_script.yy.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o libgrubmods_a-grub_script.yy.obj `if test -f 'grub_script.yy.c'; then $(CYGPATH_W) 'grub_script.yy.c'; else $(CYGPATH_W) '$(srcdir)/grub_script.yy.c'; fi` libgrubmods_a-libgrub_a_init.o: libgrub_a_init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT libgrubmods_a-libgrub_a_init.o -MD -MP -MF $(DEPDIR)/libgrubmods_a-libgrub_a_init.Tpo -c -o libgrubmods_a-libgrub_a_init.o `test -f 'libgrub_a_init.c' || echo '$(srcdir)/'`libgrub_a_init.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgrubmods_a-libgrub_a_init.Tpo $(DEPDIR)/libgrubmods_a-libgrub_a_init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libgrub_a_init.c' object='libgrubmods_a-libgrub_a_init.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o libgrubmods_a-libgrub_a_init.o `test -f 'libgrub_a_init.c' || echo '$(srcdir)/'`libgrub_a_init.c libgrubmods_a-libgrub_a_init.obj: libgrub_a_init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -MT libgrubmods_a-libgrub_a_init.obj -MD -MP -MF $(DEPDIR)/libgrubmods_a-libgrub_a_init.Tpo -c -o libgrubmods_a-libgrub_a_init.obj `if test -f 'libgrub_a_init.c'; then $(CYGPATH_W) 'libgrub_a_init.c'; else $(CYGPATH_W) '$(srcdir)/libgrub_a_init.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgrubmods_a-libgrub_a_init.Tpo $(DEPDIR)/libgrubmods_a-libgrub_a_init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libgrub_a_init.c' object='libgrubmods_a-libgrub_a_init.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(CPPFLAGS) $(libgrubmods_a_CFLAGS) $(CFLAGS) -c -o libgrubmods_a-libgrub_a_init.obj `if test -f 'libgrub_a_init.c'; then $(CYGPATH_W) 'libgrub_a_init.c'; else $(CYGPATH_W) '$(srcdir)/libgrub_a_init.c'; fi` grub-core/kern/cmp_test-list.o: grub-core/kern/list.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cmp_test_CPPFLAGS) $(CPPFLAGS) $(cmp_test_CFLAGS) $(CFLAGS) -MT grub-core/kern/cmp_test-list.o -MD -MP -MF grub-core/kern/$(DEPDIR)/cmp_test-list.Tpo -c -o grub-core/kern/cmp_test-list.o `test -f 'grub-core/kern/list.c' || echo '$(srcdir)/'`grub-core/kern/list.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/$(DEPDIR)/cmp_test-list.Tpo grub-core/kern/$(DEPDIR)/cmp_test-list.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/list.c' object='grub-core/kern/cmp_test-list.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cmp_test_CPPFLAGS) $(CPPFLAGS) $(cmp_test_CFLAGS) $(CFLAGS) -c -o grub-core/kern/cmp_test-list.o `test -f 'grub-core/kern/list.c' || echo '$(srcdir)/'`grub-core/kern/list.c grub-core/kern/cmp_test-list.obj: grub-core/kern/list.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cmp_test_CPPFLAGS) $(CPPFLAGS) $(cmp_test_CFLAGS) $(CFLAGS) -MT grub-core/kern/cmp_test-list.obj -MD -MP -MF grub-core/kern/$(DEPDIR)/cmp_test-list.Tpo -c -o grub-core/kern/cmp_test-list.obj `if test -f 'grub-core/kern/list.c'; then $(CYGPATH_W) 'grub-core/kern/list.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/list.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/$(DEPDIR)/cmp_test-list.Tpo grub-core/kern/$(DEPDIR)/cmp_test-list.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/list.c' object='grub-core/kern/cmp_test-list.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cmp_test_CPPFLAGS) $(CPPFLAGS) $(cmp_test_CFLAGS) $(CFLAGS) -c -o grub-core/kern/cmp_test-list.obj `if test -f 'grub-core/kern/list.c'; then $(CYGPATH_W) 'grub-core/kern/list.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/list.c'; fi` grub-core/kern/cmp_test-misc.o: grub-core/kern/misc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cmp_test_CPPFLAGS) $(CPPFLAGS) $(cmp_test_CFLAGS) $(CFLAGS) -MT grub-core/kern/cmp_test-misc.o -MD -MP -MF grub-core/kern/$(DEPDIR)/cmp_test-misc.Tpo -c -o grub-core/kern/cmp_test-misc.o `test -f 'grub-core/kern/misc.c' || echo '$(srcdir)/'`grub-core/kern/misc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/$(DEPDIR)/cmp_test-misc.Tpo grub-core/kern/$(DEPDIR)/cmp_test-misc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/misc.c' object='grub-core/kern/cmp_test-misc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cmp_test_CPPFLAGS) $(CPPFLAGS) $(cmp_test_CFLAGS) $(CFLAGS) -c -o grub-core/kern/cmp_test-misc.o `test -f 'grub-core/kern/misc.c' || echo '$(srcdir)/'`grub-core/kern/misc.c grub-core/kern/cmp_test-misc.obj: grub-core/kern/misc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cmp_test_CPPFLAGS) $(CPPFLAGS) $(cmp_test_CFLAGS) $(CFLAGS) -MT grub-core/kern/cmp_test-misc.obj -MD -MP -MF grub-core/kern/$(DEPDIR)/cmp_test-misc.Tpo -c -o grub-core/kern/cmp_test-misc.obj `if test -f 'grub-core/kern/misc.c'; then $(CYGPATH_W) 'grub-core/kern/misc.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/misc.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/$(DEPDIR)/cmp_test-misc.Tpo grub-core/kern/$(DEPDIR)/cmp_test-misc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/misc.c' object='grub-core/kern/cmp_test-misc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cmp_test_CPPFLAGS) $(CPPFLAGS) $(cmp_test_CFLAGS) $(CFLAGS) -c -o grub-core/kern/cmp_test-misc.obj `if test -f 'grub-core/kern/misc.c'; then $(CYGPATH_W) 'grub-core/kern/misc.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/misc.c'; fi` grub-core/tests/lib/cmp_test-test.o: grub-core/tests/lib/test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cmp_test_CPPFLAGS) $(CPPFLAGS) $(cmp_test_CFLAGS) $(CFLAGS) -MT grub-core/tests/lib/cmp_test-test.o -MD -MP -MF grub-core/tests/lib/$(DEPDIR)/cmp_test-test.Tpo -c -o grub-core/tests/lib/cmp_test-test.o `test -f 'grub-core/tests/lib/test.c' || echo '$(srcdir)/'`grub-core/tests/lib/test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/tests/lib/$(DEPDIR)/cmp_test-test.Tpo grub-core/tests/lib/$(DEPDIR)/cmp_test-test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/tests/lib/test.c' object='grub-core/tests/lib/cmp_test-test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cmp_test_CPPFLAGS) $(CPPFLAGS) $(cmp_test_CFLAGS) $(CFLAGS) -c -o grub-core/tests/lib/cmp_test-test.o `test -f 'grub-core/tests/lib/test.c' || echo '$(srcdir)/'`grub-core/tests/lib/test.c grub-core/tests/lib/cmp_test-test.obj: grub-core/tests/lib/test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cmp_test_CPPFLAGS) $(CPPFLAGS) $(cmp_test_CFLAGS) $(CFLAGS) -MT grub-core/tests/lib/cmp_test-test.obj -MD -MP -MF grub-core/tests/lib/$(DEPDIR)/cmp_test-test.Tpo -c -o grub-core/tests/lib/cmp_test-test.obj `if test -f 'grub-core/tests/lib/test.c'; then $(CYGPATH_W) 'grub-core/tests/lib/test.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/tests/lib/test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/tests/lib/$(DEPDIR)/cmp_test-test.Tpo grub-core/tests/lib/$(DEPDIR)/cmp_test-test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/tests/lib/test.c' object='grub-core/tests/lib/cmp_test-test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cmp_test_CPPFLAGS) $(CPPFLAGS) $(cmp_test_CFLAGS) $(CFLAGS) -c -o grub-core/tests/lib/cmp_test-test.obj `if test -f 'grub-core/tests/lib/test.c'; then $(CYGPATH_W) 'grub-core/tests/lib/test.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/tests/lib/test.c'; fi` tests/cmp_test-cmp_unit_test.o: tests/cmp_unit_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cmp_test_CPPFLAGS) $(CPPFLAGS) $(cmp_test_CFLAGS) $(CFLAGS) -MT tests/cmp_test-cmp_unit_test.o -MD -MP -MF tests/$(DEPDIR)/cmp_test-cmp_unit_test.Tpo -c -o tests/cmp_test-cmp_unit_test.o `test -f 'tests/cmp_unit_test.c' || echo '$(srcdir)/'`tests/cmp_unit_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/cmp_test-cmp_unit_test.Tpo tests/$(DEPDIR)/cmp_test-cmp_unit_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/cmp_unit_test.c' object='tests/cmp_test-cmp_unit_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cmp_test_CPPFLAGS) $(CPPFLAGS) $(cmp_test_CFLAGS) $(CFLAGS) -c -o tests/cmp_test-cmp_unit_test.o `test -f 'tests/cmp_unit_test.c' || echo '$(srcdir)/'`tests/cmp_unit_test.c tests/cmp_test-cmp_unit_test.obj: tests/cmp_unit_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cmp_test_CPPFLAGS) $(CPPFLAGS) $(cmp_test_CFLAGS) $(CFLAGS) -MT tests/cmp_test-cmp_unit_test.obj -MD -MP -MF tests/$(DEPDIR)/cmp_test-cmp_unit_test.Tpo -c -o tests/cmp_test-cmp_unit_test.obj `if test -f 'tests/cmp_unit_test.c'; then $(CYGPATH_W) 'tests/cmp_unit_test.c'; else $(CYGPATH_W) '$(srcdir)/tests/cmp_unit_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/cmp_test-cmp_unit_test.Tpo tests/$(DEPDIR)/cmp_test-cmp_unit_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/cmp_unit_test.c' object='tests/cmp_test-cmp_unit_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cmp_test_CPPFLAGS) $(CPPFLAGS) $(cmp_test_CFLAGS) $(CFLAGS) -c -o tests/cmp_test-cmp_unit_test.obj `if test -f 'tests/cmp_unit_test.c'; then $(CYGPATH_W) 'tests/cmp_unit_test.c'; else $(CYGPATH_W) '$(srcdir)/tests/cmp_unit_test.c'; fi` tests/lib/cmp_test-unit_test.o: tests/lib/unit_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cmp_test_CPPFLAGS) $(CPPFLAGS) $(cmp_test_CFLAGS) $(CFLAGS) -MT tests/lib/cmp_test-unit_test.o -MD -MP -MF tests/lib/$(DEPDIR)/cmp_test-unit_test.Tpo -c -o tests/lib/cmp_test-unit_test.o `test -f 'tests/lib/unit_test.c' || echo '$(srcdir)/'`tests/lib/unit_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/lib/$(DEPDIR)/cmp_test-unit_test.Tpo tests/lib/$(DEPDIR)/cmp_test-unit_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/lib/unit_test.c' object='tests/lib/cmp_test-unit_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cmp_test_CPPFLAGS) $(CPPFLAGS) $(cmp_test_CFLAGS) $(CFLAGS) -c -o tests/lib/cmp_test-unit_test.o `test -f 'tests/lib/unit_test.c' || echo '$(srcdir)/'`tests/lib/unit_test.c tests/lib/cmp_test-unit_test.obj: tests/lib/unit_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cmp_test_CPPFLAGS) $(CPPFLAGS) $(cmp_test_CFLAGS) $(CFLAGS) -MT tests/lib/cmp_test-unit_test.obj -MD -MP -MF tests/lib/$(DEPDIR)/cmp_test-unit_test.Tpo -c -o tests/lib/cmp_test-unit_test.obj `if test -f 'tests/lib/unit_test.c'; then $(CYGPATH_W) 'tests/lib/unit_test.c'; else $(CYGPATH_W) '$(srcdir)/tests/lib/unit_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/lib/$(DEPDIR)/cmp_test-unit_test.Tpo tests/lib/$(DEPDIR)/cmp_test-unit_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/lib/unit_test.c' object='tests/lib/cmp_test-unit_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cmp_test_CPPFLAGS) $(CPPFLAGS) $(cmp_test_CFLAGS) $(CFLAGS) -c -o tests/lib/cmp_test-unit_test.obj `if test -f 'tests/lib/unit_test.c'; then $(CYGPATH_W) 'tests/lib/unit_test.c'; else $(CYGPATH_W) '$(srcdir)/tests/lib/unit_test.c'; fi` grub-core/kern/date_test-list.o: grub-core/kern/list.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(date_test_CPPFLAGS) $(CPPFLAGS) $(date_test_CFLAGS) $(CFLAGS) -MT grub-core/kern/date_test-list.o -MD -MP -MF grub-core/kern/$(DEPDIR)/date_test-list.Tpo -c -o grub-core/kern/date_test-list.o `test -f 'grub-core/kern/list.c' || echo '$(srcdir)/'`grub-core/kern/list.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/$(DEPDIR)/date_test-list.Tpo grub-core/kern/$(DEPDIR)/date_test-list.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/list.c' object='grub-core/kern/date_test-list.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(date_test_CPPFLAGS) $(CPPFLAGS) $(date_test_CFLAGS) $(CFLAGS) -c -o grub-core/kern/date_test-list.o `test -f 'grub-core/kern/list.c' || echo '$(srcdir)/'`grub-core/kern/list.c grub-core/kern/date_test-list.obj: grub-core/kern/list.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(date_test_CPPFLAGS) $(CPPFLAGS) $(date_test_CFLAGS) $(CFLAGS) -MT grub-core/kern/date_test-list.obj -MD -MP -MF grub-core/kern/$(DEPDIR)/date_test-list.Tpo -c -o grub-core/kern/date_test-list.obj `if test -f 'grub-core/kern/list.c'; then $(CYGPATH_W) 'grub-core/kern/list.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/list.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/$(DEPDIR)/date_test-list.Tpo grub-core/kern/$(DEPDIR)/date_test-list.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/list.c' object='grub-core/kern/date_test-list.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(date_test_CPPFLAGS) $(CPPFLAGS) $(date_test_CFLAGS) $(CFLAGS) -c -o grub-core/kern/date_test-list.obj `if test -f 'grub-core/kern/list.c'; then $(CYGPATH_W) 'grub-core/kern/list.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/list.c'; fi` grub-core/kern/date_test-misc.o: grub-core/kern/misc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(date_test_CPPFLAGS) $(CPPFLAGS) $(date_test_CFLAGS) $(CFLAGS) -MT grub-core/kern/date_test-misc.o -MD -MP -MF grub-core/kern/$(DEPDIR)/date_test-misc.Tpo -c -o grub-core/kern/date_test-misc.o `test -f 'grub-core/kern/misc.c' || echo '$(srcdir)/'`grub-core/kern/misc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/$(DEPDIR)/date_test-misc.Tpo grub-core/kern/$(DEPDIR)/date_test-misc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/misc.c' object='grub-core/kern/date_test-misc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(date_test_CPPFLAGS) $(CPPFLAGS) $(date_test_CFLAGS) $(CFLAGS) -c -o grub-core/kern/date_test-misc.o `test -f 'grub-core/kern/misc.c' || echo '$(srcdir)/'`grub-core/kern/misc.c grub-core/kern/date_test-misc.obj: grub-core/kern/misc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(date_test_CPPFLAGS) $(CPPFLAGS) $(date_test_CFLAGS) $(CFLAGS) -MT grub-core/kern/date_test-misc.obj -MD -MP -MF grub-core/kern/$(DEPDIR)/date_test-misc.Tpo -c -o grub-core/kern/date_test-misc.obj `if test -f 'grub-core/kern/misc.c'; then $(CYGPATH_W) 'grub-core/kern/misc.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/misc.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/$(DEPDIR)/date_test-misc.Tpo grub-core/kern/$(DEPDIR)/date_test-misc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/misc.c' object='grub-core/kern/date_test-misc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(date_test_CPPFLAGS) $(CPPFLAGS) $(date_test_CFLAGS) $(CFLAGS) -c -o grub-core/kern/date_test-misc.obj `if test -f 'grub-core/kern/misc.c'; then $(CYGPATH_W) 'grub-core/kern/misc.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/misc.c'; fi` grub-core/tests/lib/date_test-test.o: grub-core/tests/lib/test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(date_test_CPPFLAGS) $(CPPFLAGS) $(date_test_CFLAGS) $(CFLAGS) -MT grub-core/tests/lib/date_test-test.o -MD -MP -MF grub-core/tests/lib/$(DEPDIR)/date_test-test.Tpo -c -o grub-core/tests/lib/date_test-test.o `test -f 'grub-core/tests/lib/test.c' || echo '$(srcdir)/'`grub-core/tests/lib/test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/tests/lib/$(DEPDIR)/date_test-test.Tpo grub-core/tests/lib/$(DEPDIR)/date_test-test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/tests/lib/test.c' object='grub-core/tests/lib/date_test-test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(date_test_CPPFLAGS) $(CPPFLAGS) $(date_test_CFLAGS) $(CFLAGS) -c -o grub-core/tests/lib/date_test-test.o `test -f 'grub-core/tests/lib/test.c' || echo '$(srcdir)/'`grub-core/tests/lib/test.c grub-core/tests/lib/date_test-test.obj: grub-core/tests/lib/test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(date_test_CPPFLAGS) $(CPPFLAGS) $(date_test_CFLAGS) $(CFLAGS) -MT grub-core/tests/lib/date_test-test.obj -MD -MP -MF grub-core/tests/lib/$(DEPDIR)/date_test-test.Tpo -c -o grub-core/tests/lib/date_test-test.obj `if test -f 'grub-core/tests/lib/test.c'; then $(CYGPATH_W) 'grub-core/tests/lib/test.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/tests/lib/test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/tests/lib/$(DEPDIR)/date_test-test.Tpo grub-core/tests/lib/$(DEPDIR)/date_test-test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/tests/lib/test.c' object='grub-core/tests/lib/date_test-test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(date_test_CPPFLAGS) $(CPPFLAGS) $(date_test_CFLAGS) $(CFLAGS) -c -o grub-core/tests/lib/date_test-test.obj `if test -f 'grub-core/tests/lib/test.c'; then $(CYGPATH_W) 'grub-core/tests/lib/test.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/tests/lib/test.c'; fi` tests/date_test-date_unit_test.o: tests/date_unit_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(date_test_CPPFLAGS) $(CPPFLAGS) $(date_test_CFLAGS) $(CFLAGS) -MT tests/date_test-date_unit_test.o -MD -MP -MF tests/$(DEPDIR)/date_test-date_unit_test.Tpo -c -o tests/date_test-date_unit_test.o `test -f 'tests/date_unit_test.c' || echo '$(srcdir)/'`tests/date_unit_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/date_test-date_unit_test.Tpo tests/$(DEPDIR)/date_test-date_unit_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/date_unit_test.c' object='tests/date_test-date_unit_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(date_test_CPPFLAGS) $(CPPFLAGS) $(date_test_CFLAGS) $(CFLAGS) -c -o tests/date_test-date_unit_test.o `test -f 'tests/date_unit_test.c' || echo '$(srcdir)/'`tests/date_unit_test.c tests/date_test-date_unit_test.obj: tests/date_unit_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(date_test_CPPFLAGS) $(CPPFLAGS) $(date_test_CFLAGS) $(CFLAGS) -MT tests/date_test-date_unit_test.obj -MD -MP -MF tests/$(DEPDIR)/date_test-date_unit_test.Tpo -c -o tests/date_test-date_unit_test.obj `if test -f 'tests/date_unit_test.c'; then $(CYGPATH_W) 'tests/date_unit_test.c'; else $(CYGPATH_W) '$(srcdir)/tests/date_unit_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/date_test-date_unit_test.Tpo tests/$(DEPDIR)/date_test-date_unit_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/date_unit_test.c' object='tests/date_test-date_unit_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(date_test_CPPFLAGS) $(CPPFLAGS) $(date_test_CFLAGS) $(CFLAGS) -c -o tests/date_test-date_unit_test.obj `if test -f 'tests/date_unit_test.c'; then $(CYGPATH_W) 'tests/date_unit_test.c'; else $(CYGPATH_W) '$(srcdir)/tests/date_unit_test.c'; fi` tests/lib/date_test-unit_test.o: tests/lib/unit_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(date_test_CPPFLAGS) $(CPPFLAGS) $(date_test_CFLAGS) $(CFLAGS) -MT tests/lib/date_test-unit_test.o -MD -MP -MF tests/lib/$(DEPDIR)/date_test-unit_test.Tpo -c -o tests/lib/date_test-unit_test.o `test -f 'tests/lib/unit_test.c' || echo '$(srcdir)/'`tests/lib/unit_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/lib/$(DEPDIR)/date_test-unit_test.Tpo tests/lib/$(DEPDIR)/date_test-unit_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/lib/unit_test.c' object='tests/lib/date_test-unit_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(date_test_CPPFLAGS) $(CPPFLAGS) $(date_test_CFLAGS) $(CFLAGS) -c -o tests/lib/date_test-unit_test.o `test -f 'tests/lib/unit_test.c' || echo '$(srcdir)/'`tests/lib/unit_test.c tests/lib/date_test-unit_test.obj: tests/lib/unit_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(date_test_CPPFLAGS) $(CPPFLAGS) $(date_test_CFLAGS) $(CFLAGS) -MT tests/lib/date_test-unit_test.obj -MD -MP -MF tests/lib/$(DEPDIR)/date_test-unit_test.Tpo -c -o tests/lib/date_test-unit_test.obj `if test -f 'tests/lib/unit_test.c'; then $(CYGPATH_W) 'tests/lib/unit_test.c'; else $(CYGPATH_W) '$(srcdir)/tests/lib/unit_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/lib/$(DEPDIR)/date_test-unit_test.Tpo tests/lib/$(DEPDIR)/date_test-unit_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/lib/unit_test.c' object='tests/lib/date_test-unit_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(date_test_CPPFLAGS) $(CPPFLAGS) $(date_test_CFLAGS) $(CFLAGS) -c -o tests/lib/date_test-unit_test.obj `if test -f 'tests/lib/unit_test.c'; then $(CYGPATH_W) 'tests/lib/unit_test.c'; else $(CYGPATH_W) '$(srcdir)/tests/lib/unit_test.c'; fi` grub-core/kern/example_unit_test-list.o: grub-core/kern/list.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(example_unit_test_CPPFLAGS) $(CPPFLAGS) $(example_unit_test_CFLAGS) $(CFLAGS) -MT grub-core/kern/example_unit_test-list.o -MD -MP -MF grub-core/kern/$(DEPDIR)/example_unit_test-list.Tpo -c -o grub-core/kern/example_unit_test-list.o `test -f 'grub-core/kern/list.c' || echo '$(srcdir)/'`grub-core/kern/list.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/$(DEPDIR)/example_unit_test-list.Tpo grub-core/kern/$(DEPDIR)/example_unit_test-list.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/list.c' object='grub-core/kern/example_unit_test-list.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(example_unit_test_CPPFLAGS) $(CPPFLAGS) $(example_unit_test_CFLAGS) $(CFLAGS) -c -o grub-core/kern/example_unit_test-list.o `test -f 'grub-core/kern/list.c' || echo '$(srcdir)/'`grub-core/kern/list.c grub-core/kern/example_unit_test-list.obj: grub-core/kern/list.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(example_unit_test_CPPFLAGS) $(CPPFLAGS) $(example_unit_test_CFLAGS) $(CFLAGS) -MT grub-core/kern/example_unit_test-list.obj -MD -MP -MF grub-core/kern/$(DEPDIR)/example_unit_test-list.Tpo -c -o grub-core/kern/example_unit_test-list.obj `if test -f 'grub-core/kern/list.c'; then $(CYGPATH_W) 'grub-core/kern/list.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/list.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/$(DEPDIR)/example_unit_test-list.Tpo grub-core/kern/$(DEPDIR)/example_unit_test-list.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/list.c' object='grub-core/kern/example_unit_test-list.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(example_unit_test_CPPFLAGS) $(CPPFLAGS) $(example_unit_test_CFLAGS) $(CFLAGS) -c -o grub-core/kern/example_unit_test-list.obj `if test -f 'grub-core/kern/list.c'; then $(CYGPATH_W) 'grub-core/kern/list.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/list.c'; fi` grub-core/kern/example_unit_test-misc.o: grub-core/kern/misc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(example_unit_test_CPPFLAGS) $(CPPFLAGS) $(example_unit_test_CFLAGS) $(CFLAGS) -MT grub-core/kern/example_unit_test-misc.o -MD -MP -MF grub-core/kern/$(DEPDIR)/example_unit_test-misc.Tpo -c -o grub-core/kern/example_unit_test-misc.o `test -f 'grub-core/kern/misc.c' || echo '$(srcdir)/'`grub-core/kern/misc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/$(DEPDIR)/example_unit_test-misc.Tpo grub-core/kern/$(DEPDIR)/example_unit_test-misc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/misc.c' object='grub-core/kern/example_unit_test-misc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(example_unit_test_CPPFLAGS) $(CPPFLAGS) $(example_unit_test_CFLAGS) $(CFLAGS) -c -o grub-core/kern/example_unit_test-misc.o `test -f 'grub-core/kern/misc.c' || echo '$(srcdir)/'`grub-core/kern/misc.c grub-core/kern/example_unit_test-misc.obj: grub-core/kern/misc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(example_unit_test_CPPFLAGS) $(CPPFLAGS) $(example_unit_test_CFLAGS) $(CFLAGS) -MT grub-core/kern/example_unit_test-misc.obj -MD -MP -MF grub-core/kern/$(DEPDIR)/example_unit_test-misc.Tpo -c -o grub-core/kern/example_unit_test-misc.obj `if test -f 'grub-core/kern/misc.c'; then $(CYGPATH_W) 'grub-core/kern/misc.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/misc.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/$(DEPDIR)/example_unit_test-misc.Tpo grub-core/kern/$(DEPDIR)/example_unit_test-misc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/misc.c' object='grub-core/kern/example_unit_test-misc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(example_unit_test_CPPFLAGS) $(CPPFLAGS) $(example_unit_test_CFLAGS) $(CFLAGS) -c -o grub-core/kern/example_unit_test-misc.obj `if test -f 'grub-core/kern/misc.c'; then $(CYGPATH_W) 'grub-core/kern/misc.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/misc.c'; fi` grub-core/tests/lib/example_unit_test-test.o: grub-core/tests/lib/test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(example_unit_test_CPPFLAGS) $(CPPFLAGS) $(example_unit_test_CFLAGS) $(CFLAGS) -MT grub-core/tests/lib/example_unit_test-test.o -MD -MP -MF grub-core/tests/lib/$(DEPDIR)/example_unit_test-test.Tpo -c -o grub-core/tests/lib/example_unit_test-test.o `test -f 'grub-core/tests/lib/test.c' || echo '$(srcdir)/'`grub-core/tests/lib/test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/tests/lib/$(DEPDIR)/example_unit_test-test.Tpo grub-core/tests/lib/$(DEPDIR)/example_unit_test-test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/tests/lib/test.c' object='grub-core/tests/lib/example_unit_test-test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(example_unit_test_CPPFLAGS) $(CPPFLAGS) $(example_unit_test_CFLAGS) $(CFLAGS) -c -o grub-core/tests/lib/example_unit_test-test.o `test -f 'grub-core/tests/lib/test.c' || echo '$(srcdir)/'`grub-core/tests/lib/test.c grub-core/tests/lib/example_unit_test-test.obj: grub-core/tests/lib/test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(example_unit_test_CPPFLAGS) $(CPPFLAGS) $(example_unit_test_CFLAGS) $(CFLAGS) -MT grub-core/tests/lib/example_unit_test-test.obj -MD -MP -MF grub-core/tests/lib/$(DEPDIR)/example_unit_test-test.Tpo -c -o grub-core/tests/lib/example_unit_test-test.obj `if test -f 'grub-core/tests/lib/test.c'; then $(CYGPATH_W) 'grub-core/tests/lib/test.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/tests/lib/test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/tests/lib/$(DEPDIR)/example_unit_test-test.Tpo grub-core/tests/lib/$(DEPDIR)/example_unit_test-test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/tests/lib/test.c' object='grub-core/tests/lib/example_unit_test-test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(example_unit_test_CPPFLAGS) $(CPPFLAGS) $(example_unit_test_CFLAGS) $(CFLAGS) -c -o grub-core/tests/lib/example_unit_test-test.obj `if test -f 'grub-core/tests/lib/test.c'; then $(CYGPATH_W) 'grub-core/tests/lib/test.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/tests/lib/test.c'; fi` tests/example_unit_test-example_unit_test.o: tests/example_unit_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(example_unit_test_CPPFLAGS) $(CPPFLAGS) $(example_unit_test_CFLAGS) $(CFLAGS) -MT tests/example_unit_test-example_unit_test.o -MD -MP -MF tests/$(DEPDIR)/example_unit_test-example_unit_test.Tpo -c -o tests/example_unit_test-example_unit_test.o `test -f 'tests/example_unit_test.c' || echo '$(srcdir)/'`tests/example_unit_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/example_unit_test-example_unit_test.Tpo tests/$(DEPDIR)/example_unit_test-example_unit_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/example_unit_test.c' object='tests/example_unit_test-example_unit_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(example_unit_test_CPPFLAGS) $(CPPFLAGS) $(example_unit_test_CFLAGS) $(CFLAGS) -c -o tests/example_unit_test-example_unit_test.o `test -f 'tests/example_unit_test.c' || echo '$(srcdir)/'`tests/example_unit_test.c tests/example_unit_test-example_unit_test.obj: tests/example_unit_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(example_unit_test_CPPFLAGS) $(CPPFLAGS) $(example_unit_test_CFLAGS) $(CFLAGS) -MT tests/example_unit_test-example_unit_test.obj -MD -MP -MF tests/$(DEPDIR)/example_unit_test-example_unit_test.Tpo -c -o tests/example_unit_test-example_unit_test.obj `if test -f 'tests/example_unit_test.c'; then $(CYGPATH_W) 'tests/example_unit_test.c'; else $(CYGPATH_W) '$(srcdir)/tests/example_unit_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/example_unit_test-example_unit_test.Tpo tests/$(DEPDIR)/example_unit_test-example_unit_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/example_unit_test.c' object='tests/example_unit_test-example_unit_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(example_unit_test_CPPFLAGS) $(CPPFLAGS) $(example_unit_test_CFLAGS) $(CFLAGS) -c -o tests/example_unit_test-example_unit_test.obj `if test -f 'tests/example_unit_test.c'; then $(CYGPATH_W) 'tests/example_unit_test.c'; else $(CYGPATH_W) '$(srcdir)/tests/example_unit_test.c'; fi` tests/lib/example_unit_test-unit_test.o: tests/lib/unit_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(example_unit_test_CPPFLAGS) $(CPPFLAGS) $(example_unit_test_CFLAGS) $(CFLAGS) -MT tests/lib/example_unit_test-unit_test.o -MD -MP -MF tests/lib/$(DEPDIR)/example_unit_test-unit_test.Tpo -c -o tests/lib/example_unit_test-unit_test.o `test -f 'tests/lib/unit_test.c' || echo '$(srcdir)/'`tests/lib/unit_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/lib/$(DEPDIR)/example_unit_test-unit_test.Tpo tests/lib/$(DEPDIR)/example_unit_test-unit_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/lib/unit_test.c' object='tests/lib/example_unit_test-unit_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(example_unit_test_CPPFLAGS) $(CPPFLAGS) $(example_unit_test_CFLAGS) $(CFLAGS) -c -o tests/lib/example_unit_test-unit_test.o `test -f 'tests/lib/unit_test.c' || echo '$(srcdir)/'`tests/lib/unit_test.c tests/lib/example_unit_test-unit_test.obj: tests/lib/unit_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(example_unit_test_CPPFLAGS) $(CPPFLAGS) $(example_unit_test_CFLAGS) $(CFLAGS) -MT tests/lib/example_unit_test-unit_test.obj -MD -MP -MF tests/lib/$(DEPDIR)/example_unit_test-unit_test.Tpo -c -o tests/lib/example_unit_test-unit_test.obj `if test -f 'tests/lib/unit_test.c'; then $(CYGPATH_W) 'tests/lib/unit_test.c'; else $(CYGPATH_W) '$(srcdir)/tests/lib/unit_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/lib/$(DEPDIR)/example_unit_test-unit_test.Tpo tests/lib/$(DEPDIR)/example_unit_test-unit_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/lib/unit_test.c' object='tests/lib/example_unit_test-unit_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(example_unit_test_CPPFLAGS) $(CPPFLAGS) $(example_unit_test_CFLAGS) $(CFLAGS) -c -o tests/lib/example_unit_test-unit_test.obj `if test -f 'tests/lib/unit_test.c'; then $(CYGPATH_W) 'tests/lib/unit_test.c'; else $(CYGPATH_W) '$(srcdir)/tests/lib/unit_test.c'; fi` grub-core/kern/emu/grub_bios_setup-argp_common.o: grub-core/kern/emu/argp_common.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_bios_setup_CPPFLAGS) $(CPPFLAGS) $(grub_bios_setup_CFLAGS) $(CFLAGS) -MT grub-core/kern/emu/grub_bios_setup-argp_common.o -MD -MP -MF grub-core/kern/emu/$(DEPDIR)/grub_bios_setup-argp_common.Tpo -c -o grub-core/kern/emu/grub_bios_setup-argp_common.o `test -f 'grub-core/kern/emu/argp_common.c' || echo '$(srcdir)/'`grub-core/kern/emu/argp_common.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/emu/$(DEPDIR)/grub_bios_setup-argp_common.Tpo grub-core/kern/emu/$(DEPDIR)/grub_bios_setup-argp_common.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/emu/argp_common.c' object='grub-core/kern/emu/grub_bios_setup-argp_common.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_bios_setup_CPPFLAGS) $(CPPFLAGS) $(grub_bios_setup_CFLAGS) $(CFLAGS) -c -o grub-core/kern/emu/grub_bios_setup-argp_common.o `test -f 'grub-core/kern/emu/argp_common.c' || echo '$(srcdir)/'`grub-core/kern/emu/argp_common.c grub-core/kern/emu/grub_bios_setup-argp_common.obj: grub-core/kern/emu/argp_common.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_bios_setup_CPPFLAGS) $(CPPFLAGS) $(grub_bios_setup_CFLAGS) $(CFLAGS) -MT grub-core/kern/emu/grub_bios_setup-argp_common.obj -MD -MP -MF grub-core/kern/emu/$(DEPDIR)/grub_bios_setup-argp_common.Tpo -c -o grub-core/kern/emu/grub_bios_setup-argp_common.obj `if test -f 'grub-core/kern/emu/argp_common.c'; then $(CYGPATH_W) 'grub-core/kern/emu/argp_common.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/emu/argp_common.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/emu/$(DEPDIR)/grub_bios_setup-argp_common.Tpo grub-core/kern/emu/$(DEPDIR)/grub_bios_setup-argp_common.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/emu/argp_common.c' object='grub-core/kern/emu/grub_bios_setup-argp_common.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_bios_setup_CPPFLAGS) $(CPPFLAGS) $(grub_bios_setup_CFLAGS) $(CFLAGS) -c -o grub-core/kern/emu/grub_bios_setup-argp_common.obj `if test -f 'grub-core/kern/emu/argp_common.c'; then $(CYGPATH_W) 'grub-core/kern/emu/argp_common.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/emu/argp_common.c'; fi` grub-core/lib/grub_bios_setup-reed_solomon.o: grub-core/lib/reed_solomon.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_bios_setup_CPPFLAGS) $(CPPFLAGS) $(grub_bios_setup_CFLAGS) $(CFLAGS) -MT grub-core/lib/grub_bios_setup-reed_solomon.o -MD -MP -MF grub-core/lib/$(DEPDIR)/grub_bios_setup-reed_solomon.Tpo -c -o grub-core/lib/grub_bios_setup-reed_solomon.o `test -f 'grub-core/lib/reed_solomon.c' || echo '$(srcdir)/'`grub-core/lib/reed_solomon.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/$(DEPDIR)/grub_bios_setup-reed_solomon.Tpo grub-core/lib/$(DEPDIR)/grub_bios_setup-reed_solomon.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/reed_solomon.c' object='grub-core/lib/grub_bios_setup-reed_solomon.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_bios_setup_CPPFLAGS) $(CPPFLAGS) $(grub_bios_setup_CFLAGS) $(CFLAGS) -c -o grub-core/lib/grub_bios_setup-reed_solomon.o `test -f 'grub-core/lib/reed_solomon.c' || echo '$(srcdir)/'`grub-core/lib/reed_solomon.c grub-core/lib/grub_bios_setup-reed_solomon.obj: grub-core/lib/reed_solomon.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_bios_setup_CPPFLAGS) $(CPPFLAGS) $(grub_bios_setup_CFLAGS) $(CFLAGS) -MT grub-core/lib/grub_bios_setup-reed_solomon.obj -MD -MP -MF grub-core/lib/$(DEPDIR)/grub_bios_setup-reed_solomon.Tpo -c -o grub-core/lib/grub_bios_setup-reed_solomon.obj `if test -f 'grub-core/lib/reed_solomon.c'; then $(CYGPATH_W) 'grub-core/lib/reed_solomon.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/reed_solomon.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/$(DEPDIR)/grub_bios_setup-reed_solomon.Tpo grub-core/lib/$(DEPDIR)/grub_bios_setup-reed_solomon.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/reed_solomon.c' object='grub-core/lib/grub_bios_setup-reed_solomon.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_bios_setup_CPPFLAGS) $(CPPFLAGS) $(grub_bios_setup_CFLAGS) $(CFLAGS) -c -o grub-core/lib/grub_bios_setup-reed_solomon.obj `if test -f 'grub-core/lib/reed_solomon.c'; then $(CYGPATH_W) 'grub-core/lib/reed_solomon.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/reed_solomon.c'; fi` grub-core/osdep/grub_bios_setup-blocklist.o: grub-core/osdep/blocklist.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_bios_setup_CPPFLAGS) $(CPPFLAGS) $(grub_bios_setup_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_bios_setup-blocklist.o -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_bios_setup-blocklist.Tpo -c -o grub-core/osdep/grub_bios_setup-blocklist.o `test -f 'grub-core/osdep/blocklist.c' || echo '$(srcdir)/'`grub-core/osdep/blocklist.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_bios_setup-blocklist.Tpo grub-core/osdep/$(DEPDIR)/grub_bios_setup-blocklist.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/blocklist.c' object='grub-core/osdep/grub_bios_setup-blocklist.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_bios_setup_CPPFLAGS) $(CPPFLAGS) $(grub_bios_setup_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_bios_setup-blocklist.o `test -f 'grub-core/osdep/blocklist.c' || echo '$(srcdir)/'`grub-core/osdep/blocklist.c grub-core/osdep/grub_bios_setup-blocklist.obj: grub-core/osdep/blocklist.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_bios_setup_CPPFLAGS) $(CPPFLAGS) $(grub_bios_setup_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_bios_setup-blocklist.obj -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_bios_setup-blocklist.Tpo -c -o grub-core/osdep/grub_bios_setup-blocklist.obj `if test -f 'grub-core/osdep/blocklist.c'; then $(CYGPATH_W) 'grub-core/osdep/blocklist.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/blocklist.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_bios_setup-blocklist.Tpo grub-core/osdep/$(DEPDIR)/grub_bios_setup-blocklist.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/blocklist.c' object='grub-core/osdep/grub_bios_setup-blocklist.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_bios_setup_CPPFLAGS) $(CPPFLAGS) $(grub_bios_setup_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_bios_setup-blocklist.obj `if test -f 'grub-core/osdep/blocklist.c'; then $(CYGPATH_W) 'grub-core/osdep/blocklist.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/blocklist.c'; fi` grub-core/osdep/grub_bios_setup-init.o: grub-core/osdep/init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_bios_setup_CPPFLAGS) $(CPPFLAGS) $(grub_bios_setup_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_bios_setup-init.o -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_bios_setup-init.Tpo -c -o grub-core/osdep/grub_bios_setup-init.o `test -f 'grub-core/osdep/init.c' || echo '$(srcdir)/'`grub-core/osdep/init.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_bios_setup-init.Tpo grub-core/osdep/$(DEPDIR)/grub_bios_setup-init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/init.c' object='grub-core/osdep/grub_bios_setup-init.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_bios_setup_CPPFLAGS) $(CPPFLAGS) $(grub_bios_setup_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_bios_setup-init.o `test -f 'grub-core/osdep/init.c' || echo '$(srcdir)/'`grub-core/osdep/init.c grub-core/osdep/grub_bios_setup-init.obj: grub-core/osdep/init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_bios_setup_CPPFLAGS) $(CPPFLAGS) $(grub_bios_setup_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_bios_setup-init.obj -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_bios_setup-init.Tpo -c -o grub-core/osdep/grub_bios_setup-init.obj `if test -f 'grub-core/osdep/init.c'; then $(CYGPATH_W) 'grub-core/osdep/init.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/init.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_bios_setup-init.Tpo grub-core/osdep/$(DEPDIR)/grub_bios_setup-init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/init.c' object='grub-core/osdep/grub_bios_setup-init.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_bios_setup_CPPFLAGS) $(CPPFLAGS) $(grub_bios_setup_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_bios_setup-init.obj `if test -f 'grub-core/osdep/init.c'; then $(CYGPATH_W) 'grub-core/osdep/init.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/init.c'; fi` util/grub_bios_setup-grub-setup.o: util/grub-setup.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_bios_setup_CPPFLAGS) $(CPPFLAGS) $(grub_bios_setup_CFLAGS) $(CFLAGS) -MT util/grub_bios_setup-grub-setup.o -MD -MP -MF util/$(DEPDIR)/grub_bios_setup-grub-setup.Tpo -c -o util/grub_bios_setup-grub-setup.o `test -f 'util/grub-setup.c' || echo '$(srcdir)/'`util/grub-setup.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_bios_setup-grub-setup.Tpo util/$(DEPDIR)/grub_bios_setup-grub-setup.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-setup.c' object='util/grub_bios_setup-grub-setup.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_bios_setup_CPPFLAGS) $(CPPFLAGS) $(grub_bios_setup_CFLAGS) $(CFLAGS) -c -o util/grub_bios_setup-grub-setup.o `test -f 'util/grub-setup.c' || echo '$(srcdir)/'`util/grub-setup.c util/grub_bios_setup-grub-setup.obj: util/grub-setup.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_bios_setup_CPPFLAGS) $(CPPFLAGS) $(grub_bios_setup_CFLAGS) $(CFLAGS) -MT util/grub_bios_setup-grub-setup.obj -MD -MP -MF util/$(DEPDIR)/grub_bios_setup-grub-setup.Tpo -c -o util/grub_bios_setup-grub-setup.obj `if test -f 'util/grub-setup.c'; then $(CYGPATH_W) 'util/grub-setup.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-setup.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_bios_setup-grub-setup.Tpo util/$(DEPDIR)/grub_bios_setup-grub-setup.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-setup.c' object='util/grub_bios_setup-grub-setup.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_bios_setup_CPPFLAGS) $(CPPFLAGS) $(grub_bios_setup_CFLAGS) $(CFLAGS) -c -o util/grub_bios_setup-grub-setup.obj `if test -f 'util/grub-setup.c'; then $(CYGPATH_W) 'util/grub-setup.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-setup.c'; fi` util/grub_bios_setup-setup_bios.o: util/setup_bios.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_bios_setup_CPPFLAGS) $(CPPFLAGS) $(grub_bios_setup_CFLAGS) $(CFLAGS) -MT util/grub_bios_setup-setup_bios.o -MD -MP -MF util/$(DEPDIR)/grub_bios_setup-setup_bios.Tpo -c -o util/grub_bios_setup-setup_bios.o `test -f 'util/setup_bios.c' || echo '$(srcdir)/'`util/setup_bios.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_bios_setup-setup_bios.Tpo util/$(DEPDIR)/grub_bios_setup-setup_bios.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/setup_bios.c' object='util/grub_bios_setup-setup_bios.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_bios_setup_CPPFLAGS) $(CPPFLAGS) $(grub_bios_setup_CFLAGS) $(CFLAGS) -c -o util/grub_bios_setup-setup_bios.o `test -f 'util/setup_bios.c' || echo '$(srcdir)/'`util/setup_bios.c util/grub_bios_setup-setup_bios.obj: util/setup_bios.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_bios_setup_CPPFLAGS) $(CPPFLAGS) $(grub_bios_setup_CFLAGS) $(CFLAGS) -MT util/grub_bios_setup-setup_bios.obj -MD -MP -MF util/$(DEPDIR)/grub_bios_setup-setup_bios.Tpo -c -o util/grub_bios_setup-setup_bios.obj `if test -f 'util/setup_bios.c'; then $(CYGPATH_W) 'util/setup_bios.c'; else $(CYGPATH_W) '$(srcdir)/util/setup_bios.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_bios_setup-setup_bios.Tpo util/$(DEPDIR)/grub_bios_setup-setup_bios.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/setup_bios.c' object='util/grub_bios_setup-setup_bios.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_bios_setup_CPPFLAGS) $(CPPFLAGS) $(grub_bios_setup_CFLAGS) $(CFLAGS) -c -o util/grub_bios_setup-setup_bios.obj `if test -f 'util/setup_bios.c'; then $(CYGPATH_W) 'util/setup_bios.c'; else $(CYGPATH_W) '$(srcdir)/util/setup_bios.c'; fi` grub-core/osdep/grub_editenv-compress.o: grub-core/osdep/compress.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_editenv_CPPFLAGS) $(CPPFLAGS) $(grub_editenv_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_editenv-compress.o -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_editenv-compress.Tpo -c -o grub-core/osdep/grub_editenv-compress.o `test -f 'grub-core/osdep/compress.c' || echo '$(srcdir)/'`grub-core/osdep/compress.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_editenv-compress.Tpo grub-core/osdep/$(DEPDIR)/grub_editenv-compress.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/compress.c' object='grub-core/osdep/grub_editenv-compress.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_editenv_CPPFLAGS) $(CPPFLAGS) $(grub_editenv_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_editenv-compress.o `test -f 'grub-core/osdep/compress.c' || echo '$(srcdir)/'`grub-core/osdep/compress.c grub-core/osdep/grub_editenv-compress.obj: grub-core/osdep/compress.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_editenv_CPPFLAGS) $(CPPFLAGS) $(grub_editenv_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_editenv-compress.obj -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_editenv-compress.Tpo -c -o grub-core/osdep/grub_editenv-compress.obj `if test -f 'grub-core/osdep/compress.c'; then $(CYGPATH_W) 'grub-core/osdep/compress.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/compress.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_editenv-compress.Tpo grub-core/osdep/$(DEPDIR)/grub_editenv-compress.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/compress.c' object='grub-core/osdep/grub_editenv-compress.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_editenv_CPPFLAGS) $(CPPFLAGS) $(grub_editenv_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_editenv-compress.obj `if test -f 'grub-core/osdep/compress.c'; then $(CYGPATH_W) 'grub-core/osdep/compress.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/compress.c'; fi` grub-core/osdep/grub_editenv-config.o: grub-core/osdep/config.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_editenv_CPPFLAGS) $(CPPFLAGS) $(grub_editenv_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_editenv-config.o -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_editenv-config.Tpo -c -o grub-core/osdep/grub_editenv-config.o `test -f 'grub-core/osdep/config.c' || echo '$(srcdir)/'`grub-core/osdep/config.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_editenv-config.Tpo grub-core/osdep/$(DEPDIR)/grub_editenv-config.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/config.c' object='grub-core/osdep/grub_editenv-config.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_editenv_CPPFLAGS) $(CPPFLAGS) $(grub_editenv_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_editenv-config.o `test -f 'grub-core/osdep/config.c' || echo '$(srcdir)/'`grub-core/osdep/config.c grub-core/osdep/grub_editenv-config.obj: grub-core/osdep/config.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_editenv_CPPFLAGS) $(CPPFLAGS) $(grub_editenv_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_editenv-config.obj -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_editenv-config.Tpo -c -o grub-core/osdep/grub_editenv-config.obj `if test -f 'grub-core/osdep/config.c'; then $(CYGPATH_W) 'grub-core/osdep/config.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/config.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_editenv-config.Tpo grub-core/osdep/$(DEPDIR)/grub_editenv-config.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/config.c' object='grub-core/osdep/grub_editenv-config.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_editenv_CPPFLAGS) $(CPPFLAGS) $(grub_editenv_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_editenv-config.obj `if test -f 'grub-core/osdep/config.c'; then $(CYGPATH_W) 'grub-core/osdep/config.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/config.c'; fi` grub-core/osdep/grub_editenv-init.o: grub-core/osdep/init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_editenv_CPPFLAGS) $(CPPFLAGS) $(grub_editenv_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_editenv-init.o -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_editenv-init.Tpo -c -o grub-core/osdep/grub_editenv-init.o `test -f 'grub-core/osdep/init.c' || echo '$(srcdir)/'`grub-core/osdep/init.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_editenv-init.Tpo grub-core/osdep/$(DEPDIR)/grub_editenv-init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/init.c' object='grub-core/osdep/grub_editenv-init.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_editenv_CPPFLAGS) $(CPPFLAGS) $(grub_editenv_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_editenv-init.o `test -f 'grub-core/osdep/init.c' || echo '$(srcdir)/'`grub-core/osdep/init.c grub-core/osdep/grub_editenv-init.obj: grub-core/osdep/init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_editenv_CPPFLAGS) $(CPPFLAGS) $(grub_editenv_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_editenv-init.obj -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_editenv-init.Tpo -c -o grub-core/osdep/grub_editenv-init.obj `if test -f 'grub-core/osdep/init.c'; then $(CYGPATH_W) 'grub-core/osdep/init.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/init.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_editenv-init.Tpo grub-core/osdep/$(DEPDIR)/grub_editenv-init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/init.c' object='grub-core/osdep/grub_editenv-init.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_editenv_CPPFLAGS) $(CPPFLAGS) $(grub_editenv_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_editenv-init.obj `if test -f 'grub-core/osdep/init.c'; then $(CYGPATH_W) 'grub-core/osdep/init.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/init.c'; fi` util/grub_editenv-config.o: util/config.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_editenv_CPPFLAGS) $(CPPFLAGS) $(grub_editenv_CFLAGS) $(CFLAGS) -MT util/grub_editenv-config.o -MD -MP -MF util/$(DEPDIR)/grub_editenv-config.Tpo -c -o util/grub_editenv-config.o `test -f 'util/config.c' || echo '$(srcdir)/'`util/config.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_editenv-config.Tpo util/$(DEPDIR)/grub_editenv-config.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/config.c' object='util/grub_editenv-config.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_editenv_CPPFLAGS) $(CPPFLAGS) $(grub_editenv_CFLAGS) $(CFLAGS) -c -o util/grub_editenv-config.o `test -f 'util/config.c' || echo '$(srcdir)/'`util/config.c util/grub_editenv-config.obj: util/config.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_editenv_CPPFLAGS) $(CPPFLAGS) $(grub_editenv_CFLAGS) $(CFLAGS) -MT util/grub_editenv-config.obj -MD -MP -MF util/$(DEPDIR)/grub_editenv-config.Tpo -c -o util/grub_editenv-config.obj `if test -f 'util/config.c'; then $(CYGPATH_W) 'util/config.c'; else $(CYGPATH_W) '$(srcdir)/util/config.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_editenv-config.Tpo util/$(DEPDIR)/grub_editenv-config.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/config.c' object='util/grub_editenv-config.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_editenv_CPPFLAGS) $(CPPFLAGS) $(grub_editenv_CFLAGS) $(CFLAGS) -c -o util/grub_editenv-config.obj `if test -f 'util/config.c'; then $(CYGPATH_W) 'util/config.c'; else $(CYGPATH_W) '$(srcdir)/util/config.c'; fi` util/grub_editenv-editenv.o: util/editenv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_editenv_CPPFLAGS) $(CPPFLAGS) $(grub_editenv_CFLAGS) $(CFLAGS) -MT util/grub_editenv-editenv.o -MD -MP -MF util/$(DEPDIR)/grub_editenv-editenv.Tpo -c -o util/grub_editenv-editenv.o `test -f 'util/editenv.c' || echo '$(srcdir)/'`util/editenv.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_editenv-editenv.Tpo util/$(DEPDIR)/grub_editenv-editenv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/editenv.c' object='util/grub_editenv-editenv.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_editenv_CPPFLAGS) $(CPPFLAGS) $(grub_editenv_CFLAGS) $(CFLAGS) -c -o util/grub_editenv-editenv.o `test -f 'util/editenv.c' || echo '$(srcdir)/'`util/editenv.c util/grub_editenv-editenv.obj: util/editenv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_editenv_CPPFLAGS) $(CPPFLAGS) $(grub_editenv_CFLAGS) $(CFLAGS) -MT util/grub_editenv-editenv.obj -MD -MP -MF util/$(DEPDIR)/grub_editenv-editenv.Tpo -c -o util/grub_editenv-editenv.obj `if test -f 'util/editenv.c'; then $(CYGPATH_W) 'util/editenv.c'; else $(CYGPATH_W) '$(srcdir)/util/editenv.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_editenv-editenv.Tpo util/$(DEPDIR)/grub_editenv-editenv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/editenv.c' object='util/grub_editenv-editenv.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_editenv_CPPFLAGS) $(CPPFLAGS) $(grub_editenv_CFLAGS) $(CFLAGS) -c -o util/grub_editenv-editenv.obj `if test -f 'util/editenv.c'; then $(CYGPATH_W) 'util/editenv.c'; else $(CYGPATH_W) '$(srcdir)/util/editenv.c'; fi` util/grub_editenv-grub-editenv.o: util/grub-editenv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_editenv_CPPFLAGS) $(CPPFLAGS) $(grub_editenv_CFLAGS) $(CFLAGS) -MT util/grub_editenv-grub-editenv.o -MD -MP -MF util/$(DEPDIR)/grub_editenv-grub-editenv.Tpo -c -o util/grub_editenv-grub-editenv.o `test -f 'util/grub-editenv.c' || echo '$(srcdir)/'`util/grub-editenv.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_editenv-grub-editenv.Tpo util/$(DEPDIR)/grub_editenv-grub-editenv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-editenv.c' object='util/grub_editenv-grub-editenv.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_editenv_CPPFLAGS) $(CPPFLAGS) $(grub_editenv_CFLAGS) $(CFLAGS) -c -o util/grub_editenv-grub-editenv.o `test -f 'util/grub-editenv.c' || echo '$(srcdir)/'`util/grub-editenv.c util/grub_editenv-grub-editenv.obj: util/grub-editenv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_editenv_CPPFLAGS) $(CPPFLAGS) $(grub_editenv_CFLAGS) $(CFLAGS) -MT util/grub_editenv-grub-editenv.obj -MD -MP -MF util/$(DEPDIR)/grub_editenv-grub-editenv.Tpo -c -o util/grub_editenv-grub-editenv.obj `if test -f 'util/grub-editenv.c'; then $(CYGPATH_W) 'util/grub-editenv.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-editenv.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_editenv-grub-editenv.Tpo util/$(DEPDIR)/grub_editenv-grub-editenv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-editenv.c' object='util/grub_editenv-grub-editenv.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_editenv_CPPFLAGS) $(CPPFLAGS) $(grub_editenv_CFLAGS) $(CFLAGS) -c -o util/grub_editenv-grub-editenv.obj `if test -f 'util/grub-editenv.c'; then $(CYGPATH_W) 'util/grub-editenv.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-editenv.c'; fi` util/grub_editenv-grub-install-common.o: util/grub-install-common.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_editenv_CPPFLAGS) $(CPPFLAGS) $(grub_editenv_CFLAGS) $(CFLAGS) -MT util/grub_editenv-grub-install-common.o -MD -MP -MF util/$(DEPDIR)/grub_editenv-grub-install-common.Tpo -c -o util/grub_editenv-grub-install-common.o `test -f 'util/grub-install-common.c' || echo '$(srcdir)/'`util/grub-install-common.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_editenv-grub-install-common.Tpo util/$(DEPDIR)/grub_editenv-grub-install-common.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-install-common.c' object='util/grub_editenv-grub-install-common.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_editenv_CPPFLAGS) $(CPPFLAGS) $(grub_editenv_CFLAGS) $(CFLAGS) -c -o util/grub_editenv-grub-install-common.o `test -f 'util/grub-install-common.c' || echo '$(srcdir)/'`util/grub-install-common.c util/grub_editenv-grub-install-common.obj: util/grub-install-common.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_editenv_CPPFLAGS) $(CPPFLAGS) $(grub_editenv_CFLAGS) $(CFLAGS) -MT util/grub_editenv-grub-install-common.obj -MD -MP -MF util/$(DEPDIR)/grub_editenv-grub-install-common.Tpo -c -o util/grub_editenv-grub-install-common.obj `if test -f 'util/grub-install-common.c'; then $(CYGPATH_W) 'util/grub-install-common.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-install-common.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_editenv-grub-install-common.Tpo util/$(DEPDIR)/grub_editenv-grub-install-common.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-install-common.c' object='util/grub_editenv-grub-install-common.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_editenv_CPPFLAGS) $(CPPFLAGS) $(grub_editenv_CFLAGS) $(CFLAGS) -c -o util/grub_editenv-grub-install-common.obj `if test -f 'util/grub-install-common.c'; then $(CYGPATH_W) 'util/grub-install-common.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-install-common.c'; fi` util/grub_editenv-grub-mkimage32.o: util/grub-mkimage32.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_editenv_CPPFLAGS) $(CPPFLAGS) $(grub_editenv_CFLAGS) $(CFLAGS) -MT util/grub_editenv-grub-mkimage32.o -MD -MP -MF util/$(DEPDIR)/grub_editenv-grub-mkimage32.Tpo -c -o util/grub_editenv-grub-mkimage32.o `test -f 'util/grub-mkimage32.c' || echo '$(srcdir)/'`util/grub-mkimage32.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_editenv-grub-mkimage32.Tpo util/$(DEPDIR)/grub_editenv-grub-mkimage32.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-mkimage32.c' object='util/grub_editenv-grub-mkimage32.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_editenv_CPPFLAGS) $(CPPFLAGS) $(grub_editenv_CFLAGS) $(CFLAGS) -c -o util/grub_editenv-grub-mkimage32.o `test -f 'util/grub-mkimage32.c' || echo '$(srcdir)/'`util/grub-mkimage32.c util/grub_editenv-grub-mkimage32.obj: util/grub-mkimage32.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_editenv_CPPFLAGS) $(CPPFLAGS) $(grub_editenv_CFLAGS) $(CFLAGS) -MT util/grub_editenv-grub-mkimage32.obj -MD -MP -MF util/$(DEPDIR)/grub_editenv-grub-mkimage32.Tpo -c -o util/grub_editenv-grub-mkimage32.obj `if test -f 'util/grub-mkimage32.c'; then $(CYGPATH_W) 'util/grub-mkimage32.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-mkimage32.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_editenv-grub-mkimage32.Tpo util/$(DEPDIR)/grub_editenv-grub-mkimage32.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-mkimage32.c' object='util/grub_editenv-grub-mkimage32.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_editenv_CPPFLAGS) $(CPPFLAGS) $(grub_editenv_CFLAGS) $(CFLAGS) -c -o util/grub_editenv-grub-mkimage32.obj `if test -f 'util/grub-mkimage32.c'; then $(CYGPATH_W) 'util/grub-mkimage32.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-mkimage32.c'; fi` util/grub_editenv-grub-mkimage64.o: util/grub-mkimage64.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_editenv_CPPFLAGS) $(CPPFLAGS) $(grub_editenv_CFLAGS) $(CFLAGS) -MT util/grub_editenv-grub-mkimage64.o -MD -MP -MF util/$(DEPDIR)/grub_editenv-grub-mkimage64.Tpo -c -o util/grub_editenv-grub-mkimage64.o `test -f 'util/grub-mkimage64.c' || echo '$(srcdir)/'`util/grub-mkimage64.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_editenv-grub-mkimage64.Tpo util/$(DEPDIR)/grub_editenv-grub-mkimage64.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-mkimage64.c' object='util/grub_editenv-grub-mkimage64.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_editenv_CPPFLAGS) $(CPPFLAGS) $(grub_editenv_CFLAGS) $(CFLAGS) -c -o util/grub_editenv-grub-mkimage64.o `test -f 'util/grub-mkimage64.c' || echo '$(srcdir)/'`util/grub-mkimage64.c util/grub_editenv-grub-mkimage64.obj: util/grub-mkimage64.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_editenv_CPPFLAGS) $(CPPFLAGS) $(grub_editenv_CFLAGS) $(CFLAGS) -MT util/grub_editenv-grub-mkimage64.obj -MD -MP -MF util/$(DEPDIR)/grub_editenv-grub-mkimage64.Tpo -c -o util/grub_editenv-grub-mkimage64.obj `if test -f 'util/grub-mkimage64.c'; then $(CYGPATH_W) 'util/grub-mkimage64.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-mkimage64.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_editenv-grub-mkimage64.Tpo util/$(DEPDIR)/grub_editenv-grub-mkimage64.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-mkimage64.c' object='util/grub_editenv-grub-mkimage64.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_editenv_CPPFLAGS) $(CPPFLAGS) $(grub_editenv_CFLAGS) $(CFLAGS) -c -o util/grub_editenv-grub-mkimage64.obj `if test -f 'util/grub-mkimage64.c'; then $(CYGPATH_W) 'util/grub-mkimage64.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-mkimage64.c'; fi` util/grub_editenv-mkimage.o: util/mkimage.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_editenv_CPPFLAGS) $(CPPFLAGS) $(grub_editenv_CFLAGS) $(CFLAGS) -MT util/grub_editenv-mkimage.o -MD -MP -MF util/$(DEPDIR)/grub_editenv-mkimage.Tpo -c -o util/grub_editenv-mkimage.o `test -f 'util/mkimage.c' || echo '$(srcdir)/'`util/mkimage.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_editenv-mkimage.Tpo util/$(DEPDIR)/grub_editenv-mkimage.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/mkimage.c' object='util/grub_editenv-mkimage.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_editenv_CPPFLAGS) $(CPPFLAGS) $(grub_editenv_CFLAGS) $(CFLAGS) -c -o util/grub_editenv-mkimage.o `test -f 'util/mkimage.c' || echo '$(srcdir)/'`util/mkimage.c util/grub_editenv-mkimage.obj: util/mkimage.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_editenv_CPPFLAGS) $(CPPFLAGS) $(grub_editenv_CFLAGS) $(CFLAGS) -MT util/grub_editenv-mkimage.obj -MD -MP -MF util/$(DEPDIR)/grub_editenv-mkimage.Tpo -c -o util/grub_editenv-mkimage.obj `if test -f 'util/mkimage.c'; then $(CYGPATH_W) 'util/mkimage.c'; else $(CYGPATH_W) '$(srcdir)/util/mkimage.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_editenv-mkimage.Tpo util/$(DEPDIR)/grub_editenv-mkimage.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/mkimage.c' object='util/grub_editenv-mkimage.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_editenv_CPPFLAGS) $(CPPFLAGS) $(grub_editenv_CFLAGS) $(CFLAGS) -c -o util/grub_editenv-mkimage.obj `if test -f 'util/mkimage.c'; then $(CYGPATH_W) 'util/mkimage.c'; else $(CYGPATH_W) '$(srcdir)/util/mkimage.c'; fi` util/grub_editenv-resolve.o: util/resolve.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_editenv_CPPFLAGS) $(CPPFLAGS) $(grub_editenv_CFLAGS) $(CFLAGS) -MT util/grub_editenv-resolve.o -MD -MP -MF util/$(DEPDIR)/grub_editenv-resolve.Tpo -c -o util/grub_editenv-resolve.o `test -f 'util/resolve.c' || echo '$(srcdir)/'`util/resolve.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_editenv-resolve.Tpo util/$(DEPDIR)/grub_editenv-resolve.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/resolve.c' object='util/grub_editenv-resolve.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_editenv_CPPFLAGS) $(CPPFLAGS) $(grub_editenv_CFLAGS) $(CFLAGS) -c -o util/grub_editenv-resolve.o `test -f 'util/resolve.c' || echo '$(srcdir)/'`util/resolve.c util/grub_editenv-resolve.obj: util/resolve.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_editenv_CPPFLAGS) $(CPPFLAGS) $(grub_editenv_CFLAGS) $(CFLAGS) -MT util/grub_editenv-resolve.obj -MD -MP -MF util/$(DEPDIR)/grub_editenv-resolve.Tpo -c -o util/grub_editenv-resolve.obj `if test -f 'util/resolve.c'; then $(CYGPATH_W) 'util/resolve.c'; else $(CYGPATH_W) '$(srcdir)/util/resolve.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_editenv-resolve.Tpo util/$(DEPDIR)/grub_editenv-resolve.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/resolve.c' object='util/grub_editenv-resolve.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_editenv_CPPFLAGS) $(CPPFLAGS) $(grub_editenv_CFLAGS) $(CFLAGS) -c -o util/grub_editenv-resolve.obj `if test -f 'util/resolve.c'; then $(CYGPATH_W) 'util/resolve.c'; else $(CYGPATH_W) '$(srcdir)/util/resolve.c'; fi` grub-core/commands/grub_file-file.o: grub-core/commands/file.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_file_CPPFLAGS) $(CPPFLAGS) $(grub_file_CFLAGS) $(CFLAGS) -MT grub-core/commands/grub_file-file.o -MD -MP -MF grub-core/commands/$(DEPDIR)/grub_file-file.Tpo -c -o grub-core/commands/grub_file-file.o `test -f 'grub-core/commands/file.c' || echo '$(srcdir)/'`grub-core/commands/file.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/commands/$(DEPDIR)/grub_file-file.Tpo grub-core/commands/$(DEPDIR)/grub_file-file.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/commands/file.c' object='grub-core/commands/grub_file-file.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_file_CPPFLAGS) $(CPPFLAGS) $(grub_file_CFLAGS) $(CFLAGS) -c -o grub-core/commands/grub_file-file.o `test -f 'grub-core/commands/file.c' || echo '$(srcdir)/'`grub-core/commands/file.c grub-core/commands/grub_file-file.obj: grub-core/commands/file.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_file_CPPFLAGS) $(CPPFLAGS) $(grub_file_CFLAGS) $(CFLAGS) -MT grub-core/commands/grub_file-file.obj -MD -MP -MF grub-core/commands/$(DEPDIR)/grub_file-file.Tpo -c -o grub-core/commands/grub_file-file.obj `if test -f 'grub-core/commands/file.c'; then $(CYGPATH_W) 'grub-core/commands/file.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/commands/file.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/commands/$(DEPDIR)/grub_file-file.Tpo grub-core/commands/$(DEPDIR)/grub_file-file.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/commands/file.c' object='grub-core/commands/grub_file-file.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_file_CPPFLAGS) $(CPPFLAGS) $(grub_file_CFLAGS) $(CFLAGS) -c -o grub-core/commands/grub_file-file.obj `if test -f 'grub-core/commands/file.c'; then $(CYGPATH_W) 'grub-core/commands/file.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/commands/file.c'; fi` grub-core/commands/grub_file-file32.o: grub-core/commands/file32.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_file_CPPFLAGS) $(CPPFLAGS) $(grub_file_CFLAGS) $(CFLAGS) -MT grub-core/commands/grub_file-file32.o -MD -MP -MF grub-core/commands/$(DEPDIR)/grub_file-file32.Tpo -c -o grub-core/commands/grub_file-file32.o `test -f 'grub-core/commands/file32.c' || echo '$(srcdir)/'`grub-core/commands/file32.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/commands/$(DEPDIR)/grub_file-file32.Tpo grub-core/commands/$(DEPDIR)/grub_file-file32.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/commands/file32.c' object='grub-core/commands/grub_file-file32.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_file_CPPFLAGS) $(CPPFLAGS) $(grub_file_CFLAGS) $(CFLAGS) -c -o grub-core/commands/grub_file-file32.o `test -f 'grub-core/commands/file32.c' || echo '$(srcdir)/'`grub-core/commands/file32.c grub-core/commands/grub_file-file32.obj: grub-core/commands/file32.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_file_CPPFLAGS) $(CPPFLAGS) $(grub_file_CFLAGS) $(CFLAGS) -MT grub-core/commands/grub_file-file32.obj -MD -MP -MF grub-core/commands/$(DEPDIR)/grub_file-file32.Tpo -c -o grub-core/commands/grub_file-file32.obj `if test -f 'grub-core/commands/file32.c'; then $(CYGPATH_W) 'grub-core/commands/file32.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/commands/file32.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/commands/$(DEPDIR)/grub_file-file32.Tpo grub-core/commands/$(DEPDIR)/grub_file-file32.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/commands/file32.c' object='grub-core/commands/grub_file-file32.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_file_CPPFLAGS) $(CPPFLAGS) $(grub_file_CFLAGS) $(CFLAGS) -c -o grub-core/commands/grub_file-file32.obj `if test -f 'grub-core/commands/file32.c'; then $(CYGPATH_W) 'grub-core/commands/file32.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/commands/file32.c'; fi` grub-core/commands/grub_file-file64.o: grub-core/commands/file64.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_file_CPPFLAGS) $(CPPFLAGS) $(grub_file_CFLAGS) $(CFLAGS) -MT grub-core/commands/grub_file-file64.o -MD -MP -MF grub-core/commands/$(DEPDIR)/grub_file-file64.Tpo -c -o grub-core/commands/grub_file-file64.o `test -f 'grub-core/commands/file64.c' || echo '$(srcdir)/'`grub-core/commands/file64.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/commands/$(DEPDIR)/grub_file-file64.Tpo grub-core/commands/$(DEPDIR)/grub_file-file64.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/commands/file64.c' object='grub-core/commands/grub_file-file64.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_file_CPPFLAGS) $(CPPFLAGS) $(grub_file_CFLAGS) $(CFLAGS) -c -o grub-core/commands/grub_file-file64.o `test -f 'grub-core/commands/file64.c' || echo '$(srcdir)/'`grub-core/commands/file64.c grub-core/commands/grub_file-file64.obj: grub-core/commands/file64.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_file_CPPFLAGS) $(CPPFLAGS) $(grub_file_CFLAGS) $(CFLAGS) -MT grub-core/commands/grub_file-file64.obj -MD -MP -MF grub-core/commands/$(DEPDIR)/grub_file-file64.Tpo -c -o grub-core/commands/grub_file-file64.obj `if test -f 'grub-core/commands/file64.c'; then $(CYGPATH_W) 'grub-core/commands/file64.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/commands/file64.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/commands/$(DEPDIR)/grub_file-file64.Tpo grub-core/commands/$(DEPDIR)/grub_file-file64.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/commands/file64.c' object='grub-core/commands/grub_file-file64.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_file_CPPFLAGS) $(CPPFLAGS) $(grub_file_CFLAGS) $(CFLAGS) -c -o grub-core/commands/grub_file-file64.obj `if test -f 'grub-core/commands/file64.c'; then $(CYGPATH_W) 'grub-core/commands/file64.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/commands/file64.c'; fi` grub-core/disk/grub_file-host.o: grub-core/disk/host.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_file_CPPFLAGS) $(CPPFLAGS) $(grub_file_CFLAGS) $(CFLAGS) -MT grub-core/disk/grub_file-host.o -MD -MP -MF grub-core/disk/$(DEPDIR)/grub_file-host.Tpo -c -o grub-core/disk/grub_file-host.o `test -f 'grub-core/disk/host.c' || echo '$(srcdir)/'`grub-core/disk/host.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/disk/$(DEPDIR)/grub_file-host.Tpo grub-core/disk/$(DEPDIR)/grub_file-host.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/disk/host.c' object='grub-core/disk/grub_file-host.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_file_CPPFLAGS) $(CPPFLAGS) $(grub_file_CFLAGS) $(CFLAGS) -c -o grub-core/disk/grub_file-host.o `test -f 'grub-core/disk/host.c' || echo '$(srcdir)/'`grub-core/disk/host.c grub-core/disk/grub_file-host.obj: grub-core/disk/host.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_file_CPPFLAGS) $(CPPFLAGS) $(grub_file_CFLAGS) $(CFLAGS) -MT grub-core/disk/grub_file-host.obj -MD -MP -MF grub-core/disk/$(DEPDIR)/grub_file-host.Tpo -c -o grub-core/disk/grub_file-host.obj `if test -f 'grub-core/disk/host.c'; then $(CYGPATH_W) 'grub-core/disk/host.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/disk/host.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/disk/$(DEPDIR)/grub_file-host.Tpo grub-core/disk/$(DEPDIR)/grub_file-host.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/disk/host.c' object='grub-core/disk/grub_file-host.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_file_CPPFLAGS) $(CPPFLAGS) $(grub_file_CFLAGS) $(CFLAGS) -c -o grub-core/disk/grub_file-host.obj `if test -f 'grub-core/disk/host.c'; then $(CYGPATH_W) 'grub-core/disk/host.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/disk/host.c'; fi` grub-core/io/grub_file-offset.o: grub-core/io/offset.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_file_CPPFLAGS) $(CPPFLAGS) $(grub_file_CFLAGS) $(CFLAGS) -MT grub-core/io/grub_file-offset.o -MD -MP -MF grub-core/io/$(DEPDIR)/grub_file-offset.Tpo -c -o grub-core/io/grub_file-offset.o `test -f 'grub-core/io/offset.c' || echo '$(srcdir)/'`grub-core/io/offset.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/io/$(DEPDIR)/grub_file-offset.Tpo grub-core/io/$(DEPDIR)/grub_file-offset.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/io/offset.c' object='grub-core/io/grub_file-offset.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_file_CPPFLAGS) $(CPPFLAGS) $(grub_file_CFLAGS) $(CFLAGS) -c -o grub-core/io/grub_file-offset.o `test -f 'grub-core/io/offset.c' || echo '$(srcdir)/'`grub-core/io/offset.c grub-core/io/grub_file-offset.obj: grub-core/io/offset.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_file_CPPFLAGS) $(CPPFLAGS) $(grub_file_CFLAGS) $(CFLAGS) -MT grub-core/io/grub_file-offset.obj -MD -MP -MF grub-core/io/$(DEPDIR)/grub_file-offset.Tpo -c -o grub-core/io/grub_file-offset.obj `if test -f 'grub-core/io/offset.c'; then $(CYGPATH_W) 'grub-core/io/offset.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/io/offset.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/io/$(DEPDIR)/grub_file-offset.Tpo grub-core/io/$(DEPDIR)/grub_file-offset.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/io/offset.c' object='grub-core/io/grub_file-offset.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_file_CPPFLAGS) $(CPPFLAGS) $(grub_file_CFLAGS) $(CFLAGS) -c -o grub-core/io/grub_file-offset.obj `if test -f 'grub-core/io/offset.c'; then $(CYGPATH_W) 'grub-core/io/offset.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/io/offset.c'; fi` grub-core/kern/grub_file-elf.o: grub-core/kern/elf.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_file_CPPFLAGS) $(CPPFLAGS) $(grub_file_CFLAGS) $(CFLAGS) -MT grub-core/kern/grub_file-elf.o -MD -MP -MF grub-core/kern/$(DEPDIR)/grub_file-elf.Tpo -c -o grub-core/kern/grub_file-elf.o `test -f 'grub-core/kern/elf.c' || echo '$(srcdir)/'`grub-core/kern/elf.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/$(DEPDIR)/grub_file-elf.Tpo grub-core/kern/$(DEPDIR)/grub_file-elf.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/elf.c' object='grub-core/kern/grub_file-elf.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_file_CPPFLAGS) $(CPPFLAGS) $(grub_file_CFLAGS) $(CFLAGS) -c -o grub-core/kern/grub_file-elf.o `test -f 'grub-core/kern/elf.c' || echo '$(srcdir)/'`grub-core/kern/elf.c grub-core/kern/grub_file-elf.obj: grub-core/kern/elf.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_file_CPPFLAGS) $(CPPFLAGS) $(grub_file_CFLAGS) $(CFLAGS) -MT grub-core/kern/grub_file-elf.obj -MD -MP -MF grub-core/kern/$(DEPDIR)/grub_file-elf.Tpo -c -o grub-core/kern/grub_file-elf.obj `if test -f 'grub-core/kern/elf.c'; then $(CYGPATH_W) 'grub-core/kern/elf.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/elf.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/$(DEPDIR)/grub_file-elf.Tpo grub-core/kern/$(DEPDIR)/grub_file-elf.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/elf.c' object='grub-core/kern/grub_file-elf.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_file_CPPFLAGS) $(CPPFLAGS) $(grub_file_CFLAGS) $(CFLAGS) -c -o grub-core/kern/grub_file-elf.obj `if test -f 'grub-core/kern/elf.c'; then $(CYGPATH_W) 'grub-core/kern/elf.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/elf.c'; fi` grub-core/kern/emu/grub_file-hostfs.o: grub-core/kern/emu/hostfs.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_file_CPPFLAGS) $(CPPFLAGS) $(grub_file_CFLAGS) $(CFLAGS) -MT grub-core/kern/emu/grub_file-hostfs.o -MD -MP -MF grub-core/kern/emu/$(DEPDIR)/grub_file-hostfs.Tpo -c -o grub-core/kern/emu/grub_file-hostfs.o `test -f 'grub-core/kern/emu/hostfs.c' || echo '$(srcdir)/'`grub-core/kern/emu/hostfs.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/emu/$(DEPDIR)/grub_file-hostfs.Tpo grub-core/kern/emu/$(DEPDIR)/grub_file-hostfs.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/emu/hostfs.c' object='grub-core/kern/emu/grub_file-hostfs.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_file_CPPFLAGS) $(CPPFLAGS) $(grub_file_CFLAGS) $(CFLAGS) -c -o grub-core/kern/emu/grub_file-hostfs.o `test -f 'grub-core/kern/emu/hostfs.c' || echo '$(srcdir)/'`grub-core/kern/emu/hostfs.c grub-core/kern/emu/grub_file-hostfs.obj: grub-core/kern/emu/hostfs.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_file_CPPFLAGS) $(CPPFLAGS) $(grub_file_CFLAGS) $(CFLAGS) -MT grub-core/kern/emu/grub_file-hostfs.obj -MD -MP -MF grub-core/kern/emu/$(DEPDIR)/grub_file-hostfs.Tpo -c -o grub-core/kern/emu/grub_file-hostfs.obj `if test -f 'grub-core/kern/emu/hostfs.c'; then $(CYGPATH_W) 'grub-core/kern/emu/hostfs.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/emu/hostfs.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/emu/$(DEPDIR)/grub_file-hostfs.Tpo grub-core/kern/emu/$(DEPDIR)/grub_file-hostfs.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/emu/hostfs.c' object='grub-core/kern/emu/grub_file-hostfs.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_file_CPPFLAGS) $(CPPFLAGS) $(grub_file_CFLAGS) $(CFLAGS) -c -o grub-core/kern/emu/grub_file-hostfs.obj `if test -f 'grub-core/kern/emu/hostfs.c'; then $(CYGPATH_W) 'grub-core/kern/emu/hostfs.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/emu/hostfs.c'; fi` grub-core/loader/i386/grub_file-xen_file.o: grub-core/loader/i386/xen_file.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_file_CPPFLAGS) $(CPPFLAGS) $(grub_file_CFLAGS) $(CFLAGS) -MT grub-core/loader/i386/grub_file-xen_file.o -MD -MP -MF grub-core/loader/i386/$(DEPDIR)/grub_file-xen_file.Tpo -c -o grub-core/loader/i386/grub_file-xen_file.o `test -f 'grub-core/loader/i386/xen_file.c' || echo '$(srcdir)/'`grub-core/loader/i386/xen_file.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/loader/i386/$(DEPDIR)/grub_file-xen_file.Tpo grub-core/loader/i386/$(DEPDIR)/grub_file-xen_file.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/loader/i386/xen_file.c' object='grub-core/loader/i386/grub_file-xen_file.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_file_CPPFLAGS) $(CPPFLAGS) $(grub_file_CFLAGS) $(CFLAGS) -c -o grub-core/loader/i386/grub_file-xen_file.o `test -f 'grub-core/loader/i386/xen_file.c' || echo '$(srcdir)/'`grub-core/loader/i386/xen_file.c grub-core/loader/i386/grub_file-xen_file.obj: grub-core/loader/i386/xen_file.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_file_CPPFLAGS) $(CPPFLAGS) $(grub_file_CFLAGS) $(CFLAGS) -MT grub-core/loader/i386/grub_file-xen_file.obj -MD -MP -MF grub-core/loader/i386/$(DEPDIR)/grub_file-xen_file.Tpo -c -o grub-core/loader/i386/grub_file-xen_file.obj `if test -f 'grub-core/loader/i386/xen_file.c'; then $(CYGPATH_W) 'grub-core/loader/i386/xen_file.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/loader/i386/xen_file.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/loader/i386/$(DEPDIR)/grub_file-xen_file.Tpo grub-core/loader/i386/$(DEPDIR)/grub_file-xen_file.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/loader/i386/xen_file.c' object='grub-core/loader/i386/grub_file-xen_file.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_file_CPPFLAGS) $(CPPFLAGS) $(grub_file_CFLAGS) $(CFLAGS) -c -o grub-core/loader/i386/grub_file-xen_file.obj `if test -f 'grub-core/loader/i386/xen_file.c'; then $(CYGPATH_W) 'grub-core/loader/i386/xen_file.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/loader/i386/xen_file.c'; fi` grub-core/loader/i386/grub_file-xen_file32.o: grub-core/loader/i386/xen_file32.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_file_CPPFLAGS) $(CPPFLAGS) $(grub_file_CFLAGS) $(CFLAGS) -MT grub-core/loader/i386/grub_file-xen_file32.o -MD -MP -MF grub-core/loader/i386/$(DEPDIR)/grub_file-xen_file32.Tpo -c -o grub-core/loader/i386/grub_file-xen_file32.o `test -f 'grub-core/loader/i386/xen_file32.c' || echo '$(srcdir)/'`grub-core/loader/i386/xen_file32.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/loader/i386/$(DEPDIR)/grub_file-xen_file32.Tpo grub-core/loader/i386/$(DEPDIR)/grub_file-xen_file32.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/loader/i386/xen_file32.c' object='grub-core/loader/i386/grub_file-xen_file32.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_file_CPPFLAGS) $(CPPFLAGS) $(grub_file_CFLAGS) $(CFLAGS) -c -o grub-core/loader/i386/grub_file-xen_file32.o `test -f 'grub-core/loader/i386/xen_file32.c' || echo '$(srcdir)/'`grub-core/loader/i386/xen_file32.c grub-core/loader/i386/grub_file-xen_file32.obj: grub-core/loader/i386/xen_file32.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_file_CPPFLAGS) $(CPPFLAGS) $(grub_file_CFLAGS) $(CFLAGS) -MT grub-core/loader/i386/grub_file-xen_file32.obj -MD -MP -MF grub-core/loader/i386/$(DEPDIR)/grub_file-xen_file32.Tpo -c -o grub-core/loader/i386/grub_file-xen_file32.obj `if test -f 'grub-core/loader/i386/xen_file32.c'; then $(CYGPATH_W) 'grub-core/loader/i386/xen_file32.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/loader/i386/xen_file32.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/loader/i386/$(DEPDIR)/grub_file-xen_file32.Tpo grub-core/loader/i386/$(DEPDIR)/grub_file-xen_file32.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/loader/i386/xen_file32.c' object='grub-core/loader/i386/grub_file-xen_file32.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_file_CPPFLAGS) $(CPPFLAGS) $(grub_file_CFLAGS) $(CFLAGS) -c -o grub-core/loader/i386/grub_file-xen_file32.obj `if test -f 'grub-core/loader/i386/xen_file32.c'; then $(CYGPATH_W) 'grub-core/loader/i386/xen_file32.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/loader/i386/xen_file32.c'; fi` grub-core/loader/i386/grub_file-xen_file64.o: grub-core/loader/i386/xen_file64.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_file_CPPFLAGS) $(CPPFLAGS) $(grub_file_CFLAGS) $(CFLAGS) -MT grub-core/loader/i386/grub_file-xen_file64.o -MD -MP -MF grub-core/loader/i386/$(DEPDIR)/grub_file-xen_file64.Tpo -c -o grub-core/loader/i386/grub_file-xen_file64.o `test -f 'grub-core/loader/i386/xen_file64.c' || echo '$(srcdir)/'`grub-core/loader/i386/xen_file64.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/loader/i386/$(DEPDIR)/grub_file-xen_file64.Tpo grub-core/loader/i386/$(DEPDIR)/grub_file-xen_file64.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/loader/i386/xen_file64.c' object='grub-core/loader/i386/grub_file-xen_file64.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_file_CPPFLAGS) $(CPPFLAGS) $(grub_file_CFLAGS) $(CFLAGS) -c -o grub-core/loader/i386/grub_file-xen_file64.o `test -f 'grub-core/loader/i386/xen_file64.c' || echo '$(srcdir)/'`grub-core/loader/i386/xen_file64.c grub-core/loader/i386/grub_file-xen_file64.obj: grub-core/loader/i386/xen_file64.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_file_CPPFLAGS) $(CPPFLAGS) $(grub_file_CFLAGS) $(CFLAGS) -MT grub-core/loader/i386/grub_file-xen_file64.obj -MD -MP -MF grub-core/loader/i386/$(DEPDIR)/grub_file-xen_file64.Tpo -c -o grub-core/loader/i386/grub_file-xen_file64.obj `if test -f 'grub-core/loader/i386/xen_file64.c'; then $(CYGPATH_W) 'grub-core/loader/i386/xen_file64.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/loader/i386/xen_file64.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/loader/i386/$(DEPDIR)/grub_file-xen_file64.Tpo grub-core/loader/i386/$(DEPDIR)/grub_file-xen_file64.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/loader/i386/xen_file64.c' object='grub-core/loader/i386/grub_file-xen_file64.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_file_CPPFLAGS) $(CPPFLAGS) $(grub_file_CFLAGS) $(CFLAGS) -c -o grub-core/loader/i386/grub_file-xen_file64.obj `if test -f 'grub-core/loader/i386/xen_file64.c'; then $(CYGPATH_W) 'grub-core/loader/i386/xen_file64.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/loader/i386/xen_file64.c'; fi` grub-core/loader/grub_file-lzss.o: grub-core/loader/lzss.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_file_CPPFLAGS) $(CPPFLAGS) $(grub_file_CFLAGS) $(CFLAGS) -MT grub-core/loader/grub_file-lzss.o -MD -MP -MF grub-core/loader/$(DEPDIR)/grub_file-lzss.Tpo -c -o grub-core/loader/grub_file-lzss.o `test -f 'grub-core/loader/lzss.c' || echo '$(srcdir)/'`grub-core/loader/lzss.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/loader/$(DEPDIR)/grub_file-lzss.Tpo grub-core/loader/$(DEPDIR)/grub_file-lzss.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/loader/lzss.c' object='grub-core/loader/grub_file-lzss.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_file_CPPFLAGS) $(CPPFLAGS) $(grub_file_CFLAGS) $(CFLAGS) -c -o grub-core/loader/grub_file-lzss.o `test -f 'grub-core/loader/lzss.c' || echo '$(srcdir)/'`grub-core/loader/lzss.c grub-core/loader/grub_file-lzss.obj: grub-core/loader/lzss.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_file_CPPFLAGS) $(CPPFLAGS) $(grub_file_CFLAGS) $(CFLAGS) -MT grub-core/loader/grub_file-lzss.obj -MD -MP -MF grub-core/loader/$(DEPDIR)/grub_file-lzss.Tpo -c -o grub-core/loader/grub_file-lzss.obj `if test -f 'grub-core/loader/lzss.c'; then $(CYGPATH_W) 'grub-core/loader/lzss.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/loader/lzss.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/loader/$(DEPDIR)/grub_file-lzss.Tpo grub-core/loader/$(DEPDIR)/grub_file-lzss.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/loader/lzss.c' object='grub-core/loader/grub_file-lzss.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_file_CPPFLAGS) $(CPPFLAGS) $(grub_file_CFLAGS) $(CFLAGS) -c -o grub-core/loader/grub_file-lzss.obj `if test -f 'grub-core/loader/lzss.c'; then $(CYGPATH_W) 'grub-core/loader/lzss.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/loader/lzss.c'; fi` grub-core/loader/grub_file-macho.o: grub-core/loader/macho.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_file_CPPFLAGS) $(CPPFLAGS) $(grub_file_CFLAGS) $(CFLAGS) -MT grub-core/loader/grub_file-macho.o -MD -MP -MF grub-core/loader/$(DEPDIR)/grub_file-macho.Tpo -c -o grub-core/loader/grub_file-macho.o `test -f 'grub-core/loader/macho.c' || echo '$(srcdir)/'`grub-core/loader/macho.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/loader/$(DEPDIR)/grub_file-macho.Tpo grub-core/loader/$(DEPDIR)/grub_file-macho.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/loader/macho.c' object='grub-core/loader/grub_file-macho.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_file_CPPFLAGS) $(CPPFLAGS) $(grub_file_CFLAGS) $(CFLAGS) -c -o grub-core/loader/grub_file-macho.o `test -f 'grub-core/loader/macho.c' || echo '$(srcdir)/'`grub-core/loader/macho.c grub-core/loader/grub_file-macho.obj: grub-core/loader/macho.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_file_CPPFLAGS) $(CPPFLAGS) $(grub_file_CFLAGS) $(CFLAGS) -MT grub-core/loader/grub_file-macho.obj -MD -MP -MF grub-core/loader/$(DEPDIR)/grub_file-macho.Tpo -c -o grub-core/loader/grub_file-macho.obj `if test -f 'grub-core/loader/macho.c'; then $(CYGPATH_W) 'grub-core/loader/macho.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/loader/macho.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/loader/$(DEPDIR)/grub_file-macho.Tpo grub-core/loader/$(DEPDIR)/grub_file-macho.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/loader/macho.c' object='grub-core/loader/grub_file-macho.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_file_CPPFLAGS) $(CPPFLAGS) $(grub_file_CFLAGS) $(CFLAGS) -c -o grub-core/loader/grub_file-macho.obj `if test -f 'grub-core/loader/macho.c'; then $(CYGPATH_W) 'grub-core/loader/macho.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/loader/macho.c'; fi` grub-core/loader/grub_file-macho32.o: grub-core/loader/macho32.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_file_CPPFLAGS) $(CPPFLAGS) $(grub_file_CFLAGS) $(CFLAGS) -MT grub-core/loader/grub_file-macho32.o -MD -MP -MF grub-core/loader/$(DEPDIR)/grub_file-macho32.Tpo -c -o grub-core/loader/grub_file-macho32.o `test -f 'grub-core/loader/macho32.c' || echo '$(srcdir)/'`grub-core/loader/macho32.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/loader/$(DEPDIR)/grub_file-macho32.Tpo grub-core/loader/$(DEPDIR)/grub_file-macho32.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/loader/macho32.c' object='grub-core/loader/grub_file-macho32.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_file_CPPFLAGS) $(CPPFLAGS) $(grub_file_CFLAGS) $(CFLAGS) -c -o grub-core/loader/grub_file-macho32.o `test -f 'grub-core/loader/macho32.c' || echo '$(srcdir)/'`grub-core/loader/macho32.c grub-core/loader/grub_file-macho32.obj: grub-core/loader/macho32.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_file_CPPFLAGS) $(CPPFLAGS) $(grub_file_CFLAGS) $(CFLAGS) -MT grub-core/loader/grub_file-macho32.obj -MD -MP -MF grub-core/loader/$(DEPDIR)/grub_file-macho32.Tpo -c -o grub-core/loader/grub_file-macho32.obj `if test -f 'grub-core/loader/macho32.c'; then $(CYGPATH_W) 'grub-core/loader/macho32.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/loader/macho32.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/loader/$(DEPDIR)/grub_file-macho32.Tpo grub-core/loader/$(DEPDIR)/grub_file-macho32.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/loader/macho32.c' object='grub-core/loader/grub_file-macho32.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_file_CPPFLAGS) $(CPPFLAGS) $(grub_file_CFLAGS) $(CFLAGS) -c -o grub-core/loader/grub_file-macho32.obj `if test -f 'grub-core/loader/macho32.c'; then $(CYGPATH_W) 'grub-core/loader/macho32.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/loader/macho32.c'; fi` grub-core/loader/grub_file-macho64.o: grub-core/loader/macho64.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_file_CPPFLAGS) $(CPPFLAGS) $(grub_file_CFLAGS) $(CFLAGS) -MT grub-core/loader/grub_file-macho64.o -MD -MP -MF grub-core/loader/$(DEPDIR)/grub_file-macho64.Tpo -c -o grub-core/loader/grub_file-macho64.o `test -f 'grub-core/loader/macho64.c' || echo '$(srcdir)/'`grub-core/loader/macho64.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/loader/$(DEPDIR)/grub_file-macho64.Tpo grub-core/loader/$(DEPDIR)/grub_file-macho64.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/loader/macho64.c' object='grub-core/loader/grub_file-macho64.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_file_CPPFLAGS) $(CPPFLAGS) $(grub_file_CFLAGS) $(CFLAGS) -c -o grub-core/loader/grub_file-macho64.o `test -f 'grub-core/loader/macho64.c' || echo '$(srcdir)/'`grub-core/loader/macho64.c grub-core/loader/grub_file-macho64.obj: grub-core/loader/macho64.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_file_CPPFLAGS) $(CPPFLAGS) $(grub_file_CFLAGS) $(CFLAGS) -MT grub-core/loader/grub_file-macho64.obj -MD -MP -MF grub-core/loader/$(DEPDIR)/grub_file-macho64.Tpo -c -o grub-core/loader/grub_file-macho64.obj `if test -f 'grub-core/loader/macho64.c'; then $(CYGPATH_W) 'grub-core/loader/macho64.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/loader/macho64.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/loader/$(DEPDIR)/grub_file-macho64.Tpo grub-core/loader/$(DEPDIR)/grub_file-macho64.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/loader/macho64.c' object='grub-core/loader/grub_file-macho64.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_file_CPPFLAGS) $(CPPFLAGS) $(grub_file_CFLAGS) $(CFLAGS) -c -o grub-core/loader/grub_file-macho64.obj `if test -f 'grub-core/loader/macho64.c'; then $(CYGPATH_W) 'grub-core/loader/macho64.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/loader/macho64.c'; fi` grub-core/osdep/grub_file-init.o: grub-core/osdep/init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_file_CPPFLAGS) $(CPPFLAGS) $(grub_file_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_file-init.o -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_file-init.Tpo -c -o grub-core/osdep/grub_file-init.o `test -f 'grub-core/osdep/init.c' || echo '$(srcdir)/'`grub-core/osdep/init.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_file-init.Tpo grub-core/osdep/$(DEPDIR)/grub_file-init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/init.c' object='grub-core/osdep/grub_file-init.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_file_CPPFLAGS) $(CPPFLAGS) $(grub_file_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_file-init.o `test -f 'grub-core/osdep/init.c' || echo '$(srcdir)/'`grub-core/osdep/init.c grub-core/osdep/grub_file-init.obj: grub-core/osdep/init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_file_CPPFLAGS) $(CPPFLAGS) $(grub_file_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_file-init.obj -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_file-init.Tpo -c -o grub-core/osdep/grub_file-init.obj `if test -f 'grub-core/osdep/init.c'; then $(CYGPATH_W) 'grub-core/osdep/init.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/init.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_file-init.Tpo grub-core/osdep/$(DEPDIR)/grub_file-init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/init.c' object='grub-core/osdep/grub_file-init.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_file_CPPFLAGS) $(CPPFLAGS) $(grub_file_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_file-init.obj `if test -f 'grub-core/osdep/init.c'; then $(CYGPATH_W) 'grub-core/osdep/init.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/init.c'; fi` util/grub_file-grub-file.o: util/grub-file.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_file_CPPFLAGS) $(CPPFLAGS) $(grub_file_CFLAGS) $(CFLAGS) -MT util/grub_file-grub-file.o -MD -MP -MF util/$(DEPDIR)/grub_file-grub-file.Tpo -c -o util/grub_file-grub-file.o `test -f 'util/grub-file.c' || echo '$(srcdir)/'`util/grub-file.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_file-grub-file.Tpo util/$(DEPDIR)/grub_file-grub-file.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-file.c' object='util/grub_file-grub-file.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_file_CPPFLAGS) $(CPPFLAGS) $(grub_file_CFLAGS) $(CFLAGS) -c -o util/grub_file-grub-file.o `test -f 'util/grub-file.c' || echo '$(srcdir)/'`util/grub-file.c util/grub_file-grub-file.obj: util/grub-file.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_file_CPPFLAGS) $(CPPFLAGS) $(grub_file_CFLAGS) $(CFLAGS) -MT util/grub_file-grub-file.obj -MD -MP -MF util/$(DEPDIR)/grub_file-grub-file.Tpo -c -o util/grub_file-grub-file.obj `if test -f 'util/grub-file.c'; then $(CYGPATH_W) 'util/grub-file.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-file.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_file-grub-file.Tpo util/$(DEPDIR)/grub_file-grub-file.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-file.c' object='util/grub_file-grub-file.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_file_CPPFLAGS) $(CPPFLAGS) $(grub_file_CFLAGS) $(CFLAGS) -c -o util/grub_file-grub-file.obj `if test -f 'util/grub-file.c'; then $(CYGPATH_W) 'util/grub-file.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-file.c'; fi` util/grub_file-render-label.o: util/render-label.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_file_CPPFLAGS) $(CPPFLAGS) $(grub_file_CFLAGS) $(CFLAGS) -MT util/grub_file-render-label.o -MD -MP -MF util/$(DEPDIR)/grub_file-render-label.Tpo -c -o util/grub_file-render-label.o `test -f 'util/render-label.c' || echo '$(srcdir)/'`util/render-label.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_file-render-label.Tpo util/$(DEPDIR)/grub_file-render-label.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/render-label.c' object='util/grub_file-render-label.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_file_CPPFLAGS) $(CPPFLAGS) $(grub_file_CFLAGS) $(CFLAGS) -c -o util/grub_file-render-label.o `test -f 'util/render-label.c' || echo '$(srcdir)/'`util/render-label.c util/grub_file-render-label.obj: util/render-label.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_file_CPPFLAGS) $(CPPFLAGS) $(grub_file_CFLAGS) $(CFLAGS) -MT util/grub_file-render-label.obj -MD -MP -MF util/$(DEPDIR)/grub_file-render-label.Tpo -c -o util/grub_file-render-label.obj `if test -f 'util/render-label.c'; then $(CYGPATH_W) 'util/render-label.c'; else $(CYGPATH_W) '$(srcdir)/util/render-label.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_file-render-label.Tpo util/$(DEPDIR)/grub_file-render-label.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/render-label.c' object='util/grub_file-render-label.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_file_CPPFLAGS) $(CPPFLAGS) $(grub_file_CFLAGS) $(CFLAGS) -c -o util/grub_file-render-label.obj `if test -f 'util/render-label.c'; then $(CYGPATH_W) 'util/render-label.c'; else $(CYGPATH_W) '$(srcdir)/util/render-label.c'; fi` grub-core/disk/grub_fstest-host.o: grub-core/disk/host.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_fstest_CPPFLAGS) $(CPPFLAGS) $(grub_fstest_CFLAGS) $(CFLAGS) -MT grub-core/disk/grub_fstest-host.o -MD -MP -MF grub-core/disk/$(DEPDIR)/grub_fstest-host.Tpo -c -o grub-core/disk/grub_fstest-host.o `test -f 'grub-core/disk/host.c' || echo '$(srcdir)/'`grub-core/disk/host.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/disk/$(DEPDIR)/grub_fstest-host.Tpo grub-core/disk/$(DEPDIR)/grub_fstest-host.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/disk/host.c' object='grub-core/disk/grub_fstest-host.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_fstest_CPPFLAGS) $(CPPFLAGS) $(grub_fstest_CFLAGS) $(CFLAGS) -c -o grub-core/disk/grub_fstest-host.o `test -f 'grub-core/disk/host.c' || echo '$(srcdir)/'`grub-core/disk/host.c grub-core/disk/grub_fstest-host.obj: grub-core/disk/host.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_fstest_CPPFLAGS) $(CPPFLAGS) $(grub_fstest_CFLAGS) $(CFLAGS) -MT grub-core/disk/grub_fstest-host.obj -MD -MP -MF grub-core/disk/$(DEPDIR)/grub_fstest-host.Tpo -c -o grub-core/disk/grub_fstest-host.obj `if test -f 'grub-core/disk/host.c'; then $(CYGPATH_W) 'grub-core/disk/host.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/disk/host.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/disk/$(DEPDIR)/grub_fstest-host.Tpo grub-core/disk/$(DEPDIR)/grub_fstest-host.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/disk/host.c' object='grub-core/disk/grub_fstest-host.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_fstest_CPPFLAGS) $(CPPFLAGS) $(grub_fstest_CFLAGS) $(CFLAGS) -c -o grub-core/disk/grub_fstest-host.obj `if test -f 'grub-core/disk/host.c'; then $(CYGPATH_W) 'grub-core/disk/host.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/disk/host.c'; fi` grub-core/kern/emu/grub_fstest-hostfs.o: grub-core/kern/emu/hostfs.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_fstest_CPPFLAGS) $(CPPFLAGS) $(grub_fstest_CFLAGS) $(CFLAGS) -MT grub-core/kern/emu/grub_fstest-hostfs.o -MD -MP -MF grub-core/kern/emu/$(DEPDIR)/grub_fstest-hostfs.Tpo -c -o grub-core/kern/emu/grub_fstest-hostfs.o `test -f 'grub-core/kern/emu/hostfs.c' || echo '$(srcdir)/'`grub-core/kern/emu/hostfs.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/emu/$(DEPDIR)/grub_fstest-hostfs.Tpo grub-core/kern/emu/$(DEPDIR)/grub_fstest-hostfs.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/emu/hostfs.c' object='grub-core/kern/emu/grub_fstest-hostfs.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_fstest_CPPFLAGS) $(CPPFLAGS) $(grub_fstest_CFLAGS) $(CFLAGS) -c -o grub-core/kern/emu/grub_fstest-hostfs.o `test -f 'grub-core/kern/emu/hostfs.c' || echo '$(srcdir)/'`grub-core/kern/emu/hostfs.c grub-core/kern/emu/grub_fstest-hostfs.obj: grub-core/kern/emu/hostfs.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_fstest_CPPFLAGS) $(CPPFLAGS) $(grub_fstest_CFLAGS) $(CFLAGS) -MT grub-core/kern/emu/grub_fstest-hostfs.obj -MD -MP -MF grub-core/kern/emu/$(DEPDIR)/grub_fstest-hostfs.Tpo -c -o grub-core/kern/emu/grub_fstest-hostfs.obj `if test -f 'grub-core/kern/emu/hostfs.c'; then $(CYGPATH_W) 'grub-core/kern/emu/hostfs.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/emu/hostfs.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/emu/$(DEPDIR)/grub_fstest-hostfs.Tpo grub-core/kern/emu/$(DEPDIR)/grub_fstest-hostfs.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/emu/hostfs.c' object='grub-core/kern/emu/grub_fstest-hostfs.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_fstest_CPPFLAGS) $(CPPFLAGS) $(grub_fstest_CFLAGS) $(CFLAGS) -c -o grub-core/kern/emu/grub_fstest-hostfs.obj `if test -f 'grub-core/kern/emu/hostfs.c'; then $(CYGPATH_W) 'grub-core/kern/emu/hostfs.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/emu/hostfs.c'; fi` grub-core/osdep/grub_fstest-init.o: grub-core/osdep/init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_fstest_CPPFLAGS) $(CPPFLAGS) $(grub_fstest_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_fstest-init.o -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_fstest-init.Tpo -c -o grub-core/osdep/grub_fstest-init.o `test -f 'grub-core/osdep/init.c' || echo '$(srcdir)/'`grub-core/osdep/init.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_fstest-init.Tpo grub-core/osdep/$(DEPDIR)/grub_fstest-init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/init.c' object='grub-core/osdep/grub_fstest-init.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_fstest_CPPFLAGS) $(CPPFLAGS) $(grub_fstest_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_fstest-init.o `test -f 'grub-core/osdep/init.c' || echo '$(srcdir)/'`grub-core/osdep/init.c grub-core/osdep/grub_fstest-init.obj: grub-core/osdep/init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_fstest_CPPFLAGS) $(CPPFLAGS) $(grub_fstest_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_fstest-init.obj -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_fstest-init.Tpo -c -o grub-core/osdep/grub_fstest-init.obj `if test -f 'grub-core/osdep/init.c'; then $(CYGPATH_W) 'grub-core/osdep/init.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/init.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_fstest-init.Tpo grub-core/osdep/$(DEPDIR)/grub_fstest-init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/init.c' object='grub-core/osdep/grub_fstest-init.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_fstest_CPPFLAGS) $(CPPFLAGS) $(grub_fstest_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_fstest-init.obj `if test -f 'grub-core/osdep/init.c'; then $(CYGPATH_W) 'grub-core/osdep/init.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/init.c'; fi` util/grub_fstest-grub-fstest.o: util/grub-fstest.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_fstest_CPPFLAGS) $(CPPFLAGS) $(grub_fstest_CFLAGS) $(CFLAGS) -MT util/grub_fstest-grub-fstest.o -MD -MP -MF util/$(DEPDIR)/grub_fstest-grub-fstest.Tpo -c -o util/grub_fstest-grub-fstest.o `test -f 'util/grub-fstest.c' || echo '$(srcdir)/'`util/grub-fstest.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_fstest-grub-fstest.Tpo util/$(DEPDIR)/grub_fstest-grub-fstest.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-fstest.c' object='util/grub_fstest-grub-fstest.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_fstest_CPPFLAGS) $(CPPFLAGS) $(grub_fstest_CFLAGS) $(CFLAGS) -c -o util/grub_fstest-grub-fstest.o `test -f 'util/grub-fstest.c' || echo '$(srcdir)/'`util/grub-fstest.c util/grub_fstest-grub-fstest.obj: util/grub-fstest.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_fstest_CPPFLAGS) $(CPPFLAGS) $(grub_fstest_CFLAGS) $(CFLAGS) -MT util/grub_fstest-grub-fstest.obj -MD -MP -MF util/$(DEPDIR)/grub_fstest-grub-fstest.Tpo -c -o util/grub_fstest-grub-fstest.obj `if test -f 'util/grub-fstest.c'; then $(CYGPATH_W) 'util/grub-fstest.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-fstest.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_fstest-grub-fstest.Tpo util/$(DEPDIR)/grub_fstest-grub-fstest.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-fstest.c' object='util/grub_fstest-grub-fstest.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_fstest_CPPFLAGS) $(CPPFLAGS) $(grub_fstest_CFLAGS) $(CFLAGS) -c -o util/grub_fstest-grub-fstest.obj `if test -f 'util/grub-fstest.c'; then $(CYGPATH_W) 'util/grub-fstest.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-fstest.c'; fi` grub_fstest-grub_fstest_init.o: grub_fstest_init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_fstest_CPPFLAGS) $(CPPFLAGS) $(grub_fstest_CFLAGS) $(CFLAGS) -MT grub_fstest-grub_fstest_init.o -MD -MP -MF $(DEPDIR)/grub_fstest-grub_fstest_init.Tpo -c -o grub_fstest-grub_fstest_init.o `test -f 'grub_fstest_init.c' || echo '$(srcdir)/'`grub_fstest_init.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/grub_fstest-grub_fstest_init.Tpo $(DEPDIR)/grub_fstest-grub_fstest_init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub_fstest_init.c' object='grub_fstest-grub_fstest_init.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_fstest_CPPFLAGS) $(CPPFLAGS) $(grub_fstest_CFLAGS) $(CFLAGS) -c -o grub_fstest-grub_fstest_init.o `test -f 'grub_fstest_init.c' || echo '$(srcdir)/'`grub_fstest_init.c grub_fstest-grub_fstest_init.obj: grub_fstest_init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_fstest_CPPFLAGS) $(CPPFLAGS) $(grub_fstest_CFLAGS) $(CFLAGS) -MT grub_fstest-grub_fstest_init.obj -MD -MP -MF $(DEPDIR)/grub_fstest-grub_fstest_init.Tpo -c -o grub_fstest-grub_fstest_init.obj `if test -f 'grub_fstest_init.c'; then $(CYGPATH_W) 'grub_fstest_init.c'; else $(CYGPATH_W) '$(srcdir)/grub_fstest_init.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/grub_fstest-grub_fstest_init.Tpo $(DEPDIR)/grub_fstest-grub_fstest_init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub_fstest_init.c' object='grub_fstest-grub_fstest_init.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_fstest_CPPFLAGS) $(CPPFLAGS) $(grub_fstest_CFLAGS) $(CFLAGS) -c -o grub_fstest-grub_fstest_init.obj `if test -f 'grub_fstest_init.c'; then $(CYGPATH_W) 'grub_fstest_init.c'; else $(CYGPATH_W) '$(srcdir)/grub_fstest_init.c'; fi` grub-core/kern/emu/grub_glue_efi-argp_common.o: grub-core/kern/emu/argp_common.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_glue_efi_CPPFLAGS) $(CPPFLAGS) $(grub_glue_efi_CFLAGS) $(CFLAGS) -MT grub-core/kern/emu/grub_glue_efi-argp_common.o -MD -MP -MF grub-core/kern/emu/$(DEPDIR)/grub_glue_efi-argp_common.Tpo -c -o grub-core/kern/emu/grub_glue_efi-argp_common.o `test -f 'grub-core/kern/emu/argp_common.c' || echo '$(srcdir)/'`grub-core/kern/emu/argp_common.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/emu/$(DEPDIR)/grub_glue_efi-argp_common.Tpo grub-core/kern/emu/$(DEPDIR)/grub_glue_efi-argp_common.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/emu/argp_common.c' object='grub-core/kern/emu/grub_glue_efi-argp_common.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_glue_efi_CPPFLAGS) $(CPPFLAGS) $(grub_glue_efi_CFLAGS) $(CFLAGS) -c -o grub-core/kern/emu/grub_glue_efi-argp_common.o `test -f 'grub-core/kern/emu/argp_common.c' || echo '$(srcdir)/'`grub-core/kern/emu/argp_common.c grub-core/kern/emu/grub_glue_efi-argp_common.obj: grub-core/kern/emu/argp_common.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_glue_efi_CPPFLAGS) $(CPPFLAGS) $(grub_glue_efi_CFLAGS) $(CFLAGS) -MT grub-core/kern/emu/grub_glue_efi-argp_common.obj -MD -MP -MF grub-core/kern/emu/$(DEPDIR)/grub_glue_efi-argp_common.Tpo -c -o grub-core/kern/emu/grub_glue_efi-argp_common.obj `if test -f 'grub-core/kern/emu/argp_common.c'; then $(CYGPATH_W) 'grub-core/kern/emu/argp_common.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/emu/argp_common.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/emu/$(DEPDIR)/grub_glue_efi-argp_common.Tpo grub-core/kern/emu/$(DEPDIR)/grub_glue_efi-argp_common.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/emu/argp_common.c' object='grub-core/kern/emu/grub_glue_efi-argp_common.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_glue_efi_CPPFLAGS) $(CPPFLAGS) $(grub_glue_efi_CFLAGS) $(CFLAGS) -c -o grub-core/kern/emu/grub_glue_efi-argp_common.obj `if test -f 'grub-core/kern/emu/argp_common.c'; then $(CYGPATH_W) 'grub-core/kern/emu/argp_common.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/emu/argp_common.c'; fi` grub-core/osdep/grub_glue_efi-init.o: grub-core/osdep/init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_glue_efi_CPPFLAGS) $(CPPFLAGS) $(grub_glue_efi_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_glue_efi-init.o -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_glue_efi-init.Tpo -c -o grub-core/osdep/grub_glue_efi-init.o `test -f 'grub-core/osdep/init.c' || echo '$(srcdir)/'`grub-core/osdep/init.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_glue_efi-init.Tpo grub-core/osdep/$(DEPDIR)/grub_glue_efi-init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/init.c' object='grub-core/osdep/grub_glue_efi-init.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_glue_efi_CPPFLAGS) $(CPPFLAGS) $(grub_glue_efi_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_glue_efi-init.o `test -f 'grub-core/osdep/init.c' || echo '$(srcdir)/'`grub-core/osdep/init.c grub-core/osdep/grub_glue_efi-init.obj: grub-core/osdep/init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_glue_efi_CPPFLAGS) $(CPPFLAGS) $(grub_glue_efi_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_glue_efi-init.obj -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_glue_efi-init.Tpo -c -o grub-core/osdep/grub_glue_efi-init.obj `if test -f 'grub-core/osdep/init.c'; then $(CYGPATH_W) 'grub-core/osdep/init.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/init.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_glue_efi-init.Tpo grub-core/osdep/$(DEPDIR)/grub_glue_efi-init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/init.c' object='grub-core/osdep/grub_glue_efi-init.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_glue_efi_CPPFLAGS) $(CPPFLAGS) $(grub_glue_efi_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_glue_efi-init.obj `if test -f 'grub-core/osdep/init.c'; then $(CYGPATH_W) 'grub-core/osdep/init.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/init.c'; fi` util/grub_glue_efi-glue-efi.o: util/glue-efi.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_glue_efi_CPPFLAGS) $(CPPFLAGS) $(grub_glue_efi_CFLAGS) $(CFLAGS) -MT util/grub_glue_efi-glue-efi.o -MD -MP -MF util/$(DEPDIR)/grub_glue_efi-glue-efi.Tpo -c -o util/grub_glue_efi-glue-efi.o `test -f 'util/glue-efi.c' || echo '$(srcdir)/'`util/glue-efi.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_glue_efi-glue-efi.Tpo util/$(DEPDIR)/grub_glue_efi-glue-efi.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/glue-efi.c' object='util/grub_glue_efi-glue-efi.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_glue_efi_CPPFLAGS) $(CPPFLAGS) $(grub_glue_efi_CFLAGS) $(CFLAGS) -c -o util/grub_glue_efi-glue-efi.o `test -f 'util/glue-efi.c' || echo '$(srcdir)/'`util/glue-efi.c util/grub_glue_efi-glue-efi.obj: util/glue-efi.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_glue_efi_CPPFLAGS) $(CPPFLAGS) $(grub_glue_efi_CFLAGS) $(CFLAGS) -MT util/grub_glue_efi-glue-efi.obj -MD -MP -MF util/$(DEPDIR)/grub_glue_efi-glue-efi.Tpo -c -o util/grub_glue_efi-glue-efi.obj `if test -f 'util/glue-efi.c'; then $(CYGPATH_W) 'util/glue-efi.c'; else $(CYGPATH_W) '$(srcdir)/util/glue-efi.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_glue_efi-glue-efi.Tpo util/$(DEPDIR)/grub_glue_efi-glue-efi.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/glue-efi.c' object='util/grub_glue_efi-glue-efi.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_glue_efi_CPPFLAGS) $(CPPFLAGS) $(grub_glue_efi_CFLAGS) $(CFLAGS) -c -o util/grub_glue_efi-glue-efi.obj `if test -f 'util/glue-efi.c'; then $(CYGPATH_W) 'util/glue-efi.c'; else $(CYGPATH_W) '$(srcdir)/util/glue-efi.c'; fi` util/grub_glue_efi-grub-glue-efi.o: util/grub-glue-efi.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_glue_efi_CPPFLAGS) $(CPPFLAGS) $(grub_glue_efi_CFLAGS) $(CFLAGS) -MT util/grub_glue_efi-grub-glue-efi.o -MD -MP -MF util/$(DEPDIR)/grub_glue_efi-grub-glue-efi.Tpo -c -o util/grub_glue_efi-grub-glue-efi.o `test -f 'util/grub-glue-efi.c' || echo '$(srcdir)/'`util/grub-glue-efi.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_glue_efi-grub-glue-efi.Tpo util/$(DEPDIR)/grub_glue_efi-grub-glue-efi.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-glue-efi.c' object='util/grub_glue_efi-grub-glue-efi.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_glue_efi_CPPFLAGS) $(CPPFLAGS) $(grub_glue_efi_CFLAGS) $(CFLAGS) -c -o util/grub_glue_efi-grub-glue-efi.o `test -f 'util/grub-glue-efi.c' || echo '$(srcdir)/'`util/grub-glue-efi.c util/grub_glue_efi-grub-glue-efi.obj: util/grub-glue-efi.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_glue_efi_CPPFLAGS) $(CPPFLAGS) $(grub_glue_efi_CFLAGS) $(CFLAGS) -MT util/grub_glue_efi-grub-glue-efi.obj -MD -MP -MF util/$(DEPDIR)/grub_glue_efi-grub-glue-efi.Tpo -c -o util/grub_glue_efi-grub-glue-efi.obj `if test -f 'util/grub-glue-efi.c'; then $(CYGPATH_W) 'util/grub-glue-efi.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-glue-efi.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_glue_efi-grub-glue-efi.Tpo util/$(DEPDIR)/grub_glue_efi-grub-glue-efi.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-glue-efi.c' object='util/grub_glue_efi-grub-glue-efi.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_glue_efi_CPPFLAGS) $(CPPFLAGS) $(grub_glue_efi_CFLAGS) $(CFLAGS) -c -o util/grub_glue_efi-grub-glue-efi.obj `if test -f 'util/grub-glue-efi.c'; then $(CYGPATH_W) 'util/grub-glue-efi.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-glue-efi.c'; fi` grub-core/disk/grub_install-host.o: grub-core/disk/host.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -MT grub-core/disk/grub_install-host.o -MD -MP -MF grub-core/disk/$(DEPDIR)/grub_install-host.Tpo -c -o grub-core/disk/grub_install-host.o `test -f 'grub-core/disk/host.c' || echo '$(srcdir)/'`grub-core/disk/host.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/disk/$(DEPDIR)/grub_install-host.Tpo grub-core/disk/$(DEPDIR)/grub_install-host.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/disk/host.c' object='grub-core/disk/grub_install-host.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -c -o grub-core/disk/grub_install-host.o `test -f 'grub-core/disk/host.c' || echo '$(srcdir)/'`grub-core/disk/host.c grub-core/disk/grub_install-host.obj: grub-core/disk/host.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -MT grub-core/disk/grub_install-host.obj -MD -MP -MF grub-core/disk/$(DEPDIR)/grub_install-host.Tpo -c -o grub-core/disk/grub_install-host.obj `if test -f 'grub-core/disk/host.c'; then $(CYGPATH_W) 'grub-core/disk/host.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/disk/host.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/disk/$(DEPDIR)/grub_install-host.Tpo grub-core/disk/$(DEPDIR)/grub_install-host.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/disk/host.c' object='grub-core/disk/grub_install-host.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -c -o grub-core/disk/grub_install-host.obj `if test -f 'grub-core/disk/host.c'; then $(CYGPATH_W) 'grub-core/disk/host.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/disk/host.c'; fi` grub-core/kern/emu/grub_install-argp_common.o: grub-core/kern/emu/argp_common.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -MT grub-core/kern/emu/grub_install-argp_common.o -MD -MP -MF grub-core/kern/emu/$(DEPDIR)/grub_install-argp_common.Tpo -c -o grub-core/kern/emu/grub_install-argp_common.o `test -f 'grub-core/kern/emu/argp_common.c' || echo '$(srcdir)/'`grub-core/kern/emu/argp_common.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/emu/$(DEPDIR)/grub_install-argp_common.Tpo grub-core/kern/emu/$(DEPDIR)/grub_install-argp_common.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/emu/argp_common.c' object='grub-core/kern/emu/grub_install-argp_common.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -c -o grub-core/kern/emu/grub_install-argp_common.o `test -f 'grub-core/kern/emu/argp_common.c' || echo '$(srcdir)/'`grub-core/kern/emu/argp_common.c grub-core/kern/emu/grub_install-argp_common.obj: grub-core/kern/emu/argp_common.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -MT grub-core/kern/emu/grub_install-argp_common.obj -MD -MP -MF grub-core/kern/emu/$(DEPDIR)/grub_install-argp_common.Tpo -c -o grub-core/kern/emu/grub_install-argp_common.obj `if test -f 'grub-core/kern/emu/argp_common.c'; then $(CYGPATH_W) 'grub-core/kern/emu/argp_common.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/emu/argp_common.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/emu/$(DEPDIR)/grub_install-argp_common.Tpo grub-core/kern/emu/$(DEPDIR)/grub_install-argp_common.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/emu/argp_common.c' object='grub-core/kern/emu/grub_install-argp_common.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -c -o grub-core/kern/emu/grub_install-argp_common.obj `if test -f 'grub-core/kern/emu/argp_common.c'; then $(CYGPATH_W) 'grub-core/kern/emu/argp_common.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/emu/argp_common.c'; fi` grub-core/kern/emu/grub_install-hostfs.o: grub-core/kern/emu/hostfs.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -MT grub-core/kern/emu/grub_install-hostfs.o -MD -MP -MF grub-core/kern/emu/$(DEPDIR)/grub_install-hostfs.Tpo -c -o grub-core/kern/emu/grub_install-hostfs.o `test -f 'grub-core/kern/emu/hostfs.c' || echo '$(srcdir)/'`grub-core/kern/emu/hostfs.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/emu/$(DEPDIR)/grub_install-hostfs.Tpo grub-core/kern/emu/$(DEPDIR)/grub_install-hostfs.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/emu/hostfs.c' object='grub-core/kern/emu/grub_install-hostfs.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -c -o grub-core/kern/emu/grub_install-hostfs.o `test -f 'grub-core/kern/emu/hostfs.c' || echo '$(srcdir)/'`grub-core/kern/emu/hostfs.c grub-core/kern/emu/grub_install-hostfs.obj: grub-core/kern/emu/hostfs.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -MT grub-core/kern/emu/grub_install-hostfs.obj -MD -MP -MF grub-core/kern/emu/$(DEPDIR)/grub_install-hostfs.Tpo -c -o grub-core/kern/emu/grub_install-hostfs.obj `if test -f 'grub-core/kern/emu/hostfs.c'; then $(CYGPATH_W) 'grub-core/kern/emu/hostfs.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/emu/hostfs.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/emu/$(DEPDIR)/grub_install-hostfs.Tpo grub-core/kern/emu/$(DEPDIR)/grub_install-hostfs.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/emu/hostfs.c' object='grub-core/kern/emu/grub_install-hostfs.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -c -o grub-core/kern/emu/grub_install-hostfs.obj `if test -f 'grub-core/kern/emu/hostfs.c'; then $(CYGPATH_W) 'grub-core/kern/emu/hostfs.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/emu/hostfs.c'; fi` grub-core/lib/grub_install-reed_solomon.o: grub-core/lib/reed_solomon.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -MT grub-core/lib/grub_install-reed_solomon.o -MD -MP -MF grub-core/lib/$(DEPDIR)/grub_install-reed_solomon.Tpo -c -o grub-core/lib/grub_install-reed_solomon.o `test -f 'grub-core/lib/reed_solomon.c' || echo '$(srcdir)/'`grub-core/lib/reed_solomon.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/$(DEPDIR)/grub_install-reed_solomon.Tpo grub-core/lib/$(DEPDIR)/grub_install-reed_solomon.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/reed_solomon.c' object='grub-core/lib/grub_install-reed_solomon.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -c -o grub-core/lib/grub_install-reed_solomon.o `test -f 'grub-core/lib/reed_solomon.c' || echo '$(srcdir)/'`grub-core/lib/reed_solomon.c grub-core/lib/grub_install-reed_solomon.obj: grub-core/lib/reed_solomon.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -MT grub-core/lib/grub_install-reed_solomon.obj -MD -MP -MF grub-core/lib/$(DEPDIR)/grub_install-reed_solomon.Tpo -c -o grub-core/lib/grub_install-reed_solomon.obj `if test -f 'grub-core/lib/reed_solomon.c'; then $(CYGPATH_W) 'grub-core/lib/reed_solomon.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/reed_solomon.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/$(DEPDIR)/grub_install-reed_solomon.Tpo grub-core/lib/$(DEPDIR)/grub_install-reed_solomon.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/reed_solomon.c' object='grub-core/lib/grub_install-reed_solomon.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -c -o grub-core/lib/grub_install-reed_solomon.obj `if test -f 'grub-core/lib/reed_solomon.c'; then $(CYGPATH_W) 'grub-core/lib/reed_solomon.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/reed_solomon.c'; fi` grub-core/osdep/grub_install-blocklist.o: grub-core/osdep/blocklist.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_install-blocklist.o -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_install-blocklist.Tpo -c -o grub-core/osdep/grub_install-blocklist.o `test -f 'grub-core/osdep/blocklist.c' || echo '$(srcdir)/'`grub-core/osdep/blocklist.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_install-blocklist.Tpo grub-core/osdep/$(DEPDIR)/grub_install-blocklist.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/blocklist.c' object='grub-core/osdep/grub_install-blocklist.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_install-blocklist.o `test -f 'grub-core/osdep/blocklist.c' || echo '$(srcdir)/'`grub-core/osdep/blocklist.c grub-core/osdep/grub_install-blocklist.obj: grub-core/osdep/blocklist.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_install-blocklist.obj -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_install-blocklist.Tpo -c -o grub-core/osdep/grub_install-blocklist.obj `if test -f 'grub-core/osdep/blocklist.c'; then $(CYGPATH_W) 'grub-core/osdep/blocklist.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/blocklist.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_install-blocklist.Tpo grub-core/osdep/$(DEPDIR)/grub_install-blocklist.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/blocklist.c' object='grub-core/osdep/grub_install-blocklist.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_install-blocklist.obj `if test -f 'grub-core/osdep/blocklist.c'; then $(CYGPATH_W) 'grub-core/osdep/blocklist.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/blocklist.c'; fi` grub-core/osdep/grub_install-compress.o: grub-core/osdep/compress.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_install-compress.o -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_install-compress.Tpo -c -o grub-core/osdep/grub_install-compress.o `test -f 'grub-core/osdep/compress.c' || echo '$(srcdir)/'`grub-core/osdep/compress.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_install-compress.Tpo grub-core/osdep/$(DEPDIR)/grub_install-compress.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/compress.c' object='grub-core/osdep/grub_install-compress.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_install-compress.o `test -f 'grub-core/osdep/compress.c' || echo '$(srcdir)/'`grub-core/osdep/compress.c grub-core/osdep/grub_install-compress.obj: grub-core/osdep/compress.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_install-compress.obj -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_install-compress.Tpo -c -o grub-core/osdep/grub_install-compress.obj `if test -f 'grub-core/osdep/compress.c'; then $(CYGPATH_W) 'grub-core/osdep/compress.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/compress.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_install-compress.Tpo grub-core/osdep/$(DEPDIR)/grub_install-compress.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/compress.c' object='grub-core/osdep/grub_install-compress.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_install-compress.obj `if test -f 'grub-core/osdep/compress.c'; then $(CYGPATH_W) 'grub-core/osdep/compress.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/compress.c'; fi` grub-core/osdep/grub_install-config.o: grub-core/osdep/config.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_install-config.o -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_install-config.Tpo -c -o grub-core/osdep/grub_install-config.o `test -f 'grub-core/osdep/config.c' || echo '$(srcdir)/'`grub-core/osdep/config.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_install-config.Tpo grub-core/osdep/$(DEPDIR)/grub_install-config.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/config.c' object='grub-core/osdep/grub_install-config.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_install-config.o `test -f 'grub-core/osdep/config.c' || echo '$(srcdir)/'`grub-core/osdep/config.c grub-core/osdep/grub_install-config.obj: grub-core/osdep/config.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_install-config.obj -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_install-config.Tpo -c -o grub-core/osdep/grub_install-config.obj `if test -f 'grub-core/osdep/config.c'; then $(CYGPATH_W) 'grub-core/osdep/config.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/config.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_install-config.Tpo grub-core/osdep/$(DEPDIR)/grub_install-config.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/config.c' object='grub-core/osdep/grub_install-config.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_install-config.obj `if test -f 'grub-core/osdep/config.c'; then $(CYGPATH_W) 'grub-core/osdep/config.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/config.c'; fi` grub-core/osdep/grub_install-init.o: grub-core/osdep/init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_install-init.o -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_install-init.Tpo -c -o grub-core/osdep/grub_install-init.o `test -f 'grub-core/osdep/init.c' || echo '$(srcdir)/'`grub-core/osdep/init.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_install-init.Tpo grub-core/osdep/$(DEPDIR)/grub_install-init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/init.c' object='grub-core/osdep/grub_install-init.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_install-init.o `test -f 'grub-core/osdep/init.c' || echo '$(srcdir)/'`grub-core/osdep/init.c grub-core/osdep/grub_install-init.obj: grub-core/osdep/init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_install-init.obj -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_install-init.Tpo -c -o grub-core/osdep/grub_install-init.obj `if test -f 'grub-core/osdep/init.c'; then $(CYGPATH_W) 'grub-core/osdep/init.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/init.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_install-init.Tpo grub-core/osdep/$(DEPDIR)/grub_install-init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/init.c' object='grub-core/osdep/grub_install-init.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_install-init.obj `if test -f 'grub-core/osdep/init.c'; then $(CYGPATH_W) 'grub-core/osdep/init.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/init.c'; fi` grub-core/osdep/grub_install-ofpath.o: grub-core/osdep/ofpath.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_install-ofpath.o -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_install-ofpath.Tpo -c -o grub-core/osdep/grub_install-ofpath.o `test -f 'grub-core/osdep/ofpath.c' || echo '$(srcdir)/'`grub-core/osdep/ofpath.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_install-ofpath.Tpo grub-core/osdep/$(DEPDIR)/grub_install-ofpath.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/ofpath.c' object='grub-core/osdep/grub_install-ofpath.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_install-ofpath.o `test -f 'grub-core/osdep/ofpath.c' || echo '$(srcdir)/'`grub-core/osdep/ofpath.c grub-core/osdep/grub_install-ofpath.obj: grub-core/osdep/ofpath.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_install-ofpath.obj -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_install-ofpath.Tpo -c -o grub-core/osdep/grub_install-ofpath.obj `if test -f 'grub-core/osdep/ofpath.c'; then $(CYGPATH_W) 'grub-core/osdep/ofpath.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/ofpath.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_install-ofpath.Tpo grub-core/osdep/$(DEPDIR)/grub_install-ofpath.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/ofpath.c' object='grub-core/osdep/grub_install-ofpath.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_install-ofpath.obj `if test -f 'grub-core/osdep/ofpath.c'; then $(CYGPATH_W) 'grub-core/osdep/ofpath.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/ofpath.c'; fi` grub-core/osdep/grub_install-platform.o: grub-core/osdep/platform.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_install-platform.o -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_install-platform.Tpo -c -o grub-core/osdep/grub_install-platform.o `test -f 'grub-core/osdep/platform.c' || echo '$(srcdir)/'`grub-core/osdep/platform.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_install-platform.Tpo grub-core/osdep/$(DEPDIR)/grub_install-platform.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/platform.c' object='grub-core/osdep/grub_install-platform.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_install-platform.o `test -f 'grub-core/osdep/platform.c' || echo '$(srcdir)/'`grub-core/osdep/platform.c grub-core/osdep/grub_install-platform.obj: grub-core/osdep/platform.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_install-platform.obj -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_install-platform.Tpo -c -o grub-core/osdep/grub_install-platform.obj `if test -f 'grub-core/osdep/platform.c'; then $(CYGPATH_W) 'grub-core/osdep/platform.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/platform.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_install-platform.Tpo grub-core/osdep/$(DEPDIR)/grub_install-platform.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/platform.c' object='grub-core/osdep/grub_install-platform.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_install-platform.obj `if test -f 'grub-core/osdep/platform.c'; then $(CYGPATH_W) 'grub-core/osdep/platform.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/platform.c'; fi` grub-core/osdep/grub_install-platform_unix.o: grub-core/osdep/platform_unix.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_install-platform_unix.o -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_install-platform_unix.Tpo -c -o grub-core/osdep/grub_install-platform_unix.o `test -f 'grub-core/osdep/platform_unix.c' || echo '$(srcdir)/'`grub-core/osdep/platform_unix.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_install-platform_unix.Tpo grub-core/osdep/$(DEPDIR)/grub_install-platform_unix.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/platform_unix.c' object='grub-core/osdep/grub_install-platform_unix.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_install-platform_unix.o `test -f 'grub-core/osdep/platform_unix.c' || echo '$(srcdir)/'`grub-core/osdep/platform_unix.c grub-core/osdep/grub_install-platform_unix.obj: grub-core/osdep/platform_unix.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_install-platform_unix.obj -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_install-platform_unix.Tpo -c -o grub-core/osdep/grub_install-platform_unix.obj `if test -f 'grub-core/osdep/platform_unix.c'; then $(CYGPATH_W) 'grub-core/osdep/platform_unix.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/platform_unix.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_install-platform_unix.Tpo grub-core/osdep/$(DEPDIR)/grub_install-platform_unix.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/platform_unix.c' object='grub-core/osdep/grub_install-platform_unix.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_install-platform_unix.obj `if test -f 'grub-core/osdep/platform_unix.c'; then $(CYGPATH_W) 'grub-core/osdep/platform_unix.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/platform_unix.c'; fi` grub-core/osdep/grub_install-random.o: grub-core/osdep/random.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_install-random.o -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_install-random.Tpo -c -o grub-core/osdep/grub_install-random.o `test -f 'grub-core/osdep/random.c' || echo '$(srcdir)/'`grub-core/osdep/random.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_install-random.Tpo grub-core/osdep/$(DEPDIR)/grub_install-random.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/random.c' object='grub-core/osdep/grub_install-random.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_install-random.o `test -f 'grub-core/osdep/random.c' || echo '$(srcdir)/'`grub-core/osdep/random.c grub-core/osdep/grub_install-random.obj: grub-core/osdep/random.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_install-random.obj -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_install-random.Tpo -c -o grub-core/osdep/grub_install-random.obj `if test -f 'grub-core/osdep/random.c'; then $(CYGPATH_W) 'grub-core/osdep/random.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/random.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_install-random.Tpo grub-core/osdep/$(DEPDIR)/grub_install-random.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/random.c' object='grub-core/osdep/grub_install-random.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_install-random.obj `if test -f 'grub-core/osdep/random.c'; then $(CYGPATH_W) 'grub-core/osdep/random.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/random.c'; fi` util/grub_install-config.o: util/config.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -MT util/grub_install-config.o -MD -MP -MF util/$(DEPDIR)/grub_install-config.Tpo -c -o util/grub_install-config.o `test -f 'util/config.c' || echo '$(srcdir)/'`util/config.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_install-config.Tpo util/$(DEPDIR)/grub_install-config.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/config.c' object='util/grub_install-config.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -c -o util/grub_install-config.o `test -f 'util/config.c' || echo '$(srcdir)/'`util/config.c util/grub_install-config.obj: util/config.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -MT util/grub_install-config.obj -MD -MP -MF util/$(DEPDIR)/grub_install-config.Tpo -c -o util/grub_install-config.obj `if test -f 'util/config.c'; then $(CYGPATH_W) 'util/config.c'; else $(CYGPATH_W) '$(srcdir)/util/config.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_install-config.Tpo util/$(DEPDIR)/grub_install-config.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/config.c' object='util/grub_install-config.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -c -o util/grub_install-config.obj `if test -f 'util/config.c'; then $(CYGPATH_W) 'util/config.c'; else $(CYGPATH_W) '$(srcdir)/util/config.c'; fi` util/grub_install-editenv.o: util/editenv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -MT util/grub_install-editenv.o -MD -MP -MF util/$(DEPDIR)/grub_install-editenv.Tpo -c -o util/grub_install-editenv.o `test -f 'util/editenv.c' || echo '$(srcdir)/'`util/editenv.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_install-editenv.Tpo util/$(DEPDIR)/grub_install-editenv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/editenv.c' object='util/grub_install-editenv.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -c -o util/grub_install-editenv.o `test -f 'util/editenv.c' || echo '$(srcdir)/'`util/editenv.c util/grub_install-editenv.obj: util/editenv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -MT util/grub_install-editenv.obj -MD -MP -MF util/$(DEPDIR)/grub_install-editenv.Tpo -c -o util/grub_install-editenv.obj `if test -f 'util/editenv.c'; then $(CYGPATH_W) 'util/editenv.c'; else $(CYGPATH_W) '$(srcdir)/util/editenv.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_install-editenv.Tpo util/$(DEPDIR)/grub_install-editenv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/editenv.c' object='util/grub_install-editenv.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -c -o util/grub_install-editenv.obj `if test -f 'util/editenv.c'; then $(CYGPATH_W) 'util/editenv.c'; else $(CYGPATH_W) '$(srcdir)/util/editenv.c'; fi` util/grub_install-grub-install-common.o: util/grub-install-common.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -MT util/grub_install-grub-install-common.o -MD -MP -MF util/$(DEPDIR)/grub_install-grub-install-common.Tpo -c -o util/grub_install-grub-install-common.o `test -f 'util/grub-install-common.c' || echo '$(srcdir)/'`util/grub-install-common.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_install-grub-install-common.Tpo util/$(DEPDIR)/grub_install-grub-install-common.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-install-common.c' object='util/grub_install-grub-install-common.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -c -o util/grub_install-grub-install-common.o `test -f 'util/grub-install-common.c' || echo '$(srcdir)/'`util/grub-install-common.c util/grub_install-grub-install-common.obj: util/grub-install-common.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -MT util/grub_install-grub-install-common.obj -MD -MP -MF util/$(DEPDIR)/grub_install-grub-install-common.Tpo -c -o util/grub_install-grub-install-common.obj `if test -f 'util/grub-install-common.c'; then $(CYGPATH_W) 'util/grub-install-common.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-install-common.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_install-grub-install-common.Tpo util/$(DEPDIR)/grub_install-grub-install-common.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-install-common.c' object='util/grub_install-grub-install-common.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -c -o util/grub_install-grub-install-common.obj `if test -f 'util/grub-install-common.c'; then $(CYGPATH_W) 'util/grub-install-common.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-install-common.c'; fi` util/grub_install-grub-install.o: util/grub-install.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -MT util/grub_install-grub-install.o -MD -MP -MF util/$(DEPDIR)/grub_install-grub-install.Tpo -c -o util/grub_install-grub-install.o `test -f 'util/grub-install.c' || echo '$(srcdir)/'`util/grub-install.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_install-grub-install.Tpo util/$(DEPDIR)/grub_install-grub-install.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-install.c' object='util/grub_install-grub-install.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -c -o util/grub_install-grub-install.o `test -f 'util/grub-install.c' || echo '$(srcdir)/'`util/grub-install.c util/grub_install-grub-install.obj: util/grub-install.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -MT util/grub_install-grub-install.obj -MD -MP -MF util/$(DEPDIR)/grub_install-grub-install.Tpo -c -o util/grub_install-grub-install.obj `if test -f 'util/grub-install.c'; then $(CYGPATH_W) 'util/grub-install.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-install.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_install-grub-install.Tpo util/$(DEPDIR)/grub_install-grub-install.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-install.c' object='util/grub_install-grub-install.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -c -o util/grub_install-grub-install.obj `if test -f 'util/grub-install.c'; then $(CYGPATH_W) 'util/grub-install.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-install.c'; fi` util/grub_install-grub-mkimage32.o: util/grub-mkimage32.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -MT util/grub_install-grub-mkimage32.o -MD -MP -MF util/$(DEPDIR)/grub_install-grub-mkimage32.Tpo -c -o util/grub_install-grub-mkimage32.o `test -f 'util/grub-mkimage32.c' || echo '$(srcdir)/'`util/grub-mkimage32.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_install-grub-mkimage32.Tpo util/$(DEPDIR)/grub_install-grub-mkimage32.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-mkimage32.c' object='util/grub_install-grub-mkimage32.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -c -o util/grub_install-grub-mkimage32.o `test -f 'util/grub-mkimage32.c' || echo '$(srcdir)/'`util/grub-mkimage32.c util/grub_install-grub-mkimage32.obj: util/grub-mkimage32.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -MT util/grub_install-grub-mkimage32.obj -MD -MP -MF util/$(DEPDIR)/grub_install-grub-mkimage32.Tpo -c -o util/grub_install-grub-mkimage32.obj `if test -f 'util/grub-mkimage32.c'; then $(CYGPATH_W) 'util/grub-mkimage32.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-mkimage32.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_install-grub-mkimage32.Tpo util/$(DEPDIR)/grub_install-grub-mkimage32.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-mkimage32.c' object='util/grub_install-grub-mkimage32.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -c -o util/grub_install-grub-mkimage32.obj `if test -f 'util/grub-mkimage32.c'; then $(CYGPATH_W) 'util/grub-mkimage32.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-mkimage32.c'; fi` util/grub_install-grub-mkimage64.o: util/grub-mkimage64.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -MT util/grub_install-grub-mkimage64.o -MD -MP -MF util/$(DEPDIR)/grub_install-grub-mkimage64.Tpo -c -o util/grub_install-grub-mkimage64.o `test -f 'util/grub-mkimage64.c' || echo '$(srcdir)/'`util/grub-mkimage64.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_install-grub-mkimage64.Tpo util/$(DEPDIR)/grub_install-grub-mkimage64.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-mkimage64.c' object='util/grub_install-grub-mkimage64.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -c -o util/grub_install-grub-mkimage64.o `test -f 'util/grub-mkimage64.c' || echo '$(srcdir)/'`util/grub-mkimage64.c util/grub_install-grub-mkimage64.obj: util/grub-mkimage64.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -MT util/grub_install-grub-mkimage64.obj -MD -MP -MF util/$(DEPDIR)/grub_install-grub-mkimage64.Tpo -c -o util/grub_install-grub-mkimage64.obj `if test -f 'util/grub-mkimage64.c'; then $(CYGPATH_W) 'util/grub-mkimage64.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-mkimage64.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_install-grub-mkimage64.Tpo util/$(DEPDIR)/grub_install-grub-mkimage64.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-mkimage64.c' object='util/grub_install-grub-mkimage64.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -c -o util/grub_install-grub-mkimage64.obj `if test -f 'util/grub-mkimage64.c'; then $(CYGPATH_W) 'util/grub-mkimage64.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-mkimage64.c'; fi` util/grub_install-mkimage.o: util/mkimage.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -MT util/grub_install-mkimage.o -MD -MP -MF util/$(DEPDIR)/grub_install-mkimage.Tpo -c -o util/grub_install-mkimage.o `test -f 'util/mkimage.c' || echo '$(srcdir)/'`util/mkimage.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_install-mkimage.Tpo util/$(DEPDIR)/grub_install-mkimage.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/mkimage.c' object='util/grub_install-mkimage.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -c -o util/grub_install-mkimage.o `test -f 'util/mkimage.c' || echo '$(srcdir)/'`util/mkimage.c util/grub_install-mkimage.obj: util/mkimage.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -MT util/grub_install-mkimage.obj -MD -MP -MF util/$(DEPDIR)/grub_install-mkimage.Tpo -c -o util/grub_install-mkimage.obj `if test -f 'util/mkimage.c'; then $(CYGPATH_W) 'util/mkimage.c'; else $(CYGPATH_W) '$(srcdir)/util/mkimage.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_install-mkimage.Tpo util/$(DEPDIR)/grub_install-mkimage.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/mkimage.c' object='util/grub_install-mkimage.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -c -o util/grub_install-mkimage.obj `if test -f 'util/mkimage.c'; then $(CYGPATH_W) 'util/mkimage.c'; else $(CYGPATH_W) '$(srcdir)/util/mkimage.c'; fi` util/grub_install-probe.o: util/probe.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -MT util/grub_install-probe.o -MD -MP -MF util/$(DEPDIR)/grub_install-probe.Tpo -c -o util/grub_install-probe.o `test -f 'util/probe.c' || echo '$(srcdir)/'`util/probe.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_install-probe.Tpo util/$(DEPDIR)/grub_install-probe.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/probe.c' object='util/grub_install-probe.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -c -o util/grub_install-probe.o `test -f 'util/probe.c' || echo '$(srcdir)/'`util/probe.c util/grub_install-probe.obj: util/probe.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -MT util/grub_install-probe.obj -MD -MP -MF util/$(DEPDIR)/grub_install-probe.Tpo -c -o util/grub_install-probe.obj `if test -f 'util/probe.c'; then $(CYGPATH_W) 'util/probe.c'; else $(CYGPATH_W) '$(srcdir)/util/probe.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_install-probe.Tpo util/$(DEPDIR)/grub_install-probe.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/probe.c' object='util/grub_install-probe.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -c -o util/grub_install-probe.obj `if test -f 'util/probe.c'; then $(CYGPATH_W) 'util/probe.c'; else $(CYGPATH_W) '$(srcdir)/util/probe.c'; fi` util/grub_install-render-label.o: util/render-label.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -MT util/grub_install-render-label.o -MD -MP -MF util/$(DEPDIR)/grub_install-render-label.Tpo -c -o util/grub_install-render-label.o `test -f 'util/render-label.c' || echo '$(srcdir)/'`util/render-label.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_install-render-label.Tpo util/$(DEPDIR)/grub_install-render-label.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/render-label.c' object='util/grub_install-render-label.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -c -o util/grub_install-render-label.o `test -f 'util/render-label.c' || echo '$(srcdir)/'`util/render-label.c util/grub_install-render-label.obj: util/render-label.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -MT util/grub_install-render-label.obj -MD -MP -MF util/$(DEPDIR)/grub_install-render-label.Tpo -c -o util/grub_install-render-label.obj `if test -f 'util/render-label.c'; then $(CYGPATH_W) 'util/render-label.c'; else $(CYGPATH_W) '$(srcdir)/util/render-label.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_install-render-label.Tpo util/$(DEPDIR)/grub_install-render-label.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/render-label.c' object='util/grub_install-render-label.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -c -o util/grub_install-render-label.obj `if test -f 'util/render-label.c'; then $(CYGPATH_W) 'util/render-label.c'; else $(CYGPATH_W) '$(srcdir)/util/render-label.c'; fi` util/grub_install-resolve.o: util/resolve.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -MT util/grub_install-resolve.o -MD -MP -MF util/$(DEPDIR)/grub_install-resolve.Tpo -c -o util/grub_install-resolve.o `test -f 'util/resolve.c' || echo '$(srcdir)/'`util/resolve.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_install-resolve.Tpo util/$(DEPDIR)/grub_install-resolve.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/resolve.c' object='util/grub_install-resolve.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -c -o util/grub_install-resolve.o `test -f 'util/resolve.c' || echo '$(srcdir)/'`util/resolve.c util/grub_install-resolve.obj: util/resolve.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -MT util/grub_install-resolve.obj -MD -MP -MF util/$(DEPDIR)/grub_install-resolve.Tpo -c -o util/grub_install-resolve.obj `if test -f 'util/resolve.c'; then $(CYGPATH_W) 'util/resolve.c'; else $(CYGPATH_W) '$(srcdir)/util/resolve.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_install-resolve.Tpo util/$(DEPDIR)/grub_install-resolve.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/resolve.c' object='util/grub_install-resolve.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -c -o util/grub_install-resolve.obj `if test -f 'util/resolve.c'; then $(CYGPATH_W) 'util/resolve.c'; else $(CYGPATH_W) '$(srcdir)/util/resolve.c'; fi` util/grub_install-setup_bios.o: util/setup_bios.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -MT util/grub_install-setup_bios.o -MD -MP -MF util/$(DEPDIR)/grub_install-setup_bios.Tpo -c -o util/grub_install-setup_bios.o `test -f 'util/setup_bios.c' || echo '$(srcdir)/'`util/setup_bios.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_install-setup_bios.Tpo util/$(DEPDIR)/grub_install-setup_bios.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/setup_bios.c' object='util/grub_install-setup_bios.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -c -o util/grub_install-setup_bios.o `test -f 'util/setup_bios.c' || echo '$(srcdir)/'`util/setup_bios.c util/grub_install-setup_bios.obj: util/setup_bios.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -MT util/grub_install-setup_bios.obj -MD -MP -MF util/$(DEPDIR)/grub_install-setup_bios.Tpo -c -o util/grub_install-setup_bios.obj `if test -f 'util/setup_bios.c'; then $(CYGPATH_W) 'util/setup_bios.c'; else $(CYGPATH_W) '$(srcdir)/util/setup_bios.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_install-setup_bios.Tpo util/$(DEPDIR)/grub_install-setup_bios.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/setup_bios.c' object='util/grub_install-setup_bios.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -c -o util/grub_install-setup_bios.obj `if test -f 'util/setup_bios.c'; then $(CYGPATH_W) 'util/setup_bios.c'; else $(CYGPATH_W) '$(srcdir)/util/setup_bios.c'; fi` util/grub_install-setup_sparc.o: util/setup_sparc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -MT util/grub_install-setup_sparc.o -MD -MP -MF util/$(DEPDIR)/grub_install-setup_sparc.Tpo -c -o util/grub_install-setup_sparc.o `test -f 'util/setup_sparc.c' || echo '$(srcdir)/'`util/setup_sparc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_install-setup_sparc.Tpo util/$(DEPDIR)/grub_install-setup_sparc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/setup_sparc.c' object='util/grub_install-setup_sparc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -c -o util/grub_install-setup_sparc.o `test -f 'util/setup_sparc.c' || echo '$(srcdir)/'`util/setup_sparc.c util/grub_install-setup_sparc.obj: util/setup_sparc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -MT util/grub_install-setup_sparc.obj -MD -MP -MF util/$(DEPDIR)/grub_install-setup_sparc.Tpo -c -o util/grub_install-setup_sparc.obj `if test -f 'util/setup_sparc.c'; then $(CYGPATH_W) 'util/setup_sparc.c'; else $(CYGPATH_W) '$(srcdir)/util/setup_sparc.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_install-setup_sparc.Tpo util/$(DEPDIR)/grub_install-setup_sparc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/setup_sparc.c' object='util/grub_install-setup_sparc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_install_CPPFLAGS) $(CPPFLAGS) $(grub_install_CFLAGS) $(CFLAGS) -c -o util/grub_install-setup_sparc.obj `if test -f 'util/setup_sparc.c'; then $(CYGPATH_W) 'util/setup_sparc.c'; else $(CYGPATH_W) '$(srcdir)/util/setup_sparc.c'; fi` grub-core/kern/emu/grub_macbless-argp_common.o: grub-core/kern/emu/argp_common.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_macbless_CPPFLAGS) $(CPPFLAGS) $(grub_macbless_CFLAGS) $(CFLAGS) -MT grub-core/kern/emu/grub_macbless-argp_common.o -MD -MP -MF grub-core/kern/emu/$(DEPDIR)/grub_macbless-argp_common.Tpo -c -o grub-core/kern/emu/grub_macbless-argp_common.o `test -f 'grub-core/kern/emu/argp_common.c' || echo '$(srcdir)/'`grub-core/kern/emu/argp_common.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/emu/$(DEPDIR)/grub_macbless-argp_common.Tpo grub-core/kern/emu/$(DEPDIR)/grub_macbless-argp_common.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/emu/argp_common.c' object='grub-core/kern/emu/grub_macbless-argp_common.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_macbless_CPPFLAGS) $(CPPFLAGS) $(grub_macbless_CFLAGS) $(CFLAGS) -c -o grub-core/kern/emu/grub_macbless-argp_common.o `test -f 'grub-core/kern/emu/argp_common.c' || echo '$(srcdir)/'`grub-core/kern/emu/argp_common.c grub-core/kern/emu/grub_macbless-argp_common.obj: grub-core/kern/emu/argp_common.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_macbless_CPPFLAGS) $(CPPFLAGS) $(grub_macbless_CFLAGS) $(CFLAGS) -MT grub-core/kern/emu/grub_macbless-argp_common.obj -MD -MP -MF grub-core/kern/emu/$(DEPDIR)/grub_macbless-argp_common.Tpo -c -o grub-core/kern/emu/grub_macbless-argp_common.obj `if test -f 'grub-core/kern/emu/argp_common.c'; then $(CYGPATH_W) 'grub-core/kern/emu/argp_common.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/emu/argp_common.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/emu/$(DEPDIR)/grub_macbless-argp_common.Tpo grub-core/kern/emu/$(DEPDIR)/grub_macbless-argp_common.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/emu/argp_common.c' object='grub-core/kern/emu/grub_macbless-argp_common.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_macbless_CPPFLAGS) $(CPPFLAGS) $(grub_macbless_CFLAGS) $(CFLAGS) -c -o grub-core/kern/emu/grub_macbless-argp_common.obj `if test -f 'grub-core/kern/emu/argp_common.c'; then $(CYGPATH_W) 'grub-core/kern/emu/argp_common.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/emu/argp_common.c'; fi` grub-core/osdep/grub_macbless-init.o: grub-core/osdep/init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_macbless_CPPFLAGS) $(CPPFLAGS) $(grub_macbless_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_macbless-init.o -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_macbless-init.Tpo -c -o grub-core/osdep/grub_macbless-init.o `test -f 'grub-core/osdep/init.c' || echo '$(srcdir)/'`grub-core/osdep/init.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_macbless-init.Tpo grub-core/osdep/$(DEPDIR)/grub_macbless-init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/init.c' object='grub-core/osdep/grub_macbless-init.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_macbless_CPPFLAGS) $(CPPFLAGS) $(grub_macbless_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_macbless-init.o `test -f 'grub-core/osdep/init.c' || echo '$(srcdir)/'`grub-core/osdep/init.c grub-core/osdep/grub_macbless-init.obj: grub-core/osdep/init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_macbless_CPPFLAGS) $(CPPFLAGS) $(grub_macbless_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_macbless-init.obj -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_macbless-init.Tpo -c -o grub-core/osdep/grub_macbless-init.obj `if test -f 'grub-core/osdep/init.c'; then $(CYGPATH_W) 'grub-core/osdep/init.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/init.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_macbless-init.Tpo grub-core/osdep/$(DEPDIR)/grub_macbless-init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/init.c' object='grub-core/osdep/grub_macbless-init.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_macbless_CPPFLAGS) $(CPPFLAGS) $(grub_macbless_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_macbless-init.obj `if test -f 'grub-core/osdep/init.c'; then $(CYGPATH_W) 'grub-core/osdep/init.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/init.c'; fi` util/grub_macbless-grub-macbless.o: util/grub-macbless.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_macbless_CPPFLAGS) $(CPPFLAGS) $(grub_macbless_CFLAGS) $(CFLAGS) -MT util/grub_macbless-grub-macbless.o -MD -MP -MF util/$(DEPDIR)/grub_macbless-grub-macbless.Tpo -c -o util/grub_macbless-grub-macbless.o `test -f 'util/grub-macbless.c' || echo '$(srcdir)/'`util/grub-macbless.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_macbless-grub-macbless.Tpo util/$(DEPDIR)/grub_macbless-grub-macbless.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-macbless.c' object='util/grub_macbless-grub-macbless.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_macbless_CPPFLAGS) $(CPPFLAGS) $(grub_macbless_CFLAGS) $(CFLAGS) -c -o util/grub_macbless-grub-macbless.o `test -f 'util/grub-macbless.c' || echo '$(srcdir)/'`util/grub-macbless.c util/grub_macbless-grub-macbless.obj: util/grub-macbless.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_macbless_CPPFLAGS) $(CPPFLAGS) $(grub_macbless_CFLAGS) $(CFLAGS) -MT util/grub_macbless-grub-macbless.obj -MD -MP -MF util/$(DEPDIR)/grub_macbless-grub-macbless.Tpo -c -o util/grub_macbless-grub-macbless.obj `if test -f 'util/grub-macbless.c'; then $(CYGPATH_W) 'util/grub-macbless.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-macbless.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_macbless-grub-macbless.Tpo util/$(DEPDIR)/grub_macbless-grub-macbless.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-macbless.c' object='util/grub_macbless-grub-macbless.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_macbless_CPPFLAGS) $(CPPFLAGS) $(grub_macbless_CFLAGS) $(CFLAGS) -c -o util/grub_macbless-grub-macbless.obj `if test -f 'util/grub-macbless.c'; then $(CYGPATH_W) 'util/grub-macbless.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-macbless.c'; fi` util/grub_macho2img-grub-macho2img.o: util/grub-macho2img.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_macho2img_CPPFLAGS) $(CPPFLAGS) $(grub_macho2img_CFLAGS) $(CFLAGS) -MT util/grub_macho2img-grub-macho2img.o -MD -MP -MF util/$(DEPDIR)/grub_macho2img-grub-macho2img.Tpo -c -o util/grub_macho2img-grub-macho2img.o `test -f 'util/grub-macho2img.c' || echo '$(srcdir)/'`util/grub-macho2img.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_macho2img-grub-macho2img.Tpo util/$(DEPDIR)/grub_macho2img-grub-macho2img.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-macho2img.c' object='util/grub_macho2img-grub-macho2img.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_macho2img_CPPFLAGS) $(CPPFLAGS) $(grub_macho2img_CFLAGS) $(CFLAGS) -c -o util/grub_macho2img-grub-macho2img.o `test -f 'util/grub-macho2img.c' || echo '$(srcdir)/'`util/grub-macho2img.c util/grub_macho2img-grub-macho2img.obj: util/grub-macho2img.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_macho2img_CPPFLAGS) $(CPPFLAGS) $(grub_macho2img_CFLAGS) $(CFLAGS) -MT util/grub_macho2img-grub-macho2img.obj -MD -MP -MF util/$(DEPDIR)/grub_macho2img-grub-macho2img.Tpo -c -o util/grub_macho2img-grub-macho2img.obj `if test -f 'util/grub-macho2img.c'; then $(CYGPATH_W) 'util/grub-macho2img.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-macho2img.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_macho2img-grub-macho2img.Tpo util/$(DEPDIR)/grub_macho2img-grub-macho2img.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-macho2img.c' object='util/grub_macho2img-grub-macho2img.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_macho2img_CPPFLAGS) $(CPPFLAGS) $(grub_macho2img_CFLAGS) $(CFLAGS) -c -o util/grub_macho2img-grub-macho2img.obj `if test -f 'util/grub-macho2img.c'; then $(CYGPATH_W) 'util/grub-macho2img.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-macho2img.c'; fi` grub-core/lib/i386/pc/grub_menulst2cfg-vesa_modes_table.o: grub-core/lib/i386/pc/vesa_modes_table.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_menulst2cfg_CPPFLAGS) $(CPPFLAGS) $(grub_menulst2cfg_CFLAGS) $(CFLAGS) -MT grub-core/lib/i386/pc/grub_menulst2cfg-vesa_modes_table.o -MD -MP -MF grub-core/lib/i386/pc/$(DEPDIR)/grub_menulst2cfg-vesa_modes_table.Tpo -c -o grub-core/lib/i386/pc/grub_menulst2cfg-vesa_modes_table.o `test -f 'grub-core/lib/i386/pc/vesa_modes_table.c' || echo '$(srcdir)/'`grub-core/lib/i386/pc/vesa_modes_table.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/i386/pc/$(DEPDIR)/grub_menulst2cfg-vesa_modes_table.Tpo grub-core/lib/i386/pc/$(DEPDIR)/grub_menulst2cfg-vesa_modes_table.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/i386/pc/vesa_modes_table.c' object='grub-core/lib/i386/pc/grub_menulst2cfg-vesa_modes_table.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_menulst2cfg_CPPFLAGS) $(CPPFLAGS) $(grub_menulst2cfg_CFLAGS) $(CFLAGS) -c -o grub-core/lib/i386/pc/grub_menulst2cfg-vesa_modes_table.o `test -f 'grub-core/lib/i386/pc/vesa_modes_table.c' || echo '$(srcdir)/'`grub-core/lib/i386/pc/vesa_modes_table.c grub-core/lib/i386/pc/grub_menulst2cfg-vesa_modes_table.obj: grub-core/lib/i386/pc/vesa_modes_table.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_menulst2cfg_CPPFLAGS) $(CPPFLAGS) $(grub_menulst2cfg_CFLAGS) $(CFLAGS) -MT grub-core/lib/i386/pc/grub_menulst2cfg-vesa_modes_table.obj -MD -MP -MF grub-core/lib/i386/pc/$(DEPDIR)/grub_menulst2cfg-vesa_modes_table.Tpo -c -o grub-core/lib/i386/pc/grub_menulst2cfg-vesa_modes_table.obj `if test -f 'grub-core/lib/i386/pc/vesa_modes_table.c'; then $(CYGPATH_W) 'grub-core/lib/i386/pc/vesa_modes_table.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/i386/pc/vesa_modes_table.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/i386/pc/$(DEPDIR)/grub_menulst2cfg-vesa_modes_table.Tpo grub-core/lib/i386/pc/$(DEPDIR)/grub_menulst2cfg-vesa_modes_table.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/i386/pc/vesa_modes_table.c' object='grub-core/lib/i386/pc/grub_menulst2cfg-vesa_modes_table.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_menulst2cfg_CPPFLAGS) $(CPPFLAGS) $(grub_menulst2cfg_CFLAGS) $(CFLAGS) -c -o grub-core/lib/i386/pc/grub_menulst2cfg-vesa_modes_table.obj `if test -f 'grub-core/lib/i386/pc/vesa_modes_table.c'; then $(CYGPATH_W) 'grub-core/lib/i386/pc/vesa_modes_table.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/i386/pc/vesa_modes_table.c'; fi` grub-core/lib/grub_menulst2cfg-legacy_parse.o: grub-core/lib/legacy_parse.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_menulst2cfg_CPPFLAGS) $(CPPFLAGS) $(grub_menulst2cfg_CFLAGS) $(CFLAGS) -MT grub-core/lib/grub_menulst2cfg-legacy_parse.o -MD -MP -MF grub-core/lib/$(DEPDIR)/grub_menulst2cfg-legacy_parse.Tpo -c -o grub-core/lib/grub_menulst2cfg-legacy_parse.o `test -f 'grub-core/lib/legacy_parse.c' || echo '$(srcdir)/'`grub-core/lib/legacy_parse.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/$(DEPDIR)/grub_menulst2cfg-legacy_parse.Tpo grub-core/lib/$(DEPDIR)/grub_menulst2cfg-legacy_parse.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/legacy_parse.c' object='grub-core/lib/grub_menulst2cfg-legacy_parse.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_menulst2cfg_CPPFLAGS) $(CPPFLAGS) $(grub_menulst2cfg_CFLAGS) $(CFLAGS) -c -o grub-core/lib/grub_menulst2cfg-legacy_parse.o `test -f 'grub-core/lib/legacy_parse.c' || echo '$(srcdir)/'`grub-core/lib/legacy_parse.c grub-core/lib/grub_menulst2cfg-legacy_parse.obj: grub-core/lib/legacy_parse.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_menulst2cfg_CPPFLAGS) $(CPPFLAGS) $(grub_menulst2cfg_CFLAGS) $(CFLAGS) -MT grub-core/lib/grub_menulst2cfg-legacy_parse.obj -MD -MP -MF grub-core/lib/$(DEPDIR)/grub_menulst2cfg-legacy_parse.Tpo -c -o grub-core/lib/grub_menulst2cfg-legacy_parse.obj `if test -f 'grub-core/lib/legacy_parse.c'; then $(CYGPATH_W) 'grub-core/lib/legacy_parse.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/legacy_parse.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/$(DEPDIR)/grub_menulst2cfg-legacy_parse.Tpo grub-core/lib/$(DEPDIR)/grub_menulst2cfg-legacy_parse.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/legacy_parse.c' object='grub-core/lib/grub_menulst2cfg-legacy_parse.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_menulst2cfg_CPPFLAGS) $(CPPFLAGS) $(grub_menulst2cfg_CFLAGS) $(CFLAGS) -c -o grub-core/lib/grub_menulst2cfg-legacy_parse.obj `if test -f 'grub-core/lib/legacy_parse.c'; then $(CYGPATH_W) 'grub-core/lib/legacy_parse.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/legacy_parse.c'; fi` grub-core/osdep/grub_menulst2cfg-init.o: grub-core/osdep/init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_menulst2cfg_CPPFLAGS) $(CPPFLAGS) $(grub_menulst2cfg_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_menulst2cfg-init.o -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_menulst2cfg-init.Tpo -c -o grub-core/osdep/grub_menulst2cfg-init.o `test -f 'grub-core/osdep/init.c' || echo '$(srcdir)/'`grub-core/osdep/init.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_menulst2cfg-init.Tpo grub-core/osdep/$(DEPDIR)/grub_menulst2cfg-init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/init.c' object='grub-core/osdep/grub_menulst2cfg-init.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_menulst2cfg_CPPFLAGS) $(CPPFLAGS) $(grub_menulst2cfg_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_menulst2cfg-init.o `test -f 'grub-core/osdep/init.c' || echo '$(srcdir)/'`grub-core/osdep/init.c grub-core/osdep/grub_menulst2cfg-init.obj: grub-core/osdep/init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_menulst2cfg_CPPFLAGS) $(CPPFLAGS) $(grub_menulst2cfg_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_menulst2cfg-init.obj -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_menulst2cfg-init.Tpo -c -o grub-core/osdep/grub_menulst2cfg-init.obj `if test -f 'grub-core/osdep/init.c'; then $(CYGPATH_W) 'grub-core/osdep/init.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/init.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_menulst2cfg-init.Tpo grub-core/osdep/$(DEPDIR)/grub_menulst2cfg-init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/init.c' object='grub-core/osdep/grub_menulst2cfg-init.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_menulst2cfg_CPPFLAGS) $(CPPFLAGS) $(grub_menulst2cfg_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_menulst2cfg-init.obj `if test -f 'grub-core/osdep/init.c'; then $(CYGPATH_W) 'grub-core/osdep/init.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/init.c'; fi` util/grub_menulst2cfg-grub-menulst2cfg.o: util/grub-menulst2cfg.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_menulst2cfg_CPPFLAGS) $(CPPFLAGS) $(grub_menulst2cfg_CFLAGS) $(CFLAGS) -MT util/grub_menulst2cfg-grub-menulst2cfg.o -MD -MP -MF util/$(DEPDIR)/grub_menulst2cfg-grub-menulst2cfg.Tpo -c -o util/grub_menulst2cfg-grub-menulst2cfg.o `test -f 'util/grub-menulst2cfg.c' || echo '$(srcdir)/'`util/grub-menulst2cfg.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_menulst2cfg-grub-menulst2cfg.Tpo util/$(DEPDIR)/grub_menulst2cfg-grub-menulst2cfg.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-menulst2cfg.c' object='util/grub_menulst2cfg-grub-menulst2cfg.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_menulst2cfg_CPPFLAGS) $(CPPFLAGS) $(grub_menulst2cfg_CFLAGS) $(CFLAGS) -c -o util/grub_menulst2cfg-grub-menulst2cfg.o `test -f 'util/grub-menulst2cfg.c' || echo '$(srcdir)/'`util/grub-menulst2cfg.c util/grub_menulst2cfg-grub-menulst2cfg.obj: util/grub-menulst2cfg.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_menulst2cfg_CPPFLAGS) $(CPPFLAGS) $(grub_menulst2cfg_CFLAGS) $(CFLAGS) -MT util/grub_menulst2cfg-grub-menulst2cfg.obj -MD -MP -MF util/$(DEPDIR)/grub_menulst2cfg-grub-menulst2cfg.Tpo -c -o util/grub_menulst2cfg-grub-menulst2cfg.obj `if test -f 'util/grub-menulst2cfg.c'; then $(CYGPATH_W) 'util/grub-menulst2cfg.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-menulst2cfg.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_menulst2cfg-grub-menulst2cfg.Tpo util/$(DEPDIR)/grub_menulst2cfg-grub-menulst2cfg.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-menulst2cfg.c' object='util/grub_menulst2cfg-grub-menulst2cfg.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_menulst2cfg_CPPFLAGS) $(CPPFLAGS) $(grub_menulst2cfg_CFLAGS) $(CFLAGS) -c -o util/grub_menulst2cfg-grub-menulst2cfg.obj `if test -f 'util/grub-menulst2cfg.c'; then $(CYGPATH_W) 'util/grub-menulst2cfg.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-menulst2cfg.c'; fi` grub-core/kern/emu/grub_mkfont-argp_common.o: grub-core/kern/emu/argp_common.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkfont_CPPFLAGS) $(CPPFLAGS) $(grub_mkfont_CFLAGS) $(CFLAGS) -MT grub-core/kern/emu/grub_mkfont-argp_common.o -MD -MP -MF grub-core/kern/emu/$(DEPDIR)/grub_mkfont-argp_common.Tpo -c -o grub-core/kern/emu/grub_mkfont-argp_common.o `test -f 'grub-core/kern/emu/argp_common.c' || echo '$(srcdir)/'`grub-core/kern/emu/argp_common.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/emu/$(DEPDIR)/grub_mkfont-argp_common.Tpo grub-core/kern/emu/$(DEPDIR)/grub_mkfont-argp_common.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/emu/argp_common.c' object='grub-core/kern/emu/grub_mkfont-argp_common.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkfont_CPPFLAGS) $(CPPFLAGS) $(grub_mkfont_CFLAGS) $(CFLAGS) -c -o grub-core/kern/emu/grub_mkfont-argp_common.o `test -f 'grub-core/kern/emu/argp_common.c' || echo '$(srcdir)/'`grub-core/kern/emu/argp_common.c grub-core/kern/emu/grub_mkfont-argp_common.obj: grub-core/kern/emu/argp_common.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkfont_CPPFLAGS) $(CPPFLAGS) $(grub_mkfont_CFLAGS) $(CFLAGS) -MT grub-core/kern/emu/grub_mkfont-argp_common.obj -MD -MP -MF grub-core/kern/emu/$(DEPDIR)/grub_mkfont-argp_common.Tpo -c -o grub-core/kern/emu/grub_mkfont-argp_common.obj `if test -f 'grub-core/kern/emu/argp_common.c'; then $(CYGPATH_W) 'grub-core/kern/emu/argp_common.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/emu/argp_common.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/emu/$(DEPDIR)/grub_mkfont-argp_common.Tpo grub-core/kern/emu/$(DEPDIR)/grub_mkfont-argp_common.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/emu/argp_common.c' object='grub-core/kern/emu/grub_mkfont-argp_common.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkfont_CPPFLAGS) $(CPPFLAGS) $(grub_mkfont_CFLAGS) $(CFLAGS) -c -o grub-core/kern/emu/grub_mkfont-argp_common.obj `if test -f 'grub-core/kern/emu/argp_common.c'; then $(CYGPATH_W) 'grub-core/kern/emu/argp_common.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/emu/argp_common.c'; fi` grub-core/osdep/grub_mkfont-init.o: grub-core/osdep/init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkfont_CPPFLAGS) $(CPPFLAGS) $(grub_mkfont_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_mkfont-init.o -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_mkfont-init.Tpo -c -o grub-core/osdep/grub_mkfont-init.o `test -f 'grub-core/osdep/init.c' || echo '$(srcdir)/'`grub-core/osdep/init.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_mkfont-init.Tpo grub-core/osdep/$(DEPDIR)/grub_mkfont-init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/init.c' object='grub-core/osdep/grub_mkfont-init.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkfont_CPPFLAGS) $(CPPFLAGS) $(grub_mkfont_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_mkfont-init.o `test -f 'grub-core/osdep/init.c' || echo '$(srcdir)/'`grub-core/osdep/init.c grub-core/osdep/grub_mkfont-init.obj: grub-core/osdep/init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkfont_CPPFLAGS) $(CPPFLAGS) $(grub_mkfont_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_mkfont-init.obj -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_mkfont-init.Tpo -c -o grub-core/osdep/grub_mkfont-init.obj `if test -f 'grub-core/osdep/init.c'; then $(CYGPATH_W) 'grub-core/osdep/init.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/init.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_mkfont-init.Tpo grub-core/osdep/$(DEPDIR)/grub_mkfont-init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/init.c' object='grub-core/osdep/grub_mkfont-init.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkfont_CPPFLAGS) $(CPPFLAGS) $(grub_mkfont_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_mkfont-init.obj `if test -f 'grub-core/osdep/init.c'; then $(CYGPATH_W) 'grub-core/osdep/init.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/init.c'; fi` util/grub_mkfont-grub-mkfont.o: util/grub-mkfont.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkfont_CPPFLAGS) $(CPPFLAGS) $(grub_mkfont_CFLAGS) $(CFLAGS) -MT util/grub_mkfont-grub-mkfont.o -MD -MP -MF util/$(DEPDIR)/grub_mkfont-grub-mkfont.Tpo -c -o util/grub_mkfont-grub-mkfont.o `test -f 'util/grub-mkfont.c' || echo '$(srcdir)/'`util/grub-mkfont.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mkfont-grub-mkfont.Tpo util/$(DEPDIR)/grub_mkfont-grub-mkfont.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-mkfont.c' object='util/grub_mkfont-grub-mkfont.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkfont_CPPFLAGS) $(CPPFLAGS) $(grub_mkfont_CFLAGS) $(CFLAGS) -c -o util/grub_mkfont-grub-mkfont.o `test -f 'util/grub-mkfont.c' || echo '$(srcdir)/'`util/grub-mkfont.c util/grub_mkfont-grub-mkfont.obj: util/grub-mkfont.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkfont_CPPFLAGS) $(CPPFLAGS) $(grub_mkfont_CFLAGS) $(CFLAGS) -MT util/grub_mkfont-grub-mkfont.obj -MD -MP -MF util/$(DEPDIR)/grub_mkfont-grub-mkfont.Tpo -c -o util/grub_mkfont-grub-mkfont.obj `if test -f 'util/grub-mkfont.c'; then $(CYGPATH_W) 'util/grub-mkfont.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-mkfont.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mkfont-grub-mkfont.Tpo util/$(DEPDIR)/grub_mkfont-grub-mkfont.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-mkfont.c' object='util/grub_mkfont-grub-mkfont.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkfont_CPPFLAGS) $(CPPFLAGS) $(grub_mkfont_CFLAGS) $(CFLAGS) -c -o util/grub_mkfont-grub-mkfont.obj `if test -f 'util/grub-mkfont.c'; then $(CYGPATH_W) 'util/grub-mkfont.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-mkfont.c'; fi` grub-core/kern/emu/grub_mkimage-argp_common.o: grub-core/kern/emu/argp_common.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkimage_CPPFLAGS) $(CPPFLAGS) $(grub_mkimage_CFLAGS) $(CFLAGS) -MT grub-core/kern/emu/grub_mkimage-argp_common.o -MD -MP -MF grub-core/kern/emu/$(DEPDIR)/grub_mkimage-argp_common.Tpo -c -o grub-core/kern/emu/grub_mkimage-argp_common.o `test -f 'grub-core/kern/emu/argp_common.c' || echo '$(srcdir)/'`grub-core/kern/emu/argp_common.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/emu/$(DEPDIR)/grub_mkimage-argp_common.Tpo grub-core/kern/emu/$(DEPDIR)/grub_mkimage-argp_common.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/emu/argp_common.c' object='grub-core/kern/emu/grub_mkimage-argp_common.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkimage_CPPFLAGS) $(CPPFLAGS) $(grub_mkimage_CFLAGS) $(CFLAGS) -c -o grub-core/kern/emu/grub_mkimage-argp_common.o `test -f 'grub-core/kern/emu/argp_common.c' || echo '$(srcdir)/'`grub-core/kern/emu/argp_common.c grub-core/kern/emu/grub_mkimage-argp_common.obj: grub-core/kern/emu/argp_common.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkimage_CPPFLAGS) $(CPPFLAGS) $(grub_mkimage_CFLAGS) $(CFLAGS) -MT grub-core/kern/emu/grub_mkimage-argp_common.obj -MD -MP -MF grub-core/kern/emu/$(DEPDIR)/grub_mkimage-argp_common.Tpo -c -o grub-core/kern/emu/grub_mkimage-argp_common.obj `if test -f 'grub-core/kern/emu/argp_common.c'; then $(CYGPATH_W) 'grub-core/kern/emu/argp_common.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/emu/argp_common.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/emu/$(DEPDIR)/grub_mkimage-argp_common.Tpo grub-core/kern/emu/$(DEPDIR)/grub_mkimage-argp_common.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/emu/argp_common.c' object='grub-core/kern/emu/grub_mkimage-argp_common.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkimage_CPPFLAGS) $(CPPFLAGS) $(grub_mkimage_CFLAGS) $(CFLAGS) -c -o grub-core/kern/emu/grub_mkimage-argp_common.obj `if test -f 'grub-core/kern/emu/argp_common.c'; then $(CYGPATH_W) 'grub-core/kern/emu/argp_common.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/emu/argp_common.c'; fi` grub-core/osdep/grub_mkimage-config.o: grub-core/osdep/config.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkimage_CPPFLAGS) $(CPPFLAGS) $(grub_mkimage_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_mkimage-config.o -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_mkimage-config.Tpo -c -o grub-core/osdep/grub_mkimage-config.o `test -f 'grub-core/osdep/config.c' || echo '$(srcdir)/'`grub-core/osdep/config.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_mkimage-config.Tpo grub-core/osdep/$(DEPDIR)/grub_mkimage-config.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/config.c' object='grub-core/osdep/grub_mkimage-config.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkimage_CPPFLAGS) $(CPPFLAGS) $(grub_mkimage_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_mkimage-config.o `test -f 'grub-core/osdep/config.c' || echo '$(srcdir)/'`grub-core/osdep/config.c grub-core/osdep/grub_mkimage-config.obj: grub-core/osdep/config.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkimage_CPPFLAGS) $(CPPFLAGS) $(grub_mkimage_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_mkimage-config.obj -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_mkimage-config.Tpo -c -o grub-core/osdep/grub_mkimage-config.obj `if test -f 'grub-core/osdep/config.c'; then $(CYGPATH_W) 'grub-core/osdep/config.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/config.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_mkimage-config.Tpo grub-core/osdep/$(DEPDIR)/grub_mkimage-config.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/config.c' object='grub-core/osdep/grub_mkimage-config.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkimage_CPPFLAGS) $(CPPFLAGS) $(grub_mkimage_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_mkimage-config.obj `if test -f 'grub-core/osdep/config.c'; then $(CYGPATH_W) 'grub-core/osdep/config.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/config.c'; fi` grub-core/osdep/grub_mkimage-init.o: grub-core/osdep/init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkimage_CPPFLAGS) $(CPPFLAGS) $(grub_mkimage_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_mkimage-init.o -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_mkimage-init.Tpo -c -o grub-core/osdep/grub_mkimage-init.o `test -f 'grub-core/osdep/init.c' || echo '$(srcdir)/'`grub-core/osdep/init.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_mkimage-init.Tpo grub-core/osdep/$(DEPDIR)/grub_mkimage-init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/init.c' object='grub-core/osdep/grub_mkimage-init.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkimage_CPPFLAGS) $(CPPFLAGS) $(grub_mkimage_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_mkimage-init.o `test -f 'grub-core/osdep/init.c' || echo '$(srcdir)/'`grub-core/osdep/init.c grub-core/osdep/grub_mkimage-init.obj: grub-core/osdep/init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkimage_CPPFLAGS) $(CPPFLAGS) $(grub_mkimage_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_mkimage-init.obj -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_mkimage-init.Tpo -c -o grub-core/osdep/grub_mkimage-init.obj `if test -f 'grub-core/osdep/init.c'; then $(CYGPATH_W) 'grub-core/osdep/init.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/init.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_mkimage-init.Tpo grub-core/osdep/$(DEPDIR)/grub_mkimage-init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/init.c' object='grub-core/osdep/grub_mkimage-init.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkimage_CPPFLAGS) $(CPPFLAGS) $(grub_mkimage_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_mkimage-init.obj `if test -f 'grub-core/osdep/init.c'; then $(CYGPATH_W) 'grub-core/osdep/init.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/init.c'; fi` util/grub_mkimage-config.o: util/config.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkimage_CPPFLAGS) $(CPPFLAGS) $(grub_mkimage_CFLAGS) $(CFLAGS) -MT util/grub_mkimage-config.o -MD -MP -MF util/$(DEPDIR)/grub_mkimage-config.Tpo -c -o util/grub_mkimage-config.o `test -f 'util/config.c' || echo '$(srcdir)/'`util/config.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mkimage-config.Tpo util/$(DEPDIR)/grub_mkimage-config.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/config.c' object='util/grub_mkimage-config.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkimage_CPPFLAGS) $(CPPFLAGS) $(grub_mkimage_CFLAGS) $(CFLAGS) -c -o util/grub_mkimage-config.o `test -f 'util/config.c' || echo '$(srcdir)/'`util/config.c util/grub_mkimage-config.obj: util/config.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkimage_CPPFLAGS) $(CPPFLAGS) $(grub_mkimage_CFLAGS) $(CFLAGS) -MT util/grub_mkimage-config.obj -MD -MP -MF util/$(DEPDIR)/grub_mkimage-config.Tpo -c -o util/grub_mkimage-config.obj `if test -f 'util/config.c'; then $(CYGPATH_W) 'util/config.c'; else $(CYGPATH_W) '$(srcdir)/util/config.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mkimage-config.Tpo util/$(DEPDIR)/grub_mkimage-config.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/config.c' object='util/grub_mkimage-config.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkimage_CPPFLAGS) $(CPPFLAGS) $(grub_mkimage_CFLAGS) $(CFLAGS) -c -o util/grub_mkimage-config.obj `if test -f 'util/config.c'; then $(CYGPATH_W) 'util/config.c'; else $(CYGPATH_W) '$(srcdir)/util/config.c'; fi` util/grub_mkimage-grub-mkimage.o: util/grub-mkimage.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkimage_CPPFLAGS) $(CPPFLAGS) $(grub_mkimage_CFLAGS) $(CFLAGS) -MT util/grub_mkimage-grub-mkimage.o -MD -MP -MF util/$(DEPDIR)/grub_mkimage-grub-mkimage.Tpo -c -o util/grub_mkimage-grub-mkimage.o `test -f 'util/grub-mkimage.c' || echo '$(srcdir)/'`util/grub-mkimage.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mkimage-grub-mkimage.Tpo util/$(DEPDIR)/grub_mkimage-grub-mkimage.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-mkimage.c' object='util/grub_mkimage-grub-mkimage.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkimage_CPPFLAGS) $(CPPFLAGS) $(grub_mkimage_CFLAGS) $(CFLAGS) -c -o util/grub_mkimage-grub-mkimage.o `test -f 'util/grub-mkimage.c' || echo '$(srcdir)/'`util/grub-mkimage.c util/grub_mkimage-grub-mkimage.obj: util/grub-mkimage.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkimage_CPPFLAGS) $(CPPFLAGS) $(grub_mkimage_CFLAGS) $(CFLAGS) -MT util/grub_mkimage-grub-mkimage.obj -MD -MP -MF util/$(DEPDIR)/grub_mkimage-grub-mkimage.Tpo -c -o util/grub_mkimage-grub-mkimage.obj `if test -f 'util/grub-mkimage.c'; then $(CYGPATH_W) 'util/grub-mkimage.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-mkimage.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mkimage-grub-mkimage.Tpo util/$(DEPDIR)/grub_mkimage-grub-mkimage.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-mkimage.c' object='util/grub_mkimage-grub-mkimage.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkimage_CPPFLAGS) $(CPPFLAGS) $(grub_mkimage_CFLAGS) $(CFLAGS) -c -o util/grub_mkimage-grub-mkimage.obj `if test -f 'util/grub-mkimage.c'; then $(CYGPATH_W) 'util/grub-mkimage.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-mkimage.c'; fi` util/grub_mkimage-grub-mkimage32.o: util/grub-mkimage32.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkimage_CPPFLAGS) $(CPPFLAGS) $(grub_mkimage_CFLAGS) $(CFLAGS) -MT util/grub_mkimage-grub-mkimage32.o -MD -MP -MF util/$(DEPDIR)/grub_mkimage-grub-mkimage32.Tpo -c -o util/grub_mkimage-grub-mkimage32.o `test -f 'util/grub-mkimage32.c' || echo '$(srcdir)/'`util/grub-mkimage32.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mkimage-grub-mkimage32.Tpo util/$(DEPDIR)/grub_mkimage-grub-mkimage32.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-mkimage32.c' object='util/grub_mkimage-grub-mkimage32.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkimage_CPPFLAGS) $(CPPFLAGS) $(grub_mkimage_CFLAGS) $(CFLAGS) -c -o util/grub_mkimage-grub-mkimage32.o `test -f 'util/grub-mkimage32.c' || echo '$(srcdir)/'`util/grub-mkimage32.c util/grub_mkimage-grub-mkimage32.obj: util/grub-mkimage32.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkimage_CPPFLAGS) $(CPPFLAGS) $(grub_mkimage_CFLAGS) $(CFLAGS) -MT util/grub_mkimage-grub-mkimage32.obj -MD -MP -MF util/$(DEPDIR)/grub_mkimage-grub-mkimage32.Tpo -c -o util/grub_mkimage-grub-mkimage32.obj `if test -f 'util/grub-mkimage32.c'; then $(CYGPATH_W) 'util/grub-mkimage32.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-mkimage32.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mkimage-grub-mkimage32.Tpo util/$(DEPDIR)/grub_mkimage-grub-mkimage32.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-mkimage32.c' object='util/grub_mkimage-grub-mkimage32.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkimage_CPPFLAGS) $(CPPFLAGS) $(grub_mkimage_CFLAGS) $(CFLAGS) -c -o util/grub_mkimage-grub-mkimage32.obj `if test -f 'util/grub-mkimage32.c'; then $(CYGPATH_W) 'util/grub-mkimage32.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-mkimage32.c'; fi` util/grub_mkimage-grub-mkimage64.o: util/grub-mkimage64.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkimage_CPPFLAGS) $(CPPFLAGS) $(grub_mkimage_CFLAGS) $(CFLAGS) -MT util/grub_mkimage-grub-mkimage64.o -MD -MP -MF util/$(DEPDIR)/grub_mkimage-grub-mkimage64.Tpo -c -o util/grub_mkimage-grub-mkimage64.o `test -f 'util/grub-mkimage64.c' || echo '$(srcdir)/'`util/grub-mkimage64.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mkimage-grub-mkimage64.Tpo util/$(DEPDIR)/grub_mkimage-grub-mkimage64.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-mkimage64.c' object='util/grub_mkimage-grub-mkimage64.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkimage_CPPFLAGS) $(CPPFLAGS) $(grub_mkimage_CFLAGS) $(CFLAGS) -c -o util/grub_mkimage-grub-mkimage64.o `test -f 'util/grub-mkimage64.c' || echo '$(srcdir)/'`util/grub-mkimage64.c util/grub_mkimage-grub-mkimage64.obj: util/grub-mkimage64.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkimage_CPPFLAGS) $(CPPFLAGS) $(grub_mkimage_CFLAGS) $(CFLAGS) -MT util/grub_mkimage-grub-mkimage64.obj -MD -MP -MF util/$(DEPDIR)/grub_mkimage-grub-mkimage64.Tpo -c -o util/grub_mkimage-grub-mkimage64.obj `if test -f 'util/grub-mkimage64.c'; then $(CYGPATH_W) 'util/grub-mkimage64.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-mkimage64.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mkimage-grub-mkimage64.Tpo util/$(DEPDIR)/grub_mkimage-grub-mkimage64.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-mkimage64.c' object='util/grub_mkimage-grub-mkimage64.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkimage_CPPFLAGS) $(CPPFLAGS) $(grub_mkimage_CFLAGS) $(CFLAGS) -c -o util/grub_mkimage-grub-mkimage64.obj `if test -f 'util/grub-mkimage64.c'; then $(CYGPATH_W) 'util/grub-mkimage64.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-mkimage64.c'; fi` util/grub_mkimage-mkimage.o: util/mkimage.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkimage_CPPFLAGS) $(CPPFLAGS) $(grub_mkimage_CFLAGS) $(CFLAGS) -MT util/grub_mkimage-mkimage.o -MD -MP -MF util/$(DEPDIR)/grub_mkimage-mkimage.Tpo -c -o util/grub_mkimage-mkimage.o `test -f 'util/mkimage.c' || echo '$(srcdir)/'`util/mkimage.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mkimage-mkimage.Tpo util/$(DEPDIR)/grub_mkimage-mkimage.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/mkimage.c' object='util/grub_mkimage-mkimage.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkimage_CPPFLAGS) $(CPPFLAGS) $(grub_mkimage_CFLAGS) $(CFLAGS) -c -o util/grub_mkimage-mkimage.o `test -f 'util/mkimage.c' || echo '$(srcdir)/'`util/mkimage.c util/grub_mkimage-mkimage.obj: util/mkimage.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkimage_CPPFLAGS) $(CPPFLAGS) $(grub_mkimage_CFLAGS) $(CFLAGS) -MT util/grub_mkimage-mkimage.obj -MD -MP -MF util/$(DEPDIR)/grub_mkimage-mkimage.Tpo -c -o util/grub_mkimage-mkimage.obj `if test -f 'util/mkimage.c'; then $(CYGPATH_W) 'util/mkimage.c'; else $(CYGPATH_W) '$(srcdir)/util/mkimage.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mkimage-mkimage.Tpo util/$(DEPDIR)/grub_mkimage-mkimage.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/mkimage.c' object='util/grub_mkimage-mkimage.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkimage_CPPFLAGS) $(CPPFLAGS) $(grub_mkimage_CFLAGS) $(CFLAGS) -c -o util/grub_mkimage-mkimage.obj `if test -f 'util/mkimage.c'; then $(CYGPATH_W) 'util/mkimage.c'; else $(CYGPATH_W) '$(srcdir)/util/mkimage.c'; fi` util/grub_mkimage-resolve.o: util/resolve.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkimage_CPPFLAGS) $(CPPFLAGS) $(grub_mkimage_CFLAGS) $(CFLAGS) -MT util/grub_mkimage-resolve.o -MD -MP -MF util/$(DEPDIR)/grub_mkimage-resolve.Tpo -c -o util/grub_mkimage-resolve.o `test -f 'util/resolve.c' || echo '$(srcdir)/'`util/resolve.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mkimage-resolve.Tpo util/$(DEPDIR)/grub_mkimage-resolve.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/resolve.c' object='util/grub_mkimage-resolve.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkimage_CPPFLAGS) $(CPPFLAGS) $(grub_mkimage_CFLAGS) $(CFLAGS) -c -o util/grub_mkimage-resolve.o `test -f 'util/resolve.c' || echo '$(srcdir)/'`util/resolve.c util/grub_mkimage-resolve.obj: util/resolve.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkimage_CPPFLAGS) $(CPPFLAGS) $(grub_mkimage_CFLAGS) $(CFLAGS) -MT util/grub_mkimage-resolve.obj -MD -MP -MF util/$(DEPDIR)/grub_mkimage-resolve.Tpo -c -o util/grub_mkimage-resolve.obj `if test -f 'util/resolve.c'; then $(CYGPATH_W) 'util/resolve.c'; else $(CYGPATH_W) '$(srcdir)/util/resolve.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mkimage-resolve.Tpo util/$(DEPDIR)/grub_mkimage-resolve.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/resolve.c' object='util/grub_mkimage-resolve.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkimage_CPPFLAGS) $(CPPFLAGS) $(grub_mkimage_CFLAGS) $(CFLAGS) -c -o util/grub_mkimage-resolve.obj `if test -f 'util/resolve.c'; then $(CYGPATH_W) 'util/resolve.c'; else $(CYGPATH_W) '$(srcdir)/util/resolve.c'; fi` grub-core/kern/emu/grub_mklayout-argp_common.o: grub-core/kern/emu/argp_common.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mklayout_CPPFLAGS) $(CPPFLAGS) $(grub_mklayout_CFLAGS) $(CFLAGS) -MT grub-core/kern/emu/grub_mklayout-argp_common.o -MD -MP -MF grub-core/kern/emu/$(DEPDIR)/grub_mklayout-argp_common.Tpo -c -o grub-core/kern/emu/grub_mklayout-argp_common.o `test -f 'grub-core/kern/emu/argp_common.c' || echo '$(srcdir)/'`grub-core/kern/emu/argp_common.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/emu/$(DEPDIR)/grub_mklayout-argp_common.Tpo grub-core/kern/emu/$(DEPDIR)/grub_mklayout-argp_common.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/emu/argp_common.c' object='grub-core/kern/emu/grub_mklayout-argp_common.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mklayout_CPPFLAGS) $(CPPFLAGS) $(grub_mklayout_CFLAGS) $(CFLAGS) -c -o grub-core/kern/emu/grub_mklayout-argp_common.o `test -f 'grub-core/kern/emu/argp_common.c' || echo '$(srcdir)/'`grub-core/kern/emu/argp_common.c grub-core/kern/emu/grub_mklayout-argp_common.obj: grub-core/kern/emu/argp_common.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mklayout_CPPFLAGS) $(CPPFLAGS) $(grub_mklayout_CFLAGS) $(CFLAGS) -MT grub-core/kern/emu/grub_mklayout-argp_common.obj -MD -MP -MF grub-core/kern/emu/$(DEPDIR)/grub_mklayout-argp_common.Tpo -c -o grub-core/kern/emu/grub_mklayout-argp_common.obj `if test -f 'grub-core/kern/emu/argp_common.c'; then $(CYGPATH_W) 'grub-core/kern/emu/argp_common.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/emu/argp_common.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/emu/$(DEPDIR)/grub_mklayout-argp_common.Tpo grub-core/kern/emu/$(DEPDIR)/grub_mklayout-argp_common.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/emu/argp_common.c' object='grub-core/kern/emu/grub_mklayout-argp_common.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mklayout_CPPFLAGS) $(CPPFLAGS) $(grub_mklayout_CFLAGS) $(CFLAGS) -c -o grub-core/kern/emu/grub_mklayout-argp_common.obj `if test -f 'grub-core/kern/emu/argp_common.c'; then $(CYGPATH_W) 'grub-core/kern/emu/argp_common.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/emu/argp_common.c'; fi` grub-core/osdep/grub_mklayout-init.o: grub-core/osdep/init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mklayout_CPPFLAGS) $(CPPFLAGS) $(grub_mklayout_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_mklayout-init.o -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_mklayout-init.Tpo -c -o grub-core/osdep/grub_mklayout-init.o `test -f 'grub-core/osdep/init.c' || echo '$(srcdir)/'`grub-core/osdep/init.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_mklayout-init.Tpo grub-core/osdep/$(DEPDIR)/grub_mklayout-init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/init.c' object='grub-core/osdep/grub_mklayout-init.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mklayout_CPPFLAGS) $(CPPFLAGS) $(grub_mklayout_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_mklayout-init.o `test -f 'grub-core/osdep/init.c' || echo '$(srcdir)/'`grub-core/osdep/init.c grub-core/osdep/grub_mklayout-init.obj: grub-core/osdep/init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mklayout_CPPFLAGS) $(CPPFLAGS) $(grub_mklayout_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_mklayout-init.obj -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_mklayout-init.Tpo -c -o grub-core/osdep/grub_mklayout-init.obj `if test -f 'grub-core/osdep/init.c'; then $(CYGPATH_W) 'grub-core/osdep/init.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/init.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_mklayout-init.Tpo grub-core/osdep/$(DEPDIR)/grub_mklayout-init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/init.c' object='grub-core/osdep/grub_mklayout-init.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mklayout_CPPFLAGS) $(CPPFLAGS) $(grub_mklayout_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_mklayout-init.obj `if test -f 'grub-core/osdep/init.c'; then $(CYGPATH_W) 'grub-core/osdep/init.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/init.c'; fi` util/grub_mklayout-grub-mklayout.o: util/grub-mklayout.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mklayout_CPPFLAGS) $(CPPFLAGS) $(grub_mklayout_CFLAGS) $(CFLAGS) -MT util/grub_mklayout-grub-mklayout.o -MD -MP -MF util/$(DEPDIR)/grub_mklayout-grub-mklayout.Tpo -c -o util/grub_mklayout-grub-mklayout.o `test -f 'util/grub-mklayout.c' || echo '$(srcdir)/'`util/grub-mklayout.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mklayout-grub-mklayout.Tpo util/$(DEPDIR)/grub_mklayout-grub-mklayout.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-mklayout.c' object='util/grub_mklayout-grub-mklayout.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mklayout_CPPFLAGS) $(CPPFLAGS) $(grub_mklayout_CFLAGS) $(CFLAGS) -c -o util/grub_mklayout-grub-mklayout.o `test -f 'util/grub-mklayout.c' || echo '$(srcdir)/'`util/grub-mklayout.c util/grub_mklayout-grub-mklayout.obj: util/grub-mklayout.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mklayout_CPPFLAGS) $(CPPFLAGS) $(grub_mklayout_CFLAGS) $(CFLAGS) -MT util/grub_mklayout-grub-mklayout.obj -MD -MP -MF util/$(DEPDIR)/grub_mklayout-grub-mklayout.Tpo -c -o util/grub_mklayout-grub-mklayout.obj `if test -f 'util/grub-mklayout.c'; then $(CYGPATH_W) 'util/grub-mklayout.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-mklayout.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mklayout-grub-mklayout.Tpo util/$(DEPDIR)/grub_mklayout-grub-mklayout.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-mklayout.c' object='util/grub_mklayout-grub-mklayout.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mklayout_CPPFLAGS) $(CPPFLAGS) $(grub_mklayout_CFLAGS) $(CFLAGS) -c -o util/grub_mklayout-grub-mklayout.obj `if test -f 'util/grub-mklayout.c'; then $(CYGPATH_W) 'util/grub-mklayout.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-mklayout.c'; fi` grub-core/kern/emu/grub_mknetdir-argp_common.o: grub-core/kern/emu/argp_common.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -MT grub-core/kern/emu/grub_mknetdir-argp_common.o -MD -MP -MF grub-core/kern/emu/$(DEPDIR)/grub_mknetdir-argp_common.Tpo -c -o grub-core/kern/emu/grub_mknetdir-argp_common.o `test -f 'grub-core/kern/emu/argp_common.c' || echo '$(srcdir)/'`grub-core/kern/emu/argp_common.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/emu/$(DEPDIR)/grub_mknetdir-argp_common.Tpo grub-core/kern/emu/$(DEPDIR)/grub_mknetdir-argp_common.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/emu/argp_common.c' object='grub-core/kern/emu/grub_mknetdir-argp_common.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -c -o grub-core/kern/emu/grub_mknetdir-argp_common.o `test -f 'grub-core/kern/emu/argp_common.c' || echo '$(srcdir)/'`grub-core/kern/emu/argp_common.c grub-core/kern/emu/grub_mknetdir-argp_common.obj: grub-core/kern/emu/argp_common.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -MT grub-core/kern/emu/grub_mknetdir-argp_common.obj -MD -MP -MF grub-core/kern/emu/$(DEPDIR)/grub_mknetdir-argp_common.Tpo -c -o grub-core/kern/emu/grub_mknetdir-argp_common.obj `if test -f 'grub-core/kern/emu/argp_common.c'; then $(CYGPATH_W) 'grub-core/kern/emu/argp_common.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/emu/argp_common.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/emu/$(DEPDIR)/grub_mknetdir-argp_common.Tpo grub-core/kern/emu/$(DEPDIR)/grub_mknetdir-argp_common.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/emu/argp_common.c' object='grub-core/kern/emu/grub_mknetdir-argp_common.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -c -o grub-core/kern/emu/grub_mknetdir-argp_common.obj `if test -f 'grub-core/kern/emu/argp_common.c'; then $(CYGPATH_W) 'grub-core/kern/emu/argp_common.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/emu/argp_common.c'; fi` grub-core/lib/grub_mknetdir-reed_solomon.o: grub-core/lib/reed_solomon.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -MT grub-core/lib/grub_mknetdir-reed_solomon.o -MD -MP -MF grub-core/lib/$(DEPDIR)/grub_mknetdir-reed_solomon.Tpo -c -o grub-core/lib/grub_mknetdir-reed_solomon.o `test -f 'grub-core/lib/reed_solomon.c' || echo '$(srcdir)/'`grub-core/lib/reed_solomon.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/$(DEPDIR)/grub_mknetdir-reed_solomon.Tpo grub-core/lib/$(DEPDIR)/grub_mknetdir-reed_solomon.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/reed_solomon.c' object='grub-core/lib/grub_mknetdir-reed_solomon.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -c -o grub-core/lib/grub_mknetdir-reed_solomon.o `test -f 'grub-core/lib/reed_solomon.c' || echo '$(srcdir)/'`grub-core/lib/reed_solomon.c grub-core/lib/grub_mknetdir-reed_solomon.obj: grub-core/lib/reed_solomon.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -MT grub-core/lib/grub_mknetdir-reed_solomon.obj -MD -MP -MF grub-core/lib/$(DEPDIR)/grub_mknetdir-reed_solomon.Tpo -c -o grub-core/lib/grub_mknetdir-reed_solomon.obj `if test -f 'grub-core/lib/reed_solomon.c'; then $(CYGPATH_W) 'grub-core/lib/reed_solomon.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/reed_solomon.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/$(DEPDIR)/grub_mknetdir-reed_solomon.Tpo grub-core/lib/$(DEPDIR)/grub_mknetdir-reed_solomon.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/reed_solomon.c' object='grub-core/lib/grub_mknetdir-reed_solomon.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -c -o grub-core/lib/grub_mknetdir-reed_solomon.obj `if test -f 'grub-core/lib/reed_solomon.c'; then $(CYGPATH_W) 'grub-core/lib/reed_solomon.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/reed_solomon.c'; fi` grub-core/osdep/grub_mknetdir-blocklist.o: grub-core/osdep/blocklist.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_mknetdir-blocklist.o -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_mknetdir-blocklist.Tpo -c -o grub-core/osdep/grub_mknetdir-blocklist.o `test -f 'grub-core/osdep/blocklist.c' || echo '$(srcdir)/'`grub-core/osdep/blocklist.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_mknetdir-blocklist.Tpo grub-core/osdep/$(DEPDIR)/grub_mknetdir-blocklist.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/blocklist.c' object='grub-core/osdep/grub_mknetdir-blocklist.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_mknetdir-blocklist.o `test -f 'grub-core/osdep/blocklist.c' || echo '$(srcdir)/'`grub-core/osdep/blocklist.c grub-core/osdep/grub_mknetdir-blocklist.obj: grub-core/osdep/blocklist.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_mknetdir-blocklist.obj -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_mknetdir-blocklist.Tpo -c -o grub-core/osdep/grub_mknetdir-blocklist.obj `if test -f 'grub-core/osdep/blocklist.c'; then $(CYGPATH_W) 'grub-core/osdep/blocklist.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/blocklist.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_mknetdir-blocklist.Tpo grub-core/osdep/$(DEPDIR)/grub_mknetdir-blocklist.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/blocklist.c' object='grub-core/osdep/grub_mknetdir-blocklist.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_mknetdir-blocklist.obj `if test -f 'grub-core/osdep/blocklist.c'; then $(CYGPATH_W) 'grub-core/osdep/blocklist.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/blocklist.c'; fi` grub-core/osdep/grub_mknetdir-compress.o: grub-core/osdep/compress.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_mknetdir-compress.o -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_mknetdir-compress.Tpo -c -o grub-core/osdep/grub_mknetdir-compress.o `test -f 'grub-core/osdep/compress.c' || echo '$(srcdir)/'`grub-core/osdep/compress.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_mknetdir-compress.Tpo grub-core/osdep/$(DEPDIR)/grub_mknetdir-compress.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/compress.c' object='grub-core/osdep/grub_mknetdir-compress.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_mknetdir-compress.o `test -f 'grub-core/osdep/compress.c' || echo '$(srcdir)/'`grub-core/osdep/compress.c grub-core/osdep/grub_mknetdir-compress.obj: grub-core/osdep/compress.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_mknetdir-compress.obj -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_mknetdir-compress.Tpo -c -o grub-core/osdep/grub_mknetdir-compress.obj `if test -f 'grub-core/osdep/compress.c'; then $(CYGPATH_W) 'grub-core/osdep/compress.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/compress.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_mknetdir-compress.Tpo grub-core/osdep/$(DEPDIR)/grub_mknetdir-compress.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/compress.c' object='grub-core/osdep/grub_mknetdir-compress.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_mknetdir-compress.obj `if test -f 'grub-core/osdep/compress.c'; then $(CYGPATH_W) 'grub-core/osdep/compress.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/compress.c'; fi` grub-core/osdep/grub_mknetdir-config.o: grub-core/osdep/config.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_mknetdir-config.o -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_mknetdir-config.Tpo -c -o grub-core/osdep/grub_mknetdir-config.o `test -f 'grub-core/osdep/config.c' || echo '$(srcdir)/'`grub-core/osdep/config.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_mknetdir-config.Tpo grub-core/osdep/$(DEPDIR)/grub_mknetdir-config.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/config.c' object='grub-core/osdep/grub_mknetdir-config.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_mknetdir-config.o `test -f 'grub-core/osdep/config.c' || echo '$(srcdir)/'`grub-core/osdep/config.c grub-core/osdep/grub_mknetdir-config.obj: grub-core/osdep/config.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_mknetdir-config.obj -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_mknetdir-config.Tpo -c -o grub-core/osdep/grub_mknetdir-config.obj `if test -f 'grub-core/osdep/config.c'; then $(CYGPATH_W) 'grub-core/osdep/config.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/config.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_mknetdir-config.Tpo grub-core/osdep/$(DEPDIR)/grub_mknetdir-config.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/config.c' object='grub-core/osdep/grub_mknetdir-config.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_mknetdir-config.obj `if test -f 'grub-core/osdep/config.c'; then $(CYGPATH_W) 'grub-core/osdep/config.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/config.c'; fi` grub-core/osdep/grub_mknetdir-init.o: grub-core/osdep/init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_mknetdir-init.o -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_mknetdir-init.Tpo -c -o grub-core/osdep/grub_mknetdir-init.o `test -f 'grub-core/osdep/init.c' || echo '$(srcdir)/'`grub-core/osdep/init.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_mknetdir-init.Tpo grub-core/osdep/$(DEPDIR)/grub_mknetdir-init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/init.c' object='grub-core/osdep/grub_mknetdir-init.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_mknetdir-init.o `test -f 'grub-core/osdep/init.c' || echo '$(srcdir)/'`grub-core/osdep/init.c grub-core/osdep/grub_mknetdir-init.obj: grub-core/osdep/init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_mknetdir-init.obj -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_mknetdir-init.Tpo -c -o grub-core/osdep/grub_mknetdir-init.obj `if test -f 'grub-core/osdep/init.c'; then $(CYGPATH_W) 'grub-core/osdep/init.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/init.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_mknetdir-init.Tpo grub-core/osdep/$(DEPDIR)/grub_mknetdir-init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/init.c' object='grub-core/osdep/grub_mknetdir-init.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_mknetdir-init.obj `if test -f 'grub-core/osdep/init.c'; then $(CYGPATH_W) 'grub-core/osdep/init.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/init.c'; fi` grub-core/osdep/grub_mknetdir-ofpath.o: grub-core/osdep/ofpath.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_mknetdir-ofpath.o -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_mknetdir-ofpath.Tpo -c -o grub-core/osdep/grub_mknetdir-ofpath.o `test -f 'grub-core/osdep/ofpath.c' || echo '$(srcdir)/'`grub-core/osdep/ofpath.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_mknetdir-ofpath.Tpo grub-core/osdep/$(DEPDIR)/grub_mknetdir-ofpath.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/ofpath.c' object='grub-core/osdep/grub_mknetdir-ofpath.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_mknetdir-ofpath.o `test -f 'grub-core/osdep/ofpath.c' || echo '$(srcdir)/'`grub-core/osdep/ofpath.c grub-core/osdep/grub_mknetdir-ofpath.obj: grub-core/osdep/ofpath.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_mknetdir-ofpath.obj -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_mknetdir-ofpath.Tpo -c -o grub-core/osdep/grub_mknetdir-ofpath.obj `if test -f 'grub-core/osdep/ofpath.c'; then $(CYGPATH_W) 'grub-core/osdep/ofpath.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/ofpath.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_mknetdir-ofpath.Tpo grub-core/osdep/$(DEPDIR)/grub_mknetdir-ofpath.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/ofpath.c' object='grub-core/osdep/grub_mknetdir-ofpath.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_mknetdir-ofpath.obj `if test -f 'grub-core/osdep/ofpath.c'; then $(CYGPATH_W) 'grub-core/osdep/ofpath.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/ofpath.c'; fi` grub-core/osdep/grub_mknetdir-platform.o: grub-core/osdep/platform.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_mknetdir-platform.o -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_mknetdir-platform.Tpo -c -o grub-core/osdep/grub_mknetdir-platform.o `test -f 'grub-core/osdep/platform.c' || echo '$(srcdir)/'`grub-core/osdep/platform.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_mknetdir-platform.Tpo grub-core/osdep/$(DEPDIR)/grub_mknetdir-platform.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/platform.c' object='grub-core/osdep/grub_mknetdir-platform.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_mknetdir-platform.o `test -f 'grub-core/osdep/platform.c' || echo '$(srcdir)/'`grub-core/osdep/platform.c grub-core/osdep/grub_mknetdir-platform.obj: grub-core/osdep/platform.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_mknetdir-platform.obj -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_mknetdir-platform.Tpo -c -o grub-core/osdep/grub_mknetdir-platform.obj `if test -f 'grub-core/osdep/platform.c'; then $(CYGPATH_W) 'grub-core/osdep/platform.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/platform.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_mknetdir-platform.Tpo grub-core/osdep/$(DEPDIR)/grub_mknetdir-platform.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/platform.c' object='grub-core/osdep/grub_mknetdir-platform.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_mknetdir-platform.obj `if test -f 'grub-core/osdep/platform.c'; then $(CYGPATH_W) 'grub-core/osdep/platform.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/platform.c'; fi` grub-core/osdep/grub_mknetdir-platform_unix.o: grub-core/osdep/platform_unix.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_mknetdir-platform_unix.o -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_mknetdir-platform_unix.Tpo -c -o grub-core/osdep/grub_mknetdir-platform_unix.o `test -f 'grub-core/osdep/platform_unix.c' || echo '$(srcdir)/'`grub-core/osdep/platform_unix.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_mknetdir-platform_unix.Tpo grub-core/osdep/$(DEPDIR)/grub_mknetdir-platform_unix.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/platform_unix.c' object='grub-core/osdep/grub_mknetdir-platform_unix.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_mknetdir-platform_unix.o `test -f 'grub-core/osdep/platform_unix.c' || echo '$(srcdir)/'`grub-core/osdep/platform_unix.c grub-core/osdep/grub_mknetdir-platform_unix.obj: grub-core/osdep/platform_unix.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_mknetdir-platform_unix.obj -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_mknetdir-platform_unix.Tpo -c -o grub-core/osdep/grub_mknetdir-platform_unix.obj `if test -f 'grub-core/osdep/platform_unix.c'; then $(CYGPATH_W) 'grub-core/osdep/platform_unix.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/platform_unix.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_mknetdir-platform_unix.Tpo grub-core/osdep/$(DEPDIR)/grub_mknetdir-platform_unix.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/platform_unix.c' object='grub-core/osdep/grub_mknetdir-platform_unix.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_mknetdir-platform_unix.obj `if test -f 'grub-core/osdep/platform_unix.c'; then $(CYGPATH_W) 'grub-core/osdep/platform_unix.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/platform_unix.c'; fi` grub-core/osdep/grub_mknetdir-random.o: grub-core/osdep/random.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_mknetdir-random.o -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_mknetdir-random.Tpo -c -o grub-core/osdep/grub_mknetdir-random.o `test -f 'grub-core/osdep/random.c' || echo '$(srcdir)/'`grub-core/osdep/random.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_mknetdir-random.Tpo grub-core/osdep/$(DEPDIR)/grub_mknetdir-random.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/random.c' object='grub-core/osdep/grub_mknetdir-random.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_mknetdir-random.o `test -f 'grub-core/osdep/random.c' || echo '$(srcdir)/'`grub-core/osdep/random.c grub-core/osdep/grub_mknetdir-random.obj: grub-core/osdep/random.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_mknetdir-random.obj -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_mknetdir-random.Tpo -c -o grub-core/osdep/grub_mknetdir-random.obj `if test -f 'grub-core/osdep/random.c'; then $(CYGPATH_W) 'grub-core/osdep/random.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/random.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_mknetdir-random.Tpo grub-core/osdep/$(DEPDIR)/grub_mknetdir-random.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/random.c' object='grub-core/osdep/grub_mknetdir-random.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_mknetdir-random.obj `if test -f 'grub-core/osdep/random.c'; then $(CYGPATH_W) 'grub-core/osdep/random.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/random.c'; fi` util/grub_mknetdir-config.o: util/config.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -MT util/grub_mknetdir-config.o -MD -MP -MF util/$(DEPDIR)/grub_mknetdir-config.Tpo -c -o util/grub_mknetdir-config.o `test -f 'util/config.c' || echo '$(srcdir)/'`util/config.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mknetdir-config.Tpo util/$(DEPDIR)/grub_mknetdir-config.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/config.c' object='util/grub_mknetdir-config.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -c -o util/grub_mknetdir-config.o `test -f 'util/config.c' || echo '$(srcdir)/'`util/config.c util/grub_mknetdir-config.obj: util/config.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -MT util/grub_mknetdir-config.obj -MD -MP -MF util/$(DEPDIR)/grub_mknetdir-config.Tpo -c -o util/grub_mknetdir-config.obj `if test -f 'util/config.c'; then $(CYGPATH_W) 'util/config.c'; else $(CYGPATH_W) '$(srcdir)/util/config.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mknetdir-config.Tpo util/$(DEPDIR)/grub_mknetdir-config.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/config.c' object='util/grub_mknetdir-config.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -c -o util/grub_mknetdir-config.obj `if test -f 'util/config.c'; then $(CYGPATH_W) 'util/config.c'; else $(CYGPATH_W) '$(srcdir)/util/config.c'; fi` util/grub_mknetdir-editenv.o: util/editenv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -MT util/grub_mknetdir-editenv.o -MD -MP -MF util/$(DEPDIR)/grub_mknetdir-editenv.Tpo -c -o util/grub_mknetdir-editenv.o `test -f 'util/editenv.c' || echo '$(srcdir)/'`util/editenv.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mknetdir-editenv.Tpo util/$(DEPDIR)/grub_mknetdir-editenv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/editenv.c' object='util/grub_mknetdir-editenv.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -c -o util/grub_mknetdir-editenv.o `test -f 'util/editenv.c' || echo '$(srcdir)/'`util/editenv.c util/grub_mknetdir-editenv.obj: util/editenv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -MT util/grub_mknetdir-editenv.obj -MD -MP -MF util/$(DEPDIR)/grub_mknetdir-editenv.Tpo -c -o util/grub_mknetdir-editenv.obj `if test -f 'util/editenv.c'; then $(CYGPATH_W) 'util/editenv.c'; else $(CYGPATH_W) '$(srcdir)/util/editenv.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mknetdir-editenv.Tpo util/$(DEPDIR)/grub_mknetdir-editenv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/editenv.c' object='util/grub_mknetdir-editenv.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -c -o util/grub_mknetdir-editenv.obj `if test -f 'util/editenv.c'; then $(CYGPATH_W) 'util/editenv.c'; else $(CYGPATH_W) '$(srcdir)/util/editenv.c'; fi` util/grub_mknetdir-grub-install-common.o: util/grub-install-common.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -MT util/grub_mknetdir-grub-install-common.o -MD -MP -MF util/$(DEPDIR)/grub_mknetdir-grub-install-common.Tpo -c -o util/grub_mknetdir-grub-install-common.o `test -f 'util/grub-install-common.c' || echo '$(srcdir)/'`util/grub-install-common.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mknetdir-grub-install-common.Tpo util/$(DEPDIR)/grub_mknetdir-grub-install-common.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-install-common.c' object='util/grub_mknetdir-grub-install-common.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -c -o util/grub_mknetdir-grub-install-common.o `test -f 'util/grub-install-common.c' || echo '$(srcdir)/'`util/grub-install-common.c util/grub_mknetdir-grub-install-common.obj: util/grub-install-common.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -MT util/grub_mknetdir-grub-install-common.obj -MD -MP -MF util/$(DEPDIR)/grub_mknetdir-grub-install-common.Tpo -c -o util/grub_mknetdir-grub-install-common.obj `if test -f 'util/grub-install-common.c'; then $(CYGPATH_W) 'util/grub-install-common.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-install-common.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mknetdir-grub-install-common.Tpo util/$(DEPDIR)/grub_mknetdir-grub-install-common.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-install-common.c' object='util/grub_mknetdir-grub-install-common.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -c -o util/grub_mknetdir-grub-install-common.obj `if test -f 'util/grub-install-common.c'; then $(CYGPATH_W) 'util/grub-install-common.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-install-common.c'; fi` util/grub_mknetdir-grub-mkimage32.o: util/grub-mkimage32.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -MT util/grub_mknetdir-grub-mkimage32.o -MD -MP -MF util/$(DEPDIR)/grub_mknetdir-grub-mkimage32.Tpo -c -o util/grub_mknetdir-grub-mkimage32.o `test -f 'util/grub-mkimage32.c' || echo '$(srcdir)/'`util/grub-mkimage32.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mknetdir-grub-mkimage32.Tpo util/$(DEPDIR)/grub_mknetdir-grub-mkimage32.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-mkimage32.c' object='util/grub_mknetdir-grub-mkimage32.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -c -o util/grub_mknetdir-grub-mkimage32.o `test -f 'util/grub-mkimage32.c' || echo '$(srcdir)/'`util/grub-mkimage32.c util/grub_mknetdir-grub-mkimage32.obj: util/grub-mkimage32.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -MT util/grub_mknetdir-grub-mkimage32.obj -MD -MP -MF util/$(DEPDIR)/grub_mknetdir-grub-mkimage32.Tpo -c -o util/grub_mknetdir-grub-mkimage32.obj `if test -f 'util/grub-mkimage32.c'; then $(CYGPATH_W) 'util/grub-mkimage32.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-mkimage32.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mknetdir-grub-mkimage32.Tpo util/$(DEPDIR)/grub_mknetdir-grub-mkimage32.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-mkimage32.c' object='util/grub_mknetdir-grub-mkimage32.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -c -o util/grub_mknetdir-grub-mkimage32.obj `if test -f 'util/grub-mkimage32.c'; then $(CYGPATH_W) 'util/grub-mkimage32.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-mkimage32.c'; fi` util/grub_mknetdir-grub-mkimage64.o: util/grub-mkimage64.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -MT util/grub_mknetdir-grub-mkimage64.o -MD -MP -MF util/$(DEPDIR)/grub_mknetdir-grub-mkimage64.Tpo -c -o util/grub_mknetdir-grub-mkimage64.o `test -f 'util/grub-mkimage64.c' || echo '$(srcdir)/'`util/grub-mkimage64.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mknetdir-grub-mkimage64.Tpo util/$(DEPDIR)/grub_mknetdir-grub-mkimage64.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-mkimage64.c' object='util/grub_mknetdir-grub-mkimage64.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -c -o util/grub_mknetdir-grub-mkimage64.o `test -f 'util/grub-mkimage64.c' || echo '$(srcdir)/'`util/grub-mkimage64.c util/grub_mknetdir-grub-mkimage64.obj: util/grub-mkimage64.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -MT util/grub_mknetdir-grub-mkimage64.obj -MD -MP -MF util/$(DEPDIR)/grub_mknetdir-grub-mkimage64.Tpo -c -o util/grub_mknetdir-grub-mkimage64.obj `if test -f 'util/grub-mkimage64.c'; then $(CYGPATH_W) 'util/grub-mkimage64.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-mkimage64.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mknetdir-grub-mkimage64.Tpo util/$(DEPDIR)/grub_mknetdir-grub-mkimage64.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-mkimage64.c' object='util/grub_mknetdir-grub-mkimage64.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -c -o util/grub_mknetdir-grub-mkimage64.obj `if test -f 'util/grub-mkimage64.c'; then $(CYGPATH_W) 'util/grub-mkimage64.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-mkimage64.c'; fi` util/grub_mknetdir-grub-mknetdir.o: util/grub-mknetdir.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -MT util/grub_mknetdir-grub-mknetdir.o -MD -MP -MF util/$(DEPDIR)/grub_mknetdir-grub-mknetdir.Tpo -c -o util/grub_mknetdir-grub-mknetdir.o `test -f 'util/grub-mknetdir.c' || echo '$(srcdir)/'`util/grub-mknetdir.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mknetdir-grub-mknetdir.Tpo util/$(DEPDIR)/grub_mknetdir-grub-mknetdir.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-mknetdir.c' object='util/grub_mknetdir-grub-mknetdir.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -c -o util/grub_mknetdir-grub-mknetdir.o `test -f 'util/grub-mknetdir.c' || echo '$(srcdir)/'`util/grub-mknetdir.c util/grub_mknetdir-grub-mknetdir.obj: util/grub-mknetdir.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -MT util/grub_mknetdir-grub-mknetdir.obj -MD -MP -MF util/$(DEPDIR)/grub_mknetdir-grub-mknetdir.Tpo -c -o util/grub_mknetdir-grub-mknetdir.obj `if test -f 'util/grub-mknetdir.c'; then $(CYGPATH_W) 'util/grub-mknetdir.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-mknetdir.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mknetdir-grub-mknetdir.Tpo util/$(DEPDIR)/grub_mknetdir-grub-mknetdir.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-mknetdir.c' object='util/grub_mknetdir-grub-mknetdir.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -c -o util/grub_mknetdir-grub-mknetdir.obj `if test -f 'util/grub-mknetdir.c'; then $(CYGPATH_W) 'util/grub-mknetdir.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-mknetdir.c'; fi` util/grub_mknetdir-mkimage.o: util/mkimage.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -MT util/grub_mknetdir-mkimage.o -MD -MP -MF util/$(DEPDIR)/grub_mknetdir-mkimage.Tpo -c -o util/grub_mknetdir-mkimage.o `test -f 'util/mkimage.c' || echo '$(srcdir)/'`util/mkimage.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mknetdir-mkimage.Tpo util/$(DEPDIR)/grub_mknetdir-mkimage.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/mkimage.c' object='util/grub_mknetdir-mkimage.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -c -o util/grub_mknetdir-mkimage.o `test -f 'util/mkimage.c' || echo '$(srcdir)/'`util/mkimage.c util/grub_mknetdir-mkimage.obj: util/mkimage.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -MT util/grub_mknetdir-mkimage.obj -MD -MP -MF util/$(DEPDIR)/grub_mknetdir-mkimage.Tpo -c -o util/grub_mknetdir-mkimage.obj `if test -f 'util/mkimage.c'; then $(CYGPATH_W) 'util/mkimage.c'; else $(CYGPATH_W) '$(srcdir)/util/mkimage.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mknetdir-mkimage.Tpo util/$(DEPDIR)/grub_mknetdir-mkimage.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/mkimage.c' object='util/grub_mknetdir-mkimage.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -c -o util/grub_mknetdir-mkimage.obj `if test -f 'util/mkimage.c'; then $(CYGPATH_W) 'util/mkimage.c'; else $(CYGPATH_W) '$(srcdir)/util/mkimage.c'; fi` util/grub_mknetdir-resolve.o: util/resolve.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -MT util/grub_mknetdir-resolve.o -MD -MP -MF util/$(DEPDIR)/grub_mknetdir-resolve.Tpo -c -o util/grub_mknetdir-resolve.o `test -f 'util/resolve.c' || echo '$(srcdir)/'`util/resolve.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mknetdir-resolve.Tpo util/$(DEPDIR)/grub_mknetdir-resolve.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/resolve.c' object='util/grub_mknetdir-resolve.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -c -o util/grub_mknetdir-resolve.o `test -f 'util/resolve.c' || echo '$(srcdir)/'`util/resolve.c util/grub_mknetdir-resolve.obj: util/resolve.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -MT util/grub_mknetdir-resolve.obj -MD -MP -MF util/$(DEPDIR)/grub_mknetdir-resolve.Tpo -c -o util/grub_mknetdir-resolve.obj `if test -f 'util/resolve.c'; then $(CYGPATH_W) 'util/resolve.c'; else $(CYGPATH_W) '$(srcdir)/util/resolve.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mknetdir-resolve.Tpo util/$(DEPDIR)/grub_mknetdir-resolve.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/resolve.c' object='util/grub_mknetdir-resolve.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -c -o util/grub_mknetdir-resolve.obj `if test -f 'util/resolve.c'; then $(CYGPATH_W) 'util/resolve.c'; else $(CYGPATH_W) '$(srcdir)/util/resolve.c'; fi` util/grub_mknetdir-setup_bios.o: util/setup_bios.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -MT util/grub_mknetdir-setup_bios.o -MD -MP -MF util/$(DEPDIR)/grub_mknetdir-setup_bios.Tpo -c -o util/grub_mknetdir-setup_bios.o `test -f 'util/setup_bios.c' || echo '$(srcdir)/'`util/setup_bios.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mknetdir-setup_bios.Tpo util/$(DEPDIR)/grub_mknetdir-setup_bios.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/setup_bios.c' object='util/grub_mknetdir-setup_bios.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -c -o util/grub_mknetdir-setup_bios.o `test -f 'util/setup_bios.c' || echo '$(srcdir)/'`util/setup_bios.c util/grub_mknetdir-setup_bios.obj: util/setup_bios.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -MT util/grub_mknetdir-setup_bios.obj -MD -MP -MF util/$(DEPDIR)/grub_mknetdir-setup_bios.Tpo -c -o util/grub_mknetdir-setup_bios.obj `if test -f 'util/setup_bios.c'; then $(CYGPATH_W) 'util/setup_bios.c'; else $(CYGPATH_W) '$(srcdir)/util/setup_bios.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mknetdir-setup_bios.Tpo util/$(DEPDIR)/grub_mknetdir-setup_bios.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/setup_bios.c' object='util/grub_mknetdir-setup_bios.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -c -o util/grub_mknetdir-setup_bios.obj `if test -f 'util/setup_bios.c'; then $(CYGPATH_W) 'util/setup_bios.c'; else $(CYGPATH_W) '$(srcdir)/util/setup_bios.c'; fi` util/grub_mknetdir-setup_sparc.o: util/setup_sparc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -MT util/grub_mknetdir-setup_sparc.o -MD -MP -MF util/$(DEPDIR)/grub_mknetdir-setup_sparc.Tpo -c -o util/grub_mknetdir-setup_sparc.o `test -f 'util/setup_sparc.c' || echo '$(srcdir)/'`util/setup_sparc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mknetdir-setup_sparc.Tpo util/$(DEPDIR)/grub_mknetdir-setup_sparc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/setup_sparc.c' object='util/grub_mknetdir-setup_sparc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -c -o util/grub_mknetdir-setup_sparc.o `test -f 'util/setup_sparc.c' || echo '$(srcdir)/'`util/setup_sparc.c util/grub_mknetdir-setup_sparc.obj: util/setup_sparc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -MT util/grub_mknetdir-setup_sparc.obj -MD -MP -MF util/$(DEPDIR)/grub_mknetdir-setup_sparc.Tpo -c -o util/grub_mknetdir-setup_sparc.obj `if test -f 'util/setup_sparc.c'; then $(CYGPATH_W) 'util/setup_sparc.c'; else $(CYGPATH_W) '$(srcdir)/util/setup_sparc.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mknetdir-setup_sparc.Tpo util/$(DEPDIR)/grub_mknetdir-setup_sparc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/setup_sparc.c' object='util/grub_mknetdir-setup_sparc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mknetdir_CPPFLAGS) $(CPPFLAGS) $(grub_mknetdir_CFLAGS) $(CFLAGS) -c -o util/grub_mknetdir-setup_sparc.obj `if test -f 'util/setup_sparc.c'; then $(CYGPATH_W) 'util/setup_sparc.c'; else $(CYGPATH_W) '$(srcdir)/util/setup_sparc.c'; fi` grub-core/kern/emu/grub_mkpasswd_pbkdf2-argp_common.o: grub-core/kern/emu/argp_common.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkpasswd_pbkdf2_CPPFLAGS) $(CPPFLAGS) $(grub_mkpasswd_pbkdf2_CFLAGS) $(CFLAGS) -MT grub-core/kern/emu/grub_mkpasswd_pbkdf2-argp_common.o -MD -MP -MF grub-core/kern/emu/$(DEPDIR)/grub_mkpasswd_pbkdf2-argp_common.Tpo -c -o grub-core/kern/emu/grub_mkpasswd_pbkdf2-argp_common.o `test -f 'grub-core/kern/emu/argp_common.c' || echo '$(srcdir)/'`grub-core/kern/emu/argp_common.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/emu/$(DEPDIR)/grub_mkpasswd_pbkdf2-argp_common.Tpo grub-core/kern/emu/$(DEPDIR)/grub_mkpasswd_pbkdf2-argp_common.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/emu/argp_common.c' object='grub-core/kern/emu/grub_mkpasswd_pbkdf2-argp_common.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkpasswd_pbkdf2_CPPFLAGS) $(CPPFLAGS) $(grub_mkpasswd_pbkdf2_CFLAGS) $(CFLAGS) -c -o grub-core/kern/emu/grub_mkpasswd_pbkdf2-argp_common.o `test -f 'grub-core/kern/emu/argp_common.c' || echo '$(srcdir)/'`grub-core/kern/emu/argp_common.c grub-core/kern/emu/grub_mkpasswd_pbkdf2-argp_common.obj: grub-core/kern/emu/argp_common.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkpasswd_pbkdf2_CPPFLAGS) $(CPPFLAGS) $(grub_mkpasswd_pbkdf2_CFLAGS) $(CFLAGS) -MT grub-core/kern/emu/grub_mkpasswd_pbkdf2-argp_common.obj -MD -MP -MF grub-core/kern/emu/$(DEPDIR)/grub_mkpasswd_pbkdf2-argp_common.Tpo -c -o grub-core/kern/emu/grub_mkpasswd_pbkdf2-argp_common.obj `if test -f 'grub-core/kern/emu/argp_common.c'; then $(CYGPATH_W) 'grub-core/kern/emu/argp_common.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/emu/argp_common.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/emu/$(DEPDIR)/grub_mkpasswd_pbkdf2-argp_common.Tpo grub-core/kern/emu/$(DEPDIR)/grub_mkpasswd_pbkdf2-argp_common.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/emu/argp_common.c' object='grub-core/kern/emu/grub_mkpasswd_pbkdf2-argp_common.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkpasswd_pbkdf2_CPPFLAGS) $(CPPFLAGS) $(grub_mkpasswd_pbkdf2_CFLAGS) $(CFLAGS) -c -o grub-core/kern/emu/grub_mkpasswd_pbkdf2-argp_common.obj `if test -f 'grub-core/kern/emu/argp_common.c'; then $(CYGPATH_W) 'grub-core/kern/emu/argp_common.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/emu/argp_common.c'; fi` grub-core/osdep/grub_mkpasswd_pbkdf2-init.o: grub-core/osdep/init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkpasswd_pbkdf2_CPPFLAGS) $(CPPFLAGS) $(grub_mkpasswd_pbkdf2_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_mkpasswd_pbkdf2-init.o -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_mkpasswd_pbkdf2-init.Tpo -c -o grub-core/osdep/grub_mkpasswd_pbkdf2-init.o `test -f 'grub-core/osdep/init.c' || echo '$(srcdir)/'`grub-core/osdep/init.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_mkpasswd_pbkdf2-init.Tpo grub-core/osdep/$(DEPDIR)/grub_mkpasswd_pbkdf2-init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/init.c' object='grub-core/osdep/grub_mkpasswd_pbkdf2-init.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkpasswd_pbkdf2_CPPFLAGS) $(CPPFLAGS) $(grub_mkpasswd_pbkdf2_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_mkpasswd_pbkdf2-init.o `test -f 'grub-core/osdep/init.c' || echo '$(srcdir)/'`grub-core/osdep/init.c grub-core/osdep/grub_mkpasswd_pbkdf2-init.obj: grub-core/osdep/init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkpasswd_pbkdf2_CPPFLAGS) $(CPPFLAGS) $(grub_mkpasswd_pbkdf2_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_mkpasswd_pbkdf2-init.obj -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_mkpasswd_pbkdf2-init.Tpo -c -o grub-core/osdep/grub_mkpasswd_pbkdf2-init.obj `if test -f 'grub-core/osdep/init.c'; then $(CYGPATH_W) 'grub-core/osdep/init.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/init.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_mkpasswd_pbkdf2-init.Tpo grub-core/osdep/$(DEPDIR)/grub_mkpasswd_pbkdf2-init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/init.c' object='grub-core/osdep/grub_mkpasswd_pbkdf2-init.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkpasswd_pbkdf2_CPPFLAGS) $(CPPFLAGS) $(grub_mkpasswd_pbkdf2_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_mkpasswd_pbkdf2-init.obj `if test -f 'grub-core/osdep/init.c'; then $(CYGPATH_W) 'grub-core/osdep/init.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/init.c'; fi` grub-core/osdep/grub_mkpasswd_pbkdf2-random.o: grub-core/osdep/random.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkpasswd_pbkdf2_CPPFLAGS) $(CPPFLAGS) $(grub_mkpasswd_pbkdf2_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_mkpasswd_pbkdf2-random.o -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_mkpasswd_pbkdf2-random.Tpo -c -o grub-core/osdep/grub_mkpasswd_pbkdf2-random.o `test -f 'grub-core/osdep/random.c' || echo '$(srcdir)/'`grub-core/osdep/random.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_mkpasswd_pbkdf2-random.Tpo grub-core/osdep/$(DEPDIR)/grub_mkpasswd_pbkdf2-random.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/random.c' object='grub-core/osdep/grub_mkpasswd_pbkdf2-random.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkpasswd_pbkdf2_CPPFLAGS) $(CPPFLAGS) $(grub_mkpasswd_pbkdf2_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_mkpasswd_pbkdf2-random.o `test -f 'grub-core/osdep/random.c' || echo '$(srcdir)/'`grub-core/osdep/random.c grub-core/osdep/grub_mkpasswd_pbkdf2-random.obj: grub-core/osdep/random.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkpasswd_pbkdf2_CPPFLAGS) $(CPPFLAGS) $(grub_mkpasswd_pbkdf2_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_mkpasswd_pbkdf2-random.obj -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_mkpasswd_pbkdf2-random.Tpo -c -o grub-core/osdep/grub_mkpasswd_pbkdf2-random.obj `if test -f 'grub-core/osdep/random.c'; then $(CYGPATH_W) 'grub-core/osdep/random.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/random.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_mkpasswd_pbkdf2-random.Tpo grub-core/osdep/$(DEPDIR)/grub_mkpasswd_pbkdf2-random.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/random.c' object='grub-core/osdep/grub_mkpasswd_pbkdf2-random.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkpasswd_pbkdf2_CPPFLAGS) $(CPPFLAGS) $(grub_mkpasswd_pbkdf2_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_mkpasswd_pbkdf2-random.obj `if test -f 'grub-core/osdep/random.c'; then $(CYGPATH_W) 'grub-core/osdep/random.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/random.c'; fi` util/grub_mkpasswd_pbkdf2-grub-mkpasswd-pbkdf2.o: util/grub-mkpasswd-pbkdf2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkpasswd_pbkdf2_CPPFLAGS) $(CPPFLAGS) $(grub_mkpasswd_pbkdf2_CFLAGS) $(CFLAGS) -MT util/grub_mkpasswd_pbkdf2-grub-mkpasswd-pbkdf2.o -MD -MP -MF util/$(DEPDIR)/grub_mkpasswd_pbkdf2-grub-mkpasswd-pbkdf2.Tpo -c -o util/grub_mkpasswd_pbkdf2-grub-mkpasswd-pbkdf2.o `test -f 'util/grub-mkpasswd-pbkdf2.c' || echo '$(srcdir)/'`util/grub-mkpasswd-pbkdf2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mkpasswd_pbkdf2-grub-mkpasswd-pbkdf2.Tpo util/$(DEPDIR)/grub_mkpasswd_pbkdf2-grub-mkpasswd-pbkdf2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-mkpasswd-pbkdf2.c' object='util/grub_mkpasswd_pbkdf2-grub-mkpasswd-pbkdf2.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkpasswd_pbkdf2_CPPFLAGS) $(CPPFLAGS) $(grub_mkpasswd_pbkdf2_CFLAGS) $(CFLAGS) -c -o util/grub_mkpasswd_pbkdf2-grub-mkpasswd-pbkdf2.o `test -f 'util/grub-mkpasswd-pbkdf2.c' || echo '$(srcdir)/'`util/grub-mkpasswd-pbkdf2.c util/grub_mkpasswd_pbkdf2-grub-mkpasswd-pbkdf2.obj: util/grub-mkpasswd-pbkdf2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkpasswd_pbkdf2_CPPFLAGS) $(CPPFLAGS) $(grub_mkpasswd_pbkdf2_CFLAGS) $(CFLAGS) -MT util/grub_mkpasswd_pbkdf2-grub-mkpasswd-pbkdf2.obj -MD -MP -MF util/$(DEPDIR)/grub_mkpasswd_pbkdf2-grub-mkpasswd-pbkdf2.Tpo -c -o util/grub_mkpasswd_pbkdf2-grub-mkpasswd-pbkdf2.obj `if test -f 'util/grub-mkpasswd-pbkdf2.c'; then $(CYGPATH_W) 'util/grub-mkpasswd-pbkdf2.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-mkpasswd-pbkdf2.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mkpasswd_pbkdf2-grub-mkpasswd-pbkdf2.Tpo util/$(DEPDIR)/grub_mkpasswd_pbkdf2-grub-mkpasswd-pbkdf2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-mkpasswd-pbkdf2.c' object='util/grub_mkpasswd_pbkdf2-grub-mkpasswd-pbkdf2.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkpasswd_pbkdf2_CPPFLAGS) $(CPPFLAGS) $(grub_mkpasswd_pbkdf2_CFLAGS) $(CFLAGS) -c -o util/grub_mkpasswd_pbkdf2-grub-mkpasswd-pbkdf2.obj `if test -f 'util/grub-mkpasswd-pbkdf2.c'; then $(CYGPATH_W) 'util/grub-mkpasswd-pbkdf2.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-mkpasswd-pbkdf2.c'; fi` grub-core/kern/emu/grub_mkrelpath-argp_common.o: grub-core/kern/emu/argp_common.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrelpath_CPPFLAGS) $(CPPFLAGS) $(grub_mkrelpath_CFLAGS) $(CFLAGS) -MT grub-core/kern/emu/grub_mkrelpath-argp_common.o -MD -MP -MF grub-core/kern/emu/$(DEPDIR)/grub_mkrelpath-argp_common.Tpo -c -o grub-core/kern/emu/grub_mkrelpath-argp_common.o `test -f 'grub-core/kern/emu/argp_common.c' || echo '$(srcdir)/'`grub-core/kern/emu/argp_common.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/emu/$(DEPDIR)/grub_mkrelpath-argp_common.Tpo grub-core/kern/emu/$(DEPDIR)/grub_mkrelpath-argp_common.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/emu/argp_common.c' object='grub-core/kern/emu/grub_mkrelpath-argp_common.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrelpath_CPPFLAGS) $(CPPFLAGS) $(grub_mkrelpath_CFLAGS) $(CFLAGS) -c -o grub-core/kern/emu/grub_mkrelpath-argp_common.o `test -f 'grub-core/kern/emu/argp_common.c' || echo '$(srcdir)/'`grub-core/kern/emu/argp_common.c grub-core/kern/emu/grub_mkrelpath-argp_common.obj: grub-core/kern/emu/argp_common.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrelpath_CPPFLAGS) $(CPPFLAGS) $(grub_mkrelpath_CFLAGS) $(CFLAGS) -MT grub-core/kern/emu/grub_mkrelpath-argp_common.obj -MD -MP -MF grub-core/kern/emu/$(DEPDIR)/grub_mkrelpath-argp_common.Tpo -c -o grub-core/kern/emu/grub_mkrelpath-argp_common.obj `if test -f 'grub-core/kern/emu/argp_common.c'; then $(CYGPATH_W) 'grub-core/kern/emu/argp_common.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/emu/argp_common.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/emu/$(DEPDIR)/grub_mkrelpath-argp_common.Tpo grub-core/kern/emu/$(DEPDIR)/grub_mkrelpath-argp_common.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/emu/argp_common.c' object='grub-core/kern/emu/grub_mkrelpath-argp_common.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrelpath_CPPFLAGS) $(CPPFLAGS) $(grub_mkrelpath_CFLAGS) $(CFLAGS) -c -o grub-core/kern/emu/grub_mkrelpath-argp_common.obj `if test -f 'grub-core/kern/emu/argp_common.c'; then $(CYGPATH_W) 'grub-core/kern/emu/argp_common.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/emu/argp_common.c'; fi` grub-core/osdep/grub_mkrelpath-init.o: grub-core/osdep/init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrelpath_CPPFLAGS) $(CPPFLAGS) $(grub_mkrelpath_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_mkrelpath-init.o -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_mkrelpath-init.Tpo -c -o grub-core/osdep/grub_mkrelpath-init.o `test -f 'grub-core/osdep/init.c' || echo '$(srcdir)/'`grub-core/osdep/init.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_mkrelpath-init.Tpo grub-core/osdep/$(DEPDIR)/grub_mkrelpath-init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/init.c' object='grub-core/osdep/grub_mkrelpath-init.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrelpath_CPPFLAGS) $(CPPFLAGS) $(grub_mkrelpath_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_mkrelpath-init.o `test -f 'grub-core/osdep/init.c' || echo '$(srcdir)/'`grub-core/osdep/init.c grub-core/osdep/grub_mkrelpath-init.obj: grub-core/osdep/init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrelpath_CPPFLAGS) $(CPPFLAGS) $(grub_mkrelpath_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_mkrelpath-init.obj -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_mkrelpath-init.Tpo -c -o grub-core/osdep/grub_mkrelpath-init.obj `if test -f 'grub-core/osdep/init.c'; then $(CYGPATH_W) 'grub-core/osdep/init.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/init.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_mkrelpath-init.Tpo grub-core/osdep/$(DEPDIR)/grub_mkrelpath-init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/init.c' object='grub-core/osdep/grub_mkrelpath-init.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrelpath_CPPFLAGS) $(CPPFLAGS) $(grub_mkrelpath_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_mkrelpath-init.obj `if test -f 'grub-core/osdep/init.c'; then $(CYGPATH_W) 'grub-core/osdep/init.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/init.c'; fi` util/grub_mkrelpath-grub-mkrelpath.o: util/grub-mkrelpath.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrelpath_CPPFLAGS) $(CPPFLAGS) $(grub_mkrelpath_CFLAGS) $(CFLAGS) -MT util/grub_mkrelpath-grub-mkrelpath.o -MD -MP -MF util/$(DEPDIR)/grub_mkrelpath-grub-mkrelpath.Tpo -c -o util/grub_mkrelpath-grub-mkrelpath.o `test -f 'util/grub-mkrelpath.c' || echo '$(srcdir)/'`util/grub-mkrelpath.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mkrelpath-grub-mkrelpath.Tpo util/$(DEPDIR)/grub_mkrelpath-grub-mkrelpath.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-mkrelpath.c' object='util/grub_mkrelpath-grub-mkrelpath.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrelpath_CPPFLAGS) $(CPPFLAGS) $(grub_mkrelpath_CFLAGS) $(CFLAGS) -c -o util/grub_mkrelpath-grub-mkrelpath.o `test -f 'util/grub-mkrelpath.c' || echo '$(srcdir)/'`util/grub-mkrelpath.c util/grub_mkrelpath-grub-mkrelpath.obj: util/grub-mkrelpath.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrelpath_CPPFLAGS) $(CPPFLAGS) $(grub_mkrelpath_CFLAGS) $(CFLAGS) -MT util/grub_mkrelpath-grub-mkrelpath.obj -MD -MP -MF util/$(DEPDIR)/grub_mkrelpath-grub-mkrelpath.Tpo -c -o util/grub_mkrelpath-grub-mkrelpath.obj `if test -f 'util/grub-mkrelpath.c'; then $(CYGPATH_W) 'util/grub-mkrelpath.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-mkrelpath.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mkrelpath-grub-mkrelpath.Tpo util/$(DEPDIR)/grub_mkrelpath-grub-mkrelpath.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-mkrelpath.c' object='util/grub_mkrelpath-grub-mkrelpath.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrelpath_CPPFLAGS) $(CPPFLAGS) $(grub_mkrelpath_CFLAGS) $(CFLAGS) -c -o util/grub_mkrelpath-grub-mkrelpath.obj `if test -f 'util/grub-mkrelpath.c'; then $(CYGPATH_W) 'util/grub-mkrelpath.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-mkrelpath.c'; fi` grub-core/disk/grub_mkrescue-host.o: grub-core/disk/host.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -MT grub-core/disk/grub_mkrescue-host.o -MD -MP -MF grub-core/disk/$(DEPDIR)/grub_mkrescue-host.Tpo -c -o grub-core/disk/grub_mkrescue-host.o `test -f 'grub-core/disk/host.c' || echo '$(srcdir)/'`grub-core/disk/host.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/disk/$(DEPDIR)/grub_mkrescue-host.Tpo grub-core/disk/$(DEPDIR)/grub_mkrescue-host.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/disk/host.c' object='grub-core/disk/grub_mkrescue-host.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -c -o grub-core/disk/grub_mkrescue-host.o `test -f 'grub-core/disk/host.c' || echo '$(srcdir)/'`grub-core/disk/host.c grub-core/disk/grub_mkrescue-host.obj: grub-core/disk/host.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -MT grub-core/disk/grub_mkrescue-host.obj -MD -MP -MF grub-core/disk/$(DEPDIR)/grub_mkrescue-host.Tpo -c -o grub-core/disk/grub_mkrescue-host.obj `if test -f 'grub-core/disk/host.c'; then $(CYGPATH_W) 'grub-core/disk/host.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/disk/host.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/disk/$(DEPDIR)/grub_mkrescue-host.Tpo grub-core/disk/$(DEPDIR)/grub_mkrescue-host.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/disk/host.c' object='grub-core/disk/grub_mkrescue-host.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -c -o grub-core/disk/grub_mkrescue-host.obj `if test -f 'grub-core/disk/host.c'; then $(CYGPATH_W) 'grub-core/disk/host.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/disk/host.c'; fi` grub-core/kern/emu/grub_mkrescue-argp_common.o: grub-core/kern/emu/argp_common.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -MT grub-core/kern/emu/grub_mkrescue-argp_common.o -MD -MP -MF grub-core/kern/emu/$(DEPDIR)/grub_mkrescue-argp_common.Tpo -c -o grub-core/kern/emu/grub_mkrescue-argp_common.o `test -f 'grub-core/kern/emu/argp_common.c' || echo '$(srcdir)/'`grub-core/kern/emu/argp_common.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/emu/$(DEPDIR)/grub_mkrescue-argp_common.Tpo grub-core/kern/emu/$(DEPDIR)/grub_mkrescue-argp_common.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/emu/argp_common.c' object='grub-core/kern/emu/grub_mkrescue-argp_common.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -c -o grub-core/kern/emu/grub_mkrescue-argp_common.o `test -f 'grub-core/kern/emu/argp_common.c' || echo '$(srcdir)/'`grub-core/kern/emu/argp_common.c grub-core/kern/emu/grub_mkrescue-argp_common.obj: grub-core/kern/emu/argp_common.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -MT grub-core/kern/emu/grub_mkrescue-argp_common.obj -MD -MP -MF grub-core/kern/emu/$(DEPDIR)/grub_mkrescue-argp_common.Tpo -c -o grub-core/kern/emu/grub_mkrescue-argp_common.obj `if test -f 'grub-core/kern/emu/argp_common.c'; then $(CYGPATH_W) 'grub-core/kern/emu/argp_common.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/emu/argp_common.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/emu/$(DEPDIR)/grub_mkrescue-argp_common.Tpo grub-core/kern/emu/$(DEPDIR)/grub_mkrescue-argp_common.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/emu/argp_common.c' object='grub-core/kern/emu/grub_mkrescue-argp_common.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -c -o grub-core/kern/emu/grub_mkrescue-argp_common.obj `if test -f 'grub-core/kern/emu/argp_common.c'; then $(CYGPATH_W) 'grub-core/kern/emu/argp_common.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/emu/argp_common.c'; fi` grub-core/kern/emu/grub_mkrescue-hostfs.o: grub-core/kern/emu/hostfs.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -MT grub-core/kern/emu/grub_mkrescue-hostfs.o -MD -MP -MF grub-core/kern/emu/$(DEPDIR)/grub_mkrescue-hostfs.Tpo -c -o grub-core/kern/emu/grub_mkrescue-hostfs.o `test -f 'grub-core/kern/emu/hostfs.c' || echo '$(srcdir)/'`grub-core/kern/emu/hostfs.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/emu/$(DEPDIR)/grub_mkrescue-hostfs.Tpo grub-core/kern/emu/$(DEPDIR)/grub_mkrescue-hostfs.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/emu/hostfs.c' object='grub-core/kern/emu/grub_mkrescue-hostfs.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -c -o grub-core/kern/emu/grub_mkrescue-hostfs.o `test -f 'grub-core/kern/emu/hostfs.c' || echo '$(srcdir)/'`grub-core/kern/emu/hostfs.c grub-core/kern/emu/grub_mkrescue-hostfs.obj: grub-core/kern/emu/hostfs.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -MT grub-core/kern/emu/grub_mkrescue-hostfs.obj -MD -MP -MF grub-core/kern/emu/$(DEPDIR)/grub_mkrescue-hostfs.Tpo -c -o grub-core/kern/emu/grub_mkrescue-hostfs.obj `if test -f 'grub-core/kern/emu/hostfs.c'; then $(CYGPATH_W) 'grub-core/kern/emu/hostfs.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/emu/hostfs.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/emu/$(DEPDIR)/grub_mkrescue-hostfs.Tpo grub-core/kern/emu/$(DEPDIR)/grub_mkrescue-hostfs.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/emu/hostfs.c' object='grub-core/kern/emu/grub_mkrescue-hostfs.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -c -o grub-core/kern/emu/grub_mkrescue-hostfs.obj `if test -f 'grub-core/kern/emu/hostfs.c'; then $(CYGPATH_W) 'grub-core/kern/emu/hostfs.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/emu/hostfs.c'; fi` grub-core/lib/grub_mkrescue-reed_solomon.o: grub-core/lib/reed_solomon.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -MT grub-core/lib/grub_mkrescue-reed_solomon.o -MD -MP -MF grub-core/lib/$(DEPDIR)/grub_mkrescue-reed_solomon.Tpo -c -o grub-core/lib/grub_mkrescue-reed_solomon.o `test -f 'grub-core/lib/reed_solomon.c' || echo '$(srcdir)/'`grub-core/lib/reed_solomon.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/$(DEPDIR)/grub_mkrescue-reed_solomon.Tpo grub-core/lib/$(DEPDIR)/grub_mkrescue-reed_solomon.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/reed_solomon.c' object='grub-core/lib/grub_mkrescue-reed_solomon.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -c -o grub-core/lib/grub_mkrescue-reed_solomon.o `test -f 'grub-core/lib/reed_solomon.c' || echo '$(srcdir)/'`grub-core/lib/reed_solomon.c grub-core/lib/grub_mkrescue-reed_solomon.obj: grub-core/lib/reed_solomon.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -MT grub-core/lib/grub_mkrescue-reed_solomon.obj -MD -MP -MF grub-core/lib/$(DEPDIR)/grub_mkrescue-reed_solomon.Tpo -c -o grub-core/lib/grub_mkrescue-reed_solomon.obj `if test -f 'grub-core/lib/reed_solomon.c'; then $(CYGPATH_W) 'grub-core/lib/reed_solomon.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/reed_solomon.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/$(DEPDIR)/grub_mkrescue-reed_solomon.Tpo grub-core/lib/$(DEPDIR)/grub_mkrescue-reed_solomon.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/reed_solomon.c' object='grub-core/lib/grub_mkrescue-reed_solomon.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -c -o grub-core/lib/grub_mkrescue-reed_solomon.obj `if test -f 'grub-core/lib/reed_solomon.c'; then $(CYGPATH_W) 'grub-core/lib/reed_solomon.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/reed_solomon.c'; fi` grub-core/osdep/grub_mkrescue-blocklist.o: grub-core/osdep/blocklist.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_mkrescue-blocklist.o -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_mkrescue-blocklist.Tpo -c -o grub-core/osdep/grub_mkrescue-blocklist.o `test -f 'grub-core/osdep/blocklist.c' || echo '$(srcdir)/'`grub-core/osdep/blocklist.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_mkrescue-blocklist.Tpo grub-core/osdep/$(DEPDIR)/grub_mkrescue-blocklist.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/blocklist.c' object='grub-core/osdep/grub_mkrescue-blocklist.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_mkrescue-blocklist.o `test -f 'grub-core/osdep/blocklist.c' || echo '$(srcdir)/'`grub-core/osdep/blocklist.c grub-core/osdep/grub_mkrescue-blocklist.obj: grub-core/osdep/blocklist.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_mkrescue-blocklist.obj -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_mkrescue-blocklist.Tpo -c -o grub-core/osdep/grub_mkrescue-blocklist.obj `if test -f 'grub-core/osdep/blocklist.c'; then $(CYGPATH_W) 'grub-core/osdep/blocklist.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/blocklist.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_mkrescue-blocklist.Tpo grub-core/osdep/$(DEPDIR)/grub_mkrescue-blocklist.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/blocklist.c' object='grub-core/osdep/grub_mkrescue-blocklist.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_mkrescue-blocklist.obj `if test -f 'grub-core/osdep/blocklist.c'; then $(CYGPATH_W) 'grub-core/osdep/blocklist.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/blocklist.c'; fi` grub-core/osdep/grub_mkrescue-compress.o: grub-core/osdep/compress.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_mkrescue-compress.o -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_mkrescue-compress.Tpo -c -o grub-core/osdep/grub_mkrescue-compress.o `test -f 'grub-core/osdep/compress.c' || echo '$(srcdir)/'`grub-core/osdep/compress.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_mkrescue-compress.Tpo grub-core/osdep/$(DEPDIR)/grub_mkrescue-compress.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/compress.c' object='grub-core/osdep/grub_mkrescue-compress.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_mkrescue-compress.o `test -f 'grub-core/osdep/compress.c' || echo '$(srcdir)/'`grub-core/osdep/compress.c grub-core/osdep/grub_mkrescue-compress.obj: grub-core/osdep/compress.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_mkrescue-compress.obj -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_mkrescue-compress.Tpo -c -o grub-core/osdep/grub_mkrescue-compress.obj `if test -f 'grub-core/osdep/compress.c'; then $(CYGPATH_W) 'grub-core/osdep/compress.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/compress.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_mkrescue-compress.Tpo grub-core/osdep/$(DEPDIR)/grub_mkrescue-compress.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/compress.c' object='grub-core/osdep/grub_mkrescue-compress.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_mkrescue-compress.obj `if test -f 'grub-core/osdep/compress.c'; then $(CYGPATH_W) 'grub-core/osdep/compress.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/compress.c'; fi` grub-core/osdep/grub_mkrescue-config.o: grub-core/osdep/config.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_mkrescue-config.o -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_mkrescue-config.Tpo -c -o grub-core/osdep/grub_mkrescue-config.o `test -f 'grub-core/osdep/config.c' || echo '$(srcdir)/'`grub-core/osdep/config.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_mkrescue-config.Tpo grub-core/osdep/$(DEPDIR)/grub_mkrescue-config.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/config.c' object='grub-core/osdep/grub_mkrescue-config.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_mkrescue-config.o `test -f 'grub-core/osdep/config.c' || echo '$(srcdir)/'`grub-core/osdep/config.c grub-core/osdep/grub_mkrescue-config.obj: grub-core/osdep/config.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_mkrescue-config.obj -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_mkrescue-config.Tpo -c -o grub-core/osdep/grub_mkrescue-config.obj `if test -f 'grub-core/osdep/config.c'; then $(CYGPATH_W) 'grub-core/osdep/config.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/config.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_mkrescue-config.Tpo grub-core/osdep/$(DEPDIR)/grub_mkrescue-config.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/config.c' object='grub-core/osdep/grub_mkrescue-config.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_mkrescue-config.obj `if test -f 'grub-core/osdep/config.c'; then $(CYGPATH_W) 'grub-core/osdep/config.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/config.c'; fi` grub-core/osdep/grub_mkrescue-init.o: grub-core/osdep/init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_mkrescue-init.o -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_mkrescue-init.Tpo -c -o grub-core/osdep/grub_mkrescue-init.o `test -f 'grub-core/osdep/init.c' || echo '$(srcdir)/'`grub-core/osdep/init.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_mkrescue-init.Tpo grub-core/osdep/$(DEPDIR)/grub_mkrescue-init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/init.c' object='grub-core/osdep/grub_mkrescue-init.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_mkrescue-init.o `test -f 'grub-core/osdep/init.c' || echo '$(srcdir)/'`grub-core/osdep/init.c grub-core/osdep/grub_mkrescue-init.obj: grub-core/osdep/init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_mkrescue-init.obj -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_mkrescue-init.Tpo -c -o grub-core/osdep/grub_mkrescue-init.obj `if test -f 'grub-core/osdep/init.c'; then $(CYGPATH_W) 'grub-core/osdep/init.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/init.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_mkrescue-init.Tpo grub-core/osdep/$(DEPDIR)/grub_mkrescue-init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/init.c' object='grub-core/osdep/grub_mkrescue-init.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_mkrescue-init.obj `if test -f 'grub-core/osdep/init.c'; then $(CYGPATH_W) 'grub-core/osdep/init.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/init.c'; fi` grub-core/osdep/grub_mkrescue-ofpath.o: grub-core/osdep/ofpath.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_mkrescue-ofpath.o -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_mkrescue-ofpath.Tpo -c -o grub-core/osdep/grub_mkrescue-ofpath.o `test -f 'grub-core/osdep/ofpath.c' || echo '$(srcdir)/'`grub-core/osdep/ofpath.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_mkrescue-ofpath.Tpo grub-core/osdep/$(DEPDIR)/grub_mkrescue-ofpath.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/ofpath.c' object='grub-core/osdep/grub_mkrescue-ofpath.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_mkrescue-ofpath.o `test -f 'grub-core/osdep/ofpath.c' || echo '$(srcdir)/'`grub-core/osdep/ofpath.c grub-core/osdep/grub_mkrescue-ofpath.obj: grub-core/osdep/ofpath.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_mkrescue-ofpath.obj -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_mkrescue-ofpath.Tpo -c -o grub-core/osdep/grub_mkrescue-ofpath.obj `if test -f 'grub-core/osdep/ofpath.c'; then $(CYGPATH_W) 'grub-core/osdep/ofpath.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/ofpath.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_mkrescue-ofpath.Tpo grub-core/osdep/$(DEPDIR)/grub_mkrescue-ofpath.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/ofpath.c' object='grub-core/osdep/grub_mkrescue-ofpath.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_mkrescue-ofpath.obj `if test -f 'grub-core/osdep/ofpath.c'; then $(CYGPATH_W) 'grub-core/osdep/ofpath.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/ofpath.c'; fi` grub-core/osdep/grub_mkrescue-platform.o: grub-core/osdep/platform.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_mkrescue-platform.o -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_mkrescue-platform.Tpo -c -o grub-core/osdep/grub_mkrescue-platform.o `test -f 'grub-core/osdep/platform.c' || echo '$(srcdir)/'`grub-core/osdep/platform.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_mkrescue-platform.Tpo grub-core/osdep/$(DEPDIR)/grub_mkrescue-platform.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/platform.c' object='grub-core/osdep/grub_mkrescue-platform.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_mkrescue-platform.o `test -f 'grub-core/osdep/platform.c' || echo '$(srcdir)/'`grub-core/osdep/platform.c grub-core/osdep/grub_mkrescue-platform.obj: grub-core/osdep/platform.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_mkrescue-platform.obj -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_mkrescue-platform.Tpo -c -o grub-core/osdep/grub_mkrescue-platform.obj `if test -f 'grub-core/osdep/platform.c'; then $(CYGPATH_W) 'grub-core/osdep/platform.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/platform.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_mkrescue-platform.Tpo grub-core/osdep/$(DEPDIR)/grub_mkrescue-platform.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/platform.c' object='grub-core/osdep/grub_mkrescue-platform.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_mkrescue-platform.obj `if test -f 'grub-core/osdep/platform.c'; then $(CYGPATH_W) 'grub-core/osdep/platform.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/platform.c'; fi` grub-core/osdep/grub_mkrescue-platform_unix.o: grub-core/osdep/platform_unix.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_mkrescue-platform_unix.o -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_mkrescue-platform_unix.Tpo -c -o grub-core/osdep/grub_mkrescue-platform_unix.o `test -f 'grub-core/osdep/platform_unix.c' || echo '$(srcdir)/'`grub-core/osdep/platform_unix.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_mkrescue-platform_unix.Tpo grub-core/osdep/$(DEPDIR)/grub_mkrescue-platform_unix.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/platform_unix.c' object='grub-core/osdep/grub_mkrescue-platform_unix.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_mkrescue-platform_unix.o `test -f 'grub-core/osdep/platform_unix.c' || echo '$(srcdir)/'`grub-core/osdep/platform_unix.c grub-core/osdep/grub_mkrescue-platform_unix.obj: grub-core/osdep/platform_unix.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_mkrescue-platform_unix.obj -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_mkrescue-platform_unix.Tpo -c -o grub-core/osdep/grub_mkrescue-platform_unix.obj `if test -f 'grub-core/osdep/platform_unix.c'; then $(CYGPATH_W) 'grub-core/osdep/platform_unix.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/platform_unix.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_mkrescue-platform_unix.Tpo grub-core/osdep/$(DEPDIR)/grub_mkrescue-platform_unix.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/platform_unix.c' object='grub-core/osdep/grub_mkrescue-platform_unix.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_mkrescue-platform_unix.obj `if test -f 'grub-core/osdep/platform_unix.c'; then $(CYGPATH_W) 'grub-core/osdep/platform_unix.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/platform_unix.c'; fi` grub-core/osdep/grub_mkrescue-random.o: grub-core/osdep/random.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_mkrescue-random.o -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_mkrescue-random.Tpo -c -o grub-core/osdep/grub_mkrescue-random.o `test -f 'grub-core/osdep/random.c' || echo '$(srcdir)/'`grub-core/osdep/random.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_mkrescue-random.Tpo grub-core/osdep/$(DEPDIR)/grub_mkrescue-random.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/random.c' object='grub-core/osdep/grub_mkrescue-random.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_mkrescue-random.o `test -f 'grub-core/osdep/random.c' || echo '$(srcdir)/'`grub-core/osdep/random.c grub-core/osdep/grub_mkrescue-random.obj: grub-core/osdep/random.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_mkrescue-random.obj -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_mkrescue-random.Tpo -c -o grub-core/osdep/grub_mkrescue-random.obj `if test -f 'grub-core/osdep/random.c'; then $(CYGPATH_W) 'grub-core/osdep/random.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/random.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_mkrescue-random.Tpo grub-core/osdep/$(DEPDIR)/grub_mkrescue-random.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/random.c' object='grub-core/osdep/grub_mkrescue-random.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_mkrescue-random.obj `if test -f 'grub-core/osdep/random.c'; then $(CYGPATH_W) 'grub-core/osdep/random.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/random.c'; fi` util/grub_mkrescue-config.o: util/config.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -MT util/grub_mkrescue-config.o -MD -MP -MF util/$(DEPDIR)/grub_mkrescue-config.Tpo -c -o util/grub_mkrescue-config.o `test -f 'util/config.c' || echo '$(srcdir)/'`util/config.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mkrescue-config.Tpo util/$(DEPDIR)/grub_mkrescue-config.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/config.c' object='util/grub_mkrescue-config.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -c -o util/grub_mkrescue-config.o `test -f 'util/config.c' || echo '$(srcdir)/'`util/config.c util/grub_mkrescue-config.obj: util/config.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -MT util/grub_mkrescue-config.obj -MD -MP -MF util/$(DEPDIR)/grub_mkrescue-config.Tpo -c -o util/grub_mkrescue-config.obj `if test -f 'util/config.c'; then $(CYGPATH_W) 'util/config.c'; else $(CYGPATH_W) '$(srcdir)/util/config.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mkrescue-config.Tpo util/$(DEPDIR)/grub_mkrescue-config.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/config.c' object='util/grub_mkrescue-config.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -c -o util/grub_mkrescue-config.obj `if test -f 'util/config.c'; then $(CYGPATH_W) 'util/config.c'; else $(CYGPATH_W) '$(srcdir)/util/config.c'; fi` util/grub_mkrescue-editenv.o: util/editenv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -MT util/grub_mkrescue-editenv.o -MD -MP -MF util/$(DEPDIR)/grub_mkrescue-editenv.Tpo -c -o util/grub_mkrescue-editenv.o `test -f 'util/editenv.c' || echo '$(srcdir)/'`util/editenv.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mkrescue-editenv.Tpo util/$(DEPDIR)/grub_mkrescue-editenv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/editenv.c' object='util/grub_mkrescue-editenv.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -c -o util/grub_mkrescue-editenv.o `test -f 'util/editenv.c' || echo '$(srcdir)/'`util/editenv.c util/grub_mkrescue-editenv.obj: util/editenv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -MT util/grub_mkrescue-editenv.obj -MD -MP -MF util/$(DEPDIR)/grub_mkrescue-editenv.Tpo -c -o util/grub_mkrescue-editenv.obj `if test -f 'util/editenv.c'; then $(CYGPATH_W) 'util/editenv.c'; else $(CYGPATH_W) '$(srcdir)/util/editenv.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mkrescue-editenv.Tpo util/$(DEPDIR)/grub_mkrescue-editenv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/editenv.c' object='util/grub_mkrescue-editenv.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -c -o util/grub_mkrescue-editenv.obj `if test -f 'util/editenv.c'; then $(CYGPATH_W) 'util/editenv.c'; else $(CYGPATH_W) '$(srcdir)/util/editenv.c'; fi` util/grub_mkrescue-glue-efi.o: util/glue-efi.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -MT util/grub_mkrescue-glue-efi.o -MD -MP -MF util/$(DEPDIR)/grub_mkrescue-glue-efi.Tpo -c -o util/grub_mkrescue-glue-efi.o `test -f 'util/glue-efi.c' || echo '$(srcdir)/'`util/glue-efi.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mkrescue-glue-efi.Tpo util/$(DEPDIR)/grub_mkrescue-glue-efi.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/glue-efi.c' object='util/grub_mkrescue-glue-efi.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -c -o util/grub_mkrescue-glue-efi.o `test -f 'util/glue-efi.c' || echo '$(srcdir)/'`util/glue-efi.c util/grub_mkrescue-glue-efi.obj: util/glue-efi.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -MT util/grub_mkrescue-glue-efi.obj -MD -MP -MF util/$(DEPDIR)/grub_mkrescue-glue-efi.Tpo -c -o util/grub_mkrescue-glue-efi.obj `if test -f 'util/glue-efi.c'; then $(CYGPATH_W) 'util/glue-efi.c'; else $(CYGPATH_W) '$(srcdir)/util/glue-efi.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mkrescue-glue-efi.Tpo util/$(DEPDIR)/grub_mkrescue-glue-efi.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/glue-efi.c' object='util/grub_mkrescue-glue-efi.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -c -o util/grub_mkrescue-glue-efi.obj `if test -f 'util/glue-efi.c'; then $(CYGPATH_W) 'util/glue-efi.c'; else $(CYGPATH_W) '$(srcdir)/util/glue-efi.c'; fi` util/grub_mkrescue-grub-install-common.o: util/grub-install-common.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -MT util/grub_mkrescue-grub-install-common.o -MD -MP -MF util/$(DEPDIR)/grub_mkrescue-grub-install-common.Tpo -c -o util/grub_mkrescue-grub-install-common.o `test -f 'util/grub-install-common.c' || echo '$(srcdir)/'`util/grub-install-common.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mkrescue-grub-install-common.Tpo util/$(DEPDIR)/grub_mkrescue-grub-install-common.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-install-common.c' object='util/grub_mkrescue-grub-install-common.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -c -o util/grub_mkrescue-grub-install-common.o `test -f 'util/grub-install-common.c' || echo '$(srcdir)/'`util/grub-install-common.c util/grub_mkrescue-grub-install-common.obj: util/grub-install-common.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -MT util/grub_mkrescue-grub-install-common.obj -MD -MP -MF util/$(DEPDIR)/grub_mkrescue-grub-install-common.Tpo -c -o util/grub_mkrescue-grub-install-common.obj `if test -f 'util/grub-install-common.c'; then $(CYGPATH_W) 'util/grub-install-common.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-install-common.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mkrescue-grub-install-common.Tpo util/$(DEPDIR)/grub_mkrescue-grub-install-common.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-install-common.c' object='util/grub_mkrescue-grub-install-common.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -c -o util/grub_mkrescue-grub-install-common.obj `if test -f 'util/grub-install-common.c'; then $(CYGPATH_W) 'util/grub-install-common.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-install-common.c'; fi` util/grub_mkrescue-grub-mkimage32.o: util/grub-mkimage32.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -MT util/grub_mkrescue-grub-mkimage32.o -MD -MP -MF util/$(DEPDIR)/grub_mkrescue-grub-mkimage32.Tpo -c -o util/grub_mkrescue-grub-mkimage32.o `test -f 'util/grub-mkimage32.c' || echo '$(srcdir)/'`util/grub-mkimage32.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mkrescue-grub-mkimage32.Tpo util/$(DEPDIR)/grub_mkrescue-grub-mkimage32.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-mkimage32.c' object='util/grub_mkrescue-grub-mkimage32.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -c -o util/grub_mkrescue-grub-mkimage32.o `test -f 'util/grub-mkimage32.c' || echo '$(srcdir)/'`util/grub-mkimage32.c util/grub_mkrescue-grub-mkimage32.obj: util/grub-mkimage32.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -MT util/grub_mkrescue-grub-mkimage32.obj -MD -MP -MF util/$(DEPDIR)/grub_mkrescue-grub-mkimage32.Tpo -c -o util/grub_mkrescue-grub-mkimage32.obj `if test -f 'util/grub-mkimage32.c'; then $(CYGPATH_W) 'util/grub-mkimage32.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-mkimage32.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mkrescue-grub-mkimage32.Tpo util/$(DEPDIR)/grub_mkrescue-grub-mkimage32.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-mkimage32.c' object='util/grub_mkrescue-grub-mkimage32.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -c -o util/grub_mkrescue-grub-mkimage32.obj `if test -f 'util/grub-mkimage32.c'; then $(CYGPATH_W) 'util/grub-mkimage32.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-mkimage32.c'; fi` util/grub_mkrescue-grub-mkimage64.o: util/grub-mkimage64.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -MT util/grub_mkrescue-grub-mkimage64.o -MD -MP -MF util/$(DEPDIR)/grub_mkrescue-grub-mkimage64.Tpo -c -o util/grub_mkrescue-grub-mkimage64.o `test -f 'util/grub-mkimage64.c' || echo '$(srcdir)/'`util/grub-mkimage64.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mkrescue-grub-mkimage64.Tpo util/$(DEPDIR)/grub_mkrescue-grub-mkimage64.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-mkimage64.c' object='util/grub_mkrescue-grub-mkimage64.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -c -o util/grub_mkrescue-grub-mkimage64.o `test -f 'util/grub-mkimage64.c' || echo '$(srcdir)/'`util/grub-mkimage64.c util/grub_mkrescue-grub-mkimage64.obj: util/grub-mkimage64.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -MT util/grub_mkrescue-grub-mkimage64.obj -MD -MP -MF util/$(DEPDIR)/grub_mkrescue-grub-mkimage64.Tpo -c -o util/grub_mkrescue-grub-mkimage64.obj `if test -f 'util/grub-mkimage64.c'; then $(CYGPATH_W) 'util/grub-mkimage64.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-mkimage64.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mkrescue-grub-mkimage64.Tpo util/$(DEPDIR)/grub_mkrescue-grub-mkimage64.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-mkimage64.c' object='util/grub_mkrescue-grub-mkimage64.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -c -o util/grub_mkrescue-grub-mkimage64.obj `if test -f 'util/grub-mkimage64.c'; then $(CYGPATH_W) 'util/grub-mkimage64.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-mkimage64.c'; fi` util/grub_mkrescue-grub-mkrescue.o: util/grub-mkrescue.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -MT util/grub_mkrescue-grub-mkrescue.o -MD -MP -MF util/$(DEPDIR)/grub_mkrescue-grub-mkrescue.Tpo -c -o util/grub_mkrescue-grub-mkrescue.o `test -f 'util/grub-mkrescue.c' || echo '$(srcdir)/'`util/grub-mkrescue.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mkrescue-grub-mkrescue.Tpo util/$(DEPDIR)/grub_mkrescue-grub-mkrescue.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-mkrescue.c' object='util/grub_mkrescue-grub-mkrescue.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -c -o util/grub_mkrescue-grub-mkrescue.o `test -f 'util/grub-mkrescue.c' || echo '$(srcdir)/'`util/grub-mkrescue.c util/grub_mkrescue-grub-mkrescue.obj: util/grub-mkrescue.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -MT util/grub_mkrescue-grub-mkrescue.obj -MD -MP -MF util/$(DEPDIR)/grub_mkrescue-grub-mkrescue.Tpo -c -o util/grub_mkrescue-grub-mkrescue.obj `if test -f 'util/grub-mkrescue.c'; then $(CYGPATH_W) 'util/grub-mkrescue.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-mkrescue.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mkrescue-grub-mkrescue.Tpo util/$(DEPDIR)/grub_mkrescue-grub-mkrescue.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-mkrescue.c' object='util/grub_mkrescue-grub-mkrescue.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -c -o util/grub_mkrescue-grub-mkrescue.obj `if test -f 'util/grub-mkrescue.c'; then $(CYGPATH_W) 'util/grub-mkrescue.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-mkrescue.c'; fi` util/grub_mkrescue-mkimage.o: util/mkimage.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -MT util/grub_mkrescue-mkimage.o -MD -MP -MF util/$(DEPDIR)/grub_mkrescue-mkimage.Tpo -c -o util/grub_mkrescue-mkimage.o `test -f 'util/mkimage.c' || echo '$(srcdir)/'`util/mkimage.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mkrescue-mkimage.Tpo util/$(DEPDIR)/grub_mkrescue-mkimage.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/mkimage.c' object='util/grub_mkrescue-mkimage.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -c -o util/grub_mkrescue-mkimage.o `test -f 'util/mkimage.c' || echo '$(srcdir)/'`util/mkimage.c util/grub_mkrescue-mkimage.obj: util/mkimage.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -MT util/grub_mkrescue-mkimage.obj -MD -MP -MF util/$(DEPDIR)/grub_mkrescue-mkimage.Tpo -c -o util/grub_mkrescue-mkimage.obj `if test -f 'util/mkimage.c'; then $(CYGPATH_W) 'util/mkimage.c'; else $(CYGPATH_W) '$(srcdir)/util/mkimage.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mkrescue-mkimage.Tpo util/$(DEPDIR)/grub_mkrescue-mkimage.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/mkimage.c' object='util/grub_mkrescue-mkimage.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -c -o util/grub_mkrescue-mkimage.obj `if test -f 'util/mkimage.c'; then $(CYGPATH_W) 'util/mkimage.c'; else $(CYGPATH_W) '$(srcdir)/util/mkimage.c'; fi` util/grub_mkrescue-render-label.o: util/render-label.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -MT util/grub_mkrescue-render-label.o -MD -MP -MF util/$(DEPDIR)/grub_mkrescue-render-label.Tpo -c -o util/grub_mkrescue-render-label.o `test -f 'util/render-label.c' || echo '$(srcdir)/'`util/render-label.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mkrescue-render-label.Tpo util/$(DEPDIR)/grub_mkrescue-render-label.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/render-label.c' object='util/grub_mkrescue-render-label.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -c -o util/grub_mkrescue-render-label.o `test -f 'util/render-label.c' || echo '$(srcdir)/'`util/render-label.c util/grub_mkrescue-render-label.obj: util/render-label.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -MT util/grub_mkrescue-render-label.obj -MD -MP -MF util/$(DEPDIR)/grub_mkrescue-render-label.Tpo -c -o util/grub_mkrescue-render-label.obj `if test -f 'util/render-label.c'; then $(CYGPATH_W) 'util/render-label.c'; else $(CYGPATH_W) '$(srcdir)/util/render-label.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mkrescue-render-label.Tpo util/$(DEPDIR)/grub_mkrescue-render-label.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/render-label.c' object='util/grub_mkrescue-render-label.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -c -o util/grub_mkrescue-render-label.obj `if test -f 'util/render-label.c'; then $(CYGPATH_W) 'util/render-label.c'; else $(CYGPATH_W) '$(srcdir)/util/render-label.c'; fi` util/grub_mkrescue-resolve.o: util/resolve.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -MT util/grub_mkrescue-resolve.o -MD -MP -MF util/$(DEPDIR)/grub_mkrescue-resolve.Tpo -c -o util/grub_mkrescue-resolve.o `test -f 'util/resolve.c' || echo '$(srcdir)/'`util/resolve.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mkrescue-resolve.Tpo util/$(DEPDIR)/grub_mkrescue-resolve.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/resolve.c' object='util/grub_mkrescue-resolve.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -c -o util/grub_mkrescue-resolve.o `test -f 'util/resolve.c' || echo '$(srcdir)/'`util/resolve.c util/grub_mkrescue-resolve.obj: util/resolve.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -MT util/grub_mkrescue-resolve.obj -MD -MP -MF util/$(DEPDIR)/grub_mkrescue-resolve.Tpo -c -o util/grub_mkrescue-resolve.obj `if test -f 'util/resolve.c'; then $(CYGPATH_W) 'util/resolve.c'; else $(CYGPATH_W) '$(srcdir)/util/resolve.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mkrescue-resolve.Tpo util/$(DEPDIR)/grub_mkrescue-resolve.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/resolve.c' object='util/grub_mkrescue-resolve.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -c -o util/grub_mkrescue-resolve.obj `if test -f 'util/resolve.c'; then $(CYGPATH_W) 'util/resolve.c'; else $(CYGPATH_W) '$(srcdir)/util/resolve.c'; fi` util/grub_mkrescue-setup_bios.o: util/setup_bios.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -MT util/grub_mkrescue-setup_bios.o -MD -MP -MF util/$(DEPDIR)/grub_mkrescue-setup_bios.Tpo -c -o util/grub_mkrescue-setup_bios.o `test -f 'util/setup_bios.c' || echo '$(srcdir)/'`util/setup_bios.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mkrescue-setup_bios.Tpo util/$(DEPDIR)/grub_mkrescue-setup_bios.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/setup_bios.c' object='util/grub_mkrescue-setup_bios.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -c -o util/grub_mkrescue-setup_bios.o `test -f 'util/setup_bios.c' || echo '$(srcdir)/'`util/setup_bios.c util/grub_mkrescue-setup_bios.obj: util/setup_bios.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -MT util/grub_mkrescue-setup_bios.obj -MD -MP -MF util/$(DEPDIR)/grub_mkrescue-setup_bios.Tpo -c -o util/grub_mkrescue-setup_bios.obj `if test -f 'util/setup_bios.c'; then $(CYGPATH_W) 'util/setup_bios.c'; else $(CYGPATH_W) '$(srcdir)/util/setup_bios.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mkrescue-setup_bios.Tpo util/$(DEPDIR)/grub_mkrescue-setup_bios.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/setup_bios.c' object='util/grub_mkrescue-setup_bios.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -c -o util/grub_mkrescue-setup_bios.obj `if test -f 'util/setup_bios.c'; then $(CYGPATH_W) 'util/setup_bios.c'; else $(CYGPATH_W) '$(srcdir)/util/setup_bios.c'; fi` util/grub_mkrescue-setup_sparc.o: util/setup_sparc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -MT util/grub_mkrescue-setup_sparc.o -MD -MP -MF util/$(DEPDIR)/grub_mkrescue-setup_sparc.Tpo -c -o util/grub_mkrescue-setup_sparc.o `test -f 'util/setup_sparc.c' || echo '$(srcdir)/'`util/setup_sparc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mkrescue-setup_sparc.Tpo util/$(DEPDIR)/grub_mkrescue-setup_sparc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/setup_sparc.c' object='util/grub_mkrescue-setup_sparc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -c -o util/grub_mkrescue-setup_sparc.o `test -f 'util/setup_sparc.c' || echo '$(srcdir)/'`util/setup_sparc.c util/grub_mkrescue-setup_sparc.obj: util/setup_sparc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -MT util/grub_mkrescue-setup_sparc.obj -MD -MP -MF util/$(DEPDIR)/grub_mkrescue-setup_sparc.Tpo -c -o util/grub_mkrescue-setup_sparc.obj `if test -f 'util/setup_sparc.c'; then $(CYGPATH_W) 'util/setup_sparc.c'; else $(CYGPATH_W) '$(srcdir)/util/setup_sparc.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mkrescue-setup_sparc.Tpo util/$(DEPDIR)/grub_mkrescue-setup_sparc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/setup_sparc.c' object='util/grub_mkrescue-setup_sparc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkrescue_CPPFLAGS) $(CPPFLAGS) $(grub_mkrescue_CFLAGS) $(CFLAGS) -c -o util/grub_mkrescue-setup_sparc.obj `if test -f 'util/setup_sparc.c'; then $(CYGPATH_W) 'util/setup_sparc.c'; else $(CYGPATH_W) '$(srcdir)/util/setup_sparc.c'; fi` grub-core/disk/grub_mkstandalone-host.o: grub-core/disk/host.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -MT grub-core/disk/grub_mkstandalone-host.o -MD -MP -MF grub-core/disk/$(DEPDIR)/grub_mkstandalone-host.Tpo -c -o grub-core/disk/grub_mkstandalone-host.o `test -f 'grub-core/disk/host.c' || echo '$(srcdir)/'`grub-core/disk/host.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/disk/$(DEPDIR)/grub_mkstandalone-host.Tpo grub-core/disk/$(DEPDIR)/grub_mkstandalone-host.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/disk/host.c' object='grub-core/disk/grub_mkstandalone-host.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -c -o grub-core/disk/grub_mkstandalone-host.o `test -f 'grub-core/disk/host.c' || echo '$(srcdir)/'`grub-core/disk/host.c grub-core/disk/grub_mkstandalone-host.obj: grub-core/disk/host.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -MT grub-core/disk/grub_mkstandalone-host.obj -MD -MP -MF grub-core/disk/$(DEPDIR)/grub_mkstandalone-host.Tpo -c -o grub-core/disk/grub_mkstandalone-host.obj `if test -f 'grub-core/disk/host.c'; then $(CYGPATH_W) 'grub-core/disk/host.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/disk/host.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/disk/$(DEPDIR)/grub_mkstandalone-host.Tpo grub-core/disk/$(DEPDIR)/grub_mkstandalone-host.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/disk/host.c' object='grub-core/disk/grub_mkstandalone-host.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -c -o grub-core/disk/grub_mkstandalone-host.obj `if test -f 'grub-core/disk/host.c'; then $(CYGPATH_W) 'grub-core/disk/host.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/disk/host.c'; fi` grub-core/kern/emu/grub_mkstandalone-argp_common.o: grub-core/kern/emu/argp_common.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -MT grub-core/kern/emu/grub_mkstandalone-argp_common.o -MD -MP -MF grub-core/kern/emu/$(DEPDIR)/grub_mkstandalone-argp_common.Tpo -c -o grub-core/kern/emu/grub_mkstandalone-argp_common.o `test -f 'grub-core/kern/emu/argp_common.c' || echo '$(srcdir)/'`grub-core/kern/emu/argp_common.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/emu/$(DEPDIR)/grub_mkstandalone-argp_common.Tpo grub-core/kern/emu/$(DEPDIR)/grub_mkstandalone-argp_common.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/emu/argp_common.c' object='grub-core/kern/emu/grub_mkstandalone-argp_common.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -c -o grub-core/kern/emu/grub_mkstandalone-argp_common.o `test -f 'grub-core/kern/emu/argp_common.c' || echo '$(srcdir)/'`grub-core/kern/emu/argp_common.c grub-core/kern/emu/grub_mkstandalone-argp_common.obj: grub-core/kern/emu/argp_common.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -MT grub-core/kern/emu/grub_mkstandalone-argp_common.obj -MD -MP -MF grub-core/kern/emu/$(DEPDIR)/grub_mkstandalone-argp_common.Tpo -c -o grub-core/kern/emu/grub_mkstandalone-argp_common.obj `if test -f 'grub-core/kern/emu/argp_common.c'; then $(CYGPATH_W) 'grub-core/kern/emu/argp_common.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/emu/argp_common.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/emu/$(DEPDIR)/grub_mkstandalone-argp_common.Tpo grub-core/kern/emu/$(DEPDIR)/grub_mkstandalone-argp_common.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/emu/argp_common.c' object='grub-core/kern/emu/grub_mkstandalone-argp_common.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -c -o grub-core/kern/emu/grub_mkstandalone-argp_common.obj `if test -f 'grub-core/kern/emu/argp_common.c'; then $(CYGPATH_W) 'grub-core/kern/emu/argp_common.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/emu/argp_common.c'; fi` grub-core/kern/emu/grub_mkstandalone-hostfs.o: grub-core/kern/emu/hostfs.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -MT grub-core/kern/emu/grub_mkstandalone-hostfs.o -MD -MP -MF grub-core/kern/emu/$(DEPDIR)/grub_mkstandalone-hostfs.Tpo -c -o grub-core/kern/emu/grub_mkstandalone-hostfs.o `test -f 'grub-core/kern/emu/hostfs.c' || echo '$(srcdir)/'`grub-core/kern/emu/hostfs.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/emu/$(DEPDIR)/grub_mkstandalone-hostfs.Tpo grub-core/kern/emu/$(DEPDIR)/grub_mkstandalone-hostfs.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/emu/hostfs.c' object='grub-core/kern/emu/grub_mkstandalone-hostfs.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -c -o grub-core/kern/emu/grub_mkstandalone-hostfs.o `test -f 'grub-core/kern/emu/hostfs.c' || echo '$(srcdir)/'`grub-core/kern/emu/hostfs.c grub-core/kern/emu/grub_mkstandalone-hostfs.obj: grub-core/kern/emu/hostfs.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -MT grub-core/kern/emu/grub_mkstandalone-hostfs.obj -MD -MP -MF grub-core/kern/emu/$(DEPDIR)/grub_mkstandalone-hostfs.Tpo -c -o grub-core/kern/emu/grub_mkstandalone-hostfs.obj `if test -f 'grub-core/kern/emu/hostfs.c'; then $(CYGPATH_W) 'grub-core/kern/emu/hostfs.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/emu/hostfs.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/emu/$(DEPDIR)/grub_mkstandalone-hostfs.Tpo grub-core/kern/emu/$(DEPDIR)/grub_mkstandalone-hostfs.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/emu/hostfs.c' object='grub-core/kern/emu/grub_mkstandalone-hostfs.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -c -o grub-core/kern/emu/grub_mkstandalone-hostfs.obj `if test -f 'grub-core/kern/emu/hostfs.c'; then $(CYGPATH_W) 'grub-core/kern/emu/hostfs.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/emu/hostfs.c'; fi` grub-core/lib/grub_mkstandalone-reed_solomon.o: grub-core/lib/reed_solomon.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -MT grub-core/lib/grub_mkstandalone-reed_solomon.o -MD -MP -MF grub-core/lib/$(DEPDIR)/grub_mkstandalone-reed_solomon.Tpo -c -o grub-core/lib/grub_mkstandalone-reed_solomon.o `test -f 'grub-core/lib/reed_solomon.c' || echo '$(srcdir)/'`grub-core/lib/reed_solomon.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/$(DEPDIR)/grub_mkstandalone-reed_solomon.Tpo grub-core/lib/$(DEPDIR)/grub_mkstandalone-reed_solomon.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/reed_solomon.c' object='grub-core/lib/grub_mkstandalone-reed_solomon.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -c -o grub-core/lib/grub_mkstandalone-reed_solomon.o `test -f 'grub-core/lib/reed_solomon.c' || echo '$(srcdir)/'`grub-core/lib/reed_solomon.c grub-core/lib/grub_mkstandalone-reed_solomon.obj: grub-core/lib/reed_solomon.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -MT grub-core/lib/grub_mkstandalone-reed_solomon.obj -MD -MP -MF grub-core/lib/$(DEPDIR)/grub_mkstandalone-reed_solomon.Tpo -c -o grub-core/lib/grub_mkstandalone-reed_solomon.obj `if test -f 'grub-core/lib/reed_solomon.c'; then $(CYGPATH_W) 'grub-core/lib/reed_solomon.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/reed_solomon.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/$(DEPDIR)/grub_mkstandalone-reed_solomon.Tpo grub-core/lib/$(DEPDIR)/grub_mkstandalone-reed_solomon.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/reed_solomon.c' object='grub-core/lib/grub_mkstandalone-reed_solomon.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -c -o grub-core/lib/grub_mkstandalone-reed_solomon.obj `if test -f 'grub-core/lib/reed_solomon.c'; then $(CYGPATH_W) 'grub-core/lib/reed_solomon.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/reed_solomon.c'; fi` grub-core/osdep/grub_mkstandalone-blocklist.o: grub-core/osdep/blocklist.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_mkstandalone-blocklist.o -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_mkstandalone-blocklist.Tpo -c -o grub-core/osdep/grub_mkstandalone-blocklist.o `test -f 'grub-core/osdep/blocklist.c' || echo '$(srcdir)/'`grub-core/osdep/blocklist.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_mkstandalone-blocklist.Tpo grub-core/osdep/$(DEPDIR)/grub_mkstandalone-blocklist.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/blocklist.c' object='grub-core/osdep/grub_mkstandalone-blocklist.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_mkstandalone-blocklist.o `test -f 'grub-core/osdep/blocklist.c' || echo '$(srcdir)/'`grub-core/osdep/blocklist.c grub-core/osdep/grub_mkstandalone-blocklist.obj: grub-core/osdep/blocklist.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_mkstandalone-blocklist.obj -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_mkstandalone-blocklist.Tpo -c -o grub-core/osdep/grub_mkstandalone-blocklist.obj `if test -f 'grub-core/osdep/blocklist.c'; then $(CYGPATH_W) 'grub-core/osdep/blocklist.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/blocklist.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_mkstandalone-blocklist.Tpo grub-core/osdep/$(DEPDIR)/grub_mkstandalone-blocklist.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/blocklist.c' object='grub-core/osdep/grub_mkstandalone-blocklist.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_mkstandalone-blocklist.obj `if test -f 'grub-core/osdep/blocklist.c'; then $(CYGPATH_W) 'grub-core/osdep/blocklist.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/blocklist.c'; fi` grub-core/osdep/grub_mkstandalone-compress.o: grub-core/osdep/compress.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_mkstandalone-compress.o -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_mkstandalone-compress.Tpo -c -o grub-core/osdep/grub_mkstandalone-compress.o `test -f 'grub-core/osdep/compress.c' || echo '$(srcdir)/'`grub-core/osdep/compress.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_mkstandalone-compress.Tpo grub-core/osdep/$(DEPDIR)/grub_mkstandalone-compress.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/compress.c' object='grub-core/osdep/grub_mkstandalone-compress.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_mkstandalone-compress.o `test -f 'grub-core/osdep/compress.c' || echo '$(srcdir)/'`grub-core/osdep/compress.c grub-core/osdep/grub_mkstandalone-compress.obj: grub-core/osdep/compress.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_mkstandalone-compress.obj -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_mkstandalone-compress.Tpo -c -o grub-core/osdep/grub_mkstandalone-compress.obj `if test -f 'grub-core/osdep/compress.c'; then $(CYGPATH_W) 'grub-core/osdep/compress.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/compress.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_mkstandalone-compress.Tpo grub-core/osdep/$(DEPDIR)/grub_mkstandalone-compress.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/compress.c' object='grub-core/osdep/grub_mkstandalone-compress.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_mkstandalone-compress.obj `if test -f 'grub-core/osdep/compress.c'; then $(CYGPATH_W) 'grub-core/osdep/compress.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/compress.c'; fi` grub-core/osdep/grub_mkstandalone-config.o: grub-core/osdep/config.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_mkstandalone-config.o -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_mkstandalone-config.Tpo -c -o grub-core/osdep/grub_mkstandalone-config.o `test -f 'grub-core/osdep/config.c' || echo '$(srcdir)/'`grub-core/osdep/config.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_mkstandalone-config.Tpo grub-core/osdep/$(DEPDIR)/grub_mkstandalone-config.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/config.c' object='grub-core/osdep/grub_mkstandalone-config.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_mkstandalone-config.o `test -f 'grub-core/osdep/config.c' || echo '$(srcdir)/'`grub-core/osdep/config.c grub-core/osdep/grub_mkstandalone-config.obj: grub-core/osdep/config.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_mkstandalone-config.obj -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_mkstandalone-config.Tpo -c -o grub-core/osdep/grub_mkstandalone-config.obj `if test -f 'grub-core/osdep/config.c'; then $(CYGPATH_W) 'grub-core/osdep/config.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/config.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_mkstandalone-config.Tpo grub-core/osdep/$(DEPDIR)/grub_mkstandalone-config.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/config.c' object='grub-core/osdep/grub_mkstandalone-config.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_mkstandalone-config.obj `if test -f 'grub-core/osdep/config.c'; then $(CYGPATH_W) 'grub-core/osdep/config.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/config.c'; fi` grub-core/osdep/grub_mkstandalone-init.o: grub-core/osdep/init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_mkstandalone-init.o -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_mkstandalone-init.Tpo -c -o grub-core/osdep/grub_mkstandalone-init.o `test -f 'grub-core/osdep/init.c' || echo '$(srcdir)/'`grub-core/osdep/init.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_mkstandalone-init.Tpo grub-core/osdep/$(DEPDIR)/grub_mkstandalone-init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/init.c' object='grub-core/osdep/grub_mkstandalone-init.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_mkstandalone-init.o `test -f 'grub-core/osdep/init.c' || echo '$(srcdir)/'`grub-core/osdep/init.c grub-core/osdep/grub_mkstandalone-init.obj: grub-core/osdep/init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_mkstandalone-init.obj -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_mkstandalone-init.Tpo -c -o grub-core/osdep/grub_mkstandalone-init.obj `if test -f 'grub-core/osdep/init.c'; then $(CYGPATH_W) 'grub-core/osdep/init.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/init.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_mkstandalone-init.Tpo grub-core/osdep/$(DEPDIR)/grub_mkstandalone-init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/init.c' object='grub-core/osdep/grub_mkstandalone-init.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_mkstandalone-init.obj `if test -f 'grub-core/osdep/init.c'; then $(CYGPATH_W) 'grub-core/osdep/init.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/init.c'; fi` grub-core/osdep/grub_mkstandalone-ofpath.o: grub-core/osdep/ofpath.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_mkstandalone-ofpath.o -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_mkstandalone-ofpath.Tpo -c -o grub-core/osdep/grub_mkstandalone-ofpath.o `test -f 'grub-core/osdep/ofpath.c' || echo '$(srcdir)/'`grub-core/osdep/ofpath.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_mkstandalone-ofpath.Tpo grub-core/osdep/$(DEPDIR)/grub_mkstandalone-ofpath.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/ofpath.c' object='grub-core/osdep/grub_mkstandalone-ofpath.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_mkstandalone-ofpath.o `test -f 'grub-core/osdep/ofpath.c' || echo '$(srcdir)/'`grub-core/osdep/ofpath.c grub-core/osdep/grub_mkstandalone-ofpath.obj: grub-core/osdep/ofpath.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_mkstandalone-ofpath.obj -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_mkstandalone-ofpath.Tpo -c -o grub-core/osdep/grub_mkstandalone-ofpath.obj `if test -f 'grub-core/osdep/ofpath.c'; then $(CYGPATH_W) 'grub-core/osdep/ofpath.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/ofpath.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_mkstandalone-ofpath.Tpo grub-core/osdep/$(DEPDIR)/grub_mkstandalone-ofpath.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/ofpath.c' object='grub-core/osdep/grub_mkstandalone-ofpath.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_mkstandalone-ofpath.obj `if test -f 'grub-core/osdep/ofpath.c'; then $(CYGPATH_W) 'grub-core/osdep/ofpath.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/ofpath.c'; fi` grub-core/osdep/grub_mkstandalone-platform.o: grub-core/osdep/platform.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_mkstandalone-platform.o -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_mkstandalone-platform.Tpo -c -o grub-core/osdep/grub_mkstandalone-platform.o `test -f 'grub-core/osdep/platform.c' || echo '$(srcdir)/'`grub-core/osdep/platform.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_mkstandalone-platform.Tpo grub-core/osdep/$(DEPDIR)/grub_mkstandalone-platform.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/platform.c' object='grub-core/osdep/grub_mkstandalone-platform.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_mkstandalone-platform.o `test -f 'grub-core/osdep/platform.c' || echo '$(srcdir)/'`grub-core/osdep/platform.c grub-core/osdep/grub_mkstandalone-platform.obj: grub-core/osdep/platform.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_mkstandalone-platform.obj -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_mkstandalone-platform.Tpo -c -o grub-core/osdep/grub_mkstandalone-platform.obj `if test -f 'grub-core/osdep/platform.c'; then $(CYGPATH_W) 'grub-core/osdep/platform.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/platform.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_mkstandalone-platform.Tpo grub-core/osdep/$(DEPDIR)/grub_mkstandalone-platform.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/platform.c' object='grub-core/osdep/grub_mkstandalone-platform.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_mkstandalone-platform.obj `if test -f 'grub-core/osdep/platform.c'; then $(CYGPATH_W) 'grub-core/osdep/platform.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/platform.c'; fi` grub-core/osdep/grub_mkstandalone-platform_unix.o: grub-core/osdep/platform_unix.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_mkstandalone-platform_unix.o -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_mkstandalone-platform_unix.Tpo -c -o grub-core/osdep/grub_mkstandalone-platform_unix.o `test -f 'grub-core/osdep/platform_unix.c' || echo '$(srcdir)/'`grub-core/osdep/platform_unix.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_mkstandalone-platform_unix.Tpo grub-core/osdep/$(DEPDIR)/grub_mkstandalone-platform_unix.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/platform_unix.c' object='grub-core/osdep/grub_mkstandalone-platform_unix.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_mkstandalone-platform_unix.o `test -f 'grub-core/osdep/platform_unix.c' || echo '$(srcdir)/'`grub-core/osdep/platform_unix.c grub-core/osdep/grub_mkstandalone-platform_unix.obj: grub-core/osdep/platform_unix.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_mkstandalone-platform_unix.obj -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_mkstandalone-platform_unix.Tpo -c -o grub-core/osdep/grub_mkstandalone-platform_unix.obj `if test -f 'grub-core/osdep/platform_unix.c'; then $(CYGPATH_W) 'grub-core/osdep/platform_unix.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/platform_unix.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_mkstandalone-platform_unix.Tpo grub-core/osdep/$(DEPDIR)/grub_mkstandalone-platform_unix.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/platform_unix.c' object='grub-core/osdep/grub_mkstandalone-platform_unix.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_mkstandalone-platform_unix.obj `if test -f 'grub-core/osdep/platform_unix.c'; then $(CYGPATH_W) 'grub-core/osdep/platform_unix.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/platform_unix.c'; fi` grub-core/osdep/grub_mkstandalone-random.o: grub-core/osdep/random.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_mkstandalone-random.o -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_mkstandalone-random.Tpo -c -o grub-core/osdep/grub_mkstandalone-random.o `test -f 'grub-core/osdep/random.c' || echo '$(srcdir)/'`grub-core/osdep/random.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_mkstandalone-random.Tpo grub-core/osdep/$(DEPDIR)/grub_mkstandalone-random.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/random.c' object='grub-core/osdep/grub_mkstandalone-random.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_mkstandalone-random.o `test -f 'grub-core/osdep/random.c' || echo '$(srcdir)/'`grub-core/osdep/random.c grub-core/osdep/grub_mkstandalone-random.obj: grub-core/osdep/random.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_mkstandalone-random.obj -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_mkstandalone-random.Tpo -c -o grub-core/osdep/grub_mkstandalone-random.obj `if test -f 'grub-core/osdep/random.c'; then $(CYGPATH_W) 'grub-core/osdep/random.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/random.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_mkstandalone-random.Tpo grub-core/osdep/$(DEPDIR)/grub_mkstandalone-random.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/random.c' object='grub-core/osdep/grub_mkstandalone-random.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_mkstandalone-random.obj `if test -f 'grub-core/osdep/random.c'; then $(CYGPATH_W) 'grub-core/osdep/random.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/random.c'; fi` util/grub_mkstandalone-config.o: util/config.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -MT util/grub_mkstandalone-config.o -MD -MP -MF util/$(DEPDIR)/grub_mkstandalone-config.Tpo -c -o util/grub_mkstandalone-config.o `test -f 'util/config.c' || echo '$(srcdir)/'`util/config.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mkstandalone-config.Tpo util/$(DEPDIR)/grub_mkstandalone-config.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/config.c' object='util/grub_mkstandalone-config.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -c -o util/grub_mkstandalone-config.o `test -f 'util/config.c' || echo '$(srcdir)/'`util/config.c util/grub_mkstandalone-config.obj: util/config.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -MT util/grub_mkstandalone-config.obj -MD -MP -MF util/$(DEPDIR)/grub_mkstandalone-config.Tpo -c -o util/grub_mkstandalone-config.obj `if test -f 'util/config.c'; then $(CYGPATH_W) 'util/config.c'; else $(CYGPATH_W) '$(srcdir)/util/config.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mkstandalone-config.Tpo util/$(DEPDIR)/grub_mkstandalone-config.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/config.c' object='util/grub_mkstandalone-config.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -c -o util/grub_mkstandalone-config.obj `if test -f 'util/config.c'; then $(CYGPATH_W) 'util/config.c'; else $(CYGPATH_W) '$(srcdir)/util/config.c'; fi` util/grub_mkstandalone-editenv.o: util/editenv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -MT util/grub_mkstandalone-editenv.o -MD -MP -MF util/$(DEPDIR)/grub_mkstandalone-editenv.Tpo -c -o util/grub_mkstandalone-editenv.o `test -f 'util/editenv.c' || echo '$(srcdir)/'`util/editenv.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mkstandalone-editenv.Tpo util/$(DEPDIR)/grub_mkstandalone-editenv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/editenv.c' object='util/grub_mkstandalone-editenv.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -c -o util/grub_mkstandalone-editenv.o `test -f 'util/editenv.c' || echo '$(srcdir)/'`util/editenv.c util/grub_mkstandalone-editenv.obj: util/editenv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -MT util/grub_mkstandalone-editenv.obj -MD -MP -MF util/$(DEPDIR)/grub_mkstandalone-editenv.Tpo -c -o util/grub_mkstandalone-editenv.obj `if test -f 'util/editenv.c'; then $(CYGPATH_W) 'util/editenv.c'; else $(CYGPATH_W) '$(srcdir)/util/editenv.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mkstandalone-editenv.Tpo util/$(DEPDIR)/grub_mkstandalone-editenv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/editenv.c' object='util/grub_mkstandalone-editenv.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -c -o util/grub_mkstandalone-editenv.obj `if test -f 'util/editenv.c'; then $(CYGPATH_W) 'util/editenv.c'; else $(CYGPATH_W) '$(srcdir)/util/editenv.c'; fi` util/grub_mkstandalone-glue-efi.o: util/glue-efi.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -MT util/grub_mkstandalone-glue-efi.o -MD -MP -MF util/$(DEPDIR)/grub_mkstandalone-glue-efi.Tpo -c -o util/grub_mkstandalone-glue-efi.o `test -f 'util/glue-efi.c' || echo '$(srcdir)/'`util/glue-efi.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mkstandalone-glue-efi.Tpo util/$(DEPDIR)/grub_mkstandalone-glue-efi.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/glue-efi.c' object='util/grub_mkstandalone-glue-efi.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -c -o util/grub_mkstandalone-glue-efi.o `test -f 'util/glue-efi.c' || echo '$(srcdir)/'`util/glue-efi.c util/grub_mkstandalone-glue-efi.obj: util/glue-efi.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -MT util/grub_mkstandalone-glue-efi.obj -MD -MP -MF util/$(DEPDIR)/grub_mkstandalone-glue-efi.Tpo -c -o util/grub_mkstandalone-glue-efi.obj `if test -f 'util/glue-efi.c'; then $(CYGPATH_W) 'util/glue-efi.c'; else $(CYGPATH_W) '$(srcdir)/util/glue-efi.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mkstandalone-glue-efi.Tpo util/$(DEPDIR)/grub_mkstandalone-glue-efi.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/glue-efi.c' object='util/grub_mkstandalone-glue-efi.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -c -o util/grub_mkstandalone-glue-efi.obj `if test -f 'util/glue-efi.c'; then $(CYGPATH_W) 'util/glue-efi.c'; else $(CYGPATH_W) '$(srcdir)/util/glue-efi.c'; fi` util/grub_mkstandalone-grub-install-common.o: util/grub-install-common.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -MT util/grub_mkstandalone-grub-install-common.o -MD -MP -MF util/$(DEPDIR)/grub_mkstandalone-grub-install-common.Tpo -c -o util/grub_mkstandalone-grub-install-common.o `test -f 'util/grub-install-common.c' || echo '$(srcdir)/'`util/grub-install-common.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mkstandalone-grub-install-common.Tpo util/$(DEPDIR)/grub_mkstandalone-grub-install-common.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-install-common.c' object='util/grub_mkstandalone-grub-install-common.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -c -o util/grub_mkstandalone-grub-install-common.o `test -f 'util/grub-install-common.c' || echo '$(srcdir)/'`util/grub-install-common.c util/grub_mkstandalone-grub-install-common.obj: util/grub-install-common.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -MT util/grub_mkstandalone-grub-install-common.obj -MD -MP -MF util/$(DEPDIR)/grub_mkstandalone-grub-install-common.Tpo -c -o util/grub_mkstandalone-grub-install-common.obj `if test -f 'util/grub-install-common.c'; then $(CYGPATH_W) 'util/grub-install-common.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-install-common.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mkstandalone-grub-install-common.Tpo util/$(DEPDIR)/grub_mkstandalone-grub-install-common.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-install-common.c' object='util/grub_mkstandalone-grub-install-common.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -c -o util/grub_mkstandalone-grub-install-common.obj `if test -f 'util/grub-install-common.c'; then $(CYGPATH_W) 'util/grub-install-common.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-install-common.c'; fi` util/grub_mkstandalone-grub-mkimage32.o: util/grub-mkimage32.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -MT util/grub_mkstandalone-grub-mkimage32.o -MD -MP -MF util/$(DEPDIR)/grub_mkstandalone-grub-mkimage32.Tpo -c -o util/grub_mkstandalone-grub-mkimage32.o `test -f 'util/grub-mkimage32.c' || echo '$(srcdir)/'`util/grub-mkimage32.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mkstandalone-grub-mkimage32.Tpo util/$(DEPDIR)/grub_mkstandalone-grub-mkimage32.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-mkimage32.c' object='util/grub_mkstandalone-grub-mkimage32.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -c -o util/grub_mkstandalone-grub-mkimage32.o `test -f 'util/grub-mkimage32.c' || echo '$(srcdir)/'`util/grub-mkimage32.c util/grub_mkstandalone-grub-mkimage32.obj: util/grub-mkimage32.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -MT util/grub_mkstandalone-grub-mkimage32.obj -MD -MP -MF util/$(DEPDIR)/grub_mkstandalone-grub-mkimage32.Tpo -c -o util/grub_mkstandalone-grub-mkimage32.obj `if test -f 'util/grub-mkimage32.c'; then $(CYGPATH_W) 'util/grub-mkimage32.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-mkimage32.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mkstandalone-grub-mkimage32.Tpo util/$(DEPDIR)/grub_mkstandalone-grub-mkimage32.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-mkimage32.c' object='util/grub_mkstandalone-grub-mkimage32.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -c -o util/grub_mkstandalone-grub-mkimage32.obj `if test -f 'util/grub-mkimage32.c'; then $(CYGPATH_W) 'util/grub-mkimage32.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-mkimage32.c'; fi` util/grub_mkstandalone-grub-mkimage64.o: util/grub-mkimage64.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -MT util/grub_mkstandalone-grub-mkimage64.o -MD -MP -MF util/$(DEPDIR)/grub_mkstandalone-grub-mkimage64.Tpo -c -o util/grub_mkstandalone-grub-mkimage64.o `test -f 'util/grub-mkimage64.c' || echo '$(srcdir)/'`util/grub-mkimage64.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mkstandalone-grub-mkimage64.Tpo util/$(DEPDIR)/grub_mkstandalone-grub-mkimage64.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-mkimage64.c' object='util/grub_mkstandalone-grub-mkimage64.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -c -o util/grub_mkstandalone-grub-mkimage64.o `test -f 'util/grub-mkimage64.c' || echo '$(srcdir)/'`util/grub-mkimage64.c util/grub_mkstandalone-grub-mkimage64.obj: util/grub-mkimage64.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -MT util/grub_mkstandalone-grub-mkimage64.obj -MD -MP -MF util/$(DEPDIR)/grub_mkstandalone-grub-mkimage64.Tpo -c -o util/grub_mkstandalone-grub-mkimage64.obj `if test -f 'util/grub-mkimage64.c'; then $(CYGPATH_W) 'util/grub-mkimage64.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-mkimage64.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mkstandalone-grub-mkimage64.Tpo util/$(DEPDIR)/grub_mkstandalone-grub-mkimage64.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-mkimage64.c' object='util/grub_mkstandalone-grub-mkimage64.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -c -o util/grub_mkstandalone-grub-mkimage64.obj `if test -f 'util/grub-mkimage64.c'; then $(CYGPATH_W) 'util/grub-mkimage64.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-mkimage64.c'; fi` util/grub_mkstandalone-grub-mkstandalone.o: util/grub-mkstandalone.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -MT util/grub_mkstandalone-grub-mkstandalone.o -MD -MP -MF util/$(DEPDIR)/grub_mkstandalone-grub-mkstandalone.Tpo -c -o util/grub_mkstandalone-grub-mkstandalone.o `test -f 'util/grub-mkstandalone.c' || echo '$(srcdir)/'`util/grub-mkstandalone.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mkstandalone-grub-mkstandalone.Tpo util/$(DEPDIR)/grub_mkstandalone-grub-mkstandalone.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-mkstandalone.c' object='util/grub_mkstandalone-grub-mkstandalone.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -c -o util/grub_mkstandalone-grub-mkstandalone.o `test -f 'util/grub-mkstandalone.c' || echo '$(srcdir)/'`util/grub-mkstandalone.c util/grub_mkstandalone-grub-mkstandalone.obj: util/grub-mkstandalone.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -MT util/grub_mkstandalone-grub-mkstandalone.obj -MD -MP -MF util/$(DEPDIR)/grub_mkstandalone-grub-mkstandalone.Tpo -c -o util/grub_mkstandalone-grub-mkstandalone.obj `if test -f 'util/grub-mkstandalone.c'; then $(CYGPATH_W) 'util/grub-mkstandalone.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-mkstandalone.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mkstandalone-grub-mkstandalone.Tpo util/$(DEPDIR)/grub_mkstandalone-grub-mkstandalone.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-mkstandalone.c' object='util/grub_mkstandalone-grub-mkstandalone.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -c -o util/grub_mkstandalone-grub-mkstandalone.obj `if test -f 'util/grub-mkstandalone.c'; then $(CYGPATH_W) 'util/grub-mkstandalone.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-mkstandalone.c'; fi` util/grub_mkstandalone-mkimage.o: util/mkimage.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -MT util/grub_mkstandalone-mkimage.o -MD -MP -MF util/$(DEPDIR)/grub_mkstandalone-mkimage.Tpo -c -o util/grub_mkstandalone-mkimage.o `test -f 'util/mkimage.c' || echo '$(srcdir)/'`util/mkimage.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mkstandalone-mkimage.Tpo util/$(DEPDIR)/grub_mkstandalone-mkimage.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/mkimage.c' object='util/grub_mkstandalone-mkimage.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -c -o util/grub_mkstandalone-mkimage.o `test -f 'util/mkimage.c' || echo '$(srcdir)/'`util/mkimage.c util/grub_mkstandalone-mkimage.obj: util/mkimage.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -MT util/grub_mkstandalone-mkimage.obj -MD -MP -MF util/$(DEPDIR)/grub_mkstandalone-mkimage.Tpo -c -o util/grub_mkstandalone-mkimage.obj `if test -f 'util/mkimage.c'; then $(CYGPATH_W) 'util/mkimage.c'; else $(CYGPATH_W) '$(srcdir)/util/mkimage.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mkstandalone-mkimage.Tpo util/$(DEPDIR)/grub_mkstandalone-mkimage.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/mkimage.c' object='util/grub_mkstandalone-mkimage.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -c -o util/grub_mkstandalone-mkimage.obj `if test -f 'util/mkimage.c'; then $(CYGPATH_W) 'util/mkimage.c'; else $(CYGPATH_W) '$(srcdir)/util/mkimage.c'; fi` util/grub_mkstandalone-render-label.o: util/render-label.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -MT util/grub_mkstandalone-render-label.o -MD -MP -MF util/$(DEPDIR)/grub_mkstandalone-render-label.Tpo -c -o util/grub_mkstandalone-render-label.o `test -f 'util/render-label.c' || echo '$(srcdir)/'`util/render-label.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mkstandalone-render-label.Tpo util/$(DEPDIR)/grub_mkstandalone-render-label.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/render-label.c' object='util/grub_mkstandalone-render-label.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -c -o util/grub_mkstandalone-render-label.o `test -f 'util/render-label.c' || echo '$(srcdir)/'`util/render-label.c util/grub_mkstandalone-render-label.obj: util/render-label.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -MT util/grub_mkstandalone-render-label.obj -MD -MP -MF util/$(DEPDIR)/grub_mkstandalone-render-label.Tpo -c -o util/grub_mkstandalone-render-label.obj `if test -f 'util/render-label.c'; then $(CYGPATH_W) 'util/render-label.c'; else $(CYGPATH_W) '$(srcdir)/util/render-label.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mkstandalone-render-label.Tpo util/$(DEPDIR)/grub_mkstandalone-render-label.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/render-label.c' object='util/grub_mkstandalone-render-label.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -c -o util/grub_mkstandalone-render-label.obj `if test -f 'util/render-label.c'; then $(CYGPATH_W) 'util/render-label.c'; else $(CYGPATH_W) '$(srcdir)/util/render-label.c'; fi` util/grub_mkstandalone-resolve.o: util/resolve.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -MT util/grub_mkstandalone-resolve.o -MD -MP -MF util/$(DEPDIR)/grub_mkstandalone-resolve.Tpo -c -o util/grub_mkstandalone-resolve.o `test -f 'util/resolve.c' || echo '$(srcdir)/'`util/resolve.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mkstandalone-resolve.Tpo util/$(DEPDIR)/grub_mkstandalone-resolve.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/resolve.c' object='util/grub_mkstandalone-resolve.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -c -o util/grub_mkstandalone-resolve.o `test -f 'util/resolve.c' || echo '$(srcdir)/'`util/resolve.c util/grub_mkstandalone-resolve.obj: util/resolve.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -MT util/grub_mkstandalone-resolve.obj -MD -MP -MF util/$(DEPDIR)/grub_mkstandalone-resolve.Tpo -c -o util/grub_mkstandalone-resolve.obj `if test -f 'util/resolve.c'; then $(CYGPATH_W) 'util/resolve.c'; else $(CYGPATH_W) '$(srcdir)/util/resolve.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mkstandalone-resolve.Tpo util/$(DEPDIR)/grub_mkstandalone-resolve.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/resolve.c' object='util/grub_mkstandalone-resolve.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -c -o util/grub_mkstandalone-resolve.obj `if test -f 'util/resolve.c'; then $(CYGPATH_W) 'util/resolve.c'; else $(CYGPATH_W) '$(srcdir)/util/resolve.c'; fi` util/grub_mkstandalone-setup_bios.o: util/setup_bios.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -MT util/grub_mkstandalone-setup_bios.o -MD -MP -MF util/$(DEPDIR)/grub_mkstandalone-setup_bios.Tpo -c -o util/grub_mkstandalone-setup_bios.o `test -f 'util/setup_bios.c' || echo '$(srcdir)/'`util/setup_bios.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mkstandalone-setup_bios.Tpo util/$(DEPDIR)/grub_mkstandalone-setup_bios.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/setup_bios.c' object='util/grub_mkstandalone-setup_bios.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -c -o util/grub_mkstandalone-setup_bios.o `test -f 'util/setup_bios.c' || echo '$(srcdir)/'`util/setup_bios.c util/grub_mkstandalone-setup_bios.obj: util/setup_bios.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -MT util/grub_mkstandalone-setup_bios.obj -MD -MP -MF util/$(DEPDIR)/grub_mkstandalone-setup_bios.Tpo -c -o util/grub_mkstandalone-setup_bios.obj `if test -f 'util/setup_bios.c'; then $(CYGPATH_W) 'util/setup_bios.c'; else $(CYGPATH_W) '$(srcdir)/util/setup_bios.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mkstandalone-setup_bios.Tpo util/$(DEPDIR)/grub_mkstandalone-setup_bios.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/setup_bios.c' object='util/grub_mkstandalone-setup_bios.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -c -o util/grub_mkstandalone-setup_bios.obj `if test -f 'util/setup_bios.c'; then $(CYGPATH_W) 'util/setup_bios.c'; else $(CYGPATH_W) '$(srcdir)/util/setup_bios.c'; fi` util/grub_mkstandalone-setup_sparc.o: util/setup_sparc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -MT util/grub_mkstandalone-setup_sparc.o -MD -MP -MF util/$(DEPDIR)/grub_mkstandalone-setup_sparc.Tpo -c -o util/grub_mkstandalone-setup_sparc.o `test -f 'util/setup_sparc.c' || echo '$(srcdir)/'`util/setup_sparc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mkstandalone-setup_sparc.Tpo util/$(DEPDIR)/grub_mkstandalone-setup_sparc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/setup_sparc.c' object='util/grub_mkstandalone-setup_sparc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -c -o util/grub_mkstandalone-setup_sparc.o `test -f 'util/setup_sparc.c' || echo '$(srcdir)/'`util/setup_sparc.c util/grub_mkstandalone-setup_sparc.obj: util/setup_sparc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -MT util/grub_mkstandalone-setup_sparc.obj -MD -MP -MF util/$(DEPDIR)/grub_mkstandalone-setup_sparc.Tpo -c -o util/grub_mkstandalone-setup_sparc.obj `if test -f 'util/setup_sparc.c'; then $(CYGPATH_W) 'util/setup_sparc.c'; else $(CYGPATH_W) '$(srcdir)/util/setup_sparc.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mkstandalone-setup_sparc.Tpo util/$(DEPDIR)/grub_mkstandalone-setup_sparc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/setup_sparc.c' object='util/grub_mkstandalone-setup_sparc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mkstandalone_CPPFLAGS) $(CPPFLAGS) $(grub_mkstandalone_CFLAGS) $(CFLAGS) -c -o util/grub_mkstandalone-setup_sparc.obj `if test -f 'util/setup_sparc.c'; then $(CYGPATH_W) 'util/setup_sparc.c'; else $(CYGPATH_W) '$(srcdir)/util/setup_sparc.c'; fi` grub-core/disk/grub_mount-host.o: grub-core/disk/host.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mount_CPPFLAGS) $(CPPFLAGS) $(grub_mount_CFLAGS) $(CFLAGS) -MT grub-core/disk/grub_mount-host.o -MD -MP -MF grub-core/disk/$(DEPDIR)/grub_mount-host.Tpo -c -o grub-core/disk/grub_mount-host.o `test -f 'grub-core/disk/host.c' || echo '$(srcdir)/'`grub-core/disk/host.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/disk/$(DEPDIR)/grub_mount-host.Tpo grub-core/disk/$(DEPDIR)/grub_mount-host.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/disk/host.c' object='grub-core/disk/grub_mount-host.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mount_CPPFLAGS) $(CPPFLAGS) $(grub_mount_CFLAGS) $(CFLAGS) -c -o grub-core/disk/grub_mount-host.o `test -f 'grub-core/disk/host.c' || echo '$(srcdir)/'`grub-core/disk/host.c grub-core/disk/grub_mount-host.obj: grub-core/disk/host.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mount_CPPFLAGS) $(CPPFLAGS) $(grub_mount_CFLAGS) $(CFLAGS) -MT grub-core/disk/grub_mount-host.obj -MD -MP -MF grub-core/disk/$(DEPDIR)/grub_mount-host.Tpo -c -o grub-core/disk/grub_mount-host.obj `if test -f 'grub-core/disk/host.c'; then $(CYGPATH_W) 'grub-core/disk/host.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/disk/host.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/disk/$(DEPDIR)/grub_mount-host.Tpo grub-core/disk/$(DEPDIR)/grub_mount-host.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/disk/host.c' object='grub-core/disk/grub_mount-host.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mount_CPPFLAGS) $(CPPFLAGS) $(grub_mount_CFLAGS) $(CFLAGS) -c -o grub-core/disk/grub_mount-host.obj `if test -f 'grub-core/disk/host.c'; then $(CYGPATH_W) 'grub-core/disk/host.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/disk/host.c'; fi` grub-core/kern/emu/grub_mount-hostfs.o: grub-core/kern/emu/hostfs.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mount_CPPFLAGS) $(CPPFLAGS) $(grub_mount_CFLAGS) $(CFLAGS) -MT grub-core/kern/emu/grub_mount-hostfs.o -MD -MP -MF grub-core/kern/emu/$(DEPDIR)/grub_mount-hostfs.Tpo -c -o grub-core/kern/emu/grub_mount-hostfs.o `test -f 'grub-core/kern/emu/hostfs.c' || echo '$(srcdir)/'`grub-core/kern/emu/hostfs.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/emu/$(DEPDIR)/grub_mount-hostfs.Tpo grub-core/kern/emu/$(DEPDIR)/grub_mount-hostfs.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/emu/hostfs.c' object='grub-core/kern/emu/grub_mount-hostfs.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mount_CPPFLAGS) $(CPPFLAGS) $(grub_mount_CFLAGS) $(CFLAGS) -c -o grub-core/kern/emu/grub_mount-hostfs.o `test -f 'grub-core/kern/emu/hostfs.c' || echo '$(srcdir)/'`grub-core/kern/emu/hostfs.c grub-core/kern/emu/grub_mount-hostfs.obj: grub-core/kern/emu/hostfs.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mount_CPPFLAGS) $(CPPFLAGS) $(grub_mount_CFLAGS) $(CFLAGS) -MT grub-core/kern/emu/grub_mount-hostfs.obj -MD -MP -MF grub-core/kern/emu/$(DEPDIR)/grub_mount-hostfs.Tpo -c -o grub-core/kern/emu/grub_mount-hostfs.obj `if test -f 'grub-core/kern/emu/hostfs.c'; then $(CYGPATH_W) 'grub-core/kern/emu/hostfs.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/emu/hostfs.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/emu/$(DEPDIR)/grub_mount-hostfs.Tpo grub-core/kern/emu/$(DEPDIR)/grub_mount-hostfs.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/emu/hostfs.c' object='grub-core/kern/emu/grub_mount-hostfs.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mount_CPPFLAGS) $(CPPFLAGS) $(grub_mount_CFLAGS) $(CFLAGS) -c -o grub-core/kern/emu/grub_mount-hostfs.obj `if test -f 'grub-core/kern/emu/hostfs.c'; then $(CYGPATH_W) 'grub-core/kern/emu/hostfs.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/emu/hostfs.c'; fi` grub-core/osdep/grub_mount-init.o: grub-core/osdep/init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mount_CPPFLAGS) $(CPPFLAGS) $(grub_mount_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_mount-init.o -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_mount-init.Tpo -c -o grub-core/osdep/grub_mount-init.o `test -f 'grub-core/osdep/init.c' || echo '$(srcdir)/'`grub-core/osdep/init.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_mount-init.Tpo grub-core/osdep/$(DEPDIR)/grub_mount-init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/init.c' object='grub-core/osdep/grub_mount-init.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mount_CPPFLAGS) $(CPPFLAGS) $(grub_mount_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_mount-init.o `test -f 'grub-core/osdep/init.c' || echo '$(srcdir)/'`grub-core/osdep/init.c grub-core/osdep/grub_mount-init.obj: grub-core/osdep/init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mount_CPPFLAGS) $(CPPFLAGS) $(grub_mount_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_mount-init.obj -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_mount-init.Tpo -c -o grub-core/osdep/grub_mount-init.obj `if test -f 'grub-core/osdep/init.c'; then $(CYGPATH_W) 'grub-core/osdep/init.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/init.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_mount-init.Tpo grub-core/osdep/$(DEPDIR)/grub_mount-init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/init.c' object='grub-core/osdep/grub_mount-init.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mount_CPPFLAGS) $(CPPFLAGS) $(grub_mount_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_mount-init.obj `if test -f 'grub-core/osdep/init.c'; then $(CYGPATH_W) 'grub-core/osdep/init.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/init.c'; fi` util/grub_mount-grub-mount.o: util/grub-mount.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mount_CPPFLAGS) $(CPPFLAGS) $(grub_mount_CFLAGS) $(CFLAGS) -MT util/grub_mount-grub-mount.o -MD -MP -MF util/$(DEPDIR)/grub_mount-grub-mount.Tpo -c -o util/grub_mount-grub-mount.o `test -f 'util/grub-mount.c' || echo '$(srcdir)/'`util/grub-mount.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mount-grub-mount.Tpo util/$(DEPDIR)/grub_mount-grub-mount.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-mount.c' object='util/grub_mount-grub-mount.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mount_CPPFLAGS) $(CPPFLAGS) $(grub_mount_CFLAGS) $(CFLAGS) -c -o util/grub_mount-grub-mount.o `test -f 'util/grub-mount.c' || echo '$(srcdir)/'`util/grub-mount.c util/grub_mount-grub-mount.obj: util/grub-mount.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mount_CPPFLAGS) $(CPPFLAGS) $(grub_mount_CFLAGS) $(CFLAGS) -MT util/grub_mount-grub-mount.obj -MD -MP -MF util/$(DEPDIR)/grub_mount-grub-mount.Tpo -c -o util/grub_mount-grub-mount.obj `if test -f 'util/grub-mount.c'; then $(CYGPATH_W) 'util/grub-mount.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-mount.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_mount-grub-mount.Tpo util/$(DEPDIR)/grub_mount-grub-mount.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-mount.c' object='util/grub_mount-grub-mount.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mount_CPPFLAGS) $(CPPFLAGS) $(grub_mount_CFLAGS) $(CFLAGS) -c -o util/grub_mount-grub-mount.obj `if test -f 'util/grub-mount.c'; then $(CYGPATH_W) 'util/grub-mount.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-mount.c'; fi` grub_mount-grub_fstest_init.o: grub_fstest_init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mount_CPPFLAGS) $(CPPFLAGS) $(grub_mount_CFLAGS) $(CFLAGS) -MT grub_mount-grub_fstest_init.o -MD -MP -MF $(DEPDIR)/grub_mount-grub_fstest_init.Tpo -c -o grub_mount-grub_fstest_init.o `test -f 'grub_fstest_init.c' || echo '$(srcdir)/'`grub_fstest_init.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/grub_mount-grub_fstest_init.Tpo $(DEPDIR)/grub_mount-grub_fstest_init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub_fstest_init.c' object='grub_mount-grub_fstest_init.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mount_CPPFLAGS) $(CPPFLAGS) $(grub_mount_CFLAGS) $(CFLAGS) -c -o grub_mount-grub_fstest_init.o `test -f 'grub_fstest_init.c' || echo '$(srcdir)/'`grub_fstest_init.c grub_mount-grub_fstest_init.obj: grub_fstest_init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mount_CPPFLAGS) $(CPPFLAGS) $(grub_mount_CFLAGS) $(CFLAGS) -MT grub_mount-grub_fstest_init.obj -MD -MP -MF $(DEPDIR)/grub_mount-grub_fstest_init.Tpo -c -o grub_mount-grub_fstest_init.obj `if test -f 'grub_fstest_init.c'; then $(CYGPATH_W) 'grub_fstest_init.c'; else $(CYGPATH_W) '$(srcdir)/grub_fstest_init.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/grub_mount-grub_fstest_init.Tpo $(DEPDIR)/grub_mount-grub_fstest_init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub_fstest_init.c' object='grub_mount-grub_fstest_init.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_mount_CPPFLAGS) $(CPPFLAGS) $(grub_mount_CFLAGS) $(CFLAGS) -c -o grub_mount-grub_fstest_init.obj `if test -f 'grub_fstest_init.c'; then $(CYGPATH_W) 'grub_fstest_init.c'; else $(CYGPATH_W) '$(srcdir)/grub_fstest_init.c'; fi` grub-core/osdep/grub_ofpathname-init.o: grub-core/osdep/init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_ofpathname_CPPFLAGS) $(CPPFLAGS) $(grub_ofpathname_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_ofpathname-init.o -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_ofpathname-init.Tpo -c -o grub-core/osdep/grub_ofpathname-init.o `test -f 'grub-core/osdep/init.c' || echo '$(srcdir)/'`grub-core/osdep/init.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_ofpathname-init.Tpo grub-core/osdep/$(DEPDIR)/grub_ofpathname-init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/init.c' object='grub-core/osdep/grub_ofpathname-init.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_ofpathname_CPPFLAGS) $(CPPFLAGS) $(grub_ofpathname_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_ofpathname-init.o `test -f 'grub-core/osdep/init.c' || echo '$(srcdir)/'`grub-core/osdep/init.c grub-core/osdep/grub_ofpathname-init.obj: grub-core/osdep/init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_ofpathname_CPPFLAGS) $(CPPFLAGS) $(grub_ofpathname_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_ofpathname-init.obj -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_ofpathname-init.Tpo -c -o grub-core/osdep/grub_ofpathname-init.obj `if test -f 'grub-core/osdep/init.c'; then $(CYGPATH_W) 'grub-core/osdep/init.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/init.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_ofpathname-init.Tpo grub-core/osdep/$(DEPDIR)/grub_ofpathname-init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/init.c' object='grub-core/osdep/grub_ofpathname-init.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_ofpathname_CPPFLAGS) $(CPPFLAGS) $(grub_ofpathname_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_ofpathname-init.obj `if test -f 'grub-core/osdep/init.c'; then $(CYGPATH_W) 'grub-core/osdep/init.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/init.c'; fi` grub-core/osdep/grub_ofpathname-ofpath.o: grub-core/osdep/ofpath.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_ofpathname_CPPFLAGS) $(CPPFLAGS) $(grub_ofpathname_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_ofpathname-ofpath.o -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_ofpathname-ofpath.Tpo -c -o grub-core/osdep/grub_ofpathname-ofpath.o `test -f 'grub-core/osdep/ofpath.c' || echo '$(srcdir)/'`grub-core/osdep/ofpath.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_ofpathname-ofpath.Tpo grub-core/osdep/$(DEPDIR)/grub_ofpathname-ofpath.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/ofpath.c' object='grub-core/osdep/grub_ofpathname-ofpath.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_ofpathname_CPPFLAGS) $(CPPFLAGS) $(grub_ofpathname_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_ofpathname-ofpath.o `test -f 'grub-core/osdep/ofpath.c' || echo '$(srcdir)/'`grub-core/osdep/ofpath.c grub-core/osdep/grub_ofpathname-ofpath.obj: grub-core/osdep/ofpath.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_ofpathname_CPPFLAGS) $(CPPFLAGS) $(grub_ofpathname_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_ofpathname-ofpath.obj -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_ofpathname-ofpath.Tpo -c -o grub-core/osdep/grub_ofpathname-ofpath.obj `if test -f 'grub-core/osdep/ofpath.c'; then $(CYGPATH_W) 'grub-core/osdep/ofpath.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/ofpath.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_ofpathname-ofpath.Tpo grub-core/osdep/$(DEPDIR)/grub_ofpathname-ofpath.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/ofpath.c' object='grub-core/osdep/grub_ofpathname-ofpath.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_ofpathname_CPPFLAGS) $(CPPFLAGS) $(grub_ofpathname_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_ofpathname-ofpath.obj `if test -f 'grub-core/osdep/ofpath.c'; then $(CYGPATH_W) 'grub-core/osdep/ofpath.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/ofpath.c'; fi` util/ieee1275/grub_ofpathname-grub-ofpathname.o: util/ieee1275/grub-ofpathname.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_ofpathname_CPPFLAGS) $(CPPFLAGS) $(grub_ofpathname_CFLAGS) $(CFLAGS) -MT util/ieee1275/grub_ofpathname-grub-ofpathname.o -MD -MP -MF util/ieee1275/$(DEPDIR)/grub_ofpathname-grub-ofpathname.Tpo -c -o util/ieee1275/grub_ofpathname-grub-ofpathname.o `test -f 'util/ieee1275/grub-ofpathname.c' || echo '$(srcdir)/'`util/ieee1275/grub-ofpathname.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/ieee1275/$(DEPDIR)/grub_ofpathname-grub-ofpathname.Tpo util/ieee1275/$(DEPDIR)/grub_ofpathname-grub-ofpathname.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/ieee1275/grub-ofpathname.c' object='util/ieee1275/grub_ofpathname-grub-ofpathname.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_ofpathname_CPPFLAGS) $(CPPFLAGS) $(grub_ofpathname_CFLAGS) $(CFLAGS) -c -o util/ieee1275/grub_ofpathname-grub-ofpathname.o `test -f 'util/ieee1275/grub-ofpathname.c' || echo '$(srcdir)/'`util/ieee1275/grub-ofpathname.c util/ieee1275/grub_ofpathname-grub-ofpathname.obj: util/ieee1275/grub-ofpathname.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_ofpathname_CPPFLAGS) $(CPPFLAGS) $(grub_ofpathname_CFLAGS) $(CFLAGS) -MT util/ieee1275/grub_ofpathname-grub-ofpathname.obj -MD -MP -MF util/ieee1275/$(DEPDIR)/grub_ofpathname-grub-ofpathname.Tpo -c -o util/ieee1275/grub_ofpathname-grub-ofpathname.obj `if test -f 'util/ieee1275/grub-ofpathname.c'; then $(CYGPATH_W) 'util/ieee1275/grub-ofpathname.c'; else $(CYGPATH_W) '$(srcdir)/util/ieee1275/grub-ofpathname.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/ieee1275/$(DEPDIR)/grub_ofpathname-grub-ofpathname.Tpo util/ieee1275/$(DEPDIR)/grub_ofpathname-grub-ofpathname.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/ieee1275/grub-ofpathname.c' object='util/ieee1275/grub_ofpathname-grub-ofpathname.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_ofpathname_CPPFLAGS) $(CPPFLAGS) $(grub_ofpathname_CFLAGS) $(CFLAGS) -c -o util/ieee1275/grub_ofpathname-grub-ofpathname.obj `if test -f 'util/ieee1275/grub-ofpathname.c'; then $(CYGPATH_W) 'util/ieee1275/grub-ofpathname.c'; else $(CYGPATH_W) '$(srcdir)/util/ieee1275/grub-ofpathname.c'; fi` grub-core/kern/emu/grub_probe-argp_common.o: grub-core/kern/emu/argp_common.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_probe_CPPFLAGS) $(CPPFLAGS) $(grub_probe_CFLAGS) $(CFLAGS) -MT grub-core/kern/emu/grub_probe-argp_common.o -MD -MP -MF grub-core/kern/emu/$(DEPDIR)/grub_probe-argp_common.Tpo -c -o grub-core/kern/emu/grub_probe-argp_common.o `test -f 'grub-core/kern/emu/argp_common.c' || echo '$(srcdir)/'`grub-core/kern/emu/argp_common.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/emu/$(DEPDIR)/grub_probe-argp_common.Tpo grub-core/kern/emu/$(DEPDIR)/grub_probe-argp_common.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/emu/argp_common.c' object='grub-core/kern/emu/grub_probe-argp_common.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_probe_CPPFLAGS) $(CPPFLAGS) $(grub_probe_CFLAGS) $(CFLAGS) -c -o grub-core/kern/emu/grub_probe-argp_common.o `test -f 'grub-core/kern/emu/argp_common.c' || echo '$(srcdir)/'`grub-core/kern/emu/argp_common.c grub-core/kern/emu/grub_probe-argp_common.obj: grub-core/kern/emu/argp_common.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_probe_CPPFLAGS) $(CPPFLAGS) $(grub_probe_CFLAGS) $(CFLAGS) -MT grub-core/kern/emu/grub_probe-argp_common.obj -MD -MP -MF grub-core/kern/emu/$(DEPDIR)/grub_probe-argp_common.Tpo -c -o grub-core/kern/emu/grub_probe-argp_common.obj `if test -f 'grub-core/kern/emu/argp_common.c'; then $(CYGPATH_W) 'grub-core/kern/emu/argp_common.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/emu/argp_common.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/emu/$(DEPDIR)/grub_probe-argp_common.Tpo grub-core/kern/emu/$(DEPDIR)/grub_probe-argp_common.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/emu/argp_common.c' object='grub-core/kern/emu/grub_probe-argp_common.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_probe_CPPFLAGS) $(CPPFLAGS) $(grub_probe_CFLAGS) $(CFLAGS) -c -o grub-core/kern/emu/grub_probe-argp_common.obj `if test -f 'grub-core/kern/emu/argp_common.c'; then $(CYGPATH_W) 'grub-core/kern/emu/argp_common.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/emu/argp_common.c'; fi` grub-core/osdep/grub_probe-init.o: grub-core/osdep/init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_probe_CPPFLAGS) $(CPPFLAGS) $(grub_probe_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_probe-init.o -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_probe-init.Tpo -c -o grub-core/osdep/grub_probe-init.o `test -f 'grub-core/osdep/init.c' || echo '$(srcdir)/'`grub-core/osdep/init.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_probe-init.Tpo grub-core/osdep/$(DEPDIR)/grub_probe-init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/init.c' object='grub-core/osdep/grub_probe-init.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_probe_CPPFLAGS) $(CPPFLAGS) $(grub_probe_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_probe-init.o `test -f 'grub-core/osdep/init.c' || echo '$(srcdir)/'`grub-core/osdep/init.c grub-core/osdep/grub_probe-init.obj: grub-core/osdep/init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_probe_CPPFLAGS) $(CPPFLAGS) $(grub_probe_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_probe-init.obj -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_probe-init.Tpo -c -o grub-core/osdep/grub_probe-init.obj `if test -f 'grub-core/osdep/init.c'; then $(CYGPATH_W) 'grub-core/osdep/init.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/init.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_probe-init.Tpo grub-core/osdep/$(DEPDIR)/grub_probe-init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/init.c' object='grub-core/osdep/grub_probe-init.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_probe_CPPFLAGS) $(CPPFLAGS) $(grub_probe_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_probe-init.obj `if test -f 'grub-core/osdep/init.c'; then $(CYGPATH_W) 'grub-core/osdep/init.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/init.c'; fi` grub-core/osdep/grub_probe-ofpath.o: grub-core/osdep/ofpath.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_probe_CPPFLAGS) $(CPPFLAGS) $(grub_probe_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_probe-ofpath.o -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_probe-ofpath.Tpo -c -o grub-core/osdep/grub_probe-ofpath.o `test -f 'grub-core/osdep/ofpath.c' || echo '$(srcdir)/'`grub-core/osdep/ofpath.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_probe-ofpath.Tpo grub-core/osdep/$(DEPDIR)/grub_probe-ofpath.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/ofpath.c' object='grub-core/osdep/grub_probe-ofpath.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_probe_CPPFLAGS) $(CPPFLAGS) $(grub_probe_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_probe-ofpath.o `test -f 'grub-core/osdep/ofpath.c' || echo '$(srcdir)/'`grub-core/osdep/ofpath.c grub-core/osdep/grub_probe-ofpath.obj: grub-core/osdep/ofpath.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_probe_CPPFLAGS) $(CPPFLAGS) $(grub_probe_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_probe-ofpath.obj -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_probe-ofpath.Tpo -c -o grub-core/osdep/grub_probe-ofpath.obj `if test -f 'grub-core/osdep/ofpath.c'; then $(CYGPATH_W) 'grub-core/osdep/ofpath.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/ofpath.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_probe-ofpath.Tpo grub-core/osdep/$(DEPDIR)/grub_probe-ofpath.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/ofpath.c' object='grub-core/osdep/grub_probe-ofpath.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_probe_CPPFLAGS) $(CPPFLAGS) $(grub_probe_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_probe-ofpath.obj `if test -f 'grub-core/osdep/ofpath.c'; then $(CYGPATH_W) 'grub-core/osdep/ofpath.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/ofpath.c'; fi` util/grub_probe-grub-probe.o: util/grub-probe.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_probe_CPPFLAGS) $(CPPFLAGS) $(grub_probe_CFLAGS) $(CFLAGS) -MT util/grub_probe-grub-probe.o -MD -MP -MF util/$(DEPDIR)/grub_probe-grub-probe.Tpo -c -o util/grub_probe-grub-probe.o `test -f 'util/grub-probe.c' || echo '$(srcdir)/'`util/grub-probe.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_probe-grub-probe.Tpo util/$(DEPDIR)/grub_probe-grub-probe.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-probe.c' object='util/grub_probe-grub-probe.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_probe_CPPFLAGS) $(CPPFLAGS) $(grub_probe_CFLAGS) $(CFLAGS) -c -o util/grub_probe-grub-probe.o `test -f 'util/grub-probe.c' || echo '$(srcdir)/'`util/grub-probe.c util/grub_probe-grub-probe.obj: util/grub-probe.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_probe_CPPFLAGS) $(CPPFLAGS) $(grub_probe_CFLAGS) $(CFLAGS) -MT util/grub_probe-grub-probe.obj -MD -MP -MF util/$(DEPDIR)/grub_probe-grub-probe.Tpo -c -o util/grub_probe-grub-probe.obj `if test -f 'util/grub-probe.c'; then $(CYGPATH_W) 'util/grub-probe.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-probe.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_probe-grub-probe.Tpo util/$(DEPDIR)/grub_probe-grub-probe.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-probe.c' object='util/grub_probe-grub-probe.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_probe_CPPFLAGS) $(CPPFLAGS) $(grub_probe_CFLAGS) $(CFLAGS) -c -o util/grub_probe-grub-probe.obj `if test -f 'util/grub-probe.c'; then $(CYGPATH_W) 'util/grub-probe.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-probe.c'; fi` util/grub_probe-probe.o: util/probe.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_probe_CPPFLAGS) $(CPPFLAGS) $(grub_probe_CFLAGS) $(CFLAGS) -MT util/grub_probe-probe.o -MD -MP -MF util/$(DEPDIR)/grub_probe-probe.Tpo -c -o util/grub_probe-probe.o `test -f 'util/probe.c' || echo '$(srcdir)/'`util/probe.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_probe-probe.Tpo util/$(DEPDIR)/grub_probe-probe.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/probe.c' object='util/grub_probe-probe.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_probe_CPPFLAGS) $(CPPFLAGS) $(grub_probe_CFLAGS) $(CFLAGS) -c -o util/grub_probe-probe.o `test -f 'util/probe.c' || echo '$(srcdir)/'`util/probe.c util/grub_probe-probe.obj: util/probe.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_probe_CPPFLAGS) $(CPPFLAGS) $(grub_probe_CFLAGS) $(CFLAGS) -MT util/grub_probe-probe.obj -MD -MP -MF util/$(DEPDIR)/grub_probe-probe.Tpo -c -o util/grub_probe-probe.obj `if test -f 'util/probe.c'; then $(CYGPATH_W) 'util/probe.c'; else $(CYGPATH_W) '$(srcdir)/util/probe.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_probe-probe.Tpo util/$(DEPDIR)/grub_probe-probe.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/probe.c' object='util/grub_probe-probe.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_probe_CPPFLAGS) $(CPPFLAGS) $(grub_probe_CFLAGS) $(CFLAGS) -c -o util/grub_probe-probe.obj `if test -f 'util/probe.c'; then $(CYGPATH_W) 'util/probe.c'; else $(CYGPATH_W) '$(srcdir)/util/probe.c'; fi` grub-core/commands/tpm2_key_protector/grub_protect-args.o: grub-core/commands/tpm2_key_protector/args.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_protect_CPPFLAGS) $(CPPFLAGS) $(grub_protect_CFLAGS) $(CFLAGS) -MT grub-core/commands/tpm2_key_protector/grub_protect-args.o -MD -MP -MF grub-core/commands/tpm2_key_protector/$(DEPDIR)/grub_protect-args.Tpo -c -o grub-core/commands/tpm2_key_protector/grub_protect-args.o `test -f 'grub-core/commands/tpm2_key_protector/args.c' || echo '$(srcdir)/'`grub-core/commands/tpm2_key_protector/args.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/commands/tpm2_key_protector/$(DEPDIR)/grub_protect-args.Tpo grub-core/commands/tpm2_key_protector/$(DEPDIR)/grub_protect-args.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/commands/tpm2_key_protector/args.c' object='grub-core/commands/tpm2_key_protector/grub_protect-args.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_protect_CPPFLAGS) $(CPPFLAGS) $(grub_protect_CFLAGS) $(CFLAGS) -c -o grub-core/commands/tpm2_key_protector/grub_protect-args.o `test -f 'grub-core/commands/tpm2_key_protector/args.c' || echo '$(srcdir)/'`grub-core/commands/tpm2_key_protector/args.c grub-core/commands/tpm2_key_protector/grub_protect-args.obj: grub-core/commands/tpm2_key_protector/args.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_protect_CPPFLAGS) $(CPPFLAGS) $(grub_protect_CFLAGS) $(CFLAGS) -MT grub-core/commands/tpm2_key_protector/grub_protect-args.obj -MD -MP -MF grub-core/commands/tpm2_key_protector/$(DEPDIR)/grub_protect-args.Tpo -c -o grub-core/commands/tpm2_key_protector/grub_protect-args.obj `if test -f 'grub-core/commands/tpm2_key_protector/args.c'; then $(CYGPATH_W) 'grub-core/commands/tpm2_key_protector/args.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/commands/tpm2_key_protector/args.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/commands/tpm2_key_protector/$(DEPDIR)/grub_protect-args.Tpo grub-core/commands/tpm2_key_protector/$(DEPDIR)/grub_protect-args.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/commands/tpm2_key_protector/args.c' object='grub-core/commands/tpm2_key_protector/grub_protect-args.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_protect_CPPFLAGS) $(CPPFLAGS) $(grub_protect_CFLAGS) $(CFLAGS) -c -o grub-core/commands/tpm2_key_protector/grub_protect-args.obj `if test -f 'grub-core/commands/tpm2_key_protector/args.c'; then $(CYGPATH_W) 'grub-core/commands/tpm2_key_protector/args.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/commands/tpm2_key_protector/args.c'; fi` grub-core/commands/tpm2_key_protector/grub_protect-tpm2key_asn1_tab.o: grub-core/commands/tpm2_key_protector/tpm2key_asn1_tab.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_protect_CPPFLAGS) $(CPPFLAGS) $(grub_protect_CFLAGS) $(CFLAGS) -MT grub-core/commands/tpm2_key_protector/grub_protect-tpm2key_asn1_tab.o -MD -MP -MF grub-core/commands/tpm2_key_protector/$(DEPDIR)/grub_protect-tpm2key_asn1_tab.Tpo -c -o grub-core/commands/tpm2_key_protector/grub_protect-tpm2key_asn1_tab.o `test -f 'grub-core/commands/tpm2_key_protector/tpm2key_asn1_tab.c' || echo '$(srcdir)/'`grub-core/commands/tpm2_key_protector/tpm2key_asn1_tab.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/commands/tpm2_key_protector/$(DEPDIR)/grub_protect-tpm2key_asn1_tab.Tpo grub-core/commands/tpm2_key_protector/$(DEPDIR)/grub_protect-tpm2key_asn1_tab.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/commands/tpm2_key_protector/tpm2key_asn1_tab.c' object='grub-core/commands/tpm2_key_protector/grub_protect-tpm2key_asn1_tab.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_protect_CPPFLAGS) $(CPPFLAGS) $(grub_protect_CFLAGS) $(CFLAGS) -c -o grub-core/commands/tpm2_key_protector/grub_protect-tpm2key_asn1_tab.o `test -f 'grub-core/commands/tpm2_key_protector/tpm2key_asn1_tab.c' || echo '$(srcdir)/'`grub-core/commands/tpm2_key_protector/tpm2key_asn1_tab.c grub-core/commands/tpm2_key_protector/grub_protect-tpm2key_asn1_tab.obj: grub-core/commands/tpm2_key_protector/tpm2key_asn1_tab.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_protect_CPPFLAGS) $(CPPFLAGS) $(grub_protect_CFLAGS) $(CFLAGS) -MT grub-core/commands/tpm2_key_protector/grub_protect-tpm2key_asn1_tab.obj -MD -MP -MF grub-core/commands/tpm2_key_protector/$(DEPDIR)/grub_protect-tpm2key_asn1_tab.Tpo -c -o grub-core/commands/tpm2_key_protector/grub_protect-tpm2key_asn1_tab.obj `if test -f 'grub-core/commands/tpm2_key_protector/tpm2key_asn1_tab.c'; then $(CYGPATH_W) 'grub-core/commands/tpm2_key_protector/tpm2key_asn1_tab.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/commands/tpm2_key_protector/tpm2key_asn1_tab.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/commands/tpm2_key_protector/$(DEPDIR)/grub_protect-tpm2key_asn1_tab.Tpo grub-core/commands/tpm2_key_protector/$(DEPDIR)/grub_protect-tpm2key_asn1_tab.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/commands/tpm2_key_protector/tpm2key_asn1_tab.c' object='grub-core/commands/tpm2_key_protector/grub_protect-tpm2key_asn1_tab.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_protect_CPPFLAGS) $(CPPFLAGS) $(grub_protect_CFLAGS) $(CFLAGS) -c -o grub-core/commands/tpm2_key_protector/grub_protect-tpm2key_asn1_tab.obj `if test -f 'grub-core/commands/tpm2_key_protector/tpm2key_asn1_tab.c'; then $(CYGPATH_W) 'grub-core/commands/tpm2_key_protector/tpm2key_asn1_tab.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/commands/tpm2_key_protector/tpm2key_asn1_tab.c'; fi` grub-core/kern/emu/grub_protect-argp_common.o: grub-core/kern/emu/argp_common.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_protect_CPPFLAGS) $(CPPFLAGS) $(grub_protect_CFLAGS) $(CFLAGS) -MT grub-core/kern/emu/grub_protect-argp_common.o -MD -MP -MF grub-core/kern/emu/$(DEPDIR)/grub_protect-argp_common.Tpo -c -o grub-core/kern/emu/grub_protect-argp_common.o `test -f 'grub-core/kern/emu/argp_common.c' || echo '$(srcdir)/'`grub-core/kern/emu/argp_common.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/emu/$(DEPDIR)/grub_protect-argp_common.Tpo grub-core/kern/emu/$(DEPDIR)/grub_protect-argp_common.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/emu/argp_common.c' object='grub-core/kern/emu/grub_protect-argp_common.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_protect_CPPFLAGS) $(CPPFLAGS) $(grub_protect_CFLAGS) $(CFLAGS) -c -o grub-core/kern/emu/grub_protect-argp_common.o `test -f 'grub-core/kern/emu/argp_common.c' || echo '$(srcdir)/'`grub-core/kern/emu/argp_common.c grub-core/kern/emu/grub_protect-argp_common.obj: grub-core/kern/emu/argp_common.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_protect_CPPFLAGS) $(CPPFLAGS) $(grub_protect_CFLAGS) $(CFLAGS) -MT grub-core/kern/emu/grub_protect-argp_common.obj -MD -MP -MF grub-core/kern/emu/$(DEPDIR)/grub_protect-argp_common.Tpo -c -o grub-core/kern/emu/grub_protect-argp_common.obj `if test -f 'grub-core/kern/emu/argp_common.c'; then $(CYGPATH_W) 'grub-core/kern/emu/argp_common.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/emu/argp_common.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/emu/$(DEPDIR)/grub_protect-argp_common.Tpo grub-core/kern/emu/$(DEPDIR)/grub_protect-argp_common.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/emu/argp_common.c' object='grub-core/kern/emu/grub_protect-argp_common.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_protect_CPPFLAGS) $(CPPFLAGS) $(grub_protect_CFLAGS) $(CFLAGS) -c -o grub-core/kern/emu/grub_protect-argp_common.obj `if test -f 'grub-core/kern/emu/argp_common.c'; then $(CYGPATH_W) 'grub-core/kern/emu/argp_common.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/emu/argp_common.c'; fi` grub-core/lib/tss2/grub_protect-buffer.o: grub-core/lib/tss2/buffer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_protect_CPPFLAGS) $(CPPFLAGS) $(grub_protect_CFLAGS) $(CFLAGS) -MT grub-core/lib/tss2/grub_protect-buffer.o -MD -MP -MF grub-core/lib/tss2/$(DEPDIR)/grub_protect-buffer.Tpo -c -o grub-core/lib/tss2/grub_protect-buffer.o `test -f 'grub-core/lib/tss2/buffer.c' || echo '$(srcdir)/'`grub-core/lib/tss2/buffer.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/tss2/$(DEPDIR)/grub_protect-buffer.Tpo grub-core/lib/tss2/$(DEPDIR)/grub_protect-buffer.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/tss2/buffer.c' object='grub-core/lib/tss2/grub_protect-buffer.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_protect_CPPFLAGS) $(CPPFLAGS) $(grub_protect_CFLAGS) $(CFLAGS) -c -o grub-core/lib/tss2/grub_protect-buffer.o `test -f 'grub-core/lib/tss2/buffer.c' || echo '$(srcdir)/'`grub-core/lib/tss2/buffer.c grub-core/lib/tss2/grub_protect-buffer.obj: grub-core/lib/tss2/buffer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_protect_CPPFLAGS) $(CPPFLAGS) $(grub_protect_CFLAGS) $(CFLAGS) -MT grub-core/lib/tss2/grub_protect-buffer.obj -MD -MP -MF grub-core/lib/tss2/$(DEPDIR)/grub_protect-buffer.Tpo -c -o grub-core/lib/tss2/grub_protect-buffer.obj `if test -f 'grub-core/lib/tss2/buffer.c'; then $(CYGPATH_W) 'grub-core/lib/tss2/buffer.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/tss2/buffer.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/tss2/$(DEPDIR)/grub_protect-buffer.Tpo grub-core/lib/tss2/$(DEPDIR)/grub_protect-buffer.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/tss2/buffer.c' object='grub-core/lib/tss2/grub_protect-buffer.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_protect_CPPFLAGS) $(CPPFLAGS) $(grub_protect_CFLAGS) $(CFLAGS) -c -o grub-core/lib/tss2/grub_protect-buffer.obj `if test -f 'grub-core/lib/tss2/buffer.c'; then $(CYGPATH_W) 'grub-core/lib/tss2/buffer.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/tss2/buffer.c'; fi` grub-core/lib/tss2/grub_protect-tpm2_cmd.o: grub-core/lib/tss2/tpm2_cmd.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_protect_CPPFLAGS) $(CPPFLAGS) $(grub_protect_CFLAGS) $(CFLAGS) -MT grub-core/lib/tss2/grub_protect-tpm2_cmd.o -MD -MP -MF grub-core/lib/tss2/$(DEPDIR)/grub_protect-tpm2_cmd.Tpo -c -o grub-core/lib/tss2/grub_protect-tpm2_cmd.o `test -f 'grub-core/lib/tss2/tpm2_cmd.c' || echo '$(srcdir)/'`grub-core/lib/tss2/tpm2_cmd.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/tss2/$(DEPDIR)/grub_protect-tpm2_cmd.Tpo grub-core/lib/tss2/$(DEPDIR)/grub_protect-tpm2_cmd.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/tss2/tpm2_cmd.c' object='grub-core/lib/tss2/grub_protect-tpm2_cmd.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_protect_CPPFLAGS) $(CPPFLAGS) $(grub_protect_CFLAGS) $(CFLAGS) -c -o grub-core/lib/tss2/grub_protect-tpm2_cmd.o `test -f 'grub-core/lib/tss2/tpm2_cmd.c' || echo '$(srcdir)/'`grub-core/lib/tss2/tpm2_cmd.c grub-core/lib/tss2/grub_protect-tpm2_cmd.obj: grub-core/lib/tss2/tpm2_cmd.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_protect_CPPFLAGS) $(CPPFLAGS) $(grub_protect_CFLAGS) $(CFLAGS) -MT grub-core/lib/tss2/grub_protect-tpm2_cmd.obj -MD -MP -MF grub-core/lib/tss2/$(DEPDIR)/grub_protect-tpm2_cmd.Tpo -c -o grub-core/lib/tss2/grub_protect-tpm2_cmd.obj `if test -f 'grub-core/lib/tss2/tpm2_cmd.c'; then $(CYGPATH_W) 'grub-core/lib/tss2/tpm2_cmd.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/tss2/tpm2_cmd.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/tss2/$(DEPDIR)/grub_protect-tpm2_cmd.Tpo grub-core/lib/tss2/$(DEPDIR)/grub_protect-tpm2_cmd.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/tss2/tpm2_cmd.c' object='grub-core/lib/tss2/grub_protect-tpm2_cmd.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_protect_CPPFLAGS) $(CPPFLAGS) $(grub_protect_CFLAGS) $(CFLAGS) -c -o grub-core/lib/tss2/grub_protect-tpm2_cmd.obj `if test -f 'grub-core/lib/tss2/tpm2_cmd.c'; then $(CYGPATH_W) 'grub-core/lib/tss2/tpm2_cmd.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/tss2/tpm2_cmd.c'; fi` grub-core/lib/tss2/grub_protect-tss2_mu.o: grub-core/lib/tss2/tss2_mu.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_protect_CPPFLAGS) $(CPPFLAGS) $(grub_protect_CFLAGS) $(CFLAGS) -MT grub-core/lib/tss2/grub_protect-tss2_mu.o -MD -MP -MF grub-core/lib/tss2/$(DEPDIR)/grub_protect-tss2_mu.Tpo -c -o grub-core/lib/tss2/grub_protect-tss2_mu.o `test -f 'grub-core/lib/tss2/tss2_mu.c' || echo '$(srcdir)/'`grub-core/lib/tss2/tss2_mu.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/tss2/$(DEPDIR)/grub_protect-tss2_mu.Tpo grub-core/lib/tss2/$(DEPDIR)/grub_protect-tss2_mu.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/tss2/tss2_mu.c' object='grub-core/lib/tss2/grub_protect-tss2_mu.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_protect_CPPFLAGS) $(CPPFLAGS) $(grub_protect_CFLAGS) $(CFLAGS) -c -o grub-core/lib/tss2/grub_protect-tss2_mu.o `test -f 'grub-core/lib/tss2/tss2_mu.c' || echo '$(srcdir)/'`grub-core/lib/tss2/tss2_mu.c grub-core/lib/tss2/grub_protect-tss2_mu.obj: grub-core/lib/tss2/tss2_mu.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_protect_CPPFLAGS) $(CPPFLAGS) $(grub_protect_CFLAGS) $(CFLAGS) -MT grub-core/lib/tss2/grub_protect-tss2_mu.obj -MD -MP -MF grub-core/lib/tss2/$(DEPDIR)/grub_protect-tss2_mu.Tpo -c -o grub-core/lib/tss2/grub_protect-tss2_mu.obj `if test -f 'grub-core/lib/tss2/tss2_mu.c'; then $(CYGPATH_W) 'grub-core/lib/tss2/tss2_mu.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/tss2/tss2_mu.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/tss2/$(DEPDIR)/grub_protect-tss2_mu.Tpo grub-core/lib/tss2/$(DEPDIR)/grub_protect-tss2_mu.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/tss2/tss2_mu.c' object='grub-core/lib/tss2/grub_protect-tss2_mu.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_protect_CPPFLAGS) $(CPPFLAGS) $(grub_protect_CFLAGS) $(CFLAGS) -c -o grub-core/lib/tss2/grub_protect-tss2_mu.obj `if test -f 'grub-core/lib/tss2/tss2_mu.c'; then $(CYGPATH_W) 'grub-core/lib/tss2/tss2_mu.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/tss2/tss2_mu.c'; fi` grub-core/osdep/grub_protect-init.o: grub-core/osdep/init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_protect_CPPFLAGS) $(CPPFLAGS) $(grub_protect_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_protect-init.o -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_protect-init.Tpo -c -o grub-core/osdep/grub_protect-init.o `test -f 'grub-core/osdep/init.c' || echo '$(srcdir)/'`grub-core/osdep/init.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_protect-init.Tpo grub-core/osdep/$(DEPDIR)/grub_protect-init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/init.c' object='grub-core/osdep/grub_protect-init.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_protect_CPPFLAGS) $(CPPFLAGS) $(grub_protect_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_protect-init.o `test -f 'grub-core/osdep/init.c' || echo '$(srcdir)/'`grub-core/osdep/init.c grub-core/osdep/grub_protect-init.obj: grub-core/osdep/init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_protect_CPPFLAGS) $(CPPFLAGS) $(grub_protect_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_protect-init.obj -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_protect-init.Tpo -c -o grub-core/osdep/grub_protect-init.obj `if test -f 'grub-core/osdep/init.c'; then $(CYGPATH_W) 'grub-core/osdep/init.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/init.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_protect-init.Tpo grub-core/osdep/$(DEPDIR)/grub_protect-init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/init.c' object='grub-core/osdep/grub_protect-init.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_protect_CPPFLAGS) $(CPPFLAGS) $(grub_protect_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_protect-init.obj `if test -f 'grub-core/osdep/init.c'; then $(CYGPATH_W) 'grub-core/osdep/init.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/init.c'; fi` util/grub_protect-grub-protect.o: util/grub-protect.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_protect_CPPFLAGS) $(CPPFLAGS) $(grub_protect_CFLAGS) $(CFLAGS) -MT util/grub_protect-grub-protect.o -MD -MP -MF util/$(DEPDIR)/grub_protect-grub-protect.Tpo -c -o util/grub_protect-grub-protect.o `test -f 'util/grub-protect.c' || echo '$(srcdir)/'`util/grub-protect.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_protect-grub-protect.Tpo util/$(DEPDIR)/grub_protect-grub-protect.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-protect.c' object='util/grub_protect-grub-protect.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_protect_CPPFLAGS) $(CPPFLAGS) $(grub_protect_CFLAGS) $(CFLAGS) -c -o util/grub_protect-grub-protect.o `test -f 'util/grub-protect.c' || echo '$(srcdir)/'`util/grub-protect.c util/grub_protect-grub-protect.obj: util/grub-protect.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_protect_CPPFLAGS) $(CPPFLAGS) $(grub_protect_CFLAGS) $(CFLAGS) -MT util/grub_protect-grub-protect.obj -MD -MP -MF util/$(DEPDIR)/grub_protect-grub-protect.Tpo -c -o util/grub_protect-grub-protect.obj `if test -f 'util/grub-protect.c'; then $(CYGPATH_W) 'util/grub-protect.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-protect.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_protect-grub-protect.Tpo util/$(DEPDIR)/grub_protect-grub-protect.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-protect.c' object='util/grub_protect-grub-protect.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_protect_CPPFLAGS) $(CPPFLAGS) $(grub_protect_CFLAGS) $(CFLAGS) -c -o util/grub_protect-grub-protect.obj `if test -f 'util/grub-protect.c'; then $(CYGPATH_W) 'util/grub-protect.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-protect.c'; fi` util/grub_protect-probe.o: util/probe.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_protect_CPPFLAGS) $(CPPFLAGS) $(grub_protect_CFLAGS) $(CFLAGS) -MT util/grub_protect-probe.o -MD -MP -MF util/$(DEPDIR)/grub_protect-probe.Tpo -c -o util/grub_protect-probe.o `test -f 'util/probe.c' || echo '$(srcdir)/'`util/probe.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_protect-probe.Tpo util/$(DEPDIR)/grub_protect-probe.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/probe.c' object='util/grub_protect-probe.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_protect_CPPFLAGS) $(CPPFLAGS) $(grub_protect_CFLAGS) $(CFLAGS) -c -o util/grub_protect-probe.o `test -f 'util/probe.c' || echo '$(srcdir)/'`util/probe.c util/grub_protect-probe.obj: util/probe.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_protect_CPPFLAGS) $(CPPFLAGS) $(grub_protect_CFLAGS) $(CFLAGS) -MT util/grub_protect-probe.obj -MD -MP -MF util/$(DEPDIR)/grub_protect-probe.Tpo -c -o util/grub_protect-probe.obj `if test -f 'util/probe.c'; then $(CYGPATH_W) 'util/probe.c'; else $(CYGPATH_W) '$(srcdir)/util/probe.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_protect-probe.Tpo util/$(DEPDIR)/grub_protect-probe.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/probe.c' object='util/grub_protect-probe.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_protect_CPPFLAGS) $(CPPFLAGS) $(grub_protect_CFLAGS) $(CFLAGS) -c -o util/grub_protect-probe.obj `if test -f 'util/probe.c'; then $(CYGPATH_W) 'util/probe.c'; else $(CYGPATH_W) '$(srcdir)/util/probe.c'; fi` grub-core/disk/grub_render_label-host.o: grub-core/disk/host.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_render_label_CPPFLAGS) $(CPPFLAGS) $(grub_render_label_CFLAGS) $(CFLAGS) -MT grub-core/disk/grub_render_label-host.o -MD -MP -MF grub-core/disk/$(DEPDIR)/grub_render_label-host.Tpo -c -o grub-core/disk/grub_render_label-host.o `test -f 'grub-core/disk/host.c' || echo '$(srcdir)/'`grub-core/disk/host.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/disk/$(DEPDIR)/grub_render_label-host.Tpo grub-core/disk/$(DEPDIR)/grub_render_label-host.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/disk/host.c' object='grub-core/disk/grub_render_label-host.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_render_label_CPPFLAGS) $(CPPFLAGS) $(grub_render_label_CFLAGS) $(CFLAGS) -c -o grub-core/disk/grub_render_label-host.o `test -f 'grub-core/disk/host.c' || echo '$(srcdir)/'`grub-core/disk/host.c grub-core/disk/grub_render_label-host.obj: grub-core/disk/host.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_render_label_CPPFLAGS) $(CPPFLAGS) $(grub_render_label_CFLAGS) $(CFLAGS) -MT grub-core/disk/grub_render_label-host.obj -MD -MP -MF grub-core/disk/$(DEPDIR)/grub_render_label-host.Tpo -c -o grub-core/disk/grub_render_label-host.obj `if test -f 'grub-core/disk/host.c'; then $(CYGPATH_W) 'grub-core/disk/host.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/disk/host.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/disk/$(DEPDIR)/grub_render_label-host.Tpo grub-core/disk/$(DEPDIR)/grub_render_label-host.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/disk/host.c' object='grub-core/disk/grub_render_label-host.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_render_label_CPPFLAGS) $(CPPFLAGS) $(grub_render_label_CFLAGS) $(CFLAGS) -c -o grub-core/disk/grub_render_label-host.obj `if test -f 'grub-core/disk/host.c'; then $(CYGPATH_W) 'grub-core/disk/host.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/disk/host.c'; fi` grub-core/kern/emu/grub_render_label-argp_common.o: grub-core/kern/emu/argp_common.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_render_label_CPPFLAGS) $(CPPFLAGS) $(grub_render_label_CFLAGS) $(CFLAGS) -MT grub-core/kern/emu/grub_render_label-argp_common.o -MD -MP -MF grub-core/kern/emu/$(DEPDIR)/grub_render_label-argp_common.Tpo -c -o grub-core/kern/emu/grub_render_label-argp_common.o `test -f 'grub-core/kern/emu/argp_common.c' || echo '$(srcdir)/'`grub-core/kern/emu/argp_common.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/emu/$(DEPDIR)/grub_render_label-argp_common.Tpo grub-core/kern/emu/$(DEPDIR)/grub_render_label-argp_common.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/emu/argp_common.c' object='grub-core/kern/emu/grub_render_label-argp_common.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_render_label_CPPFLAGS) $(CPPFLAGS) $(grub_render_label_CFLAGS) $(CFLAGS) -c -o grub-core/kern/emu/grub_render_label-argp_common.o `test -f 'grub-core/kern/emu/argp_common.c' || echo '$(srcdir)/'`grub-core/kern/emu/argp_common.c grub-core/kern/emu/grub_render_label-argp_common.obj: grub-core/kern/emu/argp_common.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_render_label_CPPFLAGS) $(CPPFLAGS) $(grub_render_label_CFLAGS) $(CFLAGS) -MT grub-core/kern/emu/grub_render_label-argp_common.obj -MD -MP -MF grub-core/kern/emu/$(DEPDIR)/grub_render_label-argp_common.Tpo -c -o grub-core/kern/emu/grub_render_label-argp_common.obj `if test -f 'grub-core/kern/emu/argp_common.c'; then $(CYGPATH_W) 'grub-core/kern/emu/argp_common.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/emu/argp_common.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/emu/$(DEPDIR)/grub_render_label-argp_common.Tpo grub-core/kern/emu/$(DEPDIR)/grub_render_label-argp_common.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/emu/argp_common.c' object='grub-core/kern/emu/grub_render_label-argp_common.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_render_label_CPPFLAGS) $(CPPFLAGS) $(grub_render_label_CFLAGS) $(CFLAGS) -c -o grub-core/kern/emu/grub_render_label-argp_common.obj `if test -f 'grub-core/kern/emu/argp_common.c'; then $(CYGPATH_W) 'grub-core/kern/emu/argp_common.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/emu/argp_common.c'; fi` grub-core/kern/emu/grub_render_label-hostfs.o: grub-core/kern/emu/hostfs.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_render_label_CPPFLAGS) $(CPPFLAGS) $(grub_render_label_CFLAGS) $(CFLAGS) -MT grub-core/kern/emu/grub_render_label-hostfs.o -MD -MP -MF grub-core/kern/emu/$(DEPDIR)/grub_render_label-hostfs.Tpo -c -o grub-core/kern/emu/grub_render_label-hostfs.o `test -f 'grub-core/kern/emu/hostfs.c' || echo '$(srcdir)/'`grub-core/kern/emu/hostfs.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/emu/$(DEPDIR)/grub_render_label-hostfs.Tpo grub-core/kern/emu/$(DEPDIR)/grub_render_label-hostfs.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/emu/hostfs.c' object='grub-core/kern/emu/grub_render_label-hostfs.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_render_label_CPPFLAGS) $(CPPFLAGS) $(grub_render_label_CFLAGS) $(CFLAGS) -c -o grub-core/kern/emu/grub_render_label-hostfs.o `test -f 'grub-core/kern/emu/hostfs.c' || echo '$(srcdir)/'`grub-core/kern/emu/hostfs.c grub-core/kern/emu/grub_render_label-hostfs.obj: grub-core/kern/emu/hostfs.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_render_label_CPPFLAGS) $(CPPFLAGS) $(grub_render_label_CFLAGS) $(CFLAGS) -MT grub-core/kern/emu/grub_render_label-hostfs.obj -MD -MP -MF grub-core/kern/emu/$(DEPDIR)/grub_render_label-hostfs.Tpo -c -o grub-core/kern/emu/grub_render_label-hostfs.obj `if test -f 'grub-core/kern/emu/hostfs.c'; then $(CYGPATH_W) 'grub-core/kern/emu/hostfs.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/emu/hostfs.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/emu/$(DEPDIR)/grub_render_label-hostfs.Tpo grub-core/kern/emu/$(DEPDIR)/grub_render_label-hostfs.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/emu/hostfs.c' object='grub-core/kern/emu/grub_render_label-hostfs.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_render_label_CPPFLAGS) $(CPPFLAGS) $(grub_render_label_CFLAGS) $(CFLAGS) -c -o grub-core/kern/emu/grub_render_label-hostfs.obj `if test -f 'grub-core/kern/emu/hostfs.c'; then $(CYGPATH_W) 'grub-core/kern/emu/hostfs.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/emu/hostfs.c'; fi` grub-core/osdep/grub_render_label-init.o: grub-core/osdep/init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_render_label_CPPFLAGS) $(CPPFLAGS) $(grub_render_label_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_render_label-init.o -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_render_label-init.Tpo -c -o grub-core/osdep/grub_render_label-init.o `test -f 'grub-core/osdep/init.c' || echo '$(srcdir)/'`grub-core/osdep/init.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_render_label-init.Tpo grub-core/osdep/$(DEPDIR)/grub_render_label-init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/init.c' object='grub-core/osdep/grub_render_label-init.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_render_label_CPPFLAGS) $(CPPFLAGS) $(grub_render_label_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_render_label-init.o `test -f 'grub-core/osdep/init.c' || echo '$(srcdir)/'`grub-core/osdep/init.c grub-core/osdep/grub_render_label-init.obj: grub-core/osdep/init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_render_label_CPPFLAGS) $(CPPFLAGS) $(grub_render_label_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_render_label-init.obj -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_render_label-init.Tpo -c -o grub-core/osdep/grub_render_label-init.obj `if test -f 'grub-core/osdep/init.c'; then $(CYGPATH_W) 'grub-core/osdep/init.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/init.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_render_label-init.Tpo grub-core/osdep/$(DEPDIR)/grub_render_label-init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/init.c' object='grub-core/osdep/grub_render_label-init.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_render_label_CPPFLAGS) $(CPPFLAGS) $(grub_render_label_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_render_label-init.obj `if test -f 'grub-core/osdep/init.c'; then $(CYGPATH_W) 'grub-core/osdep/init.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/init.c'; fi` util/grub_render_label-grub-render-label.o: util/grub-render-label.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_render_label_CPPFLAGS) $(CPPFLAGS) $(grub_render_label_CFLAGS) $(CFLAGS) -MT util/grub_render_label-grub-render-label.o -MD -MP -MF util/$(DEPDIR)/grub_render_label-grub-render-label.Tpo -c -o util/grub_render_label-grub-render-label.o `test -f 'util/grub-render-label.c' || echo '$(srcdir)/'`util/grub-render-label.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_render_label-grub-render-label.Tpo util/$(DEPDIR)/grub_render_label-grub-render-label.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-render-label.c' object='util/grub_render_label-grub-render-label.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_render_label_CPPFLAGS) $(CPPFLAGS) $(grub_render_label_CFLAGS) $(CFLAGS) -c -o util/grub_render_label-grub-render-label.o `test -f 'util/grub-render-label.c' || echo '$(srcdir)/'`util/grub-render-label.c util/grub_render_label-grub-render-label.obj: util/grub-render-label.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_render_label_CPPFLAGS) $(CPPFLAGS) $(grub_render_label_CFLAGS) $(CFLAGS) -MT util/grub_render_label-grub-render-label.obj -MD -MP -MF util/$(DEPDIR)/grub_render_label-grub-render-label.Tpo -c -o util/grub_render_label-grub-render-label.obj `if test -f 'util/grub-render-label.c'; then $(CYGPATH_W) 'util/grub-render-label.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-render-label.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_render_label-grub-render-label.Tpo util/$(DEPDIR)/grub_render_label-grub-render-label.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-render-label.c' object='util/grub_render_label-grub-render-label.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_render_label_CPPFLAGS) $(CPPFLAGS) $(grub_render_label_CFLAGS) $(CFLAGS) -c -o util/grub_render_label-grub-render-label.obj `if test -f 'util/grub-render-label.c'; then $(CYGPATH_W) 'util/grub-render-label.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-render-label.c'; fi` util/grub_render_label-render-label.o: util/render-label.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_render_label_CPPFLAGS) $(CPPFLAGS) $(grub_render_label_CFLAGS) $(CFLAGS) -MT util/grub_render_label-render-label.o -MD -MP -MF util/$(DEPDIR)/grub_render_label-render-label.Tpo -c -o util/grub_render_label-render-label.o `test -f 'util/render-label.c' || echo '$(srcdir)/'`util/render-label.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_render_label-render-label.Tpo util/$(DEPDIR)/grub_render_label-render-label.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/render-label.c' object='util/grub_render_label-render-label.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_render_label_CPPFLAGS) $(CPPFLAGS) $(grub_render_label_CFLAGS) $(CFLAGS) -c -o util/grub_render_label-render-label.o `test -f 'util/render-label.c' || echo '$(srcdir)/'`util/render-label.c util/grub_render_label-render-label.obj: util/render-label.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_render_label_CPPFLAGS) $(CPPFLAGS) $(grub_render_label_CFLAGS) $(CFLAGS) -MT util/grub_render_label-render-label.obj -MD -MP -MF util/$(DEPDIR)/grub_render_label-render-label.Tpo -c -o util/grub_render_label-render-label.obj `if test -f 'util/render-label.c'; then $(CYGPATH_W) 'util/render-label.c'; else $(CYGPATH_W) '$(srcdir)/util/render-label.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_render_label-render-label.Tpo util/$(DEPDIR)/grub_render_label-render-label.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/render-label.c' object='util/grub_render_label-render-label.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_render_label_CPPFLAGS) $(CPPFLAGS) $(grub_render_label_CFLAGS) $(CFLAGS) -c -o util/grub_render_label-render-label.obj `if test -f 'util/render-label.c'; then $(CYGPATH_W) 'util/render-label.c'; else $(CYGPATH_W) '$(srcdir)/util/render-label.c'; fi` grub-core/kern/emu/grub_script_check-argp_common.o: grub-core/kern/emu/argp_common.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_script_check_CPPFLAGS) $(CPPFLAGS) $(grub_script_check_CFLAGS) $(CFLAGS) -MT grub-core/kern/emu/grub_script_check-argp_common.o -MD -MP -MF grub-core/kern/emu/$(DEPDIR)/grub_script_check-argp_common.Tpo -c -o grub-core/kern/emu/grub_script_check-argp_common.o `test -f 'grub-core/kern/emu/argp_common.c' || echo '$(srcdir)/'`grub-core/kern/emu/argp_common.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/emu/$(DEPDIR)/grub_script_check-argp_common.Tpo grub-core/kern/emu/$(DEPDIR)/grub_script_check-argp_common.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/emu/argp_common.c' object='grub-core/kern/emu/grub_script_check-argp_common.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_script_check_CPPFLAGS) $(CPPFLAGS) $(grub_script_check_CFLAGS) $(CFLAGS) -c -o grub-core/kern/emu/grub_script_check-argp_common.o `test -f 'grub-core/kern/emu/argp_common.c' || echo '$(srcdir)/'`grub-core/kern/emu/argp_common.c grub-core/kern/emu/grub_script_check-argp_common.obj: grub-core/kern/emu/argp_common.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_script_check_CPPFLAGS) $(CPPFLAGS) $(grub_script_check_CFLAGS) $(CFLAGS) -MT grub-core/kern/emu/grub_script_check-argp_common.obj -MD -MP -MF grub-core/kern/emu/$(DEPDIR)/grub_script_check-argp_common.Tpo -c -o grub-core/kern/emu/grub_script_check-argp_common.obj `if test -f 'grub-core/kern/emu/argp_common.c'; then $(CYGPATH_W) 'grub-core/kern/emu/argp_common.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/emu/argp_common.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/emu/$(DEPDIR)/grub_script_check-argp_common.Tpo grub-core/kern/emu/$(DEPDIR)/grub_script_check-argp_common.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/emu/argp_common.c' object='grub-core/kern/emu/grub_script_check-argp_common.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_script_check_CPPFLAGS) $(CPPFLAGS) $(grub_script_check_CFLAGS) $(CFLAGS) -c -o grub-core/kern/emu/grub_script_check-argp_common.obj `if test -f 'grub-core/kern/emu/argp_common.c'; then $(CYGPATH_W) 'grub-core/kern/emu/argp_common.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/emu/argp_common.c'; fi` grub-core/osdep/grub_script_check-init.o: grub-core/osdep/init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_script_check_CPPFLAGS) $(CPPFLAGS) $(grub_script_check_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_script_check-init.o -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_script_check-init.Tpo -c -o grub-core/osdep/grub_script_check-init.o `test -f 'grub-core/osdep/init.c' || echo '$(srcdir)/'`grub-core/osdep/init.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_script_check-init.Tpo grub-core/osdep/$(DEPDIR)/grub_script_check-init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/init.c' object='grub-core/osdep/grub_script_check-init.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_script_check_CPPFLAGS) $(CPPFLAGS) $(grub_script_check_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_script_check-init.o `test -f 'grub-core/osdep/init.c' || echo '$(srcdir)/'`grub-core/osdep/init.c grub-core/osdep/grub_script_check-init.obj: grub-core/osdep/init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_script_check_CPPFLAGS) $(CPPFLAGS) $(grub_script_check_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_script_check-init.obj -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_script_check-init.Tpo -c -o grub-core/osdep/grub_script_check-init.obj `if test -f 'grub-core/osdep/init.c'; then $(CYGPATH_W) 'grub-core/osdep/init.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/init.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_script_check-init.Tpo grub-core/osdep/$(DEPDIR)/grub_script_check-init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/init.c' object='grub-core/osdep/grub_script_check-init.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_script_check_CPPFLAGS) $(CPPFLAGS) $(grub_script_check_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_script_check-init.obj `if test -f 'grub-core/osdep/init.c'; then $(CYGPATH_W) 'grub-core/osdep/init.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/init.c'; fi` util/grub_script_check-grub-script-check.o: util/grub-script-check.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_script_check_CPPFLAGS) $(CPPFLAGS) $(grub_script_check_CFLAGS) $(CFLAGS) -MT util/grub_script_check-grub-script-check.o -MD -MP -MF util/$(DEPDIR)/grub_script_check-grub-script-check.Tpo -c -o util/grub_script_check-grub-script-check.o `test -f 'util/grub-script-check.c' || echo '$(srcdir)/'`util/grub-script-check.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_script_check-grub-script-check.Tpo util/$(DEPDIR)/grub_script_check-grub-script-check.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-script-check.c' object='util/grub_script_check-grub-script-check.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_script_check_CPPFLAGS) $(CPPFLAGS) $(grub_script_check_CFLAGS) $(CFLAGS) -c -o util/grub_script_check-grub-script-check.o `test -f 'util/grub-script-check.c' || echo '$(srcdir)/'`util/grub-script-check.c util/grub_script_check-grub-script-check.obj: util/grub-script-check.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_script_check_CPPFLAGS) $(CPPFLAGS) $(grub_script_check_CFLAGS) $(CFLAGS) -MT util/grub_script_check-grub-script-check.obj -MD -MP -MF util/$(DEPDIR)/grub_script_check-grub-script-check.Tpo -c -o util/grub_script_check-grub-script-check.obj `if test -f 'util/grub-script-check.c'; then $(CYGPATH_W) 'util/grub-script-check.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-script-check.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_script_check-grub-script-check.Tpo util/$(DEPDIR)/grub_script_check-grub-script-check.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-script-check.c' object='util/grub_script_check-grub-script-check.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_script_check_CPPFLAGS) $(CPPFLAGS) $(grub_script_check_CFLAGS) $(CFLAGS) -c -o util/grub_script_check-grub-script-check.obj `if test -f 'util/grub-script-check.c'; then $(CYGPATH_W) 'util/grub-script-check.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-script-check.c'; fi` grub-core/kern/emu/grub_sparc64_setup-argp_common.o: grub-core/kern/emu/argp_common.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_sparc64_setup_CPPFLAGS) $(CPPFLAGS) $(grub_sparc64_setup_CFLAGS) $(CFLAGS) -MT grub-core/kern/emu/grub_sparc64_setup-argp_common.o -MD -MP -MF grub-core/kern/emu/$(DEPDIR)/grub_sparc64_setup-argp_common.Tpo -c -o grub-core/kern/emu/grub_sparc64_setup-argp_common.o `test -f 'grub-core/kern/emu/argp_common.c' || echo '$(srcdir)/'`grub-core/kern/emu/argp_common.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/emu/$(DEPDIR)/grub_sparc64_setup-argp_common.Tpo grub-core/kern/emu/$(DEPDIR)/grub_sparc64_setup-argp_common.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/emu/argp_common.c' object='grub-core/kern/emu/grub_sparc64_setup-argp_common.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_sparc64_setup_CPPFLAGS) $(CPPFLAGS) $(grub_sparc64_setup_CFLAGS) $(CFLAGS) -c -o grub-core/kern/emu/grub_sparc64_setup-argp_common.o `test -f 'grub-core/kern/emu/argp_common.c' || echo '$(srcdir)/'`grub-core/kern/emu/argp_common.c grub-core/kern/emu/grub_sparc64_setup-argp_common.obj: grub-core/kern/emu/argp_common.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_sparc64_setup_CPPFLAGS) $(CPPFLAGS) $(grub_sparc64_setup_CFLAGS) $(CFLAGS) -MT grub-core/kern/emu/grub_sparc64_setup-argp_common.obj -MD -MP -MF grub-core/kern/emu/$(DEPDIR)/grub_sparc64_setup-argp_common.Tpo -c -o grub-core/kern/emu/grub_sparc64_setup-argp_common.obj `if test -f 'grub-core/kern/emu/argp_common.c'; then $(CYGPATH_W) 'grub-core/kern/emu/argp_common.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/emu/argp_common.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/emu/$(DEPDIR)/grub_sparc64_setup-argp_common.Tpo grub-core/kern/emu/$(DEPDIR)/grub_sparc64_setup-argp_common.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/emu/argp_common.c' object='grub-core/kern/emu/grub_sparc64_setup-argp_common.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_sparc64_setup_CPPFLAGS) $(CPPFLAGS) $(grub_sparc64_setup_CFLAGS) $(CFLAGS) -c -o grub-core/kern/emu/grub_sparc64_setup-argp_common.obj `if test -f 'grub-core/kern/emu/argp_common.c'; then $(CYGPATH_W) 'grub-core/kern/emu/argp_common.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/emu/argp_common.c'; fi` grub-core/lib/grub_sparc64_setup-reed_solomon.o: grub-core/lib/reed_solomon.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_sparc64_setup_CPPFLAGS) $(CPPFLAGS) $(grub_sparc64_setup_CFLAGS) $(CFLAGS) -MT grub-core/lib/grub_sparc64_setup-reed_solomon.o -MD -MP -MF grub-core/lib/$(DEPDIR)/grub_sparc64_setup-reed_solomon.Tpo -c -o grub-core/lib/grub_sparc64_setup-reed_solomon.o `test -f 'grub-core/lib/reed_solomon.c' || echo '$(srcdir)/'`grub-core/lib/reed_solomon.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/$(DEPDIR)/grub_sparc64_setup-reed_solomon.Tpo grub-core/lib/$(DEPDIR)/grub_sparc64_setup-reed_solomon.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/reed_solomon.c' object='grub-core/lib/grub_sparc64_setup-reed_solomon.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_sparc64_setup_CPPFLAGS) $(CPPFLAGS) $(grub_sparc64_setup_CFLAGS) $(CFLAGS) -c -o grub-core/lib/grub_sparc64_setup-reed_solomon.o `test -f 'grub-core/lib/reed_solomon.c' || echo '$(srcdir)/'`grub-core/lib/reed_solomon.c grub-core/lib/grub_sparc64_setup-reed_solomon.obj: grub-core/lib/reed_solomon.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_sparc64_setup_CPPFLAGS) $(CPPFLAGS) $(grub_sparc64_setup_CFLAGS) $(CFLAGS) -MT grub-core/lib/grub_sparc64_setup-reed_solomon.obj -MD -MP -MF grub-core/lib/$(DEPDIR)/grub_sparc64_setup-reed_solomon.Tpo -c -o grub-core/lib/grub_sparc64_setup-reed_solomon.obj `if test -f 'grub-core/lib/reed_solomon.c'; then $(CYGPATH_W) 'grub-core/lib/reed_solomon.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/reed_solomon.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/$(DEPDIR)/grub_sparc64_setup-reed_solomon.Tpo grub-core/lib/$(DEPDIR)/grub_sparc64_setup-reed_solomon.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/reed_solomon.c' object='grub-core/lib/grub_sparc64_setup-reed_solomon.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_sparc64_setup_CPPFLAGS) $(CPPFLAGS) $(grub_sparc64_setup_CFLAGS) $(CFLAGS) -c -o grub-core/lib/grub_sparc64_setup-reed_solomon.obj `if test -f 'grub-core/lib/reed_solomon.c'; then $(CYGPATH_W) 'grub-core/lib/reed_solomon.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/reed_solomon.c'; fi` grub-core/osdep/grub_sparc64_setup-blocklist.o: grub-core/osdep/blocklist.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_sparc64_setup_CPPFLAGS) $(CPPFLAGS) $(grub_sparc64_setup_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_sparc64_setup-blocklist.o -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_sparc64_setup-blocklist.Tpo -c -o grub-core/osdep/grub_sparc64_setup-blocklist.o `test -f 'grub-core/osdep/blocklist.c' || echo '$(srcdir)/'`grub-core/osdep/blocklist.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_sparc64_setup-blocklist.Tpo grub-core/osdep/$(DEPDIR)/grub_sparc64_setup-blocklist.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/blocklist.c' object='grub-core/osdep/grub_sparc64_setup-blocklist.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_sparc64_setup_CPPFLAGS) $(CPPFLAGS) $(grub_sparc64_setup_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_sparc64_setup-blocklist.o `test -f 'grub-core/osdep/blocklist.c' || echo '$(srcdir)/'`grub-core/osdep/blocklist.c grub-core/osdep/grub_sparc64_setup-blocklist.obj: grub-core/osdep/blocklist.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_sparc64_setup_CPPFLAGS) $(CPPFLAGS) $(grub_sparc64_setup_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_sparc64_setup-blocklist.obj -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_sparc64_setup-blocklist.Tpo -c -o grub-core/osdep/grub_sparc64_setup-blocklist.obj `if test -f 'grub-core/osdep/blocklist.c'; then $(CYGPATH_W) 'grub-core/osdep/blocklist.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/blocklist.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_sparc64_setup-blocklist.Tpo grub-core/osdep/$(DEPDIR)/grub_sparc64_setup-blocklist.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/blocklist.c' object='grub-core/osdep/grub_sparc64_setup-blocklist.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_sparc64_setup_CPPFLAGS) $(CPPFLAGS) $(grub_sparc64_setup_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_sparc64_setup-blocklist.obj `if test -f 'grub-core/osdep/blocklist.c'; then $(CYGPATH_W) 'grub-core/osdep/blocklist.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/blocklist.c'; fi` grub-core/osdep/grub_sparc64_setup-init.o: grub-core/osdep/init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_sparc64_setup_CPPFLAGS) $(CPPFLAGS) $(grub_sparc64_setup_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_sparc64_setup-init.o -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_sparc64_setup-init.Tpo -c -o grub-core/osdep/grub_sparc64_setup-init.o `test -f 'grub-core/osdep/init.c' || echo '$(srcdir)/'`grub-core/osdep/init.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_sparc64_setup-init.Tpo grub-core/osdep/$(DEPDIR)/grub_sparc64_setup-init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/init.c' object='grub-core/osdep/grub_sparc64_setup-init.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_sparc64_setup_CPPFLAGS) $(CPPFLAGS) $(grub_sparc64_setup_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_sparc64_setup-init.o `test -f 'grub-core/osdep/init.c' || echo '$(srcdir)/'`grub-core/osdep/init.c grub-core/osdep/grub_sparc64_setup-init.obj: grub-core/osdep/init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_sparc64_setup_CPPFLAGS) $(CPPFLAGS) $(grub_sparc64_setup_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_sparc64_setup-init.obj -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_sparc64_setup-init.Tpo -c -o grub-core/osdep/grub_sparc64_setup-init.obj `if test -f 'grub-core/osdep/init.c'; then $(CYGPATH_W) 'grub-core/osdep/init.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/init.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_sparc64_setup-init.Tpo grub-core/osdep/$(DEPDIR)/grub_sparc64_setup-init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/init.c' object='grub-core/osdep/grub_sparc64_setup-init.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_sparc64_setup_CPPFLAGS) $(CPPFLAGS) $(grub_sparc64_setup_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_sparc64_setup-init.obj `if test -f 'grub-core/osdep/init.c'; then $(CYGPATH_W) 'grub-core/osdep/init.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/init.c'; fi` grub-core/osdep/grub_sparc64_setup-ofpath.o: grub-core/osdep/ofpath.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_sparc64_setup_CPPFLAGS) $(CPPFLAGS) $(grub_sparc64_setup_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_sparc64_setup-ofpath.o -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_sparc64_setup-ofpath.Tpo -c -o grub-core/osdep/grub_sparc64_setup-ofpath.o `test -f 'grub-core/osdep/ofpath.c' || echo '$(srcdir)/'`grub-core/osdep/ofpath.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_sparc64_setup-ofpath.Tpo grub-core/osdep/$(DEPDIR)/grub_sparc64_setup-ofpath.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/ofpath.c' object='grub-core/osdep/grub_sparc64_setup-ofpath.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_sparc64_setup_CPPFLAGS) $(CPPFLAGS) $(grub_sparc64_setup_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_sparc64_setup-ofpath.o `test -f 'grub-core/osdep/ofpath.c' || echo '$(srcdir)/'`grub-core/osdep/ofpath.c grub-core/osdep/grub_sparc64_setup-ofpath.obj: grub-core/osdep/ofpath.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_sparc64_setup_CPPFLAGS) $(CPPFLAGS) $(grub_sparc64_setup_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_sparc64_setup-ofpath.obj -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_sparc64_setup-ofpath.Tpo -c -o grub-core/osdep/grub_sparc64_setup-ofpath.obj `if test -f 'grub-core/osdep/ofpath.c'; then $(CYGPATH_W) 'grub-core/osdep/ofpath.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/ofpath.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_sparc64_setup-ofpath.Tpo grub-core/osdep/$(DEPDIR)/grub_sparc64_setup-ofpath.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/ofpath.c' object='grub-core/osdep/grub_sparc64_setup-ofpath.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_sparc64_setup_CPPFLAGS) $(CPPFLAGS) $(grub_sparc64_setup_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_sparc64_setup-ofpath.obj `if test -f 'grub-core/osdep/ofpath.c'; then $(CYGPATH_W) 'grub-core/osdep/ofpath.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/ofpath.c'; fi` util/grub_sparc64_setup-grub-setup.o: util/grub-setup.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_sparc64_setup_CPPFLAGS) $(CPPFLAGS) $(grub_sparc64_setup_CFLAGS) $(CFLAGS) -MT util/grub_sparc64_setup-grub-setup.o -MD -MP -MF util/$(DEPDIR)/grub_sparc64_setup-grub-setup.Tpo -c -o util/grub_sparc64_setup-grub-setup.o `test -f 'util/grub-setup.c' || echo '$(srcdir)/'`util/grub-setup.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_sparc64_setup-grub-setup.Tpo util/$(DEPDIR)/grub_sparc64_setup-grub-setup.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-setup.c' object='util/grub_sparc64_setup-grub-setup.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_sparc64_setup_CPPFLAGS) $(CPPFLAGS) $(grub_sparc64_setup_CFLAGS) $(CFLAGS) -c -o util/grub_sparc64_setup-grub-setup.o `test -f 'util/grub-setup.c' || echo '$(srcdir)/'`util/grub-setup.c util/grub_sparc64_setup-grub-setup.obj: util/grub-setup.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_sparc64_setup_CPPFLAGS) $(CPPFLAGS) $(grub_sparc64_setup_CFLAGS) $(CFLAGS) -MT util/grub_sparc64_setup-grub-setup.obj -MD -MP -MF util/$(DEPDIR)/grub_sparc64_setup-grub-setup.Tpo -c -o util/grub_sparc64_setup-grub-setup.obj `if test -f 'util/grub-setup.c'; then $(CYGPATH_W) 'util/grub-setup.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-setup.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_sparc64_setup-grub-setup.Tpo util/$(DEPDIR)/grub_sparc64_setup-grub-setup.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-setup.c' object='util/grub_sparc64_setup-grub-setup.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_sparc64_setup_CPPFLAGS) $(CPPFLAGS) $(grub_sparc64_setup_CFLAGS) $(CFLAGS) -c -o util/grub_sparc64_setup-grub-setup.obj `if test -f 'util/grub-setup.c'; then $(CYGPATH_W) 'util/grub-setup.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-setup.c'; fi` util/grub_sparc64_setup-setup_sparc.o: util/setup_sparc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_sparc64_setup_CPPFLAGS) $(CPPFLAGS) $(grub_sparc64_setup_CFLAGS) $(CFLAGS) -MT util/grub_sparc64_setup-setup_sparc.o -MD -MP -MF util/$(DEPDIR)/grub_sparc64_setup-setup_sparc.Tpo -c -o util/grub_sparc64_setup-setup_sparc.o `test -f 'util/setup_sparc.c' || echo '$(srcdir)/'`util/setup_sparc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_sparc64_setup-setup_sparc.Tpo util/$(DEPDIR)/grub_sparc64_setup-setup_sparc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/setup_sparc.c' object='util/grub_sparc64_setup-setup_sparc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_sparc64_setup_CPPFLAGS) $(CPPFLAGS) $(grub_sparc64_setup_CFLAGS) $(CFLAGS) -c -o util/grub_sparc64_setup-setup_sparc.o `test -f 'util/setup_sparc.c' || echo '$(srcdir)/'`util/setup_sparc.c util/grub_sparc64_setup-setup_sparc.obj: util/setup_sparc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_sparc64_setup_CPPFLAGS) $(CPPFLAGS) $(grub_sparc64_setup_CFLAGS) $(CFLAGS) -MT util/grub_sparc64_setup-setup_sparc.obj -MD -MP -MF util/$(DEPDIR)/grub_sparc64_setup-setup_sparc.Tpo -c -o util/grub_sparc64_setup-setup_sparc.obj `if test -f 'util/setup_sparc.c'; then $(CYGPATH_W) 'util/setup_sparc.c'; else $(CYGPATH_W) '$(srcdir)/util/setup_sparc.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_sparc64_setup-setup_sparc.Tpo util/$(DEPDIR)/grub_sparc64_setup-setup_sparc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/setup_sparc.c' object='util/grub_sparc64_setup-setup_sparc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_sparc64_setup_CPPFLAGS) $(CPPFLAGS) $(grub_sparc64_setup_CFLAGS) $(CFLAGS) -c -o util/grub_sparc64_setup-setup_sparc.obj `if test -f 'util/setup_sparc.c'; then $(CYGPATH_W) 'util/setup_sparc.c'; else $(CYGPATH_W) '$(srcdir)/util/setup_sparc.c'; fi` grub-core/disk/grub_syslinux2cfg-host.o: grub-core/disk/host.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_syslinux2cfg_CPPFLAGS) $(CPPFLAGS) $(grub_syslinux2cfg_CFLAGS) $(CFLAGS) -MT grub-core/disk/grub_syslinux2cfg-host.o -MD -MP -MF grub-core/disk/$(DEPDIR)/grub_syslinux2cfg-host.Tpo -c -o grub-core/disk/grub_syslinux2cfg-host.o `test -f 'grub-core/disk/host.c' || echo '$(srcdir)/'`grub-core/disk/host.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/disk/$(DEPDIR)/grub_syslinux2cfg-host.Tpo grub-core/disk/$(DEPDIR)/grub_syslinux2cfg-host.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/disk/host.c' object='grub-core/disk/grub_syslinux2cfg-host.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_syslinux2cfg_CPPFLAGS) $(CPPFLAGS) $(grub_syslinux2cfg_CFLAGS) $(CFLAGS) -c -o grub-core/disk/grub_syslinux2cfg-host.o `test -f 'grub-core/disk/host.c' || echo '$(srcdir)/'`grub-core/disk/host.c grub-core/disk/grub_syslinux2cfg-host.obj: grub-core/disk/host.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_syslinux2cfg_CPPFLAGS) $(CPPFLAGS) $(grub_syslinux2cfg_CFLAGS) $(CFLAGS) -MT grub-core/disk/grub_syslinux2cfg-host.obj -MD -MP -MF grub-core/disk/$(DEPDIR)/grub_syslinux2cfg-host.Tpo -c -o grub-core/disk/grub_syslinux2cfg-host.obj `if test -f 'grub-core/disk/host.c'; then $(CYGPATH_W) 'grub-core/disk/host.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/disk/host.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/disk/$(DEPDIR)/grub_syslinux2cfg-host.Tpo grub-core/disk/$(DEPDIR)/grub_syslinux2cfg-host.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/disk/host.c' object='grub-core/disk/grub_syslinux2cfg-host.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_syslinux2cfg_CPPFLAGS) $(CPPFLAGS) $(grub_syslinux2cfg_CFLAGS) $(CFLAGS) -c -o grub-core/disk/grub_syslinux2cfg-host.obj `if test -f 'grub-core/disk/host.c'; then $(CYGPATH_W) 'grub-core/disk/host.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/disk/host.c'; fi` grub-core/kern/emu/grub_syslinux2cfg-argp_common.o: grub-core/kern/emu/argp_common.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_syslinux2cfg_CPPFLAGS) $(CPPFLAGS) $(grub_syslinux2cfg_CFLAGS) $(CFLAGS) -MT grub-core/kern/emu/grub_syslinux2cfg-argp_common.o -MD -MP -MF grub-core/kern/emu/$(DEPDIR)/grub_syslinux2cfg-argp_common.Tpo -c -o grub-core/kern/emu/grub_syslinux2cfg-argp_common.o `test -f 'grub-core/kern/emu/argp_common.c' || echo '$(srcdir)/'`grub-core/kern/emu/argp_common.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/emu/$(DEPDIR)/grub_syslinux2cfg-argp_common.Tpo grub-core/kern/emu/$(DEPDIR)/grub_syslinux2cfg-argp_common.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/emu/argp_common.c' object='grub-core/kern/emu/grub_syslinux2cfg-argp_common.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_syslinux2cfg_CPPFLAGS) $(CPPFLAGS) $(grub_syslinux2cfg_CFLAGS) $(CFLAGS) -c -o grub-core/kern/emu/grub_syslinux2cfg-argp_common.o `test -f 'grub-core/kern/emu/argp_common.c' || echo '$(srcdir)/'`grub-core/kern/emu/argp_common.c grub-core/kern/emu/grub_syslinux2cfg-argp_common.obj: grub-core/kern/emu/argp_common.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_syslinux2cfg_CPPFLAGS) $(CPPFLAGS) $(grub_syslinux2cfg_CFLAGS) $(CFLAGS) -MT grub-core/kern/emu/grub_syslinux2cfg-argp_common.obj -MD -MP -MF grub-core/kern/emu/$(DEPDIR)/grub_syslinux2cfg-argp_common.Tpo -c -o grub-core/kern/emu/grub_syslinux2cfg-argp_common.obj `if test -f 'grub-core/kern/emu/argp_common.c'; then $(CYGPATH_W) 'grub-core/kern/emu/argp_common.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/emu/argp_common.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/emu/$(DEPDIR)/grub_syslinux2cfg-argp_common.Tpo grub-core/kern/emu/$(DEPDIR)/grub_syslinux2cfg-argp_common.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/emu/argp_common.c' object='grub-core/kern/emu/grub_syslinux2cfg-argp_common.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_syslinux2cfg_CPPFLAGS) $(CPPFLAGS) $(grub_syslinux2cfg_CFLAGS) $(CFLAGS) -c -o grub-core/kern/emu/grub_syslinux2cfg-argp_common.obj `if test -f 'grub-core/kern/emu/argp_common.c'; then $(CYGPATH_W) 'grub-core/kern/emu/argp_common.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/emu/argp_common.c'; fi` grub-core/kern/emu/grub_syslinux2cfg-hostfs.o: grub-core/kern/emu/hostfs.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_syslinux2cfg_CPPFLAGS) $(CPPFLAGS) $(grub_syslinux2cfg_CFLAGS) $(CFLAGS) -MT grub-core/kern/emu/grub_syslinux2cfg-hostfs.o -MD -MP -MF grub-core/kern/emu/$(DEPDIR)/grub_syslinux2cfg-hostfs.Tpo -c -o grub-core/kern/emu/grub_syslinux2cfg-hostfs.o `test -f 'grub-core/kern/emu/hostfs.c' || echo '$(srcdir)/'`grub-core/kern/emu/hostfs.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/emu/$(DEPDIR)/grub_syslinux2cfg-hostfs.Tpo grub-core/kern/emu/$(DEPDIR)/grub_syslinux2cfg-hostfs.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/emu/hostfs.c' object='grub-core/kern/emu/grub_syslinux2cfg-hostfs.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_syslinux2cfg_CPPFLAGS) $(CPPFLAGS) $(grub_syslinux2cfg_CFLAGS) $(CFLAGS) -c -o grub-core/kern/emu/grub_syslinux2cfg-hostfs.o `test -f 'grub-core/kern/emu/hostfs.c' || echo '$(srcdir)/'`grub-core/kern/emu/hostfs.c grub-core/kern/emu/grub_syslinux2cfg-hostfs.obj: grub-core/kern/emu/hostfs.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_syslinux2cfg_CPPFLAGS) $(CPPFLAGS) $(grub_syslinux2cfg_CFLAGS) $(CFLAGS) -MT grub-core/kern/emu/grub_syslinux2cfg-hostfs.obj -MD -MP -MF grub-core/kern/emu/$(DEPDIR)/grub_syslinux2cfg-hostfs.Tpo -c -o grub-core/kern/emu/grub_syslinux2cfg-hostfs.obj `if test -f 'grub-core/kern/emu/hostfs.c'; then $(CYGPATH_W) 'grub-core/kern/emu/hostfs.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/emu/hostfs.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/emu/$(DEPDIR)/grub_syslinux2cfg-hostfs.Tpo grub-core/kern/emu/$(DEPDIR)/grub_syslinux2cfg-hostfs.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/emu/hostfs.c' object='grub-core/kern/emu/grub_syslinux2cfg-hostfs.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_syslinux2cfg_CPPFLAGS) $(CPPFLAGS) $(grub_syslinux2cfg_CFLAGS) $(CFLAGS) -c -o grub-core/kern/emu/grub_syslinux2cfg-hostfs.obj `if test -f 'grub-core/kern/emu/hostfs.c'; then $(CYGPATH_W) 'grub-core/kern/emu/hostfs.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/emu/hostfs.c'; fi` grub-core/lib/grub_syslinux2cfg-getline.o: grub-core/lib/getline.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_syslinux2cfg_CPPFLAGS) $(CPPFLAGS) $(grub_syslinux2cfg_CFLAGS) $(CFLAGS) -MT grub-core/lib/grub_syslinux2cfg-getline.o -MD -MP -MF grub-core/lib/$(DEPDIR)/grub_syslinux2cfg-getline.Tpo -c -o grub-core/lib/grub_syslinux2cfg-getline.o `test -f 'grub-core/lib/getline.c' || echo '$(srcdir)/'`grub-core/lib/getline.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/$(DEPDIR)/grub_syslinux2cfg-getline.Tpo grub-core/lib/$(DEPDIR)/grub_syslinux2cfg-getline.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/getline.c' object='grub-core/lib/grub_syslinux2cfg-getline.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_syslinux2cfg_CPPFLAGS) $(CPPFLAGS) $(grub_syslinux2cfg_CFLAGS) $(CFLAGS) -c -o grub-core/lib/grub_syslinux2cfg-getline.o `test -f 'grub-core/lib/getline.c' || echo '$(srcdir)/'`grub-core/lib/getline.c grub-core/lib/grub_syslinux2cfg-getline.obj: grub-core/lib/getline.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_syslinux2cfg_CPPFLAGS) $(CPPFLAGS) $(grub_syslinux2cfg_CFLAGS) $(CFLAGS) -MT grub-core/lib/grub_syslinux2cfg-getline.obj -MD -MP -MF grub-core/lib/$(DEPDIR)/grub_syslinux2cfg-getline.Tpo -c -o grub-core/lib/grub_syslinux2cfg-getline.obj `if test -f 'grub-core/lib/getline.c'; then $(CYGPATH_W) 'grub-core/lib/getline.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/getline.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/$(DEPDIR)/grub_syslinux2cfg-getline.Tpo grub-core/lib/$(DEPDIR)/grub_syslinux2cfg-getline.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/getline.c' object='grub-core/lib/grub_syslinux2cfg-getline.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_syslinux2cfg_CPPFLAGS) $(CPPFLAGS) $(grub_syslinux2cfg_CFLAGS) $(CFLAGS) -c -o grub-core/lib/grub_syslinux2cfg-getline.obj `if test -f 'grub-core/lib/getline.c'; then $(CYGPATH_W) 'grub-core/lib/getline.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/getline.c'; fi` grub-core/lib/grub_syslinux2cfg-syslinux_parse.o: grub-core/lib/syslinux_parse.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_syslinux2cfg_CPPFLAGS) $(CPPFLAGS) $(grub_syslinux2cfg_CFLAGS) $(CFLAGS) -MT grub-core/lib/grub_syslinux2cfg-syslinux_parse.o -MD -MP -MF grub-core/lib/$(DEPDIR)/grub_syslinux2cfg-syslinux_parse.Tpo -c -o grub-core/lib/grub_syslinux2cfg-syslinux_parse.o `test -f 'grub-core/lib/syslinux_parse.c' || echo '$(srcdir)/'`grub-core/lib/syslinux_parse.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/$(DEPDIR)/grub_syslinux2cfg-syslinux_parse.Tpo grub-core/lib/$(DEPDIR)/grub_syslinux2cfg-syslinux_parse.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/syslinux_parse.c' object='grub-core/lib/grub_syslinux2cfg-syslinux_parse.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_syslinux2cfg_CPPFLAGS) $(CPPFLAGS) $(grub_syslinux2cfg_CFLAGS) $(CFLAGS) -c -o grub-core/lib/grub_syslinux2cfg-syslinux_parse.o `test -f 'grub-core/lib/syslinux_parse.c' || echo '$(srcdir)/'`grub-core/lib/syslinux_parse.c grub-core/lib/grub_syslinux2cfg-syslinux_parse.obj: grub-core/lib/syslinux_parse.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_syslinux2cfg_CPPFLAGS) $(CPPFLAGS) $(grub_syslinux2cfg_CFLAGS) $(CFLAGS) -MT grub-core/lib/grub_syslinux2cfg-syslinux_parse.obj -MD -MP -MF grub-core/lib/$(DEPDIR)/grub_syslinux2cfg-syslinux_parse.Tpo -c -o grub-core/lib/grub_syslinux2cfg-syslinux_parse.obj `if test -f 'grub-core/lib/syslinux_parse.c'; then $(CYGPATH_W) 'grub-core/lib/syslinux_parse.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/syslinux_parse.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/$(DEPDIR)/grub_syslinux2cfg-syslinux_parse.Tpo grub-core/lib/$(DEPDIR)/grub_syslinux2cfg-syslinux_parse.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/syslinux_parse.c' object='grub-core/lib/grub_syslinux2cfg-syslinux_parse.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_syslinux2cfg_CPPFLAGS) $(CPPFLAGS) $(grub_syslinux2cfg_CFLAGS) $(CFLAGS) -c -o grub-core/lib/grub_syslinux2cfg-syslinux_parse.obj `if test -f 'grub-core/lib/syslinux_parse.c'; then $(CYGPATH_W) 'grub-core/lib/syslinux_parse.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/syslinux_parse.c'; fi` grub-core/osdep/grub_syslinux2cfg-init.o: grub-core/osdep/init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_syslinux2cfg_CPPFLAGS) $(CPPFLAGS) $(grub_syslinux2cfg_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_syslinux2cfg-init.o -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_syslinux2cfg-init.Tpo -c -o grub-core/osdep/grub_syslinux2cfg-init.o `test -f 'grub-core/osdep/init.c' || echo '$(srcdir)/'`grub-core/osdep/init.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_syslinux2cfg-init.Tpo grub-core/osdep/$(DEPDIR)/grub_syslinux2cfg-init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/init.c' object='grub-core/osdep/grub_syslinux2cfg-init.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_syslinux2cfg_CPPFLAGS) $(CPPFLAGS) $(grub_syslinux2cfg_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_syslinux2cfg-init.o `test -f 'grub-core/osdep/init.c' || echo '$(srcdir)/'`grub-core/osdep/init.c grub-core/osdep/grub_syslinux2cfg-init.obj: grub-core/osdep/init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_syslinux2cfg_CPPFLAGS) $(CPPFLAGS) $(grub_syslinux2cfg_CFLAGS) $(CFLAGS) -MT grub-core/osdep/grub_syslinux2cfg-init.obj -MD -MP -MF grub-core/osdep/$(DEPDIR)/grub_syslinux2cfg-init.Tpo -c -o grub-core/osdep/grub_syslinux2cfg-init.obj `if test -f 'grub-core/osdep/init.c'; then $(CYGPATH_W) 'grub-core/osdep/init.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/init.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/osdep/$(DEPDIR)/grub_syslinux2cfg-init.Tpo grub-core/osdep/$(DEPDIR)/grub_syslinux2cfg-init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/osdep/init.c' object='grub-core/osdep/grub_syslinux2cfg-init.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_syslinux2cfg_CPPFLAGS) $(CPPFLAGS) $(grub_syslinux2cfg_CFLAGS) $(CFLAGS) -c -o grub-core/osdep/grub_syslinux2cfg-init.obj `if test -f 'grub-core/osdep/init.c'; then $(CYGPATH_W) 'grub-core/osdep/init.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/osdep/init.c'; fi` util/grub_syslinux2cfg-grub-syslinux2cfg.o: util/grub-syslinux2cfg.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_syslinux2cfg_CPPFLAGS) $(CPPFLAGS) $(grub_syslinux2cfg_CFLAGS) $(CFLAGS) -MT util/grub_syslinux2cfg-grub-syslinux2cfg.o -MD -MP -MF util/$(DEPDIR)/grub_syslinux2cfg-grub-syslinux2cfg.Tpo -c -o util/grub_syslinux2cfg-grub-syslinux2cfg.o `test -f 'util/grub-syslinux2cfg.c' || echo '$(srcdir)/'`util/grub-syslinux2cfg.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_syslinux2cfg-grub-syslinux2cfg.Tpo util/$(DEPDIR)/grub_syslinux2cfg-grub-syslinux2cfg.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-syslinux2cfg.c' object='util/grub_syslinux2cfg-grub-syslinux2cfg.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_syslinux2cfg_CPPFLAGS) $(CPPFLAGS) $(grub_syslinux2cfg_CFLAGS) $(CFLAGS) -c -o util/grub_syslinux2cfg-grub-syslinux2cfg.o `test -f 'util/grub-syslinux2cfg.c' || echo '$(srcdir)/'`util/grub-syslinux2cfg.c util/grub_syslinux2cfg-grub-syslinux2cfg.obj: util/grub-syslinux2cfg.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_syslinux2cfg_CPPFLAGS) $(CPPFLAGS) $(grub_syslinux2cfg_CFLAGS) $(CFLAGS) -MT util/grub_syslinux2cfg-grub-syslinux2cfg.obj -MD -MP -MF util/$(DEPDIR)/grub_syslinux2cfg-grub-syslinux2cfg.Tpo -c -o util/grub_syslinux2cfg-grub-syslinux2cfg.obj `if test -f 'util/grub-syslinux2cfg.c'; then $(CYGPATH_W) 'util/grub-syslinux2cfg.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-syslinux2cfg.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/grub_syslinux2cfg-grub-syslinux2cfg.Tpo util/$(DEPDIR)/grub_syslinux2cfg-grub-syslinux2cfg.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/grub-syslinux2cfg.c' object='util/grub_syslinux2cfg-grub-syslinux2cfg.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_syslinux2cfg_CPPFLAGS) $(CPPFLAGS) $(grub_syslinux2cfg_CFLAGS) $(CFLAGS) -c -o util/grub_syslinux2cfg-grub-syslinux2cfg.obj `if test -f 'util/grub-syslinux2cfg.c'; then $(CYGPATH_W) 'util/grub-syslinux2cfg.c'; else $(CYGPATH_W) '$(srcdir)/util/grub-syslinux2cfg.c'; fi` grub-core/kern/printf_test-list.o: grub-core/kern/list.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(printf_test_CPPFLAGS) $(CPPFLAGS) $(printf_test_CFLAGS) $(CFLAGS) -MT grub-core/kern/printf_test-list.o -MD -MP -MF grub-core/kern/$(DEPDIR)/printf_test-list.Tpo -c -o grub-core/kern/printf_test-list.o `test -f 'grub-core/kern/list.c' || echo '$(srcdir)/'`grub-core/kern/list.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/$(DEPDIR)/printf_test-list.Tpo grub-core/kern/$(DEPDIR)/printf_test-list.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/list.c' object='grub-core/kern/printf_test-list.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(printf_test_CPPFLAGS) $(CPPFLAGS) $(printf_test_CFLAGS) $(CFLAGS) -c -o grub-core/kern/printf_test-list.o `test -f 'grub-core/kern/list.c' || echo '$(srcdir)/'`grub-core/kern/list.c grub-core/kern/printf_test-list.obj: grub-core/kern/list.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(printf_test_CPPFLAGS) $(CPPFLAGS) $(printf_test_CFLAGS) $(CFLAGS) -MT grub-core/kern/printf_test-list.obj -MD -MP -MF grub-core/kern/$(DEPDIR)/printf_test-list.Tpo -c -o grub-core/kern/printf_test-list.obj `if test -f 'grub-core/kern/list.c'; then $(CYGPATH_W) 'grub-core/kern/list.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/list.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/$(DEPDIR)/printf_test-list.Tpo grub-core/kern/$(DEPDIR)/printf_test-list.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/list.c' object='grub-core/kern/printf_test-list.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(printf_test_CPPFLAGS) $(CPPFLAGS) $(printf_test_CFLAGS) $(CFLAGS) -c -o grub-core/kern/printf_test-list.obj `if test -f 'grub-core/kern/list.c'; then $(CYGPATH_W) 'grub-core/kern/list.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/list.c'; fi` grub-core/kern/printf_test-misc.o: grub-core/kern/misc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(printf_test_CPPFLAGS) $(CPPFLAGS) $(printf_test_CFLAGS) $(CFLAGS) -MT grub-core/kern/printf_test-misc.o -MD -MP -MF grub-core/kern/$(DEPDIR)/printf_test-misc.Tpo -c -o grub-core/kern/printf_test-misc.o `test -f 'grub-core/kern/misc.c' || echo '$(srcdir)/'`grub-core/kern/misc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/$(DEPDIR)/printf_test-misc.Tpo grub-core/kern/$(DEPDIR)/printf_test-misc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/misc.c' object='grub-core/kern/printf_test-misc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(printf_test_CPPFLAGS) $(CPPFLAGS) $(printf_test_CFLAGS) $(CFLAGS) -c -o grub-core/kern/printf_test-misc.o `test -f 'grub-core/kern/misc.c' || echo '$(srcdir)/'`grub-core/kern/misc.c grub-core/kern/printf_test-misc.obj: grub-core/kern/misc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(printf_test_CPPFLAGS) $(CPPFLAGS) $(printf_test_CFLAGS) $(CFLAGS) -MT grub-core/kern/printf_test-misc.obj -MD -MP -MF grub-core/kern/$(DEPDIR)/printf_test-misc.Tpo -c -o grub-core/kern/printf_test-misc.obj `if test -f 'grub-core/kern/misc.c'; then $(CYGPATH_W) 'grub-core/kern/misc.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/misc.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/$(DEPDIR)/printf_test-misc.Tpo grub-core/kern/$(DEPDIR)/printf_test-misc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/misc.c' object='grub-core/kern/printf_test-misc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(printf_test_CPPFLAGS) $(CPPFLAGS) $(printf_test_CFLAGS) $(CFLAGS) -c -o grub-core/kern/printf_test-misc.obj `if test -f 'grub-core/kern/misc.c'; then $(CYGPATH_W) 'grub-core/kern/misc.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/misc.c'; fi` grub-core/tests/lib/printf_test-test.o: grub-core/tests/lib/test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(printf_test_CPPFLAGS) $(CPPFLAGS) $(printf_test_CFLAGS) $(CFLAGS) -MT grub-core/tests/lib/printf_test-test.o -MD -MP -MF grub-core/tests/lib/$(DEPDIR)/printf_test-test.Tpo -c -o grub-core/tests/lib/printf_test-test.o `test -f 'grub-core/tests/lib/test.c' || echo '$(srcdir)/'`grub-core/tests/lib/test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/tests/lib/$(DEPDIR)/printf_test-test.Tpo grub-core/tests/lib/$(DEPDIR)/printf_test-test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/tests/lib/test.c' object='grub-core/tests/lib/printf_test-test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(printf_test_CPPFLAGS) $(CPPFLAGS) $(printf_test_CFLAGS) $(CFLAGS) -c -o grub-core/tests/lib/printf_test-test.o `test -f 'grub-core/tests/lib/test.c' || echo '$(srcdir)/'`grub-core/tests/lib/test.c grub-core/tests/lib/printf_test-test.obj: grub-core/tests/lib/test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(printf_test_CPPFLAGS) $(CPPFLAGS) $(printf_test_CFLAGS) $(CFLAGS) -MT grub-core/tests/lib/printf_test-test.obj -MD -MP -MF grub-core/tests/lib/$(DEPDIR)/printf_test-test.Tpo -c -o grub-core/tests/lib/printf_test-test.obj `if test -f 'grub-core/tests/lib/test.c'; then $(CYGPATH_W) 'grub-core/tests/lib/test.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/tests/lib/test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/tests/lib/$(DEPDIR)/printf_test-test.Tpo grub-core/tests/lib/$(DEPDIR)/printf_test-test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/tests/lib/test.c' object='grub-core/tests/lib/printf_test-test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(printf_test_CPPFLAGS) $(CPPFLAGS) $(printf_test_CFLAGS) $(CFLAGS) -c -o grub-core/tests/lib/printf_test-test.obj `if test -f 'grub-core/tests/lib/test.c'; then $(CYGPATH_W) 'grub-core/tests/lib/test.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/tests/lib/test.c'; fi` tests/lib/printf_test-unit_test.o: tests/lib/unit_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(printf_test_CPPFLAGS) $(CPPFLAGS) $(printf_test_CFLAGS) $(CFLAGS) -MT tests/lib/printf_test-unit_test.o -MD -MP -MF tests/lib/$(DEPDIR)/printf_test-unit_test.Tpo -c -o tests/lib/printf_test-unit_test.o `test -f 'tests/lib/unit_test.c' || echo '$(srcdir)/'`tests/lib/unit_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/lib/$(DEPDIR)/printf_test-unit_test.Tpo tests/lib/$(DEPDIR)/printf_test-unit_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/lib/unit_test.c' object='tests/lib/printf_test-unit_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(printf_test_CPPFLAGS) $(CPPFLAGS) $(printf_test_CFLAGS) $(CFLAGS) -c -o tests/lib/printf_test-unit_test.o `test -f 'tests/lib/unit_test.c' || echo '$(srcdir)/'`tests/lib/unit_test.c tests/lib/printf_test-unit_test.obj: tests/lib/unit_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(printf_test_CPPFLAGS) $(CPPFLAGS) $(printf_test_CFLAGS) $(CFLAGS) -MT tests/lib/printf_test-unit_test.obj -MD -MP -MF tests/lib/$(DEPDIR)/printf_test-unit_test.Tpo -c -o tests/lib/printf_test-unit_test.obj `if test -f 'tests/lib/unit_test.c'; then $(CYGPATH_W) 'tests/lib/unit_test.c'; else $(CYGPATH_W) '$(srcdir)/tests/lib/unit_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/lib/$(DEPDIR)/printf_test-unit_test.Tpo tests/lib/$(DEPDIR)/printf_test-unit_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/lib/unit_test.c' object='tests/lib/printf_test-unit_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(printf_test_CPPFLAGS) $(CPPFLAGS) $(printf_test_CFLAGS) $(CFLAGS) -c -o tests/lib/printf_test-unit_test.obj `if test -f 'tests/lib/unit_test.c'; then $(CYGPATH_W) 'tests/lib/unit_test.c'; else $(CYGPATH_W) '$(srcdir)/tests/lib/unit_test.c'; fi` tests/printf_test-printf_unit_test.o: tests/printf_unit_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(printf_test_CPPFLAGS) $(CPPFLAGS) $(printf_test_CFLAGS) $(CFLAGS) -MT tests/printf_test-printf_unit_test.o -MD -MP -MF tests/$(DEPDIR)/printf_test-printf_unit_test.Tpo -c -o tests/printf_test-printf_unit_test.o `test -f 'tests/printf_unit_test.c' || echo '$(srcdir)/'`tests/printf_unit_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/printf_test-printf_unit_test.Tpo tests/$(DEPDIR)/printf_test-printf_unit_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/printf_unit_test.c' object='tests/printf_test-printf_unit_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(printf_test_CPPFLAGS) $(CPPFLAGS) $(printf_test_CFLAGS) $(CFLAGS) -c -o tests/printf_test-printf_unit_test.o `test -f 'tests/printf_unit_test.c' || echo '$(srcdir)/'`tests/printf_unit_test.c tests/printf_test-printf_unit_test.obj: tests/printf_unit_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(printf_test_CPPFLAGS) $(CPPFLAGS) $(printf_test_CFLAGS) $(CFLAGS) -MT tests/printf_test-printf_unit_test.obj -MD -MP -MF tests/$(DEPDIR)/printf_test-printf_unit_test.Tpo -c -o tests/printf_test-printf_unit_test.obj `if test -f 'tests/printf_unit_test.c'; then $(CYGPATH_W) 'tests/printf_unit_test.c'; else $(CYGPATH_W) '$(srcdir)/tests/printf_unit_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/printf_test-printf_unit_test.Tpo tests/$(DEPDIR)/printf_test-printf_unit_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/printf_unit_test.c' object='tests/printf_test-printf_unit_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(printf_test_CPPFLAGS) $(CPPFLAGS) $(printf_test_CFLAGS) $(CFLAGS) -c -o tests/printf_test-printf_unit_test.obj `if test -f 'tests/printf_unit_test.c'; then $(CYGPATH_W) 'tests/printf_unit_test.c'; else $(CYGPATH_W) '$(srcdir)/tests/printf_unit_test.c'; fi` grub-core/kern/priority_queue_unit_test-list.o: grub-core/kern/list.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(priority_queue_unit_test_CPPFLAGS) $(CPPFLAGS) $(priority_queue_unit_test_CFLAGS) $(CFLAGS) -MT grub-core/kern/priority_queue_unit_test-list.o -MD -MP -MF grub-core/kern/$(DEPDIR)/priority_queue_unit_test-list.Tpo -c -o grub-core/kern/priority_queue_unit_test-list.o `test -f 'grub-core/kern/list.c' || echo '$(srcdir)/'`grub-core/kern/list.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/$(DEPDIR)/priority_queue_unit_test-list.Tpo grub-core/kern/$(DEPDIR)/priority_queue_unit_test-list.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/list.c' object='grub-core/kern/priority_queue_unit_test-list.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(priority_queue_unit_test_CPPFLAGS) $(CPPFLAGS) $(priority_queue_unit_test_CFLAGS) $(CFLAGS) -c -o grub-core/kern/priority_queue_unit_test-list.o `test -f 'grub-core/kern/list.c' || echo '$(srcdir)/'`grub-core/kern/list.c grub-core/kern/priority_queue_unit_test-list.obj: grub-core/kern/list.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(priority_queue_unit_test_CPPFLAGS) $(CPPFLAGS) $(priority_queue_unit_test_CFLAGS) $(CFLAGS) -MT grub-core/kern/priority_queue_unit_test-list.obj -MD -MP -MF grub-core/kern/$(DEPDIR)/priority_queue_unit_test-list.Tpo -c -o grub-core/kern/priority_queue_unit_test-list.obj `if test -f 'grub-core/kern/list.c'; then $(CYGPATH_W) 'grub-core/kern/list.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/list.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/$(DEPDIR)/priority_queue_unit_test-list.Tpo grub-core/kern/$(DEPDIR)/priority_queue_unit_test-list.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/list.c' object='grub-core/kern/priority_queue_unit_test-list.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(priority_queue_unit_test_CPPFLAGS) $(CPPFLAGS) $(priority_queue_unit_test_CFLAGS) $(CFLAGS) -c -o grub-core/kern/priority_queue_unit_test-list.obj `if test -f 'grub-core/kern/list.c'; then $(CYGPATH_W) 'grub-core/kern/list.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/list.c'; fi` grub-core/kern/priority_queue_unit_test-misc.o: grub-core/kern/misc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(priority_queue_unit_test_CPPFLAGS) $(CPPFLAGS) $(priority_queue_unit_test_CFLAGS) $(CFLAGS) -MT grub-core/kern/priority_queue_unit_test-misc.o -MD -MP -MF grub-core/kern/$(DEPDIR)/priority_queue_unit_test-misc.Tpo -c -o grub-core/kern/priority_queue_unit_test-misc.o `test -f 'grub-core/kern/misc.c' || echo '$(srcdir)/'`grub-core/kern/misc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/$(DEPDIR)/priority_queue_unit_test-misc.Tpo grub-core/kern/$(DEPDIR)/priority_queue_unit_test-misc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/misc.c' object='grub-core/kern/priority_queue_unit_test-misc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(priority_queue_unit_test_CPPFLAGS) $(CPPFLAGS) $(priority_queue_unit_test_CFLAGS) $(CFLAGS) -c -o grub-core/kern/priority_queue_unit_test-misc.o `test -f 'grub-core/kern/misc.c' || echo '$(srcdir)/'`grub-core/kern/misc.c grub-core/kern/priority_queue_unit_test-misc.obj: grub-core/kern/misc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(priority_queue_unit_test_CPPFLAGS) $(CPPFLAGS) $(priority_queue_unit_test_CFLAGS) $(CFLAGS) -MT grub-core/kern/priority_queue_unit_test-misc.obj -MD -MP -MF grub-core/kern/$(DEPDIR)/priority_queue_unit_test-misc.Tpo -c -o grub-core/kern/priority_queue_unit_test-misc.obj `if test -f 'grub-core/kern/misc.c'; then $(CYGPATH_W) 'grub-core/kern/misc.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/misc.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/kern/$(DEPDIR)/priority_queue_unit_test-misc.Tpo grub-core/kern/$(DEPDIR)/priority_queue_unit_test-misc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/kern/misc.c' object='grub-core/kern/priority_queue_unit_test-misc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(priority_queue_unit_test_CPPFLAGS) $(CPPFLAGS) $(priority_queue_unit_test_CFLAGS) $(CFLAGS) -c -o grub-core/kern/priority_queue_unit_test-misc.obj `if test -f 'grub-core/kern/misc.c'; then $(CYGPATH_W) 'grub-core/kern/misc.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/kern/misc.c'; fi` grub-core/lib/priority_queue_unit_test-priority_queue.o: grub-core/lib/priority_queue.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(priority_queue_unit_test_CPPFLAGS) $(CPPFLAGS) $(priority_queue_unit_test_CFLAGS) $(CFLAGS) -MT grub-core/lib/priority_queue_unit_test-priority_queue.o -MD -MP -MF grub-core/lib/$(DEPDIR)/priority_queue_unit_test-priority_queue.Tpo -c -o grub-core/lib/priority_queue_unit_test-priority_queue.o `test -f 'grub-core/lib/priority_queue.c' || echo '$(srcdir)/'`grub-core/lib/priority_queue.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/$(DEPDIR)/priority_queue_unit_test-priority_queue.Tpo grub-core/lib/$(DEPDIR)/priority_queue_unit_test-priority_queue.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/priority_queue.c' object='grub-core/lib/priority_queue_unit_test-priority_queue.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(priority_queue_unit_test_CPPFLAGS) $(CPPFLAGS) $(priority_queue_unit_test_CFLAGS) $(CFLAGS) -c -o grub-core/lib/priority_queue_unit_test-priority_queue.o `test -f 'grub-core/lib/priority_queue.c' || echo '$(srcdir)/'`grub-core/lib/priority_queue.c grub-core/lib/priority_queue_unit_test-priority_queue.obj: grub-core/lib/priority_queue.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(priority_queue_unit_test_CPPFLAGS) $(CPPFLAGS) $(priority_queue_unit_test_CFLAGS) $(CFLAGS) -MT grub-core/lib/priority_queue_unit_test-priority_queue.obj -MD -MP -MF grub-core/lib/$(DEPDIR)/priority_queue_unit_test-priority_queue.Tpo -c -o grub-core/lib/priority_queue_unit_test-priority_queue.obj `if test -f 'grub-core/lib/priority_queue.c'; then $(CYGPATH_W) 'grub-core/lib/priority_queue.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/priority_queue.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/lib/$(DEPDIR)/priority_queue_unit_test-priority_queue.Tpo grub-core/lib/$(DEPDIR)/priority_queue_unit_test-priority_queue.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/lib/priority_queue.c' object='grub-core/lib/priority_queue_unit_test-priority_queue.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(priority_queue_unit_test_CPPFLAGS) $(CPPFLAGS) $(priority_queue_unit_test_CFLAGS) $(CFLAGS) -c -o grub-core/lib/priority_queue_unit_test-priority_queue.obj `if test -f 'grub-core/lib/priority_queue.c'; then $(CYGPATH_W) 'grub-core/lib/priority_queue.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/lib/priority_queue.c'; fi` grub-core/tests/lib/priority_queue_unit_test-test.o: grub-core/tests/lib/test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(priority_queue_unit_test_CPPFLAGS) $(CPPFLAGS) $(priority_queue_unit_test_CFLAGS) $(CFLAGS) -MT grub-core/tests/lib/priority_queue_unit_test-test.o -MD -MP -MF grub-core/tests/lib/$(DEPDIR)/priority_queue_unit_test-test.Tpo -c -o grub-core/tests/lib/priority_queue_unit_test-test.o `test -f 'grub-core/tests/lib/test.c' || echo '$(srcdir)/'`grub-core/tests/lib/test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/tests/lib/$(DEPDIR)/priority_queue_unit_test-test.Tpo grub-core/tests/lib/$(DEPDIR)/priority_queue_unit_test-test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/tests/lib/test.c' object='grub-core/tests/lib/priority_queue_unit_test-test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(priority_queue_unit_test_CPPFLAGS) $(CPPFLAGS) $(priority_queue_unit_test_CFLAGS) $(CFLAGS) -c -o grub-core/tests/lib/priority_queue_unit_test-test.o `test -f 'grub-core/tests/lib/test.c' || echo '$(srcdir)/'`grub-core/tests/lib/test.c grub-core/tests/lib/priority_queue_unit_test-test.obj: grub-core/tests/lib/test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(priority_queue_unit_test_CPPFLAGS) $(CPPFLAGS) $(priority_queue_unit_test_CFLAGS) $(CFLAGS) -MT grub-core/tests/lib/priority_queue_unit_test-test.obj -MD -MP -MF grub-core/tests/lib/$(DEPDIR)/priority_queue_unit_test-test.Tpo -c -o grub-core/tests/lib/priority_queue_unit_test-test.obj `if test -f 'grub-core/tests/lib/test.c'; then $(CYGPATH_W) 'grub-core/tests/lib/test.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/tests/lib/test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) grub-core/tests/lib/$(DEPDIR)/priority_queue_unit_test-test.Tpo grub-core/tests/lib/$(DEPDIR)/priority_queue_unit_test-test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='grub-core/tests/lib/test.c' object='grub-core/tests/lib/priority_queue_unit_test-test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(priority_queue_unit_test_CPPFLAGS) $(CPPFLAGS) $(priority_queue_unit_test_CFLAGS) $(CFLAGS) -c -o grub-core/tests/lib/priority_queue_unit_test-test.obj `if test -f 'grub-core/tests/lib/test.c'; then $(CYGPATH_W) 'grub-core/tests/lib/test.c'; else $(CYGPATH_W) '$(srcdir)/grub-core/tests/lib/test.c'; fi` tests/lib/priority_queue_unit_test-unit_test.o: tests/lib/unit_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(priority_queue_unit_test_CPPFLAGS) $(CPPFLAGS) $(priority_queue_unit_test_CFLAGS) $(CFLAGS) -MT tests/lib/priority_queue_unit_test-unit_test.o -MD -MP -MF tests/lib/$(DEPDIR)/priority_queue_unit_test-unit_test.Tpo -c -o tests/lib/priority_queue_unit_test-unit_test.o `test -f 'tests/lib/unit_test.c' || echo '$(srcdir)/'`tests/lib/unit_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/lib/$(DEPDIR)/priority_queue_unit_test-unit_test.Tpo tests/lib/$(DEPDIR)/priority_queue_unit_test-unit_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/lib/unit_test.c' object='tests/lib/priority_queue_unit_test-unit_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(priority_queue_unit_test_CPPFLAGS) $(CPPFLAGS) $(priority_queue_unit_test_CFLAGS) $(CFLAGS) -c -o tests/lib/priority_queue_unit_test-unit_test.o `test -f 'tests/lib/unit_test.c' || echo '$(srcdir)/'`tests/lib/unit_test.c tests/lib/priority_queue_unit_test-unit_test.obj: tests/lib/unit_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(priority_queue_unit_test_CPPFLAGS) $(CPPFLAGS) $(priority_queue_unit_test_CFLAGS) $(CFLAGS) -MT tests/lib/priority_queue_unit_test-unit_test.obj -MD -MP -MF tests/lib/$(DEPDIR)/priority_queue_unit_test-unit_test.Tpo -c -o tests/lib/priority_queue_unit_test-unit_test.obj `if test -f 'tests/lib/unit_test.c'; then $(CYGPATH_W) 'tests/lib/unit_test.c'; else $(CYGPATH_W) '$(srcdir)/tests/lib/unit_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/lib/$(DEPDIR)/priority_queue_unit_test-unit_test.Tpo tests/lib/$(DEPDIR)/priority_queue_unit_test-unit_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/lib/unit_test.c' object='tests/lib/priority_queue_unit_test-unit_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(priority_queue_unit_test_CPPFLAGS) $(CPPFLAGS) $(priority_queue_unit_test_CFLAGS) $(CFLAGS) -c -o tests/lib/priority_queue_unit_test-unit_test.obj `if test -f 'tests/lib/unit_test.c'; then $(CYGPATH_W) 'tests/lib/unit_test.c'; else $(CYGPATH_W) '$(srcdir)/tests/lib/unit_test.c'; fi` .cc.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cc.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` tests/priority_queue_unit_test-priority_queue_unit_test.o: tests/priority_queue_unit_test.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(priority_queue_unit_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT tests/priority_queue_unit_test-priority_queue_unit_test.o -MD -MP -MF tests/$(DEPDIR)/priority_queue_unit_test-priority_queue_unit_test.Tpo -c -o tests/priority_queue_unit_test-priority_queue_unit_test.o `test -f 'tests/priority_queue_unit_test.cc' || echo '$(srcdir)/'`tests/priority_queue_unit_test.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/priority_queue_unit_test-priority_queue_unit_test.Tpo tests/$(DEPDIR)/priority_queue_unit_test-priority_queue_unit_test.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='tests/priority_queue_unit_test.cc' object='tests/priority_queue_unit_test-priority_queue_unit_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(priority_queue_unit_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o tests/priority_queue_unit_test-priority_queue_unit_test.o `test -f 'tests/priority_queue_unit_test.cc' || echo '$(srcdir)/'`tests/priority_queue_unit_test.cc tests/priority_queue_unit_test-priority_queue_unit_test.obj: tests/priority_queue_unit_test.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(priority_queue_unit_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT tests/priority_queue_unit_test-priority_queue_unit_test.obj -MD -MP -MF tests/$(DEPDIR)/priority_queue_unit_test-priority_queue_unit_test.Tpo -c -o tests/priority_queue_unit_test-priority_queue_unit_test.obj `if test -f 'tests/priority_queue_unit_test.cc'; then $(CYGPATH_W) 'tests/priority_queue_unit_test.cc'; else $(CYGPATH_W) '$(srcdir)/tests/priority_queue_unit_test.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/priority_queue_unit_test-priority_queue_unit_test.Tpo tests/$(DEPDIR)/priority_queue_unit_test-priority_queue_unit_test.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='tests/priority_queue_unit_test.cc' object='tests/priority_queue_unit_test-priority_queue_unit_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(priority_queue_unit_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o tests/priority_queue_unit_test-priority_queue_unit_test.obj `if test -f 'tests/priority_queue_unit_test.cc'; then $(CYGPATH_W) 'tests/priority_queue_unit_test.cc'; else $(CYGPATH_W) '$(srcdir)/tests/priority_queue_unit_test.cc'; fi` install-man1: $(man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(man_MANS)'; \ test -n "$(man1dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.1[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } uninstall-man1: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) install-man8: $(man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(man_MANS)'; \ test -n "$(man8dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man8dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man8dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.8[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^8][0-9a-z]*$$,8,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man8dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man8dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man8dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man8dir)" || exit $$?; }; \ done; } uninstall-man8: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man8dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.8[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^8][0-9a-z]*$$,8,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man8dir)'; $(am__uninstall_files_from_dir) install-dist_grubconfDATA: $(dist_grubconf_DATA) @$(NORMAL_INSTALL) @list='$(dist_grubconf_DATA)'; test -n "$(grubconfdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(grubconfdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(grubconfdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(grubconfdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(grubconfdir)" || exit $$?; \ done uninstall-dist_grubconfDATA: @$(NORMAL_UNINSTALL) @list='$(dist_grubconf_DATA)'; test -n "$(grubconfdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(grubconfdir)'; $(am__uninstall_files_from_dir) install-pkgdataDATA: $(pkgdata_DATA) @$(NORMAL_INSTALL) @list='$(pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgdatadir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgdatadir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgdatadir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgdatadir)" || exit $$?; \ done uninstall-pkgdataDATA: @$(NORMAL_UNINSTALL) @list='$(pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgdatadir)'; $(am__uninstall_files_from_dir) install-platformDATA: $(platform_DATA) @$(NORMAL_INSTALL) @list='$(platform_DATA)'; test -n "$(platformdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(platformdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(platformdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(platformdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(platformdir)" || exit $$?; \ done uninstall-platformDATA: @$(NORMAL_UNINSTALL) @list='$(platform_DATA)'; test -n "$(platformdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(platformdir)'; $(am__uninstall_files_from_dir) install-starfieldDATA: $(starfield_DATA) @$(NORMAL_INSTALL) @list='$(starfield_DATA)'; test -n "$(starfielddir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(starfielddir)'"; \ $(MKDIR_P) "$(DESTDIR)$(starfielddir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(starfielddir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(starfielddir)" || exit $$?; \ done uninstall-starfieldDATA: @$(NORMAL_UNINSTALL) @list='$(starfield_DATA)'; test -n "$(starfielddir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(starfielddir)'; $(am__uninstall_files_from_dir) install-nodist_platformHEADERS: $(nodist_platform_HEADERS) @$(NORMAL_INSTALL) @list='$(nodist_platform_HEADERS)'; test -n "$(platformdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(platformdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(platformdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(platformdir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(platformdir)" || exit $$?; \ done uninstall-nodist_platformHEADERS: @$(NORMAL_UNINSTALL) @list='$(nodist_platform_HEADERS)'; test -n "$(platformdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(platformdir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscope: cscope.files test ! -s cscope.files \ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) clean-cscope: -rm -f cscope.files cscope.files: clean-cscope cscopelist cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -rm -f cscope.out cscope.in.out cscope.po.out cscope.files # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ elif test -n "$$redo_logs"; then \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary"$(AM_TESTSUITE_SUMMARY_HEADER)"$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: $(check_PROGRAMS) $(check_SCRIPTS) @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) $(check_SCRIPTS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? erofs_test.log: erofs_test @p='erofs_test'; \ b='erofs_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ext234_test.log: ext234_test @p='ext234_test'; \ b='ext234_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) squashfs_test.log: squashfs_test @p='squashfs_test'; \ b='squashfs_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) iso9660_test.log: iso9660_test @p='iso9660_test'; \ b='iso9660_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) hfsplus_test.log: hfsplus_test @p='hfsplus_test'; \ b='hfsplus_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ntfs_test.log: ntfs_test @p='ntfs_test'; \ b='ntfs_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) reiserfs_test.log: reiserfs_test @p='reiserfs_test'; \ b='reiserfs_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) fat_test.log: fat_test @p='fat_test'; \ b='fat_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) minixfs_test.log: minixfs_test @p='minixfs_test'; \ b='minixfs_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) xfs_test.log: xfs_test @p='xfs_test'; \ b='xfs_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) f2fs_test.log: f2fs_test @p='f2fs_test'; \ b='f2fs_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) nilfs2_test.log: nilfs2_test @p='nilfs2_test'; \ b='nilfs2_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) romfs_test.log: romfs_test @p='romfs_test'; \ b='romfs_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) exfat_test.log: exfat_test @p='exfat_test'; \ b='exfat_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tar_test.log: tar_test @p='tar_test'; \ b='tar_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) udf_test.log: udf_test @p='udf_test'; \ b='udf_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) hfs_test.log: hfs_test @p='hfs_test'; \ b='hfs_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) jfs_test.log: jfs_test @p='jfs_test'; \ b='jfs_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) btrfs_test.log: btrfs_test @p='btrfs_test'; \ b='btrfs_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) zfs_test.log: zfs_test @p='zfs_test'; \ b='zfs_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) cpio_test.log: cpio_test @p='cpio_test'; \ b='cpio_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) example_scripted_test.log: example_scripted_test @p='example_scripted_test'; \ b='example_scripted_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) gettext_strings_test.log: gettext_strings_test @p='gettext_strings_test'; \ b='gettext_strings_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) grub_script_blanklines.log: grub_script_blanklines @p='grub_script_blanklines'; \ b='grub_script_blanklines'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) grub_script_final_semicolon.log: grub_script_final_semicolon @p='grub_script_final_semicolon'; \ b='grub_script_final_semicolon'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) grub_script_dollar.log: grub_script_dollar @p='grub_script_dollar'; \ b='grub_script_dollar'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) grub_script_no_commands.log: grub_script_no_commands @p='grub_script_no_commands'; \ b='grub_script_no_commands'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) syslinux_test.log: syslinux_test @p='syslinux_test'; \ b='syslinux_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) luks1_test.log: luks1_test @p='luks1_test'; \ b='luks1_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) luks2_test.log: luks2_test @p='luks2_test'; \ b='luks2_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) asn1_test.log: asn1_test @p='asn1_test'; \ b='asn1_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tpm2_key_protector_test.log: tpm2_key_protector_test @p='tpm2_key_protector_test'; \ b='tpm2_key_protector_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) pata_test.log: pata_test @p='pata_test'; \ b='pata_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ahci_test.log: ahci_test @p='ahci_test'; \ b='ahci_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) uhci_test.log: uhci_test @p='uhci_test'; \ b='uhci_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ohci_test.log: ohci_test @p='ohci_test'; \ b='ohci_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ehci_test.log: ehci_test @p='ehci_test'; \ b='ehci_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) example_grub_script_test.log: example_grub_script_test @p='example_grub_script_test'; \ b='example_grub_script_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) grub_script_eval.log: grub_script_eval @p='grub_script_eval'; \ b='grub_script_eval'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) grub_script_test.log: grub_script_test @p='grub_script_test'; \ b='grub_script_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) grub_script_echo1.log: grub_script_echo1 @p='grub_script_echo1'; \ b='grub_script_echo1'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) grub_script_leading_whitespace.log: grub_script_leading_whitespace @p='grub_script_leading_whitespace'; \ b='grub_script_leading_whitespace'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) grub_script_echo_keywords.log: grub_script_echo_keywords @p='grub_script_echo_keywords'; \ b='grub_script_echo_keywords'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) grub_script_vars1.log: grub_script_vars1 @p='grub_script_vars1'; \ b='grub_script_vars1'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) grub_script_for1.log: grub_script_for1 @p='grub_script_for1'; \ b='grub_script_for1'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) grub_script_while1.log: grub_script_while1 @p='grub_script_while1'; \ b='grub_script_while1'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) grub_script_if.log: grub_script_if @p='grub_script_if'; \ b='grub_script_if'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) grub_script_comments.log: grub_script_comments @p='grub_script_comments'; \ b='grub_script_comments'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) grub_script_functions.log: grub_script_functions @p='grub_script_functions'; \ b='grub_script_functions'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) grub_script_break.log: grub_script_break @p='grub_script_break'; \ b='grub_script_break'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) grub_script_continue.log: grub_script_continue @p='grub_script_continue'; \ b='grub_script_continue'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) grub_script_shift.log: grub_script_shift @p='grub_script_shift'; \ b='grub_script_shift'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) grub_script_blockarg.log: grub_script_blockarg @p='grub_script_blockarg'; \ b='grub_script_blockarg'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) grub_script_setparams.log: grub_script_setparams @p='grub_script_setparams'; \ b='grub_script_setparams'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) grub_script_return.log: grub_script_return @p='grub_script_return'; \ b='grub_script_return'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) grub_cmd_cryptomount.log: grub_cmd_cryptomount @p='grub_cmd_cryptomount'; \ b='grub_cmd_cryptomount'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) grub_cmd_regexp.log: grub_cmd_regexp @p='grub_cmd_regexp'; \ b='grub_cmd_regexp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) grub_cmd_date.log: grub_cmd_date @p='grub_cmd_date'; \ b='grub_cmd_date'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) grub_cmd_set_date.log: grub_cmd_set_date @p='grub_cmd_set_date'; \ b='grub_cmd_set_date'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) grub_cmd_sleep.log: grub_cmd_sleep @p='grub_cmd_sleep'; \ b='grub_cmd_sleep'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) grub_script_expansion.log: grub_script_expansion @p='grub_script_expansion'; \ b='grub_script_expansion'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) grub_script_not.log: grub_script_not @p='grub_script_not'; \ b='grub_script_not'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) partmap_test.log: partmap_test @p='partmap_test'; \ b='partmap_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) hddboot_test.log: hddboot_test @p='hddboot_test'; \ b='hddboot_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) fddboot_test.log: fddboot_test @p='fddboot_test'; \ b='fddboot_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) cdboot_test.log: cdboot_test @p='cdboot_test'; \ b='cdboot_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) netboot_test.log: netboot_test @p='netboot_test'; \ b='netboot_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) serial_test.log: serial_test @p='serial_test'; \ b='serial_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) pseries_test.log: pseries_test @p='pseries_test'; \ b='pseries_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) core_compress_test.log: core_compress_test @p='core_compress_test'; \ b='core_compress_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) xzcompress_test.log: xzcompress_test @p='xzcompress_test'; \ b='xzcompress_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) gzcompress_test.log: gzcompress_test @p='gzcompress_test'; \ b='gzcompress_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) lzocompress_test.log: lzocompress_test @p='lzocompress_test'; \ b='lzocompress_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) grub_cmd_echo.log: grub_cmd_echo @p='grub_cmd_echo'; \ b='grub_cmd_echo'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) help_test.log: help_test @p='help_test'; \ b='help_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) grub_script_gettext.log: grub_script_gettext @p='grub_script_gettext'; \ b='grub_script_gettext'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) grub_script_escape_comma.log: grub_script_escape_comma @p='grub_script_escape_comma'; \ b='grub_script_escape_comma'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) grub_script_strcmp.log: grub_script_strcmp @p='grub_script_strcmp'; \ b='grub_script_strcmp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) test_sha512sum.log: test_sha512sum @p='test_sha512sum'; \ b='test_sha512sum'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) test_unset.log: test_unset @p='test_unset'; \ b='test_unset'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) grub_func_test.log: grub_func_test @p='grub_func_test'; \ b='grub_func_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) grub_cmd_tr.log: grub_cmd_tr @p='grub_cmd_tr'; \ b='grub_cmd_tr'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) file_filter_test.log: file_filter_test @p='file_filter_test'; \ b='file_filter_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) grub_cmd_test.log: grub_cmd_test @p='grub_cmd_test'; \ b='grub_cmd_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) example_unit_test.log: example_unit_test$(EXEEXT) @p='example_unit_test$(EXEEXT)'; \ b='example_unit_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) printf_test.log: printf_test$(EXEEXT) @p='printf_test$(EXEEXT)'; \ b='printf_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) date_test.log: date_test$(EXEEXT) @p='date_test$(EXEEXT)'; \ b='date_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) priority_queue_unit_test.log: priority_queue_unit_test$(EXEEXT) @p='priority_queue_unit_test$(EXEEXT)'; \ b='priority_queue_unit_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) cmp_test.log: cmp_test$(EXEEXT) @p='cmp_test$(EXEEXT)'; \ b='cmp_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz $(am__post_remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__post_remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__post_remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__post_remove_distdir) dist-zstd: distdir tardir=$(distdir) && $(am__tar) | zstd -c $${ZSTD_CLEVEL-$${ZSTD_OPT--19}} >$(distdir).tar.zst $(am__post_remove_distdir) dist-tarZ: distdir @echo WARNING: "Support for distribution archives compressed with" \ "legacy program 'compress' is deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__post_remove_distdir) dist-shar: distdir @echo WARNING: "Support for shar distribution archives is" \ "deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz $(am__post_remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__post_remove_distdir) dist dist-all: $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' $(am__post_remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ *.tar.zst*) \ zstd -dc $(distdir).tar.zst | $(am__untar) ;;\ esac chmod -R a-w $(distdir) chmod u+w $(distdir) mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build/sub \ && ../../configure \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ --srcdir=../.. --prefix="$$dc_install_base" \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) $(AM_DISTCHECK_DVI_TARGET) \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__post_remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(check_SCRIPTS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-recursive all-am: Makefile $(PROGRAMS) $(LIBRARIES) $(SCRIPTS) $(MANS) $(DATA) \ $(HEADERS) config-util.h installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(platformdir)" "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(grubconfdir)" "$(DESTDIR)$(platformdir)" "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(man8dir)" "$(DESTDIR)$(grubconfdir)" "$(DESTDIR)$(pkgdatadir)" "$(DESTDIR)$(platformdir)" "$(DESTDIR)$(starfielddir)" "$(DESTDIR)$(platformdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-recursive install-exec: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -rm -f grub-core/$(DEPDIR)/$(am__dirstamp) -rm -f grub-core/$(am__dirstamp) -rm -f grub-core/commands/$(DEPDIR)/$(am__dirstamp) -rm -f grub-core/commands/$(am__dirstamp) -rm -f grub-core/commands/tpm2_key_protector/$(DEPDIR)/$(am__dirstamp) -rm -f grub-core/commands/tpm2_key_protector/$(am__dirstamp) -rm -f grub-core/disk/$(DEPDIR)/$(am__dirstamp) -rm -f grub-core/disk/$(am__dirstamp) -rm -f grub-core/font/$(DEPDIR)/$(am__dirstamp) -rm -f grub-core/font/$(am__dirstamp) -rm -f grub-core/fs/$(DEPDIR)/$(am__dirstamp) -rm -f grub-core/fs/$(am__dirstamp) -rm -f grub-core/fs/zfs/$(DEPDIR)/$(am__dirstamp) -rm -f grub-core/fs/zfs/$(am__dirstamp) -rm -f grub-core/gfxmenu/$(DEPDIR)/$(am__dirstamp) -rm -f grub-core/gfxmenu/$(am__dirstamp) -rm -f grub-core/io/$(DEPDIR)/$(am__dirstamp) -rm -f grub-core/io/$(am__dirstamp) -rm -f grub-core/kern/$(DEPDIR)/$(am__dirstamp) -rm -f grub-core/kern/$(am__dirstamp) -rm -f grub-core/kern/arm/$(DEPDIR)/$(am__dirstamp) -rm -f grub-core/kern/arm/$(am__dirstamp) -rm -f grub-core/kern/arm64/$(DEPDIR)/$(am__dirstamp) -rm -f grub-core/kern/arm64/$(am__dirstamp) -rm -f grub-core/kern/emu/$(DEPDIR)/$(am__dirstamp) -rm -f grub-core/kern/emu/$(am__dirstamp) -rm -f grub-core/kern/ia64/$(DEPDIR)/$(am__dirstamp) -rm -f grub-core/kern/ia64/$(am__dirstamp) -rm -f grub-core/kern/loongarch64/$(DEPDIR)/$(am__dirstamp) -rm -f grub-core/kern/loongarch64/$(am__dirstamp) -rm -f grub-core/lib/$(DEPDIR)/$(am__dirstamp) -rm -f grub-core/lib/$(am__dirstamp) -rm -f grub-core/lib/i386/pc/$(DEPDIR)/$(am__dirstamp) -rm -f grub-core/lib/i386/pc/$(am__dirstamp) -rm -f grub-core/lib/json/$(DEPDIR)/$(am__dirstamp) -rm -f grub-core/lib/json/$(am__dirstamp) -rm -f grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/$(am__dirstamp) -rm -f grub-core/lib/libgcrypt-grub/cipher/$(am__dirstamp) -rm -f grub-core/lib/libgcrypt-grub/src/$(DEPDIR)/$(am__dirstamp) -rm -f grub-core/lib/libgcrypt-grub/src/$(am__dirstamp) -rm -f grub-core/lib/minilzo/$(DEPDIR)/$(am__dirstamp) -rm -f grub-core/lib/minilzo/$(am__dirstamp) -rm -f grub-core/lib/tss2/$(DEPDIR)/$(am__dirstamp) -rm -f grub-core/lib/tss2/$(am__dirstamp) -rm -f grub-core/lib/xzembed/$(DEPDIR)/$(am__dirstamp) -rm -f grub-core/lib/xzembed/$(am__dirstamp) -rm -f grub-core/lib/zstd/$(DEPDIR)/$(am__dirstamp) -rm -f grub-core/lib/zstd/$(am__dirstamp) -rm -f grub-core/loader/$(DEPDIR)/$(am__dirstamp) -rm -f grub-core/loader/$(am__dirstamp) -rm -f grub-core/loader/i386/$(DEPDIR)/$(am__dirstamp) -rm -f grub-core/loader/i386/$(am__dirstamp) -rm -f grub-core/normal/$(DEPDIR)/$(am__dirstamp) -rm -f grub-core/normal/$(am__dirstamp) -rm -f grub-core/osdep/$(DEPDIR)/$(am__dirstamp) -rm -f grub-core/osdep/$(am__dirstamp) -rm -f grub-core/osdep/devmapper/$(DEPDIR)/$(am__dirstamp) -rm -f grub-core/osdep/devmapper/$(am__dirstamp) -rm -f grub-core/osdep/unix/$(DEPDIR)/$(am__dirstamp) -rm -f grub-core/osdep/unix/$(am__dirstamp) -rm -f grub-core/partmap/$(DEPDIR)/$(am__dirstamp) -rm -f grub-core/partmap/$(am__dirstamp) -rm -f grub-core/script/$(DEPDIR)/$(am__dirstamp) -rm -f grub-core/script/$(am__dirstamp) -rm -f grub-core/tests/lib/$(DEPDIR)/$(am__dirstamp) -rm -f grub-core/tests/lib/$(am__dirstamp) -rm -f grub-core/video/$(DEPDIR)/$(am__dirstamp) -rm -f grub-core/video/$(am__dirstamp) -rm -f grub-core/video/fb/$(DEPDIR)/$(am__dirstamp) -rm -f grub-core/video/fb/$(am__dirstamp) -rm -f tests/$(DEPDIR)/$(am__dirstamp) -rm -f tests/$(am__dirstamp) -rm -f tests/lib/$(DEPDIR)/$(am__dirstamp) -rm -f tests/lib/$(am__dirstamp) -rm -f util/$(DEPDIR)/$(am__dirstamp) -rm -f util/$(am__dirstamp) -rm -f util/ieee1275/$(DEPDIR)/$(am__dirstamp) -rm -f util/ieee1275/$(am__dirstamp) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-recursive clean-am: clean-binPROGRAMS clean-checkPROGRAMS clean-generic \ clean-noinstLIBRARIES clean-noinstPROGRAMS \ clean-platformPROGRAMS clean-sbinPROGRAMS mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f ./$(DEPDIR)/grub_fstest-grub_fstest_init.Po -rm -f ./$(DEPDIR)/grub_mount-grub_fstest_init.Po -rm -f ./$(DEPDIR)/libgrubmods_a-grub_script.tab.Po -rm -f ./$(DEPDIR)/libgrubmods_a-grub_script.yy.Po -rm -f ./$(DEPDIR)/libgrubmods_a-libgrub_a_init.Po -rm -f grub-core/$(DEPDIR)/libgrubmods_a-unidata.Po -rm -f grub-core/commands/$(DEPDIR)/grub_file-file.Po -rm -f grub-core/commands/$(DEPDIR)/grub_file-file32.Po -rm -f grub-core/commands/$(DEPDIR)/grub_file-file64.Po -rm -f grub-core/commands/$(DEPDIR)/libgrubkern_a-extcmd.Po -rm -f grub-core/commands/$(DEPDIR)/libgrubmods_a-blocklist.Po -rm -f grub-core/commands/$(DEPDIR)/libgrubmods_a-ls.Po -rm -f grub-core/commands/$(DEPDIR)/libgrubmods_a-macbless.Po -rm -f grub-core/commands/$(DEPDIR)/libgrubmods_a-testload.Po -rm -f grub-core/commands/$(DEPDIR)/libgrubmods_a-xnu_uuid.Po -rm -f grub-core/commands/tpm2_key_protector/$(DEPDIR)/grub_protect-args.Po -rm -f grub-core/commands/tpm2_key_protector/$(DEPDIR)/grub_protect-tpm2key_asn1_tab.Po -rm -f grub-core/disk/$(DEPDIR)/grub_file-host.Po -rm -f grub-core/disk/$(DEPDIR)/grub_fstest-host.Po -rm -f grub-core/disk/$(DEPDIR)/grub_install-host.Po -rm -f grub-core/disk/$(DEPDIR)/grub_mkrescue-host.Po -rm -f grub-core/disk/$(DEPDIR)/grub_mkstandalone-host.Po -rm -f grub-core/disk/$(DEPDIR)/grub_mount-host.Po -rm -f grub-core/disk/$(DEPDIR)/grub_render_label-host.Po -rm -f grub-core/disk/$(DEPDIR)/grub_syslinux2cfg-host.Po -rm -f grub-core/disk/$(DEPDIR)/libgrubkern_a-AFSplitter.Po -rm -f grub-core/disk/$(DEPDIR)/libgrubkern_a-cryptodisk.Po -rm -f grub-core/disk/$(DEPDIR)/libgrubkern_a-diskfilter.Po -rm -f grub-core/disk/$(DEPDIR)/libgrubkern_a-geli.Po -rm -f grub-core/disk/$(DEPDIR)/libgrubkern_a-key_protector.Po -rm -f grub-core/disk/$(DEPDIR)/libgrubkern_a-ldm.Po -rm -f grub-core/disk/$(DEPDIR)/libgrubkern_a-luks.Po -rm -f grub-core/disk/$(DEPDIR)/libgrubkern_a-luks2.Po -rm -f grub-core/disk/$(DEPDIR)/libgrubmods_a-dmraid_nvidia.Po -rm -f grub-core/disk/$(DEPDIR)/libgrubmods_a-loopback.Po -rm -f grub-core/disk/$(DEPDIR)/libgrubmods_a-lvm.Po -rm -f grub-core/disk/$(DEPDIR)/libgrubmods_a-mdraid1x_linux.Po -rm -f grub-core/disk/$(DEPDIR)/libgrubmods_a-mdraid_linux.Po -rm -f grub-core/disk/$(DEPDIR)/libgrubmods_a-mdraid_linux_be.Po -rm -f grub-core/disk/$(DEPDIR)/libgrubmods_a-raid5_recover.Po -rm -f grub-core/disk/$(DEPDIR)/libgrubmods_a-raid6_recover.Po -rm -f grub-core/font/$(DEPDIR)/libgrubmods_a-font.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubkern_a-archelp.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubkern_a-proc.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-affs.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-afs.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-bfs.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-btrfs.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-cbfs.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-cpio.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-cpio_be.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-erofs.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-exfat.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-ext2.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-f2fs.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-fat.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-fshelp.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-hfs.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-hfsplus.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-hfspluscomp.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-iso9660.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-jfs.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-minix.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-minix2.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-minix2_be.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-minix3.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-minix3_be.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-minix_be.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-newc.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-nilfs2.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-ntfs.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-ntfscomp.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-odc.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-reiserfs.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-romfs.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-sfs.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-squash4.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-tar.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-udf.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-ufs.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-ufs2.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-ufs_be.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-xfs.Po -rm -f grub-core/fs/zfs/$(DEPDIR)/libgrubmods_a-zfs.Po -rm -f grub-core/fs/zfs/$(DEPDIR)/libgrubmods_a-zfs_fletcher.Po -rm -f grub-core/fs/zfs/$(DEPDIR)/libgrubmods_a-zfs_lz4.Po -rm -f grub-core/fs/zfs/$(DEPDIR)/libgrubmods_a-zfs_lzjb.Po -rm -f grub-core/fs/zfs/$(DEPDIR)/libgrubmods_a-zfs_sha256.Po -rm -f grub-core/fs/zfs/$(DEPDIR)/libgrubmods_a-zfscrypt.Po -rm -f grub-core/fs/zfs/$(DEPDIR)/libgrubmods_a-zfsinfo.Po -rm -f grub-core/gfxmenu/$(DEPDIR)/libgrubmods_a-font.Po -rm -f grub-core/io/$(DEPDIR)/grub_file-offset.Po -rm -f grub-core/io/$(DEPDIR)/libgrubmods_a-bufio.Po -rm -f grub-core/io/$(DEPDIR)/libgrubmods_a-gzio.Po -rm -f grub-core/io/$(DEPDIR)/libgrubmods_a-lzopio.Po -rm -f grub-core/io/$(DEPDIR)/libgrubmods_a-xzio.Po -rm -f grub-core/kern/$(DEPDIR)/cmp_test-list.Po -rm -f grub-core/kern/$(DEPDIR)/cmp_test-misc.Po -rm -f grub-core/kern/$(DEPDIR)/date_test-list.Po -rm -f grub-core/kern/$(DEPDIR)/date_test-misc.Po -rm -f grub-core/kern/$(DEPDIR)/example_unit_test-list.Po -rm -f grub-core/kern/$(DEPDIR)/example_unit_test-misc.Po -rm -f grub-core/kern/$(DEPDIR)/grub_file-elf.Po -rm -f grub-core/kern/$(DEPDIR)/libgrubkern_a-command.Po -rm -f grub-core/kern/$(DEPDIR)/libgrubkern_a-device.Po -rm -f grub-core/kern/$(DEPDIR)/libgrubkern_a-disk.Po -rm -f grub-core/kern/$(DEPDIR)/libgrubkern_a-env.Po -rm -f grub-core/kern/$(DEPDIR)/libgrubkern_a-err.Po -rm -f grub-core/kern/$(DEPDIR)/libgrubkern_a-file.Po -rm -f grub-core/kern/$(DEPDIR)/libgrubkern_a-fs.Po -rm -f grub-core/kern/$(DEPDIR)/libgrubkern_a-list.Po -rm -f grub-core/kern/$(DEPDIR)/libgrubkern_a-misc.Po -rm -f grub-core/kern/$(DEPDIR)/libgrubkern_a-partition.Po -rm -f grub-core/kern/$(DEPDIR)/printf_test-list.Po -rm -f grub-core/kern/$(DEPDIR)/printf_test-misc.Po -rm -f grub-core/kern/$(DEPDIR)/priority_queue_unit_test-list.Po -rm -f grub-core/kern/$(DEPDIR)/priority_queue_unit_test-misc.Po -rm -f grub-core/kern/arm/$(DEPDIR)/libgrubmods_a-dl_helper.Po -rm -f grub-core/kern/arm64/$(DEPDIR)/libgrubmods_a-dl_helper.Po -rm -f grub-core/kern/emu/$(DEPDIR)/grub_bios_setup-argp_common.Po -rm -f grub-core/kern/emu/$(DEPDIR)/grub_file-hostfs.Po -rm -f grub-core/kern/emu/$(DEPDIR)/grub_fstest-hostfs.Po -rm -f grub-core/kern/emu/$(DEPDIR)/grub_glue_efi-argp_common.Po -rm -f grub-core/kern/emu/$(DEPDIR)/grub_install-argp_common.Po -rm -f grub-core/kern/emu/$(DEPDIR)/grub_install-hostfs.Po -rm -f grub-core/kern/emu/$(DEPDIR)/grub_macbless-argp_common.Po -rm -f grub-core/kern/emu/$(DEPDIR)/grub_mkfont-argp_common.Po -rm -f grub-core/kern/emu/$(DEPDIR)/grub_mkimage-argp_common.Po -rm -f grub-core/kern/emu/$(DEPDIR)/grub_mklayout-argp_common.Po -rm -f grub-core/kern/emu/$(DEPDIR)/grub_mknetdir-argp_common.Po -rm -f grub-core/kern/emu/$(DEPDIR)/grub_mkpasswd_pbkdf2-argp_common.Po -rm -f grub-core/kern/emu/$(DEPDIR)/grub_mkrelpath-argp_common.Po -rm -f grub-core/kern/emu/$(DEPDIR)/grub_mkrescue-argp_common.Po -rm -f grub-core/kern/emu/$(DEPDIR)/grub_mkrescue-hostfs.Po -rm -f grub-core/kern/emu/$(DEPDIR)/grub_mkstandalone-argp_common.Po -rm -f grub-core/kern/emu/$(DEPDIR)/grub_mkstandalone-hostfs.Po -rm -f grub-core/kern/emu/$(DEPDIR)/grub_mount-hostfs.Po -rm -f grub-core/kern/emu/$(DEPDIR)/grub_probe-argp_common.Po -rm -f grub-core/kern/emu/$(DEPDIR)/grub_protect-argp_common.Po -rm -f grub-core/kern/emu/$(DEPDIR)/grub_render_label-argp_common.Po -rm -f grub-core/kern/emu/$(DEPDIR)/grub_render_label-hostfs.Po -rm -f grub-core/kern/emu/$(DEPDIR)/grub_script_check-argp_common.Po -rm -f grub-core/kern/emu/$(DEPDIR)/grub_sparc64_setup-argp_common.Po -rm -f grub-core/kern/emu/$(DEPDIR)/grub_syslinux2cfg-argp_common.Po -rm -f grub-core/kern/emu/$(DEPDIR)/grub_syslinux2cfg-hostfs.Po -rm -f grub-core/kern/emu/$(DEPDIR)/libgrubkern_a-hostdisk.Po -rm -f grub-core/kern/emu/$(DEPDIR)/libgrubkern_a-misc.Po -rm -f grub-core/kern/emu/$(DEPDIR)/libgrubkern_a-mm.Po -rm -f grub-core/kern/ia64/$(DEPDIR)/libgrubmods_a-dl_helper.Po -rm -f grub-core/kern/loongarch64/$(DEPDIR)/libgrubmods_a-dl_helper.Po -rm -f grub-core/lib/$(DEPDIR)/grub_bios_setup-reed_solomon.Po -rm -f grub-core/lib/$(DEPDIR)/grub_install-reed_solomon.Po -rm -f grub-core/lib/$(DEPDIR)/grub_menulst2cfg-legacy_parse.Po -rm -f grub-core/lib/$(DEPDIR)/grub_mknetdir-reed_solomon.Po -rm -f grub-core/lib/$(DEPDIR)/grub_mkrescue-reed_solomon.Po -rm -f grub-core/lib/$(DEPDIR)/grub_mkstandalone-reed_solomon.Po -rm -f grub-core/lib/$(DEPDIR)/grub_sparc64_setup-reed_solomon.Po -rm -f grub-core/lib/$(DEPDIR)/grub_syslinux2cfg-getline.Po -rm -f grub-core/lib/$(DEPDIR)/grub_syslinux2cfg-syslinux_parse.Po -rm -f grub-core/lib/$(DEPDIR)/libgrubkern_a-arg.Po -rm -f grub-core/lib/$(DEPDIR)/libgrubkern_a-crypto.Po -rm -f grub-core/lib/$(DEPDIR)/libgrubkern_a-disk.Po -rm -f grub-core/lib/$(DEPDIR)/libgrubkern_a-pbkdf2.Po -rm -f grub-core/lib/$(DEPDIR)/libgrubmods_a-LzFind.Po -rm -f grub-core/lib/$(DEPDIR)/libgrubmods_a-LzmaEnc.Po -rm -f grub-core/lib/$(DEPDIR)/libgrubmods_a-adler32.Po -rm -f grub-core/lib/$(DEPDIR)/libgrubmods_a-crc.Po -rm -f grub-core/lib/$(DEPDIR)/libgrubmods_a-crc64.Po -rm -f grub-core/lib/$(DEPDIR)/libgrubmods_a-datetime.Po -rm -f grub-core/lib/$(DEPDIR)/libgrubmods_a-envblk.Po -rm -f grub-core/lib/$(DEPDIR)/libgrubmods_a-hexdump.Po -rm -f grub-core/lib/$(DEPDIR)/priority_queue_unit_test-priority_queue.Po -rm -f grub-core/lib/i386/pc/$(DEPDIR)/grub_menulst2cfg-vesa_modes_table.Po -rm -f grub-core/lib/json/$(DEPDIR)/libgrubkern_a-json.Po -rm -f grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-arcfour.Po -rm -f grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-aria.Po -rm -f grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-blake2.Po -rm -f grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-blowfish.Po -rm -f grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-camellia-glue.Po -rm -f grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-camellia.Po -rm -f grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-cast5.Po -rm -f grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-crc.Po -rm -f grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-des.Po -rm -f grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-gost28147.Po -rm -f grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-gostr3411-94.Po -rm -f grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-hash-common.Po -rm -f grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-idea.Po -rm -f grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-init.Po -rm -f grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-keccak.Po -rm -f grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-md4.Po -rm -f grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-md5.Po -rm -f grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-rfc2268.Po -rm -f grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-rijndael.Po -rm -f grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-rmd160.Po -rm -f grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-salsa20.Po -rm -f grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-seed.Po -rm -f grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-serpent.Po -rm -f grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-sha1.Po -rm -f grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-sha256.Po -rm -f grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-sha512.Po -rm -f grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-sm3.Po -rm -f grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-sm4.Po -rm -f grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-stribog.Po -rm -f grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-tiger.Po -rm -f grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-twofish.Po -rm -f grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-whirlpool.Po -rm -f grub-core/lib/libgcrypt-grub/src/$(DEPDIR)/libgrubgcry_a-const-time.Po -rm -f grub-core/lib/minilzo/$(DEPDIR)/libgrubmods_a-minilzo.Po -rm -f grub-core/lib/tss2/$(DEPDIR)/grub_protect-buffer.Po -rm -f grub-core/lib/tss2/$(DEPDIR)/grub_protect-tpm2_cmd.Po -rm -f grub-core/lib/tss2/$(DEPDIR)/grub_protect-tss2_mu.Po -rm -f grub-core/lib/xzembed/$(DEPDIR)/libgrubmods_a-xz_dec_bcj.Po -rm -f grub-core/lib/xzembed/$(DEPDIR)/libgrubmods_a-xz_dec_lzma2.Po -rm -f grub-core/lib/xzembed/$(DEPDIR)/libgrubmods_a-xz_dec_stream.Po -rm -f grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-debug.Po -rm -f grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-entropy_common.Po -rm -f grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-error_private.Po -rm -f grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-fse_decompress.Po -rm -f grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-huf_decompress.Po -rm -f grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-module.Po -rm -f grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-xxhash.Po -rm -f grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-zstd_common.Po -rm -f grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-zstd_decompress.Po -rm -f grub-core/loader/$(DEPDIR)/grub_file-lzss.Po -rm -f grub-core/loader/$(DEPDIR)/grub_file-macho.Po -rm -f grub-core/loader/$(DEPDIR)/grub_file-macho32.Po -rm -f grub-core/loader/$(DEPDIR)/grub_file-macho64.Po -rm -f grub-core/loader/i386/$(DEPDIR)/grub_file-xen_file.Po -rm -f grub-core/loader/i386/$(DEPDIR)/grub_file-xen_file32.Po -rm -f grub-core/loader/i386/$(DEPDIR)/grub_file-xen_file64.Po -rm -f grub-core/normal/$(DEPDIR)/libgrubmods_a-charset.Po -rm -f grub-core/normal/$(DEPDIR)/libgrubmods_a-misc.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_bios_setup-blocklist.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_bios_setup-init.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_editenv-compress.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_editenv-config.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_editenv-init.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_file-init.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_fstest-init.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_glue_efi-init.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_install-blocklist.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_install-compress.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_install-config.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_install-init.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_install-ofpath.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_install-platform.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_install-platform_unix.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_install-random.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_macbless-init.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_menulst2cfg-init.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_mkfont-init.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_mkimage-config.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_mkimage-init.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_mklayout-init.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_mknetdir-blocklist.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_mknetdir-compress.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_mknetdir-config.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_mknetdir-init.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_mknetdir-ofpath.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_mknetdir-platform.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_mknetdir-platform_unix.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_mknetdir-random.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_mkpasswd_pbkdf2-init.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_mkpasswd_pbkdf2-random.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_mkrelpath-init.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_mkrescue-blocklist.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_mkrescue-compress.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_mkrescue-config.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_mkrescue-init.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_mkrescue-ofpath.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_mkrescue-platform.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_mkrescue-platform_unix.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_mkrescue-random.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_mkstandalone-blocklist.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_mkstandalone-compress.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_mkstandalone-config.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_mkstandalone-init.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_mkstandalone-ofpath.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_mkstandalone-platform.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_mkstandalone-platform_unix.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_mkstandalone-random.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_mount-init.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_ofpathname-init.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_ofpathname-ofpath.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_probe-init.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_probe-ofpath.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_protect-init.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_render_label-init.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_script_check-init.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_sparc64_setup-blocklist.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_sparc64_setup-init.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_sparc64_setup-ofpath.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_syslinux2cfg-init.Po -rm -f grub-core/osdep/$(DEPDIR)/libgrubkern_a-exec.Po -rm -f grub-core/osdep/$(DEPDIR)/libgrubkern_a-getroot.Po -rm -f grub-core/osdep/$(DEPDIR)/libgrubkern_a-hostdisk.Po -rm -f grub-core/osdep/$(DEPDIR)/libgrubkern_a-password.Po -rm -f grub-core/osdep/$(DEPDIR)/libgrubkern_a-relpath.Po -rm -f grub-core/osdep/$(DEPDIR)/libgrubkern_a-sleep.Po -rm -f grub-core/osdep/devmapper/$(DEPDIR)/libgrubkern_a-getroot.Po -rm -f grub-core/osdep/devmapper/$(DEPDIR)/libgrubkern_a-hostdisk.Po -rm -f grub-core/osdep/unix/$(DEPDIR)/libgrubkern_a-getroot.Po -rm -f grub-core/osdep/unix/$(DEPDIR)/libgrubkern_a-hostdisk.Po -rm -f grub-core/partmap/$(DEPDIR)/libgrubkern_a-gpt.Po -rm -f grub-core/partmap/$(DEPDIR)/libgrubkern_a-msdos.Po -rm -f grub-core/partmap/$(DEPDIR)/libgrubmods_a-acorn.Po -rm -f grub-core/partmap/$(DEPDIR)/libgrubmods_a-amiga.Po -rm -f grub-core/partmap/$(DEPDIR)/libgrubmods_a-apple.Po -rm -f grub-core/partmap/$(DEPDIR)/libgrubmods_a-bsdlabel.Po -rm -f grub-core/partmap/$(DEPDIR)/libgrubmods_a-dfly.Po -rm -f grub-core/partmap/$(DEPDIR)/libgrubmods_a-dvh.Po -rm -f grub-core/partmap/$(DEPDIR)/libgrubmods_a-plan.Po -rm -f grub-core/partmap/$(DEPDIR)/libgrubmods_a-sun.Po -rm -f grub-core/partmap/$(DEPDIR)/libgrubmods_a-sunpc.Po -rm -f grub-core/script/$(DEPDIR)/libgrubmods_a-argv.Po -rm -f grub-core/script/$(DEPDIR)/libgrubmods_a-function.Po -rm -f grub-core/script/$(DEPDIR)/libgrubmods_a-lexer.Po -rm -f grub-core/script/$(DEPDIR)/libgrubmods_a-main.Po -rm -f grub-core/script/$(DEPDIR)/libgrubmods_a-script.Po -rm -f grub-core/tests/lib/$(DEPDIR)/cmp_test-test.Po -rm -f grub-core/tests/lib/$(DEPDIR)/date_test-test.Po -rm -f grub-core/tests/lib/$(DEPDIR)/example_unit_test-test.Po -rm -f grub-core/tests/lib/$(DEPDIR)/printf_test-test.Po -rm -f grub-core/tests/lib/$(DEPDIR)/priority_queue_unit_test-test.Po -rm -f grub-core/video/$(DEPDIR)/libgrubmods_a-capture.Po -rm -f grub-core/video/$(DEPDIR)/libgrubmods_a-colors.Po -rm -f grub-core/video/$(DEPDIR)/libgrubmods_a-video.Po -rm -f grub-core/video/fb/$(DEPDIR)/libgrubmods_a-fbblit.Po -rm -f grub-core/video/fb/$(DEPDIR)/libgrubmods_a-fbfill.Po -rm -f grub-core/video/fb/$(DEPDIR)/libgrubmods_a-fbutil.Po -rm -f grub-core/video/fb/$(DEPDIR)/libgrubmods_a-video_fb.Po -rm -f tests/$(DEPDIR)/cmp_test-cmp_unit_test.Po -rm -f tests/$(DEPDIR)/date_test-date_unit_test.Po -rm -f tests/$(DEPDIR)/example_unit_test-example_unit_test.Po -rm -f tests/$(DEPDIR)/printf_test-printf_unit_test.Po -rm -f tests/$(DEPDIR)/priority_queue_unit_test-priority_queue_unit_test.Po -rm -f tests/lib/$(DEPDIR)/cmp_test-unit_test.Po -rm -f tests/lib/$(DEPDIR)/date_test-unit_test.Po -rm -f tests/lib/$(DEPDIR)/example_unit_test-unit_test.Po -rm -f tests/lib/$(DEPDIR)/printf_test-unit_test.Po -rm -f tests/lib/$(DEPDIR)/priority_queue_unit_test-unit_test.Po -rm -f util/$(DEPDIR)/grub_bios_setup-grub-setup.Po -rm -f util/$(DEPDIR)/grub_bios_setup-setup_bios.Po -rm -f util/$(DEPDIR)/grub_editenv-config.Po -rm -f util/$(DEPDIR)/grub_editenv-editenv.Po -rm -f util/$(DEPDIR)/grub_editenv-grub-editenv.Po -rm -f util/$(DEPDIR)/grub_editenv-grub-install-common.Po -rm -f util/$(DEPDIR)/grub_editenv-grub-mkimage32.Po -rm -f util/$(DEPDIR)/grub_editenv-grub-mkimage64.Po -rm -f util/$(DEPDIR)/grub_editenv-mkimage.Po -rm -f util/$(DEPDIR)/grub_editenv-resolve.Po -rm -f util/$(DEPDIR)/grub_file-grub-file.Po -rm -f util/$(DEPDIR)/grub_file-render-label.Po -rm -f util/$(DEPDIR)/grub_fstest-grub-fstest.Po -rm -f util/$(DEPDIR)/grub_glue_efi-glue-efi.Po -rm -f util/$(DEPDIR)/grub_glue_efi-grub-glue-efi.Po -rm -f util/$(DEPDIR)/grub_install-config.Po -rm -f util/$(DEPDIR)/grub_install-editenv.Po -rm -f util/$(DEPDIR)/grub_install-grub-install-common.Po -rm -f util/$(DEPDIR)/grub_install-grub-install.Po -rm -f util/$(DEPDIR)/grub_install-grub-mkimage32.Po -rm -f util/$(DEPDIR)/grub_install-grub-mkimage64.Po -rm -f util/$(DEPDIR)/grub_install-mkimage.Po -rm -f util/$(DEPDIR)/grub_install-probe.Po -rm -f util/$(DEPDIR)/grub_install-render-label.Po -rm -f util/$(DEPDIR)/grub_install-resolve.Po -rm -f util/$(DEPDIR)/grub_install-setup_bios.Po -rm -f util/$(DEPDIR)/grub_install-setup_sparc.Po -rm -f util/$(DEPDIR)/grub_macbless-grub-macbless.Po -rm -f util/$(DEPDIR)/grub_macho2img-grub-macho2img.Po -rm -f util/$(DEPDIR)/grub_menulst2cfg-grub-menulst2cfg.Po -rm -f util/$(DEPDIR)/grub_mkfont-grub-mkfont.Po -rm -f util/$(DEPDIR)/grub_mkimage-config.Po -rm -f util/$(DEPDIR)/grub_mkimage-grub-mkimage.Po -rm -f util/$(DEPDIR)/grub_mkimage-grub-mkimage32.Po -rm -f util/$(DEPDIR)/grub_mkimage-grub-mkimage64.Po -rm -f util/$(DEPDIR)/grub_mkimage-mkimage.Po -rm -f util/$(DEPDIR)/grub_mkimage-resolve.Po -rm -f util/$(DEPDIR)/grub_mklayout-grub-mklayout.Po -rm -f util/$(DEPDIR)/grub_mknetdir-config.Po -rm -f util/$(DEPDIR)/grub_mknetdir-editenv.Po -rm -f util/$(DEPDIR)/grub_mknetdir-grub-install-common.Po -rm -f util/$(DEPDIR)/grub_mknetdir-grub-mkimage32.Po -rm -f util/$(DEPDIR)/grub_mknetdir-grub-mkimage64.Po -rm -f util/$(DEPDIR)/grub_mknetdir-grub-mknetdir.Po -rm -f util/$(DEPDIR)/grub_mknetdir-mkimage.Po -rm -f util/$(DEPDIR)/grub_mknetdir-resolve.Po -rm -f util/$(DEPDIR)/grub_mknetdir-setup_bios.Po -rm -f util/$(DEPDIR)/grub_mknetdir-setup_sparc.Po -rm -f util/$(DEPDIR)/grub_mkpasswd_pbkdf2-grub-mkpasswd-pbkdf2.Po -rm -f util/$(DEPDIR)/grub_mkrelpath-grub-mkrelpath.Po -rm -f util/$(DEPDIR)/grub_mkrescue-config.Po -rm -f util/$(DEPDIR)/grub_mkrescue-editenv.Po -rm -f util/$(DEPDIR)/grub_mkrescue-glue-efi.Po -rm -f util/$(DEPDIR)/grub_mkrescue-grub-install-common.Po -rm -f util/$(DEPDIR)/grub_mkrescue-grub-mkimage32.Po -rm -f util/$(DEPDIR)/grub_mkrescue-grub-mkimage64.Po -rm -f util/$(DEPDIR)/grub_mkrescue-grub-mkrescue.Po -rm -f util/$(DEPDIR)/grub_mkrescue-mkimage.Po -rm -f util/$(DEPDIR)/grub_mkrescue-render-label.Po -rm -f util/$(DEPDIR)/grub_mkrescue-resolve.Po -rm -f util/$(DEPDIR)/grub_mkrescue-setup_bios.Po -rm -f util/$(DEPDIR)/grub_mkrescue-setup_sparc.Po -rm -f util/$(DEPDIR)/grub_mkstandalone-config.Po -rm -f util/$(DEPDIR)/grub_mkstandalone-editenv.Po -rm -f util/$(DEPDIR)/grub_mkstandalone-glue-efi.Po -rm -f util/$(DEPDIR)/grub_mkstandalone-grub-install-common.Po -rm -f util/$(DEPDIR)/grub_mkstandalone-grub-mkimage32.Po -rm -f util/$(DEPDIR)/grub_mkstandalone-grub-mkimage64.Po -rm -f util/$(DEPDIR)/grub_mkstandalone-grub-mkstandalone.Po -rm -f util/$(DEPDIR)/grub_mkstandalone-mkimage.Po -rm -f util/$(DEPDIR)/grub_mkstandalone-render-label.Po -rm -f util/$(DEPDIR)/grub_mkstandalone-resolve.Po -rm -f util/$(DEPDIR)/grub_mkstandalone-setup_bios.Po -rm -f util/$(DEPDIR)/grub_mkstandalone-setup_sparc.Po -rm -f util/$(DEPDIR)/grub_mount-grub-mount.Po -rm -f util/$(DEPDIR)/grub_probe-grub-probe.Po -rm -f util/$(DEPDIR)/grub_probe-probe.Po -rm -f util/$(DEPDIR)/grub_protect-grub-protect.Po -rm -f util/$(DEPDIR)/grub_protect-probe.Po -rm -f util/$(DEPDIR)/grub_render_label-grub-render-label.Po -rm -f util/$(DEPDIR)/grub_render_label-render-label.Po -rm -f util/$(DEPDIR)/grub_script_check-grub-script-check.Po -rm -f util/$(DEPDIR)/grub_sparc64_setup-grub-setup.Po -rm -f util/$(DEPDIR)/grub_sparc64_setup-setup_sparc.Po -rm -f util/$(DEPDIR)/grub_syslinux2cfg-grub-syslinux2cfg.Po -rm -f util/$(DEPDIR)/libgrubkern_a-getroot.Po -rm -f util/$(DEPDIR)/libgrubkern_a-misc.Po -rm -f util/ieee1275/$(DEPDIR)/grub_ofpathname-grub-ofpathname.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-hdr distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dist_grubconfDATA install-grubconfSCRIPTS \ install-man install-nodist_platformHEADERS install-pkgdataDATA \ install-platformDATA install-platformPROGRAMS \ install-platformSCRIPTS install-starfieldDATA install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-binPROGRAMS install-binSCRIPTS \ install-sbinPROGRAMS install-sbinSCRIPTS install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-man1 install-man8 install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f ./$(DEPDIR)/grub_fstest-grub_fstest_init.Po -rm -f ./$(DEPDIR)/grub_mount-grub_fstest_init.Po -rm -f ./$(DEPDIR)/libgrubmods_a-grub_script.tab.Po -rm -f ./$(DEPDIR)/libgrubmods_a-grub_script.yy.Po -rm -f ./$(DEPDIR)/libgrubmods_a-libgrub_a_init.Po -rm -f grub-core/$(DEPDIR)/libgrubmods_a-unidata.Po -rm -f grub-core/commands/$(DEPDIR)/grub_file-file.Po -rm -f grub-core/commands/$(DEPDIR)/grub_file-file32.Po -rm -f grub-core/commands/$(DEPDIR)/grub_file-file64.Po -rm -f grub-core/commands/$(DEPDIR)/libgrubkern_a-extcmd.Po -rm -f grub-core/commands/$(DEPDIR)/libgrubmods_a-blocklist.Po -rm -f grub-core/commands/$(DEPDIR)/libgrubmods_a-ls.Po -rm -f grub-core/commands/$(DEPDIR)/libgrubmods_a-macbless.Po -rm -f grub-core/commands/$(DEPDIR)/libgrubmods_a-testload.Po -rm -f grub-core/commands/$(DEPDIR)/libgrubmods_a-xnu_uuid.Po -rm -f grub-core/commands/tpm2_key_protector/$(DEPDIR)/grub_protect-args.Po -rm -f grub-core/commands/tpm2_key_protector/$(DEPDIR)/grub_protect-tpm2key_asn1_tab.Po -rm -f grub-core/disk/$(DEPDIR)/grub_file-host.Po -rm -f grub-core/disk/$(DEPDIR)/grub_fstest-host.Po -rm -f grub-core/disk/$(DEPDIR)/grub_install-host.Po -rm -f grub-core/disk/$(DEPDIR)/grub_mkrescue-host.Po -rm -f grub-core/disk/$(DEPDIR)/grub_mkstandalone-host.Po -rm -f grub-core/disk/$(DEPDIR)/grub_mount-host.Po -rm -f grub-core/disk/$(DEPDIR)/grub_render_label-host.Po -rm -f grub-core/disk/$(DEPDIR)/grub_syslinux2cfg-host.Po -rm -f grub-core/disk/$(DEPDIR)/libgrubkern_a-AFSplitter.Po -rm -f grub-core/disk/$(DEPDIR)/libgrubkern_a-cryptodisk.Po -rm -f grub-core/disk/$(DEPDIR)/libgrubkern_a-diskfilter.Po -rm -f grub-core/disk/$(DEPDIR)/libgrubkern_a-geli.Po -rm -f grub-core/disk/$(DEPDIR)/libgrubkern_a-key_protector.Po -rm -f grub-core/disk/$(DEPDIR)/libgrubkern_a-ldm.Po -rm -f grub-core/disk/$(DEPDIR)/libgrubkern_a-luks.Po -rm -f grub-core/disk/$(DEPDIR)/libgrubkern_a-luks2.Po -rm -f grub-core/disk/$(DEPDIR)/libgrubmods_a-dmraid_nvidia.Po -rm -f grub-core/disk/$(DEPDIR)/libgrubmods_a-loopback.Po -rm -f grub-core/disk/$(DEPDIR)/libgrubmods_a-lvm.Po -rm -f grub-core/disk/$(DEPDIR)/libgrubmods_a-mdraid1x_linux.Po -rm -f grub-core/disk/$(DEPDIR)/libgrubmods_a-mdraid_linux.Po -rm -f grub-core/disk/$(DEPDIR)/libgrubmods_a-mdraid_linux_be.Po -rm -f grub-core/disk/$(DEPDIR)/libgrubmods_a-raid5_recover.Po -rm -f grub-core/disk/$(DEPDIR)/libgrubmods_a-raid6_recover.Po -rm -f grub-core/font/$(DEPDIR)/libgrubmods_a-font.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubkern_a-archelp.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubkern_a-proc.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-affs.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-afs.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-bfs.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-btrfs.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-cbfs.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-cpio.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-cpio_be.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-erofs.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-exfat.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-ext2.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-f2fs.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-fat.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-fshelp.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-hfs.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-hfsplus.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-hfspluscomp.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-iso9660.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-jfs.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-minix.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-minix2.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-minix2_be.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-minix3.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-minix3_be.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-minix_be.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-newc.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-nilfs2.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-ntfs.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-ntfscomp.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-odc.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-reiserfs.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-romfs.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-sfs.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-squash4.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-tar.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-udf.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-ufs.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-ufs2.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-ufs_be.Po -rm -f grub-core/fs/$(DEPDIR)/libgrubmods_a-xfs.Po -rm -f grub-core/fs/zfs/$(DEPDIR)/libgrubmods_a-zfs.Po -rm -f grub-core/fs/zfs/$(DEPDIR)/libgrubmods_a-zfs_fletcher.Po -rm -f grub-core/fs/zfs/$(DEPDIR)/libgrubmods_a-zfs_lz4.Po -rm -f grub-core/fs/zfs/$(DEPDIR)/libgrubmods_a-zfs_lzjb.Po -rm -f grub-core/fs/zfs/$(DEPDIR)/libgrubmods_a-zfs_sha256.Po -rm -f grub-core/fs/zfs/$(DEPDIR)/libgrubmods_a-zfscrypt.Po -rm -f grub-core/fs/zfs/$(DEPDIR)/libgrubmods_a-zfsinfo.Po -rm -f grub-core/gfxmenu/$(DEPDIR)/libgrubmods_a-font.Po -rm -f grub-core/io/$(DEPDIR)/grub_file-offset.Po -rm -f grub-core/io/$(DEPDIR)/libgrubmods_a-bufio.Po -rm -f grub-core/io/$(DEPDIR)/libgrubmods_a-gzio.Po -rm -f grub-core/io/$(DEPDIR)/libgrubmods_a-lzopio.Po -rm -f grub-core/io/$(DEPDIR)/libgrubmods_a-xzio.Po -rm -f grub-core/kern/$(DEPDIR)/cmp_test-list.Po -rm -f grub-core/kern/$(DEPDIR)/cmp_test-misc.Po -rm -f grub-core/kern/$(DEPDIR)/date_test-list.Po -rm -f grub-core/kern/$(DEPDIR)/date_test-misc.Po -rm -f grub-core/kern/$(DEPDIR)/example_unit_test-list.Po -rm -f grub-core/kern/$(DEPDIR)/example_unit_test-misc.Po -rm -f grub-core/kern/$(DEPDIR)/grub_file-elf.Po -rm -f grub-core/kern/$(DEPDIR)/libgrubkern_a-command.Po -rm -f grub-core/kern/$(DEPDIR)/libgrubkern_a-device.Po -rm -f grub-core/kern/$(DEPDIR)/libgrubkern_a-disk.Po -rm -f grub-core/kern/$(DEPDIR)/libgrubkern_a-env.Po -rm -f grub-core/kern/$(DEPDIR)/libgrubkern_a-err.Po -rm -f grub-core/kern/$(DEPDIR)/libgrubkern_a-file.Po -rm -f grub-core/kern/$(DEPDIR)/libgrubkern_a-fs.Po -rm -f grub-core/kern/$(DEPDIR)/libgrubkern_a-list.Po -rm -f grub-core/kern/$(DEPDIR)/libgrubkern_a-misc.Po -rm -f grub-core/kern/$(DEPDIR)/libgrubkern_a-partition.Po -rm -f grub-core/kern/$(DEPDIR)/printf_test-list.Po -rm -f grub-core/kern/$(DEPDIR)/printf_test-misc.Po -rm -f grub-core/kern/$(DEPDIR)/priority_queue_unit_test-list.Po -rm -f grub-core/kern/$(DEPDIR)/priority_queue_unit_test-misc.Po -rm -f grub-core/kern/arm/$(DEPDIR)/libgrubmods_a-dl_helper.Po -rm -f grub-core/kern/arm64/$(DEPDIR)/libgrubmods_a-dl_helper.Po -rm -f grub-core/kern/emu/$(DEPDIR)/grub_bios_setup-argp_common.Po -rm -f grub-core/kern/emu/$(DEPDIR)/grub_file-hostfs.Po -rm -f grub-core/kern/emu/$(DEPDIR)/grub_fstest-hostfs.Po -rm -f grub-core/kern/emu/$(DEPDIR)/grub_glue_efi-argp_common.Po -rm -f grub-core/kern/emu/$(DEPDIR)/grub_install-argp_common.Po -rm -f grub-core/kern/emu/$(DEPDIR)/grub_install-hostfs.Po -rm -f grub-core/kern/emu/$(DEPDIR)/grub_macbless-argp_common.Po -rm -f grub-core/kern/emu/$(DEPDIR)/grub_mkfont-argp_common.Po -rm -f grub-core/kern/emu/$(DEPDIR)/grub_mkimage-argp_common.Po -rm -f grub-core/kern/emu/$(DEPDIR)/grub_mklayout-argp_common.Po -rm -f grub-core/kern/emu/$(DEPDIR)/grub_mknetdir-argp_common.Po -rm -f grub-core/kern/emu/$(DEPDIR)/grub_mkpasswd_pbkdf2-argp_common.Po -rm -f grub-core/kern/emu/$(DEPDIR)/grub_mkrelpath-argp_common.Po -rm -f grub-core/kern/emu/$(DEPDIR)/grub_mkrescue-argp_common.Po -rm -f grub-core/kern/emu/$(DEPDIR)/grub_mkrescue-hostfs.Po -rm -f grub-core/kern/emu/$(DEPDIR)/grub_mkstandalone-argp_common.Po -rm -f grub-core/kern/emu/$(DEPDIR)/grub_mkstandalone-hostfs.Po -rm -f grub-core/kern/emu/$(DEPDIR)/grub_mount-hostfs.Po -rm -f grub-core/kern/emu/$(DEPDIR)/grub_probe-argp_common.Po -rm -f grub-core/kern/emu/$(DEPDIR)/grub_protect-argp_common.Po -rm -f grub-core/kern/emu/$(DEPDIR)/grub_render_label-argp_common.Po -rm -f grub-core/kern/emu/$(DEPDIR)/grub_render_label-hostfs.Po -rm -f grub-core/kern/emu/$(DEPDIR)/grub_script_check-argp_common.Po -rm -f grub-core/kern/emu/$(DEPDIR)/grub_sparc64_setup-argp_common.Po -rm -f grub-core/kern/emu/$(DEPDIR)/grub_syslinux2cfg-argp_common.Po -rm -f grub-core/kern/emu/$(DEPDIR)/grub_syslinux2cfg-hostfs.Po -rm -f grub-core/kern/emu/$(DEPDIR)/libgrubkern_a-hostdisk.Po -rm -f grub-core/kern/emu/$(DEPDIR)/libgrubkern_a-misc.Po -rm -f grub-core/kern/emu/$(DEPDIR)/libgrubkern_a-mm.Po -rm -f grub-core/kern/ia64/$(DEPDIR)/libgrubmods_a-dl_helper.Po -rm -f grub-core/kern/loongarch64/$(DEPDIR)/libgrubmods_a-dl_helper.Po -rm -f grub-core/lib/$(DEPDIR)/grub_bios_setup-reed_solomon.Po -rm -f grub-core/lib/$(DEPDIR)/grub_install-reed_solomon.Po -rm -f grub-core/lib/$(DEPDIR)/grub_menulst2cfg-legacy_parse.Po -rm -f grub-core/lib/$(DEPDIR)/grub_mknetdir-reed_solomon.Po -rm -f grub-core/lib/$(DEPDIR)/grub_mkrescue-reed_solomon.Po -rm -f grub-core/lib/$(DEPDIR)/grub_mkstandalone-reed_solomon.Po -rm -f grub-core/lib/$(DEPDIR)/grub_sparc64_setup-reed_solomon.Po -rm -f grub-core/lib/$(DEPDIR)/grub_syslinux2cfg-getline.Po -rm -f grub-core/lib/$(DEPDIR)/grub_syslinux2cfg-syslinux_parse.Po -rm -f grub-core/lib/$(DEPDIR)/libgrubkern_a-arg.Po -rm -f grub-core/lib/$(DEPDIR)/libgrubkern_a-crypto.Po -rm -f grub-core/lib/$(DEPDIR)/libgrubkern_a-disk.Po -rm -f grub-core/lib/$(DEPDIR)/libgrubkern_a-pbkdf2.Po -rm -f grub-core/lib/$(DEPDIR)/libgrubmods_a-LzFind.Po -rm -f grub-core/lib/$(DEPDIR)/libgrubmods_a-LzmaEnc.Po -rm -f grub-core/lib/$(DEPDIR)/libgrubmods_a-adler32.Po -rm -f grub-core/lib/$(DEPDIR)/libgrubmods_a-crc.Po -rm -f grub-core/lib/$(DEPDIR)/libgrubmods_a-crc64.Po -rm -f grub-core/lib/$(DEPDIR)/libgrubmods_a-datetime.Po -rm -f grub-core/lib/$(DEPDIR)/libgrubmods_a-envblk.Po -rm -f grub-core/lib/$(DEPDIR)/libgrubmods_a-hexdump.Po -rm -f grub-core/lib/$(DEPDIR)/priority_queue_unit_test-priority_queue.Po -rm -f grub-core/lib/i386/pc/$(DEPDIR)/grub_menulst2cfg-vesa_modes_table.Po -rm -f grub-core/lib/json/$(DEPDIR)/libgrubkern_a-json.Po -rm -f grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-arcfour.Po -rm -f grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-aria.Po -rm -f grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-blake2.Po -rm -f grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-blowfish.Po -rm -f grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-camellia-glue.Po -rm -f grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-camellia.Po -rm -f grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-cast5.Po -rm -f grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-crc.Po -rm -f grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-des.Po -rm -f grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-gost28147.Po -rm -f grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-gostr3411-94.Po -rm -f grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-hash-common.Po -rm -f grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-idea.Po -rm -f grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-init.Po -rm -f grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-keccak.Po -rm -f grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-md4.Po -rm -f grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-md5.Po -rm -f grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-rfc2268.Po -rm -f grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-rijndael.Po -rm -f grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-rmd160.Po -rm -f grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-salsa20.Po -rm -f grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-seed.Po -rm -f grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-serpent.Po -rm -f grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-sha1.Po -rm -f grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-sha256.Po -rm -f grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-sha512.Po -rm -f grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-sm3.Po -rm -f grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-sm4.Po -rm -f grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-stribog.Po -rm -f grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-tiger.Po -rm -f grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-twofish.Po -rm -f grub-core/lib/libgcrypt-grub/cipher/$(DEPDIR)/libgrubgcry_a-whirlpool.Po -rm -f grub-core/lib/libgcrypt-grub/src/$(DEPDIR)/libgrubgcry_a-const-time.Po -rm -f grub-core/lib/minilzo/$(DEPDIR)/libgrubmods_a-minilzo.Po -rm -f grub-core/lib/tss2/$(DEPDIR)/grub_protect-buffer.Po -rm -f grub-core/lib/tss2/$(DEPDIR)/grub_protect-tpm2_cmd.Po -rm -f grub-core/lib/tss2/$(DEPDIR)/grub_protect-tss2_mu.Po -rm -f grub-core/lib/xzembed/$(DEPDIR)/libgrubmods_a-xz_dec_bcj.Po -rm -f grub-core/lib/xzembed/$(DEPDIR)/libgrubmods_a-xz_dec_lzma2.Po -rm -f grub-core/lib/xzembed/$(DEPDIR)/libgrubmods_a-xz_dec_stream.Po -rm -f grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-debug.Po -rm -f grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-entropy_common.Po -rm -f grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-error_private.Po -rm -f grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-fse_decompress.Po -rm -f grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-huf_decompress.Po -rm -f grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-module.Po -rm -f grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-xxhash.Po -rm -f grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-zstd_common.Po -rm -f grub-core/lib/zstd/$(DEPDIR)/libgrubmods_a-zstd_decompress.Po -rm -f grub-core/loader/$(DEPDIR)/grub_file-lzss.Po -rm -f grub-core/loader/$(DEPDIR)/grub_file-macho.Po -rm -f grub-core/loader/$(DEPDIR)/grub_file-macho32.Po -rm -f grub-core/loader/$(DEPDIR)/grub_file-macho64.Po -rm -f grub-core/loader/i386/$(DEPDIR)/grub_file-xen_file.Po -rm -f grub-core/loader/i386/$(DEPDIR)/grub_file-xen_file32.Po -rm -f grub-core/loader/i386/$(DEPDIR)/grub_file-xen_file64.Po -rm -f grub-core/normal/$(DEPDIR)/libgrubmods_a-charset.Po -rm -f grub-core/normal/$(DEPDIR)/libgrubmods_a-misc.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_bios_setup-blocklist.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_bios_setup-init.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_editenv-compress.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_editenv-config.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_editenv-init.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_file-init.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_fstest-init.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_glue_efi-init.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_install-blocklist.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_install-compress.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_install-config.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_install-init.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_install-ofpath.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_install-platform.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_install-platform_unix.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_install-random.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_macbless-init.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_menulst2cfg-init.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_mkfont-init.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_mkimage-config.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_mkimage-init.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_mklayout-init.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_mknetdir-blocklist.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_mknetdir-compress.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_mknetdir-config.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_mknetdir-init.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_mknetdir-ofpath.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_mknetdir-platform.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_mknetdir-platform_unix.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_mknetdir-random.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_mkpasswd_pbkdf2-init.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_mkpasswd_pbkdf2-random.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_mkrelpath-init.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_mkrescue-blocklist.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_mkrescue-compress.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_mkrescue-config.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_mkrescue-init.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_mkrescue-ofpath.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_mkrescue-platform.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_mkrescue-platform_unix.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_mkrescue-random.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_mkstandalone-blocklist.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_mkstandalone-compress.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_mkstandalone-config.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_mkstandalone-init.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_mkstandalone-ofpath.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_mkstandalone-platform.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_mkstandalone-platform_unix.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_mkstandalone-random.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_mount-init.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_ofpathname-init.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_ofpathname-ofpath.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_probe-init.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_probe-ofpath.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_protect-init.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_render_label-init.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_script_check-init.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_sparc64_setup-blocklist.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_sparc64_setup-init.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_sparc64_setup-ofpath.Po -rm -f grub-core/osdep/$(DEPDIR)/grub_syslinux2cfg-init.Po -rm -f grub-core/osdep/$(DEPDIR)/libgrubkern_a-exec.Po -rm -f grub-core/osdep/$(DEPDIR)/libgrubkern_a-getroot.Po -rm -f grub-core/osdep/$(DEPDIR)/libgrubkern_a-hostdisk.Po -rm -f grub-core/osdep/$(DEPDIR)/libgrubkern_a-password.Po -rm -f grub-core/osdep/$(DEPDIR)/libgrubkern_a-relpath.Po -rm -f grub-core/osdep/$(DEPDIR)/libgrubkern_a-sleep.Po -rm -f grub-core/osdep/devmapper/$(DEPDIR)/libgrubkern_a-getroot.Po -rm -f grub-core/osdep/devmapper/$(DEPDIR)/libgrubkern_a-hostdisk.Po -rm -f grub-core/osdep/unix/$(DEPDIR)/libgrubkern_a-getroot.Po -rm -f grub-core/osdep/unix/$(DEPDIR)/libgrubkern_a-hostdisk.Po -rm -f grub-core/partmap/$(DEPDIR)/libgrubkern_a-gpt.Po -rm -f grub-core/partmap/$(DEPDIR)/libgrubkern_a-msdos.Po -rm -f grub-core/partmap/$(DEPDIR)/libgrubmods_a-acorn.Po -rm -f grub-core/partmap/$(DEPDIR)/libgrubmods_a-amiga.Po -rm -f grub-core/partmap/$(DEPDIR)/libgrubmods_a-apple.Po -rm -f grub-core/partmap/$(DEPDIR)/libgrubmods_a-bsdlabel.Po -rm -f grub-core/partmap/$(DEPDIR)/libgrubmods_a-dfly.Po -rm -f grub-core/partmap/$(DEPDIR)/libgrubmods_a-dvh.Po -rm -f grub-core/partmap/$(DEPDIR)/libgrubmods_a-plan.Po -rm -f grub-core/partmap/$(DEPDIR)/libgrubmods_a-sun.Po -rm -f grub-core/partmap/$(DEPDIR)/libgrubmods_a-sunpc.Po -rm -f grub-core/script/$(DEPDIR)/libgrubmods_a-argv.Po -rm -f grub-core/script/$(DEPDIR)/libgrubmods_a-function.Po -rm -f grub-core/script/$(DEPDIR)/libgrubmods_a-lexer.Po -rm -f grub-core/script/$(DEPDIR)/libgrubmods_a-main.Po -rm -f grub-core/script/$(DEPDIR)/libgrubmods_a-script.Po -rm -f grub-core/tests/lib/$(DEPDIR)/cmp_test-test.Po -rm -f grub-core/tests/lib/$(DEPDIR)/date_test-test.Po -rm -f grub-core/tests/lib/$(DEPDIR)/example_unit_test-test.Po -rm -f grub-core/tests/lib/$(DEPDIR)/printf_test-test.Po -rm -f grub-core/tests/lib/$(DEPDIR)/priority_queue_unit_test-test.Po -rm -f grub-core/video/$(DEPDIR)/libgrubmods_a-capture.Po -rm -f grub-core/video/$(DEPDIR)/libgrubmods_a-colors.Po -rm -f grub-core/video/$(DEPDIR)/libgrubmods_a-video.Po -rm -f grub-core/video/fb/$(DEPDIR)/libgrubmods_a-fbblit.Po -rm -f grub-core/video/fb/$(DEPDIR)/libgrubmods_a-fbfill.Po -rm -f grub-core/video/fb/$(DEPDIR)/libgrubmods_a-fbutil.Po -rm -f grub-core/video/fb/$(DEPDIR)/libgrubmods_a-video_fb.Po -rm -f tests/$(DEPDIR)/cmp_test-cmp_unit_test.Po -rm -f tests/$(DEPDIR)/date_test-date_unit_test.Po -rm -f tests/$(DEPDIR)/example_unit_test-example_unit_test.Po -rm -f tests/$(DEPDIR)/printf_test-printf_unit_test.Po -rm -f tests/$(DEPDIR)/priority_queue_unit_test-priority_queue_unit_test.Po -rm -f tests/lib/$(DEPDIR)/cmp_test-unit_test.Po -rm -f tests/lib/$(DEPDIR)/date_test-unit_test.Po -rm -f tests/lib/$(DEPDIR)/example_unit_test-unit_test.Po -rm -f tests/lib/$(DEPDIR)/printf_test-unit_test.Po -rm -f tests/lib/$(DEPDIR)/priority_queue_unit_test-unit_test.Po -rm -f util/$(DEPDIR)/grub_bios_setup-grub-setup.Po -rm -f util/$(DEPDIR)/grub_bios_setup-setup_bios.Po -rm -f util/$(DEPDIR)/grub_editenv-config.Po -rm -f util/$(DEPDIR)/grub_editenv-editenv.Po -rm -f util/$(DEPDIR)/grub_editenv-grub-editenv.Po -rm -f util/$(DEPDIR)/grub_editenv-grub-install-common.Po -rm -f util/$(DEPDIR)/grub_editenv-grub-mkimage32.Po -rm -f util/$(DEPDIR)/grub_editenv-grub-mkimage64.Po -rm -f util/$(DEPDIR)/grub_editenv-mkimage.Po -rm -f util/$(DEPDIR)/grub_editenv-resolve.Po -rm -f util/$(DEPDIR)/grub_file-grub-file.Po -rm -f util/$(DEPDIR)/grub_file-render-label.Po -rm -f util/$(DEPDIR)/grub_fstest-grub-fstest.Po -rm -f util/$(DEPDIR)/grub_glue_efi-glue-efi.Po -rm -f util/$(DEPDIR)/grub_glue_efi-grub-glue-efi.Po -rm -f util/$(DEPDIR)/grub_install-config.Po -rm -f util/$(DEPDIR)/grub_install-editenv.Po -rm -f util/$(DEPDIR)/grub_install-grub-install-common.Po -rm -f util/$(DEPDIR)/grub_install-grub-install.Po -rm -f util/$(DEPDIR)/grub_install-grub-mkimage32.Po -rm -f util/$(DEPDIR)/grub_install-grub-mkimage64.Po -rm -f util/$(DEPDIR)/grub_install-mkimage.Po -rm -f util/$(DEPDIR)/grub_install-probe.Po -rm -f util/$(DEPDIR)/grub_install-render-label.Po -rm -f util/$(DEPDIR)/grub_install-resolve.Po -rm -f util/$(DEPDIR)/grub_install-setup_bios.Po -rm -f util/$(DEPDIR)/grub_install-setup_sparc.Po -rm -f util/$(DEPDIR)/grub_macbless-grub-macbless.Po -rm -f util/$(DEPDIR)/grub_macho2img-grub-macho2img.Po -rm -f util/$(DEPDIR)/grub_menulst2cfg-grub-menulst2cfg.Po -rm -f util/$(DEPDIR)/grub_mkfont-grub-mkfont.Po -rm -f util/$(DEPDIR)/grub_mkimage-config.Po -rm -f util/$(DEPDIR)/grub_mkimage-grub-mkimage.Po -rm -f util/$(DEPDIR)/grub_mkimage-grub-mkimage32.Po -rm -f util/$(DEPDIR)/grub_mkimage-grub-mkimage64.Po -rm -f util/$(DEPDIR)/grub_mkimage-mkimage.Po -rm -f util/$(DEPDIR)/grub_mkimage-resolve.Po -rm -f util/$(DEPDIR)/grub_mklayout-grub-mklayout.Po -rm -f util/$(DEPDIR)/grub_mknetdir-config.Po -rm -f util/$(DEPDIR)/grub_mknetdir-editenv.Po -rm -f util/$(DEPDIR)/grub_mknetdir-grub-install-common.Po -rm -f util/$(DEPDIR)/grub_mknetdir-grub-mkimage32.Po -rm -f util/$(DEPDIR)/grub_mknetdir-grub-mkimage64.Po -rm -f util/$(DEPDIR)/grub_mknetdir-grub-mknetdir.Po -rm -f util/$(DEPDIR)/grub_mknetdir-mkimage.Po -rm -f util/$(DEPDIR)/grub_mknetdir-resolve.Po -rm -f util/$(DEPDIR)/grub_mknetdir-setup_bios.Po -rm -f util/$(DEPDIR)/grub_mknetdir-setup_sparc.Po -rm -f util/$(DEPDIR)/grub_mkpasswd_pbkdf2-grub-mkpasswd-pbkdf2.Po -rm -f util/$(DEPDIR)/grub_mkrelpath-grub-mkrelpath.Po -rm -f util/$(DEPDIR)/grub_mkrescue-config.Po -rm -f util/$(DEPDIR)/grub_mkrescue-editenv.Po -rm -f util/$(DEPDIR)/grub_mkrescue-glue-efi.Po -rm -f util/$(DEPDIR)/grub_mkrescue-grub-install-common.Po -rm -f util/$(DEPDIR)/grub_mkrescue-grub-mkimage32.Po -rm -f util/$(DEPDIR)/grub_mkrescue-grub-mkimage64.Po -rm -f util/$(DEPDIR)/grub_mkrescue-grub-mkrescue.Po -rm -f util/$(DEPDIR)/grub_mkrescue-mkimage.Po -rm -f util/$(DEPDIR)/grub_mkrescue-render-label.Po -rm -f util/$(DEPDIR)/grub_mkrescue-resolve.Po -rm -f util/$(DEPDIR)/grub_mkrescue-setup_bios.Po -rm -f util/$(DEPDIR)/grub_mkrescue-setup_sparc.Po -rm -f util/$(DEPDIR)/grub_mkstandalone-config.Po -rm -f util/$(DEPDIR)/grub_mkstandalone-editenv.Po -rm -f util/$(DEPDIR)/grub_mkstandalone-glue-efi.Po -rm -f util/$(DEPDIR)/grub_mkstandalone-grub-install-common.Po -rm -f util/$(DEPDIR)/grub_mkstandalone-grub-mkimage32.Po -rm -f util/$(DEPDIR)/grub_mkstandalone-grub-mkimage64.Po -rm -f util/$(DEPDIR)/grub_mkstandalone-grub-mkstandalone.Po -rm -f util/$(DEPDIR)/grub_mkstandalone-mkimage.Po -rm -f util/$(DEPDIR)/grub_mkstandalone-render-label.Po -rm -f util/$(DEPDIR)/grub_mkstandalone-resolve.Po -rm -f util/$(DEPDIR)/grub_mkstandalone-setup_bios.Po -rm -f util/$(DEPDIR)/grub_mkstandalone-setup_sparc.Po -rm -f util/$(DEPDIR)/grub_mount-grub-mount.Po -rm -f util/$(DEPDIR)/grub_probe-grub-probe.Po -rm -f util/$(DEPDIR)/grub_probe-probe.Po -rm -f util/$(DEPDIR)/grub_protect-grub-protect.Po -rm -f util/$(DEPDIR)/grub_protect-probe.Po -rm -f util/$(DEPDIR)/grub_render_label-grub-render-label.Po -rm -f util/$(DEPDIR)/grub_render_label-render-label.Po -rm -f util/$(DEPDIR)/grub_script_check-grub-script-check.Po -rm -f util/$(DEPDIR)/grub_sparc64_setup-grub-setup.Po -rm -f util/$(DEPDIR)/grub_sparc64_setup-setup_sparc.Po -rm -f util/$(DEPDIR)/grub_syslinux2cfg-grub-syslinux2cfg.Po -rm -f util/$(DEPDIR)/libgrubkern_a-getroot.Po -rm -f util/$(DEPDIR)/libgrubkern_a-misc.Po -rm -f util/ieee1275/$(DEPDIR)/grub_ofpathname-grub-ofpathname.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-binSCRIPTS \ uninstall-dist_grubconfDATA uninstall-grubconfSCRIPTS \ uninstall-man uninstall-nodist_platformHEADERS \ uninstall-pkgdataDATA uninstall-platformDATA \ uninstall-platformPROGRAMS uninstall-platformSCRIPTS \ uninstall-sbinPROGRAMS uninstall-sbinSCRIPTS \ uninstall-starfieldDATA uninstall-man: uninstall-man1 uninstall-man8 .MAKE: $(am__recursive_targets) all check check-am install install-am \ install-exec install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ am--depfiles am--refresh check check-TESTS check-am clean \ clean-binPROGRAMS clean-checkPROGRAMS clean-cscope \ clean-generic clean-noinstLIBRARIES clean-noinstPROGRAMS \ clean-platformPROGRAMS clean-sbinPROGRAMS cscope cscopelist-am \ ctags ctags-am dist dist-all dist-bzip2 dist-gzip dist-lzip \ dist-shar dist-tarZ dist-xz dist-zip dist-zstd distcheck \ distclean distclean-compile distclean-generic distclean-hdr \ distclean-tags distcleancheck distdir distuninstallcheck dvi \ dvi-am html html-am info info-am install install-am \ install-binPROGRAMS install-binSCRIPTS install-data \ install-data-am install-dist_grubconfDATA install-dvi \ install-dvi-am install-exec install-exec-am \ install-grubconfSCRIPTS install-html install-html-am \ install-info install-info-am install-man install-man1 \ install-man8 install-nodist_platformHEADERS install-pdf \ install-pdf-am install-pkgdataDATA install-platformDATA \ install-platformPROGRAMS install-platformSCRIPTS install-ps \ install-ps-am install-sbinPROGRAMS install-sbinSCRIPTS \ install-starfieldDATA install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am recheck tags tags-am \ uninstall uninstall-am uninstall-binPROGRAMS \ uninstall-binSCRIPTS uninstall-dist_grubconfDATA \ uninstall-grubconfSCRIPTS uninstall-man uninstall-man1 \ uninstall-man8 uninstall-nodist_platformHEADERS \ uninstall-pkgdataDATA uninstall-platformDATA \ uninstall-platformPROGRAMS uninstall-platformSCRIPTS \ uninstall-sbinPROGRAMS uninstall-sbinSCRIPTS \ uninstall-starfieldDATA .PRECIOUS: Makefile export LC_COLLATE := C unexport LC_ALL # Rules for Automake input .PRECIOUS: $(top_srcdir)/Makefile.util.am $(top_srcdir)/Makefile.util.am: $(top_srcdir)/gentpl.py $(top_srcdir)/Makefile.util.def $(top_srcdir)/Makefile.utilgcry.def $(PYTHON) $^ > $@.new || (rm -f $@.new; exit 1) mv $@.new $@ .PRECIOUS: $(top_srcdir)/grub-core/Makefile.core.am $(top_srcdir)/grub-core/Makefile.core.am: $(top_srcdir)/gentpl.py $(top_srcdir)/grub-core/Makefile.core.def $(top_srcdir)/grub-core/Makefile.gcry.def if [ "x$$GRUB_CONTRIB" != x ]; then echo "You need to run ./bootstrap manually." >&2; exit 1; fi $(PYTHON) $^ > $@.new || (rm -f $@.new; exit 1) mv $@.new $@ @COND_MAN_PAGES_TRUE@grub-mkimage.1: grub-mkimage @COND_MAN_PAGES_TRUE@ chmod a+x grub-mkimage @COND_MAN_PAGES_TRUE@ PATH=$(builddir):$$PATH pkgdatadir=$(builddir) $(HELP2MAN) --section=1 -i $(top_srcdir)/docs/man/grub-mkimage.h2m -o $@ grub-mkimage @COND_GRUB_PROTECT_TRUE@@COND_MAN_PAGES_TRUE@grub-protect.1: grub-protect @COND_GRUB_PROTECT_TRUE@@COND_MAN_PAGES_TRUE@ chmod a+x grub-protect @COND_GRUB_PROTECT_TRUE@@COND_MAN_PAGES_TRUE@ PATH=$(builddir):$$PATH pkgdatadir=$(builddir) $(HELP2MAN) --section=1 -i $(top_srcdir)/docs/man/grub-protect.h2m -o $@ grub-protect @COND_MAN_PAGES_TRUE@grub-mkrelpath.1: grub-mkrelpath @COND_MAN_PAGES_TRUE@ chmod a+x grub-mkrelpath @COND_MAN_PAGES_TRUE@ PATH=$(builddir):$$PATH pkgdatadir=$(builddir) $(HELP2MAN) --section=1 -i $(top_srcdir)/docs/man/grub-mkrelpath.h2m -o $@ grub-mkrelpath @COND_MAN_PAGES_TRUE@grub-script-check.1: grub-script-check @COND_MAN_PAGES_TRUE@ chmod a+x grub-script-check @COND_MAN_PAGES_TRUE@ PATH=$(builddir):$$PATH pkgdatadir=$(builddir) $(HELP2MAN) --section=1 -i $(top_srcdir)/docs/man/grub-script-check.h2m -o $@ grub-script-check @COND_MAN_PAGES_TRUE@grub-editenv.1: grub-editenv @COND_MAN_PAGES_TRUE@ chmod a+x grub-editenv @COND_MAN_PAGES_TRUE@ PATH=$(builddir):$$PATH pkgdatadir=$(builddir) $(HELP2MAN) --section=1 -i $(top_srcdir)/docs/man/grub-editenv.h2m -o $@ grub-editenv @COND_MAN_PAGES_TRUE@grub-mkpasswd-pbkdf2.1: grub-mkpasswd-pbkdf2 @COND_MAN_PAGES_TRUE@ chmod a+x grub-mkpasswd-pbkdf2 @COND_MAN_PAGES_TRUE@ PATH=$(builddir):$$PATH pkgdatadir=$(builddir) $(HELP2MAN) --section=1 -i $(top_srcdir)/docs/man/grub-mkpasswd-pbkdf2.h2m -o $@ grub-mkpasswd-pbkdf2 @COND_APPLE_LINKER_TRUE@@COND_MAN_PAGES_TRUE@grub-macho2img.1: grub-macho2img @COND_APPLE_LINKER_TRUE@@COND_MAN_PAGES_TRUE@ chmod a+x grub-macho2img @COND_APPLE_LINKER_TRUE@@COND_MAN_PAGES_TRUE@ PATH=$(builddir):$$PATH pkgdatadir=$(builddir) $(HELP2MAN) --section=1 -i $(top_srcdir)/docs/man/grub-macho2img.h2m -o $@ grub-macho2img @COND_MAN_PAGES_TRUE@grub-fstest.1: grub-fstest @COND_MAN_PAGES_TRUE@ chmod a+x grub-fstest @COND_MAN_PAGES_TRUE@ PATH=$(builddir):$$PATH pkgdatadir=$(builddir) $(HELP2MAN) --section=1 -i $(top_srcdir)/docs/man/grub-fstest.h2m -o $@ grub-fstest @COND_GRUB_MOUNT_TRUE@@COND_MAN_PAGES_TRUE@grub-mount.1: grub-mount @COND_GRUB_MOUNT_TRUE@@COND_MAN_PAGES_TRUE@ chmod a+x grub-mount @COND_GRUB_MOUNT_TRUE@@COND_MAN_PAGES_TRUE@ PATH=$(builddir):$$PATH pkgdatadir=$(builddir) $(HELP2MAN) --section=1 -i $(top_srcdir)/docs/man/grub-mount.h2m -o $@ grub-mount @COND_GRUB_MKFONT_TRUE@@COND_MAN_PAGES_TRUE@grub-mkfont.1: grub-mkfont @COND_GRUB_MKFONT_TRUE@@COND_MAN_PAGES_TRUE@ chmod a+x grub-mkfont @COND_GRUB_MKFONT_TRUE@@COND_MAN_PAGES_TRUE@ PATH=$(builddir):$$PATH pkgdatadir=$(builddir) $(HELP2MAN) --section=1 -i $(top_srcdir)/docs/man/grub-mkfont.h2m -o $@ grub-mkfont @COND_MAN_PAGES_TRUE@grub-probe.8: grub-probe @COND_MAN_PAGES_TRUE@ chmod a+x grub-probe @COND_MAN_PAGES_TRUE@ PATH=$(builddir):$$PATH pkgdatadir=$(builddir) $(HELP2MAN) --section=8 -i $(top_srcdir)/docs/man/grub-probe.h2m -o $@ grub-probe @COND_MAN_PAGES_TRUE@grub-bios-setup.8: grub-bios-setup @COND_MAN_PAGES_TRUE@ chmod a+x grub-bios-setup @COND_MAN_PAGES_TRUE@ PATH=$(builddir):$$PATH pkgdatadir=$(builddir) $(HELP2MAN) --section=8 -i $(top_srcdir)/docs/man/grub-bios-setup.h2m -o $@ grub-bios-setup @COND_MAN_PAGES_TRUE@grub-sparc64-setup.8: grub-sparc64-setup @COND_MAN_PAGES_TRUE@ chmod a+x grub-sparc64-setup @COND_MAN_PAGES_TRUE@ PATH=$(builddir):$$PATH pkgdatadir=$(builddir) $(HELP2MAN) --section=8 -i $(top_srcdir)/docs/man/grub-sparc64-setup.h2m -o $@ grub-sparc64-setup @COND_MAN_PAGES_TRUE@grub-ofpathname.8: grub-ofpathname @COND_MAN_PAGES_TRUE@ chmod a+x grub-ofpathname @COND_MAN_PAGES_TRUE@ PATH=$(builddir):$$PATH pkgdatadir=$(builddir) $(HELP2MAN) --section=8 -i $(top_srcdir)/docs/man/grub-ofpathname.h2m -o $@ grub-ofpathname @COND_MAN_PAGES_TRUE@grub-mklayout.1: grub-mklayout @COND_MAN_PAGES_TRUE@ chmod a+x grub-mklayout @COND_MAN_PAGES_TRUE@ PATH=$(builddir):$$PATH pkgdatadir=$(builddir) $(HELP2MAN) --section=1 -i $(top_srcdir)/docs/man/grub-mklayout.h2m -o $@ grub-mklayout @COND_MAN_PAGES_TRUE@grub-macbless.8: grub-macbless @COND_MAN_PAGES_TRUE@ chmod a+x grub-macbless @COND_MAN_PAGES_TRUE@ PATH=$(builddir):$$PATH pkgdatadir=$(builddir) $(HELP2MAN) --section=8 -i $(top_srcdir)/docs/man/grub-macbless.h2m -o $@ grub-macbless @COND_HAVE_EXEC_TRUE@@COND_MAN_PAGES_TRUE@grub-mkrescue.1: grub-mkrescue @COND_HAVE_EXEC_TRUE@@COND_MAN_PAGES_TRUE@ chmod a+x grub-mkrescue @COND_HAVE_EXEC_TRUE@@COND_MAN_PAGES_TRUE@ PATH=$(builddir):$$PATH pkgdatadir=$(builddir) $(HELP2MAN) --section=1 -i $(top_srcdir)/docs/man/grub-mkrescue.h2m -o $@ grub-mkrescue @COND_MAN_PAGES_TRUE@grub-mkstandalone.1: grub-mkstandalone @COND_MAN_PAGES_TRUE@ chmod a+x grub-mkstandalone @COND_MAN_PAGES_TRUE@ PATH=$(builddir):$$PATH pkgdatadir=$(builddir) $(HELP2MAN) --section=1 -i $(top_srcdir)/docs/man/grub-mkstandalone.h2m -o $@ grub-mkstandalone @COND_MAN_PAGES_TRUE@grub-install.8: grub-install @COND_MAN_PAGES_TRUE@ chmod a+x grub-install @COND_MAN_PAGES_TRUE@ PATH=$(builddir):$$PATH pkgdatadir=$(builddir) $(HELP2MAN) --section=8 -i $(top_srcdir)/docs/man/grub-install.h2m -o $@ grub-install @COND_MAN_PAGES_TRUE@grub-mknetdir.1: grub-mknetdir @COND_MAN_PAGES_TRUE@ chmod a+x grub-mknetdir @COND_MAN_PAGES_TRUE@ PATH=$(builddir):$$PATH pkgdatadir=$(builddir) $(HELP2MAN) --section=1 -i $(top_srcdir)/docs/man/grub-mknetdir.h2m -o $@ grub-mknetdir @COND_MAN_PAGES_TRUE@grub-menulst2cfg.1: grub-menulst2cfg @COND_MAN_PAGES_TRUE@ chmod a+x grub-menulst2cfg @COND_MAN_PAGES_TRUE@ PATH=$(builddir):$$PATH pkgdatadir=$(builddir) $(HELP2MAN) --section=1 -i $(top_srcdir)/docs/man/grub-menulst2cfg.h2m -o $@ grub-menulst2cfg @COND_MAN_PAGES_TRUE@grub-syslinux2cfg.1: grub-syslinux2cfg @COND_MAN_PAGES_TRUE@ chmod a+x grub-syslinux2cfg @COND_MAN_PAGES_TRUE@ PATH=$(builddir):$$PATH pkgdatadir=$(builddir) $(HELP2MAN) --section=1 -i $(top_srcdir)/docs/man/grub-syslinux2cfg.h2m -o $@ grub-syslinux2cfg @COND_MAN_PAGES_TRUE@grub-glue-efi.1: grub-glue-efi @COND_MAN_PAGES_TRUE@ chmod a+x grub-glue-efi @COND_MAN_PAGES_TRUE@ PATH=$(builddir):$$PATH pkgdatadir=$(builddir) $(HELP2MAN) --section=1 -i $(top_srcdir)/docs/man/grub-glue-efi.h2m -o $@ grub-glue-efi @COND_MAN_PAGES_TRUE@grub-render-label.1: grub-render-label @COND_MAN_PAGES_TRUE@ chmod a+x grub-render-label @COND_MAN_PAGES_TRUE@ PATH=$(builddir):$$PATH pkgdatadir=$(builddir) $(HELP2MAN) --section=1 -i $(top_srcdir)/docs/man/grub-render-label.h2m -o $@ grub-render-label @COND_MAN_PAGES_TRUE@grub-file.1: grub-file @COND_MAN_PAGES_TRUE@ chmod a+x grub-file @COND_MAN_PAGES_TRUE@ PATH=$(builddir):$$PATH pkgdatadir=$(builddir) $(HELP2MAN) --section=1 -i $(top_srcdir)/docs/man/grub-file.h2m -o $@ grub-file 00_header: $(top_builddir)/config.status util/grub.d/00_header.in (for x in util/grub.d/00_header.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x 00_header @COND_HOST_WINDOWS_TRUE@10_windows: $(top_builddir)/config.status util/grub.d/10_windows.in @COND_HOST_WINDOWS_TRUE@ (for x in util/grub.d/10_windows.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- @COND_HOST_WINDOWS_TRUE@ chmod a+x 10_windows @COND_HOST_HURD_TRUE@10_hurd: $(top_builddir)/config.status util/grub.d/10_hurd.in @COND_HOST_HURD_TRUE@ (for x in util/grub.d/10_hurd.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- @COND_HOST_HURD_TRUE@ chmod a+x 10_hurd @COND_HOST_KFREEBSD_TRUE@10_kfreebsd: $(top_builddir)/config.status util/grub.d/10_kfreebsd.in @COND_HOST_KFREEBSD_TRUE@ (for x in util/grub.d/10_kfreebsd.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- @COND_HOST_KFREEBSD_TRUE@ chmod a+x 10_kfreebsd @COND_HOST_ILLUMOS_TRUE@10_illumos: $(top_builddir)/config.status util/grub.d/10_illumos.in @COND_HOST_ILLUMOS_TRUE@ (for x in util/grub.d/10_illumos.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- @COND_HOST_ILLUMOS_TRUE@ chmod a+x 10_illumos @COND_HOST_NETBSD_TRUE@10_netbsd: $(top_builddir)/config.status util/grub.d/10_netbsd.in @COND_HOST_NETBSD_TRUE@ (for x in util/grub.d/10_netbsd.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- @COND_HOST_NETBSD_TRUE@ chmod a+x 10_netbsd @COND_HOST_LINUX_TRUE@10_linux: $(top_builddir)/config.status util/grub.d/10_linux.in @COND_HOST_LINUX_TRUE@ (for x in util/grub.d/10_linux.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- @COND_HOST_LINUX_TRUE@ chmod a+x 10_linux @COND_HOST_XNU_TRUE@10_xnu: $(top_builddir)/config.status util/grub.d/10_xnu.in @COND_HOST_XNU_TRUE@ (for x in util/grub.d/10_xnu.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- @COND_HOST_XNU_TRUE@ chmod a+x 10_xnu @COND_HOST_LINUX_TRUE@20_linux_xen: $(top_builddir)/config.status util/grub.d/20_linux_xen.in @COND_HOST_LINUX_TRUE@ (for x in util/grub.d/20_linux_xen.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- @COND_HOST_LINUX_TRUE@ chmod a+x 20_linux_xen 25_bli: $(top_builddir)/config.status util/grub.d/25_bli.in (for x in util/grub.d/25_bli.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x 25_bli 30_os-prober: $(top_builddir)/config.status util/grub.d/30_os-prober.in (for x in util/grub.d/30_os-prober.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x 30_os-prober 30_uefi-firmware: $(top_builddir)/config.status util/grub.d/30_uefi-firmware.in (for x in util/grub.d/30_uefi-firmware.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x 30_uefi-firmware 40_custom: $(top_builddir)/config.status util/grub.d/40_custom.in (for x in util/grub.d/40_custom.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x 40_custom 41_custom: $(top_builddir)/config.status util/grub.d/41_custom.in (for x in util/grub.d/41_custom.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x 41_custom @COND_MAN_PAGES_TRUE@grub-mkconfig.8: grub-mkconfig grub-mkconfig_lib @COND_MAN_PAGES_TRUE@ chmod a+x grub-mkconfig @COND_MAN_PAGES_TRUE@ PATH=$(builddir):$$PATH pkgdatadir=$(builddir) $(HELP2MAN) --section=8 -i $(top_srcdir)/docs/man/grub-mkconfig.h2m -o $@ grub-mkconfig grub-mkconfig: $(top_builddir)/config.status util/grub-mkconfig.in (for x in util/grub-mkconfig.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub-mkconfig @COND_MAN_PAGES_TRUE@grub-set-default.8: grub-set-default grub-mkconfig_lib @COND_MAN_PAGES_TRUE@ chmod a+x grub-set-default @COND_MAN_PAGES_TRUE@ PATH=$(builddir):$$PATH pkgdatadir=$(builddir) $(HELP2MAN) --section=8 -i $(top_srcdir)/docs/man/grub-set-default.h2m -o $@ grub-set-default grub-set-default: $(top_builddir)/config.status util/grub-set-default.in (for x in util/grub-set-default.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub-set-default @COND_MAN_PAGES_TRUE@grub-reboot.8: grub-reboot grub-mkconfig_lib @COND_MAN_PAGES_TRUE@ chmod a+x grub-reboot @COND_MAN_PAGES_TRUE@ PATH=$(builddir):$$PATH pkgdatadir=$(builddir) $(HELP2MAN) --section=8 -i $(top_srcdir)/docs/man/grub-reboot.h2m -o $@ grub-reboot grub-reboot: $(top_builddir)/config.status util/grub-reboot.in (for x in util/grub-reboot.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub-reboot grub-mkconfig_lib: $(top_builddir)/config.status util/grub-mkconfig_lib.in (for x in util/grub-mkconfig_lib.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub-mkconfig_lib @COND_MAN_PAGES_TRUE@grub-kbdcomp.1: grub-kbdcomp grub-mkconfig_lib @COND_MAN_PAGES_TRUE@ chmod a+x grub-kbdcomp @COND_MAN_PAGES_TRUE@ PATH=$(builddir):$$PATH pkgdatadir=$(builddir) $(HELP2MAN) --section=1 -i $(top_srcdir)/docs/man/grub-kbdcomp.h2m -o $@ grub-kbdcomp grub-kbdcomp: $(top_builddir)/config.status util/grub-kbdcomp.in (for x in util/grub-kbdcomp.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub-kbdcomp grub-shell: $(top_builddir)/config.status tests/util/grub-shell.in (for x in tests/util/grub-shell.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub-shell grub-shell-tester: $(top_builddir)/config.status tests/util/grub-shell-tester.in (for x in tests/util/grub-shell-tester.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub-shell-tester grub-shell-luks-tester: $(top_builddir)/config.status tests/util/grub-shell-luks-tester.in (for x in tests/util/grub-shell-luks-tester.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub-shell-luks-tester grub-fs-tester: $(top_builddir)/config.status tests/util/grub-fs-tester.in garbage-gen$(BUILD_EXEEXT) (for x in tests/util/grub-fs-tester.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub-fs-tester erofs_test: $(top_builddir)/config.status tests/erofs_test.in (for x in tests/erofs_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x erofs_test ext234_test: $(top_builddir)/config.status tests/ext234_test.in (for x in tests/ext234_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x ext234_test squashfs_test: $(top_builddir)/config.status tests/squashfs_test.in (for x in tests/squashfs_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x squashfs_test iso9660_test: $(top_builddir)/config.status tests/iso9660_test.in (for x in tests/iso9660_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x iso9660_test hfsplus_test: $(top_builddir)/config.status tests/hfsplus_test.in (for x in tests/hfsplus_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x hfsplus_test ntfs_test: $(top_builddir)/config.status tests/ntfs_test.in (for x in tests/ntfs_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x ntfs_test reiserfs_test: $(top_builddir)/config.status tests/reiserfs_test.in (for x in tests/reiserfs_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x reiserfs_test fat_test: $(top_builddir)/config.status tests/fat_test.in (for x in tests/fat_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x fat_test minixfs_test: $(top_builddir)/config.status tests/minixfs_test.in (for x in tests/minixfs_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x minixfs_test xfs_test: $(top_builddir)/config.status tests/xfs_test.in (for x in tests/xfs_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x xfs_test f2fs_test: $(top_builddir)/config.status tests/f2fs_test.in (for x in tests/f2fs_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x f2fs_test nilfs2_test: $(top_builddir)/config.status tests/nilfs2_test.in (for x in tests/nilfs2_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x nilfs2_test romfs_test: $(top_builddir)/config.status tests/romfs_test.in (for x in tests/romfs_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x romfs_test exfat_test: $(top_builddir)/config.status tests/exfat_test.in (for x in tests/exfat_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x exfat_test tar_test: $(top_builddir)/config.status tests/tar_test.in (for x in tests/tar_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x tar_test udf_test: $(top_builddir)/config.status tests/udf_test.in (for x in tests/udf_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x udf_test hfs_test: $(top_builddir)/config.status tests/hfs_test.in (for x in tests/hfs_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x hfs_test jfs_test: $(top_builddir)/config.status tests/jfs_test.in (for x in tests/jfs_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x jfs_test btrfs_test: $(top_builddir)/config.status tests/btrfs_test.in (for x in tests/btrfs_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x btrfs_test zfs_test: $(top_builddir)/config.status tests/zfs_test.in (for x in tests/zfs_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x zfs_test cpio_test: $(top_builddir)/config.status tests/cpio_test.in (for x in tests/cpio_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x cpio_test example_scripted_test: $(top_builddir)/config.status tests/example_scripted_test.in (for x in tests/example_scripted_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x example_scripted_test gettext_strings_test: $(top_builddir)/config.status tests/gettext_strings_test.in (for x in tests/gettext_strings_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x gettext_strings_test pata_test: $(top_builddir)/config.status tests/pata_test.in (for x in tests/pata_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x pata_test ahci_test: $(top_builddir)/config.status tests/ahci_test.in (for x in tests/ahci_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x ahci_test uhci_test: $(top_builddir)/config.status tests/uhci_test.in (for x in tests/uhci_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x uhci_test ohci_test: $(top_builddir)/config.status tests/ohci_test.in (for x in tests/ohci_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x ohci_test ehci_test: $(top_builddir)/config.status tests/ehci_test.in (for x in tests/ehci_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x ehci_test example_grub_script_test: $(top_builddir)/config.status tests/example_grub_script_test.in (for x in tests/example_grub_script_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x example_grub_script_test grub_script_eval: $(top_builddir)/config.status tests/grub_script_eval.in (for x in tests/grub_script_eval.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub_script_eval grub_script_test: $(top_builddir)/config.status tests/grub_script_test.in (for x in tests/grub_script_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub_script_test grub_script_echo1: $(top_builddir)/config.status tests/grub_script_echo1.in (for x in tests/grub_script_echo1.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub_script_echo1 grub_script_leading_whitespace: $(top_builddir)/config.status tests/grub_script_leading_whitespace.in (for x in tests/grub_script_leading_whitespace.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub_script_leading_whitespace grub_script_echo_keywords: $(top_builddir)/config.status tests/grub_script_echo_keywords.in (for x in tests/grub_script_echo_keywords.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub_script_echo_keywords grub_script_vars1: $(top_builddir)/config.status tests/grub_script_vars1.in (for x in tests/grub_script_vars1.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub_script_vars1 grub_script_for1: $(top_builddir)/config.status tests/grub_script_for1.in (for x in tests/grub_script_for1.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub_script_for1 grub_script_while1: $(top_builddir)/config.status tests/grub_script_while1.in (for x in tests/grub_script_while1.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub_script_while1 grub_script_if: $(top_builddir)/config.status tests/grub_script_if.in (for x in tests/grub_script_if.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub_script_if grub_script_blanklines: $(top_builddir)/config.status tests/grub_script_blanklines.in (for x in tests/grub_script_blanklines.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub_script_blanklines grub_script_final_semicolon: $(top_builddir)/config.status tests/grub_script_final_semicolon.in (for x in tests/grub_script_final_semicolon.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub_script_final_semicolon grub_script_dollar: $(top_builddir)/config.status tests/grub_script_dollar.in (for x in tests/grub_script_dollar.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub_script_dollar grub_script_comments: $(top_builddir)/config.status tests/grub_script_comments.in (for x in tests/grub_script_comments.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub_script_comments grub_script_functions: $(top_builddir)/config.status tests/grub_script_functions.in (for x in tests/grub_script_functions.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub_script_functions grub_script_break: $(top_builddir)/config.status tests/grub_script_break.in (for x in tests/grub_script_break.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub_script_break grub_script_continue: $(top_builddir)/config.status tests/grub_script_continue.in (for x in tests/grub_script_continue.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub_script_continue grub_script_shift: $(top_builddir)/config.status tests/grub_script_shift.in (for x in tests/grub_script_shift.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub_script_shift grub_script_blockarg: $(top_builddir)/config.status tests/grub_script_blockarg.in (for x in tests/grub_script_blockarg.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub_script_blockarg grub_script_setparams: $(top_builddir)/config.status tests/grub_script_setparams.in (for x in tests/grub_script_setparams.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub_script_setparams grub_script_return: $(top_builddir)/config.status tests/grub_script_return.in (for x in tests/grub_script_return.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub_script_return grub_cmd_cryptomount: $(top_builddir)/config.status tests/grub_cmd_cryptomount.in (for x in tests/grub_cmd_cryptomount.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub_cmd_cryptomount grub_cmd_regexp: $(top_builddir)/config.status tests/grub_cmd_regexp.in (for x in tests/grub_cmd_regexp.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub_cmd_regexp grub_cmd_date: $(top_builddir)/config.status tests/grub_cmd_date.in (for x in tests/grub_cmd_date.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub_cmd_date grub_cmd_set_date: $(top_builddir)/config.status tests/grub_cmd_set_date.in (for x in tests/grub_cmd_set_date.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub_cmd_set_date grub_cmd_sleep: $(top_builddir)/config.status tests/grub_cmd_sleep.in (for x in tests/grub_cmd_sleep.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub_cmd_sleep grub_script_expansion: $(top_builddir)/config.status tests/grub_script_expansion.in (for x in tests/grub_script_expansion.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub_script_expansion grub_script_not: $(top_builddir)/config.status tests/grub_script_not.in (for x in tests/grub_script_not.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub_script_not grub_script_no_commands: $(top_builddir)/config.status tests/grub_script_no_commands.in (for x in tests/grub_script_no_commands.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub_script_no_commands partmap_test: $(top_builddir)/config.status tests/partmap_test.in (for x in tests/partmap_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x partmap_test hddboot_test: $(top_builddir)/config.status tests/hddboot_test.in (for x in tests/hddboot_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x hddboot_test fddboot_test: $(top_builddir)/config.status tests/fddboot_test.in (for x in tests/fddboot_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x fddboot_test cdboot_test: $(top_builddir)/config.status tests/cdboot_test.in (for x in tests/cdboot_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x cdboot_test netboot_test: $(top_builddir)/config.status tests/netboot_test.in (for x in tests/netboot_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x netboot_test serial_test: $(top_builddir)/config.status tests/serial_test.in (for x in tests/serial_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x serial_test pseries_test: $(top_builddir)/config.status tests/pseries_test.in (for x in tests/pseries_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x pseries_test core_compress_test: $(top_builddir)/config.status tests/core_compress_test.in (for x in tests/core_compress_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x core_compress_test xzcompress_test: $(top_builddir)/config.status tests/xzcompress_test.in (for x in tests/xzcompress_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x xzcompress_test gzcompress_test: $(top_builddir)/config.status tests/gzcompress_test.in (for x in tests/gzcompress_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x gzcompress_test lzocompress_test: $(top_builddir)/config.status tests/lzocompress_test.in (for x in tests/lzocompress_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x lzocompress_test grub_cmd_echo: $(top_builddir)/config.status tests/grub_cmd_echo.in (for x in tests/grub_cmd_echo.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub_cmd_echo help_test: $(top_builddir)/config.status tests/help_test.in (for x in tests/help_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x help_test grub_script_gettext: $(top_builddir)/config.status tests/grub_script_gettext.in (for x in tests/grub_script_gettext.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub_script_gettext grub_script_escape_comma: $(top_builddir)/config.status tests/grub_script_escape_comma.in (for x in tests/grub_script_escape_comma.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub_script_escape_comma grub_script_strcmp: $(top_builddir)/config.status tests/grub_script_strcmp.in (for x in tests/grub_script_strcmp.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub_script_strcmp test_sha512sum: $(top_builddir)/config.status tests/test_sha512sum.in (for x in tests/test_sha512sum.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x test_sha512sum test_unset: $(top_builddir)/config.status tests/test_unset.in (for x in tests/test_unset.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x test_unset grub_func_test: $(top_builddir)/config.status tests/grub_func_test.in (for x in tests/grub_func_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub_func_test grub_cmd_tr: $(top_builddir)/config.status tests/grub_cmd_tr.in (for x in tests/grub_cmd_tr.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub_cmd_tr file_filter_test: $(top_builddir)/config.status tests/file_filter_test.in (for x in tests/file_filter_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x file_filter_test grub_cmd_test: $(top_builddir)/config.status tests/grub_cmd_test.in (for x in tests/grub_cmd_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub_cmd_test syslinux_test: $(top_builddir)/config.status tests/syslinux_test.in (for x in tests/syslinux_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x syslinux_test luks1_test: $(top_builddir)/config.status tests/luks1_test.in (for x in tests/luks1_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x luks1_test luks2_test: $(top_builddir)/config.status tests/luks2_test.in (for x in tests/luks2_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x luks2_test asn1_test: $(top_builddir)/config.status tests/asn1_test.in (for x in tests/asn1_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x asn1_test tpm2_key_protector_test: $(top_builddir)/config.status tests/tpm2_key_protector_test.in (for x in tests/tpm2_key_protector_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x tpm2_key_protector_test check-native: $(MAKE) TESTS="$(check_PROGRAMS_native) $(check_SCRIPTS_native)" check check-nonnative: $(MAKE) TESTS="$(check_PROGRAMS_nonnative) $(check_SCRIPTS_nonnative)" check # XXX Use Automake's LEX & YACC support grub_script.tab.h: $(top_srcdir)/grub-core/script/parser.y $(YACC) -d -p grub_script_yy -b grub_script $(top_srcdir)/grub-core/script/parser.y grub_script.tab.c: grub_script.tab.h # For the lexer. grub_script.yy.h: $(top_srcdir)/grub-core/script/yylex.l $(LEX) -o grub_script.yy.c --header-file=grub_script.yy.h $(top_srcdir)/grub-core/script/yylex.l grub_script.yy.c: grub_script.yy.h # For libgrub.a libgrub.pp: config-util.h grub_script.tab.h grub_script.yy.h $(libgrubmods_a_SOURCES) $(libgrubkern_a_SOURCES) $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) \ -D'GRUB_MOD_INIT(x)=@MARKER@x@' $^ > $@ || (rm -f $@; exit 1) libgrub_a_init.lst: libgrub.pp cat $< | grep '^@MARKER@' | sed 's/@MARKER@\(.*\)@/\1/g' | sort -u > $@ || (rm -f $@; exit 1) libgrub_a_init.c: libgrub_a_init.lst $(top_srcdir)/geninit.sh sh $(top_srcdir)/geninit.sh `cat $<` > $@ || (rm -f $@; exit 1) # For grub-fstest grub_fstest.pp: config-util.h $(grub_fstest_SOURCES) $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_fstest_CPPFLAGS) $(CPPFLAGS) \ -D'GRUB_MOD_INIT(x)=@MARKER@x@' $^ > $@ || (rm -f $@; exit 1) grub_fstest_init.lst: libgrub.pp grub_fstest.pp cat $^ | grep '^@MARKER@' | sed 's/@MARKER@\(.*\)@/\1/g' | sort -u > $@ || (rm -f $@; exit 1) grub_fstest_init.c: grub_fstest_init.lst $(top_srcdir)/geninit.sh sh $(top_srcdir)/geninit.sh `cat $<` > $@ || (rm -f $@; exit 1) build-grub-mkfont$(BUILD_EXEEXT): util/grub-mkfont.c grub-core/unidata.c grub-core/kern/emu/misc.c util/misc.c $(BUILD_CC) -o $@ -I$(top_srcdir)/include $(BUILD_CFLAGS) $(BUILD_CPPFLAGS) $(BUILD_LDFLAGS) -DGRUB_MKFONT=1 -DGRUB_BUILD=1 -DGRUB_UTIL=1 -DGRUB_BUILD_PROGRAM_NAME=\"build-grub-mkfont\" $^ $(BUILD_FREETYPE_CFLAGS) $(BUILD_FREETYPE_LIBS) garbage-gen$(BUILD_EXEEXT): util/garbage-gen.c $(BUILD_CC) -o $@ $(BUILD_CFLAGS) $(BUILD_CPPFLAGS) $(BUILD_LDFLAGS) $^ build-grub-gen-asciih$(BUILD_EXEEXT): util/grub-gen-asciih.c $(BUILD_CC) -o $@ -I$(top_srcdir)/include $(BUILD_CFLAGS) $(BUILD_CPPFLAGS) $(BUILD_LDFLAGS) -DGRUB_MKFONT=1 -DGRUB_BUILD=1 -DGRUB_UTIL=1 $^ $(BUILD_FREETYPE_CFLAGS) $(BUILD_FREETYPE_LIBS) -Wall -Werror build-grub-gen-widthspec$(BUILD_EXEEXT): util/grub-gen-widthspec.c $(BUILD_CC) -o $@ -I$(top_srcdir)/include $(BUILD_CFLAGS) $(BUILD_CPPFLAGS) $(BUILD_LDFLAGS) -DGRUB_MKFONT=1 -DGRUB_BUILD=1 -DGRUB_UTIL=1 $^ $(BUILD_FREETYPE_CFLAGS) $(BUILD_FREETYPE_LIBS) -Wall -Werror @COND_STARFIELD_TRUE@dejavu_10.pf2: $(DJVU_FONT_SOURCE) build-grub-mkfont$(BUILD_EXEEXT) @COND_STARFIELD_TRUE@ ./build-grub-mkfont$(BUILD_EXEEXT) -s 10 -o $@ $(DJVU_FONT_SOURCE) @COND_STARFIELD_TRUE@dejavu_12.pf2: $(DJVU_FONT_SOURCE) build-grub-mkfont$(BUILD_EXEEXT) @COND_STARFIELD_TRUE@ ./build-grub-mkfont$(BUILD_EXEEXT) -s 12 -o $@ $(DJVU_FONT_SOURCE) @COND_STARFIELD_TRUE@dejavu_14.pf2: $(DJVU_FONT_SOURCE) build-grub-mkfont$(BUILD_EXEEXT) @COND_STARFIELD_TRUE@ ./build-grub-mkfont$(BUILD_EXEEXT) -s 14 -o $@ $(DJVU_FONT_SOURCE) @COND_STARFIELD_TRUE@dejavu_bold_14.pf2: $(DJVU_FONT_SOURCE) build-grub-mkfont$(BUILD_EXEEXT) @COND_STARFIELD_TRUE@ ./build-grub-mkfont$(BUILD_EXEEXT) -b -s 14 -o $@ $(DJVU_FONT_SOURCE) @COND_STARFIELD_TRUE@dejavu_16.pf2: $(DJVU_FONT_SOURCE) build-grub-mkfont$(BUILD_EXEEXT) @COND_STARFIELD_TRUE@ ./build-grub-mkfont$(BUILD_EXEEXT) -s 16 -o $@ $(DJVU_FONT_SOURCE) unicode.pf2: $(FONT_SOURCE) build-grub-mkfont$(BUILD_EXEEXT) ./build-grub-mkfont$(BUILD_EXEEXT) -o $@ $(FONT_SOURCE) || (rm -f $@; exit 1) ascii.pf2: $(FONT_SOURCE) build-grub-mkfont$(BUILD_EXEEXT) ./build-grub-mkfont$(BUILD_EXEEXT) -o $@ $(FONT_SOURCE) -r 0x0-0x7f,$(UNICODE_ARROWS),$(UNICODE_LINES) || (rm -f $@; exit 1) euro.pf2: $(FONT_SOURCE) build-grub-mkfont$(BUILD_EXEEXT) ./build-grub-mkfont$(BUILD_EXEEXT) -o $@ $(FONT_SOURCE) -r 0x0-0x4ff,0x1e00-0x1fff,$(UNICODE_ARROWS),$(UNICODE_LINES) || (rm -f $@; exit 1) ascii.h: $(FONT_SOURCE) build-grub-gen-asciih$(BUILD_EXEEXT) ./build-grub-gen-asciih$(BUILD_EXEEXT) $(FONT_SOURCE) $@ || (rm -f $@; exit 1) widthspec.h: $(FONT_SOURCE) build-grub-gen-widthspec$(BUILD_EXEEXT) ./build-grub-gen-widthspec$(BUILD_EXEEXT) $(FONT_SOURCE) $@ || (rm -f $@; exit 1) @COND_real_platform_TRUE@linux.init.x86_64: $(srcdir)/grub-core/tests/boot/linux.init-x86_64.S $(srcdir)/grub-core/tests/boot/qemu-shutdown-x86.S @COND_real_platform_TRUE@ $(TARGET_CC) -o $@ $< -static -m64 -nostdlib -nostdinc -DSUCCESSFUL_BOOT_STRING=\"$(SUCCESSFUL_BOOT_STRING)\" @COND_real_platform_TRUE@linux.init.i386: $(srcdir)/grub-core/tests/boot/linux.init-i386.S $(srcdir)/grub-core/tests/boot/qemu-shutdown-x86.S @COND_real_platform_TRUE@ $(TARGET_CC) -o $@ $< -static -m32 -nostdlib -nostdinc -DSUCCESSFUL_BOOT_STRING=\"$(SUCCESSFUL_BOOT_STRING)\" @COND_real_platform_TRUE@linux.init.mips: $(srcdir)/grub-core/tests/boot/linux.init-mips.S @COND_real_platform_TRUE@ $(TARGET_CC) -o $@ $< -static -nostdlib -nostdinc -DSUCCESSFUL_BOOT_STRING=\"$(SUCCESSFUL_BOOT_STRING)\" @COND_real_platform_TRUE@linux.init.ppc: $(srcdir)/grub-core/tests/boot/linux.init-ppc.S @COND_real_platform_TRUE@ $(TARGET_CC) -o $@ $< -static -nostdlib -nostdinc -DSUCCESSFUL_BOOT_STRING=\"$(SUCCESSFUL_BOOT_STRING)\" @COND_real_platform_TRUE@linux.init.mipsel: $(srcdir)/grub-core/tests/boot/linux.init-mips.S @COND_real_platform_TRUE@ $(TARGET_CC) -o $@ $< -static -nostdlib -nostdinc -DSUCCESSFUL_BOOT_STRING=\"$(SUCCESSFUL_BOOT_STRING)\" @COND_real_platform_TRUE@linux.init.loongson: $(srcdir)/grub-core/tests/boot/linux.init-mips.S @COND_real_platform_TRUE@ $(TARGET_CC) -o $@ $< -static -nostdlib -nostdinc -DSUCCESSFUL_BOOT_STRING=\"$(SUCCESSFUL_BOOT_STRING)\" -DREBOOT=1 @COND_real_platform_TRUE@multiboot.elf: $(srcdir)/grub-core/tests/boot/kernel-i386.S $(srcdir)/grub-core/tests/boot/qemu-shutdown-x86.S @COND_real_platform_TRUE@ $(TARGET_CC) -o $@ $< -DSUCCESSFUL_BOOT_STRING=\"$(SUCCESSFUL_BOOT_STRING)\" -static -ffreestanding -nostdlib -nostdinc -DTARGET_MULTIBOOT=1 -Wl,--build-id=none -Wl,-N -Wl,-Ttext,0x100000 -m32 -I$(srcdir)/include @COND_real_platform_TRUE@kfreebsd.elf: $(srcdir)/grub-core/tests/boot/kernel-i386.S $(srcdir)/grub-core/tests/boot/qemu-shutdown-x86.S @COND_real_platform_TRUE@ $(TARGET_CC) -o $@ $< -DSUCCESSFUL_BOOT_STRING=\"$(SUCCESSFUL_BOOT_STRING)\" -static -ffreestanding -nostdlib -nostdinc -Wl,--build-id=none -Wl,-N -Wl,-Ttext,0x100000 -m32 -I$(srcdir)/include @COND_real_platform_TRUE@kfreebsd.aout: kfreebsd.elf @COND_real_platform_TRUE@ $(TARGET_OBJCOPY) -O a.out-i386-linux $< $@ -j .text @COND_real_platform_TRUE@pc-chainloader.elf: $(srcdir)/grub-core/tests/boot/kernel-8086.S $(srcdir)/grub-core/tests/boot/qemu-shutdown-x86.S @COND_real_platform_TRUE@ $(TARGET_CC) -o $@ $< -static -DTARGET_CHAINLOADER=1 -DSUCCESSFUL_BOOT_STRING=\"$(SUCCESSFUL_BOOT_STRING)\" -ffreestanding -nostdlib -nostdinc -Wl,--build-id=none -Wl,-N -Wl,-Ttext,0x7c00 -m32 @COND_real_platform_TRUE@pc-chainloader.bin: pc-chainloader.elf @COND_real_platform_TRUE@ $(TARGET_OBJCOPY) -O binary --strip-unneeded -R .note -R .comment -R .note.gnu.build-id -R .reginfo -R .rel.dyn -R .note.gnu.gold-version $< $@; @COND_real_platform_TRUE@ntldr.elf: $(srcdir)/grub-core/tests/boot/kernel-8086.S $(srcdir)/grub-core/tests/boot/qemu-shutdown-x86.S @COND_real_platform_TRUE@ $(TARGET_CC) -o $@ $< -DTARGET_NTLDR=1 -DSUCCESSFUL_BOOT_STRING=\"$(SUCCESSFUL_BOOT_STRING)\" -static -ffreestanding -nostdlib -nostdinc -Wl,--build-id=none -Wl,-N -Wl,-Ttext,0 -m32 @COND_real_platform_TRUE@ntldr.bin: ntldr.elf @COND_real_platform_TRUE@ $(TARGET_OBJCOPY) -O binary --strip-unneeded -j .text $< $@; @COND_real_platform_TRUE@multiboot2.elf: $(srcdir)/grub-core/tests/boot/kernel-i386.S $(srcdir)/grub-core/tests/boot/qemu-shutdown-x86.S @COND_real_platform_TRUE@ $(TARGET_CC) -static -o $@ $< -DSUCCESSFUL_BOOT_STRING=\"$(SUCCESSFUL_BOOT_STRING)\" -ffreestanding -nostdlib -nostdinc -Wl,--build-id=none -Wl,-N -Wl,-Ttext,0x100000 -m32 -I$(srcdir)/include -DTARGET_MULTIBOOT2=1 @COND_real_platform_TRUE@kfreebsd.init.x86_64: $(srcdir)/grub-core/tests/boot/kfreebsd.init-x86_64.S $(srcdir)/grub-core/tests/boot/qemu-shutdown-x86.S @COND_real_platform_TRUE@ $(TARGET_CC) -o $@ $< -m64 -static -nostdlib -nostdinc -DSUCCESSFUL_BOOT_STRING=\"$(SUCCESSFUL_BOOT_STRING)\" && freebsd-brandelf -t FreeBSD $@ @COND_real_platform_TRUE@kfreebsd.init.i386: $(srcdir)/grub-core/tests/boot/kfreebsd.init-i386.S $(srcdir)/grub-core/tests/boot/qemu-shutdown-x86.S @COND_real_platform_TRUE@ $(TARGET_CC) -o $@ $< -m32 -static -nostdlib -nostdinc -DSUCCESSFUL_BOOT_STRING=\"$(SUCCESSFUL_BOOT_STRING)\" && freebsd-brandelf -t FreeBSD $@ @COND_real_platform_TRUE@knetbsd.init.i386: $(srcdir)/grub-core/tests/boot/kbsd.init-i386.S $(srcdir)/grub-core/tests/boot/qemu-shutdown-x86.S @COND_real_platform_TRUE@ $(TARGET_CC) -o $@ $< -m32 -static -nostdlib -nostdinc -DTARGET_NETBSD=1 -DSUCCESSFUL_BOOT_STRING=\"$(SUCCESSFUL_BOOT_STRING)\" @COND_real_platform_TRUE@kopenbsd.init.i386: $(srcdir)/grub-core/tests/boot/kbsd.init-i386.S $(srcdir)/grub-core/tests/boot/qemu-shutdown-x86.S @COND_real_platform_TRUE@ $(TARGET_CC) -o $@ $< -m32 -static -nostdlib -nostdinc -DTARGET_OPENBSD=1 -DSUCCESSFUL_BOOT_STRING=\"$(SUCCESSFUL_BOOT_STRING)\" @COND_real_platform_TRUE@knetbsd.init.x86_64: $(srcdir)/grub-core/tests/boot/kbsd.init-x86_64.S $(srcdir)/grub-core/tests/boot/qemu-shutdown-x86.S @COND_real_platform_TRUE@ $(TARGET_CC) -o $@ $< -m64 -DTARGET_NETBSD=1 -static -nostdlib -nostdinc -DSUCCESSFUL_BOOT_STRING=\"$(SUCCESSFUL_BOOT_STRING)\" @COND_real_platform_TRUE@kopenbsd.init.x86_64: $(srcdir)/grub-core/tests/boot/kbsd.init-x86_64.S $(srcdir)/grub-core/tests/boot/qemu-shutdown-x86.S @COND_real_platform_TRUE@ $(TARGET_CC) -o $@ $< -m64 -DTARGET_OPENBSD=1 -static -nostdlib -nostdinc -DSUCCESSFUL_BOOT_STRING=\"$(SUCCESSFUL_BOOT_STRING)\" @COND_real_platform_TRUE@linux-initramfs.mips: linux.init.mips Makefile @COND_real_platform_TRUE@ TDIR=`mktemp -d "$${TMPDIR:-/tmp}/tmp.XXXXXXXXXX"` && cp $< $$TDIR/init && (cd $$TDIR && echo ./init | cpio -R 0:0 --quiet --dereference -o -H newc) | gzip > $@ && rm -rf $$TDIR @COND_real_platform_TRUE@linux-initramfs.ppc: linux.init.ppc Makefile @COND_real_platform_TRUE@ TDIR=`mktemp -d "$${TMPDIR:-/tmp}/tmp.XXXXXXXXXX"` && cp $< $$TDIR/init && (cd $$TDIR && echo ./init | cpio -R 0:0 --quiet --dereference -o -H newc) | gzip > $@ && rm -rf $$TDIR @COND_real_platform_TRUE@linux-initramfs.mipsel: linux.init.mipsel Makefile @COND_real_platform_TRUE@ TDIR=`mktemp -d "$${TMPDIR:-/tmp}/tmp.XXXXXXXXXX"` && cp $< $$TDIR/init && (cd $$TDIR && echo ./init | cpio -R 0:0 --quiet --dereference -o -H newc) | gzip > $@ && rm -rf $$TDIR @COND_real_platform_TRUE@linux-initramfs.loongson: linux.init.loongson Makefile @COND_real_platform_TRUE@ TDIR=`mktemp -d "$${TMPDIR:-/tmp}/tmp.XXXXXXXXXX"` && cp $< $$TDIR/init && (cd $$TDIR && echo ./init | cpio -R 0:0 --quiet --dereference -o -H newc) | gzip > $@ && rm -rf $$TDIR @COND_real_platform_TRUE@linux-initramfs.i386: linux.init.i386 Makefile @COND_real_platform_TRUE@ TDIR=`mktemp -d "$${TMPDIR:-/tmp}/tmp.XXXXXXXXXX"` && cp $< $$TDIR/init && (cd $$TDIR && echo ./init | cpio -R 0:0 --quiet --dereference -o -H newc) | gzip > $@ && rm -rf $$TDIR @COND_real_platform_TRUE@linux-initramfs.x86_64: linux.init.x86_64 Makefile @COND_real_platform_TRUE@ TDIR=`mktemp -d "$${TMPDIR:-/tmp}/tmp.XXXXXXXXXX"` && cp $< $$TDIR/init && (cd $$TDIR && echo ./init | cpio -R 0:0 --quiet --dereference -o -H newc) | gzip > $@ && rm -rf $$TDIR @COND_real_platform_TRUE@kfreebsd-mfsroot.i386.img: kfreebsd.init.i386 Makefile @COND_real_platform_TRUE@ TDIR=`mktemp -d "$${TMPDIR:-/tmp}/tmp.XXXXXXXXXX"` && mkdir $$TDIR/dev && mkdir $$TDIR/sbin && cp $< $$TDIR/sbin/init && makefs -t ffs -s 30m -f 1000 -o minfree=0,version=1 $@ $$TDIR && rm -rf $$TDIR @COND_real_platform_TRUE@knetbsd.image.i386: knetbsd.init.i386 $(srcdir)/grub-core/tests/boot/kbsd.spec.txt @COND_real_platform_TRUE@ TDIR=`mktemp -d "$${TMPDIR:-/tmp}/tmp.XXXXXXXXXX"` && mkdir $$TDIR/dev && mkdir $$TDIR/sbin && cp $< $$TDIR/sbin/init && makefs -F $(srcdir)/grub-core/tests/boot/kbsd.spec.txt -t ffs -s 64k -f 10 -o minfree=0,version=1 $@ $$TDIR && rm -rf $$TDIR @COND_real_platform_TRUE@kopenbsd.image.i386: kopenbsd.init.i386 $(srcdir)/grub-core/tests/boot/kopenbsdlabel.txt @COND_real_platform_TRUE@ TDIR=`mktemp -d "$${TMPDIR:-/tmp}/tmp.XXXXXXXXXX"` && mkdir $$TDIR/dev && mkdir $$TDIR/sbin && cp $< $$TDIR/sbin/init && makefs -F $(srcdir)/grub-core/tests/boot/kbsd.spec.txt -t ffs -s 128k -f 10 -o minfree=0,version=1 $@ $$TDIR && bsdlabel -f -R $@ $(srcdir)/grub-core/tests/boot/kopenbsdlabel.txt && rm -rf $$TDIR || rm -f $@ @COND_real_platform_TRUE@kopenbsd.image.x86_64: kopenbsd.init.x86_64 $(srcdir)/grub-core/tests/boot/kopenbsdlabel.txt @COND_real_platform_TRUE@ TDIR=`mktemp -d "$${TMPDIR:-/tmp}/tmp.XXXXXXXXXX"` && mkdir $$TDIR/dev && mkdir $$TDIR/sbin && cp $< $$TDIR/sbin/init && makefs -F $(srcdir)/grub-core/tests/boot/kbsd.spec.txt -t ffs -s 128k -f 10 -o minfree=0,version=1 $@ $$TDIR && bsdlabel -f -R $@ $(srcdir)/grub-core/tests/boot/kopenbsdlabel.txt && rm -rf $$TDIR || rm -f $@ @COND_real_platform_TRUE@knetbsd.miniroot-image.i386.img: knetbsd.image.i386 $(GRUB_PAYLOADS_DIR)/knetbsd.miniroot.i386 @COND_real_platform_TRUE@ $(TARGET_OBJCOPY) --add-section=miniroot=$< $(GRUB_PAYLOADS_DIR)/knetbsd.miniroot.i386 $@ @COND_real_platform_TRUE@kfreebsd-mfsroot.x86_64.img: kfreebsd.init.x86_64 Makefile @COND_real_platform_TRUE@ TDIR=`mktemp -d "$${TMPDIR:-/tmp}/tmp.XXXXXXXXXX"` && mkdir $$TDIR/dev && mkdir $$TDIR/sbin && cp $< $$TDIR/sbin/init && makefs -t ffs -s 30m -f 1000 -o minfree=0,version=1 $@ $$TDIR && rm -rf $$TDIR @COND_real_platform_TRUE@knetbsd.image.x86_64: knetbsd.init.x86_64 $(srcdir)/grub-core/tests/boot/kbsd.spec.txt @COND_real_platform_TRUE@ TDIR=`mktemp -d "$${TMPDIR:-/tmp}/tmp.XXXXXXXXXX"` && mkdir $$TDIR/dev && mkdir $$TDIR/sbin && cp $< $$TDIR/sbin/init && makefs -F $(srcdir)/grub-core/tests/boot/kbsd.spec.txt -t ffs -s 64k -f 10 -o minfree=0,version=1 $@ $$TDIR && rm -rf $$TDIR @COND_real_platform_TRUE@knetbsd.miniroot-image.x86_64.img: knetbsd.image.x86_64 $(GRUB_PAYLOADS_DIR)/knetbsd.miniroot.x86_64 @COND_real_platform_TRUE@ $(TARGET_OBJCOPY) --add-section=miniroot=$< $(GRUB_PAYLOADS_DIR)/knetbsd.miniroot.x86_64 $@ @COND_real_platform_TRUE@kfreebsd-mfsroot.i386.gz: kfreebsd-mfsroot.i386.img @COND_real_platform_TRUE@ gzip < $< > $@ @COND_real_platform_TRUE@bootcheck-kfreebsd-i386: kfreebsd-mfsroot.i386.gz $(GRUB_PAYLOADS_DIR)/kfreebsd.i386 $(GRUB_PAYLOADS_DIR)/kfreebsd_env.i386 $(srcdir)/grub-core/tests/boot/kfreebsd.cfg grub-shell @COND_real_platform_TRUE@ ./grub-shell --timeout=$(BOOTCHECK_TIMEOUT) --qemu=$(QEMU32) --files=/mfsroot.gz=kfreebsd-mfsroot.i386.gz --files=/kfreebsd=$(GRUB_PAYLOADS_DIR)/kfreebsd.i386 --files=/kfreebsd_env=$(GRUB_PAYLOADS_DIR)/kfreebsd_env.i386 $(srcdir)/grub-core/tests/boot/kfreebsd.cfg | grep $(SUCCESSFUL_BOOT_STRING) > /dev/null @COND_real_platform_TRUE@kfreebsd-mfsroot.x86_64.gz: kfreebsd-mfsroot.x86_64.img @COND_real_platform_TRUE@ gzip < $< > $@ @COND_real_platform_TRUE@bootcheck-kfreebsd-x86_64: kfreebsd-mfsroot.x86_64.gz $(GRUB_PAYLOADS_DIR)/kfreebsd.x86_64 $(GRUB_PAYLOADS_DIR)/kfreebsd_env.x86_64 $(srcdir)/grub-core/tests/boot/kfreebsd.cfg grub-shell @COND_real_platform_TRUE@ ./grub-shell --timeout=$(BOOTCHECK_TIMEOUT) --qemu=qemu-system-x86_64 --files=/mfsroot.gz=kfreebsd-mfsroot.x86_64.gz --files=/kfreebsd=$(GRUB_PAYLOADS_DIR)/kfreebsd.x86_64 --files=/kfreebsd_env=$(GRUB_PAYLOADS_DIR)/kfreebsd_env.x86_64 $(srcdir)/grub-core/tests/boot/kfreebsd.cfg | grep $(SUCCESSFUL_BOOT_STRING) > /dev/null @COND_real_platform_TRUE@knetbsd.miniroot-image.i386.gz: knetbsd.miniroot-image.i386.img @COND_real_platform_TRUE@ gzip < $< > $@ @COND_real_platform_TRUE@bootcheck-knetbsd-i386: knetbsd.miniroot-image.i386.gz $(GRUB_PAYLOADS_DIR)/knetbsd.i386 $(srcdir)/grub-core/tests/boot/knetbsd.cfg grub-shell @COND_real_platform_TRUE@ ./grub-shell --timeout=$(BOOTCHECK_TIMEOUT) --qemu=$(QEMU32) --files=/miniroot.gz=knetbsd.miniroot-image.i386.gz --files=/knetbsd=$(GRUB_PAYLOADS_DIR)/knetbsd.i386 $(srcdir)/grub-core/tests/boot/knetbsd.cfg | grep $(SUCCESSFUL_BOOT_STRING) > /dev/null @COND_real_platform_TRUE@bootcheck-kopenbsd-i386: kopenbsd.image.i386 $(GRUB_PAYLOADS_DIR)/kopenbsd.i386 $(srcdir)/grub-core/tests/boot/kopenbsd.cfg grub-shell @COND_real_platform_TRUE@ ./grub-shell --timeout=$(BOOTCHECK_TIMEOUT) --qemu=$(QEMU32) --files=/ramdisk=kopenbsd.image.i386 --files=/kopenbsd=$(GRUB_PAYLOADS_DIR)/kopenbsd.i386 $(srcdir)/grub-core/tests/boot/kopenbsd.cfg | grep $(SUCCESSFUL_BOOT_STRING) > /dev/null @COND_real_platform_TRUE@bootcheck-kopenbsd-x86_64: kopenbsd.image.x86_64 $(GRUB_PAYLOADS_DIR)/kopenbsd.x86_64 $(srcdir)/grub-core/tests/boot/kopenbsd.cfg grub-shell @COND_real_platform_TRUE@ ./grub-shell --timeout=$(BOOTCHECK_TIMEOUT) --qemu=qemu-system-x86_64 --files=/ramdisk=kopenbsd.image.x86_64 --files=/kopenbsd=$(GRUB_PAYLOADS_DIR)/kopenbsd.x86_64 $(srcdir)/grub-core/tests/boot/kopenbsd.cfg | grep $(SUCCESSFUL_BOOT_STRING) > /dev/null @COND_real_platform_TRUE@knetbsd.miniroot-image.x86_64.gz: knetbsd.miniroot-image.x86_64.img @COND_real_platform_TRUE@ gzip < $< > $@ @COND_real_platform_TRUE@bootcheck-knetbsd-x86_64: knetbsd.miniroot-image.x86_64.gz $(GRUB_PAYLOADS_DIR)/knetbsd.x86_64 $(srcdir)/grub-core/tests/boot/knetbsd.cfg grub-shell @COND_real_platform_TRUE@ ./grub-shell --timeout=$(BOOTCHECK_TIMEOUT) --qemu=qemu-system-x86_64 --files=/miniroot.gz=knetbsd.miniroot-image.x86_64.gz --files=/knetbsd=$(GRUB_PAYLOADS_DIR)/knetbsd.x86_64 $(srcdir)/grub-core/tests/boot/knetbsd.cfg | grep $(SUCCESSFUL_BOOT_STRING) > /dev/null @COND_real_platform_TRUE@bootcheck-linux-i386: linux-initramfs.i386 $(GRUB_PAYLOADS_DIR)/linux.i386 $(srcdir)/grub-core/tests/boot/linux.cfg grub-shell @COND_real_platform_TRUE@ ./grub-shell --timeout=$(BOOTCHECK_TIMEOUT) --qemu=$(QEMU32) --files=/initrd=linux-initramfs.i386 --files=/linux=$(GRUB_PAYLOADS_DIR)/linux.i386 $(srcdir)/grub-core/tests/boot/linux.cfg --qemu-opts="-cpu $(MINIMUM_CPU_LINUX)" | grep $(SUCCESSFUL_BOOT_STRING) > /dev/null @COND_real_platform_TRUE@bootcheck-linux-x86_64: linux-initramfs.x86_64 $(GRUB_PAYLOADS_DIR)/linux.x86_64 $(srcdir)/grub-core/tests/boot/linux.cfg grub-shell @COND_real_platform_TRUE@ ./grub-shell --timeout=$(BOOTCHECK_TIMEOUT) --qemu=qemu-system-x86_64 --files=/initrd=linux-initramfs.x86_64 --files=/linux=$(GRUB_PAYLOADS_DIR)/linux.x86_64 $(srcdir)/grub-core/tests/boot/linux.cfg | grep $(SUCCESSFUL_BOOT_STRING) > /dev/null @COND_real_platform_TRUE@bootcheck-linux-mips: linux-initramfs.mips $(GRUB_PAYLOADS_DIR)/linux.mips $(srcdir)/grub-core/tests/boot/linux.cfg grub-shell @COND_real_platform_TRUE@ ./grub-shell --timeout=$(BOOTCHECK_TIMEOUT) --files=/initrd=linux-initramfs.mips --files=/linux=$(GRUB_PAYLOADS_DIR)/linux.mips $(srcdir)/grub-core/tests/boot/linux.cfg | grep $(SUCCESSFUL_BOOT_STRING) > /dev/null @COND_real_platform_TRUE@bootcheck-linux-ppc: linux-initramfs.ppc $(GRUB_PAYLOADS_DIR)/linux.ppc $(srcdir)/grub-core/tests/boot/linux.cfg grub-shell @COND_real_platform_TRUE@ ./grub-shell --timeout=$(BOOTCHECK_TIMEOUT) --files=/initrd=linux-initramfs.ppc --files=/linux=$(GRUB_PAYLOADS_DIR)/linux.ppc $(srcdir)/grub-core/tests/boot/linux-ppc.cfg | grep $(SUCCESSFUL_BOOT_STRING) > /dev/null @COND_real_platform_TRUE@bootcheck-linux-mipsel: linux-initramfs.mipsel $(GRUB_PAYLOADS_DIR)/linux.mipsel $(srcdir)/grub-core/tests/boot/linux.cfg grub-shell @COND_real_platform_TRUE@ ./grub-shell --timeout=$(BOOTCHECK_TIMEOUT) --files=/initrd=linux-initramfs.mipsel --files=/linux=$(GRUB_PAYLOADS_DIR)/linux.mipsel $(srcdir)/grub-core/tests/boot/linux.cfg | grep $(SUCCESSFUL_BOOT_STRING) > /dev/null @COND_real_platform_TRUE@bootcheck-linux-loongson: linux-initramfs.loongson $(GRUB_PAYLOADS_DIR)/linux.loongson $(srcdir)/grub-core/tests/boot/linux.cfg grub-shell @COND_real_platform_TRUE@ ./grub-shell --timeout=$(BOOTCHECK_TIMEOUT) --files=/initrd=linux-initramfs.loongson --files=/linux=$(GRUB_PAYLOADS_DIR)/linux.loongson $(srcdir)/grub-core/tests/boot/linux.cfg | grep $(SUCCESSFUL_BOOT_STRING) > /dev/null @COND_real_platform_TRUE@bootcheck-linux16-i386: linux-initramfs.i386 $(GRUB_PAYLOADS_DIR)/linux.i386 $(srcdir)/grub-core/tests/boot/linux.cfg grub-shell @COND_real_platform_TRUE@ ./grub-shell --timeout=$(BOOTCHECK_TIMEOUT) --qemu=$(QEMU32) --files=/initrd=linux-initramfs.i386 --files=/linux=$(GRUB_PAYLOADS_DIR)/linux.i386 $(srcdir)/grub-core/tests/boot/linux16.cfg | grep $(SUCCESSFUL_BOOT_STRING) > /dev/null @COND_real_platform_TRUE@bootcheck-linux16-x86_64: linux-initramfs.x86_64 $(GRUB_PAYLOADS_DIR)/linux.x86_64 $(srcdir)/grub-core/tests/boot/linux.cfg grub-shell @COND_real_platform_TRUE@ ./grub-shell --timeout=$(BOOTCHECK_TIMEOUT) --qemu=qemu-system-x86_64 --files=/initrd=linux-initramfs.x86_64 --files=/linux=$(GRUB_PAYLOADS_DIR)/linux.x86_64 $(srcdir)/grub-core/tests/boot/linux16.cfg | grep $(SUCCESSFUL_BOOT_STRING) > /dev/null @COND_real_platform_TRUE@bootcheck-multiboot: multiboot.elf $(srcdir)/grub-core/tests/boot/multiboot.cfg grub-shell @COND_real_platform_TRUE@ ./grub-shell --timeout=$(BOOTCHECK_TIMEOUT) --qemu=$(QEMU32) --files=/multiboot.elf=multiboot.elf $(srcdir)/grub-core/tests/boot/multiboot.cfg | grep $(SUCCESSFUL_BOOT_STRING) > /dev/null @COND_real_platform_TRUE@bootcheck-multiboot2: multiboot2.elf $(srcdir)/grub-core/tests/boot/multiboot2.cfg grub-shell @COND_real_platform_TRUE@ ./grub-shell --timeout=$(BOOTCHECK_TIMEOUT) --qemu=$(QEMU32) --files=/multiboot2.elf=multiboot2.elf $(srcdir)/grub-core/tests/boot/multiboot2.cfg | grep $(SUCCESSFUL_BOOT_STRING) > /dev/null @COND_real_platform_TRUE@bootcheck-kfreebsd-aout: kfreebsd.aout $(srcdir)/grub-core/tests/boot/kfreebsd-aout.cfg grub-shell @COND_real_platform_TRUE@ ./grub-shell --timeout=$(BOOTCHECK_TIMEOUT) --qemu=$(QEMU32) --files=/kfreebsd.aout=kfreebsd.aout $(srcdir)/grub-core/tests/boot/kfreebsd-aout.cfg | grep $(SUCCESSFUL_BOOT_STRING) > /dev/null @COND_real_platform_TRUE@bootcheck-pc-chainloader: pc-chainloader.bin $(srcdir)/grub-core/tests/boot/pc-chainloader.cfg grub-shell @COND_real_platform_TRUE@ ./grub-shell --timeout=$(BOOTCHECK_TIMEOUT) --qemu=$(QEMU32) --files=/pc-chainloader.bin=pc-chainloader.bin $(srcdir)/grub-core/tests/boot/pc-chainloader.cfg | grep $(SUCCESSFUL_BOOT_STRING) > /dev/null @COND_real_platform_TRUE@bootcheck-ntldr: ntldr.bin $(srcdir)/grub-core/tests/boot/ntldr.cfg grub-shell @COND_real_platform_TRUE@ ./grub-shell --timeout=$(BOOTCHECK_TIMEOUT) --qemu=$(QEMU32) --files=/ntldr.bin=ntldr.bin $(srcdir)/grub-core/tests/boot/ntldr.cfg | grep $(SUCCESSFUL_BOOT_STRING) > /dev/null @COND_real_platform_TRUE@.PHONY: bootcheck-linux-i386 bootcheck-linux-x86_64 \ @COND_real_platform_TRUE@ bootcheck-kfreebsd-i386 bootcheck-kfreebsd-x86_64 \ @COND_real_platform_TRUE@ bootcheck-knetbsd-i386 bootcheck-knetbsd-x86_64 \ @COND_real_platform_TRUE@ bootcheck-linux-mips FORCE @COND_real_platform_TRUE@bootcheck: $(BOOTCHECKS) @COND_i386_coreboot_TRUE@@COND_real_platform_TRUE@FS_PAYLOAD_MODULES ?= $(shell cat grub-core/fs.lst) @COND_i386_coreboot_TRUE@@COND_real_platform_TRUE@default_payload.elf: grub-mkstandalone grub-mkimage FORCE @COND_i386_coreboot_TRUE@@COND_real_platform_TRUE@ test -f $@ && rm $@ || true @COND_i386_coreboot_TRUE@@COND_real_platform_TRUE@ pkgdatadir=. ./grub-mkstandalone --grub-mkimage=./grub-mkimage -O i386-coreboot -o $@ --modules='ahci pata ehci uhci ohci usb_keyboard usbms part_msdos ext2 fat at_keyboard part_gpt usbserial_usbdebug cbfs' --install-modules='ls linux search configfile normal cbtime cbls memrw iorw minicmd lsmmap lspci halt reboot hexdump pcidump regexp setpci lsacpi chain test serial multiboot cbmemc linux16 gzio echo help syslinuxcfg xnu $(FS_PAYLOAD_MODULES) password_pbkdf2 $(EXTRA_PAYLOAD_MODULES)' --fonts= --themes= --locales= -d grub-core/ /boot/grub/grub.cfg=$(srcdir)/coreboot.cfg windowsdir: $(PROGRAMS) $(starfield_DATA) $(platform_DATA) test -d $(windowsdir) && rm -rf $(windowsdir) || true test -d $(windowsdir) || mkdir $(windowsdir) $(MAKE) -C po $(AM_MAKEFLAGS) windowsdir $(MAKE) -C grub-core $(AM_MAKEFLAGS) windowsdir test -d $(windowsdir)/themes || mkdir $(windowsdir)/themes test -d $(windowsdir)/themes/starfield || mkdir $(windowsdir)/themes/starfield for x in $(PROGRAMS); do \ if [ x$(STRIP) != x ]; then $(STRIP) $$x -o $(windowsdir)/$$x; \ else cp -fp $$x $(windowsdir)/$$x; fi; \ done for x in $(pkgdata_DATA); do \ cp -fp $$x $(windowsdir)/$$x; \ done for x in $(starfield_DATA); do \ cp -fp $$x $(windowsdir)/themes/starfield/$$(basename $$x); \ done for x in $(GRUB_WINDOWS_EXTRA_DIST); do \ cp -fp $$x $(windowsdir); \ done windowszip: windowsdir test -f $(windowszip) && rm $(windowszip) || true zip -r $(windowszip) $(windowsdir) rm -rf $(windowsdir) ChangeLog: FORCE if test -d $(top_srcdir)/.git; then \ $(gitlog_to_changelog) --srcdir=$(top_srcdir) --since=$(changelog_start_date) > '$@.tmp'; \ rm -f '$@'; mv '$@.tmp' '$@'; \ else \ touch $@; \ fi syslinux_test: $(top_builddir)/config.status tests/syslinux/ubuntu10.04_grub.cfg # Mimic simplify_filename from grub-core/lib/syslinux_parse.c, so that we # can predict its behaviour in tests. We have to pre-substitute this before # calling config.status, as config.status offers no reliable way to hook in # a command between setting ac_abs_top_srcdir and emitting output files. tests/syslinux/ubuntu10.04_grub.cfg: $(top_builddir)/config.status tests/syslinux/ubuntu10.04_grub.cfg.in simplified_abs_top_srcdir=`echo "$(abs_top_srcdir)" | sed 's,//,/,g; s,/\./,/,g; :loop; s,/[^/][^/]*/\.\.\(/\|$$\),\1,; t loop'`; \ sed "s,@simplified_abs_top_srcdir@,$$simplified_abs_top_srcdir,g" $(srcdir)/tests/syslinux/ubuntu10.04_grub.cfg.in | $(top_builddir)/config.status --file=$@:- # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: grub-2.14~git20250718.0e36779/autogen.sh0000755000175000017500000001246015036447510014007 00000000000000#! /usr/bin/env bash set -e if [ ! -e grub-core/lib/gnulib/stdlib.in.h ]; then echo "Gnulib not yet bootstrapped; run ./bootstrap instead." >&2 exit 1 fi # Detect python if [ -z "$PYTHON" ]; then for i in python3 python3.10 python; do if command -v "$i" > /dev/null 2>&1; then PYTHON="$i" echo "Using $PYTHON..." break fi done if [ -z "$PYTHON" ]; then echo "python not found." >&2 exit 1 fi fi export LC_COLLATE=C unset LC_ALL find . -iname '*.[ch]' ! -ipath './grub-core/lib/libgcrypt-grub/*' ! -ipath './build-aux/*' ! -ipath './grub-core/lib/libgcrypt/src/misc.c' ! -ipath './grub-core/lib/libgcrypt/src/global.c' ! -ipath './grub-core/lib/libgcrypt/src/secmem.c' ! -ipath './util/grub-gen-widthspec.c' ! -ipath './util/grub-gen-asciih.c' ! -ipath './gnulib/*' ! -ipath './grub-core/lib/gnulib/*' |sort > po/POTFILES.in find util -iname '*.in' ! -name Makefile.in |sort > po/POTFILES-shell.in echo "Importing unicode..." ${PYTHON} util/import_unicode.py unicode/UnicodeData.txt unicode/BidiMirroring.txt unicode/ArabicShaping.txt grub-core/unidata.c echo "Importing libgcrypt..." ${PYTHON} util/import_gcry.py grub-core/lib/libgcrypt/ grub-core sed -n -f util/import_gcrypth.sed < grub-core/lib/libgcrypt/src/gcrypt.h.in > include/grub/gcrypt/gcrypt.h sed -n -f util/import_gcrypt_inth.sed < grub-core/lib/libgcrypt/src/gcrypt-int.h >> include/grub/gcrypt/gcrypt.h if [ -f include/grub/gcrypt/g10lib.h ]; then rm include/grub/gcrypt/g10lib.h fi if [ -d grub-core/lib/libgcrypt-grub/mpi/generic ]; then rm -rf grub-core/lib/libgcrypt-grub/mpi/generic fi cp grub-core/lib/libgcrypt-grub/src/g10lib.h include/grub/gcrypt/g10lib.h cp -R grub-core/lib/libgcrypt/mpi/generic grub-core/lib/libgcrypt-grub/mpi/generic for x in mpi-asm-defs.h mpih-add1.c mpih-sub1.c mpih-mul1.c mpih-mul2.c mpih-mul3.c mpih-lshift.c mpih-rshift.c; do if [ -h grub-core/lib/libgcrypt-grub/mpi/"$x" ] || [ -f grub-core/lib/libgcrypt-grub/mpi/"$x" ]; then rm grub-core/lib/libgcrypt-grub/mpi/"$x" fi cp grub-core/lib/libgcrypt-grub/mpi/generic/"$x" grub-core/lib/libgcrypt-grub/mpi/"$x" done for x in grub-core/lib/libgcrypt-patches/*.patch; do patch -i $x -p1 done echo "Importing libtasn1..." if [ -d grub-core/lib/libtasn1-grub ]; then rm -rf grub-core/lib/libtasn1-grub fi mkdir -p grub-core/lib/libtasn1-grub/lib cp grub-core/lib/libtasn1/lib/*.[ch] grub-core/lib/libtasn1-grub/lib cp grub-core/lib/libtasn1/libtasn1.h grub-core/lib/libtasn1-grub/ if [ -d grub-core/tests/asn1/tests ]; then rm -rf grub-core/tests/asn1/tests fi mkdir grub-core/tests/asn1/tests cp grub-core/lib/libtasn1/tests/*.[ch] grub-core/tests/asn1/tests for patch in \ 0001-libtasn1-disable-code-not-needed-in-grub.patch \ 0002-libtasn1-replace-strcat-with-strcpy-in-_asn1_str_cat.patch \ 0003-libtasn1-replace-strcat-with-_asn1_str_cat.patch \ 0004-libtasn1-adjust-the-header-paths-in-libtasn1.h.patch \ 0005-libtasn1-Use-grub_divmod64-for-division.patch \ 0006-libtasn1-fix-the-potential-buffer-overrun.patch \ 0007-asn1_test-include-asn1_test.h-only.patch \ 0008-asn1_test-rename-the-main-functions-to-the-test-name.patch \ 0009-asn1_test-return-either-0-or-1-to-reflect-the-result.patch \ 0010-asn1_test-remove-verbose-and-the-unnecessary-printf.patch \ 0011-asn1_test-print-the-error-messages-with-grub_printf.patch \ 0012-asn1_test-use-the-grub-specific-functions-and-types.patch \ 0013-asn1_test-enable-the-testcase-only-when-GRUB_LONG_MA.patch ; do patch -p1 -i grub-core/lib/libtasn1-patches/$patch done echo "Generating Automake input..." # Automake doesn't like including files from a path outside the project. rm -f contrib grub-core/contrib if [ "x${GRUB_CONTRIB}" != x ]; then [ "${GRUB_CONTRIB}" = contrib ] || ln -s "${GRUB_CONTRIB}" contrib [ "${GRUB_CONTRIB}" = grub-core/contrib ] || ln -s ../contrib grub-core/contrib fi UTIL_DEFS='Makefile.util.def Makefile.utilgcry.def' CORE_DEFS='grub-core/Makefile.core.def grub-core/Makefile.gcry.def' for extra in contrib/*/Makefile.util.def; do if test -e "$extra"; then UTIL_DEFS="$UTIL_DEFS $extra" fi done for extra in contrib/*/Makefile.core.def; do if test -e "$extra"; then CORE_DEFS="$CORE_DEFS $extra" fi done ${PYTHON} gentpl.py $UTIL_DEFS > Makefile.util.am ${PYTHON} gentpl.py $CORE_DEFS > grub-core/Makefile.core.am for extra in contrib/*/Makefile.common; do if test -e "$extra"; then echo "include $extra" >> Makefile.util.am echo "include $extra" >> grub-core/Makefile.core.am fi done for extra in contrib/*/Makefile.util.common; do if test -e "$extra"; then echo "include $extra" >> Makefile.util.am fi done for extra in contrib/*/Makefile.core.common; do if test -e "$extra"; then echo "include $extra" >> grub-core/Makefile.core.am fi done echo "Saving timestamps..." echo timestamp > stamp-h.in if [ -z "$FROM_BOOTSTRAP" ]; then # Unaided autoreconf is likely to install older versions of many files # than the ones provided by Gnulib, but in most cases this won't matter # very much. This mode is provided so that you can run ./autogen.sh to # regenerate the GRUB build system in an unpacked release tarball (perhaps # after patching it), even on systems that don't have access to # gnulib.git. echo "Running autoreconf..." cp -a INSTALL INSTALL.grub autoreconf -vif mv INSTALL.grub INSTALL fi exit 0 grub-2.14~git20250718.0e36779/Makefile.am0000644000175000017500000007423715033436367014061 00000000000000AUTOMAKE_OPTIONS = subdir-objects -Wno-portability DEPDIR = .deps-util SUBDIRS = grub-core/lib/gnulib . if COND_real_platform SUBDIRS += grub-core endif SUBDIRS += po docs util/bash-completion.d include $(top_srcdir)/conf/Makefile.common include $(top_srcdir)/conf/Makefile.extra-dist AM_CFLAGS = $(HOST_CFLAGS) AM_LDFLAGS = $(HOST_LDFLAGS) AM_CPPFLAGS = $(HOST_CPPFLAGS) $(CPPFLAGS_DEFAULT) AM_CCASFLAGS = $(HOST_CCASFLAGS) $(CCASFLAGS_DEFAULT) ACLOCAL_AMFLAGS = -I m4 CFLAGS_PROGRAM += $(CFLAGS_GNULIB) LDFLAGS_PROGRAM += $(LDFLAGS_GNULIB) CPPFLAGS_PROGRAM += $(CPPFLAGS_GNULIB) CCASFLAGS_PROGRAM += $(CCASFLAGS_GNULIB) include $(srcdir)/Makefile.util.am check_SCRIPTS = $(check_SCRIPTS_native) $(check_SCRIPTS_nonnative) check_PROGRAMS = $(check_PROGRAMS_native) $(check_PROGRAMS_nonnative) TESTS = $(check_SCRIPTS) $(check_PROGRAMS) check-native: $(MAKE) TESTS="$(check_PROGRAMS_native) $(check_SCRIPTS_native)" check check-nonnative: $(MAKE) TESTS="$(check_PROGRAMS_nonnative) $(check_SCRIPTS_nonnative)" check # XXX Use Automake's LEX & YACC support grub_script.tab.h: $(top_srcdir)/grub-core/script/parser.y $(YACC) -d -p grub_script_yy -b grub_script $(top_srcdir)/grub-core/script/parser.y grub_script.tab.c: grub_script.tab.h CLEANFILES += grub_script.tab.c grub_script.tab.h # For the lexer. grub_script.yy.h: $(top_srcdir)/grub-core/script/yylex.l $(LEX) -o grub_script.yy.c --header-file=grub_script.yy.h $(top_srcdir)/grub-core/script/yylex.l grub_script.yy.c: grub_script.yy.h CLEANFILES += grub_script.yy.c grub_script.yy.h # For libgrub.a libgrub.pp: config-util.h grub_script.tab.h grub_script.yy.h $(libgrubmods_a_SOURCES) $(libgrubkern_a_SOURCES) $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) \ -D'GRUB_MOD_INIT(x)=@MARKER@x@' $^ > $@ || (rm -f $@; exit 1) CLEANFILES += libgrub.pp libgrub_a_init.lst: libgrub.pp cat $< | grep '^@MARKER@' | sed 's/@MARKER@\(.*\)@/\1/g' | sort -u > $@ || (rm -f $@; exit 1) CLEANFILES += libgrub_a_init.lst libgrub_a_init.c: libgrub_a_init.lst $(top_srcdir)/geninit.sh sh $(top_srcdir)/geninit.sh `cat $<` > $@ || (rm -f $@; exit 1) CLEANFILES += libgrub_a_init.c # For grub-fstest grub_fstest.pp: config-util.h $(grub_fstest_SOURCES) $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(grub_fstest_CPPFLAGS) $(CPPFLAGS) \ -D'GRUB_MOD_INIT(x)=@MARKER@x@' $^ > $@ || (rm -f $@; exit 1) CLEANFILES += grub_fstest.pp grub_fstest_init.lst: libgrub.pp grub_fstest.pp cat $^ | grep '^@MARKER@' | sed 's/@MARKER@\(.*\)@/\1/g' | sort -u > $@ || (rm -f $@; exit 1) CLEANFILES += grub_fstest_init.lst grub_fstest_init.c: grub_fstest_init.lst $(top_srcdir)/geninit.sh sh $(top_srcdir)/geninit.sh `cat $<` > $@ || (rm -f $@; exit 1) CLEANFILES += grub_fstest_init.c if COND_HAVE_FONT_SOURCE pkgdata_DATA += unicode.pf2 ascii.pf2 euro.pf2 ascii.h widthspec.h endif starfield_theme_files = $(srcdir)/themes/starfield/blob_w.png $(srcdir)/themes/starfield/boot_menu_c.png $(srcdir)/themes/starfield/boot_menu_e.png $(srcdir)/themes/starfield/boot_menu_ne.png $(srcdir)/themes/starfield/boot_menu_n.png $(srcdir)/themes/starfield/boot_menu_nw.png $(srcdir)/themes/starfield/boot_menu_se.png $(srcdir)/themes/starfield/boot_menu_s.png $(srcdir)/themes/starfield/boot_menu_sw.png $(srcdir)/themes/starfield/boot_menu_w.png $(srcdir)/themes/starfield/slider_c.png $(srcdir)/themes/starfield/slider_n.png $(srcdir)/themes/starfield/slider_s.png $(srcdir)/themes/starfield/starfield.png $(srcdir)/themes/starfield/terminal_box_c.png $(srcdir)/themes/starfield/terminal_box_e.png $(srcdir)/themes/starfield/terminal_box_ne.png $(srcdir)/themes/starfield/terminal_box_n.png $(srcdir)/themes/starfield/terminal_box_nw.png $(srcdir)/themes/starfield/terminal_box_se.png $(srcdir)/themes/starfield/terminal_box_s.png $(srcdir)/themes/starfield/terminal_box_sw.png $(srcdir)/themes/starfield/terminal_box_w.png $(srcdir)/themes/starfield/theme.txt $(srcdir)/themes/starfield/README $(srcdir)/themes/starfield/COPYING.CC-BY-SA-3.0 build-grub-mkfont$(BUILD_EXEEXT): util/grub-mkfont.c grub-core/unidata.c grub-core/kern/emu/misc.c util/misc.c $(BUILD_CC) -o $@ -I$(top_srcdir)/include $(BUILD_CFLAGS) $(BUILD_CPPFLAGS) $(BUILD_LDFLAGS) -DGRUB_MKFONT=1 -DGRUB_BUILD=1 -DGRUB_UTIL=1 -DGRUB_BUILD_PROGRAM_NAME=\"build-grub-mkfont\" $^ $(BUILD_FREETYPE_CFLAGS) $(BUILD_FREETYPE_LIBS) CLEANFILES += build-grub-mkfont$(BUILD_EXEEXT) garbage-gen$(BUILD_EXEEXT): util/garbage-gen.c $(BUILD_CC) -o $@ $(BUILD_CFLAGS) $(BUILD_CPPFLAGS) $(BUILD_LDFLAGS) $^ CLEANFILES += garbage-gen$(BUILD_EXEEXT) EXTRA_DIST += util/garbage-gen.c build-grub-gen-asciih$(BUILD_EXEEXT): util/grub-gen-asciih.c $(BUILD_CC) -o $@ -I$(top_srcdir)/include $(BUILD_CFLAGS) $(BUILD_CPPFLAGS) $(BUILD_LDFLAGS) -DGRUB_MKFONT=1 -DGRUB_BUILD=1 -DGRUB_UTIL=1 $^ $(BUILD_FREETYPE_CFLAGS) $(BUILD_FREETYPE_LIBS) -Wall -Werror CLEANFILES += build-grub-gen-asciih$(BUILD_EXEEXT) build-grub-gen-widthspec$(BUILD_EXEEXT): util/grub-gen-widthspec.c $(BUILD_CC) -o $@ -I$(top_srcdir)/include $(BUILD_CFLAGS) $(BUILD_CPPFLAGS) $(BUILD_LDFLAGS) -DGRUB_MKFONT=1 -DGRUB_BUILD=1 -DGRUB_UTIL=1 $^ $(BUILD_FREETYPE_CFLAGS) $(BUILD_FREETYPE_LIBS) -Wall -Werror CLEANFILES += build-grub-gen-widthspec$(BUILD_EXEEXT) if COND_STARFIELD starfield_DATA = dejavu_10.pf2 dejavu_12.pf2 dejavu_bold_14.pf2 dejavu_14.pf2 dejavu_16.pf2 $(starfield_theme_files) dejavu_10.pf2: $(DJVU_FONT_SOURCE) build-grub-mkfont$(BUILD_EXEEXT) ./build-grub-mkfont$(BUILD_EXEEXT) -s 10 -o $@ $(DJVU_FONT_SOURCE) CLEANFILES += dejavu_10.pf2 dejavu_12.pf2: $(DJVU_FONT_SOURCE) build-grub-mkfont$(BUILD_EXEEXT) ./build-grub-mkfont$(BUILD_EXEEXT) -s 12 -o $@ $(DJVU_FONT_SOURCE) CLEANFILES += dejavu_12.pf2 dejavu_14.pf2: $(DJVU_FONT_SOURCE) build-grub-mkfont$(BUILD_EXEEXT) ./build-grub-mkfont$(BUILD_EXEEXT) -s 14 -o $@ $(DJVU_FONT_SOURCE) CLEANFILES += dejavu_14.pf2 dejavu_bold_14.pf2: $(DJVU_FONT_SOURCE) build-grub-mkfont$(BUILD_EXEEXT) ./build-grub-mkfont$(BUILD_EXEEXT) -b -s 14 -o $@ $(DJVU_FONT_SOURCE) CLEANFILES += dejavu_bold_14.pf2 dejavu_16.pf2: $(DJVU_FONT_SOURCE) build-grub-mkfont$(BUILD_EXEEXT) ./build-grub-mkfont$(BUILD_EXEEXT) -s 16 -o $@ $(DJVU_FONT_SOURCE) CLEANFILES += dejavu_16.pf2 else starfield_DATA = endif EXTRA_DIST += $(starfield_theme_files) EXTRA_DIST += $(srcdir)/themes/starfield/src/slider_s.xcf $(srcdir)/themes/starfield/src/slider_n.xcf $(srcdir)/themes/starfield/src/slider_c.xcf $(srcdir)/themes/starfield/src/blob_nw.xcf $(srcdir)/themes/starfield/src/bootmenu/center.xcf $(srcdir)/themes/starfield/src/bootmenu/corner.xcf $(srcdir)/themes/starfield/src/bootmenu/side.xcf $(srcdir)/themes/starfield/src/terminalbox/side.xcf $(srcdir)/themes/starfield/src/terminalbox/corner.xcf $(srcdir)/themes/starfield/src/terminalbox/center.xcf unicode.pf2: $(FONT_SOURCE) build-grub-mkfont$(BUILD_EXEEXT) ./build-grub-mkfont$(BUILD_EXEEXT) -o $@ $(FONT_SOURCE) || (rm -f $@; exit 1) CLEANFILES += unicode.pf2 # Arrows and lines are needed to draw the menu, so always include them UNICODE_ARROWS=0x2190-0x2193 UNICODE_LINES=0x2501-0x251B ascii.pf2: $(FONT_SOURCE) build-grub-mkfont$(BUILD_EXEEXT) ./build-grub-mkfont$(BUILD_EXEEXT) -o $@ $(FONT_SOURCE) -r 0x0-0x7f,$(UNICODE_ARROWS),$(UNICODE_LINES) || (rm -f $@; exit 1) CLEANFILES += ascii.pf2 euro.pf2: $(FONT_SOURCE) build-grub-mkfont$(BUILD_EXEEXT) ./build-grub-mkfont$(BUILD_EXEEXT) -o $@ $(FONT_SOURCE) -r 0x0-0x4ff,0x1e00-0x1fff,$(UNICODE_ARROWS),$(UNICODE_LINES) || (rm -f $@; exit 1) CLEANFILES += euro.pf2 ascii.h: $(FONT_SOURCE) build-grub-gen-asciih$(BUILD_EXEEXT) ./build-grub-gen-asciih$(BUILD_EXEEXT) $(FONT_SOURCE) $@ || (rm -f $@; exit 1) CLEANFILES += ascii.h widthspec.h: $(FONT_SOURCE) build-grub-gen-widthspec$(BUILD_EXEEXT) ./build-grub-gen-widthspec$(BUILD_EXEEXT) $(FONT_SOURCE) $@ || (rm -f $@; exit 1) CLEANFILES += widthspec.h # Install config.h into platformdir nodist_platform_HEADERS = config.h pkgdata_DATA += grub-mkconfig_lib if COND_real_platform if COND_i386_coreboot QEMU32=qemu-system-i386 MINIMUM_CPU_LINUX=pentium2 endif if COND_i386_multiboot QEMU32=qemu-system-i386 MINIMUM_CPU_LINUX=pentium2 endif if COND_i386_ieee1275 QEMU32=qemu-system-i386 MINIMUM_CPU_LINUX=pentium2 endif if COND_i386_qemu QEMU32=qemu-system-i386 MINIMUM_CPU_LINUX=pentium2 endif if COND_i386_pc QEMU32=qemu-system-i386 MINIMUM_CPU_LINUX=pentium2 endif if COND_i386_efi QEMU32=qemu-system-i386 MINIMUM_CPU_LINUX=pentium2 endif if COND_x86_64_efi QEMU32=qemu-system-x86_64 MINIMUM_CPU_LINUX=core2duo endif linux.init.x86_64: $(srcdir)/grub-core/tests/boot/linux.init-x86_64.S $(srcdir)/grub-core/tests/boot/qemu-shutdown-x86.S $(TARGET_CC) -o $@ $< -static -m64 -nostdlib -nostdinc -DSUCCESSFUL_BOOT_STRING=\"$(SUCCESSFUL_BOOT_STRING)\" linux.init.i386: $(srcdir)/grub-core/tests/boot/linux.init-i386.S $(srcdir)/grub-core/tests/boot/qemu-shutdown-x86.S $(TARGET_CC) -o $@ $< -static -m32 -nostdlib -nostdinc -DSUCCESSFUL_BOOT_STRING=\"$(SUCCESSFUL_BOOT_STRING)\" linux.init.mips: $(srcdir)/grub-core/tests/boot/linux.init-mips.S $(TARGET_CC) -o $@ $< -static -nostdlib -nostdinc -DSUCCESSFUL_BOOT_STRING=\"$(SUCCESSFUL_BOOT_STRING)\" linux.init.ppc: $(srcdir)/grub-core/tests/boot/linux.init-ppc.S $(TARGET_CC) -o $@ $< -static -nostdlib -nostdinc -DSUCCESSFUL_BOOT_STRING=\"$(SUCCESSFUL_BOOT_STRING)\" linux.init.mipsel: $(srcdir)/grub-core/tests/boot/linux.init-mips.S $(TARGET_CC) -o $@ $< -static -nostdlib -nostdinc -DSUCCESSFUL_BOOT_STRING=\"$(SUCCESSFUL_BOOT_STRING)\" linux.init.loongson: $(srcdir)/grub-core/tests/boot/linux.init-mips.S $(TARGET_CC) -o $@ $< -static -nostdlib -nostdinc -DSUCCESSFUL_BOOT_STRING=\"$(SUCCESSFUL_BOOT_STRING)\" -DREBOOT=1 multiboot.elf: $(srcdir)/grub-core/tests/boot/kernel-i386.S $(srcdir)/grub-core/tests/boot/qemu-shutdown-x86.S $(TARGET_CC) -o $@ $< -DSUCCESSFUL_BOOT_STRING=\"$(SUCCESSFUL_BOOT_STRING)\" -static -ffreestanding -nostdlib -nostdinc -DTARGET_MULTIBOOT=1 -Wl,--build-id=none -Wl,-N -Wl,-Ttext,0x100000 -m32 -I$(srcdir)/include kfreebsd.elf: $(srcdir)/grub-core/tests/boot/kernel-i386.S $(srcdir)/grub-core/tests/boot/qemu-shutdown-x86.S $(TARGET_CC) -o $@ $< -DSUCCESSFUL_BOOT_STRING=\"$(SUCCESSFUL_BOOT_STRING)\" -static -ffreestanding -nostdlib -nostdinc -Wl,--build-id=none -Wl,-N -Wl,-Ttext,0x100000 -m32 -I$(srcdir)/include kfreebsd.aout: kfreebsd.elf $(TARGET_OBJCOPY) -O a.out-i386-linux $< $@ -j .text pc-chainloader.elf: $(srcdir)/grub-core/tests/boot/kernel-8086.S $(srcdir)/grub-core/tests/boot/qemu-shutdown-x86.S $(TARGET_CC) -o $@ $< -static -DTARGET_CHAINLOADER=1 -DSUCCESSFUL_BOOT_STRING=\"$(SUCCESSFUL_BOOT_STRING)\" -ffreestanding -nostdlib -nostdinc -Wl,--build-id=none -Wl,-N -Wl,-Ttext,0x7c00 -m32 pc-chainloader.bin: pc-chainloader.elf $(TARGET_OBJCOPY) -O binary --strip-unneeded -R .note -R .comment -R .note.gnu.build-id -R .reginfo -R .rel.dyn -R .note.gnu.gold-version $< $@; ntldr.elf: $(srcdir)/grub-core/tests/boot/kernel-8086.S $(srcdir)/grub-core/tests/boot/qemu-shutdown-x86.S $(TARGET_CC) -o $@ $< -DTARGET_NTLDR=1 -DSUCCESSFUL_BOOT_STRING=\"$(SUCCESSFUL_BOOT_STRING)\" -static -ffreestanding -nostdlib -nostdinc -Wl,--build-id=none -Wl,-N -Wl,-Ttext,0 -m32 ntldr.bin: ntldr.elf $(TARGET_OBJCOPY) -O binary --strip-unneeded -j .text $< $@; multiboot2.elf: $(srcdir)/grub-core/tests/boot/kernel-i386.S $(srcdir)/grub-core/tests/boot/qemu-shutdown-x86.S $(TARGET_CC) -static -o $@ $< -DSUCCESSFUL_BOOT_STRING=\"$(SUCCESSFUL_BOOT_STRING)\" -ffreestanding -nostdlib -nostdinc -Wl,--build-id=none -Wl,-N -Wl,-Ttext,0x100000 -m32 -I$(srcdir)/include -DTARGET_MULTIBOOT2=1 kfreebsd.init.x86_64: $(srcdir)/grub-core/tests/boot/kfreebsd.init-x86_64.S $(srcdir)/grub-core/tests/boot/qemu-shutdown-x86.S $(TARGET_CC) -o $@ $< -m64 -static -nostdlib -nostdinc -DSUCCESSFUL_BOOT_STRING=\"$(SUCCESSFUL_BOOT_STRING)\" && freebsd-brandelf -t FreeBSD $@ kfreebsd.init.i386: $(srcdir)/grub-core/tests/boot/kfreebsd.init-i386.S $(srcdir)/grub-core/tests/boot/qemu-shutdown-x86.S $(TARGET_CC) -o $@ $< -m32 -static -nostdlib -nostdinc -DSUCCESSFUL_BOOT_STRING=\"$(SUCCESSFUL_BOOT_STRING)\" && freebsd-brandelf -t FreeBSD $@ knetbsd.init.i386: $(srcdir)/grub-core/tests/boot/kbsd.init-i386.S $(srcdir)/grub-core/tests/boot/qemu-shutdown-x86.S $(TARGET_CC) -o $@ $< -m32 -static -nostdlib -nostdinc -DTARGET_NETBSD=1 -DSUCCESSFUL_BOOT_STRING=\"$(SUCCESSFUL_BOOT_STRING)\" kopenbsd.init.i386: $(srcdir)/grub-core/tests/boot/kbsd.init-i386.S $(srcdir)/grub-core/tests/boot/qemu-shutdown-x86.S $(TARGET_CC) -o $@ $< -m32 -static -nostdlib -nostdinc -DTARGET_OPENBSD=1 -DSUCCESSFUL_BOOT_STRING=\"$(SUCCESSFUL_BOOT_STRING)\" knetbsd.init.x86_64: $(srcdir)/grub-core/tests/boot/kbsd.init-x86_64.S $(srcdir)/grub-core/tests/boot/qemu-shutdown-x86.S $(TARGET_CC) -o $@ $< -m64 -DTARGET_NETBSD=1 -static -nostdlib -nostdinc -DSUCCESSFUL_BOOT_STRING=\"$(SUCCESSFUL_BOOT_STRING)\" kopenbsd.init.x86_64: $(srcdir)/grub-core/tests/boot/kbsd.init-x86_64.S $(srcdir)/grub-core/tests/boot/qemu-shutdown-x86.S $(TARGET_CC) -o $@ $< -m64 -DTARGET_OPENBSD=1 -static -nostdlib -nostdinc -DSUCCESSFUL_BOOT_STRING=\"$(SUCCESSFUL_BOOT_STRING)\" linux-initramfs.mips: linux.init.mips Makefile TDIR=`mktemp -d "$${TMPDIR:-/tmp}/tmp.XXXXXXXXXX"` && cp $< $$TDIR/init && (cd $$TDIR && echo ./init | cpio -R 0:0 --quiet --dereference -o -H newc) | gzip > $@ && rm -rf $$TDIR linux-initramfs.ppc: linux.init.ppc Makefile TDIR=`mktemp -d "$${TMPDIR:-/tmp}/tmp.XXXXXXXXXX"` && cp $< $$TDIR/init && (cd $$TDIR && echo ./init | cpio -R 0:0 --quiet --dereference -o -H newc) | gzip > $@ && rm -rf $$TDIR linux-initramfs.mipsel: linux.init.mipsel Makefile TDIR=`mktemp -d "$${TMPDIR:-/tmp}/tmp.XXXXXXXXXX"` && cp $< $$TDIR/init && (cd $$TDIR && echo ./init | cpio -R 0:0 --quiet --dereference -o -H newc) | gzip > $@ && rm -rf $$TDIR linux-initramfs.loongson: linux.init.loongson Makefile TDIR=`mktemp -d "$${TMPDIR:-/tmp}/tmp.XXXXXXXXXX"` && cp $< $$TDIR/init && (cd $$TDIR && echo ./init | cpio -R 0:0 --quiet --dereference -o -H newc) | gzip > $@ && rm -rf $$TDIR linux-initramfs.i386: linux.init.i386 Makefile TDIR=`mktemp -d "$${TMPDIR:-/tmp}/tmp.XXXXXXXXXX"` && cp $< $$TDIR/init && (cd $$TDIR && echo ./init | cpio -R 0:0 --quiet --dereference -o -H newc) | gzip > $@ && rm -rf $$TDIR linux-initramfs.x86_64: linux.init.x86_64 Makefile TDIR=`mktemp -d "$${TMPDIR:-/tmp}/tmp.XXXXXXXXXX"` && cp $< $$TDIR/init && (cd $$TDIR && echo ./init | cpio -R 0:0 --quiet --dereference -o -H newc) | gzip > $@ && rm -rf $$TDIR kfreebsd-mfsroot.i386.img: kfreebsd.init.i386 Makefile TDIR=`mktemp -d "$${TMPDIR:-/tmp}/tmp.XXXXXXXXXX"` && mkdir $$TDIR/dev && mkdir $$TDIR/sbin && cp $< $$TDIR/sbin/init && makefs -t ffs -s 30m -f 1000 -o minfree=0,version=1 $@ $$TDIR && rm -rf $$TDIR knetbsd.image.i386: knetbsd.init.i386 $(srcdir)/grub-core/tests/boot/kbsd.spec.txt TDIR=`mktemp -d "$${TMPDIR:-/tmp}/tmp.XXXXXXXXXX"` && mkdir $$TDIR/dev && mkdir $$TDIR/sbin && cp $< $$TDIR/sbin/init && makefs -F $(srcdir)/grub-core/tests/boot/kbsd.spec.txt -t ffs -s 64k -f 10 -o minfree=0,version=1 $@ $$TDIR && rm -rf $$TDIR kopenbsd.image.i386: kopenbsd.init.i386 $(srcdir)/grub-core/tests/boot/kopenbsdlabel.txt TDIR=`mktemp -d "$${TMPDIR:-/tmp}/tmp.XXXXXXXXXX"` && mkdir $$TDIR/dev && mkdir $$TDIR/sbin && cp $< $$TDIR/sbin/init && makefs -F $(srcdir)/grub-core/tests/boot/kbsd.spec.txt -t ffs -s 128k -f 10 -o minfree=0,version=1 $@ $$TDIR && bsdlabel -f -R $@ $(srcdir)/grub-core/tests/boot/kopenbsdlabel.txt && rm -rf $$TDIR || rm -f $@ kopenbsd.image.x86_64: kopenbsd.init.x86_64 $(srcdir)/grub-core/tests/boot/kopenbsdlabel.txt TDIR=`mktemp -d "$${TMPDIR:-/tmp}/tmp.XXXXXXXXXX"` && mkdir $$TDIR/dev && mkdir $$TDIR/sbin && cp $< $$TDIR/sbin/init && makefs -F $(srcdir)/grub-core/tests/boot/kbsd.spec.txt -t ffs -s 128k -f 10 -o minfree=0,version=1 $@ $$TDIR && bsdlabel -f -R $@ $(srcdir)/grub-core/tests/boot/kopenbsdlabel.txt && rm -rf $$TDIR || rm -f $@ knetbsd.miniroot-image.i386.img: knetbsd.image.i386 $(GRUB_PAYLOADS_DIR)/knetbsd.miniroot.i386 $(TARGET_OBJCOPY) --add-section=miniroot=$< $(GRUB_PAYLOADS_DIR)/knetbsd.miniroot.i386 $@ kfreebsd-mfsroot.x86_64.img: kfreebsd.init.x86_64 Makefile TDIR=`mktemp -d "$${TMPDIR:-/tmp}/tmp.XXXXXXXXXX"` && mkdir $$TDIR/dev && mkdir $$TDIR/sbin && cp $< $$TDIR/sbin/init && makefs -t ffs -s 30m -f 1000 -o minfree=0,version=1 $@ $$TDIR && rm -rf $$TDIR knetbsd.image.x86_64: knetbsd.init.x86_64 $(srcdir)/grub-core/tests/boot/kbsd.spec.txt TDIR=`mktemp -d "$${TMPDIR:-/tmp}/tmp.XXXXXXXXXX"` && mkdir $$TDIR/dev && mkdir $$TDIR/sbin && cp $< $$TDIR/sbin/init && makefs -F $(srcdir)/grub-core/tests/boot/kbsd.spec.txt -t ffs -s 64k -f 10 -o minfree=0,version=1 $@ $$TDIR && rm -rf $$TDIR knetbsd.miniroot-image.x86_64.img: knetbsd.image.x86_64 $(GRUB_PAYLOADS_DIR)/knetbsd.miniroot.x86_64 $(TARGET_OBJCOPY) --add-section=miniroot=$< $(GRUB_PAYLOADS_DIR)/knetbsd.miniroot.x86_64 $@ CLEANFILES += linux.init.i386 kfreebsd.init.i386 linux.init.x86_64 linux-initramfs.i386 linux-initramfs.x86_64 kfreebsd-mfsroot.i386.gz: kfreebsd-mfsroot.i386.img gzip < $< > $@ bootcheck-kfreebsd-i386: kfreebsd-mfsroot.i386.gz $(GRUB_PAYLOADS_DIR)/kfreebsd.i386 $(GRUB_PAYLOADS_DIR)/kfreebsd_env.i386 $(srcdir)/grub-core/tests/boot/kfreebsd.cfg grub-shell ./grub-shell --timeout=$(BOOTCHECK_TIMEOUT) --qemu=$(QEMU32) --files=/mfsroot.gz=kfreebsd-mfsroot.i386.gz --files=/kfreebsd=$(GRUB_PAYLOADS_DIR)/kfreebsd.i386 --files=/kfreebsd_env=$(GRUB_PAYLOADS_DIR)/kfreebsd_env.i386 $(srcdir)/grub-core/tests/boot/kfreebsd.cfg | grep $(SUCCESSFUL_BOOT_STRING) > /dev/null kfreebsd-mfsroot.x86_64.gz: kfreebsd-mfsroot.x86_64.img gzip < $< > $@ bootcheck-kfreebsd-x86_64: kfreebsd-mfsroot.x86_64.gz $(GRUB_PAYLOADS_DIR)/kfreebsd.x86_64 $(GRUB_PAYLOADS_DIR)/kfreebsd_env.x86_64 $(srcdir)/grub-core/tests/boot/kfreebsd.cfg grub-shell ./grub-shell --timeout=$(BOOTCHECK_TIMEOUT) --qemu=qemu-system-x86_64 --files=/mfsroot.gz=kfreebsd-mfsroot.x86_64.gz --files=/kfreebsd=$(GRUB_PAYLOADS_DIR)/kfreebsd.x86_64 --files=/kfreebsd_env=$(GRUB_PAYLOADS_DIR)/kfreebsd_env.x86_64 $(srcdir)/grub-core/tests/boot/kfreebsd.cfg | grep $(SUCCESSFUL_BOOT_STRING) > /dev/null knetbsd.miniroot-image.i386.gz: knetbsd.miniroot-image.i386.img gzip < $< > $@ bootcheck-knetbsd-i386: knetbsd.miniroot-image.i386.gz $(GRUB_PAYLOADS_DIR)/knetbsd.i386 $(srcdir)/grub-core/tests/boot/knetbsd.cfg grub-shell ./grub-shell --timeout=$(BOOTCHECK_TIMEOUT) --qemu=$(QEMU32) --files=/miniroot.gz=knetbsd.miniroot-image.i386.gz --files=/knetbsd=$(GRUB_PAYLOADS_DIR)/knetbsd.i386 $(srcdir)/grub-core/tests/boot/knetbsd.cfg | grep $(SUCCESSFUL_BOOT_STRING) > /dev/null bootcheck-kopenbsd-i386: kopenbsd.image.i386 $(GRUB_PAYLOADS_DIR)/kopenbsd.i386 $(srcdir)/grub-core/tests/boot/kopenbsd.cfg grub-shell ./grub-shell --timeout=$(BOOTCHECK_TIMEOUT) --qemu=$(QEMU32) --files=/ramdisk=kopenbsd.image.i386 --files=/kopenbsd=$(GRUB_PAYLOADS_DIR)/kopenbsd.i386 $(srcdir)/grub-core/tests/boot/kopenbsd.cfg | grep $(SUCCESSFUL_BOOT_STRING) > /dev/null bootcheck-kopenbsd-x86_64: kopenbsd.image.x86_64 $(GRUB_PAYLOADS_DIR)/kopenbsd.x86_64 $(srcdir)/grub-core/tests/boot/kopenbsd.cfg grub-shell ./grub-shell --timeout=$(BOOTCHECK_TIMEOUT) --qemu=qemu-system-x86_64 --files=/ramdisk=kopenbsd.image.x86_64 --files=/kopenbsd=$(GRUB_PAYLOADS_DIR)/kopenbsd.x86_64 $(srcdir)/grub-core/tests/boot/kopenbsd.cfg | grep $(SUCCESSFUL_BOOT_STRING) > /dev/null knetbsd.miniroot-image.x86_64.gz: knetbsd.miniroot-image.x86_64.img gzip < $< > $@ bootcheck-knetbsd-x86_64: knetbsd.miniroot-image.x86_64.gz $(GRUB_PAYLOADS_DIR)/knetbsd.x86_64 $(srcdir)/grub-core/tests/boot/knetbsd.cfg grub-shell ./grub-shell --timeout=$(BOOTCHECK_TIMEOUT) --qemu=qemu-system-x86_64 --files=/miniroot.gz=knetbsd.miniroot-image.x86_64.gz --files=/knetbsd=$(GRUB_PAYLOADS_DIR)/knetbsd.x86_64 $(srcdir)/grub-core/tests/boot/knetbsd.cfg | grep $(SUCCESSFUL_BOOT_STRING) > /dev/null bootcheck-linux-i386: linux-initramfs.i386 $(GRUB_PAYLOADS_DIR)/linux.i386 $(srcdir)/grub-core/tests/boot/linux.cfg grub-shell ./grub-shell --timeout=$(BOOTCHECK_TIMEOUT) --qemu=$(QEMU32) --files=/initrd=linux-initramfs.i386 --files=/linux=$(GRUB_PAYLOADS_DIR)/linux.i386 $(srcdir)/grub-core/tests/boot/linux.cfg --qemu-opts="-cpu $(MINIMUM_CPU_LINUX)" | grep $(SUCCESSFUL_BOOT_STRING) > /dev/null bootcheck-linux-x86_64: linux-initramfs.x86_64 $(GRUB_PAYLOADS_DIR)/linux.x86_64 $(srcdir)/grub-core/tests/boot/linux.cfg grub-shell ./grub-shell --timeout=$(BOOTCHECK_TIMEOUT) --qemu=qemu-system-x86_64 --files=/initrd=linux-initramfs.x86_64 --files=/linux=$(GRUB_PAYLOADS_DIR)/linux.x86_64 $(srcdir)/grub-core/tests/boot/linux.cfg | grep $(SUCCESSFUL_BOOT_STRING) > /dev/null bootcheck-linux-mips: linux-initramfs.mips $(GRUB_PAYLOADS_DIR)/linux.mips $(srcdir)/grub-core/tests/boot/linux.cfg grub-shell ./grub-shell --timeout=$(BOOTCHECK_TIMEOUT) --files=/initrd=linux-initramfs.mips --files=/linux=$(GRUB_PAYLOADS_DIR)/linux.mips $(srcdir)/grub-core/tests/boot/linux.cfg | grep $(SUCCESSFUL_BOOT_STRING) > /dev/null bootcheck-linux-ppc: linux-initramfs.ppc $(GRUB_PAYLOADS_DIR)/linux.ppc $(srcdir)/grub-core/tests/boot/linux.cfg grub-shell ./grub-shell --timeout=$(BOOTCHECK_TIMEOUT) --files=/initrd=linux-initramfs.ppc --files=/linux=$(GRUB_PAYLOADS_DIR)/linux.ppc $(srcdir)/grub-core/tests/boot/linux-ppc.cfg | grep $(SUCCESSFUL_BOOT_STRING) > /dev/null bootcheck-linux-mipsel: linux-initramfs.mipsel $(GRUB_PAYLOADS_DIR)/linux.mipsel $(srcdir)/grub-core/tests/boot/linux.cfg grub-shell ./grub-shell --timeout=$(BOOTCHECK_TIMEOUT) --files=/initrd=linux-initramfs.mipsel --files=/linux=$(GRUB_PAYLOADS_DIR)/linux.mipsel $(srcdir)/grub-core/tests/boot/linux.cfg | grep $(SUCCESSFUL_BOOT_STRING) > /dev/null bootcheck-linux-loongson: linux-initramfs.loongson $(GRUB_PAYLOADS_DIR)/linux.loongson $(srcdir)/grub-core/tests/boot/linux.cfg grub-shell ./grub-shell --timeout=$(BOOTCHECK_TIMEOUT) --files=/initrd=linux-initramfs.loongson --files=/linux=$(GRUB_PAYLOADS_DIR)/linux.loongson $(srcdir)/grub-core/tests/boot/linux.cfg | grep $(SUCCESSFUL_BOOT_STRING) > /dev/null bootcheck-linux16-i386: linux-initramfs.i386 $(GRUB_PAYLOADS_DIR)/linux.i386 $(srcdir)/grub-core/tests/boot/linux.cfg grub-shell ./grub-shell --timeout=$(BOOTCHECK_TIMEOUT) --qemu=$(QEMU32) --files=/initrd=linux-initramfs.i386 --files=/linux=$(GRUB_PAYLOADS_DIR)/linux.i386 $(srcdir)/grub-core/tests/boot/linux16.cfg | grep $(SUCCESSFUL_BOOT_STRING) > /dev/null bootcheck-linux16-x86_64: linux-initramfs.x86_64 $(GRUB_PAYLOADS_DIR)/linux.x86_64 $(srcdir)/grub-core/tests/boot/linux.cfg grub-shell ./grub-shell --timeout=$(BOOTCHECK_TIMEOUT) --qemu=qemu-system-x86_64 --files=/initrd=linux-initramfs.x86_64 --files=/linux=$(GRUB_PAYLOADS_DIR)/linux.x86_64 $(srcdir)/grub-core/tests/boot/linux16.cfg | grep $(SUCCESSFUL_BOOT_STRING) > /dev/null bootcheck-multiboot: multiboot.elf $(srcdir)/grub-core/tests/boot/multiboot.cfg grub-shell ./grub-shell --timeout=$(BOOTCHECK_TIMEOUT) --qemu=$(QEMU32) --files=/multiboot.elf=multiboot.elf $(srcdir)/grub-core/tests/boot/multiboot.cfg | grep $(SUCCESSFUL_BOOT_STRING) > /dev/null bootcheck-multiboot2: multiboot2.elf $(srcdir)/grub-core/tests/boot/multiboot2.cfg grub-shell ./grub-shell --timeout=$(BOOTCHECK_TIMEOUT) --qemu=$(QEMU32) --files=/multiboot2.elf=multiboot2.elf $(srcdir)/grub-core/tests/boot/multiboot2.cfg | grep $(SUCCESSFUL_BOOT_STRING) > /dev/null bootcheck-kfreebsd-aout: kfreebsd.aout $(srcdir)/grub-core/tests/boot/kfreebsd-aout.cfg grub-shell ./grub-shell --timeout=$(BOOTCHECK_TIMEOUT) --qemu=$(QEMU32) --files=/kfreebsd.aout=kfreebsd.aout $(srcdir)/grub-core/tests/boot/kfreebsd-aout.cfg | grep $(SUCCESSFUL_BOOT_STRING) > /dev/null bootcheck-pc-chainloader: pc-chainloader.bin $(srcdir)/grub-core/tests/boot/pc-chainloader.cfg grub-shell ./grub-shell --timeout=$(BOOTCHECK_TIMEOUT) --qemu=$(QEMU32) --files=/pc-chainloader.bin=pc-chainloader.bin $(srcdir)/grub-core/tests/boot/pc-chainloader.cfg | grep $(SUCCESSFUL_BOOT_STRING) > /dev/null bootcheck-ntldr: ntldr.bin $(srcdir)/grub-core/tests/boot/ntldr.cfg grub-shell ./grub-shell --timeout=$(BOOTCHECK_TIMEOUT) --qemu=$(QEMU32) --files=/ntldr.bin=ntldr.bin $(srcdir)/grub-core/tests/boot/ntldr.cfg | grep $(SUCCESSFUL_BOOT_STRING) > /dev/null if COND_i386_efi # NetBSD has no support for finding ACPI on EFI BOOTCHECKS = bootcheck-kfreebsd-aout bootcheck-kopenbsd-i386 bootcheck-kopenbsd-x86_64 bootcheck-multiboot bootcheck-multiboot2 bootcheck-linux-i386 bootcheck-linux-x86_64 bootcheck-kfreebsd-x86_64 bootcheck-kfreebsd-i386 endif if COND_x86_64_efi # NetBSD has no support for finding ACPI on EFI BOOTCHECKS = bootcheck-kfreebsd-aout bootcheck-kopenbsd-i386 bootcheck-kopenbsd-x86_64 bootcheck-multiboot bootcheck-multiboot2 bootcheck-linux-i386 bootcheck-linux-x86_64 bootcheck-kfreebsd-x86_64 bootcheck-kfreebsd-i386 endif if COND_i386_multiboot # *BSD requires ACPI BOOTCHECKS = bootcheck-kfreebsd-aout bootcheck-multiboot bootcheck-multiboot2 bootcheck-linux-i386 bootcheck-linux-x86_64 endif if COND_i386_qemu # *BSD requires ACPI BOOTCHECKS = bootcheck-kfreebsd-aout bootcheck-multiboot bootcheck-multiboot2 bootcheck-linux-i386 bootcheck-linux-x86_64 endif if COND_i386_coreboot BOOTCHECKS = bootcheck-kfreebsd-aout bootcheck-kopenbsd-i386 bootcheck-kopenbsd-x86_64 bootcheck-multiboot bootcheck-multiboot2 bootcheck-linux-i386 bootcheck-linux-x86_64 bootcheck-knetbsd-x86_64 bootcheck-kfreebsd-x86_64 bootcheck-kfreebsd-i386 endif if COND_i386_ieee1275 # *BSD requires ACPI #legacy protocol (linux16) makes early BIOS calls. BOOTCHECKS = bootcheck-kfreebsd-aout bootcheck-multiboot bootcheck-multiboot2 bootcheck-linux-i386 bootcheck-linux-x86_64 endif if COND_i386_pc #pc chainloader by definition is only for i386-pc #ntldr and bootmgr require BIOS. #legacy protocol (linux16) makes early BIOS calls. # 32-bit NetBSD crashes early on non-BIOS BOOTCHECKS = bootcheck-kfreebsd-aout bootcheck-kopenbsd-i386 bootcheck-kopenbsd-x86_64 bootcheck-multiboot bootcheck-multiboot2 bootcheck-linux-i386 bootcheck-linux-x86_64 bootcheck-knetbsd-x86_64 bootcheck-kfreebsd-x86_64 bootcheck-kfreebsd-i386 bootcheck-pc-chainloader bootcheck-ntldr bootcheck-linux16-i386 bootcheck-linux16-x86_64 bootcheck-knetbsd-i386 endif if COND_mips_loongson BOOTCHECKS = bootcheck-linux-loongson endif if COND_mipsel if COND_mips_qemu_mips BOOTCHECKS = bootcheck-linux-mipsel endif endif if COND_mipseb if COND_mips_qemu_mips BOOTCHECKS = bootcheck-linux-mips endif endif if COND_powerpc_ieee1275 BOOTCHECKS = bootcheck-linux-ppc endif .PHONY: bootcheck-linux-i386 bootcheck-linux-x86_64 \ bootcheck-kfreebsd-i386 bootcheck-kfreebsd-x86_64 \ bootcheck-knetbsd-i386 bootcheck-knetbsd-x86_64 \ bootcheck-linux-mips FORCE # Randomly generated SUCCESSFUL_BOOT_STRING=3e49994fd5d82b7c9298d672d774080d # tianocore cd access is very slow BOOTCHECK_TIMEOUT=180 bootcheck: $(BOOTCHECKS) if COND_i386_coreboot FS_PAYLOAD_MODULES ?= $(shell cat grub-core/fs.lst) default_payload.elf: grub-mkstandalone grub-mkimage FORCE test -f $@ && rm $@ || true pkgdatadir=. ./grub-mkstandalone --grub-mkimage=./grub-mkimage -O i386-coreboot -o $@ --modules='ahci pata ehci uhci ohci usb_keyboard usbms part_msdos ext2 fat at_keyboard part_gpt usbserial_usbdebug cbfs' --install-modules='ls linux search configfile normal cbtime cbls memrw iorw minicmd lsmmap lspci halt reboot hexdump pcidump regexp setpci lsacpi chain test serial multiboot cbmemc linux16 gzio echo help syslinuxcfg xnu $(FS_PAYLOAD_MODULES) password_pbkdf2 $(EXTRA_PAYLOAD_MODULES)' --fonts= --themes= --locales= -d grub-core/ /boot/grub/grub.cfg=$(srcdir)/coreboot.cfg endif endif EXTRA_DIST += grub-core/tests/boot/kbsd.init-i386.S grub-core/tests/boot/kbsd.init-x86_64.S grub-core/tests/boot/kbsd.spec.txt grub-core/tests/boot/kernel-8086.S grub-core/tests/boot/kernel-i386.S grub-core/tests/boot/kfreebsd-aout.cfg grub-core/tests/boot/kfreebsd.cfg grub-core/tests/boot/kfreebsd.init-i386.S grub-core/tests/boot/kfreebsd.init-x86_64.S grub-core/tests/boot/knetbsd.cfg grub-core/tests/boot/kopenbsd.cfg grub-core/tests/boot/kopenbsdlabel.txt grub-core/tests/boot/linux16.cfg grub-core/tests/boot/linux.cfg grub-core/tests/boot/linux.init-i386.S grub-core/tests/boot/linux.init-mips.S grub-core/tests/boot/linux.init-ppc.S grub-core/tests/boot/linux.init-x86_64.S grub-core/tests/boot/linux-ppc.cfg grub-core/tests/boot/multiboot2.cfg grub-core/tests/boot/multiboot.cfg grub-core/tests/boot/ntldr.cfg grub-core/tests/boot/pc-chainloader.cfg grub-core/tests/boot/qemu-shutdown-x86.S windowsdir=$(top_builddir)/$(PACKAGE)-$(VERSION)-for-windows windowsdir: $(PROGRAMS) $(starfield_DATA) $(platform_DATA) test -d $(windowsdir) && rm -rf $(windowsdir) || true test -d $(windowsdir) || mkdir $(windowsdir) $(MAKE) -C po $(AM_MAKEFLAGS) windowsdir $(MAKE) -C grub-core $(AM_MAKEFLAGS) windowsdir test -d $(windowsdir)/themes || mkdir $(windowsdir)/themes test -d $(windowsdir)/themes/starfield || mkdir $(windowsdir)/themes/starfield for x in $(PROGRAMS); do \ if [ x$(STRIP) != x ]; then $(STRIP) $$x -o $(windowsdir)/$$x; \ else cp -fp $$x $(windowsdir)/$$x; fi; \ done for x in $(pkgdata_DATA); do \ cp -fp $$x $(windowsdir)/$$x; \ done for x in $(starfield_DATA); do \ cp -fp $$x $(windowsdir)/themes/starfield/$$(basename $$x); \ done for x in $(GRUB_WINDOWS_EXTRA_DIST); do \ cp -fp $$x $(windowsdir); \ done windowszip=$(top_builddir)/$(PACKAGE)-$(VERSION)-for-windows.zip windowszip: windowsdir test -f $(windowszip) && rm $(windowszip) || true zip -r $(windowszip) $(windowsdir) rm -rf $(windowsdir) EXTRA_DIST += linguas.sh changelog_start_date = 2015-01-23 gitlog_to_changelog = $(top_srcdir)/build-aux/gitlog-to-changelog ChangeLog: FORCE if test -d $(top_srcdir)/.git; then \ $(gitlog_to_changelog) --srcdir=$(top_srcdir) --since=$(changelog_start_date) > '$@.tmp'; \ rm -f '$@'; mv '$@.tmp' '$@'; \ else \ touch $@; \ fi syslinux_test: $(top_builddir)/config.status tests/syslinux/ubuntu10.04_grub.cfg # Mimic simplify_filename from grub-core/lib/syslinux_parse.c, so that we # can predict its behaviour in tests. We have to pre-substitute this before # calling config.status, as config.status offers no reliable way to hook in # a command between setting ac_abs_top_srcdir and emitting output files. tests/syslinux/ubuntu10.04_grub.cfg: $(top_builddir)/config.status tests/syslinux/ubuntu10.04_grub.cfg.in simplified_abs_top_srcdir=`echo "$(abs_top_srcdir)" | sed 's,//,/,g; s,/\./,/,g; :loop; s,/[^/][^/]*/\.\.\(/\|$$\),\1,; t loop'`; \ sed "s,@simplified_abs_top_srcdir@,$$simplified_abs_top_srcdir,g" $(srcdir)/tests/syslinux/ubuntu10.04_grub.cfg.in | $(top_builddir)/config.status --file=$@:- CLEANFILES += tests/syslinux/ubuntu10.04_grub.cfg grub-2.14~git20250718.0e36779/aclocal.m40000644000175000017500000022314015036452446013651 00000000000000# generated automatically by aclocal 1.16.5 -*- Autoconf -*- # Copyright (C) 1996-2021 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.71],, [m4_warning([this file was generated for autoconf 2.71. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) # pkg.m4 - Macros to locate and use pkg-config. -*- Autoconf -*- # serial 12 (pkg-config-0.29.2) dnl Copyright © 2004 Scott James Remnant . dnl Copyright © 2012-2015 Dan Nicholson dnl dnl This program is free software; you can redistribute it and/or modify dnl it under the terms of the GNU General Public License as published by dnl the Free Software Foundation; either version 2 of the License, or dnl (at your option) any later version. dnl dnl This program is distributed in the hope that it will be useful, but dnl WITHOUT ANY WARRANTY; without even the implied warranty of dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU dnl General Public License for more details. dnl dnl You should have received a copy of the GNU General Public License dnl along with this program; if not, write to the Free Software dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA dnl 02111-1307, USA. dnl dnl As a special exception to the GNU General Public License, if you dnl distribute this file as part of a program that contains a dnl configuration script generated by Autoconf, you may include it under dnl the same distribution terms that you use for the rest of that dnl program. dnl PKG_PREREQ(MIN-VERSION) dnl ----------------------- dnl Since: 0.29 dnl dnl Verify that the version of the pkg-config macros are at least dnl MIN-VERSION. Unlike PKG_PROG_PKG_CONFIG, which checks the user's dnl installed version of pkg-config, this checks the developer's version dnl of pkg.m4 when generating configure. dnl dnl To ensure that this macro is defined, also add: dnl m4_ifndef([PKG_PREREQ], dnl [m4_fatal([must install pkg-config 0.29 or later before running autoconf/autogen])]) dnl dnl See the "Since" comment for each macro you use to see what version dnl of the macros you require. m4_defun([PKG_PREREQ], [m4_define([PKG_MACROS_VERSION], [0.29.2]) m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1, [m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])]) ])dnl PKG_PREREQ dnl PKG_PROG_PKG_CONFIG([MIN-VERSION]) dnl ---------------------------------- dnl Since: 0.16 dnl dnl Search for the pkg-config tool and set the PKG_CONFIG variable to dnl first found in the path. Checks that the version of pkg-config found dnl is at least MIN-VERSION. If MIN-VERSION is not specified, 0.9.0 is dnl used since that's the first version where most current features of dnl pkg-config existed. AC_DEFUN([PKG_PROG_PKG_CONFIG], [m4_pattern_forbid([^_?PKG_[A-Z_]+$]) m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$]) m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$]) AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) fi if test -n "$PKG_CONFIG"; then _pkg_min_version=m4_default([$1], [0.9.0]) AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) PKG_CONFIG="" fi fi[]dnl ])dnl PKG_PROG_PKG_CONFIG dnl PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) dnl ------------------------------------------------------------------- dnl Since: 0.18 dnl dnl Check to see whether a particular set of modules exists. Similar to dnl PKG_CHECK_MODULES(), but does not set variables or print errors. dnl dnl Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) dnl only at the first occurrence in configure.ac, so if the first place dnl it's called might be skipped (such as if it is within an "if", you dnl have to call PKG_CHECK_EXISTS manually AC_DEFUN([PKG_CHECK_EXISTS], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl if test -n "$PKG_CONFIG" && \ AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then m4_default([$2], [:]) m4_ifvaln([$3], [else $3])dnl fi]) dnl _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) dnl --------------------------------------------- dnl Internal wrapper calling pkg-config via PKG_CONFIG and setting dnl pkg_failed based on the result. m4_define([_PKG_CONFIG], [if test -n "$$1"; then pkg_cv_[]$1="$$1" elif test -n "$PKG_CONFIG"; then PKG_CHECK_EXISTS([$3], [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes ], [pkg_failed=yes]) else pkg_failed=untried fi[]dnl ])dnl _PKG_CONFIG dnl _PKG_SHORT_ERRORS_SUPPORTED dnl --------------------------- dnl Internal check to see if pkg-config supports short errors. AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], [AC_REQUIRE([PKG_PROG_PKG_CONFIG]) if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi[]dnl ])dnl _PKG_SHORT_ERRORS_SUPPORTED dnl PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], dnl [ACTION-IF-NOT-FOUND]) dnl -------------------------------------------------------------- dnl Since: 0.4.0 dnl dnl Note that if there is a possibility the first call to dnl PKG_CHECK_MODULES might not happen, you should be sure to include an dnl explicit call to PKG_PROG_PKG_CONFIG in your configure.ac AC_DEFUN([PKG_CHECK_MODULES], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl pkg_failed=no AC_MSG_CHECKING([for $2]) _PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) _PKG_CONFIG([$1][_LIBS], [libs], [$2]) m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS and $1[]_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details.]) if test $pkg_failed = yes; then AC_MSG_RESULT([no]) _PKG_SHORT_ERRORS_SUPPORTED if test $_pkg_short_errors_supported = yes; then $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` else $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD m4_default([$4], [AC_MSG_ERROR( [Package requirements ($2) were not met: $$1_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. _PKG_TEXT])[]dnl ]) elif test $pkg_failed = untried; then AC_MSG_RESULT([no]) m4_default([$4], [AC_MSG_FAILURE( [The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. _PKG_TEXT To get pkg-config, see .])[]dnl ]) else $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS $1[]_LIBS=$pkg_cv_[]$1[]_LIBS AC_MSG_RESULT([yes]) $3 fi[]dnl ])dnl PKG_CHECK_MODULES dnl PKG_CHECK_MODULES_STATIC(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], dnl [ACTION-IF-NOT-FOUND]) dnl --------------------------------------------------------------------- dnl Since: 0.29 dnl dnl Checks for existence of MODULES and gathers its build flags with dnl static libraries enabled. Sets VARIABLE-PREFIX_CFLAGS from --cflags dnl and VARIABLE-PREFIX_LIBS from --libs. dnl dnl Note that if there is a possibility the first call to dnl PKG_CHECK_MODULES_STATIC might not happen, you should be sure to dnl include an explicit call to PKG_PROG_PKG_CONFIG in your dnl configure.ac. AC_DEFUN([PKG_CHECK_MODULES_STATIC], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl _save_PKG_CONFIG=$PKG_CONFIG PKG_CONFIG="$PKG_CONFIG --static" PKG_CHECK_MODULES($@) PKG_CONFIG=$_save_PKG_CONFIG[]dnl ])dnl PKG_CHECK_MODULES_STATIC dnl PKG_INSTALLDIR([DIRECTORY]) dnl ------------------------- dnl Since: 0.27 dnl dnl Substitutes the variable pkgconfigdir as the location where a module dnl should install pkg-config .pc files. By default the directory is dnl $libdir/pkgconfig, but the default can be changed by passing dnl DIRECTORY. The user can override through the --with-pkgconfigdir dnl parameter. AC_DEFUN([PKG_INSTALLDIR], [m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])]) m4_pushdef([pkg_description], [pkg-config installation directory @<:@]pkg_default[@:>@]) AC_ARG_WITH([pkgconfigdir], [AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],, [with_pkgconfigdir=]pkg_default) AC_SUBST([pkgconfigdir], [$with_pkgconfigdir]) m4_popdef([pkg_default]) m4_popdef([pkg_description]) ])dnl PKG_INSTALLDIR dnl PKG_NOARCH_INSTALLDIR([DIRECTORY]) dnl -------------------------------- dnl Since: 0.27 dnl dnl Substitutes the variable noarch_pkgconfigdir as the location where a dnl module should install arch-independent pkg-config .pc files. By dnl default the directory is $datadir/pkgconfig, but the default can be dnl changed by passing DIRECTORY. The user can override through the dnl --with-noarch-pkgconfigdir parameter. AC_DEFUN([PKG_NOARCH_INSTALLDIR], [m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])]) m4_pushdef([pkg_description], [pkg-config arch-independent installation directory @<:@]pkg_default[@:>@]) AC_ARG_WITH([noarch-pkgconfigdir], [AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],, [with_noarch_pkgconfigdir=]pkg_default) AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir]) m4_popdef([pkg_default]) m4_popdef([pkg_description]) ])dnl PKG_NOARCH_INSTALLDIR dnl PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE, dnl [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) dnl ------------------------------------------- dnl Since: 0.28 dnl dnl Retrieves the value of the pkg-config variable for the given module. AC_DEFUN([PKG_CHECK_VAR], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl _PKG_CONFIG([$1], [variable="][$3]["], [$2]) AS_VAR_COPY([$1], [pkg_cv_][$1]) AS_VAR_IF([$1], [""], [$5], [$4])dnl ])dnl PKG_CHECK_VAR dnl PKG_WITH_MODULES(VARIABLE-PREFIX, MODULES, dnl [ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND], dnl [DESCRIPTION], [DEFAULT]) dnl ------------------------------------------ dnl dnl Prepare a "--with-" configure option using the lowercase dnl [VARIABLE-PREFIX] name, merging the behaviour of AC_ARG_WITH and dnl PKG_CHECK_MODULES in a single macro. AC_DEFUN([PKG_WITH_MODULES], [ m4_pushdef([with_arg], m4_tolower([$1])) m4_pushdef([description], [m4_default([$5], [build with ]with_arg[ support])]) m4_pushdef([def_arg], [m4_default([$6], [auto])]) m4_pushdef([def_action_if_found], [AS_TR_SH([with_]with_arg)=yes]) m4_pushdef([def_action_if_not_found], [AS_TR_SH([with_]with_arg)=no]) m4_case(def_arg, [yes],[m4_pushdef([with_without], [--without-]with_arg)], [m4_pushdef([with_without],[--with-]with_arg)]) AC_ARG_WITH(with_arg, AS_HELP_STRING(with_without, description[ @<:@default=]def_arg[@:>@]),, [AS_TR_SH([with_]with_arg)=def_arg]) AS_CASE([$AS_TR_SH([with_]with_arg)], [yes],[PKG_CHECK_MODULES([$1],[$2],$3,$4)], [auto],[PKG_CHECK_MODULES([$1],[$2], [m4_n([def_action_if_found]) $3], [m4_n([def_action_if_not_found]) $4])]) m4_popdef([with_arg]) m4_popdef([description]) m4_popdef([def_arg]) ])dnl PKG_WITH_MODULES dnl PKG_HAVE_WITH_MODULES(VARIABLE-PREFIX, MODULES, dnl [DESCRIPTION], [DEFAULT]) dnl ----------------------------------------------- dnl dnl Convenience macro to trigger AM_CONDITIONAL after PKG_WITH_MODULES dnl check._[VARIABLE-PREFIX] is exported as make variable. AC_DEFUN([PKG_HAVE_WITH_MODULES], [ PKG_WITH_MODULES([$1],[$2],,,[$3],[$4]) AM_CONDITIONAL([HAVE_][$1], [test "$AS_TR_SH([with_]m4_tolower([$1]))" = "yes"]) ])dnl PKG_HAVE_WITH_MODULES dnl PKG_HAVE_DEFINE_WITH_MODULES(VARIABLE-PREFIX, MODULES, dnl [DESCRIPTION], [DEFAULT]) dnl ------------------------------------------------------ dnl dnl Convenience macro to run AM_CONDITIONAL and AC_DEFINE after dnl PKG_WITH_MODULES check. HAVE_[VARIABLE-PREFIX] is exported as make dnl and preprocessor variable. AC_DEFUN([PKG_HAVE_DEFINE_WITH_MODULES], [ PKG_HAVE_WITH_MODULES([$1],[$2],[$3],[$4]) AS_IF([test "$AS_TR_SH([with_]m4_tolower([$1]))" = "yes"], [AC_DEFINE([HAVE_][$1], 1, [Enable ]m4_tolower([$1])[ support])]) ])dnl PKG_HAVE_DEFINE_WITH_MODULES # Copyright (C) 2002-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.16' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.16.5], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.16.5])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # Figure out how to run the assembler. -*- Autoconf -*- # Copyright (C) 2001-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_AS # ---------- AC_DEFUN([AM_PROG_AS], [# By default we simply use the C compiler to build assembly code. AC_REQUIRE([AC_PROG_CC]) test "${CCAS+set}" = set || CCAS=$CC test "${CCASFLAGS+set}" = set || CCASFLAGS=$CFLAGS AC_ARG_VAR([CCAS], [assembler compiler command (defaults to CC)]) AC_ARG_VAR([CCASFLAGS], [assembler compiler flags (defaults to CFLAGS)]) _AM_IF_OPTION([no-dependencies],, [_AM_DEPENDENCIES([CCAS])])dnl ]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to # '$srcdir', '$srcdir/..', or '$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is '.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl # Expand $ac_aux_dir to an absolute path. am_aux_dir=`cd "$ac_aux_dir" && pwd` ]) # AM_COND_IF -*- Autoconf -*- # Copyright (C) 2008-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_COND_IF # _AM_COND_ELSE # _AM_COND_ENDIF # -------------- # These macros are only used for tracing. m4_define([_AM_COND_IF]) m4_define([_AM_COND_ELSE]) m4_define([_AM_COND_ENDIF]) # AM_COND_IF(COND, [IF-TRUE], [IF-FALSE]) # --------------------------------------- # If the shell condition COND is true, execute IF-TRUE, otherwise execute # IF-FALSE. Allow automake to learn about conditional instantiating macros # (the AC_CONFIG_FOOS). AC_DEFUN([AM_COND_IF], [m4_ifndef([_AM_COND_VALUE_$1], [m4_fatal([$0: no such condition "$1"])])dnl _AM_COND_IF([$1])dnl if test -z "$$1_TRUE"; then : m4_n([$2])[]dnl m4_ifval([$3], [_AM_COND_ELSE([$1])dnl else $3 ])dnl _AM_COND_ENDIF([$1])dnl fi[]dnl ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ([2.52])dnl m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], [$1], [CXX], [depcc="$CXX" am_compiler_list=], [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], [$1], [UPC], [depcc="$UPC" am_compiler_list=], [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES. AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE([dependency-tracking], [dnl AS_HELP_STRING( [--enable-dependency-tracking], [do not reject slow dependency extractors]) AS_HELP_STRING( [--disable-dependency-tracking], [speeds up one-time build])]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. # TODO: see whether this extra hack can be removed once we start # requiring Autoconf 2.70 or later. AS_CASE([$CONFIG_FILES], [*\'*], [eval set x "$CONFIG_FILES"], [*], [set x $CONFIG_FILES]) shift # Used to flag and report bootstrapping failures. am_rc=0 for am_mf do # Strip MF so we end up with the name of the file. am_mf=`AS_ECHO(["$am_mf"]) | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile which includes # dependency-tracking related rules and includes. # Grep'ing the whole file directly is not great: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \ || continue am_dirpart=`AS_DIRNAME(["$am_mf"])` am_filepart=`AS_BASENAME(["$am_mf"])` AM_RUN_LOG([cd "$am_dirpart" \ && sed -e '/# am--include-marker/d' "$am_filepart" \ | $MAKE -f - am--depfiles]) || am_rc=$? done if test $am_rc -ne 0; then AC_MSG_FAILURE([Something went wrong bootstrapping makefile fragments for automatic dependency tracking. If GNU make was not used, consider re-running the configure script with MAKE="gmake" (or whatever is necessary). You can also try re-running configure with the '--disable-dependency-tracking' option to at least be able to build the package (albeit without support for automatic dependency tracking).]) fi AS_UNSET([am_dirpart]) AS_UNSET([am_filepart]) AS_UNSET([am_mf]) AS_UNSET([am_rc]) rm -f conftest-deps.mk } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking is enabled. # This creates each '.Po' and '.Plo' makefile fragment that we'll need in # order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}"])]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC]) [_AM_PROG_CC_C_O ]) # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.65])dnl m4_ifdef([_$0_ALREADY_INIT], [m4_fatal([$0 expanded multiple times ]m4_defn([_$0_ALREADY_INIT]))], [m4_define([_$0_ALREADY_INIT], m4_expansion_stack)])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [AC_DIAGNOSE([obsolete], [$0: two- and three-arguments forms are deprecated.]) m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if( m4_ifset([AC_PACKAGE_NAME], [ok]):m4_ifset([AC_PACKAGE_VERSION], [ok]), [ok:ok],, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) AM_MISSING_PROG([AUTOCONF], [autoconf]) AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) AM_MISSING_PROG([AUTOHEADER], [autoheader]) AM_MISSING_PROG([MAKEINFO], [makeinfo]) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # AC_SUBST([mkdir_p], ['$(MKDIR_P)']) # We need awk for the "check" target (and possibly the TAP driver). The # system "awk" is bad on some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES([CC])], [m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES([CXX])], [m4_define([AC_PROG_CXX], m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES([OBJC])], [m4_define([AC_PROG_OBJC], m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [_AM_DEPENDENCIES([OBJCXX])], [m4_define([AC_PROG_OBJCXX], m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) # Variables for tags utilities; see am/tags.am if test -z "$CTAGS"; then CTAGS=ctags fi AC_SUBST([CTAGS]) if test -z "$ETAGS"; then ETAGS=etags fi AC_SUBST([ETAGS]) if test -z "$CSCOPE"; then CSCOPE=cscope fi AC_SUBST([CSCOPE]) AC_REQUIRE([AM_SILENT_RULES])dnl dnl The testsuite driver may need to know about EXEEXT, so add the dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) fi fi dnl The trailing newline in this macro's definition is deliberate, for dnl backward compatibility and to allow trailing 'dnl'-style comments dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. ]) dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST([install_sh])]) # Copyright (C) 2003-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MAKE_INCLUDE() # ----------------- # Check whether make has an 'include' directive that can support all # the idioms we need for our automatic dependency tracking code. AC_DEFUN([AM_MAKE_INCLUDE], [AC_MSG_CHECKING([whether ${MAKE-make} supports the include directive]) cat > confinc.mk << 'END' am__doit: @echo this is the am__doit target >confinc.out .PHONY: am__doit END am__include="#" am__quote= # BSD make does it like this. echo '.include "confinc.mk" # ignored' > confmf.BSD # Other make implementations (GNU, Solaris 10, AIX) do it like this. echo 'include confinc.mk # ignored' > confmf.GNU _am_result=no for s in GNU BSD; do AM_RUN_LOG([${MAKE-make} -f confmf.$s && cat confinc.out]) AS_CASE([$?:`cat confinc.out 2>/dev/null`], ['0:this is the am__doit target'], [AS_CASE([$s], [BSD], [am__include='.include' am__quote='"'], [am__include='include' am__quote=''])]) if test "$am__include" != "#"; then _am_result="yes ($s style)" break fi done rm -f confinc.* confmf.* AC_MSG_RESULT([${_am_result}]) AC_SUBST([am__include])]) AC_SUBST([am__quote])]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it is modern enough. # If it is, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then MISSING="\${SHELL} '$am_aux_dir/missing'" fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= AC_MSG_WARN(['missing' script is too old or missing]) fi ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), [1])]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Copyright (C) 1999-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_CC_C_O # --------------- # Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC # to automatically call this. AC_DEFUN([_AM_PROG_CC_C_O], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([compile])dnl AC_LANG_PUSH([C])dnl AC_CACHE_CHECK( [whether $CC understands -c and -o together], [am_cv_prog_cc_c_o], [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i]) if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi AC_LANG_POP([C])]) # For backward compatibility. AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) # Copyright (C) 1999-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PATH_PYTHON([MINIMUM-VERSION], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) # --------------------------------------------------------------------------- # Adds support for distributing Python modules and packages. To # install modules, copy them to $(pythondir), using the python_PYTHON # automake variable. To install a package with the same name as the # automake package, install to $(pkgpythondir), or use the # pkgpython_PYTHON automake variable. # # The variables $(pyexecdir) and $(pkgpyexecdir) are provided as # locations to install python extension modules (shared libraries). # Another macro is required to find the appropriate flags to compile # extension modules. # # If your package is configured with a different prefix to python, # users will have to add the install directory to the PYTHONPATH # environment variable, or create a .pth file (see the python # documentation for details). # # If the MINIMUM-VERSION argument is passed, AM_PATH_PYTHON will # cause an error if the version of python installed on the system # doesn't meet the requirement. MINIMUM-VERSION should consist of # numbers and dots only. AC_DEFUN([AM_PATH_PYTHON], [ dnl Find a Python interpreter. Python versions prior to 2.0 are not dnl supported. (2.0 was released on October 16, 2000). m4_define_default([_AM_PYTHON_INTERPRETER_LIST], [python python2 python3 dnl python3.11 python3.10 dnl python3.9 python3.8 python3.7 python3.6 python3.5 python3.4 python3.3 dnl python3.2 python3.1 python3.0 dnl python2.7 python2.6 python2.5 python2.4 python2.3 python2.2 python2.1 dnl python2.0]) AC_ARG_VAR([PYTHON], [the Python interpreter]) m4_if([$1],[],[ dnl No version check is needed. # Find any Python interpreter. if test -z "$PYTHON"; then AC_PATH_PROGS([PYTHON], _AM_PYTHON_INTERPRETER_LIST, :) fi am_display_PYTHON=python ], [ dnl A version check is needed. if test -n "$PYTHON"; then # If the user set $PYTHON, use it and don't search something else. AC_MSG_CHECKING([whether $PYTHON version is >= $1]) AM_PYTHON_CHECK_VERSION([$PYTHON], [$1], [AC_MSG_RESULT([yes])], [AC_MSG_RESULT([no]) AC_MSG_ERROR([Python interpreter is too old])]) am_display_PYTHON=$PYTHON else # Otherwise, try each interpreter until we find one that satisfies # VERSION. AC_CACHE_CHECK([for a Python interpreter with version >= $1], [am_cv_pathless_PYTHON],[ for am_cv_pathless_PYTHON in _AM_PYTHON_INTERPRETER_LIST none; do test "$am_cv_pathless_PYTHON" = none && break AM_PYTHON_CHECK_VERSION([$am_cv_pathless_PYTHON], [$1], [break]) done]) # Set $PYTHON to the absolute path of $am_cv_pathless_PYTHON. if test "$am_cv_pathless_PYTHON" = none; then PYTHON=: else AC_PATH_PROG([PYTHON], [$am_cv_pathless_PYTHON]) fi am_display_PYTHON=$am_cv_pathless_PYTHON fi ]) if test "$PYTHON" = :; then dnl Run any user-specified action, or abort. m4_default([$3], [AC_MSG_ERROR([no suitable Python interpreter found])]) else dnl Query Python for its version number. Although site.py simply uses dnl sys.version[:3], printing that failed with Python 3.10, since the dnl trailing zero was eliminated. So now we output just the major dnl and minor version numbers, as numbers. Apparently the tertiary dnl version is not of interest. dnl AC_CACHE_CHECK([for $am_display_PYTHON version], [am_cv_python_version], [am_cv_python_version=`$PYTHON -c "import sys; print ('%u.%u' % sys.version_info[[:2]])"`]) AC_SUBST([PYTHON_VERSION], [$am_cv_python_version]) dnl At times, e.g., when building shared libraries, you may want dnl to know which OS platform Python thinks this is. dnl AC_CACHE_CHECK([for $am_display_PYTHON platform], [am_cv_python_platform], [am_cv_python_platform=`$PYTHON -c "import sys; sys.stdout.write(sys.platform)"`]) AC_SUBST([PYTHON_PLATFORM], [$am_cv_python_platform]) dnl emacs-page dnl If --with-python-sys-prefix is given, use the values of sys.prefix dnl and sys.exec_prefix for the corresponding values of PYTHON_PREFIX dnl and PYTHON_EXEC_PREFIX. Otherwise, use the GNU ${prefix} and dnl ${exec_prefix} variables. dnl dnl The two are made distinct variables so they can be overridden if dnl need be, although general consensus is that you shouldn't need dnl this separation. dnl dnl Also allow directly setting the prefixes via configure options, dnl overriding any default. dnl if test "x$prefix" = xNONE; then am__usable_prefix=$ac_default_prefix else am__usable_prefix=$prefix fi # Allow user to request using sys.* values from Python, # instead of the GNU $prefix values. AC_ARG_WITH([python-sys-prefix], [AS_HELP_STRING([--with-python-sys-prefix], [use Python's sys.prefix and sys.exec_prefix values])], [am_use_python_sys=:], [am_use_python_sys=false]) # Allow user to override whatever the default Python prefix is. AC_ARG_WITH([python_prefix], [AS_HELP_STRING([--with-python_prefix], [override the default PYTHON_PREFIX])], [am_python_prefix_subst=$withval am_cv_python_prefix=$withval AC_MSG_CHECKING([for explicit $am_display_PYTHON prefix]) AC_MSG_RESULT([$am_cv_python_prefix])], [ if $am_use_python_sys; then # using python sys.prefix value, not GNU AC_CACHE_CHECK([for python default $am_display_PYTHON prefix], [am_cv_python_prefix], [am_cv_python_prefix=`$PYTHON -c "import sys; sys.stdout.write(sys.prefix)"`]) dnl If sys.prefix is a subdir of $prefix, replace the literal value of dnl $prefix with a variable reference so it can be overridden. case $am_cv_python_prefix in $am__usable_prefix*) am__strip_prefix=`echo "$am__usable_prefix" | sed 's|.|.|g'` am_python_prefix_subst=`echo "$am_cv_python_prefix" | sed "s,^$am__strip_prefix,\\${prefix},"` ;; *) am_python_prefix_subst=$am_cv_python_prefix ;; esac else # using GNU prefix value, not python sys.prefix am_python_prefix_subst='${prefix}' am_python_prefix=$am_python_prefix_subst AC_MSG_CHECKING([for GNU default $am_display_PYTHON prefix]) AC_MSG_RESULT([$am_python_prefix]) fi]) # Substituting python_prefix_subst value. AC_SUBST([PYTHON_PREFIX], [$am_python_prefix_subst]) # emacs-page Now do it all over again for Python exec_prefix, but with yet # another conditional: fall back to regular prefix if that was specified. AC_ARG_WITH([python_exec_prefix], [AS_HELP_STRING([--with-python_exec_prefix], [override the default PYTHON_EXEC_PREFIX])], [am_python_exec_prefix_subst=$withval am_cv_python_exec_prefix=$withval AC_MSG_CHECKING([for explicit $am_display_PYTHON exec_prefix]) AC_MSG_RESULT([$am_cv_python_exec_prefix])], [ # no explicit --with-python_exec_prefix, but if # --with-python_prefix was given, use its value for python_exec_prefix too. AS_IF([test -n "$with_python_prefix"], [am_python_exec_prefix_subst=$with_python_prefix am_cv_python_exec_prefix=$with_python_prefix AC_MSG_CHECKING([for python_prefix-given $am_display_PYTHON exec_prefix]) AC_MSG_RESULT([$am_cv_python_exec_prefix])], [ # Set am__usable_exec_prefix whether using GNU or Python values, # since we use that variable for pyexecdir. if test "x$exec_prefix" = xNONE; then am__usable_exec_prefix=$am__usable_prefix else am__usable_exec_prefix=$exec_prefix fi # if $am_use_python_sys; then # using python sys.exec_prefix, not GNU AC_CACHE_CHECK([for python default $am_display_PYTHON exec_prefix], [am_cv_python_exec_prefix], [am_cv_python_exec_prefix=`$PYTHON -c "import sys; sys.stdout.write(sys.exec_prefix)"`]) dnl If sys.exec_prefix is a subdir of $exec_prefix, replace the dnl literal value of $exec_prefix with a variable reference so it can dnl be overridden. case $am_cv_python_exec_prefix in $am__usable_exec_prefix*) am__strip_prefix=`echo "$am__usable_exec_prefix" | sed 's|.|.|g'` am_python_exec_prefix_subst=`echo "$am_cv_python_exec_prefix" | sed "s,^$am__strip_prefix,\\${exec_prefix},"` ;; *) am_python_exec_prefix_subst=$am_cv_python_exec_prefix ;; esac else # using GNU $exec_prefix, not python sys.exec_prefix am_python_exec_prefix_subst='${exec_prefix}' am_python_exec_prefix=$am_python_exec_prefix_subst AC_MSG_CHECKING([for GNU default $am_display_PYTHON exec_prefix]) AC_MSG_RESULT([$am_python_exec_prefix]) fi])]) # Substituting python_exec_prefix_subst. AC_SUBST([PYTHON_EXEC_PREFIX], [$am_python_exec_prefix_subst]) # Factor out some code duplication into this shell variable. am_python_setup_sysconfig="\ import sys # Prefer sysconfig over distutils.sysconfig, for better compatibility # with python 3.x. See automake bug#10227. try: import sysconfig except ImportError: can_use_sysconfig = 0 else: can_use_sysconfig = 1 # Can't use sysconfig in CPython 2.7, since it's broken in virtualenvs: # try: from platform import python_implementation if python_implementation() == 'CPython' and sys.version[[:3]] == '2.7': can_use_sysconfig = 0 except ImportError: pass" dnl emacs-page Set up 4 directories: dnl 1. pythondir: where to install python scripts. This is the dnl site-packages directory, not the python standard library dnl directory like in previous automake betas. This behavior dnl is more consistent with lispdir.m4 for example. dnl Query distutils for this directory. dnl AC_CACHE_CHECK([for $am_display_PYTHON script directory (pythondir)], [am_cv_python_pythondir], [if test "x$am_cv_python_prefix" = x; then am_py_prefix=$am__usable_prefix else am_py_prefix=$am_cv_python_prefix fi am_cv_python_pythondir=`$PYTHON -c " $am_python_setup_sysconfig if can_use_sysconfig: if hasattr(sysconfig, 'get_default_scheme'): scheme = sysconfig.get_default_scheme() else: scheme = sysconfig._get_default_scheme() if scheme == 'posix_local': # Debian's default scheme installs to /usr/local/ but we want to find headers in /usr/ scheme = 'posix_prefix' sitedir = sysconfig.get_path('purelib', scheme, vars={'base':'$am_py_prefix'}) else: from distutils import sysconfig sitedir = sysconfig.get_python_lib(0, 0, prefix='$am_py_prefix') sys.stdout.write(sitedir)"` # case $am_cv_python_pythondir in $am_py_prefix*) am__strip_prefix=`echo "$am_py_prefix" | sed 's|.|.|g'` am_cv_python_pythondir=`echo "$am_cv_python_pythondir" | sed "s,^$am__strip_prefix,\\${PYTHON_PREFIX},"` ;; *) case $am_py_prefix in /usr|/System*) ;; *) am_cv_python_pythondir="\${PYTHON_PREFIX}/lib/python$PYTHON_VERSION/site-packages" ;; esac ;; esac ]) AC_SUBST([pythondir], [$am_cv_python_pythondir]) dnl 2. pkgpythondir: $PACKAGE directory under pythondir. Was dnl PYTHON_SITE_PACKAGE in previous betas, but this naming is dnl more consistent with the rest of automake. dnl AC_SUBST([pkgpythondir], [\${pythondir}/$PACKAGE]) dnl 3. pyexecdir: directory for installing python extension modules dnl (shared libraries). dnl Query distutils for this directory. dnl AC_CACHE_CHECK([for $am_display_PYTHON extension module directory (pyexecdir)], [am_cv_python_pyexecdir], [if test "x$am_cv_python_exec_prefix" = x; then am_py_exec_prefix=$am__usable_exec_prefix else am_py_exec_prefix=$am_cv_python_exec_prefix fi am_cv_python_pyexecdir=`$PYTHON -c " $am_python_setup_sysconfig if can_use_sysconfig: if hasattr(sysconfig, 'get_default_scheme'): scheme = sysconfig.get_default_scheme() else: scheme = sysconfig._get_default_scheme() if scheme == 'posix_local': # Debian's default scheme installs to /usr/local/ but we want to find headers in /usr/ scheme = 'posix_prefix' sitedir = sysconfig.get_path('platlib', scheme, vars={'platbase':'$am_py_exec_prefix'}) else: from distutils import sysconfig sitedir = sysconfig.get_python_lib(1, 0, prefix='$am_py_exec_prefix') sys.stdout.write(sitedir)"` # case $am_cv_python_pyexecdir in $am_py_exec_prefix*) am__strip_prefix=`echo "$am_py_exec_prefix" | sed 's|.|.|g'` am_cv_python_pyexecdir=`echo "$am_cv_python_pyexecdir" | sed "s,^$am__strip_prefix,\\${PYTHON_EXEC_PREFIX},"` ;; *) case $am_py_exec_prefix in /usr|/System*) ;; *) am_cv_python_pyexecdir="\${PYTHON_EXEC_PREFIX}/lib/python$PYTHON_VERSION/site-packages" ;; esac ;; esac ]) AC_SUBST([pyexecdir], [$am_cv_python_pyexecdir]) dnl 4. pkgpyexecdir: $(pyexecdir)/$(PACKAGE) dnl AC_SUBST([pkgpyexecdir], [\${pyexecdir}/$PACKAGE]) dnl Run any user-specified action. $2 fi ]) # AM_PYTHON_CHECK_VERSION(PROG, VERSION, [ACTION-IF-TRUE], [ACTION-IF-FALSE]) # --------------------------------------------------------------------------- # Run ACTION-IF-TRUE if the Python interpreter PROG has version >= VERSION. # Run ACTION-IF-FALSE otherwise. # This test uses sys.hexversion instead of the string equivalent (first # word of sys.version), in order to cope with versions such as 2.2c1. # This supports Python 2.0 or higher. (2.0 was released on October 16, 2000). AC_DEFUN([AM_PYTHON_CHECK_VERSION], [prog="import sys # split strings by '.' and convert to numeric. Append some zeros # because we need at least 4 digits for the hex conversion. # map returns an iterator in Python 3.0 and a list in 2.x minver = list(map(int, '$2'.split('.'))) + [[0, 0, 0]] minverhex = 0 # xrange is not present in Python 3.0 and range returns an iterator for i in list(range(0, 4)): minverhex = (minverhex << 8) + minver[[i]] sys.exit(sys.hexversion < minverhex)" AS_IF([AM_RUN_LOG([$1 -c "$prog"])], [$3], [$4])]) # Copyright (C) 2001-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_RUN_LOG(COMMAND) # ------------------- # Run COMMAND, save the exit status in ac_status, and log it. # (This has been adapted from Autoconf's _AC_RUN_LOG macro.) AC_DEFUN([AM_RUN_LOG], [{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD (exit $ac_status); }]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi if test "$[2]" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT([yes]) # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi AC_CONFIG_COMMANDS_PRE( [AC_MSG_CHECKING([that generated files are newer than configure]) if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi AC_MSG_RESULT([done])]) rm -f conftest.file ]) # Copyright (C) 2009-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SILENT_RULES([DEFAULT]) # -------------------------- # Enable less verbose build rules; with the default set to DEFAULT # ("yes" being less verbose, "no" or empty being verbose). AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], [dnl AS_HELP_STRING( [--enable-silent-rules], [less verbose build output (undo: "make V=1")]) AS_HELP_STRING( [--disable-silent-rules], [verbose build output (undo: "make V=0")])dnl ]) case $enable_silent_rules in @%:@ ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; esac dnl dnl A few 'make' implementations (e.g., NonStop OS and NextStep) dnl do not support nested variable expansions. dnl See automake bug#9928 and bug#10237. am_make=${MAKE-make} AC_CACHE_CHECK([whether $am_make supports nested variables], [am_cv_make_support_nested_variables], [if AS_ECHO([['TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi]) if test $am_cv_make_support_nested_variables = yes; then dnl Using '$V' instead of '$(V)' breaks IRIX make. AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AC_SUBST([AM_V])dnl AM_SUBST_NOTMAKE([AM_V])dnl AC_SUBST([AM_DEFAULT_V])dnl AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl AC_SUBST([AM_DEFAULT_VERBOSITY])dnl AM_BACKSLASH='\' AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) # Copyright (C) 2001-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor 'install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in "make install-strip", and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of 'v7', 'ustar', or 'pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar # AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar], [# The POSIX 1988 'ustar' format is defined with fixed-size fields. # There is notably a 21 bits limit for the UID and the GID. In fact, # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 # and bug#13588). am_max_uid=2097151 # 2^21 - 1 am_max_gid=$am_max_uid # The $UID and $GID variables are not portable, so we need to resort # to the POSIX-mandated id(1) utility. Errors in the 'id' calls # below are definitely unexpected, so allow the users to see them # (that is, avoid stderr redirection). am_uid=`id -u || echo unknown` am_gid=`id -g || echo unknown` AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) if test $am_uid -le $am_max_uid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) if test $am_gid -le $am_max_gid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi], [pax], [], [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Go ahead even if we have the value already cached. We do so because we # need to set the values for the 'am__tar' and 'am__untar' variables. _am_tools=${am_cv_prog_tar_$1-$_am_tools} for _am_tool in $_am_tools; do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works. rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR m4_include([m4/00gnulib.m4]) m4_include([m4/__inline.m4]) m4_include([m4/absolute-header.m4]) m4_include([m4/alloca.m4]) m4_include([m4/argp.m4]) m4_include([m4/base64.m4]) m4_include([m4/btowc.m4]) m4_include([m4/builtin-expect.m4]) m4_include([m4/calloc.m4]) m4_include([m4/chdir-long.m4]) m4_include([m4/close.m4]) m4_include([m4/codeset.m4]) m4_include([m4/ctype_h.m4]) m4_include([m4/dirent_h.m4]) m4_include([m4/dirfd.m4]) m4_include([m4/double-slash-root.m4]) m4_include([m4/dup2.m4]) m4_include([m4/eealloc.m4]) m4_include([m4/errno_h.m4]) m4_include([m4/error.m4]) m4_include([m4/exponentd.m4]) m4_include([m4/extensions.m4]) m4_include([m4/extern-inline.m4]) m4_include([m4/fchdir.m4]) m4_include([m4/fcntl-o.m4]) m4_include([m4/fcntl.m4]) m4_include([m4/fcntl_h.m4]) m4_include([m4/filenamecat.m4]) m4_include([m4/flexmember.m4]) m4_include([m4/float_h.m4]) m4_include([m4/fnmatch.m4]) m4_include([m4/fnmatch_h.m4]) m4_include([m4/free.m4]) m4_include([m4/fstat.m4]) m4_include([m4/getcwd.m4]) m4_include([m4/getdelim.m4]) m4_include([m4/getdtablesize.m4]) m4_include([m4/getline.m4]) m4_include([m4/getopt.m4]) m4_include([m4/getprogname.m4]) m4_include([m4/gettext.m4]) m4_include([m4/gnulib-common.m4]) m4_include([m4/gnulib-comp.m4]) m4_include([m4/iconv.m4]) m4_include([m4/include_next.m4]) m4_include([m4/intlmacosx.m4]) m4_include([m4/intmax_t.m4]) m4_include([m4/inttypes.m4]) m4_include([m4/inttypes_h.m4]) m4_include([m4/isblank.m4]) m4_include([m4/langinfo_h.m4]) m4_include([m4/largefile.m4]) m4_include([m4/lib-ld.m4]) m4_include([m4/lib-link.m4]) m4_include([m4/lib-prefix.m4]) m4_include([m4/libunistring-base.m4]) m4_include([m4/limits-h.m4]) m4_include([m4/localcharset.m4]) m4_include([m4/locale-fr.m4]) m4_include([m4/locale-ja.m4]) m4_include([m4/locale-zh.m4]) m4_include([m4/locale_h.m4]) m4_include([m4/localeconv.m4]) m4_include([m4/lock.m4]) m4_include([m4/lstat.m4]) m4_include([m4/malloc.m4]) m4_include([m4/malloca.m4]) m4_include([m4/mbrtowc.m4]) m4_include([m4/mbsinit.m4]) m4_include([m4/mbsrtowcs.m4]) m4_include([m4/mbstate_t.m4]) m4_include([m4/mbswidth.m4]) m4_include([m4/mbtowc.m4]) m4_include([m4/memchr.m4]) m4_include([m4/mempcpy.m4]) m4_include([m4/memrchr.m4]) m4_include([m4/mmap-anon.m4]) m4_include([m4/mode_t.m4]) m4_include([m4/msvc-inval.m4]) m4_include([m4/msvc-nothrow.m4]) m4_include([m4/multiarch.m4]) m4_include([m4/nl_langinfo.m4]) m4_include([m4/nls.m4]) m4_include([m4/nocrash.m4]) m4_include([m4/off_t.m4]) m4_include([m4/open-cloexec.m4]) m4_include([m4/open-slash.m4]) m4_include([m4/open.m4]) m4_include([m4/openat.m4]) m4_include([m4/pathmax.m4]) m4_include([m4/pipe.m4]) m4_include([m4/po.m4]) m4_include([m4/printf.m4]) m4_include([m4/progtest.m4]) m4_include([m4/pthread_rwlock_rdlock.m4]) m4_include([m4/rawmemchr.m4]) m4_include([m4/realloc.m4]) m4_include([m4/reallocarray.m4]) m4_include([m4/regex.m4]) m4_include([m4/save-cwd.m4]) m4_include([m4/setlocale_null.m4]) m4_include([m4/size_max.m4]) m4_include([m4/sleep.m4]) m4_include([m4/ssize_t.m4]) m4_include([m4/stat-time.m4]) m4_include([m4/stat.m4]) m4_include([m4/stdalign.m4]) m4_include([m4/stdbool.m4]) m4_include([m4/stddef_h.m4]) m4_include([m4/stdint.m4]) m4_include([m4/stdint_h.m4]) m4_include([m4/stdio_h.m4]) m4_include([m4/stdlib_h.m4]) m4_include([m4/strcase.m4]) m4_include([m4/strchrnul.m4]) m4_include([m4/strdup.m4]) m4_include([m4/strerror.m4]) m4_include([m4/string_h.m4]) m4_include([m4/strings_h.m4]) m4_include([m4/strndup.m4]) m4_include([m4/strnlen.m4]) m4_include([m4/sys_socket_h.m4]) m4_include([m4/sys_stat_h.m4]) m4_include([m4/sys_types_h.m4]) m4_include([m4/sysexits.m4]) m4_include([m4/threadlib.m4]) m4_include([m4/time_h.m4]) m4_include([m4/unistd-safer.m4]) m4_include([m4/unistd_h.m4]) m4_include([m4/vasnprintf.m4]) m4_include([m4/visibility.m4]) m4_include([m4/vsnprintf.m4]) m4_include([m4/warn-on-use.m4]) m4_include([m4/wchar_h.m4]) m4_include([m4/wchar_t.m4]) m4_include([m4/wcrtomb.m4]) m4_include([m4/wctype_h.m4]) m4_include([m4/wcwidth.m4]) m4_include([m4/wint_t.m4]) m4_include([m4/wmemchr.m4]) m4_include([m4/wmempcpy.m4]) m4_include([m4/xsize.m4]) m4_include([m4/year2038.m4]) m4_include([m4/zzgnulib.m4]) m4_include([acinclude.m4]) grub-2.14~git20250718.0e36779/TODO0000644000175000017500000000047615002425525012475 00000000000000 Before working on improving GRUB, it's very important that you make contact with the core GRUB developers. Things herein might be slightly out of date or otherwise not easy to understand at first glance. So write to first. For bug tracking, refer to: http://savannah.gnu.org/bugs/?group=grub grub-2.14~git20250718.0e36779/docs/0000755000175000017500000000000015036452577013024 500000000000000grub-2.14~git20250718.0e36779/docs/man/0000755000175000017500000000000015036447510013566 500000000000000grub-2.14~git20250718.0e36779/docs/man/grub-set-default.h2m0000644000175000017500000000017215000202015017244 00000000000000[NAME] grub-set-default \- set the saved default boot entry for GRUB [SEE ALSO] .BR grub-reboot (8), .BR grub-editenv (1) grub-2.14~git20250718.0e36779/docs/man/grub-menulst2cfg.h2m0000644000175000017500000000014415000202015017257 00000000000000[NAME] grub-menulst2cfg \- transform legacy menu.lst into grub.cfg [SEE ALSO] .BR grub-mkconfig (8) grub-2.14~git20250718.0e36779/docs/man/grub-mkpasswd-pbkdf2.h2m0000644000175000017500000000014215000202015020023 00000000000000[NAME] grub-mkpasswd-pbkdf2 \- generate hashed password for GRUB [SEE ALSO] .BR grub-mkconfig (8) grub-2.14~git20250718.0e36779/docs/man/grub-mount.h2m0000644000175000017500000000006615000202015016173 00000000000000[NAME] grub-mount \- export GRUB filesystem with FUSE grub-2.14~git20250718.0e36779/docs/man/grub-pe2elf.h2m0000644000175000017500000000011615000202015016202 00000000000000[NAME] grub-pe2elf \- convert PE image to ELF [SEE ALSO] .BR grub-mkimage (1) grub-2.14~git20250718.0e36779/docs/man/grub-protect.h2m0000644000175000017500000000024115036447510016530 00000000000000[NAME] grub-protect \- protect a disk key with a key protector [DESCRIPTION] grub-protect helps to protect a disk encryption key with a specified key protector. grub-2.14~git20250718.0e36779/docs/man/grub-mknetdir.h2m0000644000175000017500000000013215000202015016640 00000000000000[NAME] grub-mknetdir \- prepare a GRUB netboot directory. [SEE ALSO] .BR grub-mkimage (1) grub-2.14~git20250718.0e36779/docs/man/grub-glue-efi.h2m0000644000175000017500000000024015000202015016520 00000000000000[NAME] grub-glue-efi \- generate a fat binary for EFI [DESCRIPTION] grub-glue-efi processes ia32 and amd64 EFI images and glues them according to Apple format. grub-2.14~git20250718.0e36779/docs/man/grub-ofpathname.h2m0000644000175000017500000000013015000202015017143 00000000000000[NAME] grub-ofpathname \- find OpenBOOT path for a device [SEE ALSO] .BR grub-probe (8) grub-2.14~git20250718.0e36779/docs/man/grub-mkrelpath.h2m0000644000175000017500000000013715000202015017017 00000000000000[NAME] grub-mkrelpath \- make a system path relative to its root [SEE ALSO] .BR grub-probe (8) grub-2.14~git20250718.0e36779/docs/man/grub-render-label.h2m0000644000175000017500000000010415000202015017356 00000000000000[NAME] grub-render-label \- generate a .disk_label for Apple Macs. grub-2.14~git20250718.0e36779/docs/man/grub-mkstandalone.h2m0000644000175000017500000000013415000202015017505 00000000000000[NAME] grub-mkstandalone \- make a memdisk-based GRUB image [SEE ALSO] .BR grub-mkimage (1) grub-2.14~git20250718.0e36779/docs/man/grub-bios-setup.h2m0000644000175000017500000000021215000202015017114 00000000000000[NAME] grub-bios-setup \- set up a device to boot using GRUB [SEE ALSO] .BR grub-install (8), .BR grub-mkimage (1), .BR grub-mkrescue (1) grub-2.14~git20250718.0e36779/docs/man/grub-sparc64-setup.h2m0000644000175000017500000000021515000202015017445 00000000000000[NAME] grub-sparc64-setup \- set up a device to boot using GRUB [SEE ALSO] .BR grub-install (8), .BR grub-mkimage (1), .BR grub-mkrescue (1) grub-2.14~git20250718.0e36779/docs/man/grub-mklayout.h2m0000644000175000017500000000037015000202015016674 00000000000000[NAME] grub-mklayout \- generate a GRUB keyboard layout file [DESCRIPTION] grub-mklayout processes a keyboard layout description in .BR keymaps (5) format into a format that can be used by GRUB's .B keymap command. [SEE ALSO] .BR grub-mkconfig (8) grub-2.14~git20250718.0e36779/docs/man/grub-mkconfig.h2m0000644000175000017500000000013315000202015016621 00000000000000[NAME] grub-mkconfig \- generate a GRUB configuration file [SEE ALSO] .BR grub-install (8) grub-2.14~git20250718.0e36779/docs/man/grub-emu.h2m0000644000175000017500000000022215000202015015611 00000000000000[NAME] grub-emu \- GRUB emulator [SEE ALSO] If you are trying to install GRUB, then you should use .BR grub-install (8) rather than this program. grub-2.14~git20250718.0e36779/docs/man/grub-mkrescue.h2m0000644000175000017500000000012115000202015016637 00000000000000[NAME] grub-mkrescue \- make a GRUB rescue image [SEE ALSO] .BR grub-mkimage (1) grub-2.14~git20250718.0e36779/docs/man/grub-editenv.h2m0000644000175000017500000000015415000202015016465 00000000000000[NAME] grub-editenv \- edit GRUB environment block [SEE ALSO] .BR grub-reboot (8), .BR grub-set-default (8) grub-2.14~git20250718.0e36779/docs/man/grub-file.h2m0000644000175000017500000000004415000202015015744 00000000000000[NAME] grub-file \- check file type grub-2.14~git20250718.0e36779/docs/man/grub-macbless.h2m0000644000175000017500000000012315000202015016614 00000000000000[NAME] grub-macbless \- bless a mac file/directory [SEE ALSO] .BR grub-install (1) grub-2.14~git20250718.0e36779/docs/man/grub-reboot.h2m0000644000175000017500000000021415000202015016316 00000000000000[NAME] grub-reboot \- set the default boot entry for GRUB, for the next boot only [SEE ALSO] .BR grub-set-default (8), .BR grub-editenv (1) grub-2.14~git20250718.0e36779/docs/man/grub-macho2img.h2m0000644000175000017500000000012515000202015016673 00000000000000[NAME] grub-macho2img \- convert Mach-O to raw image [SEE ALSO] .BR grub-mkimage (1) grub-2.14~git20250718.0e36779/docs/man/grub-probe.h2m0000644000175000017500000000012615000202015016135 00000000000000[NAME] grub-probe \- probe device information for GRUB [SEE ALSO] .BR grub-fstest (1) grub-2.14~git20250718.0e36779/docs/man/grub-kbdcomp.h2m0000644000175000017500000000037015000202015016446 00000000000000[NAME] grub-kbdcomp \- generate a GRUB keyboard layout file [DESCRIPTION] grub-kbdcomp processes a X keyboard layout description in .BR keymaps (5) format into a format that can be used by GRUB's .B keymap command. [SEE ALSO] .BR grub-mklayout (8) grub-2.14~git20250718.0e36779/docs/man/grub-script-check.h2m0000644000175000017500000000013615000202015017406 00000000000000[NAME] grub-script-check \- check grub.cfg for syntax errors [SEE ALSO] .BR grub-mkconfig (8) grub-2.14~git20250718.0e36779/docs/man/grub-mkimage.h2m0000644000175000017500000000020315000202015016434 00000000000000[NAME] grub-mkimage \- make a bootable image of GRUB [SEE ALSO] .BR grub-install (8), .BR grub-mkrescue (1), .BR grub-mknetdir (8) grub-2.14~git20250718.0e36779/docs/man/grub-mkfont.h2m0000644000175000017500000000011415000202015016321 00000000000000[NAME] grub-mkfont \- make GRUB font files [SEE ALSO] .BR grub-mkconfig (8) grub-2.14~git20250718.0e36779/docs/man/grub-syslinux2cfg.h2m0000644000175000017500000000015015000202015017463 00000000000000[NAME] grub-syslinux2cfg \- transform syslinux config into grub.cfg [SEE ALSO] .BR grub-menulst2cfg (8) grub-2.14~git20250718.0e36779/docs/man/grub-fstest.h2m0000644000175000017500000000013315000202015016334 00000000000000[NAME] grub-fstest \- debug tool for GRUB filesystem drivers [SEE ALSO] .BR grub-probe (8) grub-2.14~git20250718.0e36779/docs/man/grub-install.h2m0000644000175000017500000000017615000202015016501 00000000000000[NAME] grub-install \- install GRUB to a device [SEE ALSO] .BR grub-mkconfig (8), .BR grub-mkimage (1), .BR grub-mkrescue (1) grub-2.14~git20250718.0e36779/docs/grub.cfg0000644000175000017500000000325115000202015014330 00000000000000# # Sample GRUB configuration file # # Boot automatically after 30 secs. set timeout=30 # By default, boot the GNU/Linux set default=gnulinux # Fallback to GNU/Hurd. set fallback=gnuhurd # For booting GNU/Linux menuentry "GNU/Linux" --id gnulinux { set root=(hd0,msdos1) linux /vmlinuz root=/dev/sda1 initrd /initrd.img } # For booting GNU/Hurd menuentry "GNU (aka GNU/Hurd)" --id gnuhurd { set root=(hd0,msdos1) multiboot /boot/gnumach.gz root=device:hd0s1 module /hurd/ext2fs.static ext2fs --readonly \ --multiboot-command-line='${kernel-command-line}' \ --host-priv-port='${host-port}' \ --device-master-port='${device-port}' \ --exec-server-task='${exec-task}' -T typed '${root}' \ '$(task-create)' '$(task-resume)' module /lib/ld.so.1 exec /hurd/exec '$(exec-task=task-create)' } # For booting FreeBSD menuentry "FreeBSD (or GNU/kFreeBSD), direct boot" { set root=(hd0,msdos1,bsd1) kfreebsd /boot/kernel/kernel kfreebsd_loadenv /boot/device.hints kfreebsd_module /boot/splash.bmp type=splash_image_data set kFreeBSD.vfs.root.mountfrom=ufs:ad0s1a } menuentry "FreeBSD (or GNU/kFreeBSD), via /boot/loader" { set root=(hd0,msdos1,bsd1) kfreebsd /boot/loader } # For booting NetBSD menuentry "NetBSD" { set root=(hd0,netbsd1) knetbsd /netbsd } # For booting OpenBSD menuentry "OpenBSD" { set root=(hd0,openbsd1) kopenbsd /bsd } # For booting Microsoft Windows menuentry "Microsoft Windows" { set root=(hd0,msdos1) chainloader +1 } # For booting Memtest86+ menuentry "Memtest86+" { set root=(hd0,1) linux16 /memtest86+.bin } # Change the colors. menuentry "Change the colors" { set menu_color_normal=light-green/brown set menu_color_highlight=red/blue } grub-2.14~git20250718.0e36779/docs/grub.info-20000644000175000017500000052170515036452577014731 00000000000000This is grub.info, produced by makeinfo version 6.8 from grub.texi. This manual is for GNU GRUB (version 2.14~git20250718.0e36779, 18 July 2025). Copyright (C) 1999,2000,2001,2002,2004,2006,2008,2009,2010,2011,2012,2013 Free Software Foundation, Inc. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections. INFO-DIR-SECTION Kernel START-INFO-DIR-ENTRY * GRUB: (grub). The GRand Unified Bootloader * grub-install: (grub)Invoking grub-install. Install GRUB on your drive * grub-mkconfig: (grub)Invoking grub-mkconfig. Generate GRUB configuration * grub-mkpasswd-pbkdf2: (grub)Invoking grub-mkpasswd-pbkdf2. * grub-mkrelpath: (grub)Invoking grub-mkrelpath. * grub-mkrescue: (grub)Invoking grub-mkrescue. Make a GRUB rescue image * grub-mount: (grub)Invoking grub-mount. Mount a file system using GRUB * grub-probe: (grub)Invoking grub-probe. Probe device information * grub-script-check: (grub)Invoking grub-script-check. END-INFO-DIR-ENTRY  File: grub.info, Node: fwsetup, Next: gdbinfo, Prev: file, Up: Command-line commands 17.4.32 fwsetup --------------- -- Command: fwsetup [--is-supported] Reboot into the firmware setup menu. If '--is-supported' option is specified, instead check whether the firmware supports a setup menu and exit successfully if so.  File: grub.info, Node: gdbinfo, Next: gettext, Prev: fwsetup, Up: Command-line commands 17.4.33 gdbinfo --------------- -- Command: gdbinfo Output text to be used as a GDB command for a GDB session using the gdb_grub script and attached to a running GRUB instance. The GDB command that is output will tell GDB how to load debugging symbols to their proper runtime address. Currently this is only available for EFI platforms. See the Debugging in the developer documentation for more information.  File: grub.info, Node: gettext, Next: gptsync, Prev: gdbinfo, Up: Command-line commands 17.4.34 gettext --------------- -- Command: gettext string Translate STRING into the current language. The current language code is stored in the 'lang' variable in GRUB's environment (*note lang::). Translation files in MO format are read from 'locale_dir' (*note locale_dir::), usually '/boot/grub/locale'.  File: grub.info, Node: gptsync, Next: halt, Prev: gettext, Up: Command-line commands 17.4.35 gptsync --------------- -- Command: gptsync device [partition[+/-[type]]] ... Disks using the GUID Partition Table (GPT) also have a legacy Master Boot Record (MBR) partition table for compatibility with the BIOS and with older operating systems. The legacy MBR can only represent a limited subset of GPT partition entries. This command populates the legacy MBR with the specified PARTITION entries on DEVICE. Up to three partitions may be used. TYPE is an MBR partition type code; prefix with '0x' if you want to enter this in hexadecimal. The separator between PARTITION and TYPE may be '+' to make the partition active, or '-' to make it inactive; only one partition may be active. If both the separator and type are omitted, then the partition will be inactive.  File: grub.info, Node: halt, Next: hashsum, Prev: gptsync, Up: Command-line commands 17.4.36 halt ------------ -- Command: halt [--no-apm] The command halts the computer. On the i386-pc target, the '--no-apm' option, or short '-n', is specified, no APM BIOS call is performed. Otherwise, the computer is shut down using APM on that target.  File: grub.info, Node: hashsum, Next: help, Prev: halt, Up: Command-line commands 17.4.37 hashsum --------------- -- Command: hashsum --hash hash --keep-going --uncompress --check file [--prefix dir]|file ... Compute or verify file hashes. Hash type is selected with option '--hash'. Supported hashes are: 'adler32', 'crc64', 'crc32', 'crc32rfc1510', 'crc24rfc2440', 'md4', 'md5', 'ripemd160', 'sha1', 'sha224', 'sha256', 'sha512', 'sha384', 'tiger192', 'tiger', 'tiger2', 'whirlpool'. Option '--uncompress' uncompresses files before computing hash. When list of files is given, hash of each file is computed and printed, followed by file name, each file on a new line. When option '--check' is given, it points to a file that contains list of HASH NAME pairs in the same format as used by UNIX 'md5sum' command. Option '--prefix' may be used to give directory where files are located. Hash verification stops after the first mismatch was found unless option '--keep-going' was given. The exit code '$?' is set to 0 if hash verification is successful. If it fails, '$?' is set to a nonzero value.  File: grub.info, Node: help, Next: hexdump, Prev: hashsum, Up: Command-line commands 17.4.38 help ------------ -- Command: help [pattern ...] Display helpful information about builtin commands. If you do not specify PATTERN, this command shows short descriptions of all available commands. If you specify any PATTERNS, it displays longer information about each of the commands whose names begin with those PATTERNS.  File: grub.info, Node: hexdump, Next: insmod, Prev: help, Up: Command-line commands 17.4.39 hexdump --------------- -- Command: hexdump [--skip offset] [--length len] FILE_OR_DEVICE Show raw contents of a file or memory. When option '--skip' is given, 'offset' number of bytes are skipped from the start of the device or file given. And '--length' allows specifying a maximum number of bytes to be shown. If given the special device named '(mem)', then the 'offset' given to '--skip' is treated as the address of a memory location to dump from. Note: The dumping of RAM memory (by the (mem) argument) is not allowed when when lockdown is enforced (*note Lockdown::). The dumping of disk or file data is allowed when lockdown is enforced.  File: grub.info, Node: insmod, Next: keystatus, Prev: hexdump, Up: Command-line commands 17.4.40 insmod -------------- -- Command: insmod module Insert the dynamic GRUB module called MODULE.  File: grub.info, Node: keystatus, Next: list_env, Prev: insmod, Up: Command-line commands 17.4.41 keystatus ----------------- -- Command: keystatus [--shift] [--ctrl] [--alt] Return true if the Shift, Control, or Alt modifier keys are held down, as requested by options. This is useful in scripting, to allow some user control over behaviour without having to wait for a keypress. Checking key modifier status is only supported on some platforms. If invoked without any options, the 'keystatus' command returns true if and only if checking key modifier status is supported.  File: grub.info, Node: list_env, Next: list_trusted, Prev: keystatus, Up: Command-line commands 17.4.42 list_env ---------------- -- Command: list_env [--file file] List all variables in the environment block file. *Note Environment block::. The '--file' option overrides the default location of the environment block.  File: grub.info, Node: list_trusted, Next: load_env, Prev: list_env, Up: Command-line commands 17.4.43 list_trusted -------------------- -- Command: list_trusted List all public keys trusted by GRUB for validating signatures. The output is in GPG's v4 key fingerprint format (i.e., the output of 'gpg --fingerprint'). The least significant four bytes (last eight hexadecimal digits) can be used as an argument to 'distrust' (*note distrust::). *Note Using digital signatures::, for more information about uses for these keys.  File: grub.info, Node: load_env, Next: loadfont, Prev: list_trusted, Up: Command-line commands 17.4.44 load_env ---------------- -- Command: load_env [--file file] [--skip-sig] [whitelisted_variable_name] ... Load all variables from the environment block file into the environment. *Note Environment block::. The '--file' option overrides the default location of the environment block. The '--skip-sig' option skips signature checking even when the value of environment variable 'check_signatures' is set to 'enforce' (*note check_signatures::). If one or more variable names are provided as arguments, they are interpreted as a whitelist of variables to load from the environment block file. Variables set in the file but not present in the whitelist are ignored. The '--skip-sig' option should be used with care, and should always be used in concert with a whitelist of acceptable variables whose values should be set. Failure to employ a carefully constructed whitelist could result in reading a malicious value into critical environment variables from the file, such as setting 'check_signatures=no', modifying 'prefix' to boot from an unexpected location or not at all, etc. When used with care, '--skip-sig' and the whitelist enable an administrator to configure a system to boot only signed configurations, but to allow the user to select from among multiple configurations, and to enable "one-shot" boot attempts and "savedefault" behavior. *Note Using digital signatures::, for more information.  File: grub.info, Node: loadfont, Next: loopback, Prev: load_env, Up: Command-line commands 17.4.45 loadfont ---------------- -- Command: loadfont file ... Load specified font files. Unless absolute pathname is given, FILE is assumed to be in directory '$prefix/fonts' with suffix '.pf2' appended. *Note Fonts: Theme file format.  File: grub.info, Node: loopback, Next: ls, Prev: loadfont, Up: Command-line commands 17.4.46 loopback ---------------- -- Command: loopback [-d] [-D] device file Make the device named DEVICE correspond to the contents of the filesystem image in FILE. For example: loopback loop0 /path/to/image ls (loop0)/ Specifying the '-D' option allows the loopback file to be tranparently decompressed if there is an appropriate decompressor loaded. With the '-d' option, delete a device previously created using this command.  File: grub.info, Node: ls, Next: lsfonts, Prev: loopback, Up: Command-line commands 17.4.47 ls ---------- -- Command: ls [arg ...] List devices or files. With no arguments, print all devices known to GRUB. If the argument is a device name enclosed in parentheses (*note Device syntax::), then print the name of the filesystem of that device. If the argument is a directory given as an absolute file name (*note File name syntax::), then list the contents of that directory.  File: grub.info, Node: lsfonts, Next: lsmod, Prev: ls, Up: Command-line commands 17.4.48 lsfonts --------------- -- Command: lsfonts List loaded fonts.  File: grub.info, Node: lsmod, Next: md5sum, Prev: lsfonts, Up: Command-line commands 17.4.49 lsmod ------------- -- Command: lsmod Show list of loaded modules.  File: grub.info, Node: md5sum, Next: module, Prev: lsmod, Up: Command-line commands 17.4.50 md5sum -------------- -- Command: md5sum arg ... Alias for 'hashsum --hash md5 arg ...'. See command 'hashsum' (*note hashsum::) for full description.  File: grub.info, Node: module, Next: multiboot, Prev: md5sum, Up: Command-line commands 17.4.51 module -------------- -- Command: module [--nounzip] file [arguments] Load a module for multiboot kernel image. The rest of the line is passed verbatim as the module command line.  File: grub.info, Node: multiboot, Next: nativedisk, Prev: module, Up: Command-line commands 17.4.52 multiboot ----------------- -- Command: multiboot [--quirk-bad-kludge] [--quirk-modules-after-kernel] file ... Load a multiboot kernel image from FILE. The rest of the line is passed verbatim as the "kernel command-line". Any module must be reloaded after using this command (*note module::). Some kernels have known problems. You need to specify -quirk-* for those. -quirk-bad-kludge is a problem seen in several products that they include loading kludge information with invalid data in ELF file. GRUB prior to 0.97 and some custom builds preferred ELF information while 0.97 and GRUB 2 use kludge. Use this option to ignore kludge. Known affected systems: old Solaris, SkyOS. -quirk-modules-after-kernel is needed for kernels which load at relatively high address e.g. 16MiB mark and can't cope with modules stuffed between 1MiB mark and beginning of the kernel. Known afftected systems: VMWare.  File: grub.info, Node: nativedisk, Next: normal, Prev: multiboot, Up: Command-line commands 17.4.53 nativedisk ------------------ -- Command: nativedisk Switch from firmware disk drivers to native ones. Really useful only on platforms where both firmware and native disk drives are available. Currently i386-pc, i386-efi, i386-ieee1275 and x86_64-efi.  File: grub.info, Node: normal, Next: normal_exit, Prev: nativedisk, Up: Command-line commands 17.4.54 normal -------------- -- Command: normal [file] Enter normal mode and display the GRUB menu. In normal mode, commands, filesystem modules, and cryptography modules are automatically loaded, and the full GRUB script parser is available. Other modules may be explicitly loaded using 'insmod' (*note insmod::). If a FILE is given, then commands will be read from that file. Otherwise, they will be read from '$prefix/grub.cfg' if it exists. 'normal' may be called from within normal mode, creating a nested environment. It is more usual to use 'configfile' (*note configfile::) for this.  File: grub.info, Node: normal_exit, Next: parttool, Prev: normal, Up: Command-line commands 17.4.55 normal_exit ------------------- -- Command: normal_exit Exit normal mode (*note normal::). If this instance of normal mode was not nested within another one, then return to rescue mode.  File: grub.info, Node: parttool, Next: password, Prev: normal_exit, Up: Command-line commands 17.4.56 parttool ---------------- -- Command: parttool partition commands Make various modifications to partition table entries. Each COMMAND is either a boolean option, in which case it must be followed with '+' or '-' (with no intervening space) to enable or disable that option, or else it takes a value in the form 'COMMAND=VALUE'. Currently, 'parttool' is only useful on DOS partition tables (also known as Master Boot Record, or MBR). On these partition tables, the following commands are available: 'boot' (boolean) When enabled, this makes the selected partition be the active (bootable) partition on its disk, clearing the active flag on all other partitions. This command is limited to _primary_ partitions. 'type' (value) Change the type of an existing partition. The value must be a number in the range 0-0xFF (prefix with '0x' to enter it in hexadecimal). 'hidden' (boolean) When enabled, this hides the selected partition by setting the "hidden" bit in its partition type code; when disabled, unhides the selected partition by clearing this bit. This is useful only when booting DOS or Windows and multiple primary FAT partitions exist in one disk. See also *note DOS/Windows::.  File: grub.info, Node: password, Next: password_pbkdf2, Prev: parttool, Up: Command-line commands 17.4.57 password ---------------- -- Command: password user clear-password Define a user named USER with password CLEAR-PASSWORD. *Note Security::.  File: grub.info, Node: password_pbkdf2, Next: plainmount, Prev: password, Up: Command-line commands 17.4.58 password_pbkdf2 ----------------------- -- Command: password_pbkdf2 user hashed-password Define a user named USER with password hash HASHED-PASSWORD. Use 'grub-mkpasswd-pbkdf2' (*note Invoking grub-mkpasswd-pbkdf2::) to generate password hashes. *Note Security::.  File: grub.info, Node: plainmount, Next: play, Prev: password_pbkdf2, Up: Command-line commands 17.4.59 plainmount ------------------ -- Command: plainmount device -c cipher -s key size [-h hash] ['-S' sector size] ['-p' password] ['-u' uuid] [['-d' keyfile] ['-O' keyfile offset]] Setup access to the encrypted device in plain mode. Offset of the encrypted data at the device is specified in terms of 512 byte sectors using the blocklist syntax and loopback device. The following example shows how to specify 1MiB offset: loopback node (hd0,gpt1)2048+ plainmount node ... The 'plainmount' command can be used to open LUKS encrypted volume if its master key and parameters (key size, cipher, offset, etc) are known. There are two ways to specify a password: a keyfile and a secret passphrase. The keyfile path parameter has higher priority than the secret passphrase parameter and is specified with the option '-d'. Password data obtained from keyfiles is not hashed and is used directly as a cipher key. An optional offset of password data in the keyfile can be specified with the option '-O' or directly with the option '-d' and GRUB blocklist syntax, if the keyfile data can be accessed from a device and is 512 byte aligned. The following example shows both methods to specify password data in the keyfile at offset 1MiB: plainmount -d (hd0,gpt1)2048+ ... plainmount -d (hd0,gpt1)+ -O 1048576 ... If no keyfile is specified then the password is set to the string specified by option '-p' or is requested interactively from the console. In both cases the provided password is hashed with the algorithm specified by the option '-h'. This option is mandatory if no keyfile is specified, but it can be set to 'plain' which means that no hashing is done and such password is used directly as a key. Cipher '-c' and keysize '-s' options specify the cipher algorithm and the key size respectively and are mandatory options. Cipher must be specified with the mode separated by a dash (for example, 'aes-xts-plain64'). Key size option '-s' is the key size of the cipher in bits, not to be confused with the offset of the key data in a keyfile specified with the '-O' option. It must not exceed 1024 bits, so a 32 byte key would be specified as 256 bits The optional parameter '-S' specifies encrypted device sector size. It must be at least 512 bytes long (default value) and a power of 2. (1) (*note plainmount-Footnote-1::). Disk sector size is configured when creating the encrypted volume. Attempting to decrypt volumes with a different sector size than it was created with will not result in an error, but will decrypt to random bytes and thus prevent accessing the volume (in some cases the filesystem driver can detect the presence of a filesystem, but nevertheless will refuse to mount it). By default new plainmount devices will be given a UUID starting with '109fea84-a6b7-34a8-4bd1-1c506305a401' where the last digits are incremented by one for each plainmounted device beyond the first up to 2^10 devices. All encryption arguments (cipher, hash, key size, disk offset and disk sector size) must match the parameters used to create the volume. If any of them does not match the actual arguments used during the initial encryption, plainmount will create virtual device with the garbage data and GRUB will report unknown filesystem for such device.  File: grub.info, Node: plainmount-Footnotes, Up: plainmount (1) Current implementation of cryptsetup supports only 512/1024/2048/4096 byte sectors  File: grub.info, Node: play, Next: probe, Prev: plainmount, Up: Command-line commands 17.4.60 play ------------ -- Command: play file | tempo [pitch1 duration1] [pitch2 duration2] ... Plays a tune If the argument is a file name (*note File name syntax::), play the tune recorded in it. The file format is first the tempo as an unsigned 32bit little-endian number, then pairs of unsigned 16bit little-endian numbers for pitch and duration pairs. If the arguments are a series of numbers, play the inline tune. The tempo is the base for all note durations. 60 gives a 1-second base, 120 gives a half-second base, etc. Pitches are Hz. Set pitch to 0 to produce a rest.  File: grub.info, Node: probe, Next: rdmsr, Prev: play, Up: Command-line commands 17.4.61 probe ------------- -- Command: probe [--set var] --driver|--partmap|--fs|--fs-uuid|--label|--part-uuid device Retrieve device information. If option '--set' is given, assign result to variable VAR, otherwise print information on the screen. The option '--part-uuid' is currently only implemented for MSDOS and GPT formatted disks.  File: grub.info, Node: rdmsr, Next: read, Prev: probe, Up: Command-line commands 17.4.62 rdmsr ------------- -- Command:: rdmsr 0xADDR [-v VARNAME] Read a model-specific register at address 0xADDR. If the parameter '-v' is used and an environment variable VARNAME is given, set that environment variable to the value that was read. Please note that on SMP systems, reading from a MSR that has a scope per hardware thread, implies that the value that is returned only applies to the particular cpu/core/thread that runs the command. Also, if you specify a reserved or unimplemented MSR address, it will cause a general protection exception (which is not currently being handled) and the system will reboot.  File: grub.info, Node: read, Next: reboot, Prev: rdmsr, Up: Command-line commands 17.4.63 read ------------ -- Command: read [-s] [var] Read a line of input from the user. If an environment variable VAR is given, set that environment variable to the line of input that was read, with no terminating newline. If the parameter '-s' is used, enable silent mode where input is not printed to the terminal.  File: grub.info, Node: reboot, Next: regexp, Prev: read, Up: Command-line commands 17.4.64 reboot -------------- -- Command: reboot Reboot the computer.  File: grub.info, Node: regexp, Next: rmmod, Prev: reboot, Up: Command-line commands 17.4.65 regexp -------------- -- Command: regexp [--set [number:]var] regexp string Test if regular expression REGEXP matches STRING. Supported regular expressions are POSIX.2 Extended Regular Expressions. If option '--set' is given, store NUMBERth matched subexpression in variable VAR. Subexpressions are numbered in order of their opening parentheses starting from '1'. NUMBER defaults to '1'.  File: grub.info, Node: rmmod, Next: save_env, Prev: regexp, Up: Command-line commands 17.4.66 rmmod ------------- -- Command: rmmod module Remove a loaded MODULE.  File: grub.info, Node: save_env, Next: search, Prev: rmmod, Up: Command-line commands 17.4.67 save_env ---------------- -- Command: save_env [--file file] var ... Save the named variables from the environment to the environment block file. *Note Environment block::. The '--file' option overrides the default location of the environment block. This command will operate successfully even when environment variable 'check_signatures' is set to 'enforce' (*note check_signatures::), since it writes to disk and does not alter the behavior of GRUB based on any contents of disk that have been read. It is possible to modify a digitally signed environment block file from within GRUB using this command, such that its signature will no longer be valid on subsequent boots. Care should be taken in such advanced configurations to avoid rendering the system unbootable. *Note Using digital signatures::, for more information.  File: grub.info, Node: search, Next: sendkey, Prev: save_env, Up: Command-line commands 17.4.68 search -------------- -- Command: search [--file|--label|--fs-uuid] [--set [var]] [--no-floppy|--efidisk-only|--cryptodisk-only] name Search devices by file ('-f', '--file'), filesystem label ('-l', '--label'), or filesystem UUID ('-u', '--fs-uuid'). If the ('-s', '--set') option is used, the first device found is set as the value of environment variable VAR. The default variable is 'root'. The ('-n', '--no-floppy') option prevents searching floppy devices, which can be slow. The ('--efidisk-only') option prevents searching any other devices then EFI disks. This is typically used when chainloading to local EFI partition. The ('--cryptodisk-only') option prevents searching any devices other than encrypted disks. This is typically used when booting from an encrypted file system to ensure that no code gets executed from an unencrypted device having the same filesystem UUID or label. This option implicitly invokes the command 'cryptocheck', if it is available (*note cryptocheck:: for additional information). The 'search.file', 'search.fs_label', and 'search.fs_uuid' commands are aliases for 'search --file', 'search --label', and 'search --fs-uuid' respectively. Also hints as to which device may be the most likely to contain the item searched for may be given via the ('-h', '--hint') option with a device name as an argument. If the argument ends with a comma, then partitions on the device are also searched. Furthermore, platform specific hints may be given via the options '--hint-ieee1275', '--hint-bios', '--hint-baremetal', '--hint-efi', and '--hint-arc'. When specified, these options take an argument and operate like '--hint', but only on the specified platform.  File: grub.info, Node: sendkey, Next: set, Prev: search, Up: Command-line commands 17.4.69 sendkey --------------- -- Command: sendkey [--num|--caps|--scroll|--insert|--pause|--left-shift|--right-shift|--sysrq|--numkey|--capskey|--scrollkey|--insertkey|--left-alt|--right-alt|--left-ctrl|--right-ctrl on|off]... [no-led] keystroke Insert keystrokes into the keyboard buffer when booting. Sometimes an operating system or chainloaded boot loader requires particular keys to be pressed: for example, one might need to press a particular key to enter "safe mode", or when chainloading another boot loader one might send keystrokes to it to navigate its menu. Note: This command is currently only available on the i386-pc target. You may provide up to 16 keystrokes (the length of the BIOS keyboard buffer). Keystroke names may be upper-case or lower-case letters, digits, or taken from the following table: Name Key ------------------------------------------------------------------- escape Escape exclam ! at @ numbersign # dollar $ percent % caret ^ ampersand & asterisk * parenleft ( parenright ) minus - underscore _ equal = plus + backspace Backspace tab Tab bracketleft [ braceleft { bracketright ] braceright } enter Enter control press and release Control semicolon ; colon : quote ' doublequote " backquote ' tilde ~ shift press and release left Shift backslash \ bar | comma , less < period . greater > slash / question ? rshift press and release right Shift alt press and release Alt space space bar capslock Caps Lock F1 F1 F2 F2 F3 F3 F4 F4 F5 F5 F6 F6 F7 F7 F8 F8 F9 F9 F10 F10 F11 F11 F12 F12 num1 1 (numeric keypad) num2 2 (numeric keypad) num3 3 (numeric keypad) num4 4 (numeric keypad) num5 5 (numeric keypad) num6 6 (numeric keypad) num7 7 (numeric keypad) num8 8 (numeric keypad) num9 9 (numeric keypad) num0 0 (numeric keypad) numperiod . (numeric keypad) numend End (numeric keypad) numdown Down (numeric keypad) numpgdown Page Down (numeric keypad) numleft Left (numeric keypad) numcenter 5 with Num Lock inactive (numeric keypad) numright Right (numeric keypad) numhome Home (numeric keypad) numup Up (numeric keypad) numpgup Page Up (numeric keypad) numinsert Insert (numeric keypad) numdelete Delete (numeric keypad) numasterisk * (numeric keypad) numminus - (numeric keypad) numplus + (numeric keypad) numslash / (numeric keypad) numenter Enter (numeric keypad) delete Delete insert Insert home Home end End pgdown Page Down pgup Page Up down Down up Up left Left right Right As well as keystrokes, the 'sendkey' command takes various options that affect the BIOS keyboard status flags. These options take an 'on' or 'off' parameter, specifying that the corresponding status flag be set or unset; omitting the option for a given status flag will leave that flag at its initial state at boot. The '--num', '--caps', '--scroll', and '--insert' options emulate setting the corresponding mode, while the '--numkey', '--capskey', '--scrollkey', and '--insertkey' options emulate pressing and holding the corresponding key. The other status flag options are self-explanatory. If the '--no-led' option is given, the status flag options will have no effect on keyboard LEDs. If the 'sendkey' command is given multiple times, then only the last invocation has any effect. Since 'sendkey' manipulates the BIOS keyboard buffer, it may cause hangs, reboots, or other misbehaviour on some systems. If the operating system or boot loader that runs after GRUB uses its own keyboard driver rather than the BIOS keyboard functions, then 'sendkey' will have no effect. This command is only available on PC BIOS systems.  File: grub.info, Node: set, Next: sha1sum, Prev: sendkey, Up: Command-line commands 17.4.70 set ----------- -- Command: set [envvar=value] Set the environment variable ENVVAR to VALUE. If invoked with no arguments, print all environment variables with their values. For the list of environment variables currently used by GRUB itself see the relevant section *note Environment::.  File: grub.info, Node: sha1sum, Next: sha256sum, Prev: set, Up: Command-line commands 17.4.71 sha1sum --------------- -- Command: sha1sum arg ... Alias for 'hashsum --hash sha1 arg ...'. See command 'hashsum' (*note hashsum::) for full description.  File: grub.info, Node: sha256sum, Next: sha512sum, Prev: sha1sum, Up: Command-line commands 17.4.72 sha256sum ----------------- -- Command: sha256sum arg ... Alias for 'hashsum --hash sha256 arg ...'. See command 'hashsum' (*note hashsum::) for full description.  File: grub.info, Node: sha512sum, Next: sleep, Prev: sha256sum, Up: Command-line commands 17.4.73 sha512sum ----------------- -- Command: sha512sum arg ... Alias for 'hashsum --hash sha512 arg ...'. See command 'hashsum' (*note hashsum::) for full description.  File: grub.info, Node: sleep, Next: smbios, Prev: sha512sum, Up: Command-line commands 17.4.74 sleep ------------- -- Command: sleep [--verbose] [--interruptible] count Sleep for COUNT seconds. If option '--interruptible' is given, allow pressing , or holding down to interrupt sleep. With '--verbose' show countdown of remaining seconds. Exit code is set to 0 if timeout expired and to 1 if timeout was interrupted using any of the mentioned keys.  File: grub.info, Node: smbios, Next: source, Prev: sleep, Up: Command-line commands 17.4.75 smbios -------------- -- Command: smbios [--type TYPE] [--handle HANDLE] [--match MATCH] (--get-byte | --get-word | --get-dword | --get-qword | --get-string | --get-uuid) OFFSET [--set VARIABLE] Retrieve SMBIOS information. The 'smbios' command returns the value of a field in an SMBIOS structure. The following options determine which structure to select. * Specifying '--type' will select structures with a matching TYPE. The type can be any integer from 0 to 255. * Specifying '--handle' will select structures with a matching HANDLE. The handle can be any integer from 0 to 65535. * Specifying '--match' will select structure number MATCH in the filtered list of structures; e.g. 'smbios --type 4 --match 2' will select the second Process Information (Type 4) structure. The list is always ordered the same as the hardware's SMBIOS table. The match number must be a positive integer. If unspecified, the first matching structure will be selected. The remaining options determine which field in the selected SMBIOS structure to return. Only one of these options may be specified at a time. * When given '--get-byte', return the value of the byte at OFFSET bytes into the selected SMBIOS structure. It will be formatted as an unsigned decimal integer. * When given '--get-word', return the value of the word (two bytes) at OFFSET bytes into the selected SMBIOS structure. It will be formatted as an unsigned decimal integer. * When given '--get-dword', return the value of the dword (four bytes) at OFFSET bytes into the selected SMBIOS structure. It will be formatted as an unsigned decimal integer. * When given '--get-qword', return the value of the qword (eight bytes) at OFFSET bytes into the selected SMBIOS structure. It will be formatted as an unsigned decimal integer. * When given '--get-string', return the string with its index found at OFFSET bytes into the selected SMBIOS structure. * When given '--get-uuid', return the value of the UUID (sixteen bytes) at OFFSET bytes into the selected SMBIOS structure. It will be formatted as lower-case hyphenated hexadecimal digits, with the first three fields as little-endian, and the rest printed byte-by-byte. The default action is to print the value of the requested field to the console, but a variable name can be specified with '--set' to store the value instead of printing it. For example, this will store and then display the system manufacturer's name. smbios --type 1 --get-string 4 --set system_manufacturer echo $system_manufacturer  File: grub.info, Node: source, Next: test, Prev: smbios, Up: Command-line commands 17.4.76 source -------------- -- Command: source file Read FILE as a configuration file, as if its contents had been incorporated directly into the sourcing file. Unlike 'configfile' (*note configfile::), this executes the contents of FILE without changing context: any environment variable changes made by the commands in FILE will be preserved after 'source' returns, and the menu will not be shown immediately.  File: grub.info, Node: test, Next: tpm2_key_protector_init, Prev: source, Up: Command-line commands 17.4.77 test ------------ -- Command: test expression Evaluate EXPRESSION and return zero exit status if result is true, non zero status otherwise. EXPRESSION is one of: STRING1 '==' STRING2 the strings are equal STRING1 '!=' STRING2 the strings are not equal STRING1 '<' STRING2 STRING1 is lexicographically less than STRING2 STRING1 '<=' STRING2 STRING1 is lexicographically less or equal than STRING2 STRING1 '>' STRING2 STRING1 is lexicographically greater than STRING2 STRING1 '>=' STRING2 STRING1 is lexicographically greater or equal than STRING2 INTEGER1 '-eq' INTEGER2 INTEGER1 is equal to INTEGER2 INTEGER1 '-ge' INTEGER2 INTEGER1 is greater than or equal to INTEGER2 INTEGER1 '-gt' INTEGER2 INTEGER1 is greater than INTEGER2 INTEGER1 '-le' INTEGER2 INTEGER1 is less than or equal to INTEGER2 INTEGER1 '-lt' INTEGER2 INTEGER1 is less than INTEGER2 INTEGER1 '-ne' INTEGER2 INTEGER1 is not equal to INTEGER2 PREFIXINTEGER1 '-pgt' PREFIXINTEGER2 INTEGER1 is greater than INTEGER2 after stripping off common non-numeric PREFIX. PREFIXINTEGER1 '-plt' PREFIXINTEGER2 INTEGER1 is less than INTEGER2 after stripping off common non-numeric PREFIX. FILE1 '-nt' FILE2 FILE1 is newer than FILE2 (modification time). Optionally numeric BIAS may be directly appended to '-nt' in which case it is added to the first file modification time. FILE1 '-ot' FILE2 FILE1 is older than FILE2 (modification time). Optionally numeric BIAS may be directly appended to '-ot' in which case it is added to the first file modification time. '-d' FILE FILE exists and is a directory '-e' FILE FILE exists '-f' FILE FILE exists and is not a directory '-s' FILE FILE exists and has a size greater than zero '-n' STRING the length of STRING is nonzero STRING STRING is equivalent to '-n STRING' '-z' STRING the length of STRING is zero '(' EXPRESSION ')' EXPRESSION is true '!' EXPRESSION EXPRESSION is false EXPRESSION1 '-a' EXPRESSION2 both EXPRESSION1 and EXPRESSION2 are true EXPRESSION1 EXPRESSION2 both EXPRESSION1 and EXPRESSION2 are true. This syntax is not POSIX-compliant and is not recommended. EXPRESSION1 '-o' EXPRESSION2 either EXPRESSION1 or EXPRESSION2 is true  File: grub.info, Node: tpm2_key_protector_init, Next: tpm2_key_protector_clear, Prev: test, Up: Command-line commands 17.4.78 tpm2_key_protector_init ------------------------------- -- Command: tpm2_key_protector_init [--mode | -m mode] | [--pcrs | -p pcrlist] | [--bank | -b pcrbank] | [ [--tpm2key | -T tpm2key_file] | [--keyfile | -k keyfile] ] | [--srk | -s handle] | [--asymmetric | -a srk_type] | [--nvindex | -n nv_index] Initialize the TPM2 key protector to unseal the key for the 'cryptomount' (*note cryptomount::) command. There are two supported modes, SRK('srk') and NV index('nv'), to be specified by the option '-m'. The default mode is SRK. The main difference between SRK mode and NV index mode is the storage of the sealed key. For SRK mode, the sealed key is stored in a file while NV index mode stores the sealed key in the non-volatile memory inside TPM with a given NV index. The '-p' and '-b' options are used to supply the PCR list and bank that the key is sealed with. The PCR list is a comma-separated list, e.g., '0,2,4,7,9', to represent the involved PCRs, and the default is '7'. The PCR bank is chosen by selecting a hash algorithm. The current supported PCR banks are SHA1, SHA256, SHA384, and SHA512, and the default is SHA256. Some options are only available for the specific mode. The SRK-specific options are '-T', '-k', '-a', and '-s'. On the other hand, the NV index-specific option is '-n'. The key file for SRK mode can be supplied with either '-T' or '-k'. Those two options were used to distinguish the file formats but are same now. There are two supported file formats: raw format and TPM 2.0 Key File format. When using the key file in the raw format, the '-p' and '-b' options are necessary for the non-default PCR list or bank. On the other hand, when using the key file in TPM 2.0 Key File format, the the parameters for the TPM commands are written in the file, and there is no need to set the PCR list('-p') and bank('-b'). In general, TPM 2.0 Key File format is preferred due to the simplified GRUB command options and the authorized policy support Besides the key file, there are two options, '-a' and '-s', to tweak the TPM Storage Root Key (SRK). The SRK can be either created at runtime or stored in the non-volatile memory. When creating SRK at runtime, GRUB provides the SRK template to the TPM to create the key. There are two SRK templates for the '-a' option, ECC and RSA, and the default is ECC. If the SRK is stored in a specific handle, e.g. '0x81000001', the '-s' option can be used to set the handle to notify GRUB to load the SRK from the given handle. The only NV index-specific option is the '-n' option which is used to set the NV index containing the sealed key. Then GRUB can load the sealed key and unseal it with the given PCR list and bank.  File: grub.info, Node: tpm2_key_protector_clear, Next: tpm2_dump_pcr, Prev: tpm2_key_protector_init, Up: Command-line commands 17.4.79 tpm2_key_protector_clear -------------------------------- -- Command: tpm2_key_protector_clear Clear the TPM2 key protector if previously initialized.  File: grub.info, Node: tpm2_dump_pcr, Next: true, Prev: tpm2_key_protector_clear, Up: Command-line commands 17.4.80 tpm2_dump_pcr --------------------- -- Command: tpm2_dump_pcr [BANK] Print all PCRs of the specified TPM 2.0 BANK. The supported banks are 'sha1', 'sha256', 'sha384', and 'sha512'. If BANK is not specified, 'sha256' is chosen by default. Since GRUB measures every command into PCR 8, invoking 'tpm2_dump_pcr' also extends PCR 8, so PCR 8 will not be a stable value in GRUB shell.  File: grub.info, Node: true, Next: trust, Prev: tpm2_dump_pcr, Up: Command-line commands 17.4.81 true ------------ -- Command: true Do nothing, successfully. This is mainly useful in control constructs such as 'if' and 'while' (*note Shell-like scripting::).  File: grub.info, Node: trust, Next: unset, Prev: true, Up: Command-line commands 17.4.82 trust ------------- -- Command: trust [--skip-sig] pubkey_file Read public key from PUBKEY_FILE and add it to GRUB's internal list of trusted public keys. These keys are used to validate digital signatures when environment variable 'check_signatures' is set to 'enforce'. Note that if 'check_signatures' is set to 'enforce' when 'trust' executes, then PUBKEY_FILE must itself be properly signed. The '--skip-sig' option can be used to disable signature-checking when reading PUBKEY_FILE itself. It is expected that '--skip-sig' is useful for testing and manual booting. *Note Using digital signatures::, for more information.  File: grub.info, Node: unset, Next: verify_detached, Prev: trust, Up: Command-line commands 17.4.83 unset ------------- -- Command: unset envvar Unset the environment variable ENVVAR.  File: grub.info, Node: verify_detached, Next: videoinfo, Prev: unset, Up: Command-line commands 17.4.84 verify_detached ----------------------- -- Command: verify_detached [--skip-sig] file signature_file [pubkey_file] Verifies a GPG-style detached signature, where the signed file is FILE, and the signature itself is in file SIGNATURE_FILE. Optionally, a specific public key to use can be specified using PUBKEY_FILE. When environment variable 'check_signatures' is set to 'enforce', then PUBKEY_FILE must itself be properly signed by an already-trusted key. An unsigned PUBKEY_FILE can be loaded by specifying '--skip-sig'. If PUBKEY_FILE is omitted, then public keys from GRUB's trusted keys (*note list_trusted::, *note trust::, and *note distrust::) are tried. Exit code '$?' is set to 0 if the signature validates successfully. If validation fails, it is set to a non-zero value. *Note Using digital signatures::, for more information.  File: grub.info, Node: videoinfo, Next: wrmsr, Prev: verify_detached, Up: Command-line commands 17.4.85 videoinfo ----------------- -- Command: videoinfo [[WxH]xD] List available video modes. If resolution is given, show only matching modes.  File: grub.info, Node: wrmsr, Prev: videoinfo, Up: Command-line commands 17.4.86 wrmsr ------------- -- Command:: wrmsr 0xADDR 0xVALUE Write a 0xVALUE to a model-specific register at address 0xADDR. Please note that on SMP systems, writing to a MSR that has a scope per hardware thread, implies that the value that is written only applies to the particular cpu/core/thread that runs the command. Also, if you specify a reserved or unimplemented MSR address, it will cause a general protection exception (which is not currently being handled) and the system will reboot. Note: The command is not allowed when lockdown is enforced (*note Lockdown::). This is done to prevent subverting various security mechanisms.  File: grub.info, Node: Networking commands, Next: Undocumented commands, Prev: Command-line commands, Up: Commands 17.5 Networking commands ======================== * Menu: * net_add_addr:: Add a network address * net_add_dns:: Add a DNS server * net_add_route:: Add routing entry * net_bootp:: Perform a bootp/DHCP autoconfiguration * net_del_addr:: Remove IP address from interface * net_del_dns:: Remove a DNS server * net_del_route:: Remove a route entry * net_dhcp:: Perform a DHCP autoconfiguration * net_get_dhcp_option:: Retrieve DHCP options * net_ipv6_autoconf:: Perform IPv6 autoconfiguration * net_ls_addr:: List interfaces * net_ls_cards:: List network cards * net_ls_dns:: List DNS servers * net_ls_routes:: List routing entries * net_nslookup:: Perform a DNS lookup * net_set_vlan:: Set vlan id on an interface  File: grub.info, Node: net_add_addr, Next: net_add_dns, Up: Networking commands 17.5.1 net_add_addr ------------------- -- Command: net_add_addr INTERFACE CARD ADDRESS Configure additional network INTERFACE with ADDRESS on a network CARD. ADDRESS can be either IP in dotted decimal notation, or symbolic name which is resolved using DNS lookup. If successful, this command also adds local link routing entry to the default subnet of ADDRESS with name INTERFACE':local' via INTERFACE.  File: grub.info, Node: net_add_dns, Next: net_add_route, Prev: net_add_addr, Up: Networking commands 17.5.2 net_add_dns ------------------ -- Command: net_add_dns SERVER Resolve SERVER IP address and add to the list of DNS servers used during name lookup.  File: grub.info, Node: net_add_route, Next: net_bootp, Prev: net_add_dns, Up: Networking commands 17.5.3 net_add_route -------------------- -- Command: net_add_route SHORTNAME IP[/PREFIX] [INTERFACE | gw GATEWAY] Add route to network with address IP as modified by PREFIX via either local INTERFACE or GATEWAY. PREFIX is optional and defaults to 32 for IPv4 address and 128 for IPv6 address. Route is identified by SHORTNAME which can be used to remove it (*note net_del_route::).  File: grub.info, Node: net_bootp, Next: net_del_addr, Prev: net_add_route, Up: Networking commands 17.5.4 net_bootp ---------------- -- Command: net_bootp [CARD] Alias for net_dhcp, for compatibility with older Grub versions. Will perform the same DHCP handshake with potential fallback to BOOTP as the net_dhcp command (*note net_dhcp::).  File: grub.info, Node: net_del_addr, Next: net_del_dns, Prev: net_bootp, Up: Networking commands 17.5.5 net_del_addr ------------------- -- Command: net_del_addr INTERFACE Remove configured INTERFACE with associated address.  File: grub.info, Node: net_del_dns, Next: net_del_route, Prev: net_del_addr, Up: Networking commands 17.5.6 net_del_dns ------------------ -- Command: net_del_dns ADDRESS Remove ADDRESS from list of servers used during name lookup.  File: grub.info, Node: net_del_route, Next: net_dhcp, Prev: net_del_dns, Up: Networking commands 17.5.7 net_del_route -------------------- -- Command: net_del_route SHORTNAME Remove route entry identified by SHORTNAME.  File: grub.info, Node: net_dhcp, Next: net_get_dhcp_option, Prev: net_del_route, Up: Networking commands 17.5.8 net_dhcp --------------- -- Command: net_dhcp [CARD] Perform configuration of CARD using DHCP protocol. If no card name is specified, try to configure all existing cards. Falls back to the BOOTP protocol, if needed. If configuration was successful, interface with name CARD':dhcp' and configured address is added to CARD. Additionally the following DHCP options are recognized and processed: '1 (Subnet Mask)' Used to calculate network local routing entry for interface CARD':dhcp'. '3 (Router)' Adds default route entry with the name CARD':dhcp:default' via gateway from DHCP option. Note that only option with single route is accepted. '6 (Domain Name Server)' Adds all servers from option value to the list of servers used during name resolution. '12 (Host Name)' Sets environment variable 'net_''_dhcp_hostname' (*note net__hostname::) to the value of option. '15 (Domain Name)' Sets environment variable 'net_''_dhcp_domain' (*note net__domain::) to the value of option. '17 (Root Path)' Sets environment variable 'net_''_dhcp_rootpath' (*note net__rootpath::) to the value of option. '18 (Extensions Path)' Sets environment variable 'net_''_dhcp_extensionspath' (*note net__extensionspath::) to the value of option. '66 (TFTP Server Name)' Sets environment variable 'net_''_dhcp_server_name' (*note net__dhcp_server_name::) to the value of option. '67 (Filename)' Sets environment variable 'net_''_boot_file' (*note net__boot_file::) to the value of option.  File: grub.info, Node: net_get_dhcp_option, Next: net_ipv6_autoconf, Prev: net_dhcp, Up: Networking commands 17.5.9 net_get_dhcp_option -------------------------- -- Command: net_get_dhcp_option VAR INTERFACE NUMBER TYPE Request DHCP option NUMBER of TYPE via INTERFACE. TYPE can be one of 'string', 'number' or 'hex'. If option is found, assign its value to variable VAR. Values of types 'number' and 'hex' are converted to string representation.  File: grub.info, Node: net_ipv6_autoconf, Next: net_ls_addr, Prev: net_get_dhcp_option, Up: Networking commands 17.5.10 net_ipv6_autoconf ------------------------- -- Command: net_ipv6_autoconf [CARD] Perform IPv6 autoconfiguration by adding to the CARD interface with name CARD':link' and link local MAC-based address. If no card is specified, perform autoconfiguration for all existing cards.  File: grub.info, Node: net_ls_addr, Next: net_ls_cards, Prev: net_ipv6_autoconf, Up: Networking commands 17.5.11 net_ls_addr ------------------- -- Command: net_ls_addr List all configured interfaces with their MAC and IP addresses.  File: grub.info, Node: net_ls_cards, Next: net_ls_dns, Prev: net_ls_addr, Up: Networking commands 17.5.12 net_ls_cards -------------------- -- Command: net_ls_cards List all detected network cards with their MAC address.  File: grub.info, Node: net_ls_dns, Next: net_ls_routes, Prev: net_ls_cards, Up: Networking commands 17.5.13 net_ls_dns ------------------ -- Command: net_ls_dns List addresses of DNS servers used during name lookup.  File: grub.info, Node: net_ls_routes, Next: net_nslookup, Prev: net_ls_dns, Up: Networking commands 17.5.14 net_ls_routes --------------------- -- Command: net_ls_routes List routing entries.  File: grub.info, Node: net_nslookup, Next: net_set_vlan, Prev: net_ls_routes, Up: Networking commands 17.5.15 net_nslookup -------------------- -- Command: net_nslookup NAME [SERVER] Resolve address of NAME using DNS server SERVER. If no server is given, use default list of servers.  File: grub.info, Node: net_set_vlan, Prev: net_nslookup, Up: Networking commands 17.5.16 net_set_vlan -------------------- -- Command: net_set_vlan INTERFACE VLANID Set the 802.1Q VLAN identifier on INTERFACE to VLANID. For example, to set the VLAN identifier on interface 'efinet1' to '100': net_set_vlan efinet1 100 The VLAN identifier can be removed by setting it to '0': net_set_vlan efinet1 0  File: grub.info, Node: Undocumented commands, Prev: Networking commands, Up: Commands 17.6 Commands currently undocumented ==================================== Unfortunately, not all GRUB commands are documented at this time due to developer resource constraints. One way to contribute back to the GRUB project would be to help document these commands, and submit patches or ideas to the mailing list. The following is a (most likely incomplete) list of undocumented or poorly documented commands and not all of them are allowed for all platforms. Running the command help from within the GRUB shell may provide more information on parameters and usage. * 'all_functional_test' - Run all functional tests. * 'backtrace' - Print backtrace. * 'boottime' - Show boot time statistics. * 'cacheinfo' - Get disk cache info. * 'cbmemc' - Show CBMEM console content. * 'cmosset' - Set bit at BYTE:BIT in CMOS. * 'coreboot_boottime' - Show coreboot boot time statistics. * 'dump' - Show memory contents. * 'efiemu_loadcore' - Load and initialize EFI emulator. * 'efiemu_prepare' - Finalize loading of EFI emulator. * 'efiemu_unload' - Unload EFI emulator. * 'exit' - Exit from GRUB. * 'extract_entries_configfile' - Load another config file but take only menu entries. * 'extract_entries_source' - Load another config file without changing context but take only menu entries. * 'extract_legacy_entries_configfile' - Parse legacy config in new context taking only menu entries * 'extract_legacy_entries_source' - Parse legacy config in same context taking only menu entries * 'extract_syslinux_entries_configfile' - Execute syslinux config in new context taking only menu entries * 'extract_syslinux_entries_source' - Execute syslinux config in same context taking only menu entries * 'fakebios' - Create BIOS-like structures for backward compatibility with existing OS. * 'fix_video' - Fix video problem. * 'fpswa' - Display FPSWA version. * 'functional_test' - Run all loaded functional tests. * 'gdbstub_break' - Break into GDB * 'gdbstub' - Start GDB stub on given port * 'gdbstub_stop' - Stop GDB stub * 'hdparm' - Get/set ATA disk parameters. * 'hexdump_random' - Hexdump random data. * 'inb' - Read 8-bit value from PORT. * 'inl' - Read 32-bit value from PORT. * 'inw' - Read 16-bit value from PORT. * 'jpegtest' - Tests loading of JPEG bitmap. * 'keymap' - Load a keyboard layout. * 'legacy_check_password' - Simulate grub-legacy 'password' command in menu entry mode * 'legacy_configfile' - Parse legacy config in new context * 'legacy_password' - Simulate grub-legacy 'password' command * 'legacy_source' - Parse legacy config in same context * 'loadbios' - Load BIOS dump. * 'lsacpi' - Show ACPI information. * 'lsapm' - Show APM information. * 'lscoreboot' - List coreboot tables. * 'lsdev' - List devices. * 'lsefi' - Display EFI handles. * 'lsefimmap' - Display EFI memory map. * 'lsefisystab' - Display EFI system tables. * 'lsmmap' - List memory map provided by firmware. * 'lspci' - List PCI devices. * 'lssal' - Display SAL system table. * 'lsspd' - Print Memory information. * 'macppcbless' - Bless DIR of HFS or HFS+ partition for PPC macs. * 'mactelbless' - Bless FILE of HFS or HFS+ partition for intel macs. * 'net_set_vlan' - Set an interface's vlan id. * 'outb' - Write 8-bit VALUE to PORT. * 'outl' - Write 32-bit VALUE to PORT. * 'outw' - Write 16-bit VALUE to PORT. * 'pcidump' - Show raw dump of the PCI configuration space. * 'pngtest' - Tests loading of PNG bitmap. * 'read_byte' - Read 8-bit value from ADDR. * 'read_dword' - Read 32-bit value from ADDR. * 'read_word' - Read 16-bit value from ADDR. * 'setpci' - Manipulate PCI devices. * 'suspend' - Return to IEEE1275 prompt. * 'syslinux_configfile' - Execute syslinux config in new context * 'syslinux_source' - Execute syslinux config in same context * 'test_blockarg' - Print and execute block argument., 0 * 'testload' - Load the same file in multiple ways. * 'testspeed' - Test file read speed. * 'tgatest' - Tests loading of TGA bitmap. * 'time' - Measure time used by COMMAND * 'tr' - Translate SET1 characters to SET2 in STRING. * 'usb' - Test USB support. * 'vbeinfo' - List available video modes. If resolution is given show only modes matching it. * 'vbetest' - Test video subsystem. * 'videotest' - Test video subsystem in mode WxH. * 'write_byte' - Write 8-bit VALUE to ADDR. * 'write_dword' - Write 32-bit VALUE to ADDR. * 'write_word' - Write 16-bit VALUE to ADDR. * 'xen_cat' - List Xen storage. * 'xen_ls' - List Xen storage. * 'xnu_devprop_load' - Load 'device-properties' dump. * 'xnu_uuid' - Transform 64-bit UUID to format suitable for XNU. If -l is given keep it lowercase as done by blkid. * 'zfs-bootfs' - Print ZFS-BOOTFSOBJ or store it into VARIABLE * 'zfsinfo' - Print ZFS info about DEVICE. * 'zfskey' - Import ZFS wrapping key stored in FILE.  File: grub.info, Node: Internationalisation, Next: Security, Prev: Commands, Up: Top 18 Internationalisation *********************** 18.1 Charset ============ GRUB uses UTF-8 internally other than in rendering where some GRUB-specific appropriate representation is used. All text files (including config) are assumed to be encoded in UTF-8. 18.2 Filesystems ================ NTFS, JFS, UDF, HFS+, exFAT, long filenames in FAT, Joliet part of ISO9660 are treated as UTF-16 as per specification. AFS and BFS are read as UTF-8, again according to specification. BtrFS, cpio, tar, squash4, minix, minix2, minix3, ROMFS, ReiserFS, XFS, EROFS, ext2, ext3, ext4, FAT (short names), F2FS, RockRidge part of ISO9660, nilfs2, UFS1, UFS2 and ZFS are assumed to be UTF-8. This might be false on systems configured with legacy charset but as long as the charset used is superset of ASCII you should be able to access ASCII-named files. And it's recommended to configure your system to use UTF-8 to access the filesystem, convmv may help with migration. ISO9660 (plain) filenames are specified as being ASCII or being described with unspecified escape sequences. GRUB assumes that the ISO9660 names are UTF-8 (since any ASCII is valid UTF-8). There are some old CD-ROMs which use CP437 in non-compliant way. You're still able to access files with names containing only ASCII characters on such filesystems though. You're also able to access any file if the filesystem contains valid Joliet (UTF-16) or RockRidge (UTF-8). AFFS, SFS and HFS never use unicode and GRUB assumes them to be in Latin1, Latin1 and MacRoman respectively. GRUB handles filesystem case-insensitivity however no attempt is performed at case conversion of international characters so e.g. a file named lowercase greek alpha is treated as different from the one named as uppercase alpha. The filesystems in questions are NTFS (except POSIX namespace), HFS+ (configurable at mkfs time, default insensitive), SFS (configurable at mkfs time, default insensitive), JFS (configurable at mkfs time, default sensitive), HFS, AFFS, FAT, exFAT and ZFS (configurable on per-subvolume basis by property "casesensitivity", default sensitive). On ZFS subvolumes marked as case insensitive files containing lowercase international characters are inaccessible. Also like all supported filesystems except HFS+ and ZFS (configurable on per-subvolume basis by property "normalization", default none) GRUB makes no attempt at check of canonical equivalence so a file name u-diaresis is treated as distinct from u+combining diaresis. This however means that in order to access file on HFS+ its name must be specified in normalisation form D. On normalized ZFS subvolumes filenames out of normalisation are inaccessible. 18.3 Output terminal ==================== Firmware output console "console" on ARC and IEEE1275 are limited to ASCII. BIOS firmware console and VGA text are limited to ASCII and some pseudographics. None of above mentioned is appropriate for displaying international and any unsupported character is replaced with question mark except pseudographics which we attempt to approximate with ASCII. EFI console on the other hand nominally supports UTF-16 but actual language coverage depends on firmware and may be very limited. The encoding used on serial can be chosen with 'terminfo' as either ASCII, UTF-8 or "visual UTF-8". Last one is against the specification but results in correct rendering of right-to-left on some readers which don't have own bidi implementation. On emu GRUB checks if charset is UTF-8 and uses it if so and uses ASCII otherwise. When using gfxterm or gfxmenu GRUB itself is responsible for rendering the text. In this case GRUB is limited by loaded fonts. If fonts contain all required characters then bidirectional text, cursive variants and combining marks other than enclosing, half (e.g. left half tilde or combining overline) and double ones. Ligatures aren't supported though. This should cover European, Middle Eastern (if you don't mind lack of lam-alif ligature in Arabic) and East Asian scripts. Notable unsupported scripts are Brahmic family and derived as well as Mongolian, Tifinagh, Korean Jamo (precomposed characters have no problem) and tonal writing (2e5-2e9). GRUB also ignores deprecated (as specified in Unicode) characters (e.g. tags). GRUB also doesn't handle so called "annotation characters" If you can complete either of two lists or, better, propose a patch to improve rendering, please contact developer team. 18.4 Input terminal =================== Firmware console on BIOS, IEEE1275 and ARC doesn't allow you to enter non-ASCII characters. EFI specification allows for such but author is unaware of any actual implementations. Serial input is currently limited for latin1 (unlikely to change). Own keyboard implementations (at_keyboard and usb_keyboard) supports any key but work on one-char-per-keystroke. So no dead keys or advanced input method. Also there is no keymap change hotkey. In practice it makes difficult to enter any text using non-Latin alphabet. Moreover all current input consumers are limited to ASCII. 18.5 Gettext ============ GRUB supports being translated. For this you need to have language *.mo files in $prefix/locale, load gettext module and set "lang" variable. 18.6 Regexp =========== Regexps work on unicode characters, however no attempt at checking canonical equivalence has been made. Moreover the classes like [:alpha:] match only ASCII subset. 18.7 Other ========== Currently GRUB always uses YEAR-MONTH-DAY HOUR:MINUTE:SECOND [WEEKDAY] 24-hour datetime format but weekdays are translated. GRUB always uses the decimal number format with [0-9] as digits and . as descimal separator and no group separator. IEEE1275 aliases are matched case-insensitively except non-ASCII which is matched as binary. Similar behaviour is for matching OSBundleRequired. Since IEEE1275 aliases and OSBundleRequired don't contain any non-ASCII it should never be a problem in practice. Case-sensitive identifiers are matched as raw strings, no canonical equivalence check is performed. Case-insensitive identifiers are matched as RAW but additionally [a-z] is equivalent to [A-Z]. GRUB-defined identifiers use only ASCII and so should user-defined ones. Identifiers containing non-ASCII may work but aren't supported. Only the ASCII space characters (space U+0020, tab U+000b, CR U+000d and LF U+000a) are recognised. Other unicode space characters aren't a valid field separator. 'test' (*note test::) tests <, >, <=, >=, -pgt and -plt compare the strings in the lexicographical order of unicode codepoints, replicating the behaviour of test from coreutils. environment variables and commands are listed in the same order.  File: grub.info, Node: Security, Next: Platform limitations, Prev: Internationalisation, Up: Top 19 Security *********** * Menu: * Authentication and authorisation:: Users and access control * Using digital signatures:: Booting digitally signed code * UEFI secure boot and shim:: Booting digitally signed PE files * Secure Boot Advanced Targeting:: Embedded information for generation number based revocation * Measured Boot:: Measuring boot components * Lockdown:: Lockdown when booting on a secure setup * TPM2 key protector:: Managing disk key with TPM2 key protector  File: grub.info, Node: Authentication and authorisation, Next: Using digital signatures, Up: Security 19.1 Authentication and authorisation in GRUB ============================================= By default, the boot loader interface is accessible to anyone with physical access to the console: anyone can select and edit any menu entry, and anyone can get direct access to a GRUB shell prompt. For most systems, this is reasonable since anyone with direct physical access has a variety of other ways to gain full access, and requiring authentication at the boot loader level would only serve to make it difficult to recover broken systems. However, in some environments, such as kiosks, it may be appropriate to lock down the boot loader to require authentication before performing certain operations. The 'password' (*note password::) and 'password_pbkdf2' (*note password_pbkdf2::) commands can be used to define users, each of which has an associated password. 'password' sets the password in plain text, requiring 'grub.cfg' to be secure; 'password_pbkdf2' sets the password hashed using the Password-Based Key Derivation Function (RFC 2898), requiring the use of 'grub-mkpasswd-pbkdf2' (*note Invoking grub-mkpasswd-pbkdf2::) to generate password hashes. In order to enable authentication support, the 'superusers' environment variable must be set to a list of usernames, separated by any of spaces, commas, semicolons, pipes, or ampersands. Superusers are permitted to use the GRUB command line, edit menu entries, and execute any menu entry. If 'superusers' is set, then use of the command line and editing of menu entries are automatically restricted to superusers. Setting 'superusers' to empty string effectively disables both access to CLI and editing of menu entries. Building a grub image with '--disable-cli' option will also disable access to CLI and editing of menu entries, as well as disabling rescue mode. Note: The environment variable needs to be exported to also affect the section defined by the 'submenu' command (*note submenu::). Other users may be allowed to execute specific menu entries by giving a list of usernames (as above) using the '--users' option to the 'menuentry' command (*note menuentry::). If the '--unrestricted' option is used for a menu entry, then that entry is unrestricted. If the '--users' option is not used for a menu entry, then that only superusers are able to use it. Putting this together, a typical 'grub.cfg' fragment might look like this: set superusers="root" password_pbkdf2 root grub.pbkdf2.sha512.10000.biglongstring password user1 insecure menuentry "May be run by any user" --unrestricted { set root=(hd0,1) linux /vmlinuz } menuentry "Superusers only" --users "" { set root=(hd0,1) linux /vmlinuz single } menuentry "May be run by user1 or a superuser" --users user1 { set root=(hd0,2) chainloader +1 } The 'grub-mkconfig' program does not yet have built-in support for generating configuration files with authentication. You can use '/etc/grub.d/40_custom' to add simple superuser authentication, by adding 'set superusers=' and 'password' or 'password_pbkdf2' commands.  File: grub.info, Node: Using digital signatures, Next: UEFI secure boot and shim, Prev: Authentication and authorisation, Up: Security 19.2 Using digital signatures in GRUB ===================================== GRUB's 'core.img' can optionally provide enforcement that all files subsequently read from disk are covered by a valid digital signature. This document does *not* cover how to ensure that your platform's firmware (e.g., Coreboot) validates 'core.img'. If environment variable 'check_signatures' (*note check_signatures::) is set to 'enforce', then every attempt by the GRUB 'core.img' to load another file 'foo' implicitly invokes 'verify_detached foo foo.sig' (*note verify_detached::). 'foo.sig' must contain a valid digital signature over the contents of 'foo', which can be verified with a public key currently trusted by GRUB (*note list_trusted::, *note trust::, and *note distrust::). If validation fails, then file 'foo' cannot be opened. This failure may halt or otherwise impact the boot process. An initial trusted public key can be embedded within the GRUB 'core.img' using the '--pubkey' option to 'grub-install' (*note Invoking grub-install::). GRUB uses GPG-style detached signatures (meaning that a file 'foo.sig' will be produced when file 'foo' is signed), and currently supports the DSA and RSA signing algorithms. A signing key can be generated as follows: gpg --gen-key An individual file can be signed as follows: gpg --detach-sign /path/to/file For successful validation of all of GRUB's subcomponents and the loaded OS kernel, they must all be signed. One way to accomplish this is the following (after having already produced the desired 'grub.cfg' file, e.g., by running 'grub-mkconfig' (*note Invoking grub-mkconfig::): # Edit /dev/shm/passphrase.txt to contain your signing key's passphrase for i in `find /boot -name "*.cfg" -or -name "*.lst" -or \ -name "*.mod" -or -name "vmlinuz*" -or -name "initrd*" -or \ -name "grubenv"`; do gpg --batch --detach-sign --passphrase-fd 0 $i < \ /dev/shm/passphrase.txt done shred /dev/shm/passphrase.txt See also: *note check_signatures::, *note verify_detached::, *note trust::, *note list_trusted::, *note distrust::, *note load_env::, *note save_env::. Note that internally signature enforcement is controlled by setting the environment variable 'check_signatures' equal to 'enforce'. Passing one or more '--pubkey' options to 'grub-mkimage' implicitly defines 'check_signatures' equal to 'enforce' in 'core.img' prior to processing any configuration files. Note that signature checking does *not* prevent an attacker with (serial, physical, ...) console access from dropping manually to the GRUB console and executing: set check_signatures=no To prevent this, password-protection (*note Authentication and authorisation::) is essential. Note that even with GRUB password protection, GRUB itself cannot prevent someone with physical access to the machine from altering that machine's firmware (e.g., Coreboot or BIOS) configuration to cause the machine to boot from a different (attacker-controlled) device. GRUB is at best only one link in a secure boot chain.  File: grub.info, Node: UEFI secure boot and shim, Next: Secure Boot Advanced Targeting, Prev: Using digital signatures, Up: Security 19.3 UEFI secure boot and shim support ====================================== The GRUB works with UEFI secure boot and the shim. This functionality is provided by the shim_lock verifier. It is built into the 'core.img' and is registered if the UEFI secure boot is enabled. The 'shim_lock' variable is set to 'y' when shim_lock verifier is registered. If it is desired to use UEFI secure boot without shim, one can disable shim_lock by disabling shim verification with MokSbState UEFI variable or by building grub image with '--disable-shim-lock' option. All GRUB modules not stored in the 'core.img', OS kernels, ACPI tables, Device Trees, etc. have to be signed, e.g, using PGP. Additionally, the commands that can be used to subvert the UEFI secure boot mechanism, such as 'iorw' and 'memrw' will not be available when the UEFI secure boot is enabled. This is done for security reasons and are enforced by the GRUB Lockdown mechanism (*note Lockdown::).  File: grub.info, Node: Secure Boot Advanced Targeting, Next: Measured Boot, Prev: UEFI secure boot and shim, Up: Security 19.4 Embedded information for generation number based revocation ================================================================ The Secure Boot Advanced Targeting (SBAT) is a mechanism to allow the revocation of components in the boot path by using generation numbers embedded into the EFI binaries. The SBAT metadata is located in an .sbat data section that has set of UTF-8 strings as comma-separated values (CSV). See for more details. To add a data section containing the SBAT information into the binary, the '--sbat' option of 'grub-mkimage' command should be used. The content of a CSV file, encoded with UTF-8, is copied as is to the .sbat data section into the generated EFI binary. The CSV file can be stored anywhere on the file system. grub-mkimage -O x86_64-efi -o grubx64.efi -p '(tftp)/grub' --sbat sbat.csv efinet tftp  File: grub.info, Node: Measured Boot, Next: Lockdown, Prev: Secure Boot Advanced Targeting, Up: Security 19.5 Measuring boot components ============================== If the tpm module is loaded and the platform has a Trusted Platform Module installed, GRUB will log each command executed and each file loaded into the TPM event log and extend the PCR values in the TPM correspondingly. All events will be logged into the PCR described below with a type of EV_IPL and an event description as described below. Event type PCR Description --------------------------------------------------------------------------- Command 8 All executed commands (including those from configuration files) will be logged and measured as entered with a prefix of "grub_cmd: " Kernel command line 8 Any command line passed to a kernel will be logged and measured as entered with a prefix of "kernel_cmdline: " Module command line 8 Any command line passed to a kernel module will be logged and measured as entered with a prefix of "module_cmdline: " Files 9 Any file read by GRUB will be logged and measured with a descriptive text corresponding to the filename. GRUB will not measure its own 'core.img' - it is expected that firmware will carry this out. GRUB will also not perform any measurements until the tpm module is loaded. As such it is recommended that the tpm module be built into 'core.img' in order to avoid a potential gap in measurement between 'core.img' being loaded and the tpm module being loaded. Measured boot is currently only supported on EFI and IBM IEEE1275 PowerPC platforms.  File: grub.info, Node: Lockdown, Next: TPM2 key protector, Prev: Measured Boot, Up: Security 19.6 Lockdown when booting on a secure setup ============================================ The GRUB can be locked down when booted on a secure boot environment, for example if the UEFI secure boot is enabled. On a locked down configuration, the GRUB will be restricted and some operations/commands cannot be executed. This also includes limiting which filesystems are supported to those thought to be more robust and widely used within GRUB. The filesystems currently allowed in lockdown mode include: * BtrFS * cpio * exFAT * Enhanced Read-Only File System (EROFS) * Linux ext2/ext3/ext4 * F2FS * DOS FAT12/FAT16/FAT32 * HFS+ * ISO9660 * Squash4 * tar * XFS * ZFS The filesystems currently not allowed in lockdown mode include: * Amiga Fast FileSystem (AFFS) * AtheOS File System (AFS) * Bee File System (BFS) * Coreboot File System (CBFS) * Hierarchical File System (HFS) * Journaled File System (JFS) * Minix filesystem * New Implementation of Log filesystem (nilfs2) * Windows New Technology File System (NTFS) * ReiserFS * Read-Only Memory File System (ROMFS) * Amiga Smart File System (SFS) * Universal Disk Format (UDF) * Unix File System (UFS) The 'lockdown' variable is set to 'y' when the GRUB is locked down. Otherwise it does not exist.  File: grub.info, Node: TPM2 key protector, Prev: Lockdown, Up: Security 19.7 TPM2 key protector in GRUB =============================== TPM2 key protector extends measured boot to unlock the encrypted partition without user intervention. It uses the TPM Storage Root Key (SRK) to seal the disk key with a given set of PCR values. If the system state matches, i.e. PCR values match the sealed PCR set, TPM2 key protector unseals the disk key for 'cryptomount' (*note cryptomount::) to unlock the encrypted partition. In case the unsealed key fails to unlock the partition, 'cryptomount' falls back to the passphrase prompt. Please note that TPM2 key protector uses the SRK in the owner hierarchy _without_ authorization. If the owner hierarchy is password-protected, TPM2 key protector may fail to unseal the key due to the absence of the password. For the systems that already enable the password protection for the owner hierarchy, the following command removes the password protection with the existing password. # tpm2_changeauth -c owner -p password There are two supported modes to store the sealed key, SRK and NV index. The details will be addressed in later sections. TPM2 key protector is currently only supported on EFI and EMU platforms. 19.7.1 TPM PCR usage -------------------- Since TPM2 key protector relies on PCRs to check the system state, it is important to decide which PCRs to seal the key with. The following table lists uses of PCRs and the measured objects on EFI platforms. PCR Used by Measured Objects -------------------------------------------------------------------------- 0 Firmware Core system firmware executable code 1 Firmware Core system firmware data/host platform configuration; typically contains serial and model numbers 2 Firmware Extended or pluggable executable code; includes option ROMs on pluggable hardware 3 Firmware Extended or pluggable firmware data; includes information about pluggable hardware 4 Firmware Boot loader and additional drivers; binaries and extensions loaded by the boot loader 5 Firmware GPT/Partition table 7 Firmware SecureBoot state 8 GRUB Commands and kernel command line 9 GRUB All files read (including kernel image) 9 Linux Kernel All passed initrds (when the new LOAD_FILE2 initrd protocol is used) 10 Linux Kernel Protection of the IMA measurement log 14 shim “MOK” certificates and hashes PCR 0, 2, 4, and 7 can be used to check the integrity of the firmware code and bootloaders. PCR 8 and 9 are useful to check the file and data processed by GRUB. PCRs 10, 11, 12, 13, and 15 are controlled by the operating system, so those PCRs are usually still in the initial state when GRUB is running. In general, it is nice to include PCR 0, 2, 4, and 7 to ensure the integrity of the firmware and bootloaders. For PCR 8 and 9, a sophisticated tool is required to examine the GRUB configuration files and the files to be loaded to calculate the correct PCR values. Please note that PCRs are sensitive to any change, so an update of a component could invalidate the sealed key, due to the so-called PCR brittleness. For the bootloader update, PCR 4 may be affected. This can be mitigated by extracting the events from the TPM event log and predict the value with the updated bootloader binary. On the other hand, it is difficult to predict PCR 0~7 after a firmware update since the content of the code and the order of drivers may not follow the TPM event log from the previous firmware version, so it is necessary to reboot the system to update the measurement results of PCR 0~7 and seal or sign the sealed key again. Reference: Linux TPM PCR Registry (https://uapi-group.org/specifications/specs/linux_tpm_pcr_registry/) 19.7.2 Setting up the extra disk key ------------------------------------ Instead of using the existing password, it is recommended to seal a new random disk key and use the existing password for recovery. Here are the sample commands to create a 128 random bytes key file and enroll the key into the target partition (sda2). # dd if=/dev/urandom of=luks.key bs=1 count=128 # cryptsetup luksAddKey /dev/sda2 luks.key --pbkdf=pbkdf2 --hash=sha512 19.7.3 SRK mode --------------- To unlock the partition with SRK mode, assume that the sealed key is in '(hd0,gpt1)/efi/grub/sealed.tpm', the following GRUB commands unseal the disk key with SRK mode and supply it to 'cryptomount'. grub> tpm2_key_protector_init -T (hd0,gpt1)/efi/grub/sealed.tpm grub> cryptomount -u -P tpm2 There are two programs to create the sealed key for SRK mode: 'grub-protect' and 'pcr-oracle' (). The following sample command uses 'grub-protect' to seal the random key, 'luks.key', with PCR 0, 2, 4 and 7 in TPM 2.0 Key File format. # grub-protect --action=add \ --protector=tpm2 \ --tpm2-pcrs=0,2,4,7 \ --tpm2key \ --tpm2-keyfile=luks.key \ --tpm2-outfile=/boot/efi/efi/grub/sealed.tpm 'grub-protect' only seals the key with the current PCR values. Therefore, when a boot component, such as shim or GRUB, is updated, it is necessary to reboot the system to update the measurement results and seal the key again. That means the random disk key has to be stored in cleartext for the next key sealing. Besides this, the measurement result of some PCRs may differ between boot time and OS runtime. For example, PCR 9 measures the files loaded by GRUB including the Linux kernel and initrd. To unlock the disk containing the kernel and initrd, the key has to be sealed with PCR 9 value before loading the kernel and initrd. However, PCR 9 changes after GRUB loading the kernel and initrd, so PCR 9 at OS runtime cannot be used directly for key sealing. To solve these problems, 'pcr-oracle' takes a different approach. It reads the TPM eventlog and predicts the PCR values. Besides, 'pcr-oracle' also supports "authorized policy" which allows the PCR policy to be updated with a valid signature, so that the user only seals the random disk key once. If at some later time the PCR values change due to an update of the system firmware, bootloader, or config file, the user just needs to update the signature of the PCR policy. To seal the key with the authorized policy, the first thing is to generate the RSA policy key, 'policy-key.pem', and the authorized policy file, 'authorized.policy'. In this example, PCR 0, 2, 4, 7 and 9 are chosen for key sealing. # pcr-oracle --rsa-generate-key \ --private-key policy-key.pem \ --auth authorized.policy \ create-authorized-policy 0,2,4,7,9 Then, we seal the random disk key, 'luks.key', with the authorized policy file and save the sealed key in 'sealed.key'. # pcr-oracle --key-format tpm2.0 \ --auth authorized.policy \ --input luks.key \ --output sealed.key \ seal-secret Since we now have the sealed key, we can remove the random disk key file 'luks.key'. The last step is to sign the predicted PCR policy and save the final key file, 'sealed.tpm'. # pcr-oracle --key-format tpm2.0 \ --private-key policy-key.pem \ --from eventlog \ --stop-event "grub-file=grub.cfg" \ --after \ --input sealed.key \ --output /boot/efi/efi/grub/sealed.tpm \ sign 0,2,4,7,9 Here we also set a stop event for the prediction. With '--stop-event grub-file=grub.cfg --after', 'pcr-oracle' stops the calculation of PCR values right after GRUB loads 'grub.cfg'. When/After the shim or GRUB are updated, it only requires to run the last 'pcr-oracle' command to update the predicted PCR policy. 19.7.4 NV index mode -------------------- Instead of storing the sealed key in a file, NV index mode uses the TPM non-volatile memory to store the sealed key and could be useful when accessing the file is not possible. However, the Linux root user must be careful who she/he gives access to the TPM (tss group) since those users will also be able to modify the NV index that's holding the key. There are two types of TPM handles supported by NV index mode: persistent handle and NV index handle. 19.7.4.1 Persistent handle .......................... The range of persistent handles is from '0x81000000' to '0x81FFFFFF'. The persistent handle is designed to make TPM objects persistent through power cycles, and only TPM objects, such as RSA or EC keys, are accepted. Thus, only the raw format is supported by persistent handles. The following shows the 'grub-protect' command to seal the disk key 'luks.key' into the persistent handle '0x81000000' with the PCRs '0,2,4,7'. # grub-protect \ --protector=tpm2 \ --action=add \ --tpm2-bank=sha256 \ --tpm2-pcrs=0,2,4,7 \ --tpm2-keyfile=luks.key \ --tpm2-nvindex=0x81000000 To unseal the key, we have to specify the mode 'nv', the persistent handle '0x81000000', and the PCRs '0,2,4,7' for the 'tpm2_key_protector_init' command. grub> tpm2_key_protector_init --mode=nv --nvindex=0x81000000 --pcrs=0,2,4,7 grub> cryptomount -u --protector tpm2 If the key in the persistent handle becomes unwanted, the following 'grub-protect' command removes the specified persistent handle '0x81000000'. # grub-protect \ --protector=tpm2 \ --action=remove \ --tpm2-evict \ --tpm2-nvindex=0x81000000 19.7.4.2 NV index handle ........................ The range of NV index handles is from '0x1000000' to '0x1FFFFFF'. Unlike the persistent handle, the NV index handle allows user-defined data, so it can easily support both the TPM 2.0 Key File format as well as the raw format. The following 'grub-protect' command seals the disk key 'luks.key' into the NV index handle '0x1000000' with the PCRs '0,2,4,7' while using the TPM 2.0 Key File format. # grub-protect \ --protector=tpm2 \ --action=add \ --tpm2key \ --tpm2-bank=sha256 \ --tpm2-pcrs=0,2,4,7 \ --tpm2-keyfile=luks.key \ --tpm2-nvindex=0x1000000 Furthermore, it is also possible to insert an existing key file, 'sealed.tpm', into a specific NV index handle using the following tpm2-tools () commands. # tpm2_nvdefine -C o \ -a "ownerread|ownerwrite" \ -s $(stat -c %s sealed.tpm) \ 0x1000000 # tpm2_nvwrite -C o -i sealed.tpm 0x1000000 When unsealing the key in TPM 2.0 Key File format, only the mode 'nv' and the NV index handle '0x1000000' have to be specified for the 'tpm2_key_protector_init' command. grub> tpm2_key_protector_init --mode=nv --nvindex=0x1000000 grub> cryptomount -u --protector tpm2 The following 'grub-protect' command allows to remove the specified NV index handle '0x1000000'. # grub-protect \ --protector=tpm2 \ --action=remove \ --tpm2-evict \ --tpm2-nvindex=0x1000000 19.7.5 Setting up software TPM for EMU platform ----------------------------------------------- In order to test TPM2 key protector and TPM2 Software Stack (TSS2), it is useful to set up a software TPM (swtpm) instance and run the commands on the EMU platform. Here are the commands to start a swtpm instance which provides a character device interface. To store the TPM states, the directory, 'swtpm-state', is created before the 'swtpm' command. All the messages are stored in 'swtpm.log' including the name of the character device. # mkdir swtpm-state # swtpm chardev --vtpm-proxy --tpmstate dir=swtpm-state \ --tpm2 --ctrl type=unixio,path="swtpm-state/ctrl" \ --flags startup-clear --daemon > swtpm.log Then, we extract the name of the character device from 'swtpm.log' and save it to the variable, 'tpm2dev'. # tpm2dev=$(grep "New TPM device" swtpm.log | cut -d' ' -f 4) Now we can start 'grub-emu' with '--tpm-device $tpm2dev' to interact with the swtpm instance. # grub-emu --tpm-device $tpm2dev On the host, the tpm2-tools commands can interact with the swtpm instance by setting 'TPM2TOOLS_TCTI'. # export TPM2TOOLS_TCTI="device:$tpm2dev" When the test is done, use 'swtpm_ioctl' to send the shutdown command through the swtpm control channel. # swtpm_ioctl -s --unix swtpm-state/ctrl 19.7.6 Command line and menuentry editor protection --------------------------------------------------- The TPM key protector provides full disk encryption support on servers or virtual machine images, meanwhile keeping the boot process unattended. This prevents service disruptions by eliminating the need for manual password input during startup, improving system uptime and continuity. It is achieved by TPM, which verifies the integrity of boot components by checking cryptographic hashes against securely stored values, to confirm the disks are unlocked in a trusted state. However, for users to access the system interactively, some form of authentication is still required, as the disks are not unlocked by an authorized user. This raised concerns about using an unprotected 'command-line interface' (*note Command-line interface::), as anyone could execute commands to access decrypted data. To address this issue, the LUKS password is used to ensure that only authorized users are granted access to the interface. Additionally, the 'menu entry editor' (*note Menu entry editor::) is also safeguarded by the LUKS password, as modifying a boot entry is effectively the same as altering the 'grub.cfg' file read from encrypted files. It is worth mentioning that the built-in password support, as described in 'Authentication and Authorization in GRUB' (*note Authentication and authorisation::), can also be used to protect the command-line interface from unauthorized access. However, it is not recommended to rely on this approach as it is an optional step. Setting it up requires additional manual intervention, which increases the risk of password leakage during the process. Moreover, the superuser list must be well maintained, and the password used cannot be synchronized with LUKS key rotation.  File: grub.info, Node: Platform limitations, Next: Platform-specific operations, Prev: Security, Up: Top 20 Platform limitations *********************** GRUB2 is designed to be portable and is actually ported across platforms. We try to keep all platforms at the level. Unfortunately some platforms are better supported than others. This is detailed in current and 2 following sections. All platforms have an artificially GRUB imposed disk size restriction of 1 EiB. In some cases, larger disk sizes can be used, but access will not be allowed beyond 1 EiB. LUKS2 devices with size larger than 16 EiB are currently not supported. They can not be created as crypto devices by cryptomount, so can not even be partially read from. LUKS have no limitations other than those imposed by the format. ARC platform is unable to change datetime (firmware doesn't seem to provide a function for it). EMU has similar limitation. On EMU platform no serial port is available. Console charset refers only to firmware-assisted console. gfxterm is always Unicode (see Internationalisation section for its limitations). Serial is configurable to UTF-8 or ASCII (see Internationalisation). In case of qemu and coreboot ports the referred console is vga_text. Loongson always uses gfxterm. Most limited one is ASCII. CP437 provides additionally pseudographics. GRUB2 doesn't use any language characters from CP437 as often CP437 is replaced by national encoding compatible only in pseudographics. Unicode is the most versatile charset which supports many languages. However the actual console may be much more limited depending on firmware On BIOS, network is supported only if the image is loaded through network. On sparc64, GRUB is unable to determine which server it was booted from. Direct ATA/AHCI support allows to circumvent various firmware limitations but isn't needed for normal operation except on baremetal ports. AT keyboard support allows keyboard layout remapping and support for keys not available through firmware. It isn't needed for normal operation except baremetal ports. Speaker allows morse and spkmodem communication. USB support provides benefits similar to ATA (for USB disks) or AT (for USB keyboards). In addition it allows USBserial. Chainloading refers to the ability to load another bootloader through the same protocol and on some platforms, like EFI, allow that bootloader to return to the GRUB. Hints allow faster disk discovery by already knowing in advance which is the disk in question. On some platforms hints are correct unless you move the disk between boots. On other platforms it's just an educated guess. Note that hint failure results in just reduced performance, not a failure BadRAM is the ability to mark some of the RAM as "bad". Note: due to protocol limitations mips-loongson (with Linux protocol) and mips-qemu_mips can use only memory up to first hole. Bootlocation is ability of GRUB to automatically detect where it boots from. "disk" means the detection is limited to detecting the disk with partition being discovered on install time. "partition" means that disk and partiton can be automatically discovered. "file" means that boot image file name as well as disk and partition can be discovered. For consistency, default install ignores partition and relies solely on disk detection. If no bootlocation discovery is available or boot and grub-root disks are different, UUID is used instead. On ARC if no device to install to is specified, UUID is used instead as well. BIOS Coreboot Multiboot Qemu video yes yes yes yes console CP437 CP437 CP437 CP437 charset network yes (*) no no no ATA/AHCI yes yes yes yes AT keyboard yes yes yes yes Speaker yes yes yes yes USB yes yes yes yes chainloader local yes yes no cpuid partial partial partial partial rdmsr partial partial partial partial wrmsr partial partial partial partial hints guess guess guess guess PCI yes yes yes yes badram yes yes yes yes compression always pointless no no exit yes no no no bootlocation disk no no no ia32 EFI amd64 EFI ia32 Itanium IEEE1275 video yes yes no no console Unicode Unicode ASCII Unicode charset network yes yes yes yes ATA/AHCI yes yes yes no AT keyboard yes yes yes no Speaker yes yes yes no USB yes yes yes no chainloader local local no local cpuid partial partial partial no rdmsr partial partial partial no wrmsr partial partial partial no hints guess guess good guess PCI yes yes yes no badram yes yes no yes compression no no no no exit yes yes yes yes bootlocation file file file, file ignored Loongson sparc64 Powerpc ARC video yes no yes no console N/A ASCII ASCII ASCII charset network no yes (*) yes no ATA/AHCI yes no no no AT keyboard yes no no no Speaker no no no no USB yes no no no chainloader yes no no no cpuid no no no no rdmsr no no no no wrmsr no no no no hints good good good no PCI yes no no no badram yes (*) no no no compression configurable no no configurable exit no yes yes yes bootlocation no partition file file (*) MIPS qemu emu xen video no yes no console CP437 Unicode (*) ASCII charset network no yes no ATA/AHCI yes no no AT keyboard yes no no Speaker no no no USB N/A yes no chainloader yes no yes cpuid no no yes rdmsr no no yes wrmsr no no yes hints guess no no PCI no no no badram yes (*) no no compression configurable no no exit no yes no bootlocation no file no  File: grub.info, Node: Platform-specific operations, Next: Supported kernels, Prev: Platform limitations, Up: Top 21 Outline ********** Some platforms have features which allows to implement some commands useless or not implementable on others. Quick summary: Information retrieval: * mipsel-loongson: lsspd * mips-arc: lsdev * efi: lsefisystab, lssal, lsefimmap, lsefi * i386-pc: lsapm * i386-coreboot: lscoreboot, coreboot_boottime, cbmemc * acpi-enabled (i386-pc, i386-coreboot, i386-multiboot, *-efi): lsacpi Workarounds for platform-specific issues: * i386-efi/x86_64-efi: loadbios, fakebios, fix_video * acpi-enabled (i386-pc, i386-coreboot, i386-multiboot, *-efi): acpi (override ACPI tables) * i386-pc: drivemap * i386-pc: sendkey Advanced operations for power users: * x86: iorw (direct access to I/O ports) Miscellaneous: * cmos (x86-*, ieee1275, mips-qemu_mips, mips-loongson): cmostest (used on some laptops to check for special power-on key), cmosclean * i386-pc: play  File: grub.info, Node: Supported kernels, Next: Troubleshooting, Prev: Platform-specific operations, Up: Top 22 Supported boot targets ************************* X86 support is summarised in the following table. "Yes" means that the kernel works on the given platform, "crashes" means an early kernel crash which we hope will be fixed by concerned kernel developers. "no" means GRUB doesn't load the given kernel on a given platform. "headless" means that the kernel works but lacks console drivers (you can still use serial or network console). In case of "no" and "crashes" the reason is given in footnote. BIOS Coreboot BIOS chainloading yes no (1) NTLDR yes no (1) Plan9 yes no (1) Freedos yes no (1) FreeBSD bootloader yes crashes (1) 32-bit kFreeBSD yes crashes (5) 64-bit kFreeBSD yes crashes (5) 32-bit kNetBSD yes crashes (1) 64-bit kNetBSD yes crashes 32-bit kOpenBSD yes yes 64-bit kOpenBSD yes yes Multiboot yes yes Multiboot2 yes yes 32-bit Linux (legacy protocol) yes no (1) 64-bit Linux (legacy protocol) yes no (1) 32-bit Linux (modern protocol) yes yes 64-bit Linux (modern protocol) yes yes 32-bit XNU yes ? 64-bit XNU yes ? 32-bit EFI chainloader no (2) no (2) 64-bit EFI chainloader no (2) no (2) Appleloader no (2) no (2) Multiboot Qemu BIOS chainloading no (1) no (1) NTLDR no (1) no (1) Plan9 no (1) no (1) FreeDOS no (1) no (1) FreeBSD bootloader crashes (1) crashes (1) 32-bit kFreeBSD crashes (5) crashes (5) 64-bit kFreeBSD crashes (5) crashes (5) 32-bit kNetBSD crashes (1) crashes (1) 64-bit kNetBSD yes yes 32-bit kOpenBSD yes yes 64-bit kOpenBSD yes yes Multiboot yes yes Multiboot2 yes yes 32-bit Linux (legacy protocol) no (1) no (1) 64-bit Linux (legacy protocol) no (1) no (1) 32-bit Linux (modern protocol) yes yes 64-bit Linux (modern protocol) yes yes 32-bit XNU ? ? 64-bit XNU ? ? 32-bit EFI chainloader no (2) no (2) 64-bit EFI chainloader no (2) no (2) Appleloader no (2) no (2) ia32 EFI amd64 EFI BIOS chainloading no (1) no (1) NTLDR no (1) no (1) Plan9 no (1) no (1) FreeDOS no (1) no (1) FreeBSD bootloader crashes (1) crashes (1) 32-bit kFreeBSD headless headless 64-bit kFreeBSD headless headless 32-bit kNetBSD crashes (1) crashes (1) 64-bit kNetBSD yes yes 32-bit kOpenBSD headless headless 64-bit kOpenBSD headless headless Multiboot yes yes Multiboot2 yes yes 32-bit Linux (legacy protocol) no (1) no (1) 64-bit Linux (legacy protocol) no (1) no (1) 32-bit Linux (modern protocol) yes yes 64-bit Linux (modern protocol) yes yes 32-bit XNU yes yes 64-bit XNU yes (4) yes 32-bit EFI chainloader yes no (3) 64-bit EFI chainloader no (3) yes Appleloader yes yes ia32 IEEE1275 BIOS chainloading no (1) NTLDR no (1) Plan9 no (1) FreeDOS no (1) FreeBSD bootloader crashes (1) 32-bit kFreeBSD crashes (5) 64-bit kFreeBSD crashes (5) 32-bit kNetBSD crashes (1) 64-bit kNetBSD ? 32-bit kOpenBSD ? 64-bit kOpenBSD ? Multiboot ? Multiboot2 ? 32-bit Linux (legacy protocol) no (1) 64-bit Linux (legacy protocol) no (1) 32-bit Linux (modern protocol) ? 64-bit Linux (modern protocol) ? 32-bit XNU ? 64-bit XNU ? 32-bit EFI chainloader no (2) 64-bit EFI chainloader no (2) Appleloader no (2) 1. Requires BIOS 2. EFI only 3. 32-bit and 64-bit EFI have different structures and work in different CPU modes so it's not possible to chainload 32-bit bootloader on 64-bit platform and vice-versa 4. Some modules may need to be disabled 5. Requires ACPI PowerPC, IA64 and Sparc64 ports support only Linux. MIPS port supports Linux and multiboot2. 22.1 Boot tests =============== As you have seen in previous chapter the support matrix is pretty big and some of the configurations are only rarely used. To ensure the quality bootchecks are available for all x86 targets except EFI chainloader, Appleloader and XNU. All x86 platforms have bootcheck facility except ieee1275. Multiboot, multiboot2, BIOS chainloader, ntldr and freebsd-bootloader boot targets are tested only with a fake kernel images. Only Linux is tested among the payloads using Linux protocols. Following variables must be defined: GRUB_PAYLOADS_DIR directory containing the required kernels GRUB_CBFSTOOL cbfstool from Coreboot package (for coreboot platform only) GRUB_COREBOOT_ROM empty Coreboot ROM GRUB_QEMU_OPTS additional options to be supplied to QEMU Required files are: kfreebsd_env.i386 32-bit kFreeBSD device hints kfreebsd.i386 32-bit FreeBSD kernel image kfreebsd.x86_64, same from 64-bit kFreeBSD kfreebsd_env.x86_64 knetbsd.i386 32-bit NetBSD kernel image knetbsd.miniroot.i386 32-bit kNetBSD miniroot.kmod. knetbsd.x86_64, same from 64-bit kNetBSD knetbsd.miniroot.x86_64 kopenbsd.i386 32-bit OpenBSD kernel bsd.rd image kopenbsd.x86_64 same from 64-bit kOpenBSD linux.i386 32-bit Linux linux.x86_64 64-bit Linux  File: grub.info, Node: Troubleshooting, Next: User-space utilities, Prev: Supported kernels, Up: Top 23 Error messages produced by GRUB ********************************** * Menu: * GRUB only offers a rescue shell:: * Firmware stalls instead of booting GRUB::  File: grub.info, Node: GRUB only offers a rescue shell, Next: Firmware stalls instead of booting GRUB, Up: Troubleshooting 23.1 GRUB only offers a rescue shell ==================================== GRUB's normal start-up procedure involves setting the 'prefix' environment variable to a value set in the core image by 'grub-install', setting the 'root' variable to match, loading the 'normal' module from the prefix, and running the 'normal' command (*note normal::). This command is responsible for reading '/boot/grub/grub.cfg', running the menu, and doing all the useful things GRUB is supposed to do. If, instead, you only get a rescue shell, this usually means that GRUB failed to load the 'normal' module for some reason. It may be possible to work around this temporarily: for instance, if the reason for the failure is that 'prefix' is wrong (perhaps it refers to the wrong device, or perhaps the path to '/boot/grub' was not correctly made relative to the device), then you can correct this and enter normal mode manually: # Inspect the current prefix (and other preset variables): set # Find out which devices are available: ls # Set to the correct value, which might be something like this: set prefix=(hd0,1)/grub set root=(hd0,1) insmod normal normal However, any problem that leaves you in the rescue shell probably means that GRUB was not correctly installed. It may be more useful to try to reinstall it properly using 'grub-install DEVICE' (*note Invoking grub-install::). When doing this, there are a few things to remember: * Drive ordering in your operating system may not be the same as the boot drive ordering used by your firmware. Do not assume that your first hard drive (e.g. '/dev/sda') is the one that your firmware will boot from. 'device.map' (*note Device map::) can be used to override this, but it is usually better to use UUIDs or file system labels and avoid depending on drive ordering entirely. * At least on BIOS systems, if you tell 'grub-install' to install GRUB to a partition but GRUB has already been installed in the master boot record, then the GRUB installation in the partition will be ignored. * If possible, it is generally best to avoid installing GRUB to a partition (unless it is a special partition for the use of GRUB alone, such as the BIOS Boot Partition used on GPT). Doing this means that GRUB may stop being able to read its core image due to a file system moving blocks around, such as while defragmenting, running checks, or even during normal operation. Installing to the whole disk device is normally more robust. * Check that GRUB actually knows how to read from the device and file system containing '/boot/grub'. It will not be able to read from encrypted devices with unsupported encryption scheme, nor from file systems for which support has not yet been added to GRUB.  File: grub.info, Node: Firmware stalls instead of booting GRUB, Prev: GRUB only offers a rescue shell, Up: Troubleshooting 23.2 Firmware stalls instead of booting GRUB ============================================ The EFI implementation of some older MacBook laptops stalls when it gets presented a grub-mkrescue ISO image for x86_64-efi target on an USB stick. Affected are models of year 2010 or earlier. Workaround is to zeroize the bytes 446 to 461 of the EFI partition, where mformat has put a partition table entry which claims partition start at block 0. This change will not hamper bootability on other machines.  File: grub.info, Node: User-space utilities, Next: Obtaining and Building GRUB, Prev: Troubleshooting, Up: Top 24 User-space utilities *********************** * Menu: * Invoking grub-install:: How to use the GRUB installer * Invoking grub-mkconfig:: Generate a GRUB configuration file * Invoking grub-mkpasswd-pbkdf2:: Generate GRUB password hashes * Invoking grub-mkrelpath:: Make system path relative to its root * Invoking grub-mkrescue:: Make a GRUB rescue image * Invoking grub-mount:: Mount a file system using GRUB * Invoking grub-probe:: Probe device information for GRUB * Invoking grub-protect:: Protect a disk key with a key protector * Invoking grub-script-check:: Check GRUB script file for syntax errors  File: grub.info, Node: Invoking grub-install, Next: Invoking grub-mkconfig, Up: User-space utilities 24.1 Invoking grub-install ========================== The program 'grub-install' generates a GRUB core image using 'grub-mkimage' and installs it on your system. You must specify the device name on which you want to install GRUB, like this: grub-install INSTALL_DEVICE The device name INSTALL_DEVICE is an OS device name or a GRUB device name. 'grub-install' accepts the following options: '--help' Print a summary of the command-line options and exit. '--version' Print the version number of GRUB and exit. '--boot-directory=DIR' Install GRUB images under the directory 'DIR/grub/' This option is useful when you want to install GRUB into a separate partition or a removable disk. If this option is not specified then it defaults to '/boot', so grub-install /dev/sda is equivalent to grub-install --boot-directory=/boot/ /dev/sda Here is an example in which you have a separate "boot" partition which is mounted on '/mnt/boot': grub-install --boot-directory=/mnt/boot /dev/sdb '--recheck' Recheck the device map, even if '/boot/grub/device.map' already exists. You should use this option whenever you add/remove a disk into/from your computer. '--no-rs-codes' By default on x86 BIOS systems, 'grub-install' will use some extra space in the bootloader embedding area for Reed-Solomon error-correcting codes. This enables GRUB to still boot successfully if some blocks are corrupted. The exact amount of protection offered is dependent on available space in the embedding area. R sectors of redundancy can tolerate up to R/2 corrupted sectors. This redundancy may be cumbersome if attempting to cryptographically validate the contents of the bootloader embedding area, or in more modern systems with GPT-style partition tables (*note BIOS installation::) where GRUB does not reside in any unpartitioned space outside of the MBR. Disable the Reed-Solomon codes with this option.  File: grub.info, Node: Invoking grub-mkconfig, Next: Invoking grub-mkpasswd-pbkdf2, Prev: Invoking grub-install, Up: User-space utilities 24.2 Invoking grub-mkconfig =========================== The program 'grub-mkconfig' generates a configuration file for GRUB (*note Simple configuration::). grub-mkconfig -o /boot/grub/grub.cfg 'grub-mkconfig' accepts the following options: '--help' Print a summary of the command-line options and exit. '--version' Print the version number of GRUB and exit. '-o FILE' '--output=FILE' Send the generated configuration file to FILE. The default is to send it to standard output.  File: grub.info, Node: Invoking grub-mkpasswd-pbkdf2, Next: Invoking grub-mkrelpath, Prev: Invoking grub-mkconfig, Up: User-space utilities 24.3 Invoking grub-mkpasswd-pbkdf2 ================================== The program 'grub-mkpasswd-pbkdf2' generates password hashes for GRUB (*note Security::). grub-mkpasswd-pbkdf2 'grub-mkpasswd-pbkdf2' accepts the following options: '-c NUMBER' '--iteration-count=NUMBER' Number of iterations of the underlying pseudo-random function. Defaults to 10000. '-l NUMBER' '--buflen=NUMBER' Length of the generated hash. Defaults to 64. '-s NUMBER' '--salt=NUMBER' Length of the salt. Defaults to 64.  File: grub.info, Node: Invoking grub-mkrelpath, Next: Invoking grub-mkrescue, Prev: Invoking grub-mkpasswd-pbkdf2, Up: User-space utilities 24.4 Invoking grub-mkrelpath ============================ The program 'grub-mkrelpath' makes a file system path relative to the root of its containing file system. For instance, if '/usr' is a mount point, then: $ grub-mkrelpath /usr/share/grub/unicode.pf2 '/share/grub/unicode.pf2' This is mainly used internally by other GRUB utilities such as 'grub-mkconfig' (*note Invoking grub-mkconfig::), but may occasionally also be useful for debugging. 'grub-mkrelpath' accepts the following options: '--help' Print a summary of the command-line options and exit. '--version' Print the version number of GRUB and exit.  File: grub.info, Node: Invoking grub-mkrescue, Next: Invoking grub-mount, Prev: Invoking grub-mkrelpath, Up: User-space utilities 24.5 Invoking grub-mkrescue =========================== The program 'grub-mkrescue' generates a bootable GRUB rescue image (*note Making a GRUB bootable CD-ROM::). grub-mkrescue -o grub.iso All arguments not explicitly listed as 'grub-mkrescue' options are passed on directly to 'xorriso' in 'mkisofs' emulation mode. Options passed to 'xorriso' will normally be interpreted as 'mkisofs' options; if the option '--' is used, then anything after that will be interpreted as native 'xorriso' options. Non-option arguments specify additional source directories. This is commonly used to add extra files to the image: mkdir -p disk/boot/grub (add extra files to 'disk/boot/grub') grub-mkrescue -o grub.iso disk 'grub-mkrescue' accepts the following options: '--help' Print a summary of the command-line options and exit. '--version' Print the version number of GRUB and exit. '-o FILE' '--output=FILE' Save output in FILE. This "option" is required. '--modules=MODULES' Pre-load the named GRUB modules in the image. Multiple entries in MODULES should be separated by whitespace (so you will probably need to quote this for your shell). '--rom-directory=DIR' If generating images for the QEMU or Coreboot platforms, copy the resulting 'qemu.img' or 'coreboot.elf' files respectively to the DIR directory as well as including them in the image. '--xorriso=FILE' Use FILE as the 'xorriso' program, rather than the built-in default. '--grub-mkimage=FILE' Use FILE as the 'grub-mkimage' program, rather than the built-in default.  File: grub.info, Node: Invoking grub-mount, Next: Invoking grub-probe, Prev: Invoking grub-mkrescue, Up: User-space utilities 24.6 Invoking grub-mount ======================== The program 'grub-mount' performs a read-only mount of any file system or file system image that GRUB understands, using GRUB's file system drivers via FUSE. (It is only available if FUSE development files were present when GRUB was built.) This has a number of uses: * It provides a convenient way to check how GRUB will view a file system at boot time. You can use normal command-line tools to compare that view with that of your operating system, making it easy to find bugs. * It offers true read-only mounts. Linux does not have these for journalling file systems, because it will always attempt to replay the journal at mount time; while you can temporarily mark the block device read-only to avoid this, that causes the mount to fail. Since GRUB intentionally contains no code for writing to file systems, it can easily provide a guaranteed read-only mount mechanism. * It allows you to examine any file system that GRUB understands without needing to load additional modules into your running kernel, which may be useful in constrained environments such as installers. * Since it can examine file system images (contained in regular files) just as easily as file systems on block devices, you can use it to inspect any file system image that GRUB understands with only enough privileges to use FUSE, even if nobody has yet written a FUSE module specifically for that file system type. Using 'grub-mount' is normally as simple as: grub-mount /dev/sda1 /mnt 'grub-mount' must be given one or more images and a mount point as non-option arguments (if it is given more than one image, it will treat them as a RAID set), and also accepts the following options: '--help' Print a summary of the command-line options and exit. '--version' Print the version number of GRUB and exit. '-C' '--crypto' Mount encrypted devices, prompting for a passphrase if necessary. '-d STRING' '--debug=STRING' Show debugging output for conditions matching STRING. '-K prompt|FILE' '--zfs-key=prompt|FILE' Load a ZFS encryption key. If you use 'prompt' as the argument, 'grub-mount' will read a passphrase from the terminal; otherwise, it will read key material from the specified file. '-r DEVICE' '--root=DEVICE' Set the GRUB root device to DEVICE. You do not normally need to set this; 'grub-mount' will automatically set the root device to the root of the supplied file system. If DEVICE is just a number, then it will be treated as a partition number within the supplied image. This means that, if you have an image of an entire disk in 'disk.img', then you can use this command to mount its second partition: grub-mount -r 2 disk.img mount-point '-v' '--verbose' Print verbose messages.  File: grub.info, Node: Invoking grub-probe, Next: Invoking grub-protect, Prev: Invoking grub-mount, Up: User-space utilities 24.7 Invoking grub-probe ======================== The program 'grub-probe' probes device information for a given path or device. grub-probe --target=fs /boot/grub grub-probe --target=drive --device /dev/sda1 'grub-probe' must be given a path or device as a non-option argument, and also accepts the following options: '--help' Print a summary of the command-line options and exit. '--version' Print the version number of GRUB and exit. '-d' '--device' If this option is given, then the non-option argument is a system device name (such as '/dev/sda1'), and 'grub-probe' will print information about that device. If it is not given, then the non-option argument is a filesystem path (such as '/boot/grub'), and 'grub-probe' will print information about the device containing that part of the filesystem. '-m FILE' '--device-map=FILE' Use FILE as the device map (*note Device map::) rather than the default, usually '/boot/grub/device.map'. '-t TARGET' '--target=TARGET' Print information about the given path or device as defined by TARGET. The available targets and their meanings are: 'fs' GRUB filesystem module. 'fs_uuid' Filesystem Universally Unique Identifier (UUID). 'fs_label' Filesystem label. 'drive' GRUB device name. 'device' System device name. 'partmap' GRUB partition map module. 'abstraction' GRUB abstraction module (e.g. 'lvm'). 'cryptodisk_uuid' Crypto device UUID. 'msdos_parttype' MBR partition type code (two hexadecimal digits). 'hints_string' A string of platform search hints suitable for passing to the 'search' command (*note search::). 'bios_hints' Search hints for the PC BIOS platform. 'ieee1275_hints' Search hints for the IEEE1275 platform. 'baremetal_hints' Search hints for platforms where disks are addressed directly rather than via firmware. 'efi_hints' Search hints for the EFI platform. 'arc_hints' Search hints for the ARC platform. 'compatibility_hint' A guess at a reasonable GRUB drive name for this device, which may be used as a fallback if the 'search' command fails. 'disk' System device name for the whole disk. '-v' '--verbose' Print verbose messages.  File: grub.info, Node: Invoking grub-protect, Next: Invoking grub-script-check, Prev: Invoking grub-probe, Up: User-space utilities 24.8 Invoking grub-protect ========================== The program 'grub-protect' protects a disk encryption key with a specified key protector. '--help' Print a summary of the command-line options and exit. '--version' Print the version number of GRUB and exit. '-a add|remove' '--action=add|remove' Add or remove a key protector to or from a key. '-p PROTECTOR' '--protector=PROTECTOR' Set the key protector. Currently, 'tpm2' is the only supported key protector. '--tpm2-asymmetric=TYPE' Choose the the type of SRK. The valid options are 'RSA' ('RSA2048') and 'ECC' ('ECC_NIST_P256').(default: 'ECC') '--tpm2-bank=ALG' Choose bank of PCRs used to authorize key release: 'SHA1', 'SHA256', 'SHA384', or 'SHA512'. (default: 'SHA256') '--tpm2-device=DEVICE' Set the path to the TPM2 device. (default: '/dev/tpm0') '--tpm2-evict' Evict a previously persisted SRK from the TPM, if any. '--tpm2-keyfile=FILE' Set the path to a file that contains the cleartext key to protect. '--tpm2-outfile=FILE' Set the path to the file that will contain the key after sealing (must be accessible to GRUB during boot). '--tpm2-pcrs=PCRS' Set a comma-separated list of PCRs used to authorize key release e.g., '7,11'. Please be aware that PCR 0~7 are used by the firmware and the measurement result may change after a firmware update (for baremetal systems) or a package (OVMF/SLOF) update in the VM host. This may lead to the failure of key unsealing. (default: '7') '--tpm2-srk=HANDLE' Set the SRK handle, e.g. '0x81000000', if the SRK is to be made persistent. '--tpm2-nvindex=HANDLE' Set the handle, e.g. '0x81000000' or '0x1000000', for NV index mode. '--tpm2key' Use TPM 2.0 Key File format. 24.8.1 'Add' action ------------------- Before sealing the key, please check the TPM PCR usage (*note TPM PCR usage: TPM2 key protector.) to choose a proper set of PCRs. Assume that there is a key file, 'luks.key', to be sealed with PCR 0, 2, 4, and 7, and here is the 'grub-protect' command to create the sealed key file: # grub-protect --action=add \ --protector=tpm2 \ --tpm2-pcrs=0,2,4,7 \ --tpm2key \ --tpm2-keyfile=luks.key \ --tpm2-outfile=/boot/efi/efi/grub/sealed.tpm Then, GRUB can unlock the target partition with the following commands: grub> tpm2_key_protector_init -T (hd0,gpt1)/efi/grub/sealed.tpm grub> cryptomount -u -P tpm2 Besides writing the PCR-sealed key into a file, 'grub-protect' can write the sealed key into TPM non-volatile memory. Here is the 'grub-protect' command to write the sealed key into the NV index handle '0x1000000'. # grub-protect --action=add \ --protector=tpm2 \ --tpm2-pcrs=0,2,4,7 \ --tpm2key \ --tpm2-keyfile=luks.key \ --tpm2-nvindex=0x1000000 Later, GRUB can fetch the key from '0x1000000'. grub> tpm2_key_protector_init --mode=nv --nvindex=0x1000000 grub> cryptomount -u -P tpm2 In most of cases, the user only needs to create the key with the 'add' action. If auto-unlocking is unwanted, just remove the file and the 'tpm2_key_protector_init' command and invoke the 'cryptomount' command without '-P tpm2'. 24.8.2 'Remove' action ---------------------- The 'remove' action is used to remove the handles for NV index mode and the persistent SRK. 24.8.2.1 Handles for NV index mode .................................. There are two types of TPM handles supported by NV index mode: persistent handles and NV index handles, and 'tpm2_getcap' can be used to check the existing handles. To display the list of existing persistent handles: # tpm2_getcap handles-persistent - 0x81000000 Similarly, to display the list of existing NV index handles: # tpm2_getcap handles-nv-index - 0x1000000 If the sealed key at an NV index handle is not needed anymore, the user can remove the handle with '--tpm2-nvindex' and '--tpm2-evict'. For example, this command removes the data from NV index '0x1000000': # grub-protect --action=remove \ --protector=tpm2 \ --tpm2-evict \ --tpm2-nvindex 0x1000000 \ 24.8.2.2 Persistent SRK ....................... There are two supported SRKs in 'grub-protect': 'RSA' and 'ECC'. Due to slower key generation, some users of the 'RSA' SRK may prefer making it persistent so that the TPM can skip the SRK generation when GRUB tries to unseal the key. The available persistent handles can be checked with 'tpm2_getcap'. # tpm2_getcap properties-variable ... TPM2_PT_HR_PERSISTENT: 0x0 TPM2_PT_HR_PERSISTENT_AVAIL: 0x41 ... In this system, there is no persistent handle. A TPM handle is an unsigned 32-bit integer, and the persistent handles starts with '0x81'. Here we choose the well-known persistent handle: '0x81000000'. # grub-protect --action=add \ --protector=tpm2 \ --tpm2-pcrs=0,2,4,7 \ --tpm2-asymmetric=RSA \ --tpm2-srk=0x81000000 \ --tpm2key \ --tpm2-keyfile=luks.key \ --tpm2-outfile=/boot/efi/efi/grub/sealed.tpm The additional '--tpm2-asymmetric=RSA' and '--tpm2-srk=0x81000000' options are used to make the key sealed with the RSA SRK and store the SRK in '0x81000000'. For the 'tpm2_key_protector_init' command, the additional '-s 0x81000000' informs the TPM2 key protector to fetch the SRK from '0x81000000'. grub> tpm2_key_protector_init -s 0x81000000 -T (hd0,gpt1)/efi/grub/sealed.tpm grub> cryptomount -u -P tpm2 After making the SRK handle persistent, we can check the status of the persistent handles with 'tpm2_getcap'. # tpm2_getcap properties-variable ... TPM2_PT_HR_PERSISTENT: 0x1 TPM2_PT_HR_PERSISTENT_AVAIL: 0x40 ... # tpm2_getcap handles-persistent - 0x81000000 The sealed key can be removed once the user does not want to use the TPM2 key protector anymore. Here is the command to remove the persistent SRK handle ('0x81000000') with '--tpm2-srk' and '--tpm2-evict'. # grub-protect --action=remove \ --protector=tpm2 \ --tpm2-srk 0x81000000 \ --tpm2-evict  File: grub.info, Node: Invoking grub-script-check, Prev: Invoking grub-protect, Up: User-space utilities 24.9 Invoking grub-script-check =============================== The program 'grub-script-check' takes a GRUB script file (*note Shell-like scripting::) and checks it for syntax errors, similar to commands such as 'sh -n'. It may take a PATH as a non-option argument; if none is supplied, it will read from standard input. grub-script-check /boot/grub/grub.cfg 'grub-script-check' accepts the following options: '--help' Print a summary of the command-line options and exit. '--version' Print the version number of GRUB and exit. '-v' '--verbose' Print each line of input after reading it.  File: grub.info, Node: Obtaining and Building GRUB, Next: Reporting bugs, Prev: User-space utilities, Up: Top Appendix A How to obtain and build GRUB *************************************** *Caution:* GRUB requires binutils-2.9.1.0.23 or later because the GNU assembler has been changed so that it can produce real 16bits machine code between 2.9.1 and 2.9.1.0.x. See , to obtain information on how to get the latest version. GRUB is available from the GNU alpha archive site or any of its mirrors. The file will be named grub-version.tar.gz. The current version is 2.14~git20250718.0e36779, so the file you should grab is: To unbundle GRUB use the instruction: zcat grub-2.14~git20250718.0e36779.tar.gz | tar xvf - which will create a directory called 'grub-2.14~git20250718.0e36779' with all the sources. You can look at the file 'INSTALL' for detailed instructions on how to build and install GRUB, but you should be able to just do: cd grub-2.14~git20250718.0e36779 ./configure make install Also, the latest version is available using Git. See for more information.  File: grub.info, Node: Reporting bugs, Next: Future, Prev: Obtaining and Building GRUB, Up: Top Appendix B Reporting bugs ************************* These are the guideline for how to report bugs. Take a look at this list below before you submit bugs: 1. Before getting unsettled, read this manual through and through. Also, see the GNU GRUB FAQ (http://www.gnu.org/software/grub/grub-faq.html). 2. Always mention the information on your GRUB. The version number and the configuration are quite important. If you build it yourself, write the options specified to the configure script and your operating system, including the versions of gcc and binutils. 3. If you have trouble with the installation, inform us of how you installed GRUB. Don't omit error messages, if any. Just 'GRUB hangs up when it boots' is not enough. The information on your hardware is also essential. These are especially important: the geometries and the partition tables of your hard disk drives and your BIOS. 4. If GRUB cannot boot your operating system, write down _everything_ you see on the screen. Don't paraphrase them, like 'The foo OS crashes with GRUB, even though it can boot with the bar boot loader just fine'. Mention the commands you executed, the messages printed by them, and information on your operating system including the version number. 5. Explain what you wanted to do. It is very useful to know your purpose and your wish, and how GRUB didn't satisfy you. 6. If you can investigate the problem yourself, please do. That will give you and us much more information on the problem. Attaching a patch is even better. When you attach a patch, make the patch in unified diff format, and write ChangeLog entries. But, even when you make a patch, don't forget to explain the problem, so that we can understand what your patch is for. 7. Write down anything that you think might be related. Please understand that we often need to reproduce the same problem you encountered in our environment. So your information should be sufficient for us to do the same thing--Don't forget that we cannot see your computer directly. If you are not sure whether to state a fact or leave it out, state it! Reporting too many things is much better than omitting something important. If you follow the guideline above, submit a report to the Bug Tracking System (http://savannah.gnu.org/bugs/?group=grub). Alternatively, you can submit a report via electronic mail to , but we strongly recommend that you use the Bug Tracking System, because e-mail can be passed over easily. Once we get your report, we will try to fix the bugs.  File: grub.info, Node: Future, Next: Copying This Manual, Prev: Reporting bugs, Up: Top Appendix C Where GRUB will go ***************************** GRUB 2 is now quite stable and used in many production systems. We are currently working towards a 2.0 release. If you are interested in the development of GRUB 2, take a look at the homepage (http://www.gnu.org/software/grub/grub.html).  File: grub.info, Node: Copying This Manual, Next: Index, Prev: Future, Up: Top Appendix D Copying This Manual ****************************** * Menu: * GNU Free Documentation License:: License for copying this manual.  File: grub.info, Node: GNU Free Documentation License, Up: Copying This Manual D.1 GNU Free Documentation License ================================== Version 1.2, November 2002 Copyright (C) 2000,2001,2002 Free Software Foundation, Inc. 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. 0. PREAMBLE The purpose of this License is to make a manual, textbook, or other functional and useful document "free" in the sense of freedom: to assure everyone the effective freedom to copy and redistribute it, with or without modifying it, either commercially or noncommercially. Secondarily, this License preserves for the author and publisher a way to get credit for their work, while not being considered responsible for modifications made by others. This License is a kind of "copyleft", which means that derivative works of the document must themselves be free in the same sense. It complements the GNU General Public License, which is a copyleft license designed for free software. We have designed this License in order to use it for manuals for free software, because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. But this License is not limited to software manuals; it can be used for any textual work, regardless of subject matter or whether it is published as a printed book. We recommend this License principally for works whose purpose is instruction or reference. 1. APPLICABILITY AND DEFINITIONS This License applies to any manual or other work, in any medium, that contains a notice placed by the copyright holder saying it can be distributed under the terms of this License. Such a notice grants a world-wide, royalty-free license, unlimited in duration, to use that work under the conditions stated herein. The "Document", below, refers to any such manual or work. Any member of the public is a licensee, and is addressed as "you". You accept the license if you copy, modify or distribute the work in a way requiring permission under copyright law. A "Modified Version" of the Document means any work containing the Document or a portion of it, either copied verbatim, or with modifications and/or translated into another language. A "Secondary Section" is a named appendix or a front-matter section of the Document that deals exclusively with the relationship of the publishers or authors of the Document to the Document's overall subject (or to related matters) and contains nothing that could fall directly within that overall subject. (Thus, if the Document is in part a textbook of mathematics, a Secondary Section may not explain any mathematics.) The relationship could be a matter of historical connection with the subject or with related matters, or of legal, commercial, philosophical, ethical or political position regarding them. The "Invariant Sections" are certain Secondary Sections whose titles are designated, as being those of Invariant Sections, in the notice that says that the Document is released under this License. If a section does not fit the above definition of Secondary then it is not allowed to be designated as Invariant. The Document may contain zero Invariant Sections. If the Document does not identify any Invariant Sections then there are none. The "Cover Texts" are certain short passages of text that are listed, as Front-Cover Texts or Back-Cover Texts, in the notice that says that the Document is released under this License. A Front-Cover Text may be at most 5 words, and a Back-Cover Text may be at most 25 words. A "Transparent" copy of the Document means a machine-readable copy, represented in a format whose specification is available to the general public, that is suitable for revising the document straightforwardly with generic text editors or (for images composed of pixels) generic paint programs or (for drawings) some widely available drawing editor, and that is suitable for input to text formatters or for automatic translation to a variety of formats suitable for input to text formatters. A copy made in an otherwise Transparent file format whose markup, or absence of markup, has been arranged to thwart or discourage subsequent modification by readers is not Transparent. An image format is not Transparent if used for any substantial amount of text. A copy that is not "Transparent" is called "Opaque". Examples of suitable formats for Transparent copies include plain ASCII without markup, Texinfo input format, LaTeX input format, SGML or XML using a publicly available DTD, and standard-conforming simple HTML, PostScript or PDF designed for human modification. Examples of transparent image formats include PNG, XCF and JPG. Opaque formats include proprietary formats that can be read and edited only by proprietary word processors, SGML or XML for which the DTD and/or processing tools are not generally available, and the machine-generated HTML, PostScript or PDF produced by some word processors for output purposes only. The "Title Page" means, for a printed book, the title page itself, plus such following pages as are needed to hold, legibly, the material this License requires to appear in the title page. For works in formats which do not have any title page as such, "Title Page" means the text near the most prominent appearance of the work's title, preceding the beginning of the body of the text. A section "Entitled XYZ" means a named subunit of the Document whose title either is precisely XYZ or contains XYZ in parentheses following text that translates XYZ in another language. (Here XYZ stands for a specific section name mentioned below, such as "Acknowledgements", "Dedications", "Endorsements", or "History".) To "Preserve the Title" of such a section when you modify the Document means that it remains a section "Entitled XYZ" according to this definition. The Document may include Warranty Disclaimers next to the notice which states that this License applies to the Document. These Warranty Disclaimers are considered to be included by reference in this License, but only as regards disclaiming warranties: any other implication that these Warranty Disclaimers may have is void and has no effect on the meaning of this License. 2. VERBATIM COPYING You may copy and distribute the Document in any medium, either commercially or noncommercially, provided that this License, the copyright notices, and the license notice saying this License applies to the Document are reproduced in all copies, and that you add no other conditions whatsoever to those of this License. You may not use technical measures to obstruct or control the reading or further copying of the copies you make or distribute. However, you may accept compensation in exchange for copies. If you distribute a large enough number of copies you must also follow the conditions in section 3. You may also lend copies, under the same conditions stated above, and you may publicly display copies. 3. COPYING IN QUANTITY If you publish printed copies (or copies in media that commonly have printed covers) of the Document, numbering more than 100, and the Document's license notice requires Cover Texts, you must enclose the copies in covers that carry, clearly and legibly, all these Cover Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on the back cover. Both covers must also clearly and legibly identify you as the publisher of these copies. The front cover must present the full title with all words of the title equally prominent and visible. You may add other material on the covers in addition. Copying with changes limited to the covers, as long as they preserve the title of the Document and satisfy these conditions, can be treated as verbatim copying in other respects. If the required texts for either cover are too voluminous to fit legibly, you should put the first ones listed (as many as fit reasonably) on the actual cover, and continue the rest onto adjacent pages. If you publish or distribute Opaque copies of the Document numbering more than 100, you must either include a machine-readable Transparent copy along with each Opaque copy, or state in or with each Opaque copy a computer-network location from which the general network-using public has access to download using public-standard network protocols a complete Transparent copy of the Document, free of added material. If you use the latter option, you must take reasonably prudent steps, when you begin distribution of Opaque copies in quantity, to ensure that this Transparent copy will remain thus accessible at the stated location until at least one year after the last time you distribute an Opaque copy (directly or through your agents or retailers) of that edition to the public. It is requested, but not required, that you contact the authors of the Document well before redistributing any large number of copies, to give them a chance to provide you with an updated version of the Document. 4. MODIFICATIONS You may copy and distribute a Modified Version of the Document under the conditions of sections 2 and 3 above, provided that you release the Modified Version under precisely this License, with the Modified Version filling the role of the Document, thus licensing distribution and modification of the Modified Version to whoever possesses a copy of it. In addition, you must do these things in the Modified Version: A. Use in the Title Page (and on the covers, if any) a title distinct from that of the Document, and from those of previous versions (which should, if there were any, be listed in the History section of the Document). You may use the same title as a previous version if the original publisher of that version gives permission. B. List on the Title Page, as authors, one or more persons or entities responsible for authorship of the modifications in the Modified Version, together with at least five of the principal authors of the Document (all of its principal authors, if it has fewer than five), unless they release you from this requirement. C. State on the Title page the name of the publisher of the Modified Version, as the publisher. D. Preserve all the copyright notices of the Document. E. Add an appropriate copyright notice for your modifications adjacent to the other copyright notices. F. Include, immediately after the copyright notices, a license notice giving the public permission to use the Modified Version under the terms of this License, in the form shown in the Addendum below. G. Preserve in that license notice the full lists of Invariant Sections and required Cover Texts given in the Document's license notice. H. Include an unaltered copy of this License. I. Preserve the section Entitled "History", Preserve its Title, and add to it an item stating at least the title, year, new authors, and publisher of the Modified Version as given on the Title Page. If there is no section Entitled "History" in the Document, create one stating the title, year, authors, and publisher of the Document as given on its Title Page, then add an item describing the Modified Version as stated in the previous sentence. J. Preserve the network location, if any, given in the Document for public access to a Transparent copy of the Document, and likewise the network locations given in the Document for previous versions it was based on. These may be placed in the "History" section. You may omit a network location for a work that was published at least four years before the Document itself, or if the original publisher of the version it refers to gives permission. K. For any section Entitled "Acknowledgements" or "Dedications", Preserve the Title of the section, and preserve in the section all the substance and tone of each of the contributor acknowledgements and/or dedications given therein. L. Preserve all the Invariant Sections of the Document, unaltered in their text and in their titles. Section numbers or the equivalent are not considered part of the section titles. M. Delete any section Entitled "Endorsements". Such a section may not be included in the Modified Version. N. Do not retitle any existing section to be Entitled "Endorsements" or to conflict in title with any Invariant Section. O. Preserve any Warranty Disclaimers. If the Modified Version includes new front-matter sections or appendices that qualify as Secondary Sections and contain no material copied from the Document, you may at your option designate some or all of these sections as invariant. To do this, add their titles to the list of Invariant Sections in the Modified Version's license notice. These titles must be distinct from any other section titles. You may add a section Entitled "Endorsements", provided it contains nothing but endorsements of your Modified Version by various parties--for example, statements of peer review or that the text has been approved by an organization as the authoritative definition of a standard. You may add a passage of up to five words as a Front-Cover Text, and a passage of up to 25 words as a Back-Cover Text, to the end of the list of Cover Texts in the Modified Version. Only one passage of Front-Cover Text and one of Back-Cover Text may be added by (or through arrangements made by) any one entity. If the Document already includes a cover text for the same cover, previously added by you or by arrangement made by the same entity you are acting on behalf of, you may not add another; but you may replace the old one, on explicit permission from the previous publisher that added the old one. The author(s) and publisher(s) of the Document do not by this License give permission to use their names for publicity for or to assert or imply endorsement of any Modified Version. 5. COMBINING DOCUMENTS You may combine the Document with other documents released under this License, under the terms defined in section 4 above for modified versions, provided that you include in the combination all of the Invariant Sections of all of the original documents, unmodified, and list them all as Invariant Sections of your combined work in its license notice, and that you preserve all their Warranty Disclaimers. The combined work need only contain one copy of this License, and multiple identical Invariant Sections may be replaced with a single copy. If there are multiple Invariant Sections with the same name but different contents, make the title of each such section unique by adding at the end of it, in parentheses, the name of the original author or publisher of that section if known, or else a unique number. Make the same adjustment to the section titles in the list of Invariant Sections in the license notice of the combined work. In the combination, you must combine any sections Entitled "History" in the various original documents, forming one section Entitled "History"; likewise combine any sections Entitled "Acknowledgements", and any sections Entitled "Dedications". You must delete all sections Entitled "Endorsements." 6. COLLECTIONS OF DOCUMENTS You may make a collection consisting of the Document and other documents released under this License, and replace the individual copies of this License in the various documents with a single copy that is included in the collection, provided that you follow the rules of this License for verbatim copying of each of the documents in all other respects. You may extract a single document from such a collection, and distribute it individually under this License, provided you insert a copy of this License into the extracted document, and follow this License in all other respects regarding verbatim copying of that document. 7. AGGREGATION WITH INDEPENDENT WORKS A compilation of the Document or its derivatives with other separate and independent documents or works, in or on a volume of a storage or distribution medium, is called an "aggregate" if the copyright resulting from the compilation is not used to limit the legal rights of the compilation's users beyond what the individual works permit. When the Document is included in an aggregate, this License does not apply to the other works in the aggregate which are not themselves derivative works of the Document. If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if the Document is less than one half of the entire aggregate, the Document's Cover Texts may be placed on covers that bracket the Document within the aggregate, or the electronic equivalent of covers if the Document is in electronic form. Otherwise they must appear on printed covers that bracket the whole aggregate. 8. TRANSLATION Translation is considered a kind of modification, so you may distribute translations of the Document under the terms of section 4. Replacing Invariant Sections with translations requires special permission from their copyright holders, but you may include translations of some or all Invariant Sections in addition to the original versions of these Invariant Sections. You may include a translation of this License, and all the license notices in the Document, and any Warranty Disclaimers, provided that you also include the original English version of this License and the original versions of those notices and disclaimers. In case of a disagreement between the translation and the original version of this License or a notice or disclaimer, the original version will prevail. If a section in the Document is Entitled "Acknowledgements", "Dedications", or "History", the requirement (section 4) to Preserve its Title (section 1) will typically require changing the actual title. 9. TERMINATION You may not copy, modify, sublicense, or distribute the Document except as expressly provided for under this License. Any other attempt to copy, modify, sublicense or distribute the Document is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 10. FUTURE REVISIONS OF THIS LICENSE The Free Software Foundation may publish new, revised versions of the GNU Free Documentation License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. See . Each version of the License is given a distinguishing version number. If the Document specifies that a particular numbered version of this License "or any later version" applies to it, you have the option of following the terms and conditions either of that specified version or of any later version that has been published (not as a draft) by the Free Software Foundation. If the Document does not specify a version number of this License, you may choose any version ever published (not as a draft) by the Free Software Foundation. D.1.1 ADDENDUM: How to use this License for your documents ---------------------------------------------------------- To use this License in a document you have written, include a copy of the License in the document and put the following copyright and license notices just after the title page: Copyright (C) YEAR YOUR NAME. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled ``GNU Free Documentation License''. If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, replace the "with...Texts." line with this: with the Invariant Sections being LIST THEIR TITLES, with the Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST. If you have Invariant Sections without Cover Texts, or some other combination of the three, merge those two alternatives to suit the situation. If your document contains nontrivial examples of program code, we recommend releasing these examples in parallel under your choice of free software license, such as the GNU General Public License, to permit their use in free software.  File: grub.info, Node: Index, Prev: Copying This Manual, Up: Top Index ***** [index] * Menu: * [: [. (line 6) * acpi: acpi. (line 6) * authenticate: authenticate. (line 6) * background_color: background_color. (line 6) * background_image: background_image. (line 6) * badram: badram. (line 6) * blocklist: blocklist. (line 6) * boot: boot. (line 6) * cat: cat. (line 6) * chainloader: chainloader. (line 6) * clear: clear. (line 6) * CMOS: cmosdump. (line 6) * cmosclean: cmosclean. (line 6) * cmostest: cmostest. (line 6) * cmp: cmp. (line 6) * configfile: configfile. (line 6) * cpuid: cpuid. (line 6) * crc: crc. (line 6) * cryptocheck: cryptocheck. (line 6) * cryptomount: cryptomount. (line 6) * cutmem: cutmem. (line 6) * date: date. (line 6) * devicetree: devicetree. (line 6) * distrust: distrust. (line 6) * drivemap: drivemap. (line 6) * echo: echo. (line 6) * efitextmode: efitextmode. (line 6) * eval: eval. (line 6) * export: export. (line 6) * false: false. (line 6) * FDL, GNU Free Documentation License: GNU Free Documentation License. (line 6) * fdtdump: fdtdump. (line 6) * file: file. (line 6) * fwsetup: fwsetup. (line 6) * gdbinfo: gdbinfo. (line 6) * gettext: gettext. (line 6) * gptsync: gptsync. (line 6) * halt: halt. (line 6) * hashsum: hashsum. (line 6) * help: help. (line 6) * hexdump: hexdump. (line 6) * initrd: initrd. (line 6) * initrd16: initrd16. (line 6) * insmod: insmod. (line 6) * keystatus: keystatus. (line 6) * linux: linux. (line 6) * linux16: linux16. (line 6) * list_env: list_env. (line 6) * list_trusted: list_trusted. (line 6) * loadfont: loadfont. (line 6) * load_env: load_env. (line 6) * loopback: loopback. (line 6) * ls: ls. (line 6) * lsfonts: lsfonts. (line 6) * lsmod: lsmod. (line 6) * md5sum: md5sum. (line 6) * menuentry: menuentry. (line 6) * module: module. (line 6) * multiboot: multiboot. (line 6) * nativedisk: nativedisk. (line 6) * net_add_addr: net_add_addr. (line 6) * net_add_dns: net_add_dns. (line 6) * net_add_route: net_add_route. (line 6) * net_bootp: net_bootp. (line 6) * net_del_addr: net_del_addr. (line 6) * net_del_dns: net_del_dns. (line 6) * net_del_route: net_del_route. (line 6) * net_dhcp: net_dhcp. (line 6) * net_get_dhcp_option: net_get_dhcp_option. (line 6) * net_ipv6_autoconf: net_ipv6_autoconf. (line 6) * net_ls_addr: net_ls_addr. (line 6) * net_ls_cards: net_ls_cards. (line 6) * net_ls_dns: net_ls_dns. (line 6) * net_ls_routes: net_ls_routes. (line 6) * net_nslookup: net_nslookup. (line 6) * net_set_vlan: net_set_vlan. (line 6) * normal: normal. (line 6) * normal_exit: normal_exit. (line 6) * parttool: parttool. (line 6) * password: password. (line 6) * password_pbkdf2: password_pbkdf2. (line 6) * plainmount: plainmount. (line 6) * play: play. (line 6) * probe: probe. (line 6) * rdmsr: rdmsr. (line 6) * read: read. (line 6) * reboot: reboot. (line 6) * regexp: regexp. (line 6) * rmmod: rmmod. (line 6) * save_env: save_env. (line 6) * search: search. (line 6) * sendkey: sendkey. (line 6) * serial: serial. (line 6) * set: set. (line 6) * sha1sum: sha1sum. (line 6) * sha256sum: sha256sum. (line 6) * sha512sum: sha512sum. (line 6) * sleep: sleep. (line 6) * smbios: smbios. (line 6) * source: source. (line 6) * submenu: submenu. (line 6) * terminal_input: terminal_input. (line 6) * terminal_output: terminal_output. (line 6) * terminfo: terminfo. (line 6) * test: test. (line 6) * tpm2_dump_pcr: tpm2_dump_pcr. (line 6) * tpm2_key_protector_clear: tpm2_key_protector_clear. (line 6) * tpm2_key_protector_init: tpm2_key_protector_init. (line 6) * true: true. (line 6) * trust: trust. (line 6) * unset: unset. (line 6) * verify_detached: verify_detached. (line 6) * videoinfo: videoinfo. (line 6) * wrmsr: wrmsr. (line 6) * xen_hypervisor: xen_hypervisor. (line 6) * xen_module: xen_module. (line 6) grub-2.14~git20250718.0e36779/docs/Makefile.in0000644000175000017500000021366315036452452015014 00000000000000# Makefile.in generated by automake 1.16.5 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2021 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = docs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/00gnulib.m4 \ $(top_srcdir)/m4/__inline.m4 \ $(top_srcdir)/m4/absolute-header.m4 $(top_srcdir)/m4/alloca.m4 \ $(top_srcdir)/m4/argp.m4 $(top_srcdir)/m4/base64.m4 \ $(top_srcdir)/m4/btowc.m4 $(top_srcdir)/m4/builtin-expect.m4 \ $(top_srcdir)/m4/calloc.m4 $(top_srcdir)/m4/chdir-long.m4 \ $(top_srcdir)/m4/close.m4 $(top_srcdir)/m4/codeset.m4 \ $(top_srcdir)/m4/ctype_h.m4 $(top_srcdir)/m4/dirent_h.m4 \ $(top_srcdir)/m4/dirfd.m4 \ $(top_srcdir)/m4/double-slash-root.m4 $(top_srcdir)/m4/dup2.m4 \ $(top_srcdir)/m4/eealloc.m4 $(top_srcdir)/m4/errno_h.m4 \ $(top_srcdir)/m4/error.m4 $(top_srcdir)/m4/exponentd.m4 \ $(top_srcdir)/m4/extensions.m4 \ $(top_srcdir)/m4/extern-inline.m4 $(top_srcdir)/m4/fchdir.m4 \ $(top_srcdir)/m4/fcntl-o.m4 $(top_srcdir)/m4/fcntl.m4 \ $(top_srcdir)/m4/fcntl_h.m4 $(top_srcdir)/m4/filenamecat.m4 \ $(top_srcdir)/m4/flexmember.m4 $(top_srcdir)/m4/float_h.m4 \ $(top_srcdir)/m4/fnmatch.m4 $(top_srcdir)/m4/fnmatch_h.m4 \ $(top_srcdir)/m4/free.m4 $(top_srcdir)/m4/fstat.m4 \ $(top_srcdir)/m4/getcwd.m4 $(top_srcdir)/m4/getdelim.m4 \ $(top_srcdir)/m4/getdtablesize.m4 $(top_srcdir)/m4/getline.m4 \ $(top_srcdir)/m4/getopt.m4 $(top_srcdir)/m4/getprogname.m4 \ $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/gnulib-common.m4 \ $(top_srcdir)/m4/gnulib-comp.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/include_next.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/intmax_t.m4 \ $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ $(top_srcdir)/m4/isblank.m4 $(top_srcdir)/m4/langinfo_h.m4 \ $(top_srcdir)/m4/largefile.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libunistring-base.m4 \ $(top_srcdir)/m4/limits-h.m4 $(top_srcdir)/m4/localcharset.m4 \ $(top_srcdir)/m4/locale-fr.m4 $(top_srcdir)/m4/locale-ja.m4 \ $(top_srcdir)/m4/locale-zh.m4 $(top_srcdir)/m4/locale_h.m4 \ $(top_srcdir)/m4/localeconv.m4 $(top_srcdir)/m4/lock.m4 \ $(top_srcdir)/m4/lstat.m4 $(top_srcdir)/m4/malloc.m4 \ $(top_srcdir)/m4/malloca.m4 $(top_srcdir)/m4/mbrtowc.m4 \ $(top_srcdir)/m4/mbsinit.m4 $(top_srcdir)/m4/mbsrtowcs.m4 \ $(top_srcdir)/m4/mbstate_t.m4 $(top_srcdir)/m4/mbswidth.m4 \ $(top_srcdir)/m4/mbtowc.m4 $(top_srcdir)/m4/memchr.m4 \ $(top_srcdir)/m4/mempcpy.m4 $(top_srcdir)/m4/memrchr.m4 \ $(top_srcdir)/m4/mmap-anon.m4 $(top_srcdir)/m4/mode_t.m4 \ $(top_srcdir)/m4/msvc-inval.m4 \ $(top_srcdir)/m4/msvc-nothrow.m4 $(top_srcdir)/m4/multiarch.m4 \ $(top_srcdir)/m4/nl_langinfo.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/nocrash.m4 $(top_srcdir)/m4/off_t.m4 \ $(top_srcdir)/m4/open-cloexec.m4 \ $(top_srcdir)/m4/open-slash.m4 $(top_srcdir)/m4/open.m4 \ $(top_srcdir)/m4/openat.m4 $(top_srcdir)/m4/pathmax.m4 \ $(top_srcdir)/m4/pipe.m4 $(top_srcdir)/m4/po.m4 \ $(top_srcdir)/m4/printf.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/m4/pthread_rwlock_rdlock.m4 \ $(top_srcdir)/m4/rawmemchr.m4 $(top_srcdir)/m4/realloc.m4 \ $(top_srcdir)/m4/reallocarray.m4 $(top_srcdir)/m4/regex.m4 \ $(top_srcdir)/m4/save-cwd.m4 \ $(top_srcdir)/m4/setlocale_null.m4 \ $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/sleep.m4 \ $(top_srcdir)/m4/ssize_t.m4 $(top_srcdir)/m4/stat-time.m4 \ $(top_srcdir)/m4/stat.m4 $(top_srcdir)/m4/stdalign.m4 \ $(top_srcdir)/m4/stdbool.m4 $(top_srcdir)/m4/stddef_h.m4 \ $(top_srcdir)/m4/stdint.m4 $(top_srcdir)/m4/stdint_h.m4 \ $(top_srcdir)/m4/stdio_h.m4 $(top_srcdir)/m4/stdlib_h.m4 \ $(top_srcdir)/m4/strcase.m4 $(top_srcdir)/m4/strchrnul.m4 \ $(top_srcdir)/m4/strdup.m4 $(top_srcdir)/m4/strerror.m4 \ $(top_srcdir)/m4/string_h.m4 $(top_srcdir)/m4/strings_h.m4 \ $(top_srcdir)/m4/strndup.m4 $(top_srcdir)/m4/strnlen.m4 \ $(top_srcdir)/m4/sys_socket_h.m4 \ $(top_srcdir)/m4/sys_stat_h.m4 $(top_srcdir)/m4/sys_types_h.m4 \ $(top_srcdir)/m4/sysexits.m4 $(top_srcdir)/m4/threadlib.m4 \ $(top_srcdir)/m4/time_h.m4 $(top_srcdir)/m4/unistd-safer.m4 \ $(top_srcdir)/m4/unistd_h.m4 $(top_srcdir)/m4/vasnprintf.m4 \ $(top_srcdir)/m4/visibility.m4 $(top_srcdir)/m4/vsnprintf.m4 \ $(top_srcdir)/m4/warn-on-use.m4 $(top_srcdir)/m4/wchar_h.m4 \ $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wcrtomb.m4 \ $(top_srcdir)/m4/wctype_h.m4 $(top_srcdir)/m4/wcwidth.m4 \ $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/wmemchr.m4 \ $(top_srcdir)/m4/wmempcpy.m4 $(top_srcdir)/m4/xsize.m4 \ $(top_srcdir)/m4/year2038.m4 $(top_srcdir)/m4/zzgnulib.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/version.texi \ $(srcdir)/stamp-vti $(srcdir)/version-dev.texi \ $(srcdir)/stamp-1 $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config-util.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = AM_V_DVIPS = $(am__v_DVIPS_@AM_V@) am__v_DVIPS_ = $(am__v_DVIPS_@AM_DEFAULT_V@) am__v_DVIPS_0 = @echo " DVIPS " $@; am__v_DVIPS_1 = AM_V_MAKEINFO = $(am__v_MAKEINFO_@AM_V@) am__v_MAKEINFO_ = $(am__v_MAKEINFO_@AM_DEFAULT_V@) am__v_MAKEINFO_0 = @echo " MAKEINFO" $@; am__v_MAKEINFO_1 = AM_V_INFOHTML = $(am__v_INFOHTML_@AM_V@) am__v_INFOHTML_ = $(am__v_INFOHTML_@AM_DEFAULT_V@) am__v_INFOHTML_0 = @echo " INFOHTML" $@; am__v_INFOHTML_1 = AM_V_TEXI2DVI = $(am__v_TEXI2DVI_@AM_V@) am__v_TEXI2DVI_ = $(am__v_TEXI2DVI_@AM_DEFAULT_V@) am__v_TEXI2DVI_0 = @echo " TEXI2DVI" $@; am__v_TEXI2DVI_1 = AM_V_TEXI2PDF = $(am__v_TEXI2PDF_@AM_V@) am__v_TEXI2PDF_ = $(am__v_TEXI2PDF_@AM_DEFAULT_V@) am__v_TEXI2PDF_0 = @echo " TEXI2PDF" $@; am__v_TEXI2PDF_1 = AM_V_texinfo = $(am__v_texinfo_@AM_V@) am__v_texinfo_ = $(am__v_texinfo_@AM_DEFAULT_V@) am__v_texinfo_0 = -q am__v_texinfo_1 = AM_V_texidevnull = $(am__v_texidevnull_@AM_V@) am__v_texidevnull_ = $(am__v_texidevnull_@AM_DEFAULT_V@) am__v_texidevnull_0 = > /dev/null am__v_texidevnull_1 = INFO_DEPS = $(srcdir)/grub.info $(srcdir)/grub-dev.info TEXINFO_TEX = $(top_srcdir)/build-aux/texinfo.tex am__TEXINFO_TEX_DIR = $(top_srcdir)/build-aux DVIS = grub.dvi grub-dev.dvi PDFS = grub.pdf grub-dev.pdf PSS = grub.ps grub-dev.ps HTMLS = grub.html grub-dev.html TEXINFOS = grub.texi grub-dev.texi TEXI2DVI = texi2dvi TEXI2PDF = $(TEXI2DVI) --pdf --batch MAKEINFOHTML = $(MAKEINFO) --html AM_MAKEINFOHTMLFLAGS = $(AM_MAKEINFOFLAGS) DVIPS = dvips am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__installdirs = "$(DESTDIR)$(infodir)" am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__DIST_COMMON = $(grub_TEXINFOS) $(srcdir)/Makefile.in \ $(top_srcdir)/build-aux/mdate-sh \ $(top_srcdir)/build-aux/texinfo.tex mdate-sh texinfo.tex DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ ALLOCA_H = @ALLOCA_H@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ APPLE_UNIVERSAL_BUILD = @APPLE_UNIVERSAL_BUILD@ AR = @AR@ ARFLAGS = @ARFLAGS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BITSIZEOF_PTRDIFF_T = @BITSIZEOF_PTRDIFF_T@ BITSIZEOF_SIG_ATOMIC_T = @BITSIZEOF_SIG_ATOMIC_T@ BITSIZEOF_SIZE_T = @BITSIZEOF_SIZE_T@ BITSIZEOF_WCHAR_T = @BITSIZEOF_WCHAR_T@ BITSIZEOF_WINT_T = @BITSIZEOF_WINT_T@ BOOT_TIME_STATS = @BOOT_TIME_STATS@ BSS_START_SYMBOL = @BSS_START_SYMBOL@ BUILD_CC = @BUILD_CC@ BUILD_CFLAGS = @BUILD_CFLAGS@ BUILD_CPPFLAGS = @BUILD_CPPFLAGS@ BUILD_EXEEXT = @BUILD_EXEEXT@ BUILD_FREETYPE_CFLAGS = @BUILD_FREETYPE_CFLAGS@ BUILD_FREETYPE_LIBS = @BUILD_FREETYPE_LIBS@ BUILD_LDFLAGS = @BUILD_LDFLAGS@ BUILD_LIBM = @BUILD_LIBM@ BUILD_SHEBANG = @BUILD_SHEBANG@ BUILD_SIZEOF_LONG = @BUILD_SIZEOF_LONG@ BUILD_SIZEOF_VOID_P = @BUILD_SIZEOF_VOID_P@ BUILD_WORDS_BIGENDIAN = @BUILD_WORDS_BIGENDIAN@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CFLAG_VISIBILITY = @CFLAG_VISIBILITY@ CMP = @CMP@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISK_CACHE_STATS = @DISK_CACHE_STATS@ DJVU_FONT_SOURCE = @DJVU_FONT_SOURCE@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EFIEMU64_LINK_FORMAT = @EFIEMU64_LINK_FORMAT@ EGREP = @EGREP@ EMULTIHOP_HIDDEN = @EMULTIHOP_HIDDEN@ EMULTIHOP_VALUE = @EMULTIHOP_VALUE@ END_SYMBOL = @END_SYMBOL@ ENOLINK_HIDDEN = @ENOLINK_HIDDEN@ ENOLINK_VALUE = @ENOLINK_VALUE@ EOVERFLOW_HIDDEN = @EOVERFLOW_HIDDEN@ EOVERFLOW_VALUE = @EOVERFLOW_VALUE@ ERRNO_H = @ERRNO_H@ ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FLOAT_H = @FLOAT_H@ FNMATCH_H = @FNMATCH_H@ FONT_SOURCE = @FONT_SOURCE@ FREETYPE_CFLAGS = @FREETYPE_CFLAGS@ FREETYPE_LIBS = @FREETYPE_LIBS@ FUSE_CFLAGS = @FUSE_CFLAGS@ FUSE_LIBS = @FUSE_LIBS@ GETOPT_CDEFS_H = @GETOPT_CDEFS_H@ GETOPT_H = @GETOPT_H@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GL_CFLAG_ALLOW_WARNINGS = @GL_CFLAG_ALLOW_WARNINGS@ GL_CFLAG_GNULIB_WARNINGS = @GL_CFLAG_GNULIB_WARNINGS@ GL_GNULIB_ACCESS = @GL_GNULIB_ACCESS@ GL_GNULIB_ALIGNED_ALLOC = @GL_GNULIB_ALIGNED_ALLOC@ GL_GNULIB_ALPHASORT = @GL_GNULIB_ALPHASORT@ GL_GNULIB_ATOLL = @GL_GNULIB_ATOLL@ GL_GNULIB_BTOWC = @GL_GNULIB_BTOWC@ GL_GNULIB_CALLOC_GNU = @GL_GNULIB_CALLOC_GNU@ GL_GNULIB_CALLOC_POSIX = @GL_GNULIB_CALLOC_POSIX@ GL_GNULIB_CANONICALIZE_FILE_NAME = @GL_GNULIB_CANONICALIZE_FILE_NAME@ GL_GNULIB_CHDIR = @GL_GNULIB_CHDIR@ GL_GNULIB_CHOWN = @GL_GNULIB_CHOWN@ GL_GNULIB_CLOSE = @GL_GNULIB_CLOSE@ GL_GNULIB_CLOSEDIR = @GL_GNULIB_CLOSEDIR@ GL_GNULIB_COPY_FILE_RANGE = @GL_GNULIB_COPY_FILE_RANGE@ GL_GNULIB_CREAT = @GL_GNULIB_CREAT@ GL_GNULIB_CTIME = @GL_GNULIB_CTIME@ GL_GNULIB_DIRFD = @GL_GNULIB_DIRFD@ GL_GNULIB_DPRINTF = @GL_GNULIB_DPRINTF@ GL_GNULIB_DUP = @GL_GNULIB_DUP@ GL_GNULIB_DUP2 = @GL_GNULIB_DUP2@ GL_GNULIB_DUP3 = @GL_GNULIB_DUP3@ GL_GNULIB_DUPLOCALE = @GL_GNULIB_DUPLOCALE@ GL_GNULIB_ENVIRON = @GL_GNULIB_ENVIRON@ GL_GNULIB_EUIDACCESS = @GL_GNULIB_EUIDACCESS@ GL_GNULIB_EXECL = @GL_GNULIB_EXECL@ GL_GNULIB_EXECLE = @GL_GNULIB_EXECLE@ GL_GNULIB_EXECLP = @GL_GNULIB_EXECLP@ GL_GNULIB_EXECV = @GL_GNULIB_EXECV@ GL_GNULIB_EXECVE = @GL_GNULIB_EXECVE@ GL_GNULIB_EXECVP = @GL_GNULIB_EXECVP@ GL_GNULIB_EXECVPE = @GL_GNULIB_EXECVPE@ GL_GNULIB_EXPLICIT_BZERO = @GL_GNULIB_EXPLICIT_BZERO@ GL_GNULIB_FACCESSAT = @GL_GNULIB_FACCESSAT@ GL_GNULIB_FCHDIR = @GL_GNULIB_FCHDIR@ GL_GNULIB_FCHMODAT = @GL_GNULIB_FCHMODAT@ GL_GNULIB_FCHOWNAT = @GL_GNULIB_FCHOWNAT@ GL_GNULIB_FCLOSE = @GL_GNULIB_FCLOSE@ GL_GNULIB_FCNTL = @GL_GNULIB_FCNTL@ GL_GNULIB_FDATASYNC = @GL_GNULIB_FDATASYNC@ GL_GNULIB_FDOPEN = @GL_GNULIB_FDOPEN@ GL_GNULIB_FDOPENDIR = @GL_GNULIB_FDOPENDIR@ GL_GNULIB_FFLUSH = @GL_GNULIB_FFLUSH@ GL_GNULIB_FFS = @GL_GNULIB_FFS@ GL_GNULIB_FFSL = @GL_GNULIB_FFSL@ GL_GNULIB_FFSLL = @GL_GNULIB_FFSLL@ GL_GNULIB_FGETC = @GL_GNULIB_FGETC@ GL_GNULIB_FGETS = @GL_GNULIB_FGETS@ GL_GNULIB_FNMATCH = @GL_GNULIB_FNMATCH@ GL_GNULIB_FOPEN = @GL_GNULIB_FOPEN@ GL_GNULIB_FOPEN_GNU = @GL_GNULIB_FOPEN_GNU@ GL_GNULIB_FPRINTF = @GL_GNULIB_FPRINTF@ GL_GNULIB_FPRINTF_POSIX = @GL_GNULIB_FPRINTF_POSIX@ GL_GNULIB_FPURGE = @GL_GNULIB_FPURGE@ GL_GNULIB_FPUTC = @GL_GNULIB_FPUTC@ GL_GNULIB_FPUTS = @GL_GNULIB_FPUTS@ GL_GNULIB_FREAD = @GL_GNULIB_FREAD@ GL_GNULIB_FREE_POSIX = @GL_GNULIB_FREE_POSIX@ GL_GNULIB_FREOPEN = @GL_GNULIB_FREOPEN@ GL_GNULIB_FSCANF = @GL_GNULIB_FSCANF@ GL_GNULIB_FSEEK = @GL_GNULIB_FSEEK@ GL_GNULIB_FSEEKO = @GL_GNULIB_FSEEKO@ GL_GNULIB_FSTAT = @GL_GNULIB_FSTAT@ GL_GNULIB_FSTATAT = @GL_GNULIB_FSTATAT@ GL_GNULIB_FSYNC = @GL_GNULIB_FSYNC@ GL_GNULIB_FTELL = @GL_GNULIB_FTELL@ GL_GNULIB_FTELLO = @GL_GNULIB_FTELLO@ GL_GNULIB_FTRUNCATE = @GL_GNULIB_FTRUNCATE@ GL_GNULIB_FUTIMENS = @GL_GNULIB_FUTIMENS@ GL_GNULIB_FWRITE = @GL_GNULIB_FWRITE@ GL_GNULIB_GETC = @GL_GNULIB_GETC@ GL_GNULIB_GETCHAR = @GL_GNULIB_GETCHAR@ GL_GNULIB_GETCWD = @GL_GNULIB_GETCWD@ GL_GNULIB_GETDELIM = @GL_GNULIB_GETDELIM@ GL_GNULIB_GETDOMAINNAME = @GL_GNULIB_GETDOMAINNAME@ GL_GNULIB_GETDTABLESIZE = @GL_GNULIB_GETDTABLESIZE@ GL_GNULIB_GETENTROPY = @GL_GNULIB_GETENTROPY@ GL_GNULIB_GETGROUPS = @GL_GNULIB_GETGROUPS@ GL_GNULIB_GETHOSTNAME = @GL_GNULIB_GETHOSTNAME@ GL_GNULIB_GETLINE = @GL_GNULIB_GETLINE@ GL_GNULIB_GETLOADAVG = @GL_GNULIB_GETLOADAVG@ GL_GNULIB_GETLOGIN = @GL_GNULIB_GETLOGIN@ GL_GNULIB_GETLOGIN_R = @GL_GNULIB_GETLOGIN_R@ GL_GNULIB_GETOPT_POSIX = @GL_GNULIB_GETOPT_POSIX@ GL_GNULIB_GETPAGESIZE = @GL_GNULIB_GETPAGESIZE@ GL_GNULIB_GETPASS = @GL_GNULIB_GETPASS@ GL_GNULIB_GETPASS_GNU = @GL_GNULIB_GETPASS_GNU@ GL_GNULIB_GETSUBOPT = @GL_GNULIB_GETSUBOPT@ GL_GNULIB_GETUMASK = @GL_GNULIB_GETUMASK@ GL_GNULIB_GETUSERSHELL = @GL_GNULIB_GETUSERSHELL@ GL_GNULIB_GRANTPT = @GL_GNULIB_GRANTPT@ GL_GNULIB_GROUP_MEMBER = @GL_GNULIB_GROUP_MEMBER@ GL_GNULIB_IMAXABS = @GL_GNULIB_IMAXABS@ GL_GNULIB_IMAXDIV = @GL_GNULIB_IMAXDIV@ GL_GNULIB_ISATTY = @GL_GNULIB_ISATTY@ GL_GNULIB_ISBLANK = @GL_GNULIB_ISBLANK@ GL_GNULIB_ISWBLANK = @GL_GNULIB_ISWBLANK@ GL_GNULIB_ISWCTYPE = @GL_GNULIB_ISWCTYPE@ GL_GNULIB_ISWDIGIT = @GL_GNULIB_ISWDIGIT@ GL_GNULIB_ISWXDIGIT = @GL_GNULIB_ISWXDIGIT@ GL_GNULIB_LCHMOD = @GL_GNULIB_LCHMOD@ GL_GNULIB_LCHOWN = @GL_GNULIB_LCHOWN@ GL_GNULIB_LINK = @GL_GNULIB_LINK@ GL_GNULIB_LINKAT = @GL_GNULIB_LINKAT@ GL_GNULIB_LOCALECONV = @GL_GNULIB_LOCALECONV@ GL_GNULIB_LOCALENAME = @GL_GNULIB_LOCALENAME@ GL_GNULIB_LOCALTIME = @GL_GNULIB_LOCALTIME@ GL_GNULIB_LSEEK = @GL_GNULIB_LSEEK@ GL_GNULIB_LSTAT = @GL_GNULIB_LSTAT@ GL_GNULIB_MALLOC_GNU = @GL_GNULIB_MALLOC_GNU@ GL_GNULIB_MALLOC_POSIX = @GL_GNULIB_MALLOC_POSIX@ GL_GNULIB_MBRLEN = @GL_GNULIB_MBRLEN@ GL_GNULIB_MBRTOWC = @GL_GNULIB_MBRTOWC@ GL_GNULIB_MBSCASECMP = @GL_GNULIB_MBSCASECMP@ GL_GNULIB_MBSCASESTR = @GL_GNULIB_MBSCASESTR@ GL_GNULIB_MBSCHR = @GL_GNULIB_MBSCHR@ GL_GNULIB_MBSCSPN = @GL_GNULIB_MBSCSPN@ GL_GNULIB_MBSINIT = @GL_GNULIB_MBSINIT@ GL_GNULIB_MBSLEN = @GL_GNULIB_MBSLEN@ GL_GNULIB_MBSNCASECMP = @GL_GNULIB_MBSNCASECMP@ GL_GNULIB_MBSNLEN = @GL_GNULIB_MBSNLEN@ GL_GNULIB_MBSNRTOWCS = @GL_GNULIB_MBSNRTOWCS@ GL_GNULIB_MBSPBRK = @GL_GNULIB_MBSPBRK@ GL_GNULIB_MBSPCASECMP = @GL_GNULIB_MBSPCASECMP@ GL_GNULIB_MBSRCHR = @GL_GNULIB_MBSRCHR@ GL_GNULIB_MBSRTOWCS = @GL_GNULIB_MBSRTOWCS@ GL_GNULIB_MBSSEP = @GL_GNULIB_MBSSEP@ GL_GNULIB_MBSSPN = @GL_GNULIB_MBSSPN@ GL_GNULIB_MBSSTR = @GL_GNULIB_MBSSTR@ GL_GNULIB_MBSTOK_R = @GL_GNULIB_MBSTOK_R@ GL_GNULIB_MBTOWC = @GL_GNULIB_MBTOWC@ GL_GNULIB_MDA_ACCESS = @GL_GNULIB_MDA_ACCESS@ GL_GNULIB_MDA_CHDIR = @GL_GNULIB_MDA_CHDIR@ GL_GNULIB_MDA_CHMOD = @GL_GNULIB_MDA_CHMOD@ GL_GNULIB_MDA_CLOSE = @GL_GNULIB_MDA_CLOSE@ GL_GNULIB_MDA_CREAT = @GL_GNULIB_MDA_CREAT@ GL_GNULIB_MDA_DUP = @GL_GNULIB_MDA_DUP@ GL_GNULIB_MDA_DUP2 = @GL_GNULIB_MDA_DUP2@ GL_GNULIB_MDA_ECVT = @GL_GNULIB_MDA_ECVT@ GL_GNULIB_MDA_EXECL = @GL_GNULIB_MDA_EXECL@ GL_GNULIB_MDA_EXECLE = @GL_GNULIB_MDA_EXECLE@ GL_GNULIB_MDA_EXECLP = @GL_GNULIB_MDA_EXECLP@ GL_GNULIB_MDA_EXECV = @GL_GNULIB_MDA_EXECV@ GL_GNULIB_MDA_EXECVE = @GL_GNULIB_MDA_EXECVE@ GL_GNULIB_MDA_EXECVP = @GL_GNULIB_MDA_EXECVP@ GL_GNULIB_MDA_EXECVPE = @GL_GNULIB_MDA_EXECVPE@ GL_GNULIB_MDA_FCLOSEALL = @GL_GNULIB_MDA_FCLOSEALL@ GL_GNULIB_MDA_FCVT = @GL_GNULIB_MDA_FCVT@ GL_GNULIB_MDA_FDOPEN = @GL_GNULIB_MDA_FDOPEN@ GL_GNULIB_MDA_FILENO = @GL_GNULIB_MDA_FILENO@ GL_GNULIB_MDA_GCVT = @GL_GNULIB_MDA_GCVT@ GL_GNULIB_MDA_GETCWD = @GL_GNULIB_MDA_GETCWD@ GL_GNULIB_MDA_GETPID = @GL_GNULIB_MDA_GETPID@ GL_GNULIB_MDA_GETW = @GL_GNULIB_MDA_GETW@ GL_GNULIB_MDA_ISATTY = @GL_GNULIB_MDA_ISATTY@ GL_GNULIB_MDA_LSEEK = @GL_GNULIB_MDA_LSEEK@ GL_GNULIB_MDA_MEMCCPY = @GL_GNULIB_MDA_MEMCCPY@ GL_GNULIB_MDA_MKDIR = @GL_GNULIB_MDA_MKDIR@ GL_GNULIB_MDA_MKTEMP = @GL_GNULIB_MDA_MKTEMP@ GL_GNULIB_MDA_OPEN = @GL_GNULIB_MDA_OPEN@ GL_GNULIB_MDA_PUTENV = @GL_GNULIB_MDA_PUTENV@ GL_GNULIB_MDA_PUTW = @GL_GNULIB_MDA_PUTW@ GL_GNULIB_MDA_READ = @GL_GNULIB_MDA_READ@ GL_GNULIB_MDA_RMDIR = @GL_GNULIB_MDA_RMDIR@ GL_GNULIB_MDA_STRDUP = @GL_GNULIB_MDA_STRDUP@ GL_GNULIB_MDA_SWAB = @GL_GNULIB_MDA_SWAB@ GL_GNULIB_MDA_TEMPNAM = @GL_GNULIB_MDA_TEMPNAM@ GL_GNULIB_MDA_TZSET = @GL_GNULIB_MDA_TZSET@ GL_GNULIB_MDA_UMASK = @GL_GNULIB_MDA_UMASK@ GL_GNULIB_MDA_UNLINK = @GL_GNULIB_MDA_UNLINK@ GL_GNULIB_MDA_WCSDUP = @GL_GNULIB_MDA_WCSDUP@ GL_GNULIB_MDA_WRITE = @GL_GNULIB_MDA_WRITE@ GL_GNULIB_MEMCHR = @GL_GNULIB_MEMCHR@ GL_GNULIB_MEMMEM = @GL_GNULIB_MEMMEM@ GL_GNULIB_MEMPCPY = @GL_GNULIB_MEMPCPY@ GL_GNULIB_MEMRCHR = @GL_GNULIB_MEMRCHR@ GL_GNULIB_MKDIR = @GL_GNULIB_MKDIR@ GL_GNULIB_MKDIRAT = @GL_GNULIB_MKDIRAT@ GL_GNULIB_MKDTEMP = @GL_GNULIB_MKDTEMP@ GL_GNULIB_MKFIFO = @GL_GNULIB_MKFIFO@ GL_GNULIB_MKFIFOAT = @GL_GNULIB_MKFIFOAT@ GL_GNULIB_MKNOD = @GL_GNULIB_MKNOD@ GL_GNULIB_MKNODAT = @GL_GNULIB_MKNODAT@ GL_GNULIB_MKOSTEMP = @GL_GNULIB_MKOSTEMP@ GL_GNULIB_MKOSTEMPS = @GL_GNULIB_MKOSTEMPS@ GL_GNULIB_MKSTEMP = @GL_GNULIB_MKSTEMP@ GL_GNULIB_MKSTEMPS = @GL_GNULIB_MKSTEMPS@ GL_GNULIB_MKTIME = @GL_GNULIB_MKTIME@ GL_GNULIB_NANOSLEEP = @GL_GNULIB_NANOSLEEP@ GL_GNULIB_NL_LANGINFO = @GL_GNULIB_NL_LANGINFO@ GL_GNULIB_NONBLOCKING = @GL_GNULIB_NONBLOCKING@ GL_GNULIB_OBSTACK_PRINTF = @GL_GNULIB_OBSTACK_PRINTF@ GL_GNULIB_OBSTACK_PRINTF_POSIX = @GL_GNULIB_OBSTACK_PRINTF_POSIX@ GL_GNULIB_OPEN = @GL_GNULIB_OPEN@ GL_GNULIB_OPENAT = @GL_GNULIB_OPENAT@ GL_GNULIB_OPENDIR = @GL_GNULIB_OPENDIR@ GL_GNULIB_OVERRIDES_STRUCT_STAT = @GL_GNULIB_OVERRIDES_STRUCT_STAT@ GL_GNULIB_PCLOSE = @GL_GNULIB_PCLOSE@ GL_GNULIB_PERROR = @GL_GNULIB_PERROR@ GL_GNULIB_PIPE = @GL_GNULIB_PIPE@ GL_GNULIB_PIPE2 = @GL_GNULIB_PIPE2@ GL_GNULIB_POPEN = @GL_GNULIB_POPEN@ GL_GNULIB_POSIX_MEMALIGN = @GL_GNULIB_POSIX_MEMALIGN@ GL_GNULIB_POSIX_OPENPT = @GL_GNULIB_POSIX_OPENPT@ GL_GNULIB_PREAD = @GL_GNULIB_PREAD@ GL_GNULIB_PRINTF = @GL_GNULIB_PRINTF@ GL_GNULIB_PRINTF_POSIX = @GL_GNULIB_PRINTF_POSIX@ GL_GNULIB_PTSNAME = @GL_GNULIB_PTSNAME@ GL_GNULIB_PTSNAME_R = @GL_GNULIB_PTSNAME_R@ GL_GNULIB_PUTC = @GL_GNULIB_PUTC@ GL_GNULIB_PUTCHAR = @GL_GNULIB_PUTCHAR@ GL_GNULIB_PUTENV = @GL_GNULIB_PUTENV@ GL_GNULIB_PUTS = @GL_GNULIB_PUTS@ GL_GNULIB_PWRITE = @GL_GNULIB_PWRITE@ GL_GNULIB_QSORT_R = @GL_GNULIB_QSORT_R@ GL_GNULIB_RANDOM = @GL_GNULIB_RANDOM@ GL_GNULIB_RANDOM_R = @GL_GNULIB_RANDOM_R@ GL_GNULIB_RAWMEMCHR = @GL_GNULIB_RAWMEMCHR@ GL_GNULIB_READ = @GL_GNULIB_READ@ GL_GNULIB_READDIR = @GL_GNULIB_READDIR@ GL_GNULIB_READLINK = @GL_GNULIB_READLINK@ GL_GNULIB_READLINKAT = @GL_GNULIB_READLINKAT@ GL_GNULIB_REALLOCARRAY = @GL_GNULIB_REALLOCARRAY@ GL_GNULIB_REALLOC_GNU = @GL_GNULIB_REALLOC_GNU@ GL_GNULIB_REALLOC_POSIX = @GL_GNULIB_REALLOC_POSIX@ GL_GNULIB_REALPATH = @GL_GNULIB_REALPATH@ GL_GNULIB_REMOVE = @GL_GNULIB_REMOVE@ GL_GNULIB_RENAME = @GL_GNULIB_RENAME@ GL_GNULIB_RENAMEAT = @GL_GNULIB_RENAMEAT@ GL_GNULIB_REWINDDIR = @GL_GNULIB_REWINDDIR@ GL_GNULIB_RMDIR = @GL_GNULIB_RMDIR@ GL_GNULIB_RPMATCH = @GL_GNULIB_RPMATCH@ GL_GNULIB_SCANDIR = @GL_GNULIB_SCANDIR@ GL_GNULIB_SCANF = @GL_GNULIB_SCANF@ GL_GNULIB_SECURE_GETENV = @GL_GNULIB_SECURE_GETENV@ GL_GNULIB_SETENV = @GL_GNULIB_SETENV@ GL_GNULIB_SETHOSTNAME = @GL_GNULIB_SETHOSTNAME@ GL_GNULIB_SETLOCALE = @GL_GNULIB_SETLOCALE@ GL_GNULIB_SETLOCALE_NULL = @GL_GNULIB_SETLOCALE_NULL@ GL_GNULIB_SIGABBREV_NP = @GL_GNULIB_SIGABBREV_NP@ GL_GNULIB_SIGDESCR_NP = @GL_GNULIB_SIGDESCR_NP@ GL_GNULIB_SLEEP = @GL_GNULIB_SLEEP@ GL_GNULIB_SNPRINTF = @GL_GNULIB_SNPRINTF@ GL_GNULIB_SPRINTF_POSIX = @GL_GNULIB_SPRINTF_POSIX@ GL_GNULIB_STAT = @GL_GNULIB_STAT@ GL_GNULIB_STDIO_H_NONBLOCKING = @GL_GNULIB_STDIO_H_NONBLOCKING@ GL_GNULIB_STDIO_H_SIGPIPE = @GL_GNULIB_STDIO_H_SIGPIPE@ GL_GNULIB_STPCPY = @GL_GNULIB_STPCPY@ GL_GNULIB_STPNCPY = @GL_GNULIB_STPNCPY@ GL_GNULIB_STRCASESTR = @GL_GNULIB_STRCASESTR@ GL_GNULIB_STRCHRNUL = @GL_GNULIB_STRCHRNUL@ GL_GNULIB_STRDUP = @GL_GNULIB_STRDUP@ GL_GNULIB_STRERROR = @GL_GNULIB_STRERROR@ GL_GNULIB_STRERRORNAME_NP = @GL_GNULIB_STRERRORNAME_NP@ GL_GNULIB_STRERROR_R = @GL_GNULIB_STRERROR_R@ GL_GNULIB_STRFTIME = @GL_GNULIB_STRFTIME@ GL_GNULIB_STRNCAT = @GL_GNULIB_STRNCAT@ GL_GNULIB_STRNDUP = @GL_GNULIB_STRNDUP@ GL_GNULIB_STRNLEN = @GL_GNULIB_STRNLEN@ GL_GNULIB_STRPBRK = @GL_GNULIB_STRPBRK@ GL_GNULIB_STRPTIME = @GL_GNULIB_STRPTIME@ GL_GNULIB_STRSEP = @GL_GNULIB_STRSEP@ GL_GNULIB_STRSIGNAL = @GL_GNULIB_STRSIGNAL@ GL_GNULIB_STRSTR = @GL_GNULIB_STRSTR@ GL_GNULIB_STRTOD = @GL_GNULIB_STRTOD@ GL_GNULIB_STRTOIMAX = @GL_GNULIB_STRTOIMAX@ GL_GNULIB_STRTOK_R = @GL_GNULIB_STRTOK_R@ GL_GNULIB_STRTOL = @GL_GNULIB_STRTOL@ GL_GNULIB_STRTOLD = @GL_GNULIB_STRTOLD@ GL_GNULIB_STRTOLL = @GL_GNULIB_STRTOLL@ GL_GNULIB_STRTOUL = @GL_GNULIB_STRTOUL@ GL_GNULIB_STRTOULL = @GL_GNULIB_STRTOULL@ GL_GNULIB_STRTOUMAX = @GL_GNULIB_STRTOUMAX@ GL_GNULIB_STRVERSCMP = @GL_GNULIB_STRVERSCMP@ GL_GNULIB_SYMLINK = @GL_GNULIB_SYMLINK@ GL_GNULIB_SYMLINKAT = @GL_GNULIB_SYMLINKAT@ GL_GNULIB_SYSTEM_POSIX = @GL_GNULIB_SYSTEM_POSIX@ GL_GNULIB_TIMEGM = @GL_GNULIB_TIMEGM@ GL_GNULIB_TIMESPEC_GET = @GL_GNULIB_TIMESPEC_GET@ GL_GNULIB_TIMESPEC_GETRES = @GL_GNULIB_TIMESPEC_GETRES@ GL_GNULIB_TIME_R = @GL_GNULIB_TIME_R@ GL_GNULIB_TIME_RZ = @GL_GNULIB_TIME_RZ@ GL_GNULIB_TMPFILE = @GL_GNULIB_TMPFILE@ GL_GNULIB_TOWCTRANS = @GL_GNULIB_TOWCTRANS@ GL_GNULIB_TRUNCATE = @GL_GNULIB_TRUNCATE@ GL_GNULIB_TTYNAME_R = @GL_GNULIB_TTYNAME_R@ GL_GNULIB_TZSET = @GL_GNULIB_TZSET@ GL_GNULIB_UNISTD_H_GETOPT = @GL_GNULIB_UNISTD_H_GETOPT@ GL_GNULIB_UNISTD_H_NONBLOCKING = @GL_GNULIB_UNISTD_H_NONBLOCKING@ GL_GNULIB_UNISTD_H_SIGPIPE = @GL_GNULIB_UNISTD_H_SIGPIPE@ GL_GNULIB_UNLINK = @GL_GNULIB_UNLINK@ GL_GNULIB_UNLINKAT = @GL_GNULIB_UNLINKAT@ GL_GNULIB_UNLOCKPT = @GL_GNULIB_UNLOCKPT@ GL_GNULIB_UNSETENV = @GL_GNULIB_UNSETENV@ GL_GNULIB_USLEEP = @GL_GNULIB_USLEEP@ GL_GNULIB_UTIMENSAT = @GL_GNULIB_UTIMENSAT@ GL_GNULIB_VASPRINTF = @GL_GNULIB_VASPRINTF@ GL_GNULIB_VDPRINTF = @GL_GNULIB_VDPRINTF@ GL_GNULIB_VFPRINTF = @GL_GNULIB_VFPRINTF@ GL_GNULIB_VFPRINTF_POSIX = @GL_GNULIB_VFPRINTF_POSIX@ GL_GNULIB_VFSCANF = @GL_GNULIB_VFSCANF@ GL_GNULIB_VPRINTF = @GL_GNULIB_VPRINTF@ GL_GNULIB_VPRINTF_POSIX = @GL_GNULIB_VPRINTF_POSIX@ GL_GNULIB_VSCANF = @GL_GNULIB_VSCANF@ GL_GNULIB_VSNPRINTF = @GL_GNULIB_VSNPRINTF@ GL_GNULIB_VSPRINTF_POSIX = @GL_GNULIB_VSPRINTF_POSIX@ GL_GNULIB_WCPCPY = @GL_GNULIB_WCPCPY@ GL_GNULIB_WCPNCPY = @GL_GNULIB_WCPNCPY@ GL_GNULIB_WCRTOMB = @GL_GNULIB_WCRTOMB@ GL_GNULIB_WCSCASECMP = @GL_GNULIB_WCSCASECMP@ GL_GNULIB_WCSCAT = @GL_GNULIB_WCSCAT@ GL_GNULIB_WCSCHR = @GL_GNULIB_WCSCHR@ GL_GNULIB_WCSCMP = @GL_GNULIB_WCSCMP@ GL_GNULIB_WCSCOLL = @GL_GNULIB_WCSCOLL@ GL_GNULIB_WCSCPY = @GL_GNULIB_WCSCPY@ GL_GNULIB_WCSCSPN = @GL_GNULIB_WCSCSPN@ GL_GNULIB_WCSDUP = @GL_GNULIB_WCSDUP@ GL_GNULIB_WCSFTIME = @GL_GNULIB_WCSFTIME@ GL_GNULIB_WCSLEN = @GL_GNULIB_WCSLEN@ GL_GNULIB_WCSNCASECMP = @GL_GNULIB_WCSNCASECMP@ GL_GNULIB_WCSNCAT = @GL_GNULIB_WCSNCAT@ GL_GNULIB_WCSNCMP = @GL_GNULIB_WCSNCMP@ GL_GNULIB_WCSNCPY = @GL_GNULIB_WCSNCPY@ GL_GNULIB_WCSNLEN = @GL_GNULIB_WCSNLEN@ GL_GNULIB_WCSNRTOMBS = @GL_GNULIB_WCSNRTOMBS@ GL_GNULIB_WCSPBRK = @GL_GNULIB_WCSPBRK@ GL_GNULIB_WCSRCHR = @GL_GNULIB_WCSRCHR@ GL_GNULIB_WCSRTOMBS = @GL_GNULIB_WCSRTOMBS@ GL_GNULIB_WCSSPN = @GL_GNULIB_WCSSPN@ GL_GNULIB_WCSSTR = @GL_GNULIB_WCSSTR@ GL_GNULIB_WCSTOK = @GL_GNULIB_WCSTOK@ GL_GNULIB_WCSWIDTH = @GL_GNULIB_WCSWIDTH@ GL_GNULIB_WCSXFRM = @GL_GNULIB_WCSXFRM@ GL_GNULIB_WCTOB = @GL_GNULIB_WCTOB@ GL_GNULIB_WCTOMB = @GL_GNULIB_WCTOMB@ GL_GNULIB_WCTRANS = @GL_GNULIB_WCTRANS@ GL_GNULIB_WCTYPE = @GL_GNULIB_WCTYPE@ GL_GNULIB_WCWIDTH = @GL_GNULIB_WCWIDTH@ GL_GNULIB_WMEMCHR = @GL_GNULIB_WMEMCHR@ GL_GNULIB_WMEMCMP = @GL_GNULIB_WMEMCMP@ GL_GNULIB_WMEMCPY = @GL_GNULIB_WMEMCPY@ GL_GNULIB_WMEMMOVE = @GL_GNULIB_WMEMMOVE@ GL_GNULIB_WMEMPCPY = @GL_GNULIB_WMEMPCPY@ GL_GNULIB_WMEMSET = @GL_GNULIB_WMEMSET@ GL_GNULIB_WRITE = @GL_GNULIB_WRITE@ GL_GNULIB__EXIT = @GL_GNULIB__EXIT@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GNULIBHEADERS_OVERRIDE_WINT_T = @GNULIBHEADERS_OVERRIDE_WINT_T@ GNULIB_GETTIMEOFDAY = @GNULIB_GETTIMEOFDAY@ GREP = @GREP@ GRUB_BOOT_MACHINE_LINK_ADDR = @GRUB_BOOT_MACHINE_LINK_ADDR@ GRUB_PLATFORM = @GRUB_PLATFORM@ GRUB_STACK_PROTECTOR_INIT = @GRUB_STACK_PROTECTOR_INIT@ GRUB_TARGET_CPU = @GRUB_TARGET_CPU@ HAVE_ALIGNED_ALLOC = @HAVE_ALIGNED_ALLOC@ HAVE_ALLOCA_H = @HAVE_ALLOCA_H@ HAVE_ALPHASORT = @HAVE_ALPHASORT@ HAVE_ASM_USCORE = @HAVE_ASM_USCORE@ HAVE_ATOLL = @HAVE_ATOLL@ HAVE_BTOWC = @HAVE_BTOWC@ HAVE_C99_STDINT_H = @HAVE_C99_STDINT_H@ HAVE_CANONICALIZE_FILE_NAME = @HAVE_CANONICALIZE_FILE_NAME@ HAVE_CHOWN = @HAVE_CHOWN@ HAVE_CLOSEDIR = @HAVE_CLOSEDIR@ HAVE_COPY_FILE_RANGE = @HAVE_COPY_FILE_RANGE@ HAVE_CRTDEFS_H = @HAVE_CRTDEFS_H@ HAVE_CXX = @HAVE_CXX@ HAVE_DECL_DIRFD = @HAVE_DECL_DIRFD@ HAVE_DECL_ECVT = @HAVE_DECL_ECVT@ HAVE_DECL_ENVIRON = @HAVE_DECL_ENVIRON@ HAVE_DECL_EXECVPE = @HAVE_DECL_EXECVPE@ HAVE_DECL_FCHDIR = @HAVE_DECL_FCHDIR@ HAVE_DECL_FCLOSEALL = @HAVE_DECL_FCLOSEALL@ HAVE_DECL_FCVT = @HAVE_DECL_FCVT@ HAVE_DECL_FDATASYNC = @HAVE_DECL_FDATASYNC@ HAVE_DECL_FDOPENDIR = @HAVE_DECL_FDOPENDIR@ HAVE_DECL_FPURGE = @HAVE_DECL_FPURGE@ HAVE_DECL_FSEEKO = @HAVE_DECL_FSEEKO@ HAVE_DECL_FTELLO = @HAVE_DECL_FTELLO@ HAVE_DECL_GCVT = @HAVE_DECL_GCVT@ HAVE_DECL_GETDELIM = @HAVE_DECL_GETDELIM@ HAVE_DECL_GETDOMAINNAME = @HAVE_DECL_GETDOMAINNAME@ HAVE_DECL_GETLINE = @HAVE_DECL_GETLINE@ HAVE_DECL_GETLOADAVG = @HAVE_DECL_GETLOADAVG@ HAVE_DECL_GETLOGIN = @HAVE_DECL_GETLOGIN@ HAVE_DECL_GETLOGIN_R = @HAVE_DECL_GETLOGIN_R@ HAVE_DECL_GETPAGESIZE = @HAVE_DECL_GETPAGESIZE@ HAVE_DECL_GETUSERSHELL = @HAVE_DECL_GETUSERSHELL@ HAVE_DECL_IMAXABS = @HAVE_DECL_IMAXABS@ HAVE_DECL_IMAXDIV = @HAVE_DECL_IMAXDIV@ HAVE_DECL_INITSTATE = @HAVE_DECL_INITSTATE@ HAVE_DECL_LOCALTIME_R = @HAVE_DECL_LOCALTIME_R@ HAVE_DECL_MEMMEM = @HAVE_DECL_MEMMEM@ HAVE_DECL_MEMRCHR = @HAVE_DECL_MEMRCHR@ HAVE_DECL_OBSTACK_PRINTF = @HAVE_DECL_OBSTACK_PRINTF@ HAVE_DECL_SETENV = @HAVE_DECL_SETENV@ HAVE_DECL_SETHOSTNAME = @HAVE_DECL_SETHOSTNAME@ HAVE_DECL_SETSTATE = @HAVE_DECL_SETSTATE@ HAVE_DECL_SNPRINTF = @HAVE_DECL_SNPRINTF@ HAVE_DECL_STRDUP = @HAVE_DECL_STRDUP@ HAVE_DECL_STRERROR_R = @HAVE_DECL_STRERROR_R@ HAVE_DECL_STRNCASECMP = @HAVE_DECL_STRNCASECMP@ HAVE_DECL_STRNDUP = @HAVE_DECL_STRNDUP@ HAVE_DECL_STRNLEN = @HAVE_DECL_STRNLEN@ HAVE_DECL_STRSIGNAL = @HAVE_DECL_STRSIGNAL@ HAVE_DECL_STRTOIMAX = @HAVE_DECL_STRTOIMAX@ HAVE_DECL_STRTOK_R = @HAVE_DECL_STRTOK_R@ HAVE_DECL_STRTOUMAX = @HAVE_DECL_STRTOUMAX@ HAVE_DECL_TRUNCATE = @HAVE_DECL_TRUNCATE@ HAVE_DECL_TTYNAME_R = @HAVE_DECL_TTYNAME_R@ HAVE_DECL_UNSETENV = @HAVE_DECL_UNSETENV@ HAVE_DECL_VSNPRINTF = @HAVE_DECL_VSNPRINTF@ HAVE_DECL_WCSDUP = @HAVE_DECL_WCSDUP@ HAVE_DECL_WCTOB = @HAVE_DECL_WCTOB@ HAVE_DECL_WCWIDTH = @HAVE_DECL_WCWIDTH@ HAVE_DIRENT_H = @HAVE_DIRENT_H@ HAVE_DPRINTF = @HAVE_DPRINTF@ HAVE_DUP3 = @HAVE_DUP3@ HAVE_DUPLOCALE = @HAVE_DUPLOCALE@ HAVE_EUIDACCESS = @HAVE_EUIDACCESS@ HAVE_EXECVPE = @HAVE_EXECVPE@ HAVE_EXPLICIT_BZERO = @HAVE_EXPLICIT_BZERO@ HAVE_FACCESSAT = @HAVE_FACCESSAT@ HAVE_FCHDIR = @HAVE_FCHDIR@ HAVE_FCHMODAT = @HAVE_FCHMODAT@ HAVE_FCHOWNAT = @HAVE_FCHOWNAT@ HAVE_FCNTL = @HAVE_FCNTL@ HAVE_FDATASYNC = @HAVE_FDATASYNC@ HAVE_FDOPENDIR = @HAVE_FDOPENDIR@ HAVE_FEATURES_H = @HAVE_FEATURES_H@ HAVE_FFS = @HAVE_FFS@ HAVE_FFSL = @HAVE_FFSL@ HAVE_FFSLL = @HAVE_FFSLL@ HAVE_FNMATCH = @HAVE_FNMATCH@ HAVE_FNMATCH_H = @HAVE_FNMATCH_H@ HAVE_FONT_SOURCE = @HAVE_FONT_SOURCE@ HAVE_FREELOCALE = @HAVE_FREELOCALE@ HAVE_FSEEKO = @HAVE_FSEEKO@ HAVE_FSTATAT = @HAVE_FSTATAT@ HAVE_FSYNC = @HAVE_FSYNC@ HAVE_FTELLO = @HAVE_FTELLO@ HAVE_FTRUNCATE = @HAVE_FTRUNCATE@ HAVE_FUTIMENS = @HAVE_FUTIMENS@ HAVE_GETDTABLESIZE = @HAVE_GETDTABLESIZE@ HAVE_GETENTROPY = @HAVE_GETENTROPY@ HAVE_GETGROUPS = @HAVE_GETGROUPS@ HAVE_GETHOSTNAME = @HAVE_GETHOSTNAME@ HAVE_GETLOGIN = @HAVE_GETLOGIN@ HAVE_GETOPT_H = @HAVE_GETOPT_H@ HAVE_GETPAGESIZE = @HAVE_GETPAGESIZE@ HAVE_GETPASS = @HAVE_GETPASS@ HAVE_GETSUBOPT = @HAVE_GETSUBOPT@ HAVE_GETUMASK = @HAVE_GETUMASK@ HAVE_GRANTPT = @HAVE_GRANTPT@ HAVE_GROUP_MEMBER = @HAVE_GROUP_MEMBER@ HAVE_IMAXDIV_T = @HAVE_IMAXDIV_T@ HAVE_INITSTATE = @HAVE_INITSTATE@ HAVE_INTTYPES_H = @HAVE_INTTYPES_H@ HAVE_ISBLANK = @HAVE_ISBLANK@ HAVE_ISWBLANK = @HAVE_ISWBLANK@ HAVE_ISWCNTRL = @HAVE_ISWCNTRL@ HAVE_LANGINFO_ALTMON = @HAVE_LANGINFO_ALTMON@ HAVE_LANGINFO_CODESET = @HAVE_LANGINFO_CODESET@ HAVE_LANGINFO_ERA = @HAVE_LANGINFO_ERA@ HAVE_LANGINFO_H = @HAVE_LANGINFO_H@ HAVE_LANGINFO_T_FMT_AMPM = @HAVE_LANGINFO_T_FMT_AMPM@ HAVE_LANGINFO_YESEXPR = @HAVE_LANGINFO_YESEXPR@ HAVE_LCHMOD = @HAVE_LCHMOD@ HAVE_LCHOWN = @HAVE_LCHOWN@ HAVE_LINK = @HAVE_LINK@ HAVE_LINKAT = @HAVE_LINKAT@ HAVE_LSTAT = @HAVE_LSTAT@ HAVE_MAX_ALIGN_T = @HAVE_MAX_ALIGN_T@ HAVE_MBRLEN = @HAVE_MBRLEN@ HAVE_MBRTOWC = @HAVE_MBRTOWC@ HAVE_MBSINIT = @HAVE_MBSINIT@ HAVE_MBSLEN = @HAVE_MBSLEN@ HAVE_MBSNRTOWCS = @HAVE_MBSNRTOWCS@ HAVE_MBSRTOWCS = @HAVE_MBSRTOWCS@ HAVE_MBTOWC = @HAVE_MBTOWC@ HAVE_MEMPCPY = @HAVE_MEMPCPY@ HAVE_MKDIRAT = @HAVE_MKDIRAT@ HAVE_MKDTEMP = @HAVE_MKDTEMP@ HAVE_MKFIFO = @HAVE_MKFIFO@ HAVE_MKFIFOAT = @HAVE_MKFIFOAT@ HAVE_MKNOD = @HAVE_MKNOD@ HAVE_MKNODAT = @HAVE_MKNODAT@ HAVE_MKOSTEMP = @HAVE_MKOSTEMP@ HAVE_MKOSTEMPS = @HAVE_MKOSTEMPS@ HAVE_MKSTEMP = @HAVE_MKSTEMP@ HAVE_MKSTEMPS = @HAVE_MKSTEMPS@ HAVE_MSVC_INVALID_PARAMETER_HANDLER = @HAVE_MSVC_INVALID_PARAMETER_HANDLER@ HAVE_NANOSLEEP = @HAVE_NANOSLEEP@ HAVE_NEWLOCALE = @HAVE_NEWLOCALE@ HAVE_NL_LANGINFO = @HAVE_NL_LANGINFO@ HAVE_OPENAT = @HAVE_OPENAT@ HAVE_OPENDIR = @HAVE_OPENDIR@ HAVE_OS_H = @HAVE_OS_H@ HAVE_PCLOSE = @HAVE_PCLOSE@ HAVE_PIPE = @HAVE_PIPE@ HAVE_PIPE2 = @HAVE_PIPE2@ HAVE_POPEN = @HAVE_POPEN@ HAVE_POSIX_MEMALIGN = @HAVE_POSIX_MEMALIGN@ HAVE_POSIX_OPENPT = @HAVE_POSIX_OPENPT@ HAVE_PREAD = @HAVE_PREAD@ HAVE_PTSNAME = @HAVE_PTSNAME@ HAVE_PTSNAME_R = @HAVE_PTSNAME_R@ HAVE_PWRITE = @HAVE_PWRITE@ HAVE_QSORT_R = @HAVE_QSORT_R@ HAVE_RANDOM = @HAVE_RANDOM@ HAVE_RANDOM_H = @HAVE_RANDOM_H@ HAVE_RANDOM_R = @HAVE_RANDOM_R@ HAVE_RAWMEMCHR = @HAVE_RAWMEMCHR@ HAVE_READDIR = @HAVE_READDIR@ HAVE_READLINK = @HAVE_READLINK@ HAVE_READLINKAT = @HAVE_READLINKAT@ HAVE_REALLOCARRAY = @HAVE_REALLOCARRAY@ HAVE_REALPATH = @HAVE_REALPATH@ HAVE_RENAMEAT = @HAVE_RENAMEAT@ HAVE_REWINDDIR = @HAVE_REWINDDIR@ HAVE_RPMATCH = @HAVE_RPMATCH@ HAVE_SCANDIR = @HAVE_SCANDIR@ HAVE_SDL2 = @HAVE_SDL2@ HAVE_SECURE_GETENV = @HAVE_SECURE_GETENV@ HAVE_SETENV = @HAVE_SETENV@ HAVE_SETHOSTNAME = @HAVE_SETHOSTNAME@ HAVE_SETSTATE = @HAVE_SETSTATE@ HAVE_SIGABBREV_NP = @HAVE_SIGABBREV_NP@ HAVE_SIGDESCR_NP = @HAVE_SIGDESCR_NP@ HAVE_SIGNED_SIG_ATOMIC_T = @HAVE_SIGNED_SIG_ATOMIC_T@ HAVE_SIGNED_WCHAR_T = @HAVE_SIGNED_WCHAR_T@ HAVE_SIGNED_WINT_T = @HAVE_SIGNED_WINT_T@ HAVE_SLEEP = @HAVE_SLEEP@ HAVE_STDINT_H = @HAVE_STDINT_H@ HAVE_STPCPY = @HAVE_STPCPY@ HAVE_STPNCPY = @HAVE_STPNCPY@ HAVE_STRCASECMP = @HAVE_STRCASECMP@ HAVE_STRCASESTR = @HAVE_STRCASESTR@ HAVE_STRCHRNUL = @HAVE_STRCHRNUL@ HAVE_STRERRORNAME_NP = @HAVE_STRERRORNAME_NP@ HAVE_STRINGS_H = @HAVE_STRINGS_H@ HAVE_STRPBRK = @HAVE_STRPBRK@ HAVE_STRPTIME = @HAVE_STRPTIME@ HAVE_STRSEP = @HAVE_STRSEP@ HAVE_STRTOD = @HAVE_STRTOD@ HAVE_STRTOL = @HAVE_STRTOL@ HAVE_STRTOLD = @HAVE_STRTOLD@ HAVE_STRTOLL = @HAVE_STRTOLL@ HAVE_STRTOUL = @HAVE_STRTOUL@ HAVE_STRTOULL = @HAVE_STRTOULL@ HAVE_STRUCT_RANDOM_DATA = @HAVE_STRUCT_RANDOM_DATA@ HAVE_STRVERSCMP = @HAVE_STRVERSCMP@ HAVE_SYMLINK = @HAVE_SYMLINK@ HAVE_SYMLINKAT = @HAVE_SYMLINKAT@ HAVE_SYSEXITS_H = @HAVE_SYSEXITS_H@ HAVE_SYS_BITYPES_H = @HAVE_SYS_BITYPES_H@ HAVE_SYS_CDEFS_H = @HAVE_SYS_CDEFS_H@ HAVE_SYS_INTTYPES_H = @HAVE_SYS_INTTYPES_H@ HAVE_SYS_LOADAVG_H = @HAVE_SYS_LOADAVG_H@ HAVE_SYS_PARAM_H = @HAVE_SYS_PARAM_H@ HAVE_SYS_TYPES_H = @HAVE_SYS_TYPES_H@ HAVE_TIMEGM = @HAVE_TIMEGM@ HAVE_TIMESPEC_GET = @HAVE_TIMESPEC_GET@ HAVE_TIMESPEC_GETRES = @HAVE_TIMESPEC_GETRES@ HAVE_TIMEZONE_T = @HAVE_TIMEZONE_T@ HAVE_UNISTD_H = @HAVE_UNISTD_H@ HAVE_UNLINKAT = @HAVE_UNLINKAT@ HAVE_UNLOCKPT = @HAVE_UNLOCKPT@ HAVE_USLEEP = @HAVE_USLEEP@ HAVE_UTIMENSAT = @HAVE_UTIMENSAT@ HAVE_VASPRINTF = @HAVE_VASPRINTF@ HAVE_VDPRINTF = @HAVE_VDPRINTF@ HAVE_VISIBILITY = @HAVE_VISIBILITY@ HAVE_WCHAR_H = @HAVE_WCHAR_H@ HAVE_WCHAR_T = @HAVE_WCHAR_T@ HAVE_WCPCPY = @HAVE_WCPCPY@ HAVE_WCPNCPY = @HAVE_WCPNCPY@ HAVE_WCRTOMB = @HAVE_WCRTOMB@ HAVE_WCSCASECMP = @HAVE_WCSCASECMP@ HAVE_WCSCAT = @HAVE_WCSCAT@ HAVE_WCSCHR = @HAVE_WCSCHR@ HAVE_WCSCMP = @HAVE_WCSCMP@ HAVE_WCSCOLL = @HAVE_WCSCOLL@ HAVE_WCSCPY = @HAVE_WCSCPY@ HAVE_WCSCSPN = @HAVE_WCSCSPN@ HAVE_WCSDUP = @HAVE_WCSDUP@ HAVE_WCSFTIME = @HAVE_WCSFTIME@ HAVE_WCSLEN = @HAVE_WCSLEN@ HAVE_WCSNCASECMP = @HAVE_WCSNCASECMP@ HAVE_WCSNCAT = @HAVE_WCSNCAT@ HAVE_WCSNCMP = @HAVE_WCSNCMP@ HAVE_WCSNCPY = @HAVE_WCSNCPY@ HAVE_WCSNLEN = @HAVE_WCSNLEN@ HAVE_WCSNRTOMBS = @HAVE_WCSNRTOMBS@ HAVE_WCSPBRK = @HAVE_WCSPBRK@ HAVE_WCSRCHR = @HAVE_WCSRCHR@ HAVE_WCSRTOMBS = @HAVE_WCSRTOMBS@ HAVE_WCSSPN = @HAVE_WCSSPN@ HAVE_WCSSTR = @HAVE_WCSSTR@ HAVE_WCSTOK = @HAVE_WCSTOK@ HAVE_WCSWIDTH = @HAVE_WCSWIDTH@ HAVE_WCSXFRM = @HAVE_WCSXFRM@ HAVE_WCTRANS_T = @HAVE_WCTRANS_T@ HAVE_WCTYPE_H = @HAVE_WCTYPE_H@ HAVE_WCTYPE_T = @HAVE_WCTYPE_T@ HAVE_WINSOCK2_H = @HAVE_WINSOCK2_H@ HAVE_WINT_T = @HAVE_WINT_T@ HAVE_WMEMCHR = @HAVE_WMEMCHR@ HAVE_WMEMCMP = @HAVE_WMEMCMP@ HAVE_WMEMCPY = @HAVE_WMEMCPY@ HAVE_WMEMMOVE = @HAVE_WMEMMOVE@ HAVE_WMEMPCPY = @HAVE_WMEMPCPY@ HAVE_WMEMSET = @HAVE_WMEMSET@ HAVE_XLOCALE_H = @HAVE_XLOCALE_H@ HAVE__BOOL = @HAVE__BOOL@ HAVE__EXIT = @HAVE__EXIT@ HELP2MAN = @HELP2MAN@ HOST_CC = @HOST_CC@ HOST_CCASFLAGS = @HOST_CCASFLAGS@ HOST_CFLAGS = @HOST_CFLAGS@ HOST_CPPFLAGS = @HOST_CPPFLAGS@ HOST_LDFLAGS = @HOST_LDFLAGS@ INCLUDE_NEXT = @INCLUDE_NEXT@ INCLUDE_NEXT_AS_FIRST_DIRECTIVE = @INCLUDE_NEXT_AS_FIRST_DIRECTIVE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INT32_MAX_LT_INTMAX_MAX = @INT32_MAX_LT_INTMAX_MAX@ INT64_MAX_EQ_LONG_MAX = @INT64_MAX_EQ_LONG_MAX@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBDEVMAPPER = @LIBDEVMAPPER@ LIBGEOM = @LIBGEOM@ LIBGNU_LIBDEPS = @LIBGNU_LIBDEPS@ LIBGNU_LTLIBDEPS = @LIBGNU_LTLIBDEPS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBLZMA = @LIBLZMA@ LIBMULTITHREAD = @LIBMULTITHREAD@ LIBNVPAIR = @LIBNVPAIR@ LIBOBJS = @LIBOBJS@ LIBPCIACCESS = @LIBPCIACCESS@ LIBPMULTITHREAD = @LIBPMULTITHREAD@ LIBPTHREAD = @LIBPTHREAD@ LIBS = @LIBS@ LIBSDL = @LIBSDL@ LIBSTDTHREAD = @LIBSTDTHREAD@ LIBTASN1 = @LIBTASN1@ LIBTHREAD = @LIBTHREAD@ LIBUNISTRING_UNITYPES_H = @LIBUNISTRING_UNITYPES_H@ LIBUNISTRING_UNIWIDTH_H = @LIBUNISTRING_UNIWIDTH_H@ LIBUTIL = @LIBUTIL@ LIBZFS = @LIBZFS@ LIB_HARD_LOCALE = @LIB_HARD_LOCALE@ LIB_MBRTOWC = @LIB_MBRTOWC@ LIB_NL_LANGINFO = @LIB_NL_LANGINFO@ LIB_SCHED_YIELD = @LIB_SCHED_YIELD@ LIB_SETLOCALE_NULL = @LIB_SETLOCALE_NULL@ LIMITS_H = @LIMITS_H@ LN_S = @LN_S@ LOCALCHARSET_TESTS_ENVIRONMENT = @LOCALCHARSET_TESTS_ENVIRONMENT@ LOCALENAME_ENHANCE_LOCALE_FUNCS = @LOCALENAME_ENHANCE_LOCALE_FUNCS@ LOCALE_FR = @LOCALE_FR@ LOCALE_FR_UTF8 = @LOCALE_FR_UTF8@ LOCALE_JA = @LOCALE_JA@ LOCALE_ZH_CN = @LOCALE_ZH_CN@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBMULTITHREAD = @LTLIBMULTITHREAD@ LTLIBOBJS = @LTLIBOBJS@ LTLIBTHREAD = @LTLIBTHREAD@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MM_DEBUG = @MM_DEBUG@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NEXT_AS_FIRST_DIRECTIVE_CTYPE_H = @NEXT_AS_FIRST_DIRECTIVE_CTYPE_H@ NEXT_AS_FIRST_DIRECTIVE_DIRENT_H = @NEXT_AS_FIRST_DIRECTIVE_DIRENT_H@ NEXT_AS_FIRST_DIRECTIVE_ERRNO_H = @NEXT_AS_FIRST_DIRECTIVE_ERRNO_H@ NEXT_AS_FIRST_DIRECTIVE_FCNTL_H = @NEXT_AS_FIRST_DIRECTIVE_FCNTL_H@ NEXT_AS_FIRST_DIRECTIVE_FLOAT_H = @NEXT_AS_FIRST_DIRECTIVE_FLOAT_H@ NEXT_AS_FIRST_DIRECTIVE_FNMATCH_H = @NEXT_AS_FIRST_DIRECTIVE_FNMATCH_H@ NEXT_AS_FIRST_DIRECTIVE_GETOPT_H = @NEXT_AS_FIRST_DIRECTIVE_GETOPT_H@ NEXT_AS_FIRST_DIRECTIVE_INTTYPES_H = @NEXT_AS_FIRST_DIRECTIVE_INTTYPES_H@ NEXT_AS_FIRST_DIRECTIVE_LANGINFO_H = @NEXT_AS_FIRST_DIRECTIVE_LANGINFO_H@ NEXT_AS_FIRST_DIRECTIVE_LIMITS_H = @NEXT_AS_FIRST_DIRECTIVE_LIMITS_H@ NEXT_AS_FIRST_DIRECTIVE_LOCALE_H = @NEXT_AS_FIRST_DIRECTIVE_LOCALE_H@ NEXT_AS_FIRST_DIRECTIVE_STDDEF_H = @NEXT_AS_FIRST_DIRECTIVE_STDDEF_H@ NEXT_AS_FIRST_DIRECTIVE_STDINT_H = @NEXT_AS_FIRST_DIRECTIVE_STDINT_H@ NEXT_AS_FIRST_DIRECTIVE_STDIO_H = @NEXT_AS_FIRST_DIRECTIVE_STDIO_H@ NEXT_AS_FIRST_DIRECTIVE_STDLIB_H = @NEXT_AS_FIRST_DIRECTIVE_STDLIB_H@ NEXT_AS_FIRST_DIRECTIVE_STRINGS_H = @NEXT_AS_FIRST_DIRECTIVE_STRINGS_H@ NEXT_AS_FIRST_DIRECTIVE_STRING_H = @NEXT_AS_FIRST_DIRECTIVE_STRING_H@ NEXT_AS_FIRST_DIRECTIVE_SYSEXITS_H = @NEXT_AS_FIRST_DIRECTIVE_SYSEXITS_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H@ NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H@ NEXT_AS_FIRST_DIRECTIVE_TIME_H = @NEXT_AS_FIRST_DIRECTIVE_TIME_H@ NEXT_AS_FIRST_DIRECTIVE_UNISTD_H = @NEXT_AS_FIRST_DIRECTIVE_UNISTD_H@ NEXT_AS_FIRST_DIRECTIVE_WCHAR_H = @NEXT_AS_FIRST_DIRECTIVE_WCHAR_H@ NEXT_AS_FIRST_DIRECTIVE_WCTYPE_H = @NEXT_AS_FIRST_DIRECTIVE_WCTYPE_H@ NEXT_CTYPE_H = @NEXT_CTYPE_H@ NEXT_DIRENT_H = @NEXT_DIRENT_H@ NEXT_ERRNO_H = @NEXT_ERRNO_H@ NEXT_FCNTL_H = @NEXT_FCNTL_H@ NEXT_FLOAT_H = @NEXT_FLOAT_H@ NEXT_FNMATCH_H = @NEXT_FNMATCH_H@ NEXT_GETOPT_H = @NEXT_GETOPT_H@ NEXT_INTTYPES_H = @NEXT_INTTYPES_H@ NEXT_LANGINFO_H = @NEXT_LANGINFO_H@ NEXT_LIMITS_H = @NEXT_LIMITS_H@ NEXT_LOCALE_H = @NEXT_LOCALE_H@ NEXT_STDDEF_H = @NEXT_STDDEF_H@ NEXT_STDINT_H = @NEXT_STDINT_H@ NEXT_STDIO_H = @NEXT_STDIO_H@ NEXT_STDLIB_H = @NEXT_STDLIB_H@ NEXT_STRINGS_H = @NEXT_STRINGS_H@ NEXT_STRING_H = @NEXT_STRING_H@ NEXT_SYSEXITS_H = @NEXT_SYSEXITS_H@ NEXT_SYS_STAT_H = @NEXT_SYS_STAT_H@ NEXT_SYS_TYPES_H = @NEXT_SYS_TYPES_H@ NEXT_TIME_H = @NEXT_TIME_H@ NEXT_UNISTD_H = @NEXT_UNISTD_H@ NEXT_WCHAR_H = @NEXT_WCHAR_H@ NEXT_WCTYPE_H = @NEXT_WCTYPE_H@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POSUB = @POSUB@ PRAGMA_COLUMNS = @PRAGMA_COLUMNS@ PRAGMA_SYSTEM_HEADER = @PRAGMA_SYSTEM_HEADER@ PRIPTR_PREFIX = @PRIPTR_PREFIX@ PTHREAD_H_DEFINES_STRUCT_TIMESPEC = @PTHREAD_H_DEFINES_STRUCT_TIMESPEC@ PTRDIFF_T_SUFFIX = @PTRDIFF_T_SUFFIX@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ REPLACE_ACCESS = @REPLACE_ACCESS@ REPLACE_ALIGNED_ALLOC = @REPLACE_ALIGNED_ALLOC@ REPLACE_BTOWC = @REPLACE_BTOWC@ REPLACE_CALLOC_FOR_CALLOC_GNU = @REPLACE_CALLOC_FOR_CALLOC_GNU@ REPLACE_CALLOC_FOR_CALLOC_POSIX = @REPLACE_CALLOC_FOR_CALLOC_POSIX@ REPLACE_CANONICALIZE_FILE_NAME = @REPLACE_CANONICALIZE_FILE_NAME@ REPLACE_CHOWN = @REPLACE_CHOWN@ REPLACE_CLOSE = @REPLACE_CLOSE@ REPLACE_CLOSEDIR = @REPLACE_CLOSEDIR@ REPLACE_COPY_FILE_RANGE = @REPLACE_COPY_FILE_RANGE@ REPLACE_CREAT = @REPLACE_CREAT@ REPLACE_CTIME = @REPLACE_CTIME@ REPLACE_DIRFD = @REPLACE_DIRFD@ REPLACE_DPRINTF = @REPLACE_DPRINTF@ REPLACE_DUP = @REPLACE_DUP@ REPLACE_DUP2 = @REPLACE_DUP2@ REPLACE_DUPLOCALE = @REPLACE_DUPLOCALE@ REPLACE_EXECL = @REPLACE_EXECL@ REPLACE_EXECLE = @REPLACE_EXECLE@ REPLACE_EXECLP = @REPLACE_EXECLP@ REPLACE_EXECV = @REPLACE_EXECV@ REPLACE_EXECVE = @REPLACE_EXECVE@ REPLACE_EXECVP = @REPLACE_EXECVP@ REPLACE_EXECVPE = @REPLACE_EXECVPE@ REPLACE_FACCESSAT = @REPLACE_FACCESSAT@ REPLACE_FCHMODAT = @REPLACE_FCHMODAT@ REPLACE_FCHOWNAT = @REPLACE_FCHOWNAT@ REPLACE_FCLOSE = @REPLACE_FCLOSE@ REPLACE_FCNTL = @REPLACE_FCNTL@ REPLACE_FDOPEN = @REPLACE_FDOPEN@ REPLACE_FDOPENDIR = @REPLACE_FDOPENDIR@ REPLACE_FFLUSH = @REPLACE_FFLUSH@ REPLACE_FFSLL = @REPLACE_FFSLL@ REPLACE_FNMATCH = @REPLACE_FNMATCH@ REPLACE_FOPEN = @REPLACE_FOPEN@ REPLACE_FOPEN_FOR_FOPEN_GNU = @REPLACE_FOPEN_FOR_FOPEN_GNU@ REPLACE_FPRINTF = @REPLACE_FPRINTF@ REPLACE_FPURGE = @REPLACE_FPURGE@ REPLACE_FREE = @REPLACE_FREE@ REPLACE_FREELOCALE = @REPLACE_FREELOCALE@ REPLACE_FREOPEN = @REPLACE_FREOPEN@ REPLACE_FSEEK = @REPLACE_FSEEK@ REPLACE_FSEEKO = @REPLACE_FSEEKO@ REPLACE_FSTAT = @REPLACE_FSTAT@ REPLACE_FSTATAT = @REPLACE_FSTATAT@ REPLACE_FTELL = @REPLACE_FTELL@ REPLACE_FTELLO = @REPLACE_FTELLO@ REPLACE_FTRUNCATE = @REPLACE_FTRUNCATE@ REPLACE_FUTIMENS = @REPLACE_FUTIMENS@ REPLACE_GETCWD = @REPLACE_GETCWD@ REPLACE_GETDELIM = @REPLACE_GETDELIM@ REPLACE_GETDOMAINNAME = @REPLACE_GETDOMAINNAME@ REPLACE_GETDTABLESIZE = @REPLACE_GETDTABLESIZE@ REPLACE_GETGROUPS = @REPLACE_GETGROUPS@ REPLACE_GETLINE = @REPLACE_GETLINE@ REPLACE_GETLOGIN_R = @REPLACE_GETLOGIN_R@ REPLACE_GETPAGESIZE = @REPLACE_GETPAGESIZE@ REPLACE_GETPASS = @REPLACE_GETPASS@ REPLACE_GETPASS_FOR_GETPASS_GNU = @REPLACE_GETPASS_FOR_GETPASS_GNU@ REPLACE_GMTIME = @REPLACE_GMTIME@ REPLACE_INITSTATE = @REPLACE_INITSTATE@ REPLACE_ISATTY = @REPLACE_ISATTY@ REPLACE_ISWBLANK = @REPLACE_ISWBLANK@ REPLACE_ISWCNTRL = @REPLACE_ISWCNTRL@ REPLACE_ISWDIGIT = @REPLACE_ISWDIGIT@ REPLACE_ISWXDIGIT = @REPLACE_ISWXDIGIT@ REPLACE_ITOLD = @REPLACE_ITOLD@ REPLACE_LCHOWN = @REPLACE_LCHOWN@ REPLACE_LINK = @REPLACE_LINK@ REPLACE_LINKAT = @REPLACE_LINKAT@ REPLACE_LOCALECONV = @REPLACE_LOCALECONV@ REPLACE_LOCALTIME = @REPLACE_LOCALTIME@ REPLACE_LOCALTIME_R = @REPLACE_LOCALTIME_R@ REPLACE_LSEEK = @REPLACE_LSEEK@ REPLACE_LSTAT = @REPLACE_LSTAT@ REPLACE_MALLOC_FOR_MALLOC_GNU = @REPLACE_MALLOC_FOR_MALLOC_GNU@ REPLACE_MALLOC_FOR_MALLOC_POSIX = @REPLACE_MALLOC_FOR_MALLOC_POSIX@ REPLACE_MBRLEN = @REPLACE_MBRLEN@ REPLACE_MBRTOWC = @REPLACE_MBRTOWC@ REPLACE_MBSINIT = @REPLACE_MBSINIT@ REPLACE_MBSNRTOWCS = @REPLACE_MBSNRTOWCS@ REPLACE_MBSRTOWCS = @REPLACE_MBSRTOWCS@ REPLACE_MBSTATE_T = @REPLACE_MBSTATE_T@ REPLACE_MBTOWC = @REPLACE_MBTOWC@ REPLACE_MEMCHR = @REPLACE_MEMCHR@ REPLACE_MEMMEM = @REPLACE_MEMMEM@ REPLACE_MKDIR = @REPLACE_MKDIR@ REPLACE_MKFIFO = @REPLACE_MKFIFO@ REPLACE_MKFIFOAT = @REPLACE_MKFIFOAT@ REPLACE_MKNOD = @REPLACE_MKNOD@ REPLACE_MKNODAT = @REPLACE_MKNODAT@ REPLACE_MKSTEMP = @REPLACE_MKSTEMP@ REPLACE_MKTIME = @REPLACE_MKTIME@ REPLACE_NANOSLEEP = @REPLACE_NANOSLEEP@ REPLACE_NEWLOCALE = @REPLACE_NEWLOCALE@ REPLACE_NL_LANGINFO = @REPLACE_NL_LANGINFO@ REPLACE_NULL = @REPLACE_NULL@ REPLACE_OBSTACK_PRINTF = @REPLACE_OBSTACK_PRINTF@ REPLACE_OPEN = @REPLACE_OPEN@ REPLACE_OPENAT = @REPLACE_OPENAT@ REPLACE_OPENDIR = @REPLACE_OPENDIR@ REPLACE_PERROR = @REPLACE_PERROR@ REPLACE_POPEN = @REPLACE_POPEN@ REPLACE_POSIX_MEMALIGN = @REPLACE_POSIX_MEMALIGN@ REPLACE_PREAD = @REPLACE_PREAD@ REPLACE_PRINTF = @REPLACE_PRINTF@ REPLACE_PTSNAME = @REPLACE_PTSNAME@ REPLACE_PTSNAME_R = @REPLACE_PTSNAME_R@ REPLACE_PUTENV = @REPLACE_PUTENV@ REPLACE_PWRITE = @REPLACE_PWRITE@ REPLACE_QSORT_R = @REPLACE_QSORT_R@ REPLACE_RANDOM = @REPLACE_RANDOM@ REPLACE_RANDOM_R = @REPLACE_RANDOM_R@ REPLACE_READ = @REPLACE_READ@ REPLACE_READLINK = @REPLACE_READLINK@ REPLACE_READLINKAT = @REPLACE_READLINKAT@ REPLACE_REALLOCARRAY = @REPLACE_REALLOCARRAY@ REPLACE_REALLOC_FOR_REALLOC_GNU = @REPLACE_REALLOC_FOR_REALLOC_GNU@ REPLACE_REALLOC_FOR_REALLOC_POSIX = @REPLACE_REALLOC_FOR_REALLOC_POSIX@ REPLACE_REALPATH = @REPLACE_REALPATH@ REPLACE_REMOVE = @REPLACE_REMOVE@ REPLACE_RENAME = @REPLACE_RENAME@ REPLACE_RENAMEAT = @REPLACE_RENAMEAT@ REPLACE_RMDIR = @REPLACE_RMDIR@ REPLACE_SETENV = @REPLACE_SETENV@ REPLACE_SETLOCALE = @REPLACE_SETLOCALE@ REPLACE_SETSTATE = @REPLACE_SETSTATE@ REPLACE_SLEEP = @REPLACE_SLEEP@ REPLACE_SNPRINTF = @REPLACE_SNPRINTF@ REPLACE_SPRINTF = @REPLACE_SPRINTF@ REPLACE_STAT = @REPLACE_STAT@ REPLACE_STDIO_READ_FUNCS = @REPLACE_STDIO_READ_FUNCS@ REPLACE_STDIO_WRITE_FUNCS = @REPLACE_STDIO_WRITE_FUNCS@ REPLACE_STPNCPY = @REPLACE_STPNCPY@ REPLACE_STRCASESTR = @REPLACE_STRCASESTR@ REPLACE_STRCHRNUL = @REPLACE_STRCHRNUL@ REPLACE_STRDUP = @REPLACE_STRDUP@ REPLACE_STRERROR = @REPLACE_STRERROR@ REPLACE_STRERRORNAME_NP = @REPLACE_STRERRORNAME_NP@ REPLACE_STRERROR_R = @REPLACE_STRERROR_R@ REPLACE_STRFTIME = @REPLACE_STRFTIME@ REPLACE_STRNCAT = @REPLACE_STRNCAT@ REPLACE_STRNDUP = @REPLACE_STRNDUP@ REPLACE_STRNLEN = @REPLACE_STRNLEN@ REPLACE_STRSIGNAL = @REPLACE_STRSIGNAL@ REPLACE_STRSTR = @REPLACE_STRSTR@ REPLACE_STRTOD = @REPLACE_STRTOD@ REPLACE_STRTOIMAX = @REPLACE_STRTOIMAX@ REPLACE_STRTOK_R = @REPLACE_STRTOK_R@ REPLACE_STRTOL = @REPLACE_STRTOL@ REPLACE_STRTOLD = @REPLACE_STRTOLD@ REPLACE_STRTOLL = @REPLACE_STRTOLL@ REPLACE_STRTOUL = @REPLACE_STRTOUL@ REPLACE_STRTOULL = @REPLACE_STRTOULL@ REPLACE_STRTOUMAX = @REPLACE_STRTOUMAX@ REPLACE_STRUCT_LCONV = @REPLACE_STRUCT_LCONV@ REPLACE_SYMLINK = @REPLACE_SYMLINK@ REPLACE_SYMLINKAT = @REPLACE_SYMLINKAT@ REPLACE_TIMEGM = @REPLACE_TIMEGM@ REPLACE_TMPFILE = @REPLACE_TMPFILE@ REPLACE_TOWLOWER = @REPLACE_TOWLOWER@ REPLACE_TRUNCATE = @REPLACE_TRUNCATE@ REPLACE_TTYNAME_R = @REPLACE_TTYNAME_R@ REPLACE_TZSET = @REPLACE_TZSET@ REPLACE_UNLINK = @REPLACE_UNLINK@ REPLACE_UNLINKAT = @REPLACE_UNLINKAT@ REPLACE_UNSETENV = @REPLACE_UNSETENV@ REPLACE_USLEEP = @REPLACE_USLEEP@ REPLACE_UTIMENSAT = @REPLACE_UTIMENSAT@ REPLACE_VASPRINTF = @REPLACE_VASPRINTF@ REPLACE_VDPRINTF = @REPLACE_VDPRINTF@ REPLACE_VFPRINTF = @REPLACE_VFPRINTF@ REPLACE_VPRINTF = @REPLACE_VPRINTF@ REPLACE_VSNPRINTF = @REPLACE_VSNPRINTF@ REPLACE_VSPRINTF = @REPLACE_VSPRINTF@ REPLACE_WCRTOMB = @REPLACE_WCRTOMB@ REPLACE_WCSFTIME = @REPLACE_WCSFTIME@ REPLACE_WCSNRTOMBS = @REPLACE_WCSNRTOMBS@ REPLACE_WCSRTOMBS = @REPLACE_WCSRTOMBS@ REPLACE_WCSTOK = @REPLACE_WCSTOK@ REPLACE_WCSWIDTH = @REPLACE_WCSWIDTH@ REPLACE_WCTOB = @REPLACE_WCTOB@ REPLACE_WCTOMB = @REPLACE_WCTOMB@ REPLACE_WCWIDTH = @REPLACE_WCWIDTH@ REPLACE_WRITE = @REPLACE_WRITE@ SDL2_CFLAGS = @SDL2_CFLAGS@ SDL2_LIBS = @SDL2_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIG_ATOMIC_T_SUFFIX = @SIG_ATOMIC_T_SUFFIX@ SIZE_T_SUFFIX = @SIZE_T_SUFFIX@ STDALIGN_H = @STDALIGN_H@ STDBOOL_H = @STDBOOL_H@ STDDEF_H = @STDDEF_H@ STDINT_H = @STDINT_H@ STRIP = @STRIP@ SYSEXITS_H = @SYSEXITS_H@ SYS_TIME_H_DEFINES_STRUCT_TIMESPEC = @SYS_TIME_H_DEFINES_STRUCT_TIMESPEC@ TARGET_APPLE_LINKER = @TARGET_APPLE_LINKER@ TARGET_CC = @TARGET_CC@ TARGET_CCAS = @TARGET_CCAS@ TARGET_CCASFLAGS = @TARGET_CCASFLAGS@ TARGET_CC_VERSION = @TARGET_CC_VERSION@ TARGET_CFLAGS = @TARGET_CFLAGS@ TARGET_CPP = @TARGET_CPP@ TARGET_CPPFLAGS = @TARGET_CPPFLAGS@ TARGET_DECOMPRESSOR_LINK_ADDR = @TARGET_DECOMPRESSOR_LINK_ADDR@ TARGET_IMG_BASE_LDOPT = @TARGET_IMG_BASE_LDOPT@ TARGET_IMG_CFLAGS = @TARGET_IMG_CFLAGS@ TARGET_IMG_LDFLAGS = @TARGET_IMG_LDFLAGS@ TARGET_LDFLAGS = @TARGET_LDFLAGS@ TARGET_LDFLAGS_OLDMAGIC = @TARGET_LDFLAGS_OLDMAGIC@ TARGET_LINK_ADDR = @TARGET_LINK_ADDR@ TARGET_MODULE_FORMAT = @TARGET_MODULE_FORMAT@ TARGET_NM = @TARGET_NM@ TARGET_NMFLAGS_DEFINED_ONLY = @TARGET_NMFLAGS_DEFINED_ONLY@ TARGET_NMFLAGS_MINUS_P = @TARGET_NMFLAGS_MINUS_P@ TARGET_OBJ2ELF = @TARGET_OBJ2ELF@ TARGET_OBJCONV = @TARGET_OBJCONV@ TARGET_OBJCOPY = @TARGET_OBJCOPY@ TARGET_RANLIB = @TARGET_RANLIB@ TARGET_STRIP = @TARGET_STRIP@ TIME_H_DEFINES_STRUCT_TIMESPEC = @TIME_H_DEFINES_STRUCT_TIMESPEC@ TIME_H_DEFINES_TIME_UTC = @TIME_H_DEFINES_TIME_UTC@ UINT32_MAX_LT_UINTMAX_MAX = @UINT32_MAX_LT_UINTMAX_MAX@ UINT64_MAX_EQ_ULONG_MAX = @UINT64_MAX_EQ_ULONG_MAX@ UNDEFINE_STRTOK_R = @UNDEFINE_STRTOK_R@ UNISTD_H_DEFINES_STRUCT_TIMESPEC = @UNISTD_H_DEFINES_STRUCT_TIMESPEC@ UNISTD_H_HAVE_SYS_RANDOM_H = @UNISTD_H_HAVE_SYS_RANDOM_H@ UNISTD_H_HAVE_WINSOCK2_H = @UNISTD_H_HAVE_WINSOCK2_H@ UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS = @UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WCHAR_T_SUFFIX = @WCHAR_T_SUFFIX@ WINDOWS_64_BIT_OFF_T = @WINDOWS_64_BIT_OFF_T@ WINDOWS_64_BIT_ST_SIZE = @WINDOWS_64_BIT_ST_SIZE@ WINDOWS_STAT_INODES = @WINDOWS_STAT_INODES@ WINDOWS_STAT_TIMESPEC = @WINDOWS_STAT_TIMESPEC@ WINT_T_SUFFIX = @WINT_T_SUFFIX@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_TARGET_CC = @ac_ct_TARGET_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ bootdirname = @bootdirname@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ enable_efiemu = @enable_efiemu@ enable_grub_emu_pci = @enable_grub_emu_pci@ enable_grub_emu_sdl = @enable_grub_emu_sdl@ enable_grub_emu_sdl2 = @enable_grub_emu_sdl2@ enable_grub_mkfont = @enable_grub_mkfont@ enable_grub_mount = @enable_grub_mount@ enable_grub_protect = @enable_grub_protect@ exec_prefix = @exec_prefix@ gl_LIBOBJDEPS = @gl_LIBOBJDEPS@ gl_LIBOBJS = @gl_LIBOBJS@ gl_LTLIBOBJS = @gl_LTLIBOBJS@ gltests_LIBOBJDEPS = @gltests_LIBOBJDEPS@ gltests_LIBOBJS = @gltests_LIBOBJS@ gltests_LTLIBOBJS = @gltests_LTLIBOBJS@ gltests_WITNESS = @gltests_WITNESS@ grub_bios_setup = @grub_bios_setup@ grub_editenv = @grub_editenv@ grub_file = @grub_file@ grub_glue_efi = @grub_glue_efi@ grub_install = @grub_install@ grub_mkconfig = @grub_mkconfig@ grub_mkfont = @grub_mkfont@ grub_mkimage = @grub_mkimage@ grub_mklayout = @grub_mklayout@ grub_mkpasswd_pbkdf2 = @grub_mkpasswd_pbkdf2@ grub_mkrelpath = @grub_mkrelpath@ grub_mkrescue = @grub_mkrescue@ grub_probe = @grub_probe@ grub_protect = @grub_protect@ grub_reboot = @grub_reboot@ grub_render_label = @grub_render_label@ grub_script_check = @grub_script_check@ grub_set_default = @grub_set_default@ grub_sparc64_setup = @grub_sparc64_setup@ grubdirname = @grubdirname@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_kernel = @host_kernel@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ platform = @platform@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AUTOMAKE_OPTIONS = subdir-objects # AM_MAKEINFOFLAGS = --no-split --no-validate info_TEXINFOS = grub.texi grub-dev.texi grub_TEXINFOS = fdl.texi EXTRA_DIST = font_char_metrics.png font_char_metrics.txt all: all-am .SUFFIXES: .SUFFIXES: .dvi .html .info .pdf .ps .texi $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu docs/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu docs/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): .texi.info: $(AM_V_MAKEINFO)restore=: && backupdir="$(am__leading_dot)am$$$$" && \ am__cwd=`pwd` && $(am__cd) $(srcdir) && \ rm -rf $$backupdir && mkdir $$backupdir && \ if ($(MAKEINFO) --version) >/dev/null 2>&1; then \ for f in $@ $@-[0-9] $@-[0-9][0-9] $(@:.info=).i[0-9] $(@:.info=).i[0-9][0-9]; do \ if test -f $$f; then mv $$f $$backupdir; restore=mv; else :; fi; \ done; \ else :; fi && \ cd "$$am__cwd"; \ if $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \ -o $@ $<; \ then \ rc=0; \ $(am__cd) $(srcdir); \ else \ rc=$$?; \ $(am__cd) $(srcdir) && \ $$restore $$backupdir/* `echo "./$@" | sed 's|[^/]*$$||'`; \ fi; \ rm -rf $$backupdir; exit $$rc .texi.dvi: $(AM_V_TEXI2DVI)TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \ $(TEXI2DVI) $(AM_V_texinfo) --build-dir=$(@:.dvi=.t2d) -o $@ $(AM_V_texidevnull) \ $< .texi.pdf: $(AM_V_TEXI2PDF)TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \ $(TEXI2PDF) $(AM_V_texinfo) --build-dir=$(@:.pdf=.t2p) -o $@ $(AM_V_texidevnull) \ $< .texi.html: $(AM_V_MAKEINFO)rm -rf $(@:.html=.htp) $(AM_V_at)if $(MAKEINFOHTML) $(AM_MAKEINFOHTMLFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \ -o $(@:.html=.htp) $<; \ then \ rm -rf $@ && mv $(@:.html=.htp) $@; \ else \ rm -rf $(@:.html=.htp); exit 1; \ fi $(srcdir)/grub.info: grub.texi $(srcdir)/version.texi $(grub_TEXINFOS) grub.dvi: grub.texi $(srcdir)/version.texi $(grub_TEXINFOS) grub.pdf: grub.texi $(srcdir)/version.texi $(grub_TEXINFOS) grub.html: grub.texi $(srcdir)/version.texi $(grub_TEXINFOS) $(srcdir)/version.texi: $(srcdir)/stamp-vti $(srcdir)/stamp-vti: grub.texi $(top_srcdir)/configure @(dir=.; test -f ./grub.texi || dir=$(srcdir); \ set `$(SHELL) $(top_srcdir)/build-aux/mdate-sh $$dir/grub.texi`; \ echo "@set UPDATED $$1 $$2 $$3"; \ echo "@set UPDATED-MONTH $$2 $$3"; \ echo "@set EDITION $(VERSION)"; \ echo "@set VERSION $(VERSION)") > vti.tmp$$$$ && \ (cmp -s vti.tmp$$$$ $(srcdir)/version.texi \ || (echo "Updating $(srcdir)/version.texi" && \ cp vti.tmp$$$$ $(srcdir)/version.texi.tmp$$$$ && \ mv $(srcdir)/version.texi.tmp$$$$ $(srcdir)/version.texi)) && \ rm -f vti.tmp$$$$ $(srcdir)/version.texi.$$$$ @cp $(srcdir)/version.texi $@ mostlyclean-vti: -rm -f vti.tmp* $(srcdir)/version.texi.tmp* maintainer-clean-vti: -rm -f $(srcdir)/stamp-vti $(srcdir)/version.texi $(srcdir)/grub-dev.info: grub-dev.texi $(srcdir)/version-dev.texi grub-dev.dvi: grub-dev.texi $(srcdir)/version-dev.texi grub-dev.pdf: grub-dev.texi $(srcdir)/version-dev.texi grub-dev.html: grub-dev.texi $(srcdir)/version-dev.texi $(srcdir)/version-dev.texi: $(srcdir)/stamp-1 $(srcdir)/stamp-1: grub-dev.texi $(top_srcdir)/configure @(dir=.; test -f ./grub-dev.texi || dir=$(srcdir); \ set `$(SHELL) $(top_srcdir)/build-aux/mdate-sh $$dir/grub-dev.texi`; \ echo "@set UPDATED $$1 $$2 $$3"; \ echo "@set UPDATED-MONTH $$2 $$3"; \ echo "@set EDITION $(VERSION)"; \ echo "@set VERSION $(VERSION)") > 1.tmp$$$$ && \ (cmp -s 1.tmp$$$$ $(srcdir)/version-dev.texi \ || (echo "Updating $(srcdir)/version-dev.texi" && \ cp 1.tmp$$$$ $(srcdir)/version-dev.texi.tmp$$$$ && \ mv $(srcdir)/version-dev.texi.tmp$$$$ $(srcdir)/version-dev.texi)) && \ rm -f 1.tmp$$$$ $(srcdir)/version-dev.texi.$$$$ @cp $(srcdir)/version-dev.texi $@ mostlyclean-1: -rm -f 1.tmp* $(srcdir)/version-dev.texi.tmp* maintainer-clean-1: -rm -f $(srcdir)/stamp-1 $(srcdir)/version-dev.texi .dvi.ps: $(AM_V_DVIPS)TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ $(DVIPS) $(AM_V_texinfo) -o $@ $< uninstall-dvi-am: @$(NORMAL_UNINSTALL) @list='$(DVIS)'; test -n "$(dvidir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " rm -f '$(DESTDIR)$(dvidir)/$$f'"; \ rm -f "$(DESTDIR)$(dvidir)/$$f"; \ done uninstall-html-am: @$(NORMAL_UNINSTALL) @list='$(HTMLS)'; test -n "$(htmldir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " rm -rf '$(DESTDIR)$(htmldir)/$$f'"; \ rm -rf "$(DESTDIR)$(htmldir)/$$f"; \ done uninstall-info-am: @$(PRE_UNINSTALL) @if test -d '$(DESTDIR)$(infodir)' && $(am__can_run_installinfo); then \ list='$(INFO_DEPS)'; \ for file in $$list; do \ relfile=`echo "$$file" | sed 's|^.*/||'`; \ echo " install-info --info-dir='$(DESTDIR)$(infodir)' --remove '$(DESTDIR)$(infodir)/$$relfile'"; \ if install-info --info-dir="$(DESTDIR)$(infodir)" --remove "$(DESTDIR)$(infodir)/$$relfile"; \ then :; else test ! -f "$(DESTDIR)$(infodir)/$$relfile" || exit 1; fi; \ done; \ else :; fi @$(NORMAL_UNINSTALL) @list='$(INFO_DEPS)'; \ for file in $$list; do \ relfile=`echo "$$file" | sed 's|^.*/||'`; \ relfile_i=`echo "$$relfile" | sed 's|\.info$$||;s|$$|.i|'`; \ (if test -d "$(DESTDIR)$(infodir)" && cd "$(DESTDIR)$(infodir)"; then \ echo " cd '$(DESTDIR)$(infodir)' && rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]"; \ rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]; \ else :; fi); \ done uninstall-pdf-am: @$(NORMAL_UNINSTALL) @list='$(PDFS)'; test -n "$(pdfdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " rm -f '$(DESTDIR)$(pdfdir)/$$f'"; \ rm -f "$(DESTDIR)$(pdfdir)/$$f"; \ done uninstall-ps-am: @$(NORMAL_UNINSTALL) @list='$(PSS)'; test -n "$(psdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " rm -f '$(DESTDIR)$(psdir)/$$f'"; \ rm -f "$(DESTDIR)$(psdir)/$$f"; \ done dist-info: $(INFO_DEPS) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ list='$(INFO_DEPS)'; \ for base in $$list; do \ case $$base in \ $(srcdir)/*) base=`echo "$$base" | sed "s|^$$srcdirstrip/||"`;; \ esac; \ if test -f $$base; then d=.; else d=$(srcdir); fi; \ base_i=`echo "$$base" | sed 's|\.info$$||;s|$$|.i|'`; \ for file in $$d/$$base $$d/$$base-[0-9] $$d/$$base-[0-9][0-9] $$d/$$base_i[0-9] $$d/$$base_i[0-9][0-9]; do \ if test -f $$file; then \ relfile=`expr "$$file" : "$$d/\(.*\)"`; \ test -f "$(distdir)/$$relfile" || \ cp -p $$file "$(distdir)/$$relfile"; \ else :; fi; \ done; \ done mostlyclean-aminfo: -rm -rf grub.t2d grub.t2p grub-dev.t2d grub-dev.t2p clean-aminfo: -test -z "grub.dvi grub.pdf grub.ps grub.html grub-dev.dvi grub-dev.pdf \ grub-dev.ps grub-dev.html" \ || rm -rf grub.dvi grub.pdf grub.ps grub.html grub-dev.dvi grub-dev.pdf \ grub-dev.ps grub-dev.html maintainer-clean-aminfo: @list='$(INFO_DEPS)'; for i in $$list; do \ i_i=`echo "$$i" | sed 's|\.info$$||;s|$$|.i|'`; \ echo " rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]"; \ rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]; \ done tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" distdir="$(distdir)" \ dist-info check-am: all-am check: check-am all-am: Makefile $(INFO_DEPS) installdirs: for dir in "$(DESTDIR)$(infodir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-aminfo clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: $(DVIS) html: html-am html-am: $(HTMLS) info: info-am info-am: $(INFO_DEPS) install-data-am: install-info-am install-dvi: install-dvi-am install-dvi-am: $(DVIS) @$(NORMAL_INSTALL) @list='$(DVIS)'; test -n "$(dvidir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(dvidir)'"; \ $(MKDIR_P) "$(DESTDIR)$(dvidir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(dvidir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(dvidir)" || exit $$?; \ done install-exec-am: install-html: install-html-am install-html-am: $(HTMLS) @$(NORMAL_INSTALL) @list='$(HTMLS)'; list2=; test -n "$(htmldir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(htmldir)'"; \ $(MKDIR_P) "$(DESTDIR)$(htmldir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p" || test -d "$$p"; then d=; else d="$(srcdir)/"; fi; \ $(am__strip_dir) \ d2=$$d$$p; \ if test -d "$$d2"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(htmldir)/$$f'"; \ $(MKDIR_P) "$(DESTDIR)$(htmldir)/$$f" || exit 1; \ echo " $(INSTALL_DATA) '$$d2'/* '$(DESTDIR)$(htmldir)/$$f'"; \ $(INSTALL_DATA) "$$d2"/* "$(DESTDIR)$(htmldir)/$$f" || exit $$?; \ else \ list2="$$list2 $$d2"; \ fi; \ done; \ test -z "$$list2" || { echo "$$list2" | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(htmldir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(htmldir)" || exit $$?; \ done; } install-info: install-info-am install-info-am: $(INFO_DEPS) @$(NORMAL_INSTALL) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ list='$(INFO_DEPS)'; test -n "$(infodir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(infodir)'"; \ $(MKDIR_P) "$(DESTDIR)$(infodir)" || exit 1; \ fi; \ for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ esac; \ if test -f $$file; then d=.; else d=$(srcdir); fi; \ file_i=`echo "$$file" | sed 's|\.info$$||;s|$$|.i|'`; \ for ifile in $$d/$$file $$d/$$file-[0-9] $$d/$$file-[0-9][0-9] \ $$d/$$file_i[0-9] $$d/$$file_i[0-9][0-9] ; do \ if test -f $$ifile; then \ echo "$$ifile"; \ else : ; fi; \ done; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(infodir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(infodir)" || exit $$?; done @$(POST_INSTALL) @if $(am__can_run_installinfo); then \ list='$(INFO_DEPS)'; test -n "$(infodir)" || list=; \ for file in $$list; do \ relfile=`echo "$$file" | sed 's|^.*/||'`; \ echo " install-info --info-dir='$(DESTDIR)$(infodir)' '$(DESTDIR)$(infodir)/$$relfile'";\ install-info --info-dir="$(DESTDIR)$(infodir)" "$(DESTDIR)$(infodir)/$$relfile" || :;\ done; \ else : ; fi install-man: install-pdf: install-pdf-am install-pdf-am: $(PDFS) @$(NORMAL_INSTALL) @list='$(PDFS)'; test -n "$(pdfdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pdfdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pdfdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pdfdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pdfdir)" || exit $$?; done install-ps: install-ps-am install-ps-am: $(PSS) @$(NORMAL_INSTALL) @list='$(PSS)'; test -n "$(psdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(psdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(psdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(psdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(psdir)" || exit $$?; done installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-1 \ maintainer-clean-aminfo maintainer-clean-generic \ maintainer-clean-vti mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-1 mostlyclean-aminfo mostlyclean-generic \ mostlyclean-vti pdf: pdf-am pdf-am: $(PDFS) ps: ps-am ps-am: $(PSS) uninstall-am: uninstall-dvi-am uninstall-html-am uninstall-info-am \ uninstall-pdf-am uninstall-ps-am .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-aminfo clean-generic \ cscopelist-am ctags-am dist-info distclean distclean-generic \ distdir dvi dvi-am html html-am info info-am install \ install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-1 maintainer-clean-aminfo \ maintainer-clean-generic maintainer-clean-vti mostlyclean \ mostlyclean-1 mostlyclean-aminfo mostlyclean-generic \ mostlyclean-vti pdf pdf-am ps ps-am tags-am uninstall \ uninstall-am uninstall-dvi-am uninstall-html-am \ uninstall-info-am uninstall-pdf-am uninstall-ps-am .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: grub-2.14~git20250718.0e36779/docs/Makefile.am0000644000175000017500000000031615000202015014743 00000000000000AUTOMAKE_OPTIONS = subdir-objects # AM_MAKEINFOFLAGS = --no-split --no-validate info_TEXINFOS = grub.texi grub-dev.texi grub_TEXINFOS = fdl.texi EXTRA_DIST = font_char_metrics.png font_char_metrics.txt grub-2.14~git20250718.0e36779/docs/autoiso.cfg0000644000175000017500000001440115000202015015053 00000000000000# Sample GRUB script to autodetect operating systems # # Copyright (C) 2010 Free Software Foundation, Inc. # # GRUB is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # GRUB is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GRUB. If not, see . function pathname { regexp -s 2:"$2" '^(\(.*\))?(/.*)$' "$1"; } function devname { regexp -s "$2" '^(\(.*\)).*$' "$1"; } function loopback_iso_entry { realdev="$1" isopath="$2" loopdev="$3" if test -f /boot/grub/loopback.cfg; then cfgpath=/boot/grub/loopback.cfg elif test -f /grub/loopback.cfg; then cfgpath=/grub/loopback.cfg else return 1; fi echo loopback.cfg $isopath: yes menuentry "Boot GRUB Loopback Config from ${realdev}${isopath}" "$realdev" "$isopath" "$cfgpath" { set device="$2" set iso_path="$3" set cfg_path="$4" export iso_path loopback loopdev_cfg "${device}${iso_path}" set root=(loopdev_cfg) configfile $cfg_path loopback -d loopdev_cfg } return 0 } function grml_iso_entry { realdev="$1" isopath="$2" loopdev="$3" result=1 for dir in /boot/grml /boot/grmlsmall /boot/grmlmedium; do if ! test -f ${dir}/linux26 -a -f ${dir}/initrd.gz; then continue; fi echo grml $isopath: yes result=0 menuentry "GRML Linux from ${realdev}${isopath}" \ "$realdev" "$isopath" "$dir" { set device="$2" set isopath="$3" set grmldir="$4" loopback loopdev_grml "${device}${isopath}" set root=(loopdev_grml) linux $grmldir/linux26 findiso="$isopath" apm=power-off quiet \ boot=live nomce initrd $grmldir/initrd.gz loopback -d loopdev_grml } done return $result } function pmagic_iso_entry { realdev="$1" isopath="$2" loopdev="$3" if ! test -f /pmagic/bzImage -a -f /pmagic/initramfs; then return 1; fi echo pmagic $isopath: yes menuentry "Parted Magic from ${realdev}${isopath}" "$realdev" "$isopath" { set device="$2" set isopath="$3" loopback loopdev_pmagic "${device}${isopath}" set root=(loopdev_pmagic) linux /pmagic/bzImage iso_filename="$isopath" edd=off noapic \ load_ramdisk=1 prompt_ramdisk=0 rw sleep=10 loglevel=0 \ keymap=$langcode initrd /pmagic/initramfs loopback -d loopdev_pmagic } return 0 } function sidux_iso_entry { realdev="$1" isopath="$2" loopdev="$3" result=1 for kernel in /boot/vmlinuz-*-sidux-*; do if ! test -f "$kernel"; then continue; fi regexp -s 1:v1 -s 2:v2 '/boot/vmlinuz-(.*)-sidux-(.*)' "$kernel" initrd="/boot/initrd.img-$v1-sidux-$v2" if ! test -f "$initrd"; then continue; fi result=0 echo sidux $isopath: yes menuentry "Sidux vmlinux-$v1-sidux-$v2 from ${realdev}${isopath}" "$realdev" "$isopath" "$kernel" "$initrd" { set device="$2" set isopath="$3" set kernel="$4" set initrd="$5" loopback loopdev_sidux "${device}${isopath}" set root=(loopdev_sidux) linux $kernel fromiso=$isopath boot=fll quiet initrd $initrd loopback -d loopdev_sidux } done return $result } function slax_iso_entry { realdev="$1" isopath="$2" loopdev="$3" if ! test -f /boot/vmlinuz -a -f /boot/initrd.gz; then return 1; fi echo slax $isopath: yes menuentry "Slax Linux from ${realdev}${isopath}" "$realdev" "$isopath" { set device="$2" set isopath="$3" loopback loopdev_slax "${device}${isopath}" set root=(loopdev_slax) linux /boot/vmlinuz from=$isopath ramdisk_size=6666 root=/dev/ram0 rw initrd /boot/initrd.gz loopback -d loopdev_slax } return 0 } function tinycore_iso_entry { realpath="$1" isopath="$2" loopdev="$3" if ! test -f /boot/bzImage -a -f /boot/tinycore.gz; then return 1; fi echo tinycore $isopath: yes menuentry "Tinycore Linux from ${realdev}${isopath}" "$realdev" "$isopath" { set device="$2" set isopath="$3" loopback loopdev_tiny "${device}${isopath}" set root=(loopdev_tiny) linux /boot/bzImage initrd /boot/tinycore.gz loopback -d loopdev_tiny } return 0 } function casper_iso_entry { realpath="$1" isopath="$2" loopdev="$3" if ! test -f /casper/vmlinuz; then return 1; fi initrd= for f in /casper/initrd.*z; do if ! test -f "$f"; then continue; fi pathname "$f" initrd done if test -z "$initrd"; then return 1; fi echo casper $isopath: yes menuentry "Casper based Linux from ${realdev}${isopath}" "$realdev" "$isopath" "$initrd" { set device="$2" set isopath="$3" set initrd="$4" loopback loopdev_casper "${device}${isopath}" set root=(loopdev_casper) linux /casper/vmlinuz boot=casper iso-scan/filename="$isopath" quiet splash noprompt keyb="$langcode" \ debian-installer/language="$langcode" console-setup/layoutcode?="$langcode" -- initrd $initrd loopback -d loopdev_casper } return 0 } function scan_isos { isodirs="$1" for dev in (*); do for dir in $isodirs; do for file in ${dev}${dir}/*.iso ${dev}${dir}/*.ISO; do if ! test -f "$file"; then continue; fi pathname $file isopath if test -z "$dev" -o -z "$isopath"; then continue; fi if ! loopback loopdev_scan "$file"; then continue; fi saved_root=$root set root=(loopdev_scan) if loopback_iso_entry $dev $isopath (loopdev_scan); then true; elif grml_iso_entry $dev $isopath (loopdev_scan); then true; elif pmagic_iso_entry $dev $isopath (loopdev_scan); then true; elif sidux_iso_entry $dev $isopath (loopdev_scan); then true; elif slax_iso_entry $dev $isopath (loopdev_scan); then true; elif tinycore_iso_entry $dev $isopath (loopdev_scan); then true; elif casper_iso_entry $dev $isopath (loopdev_scan); then true; else true; fi set root=$saved_root loopback -d loopdev_scan done done done return 0 } # XXX Remove later insmod serial serial terminal_output --append serial # terminal_input --append serial langcode="$lang" insmod regexp scan_isos /iso /boot/iso grub-2.14~git20250718.0e36779/docs/version.texi0000644000175000017500000000020315036452576015316 00000000000000@set UPDATED 18 July 2025 @set UPDATED-MONTH July 2025 @set EDITION 2.14~git20250718.0e36779 @set VERSION 2.14~git20250718.0e36779 grub-2.14~git20250718.0e36779/docs/stamp-vti0000644000175000017500000000020315036452576014605 00000000000000@set UPDATED 18 July 2025 @set UPDATED-MONTH July 2025 @set EDITION 2.14~git20250718.0e36779 @set VERSION 2.14~git20250718.0e36779 grub-2.14~git20250718.0e36779/docs/font_char_metrics.txt0000644000175000017500000000002515000202015017136 00000000000000Please fill this in. grub-2.14~git20250718.0e36779/docs/mdate-sh0000644000175000017500000001277715000202015014352 00000000000000#!/bin/sh # Get modification time of a file or directory and pretty-print it. scriptversion=2007-03-30.02 # Copyright (C) 1995, 1996, 1997, 2003, 2004, 2005, 2007 Free Software # Foundation, Inc. # written by Ulrich Drepper , June 1995 # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software Foundation, # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . case $1 in '') echo "$0: No file. Try \`$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: mdate-sh [--help] [--version] FILE Pretty-print the modification time of FILE. Report bugs to . EOF exit $? ;; -v | --v*) echo "mdate-sh $scriptversion" exit $? ;; esac # Prevent date giving response in another language. LANG=C export LANG LC_ALL=C export LC_ALL LC_TIME=C export LC_TIME # GNU ls changes its time format in response to the TIME_STYLE # variable. Since we cannot assume `unset' works, revert this # variable to its documented default. if test "${TIME_STYLE+set}" = set; then TIME_STYLE=posix-long-iso export TIME_STYLE fi save_arg1=$1 # Find out how to get the extended ls output of a file or directory. if ls -L /dev/null 1>/dev/null 2>&1; then ls_command='ls -L -l -d' else ls_command='ls -l -d' fi # Avoid user/group names that might have spaces, when possible. if ls -n /dev/null 1>/dev/null 2>&1; then ls_command="$ls_command -n" fi # A `ls -l' line looks as follows on OS/2. # drwxrwx--- 0 Aug 11 2001 foo # This differs from Unix, which adds ownership information. # drwxrwx--- 2 root root 4096 Aug 11 2001 foo # # To find the date, we split the line on spaces and iterate on words # until we find a month. This cannot work with files whose owner is a # user named `Jan', or `Feb', etc. However, it's unlikely that `/' # will be owned by a user whose name is a month. So we first look at # the extended ls output of the root directory to decide how many # words should be skipped to get the date. # On HPUX /bin/sh, "set" interprets "-rw-r--r--" as options, so the "x" below. set x`$ls_command /` # Find which argument is the month. month= command= until test $month do shift # Add another shift to the command. command="$command shift;" case $1 in Jan) month=January; nummonth=1;; Feb) month=February; nummonth=2;; Mar) month=March; nummonth=3;; Apr) month=April; nummonth=4;; May) month=May; nummonth=5;; Jun) month=June; nummonth=6;; Jul) month=July; nummonth=7;; Aug) month=August; nummonth=8;; Sep) month=September; nummonth=9;; Oct) month=October; nummonth=10;; Nov) month=November; nummonth=11;; Dec) month=December; nummonth=12;; esac done # Get the extended ls output of the file or directory. set dummy x`eval "$ls_command \"\$save_arg1\""` # Remove all preceding arguments eval $command # Because of the dummy argument above, month is in $2. # # On a POSIX system, we should have # # $# = 5 # $1 = file size # $2 = month # $3 = day # $4 = year or time # $5 = filename # # On Darwin 7.7.0 and 7.6.0, we have # # $# = 4 # $1 = day # $2 = month # $3 = year or time # $4 = filename # Get the month. case $2 in Jan) month=January; nummonth=1;; Feb) month=February; nummonth=2;; Mar) month=March; nummonth=3;; Apr) month=April; nummonth=4;; May) month=May; nummonth=5;; Jun) month=June; nummonth=6;; Jul) month=July; nummonth=7;; Aug) month=August; nummonth=8;; Sep) month=September; nummonth=9;; Oct) month=October; nummonth=10;; Nov) month=November; nummonth=11;; Dec) month=December; nummonth=12;; esac case $3 in ???*) day=$1;; *) day=$3; shift;; esac # Here we have to deal with the problem that the ls output gives either # the time of day or the year. case $3 in *:*) set `date`; eval year=\$$# case $2 in Jan) nummonthtod=1;; Feb) nummonthtod=2;; Mar) nummonthtod=3;; Apr) nummonthtod=4;; May) nummonthtod=5;; Jun) nummonthtod=6;; Jul) nummonthtod=7;; Aug) nummonthtod=8;; Sep) nummonthtod=9;; Oct) nummonthtod=10;; Nov) nummonthtod=11;; Dec) nummonthtod=12;; esac # For the first six month of the year the time notation can also # be used for files modified in the last year. if (expr $nummonth \> $nummonthtod) > /dev/null; then year=`expr $year - 1` fi;; *) year=$3;; esac # The result. echo $day $month $year # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: grub-2.14~git20250718.0e36779/docs/grub-dev.info0000644000175000017500000036526315036452577015353 00000000000000This is grub-dev.info, produced by makeinfo version 6.8 from grub-dev.texi. This developer manual is for GNU GRUB (version 2.14~git20250718.0e36779, 18 July 2025). Copyright (C) 1999,2000,2001,2002,2004,2005,2006,2008,2009,2010,2011 Free Software Foundation, Inc. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections. INFO-DIR-SECTION Kernel START-INFO-DIR-ENTRY * grub-dev: (grub-dev). The GRand Unified Bootloader Dev END-INFO-DIR-ENTRY  File: grub-dev.info, Node: Top, Next: Getting the source code, Up: (dir) GNU GRUB developer manual ************************* This is the developer documentation of GNU GRUB, the GRand Unified Bootloader, a flexible and powerful boot loader program for a wide range of architectures. This edition documents version 2.14~git20250718.0e36779. This developer manual is for GNU GRUB (version 2.14~git20250718.0e36779, 18 July 2025). Copyright (C) 1999,2000,2001,2002,2004,2005,2006,2008,2009,2010,2011 Free Software Foundation, Inc. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections. * Menu: * Getting the source code:: * Coding style:: * Finding your way around:: * Contributing Changes:: * Setting up and running test suite:: * Updating External Code:: * Debugging:: * Porting:: * Error Handling:: * Stack and heap size:: * BIOS port memory map:: * Video Subsystem:: * PFF2 Font File Format:: * Graphical Menu Software Design:: * Verifiers framework:: * Lockdown framework:: * Copying This Manual:: Copying This Manual * Index::  File: grub-dev.info, Node: Getting the source code, Next: Coding style, Prev: Top, Up: Top 1 Getting the source code ************************* GRUB is maintained using the GIT revision control system (https://git-scm.com/book/en/v2). To fetch: git clone git://git.sv.gnu.org/grub.git Web access is available under http://git.savannah.gnu.org/cgit/grub.git/ The branches available are: 'master' Main development branch. 'grub-legacy' GRUB 0.97 codebase. Kept for reference and legal reasons 'multiboot' Multiboot specfication 'multiboot2' Multiboot2 specfication 'developer branches' Prefixed with developer name. Every developer of a team manages his own branches. Developer branches do not need changelog entries. Once you have used 'git clone' to fetch an initial copy of a branch, you can use 'git pull' to keep it up to date. If you have modified your local version, you may need to resolve conflicts when pulling.  File: grub-dev.info, Node: Coding style, Next: Finding your way around, Prev: Getting the source code, Up: Top 2 Coding style ************** Basically we follow the GNU Coding Standards (http://www.gnu.org/prep/standards_toc.html). We define additional conventions for GRUB here. * Menu: * Naming Conventions:: * Functions:: * Variables:: * Types:: * Macros:: * Comments:: * Multi-Line Comments::  File: grub-dev.info, Node: Naming Conventions, Next: Functions, Up: Coding style 2.1 Naming Conventions ====================== All global symbols (i.e. functions, variables, types, and macros) must have the prefix grub_ or GRUB_. The all capital form is used only by macros.  File: grub-dev.info, Node: Functions, Next: Variables, Prev: Naming Conventions, Up: Coding style 2.2 Functions ============= If a function is global, its name must be prefixed with grub_ and must consist of only small letters. If the function belongs to a specific function module, the name must also be prefixed with the module name. For example, if a function is for file systems, its name is prefixed with grub_fs_. If a function is for FAT file system but not for all file systems, its name is prefixed with grub_fs_fat_. The hierarchy is noted this way. After a prefix, a function name must start with a verb (such as get or is). It must not be a noun. Some kind of abbreviation is permitted, as long as it wouldn't make code less readable (e.g. init). If a function is local, its name may not start with any prefix. It must start with a verb.  File: grub-dev.info, Node: Variables, Next: Types, Prev: Functions, Up: Coding style 2.3 Variables ============= The rule is mostly the same as functions, as noted above. If a variable is global, its name must be prefixed with grub_ and must consist of only small letters. If the variable belongs to a specific function module, the name must also be prefixed with the module name. For example, if a function is for dynamic loading, its name is prefixed with grub_dl_. If a variable is for ELF but not for all dynamic loading systems, its name is prefixed with grub_dl_elf_. After a prefix, a variable name must start with a noun or an adjective (such as name or long) and it should end with a noun. Some kind of abbreviation is permitted, as long as it wouldn't make code less readable (e.g. i18n). If a variable is global in the scope of a single file (i.e. it is declared with static), its name may not start with any prefix. It must start with a noun or an adjective. If a variable is local, you may choose any shorter name, as long as it wouldn't make code less readable (e.g. i).  File: grub-dev.info, Node: Types, Next: Macros, Prev: Variables, Up: Coding style 2.4 Types ========= The name of a type must be prefixed with grub_ and must consist of only small letters. If the type belongs to a specific function module, the name must also be prefixed with the module name. For example, if a type is for OS loaders, its name is prefixed with grub_loader_. If a type is for Multiboot but not for all OS loaders, its name is prefixed with grub_loader_linux_. The name must be suffixed with _t, to emphasize the fact that it is a type but not a variable or a function.  File: grub-dev.info, Node: Macros, Next: Comments, Prev: Types, Up: Coding style 2.5 Macros ========== If a macro is global, its name must be prefixed with GRUB_ and must consist of only large letters. Other rules are the same as functions or variables, depending on whether a macro is used like a function or a variable.  File: grub-dev.info, Node: Comments, Next: Multi-Line Comments, Prev: Macros, Up: Coding style 2.6 Comments ============ All comments shall be C-style comments, of the form '/* ... */'. A comment can be placed immediately preceding the entity it describes or it can be placed together with code, variable declarations, or other non-comment entities. However, it is recommended to not mix various forms especially in types/structs descriptions. Acceptable: /* The page # that is the front buffer. */ int displayed_page; int render_page; /* The page # that is the back buffer. */  File: grub-dev.info, Node: Multi-Line Comments, Prev: Comments, Up: Coding style 2.7 Multi-Line Comments ======================= Comments spanning multiple lines shall be formatted with all lines after the first aligned with the first line. Asterisk characters should be repeated at the start of each subsequent line. Acceptable: /* * This is a comment * which spans multiple lines. * It is long. */ Unacceptable: /* This is a comment which spans multiple lines. It is long. */ /* * This is a comment * which spans multiple lines. * It is long. */ /* This is a comment * which spans multiple lines. * It is long. */ In particular first unacceptable form makes comment difficult to distinguish from the code itself. Especially if it contains the code snippets and/or is long. So, its usage is disallowed.  File: grub-dev.info, Node: Finding your way around, Next: Contributing Changes, Prev: Coding style, Up: Top 3 Finding your way around ************************* Here is a brief map of the GRUB code base. GRUB uses Autoconf and Automake, with most of the Automake input generated by a Python script. The top-level build rules are in 'configure.ac', 'grub-core/Makefile.core.def', and 'Makefile.util.def'. Each block in a '*.def' file represents a build target, and specifies the source files used to build it on various platforms. The '*.def' files are processed into Automake input by 'gentpl.py' (which you only need to look at if you are extending the build system). If you are adding a new module which follows an existing pattern, such as a new command or a new filesystem implementation, it is usually easiest to grep 'grub-core/Makefile.core.def' and 'Makefile.util.def' for an existing example of that pattern to find out where it should be added. In general, code that may be run at boot time is in a subdirectory of 'grub-core', while code that is only run from within a full operating system is in a subdirectory of the top level. Low-level boot code, such as the MBR implementation on PC BIOS systems, is in the 'grub-core/boot/' directory. The GRUB kernel is in 'grub-core/kern/'. This contains core facilities such as the device, disk, and file frameworks, environment variable handling, list processing, and so on. The kernel should contain enough to get up to a rescue prompt. Header files for kernel facilities, among others, are in 'include/'. Terminal implementations are in 'grub-core/term/'. Disk access code is spread across 'grub-core/disk/' (for accessing the disk devices themselves), 'grub-core/partmap/' (for interpreting partition table data), and 'grub-core/fs/' (for accessing filesystems). Note that, with the odd specialised exception, GRUB only contains code to _read_ from filesystems and tries to avoid containing any code to _write_ to filesystems; this lets us confidently assure users that GRUB cannot be responsible for filesystem corruption. PCI and USB bus handling is in 'grub-core/bus/'. Video handling code is in 'grub-core/video/'. The graphical menu system uses this heavily, but is in a separate directory, 'grub-core/gfxmenu/'. Most commands are implemented by files in 'grub-core/commands/', with the following exceptions: * A few core commands live in 'grub-core/kern/corecmd.c'. * Commands related to normal mode live under 'grub-core/normal/'. * Commands that load and boot kernels live under 'grub-core/loader/'. * The 'loopback' command is really a disk device, and so lives in 'grub-core/disk/loopback.c'. * The 'gettext' command lives under 'grub-core/gettext/'. * The 'loadfont' and 'lsfonts' commands live under 'grub-core/font/'. * The 'serial', 'terminfo', and 'background_image' commands live under 'grub-core/term/'. * The 'efiemu_*' commands live under 'grub-core/efiemu/'. * OS-dependent code should be under 'grub-core/osdep/' * Utility programs meant to be run from a full operating system (except OS-dependent code mentioned previously) are in 'util/'. There are a few other special-purpose exceptions; grep for them if they matter to you.  File: grub-dev.info, Node: Contributing Changes, Next: Setting up and running test suite, Prev: Finding your way around, Up: Top 4 Contributing changes ********************** Contributing changes to GRUB 2 is welcomed activity. However we have a bit of control what kind of changes will be accepted to GRUB 2. Therefore it is important to discuss your changes on grub-devel mailing list (see MailingLists). On this page there are some basic details on the development process and activities. First of all you should come up with the idea yourself what you want to contribute. If you do not have that beforehand you are advised to study this manual and try GRUB 2 out to see what you think is missing from there. Here are additional pointers: * GRUB's Task Tracker (https://savannah.gnu.org/task/?group=grub) * GRUB's Bug Tracker (https://savannah.gnu.org/bugs/?group=grub) If you intended to make changes to GRUB Legacy (<=0.97) those are not accepted anymore. * Menu: * Getting started:: * Typical Developer Experience:: * When you are approved for write access to project's files::  File: grub-dev.info, Node: Getting started, Next: Typical Developer Experience, Up: Contributing Changes 4.1 Getting started =================== * Always use latest GRUB 2 source code. So get that first. For developers it is recommended always to use the newest development version of GRUB 2. If development takes a long period of time, please remember to keep in sync with newest developments regularly so it is much easier to integrate your change in the future. GRUB 2 is being developed in a GIT repository. Please check Savannah's GRUB project page for details how to get newest git: GRUB 2 git Repository (https://savannah.gnu.org/git/?group=grub) * Compile it and try it out. It is always good idea to first see that things work somehow and after that to start to implement new features or develop fixes to bugs. * Study the code. There are sometimes odd ways to do things in GRUB 2 code base. This is mainly related to limited environment where GRUB 2 is being executed. You usually do not need to understand it all so it is better to only try to look at places that relates to your work. Please do not hesitate to ask for help if there is something that you do not understand. * Develop a new feature. Now that you know what to do and how it should work in GRUB 2 code base, please be free to develop it. If you have not so far announced your idea on grub-devel mailing list, please do it now. This is to make sure you are not wasting your time working on the solution that will not be integrated to GRUB 2 code base. You might want to study our coding style before starting development so you do not need to change much of the code when your patch is being reviewed. (see *note Coding style::) For every accepted patch there has to exist a ChangeLog entry. Our ChangeLog consist of changes within source code and are not describing about what the change logically does. Please see examples from previous entries. Also remember that GRUB 2 is licensed under GPLv3 license and that usually means that you are not allowed to copy pieces of code from other projects. Even if the source project's license would be compatible with GPLv3, please discuss it beforehand on grub-devel mailing list. * Test your change. Test that your change works properly. Try it out a couple of times, preferably on different systems, and try to find problems with it. * Publish your change. When you are happy with your change, first make sure it is compilable with latest development version of GRUB 2. After that please send a patch to grub-devel for review. Please describe in your email why you made the change, what it changes and so on. Please be prepared to receive even discouraging comments about your patch. There is usually at least something that needs to be improved in every patch. Please use unified diff to make your patch (good match of arguments for diff is '-pruN'). * Respond to received feedback. If you are asked to modify your patch, please do that and resubmit it for review. If your change is large you are required to submit a copyright agreement to FSF. Please keep in mind that if you are asked to submit for copyright agreement, process can take some time and is mandatory in order to get your changes integrated. If you are not on grub-devel to respond to questions, most likely your patch will not be accepted. Also if problems arise from your changes later on, it would be preferable that you also fix the problem. So stay around for a while. * Your patch is accepted. Good job! Your patch will now be integrated into GRUB 2 mainline, and if it didn't break anything it will be publicly available in the next release. Now you are welcome to do further improvements :)  File: grub-dev.info, Node: Typical Developer Experience, Next: When you are approved for write access to project's files, Prev: Getting started, Up: Contributing Changes 4.2 Typical Developer Experience ================================ The typical experience for a developer in this project is the following: 1. You find yourself wanting to do something (e.g. fixing a bug). 2. You show some result in the mailing list or the IRC. 3. You are getting to be known to other developers. 4. You accumulate significant amount of contribution, so copyright assignment is processed. 5. You are free to check in your changes on your own, legally speaking. At this point, it is rather annoying that you ought to ask somebody else every change to be checked in. For efficiency, it is far better, if you can commit it yourself. Therefore, our policy is to give you the write permission to our official repository, once you have shown your skill and will, and the FSF clerks have dealt with your copyright assignment.  File: grub-dev.info, Node: When you are approved for write access to project's files, Prev: Typical Developer Experience, Up: Contributing Changes 4.3 When you are approved for write access to project's files ============================================================= As you might know, GRUB is hosted on Savannah (https://savannah.gnu.org/projects/grub), thus the membership is managed by Savannah. This means that, if you want to be a member of this project: 1. You need to create your own account on Savannah. 2. You can submit "Request for Inclusion" from "My Groups" on Savannah. Then, one of the admins can approve your request, and you will be a member. If you don't want to use the Savannah interface to submit a request, you can simply notify the admins by email or something else, alternatively. But you still need to create an account beforehand. NOTE: we sometimes receive a "Request for Inclusion" from an unknown person. In this case, the request would be just discarded, since it is too dangerous to allow a stranger to be a member, which automatically gives him a commit right to the repository, both for a legal reason and for a technical reason. If your intention is to just get started, please do not submit a inclusion request. Instead, please subscribe to the mailing list, and communicate first (e.g. sending a patch, asking a question, commenting on another message...).  File: grub-dev.info, Node: Setting up and running test suite, Next: Updating External Code, Prev: Contributing Changes, Up: Top 5 Setting up and running test suite *********************************** GRUB is basically a tiny operating system with read support for many file systems and which has been ported to a variety of architectures. As such, its test suite has quite a few dependencies required to fully run the suite. These dependencies are currently documented in the INSTALL (https://git.savannah.gnu.org/cgit/grub.git/tree/INSTALL) file in the source repository. Once installed, the test suite can be started by running the 'make check' command from the GRUB build directory.  File: grub-dev.info, Node: Updating External Code, Next: Debugging, Prev: Setting up and running test suite, Up: Top 6 Updating external code ************************ GRUB includes some code from other projects, and it is sometimes necessary to update it. * Menu: * Gnulib:: * jsmn:: * minilzo:: * libtasn1:: * libgcrypt::  File: grub-dev.info, Node: Gnulib, Next: jsmn, Up: Updating External Code 6.1 Gnulib ========== Gnulib is a source code library that provides basic functionality to programs and libraries. Many software packages make use of Gnulib to avoid reinventing the portability wheel. GRUB imports Gnulib using its 'bootstrap' utility, identifying a particular Git commit in 'bootstrap.conf'. To upgrade to a new Gnulib commit, set 'GNULIB_REVISION' in 'bootstrap.conf' to the new commit ID, then run './bootstrap' and whatever else you need to make sure it works. Check for changes to Gnulib's 'NEWS' file between the old and new commits; in some cases it will be necessary to adjust GRUB to match. You may also need to update the patches in 'grub-core/lib/gnulib-patches/'. To add a new Gnulib module or remove one that is no longer needed, change 'gnulib_modules' in 'bootstrap.conf'. Again, run './bootstrap' and whatever else you need to make sure it works. Bootstrapping from an older distribution containing gettext version < 0.18.3, will require a patch similar to this to be applied first before running the './bootstrap' utility: diff --git a/bootstrap.conf b/bootstrap.conf index 988dda0..a3193a9 100644 --- a/bootstrap.conf +++ b/bootstrap.conf @ -67,7 +67,7 @ SKIP_PO=t buildreq="\ autoconf 2.63 automake 1.11 -gettext 0.18.3 +gettext 0.17 git 1.5.5 tar - " diff --git a/configure.ac b/configure.ac index 08b518f..99f5b36 100644 --- a/configure.ac +++ b/configure.ac @ -362,7 +362,7 @ AC_CHECK_PROG(HAVE_CXX, $CXX, yes, no) AC_GNU_SOURCE AM_GNU_GETTEXT([external]) -AM_GNU_GETTEXT_VERSION([0.18.3]) +AM_GNU_GETTEXT_VERSION([0.17]) AC_SYS_LARGEFILE # Identify characteristics of the host architecture. It will also be necessary to adjust the patches in 'po/gettext-patches/' to apply to an older version of gettext.  File: grub-dev.info, Node: jsmn, Next: minilzo, Prev: Gnulib, Up: Updating External Code 6.2 jsmn ======== jsmn is a minimalistic JSON parser which is implemented in a single header file 'jsmn.h'. To import a different version of the jsmn parser, you may simply download the 'jsmn.h' header from the desired tag or commit to the target directory: curl -L https://raw.githubusercontent.com/zserge/jsmn/v1.1.0/jsmn.h \ -o grub-core/lib/json/jsmn.h  File: grub-dev.info, Node: minilzo, Next: libtasn1, Prev: jsmn, Up: Updating External Code 6.3 minilzo =========== miniLZO is a very lightweight subset of the LZO library intended for easy inclusion in other projects. It is generated automatically from the LZO source code and contains the most important LZO functions. To upgrade to a new version of the miniLZO library, download the release tarball and copy the files into the target directory: curl -L -O https://www.oberhumer.com/opensource/lzo/download/minilzo-2.10.tar.gz tar -zxf minilzo-2.10.tar.gz rm minilzo-2.10/testmini.c rm -r grub-core/lib/minilzo/* cp minilzo-2.10/*.[hc] grub-core/lib/minilzo rm -r minilzo-2.10*  File: grub-dev.info, Node: libtasn1, Next: libgcrypt, Prev: minilzo, Up: Updating External Code 6.4 libtasn1 ============ libtasn1 is a library providing Abstract Syntax Notation One (ASN.1, as specified by the X.680 ITU-T recommendation) parsing and structures management, and Distinguished Encoding Rules (DER, as per X.690) encoding and decoding functions. To upgrade to a new version of the libtasn1 library, download the release tarball and copy the files into the target directory: curl -L -O https://ftp.gnu.org/gnu/libtasn1/libtasn1-4.19.0.tar.gz tar xvzf libtasn1-4.19.0.tar.gz rm -rf grub-core/lib/libtasn1 mkdir -p grub-core/lib/libtasn1/lib mkdir -p grub-core/lib/libtasn1/tests cp libtasn1-4.19.0/{README.md,COPYING} grub-core/lib/libtasn1 cp libtasn1-4.19.0/lib/{coding.c,decoding.c,element.c,element.h,errors.c,gstr.c,gstr.h,int.h,parser_aux.c,parser_aux.h,structure.c,structure.h} grub-core/lib/libtasn1/lib cp libtasn1-4.19.0/lib/includes/libtasn1.h grub-core/lib/libtasn1 cp libtasn1-4.19.0/tests/{CVE-2018-1000654-1_asn1_tab.h,CVE-2018-1000654-2_asn1_tab.h,CVE-2018-1000654.c,object-id-decoding.c,object-id-encoding.c,octet-string.c,reproducers.c,Test_overflow.c,Test_simple.c,Test_strings.c} grub-core/lib/libtasn1/tests rm -rf libtasn1-4.19.0* After upgrading the library, it may be necessary to apply the patches in 'grub-core/lib/libtasn1-patches/' to adjust the code to be compatible with GRUB. These patches were needed to use the current version of libtasn1. The existing patches may not apply cleanly, apply at all, or even be needed for a newer version of the library, and other patches may be needed due to changes in the newer version. If existing patches need to be refreshed to apply cleanly, please include updated patches as part of the a patch set sent to the list. If new patches are needed or existing patches are not needed, also please send additions or removals as part of any patch set upgrading libtasn1.  File: grub-dev.info, Node: libgcrypt, Prev: libtasn1, Up: Updating External Code 6.5 libgcrypt ============= libgcrypt is a GNU implementation of crypto library. To import a new version you need to unpack the release tarball into grub-core/lib/libgcrypt. Delete following files/directories: * acinclude.m4 * aclocal.m4 * autogen.rc * autogen.sh * build-aux * ChangeLog * ChangeLog-2011 * doc * INSTALL * m4 * Makefile.am * Makefile.in * NEWS * random * tests * TODO * */Makefile.in * mpi/hppa1.1 Regenerate the file gost-sb.h: grub-core/lib/libgcrypt/cipher$ gcc -o gost-s-box gost-s-box.c grub-core/lib/libgcrypt/cipher$ ./gost-s-box gost-sb.h Then rerun ./bootstrap and pay attention to the errors. Especially to warnings that a file isn't a module as it means that some file is actually unused by GRUB. If any, find where it declares its cipher or hash and add a pattern to import_gcry.py. See commit "libgcrypt: Import blake family of hashes" for an example. If file reallly is useless to GRUB in its current state, add it to whitelist in import_gcry.py. Compile and fix any new errors. Put patches into grub-core/lib/libgcrypt-patches  File: grub-dev.info, Node: Debugging, Next: Porting, Prev: Updating External Code, Up: Top 7 Debugging *********** GRUB2 can be difficult to debug because it runs on the bare-metal and thus does not have the debugging facilities normally provided by an operating system. This chapter aims to provide useful information on some ways to debug GRUB2 for some architectures. It by no means intends to be exhaustive. The focus will be one x86_64 and i386 architectures. Luckily for some issues virtual machines have made the ability to debug GRUB2 much easier, and this chapter will focus debugging via the QEMU virtual machine. We will not be going over debugging of the userland tools (eg. grub-install), there are many tutorials on debugging programs in userland. You will need GDB and the QEMU binaries for your system, on Debian these can be installed with the 'gdb' and 'qemu-system-x86' packages. Also it is assumed that you have already successfully compiled GRUB2 from source for the target specified in the section below and have some familiarity with GDB. When GRUB2 is built it will create many different binaries. The ones of concern will be in the 'grub-core' directory of the GRUB2 build dir. To aide in debugging we will want the debugging symbols generated during the build because these symbols are not kept in the binaries which get installed to the boot location. The build process outputs two sets of binaries, one without symbols which gets executed at boot, and another set of ELF images with debugging symbols. The built images with debugging symbols will have a '.image' suffix, and the ones without a '.img' suffix. Similarly, loadable modules with debugging symbols will have a '.module' suffix, and ones without a '.mod' suffix. In the case of the kernel the binary with symbols is named 'kernel.exec'. In the following sections, information will be provided on debugging on various targets using 'gdb' and the 'gdb_grub' GDB script. * Menu: * i386-pc:: * x86_64-efi::  File: grub-dev.info, Node: i386-pc, Next: x86_64-efi, Up: Debugging 7.1 i386-pc =========== The i386-pc target is a good place to start when first debugging GRUB2 because in some respects it's easier than EFI platforms. The reason being that the initial load address is always known in advance. To start debugging GRUB2 first QEMU must be started in GDB stub mode. The following command is a simple illustration: qemu-system-i386 -drive file=disk.img,format=raw \ -device virtio-scsi-pci,id=scsi0 -S -s This will start a QEMU instance booting from 'disk.img'. It will pause at start waiting for a GDB instance to attach to it. You should change 'disk.img' to something more appropriate. A block device can be used, but you may need to run QEMU as a privileged user. To connect to this QEMU instance with GDB, the 'target remote' GDB command must be used. We also need to load a binary image, preferably with symbols. This can be done using the GDB command 'file kernel.exec', if GDB is started from the 'grub-core' directory in the GRUB2 build directory. GRUB2 developers have made this more simple by including a GDB script which does much of the setup. This file is at 'grub-core/gdb_grub' in the build directory and is also installed via 'make install'. When using a pre-built GRUB, the distribution may have a package which installs this GDB script along with debug symbol binaries, such as Debian's 'grub-pc-dbg' package. The GDB script is intended to be used like so, assuming that '/path/to/script' is the path to the directory containing the gdb_grub script and debug symbol files: cd $(dirname /path/to/script/gdb_grub) gdb -x gdb_grub Once GDB has been started with the 'gdb_grub' script it will automatically connect to the QEMU instance. You can then do things you normally would in GDB like set a break point on GRUB_MAIN. Setting breakpoints in modules is trickier since they haven't been loaded yet and are loaded at addresses determined at runtime. The module could be loaded to different addresses in different QEMU instances. The debug symbols in the modules '.module' binary, thus are always wrong, and GDB needs to be told where to load the symbols to. But this must happen at runtime after GRUB2 has determined where the module will get loaded. Luckily the 'gdb_grub' script takes care of this with the 'runtime_load_module' command, which configures GDB to watch for GRUB2 module loading and when it does add the module symbols with the appropriate offset.  File: grub-dev.info, Node: x86_64-efi, Prev: i386-pc, Up: Debugging 7.2 x86_64-efi ============== Using GDB to debug GRUB2 for the x86_64-efi target has some similarities with the i386-pc target. Please read and familiarize yourself with the *note i386-pc:: section when reading this one. Extra care must be used to run QEMU such that it boots a UEFI firmware. This usually involves either using the '-bios' option with a UEFI firmware blob (eg. 'OVMF.fd') or loading the firmware via pflash. This document will not go further into how to do this as there are ample resource on the web. Like all EFI implementations, on x86_64-efi the (U)EFI firmware that loads the GRUB2 EFI application determines at runtime where the application will be loaded. This means that we do not know where to tell GDB to load the symbols for the GRUB2 core until the (U)EFI firmware determines it. There are two good ways of figuring this out when running in QEMU: use a *note debug build of OVMF: OVMF debug log. and check the debug log, or have GRUB2 say where it is loaded. Neither of these are ideal because they both generally give the information after GRUB2 is already running, which makes debugging early boot infeasible. Technically, the first method does give the load address before GRUB2 is run, but without debugging the EFI firmware with symbols, the author currently does not know how to cause the OVMF firmware to pause at that point to use the load address before GRUB2 is run. Even after getting the application load address, the loading of core symbols is complicated by the fact that the debugging symbols for the kernel are in an ELF binary named 'kernel.exec' while what is in memory are sections for the PE32+ EFI binary. When 'grub-mkimage' creates the PE32+ binary it condenses several segments from the ELF kernel binary into one .data section in the PE32+ binary. This must be taken into account to properly load the other non-text sections. Otherwise, GDB will work as expected when breaking on functions, but, for instance, global variables will point to the wrong address in memory and thus give incorrect values (which can be difficult to debug). Calculating the correct offsets for sections is taken care of automatically when loading the kernel symbols via the user-defined GDB command 'dynamic_load_kernel_exec_symbols', which takes one argument, the address where the text section is loaded as determined by one of the methods above. Alternatively, the command 'dynamic_load_symbols' with the text section address as an agrument can be called to load the kernel symbols and set up loading the module symbols as they are loaded at runtime. In the author's experience, when debugging with QEMU and OVMF, to have debugging symbols loaded at the start of GRUB2 execution the GRUB2 EFI application must be run via QEMU at least once prior in order to get the load address. Two methods for obtaining the load address are described in two subsections below. Generally speaking, the load address does not change between QEMU runs. There are exceptions to this, namely that different GRUB2 EFI applications can be run at different addresses. Also, it has been observed that after running the EFI application for the first time, the second run will sometimes have a different load address, but subsequent runs of the same EFI application will have the same load address as the second run. And it's a near certainty that if the GRUB EFI binary has changed, eg. been recompiled, the load address will also be different. This ability to predict what the load address will be allows one to assume the load address on subsequent runs and thus load the symbols before GRUB2 starts. The following command illustrates this, assuming that QEMU is running and waiting for a debugger connection and the current working directory is where 'gdb_grub' resides: gdb -x gdb_grub -ex 'dynamic_load_symbols ADDRESS OF .TEXT SECTION' If you load the symbols in this manner and, after continuing execution, do not see output showing the module symbols loading, then it is very likely that the load address was incorrect. Another thing to be aware of is how the loading of the GRUB image by the firmware affects previously set software breakpoints. On x86 platforms, software breakpoints are implemented by GDB by writing a special processor instruction at the location of the desired breakpoint. This special instruction when executed will stop the program execution and hand control to the debugger, GDB. GDB will first save the instruction bytes that are overwritten at the breakpoint and will put them back when the breakpoint is hit. If GRUB is being run for the first time in QEMU, the firmware will be loading the GRUB image into memory where every byte is already set to 0. This means that if a breakpoint is set before GRUB is loaded, GDB will save the 0-byte(s) where the the special instruction will go. Then when the firmware loads the GRUB image and because it is unaware of the debugger, it will write the GRUB image to memory, overwriting anything that was there previously -- notably in this case the instruction that implements the software breakpoint. This will be confusing for the person using GDB because GDB will show the breakpoint as set, but the brekapoint will never be hit. Furthermore, GDB then becomes confused, such that even deleting an recreating the breakpoint will not create usable breakpoints. The 'gdb_grub' script takes care of this by saving the breakpoints just before they are overwritten, and then restores them at the start of GRUB execution. So breakpoints for GRUB can be set before GRUB is loaded, but be mindful of this effect if you are confused as to why breakpoints are not getting hit. Also note, that hardware breakpoints do not suffer this problem. They are implemented by having the breakpoint address in special debug registers on the CPU. So they can always be set freely without regard to whether GRUB has been loaded or not. The reason that hardware breakpoints aren't always used is because there are a limited number of them, usually around 4 on various CPUs, and specifically exactly 4 for x86 CPUs. The 'gdb_grub' script goes out of its way to avoid using hardware breakpoints internally and uses them as briefly as possible when needed, thus allowing the user to have a maximal number at their disposal. * Menu: * OVMF debug log:: * Using the gdbinfo command::  File: grub-dev.info, Node: OVMF debug log, Next: Using the gdbinfo command, Up: x86_64-efi 7.2.1 OVMF debug log -------------------- In order to get the GRUB2 load address from OVMF, first, a debug build of OVMF must be obtained (here is one (https://github.com/retrage/edk2-nightly/raw/master/bin/DEBUGX64_OVMF.fd) which is not officially recommended). OVMF will output debug messages to a special serial device, which we must add to QEMU. The following QEMU command will run the debug OVMF and write the debug messages to a file named 'debug.log'. It is assumed that 'disk.img' is a disk image or block device that is set up to boot GRUB2 EFI. qemu-system-x86_64 -bios /path/to/debug/OVMF.fd \ -drive file=disk.img,format=raw \ -device virtio-scsi-pci,id=scsi0 \ -debugcon file:debug.log -global isa-debugcon.iobase=0x402 If GRUB2 was started by the (U)EFI firmware, then in the 'debug.log' file one of the last lines should be a log message like: 'Loading driver at 0x00006AEE000 EntryPoint=0x00006AEE756'. This means that the GRUB2 EFI application was loaded at '0x00006AEE000' and its .text section is at '0x00006AEE756'.  File: grub-dev.info, Node: Using the gdbinfo command, Prev: OVMF debug log, Up: x86_64-efi 7.2.2 Using the gdbinfo command ------------------------------- On EFI platforms the command 'gdbinfo' will output a string that is to be run in a GDB session running with the 'gdb_grub' GDB script.  File: grub-dev.info, Node: Porting, Next: Error Handling, Prev: Debugging, Up: Top 8 Porting ********* GRUB2 is designed to be easily portable accross platforms. But because of the nature of bootloader every new port must be done separately. Here is how I did MIPS (loongson and ARC) and Xen ports. Note than this is more of suggestions, not absolute truth. First of all grab any architecture specifications you can find in public (please avoid NDA). First stage is "Hello world". I've done it outside of GRUB for simplicity. Your task is to have a small program which is loadable as bootloader and clearly shows its presence to you. If you have easily accessible console you can just print a message. If you have a mapped framebuffer you know address of, you can draw a square. If you have a debug facility, just hanging without crashing might be enough. For the first stage you can choose to load the bootloader across the network since format for network image is often easier than for local boot and it skips the need of small intermediary stages and nvram handling. Additionally you can often have a good idea of the needed format by running "file" on any netbootable executable for given platform. This program should probably have 2 parts: an assembler and C one. Assembler one handles BSS cleaning and other needed setup (on some platforms you may need to switch modes or copy the executable to its definitive position). So your code may look like (x86 assembly for illustration purposes) .globl _start _start: movl $_bss_start, %edi movl $_end, %ecx subl %edi, %ecx xorl %eax, %eax cld rep stosb call main static const char msg[] = "Hello, world"; void putchar (int c) { ... } void main (void) { const char *ptr = msg; while (*ptr) putchar (*ptr++); while (1); } Sometimes you need a third file: assembly stubs for ABI-compatibility. Once this file is functional it's time to move it into GRUB2. The startup assembly file goes to grub-core/kern/$cpu/$platform/startup.S. You should also include grub/symbol.h and replace call to entry point with call to EXT_C(grub_main). The C file goes to grub-core/kern/$cpu/$platform/init.c and its entry point is renamed to void grub_machine_init (void). Keep final infinite loop for now. Stubs file if any goes to grub-core/kern/$cpu/$platform/callwrap.S. Sometimes either $cpu or $platform is dropped if file is used on several cpus respectivelyplatforms. Check those locations if they already have what you're looking for. Then modify in configure.ac the following parts: CPU names: case "$target_cpu" in i[[3456]]86) target_cpu=i386 ;; amd64) target_cpu=x86_64 ;; sparc) target_cpu=sparc64 ;; s390x) target_cpu=s390 ;; ... esac Sometimes CPU have additional architecture names which don't influence booting. You might want to have some canonical name to avoid having bunch of identical platforms with different names. NOTE: it doesn't influence compile optimisations which depend solely on chosen compiler and compile options. if test "x$with_platform" = x; then case "$target_cpu"-"$target_vendor" in i386-apple) platform=efi ;; i386-*) platform=pc ;; x86_64-apple) platform=efi ;; x86_64-*) platform=pc ;; powerpc-*) platform=ieee1275 ;; ... esac else ... fi This part deals with guessing the platform from CPU and vendor. Sometimes you need to use 32-bit mode for booting even if OS runs in 64-bit one. If so add your platform to: case "$target_cpu"-"$platform" in x86_64-efi) ;; x86_64-emu) ;; x86_64-*) target_cpu=i386 ;; powerpc64-ieee1275) target_cpu=powerpc ;; esac Add your platform to the list of supported ones: case "$target_cpu"-"$platform" in i386-efi) ;; x86_64-efi) ;; i386-pc) ;; i386-multiboot) ;; i386-coreboot) ;; ... esac If explicit -m32 or -m64 is needed add it to: case "$target_cpu" in i386 | powerpc) target_m32=1 ;; x86_64 | sparc64) target_m64=1 ;; esac Finally you need to add a conditional to the following block: AM_CONDITIONAL([COND_mips_arc], [test x$target_cpu = xmips -a x$platform = xarc]) AM_CONDITIONAL([COND_sparc64_ieee1275], [test x$target_cpu = xsparc64 -a x$platform = xieee1275]) AM_CONDITIONAL([COND_powerpc_ieee1275], [test x$target_cpu = xpowerpc -a x$platform = xieee1275]) Next stop is gentpl.py. You need to add your platform to the list of supported ones (sorry that this list is duplicated): GRUB_PLATFORMS = [ "emu", "i386_pc", "i386_efi", "i386_qemu", "i386_coreboot", "i386_multiboot", "i386_ieee1275", "x86_64_efi", "mips_loongson", "sparc64_ieee1275", "powerpc_ieee1275", "mips_arc", "ia64_efi", "mips_qemu_mips", "s390_mainframe" ] You may also want already to add new platform to one or several of available groups. In particular we always have a group for each CPU even when only one platform for given CPU is available. Then comes grub-core/Makefile.core.def. In the block "kernel" you'll need to define ldflags for your platform ($cpu_$platform_ldflags). You also need to declare startup asm file ($cpu_$platform_startup) as well as any other files (e.g. init.c and callwrap.S) (e.g. $cpu_$platform = kern/$cpu/$platform/init.c). At this stage you will also need to add dummy dl.c and cache.S with functions grub_err_t grub_arch_dl_check_header (void *ehdr), grub_err_t grub_arch_dl_relocate_symbols (grub_dl_t mod, void *ehdr) (dl.c) and void grub_arch_sync_caches (void *address, grub_size_t len) (cache.S). They won't be used for now. You will need to create directory include/$cpu/$platform and a file include/$cpu/types.h. The latter following this template: #ifndef GRUB_TYPES_CPU_HEADER #define GRUB_TYPES_CPU_HEADER 1 /* The size of void *. */ #define GRUB_TARGET_SIZEOF_VOID_P 4 /* The size of long. */ #define GRUB_TARGET_SIZEOF_LONG 4 /* mycpu is big-endian. */ #define GRUB_TARGET_WORDS_BIGENDIAN 1 /* Alternatively: mycpu is little-endian. */ #undef GRUB_TARGET_WORDS_BIGENDIAN #endif /* ! GRUB_TYPES_CPU_HEADER */ You will also need to add a dummy file to datetime and setjmp modules to avoid any of it having no files. It can be just completely empty at this stage. You'll need to make grub-mkimage.c (util/grub_mkimage.c) aware of the needed format. For most commonly used formats like ELF, PE, aout or raw the support is already present and you'll need to make it follow the existant code paths for your platform adding adjustments if necessary. When done compile: ./bootstrap ./configure --target=$cpu --with-platform=$platform TARGET_CC=.. OBJCOPY=... STRIP=... make > /dev/null And create image ./grub-mkimage -d grub-core -O $format_id -o test.img And it's time to test your test.img. If it works next stage is to have heap, console and timer. To have the heap working you need to determine which regions are suitable for heap usage, allocate them from firmware and map (if applicable). Then call grub_mm_init_region (void *start, grub_size_t s) for every of this region. As a shortcut for early port you can allocate right after _end or have a big static array for heap. If you do you'll probably need to come back to this later. As for output console you should distinguish between an array of text, terminfo or graphics-based console. Many of real-world examples don't fit perfectly into any of these categories but one of the models is easier to be used as base. In second and third case you should add your platform to terminfokernel respectively videoinkernel group. A good example of array of text is i386-pc (kern/i386/pc/init.c and term/i386/pc/console.c). Of terminfo is ieee1275 (kern/ieee1275/init.c and term/ieee1275/console.c). Of video is loongson (kern/mips/loongson/init.c). Note that terminfo has to be inited in 2 stages: one before (to get at least rudimentary console as early as possible) and another after the heap (to get full-featured console). For the input there are string of keys, terminfo and direct hardware. For string of keys look at i386-pc (same files), for terminfo ieee1275 (same files) and for hardware loongson (kern/mips/loongson/init.c and term/at_keyboard.c). For the timer you'll need to call grub_install_get_time_ms (...) with as sole argument a function returning a grub_uint64_t of a number of milliseconds elapsed since arbitrary point in the past. Once these steps accomplished you can remove the inifinite loop and you should be able to get to the minimal console. Next step is to have module loading working. For this you'll need to fill kern/$cpu/dl.c and kern/$cpu/cache.S with real handling of relocations and respectively the real sync of I and D caches. Also you'll need to decide where in the image to store the modules. Usual way is to have it concatenated at the end. In this case you'll need to modify startup.S to copy modules out of bss to let's say ALIGN_UP (_end, 8) before cleaning out bss. You'll probably find useful to add total_module_size field to startup.S. In init.c you need to set grub_modbase to the address where modules can be found. You may need grub_modules_get_end () to avoid declaring the space occupied by modules as usable for heap. You can test modules with: ./grub-mkimage -d grub-core -O $format_id -o test.img hello and then running "hello" in the shell. Once this works, you should think of implementing disk access. Look around disk/ for examples. Then, very importantly, you probably need to implement the actual loader (examples available in loader/) Last step to have minimally usable port is to add support to grub-install to put GRUB in a place where firmware or platform will pick it up. Next steps are: filling datetime.c, setjmp.S, network (net/drivers), video (video/), halt (lib/), reboot (lib/). Please add your platform to Platform limitations and Supported kernels chapter in user documentation and mention any steps you skipped which result in reduced features or performance. Here is the quick checklist of features. Some of them are less important than others and skipping them is completely ok, just needs to be mentioned in user documentation. Checklist: * Is heap big enough? * Which charset is supported by console? * Does platform have disk driver? * Do you have network card support? * Are you able to retrieve datetime (with date)? * Are you able to set datetime (with date)? * Is serial supported? * Do you have direct disk support? * Do you have direct keyboard support? * Do you have USB support? * Do you support loading through network? * Do you support loading from disk? * Do you support chainloading? * Do you support network chainloading? * Does cpuid command supports checking all CPU features that the user might want conditionalise on (64-bit mode, hypervisor,...) * Do you support hints? How reliable are they? * Does platform have ACPI? If so do "acpi" and "lsacpi" modules work? * Do any of platform-specific operations mentioned in the relevant section of user manual makes sense on your platform? * Does your platform support PCI? If so is there an appropriate driver for GRUB? * Do you support badram?  File: grub-dev.info, Node: Error Handling, Next: Stack and heap size, Prev: Porting, Up: Top 9 Error Handling **************** Error handling in GRUB 2 is based on exception handling model. As C language doesn't directly support exceptions, exception handling behavior is emulated in software. When exception is raised, function must return to calling function. If calling function does not provide handling of the exception it must return back to its calling function and so on, until exception is handled. If exception is not handled before prompt is displayed, error message will be shown to user. Exception information is stored on 'grub_errno' global variable. If 'grub_errno' variable contains value 'GRUB_ERR_NONE', there is no active exception and application can continue normal processing. When 'grub_errno' has other value, it is required that application code either handles this error or returns instantly to caller. If function is with return type 'grub_err_t' is about to return 'GRUB_ERR_NONE', it should not set 'grub_errno' to that value. Only set 'grub_errno' in cases where there is error situation. Simple exception forwarder. grub_err_t forwarding_example (void) { /* Call function that might cause exception. */ foobar (); /* No special exception handler, just forward possible exceptions. */ if (grub_errno != GRUB_ERR_NONE) { return grub_errno; } /* All is OK, do more processing. */ /* Return OK signal, to caller. */ return GRUB_ERR_NONE; } Error reporting has two components, the actual error code (of type 'grub_err_t') and textual message that will be displayed to user. List of valid error codes is listed in header file 'include/grub/err.h'. Textual error message can contain any textual data. At time of writing, error message can contain up to 256 characters (including terminating NUL). To ease error reporting there is a helper function 'grub_error' that allows easier formatting of error messages and should be used instead of writing directly to global variables. Example of error reporting. grub_err_t failing_example () { return grub_error (GRUB_ERR_FILE_NOT_FOUND, "Failed to read %s, tried %d times.", "test.txt", 10); } If there is a special reason that error code does not need to be taken account, 'grub_errno' can be zeroed back to 'GRUB_ERR_NONE'. In cases like this all previous error codes should have been handled correctly. This makes sure that there are no unhandled exceptions. Example of zeroing 'grub_errno'. grub_err_t probe_example () { /* Try to probe device type 1. */ probe_for_device (); if (grub_errno == GRUB_ERR_NONE) { /* Device type 1 was found on system. */ register_device (); return GRUB_ERR_NONE; } /* Zero out error code. */ grub_errno = GRUB_ERR_NONE; /* No device type 1 found, try to probe device type 2. */ probe_for_device2 (); if (grub_errno == GRUB_ERR_NONE) { /* Device type 2 was found on system. */ register_device2 (); return GRUB_ERR_NONE; } /* Zero out error code. */ grub_errno = GRUB_ERR_NONE; /* Return custom error message. */ return grub_error (GRUB_ERR_UNKNOWN_DEVICE, "No device type 1 or 2 found."); } Some times there is a need to continue processing even if there is a error state in application. In situations like this, there is a needed to save old error state and then call other functions that might fail. To aid in this, there is a error stack implemented. Error state can be pushed to error stack by calling function 'grub_error_push ()'. When processing has been completed, 'grub_error_pop ()' can be used to pop error state from stack. Error stack contains predefined amount of error stack items. Error stack is protected for overflow and marks these situations so overflow error does not get unseen. If there is no space available to store error message, it is simply discarded and overflow will be marked as happened. When overflow happens, it most likely will corrupt error stack consistency as for pushed error there is no matching pop, but overflow message will be shown to inform user about the situation. Overflow message will be shown at time when prompt is about to be drawn. Example usage of error stack. /* Save possible old error message. */ grub_error_push (); /* Do your stuff here. */ call_possibly_failing_function (); if (grub_errno != GRUB_ERR_NONE) { /* Inform rest of the code that there is error (grub_errno is set). There is no pop here as we want both error states to be displayed. */ return; } /* Restore old error state by popping previous item from stack. */ grub_error_pop ();  File: grub-dev.info, Node: Stack and heap size, Next: BIOS port memory map, Prev: Error Handling, Up: Top 10 Stack and heap size ********************** On emu stack and heap are just normal host OS stack and heap. Stack is typically 8 MiB although it's OS-dependent. On i386-pc, i386-coreboot, i386-qemu and i386-multiboot the stack is 60KiB. All available space between 1MiB and 4GiB marks is part of heap. On *-xen stack is 4MiB. If compiled for x86-64 with GCC 4.4 or later addressable space is unlimited. When compiled for x86-64 with older GCC version addressable space is limited to 2GiB. When compiling for i386 addressable space is limited to 4GiB. All addressable pages except the ones for stack, GRUB binary, special pages and page table are in the heap. On *-efi GRUB uses same stack as EFI. If compiled for x86-64 with GCC 4.4 or later addressable space is unlimited. When compiled for x86-64 with older GCC version addressable space is limited to 2GiB. For all other platforms addressable space is limited to 4GiB. GRUB allocates pages from EFI for its heap, at most 1.6 GiB. On i386-ieee1275 and powerpc-ieee1275 GRUB uses same stack as IEEE1275. On i386-ieee1275 and powerpc-ieee1275, GRUB will allocate 32MiB for its heap on startup. It may allocate more at runtime, as long as at least 128MiB remain free in OpenFirmware. On sparc64-ieee1275 stack is 256KiB and heap is 2MiB. On mips(el)-qemu_mips and mipsel-loongson stack is 2MiB (everything below GRUB image) and everything above GRUB image (from 2MiB + kernel size) until 256MiB is part of heap. On mips-arc stack is 2MiB (everything below GRUB image) and everything above GRUB image(from 2MiB + kernel size) until 128MiB is part of heap. On mipsel-arc stack is 2MiB (everything below GRUB image which is not part of ARC) and everything above GRUB image (from 7MiB + kernel size) until 256MiB is part of heap. On arm-uboot stack is 256KiB and heap is 2MiB. In short: Platform Stack Heap -------------------------------------------------------------------- emu 8 MiB ? i386-pc 60 KiB < 4 GiB i386-coreboot60 KiB < 4 GiB i386-multiboot60 KiB < 4 GiB i386-qemu 60 KiB < 4 GiB *-efi ? < 1.6 GiB i386-ieee1275? < 32 MiB powerpc-ieee1275? available memory - 128MiB sparc64-ieee1275256KiB 2 MiB arm-uboot 256KiB 2 MiB mips(el)-qemu_mips2MiB 253 MiB mipsel-loongson2MiB 253 MiB mips-arc 2MiB 125 MiB mipsel-arc 2MiB 248 MiB x86_64-xen 4MiB unlimited (GCC >= 4.4) x86_64-xen 4MiB < 2GiB (GCC < 4.4) i386-xen 4MiB < 4GiB  File: grub-dev.info, Node: BIOS port memory map, Next: Video Subsystem, Prev: Stack and heap size, Up: Top 11 BIOS port memory map *********************** Start End Usage -------------------------------------------------------------------- 0 0x1000 - 1 BIOS and real mode interrupts 0x07BE 0x07FF Partition table passed to another boot loader ? 0x2000 - 1 Real mode stack 0x7C00 0x7D00 - 1 Boot sector 0x8000 ? GRUB kernel 0x68000 0x71000 - 1 Disk buffer ? 0x80000 - 1 Protected mode stack ? 0xA0000 - 1 Extended BIOS Data Area 0xA0000 0xC0000 - 1 Video RAM 0xC0000 0x100000 - 1 BIOS 0x100000 ? Heap and module code  File: grub-dev.info, Node: Video Subsystem, Next: PFF2 Font File Format, Prev: BIOS port memory map, Up: Top 12 Video Subsystem ****************** This document contains specification for Video Subsystem for GRUB2. Currently only the usage interface is described in this document. Internal structure of how video drivers are registering and how video driver manager works are not included here. * Menu: * Video API:: * Example usage of Video API:: * Bitmap API::  File: grub-dev.info, Node: Video API, Next: Example usage of Video API, Up: Video Subsystem 12.1 Video API ============== 12.1.1 grub_video_setup ----------------------- * Prototype: grub_err_t grub_video_setup (unsigned int width, unsigned int height, unsigned int mode_type); * Description: Driver will use information provided to it to select best possible video mode and switch to it. Supported values for 'mode_type' are 'GRUB_VIDEO_MODE_TYPE_INDEX_COLOR' for index color modes, 'GRUB_VIDEO_MODE_TYPE_RGB' for direct RGB color modes and 'GRUB_VIDEO_MODE_TYPE_DOUBLE_BUFFERED' for double buffering. When requesting RGB mode, highest bits per pixel mode will be selected. When requesting Index color mode, mode with highest number of colors will be selected. If all parameters are specified as zero, video adapter will try to figure out best possible mode and initialize it, platform specific differences are allowed here. If there is no mode matching request, error X will be returned. If there are no problems, function returns 'GRUB_ERR_NONE'. This function also performs following task upon succesful mode switch. Active rendering target is changed to screen and viewport is maximized to allow whole screen to be used when performing graphics operations. In RGB modes, emulated palette gets 16 entries containing default values for VGA palette, other colors are defined as black. When switching to Indexed Color mode, driver may set default VGA palette to screen if the video card allows the operation. 12.1.2 grub_video_restore ------------------------- * Prototype: grub_err_t grub_video_restore (void); * Description: Video subsystem will deinitialize activated video driver to restore old state of video device. This can be used to switch back to text mode. 12.1.3 grub_video_get_info -------------------------- * Prototype: grub_err_t grub_video_get_info (struct grub_video_mode_info *mode_info); struct grub_video_mode_info { /* Width of the screen. */ unsigned int width; /* Height of the screen. */ unsigned int height; /* Mode type bitmask. Contains information like is it Index color or RGB mode. */ unsigned int mode_type; /* Bits per pixel. */ unsigned int bpp; /* Bytes per pixel. */ unsigned int bytes_per_pixel; /* Pitch of one scanline. How many bytes there are for scanline. */ unsigned int pitch; /* In index color mode, number of colors. In RGB mode this is 256. */ unsigned int number_of_colors; /* Optimization hint how binary data is coded. */ enum grub_video_blit_format blit_format; /* How many bits are reserved for red color. */ unsigned int red_mask_size; /* What is location of red color bits. In Index Color mode, this is 0. */ unsigned int red_field_pos; /* How many bits are reserved for green color. */ unsigned int green_mask_size; /* What is location of green color bits. In Index Color mode, this is 0. */ unsigned int green_field_pos; /* How many bits are reserved for blue color. */ unsigned int blue_mask_size; /* What is location of blue color bits. In Index Color mode, this is 0. */ unsigned int blue_field_pos; /* How many bits are reserved in color. */ unsigned int reserved_mask_size; /* What is location of reserved color bits. In Index Color mode, this is 0. */ unsigned int reserved_field_pos; }; * Description: Software developer can use this function to query properties of active rendering taget. Information provided here can be used by other parts of GRUB, like image loaders to convert loaded images to correct screen format to allow more optimized blitters to be used. If there there is no configured video driver with active screen, error 'GRUB_ERR_BAD_DEVICE' is returned, otherwise 'mode_info' is filled with valid information and 'GRUB_ERR_NONE' is returned. 12.1.4 grub_video_get_blit_format --------------------------------- * Prototype: enum grub_video_blit_format grub_video_get_blit_format (struct grub_video_mode_info *mode_info); enum grub_video_blit_format { /* Follow exactly field & mask information. */ GRUB_VIDEO_BLIT_FORMAT_RGBA, /* Make optimization assumption. */ GRUB_VIDEO_BLIT_FORMAT_R8G8B8A8, /* Follow exactly field & mask information. */ GRUB_VIDEO_BLIT_FORMAT_RGB, /* Make optimization assumption. */ GRUB_VIDEO_BLIT_FORMAT_R8G8B8, /* When needed, decode color or just use value as is. */ GRUB_VIDEO_BLIT_FORMAT_INDEXCOLOR }; * Description: Used to query how data could be optimized to suit specified video mode. Returns exact video format type, or a generic one if there is no definition for the type. For generic formats, use 'grub_video_get_info' to query video color coding settings. 12.1.5 grub_video_set_palette ----------------------------- * Prototype: grub_err_t grub_video_set_palette (unsigned int start, unsigned int count, struct grub_video_palette_data *palette_data); struct grub_video_palette_data { grub_uint8_t r; /* Red color value (0-255). */ grub_uint8_t g; /* Green color value (0-255). */ grub_uint8_t b; /* Blue color value (0-255). */ grub_uint8_t a; /* Reserved bits value (0-255). */ }; * Description: Used to setup indexed color palettes. If mode is RGB mode, colors will be set to emulated palette data. In Indexed Color modes, palettes will be set to hardware. Color values will be converted to suit requirements of the video mode. 'start' will tell what hardware color index (or emulated color index) will be set to according information in first indice of 'palette_data', after that both hardware color index and 'palette_data' index will be incremented until 'count' number of colors have been set. 12.1.6 grub_video_get_palette ----------------------------- * Prototype: grub_err_t grub_video_get_palette (unsigned int start, unsigned int count, struct grub_video_palette_data *palette_data); struct grub_video_palette_data { grub_uint8_t r; /* Red color value (0-255). */ grub_uint8_t g; /* Green color value (0-255). */ grub_uint8_t b; /* Blue color value (0-255). */ grub_uint8_t a; /* Reserved bits value (0-255). */ }; * Description: Used to query indexed color palettes. If mode is RGB mode, colors will be copied from emulated palette data. In Indexed Color modes, palettes will be read from hardware. Color values will be converted to suit structure format. 'start' will tell what hardware color index (or emulated color index) will be used as a source for first indice of 'palette_data', after that both hardware color index and 'palette_data' index will be incremented until 'count' number of colors have been read. 12.1.7 grub_video_set_area_status --------------------------------- * Prototype: grub_err_t grub_video_set_area_status (grub_video_area_status_t area_status); enum grub_video_area_status_t { GRUB_VIDEO_AREA_DISABLED, GRUB_VIDEO_AREA_ENABLED }; * Description: Used to set area drawing mode for redrawing the specified region. Draw commands are performed in the intersection of the viewport and the region called area. Coordinates remain related to the viewport. If draw commands try to draw over the area, they are clipped. Set status to DISABLED if you need to draw everything. Set status to ENABLED and region to the desired rectangle to redraw everything inside the region leaving everything else intact. Should be used for redrawing of active elements. 12.1.8 grub_video_get_area_status --------------------------------- * Prototype: grub_err_r grub_video_get_area_status (grub_video_area_status_t *area_status); * Description: Used to query the area status. 12.1.9 grub_video_set_viewport ------------------------------ * Prototype: grub_err_t grub_video_set_viewport (unsigned int x, unsigned int y, unsigned int width, unsigned int height); * Description: Used to specify viewport where draw commands are performed. When viewport is set, all draw commands coordinates relate to those specified by 'x' and 'y'. If draw commands try to draw over viewport, they are clipped. If developer requests larger than possible viewport, width and height will be clamped to fit screen. If 'x' and 'y' are out of bounds, all functions drawing to screen will not be displayed. In order to maximize viewport, use 'grub_video_get_info' to query actual screen dimensions and provide that information to this function. 12.1.10 grub_video_get_viewport ------------------------------- * Prototype: grub_err_t grub_video_get_viewport (unsigned int *x, unsigned int *y, unsigned int *width, unsigned int *height); * Description: Used to query current viewport dimensions. Software developer can use this to choose best way to render contents of the viewport. 12.1.11 grub_video_set_region ----------------------------- * Prototype: grub_err_t grub_video_set_region (unsigned int x, unsigned int y, unsigned int width, unsigned int height); * Description: Used to specify the region of the screen which should be redrawn. Use absolute values. When the region is set and area status is ENABLE all draw commands will be performed inside the interseption of region and viewport named area. If draw commands try to draw over viewport, they are clipped. If developer requests larger than possible region, width and height will be clamped to fit screen. Should be used for redrawing of active elements. 12.1.12 grub_video_get_region ----------------------------- * Prototype: grub_err_t grub_video_get_region (unsigned int *x, unsigned int *y, unsigned int *width, unsigned int *height); * Description: Used to query current region dimensions. 12.1.13 grub_video_map_color ---------------------------- * Prototype: grub_video_color_t grub_video_map_color (grub_uint32_t color_name); * Description: Map color can be used to support color themes in GRUB. There will be collection of color names that can be used to query actual screen mapped color data. Examples could be 'GRUB_COLOR_CONSOLE_BACKGROUND', 'GRUB_COLOR_CONSOLE_TEXT'. The actual color defines are not specified at this point. 12.1.14 grub_video_map_rgb -------------------------- * Prototype: grub_video_color_t grub_video_map_rgb (grub_uint8_t red, grub_uint8_t green, grub_uint8_t blue); * Description: Map RGB values to compatible screen color data. Values are expected to be in range 0-255 and in RGB modes they will be converted to screen color data. In index color modes, index color palette will be searched for specified color and then index is returned. 12.1.15 grub_video_map_rgba --------------------------- * Prototype: grub_video_color_t grub_video_map_rgba (grub_uint8_t red, grub_uint8_t green, grub_uint8_t blue, grub_uint8_t alpha); * Description: Map RGBA values to compatible screen color data. Values are expected to be in range 0-255. In RGBA modes they will be converted to screen color data. In index color modes, index color palette will be searched for best matching color and its index is returned. 12.1.16 grub_video_unmap_color ------------------------------ * Prototype: grub_err_t grub_video_unmap_color (grub_video_color_t color, grub_uint8_t *red, grub_uint8_t *green, grub_uint8_t *blue, grub_uint8_t *alpha); * Description: Unmap color value from 'color' to color channels in 'red', 'green', 'blue' and 'alpha'. Values will be in range 0-255. Active rendering target will be used for color domain. In case alpha information is not available in rendering target, it is assumed to be opaque (having value 255). 12.1.17 grub_video_fill_rect ---------------------------- * Prototype: grub_err_t grub_video_fill_rect (grub_video_color_t color, int x, int y, unsigned int width, unsigned int height); * Description: Fill specified area limited by given coordinates within specified viewport. Negative coordinates are accepted in order to allow easy moving of rectangle within viewport. If coordinates are negative, area of the rectangle will be shrinken to follow size limits of the viewport. Software developer should use either 'grub_video_map_color', 'grub_video_map_rgb' or 'grub_video_map_rgba' to map requested color to 'color' parameter. 12.1.18 grub_video_blit_glyph ----------------------------- * Prototype: grub_err_t grub_video_blit_glyph (struct grub_font_glyph *glyph, grub_video_color_t color, int x, int y); struct grub_font_glyph { /* TBD. */ }; * Description: Used to blit glyph to viewport in specified coodinates. If glyph is at edge of viewport, pixels outside of viewport will be clipped out. Software developer should use either 'grub_video_map_rgb' or 'grub_video_map_rgba' to map requested color to 'color' parameter. 12.1.19 grub_video_blit_bitmap ------------------------------ * Prototype: grub_err_t grub_video_blit_bitmap (struct grub_video_bitmap *bitmap, enum grub_video_blit_operators oper, int x, int y, int offset_x, int offset_y, unsigned int width, unsigned int height); struct grub_video_bitmap { /* TBD. */ }; enum grub_video_blit_operators { GRUB_VIDEO_BLIT_REPLACE, GRUB_VIDEO_BLIT_BLEND }; * Description: Used to blit bitmap to viewport in specified coordinates. If part of bitmap is outside of viewport region, it will be clipped out. Offsets affect bitmap position where data will be copied from. Negative values for both viewport coordinates and bitmap offset coordinates are allowed. If data is looked out of bounds of bitmap, color value will be assumed to be transparent. If viewport coordinates are negative, area of the blitted rectangle will be shrinken to follow size limits of the viewport and bitmap. Blitting operator 'oper' specifies should source pixel replace data in screen or blend with pixel alpha value. Software developer should use 'grub_video_bitmap_create' or 'grub_video_bitmap_load' to create or load bitmap data. 12.1.20 grub_video_blit_render_target ------------------------------------- * Prototype: grub_err_t grub_video_blit_render_target (struct grub_video_render_target *source, enum grub_video_blit_operators oper, int x, int y, int offset_x, int offset_y, unsigned int width, unsigned int height); struct grub_video_render_target { /* This is private data for video driver. Should not be accessed from elsewhere directly. */ }; enum grub_video_blit_operators { GRUB_VIDEO_BLIT_REPLACE, GRUB_VIDEO_BLIT_BLEND }; * Description: Used to blit source render target to viewport in specified coordinates. If part of source render target is outside of viewport region, it will be clipped out. If blitting operator is specified and source contains alpha values, resulting pixel color components will be calculated using formula ((src_color * src_alpha) + (dst_color * (255 - src_alpha)) / 255, if target buffer has alpha, it will be set to src_alpha. Offsets affect render target position where data will be copied from. If data is looked out of bounds of render target, color value will be assumed to be transparent. Blitting operator 'oper' specifies should source pixel replace data in screen or blend with pixel alpha value. 12.1.21 grub_video_scroll ------------------------- * Prototype: grub_err_t grub_video_scroll (grub_video_color_t color, int dx, int dy); * Description: Used to scroll viewport to specified direction. New areas are filled with specified color. This function is used when screen is scroller up in video terminal. 12.1.22 grub_video_swap_buffers ------------------------------- * Prototype: grub_err_t grub_video_swap_buffers (void); * Description: If double buffering is enabled, this swaps frontbuffer and backbuffer, in order to show values drawn to back buffer. Video driver is free to choose how this operation is techincally done. 12.1.23 grub_video_create_render_target --------------------------------------- * Prototype: grub_err_t grub_video_create_render_target (struct grub_video_render_target **result, unsigned int width, unsigned int height, unsigned int mode_type); struct grub_video_render_target { /* This is private data for video driver. Should not be accessed from elsewhere directly. */ }; * Description: Driver will use information provided to it to create best fitting render target. 'mode_type' will be used to guide on selecting what features are wanted for render target. Supported values for 'mode_type' are 'GRUB_VIDEO_MODE_TYPE_INDEX_COLOR' for index color modes, 'GRUB_VIDEO_MODE_TYPE_RGB' for direct RGB color modes and 'GRUB_VIDEO_MODE_TYPE_ALPHA' for alpha component. 12.1.24 grub_video_delete_render_target --------------------------------------- * Prototype: grub_err_t grub_video_delete_render_target (struct grub_video_render_target *target); * Description: Used to delete previously created render target. If 'target' contains 'NULL' pointer, nothing will be done. If render target is correctly destroyed, GRUB_ERR_NONE is returned. 12.1.25 grub_video_set_active_render_target ------------------------------------------- * Prototype: grub_err_t grub_video_set_active_render_target (struct grub_video_render_target *target); * Description: Sets active render target. If this comand is successful all drawing commands will be done to specified 'target'. There is also special values for target, 'GRUB_VIDEO_RENDER_TARGET_DISPLAY' used to reference screen's front buffer, 'GRUB_VIDEO_RENDER_TARGET_FRONT_BUFFER' used to reference screen's front buffer (alias for 'GRUB_VIDEO_RENDER_TARGET_DISPLAY') and 'GRUB_VIDEO_RENDER_TARGET_BACK_BUFFER' used to reference back buffer (if double buffering is enabled). If render target is correclty switched GRUB_ERR_NONE is returned. In no any event shall there be non drawable active render target. 12.1.26 grub_video_get_active_render_target ------------------------------------------- * Prototype: grub_err_t grub_video_get_active_render_target (struct grub_video_render_target **target); * Description: Returns currently active render target. It returns value in 'target' that can be subsequently issued back to 'grub_video_set_active_render_target'.  File: grub-dev.info, Node: Example usage of Video API, Next: Bitmap API, Prev: Video API, Up: Video Subsystem 12.2 Example usage of Video API =============================== 12.2.1 Example of screen setup ------------------------------ grub_err_t rc; /* Try to initialize video mode 1024 x 768 with direct RGB. */ rc = grub_video_setup (1024, 768, GRUB_VIDEO_MODE_TYPE_RGB); if (rc != GRUB_ERR_NONE) { /* Fall back to standard VGA Index Color mode. */ rc = grub_video_setup (640, 480, GRUB_VIDEO_MODE_TYPE_INDEX); if (rc != GRUB_ERR_NONE) { /* Handle error. */ } } 12.2.2 Example of setting up console viewport --------------------------------------------- grub_uint32_t x, y, width, height; grub_video_color_t color; struct grub_font_glyph glyph; grub_err_t rc; /* Query existing viewport. */ grub_video_get_viewport (&x, &y, &width, &height); /* Fill background. */ color = grub_video_map_color (GRUB_COLOR_BACKGROUND); grub_video_fill_rect (color, 0, 0, width, height); /* Setup console viewport. */ grub_video_set_viewport (x + 10, y + 10, width - 20, height - 20); grub_video_get_viewport (&x, &y, &width, &height); color = grub_video_map_color (GRUB_COLOR_CONSOLE_BACKGROUND); grub_video_fill_rect (color, 0, 0, width, height); /* Draw text to viewport. */ color = grub_video_map_color (GRUB_COLOR_CONSOLE_TEXT); grub_font_get_glyph ('X', &glyph); grub_video_blit_glyph (&glyph, color, 0, 0);  File: grub-dev.info, Node: Bitmap API, Prev: Example usage of Video API, Up: Video Subsystem 12.3 Bitmap API =============== 12.3.1 grub_video_bitmap_create ------------------------------- * Prototype: grub_err_t grub_video_bitmap_create (struct grub_video_bitmap **bitmap, unsigned int width, unsigned int height, enum grub_video_blit_format blit_format) * Description: Creates a new bitmap with given dimensions and blitting format. Allocated bitmap data can then be modified freely and finally blitted with 'grub_video_blit_bitmap' to rendering target. 12.3.2 grub_video_bitmap_destroy -------------------------------- * Prototype: grub_err_t grub_video_bitmap_destroy (struct grub_video_bitmap *bitmap); * Description: When bitmap is no longer needed, it can be freed from memory using this command. 'bitmap' is previously allocated bitmap with 'grub_video_bitmap_create' or loaded with 'grub_video_bitmap_load'. 12.3.3 grub_video_bitmap_load ----------------------------- * Prototype: grub_err_t grub_video_bitmap_load (struct grub_video_bitmap **bitmap, const char *filename); * Description: Tries to load given bitmap ('filename') using registered bitmap loaders. In case bitmap format is not recognized or supported error 'GRUB_ERR_BAD_FILE_TYPE' is returned. 12.3.4 grub_video_bitmap_get_width ---------------------------------- * Prototype: unsigned int grub_video_bitmap_get_width (struct grub_video_bitmap *bitmap); * Description: Returns bitmap width. 12.3.5 grub_video_bitmap_get_height ----------------------------------- * Prototype: unsigned int grub_video_bitmap_get_height (struct grub_video_bitmap *bitmap); * Description: Return bitmap height. 12.3.6 grub_video_bitmap_get_mode_info -------------------------------------- * Prototype: void grub_video_bitmap_get_mode_info (struct grub_video_bitmap *bitmap, struct grub_video_mode_info *mode_info); * Description: Returns bitmap format details in form of 'grub_video_mode_info'. 12.3.7 grub_video_bitmap_get_data --------------------------------- * Prototype: void *grub_video_bitmap_get_data (struct grub_video_bitmap *bitmap); * Description: Return pointer to bitmap data. Contents of the pointed data can be freely modified. There is no extra protection against going off the bounds so you have to be carefull how to access the data.  File: grub-dev.info, Node: PFF2 Font File Format, Next: Graphical Menu Software Design, Prev: Video Subsystem, Up: Top 13 PFF2 Font File Format ************************ * Menu: * Introduction:: * File Structure:: * Font Metrics::  File: grub-dev.info, Node: Introduction, Next: File Structure, Up: PFF2 Font File Format 13.1 Introduction ================= The goal of this format is to provide a bitmap font format that is simple to use, compact, and cleanly supports Unicode. 13.1.1 Goals of the GRUB Font Format ------------------------------------ * Simple to read and use. Since GRUB will only be reading the font files, we are more concerned with making the code to read the font simple than we are with writing the font. * Compact storage. The fonts will generally be stored in a small boot partition where GRUB is located, and this may be on a removable storage device such as a CD or USB flash drive where space is more limited than it is on most hard drives. * Unicode. GRUB should not have to deal with multiple character encodings. The font should always use Unicode character codes for simple internationalization. 13.1.2 Why Another Font Format? ------------------------------- There are many existing bitmap font formats that GRUB could use. However, there are aspects of these formats that may make them less than suitable for use in GRUB at this time: 'BDF' Inefficient storage; uses ASCII to describe properties and hexadecimal numbers in ASCII for the bitmap rows. 'PCF' Many format variations such as byte order and bitmap padding (rows padded to byte, word, etc.) would result in more complex code to handle the font format.  File: grub-dev.info, Node: File Structure, Next: Font Metrics, Prev: Introduction, Up: PFF2 Font File Format 13.2 File Structure =================== A file *section* consists of a 4-byte name, a 32-bit big-endian length (not including the name or length), and then LENGTH more section-type-specific bytes. The standard file extension for PFF2 font files is '.pf2'. 13.2.1 Section Types -------------------- 'FILE' *File type ID* (ASCII string). This must be the first section in the file. It has length 4 and the contents are the four bytes of the ASCII string 'PFF2'. 'NAME' *Font name* (ASCII string). This is the full font name including family, weight, style, and point size. For instance, "Helvetica Bold Italic 14". 'FAMI' *Font family name* (ASCII string). For instance, "Helvetica". This should be included so that intelligent font substitution can take place. 'WEIG' *Font weight* (ASCII string). Valid values are 'bold' and 'normal'. This should be included so that intelligent font substitution can take place. 'SLAN' *Font slant* (ASCII string). Valid values are 'italic' and 'normal'. This should be included so that intelligent font substitution can take place. 'PTSZ' *Font point size* (uint16be). 'MAXW' *Maximum character width in pixels* (uint16be). 'MAXH' *Maximum character height in pixels* (uint16be). 'ASCE' *Ascent in pixels* (uint16be). *Note Font Metrics::, for details. 'DESC' *Descent in pixels* (uint16be). *Note Font Metrics::, for details. 'CHIX' *Character index.* The character index begins with a 32-bit big-endian unsigned integer indicating the total size of the section, not including this size value. For each character, there is an instance of the following entry structure: * *Unicode code point.* (32-bit big-endian integer.) * *Storage flags.* (byte.) * Bits 2..0: If equal to 000 binary, then the character data is stored uncompressed beginning at the offset indicated by the character's *offset* value. If equal to 001 binary, then the character data is stored within a compressed character definition block that begins at the offset within the file indicated by the character's *offset* value. * *Offset.* (32-bit big-endian integer.) A marker that indicates the remainder of the file is data accessed via the character index (CHIX) section. When reading this font file, the rest of the file can be ignored when scanning the sections. The length should be set to -1 (0xFFFFFFFF). Supported data structures: Character definition Each character definition consists of: * *Width.* Width of the bitmap in pixels. The bitmap's extents represent the glyph's bounding box. 'uint16be'. * *Height.* Height of the bitmap in pixels. The bitmap's extents represent the glyph's bounding box. 'uint16be'. * *X offset.* The number of pixels to shift the bitmap by horizontally before drawing the character. 'int16be'. * *Y offset.* The number of pixels to shift the bitmap by vertically before drawing the character. 'int16be'. * *Device width.* The number of pixels to advance horizontally from this character's origin to the origin of the next character. 'int16be'. * *Bitmap data.* This is encoded as a string of bits. It is organized as a row-major, top-down, left-to-right bitmap. The most significant bit of each byte is taken to be the leftmost or uppermost bit in the byte. For the sake of compact storage, rows are not padded to byte boundaries (i.e., a single byte may contain bits belonging to multiple rows). The last byte of the bitmap *is* padded with zero bits in the bits positions to the right of the last used bit if the bitmap data does not fill the last byte. The length of the *bitmap data* field is (WIDTH * HEIGHT + 7) / 8 using integer arithmetic, which is equivalent to ceil(WIDTH * HEIGHT / 8) using real number arithmetic. It remains to be determined whether bitmap fonts usually make all glyph bitmaps the same height, or if smaller glyphs are stored with bitmaps having a lesser height. In the latter case, the baseline would have to be used to calculate the location the bitmap should be anchored at on screen.  File: grub-dev.info, Node: Font Metrics, Prev: File Structure, Up: PFF2 Font File Format 13.3 Font Metrics ================= * Ascent. The distance from the baseline to the top of most characters. Note that in some cases characters may extend above the ascent. * Descent. The distance from the baseline to the bottom of most characters. Note that in some cases characters may extend below the descent. * Leading. The amount of space, in pixels, to leave between the descent of one line of text and the ascent of the next line. This metrics is not specified in the current file format; instead, the font rendering engine calculates a reasonable leading value based on the other font metrics. * Horizonal leading. The amount of space, in pixels, to leave horizontally between the left and right edges of two adjacent glyphs. The *device width* field determines the effective leading value that is used to render the font. [image src="font_char_metrics.png" text="Please fill this in."] An illustration of how the various font metrics apply to characters.  File: grub-dev.info, Node: Graphical Menu Software Design, Next: Verifiers framework, Prev: PFF2 Font File Format, Up: Top 14 Graphical Menu Software Design ********************************* * Menu: * Introduction_2:: * Startup Sequence:: * GUI Components:: * Command Line Window::  File: grub-dev.info, Node: Introduction_2, Next: Startup Sequence, Up: Graphical Menu Software Design 14.1 Introduction ================= The 'gfxmenu' module provides a graphical menu interface for GRUB 2. It functions as an alternative to the menu interface provided by the 'normal' module, which uses the grub terminal interface to display a menu on a character-oriented terminal. The graphical menu uses the GRUB video API, which is currently for the VESA BIOS extensions (VBE) 2.0+. This is supported on the i386-pc platform. However, the graphical menu itself does not depend on using VBE, so if another GRUB video driver were implemented, the 'gfxmenu' graphical menu would work on the new video driver as well.  File: grub-dev.info, Node: Startup Sequence, Next: GUI Components, Prev: Introduction_2, Up: Graphical Menu Software Design 14.2 Startup Sequence ===================== * grub_enter_normal_mode [normal/main.c] * grub_normal_execute [normal/main.c] * read_config_file [normal/main.c] * (When 'gfxmenu.mod' is loaded with 'insmod', it will call 'grub_menu_viewer_register()' to register itself.) * GRUB_MOD_INIT (gfxmenu) [gfxmenu/gfxmenu.c] * grub_menu_viewer_register [kern/menu_viewer.c] * grub_menu_viewer_show_menu [kern/menu_viewer.c] * get_current_menu_viewer() [kern/menu_viewer.c] * show_menu() [gfxmenu/gfxmenu.c] * grub_gfxmenu_model_new [gfxmenu/model.c] * grub_gfxmenu_view_new [gfxmenu/view.c] * set_graphics_mode [gfxmenu/view.c] * grub_gfxmenu_view_load_theme [gfxmenu/theme_loader.c]  File: grub-dev.info, Node: GUI Components, Next: Command Line Window, Prev: Startup Sequence, Up: Graphical Menu Software Design 14.3 GUI Components =================== The graphical menu implements a GUI component system that supports a container-based layout system. Components can be added to containers, and containers (which are a type of component) can then be added to other containers, to form a tree of components. Currently, the root component of this tree is a 'canvas' component, which allows manual layout of its child components. Components (non-container): * label * image * progress_bar * circular_progress * list (currently hard coded to be a boot menu list) Containers: * canvas * hbox * vbox The GUI component instances are created by the theme loader in 'gfxmenu/theme_loader.c' when a theme is loaded. Theme files specify statements such as '+vbox{ +label { text="Hello" } +label{ text="World" } }' to add components to the component tree root. By nesting the component creation statements in the theme file, the instantiated components are nested the same way. When a component is added to a container, that new child is considered *owned* by the container. Great care should be taken if the caller retains a reference to the child component, since it will be destroyed if its parent container is destroyed. A better choice instead of storing a pointer to the child component is to use the component ID to find the desired component. Component IDs do not have to be unique (it is often useful to have multiple components with an ID of "__timeout__", for instance). In order to access and use components in the component tree, there are two functions (defined in 'gfxmenu/gui_util.c') that are particularly useful: * 'grub_gui_find_by_id (root, id, callback, userdata)': This function recursively traverses the component tree rooted at ROOT, and for every component that has an ID equal to ID, calls the function pointed to by CALLBACK with the matching component and the void pointer USERDATA as arguments. The callback function can do whatever is desired to use the component passed in. * 'grub_gui_iterate_recursively (root, callback, userdata)': This function calls the function pointed to by CALLBACK for every component that is a descendant of ROOT in the component tree. When the callback function is called, the component and the void pointer USERDATA as arguments. The callback function can do whatever is desired to use the component passed in.  File: grub-dev.info, Node: Command Line Window, Prev: GUI Components, Up: Graphical Menu Software Design 14.4 Command Line Window ======================== The terminal window used to provide command line access within the graphical menu is managed by 'gfxmenu/view.c'. The 'gfxterm' terminal is used, and it has been modified to allow rendering to an offscreen render target to allow it to be composed into the double buffering system that the graphical menu view uses. This is bad for performance, however, so it would probably be a good idea to make it possible to temporarily disable double buffering as long as the terminal window is visible. There are still unresolved problems that occur when commands are executed from the terminal window that change the graphics mode. It's possible that making 'grub_video_restore()' return to the graphics mode that was in use before 'grub_video_setup()' was called might fix some of the problems.  File: grub-dev.info, Node: Verifiers framework, Next: Lockdown framework, Prev: Graphical Menu Software Design, Up: Top 15 Verifiers framework ********************** To register your own verifier call 'grub_verifier_register' with a structure pointing to your functions. The interface is inspired by the hash interface with 'init'/'write'/'fini'. There are essentially 2 ways of using it, hashing and whole-file verification. With the hashing approach: During 'init' you decide whether you want to check the given file and init context. In 'write' you update your hashing state. In 'fini' you check that the hash matches the expected value/passes some check/... With whole-file verification: During 'init' you decide whether you want to check the given file and init context. In 'write' you verify the file and return an error if it fails. You don't have 'fini'. Additional 'verify_string' receives various strings like kernel parameters to verify. Returning no error means successful verification and an error stops the current action. Detailed description of the API: Every time a file is opened your 'init' function is called with file descriptor and file type. Your function can have the following outcomes: * returning no error and setting '*flags' to 'GRUB_VERIFY_FLAGS_DEFER_AUTH'. In this case verification is deferred to other active verifiers. Verification fails if nobody cares or selected verifier fails. * returning no error and setting '*flags' to 'GRUB_VERIFY_FLAGS_SKIP_VERIFICATION'. In this case your verifier will not be called anymore and it is assumed to have skipped verification. * returning no error and not setting '*flags' to 'GRUB_VERIFY_FLAGS_SKIP_VERIFICATION' In this case verification is done as described in the following section. * returning an error. Then opening of the file will fail due to failed verification. In the third case your 'write' will be called with chunks of the file. If you need the whole file in a single chunk then during 'init' set the bit 'GRUB_VERIFY_FLAGS_SINGLE_CHUNK' in '*flags'. During 'init' you may set '*context' if you need additional context. At every iteration you may return an error and the file will be considered as having failed the verification. If you return no error then verification continues. Optionally at the end of the file 'fini', if it exists, is called with just the context. If you return no error during any of 'init', 'write' and 'fini' then the file is considered as having succeded verification.  File: grub-dev.info, Node: Lockdown framework, Next: Copying This Manual, Prev: Verifiers framework, Up: Top 16 Lockdown framework ********************* The GRUB can be locked down, which is a restricted mode where some operations are not allowed. For instance, some commands cannot be used when the GRUB is locked down. The function 'grub_lockdown()' is used to lockdown GRUB and the function 'grub_is_lockdown()' function can be used to check whether lockdown is enabled or not. When enabled, the function returns 'GRUB_LOCKDOWN_ENABLED' and 'GRUB_LOCKDOWN_DISABLED' when is not enabled. The following functions can be used to register the commands that can only be used when lockdown is disabled: * 'grub_cmd_lockdown()' registers command which should not run when the GRUB is in lockdown mode. * 'grub_cmd_lockdown()' registers extended command which should not run when the GRUB is in lockdown mode.  File: grub-dev.info, Node: Copying This Manual, Next: Index, Prev: Lockdown framework, Up: Top Appendix A Copying This Manual ****************************** * Menu: * GNU Free Documentation License:: License for copying this manual.  File: grub-dev.info, Node: GNU Free Documentation License, Up: Copying This Manual A.1 GNU Free Documentation License ================================== Version 1.2, November 2002 Copyright (C) 2000,2001,2002 Free Software Foundation, Inc. 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. 0. PREAMBLE The purpose of this License is to make a manual, textbook, or other functional and useful document "free" in the sense of freedom: to assure everyone the effective freedom to copy and redistribute it, with or without modifying it, either commercially or noncommercially. Secondarily, this License preserves for the author and publisher a way to get credit for their work, while not being considered responsible for modifications made by others. This License is a kind of "copyleft", which means that derivative works of the document must themselves be free in the same sense. It complements the GNU General Public License, which is a copyleft license designed for free software. We have designed this License in order to use it for manuals for free software, because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. But this License is not limited to software manuals; it can be used for any textual work, regardless of subject matter or whether it is published as a printed book. We recommend this License principally for works whose purpose is instruction or reference. 1. APPLICABILITY AND DEFINITIONS This License applies to any manual or other work, in any medium, that contains a notice placed by the copyright holder saying it can be distributed under the terms of this License. Such a notice grants a world-wide, royalty-free license, unlimited in duration, to use that work under the conditions stated herein. The "Document", below, refers to any such manual or work. Any member of the public is a licensee, and is addressed as "you". You accept the license if you copy, modify or distribute the work in a way requiring permission under copyright law. A "Modified Version" of the Document means any work containing the Document or a portion of it, either copied verbatim, or with modifications and/or translated into another language. A "Secondary Section" is a named appendix or a front-matter section of the Document that deals exclusively with the relationship of the publishers or authors of the Document to the Document's overall subject (or to related matters) and contains nothing that could fall directly within that overall subject. (Thus, if the Document is in part a textbook of mathematics, a Secondary Section may not explain any mathematics.) The relationship could be a matter of historical connection with the subject or with related matters, or of legal, commercial, philosophical, ethical or political position regarding them. The "Invariant Sections" are certain Secondary Sections whose titles are designated, as being those of Invariant Sections, in the notice that says that the Document is released under this License. If a section does not fit the above definition of Secondary then it is not allowed to be designated as Invariant. The Document may contain zero Invariant Sections. If the Document does not identify any Invariant Sections then there are none. The "Cover Texts" are certain short passages of text that are listed, as Front-Cover Texts or Back-Cover Texts, in the notice that says that the Document is released under this License. A Front-Cover Text may be at most 5 words, and a Back-Cover Text may be at most 25 words. A "Transparent" copy of the Document means a machine-readable copy, represented in a format whose specification is available to the general public, that is suitable for revising the document straightforwardly with generic text editors or (for images composed of pixels) generic paint programs or (for drawings) some widely available drawing editor, and that is suitable for input to text formatters or for automatic translation to a variety of formats suitable for input to text formatters. A copy made in an otherwise Transparent file format whose markup, or absence of markup, has been arranged to thwart or discourage subsequent modification by readers is not Transparent. An image format is not Transparent if used for any substantial amount of text. A copy that is not "Transparent" is called "Opaque". Examples of suitable formats for Transparent copies include plain ASCII without markup, Texinfo input format, LaTeX input format, SGML or XML using a publicly available DTD, and standard-conforming simple HTML, PostScript or PDF designed for human modification. Examples of transparent image formats include PNG, XCF and JPG. Opaque formats include proprietary formats that can be read and edited only by proprietary word processors, SGML or XML for which the DTD and/or processing tools are not generally available, and the machine-generated HTML, PostScript or PDF produced by some word processors for output purposes only. The "Title Page" means, for a printed book, the title page itself, plus such following pages as are needed to hold, legibly, the material this License requires to appear in the title page. For works in formats which do not have any title page as such, "Title Page" means the text near the most prominent appearance of the work's title, preceding the beginning of the body of the text. A section "Entitled XYZ" means a named subunit of the Document whose title either is precisely XYZ or contains XYZ in parentheses following text that translates XYZ in another language. (Here XYZ stands for a specific section name mentioned below, such as "Acknowledgements", "Dedications", "Endorsements", or "History".) To "Preserve the Title" of such a section when you modify the Document means that it remains a section "Entitled XYZ" according to this definition. The Document may include Warranty Disclaimers next to the notice which states that this License applies to the Document. These Warranty Disclaimers are considered to be included by reference in this License, but only as regards disclaiming warranties: any other implication that these Warranty Disclaimers may have is void and has no effect on the meaning of this License. 2. VERBATIM COPYING You may copy and distribute the Document in any medium, either commercially or noncommercially, provided that this License, the copyright notices, and the license notice saying this License applies to the Document are reproduced in all copies, and that you add no other conditions whatsoever to those of this License. You may not use technical measures to obstruct or control the reading or further copying of the copies you make or distribute. However, you may accept compensation in exchange for copies. If you distribute a large enough number of copies you must also follow the conditions in section 3. You may also lend copies, under the same conditions stated above, and you may publicly display copies. 3. COPYING IN QUANTITY If you publish printed copies (or copies in media that commonly have printed covers) of the Document, numbering more than 100, and the Document's license notice requires Cover Texts, you must enclose the copies in covers that carry, clearly and legibly, all these Cover Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on the back cover. Both covers must also clearly and legibly identify you as the publisher of these copies. The front cover must present the full title with all words of the title equally prominent and visible. You may add other material on the covers in addition. Copying with changes limited to the covers, as long as they preserve the title of the Document and satisfy these conditions, can be treated as verbatim copying in other respects. If the required texts for either cover are too voluminous to fit legibly, you should put the first ones listed (as many as fit reasonably) on the actual cover, and continue the rest onto adjacent pages. If you publish or distribute Opaque copies of the Document numbering more than 100, you must either include a machine-readable Transparent copy along with each Opaque copy, or state in or with each Opaque copy a computer-network location from which the general network-using public has access to download using public-standard network protocols a complete Transparent copy of the Document, free of added material. If you use the latter option, you must take reasonably prudent steps, when you begin distribution of Opaque copies in quantity, to ensure that this Transparent copy will remain thus accessible at the stated location until at least one year after the last time you distribute an Opaque copy (directly or through your agents or retailers) of that edition to the public. It is requested, but not required, that you contact the authors of the Document well before redistributing any large number of copies, to give them a chance to provide you with an updated version of the Document. 4. MODIFICATIONS You may copy and distribute a Modified Version of the Document under the conditions of sections 2 and 3 above, provided that you release the Modified Version under precisely this License, with the Modified Version filling the role of the Document, thus licensing distribution and modification of the Modified Version to whoever possesses a copy of it. In addition, you must do these things in the Modified Version: A. Use in the Title Page (and on the covers, if any) a title distinct from that of the Document, and from those of previous versions (which should, if there were any, be listed in the History section of the Document). You may use the same title as a previous version if the original publisher of that version gives permission. B. List on the Title Page, as authors, one or more persons or entities responsible for authorship of the modifications in the Modified Version, together with at least five of the principal authors of the Document (all of its principal authors, if it has fewer than five), unless they release you from this requirement. C. State on the Title page the name of the publisher of the Modified Version, as the publisher. D. Preserve all the copyright notices of the Document. E. Add an appropriate copyright notice for your modifications adjacent to the other copyright notices. F. Include, immediately after the copyright notices, a license notice giving the public permission to use the Modified Version under the terms of this License, in the form shown in the Addendum below. G. Preserve in that license notice the full lists of Invariant Sections and required Cover Texts given in the Document's license notice. H. Include an unaltered copy of this License. I. Preserve the section Entitled "History", Preserve its Title, and add to it an item stating at least the title, year, new authors, and publisher of the Modified Version as given on the Title Page. If there is no section Entitled "History" in the Document, create one stating the title, year, authors, and publisher of the Document as given on its Title Page, then add an item describing the Modified Version as stated in the previous sentence. J. Preserve the network location, if any, given in the Document for public access to a Transparent copy of the Document, and likewise the network locations given in the Document for previous versions it was based on. These may be placed in the "History" section. You may omit a network location for a work that was published at least four years before the Document itself, or if the original publisher of the version it refers to gives permission. K. For any section Entitled "Acknowledgements" or "Dedications", Preserve the Title of the section, and preserve in the section all the substance and tone of each of the contributor acknowledgements and/or dedications given therein. L. Preserve all the Invariant Sections of the Document, unaltered in their text and in their titles. Section numbers or the equivalent are not considered part of the section titles. M. Delete any section Entitled "Endorsements". Such a section may not be included in the Modified Version. N. Do not retitle any existing section to be Entitled "Endorsements" or to conflict in title with any Invariant Section. O. Preserve any Warranty Disclaimers. If the Modified Version includes new front-matter sections or appendices that qualify as Secondary Sections and contain no material copied from the Document, you may at your option designate some or all of these sections as invariant. To do this, add their titles to the list of Invariant Sections in the Modified Version's license notice. These titles must be distinct from any other section titles. You may add a section Entitled "Endorsements", provided it contains nothing but endorsements of your Modified Version by various parties--for example, statements of peer review or that the text has been approved by an organization as the authoritative definition of a standard. You may add a passage of up to five words as a Front-Cover Text, and a passage of up to 25 words as a Back-Cover Text, to the end of the list of Cover Texts in the Modified Version. Only one passage of Front-Cover Text and one of Back-Cover Text may be added by (or through arrangements made by) any one entity. If the Document already includes a cover text for the same cover, previously added by you or by arrangement made by the same entity you are acting on behalf of, you may not add another; but you may replace the old one, on explicit permission from the previous publisher that added the old one. The author(s) and publisher(s) of the Document do not by this License give permission to use their names for publicity for or to assert or imply endorsement of any Modified Version. 5. COMBINING DOCUMENTS You may combine the Document with other documents released under this License, under the terms defined in section 4 above for modified versions, provided that you include in the combination all of the Invariant Sections of all of the original documents, unmodified, and list them all as Invariant Sections of your combined work in its license notice, and that you preserve all their Warranty Disclaimers. The combined work need only contain one copy of this License, and multiple identical Invariant Sections may be replaced with a single copy. If there are multiple Invariant Sections with the same name but different contents, make the title of each such section unique by adding at the end of it, in parentheses, the name of the original author or publisher of that section if known, or else a unique number. Make the same adjustment to the section titles in the list of Invariant Sections in the license notice of the combined work. In the combination, you must combine any sections Entitled "History" in the various original documents, forming one section Entitled "History"; likewise combine any sections Entitled "Acknowledgements", and any sections Entitled "Dedications". You must delete all sections Entitled "Endorsements." 6. COLLECTIONS OF DOCUMENTS You may make a collection consisting of the Document and other documents released under this License, and replace the individual copies of this License in the various documents with a single copy that is included in the collection, provided that you follow the rules of this License for verbatim copying of each of the documents in all other respects. You may extract a single document from such a collection, and distribute it individually under this License, provided you insert a copy of this License into the extracted document, and follow this License in all other respects regarding verbatim copying of that document. 7. AGGREGATION WITH INDEPENDENT WORKS A compilation of the Document or its derivatives with other separate and independent documents or works, in or on a volume of a storage or distribution medium, is called an "aggregate" if the copyright resulting from the compilation is not used to limit the legal rights of the compilation's users beyond what the individual works permit. When the Document is included in an aggregate, this License does not apply to the other works in the aggregate which are not themselves derivative works of the Document. If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if the Document is less than one half of the entire aggregate, the Document's Cover Texts may be placed on covers that bracket the Document within the aggregate, or the electronic equivalent of covers if the Document is in electronic form. Otherwise they must appear on printed covers that bracket the whole aggregate. 8. TRANSLATION Translation is considered a kind of modification, so you may distribute translations of the Document under the terms of section 4. Replacing Invariant Sections with translations requires special permission from their copyright holders, but you may include translations of some or all Invariant Sections in addition to the original versions of these Invariant Sections. You may include a translation of this License, and all the license notices in the Document, and any Warranty Disclaimers, provided that you also include the original English version of this License and the original versions of those notices and disclaimers. In case of a disagreement between the translation and the original version of this License or a notice or disclaimer, the original version will prevail. If a section in the Document is Entitled "Acknowledgements", "Dedications", or "History", the requirement (section 4) to Preserve its Title (section 1) will typically require changing the actual title. 9. TERMINATION You may not copy, modify, sublicense, or distribute the Document except as expressly provided for under this License. Any other attempt to copy, modify, sublicense or distribute the Document is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 10. FUTURE REVISIONS OF THIS LICENSE The Free Software Foundation may publish new, revised versions of the GNU Free Documentation License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. See . Each version of the License is given a distinguishing version number. If the Document specifies that a particular numbered version of this License "or any later version" applies to it, you have the option of following the terms and conditions either of that specified version or of any later version that has been published (not as a draft) by the Free Software Foundation. If the Document does not specify a version number of this License, you may choose any version ever published (not as a draft) by the Free Software Foundation. A.1.1 ADDENDUM: How to use this License for your documents ---------------------------------------------------------- To use this License in a document you have written, include a copy of the License in the document and put the following copyright and license notices just after the title page: Copyright (C) YEAR YOUR NAME. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled ``GNU Free Documentation License''. If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, replace the "with...Texts." line with this: with the Invariant Sections being LIST THEIR TITLES, with the Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST. If you have Invariant Sections without Cover Texts, or some other combination of the three, merge those two alternatives to suit the situation. If your document contains nontrivial examples of program code, we recommend releasing these examples in parallel under your choice of free software license, such as the GNU General Public License, to permit their use in free software.  File: grub-dev.info, Node: Index, Prev: Copying This Manual, Up: Top Index ***** [index] * Menu: * FDL, GNU Free Documentation License: GNU Free Documentation License. (line 6)  Tag Table: Node: Top657 Node: Getting the source code1912 Node: Coding style2904 Node: Naming Conventions3313 Node: Functions3598 Node: Variables4472 Node: Types5587 Node: Macros6188 Node: Comments6520 Node: Multi-Line Comments7129 Node: Finding your way around8054 Node: Contributing Changes11370 Node: Getting started12486 Node: Typical Developer Experience16538 Node: When you are approved for write access to project's files17580 Node: Setting up and running test suite19013 Node: Updating External Code19710 Node: Gnulib20044 Node: jsmn22037 Node: minilzo22508 Node: libtasn123232 Node: libgcrypt25250 Node: Debugging26412 Node: i386-pc28433 Node: x86_64-efi30978 Node: OVMF debug log37461 Node: Using the gdbinfo command38636 Node: Porting38934 Node: Error Handling50688 Node: Stack and heap size55780 Node: BIOS port memory map58580 Node: Video Subsystem59431 Node: Video API59905 Node: Example usage of Video API80354 Node: Bitmap API81934 Node: PFF2 Font File Format84467 Node: Introduction84707 Node: File Structure86210 Node: Font Metrics91128 Node: Graphical Menu Software Design92277 Node: Introduction_292569 Node: Startup Sequence93303 Node: GUI Components94154 Node: Command Line Window96755 Node: Verifiers framework97707 Node: Lockdown framework100314 Node: Copying This Manual101256 Node: GNU Free Documentation License101500 Node: Index123893  End Tag Table  Local Variables: coding: utf-8 End: grub-2.14~git20250718.0e36779/docs/font_char_metrics.png0000644000175000017500000004007315000202015017112 00000000000000PNG  IHDRhҨ*sBIT|d pHYsttfxtEXtSoftwarewww.inkscape.org< IDATxw$Uշ C9 9"I##" YA* HaH0$P9g4اgjVusy֪uoUTջŇD"H=D"Ht"H)I@'Dt"H)I@'Dt"H)I@'Dt"H)I@'Dt"H)I@'D@4ܨpn73$ک6{MLΐpr HZWj2$_1:Ǖ.I@ ,8x8s XmF!i=IWH&ïaniNifA|3D/0J$*,*hc1MwxHt$1VVn5r? |x Pv%-Lif0#\mfo2 ˅*kKz5Q{~:Ձ%'͔8*3{Ձ{d _X^2u-fvu쉈KOt3KT,Zpnpkcg|<l u 6 mdC2}3H80]s|!,q`T820Lgp|-ʬGU3e¸&G |I2rLMC?Kg=^ e(pW8xn ui|Wu m' /o1P@6cGre3x Ǧ%'Kt FCH2P`o?8sp `plPrۇc90m$S(;6S#9ˁ±gw70"X;So&ZW'|7e]9V&?ϮgN uɔ6+ׇ~N[{i8Y@S[  < 9s!˕m*2s |DE3=(2dLd;% |,w15ԝ 9v7pIt[ce@c v_X% ےzh􇒖83 Ζ3%סf̞:Ig_7K2usUn>-i3{+{ !WTưp>3P8z`%!UIuf??%`p,k=P8?M8w~3{W=s#;]*[]C5G$= w νgyjÒN0_NOߤƸ-30W& fcX p!>x84z ݌ψKqſ7q zj)Bf?7&}vE–#f+^aL*"W4WyI+]6[lO3kXw iQ\vMm 363@xy_P̳,g/C}GrT\ iI[* b ^: f>WF1[CeyϘgk`6O/Ć{mg(3P(^|N$u:1X3{&5LDΒÓÁOJfSh+ l~$ixIi W%]? gf|*c(>Ŷ/nur;qڸdOHzhp#=܎5K$efφ8_aWfR6!y"^ }~ i`,&0;.Hif>gy'lfG#t3յ-0V g3a,'I-o^ e1ư@S/Q+ʾLvT(?5pKc}y icJM.'hD"1'+`3$4N +$m1_=CqS7Ãis ÍpCfS\0 VI3pqrbf=Dk :1x_p SH:1x[&'}IRq$p>3Y`u鶼'ntbX`fOH48<?wyN$d6H)|39$tbRa݉ x̖wTD9i01l0z=FI+m͓;.I{'$:Z"KQN 7drP%<Spܥ|$3ϱ%#eăWM5$Vpݻ:`ݐ%I˕o0/m=O$+px{f<}}?xtr. i;`F3;Q@Ҵx0S4`[I72ޏET :10K=!7;S^M{-pI(rp}&]LJm.<G1a>SfLgy#k3~"͠ÕÈȷ . c?$鹰>elllbfW¤wZ ŅfvNA;8Ope-HKRs%:xZy|8wggʗpWCxͶdf$VHZUs%:kɄ45sn\%.)7]rsFyr妭^lD}$|ɹՁeY v\(76W#kIrnRnLI%ȕ[ džh0[NI%6,)7OrkʭFMr/)oQn\)'}1M2_Mʍ,)rkTlo I디;Il箿g鴒]#XXɟ~_X&fϑ2Z;ڋf;xX##fpCIe %|Et3_pENe&i3{ 8&2)\}aI&'x{wRq7_3{?U"E@A|x3 QAc*mY5p l͞O*>EZ3Ϋ"^شx5#Nik="|&77xX^ΨCI/W7yf˶xZߢ'xf 1`q^y,#en322y!09t"iZ3@3Q@৑^mf};WqdWl3Y]Ңfv 9,qIYeؼ Li6M֊_7 <"=6^mY2ź+*̤~`S੘IS;$T΅[_U$1j~:q`$' Uyam I@O4n&lv&4I[ltM8E.IC)xZ bxj3YrxÞ&Q@jFzKu$b$^Aձ+񪎟HZuI3ibgu2pl< RkKBM%3{OÌokTu X4ifvEBEUIIu,YA/Iz*&I؂,1|%Π wve'ax.NEr=% IU-Quђ6! g;cf.R›F Lz&nfDkUx~cfWU-,i"HN6bdIz*0'Eo}E!Sv OF)m/lΐܓc$O>]Om.IA,&Bw%ف{U1`C3cJ3\= 3h4i]X!iyI2 X2YmB N N8* < :uI@|^3-s/u B$m |!cAm7&iQIn!L$$Iq=+ǵ!TG4&lfm9=aє&?>:y$+i x2_53_bG5vfYUIx2N4?QB Gaj$L=",vw{#"*EmɁȫr`*DsgM9 +P7;E$k@W e;nQǢ]V1s^a4WD,#2 3OrViMުa%D􀜄gOui'. OtW >0=#e~5Ul@Sm cAEYg^  QL#򡙭]0%}OY5͕#ݛ;&|M_T/"TΞ@b3#۞4I ID%mz6c,PÑ1Q$͏=[nf0ӀrFg=M"ۺ8NMŞ!:eUo?*~%}Y|aI_m#% 27%r~d_67'R eOvefQ.³ }U#-ncn.[H'b*I,5z` ͬ,%}'C>cm7w=]0wr۠&I@e>I& 4~;m:^Klf]Фj*u-zqAr_zJ~UlM@T$4YIIۢ$Ha[o1⏬U=Wn1m"ʎNjm,>۩7xD S=aYA% &I[HIkxơsNcK=/NXmBOB{pO uiLE* };b݁G<{$G )3玍 I[5"tL2 ױǰY]Pp},N!Y|3+0?]cx=݉Hx<|f13[_W+p-l |Z: 97<ιuq3,̹f9 XFڨ0SO3+q;X[|gYq{qMąs'16_4?}Aeo{G*}t=%J4/pphCTWٟ(w)c >*V.8V~ syZ,`:sJu3cS> U -{xClAY/FTۏՔ0D<47[ E8ߴ R5 sݯ1qgg aEB;ZQm0%6$^ߠ _Jk2KҘJsf̈́{ؾ>8 ̚!Ovw7p܀ל8 7az.o]6D *e#xPaH}ٮ@ڥ˟ጸVr+=| p|^\-uy 8LrW [=7 C X&s總jc3h;fj ƒ[H0xU4yʆ'!n ZU W7YH:;셺tTa<#=F8SZmbO^OfIkFiJIN9C^1qUUbM>Gu m(v({B8XL>YmT;MezZ"Zq ;t #gz%.gΔ뉊_j/ϽtֶsVh3XHJGq'vT/~e |tI$}LҙJ:8[O.C$o.I .%iaIzq엒~DSn,S%%QIIZ"泩$_.?ލLEIbY1ȪbfgP): .'a+.*TY(OӵN8ΩzbA.iaRr#oHvqВvgr0?x ;/>C ~cC-WţH, zLv570Fw㑲VnhOt3n+31bkA{JUoo :I>~Qga=t˓0ġt&=êy iIC"[Rb~c:/7TSx` Y&M꜈;m̟;8؟B,4sتccd] Hw5鏸9ҽ㞄몊#|]Wm;~Fu -lҡt~&lho4JD{vi>ka`n^W5A:x ./kU}j|e|'IsIQAg,#jT˫?V%-!#4Usݖٿ-<Oy1@Oz=Б[/L`>Iߕ4f0 |17$."c>+Ɏ p}]쯃m;[J׋8uO'k1g~i*d7P5Ι'wnGDc=_3ǶU/91\ϔw}lk/?yl>7 A,b70}vXiČ}2oEBG$B{w3fwmxO}殣˰3aMFj'X_quIxyl3۝=]bfyf~~afKo3OJd^̹v___w'TXs N2s IG=V%-*K X6̢aLQ1fv}zhe Ҹ971mK@h_4 \3̾80TU5XCE>lӋ}f&:Np7 +J~у"sVew/Y,`+I@L;aw-Daf\ZN;5%-^P1`m@ &ckfKܪlL+ۀUp$Av|ư$}ɑVmVŸJ og눊#7T61g_ïx^F&8phaUmi (3pƞ}?m\lx״i~?:<;b3V7 |Pzz_'8><vhwA>L/' ٽ)o\ 3e,rm}<\\2e:&ñO3Ph=Ky|MXNuƸMŨ`fuD\יּaA]W,U8j$ tUQ0ʼnS ʿ|S9z ubÊ]mVuZZ$)wN~*{l}@'qA h= |e)[uTIXBLgam $ts%wx܏g7OBI3KZ%beT]oz{]KSFTL^z(p'z:IXߚ{;2y)Msq ۛE^α}ƃgLg\dz%snw=R:ǃin?ެlkiXgY$--Ul܁qO3M/\ ,I N5C3k۔C9GCJ,?n k_oU($uagL3{ BEOBIsfbfϯ7Y93;̶o]ߟ/JRҾg$bf!+|~T$3 "%f*1M A8w@.\<]a ,fy=:?!@$U1&o_bդw.UW1LػbӬS\g]ԹYpsX! T'Ŝ[4<;HGGêA:8lH<aaű8pNL}rAy1M2$: c \X(N\X_g苧l`g|&x ptAr[oH7ǴeSր(meoq-qC`i &'1M;z f`fszD}I|/Inԭ _K|LaV0?$c&-RТ1k5f{] ]$v ' 53{/n{<%?'i2+I[Vq=#U"UD>_ZA~~Ym&'NWsV$aۋCvct$>0 3[3~reyFIMK5I xLjG 1l(in f'ҶM 4t" afqfI`n<{LxV%]"i1x,WS8w$b f"c➯X#|N(sXl_I/h"<ӹ =8yGmL*^?=hp;ŁNrǛw~OK`ߠ9nVs7CwZ_Uzy\-$oi$Mc,H?ݰLKZ羞moڂoW 5GN{*io>0g$=@G(oEw _Y{KW۸moDF^/87 .4IGq/ת{I{?|{/>˔F{0m}t,L9(tsYfS1%I3NhfxN:>GR^eB2(ҭJbJRbQM'¹$H8VRu d͐HG|̶bw0/TS' sw􅢓9ODEpWe90P%y&h|xkrc i. )ɓIHZɯ 1lk0QLьg('a$ݿ|7yTHS4#'eߥ9[ēr@$Lqo/V٧.$ *Y|ēpvv=k-U2<cgQC٤JK[=,{mXw䲛ìޝе6B\ngH>Φ84ܸmn1IΒx|)olkhվ\`f/ds-[""xWGv >yx$?\;;vcv!>+G %GoZ \oY㔩8lyf7 l{z W4)ѯt1n=qO]UFv*j?15+ԙ0ƻ,{n KmQ$x$- l*o\43}PxIZْz'tB@7?#~_lFu{JNfr hP _J9ցJ7%efu(>A\ߨ4yvfvy}J@K.HVw8O;#$Ocsrhxv"{ Pwz*bֺX(vIKb8FJ-i6IH{F/|9@vIEr6PR|#p}rC,Iϔ!XwT+'u$FNrz'%.smU5݌Ζz= c Udf4?2C ohfW~dÏ-E‰f%s}@;𵊢~Tո`*j.i|v|UKʭפܖr3D[Er+۠\non<{qS7([/r˷(ar/=Fr&˷(7IrZ"g?0o1e'{3M=+71-͖{MMAvGfY"+rfhRn\M-/gf]&IH$>%͠DOI:H$$DOI:H$$DOI:H$$DOI:H$$DOI:H$$DOI:H$$DOI:H$$DOI:H$$DOI:H$R,- JIENDB`grub-2.14~git20250718.0e36779/docs/texinfo.tex0000644000175000017500000105224415000202015015115 00000000000000% texinfo.tex -- TeX macros to handle Texinfo files. % % Load plain if necessary, i.e., if running under initex. \expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi % \def\texinfoversion{2007-09-03.05} % % Copyright (C) 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995, 2007, % 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, % 2007 Free Software Foundation, Inc. % % This texinfo.tex file is free software: you can redistribute it and/or % modify it under the terms of the GNU General Public License as % published by the Free Software Foundation, either version 3 of the % License, or (at your option) any later version. % % This texinfo.tex file is distributed in the hope that it will be % useful, but WITHOUT ANY WARRANTY; without even the implied warranty % of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU % General Public License for more details. % % You should have received a copy of the GNU General Public License % along with this program. If not, see . % % As a special exception, when this file is read by TeX when processing % a Texinfo source document, you may use the result without % restriction. (This has been our intent since Texinfo was invented.) % % Please try the latest version of texinfo.tex before submitting bug % reports; you can get the latest version from: % http://www.gnu.org/software/texinfo/ (the Texinfo home page), or % ftp://tug.org/tex/texinfo.tex % (and all CTAN mirrors, see http://www.ctan.org). % The texinfo.tex in any given distribution could well be out % of date, so if that's what you're using, please check. % % Send bug reports to bug-texinfo@gnu.org. Please include including a % complete document in each bug report with which we can reproduce the % problem. Patches are, of course, greatly appreciated. % % To process a Texinfo manual with TeX, it's most reliable to use the % texi2dvi shell script that comes with the distribution. For a simple % manual foo.texi, however, you can get away with this: % tex foo.texi % texindex foo.?? % tex foo.texi % tex foo.texi % dvips foo.dvi -o # or whatever; this makes foo.ps. % The extra TeX runs get the cross-reference information correct. % Sometimes one run after texindex suffices, and sometimes you need more % than two; texi2dvi does it as many times as necessary. % % It is possible to adapt texinfo.tex for other languages, to some % extent. You can get the existing language-specific files from the % full Texinfo distribution. % % The GNU Texinfo home page is http://www.gnu.org/software/texinfo. \message{Loading texinfo [version \texinfoversion]:} % If in a .fmt file, print the version number % and turn on active characters that we couldn't do earlier because % they might have appeared in the input file name. \everyjob{\message{[Texinfo version \texinfoversion]}% \catcode`+=\active \catcode`\_=\active} \chardef\other=12 % We never want plain's \outer definition of \+ in Texinfo. % For @tex, we can use \tabalign. \let\+ = \relax % Save some plain tex macros whose names we will redefine. \let\ptexb=\b \let\ptexbullet=\bullet \let\ptexc=\c \let\ptexcomma=\, \let\ptexdot=\. \let\ptexdots=\dots \let\ptexend=\end \let\ptexequiv=\equiv \let\ptexexclam=\! \let\ptexfootnote=\footnote \let\ptexgtr=> \let\ptexhat=^ \let\ptexi=\i \let\ptexindent=\indent \let\ptexinsert=\insert \let\ptexlbrace=\{ \let\ptexless=< \let\ptexnewwrite\newwrite \let\ptexnoindent=\noindent \let\ptexplus=+ \let\ptexrbrace=\} \let\ptexslash=\/ \let\ptexstar=\* \let\ptext=\t % If this character appears in an error message or help string, it % starts a new line in the output. \newlinechar = `^^J % Use TeX 3.0's \inputlineno to get the line number, for better error % messages, but if we're using an old version of TeX, don't do anything. % \ifx\inputlineno\thisisundefined \let\linenumber = \empty % Pre-3.0. \else \def\linenumber{l.\the\inputlineno:\space} \fi % Set up fixed words for English if not already set. \ifx\putwordAppendix\undefined \gdef\putwordAppendix{Appendix}\fi \ifx\putwordChapter\undefined \gdef\putwordChapter{Chapter}\fi \ifx\putwordfile\undefined \gdef\putwordfile{file}\fi \ifx\putwordin\undefined \gdef\putwordin{in}\fi \ifx\putwordIndexIsEmpty\undefined \gdef\putwordIndexIsEmpty{(Index is empty)}\fi \ifx\putwordIndexNonexistent\undefined \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi \ifx\putwordInfo\undefined \gdef\putwordInfo{Info}\fi \ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi \ifx\putwordMethodon\undefined \gdef\putwordMethodon{Method on}\fi \ifx\putwordNoTitle\undefined \gdef\putwordNoTitle{No Title}\fi \ifx\putwordof\undefined \gdef\putwordof{of}\fi \ifx\putwordon\undefined \gdef\putwordon{on}\fi \ifx\putwordpage\undefined \gdef\putwordpage{page}\fi \ifx\putwordsection\undefined \gdef\putwordsection{section}\fi \ifx\putwordSection\undefined \gdef\putwordSection{Section}\fi \ifx\putwordsee\undefined \gdef\putwordsee{see}\fi \ifx\putwordSee\undefined \gdef\putwordSee{See}\fi \ifx\putwordShortTOC\undefined \gdef\putwordShortTOC{Short Contents}\fi \ifx\putwordTOC\undefined \gdef\putwordTOC{Table of Contents}\fi % \ifx\putwordMJan\undefined \gdef\putwordMJan{January}\fi \ifx\putwordMFeb\undefined \gdef\putwordMFeb{February}\fi \ifx\putwordMMar\undefined \gdef\putwordMMar{March}\fi \ifx\putwordMApr\undefined \gdef\putwordMApr{April}\fi \ifx\putwordMMay\undefined \gdef\putwordMMay{May}\fi \ifx\putwordMJun\undefined \gdef\putwordMJun{June}\fi \ifx\putwordMJul\undefined \gdef\putwordMJul{July}\fi \ifx\putwordMAug\undefined \gdef\putwordMAug{August}\fi \ifx\putwordMSep\undefined \gdef\putwordMSep{September}\fi \ifx\putwordMOct\undefined \gdef\putwordMOct{October}\fi \ifx\putwordMNov\undefined \gdef\putwordMNov{November}\fi \ifx\putwordMDec\undefined \gdef\putwordMDec{December}\fi % \ifx\putwordDefmac\undefined \gdef\putwordDefmac{Macro}\fi \ifx\putwordDefspec\undefined \gdef\putwordDefspec{Special Form}\fi \ifx\putwordDefvar\undefined \gdef\putwordDefvar{Variable}\fi \ifx\putwordDefopt\undefined \gdef\putwordDefopt{User Option}\fi \ifx\putwordDeffunc\undefined \gdef\putwordDeffunc{Function}\fi % Since the category of space is not known, we have to be careful. \chardef\spacecat = 10 \def\spaceisspace{\catcode`\ =\spacecat} % sometimes characters are active, so we need control sequences. \chardef\colonChar = `\: \chardef\commaChar = `\, \chardef\dashChar = `\- \chardef\dotChar = `\. \chardef\exclamChar= `\! \chardef\lquoteChar= `\` \chardef\questChar = `\? \chardef\rquoteChar= `\' \chardef\semiChar = `\; \chardef\underChar = `\_ % Ignore a token. % \def\gobble#1{} % The following is used inside several \edef's. \def\makecsname#1{\expandafter\noexpand\csname#1\endcsname} % Hyphenation fixes. \hyphenation{ Flor-i-da Ghost-script Ghost-view Mac-OS Post-Script ap-pen-dix bit-map bit-maps data-base data-bases eshell fall-ing half-way long-est man-u-script man-u-scripts mini-buf-fer mini-buf-fers over-view par-a-digm par-a-digms rath-er rec-tan-gu-lar ro-bot-ics se-vere-ly set-up spa-ces spell-ing spell-ings stand-alone strong-est time-stamp time-stamps which-ever white-space wide-spread wrap-around } % Margin to add to right of even pages, to left of odd pages. \newdimen\bindingoffset \newdimen\normaloffset \newdimen\pagewidth \newdimen\pageheight % For a final copy, take out the rectangles % that mark overfull boxes (in case you have decided % that the text looks ok even though it passes the margin). % \def\finalout{\overfullrule=0pt} % @| inserts a changebar to the left of the current line. It should % surround any changed text. This approach does *not* work if the % change spans more than two lines of output. To handle that, we would % have adopt a much more difficult approach (putting marks into the main % vertical list for the beginning and end of each change). % \def\|{% % \vadjust can only be used in horizontal mode. \leavevmode % % Append this vertical mode material after the current line in the output. \vadjust{% % We want to insert a rule with the height and depth of the current % leading; that is exactly what \strutbox is supposed to record. \vskip-\baselineskip % % \vadjust-items are inserted at the left edge of the type. So % the \llap here moves out into the left-hand margin. \llap{% % % For a thicker or thinner bar, change the `1pt'. \vrule height\baselineskip width1pt % % This is the space between the bar and the text. \hskip 12pt }% }% } % Sometimes it is convenient to have everything in the transcript file % and nothing on the terminal. We don't just call \tracingall here, % since that produces some useless output on the terminal. We also make % some effort to order the tracing commands to reduce output in the log % file; cf. trace.sty in LaTeX. % \def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}% \def\loggingall{% \tracingstats2 \tracingpages1 \tracinglostchars2 % 2 gives us more in etex \tracingparagraphs1 \tracingoutput1 \tracingmacros2 \tracingrestores1 \showboxbreadth\maxdimen \showboxdepth\maxdimen \ifx\eTeXversion\undefined\else % etex gives us more logging \tracingscantokens1 \tracingifs1 \tracinggroups1 \tracingnesting2 \tracingassigns1 \fi \tracingcommands3 % 3 gives us more in etex \errorcontextlines16 }% % add check for \lastpenalty to plain's definitions. If the last thing % we did was a \nobreak, we don't want to insert more space. % \def\smallbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\smallskipamount \removelastskip\penalty-50\smallskip\fi\fi} \def\medbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\medskipamount \removelastskip\penalty-100\medskip\fi\fi} \def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount \removelastskip\penalty-200\bigskip\fi\fi} % For @cropmarks command. % Do @cropmarks to get crop marks. % \newif\ifcropmarks \let\cropmarks = \cropmarkstrue % % Dimensions to add cropmarks at corners. % Added by P. A. MacKay, 12 Nov. 1986 % \newdimen\outerhsize \newdimen\outervsize % set by the paper size routines \newdimen\cornerlong \cornerlong=1pc \newdimen\cornerthick \cornerthick=.3pt \newdimen\topandbottommargin \topandbottommargin=.75in % Output a mark which sets \thischapter, \thissection and \thiscolor. % We dump everything together because we only have one kind of mark. % This works because we only use \botmark / \topmark, not \firstmark. % % A mark contains a subexpression of the \ifcase ... \fi construct. % \get*marks macros below extract the needed part using \ifcase. % % Another complication is to let the user choose whether \thischapter % (\thissection) refers to the chapter (section) in effect at the top % of a page, or that at the bottom of a page. The solution is % described on page 260 of The TeXbook. It involves outputting two % marks for the sectioning macros, one before the section break, and % one after. I won't pretend I can describe this better than DEK... \def\domark{% \toks0=\expandafter{\lastchapterdefs}% \toks2=\expandafter{\lastsectiondefs}% \toks4=\expandafter{\prevchapterdefs}% \toks6=\expandafter{\prevsectiondefs}% \toks8=\expandafter{\lastcolordefs}% \mark{% \the\toks0 \the\toks2 \noexpand\or \the\toks4 \the\toks6 \noexpand\else \the\toks8 }% } % \topmark doesn't work for the very first chapter (after the title % page or the contents), so we use \firstmark there -- this gets us % the mark with the chapter defs, unless the user sneaks in, e.g., % @setcolor (or @url, or @link, etc.) between @contents and the very % first @chapter. \def\gettopheadingmarks{% \ifcase0\topmark\fi \ifx\thischapter\empty \ifcase0\firstmark\fi \fi } \def\getbottomheadingmarks{\ifcase1\botmark\fi} \def\getcolormarks{\ifcase2\topmark\fi} % Avoid "undefined control sequence" errors. \def\lastchapterdefs{} \def\lastsectiondefs{} \def\prevchapterdefs{} \def\prevsectiondefs{} \def\lastcolordefs{} % Main output routine. \chardef\PAGE = 255 \output = {\onepageout{\pagecontents\PAGE}} \newbox\headlinebox \newbox\footlinebox % \onepageout takes a vbox as an argument. Note that \pagecontents % does insertions, but you have to call it yourself. \def\onepageout#1{% \ifcropmarks \hoffset=0pt \else \hoffset=\normaloffset \fi % \ifodd\pageno \advance\hoffset by \bindingoffset \else \advance\hoffset by -\bindingoffset\fi % % Do this outside of the \shipout so @code etc. will be expanded in % the headline as they should be, not taken literally (outputting ''code). \ifodd\pageno \getoddheadingmarks \else \getevenheadingmarks \fi \setbox\headlinebox = \vbox{\let\hsize=\pagewidth \makeheadline}% \ifodd\pageno \getoddfootingmarks \else \getevenfootingmarks \fi \setbox\footlinebox = \vbox{\let\hsize=\pagewidth \makefootline}% % {% % Have to do this stuff outside the \shipout because we want it to % take effect in \write's, yet the group defined by the \vbox ends % before the \shipout runs. % \indexdummies % don't expand commands in the output. \normalturnoffactive % \ in index entries must not stay \, e.g., if % the page break happens to be in the middle of an example. % We don't want .vr (or whatever) entries like this: % \entry{{\tt \indexbackslash }acronym}{32}{\code {\acronym}} % "\acronym" won't work when it's read back in; % it needs to be % {\code {{\tt \backslashcurfont }acronym} \shipout\vbox{% % Do this early so pdf references go to the beginning of the page. \ifpdfmakepagedest \pdfdest name{\the\pageno} xyz\fi % \ifcropmarks \vbox to \outervsize\bgroup \hsize = \outerhsize \vskip-\topandbottommargin \vtop to0pt{% \line{\ewtop\hfil\ewtop}% \nointerlineskip \line{% \vbox{\moveleft\cornerthick\nstop}% \hfill \vbox{\moveright\cornerthick\nstop}% }% \vss}% \vskip\topandbottommargin \line\bgroup \hfil % center the page within the outer (page) hsize. \ifodd\pageno\hskip\bindingoffset\fi \vbox\bgroup \fi % \unvbox\headlinebox \pagebody{#1}% \ifdim\ht\footlinebox > 0pt % Only leave this space if the footline is nonempty. % (We lessened \vsize for it in \oddfootingyyy.) % The \baselineskip=24pt in plain's \makefootline has no effect. \vskip 24pt \unvbox\footlinebox \fi % \ifcropmarks \egroup % end of \vbox\bgroup \hfil\egroup % end of (centering) \line\bgroup \vskip\topandbottommargin plus1fill minus1fill \boxmaxdepth = \cornerthick \vbox to0pt{\vss \line{% \vbox{\moveleft\cornerthick\nsbot}% \hfill \vbox{\moveright\cornerthick\nsbot}% }% \nointerlineskip \line{\ewbot\hfil\ewbot}% }% \egroup % \vbox from first cropmarks clause \fi }% end of \shipout\vbox }% end of group with \indexdummies \advancepageno \ifnum\outputpenalty>-20000 \else\dosupereject\fi } \newinsert\margin \dimen\margin=\maxdimen \def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}} {\catcode`\@ =11 \gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi % marginal hacks, juha@viisa.uucp (Juha Takala) \ifvoid\margin\else % marginal info is present \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi \dimen@=\dp#1\relax \unvbox#1\relax \ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi \ifr@ggedbottom \kern-\dimen@ \vfil \fi} } % Here are the rules for the cropmarks. Note that they are % offset so that the space between them is truly \outerhsize or \outervsize % (P. A. MacKay, 12 November, 1986) % \def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong} \def\nstop{\vbox {\hrule height\cornerthick depth\cornerlong width\cornerthick}} \def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong} \def\nsbot{\vbox {\hrule height\cornerlong depth\cornerthick width\cornerthick}} % Parse an argument, then pass it to #1. The argument is the rest of % the input line (except we remove a trailing comment). #1 should be a % macro which expects an ordinary undelimited TeX argument. % \def\parsearg{\parseargusing{}} \def\parseargusing#1#2{% \def\argtorun{#2}% \begingroup \obeylines \spaceisspace #1% \parseargline\empty% Insert the \empty token, see \finishparsearg below. } {\obeylines % \gdef\parseargline#1^^M{% \endgroup % End of the group started in \parsearg. \argremovecomment #1\comment\ArgTerm% }% } % First remove any @comment, then any @c comment. \def\argremovecomment#1\comment#2\ArgTerm{\argremovec #1\c\ArgTerm} \def\argremovec#1\c#2\ArgTerm{\argcheckspaces#1\^^M\ArgTerm} % Each occurence of `\^^M' or `\^^M' is replaced by a single space. % % \argremovec might leave us with trailing space, e.g., % @end itemize @c foo % This space token undergoes the same procedure and is eventually removed % by \finishparsearg. % \def\argcheckspaces#1\^^M{\argcheckspacesX#1\^^M \^^M} \def\argcheckspacesX#1 \^^M{\argcheckspacesY#1\^^M} \def\argcheckspacesY#1\^^M#2\^^M#3\ArgTerm{% \def\temp{#3}% \ifx\temp\empty % Do not use \next, perhaps the caller of \parsearg uses it; reuse \temp: \let\temp\finishparsearg \else \let\temp\argcheckspaces \fi % Put the space token in: \temp#1 #3\ArgTerm } % If a _delimited_ argument is enclosed in braces, they get stripped; so % to get _exactly_ the rest of the line, we had to prevent such situation. % We prepended an \empty token at the very beginning and we expand it now, % just before passing the control to \argtorun. % (Similarily, we have to think about #3 of \argcheckspacesY above: it is % either the null string, or it ends with \^^M---thus there is no danger % that a pair of braces would be stripped. % % But first, we have to remove the trailing space token. % \def\finishparsearg#1 \ArgTerm{\expandafter\argtorun\expandafter{#1}} % \parseargdef\foo{...} % is roughly equivalent to % \def\foo{\parsearg\Xfoo} % \def\Xfoo#1{...} % % Actually, I use \csname\string\foo\endcsname, ie. \\foo, as it is my % favourite TeX trick. --kasal, 16nov03 \def\parseargdef#1{% \expandafter \doparseargdef \csname\string#1\endcsname #1% } \def\doparseargdef#1#2{% \def#2{\parsearg#1}% \def#1##1% } % Several utility definitions with active space: { \obeyspaces \gdef\obeyedspace{ } % Make each space character in the input produce a normal interword % space in the output. Don't allow a line break at this space, as this % is used only in environments like @example, where each line of input % should produce a line of output anyway. % \gdef\sepspaces{\obeyspaces\let =\tie} % If an index command is used in an @example environment, any spaces % therein should become regular spaces in the raw index file, not the % expansion of \tie (\leavevmode \penalty \@M \ ). \gdef\unsepspaces{\let =\space} } \def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next} % Define the framework for environments in texinfo.tex. It's used like this: % % \envdef\foo{...} % \def\Efoo{...} % % It's the responsibility of \envdef to insert \begingroup before the % actual body; @end closes the group after calling \Efoo. \envdef also % defines \thisenv, so the current environment is known; @end checks % whether the environment name matches. The \checkenv macro can also be % used to check whether the current environment is the one expected. % % Non-false conditionals (@iftex, @ifset) don't fit into this, so they % are not treated as enviroments; they don't open a group. (The % implementation of @end takes care not to call \endgroup in this % special case.) % At runtime, environments start with this: \def\startenvironment#1{\begingroup\def\thisenv{#1}} % initialize \let\thisenv\empty % ... but they get defined via ``\envdef\foo{...}'': \long\def\envdef#1#2{\def#1{\startenvironment#1#2}} \def\envparseargdef#1#2{\parseargdef#1{\startenvironment#1#2}} % Check whether we're in the right environment: \def\checkenv#1{% \def\temp{#1}% \ifx\thisenv\temp \else \badenverr \fi } % Evironment mismatch, #1 expected: \def\badenverr{% \errhelp = \EMsimple \errmessage{This command can appear only \inenvironment\temp, not \inenvironment\thisenv}% } \def\inenvironment#1{% \ifx#1\empty out of any environment% \else in environment \expandafter\string#1% \fi } % @end foo executes the definition of \Efoo. % But first, it executes a specialized version of \checkenv % \parseargdef\end{% \if 1\csname iscond.#1\endcsname \else % The general wording of \badenverr may not be ideal, but... --kasal, 06nov03 \expandafter\checkenv\csname#1\endcsname \csname E#1\endcsname \endgroup \fi } \newhelp\EMsimple{Press RETURN to continue.} %% Simple single-character @ commands % @@ prints an @ % Kludge this until the fonts are right (grr). \def\@{{\tt\char64}} % This is turned off because it was never documented % and you can use @w{...} around a quote to suppress ligatures. %% Define @` and @' to be the same as ` and ' %% but suppressing ligatures. %\def\`{{`}} %\def\'{{'}} % Used to generate quoted braces. \def\mylbrace {{\tt\char123}} \def\myrbrace {{\tt\char125}} \let\{=\mylbrace \let\}=\myrbrace \begingroup % Definitions to produce \{ and \} commands for indices, % and @{ and @} for the aux/toc files. \catcode`\{ = \other \catcode`\} = \other \catcode`\[ = 1 \catcode`\] = 2 \catcode`\! = 0 \catcode`\\ = \other !gdef!lbracecmd[\{]% !gdef!rbracecmd[\}]% !gdef!lbraceatcmd[@{]% !gdef!rbraceatcmd[@}]% !endgroup % @comma{} to avoid , parsing problems. \let\comma = , % Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent % Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H. \let\, = \c \let\dotaccent = \. \def\ringaccent#1{{\accent23 #1}} \let\tieaccent = \t \let\ubaraccent = \b \let\udotaccent = \d % Other special characters: @questiondown @exclamdown @ordf @ordm % Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss. \def\questiondown{?`} \def\exclamdown{!`} \def\ordf{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{a}}} \def\ordm{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{o}}} % Dotless i and dotless j, used for accents. \def\imacro{i} \def\jmacro{j} \def\dotless#1{% \def\temp{#1}% \ifx\temp\imacro \ptexi \else\ifx\temp\jmacro \j \else \errmessage{@dotless can be used only with i or j}% \fi\fi } % The \TeX{} logo, as in plain, but resetting the spacing so that a % period following counts as ending a sentence. (Idea found in latex.) % \edef\TeX{\TeX \spacefactor=1000 } % @LaTeX{} logo. Not quite the same results as the definition in % latex.ltx, since we use a different font for the raised A; it's most % convenient for us to use an explicitly smaller font, rather than using % the \scriptstyle font (since we don't reset \scriptstyle and % \scriptscriptstyle). % \def\LaTeX{% L\kern-.36em {\setbox0=\hbox{T}% \vbox to \ht0{\hbox{\selectfonts\lllsize A}\vss}}% \kern-.15em \TeX } % Be sure we're in horizontal mode when doing a tie, since we make space % equivalent to this in @example-like environments. Otherwise, a space % at the beginning of a line will start with \penalty -- and % since \penalty is valid in vertical mode, we'd end up putting the % penalty on the vertical list instead of in the new paragraph. {\catcode`@ = 11 % Avoid using \@M directly, because that causes trouble % if the definition is written into an index file. \global\let\tiepenalty = \@M \gdef\tie{\leavevmode\penalty\tiepenalty\ } } % @: forces normal size whitespace following. \def\:{\spacefactor=1000 } % @* forces a line break. \def\*{\hfil\break\hbox{}\ignorespaces} % @/ allows a line break. \let\/=\allowbreak % @. is an end-of-sentence period. \def\.{.\spacefactor=\endofsentencespacefactor\space} % @! is an end-of-sentence bang. \def\!{!\spacefactor=\endofsentencespacefactor\space} % @? is an end-of-sentence query. \def\?{?\spacefactor=\endofsentencespacefactor\space} % @frenchspacing on|off says whether to put extra space after punctuation. % \def\onword{on} \def\offword{off} % \parseargdef\frenchspacing{% \def\temp{#1}% \ifx\temp\onword \plainfrenchspacing \else\ifx\temp\offword \plainnonfrenchspacing \else \errhelp = \EMsimple \errmessage{Unknown @frenchspacing option `\temp', must be on/off}% \fi\fi } % @w prevents a word break. Without the \leavevmode, @w at the % beginning of a paragraph, when TeX is still in vertical mode, would % produce a whole line of output instead of starting the paragraph. \def\w#1{\leavevmode\hbox{#1}} % @group ... @end group forces ... to be all on one page, by enclosing % it in a TeX vbox. We use \vtop instead of \vbox to construct the box % to keep its height that of a normal line. According to the rules for % \topskip (p.114 of the TeXbook), the glue inserted is % max (\topskip - \ht (first item), 0). If that height is large, % therefore, no glue is inserted, and the space between the headline and % the text is small, which looks bad. % % Another complication is that the group might be very large. This can % cause the glue on the previous page to be unduly stretched, because it % does not have much material. In this case, it's better to add an % explicit \vfill so that the extra space is at the bottom. The % threshold for doing this is if the group is more than \vfilllimit % percent of a page (\vfilllimit can be changed inside of @tex). % \newbox\groupbox \def\vfilllimit{0.7} % \envdef\group{% \ifnum\catcode`\^^M=\active \else \errhelp = \groupinvalidhelp \errmessage{@group invalid in context where filling is enabled}% \fi \startsavinginserts % \setbox\groupbox = \vtop\bgroup % Do @comment since we are called inside an environment such as % @example, where each end-of-line in the input causes an % end-of-line in the output. We don't want the end-of-line after % the `@group' to put extra space in the output. Since @group % should appear on a line by itself (according to the Texinfo % manual), we don't worry about eating any user text. \comment } % % The \vtop produces a box with normal height and large depth; thus, TeX puts % \baselineskip glue before it, and (when the next line of text is done) % \lineskip glue after it. Thus, space below is not quite equal to space % above. But it's pretty close. \def\Egroup{% % To get correct interline space between the last line of the group % and the first line afterwards, we have to propagate \prevdepth. \endgraf % Not \par, as it may have been set to \lisppar. \global\dimen1 = \prevdepth \egroup % End the \vtop. % \dimen0 is the vertical size of the group's box. \dimen0 = \ht\groupbox \advance\dimen0 by \dp\groupbox % \dimen2 is how much space is left on the page (more or less). \dimen2 = \pageheight \advance\dimen2 by -\pagetotal % if the group doesn't fit on the current page, and it's a big big % group, force a page break. \ifdim \dimen0 > \dimen2 \ifdim \pagetotal < \vfilllimit\pageheight \page \fi \fi \box\groupbox \prevdepth = \dimen1 \checkinserts } % % TeX puts in an \escapechar (i.e., `@') at the beginning of the help % message, so this ends up printing `@group can only ...'. % \newhelp\groupinvalidhelp{% group can only be used in environments such as @example,^^J% where each line of input produces a line of output.} % @need space-in-mils % forces a page break if there is not space-in-mils remaining. \newdimen\mil \mil=0.001in % Old definition--didn't work. %\parseargdef\need{\par % %% This method tries to make TeX break the page naturally %% if the depth of the box does not fit. %{\baselineskip=0pt% %\vtop to #1\mil{\vfil}\kern -#1\mil\nobreak %\prevdepth=-1000pt %}} \parseargdef\need{% % Ensure vertical mode, so we don't make a big box in the middle of a % paragraph. \par % % If the @need value is less than one line space, it's useless. \dimen0 = #1\mil \dimen2 = \ht\strutbox \advance\dimen2 by \dp\strutbox \ifdim\dimen0 > \dimen2 % % Do a \strut just to make the height of this box be normal, so the % normal leading is inserted relative to the preceding line. % And a page break here is fine. \vtop to #1\mil{\strut\vfil}% % % TeX does not even consider page breaks if a penalty added to the % main vertical list is 10000 or more. But in order to see if the % empty box we just added fits on the page, we must make it consider % page breaks. On the other hand, we don't want to actually break the % page after the empty box. So we use a penalty of 9999. % % There is an extremely small chance that TeX will actually break the % page at this \penalty, if there are no other feasible breakpoints in % sight. (If the user is using lots of big @group commands, which % almost-but-not-quite fill up a page, TeX will have a hard time doing % good page breaking, for example.) However, I could not construct an % example where a page broke at this \penalty; if it happens in a real % document, then we can reconsider our strategy. \penalty9999 % % Back up by the size of the box, whether we did a page break or not. \kern -#1\mil % % Do not allow a page break right after this kern. \nobreak \fi } % @br forces paragraph break (and is undocumented). \let\br = \par % @page forces the start of a new page. % \def\page{\par\vfill\supereject} % @exdent text.... % outputs text on separate line in roman font, starting at standard page margin % This records the amount of indent in the innermost environment. % That's how much \exdent should take out. \newskip\exdentamount % This defn is used inside fill environments such as @defun. \parseargdef\exdent{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break} % This defn is used inside nofill environments such as @example. \parseargdef\nofillexdent{{\advance \leftskip by -\exdentamount \leftline{\hskip\leftskip{\rm#1}}}} % @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current % paragraph. For more general purposes, use the \margin insertion % class. WHICH is `l' or `r'. % \newskip\inmarginspacing \inmarginspacing=1cm \def\strutdepth{\dp\strutbox} % \def\doinmargin#1#2{\strut\vadjust{% \nobreak \kern-\strutdepth \vtop to \strutdepth{% \baselineskip=\strutdepth \vss % if you have multiple lines of stuff to put here, you'll need to % make the vbox yourself of the appropriate size. \ifx#1l% \llap{\ignorespaces #2\hskip\inmarginspacing}% \else \rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}% \fi \null }% }} \def\inleftmargin{\doinmargin l} \def\inrightmargin{\doinmargin r} % % @inmargin{TEXT [, RIGHT-TEXT]} % (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right; % else use TEXT for both). % \def\inmargin#1{\parseinmargin #1,,\finish} \def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing. \setbox0 = \hbox{\ignorespaces #2}% \ifdim\wd0 > 0pt \def\lefttext{#1}% have both texts \def\righttext{#2}% \else \def\lefttext{#1}% have only one text \def\righttext{#1}% \fi % \ifodd\pageno \def\temp{\inrightmargin\righttext}% odd page -> outside is right margin \else \def\temp{\inleftmargin\lefttext}% \fi \temp } % @include file insert text of that file as input. % \def\include{\parseargusing\filenamecatcodes\includezzz} \def\includezzz#1{% \pushthisfilestack \def\thisfile{#1}% {% \makevalueexpandable \def\temp{\input #1 }% \expandafter }\temp \popthisfilestack } \def\filenamecatcodes{% \catcode`\\=\other \catcode`~=\other \catcode`^=\other \catcode`_=\other \catcode`|=\other \catcode`<=\other \catcode`>=\other \catcode`+=\other \catcode`-=\other } \def\pushthisfilestack{% \expandafter\pushthisfilestackX\popthisfilestack\StackTerm } \def\pushthisfilestackX{% \expandafter\pushthisfilestackY\thisfile\StackTerm } \def\pushthisfilestackY #1\StackTerm #2\StackTerm {% \gdef\popthisfilestack{\gdef\thisfile{#1}\gdef\popthisfilestack{#2}}% } \def\popthisfilestack{\errthisfilestackempty} \def\errthisfilestackempty{\errmessage{Internal error: the stack of filenames is empty.}} \def\thisfile{} % @center line % outputs that line, centered. % \parseargdef\center{% \ifhmode \let\next\centerH \else \let\next\centerV \fi \next{\hfil \ignorespaces#1\unskip \hfil}% } \def\centerH#1{% {% \hfil\break \advance\hsize by -\leftskip \advance\hsize by -\rightskip \line{#1}% \break }% } \def\centerV#1{\line{\kern\leftskip #1\kern\rightskip}} % @sp n outputs n lines of vertical space \parseargdef\sp{\vskip #1\baselineskip} % @comment ...line which is ignored... % @c is the same as @comment % @ignore ... @end ignore is another way to write a comment \def\comment{\begingroup \catcode`\^^M=\other% \catcode`\@=\other \catcode`\{=\other \catcode`\}=\other% \commentxxx} {\catcode`\^^M=\other \gdef\commentxxx#1^^M{\endgroup}} \let\c=\comment % @paragraphindent NCHARS % We'll use ems for NCHARS, close enough. % NCHARS can also be the word `asis' or `none'. % We cannot feasibly implement @paragraphindent asis, though. % \def\asisword{asis} % no translation, these are keywords \def\noneword{none} % \parseargdef\paragraphindent{% \def\temp{#1}% \ifx\temp\asisword \else \ifx\temp\noneword \defaultparindent = 0pt \else \defaultparindent = #1em \fi \fi \parindent = \defaultparindent } % @exampleindent NCHARS % We'll use ems for NCHARS like @paragraphindent. % It seems @exampleindent asis isn't necessary, but % I preserve it to make it similar to @paragraphindent. \parseargdef\exampleindent{% \def\temp{#1}% \ifx\temp\asisword \else \ifx\temp\noneword \lispnarrowing = 0pt \else \lispnarrowing = #1em \fi \fi } % @firstparagraphindent WORD % If WORD is `none', then suppress indentation of the first paragraph % after a section heading. If WORD is `insert', then do indent at such % paragraphs. % % The paragraph indentation is suppressed or not by calling % \suppressfirstparagraphindent, which the sectioning commands do. % We switch the definition of this back and forth according to WORD. % By default, we suppress indentation. % \def\suppressfirstparagraphindent{\dosuppressfirstparagraphindent} \def\insertword{insert} % \parseargdef\firstparagraphindent{% \def\temp{#1}% \ifx\temp\noneword \let\suppressfirstparagraphindent = \dosuppressfirstparagraphindent \else\ifx\temp\insertword \let\suppressfirstparagraphindent = \relax \else \errhelp = \EMsimple \errmessage{Unknown @firstparagraphindent option `\temp'}% \fi\fi } % Here is how we actually suppress indentation. Redefine \everypar to % \kern backwards by \parindent, and then reset itself to empty. % % We also make \indent itself not actually do anything until the next % paragraph. % \gdef\dosuppressfirstparagraphindent{% \gdef\indent{% \restorefirstparagraphindent \indent }% \gdef\noindent{% \restorefirstparagraphindent \noindent }% \global\everypar = {% \kern -\parindent \restorefirstparagraphindent }% } \gdef\restorefirstparagraphindent{% \global \let \indent = \ptexindent \global \let \noindent = \ptexnoindent \global \everypar = {}% } % @asis just yields its argument. Used with @table, for example. % \def\asis#1{#1} % @math outputs its argument in math mode. % % One complication: _ usually means subscripts, but it could also mean % an actual _ character, as in @math{@var{some_variable} + 1}. So make % _ active, and distinguish by seeing if the current family is \slfam, % which is what @var uses. { \catcode`\_ = \active \gdef\mathunderscore{% \catcode`\_=\active \def_{\ifnum\fam=\slfam \_\else\sb\fi}% } } % Another complication: we want \\ (and @\) to output a \ character. % FYI, plain.tex uses \\ as a temporary control sequence (why?), but % this is not advertised and we don't care. Texinfo does not % otherwise define @\. % % The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\. \def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi} % \def\math{% \tex \mathunderscore \let\\ = \mathbackslash \mathactive $\finishmath } \def\finishmath#1{#1$\endgroup} % Close the group opened by \tex. % Some active characters (such as <) are spaced differently in math. % We have to reset their definitions in case the @math was an argument % to a command which sets the catcodes (such as @item or @section). % { \catcode`^ = \active \catcode`< = \active \catcode`> = \active \catcode`+ = \active \gdef\mathactive{% \let^ = \ptexhat \let< = \ptexless \let> = \ptexgtr \let+ = \ptexplus } } % @bullet and @minus need the same treatment as @math, just above. \def\bullet{$\ptexbullet$} \def\minus{$-$} % @dots{} outputs an ellipsis using the current font. % We do .5em per period so that it has the same spacing in the cm % typewriter fonts as three actual period characters; on the other hand, % in other typewriter fonts three periods are wider than 1.5em. So do % whichever is larger. % \def\dots{% \leavevmode \setbox0=\hbox{...}% get width of three periods \ifdim\wd0 > 1.5em \dimen0 = \wd0 \else \dimen0 = 1.5em \fi \hbox to \dimen0{% \hskip 0pt plus.25fil .\hskip 0pt plus1fil .\hskip 0pt plus1fil .\hskip 0pt plus.5fil }% } % @enddots{} is an end-of-sentence ellipsis. % \def\enddots{% \dots \spacefactor=\endofsentencespacefactor } % @comma{} is so commas can be inserted into text without messing up % Texinfo's parsing. % \let\comma = , % @refill is a no-op. \let\refill=\relax % If working on a large document in chapters, it is convenient to % be able to disable indexing, cross-referencing, and contents, for test runs. % This is done with @novalidate (before @setfilename). % \newif\iflinks \linkstrue % by default we want the aux files. \let\novalidate = \linksfalse % @setfilename is done at the beginning of every texinfo file. % So open here the files we need to have open while reading the input. % This makes it possible to make a .fmt file for texinfo. \def\setfilename{% \fixbackslash % Turn off hack to swallow `\input texinfo'. \iflinks \tryauxfile % Open the new aux file. TeX will close it automatically at exit. \immediate\openout\auxfile=\jobname.aux \fi % \openindices needs to do some work in any case. \openindices \let\setfilename=\comment % Ignore extra @setfilename cmds. % % If texinfo.cnf is present on the system, read it. % Useful for site-wide @afourpaper, etc. \openin 1 texinfo.cnf \ifeof 1 \else \input texinfo.cnf \fi \closein 1 % \comment % Ignore the actual filename. } % Called from \setfilename. % \def\openindices{% \newindex{cp}% \newcodeindex{fn}% \newcodeindex{vr}% \newcodeindex{tp}% \newcodeindex{ky}% \newcodeindex{pg}% } % @bye. \outer\def\bye{\pagealignmacro\tracingstats=1\ptexend} \message{pdf,} % adobe `portable' document format \newcount\tempnum \newcount\lnkcount \newtoks\filename \newcount\filenamelength \newcount\pgn \newtoks\toksA \newtoks\toksB \newtoks\toksC \newtoks\toksD \newbox\boxA \newcount\countA \newif\ifpdf \newif\ifpdfmakepagedest % when pdftex is run in dvi mode, \pdfoutput is defined (so \pdfoutput=1 % can be set). So we test for \relax and 0 as well as \undefined, % borrowed from ifpdf.sty. \ifx\pdfoutput\undefined \else \ifx\pdfoutput\relax \else \ifcase\pdfoutput \else \pdftrue \fi \fi \fi % PDF uses PostScript string constants for the names of xref targets, % for display in the outlines, and in other places. Thus, we have to % double any backslashes. Otherwise, a name like "\node" will be % interpreted as a newline (\n), followed by o, d, e. Not good. % http://www.ntg.nl/pipermail/ntg-pdftex/2004-July/000654.html % (and related messages, the final outcome is that it is up to the TeX % user to double the backslashes and otherwise make the string valid, so % that's what we do). % double active backslashes. % {\catcode`\@=0 \catcode`\\=\active @gdef@activebackslashdouble{% @catcode`@\=@active @let\=@doublebackslash} } % To handle parens, we must adopt a different approach, since parens are % not active characters. hyperref.dtx (which has the same problem as % us) handles it with this amazing macro to replace tokens, with minor % changes for Texinfo. It is included here under the GPL by permission % from the author, Heiko Oberdiek. % % #1 is the tokens to replace. % #2 is the replacement. % #3 is the control sequence with the string. % \def\HyPsdSubst#1#2#3{% \def\HyPsdReplace##1#1##2\END{% ##1% \ifx\\##2\\% \else #2% \HyReturnAfterFi{% \HyPsdReplace##2\END }% \fi }% \xdef#3{\expandafter\HyPsdReplace#3#1\END}% } \long\def\HyReturnAfterFi#1\fi{\fi#1} % #1 is a control sequence in which to do the replacements. \def\backslashparens#1{% \xdef#1{#1}% redefine it as its expansion; the definition is simply % \lastnode when called from \setref -> \pdfmkdest. \HyPsdSubst{(}{\realbackslash(}{#1}% \HyPsdSubst{)}{\realbackslash)}{#1}% } \newhelp\nopdfimagehelp{Texinfo supports .png, .jpg, .jpeg, and .pdf images with PDF output, and none of those formats could be found. (.eps cannot be supported due to the design of the PDF format; use regular TeX (DVI output) for that.)} \ifpdf % % Color manipulation macros based on pdfcolor.tex. \def\cmykDarkRed{0.28 1 1 0.35} \def\cmykBlack{0 0 0 1} % \def\pdfsetcolor#1{\pdfliteral{#1 k}} % Set color, and create a mark which defines \thiscolor accordingly, % so that \makeheadline knows which color to restore. \def\setcolor#1{% \xdef\lastcolordefs{\gdef\noexpand\thiscolor{#1}}% \domark \pdfsetcolor{#1}% } % \def\maincolor{\cmykBlack} \pdfsetcolor{\maincolor} \edef\thiscolor{\maincolor} \def\lastcolordefs{} % \def\makefootline{% \baselineskip24pt \line{\pdfsetcolor{\maincolor}\the\footline}% } % \def\makeheadline{% \vbox to 0pt{% \vskip-22.5pt \line{% \vbox to8.5pt{}% % Extract \thiscolor definition from the marks. \getcolormarks % Typeset the headline with \maincolor, then restore the color. \pdfsetcolor{\maincolor}\the\headline\pdfsetcolor{\thiscolor}% }% \vss }% \nointerlineskip } % % \pdfcatalog{/PageMode /UseOutlines} % % #1 is image name, #2 width (might be empty/whitespace), #3 height (ditto). \def\dopdfimage#1#2#3{% \def\imagewidth{#2}\setbox0 = \hbox{\ignorespaces #2}% \def\imageheight{#3}\setbox2 = \hbox{\ignorespaces #3}% % % pdftex (and the PDF format) support .png, .jpg, .pdf (among % others). Let's try in that order. \let\pdfimgext=\empty \begingroup \openin 1 #1.png \ifeof 1 \openin 1 #1.jpg \ifeof 1 \openin 1 #1.jpeg \ifeof 1 \openin 1 #1.JPG \ifeof 1 \openin 1 #1.pdf \ifeof 1 \errhelp = \nopdfimagehelp \errmessage{Could not find image file #1 for pdf}% \else \gdef\pdfimgext{pdf}% \fi \else \gdef\pdfimgext{JPG}% \fi \else \gdef\pdfimgext{jpeg}% \fi \else \gdef\pdfimgext{jpg}% \fi \else \gdef\pdfimgext{png}% \fi \closein 1 \endgroup % % without \immediate, pdftex seg faults when the same image is % included twice. (Version 3.14159-pre-1.0-unofficial-20010704.) \ifnum\pdftexversion < 14 \immediate\pdfimage \else \immediate\pdfximage \fi \ifdim \wd0 >0pt width \imagewidth \fi \ifdim \wd2 >0pt height \imageheight \fi \ifnum\pdftexversion<13 #1.\pdfimgext \else {#1.\pdfimgext}% \fi \ifnum\pdftexversion < 14 \else \pdfrefximage \pdflastximage \fi} % \def\pdfmkdest#1{{% % We have to set dummies so commands such as @code, and characters % such as \, aren't expanded when present in a section title. \indexnofonts \turnoffactive \activebackslashdouble \makevalueexpandable \def\pdfdestname{#1}% \backslashparens\pdfdestname \safewhatsit{\pdfdest name{\pdfdestname} xyz}% }} % % used to mark target names; must be expandable. \def\pdfmkpgn#1{#1} % % by default, use a color that is dark enough to print on paper as % nearly black, but still distinguishable for online viewing. \def\urlcolor{\cmykDarkRed} \def\linkcolor{\cmykDarkRed} \def\endlink{\setcolor{\maincolor}\pdfendlink} % % Adding outlines to PDF; macros for calculating structure of outlines % come from Petr Olsak \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0% \else \csname#1\endcsname \fi} \def\advancenumber#1{\tempnum=\expnumber{#1}\relax \advance\tempnum by 1 \expandafter\xdef\csname#1\endcsname{\the\tempnum}} % % #1 is the section text, which is what will be displayed in the % outline by the pdf viewer. #2 is the pdf expression for the number % of subentries (or empty, for subsubsections). #3 is the node text, % which might be empty if this toc entry had no corresponding node. % #4 is the page number % \def\dopdfoutline#1#2#3#4{% % Generate a link to the node text if that exists; else, use the % page number. We could generate a destination for the section % text in the case where a section has no node, but it doesn't % seem worth the trouble, since most documents are normally structured. \def\pdfoutlinedest{#3}% \ifx\pdfoutlinedest\empty \def\pdfoutlinedest{#4}% \else % Doubled backslashes in the name. {\activebackslashdouble \xdef\pdfoutlinedest{#3}% \backslashparens\pdfoutlinedest}% \fi % % Also double the backslashes in the display string. {\activebackslashdouble \xdef\pdfoutlinetext{#1}% \backslashparens\pdfoutlinetext}% % \pdfoutline goto name{\pdfmkpgn{\pdfoutlinedest}}#2{\pdfoutlinetext}% } % \def\pdfmakeoutlines{% \begingroup % Thanh's hack / proper braces in bookmarks \edef\mylbrace{\iftrue \string{\else}\fi}\let\{=\mylbrace \edef\myrbrace{\iffalse{\else\string}\fi}\let\}=\myrbrace % % Read toc silently, to get counts of subentries for \pdfoutline. \def\numchapentry##1##2##3##4{% \def\thischapnum{##2}% \def\thissecnum{0}% \def\thissubsecnum{0}% }% \def\numsecentry##1##2##3##4{% \advancenumber{chap\thischapnum}% \def\thissecnum{##2}% \def\thissubsecnum{0}% }% \def\numsubsecentry##1##2##3##4{% \advancenumber{sec\thissecnum}% \def\thissubsecnum{##2}% }% \def\numsubsubsecentry##1##2##3##4{% \advancenumber{subsec\thissubsecnum}% }% \def\thischapnum{0}% \def\thissecnum{0}% \def\thissubsecnum{0}% % % use \def rather than \let here because we redefine \chapentry et % al. a second time, below. \def\appentry{\numchapentry}% \def\appsecentry{\numsecentry}% \def\appsubsecentry{\numsubsecentry}% \def\appsubsubsecentry{\numsubsubsecentry}% \def\unnchapentry{\numchapentry}% \def\unnsecentry{\numsecentry}% \def\unnsubsecentry{\numsubsecentry}% \def\unnsubsubsecentry{\numsubsubsecentry}% \readdatafile{toc}% % % Read toc second time, this time actually producing the outlines. % The `-' means take the \expnumber as the absolute number of % subentries, which we calculated on our first read of the .toc above. % % We use the node names as the destinations. \def\numchapentry##1##2##3##4{% \dopdfoutline{##1}{count-\expnumber{chap##2}}{##3}{##4}}% \def\numsecentry##1##2##3##4{% \dopdfoutline{##1}{count-\expnumber{sec##2}}{##3}{##4}}% \def\numsubsecentry##1##2##3##4{% \dopdfoutline{##1}{count-\expnumber{subsec##2}}{##3}{##4}}% \def\numsubsubsecentry##1##2##3##4{% count is always zero \dopdfoutline{##1}{}{##3}{##4}}% % % PDF outlines are displayed using system fonts, instead of % document fonts. Therefore we cannot use special characters, % since the encoding is unknown. For example, the eogonek from % Latin 2 (0xea) gets translated to a | character. Info from % Staszek Wawrykiewicz, 19 Jan 2004 04:09:24 +0100. % % xx to do this right, we have to translate 8-bit characters to % their "best" equivalent, based on the @documentencoding. Right % now, I guess we'll just let the pdf reader have its way. \indexnofonts \setupdatafile \catcode`\\=\active \otherbackslash \input \tocreadfilename \endgroup } % \def\skipspaces#1{\def\PP{#1}\def\D{|}% \ifx\PP\D\let\nextsp\relax \else\let\nextsp\skipspaces \ifx\p\space\else\addtokens{\filename}{\PP}% \advance\filenamelength by 1 \fi \fi \nextsp} \def\getfilename#1{\filenamelength=0\expandafter\skipspaces#1|\relax} \ifnum\pdftexversion < 14 \let \startlink \pdfannotlink \else \let \startlink \pdfstartlink \fi % make a live url in pdf output. \def\pdfurl#1{% \begingroup % it seems we really need yet another set of dummies; have not % tried to figure out what each command should do in the context % of @url. for now, just make @/ a no-op, that's the only one % people have actually reported a problem with. % \normalturnoffactive \def\@{@}% \let\/=\empty \makevalueexpandable \leavevmode\setcolor{\urlcolor}% \startlink attr{/Border [0 0 0]}% user{/Subtype /Link /A << /S /URI /URI (#1) >>}% \endgroup} \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}} \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks} \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks} \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}} \def\maketoks{% \expandafter\poptoks\the\toksA|ENDTOKS|\relax \ifx\first0\adn0 \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3 \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6 \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9 \else \ifnum0=\countA\else\makelink\fi \ifx\first.\let\next=\done\else \let\next=\maketoks \addtokens{\toksB}{\the\toksD} \ifx\first,\addtokens{\toksB}{\space}\fi \fi \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \next} \def\makelink{\addtokens{\toksB}% {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0} \def\pdflink#1{% \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}} \setcolor{\linkcolor}#1\endlink} \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st} \else \let\pdfmkdest = \gobble \let\pdfurl = \gobble \let\endlink = \relax \let\setcolor = \gobble \let\pdfsetcolor = \gobble \let\pdfmakeoutlines = \relax \fi % \ifx\pdfoutput \message{fonts,} % Change the current font style to #1, remembering it in \curfontstyle. % For now, we do not accumulate font styles: @b{@i{foo}} prints foo in % italics, not bold italics. % \def\setfontstyle#1{% \def\curfontstyle{#1}% not as a control sequence, because we are \edef'd. \csname ten#1\endcsname % change the current font } % Select #1 fonts with the current style. % \def\selectfonts#1{\csname #1fonts\endcsname \csname\curfontstyle\endcsname} \def\rm{\fam=0 \setfontstyle{rm}} \def\it{\fam=\itfam \setfontstyle{it}} \def\sl{\fam=\slfam \setfontstyle{sl}} \def\bf{\fam=\bffam \setfontstyle{bf}}\def\bfstylename{bf} \def\tt{\fam=\ttfam \setfontstyle{tt}} % Texinfo sort of supports the sans serif font style, which plain TeX does not. % So we set up a \sf. \newfam\sffam \def\sf{\fam=\sffam \setfontstyle{sf}} \let\li = \sf % Sometimes we call it \li, not \sf. % We don't need math for this font style. \def\ttsl{\setfontstyle{ttsl}} % Default leading. \newdimen\textleading \textleading = 13.2pt % Set the baselineskip to #1, and the lineskip and strut size % correspondingly. There is no deep meaning behind these magic numbers % used as factors; they just match (closely enough) what Knuth defined. % \def\lineskipfactor{.08333} \def\strutheightpercent{.70833} \def\strutdepthpercent {.29167} % % can get a sort of poor man's double spacing by redefining this. \def\baselinefactor{1} % \def\setleading#1{% \dimen0 = #1\relax \normalbaselineskip = \baselinefactor\dimen0 \normallineskip = \lineskipfactor\normalbaselineskip \normalbaselines \setbox\strutbox =\hbox{% \vrule width0pt height\strutheightpercent\baselineskip depth \strutdepthpercent \baselineskip }% } % % PDF CMaps. See also LaTeX's t1.cmap. % % \cmapOT1 \ifpdf \begingroup \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (TeX-OT1-0) %%Title: (TeX-OT1-0 TeX OT1 0) %%Version: 1.000 %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (TeX) /Ordering (OT1) /Supplement 0 >> def /CMapName /TeX-OT1-0 def /CMapType 2 def 1 begincodespacerange <00> <7F> endcodespacerange 8 beginbfrange <00> <01> <0393> <09> <0A> <03A8> <23> <26> <0023> <28> <3B> <0028> <3F> <5B> <003F> <5D> <5E> <005D> <61> <7A> <0061> <7B> <7C> <2013> endbfrange 40 beginbfchar <02> <0398> <03> <039B> <04> <039E> <05> <03A0> <06> <03A3> <07> <03D2> <08> <03A6> <0B> <00660066> <0C> <00660069> <0D> <0066006C> <0E> <006600660069> <0F> <00660066006C> <10> <0131> <11> <0237> <12> <0060> <13> <00B4> <14> <02C7> <15> <02D8> <16> <00AF> <17> <02DA> <18> <00B8> <19> <00DF> <1A> <00E6> <1B> <0153> <1C> <00F8> <1D> <00C6> <1E> <0152> <1F> <00D8> <21> <0021> <22> <201D> <27> <2019> <3C> <00A1> <3D> <003D> <3E> <00BF> <5C> <201C> <5F> <02D9> <60> <2018> <7D> <02DD> <7E> <007E> <7F> <00A8> endbfchar endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF }\endgroup \expandafter\edef\csname cmapOT1\endcsname#1{% \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% }% % % \cmapOT1IT \begingroup \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (TeX-OT1IT-0) %%Title: (TeX-OT1IT-0 TeX OT1IT 0) %%Version: 1.000 %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (TeX) /Ordering (OT1IT) /Supplement 0 >> def /CMapName /TeX-OT1IT-0 def /CMapType 2 def 1 begincodespacerange <00> <7F> endcodespacerange 8 beginbfrange <00> <01> <0393> <09> <0A> <03A8> <25> <26> <0025> <28> <3B> <0028> <3F> <5B> <003F> <5D> <5E> <005D> <61> <7A> <0061> <7B> <7C> <2013> endbfrange 42 beginbfchar <02> <0398> <03> <039B> <04> <039E> <05> <03A0> <06> <03A3> <07> <03D2> <08> <03A6> <0B> <00660066> <0C> <00660069> <0D> <0066006C> <0E> <006600660069> <0F> <00660066006C> <10> <0131> <11> <0237> <12> <0060> <13> <00B4> <14> <02C7> <15> <02D8> <16> <00AF> <17> <02DA> <18> <00B8> <19> <00DF> <1A> <00E6> <1B> <0153> <1C> <00F8> <1D> <00C6> <1E> <0152> <1F> <00D8> <21> <0021> <22> <201D> <23> <0023> <24> <00A3> <27> <2019> <3C> <00A1> <3D> <003D> <3E> <00BF> <5C> <201C> <5F> <02D9> <60> <2018> <7D> <02DD> <7E> <007E> <7F> <00A8> endbfchar endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF }\endgroup \expandafter\edef\csname cmapOT1IT\endcsname#1{% \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% }% % % \cmapOT1TT \begingroup \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (TeX-OT1TT-0) %%Title: (TeX-OT1TT-0 TeX OT1TT 0) %%Version: 1.000 %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (TeX) /Ordering (OT1TT) /Supplement 0 >> def /CMapName /TeX-OT1TT-0 def /CMapType 2 def 1 begincodespacerange <00> <7F> endcodespacerange 5 beginbfrange <00> <01> <0393> <09> <0A> <03A8> <21> <26> <0021> <28> <5F> <0028> <61> <7E> <0061> endbfrange 32 beginbfchar <02> <0398> <03> <039B> <04> <039E> <05> <03A0> <06> <03A3> <07> <03D2> <08> <03A6> <0B> <2191> <0C> <2193> <0D> <0027> <0E> <00A1> <0F> <00BF> <10> <0131> <11> <0237> <12> <0060> <13> <00B4> <14> <02C7> <15> <02D8> <16> <00AF> <17> <02DA> <18> <00B8> <19> <00DF> <1A> <00E6> <1B> <0153> <1C> <00F8> <1D> <00C6> <1E> <0152> <1F> <00D8> <20> <2423> <27> <2019> <60> <2018> <7F> <00A8> endbfchar endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF }\endgroup \expandafter\edef\csname cmapOT1TT\endcsname#1{% \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% }% \else \expandafter\let\csname cmapOT1\endcsname\gobble \expandafter\let\csname cmapOT1IT\endcsname\gobble \expandafter\let\csname cmapOT1TT\endcsname\gobble \fi % Set the font macro #1 to the font named #2, adding on the % specified font prefix (normally `cm'). % #3 is the font's design size, #4 is a scale factor, #5 is the CMap % encoding (currently only OT1, OT1IT and OT1TT are allowed, pass % empty to omit). \def\setfont#1#2#3#4#5{% \font#1=\fontprefix#2#3 scaled #4 \csname cmap#5\endcsname#1% } % This is what gets called when #5 of \setfont is empty. \let\cmap\gobble % Use cm as the default font prefix. % To specify the font prefix, you must define \fontprefix % before you read in texinfo.tex. \ifx\fontprefix\undefined \def\fontprefix{cm} \fi % Support font families that don't use the same naming scheme as CM. \def\rmshape{r} \def\rmbshape{bx} %where the normal face is bold \def\bfshape{b} \def\bxshape{bx} \def\ttshape{tt} \def\ttbshape{tt} \def\ttslshape{sltt} \def\itshape{ti} \def\itbshape{bxti} \def\slshape{sl} \def\slbshape{bxsl} \def\sfshape{ss} \def\sfbshape{ss} \def\scshape{csc} \def\scbshape{csc} % Definitions for a main text size of 11pt. This is the default in % Texinfo. % \def\definetextfontsizexi{% % Text fonts (11.2pt, magstep1). \def\textnominalsize{11pt} \edef\mainmagstep{\magstephalf} \setfont\textrm\rmshape{10}{\mainmagstep}{OT1} \setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT} \setfont\textbf\bfshape{10}{\mainmagstep}{OT1} \setfont\textit\itshape{10}{\mainmagstep}{OT1IT} \setfont\textsl\slshape{10}{\mainmagstep}{OT1} \setfont\textsf\sfshape{10}{\mainmagstep}{OT1} \setfont\textsc\scshape{10}{\mainmagstep}{OT1} \setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT} \font\texti=cmmi10 scaled \mainmagstep \font\textsy=cmsy10 scaled \mainmagstep \def\textecsize{1095} % A few fonts for @defun names and args. \setfont\defbf\bfshape{10}{\magstep1}{OT1} \setfont\deftt\ttshape{10}{\magstep1}{OT1TT} \setfont\defttsl\ttslshape{10}{\magstep1}{OT1TT} \def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf} % Fonts for indices, footnotes, small examples (9pt). \def\smallnominalsize{9pt} \setfont\smallrm\rmshape{9}{1000}{OT1} \setfont\smalltt\ttshape{9}{1000}{OT1TT} \setfont\smallbf\bfshape{10}{900}{OT1} \setfont\smallit\itshape{9}{1000}{OT1IT} \setfont\smallsl\slshape{9}{1000}{OT1} \setfont\smallsf\sfshape{9}{1000}{OT1} \setfont\smallsc\scshape{10}{900}{OT1} \setfont\smallttsl\ttslshape{10}{900}{OT1TT} \font\smalli=cmmi9 \font\smallsy=cmsy9 \def\smallecsize{0900} % Fonts for small examples (8pt). \def\smallernominalsize{8pt} \setfont\smallerrm\rmshape{8}{1000}{OT1} \setfont\smallertt\ttshape{8}{1000}{OT1TT} \setfont\smallerbf\bfshape{10}{800}{OT1} \setfont\smallerit\itshape{8}{1000}{OT1IT} \setfont\smallersl\slshape{8}{1000}{OT1} \setfont\smallersf\sfshape{8}{1000}{OT1} \setfont\smallersc\scshape{10}{800}{OT1} \setfont\smallerttsl\ttslshape{10}{800}{OT1TT} \font\smalleri=cmmi8 \font\smallersy=cmsy8 \def\smallerecsize{0800} % Fonts for title page (20.4pt): \def\titlenominalsize{20pt} \setfont\titlerm\rmbshape{12}{\magstep3}{OT1} \setfont\titleit\itbshape{10}{\magstep4}{OT1IT} \setfont\titlesl\slbshape{10}{\magstep4}{OT1} \setfont\titlett\ttbshape{12}{\magstep3}{OT1TT} \setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT} \setfont\titlesf\sfbshape{17}{\magstep1}{OT1} \let\titlebf=\titlerm \setfont\titlesc\scbshape{10}{\magstep4}{OT1} \font\titlei=cmmi12 scaled \magstep3 \font\titlesy=cmsy10 scaled \magstep4 \def\authorrm{\secrm} \def\authortt{\sectt} \def\titleecsize{2074} % Chapter (and unnumbered) fonts (17.28pt). \def\chapnominalsize{17pt} \setfont\chaprm\rmbshape{12}{\magstep2}{OT1} \setfont\chapit\itbshape{10}{\magstep3}{OT1IT} \setfont\chapsl\slbshape{10}{\magstep3}{OT1} \setfont\chaptt\ttbshape{12}{\magstep2}{OT1TT} \setfont\chapttsl\ttslshape{10}{\magstep3}{OT1TT} \setfont\chapsf\sfbshape{17}{1000}{OT1} \let\chapbf=\chaprm \setfont\chapsc\scbshape{10}{\magstep3}{OT1} \font\chapi=cmmi12 scaled \magstep2 \font\chapsy=cmsy10 scaled \magstep3 \def\chapecsize{1728} % Section fonts (14.4pt). \def\secnominalsize{14pt} \setfont\secrm\rmbshape{12}{\magstep1}{OT1} \setfont\secit\itbshape{10}{\magstep2}{OT1IT} \setfont\secsl\slbshape{10}{\magstep2}{OT1} \setfont\sectt\ttbshape{12}{\magstep1}{OT1TT} \setfont\secttsl\ttslshape{10}{\magstep2}{OT1TT} \setfont\secsf\sfbshape{12}{\magstep1}{OT1} \let\secbf\secrm \setfont\secsc\scbshape{10}{\magstep2}{OT1} \font\seci=cmmi12 scaled \magstep1 \font\secsy=cmsy10 scaled \magstep2 \def\sececsize{1440} % Subsection fonts (13.15pt). \def\ssecnominalsize{13pt} \setfont\ssecrm\rmbshape{12}{\magstephalf}{OT1} \setfont\ssecit\itbshape{10}{1315}{OT1IT} \setfont\ssecsl\slbshape{10}{1315}{OT1} \setfont\ssectt\ttbshape{12}{\magstephalf}{OT1TT} \setfont\ssecttsl\ttslshape{10}{1315}{OT1TT} \setfont\ssecsf\sfbshape{12}{\magstephalf}{OT1} \let\ssecbf\ssecrm \setfont\ssecsc\scbshape{10}{1315}{OT1} \font\sseci=cmmi12 scaled \magstephalf \font\ssecsy=cmsy10 scaled 1315 \def\ssececsize{1200} % Reduced fonts for @acro in text (10pt). \def\reducednominalsize{10pt} \setfont\reducedrm\rmshape{10}{1000}{OT1} \setfont\reducedtt\ttshape{10}{1000}{OT1TT} \setfont\reducedbf\bfshape{10}{1000}{OT1} \setfont\reducedit\itshape{10}{1000}{OT1IT} \setfont\reducedsl\slshape{10}{1000}{OT1} \setfont\reducedsf\sfshape{10}{1000}{OT1} \setfont\reducedsc\scshape{10}{1000}{OT1} \setfont\reducedttsl\ttslshape{10}{1000}{OT1TT} \font\reducedi=cmmi10 \font\reducedsy=cmsy10 \def\reducedecsize{1000} % reset the current fonts \textfonts \rm } % end of 11pt text font size definitions % Definitions to make the main text be 10pt Computer Modern, with % section, chapter, etc., sizes following suit. This is for the GNU % Press printing of the Emacs 22 manual. Maybe other manuals in the % future. Used with @smallbook, which sets the leading to 12pt. % \def\definetextfontsizex{% % Text fonts (10pt). \def\textnominalsize{10pt} \edef\mainmagstep{1000} \setfont\textrm\rmshape{10}{\mainmagstep}{OT1} \setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT} \setfont\textbf\bfshape{10}{\mainmagstep}{OT1} \setfont\textit\itshape{10}{\mainmagstep}{OT1IT} \setfont\textsl\slshape{10}{\mainmagstep}{OT1} \setfont\textsf\sfshape{10}{\mainmagstep}{OT1} \setfont\textsc\scshape{10}{\mainmagstep}{OT1} \setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT} \font\texti=cmmi10 scaled \mainmagstep \font\textsy=cmsy10 scaled \mainmagstep \def\textecsize{1000} % A few fonts for @defun names and args. \setfont\defbf\bfshape{10}{\magstephalf}{OT1} \setfont\deftt\ttshape{10}{\magstephalf}{OT1TT} \setfont\defttsl\ttslshape{10}{\magstephalf}{OT1TT} \def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf} % Fonts for indices, footnotes, small examples (9pt). \def\smallnominalsize{9pt} \setfont\smallrm\rmshape{9}{1000}{OT1} \setfont\smalltt\ttshape{9}{1000}{OT1TT} \setfont\smallbf\bfshape{10}{900}{OT1} \setfont\smallit\itshape{9}{1000}{OT1IT} \setfont\smallsl\slshape{9}{1000}{OT1} \setfont\smallsf\sfshape{9}{1000}{OT1} \setfont\smallsc\scshape{10}{900}{OT1} \setfont\smallttsl\ttslshape{10}{900}{OT1TT} \font\smalli=cmmi9 \font\smallsy=cmsy9 \def\smallecsize{0900} % Fonts for small examples (8pt). \def\smallernominalsize{8pt} \setfont\smallerrm\rmshape{8}{1000}{OT1} \setfont\smallertt\ttshape{8}{1000}{OT1TT} \setfont\smallerbf\bfshape{10}{800}{OT1} \setfont\smallerit\itshape{8}{1000}{OT1IT} \setfont\smallersl\slshape{8}{1000}{OT1} \setfont\smallersf\sfshape{8}{1000}{OT1} \setfont\smallersc\scshape{10}{800}{OT1} \setfont\smallerttsl\ttslshape{10}{800}{OT1TT} \font\smalleri=cmmi8 \font\smallersy=cmsy8 \def\smallerecsize{0800} % Fonts for title page (20.4pt): \def\titlenominalsize{20pt} \setfont\titlerm\rmbshape{12}{\magstep3}{OT1} \setfont\titleit\itbshape{10}{\magstep4}{OT1IT} \setfont\titlesl\slbshape{10}{\magstep4}{OT1} \setfont\titlett\ttbshape{12}{\magstep3}{OT1TT} \setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT} \setfont\titlesf\sfbshape{17}{\magstep1}{OT1} \let\titlebf=\titlerm \setfont\titlesc\scbshape{10}{\magstep4}{OT1} \font\titlei=cmmi12 scaled \magstep3 \font\titlesy=cmsy10 scaled \magstep4 \def\authorrm{\secrm} \def\authortt{\sectt} \def\titleecsize{2074} % Chapter fonts (14.4pt). \def\chapnominalsize{14pt} \setfont\chaprm\rmbshape{12}{\magstep1}{OT1} \setfont\chapit\itbshape{10}{\magstep2}{OT1IT} \setfont\chapsl\slbshape{10}{\magstep2}{OT1} \setfont\chaptt\ttbshape{12}{\magstep1}{OT1TT} \setfont\chapttsl\ttslshape{10}{\magstep2}{OT1TT} \setfont\chapsf\sfbshape{12}{\magstep1}{OT1} \let\chapbf\chaprm \setfont\chapsc\scbshape{10}{\magstep2}{OT1} \font\chapi=cmmi12 scaled \magstep1 \font\chapsy=cmsy10 scaled \magstep2 \def\chapecsize{1440} % Section fonts (12pt). \def\secnominalsize{12pt} \setfont\secrm\rmbshape{12}{1000}{OT1} \setfont\secit\itbshape{10}{\magstep1}{OT1IT} \setfont\secsl\slbshape{10}{\magstep1}{OT1} \setfont\sectt\ttbshape{12}{1000}{OT1TT} \setfont\secttsl\ttslshape{10}{\magstep1}{OT1TT} \setfont\secsf\sfbshape{12}{1000}{OT1} \let\secbf\secrm \setfont\secsc\scbshape{10}{\magstep1}{OT1} \font\seci=cmmi12 \font\secsy=cmsy10 scaled \magstep1 \def\sececsize{1200} % Subsection fonts (10pt). \def\ssecnominalsize{10pt} \setfont\ssecrm\rmbshape{10}{1000}{OT1} \setfont\ssecit\itbshape{10}{1000}{OT1IT} \setfont\ssecsl\slbshape{10}{1000}{OT1} \setfont\ssectt\ttbshape{10}{1000}{OT1TT} \setfont\ssecttsl\ttslshape{10}{1000}{OT1TT} \setfont\ssecsf\sfbshape{10}{1000}{OT1} \let\ssecbf\ssecrm \setfont\ssecsc\scbshape{10}{1000}{OT1} \font\sseci=cmmi10 \font\ssecsy=cmsy10 \def\ssececsize{1000} % Reduced fonts for @acro in text (9pt). \def\reducednominalsize{9pt} \setfont\reducedrm\rmshape{9}{1000}{OT1} \setfont\reducedtt\ttshape{9}{1000}{OT1TT} \setfont\reducedbf\bfshape{10}{900}{OT1} \setfont\reducedit\itshape{9}{1000}{OT1IT} \setfont\reducedsl\slshape{9}{1000}{OT1} \setfont\reducedsf\sfshape{9}{1000}{OT1} \setfont\reducedsc\scshape{10}{900}{OT1} \setfont\reducedttsl\ttslshape{10}{900}{OT1TT} \font\reducedi=cmmi9 \font\reducedsy=cmsy9 \def\reducedecsize{0900} % reduce space between paragraphs \divide\parskip by 2 % reset the current fonts \textfonts \rm } % end of 10pt text font size definitions % We provide the user-level command % @fonttextsize 10 % (or 11) to redefine the text font size. pt is assumed. % \def\xword{10} \def\xiword{11} % \parseargdef\fonttextsize{% \def\textsizearg{#1}% \wlog{doing @fonttextsize \textsizearg}% % % Set \globaldefs so that documents can use this inside @tex, since % makeinfo 4.8 does not support it, but we need it nonetheless. % \begingroup \globaldefs=1 \ifx\textsizearg\xword \definetextfontsizex \else \ifx\textsizearg\xiword \definetextfontsizexi \else \errhelp=\EMsimple \errmessage{@fonttextsize only supports `10' or `11', not `\textsizearg'} \fi\fi \endgroup } % In order for the font changes to affect most math symbols and letters, % we have to define the \textfont of the standard families. Since % texinfo doesn't allow for producing subscripts and superscripts except % in the main text, we don't bother to reset \scriptfont and % \scriptscriptfont (which would also require loading a lot more fonts). % \def\resetmathfonts{% \textfont0=\tenrm \textfont1=\teni \textfont2=\tensy \textfont\itfam=\tenit \textfont\slfam=\tensl \textfont\bffam=\tenbf \textfont\ttfam=\tentt \textfont\sffam=\tensf } % The font-changing commands redefine the meanings of \tenSTYLE, instead % of just \STYLE. We do this because \STYLE needs to also set the % current \fam for math mode. Our \STYLE (e.g., \rm) commands hardwire % \tenSTYLE to set the current font. % % Each font-changing command also sets the names \lsize (one size lower) % and \lllsize (three sizes lower). These relative commands are used in % the LaTeX logo and acronyms. % % This all needs generalizing, badly. % \def\textfonts{% \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy \let\tenttsl=\textttsl \def\curfontsize{text}% \def\lsize{reduced}\def\lllsize{smaller}% \resetmathfonts \setleading{\textleading}} \def\titlefonts{% \let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl \let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy \let\tenttsl=\titlettsl \def\curfontsize{title}% \def\lsize{chap}\def\lllsize{subsec}% \resetmathfonts \setleading{25pt}} \def\titlefont#1{{\titlefonts\rm #1}} \def\chapfonts{% \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy \let\tenttsl=\chapttsl \def\curfontsize{chap}% \def\lsize{sec}\def\lllsize{text}% \resetmathfonts \setleading{19pt}} \def\secfonts{% \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy \let\tenttsl=\secttsl \def\curfontsize{sec}% \def\lsize{subsec}\def\lllsize{reduced}% \resetmathfonts \setleading{16pt}} \def\subsecfonts{% \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy \let\tenttsl=\ssecttsl \def\curfontsize{ssec}% \def\lsize{text}\def\lllsize{small}% \resetmathfonts \setleading{15pt}} \let\subsubsecfonts = \subsecfonts \def\reducedfonts{% \let\tenrm=\reducedrm \let\tenit=\reducedit \let\tensl=\reducedsl \let\tenbf=\reducedbf \let\tentt=\reducedtt \let\reducedcaps=\reducedsc \let\tensf=\reducedsf \let\teni=\reducedi \let\tensy=\reducedsy \let\tenttsl=\reducedttsl \def\curfontsize{reduced}% \def\lsize{small}\def\lllsize{smaller}% \resetmathfonts \setleading{10.5pt}} \def\smallfonts{% \let\tenrm=\smallrm \let\tenit=\smallit \let\tensl=\smallsl \let\tenbf=\smallbf \let\tentt=\smalltt \let\smallcaps=\smallsc \let\tensf=\smallsf \let\teni=\smalli \let\tensy=\smallsy \let\tenttsl=\smallttsl \def\curfontsize{small}% \def\lsize{smaller}\def\lllsize{smaller}% \resetmathfonts \setleading{10.5pt}} \def\smallerfonts{% \let\tenrm=\smallerrm \let\tenit=\smallerit \let\tensl=\smallersl \let\tenbf=\smallerbf \let\tentt=\smallertt \let\smallcaps=\smallersc \let\tensf=\smallersf \let\teni=\smalleri \let\tensy=\smallersy \let\tenttsl=\smallerttsl \def\curfontsize{smaller}% \def\lsize{smaller}\def\lllsize{smaller}% \resetmathfonts \setleading{9.5pt}} % Set the fonts to use with the @small... environments. \let\smallexamplefonts = \smallfonts % About \smallexamplefonts. If we use \smallfonts (9pt), @smallexample % can fit this many characters: % 8.5x11=86 smallbook=72 a4=90 a5=69 % If we use \scriptfonts (8pt), then we can fit this many characters: % 8.5x11=90+ smallbook=80 a4=90+ a5=77 % For me, subjectively, the few extra characters that fit aren't worth % the additional smallness of 8pt. So I'm making the default 9pt. % % By the way, for comparison, here's what fits with @example (10pt): % 8.5x11=71 smallbook=60 a4=75 a5=58 % % I wish the USA used A4 paper. % --karl, 24jan03. % Set up the default fonts, so we can use them for creating boxes. % \definetextfontsizexi % Define these so they can be easily changed for other fonts. \def\angleleft{$\langle$} \def\angleright{$\rangle$} % Count depth in font-changes, for error checks \newcount\fontdepth \fontdepth=0 % Fonts for short table of contents. \setfont\shortcontrm\rmshape{12}{1000}{OT1} \setfont\shortcontbf\bfshape{10}{\magstep1}{OT1} % no cmb12 \setfont\shortcontsl\slshape{12}{1000}{OT1} \setfont\shortconttt\ttshape{12}{1000}{OT1TT} %% Add scribe-like font environments, plus @l for inline lisp (usually sans %% serif) and @ii for TeX italic % \smartitalic{ARG} outputs arg in italics, followed by an italic correction % unless the following character is such as not to need one. \def\smartitalicx{\ifx\next,\else\ifx\next-\else\ifx\next.\else \ptexslash\fi\fi\fi} \def\smartslanted#1{{\ifusingtt\ttsl\sl #1}\futurelet\next\smartitalicx} \def\smartitalic#1{{\ifusingtt\ttsl\it #1}\futurelet\next\smartitalicx} % like \smartslanted except unconditionally uses \ttsl. % @var is set to this for defun arguments. \def\ttslanted#1{{\ttsl #1}\futurelet\next\smartitalicx} % like \smartslanted except unconditionally use \sl. We never want % ttsl for book titles, do we? \def\cite#1{{\sl #1}\futurelet\next\smartitalicx} \let\i=\smartitalic \let\slanted=\smartslanted \let\var=\smartslanted \let\dfn=\smartslanted \let\emph=\smartitalic % @b, explicit bold. \def\b#1{{\bf #1}} \let\strong=\b % @sansserif, explicit sans. \def\sansserif#1{{\sf #1}} % We can't just use \exhyphenpenalty, because that only has effect at % the end of a paragraph. Restore normal hyphenation at the end of the % group within which \nohyphenation is presumably called. % \def\nohyphenation{\hyphenchar\font = -1 \aftergroup\restorehyphenation} \def\restorehyphenation{\hyphenchar\font = `- } % Set sfcode to normal for the chars that usually have another value. % Can't use plain's \frenchspacing because it uses the `\x notation, and % sometimes \x has an active definition that messes things up. % \catcode`@=11 \def\plainfrenchspacing{% \sfcode\dotChar =\@m \sfcode\questChar=\@m \sfcode\exclamChar=\@m \sfcode\colonChar=\@m \sfcode\semiChar =\@m \sfcode\commaChar =\@m \def\endofsentencespacefactor{1000}% for @. and friends } \def\plainnonfrenchspacing{% \sfcode`\.3000\sfcode`\?3000\sfcode`\!3000 \sfcode`\:2000\sfcode`\;1500\sfcode`\,1250 \def\endofsentencespacefactor{3000}% for @. and friends } \catcode`@=\other \def\endofsentencespacefactor{3000}% default \def\t#1{% {\tt \rawbackslash \plainfrenchspacing #1}% \null } \def\samp#1{`\tclose{#1}'\null} \setfont\keyrm\rmshape{8}{1000}{OT1} \font\keysy=cmsy9 \def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{% \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{% \vbox{\hrule\kern-0.4pt \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}% \kern-0.4pt\hrule}% \kern-.06em\raise0.4pt\hbox{\angleright}}}} \def\key #1{{\nohyphenation \uppercase{#1}}\null} % The old definition, with no lozenge: %\def\key #1{{\ttsl \nohyphenation \uppercase{#1}}\null} \def\ctrl #1{{\tt \rawbackslash \hat}#1} % @file, @option are the same as @samp. \let\file=\samp \let\option=\samp % @code is a modification of @t, % which makes spaces the same size as normal in the surrounding text. \def\tclose#1{% {% % Change normal interword space to be same as for the current font. \spaceskip = \fontdimen2\font % % Switch to typewriter. \tt % % But `\ ' produces the large typewriter interword space. \def\ {{\spaceskip = 0pt{} }}% % % Turn off hyphenation. \nohyphenation % \rawbackslash \plainfrenchspacing #1% }% \null } % We *must* turn on hyphenation at `-' and `_' in @code. % Otherwise, it is too hard to avoid overfull hboxes % in the Emacs manual, the Library manual, etc. % Unfortunately, TeX uses one parameter (\hyphenchar) to control % both hyphenation at - and hyphenation within words. % We must therefore turn them both off (\tclose does that) % and arrange explicitly to hyphenate at a dash. % -- rms. { \catcode`\-=\active \catcode`\_=\active \catcode`\'=\active \catcode`\`=\active % \global\def\code{\begingroup \catcode\rquoteChar=\active \catcode\lquoteChar=\active \let'\codequoteright \let`\codequoteleft % \catcode\dashChar=\active \catcode\underChar=\active \ifallowcodebreaks \let-\codedash \let_\codeunder \else \let-\realdash \let_\realunder \fi \codex } } \def\realdash{-} \def\codedash{-\discretionary{}{}{}} \def\codeunder{% % this is all so @math{@code{var_name}+1} can work. In math mode, _ % is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.) % will therefore expand the active definition of _, which is us % (inside @code that is), therefore an endless loop. \ifusingtt{\ifmmode \mathchar"075F % class 0=ordinary, family 7=ttfam, pos 0x5F=_. \else\normalunderscore \fi \discretionary{}{}{}}% {\_}% } \def\codex #1{\tclose{#1}\endgroup} % An additional complication: the above will allow breaks after, e.g., % each of the four underscores in __typeof__. This is undesirable in % some manuals, especially if they don't have long identifiers in % general. @allowcodebreaks provides a way to control this. % \newif\ifallowcodebreaks \allowcodebreakstrue \def\keywordtrue{true} \def\keywordfalse{false} \parseargdef\allowcodebreaks{% \def\txiarg{#1}% \ifx\txiarg\keywordtrue \allowcodebreakstrue \else\ifx\txiarg\keywordfalse \allowcodebreaksfalse \else \errhelp = \EMsimple \errmessage{Unknown @allowcodebreaks option `\txiarg'}% \fi\fi } % @kbd is like @code, except that if the argument is just one @key command, % then @kbd has no effect. % @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always), % `example' (@kbd uses ttsl only inside of @example and friends), % or `code' (@kbd uses normal tty font always). \parseargdef\kbdinputstyle{% \def\txiarg{#1}% \ifx\txiarg\worddistinct \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}% \else\ifx\txiarg\wordexample \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}% \else\ifx\txiarg\wordcode \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}% \else \errhelp = \EMsimple \errmessage{Unknown @kbdinputstyle option `\txiarg'}% \fi\fi\fi } \def\worddistinct{distinct} \def\wordexample{example} \def\wordcode{code} % Default is `distinct.' \kbdinputstyle distinct \def\xkey{\key} \def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}% \ifx\one\xkey\ifx\threex\three \key{#2}% \else{\tclose{\kbdfont\look}}\fi \else{\tclose{\kbdfont\look}}\fi} % For @indicateurl, @env, @command quotes seem unnecessary, so use \code. \let\indicateurl=\code \let\env=\code \let\command=\code % @uref (abbreviation for `urlref') takes an optional (comma-separated) % second argument specifying the text to display and an optional third % arg as text to display instead of (rather than in addition to) the url % itself. First (mandatory) arg is the url. Perhaps eventually put in % a hypertex \special here. % \def\uref#1{\douref #1,,,\finish} \def\douref#1,#2,#3,#4\finish{\begingroup \unsepspaces \pdfurl{#1}% \setbox0 = \hbox{\ignorespaces #3}% \ifdim\wd0 > 0pt \unhbox0 % third arg given, show only that \else \setbox0 = \hbox{\ignorespaces #2}% \ifdim\wd0 > 0pt \ifpdf \unhbox0 % PDF: 2nd arg given, show only it \else \unhbox0\ (\code{#1})% DVI: 2nd arg given, show both it and url \fi \else \code{#1}% only url given, so show it \fi \fi \endlink \endgroup} % @url synonym for @uref, since that's how everyone uses it. % \let\url=\uref % rms does not like angle brackets --karl, 17may97. % So now @email is just like @uref, unless we are pdf. % %\def\email#1{\angleleft{\tt #1}\angleright} \ifpdf \def\email#1{\doemail#1,,\finish} \def\doemail#1,#2,#3\finish{\begingroup \unsepspaces \pdfurl{mailto:#1}% \setbox0 = \hbox{\ignorespaces #2}% \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi \endlink \endgroup} \else \let\email=\uref \fi % Check if we are currently using a typewriter font. Since all the % Computer Modern typewriter fonts have zero interword stretch (and % shrink), and it is reasonable to expect all typewriter fonts to have % this property, we can check that font parameter. % \def\ifmonospace{\ifdim\fontdimen3\font=0pt } % Typeset a dimension, e.g., `in' or `pt'. The only reason for the % argument is to make the input look right: @dmn{pt} instead of @dmn{}pt. % \def\dmn#1{\thinspace #1} \def\kbd#1{\def\look{#1}\expandafter\kbdfoo\look??\par} % @l was never documented to mean ``switch to the Lisp font'', % and it is not used as such in any manual I can find. We need it for % Polish suppressed-l. --karl, 22sep96. %\def\l#1{{\li #1}\null} % Explicit font changes: @r, @sc, undocumented @ii. \def\r#1{{\rm #1}} % roman font \def\sc#1{{\smallcaps#1}} % smallcaps font \def\ii#1{{\it #1}} % italic font % @acronym for "FBI", "NATO", and the like. % We print this one point size smaller, since it's intended for % all-uppercase. % \def\acronym#1{\doacronym #1,,\finish} \def\doacronym#1,#2,#3\finish{% {\selectfonts\lsize #1}% \def\temp{#2}% \ifx\temp\empty \else \space ({\unsepspaces \ignorespaces \temp \unskip})% \fi } % @abbr for "Comput. J." and the like. % No font change, but don't do end-of-sentence spacing. % \def\abbr#1{\doabbr #1,,\finish} \def\doabbr#1,#2,#3\finish{% {\plainfrenchspacing #1}% \def\temp{#2}% \ifx\temp\empty \else \space ({\unsepspaces \ignorespaces \temp \unskip})% \fi } % @pounds{} is a sterling sign, which Knuth put in the CM italic font. % \def\pounds{{\it\$}} % @euro{} comes from a separate font, depending on the current style. % We use the free feym* fonts from the eurosym package by Henrik % Theiling, which support regular, slanted, bold and bold slanted (and % "outlined" (blackboard board, sort of) versions, which we don't need). % It is available from http://www.ctan.org/tex-archive/fonts/eurosym. % % Although only regular is the truly official Euro symbol, we ignore % that. The Euro is designed to be slightly taller than the regular % font height. % % feymr - regular % feymo - slanted % feybr - bold % feybo - bold slanted % % There is no good (free) typewriter version, to my knowledge. % A feymr10 euro is ~7.3pt wide, while a normal cmtt10 char is ~5.25pt wide. % Hmm. % % Also doesn't work in math. Do we need to do math with euro symbols? % Hope not. % % \def\euro{{\eurofont e}} \def\eurofont{% % We set the font at each command, rather than predefining it in % \textfonts and the other font-switching commands, so that % installations which never need the symbol don't have to have the % font installed. % % There is only one designed size (nominal 10pt), so we always scale % that to the current nominal size. % % By the way, simply using "at 1em" works for cmr10 and the like, but % does not work for cmbx10 and other extended/shrunken fonts. % \def\eurosize{\csname\curfontsize nominalsize\endcsname}% % \ifx\curfontstyle\bfstylename % bold: \font\thiseurofont = \ifusingit{feybo10}{feybr10} at \eurosize \else % regular: \font\thiseurofont = \ifusingit{feymo10}{feymr10} at \eurosize \fi \thiseurofont } % Hacks for glyphs from the EC fonts similar to \euro. We don't % use \let for the aliases, because sometimes we redefine the original % macro, and the alias should reflect the redefinition. \def\guillemetleft{{\ecfont \char"13}} \def\guillemotleft{\guillemetleft} \def\guillemetright{{\ecfont \char"14}} \def\guillemotright{\guillemetright} \def\guilsinglleft{{\ecfont \char"0E}} \def\guilsinglright{{\ecfont \char"0F}} \def\quotedblbase{{\ecfont \char"12}} \def\quotesinglbase{{\ecfont \char"0D}} % \def\ecfont{% % We can't distinguish serif/sanserif and italic/slanted, but this % is used for crude hacks anyway (like adding French and German % quotes to documents typeset with CM, where we lose kerning), so % hopefully nobody will notice/care. \edef\ecsize{\csname\curfontsize ecsize\endcsname}% \edef\nominalsize{\csname\curfontsize nominalsize\endcsname}% \ifx\curfontstyle\bfstylename % bold: \font\thisecfont = ecb\ifusingit{i}{x}\ecsize \space at \nominalsize \else % regular: \font\thisecfont = ec\ifusingit{ti}{rm}\ecsize \space at \nominalsize \fi \thisecfont } % @registeredsymbol - R in a circle. The font for the R should really % be smaller yet, but lllsize is the best we can do for now. % Adapted from the plain.tex definition of \copyright. % \def\registeredsymbol{% $^{{\ooalign{\hfil\raise.07ex\hbox{\selectfonts\lllsize R}% \hfil\crcr\Orb}}% }$% } % @textdegree - the normal degrees sign. % \def\textdegree{$^\circ$} % Laurent Siebenmann reports \Orb undefined with: % Textures 1.7.7 (preloaded format=plain 93.10.14) (68K) 16 APR 2004 02:38 % so we'll define it if necessary. % \ifx\Orb\undefined \def\Orb{\mathhexbox20D} \fi % Quotes. \chardef\quotedblleft="5C \chardef\quotedblright=`\" \chardef\quoteleft=`\` \chardef\quoteright=`\' \message{page headings,} \newskip\titlepagetopglue \titlepagetopglue = 1.5in \newskip\titlepagebottomglue \titlepagebottomglue = 2pc % First the title page. Must do @settitle before @titlepage. \newif\ifseenauthor \newif\iffinishedtitlepage % Do an implicit @contents or @shortcontents after @end titlepage if the % user says @setcontentsaftertitlepage or @setshortcontentsaftertitlepage. % \newif\ifsetcontentsaftertitlepage \let\setcontentsaftertitlepage = \setcontentsaftertitlepagetrue \newif\ifsetshortcontentsaftertitlepage \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue \parseargdef\shorttitlepage{\begingroup\hbox{}\vskip 1.5in \chaprm \centerline{#1}% \endgroup\page\hbox{}\page} \envdef\titlepage{% % Open one extra group, as we want to close it in the middle of \Etitlepage. \begingroup \parindent=0pt \textfonts % Leave some space at the very top of the page. \vglue\titlepagetopglue % No rule at page bottom unless we print one at the top with @title. \finishedtitlepagetrue % % Most title ``pages'' are actually two pages long, with space % at the top of the second. We don't want the ragged left on the second. \let\oldpage = \page \def\page{% \iffinishedtitlepage\else \finishtitlepage \fi \let\page = \oldpage \page \null }% } \def\Etitlepage{% \iffinishedtitlepage\else \finishtitlepage \fi % It is important to do the page break before ending the group, % because the headline and footline are only empty inside the group. % If we use the new definition of \page, we always get a blank page % after the title page, which we certainly don't want. \oldpage \endgroup % % Need this before the \...aftertitlepage checks so that if they are % in effect the toc pages will come out with page numbers. \HEADINGSon % % If they want short, they certainly want long too. \ifsetshortcontentsaftertitlepage \shortcontents \contents \global\let\shortcontents = \relax \global\let\contents = \relax \fi % \ifsetcontentsaftertitlepage \contents \global\let\contents = \relax \global\let\shortcontents = \relax \fi } \def\finishtitlepage{% \vskip4pt \hrule height 2pt width \hsize \vskip\titlepagebottomglue \finishedtitlepagetrue } %%% Macros to be used within @titlepage: \let\subtitlerm=\tenrm \def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines} \def\authorfont{\authorrm \normalbaselineskip = 16pt \normalbaselines \let\tt=\authortt} \parseargdef\title{% \checkenv\titlepage \leftline{\titlefonts\rm #1} % print a rule at the page bottom also. \finishedtitlepagefalse \vskip4pt \hrule height 4pt width \hsize \vskip4pt } \parseargdef\subtitle{% \checkenv\titlepage {\subtitlefont \rightline{#1}}% } % @author should come last, but may come many times. % It can also be used inside @quotation. % \parseargdef\author{% \def\temp{\quotation}% \ifx\thisenv\temp \def\quotationauthor{#1}% printed in \Equotation. \else \checkenv\titlepage \ifseenauthor\else \vskip 0pt plus 1filll \seenauthortrue \fi {\authorfont \leftline{#1}}% \fi } %%% Set up page headings and footings. \let\thispage=\folio \newtoks\evenheadline % headline on even pages \newtoks\oddheadline % headline on odd pages \newtoks\evenfootline % footline on even pages \newtoks\oddfootline % footline on odd pages % Now make TeX use those variables \headline={{\textfonts\rm \ifodd\pageno \the\oddheadline \else \the\evenheadline \fi}} \footline={{\textfonts\rm \ifodd\pageno \the\oddfootline \else \the\evenfootline \fi}\HEADINGShook} \let\HEADINGShook=\relax % Commands to set those variables. % For example, this is what @headings on does % @evenheading @thistitle|@thispage|@thischapter % @oddheading @thischapter|@thispage|@thistitle % @evenfooting @thisfile|| % @oddfooting ||@thisfile \def\evenheading{\parsearg\evenheadingxxx} \def\evenheadingxxx #1{\evenheadingyyy #1\|\|\|\|\finish} \def\evenheadingyyy #1\|#2\|#3\|#4\finish{% \global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} \def\oddheading{\parsearg\oddheadingxxx} \def\oddheadingxxx #1{\oddheadingyyy #1\|\|\|\|\finish} \def\oddheadingyyy #1\|#2\|#3\|#4\finish{% \global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} \parseargdef\everyheading{\oddheadingxxx{#1}\evenheadingxxx{#1}}% \def\evenfooting{\parsearg\evenfootingxxx} \def\evenfootingxxx #1{\evenfootingyyy #1\|\|\|\|\finish} \def\evenfootingyyy #1\|#2\|#3\|#4\finish{% \global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} \def\oddfooting{\parsearg\oddfootingxxx} \def\oddfootingxxx #1{\oddfootingyyy #1\|\|\|\|\finish} \def\oddfootingyyy #1\|#2\|#3\|#4\finish{% \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}% % % Leave some space for the footline. Hopefully ok to assume % @evenfooting will not be used by itself. \global\advance\pageheight by -12pt \global\advance\vsize by -12pt } \parseargdef\everyfooting{\oddfootingxxx{#1}\evenfootingxxx{#1}} % @evenheadingmarks top \thischapter <- chapter at the top of a page % @evenheadingmarks bottom \thischapter <- chapter at the bottom of a page % % The same set of arguments for: % % @oddheadingmarks % @evenfootingmarks % @oddfootingmarks % @everyheadingmarks % @everyfootingmarks \def\evenheadingmarks{\headingmarks{even}{heading}} \def\oddheadingmarks{\headingmarks{odd}{heading}} \def\evenfootingmarks{\headingmarks{even}{footing}} \def\oddfootingmarks{\headingmarks{odd}{footing}} \def\everyheadingmarks#1 {\headingmarks{even}{heading}{#1} \headingmarks{odd}{heading}{#1} } \def\everyfootingmarks#1 {\headingmarks{even}{footing}{#1} \headingmarks{odd}{footing}{#1} } % #1 = even/odd, #2 = heading/footing, #3 = top/bottom. \def\headingmarks#1#2#3 {% \expandafter\let\expandafter\temp \csname get#3headingmarks\endcsname \global\expandafter\let\csname get#1#2marks\endcsname \temp } \everyheadingmarks bottom \everyfootingmarks bottom % @headings double turns headings on for double-sided printing. % @headings single turns headings on for single-sided printing. % @headings off turns them off. % @headings on same as @headings double, retained for compatibility. % @headings after turns on double-sided headings after this page. % @headings doubleafter turns on double-sided headings after this page. % @headings singleafter turns on single-sided headings after this page. % By default, they are off at the start of a document, % and turned `on' after @end titlepage. \def\headings #1 {\csname HEADINGS#1\endcsname} \def\HEADINGSoff{% \global\evenheadline={\hfil} \global\evenfootline={\hfil} \global\oddheadline={\hfil} \global\oddfootline={\hfil}} \HEADINGSoff % When we turn headings on, set the page number to 1. % For double-sided printing, put current file name in lower left corner, % chapter name on inside top of right hand pages, document % title on inside top of left hand pages, and page numbers on outside top % edge of all pages. \def\HEADINGSdouble{% \global\pageno=1 \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\folio\hfil\thistitle}} \global\oddheadline={\line{\thischapter\hfil\folio}} \global\let\contentsalignmacro = \chapoddpage } \let\contentsalignmacro = \chappager % For single-sided printing, chapter title goes across top left of page, % page number on top right. \def\HEADINGSsingle{% \global\pageno=1 \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\thischapter\hfil\folio}} \global\oddheadline={\line{\thischapter\hfil\folio}} \global\let\contentsalignmacro = \chappager } \def\HEADINGSon{\HEADINGSdouble} \def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex} \let\HEADINGSdoubleafter=\HEADINGSafter \def\HEADINGSdoublex{% \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\folio\hfil\thistitle}} \global\oddheadline={\line{\thischapter\hfil\folio}} \global\let\contentsalignmacro = \chapoddpage } \def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex} \def\HEADINGSsinglex{% \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\thischapter\hfil\folio}} \global\oddheadline={\line{\thischapter\hfil\folio}} \global\let\contentsalignmacro = \chappager } % Subroutines used in generating headings % This produces Day Month Year style of output. % Only define if not already defined, in case a txi-??.tex file has set % up a different format (e.g., txi-cs.tex does this). \ifx\today\undefined \def\today{% \number\day\space \ifcase\month \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec \fi \space\number\year} \fi % @settitle line... specifies the title of the document, for headings. % It generates no output of its own. \def\thistitle{\putwordNoTitle} \def\settitle{\parsearg{\gdef\thistitle}} \message{tables,} % Tables -- @table, @ftable, @vtable, @item(x). % default indentation of table text \newdimen\tableindent \tableindent=.8in % default indentation of @itemize and @enumerate text \newdimen\itemindent \itemindent=.3in % margin between end of table item and start of table text. \newdimen\itemmargin \itemmargin=.1in % used internally for \itemindent minus \itemmargin \newdimen\itemmax % Note @table, @ftable, and @vtable define @item, @itemx, etc., with % these defs. % They also define \itemindex % to index the item name in whatever manner is desired (perhaps none). \newif\ifitemxneedsnegativevskip \def\itemxpar{\par\ifitemxneedsnegativevskip\nobreak\vskip-\parskip\nobreak\fi} \def\internalBitem{\smallbreak \parsearg\itemzzz} \def\internalBitemx{\itemxpar \parsearg\itemzzz} \def\itemzzz #1{\begingroup % \advance\hsize by -\rightskip \advance\hsize by -\tableindent \setbox0=\hbox{\itemindicate{#1}}% \itemindex{#1}% \nobreak % This prevents a break before @itemx. % % If the item text does not fit in the space we have, put it on a line % by itself, and do not allow a page break either before or after that % line. We do not start a paragraph here because then if the next % command is, e.g., @kindex, the whatsit would get put into the % horizontal list on a line by itself, resulting in extra blank space. \ifdim \wd0>\itemmax % % Make this a paragraph so we get the \parskip glue and wrapping, % but leave it ragged-right. \begingroup \advance\leftskip by-\tableindent \advance\hsize by\tableindent \advance\rightskip by0pt plus1fil \leavevmode\unhbox0\par \endgroup % % We're going to be starting a paragraph, but we don't want the % \parskip glue -- logically it's part of the @item we just started. \nobreak \vskip-\parskip % % Stop a page break at the \parskip glue coming up. However, if % what follows is an environment such as @example, there will be no % \parskip glue; then the negative vskip we just inserted would % cause the example and the item to crash together. So we use this % bizarre value of 10001 as a signal to \aboveenvbreak to insert % \parskip glue after all. Section titles are handled this way also. % \penalty 10001 \endgroup \itemxneedsnegativevskipfalse \else % The item text fits into the space. Start a paragraph, so that the % following text (if any) will end up on the same line. \noindent % Do this with kerns and \unhbox so that if there is a footnote in % the item text, it can migrate to the main vertical list and % eventually be printed. \nobreak\kern-\tableindent \dimen0 = \itemmax \advance\dimen0 by \itemmargin \advance\dimen0 by -\wd0 \unhbox0 \nobreak\kern\dimen0 \endgroup \itemxneedsnegativevskiptrue \fi } \def\item{\errmessage{@item while not in a list environment}} \def\itemx{\errmessage{@itemx while not in a list environment}} % @table, @ftable, @vtable. \envdef\table{% \let\itemindex\gobble \tablecheck{table}% } \envdef\ftable{% \def\itemindex ##1{\doind {fn}{\code{##1}}}% \tablecheck{ftable}% } \envdef\vtable{% \def\itemindex ##1{\doind {vr}{\code{##1}}}% \tablecheck{vtable}% } \def\tablecheck#1{% \ifnum \the\catcode`\^^M=\active \endgroup \errmessage{This command won't work in this context; perhaps the problem is that we are \inenvironment\thisenv}% \def\next{\doignore{#1}}% \else \let\next\tablex \fi \next } \def\tablex#1{% \def\itemindicate{#1}% \parsearg\tabley } \def\tabley#1{% {% \makevalueexpandable \edef\temp{\noexpand\tablez #1\space\space\space}% \expandafter }\temp \endtablez } \def\tablez #1 #2 #3 #4\endtablez{% \aboveenvbreak \ifnum 0#1>0 \advance \leftskip by #1\mil \fi \ifnum 0#2>0 \tableindent=#2\mil \fi \ifnum 0#3>0 \advance \rightskip by #3\mil \fi \itemmax=\tableindent \advance \itemmax by -\itemmargin \advance \leftskip by \tableindent \exdentamount=\tableindent \parindent = 0pt \parskip = \smallskipamount \ifdim \parskip=0pt \parskip=2pt \fi \let\item = \internalBitem \let\itemx = \internalBitemx } \def\Etable{\endgraf\afterenvbreak} \let\Eftable\Etable \let\Evtable\Etable \let\Eitemize\Etable \let\Eenumerate\Etable % This is the counter used by @enumerate, which is really @itemize \newcount \itemno \envdef\itemize{\parsearg\doitemize} \def\doitemize#1{% \aboveenvbreak \itemmax=\itemindent \advance\itemmax by -\itemmargin \advance\leftskip by \itemindent \exdentamount=\itemindent \parindent=0pt \parskip=\smallskipamount \ifdim\parskip=0pt \parskip=2pt \fi \def\itemcontents{#1}% % @itemize with no arg is equivalent to @itemize @bullet. \ifx\itemcontents\empty\def\itemcontents{\bullet}\fi \let\item=\itemizeitem } % Definition of @item while inside @itemize and @enumerate. % \def\itemizeitem{% \advance\itemno by 1 % for enumerations {\let\par=\endgraf \smallbreak}% reasonable place to break {% % If the document has an @itemize directly after a section title, a % \nobreak will be last on the list, and \sectionheading will have % done a \vskip-\parskip. In that case, we don't want to zero % parskip, or the item text will crash with the heading. On the % other hand, when there is normal text preceding the item (as there % usually is), we do want to zero parskip, or there would be too much % space. In that case, we won't have a \nobreak before. At least % that's the theory. \ifnum\lastpenalty<10000 \parskip=0in \fi \noindent \hbox to 0pt{\hss \itemcontents \kern\itemmargin}% \vadjust{\penalty 1200}}% not good to break after first line of item. \flushcr } % \splitoff TOKENS\endmark defines \first to be the first token in % TOKENS, and \rest to be the remainder. % \def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}% % Allow an optional argument of an uppercase letter, lowercase letter, % or number, to specify the first label in the enumerated list. No % argument is the same as `1'. % \envparseargdef\enumerate{\enumeratey #1 \endenumeratey} \def\enumeratey #1 #2\endenumeratey{% % If we were given no argument, pretend we were given `1'. \def\thearg{#1}% \ifx\thearg\empty \def\thearg{1}\fi % % Detect if the argument is a single token. If so, it might be a % letter. Otherwise, the only valid thing it can be is a number. % (We will always have one token, because of the test we just made. % This is a good thing, since \splitoff doesn't work given nothing at % all -- the first parameter is undelimited.) \expandafter\splitoff\thearg\endmark \ifx\rest\empty % Only one token in the argument. It could still be anything. % A ``lowercase letter'' is one whose \lccode is nonzero. % An ``uppercase letter'' is one whose \lccode is both nonzero, and % not equal to itself. % Otherwise, we assume it's a number. % % We need the \relax at the end of the \ifnum lines to stop TeX from % continuing to look for a . % \ifnum\lccode\expandafter`\thearg=0\relax \numericenumerate % a number (we hope) \else % It's a letter. \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax \lowercaseenumerate % lowercase letter \else \uppercaseenumerate % uppercase letter \fi \fi \else % Multiple tokens in the argument. We hope it's a number. \numericenumerate \fi } % An @enumerate whose labels are integers. The starting integer is % given in \thearg. % \def\numericenumerate{% \itemno = \thearg \startenumeration{\the\itemno}% } % The starting (lowercase) letter is in \thearg. \def\lowercaseenumerate{% \itemno = \expandafter`\thearg \startenumeration{% % Be sure we're not beyond the end of the alphabet. \ifnum\itemno=0 \errmessage{No more lowercase letters in @enumerate; get a bigger alphabet}% \fi \char\lccode\itemno }% } % The starting (uppercase) letter is in \thearg. \def\uppercaseenumerate{% \itemno = \expandafter`\thearg \startenumeration{% % Be sure we're not beyond the end of the alphabet. \ifnum\itemno=0 \errmessage{No more uppercase letters in @enumerate; get a bigger alphabet} \fi \char\uccode\itemno }% } % Call \doitemize, adding a period to the first argument and supplying the % common last two arguments. Also subtract one from the initial value in % \itemno, since @item increments \itemno. % \def\startenumeration#1{% \advance\itemno by -1 \doitemize{#1.}\flushcr } % @alphaenumerate and @capsenumerate are abbreviations for giving an arg % to @enumerate. % \def\alphaenumerate{\enumerate{a}} \def\capsenumerate{\enumerate{A}} \def\Ealphaenumerate{\Eenumerate} \def\Ecapsenumerate{\Eenumerate} % @multitable macros % Amy Hendrickson, 8/18/94, 3/6/96 % % @multitable ... @end multitable will make as many columns as desired. % Contents of each column will wrap at width given in preamble. Width % can be specified either with sample text given in a template line, % or in percent of \hsize, the current width of text on page. % Table can continue over pages but will only break between lines. % To make preamble: % % Either define widths of columns in terms of percent of \hsize: % @multitable @columnfractions .25 .3 .45 % @item ... % % Numbers following @columnfractions are the percent of the total % current hsize to be used for each column. You may use as many % columns as desired. % Or use a template: % @multitable {Column 1 template} {Column 2 template} {Column 3 template} % @item ... % using the widest term desired in each column. % Each new table line starts with @item, each subsequent new column % starts with @tab. Empty columns may be produced by supplying @tab's % with nothing between them for as many times as empty columns are needed, % ie, @tab@tab@tab will produce two empty columns. % @item, @tab do not need to be on their own lines, but it will not hurt % if they are. % Sample multitable: % @multitable {Column 1 template} {Column 2 template} {Column 3 template} % @item first col stuff @tab second col stuff @tab third col % @item % first col stuff % @tab % second col stuff % @tab % third col % @item first col stuff @tab second col stuff % @tab Many paragraphs of text may be used in any column. % % They will wrap at the width determined by the template. % @item@tab@tab This will be in third column. % @end multitable % Default dimensions may be reset by user. % @multitableparskip is vertical space between paragraphs in table. % @multitableparindent is paragraph indent in table. % @multitablecolmargin is horizontal space to be left between columns. % @multitablelinespace is space to leave between table items, baseline % to baseline. % 0pt means it depends on current normal line spacing. % \newskip\multitableparskip \newskip\multitableparindent \newdimen\multitablecolspace \newskip\multitablelinespace \multitableparskip=0pt \multitableparindent=6pt \multitablecolspace=12pt \multitablelinespace=0pt % Macros used to set up halign preamble: % \let\endsetuptable\relax \def\xendsetuptable{\endsetuptable} \let\columnfractions\relax \def\xcolumnfractions{\columnfractions} \newif\ifsetpercent % #1 is the @columnfraction, usually a decimal number like .5, but might % be just 1. We just use it, whatever it is. % \def\pickupwholefraction#1 {% \global\advance\colcount by 1 \expandafter\xdef\csname col\the\colcount\endcsname{#1\hsize}% \setuptable } \newcount\colcount \def\setuptable#1{% \def\firstarg{#1}% \ifx\firstarg\xendsetuptable \let\go = \relax \else \ifx\firstarg\xcolumnfractions \global\setpercenttrue \else \ifsetpercent \let\go\pickupwholefraction \else \global\advance\colcount by 1 \setbox0=\hbox{#1\unskip\space}% Add a normal word space as a % separator; typically that is always in the input, anyway. \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}% \fi \fi \ifx\go\pickupwholefraction % Put the argument back for the \pickupwholefraction call, so % we'll always have a period there to be parsed. \def\go{\pickupwholefraction#1}% \else \let\go = \setuptable \fi% \fi \go } % multitable-only commands. % % @headitem starts a heading row, which we typeset in bold. % Assignments have to be global since we are inside the implicit group % of an alignment entry. Note that \everycr resets \everytab. \def\headitem{\checkenv\multitable \crcr \global\everytab={\bf}\the\everytab}% % % A \tab used to include \hskip1sp. But then the space in a template % line is not enough. That is bad. So let's go back to just `&' until % we encounter the problem it was intended to solve again. % --karl, nathan@acm.org, 20apr99. \def\tab{\checkenv\multitable &\the\everytab}% % @multitable ... @end multitable definitions: % \newtoks\everytab % insert after every tab. % \envdef\multitable{% \vskip\parskip \startsavinginserts % % @item within a multitable starts a normal row. % We use \def instead of \let so that if one of the multitable entries % contains an @itemize, we don't choke on the \item (seen as \crcr aka % \endtemplate) expanding \doitemize. \def\item{\crcr}% % \tolerance=9500 \hbadness=9500 \setmultitablespacing \parskip=\multitableparskip \parindent=\multitableparindent \overfullrule=0pt \global\colcount=0 % \everycr = {% \noalign{% \global\everytab={}% \global\colcount=0 % Reset the column counter. % Check for saved footnotes, etc. \checkinserts % Keeps underfull box messages off when table breaks over pages. %\filbreak % Maybe so, but it also creates really weird page breaks when the % table breaks over pages. Wouldn't \vfil be better? Wait until the % problem manifests itself, so it can be fixed for real --karl. }% }% % \parsearg\domultitable } \def\domultitable#1{% % To parse everything between @multitable and @item: \setuptable#1 \endsetuptable % % This preamble sets up a generic column definition, which will % be used as many times as user calls for columns. % \vtop will set a single line and will also let text wrap and % continue for many paragraphs if desired. \halign\bgroup &% \global\advance\colcount by 1 \multistrut \vtop{% % Use the current \colcount to find the correct column width: \hsize=\expandafter\csname col\the\colcount\endcsname % % In order to keep entries from bumping into each other % we will add a \leftskip of \multitablecolspace to all columns after % the first one. % % If a template has been used, we will add \multitablecolspace % to the width of each template entry. % % If the user has set preamble in terms of percent of \hsize we will % use that dimension as the width of the column, and the \leftskip % will keep entries from bumping into each other. Table will start at % left margin and final column will justify at right margin. % % Make sure we don't inherit \rightskip from the outer environment. \rightskip=0pt \ifnum\colcount=1 % The first column will be indented with the surrounding text. \advance\hsize by\leftskip \else \ifsetpercent \else % If user has not set preamble in terms of percent of \hsize % we will advance \hsize by \multitablecolspace. \advance\hsize by \multitablecolspace \fi % In either case we will make \leftskip=\multitablecolspace: \leftskip=\multitablecolspace \fi % Ignoring space at the beginning and end avoids an occasional spurious % blank line, when TeX decides to break the line at the space before the % box from the multistrut, so the strut ends up on a line by itself. % For example: % @multitable @columnfractions .11 .89 % @item @code{#} % @tab Legal holiday which is valid in major parts of the whole country. % Is automatically provided with highlighting sequences respectively % marking characters. \noindent\ignorespaces##\unskip\multistrut }\cr } \def\Emultitable{% \crcr \egroup % end the \halign \global\setpercentfalse } \def\setmultitablespacing{% \def\multistrut{\strut}% just use the standard line spacing % % Compute \multitablelinespace (if not defined by user) for use in % \multitableparskip calculation. We used define \multistrut based on % this, but (ironically) that caused the spacing to be off. % See bug-texinfo report from Werner Lemberg, 31 Oct 2004 12:52:20 +0100. \ifdim\multitablelinespace=0pt \setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip \global\advance\multitablelinespace by-\ht0 \fi %% Test to see if parskip is larger than space between lines of %% table. If not, do nothing. %% If so, set to same dimension as multitablelinespace. \ifdim\multitableparskip>\multitablelinespace \global\multitableparskip=\multitablelinespace \global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller %% than skip between lines in the table. \fi% \ifdim\multitableparskip=0pt \global\multitableparskip=\multitablelinespace \global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller %% than skip between lines in the table. \fi} \message{conditionals,} % @iftex, @ifnotdocbook, @ifnothtml, @ifnotinfo, @ifnotplaintext, % @ifnotxml always succeed. They currently do nothing; we don't % attempt to check whether the conditionals are properly nested. But we % have to remember that they are conditionals, so that @end doesn't % attempt to close an environment group. % \def\makecond#1{% \expandafter\let\csname #1\endcsname = \relax \expandafter\let\csname iscond.#1\endcsname = 1 } \makecond{iftex} \makecond{ifnotdocbook} \makecond{ifnothtml} \makecond{ifnotinfo} \makecond{ifnotplaintext} \makecond{ifnotxml} % Ignore @ignore, @ifhtml, @ifinfo, and the like. % \def\direntry{\doignore{direntry}} \def\documentdescription{\doignore{documentdescription}} \def\docbook{\doignore{docbook}} \def\html{\doignore{html}} \def\ifdocbook{\doignore{ifdocbook}} \def\ifhtml{\doignore{ifhtml}} \def\ifinfo{\doignore{ifinfo}} \def\ifnottex{\doignore{ifnottex}} \def\ifplaintext{\doignore{ifplaintext}} \def\ifxml{\doignore{ifxml}} \def\ignore{\doignore{ignore}} \def\menu{\doignore{menu}} \def\xml{\doignore{xml}} % Ignore text until a line `@end #1', keeping track of nested conditionals. % % A count to remember the depth of nesting. \newcount\doignorecount \def\doignore#1{\begingroup % Scan in ``verbatim'' mode: \obeylines \catcode`\@ = \other \catcode`\{ = \other \catcode`\} = \other % % Make sure that spaces turn into tokens that match what \doignoretext wants. \spaceisspace % % Count number of #1's that we've seen. \doignorecount = 0 % % Swallow text until we reach the matching `@end #1'. \dodoignore{#1}% } { \catcode`_=11 % We want to use \_STOP_ which cannot appear in texinfo source. \obeylines % % \gdef\dodoignore#1{% % #1 contains the command name as a string, e.g., `ifinfo'. % % Define a command to find the next `@end #1'. \long\def\doignoretext##1^^M@end #1{% \doignoretextyyy##1^^M@#1\_STOP_}% % % And this command to find another #1 command, at the beginning of a % line. (Otherwise, we would consider a line `@c @ifset', for % example, to count as an @ifset for nesting.) \long\def\doignoretextyyy##1^^M@#1##2\_STOP_{\doignoreyyy{##2}\_STOP_}% % % And now expand that command. \doignoretext ^^M% }% } \def\doignoreyyy#1{% \def\temp{#1}% \ifx\temp\empty % Nothing found. \let\next\doignoretextzzz \else % Found a nested condition, ... \advance\doignorecount by 1 \let\next\doignoretextyyy % ..., look for another. % If we're here, #1 ends with ^^M\ifinfo (for example). \fi \next #1% the token \_STOP_ is present just after this macro. } % We have to swallow the remaining "\_STOP_". % \def\doignoretextzzz#1{% \ifnum\doignorecount = 0 % We have just found the outermost @end. \let\next\enddoignore \else % Still inside a nested condition. \advance\doignorecount by -1 \let\next\doignoretext % Look for the next @end. \fi \next } % Finish off ignored text. { \obeylines% % Ignore anything after the last `@end #1'; this matters in verbatim % environments, where otherwise the newline after an ignored conditional % would result in a blank line in the output. \gdef\enddoignore#1^^M{\endgroup\ignorespaces}% } % @set VAR sets the variable VAR to an empty value. % @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE. % % Since we want to separate VAR from REST-OF-LINE (which might be % empty), we can't just use \parsearg; we have to insert a space of our % own to delimit the rest of the line, and then take it out again if we % didn't need it. % We rely on the fact that \parsearg sets \catcode`\ =10. % \parseargdef\set{\setyyy#1 \endsetyyy} \def\setyyy#1 #2\endsetyyy{% {% \makevalueexpandable \def\temp{#2}% \edef\next{\gdef\makecsname{SET#1}}% \ifx\temp\empty \next{}% \else \setzzz#2\endsetzzz \fi }% } % Remove the trailing space \setxxx inserted. \def\setzzz#1 \endsetzzz{\next{#1}} % @clear VAR clears (i.e., unsets) the variable VAR. % \parseargdef\clear{% {% \makevalueexpandable \global\expandafter\let\csname SET#1\endcsname=\relax }% } % @value{foo} gets the text saved in variable foo. \def\value{\begingroup\makevalueexpandable\valuexxx} \def\valuexxx#1{\expandablevalue{#1}\endgroup} { \catcode`\- = \active \catcode`\_ = \active % \gdef\makevalueexpandable{% \let\value = \expandablevalue % We don't want these characters active, ... \catcode`\-=\other \catcode`\_=\other % ..., but we might end up with active ones in the argument if % we're called from @code, as @code{@value{foo-bar_}}, though. % So \let them to their normal equivalents. \let-\realdash \let_\normalunderscore } } % We have this subroutine so that we can handle at least some @value's % properly in indexes (we call \makevalueexpandable in \indexdummies). % The command has to be fully expandable (if the variable is set), since % the result winds up in the index file. This means that if the % variable's value contains other Texinfo commands, it's almost certain % it will fail (although perhaps we could fix that with sufficient work % to do a one-level expansion on the result, instead of complete). % \def\expandablevalue#1{% \expandafter\ifx\csname SET#1\endcsname\relax {[No value for ``#1'']}% \message{Variable `#1', used in @value, is not set.}% \else \csname SET#1\endcsname \fi } % @ifset VAR ... @end ifset reads the `...' iff VAR has been defined % with @set. % % To get special treatment of `@end ifset,' call \makeond and the redefine. % \makecond{ifset} \def\ifset{\parsearg{\doifset{\let\next=\ifsetfail}}} \def\doifset#1#2{% {% \makevalueexpandable \let\next=\empty \expandafter\ifx\csname SET#2\endcsname\relax #1% If not set, redefine \next. \fi \expandafter }\next } \def\ifsetfail{\doignore{ifset}} % @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been % defined with @set, or has been undefined with @clear. % % The `\else' inside the `\doifset' parameter is a trick to reuse the % above code: if the variable is not set, do nothing, if it is set, % then redefine \next to \ifclearfail. % \makecond{ifclear} \def\ifclear{\parsearg{\doifset{\else \let\next=\ifclearfail}}} \def\ifclearfail{\doignore{ifclear}} % @dircategory CATEGORY -- specify a category of the dir file % which this file should belong to. Ignore this in TeX. \let\dircategory=\comment % @defininfoenclose. \let\definfoenclose=\comment \message{indexing,} % Index generation facilities % Define \newwrite to be identical to plain tex's \newwrite % except not \outer, so it can be used within macros and \if's. \edef\newwrite{\makecsname{ptexnewwrite}} % \newindex {foo} defines an index named foo. % It automatically defines \fooindex such that % \fooindex ...rest of line... puts an entry in the index foo. % It also defines \fooindfile to be the number of the output channel for % the file that accumulates this index. The file's extension is foo. % The name of an index should be no more than 2 characters long % for the sake of vms. % \def\newindex#1{% \iflinks \expandafter\newwrite \csname#1indfile\endcsname \openout \csname#1indfile\endcsname \jobname.#1 % Open the file \fi \expandafter\xdef\csname#1index\endcsname{% % Define @#1index \noexpand\doindex{#1}} } % @defindex foo == \newindex{foo} % \def\defindex{\parsearg\newindex} % Define @defcodeindex, like @defindex except put all entries in @code. % \def\defcodeindex{\parsearg\newcodeindex} % \def\newcodeindex#1{% \iflinks \expandafter\newwrite \csname#1indfile\endcsname \openout \csname#1indfile\endcsname \jobname.#1 \fi \expandafter\xdef\csname#1index\endcsname{% \noexpand\docodeindex{#1}}% } % @synindex foo bar makes index foo feed into index bar. % Do this instead of @defindex foo if you don't want it as a separate index. % % @syncodeindex foo bar similar, but put all entries made for index foo % inside @code. % \def\synindex#1 #2 {\dosynindex\doindex{#1}{#2}} \def\syncodeindex#1 #2 {\dosynindex\docodeindex{#1}{#2}} % #1 is \doindex or \docodeindex, #2 the index getting redefined (foo), % #3 the target index (bar). \def\dosynindex#1#2#3{% % Only do \closeout if we haven't already done it, else we'll end up % closing the target index. \expandafter \ifx\csname donesynindex#2\endcsname \undefined % The \closeout helps reduce unnecessary open files; the limit on the % Acorn RISC OS is a mere 16 files. \expandafter\closeout\csname#2indfile\endcsname \expandafter\let\csname\donesynindex#2\endcsname = 1 \fi % redefine \fooindfile: \expandafter\let\expandafter\temp\expandafter=\csname#3indfile\endcsname \expandafter\let\csname#2indfile\endcsname=\temp % redefine \fooindex: \expandafter\xdef\csname#2index\endcsname{\noexpand#1{#3}}% } % Define \doindex, the driver for all \fooindex macros. % Argument #1 is generated by the calling \fooindex macro, % and it is "foo", the name of the index. % \doindex just uses \parsearg; it calls \doind for the actual work. % This is because \doind is more useful to call from other macros. % There is also \dosubind {index}{topic}{subtopic} % which makes an entry in a two-level index such as the operation index. \def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer} \def\singleindexer #1{\doind{\indexname}{#1}} % like the previous two, but they put @code around the argument. \def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer} \def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}} % Take care of Texinfo commands that can appear in an index entry. % Since there are some commands we want to expand, and others we don't, % we have to laboriously prevent expansion for those that we don't. % \def\indexdummies{% \escapechar = `\\ % use backslash in output files. \def\@{@}% change to @@ when we switch to @ as escape char in index files. \def\ {\realbackslash\space }% % % Need these in case \tex is in effect and \{ is a \delimiter again. % But can't use \lbracecmd and \rbracecmd because texindex assumes % braces and backslashes are used only as delimiters. \let\{ = \mylbrace \let\} = \myrbrace % % I don't entirely understand this, but when an index entry is % generated from a macro call, the \endinput which \scanmacro inserts % causes processing to be prematurely terminated. This is, % apparently, because \indexsorttmp is fully expanded, and \endinput % is an expandable command. The redefinition below makes \endinput % disappear altogether for that purpose -- although logging shows that % processing continues to some further point. On the other hand, it % seems \endinput does not hurt in the printed index arg, since that % is still getting written without apparent harm. % % Sample source (mac-idx3.tex, reported by Graham Percival to % help-texinfo, 22may06): % @macro funindex {WORD} % @findex xyz % @end macro % ... % @funindex commtest % % The above is not enough to reproduce the bug, but it gives the flavor. % % Sample whatsit resulting: % .@write3{\entry{xyz}{@folio }{@code {xyz@endinput }}} % % So: \let\endinput = \empty % % Do the redefinitions. \commondummies } % For the aux and toc files, @ is the escape character. So we want to % redefine everything using @ as the escape character (instead of % \realbackslash, still used for index files). When everything uses @, % this will be simpler. % \def\atdummies{% \def\@{@@}% \def\ {@ }% \let\{ = \lbraceatcmd \let\} = \rbraceatcmd % % Do the redefinitions. \commondummies \otherbackslash } % Called from \indexdummies and \atdummies. % \def\commondummies{% % % \definedummyword defines \#1 as \string\#1\space, thus effectively % preventing its expansion. This is used only for control% words, % not control letters, because the \space would be incorrect for % control characters, but is needed to separate the control word % from whatever follows. % % For control letters, we have \definedummyletter, which omits the % space. % % These can be used both for control words that take an argument and % those that do not. If it is followed by {arg} in the input, then % that will dutifully get written to the index (or wherever). % \def\definedummyword ##1{\def##1{\string##1\space}}% \def\definedummyletter##1{\def##1{\string##1}}% \let\definedummyaccent\definedummyletter % \commondummiesnofonts % \definedummyletter\_% % % Non-English letters. \definedummyword\AA \definedummyword\AE \definedummyword\L \definedummyword\OE \definedummyword\O \definedummyword\aa \definedummyword\ae \definedummyword\l \definedummyword\oe \definedummyword\o \definedummyword\ss \definedummyword\exclamdown \definedummyword\questiondown \definedummyword\ordf \definedummyword\ordm % % Although these internal commands shouldn't show up, sometimes they do. \definedummyword\bf \definedummyword\gtr \definedummyword\hat \definedummyword\less \definedummyword\sf \definedummyword\sl \definedummyword\tclose \definedummyword\tt % \definedummyword\LaTeX \definedummyword\TeX % % Assorted special characters. \definedummyword\bullet \definedummyword\comma \definedummyword\copyright \definedummyword\registeredsymbol \definedummyword\dots \definedummyword\enddots \definedummyword\equiv \definedummyword\error \definedummyword\euro \definedummyword\guillemetleft \definedummyword\guillemetright \definedummyword\guilsinglleft \definedummyword\guilsinglright \definedummyword\expansion \definedummyword\minus \definedummyword\pounds \definedummyword\point \definedummyword\print \definedummyword\quotedblbase \definedummyword\quotedblleft \definedummyword\quotedblright \definedummyword\quoteleft \definedummyword\quoteright \definedummyword\quotesinglbase \definedummyword\result \definedummyword\textdegree % % We want to disable all macros so that they are not expanded by \write. \macrolist % \normalturnoffactive % % Handle some cases of @value -- where it does not contain any % (non-fully-expandable) commands. \makevalueexpandable } % \commondummiesnofonts: common to \commondummies and \indexnofonts. % \def\commondummiesnofonts{% % Control letters and accents. \definedummyletter\!% \definedummyaccent\"% \definedummyaccent\'% \definedummyletter\*% \definedummyaccent\,% \definedummyletter\.% \definedummyletter\/% \definedummyletter\:% \definedummyaccent\=% \definedummyletter\?% \definedummyaccent\^% \definedummyaccent\`% \definedummyaccent\~% \definedummyword\u \definedummyword\v \definedummyword\H \definedummyword\dotaccent \definedummyword\ringaccent \definedummyword\tieaccent \definedummyword\ubaraccent \definedummyword\udotaccent \definedummyword\dotless % % Texinfo font commands. \definedummyword\b \definedummyword\i \definedummyword\r \definedummyword\sc \definedummyword\t % % Commands that take arguments. \definedummyword\acronym \definedummyword\cite \definedummyword\code \definedummyword\command \definedummyword\dfn \definedummyword\emph \definedummyword\env \definedummyword\file \definedummyword\kbd \definedummyword\key \definedummyword\math \definedummyword\option \definedummyword\pxref \definedummyword\ref \definedummyword\samp \definedummyword\strong \definedummyword\tie \definedummyword\uref \definedummyword\url \definedummyword\var \definedummyword\verb \definedummyword\w \definedummyword\xref } % \indexnofonts is used when outputting the strings to sort the index % by, and when constructing control sequence names. It eliminates all % control sequences and just writes whatever the best ASCII sort string % would be for a given command (usually its argument). % \def\indexnofonts{% % Accent commands should become @asis. \def\definedummyaccent##1{\let##1\asis}% % We can just ignore other control letters. \def\definedummyletter##1{\let##1\empty}% % Hopefully, all control words can become @asis. \let\definedummyword\definedummyaccent % \commondummiesnofonts % % Don't no-op \tt, since it isn't a user-level command % and is used in the definitions of the active chars like <, >, |, etc. % Likewise with the other plain tex font commands. %\let\tt=\asis % \def\ { }% \def\@{@}% % how to handle braces? \def\_{\normalunderscore}% % % Non-English letters. \def\AA{AA}% \def\AE{AE}% \def\L{L}% \def\OE{OE}% \def\O{O}% \def\aa{aa}% \def\ae{ae}% \def\l{l}% \def\oe{oe}% \def\o{o}% \def\ss{ss}% \def\exclamdown{!}% \def\questiondown{?}% \def\ordf{a}% \def\ordm{o}% % \def\LaTeX{LaTeX}% \def\TeX{TeX}% % % Assorted special characters. % (The following {} will end up in the sort string, but that's ok.) \def\bullet{bullet}% \def\comma{,}% \def\copyright{copyright}% \def\registeredsymbol{R}% \def\dots{...}% \def\enddots{...}% \def\equiv{==}% \def\error{error}% \def\euro{euro}% \def\guillemetleft{<<}% \def\guillemetright{>>}% \def\guilsinglleft{<}% \def\guilsinglright{>}% \def\expansion{==>}% \def\minus{-}% \def\pounds{pounds}% \def\point{.}% \def\print{-|}% \def\quotedblbase{"}% \def\quotedblleft{"}% \def\quotedblright{"}% \def\quoteleft{`}% \def\quoteright{'}% \def\quotesinglbase{,}% \def\result{=>}% \def\textdegree{degrees}% % % We need to get rid of all macros, leaving only the arguments (if present). % Of course this is not nearly correct, but it is the best we can do for now. % makeinfo does not expand macros in the argument to @deffn, which ends up % writing an index entry, and texindex isn't prepared for an index sort entry % that starts with \. % % Since macro invocations are followed by braces, we can just redefine them % to take a single TeX argument. The case of a macro invocation that % goes to end-of-line is not handled. % \macrolist } \let\indexbackslash=0 %overridden during \printindex. \let\SETmarginindex=\relax % put index entries in margin (undocumented)? % Most index entries go through here, but \dosubind is the general case. % #1 is the index name, #2 is the entry text. \def\doind#1#2{\dosubind{#1}{#2}{}} % Workhorse for all \fooindexes. % #1 is name of index, #2 is stuff to put there, #3 is subentry -- % empty if called from \doind, as we usually are (the main exception % is with most defuns, which call us directly). % \def\dosubind#1#2#3{% \iflinks {% % Store the main index entry text (including the third arg). \toks0 = {#2}% % If third arg is present, precede it with a space. \def\thirdarg{#3}% \ifx\thirdarg\empty \else \toks0 = \expandafter{\the\toks0 \space #3}% \fi % \edef\writeto{\csname#1indfile\endcsname}% % \safewhatsit\dosubindwrite }% \fi } % Write the entry in \toks0 to the index file: % \def\dosubindwrite{% % Put the index entry in the margin if desired. \ifx\SETmarginindex\relax\else \insert\margin{\hbox{\vrule height8pt depth3pt width0pt \the\toks0}}% \fi % % Remember, we are within a group. \indexdummies % Must do this here, since \bf, etc expand at this stage \def\backslashcurfont{\indexbackslash}% \indexbackslash isn't defined now % so it will be output as is; and it will print as backslash. % % Process the index entry with all font commands turned off, to % get the string to sort by. {\indexnofonts \edef\temp{\the\toks0}% need full expansion \xdef\indexsorttmp{\temp}% }% % % Set up the complete index entry, with both the sort key and % the original text, including any font commands. We write % three arguments to \entry to the .?? file (four in the % subentry case), texindex reduces to two when writing the .??s % sorted result. \edef\temp{% \write\writeto{% \string\entry{\indexsorttmp}{\noexpand\folio}{\the\toks0}}% }% \temp } % Take care of unwanted page breaks/skips around a whatsit: % % If a skip is the last thing on the list now, preserve it % by backing up by \lastskip, doing the \write, then inserting % the skip again. Otherwise, the whatsit generated by the % \write or \pdfdest will make \lastskip zero. The result is that % sequences like this: % @end defun % @tindex whatever % @defun ... % will have extra space inserted, because the \medbreak in the % start of the @defun won't see the skip inserted by the @end of % the previous defun. % % But don't do any of this if we're not in vertical mode. We % don't want to do a \vskip and prematurely end a paragraph. % % Avoid page breaks due to these extra skips, too. % % But wait, there is a catch there: % We'll have to check whether \lastskip is zero skip. \ifdim is not % sufficient for this purpose, as it ignores stretch and shrink parts % of the skip. The only way seems to be to check the textual % representation of the skip. % % The following is almost like \def\zeroskipmacro{0.0pt} except that % the ``p'' and ``t'' characters have catcode \other, not 11 (letter). % \edef\zeroskipmacro{\expandafter\the\csname z@skip\endcsname} % \newskip\whatsitskip \newcount\whatsitpenalty % % ..., ready, GO: % \def\safewhatsit#1{% \ifhmode #1% \else % \lastskip and \lastpenalty cannot both be nonzero simultaneously. \whatsitskip = \lastskip \edef\lastskipmacro{\the\lastskip}% \whatsitpenalty = \lastpenalty % % If \lastskip is nonzero, that means the last item was a % skip. And since a skip is discardable, that means this % -\whatsitskip glue we're inserting is preceded by a % non-discardable item, therefore it is not a potential % breakpoint, therefore no \nobreak needed. \ifx\lastskipmacro\zeroskipmacro \else \vskip-\whatsitskip \fi % #1% % \ifx\lastskipmacro\zeroskipmacro % If \lastskip was zero, perhaps the last item was a penalty, and % perhaps it was >=10000, e.g., a \nobreak. In that case, we want % to re-insert the same penalty (values >10000 are used for various % signals); since we just inserted a non-discardable item, any % following glue (such as a \parskip) would be a breakpoint. For example: % % @deffn deffn-whatever % @vindex index-whatever % Description. % would allow a break between the index-whatever whatsit % and the "Description." paragraph. \ifnum\whatsitpenalty>9999 \penalty\whatsitpenalty \fi \else % On the other hand, if we had a nonzero \lastskip, % this make-up glue would be preceded by a non-discardable item % (the whatsit from the \write), so we must insert a \nobreak. \nobreak\vskip\whatsitskip \fi \fi } % The index entry written in the file actually looks like % \entry {sortstring}{page}{topic} % or % \entry {sortstring}{page}{topic}{subtopic} % The texindex program reads in these files and writes files % containing these kinds of lines: % \initial {c} % before the first topic whose initial is c % \entry {topic}{pagelist} % for a topic that is used without subtopics % \primary {topic} % for the beginning of a topic that is used with subtopics % \secondary {subtopic}{pagelist} % for each subtopic. % Define the user-accessible indexing commands % @findex, @vindex, @kindex, @cindex. \def\findex {\fnindex} \def\kindex {\kyindex} \def\cindex {\cpindex} \def\vindex {\vrindex} \def\tindex {\tpindex} \def\pindex {\pgindex} \def\cindexsub {\begingroup\obeylines\cindexsub} {\obeylines % \gdef\cindexsub "#1" #2^^M{\endgroup % \dosubind{cp}{#2}{#1}}} % Define the macros used in formatting output of the sorted index material. % @printindex causes a particular index (the ??s file) to get printed. % It does not print any chapter heading (usually an @unnumbered). % \parseargdef\printindex{\begingroup \dobreak \chapheadingskip{10000}% % \smallfonts \rm \tolerance = 9500 \plainfrenchspacing \everypar = {}% don't want the \kern\-parindent from indentation suppression. % % See if the index file exists and is nonempty. % Change catcode of @ here so that if the index file contains % \initial {@} % as its first line, TeX doesn't complain about mismatched braces % (because it thinks @} is a control sequence). \catcode`\@ = 11 \openin 1 \jobname.#1s \ifeof 1 % \enddoublecolumns gets confused if there is no text in the index, % and it loses the chapter title and the aux file entries for the % index. The easiest way to prevent this problem is to make sure % there is some text. \putwordIndexNonexistent \else % % If the index file exists but is empty, then \openin leaves \ifeof % false. We have to make TeX try to read something from the file, so % it can discover if there is anything in it. \read 1 to \temp \ifeof 1 \putwordIndexIsEmpty \else % Index files are almost Texinfo source, but we use \ as the escape % character. It would be better to use @, but that's too big a change % to make right now. \def\indexbackslash{\backslashcurfont}% \catcode`\\ = 0 \escapechar = `\\ \begindoublecolumns \input \jobname.#1s \enddoublecolumns \fi \fi \closein 1 \endgroup} % These macros are used by the sorted index file itself. % Change them to control the appearance of the index. \def\initial#1{{% % Some minor font changes for the special characters. \let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt % % Remove any glue we may have, we'll be inserting our own. \removelastskip % % We like breaks before the index initials, so insert a bonus. \nobreak \vskip 0pt plus 3\baselineskip \penalty 0 \vskip 0pt plus -3\baselineskip % % Typeset the initial. Making this add up to a whole number of % baselineskips increases the chance of the dots lining up from column % to column. It still won't often be perfect, because of the stretch % we need before each entry, but it's better. % % No shrink because it confuses \balancecolumns. \vskip 1.67\baselineskip plus .5\baselineskip \leftline{\secbf #1}% % Do our best not to break after the initial. \nobreak \vskip .33\baselineskip plus .1\baselineskip }} % \entry typesets a paragraph consisting of the text (#1), dot leaders, and % then page number (#2) flushed to the right margin. It is used for index % and table of contents entries. The paragraph is indented by \leftskip. % % A straightforward implementation would start like this: % \def\entry#1#2{... % But this frozes the catcodes in the argument, and can cause problems to % @code, which sets - active. This problem was fixed by a kludge--- % ``-'' was active throughout whole index, but this isn't really right. % % The right solution is to prevent \entry from swallowing the whole text. % --kasal, 21nov03 \def\entry{% \begingroup % % Start a new paragraph if necessary, so our assignments below can't % affect previous text. \par % % Do not fill out the last line with white space. \parfillskip = 0in % % No extra space above this paragraph. \parskip = 0in % % Do not prefer a separate line ending with a hyphen to fewer lines. \finalhyphendemerits = 0 % % \hangindent is only relevant when the entry text and page number % don't both fit on one line. In that case, bob suggests starting the % dots pretty far over on the line. Unfortunately, a large % indentation looks wrong when the entry text itself is broken across % lines. So we use a small indentation and put up with long leaders. % % \hangafter is reset to 1 (which is the value we want) at the start % of each paragraph, so we need not do anything with that. \hangindent = 2em % % When the entry text needs to be broken, just fill out the first line % with blank space. \rightskip = 0pt plus1fil % % A bit of stretch before each entry for the benefit of balancing % columns. \vskip 0pt plus1pt % % Swallow the left brace of the text (first parameter): \afterassignment\doentry \let\temp = } \def\doentry{% \bgroup % Instead of the swallowed brace. \noindent \aftergroup\finishentry % And now comes the text of the entry. } \def\finishentry#1{% % #1 is the page number. % % The following is kludged to not output a line of dots in the index if % there are no page numbers. The next person who breaks this will be % cursed by a Unix daemon. \setbox\boxA = \hbox{#1}% \ifdim\wd\boxA = 0pt \ % \else % % If we must, put the page number on a line of its own, and fill out % this line with blank space. (The \hfil is overwhelmed with the % fill leaders glue in \indexdotfill if the page number does fit.) \hfil\penalty50 \null\nobreak\indexdotfill % Have leaders before the page number. % % The `\ ' here is removed by the implicit \unskip that TeX does as % part of (the primitive) \par. Without it, a spurious underfull % \hbox ensues. \ifpdf \pdfgettoks#1.% \ \the\toksA \else \ #1% \fi \fi \par \endgroup } % Like plain.tex's \dotfill, except uses up at least 1 em. \def\indexdotfill{\cleaders \hbox{$\mathsurround=0pt \mkern1.5mu.\mkern1.5mu$}\hskip 1em plus 1fill} \def\primary #1{\line{#1\hfil}} \newskip\secondaryindent \secondaryindent=0.5cm \def\secondary#1#2{{% \parfillskip=0in \parskip=0in \hangindent=1in \hangafter=1 \noindent\hskip\secondaryindent\hbox{#1}\indexdotfill \ifpdf \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph. \else #2 \fi \par }} % Define two-column mode, which we use to typeset indexes. % Adapted from the TeXbook, page 416, which is to say, % the manmac.tex format used to print the TeXbook itself. \catcode`\@=11 \newbox\partialpage \newdimen\doublecolumnhsize \def\begindoublecolumns{\begingroup % ended by \enddoublecolumns % Grab any single-column material above us. \output = {% % % Here is a possibility not foreseen in manmac: if we accumulate a % whole lot of material, we might end up calling this \output % routine twice in a row (see the doublecol-lose test, which is % essentially a couple of indexes with @setchapternewpage off). In % that case we just ship out what is in \partialpage with the normal % output routine. Generally, \partialpage will be empty when this % runs and this will be a no-op. See the indexspread.tex test case. \ifvoid\partialpage \else \onepageout{\pagecontents\partialpage}% \fi % \global\setbox\partialpage = \vbox{% % Unvbox the main output page. \unvbox\PAGE \kern-\topskip \kern\baselineskip }% }% \eject % run that output routine to set \partialpage % % Use the double-column output routine for subsequent pages. \output = {\doublecolumnout}% % % Change the page size parameters. We could do this once outside this % routine, in each of @smallbook, @afourpaper, and the default 8.5x11 % format, but then we repeat the same computation. Repeating a couple % of assignments once per index is clearly meaningless for the % execution time, so we may as well do it in one place. % % First we halve the line length, less a little for the gutter between % the columns. We compute the gutter based on the line length, so it % changes automatically with the paper format. The magic constant % below is chosen so that the gutter has the same value (well, +-<1pt) % as it did when we hard-coded it. % % We put the result in a separate register, \doublecolumhsize, so we % can restore it in \pagesofar, after \hsize itself has (potentially) % been clobbered. % \doublecolumnhsize = \hsize \advance\doublecolumnhsize by -.04154\hsize \divide\doublecolumnhsize by 2 \hsize = \doublecolumnhsize % % Double the \vsize as well. (We don't need a separate register here, % since nobody clobbers \vsize.) \vsize = 2\vsize } % The double-column output routine for all double-column pages except % the last. % \def\doublecolumnout{% \splittopskip=\topskip \splitmaxdepth=\maxdepth % Get the available space for the double columns -- the normal % (undoubled) page height minus any material left over from the % previous page. \dimen@ = \vsize \divide\dimen@ by 2 \advance\dimen@ by -\ht\partialpage % % box0 will be the left-hand column, box2 the right. \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@ \onepageout\pagesofar \unvbox255 \penalty\outputpenalty } % % Re-output the contents of the output page -- any previous material, % followed by the two boxes we just split, in box0 and box2. \def\pagesofar{% \unvbox\partialpage % \hsize = \doublecolumnhsize \wd0=\hsize \wd2=\hsize \hbox to\pagewidth{\box0\hfil\box2}% } % % All done with double columns. \def\enddoublecolumns{% % The following penalty ensures that the page builder is exercised % _before_ we change the output routine. This is necessary in the % following situation: % % The last section of the index consists only of a single entry. % Before this section, \pagetotal is less than \pagegoal, so no % break occurs before the last section starts. However, the last % section, consisting of \initial and the single \entry, does not % fit on the page and has to be broken off. Without the following % penalty the page builder will not be exercised until \eject % below, and by that time we'll already have changed the output % routine to the \balancecolumns version, so the next-to-last % double-column page will be processed with \balancecolumns, which % is wrong: The two columns will go to the main vertical list, with % the broken-off section in the recent contributions. As soon as % the output routine finishes, TeX starts reconsidering the page % break. The two columns and the broken-off section both fit on the % page, because the two columns now take up only half of the page % goal. When TeX sees \eject from below which follows the final % section, it invokes the new output routine that we've set after % \balancecolumns below; \onepageout will try to fit the two columns % and the final section into the vbox of \pageheight (see % \pagebody), causing an overfull box. % % Note that glue won't work here, because glue does not exercise the % page builder, unlike penalties (see The TeXbook, pp. 280-281). \penalty0 % \output = {% % Split the last of the double-column material. Leave it on the % current page, no automatic page break. \balancecolumns % % If we end up splitting too much material for the current page, % though, there will be another page break right after this \output % invocation ends. Having called \balancecolumns once, we do not % want to call it again. Therefore, reset \output to its normal % definition right away. (We hope \balancecolumns will never be % called on to balance too much material, but if it is, this makes % the output somewhat more palatable.) \global\output = {\onepageout{\pagecontents\PAGE}}% }% \eject \endgroup % started in \begindoublecolumns % % \pagegoal was set to the doubled \vsize above, since we restarted % the current page. We're now back to normal single-column % typesetting, so reset \pagegoal to the normal \vsize (after the % \endgroup where \vsize got restored). \pagegoal = \vsize } % % Called at the end of the double column material. \def\balancecolumns{% \setbox0 = \vbox{\unvbox255}% like \box255 but more efficient, see p.120. \dimen@ = \ht0 \advance\dimen@ by \topskip \advance\dimen@ by-\baselineskip \divide\dimen@ by 2 % target to split to %debug\message{final 2-column material height=\the\ht0, target=\the\dimen@.}% \splittopskip = \topskip % Loop until we get a decent breakpoint. {% \vbadness = 10000 \loop \global\setbox3 = \copy0 \global\setbox1 = \vsplit3 to \dimen@ \ifdim\ht3>\dimen@ \global\advance\dimen@ by 1pt \repeat }% %debug\message{split to \the\dimen@, column heights: \the\ht1, \the\ht3.}% \setbox0=\vbox to\dimen@{\unvbox1}% \setbox2=\vbox to\dimen@{\unvbox3}% % \pagesofar } \catcode`\@ = \other \message{sectioning,} % Chapters, sections, etc. % \unnumberedno is an oxymoron, of course. But we count the unnumbered % sections so that we can refer to them unambiguously in the pdf % outlines by their "section number". We avoid collisions with chapter % numbers by starting them at 10000. (If a document ever has 10000 % chapters, we're in trouble anyway, I'm sure.) \newcount\unnumberedno \unnumberedno = 10000 \newcount\chapno \newcount\secno \secno=0 \newcount\subsecno \subsecno=0 \newcount\subsubsecno \subsubsecno=0 % This counter is funny since it counts through charcodes of letters A, B, ... \newcount\appendixno \appendixno = `\@ % % \def\appendixletter{\char\the\appendixno} % We do the following ugly conditional instead of the above simple % construct for the sake of pdftex, which needs the actual % letter in the expansion, not just typeset. % \def\appendixletter{% \ifnum\appendixno=`A A% \else\ifnum\appendixno=`B B% \else\ifnum\appendixno=`C C% \else\ifnum\appendixno=`D D% \else\ifnum\appendixno=`E E% \else\ifnum\appendixno=`F F% \else\ifnum\appendixno=`G G% \else\ifnum\appendixno=`H H% \else\ifnum\appendixno=`I I% \else\ifnum\appendixno=`J J% \else\ifnum\appendixno=`K K% \else\ifnum\appendixno=`L L% \else\ifnum\appendixno=`M M% \else\ifnum\appendixno=`N N% \else\ifnum\appendixno=`O O% \else\ifnum\appendixno=`P P% \else\ifnum\appendixno=`Q Q% \else\ifnum\appendixno=`R R% \else\ifnum\appendixno=`S S% \else\ifnum\appendixno=`T T% \else\ifnum\appendixno=`U U% \else\ifnum\appendixno=`V V% \else\ifnum\appendixno=`W W% \else\ifnum\appendixno=`X X% \else\ifnum\appendixno=`Y Y% \else\ifnum\appendixno=`Z Z% % The \the is necessary, despite appearances, because \appendixletter is % expanded while writing the .toc file. \char\appendixno is not % expandable, thus it is written literally, thus all appendixes come out % with the same letter (or @) in the toc without it. \else\char\the\appendixno \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi} % Each @chapter defines these (using marks) as the number+name, number % and name of the chapter. Page headings and footings can use % these. @section does likewise. \def\thischapter{} \def\thischapternum{} \def\thischaptername{} \def\thissection{} \def\thissectionnum{} \def\thissectionname{} \newcount\absseclevel % used to calculate proper heading level \newcount\secbase\secbase=0 % @raisesections/@lowersections modify this count % @raisesections: treat @section as chapter, @subsection as section, etc. \def\raisesections{\global\advance\secbase by -1} \let\up=\raisesections % original BFox name % @lowersections: treat @chapter as section, @section as subsection, etc. \def\lowersections{\global\advance\secbase by 1} \let\down=\lowersections % original BFox name % we only have subsub. \chardef\maxseclevel = 3 % % A numbered section within an unnumbered changes to unnumbered too. % To achive this, remember the "biggest" unnum. sec. we are currently in: \chardef\unmlevel = \maxseclevel % % Trace whether the current chapter is an appendix or not: % \chapheadtype is "N" or "A", unnumbered chapters are ignored. \def\chapheadtype{N} % Choose a heading macro % #1 is heading type % #2 is heading level % #3 is text for heading \def\genhead#1#2#3{% % Compute the abs. sec. level: \absseclevel=#2 \advance\absseclevel by \secbase % Make sure \absseclevel doesn't fall outside the range: \ifnum \absseclevel < 0 \absseclevel = 0 \else \ifnum \absseclevel > 3 \absseclevel = 3 \fi \fi % The heading type: \def\headtype{#1}% \if \headtype U% \ifnum \absseclevel < \unmlevel \chardef\unmlevel = \absseclevel \fi \else % Check for appendix sections: \ifnum \absseclevel = 0 \edef\chapheadtype{\headtype}% \else \if \headtype A\if \chapheadtype N% \errmessage{@appendix... within a non-appendix chapter}% \fi\fi \fi % Check for numbered within unnumbered: \ifnum \absseclevel > \unmlevel \def\headtype{U}% \else \chardef\unmlevel = 3 \fi \fi % Now print the heading: \if \headtype U% \ifcase\absseclevel \unnumberedzzz{#3}% \or \unnumberedseczzz{#3}% \or \unnumberedsubseczzz{#3}% \or \unnumberedsubsubseczzz{#3}% \fi \else \if \headtype A% \ifcase\absseclevel \appendixzzz{#3}% \or \appendixsectionzzz{#3}% \or \appendixsubseczzz{#3}% \or \appendixsubsubseczzz{#3}% \fi \else \ifcase\absseclevel \chapterzzz{#3}% \or \seczzz{#3}% \or \numberedsubseczzz{#3}% \or \numberedsubsubseczzz{#3}% \fi \fi \fi \suppressfirstparagraphindent } % an interface: \def\numhead{\genhead N} \def\apphead{\genhead A} \def\unnmhead{\genhead U} % @chapter, @appendix, @unnumbered. Increment top-level counter, reset % all lower-level sectioning counters to zero. % % Also set \chaplevelprefix, which we prepend to @float sequence numbers % (e.g., figures), q.v. By default (before any chapter), that is empty. \let\chaplevelprefix = \empty % \outer\parseargdef\chapter{\numhead0{#1}} % normally numhead0 calls chapterzzz \def\chapterzzz#1{% % section resetting is \global in case the chapter is in a group, such % as an @include file. \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 \global\advance\chapno by 1 % % Used for \float. \gdef\chaplevelprefix{\the\chapno.}% \resetallfloatnos % \message{\putwordChapter\space \the\chapno}% % % Write the actual heading. \chapmacro{#1}{Ynumbered}{\the\chapno}% % % So @section and the like are numbered underneath this chapter. \global\let\section = \numberedsec \global\let\subsection = \numberedsubsec \global\let\subsubsection = \numberedsubsubsec } \outer\parseargdef\appendix{\apphead0{#1}} % normally apphead0 calls appendixzzz \def\appendixzzz#1{% \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 \global\advance\appendixno by 1 \gdef\chaplevelprefix{\appendixletter.}% \resetallfloatnos % \def\appendixnum{\putwordAppendix\space \appendixletter}% \message{\appendixnum}% % \chapmacro{#1}{Yappendix}{\appendixletter}% % \global\let\section = \appendixsec \global\let\subsection = \appendixsubsec \global\let\subsubsection = \appendixsubsubsec } \outer\parseargdef\unnumbered{\unnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz \def\unnumberedzzz#1{% \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 \global\advance\unnumberedno by 1 % % Since an unnumbered has no number, no prefix for figures. \global\let\chaplevelprefix = \empty \resetallfloatnos % % This used to be simply \message{#1}, but TeX fully expands the % argument to \message. Therefore, if #1 contained @-commands, TeX % expanded them. For example, in `@unnumbered The @cite{Book}', TeX % expanded @cite (which turns out to cause errors because \cite is meant % to be executed, not expanded). % % Anyway, we don't want the fully-expanded definition of @cite to appear % as a result of the \message, we just want `@cite' itself. We use % \the to achieve this: TeX expands \the only once, % simply yielding the contents of . (We also do this for % the toc entries.) \toks0 = {#1}% \message{(\the\toks0)}% % \chapmacro{#1}{Ynothing}{\the\unnumberedno}% % \global\let\section = \unnumberedsec \global\let\subsection = \unnumberedsubsec \global\let\subsubsection = \unnumberedsubsubsec } % @centerchap is like @unnumbered, but the heading is centered. \outer\parseargdef\centerchap{% % Well, we could do the following in a group, but that would break % an assumption that \chapmacro is called at the outermost level. % Thus we are safer this way: --kasal, 24feb04 \let\centerparametersmaybe = \centerparameters \unnmhead0{#1}% \let\centerparametersmaybe = \relax } % @top is like @unnumbered. \let\top\unnumbered % Sections. \outer\parseargdef\numberedsec{\numhead1{#1}} % normally calls seczzz \def\seczzz#1{% \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 \sectionheading{#1}{sec}{Ynumbered}{\the\chapno.\the\secno}% } \outer\parseargdef\appendixsection{\apphead1{#1}} % normally calls appendixsectionzzz \def\appendixsectionzzz#1{% \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 \sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}% } \let\appendixsec\appendixsection \outer\parseargdef\unnumberedsec{\unnmhead1{#1}} % normally calls unnumberedseczzz \def\unnumberedseczzz#1{% \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}% } % Subsections. \outer\parseargdef\numberedsubsec{\numhead2{#1}} % normally calls numberedsubseczzz \def\numberedsubseczzz#1{% \global\subsubsecno=0 \global\advance\subsecno by 1 \sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}% } \outer\parseargdef\appendixsubsec{\apphead2{#1}} % normally calls appendixsubseczzz \def\appendixsubseczzz#1{% \global\subsubsecno=0 \global\advance\subsecno by 1 \sectionheading{#1}{subsec}{Yappendix}% {\appendixletter.\the\secno.\the\subsecno}% } \outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}} %normally calls unnumberedsubseczzz \def\unnumberedsubseczzz#1{% \global\subsubsecno=0 \global\advance\subsecno by 1 \sectionheading{#1}{subsec}{Ynothing}% {\the\unnumberedno.\the\secno.\the\subsecno}% } % Subsubsections. \outer\parseargdef\numberedsubsubsec{\numhead3{#1}} % normally numberedsubsubseczzz \def\numberedsubsubseczzz#1{% \global\advance\subsubsecno by 1 \sectionheading{#1}{subsubsec}{Ynumbered}% {\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}% } \outer\parseargdef\appendixsubsubsec{\apphead3{#1}} % normally appendixsubsubseczzz \def\appendixsubsubseczzz#1{% \global\advance\subsubsecno by 1 \sectionheading{#1}{subsubsec}{Yappendix}% {\appendixletter.\the\secno.\the\subsecno.\the\subsubsecno}% } \outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}} %normally unnumberedsubsubseczzz \def\unnumberedsubsubseczzz#1{% \global\advance\subsubsecno by 1 \sectionheading{#1}{subsubsec}{Ynothing}% {\the\unnumberedno.\the\secno.\the\subsecno.\the\subsubsecno}% } % These macros control what the section commands do, according % to what kind of chapter we are in (ordinary, appendix, or unnumbered). % Define them by default for a numbered chapter. \let\section = \numberedsec \let\subsection = \numberedsubsec \let\subsubsection = \numberedsubsubsec % Define @majorheading, @heading and @subheading % NOTE on use of \vbox for chapter headings, section headings, and such: % 1) We use \vbox rather than the earlier \line to permit % overlong headings to fold. % 2) \hyphenpenalty is set to 10000 because hyphenation in a % heading is obnoxious; this forbids it. % 3) Likewise, headings look best if no \parindent is used, and % if justification is not attempted. Hence \raggedright. \def\majorheading{% {\advance\chapheadingskip by 10pt \chapbreak }% \parsearg\chapheadingzzz } \def\chapheading{\chapbreak \parsearg\chapheadingzzz} \def\chapheadingzzz#1{% {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 \parindent=0pt\raggedright \rm #1\hfill}}% \bigskip \par\penalty 200\relax \suppressfirstparagraphindent } % @heading, @subheading, @subsubheading. \parseargdef\heading{\sectionheading{#1}{sec}{Yomitfromtoc}{} \suppressfirstparagraphindent} \parseargdef\subheading{\sectionheading{#1}{subsec}{Yomitfromtoc}{} \suppressfirstparagraphindent} \parseargdef\subsubheading{\sectionheading{#1}{subsubsec}{Yomitfromtoc}{} \suppressfirstparagraphindent} % These macros generate a chapter, section, etc. heading only % (including whitespace, linebreaking, etc. around it), % given all the information in convenient, parsed form. %%% Args are the skip and penalty (usually negative) \def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi} %%% Define plain chapter starts, and page on/off switching for it % Parameter controlling skip before chapter headings (if needed) \newskip\chapheadingskip \def\chapbreak{\dobreak \chapheadingskip {-4000}} \def\chappager{\par\vfill\supereject} % Because \domark is called before \chapoddpage, the filler page will % get the headings for the next chapter, which is wrong. But we don't % care -- we just disable all headings on the filler page. \def\chapoddpage{% \chappager \ifodd\pageno \else \begingroup \evenheadline={\hfil}\evenfootline={\hfil}% \oddheadline={\hfil}\oddfootline={\hfil}% \hbox to 0pt{}% \chappager \endgroup \fi } \def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname} \def\CHAPPAGoff{% \global\let\contentsalignmacro = \chappager \global\let\pchapsepmacro=\chapbreak \global\let\pagealignmacro=\chappager} \def\CHAPPAGon{% \global\let\contentsalignmacro = \chappager \global\let\pchapsepmacro=\chappager \global\let\pagealignmacro=\chappager \global\def\HEADINGSon{\HEADINGSsingle}} \def\CHAPPAGodd{% \global\let\contentsalignmacro = \chapoddpage \global\let\pchapsepmacro=\chapoddpage \global\let\pagealignmacro=\chapoddpage \global\def\HEADINGSon{\HEADINGSdouble}} \CHAPPAGon % Chapter opening. % % #1 is the text, #2 is the section type (Ynumbered, Ynothing, % Yappendix, Yomitfromtoc), #3 the chapter number. % % To test against our argument. \def\Ynothingkeyword{Ynothing} \def\Yomitfromtockeyword{Yomitfromtoc} \def\Yappendixkeyword{Yappendix} % \def\chapmacro#1#2#3{% % Insert the first mark before the heading break (see notes for \domark). \let\prevchapterdefs=\lastchapterdefs \let\prevsectiondefs=\lastsectiondefs \gdef\lastsectiondefs{\gdef\thissectionname{}\gdef\thissectionnum{}% \gdef\thissection{}}% % \def\temptype{#2}% \ifx\temptype\Ynothingkeyword \gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}% \gdef\thischapter{\thischaptername}}% \else\ifx\temptype\Yomitfromtockeyword \gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}% \gdef\thischapter{}}% \else\ifx\temptype\Yappendixkeyword \toks0={#1}% \xdef\lastchapterdefs{% \gdef\noexpand\thischaptername{\the\toks0}% \gdef\noexpand\thischapternum{\appendixletter}% \gdef\noexpand\thischapter{\putwordAppendix{} \noexpand\thischapternum: \noexpand\thischaptername}% }% \else \toks0={#1}% \xdef\lastchapterdefs{% \gdef\noexpand\thischaptername{\the\toks0}% \gdef\noexpand\thischapternum{\the\chapno}% \gdef\noexpand\thischapter{\putwordChapter{} \noexpand\thischapternum: \noexpand\thischaptername}% }% \fi\fi\fi % % Output the mark. Pass it through \safewhatsit, to take care of % the preceding space. \safewhatsit\domark % % Insert the chapter heading break. \pchapsepmacro % % Now the second mark, after the heading break. No break points % between here and the heading. \let\prevchapterdefs=\lastchapterdefs \let\prevsectiondefs=\lastsectiondefs \domark % {% \chapfonts \rm % % Have to define \lastsection before calling \donoderef, because the % xref code eventually uses it. On the other hand, it has to be called % after \pchapsepmacro, or the headline will change too soon. \gdef\lastsection{#1}% % % Only insert the separating space if we have a chapter/appendix % number, and don't print the unnumbered ``number''. \ifx\temptype\Ynothingkeyword \setbox0 = \hbox{}% \def\toctype{unnchap}% \else\ifx\temptype\Yomitfromtockeyword \setbox0 = \hbox{}% contents like unnumbered, but no toc entry \def\toctype{omit}% \else\ifx\temptype\Yappendixkeyword \setbox0 = \hbox{\putwordAppendix{} #3\enspace}% \def\toctype{app}% \else \setbox0 = \hbox{#3\enspace}% \def\toctype{numchap}% \fi\fi\fi % % Write the toc entry for this chapter. Must come before the % \donoderef, because we include the current node name in the toc % entry, and \donoderef resets it to empty. \writetocentry{\toctype}{#1}{#3}% % % For pdftex, we have to write out the node definition (aka, make % the pdfdest) after any page break, but before the actual text has % been typeset. If the destination for the pdf outline is after the % text, then jumping from the outline may wind up with the text not % being visible, for instance under high magnification. \donoderef{#2}% % % Typeset the actual heading. \nobreak % Avoid page breaks at the interline glue. \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright \hangindent=\wd0 \centerparametersmaybe \unhbox0 #1\par}% }% \nobreak\bigskip % no page break after a chapter title \nobreak } % @centerchap -- centered and unnumbered. \let\centerparametersmaybe = \relax \def\centerparameters{% \advance\rightskip by 3\rightskip \leftskip = \rightskip \parfillskip = 0pt } % I don't think this chapter style is supported any more, so I'm not % updating it with the new noderef stuff. We'll see. --karl, 11aug03. % \def\setchapterstyle #1 {\csname CHAPF#1\endcsname} % \def\unnchfopen #1{% \chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 \parindent=0pt\raggedright \rm #1\hfill}}\bigskip \par\nobreak } \def\chfopen #1#2{\chapoddpage {\chapfonts \vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}% \par\penalty 5000 % } \def\centerchfopen #1{% \chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 \parindent=0pt \hfill {\rm #1}\hfill}}\bigskip \par\nobreak } \def\CHAPFopen{% \global\let\chapmacro=\chfopen \global\let\centerchapmacro=\centerchfopen} % Section titles. These macros combine the section number parts and % call the generic \sectionheading to do the printing. % \newskip\secheadingskip \def\secheadingbreak{\dobreak \secheadingskip{-1000}} % Subsection titles. \newskip\subsecheadingskip \def\subsecheadingbreak{\dobreak \subsecheadingskip{-500}} % Subsubsection titles. \def\subsubsecheadingskip{\subsecheadingskip} \def\subsubsecheadingbreak{\subsecheadingbreak} % Print any size, any type, section title. % % #1 is the text, #2 is the section level (sec/subsec/subsubsec), #3 is % the section type for xrefs (Ynumbered, Ynothing, Yappendix), #4 is the % section number. % \def\seckeyword{sec} % \def\sectionheading#1#2#3#4{% {% % Switch to the right set of fonts. \csname #2fonts\endcsname \rm % \def\sectionlevel{#2}% \def\temptype{#3}% % % Insert first mark before the heading break (see notes for \domark). \let\prevsectiondefs=\lastsectiondefs \ifx\temptype\Ynothingkeyword \ifx\sectionlevel\seckeyword \gdef\lastsectiondefs{\gdef\thissectionname{#1}\gdef\thissectionnum{}% \gdef\thissection{\thissectionname}}% \fi \else\ifx\temptype\Yomitfromtockeyword % Don't redefine \thissection. \else\ifx\temptype\Yappendixkeyword \ifx\sectionlevel\seckeyword \toks0={#1}% \xdef\lastsectiondefs{% \gdef\noexpand\thissectionname{\the\toks0}% \gdef\noexpand\thissectionnum{#4}% \gdef\noexpand\thissection{\putwordSection{} \noexpand\thissectionnum: \noexpand\thissectionname}% }% \fi \else \ifx\sectionlevel\seckeyword \toks0={#1}% \xdef\lastsectiondefs{% \gdef\noexpand\thissectionname{\the\toks0}% \gdef\noexpand\thissectionnum{#4}% \gdef\noexpand\thissection{\putwordSection{} \noexpand\thissectionnum: \noexpand\thissectionname}% }% \fi \fi\fi\fi % % Output the mark. Pass it through \safewhatsit, to take care of % the preceding space. \safewhatsit\domark % % Insert space above the heading. \csname #2headingbreak\endcsname % % Now the second mark, after the heading break. No break points % between here and the heading. \let\prevsectiondefs=\lastsectiondefs \domark % % Only insert the space after the number if we have a section number. \ifx\temptype\Ynothingkeyword \setbox0 = \hbox{}% \def\toctype{unn}% \gdef\lastsection{#1}% \else\ifx\temptype\Yomitfromtockeyword % for @headings -- no section number, don't include in toc, % and don't redefine \lastsection. \setbox0 = \hbox{}% \def\toctype{omit}% \let\sectionlevel=\empty \else\ifx\temptype\Yappendixkeyword \setbox0 = \hbox{#4\enspace}% \def\toctype{app}% \gdef\lastsection{#1}% \else \setbox0 = \hbox{#4\enspace}% \def\toctype{num}% \gdef\lastsection{#1}% \fi\fi\fi % % Write the toc entry (before \donoderef). See comments in \chapmacro. \writetocentry{\toctype\sectionlevel}{#1}{#4}% % % Write the node reference (= pdf destination for pdftex). % Again, see comments in \chapmacro. \donoderef{#3}% % % Interline glue will be inserted when the vbox is completed. % That glue will be a valid breakpoint for the page, since it'll be % preceded by a whatsit (usually from the \donoderef, or from the % \writetocentry if there was no node). We don't want to allow that % break, since then the whatsits could end up on page n while the % section is on page n+1, thus toc/etc. are wrong. Debian bug 276000. \nobreak % % Output the actual section heading. \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright \hangindent=\wd0 % zero if no section number \unhbox0 #1}% }% % Add extra space after the heading -- half of whatever came above it. % Don't allow stretch, though. \kern .5 \csname #2headingskip\endcsname % % Do not let the kern be a potential breakpoint, as it would be if it % was followed by glue. \nobreak % % We'll almost certainly start a paragraph next, so don't let that % glue accumulate. (Not a breakpoint because it's preceded by a % discardable item.) \vskip-\parskip % % This is purely so the last item on the list is a known \penalty > % 10000. This is so \startdefun can avoid allowing breakpoints after % section headings. Otherwise, it would insert a valid breakpoint between: % % @section sec-whatever % @deffn def-whatever \penalty 10001 } \message{toc,} % Table of contents. \newwrite\tocfile % Write an entry to the toc file, opening it if necessary. % Called from @chapter, etc. % % Example usage: \writetocentry{sec}{Section Name}{\the\chapno.\the\secno} % We append the current node name (if any) and page number as additional % arguments for the \{chap,sec,...}entry macros which will eventually % read this. The node name is used in the pdf outlines as the % destination to jump to. % % We open the .toc file for writing here instead of at @setfilename (or % any other fixed time) so that @contents can be anywhere in the document. % But if #1 is `omit', then we don't do anything. This is used for the % table of contents chapter openings themselves. % \newif\iftocfileopened \def\omitkeyword{omit}% % \def\writetocentry#1#2#3{% \edef\writetoctype{#1}% \ifx\writetoctype\omitkeyword \else \iftocfileopened\else \immediate\openout\tocfile = \jobname.toc \global\tocfileopenedtrue \fi % \iflinks {\atdummies \edef\temp{% \write\tocfile{@#1entry{#2}{#3}{\lastnode}{\noexpand\folio}}}% \temp }% \fi \fi % % Tell \shipout to create a pdf destination on each page, if we're % writing pdf. These are used in the table of contents. We can't % just write one on every page because the title pages are numbered % 1 and 2 (the page numbers aren't printed), and so are the first % two pages of the document. Thus, we'd have two destinations named % `1', and two named `2'. \ifpdf \global\pdfmakepagedesttrue \fi } % These characters do not print properly in the Computer Modern roman % fonts, so we must take special care. This is more or less redundant % with the Texinfo input format setup at the end of this file. % \def\activecatcodes{% \catcode`\"=\active \catcode`\$=\active \catcode`\<=\active \catcode`\>=\active \catcode`\\=\active \catcode`\^=\active \catcode`\_=\active \catcode`\|=\active \catcode`\~=\active } % Read the toc file, which is essentially Texinfo input. \def\readtocfile{% \setupdatafile \activecatcodes \input \tocreadfilename } \newskip\contentsrightmargin \contentsrightmargin=1in \newcount\savepageno \newcount\lastnegativepageno \lastnegativepageno = -1 % Prepare to read what we've written to \tocfile. % \def\startcontents#1{% % If @setchapternewpage on, and @headings double, the contents should % start on an odd page, unlike chapters. Thus, we maintain % \contentsalignmacro in parallel with \pagealignmacro. % From: Torbjorn Granlund \contentsalignmacro \immediate\closeout\tocfile % % Don't need to put `Contents' or `Short Contents' in the headline. % It is abundantly clear what they are. \chapmacro{#1}{Yomitfromtoc}{}% % \savepageno = \pageno \begingroup % Set up to handle contents files properly. \raggedbottom % Worry more about breakpoints than the bottom. \advance\hsize by -\contentsrightmargin % Don't use the full line length. % % Roman numerals for page numbers. \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi } % redefined for the two-volume lispref. We always output on % \jobname.toc even if this is redefined. % \def\tocreadfilename{\jobname.toc} % Normal (long) toc. % \def\contents{% \startcontents{\putwordTOC}% \openin 1 \tocreadfilename\space \ifeof 1 \else \readtocfile \fi \vfill \eject \contentsalignmacro % in case @setchapternewpage odd is in effect \ifeof 1 \else \pdfmakeoutlines \fi \closein 1 \endgroup \lastnegativepageno = \pageno \global\pageno = \savepageno } % And just the chapters. \def\summarycontents{% \startcontents{\putwordShortTOC}% % \let\numchapentry = \shortchapentry \let\appentry = \shortchapentry \let\unnchapentry = \shortunnchapentry % We want a true roman here for the page numbers. \secfonts \let\rm=\shortcontrm \let\bf=\shortcontbf \let\sl=\shortcontsl \let\tt=\shortconttt \rm \hyphenpenalty = 10000 \advance\baselineskip by 1pt % Open it up a little. \def\numsecentry##1##2##3##4{} \let\appsecentry = \numsecentry \let\unnsecentry = \numsecentry \let\numsubsecentry = \numsecentry \let\appsubsecentry = \numsecentry \let\unnsubsecentry = \numsecentry \let\numsubsubsecentry = \numsecentry \let\appsubsubsecentry = \numsecentry \let\unnsubsubsecentry = \numsecentry \openin 1 \tocreadfilename\space \ifeof 1 \else \readtocfile \fi \closein 1 \vfill \eject \contentsalignmacro % in case @setchapternewpage odd is in effect \endgroup \lastnegativepageno = \pageno \global\pageno = \savepageno } \let\shortcontents = \summarycontents % Typeset the label for a chapter or appendix for the short contents. % The arg is, e.g., `A' for an appendix, or `3' for a chapter. % \def\shortchaplabel#1{% % This space should be enough, since a single number is .5em, and the % widest letter (M) is 1em, at least in the Computer Modern fonts. % But use \hss just in case. % (This space doesn't include the extra space that gets added after % the label; that gets put in by \shortchapentry above.) % % We'd like to right-justify chapter numbers, but that looks strange % with appendix letters. And right-justifying numbers and % left-justifying letters looks strange when there is less than 10 % chapters. Have to read the whole toc once to know how many chapters % there are before deciding ... \hbox to 1em{#1\hss}% } % These macros generate individual entries in the table of contents. % The first argument is the chapter or section name. % The last argument is the page number. % The arguments in between are the chapter number, section number, ... % Chapters, in the main contents. \def\numchapentry#1#2#3#4{\dochapentry{#2\labelspace#1}{#4}} % % Chapters, in the short toc. % See comments in \dochapentry re vbox and related settings. \def\shortchapentry#1#2#3#4{% \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#4\egroup}% } % Appendices, in the main contents. % Need the word Appendix, and a fixed-size box. % \def\appendixbox#1{% % We use M since it's probably the widest letter. \setbox0 = \hbox{\putwordAppendix{} M}% \hbox to \wd0{\putwordAppendix{} #1\hss}} % \def\appentry#1#2#3#4{\dochapentry{\appendixbox{#2}\labelspace#1}{#4}} % Unnumbered chapters. \def\unnchapentry#1#2#3#4{\dochapentry{#1}{#4}} \def\shortunnchapentry#1#2#3#4{\tocentry{#1}{\doshortpageno\bgroup#4\egroup}} % Sections. \def\numsecentry#1#2#3#4{\dosecentry{#2\labelspace#1}{#4}} \let\appsecentry=\numsecentry \def\unnsecentry#1#2#3#4{\dosecentry{#1}{#4}} % Subsections. \def\numsubsecentry#1#2#3#4{\dosubsecentry{#2\labelspace#1}{#4}} \let\appsubsecentry=\numsubsecentry \def\unnsubsecentry#1#2#3#4{\dosubsecentry{#1}{#4}} % And subsubsections. \def\numsubsubsecentry#1#2#3#4{\dosubsubsecentry{#2\labelspace#1}{#4}} \let\appsubsubsecentry=\numsubsubsecentry \def\unnsubsubsecentry#1#2#3#4{\dosubsubsecentry{#1}{#4}} % This parameter controls the indentation of the various levels. % Same as \defaultparindent. \newdimen\tocindent \tocindent = 15pt % Now for the actual typesetting. In all these, #1 is the text and #2 is the % page number. % % If the toc has to be broken over pages, we want it to be at chapters % if at all possible; hence the \penalty. \def\dochapentry#1#2{% \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip \begingroup \chapentryfonts \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup \nobreak\vskip .25\baselineskip plus.1\baselineskip } \def\dosecentry#1#2{\begingroup \secentryfonts \leftskip=\tocindent \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup} \def\dosubsecentry#1#2{\begingroup \subsecentryfonts \leftskip=2\tocindent \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup} \def\dosubsubsecentry#1#2{\begingroup \subsubsecentryfonts \leftskip=3\tocindent \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup} % We use the same \entry macro as for the index entries. \let\tocentry = \entry % Space between chapter (or whatever) number and the title. \def\labelspace{\hskip1em \relax} \def\dopageno#1{{\rm #1}} \def\doshortpageno#1{{\rm #1}} \def\chapentryfonts{\secfonts \rm} \def\secentryfonts{\textfonts} \def\subsecentryfonts{\textfonts} \def\subsubsecentryfonts{\textfonts} \message{environments,} % @foo ... @end foo. % @point{}, @result{}, @expansion{}, @print{}, @equiv{}. % % Since these characters are used in examples, it should be an even number of % \tt widths. Each \tt character is 1en, so two makes it 1em. % \def\point{$\star$} \def\result{\leavevmode\raise.15ex\hbox to 1em{\hfil$\Rightarrow$\hfil}} \def\expansion{\leavevmode\raise.1ex\hbox to 1em{\hfil$\mapsto$\hfil}} \def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}} \def\equiv{\leavevmode\lower.1ex\hbox to 1em{\hfil$\ptexequiv$\hfil}} % The @error{} command. % Adapted from the TeXbook's \boxit. % \newbox\errorbox % {\tentt \global\dimen0 = 3em}% Width of the box. \dimen2 = .55pt % Thickness of rules % The text. (`r' is open on the right, `e' somewhat less so on the left.) \setbox0 = \hbox{\kern-.75pt \reducedsf error\kern-1.5pt} % \setbox\errorbox=\hbox to \dimen0{\hfil \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right. \advance\hsize by -2\dimen2 % Rules. \vbox{% \hrule height\dimen2 \hbox{\vrule width\dimen2 \kern3pt % Space to left of text. \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below. \kern3pt\vrule width\dimen2}% Space to right. \hrule height\dimen2} \hfil} % \def\error{\leavevmode\lower.7ex\copy\errorbox} % @tex ... @end tex escapes into raw Tex temporarily. % One exception: @ is still an escape character, so that @end tex works. % But \@ or @@ will get a plain tex @ character. \envdef\tex{% \catcode `\\=0 \catcode `\{=1 \catcode `\}=2 \catcode `\$=3 \catcode `\&=4 \catcode `\#=6 \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie \catcode `\%=14 \catcode `\+=\other \catcode `\"=\other \catcode `\|=\other \catcode `\<=\other \catcode `\>=\other \escapechar=`\\ % \let\b=\ptexb \let\bullet=\ptexbullet \let\c=\ptexc \let\,=\ptexcomma \let\.=\ptexdot \let\dots=\ptexdots \let\equiv=\ptexequiv \let\!=\ptexexclam \let\i=\ptexi \let\indent=\ptexindent \let\noindent=\ptexnoindent \let\{=\ptexlbrace \let\+=\tabalign \let\}=\ptexrbrace \let\/=\ptexslash \let\*=\ptexstar \let\t=\ptext \let\frenchspacing=\plainfrenchspacing % \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}% \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}% \def\@{@}% } % There is no need to define \Etex. % Define @lisp ... @end lisp. % @lisp environment forms a group so it can rebind things, % including the definition of @end lisp (which normally is erroneous). % Amount to narrow the margins by for @lisp. \newskip\lispnarrowing \lispnarrowing=0.4in % This is the definition that ^^M gets inside @lisp, @example, and other % such environments. \null is better than a space, since it doesn't % have any width. \def\lisppar{\null\endgraf} % This space is always present above and below environments. \newskip\envskipamount \envskipamount = 0pt % Make spacing and below environment symmetrical. We use \parskip here % to help in doing that, since in @example-like environments \parskip % is reset to zero; thus the \afterenvbreak inserts no space -- but the % start of the next paragraph will insert \parskip. % \def\aboveenvbreak{{% % =10000 instead of <10000 because of a special case in \itemzzz and % \sectionheading, q.v. \ifnum \lastpenalty=10000 \else \advance\envskipamount by \parskip \endgraf \ifdim\lastskip<\envskipamount \removelastskip % it's not a good place to break if the last penalty was \nobreak % or better ... \ifnum\lastpenalty<10000 \penalty-50 \fi \vskip\envskipamount \fi \fi }} \let\afterenvbreak = \aboveenvbreak % \nonarrowing is a flag. If "set", @lisp etc don't narrow margins; it will % also clear it, so that its embedded environments do the narrowing again. \let\nonarrowing=\relax % @cartouche ... @end cartouche: draw rectangle w/rounded corners around % environment contents. \font\circle=lcircle10 \newdimen\circthick \newdimen\cartouter\newdimen\cartinner \newskip\normbskip\newskip\normpskip\newskip\normlskip \circthick=\fontdimen8\circle % \def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth \def\ctr{{\hskip 6pt\circle\char'010}} \def\cbl{{\circle\char'012\hskip -6pt}} \def\cbr{{\hskip 6pt\circle\char'011}} \def\carttop{\hbox to \cartouter{\hskip\lskip \ctl\leaders\hrule height\circthick\hfil\ctr \hskip\rskip}} \def\cartbot{\hbox to \cartouter{\hskip\lskip \cbl\leaders\hrule height\circthick\hfil\cbr \hskip\rskip}} % \newskip\lskip\newskip\rskip \envdef\cartouche{% \ifhmode\par\fi % can't be in the midst of a paragraph. \startsavinginserts \lskip=\leftskip \rskip=\rightskip \leftskip=0pt\rightskip=0pt % we want these *outside*. \cartinner=\hsize \advance\cartinner by-\lskip \advance\cartinner by-\rskip \cartouter=\hsize \advance\cartouter by 18.4pt % allow for 3pt kerns on either % side, and for 6pt waste from % each corner char, and rule thickness \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip % Flag to tell @lisp, etc., not to narrow margin. \let\nonarrowing = t% \vbox\bgroup \baselineskip=0pt\parskip=0pt\lineskip=0pt \carttop \hbox\bgroup \hskip\lskip \vrule\kern3pt \vbox\bgroup \kern3pt \hsize=\cartinner \baselineskip=\normbskip \lineskip=\normlskip \parskip=\normpskip \vskip -\parskip \comment % For explanation, see the end of \def\group. } \def\Ecartouche{% \ifhmode\par\fi \kern3pt \egroup \kern3pt\vrule \hskip\rskip \egroup \cartbot \egroup \checkinserts } % This macro is called at the beginning of all the @example variants, % inside a group. \def\nonfillstart{% \aboveenvbreak \hfuzz = 12pt % Don't be fussy \sepspaces % Make spaces be word-separators rather than space tokens. \let\par = \lisppar % don't ignore blank lines \obeylines % each line of input is a line of output \parskip = 0pt \parindent = 0pt \emergencystretch = 0pt % don't try to avoid overfull boxes \ifx\nonarrowing\relax \advance \leftskip by \lispnarrowing \exdentamount=\lispnarrowing \else \let\nonarrowing = \relax \fi \let\exdent=\nofillexdent } % If you want all examples etc. small: @set dispenvsize small. % If you want even small examples the full size: @set dispenvsize nosmall. % This affects the following displayed environments: % @example, @display, @format, @lisp % \def\smallword{small} \def\nosmallword{nosmall} \let\SETdispenvsize\relax \def\setnormaldispenv{% \ifx\SETdispenvsize\smallword % end paragraph for sake of leading, in case document has no blank % line. This is redundant with what happens in \aboveenvbreak, but % we need to do it before changing the fonts, and it's inconvenient % to change the fonts afterward. \ifnum \lastpenalty=10000 \else \endgraf \fi \smallexamplefonts \rm \fi } \def\setsmalldispenv{% \ifx\SETdispenvsize\nosmallword \else \ifnum \lastpenalty=10000 \else \endgraf \fi \smallexamplefonts \rm \fi } % We often define two environments, @foo and @smallfoo. % Let's do it by one command: \def\makedispenv #1#2{ \expandafter\envdef\csname#1\endcsname {\setnormaldispenv #2} \expandafter\envdef\csname small#1\endcsname {\setsmalldispenv #2} \expandafter\let\csname E#1\endcsname \afterenvbreak \expandafter\let\csname Esmall#1\endcsname \afterenvbreak } % Define two synonyms: \def\maketwodispenvs #1#2#3{ \makedispenv{#1}{#3} \makedispenv{#2}{#3} } % @lisp: indented, narrowed, typewriter font; @example: same as @lisp. % % @smallexample and @smalllisp: use smaller fonts. % Originally contributed by Pavel@xerox. % \maketwodispenvs {lisp}{example}{% \nonfillstart \tt\quoteexpand \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special. \gobble % eat return } % @display/@smalldisplay: same as @lisp except keep current font. % \makedispenv {display}{% \nonfillstart \gobble } % @format/@smallformat: same as @display except don't narrow margins. % \makedispenv{format}{% \let\nonarrowing = t% \nonfillstart \gobble } % @flushleft: same as @format, but doesn't obey \SETdispenvsize. \envdef\flushleft{% \let\nonarrowing = t% \nonfillstart \gobble } \let\Eflushleft = \afterenvbreak % @flushright. % \envdef\flushright{% \let\nonarrowing = t% \nonfillstart \advance\leftskip by 0pt plus 1fill \gobble } \let\Eflushright = \afterenvbreak % @quotation does normal linebreaking (hence we can't use \nonfillstart) % and narrows the margins. We keep \parskip nonzero in general, since % we're doing normal filling. So, when using \aboveenvbreak and % \afterenvbreak, temporarily make \parskip 0. % \envdef\quotation{% {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip \parindent=0pt % % @cartouche defines \nonarrowing to inhibit narrowing at next level down. \ifx\nonarrowing\relax \advance\leftskip by \lispnarrowing \advance\rightskip by \lispnarrowing \exdentamount = \lispnarrowing \else \let\nonarrowing = \relax \fi \parsearg\quotationlabel } % We have retained a nonzero parskip for the environment, since we're % doing normal filling. % \def\Equotation{% \par \ifx\quotationauthor\undefined\else % indent a bit. \leftline{\kern 2\leftskip \sl ---\quotationauthor}% \fi {\parskip=0pt \afterenvbreak}% } % If we're given an argument, typeset it in bold with a colon after. \def\quotationlabel#1{% \def\temp{#1}% \ifx\temp\empty \else {\bf #1: }% \fi } % LaTeX-like @verbatim...@end verbatim and @verb{...} % If we want to allow any as delimiter, % we need the curly braces so that makeinfo sees the @verb command, eg: % `@verbx...x' would look like the '@verbx' command. --janneke@gnu.org % % [Knuth]: Donald Ervin Knuth, 1996. The TeXbook. % % [Knuth] p.344; only we need to do the other characters Texinfo sets % active too. Otherwise, they get lost as the first character on a % verbatim line. \def\dospecials{% \do\ \do\\\do\{\do\}\do\$\do\&% \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~% \do\<\do\>\do\|\do\@\do+\do\"% } % % [Knuth] p. 380 \def\uncatcodespecials{% \def\do##1{\catcode`##1=\other}\dospecials} % % [Knuth] pp. 380,381,391 % Disable Spanish ligatures ?` and !` of \tt font \begingroup \catcode`\`=\active\gdef`{\relax\lq} \endgroup % % Setup for the @verb command. % % Eight spaces for a tab \begingroup \catcode`\^^I=\active \gdef\tabeightspaces{\catcode`\^^I=\active\def^^I{\ \ \ \ \ \ \ \ }} \endgroup % \def\setupverb{% \tt % easiest (and conventionally used) font for verbatim \def\par{\leavevmode\endgraf}% \catcode`\`=\active \tabeightspaces % Respect line breaks, % print special symbols as themselves, and % make each space count % must do in this order: \obeylines \uncatcodespecials \sepspaces } % Setup for the @verbatim environment % % Real tab expansion \newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount % \def\starttabbox{\setbox0=\hbox\bgroup} % Allow an option to not replace quotes with a regular directed right % quote/apostrophe (char 0x27), but instead use the undirected quote % from cmtt (char 0x0d). The undirected quote is ugly, so don't make it % the default, but it works for pasting with more pdf viewers (at least % evince), the lilypond developers report. xpdf does work with the % regular 0x27. % \def\codequoteright{% \expandafter\ifx\csname SETtxicodequoteundirected\endcsname\relax \expandafter\ifx\csname SETcodequoteundirected\endcsname\relax '% \else \char'15 \fi \else \char'15 \fi } % % and a similar option for the left quote char vs. a grave accent. % Modern fonts display ASCII 0x60 as a grave accent, so some people like % the code environments to do likewise. % \def\codequoteleft{% \expandafter\ifx\csname SETtxicodequotebacktick\endcsname\relax \expandafter\ifx\csname SETcodequotebacktick\endcsname\relax `% \else \char'22 \fi \else \char'22 \fi } % \begingroup \catcode`\^^I=\active \gdef\tabexpand{% \catcode`\^^I=\active \def^^I{\leavevmode\egroup \dimen0=\wd0 % the width so far, or since the previous tab \divide\dimen0 by\tabw \multiply\dimen0 by\tabw % compute previous multiple of \tabw \advance\dimen0 by\tabw % advance to next multiple of \tabw \wd0=\dimen0 \box0 \starttabbox }% } \catcode`\'=\active \gdef\rquoteexpand{\catcode\rquoteChar=\active \def'{\codequoteright}}% % \catcode`\`=\active \gdef\lquoteexpand{\catcode\lquoteChar=\active \def`{\codequoteleft}}% % \gdef\quoteexpand{\rquoteexpand \lquoteexpand}% \endgroup % start the verbatim environment. \def\setupverbatim{% \let\nonarrowing = t% \nonfillstart % Easiest (and conventionally used) font for verbatim \tt \def\par{\leavevmode\egroup\box0\endgraf}% \catcode`\`=\active \tabexpand \quoteexpand % Respect line breaks, % print special symbols as themselves, and % make each space count % must do in this order: \obeylines \uncatcodespecials \sepspaces \everypar{\starttabbox}% } % Do the @verb magic: verbatim text is quoted by unique % delimiter characters. Before first delimiter expect a % right brace, after last delimiter expect closing brace: % % \def\doverb'{'#1'}'{#1} % % [Knuth] p. 382; only eat outer {} \begingroup \catcode`[=1\catcode`]=2\catcode`\{=\other\catcode`\}=\other \gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next] \endgroup % \def\verb{\begingroup\setupverb\doverb} % % % Do the @verbatim magic: define the macro \doverbatim so that % the (first) argument ends when '@end verbatim' is reached, ie: % % \def\doverbatim#1@end verbatim{#1} % % For Texinfo it's a lot easier than for LaTeX, % because texinfo's \verbatim doesn't stop at '\end{verbatim}': % we need not redefine '\', '{' and '}'. % % Inspired by LaTeX's verbatim command set [latex.ltx] % \begingroup \catcode`\ =\active \obeylines % % ignore everything up to the first ^^M, that's the newline at the end % of the @verbatim input line itself. Otherwise we get an extra blank % line in the output. \xdef\doverbatim#1^^M#2@end verbatim{#2\noexpand\end\gobble verbatim}% % We really want {...\end verbatim} in the body of the macro, but % without the active space; thus we have to use \xdef and \gobble. \endgroup % \envdef\verbatim{% \setupverbatim\doverbatim } \let\Everbatim = \afterenvbreak % @verbatiminclude FILE - insert text of file in verbatim environment. % \def\verbatiminclude{\parseargusing\filenamecatcodes\doverbatiminclude} % \def\doverbatiminclude#1{% {% \makevalueexpandable \setupverbatim \input #1 \afterenvbreak }% } % @copying ... @end copying. % Save the text away for @insertcopying later. % % We save the uninterpreted tokens, rather than creating a box. % Saving the text in a box would be much easier, but then all the % typesetting commands (@smallbook, font changes, etc.) have to be done % beforehand -- and a) we want @copying to be done first in the source % file; b) letting users define the frontmatter in as flexible order as % possible is very desirable. % \def\copying{\checkenv{}\begingroup\scanargctxt\docopying} \def\docopying#1@end copying{\endgroup\def\copyingtext{#1}} % \def\insertcopying{% \begingroup \parindent = 0pt % paragraph indentation looks wrong on title page \scanexp\copyingtext \endgroup } \message{defuns,} % @defun etc. \newskip\defbodyindent \defbodyindent=.4in \newskip\defargsindent \defargsindent=50pt \newskip\deflastargmargin \deflastargmargin=18pt \newcount\defunpenalty % Start the processing of @deffn: \def\startdefun{% \ifnum\lastpenalty<10000 \medbreak \defunpenalty=10003 % Will keep this @deffn together with the % following @def command, see below. \else % If there are two @def commands in a row, we'll have a \nobreak, % which is there to keep the function description together with its % header. But if there's nothing but headers, we need to allow a % break somewhere. Check specifically for penalty 10002, inserted % by \printdefunline, instead of 10000, since the sectioning % commands also insert a nobreak penalty, and we don't want to allow % a break between a section heading and a defun. % % As a minor refinement, we avoid "club" headers by signalling % with penalty of 10003 after the very first @deffn in the % sequence (see above), and penalty of 10002 after any following % @def command. \ifnum\lastpenalty=10002 \penalty2000 \else \defunpenalty=10002 \fi % % Similarly, after a section heading, do not allow a break. % But do insert the glue. \medskip % preceded by discardable penalty, so not a breakpoint \fi % \parindent=0in \advance\leftskip by \defbodyindent \exdentamount=\defbodyindent } \def\dodefunx#1{% % First, check whether we are in the right environment: \checkenv#1% % % As above, allow line break if we have multiple x headers in a row. % It's not a great place, though. \ifnum\lastpenalty=10002 \penalty3000 \else \defunpenalty=10002 \fi % % And now, it's time to reuse the body of the original defun: \expandafter\gobbledefun#1% } \def\gobbledefun#1\startdefun{} % \printdefunline \deffnheader{text} % \def\printdefunline#1#2{% \begingroup % call \deffnheader: #1#2 \endheader % common ending: \interlinepenalty = 10000 \advance\rightskip by 0pt plus 1fil \endgraf \nobreak\vskip -\parskip \penalty\defunpenalty % signal to \startdefun and \dodefunx % Some of the @defun-type tags do not enable magic parentheses, % rendering the following check redundant. But we don't optimize. \checkparencounts \endgroup } \def\Edefun{\endgraf\medbreak} % \makedefun{deffn} creates \deffn, \deffnx and \Edeffn; % the only thing remainnig is to define \deffnheader. % \def\makedefun#1{% \expandafter\let\csname E#1\endcsname = \Edefun \edef\temp{\noexpand\domakedefun \makecsname{#1}\makecsname{#1x}\makecsname{#1header}}% \temp } % \domakedefun \deffn \deffnx \deffnheader % % Define \deffn and \deffnx, without parameters. % \deffnheader has to be defined explicitly. % \def\domakedefun#1#2#3{% \envdef#1{% \startdefun \parseargusing\activeparens{\printdefunline#3}% }% \def#2{\dodefunx#1}% \def#3% } %%% Untyped functions: % @deffn category name args \makedefun{deffn}{\deffngeneral{}} % @deffn category class name args \makedefun{defop}#1 {\defopon{#1\ \putwordon}} % \defopon {category on}class name args \def\defopon#1#2 {\deffngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} } % \deffngeneral {subind}category name args % \def\deffngeneral#1#2 #3 #4\endheader{% % Remember that \dosubind{fn}{foo}{} is equivalent to \doind{fn}{foo}. \dosubind{fn}{\code{#3}}{#1}% \defname{#2}{}{#3}\magicamp\defunargs{#4\unskip}% } %%% Typed functions: % @deftypefn category type name args \makedefun{deftypefn}{\deftypefngeneral{}} % @deftypeop category class type name args \makedefun{deftypeop}#1 {\deftypeopon{#1\ \putwordon}} % \deftypeopon {category on}class type name args \def\deftypeopon#1#2 {\deftypefngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} } % \deftypefngeneral {subind}category type name args % \def\deftypefngeneral#1#2 #3 #4 #5\endheader{% \dosubind{fn}{\code{#4}}{#1}% \defname{#2}{#3}{#4}\defunargs{#5\unskip}% } %%% Typed variables: % @deftypevr category type var args \makedefun{deftypevr}{\deftypecvgeneral{}} % @deftypecv category class type var args \makedefun{deftypecv}#1 {\deftypecvof{#1\ \putwordof}} % \deftypecvof {category of}class type var args \def\deftypecvof#1#2 {\deftypecvgeneral{\putwordof\ \code{#2}}{#1\ \code{#2}} } % \deftypecvgeneral {subind}category type var args % \def\deftypecvgeneral#1#2 #3 #4 #5\endheader{% \dosubind{vr}{\code{#4}}{#1}% \defname{#2}{#3}{#4}\defunargs{#5\unskip}% } %%% Untyped variables: % @defvr category var args \makedefun{defvr}#1 {\deftypevrheader{#1} {} } % @defcv category class var args \makedefun{defcv}#1 {\defcvof{#1\ \putwordof}} % \defcvof {category of}class var args \def\defcvof#1#2 {\deftypecvof{#1}#2 {} } %%% Type: % @deftp category name args \makedefun{deftp}#1 #2 #3\endheader{% \doind{tp}{\code{#2}}% \defname{#1}{}{#2}\defunargs{#3\unskip}% } % Remaining @defun-like shortcuts: \makedefun{defun}{\deffnheader{\putwordDeffunc} } \makedefun{defmac}{\deffnheader{\putwordDefmac} } \makedefun{defspec}{\deffnheader{\putwordDefspec} } \makedefun{deftypefun}{\deftypefnheader{\putwordDeffunc} } \makedefun{defvar}{\defvrheader{\putwordDefvar} } \makedefun{defopt}{\defvrheader{\putwordDefopt} } \makedefun{deftypevar}{\deftypevrheader{\putwordDefvar} } \makedefun{defmethod}{\defopon\putwordMethodon} \makedefun{deftypemethod}{\deftypeopon\putwordMethodon} \makedefun{defivar}{\defcvof\putwordInstanceVariableof} \makedefun{deftypeivar}{\deftypecvof\putwordInstanceVariableof} % \defname, which formats the name of the @def (not the args). % #1 is the category, such as "Function". % #2 is the return type, if any. % #3 is the function name. % % We are followed by (but not passed) the arguments, if any. % \def\defname#1#2#3{% % Get the values of \leftskip and \rightskip as they were outside the @def... \advance\leftskip by -\defbodyindent % % How we'll format the type name. Putting it in brackets helps % distinguish it from the body text that may end up on the next line % just below it. \def\temp{#1}% \setbox0=\hbox{\kern\deflastargmargin \ifx\temp\empty\else [\rm\temp]\fi} % % Figure out line sizes for the paragraph shape. % The first line needs space for \box0; but if \rightskip is nonzero, % we need only space for the part of \box0 which exceeds it: \dimen0=\hsize \advance\dimen0 by -\wd0 \advance\dimen0 by \rightskip % The continuations: \dimen2=\hsize \advance\dimen2 by -\defargsindent % (plain.tex says that \dimen1 should be used only as global.) \parshape 2 0in \dimen0 \defargsindent \dimen2 % % Put the type name to the right margin. \noindent \hbox to 0pt{% \hfil\box0 \kern-\hsize % \hsize has to be shortened this way: \kern\leftskip % Intentionally do not respect \rightskip, since we need the space. }% % % Allow all lines to be underfull without complaint: \tolerance=10000 \hbadness=10000 \exdentamount=\defbodyindent {% % defun fonts. We use typewriter by default (used to be bold) because: % . we're printing identifiers, they should be in tt in principle. % . in languages with many accents, such as Czech or French, it's % common to leave accents off identifiers. The result looks ok in % tt, but exceedingly strange in rm. % . we don't want -- and --- to be treated as ligatures. % . this still does not fix the ?` and !` ligatures, but so far no % one has made identifiers using them :). \df \tt \def\temp{#2}% return value type \ifx\temp\empty\else \tclose{\temp} \fi #3% output function name }% {\rm\enskip}% hskip 0.5 em of \tenrm % \boldbrax % arguments will be output next, if any. } % Print arguments in slanted roman (not ttsl), inconsistently with using % tt for the name. This is because literal text is sometimes needed in % the argument list (groff manual), and ttsl and tt are not very % distinguishable. Prevent hyphenation at `-' chars. % \def\defunargs#1{% % use sl by default (not ttsl), % tt for the names. \df \sl \hyphenchar\font=0 % % On the other hand, if an argument has two dashes (for instance), we % want a way to get ttsl. Let's try @var for that. \let\var=\ttslanted #1% \sl\hyphenchar\font=45 } % We want ()&[] to print specially on the defun line. % \def\activeparens{% \catcode`\(=\active \catcode`\)=\active \catcode`\[=\active \catcode`\]=\active \catcode`\&=\active } % Make control sequences which act like normal parenthesis chars. \let\lparen = ( \let\rparen = ) % Be sure that we always have a definition for `(', etc. For example, % if the fn name has parens in it, \boldbrax will not be in effect yet, % so TeX would otherwise complain about undefined control sequence. { \activeparens \global\let(=\lparen \global\let)=\rparen \global\let[=\lbrack \global\let]=\rbrack \global\let& = \& \gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb} \gdef\magicamp{\let&=\amprm} } \newcount\parencount % If we encounter &foo, then turn on ()-hacking afterwards \newif\ifampseen \def\amprm#1 {\ampseentrue{\bf\ }} \def\parenfont{% \ifampseen % At the first level, print parens in roman, % otherwise use the default font. \ifnum \parencount=1 \rm \fi \else % The \sf parens (in \boldbrax) actually are a little bolder than % the contained text. This is especially needed for [ and ] . \sf \fi } \def\infirstlevel#1{% \ifampseen \ifnum\parencount=1 #1% \fi \fi } \def\bfafterword#1 {#1 \bf} \def\opnr{% \global\advance\parencount by 1 {\parenfont(}% \infirstlevel \bfafterword } \def\clnr{% {\parenfont)}% \infirstlevel \sl \global\advance\parencount by -1 } \newcount\brackcount \def\lbrb{% \global\advance\brackcount by 1 {\bf[}% } \def\rbrb{% {\bf]}% \global\advance\brackcount by -1 } \def\checkparencounts{% \ifnum\parencount=0 \else \badparencount \fi \ifnum\brackcount=0 \else \badbrackcount \fi } % these should not use \errmessage; the glibc manual, at least, actually % has such constructs (when documenting function pointers). \def\badparencount{% \message{Warning: unbalanced parentheses in @def...}% \global\parencount=0 } \def\badbrackcount{% \message{Warning: unbalanced square brackets in @def...}% \global\brackcount=0 } \message{macros,} % @macro. % To do this right we need a feature of e-TeX, \scantokens, % which we arrange to emulate with a temporary file in ordinary TeX. \ifx\eTeXversion\undefined \newwrite\macscribble \def\scantokens#1{% \toks0={#1}% \immediate\openout\macscribble=\jobname.tmp \immediate\write\macscribble{\the\toks0}% \immediate\closeout\macscribble \input \jobname.tmp } \fi \def\scanmacro#1{% \begingroup \newlinechar`\^^M \let\xeatspaces\eatspaces % Undo catcode changes of \startcontents and \doprintindex % When called from @insertcopying or (short)caption, we need active % backslash to get it printed correctly. Previously, we had % \catcode`\\=\other instead. We'll see whether a problem appears % with macro expansion. --kasal, 19aug04 \catcode`\@=0 \catcode`\\=\active \escapechar=`\@ % ... and \example \spaceisspace % % Append \endinput to make sure that TeX does not see the ending newline. % I've verified that it is necessary both for e-TeX and for ordinary TeX % --kasal, 29nov03 \scantokens{#1\endinput}% \endgroup } \def\scanexp#1{% \edef\temp{\noexpand\scanmacro{#1}}% \temp } \newcount\paramno % Count of parameters \newtoks\macname % Macro name \newif\ifrecursive % Is it recursive? % List of all defined macros in the form % \definedummyword\macro1\definedummyword\macro2... % Currently is also contains all @aliases; the list can be split % if there is a need. \def\macrolist{} % Add the macro to \macrolist \def\addtomacrolist#1{\expandafter \addtomacrolistxxx \csname#1\endcsname} \def\addtomacrolistxxx#1{% \toks0 = \expandafter{\macrolist\definedummyword#1}% \xdef\macrolist{\the\toks0}% } % Utility routines. % This does \let #1 = #2, with \csnames; that is, % \let \csname#1\endcsname = \csname#2\endcsname % (except of course we have to play expansion games). % \def\cslet#1#2{% \expandafter\let \csname#1\expandafter\endcsname \csname#2\endcsname } % Trim leading and trailing spaces off a string. % Concepts from aro-bend problem 15 (see CTAN). {\catcode`\@=11 \gdef\eatspaces #1{\expandafter\trim@\expandafter{#1 }} \gdef\trim@ #1{\trim@@ @#1 @ #1 @ @@} \gdef\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @} \def\unbrace#1{#1} \unbrace{\gdef\trim@@@ #1 } #2@{#1} } % Trim a single trailing ^^M off a string. {\catcode`\^^M=\other \catcode`\Q=3% \gdef\eatcr #1{\eatcra #1Q^^MQ}% \gdef\eatcra#1^^MQ{\eatcrb#1Q}% \gdef\eatcrb#1Q#2Q{#1}% } % Macro bodies are absorbed as an argument in a context where % all characters are catcode 10, 11 or 12, except \ which is active % (as in normal texinfo). It is necessary to change the definition of \. % Non-ASCII encodings make 8-bit characters active, so un-activate % them to avoid their expansion. Must do this non-globally, to % confine the change to the current group. % It's necessary to have hard CRs when the macro is executed. This is % done by making ^^M (\endlinechar) catcode 12 when reading the macro % body, and then making it the \newlinechar in \scanmacro. \def\scanctxt{% \catcode`\"=\other \catcode`\+=\other \catcode`\<=\other \catcode`\>=\other \catcode`\@=\other \catcode`\^=\other \catcode`\_=\other \catcode`\|=\other \catcode`\~=\other \ifx\declaredencoding\ascii \else \setnonasciicharscatcodenonglobal\other \fi } \def\scanargctxt{% \scanctxt \catcode`\\=\other \catcode`\^^M=\other } \def\macrobodyctxt{% \scanctxt \catcode`\{=\other \catcode`\}=\other \catcode`\^^M=\other \usembodybackslash } \def\macroargctxt{% \scanctxt \catcode`\\=\other } % \mbodybackslash is the definition of \ in @macro bodies. % It maps \foo\ => \csname macarg.foo\endcsname => #N % where N is the macro parameter number. % We define \csname macarg.\endcsname to be \realbackslash, so % \\ in macro replacement text gets you a backslash. {\catcode`@=0 @catcode`@\=@active @gdef@usembodybackslash{@let\=@mbodybackslash} @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname} } \expandafter\def\csname macarg.\endcsname{\realbackslash} \def\macro{\recursivefalse\parsearg\macroxxx} \def\rmacro{\recursivetrue\parsearg\macroxxx} \def\macroxxx#1{% \getargs{#1}% now \macname is the macname and \argl the arglist \ifx\argl\empty % no arguments \paramno=0% \else \expandafter\parsemargdef \argl;% \fi \if1\csname ismacro.\the\macname\endcsname \message{Warning: redefining \the\macname}% \else \expandafter\ifx\csname \the\macname\endcsname \relax \else \errmessage{Macro name \the\macname\space already defined}\fi \global\cslet{macsave.\the\macname}{\the\macname}% \global\expandafter\let\csname ismacro.\the\macname\endcsname=1% \addtomacrolist{\the\macname}% \fi \begingroup \macrobodyctxt \ifrecursive \expandafter\parsermacbody \else \expandafter\parsemacbody \fi} \parseargdef\unmacro{% \if1\csname ismacro.#1\endcsname \global\cslet{#1}{macsave.#1}% \global\expandafter\let \csname ismacro.#1\endcsname=0% % Remove the macro name from \macrolist: \begingroup \expandafter\let\csname#1\endcsname \relax \let\definedummyword\unmacrodo \xdef\macrolist{\macrolist}% \endgroup \else \errmessage{Macro #1 not defined}% \fi } % Called by \do from \dounmacro on each macro. The idea is to omit any % macro definitions that have been changed to \relax. % \def\unmacrodo#1{% \ifx #1\relax % remove this \else \noexpand\definedummyword \noexpand#1% \fi } % This makes use of the obscure feature that if the last token of a % is #, then the preceding argument is delimited by % an opening brace, and that opening brace is not consumed. \def\getargs#1{\getargsxxx#1{}} \def\getargsxxx#1#{\getmacname #1 \relax\getmacargs} \def\getmacname #1 #2\relax{\macname={#1}} \def\getmacargs#1{\def\argl{#1}} % Parse the optional {params} list. Set up \paramno and \paramlist % so \defmacro knows what to do. Define \macarg.blah for each blah % in the params list, to be ##N where N is the position in that list. % That gets used by \mbodybackslash (above). % We need to get `macro parameter char #' into several definitions. % The technique used is stolen from LaTeX: let \hash be something % unexpandable, insert that wherever you need a #, and then redefine % it to # just before using the token list produced. % % The same technique is used to protect \eatspaces till just before % the macro is used. \def\parsemargdef#1;{\paramno=0\def\paramlist{}% \let\hash\relax\let\xeatspaces\relax\parsemargdefxxx#1,;,} \def\parsemargdefxxx#1,{% \if#1;\let\next=\relax \else \let\next=\parsemargdefxxx \advance\paramno by 1% \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname {\xeatspaces{\hash\the\paramno}}% \edef\paramlist{\paramlist\hash\the\paramno,}% \fi\next} % These two commands read recursive and nonrecursive macro bodies. % (They're different since rec and nonrec macros end differently.) \long\def\parsemacbody#1@end macro% {\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% \long\def\parsermacbody#1@end rmacro% {\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% % This defines the macro itself. There are six cases: recursive and % nonrecursive macros of zero, one, and many arguments. % Much magic with \expandafter here. % \xdef is used so that macro definitions will survive the file % they're defined in; @include reads the file inside a group. \def\defmacro{% \let\hash=##% convert placeholders to macro parameter chars \ifrecursive \ifcase\paramno % 0 \expandafter\xdef\csname\the\macname\endcsname{% \noexpand\scanmacro{\temp}}% \or % 1 \expandafter\xdef\csname\the\macname\endcsname{% \bgroup\noexpand\macroargctxt \noexpand\braceorline \expandafter\noexpand\csname\the\macname xxx\endcsname}% \expandafter\xdef\csname\the\macname xxx\endcsname##1{% \egroup\noexpand\scanmacro{\temp}}% \else % many \expandafter\xdef\csname\the\macname\endcsname{% \bgroup\noexpand\macroargctxt \noexpand\csname\the\macname xx\endcsname}% \expandafter\xdef\csname\the\macname xx\endcsname##1{% \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% \expandafter\expandafter \expandafter\xdef \expandafter\expandafter \csname\the\macname xxx\endcsname \paramlist{\egroup\noexpand\scanmacro{\temp}}% \fi \else \ifcase\paramno % 0 \expandafter\xdef\csname\the\macname\endcsname{% \noexpand\norecurse{\the\macname}% \noexpand\scanmacro{\temp}\egroup}% \or % 1 \expandafter\xdef\csname\the\macname\endcsname{% \bgroup\noexpand\macroargctxt \noexpand\braceorline \expandafter\noexpand\csname\the\macname xxx\endcsname}% \expandafter\xdef\csname\the\macname xxx\endcsname##1{% \egroup \noexpand\norecurse{\the\macname}% \noexpand\scanmacro{\temp}\egroup}% \else % many \expandafter\xdef\csname\the\macname\endcsname{% \bgroup\noexpand\macroargctxt \expandafter\noexpand\csname\the\macname xx\endcsname}% \expandafter\xdef\csname\the\macname xx\endcsname##1{% \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% \expandafter\expandafter \expandafter\xdef \expandafter\expandafter \csname\the\macname xxx\endcsname \paramlist{% \egroup \noexpand\norecurse{\the\macname}% \noexpand\scanmacro{\temp}\egroup}% \fi \fi} \def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}} % \braceorline decides whether the next nonwhitespace character is a % {. If so it reads up to the closing }, if not, it reads the whole % line. Whatever was read is then fed to the next control sequence % as an argument (by \parsebrace or \parsearg) \def\braceorline#1{\let\macnamexxx=#1\futurelet\nchar\braceorlinexxx} \def\braceorlinexxx{% \ifx\nchar\bgroup\else \expandafter\parsearg \fi \macnamexxx} % @alias. % We need some trickery to remove the optional spaces around the equal % sign. Just make them active and then expand them all to nothing. \def\alias{\parseargusing\obeyspaces\aliasxxx} \def\aliasxxx #1{\aliasyyy#1\relax} \def\aliasyyy #1=#2\relax{% {% \expandafter\let\obeyedspace=\empty \addtomacrolist{#1}% \xdef\next{\global\let\makecsname{#1}=\makecsname{#2}}% }% \next } \message{cross references,} \newwrite\auxfile \newif\ifhavexrefs % True if xref values are known. \newif\ifwarnedxrefs % True if we warned once that they aren't known. % @inforef is relatively simple. \def\inforef #1{\inforefzzz #1,,,,**} \def\inforefzzz #1,#2,#3,#4**{\putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}}, node \samp{\ignorespaces#1{}}} % @node's only job in TeX is to define \lastnode, which is used in % cross-references. The @node line might or might not have commas, and % might or might not have spaces before the first comma, like: % @node foo , bar , ... % We don't want such trailing spaces in the node name. % \parseargdef\node{\checkenv{}\donode #1 ,\finishnodeparse} % % also remove a trailing comma, in case of something like this: % @node Help-Cross, , , Cross-refs \def\donode#1 ,#2\finishnodeparse{\dodonode #1,\finishnodeparse} \def\dodonode#1,#2\finishnodeparse{\gdef\lastnode{#1}} \let\nwnode=\node \let\lastnode=\empty % Write a cross-reference definition for the current node. #1 is the % type (Ynumbered, Yappendix, Ynothing). % \def\donoderef#1{% \ifx\lastnode\empty\else \setref{\lastnode}{#1}% \global\let\lastnode=\empty \fi } % @anchor{NAME} -- define xref target at arbitrary point. % \newcount\savesfregister % \def\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi} \def\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi} \def\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces} % \setref{NAME}{SNT} defines a cross-reference point NAME (a node or an % anchor), which consists of three parts: % 1) NAME-title - the current sectioning name taken from \lastsection, % or the anchor name. % 2) NAME-snt - section number and type, passed as the SNT arg, or % empty for anchors. % 3) NAME-pg - the page number. % % This is called from \donoderef, \anchor, and \dofloat. In the case of % floats, there is an additional part, which is not written here: % 4) NAME-lof - the text as it should appear in a @listoffloats. % \def\setref#1#2{% \pdfmkdest{#1}% \iflinks {% \atdummies % preserve commands, but don't expand them \edef\writexrdef##1##2{% \write\auxfile{@xrdef{#1-% #1 of \setref, expanded by the \edef ##1}{##2}}% these are parameters of \writexrdef }% \toks0 = \expandafter{\lastsection}% \immediate \writexrdef{title}{\the\toks0 }% \immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc. \safewhatsit{\writexrdef{pg}{\folio}}% will be written later, during \shipout }% \fi } % @xref, @pxref, and @ref generate cross-references. For \xrefX, #1 is % the node name, #2 the name of the Info cross-reference, #3 the printed % node name, #4 the name of the Info file, #5 the name of the printed % manual. All but the node name can be omitted. % \def\pxref#1{\putwordsee{} \xrefX[#1,,,,,,,]} \def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]} \def\ref#1{\xrefX[#1,,,,,,,]} \def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup \unsepspaces \def\printedmanual{\ignorespaces #5}% \def\printedrefname{\ignorespaces #3}% \setbox1=\hbox{\printedmanual\unskip}% \setbox0=\hbox{\printedrefname\unskip}% \ifdim \wd0 = 0pt % No printed node name was explicitly given. \expandafter\ifx\csname SETxref-automatic-section-title\endcsname\relax % Use the node name inside the square brackets. \def\printedrefname{\ignorespaces #1}% \else % Use the actual chapter/section title appear inside % the square brackets. Use the real section title if we have it. \ifdim \wd1 > 0pt % It is in another manual, so we don't have it. \def\printedrefname{\ignorespaces #1}% \else \ifhavexrefs % We know the real title if we have the xref values. \def\printedrefname{\refx{#1-title}{}}% \else % Otherwise just copy the Info node name. \def\printedrefname{\ignorespaces #1}% \fi% \fi \fi \fi % % Make link in pdf output. \ifpdf \leavevmode \getfilename{#4}% {\indexnofonts \turnoffactive % See comments at \activebackslashdouble. {\activebackslashdouble \xdef\pdfxrefdest{#1}% \backslashparens\pdfxrefdest}% % \ifnum\filenamelength>0 \startlink attr{/Border [0 0 0]}% goto file{\the\filename.pdf} name{\pdfxrefdest}% \else \startlink attr{/Border [0 0 0]}% goto name{\pdfmkpgn{\pdfxrefdest}}% \fi }% \setcolor{\linkcolor}% \fi % % Float references are printed completely differently: "Figure 1.2" % instead of "[somenode], p.3". We distinguish them by the % LABEL-title being set to a magic string. {% % Have to otherify everything special to allow the \csname to % include an _ in the xref name, etc. \indexnofonts \turnoffactive \expandafter\global\expandafter\let\expandafter\Xthisreftitle \csname XR#1-title\endcsname }% \iffloat\Xthisreftitle % If the user specified the print name (third arg) to the ref, % print it instead of our usual "Figure 1.2". \ifdim\wd0 = 0pt \refx{#1-snt}{}% \else \printedrefname \fi % % if the user also gave the printed manual name (fifth arg), append % "in MANUALNAME". \ifdim \wd1 > 0pt \space \putwordin{} \cite{\printedmanual}% \fi \else % node/anchor (non-float) references. % % If we use \unhbox0 and \unhbox1 to print the node names, TeX does not % insert empty discretionaries after hyphens, which means that it will % not find a line break at a hyphen in a node names. Since some manuals % are best written with fairly long node names, containing hyphens, this % is a loss. Therefore, we give the text of the node name again, so it % is as if TeX is seeing it for the first time. \ifdim \wd1 > 0pt \putwordSection{} ``\printedrefname'' \putwordin{} \cite{\printedmanual}% \else % _ (for example) has to be the character _ for the purposes of the % control sequence corresponding to the node, but it has to expand % into the usual \leavevmode...\vrule stuff for purposes of % printing. So we \turnoffactive for the \refx-snt, back on for the % printing, back off for the \refx-pg. {\turnoffactive % Only output a following space if the -snt ref is nonempty; for % @unnumbered and @anchor, it won't be. \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}% \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi }% % output the `[mynode]' via a macro so it can be overridden. \xrefprintnodename\printedrefname % % But we always want a comma and a space: ,\space % % output the `page 3'. \turnoffactive \putwordpage\tie\refx{#1-pg}{}% \fi \fi \endlink \endgroup} % This macro is called from \xrefX for the `[nodename]' part of xref % output. It's a separate macro only so it can be changed more easily, % since square brackets don't work well in some documents. Particularly % one that Bob is working on :). % \def\xrefprintnodename#1{[#1]} % Things referred to by \setref. % \def\Ynothing{} \def\Yomitfromtoc{} \def\Ynumbered{% \ifnum\secno=0 \putwordChapter@tie \the\chapno \else \ifnum\subsecno=0 \putwordSection@tie \the\chapno.\the\secno \else \ifnum\subsubsecno=0 \putwordSection@tie \the\chapno.\the\secno.\the\subsecno \else \putwordSection@tie \the\chapno.\the\secno.\the\subsecno.\the\subsubsecno \fi\fi\fi } \def\Yappendix{% \ifnum\secno=0 \putwordAppendix@tie @char\the\appendixno{}% \else \ifnum\subsecno=0 \putwordSection@tie @char\the\appendixno.\the\secno \else \ifnum\subsubsecno=0 \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno \else \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno \fi\fi\fi } % Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME. % If its value is nonempty, SUFFIX is output afterward. % \def\refx#1#2{% {% \indexnofonts \otherbackslash \expandafter\global\expandafter\let\expandafter\thisrefX \csname XR#1\endcsname }% \ifx\thisrefX\relax % If not defined, say something at least. \angleleft un\-de\-fined\angleright \iflinks \ifhavexrefs \message{\linenumber Undefined cross reference `#1'.}% \else \ifwarnedxrefs\else \global\warnedxrefstrue \message{Cross reference values unknown; you must run TeX again.}% \fi \fi \fi \else % It's defined, so just use it. \thisrefX \fi #2% Output the suffix in any case. } % This is the macro invoked by entries in the aux file. Usually it's % just a \def (we prepend XR to the control sequence name to avoid % collisions). But if this is a float type, we have more work to do. % \def\xrdef#1#2{% {% The node name might contain 8-bit characters, which in our current % implementation are changed to commands like @'e. Don't let these % mess up the control sequence name. \indexnofonts \turnoffactive \xdef\safexrefname{#1}% }% % \expandafter\gdef\csname XR\safexrefname\endcsname{#2}% remember this xref % % Was that xref control sequence that we just defined for a float? \expandafter\iffloat\csname XR\safexrefname\endcsname % it was a float, and we have the (safe) float type in \iffloattype. \expandafter\let\expandafter\floatlist \csname floatlist\iffloattype\endcsname % % Is this the first time we've seen this float type? \expandafter\ifx\floatlist\relax \toks0 = {\do}% yes, so just \do \else % had it before, so preserve previous elements in list. \toks0 = \expandafter{\floatlist\do}% \fi % % Remember this xref in the control sequence \floatlistFLOATTYPE, % for later use in \listoffloats. \expandafter\xdef\csname floatlist\iffloattype\endcsname{\the\toks0 {\safexrefname}}% \fi } % Read the last existing aux file, if any. No error if none exists. % \def\tryauxfile{% \openin 1 \jobname.aux \ifeof 1 \else \readdatafile{aux}% \global\havexrefstrue \fi \closein 1 } \def\setupdatafile{% \catcode`\^^@=\other \catcode`\^^A=\other \catcode`\^^B=\other \catcode`\^^C=\other \catcode`\^^D=\other \catcode`\^^E=\other \catcode`\^^F=\other \catcode`\^^G=\other \catcode`\^^H=\other \catcode`\^^K=\other \catcode`\^^L=\other \catcode`\^^N=\other \catcode`\^^P=\other \catcode`\^^Q=\other \catcode`\^^R=\other \catcode`\^^S=\other \catcode`\^^T=\other \catcode`\^^U=\other \catcode`\^^V=\other \catcode`\^^W=\other \catcode`\^^X=\other \catcode`\^^Z=\other \catcode`\^^[=\other \catcode`\^^\=\other \catcode`\^^]=\other \catcode`\^^^=\other \catcode`\^^_=\other % It was suggested to set the catcode of ^ to 7, which would allow ^^e4 etc. % in xref tags, i.e., node names. But since ^^e4 notation isn't % supported in the main text, it doesn't seem desirable. Furthermore, % that is not enough: for node names that actually contain a ^ % character, we would end up writing a line like this: 'xrdef {'hat % b-title}{'hat b} and \xrdef does a \csname...\endcsname on the first % argument, and \hat is not an expandable control sequence. It could % all be worked out, but why? Either we support ^^ or we don't. % % The other change necessary for this was to define \auxhat: % \def\auxhat{\def^{'hat }}% extra space so ok if followed by letter % and then to call \auxhat in \setq. % \catcode`\^=\other % % Special characters. Should be turned off anyway, but... \catcode`\~=\other \catcode`\[=\other \catcode`\]=\other \catcode`\"=\other \catcode`\_=\other \catcode`\|=\other \catcode`\<=\other \catcode`\>=\other \catcode`\$=\other \catcode`\#=\other \catcode`\&=\other \catcode`\%=\other \catcode`+=\other % avoid \+ for paranoia even though we've turned it off % % This is to support \ in node names and titles, since the \ % characters end up in a \csname. It's easier than % leaving it active and making its active definition an actual \ % character. What I don't understand is why it works in the *value* % of the xrdef. Seems like it should be a catcode12 \, and that % should not typeset properly. But it works, so I'm moving on for % now. --karl, 15jan04. \catcode`\\=\other % % Make the characters 128-255 be printing characters. {% \count1=128 \def\loop{% \catcode\count1=\other \advance\count1 by 1 \ifnum \count1<256 \loop \fi }% }% % % @ is our escape character in .aux files, and we need braces. \catcode`\{=1 \catcode`\}=2 \catcode`\@=0 } \def\readdatafile#1{% \begingroup \setupdatafile \input\jobname.#1 \endgroup} \message{insertions,} % including footnotes. \newcount \footnoteno % The trailing space in the following definition for supereject is % vital for proper filling; pages come out unaligned when you do a % pagealignmacro call if that space before the closing brace is % removed. (Generally, numeric constants should always be followed by a % space to prevent strange expansion errors.) \def\supereject{\par\penalty -20000\footnoteno =0 } % @footnotestyle is meaningful for info output only. \let\footnotestyle=\comment {\catcode `\@=11 % % Auto-number footnotes. Otherwise like plain. \gdef\footnote{% \let\indent=\ptexindent \let\noindent=\ptexnoindent \global\advance\footnoteno by \@ne \edef\thisfootno{$^{\the\footnoteno}$}% % % In case the footnote comes at the end of a sentence, preserve the % extra spacing after we do the footnote number. \let\@sf\empty \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\ptexslash\fi % % Remove inadvertent blank space before typesetting the footnote number. \unskip \thisfootno\@sf \dofootnote }% % Don't bother with the trickery in plain.tex to not require the % footnote text as a parameter. Our footnotes don't need to be so general. % % Oh yes, they do; otherwise, @ifset (and anything else that uses % \parseargline) fails inside footnotes because the tokens are fixed when % the footnote is read. --karl, 16nov96. % \gdef\dofootnote{% \insert\footins\bgroup % We want to typeset this text as a normal paragraph, even if the % footnote reference occurs in (for example) a display environment. % So reset some parameters. \hsize=\pagewidth \interlinepenalty\interfootnotelinepenalty \splittopskip\ht\strutbox % top baseline for broken footnotes \splitmaxdepth\dp\strutbox \floatingpenalty\@MM \leftskip\z@skip \rightskip\z@skip \spaceskip\z@skip \xspaceskip\z@skip \parindent\defaultparindent % \smallfonts \rm % % Because we use hanging indentation in footnotes, a @noindent appears % to exdent this text, so make it be a no-op. makeinfo does not use % hanging indentation so @noindent can still be needed within footnote % text after an @example or the like (not that this is good style). \let\noindent = \relax % % Hang the footnote text off the number. Use \everypar in case the % footnote extends for more than one paragraph. \everypar = {\hang}% \textindent{\thisfootno}% % % Don't crash into the line above the footnote text. Since this % expands into a box, it must come within the paragraph, lest it % provide a place where TeX can split the footnote. \footstrut \futurelet\next\fo@t } }%end \catcode `\@=11 % In case a @footnote appears in a vbox, save the footnote text and create % the real \insert just after the vbox finished. Otherwise, the insertion % would be lost. % Similarily, if a @footnote appears inside an alignment, save the footnote % text to a box and make the \insert when a row of the table is finished. % And the same can be done for other insert classes. --kasal, 16nov03. % Replace the \insert primitive by a cheating macro. % Deeper inside, just make sure that the saved insertions are not spilled % out prematurely. % \def\startsavinginserts{% \ifx \insert\ptexinsert \let\insert\saveinsert \else \let\checkinserts\relax \fi } % This \insert replacement works for both \insert\footins{foo} and % \insert\footins\bgroup foo\egroup, but it doesn't work for \insert27{foo}. % \def\saveinsert#1{% \edef\next{\noexpand\savetobox \makeSAVEname#1}% \afterassignment\next % swallow the left brace \let\temp = } \def\makeSAVEname#1{\makecsname{SAVE\expandafter\gobble\string#1}} \def\savetobox#1{\global\setbox#1 = \vbox\bgroup \unvbox#1} \def\checksaveins#1{\ifvoid#1\else \placesaveins#1\fi} \def\placesaveins#1{% \ptexinsert \csname\expandafter\gobblesave\string#1\endcsname {\box#1}% } % eat @SAVE -- beware, all of them have catcode \other: { \def\dospecials{\do S\do A\do V\do E} \uncatcodespecials % ;-) \gdef\gobblesave @SAVE{} } % initialization: \def\newsaveins #1{% \edef\next{\noexpand\newsaveinsX \makeSAVEname#1}% \next } \def\newsaveinsX #1{% \csname newbox\endcsname #1% \expandafter\def\expandafter\checkinserts\expandafter{\checkinserts \checksaveins #1}% } % initialize: \let\checkinserts\empty \newsaveins\footins \newsaveins\margin % @image. We use the macros from epsf.tex to support this. % If epsf.tex is not installed and @image is used, we complain. % % Check for and read epsf.tex up front. If we read it only at @image % time, we might be inside a group, and then its definitions would get % undone and the next image would fail. \openin 1 = epsf.tex \ifeof 1 \else % Do not bother showing banner with epsf.tex v2.7k (available in % doc/epsf.tex and on ctan). \def\epsfannounce{\toks0 = }% \input epsf.tex \fi \closein 1 % % We will only complain once about lack of epsf.tex. \newif\ifwarnednoepsf \newhelp\noepsfhelp{epsf.tex must be installed for images to work. It is also included in the Texinfo distribution, or you can get it from ftp://tug.org/tex/epsf.tex.} % \def\image#1{% \ifx\epsfbox\undefined \ifwarnednoepsf \else \errhelp = \noepsfhelp \errmessage{epsf.tex not found, images will be ignored}% \global\warnednoepsftrue \fi \else \imagexxx #1,,,,,\finish \fi } % % Arguments to @image: % #1 is (mandatory) image filename; we tack on .eps extension. % #2 is (optional) width, #3 is (optional) height. % #4 is (ignored optional) html alt text. % #5 is (ignored optional) extension. % #6 is just the usual extra ignored arg for parsing this stuff. \newif\ifimagevmode \def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup \catcode`\^^M = 5 % in case we're inside an example \normalturnoffactive % allow _ et al. in names % If the image is by itself, center it. \ifvmode \imagevmodetrue \nobreak\bigskip % Usually we'll have text after the image which will insert % \parskip glue, so insert it here too to equalize the space % above and below. \nobreak\vskip\parskip \nobreak \line\bgroup \fi % % Output the image. \ifpdf \dopdfimage{#1}{#2}{#3}% \else % \epsfbox itself resets \epsf?size at each figure. \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi \setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi \epsfbox{#1.eps}% \fi % \ifimagevmode \egroup \bigbreak \fi % space after the image \endgroup} % @float FLOATTYPE,LABEL,LOC ... @end float for displayed figures, tables, % etc. We don't actually implement floating yet, we always include the % float "here". But it seemed the best name for the future. % \envparseargdef\float{\eatcommaspace\eatcommaspace\dofloat#1, , ,\finish} % There may be a space before second and/or third parameter; delete it. \def\eatcommaspace#1, {#1,} % #1 is the optional FLOATTYPE, the text label for this float, typically % "Figure", "Table", "Example", etc. Can't contain commas. If omitted, % this float will not be numbered and cannot be referred to. % % #2 is the optional xref label. Also must be present for the float to % be referable. % % #3 is the optional positioning argument; for now, it is ignored. It % will somehow specify the positions allowed to float to (here, top, bottom). % % We keep a separate counter for each FLOATTYPE, which we reset at each % chapter-level command. \let\resetallfloatnos=\empty % \def\dofloat#1,#2,#3,#4\finish{% \let\thiscaption=\empty \let\thisshortcaption=\empty % % don't lose footnotes inside @float. % % BEWARE: when the floats start float, we have to issue warning whenever an % insert appears inside a float which could possibly float. --kasal, 26may04 % \startsavinginserts % % We can't be used inside a paragraph. \par % \vtop\bgroup \def\floattype{#1}% \def\floatlabel{#2}% \def\floatloc{#3}% we do nothing with this yet. % \ifx\floattype\empty \let\safefloattype=\empty \else {% % the floattype might have accents or other special characters, % but we need to use it in a control sequence name. \indexnofonts \turnoffactive \xdef\safefloattype{\floattype}% }% \fi % % If label is given but no type, we handle that as the empty type. \ifx\floatlabel\empty \else % We want each FLOATTYPE to be numbered separately (Figure 1, % Table 1, Figure 2, ...). (And if no label, no number.) % \expandafter\getfloatno\csname\safefloattype floatno\endcsname \global\advance\floatno by 1 % {% % This magic value for \lastsection is output by \setref as the % XREFLABEL-title value. \xrefX uses it to distinguish float % labels (which have a completely different output format) from % node and anchor labels. And \xrdef uses it to construct the % lists of floats. % \edef\lastsection{\floatmagic=\safefloattype}% \setref{\floatlabel}{Yfloat}% }% \fi % % start with \parskip glue, I guess. \vskip\parskip % % Don't suppress indentation if a float happens to start a section. \restorefirstparagraphindent } % we have these possibilities: % @float Foo,lbl & @caption{Cap}: Foo 1.1: Cap % @float Foo,lbl & no caption: Foo 1.1 % @float Foo & @caption{Cap}: Foo: Cap % @float Foo & no caption: Foo % @float ,lbl & Caption{Cap}: 1.1: Cap % @float ,lbl & no caption: 1.1 % @float & @caption{Cap}: Cap % @float & no caption: % \def\Efloat{% \let\floatident = \empty % % In all cases, if we have a float type, it comes first. \ifx\floattype\empty \else \def\floatident{\floattype}\fi % % If we have an xref label, the number comes next. \ifx\floatlabel\empty \else \ifx\floattype\empty \else % if also had float type, need tie first. \appendtomacro\floatident{\tie}% \fi % the number. \appendtomacro\floatident{\chaplevelprefix\the\floatno}% \fi % % Start the printed caption with what we've constructed in % \floatident, but keep it separate; we need \floatident again. \let\captionline = \floatident % \ifx\thiscaption\empty \else \ifx\floatident\empty \else \appendtomacro\captionline{: }% had ident, so need a colon between \fi % % caption text. \appendtomacro\captionline{\scanexp\thiscaption}% \fi % % If we have anything to print, print it, with space before. % Eventually this needs to become an \insert. \ifx\captionline\empty \else \vskip.5\parskip \captionline % % Space below caption. \vskip\parskip \fi % % If have an xref label, write the list of floats info. Do this % after the caption, to avoid chance of it being a breakpoint. \ifx\floatlabel\empty \else % Write the text that goes in the lof to the aux file as % \floatlabel-lof. Besides \floatident, we include the short % caption if specified, else the full caption if specified, else nothing. {% \atdummies % % since we read the caption text in the macro world, where ^^M % is turned into a normal character, we have to scan it back, so % we don't write the literal three characters "^^M" into the aux file. \scanexp{% \xdef\noexpand\gtemp{% \ifx\thisshortcaption\empty \thiscaption \else \thisshortcaption \fi }% }% \immediate\write\auxfile{@xrdef{\floatlabel-lof}{\floatident \ifx\gtemp\empty \else : \gtemp \fi}}% }% \fi \egroup % end of \vtop % % place the captured inserts % % BEWARE: when the floats start floating, we have to issue warning % whenever an insert appears inside a float which could possibly % float. --kasal, 26may04 % \checkinserts } % Append the tokens #2 to the definition of macro #1, not expanding either. % \def\appendtomacro#1#2{% \expandafter\def\expandafter#1\expandafter{#1#2}% } % @caption, @shortcaption % \def\caption{\docaption\thiscaption} \def\shortcaption{\docaption\thisshortcaption} \def\docaption{\checkenv\float \bgroup\scanargctxt\defcaption} \def\defcaption#1#2{\egroup \def#1{#2}} % The parameter is the control sequence identifying the counter we are % going to use. Create it if it doesn't exist and assign it to \floatno. \def\getfloatno#1{% \ifx#1\relax % Haven't seen this figure type before. \csname newcount\endcsname #1% % % Remember to reset this floatno at the next chap. \expandafter\gdef\expandafter\resetallfloatnos \expandafter{\resetallfloatnos #1=0 }% \fi \let\floatno#1% } % \setref calls this to get the XREFLABEL-snt value. We want an @xref % to the FLOATLABEL to expand to "Figure 3.1". We call \setref when we % first read the @float command. % \def\Yfloat{\floattype@tie \chaplevelprefix\the\floatno}% % Magic string used for the XREFLABEL-title value, so \xrefX can % distinguish floats from other xref types. \def\floatmagic{!!float!!} % #1 is the control sequence we are passed; we expand into a conditional % which is true if #1 represents a float ref. That is, the magic % \lastsection value which we \setref above. % \def\iffloat#1{\expandafter\doiffloat#1==\finish} % % #1 is (maybe) the \floatmagic string. If so, #2 will be the % (safe) float type for this float. We set \iffloattype to #2. % \def\doiffloat#1=#2=#3\finish{% \def\temp{#1}% \def\iffloattype{#2}% \ifx\temp\floatmagic } % @listoffloats FLOATTYPE - print a list of floats like a table of contents. % \parseargdef\listoffloats{% \def\floattype{#1}% floattype {% % the floattype might have accents or other special characters, % but we need to use it in a control sequence name. \indexnofonts \turnoffactive \xdef\safefloattype{\floattype}% }% % % \xrdef saves the floats as a \do-list in \floatlistSAFEFLOATTYPE. \expandafter\ifx\csname floatlist\safefloattype\endcsname \relax \ifhavexrefs % if the user said @listoffloats foo but never @float foo. \message{\linenumber No `\safefloattype' floats to list.}% \fi \else \begingroup \leftskip=\tocindent % indent these entries like a toc \let\do=\listoffloatsdo \csname floatlist\safefloattype\endcsname \endgroup \fi } % This is called on each entry in a list of floats. We're passed the % xref label, in the form LABEL-title, which is how we save it in the % aux file. We strip off the -title and look up \XRLABEL-lof, which % has the text we're supposed to typeset here. % % Figures without xref labels will not be included in the list (since % they won't appear in the aux file). % \def\listoffloatsdo#1{\listoffloatsdoentry#1\finish} \def\listoffloatsdoentry#1-title\finish{{% % Can't fully expand XR#1-lof because it can contain anything. Just % pass the control sequence. On the other hand, XR#1-pg is just the % page number, and we want to fully expand that so we can get a link % in pdf output. \toksA = \expandafter{\csname XR#1-lof\endcsname}% % % use the same \entry macro we use to generate the TOC and index. \edef\writeentry{\noexpand\entry{\the\toksA}{\csname XR#1-pg\endcsname}}% \writeentry }} \message{localization,} % @documentlanguage is usually given very early, just after % @setfilename. If done too late, it may not override everything % properly. Single argument is the language (de) or locale (de_DE) % abbreviation. It would be nice if we could set up a hyphenation file. % { \catcode`\_ = \active \globaldefs=1 \parseargdef\documentlanguage{\begingroup \let_=\normalunderscore % normal _ character for filenames \tex % read txi-??.tex file in plain TeX. % Read the file by the name they passed if it exists. \openin 1 txi-#1.tex \ifeof 1 \documentlanguagetrywithoutunderscore{#1_\finish}% \else \input txi-#1.tex \fi \closein 1 \endgroup \endgroup} } % % If they passed de_DE, and txi-de_DE.tex doesn't exist, % try txi-de.tex. % \def\documentlanguagetrywithoutunderscore#1_#2\finish{% \openin 1 txi-#1.tex \ifeof 1 \errhelp = \nolanghelp \errmessage{Cannot read language file txi-#1.tex}% \else \input txi-#1.tex \fi \closein 1 } % \newhelp\nolanghelp{The given language definition file cannot be found or is empty. Maybe you need to install it? In the current directory should work if nowhere else does.} % Set the catcode of characters 128 through 255 to the specified number. % \def\setnonasciicharscatcode#1{% \count255=128 \loop\ifnum\count255<256 \global\catcode\count255=#1\relax \advance\count255 by 1 \repeat } \def\setnonasciicharscatcodenonglobal#1{% \count255=128 \loop\ifnum\count255<256 \catcode\count255=#1\relax \advance\count255 by 1 \repeat } % @documentencoding sets the definition of non-ASCII characters % according to the specified encoding. % \parseargdef\documentencoding{% % Encoding being declared for the document. \def\declaredencoding{\csname #1.enc\endcsname}% % % Supported encodings: names converted to tokens in order to be able % to compare them with \ifx. \def\ascii{\csname US-ASCII.enc\endcsname}% \def\latnine{\csname ISO-8859-15.enc\endcsname}% \def\latone{\csname ISO-8859-1.enc\endcsname}% \def\lattwo{\csname ISO-8859-2.enc\endcsname}% \def\utfeight{\csname UTF-8.enc\endcsname}% % \ifx \declaredencoding \ascii \asciichardefs % \else \ifx \declaredencoding \lattwo \setnonasciicharscatcode\active \lattwochardefs % \else \ifx \declaredencoding \latone \setnonasciicharscatcode\active \latonechardefs % \else \ifx \declaredencoding \latnine \setnonasciicharscatcode\active \latninechardefs % \else \ifx \declaredencoding \utfeight \setnonasciicharscatcode\active \utfeightchardefs % \else \message{Unknown document encoding #1, ignoring.}% % \fi % utfeight \fi % latnine \fi % latone \fi % lattwo \fi % ascii } % A message to be logged when using a character that isn't available % the default font encoding (OT1). % \def\missingcharmsg#1{\message{Character missing in OT1 encoding: #1.}} % Take account of \c (plain) vs. \, (Texinfo) difference. \def\cedilla#1{\ifx\c\ptexc\c{#1}\else\,{#1}\fi} % First, make active non-ASCII characters in order for them to be % correctly categorized when TeX reads the replacement text of % macros containing the character definitions. \setnonasciicharscatcode\active % % Latin1 (ISO-8859-1) character definitions. \def\latonechardefs{% \gdef^^a0{~} \gdef^^a1{\exclamdown} \gdef^^a2{\missingcharmsg{CENT SIGN}} \gdef^^a3{{\pounds}} \gdef^^a4{\missingcharmsg{CURRENCY SIGN}} \gdef^^a5{\missingcharmsg{YEN SIGN}} \gdef^^a6{\missingcharmsg{BROKEN BAR}} \gdef^^a7{\S} \gdef^^a8{\"{}} \gdef^^a9{\copyright} \gdef^^aa{\ordf} \gdef^^ab{\missingcharmsg{LEFT-POINTING DOUBLE ANGLE QUOTATION MARK}} \gdef^^ac{$\lnot$} \gdef^^ad{\-} \gdef^^ae{\registeredsymbol} \gdef^^af{\={}} % \gdef^^b0{\textdegree} \gdef^^b1{$\pm$} \gdef^^b2{$^2$} \gdef^^b3{$^3$} \gdef^^b4{\'{}} \gdef^^b5{$\mu$} \gdef^^b6{\P} % \gdef^^b7{$^.$} \gdef^^b8{\cedilla\ } \gdef^^b9{$^1$} \gdef^^ba{\ordm} % \gdef^^bb{\missingcharmsg{RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK}} \gdef^^bc{$1\over4$} \gdef^^bd{$1\over2$} \gdef^^be{$3\over4$} \gdef^^bf{\questiondown} % \gdef^^c0{\`A} \gdef^^c1{\'A} \gdef^^c2{\^A} \gdef^^c3{\~A} \gdef^^c4{\"A} \gdef^^c5{\ringaccent A} \gdef^^c6{\AE} \gdef^^c7{\cedilla C} \gdef^^c8{\`E} \gdef^^c9{\'E} \gdef^^ca{\^E} \gdef^^cb{\"E} \gdef^^cc{\`I} \gdef^^cd{\'I} \gdef^^ce{\^I} \gdef^^cf{\"I} % \gdef^^d0{\missingcharmsg{LATIN CAPITAL LETTER ETH}} \gdef^^d1{\~N} \gdef^^d2{\`O} \gdef^^d3{\'O} \gdef^^d4{\^O} \gdef^^d5{\~O} \gdef^^d6{\"O} \gdef^^d7{$\times$} \gdef^^d8{\O} \gdef^^d9{\`U} \gdef^^da{\'U} \gdef^^db{\^U} \gdef^^dc{\"U} \gdef^^dd{\'Y} \gdef^^de{\missingcharmsg{LATIN CAPITAL LETTER THORN}} \gdef^^df{\ss} % \gdef^^e0{\`a} \gdef^^e1{\'a} \gdef^^e2{\^a} \gdef^^e3{\~a} \gdef^^e4{\"a} \gdef^^e5{\ringaccent a} \gdef^^e6{\ae} \gdef^^e7{\cedilla c} \gdef^^e8{\`e} \gdef^^e9{\'e} \gdef^^ea{\^e} \gdef^^eb{\"e} \gdef^^ec{\`{\dotless i}} \gdef^^ed{\'{\dotless i}} \gdef^^ee{\^{\dotless i}} \gdef^^ef{\"{\dotless i}} % \gdef^^f0{\missingcharmsg{LATIN SMALL LETTER ETH}} \gdef^^f1{\~n} \gdef^^f2{\`o} \gdef^^f3{\'o} \gdef^^f4{\^o} \gdef^^f5{\~o} \gdef^^f6{\"o} \gdef^^f7{$\div$} \gdef^^f8{\o} \gdef^^f9{\`u} \gdef^^fa{\'u} \gdef^^fb{\^u} \gdef^^fc{\"u} \gdef^^fd{\'y} \gdef^^fe{\missingcharmsg{LATIN SMALL LETTER THORN}} \gdef^^ff{\"y} } % Latin9 (ISO-8859-15) encoding character definitions. \def\latninechardefs{% % Encoding is almost identical to Latin1. \latonechardefs % \gdef^^a4{\euro} \gdef^^a6{\v S} \gdef^^a8{\v s} \gdef^^b4{\v Z} \gdef^^b8{\v z} \gdef^^bc{\OE} \gdef^^bd{\oe} \gdef^^be{\"Y} } % Latin2 (ISO-8859-2) character definitions. \def\lattwochardefs{% \gdef^^a0{~} \gdef^^a1{\missingcharmsg{LATIN CAPITAL LETTER A WITH OGONEK}} \gdef^^a2{\u{}} \gdef^^a3{\L} \gdef^^a4{\missingcharmsg{CURRENCY SIGN}} \gdef^^a5{\v L} \gdef^^a6{\'S} \gdef^^a7{\S} \gdef^^a8{\"{}} \gdef^^a9{\v S} \gdef^^aa{\cedilla S} \gdef^^ab{\v T} \gdef^^ac{\'Z} \gdef^^ad{\-} \gdef^^ae{\v Z} \gdef^^af{\dotaccent Z} % \gdef^^b0{\textdegree} \gdef^^b1{\missingcharmsg{LATIN SMALL LETTER A WITH OGONEK}} \gdef^^b2{\missingcharmsg{OGONEK}} \gdef^^b3{\l} \gdef^^b4{\'{}} \gdef^^b5{\v l} \gdef^^b6{\'s} \gdef^^b7{\v{}} \gdef^^b8{\cedilla\ } \gdef^^b9{\v s} \gdef^^ba{\cedilla s} \gdef^^bb{\v t} \gdef^^bc{\'z} \gdef^^bd{\H{}} \gdef^^be{\v z} \gdef^^bf{\dotaccent z} % \gdef^^c0{\'R} \gdef^^c1{\'A} \gdef^^c2{\^A} \gdef^^c3{\u A} \gdef^^c4{\"A} \gdef^^c5{\'L} \gdef^^c6{\'C} \gdef^^c7{\cedilla C} \gdef^^c8{\v C} \gdef^^c9{\'E} \gdef^^ca{\missingcharmsg{LATIN CAPITAL LETTER E WITH OGONEK}} \gdef^^cb{\"E} \gdef^^cc{\v E} \gdef^^cd{\'I} \gdef^^ce{\^I} \gdef^^cf{\v D} % \gdef^^d0{\missingcharmsg{LATIN CAPITAL LETTER D WITH STROKE}} \gdef^^d1{\'N} \gdef^^d2{\v N} \gdef^^d3{\'O} \gdef^^d4{\^O} \gdef^^d5{\H O} \gdef^^d6{\"O} \gdef^^d7{$\times$} \gdef^^d8{\v R} \gdef^^d9{\ringaccent U} \gdef^^da{\'U} \gdef^^db{\H U} \gdef^^dc{\"U} \gdef^^dd{\'Y} \gdef^^de{\cedilla T} \gdef^^df{\ss} % \gdef^^e0{\'r} \gdef^^e1{\'a} \gdef^^e2{\^a} \gdef^^e3{\u a} \gdef^^e4{\"a} \gdef^^e5{\'l} \gdef^^e6{\'c} \gdef^^e7{\cedilla c} \gdef^^e8{\v c} \gdef^^e9{\'e} \gdef^^ea{\missingcharmsg{LATIN SMALL LETTER E WITH OGONEK}} \gdef^^eb{\"e} \gdef^^ec{\v e} \gdef^^ed{\'\i} \gdef^^ee{\^\i} \gdef^^ef{\v d} % \gdef^^f0{\missingcharmsg{LATIN SMALL LETTER D WITH STROKE}} \gdef^^f1{\'n} \gdef^^f2{\v n} \gdef^^f3{\'o} \gdef^^f4{\^o} \gdef^^f5{\H o} \gdef^^f6{\"o} \gdef^^f7{$\div$} \gdef^^f8{\v r} \gdef^^f9{\ringaccent u} \gdef^^fa{\'u} \gdef^^fb{\H u} \gdef^^fc{\"u} \gdef^^fd{\'y} \gdef^^fe{\cedilla t} \gdef^^ff{\dotaccent{}} } % UTF-8 character definitions. % % This code to support UTF-8 is based on LaTeX's utf8.def, with some % changes for Texinfo conventions. It is included here under the GPL by % permission from Frank Mittelbach and the LaTeX team. % \newcount\countUTFx \newcount\countUTFy \newcount\countUTFz \gdef\UTFviiiTwoOctets#1#2{\expandafter \UTFviiiDefined\csname u8:#1\string #2\endcsname} % \gdef\UTFviiiThreeOctets#1#2#3{\expandafter \UTFviiiDefined\csname u8:#1\string #2\string #3\endcsname} % \gdef\UTFviiiFourOctets#1#2#3#4{\expandafter \UTFviiiDefined\csname u8:#1\string #2\string #3\string #4\endcsname} \gdef\UTFviiiDefined#1{% \ifx #1\relax \message{\linenumber Unicode char \string #1 not defined for Texinfo}% \else \expandafter #1% \fi } \begingroup \catcode`\~13 \catcode`\"12 \def\UTFviiiLoop{% \global\catcode\countUTFx\active \uccode`\~\countUTFx \uppercase\expandafter{\UTFviiiTmp}% \advance\countUTFx by 1 \ifnum\countUTFx < \countUTFy \expandafter\UTFviiiLoop \fi} \countUTFx = "C2 \countUTFy = "E0 \def\UTFviiiTmp{% \xdef~{\noexpand\UTFviiiTwoOctets\string~}} \UTFviiiLoop \countUTFx = "E0 \countUTFy = "F0 \def\UTFviiiTmp{% \xdef~{\noexpand\UTFviiiThreeOctets\string~}} \UTFviiiLoop \countUTFx = "F0 \countUTFy = "F4 \def\UTFviiiTmp{% \xdef~{\noexpand\UTFviiiFourOctets\string~}} \UTFviiiLoop \endgroup \begingroup \catcode`\"=12 \catcode`\<=12 \catcode`\.=12 \catcode`\,=12 \catcode`\;=12 \catcode`\!=12 \catcode`\~=13 \gdef\DeclareUnicodeCharacter#1#2{% \countUTFz = "#1\relax \wlog{\space\space defining Unicode char U+#1 (decimal \the\countUTFz)}% \begingroup \parseXMLCharref \def\UTFviiiTwoOctets##1##2{% \csname u8:##1\string ##2\endcsname}% \def\UTFviiiThreeOctets##1##2##3{% \csname u8:##1\string ##2\string ##3\endcsname}% \def\UTFviiiFourOctets##1##2##3##4{% \csname u8:##1\string ##2\string ##3\string ##4\endcsname}% \expandafter\expandafter\expandafter\expandafter \expandafter\expandafter\expandafter \gdef\UTFviiiTmp{#2}% \endgroup} \gdef\parseXMLCharref{% \ifnum\countUTFz < "A0\relax \errhelp = \EMsimple \errmessage{Cannot define Unicode char value < 00A0}% \else\ifnum\countUTFz < "800\relax \parseUTFviiiA,% \parseUTFviiiB C\UTFviiiTwoOctets.,% \else\ifnum\countUTFz < "10000\relax \parseUTFviiiA;% \parseUTFviiiA,% \parseUTFviiiB E\UTFviiiThreeOctets.{,;}% \else \parseUTFviiiA;% \parseUTFviiiA,% \parseUTFviiiA!% \parseUTFviiiB F\UTFviiiFourOctets.{!,;}% \fi\fi\fi } \gdef\parseUTFviiiA#1{% \countUTFx = \countUTFz \divide\countUTFz by 64 \countUTFy = \countUTFz \multiply\countUTFz by 64 \advance\countUTFx by -\countUTFz \advance\countUTFx by 128 \uccode `#1\countUTFx \countUTFz = \countUTFy} \gdef\parseUTFviiiB#1#2#3#4{% \advance\countUTFz by "#10\relax \uccode `#3\countUTFz \uppercase{\gdef\UTFviiiTmp{#2#3#4}}} \endgroup \def\utfeightchardefs{% \DeclareUnicodeCharacter{00A0}{\tie} \DeclareUnicodeCharacter{00A1}{\exclamdown} \DeclareUnicodeCharacter{00A3}{\pounds} \DeclareUnicodeCharacter{00A8}{\"{ }} \DeclareUnicodeCharacter{00A9}{\copyright} \DeclareUnicodeCharacter{00AA}{\ordf} \DeclareUnicodeCharacter{00AB}{\guillemetleft} \DeclareUnicodeCharacter{00AD}{\-} \DeclareUnicodeCharacter{00AE}{\registeredsymbol} \DeclareUnicodeCharacter{00AF}{\={ }} \DeclareUnicodeCharacter{00B0}{\ringaccent{ }} \DeclareUnicodeCharacter{00B4}{\'{ }} \DeclareUnicodeCharacter{00B8}{\cedilla{ }} \DeclareUnicodeCharacter{00BA}{\ordm} \DeclareUnicodeCharacter{00BB}{\guillemetright} \DeclareUnicodeCharacter{00BF}{\questiondown} \DeclareUnicodeCharacter{00C0}{\`A} \DeclareUnicodeCharacter{00C1}{\'A} \DeclareUnicodeCharacter{00C2}{\^A} \DeclareUnicodeCharacter{00C3}{\~A} \DeclareUnicodeCharacter{00C4}{\"A} \DeclareUnicodeCharacter{00C5}{\AA} \DeclareUnicodeCharacter{00C6}{\AE} \DeclareUnicodeCharacter{00C7}{\cedilla{C}} \DeclareUnicodeCharacter{00C8}{\`E} \DeclareUnicodeCharacter{00C9}{\'E} \DeclareUnicodeCharacter{00CA}{\^E} \DeclareUnicodeCharacter{00CB}{\"E} \DeclareUnicodeCharacter{00CC}{\`I} \DeclareUnicodeCharacter{00CD}{\'I} \DeclareUnicodeCharacter{00CE}{\^I} \DeclareUnicodeCharacter{00CF}{\"I} \DeclareUnicodeCharacter{00D1}{\~N} \DeclareUnicodeCharacter{00D2}{\`O} \DeclareUnicodeCharacter{00D3}{\'O} \DeclareUnicodeCharacter{00D4}{\^O} \DeclareUnicodeCharacter{00D5}{\~O} \DeclareUnicodeCharacter{00D6}{\"O} \DeclareUnicodeCharacter{00D8}{\O} \DeclareUnicodeCharacter{00D9}{\`U} \DeclareUnicodeCharacter{00DA}{\'U} \DeclareUnicodeCharacter{00DB}{\^U} \DeclareUnicodeCharacter{00DC}{\"U} \DeclareUnicodeCharacter{00DD}{\'Y} \DeclareUnicodeCharacter{00DF}{\ss} \DeclareUnicodeCharacter{00E0}{\`a} \DeclareUnicodeCharacter{00E1}{\'a} \DeclareUnicodeCharacter{00E2}{\^a} \DeclareUnicodeCharacter{00E3}{\~a} \DeclareUnicodeCharacter{00E4}{\"a} \DeclareUnicodeCharacter{00E5}{\aa} \DeclareUnicodeCharacter{00E6}{\ae} \DeclareUnicodeCharacter{00E7}{\cedilla{c}} \DeclareUnicodeCharacter{00E8}{\`e} \DeclareUnicodeCharacter{00E9}{\'e} \DeclareUnicodeCharacter{00EA}{\^e} \DeclareUnicodeCharacter{00EB}{\"e} \DeclareUnicodeCharacter{00EC}{\`{\dotless{i}}} \DeclareUnicodeCharacter{00ED}{\'{\dotless{i}}} \DeclareUnicodeCharacter{00EE}{\^{\dotless{i}}} \DeclareUnicodeCharacter{00EF}{\"{\dotless{i}}} \DeclareUnicodeCharacter{00F1}{\~n} \DeclareUnicodeCharacter{00F2}{\`o} \DeclareUnicodeCharacter{00F3}{\'o} \DeclareUnicodeCharacter{00F4}{\^o} \DeclareUnicodeCharacter{00F5}{\~o} \DeclareUnicodeCharacter{00F6}{\"o} \DeclareUnicodeCharacter{00F8}{\o} \DeclareUnicodeCharacter{00F9}{\`u} \DeclareUnicodeCharacter{00FA}{\'u} \DeclareUnicodeCharacter{00FB}{\^u} \DeclareUnicodeCharacter{00FC}{\"u} \DeclareUnicodeCharacter{00FD}{\'y} \DeclareUnicodeCharacter{00FF}{\"y} \DeclareUnicodeCharacter{0100}{\=A} \DeclareUnicodeCharacter{0101}{\=a} \DeclareUnicodeCharacter{0102}{\u{A}} \DeclareUnicodeCharacter{0103}{\u{a}} \DeclareUnicodeCharacter{0106}{\'C} \DeclareUnicodeCharacter{0107}{\'c} \DeclareUnicodeCharacter{0108}{\^C} \DeclareUnicodeCharacter{0109}{\^c} \DeclareUnicodeCharacter{010A}{\dotaccent{C}} \DeclareUnicodeCharacter{010B}{\dotaccent{c}} \DeclareUnicodeCharacter{010C}{\v{C}} \DeclareUnicodeCharacter{010D}{\v{c}} \DeclareUnicodeCharacter{010E}{\v{D}} \DeclareUnicodeCharacter{0112}{\=E} \DeclareUnicodeCharacter{0113}{\=e} \DeclareUnicodeCharacter{0114}{\u{E}} \DeclareUnicodeCharacter{0115}{\u{e}} \DeclareUnicodeCharacter{0116}{\dotaccent{E}} \DeclareUnicodeCharacter{0117}{\dotaccent{e}} \DeclareUnicodeCharacter{011A}{\v{E}} \DeclareUnicodeCharacter{011B}{\v{e}} \DeclareUnicodeCharacter{011C}{\^G} \DeclareUnicodeCharacter{011D}{\^g} \DeclareUnicodeCharacter{011E}{\u{G}} \DeclareUnicodeCharacter{011F}{\u{g}} \DeclareUnicodeCharacter{0120}{\dotaccent{G}} \DeclareUnicodeCharacter{0121}{\dotaccent{g}} \DeclareUnicodeCharacter{0124}{\^H} \DeclareUnicodeCharacter{0125}{\^h} \DeclareUnicodeCharacter{0128}{\~I} \DeclareUnicodeCharacter{0129}{\~{\dotless{i}}} \DeclareUnicodeCharacter{012A}{\=I} \DeclareUnicodeCharacter{012B}{\={\dotless{i}}} \DeclareUnicodeCharacter{012C}{\u{I}} \DeclareUnicodeCharacter{012D}{\u{\dotless{i}}} \DeclareUnicodeCharacter{0130}{\dotaccent{I}} \DeclareUnicodeCharacter{0131}{\dotless{i}} \DeclareUnicodeCharacter{0132}{IJ} \DeclareUnicodeCharacter{0133}{ij} \DeclareUnicodeCharacter{0134}{\^J} \DeclareUnicodeCharacter{0135}{\^{\dotless{j}}} \DeclareUnicodeCharacter{0139}{\'L} \DeclareUnicodeCharacter{013A}{\'l} \DeclareUnicodeCharacter{0141}{\L} \DeclareUnicodeCharacter{0142}{\l} \DeclareUnicodeCharacter{0143}{\'N} \DeclareUnicodeCharacter{0144}{\'n} \DeclareUnicodeCharacter{0147}{\v{N}} \DeclareUnicodeCharacter{0148}{\v{n}} \DeclareUnicodeCharacter{014C}{\=O} \DeclareUnicodeCharacter{014D}{\=o} \DeclareUnicodeCharacter{014E}{\u{O}} \DeclareUnicodeCharacter{014F}{\u{o}} \DeclareUnicodeCharacter{0150}{\H{O}} \DeclareUnicodeCharacter{0151}{\H{o}} \DeclareUnicodeCharacter{0152}{\OE} \DeclareUnicodeCharacter{0153}{\oe} \DeclareUnicodeCharacter{0154}{\'R} \DeclareUnicodeCharacter{0155}{\'r} \DeclareUnicodeCharacter{0158}{\v{R}} \DeclareUnicodeCharacter{0159}{\v{r}} \DeclareUnicodeCharacter{015A}{\'S} \DeclareUnicodeCharacter{015B}{\'s} \DeclareUnicodeCharacter{015C}{\^S} \DeclareUnicodeCharacter{015D}{\^s} \DeclareUnicodeCharacter{015E}{\cedilla{S}} \DeclareUnicodeCharacter{015F}{\cedilla{s}} \DeclareUnicodeCharacter{0160}{\v{S}} \DeclareUnicodeCharacter{0161}{\v{s}} \DeclareUnicodeCharacter{0162}{\cedilla{t}} \DeclareUnicodeCharacter{0163}{\cedilla{T}} \DeclareUnicodeCharacter{0164}{\v{T}} \DeclareUnicodeCharacter{0168}{\~U} \DeclareUnicodeCharacter{0169}{\~u} \DeclareUnicodeCharacter{016A}{\=U} \DeclareUnicodeCharacter{016B}{\=u} \DeclareUnicodeCharacter{016C}{\u{U}} \DeclareUnicodeCharacter{016D}{\u{u}} \DeclareUnicodeCharacter{016E}{\ringaccent{U}} \DeclareUnicodeCharacter{016F}{\ringaccent{u}} \DeclareUnicodeCharacter{0170}{\H{U}} \DeclareUnicodeCharacter{0171}{\H{u}} \DeclareUnicodeCharacter{0174}{\^W} \DeclareUnicodeCharacter{0175}{\^w} \DeclareUnicodeCharacter{0176}{\^Y} \DeclareUnicodeCharacter{0177}{\^y} \DeclareUnicodeCharacter{0178}{\"Y} \DeclareUnicodeCharacter{0179}{\'Z} \DeclareUnicodeCharacter{017A}{\'z} \DeclareUnicodeCharacter{017B}{\dotaccent{Z}} \DeclareUnicodeCharacter{017C}{\dotaccent{z}} \DeclareUnicodeCharacter{017D}{\v{Z}} \DeclareUnicodeCharacter{017E}{\v{z}} \DeclareUnicodeCharacter{01C4}{D\v{Z}} \DeclareUnicodeCharacter{01C5}{D\v{z}} \DeclareUnicodeCharacter{01C6}{d\v{z}} \DeclareUnicodeCharacter{01C7}{LJ} \DeclareUnicodeCharacter{01C8}{Lj} \DeclareUnicodeCharacter{01C9}{lj} \DeclareUnicodeCharacter{01CA}{NJ} \DeclareUnicodeCharacter{01CB}{Nj} \DeclareUnicodeCharacter{01CC}{nj} \DeclareUnicodeCharacter{01CD}{\v{A}} \DeclareUnicodeCharacter{01CE}{\v{a}} \DeclareUnicodeCharacter{01CF}{\v{I}} \DeclareUnicodeCharacter{01D0}{\v{\dotless{i}}} \DeclareUnicodeCharacter{01D1}{\v{O}} \DeclareUnicodeCharacter{01D2}{\v{o}} \DeclareUnicodeCharacter{01D3}{\v{U}} \DeclareUnicodeCharacter{01D4}{\v{u}} \DeclareUnicodeCharacter{01E2}{\={\AE}} \DeclareUnicodeCharacter{01E3}{\={\ae}} \DeclareUnicodeCharacter{01E6}{\v{G}} \DeclareUnicodeCharacter{01E7}{\v{g}} \DeclareUnicodeCharacter{01E8}{\v{K}} \DeclareUnicodeCharacter{01E9}{\v{k}} \DeclareUnicodeCharacter{01F0}{\v{\dotless{j}}} \DeclareUnicodeCharacter{01F1}{DZ} \DeclareUnicodeCharacter{01F2}{Dz} \DeclareUnicodeCharacter{01F3}{dz} \DeclareUnicodeCharacter{01F4}{\'G} \DeclareUnicodeCharacter{01F5}{\'g} \DeclareUnicodeCharacter{01F8}{\`N} \DeclareUnicodeCharacter{01F9}{\`n} \DeclareUnicodeCharacter{01FC}{\'{\AE}} \DeclareUnicodeCharacter{01FD}{\'{\ae}} \DeclareUnicodeCharacter{01FE}{\'{\O}} \DeclareUnicodeCharacter{01FF}{\'{\o}} \DeclareUnicodeCharacter{021E}{\v{H}} \DeclareUnicodeCharacter{021F}{\v{h}} \DeclareUnicodeCharacter{0226}{\dotaccent{A}} \DeclareUnicodeCharacter{0227}{\dotaccent{a}} \DeclareUnicodeCharacter{0228}{\cedilla{E}} \DeclareUnicodeCharacter{0229}{\cedilla{e}} \DeclareUnicodeCharacter{022E}{\dotaccent{O}} \DeclareUnicodeCharacter{022F}{\dotaccent{o}} \DeclareUnicodeCharacter{0232}{\=Y} \DeclareUnicodeCharacter{0233}{\=y} \DeclareUnicodeCharacter{0237}{\dotless{j}} \DeclareUnicodeCharacter{1E02}{\dotaccent{B}} \DeclareUnicodeCharacter{1E03}{\dotaccent{b}} \DeclareUnicodeCharacter{1E04}{\udotaccent{B}} \DeclareUnicodeCharacter{1E05}{\udotaccent{b}} \DeclareUnicodeCharacter{1E06}{\ubaraccent{B}} \DeclareUnicodeCharacter{1E07}{\ubaraccent{b}} \DeclareUnicodeCharacter{1E0A}{\dotaccent{D}} \DeclareUnicodeCharacter{1E0B}{\dotaccent{d}} \DeclareUnicodeCharacter{1E0C}{\udotaccent{D}} \DeclareUnicodeCharacter{1E0D}{\udotaccent{d}} \DeclareUnicodeCharacter{1E0E}{\ubaraccent{D}} \DeclareUnicodeCharacter{1E0F}{\ubaraccent{d}} \DeclareUnicodeCharacter{1E1E}{\dotaccent{F}} \DeclareUnicodeCharacter{1E1F}{\dotaccent{f}} \DeclareUnicodeCharacter{1E20}{\=G} \DeclareUnicodeCharacter{1E21}{\=g} \DeclareUnicodeCharacter{1E22}{\dotaccent{H}} \DeclareUnicodeCharacter{1E23}{\dotaccent{h}} \DeclareUnicodeCharacter{1E24}{\udotaccent{H}} \DeclareUnicodeCharacter{1E25}{\udotaccent{h}} \DeclareUnicodeCharacter{1E26}{\"H} \DeclareUnicodeCharacter{1E27}{\"h} \DeclareUnicodeCharacter{1E30}{\'K} \DeclareUnicodeCharacter{1E31}{\'k} \DeclareUnicodeCharacter{1E32}{\udotaccent{K}} \DeclareUnicodeCharacter{1E33}{\udotaccent{k}} \DeclareUnicodeCharacter{1E34}{\ubaraccent{K}} \DeclareUnicodeCharacter{1E35}{\ubaraccent{k}} \DeclareUnicodeCharacter{1E36}{\udotaccent{L}} \DeclareUnicodeCharacter{1E37}{\udotaccent{l}} \DeclareUnicodeCharacter{1E3A}{\ubaraccent{L}} \DeclareUnicodeCharacter{1E3B}{\ubaraccent{l}} \DeclareUnicodeCharacter{1E3E}{\'M} \DeclareUnicodeCharacter{1E3F}{\'m} \DeclareUnicodeCharacter{1E40}{\dotaccent{M}} \DeclareUnicodeCharacter{1E41}{\dotaccent{m}} \DeclareUnicodeCharacter{1E42}{\udotaccent{M}} \DeclareUnicodeCharacter{1E43}{\udotaccent{m}} \DeclareUnicodeCharacter{1E44}{\dotaccent{N}} \DeclareUnicodeCharacter{1E45}{\dotaccent{n}} \DeclareUnicodeCharacter{1E46}{\udotaccent{N}} \DeclareUnicodeCharacter{1E47}{\udotaccent{n}} \DeclareUnicodeCharacter{1E48}{\ubaraccent{N}} \DeclareUnicodeCharacter{1E49}{\ubaraccent{n}} \DeclareUnicodeCharacter{1E54}{\'P} \DeclareUnicodeCharacter{1E55}{\'p} \DeclareUnicodeCharacter{1E56}{\dotaccent{P}} \DeclareUnicodeCharacter{1E57}{\dotaccent{p}} \DeclareUnicodeCharacter{1E58}{\dotaccent{R}} \DeclareUnicodeCharacter{1E59}{\dotaccent{r}} \DeclareUnicodeCharacter{1E5A}{\udotaccent{R}} \DeclareUnicodeCharacter{1E5B}{\udotaccent{r}} \DeclareUnicodeCharacter{1E5E}{\ubaraccent{R}} \DeclareUnicodeCharacter{1E5F}{\ubaraccent{r}} \DeclareUnicodeCharacter{1E60}{\dotaccent{S}} \DeclareUnicodeCharacter{1E61}{\dotaccent{s}} \DeclareUnicodeCharacter{1E62}{\udotaccent{S}} \DeclareUnicodeCharacter{1E63}{\udotaccent{s}} \DeclareUnicodeCharacter{1E6A}{\dotaccent{T}} \DeclareUnicodeCharacter{1E6B}{\dotaccent{t}} \DeclareUnicodeCharacter{1E6C}{\udotaccent{T}} \DeclareUnicodeCharacter{1E6D}{\udotaccent{t}} \DeclareUnicodeCharacter{1E6E}{\ubaraccent{T}} \DeclareUnicodeCharacter{1E6F}{\ubaraccent{t}} \DeclareUnicodeCharacter{1E7C}{\~V} \DeclareUnicodeCharacter{1E7D}{\~v} \DeclareUnicodeCharacter{1E7E}{\udotaccent{V}} \DeclareUnicodeCharacter{1E7F}{\udotaccent{v}} \DeclareUnicodeCharacter{1E80}{\`W} \DeclareUnicodeCharacter{1E81}{\`w} \DeclareUnicodeCharacter{1E82}{\'W} \DeclareUnicodeCharacter{1E83}{\'w} \DeclareUnicodeCharacter{1E84}{\"W} \DeclareUnicodeCharacter{1E85}{\"w} \DeclareUnicodeCharacter{1E86}{\dotaccent{W}} \DeclareUnicodeCharacter{1E87}{\dotaccent{w}} \DeclareUnicodeCharacter{1E88}{\udotaccent{W}} \DeclareUnicodeCharacter{1E89}{\udotaccent{w}} \DeclareUnicodeCharacter{1E8A}{\dotaccent{X}} \DeclareUnicodeCharacter{1E8B}{\dotaccent{x}} \DeclareUnicodeCharacter{1E8C}{\"X} \DeclareUnicodeCharacter{1E8D}{\"x} \DeclareUnicodeCharacter{1E8E}{\dotaccent{Y}} \DeclareUnicodeCharacter{1E8F}{\dotaccent{y}} \DeclareUnicodeCharacter{1E90}{\^Z} \DeclareUnicodeCharacter{1E91}{\^z} \DeclareUnicodeCharacter{1E92}{\udotaccent{Z}} \DeclareUnicodeCharacter{1E93}{\udotaccent{z}} \DeclareUnicodeCharacter{1E94}{\ubaraccent{Z}} \DeclareUnicodeCharacter{1E95}{\ubaraccent{z}} \DeclareUnicodeCharacter{1E96}{\ubaraccent{h}} \DeclareUnicodeCharacter{1E97}{\"t} \DeclareUnicodeCharacter{1E98}{\ringaccent{w}} \DeclareUnicodeCharacter{1E99}{\ringaccent{y}} \DeclareUnicodeCharacter{1EA0}{\udotaccent{A}} \DeclareUnicodeCharacter{1EA1}{\udotaccent{a}} \DeclareUnicodeCharacter{1EB8}{\udotaccent{E}} \DeclareUnicodeCharacter{1EB9}{\udotaccent{e}} \DeclareUnicodeCharacter{1EBC}{\~E} \DeclareUnicodeCharacter{1EBD}{\~e} \DeclareUnicodeCharacter{1ECA}{\udotaccent{I}} \DeclareUnicodeCharacter{1ECB}{\udotaccent{i}} \DeclareUnicodeCharacter{1ECC}{\udotaccent{O}} \DeclareUnicodeCharacter{1ECD}{\udotaccent{o}} \DeclareUnicodeCharacter{1EE4}{\udotaccent{U}} \DeclareUnicodeCharacter{1EE5}{\udotaccent{u}} \DeclareUnicodeCharacter{1EF2}{\`Y} \DeclareUnicodeCharacter{1EF3}{\`y} \DeclareUnicodeCharacter{1EF4}{\udotaccent{Y}} \DeclareUnicodeCharacter{1EF8}{\~Y} \DeclareUnicodeCharacter{1EF9}{\~y} \DeclareUnicodeCharacter{2013}{--} \DeclareUnicodeCharacter{2014}{---} \DeclareUnicodeCharacter{2018}{\quoteleft} \DeclareUnicodeCharacter{2019}{\quoteright} \DeclareUnicodeCharacter{201A}{\quotesinglbase} \DeclareUnicodeCharacter{201C}{\quotedblleft} \DeclareUnicodeCharacter{201D}{\quotedblright} \DeclareUnicodeCharacter{201E}{\quotedblbase} \DeclareUnicodeCharacter{2022}{\bullet} \DeclareUnicodeCharacter{2026}{\dots} \DeclareUnicodeCharacter{2039}{\guilsinglleft} \DeclareUnicodeCharacter{203A}{\guilsinglright} \DeclareUnicodeCharacter{20AC}{\euro} \DeclareUnicodeCharacter{2192}{\expansion} \DeclareUnicodeCharacter{21D2}{\result} \DeclareUnicodeCharacter{2212}{\minus} \DeclareUnicodeCharacter{2217}{\point} \DeclareUnicodeCharacter{2261}{\equiv} }% end of \utfeightchardefs % US-ASCII character definitions. \def\asciichardefs{% nothing need be done \relax } % Make non-ASCII characters printable again for compatibility with % existing Texinfo documents that may use them, even without declaring a % document encoding. % \setnonasciicharscatcode \other \message{formatting,} \newdimen\defaultparindent \defaultparindent = 15pt \chapheadingskip = 15pt plus 4pt minus 2pt \secheadingskip = 12pt plus 3pt minus 2pt \subsecheadingskip = 9pt plus 2pt minus 2pt % Prevent underfull vbox error messages. \vbadness = 10000 % Don't be so finicky about underfull hboxes, either. \hbadness = 2000 % Following George Bush, get rid of widows and orphans. \widowpenalty=10000 \clubpenalty=10000 % Use TeX 3.0's \emergencystretch to help line breaking, but if we're % using an old version of TeX, don't do anything. We want the amount of % stretch added to depend on the line length, hence the dependence on % \hsize. We call this whenever the paper size is set. % \def\setemergencystretch{% \ifx\emergencystretch\thisisundefined % Allow us to assign to \emergencystretch anyway. \def\emergencystretch{\dimen0}% \else \emergencystretch = .15\hsize \fi } % Parameters in order: 1) textheight; 2) textwidth; % 3) voffset; 4) hoffset; 5) binding offset; 6) topskip; % 7) physical page height; 8) physical page width. % % We also call \setleading{\textleading}, so the caller should define % \textleading. The caller should also set \parskip. % \def\internalpagesizes#1#2#3#4#5#6#7#8{% \voffset = #3\relax \topskip = #6\relax \splittopskip = \topskip % \vsize = #1\relax \advance\vsize by \topskip \outervsize = \vsize \advance\outervsize by 2\topandbottommargin \pageheight = \vsize % \hsize = #2\relax \outerhsize = \hsize \advance\outerhsize by 0.5in \pagewidth = \hsize % \normaloffset = #4\relax \bindingoffset = #5\relax % \ifpdf \pdfpageheight #7\relax \pdfpagewidth #8\relax % if we don't reset these, they will remain at "1 true in" of % whatever layout pdftex was dumped with. \pdfhorigin = 1 true in \pdfvorigin = 1 true in \fi % \setleading{\textleading} % \parindent = \defaultparindent \setemergencystretch } % @letterpaper (the default). \def\letterpaper{{\globaldefs = 1 \parskip = 3pt plus 2pt minus 1pt \textleading = 13.2pt % % If page is nothing but text, make it come out even. \internalpagesizes{607.2pt}{6in}% that's 46 lines {\voffset}{.25in}% {\bindingoffset}{36pt}% {11in}{8.5in}% }} % Use @smallbook to reset parameters for 7x9.25 trim size. \def\smallbook{{\globaldefs = 1 \parskip = 2pt plus 1pt \textleading = 12pt % \internalpagesizes{7.5in}{5in}% {-.2in}{0in}% {\bindingoffset}{16pt}% {9.25in}{7in}% % \lispnarrowing = 0.3in \tolerance = 700 \hfuzz = 1pt \contentsrightmargin = 0pt \defbodyindent = .5cm }} % Use @smallerbook to reset parameters for 6x9 trim size. % (Just testing, parameters still in flux.) \def\smallerbook{{\globaldefs = 1 \parskip = 1.5pt plus 1pt \textleading = 12pt % \internalpagesizes{7.4in}{4.8in}% {-.2in}{-.4in}% {0pt}{14pt}% {9in}{6in}% % \lispnarrowing = 0.25in \tolerance = 700 \hfuzz = 1pt \contentsrightmargin = 0pt \defbodyindent = .4cm }} % Use @afourpaper to print on European A4 paper. \def\afourpaper{{\globaldefs = 1 \parskip = 3pt plus 2pt minus 1pt \textleading = 13.2pt % % Double-side printing via postscript on Laserjet 4050 % prints double-sided nicely when \bindingoffset=10mm and \hoffset=-6mm. % To change the settings for a different printer or situation, adjust % \normaloffset until the front-side and back-side texts align. Then % do the same for \bindingoffset. You can set these for testing in % your texinfo source file like this: % @tex % \global\normaloffset = -6mm % \global\bindingoffset = 10mm % @end tex \internalpagesizes{673.2pt}{160mm}% that's 51 lines {\voffset}{\hoffset}% {\bindingoffset}{44pt}% {297mm}{210mm}% % \tolerance = 700 \hfuzz = 1pt \contentsrightmargin = 0pt \defbodyindent = 5mm }} % Use @afivepaper to print on European A5 paper. % From romildo@urano.iceb.ufop.br, 2 July 2000. % He also recommends making @example and @lisp be small. \def\afivepaper{{\globaldefs = 1 \parskip = 2pt plus 1pt minus 0.1pt \textleading = 12.5pt % \internalpagesizes{160mm}{120mm}% {\voffset}{\hoffset}% {\bindingoffset}{8pt}% {210mm}{148mm}% % \lispnarrowing = 0.2in \tolerance = 800 \hfuzz = 1.2pt \contentsrightmargin = 0pt \defbodyindent = 2mm \tableindent = 12mm }} % A specific text layout, 24x15cm overall, intended for A4 paper. \def\afourlatex{{\globaldefs = 1 \afourpaper \internalpagesizes{237mm}{150mm}% {\voffset}{4.6mm}% {\bindingoffset}{7mm}% {297mm}{210mm}% % % Must explicitly reset to 0 because we call \afourpaper. \globaldefs = 0 }} % Use @afourwide to print on A4 paper in landscape format. \def\afourwide{{\globaldefs = 1 \afourpaper \internalpagesizes{241mm}{165mm}% {\voffset}{-2.95mm}% {\bindingoffset}{7mm}% {297mm}{210mm}% \globaldefs = 0 }} % @pagesizes TEXTHEIGHT[,TEXTWIDTH] % Perhaps we should allow setting the margins, \topskip, \parskip, % and/or leading, also. Or perhaps we should compute them somehow. % \parseargdef\pagesizes{\pagesizesyyy #1,,\finish} \def\pagesizesyyy#1,#2,#3\finish{{% \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi \globaldefs = 1 % \parskip = 3pt plus 2pt minus 1pt \setleading{\textleading}% % \dimen0 = #1\relax \advance\dimen0 by \voffset % \dimen2 = \hsize \advance\dimen2 by \normaloffset % \internalpagesizes{#1}{\hsize}% {\voffset}{\normaloffset}% {\bindingoffset}{44pt}% {\dimen0}{\dimen2}% }} % Set default to letter. % \letterpaper \message{and turning on texinfo input format.} % Define macros to output various characters with catcode for normal text. \catcode`\"=\other \catcode`\~=\other \catcode`\^=\other \catcode`\_=\other \catcode`\|=\other \catcode`\<=\other \catcode`\>=\other \catcode`\+=\other \catcode`\$=\other \def\normaldoublequote{"} \def\normaltilde{~} \def\normalcaret{^} \def\normalunderscore{_} \def\normalverticalbar{|} \def\normalless{<} \def\normalgreater{>} \def\normalplus{+} \def\normaldollar{$}%$ font-lock fix % This macro is used to make a character print one way in \tt % (where it can probably be output as-is), and another way in other fonts, % where something hairier probably needs to be done. % % #1 is what to print if we are indeed using \tt; #2 is what to print % otherwise. Since all the Computer Modern typewriter fonts have zero % interword stretch (and shrink), and it is reasonable to expect all % typewriter fonts to have this, we can check that font parameter. % \def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi} % Same as above, but check for italic font. Actually this also catches % non-italic slanted fonts since it is impossible to distinguish them from % italic fonts. But since this is only used by $ and it uses \sl anyway % this is not a problem. \def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi} % Turn off all special characters except @ % (and those which the user can use as if they were ordinary). % Most of these we simply print from the \tt font, but for some, we can % use math or other variants that look better in normal text. \catcode`\"=\active \def\activedoublequote{{\tt\char34}} \let"=\activedoublequote \catcode`\~=\active \def~{{\tt\char126}} \chardef\hat=`\^ \catcode`\^=\active \def^{{\tt \hat}} \catcode`\_=\active \def_{\ifusingtt\normalunderscore\_} \let\realunder=_ % Subroutine for the previous macro. \def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em } \catcode`\|=\active \def|{{\tt\char124}} \chardef \less=`\< \catcode`\<=\active \def<{{\tt \less}} \chardef \gtr=`\> \catcode`\>=\active \def>{{\tt \gtr}} \catcode`\+=\active \def+{{\tt \char 43}} \catcode`\$=\active \def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix % If a .fmt file is being used, characters that might appear in a file % name cannot be active until we have parsed the command line. % So turn them off again, and have \everyjob (or @setfilename) turn them on. % \otherifyactive is called near the end of this file. \def\otherifyactive{\catcode`+=\other \catcode`\_=\other} % Used sometimes to turn off (effectively) the active characters even after % parsing them. \def\turnoffactive{% \normalturnoffactive \otherbackslash } \catcode`\@=0 % \backslashcurfont outputs one backslash character in current font, % as in \char`\\. \global\chardef\backslashcurfont=`\\ \global\let\rawbackslashxx=\backslashcurfont % let existing .??s files work % \realbackslash is an actual character `\' with catcode other, and % \doublebackslash is two of them (for the pdf outlines). {\catcode`\\=\other @gdef@realbackslash{\} @gdef@doublebackslash{\\}} % In texinfo, backslash is an active character; it prints the backslash % in fixed width font. \catcode`\\=\active @def@normalbackslash{{@tt@backslashcurfont}} % On startup, @fixbackslash assigns: % @let \ = @normalbackslash % \rawbackslash defines an active \ to do \backslashcurfont. % \otherbackslash defines an active \ to be a literal `\' character with % catcode other. @gdef@rawbackslash{@let\=@backslashcurfont} @gdef@otherbackslash{@let\=@realbackslash} % Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of % the literal character `\'. % @def@normalturnoffactive{% @let\=@normalbackslash @let"=@normaldoublequote @let~=@normaltilde @let^=@normalcaret @let_=@normalunderscore @let|=@normalverticalbar @let<=@normalless @let>=@normalgreater @let+=@normalplus @let$=@normaldollar %$ font-lock fix @unsepspaces } % Make _ and + \other characters, temporarily. % This is canceled by @fixbackslash. @otherifyactive % If a .fmt file is being used, we don't want the `\input texinfo' to show up. % That is what \eatinput is for; after that, the `\' should revert to printing % a backslash. % @gdef@eatinput input texinfo{@fixbackslash} @global@let\ = @eatinput % On the other hand, perhaps the file did not have a `\input texinfo'. Then % the first `\' in the file would cause an error. This macro tries to fix % that, assuming it is called before the first `\' could plausibly occur. % Also turn back on active characters that might appear in the input % file name, in case not using a pre-dumped format. % @gdef@fixbackslash{% @ifx\@eatinput @let\ = @normalbackslash @fi @catcode`+=@active @catcode`@_=@active } % Say @foo, not \foo, in error messages. @escapechar = `@@ % These look ok in all fonts, so just make them not special. @catcode`@& = @other @catcode`@# = @other @catcode`@% = @other @c Local variables: @c eval: (add-hook 'write-file-hooks 'time-stamp) @c page-delimiter: "^\\\\message" @c time-stamp-start: "def\\\\texinfoversion{" @c time-stamp-format: "%:y-%02m-%02d.%02H" @c time-stamp-end: "}" @c End: @c vim:sw=2: @ignore arch-tag: e1b36e32-c96e-4135-a41a-0b2efa2ea115 @end ignore grub-2.14~git20250718.0e36779/docs/grub-dev.texi0000644000175000017500000027341715036447510015357 00000000000000\input texinfo @c -*-texinfo-*- @c %**start of header @setfilename grub-dev.info @include version-dev.texi @settitle GNU GRUB Developers Manual @value{VERSION} @c Unify all our little indices for now. @syncodeindex fn cp @syncodeindex vr cp @syncodeindex ky cp @syncodeindex pg cp @syncodeindex tp cp @c %**end of header @footnotestyle separate @paragraphindent 3 @finalout @copying This developer manual is for GNU GRUB (version @value{VERSION}, @value{UPDATED}). Copyright @copyright{} 1999,2000,2001,2002,2004,2005,2006,2008,2009,2010,2011 Free Software Foundation, Inc. @quotation Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections. @end quotation @end copying @dircategory Kernel @direntry * grub-dev: (grub-dev). The GRand Unified Bootloader Dev @end direntry @setchapternewpage odd @titlepage @sp 10 @title the GNU GRUB developer manual @subtitle The GRand Unified Bootloader, version @value{VERSION}, @value{UPDATED}. @author Yoshinori K. Okuji @author Colin D Bennett @author Vesa Jääskeläinen @author Colin Watson @author Robert Millan @author Carles Pina @c The following two commands start the copyright page. @page @vskip 0pt plus 1filll @insertcopying @end titlepage @c Output the table of contents at the beginning. @contents @finalout @headings double @ifnottex @node Top @top GNU GRUB developer manual This is the developer documentation of GNU GRUB, the GRand Unified Bootloader, a flexible and powerful boot loader program for a wide range of architectures. This edition documents version @value{VERSION}. @insertcopying @end ifnottex @menu * Getting the source code:: * Coding style:: * Finding your way around:: * Contributing Changes:: * Setting up and running test suite:: * Updating External Code:: * Debugging:: * Porting:: * Error Handling:: * Stack and heap size:: * BIOS port memory map:: * Video Subsystem:: * PFF2 Font File Format:: * Graphical Menu Software Design:: * Verifiers framework:: * Lockdown framework:: * Copying This Manual:: Copying This Manual * Index:: @end menu @node Getting the source code @chapter Getting the source code GRUB is maintained using the @uref{https://git-scm.com/book/en/v2, GIT revision control system}. To fetch: @example git clone git://git.sv.gnu.org/grub.git @end example Web access is available under @example http://git.savannah.gnu.org/cgit/grub.git/ @end example The branches available are: @table @samp @item master Main development branch. @item grub-legacy GRUB 0.97 codebase. Kept for reference and legal reasons @item multiboot Multiboot specfication @item multiboot2 Multiboot2 specfication @item developer branches Prefixed with developer name. Every developer of a team manages his own branches. Developer branches do not need changelog entries. @end table Once you have used @kbd{git clone} to fetch an initial copy of a branch, you can use @kbd{git pull} to keep it up to date. If you have modified your local version, you may need to resolve conflicts when pulling. @node Coding style @chapter Coding style @c By YoshinoriOkuji, VesaJääskeläinen and ColinBennett Basically we follow the @uref{http://www.gnu.org/prep/standards_toc.html, GNU Coding Standards}. We define additional conventions for GRUB here. @menu * Naming Conventions:: * Functions:: * Variables:: * Types:: * Macros:: * Comments:: * Multi-Line Comments:: @end menu @node Naming Conventions @section Naming Conventions All global symbols (i.e. functions, variables, types, and macros) must have the prefix grub_ or GRUB_. The all capital form is used only by macros. @node Functions @section Functions If a function is global, its name must be prefixed with grub_ and must consist of only small letters. If the function belongs to a specific function module, the name must also be prefixed with the module name. For example, if a function is for file systems, its name is prefixed with grub_fs_. If a function is for FAT file system but not for all file systems, its name is prefixed with grub_fs_fat_. The hierarchy is noted this way. After a prefix, a function name must start with a verb (such as get or is). It must not be a noun. Some kind of abbreviation is permitted, as long as it wouldn't make code less readable (e.g. init). If a function is local, its name may not start with any prefix. It must start with a verb. @node Variables @section Variables The rule is mostly the same as functions, as noted above. If a variable is global, its name must be prefixed with grub_ and must consist of only small letters. If the variable belongs to a specific function module, the name must also be prefixed with the module name. For example, if a function is for dynamic loading, its name is prefixed with grub_dl_. If a variable is for ELF but not for all dynamic loading systems, its name is prefixed with grub_dl_elf_. After a prefix, a variable name must start with a noun or an adjective (such as name or long) and it should end with a noun. Some kind of abbreviation is permitted, as long as it wouldn't make code less readable (e.g. i18n). If a variable is global in the scope of a single file (i.e. it is declared with static), its name may not start with any prefix. It must start with a noun or an adjective. If a variable is local, you may choose any shorter name, as long as it wouldn't make code less readable (e.g. i). @node Types @section Types The name of a type must be prefixed with grub_ and must consist of only small letters. If the type belongs to a specific function module, the name must also be prefixed with the module name. For example, if a type is for OS loaders, its name is prefixed with grub_loader_. If a type is for Multiboot but not for all OS loaders, its name is prefixed with grub_loader_linux_. The name must be suffixed with _t, to emphasize the fact that it is a type but not a variable or a function. @node Macros @section Macros If a macro is global, its name must be prefixed with GRUB_ and must consist of only large letters. Other rules are the same as functions or variables, depending on whether a macro is used like a function or a variable. @node Comments @section Comments All comments shall be C-style comments, of the form @samp{/* @dots{} */}. A comment can be placed immediately preceding the entity it describes or it can be placed together with code, variable declarations, or other non-comment entities. However, it is recommended to not mix various forms especially in types/structs descriptions. Acceptable: @example /* The page # that is the front buffer. */ int displayed_page; @end example @example int render_page; /* The page # that is the back buffer. */ @end example @node Multi-Line Comments @section Multi-Line Comments Comments spanning multiple lines shall be formatted with all lines after the first aligned with the first line. Asterisk characters should be repeated at the start of each subsequent line. Acceptable: @example /* * This is a comment * which spans multiple lines. * It is long. */ @end example Unacceptable: @example /* This is a comment which spans multiple lines. It is long. */ @end example @example /* * This is a comment * which spans multiple lines. * It is long. */ @end example @example /* This is a comment * which spans multiple lines. * It is long. */ @end example In particular first unacceptable form makes comment difficult to distinguish from the code itself. Especially if it contains the code snippets and/or is long. So, its usage is disallowed. @node Finding your way around @chapter Finding your way around Here is a brief map of the GRUB code base. GRUB uses Autoconf and Automake, with most of the Automake input generated by a Python script. The top-level build rules are in @file{configure.ac}, @file{grub-core/Makefile.core.def}, and @file{Makefile.util.def}. Each block in a @file{*.def} file represents a build target, and specifies the source files used to build it on various platforms. The @file{*.def} files are processed into Automake input by @file{gentpl.py} (which you only need to look at if you are extending the build system). If you are adding a new module which follows an existing pattern, such as a new command or a new filesystem implementation, it is usually easiest to grep @file{grub-core/Makefile.core.def} and @file{Makefile.util.def} for an existing example of that pattern to find out where it should be added. In general, code that may be run at boot time is in a subdirectory of @file{grub-core}, while code that is only run from within a full operating system is in a subdirectory of the top level. Low-level boot code, such as the MBR implementation on PC BIOS systems, is in the @file{grub-core/boot/} directory. The GRUB kernel is in @file{grub-core/kern/}. This contains core facilities such as the device, disk, and file frameworks, environment variable handling, list processing, and so on. The kernel should contain enough to get up to a rescue prompt. Header files for kernel facilities, among others, are in @file{include/}. Terminal implementations are in @file{grub-core/term/}. Disk access code is spread across @file{grub-core/disk/} (for accessing the disk devices themselves), @file{grub-core/partmap/} (for interpreting partition table data), and @file{grub-core/fs/} (for accessing filesystems). Note that, with the odd specialised exception, GRUB only contains code to @emph{read} from filesystems and tries to avoid containing any code to @emph{write} to filesystems; this lets us confidently assure users that GRUB cannot be responsible for filesystem corruption. PCI and USB bus handling is in @file{grub-core/bus/}. Video handling code is in @file{grub-core/video/}. The graphical menu system uses this heavily, but is in a separate directory, @file{grub-core/gfxmenu/}. Most commands are implemented by files in @file{grub-core/commands/}, with the following exceptions: @itemize @item A few core commands live in @file{grub-core/kern/corecmd.c}. @item Commands related to normal mode live under @file{grub-core/normal/}. @item Commands that load and boot kernels live under @file{grub-core/loader/}. @item The @samp{loopback} command is really a disk device, and so lives in @file{grub-core/disk/loopback.c}. @item The @samp{gettext} command lives under @file{grub-core/gettext/}. @item The @samp{loadfont} and @samp{lsfonts} commands live under @file{grub-core/font/}. @item The @samp{serial}, @samp{terminfo}, and @samp{background_image} commands live under @file{grub-core/term/}. @item The @samp{efiemu_*} commands live under @file{grub-core/efiemu/}. @item OS-dependent code should be under @file{grub-core/osdep/} @item Utility programs meant to be run from a full operating system (except OS-dependent code mentioned previously) are in @file{util/}. @end itemize There are a few other special-purpose exceptions; grep for them if they matter to you. @node Contributing Changes @chapter Contributing changes @c By YoshinoriOkuji, VesaJääskeläinen, ColinWatson Contributing changes to GRUB 2 is welcomed activity. However we have a bit of control what kind of changes will be accepted to GRUB 2. Therefore it is important to discuss your changes on grub-devel mailing list (see MailingLists). On this page there are some basic details on the development process and activities. First of all you should come up with the idea yourself what you want to contribute. If you do not have that beforehand you are advised to study this manual and try GRUB 2 out to see what you think is missing from there. Here are additional pointers: @itemize @item @uref{https://savannah.gnu.org/task/?group=grub, GRUB's Task Tracker} @item @uref{https://savannah.gnu.org/bugs/?group=grub, GRUB's Bug Tracker} @end itemize If you intended to make changes to GRUB Legacy (<=0.97) those are not accepted anymore. @menu * Getting started:: * Typical Developer Experience:: * When you are approved for write access to project's files:: @end menu @node Getting started @section Getting started @itemize @item Always use latest GRUB 2 source code. So get that first. For developers it is recommended always to use the newest development version of GRUB 2. If development takes a long period of time, please remember to keep in sync with newest developments regularly so it is much easier to integrate your change in the future. GRUB 2 is being developed in a GIT repository. Please check Savannah's GRUB project page for details how to get newest git: @uref{https://savannah.gnu.org/git/?group=grub, GRUB 2 git Repository} @item Compile it and try it out. It is always good idea to first see that things work somehow and after that to start to implement new features or develop fixes to bugs. @item Study the code. There are sometimes odd ways to do things in GRUB 2 code base. This is mainly related to limited environment where GRUB 2 is being executed. You usually do not need to understand it all so it is better to only try to look at places that relates to your work. Please do not hesitate to ask for help if there is something that you do not understand. @item Develop a new feature. Now that you know what to do and how it should work in GRUB 2 code base, please be free to develop it. If you have not so far announced your idea on grub-devel mailing list, please do it now. This is to make sure you are not wasting your time working on the solution that will not be integrated to GRUB 2 code base. You might want to study our coding style before starting development so you do not need to change much of the code when your patch is being reviewed. (see @ref{Coding style}) For every accepted patch there has to exist a ChangeLog entry. Our ChangeLog consist of changes within source code and are not describing about what the change logically does. Please see examples from previous entries. Also remember that GRUB 2 is licensed under GPLv3 license and that usually means that you are not allowed to copy pieces of code from other projects. Even if the source project's license would be compatible with GPLv3, please discuss it beforehand on grub-devel mailing list. @item Test your change. Test that your change works properly. Try it out a couple of times, preferably on different systems, and try to find problems with it. @item Publish your change. When you are happy with your change, first make sure it is compilable with latest development version of GRUB 2. After that please send a patch to grub-devel for review. Please describe in your email why you made the change, what it changes and so on. Please be prepared to receive even discouraging comments about your patch. There is usually at least something that needs to be improved in every patch. Please use unified diff to make your patch (good match of arguments for diff is @samp{-pruN}). @item Respond to received feedback. If you are asked to modify your patch, please do that and resubmit it for review. If your change is large you are required to submit a copyright agreement to FSF. Please keep in mind that if you are asked to submit for copyright agreement, process can take some time and is mandatory in order to get your changes integrated. If you are not on grub-devel to respond to questions, most likely your patch will not be accepted. Also if problems arise from your changes later on, it would be preferable that you also fix the problem. So stay around for a while. @item Your patch is accepted. Good job! Your patch will now be integrated into GRUB 2 mainline, and if it didn't break anything it will be publicly available in the next release. Now you are welcome to do further improvements :) @end itemize @node Typical Developer Experience @section Typical Developer Experience The typical experience for a developer in this project is the following: @enumerate @item You find yourself wanting to do something (e.g. fixing a bug). @item You show some result in the mailing list or the IRC. @item You are getting to be known to other developers. @item You accumulate significant amount of contribution, so copyright assignment is processed. @item You are free to check in your changes on your own, legally speaking. @end enumerate At this point, it is rather annoying that you ought to ask somebody else every change to be checked in. For efficiency, it is far better, if you can commit it yourself. Therefore, our policy is to give you the write permission to our official repository, once you have shown your skill and will, and the FSF clerks have dealt with your copyright assignment. @node When you are approved for write access to project's files @section When you are approved for write access to project's files As you might know, GRUB is hosted on @uref{https://savannah.gnu.org/projects/grub, Savannah}, thus the membership is managed by Savannah. This means that, if you want to be a member of this project: @enumerate @item You need to create your own account on Savannah. @item You can submit ``Request for Inclusion'' from ``My Groups'' on Savannah. @end enumerate Then, one of the admins can approve your request, and you will be a member. If you don't want to use the Savannah interface to submit a request, you can simply notify the admins by email or something else, alternatively. But you still need to create an account beforehand. NOTE: we sometimes receive a ``Request for Inclusion'' from an unknown person. In this case, the request would be just discarded, since it is too dangerous to allow a stranger to be a member, which automatically gives him a commit right to the repository, both for a legal reason and for a technical reason. If your intention is to just get started, please do not submit a inclusion request. Instead, please subscribe to the mailing list, and communicate first (e.g. sending a patch, asking a question, commenting on another message...). @node Setting up and running test suite @chapter Setting up and running test suite GRUB is basically a tiny operating system with read support for many file systems and which has been ported to a variety of architectures. As such, its test suite has quite a few dependencies required to fully run the suite. These dependencies are currently documented in the @uref{https://git.savannah.gnu.org/cgit/grub.git/tree/INSTALL, INSTALL} file in the source repository. Once installed, the test suite can be started by running the @command{make check} command from the GRUB build directory. @node Updating External Code @chapter Updating external code GRUB includes some code from other projects, and it is sometimes necessary to update it. @menu * Gnulib:: * jsmn:: * minilzo:: * libtasn1:: * libgcrypt:: @end menu @node Gnulib @section Gnulib Gnulib is a source code library that provides basic functionality to programs and libraries. Many software packages make use of Gnulib to avoid reinventing the portability wheel. GRUB imports Gnulib using its @command{bootstrap} utility, identifying a particular Git commit in @file{bootstrap.conf}. To upgrade to a new Gnulib commit, set @code{GNULIB_REVISION} in @file{bootstrap.conf} to the new commit ID, then run @kbd{./bootstrap} and whatever else you need to make sure it works. Check for changes to Gnulib's @file{NEWS} file between the old and new commits; in some cases it will be necessary to adjust GRUB to match. You may also need to update the patches in @file{grub-core/lib/gnulib-patches/}. To add a new Gnulib module or remove one that is no longer needed, change @code{gnulib_modules} in @file{bootstrap.conf}. Again, run @kbd{./bootstrap} and whatever else you need to make sure it works. Bootstrapping from an older distribution containing gettext version < 0.18.3, will require a patch similar to this to be applied first before running the @command{./bootstrap} utility: @example diff --git a/bootstrap.conf b/bootstrap.conf index 988dda0..a3193a9 100644 --- a/bootstrap.conf +++ b/bootstrap.conf @@ -67,7 +67,7 @@ SKIP_PO=t buildreq="\ autoconf 2.63 automake 1.11 -gettext 0.18.3 +gettext 0.17 git 1.5.5 tar - " diff --git a/configure.ac b/configure.ac index 08b518f..99f5b36 100644 --- a/configure.ac +++ b/configure.ac @@ -362,7 +362,7 @@ AC_CHECK_PROG(HAVE_CXX, $CXX, yes, no) AC_GNU_SOURCE AM_GNU_GETTEXT([external]) -AM_GNU_GETTEXT_VERSION([0.18.3]) +AM_GNU_GETTEXT_VERSION([0.17]) AC_SYS_LARGEFILE # Identify characteristics of the host architecture. @end example It will also be necessary to adjust the patches in @file{po/gettext-patches/} to apply to an older version of gettext. @node jsmn @section jsmn jsmn is a minimalistic JSON parser which is implemented in a single header file @file{jsmn.h}. To import a different version of the jsmn parser, you may simply download the @file{jsmn.h} header from the desired tag or commit to the target directory: @example curl -L https://raw.githubusercontent.com/zserge/jsmn/v1.1.0/jsmn.h \ -o grub-core/lib/json/jsmn.h @end example @node minilzo @section minilzo miniLZO is a very lightweight subset of the LZO library intended for easy inclusion in other projects. It is generated automatically from the LZO source code and contains the most important LZO functions. To upgrade to a new version of the miniLZO library, download the release tarball and copy the files into the target directory: @example curl -L -O https://www.oberhumer.com/opensource/lzo/download/minilzo-2.10.tar.gz tar -zxf minilzo-2.10.tar.gz rm minilzo-2.10/testmini.c rm -r grub-core/lib/minilzo/* cp minilzo-2.10/*.[hc] grub-core/lib/minilzo rm -r minilzo-2.10* @end example @node libtasn1 @section libtasn1 libtasn1 is a library providing Abstract Syntax Notation One (ASN.1, as specified by the X.680 ITU-T recommendation) parsing and structures management, and Distinguished Encoding Rules (DER, as per X.690) encoding and decoding functions. To upgrade to a new version of the libtasn1 library, download the release tarball and copy the files into the target directory: @example curl -L -O https://ftp.gnu.org/gnu/libtasn1/libtasn1-4.19.0.tar.gz tar xvzf libtasn1-4.19.0.tar.gz rm -rf grub-core/lib/libtasn1 mkdir -p grub-core/lib/libtasn1/lib mkdir -p grub-core/lib/libtasn1/tests cp libtasn1-4.19.0/@{README.md,COPYING@} grub-core/lib/libtasn1 cp libtasn1-4.19.0/lib/@{coding.c,decoding.c,element.c,element.h,errors.c,gstr.c,gstr.h,int.h,parser_aux.c,parser_aux.h,structure.c,structure.h@} grub-core/lib/libtasn1/lib cp libtasn1-4.19.0/lib/includes/libtasn1.h grub-core/lib/libtasn1 cp libtasn1-4.19.0/tests/@{CVE-2018-1000654-1_asn1_tab.h,CVE-2018-1000654-2_asn1_tab.h,CVE-2018-1000654.c,object-id-decoding.c,object-id-encoding.c,octet-string.c,reproducers.c,Test_overflow.c,Test_simple.c,Test_strings.c@} grub-core/lib/libtasn1/tests rm -rf libtasn1-4.19.0* @end example After upgrading the library, it may be necessary to apply the patches in @file{grub-core/lib/libtasn1-patches/} to adjust the code to be compatible with GRUB. These patches were needed to use the current version of libtasn1. The existing patches may not apply cleanly, apply at all, or even be needed for a newer version of the library, and other patches may be needed due to changes in the newer version. If existing patches need to be refreshed to apply cleanly, please include updated patches as part of the a patch set sent to the list. If new patches are needed or existing patches are not needed, also please send additions or removals as part of any patch set upgrading libtasn1. @node libgcrypt @section libgcrypt libgcrypt is a GNU implementation of crypto library. To import a new version you need to unpack the release tarball into grub-core/lib/libgcrypt. Delete following files/directories: * acinclude.m4 * aclocal.m4 * autogen.rc * autogen.sh * build-aux * ChangeLog * ChangeLog-2011 * doc * INSTALL * m4 * Makefile.am * Makefile.in * NEWS * random * tests * TODO * */Makefile.in * mpi/hppa1.1 Regenerate the file gost-sb.h: grub-core/lib/libgcrypt/cipher$ gcc -o gost-s-box gost-s-box.c grub-core/lib/libgcrypt/cipher$ ./gost-s-box gost-sb.h Then rerun ./bootstrap and pay attention to the errors. Especially to warnings that a file isn't a module as it means that some file is actually unused by GRUB. If any, find where it declares its cipher or hash and add a pattern to import_gcry.py. See commit ``libgcrypt: Import blake family of hashes'' for an example. If file reallly is useless to GRUB in its current state, add it to whitelist in import_gcry.py. Compile and fix any new errors. Put patches into grub-core/lib/libgcrypt-patches @node Debugging @chapter Debugging GRUB2 can be difficult to debug because it runs on the bare-metal and thus does not have the debugging facilities normally provided by an operating system. This chapter aims to provide useful information on some ways to debug GRUB2 for some architectures. It by no means intends to be exhaustive. The focus will be one x86_64 and i386 architectures. Luckily for some issues virtual machines have made the ability to debug GRUB2 much easier, and this chapter will focus debugging via the QEMU virtual machine. We will not be going over debugging of the userland tools (eg. grub-install), there are many tutorials on debugging programs in userland. You will need GDB and the QEMU binaries for your system, on Debian these can be installed with the @samp{gdb} and @samp{qemu-system-x86} packages. Also it is assumed that you have already successfully compiled GRUB2 from source for the target specified in the section below and have some familiarity with GDB. When GRUB2 is built it will create many different binaries. The ones of concern will be in the @file{grub-core} directory of the GRUB2 build dir. To aide in debugging we will want the debugging symbols generated during the build because these symbols are not kept in the binaries which get installed to the boot location. The build process outputs two sets of binaries, one without symbols which gets executed at boot, and another set of ELF images with debugging symbols. The built images with debugging symbols will have a @file{.image} suffix, and the ones without a @file{.img} suffix. Similarly, loadable modules with debugging symbols will have a @file{.module} suffix, and ones without a @file{.mod} suffix. In the case of the kernel the binary with symbols is named @file{kernel.exec}. In the following sections, information will be provided on debugging on various targets using @command{gdb} and the @samp{gdb_grub} GDB script. @menu * i386-pc:: * x86_64-efi:: @end menu @node i386-pc @section i386-pc The i386-pc target is a good place to start when first debugging GRUB2 because in some respects it's easier than EFI platforms. The reason being that the initial load address is always known in advance. To start debugging GRUB2 first QEMU must be started in GDB stub mode. The following command is a simple illustration: @example qemu-system-i386 -drive file=disk.img,format=raw \ -device virtio-scsi-pci,id=scsi0 -S -s @end example This will start a QEMU instance booting from @file{disk.img}. It will pause at start waiting for a GDB instance to attach to it. You should change @file{disk.img} to something more appropriate. A block device can be used, but you may need to run QEMU as a privileged user. To connect to this QEMU instance with GDB, the @code{target remote} GDB command must be used. We also need to load a binary image, preferably with symbols. This can be done using the GDB command @code{file kernel.exec}, if GDB is started from the @file{grub-core} directory in the GRUB2 build directory. GRUB2 developers have made this more simple by including a GDB script which does much of the setup. This file is at @file{grub-core/gdb_grub} in the build directory and is also installed via @command{make install}. When using a pre-built GRUB, the distribution may have a package which installs this GDB script along with debug symbol binaries, such as Debian's @samp{grub-pc-dbg} package. The GDB script is intended to be used like so, assuming that @samp{/path/to/script} is the path to the directory containing the gdb_grub script and debug symbol files: @example cd $(dirname /path/to/script/gdb_grub) gdb -x gdb_grub @end example Once GDB has been started with the @file{gdb_grub} script it will automatically connect to the QEMU instance. You can then do things you normally would in GDB like set a break point on @var{grub_main}. Setting breakpoints in modules is trickier since they haven't been loaded yet and are loaded at addresses determined at runtime. The module could be loaded to different addresses in different QEMU instances. The debug symbols in the modules @file{.module} binary, thus are always wrong, and GDB needs to be told where to load the symbols to. But this must happen at runtime after GRUB2 has determined where the module will get loaded. Luckily the @file{gdb_grub} script takes care of this with the @command{runtime_load_module} command, which configures GDB to watch for GRUB2 module loading and when it does add the module symbols with the appropriate offset. @node x86_64-efi @section x86_64-efi Using GDB to debug GRUB2 for the x86_64-efi target has some similarities with the i386-pc target. Please read and familiarize yourself with the @ref{i386-pc} section when reading this one. Extra care must be used to run QEMU such that it boots a UEFI firmware. This usually involves either using the @samp{-bios} option with a UEFI firmware blob (eg. @file{OVMF.fd}) or loading the firmware via pflash. This document will not go further into how to do this as there are ample resource on the web. Like all EFI implementations, on x86_64-efi the (U)EFI firmware that loads the GRUB2 EFI application determines at runtime where the application will be loaded. This means that we do not know where to tell GDB to load the symbols for the GRUB2 core until the (U)EFI firmware determines it. There are two good ways of figuring this out when running in QEMU: use a @ref{OVMF debug log, debug build of OVMF} and check the debug log, or have GRUB2 say where it is loaded. Neither of these are ideal because they both generally give the information after GRUB2 is already running, which makes debugging early boot infeasible. Technically, the first method does give the load address before GRUB2 is run, but without debugging the EFI firmware with symbols, the author currently does not know how to cause the OVMF firmware to pause at that point to use the load address before GRUB2 is run. Even after getting the application load address, the loading of core symbols is complicated by the fact that the debugging symbols for the kernel are in an ELF binary named @file{kernel.exec} while what is in memory are sections for the PE32+ EFI binary. When @command{grub-mkimage} creates the PE32+ binary it condenses several segments from the ELF kernel binary into one .data section in the PE32+ binary. This must be taken into account to properly load the other non-text sections. Otherwise, GDB will work as expected when breaking on functions, but, for instance, global variables will point to the wrong address in memory and thus give incorrect values (which can be difficult to debug). Calculating the correct offsets for sections is taken care of automatically when loading the kernel symbols via the user-defined GDB command @command{dynamic_load_kernel_exec_symbols}, which takes one argument, the address where the text section is loaded as determined by one of the methods above. Alternatively, the command @command{dynamic_load_symbols} with the text section address as an agrument can be called to load the kernel symbols and set up loading the module symbols as they are loaded at runtime. In the author's experience, when debugging with QEMU and OVMF, to have debugging symbols loaded at the start of GRUB2 execution the GRUB2 EFI application must be run via QEMU at least once prior in order to get the load address. Two methods for obtaining the load address are described in two subsections below. Generally speaking, the load address does not change between QEMU runs. There are exceptions to this, namely that different GRUB2 EFI applications can be run at different addresses. Also, it has been observed that after running the EFI application for the first time, the second run will sometimes have a different load address, but subsequent runs of the same EFI application will have the same load address as the second run. And it's a near certainty that if the GRUB EFI binary has changed, eg. been recompiled, the load address will also be different. This ability to predict what the load address will be allows one to assume the load address on subsequent runs and thus load the symbols before GRUB2 starts. The following command illustrates this, assuming that QEMU is running and waiting for a debugger connection and the current working directory is where @file{gdb_grub} resides: @example gdb -x gdb_grub -ex 'dynamic_load_symbols @var{address of .text section}' @end example If you load the symbols in this manner and, after continuing execution, do not see output showing the module symbols loading, then it is very likely that the load address was incorrect. Another thing to be aware of is how the loading of the GRUB image by the firmware affects previously set software breakpoints. On x86 platforms, software breakpoints are implemented by GDB by writing a special processor instruction at the location of the desired breakpoint. This special instruction when executed will stop the program execution and hand control to the debugger, GDB. GDB will first save the instruction bytes that are overwritten at the breakpoint and will put them back when the breakpoint is hit. If GRUB is being run for the first time in QEMU, the firmware will be loading the GRUB image into memory where every byte is already set to 0. This means that if a breakpoint is set before GRUB is loaded, GDB will save the 0-byte(s) where the the special instruction will go. Then when the firmware loads the GRUB image and because it is unaware of the debugger, it will write the GRUB image to memory, overwriting anything that was there previously --- notably in this case the instruction that implements the software breakpoint. This will be confusing for the person using GDB because GDB will show the breakpoint as set, but the brekapoint will never be hit. Furthermore, GDB then becomes confused, such that even deleting an recreating the breakpoint will not create usable breakpoints. The @file{gdb_grub} script takes care of this by saving the breakpoints just before they are overwritten, and then restores them at the start of GRUB execution. So breakpoints for GRUB can be set before GRUB is loaded, but be mindful of this effect if you are confused as to why breakpoints are not getting hit. Also note, that hardware breakpoints do not suffer this problem. They are implemented by having the breakpoint address in special debug registers on the CPU. So they can always be set freely without regard to whether GRUB has been loaded or not. The reason that hardware breakpoints aren't always used is because there are a limited number of them, usually around 4 on various CPUs, and specifically exactly 4 for x86 CPUs. The @file{gdb_grub} script goes out of its way to avoid using hardware breakpoints internally and uses them as briefly as possible when needed, thus allowing the user to have a maximal number at their disposal. @menu * OVMF debug log:: * Using the gdbinfo command:: @end menu @node OVMF debug log @subsection OVMF debug log In order to get the GRUB2 load address from OVMF, first, a debug build of OVMF must be obtained (@uref{https://github.com/retrage/edk2-nightly/raw/master/bin/DEBUGX64_OVMF.fd, here is one} which is not officially recommended). OVMF will output debug messages to a special serial device, which we must add to QEMU. The following QEMU command will run the debug OVMF and write the debug messages to a file named @file{debug.log}. It is assumed that @file{disk.img} is a disk image or block device that is set up to boot GRUB2 EFI. @example qemu-system-x86_64 -bios /path/to/debug/OVMF.fd \ -drive file=disk.img,format=raw \ -device virtio-scsi-pci,id=scsi0 \ -debugcon file:debug.log -global isa-debugcon.iobase=0x402 @end example If GRUB2 was started by the (U)EFI firmware, then in the @file{debug.log} file one of the last lines should be a log message like: @samp{Loading driver at 0x00006AEE000 EntryPoint=0x00006AEE756}. This means that the GRUB2 EFI application was loaded at @samp{0x00006AEE000} and its .text section is at @samp{0x00006AEE756}. @node Using the gdbinfo command @subsection Using the gdbinfo command On EFI platforms the command @command{gdbinfo} will output a string that is to be run in a GDB session running with the @file{gdb_grub} GDB script. @node Porting @chapter Porting GRUB2 is designed to be easily portable accross platforms. But because of the nature of bootloader every new port must be done separately. Here is how I did MIPS (loongson and ARC) and Xen ports. Note than this is more of suggestions, not absolute truth. First of all grab any architecture specifications you can find in public (please avoid NDA). First stage is ``Hello world''. I've done it outside of GRUB for simplicity. Your task is to have a small program which is loadable as bootloader and clearly shows its presence to you. If you have easily accessible console you can just print a message. If you have a mapped framebuffer you know address of, you can draw a square. If you have a debug facility, just hanging without crashing might be enough. For the first stage you can choose to load the bootloader across the network since format for network image is often easier than for local boot and it skips the need of small intermediary stages and nvram handling. Additionally you can often have a good idea of the needed format by running ``file'' on any netbootable executable for given platform. This program should probably have 2 parts: an assembler and C one. Assembler one handles BSS cleaning and other needed setup (on some platforms you may need to switch modes or copy the executable to its definitive position). So your code may look like (x86 assembly for illustration purposes) @example .globl _start _start: movl $_bss_start, %edi movl $_end, %ecx subl %edi, %ecx xorl %eax, %eax cld rep stosb call main @end example @example static const char msg[] = "Hello, world"; void putchar (int c) @{ ... @} void main (void) @{ const char *ptr = msg; while (*ptr) putchar (*ptr++); while (1); @} @end example Sometimes you need a third file: assembly stubs for ABI-compatibility. Once this file is functional it's time to move it into GRUB2. The startup assembly file goes to grub-core/kern/$cpu/$platform/startup.S. You should also include grub/symbol.h and replace call to entry point with call to EXT_C(grub_main). The C file goes to grub-core/kern/$cpu/$platform/init.c and its entry point is renamed to void grub_machine_init (void). Keep final infinite loop for now. Stubs file if any goes to grub-core/kern/$cpu/$platform/callwrap.S. Sometimes either $cpu or $platform is dropped if file is used on several cpus respectivelyplatforms. Check those locations if they already have what you're looking for. Then modify in configure.ac the following parts: CPU names: @example case "$target_cpu" in i[[3456]]86) target_cpu=i386 ;; amd64) target_cpu=x86_64 ;; sparc) target_cpu=sparc64 ;; s390x) target_cpu=s390 ;; ... esac @end example Sometimes CPU have additional architecture names which don't influence booting. You might want to have some canonical name to avoid having bunch of identical platforms with different names. NOTE: it doesn't influence compile optimisations which depend solely on chosen compiler and compile options. @example if test "x$with_platform" = x; then case "$target_cpu"-"$target_vendor" in i386-apple) platform=efi ;; i386-*) platform=pc ;; x86_64-apple) platform=efi ;; x86_64-*) platform=pc ;; powerpc-*) platform=ieee1275 ;; ... esac else ... fi @end example This part deals with guessing the platform from CPU and vendor. Sometimes you need to use 32-bit mode for booting even if OS runs in 64-bit one. If so add your platform to: @example case "$target_cpu"-"$platform" in x86_64-efi) ;; x86_64-emu) ;; x86_64-*) target_cpu=i386 ;; powerpc64-ieee1275) target_cpu=powerpc ;; esac @end example Add your platform to the list of supported ones: @example case "$target_cpu"-"$platform" in i386-efi) ;; x86_64-efi) ;; i386-pc) ;; i386-multiboot) ;; i386-coreboot) ;; ... esac @end example If explicit -m32 or -m64 is needed add it to: @example case "$target_cpu" in i386 | powerpc) target_m32=1 ;; x86_64 | sparc64) target_m64=1 ;; esac @end example Finally you need to add a conditional to the following block: @example AM_CONDITIONAL([COND_mips_arc], [test x$target_cpu = xmips -a x$platform = xarc]) AM_CONDITIONAL([COND_sparc64_ieee1275], [test x$target_cpu = xsparc64 -a x$platform = xieee1275]) AM_CONDITIONAL([COND_powerpc_ieee1275], [test x$target_cpu = xpowerpc -a x$platform = xieee1275]) @end example Next stop is gentpl.py. You need to add your platform to the list of supported ones (sorry that this list is duplicated): @example GRUB_PLATFORMS = [ "emu", "i386_pc", "i386_efi", "i386_qemu", "i386_coreboot", "i386_multiboot", "i386_ieee1275", "x86_64_efi", "mips_loongson", "sparc64_ieee1275", "powerpc_ieee1275", "mips_arc", "ia64_efi", "mips_qemu_mips", "s390_mainframe" ] @end example You may also want already to add new platform to one or several of available groups. In particular we always have a group for each CPU even when only one platform for given CPU is available. Then comes grub-core/Makefile.core.def. In the block ``kernel'' you'll need to define ldflags for your platform ($cpu_$platform_ldflags). You also need to declare startup asm file ($cpu_$platform_startup) as well as any other files (e.g. init.c and callwrap.S) (e.g. $cpu_$platform = kern/$cpu/$platform/init.c). At this stage you will also need to add dummy dl.c and cache.S with functions grub_err_t grub_arch_dl_check_header (void *ehdr), grub_err_t grub_arch_dl_relocate_symbols (grub_dl_t mod, void *ehdr) (dl.c) and void grub_arch_sync_caches (void *address, grub_size_t len) (cache.S). They won't be used for now. You will need to create directory include/$cpu/$platform and a file include/$cpu/types.h. The latter following this template: @example #ifndef GRUB_TYPES_CPU_HEADER #define GRUB_TYPES_CPU_HEADER 1 /* The size of void *. */ #define GRUB_TARGET_SIZEOF_VOID_P 4 /* The size of long. */ #define GRUB_TARGET_SIZEOF_LONG 4 /* mycpu is big-endian. */ #define GRUB_TARGET_WORDS_BIGENDIAN 1 /* Alternatively: mycpu is little-endian. */ #undef GRUB_TARGET_WORDS_BIGENDIAN #endif /* ! GRUB_TYPES_CPU_HEADER */ @end example You will also need to add a dummy file to datetime and setjmp modules to avoid any of it having no files. It can be just completely empty at this stage. You'll need to make grub-mkimage.c (util/grub_mkimage.c) aware of the needed format. For most commonly used formats like ELF, PE, aout or raw the support is already present and you'll need to make it follow the existant code paths for your platform adding adjustments if necessary. When done compile: @example ./bootstrap ./configure --target=$cpu --with-platform=$platform TARGET_CC=.. OBJCOPY=... STRIP=... make > /dev/null @end example And create image @example ./grub-mkimage -d grub-core -O $format_id -o test.img @end example And it's time to test your test.img. If it works next stage is to have heap, console and timer. To have the heap working you need to determine which regions are suitable for heap usage, allocate them from firmware and map (if applicable). Then call grub_mm_init_region (void *start, grub_size_t s) for every of this region. As a shortcut for early port you can allocate right after _end or have a big static array for heap. If you do you'll probably need to come back to this later. As for output console you should distinguish between an array of text, terminfo or graphics-based console. Many of real-world examples don't fit perfectly into any of these categories but one of the models is easier to be used as base. In second and third case you should add your platform to terminfokernel respectively videoinkernel group. A good example of array of text is i386-pc (kern/i386/pc/init.c and term/i386/pc/console.c). Of terminfo is ieee1275 (kern/ieee1275/init.c and term/ieee1275/console.c). Of video is loongson (kern/mips/loongson/init.c). Note that terminfo has to be inited in 2 stages: one before (to get at least rudimentary console as early as possible) and another after the heap (to get full-featured console). For the input there are string of keys, terminfo and direct hardware. For string of keys look at i386-pc (same files), for terminfo ieee1275 (same files) and for hardware loongson (kern/mips/loongson/init.c and term/at_keyboard.c). For the timer you'll need to call grub_install_get_time_ms (...) with as sole argument a function returning a grub_uint64_t of a number of milliseconds elapsed since arbitrary point in the past. Once these steps accomplished you can remove the inifinite loop and you should be able to get to the minimal console. Next step is to have module loading working. For this you'll need to fill kern/$cpu/dl.c and kern/$cpu/cache.S with real handling of relocations and respectively the real sync of I and D caches. Also you'll need to decide where in the image to store the modules. Usual way is to have it concatenated at the end. In this case you'll need to modify startup.S to copy modules out of bss to let's say ALIGN_UP (_end, 8) before cleaning out bss. You'll probably find useful to add total_module_size field to startup.S. In init.c you need to set grub_modbase to the address where modules can be found. You may need grub_modules_get_end () to avoid declaring the space occupied by modules as usable for heap. You can test modules with: @example ./grub-mkimage -d grub-core -O $format_id -o test.img hello @end example and then running ``hello'' in the shell. Once this works, you should think of implementing disk access. Look around disk/ for examples. Then, very importantly, you probably need to implement the actual loader (examples available in loader/) Last step to have minimally usable port is to add support to grub-install to put GRUB in a place where firmware or platform will pick it up. Next steps are: filling datetime.c, setjmp.S, network (net/drivers), video (video/), halt (lib/), reboot (lib/). Please add your platform to Platform limitations and Supported kernels chapter in user documentation and mention any steps you skipped which result in reduced features or performance. Here is the quick checklist of features. Some of them are less important than others and skipping them is completely ok, just needs to be mentioned in user documentation. Checklist: @itemize @item Is heap big enough? @item Which charset is supported by console? @item Does platform have disk driver? @item Do you have network card support? @item Are you able to retrieve datetime (with date)? @item Are you able to set datetime (with date)? @item Is serial supported? @item Do you have direct disk support? @item Do you have direct keyboard support? @item Do you have USB support? @item Do you support loading through network? @item Do you support loading from disk? @item Do you support chainloading? @item Do you support network chainloading? @item Does cpuid command supports checking all CPU features that the user might want conditionalise on (64-bit mode, hypervisor,...) @item Do you support hints? How reliable are they? @item Does platform have ACPI? If so do ``acpi'' and ``lsacpi'' modules work? @item Do any of platform-specific operations mentioned in the relevant section of user manual makes sense on your platform? @item Does your platform support PCI? If so is there an appropriate driver for GRUB? @item Do you support badram? @end itemize @node Error Handling @chapter Error Handling Error handling in GRUB 2 is based on exception handling model. As C language doesn't directly support exceptions, exception handling behavior is emulated in software. When exception is raised, function must return to calling function. If calling function does not provide handling of the exception it must return back to its calling function and so on, until exception is handled. If exception is not handled before prompt is displayed, error message will be shown to user. Exception information is stored on @code{grub_errno} global variable. If @code{grub_errno} variable contains value @code{GRUB_ERR_NONE}, there is no active exception and application can continue normal processing. When @code{grub_errno} has other value, it is required that application code either handles this error or returns instantly to caller. If function is with return type @code{grub_err_t} is about to return @code{GRUB_ERR_NONE}, it should not set @code{grub_errno} to that value. Only set @code{grub_errno} in cases where there is error situation. Simple exception forwarder. @example grub_err_t forwarding_example (void) @{ /* Call function that might cause exception. */ foobar (); /* No special exception handler, just forward possible exceptions. */ if (grub_errno != GRUB_ERR_NONE) @{ return grub_errno; @} /* All is OK, do more processing. */ /* Return OK signal, to caller. */ return GRUB_ERR_NONE; @} @end example Error reporting has two components, the actual error code (of type @code{grub_err_t}) and textual message that will be displayed to user. List of valid error codes is listed in header file @file{include/grub/err.h}. Textual error message can contain any textual data. At time of writing, error message can contain up to 256 characters (including terminating NUL). To ease error reporting there is a helper function @code{grub_error} that allows easier formatting of error messages and should be used instead of writing directly to global variables. Example of error reporting. @example grub_err_t failing_example () @{ return grub_error (GRUB_ERR_FILE_NOT_FOUND, "Failed to read %s, tried %d times.", "test.txt", 10); @} @end example If there is a special reason that error code does not need to be taken account, @code{grub_errno} can be zeroed back to @code{GRUB_ERR_NONE}. In cases like this all previous error codes should have been handled correctly. This makes sure that there are no unhandled exceptions. Example of zeroing @code{grub_errno}. @example grub_err_t probe_example () @{ /* Try to probe device type 1. */ probe_for_device (); if (grub_errno == GRUB_ERR_NONE) @{ /* Device type 1 was found on system. */ register_device (); return GRUB_ERR_NONE; @} /* Zero out error code. */ grub_errno = GRUB_ERR_NONE; /* No device type 1 found, try to probe device type 2. */ probe_for_device2 (); if (grub_errno == GRUB_ERR_NONE) @{ /* Device type 2 was found on system. */ register_device2 (); return GRUB_ERR_NONE; @} /* Zero out error code. */ grub_errno = GRUB_ERR_NONE; /* Return custom error message. */ return grub_error (GRUB_ERR_UNKNOWN_DEVICE, "No device type 1 or 2 found."); @} @end example Some times there is a need to continue processing even if there is a error state in application. In situations like this, there is a needed to save old error state and then call other functions that might fail. To aid in this, there is a error stack implemented. Error state can be pushed to error stack by calling function @code{grub_error_push ()}. When processing has been completed, @code{grub_error_pop ()} can be used to pop error state from stack. Error stack contains predefined amount of error stack items. Error stack is protected for overflow and marks these situations so overflow error does not get unseen. If there is no space available to store error message, it is simply discarded and overflow will be marked as happened. When overflow happens, it most likely will corrupt error stack consistency as for pushed error there is no matching pop, but overflow message will be shown to inform user about the situation. Overflow message will be shown at time when prompt is about to be drawn. Example usage of error stack. @example /* Save possible old error message. */ grub_error_push (); /* Do your stuff here. */ call_possibly_failing_function (); if (grub_errno != GRUB_ERR_NONE) @{ /* Inform rest of the code that there is error (grub_errno is set). There is no pop here as we want both error states to be displayed. */ return; @} /* Restore old error state by popping previous item from stack. */ grub_error_pop (); @end example @node Stack and heap size @chapter Stack and heap size On emu stack and heap are just normal host OS stack and heap. Stack is typically 8 MiB although it's OS-dependent. On i386-pc, i386-coreboot, i386-qemu and i386-multiboot the stack is 60KiB. All available space between 1MiB and 4GiB marks is part of heap. On *-xen stack is 4MiB. If compiled for x86-64 with GCC 4.4 or later addressable space is unlimited. When compiled for x86-64 with older GCC version addressable space is limited to 2GiB. When compiling for i386 addressable space is limited to 4GiB. All addressable pages except the ones for stack, GRUB binary, special pages and page table are in the heap. On *-efi GRUB uses same stack as EFI. If compiled for x86-64 with GCC 4.4 or later addressable space is unlimited. When compiled for x86-64 with older GCC version addressable space is limited to 2GiB. For all other platforms addressable space is limited to 4GiB. GRUB allocates pages from EFI for its heap, at most 1.6 GiB. On i386-ieee1275 and powerpc-ieee1275 GRUB uses same stack as IEEE1275. On i386-ieee1275 and powerpc-ieee1275, GRUB will allocate 32MiB for its heap on startup. It may allocate more at runtime, as long as at least 128MiB remain free in OpenFirmware. On sparc64-ieee1275 stack is 256KiB and heap is 2MiB. On mips(el)-qemu_mips and mipsel-loongson stack is 2MiB (everything below GRUB image) and everything above GRUB image (from 2MiB + kernel size) until 256MiB is part of heap. On mips-arc stack is 2MiB (everything below GRUB image) and everything above GRUB image(from 2MiB + kernel size) until 128MiB is part of heap. On mipsel-arc stack is 2MiB (everything below GRUB image which is not part of ARC) and everything above GRUB image (from 7MiB + kernel size) until 256MiB is part of heap. On arm-uboot stack is 256KiB and heap is 2MiB. In short: @multitable @columnfractions .15 .25 .5 @headitem Platform @tab Stack @tab Heap @item emu @tab 8 MiB @tab ? @item i386-pc @tab 60 KiB @tab < 4 GiB @item i386-coreboot @tab 60 KiB @tab < 4 GiB @item i386-multiboot @tab 60 KiB @tab < 4 GiB @item i386-qemu @tab 60 KiB @tab < 4 GiB @item *-efi @tab ? @tab < 1.6 GiB @item i386-ieee1275 @tab ? @tab < 32 MiB @item powerpc-ieee1275 @tab ? @tab available memory - 128MiB @item sparc64-ieee1275 @tab 256KiB @tab 2 MiB @item arm-uboot @tab 256KiB @tab 2 MiB @item mips(el)-qemu_mips @tab 2MiB @tab 253 MiB @item mipsel-loongson @tab 2MiB @tab 253 MiB @item mips-arc @tab 2MiB @tab 125 MiB @item mipsel-arc @tab 2MiB @tab 248 MiB @item x86_64-xen (GCC >= 4.4) @tab 4MiB @tab unlimited @item x86_64-xen (GCC < 4.4) @tab 4MiB @tab < 2GiB @item i386-xen @tab 4MiB @tab < 4GiB @end multitable @node BIOS port memory map @chapter BIOS port memory map @c By Yoshinori K Okuji @multitable @columnfractions .15 .25 .5 @headitem Start @tab End @tab Usage @item 0 @tab 0x1000 - 1 @tab BIOS and real mode interrupts @item 0x07BE @tab 0x07FF @tab Partition table passed to another boot loader @item ? @tab 0x2000 - 1 @tab Real mode stack @item 0x7C00 @tab 0x7D00 - 1 @tab Boot sector @item 0x8000 @tab ? @tab GRUB kernel @item 0x68000 @tab 0x71000 - 1 @tab Disk buffer @item ? @tab 0x80000 - 1 @tab Protected mode stack @item ? @tab 0xA0000 - 1 @tab Extended BIOS Data Area @item 0xA0000 @tab 0xC0000 - 1 @tab Video RAM @item 0xC0000 @tab 0x100000 - 1 @tab BIOS @item 0x100000 @tab ? @tab Heap and module code @end multitable @node Video Subsystem @chapter Video Subsystem @c By VesaJääskeläinen This document contains specification for Video Subsystem for GRUB2. Currently only the usage interface is described in this document. Internal structure of how video drivers are registering and how video driver manager works are not included here. @menu * Video API:: * Example usage of Video API:: * Bitmap API:: @end menu @node Video API @section Video API @subsection grub_video_setup @itemize @item Prototype: @example grub_err_t grub_video_setup (unsigned int width, unsigned int height, unsigned int mode_type); @end example @item Description: Driver will use information provided to it to select best possible video mode and switch to it. Supported values for @code{mode_type} are @code{GRUB_VIDEO_MODE_TYPE_INDEX_COLOR} for index color modes, @code{GRUB_VIDEO_MODE_TYPE_RGB} for direct RGB color modes and @code{GRUB_VIDEO_MODE_TYPE_DOUBLE_BUFFERED} for double buffering. When requesting RGB mode, highest bits per pixel mode will be selected. When requesting Index color mode, mode with highest number of colors will be selected. If all parameters are specified as zero, video adapter will try to figure out best possible mode and initialize it, platform specific differences are allowed here. If there is no mode matching request, error X will be returned. If there are no problems, function returns @code{GRUB_ERR_NONE}. This function also performs following task upon succesful mode switch. Active rendering target is changed to screen and viewport is maximized to allow whole screen to be used when performing graphics operations. In RGB modes, emulated palette gets 16 entries containing default values for VGA palette, other colors are defined as black. When switching to Indexed Color mode, driver may set default VGA palette to screen if the video card allows the operation. @end itemize @subsection grub_video_restore @itemize @item Prototype: @example grub_err_t grub_video_restore (void); @end example @item Description: Video subsystem will deinitialize activated video driver to restore old state of video device. This can be used to switch back to text mode. @end itemize @subsection grub_video_get_info @itemize @item Prototype: @example grub_err_t grub_video_get_info (struct grub_video_mode_info *mode_info); @end example @example struct grub_video_mode_info @{ /* Width of the screen. */ unsigned int width; /* Height of the screen. */ unsigned int height; /* Mode type bitmask. Contains information like is it Index color or RGB mode. */ unsigned int mode_type; /* Bits per pixel. */ unsigned int bpp; /* Bytes per pixel. */ unsigned int bytes_per_pixel; /* Pitch of one scanline. How many bytes there are for scanline. */ unsigned int pitch; /* In index color mode, number of colors. In RGB mode this is 256. */ unsigned int number_of_colors; /* Optimization hint how binary data is coded. */ enum grub_video_blit_format blit_format; /* How many bits are reserved for red color. */ unsigned int red_mask_size; /* What is location of red color bits. In Index Color mode, this is 0. */ unsigned int red_field_pos; /* How many bits are reserved for green color. */ unsigned int green_mask_size; /* What is location of green color bits. In Index Color mode, this is 0. */ unsigned int green_field_pos; /* How many bits are reserved for blue color. */ unsigned int blue_mask_size; /* What is location of blue color bits. In Index Color mode, this is 0. */ unsigned int blue_field_pos; /* How many bits are reserved in color. */ unsigned int reserved_mask_size; /* What is location of reserved color bits. In Index Color mode, this is 0. */ unsigned int reserved_field_pos; @}; @end example @item Description: Software developer can use this function to query properties of active rendering taget. Information provided here can be used by other parts of GRUB, like image loaders to convert loaded images to correct screen format to allow more optimized blitters to be used. If there there is no configured video driver with active screen, error @code{GRUB_ERR_BAD_DEVICE} is returned, otherwise @code{mode_info} is filled with valid information and @code{GRUB_ERR_NONE} is returned. @end itemize @subsection grub_video_get_blit_format @itemize @item Prototype: @example enum grub_video_blit_format grub_video_get_blit_format (struct grub_video_mode_info *mode_info); @end example @example enum grub_video_blit_format @{ /* Follow exactly field & mask information. */ GRUB_VIDEO_BLIT_FORMAT_RGBA, /* Make optimization assumption. */ GRUB_VIDEO_BLIT_FORMAT_R8G8B8A8, /* Follow exactly field & mask information. */ GRUB_VIDEO_BLIT_FORMAT_RGB, /* Make optimization assumption. */ GRUB_VIDEO_BLIT_FORMAT_R8G8B8, /* When needed, decode color or just use value as is. */ GRUB_VIDEO_BLIT_FORMAT_INDEXCOLOR @}; @end example @item Description: Used to query how data could be optimized to suit specified video mode. Returns exact video format type, or a generic one if there is no definition for the type. For generic formats, use @code{grub_video_get_info} to query video color coding settings. @end itemize @subsection grub_video_set_palette @itemize @item Prototype: @example grub_err_t grub_video_set_palette (unsigned int start, unsigned int count, struct grub_video_palette_data *palette_data); @end example @example struct grub_video_palette_data @{ grub_uint8_t r; /* Red color value (0-255). */ grub_uint8_t g; /* Green color value (0-255). */ grub_uint8_t b; /* Blue color value (0-255). */ grub_uint8_t a; /* Reserved bits value (0-255). */ @}; @end example @item Description: Used to setup indexed color palettes. If mode is RGB mode, colors will be set to emulated palette data. In Indexed Color modes, palettes will be set to hardware. Color values will be converted to suit requirements of the video mode. @code{start} will tell what hardware color index (or emulated color index) will be set to according information in first indice of @code{palette_data}, after that both hardware color index and @code{palette_data} index will be incremented until @code{count} number of colors have been set. @end itemize @subsection grub_video_get_palette @itemize @item Prototype: @example grub_err_t grub_video_get_palette (unsigned int start, unsigned int count, struct grub_video_palette_data *palette_data); @end example @example struct grub_video_palette_data @{ grub_uint8_t r; /* Red color value (0-255). */ grub_uint8_t g; /* Green color value (0-255). */ grub_uint8_t b; /* Blue color value (0-255). */ grub_uint8_t a; /* Reserved bits value (0-255). */ @}; @end example @item Description: Used to query indexed color palettes. If mode is RGB mode, colors will be copied from emulated palette data. In Indexed Color modes, palettes will be read from hardware. Color values will be converted to suit structure format. @code{start} will tell what hardware color index (or emulated color index) will be used as a source for first indice of @code{palette_data}, after that both hardware color index and @code{palette_data} index will be incremented until @code{count} number of colors have been read. @end itemize @subsection grub_video_set_area_status @itemize @item Prototype: @example grub_err_t grub_video_set_area_status (grub_video_area_status_t area_status); @end example @example enum grub_video_area_status_t @{ GRUB_VIDEO_AREA_DISABLED, GRUB_VIDEO_AREA_ENABLED @}; @end example @item Description: Used to set area drawing mode for redrawing the specified region. Draw commands are performed in the intersection of the viewport and the region called area. Coordinates remain related to the viewport. If draw commands try to draw over the area, they are clipped. Set status to DISABLED if you need to draw everything. Set status to ENABLED and region to the desired rectangle to redraw everything inside the region leaving everything else intact. Should be used for redrawing of active elements. @end itemize @subsection grub_video_get_area_status @itemize @item Prototype: @example grub_err_r grub_video_get_area_status (grub_video_area_status_t *area_status); @end example @item Description: Used to query the area status. @end itemize @subsection grub_video_set_viewport @itemize @item Prototype: @example grub_err_t grub_video_set_viewport (unsigned int x, unsigned int y, unsigned int width, unsigned int height); @end example @item Description: Used to specify viewport where draw commands are performed. When viewport is set, all draw commands coordinates relate to those specified by @code{x} and @code{y}. If draw commands try to draw over viewport, they are clipped. If developer requests larger than possible viewport, width and height will be clamped to fit screen. If @code{x} and @code{y} are out of bounds, all functions drawing to screen will not be displayed. In order to maximize viewport, use @code{grub_video_get_info} to query actual screen dimensions and provide that information to this function. @end itemize @subsection grub_video_get_viewport @itemize @item Prototype: @example grub_err_t grub_video_get_viewport (unsigned int *x, unsigned int *y, unsigned int *width, unsigned int *height); @end example @item Description: Used to query current viewport dimensions. Software developer can use this to choose best way to render contents of the viewport. @end itemize @subsection grub_video_set_region @itemize @item Prototype: @example grub_err_t grub_video_set_region (unsigned int x, unsigned int y, unsigned int width, unsigned int height); @end example @item Description: Used to specify the region of the screen which should be redrawn. Use absolute values. When the region is set and area status is ENABLE all draw commands will be performed inside the interseption of region and viewport named area. If draw commands try to draw over viewport, they are clipped. If developer requests larger than possible region, width and height will be clamped to fit screen. Should be used for redrawing of active elements. @end itemize @subsection grub_video_get_region @itemize @item Prototype: @example grub_err_t grub_video_get_region (unsigned int *x, unsigned int *y, unsigned int *width, unsigned int *height); @end example @item Description: Used to query current region dimensions. @end itemize @subsection grub_video_map_color @itemize @item Prototype: @example grub_video_color_t grub_video_map_color (grub_uint32_t color_name); @end example @item Description: Map color can be used to support color themes in GRUB. There will be collection of color names that can be used to query actual screen mapped color data. Examples could be @code{GRUB_COLOR_CONSOLE_BACKGROUND}, @code{GRUB_COLOR_CONSOLE_TEXT}. The actual color defines are not specified at this point. @end itemize @subsection grub_video_map_rgb @itemize @item Prototype: @example grub_video_color_t grub_video_map_rgb (grub_uint8_t red, grub_uint8_t green, grub_uint8_t blue); @end example @item Description: Map RGB values to compatible screen color data. Values are expected to be in range 0-255 and in RGB modes they will be converted to screen color data. In index color modes, index color palette will be searched for specified color and then index is returned. @end itemize @subsection grub_video_map_rgba @itemize @item Prototype: @example grub_video_color_t grub_video_map_rgba (grub_uint8_t red, grub_uint8_t green, grub_uint8_t blue, grub_uint8_t alpha); @end example @item Description: Map RGBA values to compatible screen color data. Values are expected to be in range 0-255. In RGBA modes they will be converted to screen color data. In index color modes, index color palette will be searched for best matching color and its index is returned. @end itemize @subsection grub_video_unmap_color @itemize @item Prototype: @example grub_err_t grub_video_unmap_color (grub_video_color_t color, grub_uint8_t *red, grub_uint8_t *green, grub_uint8_t *blue, grub_uint8_t *alpha); @end example @item Description: Unmap color value from @code{color} to color channels in @code{red}, @code{green}, @code{blue} and @code{alpha}. Values will be in range 0-255. Active rendering target will be used for color domain. In case alpha information is not available in rendering target, it is assumed to be opaque (having value 255). @end itemize @subsection grub_video_fill_rect @itemize @item Prototype: @example grub_err_t grub_video_fill_rect (grub_video_color_t color, int x, int y, unsigned int width, unsigned int height); @end example @item Description: Fill specified area limited by given coordinates within specified viewport. Negative coordinates are accepted in order to allow easy moving of rectangle within viewport. If coordinates are negative, area of the rectangle will be shrinken to follow size limits of the viewport. Software developer should use either @code{grub_video_map_color}, @code{grub_video_map_rgb} or @code{grub_video_map_rgba} to map requested color to @code{color} parameter. @end itemize @subsection grub_video_blit_glyph @itemize @item Prototype: @example grub_err_t grub_video_blit_glyph (struct grub_font_glyph *glyph, grub_video_color_t color, int x, int y); @end example @example struct grub_font_glyph @{ /* TBD. */ @}; @end example @item Description: Used to blit glyph to viewport in specified coodinates. If glyph is at edge of viewport, pixels outside of viewport will be clipped out. Software developer should use either @code{grub_video_map_rgb} or @code{grub_video_map_rgba} to map requested color to @code{color} parameter. @end itemize @subsection grub_video_blit_bitmap @itemize @item Prototype: @example grub_err_t grub_video_blit_bitmap (struct grub_video_bitmap *bitmap, enum grub_video_blit_operators oper, int x, int y, int offset_x, int offset_y, unsigned int width, unsigned int height); @end example @example struct grub_video_bitmap @{ /* TBD. */ @}; enum grub_video_blit_operators @{ GRUB_VIDEO_BLIT_REPLACE, GRUB_VIDEO_BLIT_BLEND @}; @end example @item Description: Used to blit bitmap to viewport in specified coordinates. If part of bitmap is outside of viewport region, it will be clipped out. Offsets affect bitmap position where data will be copied from. Negative values for both viewport coordinates and bitmap offset coordinates are allowed. If data is looked out of bounds of bitmap, color value will be assumed to be transparent. If viewport coordinates are negative, area of the blitted rectangle will be shrinken to follow size limits of the viewport and bitmap. Blitting operator @code{oper} specifies should source pixel replace data in screen or blend with pixel alpha value. Software developer should use @code{grub_video_bitmap_create} or @code{grub_video_bitmap_load} to create or load bitmap data. @end itemize @subsection grub_video_blit_render_target @itemize @item Prototype: @example grub_err_t grub_video_blit_render_target (struct grub_video_render_target *source, enum grub_video_blit_operators oper, int x, int y, int offset_x, int offset_y, unsigned int width, unsigned int height); @end example @example struct grub_video_render_target @{ /* This is private data for video driver. Should not be accessed from elsewhere directly. */ @}; enum grub_video_blit_operators @{ GRUB_VIDEO_BLIT_REPLACE, GRUB_VIDEO_BLIT_BLEND @}; @end example @item Description: Used to blit source render target to viewport in specified coordinates. If part of source render target is outside of viewport region, it will be clipped out. If blitting operator is specified and source contains alpha values, resulting pixel color components will be calculated using formula ((src_color * src_alpha) + (dst_color * (255 - src_alpha)) / 255, if target buffer has alpha, it will be set to src_alpha. Offsets affect render target position where data will be copied from. If data is looked out of bounds of render target, color value will be assumed to be transparent. Blitting operator @code{oper} specifies should source pixel replace data in screen or blend with pixel alpha value. @end itemize @subsection grub_video_scroll @itemize @item Prototype: @example grub_err_t grub_video_scroll (grub_video_color_t color, int dx, int dy); @end example @item Description: Used to scroll viewport to specified direction. New areas are filled with specified color. This function is used when screen is scroller up in video terminal. @end itemize @subsection grub_video_swap_buffers @itemize @item Prototype: @example grub_err_t grub_video_swap_buffers (void); @end example @item Description: If double buffering is enabled, this swaps frontbuffer and backbuffer, in order to show values drawn to back buffer. Video driver is free to choose how this operation is techincally done. @end itemize @subsection grub_video_create_render_target @itemize @item Prototype: @example grub_err_t grub_video_create_render_target (struct grub_video_render_target **result, unsigned int width, unsigned int height, unsigned int mode_type); @end example @example struct grub_video_render_target @{ /* This is private data for video driver. Should not be accessed from elsewhere directly. */ @}; @end example @item Description: Driver will use information provided to it to create best fitting render target. @code{mode_type} will be used to guide on selecting what features are wanted for render target. Supported values for @code{mode_type} are @code{GRUB_VIDEO_MODE_TYPE_INDEX_COLOR} for index color modes, @code{GRUB_VIDEO_MODE_TYPE_RGB} for direct RGB color modes and @code{GRUB_VIDEO_MODE_TYPE_ALPHA} for alpha component. @end itemize @subsection grub_video_delete_render_target @itemize @item Prototype: @example grub_err_t grub_video_delete_render_target (struct grub_video_render_target *target); @end example @item Description: Used to delete previously created render target. If @code{target} contains @code{NULL} pointer, nothing will be done. If render target is correctly destroyed, GRUB_ERR_NONE is returned. @end itemize @subsection grub_video_set_active_render_target @itemize @item Prototype: @example grub_err_t grub_video_set_active_render_target (struct grub_video_render_target *target); @end example @item Description: Sets active render target. If this comand is successful all drawing commands will be done to specified @code{target}. There is also special values for target, @code{GRUB_VIDEO_RENDER_TARGET_DISPLAY} used to reference screen's front buffer, @code{GRUB_VIDEO_RENDER_TARGET_FRONT_BUFFER} used to reference screen's front buffer (alias for @code{GRUB_VIDEO_RENDER_TARGET_DISPLAY}) and @code{GRUB_VIDEO_RENDER_TARGET_BACK_BUFFER} used to reference back buffer (if double buffering is enabled). If render target is correclty switched GRUB_ERR_NONE is returned. In no any event shall there be non drawable active render target. @end itemize @subsection grub_video_get_active_render_target @itemize @item Prototype: @example grub_err_t grub_video_get_active_render_target (struct grub_video_render_target **target); @end example @item Description: Returns currently active render target. It returns value in @code{target} that can be subsequently issued back to @code{grub_video_set_active_render_target}. @end itemize @node Example usage of Video API @section Example usage of Video API @subsection Example of screen setup @example grub_err_t rc; /* Try to initialize video mode 1024 x 768 with direct RGB. */ rc = grub_video_setup (1024, 768, GRUB_VIDEO_MODE_TYPE_RGB); if (rc != GRUB_ERR_NONE) @{ /* Fall back to standard VGA Index Color mode. */ rc = grub_video_setup (640, 480, GRUB_VIDEO_MODE_TYPE_INDEX); if (rc != GRUB_ERR_NONE) @{ /* Handle error. */ @} @} @end example @subsection Example of setting up console viewport @example grub_uint32_t x, y, width, height; grub_video_color_t color; struct grub_font_glyph glyph; grub_err_t rc; /* Query existing viewport. */ grub_video_get_viewport (&x, &y, &width, &height); /* Fill background. */ color = grub_video_map_color (GRUB_COLOR_BACKGROUND); grub_video_fill_rect (color, 0, 0, width, height); /* Setup console viewport. */ grub_video_set_viewport (x + 10, y + 10, width - 20, height - 20); grub_video_get_viewport (&x, &y, &width, &height); color = grub_video_map_color (GRUB_COLOR_CONSOLE_BACKGROUND); grub_video_fill_rect (color, 0, 0, width, height); /* Draw text to viewport. */ color = grub_video_map_color (GRUB_COLOR_CONSOLE_TEXT); grub_font_get_glyph ('X', &glyph); grub_video_blit_glyph (&glyph, color, 0, 0); @end example @node Bitmap API @section Bitmap API @subsection grub_video_bitmap_create @itemize @item Prototype: @example grub_err_t grub_video_bitmap_create (struct grub_video_bitmap **bitmap, unsigned int width, unsigned int height, enum grub_video_blit_format blit_format) @end example @item Description: Creates a new bitmap with given dimensions and blitting format. Allocated bitmap data can then be modified freely and finally blitted with @code{grub_video_blit_bitmap} to rendering target. @end itemize @subsection grub_video_bitmap_destroy @itemize @item Prototype: @example grub_err_t grub_video_bitmap_destroy (struct grub_video_bitmap *bitmap); @end example @item Description: When bitmap is no longer needed, it can be freed from memory using this command. @code{bitmap} is previously allocated bitmap with @code{grub_video_bitmap_create} or loaded with @code{grub_video_bitmap_load}. @end itemize @subsection grub_video_bitmap_load @itemize @item Prototype: @example grub_err_t grub_video_bitmap_load (struct grub_video_bitmap **bitmap, const char *filename); @end example @item Description: Tries to load given bitmap (@code{filename}) using registered bitmap loaders. In case bitmap format is not recognized or supported error @code{GRUB_ERR_BAD_FILE_TYPE} is returned. @end itemize @subsection grub_video_bitmap_get_width @itemize @item Prototype: @example unsigned int grub_video_bitmap_get_width (struct grub_video_bitmap *bitmap); @end example @item Description: Returns bitmap width. @end itemize @subsection grub_video_bitmap_get_height @itemize @item Prototype: @example unsigned int grub_video_bitmap_get_height (struct grub_video_bitmap *bitmap); @end example @item Description: Return bitmap height. @end itemize @subsection grub_video_bitmap_get_mode_info @itemize @item Prototype: @example void grub_video_bitmap_get_mode_info (struct grub_video_bitmap *bitmap, struct grub_video_mode_info *mode_info); @end example @item Description: Returns bitmap format details in form of @code{grub_video_mode_info}. @end itemize @subsection grub_video_bitmap_get_data @itemize @item Prototype: @example void *grub_video_bitmap_get_data (struct grub_video_bitmap *bitmap); @end example @item Description: Return pointer to bitmap data. Contents of the pointed data can be freely modified. There is no extra protection against going off the bounds so you have to be carefull how to access the data. @end itemize @node PFF2 Font File Format @chapter PFF2 Font File Format @c Author: Colin D. Bennett @c Date: 8 January 2009 @menu * Introduction:: * File Structure:: * Font Metrics:: @end menu @node Introduction @section Introduction The goal of this format is to provide a bitmap font format that is simple to use, compact, and cleanly supports Unicode. @subsection Goals of the GRUB Font Format @itemize @item Simple to read and use. Since GRUB will only be reading the font files, we are more concerned with making the code to read the font simple than we are with writing the font. @item Compact storage. The fonts will generally be stored in a small boot partition where GRUB is located, and this may be on a removable storage device such as a CD or USB flash drive where space is more limited than it is on most hard drives. @item Unicode. GRUB should not have to deal with multiple character encodings. The font should always use Unicode character codes for simple internationalization. @end itemize @subsection Why Another Font Format? There are many existing bitmap font formats that GRUB could use. However, there are aspects of these formats that may make them less than suitable for use in GRUB at this time: @table @samp @item BDF Inefficient storage; uses ASCII to describe properties and hexadecimal numbers in ASCII for the bitmap rows. @item PCF Many format variations such as byte order and bitmap padding (rows padded to byte, word, etc.) would result in more complex code to handle the font format. @end table @node File Structure @section File Structure A file @strong{section} consists of a 4-byte name, a 32-bit big-endian length (not including the name or length), and then @var{length} more section-type-specific bytes. The standard file extension for PFF2 font files is @file{.pf2}. @subsection Section Types @table @samp @item FILE @strong{File type ID} (ASCII string). This must be the first section in the file. It has length 4 and the contents are the four bytes of the ASCII string @samp{PFF2}. @item NAME @strong{Font name} (ASCII string). This is the full font name including family, weight, style, and point size. For instance, "Helvetica Bold Italic 14". @item FAMI @strong{Font family name} (ASCII string). For instance, "Helvetica". This should be included so that intelligent font substitution can take place. @item WEIG @strong{Font weight} (ASCII string). Valid values are @samp{bold} and @samp{normal}. This should be included so that intelligent font substitution can take place. @item SLAN @strong{Font slant} (ASCII string). Valid values are @samp{italic} and @samp{normal}. This should be included so that intelligent font substitution can take place. @item PTSZ @strong{Font point size} (uint16be). @item MAXW @strong{Maximum character width in pixels} (uint16be). @item MAXH @strong{Maximum character height in pixels} (uint16be). @item ASCE @strong{Ascent in pixels} (uint16be). @xref{Font Metrics}, for details. @item DESC @strong{Descent in pixels} (uint16be). @xref{Font Metrics}, for details. @item CHIX @strong{Character index.} The character index begins with a 32-bit big-endian unsigned integer indicating the total size of the section, not including this size value. For each character, there is an instance of the following entry structure: @itemize @item @strong{Unicode code point.} (32-bit big-endian integer.) @item @strong{Storage flags.} (byte.) @itemize @item Bits 2..0: If equal to 000 binary, then the character data is stored uncompressed beginning at the offset indicated by the character's @strong{offset} value. If equal to 001 binary, then the character data is stored within a compressed character definition block that begins at the offset within the file indicated by the character's @strong{offset} value. @end itemize @item @strong{Offset.} (32-bit big-endian integer.) A marker that indicates the remainder of the file is data accessed via the character index (CHIX) section. When reading this font file, the rest of the file can be ignored when scanning the sections. The length should be set to -1 (0xFFFFFFFF). Supported data structures: Character definition Each character definition consists of: @itemize @item @strong{Width.} Width of the bitmap in pixels. The bitmap's extents represent the glyph's bounding box. @code{uint16be}. @item @strong{Height.} Height of the bitmap in pixels. The bitmap's extents represent the glyph's bounding box. @code{uint16be}. @item @strong{X offset.} The number of pixels to shift the bitmap by horizontally before drawing the character. @code{int16be}. @item @strong{Y offset.} The number of pixels to shift the bitmap by vertically before drawing the character. @code{int16be}. @item @strong{Device width.} The number of pixels to advance horizontally from this character's origin to the origin of the next character. @code{int16be}. @item @strong{Bitmap data.} This is encoded as a string of bits. It is organized as a row-major, top-down, left-to-right bitmap. The most significant bit of each byte is taken to be the leftmost or uppermost bit in the byte. For the sake of compact storage, rows are not padded to byte boundaries (i.e., a single byte may contain bits belonging to multiple rows). The last byte of the bitmap @strong{is} padded with zero bits in the bits positions to the right of the last used bit if the bitmap data does not fill the last byte. The length of the @strong{bitmap data} field is (@var{width} * @var{height} + 7) / 8 using integer arithmetic, which is equivalent to ceil(@var{width} * @var{height} / 8) using real number arithmetic. It remains to be determined whether bitmap fonts usually make all glyph bitmaps the same height, or if smaller glyphs are stored with bitmaps having a lesser height. In the latter case, the baseline would have to be used to calculate the location the bitmap should be anchored at on screen. @end itemize @end itemize @end table @node Font Metrics @section Font Metrics @itemize @item Ascent. The distance from the baseline to the top of most characters. Note that in some cases characters may extend above the ascent. @item Descent. The distance from the baseline to the bottom of most characters. Note that in some cases characters may extend below the descent. @item Leading. The amount of space, in pixels, to leave between the descent of one line of text and the ascent of the next line. This metrics is not specified in the current file format; instead, the font rendering engine calculates a reasonable leading value based on the other font metrics. @item Horizonal leading. The amount of space, in pixels, to leave horizontally between the left and right edges of two adjacent glyphs. The @strong{device width} field determines the effective leading value that is used to render the font. @end itemize @ifnottex @image{font_char_metrics,,,,.png} @end ifnottex An illustration of how the various font metrics apply to characters. @node Graphical Menu Software Design @chapter Graphical Menu Software Design @c By Colin D. Bennett @c Date: 17 August 2008 @menu * Introduction_2:: * Startup Sequence:: * GUI Components:: * Command Line Window:: @end menu @node Introduction_2 @section Introduction The @samp{gfxmenu} module provides a graphical menu interface for GRUB 2. It functions as an alternative to the menu interface provided by the @samp{normal} module, which uses the grub terminal interface to display a menu on a character-oriented terminal. The graphical menu uses the GRUB video API, which is currently for the VESA BIOS extensions (VBE) 2.0+. This is supported on the i386-pc platform. However, the graphical menu itself does not depend on using VBE, so if another GRUB video driver were implemented, the @samp{gfxmenu} graphical menu would work on the new video driver as well. @node Startup Sequence @section Startup Sequence @itemize @item grub_enter_normal_mode [normal/main.c] @item grub_normal_execute [normal/main.c] @item read_config_file [normal/main.c] @item (When @file{gfxmenu.mod} is loaded with @command{insmod}, it will call @code{grub_menu_viewer_register()} to register itself.) @item GRUB_MOD_INIT (gfxmenu) [gfxmenu/gfxmenu.c] @item grub_menu_viewer_register [kern/menu_viewer.c] @item grub_menu_viewer_show_menu [kern/menu_viewer.c] @item get_current_menu_viewer() [kern/menu_viewer.c] @item show_menu() [gfxmenu/gfxmenu.c] @item grub_gfxmenu_model_new [gfxmenu/model.c] @item grub_gfxmenu_view_new [gfxmenu/view.c] @item set_graphics_mode [gfxmenu/view.c] @item grub_gfxmenu_view_load_theme [gfxmenu/theme_loader.c] @end itemize @node GUI Components @section GUI Components The graphical menu implements a GUI component system that supports a container-based layout system. Components can be added to containers, and containers (which are a type of component) can then be added to other containers, to form a tree of components. Currently, the root component of this tree is a @samp{canvas} component, which allows manual layout of its child components. Components (non-container): @itemize @item label @item image @item progress_bar @item circular_progress @item list (currently hard coded to be a boot menu list) @end itemize Containers: @itemize @item canvas @item hbox @item vbox @end itemize The GUI component instances are created by the theme loader in @file{gfxmenu/theme_loader.c} when a theme is loaded. Theme files specify statements such as @samp{+vbox@{ +label @{ text="Hello" @} +label@{ text="World" @} @}} to add components to the component tree root. By nesting the component creation statements in the theme file, the instantiated components are nested the same way. When a component is added to a container, that new child is considered @strong{owned} by the container. Great care should be taken if the caller retains a reference to the child component, since it will be destroyed if its parent container is destroyed. A better choice instead of storing a pointer to the child component is to use the component ID to find the desired component. Component IDs do not have to be unique (it is often useful to have multiple components with an ID of "__timeout__", for instance). In order to access and use components in the component tree, there are two functions (defined in @file{gfxmenu/gui_util.c}) that are particularly useful: @itemize @item @code{grub_gui_find_by_id (root, id, callback, userdata)}: This function recursively traverses the component tree rooted at @var{root}, and for every component that has an ID equal to @var{id}, calls the function pointed to by @var{callback} with the matching component and the void pointer @var{userdata} as arguments. The callback function can do whatever is desired to use the component passed in. @item @code{grub_gui_iterate_recursively (root, callback, userdata)}: This function calls the function pointed to by @var{callback} for every component that is a descendant of @var{root} in the component tree. When the callback function is called, the component and the void pointer @var{userdata} as arguments. The callback function can do whatever is desired to use the component passed in. @end itemize @node Command Line Window @section Command Line Window The terminal window used to provide command line access within the graphical menu is managed by @file{gfxmenu/view.c}. The @samp{gfxterm} terminal is used, and it has been modified to allow rendering to an offscreen render target to allow it to be composed into the double buffering system that the graphical menu view uses. This is bad for performance, however, so it would probably be a good idea to make it possible to temporarily disable double buffering as long as the terminal window is visible. There are still unresolved problems that occur when commands are executed from the terminal window that change the graphics mode. It's possible that making @code{grub_video_restore()} return to the graphics mode that was in use before @code{grub_video_setup()} was called might fix some of the problems. @node Verifiers framework @chapter Verifiers framework To register your own verifier call @samp{grub_verifier_register} with a structure pointing to your functions. The interface is inspired by the hash interface with @samp{init}/@samp{write}/@samp{fini}. There are essentially 2 ways of using it, hashing and whole-file verification. With the hashing approach: During @samp{init} you decide whether you want to check the given file and init context. In @samp{write} you update your hashing state. In @samp{fini} you check that the hash matches the expected value/passes some check/... With whole-file verification: During @samp{init} you decide whether you want to check the given file and init context. In @samp{write} you verify the file and return an error if it fails. You don't have @samp{fini}. Additional @samp{verify_string} receives various strings like kernel parameters to verify. Returning no error means successful verification and an error stops the current action. Detailed description of the API: Every time a file is opened your @samp{init} function is called with file descriptor and file type. Your function can have the following outcomes: @itemize @item returning no error and setting @samp{*flags} to @samp{GRUB_VERIFY_FLAGS_DEFER_AUTH}. In this case verification is deferred to other active verifiers. Verification fails if nobody cares or selected verifier fails. @item returning no error and setting @samp{*flags} to @samp{GRUB_VERIFY_FLAGS_SKIP_VERIFICATION}. In this case your verifier will not be called anymore and it is assumed to have skipped verification. @item returning no error and not setting @samp{*flags} to @samp{GRUB_VERIFY_FLAGS_SKIP_VERIFICATION} In this case verification is done as described in the following section. @item returning an error. Then opening of the file will fail due to failed verification. @end itemize In the third case your @samp{write} will be called with chunks of the file. If you need the whole file in a single chunk then during @samp{init} set the bit @samp{GRUB_VERIFY_FLAGS_SINGLE_CHUNK} in @samp{*flags}. During @samp{init} you may set @samp{*context} if you need additional context. At every iteration you may return an error and the file will be considered as having failed the verification. If you return no error then verification continues. Optionally at the end of the file @samp{fini}, if it exists, is called with just the context. If you return no error during any of @samp{init}, @samp{write} and @samp{fini} then the file is considered as having succeded verification. @node Lockdown framework @chapter Lockdown framework The GRUB can be locked down, which is a restricted mode where some operations are not allowed. For instance, some commands cannot be used when the GRUB is locked down. The function @code{grub_lockdown()} is used to lockdown GRUB and the function @code{grub_is_lockdown()} function can be used to check whether lockdown is enabled or not. When enabled, the function returns @samp{GRUB_LOCKDOWN_ENABLED} and @samp{GRUB_LOCKDOWN_DISABLED} when is not enabled. The following functions can be used to register the commands that can only be used when lockdown is disabled: @itemize @item @code{grub_cmd_lockdown()} registers command which should not run when the GRUB is in lockdown mode. @item @code{grub_cmd_lockdown()} registers extended command which should not run when the GRUB is in lockdown mode. @end itemize @node Copying This Manual @appendix Copying This Manual @menu * GNU Free Documentation License:: License for copying this manual. @end menu @include fdl.texi @node Index @unnumbered Index @c Currently, we use only the Concept Index. @printindex cp @bye grub-2.14~git20250718.0e36779/docs/grub.info-10000644000175000017500000111226015036452577014721 00000000000000This is grub.info, produced by makeinfo version 6.8 from grub.texi. This manual is for GNU GRUB (version 2.14~git20250718.0e36779, 18 July 2025). Copyright (C) 1999,2000,2001,2002,2004,2006,2008,2009,2010,2011,2012,2013 Free Software Foundation, Inc. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections. INFO-DIR-SECTION Kernel START-INFO-DIR-ENTRY * GRUB: (grub). The GRand Unified Bootloader * grub-install: (grub)Invoking grub-install. Install GRUB on your drive * grub-mkconfig: (grub)Invoking grub-mkconfig. Generate GRUB configuration * grub-mkpasswd-pbkdf2: (grub)Invoking grub-mkpasswd-pbkdf2. * grub-mkrelpath: (grub)Invoking grub-mkrelpath. * grub-mkrescue: (grub)Invoking grub-mkrescue. Make a GRUB rescue image * grub-mount: (grub)Invoking grub-mount. Mount a file system using GRUB * grub-probe: (grub)Invoking grub-probe. Probe device information * grub-script-check: (grub)Invoking grub-script-check. END-INFO-DIR-ENTRY  File: grub.info, Node: Top, Next: Introduction, Up: (dir) GNU GRUB manual *************** This is the documentation of GNU GRUB, the GRand Unified Bootloader, a flexible and powerful boot loader program for a wide range of architectures. This edition documents version 2.14~git20250718.0e36779. This manual is for GNU GRUB (version 2.14~git20250718.0e36779, 18 July 2025). Copyright (C) 1999,2000,2001,2002,2004,2006,2008,2009,2010,2011,2012,2013 Free Software Foundation, Inc. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections. * Menu: * Introduction:: Capturing the spirit of GRUB * Naming convention:: Names of your drives in GRUB * OS-specific notes about grub tools:: Some notes about OS-specific behaviour of GRUB tools * Installation:: Installing GRUB on your drive * Booting:: How to boot different operating systems * Configuration:: Writing your own configuration file * Theme file format:: Format of GRUB theme files * Network:: Downloading OS images from a network * Serial terminal:: Using GRUB via a serial line * Vendor power-on keys:: Changing GRUB behaviour on vendor power-on keys * Images:: GRUB image files * Core image size limitation:: GRUB image files size limitations * Filesystem:: Filesystem syntax and semantics * Interface:: The menu and the command-line * Environment:: GRUB environment variables * Modules:: Available modules * Commands:: Available builtin commands * Internationalisation:: Topics relating to language support * Security:: Authentication, authorisation, and signatures * Platform limitations:: Platform-specific limitations * Platform-specific operations:: Platform-specific operations * Supported kernels:: Supported kernels * Troubleshooting:: Error messages produced by GRUB * User-space utilities:: Usage of user-space utilities * Obtaining and Building GRUB:: How to obtain and build GRUB * Reporting bugs:: Where you should send a bug report * Future:: Some future plans on GRUB * Copying This Manual:: Copying This Manual * Index::  File: grub.info, Node: Introduction, Next: Naming convention, Prev: Top, Up: Top 1 Introduction to GRUB ********************** * Menu: * Overview:: What exactly GRUB is and how to use it * History:: From maggot to house fly * Changes from GRUB Legacy:: Differences from previous versions * Features:: GRUB features * Role of a boot loader:: The role of a boot loader  File: grub.info, Node: Overview, Next: History, Up: Introduction 1.1 Overview ============ Briefly, a "boot loader" is the first software program that runs when a computer starts. It is responsible for loading and transferring control to an operating system "kernel" software (such as Linux or GNU Mach). The kernel, in turn, initializes the rest of the operating system (e.g. a GNU system). GNU GRUB is a very powerful boot loader, which can load a wide variety of free operating systems, as well as proprietary operating systems with chain-loading(1) (*note Overview-Footnote-1::). GRUB is designed to address the complexity of booting a personal computer; both the program and this manual are tightly bound to that computer platform, although porting to other platforms may be addressed in the future. One of the important features in GRUB is flexibility; GRUB understands filesystems and kernel executable formats, so you can load an arbitrary operating system the way you like, without recording the physical position of your kernel on the disk. Thus you can load the kernel just by specifying its file name and the drive and partition where the kernel resides. When booting with GRUB, you can use either a command-line interface (*note Command-line interface::), or a menu interface (*note Menu interface::). Using the command-line interface, you type the drive specification and file name of the kernel manually. In the menu interface, you just select an OS using the arrow keys. The menu is based on a configuration file which you prepare beforehand (*note Configuration::). While in the menu, you can switch to the command-line mode, and vice-versa. You can even edit menu entries before using them. In the following chapters, you will learn how to specify a drive, a partition, and a file name (*note Naming convention::) to GRUB, how to install GRUB on your drive (*note Installation::), and how to boot your OSes (*note Booting::), step by step.  File: grub.info, Node: Overview-Footnotes, Up: Overview (1) "chain-load" is the mechanism for loading unsupported operating systems by loading another boot loader. It is typically used for loading DOS or Windows.  File: grub.info, Node: History, Next: Changes from GRUB Legacy, Prev: Overview, Up: Introduction 1.2 History of GRUB =================== GRUB originated in 1995 when Erich Boleyn was trying to boot the GNU Hurd with the University of Utah's Mach 4 microkernel (now known as GNU Mach). Erich and Brian Ford designed the Multiboot Specification (*note Multiboot Specification: (multiboot)Top.), because they were determined not to add to the large number of mutually-incompatible PC boot methods. Erich then began modifying the FreeBSD boot loader so that it would understand Multiboot. He soon realized that it would be a lot easier to write his own boot loader from scratch than to keep working on the FreeBSD boot loader, and so GRUB was born. Erich added many features to GRUB, but other priorities prevented him from keeping up with the demands of its quickly-expanding user base. In 1999, Gordon Matzigkeit and Yoshinori K. Okuji adopted GRUB as an official GNU package, and opened its development by making the latest sources available via anonymous CVS. *Note Obtaining and Building GRUB::, for more information. Over the next few years, GRUB was extended to meet many needs, but it quickly became clear that its design was not keeping up with the extensions being made to it, and we reached the point where it was very difficult to make any further changes without breaking existing features. Around 2002, Yoshinori K. Okuji started work on PUPA (Preliminary Universal Programming Architecture for GNU GRUB), aiming to rewrite the core of GRUB to make it cleaner, safer, more robust, and more powerful. PUPA was eventually renamed to GRUB 2, and the original version of GRUB was renamed to GRUB Legacy. Small amounts of maintenance continued to be done on GRUB Legacy, but the last release (0.97) was made in 2005 and at the time of writing it seems unlikely that there will be another. By around 2007, GNU/Linux distributions started to use GRUB 2 to limited extents, and by the end of 2009 multiple major distributions were installing it by default.  File: grub.info, Node: Changes from GRUB Legacy, Next: Features, Prev: History, Up: Introduction 1.3 Differences from previous versions ====================================== GRUB 2 is a rewrite of GRUB (*note History::), although it shares many characteristics with the previous version, now known as GRUB Legacy. Users of GRUB Legacy may need some guidance to find their way around this new version. * The configuration file has a new name ('grub.cfg' rather than 'menu.lst' or 'grub.conf'), new syntax (*note Configuration::) and many new commands (*note Commands::). Configuration cannot be copied over directly, although most GRUB Legacy users should not find the syntax too surprising. * 'grub.cfg' is typically automatically generated by 'grub-mkconfig' (*note Simple configuration::). This makes it easier to handle versioned kernel upgrades. * Partition numbers in GRUB device names now start at 1, not 0 (*note Naming convention::). * The configuration file is now written in something closer to a full scripting language: variables, conditionals, and loops are available. * A small amount of persistent storage is available across reboots, using the 'save_env' and 'load_env' commands in GRUB and the 'grub-editenv' utility. This is not available in all configurations (*note Environment block::). * GRUB 2 has more reliable ways to find its own files and those of target kernels on multiple-disk systems, and has commands (*note search::) to find devices using file system labels or Universally Unique Identifiers (UUIDs). * GRUB 2 is available for several other types of system in addition to the PC BIOS systems supported by GRUB Legacy: PC EFI, PC coreboot, PowerPC, SPARC, and MIPS Lemote Yeeloong are all supported. * Many more file systems are supported, including but not limited to ext4, HFS+, and NTFS. * GRUB 2 can read files directly from LVM and RAID devices. * A graphical terminal and a graphical menu system are available. * GRUB 2's interface can be translated, including menu entry names. * The image files (*note Images::) that make up GRUB have been reorganised; Stage 1, Stage 1.5, and Stage 2 are no more. * GRUB 2 puts many facilities in dynamically loaded modules, allowing the core image to be smaller, and allowing the core image to be built in more flexible ways.  File: grub.info, Node: Features, Next: Role of a boot loader, Prev: Changes from GRUB Legacy, Up: Introduction 1.4 GRUB features ================= The primary requirement for GRUB is that it be compliant with the "Multiboot Specification", which is described in *note Multiboot Specification: (multiboot)Top. The other goals, listed in approximate order of importance, are: * Basic functions must be straightforward for end-users. * Rich functionality to support kernel experts and designers. * Backward compatibility for booting FreeBSD, NetBSD, OpenBSD, and Linux. Proprietary kernels (such as DOS, Windows NT, and OS/2) are supported via a chain-loading function. Except for specific compatibility modes (chain-loading and the Linux "piggyback" format), all kernels will be started in much the same state as in the Multiboot Specification. Only kernels loaded at 1 megabyte or above are presently supported. Any attempt to load below that boundary will simply result in immediate failure and an error message reporting the problem. In addition to the requirements above, GRUB has the following features (note that the Multiboot Specification doesn't require all the features that GRUB supports): Recognize multiple executable formats Support many of the "a.out" variants plus "ELF". Symbol tables are also loaded. Support non-Multiboot kernels Support many of the various free 32-bit kernels that lack Multiboot compliance (primarily FreeBSD, NetBSD(1) (*note Features-Footnote-1::), OpenBSD, and Linux). Chain-loading of other boot loaders is also supported. Load multiples modules Fully support the Multiboot feature of loading multiple modules. Load a configuration file Support a human-readable text configuration file with preset boot commands. You can also load another configuration file dynamically and embed a preset configuration file in a GRUB image file. The list of commands (*note Commands::) are a superset of those supported on the command-line. An example configuration file is provided in *note Configuration::. Provide a menu interface A menu interface listing preset boot commands, with a programmable timeout, is available. There is no fixed limit on the number of boot entries, and the current implementation has space for several hundred. Have a flexible command-line interface A fairly flexible command-line interface, accessible from the menu, is available to edit any preset commands, or write a new boot command set from scratch. If no configuration file is present, GRUB drops to the command-line. The list of commands (*note Commands::) are a subset of those supported for configuration files. Editing commands closely resembles the Bash command-line (*note Bash: (features)Command Line Editing.), with -completion of commands, devices, partitions, and files in a directory depending on context. Support multiple filesystem types Support multiple filesystem types transparently, plus a useful explicit blocklist notation. The currently supported filesystem types are "Amiga Fast FileSystem (AFFS)", "AtheOS fs", "BeFS", "BtrFS" (including raid0, raid1, raid10, gzip and lzo), "cpio" (little- and big-endian bin, odc and newc variants), "EROFS" (only uncompressed support for now), "Linux ext2/ext3/ext4", "DOS FAT12/FAT16/FAT32", "exFAT", "F2FS", "HFS", "HFS+", "ISO9660" (including Joliet, Rock-ridge and multi-chunk files), "JFS", "Minix fs" (versions 1, 2 and 3), "nilfs2", "NTFS" (including compression), "ReiserFS", "ROMFS", "Amiga Smart FileSystem (SFS)", "Squash4", "tar", "UDF", "BSD UFS/UFS2", "XFS", and "ZFS" (including lzjb, gzip, zle, mirror, stripe, raidz1/2/3 and encryption in AES-CCM and AES-GCM). *Note Filesystem::, for more information. Note: Only a subset of filesystems are supported in lockdown mode (such as when secure boot is enabled, *note Lockdown:: for more information). Support automatic decompression Can decompress files which were compressed by 'gzip' or 'xz'(2) (*note Features-Footnote-2::). This function is both automatic and transparent to the user (i.e. all functions operate upon the uncompressed contents of the specified files). This greatly reduces a file size and loading time, a particularly great benefit for floppies.(3) (*note Features-Footnote-3::) It is conceivable that some kernel modules should be loaded in a compressed state, so a different module-loading command can be specified to avoid uncompressing the modules. Access data on any installed device Support reading data from any or all floppies or hard disk(s) recognized by the BIOS, independent of the setting of the root device. Be independent of drive geometry translations Unlike many other boot loaders, GRUB makes the particular drive translation irrelevant. A drive installed and running with one translation may be converted to another translation without any adverse effects or changes in GRUB's configuration. Detect all installed RAM GRUB can generally find all the installed RAM on a PC-compatible machine. It uses an advanced BIOS query technique for finding all memory regions. As described on the Multiboot Specification (*note Multiboot Specification: (multiboot)Top.), not all kernels make use of this information, but GRUB provides it for those who do. Support Logical Block Address mode In traditional disk calls (called "CHS mode"), there is a geometry translation problem, that is, the BIOS cannot access over 1024 cylinders, so the accessible space is limited to at least 508 MB and to at most 8GB. GRUB can't universally solve this problem, as there is no standard interface used in all machines. However, several newer machines have the new interface, Logical Block Address ("LBA") mode. GRUB automatically detects if LBA mode is available and uses it if available. In LBA mode, GRUB can access the entire disk. Support network booting GRUB is basically a disk-based boot loader but also has network support. You can load OS images from a network by using the "TFTP" protocol. Support remote terminals To support computers with no console, GRUB provides remote terminal support, so that you can control GRUB from a remote host. Only serial terminal support is implemented at the moment.  File: grub.info, Node: Features-Footnotes, Up: Features (1) The NetBSD/i386 kernel is Multiboot-compliant, but lacks support for Multiboot modules. (2) Only CRC32 data integrity check is supported (xz default is CRC64 so one should use -check=crc32 option). LZMA BCJ filters are supported. (3) There are a few pathological cases where loading a very badly organized ELF kernel might take longer, but in practice this never happen.  File: grub.info, Node: Role of a boot loader, Prev: Features, Up: Introduction 1.5 The role of a boot loader ============================= The following is a quotation from Gordon Matzigkeit, a GRUB fanatic: Some people like to acknowledge both the operating system and kernel when they talk about their computers, so they might say they use "GNU/Linux" or "GNU/Hurd". Other people seem to think that the kernel is the most important part of the system, so they like to call their GNU operating systems "Linux systems." I, personally, believe that this is a grave injustice, because the _boot loader_ is the most important software of all. I used to refer to the above systems as either "LILO"(1) (*note Role of a boot loader-Footnote-1::) or "GRUB" systems. Unfortunately, nobody ever understood what I was talking about; now I just use the word "GNU" as a pseudonym for GRUB. So, if you ever hear people talking about their alleged "GNU" systems, remember that they are actually paying homage to the best boot loader around... GRUB! We, the GRUB maintainers, do not (usually) encourage Gordon's level of fanaticism, but it helps to remember that boot loaders deserve recognition. We hope that you enjoy using GNU GRUB as much as we did writing it.  File: grub.info, Node: Role of a boot loader-Footnotes, Up: Role of a boot loader (1) The LInux LOader, a boot loader that everybody uses, but nobody likes.  File: grub.info, Node: Naming convention, Next: OS-specific notes about grub tools, Prev: Introduction, Up: Top 2 Naming convention ******************* The device syntax used in GRUB is a wee bit different from what you may have seen before in your operating system(s), and you need to know it so that you can specify a drive/partition. Look at the following examples and explanations: (fd0) First of all, GRUB requires that the device name be enclosed with '(' and ')'. The 'fd' part means that it is a floppy disk. The number '0' is the drive number, which is counted from _zero_. This expression means that GRUB will use the whole floppy disk. (hd0,msdos2) Here, 'hd' means it is a hard disk drive. The first integer '0' indicates the drive number, that is, the first hard disk, the string 'msdos' indicates the partition scheme, while the second integer, '2', indicates the partition number (or the PC slice number in the BSD terminology). The partition numbers are counted from _one_, not from zero (as was the case in previous versions of GRUB). This expression means the second partition of the first hard disk drive. In this case, GRUB uses one partition of the disk, instead of the whole disk. (hd0,msdos5) This specifies the first "extended partition" of the first hard disk drive. Note that the partition numbers for extended partitions are counted from '5', regardless of the actual number of primary partitions on your hard disk. (hd1,msdos1,bsd1) This means the BSD 'a' partition on first PC slice number of the second hard disk. Of course, to actually access the disks or partitions with GRUB, you need to use the device specification in a command, like 'set root=(fd0)' or 'parttool (hd0,msdos3) hidden-'. To help you find out which number specifies a partition you want, the GRUB command-line (*note Command-line interface::) options have argument completion. This means that, for example, you only need to type set root=( followed by a , and GRUB will display the list of drives, partitions, or file names. So it should be quite easy to determine the name of your target partition, even with minimal knowledge of the syntax. Note that GRUB does _not_ distinguish IDE from SCSI - it simply counts the drive numbers from zero, regardless of their type. Normally, any IDE drive number is less than any SCSI drive number, although that is not true if you change the boot sequence by swapping IDE and SCSI drives in your BIOS. Now the question is, how to specify a file? Again, consider an example: (hd0,msdos1)/vmlinuz This specifies the file named 'vmlinuz', found on the first partition of the first hard disk drive. Note that the argument completion works with file names, too. That was easy, admit it. Now read the next chapter, to find out how to actually install GRUB on your drive.  File: grub.info, Node: OS-specific notes about grub tools, Next: Installation, Prev: Naming convention, Up: Top 3 OS-specific notes about grub tools ************************************ On OS which have device nodes similar to Unix-like OS GRUB tools use the OS name. E.g. for GNU/Linux: # grub-install /dev/sda On AROS we use another syntax. For volumes: //: E.g. //:DH0 For disks we use syntax: //:/unit/flags E.g. # grub-install //:ata.device/0/0 On Windows we use UNC path. For volumes it's typically \\?\Volume{} \\?\: E.g. \\?\Volume{17f34d50-cf64-4b02-800e-51d79c3aa2ff} \\?\C: For disks it's \\?\PhysicalDrive E.g. # grub-install \\?\PhysicalDrive0 Beware that you may need to further escape the backslashes depending on your shell. When compiled with cygwin support then cygwin drive names are automatically when needed. E.g. # grub-install /dev/sda  File: grub.info, Node: Installation, Next: Booting, Prev: OS-specific notes about grub tools, Up: Top 4 Installation ************** In order to install GRUB as your boot loader, you need to first install the GRUB system and utilities under your UNIX-like operating system (*note Obtaining and Building GRUB::). You can do this either from the source tarball, or as a package for your OS. After you have done that, you need to install the boot loader on a drive (floppy or hard disk) by using the utility 'grub-install' (*note Invoking grub-install::) on a UNIX-like OS. GRUB comes with boot images, which are normally put in the directory '/usr/lib/grub/-' (for BIOS-based machines '/usr/lib/grub/i386-pc'). Hereafter, the directory where GRUB images are initially placed (normally '/usr/lib/grub/-') will be called the "image directory", and the directory where the boot loader needs to find them (usually '/boot') will be called the "boot directory". * Menu: * Installing GRUB using grub-install:: * Making a GRUB bootable CD-ROM:: * Device map:: * BIOS installation::  File: grub.info, Node: Installing GRUB using grub-install, Next: Making a GRUB bootable CD-ROM, Up: Installation 4.1 Installing GRUB using grub-install ====================================== For information on where GRUB should be installed on PC BIOS platforms, *note BIOS installation::. In order to install GRUB under a UNIX-like OS (such as GNU), invoke the program 'grub-install' (*note Invoking grub-install::) as the superuser ("root"). The usage is basically very simple. You only need to specify one argument to the program, namely, where to install the boot loader. The argument has to be either a device file (like '/dev/hda'). For example, under Linux the following will install GRUB into the MBR of the first IDE disk: # grub-install /dev/sda Likewise, under GNU/Hurd, this has the same effect: # grub-install /dev/hd0 But all the above examples assume that GRUB should put images under the '/boot' directory. If you want GRUB to put images under a directory other than '/boot', you need to specify the option '--boot-directory'. The typical usage is that you create a GRUB boot floppy with a filesystem. Here is an example: # mke2fs /dev/fd0 # mount -t ext2 /dev/fd0 /mnt # mkdir /mnt/boot # grub-install --boot-directory=/mnt/boot /dev/fd0 # umount /mnt Some BIOSes have a bug of exposing the first partition of a USB drive as a floppy instead of exposing the USB drive as a hard disk (they call it "USB-FDD" boot). In such cases, you need to install like this: # losetup /dev/loop0 /dev/sdb1 # mount /dev/loop0 /mnt/usb # grub-install --boot-directory=/mnt/usb/bugbios --force --allow-floppy /dev/loop0 This install doesn't conflict with standard install as long as they are in separate directories. On EFI systems for fixed disk install you have to mount EFI System Partition. If you mount it at '/boot/efi' then you don't need any special arguments: # grub-install Otherwise you need to specify where your EFI System partition is mounted: # grub-install --efi-directory=/mnt/efi For removable installs you have to use '--removable' and specify both '--boot-directory' and '--efi-directory': # grub-install --efi-directory=/mnt/usb --boot-directory=/mnt/usb/boot --removable  File: grub.info, Node: Making a GRUB bootable CD-ROM, Next: Device map, Prev: Installing GRUB using grub-install, Up: Installation 4.2 Making a GRUB bootable CD-ROM ================================= GRUB supports the "no emulation mode" in the El Torito specification(1) (*note Making a GRUB bootable CD-ROM-Footnote-1::). This means that you can use the whole CD-ROM from GRUB and you don't have to make a floppy or hard disk image file, which can cause compatibility problems. For booting from a CD-ROM, GRUB uses a special image called 'cdboot.img', which is concatenated with 'core.img'. The 'core.img' used for this should be built with at least the 'iso9660' and 'biosdisk' modules. Your bootable CD-ROM will usually also need to include a configuration file 'grub.cfg' and some other GRUB modules. To make a simple generic GRUB rescue CD, you can use the 'grub-mkrescue' program (*note Invoking grub-mkrescue::): $ grub-mkrescue -o grub.iso You will often need to include other files in your image. To do this, first make a top directory for the bootable image, say, 'iso': $ mkdir iso Make a directory for GRUB: $ mkdir -p iso/boot/grub If desired, make the config file 'grub.cfg' under 'iso/boot/grub' (*note Configuration::), and copy any files and directories for the disc to the directory 'iso/'. Finally, make the image: $ grub-mkrescue -o grub.iso iso This produces a file named 'grub.iso', which then can be burned into a CD (or a DVD), or written to a USB mass storage device. The root device will be set up appropriately on entering your 'grub.cfg' configuration file, so you can refer to file names on the CD without needing to use an explicit device name. This makes it easier to produce rescue images that will work on both optical drives and USB mass storage devices.  File: grub.info, Node: Making a GRUB bootable CD-ROM-Footnotes, Up: Making a GRUB bootable CD-ROM (1) El Torito is a specification for bootable CD using BIOS functions.  File: grub.info, Node: Device map, Next: BIOS installation, Prev: Making a GRUB bootable CD-ROM, Up: Installation 4.3 The map between BIOS drives and OS devices ============================================== If the device map file exists, the GRUB utilities ('grub-probe', etc.) read it to map BIOS drives to OS devices. This file consists of lines like this: (DEVICE) FILE DEVICE is a drive specified in the GRUB syntax (*note Device syntax::), and FILE is an OS file, which is normally a device file. Historically, the device map file was used because GRUB device names had to be used in the configuration file, and they were derived from BIOS drive numbers. The map between BIOS drives and OS devices cannot always be guessed correctly: for example, GRUB will get the order wrong if you exchange the boot sequence between IDE and SCSI in your BIOS. Unfortunately, even OS device names are not always stable. Modern versions of the Linux kernel may probe drives in a different order from boot to boot, and the prefix ('/dev/hd*' versus '/dev/sd*') may change depending on the driver subsystem in use. As a result, the device map file required frequent editing on some systems. GRUB avoids this problem nowadays by using UUIDs or file system labels when generating 'grub.cfg', and we advise that you do the same for any custom menu entries you write. If the device map file does not exist, then the GRUB utilities will assume a temporary device map on the fly. This is often good enough, particularly in the common case of single-disk systems. However, the device map file is not entirely obsolete yet, and it is used for overriding when current environment is different from the one on boot. Most common case is if you use a partition or logical volume as a disk for virtual machine. You can put any comments in the file if needed, as the GRUB utilities assume that a line is just a comment if the first character is '#'.  File: grub.info, Node: BIOS installation, Prev: Device map, Up: Installation 4.4 BIOS installation ===================== MBR === The partition table format traditionally used on PC BIOS platforms is called the Master Boot Record (MBR) format; this is the format that allows up to four primary partitions and additional logical partitions. With this partition table format, there are two ways to install GRUB: it can be embedded in the area between the MBR and the first partition (called by various names, such as the "boot track", "MBR gap", or "embedding area", and which is usually at least 1000 KiB), or the core image can be installed in a file system and a list of the blocks that make it up can be stored in the first sector of that partition. Modern tools usually leave MBR gap of at least 1023 KiB. This amount is sufficient to cover most configurations. Hence this value is recommended by the GRUB team. Historically many tools left only 31 KiB of space. This is not enough to parse reliably difficult structures like Btrfs, ZFS, RAID or LVM, or to use difficult disk access methods like ahci. Hence GRUB will warn if attempted to install into small MBR gap except in a small number of configurations that were grandfathered. The grandfathered config must: * use biosdisk as disk access module for '/boot' * not use any additional partition maps to access '/boot' * '/boot' must be on one of following filesystems: AFFS, AFS, BFS, cpio, newc, odc, ext2/3/4, FAT, exFAT, F2FS, HFS, uncompressed HFS+, ISO9660, JFS, Minix, Minix2, Minix3, NILFS2, NTFS, ReiserFS, ROMFS, SFS, tar, UDF, UFS1, UFS2, XFS Note: Only a subset of filesystems are supported in lockdown mode (such as when secure boot is enabled, *note Lockdown:: for more information). MBR gap has few technical problems. There is no way to reserve space in the embedding area with complete safety, and some proprietary software is known to use it to make it difficult for users to work around licensing restrictions. GRUB works around it by detecting sectors by other software and avoiding them and protecting its own sectors using Reed-Solomon encoding. GRUB team recommends having MBR gap of at least 1000 KiB. Should it not be possible, GRUB has support for a fallback solution which is heavily recommended against. Installing to a filesystem means that GRUB is vulnerable to its blocks being moved around by filesystem features such as tail packing, or even by aggressive fsck implementations, so this approach is quite fragile; and this approach can only be used if the '/boot' filesystem is on the same disk that the BIOS boots from, so that GRUB does not have to rely on guessing BIOS drive numbers. The GRUB development team generally recommends embedding GRUB before the first partition, unless you have special requirements. You must ensure that the first partition starts at least 1000 KiB (2000 sectors) from the start of the disk; on modern disks, it is often a performance advantage to align partitions on larger boundaries anyway, so the first partition might start 1 MiB from the start of the disk. GPT === Some newer systems use the GUID Partition Table (GPT) format. This was specified as part of the Extensible Firmware Interface (EFI), but it can also be used on BIOS platforms if system software supports it; for example, GRUB and GNU/Linux can be used in this configuration. With this format, it is possible to reserve a whole partition for GRUB, called the BIOS Boot Partition. GRUB can then be embedded into that partition without the risk of being overwritten by other software and without being contained in a filesystem which might move its blocks around. When creating a BIOS Boot Partition on a GPT system, you should make sure that it is at least 31 KiB in size. (GPT-formatted disks are not usually particularly small, so we recommend that you make it larger than the bare minimum, such as 1 MiB, to allow plenty of room for growth.) You must also make sure that it has the proper partition type. Using GNU Parted, you can set this using a command such as the following: # parted /dev/DISK set PARTITION-NUMBER bios_grub on If you are using gdisk, set the partition type to '0xEF02'. With partitioning programs that require setting the GUID directly, it should be '21686148-6449-6e6f-744e656564454649'. *Caution:* Be very careful which partition you select! When GRUB finds a BIOS Boot Partition during installation, it will automatically overwrite part of it. Make sure that the partition does not contain any other data.  File: grub.info, Node: Booting, Next: Configuration, Prev: Installation, Up: Top 5 Booting ********* GRUB can load Multiboot-compliant kernels in a consistent way, but for some free operating systems you need to use some OS-specific magic. * Menu: * General boot methods:: How to boot OSes with GRUB generally * Loopback booting:: Notes on booting from loopbacks * LVM cache booting:: Notes on booting from LVM cache logical volume * OS-specific notes:: Notes on some operating systems  File: grub.info, Node: General boot methods, Next: Loopback booting, Up: Booting 5.1 How to boot operating systems ================================= GRUB has three distinct boot methods: loading an operating system directly, using kexec from userspace, and chainloading another bootloader. Generally speaking, the first two are more desirable because you don't need to install or maintain other boot loaders and GRUB is flexible enough to load an operating system from an arbitrary disk/partition. However, chainloading is sometimes required, as GRUB doesn't support all existing operating systems natively. * Menu: * Loading an operating system directly:: * Kexec:: * Chain-loading::  File: grub.info, Node: Loading an operating system directly, Next: Kexec, Up: General boot methods 5.1.1 How to boot an OS directly with GRUB ------------------------------------------ Multiboot (*note Multiboot Specification: (multiboot)Top.) is the native format supported by GRUB. For the sake of convenience, there is also support for Linux, FreeBSD, NetBSD and OpenBSD. If you want to boot other operating systems, you will have to chain-load them (*note Chain-loading::). FIXME: this section is incomplete. 1. Run the command 'boot' (*note boot::). However, DOS and Windows have some deficiencies, so you might have to use more complicated instructions. *Note DOS/Windows::, for more information.  File: grub.info, Node: Kexec, Next: Chain-loading, Prev: Loading an operating system directly, Up: General boot methods 5.1.2 Kexec with grub2-emu -------------------------- GRUB can be run in userspace by invoking the grub2-emu tool. It will read all configuration scripts as if booting directly (see *note Loading an operating system directly::). With the '--kexec' flag, and kexec(8) support from the operating system, the 'linux' command will directly boot the target image. For systems that lack working systemctl(1) support for kexec, passing the '--kexec' flag twice will fallback to invoking kexec(8) directly; note however that this fallback may be unsafe outside read-only environments, as it does not invoke shutdown machinery.  File: grub.info, Node: Chain-loading, Prev: Kexec, Up: General boot methods 5.1.3 Chain-loading an OS ------------------------- Operating systems that do not support Multiboot and do not have specific support in GRUB (specific support is available for Linux, FreeBSD, NetBSD and OpenBSD) must be chain-loaded, which involves loading another boot loader and jumping to it in real mode or via the firmware. The 'chainloader' command (*note chainloader::) is used to set this up. It is normally also necessary to load some GRUB modules and set the appropriate root device. Putting this together, we get something like this, for a Windows system on the first partition of the first hard disk: menuentry "Windows" { insmod chain insmod ntfs set root=(hd0,1) chainloader +1 } On systems with multiple hard disks, an additional workaround may be required. *Note DOS/Windows::. Chain-loading is only supported on PC BIOS and EFI platforms.  File: grub.info, Node: Loopback booting, Next: LVM cache booting, Prev: General boot methods, Up: Booting 5.2 Loopback booting ==================== GRUB is able to read from an image (be it one of CD or HDD) stored on any of its accessible storages (refer to *note loopback:: command). However the OS itself should be able to find its root. This usually involves running a userspace program running before the real root is discovered. This is achieved by GRUB loading a specially made small image and passing it as ramdisk to the kernel. This is achieved by commands 'kfreebsd_module', 'knetbsd_module_elf', 'kopenbsd_ramdisk', 'initrd' (*note initrd::), 'initrd16' (*note initrd16::), 'multiboot_module', 'multiboot2_module' or 'xnu_ramdisk' depending on the loader. Note that for knetbsd the image must be put inside miniroot.kmod and the whole miniroot.kmod has to be loaded. In kopenbsd payload this is disabled by default. Additionally, behaviour of initial ramdisk depends on command line options. Several distributors provide the image for this purpose or it's integrated in their standard ramdisk and activated by special option. Consult your kernel and distribution manual for more details. Other loaders like 'appleloader', 'chainloader' (BIOS, EFI, coreboot), 'freedos', 'ntldr', 'plan9' and 'truecrypt' provide no possibility of loading initial ramdisk and as far as author is aware the payloads in question don't support either initial ramdisk or discovering loopback boot in other way and as such not bootable this way. Please consider alternative boot methods like copying all files from the image to actual partition. Consult your OS documentation for more details.  File: grub.info, Node: LVM cache booting, Next: OS-specific notes, Prev: Loopback booting, Up: Booting 5.3 Booting from LVM cache logical volume ========================================= The LVM cache logical volume is the logical volume consisting of the original and the cache pool logical volume. The original is usually on a larger and slower storage device while the cache pool is on a smaller and faster one. The performance of the original volume can be improved by storing the frequently used data on the cache pool to utilize the greater performance of faster device. GRUB boots from LVM cache logical volume merely by reading it's original logical volume so that dirty data in cache pool volume is disregarded. This is not a problem for "writethrough" cache mode as it ensures that any data written will be stored both on the cache and the origin LV. For the other cache mode "writeback", which delays writing from the cache pool back to the origin LV to boost performance, GRUB may fail to boot in the wake of accidental power outage due to it's inability to assemble the cache device for reading the required dirty data left behind. The situation will be improved after adding full support to the LVM cache logical volume in the future.  File: grub.info, Node: OS-specific notes, Prev: LVM cache booting, Up: Booting 5.4 Some caveats on OS-specific issues ====================================== Here, we describe some caveats on several operating systems. * Menu: * GNU/Hurd:: * GNU/Linux:: * NetBSD:: * DOS/Windows::  File: grub.info, Node: GNU/Hurd, Next: GNU/Linux, Up: OS-specific notes 5.4.1 GNU/Hurd -------------- Since GNU/Hurd is Multiboot-compliant, it is easy to boot it; there is nothing special about it. But do not forget that you have to specify a root partition to the kernel. 1. Set GRUB's root device to the same drive as GNU/Hurd's. The command 'search --set=root --file /boot/gnumach.gz' or similar may help you (*note search::). 2. Load the kernel and the modules, like this: grub> multiboot /boot/gnumach.gz root=device:hd0s1 grub> module /hurd/ext2fs.static ext2fs --readonly \ --multiboot-command-line='${kernel-command-line}' \ --host-priv-port='${host-port}' \ --device-master-port='${device-port}' \ --exec-server-task='${exec-task}' -T typed '${root}' \ '$(task-create)' '$(task-resume)' grub> module /lib/ld.so.1 exec /hurd/exec '$(exec-task=task-create)' 3. Finally, run the command 'boot' (*note boot::).  File: grub.info, Node: GNU/Linux, Next: NetBSD, Prev: GNU/Hurd, Up: OS-specific notes 5.4.2 GNU/Linux --------------- It is relatively easy to boot GNU/Linux from GRUB, because it somewhat resembles to boot a Multiboot-compliant OS. 1. Set GRUB's root device to the same drive as GNU/Linux's. The command 'search --set=root --file /vmlinuz' or similar may help you (*note search::). 2. Load the kernel using the command 'linux' (*note linux::): grub> linux /vmlinuz root=/dev/sda1 If you need to specify some kernel parameters, just append them to the command. For example, to set 'acpi' to 'off', do this: grub> linux /vmlinuz root=/dev/sda1 acpi=off See the documentation in the Linux source tree for complete information on the available options. With 'linux' GRUB uses 32-bit protocol. Some BIOS services like APM or EDD aren't available with this protocol. In this case you need to use 'linux16' grub> linux16 /vmlinuz root=/dev/sda1 acpi=off 3. If you use an initrd, execute the command 'initrd' (*note initrd::) after 'linux': grub> initrd /initrd If you used 'linux16' you need to use 'initrd16': grub> initrd16 /initrd 4. Finally, run the command 'boot' (*note boot::).  File: grub.info, Node: NetBSD, Next: DOS/Windows, Prev: GNU/Linux, Up: OS-specific notes 5.4.3 NetBSD ------------ Booting a NetBSD kernel from GRUB is also relatively easy: first set GRUB's root device, then load the kernel and the modules, and finally run 'boot'. 1. Set GRUB's root device to the partition holding the NetBSD root file system. For a disk with a NetBSD disk label, this is usually the first partition (a:). In that case, and assuming that the partition is on the first hard disk, set GRUB's root device as follows: grub> insmod part_bsd grub> set root=(hd0,netbsd1) For a disk with a GUID Partition Table (GPT), and assuming that the NetBSD root partition is the third GPT partition, do this: grub> insmod part_gpt grub> set root=(hd0,gpt3) 2. Load the kernel using the command 'knetbsd': grub> knetbsd /netbsd Various options may be given to 'knetbsd'. These options are, for the most part, the same as in the NetBSD boot loader. For instance, to boot the system in single-user mode and with verbose messages, do this: grub> knetbsd /netbsd -s -v 3. If needed, load kernel modules with the command 'knetbsd_module_elf'. A typical example is the module for the root file system: grub> knetbsd_module_elf /stand/amd64/6.0/modules/ffs/ffs.kmod 4. Finally, run the command 'boot' (*note boot::).  File: grub.info, Node: DOS/Windows, Prev: NetBSD, Up: OS-specific notes 5.4.4 DOS/Windows ----------------- GRUB cannot boot DOS or Windows directly, so you must chain-load them (*note Chain-loading::). However, their boot loaders have some critical deficiencies, so it may not work to just chain-load them. To overcome the problems, GRUB provides you with two helper functions. If you have installed DOS (or Windows) on a non-first hard disk, you have to use the disk swapping technique, because that OS cannot boot from any disks but the first one. The workaround used in GRUB is the command 'drivemap' (*note drivemap::), like this: drivemap -s (hd0) (hd1) This performs a "virtual" swap between your first and second hard drive. *Caution:* This is effective only if DOS (or Windows) uses BIOS to access the swapped disks. If that OS uses a special driver for the disks, this probably won't work. Another problem arises if you installed more than one set of DOS/Windows onto one disk, because they could be confused if there are more than one primary partitions for DOS/Windows. Certainly you should avoid doing this, but there is a solution if you do want to do so. Use the partition hiding/unhiding technique. If GRUB "hides" a DOS (or Windows) partition (*note parttool::), DOS (or Windows) will ignore the partition. If GRUB "unhides" a DOS (or Windows) partition, DOS (or Windows) will detect the partition. Thus, if you have installed DOS (or Windows) on the first and the second partition of the first hard disk, and you want to boot the copy on the first partition, do the following: parttool (hd0,1) hidden- parttool (hd0,2) hidden+ set root=(hd0,1) chainloader +1 parttool ${root} boot+ boot  File: grub.info, Node: Configuration, Next: Theme file format, Prev: Booting, Up: Top 6 Writing your own configuration file ************************************* GRUB is configured using 'grub.cfg', usually located under '/boot/grub'. This file is quite flexible, but most users will not need to write the whole thing by hand. * Menu: * Simple configuration:: Recommended for most users * Root Identification Heuristics:: Summary on how the root file system is identified. * Shell-like scripting:: For power users and developers * Multi-boot manual config:: For non-standard multi-OS scenarios * Embedded configuration:: Embedding a configuration file into GRUB  File: grub.info, Node: Simple configuration, Next: Root Identification Heuristics, Up: Configuration 6.1 Simple configuration handling ================================= The program 'grub-mkconfig' (*note Invoking grub-mkconfig::) generates 'grub.cfg' files suitable for most cases. It is suitable for use when upgrading a distribution, and will discover available kernels and attempt to generate menu entries for them. 'grub-mkconfig' does have some limitations. While adding extra custom menu entries to the end of the list can be done by editing '/etc/grub.d/40_custom' or creating '/boot/grub/custom.cfg', changing the order of menu entries or changing their titles may require making complex changes to shell scripts stored in '/etc/grub.d/'. This may be improved in the future. In the meantime, those who feel that it would be easier to write 'grub.cfg' directly are encouraged to do so (*note Booting::, and *note Shell-like scripting::), and to disable any system provided by their distribution to automatically run 'grub-mkconfig'. The file '/etc/default/grub' controls the operation of 'grub-mkconfig'. It is sourced by a shell script, and so must be valid POSIX shell input; normally, it will just be a sequence of 'KEY=value' lines, but if the value contains spaces or other special characters then it must be quoted. For example: GRUB_TERMINAL_INPUT="console serial" Valid keys in '/etc/default/grub' are as follows: 'GRUB_DEFAULT' The default menu entry. This may be a number, in which case it identifies the Nth entry in the generated menu counted from zero, or the title of a menu entry, or the special string 'saved'. Using the id may be useful if you want to set a menu entry as the default even though there may be a variable number of entries before it. For example, if you have: menuentry 'Example GNU/Linux distribution' --class gnu-linux --id example-gnu-linux { ... } then you can make this the default using: GRUB_DEFAULT=example-gnu-linux Previously it was documented the way to use entry title. While this still works it's not recommended since titles often contain unstable device names and may be translated If you set this to 'saved', then the default menu entry will be that saved by 'GRUB_SAVEDEFAULT' or 'grub-set-default'. This relies on the environment block, which may not be available in all situations (*note Environment block::). The default is '0'. 'GRUB_SAVEDEFAULT' If this option is set to 'true', then, when an entry is selected, save it as a new default entry for use by future runs of GRUB. This is only useful if 'GRUB_DEFAULT=saved'; it is a separate option because 'GRUB_DEFAULT=saved' is useful without this option, in conjunction with 'grub-set-default'. Unset by default. This option relies on the environment block, which may not be available in all situations (*note Environment block::). 'GRUB_TIMEOUT' Boot the default entry this many seconds after the menu is displayed, unless a key is pressed. The default is '5'. Set to '0' to boot immediately without displaying the menu, or to '-1' to wait indefinitely. If 'GRUB_TIMEOUT_STYLE' is set to 'countdown' or 'hidden', the timeout is instead counted before the menu is displayed. 'GRUB_TIMEOUT_STYLE' If this option is unset or set to 'menu', then GRUB will display the menu and then wait for the timeout set by 'GRUB_TIMEOUT' to expire before booting the default entry. Pressing a key interrupts the timeout. If this option is set to 'countdown' or 'hidden', then, before displaying the menu, GRUB will wait for the timeout set by 'GRUB_TIMEOUT' to expire. If or are pressed, or is held down during that time, it will display the menu and wait for input. If a hotkey associated with a menu entry is pressed, it will boot the associated menu entry immediately. If the timeout expires before either of these happens, it will boot the default entry. In the 'countdown' case, it will show a one-line indication of the remaining time. 'GRUB_DEFAULT_BUTTON' 'GRUB_TIMEOUT_BUTTON' 'GRUB_TIMEOUT_STYLE_BUTTON' 'GRUB_BUTTON_CMOS_ADDRESS' Variants of the corresponding variables without the '_BUTTON' suffix, used to support vendor-specific power buttons. *Note Vendor power-on keys::. 'GRUB_DISTRIBUTOR' Set by distributors of GRUB to their identifying name. This is used to generate more informative menu entry titles. 'GRUB_TERMINAL_INPUT' Select the terminal input device. You may select multiple devices here, separated by spaces. Valid terminal input names depend on the platform, but may include 'console' (native platform console), 'serial' (serial terminal), 'serial_' (serial terminal with explicit port selection), 'at_keyboard' (PC AT keyboard), or 'usb_keyboard' (USB keyboard using the HID Boot Protocol, for cases where the firmware does not handle this). The default is to use the platform's native terminal input. 'GRUB_TERMINAL_OUTPUT' Select the terminal output device. You may select multiple devices here, separated by spaces. Valid terminal output names depend on the platform, but may include 'console' (native platform console), 'serial' (serial terminal), 'serial_' (serial terminal with explicit port selection), 'gfxterm' (graphics-mode output), 'vga_text' (VGA text output), 'mda_text' (MDA text output), 'morse' (Morse-coding using system beeper) or 'spkmodem' (simple data protocol using system speaker). 'spkmodem' is useful when no serial port is available. Connect the output of sending system (where GRUB is running) to line-in of receiving system (usually developer machine). On receiving system compile 'spkmodem-recv' from 'util/spkmodem-recv.c' and run: parecord --channels=1 --rate=48000 --format=s16le | ./spkmodem-recv The default is to use the platform's native terminal output. 'GRUB_TERMINAL' If this option is set, it overrides both 'GRUB_TERMINAL_INPUT' and 'GRUB_TERMINAL_OUTPUT' to the same value. 'GRUB_SERIAL_COMMAND' A command to configure the serial port when using the serial console. *Note serial::. Defaults to 'serial'. 'GRUB_CMDLINE_LINUX' Command-line arguments to add to menu entries for the Linux kernel. 'GRUB_CMDLINE_LINUX_DEFAULT' Unless 'GRUB_DISABLE_RECOVERY' is set to 'true', two menu entries will be generated for each Linux kernel: one default entry and one entry for recovery mode. This option lists command-line arguments to add only to the default menu entry, after those listed in 'GRUB_CMDLINE_LINUX'. 'GRUB_CMDLINE_LINUX_RECOVERY' Unless 'GRUB_DISABLE_RECOVERY' is set to 'true', two menu entries will be generated for each Linux kernel: one default entry and one entry for recovery mode. This option lists command-line arguments to add only to the recovery menu entry, before those listed in 'GRUB_CMDLINE_LINUX'. The default is 'single'. 'GRUB_CMDLINE_NETBSD' 'GRUB_CMDLINE_NETBSD_DEFAULT' As 'GRUB_CMDLINE_LINUX' and 'GRUB_CMDLINE_LINUX_DEFAULT', but for NetBSD. 'GRUB_CMDLINE_GNUMACH' As 'GRUB_CMDLINE_LINUX', but for GNU Mach. 'GRUB_CMDLINE_XEN' 'GRUB_CMDLINE_XEN_DEFAULT' The values of these options are passed to Xen hypervisor Xen menu entries, for all respectively normal entries. 'GRUB_CMDLINE_LINUX_XEN_REPLACE' 'GRUB_CMDLINE_LINUX_XEN_REPLACE_DEFAULT' The values of these options replace the values of 'GRUB_CMDLINE_LINUX' and 'GRUB_CMDLINE_LINUX_DEFAULT' for Linux and Xen menu entries. 'GRUB_TOP_LEVEL' 'GRUB_TOP_LEVEL_XEN' This option should be an absolute path to a kernel image. If provided, the image specified will be made the top-level entry if it is found in the scan. 'GRUB_TOP_LEVEL_OS_PROBER' This option should be a line of output from 'os-prober'. As 'GRUB_TOP_LEVEL', if provided, the image specified will be made the top-level entry if it is found in the scan. 'GRUB_EARLY_INITRD_LINUX_CUSTOM' 'GRUB_EARLY_INITRD_LINUX_STOCK' List of space-separated early initrd images to be loaded from '/boot'. This is for loading things like CPU microcode, firmware, ACPI tables, crypto keys, and so on. These early images will be loaded in the order declared, and all will be loaded before the actual functional initrd image. 'GRUB_EARLY_INITRD_LINUX_STOCK' is for your distribution to declare images that are provided by the distribution. It should not be modified without understanding the consequences. They will be loaded first. 'GRUB_EARLY_INITRD_LINUX_CUSTOM' is for your custom created images. The default stock images are as follows, though they may be overridden by your distribution: intel-uc.img intel-ucode.img amd-uc.img amd-ucode.img early_ucode.cpio microcode.cpio 'GRUB_DISABLE_LINUX_UUID' Normally, 'grub-mkconfig' will generate menu entries that use universally-unique identifiers (UUIDs) to identify the root filesystem to the Linux kernel, using a 'root=UUID=...' kernel parameter. This is usually more reliable, but in some cases it may not be appropriate. To disable the use of UUIDs, set this option to 'true'. 'GRUB_DISABLE_LINUX_PARTUUID' If 'grub-mkconfig' cannot identify the root filesystem via its universally-unique indentifier (UUID), 'grub-mkconfig' can use the UUID of the partition containing the filesystem to identify the root filesystem to the Linux kernel via a 'root=PARTUUID=...' kernel parameter. This is not as reliable as using the filesystem UUID, but is more reliable than using the Linux device names. When 'GRUB_DISABLE_LINUX_PARTUUID' is set to 'false', the Linux kernel version must be 2.6.37 (3.10 for systems using the MSDOS partition scheme) or newer. This option defaults to 'true'. To enable the use of partition UUIDs, set this option to 'false'. 'GRUB_DISABLE_RECOVERY' If this option is set to 'true', disable the generation of recovery mode menu entries. 'GRUB_DISABLE_UUID' Normally, 'grub-mkconfig' will generate menu entries that use universally-unique identifiers (UUIDs) to identify various filesystems to search for files. This is usually more reliable, but in some cases it may not be appropriate. To disable this use of UUIDs, set this option to 'true'. Setting this option to 'true', will also set the options 'GRUB_DISABLE_LINUX_UUID' and 'GRUB_DISABLE_LINUX_PARTUUID' to 'true', unless they have been explicitly set to 'false'. 'GRUB_VIDEO_BACKEND' If graphical video support is required, either because the 'gfxterm' graphical terminal is in use or because 'GRUB_GFXPAYLOAD_LINUX' is set, then 'grub-mkconfig' will normally load all available GRUB video drivers and use the one most appropriate for your hardware. If you need to override this for some reason, then you can set this option. After 'grub-install' has been run, the available video drivers are listed in '/boot/grub/video.lst'. 'GRUB_GFXMODE' Set the resolution used on the 'gfxterm' graphical terminal. Note that you can only use modes which your graphics card supports via VESA BIOS Extensions (VBE), so for example native LCD panel resolutions may not be available. The default is 'auto', which tries to select a preferred resolution. *Note gfxmode::. 'GRUB_BACKGROUND' Set a background image for use with the 'gfxterm' graphical terminal. The value of this option must be a file readable by GRUB at boot time, and it must end with '.png', '.tga', '.jpg', or '.jpeg'. The image will be scaled if necessary to fit the screen. Image height and width will be restricted by an artificial limit of 16384. 'GRUB_THEME' Set a theme for use with the 'gfxterm' graphical terminal. 'GRUB_GFXPAYLOAD_LINUX' Set to 'text' to force the Linux kernel to boot in normal text mode, 'keep' to preserve the graphics mode set using 'GRUB_GFXMODE', 'WIDTHxHEIGHT'['xDEPTH'] to set a particular graphics mode, or a sequence of these separated by commas or semicolons to try several modes in sequence. *Note gfxpayload::. Depending on your kernel, your distribution, your graphics card, and the phase of the moon, note that using this option may cause GNU/Linux to suffer from various display problems, particularly during the early part of the boot sequence. If you have problems, set this option to 'text' and GRUB will tell Linux to boot in normal text mode. 'GRUB_DISABLE_OS_PROBER' The 'grub-mkconfig' has a feature to use the external 'os-prober' program to discover other operating systems installed on the same machine and generate appropriate menu entries for them. It is disabled by default since automatic and silent execution of 'os-prober', and creating boot entries based on that data, is a potential attack vector. Set this option to 'false' to enable this feature in the 'grub-mkconfig' command. 'GRUB_OS_PROBER_SKIP_LIST' List of space-separated case insensitive UUIDs of filesystems to be ignored from os-prober output. For EFI chainloaders it's @. For backward compatibility with previous behaviour, @/dev/* is also accepted for non-EFI chainloaders even if the device does not match, and comma and semicolon are also accepted as separator. 'GRUB_DISABLE_SUBMENU' Normally, 'grub-mkconfig' will generate top level menu entry for the kernel with highest version number and put all other found kernels or alternative menu entries for recovery mode in submenu. For entries returned by 'os-prober' first entry will be put on top level and all others in submenu. If this option is set to 'true', flat menu with all entries on top level will be generated instead. Changing this option will require changing existing values of 'GRUB_DEFAULT', 'fallback' (*note fallback::) and 'default' (*note default::) environment variables as well as saved default entry using 'grub-set-default' and value used with 'grub-reboot'. 'GRUB_ENABLE_CRYPTODISK' If set to 'y', 'grub-mkconfig' and 'grub-install' will check for encrypted disks and generate additional commands needed to access them during boot. Note that in this case unattended boot is not possible because GRUB will wait for passphrase to unlock encrypted container. 'GRUB_INIT_TUNE' Play a tune on the speaker when GRUB starts. This is particularly useful for users unable to see the screen. The value of this option is passed directly to *note play::. 'GRUB_BADRAM' If this option is set, GRUB will issue a *note badram:: command to filter out specified regions of RAM. 'GRUB_PRELOAD_MODULES' This option may be set to a list of GRUB module names separated by spaces. Each module will be loaded as early as possible, at the start of 'grub.cfg'. The following options are still accepted for compatibility with existing configurations, but have better replacements: 'GRUB_HIDDEN_TIMEOUT' Wait this many seconds before displaying the menu. If or are pressed, or is held down during that time, display the menu and wait for input according to 'GRUB_TIMEOUT'. If a hotkey associated with a menu entry is pressed, boot the associated menu entry immediately. If the timeout expires before either of these happens, display the menu for the number of seconds specified in 'GRUB_TIMEOUT' before booting the default entry. If you set 'GRUB_HIDDEN_TIMEOUT', you should also set 'GRUB_TIMEOUT=0' so that the menu is not displayed at all unless or are pressed, or is held down. This option is unset by default, and is deprecated in favour of the less confusing 'GRUB_TIMEOUT_STYLE=countdown' or 'GRUB_TIMEOUT_STYLE=hidden'. 'GRUB_HIDDEN_TIMEOUT_QUIET' In conjunction with 'GRUB_HIDDEN_TIMEOUT', set this to 'true' to suppress the verbose countdown while waiting for a key to be pressed before displaying the menu. This option is unset by default, and is deprecated in favour of the less confusing 'GRUB_TIMEOUT_STYLE=countdown'. 'GRUB_HIDDEN_TIMEOUT_BUTTON' Variant of 'GRUB_HIDDEN_TIMEOUT', used to support vendor-specific power buttons. *Note Vendor power-on keys::. This option is unset by default, and is deprecated in favour of the less confusing 'GRUB_TIMEOUT_STYLE=countdown' or 'GRUB_TIMEOUT_STYLE=hidden'. For more detailed customisation of 'grub-mkconfig''s output, you may edit the scripts in '/etc/grub.d' directly. '/etc/grub.d/40_custom' is particularly useful for adding entire custom menu entries; simply type the menu entries you want to add at the end of that file, making sure to leave at least the first two lines intact.  File: grub.info, Node: Root Identification Heuristics, Next: Shell-like scripting, Prev: Simple configuration, Up: Configuration 6.2 Root Identification Heuristics ================================== If the target operating system uses the Linux kernel, 'grub-mkconfig' attempts to identify the root file system via a heuristic algoirthm. This algorithm selects the identification method of the root file system by considering three factors. The first is if an initrd for the target operating system is also present. The second is 'GRUB_DISABLE_LINUX_UUID' and if set to 'true', prevents 'grub-mkconfig' from identifying the root file system by its UUID. The third is 'GRUB_DISABLE_LINUX_PARTUUID' and if set to 'true', prevents 'grub-mkconfig' from identifying the root file system via the UUID of its enclosing partition. If the variables are assigned any other value, that value is considered equivalent to 'false'. The variables are also considered to be set to 'false' if they are not set. When booting, the Linux kernel will delegate the task of mounting the root filesystem to the initrd. Most initrd images determine the root file system by checking the Linux kernel's command-line for the 'root' key and use its value as the identification method of the root file system. To improve the reliability of booting, most initrd images also allow the root file system to be identified by its UUID. Because of this behavior, the 'grub-mkconfig' command will set 'root' to 'root=UUID=...' to provide the initrd with the filesystem UUID of the root file system. If no initrd is detected or 'GRUB_DISABLE_LINUX_UUID' is set to 'true' then 'grub-command' will identify the root filesystem by setting the kernel command-line variable 'root' to 'root=PARTUUID=...' unless 'GRUB_DISABLE_LINUX_PARTUUID' is also set to 'true'. If 'GRUB_DISABLE_LINUX_PARTUUID' is also set to 'true', 'grub-command' will identify by its Linux device name. The following table summarizes the behavior of the 'grub-mkconfig' command. Initrd GRUB_DISABLE_LINUX_PARTUUID GRUB_DISABLE_LINUX_UUID Linux Root detected Set To Set To ID Method -------------------------------------------------------------------------------- false false false part UUID false false true part UUID false true false dev name false true true dev name true false false fs UUID true false true part UUID true true false fs UUID true true true dev name Remember, 'GRUB_DISABLE_LINUX_PARTUUID' and 'GRUB_DISABLE_LINUX_UUID' are also considered to be set to 'true' and 'false', respectively, when they are unset.  File: grub.info, Node: Shell-like scripting, Next: Multi-boot manual config, Prev: Root Identification Heuristics, Up: Configuration 6.3 Writing full configuration files directly ============================================= 'grub.cfg' is written in GRUB's built-in scripting language, which has a syntax quite similar to that of GNU Bash and other Bourne shell derivatives. Words ===== A "word" is a sequence of characters considered as a single unit by GRUB. Words are separated by "metacharacters", which are the following plus space, tab, and newline: { } | & $ ; < > Quoting may be used to include metacharacters in words; see below. Reserved words ============== Reserved words have a special meaning to GRUB. The following words are recognised as reserved when unquoted and either the first word of a simple command or the third word of a 'for' command: ! [[ ]] { } case do done elif else esac fi for function if in menuentry select then time until while Not all of these reserved words have a useful purpose yet; some are reserved for future expansion. Quoting ======= Quoting is used to remove the special meaning of certain characters or words. It can be used to treat metacharacters as part of a word, to prevent reserved words from being recognised as such, and to prevent variable expansion. There are three quoting mechanisms: the escape character, single quotes, and double quotes. A non-quoted backslash (\) is the "escape character". It preserves the literal value of the next character that follows, with the exception of newline. Enclosing characters in single quotes preserves the literal value of each character within the quotes. A single quote may not occur between single quotes, even when preceded by a backslash. Enclosing characters in double quotes preserves the literal value of all characters within the quotes, with the exception of '$' and '\'. The '$' character retains its special meaning within double quotes. The backslash retains its special meaning only when followed by one of the following characters: '$', '"', '\', or newline. A backslash-newline pair is treated as a line continuation (that is, it is removed from the input stream and effectively ignored(1) (*note Shell-like scripting-Footnote-1::)). A double quote may be quoted within double quotes by preceding it with a backslash. Variable expansion ================== The '$' character introduces variable expansion. The variable name to be expanded may be enclosed in braces, which are optional but serve to protect the variable to be expanded from characters immediately following it which could be interpreted as part of the name. Normal variable names begin with an alphabetic character, followed by zero or more alphanumeric characters. These names refer to entries in the GRUB environment (*note Environment::). Positional variable names consist of one or more digits. They represent parameters passed to function calls, with '$1' representing the first parameter, and so on. The special variable name '?' expands to the exit status of the most recently executed command. When positional variable names are active, other special variable names '@', '*' and '#' are defined and they expand to all positional parameters with necessary quoting, positional parameters without any quoting, and positional parameter count respectively. Comments ======== A word beginning with '#' causes that word and all remaining characters on that line to be ignored. Simple commands =============== A "simple command" is a sequence of words separated by spaces or tabs and terminated by a semicolon or a newline. The first word specifies the command to be executed. The remaining words are passed as arguments to the invoked command. The return value of a simple command is its exit status. If the reserved word '!' precedes the command, then the return value is instead the logical negation of the command's exit status. Compound commands ================= A "compound command" is one of the following: for NAME in WORD ...; do LIST; done The list of words following 'in' is expanded, generating a list of items. The variable NAME is set to each element of this list in turn, and LIST is executed each time. The return value is the exit status of the last command that executes. If the expansion of the items following 'in' results in an empty list, no commands are executed, and the return status is 0. if LIST; then LIST; [elif LIST; then LIST;] ... [else LIST;] fi The 'if' LIST is executed, where LIST is a series of "simple command"s separated by a ";". If its exit status of the last command is zero, the 'then' LIST is executed. Otherwise, each 'elif' LIST is executed in turn, and if its last command's exit status is zero, the corresponding 'then' LIST is executed and the command completes. Otherwise, the 'else' LIST is executed, if present. The exit status is the exit status of the last command executed, or zero if no condition tested true. while COND; do LIST; done until COND; do LIST; done The 'while' command continuously executes the 'do' LIST as long as the last command in COND returns an exit status of zero, where COND is a list of "simple command"s separated by a ";". The 'until' command is identical to the 'while' command, except that the test is negated; the 'do' LIST is executed as long as the last command in COND returns a non-zero exit status. The exit status of the 'while' and 'until' commands is the exit status of the last 'do' LIST command executed, or zero if none was executed. function NAME { COMMAND; ... } This defines a function named NAME. The "body" of the function is the list of commands within braces, each of which must be terminated with a semicolon or a newline. This list of commands will be executed whenever NAME is specified as the name of a simple command. Function definitions do not affect the exit status in '$?'. When executed, the exit status of a function is the exit status of the last command executed in the body. menuentry TITLE ['--class=class' ...] ['--users=users'] ['--unrestricted'] ['--hotkey=key'] ['--id=id'] { COMMAND; ... } *Note menuentry::. Built-in Commands ================= Some built-in commands are also provided by GRUB script to help script writers perform actions that are otherwise not possible. For example, these include commands to jump out of a loop without fully completing it, etc. break ['n'] Exit from within a 'for', 'while', or 'until' loop. If 'n' is specified, break 'n' levels. 'n' must be greater than or equal to 1. If 'n' is greater than the number of enclosing loops, all enclosing loops are exited. The return value is 0 unless 'n' is not greater than or equal to 1. continue ['n'] Resume the next iteration of the enclosing 'for', 'while' or 'until' loop. If 'n' is specified, resume at the 'n'th enclosing loop. 'n' must be greater than or equal to 1. If 'n' is greater than the number of enclosing loops, the last enclosing loop (the "top-level" loop) is resumed. The return value is 0 unless 'n' is not greater than or equal to 1. return ['n'] Causes a function to exit with the return value specified by 'n'. If 'n' is omitted, the return status is that of the last command executed in the function body. If used outside a function the return status is false. setparams ['arg'] ... Replace positional parameters starting with '$1' with arguments to 'setparams'. shift ['n'] The positional parameters from 'n'+1 ... are renamed to '$1'.... Parameters represented by the numbers '$#' down to '$#'-'n'+1 are unset. 'n' must be a non-negative number less than or equal to '$#'. If 'n' is 0, no parameters are changed. If 'n' is not given, it is assumed to be 1. If 'n' is greater than '$#', the positional parameters are not changed. The return status is greater than zero if 'n' is greater than '$#' or less than zero; otherwise 0.  File: grub.info, Node: Shell-like scripting-Footnotes, Up: Shell-like scripting (1) Currently a backslash-newline pair within a variable name is not handled properly, so use this feature with some care.  File: grub.info, Node: Multi-boot manual config, Next: Embedded configuration, Prev: Shell-like scripting, Up: Configuration 6.4 Multi-boot manual config ============================ Currently autogenerating config files for multi-boot environments depends on os-prober and has several shortcomings. Due to that it is disabled by default. It is advised to use the power of GRUB syntax and do it yourself. A possible configuration is detailed here, feel free to adjust to your needs. First create a separate GRUB partition, big enough to hold GRUB. Some of the following entries show how to load OS installer images from this same partition, for that you obviously need to make the partition large enough to hold those images as well. Mount this partition on/mnt/boot and disable GRUB in all OSes and manually install self-compiled latest GRUB with: 'grub-install --boot-directory=/mnt/boot /dev/sda' In all the OSes install GRUB tools but disable installing GRUB in bootsector, so you'll have menu.lst and grub.cfg available for use. Also disable os-prober use by setting: 'GRUB_DISABLE_OS_PROBER=true' in /etc/default/grub Then write a grub.cfg (/mnt/boot/grub/grub.cfg): menuentry "OS using grub2" { insmod xfs search --set=root --label OS1 --hint hd0,msdos8 configfile /boot/grub/grub.cfg } menuentry "OS using grub2-legacy" { insmod ext2 search --set=root --label OS2 --hint hd0,msdos6 legacy_configfile /boot/grub/menu.lst } menuentry "Windows XP" { insmod ntfs search --set=root --label WINDOWS_XP --hint hd0,msdos1 ntldr /ntldr } menuentry "Windows 7" { insmod ntfs search --set=root --label WINDOWS_7 --hint hd0,msdos2 ntldr /bootmgr } menuentry "FreeBSD" { insmod zfs search --set=root --label freepool --hint hd0,msdos7 kfreebsd /freebsd@/boot/kernel/kernel kfreebsd_module_elf /freebsd@/boot/kernel/opensolaris.ko kfreebsd_module_elf /freebsd@/boot/kernel/zfs.ko kfreebsd_module /freebsd@/boot/zfs/zpool.cache type=/boot/zfs/zpool.cache set kFreeBSD.vfs.root.mountfrom=zfs:freepool/freebsd set kFreeBSD.hw.psm.synaptics_support=1 } menuentry "experimental GRUB" { search --set=root --label GRUB --hint hd0,msdos5 multiboot /experimental/grub/i386-pc/core.img } menuentry "Fedora 16 installer" { search --set=root --label GRUB --hint hd0,msdos5 linux /fedora/vmlinuz lang=en_US keymap=sg resolution=1280x800 initrd /fedora/initrd.img } menuentry "Fedora rawhide installer" { search --set=root --label GRUB --hint hd0,msdos5 linux /fedora/vmlinuz repo=ftp://mirror.switch.ch/mirror/fedora/linux/development/rawhide/x86_64 lang=en_US keymap=sg resolution=1280x800 initrd /fedora/initrd.img } menuentry "Debian sid installer" { search --set=root --label GRUB --hint hd0,msdos5 linux /debian/dists/sid/main/installer-amd64/current/images/hd-media/vmlinuz initrd /debian/dists/sid/main/installer-amd64/current/images/hd-media/initrd.gz } Notes: * Argument to search after -label is FS LABEL. You can also use UUIDs with -fs-uuid UUID instead of -label LABEL. You could also use direct 'root=hd0,msdosX' but this is not recommended due to device name instability.  File: grub.info, Node: Embedded configuration, Prev: Multi-boot manual config, Up: Configuration 6.5 Embedding a configuration file into GRUB ============================================ GRUB supports embedding a configuration file directly into the core image, so that it is loaded before entering normal mode. This is useful, for example, when it is not straightforward to find the real configuration file, or when you need to debug problems with loading that file. 'grub-install' uses this feature when it is not using BIOS disk functions or when installing to a different disk from the one containing '/boot/grub', in which case it needs to use the 'search' command (*note search::) to find '/boot/grub'. To embed a configuration file, use the '-c' option to 'grub-mkimage'. The file is copied into the core image, so it may reside anywhere on the file system, and may be removed after running 'grub-mkimage'. After the embedded configuration file (if any) is executed, GRUB will load the 'normal' module (*note normal::), which will then read the real configuration file from '$prefix/grub.cfg'. By this point, the 'root' variable will also have been set to the root device name. For example, 'prefix' might be set to '(hd0,1)/boot/grub', and 'root' might be set to 'hd0,1'. Thus, in most cases, the embedded configuration file only needs to set the 'prefix' and 'root' variables, and then drop through to GRUB's normal processing. A typical example of this might look like this: search.fs_uuid 01234567-89ab-cdef-0123-456789abcdef root set prefix=($root)/boot/grub (The 'search_fs_uuid' module must be included in the core image for this example to work.) In more complex cases, it may be useful to read other configuration files directly from the embedded configuration file. This allows such things as reading files not called 'grub.cfg', or reading files from a directory other than that where GRUB's loadable modules are installed. To do this, include the 'configfile' and 'normal' modules in the core image, and embed a configuration file that uses the 'configfile' command to load another file. The following example of this also requires the 'echo', 'search_label', and 'test' modules to be included in the core image: search.fs_label grub root if [ -e /boot/grub/example/test1.cfg ]; then set prefix=($root)/boot/grub configfile /boot/grub/example/test1.cfg else if [ -e /boot/grub/example/test2.cfg ]; then set prefix=($root)/boot/grub configfile /boot/grub/example/test2.cfg else echo "Could not find an example configuration file!" fi fi The embedded configuration file may not contain menu entries directly, but may only read them from elsewhere using 'configfile'.  File: grub.info, Node: Theme file format, Next: Network, Prev: Configuration, Up: Top 7 Theme file format ******************* 7.1 Introduction ================ The GRUB graphical menu supports themes that can customize the layout and appearance of the GRUB boot menu. The theme is configured through a plain text file that specifies the layout of the various GUI components (including the boot menu, timeout progress bar, and text messages) as well as the appearance using colors, fonts, and images. Example is available in docs/example_theme.txt 7.2 Theme Elements ================== 7.2.1 Colors ------------ Colors can be specified in several ways: * HTML-style "#RRGGBB" or "#RGB" format, where *R*, *G*, and *B* are hexadecimal digits (e.g., "#8899FF") * as comma-separated decimal RGB values (e.g., "128, 128, 255") * with "SVG 1.0 color names" (e.g., "cornflowerblue") which must be specified in lowercase. 7.2.2 Fonts ----------- The fonts GRUB uses "PFF2 font format" bitmap fonts. Fonts are specified with full font names. Currently there is no provision for a preference list of fonts, or deriving one font from another. Fonts are loaded with the "loadfont" command in GRUB (*note loadfont::). To see the list of loaded fonts, execute the "lsfonts" command (*note lsfonts::). If there are too many fonts to fit on screen, do "set pager=1" before executing "lsfonts". 7.2.3 Progress Bar ------------------ Figure 7.1 Figure 7.2 Progress bars are used to display the remaining time before GRUB boots the default menu entry. To create a progress bar that will display the remaining time before automatic boot, simply create a "progress_bar" component with the id "__timeout__". This indicates to GRUB that the progress bar should be updated as time passes, and it should be made invisible if the countdown to automatic boot is interrupted by the user. Progress bars may optionally have text displayed on them. This text is controlled by variable "text" which contains a printf template with the only argument %d is the number of seconds remaining. Additionally special values "@TIMEOUT_NOTIFICATION_SHORT@", "@TIMEOUT_NOTIFICATION_MIDDLE@", "@TIMEOUT_NOTIFICATION_LONG@" are replaced with standard and translated templates. 7.2.4 Circular Progress Indicator --------------------------------- The circular progress indicator functions similarly to the progress bar. When given an id of "__timeout__", GRUB updates the circular progress indicator's value to indicate the time remaining. For the circular progress indicator, there are two images used to render it: the *center* image, and the *tick* image. The center image is rendered in the center of the component, while the tick image is used to render each mark along the circumference of the indicator. 7.2.5 Labels ------------ Text labels can be placed on the boot screen. The font, color, and horizontal alignment can be specified for labels. If a label is given the id "__timeout__", then the "text" property for that label is also updated with a message informing the user of the number of seconds remaining until automatic boot. This is useful in case you want the text displayed somewhere else instead of directly on the progress bar. 7.2.6 Boot Menu --------------- The boot menu where GRUB displays the menu entries from the "grub.cfg" file. It is a list of items, where each item has a title and an optional icon. The icon is selected based on the *classes* specified for the menu entry. If there is a PNG file named "myclass.png" in the "grub/themes/icons" directory, it will be displayed for items which have the class *myclass*. The boot menu can be customized in several ways, such as the font and color used for the menu entry title, and by specifying styled boxes for the menu itself and for the selected item highlight. 7.2.7 Styled Boxes ------------------ One of the most important features for customizing the layout is the use of *styled boxes*. A styled box is composed of 9 rectangular (and potentially empty) regions, which are used to seamlessly draw the styled box on screen: Northwest (nw) North (n) Northeast (ne) West (w) Center (c) East (e) Southwest (sw) South (s) Southeast (se) To support any size of box on screen, the center slice and the slices for the top, bottom, and sides are all scaled to the correct size for the component on screen, using the following rules: 1. The edge slices (north, south, east, and west) are scaled in the direction of the edge they are adjacent to. For instance, the west slice is scaled vertically. 2. The corner slices (northwest, northeast, southeast, and southwest) are not scaled. 3. The center slice is scaled to fill the remaining space in the middle. As an example of how an image might be sliced up, consider the styled box used for a terminal view. Figure 7.3 7.2.8 Creating Styled Box Images -------------------------------- The Inkscape_ scalable vector graphics editor is a very useful tool for creating styled box images. One process that works well for slicing a drawing into the necessary image slices is: 1. Create or open the drawing you'd like use. 2. Create a new layer on the top of the layer stack. Make it visible. Select this layer as the current layer. 3. Draw 9 rectangles on your drawing where you'd like the slices to be. Clear the fill option, and set the stroke to 1 pixel wide solid stroke. The corners of the slices must meet precisely; if it is off by a single pixel, it will probably be evident when the styled box is rendered in the GRUB menu. You should probably go to File | Document Properties | Grids and enable a grid or create a guide (click on one of the rulers next to the drawing and drag over the drawing; release the mouse button to place the guide) to help place the rectangles precisely. 4. Right click on the center slice rectangle and choose Object Properties. Change the "Id" to "slice_c" and click Set. Repeat this for the remaining 8 rectangles, giving them Id values of "slice_n", "slice_ne", "slice_e", and so on according to the location. 5. Save the drawing. 6. Select all the slice rectangles. With the slice layer selected, you can simply press Ctrl+A to select all rectangles. The status bar should indicate that 9 rectangles are selected. 7. Click the layer hide icon for the slice layer in the layer palette. The rectangles will remain selected, even though they are hidden. 8. Choose File | Export Bitmap and check the *Batch export 9 selected objects* box. Make sure that *Hide all except selected* is unchecked. click *Export*. This will create PNG files in the same directory as the drawing, named after the slices. These can now be used for a styled box in a GRUB theme. 7.3 Theme File Manual ===================== The theme file is a plain text file. Lines that begin with "#" are ignored and considered comments. (Note: This may not be the case if the previous line ended where a value was expected.) The theme file contains two types of statements: 1. Global properties. 2. Component construction. 7.3.1 Global Properties ----------------------- 7.3.2 Format ------------ Global properties are specified with the simple format: * name1: value1 * name2: "value which may contain spaces" * name3: #88F In this example, name3 is assigned a color value. 7.3.3 Global Property List -------------------------- title-text Specifies the text to display at the top center of the screen as a title. title-font Defines the font used for the title message at the top of the screen. title-color Defines the color of the title message. message-font Currently unused. Left for backward compatibility. message-color Currently unused. Left for backward compatibility. message-bg-color Currently unused. Left for backward compatibility. desktop-image Specifies the image to use as the background. It will be scaled to fit the screen size or proportionally scaled depending on the scale method. desktop-image-scale-methodSpecifies the scaling method for the *desktop-image*. Options are "stretch", "crop", "padding", "fitwidth", "fitheight". "stretch" for fitting the screen size. Otherwise it is proportional scaling of a part of *desktop-image* to the part of the screen. "crop" part of the *desktop-image* will be proportionally scaled to fit the screen sizes. "padding" the entire *desktop-image* will be contained on the screen. "fitwidth" for fitting the *desktop-image*'s width with screen width. "fitheight" for fitting the *desktop-image*'s height with the screen height. Default is "stretch". desktop-image-h-align Specifies the horizontal alignment of the *desktop-image* if *desktop-image-scale-method* isn't equeal to "stretch". Options are "left", "center", "right". Default is "center". desktop-image-v-align Specifies the vertical alignment of the *desktop-image* if *desktop-image-scale-method* isn't equeal to "stretch". Options are "top", "center", "bottom". Default is "center". desktop-color Specifies the color for the background if *desktop-image* is not specified. terminal-box Specifies the file name pattern for the styled box slices used for the command line terminal window. For example, "terminal-box: terminal_*.png" will use the images "terminal_c.png" as the center area, "terminal_n.png" as the north (top) edge, "terminal_nw.png" as the northwest (upper left) corner, and so on. If the image for any slice is not found, it will simply be left empty. terminal-border Specifies the border width of the terminal window. terminal-left Specifies the left coordinate of the terminal window. terminal-top Specifies the top coordinate of the terminal window. terminal-width Specifies the width of the terminal window. terminal-height Specifies the height of the terminal window. 7.3.4 Component Construction ---------------------------- Greater customizability comes is provided by components. A tree of components forms the user interface. *Containers* are components that can contain other components, and there is always a single root component which is an instance of a *canvas* container. Components are created in the theme file by prefixing the type of component with a '+' sign: ' + label { text="GRUB" font="aqui 11" color="#8FF" } ' properties of a component are specified as "name = value" (whitespace surrounding tokens is optional and is ignored) where *value* may be: * a single word (e.g., "align = center", "color = #FF8080"), * a quoted string (e.g., "text = "Hello, World!""), or * a tuple (e.g., "preferred_size = (120, 80)"). 7.3.5 Component List -------------------- The following is a list of the components and the properties they support. * label A label displays a line of text. Properties: id Set to "__timeout__" to display the time elapsed to an automatical boot of the default entry. text The text to display. If "id" is set to "__timeout__" and no "text" property is set then the amount of seconds will be shown. If set to "@KEYMAP_SHORT@", "@KEYMAP_MIDDLE@" or "@KEYMAP_LONG@" then predefined hotkey information will be shown. font The font to use for text display. color The color of the text. align The horizontal alignment of the text within the component. Options are "left", "center" and "right". visible Set to "false" to hide the label. * image A component that displays an image. The image is scaled to fit the component. Properties: file The full path to the image file to load. * progress_bar Displays a horizontally oriented progress bar. It can be rendered using simple solid filled rectangles, or using a pair of pixmap styled boxes. Properties: id Set to "__timeout__" to display the time elapsed to an automatical boot of the default entry. fg_color The foreground color for plain solid color rendering. bg_color The background color for plain solid color rendering. border_color The border color for plain solid color rendering. text_color The text color. bar_style The styled box specification for the frame of the progress bar. Example: "progress_frame_*.png" If the value is equal to "highlight_style" then no styled boxes will be shown. highlight_styleThe styled box specification for the highlighted region of the progress bar. This box will be used to paint just the highlighted region of the bar, and will be increased in size as the bar nears completion. Example: "progress_hl_*.png". If the value is equal to "bar_style" then no styled boxes will be shown. highlight_overlayIf this option is set to "true" then the highlight box side slices (every slice except the center slice) will overlay the frame box side slices. And the center slice of the highlight box can move all the way (from top to bottom), being drawn on the center slice of the frame box. That way we can make a progress bar with round-shaped edges so there won't be a free space from the highlight to the frame in top and bottom scrollbar positions. Default is "false". font The font to use for progress bar. text The text to display on the progress bar. If the progress bar's ID is set to "__timeout__" and the value of this property is set to "@TIMEOUT_NOTIFICATION_SHORT@", "@TIMEOUT_NOTIFICATION_MIDDLE@" or "@TIMEOUT_NOTIFICATION_LONG@", then GRUB will update this property with an informative message as the timeout approaches. * circular_progress Displays a circular progress indicator. The appearance of this component is determined by two images: the *center* image and the *tick* image. The center image is generally larger and will be drawn in the center of the component. Around the circumference of a circle within the component, the tick image will be drawn a certain number of times, depending on the properties of the component. Properties: id Set to "__timeout__" to display the time elapsed to an automatical boot of the default entry. center_bitmap The file name of the image to draw in the center of the component. tick_bitmap The file name of the image to draw for the tick marks. num_ticks The number of ticks that make up a full circle. ticks_disappear Boolean value indicating whether tick marks should progressively appear, or progressively disappear as *value* approaches *end*. Specify "true" or "false". Default is "false". start_angle The position of the first tick mark to appear or disappear. Measured in "parrots", 1 "parrot" = 1 / 256 of the full circle. Use values "xxx deg" or "xxx \xc2\xb0" to set the angle in degrees. * boot_menu Displays the GRUB boot menu. It allows selecting items and executing them. Properties: item_font The font to use for the menu item titles. selected_item_font The font to use for the selected menu item, or "inherit" (the default) to use "item_font" for the selected menu item as well. item_color The color to use for the menu item titles. selected_item_color The color to use for the selected menu item, or "inherit" (the default) to use "item_color" for the selected menu item as well. icon_width The width of menu item icons. Icons are scaled to the specified size. icon_height The height of menu item icons. item_height The height of each menu item in pixels. item_padding The amount of space in pixels to leave on each side of the menu item contents. item_icon_space The space between an item's icon and the title text, in pixels. item_spacing The amount of space to leave between menu items, in pixels. menu_pixmap_style The image file pattern for the menu frame styled box. Example: "menu_*.png" (this will use images such as "menu_c.png", "menu_w.png", 'menu_nw.png", etc.) item_pixmap_style The image file pattern for the item styled box. selected_item_pixmap_style The image file pattern for the selected item highlight styled box. scrollbar Boolean value indicating whether the scroll bar should be drawn if the frame and thumb styled boxes are configured. scrollbar_frame The image file pattern for the entire scroll bar. Example: "scrollbar_*.png" scrollbar_thumb The image file pattern for the scroll bar thumb (the part of the scroll bar that moves as scrolling occurs). Example: "scrollbar_thumb_*.png" scrollbar_thumb_overlay If this option is set to "true" then the scrollbar thumb side slices (every slice except the center slice) will overlay the scrollbar frame side slices. And the center slice of the scrollbar_thumb can move all the way (from top to bottom), being drawn on the center slice of the scrollbar frame. That way we can make a scrollbar with round-shaped edges so there won't be a free space from the thumb to the frame in top and bottom scrollbar positions. Default is "false". scrollbar_slice The menu frame styled box's slice in which the scrollbar will be drawn. Possible values are "west", "center", "east" (default). "west" - the scrollbar will be drawn in the west slice (right-aligned). "east" - the scrollbar will be drawn in the east slice (left-aligned). "center" - the scrollbar will be drawn in the center slice. Note: in case of "center" slice: a) If the scrollbar should be drawn then boot menu entry's width is decreased by the scrollbar's width and the scrollbar is drawn at the right side of the center slice. b) If the scrollbar won't be drawn then the boot menu entry's width is the width of the center slice. c) We don't necessary need the menu pixmap box to display the scrollbar. scrollbar_left_pad The left scrollbar padding in pixels. Unused if "scrollbar_slice" is "west". scrollbar_right_pad The right scrollbar padding in pixels. Unused if "scrollbar_slice" is "east". scrollbar_top_pad The top scrollbar padding in pixels. scrollbar_bottom_pad The bottom scrollbar padding in pixels. visible Set to "false" to hide the boot menu. * canvas Canvas is a container that allows manual placement of components within it. It does not alter the positions of its child components. It assigns all child components their preferred sizes. * hbox The *hbox* container lays out its children from left to right, giving each one its preferred width. The height of each child is set to the maximum of the preferred heights of all children. * vbox The *vbox* container lays out its children from top to bottom, giving each one its preferred height. The width of each child is set to the maximum of the preferred widths of all children. 7.3.6 Common properties ----------------------- The following properties are supported by all components: 'left' The distance from the left border of container to left border of the object in either of three formats: x Value in pixels p% Percentage p%+x mixture of both 'top' The distance from the left border of container to left border of the object in same format. 'width' The width of object in same format. 'height' The height of object in same format. 'id' The identifier for the component. This can be any arbitrary string. The ID can be used by scripts to refer to various components in the GUI component tree. Currently, there is one special ID value that GRUB recognizes: "__timeout__" Component with this ID will be updated by GRUB and will indicate time elapsed to an automatical boot of the default entry. Affected components: "label", "circular_progress", "progress_bar".  File: grub.info, Node: Network, Next: Serial terminal, Prev: Theme file format, Up: Top 8 Booting GRUB from the network ******************************* The following instructions don't work for *-emu, i386-qemu, i386-coreboot, i386-multiboot, mips_loongson, mips-arc and mips_qemu_mips To generate a netbootable directory, run: grub-mknetdir --net-directory=/srv/tftp --subdir=/boot/grub -d /usr/lib/grub/ E.g. for i386-pc: grub-mknetdir --net-directory=/srv/tftp --subdir=/boot/grub -d /usr/lib/grub/i386-pc Then follow instructions printed out by grub-mknetdir on configuring your DHCP server. The grub.cfg file is placed in the same directory as the path output by grub-mknetdir hereafter referred to as FWPATH. GRUB will search for its configuration files in order using the following rules where the appended value corresponds to a value on the client machine. '(FWPATH)'/grub.cfg-'(UUID OF MACHINE)' '(FWPATH)'/grub.cfg-01-'(MAC ADDRESS OF NIC)' '(FWPATH)'/grub.cfg-'(IPv4 OR IPv6 ADDRESS)' '(FWPATH)'/grub.cfg The UUID is the Client Machine Identifier Option Definition as specified in RFC 4578. The client will only attempt to look up a UUID config file if it was provided by the DHCP server. The client will only attempt to look up an IPv6 address config once, however, it will try the IPv4 multiple times. The concrete example below shows what would happen under the IPv4 case. UUID: 7726a678-7fc0-4853-a4f6-c85ac36a120a MAC: 52:54:00:ec:33:81 IPV4: 10.0.0.130 (0A000082) '(FWPATH)'/grub.cfg-7726a678-7fc0-4853-a4f6-c85ac36a120a '(FWPATH)'/grub.cfg-01-52-54-00-ec-33-81 '(FWPATH)'/grub.cfg-0A000082 '(FWPATH)'/grub.cfg-0A00008 '(FWPATH)'/grub.cfg-0A0000 '(FWPATH)'/grub.cfg-0A000 '(FWPATH)'/grub.cfg-0A00 '(FWPATH)'/grub.cfg-0A0 '(FWPATH)'/grub.cfg-0A '(FWPATH)'/grub.cfg-0 '(FWPATH)'/grub.cfg This feature is enabled by default but it can be disabled by setting the 'feature_net_search_cfg' to 'n'. Since this happens before the configuration file is read by GRUB, this option has to be disabled in an embedded configuration file (*note Embedded configuration::). After GRUB has started, files on the TFTP server will be accessible via the '(tftp)' device. The server IP address can be controlled by changing the '(tftp)' device name to '(tftp,SERVER-IP)'. Note that this should be changed both in the prefix and in any references to the device name in the configuration file. GRUB provides several environment variables which may be used to inspect or change the behaviour of the PXE device. In the following description is placeholder for the name of network interface (platform dependent): 'net__ip' The network interface's IP address. Read-only. 'net__mac' The network interface's MAC address. Read-only. 'net__clientid' The client id provided by DHCP. Read-only. 'net__clientuuid' The client uuid provided by DHCP. Read-only. 'net__hostname' The client host name provided by DHCP. Read-only. 'net__domain' The client domain name provided by DHCP. Read-only. 'net__rootpath' The path to the client's root disk provided by DHCP. Read-only. 'net__extensionspath' The path to additional DHCP vendor extensions provided by DHCP. Read-only. 'net__boot_file' The boot file name provided by DHCP. Read-only. 'net__dhcp_server_name' The name of the DHCP server responsible for these boot parameters. Read-only. 'net__next_server' The IP address of the next (usually, TFTP) server provided by DHCP. Read-only. 'net_default_interface' Initially set to name of network interface that was used to load grub. Read-write, although setting it affects only interpretation of 'net_default_ip' and 'net_default_mac' 'net_default_ip' The IP address of default interface. Read-only. This is alias for the 'net_${net_default_interface}_ip'. 'net_default_mac' The default interface's MAC address. Read-only. This is alias for the 'net_${net_default_interface}_mac'. 'net_default_server' The default server used by network drives (*note Device syntax::). Read-write, although setting this is only useful before opening a network device. 'pxe_default_server' This performs the same function as 'net_default_server'.  File: grub.info, Node: Serial terminal, Next: Vendor power-on keys, Prev: Network, Up: Top 9 Using GRUB via a serial line ****************************** This chapter describes how to use the serial terminal support in GRUB. If you have many computers or computers with no display/keyboard, it could be very useful to control the computers through serial communications. To connect one computer with another via a serial line, you need to prepare a null-modem (cross) serial cable, and you may need to have multiport serial boards, if your computer doesn't have extra serial ports. In addition, a terminal emulator is also required, such as minicom. Refer to a manual of your operating system, for more information. As for GRUB, the instruction to set up a serial terminal is quite simple. Here is an example: grub> serial --unit=0 --speed=9600 grub> terminal_input serial; terminal_output serial The command 'serial' initializes the serial unit 0 with the speed 9600bps. The serial unit 0 is usually called 'COM1', so, if you want to use COM2, you must specify '--unit=1' instead. This command accepts many other options, *note serial:: for more details. Without argument or with '--port=auto', GRUB will attempt to use ACPI when available to auto-detect the default serial port and its configuration. The commands 'terminal_input' (*note terminal_input::) and 'terminal_output' (*note terminal_output::) choose which type of terminal you want to use. In the case above, the terminal will be a serial terminal, but you can also pass 'console' to the command, as 'terminal_input serial console'. In this case, a terminal in which you press any key will be selected as a GRUB terminal. In the example above, note that you need to put both commands on the same command line, as you will lose the ability to type commands on the console after the first command. However, note that GRUB assumes that your terminal emulator is compatible with VT100 by default. This is true for most terminal emulators nowadays. However if your terminal emulator is not VT100-compatible or implements few VT100 escape sequences, you shoud tell GRUB that the terminal is dumb using the 'terminfo' (*note terminfo::) command. This will have GRUB provide you with an alternative menu interface, because the normal menu requires several fancy features of your terminal.  File: grub.info, Node: Vendor power-on keys, Next: Images, Prev: Serial terminal, Up: Top 10 Using GRUB with vendor power-on keys *************************************** Some laptop vendors provide an additional power-on button which boots another OS. GRUB supports such buttons with the 'GRUB_TIMEOUT_BUTTON', 'GRUB_TIMEOUT_STYLE_BUTTON', 'GRUB_DEFAULT_BUTTON', and 'GRUB_BUTTON_CMOS_ADDRESS' variables in default/grub (*note Simple configuration::). 'GRUB_TIMEOUT_BUTTON', 'GRUB_TIMEOUT_STYLE_BUTTON', and 'GRUB_DEFAULT_BUTTON' are used instead of the corresponding variables without the '_BUTTON' suffix when powered on using the special button. 'GRUB_BUTTON_CMOS_ADDRESS' is vendor-specific and partially model-specific. Values known to the GRUB team are: 121:3 85:3 85:3 84:1 (unconfirmed) 101:3 To take full advantage of this function, install GRUB into the MBR (*note Installing GRUB using grub-install::). If you have a laptop which has a similar feature and not in the above list could you figure your address and contribute? To discover the address do the following: * boot normally * sudo modprobe nvram sudo cat /dev/nvram | xxd > normal_button.txt * boot using vendor button * sudo modprobe nvram sudo cat /dev/nvram | xxd > normal_vendor.txt Then compare these text files and find where a bit was toggled. E.g. in case of Dell XPS it was: byte 0x47: 20 --> 28 It's a bit number 3 as seen from following table: 0 01 1 02 2 04 3 08 4 10 5 20 6 40 7 80 0x47 is decimal 71. Linux nvram implementation cuts first 14 bytes of CMOS. So the real byte address in CMOS is 71+14=85 So complete address is 85:3  File: grub.info, Node: Images, Next: Core image size limitation, Prev: Vendor power-on keys, Up: Top 11 GRUB image files ******************* GRUB consists of several images: a variety of bootstrap images for starting GRUB in various ways, a kernel image, and a set of modules which are combined with the kernel image to form a core image. Here is a short overview of them. 'boot.img' On PC BIOS systems, this image is the first part of GRUB to start. It is written to a master boot record (MBR) or to the boot sector of a partition. Because a PC boot sector is 512 bytes, the size of this image is exactly 512 bytes. The sole function of 'boot.img' is to read the first sector of the core image from a local disk and jump to it. Because of the size restriction, 'boot.img' cannot understand any file system structure, so 'grub-install' hardcodes the location of the first sector of the core image into 'boot.img' when installing GRUB. 'diskboot.img' This image is used as the first sector of the core image when booting from a hard disk. It reads the rest of the core image into memory and starts the kernel. Since file system handling is not yet available, it encodes the location of the core image using a block list format. 'cdboot.img' This image is used as the first sector of the core image when booting from a CD-ROM drive. It performs a similar function to 'diskboot.img'. 'pxeboot.img' This image is used as the start of the core image when booting from the network using PXE. *Note Network::. 'lnxboot.img' This image may be placed at the start of the core image in order to make GRUB look enough like a Linux kernel that it can be booted by LILO using an 'image=' section. 'kernel.img' This image contains GRUB's basic run-time facilities: frameworks for device and file handling, environment variables, the rescue mode command-line parser, and so on. It is rarely used directly, but is built into all core images. 'core.img' This is the core image of GRUB. It is built dynamically from the kernel image and an arbitrary list of modules by the 'grub-mkimage' program. Usually, it contains enough modules to access '/boot/grub', and loads everything else (including menu handling, the ability to load target operating systems, and so on) from the file system at run-time. The modular design allows the core image to be kept small, since the areas of disk where it must be installed are often as small as 32KB. *Note BIOS installation::, for details on where the core image can be installed on PC systems. '*.mod' Everything else in GRUB resides in dynamically loadable modules. These are often loaded automatically, or built into the core image if they are essential, but may also be loaded manually using the 'insmod' command (*note insmod::). For GRUB Legacy users ===================== GRUB 2 has a different design from GRUB Legacy, and so correspondences with the images it used cannot be exact. Nevertheless, GRUB Legacy users often ask questions in the terms they are familiar with, and so here is a brief guide to how GRUB 2's images relate to that. 'stage1' Stage 1 from GRUB Legacy was very similar to 'boot.img' in GRUB 2, and they serve the same function. '*_stage1_5' In GRUB Legacy, Stage 1.5's function was to include enough filesystem code to allow the much larger Stage 2 to be read from an ordinary filesystem. In this respect, its function was similar to 'core.img' in GRUB 2. However, 'core.img' is much more capable than Stage 1.5 was; since it offers a rescue shell, it is sometimes possible to recover manually in the event that it is unable to load any other modules, for example if partition numbers have changed. 'core.img' is built in a more flexible way, allowing GRUB 2 to support reading modules from advanced disk types such as LVM and RAID. GRUB Legacy could run with only Stage 1 and Stage 2 in some limited configurations, while GRUB 2 requires 'core.img' and cannot work without it. 'stage2' GRUB 2 has no single Stage 2 image. Instead, it loads modules from '/boot/grub' at run-time. 'stage2_eltorito' In GRUB 2, images for booting from CD-ROM drives are now constructed using 'cdboot.img' and 'core.img', making sure that the core image contains the 'iso9660' module. It is usually best to use the 'grub-mkrescue' program for this. 'nbgrub' There is as yet no equivalent for 'nbgrub' in GRUB 2; it was used by Etherboot and some other network boot loaders. 'pxegrub' In GRUB 2, images for PXE network booting are now constructed using 'pxeboot.img' and 'core.img', making sure that the core image contains the 'pxe' and 'pxecmd' modules. *Note Network::.  File: grub.info, Node: Core image size limitation, Next: Filesystem, Prev: Images, Up: Top 12 Core image size limitation ***************************** Heavily limited platforms: * i386-pc (normal and PXE): the core image size (compressed) is limited by 458240 bytes. kernel.img (.text + .data + .bss, uncompressed) is limited by 392704 bytes. module size (uncompressed) + kernel.img (.text + .data, uncompressed) is limited by the size of contiguous chunk at 1M address. * sparc64-ieee1275: kernel.img (.text + .data + .bss) + modules + 256K (stack) + 2M (heap) is limited by space available at 0x4400. On most platforms it's just 3 or 4M since ieee1275 maps only so much. * i386-ieee1275: kernel.img (.text + .data + .bss) + modules is limited by memory available at 0x10000, at most 596K Lightly limited platforms: * *-xen: limited only by adress space and RAM size. * i386-qemu: kernel.img (.text + .data + .bss) is limited by 392704 bytes. (core.img would be limited by ROM size but it's unlimited on qemu * All EFI platforms: limited by contiguous RAM size and possibly firmware bugs * Coreboot and multiboot. kernel.img (.text + .data + .bss) is limited by 392704 bytes. module size is limited by the size of contiguous chunk at 1M address. * mipsel-loongson (ELF), mips(el)-qemu_mips (ELF): if uncompressed: kernel.img (.text + .data) + modules is limited by the space from 80200000 forward if compressed: kernel.img (.text + .data, uncompressed) + modules (uncompressed) + (modules + kernel.img (.text + .data)) (compressed) + decompressor is limited by the space from 80200000 forward * mipsel-loongson (Flash), mips(el)-qemu_mips (Flash): kernel.img (.text + .data) + modules is limited by the space from 80200000 forward core.img (final) is limited by flash size (512K on yeeloong and fulooong) * mips-arc: if uncompressed: kernel.img (.text + .data) is limited by the space from 8bd00000 forward modules + dummy decompressor is limited by the space from 8bd00000 backward if compressed: kernel.img (.text + .data, uncompressed) is limited by the space from 8bd00000 forward modules (uncompressed) + (modules + kernel.img (.text + .data)) (compressed, aligned to 1M) + 1M (decompressor + scratch space) is limited by the space from 8bd00000 backward * powerpc-ieee1275: kernel.img (.text + .data + .bss) + modules is limited by space available at 0x200000  File: grub.info, Node: Filesystem, Next: Interface, Prev: Core image size limitation, Up: Top 13 Filesystem syntax and semantics ********************************** GRUB uses a special syntax for specifying disk drives which can be accessed by BIOS. Because of BIOS limitations, GRUB cannot distinguish between IDE, ESDI, SCSI, or others. You must know yourself which BIOS device is equivalent to which OS device. Normally, that will be clear if you see the files in a device or use the command 'search' (*note search::). * Menu: * Device syntax:: How to specify devices * File name syntax:: How to specify files * Block list syntax:: How to specify block lists  File: grub.info, Node: Device syntax, Next: File name syntax, Up: Filesystem 13.1 How to specify devices =========================== The device syntax is like this: (DEVICE[,PARTMAP-NAME1PART-NUM1[,PARTMAP-NAME2PART-NUM2[,...]]]) '[]' means the parameter is optional. DEVICE depends on the disk driver in use. BIOS and EFI disks use either 'fd' or 'hd' followed by a digit, like 'fd0', or 'cd'. AHCI, PATA (ata), crypto, USB use the name of driver followed by a number. Memdisk and host are limited to one disk and so it's referred just by driver name. RAID (md), ofdisk (ieee1275 and nand), LVM (lvm), LDM, virtio (vdsk) and arcdisk (arc) use intrinsic name of disk prefixed by driver name. Additionally just "nand" refers to the disk aliased as "nand". Conflicts are solved by suffixing a number if necessary. Commas need to be escaped. Loopback uses whatever name specified to 'loopback' command. Hostdisk uses names specified in device.map as long as it's of the form [fhc]d[0-9]* or hostdisk/. For crypto and RAID (md) additionally you can use the syntax uuid/. For LVM additionally you can use the syntax lvmid//. (fd0) (hd0) (cd) (ahci0) (ata0) (crypto0) (usb0) (cryptouuid/123456789abcdef0123456789abcdef0) (mduuid/123456789abcdef0123456789abcdef0) (lvm/system-root) (lvmid/F1ikgD-2RES-306G-il9M-7iwa-4NKW-EbV1NV/eLGuCQ-L4Ka-XUgR-sjtJ-ffch-bajr-fCNfz5) (md/myraid) (md/0) (ieee1275/disk2) (ieee1275//pci@1f\,0/ide@d/disk@2) (nand) (memdisk) (host) (myloop) (hostdisk//dev/sda) PART-NUM represents the partition number of DEVICE, starting from one. PARTNAME is optional but is recommended since disk may have several top-level partmaps. Specifying third and later component you can access to subpartitions. The syntax '(hd0)' represents using the entire disk (or the MBR when installing GRUB), while the syntax '(hd0,1)' represents using the first partition of the disk (or the boot sector of the partition when installing GRUB). (hd0,msdos1) (hd0,msdos1,msdos5) (hd0,msdos1,bsd3) (hd0,netbsd1) (hd0,gpt1) (hd0,1,3) If you enabled the network support, the special drives '(PROTOCOL[,SERVER])' are also available. Supported protocols are 'http' and 'tftp'. If SERVER is omitted, value of environment variable 'net_default_server' is used. Before using the network drive, you must initialize the network. *Note Network::, for more information. When using 'http' or 'tftp', ports other than '80' can be specified using a colon (':') after the address. To avoid parsing conflicts, when using IPv6 addresses with custom ports, the addresses must be enclosed with square brackets ('[]'), as is standard practice. (http,grub.example.com:31337) (http,192.0.2.1:339) (http,[2001:db8::1]:11235) If you boot GRUB from a CD-ROM, '(cd)' is available. *Note Making a GRUB bootable CD-ROM::, for details.  File: grub.info, Node: File name syntax, Next: Block list syntax, Prev: Device syntax, Up: Filesystem 13.2 How to specify files ========================= There are two ways to specify files, by "absolute file name" and by "block list". An absolute file name resembles a Unix absolute file name, using '/' for the directory separator (not '\' as in DOS). One example is '(hd0,1)/boot/grub/grub.cfg'. This means the file '/boot/grub/grub.cfg' in the first partition of the first hard disk. If you omit the device name in an absolute file name, GRUB uses GRUB's "root device" implicitly. So if you set the root device to, say, '(hd1,1)' by the command 'set root=(hd1,1)' (*note set::), then '/boot/kernel' is the same as '(hd1,1)/boot/kernel'. On ZFS filesystem the first path component must be VOLUME'@'[SNAPSHOT]. So '/rootvol@snap-129/boot/grub/grub.cfg' refers to file '/boot/grub/grub.cfg' in snapshot of volume 'rootvol' with name 'snap-129'. Trailing '@' after volume name is mandatory even if snapshot name is omitted.  File: grub.info, Node: Block list syntax, Prev: File name syntax, Up: Filesystem 13.3 How to specify block lists =============================== A block list is used for specifying a file that doesn't appear in the filesystem, like a chainloader. The syntax is '[OFFSET]+[LENGTH][,[OFFSET]+[LENGTH]]...'. Here is an example: 0+100,200+1,300+300,800+ This represents that GRUB should read blocks 0 through 99, block 200, blocks 300 through 599, and blocks 800 until the end of the device. If you omit an offset, then GRUB assumes the offset is zero. If the length is omitted, then GRUB assumes the block list extends until the end of the device. Like the file name syntax (*note File name syntax::), if a blocklist does not contain a device name, then GRUB uses GRUB's "root device". So '(hd0,2)+1' is the same as '+1' when the root device is '(hd0,2)'.  File: grub.info, Node: Interface, Next: Environment, Prev: Filesystem, Up: Top 14 GRUB's user interface ************************ GRUB has both a simple menu interface for choosing preset entries from a configuration file, and a highly flexible command-line for performing any desired combination of boot commands. GRUB looks for its configuration file as soon as it is loaded. If one is found, then the full menu interface is activated using whatever entries were found in the file. If you choose the "command-line" menu option, or if the configuration file was not found, then GRUB drops to the command-line interface. * Menu: * Command-line interface:: The flexible command-line interface * Menu interface:: The simple menu interface * Menu entry editor:: Editing a menu entry  File: grub.info, Node: Command-line interface, Next: Menu interface, Up: Interface 14.1 The flexible command-line interface ======================================== The command-line interface provides a prompt and after it an editable text area much like a command-line in Unix or DOS. Each command is immediately executed after it is entered(1) (*note Command-line interface-Footnote-1::). The commands (*note Commands::) are a subset of those available in the configuration file, used with exactly the same syntax. Cursor movement and editing of the text on the line can be done via a subset of the functions available in the Bash shell: Move forward one character. Move back one character. Move to the start of the line. Move the the end of the line. Delete the character underneath the cursor. Delete the character to the left of the cursor. Kill the text from the current cursor position to the end of the line. Kill backward from the cursor to the beginning of the line. Yank the killed text back into the buffer at the cursor. Move up through the history list. Move down through the history list. When typing commands interactively, if the cursor is within or before the first word in the command-line, pressing the key (or ) will display a listing of the available commands, and if the cursor is after the first word, the '' will provide a completion listing of disks, partitions, and file names depending on the context. Note that to obtain a list of drives, one must open a parenthesis, as 'root ('. Note that you cannot use the completion functionality in the TFTP filesystem. This is because TFTP doesn't support file name listing for the security.  File: grub.info, Node: Command-line interface-Footnotes, Up: Command-line interface (1) However, this behavior will be changed in the future version, in a user-invisible way.  File: grub.info, Node: Menu interface, Next: Menu entry editor, Prev: Command-line interface, Up: Interface 14.2 The simple menu interface ============================== The menu interface is quite easy to use. Its commands are both reasonably intuitive and described on screen. Basically, the menu interface provides a list of "boot entries" to the user to choose from. Use the arrow keys to select the entry of choice, then press to run it. An optional timeout is available to boot the default entry (the first one if not set), which is aborted by pressing any key. Commands are available to enter a bare command-line by pressing (which operates exactly like the non-config-file version of GRUB, but allows one to return to the menu if desired by pressing ) or to edit any of the "boot entries" by pressing . If you protect the menu interface with a password (*note Security::), all you can do is choose an entry by pressing , or press

to enter the password. Pressing will refresh the menu, which can be useful when connecting via serial after the menu has been drawn.  File: grub.info, Node: Menu entry editor, Prev: Menu interface, Up: Interface 14.3 Editing a menu entry ========================= The menu entry editor looks much like the main menu interface, but the lines in the menu are individual commands in the selected entry instead of entry names. If an is pressed in the editor, it aborts all the changes made to the configuration entry and returns to the main menu interface. Each line in the menu entry can be edited freely, and you can add new lines by pressing at the end of a line. To boot the edited entry, press . Although GRUB unfortunately does not support "undo", you can do almost the same thing by just returning to the main menu using .  File: grub.info, Node: Environment, Next: Modules, Prev: Interface, Up: Top 15 GRUB environment variables ***************************** GRUB supports environment variables which are rather like those offered by all Unix-like systems. Environment variables have a name, which is unique and is usually a short identifier, and a value, which is an arbitrary string of characters. They may be set (*note set::), unset (*note unset::), or looked up (*note Shell-like scripting::) by name. A number of environment variables have special meanings to various parts of GRUB. Others may be used freely in GRUB configuration files. * Menu: * Special environment variables:: * Environment block::  File: grub.info, Node: Special environment variables, Next: Environment block, Up: Environment 15.1 Special environment variables ================================== These variables have special meaning to GRUB. * Menu: * biosnum:: * check_signatures:: * chosen:: * cmdpath:: * color_highlight:: * color_normal:: * config_directory:: * config_file:: * cryptodisk_passphrase_tries:: * debug:: * default:: * fallback:: * gfxmode:: * gfxpayload:: * gfxterm_font:: * grub_cpu:: * grub_platform:: * icondir:: * lang:: * locale_dir:: * lockdown:: * menu_color_highlight:: * menu_color_normal:: * net__boot_file:: * net__clientid:: * net__clientuuid:: * net__dhcp_server_name:: * net__domain:: * net__extensionspath:: * net__hostname:: * net__ip:: * net__mac:: * net__next_server:: * net__rootpath:: * net_default_interface:: * net_default_ip:: * net_default_mac:: * net_default_server:: * pager:: * prefix:: * pxe_default_server:: * root:: * shim_lock:: * superusers:: * theme:: * timeout:: * timeout_style:: * tpm_fail_fatal::  File: grub.info, Node: biosnum, Next: check_signatures, Up: Special environment variables 15.1.1 biosnum -------------- When chain-loading another boot loader (*note Chain-loading::), GRUB may need to know what BIOS drive number corresponds to the root device (*note root::) so that it can set up registers properly. If the BIOSNUM variable is set, it overrides GRUB's own means of guessing this. For an alternative approach which also changes BIOS drive mappings for the chain-loaded system, *note drivemap::.  File: grub.info, Node: check_signatures, Next: chosen, Prev: biosnum, Up: Special environment variables 15.1.2 check_signatures ----------------------- This variable controls whether GRUB enforces digital signature validation on loaded files. *Note Using digital signatures::.  File: grub.info, Node: chosen, Next: cmdpath, Prev: check_signatures, Up: Special environment variables 15.1.3 chosen ------------- When executing a menu entry, GRUB sets the CHOSEN variable to the title of the entry being executed. If the menu entry is in one or more submenus, then CHOSEN is set to the titles of each of the submenus starting from the top level followed by the title of the menu entry itself, separated by '>'.  File: grub.info, Node: cmdpath, Next: color_highlight, Prev: chosen, Up: Special environment variables 15.1.4 cmdpath -------------- The location from which 'core.img' was loaded as an absolute directory name (*note File name syntax::). This is set by GRUB at startup based on information returned by platform firmware. Not every platform provides this information and some may return only device without path name.  File: grub.info, Node: color_highlight, Next: color_normal, Prev: cmdpath, Up: Special environment variables 15.1.5 color_highlight ---------------------- This variable contains the "highlight" foreground and background terminal colors, separated by a slash ('/'). Setting this variable changes those colors. For the available color names, *note color_normal::. The default is 'black/light-gray'.  File: grub.info, Node: color_normal, Next: config_directory, Prev: color_highlight, Up: Special environment variables 15.1.6 color_normal ------------------- This variable contains the "normal" foreground and background terminal colors, separated by a slash ('/'). Setting this variable changes those colors. Each color must be a name from the following list: * black * blue * green * cyan * red * magenta * brown * light-gray * dark-gray * light-blue * light-green * light-cyan * light-red * light-magenta * yellow * white The default is 'light-gray/black'. The color support support varies from terminal to terminal. 'morse' has no color support at all. 'mda_text' color support is limited to highlighting by black/white reversal. 'console' on ARC, EMU and IEEE1275, 'serial_*' and 'spkmodem' are governed by terminfo and support only 8 colors if in modes 'vt100-color' (default for console on emu), 'arc' (default for console on ARC), 'ieee1275' (default for console on IEEE1275). When in mode 'vt100' then the color support is limited to highlighting by black/white reversal. When in mode 'dumb' there is no color support. When console supports no colors this setting is ignored. When console supports 8 colors, then the colors from the second half of the previous list are mapped to the matching colors of first half. 'console' on EFI and BIOS and 'vga_text' support all 16 colors. 'gfxterm' supports all 16 colors and would be theoretically extendable to support whole rgb24 palette but currently there is no compelling reason to go beyond the current 16 colors.  File: grub.info, Node: config_directory, Next: config_file, Prev: color_normal, Up: Special environment variables 15.1.7 config_directory ----------------------- This variable is automatically set by GRUB to the directory part of current configuration file name (*note config_file::).  File: grub.info, Node: config_file, Next: cryptodisk_passphrase_tries, Prev: config_directory, Up: Special environment variables 15.1.8 config_file ------------------ This variable is automatically set by GRUB to the name of configuration file that is being processed by commands 'configfile' (*note configfile::) or 'normal' (*note normal::). It is restored to the previous value when command completes.  File: grub.info, Node: cryptodisk_passphrase_tries, Next: debug, Prev: config_file, Up: Special environment variables 15.1.9 cryptodisk_passphrase_tries ---------------------------------- When prompting the user for a cryptodisk passphrase, allow this many attempts before giving up. Defaults to '3' if unset or set to an invalid value. (The user can give up early by entering an empty passphrase.)  File: grub.info, Node: debug, Next: default, Prev: cryptodisk_passphrase_tries, Up: Special environment variables 15.1.10 debug ------------- This variable may be set to enable debugging output from various components of GRUB. The value is an ordered list of debug facility names separated by whitespace or ','. If the special facility named 'all' is present then debugging output of all facility names is enabled at the start of processing the value of this variable. A facility's debug output can then be disabled by prefixing its name with a '-'. The last occurence facility name with or without a leading '-' takes precendent over any previous occurence. This allows the easy enabling or disabling of facilities by appending a ',' and then the facility name with or without the leading '-', which will preserve the state of the rest of the facilities. The facility names are the first argument to grub_dprintf. Consult the source for more details.  File: grub.info, Node: default, Next: fallback, Prev: debug, Up: Special environment variables 15.1.11 default --------------- If this variable is set, it identifies a menu entry that should be selected by default, possibly after a timeout (*note timeout::). The entry may be identified by number (starting from 0 at each level of the hierarchy), by title, or by id. For example, if you have: menuentry 'Example GNU/Linux distribution' --class gnu-linux --id example-gnu-linux { ... } then you can make this the default using: default=example-gnu-linux If the entry is in a submenu, then it must be identified using the number, title, or id of each of the submenus starting from the top level, followed by the number, title, or id of the menu entry itself, with each element separated by '>'. For example, take the following menu structure: GNU/Hurd --id gnu-hurd Standard Boot --id=gnu-hurd-std Rescue shell --id=gnu-hurd-rescue Other platforms --id=other Minix --id=minix Version 3.4.0 --id=minix-3.4.0 Version 3.3.0 --id=minix-3.3.0 GRUB Invaders --id=grub-invaders The more recent release of Minix would then be identified as 'Other platforms>Minix>Version 3.4.0', or as '1>0>0', or as 'other>minix>minix-3.4.0'. This variable is often set by 'GRUB_DEFAULT' (*note Simple configuration::), 'grub-set-default', or 'grub-reboot'.  File: grub.info, Node: fallback, Next: gfxmode, Prev: default, Up: Special environment variables 15.1.12 fallback ---------------- If this variable is set, it identifies a menu entry that should be selected if the default menu entry fails to boot. Entries are identified in the same way as for 'default' (*note default::).  File: grub.info, Node: gfxmode, Next: gfxpayload, Prev: fallback, Up: Special environment variables 15.1.13 gfxmode --------------- If this variable is set, it sets the resolution used on the 'gfxterm' graphical terminal. Note that you can only use modes which your graphics card supports via VESA BIOS Extensions (VBE), so for example native LCD panel resolutions may not be available. The default is 'auto', which selects a platform-specific default that should look reasonable. Supported modes can be listed by 'videoinfo' command in GRUB. The resolution may be specified as a sequence of one or more modes, separated by commas (',') or semicolons (';'); each will be tried in turn until one is found. Each mode should be either 'auto', 'WIDTHxHEIGHT', or 'WIDTHxHEIGHTxDEPTH'.  File: grub.info, Node: gfxpayload, Next: gfxterm_font, Prev: gfxmode, Up: Special environment variables 15.1.14 gfxpayload ------------------ If this variable is set, it controls the video mode in which the Linux kernel starts up, replacing the 'vga=' boot option (*note linux::). It may be set to 'text' to force the Linux kernel to boot in normal text mode, 'keep' to preserve the graphics mode set using 'gfxmode', or any of the permitted values for 'gfxmode' to set a particular graphics mode (*note gfxmode::). Depending on your kernel, your distribution, your graphics card, and the phase of the moon, note that using this option may cause GNU/Linux to suffer from various display problems, particularly during the early part of the boot sequence. If you have problems, set this variable to 'text' and GRUB will tell Linux to boot in normal text mode. The default is platform-specific. On platforms with a native text mode (such as PC BIOS platforms), the default is 'text'. Otherwise the default may be 'auto' or a specific video mode. This variable is often set by 'GRUB_GFXPAYLOAD_LINUX' (*note Simple configuration::).  File: grub.info, Node: gfxterm_font, Next: grub_cpu, Prev: gfxpayload, Up: Special environment variables 15.1.15 gfxterm_font -------------------- If this variable is set, it names a font to use for text on the 'gfxterm' graphical terminal. Otherwise, 'gfxterm' may use any available font.  File: grub.info, Node: grub_cpu, Next: grub_platform, Prev: gfxterm_font, Up: Special environment variables 15.1.16 grub_cpu ---------------- In normal mode (*note normal::), GRUB sets the 'grub_cpu' variable to the CPU type for which GRUB was built (e.g. 'i386' or 'powerpc').  File: grub.info, Node: grub_platform, Next: icondir, Prev: grub_cpu, Up: Special environment variables 15.1.17 grub_platform --------------------- In normal mode (*note normal::), GRUB sets the 'grub_platform' variable to the platform for which GRUB was built (e.g. 'pc' or 'efi').  File: grub.info, Node: icondir, Next: lang, Prev: grub_platform, Up: Special environment variables 15.1.18 icondir --------------- If this variable is set, it names a directory in which the GRUB graphical menu should look for icons after looking in the theme's 'icons' directory. *Note Theme file format::.  File: grub.info, Node: lang, Next: locale_dir, Prev: icondir, Up: Special environment variables 15.1.19 lang ------------ If this variable is set, it names the language code that the 'gettext' command (*note gettext::) uses to translate strings. For example, French would be named as 'fr', and Simplified Chinese as 'zh_CN'. 'grub-mkconfig' (*note Simple configuration::) will try to set a reasonable default for this variable based on the system locale.  File: grub.info, Node: locale_dir, Next: lockdown, Prev: lang, Up: Special environment variables 15.1.20 locale_dir ------------------ If this variable is set, it names the directory where translation files may be found (*note gettext::), usually '/boot/grub/locale'. Otherwise, internationalization is disabled. 'grub-mkconfig' (*note Simple configuration::) will set a reasonable default for this variable if internationalization is needed and any translation files are available.  File: grub.info, Node: lockdown, Next: menu_color_highlight, Prev: locale_dir, Up: Special environment variables 15.1.21 lockdown ---------------- If this variable is set to 'y', it means that GRUB has entered *note Lockdown:: mode.  File: grub.info, Node: menu_color_highlight, Next: menu_color_normal, Prev: lockdown, Up: Special environment variables 15.1.22 menu_color_highlight ---------------------------- This variable contains the foreground and background colors to be used for the highlighted menu entry, separated by a slash ('/'). Setting this variable changes those colors. For the available color names, *note color_normal::. The default is the value of 'color_highlight' (*note color_highlight::).  File: grub.info, Node: menu_color_normal, Next: net__boot_file, Prev: menu_color_highlight, Up: Special environment variables 15.1.23 menu_color_normal ------------------------- This variable contains the foreground and background colors to be used for non-highlighted menu entries, separated by a slash ('/'). Setting this variable changes those colors. For the available color names, *note color_normal::. The default is the value of 'color_normal' (*note color_normal::).  File: grub.info, Node: net__boot_file, Next: net__clientid, Prev: menu_color_normal, Up: Special environment variables 15.1.24 net__boot_file --------------------------------- *Note Network::.  File: grub.info, Node: net__clientid, Next: net__clientuuid, Prev: net__boot_file, Up: Special environment variables 15.1.25 net__clientid -------------------------------- *Note Network::.  File: grub.info, Node: net__clientuuid, Next: net__dhcp_server_name, Prev: net__clientid, Up: Special environment variables 15.1.26 net__clientuuid ---------------------------------- *Note Network::.  File: grub.info, Node: net__dhcp_server_name, Next: net__domain, Prev: net__clientuuid, Up: Special environment variables 15.1.27 net__dhcp_server_name ---------------------------------------- *Note Network::.  File: grub.info, Node: net__domain, Next: net__extensionspath, Prev: net__dhcp_server_name, Up: Special environment variables 15.1.28 net__domain ------------------------------ *Note Network::.  File: grub.info, Node: net__extensionspath, Next: net__hostname, Prev: net__domain, Up: Special environment variables 15.1.29 net__extensionspath -------------------------------------- *Note Network::.  File: grub.info, Node: net__hostname, Next: net__ip, Prev: net__extensionspath, Up: Special environment variables 15.1.30 net__hostname -------------------------------- *Note Network::.  File: grub.info, Node: net__ip, Next: net__mac, Prev: net__hostname, Up: Special environment variables 15.1.31 net__ip -------------------------- *Note Network::.  File: grub.info, Node: net__mac, Next: net__next_server, Prev: net__ip, Up: Special environment variables 15.1.32 net__mac --------------------------- *Note Network::.  File: grub.info, Node: net__next_server, Next: net__rootpath, Prev: net__mac, Up: Special environment variables 15.1.33 net__next_server ----------------------------------- *Note Network::.  File: grub.info, Node: net__rootpath, Next: net_default_interface, Prev: net__next_server, Up: Special environment variables 15.1.34 net__rootpath -------------------------------- *Note Network::.  File: grub.info, Node: net_default_interface, Next: net_default_ip, Prev: net__rootpath, Up: Special environment variables 15.1.35 net_default_interface ----------------------------- *Note Network::.  File: grub.info, Node: net_default_ip, Next: net_default_mac, Prev: net_default_interface, Up: Special environment variables 15.1.36 net_default_ip ---------------------- *Note Network::.  File: grub.info, Node: net_default_mac, Next: net_default_server, Prev: net_default_ip, Up: Special environment variables 15.1.37 net_default_mac ----------------------- *Note Network::.  File: grub.info, Node: net_default_server, Next: pager, Prev: net_default_mac, Up: Special environment variables 15.1.38 net_default_server -------------------------- *Note Network::.  File: grub.info, Node: pager, Next: prefix, Prev: net_default_server, Up: Special environment variables 15.1.39 pager ------------- If set to '1', pause output after each screenful and wait for keyboard input. The default is not to pause output.  File: grub.info, Node: prefix, Next: pxe_default_server, Prev: pager, Up: Special environment variables 15.1.40 prefix -------------- The location of the '/boot/grub' directory as an absolute file name (*note File name syntax::). This is normally set by GRUB at startup based on information provided by 'grub-install'. GRUB modules are dynamically loaded from this directory, so it must be set correctly in order for many parts of GRUB to work.  File: grub.info, Node: pxe_default_server, Next: root, Prev: prefix, Up: Special environment variables 15.1.41 pxe_default_server -------------------------- *Note Network::.  File: grub.info, Node: root, Next: shim_lock, Prev: pxe_default_server, Up: Special environment variables 15.1.42 root ------------ The root device name (*note Device syntax::). Any file names that do not specify an explicit device name are read from this device. The default is normally set by GRUB at startup based on the value of 'prefix' (*note prefix::). For example, if GRUB was installed to the first partition of the first hard disk, then 'prefix' might be set to '(hd0,msdos1)/boot/grub' and 'root' to 'hd0,msdos1'.  File: grub.info, Node: shim_lock, Next: superusers, Prev: root, Up: Special environment variables 15.1.43 shim_lock ----------------- If this variable is set to 'y', it means that the shim_lock verifier is registered (see *note UEFI secure boot and shim::).  File: grub.info, Node: superusers, Next: theme, Prev: shim_lock, Up: Special environment variables 15.1.44 superusers ------------------ This variable may be set to a list of superuser names to enable authentication support. *Note Security::.  File: grub.info, Node: theme, Next: timeout, Prev: superusers, Up: Special environment variables 15.1.45 theme ------------- This variable may be set to a directory containing a GRUB graphical menu theme. *Note Theme file format::. This variable is often set by 'GRUB_THEME' (*note Simple configuration::).  File: grub.info, Node: timeout, Next: timeout_style, Prev: theme, Up: Special environment variables 15.1.46 timeout --------------- If this variable is set, it specifies the time in seconds to wait for keyboard input before booting the default menu entry. A timeout of '0' means to boot the default entry immediately without displaying the menu; a timeout of '-1' (or unset) means to wait indefinitely. If 'timeout_style' (*note timeout_style::) is set to 'countdown' or 'hidden', the timeout is instead counted before the menu is displayed. This variable is often set by 'GRUB_TIMEOUT' (*note Simple configuration::).  File: grub.info, Node: timeout_style, Next: tpm_fail_fatal, Prev: timeout, Up: Special environment variables 15.1.47 timeout_style --------------------- This variable may be set to 'menu', 'countdown', or 'hidden' to control the way in which the timeout (*note timeout::) interacts with displaying the menu. See the documentation of 'GRUB_TIMEOUT_STYLE' (*note Simple configuration::) for details.  File: grub.info, Node: tpm_fail_fatal, Prev: timeout_style, Up: Special environment variables 15.1.48 tpm_fail_fatal ---------------------- If this variable is set and true (i.e., not set to "0", "false", "disable", or "no"), TPM measurements that fail will be treated as fatal. Otherwise, they will merely be debug-logged and boot will continue. Call to EFI firmware, like hash_log_extend_event(), can return an unknown error, i.e. due to bug present in firmware. When this variable is set and true (same values as with TPM measurements) this situation will be considered to be fatal and error-logged as "unknown TPM error". If not set, booting the OS will be enabled.  File: grub.info, Node: Environment block, Prev: Special environment variables, Up: Environment 15.2 The GRUB environment block =============================== It is often useful to be able to remember a small amount of information from one boot to the next. For example, you might want to set the default menu entry based on what was selected the last time. GRUB deliberately does not implement support for writing files in order to minimise the possibility of the boot loader being responsible for file system corruption, so a GRUB configuration file cannot just create a file in the ordinary way. However, GRUB provides an "environment block" which can be used to save a small amount of state. The environment block is a preallocated 1024-byte file, which normally lives in '/boot/grub/grubenv' (although you should not assume this). At boot time, the 'load_env' command (*note load_env::) loads environment variables from it, and the 'save_env' (*note save_env::) command saves environment variables to it. From a running system, the 'grub-editenv' utility can be used to edit the environment block. For safety reasons, this storage is only available when installed on a plain disk (no LVM or RAID), using a non-checksumming filesystem (no ZFS), and using BIOS or EFI functions (no ATA, USB or IEEE1275). 'grub-mkconfig' uses this facility to implement 'GRUB_SAVEDEFAULT' (*note Simple configuration::).  File: grub.info, Node: Modules, Next: Commands, Prev: Environment, Up: Top 16 Modules ********** In this chapter, we list all modules that are available in GRUB. Modules can be loaded via the 'insmod' (*note insmod::) command. * Menu: * acpi_module:: * adler32_module:: * affs_module:: * afs_module:: * afsplitter_module:: * ahci_module:: * all_video_module:: * aout_module:: * appleldr_module:: * archelp_module:: * at_keyboard_module:: * ata_module:: * backtrace_module:: * bfs_module:: * biosdisk_module:: * bitmap_module:: * bitmap_scale_module:: * bli_module:: * blocklist_module:: * boot_module:: * boottime_module:: * bsd_module:: * bswap_test_module:: * btrfs_module:: * bufio_module:: * cacheinfo_module:: * cat_module:: * cbfs_module:: * cbls_module:: * cbmemc_module:: * cbtable_module:: * cbtime_module:: * chain_module:: * cmdline_cat_test_module:: * cmosdump_module:: * cmostest_module:: * cmp_module:: * cmp_test_module:: * configfile_module:: * cpio_module:: * cpio_be_module:: * cpuid_module:: * crc64_module:: * crypto_module:: * cryptodisk_module:: * cs5536_module:: * ctz_test_module:: * date_module:: * datehook_module:: * datetime_module:: * disk_module:: * diskfilter_module:: * div_module:: * div_test_module:: * dm_nv_module:: * drivemap_module:: * echo_module:: * efi_gop_module:: * efi_uga_module:: * efiemu_module:: * efifwsetup_module:: * efinet_module:: * efitextmode_module:: * ehci_module:: * elf_module:: * emunet_module:: * emupci_module:: * erofs_module:: * escc_module:: * eval_module:: * exfat_module:: * exfctest_module:: * ext2_module:: * extcmd_module:: * f2fs_module:: * fat_module:: * fdt_module:: * file_module:: * fixvideo_module:: * font_module:: * freedos_module:: * fshelp_module:: * functional_test_module:: * gcry_arcfour_module:: * gcry_blowfish_module:: * gcry_camellia_module:: * gcry_cast5_module:: * gcry_crc_module:: * gcry_des_module:: * gcry_dsa_module:: * gcry_idea_module:: * gcry_md4_module:: * gcry_md5_module:: * gcry_rfc2268_module:: * gcry_rijndael_module:: * gcry_rmd160_module:: * gcry_rsa_module:: * gcry_seed_module:: * gcry_serpent_module:: * gcry_sha1_module:: * gcry_sha256_module:: * gcry_sha512_module:: * gcry_tiger_module:: * gcry_twofish_module:: * gcry_whirlpool_module:: * gdb_module:: * geli_module:: * gettext_module:: * gfxmenu_module:: * gfxterm_module:: * gfxterm_background_module:: * gfxterm_menu_module:: * gptsync_module:: * gzio_module:: * halt_module:: * hashsum_module:: * hdparm_module:: * hello_module:: * help_module:: * hexdump_module:: * hfs_module:: * hfsplus_module:: * hfspluscomp_module:: * http_module:: * ieee1275_fb_module:: * iorw_module:: * iso9660_module:: * jfs_module:: * jpeg_module:: * json_module:: * keylayouts_module:: * keystatus_module:: * ldm_module:: * legacy_password_test_module:: * legacycfg_module:: * linux_module:: * linux16_module:: * loadbios_module:: * loadenv_module:: * loopback_module:: * ls_module:: * lsacpi_module:: * lsapm_module:: * lsdev_module:: * lsefi_module:: * lsefimmap_module:: * lsefisystab_module:: * lsmmap_module:: * lspci_module:: * lssal_module:: * lsspd_module:: * lsxen_module:: * luks_module:: * luks2_module:: * lvm_module:: * lzopio_module:: * macbless_module:: * macho_module:: * mda_text_module:: * mdraid09_module:: * mdraid09_be_module:: * mdraid1x_module:: * memdisk_module:: * memrw_module:: * memtools_module:: * minicmd_module:: * minix_module:: * minix2_module:: * minix2_be_module:: * minix3_module:: * minix3_be_module:: * minix_be_module:: * mmap_module:: * morse_module:: * mpi_module:: * msdospart_module:: * mul_test_module:: * multiboot_module:: * multiboot2_module:: * nand_module:: * nativedisk_module:: * net_module:: * newc_module:: * nilfs2_module:: * normal_module:: * ntfs_module:: * ntfscomp_module:: * ntldr_module:: * odc_module:: * offsetio_module:: * ofnet_module:: * ohci_module:: * part_acorn_module:: * part_amiga_module:: * part_apple_module:: * part_bsd_module:: * part_dfly_module:: * part_dvh_module:: * part_gpt_module:: * part_msdos_module:: * part_plan_module:: * part_sun_module:: * part_sunpc_module:: * parttool_module:: * password_module:: * password_pbkdf2_module:: * pata_module:: * pbkdf2_module:: * pbkdf2_test_module:: * pci_module:: * pcidump_module:: * pgp_module:: * plainmount_module:: * plan9_module:: * play_module:: * png_module:: * priority_queue_module:: * probe_module:: * procfs_module:: * progress_module:: * pxe_module:: * pxechain_module:: * raid5rec_module:: * raid6rec_module:: * random_module:: * rdmsr_module:: * read_module:: * reboot_module:: * regexp_module:: * reiserfs_module:: * relocator_module:: * romfs_module:: * scsi_module:: * sdl_module:: * search_module:: * search_fs_file_module:: * search_fs_uuid_module:: * search_label_module:: * sendkey_module:: * serial_module:: * setjmp_module:: * setjmp_test_module:: * setpci_module:: * sfs_module:: * shift_test_module:: * signature_test_module:: * sleep_module:: * sleep_test_module:: * smbios_module:: * spkmodem_module:: * squash4_module:: * strtoull_test_module:: * suspend_module:: * syslinuxcfg_module:: * tar_module:: * terminal_module:: * terminfo_module:: * test_module:: * test_blockarg_module:: * testload_module:: * testspeed_module:: * tftp_module:: * tga_module:: * time_module:: * tpm_module:: * tr_module:: * trig_module:: * true_module:: * truecrypt_module:: * ubootnet_module:: * udf_module:: * ufs1_module:: * ufs1_be_module:: * ufs2_module:: * uhci_module:: * usb_module:: * usb_keyboard_module:: * usbms_module:: * usbserial_common_module:: * usbserial_ftdi_module:: * usbserial_pl2303_module:: * usbserial_usbdebug_module:: * usbtest_module:: * vbe_module:: * verifiers_module:: * vga_module:: * vga_text_module:: * video_module:: * video_bochs_module:: * video_cirrus_module:: * video_colors_module:: * video_fb_module:: * videoinfo_module:: * videotest_module:: * videotest_checksum_module:: * wrmsr_module:: * xen_boot_module:: * xfs_module:: * xnu_module:: * xnu_uuid_module:: * xnu_uuid_test_module:: * xzio_module:: * zfs_module:: * zfscrypt_module:: * zfsinfo_module:: * zstd_module::  File: grub.info, Node: acpi_module, Next: adler32_module, Up: Modules 16.1 acpi ========= This module provides the command 'acpi' for loading / replacing Advanced Configuration and Power Interface (ACPI) tables. Please *note acpi:: for more information.  File: grub.info, Node: adler32_module, Next: affs_module, Prev: acpi_module, Up: Modules 16.2 adler32 ============ This module provides the library implementation for the adler32 checksum. This is used as part of LZO decompression / compression.  File: grub.info, Node: affs_module, Next: afs_module, Prev: adler32_module, Up: Modules 16.3 affs ========= This module provides support for the Amiga Fast FileSystem (AFFS). Note: This module is not allowed in lockdown mode, *note Lockdown:: for more information.  File: grub.info, Node: afs_module, Next: afsplitter_module, Prev: affs_module, Up: Modules 16.4 afs ======== This module provides support for the AtheOS File System (AFS). Note: This module is not allowed in lockdown mode, *note Lockdown:: for more information.  File: grub.info, Node: afsplitter_module, Next: ahci_module, Prev: afs_module, Up: Modules 16.5 afsplitter =============== This module provides library support for the Anti forensic information splitter (AFS) operation 'AF_merge'. This is used by LUKS and LUKS2.  File: grub.info, Node: ahci_module, Next: all_video_module, Prev: afsplitter_module, Up: Modules 16.6 ahci ========= This module provides support for the Advanced Host Controller Interface protocol to access disks supporting this standard. AHCI is often an option for Serial ATA (SATA) controllers (meant to replace the older IDE protocol).  File: grub.info, Node: all_video_module, Next: aout_module, Prev: ahci_module, Up: Modules 16.7 all_video ============== This is a "dummy module" with no actual function except to load all other video modules as dependencies (a convenient way to load all video modules).  File: grub.info, Node: aout_module, Next: appleldr_module, Prev: all_video_module, Up: Modules 16.8 aout ========= This module provides support for loading files packaged in the "a.out" format. The "a.out" format is considered to be an older format than some alternatives such as "ELF", for example support for the "a.out" format was removed from the Linux kernel in 5.18.  File: grub.info, Node: appleldr_module, Next: archelp_module, Prev: aout_module, Up: Modules 16.9 appleldr ============= This module provides support for loading files on a BIOS / EFI based Apple Mac computer (Intel based Macs).  File: grub.info, Node: archelp_module, Next: at_keyboard_module, Prev: appleldr_module, Up: Modules 16.10 archelp ============= This module provides Archive Helper functions for archive based file systems such as TAR and CPIO archives.  File: grub.info, Node: at_keyboard_module, Next: ata_module, Prev: archelp_module, Up: Modules 16.11 at_keyboard ================= This module provides support for the AT keyboard input for the GRUB terminal.  File: grub.info, Node: ata_module, Next: backtrace_module, Prev: at_keyboard_module, Up: Modules 16.12 ata ========= This modules provides support for direct ATA and ATAPI access to compatible disks.  File: grub.info, Node: backtrace_module, Next: bfs_module, Prev: ata_module, Up: Modules 16.13 backtrace =============== This module provides the command 'backtrace' for printing a backtrace to the terminal for the current call stack.  File: grub.info, Node: bfs_module, Next: biosdisk_module, Prev: backtrace_module, Up: Modules 16.14 bfs ========= This module provides support for the BeOS "Be File System" (BFS). Note: This module is not allowed in lockdown mode, *note Lockdown:: for more information.  File: grub.info, Node: biosdisk_module, Next: bitmap_module, Prev: bfs_module, Up: Modules 16.15 biosdisk ============== This module provides support for booting from a bootable removable disk such as a CD-ROM, BD-ROM, etc.  File: grub.info, Node: bitmap_module, Next: bitmap_scale_module, Prev: biosdisk_module, Up: Modules 16.16 bitmap ============ This module provides support for reading and interacting with bitmap image files.  File: grub.info, Node: bitmap_scale_module, Next: bli_module, Prev: bitmap_module, Up: Modules 16.17 bitmap_scale ================== This module provides support for scaling bitmap image files.  File: grub.info, Node: bli_module, Next: blocklist_module, Prev: bitmap_scale_module, Up: Modules 16.18 bli ========= This module provides basic support for the Boot Loader Interface. The Boot Loader Interface specifies a set of EFI variables that are used to communicate boot-time information between the bootloader and the operating system. The following variables are placed under the vendor UUID '4a67b082-0a4c-41cf-b6c7-440b29bb8c4f' when the module is loaded: The GPT partition UUID of the EFI System Partition used during boot is published via the 'LoaderDevicePartUUID' variable. The Boot Loader Interface specification requires GPT formatted drives. The bli module ignores drives/partitions in any other format. If GRUB is loaded from a non-GPT partition, e.g. from an MSDOS formatted drive or network, this variable will not be set. A string identifying GRUB as the active bootloader including the version number is stored in 'LoaderInfo'. This module is only available on UEFI platforms.  File: grub.info, Node: blocklist_module, Next: boot_module, Prev: bli_module, Up: Modules 16.19 blocklist =============== This module provides support for the command 'blocklist' to list blocks for a given file. Please *note blocklist:: for more information.  File: grub.info, Node: boot_module, Next: boottime_module, Prev: blocklist_module, Up: Modules 16.20 boot ========== This module provides support for the command 'boot' to boot an operating system. Please *note boot:: for more information.  File: grub.info, Node: boottime_module, Next: bsd_module, Prev: boot_module, Up: Modules 16.21 boottime ============== This module provides support for the command 'boottime' to display time taken to perform various GRUB operations. This module is only available when GRUB is built with the conditional compile option 'BOOT_TIME_STATS'.  File: grub.info, Node: bsd_module, Next: bswap_test_module, Prev: boottime_module, Up: Modules 16.22 bsd ========= This module provides support for loading BSD operating system images via commands such as: 'kfreebsd_loadenv', 'kfreebsd_module_elf', 'kfreebsd_module', 'kfreebsd', 'knetbsd_module_elf', 'knetbsd_module', 'knetbsd', 'kopenbsd', and 'kopenbsd_ramdisk'. Please *note Loader commands:: for more info.  File: grub.info, Node: bswap_test_module, Next: btrfs_module, Prev: bsd_module, Up: Modules 16.23 bswap_test ================ This module is intended for performing a functional test of the byte swapping functionality of GRUB.  File: grub.info, Node: btrfs_module, Next: bufio_module, Prev: bswap_test_module, Up: Modules 16.24 btrfs =========== This module provides support for the B-Tree File System (BTRFS).  File: grub.info, Node: bufio_module, Next: cacheinfo_module, Prev: btrfs_module, Up: Modules 16.25 bufio =========== This module is a library module for support buffered I/O of files to support file reads performed in other modules.  File: grub.info, Node: cacheinfo_module, Next: cat_module, Prev: bufio_module, Up: Modules 16.26 cacheinfo =============== This module provides support for the command 'cacheinfo' which provides statistics on disk cache accesses. This module is only built if 'DISK_CACHE_STATS' is enabled.  File: grub.info, Node: cat_module, Next: cbfs_module, Prev: cacheinfo_module, Up: Modules 16.27 cat ========= This module provides support for the command 'cat' which outputs the content of a file to the terminal. Please *note cat:: for more info.  File: grub.info, Node: cbfs_module, Next: cbls_module, Prev: cat_module, Up: Modules 16.28 cbfs ========== This module provides support for the Coreboot File System (CBFS) which is an archive based file system. Note: This module is not allowed in lockdown mode, *note Lockdown:: for more information.  File: grub.info, Node: cbls_module, Next: cbmemc_module, Prev: cbfs_module, Up: Modules 16.29 cbls ========== This module provides support for the command 'lscoreboot' to list the Coreboot tables.  File: grub.info, Node: cbmemc_module, Next: cbtable_module, Prev: cbls_module, Up: Modules 16.30 cbmemc ============ This module provides support for the command 'cbmemc' to show the content of the Coreboot Memory console.  File: grub.info, Node: cbtable_module, Next: cbtime_module, Prev: cbmemc_module, Up: Modules 16.31 cbtable ============= This module provides support for accessing the Coreboot tables.  File: grub.info, Node: cbtime_module, Next: chain_module, Prev: cbtable_module, Up: Modules 16.32 cbtime ============ This module provides support for the command 'coreboot_boottime' to show the Coreboot boot time statistics.  File: grub.info, Node: chain_module, Next: cmdline_cat_test_module, Prev: cbtime_module, Up: Modules 16.33 chain =========== This module provides support for the command 'chainloader' to boot another bootloader. Please *note chainloader:: for more information.  File: grub.info, Node: cmdline_cat_test_module, Next: cmosdump_module, Prev: chain_module, Up: Modules 16.34 cmdline_cat_test ====================== This module is intended for performing a functional test of the 'cat' command of GRUB.  File: grub.info, Node: cmosdump_module, Next: cmostest_module, Prev: cmdline_cat_test_module, Up: Modules 16.35 cmosdump ============== This module provides support for the command 'cmosdump' to show a raw dump of the CMOS contents. Please *note cmosdump:: for more information.  File: grub.info, Node: cmostest_module, Next: cmp_module, Prev: cmosdump_module, Up: Modules 16.36 cmostest ============== This module provides support for the commands 'cmostest', 'cmosclean', and 'cmosset' to interact with a CMOS. *Note cmostest:: / *note cmosclean:: for more information.  File: grub.info, Node: cmp_module, Next: cmp_test_module, Prev: cmostest_module, Up: Modules 16.37 cmp ========= This module provides support for the command 'cmp' to compare the content of two files. *Note cmp:: for more information.  File: grub.info, Node: cmp_test_module, Next: configfile_module, Prev: cmp_module, Up: Modules 16.38 cmp_test ============== This module is intended for performing a functional test of relational operations in GRUB. Note that this module is *not* associated with the 'cmp' command and does not test the 'cmp' command.  File: grub.info, Node: configfile_module, Next: cpio_module, Prev: cmp_test_module, Up: Modules 16.39 configfile ================ This module provides support for the commands: 'configfile', 'source', 'extract_entries_source', 'extract_entries_configfile', '.' (dot command). *Note configfile:: / *note source::.  File: grub.info, Node: cpio_module, Next: cpio_be_module, Prev: configfile_module, Up: Modules 16.40 cpio ========== This module provides support for the CPIO archive file format. This module is for the "bin" version of CPIO (default of GNU CPIO) supporting around 2GB.  File: grub.info, Node: cpio_be_module, Next: cpuid_module, Prev: cpio_module, Up: Modules 16.41 cpio_be ============= This module provides support for the CPIO archive file format in big-endian format. This module is for the "bin" version of CPIO (default of GNU CPIO) supporting around 2GB.  File: grub.info, Node: cpuid_module, Next: crc64_module, Prev: cpio_be_module, Up: Modules 16.42 cpuid =========== This module provides support for the command 'cpuid' to test for various CPU features. *Note cpuid:: for more information.  File: grub.info, Node: crc64_module, Next: crypto_module, Prev: cpuid_module, Up: Modules 16.43 crc64 =========== This module provides support for the CRC64 operation.  File: grub.info, Node: crypto_module, Next: cryptodisk_module, Prev: crc64_module, Up: Modules 16.44 crypto ============ This module provides library support for various base cryptography operations in GRUB.  File: grub.info, Node: cryptodisk_module, Next: cs5536_module, Prev: crypto_module, Up: Modules 16.45 cryptodisk ================ This module provides support for the command 'cryptomount' to interact with encrypted file systems. *Note cryptomount:: for more information.  File: grub.info, Node: cs5536_module, Next: ctz_test_module, Prev: cryptodisk_module, Up: Modules 16.46 cs5536 ============ This module provides support for the AMD Geode CS5536 companion device.  File: grub.info, Node: ctz_test_module, Next: date_module, Prev: cs5536_module, Up: Modules 16.47 ctz_test ============== This module is intended for performing a functional test of the ctz functions in GRUB used to Count Trailing Zeros.  File: grub.info, Node: date_module, Next: datehook_module, Prev: ctz_test_module, Up: Modules 16.48 date ========== This module provides support for the command 'date' to get the date/time or set the date/time. *Note date:: for more information.  File: grub.info, Node: datehook_module, Next: datetime_module, Prev: date_module, Up: Modules 16.49 datehook ============== This module provides support for populating / providing the environment variables 'YEAR', 'MONTH', 'DAY', 'HOUR', 'MINUTE', 'SECOND', 'WEEKDAY'.  File: grub.info, Node: datetime_module, Next: disk_module, Prev: datehook_module, Up: Modules 16.50 datetime ============== This module provides library support for getting and setting the date / time from / to a hardware clock device.  File: grub.info, Node: disk_module, Next: diskfilter_module, Prev: datetime_module, Up: Modules 16.51 disk ========== This module provides library support for writing to a storage disk.  File: grub.info, Node: diskfilter_module, Next: div_module, Prev: disk_module, Up: Modules 16.52 diskfilter ================ This module provides library support for reading a disk RAID array. It also provides support for the command 'cryptocheck'. *Note cryptocheck:: for more information.  File: grub.info, Node: div_module, Next: div_test_module, Prev: diskfilter_module, Up: Modules 16.53 div ========= This module provides library support for some operations such as divmod.  File: grub.info, Node: div_test_module, Next: dm_nv_module, Prev: div_module, Up: Modules 16.54 div_test ============== This module is intended for performing a functional test of the divmod function in GRUB.  File: grub.info, Node: dm_nv_module, Next: drivemap_module, Prev: div_test_module, Up: Modules 16.55 dm_nv =========== This module provides support for handling some Nvidia "fakeraid" disk devices.  File: grub.info, Node: drivemap_module, Next: echo_module, Prev: dm_nv_module, Up: Modules 16.56 drivemap ============== This module provides support for the 'drivemap' to manage BIOS drive mappings. *Note drivemap:: for more information.  File: grub.info, Node: echo_module, Next: efi_gop_module, Prev: drivemap_module, Up: Modules 16.57 echo ========== This module provides support for the 'echo' to display a line of text. *Note echo:: for more information.  File: grub.info, Node: efi_gop_module, Next: efi_uga_module, Prev: echo_module, Up: Modules 16.58 efi_gop ============= This module provides support for the UEFI video output protocol "Graphics Output Protocol" (GOP).  File: grub.info, Node: efi_uga_module, Next: efiemu_module, Prev: efi_gop_module, Up: Modules 16.59 efi_uga ============= This module provides support for the EFI video protocol "Universal Graphic Adapter" (UGA).  File: grub.info, Node: efiemu_module, Next: efifwsetup_module, Prev: efi_uga_module, Up: Modules 16.60 efiemu ============ This module provides support for the commands 'efiemu_loadcore', 'efiemu_prepare', and 'efiemu_unload'. This provides an EFI emulation.  File: grub.info, Node: efifwsetup_module, Next: efinet_module, Prev: efiemu_module, Up: Modules 16.61 efifwsetup ================ This modules provides support for the command 'fwsetup' to reboot into the firmware setup menu. *Note fwsetup:: for more information.  File: grub.info, Node: efinet_module, Next: efitextmode_module, Prev: efifwsetup_module, Up: Modules 16.62 efinet ============ This module provides support for UEFI Network Booting for loading images and data from the network.  File: grub.info, Node: efitextmode_module, Next: ehci_module, Prev: efinet_module, Up: Modules 16.63 efitextmode ================= This module provides support for command 'efitextmode' to get and set output mode resolution. *Note efitextmode:: for more information.  File: grub.info, Node: ehci_module, Next: elf_module, Prev: efitextmode_module, Up: Modules 16.64 ehci ========== This module provides support for the USB Enhanced Host Controller Interface (EHCI) specification (USB 2.0).  File: grub.info, Node: elf_module, Next: emunet_module, Prev: ehci_module, Up: Modules 16.65 elf ========= This module provides support for loading Executable and Linkable Format (ELF) files.  File: grub.info, Node: emunet_module, Next: emupci_module, Prev: elf_module, Up: Modules 16.66 emunet ============ This module provides support for networking in GRUB on the emu platform.  File: grub.info, Node: emupci_module, Next: erofs_module, Prev: emunet_module, Up: Modules 16.67 emupci ============ This module provides support for accessing the PCI bus in GRUB on the emu platform.  File: grub.info, Node: erofs_module, Next: escc_module, Prev: emupci_module, Up: Modules 16.68 erofs =========== This module provides support for the Enhanced Read Only File System (EROFS).  File: grub.info, Node: escc_module, Next: eval_module, Prev: erofs_module, Up: Modules 16.69 escc ========== This module provides support for the "mac-io" terminal device on PowerPC.  File: grub.info, Node: eval_module, Next: exfat_module, Prev: escc_module, Up: Modules 16.70 eval ========== This module provides support for command 'eval' to evaluate the provided input as a sequence of GRUB commands. *Note eval:: for more information.  File: grub.info, Node: exfat_module, Next: exfctest_module, Prev: eval_module, Up: Modules 16.71 exfat =========== This module provides support for the Extensible File Allocation Table (exFAT) file system in GRUB.  File: grub.info, Node: exfctest_module, Next: ext2_module, Prev: exfat_module, Up: Modules 16.72 exfctest ============== This module is intended to provide an Example Functional Test of GRUB functions to use as a template for developing other GRUB functional tests.  File: grub.info, Node: ext2_module, Next: extcmd_module, Prev: exfctest_module, Up: Modules 16.73 ext2 ========== This module provides support for the Extended File System versions 2, 3, and 4 (ext2, ext3, and ext4) file systems in GRUB.  File: grub.info, Node: extcmd_module, Next: f2fs_module, Prev: ext2_module, Up: Modules 16.74 extcmd ============ This module is a support module to provide wrapper functions for registering other module commands depending on the state of the lockdown variable.  File: grub.info, Node: f2fs_module, Next: fat_module, Prev: extcmd_module, Up: Modules 16.75 f2fs ========== This module provides support for the Flash-Friendly File System (F2FS) in GRUB.  File: grub.info, Node: fat_module, Next: fdt_module, Prev: f2fs_module, Up: Modules 16.76 fat ========= This module provides support for the File Allocation Table 12-bit, 16-bit, and 32-bit (FAT12, FAT16, and FAT32) file systems in GRUB.  File: grub.info, Node: fdt_module, Next: file_module, Prev: fat_module, Up: Modules 16.77 fdt ========= This module provides support for the commands 'fdtdump' and 'devicetree' to dump the contents of a device tree blob (.dtb) to the console and to load a device tree blob (.dtb) from a filesystem, for later use by a Linux kernel, respectively. *Note devicetree:: and *note fdtdump:: for more information.  File: grub.info, Node: file_module, Next: fixvideo_module, Prev: fdt_module, Up: Modules 16.78 file ========== This module provides support for the command 'file' to test if the provided filename is of the specified type. *Note file:: for more information.  File: grub.info, Node: fixvideo_module, Next: font_module, Prev: file_module, Up: Modules 16.79 fixvideo ============== This module provides support for the command 'fix_video' to fix video problems in specific PCIe video devices by "patching" specific device register settings. Currently supports Intel 945GM (PCI ID '0x27a28086') and Intel 965GM (PCI ID '0x2a028086').  File: grub.info, Node: font_module, Next: freedos_module, Prev: fixvideo_module, Up: Modules 16.80 font ========== This module provides support for the commands 'loadfont' and 'lsfonts' to load a given font or list the loaded fonts. *Note loadfont:: and *note lsfonts:: for more information.  File: grub.info, Node: freedos_module, Next: fshelp_module, Prev: font_module, Up: Modules 16.81 freedos ============= This module provides support for command 'freedos' for loading a FreeDOS kernel.  File: grub.info, Node: fshelp_module, Next: functional_test_module, Prev: freedos_module, Up: Modules 16.82 fshelp ============ This module provides support functions (helper functions) for file systems.  File: grub.info, Node: functional_test_module, Next: gcry_arcfour_module, Prev: fshelp_module, Up: Modules 16.83 functional_test ===================== This module provides support for running the GRUB functional tests using commands 'functional_test' and 'all_functional_test'.  File: grub.info, Node: gcry_arcfour_module, Next: gcry_blowfish_module, Prev: functional_test_module, Up: Modules 16.84 gcry_arcfour ================== This module provides support for the arcfour stream cipher also known as RC4. If security is a concern, RC4 / arcfour cipher is consider broken (multiple known vulnerabilities make this insecure). This GRUB module is based on libgcrypt.  File: grub.info, Node: gcry_blowfish_module, Next: gcry_camellia_module, Prev: gcry_arcfour_module, Up: Modules 16.85 gcry_blowfish =================== This module provides support for the Blowfish cipher. This GRUB module is based on libgcrypt.  File: grub.info, Node: gcry_camellia_module, Next: gcry_cast5_module, Prev: gcry_blowfish_module, Up: Modules 16.86 gcry_camellia =================== This module provides support for the Camellia cipher. This GRUB module is based on libgcrypt.  File: grub.info, Node: gcry_cast5_module, Next: gcry_crc_module, Prev: gcry_camellia_module, Up: Modules 16.87 gcry_cast5 ================ This module provides support for the CAST5 (RFC2144, also known as CAST-128) cipher. This GRUB module is based on libgcrypt.  File: grub.info, Node: gcry_crc_module, Next: gcry_des_module, Prev: gcry_cast5_module, Up: Modules 16.88 gcry_crc ============== This module provides support for the CRC32, CRC32 RFC1510, and CRC24 RFC2440 cyclic redundancy checks. This GRUB module is based on libgcrypt.  File: grub.info, Node: gcry_des_module, Next: gcry_dsa_module, Prev: gcry_crc_module, Up: Modules 16.89 gcry_des ============== This module provides support for the Data Encryption Standard (DES) and Triple-DES ciphers. If security is a concern, DES has known vulnerabilities and is not recommended, and Triple-DES is no longer recommended by NIST. This GRUB module is based on libgcrypt.  File: grub.info, Node: gcry_dsa_module, Next: gcry_idea_module, Prev: gcry_des_module, Up: Modules 16.90 gcry_dsa ============== This module provides support for the Digital Signature Algorithm (DSA) cipher. This GRUB module is based on libgcrypt.  File: grub.info, Node: gcry_idea_module, Next: gcry_md4_module, Prev: gcry_dsa_module, Up: Modules 16.91 gcry_idea =============== This module provides support for the International Data Encryption Algorithm (IDEA) cipher. This GRUB module is based on libgcrypt.  File: grub.info, Node: gcry_md4_module, Next: gcry_md5_module, Prev: gcry_idea_module, Up: Modules 16.92 gcry_md4 ============== This module provides support for the Message Digest 4 (MD4) message digest. If security is a concern, MD4 has known vulnerabilities and is not recommended. This GRUB module is based on libgcrypt.  File: grub.info, Node: gcry_md5_module, Next: gcry_rfc2268_module, Prev: gcry_md4_module, Up: Modules 16.93 gcry_md5 ============== This module provides support for the Message Digest 5 (MD5) message digest. If security is a concern, MD5 has known vulnerabilities and is not recommended. This GRUB module is based on libgcrypt.  File: grub.info, Node: gcry_rfc2268_module, Next: gcry_rijndael_module, Prev: gcry_md5_module, Up: Modules 16.94 gcry_rfc2268 ================== This module provides support for the RFC2268 (RC2 / Ron's Cipher 2) cipher. If security is a concern, RC2 has known vulnerabilities and is not recommended. This GRUB module is based on libgcrypt.  File: grub.info, Node: gcry_rijndael_module, Next: gcry_rmd160_module, Prev: gcry_rfc2268_module, Up: Modules 16.95 gcry_rijndael =================== This module provides support for the Advanced Encryption Standard (AES-128, AES-192, and AES-256) ciphers. This GRUB module is based on libgcrypt.  File: grub.info, Node: gcry_rmd160_module, Next: gcry_rsa_module, Prev: gcry_rijndael_module, Up: Modules 16.96 gcry_rmd160 ================= This module provides support for the RIPEMD-160 message digest. This GRUB module is based on libgcrypt.  File: grub.info, Node: gcry_rsa_module, Next: gcry_seed_module, Prev: gcry_rmd160_module, Up: Modules 16.97 gcry_rsa ============== This module provides support for the Rivest–Shamir–Adleman (RSA) cipher. This GRUB module is based on libgcrypt.  File: grub.info, Node: gcry_seed_module, Next: gcry_serpent_module, Prev: gcry_rsa_module, Up: Modules 16.98 gcry_seed =============== This module provides support for the SEED cipher. This GRUB module is based on libgcrypt.  File: grub.info, Node: gcry_serpent_module, Next: gcry_sha1_module, Prev: gcry_seed_module, Up: Modules 16.99 gcry_serpent ================== This module provides support for the Serpent (128, 192, and 256) ciphers. This GRUB module is based on libgcrypt.  File: grub.info, Node: gcry_sha1_module, Next: gcry_sha256_module, Prev: gcry_serpent_module, Up: Modules 16.100 gcry_sha1 ================ This module provides support for the Secure Hash Algorithm 1 (SHA-1) message digest. If security is a concern, SHA-1 has known vulnerabilities and is not recommended. This GRUB module is based on libgcrypt.  File: grub.info, Node: gcry_sha256_module, Next: gcry_sha512_module, Prev: gcry_sha1_module, Up: Modules 16.101 gcry_sha256 ================== This module provides support for the Secure Hash Algorithm 2 (224 and 256 bit) (SHA-224 / SHA-256) message digests. This GRUB module is based on libgcrypt.  File: grub.info, Node: gcry_sha512_module, Next: gcry_tiger_module, Prev: gcry_sha256_module, Up: Modules 16.102 gcry_sha512 ================== This module provides support for the Secure Hash Algorithm 2 (384 and 512 bit) (SHA-384 / SHA-512) message digests. This GRUB module is based on libgcrypt.  File: grub.info, Node: gcry_tiger_module, Next: gcry_twofish_module, Prev: gcry_sha512_module, Up: Modules 16.103 gcry_tiger ================= This module provides support for the Tiger, Tiger 1, and Tiger 2 message digests. This GRUB module is based on libgcrypt.  File: grub.info, Node: gcry_twofish_module, Next: gcry_whirlpool_module, Prev: gcry_tiger_module, Up: Modules 16.104 gcry_twofish =================== This module provides support for the Twofish (128 and 256) ciphers. This GRUB module is based on libgcrypt.  File: grub.info, Node: gcry_whirlpool_module, Next: gdb_module, Prev: gcry_twofish_module, Up: Modules 16.105 gcry_whirlpool ===================== This module provides support for the Whirlpool message digest. This GRUB module is based on libgcrypt.  File: grub.info, Node: gdb_module, Next: geli_module, Prev: gcry_whirlpool_module, Up: Modules 16.106 gdb ========== This module provides support for remotely debugging GRUB using the GNU Debugger (GDB) over serial. This is typically done when troubleshooting GRUB during development and not required for normal GRUB operation. This module adds support for commands required by the GDB remote debug function including 'gdbstub' to start GDB stub on given serial port, 'gdbstub_break' to break into GDB, 'gdbstub_stop' to stop the GDB stub.  File: grub.info, Node: geli_module, Next: gettext_module, Prev: gdb_module, Up: Modules 16.107 geli =========== This module provides support for the GEOM ELI (GELI) disk encryption / decryption protocol used by FreeBSD. This module supports the following ciphers using the associated "gcry" modules: DES, Triple-DES, Blowfish, CAST5, AES, and Camellia 128.  File: grub.info, Node: gettext_module, Next: gfxmenu_module, Prev: geli_module, Up: Modules 16.108 gettext ============== This module provides support for the 'gettext' command to support translating information displayed / output by GRUB. *Note gettext:: for more information.  File: grub.info, Node: gfxmenu_module, Next: gfxterm_module, Prev: gettext_module, Up: Modules 16.109 gfxmenu ============== This module provides support for displaying a graphical menu / user interface from GRUB. This includes features such as graphical font support, theme support, image support, and icon support.  File: grub.info, Node: gfxterm_module, Next: gfxterm_background_module, Prev: gfxmenu_module, Up: Modules 16.110 gfxterm ============== This module provides support for displaying a terminal and menu interface from GRUB using graphics mode.  File: grub.info, Node: gfxterm_background_module, Next: gfxterm_menu_module, Prev: gfxterm_module, Up: Modules 16.111 gfxterm_background ========================= This module provides support for setting the gfxterm background color and background image using commands 'background_color' and 'background_image'. *Note background_color:: and *note background_image:: for more information.  File: grub.info, Node: gfxterm_menu_module, Next: gptsync_module, Prev: gfxterm_background_module, Up: Modules 16.112 gfxterm_menu =================== This module is intended for performing a functional test of the gfxmenu function in GRUB.  File: grub.info, Node: gptsync_module, Next: gzio_module, Prev: gfxterm_menu_module, Up: Modules 16.113 gptsync ============== This module provides support for the 'gptsync' command.. *Note gptsync:: for more information.  File: grub.info, Node: gzio_module, Next: halt_module, Prev: gptsync_module, Up: Modules 16.114 gzio =========== This module provides support for decompression (inflate) of files compressed with the GZ compression algorithm. This supports only the "DEFLATE" method for GZIP. Unsupported flags (will result in failure to inflate) include: 'GRUB_GZ_CONTINUATION', 'GRUB_GZ_ENCRYPTED', 'GRUB_GZ_RESERVED', and 'GRUB_GZ_EXTRA_FIELD'.  File: grub.info, Node: halt_module, Next: hashsum_module, Prev: gzio_module, Up: Modules 16.115 halt =========== This module provides support for the 'halt' command to shutdown / halt the system. *Note halt:: for more information.  File: grub.info, Node: hashsum_module, Next: hdparm_module, Prev: halt_module, Up: Modules 16.116 hashsum ============== This module provide support for the commands 'hashsum', 'md5sum', 'sha1sum', 'sha256sum', 'sha512sum', and 'crc' to calculate or check hashes of files using various methods. *Note hashsum::, *note md5sum:: *note sha1sum::, *note sha256sum::, *note sha512sum::, and *note crc::.  File: grub.info, Node: hdparm_module, Next: hello_module, Prev: hashsum_module, Up: Modules 16.117 hdparm ============= This module provides support for the 'hdparm' command to get or set various ATA disk parameters. This includes controlling Advanced Power Management (APM), displaying power mode, freezing ATA security settings until reset, displaying SMART status, controlling automatic acoustic management, setting standby timeout, setting the drive to standby mode, setting the drive to sleep mode, displaying the drive identification and settings, and enable/disable SMART.  File: grub.info, Node: hello_module, Next: help_module, Prev: hdparm_module, Up: Modules 16.118 hello ============ This provides support for the 'hello' command to simply output "Hello World". This is intended for testing GRUB module loading / functionality.  File: grub.info, Node: help_module, Next: hexdump_module, Prev: hello_module, Up: Modules 16.119 help =========== This module provides support for the 'help' command to output help text. *Note help:: for more information.  File: grub.info, Node: hexdump_module, Next: hfs_module, Prev: help_module, Up: Modules 16.120 hexdump ============== This module provides support for the 'hexdump' command to dump the contents of a file in hexadecimal. *Note hexdump:: for more information.  File: grub.info, Node: hfs_module, Next: hfsplus_module, Prev: hexdump_module, Up: Modules 16.121 hfs ========== This module provides support for the Hierarchical File System (HFS) file system in GRUB. Note: This module is not allowed in lockdown mode, *note Lockdown:: for more information.  File: grub.info, Node: hfsplus_module, Next: hfspluscomp_module, Prev: hfs_module, Up: Modules 16.122 hfsplus ============== This module provides support for the Hierarchical File System Plus (HFS+) file system in GRUB.  File: grub.info, Node: hfspluscomp_module, Next: http_module, Prev: hfsplus_module, Up: Modules 16.123 hfspluscomp ================== This module provides support for the Hierarchical File System Plus Compressed (HFS+ Compressed) file system in GRUB.  File: grub.info, Node: http_module, Next: ieee1275_fb_module, Prev: hfspluscomp_module, Up: Modules 16.124 http =========== This module provides support for getting data over the HTTP network protocol in GRUB (using the HTTP GET method). This may be used, for example, to obtain an operating system over HTTP (network boot).  File: grub.info, Node: ieee1275_fb_module, Next: iorw_module, Prev: http_module, Up: Modules 16.125 ieee1275_fb ================== This module provides support for the IEEE1275 video driver output for PowerPC with a IEEE-1275 platform.  File: grub.info, Node: iorw_module, Next: iso9660_module, Prev: ieee1275_fb_module, Up: Modules 16.126 iorw =========== This module provides support for commands 'inb', 'inw', 'inl', 'outb', 'outw', and 'outl' to read / write data to physical I/O ports. The "in" commands accept one parameter to specify the source port. The "out" commands require either two or three parameters, with the order: port, value, .  File: grub.info, Node: iso9660_module, Next: jfs_module, Prev: iorw_module, Up: Modules 16.127 iso9660 ============== This module provides support for the ISO9660 file system (often associated with optical disks such as CD-ROMs and DVD-ROMs, with extensions: System Use Sharing Protocol (SUSP), Rock Ridge (UNIX style permissions and longer names)  File: grub.info, Node: jfs_module, Next: jpeg_module, Prev: iso9660_module, Up: Modules 16.128 jfs ========== This module provides support for the Journaled File System (JFS) file system. Note: This module is not allowed in lockdown mode, *note Lockdown:: for more information.  File: grub.info, Node: jpeg_module, Next: json_module, Prev: jfs_module, Up: Modules 16.129 jpeg =========== This module provides support for reading JPEG image files in GRUB, such as to support displaying a JPEG image as a background image of the gfxmenu.  File: grub.info, Node: json_module, Next: keylayouts_module, Prev: jpeg_module, Up: Modules 16.130 json =========== This module provides library support for parsing / processing JavaScript Object Notation (JSON) formatted data. This is used, for example, to support LUKS2 disk encryption / decryption as metadata is encoded in JSON.  File: grub.info, Node: keylayouts_module, Next: keystatus_module, Prev: json_module, Up: Modules 16.131 keylayouts ================= This module provides support for the 'keymap' command. This command accepts one parameter to specify either the LAYOUT_NAME or the FILENAME. When specifying the LAYOUT_NAME, this command will attempt to open the GRUB keymap file based on the following logic: Get the "prefix" from environment variable PREFIX Open keymap file PREFIX/layouts/LAYOUT_NAME.gkb When specifying the FILENAME, the full path to the ".gkb" file should be provided. The ".gkb" file can be generated by grub-kbdcomp.  File: grub.info, Node: keystatus_module, Next: ldm_module, Prev: keylayouts_module, Up: Modules 16.132 keystatus ================ This module provides support for the 'keystatus' command to check key modifier status. *Note keystatus:: for more information.  File: grub.info, Node: ldm_module, Next: legacy_password_test_module, Prev: keystatus_module, Up: Modules 16.133 ldm ========== This module provides support for the Logical Disk Manager (LDM) disk format. LDM is used to add support for logical volumes most often with Microsoft Windows systems. A logical volume can be defined to span more than one physical disk.  File: grub.info, Node: legacy_password_test_module, Next: legacycfg_module, Prev: ldm_module, Up: Modules 16.134 legacy_password_test =========================== This module is intended for performing a functional test of the legacy password function in GRUB.  File: grub.info, Node: legacycfg_module, Next: linux_module, Prev: legacy_password_test_module, Up: Modules 16.135 legacycfg ================ This module provides support for commands 'legacy_source', 'legacy_configfile', 'extract_legacy_entries_source', 'extract_legacy_entries_configfile', 'legacy_kernel', 'legacy_initrd', 'legacy_initrd_nounzip', 'legacy_password', and 'legacy_check_password'. For new uses / configurations of GRUB other commands / modules offer the modern equivalents.  File: grub.info, Node: linux_module, Next: linux16_module, Prev: legacycfg_module, Up: Modules 16.136 linux ============ This module provides support for the commands 'linux' and 'initrd' to load Linux and an Initial RAM Disk respectively. *Note linux:: and *note initrd:: for more information.  File: grub.info, Node: linux16_module, Next: loadbios_module, Prev: linux_module, Up: Modules 16.137 linux16 ============== This module provides support for the commands 'linux16' and 'initrd16' to load Linux in 16-bit mode and an Initial RAM Disk in 16-bit mode respectively. *Note linux16:: and *note initrd16:: for more information.  File: grub.info, Node: loadbios_module, Next: loadenv_module, Prev: linux16_module, Up: Modules 16.138 loadbios =============== This module provides support for the commands 'fakebios' and 'loadbios'. These commands may only be useful on platforms with issues requiring work-arounds. Command 'fakebios' is used to create BIOS-like structures for backward compatibility with existing OS. Command 'loadbios' is used to load a BIOS dump.  File: grub.info, Node: loadenv_module, Next: loopback_module, Prev: loadbios_module, Up: Modules 16.139 loadenv ============== This module provides support for commands 'load_env', 'list_env', and 'save_env'. These commands can be used to load environment variables from a file, list environment variables in a file, and save environment variables to a file. *Note load_env::, *note list_env::, and *note save_env::.  File: grub.info, Node: loopback_module, Next: ls_module, Prev: loadenv_module, Up: Modules 16.140 loopback =============== This module provides support for the 'loopback' command. *Note loopback:: for more information.  File: grub.info, Node: ls_module, Next: lsacpi_module, Prev: loopback_module, Up: Modules 16.141 ls ========= This module provides support for the 'ls' command. *Note ls:: for more information.  File: grub.info, Node: lsacpi_module, Next: lsapm_module, Prev: ls_module, Up: Modules 16.142 lsacpi ============= This module provides support for the 'lsacpi' command. This command can be used to display Advanced Configuration and Power Interface (ACPI) tables.  File: grub.info, Node: lsapm_module, Next: lsdev_module, Prev: lsacpi_module, Up: Modules 16.143 lsapm ============ This module provides support for the 'lsapm' command. This command can be used to display Advanced power management (APM) information.  File: grub.info, Node: lsdev_module, Next: lsefi_module, Prev: lsapm_module, Up: Modules 16.144 lsdev ============ This module provides support for the 'lsdev' command. This command can be used on MIPS Advanced RISC Computing (ARC) platforms to display devices.  File: grub.info, Node: lsefi_module, Next: lsefimmap_module, Prev: lsdev_module, Up: Modules 16.145 lsefi ============ This module provides support for the 'lsefi' command. This command can be used on EFI platforms to display EFI handles.  File: grub.info, Node: lsefimmap_module, Next: lsefisystab_module, Prev: lsefi_module, Up: Modules 16.146 lsefimmap ================ This module provides support for the 'lsefimmap' command. This command can be used on EFI platforms to display the EFI memory map.  File: grub.info, Node: lsefisystab_module, Next: lsmmap_module, Prev: lsefimmap_module, Up: Modules 16.147 lsefisystab ================== This module provides support for the 'lsefisystab' command. This command can be used on EFI platforms to display the EFI system tables.  File: grub.info, Node: lsmmap_module, Next: lspci_module, Prev: lsefisystab_module, Up: Modules 16.148 lsmmap ============= This module provides support for the 'lsmmap' command. This command can be used to display the memory map provided by firmware.  File: grub.info, Node: lspci_module, Next: lssal_module, Prev: lsmmap_module, Up: Modules 16.149 lspci ============ This module provides support for the 'lspci' command. This command can be used to display the PCI / PCIe devices.  File: grub.info, Node: lssal_module, Next: lsspd_module, Prev: lspci_module, Up: Modules 16.150 lssal ============ This module provides support for the 'lsefisystab' command. This command can be used on Itanium (IA-64) EFI platforms to display the EFI System Abstraction Layer system table.  File: grub.info, Node: lsspd_module, Next: lsxen_module, Prev: lssal_module, Up: Modules 16.151 lsspd ============ This module provides support for the 'lsspd' command. This command can be used on MIPS Loongson platforms to display the DDR RAM Serial Presence Detect (SPD) EEPROM data.  File: grub.info, Node: lsxen_module, Next: luks_module, Prev: lsspd_module, Up: Modules 16.152 lsxen ============ This module provides support for the commands 'xen_ls' and 'xen_cat' on Xen platforms to list Xen storage.  File: grub.info, Node: luks_module, Next: luks2_module, Prev: lsxen_module, Up: Modules 16.153 luks =========== This module provides support for the Linux Unified Key Setup (LUKS) (version 1) disk encryption / decryption protocol.  File: grub.info, Node: luks2_module, Next: lvm_module, Prev: luks_module, Up: Modules 16.154 luks2 ============ This module provides support for the Linux Unified Key Setup 2 (LUKS2) disk encryption / decryption protocol.  File: grub.info, Node: lvm_module, Next: lzopio_module, Prev: luks2_module, Up: Modules 16.155 lvm ========== This module provides support for reading Logical Volume Management "logical" disks. For example, a single "logical" disk may be mapped to span more than one physical disk. This would be used when booting from a LVM formatted disk as may be setup in Linux.  File: grub.info, Node: lzopio_module, Next: macbless_module, Prev: lvm_module, Up: Modules 16.156 lzopio ============= This module provides support for decompressing LZO / LZOP compressed files / archives.  File: grub.info, Node: macbless_module, Next: macho_module, Prev: lzopio_module, Up: Modules 16.157 macbless =============== This module provides support for commands 'mactelbless' and 'macppcbless' for "blessing" a bootloader on Intel / PPC based MACs using the HFS or HFS+ file system. On HFS / HFS+ - "blessing" makes a file run as the bootloader.  File: grub.info, Node: macho_module, Next: mda_text_module, Prev: macbless_module, Up: Modules 16.158 macho ============ This module provides support for Mach Object (Mach-O) object / executable files in GRUB often used in MacOS.  File: grub.info, Node: mda_text_module, Next: mdraid09_module, Prev: macho_module, Up: Modules 16.159 mda_text =============== This module provides support for the Monochrome Display Adapter (MDA) terminal output device. MDA is a predecessor to VGA.  File: grub.info, Node: mdraid09_module, Next: mdraid09_be_module, Prev: mda_text_module, Up: Modules 16.160 mdraid09 =============== This module provides support for handling Linux compatible "version 0.9" software-based RAID disks in little-endian format. The "version 0.9" format was largely replaced around the year 2009 with the "version 1.x" format (*note mdraid1x_module:: for more information).  File: grub.info, Node: mdraid09_be_module, Next: mdraid1x_module, Prev: mdraid09_module, Up: Modules 16.161 mdraid09_be ================== This module provides support for handling Linux compatible "version 0.9" software-based RAID disks in bid-endian format. The "version 0.9" format was largely replaced around the year 2009 with the "version 1.x" format (*note mdraid1x_module:: for more information).  File: grub.info, Node: mdraid1x_module, Next: memdisk_module, Prev: mdraid09_be_module, Up: Modules 16.162 mdraid1x =============== This module provides support for handling Linux compatible "version 1.x" software-based RAID disks. This includes the current version used by Linux at the time of writing.  File: grub.info, Node: memdisk_module, Next: memrw_module, Prev: mdraid1x_module, Up: Modules 16.163 memdisk ============== This module provides support for a memdisk device. A memdisk is a memory mapped emulated disk.  File: grub.info, Node: memrw_module, Next: memtools_module, Prev: memdisk_module, Up: Modules 16.164 memrw ============ This module provides support for commands 'read_byte', 'read_word', 'read_dword', 'write_byte', 'write_word', and 'write_dword' to read / write data to physical memory (addresses). The "read" commands accept one parameter to specify the source address. The "write" commands require either two or three parameters, with the order: address, value, . Note: The commands provided by this module are not allowed when lockdown is enforced (*note Lockdown::).  File: grub.info, Node: memtools_module, Next: minicmd_module, Prev: memrw_module, Up: Modules 16.165 memtools =============== This module provides support for GRUB development / debugging commands 'lsmem', 'lsfreemem', and 'stress_big_allocs'.  File: grub.info, Node: minicmd_module, Next: minix_module, Prev: memtools_module, Up: Modules 16.166 minicmd ============== This module provides support for a subset of commands for GRUB rescue mode including: 'cat', 'help', 'dump', 'rmmod', 'lsmod', and 'exit'. The version of the commands in this module are similar to their full-fledged counterparts implemented in other GRUB modules. Note: The 'dump' command is not allowed when lockdown is enforced (*note Lockdown::).  File: grub.info, Node: minix_module, Next: minix2_module, Prev: minicmd_module, Up: Modules 16.167 minix ============ This module provides support for the Minix filesystem, version 1. Note: This module is not allowed in lockdown mode, *note Lockdown:: for more information.  File: grub.info, Node: minix2_module, Next: minix2_be_module, Prev: minix_module, Up: Modules 16.168 minix2 ============= This module provides support for the Minix filesystem, version 2. Note: This module is not allowed in lockdown mode, *note Lockdown:: for more information.  File: grub.info, Node: minix2_be_module, Next: minix3_module, Prev: minix2_module, Up: Modules 16.169 minix2_be ================ This module provides support for the Minix filesystem, version 2 big-endian. Note: This module is not allowed in lockdown mode, *note Lockdown:: for more information.  File: grub.info, Node: minix3_module, Next: minix3_be_module, Prev: minix2_be_module, Up: Modules 16.170 minix3 ============= This module provides support for the Minix filesystem, version 3. Note: This module is not allowed in lockdown mode, *note Lockdown:: for more information.  File: grub.info, Node: minix3_be_module, Next: minix_be_module, Prev: minix3_module, Up: Modules 16.171 minix3_be ================ This module provides support for the Minix filesystem, version 3 big-endian. Note: This module is not allowed in lockdown mode, *note Lockdown:: for more information.  File: grub.info, Node: minix_be_module, Next: mmap_module, Prev: minix3_be_module, Up: Modules 16.172 minix_be =============== This module provides support for the Minix filesystem, version 1 big-endian. Note: This module is not allowed in lockdown mode, *note Lockdown:: for more information.  File: grub.info, Node: mmap_module, Next: morse_module, Prev: minix_be_module, Up: Modules 16.173 mmap =========== This module provides support for mapping or unmapping devices or files into memory as well as commands 'badram' and 'cutmem'. *Note badram:: and *note cutmem::.  File: grub.info, Node: morse_module, Next: mpi_module, Prev: mmap_module, Up: Modules 16.174 morse ============ This module provides support for outputting terminal output via Morse code to an audio speaker output.  File: grub.info, Node: mpi_module, Next: msdospart_module, Prev: morse_module, Up: Modules 16.175 mpi ========== This module provides support for multi-precision-integers (MPIs) in GRUB. MPIs are used by the crypto functions as many depend on mathematics of large numbers. This GRUB module is based on libgcrypt.  File: grub.info, Node: msdospart_module, Next: mul_test_module, Prev: mpi_module, Up: Modules 16.176 msdospart ================ This module provides support for modifying MSDOS formatted disk partitions through the separate 'parttool' command.  File: grub.info, Node: mul_test_module, Next: multiboot_module, Prev: msdospart_module, Up: Modules 16.177 mul_test =============== This module is intended for performing a functional test of the multiplication operations in GRUB.  File: grub.info, Node: multiboot_module, Next: multiboot2_module, Prev: mul_test_module, Up: Modules 16.178 multiboot ================ This module provides support for commands 'multiboot' and 'module' to load a multiboot kernel and load a multiboot module, respectively. *Note multiboot:: and *note module:: for more information. This is for loading data formatted per the GNU Multiboot specification.  File: grub.info, Node: multiboot2_module, Next: nand_module, Prev: multiboot_module, Up: Modules 16.179 multiboot2 ================= This module provides support for commands 'multiboot2' and 'module2' to load a multiboot kernel and load a multiboot module, respectively. This is for loading data formatted per the GNU Multiboot specification.  File: grub.info, Node: nand_module, Next: nativedisk_module, Prev: multiboot2_module, Up: Modules 16.180 nand =========== This module provides support for accessing an IEEE-1275 compliant NAND disk from GRUB.  File: grub.info, Node: nativedisk_module, Next: net_module, Prev: nand_module, Up: Modules 16.181 nativedisk ================= This module provides support for the 'nativedisk' command. *Note nativedisk:: for more information.  File: grub.info, Node: net_module, Next: newc_module, Prev: nativedisk_module, Up: Modules 16.182 net ========== This module provides support for networking protocols including ARP, BOOTP, DNS, Ethernet, ICMPv6, ICMP, IP, TCP, and UDP. Support is included for both IPv4 and IPv6. This includes the following commands: * 'net_bootp' - *note net_bootp:: * 'net_dhcp' - *note net_dhcp:: * 'net_get_dhcp_option' - *note net_get_dhcp_option:: * 'net_nslookup' - *note net_nslookup:: * 'net_add_dns' - *note net_add_dns:: * 'net_del_dns' - *note net_del_dns:: * 'net_ls_dns' - *note net_ls_dns:: * 'net_add_addr' - *note net_add_addr:: * 'net_ipv6_autoconf' - *note net_ipv6_autoconf:: * 'net_del_addr' - *note net_del_addr:: * 'net_add_route' - *note net_add_route:: * 'net_del_route' - *note net_del_route:: * 'net_set_vlan' - *note net_set_vlan:: * 'net_ls_routes' - *note net_ls_routes:: * 'net_ls_cards' - *note net_ls_cards:: * 'net_ls_addr' - *note net_ls_addr::  File: grub.info, Node: newc_module, Next: nilfs2_module, Prev: net_module, Up: Modules 16.183 newc =========== This module provides support for accessing a CPIO archive as a file system from GRUB. This module is for the following newer variants of the CPIO archive supported by GNU CPIO (but GNU CPIO defaults to the "bin" format which is handled by the module *note cpio_module::). These are the variants supported by this module: * "newc" - SVR4 portable format without CRC. GNU file utility will identify these as something like "ASCII cpio archive (SVR4 with no CRC)" * ‘crc’ - SVR4 portable format with CRC. GNU file utility will identify these as something like "ASCII cpio archive (SVR4 with CRC)"  File: grub.info, Node: nilfs2_module, Next: normal_module, Prev: newc_module, Up: Modules 16.184 nilfs2 ============= This module provides support for the New Implementation of Log filesystem (nilfs2). Note: This module is not allowed in lockdown mode, *note Lockdown:: for more information.  File: grub.info, Node: normal_module, Next: ntfs_module, Prev: nilfs2_module, Up: Modules 16.185 normal ============= This module provides support for the normal mode in GRUB. *Note normal:: for more information.  File: grub.info, Node: ntfs_module, Next: ntfscomp_module, Prev: normal_module, Up: Modules 16.186 ntfs =========== This module provides support for the New Technology File System (NTFS) in GRUB. Note: This module is not allowed in lockdown mode, *note Lockdown:: for more information.  File: grub.info, Node: ntfscomp_module, Next: ntldr_module, Prev: ntfs_module, Up: Modules 16.187 ntfscomp =============== This module provides support for compression with the New Technology File System (NTFS) in GRUB. Note: This module is not allowed in lockdown mode, *note Lockdown:: for more information.  File: grub.info, Node: ntldr_module, Next: odc_module, Prev: ntfscomp_module, Up: Modules 16.188 ntldr ============ This module provides support for the 'ntldr' command. This is may be used to boot a Windows boot loader such as NTLDR or BootMGR.  File: grub.info, Node: odc_module, Next: offsetio_module, Prev: ntldr_module, Up: Modules 16.189 odc ========== This module provides support for accessing a CPIO archive as a file system from GRUB. This module is for "odc" variant of the CPIO archive supported by GNU CPIO (but GNU CPIO defaults to the "bin" format which is handled by the module *note cpio_module::). GNU file utility will identify these as something like "ASCII cpio archive (pre-SVR4 or odc)"  File: grub.info, Node: offsetio_module, Next: ofnet_module, Prev: odc_module, Up: Modules 16.190 offsetio =============== This module provides support for reading from a file / archive at specified offsets in GRUB.  File: grub.info, Node: ofnet_module, Next: ohci_module, Prev: offsetio_module, Up: Modules 16.191 ofnet ============ This module provides support for the Open Firmware (IEEE-1275) network device support in GRUB.  File: grub.info, Node: ohci_module, Next: part_acorn_module, Prev: ofnet_module, Up: Modules 16.192 ohci =========== This module provides support for the Open Host Controller Interface (OHCI) for USB 1 / USB 1.1 support in GRUB.  File: grub.info, Node: part_acorn_module, Next: part_amiga_module, Prev: ohci_module, Up: Modules 16.193 part_acorn ================= This module provides support for reading from disks partitioned with the Acorn Disc Filing System (ADFS) used on RiscOS.  File: grub.info, Node: part_amiga_module, Next: part_apple_module, Prev: part_acorn_module, Up: Modules 16.194 part_amiga ================= This module provides support for reading from disks partitioned with the Amiga partition table.  File: grub.info, Node: part_apple_module, Next: part_bsd_module, Prev: part_amiga_module, Up: Modules 16.195 part_apple ================= This module provides support for reading from disks partitioned with the Macintosh partition table.  File: grub.info, Node: part_bsd_module, Next: part_dfly_module, Prev: part_apple_module, Up: Modules 16.196 part_bsd =============== This module provides support for reading from disks partitioned with BSD style partition tables.  File: grub.info, Node: part_dfly_module, Next: part_dvh_module, Prev: part_bsd_module, Up: Modules 16.197 part_dfly ================ This module provides support for reading from disks partitioned with the DragonFly BSD partition table.  File: grub.info, Node: part_dvh_module, Next: part_gpt_module, Prev: part_dfly_module, Up: Modules 16.198 part_dvh =============== This module provides support for reading from disks partitioned with the SGI Disk Volume Header partition table.  File: grub.info, Node: part_gpt_module, Next: part_msdos_module, Prev: part_dvh_module, Up: Modules 16.199 part_gpt =============== This module provides support for reading from disks partitioned with the GUID Partition Tables (GPT) partition table.  File: grub.info, Node: part_msdos_module, Next: part_plan_module, Prev: part_gpt_module, Up: Modules 16.200 part_msdos ================= This module provides support for reading from disks partitioned with the MSDOS (Master Boot Record / MBR) style partition tables.  File: grub.info, Node: part_plan_module, Next: part_sun_module, Prev: part_msdos_module, Up: Modules 16.201 part_plan ================ This module provides support for reading from disk partitioned with the Plan9 style partition table.  File: grub.info, Node: part_sun_module, Next: part_sunpc_module, Prev: part_plan_module, Up: Modules 16.202 part_sun =============== This module provides support for reading from disk partitioned with the Sun style partition table.  File: grub.info, Node: part_sunpc_module, Next: parttool_module, Prev: part_sun_module, Up: Modules 16.203 part_sunpc ================= This module provides support for reading from disk partitioned with the Sun PC style partition table.  File: grub.info, Node: parttool_module, Next: password_module, Prev: part_sunpc_module, Up: Modules 16.204 parttool =============== This module provides support for the 'parttool' command. *Note parttool:: for more information.  File: grub.info, Node: password_module, Next: password_pbkdf2_module, Prev: parttool_module, Up: Modules 16.205 password =============== This module provides support for the 'password' command. Please note that this uses the password in plain text, if security is a concern consider using *note password_pbkdf2_module:: instead. *Note password:: for more information.  File: grub.info, Node: password_pbkdf2_module, Next: pata_module, Prev: password_module, Up: Modules 16.206 password_pbkdf2 ====================== This module provides support for the 'password_pbkdf2' command. *Note password_pbkdf2:: for more information.  File: grub.info, Node: pata_module, Next: pbkdf2_module, Prev: password_pbkdf2_module, Up: Modules 16.207 pata =========== This module provides support for Parallel ATA (PATA) disk device interfaces.  File: grub.info, Node: pbkdf2_module, Next: pbkdf2_test_module, Prev: pata_module, Up: Modules 16.208 pbkdf2 ============= This module provides support for the Password-Based Key Derivation Function 2 (PBKDF2) / PKCS#5 PBKDF2 as per RFC 2898.  File: grub.info, Node: pbkdf2_test_module, Next: pci_module, Prev: pbkdf2_module, Up: Modules 16.209 pbkdf2_test ================== This module is intended for performing a functional test of the PBKDF2 operation in GRUB.  File: grub.info, Node: pci_module, Next: pcidump_module, Prev: pbkdf2_test_module, Up: Modules 16.210 pci ========== This module provides support for generic Peripheral Component Interconnect (PCI) bus in GRUB.  File: grub.info, Node: pcidump_module, Next: pgp_module, Prev: pci_module, Up: Modules 16.211 pcidump ============== This module provides support for the 'pcidump' command in GRUB to dump the PCI configuration registers in hexadecimal of a specified PCI device (vendor / device ID) or by position on the bus.  File: grub.info, Node: pgp_module, Next: plainmount_module, Prev: pcidump_module, Up: Modules 16.212 pgp ========== This module provides support for the commands: 'verify_detached', 'trust', 'list_trusted', 'distrust' associated with digital signature checking via the "Open Pretty Good Privacy" (PGP) protocol / RFC 4880 using a provided public key. This module also uses / sets environment variable 'check_signatures'. *Note verify_detached::, *note trust::, *note list_trusted::, *note distrust::, and *note check_signatures::.  File: grub.info, Node: plainmount_module, Next: plan9_module, Prev: pgp_module, Up: Modules 16.213 plainmount ================= This module provides support for accessing / mounting partitions encrypted by "cryptsetup" operating in "plain mode". *Note plainmount:: for more information.  File: grub.info, Node: plan9_module, Next: play_module, Prev: plainmount_module, Up: Modules 16.214 plan9 ============ This module provides support for the 'plan9' command to load a Plan9 kernel.  File: grub.info, Node: play_module, Next: png_module, Prev: plan9_module, Up: Modules 16.215 play =========== This module provides support for the 'play' command to play a tune through the PC speaker. *Note play:: for more information.  File: grub.info, Node: png_module, Next: priority_queue_module, Prev: play_module, Up: Modules 16.216 png ========== This module provides support for reading Portable Network Graphics (PNG) image files in GRUB.  File: grub.info, Node: priority_queue_module, Next: probe_module, Prev: png_module, Up: Modules 16.217 priority_queue ===================== This module provides support for a priority queue function within GRUB such as to support networking functions.  File: grub.info, Node: probe_module, Next: procfs_module, Prev: priority_queue_module, Up: Modules 16.218 probe ============ This module provides support for the 'probe' command to retrieve device information. *Note probe:: for more information.  File: grub.info, Node: procfs_module, Next: progress_module, Prev: probe_module, Up: Modules 16.219 procfs ============= This module provides support for a Proc File System to provide a file system like interface to some GRUB internal data.  File: grub.info, Node: progress_module, Next: pxe_module, Prev: procfs_module, Up: Modules 16.220 progress =============== This module provides support for showing file loading progress to the terminal.  File: grub.info, Node: pxe_module, Next: pxechain_module, Prev: progress_module, Up: Modules 16.221 pxe ========== This module provides support for Preboot Execution Environment (PXE) network boot services as a file system driver for other GRUB modules.  File: grub.info, Node: pxechain_module, Next: raid5rec_module, Prev: pxe_module, Up: Modules 16.222 pxechain =============== This module provides support for the 'pxechainloader' command to load another bootloader by PXE.  File: grub.info, Node: raid5rec_module, Next: raid6rec_module, Prev: pxechain_module, Up: Modules 16.223 raid5rec =============== This module provides support for recovering from faulty RAID4/5 disk arrays  File: grub.info, Node: raid6rec_module, Next: random_module, Prev: raid5rec_module, Up: Modules 16.224 raid6rec =============== This module provides support for recovering from faulty RAID6 disk arrays.  File: grub.info, Node: random_module, Next: rdmsr_module, Prev: raid6rec_module, Up: Modules 16.225 random ============= This module provides support for library functions to get random data via the hardware ACPI Power Management Timer and the TSC time source (Timestamp Counter).  File: grub.info, Node: rdmsr_module, Next: read_module, Prev: random_module, Up: Modules 16.226 rdmsr ============ This module provides support for the 'rdmsr' command to read CPU Model Specific Registers. *Note rdmsr:: for more information.  File: grub.info, Node: read_module, Next: reboot_module, Prev: rdmsr_module, Up: Modules 16.227 read =========== This module provides support for the 'read' command for getting user input. *Note read:: for more information.  File: grub.info, Node: reboot_module, Next: regexp_module, Prev: read_module, Up: Modules 16.228 reboot ============= This module provides support for the 'reboot' command to reboot the computer. *Note reboot:: for more information.  File: grub.info, Node: regexp_module, Next: reiserfs_module, Prev: reboot_module, Up: Modules 16.229 regexp ============= This module provides support for the 'regexp' command to check if a regular expression matches a string. This module also provides support for the GRUB script wildcard translator. *Note regexp:: for more information.  File: grub.info, Node: reiserfs_module, Next: relocator_module, Prev: regexp_module, Up: Modules 16.230 reiserfs =============== This module provides support for the ReiserFS File System in GRUB. Note: This module is not allowed in lockdown mode, *note Lockdown:: for more information.  File: grub.info, Node: relocator_module, Next: romfs_module, Prev: reiserfs_module, Up: Modules 16.231 relocator ================ This module provides support for relocating the image / executable being loaded to the expected memory location(s) and jumping to (invoking) the executable.  File: grub.info, Node: romfs_module, Next: scsi_module, Prev: relocator_module, Up: Modules 16.232 romfs ============ This module provides support for the Read-Only Memory File System (ROMFS). Note: This module is not allowed in lockdown mode, *note Lockdown:: for more information.  File: grub.info, Node: scsi_module, Next: sdl_module, Prev: romfs_module, Up: Modules 16.233 scsi =========== This module provides support for the Small Computer System Interface (SCSI) protocol used for some types of disk communication include some modern ones such as USB Mass Storage Devices supporting "USB Attached SCSI" (UAS).  File: grub.info, Node: sdl_module, Next: search_module, Prev: scsi_module, Up: Modules 16.234 sdl ========== This module provides support for Simple DirectMedia Layer (SDL) video / image output from the grub-emu tool used to preview the GRUB menu from a running Operating System such as Linux (useful to test GRUB menu configuration changes without rebooting). When available in the compilation target environment, SDL2 will be used instead of SDL1.  File: grub.info, Node: search_module, Next: search_fs_file_module, Prev: sdl_module, Up: Modules 16.235 search ============= This module provides support for the 'search' command to search devices by file, filesystem label, or filesystem UUID. *Note search:: for more information.  File: grub.info, Node: search_fs_file_module, Next: search_fs_uuid_module, Prev: search_module, Up: Modules 16.236 search_fs_file ===================== This module provides support for the 'search.file' command which is an alias for the corresponding 'search' command. *Note search:: for more information.  File: grub.info, Node: search_fs_uuid_module, Next: search_label_module, Prev: search_fs_file_module, Up: Modules 16.237 search_fs_uuid ===================== This module provides support for the 'search.fs_uuid' command which is an alias for the corresponding 'search' command. *Note search:: for more information.  File: grub.info, Node: search_label_module, Next: sendkey_module, Prev: search_fs_uuid_module, Up: Modules 16.238 search_label =================== This module provides support for the 'search.fs_label' command which is an alias for the corresponding 'search' command. *Note search:: for more information.  File: grub.info, Node: sendkey_module, Next: serial_module, Prev: search_label_module, Up: Modules 16.239 sendkey ============== This module provides support for the 'sendkey' command to send emulated keystrokes. *Note sendkey:: for more information.  File: grub.info, Node: serial_module, Next: setjmp_module, Prev: sendkey_module, Up: Modules 16.240 serial ============= This module provides support for the 'serial' command and associated driver support for communication over a serial interface from GRUB. *Note serial:: for more information.  File: grub.info, Node: setjmp_module, Next: setjmp_test_module, Prev: serial_module, Up: Modules 16.241 setjmp ============= This module provides support for the 'setjmp' and 'longjmp' functions used within GRUB.  File: grub.info, Node: setjmp_test_module, Next: setpci_module, Prev: setjmp_module, Up: Modules 16.242 setjmp_test ================== This module is intended for performing a functional test of the 'setjmp' and 'longjmp' functions in GRUB.  File: grub.info, Node: setpci_module, Next: sfs_module, Prev: setjmp_test_module, Up: Modules 16.243 setpci ============= This module provides support for the 'setpci' command to get / set values from / to specified PCI / PCIe devices.  File: grub.info, Node: sfs_module, Next: shift_test_module, Prev: setpci_module, Up: Modules 16.244 sfs ========== This module provides support for the Amiga Smart File System (SFS) in GRUB. Note: This module is not allowed in lockdown mode, *note Lockdown:: for more information.  File: grub.info, Node: shift_test_module, Next: signature_test_module, Prev: sfs_module, Up: Modules 16.245 shift_test ================= This module is intended for performing a functional test of the bit-wise shift operations in GRUB.  File: grub.info, Node: signature_test_module, Next: sleep_module, Prev: shift_test_module, Up: Modules 16.246 signature_test ===================== This module is intended for performing a functional test of the digital signature verification functions in GRUB.  File: grub.info, Node: sleep_module, Next: sleep_test_module, Prev: signature_test_module, Up: Modules 16.247 sleep ============ This module provides support for the 'sleep' command to wait a specified number of seconds in GRUB. *Note sleep:: for more information.  File: grub.info, Node: sleep_test_module, Next: smbios_module, Prev: sleep_module, Up: Modules 16.248 sleep_test ================= This module is intended for performing a functional test of the sleep function in GRUB.  File: grub.info, Node: smbios_module, Next: spkmodem_module, Prev: sleep_test_module, Up: Modules 16.249 smbios ============= This module provides support for the 'smbios' command to retrieve SMBIOS information in GRUB. *Note smbios:: for more information.  File: grub.info, Node: spkmodem_module, Next: squash4_module, Prev: smbios_module, Up: Modules 16.250 spkmodem =============== This module provides support for outputting GRUB console information over an audio output. This output can be fed into another computer's sound input and decoded using the 'spkmodem_recv' utility. Note that this will slow down GRUB's performance.  File: grub.info, Node: squash4_module, Next: strtoull_test_module, Prev: spkmodem_module, Up: Modules 16.251 squash4 ============== This module provides support for the SquashFS compressed read-only file system in GRUB.  File: grub.info, Node: strtoull_test_module, Next: suspend_module, Prev: squash4_module, Up: Modules 16.252 strtoull_test ==================== This module is intended for performing a functional test of the strtoull function in GRUB.  File: grub.info, Node: suspend_module, Next: syslinuxcfg_module, Prev: strtoull_test_module, Up: Modules 16.253 suspend ============== This module provides support for the 'suspend' command in GRUB to return to IEEE1275 prompt on "Open Firmware" systems.  File: grub.info, Node: syslinuxcfg_module, Next: tar_module, Prev: suspend_module, Up: Modules 16.254 syslinuxcfg ================== This module provides support for commands 'syslinux_source', 'syslinux_configfile', 'extract_syslinux_entries_source', and 'extract_syslinux_entries_configfile' in GRUB. These commands can be used to parse and display GRUB menu entries based on a Syslinux based configuration (used for SYSLINUX, ISOLINUX, and PXELINUX). It can also be used to execute the Syslinux loader from GRUB.  File: grub.info, Node: tar_module, Next: terminal_module, Prev: syslinuxcfg_module, Up: Modules 16.255 tar ========== This module provides support for the GNU Tar and POSIX Tar file archives as a file system in GRUB.  File: grub.info, Node: terminal_module, Next: terminfo_module, Prev: tar_module, Up: Modules 16.256 terminal =============== This module provides support for the commands 'terminal_input' and 'terminal_output' in GRUB. *Note terminal_input:: and *note terminal_output:: for more information.  File: grub.info, Node: terminfo_module, Next: test_module, Prev: terminal_module, Up: Modules 16.257 terminfo =============== This module provides support for the 'terminfo' command in GRUB to set various terminal modes / options. *Note terminfo:: for more information.  File: grub.info, Node: test_module, Next: test_blockarg_module, Prev: terminfo_module, Up: Modules 16.258 test =========== This module provides support for the commands 'test' and '['. These commands can be used to evaluate (test) an expression. *Note test:: for more information.  File: grub.info, Node: test_blockarg_module, Next: testload_module, Prev: test_module, Up: Modules 16.259 test_blockarg ==================== This module is intended for performing a functional test of the "block" command argument function in GRUB internal functions via a test command 'test_blockarg'.  File: grub.info, Node: testload_module, Next: testspeed_module, Prev: test_blockarg_module, Up: Modules 16.260 testload =============== This module is intended for performing a functional test of some file reading / seeking functions in GRUB internals via a test command 'testload'.  File: grub.info, Node: testspeed_module, Next: tftp_module, Prev: testload_module, Up: Modules 16.261 testspeed ================ This module provides support for the 'testspeed' command to test and print file read speed of a specified file.  File: grub.info, Node: tftp_module, Next: tga_module, Prev: testspeed_module, Up: Modules 16.262 tftp =========== This module provides support for the Trivial File Transfer Protocol (TFTP) for receiving files via the network to GRUB. TFTP may be used along with PXE for network booting for example.  File: grub.info, Node: tga_module, Next: time_module, Prev: tftp_module, Up: Modules 16.263 tga ========== This module provides support for reading Truevision Graphics Adapter (TGA) image files in GRUB.  File: grub.info, Node: time_module, Next: tpm_module, Prev: tga_module, Up: Modules 16.264 time =========== This module provides support for the 'time' command to measure the time taken by a given command and output it to the terminal.  File: grub.info, Node: tpm_module, Next: tr_module, Prev: time_module, Up: Modules 16.265 tpm ========== This module provides support for interacting with a Trusted Platform Module (TPM) with GRUB to perform Measured Boot. *Note Measured Boot:: for more information.  File: grub.info, Node: tr_module, Next: trig_module, Prev: tpm_module, Up: Modules 16.266 tr ========= This module provides support for the 'tr' command in GRUB. This can be used to translate characters in a string according to the provided arguments. For example this can be used to convert upper-case to lower-case and visa-versa.  File: grub.info, Node: trig_module, Next: true_module, Prev: tr_module, Up: Modules 16.267 trig =========== This module provides support for internal trig functions 'grub_cos' and 'grub_sin' using lookup based computation. Currently these trig functions are used by the gfxmenu circular progress bar.  File: grub.info, Node: true_module, Next: truecrypt_module, Prev: trig_module, Up: Modules 16.268 true =========== This module provides support for the commands 'true' and 'false'. *Note true:: and *note false:: for more information.  File: grub.info, Node: truecrypt_module, Next: ubootnet_module, Prev: true_module, Up: Modules 16.269 truecrypt ================ This module provides support for the 'truecrypt' command. This can be used to load a Truecrypt ISO image.  File: grub.info, Node: ubootnet_module, Next: udf_module, Prev: truecrypt_module, Up: Modules 16.270 ubootnet =============== This module provides support for configuring network interfaces in GRUB using information provided by a U-Boot bootloader.  File: grub.info, Node: udf_module, Next: ufs1_module, Prev: ubootnet_module, Up: Modules 16.271 udf ========== This module provides support for the Universal Disk Format (UDF) used on some newer optical disks. Note: This module is not allowed in lockdown mode, *note Lockdown:: for more information.  File: grub.info, Node: ufs1_module, Next: ufs1_be_module, Prev: udf_module, Up: Modules 16.272 ufs1 =========== This module provides support for the Unix File System version 1 in GRUB. Note: This module is not allowed in lockdown mode, *note Lockdown:: for more information.  File: grub.info, Node: ufs1_be_module, Next: ufs2_module, Prev: ufs1_module, Up: Modules 16.273 ufs1_be ============== This module provides support for the Unix File System version 1 (big-endian) in GRUB. Note: This module is not allowed in lockdown mode, *note Lockdown:: for more information.  File: grub.info, Node: ufs2_module, Next: uhci_module, Prev: ufs1_be_module, Up: Modules 16.274 ufs2 =========== This module provides support for the Unix File System version 2 in GRUB. Note: This module is not allowed in lockdown mode, *note Lockdown:: for more information.  File: grub.info, Node: uhci_module, Next: usb_module, Prev: ufs2_module, Up: Modules 16.275 uhci =========== This module provides support for the Universal Host Controller Interface (UHCI) for USB 1.x.  File: grub.info, Node: usb_module, Next: usb_keyboard_module, Prev: uhci_module, Up: Modules 16.276 usb ========== This module provides support for USB interfaces, USB hubs, and USB transfers in GRUB.  File: grub.info, Node: usb_keyboard_module, Next: usbms_module, Prev: usb_module, Up: Modules 16.277 usb_keyboard =================== This module provides support for a USB keyboard in GRUB.  File: grub.info, Node: usbms_module, Next: usbserial_common_module, Prev: usb_keyboard_module, Up: Modules 16.278 usbms ============ This module provides support for USB Mass Storage devices in GRUB.  File: grub.info, Node: usbserial_common_module, Next: usbserial_ftdi_module, Prev: usbms_module, Up: Modules 16.279 usbserial_common ======================= This module provides support for common operations needed to support USB Serial port adapters in GRUB (to support a model / type specific USB to serial adapter defined in another module).  File: grub.info, Node: usbserial_ftdi_module, Next: usbserial_pl2303_module, Prev: usbserial_common_module, Up: Modules 16.280 usbserial_ftdi ===================== This module provides support for USB to serial adapters with vendor ID 0x0403 and product ID 0x6001 (often associated with FTDI devices).  File: grub.info, Node: usbserial_pl2303_module, Next: usbserial_usbdebug_module, Prev: usbserial_ftdi_module, Up: Modules 16.281 usbserial_pl2303 ======================= This module provides support for USB to serial adapters with vendor ID 0x067b and product ID 0x2303 (PL2303 USB to Serial adapter).  File: grub.info, Node: usbserial_usbdebug_module, Next: usbtest_module, Prev: usbserial_pl2303_module, Up: Modules 16.282 usbserial_usbdebug ========================= This module provides support for debugging GRUB via a "USB 2.0 Debug Cable". The USB 2.0 specification includes a "USB2 Debug Device Functional Specification" that this driver is intended to support for GRUB. This may integrate with GDB server function in GRUB (*note gdb_module::).  File: grub.info, Node: usbtest_module, Next: vbe_module, Prev: usbserial_usbdebug_module, Up: Modules 16.283 usbtest ============== This module provides support for the 'usb' command in GRUB to test USB functionality by iterating through all connected USB devices and printing information for each to the terminal.  File: grub.info, Node: vbe_module, Next: verifiers_module, Prev: usbtest_module, Up: Modules 16.284 vbe ========== This module provides support for the VESA BIOS Extension (VBE) Video Driver in GRUB.  File: grub.info, Node: verifiers_module, Next: vga_module, Prev: vbe_module, Up: Modules 16.285 verifiers ================ This module is a built-in kernel module to provide a framework for GRUB file verifiers and string verifiers.  File: grub.info, Node: vga_module, Next: vga_text_module, Prev: verifiers_module, Up: Modules 16.286 vga ========== This module provides support for the Video Graphics Array (VGA) Video Driver in GRUB.  File: grub.info, Node: vga_text_module, Next: video_module, Prev: vga_module, Up: Modules 16.287 vga_text =============== This module provides support for the Video Graphics Array (VGA) terminal output device.  File: grub.info, Node: video_module, Next: video_bochs_module, Prev: vga_text_module, Up: Modules 16.288 video ============ This module provides support for video output support functions within GRUB.  File: grub.info, Node: video_bochs_module, Next: video_cirrus_module, Prev: video_module, Up: Modules 16.289 video_bochs ================== This module provides support for the Bochs PCI Video Driver (also known as Bochs Graphics Adapter / BGA) in GRUB.  File: grub.info, Node: video_cirrus_module, Next: video_colors_module, Prev: video_bochs_module, Up: Modules 16.290 video_cirrus =================== This module provides support for the Cirrus CLGD 5446 PCI Video Driver (Cirrus Video) in GRUB.  File: grub.info, Node: video_colors_module, Next: video_fb_module, Prev: video_cirrus_module, Up: Modules 16.291 video_colors =================== This module provides support for interpreting named colors and parsing RBG hexadecimal values.  File: grub.info, Node: video_fb_module, Next: videoinfo_module, Prev: video_colors_module, Up: Modules 16.292 video_fb =============== This module provides support for video frame buffer (FB) support in GRUB.  File: grub.info, Node: videoinfo_module, Next: videotest_module, Prev: video_fb_module, Up: Modules 16.293 videoinfo ================ This module provides support for the 'videoinfo' command and (depending on architecture) the 'vbeinfo' command. *Note videoinfo:: for more information.  File: grub.info, Node: videotest_module, Next: videotest_checksum_module, Prev: videoinfo_module, Up: Modules 16.294 videotest ================ This module provides support for the 'videotest' command and (depending on architecture) the 'vbetest' to test the video subsystem in the specified width and height.  File: grub.info, Node: videotest_checksum_module, Next: wrmsr_module, Prev: videotest_module, Up: Modules 16.295 videotest_checksum ========================= This module is intended for performing a functional test of the video functions in GRUB by displaying a test image and capturing a checksum.  File: grub.info, Node: wrmsr_module, Next: xen_boot_module, Prev: videotest_checksum_module, Up: Modules 16.296 wrmsr ============ This module provides support for the 'wrmsr' command to write to CPU model-specific registers. *Note wrmsr:: for more information.  File: grub.info, Node: xen_boot_module, Next: xfs_module, Prev: wrmsr_module, Up: Modules 16.297 xen_boot =============== This module provides support for the commands 'xen_hypervisor' and 'xen_module' to load a XEN hypervisor and module respectively.  File: grub.info, Node: xfs_module, Next: xnu_module, Prev: xen_boot_module, Up: Modules 16.298 xfs ========== This module provides support for the XFS file system in GRUB.  File: grub.info, Node: xnu_module, Next: xnu_uuid_module, Prev: xfs_module, Up: Modules 16.299 xnu ========== This module provides support for the commands: 'xnu_devprop_load', 'xnu_kernel', 'xnu_kernel64', 'xnu_mkext', 'xnu_kext', 'xnu_kextdir', 'xnu_ramdisk', 'xnu_splash', and 'xnu_resume' (only for emulated machine). These commands support loading and interacting with a XNU (MacOS / Apple) based system / kernel.  File: grub.info, Node: xnu_uuid_module, Next: xnu_uuid_test_module, Prev: xnu_module, Up: Modules 16.300 xnu_uuid =============== This module provides support for the 'xnu_uuid' command to transform a 64-bit UUID to a format suitable for XNU.  File: grub.info, Node: xnu_uuid_test_module, Next: xzio_module, Prev: xnu_uuid_module, Up: Modules 16.301 xnu_uuid_test ==================== This module is intended for performing a functional test of the XNU UUID conversion function.  File: grub.info, Node: xzio_module, Next: zfs_module, Prev: xnu_uuid_test_module, Up: Modules 16.302 xzio =========== This module provides support for decompression of XZ compressed data.  File: grub.info, Node: zfs_module, Next: zfscrypt_module, Prev: xzio_module, Up: Modules 16.303 zfs ========== This module provides support for the ZFS file system in GRUB.  File: grub.info, Node: zfscrypt_module, Next: zfsinfo_module, Prev: zfs_module, Up: Modules 16.304 zfscrypt =============== This module provides support for the 'zfskey' to import a decryption key as well as decryption support for encrypted ZFS file systems.  File: grub.info, Node: zfsinfo_module, Next: zstd_module, Prev: zfscrypt_module, Up: Modules 16.305 zfsinfo ============== This module provides support for the commands 'zfsinfo' to output ZFS info about a device and 'zfs-bootfs' to output ZFS-BOOTFSOBJ or store it into a variable.  File: grub.info, Node: zstd_module, Prev: zfsinfo_module, Up: Modules 16.306 zstd =========== This module provides support for the Zstandard (zstd) decompression algorithm in GRUB.  File: grub.info, Node: Commands, Next: Internationalisation, Prev: Modules, Up: Top 17 Available commands ********************* In this chapter, we list all commands that are available in GRUB. Commands belong to different groups. A few can only be used in the global section of the configuration file (or "menu"); most of them can be entered on the command-line and can be used either anywhere in the menu or specifically in the menu entries. In rescue mode, only the 'insmod' (*note insmod::), 'ls' (*note ls::), 'set' (*note set::), and 'unset' (*note unset::) commands are normally available. If you end up in rescue mode and do not know what to do, then *note GRUB only offers a rescue shell::. * Menu: * Menu-specific commands:: * Loader commands:: * General commands:: * Command-line commands:: * Networking commands:: * Undocumented commands::  File: grub.info, Node: Menu-specific commands, Next: Loader commands, Up: Commands 17.1 Commands for the menu only =============================== The semantics used in parsing the configuration file are the following: * The files _must_ be in plain-text format. * '#' at the beginning of a line in a configuration file means it is only a comment. * Options are separated by spaces. * All numbers can be either decimal or hexadecimal. A hexadecimal number must be preceded by '0x', and is case-insensitive. These commands can only be used in the menu: * Menu: * menuentry:: Start a menu entry * submenu:: Group menu entries  File: grub.info, Node: menuentry, Next: submenu, Up: Menu-specific commands 17.1.1 menuentry ---------------- -- Command: menuentry TITLE [--class=class ...] [--users=users] [--unrestricted] [--hotkey=key] [--id=id] [ARG ...] { COMMAND; ... } This defines a GRUB menu entry named TITLE. When this entry is selected from the menu, GRUB will set the CHOSEN environment variable to value of '--id' if '--id' is given, execute the list of commands given within braces, and if the last command in the list returned successfully and a kernel was loaded it will execute the 'boot' command. The '--class' option may be used any number of times to group menu entries into classes. Menu themes may display different classes using different styles. The '--users' option grants specific users access to specific menu entries. *Note Security::. The '--unrestricted' option grants all users access to specific menu entries. *Note Security::. The '--hotkey' option associates a hotkey with a menu entry. KEY may be a single letter, or one of the aliases 'backspace', 'tab', or 'delete'. The '--id' may be used to associate unique identifier with a menu entry. ID is string of ASCII aphanumeric characters, underscore and hyphen and should not start with a digit. All other arguments including TITLE are passed as positional parameters when list of commands is executed with TITLE always assigned to '$1'.  File: grub.info, Node: submenu, Prev: menuentry, Up: Menu-specific commands 17.1.2 submenu -------------- -- Command: submenu TITLE [--class=class ...] [--users=users] [--unrestricted] [--hotkey=key] [--id=id] { MENU ENTRIES ... } This defines a submenu. An entry called TITLE will be added to the menu; when that entry is selected, a new menu will be displayed showing all the entries within this submenu. All options are the same as in the 'menuentry' command (*note menuentry::).  File: grub.info, Node: Loader commands, Next: General commands, Prev: Menu-specific commands, Up: Commands 17.2 Various loader commands ============================ These commands are used to load necessary components to boot desired OS. Many of the loader commands are not sufficiently documented. The following is a list of commands that could use more documentation: * 'appleloader' - Boot BIOS-based system. * 'freedos' - Load FreeDOS kernel.sys. * 'kfreebsd_loadenv' - Load FreeBSD env. * 'kfreebsd_module_elf' - Load FreeBSD kernel module (ELF). * 'kfreebsd_module' - Load FreeBSD kernel module. * 'kfreebsd' - Load kernel of FreeBSD. * 'knetbsd_module_elf' - Load NetBSD kernel module (ELF). * 'knetbsd_module' - Load NetBSD kernel module. * 'knetbsd' - Load kernel of NetBSD. * 'kopenbsd' - Load kernel of OpenBSD. * 'kopenbsd_ramdisk' - Load kOpenBSD ramdisk. * 'legacy_initrd_nounzip' - Simulate grub-legacy 'modulenounzip' command * 'legacy_initrd' - Simulate grub-legacy 'initrd' command * 'legacy_kernel' - Simulate grub-legacy 'kernel' command * 'module2' - Load a multiboot 2 module. * 'module' - Load a multiboot module. * 'multiboot2' - Load a multiboot 2 kernel. * 'multiboot' - Load a multiboot kernel. * 'ntldr' - Load NTLDR or BootMGR. * 'plan9' - Load Plan9 kernel. * 'pxechainloader' - Load a PXE image. * 'truecrypt' - Load Truecrypt ISO. * 'xnu_kernel64' - Load 64-bit XNU image. * 'xnu_kernel' - Load XNU image. * 'xnu_kextdir' - Load XNU extension directory. * 'xnu_kext' - Load XNU extension. * 'xnu_mkext' - Load XNU extension package. * 'xnu_ramdisk' - Load XNU ramdisk. It will be available in OS as md0. * 'xnu_resume' - Load an image of hibernated XNU. * 'xnu_splash' - Load a splash image for XNU. * Menu: * chainloader:: Chain-load another boot loader * initrd:: Load a Linux initrd * initrd16:: Load a Linux initrd (16-bit mode) * linux:: Load a Linux kernel * linux16:: Load a Linux kernel (16-bit mode) * xen_hypervisor:: Load xen hypervisor binary (only on AArch64) * xen_module:: Load xen modules for xen hypervisor (only on AArch64)  File: grub.info, Node: chainloader, Next: initrd, Up: Loader commands 17.2.1 chainloader ------------------ -- Command: chainloader [--force] file [args...] Load FILE as a chain-loader. Like any other file loaded by the filesystem code, it can use the blocklist notation (*note Block list syntax::) to grab the first sector of the current partition with '+1'. On EFI platforms, any arguments after FILE will be sent to the loaded image. If you specify the option '--force', then load FILE forcibly, whether it has a correct signature or not. This is required when you want to load a defective boot loader, such as SCO UnixWare 7.1.  File: grub.info, Node: initrd, Next: initrd16, Prev: chainloader, Up: Loader commands 17.2.2 initrd ------------- -- Command: initrd file [file ...] Load, in order, all initrds for a Linux kernel image, and set the appropriate parameters in the Linux setup area in memory. This may only be used after the 'linux' command (*note linux::) has been run. See *note GNU/Linux:: for more info on booting GNU/Linux. For more information on initrds see the GNU/Linux kernel documentation (https://docs.kernel.org/filesystems/ramfs-rootfs-initramfs.html). A new-style initrd (for kernels newer than 2.6) containing one file with leading path components can also be generated at run time. This can be done by prefixing an argument with 'newc:' followed by the path of the file in the new initrd, a ':', and then the GRUB file path to the file data to be be included. For example: initrd newc:/etc/ssh/config:(hd0,2)/home/user/.ssh/config \ newc:/etc/ssh/ssh_host_rsa_key:/etc/ssh/ssh_host_rsa_key \ /boot/initrd.gz \ newc:/init:/home/user/init.fixed This command will generate two new-style initrds on the fly. The first contains the path '/etc/ssh/config' with the contents of '(hd0,2)/home/user/.ssh/config' and the path '/etc/ssh/ssh_host_rsa_key' with the contents of '/etc/ssh/ssh_host_rsa_key' on the ROOT device. Parent directory paths will automatically be generated as needed. This first generated initrd will then have '/boot/initrd.gz' concatenated after it. Next, another new-style archive will be generated with the contents of '/home/user/init.fixed' in the path '/init' and appended to the previous concatenation. Finally, the result will be sent to the kernel when booted. Keep in mind that paths that come later will take precedence. So in the example above, the generated path '/init' will overwrite any '/init' in '/boot/initrd.gz'. This can be useful when changing the main initrd is undesirable or difficult.  File: grub.info, Node: initrd16, Next: linux, Prev: initrd, Up: Loader commands 17.2.3 initrd16 --------------- -- Command: initrd16 file [file ...] Load, in order, all initrds for a Linux kernel image to be booted in 16-bit mode, and set the appropriate parameters in the Linux setup area in memory. This may only be used after the 'linux16' command (*note linux16::) has been run. See also *note GNU/Linux:: and the 'initrd' command (*note initrd::) for more details on arguments. This command is only available on the pc platform for x86 systems.  File: grub.info, Node: linux, Next: linux16, Prev: initrd16, Up: Loader commands 17.2.4 linux ------------ -- Command: linux file ... Load a Linux kernel image from FILE. The rest of the line is passed verbatim as the "kernel command-line". Any initrd must be reloaded after using this command (*note initrd::). On x86 systems, the kernel will be booted using the 32-bit boot protocol. Note that this means that the 'vga=' boot option will not work; if you want to set a special video mode, you will need to use GRUB commands such as 'set gfxpayload=1024x768' or 'set gfxpayload=keep' (to keep the same mode as used in GRUB) instead. GRUB can automatically detect some uses of 'vga=' and translate them to appropriate settings of 'gfxpayload'. The 'linux16' command (*note linux16::) avoids this restriction.  File: grub.info, Node: linux16, Next: xen_hypervisor, Prev: linux, Up: Loader commands 17.2.5 linux16 -------------- -- Command: linux16 file ... Load a Linux kernel image from FILE in 16-bit mode. The rest of the line is passed verbatim as the "kernel command-line". Any initrd must be reloaded after using this command (*note initrd16::). The kernel will be booted using the traditional 16-bit boot protocol. As well as bypassing problems with 'vga=' described in *note linux::, this permits booting some other programs that implement the Linux boot protocol for the sake of convenience. This command is only available on x86 systems.  File: grub.info, Node: xen_hypervisor, Next: xen_module, Prev: linux16, Up: Loader commands 17.2.6 xen_hypervisor --------------------- -- Command: xen_hypervisor file [arguments] ... Load a Xen hypervisor binary from FILE. The rest of the line is passed verbatim as the "kernel command-line". Any other binaries must be reloaded after using this command. This command is only available on AArch64 systems.  File: grub.info, Node: xen_module, Prev: xen_hypervisor, Up: Loader commands 17.2.7 xen_module ----------------- -- Command: xen_module [--nounzip] file [arguments] Load a module for xen hypervisor at the booting process of xen. The rest of the line is passed verbatim as the module command line. Modules should be loaded in the following order: - dom0 kernel image - dom0 ramdisk if present - XSM policy if present This command is only available on AArch64 systems.  File: grub.info, Node: General commands, Next: Command-line commands, Prev: Loader commands, Up: Commands 17.3 General commands ===================== Commands usable anywhere in the menu and in the command-line. * Menu: * serial:: Set up a serial device * terminal_input:: Manage input terminals * terminal_output:: Manage output terminals * terminfo:: Define terminal type  File: grub.info, Node: serial, Next: terminal_input, Up: General commands 17.3.1 serial ------------- -- Command: serial [--unit=unit] [--port=port] [--speed=speed] [--word=word] [--parity=parity] [--stop=stop] Initialize a serial device. UNIT is a number in the range 0-3 specifying which serial port to use; default is 0, which corresponds to the port often called COM1. PORT is the I/O port where the UART is to be found or, if prefixed with 'mmio,', the MMIO address of the UART. If specified it takes precedence over UNIT. Additionally, an MMIO address can be suffixed with: * '.b' for bytes access (default) * '.w' for 16-bit word access * '.l' for 32-bit long word access or * '.q' for 64-bit long long word access Also, PORT can be of the form 'pci,XX:XX.X' to indicate a serial device exposed on the PCI bus. SPEED is the transmission speed; default is 9600. WORD and STOP are the number of data bits and stop bits. Data bits must be in the range 5-8 and stop bits must be 1 or 2. Default is 8 data bits and one stop bit. PARITY is one of 'no', 'odd', 'even' and defaults to 'no'. If passed no UNIT nor PORT, or if PORT is set to 'auto' then GRUB will attempt to use ACPI to automatically detect the system default serial port and its configuration. If this information is not available, it will default to UNIT 0. The serial port is not used as a communication channel unless the 'terminal_input' or 'terminal_output' command is used (*note terminal_input::, *note terminal_output::). Note, valid PORT values, excluding IO port addresses, can be found by listing terminals with 'terminal_output', selecting all names prefixed by 'serial_' and removing that prefix. Examples: serial --port=0x3f8 --speed=9600 serial --port=mmio,fefb0000.l --speed=115200 serial --port=pci,00:16.3 --speed=115200 See also *note Serial terminal::.  File: grub.info, Node: terminal_input, Next: terminal_output, Prev: serial, Up: General commands 17.3.2 terminal_input --------------------- -- Command: terminal_input [--append|--remove] [terminal1] [terminal2] ... List or select an input terminal. With no arguments, list the active and available input terminals. With '--append', add the named terminals to the list of active input terminals; any of these may be used to provide input to GRUB. With '--remove', remove the named terminals from the active list. With no options but a list of terminal names, make only the listed terminal names active.  File: grub.info, Node: terminal_output, Next: terminfo, Prev: terminal_input, Up: General commands 17.3.3 terminal_output ---------------------- -- Command: terminal_output [--append|--remove] [terminal1] [terminal2] ... List or select an output terminal. With no arguments, list the active and available output terminals. With '--append', add the named terminals to the list of active output terminals; all of these will receive output from GRUB. With '--remove', remove the named terminals from the active list. With no options but a list of terminal names, make only the listed terminal names active.  File: grub.info, Node: terminfo, Prev: terminal_output, Up: General commands 17.3.4 terminfo --------------- -- Command: terminfo [-a|-u|-v] [-g WxH] [term] [type] Define the capabilities of your terminal by giving the name of an entry in the terminfo database, which should correspond roughly to a 'TERM' environment variable in Unix. The currently available terminal types are 'vt100', 'vt100-color', 'ieee1275', and 'dumb'. If you need other terminal types, please contact us to discuss the best way to include support for these in GRUB. The '-a' ('--ascii'), '-u' ('--utf8'), and '-v' ('--visual-utf8') options control how non-ASCII text is displayed. '-a' specifies an ASCII-only terminal; '-u' specifies logically-ordered UTF-8; and '-v' specifies "visually-ordered UTF-8" (in other words, arranged such that a terminal emulator without bidirectional text support will display right-to-left text in the proper order; this is not really proper UTF-8, but a workaround). The '-g' ('--geometry') can be used to specify terminal geometry. If no option or terminal type is specified, the current terminal type is printed.  File: grub.info, Node: Command-line commands, Next: Networking commands, Prev: General commands, Up: Commands 17.4 Command-line commands ========================== These commands are usable in the command-line and in menu entries. If you forget a command, you can run the command 'help' (*note help::). * Menu: * [:: Check file types and compare values * acpi:: Load ACPI tables * authenticate:: Check whether user is in user list * background_color:: Set background color for active terminal * background_image:: Load background image for active terminal * badram:: Filter out bad regions of RAM * blocklist:: Print a block list * boot:: Start up your operating system * cat:: Show the contents of a file * clear:: Clear the screen * cmosclean:: Clear bit in CMOS * cmosdump:: Dump CMOS contents * cmostest:: Test bit in CMOS * cmp:: Compare two files * configfile:: Load a configuration file * cpuid:: Check for CPU features * crc:: Compute or check CRC32 checksums * cryptocheck:: Check if a device is encrypted * cryptomount:: Mount a crypto device * cutmem:: Remove memory regions * date:: Display or set current date and time * devicetree:: Load a device tree blob * distrust:: Remove a pubkey from trusted keys * drivemap:: Map a drive to another * echo:: Display a line of text * efitextmode:: Set/Get text output mode resolution * eval:: Evaluate agruments as GRUB commands * export:: Export an environment variable * false:: Do nothing, unsuccessfully * fdtdump:: Retrieve device tree information * file:: Test the provided file against a type * fwsetup:: Reboot into the firmware setup menu * gdbinfo:: Provide info for debugging with GDB * gettext:: Translate a string * gptsync:: Fill an MBR based on GPT entries * halt:: Shut down your computer * hashsum:: Compute or check hash checksum * help:: Show help messages * hexdump:: Show raw contents of a file or memory * insmod:: Insert a module * keystatus:: Check key modifier status * list_env:: List variables in environment block * list_trusted:: List trusted public keys * load_env:: Load variables from environment block * loadfont:: Load font files * loopback:: Make a device from a filesystem image * ls:: List devices or files * lsfonts:: List loaded fonts * lsmod:: Show loaded modules * md5sum:: Compute or check MD5 hash * module:: Load module for multiboot kernel * multiboot:: Load multiboot compliant kernel * nativedisk:: Switch to native disk drivers * normal:: Enter normal mode * normal_exit:: Exit from normal mode * parttool:: Modify partition table entries * password:: Set a clear-text password * password_pbkdf2:: Set a hashed password * plainmount:: Open device encrypted in plain mode * play:: Play a tune * probe:: Retrieve device info * rdmsr:: Read values from model-specific registers * read:: Read user input * reboot:: Reboot your computer * regexp:: Test if regular expression matches string * rmmod:: Remove a module * save_env:: Save variables to environment block * search:: Search devices by file, label, or UUID * sendkey:: Emulate keystrokes * set:: Set an environment variable * sha1sum:: Compute or check SHA1 hash * sha256sum:: Compute or check SHA256 hash * sha512sum:: Compute or check SHA512 hash * sleep:: Wait for a specified number of seconds * smbios:: Retrieve SMBIOS information * source:: Read a configuration file in same context * test:: Check file types and compare values * tpm2_key_protector_init:: Initialize the TPM2 key protector * tpm2_key_protector_clear:: Clear the TPM2 key protector * tpm2_dump_pcr:: Dump TPM2 PCRs * true:: Do nothing, successfully * trust:: Add public key to list of trusted keys * unset:: Unset an environment variable * verify_detached:: Verify detached digital signature * videoinfo:: List available video modes * wrmsr:: Write values to model-specific registers  File: grub.info, Node: [, Next: acpi, Up: Command-line commands 17.4.1 [ -------- -- Command: [ expression ] Alias for 'test EXPRESSION' (*note test::).  File: grub.info, Node: acpi, Next: authenticate, Prev: [, Up: Command-line commands 17.4.2 acpi ----------- -- Command: acpi [-1|-2] [--exclude=table1,...|--load-only=table1,...] [--oemid=id] [--oemtable=table] [--oemtablerev=rev] [--oemtablecreator=creator] [--oemtablecreatorrev=rev] [--no-ebda] filename ... Modern BIOS systems normally implement the Advanced Configuration and Power Interface (ACPI), and define various tables that describe the interface between an ACPI-compliant operating system and the firmware. In some cases, the tables provided by default only work well with certain operating systems, and it may be necessary to replace some of them. Normally, this command will replace the Root System Description Pointer (RSDP) in the Extended BIOS Data Area to point to the new tables. If the '--no-ebda' option is used, the new tables will be known only to GRUB, but may be used by GRUB's EFI emulation. Note: The command is not allowed when lockdown is enforced (*note Lockdown::). Otherwise an attacker can instruct the GRUB to load an SSDT table to overwrite the kernel lockdown configuration and later load and execute unsigned code.  File: grub.info, Node: authenticate, Next: background_color, Prev: acpi, Up: Command-line commands 17.4.3 authenticate ------------------- -- Command: authenticate [userlist] Check whether user is in USERLIST or listed in the value of variable 'superusers'. See *note superusers:: for valid user list format. If 'superusers' is empty, this command returns true. *Note Security::.  File: grub.info, Node: background_color, Next: background_image, Prev: authenticate, Up: Command-line commands 17.4.4 background_color ----------------------- -- Command: background_color color Set background color for active terminal. For valid color specifications see *note Colors: Theme file format. Background color can be changed only when using 'gfxterm' for terminal output. This command sets color of empty areas without text. Text background color is controlled by environment variables COLOR_NORMAL, COLOR_HIGHLIGHT, MENU_COLOR_NORMAL, MENU_COLOR_HIGHLIGHT. *Note Special environment variables::.  File: grub.info, Node: background_image, Next: badram, Prev: background_color, Up: Command-line commands 17.4.5 background_image ----------------------- -- Command: background_image [[--mode stretch|normal] file] Load background image for active terminal from FILE. Image is stretched to fill up entire screen unless option '--mode' 'normal' is given. Without arguments remove currently loaded background image. Background image can be changed only when using 'gfxterm' for terminal output.  File: grub.info, Node: badram, Next: blocklist, Prev: background_image, Up: Command-line commands 17.4.6 badram ------------- -- Command: badram addr,mask[,addr,mask...] Filter out bad RAM. This command notifies the memory manager that specified regions of RAM ought to be filtered out (usually, because they're damaged). This remains in effect after a payload kernel has been loaded by GRUB, as long as the loaded kernel obtains its memory map from GRUB. Kernels that support this include Linux, GNU Mach, the kernel of FreeBSD and Multiboot kernels in general. Syntax is the same as provided by the Memtest86+ utility (http://www.memtest.org/): a list of address/mask pairs. Given a page-aligned address and a base address / mask pair, if all the bits of the page-aligned address that are enabled by the mask match with the base address, it means this page is to be filtered. This syntax makes it easy to represent patterns that are often result of memory damage, due to physical distribution of memory cells. The command is similar to 'cutmem' command. Note: The command is not allowed when lockdown is enforced (*note Lockdown::). This prevents removing EFI memory regions to potentially subvert the security mechanisms provided by the UEFI secure boot.  File: grub.info, Node: blocklist, Next: boot, Prev: badram, Up: Command-line commands 17.4.7 blocklist ---------------- -- Command: blocklist file Print a block list (*note Block list syntax::) for FILE.  File: grub.info, Node: boot, Next: cat, Prev: blocklist, Up: Command-line commands 17.4.8 boot ----------- -- Command: boot Boot the OS or chain-loader which has been loaded. Only necessary if running the fully interactive command-line (it is implicit at the end of a menu entry).  File: grub.info, Node: cat, Next: clear, Prev: boot, Up: Command-line commands 17.4.9 cat ---------- -- Command: cat [--dos] file Display the contents of the file FILE. This command may be useful to remind you of your OS's root partition: grub> cat /etc/fstab If the '--dos' option is used, then carriage return / new line pairs will be displayed as a simple new line. Otherwise, the carriage return will be displayed as a control character ('') to make it easier to see when boot problems are caused by a file formatted using DOS-style line endings. Note: 'cat' can be used to view the contents of devices using the block list syntax (*note Block list syntax::). However, it is not advised to view binary data because it will try to decode UTF-8 strings, which can lead to some bytes missing or added in the output. Instead, use the 'hexdump' command (*note hexdump::).  File: grub.info, Node: clear, Next: cmosclean, Prev: cat, Up: Command-line commands 17.4.10 clear ------------- -- Command: clear Clear the screen.  File: grub.info, Node: cmosclean, Next: cmosdump, Prev: clear, Up: Command-line commands 17.4.11 cmosclean ----------------- -- Command: cmosclean byte:bit Clear value of bit in CMOS at location BYTE:BIT. This command is available only on platforms that support CMOS.  File: grub.info, Node: cmosdump, Next: cmostest, Prev: cmosclean, Up: Command-line commands 17.4.12 cmosdump ---------------- -- Dump: CMOS contents Dump full CMOS contents as hexadecimal values. This command is available only on platforms that support CMOS.  File: grub.info, Node: cmostest, Next: cmp, Prev: cmosdump, Up: Command-line commands 17.4.13 cmostest ---------------- -- Command: cmostest byte:bit Test value of bit in CMOS at location BYTE:BIT. Exit status is zero if bit is set, non zero otherwise. This command is available only on platforms that support CMOS.  File: grub.info, Node: cmp, Next: configfile, Prev: cmostest, Up: Command-line commands 17.4.14 cmp ----------- -- Command: cmp [-v] file1 file2 Compare the file FILE1 with the file FILE2. If they are completely identical, '$?' will be set to 0. Otherwise, if the files are not identical, '$?' will be set to a nonzero value. By default nothing will be output. If the '-v' is used, verbose mode is enabled. In this mode when when the files differ in size, print the sizes like this: Differ in size: 0x1234 [foo], 0x4321 [bar] If the sizes are equal but the bytes at an offset differ, then print the bytes like this: Differ at the offset 777: 0xbe [foo], 0xef [bar]  File: grub.info, Node: configfile, Next: cpuid, Prev: cmp, Up: Command-line commands 17.4.15 configfile ------------------ -- Command: configfile file Load FILE as a configuration file. If FILE defines any menu entries, then show a menu containing them immediately. Any environment variable changes made by the commands in FILE will not be preserved after 'configfile' returns.  File: grub.info, Node: cpuid, Next: crc, Prev: configfile, Up: Command-line commands 17.4.16 cpuid ------------- -- Command: cpuid [-l] [-p] Check for CPU features. This command is only available on x86 systems. With the '-l' option, return true if the CPU supports long mode (64-bit). With the '-p' option, return true if the CPU supports Physical Address Extension (PAE). If invoked without options, this command currently behaves as if it had been invoked with '-l'. This may change in the future.  File: grub.info, Node: crc, Next: cryptocheck, Prev: cpuid, Up: Command-line commands 17.4.17 crc ----------- -- Command: crc arg ... Alias for 'hashsum --hash crc32 arg ...'. See command 'hashsum' (*note hashsum::) for full description.  File: grub.info, Node: cryptocheck, Next: cryptomount, Prev: crc, Up: Command-line commands 17.4.18 cryptocheck ------------------- -- Command: cryptocheck [ --quiet ] device Check if a given diskfilter device is backed by encrypted devices (*note cryptomount:: for additional information). The command examines all backing devices, physical volumes, of a specified logical volume, like LVM2, and fails when at least one of them is unencrypted. The option '--quiet' can be given to suppress the output.  File: grub.info, Node: cryptomount, Next: cutmem, Prev: cryptocheck, Up: Command-line commands 17.4.19 cryptomount ------------------- -- Command: cryptomount [ [-p password] | [-k keyfile [-O keyoffset] [-S keysize] ] | [-P protector] ] [-H file] device|-u uuid|-a|-b Setup access to encrypted device. A passphrase will be requested interactively, if neither the '-p' nor '-k' options are given. The option '-p' can be used to supply a passphrase (useful for scripts). Alternatively the '-k' option can be used to supply a keyfile with options '-O' and '-S' optionally supplying the offset and size, respectively, of the key data in the given key file. Besides the keyfile, the key can be stored in a key protector, and option '-P' configures specific key protector, e.g. tpm2, to retrieve the key from. The '-H' options can be used to supply cryptomount backends with an alternative header file (aka detached header). Not all backends have headers nor support alternative header files (currently only LUKS1 and LUKS2 support them). Argument DEVICE configures specific grub device (*note Naming convention::); option '-u' UUID configures device with specified UUID; option '-a' configures all detected encrypted devices; option '-b' configures all geli containers that have boot flag set. Devices are not allowed to be given as key files nor as detached header files. However, this limitation can be worked around by using blocklist syntax. So for instance, '(hd1,gpt2)' can not be used, but '(hd1,gpt2)0+' will achieve the desired result. GRUB supports devices encrypted using LUKS, LUKS2 and geli. Note that necessary modules (LUKS, LUKS2 and GELI) have to be loaded manually before this command can be used. For LUKS2 only the PBKDF2 key derivation function is supported, as Argon2 is not yet supported. Successfully decrypted disks are named as (cryptoX) and have increasing numeration suffix for each new decrypted disk. If the encrypted disk hosts some higher level of abstraction (like LVM2 or MDRAID) it will be created under a separate device namespace in addition to the cryptodisk namespace. Support for plain encryption mode (plain dm-crypt) is provided via separate '*note plainmount::' command. On the EFI platform, GRUB tries to erase master keys from memory when the cryptodisk module is unloaded or the command 'exit' is executed. All secrets remain in memory when the command 'chainloader' is issued, because execution can return to GRUB on the EFI platform.  File: grub.info, Node: cutmem, Next: date, Prev: cryptomount, Up: Command-line commands 17.4.20 cutmem -------------- -- Command: cutmem from[K|M|G] to[K|M|G] Remove any memory regions in specified range. This command notifies the memory manager that specified regions of RAM ought to be filtered out. This remains in effect after a payload kernel has been loaded by GRUB, as long as the loaded kernel obtains its memory map from GRUB. Kernels that support this include Linux, GNU Mach, the kernel of FreeBSD and Multiboot kernels in general. The command is similar to 'badram' command. Note: The command is not allowed when lockdown is enforced (*note Lockdown::). This prevents removing EFI memory regions to potentially subvert the security mechanisms provided by the UEFI secure boot.  File: grub.info, Node: date, Next: devicetree, Prev: cutmem, Up: Command-line commands 17.4.21 date ------------ -- Command: date [[year-]month-day] [hour:minute[:second]] With no arguments, print the current date and time. Otherwise, take the current date and time, change any elements specified as arguments, and set the result as the new date and time. For example, 'date 01-01' will set the current month and day to January 1, but leave the year, hour, minute, and second unchanged.  File: grub.info, Node: devicetree, Next: distrust, Prev: date, Up: Command-line commands 17.4.22 devicetree ------------------ -- Command: devicetree file Load a device tree blob (.dtb) from a filesystem, for later use by a Linux kernel. Does not perform merging with any device tree supplied by firmware, but rather replaces it completely. Note: The command is not allowed when lockdown is enforced (*note Lockdown::). This is done to prevent subverting various security mechanisms.  File: grub.info, Node: distrust, Next: drivemap, Prev: devicetree, Up: Command-line commands 17.4.23 distrust ---------------- -- Command: distrust pubkey_id Remove public key PUBKEY_ID from GRUB's keyring of trusted keys. PUBKEY_ID is the last four bytes (eight hexadecimal digits) of the GPG v4 key id, which is also the output of 'list_trusted' (*note list_trusted::). Outside of GRUB, the key id can be obtained using 'gpg --fingerprint'). These keys are used to validate signatures when environment variable 'check_signatures' is set to 'enforce' (*note check_signatures::), and by some invocations of 'verify_detached' (*note verify_detached::). *Note Using digital signatures::, for more information.  File: grub.info, Node: drivemap, Next: echo, Prev: distrust, Up: Command-line commands 17.4.24 drivemap ---------------- -- Command: drivemap -l|-r|[-s] from_drive to_drive Without options, map the drive FROM_DRIVE to the drive TO_DRIVE. This is necessary when you chain-load some operating systems, such as DOS, if such an OS resides at a non-first drive. For convenience, any partition suffix on the drive is ignored, so you can safely use ${root} as a drive specification. With the '-s' option, perform the reverse mapping as well, swapping the two drives. With the '-l' option, list the current mappings. With the '-r' option, reset all mappings to the default values. For example: drivemap -s (hd0) (hd1) NOTE: Only available on i386-pc.  File: grub.info, Node: echo, Next: efitextmode, Prev: drivemap, Up: Command-line commands 17.4.25 echo ------------ -- Command: echo [-n] [-e] string ... Display the requested text and, unless the '-n' option is used, a trailing new line. If there is more than one string, they are separated by spaces in the output. As usual in GRUB commands, variables may be substituted using '${var}'. The '-e' option enables interpretation of backslash escapes. The following sequences are recognised: '\\' backslash '\a' alert (BEL) '\c' suppress trailing new line '\f' form feed '\n' new line '\r' carriage return '\t' horizontal tab '\v' vertical tab When interpreting backslash escapes, backslash followed by any other character will print that character.  File: grub.info, Node: efitextmode, Next: eval, Prev: echo, Up: Command-line commands 17.4.26 efitextmode ------------------- -- Command: efitextmode [min | max | | ] When used with no arguments displays all available text output modes. The set mode determines the columns and rows of the text display when in text mode. An asterisk, '*', will be at the end of the line of the currently set mode. If given a single parameter, it must be 'min', 'max', or a mode number given by the listing when run with no arguments. These arguments set the mode to the minimum, maximum, and particular mode respectively. Otherwise, the command must be given two numerical arguments specifying the columns and rows of the desired mode. Specifying a columns and rows combination that corresponds to no supported mode, will return error, but otherwise have no effect. By default GRUB will start in whatever mode the EFI firmware defaults to. There are firmwares known to set up the default mode such that output behaves strangely, for example the cursor in the GRUB shell never reaches the bottom of the screen or, when typing characters at the prompt, characters from previous command output are overwritten. Setting the mode may fix this. The EFI specification says that mode 0 must be available and have columns and rows of 80 and 25 respectively. Mode 1 may be defined and if so must have columns and rows of 80 and 50 respectively. Any other modes may have columns and rows arbitrarily defined by the firmware. This means that a mode with columns and rows of 100 and 31 on one firmware may be a different mode number on a different firmware or not exist at all. Likewise, mode number 2 on one firmware may have a different number of columns and rows than mode 2 on a different firmware. So one should not rely on a particular mode number or a mode of a certain number of columns and rows existing on all firmwares, except for mode 0. Note: This command is only available on EFI platforms and is similar to EFI shell "mode" command.  File: grub.info, Node: eval, Next: export, Prev: efitextmode, Up: Command-line commands 17.4.27 eval ------------ -- Command: eval string ... Concatenate arguments together using single space as separator and evaluate result as sequence of GRUB commands.  File: grub.info, Node: export, Next: false, Prev: eval, Up: Command-line commands 17.4.28 export -------------- -- Command: export envvar Export the environment variable ENVVAR. Exported variables are visible to subsidiary configuration files loaded using 'configfile'.  File: grub.info, Node: false, Next: fdtdump, Prev: export, Up: Command-line commands 17.4.29 false ------------- -- Command: false Do nothing, unsuccessfully. This is mainly useful in control constructs such as 'if' and 'while' (*note Shell-like scripting::).  File: grub.info, Node: fdtdump, Next: file, Prev: false, Up: Command-line commands 17.4.30 fdtdump --------------- -- Command: fdtdump [--prop PROP] [--set VARIABLE] Retrieve device tree information. The 'fdtdump' command returns the value of a property in the device tree provided by the firmware. The '--prop' option determines which property to select. The default action is to print the value of the requested field to the console, but a variable name can be specified with '--set' to store the value instead of printing it. For example, this will store and then display the model string. fdtdump --prop model --set machine_model echo $machine_model  File: grub.info, Node: file, Next: fwsetup, Prev: fdtdump, Up: Command-line commands 17.4.31 file ------------ -- Command: file is_file_type filename The 'file' command tests whether the provided FILENAME is the type provided by IS_FILE_TYPE. When the 'file' is of type IS_FILE_TYPE this command will return 0, otherwise it will return non-zero (no output is provided to the terminal). IS_FILE_TYPE may be one of the following options: * '--is-i386-xen-pae-domu' Check if FILENAME can be booted as i386 PAE Xen unprivileged guest kernel * '--is-x86_64-xen-domu' Check if FILENAME can be booted as x86_64 Xen unprivileged guest kernel * '--is-x86-xen-dom0' Check if FILENAME can be used as Xen x86 privileged guest kernel * '--is-x86-multiboot' Check if FILENAME can be used as x86 multiboot kernel * '--is-x86-multiboot2' Check if FILENAME can be used as x86 multiboot2 kernel * '--is-arm-linux' Check if FILENAME is ARM Linux * '--is-arm64-linux' Check if FILENAME is ARM64 Linux * '--is-ia64-linux' Check if FILENAME is IA64 Linux * '--is-mips-linux' Check if FILENAME is MIPS Linux * '--is-mipsel-linux' Check if FILENAME is MIPSEL Linux * '--is-sparc64-linux' Check if FILENAME is SPARC64 Linux * '--is-powerpc-linux' Check if FILENAME is POWERPC Linux * '--is-x86-linux' Check if FILENAME is x86 Linux * '--is-x86-linux32' Check if FILENAME is x86 Linux supporting 32-bit protocol * '--is-x86-kfreebsd' Check if FILENAME is x86 kFreeBSD * '--is-i386-kfreebsd' Check if FILENAME is i386 kFreeBSD * '--is-x86_64-kfreebsd' Check if FILENAME is x86_64 kFreeBSD * '--is-x86-knetbsd' Check if FILENAME is x86 kNetBSD * '--is-i386-knetbsd' Check if FILENAME is i386 kNetBSD * '--is-x86_64-knetbsd' Check if FILENAME is x86_64 kNetBSD * '--is-i386-efi' Check if FILENAME is i386 EFI file * '--is-x86_64-efi' Check if FILENAME is x86_64 EFI file * '--is-ia64-efi' Check if FILENAME is IA64 EFI file * '--is-arm64-efi' Check if FILENAME is ARM64 EFI file * '--is-arm-efi' Check if FILENAME is ARM EFI file * '--is-riscv32-efi' Check if FILENAME is RISC-V 32bit EFI file * '--is-riscv64-efi' Check if FILENAME is RISC-V 64bit EFI file * '--is-hibernated-hiberfil' Check if FILENAME is hiberfil.sys in hibernated state * '--is-x86_64-xnu' Check if FILENAME is x86_64 XNU (Mac OS X kernel) * '--is-i386-xnu' Check if FILENAME is i386 XNU (Mac OS X kernel) * '--is-xnu-hibr' Check if FILENAME is XNU (Mac OS X kernel) hibernated image * '--is-x86-bios-bootsector' Check if FILENAME is BIOS bootsector grub-2.14~git20250718.0e36779/docs/grub.texi0000644000175000017500000140125115036447510014571 00000000000000\input texinfo @c -*-texinfo-*- @c %**start of header @setfilename grub.info @include version.texi @settitle GNU GRUB Manual @value{VERSION} @c Unify all our little indices for now. @syncodeindex fn cp @syncodeindex vr cp @syncodeindex ky cp @syncodeindex pg cp @syncodeindex tp cp @c %**end of header @footnotestyle separate @paragraphindent 3 @finalout @copying This manual is for GNU GRUB (version @value{VERSION}, @value{UPDATED}). Copyright @copyright{} 1999,2000,2001,2002,2004,2006,2008,2009,2010,2011,2012,2013 Free Software Foundation, Inc. @quotation Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections. @end quotation @end copying @dircategory Kernel @direntry * GRUB: (grub). The GRand Unified Bootloader * grub-install: (grub)Invoking grub-install. Install GRUB on your drive * grub-mkconfig: (grub)Invoking grub-mkconfig. Generate GRUB configuration * grub-mkpasswd-pbkdf2: (grub)Invoking grub-mkpasswd-pbkdf2. * grub-mkrelpath: (grub)Invoking grub-mkrelpath. * grub-mkrescue: (grub)Invoking grub-mkrescue. Make a GRUB rescue image * grub-mount: (grub)Invoking grub-mount. Mount a file system using GRUB * grub-probe: (grub)Invoking grub-probe. Probe device information * grub-script-check: (grub)Invoking grub-script-check. @end direntry @setchapternewpage odd @titlepage @sp 10 @title the GNU GRUB manual @subtitle The GRand Unified Bootloader, version @value{VERSION}, @value{UPDATED}. @author Gordon Matzigkeit @author Yoshinori K. Okuji @author Colin Watson @author Colin D. Bennett @c The following two commands start the copyright page. @page @vskip 0pt plus 1filll @insertcopying @end titlepage @c Output the table of contents at the beginning. @contents @finalout @headings double @ifnottex @node Top @top GNU GRUB manual This is the documentation of GNU GRUB, the GRand Unified Bootloader, a flexible and powerful boot loader program for a wide range of architectures. This edition documents version @value{VERSION}. @insertcopying @end ifnottex @menu * Introduction:: Capturing the spirit of GRUB * Naming convention:: Names of your drives in GRUB * OS-specific notes about grub tools:: Some notes about OS-specific behaviour of GRUB tools * Installation:: Installing GRUB on your drive * Booting:: How to boot different operating systems * Configuration:: Writing your own configuration file * Theme file format:: Format of GRUB theme files * Network:: Downloading OS images from a network * Serial terminal:: Using GRUB via a serial line * Vendor power-on keys:: Changing GRUB behaviour on vendor power-on keys * Images:: GRUB image files * Core image size limitation:: GRUB image files size limitations * Filesystem:: Filesystem syntax and semantics * Interface:: The menu and the command-line * Environment:: GRUB environment variables * Modules:: Available modules * Commands:: Available builtin commands * Internationalisation:: Topics relating to language support * Security:: Authentication, authorisation, and signatures * Platform limitations:: Platform-specific limitations * Platform-specific operations:: Platform-specific operations * Supported kernels:: Supported kernels * Troubleshooting:: Error messages produced by GRUB * User-space utilities:: Usage of user-space utilities * Obtaining and Building GRUB:: How to obtain and build GRUB * Reporting bugs:: Where you should send a bug report * Future:: Some future plans on GRUB * Copying This Manual:: Copying This Manual * Index:: @end menu @node Introduction @chapter Introduction to GRUB @menu * Overview:: What exactly GRUB is and how to use it * History:: From maggot to house fly * Changes from GRUB Legacy:: Differences from previous versions * Features:: GRUB features * Role of a boot loader:: The role of a boot loader @end menu @node Overview @section Overview Briefly, a @dfn{boot loader} is the first software program that runs when a computer starts. It is responsible for loading and transferring control to an operating system @dfn{kernel} software (such as Linux or GNU Mach). The kernel, in turn, initializes the rest of the operating system (e.g. a GNU system). GNU GRUB is a very powerful boot loader, which can load a wide variety of free operating systems, as well as proprietary operating systems with chain-loading@footnote{@dfn{chain-load} is the mechanism for loading unsupported operating systems by loading another boot loader. It is typically used for loading DOS or Windows.}. GRUB is designed to address the complexity of booting a personal computer; both the program and this manual are tightly bound to that computer platform, although porting to other platforms may be addressed in the future. One of the important features in GRUB is flexibility; GRUB understands filesystems and kernel executable formats, so you can load an arbitrary operating system the way you like, without recording the physical position of your kernel on the disk. Thus you can load the kernel just by specifying its file name and the drive and partition where the kernel resides. When booting with GRUB, you can use either a command-line interface (@pxref{Command-line interface}), or a menu interface (@pxref{Menu interface}). Using the command-line interface, you type the drive specification and file name of the kernel manually. In the menu interface, you just select an OS using the arrow keys. The menu is based on a configuration file which you prepare beforehand (@pxref{Configuration}). While in the menu, you can switch to the command-line mode, and vice-versa. You can even edit menu entries before using them. In the following chapters, you will learn how to specify a drive, a partition, and a file name (@pxref{Naming convention}) to GRUB, how to install GRUB on your drive (@pxref{Installation}), and how to boot your OSes (@pxref{Booting}), step by step. @node History @section History of GRUB GRUB originated in 1995 when Erich Boleyn was trying to boot the GNU Hurd with the University of Utah's Mach 4 microkernel (now known as GNU Mach). Erich and Brian Ford designed the Multiboot Specification (@pxref{Top, Multiboot Specification, Motivation, multiboot, The Multiboot Specification}), because they were determined not to add to the large number of mutually-incompatible PC boot methods. Erich then began modifying the FreeBSD boot loader so that it would understand Multiboot. He soon realized that it would be a lot easier to write his own boot loader from scratch than to keep working on the FreeBSD boot loader, and so GRUB was born. Erich added many features to GRUB, but other priorities prevented him from keeping up with the demands of its quickly-expanding user base. In 1999, Gordon Matzigkeit and Yoshinori K. Okuji adopted GRUB as an official GNU package, and opened its development by making the latest sources available via anonymous CVS. @xref{Obtaining and Building GRUB}, for more information. Over the next few years, GRUB was extended to meet many needs, but it quickly became clear that its design was not keeping up with the extensions being made to it, and we reached the point where it was very difficult to make any further changes without breaking existing features. Around 2002, Yoshinori K. Okuji started work on PUPA (Preliminary Universal Programming Architecture for GNU GRUB), aiming to rewrite the core of GRUB to make it cleaner, safer, more robust, and more powerful. PUPA was eventually renamed to GRUB 2, and the original version of GRUB was renamed to GRUB Legacy. Small amounts of maintenance continued to be done on GRUB Legacy, but the last release (0.97) was made in 2005 and at the time of writing it seems unlikely that there will be another. By around 2007, GNU/Linux distributions started to use GRUB 2 to limited extents, and by the end of 2009 multiple major distributions were installing it by default. @node Changes from GRUB Legacy @section Differences from previous versions GRUB 2 is a rewrite of GRUB (@pxref{History}), although it shares many characteristics with the previous version, now known as GRUB Legacy. Users of GRUB Legacy may need some guidance to find their way around this new version. @itemize @bullet @item The configuration file has a new name (@file{grub.cfg} rather than @file{menu.lst} or @file{grub.conf}), new syntax (@pxref{Configuration}) and many new commands (@pxref{Commands}). Configuration cannot be copied over directly, although most GRUB Legacy users should not find the syntax too surprising. @item @file{grub.cfg} is typically automatically generated by @command{grub-mkconfig} (@pxref{Simple configuration}). This makes it easier to handle versioned kernel upgrades. @item Partition numbers in GRUB device names now start at 1, not 0 (@pxref{Naming convention}). @item The configuration file is now written in something closer to a full scripting language: variables, conditionals, and loops are available. @item A small amount of persistent storage is available across reboots, using the @command{save_env} and @command{load_env} commands in GRUB and the @command{grub-editenv} utility. This is not available in all configurations (@pxref{Environment block}). @item GRUB 2 has more reliable ways to find its own files and those of target kernels on multiple-disk systems, and has commands (@pxref{search}) to find devices using file system labels or Universally Unique Identifiers (UUIDs). @item GRUB 2 is available for several other types of system in addition to the PC BIOS systems supported by GRUB Legacy: PC EFI, PC coreboot, PowerPC, SPARC, and MIPS Lemote Yeeloong are all supported. @item Many more file systems are supported, including but not limited to ext4, HFS+, and NTFS. @item GRUB 2 can read files directly from LVM and RAID devices. @item A graphical terminal and a graphical menu system are available. @item GRUB 2's interface can be translated, including menu entry names. @item The image files (@pxref{Images}) that make up GRUB have been reorganised; Stage 1, Stage 1.5, and Stage 2 are no more. @item GRUB 2 puts many facilities in dynamically loaded modules, allowing the core image to be smaller, and allowing the core image to be built in more flexible ways. @end itemize @node Features @section GRUB features The primary requirement for GRUB is that it be compliant with the @dfn{Multiboot Specification}, which is described in @ref{Top, Multiboot Specification, Motivation, multiboot, The Multiboot Specification}. The other goals, listed in approximate order of importance, are: @itemize @bullet{} @item Basic functions must be straightforward for end-users. @item Rich functionality to support kernel experts and designers. @item Backward compatibility for booting FreeBSD, NetBSD, OpenBSD, and Linux. Proprietary kernels (such as DOS, Windows NT, and OS/2) are supported via a chain-loading function. @end itemize Except for specific compatibility modes (chain-loading and the Linux @dfn{piggyback} format), all kernels will be started in much the same state as in the Multiboot Specification. Only kernels loaded at 1 megabyte or above are presently supported. Any attempt to load below that boundary will simply result in immediate failure and an error message reporting the problem. In addition to the requirements above, GRUB has the following features (note that the Multiboot Specification doesn't require all the features that GRUB supports): @table @asis @item Recognize multiple executable formats Support many of the @dfn{a.out} variants plus @dfn{ELF}. Symbol tables are also loaded. @item Support non-Multiboot kernels Support many of the various free 32-bit kernels that lack Multiboot compliance (primarily FreeBSD, NetBSD@footnote{The NetBSD/i386 kernel is Multiboot-compliant, but lacks support for Multiboot modules.}, OpenBSD, and Linux). Chain-loading of other boot loaders is also supported. @item Load multiples modules Fully support the Multiboot feature of loading multiple modules. @item Load a configuration file Support a human-readable text configuration file with preset boot commands. You can also load another configuration file dynamically and embed a preset configuration file in a GRUB image file. The list of commands (@pxref{Commands}) are a superset of those supported on the command-line. An example configuration file is provided in @ref{Configuration}. @item Provide a menu interface A menu interface listing preset boot commands, with a programmable timeout, is available. There is no fixed limit on the number of boot entries, and the current implementation has space for several hundred. @item Have a flexible command-line interface A fairly flexible command-line interface, accessible from the menu, is available to edit any preset commands, or write a new boot command set from scratch. If no configuration file is present, GRUB drops to the command-line. The list of commands (@pxref{Commands}) are a subset of those supported for configuration files. Editing commands closely resembles the Bash command-line (@pxref{Command Line Editing, Bash, Command Line Editing, features, Bash Features}), with @key{TAB}-completion of commands, devices, partitions, and files in a directory depending on context. @item Support multiple filesystem types Support multiple filesystem types transparently, plus a useful explicit blocklist notation. The currently supported filesystem types are @dfn{Amiga Fast FileSystem (AFFS)}, @dfn{AtheOS fs}, @dfn{BeFS}, @dfn{BtrFS} (including raid0, raid1, raid10, gzip and lzo), @dfn{cpio} (little- and big-endian bin, odc and newc variants), @dfn{EROFS} (only uncompressed support for now), @dfn{Linux ext2/ext3/ext4}, @dfn{DOS FAT12/FAT16/FAT32}, @dfn{exFAT}, @dfn{F2FS}, @dfn{HFS}, @dfn{HFS+}, @dfn{ISO9660} (including Joliet, Rock-ridge and multi-chunk files), @dfn{JFS}, @dfn{Minix fs} (versions 1, 2 and 3), @dfn{nilfs2}, @dfn{NTFS} (including compression), @dfn{ReiserFS}, @dfn{ROMFS}, @dfn{Amiga Smart FileSystem (SFS)}, @dfn{Squash4}, @dfn{tar}, @dfn{UDF}, @dfn{BSD UFS/UFS2}, @dfn{XFS}, and @dfn{ZFS} (including lzjb, gzip, zle, mirror, stripe, raidz1/2/3 and encryption in AES-CCM and AES-GCM). @xref{Filesystem}, for more information. Note: Only a subset of filesystems are supported in lockdown mode (such as when secure boot is enabled, @pxref{Lockdown} for more information). @item Support automatic decompression Can decompress files which were compressed by @command{gzip} or @command{xz}@footnote{Only CRC32 data integrity check is supported (xz default is CRC64 so one should use --check=crc32 option). LZMA BCJ filters are supported.}. This function is both automatic and transparent to the user (i.e. all functions operate upon the uncompressed contents of the specified files). This greatly reduces a file size and loading time, a particularly great benefit for floppies.@footnote{There are a few pathological cases where loading a very badly organized ELF kernel might take longer, but in practice this never happen.} It is conceivable that some kernel modules should be loaded in a compressed state, so a different module-loading command can be specified to avoid uncompressing the modules. @item Access data on any installed device Support reading data from any or all floppies or hard disk(s) recognized by the BIOS, independent of the setting of the root device. @item Be independent of drive geometry translations Unlike many other boot loaders, GRUB makes the particular drive translation irrelevant. A drive installed and running with one translation may be converted to another translation without any adverse effects or changes in GRUB's configuration. @item Detect all installed @sc{ram} GRUB can generally find all the installed @sc{ram} on a PC-compatible machine. It uses an advanced BIOS query technique for finding all memory regions. As described on the Multiboot Specification (@pxref{Top, Multiboot Specification, Motivation, multiboot, The Multiboot Specification}), not all kernels make use of this information, but GRUB provides it for those who do. @item Support Logical Block Address mode In traditional disk calls (called @dfn{CHS mode}), there is a geometry translation problem, that is, the BIOS cannot access over 1024 cylinders, so the accessible space is limited to at least 508 MB and to at most 8GB. GRUB can't universally solve this problem, as there is no standard interface used in all machines. However, several newer machines have the new interface, Logical Block Address (@dfn{LBA}) mode. GRUB automatically detects if LBA mode is available and uses it if available. In LBA mode, GRUB can access the entire disk. @item Support network booting GRUB is basically a disk-based boot loader but also has network support. You can load OS images from a network by using the @dfn{TFTP} protocol. @item Support remote terminals To support computers with no console, GRUB provides remote terminal support, so that you can control GRUB from a remote host. Only serial terminal support is implemented at the moment. @end table @node Role of a boot loader @section The role of a boot loader The following is a quotation from Gordon Matzigkeit, a GRUB fanatic: @quotation Some people like to acknowledge both the operating system and kernel when they talk about their computers, so they might say they use ``GNU/Linux'' or ``GNU/Hurd''. Other people seem to think that the kernel is the most important part of the system, so they like to call their GNU operating systems ``Linux systems.'' I, personally, believe that this is a grave injustice, because the @emph{boot loader} is the most important software of all. I used to refer to the above systems as either ``LILO''@footnote{The LInux LOader, a boot loader that everybody uses, but nobody likes.} or ``GRUB'' systems. Unfortunately, nobody ever understood what I was talking about; now I just use the word ``GNU'' as a pseudonym for GRUB. So, if you ever hear people talking about their alleged ``GNU'' systems, remember that they are actually paying homage to the best boot loader around@dots{} GRUB! @end quotation We, the GRUB maintainers, do not (usually) encourage Gordon's level of fanaticism, but it helps to remember that boot loaders deserve recognition. We hope that you enjoy using GNU GRUB as much as we did writing it. @node Naming convention @chapter Naming convention The device syntax used in GRUB is a wee bit different from what you may have seen before in your operating system(s), and you need to know it so that you can specify a drive/partition. Look at the following examples and explanations: @example (fd0) @end example First of all, GRUB requires that the device name be enclosed with @samp{(} and @samp{)}. The @samp{fd} part means that it is a floppy disk. The number @samp{0} is the drive number, which is counted from @emph{zero}. This expression means that GRUB will use the whole floppy disk. @example (hd0,msdos2) @end example Here, @samp{hd} means it is a hard disk drive. The first integer @samp{0} indicates the drive number, that is, the first hard disk, the string @samp{msdos} indicates the partition scheme, while the second integer, @samp{2}, indicates the partition number (or the @sc{pc} slice number in the BSD terminology). The partition numbers are counted from @emph{one}, not from zero (as was the case in previous versions of GRUB). This expression means the second partition of the first hard disk drive. In this case, GRUB uses one partition of the disk, instead of the whole disk. @example (hd0,msdos5) @end example This specifies the first @dfn{extended partition} of the first hard disk drive. Note that the partition numbers for extended partitions are counted from @samp{5}, regardless of the actual number of primary partitions on your hard disk. @example (hd1,msdos1,bsd1) @end example This means the BSD @samp{a} partition on first @sc{pc} slice number of the second hard disk. Of course, to actually access the disks or partitions with GRUB, you need to use the device specification in a command, like @samp{set root=(fd0)} or @samp{parttool (hd0,msdos3) hidden-}. To help you find out which number specifies a partition you want, the GRUB command-line (@pxref{Command-line interface}) options have argument completion. This means that, for example, you only need to type @example set root=( @end example followed by a @key{TAB}, and GRUB will display the list of drives, partitions, or file names. So it should be quite easy to determine the name of your target partition, even with minimal knowledge of the syntax. Note that GRUB does @emph{not} distinguish IDE from SCSI - it simply counts the drive numbers from zero, regardless of their type. Normally, any IDE drive number is less than any SCSI drive number, although that is not true if you change the boot sequence by swapping IDE and SCSI drives in your BIOS. Now the question is, how to specify a file? Again, consider an example: @example (hd0,msdos1)/vmlinuz @end example This specifies the file named @samp{vmlinuz}, found on the first partition of the first hard disk drive. Note that the argument completion works with file names, too. That was easy, admit it. Now read the next chapter, to find out how to actually install GRUB on your drive. @node OS-specific notes about grub tools @chapter OS-specific notes about grub tools On OS which have device nodes similar to Unix-like OS GRUB tools use the OS name. E.g. for GNU/Linux: @example # @kbd{grub-install /dev/sda} @end example On AROS we use another syntax. For volumes: @example //: @end example E.g. @example //:DH0 @end example For disks we use syntax: @example //:/unit/flags @end example E.g. @example # @kbd{grub-install //:ata.device/0/0} @end example On Windows we use UNC path. For volumes it's typically @example \\?\Volume@{@} \\?\: @end example E.g. @example \\?\Volume@{17f34d50-cf64-4b02-800e-51d79c3aa2ff@} \\?\C: @end example For disks it's @example \\?\PhysicalDrive @end example E.g. @example # @kbd{grub-install \\?\PhysicalDrive0} @end example Beware that you may need to further escape the backslashes depending on your shell. When compiled with cygwin support then cygwin drive names are automatically when needed. E.g. @example # @kbd{grub-install /dev/sda} @end example @node Installation @chapter Installation In order to install GRUB as your boot loader, you need to first install the GRUB system and utilities under your UNIX-like operating system (@pxref{Obtaining and Building GRUB}). You can do this either from the source tarball, or as a package for your OS. After you have done that, you need to install the boot loader on a drive (floppy or hard disk) by using the utility @command{grub-install} (@pxref{Invoking grub-install}) on a UNIX-like OS. GRUB comes with boot images, which are normally put in the directory @file{/usr/lib/grub/-} (for BIOS-based machines @file{/usr/lib/grub/i386-pc}). Hereafter, the directory where GRUB images are initially placed (normally @file{/usr/lib/grub/-}) will be called the @dfn{image directory}, and the directory where the boot loader needs to find them (usually @file{/boot}) will be called the @dfn{boot directory}. @menu * Installing GRUB using grub-install:: * Making a GRUB bootable CD-ROM:: * Device map:: * BIOS installation:: @end menu @node Installing GRUB using grub-install @section Installing GRUB using grub-install For information on where GRUB should be installed on PC BIOS platforms, @pxref{BIOS installation}. In order to install GRUB under a UNIX-like OS (such as @sc{gnu}), invoke the program @command{grub-install} (@pxref{Invoking grub-install}) as the superuser (@dfn{root}). The usage is basically very simple. You only need to specify one argument to the program, namely, where to install the boot loader. The argument has to be either a device file (like @samp{/dev/hda}). For example, under Linux the following will install GRUB into the MBR of the first IDE disk: @example # @kbd{grub-install /dev/sda} @end example Likewise, under GNU/Hurd, this has the same effect: @example # @kbd{grub-install /dev/hd0} @end example But all the above examples assume that GRUB should put images under the @file{/boot} directory. If you want GRUB to put images under a directory other than @file{/boot}, you need to specify the option @option{--boot-directory}. The typical usage is that you create a GRUB boot floppy with a filesystem. Here is an example: @example @group # @kbd{mke2fs /dev/fd0} # @kbd{mount -t ext2 /dev/fd0 /mnt} # @kbd{mkdir /mnt/boot} # @kbd{grub-install --boot-directory=/mnt/boot /dev/fd0} # @kbd{umount /mnt} @end group @end example Some BIOSes have a bug of exposing the first partition of a USB drive as a floppy instead of exposing the USB drive as a hard disk (they call it ``USB-FDD'' boot). In such cases, you need to install like this: @example # @kbd{losetup /dev/loop0 /dev/sdb1} # @kbd{mount /dev/loop0 /mnt/usb} # @kbd{grub-install --boot-directory=/mnt/usb/bugbios --force --allow-floppy /dev/loop0} @end example This install doesn't conflict with standard install as long as they are in separate directories. On EFI systems for fixed disk install you have to mount EFI System Partition. If you mount it at @file{/boot/efi} then you don't need any special arguments: @example # @kbd{grub-install} @end example Otherwise you need to specify where your EFI System partition is mounted: @example # @kbd{grub-install --efi-directory=/mnt/efi} @end example For removable installs you have to use @option{--removable} and specify both @option{--boot-directory} and @option{--efi-directory}: @example # @kbd{grub-install --efi-directory=/mnt/usb --boot-directory=/mnt/usb/boot --removable} @end example @node Making a GRUB bootable CD-ROM @section Making a GRUB bootable CD-ROM GRUB supports the @dfn{no emulation mode} in the El Torito specification@footnote{El Torito is a specification for bootable CD using BIOS functions.}. This means that you can use the whole CD-ROM from GRUB and you don't have to make a floppy or hard disk image file, which can cause compatibility problems. For booting from a CD-ROM, GRUB uses a special image called @file{cdboot.img}, which is concatenated with @file{core.img}. The @file{core.img} used for this should be built with at least the @samp{iso9660} and @samp{biosdisk} modules. Your bootable CD-ROM will usually also need to include a configuration file @file{grub.cfg} and some other GRUB modules. To make a simple generic GRUB rescue CD, you can use the @command{grub-mkrescue} program (@pxref{Invoking grub-mkrescue}): @example $ @kbd{grub-mkrescue -o grub.iso} @end example You will often need to include other files in your image. To do this, first make a top directory for the bootable image, say, @samp{iso}: @example $ @kbd{mkdir iso} @end example Make a directory for GRUB: @example $ @kbd{mkdir -p iso/boot/grub} @end example If desired, make the config file @file{grub.cfg} under @file{iso/boot/grub} (@pxref{Configuration}), and copy any files and directories for the disc to the directory @file{iso/}. Finally, make the image: @example $ @kbd{grub-mkrescue -o grub.iso iso} @end example This produces a file named @file{grub.iso}, which then can be burned into a CD (or a DVD), or written to a USB mass storage device. The root device will be set up appropriately on entering your @file{grub.cfg} configuration file, so you can refer to file names on the CD without needing to use an explicit device name. This makes it easier to produce rescue images that will work on both optical drives and USB mass storage devices. @node Device map @section The map between BIOS drives and OS devices If the device map file exists, the GRUB utilities (@command{grub-probe}, etc.) read it to map BIOS drives to OS devices. This file consists of lines like this: @example (@var{device}) @var{file} @end example @var{device} is a drive specified in the GRUB syntax (@pxref{Device syntax}), and @var{file} is an OS file, which is normally a device file. Historically, the device map file was used because GRUB device names had to be used in the configuration file, and they were derived from BIOS drive numbers. The map between BIOS drives and OS devices cannot always be guessed correctly: for example, GRUB will get the order wrong if you exchange the boot sequence between IDE and SCSI in your BIOS. Unfortunately, even OS device names are not always stable. Modern versions of the Linux kernel may probe drives in a different order from boot to boot, and the prefix (@file{/dev/hd*} versus @file{/dev/sd*}) may change depending on the driver subsystem in use. As a result, the device map file required frequent editing on some systems. GRUB avoids this problem nowadays by using UUIDs or file system labels when generating @file{grub.cfg}, and we advise that you do the same for any custom menu entries you write. If the device map file does not exist, then the GRUB utilities will assume a temporary device map on the fly. This is often good enough, particularly in the common case of single-disk systems. However, the device map file is not entirely obsolete yet, and it is used for overriding when current environment is different from the one on boot. Most common case is if you use a partition or logical volume as a disk for virtual machine. You can put any comments in the file if needed, as the GRUB utilities assume that a line is just a comment if the first character is @samp{#}. @node BIOS installation @section BIOS installation @heading MBR The partition table format traditionally used on PC BIOS platforms is called the Master Boot Record (MBR) format; this is the format that allows up to four primary partitions and additional logical partitions. With this partition table format, there are two ways to install GRUB: it can be embedded in the area between the MBR and the first partition (called by various names, such as the "boot track", "MBR gap", or "embedding area", and which is usually at least 1000 KiB), or the core image can be installed in a file system and a list of the blocks that make it up can be stored in the first sector of that partition. Modern tools usually leave MBR gap of at least 1023 KiB. This amount is sufficient to cover most configurations. Hence this value is recommended by the GRUB team. Historically many tools left only 31 KiB of space. This is not enough to parse reliably difficult structures like Btrfs, ZFS, RAID or LVM, or to use difficult disk access methods like ahci. Hence GRUB will warn if attempted to install into small MBR gap except in a small number of configurations that were grandfathered. The grandfathered config must: @itemize @bullet @item use biosdisk as disk access module for @file{/boot} @item not use any additional partition maps to access @file{/boot} @item @file{/boot} must be on one of following filesystems: AFFS, AFS, BFS, cpio, newc, odc, ext2/3/4, FAT, exFAT, F2FS, HFS, uncompressed HFS+, ISO9660, JFS, Minix, Minix2, Minix3, NILFS2, NTFS, ReiserFS, ROMFS, SFS, tar, UDF, UFS1, UFS2, XFS @end itemize Note: Only a subset of filesystems are supported in lockdown mode (such as when secure boot is enabled, @pxref{Lockdown} for more information). MBR gap has few technical problems. There is no way to reserve space in the embedding area with complete safety, and some proprietary software is known to use it to make it difficult for users to work around licensing restrictions. GRUB works around it by detecting sectors by other software and avoiding them and protecting its own sectors using Reed-Solomon encoding. GRUB team recommends having MBR gap of at least 1000 KiB. Should it not be possible, GRUB has support for a fallback solution which is heavily recommended against. Installing to a filesystem means that GRUB is vulnerable to its blocks being moved around by filesystem features such as tail packing, or even by aggressive fsck implementations, so this approach is quite fragile; and this approach can only be used if the @file{/boot} filesystem is on the same disk that the BIOS boots from, so that GRUB does not have to rely on guessing BIOS drive numbers. The GRUB development team generally recommends embedding GRUB before the first partition, unless you have special requirements. You must ensure that the first partition starts at least 1000 KiB (2000 sectors) from the start of the disk; on modern disks, it is often a performance advantage to align partitions on larger boundaries anyway, so the first partition might start 1 MiB from the start of the disk. @heading GPT Some newer systems use the GUID Partition Table (GPT) format. This was specified as part of the Extensible Firmware Interface (EFI), but it can also be used on BIOS platforms if system software supports it; for example, GRUB and GNU/Linux can be used in this configuration. With this format, it is possible to reserve a whole partition for GRUB, called the BIOS Boot Partition. GRUB can then be embedded into that partition without the risk of being overwritten by other software and without being contained in a filesystem which might move its blocks around. When creating a BIOS Boot Partition on a GPT system, you should make sure that it is at least 31 KiB in size. (GPT-formatted disks are not usually particularly small, so we recommend that you make it larger than the bare minimum, such as 1 MiB, to allow plenty of room for growth.) You must also make sure that it has the proper partition type. Using GNU Parted, you can set this using a command such as the following: @example # @kbd{parted /dev/@var{disk} set @var{partition-number} bios_grub on} @end example If you are using gdisk, set the partition type to @samp{0xEF02}. With partitioning programs that require setting the GUID directly, it should be @samp{21686148-6449-6e6f-744e656564454649}. @strong{Caution:} Be very careful which partition you select! When GRUB finds a BIOS Boot Partition during installation, it will automatically overwrite part of it. Make sure that the partition does not contain any other data. @node Booting @chapter Booting GRUB can load Multiboot-compliant kernels in a consistent way, but for some free operating systems you need to use some OS-specific magic. @menu * General boot methods:: How to boot OSes with GRUB generally * Loopback booting:: Notes on booting from loopbacks * LVM cache booting:: Notes on booting from LVM cache logical volume * OS-specific notes:: Notes on some operating systems @end menu @node General boot methods @section How to boot operating systems GRUB has three distinct boot methods: loading an operating system directly, using kexec from userspace, and chainloading another bootloader. Generally speaking, the first two are more desirable because you don't need to install or maintain other boot loaders and GRUB is flexible enough to load an operating system from an arbitrary disk/partition. However, chainloading is sometimes required, as GRUB doesn't support all existing operating systems natively. @menu * Loading an operating system directly:: * Kexec:: * Chain-loading:: @end menu @node Loading an operating system directly @subsection How to boot an OS directly with GRUB Multiboot (@pxref{Top, Multiboot Specification, Motivation, multiboot, The Multiboot Specification}) is the native format supported by GRUB. For the sake of convenience, there is also support for Linux, FreeBSD, NetBSD and OpenBSD. If you want to boot other operating systems, you will have to chain-load them (@pxref{Chain-loading}). FIXME: this section is incomplete. @enumerate @item Run the command @command{boot} (@pxref{boot}). @end enumerate However, DOS and Windows have some deficiencies, so you might have to use more complicated instructions. @xref{DOS/Windows}, for more information. @node Kexec @subsection Kexec with grub2-emu GRUB can be run in userspace by invoking the grub2-emu tool. It will read all configuration scripts as if booting directly (see @ref{Loading an operating system directly}). With the @code{--kexec} flag, and kexec(8) support from the operating system, the @command{linux} command will directly boot the target image. For systems that lack working systemctl(1) support for kexec, passing the @code{--kexec} flag twice will fallback to invoking kexec(8) directly; note however that this fallback may be unsafe outside read-only environments, as it does not invoke shutdown machinery. @node Chain-loading @subsection Chain-loading an OS Operating systems that do not support Multiboot and do not have specific support in GRUB (specific support is available for Linux, FreeBSD, NetBSD and OpenBSD) must be chain-loaded, which involves loading another boot loader and jumping to it in real mode or via the firmware. The @command{chainloader} command (@pxref{chainloader}) is used to set this up. It is normally also necessary to load some GRUB modules and set the appropriate root device. Putting this together, we get something like this, for a Windows system on the first partition of the first hard disk: @verbatim menuentry "Windows" { insmod chain insmod ntfs set root=(hd0,1) chainloader +1 } @end verbatim @c FIXME: document UUIDs. On systems with multiple hard disks, an additional workaround may be required. @xref{DOS/Windows}. Chain-loading is only supported on PC BIOS and EFI platforms. @node Loopback booting @section Loopback booting GRUB is able to read from an image (be it one of CD or HDD) stored on any of its accessible storages (refer to @pxref{loopback} command). However the OS itself should be able to find its root. This usually involves running a userspace program running before the real root is discovered. This is achieved by GRUB loading a specially made small image and passing it as ramdisk to the kernel. This is achieved by commands @command{kfreebsd_module}, @command{knetbsd_module_elf}, @command{kopenbsd_ramdisk}, @command{initrd} (@pxref{initrd}), @command{initrd16} (@pxref{initrd16}), @command{multiboot_module}, @command{multiboot2_module} or @command{xnu_ramdisk} depending on the loader. Note that for knetbsd the image must be put inside miniroot.kmod and the whole miniroot.kmod has to be loaded. In kopenbsd payload this is disabled by default. Additionally, behaviour of initial ramdisk depends on command line options. Several distributors provide the image for this purpose or it's integrated in their standard ramdisk and activated by special option. Consult your kernel and distribution manual for more details. Other loaders like @command{appleloader}, @command{chainloader} (BIOS, EFI, coreboot), @command{freedos}, @command{ntldr}, @command{plan9} and @command{truecrypt} provide no possibility of loading initial ramdisk and as far as author is aware the payloads in question don't support either initial ramdisk or discovering loopback boot in other way and as such not bootable this way. Please consider alternative boot methods like copying all files from the image to actual partition. Consult your OS documentation for more details. @node LVM cache booting @section Booting from LVM cache logical volume The LVM cache logical volume is the logical volume consisting of the original and the cache pool logical volume. The original is usually on a larger and slower storage device while the cache pool is on a smaller and faster one. The performance of the original volume can be improved by storing the frequently used data on the cache pool to utilize the greater performance of faster device. GRUB boots from LVM cache logical volume merely by reading it's original logical volume so that dirty data in cache pool volume is disregarded. This is not a problem for "writethrough" cache mode as it ensures that any data written will be stored both on the cache and the origin LV. For the other cache mode "writeback", which delays writing from the cache pool back to the origin LV to boost performance, GRUB may fail to boot in the wake of accidental power outage due to it's inability to assemble the cache device for reading the required dirty data left behind. The situation will be improved after adding full support to the LVM cache logical volume in the future. @node OS-specific notes @section Some caveats on OS-specific issues Here, we describe some caveats on several operating systems. @menu * GNU/Hurd:: * GNU/Linux:: * NetBSD:: * DOS/Windows:: @end menu @node GNU/Hurd @subsection GNU/Hurd Since GNU/Hurd is Multiboot-compliant, it is easy to boot it; there is nothing special about it. But do not forget that you have to specify a root partition to the kernel. @enumerate @item Set GRUB's root device to the same drive as GNU/Hurd's. The command @code{search --set=root --file /boot/gnumach.gz} or similar may help you (@pxref{search}). @item Load the kernel and the modules, like this: @example @group grub> @kbd{multiboot /boot/gnumach.gz root=device:hd0s1} grub> @kbd{module /hurd/ext2fs.static ext2fs --readonly \ --multiboot-command-line='$@{kernel-command-line@}' \ --host-priv-port='$@{host-port@}' \ --device-master-port='$@{device-port@}' \ --exec-server-task='$@{exec-task@}' -T typed '$@{root@}' \ '$(task-create)' '$(task-resume)'} grub> @kbd{module /lib/ld.so.1 exec /hurd/exec '$(exec-task=task-create)'} @end group @end example @item Finally, run the command @command{boot} (@pxref{boot}). @end enumerate @node GNU/Linux @subsection GNU/Linux It is relatively easy to boot GNU/Linux from GRUB, because it somewhat resembles to boot a Multiboot-compliant OS. @enumerate @item Set GRUB's root device to the same drive as GNU/Linux's. The command @code{search --set=root --file /vmlinuz} or similar may help you (@pxref{search}). @item Load the kernel using the command @command{linux} (@pxref{linux}): @example grub> @kbd{linux /vmlinuz root=/dev/sda1} @end example If you need to specify some kernel parameters, just append them to the command. For example, to set @option{acpi} to @samp{off}, do this: @example grub> @kbd{linux /vmlinuz root=/dev/sda1 acpi=off} @end example See the documentation in the Linux source tree for complete information on the available options. With @command{linux} GRUB uses 32-bit protocol. Some BIOS services like APM or EDD aren't available with this protocol. In this case you need to use @command{linux16} @example grub> @kbd{linux16 /vmlinuz root=/dev/sda1 acpi=off} @end example @item If you use an initrd, execute the command @command{initrd} (@pxref{initrd}) after @command{linux}: @example grub> @kbd{initrd /initrd} @end example If you used @command{linux16} you need to use @command{initrd16}: @example grub> @kbd{initrd16 /initrd} @end example @item Finally, run the command @command{boot} (@pxref{boot}). @end enumerate @node NetBSD @subsection NetBSD Booting a NetBSD kernel from GRUB is also relatively easy: first set GRUB's root device, then load the kernel and the modules, and finally run @command{boot}. @enumerate @item Set GRUB's root device to the partition holding the NetBSD root file system. For a disk with a NetBSD disk label, this is usually the first partition (a:). In that case, and assuming that the partition is on the first hard disk, set GRUB's root device as follows: @example grub> @kbd{insmod part_bsd} grub> @kbd{set root=(hd0,netbsd1)} @end example For a disk with a GUID Partition Table (GPT), and assuming that the NetBSD root partition is the third GPT partition, do this: @example grub> @kbd{insmod part_gpt} grub> @kbd{set root=(hd0,gpt3)} @end example @item Load the kernel using the command @command{knetbsd}: @example grub> @kbd{knetbsd /netbsd} @end example Various options may be given to @command{knetbsd}. These options are, for the most part, the same as in the NetBSD boot loader. For instance, to boot the system in single-user mode and with verbose messages, do this: @example grub> @kbd{knetbsd /netbsd -s -v} @end example @item If needed, load kernel modules with the command @command{knetbsd_module_elf}. A typical example is the module for the root file system: @example grub> @kbd{knetbsd_module_elf /stand/amd64/6.0/modules/ffs/ffs.kmod} @end example @item Finally, run the command @command{boot} (@pxref{boot}). @end enumerate @node DOS/Windows @subsection DOS/Windows GRUB cannot boot DOS or Windows directly, so you must chain-load them (@pxref{Chain-loading}). However, their boot loaders have some critical deficiencies, so it may not work to just chain-load them. To overcome the problems, GRUB provides you with two helper functions. If you have installed DOS (or Windows) on a non-first hard disk, you have to use the disk swapping technique, because that OS cannot boot from any disks but the first one. The workaround used in GRUB is the command @command{drivemap} (@pxref{drivemap}), like this: @example drivemap -s (hd0) (hd1) @end example This performs a @dfn{virtual} swap between your first and second hard drive. @strong{Caution:} This is effective only if DOS (or Windows) uses BIOS to access the swapped disks. If that OS uses a special driver for the disks, this probably won't work. Another problem arises if you installed more than one set of DOS/Windows onto one disk, because they could be confused if there are more than one primary partitions for DOS/Windows. Certainly you should avoid doing this, but there is a solution if you do want to do so. Use the partition hiding/unhiding technique. If GRUB @dfn{hides} a DOS (or Windows) partition (@pxref{parttool}), DOS (or Windows) will ignore the partition. If GRUB @dfn{unhides} a DOS (or Windows) partition, DOS (or Windows) will detect the partition. Thus, if you have installed DOS (or Windows) on the first and the second partition of the first hard disk, and you want to boot the copy on the first partition, do the following: @example @group parttool (hd0,1) hidden- parttool (hd0,2) hidden+ set root=(hd0,1) chainloader +1 parttool @verb{'${root}'} boot+ boot @end group @end example @node Configuration @chapter Writing your own configuration file GRUB is configured using @file{grub.cfg}, usually located under @file{/boot/grub}. This file is quite flexible, but most users will not need to write the whole thing by hand. @menu * Simple configuration:: Recommended for most users * Root Identification Heuristics:: Summary on how the root file system is identified. * Shell-like scripting:: For power users and developers * Multi-boot manual config:: For non-standard multi-OS scenarios * Embedded configuration:: Embedding a configuration file into GRUB @end menu @node Simple configuration @section Simple configuration handling The program @command{grub-mkconfig} (@pxref{Invoking grub-mkconfig}) generates @file{grub.cfg} files suitable for most cases. It is suitable for use when upgrading a distribution, and will discover available kernels and attempt to generate menu entries for them. @command{grub-mkconfig} does have some limitations. While adding extra custom menu entries to the end of the list can be done by editing @file{/etc/grub.d/40_custom} or creating @file{/boot/grub/custom.cfg}, changing the order of menu entries or changing their titles may require making complex changes to shell scripts stored in @file{/etc/grub.d/}. This may be improved in the future. In the meantime, those who feel that it would be easier to write @file{grub.cfg} directly are encouraged to do so (@pxref{Booting}, and @ref{Shell-like scripting}), and to disable any system provided by their distribution to automatically run @command{grub-mkconfig}. The file @file{/etc/default/grub} controls the operation of @command{grub-mkconfig}. It is sourced by a shell script, and so must be valid POSIX shell input; normally, it will just be a sequence of @samp{KEY=value} lines, but if the value contains spaces or other special characters then it must be quoted. For example: @example GRUB_TERMINAL_INPUT="console serial" @end example Valid keys in @file{/etc/default/grub} are as follows: @table @samp @item GRUB_DEFAULT The default menu entry. This may be a number, in which case it identifies the Nth entry in the generated menu counted from zero, or the title of a menu entry, or the special string @samp{saved}. Using the id may be useful if you want to set a menu entry as the default even though there may be a variable number of entries before it. For example, if you have: @verbatim menuentry 'Example GNU/Linux distribution' --class gnu-linux --id example-gnu-linux { ... } @end verbatim then you can make this the default using: @example GRUB_DEFAULT=example-gnu-linux @end example Previously it was documented the way to use entry title. While this still works it's not recommended since titles often contain unstable device names and may be translated If you set this to @samp{saved}, then the default menu entry will be that saved by @samp{GRUB_SAVEDEFAULT} or @command{grub-set-default}. This relies on the environment block, which may not be available in all situations (@pxref{Environment block}). The default is @samp{0}. @item GRUB_SAVEDEFAULT If this option is set to @samp{true}, then, when an entry is selected, save it as a new default entry for use by future runs of GRUB. This is only useful if @samp{GRUB_DEFAULT=saved}; it is a separate option because @samp{GRUB_DEFAULT=saved} is useful without this option, in conjunction with @command{grub-set-default}. Unset by default. This option relies on the environment block, which may not be available in all situations (@pxref{Environment block}). @item GRUB_TIMEOUT Boot the default entry this many seconds after the menu is displayed, unless a key is pressed. The default is @samp{5}. Set to @samp{0} to boot immediately without displaying the menu, or to @samp{-1} to wait indefinitely. If @samp{GRUB_TIMEOUT_STYLE} is set to @samp{countdown} or @samp{hidden}, the timeout is instead counted before the menu is displayed. @item GRUB_TIMEOUT_STYLE If this option is unset or set to @samp{menu}, then GRUB will display the menu and then wait for the timeout set by @samp{GRUB_TIMEOUT} to expire before booting the default entry. Pressing a key interrupts the timeout. If this option is set to @samp{countdown} or @samp{hidden}, then, before displaying the menu, GRUB will wait for the timeout set by @samp{GRUB_TIMEOUT} to expire. If @key{ESC} or @key{F4} are pressed, or @key{SHIFT} is held down during that time, it will display the menu and wait for input. If a hotkey associated with a menu entry is pressed, it will boot the associated menu entry immediately. If the timeout expires before either of these happens, it will boot the default entry. In the @samp{countdown} case, it will show a one-line indication of the remaining time. @item GRUB_DEFAULT_BUTTON @itemx GRUB_TIMEOUT_BUTTON @itemx GRUB_TIMEOUT_STYLE_BUTTON @itemx GRUB_BUTTON_CMOS_ADDRESS Variants of the corresponding variables without the @samp{_BUTTON} suffix, used to support vendor-specific power buttons. @xref{Vendor power-on keys}. @item GRUB_DISTRIBUTOR Set by distributors of GRUB to their identifying name. This is used to generate more informative menu entry titles. @item GRUB_TERMINAL_INPUT Select the terminal input device. You may select multiple devices here, separated by spaces. Valid terminal input names depend on the platform, but may include @samp{console} (native platform console), @samp{serial} (serial terminal), @samp{serial_} (serial terminal with explicit port selection), @samp{at_keyboard} (PC AT keyboard), or @samp{usb_keyboard} (USB keyboard using the HID Boot Protocol, for cases where the firmware does not handle this). The default is to use the platform's native terminal input. @item GRUB_TERMINAL_OUTPUT Select the terminal output device. You may select multiple devices here, separated by spaces. Valid terminal output names depend on the platform, but may include @samp{console} (native platform console), @samp{serial} (serial terminal), @samp{serial_} (serial terminal with explicit port selection), @samp{gfxterm} (graphics-mode output), @samp{vga_text} (VGA text output), @samp{mda_text} (MDA text output), @samp{morse} (Morse-coding using system beeper) or @samp{spkmodem} (simple data protocol using system speaker). @samp{spkmodem} is useful when no serial port is available. Connect the output of sending system (where GRUB is running) to line-in of receiving system (usually developer machine). On receiving system compile @samp{spkmodem-recv} from @samp{util/spkmodem-recv.c} and run: @example parecord --channels=1 --rate=48000 --format=s16le | ./spkmodem-recv @end example The default is to use the platform's native terminal output. @item GRUB_TERMINAL If this option is set, it overrides both @samp{GRUB_TERMINAL_INPUT} and @samp{GRUB_TERMINAL_OUTPUT} to the same value. @item GRUB_SERIAL_COMMAND A command to configure the serial port when using the serial console. @xref{serial}. Defaults to @samp{serial}. @item GRUB_CMDLINE_LINUX Command-line arguments to add to menu entries for the Linux kernel. @item GRUB_CMDLINE_LINUX_DEFAULT Unless @samp{GRUB_DISABLE_RECOVERY} is set to @samp{true}, two menu entries will be generated for each Linux kernel: one default entry and one entry for recovery mode. This option lists command-line arguments to add only to the default menu entry, after those listed in @samp{GRUB_CMDLINE_LINUX}. @item GRUB_CMDLINE_LINUX_RECOVERY Unless @samp{GRUB_DISABLE_RECOVERY} is set to @samp{true}, two menu entries will be generated for each Linux kernel: one default entry and one entry for recovery mode. This option lists command-line arguments to add only to the recovery menu entry, before those listed in @samp{GRUB_CMDLINE_LINUX}. The default is @samp{single}. @item GRUB_CMDLINE_NETBSD @itemx GRUB_CMDLINE_NETBSD_DEFAULT As @samp{GRUB_CMDLINE_LINUX} and @samp{GRUB_CMDLINE_LINUX_DEFAULT}, but for NetBSD. @item GRUB_CMDLINE_GNUMACH As @samp{GRUB_CMDLINE_LINUX}, but for GNU Mach. @item GRUB_CMDLINE_XEN @itemx GRUB_CMDLINE_XEN_DEFAULT The values of these options are passed to Xen hypervisor Xen menu entries, for all respectively normal entries. @item GRUB_CMDLINE_LINUX_XEN_REPLACE @item GRUB_CMDLINE_LINUX_XEN_REPLACE_DEFAULT The values of these options replace the values of @samp{GRUB_CMDLINE_LINUX} and @samp{GRUB_CMDLINE_LINUX_DEFAULT} for Linux and Xen menu entries. @item GRUB_TOP_LEVEL @item GRUB_TOP_LEVEL_XEN This option should be an absolute path to a kernel image. If provided, the image specified will be made the top-level entry if it is found in the scan. @item GRUB_TOP_LEVEL_OS_PROBER This option should be a line of output from @command{os-prober}. As @samp{GRUB_TOP_LEVEL}, if provided, the image specified will be made the top-level entry if it is found in the scan. @item GRUB_EARLY_INITRD_LINUX_CUSTOM @itemx GRUB_EARLY_INITRD_LINUX_STOCK List of space-separated early initrd images to be loaded from @samp{/boot}. This is for loading things like CPU microcode, firmware, ACPI tables, crypto keys, and so on. These early images will be loaded in the order declared, and all will be loaded before the actual functional initrd image. @samp{GRUB_EARLY_INITRD_LINUX_STOCK} is for your distribution to declare images that are provided by the distribution. It should not be modified without understanding the consequences. They will be loaded first. @samp{GRUB_EARLY_INITRD_LINUX_CUSTOM} is for your custom created images. The default stock images are as follows, though they may be overridden by your distribution: @example intel-uc.img intel-ucode.img amd-uc.img amd-ucode.img early_ucode.cpio microcode.cpio @end example @item GRUB_DISABLE_LINUX_UUID Normally, @command{grub-mkconfig} will generate menu entries that use universally-unique identifiers (UUIDs) to identify the root filesystem to the Linux kernel, using a @samp{root=UUID=...} kernel parameter. This is usually more reliable, but in some cases it may not be appropriate. To disable the use of UUIDs, set this option to @samp{true}. @item GRUB_DISABLE_LINUX_PARTUUID If @command{grub-mkconfig} cannot identify the root filesystem via its universally-unique indentifier (UUID), @command{grub-mkconfig} can use the UUID of the partition containing the filesystem to identify the root filesystem to the Linux kernel via a @samp{root=PARTUUID=...} kernel parameter. This is not as reliable as using the filesystem UUID, but is more reliable than using the Linux device names. When @samp{GRUB_DISABLE_LINUX_PARTUUID} is set to @samp{false}, the Linux kernel version must be 2.6.37 (3.10 for systems using the MSDOS partition scheme) or newer. This option defaults to @samp{true}. To enable the use of partition UUIDs, set this option to @samp{false}. @item GRUB_DISABLE_RECOVERY If this option is set to @samp{true}, disable the generation of recovery mode menu entries. @item GRUB_DISABLE_UUID Normally, @command{grub-mkconfig} will generate menu entries that use universally-unique identifiers (UUIDs) to identify various filesystems to search for files. This is usually more reliable, but in some cases it may not be appropriate. To disable this use of UUIDs, set this option to @samp{true}. Setting this option to @samp{true}, will also set the options @samp{GRUB_DISABLE_LINUX_UUID} and @samp{GRUB_DISABLE_LINUX_PARTUUID} to @samp{true}, unless they have been explicitly set to @samp{false}. @item GRUB_VIDEO_BACKEND If graphical video support is required, either because the @samp{gfxterm} graphical terminal is in use or because @samp{GRUB_GFXPAYLOAD_LINUX} is set, then @command{grub-mkconfig} will normally load all available GRUB video drivers and use the one most appropriate for your hardware. If you need to override this for some reason, then you can set this option. After @command{grub-install} has been run, the available video drivers are listed in @file{/boot/grub/video.lst}. @item GRUB_GFXMODE Set the resolution used on the @samp{gfxterm} graphical terminal. Note that you can only use modes which your graphics card supports via VESA BIOS Extensions (VBE), so for example native LCD panel resolutions may not be available. The default is @samp{auto}, which tries to select a preferred resolution. @xref{gfxmode}. @item GRUB_BACKGROUND Set a background image for use with the @samp{gfxterm} graphical terminal. The value of this option must be a file readable by GRUB at boot time, and it must end with @file{.png}, @file{.tga}, @file{.jpg}, or @file{.jpeg}. The image will be scaled if necessary to fit the screen. Image height and width will be restricted by an artificial limit of 16384. @item GRUB_THEME Set a theme for use with the @samp{gfxterm} graphical terminal. @item GRUB_GFXPAYLOAD_LINUX Set to @samp{text} to force the Linux kernel to boot in normal text mode, @samp{keep} to preserve the graphics mode set using @samp{GRUB_GFXMODE}, @samp{@var{width}x@var{height}}[@samp{x@var{depth}}] to set a particular graphics mode, or a sequence of these separated by commas or semicolons to try several modes in sequence. @xref{gfxpayload}. Depending on your kernel, your distribution, your graphics card, and the phase of the moon, note that using this option may cause GNU/Linux to suffer from various display problems, particularly during the early part of the boot sequence. If you have problems, set this option to @samp{text} and GRUB will tell Linux to boot in normal text mode. @item GRUB_DISABLE_OS_PROBER The @command{grub-mkconfig} has a feature to use the external @command{os-prober} program to discover other operating systems installed on the same machine and generate appropriate menu entries for them. It is disabled by default since automatic and silent execution of @command{os-prober}, and creating boot entries based on that data, is a potential attack vector. Set this option to @samp{false} to enable this feature in the @command{grub-mkconfig} command. @item GRUB_OS_PROBER_SKIP_LIST List of space-separated case insensitive UUIDs of filesystems to be ignored from os-prober output. For EFI chainloaders it's @@. For backward compatibility with previous behaviour, @@/dev/* is also accepted for non-EFI chainloaders even if the device does not match, and comma and semicolon are also accepted as separator. @item GRUB_DISABLE_SUBMENU Normally, @command{grub-mkconfig} will generate top level menu entry for the kernel with highest version number and put all other found kernels or alternative menu entries for recovery mode in submenu. For entries returned by @command{os-prober} first entry will be put on top level and all others in submenu. If this option is set to @samp{true}, flat menu with all entries on top level will be generated instead. Changing this option will require changing existing values of @samp{GRUB_DEFAULT}, @samp{fallback} (@pxref{fallback}) and @samp{default} (@pxref{default}) environment variables as well as saved default entry using @command{grub-set-default} and value used with @command{grub-reboot}. @item GRUB_ENABLE_CRYPTODISK If set to @samp{y}, @command{grub-mkconfig} and @command{grub-install} will check for encrypted disks and generate additional commands needed to access them during boot. Note that in this case unattended boot is not possible because GRUB will wait for passphrase to unlock encrypted container. @item GRUB_INIT_TUNE Play a tune on the speaker when GRUB starts. This is particularly useful for users unable to see the screen. The value of this option is passed directly to @ref{play}. @item GRUB_BADRAM If this option is set, GRUB will issue a @ref{badram} command to filter out specified regions of RAM. @item GRUB_PRELOAD_MODULES This option may be set to a list of GRUB module names separated by spaces. Each module will be loaded as early as possible, at the start of @file{grub.cfg}. @end table The following options are still accepted for compatibility with existing configurations, but have better replacements: @table @samp @item GRUB_HIDDEN_TIMEOUT Wait this many seconds before displaying the menu. If @key{ESC} or @key{F4} are pressed, or @key{SHIFT} is held down during that time, display the menu and wait for input according to @samp{GRUB_TIMEOUT}. If a hotkey associated with a menu entry is pressed, boot the associated menu entry immediately. If the timeout expires before either of these happens, display the menu for the number of seconds specified in @samp{GRUB_TIMEOUT} before booting the default entry. If you set @samp{GRUB_HIDDEN_TIMEOUT}, you should also set @samp{GRUB_TIMEOUT=0} so that the menu is not displayed at all unless @key{ESC} or @key{F4} are pressed, or @key{SHIFT} is held down. This option is unset by default, and is deprecated in favour of the less confusing @samp{GRUB_TIMEOUT_STYLE=countdown} or @samp{GRUB_TIMEOUT_STYLE=hidden}. @item GRUB_HIDDEN_TIMEOUT_QUIET In conjunction with @samp{GRUB_HIDDEN_TIMEOUT}, set this to @samp{true} to suppress the verbose countdown while waiting for a key to be pressed before displaying the menu. This option is unset by default, and is deprecated in favour of the less confusing @samp{GRUB_TIMEOUT_STYLE=countdown}. @item GRUB_HIDDEN_TIMEOUT_BUTTON Variant of @samp{GRUB_HIDDEN_TIMEOUT}, used to support vendor-specific power buttons. @xref{Vendor power-on keys}. This option is unset by default, and is deprecated in favour of the less confusing @samp{GRUB_TIMEOUT_STYLE=countdown} or @samp{GRUB_TIMEOUT_STYLE=hidden}. @end table For more detailed customisation of @command{grub-mkconfig}'s output, you may edit the scripts in @file{/etc/grub.d} directly. @file{/etc/grub.d/40_custom} is particularly useful for adding entire custom menu entries; simply type the menu entries you want to add at the end of that file, making sure to leave at least the first two lines intact. @node Root Identification Heuristics @section Root Identification Heuristics If the target operating system uses the Linux kernel, @command{grub-mkconfig} attempts to identify the root file system via a heuristic algoirthm. This algorithm selects the identification method of the root file system by considering three factors. The first is if an initrd for the target operating system is also present. The second is @samp{GRUB_DISABLE_LINUX_UUID} and if set to @samp{true}, prevents @command{grub-mkconfig} from identifying the root file system by its UUID. The third is @samp{GRUB_DISABLE_LINUX_PARTUUID} and if set to @samp{true}, prevents @command{grub-mkconfig} from identifying the root file system via the UUID of its enclosing partition. If the variables are assigned any other value, that value is considered equivalent to @samp{false}. The variables are also considered to be set to @samp{false} if they are not set. When booting, the Linux kernel will delegate the task of mounting the root filesystem to the initrd. Most initrd images determine the root file system by checking the Linux kernel's command-line for the @samp{root} key and use its value as the identification method of the root file system. To improve the reliability of booting, most initrd images also allow the root file system to be identified by its UUID. Because of this behavior, the @command{grub-mkconfig} command will set @samp{root} to @samp{root=UUID=...} to provide the initrd with the filesystem UUID of the root file system. If no initrd is detected or @samp{GRUB_DISABLE_LINUX_UUID} is set to @samp{true} then @command{grub-command} will identify the root filesystem by setting the kernel command-line variable @samp{root} to @samp{root=PARTUUID=...} unless @samp{GRUB_DISABLE_LINUX_PARTUUID} is also set to @samp{true}. If @samp{GRUB_DISABLE_LINUX_PARTUUID} is also set to @samp{true}, @command{grub-command} will identify by its Linux device name. The following table summarizes the behavior of the @command{grub-mkconfig} command. @multitable {detected} {GRUB_DISABLE_LINUX_PARTUUID} {GRUB_DISABLE_LINUX_UUID} {Linux Root} @headitem Initrd detected @tab GRUB_DISABLE_LINUX_PARTUUID Set To @tab GRUB_DISABLE_LINUX_UUID Set To @tab Linux Root ID Method @item false @tab false @tab false @tab part UUID @item false @tab false @tab true @tab part UUID @item false @tab true @tab false @tab dev name @item false @tab true @tab true @tab dev name @item true @tab false @tab false @tab fs UUID @item true @tab false @tab true @tab part UUID @item true @tab true @tab false @tab fs UUID @item true @tab true @tab true @tab dev name @end multitable Remember, @samp{GRUB_DISABLE_LINUX_PARTUUID} and @samp{GRUB_DISABLE_LINUX_UUID} are also considered to be set to @samp{true} and @samp{false}, respectively, when they are unset. @node Shell-like scripting @section Writing full configuration files directly @c Some of this section is derived from the GNU Bash manual page, also @c copyrighted by the FSF. @file{grub.cfg} is written in GRUB's built-in scripting language, which has a syntax quite similar to that of GNU Bash and other Bourne shell derivatives. @heading Words A @dfn{word} is a sequence of characters considered as a single unit by GRUB. Words are separated by @dfn{metacharacters}, which are the following plus space, tab, and newline: @example @{ @} | & $ ; < > @end example Quoting may be used to include metacharacters in words; see below. @heading Reserved words Reserved words have a special meaning to GRUB. The following words are recognised as reserved when unquoted and either the first word of a simple command or the third word of a @code{for} command: @example ! [[ ]] @{ @} case do done elif else esac fi for function if in menuentry select then time until while @end example Not all of these reserved words have a useful purpose yet; some are reserved for future expansion. @heading Quoting Quoting is used to remove the special meaning of certain characters or words. It can be used to treat metacharacters as part of a word, to prevent reserved words from being recognised as such, and to prevent variable expansion. There are three quoting mechanisms: the escape character, single quotes, and double quotes. A non-quoted backslash (\) is the @dfn{escape character}. It preserves the literal value of the next character that follows, with the exception of newline. Enclosing characters in single quotes preserves the literal value of each character within the quotes. A single quote may not occur between single quotes, even when preceded by a backslash. Enclosing characters in double quotes preserves the literal value of all characters within the quotes, with the exception of @samp{$} and @samp{\}. The @samp{$} character retains its special meaning within double quotes. The backslash retains its special meaning only when followed by one of the following characters: @samp{$}, @samp{"}, @samp{\}, or newline. A backslash-newline pair is treated as a line continuation (that is, it is removed from the input stream and effectively ignored@footnote{Currently a backslash-newline pair within a variable name is not handled properly, so use this feature with some care.}). A double quote may be quoted within double quotes by preceding it with a backslash. @heading Variable expansion The @samp{$} character introduces variable expansion. The variable name to be expanded may be enclosed in braces, which are optional but serve to protect the variable to be expanded from characters immediately following it which could be interpreted as part of the name. Normal variable names begin with an alphabetic character, followed by zero or more alphanumeric characters. These names refer to entries in the GRUB environment (@pxref{Environment}). Positional variable names consist of one or more digits. They represent parameters passed to function calls, with @samp{$1} representing the first parameter, and so on. The special variable name @samp{?} expands to the exit status of the most recently executed command. When positional variable names are active, other special variable names @samp{@@}, @samp{*} and @samp{#} are defined and they expand to all positional parameters with necessary quoting, positional parameters without any quoting, and positional parameter count respectively. @heading Comments A word beginning with @samp{#} causes that word and all remaining characters on that line to be ignored. @heading Simple commands A @dfn{simple command} is a sequence of words separated by spaces or tabs and terminated by a semicolon or a newline. The first word specifies the command to be executed. The remaining words are passed as arguments to the invoked command. The return value of a simple command is its exit status. If the reserved word @code{!} precedes the command, then the return value is instead the logical negation of the command's exit status. @heading Compound commands A @dfn{compound command} is one of the following: @table @asis @item for @var{name} in @var{word} @dots{}; do @var{list}; done The list of words following @code{in} is expanded, generating a list of items. The variable @var{name} is set to each element of this list in turn, and @var{list} is executed each time. The return value is the exit status of the last command that executes. If the expansion of the items following @code{in} results in an empty list, no commands are executed, and the return status is 0. @item if @var{list}; then @var{list}; [elif @var{list}; then @var{list};] @dots{} [else @var{list};] fi The @code{if} @var{list} is executed, where @var{list} is a series of @dfn{simple command}s separated by a ";". If its exit status of the last command is zero, the @code{then} @var{list} is executed. Otherwise, each @code{elif} @var{list} is executed in turn, and if its last command's exit status is zero, the corresponding @code{then} @var{list} is executed and the command completes. Otherwise, the @code{else} @var{list} is executed, if present. The exit status is the exit status of the last command executed, or zero if no condition tested true. @item while @var{cond}; do @var{list}; done @itemx until @var{cond}; do @var{list}; done The @code{while} command continuously executes the @code{do} @var{list} as long as the last command in @var{cond} returns an exit status of zero, where @var{cond} is a list of @dfn{simple command}s separated by a ";". The @code{until} command is identical to the @code{while} command, except that the test is negated; the @code{do} @var{list} is executed as long as the last command in @var{cond} returns a non-zero exit status. The exit status of the @code{while} and @code{until} commands is the exit status of the last @code{do} @var{list} command executed, or zero if none was executed. @item function @var{name} @{ @var{command}; @dots{} @} This defines a function named @var{name}. The @dfn{body} of the function is the list of commands within braces, each of which must be terminated with a semicolon or a newline. This list of commands will be executed whenever @var{name} is specified as the name of a simple command. Function definitions do not affect the exit status in @code{$?}. When executed, the exit status of a function is the exit status of the last command executed in the body. @item menuentry @var{title} [@option{--class=class} @dots{}] [@option{--users=users}] [@option{--unrestricted}] [@option{--hotkey=key}] [@option{--id=id}] @{ @var{command}; @dots{} @} @xref{menuentry}. @end table @heading Built-in Commands Some built-in commands are also provided by GRUB script to help script writers perform actions that are otherwise not possible. For example, these include commands to jump out of a loop without fully completing it, etc. @table @asis @item break [@code{n}] Exit from within a @code{for}, @code{while}, or @code{until} loop. If @code{n} is specified, break @code{n} levels. @code{n} must be greater than or equal to 1. If @code{n} is greater than the number of enclosing loops, all enclosing loops are exited. The return value is 0 unless @code{n} is not greater than or equal to 1. @item continue [@code{n}] Resume the next iteration of the enclosing @code{for}, @code{while} or @code{until} loop. If @code{n} is specified, resume at the @code{n}th enclosing loop. @code{n} must be greater than or equal to 1. If @code{n} is greater than the number of enclosing loops, the last enclosing loop (the @dfn{top-level} loop) is resumed. The return value is 0 unless @code{n} is not greater than or equal to 1. @item return [@code{n}] Causes a function to exit with the return value specified by @code{n}. If @code{n} is omitted, the return status is that of the last command executed in the function body. If used outside a function the return status is false. @item setparams [@code{arg}] @dots{} Replace positional parameters starting with @code{$1} with arguments to @command{setparams}. @item shift [@code{n}] The positional parameters from @code{n}+1 @dots{} are renamed to @code{$1}@dots{}. Parameters represented by the numbers @code{$#} down to @code{$#}-@code{n}+1 are unset. @code{n} must be a non-negative number less than or equal to @code{$#}. If @code{n} is 0, no parameters are changed. If @code{n} is not given, it is assumed to be 1. If @code{n} is greater than @code{$#}, the positional parameters are not changed. The return status is greater than zero if @code{n} is greater than @code{$#} or less than zero; otherwise 0. @end table @node Multi-boot manual config @section Multi-boot manual config Currently autogenerating config files for multi-boot environments depends on os-prober and has several shortcomings. Due to that it is disabled by default. It is advised to use the power of GRUB syntax and do it yourself. A possible configuration is detailed here, feel free to adjust to your needs. First create a separate GRUB partition, big enough to hold GRUB. Some of the following entries show how to load OS installer images from this same partition, for that you obviously need to make the partition large enough to hold those images as well. Mount this partition on/mnt/boot and disable GRUB in all OSes and manually install self-compiled latest GRUB with: @code{grub-install --boot-directory=/mnt/boot /dev/sda} In all the OSes install GRUB tools but disable installing GRUB in bootsector, so you'll have menu.lst and grub.cfg available for use. Also disable os-prober use by setting: @code{GRUB_DISABLE_OS_PROBER=true} in /etc/default/grub Then write a grub.cfg (/mnt/boot/grub/grub.cfg): @example menuentry "OS using grub2" @{ insmod xfs search --set=root --label OS1 --hint hd0,msdos8 configfile /boot/grub/grub.cfg @} menuentry "OS using grub2-legacy" @{ insmod ext2 search --set=root --label OS2 --hint hd0,msdos6 legacy_configfile /boot/grub/menu.lst @} menuentry "Windows XP" @{ insmod ntfs search --set=root --label WINDOWS_XP --hint hd0,msdos1 ntldr /ntldr @} menuentry "Windows 7" @{ insmod ntfs search --set=root --label WINDOWS_7 --hint hd0,msdos2 ntldr /bootmgr @} menuentry "FreeBSD" @{ insmod zfs search --set=root --label freepool --hint hd0,msdos7 kfreebsd /freebsd@@/boot/kernel/kernel kfreebsd_module_elf /freebsd@@/boot/kernel/opensolaris.ko kfreebsd_module_elf /freebsd@@/boot/kernel/zfs.ko kfreebsd_module /freebsd@@/boot/zfs/zpool.cache type=/boot/zfs/zpool.cache set kFreeBSD.vfs.root.mountfrom=zfs:freepool/freebsd set kFreeBSD.hw.psm.synaptics_support=1 @} menuentry "experimental GRUB" @{ search --set=root --label GRUB --hint hd0,msdos5 multiboot /experimental/grub/i386-pc/core.img @} menuentry "Fedora 16 installer" @{ search --set=root --label GRUB --hint hd0,msdos5 linux /fedora/vmlinuz lang=en_US keymap=sg resolution=1280x800 initrd /fedora/initrd.img @} menuentry "Fedora rawhide installer" @{ search --set=root --label GRUB --hint hd0,msdos5 linux /fedora/vmlinuz repo=ftp://mirror.switch.ch/mirror/fedora/linux/development/rawhide/x86_64 lang=en_US keymap=sg resolution=1280x800 initrd /fedora/initrd.img @} menuentry "Debian sid installer" @{ search --set=root --label GRUB --hint hd0,msdos5 linux /debian/dists/sid/main/installer-amd64/current/images/hd-media/vmlinuz initrd /debian/dists/sid/main/installer-amd64/current/images/hd-media/initrd.gz @} @end example Notes: @itemize @item Argument to search after --label is FS LABEL. You can also use UUIDs with --fs-uuid UUID instead of --label LABEL. You could also use direct @code{root=hd0,msdosX} but this is not recommended due to device name instability. @end itemize @node Embedded configuration @section Embedding a configuration file into GRUB GRUB supports embedding a configuration file directly into the core image, so that it is loaded before entering normal mode. This is useful, for example, when it is not straightforward to find the real configuration file, or when you need to debug problems with loading that file. @command{grub-install} uses this feature when it is not using BIOS disk functions or when installing to a different disk from the one containing @file{/boot/grub}, in which case it needs to use the @command{search} command (@pxref{search}) to find @file{/boot/grub}. To embed a configuration file, use the @option{-c} option to @command{grub-mkimage}. The file is copied into the core image, so it may reside anywhere on the file system, and may be removed after running @command{grub-mkimage}. After the embedded configuration file (if any) is executed, GRUB will load the @samp{normal} module (@pxref{normal}), which will then read the real configuration file from @file{$prefix/grub.cfg}. By this point, the @code{root} variable will also have been set to the root device name. For example, @code{prefix} might be set to @samp{(hd0,1)/boot/grub}, and @code{root} might be set to @samp{hd0,1}. Thus, in most cases, the embedded configuration file only needs to set the @code{prefix} and @code{root} variables, and then drop through to GRUB's normal processing. A typical example of this might look like this: @example @group search.fs_uuid 01234567-89ab-cdef-0123-456789abcdef root set prefix=($root)/boot/grub @end group @end example (The @samp{search_fs_uuid} module must be included in the core image for this example to work.) In more complex cases, it may be useful to read other configuration files directly from the embedded configuration file. This allows such things as reading files not called @file{grub.cfg}, or reading files from a directory other than that where GRUB's loadable modules are installed. To do this, include the @samp{configfile} and @samp{normal} modules in the core image, and embed a configuration file that uses the @command{configfile} command to load another file. The following example of this also requires the @command{echo}, @command{search_label}, and @command{test} modules to be included in the core image: @example @group search.fs_label grub root if [ -e /boot/grub/example/test1.cfg ]; then set prefix=($root)/boot/grub configfile /boot/grub/example/test1.cfg else if [ -e /boot/grub/example/test2.cfg ]; then set prefix=($root)/boot/grub configfile /boot/grub/example/test2.cfg else echo "Could not find an example configuration file!" fi fi @end group @end example The embedded configuration file may not contain menu entries directly, but may only read them from elsewhere using @command{configfile}. @node Theme file format @chapter Theme file format @section Introduction The GRUB graphical menu supports themes that can customize the layout and appearance of the GRUB boot menu. The theme is configured through a plain text file that specifies the layout of the various GUI components (including the boot menu, timeout progress bar, and text messages) as well as the appearance using colors, fonts, and images. Example is available in docs/example_theme.txt @section Theme Elements @subsection Colors Colors can be specified in several ways: @itemize @item HTML-style ``#RRGGBB'' or ``#RGB'' format, where *R*, *G*, and *B* are hexadecimal digits (e.g., ``#8899FF'') @item as comma-separated decimal RGB values (e.g., ``128, 128, 255'') @item with ``SVG 1.0 color names'' (e.g., ``cornflowerblue'') which must be specified in lowercase. @end itemize @subsection Fonts The fonts GRUB uses ``PFF2 font format'' bitmap fonts. Fonts are specified with full font names. Currently there is no provision for a preference list of fonts, or deriving one font from another. Fonts are loaded with the ``loadfont'' command in GRUB (@ref{loadfont}). To see the list of loaded fonts, execute the ``lsfonts'' command (@ref{lsfonts}). If there are too many fonts to fit on screen, do ``set pager=1'' before executing ``lsfonts''. @subsection Progress Bar @float Figure, Pixmap-styled progress bar @c @image{Theme_progress_bar,,,,png} @end float @float Figure, Plain progress bar, drawn with solid color. @c @image{Theme_progress_bar_filled,,,,png} @end float Progress bars are used to display the remaining time before GRUB boots the default menu entry. To create a progress bar that will display the remaining time before automatic boot, simply create a ``progress_bar'' component with the id ``__timeout__''. This indicates to GRUB that the progress bar should be updated as time passes, and it should be made invisible if the countdown to automatic boot is interrupted by the user. Progress bars may optionally have text displayed on them. This text is controlled by variable ``text'' which contains a printf template with the only argument %d is the number of seconds remaining. Additionally special values ``@@TIMEOUT_NOTIFICATION_SHORT@@'', ``@@TIMEOUT_NOTIFICATION_MIDDLE@@'', ``@@TIMEOUT_NOTIFICATION_LONG@@'' are replaced with standard and translated templates. @subsection Circular Progress Indicator @c @image{Theme_circular_progress,,,,.png} The circular progress indicator functions similarly to the progress bar. When given an id of ``__timeout__'', GRUB updates the circular progress indicator's value to indicate the time remaining. For the circular progress indicator, there are two images used to render it: the *center* image, and the *tick* image. The center image is rendered in the center of the component, while the tick image is used to render each mark along the circumference of the indicator. @subsection Labels Text labels can be placed on the boot screen. The font, color, and horizontal alignment can be specified for labels. If a label is given the id ``__timeout__'', then the ``text'' property for that label is also updated with a message informing the user of the number of seconds remaining until automatic boot. This is useful in case you want the text displayed somewhere else instead of directly on the progress bar. @subsection Boot Menu @c @image{Theme_boot_menu,,,,.png} The boot menu where GRUB displays the menu entries from the ``grub.cfg'' file. It is a list of items, where each item has a title and an optional icon. The icon is selected based on the *classes* specified for the menu entry. If there is a PNG file named ``myclass.png'' in the ``grub/themes/icons'' directory, it will be displayed for items which have the class *myclass*. The boot menu can be customized in several ways, such as the font and color used for the menu entry title, and by specifying styled boxes for the menu itself and for the selected item highlight. @subsection Styled Boxes One of the most important features for customizing the layout is the use of *styled boxes*. A styled box is composed of 9 rectangular (and potentially empty) regions, which are used to seamlessly draw the styled box on screen: @multitable @columnfractions 0.3 0.3 0.3 @item Northwest (nw) @tab North (n) @tab Northeast (ne) @item West (w) @tab Center (c) @tab East (e) @item Southwest (sw) @tab South (s) @tab Southeast (se) @end multitable To support any size of box on screen, the center slice and the slices for the top, bottom, and sides are all scaled to the correct size for the component on screen, using the following rules: @enumerate @item The edge slices (north, south, east, and west) are scaled in the direction of the edge they are adjacent to. For instance, the west slice is scaled vertically. @item The corner slices (northwest, northeast, southeast, and southwest) are not scaled. @item The center slice is scaled to fill the remaining space in the middle. @end enumerate As an example of how an image might be sliced up, consider the styled box used for a terminal view. @float Figure, An example of the slices (in red) used for a terminal window. This drawing was created and sliced in Inkscape_, as the next section explains. @c @image{Box_slice_example_terminal,,,,.png} @end float @subsection Creating Styled Box Images The Inkscape_ scalable vector graphics editor is a very useful tool for creating styled box images. One process that works well for slicing a drawing into the necessary image slices is: @enumerate @item Create or open the drawing you'd like use. @item Create a new layer on the top of the layer stack. Make it visible. Select this layer as the current layer. @item Draw 9 rectangles on your drawing where you'd like the slices to be. Clear the fill option, and set the stroke to 1 pixel wide solid stroke. The corners of the slices must meet precisely; if it is off by a single pixel, it will probably be evident when the styled box is rendered in the GRUB menu. You should probably go to File | Document Properties | Grids and enable a grid or create a guide (click on one of the rulers next to the drawing and drag over the drawing; release the mouse button to place the guide) to help place the rectangles precisely. @item Right click on the center slice rectangle and choose Object Properties. Change the "Id" to ``slice_c`` and click Set. Repeat this for the remaining 8 rectangles, giving them Id values of ``slice_n``, ``slice_ne``, ``slice_e``, and so on according to the location. @item Save the drawing. @item Select all the slice rectangles. With the slice layer selected, you can simply press Ctrl+A to select all rectangles. The status bar should indicate that 9 rectangles are selected. @item Click the layer hide icon for the slice layer in the layer palette. The rectangles will remain selected, even though they are hidden. @item Choose File | Export Bitmap and check the *Batch export 9 selected objects* box. Make sure that *Hide all except selected* is unchecked. click *Export*. This will create PNG files in the same directory as the drawing, named after the slices. These can now be used for a styled box in a GRUB theme. @end enumerate @section Theme File Manual The theme file is a plain text file. Lines that begin with ``#`` are ignored and considered comments. (Note: This may not be the case if the previous line ended where a value was expected.) The theme file contains two types of statements: @enumerate @item Global properties. @item Component construction. @end enumerate @subsection Global Properties @subsection Format Global properties are specified with the simple format: @itemize @item name1: value1 @item name2: "value which may contain spaces" @item name3: #88F @end itemize In this example, name3 is assigned a color value. @subsection Global Property List @multitable @columnfractions 0.3 0.6 @item title-text @tab Specifies the text to display at the top center of the screen as a title. @item title-font @tab Defines the font used for the title message at the top of the screen. @item title-color @tab Defines the color of the title message. @item message-font @tab Currently unused. Left for backward compatibility. @item message-color @tab Currently unused. Left for backward compatibility. @item message-bg-color @tab Currently unused. Left for backward compatibility. @item desktop-image @tab Specifies the image to use as the background. It will be scaled to fit the screen size or proportionally scaled depending on the scale method. @item desktop-image-scale-method @tab Specifies the scaling method for the *desktop-image*. Options are ``stretch``, ``crop``, ``padding``, ``fitwidth``, ``fitheight``. ``stretch`` for fitting the screen size. Otherwise it is proportional scaling of a part of *desktop-image* to the part of the screen. ``crop`` part of the *desktop-image* will be proportionally scaled to fit the screen sizes. ``padding`` the entire *desktop-image* will be contained on the screen. ``fitwidth`` for fitting the *desktop-image*'s width with screen width. ``fitheight`` for fitting the *desktop-image*'s height with the screen height. Default is ``stretch``. @item desktop-image-h-align @tab Specifies the horizontal alignment of the *desktop-image* if *desktop-image-scale-method* isn't equeal to ``stretch``. Options are ``left``, ``center``, ``right``. Default is ``center``. @item desktop-image-v-align @tab Specifies the vertical alignment of the *desktop-image* if *desktop-image-scale-method* isn't equeal to ``stretch``. Options are ``top``, ``center``, ``bottom``. Default is ``center``. @item desktop-color @tab Specifies the color for the background if *desktop-image* is not specified. @item terminal-box @tab Specifies the file name pattern for the styled box slices used for the command line terminal window. For example, ``terminal-box: terminal_*.png`` will use the images ``terminal_c.png`` as the center area, ``terminal_n.png`` as the north (top) edge, ``terminal_nw.png`` as the northwest (upper left) corner, and so on. If the image for any slice is not found, it will simply be left empty. @item terminal-border @tab Specifies the border width of the terminal window. @item terminal-left @tab Specifies the left coordinate of the terminal window. @item terminal-top @tab Specifies the top coordinate of the terminal window. @item terminal-width @tab Specifies the width of the terminal window. @item terminal-height @tab Specifies the height of the terminal window. @end multitable @subsection Component Construction Greater customizability comes is provided by components. A tree of components forms the user interface. *Containers* are components that can contain other components, and there is always a single root component which is an instance of a *canvas* container. Components are created in the theme file by prefixing the type of component with a '+' sign: @code{ + label @{ text="GRUB" font="aqui 11" color="#8FF" @} } properties of a component are specified as "name = value" (whitespace surrounding tokens is optional and is ignored) where *value* may be: @itemize @item a single word (e.g., ``align = center``, ``color = #FF8080``), @item a quoted string (e.g., ``text = "Hello, World!"``), or @item a tuple (e.g., ``preferred_size = (120, 80)``). @end itemize @subsection Component List The following is a list of the components and the properties they support. @itemize @item label A label displays a line of text. Properties: @multitable @columnfractions 0.2 0.7 @item id @tab Set to ``__timeout__`` to display the time elapsed to an automatical boot of the default entry. @item text @tab The text to display. If ``id`` is set to ``__timeout__`` and no ``text`` property is set then the amount of seconds will be shown. If set to ``@@KEYMAP_SHORT@@``, ``@@KEYMAP_MIDDLE@@`` or ``@@KEYMAP_LONG@@`` then predefined hotkey information will be shown. @item font @tab The font to use for text display. @item color @tab The color of the text. @item align @tab The horizontal alignment of the text within the component. Options are ``left``, ``center`` and ``right``. @item visible @tab Set to ``false`` to hide the label. @end multitable @item image A component that displays an image. The image is scaled to fit the component. Properties: @multitable @columnfractions 0.2 0.7 @item file @tab The full path to the image file to load. @end multitable @item progress_bar Displays a horizontally oriented progress bar. It can be rendered using simple solid filled rectangles, or using a pair of pixmap styled boxes. Properties: @multitable @columnfractions 0.2 0.7 @item id @tab Set to ``__timeout__`` to display the time elapsed to an automatical boot of the default entry. @item fg_color @tab The foreground color for plain solid color rendering. @item bg_color @tab The background color for plain solid color rendering. @item border_color @tab The border color for plain solid color rendering. @item text_color @tab The text color. @item bar_style @tab The styled box specification for the frame of the progress bar. Example: ``progress_frame_*.png`` If the value is equal to ``highlight_style`` then no styled boxes will be shown. @item highlight_style @tab The styled box specification for the highlighted region of the progress bar. This box will be used to paint just the highlighted region of the bar, and will be increased in size as the bar nears completion. Example: ``progress_hl_*.png``. If the value is equal to ``bar_style`` then no styled boxes will be shown. @item highlight_overlay @tab If this option is set to ``true`` then the highlight box side slices (every slice except the center slice) will overlay the frame box side slices. And the center slice of the highlight box can move all the way (from top to bottom), being drawn on the center slice of the frame box. That way we can make a progress bar with round-shaped edges so there won't be a free space from the highlight to the frame in top and bottom scrollbar positions. Default is ``false``. @item font @tab The font to use for progress bar. @item text @tab The text to display on the progress bar. If the progress bar's ID is set to ``__timeout__`` and the value of this property is set to ``@@TIMEOUT_NOTIFICATION_SHORT@@``, ``@@TIMEOUT_NOTIFICATION_MIDDLE@@`` or ``@@TIMEOUT_NOTIFICATION_LONG@@``, then GRUB will update this property with an informative message as the timeout approaches. @end multitable @item circular_progress Displays a circular progress indicator. The appearance of this component is determined by two images: the *center* image and the *tick* image. The center image is generally larger and will be drawn in the center of the component. Around the circumference of a circle within the component, the tick image will be drawn a certain number of times, depending on the properties of the component. Properties: @multitable @columnfractions 0.3 0.6 @item id @tab Set to ``__timeout__`` to display the time elapsed to an automatical boot of the default entry. @item center_bitmap @tab The file name of the image to draw in the center of the component. @item tick_bitmap @tab The file name of the image to draw for the tick marks. @item num_ticks @tab The number of ticks that make up a full circle. @item ticks_disappear @tab Boolean value indicating whether tick marks should progressively appear, or progressively disappear as *value* approaches *end*. Specify ``true`` or ``false``. Default is ``false``. @item start_angle @tab The position of the first tick mark to appear or disappear. Measured in "parrots", 1 "parrot" = 1 / 256 of the full circle. Use values ``xxx deg`` or ``xxx \xc2\xb0`` to set the angle in degrees. @end multitable @item boot_menu Displays the GRUB boot menu. It allows selecting items and executing them. Properties: @multitable @columnfractions 0.4 0.5 @item item_font @tab The font to use for the menu item titles. @item selected_item_font @tab The font to use for the selected menu item, or ``inherit`` (the default) to use ``item_font`` for the selected menu item as well. @item item_color @tab The color to use for the menu item titles. @item selected_item_color @tab The color to use for the selected menu item, or ``inherit`` (the default) to use ``item_color`` for the selected menu item as well. @item icon_width @tab The width of menu item icons. Icons are scaled to the specified size. @item icon_height @tab The height of menu item icons. @item item_height @tab The height of each menu item in pixels. @item item_padding @tab The amount of space in pixels to leave on each side of the menu item contents. @item item_icon_space @tab The space between an item's icon and the title text, in pixels. @item item_spacing @tab The amount of space to leave between menu items, in pixels. @item menu_pixmap_style @tab The image file pattern for the menu frame styled box. Example: ``menu_*.png`` (this will use images such as ``menu_c.png``, ``menu_w.png``, `menu_nw.png``, etc.) @item item_pixmap_style @tab The image file pattern for the item styled box. @item selected_item_pixmap_style @tab The image file pattern for the selected item highlight styled box. @item scrollbar @tab Boolean value indicating whether the scroll bar should be drawn if the frame and thumb styled boxes are configured. @item scrollbar_frame @tab The image file pattern for the entire scroll bar. Example: ``scrollbar_*.png`` @item scrollbar_thumb @tab The image file pattern for the scroll bar thumb (the part of the scroll bar that moves as scrolling occurs). Example: ``scrollbar_thumb_*.png`` @item scrollbar_thumb_overlay @tab If this option is set to ``true`` then the scrollbar thumb side slices (every slice except the center slice) will overlay the scrollbar frame side slices. And the center slice of the scrollbar_thumb can move all the way (from top to bottom), being drawn on the center slice of the scrollbar frame. That way we can make a scrollbar with round-shaped edges so there won't be a free space from the thumb to the frame in top and bottom scrollbar positions. Default is ``false``. @item scrollbar_slice @tab The menu frame styled box's slice in which the scrollbar will be drawn. Possible values are ``west``, ``center``, ``east`` (default). ``west`` - the scrollbar will be drawn in the west slice (right-aligned). ``east`` - the scrollbar will be drawn in the east slice (left-aligned). ``center`` - the scrollbar will be drawn in the center slice. Note: in case of ``center`` slice: a) If the scrollbar should be drawn then boot menu entry's width is decreased by the scrollbar's width and the scrollbar is drawn at the right side of the center slice. b) If the scrollbar won't be drawn then the boot menu entry's width is the width of the center slice. c) We don't necessary need the menu pixmap box to display the scrollbar. @item scrollbar_left_pad @tab The left scrollbar padding in pixels. Unused if ``scrollbar_slice`` is ``west``. @item scrollbar_right_pad @tab The right scrollbar padding in pixels. Unused if ``scrollbar_slice`` is ``east``. @item scrollbar_top_pad @tab The top scrollbar padding in pixels. @item scrollbar_bottom_pad @tab The bottom scrollbar padding in pixels. @item visible @tab Set to ``false`` to hide the boot menu. @end multitable @item canvas Canvas is a container that allows manual placement of components within it. It does not alter the positions of its child components. It assigns all child components their preferred sizes. @item hbox The *hbox* container lays out its children from left to right, giving each one its preferred width. The height of each child is set to the maximum of the preferred heights of all children. @item vbox The *vbox* container lays out its children from top to bottom, giving each one its preferred height. The width of each child is set to the maximum of the preferred widths of all children. @end itemize @subsection Common properties The following properties are supported by all components: @table @samp @item left The distance from the left border of container to left border of the object in either of three formats: @multitable @columnfractions 0.2 0.7 @item x @tab Value in pixels @item p% @tab Percentage @item p%+x @tab mixture of both @end multitable @item top The distance from the left border of container to left border of the object in same format. @item width The width of object in same format. @item height The height of object in same format. @item id The identifier for the component. This can be any arbitrary string. The ID can be used by scripts to refer to various components in the GUI component tree. Currently, there is one special ID value that GRUB recognizes: @multitable @columnfractions 0.2 0.7 @item ``__timeout__`` @tab Component with this ID will be updated by GRUB and will indicate time elapsed to an automatical boot of the default entry. Affected components: ``label``, ``circular_progress``, ``progress_bar``. @end multitable @end table @node Network @chapter Booting GRUB from the network The following instructions don't work for *-emu, i386-qemu, i386-coreboot, i386-multiboot, mips_loongson, mips-arc and mips_qemu_mips To generate a netbootable directory, run: @example @group grub-mknetdir --net-directory=/srv/tftp --subdir=/boot/grub -d /usr/lib/grub/ @end group @end example E.g. for i386-pc: @example @group grub-mknetdir --net-directory=/srv/tftp --subdir=/boot/grub -d /usr/lib/grub/i386-pc @end group @end example Then follow instructions printed out by grub-mknetdir on configuring your DHCP server. The grub.cfg file is placed in the same directory as the path output by grub-mknetdir hereafter referred to as FWPATH. GRUB will search for its configuration files in order using the following rules where the appended value corresponds to a value on the client machine. @example @group @samp{(FWPATH)}/grub.cfg-@samp{(UUID OF MACHINE)} @samp{(FWPATH)}/grub.cfg-01-@samp{(MAC ADDRESS OF NIC)} @samp{(FWPATH)}/grub.cfg-@samp{(IPv4 OR IPv6 ADDRESS)} @samp{(FWPATH)}/grub.cfg @end group @end example The UUID is the Client Machine Identifier Option Definition as specified in RFC 4578. The client will only attempt to look up a UUID config file if it was provided by the DHCP server. The client will only attempt to look up an IPv6 address config once, however, it will try the IPv4 multiple times. The concrete example below shows what would happen under the IPv4 case. @example @group UUID: 7726a678-7fc0-4853-a4f6-c85ac36a120a MAC: 52:54:00:ec:33:81 IPV4: 10.0.0.130 (0A000082) @end group @end example @example @group @samp{(FWPATH)}/grub.cfg-7726a678-7fc0-4853-a4f6-c85ac36a120a @samp{(FWPATH)}/grub.cfg-01-52-54-00-ec-33-81 @samp{(FWPATH)}/grub.cfg-0A000082 @samp{(FWPATH)}/grub.cfg-0A00008 @samp{(FWPATH)}/grub.cfg-0A0000 @samp{(FWPATH)}/grub.cfg-0A000 @samp{(FWPATH)}/grub.cfg-0A00 @samp{(FWPATH)}/grub.cfg-0A0 @samp{(FWPATH)}/grub.cfg-0A @samp{(FWPATH)}/grub.cfg-0 @samp{(FWPATH)}/grub.cfg @end group @end example This feature is enabled by default but it can be disabled by setting the @samp{feature_net_search_cfg} to @samp{n}. Since this happens before the configuration file is read by GRUB, this option has to be disabled in an embedded configuration file (@pxref{Embedded configuration}). After GRUB has started, files on the TFTP server will be accessible via the @samp{(tftp)} device. The server IP address can be controlled by changing the @samp{(tftp)} device name to @samp{(tftp,@var{server-ip})}. Note that this should be changed both in the prefix and in any references to the device name in the configuration file. GRUB provides several environment variables which may be used to inspect or change the behaviour of the PXE device. In the following description @var{} is placeholder for the name of network interface (platform dependent): @table @samp @item net_@var{}_ip The network interface's IP address. Read-only. @item net_@var{}_mac The network interface's MAC address. Read-only. @item net_@var{}_clientid The client id provided by DHCP. Read-only. @item net_@var{}_clientuuid The client uuid provided by DHCP. Read-only. @item net_@var{}_hostname The client host name provided by DHCP. Read-only. @item net_@var{}_domain The client domain name provided by DHCP. Read-only. @item net_@var{}_rootpath The path to the client's root disk provided by DHCP. Read-only. @item net_@var{}_extensionspath The path to additional DHCP vendor extensions provided by DHCP. Read-only. @item net_@var{}_boot_file The boot file name provided by DHCP. Read-only. @item net_@var{}_dhcp_server_name The name of the DHCP server responsible for these boot parameters. Read-only. @item net_@var{}_next_server The IP address of the next (usually, TFTP) server provided by DHCP. Read-only. @item net_default_interface Initially set to name of network interface that was used to load grub. Read-write, although setting it affects only interpretation of @samp{net_default_ip} and @samp{net_default_mac} @item net_default_ip The IP address of default interface. Read-only. This is alias for the @samp{net_$@{net_default_interface@}_ip}. @item net_default_mac The default interface's MAC address. Read-only. This is alias for the @samp{net_$@{net_default_interface@}_mac}. @item net_default_server The default server used by network drives (@pxref{Device syntax}). Read-write, although setting this is only useful before opening a network device. @item pxe_default_server This performs the same function as @samp{net_default_server}. @end table @node Serial terminal @chapter Using GRUB via a serial line This chapter describes how to use the serial terminal support in GRUB. If you have many computers or computers with no display/keyboard, it could be very useful to control the computers through serial communications. To connect one computer with another via a serial line, you need to prepare a null-modem (cross) serial cable, and you may need to have multiport serial boards, if your computer doesn't have extra serial ports. In addition, a terminal emulator is also required, such as minicom. Refer to a manual of your operating system, for more information. As for GRUB, the instruction to set up a serial terminal is quite simple. Here is an example: @example @group grub> @kbd{serial --unit=0 --speed=9600} grub> @kbd{terminal_input serial; terminal_output serial} @end group @end example The command @command{serial} initializes the serial unit 0 with the speed 9600bps. The serial unit 0 is usually called @samp{COM1}, so, if you want to use COM2, you must specify @samp{--unit=1} instead. This command accepts many other options, @pxref{serial} for more details. Without argument or with @samp{--port=auto}, GRUB will attempt to use ACPI when available to auto-detect the default serial port and its configuration. The commands @command{terminal_input} (@pxref{terminal_input}) and @command{terminal_output} (@pxref{terminal_output}) choose which type of terminal you want to use. In the case above, the terminal will be a serial terminal, but you can also pass @code{console} to the command, as @samp{terminal_input serial console}. In this case, a terminal in which you press any key will be selected as a GRUB terminal. In the example above, note that you need to put both commands on the same command line, as you will lose the ability to type commands on the console after the first command. However, note that GRUB assumes that your terminal emulator is compatible with VT100 by default. This is true for most terminal emulators nowadays. However if your terminal emulator is not VT100-compatible or implements few VT100 escape sequences, you shoud tell GRUB that the terminal is dumb using the @command{terminfo} (@pxref{terminfo}) command. This will have GRUB provide you with an alternative menu interface, because the normal menu requires several fancy features of your terminal. @node Vendor power-on keys @chapter Using GRUB with vendor power-on keys Some laptop vendors provide an additional power-on button which boots another OS. GRUB supports such buttons with the @samp{GRUB_TIMEOUT_BUTTON}, @samp{GRUB_TIMEOUT_STYLE_BUTTON}, @samp{GRUB_DEFAULT_BUTTON}, and @samp{GRUB_BUTTON_CMOS_ADDRESS} variables in default/grub (@pxref{Simple configuration}). @samp{GRUB_TIMEOUT_BUTTON}, @samp{GRUB_TIMEOUT_STYLE_BUTTON}, and @samp{GRUB_DEFAULT_BUTTON} are used instead of the corresponding variables without the @samp{_BUTTON} suffix when powered on using the special button. @samp{GRUB_BUTTON_CMOS_ADDRESS} is vendor-specific and partially model-specific. Values known to the GRUB team are: @table @key @item Dell XPS M1330M 121:3 @item Dell XPS M1530 85:3 @item Dell Latitude E4300 85:3 @item Asus EeePC 1005PE 84:1 (unconfirmed) @item LENOVO ThinkPad T410s (2912W1C) 101:3 @end table To take full advantage of this function, install GRUB into the MBR (@pxref{Installing GRUB using grub-install}). If you have a laptop which has a similar feature and not in the above list could you figure your address and contribute? To discover the address do the following: @itemize @item boot normally @item @example sudo modprobe nvram sudo cat /dev/nvram | xxd > normal_button.txt @end example @item boot using vendor button @item @example sudo modprobe nvram sudo cat /dev/nvram | xxd > normal_vendor.txt @end example @end itemize Then compare these text files and find where a bit was toggled. E.g. in case of Dell XPS it was: @example byte 0x47: 20 --> 28 @end example It's a bit number 3 as seen from following table: @multitable @columnfractions .2 .2 @item 0 @tab 01 @item 1 @tab 02 @item 2 @tab 04 @item 3 @tab 08 @item 4 @tab 10 @item 5 @tab 20 @item 6 @tab 40 @item 7 @tab 80 @end multitable 0x47 is decimal 71. Linux nvram implementation cuts first 14 bytes of CMOS. So the real byte address in CMOS is 71+14=85 So complete address is 85:3 @node Images @chapter GRUB image files @c FIXME: parts of this section are specific to PC BIOS right now. GRUB consists of several images: a variety of bootstrap images for starting GRUB in various ways, a kernel image, and a set of modules which are combined with the kernel image to form a core image. Here is a short overview of them. @table @file @item boot.img On PC BIOS systems, this image is the first part of GRUB to start. It is written to a master boot record (MBR) or to the boot sector of a partition. Because a PC boot sector is 512 bytes, the size of this image is exactly 512 bytes. The sole function of @file{boot.img} is to read the first sector of the core image from a local disk and jump to it. Because of the size restriction, @file{boot.img} cannot understand any file system structure, so @command{grub-install} hardcodes the location of the first sector of the core image into @file{boot.img} when installing GRUB. @item diskboot.img This image is used as the first sector of the core image when booting from a hard disk. It reads the rest of the core image into memory and starts the kernel. Since file system handling is not yet available, it encodes the location of the core image using a block list format. @item cdboot.img This image is used as the first sector of the core image when booting from a CD-ROM drive. It performs a similar function to @file{diskboot.img}. @item pxeboot.img This image is used as the start of the core image when booting from the network using PXE. @xref{Network}. @item lnxboot.img This image may be placed at the start of the core image in order to make GRUB look enough like a Linux kernel that it can be booted by LILO using an @samp{image=} section. @item kernel.img This image contains GRUB's basic run-time facilities: frameworks for device and file handling, environment variables, the rescue mode command-line parser, and so on. It is rarely used directly, but is built into all core images. @item core.img This is the core image of GRUB. It is built dynamically from the kernel image and an arbitrary list of modules by the @command{grub-mkimage} program. Usually, it contains enough modules to access @file{/boot/grub}, and loads everything else (including menu handling, the ability to load target operating systems, and so on) from the file system at run-time. The modular design allows the core image to be kept small, since the areas of disk where it must be installed are often as small as 32KB. @xref{BIOS installation}, for details on where the core image can be installed on PC systems. @item *.mod Everything else in GRUB resides in dynamically loadable modules. These are often loaded automatically, or built into the core image if they are essential, but may also be loaded manually using the @command{insmod} command (@pxref{insmod}). @end table @heading For GRUB Legacy users GRUB 2 has a different design from GRUB Legacy, and so correspondences with the images it used cannot be exact. Nevertheless, GRUB Legacy users often ask questions in the terms they are familiar with, and so here is a brief guide to how GRUB 2's images relate to that. @table @file @item stage1 Stage 1 from GRUB Legacy was very similar to @file{boot.img} in GRUB 2, and they serve the same function. @item *_stage1_5 In GRUB Legacy, Stage 1.5's function was to include enough filesystem code to allow the much larger Stage 2 to be read from an ordinary filesystem. In this respect, its function was similar to @file{core.img} in GRUB 2. However, @file{core.img} is much more capable than Stage 1.5 was; since it offers a rescue shell, it is sometimes possible to recover manually in the event that it is unable to load any other modules, for example if partition numbers have changed. @file{core.img} is built in a more flexible way, allowing GRUB 2 to support reading modules from advanced disk types such as LVM and RAID. GRUB Legacy could run with only Stage 1 and Stage 2 in some limited configurations, while GRUB 2 requires @file{core.img} and cannot work without it. @item stage2 GRUB 2 has no single Stage 2 image. Instead, it loads modules from @file{/boot/grub} at run-time. @item stage2_eltorito In GRUB 2, images for booting from CD-ROM drives are now constructed using @file{cdboot.img} and @file{core.img}, making sure that the core image contains the @samp{iso9660} module. It is usually best to use the @command{grub-mkrescue} program for this. @item nbgrub There is as yet no equivalent for @file{nbgrub} in GRUB 2; it was used by Etherboot and some other network boot loaders. @item pxegrub In GRUB 2, images for PXE network booting are now constructed using @file{pxeboot.img} and @file{core.img}, making sure that the core image contains the @samp{pxe} and @samp{pxecmd} modules. @xref{Network}. @end table @node Core image size limitation @chapter Core image size limitation Heavily limited platforms: @itemize @item i386-pc (normal and PXE): the core image size (compressed) is limited by 458240 bytes. kernel.img (.text + .data + .bss, uncompressed) is limited by 392704 bytes. module size (uncompressed) + kernel.img (.text + .data, uncompressed) is limited by the size of contiguous chunk at 1M address. @item sparc64-ieee1275: kernel.img (.text + .data + .bss) + modules + 256K (stack) + 2M (heap) is limited by space available at 0x4400. On most platforms it's just 3 or 4M since ieee1275 maps only so much. @item i386-ieee1275: kernel.img (.text + .data + .bss) + modules is limited by memory available at 0x10000, at most 596K @end itemize Lightly limited platforms: @itemize @item *-xen: limited only by adress space and RAM size. @item i386-qemu: kernel.img (.text + .data + .bss) is limited by 392704 bytes. (core.img would be limited by ROM size but it's unlimited on qemu @item All EFI platforms: limited by contiguous RAM size and possibly firmware bugs @item Coreboot and multiboot. kernel.img (.text + .data + .bss) is limited by 392704 bytes. module size is limited by the size of contiguous chunk at 1M address. @item mipsel-loongson (ELF), mips(el)-qemu_mips (ELF): if uncompressed: kernel.img (.text + .data) + modules is limited by the space from 80200000 forward if compressed: kernel.img (.text + .data, uncompressed) + modules (uncompressed) + (modules + kernel.img (.text + .data)) (compressed) + decompressor is limited by the space from 80200000 forward @item mipsel-loongson (Flash), mips(el)-qemu_mips (Flash): kernel.img (.text + .data) + modules is limited by the space from 80200000 forward core.img (final) is limited by flash size (512K on yeeloong and fulooong) @item mips-arc: if uncompressed: kernel.img (.text + .data) is limited by the space from 8bd00000 forward modules + dummy decompressor is limited by the space from 8bd00000 backward if compressed: kernel.img (.text + .data, uncompressed) is limited by the space from 8bd00000 forward modules (uncompressed) + (modules + kernel.img (.text + .data)) (compressed, aligned to 1M) + 1M (decompressor + scratch space) is limited by the space from 8bd00000 backward @item powerpc-ieee1275: kernel.img (.text + .data + .bss) + modules is limited by space available at 0x200000 @end itemize @node Filesystem @chapter Filesystem syntax and semantics GRUB uses a special syntax for specifying disk drives which can be accessed by BIOS. Because of BIOS limitations, GRUB cannot distinguish between IDE, ESDI, SCSI, or others. You must know yourself which BIOS device is equivalent to which OS device. Normally, that will be clear if you see the files in a device or use the command @command{search} (@pxref{search}). @menu * Device syntax:: How to specify devices * File name syntax:: How to specify files * Block list syntax:: How to specify block lists @end menu @node Device syntax @section How to specify devices The device syntax is like this: @example @code{(@var{device}[,@var{partmap-name1}@var{part-num1}[,@var{partmap-name2}@var{part-num2}[,...]]])} @end example @samp{[]} means the parameter is optional. @var{device} depends on the disk driver in use. BIOS and EFI disks use either @samp{fd} or @samp{hd} followed by a digit, like @samp{fd0}, or @samp{cd}. AHCI, PATA (ata), crypto, USB use the name of driver followed by a number. Memdisk and host are limited to one disk and so it's referred just by driver name. RAID (md), ofdisk (ieee1275 and nand), LVM (lvm), LDM, virtio (vdsk) and arcdisk (arc) use intrinsic name of disk prefixed by driver name. Additionally just ``nand'' refers to the disk aliased as ``nand''. Conflicts are solved by suffixing a number if necessary. Commas need to be escaped. Loopback uses whatever name specified to @command{loopback} command. Hostdisk uses names specified in device.map as long as it's of the form [fhc]d[0-9]* or hostdisk/. For crypto and RAID (md) additionally you can use the syntax uuid/. For LVM additionally you can use the syntax lvmid//. @example (fd0) (hd0) (cd) (ahci0) (ata0) (crypto0) (usb0) (cryptouuid/123456789abcdef0123456789abcdef0) (mduuid/123456789abcdef0123456789abcdef0) (lvm/system-root) (lvmid/F1ikgD-2RES-306G-il9M-7iwa-4NKW-EbV1NV/eLGuCQ-L4Ka-XUgR-sjtJ-ffch-bajr-fCNfz5) (md/myraid) (md/0) (ieee1275/disk2) (ieee1275//pci@@1f\,0/ide@@d/disk@@2) (nand) (memdisk) (host) (myloop) (hostdisk//dev/sda) @end example @var{part-num} represents the partition number of @var{device}, starting from one. @var{partname} is optional but is recommended since disk may have several top-level partmaps. Specifying third and later component you can access to subpartitions. The syntax @samp{(hd0)} represents using the entire disk (or the MBR when installing GRUB), while the syntax @samp{(hd0,1)} represents using the first partition of the disk (or the boot sector of the partition when installing GRUB). @example (hd0,msdos1) (hd0,msdos1,msdos5) (hd0,msdos1,bsd3) (hd0,netbsd1) (hd0,gpt1) (hd0,1,3) @end example If you enabled the network support, the special drives @code{(@var{protocol}[,@var{server}])} are also available. Supported protocols are @samp{http} and @samp{tftp}. If @var{server} is omitted, value of environment variable @samp{net_default_server} is used. Before using the network drive, you must initialize the network. @xref{Network}, for more information. When using @samp{http} or @samp{tftp}, ports other than @samp{80} can be specified using a colon (@samp{:}) after the address. To avoid parsing conflicts, when using IPv6 addresses with custom ports, the addresses must be enclosed with square brackets (@samp{[]}), as is standard practice. @example (http,grub.example.com:31337) (http,192.0.2.1:339) (http,[2001:db8::1]:11235) @end example If you boot GRUB from a CD-ROM, @samp{(cd)} is available. @xref{Making a GRUB bootable CD-ROM}, for details. @node File name syntax @section How to specify files There are two ways to specify files, by @dfn{absolute file name} and by @dfn{block list}. An absolute file name resembles a Unix absolute file name, using @samp{/} for the directory separator (not @samp{\} as in DOS). One example is @samp{(hd0,1)/boot/grub/grub.cfg}. This means the file @file{/boot/grub/grub.cfg} in the first partition of the first hard disk. If you omit the device name in an absolute file name, GRUB uses GRUB's @dfn{root device} implicitly. So if you set the root device to, say, @samp{(hd1,1)} by the command @samp{set root=(hd1,1)} (@pxref{set}), then @code{/boot/kernel} is the same as @code{(hd1,1)/boot/kernel}. On ZFS filesystem the first path component must be @var{volume}@samp{@@}[@var{snapshot}]. So @samp{/rootvol@@snap-129/boot/grub/grub.cfg} refers to file @samp{/boot/grub/grub.cfg} in snapshot of volume @samp{rootvol} with name @samp{snap-129}. Trailing @samp{@@} after volume name is mandatory even if snapshot name is omitted. @node Block list syntax @section How to specify block lists A block list is used for specifying a file that doesn't appear in the filesystem, like a chainloader. The syntax is @code{[@var{offset}]+[@var{length}][,[@var{offset}]+[@var{length}]]@dots{}}. Here is an example: @example @code{0+100,200+1,300+300,800+} @end example This represents that GRUB should read blocks 0 through 99, block 200, blocks 300 through 599, and blocks 800 until the end of the device. If you omit an offset, then GRUB assumes the offset is zero. If the length is omitted, then GRUB assumes the block list extends until the end of the device. Like the file name syntax (@pxref{File name syntax}), if a blocklist does not contain a device name, then GRUB uses GRUB's @dfn{root device}. So @code{(hd0,2)+1} is the same as @code{+1} when the root device is @samp{(hd0,2)}. @node Interface @chapter GRUB's user interface GRUB has both a simple menu interface for choosing preset entries from a configuration file, and a highly flexible command-line for performing any desired combination of boot commands. GRUB looks for its configuration file as soon as it is loaded. If one is found, then the full menu interface is activated using whatever entries were found in the file. If you choose the @dfn{command-line} menu option, or if the configuration file was not found, then GRUB drops to the command-line interface. @menu * Command-line interface:: The flexible command-line interface * Menu interface:: The simple menu interface * Menu entry editor:: Editing a menu entry @end menu @node Command-line interface @section The flexible command-line interface The command-line interface provides a prompt and after it an editable text area much like a command-line in Unix or DOS. Each command is immediately executed after it is entered@footnote{However, this behavior will be changed in the future version, in a user-invisible way.}. The commands (@pxref{Commands}) are a subset of those available in the configuration file, used with exactly the same syntax. Cursor movement and editing of the text on the line can be done via a subset of the functions available in the Bash shell: @table @key @item C-f @itemx PC right key Move forward one character. @item C-b @itemx PC left key Move back one character. @item C-a @itemx HOME Move to the start of the line. @item C-e @itemx END Move the the end of the line. @item C-d @itemx DEL Delete the character underneath the cursor. @item C-h @itemx BS Delete the character to the left of the cursor. @item C-k Kill the text from the current cursor position to the end of the line. @item C-u Kill backward from the cursor to the beginning of the line. @item C-y Yank the killed text back into the buffer at the cursor. @item C-p @itemx PC up key Move up through the history list. @item C-n @itemx PC down key Move down through the history list. @end table When typing commands interactively, if the cursor is within or before the first word in the command-line, pressing the @key{TAB} key (or @key{C-i}) will display a listing of the available commands, and if the cursor is after the first word, the @kbd{@key{TAB}} will provide a completion listing of disks, partitions, and file names depending on the context. Note that to obtain a list of drives, one must open a parenthesis, as @command{root (}. Note that you cannot use the completion functionality in the TFTP filesystem. This is because TFTP doesn't support file name listing for the security. @node Menu interface @section The simple menu interface The menu interface is quite easy to use. Its commands are both reasonably intuitive and described on screen. Basically, the menu interface provides a list of @dfn{boot entries} to the user to choose from. Use the arrow keys to select the entry of choice, then press @key{RET} to run it. An optional timeout is available to boot the default entry (the first one if not set), which is aborted by pressing any key. Commands are available to enter a bare command-line by pressing @key{c} (which operates exactly like the non-config-file version of GRUB, but allows one to return to the menu if desired by pressing @key{ESC}) or to edit any of the @dfn{boot entries} by pressing @key{e}. If you protect the menu interface with a password (@pxref{Security}), all you can do is choose an entry by pressing @key{RET}, or press @key{p} to enter the password. Pressing @key{Ctrl-l} will refresh the menu, which can be useful when connecting via serial after the menu has been drawn. @node Menu entry editor @section Editing a menu entry The menu entry editor looks much like the main menu interface, but the lines in the menu are individual commands in the selected entry instead of entry names. If an @key{ESC} is pressed in the editor, it aborts all the changes made to the configuration entry and returns to the main menu interface. Each line in the menu entry can be edited freely, and you can add new lines by pressing @key{RET} at the end of a line. To boot the edited entry, press @key{Ctrl-x}. Although GRUB unfortunately does not support @dfn{undo}, you can do almost the same thing by just returning to the main menu using @key{ESC}. @node Environment @chapter GRUB environment variables GRUB supports environment variables which are rather like those offered by all Unix-like systems. Environment variables have a name, which is unique and is usually a short identifier, and a value, which is an arbitrary string of characters. They may be set (@pxref{set}), unset (@pxref{unset}), or looked up (@pxref{Shell-like scripting}) by name. A number of environment variables have special meanings to various parts of GRUB. Others may be used freely in GRUB configuration files. @menu * Special environment variables:: * Environment block:: @end menu @node Special environment variables @section Special environment variables These variables have special meaning to GRUB. @menu * biosnum:: * check_signatures:: * chosen:: * cmdpath:: * color_highlight:: * color_normal:: * config_directory:: * config_file:: * cryptodisk_passphrase_tries:: * debug:: * default:: * fallback:: * gfxmode:: * gfxpayload:: * gfxterm_font:: * grub_cpu:: * grub_platform:: * icondir:: * lang:: * locale_dir:: * lockdown:: * menu_color_highlight:: * menu_color_normal:: * net_@var{}_boot_file:: * net_@var{}_clientid:: * net_@var{}_clientuuid:: * net_@var{}_dhcp_server_name:: * net_@var{}_domain:: * net_@var{}_extensionspath:: * net_@var{}_hostname:: * net_@var{}_ip:: * net_@var{}_mac:: * net_@var{}_next_server:: * net_@var{}_rootpath:: * net_default_interface:: * net_default_ip:: * net_default_mac:: * net_default_server:: * pager:: * prefix:: * pxe_default_server:: * root:: * shim_lock:: * superusers:: * theme:: * timeout:: * timeout_style:: * tpm_fail_fatal:: @end menu @node biosnum @subsection biosnum When chain-loading another boot loader (@pxref{Chain-loading}), GRUB may need to know what BIOS drive number corresponds to the root device (@pxref{root}) so that it can set up registers properly. If the @var{biosnum} variable is set, it overrides GRUB's own means of guessing this. For an alternative approach which also changes BIOS drive mappings for the chain-loaded system, @pxref{drivemap}. @node check_signatures @subsection check_signatures This variable controls whether GRUB enforces digital signature validation on loaded files. @xref{Using digital signatures}. @node chosen @subsection chosen When executing a menu entry, GRUB sets the @var{chosen} variable to the title of the entry being executed. If the menu entry is in one or more submenus, then @var{chosen} is set to the titles of each of the submenus starting from the top level followed by the title of the menu entry itself, separated by @samp{>}. @node cmdpath @subsection cmdpath The location from which @file{core.img} was loaded as an absolute directory name (@pxref{File name syntax}). This is set by GRUB at startup based on information returned by platform firmware. Not every platform provides this information and some may return only device without path name. @node color_highlight @subsection color_highlight This variable contains the ``highlight'' foreground and background terminal colors, separated by a slash (@samp{/}). Setting this variable changes those colors. For the available color names, @pxref{color_normal}. The default is @samp{black/light-gray}. @node color_normal @subsection color_normal This variable contains the ``normal'' foreground and background terminal colors, separated by a slash (@samp{/}). Setting this variable changes those colors. Each color must be a name from the following list: @itemize @bullet @item black @item blue @item green @item cyan @item red @item magenta @item brown @item light-gray @item dark-gray @item light-blue @item light-green @item light-cyan @item light-red @item light-magenta @item yellow @item white @end itemize The default is @samp{light-gray/black}. The color support support varies from terminal to terminal. @samp{morse} has no color support at all. @samp{mda_text} color support is limited to highlighting by black/white reversal. @samp{console} on ARC, EMU and IEEE1275, @samp{serial_*} and @samp{spkmodem} are governed by terminfo and support only 8 colors if in modes @samp{vt100-color} (default for console on emu), @samp{arc} (default for console on ARC), @samp{ieee1275} (default for console on IEEE1275). When in mode @samp{vt100} then the color support is limited to highlighting by black/white reversal. When in mode @samp{dumb} there is no color support. When console supports no colors this setting is ignored. When console supports 8 colors, then the colors from the second half of the previous list are mapped to the matching colors of first half. @samp{console} on EFI and BIOS and @samp{vga_text} support all 16 colors. @samp{gfxterm} supports all 16 colors and would be theoretically extendable to support whole rgb24 palette but currently there is no compelling reason to go beyond the current 16 colors. @node config_directory @subsection config_directory This variable is automatically set by GRUB to the directory part of current configuration file name (@pxref{config_file}). @node config_file @subsection config_file This variable is automatically set by GRUB to the name of configuration file that is being processed by commands @command{configfile} (@pxref{configfile}) or @command{normal} (@pxref{normal}). It is restored to the previous value when command completes. @node cryptodisk_passphrase_tries @subsection cryptodisk_passphrase_tries When prompting the user for a cryptodisk passphrase, allow this many attempts before giving up. Defaults to @samp{3} if unset or set to an invalid value. (The user can give up early by entering an empty passphrase.) @node debug @subsection debug This variable may be set to enable debugging output from various components of GRUB. The value is an ordered list of debug facility names separated by whitespace or @samp{,}. If the special facility named @samp{all} is present then debugging output of all facility names is enabled at the start of processing the value of this variable. A facility's debug output can then be disabled by prefixing its name with a @samp{-}. The last occurence facility name with or without a leading @samp{-} takes precendent over any previous occurence. This allows the easy enabling or disabling of facilities by appending a @samp{,} and then the facility name with or without the leading @samp{-}, which will preserve the state of the rest of the facilities. The facility names are the first argument to grub_dprintf. Consult the source for more details. @node default @subsection default If this variable is set, it identifies a menu entry that should be selected by default, possibly after a timeout (@pxref{timeout}). The entry may be identified by number (starting from 0 at each level of the hierarchy), by title, or by id. For example, if you have: @verbatim menuentry 'Example GNU/Linux distribution' --class gnu-linux --id example-gnu-linux { ... } @end verbatim then you can make this the default using: @example default=example-gnu-linux @end example If the entry is in a submenu, then it must be identified using the number, title, or id of each of the submenus starting from the top level, followed by the number, title, or id of the menu entry itself, with each element separated by @samp{>}. For example, take the following menu structure: @example GNU/Hurd --id gnu-hurd Standard Boot --id=gnu-hurd-std Rescue shell --id=gnu-hurd-rescue Other platforms --id=other Minix --id=minix Version 3.4.0 --id=minix-3.4.0 Version 3.3.0 --id=minix-3.3.0 GRUB Invaders --id=grub-invaders @end example The more recent release of Minix would then be identified as @samp{Other platforms>Minix>Version 3.4.0}, or as @samp{1>0>0}, or as @samp{other>minix>minix-3.4.0}. This variable is often set by @samp{GRUB_DEFAULT} (@pxref{Simple configuration}), @command{grub-set-default}, or @command{grub-reboot}. @node fallback @subsection fallback If this variable is set, it identifies a menu entry that should be selected if the default menu entry fails to boot. Entries are identified in the same way as for @samp{default} (@pxref{default}). @node gfxmode @subsection gfxmode If this variable is set, it sets the resolution used on the @samp{gfxterm} graphical terminal. Note that you can only use modes which your graphics card supports via VESA BIOS Extensions (VBE), so for example native LCD panel resolutions may not be available. The default is @samp{auto}, which selects a platform-specific default that should look reasonable. Supported modes can be listed by @samp{videoinfo} command in GRUB. The resolution may be specified as a sequence of one or more modes, separated by commas (@samp{,}) or semicolons (@samp{;}); each will be tried in turn until one is found. Each mode should be either @samp{auto}, @samp{@var{width}x@var{height}}, or @samp{@var{width}x@var{height}x@var{depth}}. @node gfxpayload @subsection gfxpayload If this variable is set, it controls the video mode in which the Linux kernel starts up, replacing the @samp{vga=} boot option (@pxref{linux}). It may be set to @samp{text} to force the Linux kernel to boot in normal text mode, @samp{keep} to preserve the graphics mode set using @samp{gfxmode}, or any of the permitted values for @samp{gfxmode} to set a particular graphics mode (@pxref{gfxmode}). Depending on your kernel, your distribution, your graphics card, and the phase of the moon, note that using this option may cause GNU/Linux to suffer from various display problems, particularly during the early part of the boot sequence. If you have problems, set this variable to @samp{text} and GRUB will tell Linux to boot in normal text mode. The default is platform-specific. On platforms with a native text mode (such as PC BIOS platforms), the default is @samp{text}. Otherwise the default may be @samp{auto} or a specific video mode. This variable is often set by @samp{GRUB_GFXPAYLOAD_LINUX} (@pxref{Simple configuration}). @node gfxterm_font @subsection gfxterm_font If this variable is set, it names a font to use for text on the @samp{gfxterm} graphical terminal. Otherwise, @samp{gfxterm} may use any available font. @node grub_cpu @subsection grub_cpu In normal mode (@pxref{normal}), GRUB sets the @samp{grub_cpu} variable to the CPU type for which GRUB was built (e.g. @samp{i386} or @samp{powerpc}). @node grub_platform @subsection grub_platform In normal mode (@pxref{normal}), GRUB sets the @samp{grub_platform} variable to the platform for which GRUB was built (e.g. @samp{pc} or @samp{efi}). @node icondir @subsection icondir If this variable is set, it names a directory in which the GRUB graphical menu should look for icons after looking in the theme's @samp{icons} directory. @xref{Theme file format}. @node lang @subsection lang If this variable is set, it names the language code that the @command{gettext} command (@pxref{gettext}) uses to translate strings. For example, French would be named as @samp{fr}, and Simplified Chinese as @samp{zh_CN}. @command{grub-mkconfig} (@pxref{Simple configuration}) will try to set a reasonable default for this variable based on the system locale. @node locale_dir @subsection locale_dir If this variable is set, it names the directory where translation files may be found (@pxref{gettext}), usually @file{/boot/grub/locale}. Otherwise, internationalization is disabled. @command{grub-mkconfig} (@pxref{Simple configuration}) will set a reasonable default for this variable if internationalization is needed and any translation files are available. @node lockdown @subsection lockdown If this variable is set to @samp{y}, it means that GRUB has entered @pxref{Lockdown} mode. @node menu_color_highlight @subsection menu_color_highlight This variable contains the foreground and background colors to be used for the highlighted menu entry, separated by a slash (@samp{/}). Setting this variable changes those colors. For the available color names, @pxref{color_normal}. The default is the value of @samp{color_highlight} (@pxref{color_highlight}). @node menu_color_normal @subsection menu_color_normal This variable contains the foreground and background colors to be used for non-highlighted menu entries, separated by a slash (@samp{/}). Setting this variable changes those colors. For the available color names, @pxref{color_normal}. The default is the value of @samp{color_normal} (@pxref{color_normal}). @node net_@var{}_boot_file @subsection net_@var{}_boot_file @xref{Network}. @node net_@var{}_clientid @subsection net_@var{}_clientid @xref{Network}. @node net_@var{}_clientuuid @subsection net_@var{}_clientuuid @xref{Network}. @node net_@var{}_dhcp_server_name @subsection net_@var{}_dhcp_server_name @xref{Network}. @node net_@var{}_domain @subsection net_@var{}_domain @xref{Network}. @node net_@var{}_extensionspath @subsection net_@var{}_extensionspath @xref{Network}. @node net_@var{}_hostname @subsection net_@var{}_hostname @xref{Network}. @node net_@var{}_ip @subsection net_@var{}_ip @xref{Network}. @node net_@var{}_mac @subsection net_@var{}_mac @xref{Network}. @node net_@var{}_next_server @subsection net_@var{}_next_server @xref{Network}. @node net_@var{}_rootpath @subsection net_@var{}_rootpath @xref{Network}. @node net_default_interface @subsection net_default_interface @xref{Network}. @node net_default_ip @subsection net_default_ip @xref{Network}. @node net_default_mac @subsection net_default_mac @xref{Network}. @node net_default_server @subsection net_default_server @xref{Network}. @node pager @subsection pager If set to @samp{1}, pause output after each screenful and wait for keyboard input. The default is not to pause output. @node prefix @subsection prefix The location of the @samp{/boot/grub} directory as an absolute file name (@pxref{File name syntax}). This is normally set by GRUB at startup based on information provided by @command{grub-install}. GRUB modules are dynamically loaded from this directory, so it must be set correctly in order for many parts of GRUB to work. @node pxe_default_server @subsection pxe_default_server @xref{Network}. @node root @subsection root The root device name (@pxref{Device syntax}). Any file names that do not specify an explicit device name are read from this device. The default is normally set by GRUB at startup based on the value of @samp{prefix} (@pxref{prefix}). For example, if GRUB was installed to the first partition of the first hard disk, then @samp{prefix} might be set to @samp{(hd0,msdos1)/boot/grub} and @samp{root} to @samp{hd0,msdos1}. @node shim_lock @subsection shim_lock If this variable is set to @samp{y}, it means that the shim_lock verifier is registered (see @pxref{UEFI secure boot and shim}). @node superusers @subsection superusers This variable may be set to a list of superuser names to enable authentication support. @xref{Security}. @node theme @subsection theme This variable may be set to a directory containing a GRUB graphical menu theme. @xref{Theme file format}. This variable is often set by @samp{GRUB_THEME} (@pxref{Simple configuration}). @node timeout @subsection timeout If this variable is set, it specifies the time in seconds to wait for keyboard input before booting the default menu entry. A timeout of @samp{0} means to boot the default entry immediately without displaying the menu; a timeout of @samp{-1} (or unset) means to wait indefinitely. If @samp{timeout_style} (@pxref{timeout_style}) is set to @samp{countdown} or @samp{hidden}, the timeout is instead counted before the menu is displayed. This variable is often set by @samp{GRUB_TIMEOUT} (@pxref{Simple configuration}). @node timeout_style @subsection timeout_style This variable may be set to @samp{menu}, @samp{countdown}, or @samp{hidden} to control the way in which the timeout (@pxref{timeout}) interacts with displaying the menu. See the documentation of @samp{GRUB_TIMEOUT_STYLE} (@pxref{Simple configuration}) for details. @node tpm_fail_fatal @subsection tpm_fail_fatal If this variable is set and true (i.e., not set to ``0'', ``false'', ``disable'', or ``no''), TPM measurements that fail will be treated as fatal. Otherwise, they will merely be debug-logged and boot will continue. Call to EFI firmware, like hash_log_extend_event(), can return an unknown error, i.e. due to bug present in firmware. When this variable is set and true (same values as with TPM measurements) this situation will be considered to be fatal and error-logged as ``unknown TPM error''. If not set, booting the OS will be enabled. @node Environment block @section The GRUB environment block It is often useful to be able to remember a small amount of information from one boot to the next. For example, you might want to set the default menu entry based on what was selected the last time. GRUB deliberately does not implement support for writing files in order to minimise the possibility of the boot loader being responsible for file system corruption, so a GRUB configuration file cannot just create a file in the ordinary way. However, GRUB provides an ``environment block'' which can be used to save a small amount of state. The environment block is a preallocated 1024-byte file, which normally lives in @file{/boot/grub/grubenv} (although you should not assume this). At boot time, the @command{load_env} command (@pxref{load_env}) loads environment variables from it, and the @command{save_env} (@pxref{save_env}) command saves environment variables to it. From a running system, the @command{grub-editenv} utility can be used to edit the environment block. For safety reasons, this storage is only available when installed on a plain disk (no LVM or RAID), using a non-checksumming filesystem (no ZFS), and using BIOS or EFI functions (no ATA, USB or IEEE1275). @command{grub-mkconfig} uses this facility to implement @samp{GRUB_SAVEDEFAULT} (@pxref{Simple configuration}). @node Modules @chapter Modules In this chapter, we list all modules that are available in GRUB. Modules can be loaded via the @command{insmod} (@pxref{insmod}) command. @menu * acpi_module:: * adler32_module:: * affs_module:: * afs_module:: * afsplitter_module:: * ahci_module:: * all_video_module:: * aout_module:: * appleldr_module:: * archelp_module:: * at_keyboard_module:: * ata_module:: * backtrace_module:: * bfs_module:: * biosdisk_module:: * bitmap_module:: * bitmap_scale_module:: * bli_module:: * blocklist_module:: * boot_module:: * boottime_module:: * bsd_module:: * bswap_test_module:: * btrfs_module:: * bufio_module:: * cacheinfo_module:: * cat_module:: * cbfs_module:: * cbls_module:: * cbmemc_module:: * cbtable_module:: * cbtime_module:: * chain_module:: * cmdline_cat_test_module:: * cmosdump_module:: * cmostest_module:: * cmp_module:: * cmp_test_module:: * configfile_module:: * cpio_module:: * cpio_be_module:: * cpuid_module:: * crc64_module:: * crypto_module:: * cryptodisk_module:: * cs5536_module:: * ctz_test_module:: * date_module:: * datehook_module:: * datetime_module:: * disk_module:: * diskfilter_module:: * div_module:: * div_test_module:: * dm_nv_module:: * drivemap_module:: * echo_module:: * efi_gop_module:: * efi_uga_module:: * efiemu_module:: * efifwsetup_module:: * efinet_module:: * efitextmode_module:: * ehci_module:: * elf_module:: * emunet_module:: * emupci_module:: * erofs_module:: * escc_module:: * eval_module:: * exfat_module:: * exfctest_module:: * ext2_module:: * extcmd_module:: * f2fs_module:: * fat_module:: * fdt_module:: * file_module:: * fixvideo_module:: * font_module:: * freedos_module:: * fshelp_module:: * functional_test_module:: * gcry_arcfour_module:: * gcry_blowfish_module:: * gcry_camellia_module:: * gcry_cast5_module:: * gcry_crc_module:: * gcry_des_module:: * gcry_dsa_module:: * gcry_idea_module:: * gcry_md4_module:: * gcry_md5_module:: * gcry_rfc2268_module:: * gcry_rijndael_module:: * gcry_rmd160_module:: * gcry_rsa_module:: * gcry_seed_module:: * gcry_serpent_module:: * gcry_sha1_module:: * gcry_sha256_module:: * gcry_sha512_module:: * gcry_tiger_module:: * gcry_twofish_module:: * gcry_whirlpool_module:: * gdb_module:: * geli_module:: * gettext_module:: * gfxmenu_module:: * gfxterm_module:: * gfxterm_background_module:: * gfxterm_menu_module:: * gptsync_module:: * gzio_module:: * halt_module:: * hashsum_module:: * hdparm_module:: * hello_module:: * help_module:: * hexdump_module:: * hfs_module:: * hfsplus_module:: * hfspluscomp_module:: * http_module:: * ieee1275_fb_module:: * iorw_module:: * iso9660_module:: * jfs_module:: * jpeg_module:: * json_module:: * keylayouts_module:: * keystatus_module:: * ldm_module:: * legacy_password_test_module:: * legacycfg_module:: * linux_module:: * linux16_module:: * loadbios_module:: * loadenv_module:: * loopback_module:: * ls_module:: * lsacpi_module:: * lsapm_module:: * lsdev_module:: * lsefi_module:: * lsefimmap_module:: * lsefisystab_module:: * lsmmap_module:: * lspci_module:: * lssal_module:: * lsspd_module:: * lsxen_module:: * luks_module:: * luks2_module:: * lvm_module:: * lzopio_module:: * macbless_module:: * macho_module:: * mda_text_module:: * mdraid09_module:: * mdraid09_be_module:: * mdraid1x_module:: * memdisk_module:: * memrw_module:: * memtools_module:: * minicmd_module:: * minix_module:: * minix2_module:: * minix2_be_module:: * minix3_module:: * minix3_be_module:: * minix_be_module:: * mmap_module:: * morse_module:: * mpi_module:: * msdospart_module:: * mul_test_module:: * multiboot_module:: * multiboot2_module:: * nand_module:: * nativedisk_module:: * net_module:: * newc_module:: * nilfs2_module:: * normal_module:: * ntfs_module:: * ntfscomp_module:: * ntldr_module:: * odc_module:: * offsetio_module:: * ofnet_module:: * ohci_module:: * part_acorn_module:: * part_amiga_module:: * part_apple_module:: * part_bsd_module:: * part_dfly_module:: * part_dvh_module:: * part_gpt_module:: * part_msdos_module:: * part_plan_module:: * part_sun_module:: * part_sunpc_module:: * parttool_module:: * password_module:: * password_pbkdf2_module:: * pata_module:: * pbkdf2_module:: * pbkdf2_test_module:: * pci_module:: * pcidump_module:: * pgp_module:: * plainmount_module:: * plan9_module:: * play_module:: * png_module:: * priority_queue_module:: * probe_module:: * procfs_module:: * progress_module:: * pxe_module:: * pxechain_module:: * raid5rec_module:: * raid6rec_module:: * random_module:: * rdmsr_module:: * read_module:: * reboot_module:: * regexp_module:: * reiserfs_module:: * relocator_module:: * romfs_module:: * scsi_module:: * sdl_module:: * search_module:: * search_fs_file_module:: * search_fs_uuid_module:: * search_label_module:: * sendkey_module:: * serial_module:: * setjmp_module:: * setjmp_test_module:: * setpci_module:: * sfs_module:: * shift_test_module:: * signature_test_module:: * sleep_module:: * sleep_test_module:: * smbios_module:: * spkmodem_module:: * squash4_module:: * strtoull_test_module:: * suspend_module:: * syslinuxcfg_module:: * tar_module:: * terminal_module:: * terminfo_module:: * test_module:: * test_blockarg_module:: * testload_module:: * testspeed_module:: * tftp_module:: * tga_module:: * time_module:: * tpm_module:: * tr_module:: * trig_module:: * true_module:: * truecrypt_module:: * ubootnet_module:: * udf_module:: * ufs1_module:: * ufs1_be_module:: * ufs2_module:: * uhci_module:: * usb_module:: * usb_keyboard_module:: * usbms_module:: * usbserial_common_module:: * usbserial_ftdi_module:: * usbserial_pl2303_module:: * usbserial_usbdebug_module:: * usbtest_module:: * vbe_module:: * verifiers_module:: * vga_module:: * vga_text_module:: * video_module:: * video_bochs_module:: * video_cirrus_module:: * video_colors_module:: * video_fb_module:: * videoinfo_module:: * videotest_module:: * videotest_checksum_module:: * wrmsr_module:: * xen_boot_module:: * xfs_module:: * xnu_module:: * xnu_uuid_module:: * xnu_uuid_test_module:: * xzio_module:: * zfs_module:: * zfscrypt_module:: * zfsinfo_module:: * zstd_module:: @end menu @node acpi_module @section acpi This module provides the command @command{acpi} for loading / replacing Advanced Configuration and Power Interface (ACPI) tables. Please @pxref{acpi} for more information. @node adler32_module @section adler32 This module provides the library implementation for the adler32 checksum. This is used as part of LZO decompression / compression. @node affs_module @section affs This module provides support for the Amiga Fast FileSystem (AFFS). Note: This module is not allowed in lockdown mode, @pxref{Lockdown} for more information. @node afs_module @section afs This module provides support for the AtheOS File System (AFS). Note: This module is not allowed in lockdown mode, @pxref{Lockdown} for more information. @node afsplitter_module @section afsplitter This module provides library support for the Anti forensic information splitter (AFS) operation @code{AF_merge}. This is used by LUKS and LUKS2. @node ahci_module @section ahci This module provides support for the Advanced Host Controller Interface protocol to access disks supporting this standard. AHCI is often an option for Serial ATA (SATA) controllers (meant to replace the older IDE protocol). @node all_video_module @section all_video This is a "dummy module" with no actual function except to load all other video modules as dependencies (a convenient way to load all video modules). @node aout_module @section aout This module provides support for loading files packaged in the "a.out" format. The "a.out" format is considered to be an older format than some alternatives such as "ELF", for example support for the "a.out" format was removed from the Linux kernel in 5.18. @node appleldr_module @section appleldr This module provides support for loading files on a BIOS / EFI based Apple Mac computer (Intel based Macs). @node archelp_module @section archelp This module provides Archive Helper functions for archive based file systems such as TAR and CPIO archives. @node at_keyboard_module @section at_keyboard This module provides support for the AT keyboard input for the GRUB terminal. @node ata_module @section ata This modules provides support for direct ATA and ATAPI access to compatible disks. @node backtrace_module @section backtrace This module provides the command @command{backtrace} for printing a backtrace to the terminal for the current call stack. @node bfs_module @section bfs This module provides support for the BeOS "Be File System" (BFS). Note: This module is not allowed in lockdown mode, @pxref{Lockdown} for more information. @node biosdisk_module @section biosdisk This module provides support for booting from a bootable removable disk such as a CD-ROM, BD-ROM, etc. @node bitmap_module @section bitmap This module provides support for reading and interacting with bitmap image files. @node bitmap_scale_module @section bitmap_scale This module provides support for scaling bitmap image files. @node bli_module @section bli This module provides basic support for the Boot Loader Interface. The Boot Loader Interface specifies a set of EFI variables that are used to communicate boot-time information between the bootloader and the operating system. The following variables are placed under the vendor UUID @code{4a67b082-0a4c-41cf-b6c7-440b29bb8c4f} when the module is loaded: The GPT partition UUID of the EFI System Partition used during boot is published via the @code{LoaderDevicePartUUID} variable. The Boot Loader Interface specification requires GPT formatted drives. The bli module ignores drives/partitions in any other format. If GRUB is loaded from a non-GPT partition, e.g. from an MSDOS formatted drive or network, this variable will not be set. A string identifying GRUB as the active bootloader including the version number is stored in @code{LoaderInfo}. This module is only available on UEFI platforms. @node blocklist_module @section blocklist This module provides support for the command @command{blocklist} to list blocks for a given file. Please @pxref{blocklist} for more information. @node boot_module @section boot This module provides support for the command @command{boot} to boot an operating system. Please @pxref{boot} for more information. @node boottime_module @section boottime This module provides support for the command @command{boottime} to display time taken to perform various GRUB operations. This module is only available when GRUB is built with the conditional compile option @code{BOOT_TIME_STATS}. @node bsd_module @section bsd This module provides support for loading BSD operating system images via commands such as: @command{kfreebsd_loadenv}, @command{kfreebsd_module_elf}, @command{kfreebsd_module}, @command{kfreebsd}, @command{knetbsd_module_elf}, @command{knetbsd_module}, @command{knetbsd}, @command{kopenbsd}, and @command{kopenbsd_ramdisk}. Please @pxref{Loader commands} for more info. @node bswap_test_module @section bswap_test This module is intended for performing a functional test of the byte swapping functionality of GRUB. @node btrfs_module @section btrfs This module provides support for the B-Tree File System (BTRFS). @node bufio_module @section bufio This module is a library module for support buffered I/O of files to support file reads performed in other modules. @node cacheinfo_module @section cacheinfo This module provides support for the command @command{cacheinfo} which provides statistics on disk cache accesses. This module is only built if @code{DISK_CACHE_STATS} is enabled. @node cat_module @section cat This module provides support for the command @command{cat} which outputs the content of a file to the terminal. Please @pxref{cat} for more info. @node cbfs_module @section cbfs This module provides support for the Coreboot File System (CBFS) which is an archive based file system. Note: This module is not allowed in lockdown mode, @pxref{Lockdown} for more information. @node cbls_module @section cbls This module provides support for the command @command{lscoreboot} to list the Coreboot tables. @node cbmemc_module @section cbmemc This module provides support for the command @command{cbmemc} to show the content of the Coreboot Memory console. @node cbtable_module @section cbtable This module provides support for accessing the Coreboot tables. @node cbtime_module @section cbtime This module provides support for the command @command{coreboot_boottime} to show the Coreboot boot time statistics. @node chain_module @section chain This module provides support for the command @command{chainloader} to boot another bootloader. Please @pxref{chainloader} for more information. @node cmdline_cat_test_module @section cmdline_cat_test This module is intended for performing a functional test of the @command{cat} command of GRUB. @node cmosdump_module @section cmosdump This module provides support for the command @command{cmosdump} to show a raw dump of the CMOS contents. Please @pxref{cmosdump} for more information. @node cmostest_module @section cmostest This module provides support for the commands @command{cmostest}, @command{cmosclean}, and @command{cmosset} to interact with a CMOS. @xref{cmostest} / @pxref{cmosclean} for more information. @node cmp_module @section cmp This module provides support for the command @command{cmp} to compare the content of two files. @xref{cmp} for more information. @node cmp_test_module @section cmp_test This module is intended for performing a functional test of relational operations in GRUB. Note that this module is *not* associated with the @command{cmp} command and does not test the @command{cmp} command. @node configfile_module @section configfile This module provides support for the commands: @command{configfile}, @command{source}, @command{extract_entries_source}, @command{extract_entries_configfile}, @command{.} (dot command). @xref{configfile} / @pxref{source}. @node cpio_module @section cpio This module provides support for the CPIO archive file format. This module is for the "bin" version of CPIO (default of GNU CPIO) supporting around 2GB. @node cpio_be_module @section cpio_be This module provides support for the CPIO archive file format in big-endian format. This module is for the "bin" version of CPIO (default of GNU CPIO) supporting around 2GB. @node cpuid_module @section cpuid This module provides support for the command @command{cpuid} to test for various CPU features. @xref{cpuid} for more information. @node crc64_module @section crc64 This module provides support for the CRC64 operation. @node crypto_module @section crypto This module provides library support for various base cryptography operations in GRUB. @node cryptodisk_module @section cryptodisk This module provides support for the command @command{cryptomount} to interact with encrypted file systems. @xref{cryptomount} for more information. @node cs5536_module @section cs5536 This module provides support for the AMD Geode CS5536 companion device. @node ctz_test_module @section ctz_test This module is intended for performing a functional test of the ctz functions in GRUB used to Count Trailing Zeros. @node date_module @section date This module provides support for the command @command{date} to get the date/time or set the date/time. @xref{date} for more information. @node datehook_module @section datehook This module provides support for populating / providing the environment variables @code{YEAR}, @code{MONTH}, @code{DAY}, @code{HOUR}, @code{MINUTE}, @code{SECOND}, @code{WEEKDAY}. @node datetime_module @section datetime This module provides library support for getting and setting the date / time from / to a hardware clock device. @node disk_module @section disk This module provides library support for writing to a storage disk. @node diskfilter_module @section diskfilter This module provides library support for reading a disk RAID array. It also provides support for the command @command{cryptocheck}. @xref{cryptocheck} for more information. @node div_module @section div This module provides library support for some operations such as divmod. @node div_test_module @section div_test This module is intended for performing a functional test of the divmod function in GRUB. @node dm_nv_module @section dm_nv This module provides support for handling some Nvidia "fakeraid" disk devices. @node drivemap_module @section drivemap This module provides support for the @command{drivemap} to manage BIOS drive mappings. @xref{drivemap} for more information. @node echo_module @section echo This module provides support for the @command{echo} to display a line of text. @xref{echo} for more information. @node efi_gop_module @section efi_gop This module provides support for the UEFI video output protocol "Graphics Output Protocol" (GOP). @node efi_uga_module @section efi_uga This module provides support for the EFI video protocol "Universal Graphic Adapter" (UGA). @node efiemu_module @section efiemu This module provides support for the commands @command{efiemu_loadcore}, @command{efiemu_prepare}, and @command{efiemu_unload}. This provides an EFI emulation. @node efifwsetup_module @section efifwsetup This modules provides support for the command @command{fwsetup} to reboot into the firmware setup menu. @xref{fwsetup} for more information. @node efinet_module @section efinet This module provides support for UEFI Network Booting for loading images and data from the network. @node efitextmode_module @section efitextmode This module provides support for command @command{efitextmode} to get and set output mode resolution. @xref{efitextmode} for more information. @node ehci_module @section ehci This module provides support for the USB Enhanced Host Controller Interface (EHCI) specification (USB 2.0). @node elf_module @section elf This module provides support for loading Executable and Linkable Format (ELF) files. @node emunet_module @section emunet This module provides support for networking in GRUB on the emu platform. @node emupci_module @section emupci This module provides support for accessing the PCI bus in GRUB on the emu platform. @node erofs_module @section erofs This module provides support for the Enhanced Read Only File System (EROFS). @node escc_module @section escc This module provides support for the "mac-io" terminal device on PowerPC. @node eval_module @section eval This module provides support for command @command{eval} to evaluate the provided input as a sequence of GRUB commands. @xref{eval} for more information. @node exfat_module @section exfat This module provides support for the Extensible File Allocation Table (exFAT) file system in GRUB. @node exfctest_module @section exfctest This module is intended to provide an Example Functional Test of GRUB functions to use as a template for developing other GRUB functional tests. @node ext2_module @section ext2 This module provides support for the Extended File System versions 2, 3, and 4 (ext2, ext3, and ext4) file systems in GRUB. @node extcmd_module @section extcmd This module is a support module to provide wrapper functions for registering other module commands depending on the state of the lockdown variable. @node f2fs_module @section f2fs This module provides support for the Flash-Friendly File System (F2FS) in GRUB. @node fat_module @section fat This module provides support for the File Allocation Table 12-bit, 16-bit, and 32-bit (FAT12, FAT16, and FAT32) file systems in GRUB. @node fdt_module @section fdt This module provides support for the commands @command{fdtdump} and @command{devicetree} to dump the contents of a device tree blob (.dtb) to the console and to load a device tree blob (.dtb) from a filesystem, for later use by a Linux kernel, respectively. @xref{devicetree} and @pxref{fdtdump} for more information. @node file_module @section file This module provides support for the command @command{file} to test if the provided filename is of the specified type. @xref{file} for more information. @node fixvideo_module @section fixvideo This module provides support for the command @command{fix_video} to fix video problems in specific PCIe video devices by "patching" specific device register settings. Currently supports Intel 945GM (PCI ID @code{0x27a28086}) and Intel 965GM (PCI ID @code{0x2a028086}). @node font_module @section font This module provides support for the commands @command{loadfont} and @command{lsfonts} to load a given font or list the loaded fonts. @xref{loadfont} and @pxref{lsfonts} for more information. @node freedos_module @section freedos This module provides support for command @command{freedos} for loading a FreeDOS kernel. @node fshelp_module @section fshelp This module provides support functions (helper functions) for file systems. @node functional_test_module @section functional_test This module provides support for running the GRUB functional tests using commands @command{functional_test} and @command{all_functional_test}. @node gcry_arcfour_module @section gcry_arcfour This module provides support for the arcfour stream cipher also known as RC4. If security is a concern, RC4 / arcfour cipher is consider broken (multiple known vulnerabilities make this insecure). This GRUB module is based on libgcrypt. @node gcry_blowfish_module @section gcry_blowfish This module provides support for the Blowfish cipher. This GRUB module is based on libgcrypt. @node gcry_camellia_module @section gcry_camellia This module provides support for the Camellia cipher. This GRUB module is based on libgcrypt. @node gcry_cast5_module @section gcry_cast5 This module provides support for the CAST5 (RFC2144, also known as CAST-128) cipher. This GRUB module is based on libgcrypt. @node gcry_crc_module @section gcry_crc This module provides support for the CRC32, CRC32 RFC1510, and CRC24 RFC2440 cyclic redundancy checks. This GRUB module is based on libgcrypt. @node gcry_des_module @section gcry_des This module provides support for the Data Encryption Standard (DES) and Triple-DES ciphers. If security is a concern, DES has known vulnerabilities and is not recommended, and Triple-DES is no longer recommended by NIST. This GRUB module is based on libgcrypt. @node gcry_dsa_module @section gcry_dsa This module provides support for the Digital Signature Algorithm (DSA) cipher. This GRUB module is based on libgcrypt. @node gcry_idea_module @section gcry_idea This module provides support for the International Data Encryption Algorithm (IDEA) cipher. This GRUB module is based on libgcrypt. @node gcry_md4_module @section gcry_md4 This module provides support for the Message Digest 4 (MD4) message digest. If security is a concern, MD4 has known vulnerabilities and is not recommended. This GRUB module is based on libgcrypt. @node gcry_md5_module @section gcry_md5 This module provides support for the Message Digest 5 (MD5) message digest. If security is a concern, MD5 has known vulnerabilities and is not recommended. This GRUB module is based on libgcrypt. @node gcry_rfc2268_module @section gcry_rfc2268 This module provides support for the RFC2268 (RC2 / Ron's Cipher 2) cipher. If security is a concern, RC2 has known vulnerabilities and is not recommended. This GRUB module is based on libgcrypt. @node gcry_rijndael_module @section gcry_rijndael This module provides support for the Advanced Encryption Standard (AES-128, AES-192, and AES-256) ciphers. This GRUB module is based on libgcrypt. @node gcry_rmd160_module @section gcry_rmd160 This module provides support for the RIPEMD-160 message digest. This GRUB module is based on libgcrypt. @node gcry_rsa_module @section gcry_rsa This module provides support for the Rivest–Shamir–Adleman (RSA) cipher. This GRUB module is based on libgcrypt. @node gcry_seed_module @section gcry_seed This module provides support for the SEED cipher. This GRUB module is based on libgcrypt. @node gcry_serpent_module @section gcry_serpent This module provides support for the Serpent (128, 192, and 256) ciphers. This GRUB module is based on libgcrypt. @node gcry_sha1_module @section gcry_sha1 This module provides support for the Secure Hash Algorithm 1 (SHA-1) message digest. If security is a concern, SHA-1 has known vulnerabilities and is not recommended. This GRUB module is based on libgcrypt. @node gcry_sha256_module @section gcry_sha256 This module provides support for the Secure Hash Algorithm 2 (224 and 256 bit) (SHA-224 / SHA-256) message digests. This GRUB module is based on libgcrypt. @node gcry_sha512_module @section gcry_sha512 This module provides support for the Secure Hash Algorithm 2 (384 and 512 bit) (SHA-384 / SHA-512) message digests. This GRUB module is based on libgcrypt. @node gcry_tiger_module @section gcry_tiger This module provides support for the Tiger, Tiger 1, and Tiger 2 message digests. This GRUB module is based on libgcrypt. @node gcry_twofish_module @section gcry_twofish This module provides support for the Twofish (128 and 256) ciphers. This GRUB module is based on libgcrypt. @node gcry_whirlpool_module @section gcry_whirlpool This module provides support for the Whirlpool message digest. This GRUB module is based on libgcrypt. @node gdb_module @section gdb This module provides support for remotely debugging GRUB using the GNU Debugger (GDB) over serial. This is typically done when troubleshooting GRUB during development and not required for normal GRUB operation. This module adds support for commands required by the GDB remote debug function including @command{gdbstub} to start GDB stub on given serial port, @command{gdbstub_break} to break into GDB, @command{gdbstub_stop} to stop the GDB stub. @node geli_module @section geli This module provides support for the GEOM ELI (GELI) disk encryption / decryption protocol used by FreeBSD. This module supports the following ciphers using the associated "gcry" modules: DES, Triple-DES, Blowfish, CAST5, AES, and Camellia 128. @node gettext_module @section gettext This module provides support for the @command{gettext} command to support translating information displayed / output by GRUB. @xref{gettext} for more information. @node gfxmenu_module @section gfxmenu This module provides support for displaying a graphical menu / user interface from GRUB. This includes features such as graphical font support, theme support, image support, and icon support. @node gfxterm_module @section gfxterm This module provides support for displaying a terminal and menu interface from GRUB using graphics mode. @node gfxterm_background_module @section gfxterm_background This module provides support for setting the gfxterm background color and background image using commands @command{background_color} and @command{background_image}. @xref{background_color} and @pxref{background_image} for more information. @node gfxterm_menu_module @section gfxterm_menu This module is intended for performing a functional test of the gfxmenu function in GRUB. @node gptsync_module @section gptsync This module provides support for the @command{gptsync} command.. @xref{gptsync} for more information. @node gzio_module @section gzio This module provides support for decompression (inflate) of files compressed with the GZ compression algorithm. This supports only the "DEFLATE" method for GZIP. Unsupported flags (will result in failure to inflate) include: @code{GRUB_GZ_CONTINUATION}, @code{GRUB_GZ_ENCRYPTED}, @code{GRUB_GZ_RESERVED}, and @code{GRUB_GZ_EXTRA_FIELD}. @node halt_module @section halt This module provides support for the @command{halt} command to shutdown / halt the system. @xref{halt} for more information. @node hashsum_module @section hashsum This module provide support for the commands @command{hashsum}, @command{md5sum}, @command{sha1sum}, @command{sha256sum}, @command{sha512sum}, and @command{crc} to calculate or check hashes of files using various methods. @xref{hashsum}, @pxref{md5sum} @pxref{sha1sum}, @pxref{sha256sum}, @pxref{sha512sum}, and @pxref{crc}. @node hdparm_module @section hdparm This module provides support for the @command{hdparm} command to get or set various ATA disk parameters. This includes controlling Advanced Power Management (APM), displaying power mode, freezing ATA security settings until reset, displaying SMART status, controlling automatic acoustic management, setting standby timeout, setting the drive to standby mode, setting the drive to sleep mode, displaying the drive identification and settings, and enable/disable SMART. @node hello_module @section hello This provides support for the @command{hello} command to simply output "Hello World". This is intended for testing GRUB module loading / functionality. @node help_module @section help This module provides support for the @command{help} command to output help text. @xref{help} for more information. @node hexdump_module @section hexdump This module provides support for the @command{hexdump} command to dump the contents of a file in hexadecimal. @xref{hexdump} for more information. @node hfs_module @section hfs This module provides support for the Hierarchical File System (HFS) file system in GRUB. Note: This module is not allowed in lockdown mode, @pxref{Lockdown} for more information. @node hfsplus_module @section hfsplus This module provides support for the Hierarchical File System Plus (HFS+) file system in GRUB. @node hfspluscomp_module @section hfspluscomp This module provides support for the Hierarchical File System Plus Compressed (HFS+ Compressed) file system in GRUB. @node http_module @section http This module provides support for getting data over the HTTP network protocol in GRUB (using the HTTP GET method). This may be used, for example, to obtain an operating system over HTTP (network boot). @node ieee1275_fb_module @section ieee1275_fb This module provides support for the IEEE1275 video driver output for PowerPC with a IEEE-1275 platform. @node iorw_module @section iorw This module provides support for commands @command{inb}, @command{inw}, @command{inl}, @command{outb}, @command{outw}, and @command{outl} to read / write data to physical I/O ports. The "in" commands accept one parameter to specify the source port. The "out" commands require either two or three parameters, with the order: port, value, . @node iso9660_module @section iso9660 This module provides support for the ISO9660 file system (often associated with optical disks such as CD-ROMs and DVD-ROMs, with extensions: System Use Sharing Protocol (SUSP), Rock Ridge (UNIX style permissions and longer names) @node jfs_module @section jfs This module provides support for the Journaled File System (JFS) file system. Note: This module is not allowed in lockdown mode, @pxref{Lockdown} for more information. @node jpeg_module @section jpeg This module provides support for reading JPEG image files in GRUB, such as to support displaying a JPEG image as a background image of the gfxmenu. @node json_module @section json This module provides library support for parsing / processing JavaScript Object Notation (JSON) formatted data. This is used, for example, to support LUKS2 disk encryption / decryption as metadata is encoded in JSON. @node keylayouts_module @section keylayouts This module provides support for the @command{keymap} command. This command accepts one parameter to specify either the @var{layout_name} or the @var{filename}. When specifying the @var{layout_name}, this command will attempt to open the GRUB keymap file based on the following logic: Get the "prefix" from environment variable @var{prefix} Open keymap file @var{prefix}/layouts/@var{layout_name}.gkb When specifying the @var{filename}, the full path to the ".gkb" file should be provided. The ".gkb" file can be generated by grub-kbdcomp. @node keystatus_module @section keystatus This module provides support for the @command{keystatus} command to check key modifier status. @xref{keystatus} for more information. @node ldm_module @section ldm This module provides support for the Logical Disk Manager (LDM) disk format. LDM is used to add support for logical volumes most often with Microsoft Windows systems. A logical volume can be defined to span more than one physical disk. @node legacy_password_test_module @section legacy_password_test This module is intended for performing a functional test of the legacy password function in GRUB. @node legacycfg_module @section legacycfg This module provides support for commands @command{legacy_source}, @command{legacy_configfile}, @command{extract_legacy_entries_source}, @command{extract_legacy_entries_configfile}, @command{legacy_kernel}, @command{legacy_initrd}, @command{legacy_initrd_nounzip}, @command{legacy_password}, and @command{legacy_check_password}. For new uses / configurations of GRUB other commands / modules offer the modern equivalents. @node linux_module @section linux This module provides support for the commands @command{linux} and @command{initrd} to load Linux and an Initial RAM Disk respectively. @xref{linux} and @pxref{initrd} for more information. @node linux16_module @section linux16 This module provides support for the commands @command{linux16} and @command{initrd16} to load Linux in 16-bit mode and an Initial RAM Disk in 16-bit mode respectively. @xref{linux16} and @pxref{initrd16} for more information. @node loadbios_module @section loadbios This module provides support for the commands @command{fakebios} and @command{loadbios}. These commands may only be useful on platforms with issues requiring work-arounds. Command @command{fakebios} is used to create BIOS-like structures for backward compatibility with existing OS. Command @command{loadbios} is used to load a BIOS dump. @node loadenv_module @section loadenv This module provides support for commands @command{load_env}, @command{list_env}, and @command{save_env}. These commands can be used to load environment variables from a file, list environment variables in a file, and save environment variables to a file. @xref{load_env}, @pxref{list_env}, and @pxref{save_env}. @node loopback_module @section loopback This module provides support for the @command{loopback} command. @xref{loopback} for more information. @node ls_module @section ls This module provides support for the @command{ls} command. @xref{ls} for more information. @node lsacpi_module @section lsacpi This module provides support for the @command{lsacpi} command. This command can be used to display Advanced Configuration and Power Interface (ACPI) tables. @node lsapm_module @section lsapm This module provides support for the @command{lsapm} command. This command can be used to display Advanced power management (APM) information. @node lsdev_module @section lsdev This module provides support for the @command{lsdev} command. This command can be used on MIPS Advanced RISC Computing (ARC) platforms to display devices. @node lsefi_module @section lsefi This module provides support for the @command{lsefi} command. This command can be used on EFI platforms to display EFI handles. @node lsefimmap_module @section lsefimmap This module provides support for the @command{lsefimmap} command. This command can be used on EFI platforms to display the EFI memory map. @node lsefisystab_module @section lsefisystab This module provides support for the @command{lsefisystab} command. This command can be used on EFI platforms to display the EFI system tables. @node lsmmap_module @section lsmmap This module provides support for the @command{lsmmap} command. This command can be used to display the memory map provided by firmware. @node lspci_module @section lspci This module provides support for the @command{lspci} command. This command can be used to display the PCI / PCIe devices. @node lssal_module @section lssal This module provides support for the @command{lsefisystab} command. This command can be used on Itanium (IA-64) EFI platforms to display the EFI System Abstraction Layer system table. @node lsspd_module @section lsspd This module provides support for the @command{lsspd} command. This command can be used on MIPS Loongson platforms to display the DDR RAM Serial Presence Detect (SPD) EEPROM data. @node lsxen_module @section lsxen This module provides support for the commands @command{xen_ls} and @command{xen_cat} on Xen platforms to list Xen storage. @node luks_module @section luks This module provides support for the Linux Unified Key Setup (LUKS) (version 1) disk encryption / decryption protocol. @node luks2_module @section luks2 This module provides support for the Linux Unified Key Setup 2 (LUKS2) disk encryption / decryption protocol. @node lvm_module @section lvm This module provides support for reading Logical Volume Management "logical" disks. For example, a single "logical" disk may be mapped to span more than one physical disk. This would be used when booting from a LVM formatted disk as may be setup in Linux. @node lzopio_module @section lzopio This module provides support for decompressing LZO / LZOP compressed files / archives. @node macbless_module @section macbless This module provides support for commands @command{mactelbless} and @command{macppcbless} for "blessing" a bootloader on Intel / PPC based MACs using the HFS or HFS+ file system. On HFS / HFS+ - "blessing" makes a file run as the bootloader. @node macho_module @section macho This module provides support for Mach Object (Mach-O) object / executable files in GRUB often used in MacOS. @node mda_text_module @section mda_text This module provides support for the Monochrome Display Adapter (MDA) terminal output device. MDA is a predecessor to VGA. @node mdraid09_module @section mdraid09 This module provides support for handling Linux compatible "version 0.9" software-based RAID disks in little-endian format. The "version 0.9" format was largely replaced around the year 2009 with the "version 1.x" format (@pxref{mdraid1x_module} for more information). @node mdraid09_be_module @section mdraid09_be This module provides support for handling Linux compatible "version 0.9" software-based RAID disks in bid-endian format. The "version 0.9" format was largely replaced around the year 2009 with the "version 1.x" format (@pxref{mdraid1x_module} for more information). @node mdraid1x_module @section mdraid1x This module provides support for handling Linux compatible "version 1.x" software-based RAID disks. This includes the current version used by Linux at the time of writing. @node memdisk_module @section memdisk This module provides support for a memdisk device. A memdisk is a memory mapped emulated disk. @node memrw_module @section memrw This module provides support for commands @command{read_byte}, @command{read_word}, @command{read_dword}, @command{write_byte}, @command{write_word}, and @command{write_dword} to read / write data to physical memory (addresses). The "read" commands accept one parameter to specify the source address. The "write" commands require either two or three parameters, with the order: address, value, . Note: The commands provided by this module are not allowed when lockdown is enforced (@pxref{Lockdown}). @node memtools_module @section memtools This module provides support for GRUB development / debugging commands @command{lsmem}, @command{lsfreemem}, and @command{stress_big_allocs}. @node minicmd_module @section minicmd This module provides support for a subset of commands for GRUB rescue mode including: @command{cat}, @command{help}, @command{dump}, @command{rmmod}, @command{lsmod}, and @command{exit}. The version of the commands in this module are similar to their full-fledged counterparts implemented in other GRUB modules. Note: The @command{dump} command is not allowed when lockdown is enforced (@pxref{Lockdown}). @node minix_module @section minix This module provides support for the Minix filesystem, version 1. Note: This module is not allowed in lockdown mode, @pxref{Lockdown} for more information. @node minix2_module @section minix2 This module provides support for the Minix filesystem, version 2. Note: This module is not allowed in lockdown mode, @pxref{Lockdown} for more information. @node minix2_be_module @section minix2_be This module provides support for the Minix filesystem, version 2 big-endian. Note: This module is not allowed in lockdown mode, @pxref{Lockdown} for more information. @node minix3_module @section minix3 This module provides support for the Minix filesystem, version 3. Note: This module is not allowed in lockdown mode, @pxref{Lockdown} for more information. @node minix3_be_module @section minix3_be This module provides support for the Minix filesystem, version 3 big-endian. Note: This module is not allowed in lockdown mode, @pxref{Lockdown} for more information. @node minix_be_module @section minix_be This module provides support for the Minix filesystem, version 1 big-endian. Note: This module is not allowed in lockdown mode, @pxref{Lockdown} for more information. @node mmap_module @section mmap This module provides support for mapping or unmapping devices or files into memory as well as commands @command{badram} and @command{cutmem}. @xref{badram} and @ref{cutmem}. @node morse_module @section morse This module provides support for outputting terminal output via Morse code to an audio speaker output. @node mpi_module @section mpi This module provides support for multi-precision-integers (MPIs) in GRUB. MPIs are used by the crypto functions as many depend on mathematics of large numbers. This GRUB module is based on libgcrypt. @node msdospart_module @section msdospart This module provides support for modifying MSDOS formatted disk partitions through the separate @command{parttool} command. @node mul_test_module @section mul_test This module is intended for performing a functional test of the multiplication operations in GRUB. @node multiboot_module @section multiboot This module provides support for commands @command{multiboot} and @command{module} to load a multiboot kernel and load a multiboot module, respectively. @xref{multiboot} and @ref{module} for more information. This is for loading data formatted per the GNU Multiboot specification. @node multiboot2_module @section multiboot2 This module provides support for commands @command{multiboot2} and @command{module2} to load a multiboot kernel and load a multiboot module, respectively. This is for loading data formatted per the GNU Multiboot specification. @node nand_module @section nand This module provides support for accessing an IEEE-1275 compliant NAND disk from GRUB. @node nativedisk_module @section nativedisk This module provides support for the @command{nativedisk} command. @xref{nativedisk} for more information. @node net_module @section net This module provides support for networking protocols including ARP, BOOTP, DNS, Ethernet, ICMPv6, ICMP, IP, TCP, and UDP. Support is included for both IPv4 and IPv6. This includes the following commands: @itemize @bullet @item @command{net_bootp} - @pxref{net_bootp} @item @command{net_dhcp} - @pxref{net_dhcp} @item @command{net_get_dhcp_option} - @pxref{net_get_dhcp_option} @item @command{net_nslookup} - @pxref{net_nslookup} @item @command{net_add_dns} - @pxref{net_add_dns} @item @command{net_del_dns} - @pxref{net_del_dns} @item @command{net_ls_dns} - @pxref{net_ls_dns} @item @command{net_add_addr} - @pxref{net_add_addr} @item @command{net_ipv6_autoconf} - @pxref{net_ipv6_autoconf} @item @command{net_del_addr} - @pxref{net_del_addr} @item @command{net_add_route} - @pxref{net_add_route} @item @command{net_del_route} - @pxref{net_del_route} @item @command{net_set_vlan} - @pxref{net_set_vlan} @item @command{net_ls_routes} - @pxref{net_ls_routes} @item @command{net_ls_cards} - @pxref{net_ls_cards} @item @command{net_ls_addr} - @pxref{net_ls_addr} @end itemize @node newc_module @section newc This module provides support for accessing a CPIO archive as a file system from GRUB. This module is for the following newer variants of the CPIO archive supported by GNU CPIO (but GNU CPIO defaults to the "bin" format which is handled by the module @ref{cpio_module}). These are the variants supported by this module: @itemize @bullet @item "newc" - SVR4 portable format without CRC. GNU file utility will identify these as something like "ASCII cpio archive (SVR4 with no CRC)" @item ‘crc’ - SVR4 portable format with CRC. GNU file utility will identify these as something like "ASCII cpio archive (SVR4 with CRC)" @end itemize @node nilfs2_module @section nilfs2 This module provides support for the New Implementation of Log filesystem (nilfs2). Note: This module is not allowed in lockdown mode, @pxref{Lockdown} for more information. @node normal_module @section normal This module provides support for the normal mode in GRUB. @xref{normal} for more information. @node ntfs_module @section ntfs This module provides support for the New Technology File System (NTFS) in GRUB. Note: This module is not allowed in lockdown mode, @pxref{Lockdown} for more information. @node ntfscomp_module @section ntfscomp This module provides support for compression with the New Technology File System (NTFS) in GRUB. Note: This module is not allowed in lockdown mode, @pxref{Lockdown} for more information. @node ntldr_module @section ntldr This module provides support for the @command{ntldr} command. This is may be used to boot a Windows boot loader such as NTLDR or BootMGR. @node odc_module @section odc This module provides support for accessing a CPIO archive as a file system from GRUB. This module is for "odc" variant of the CPIO archive supported by GNU CPIO (but GNU CPIO defaults to the "bin" format which is handled by the module @ref{cpio_module}). GNU file utility will identify these as something like "ASCII cpio archive (pre-SVR4 or odc)" @node offsetio_module @section offsetio This module provides support for reading from a file / archive at specified offsets in GRUB. @node ofnet_module @section ofnet This module provides support for the Open Firmware (IEEE-1275) network device support in GRUB. @node ohci_module @section ohci This module provides support for the Open Host Controller Interface (OHCI) for USB 1 / USB 1.1 support in GRUB. @node part_acorn_module @section part_acorn This module provides support for reading from disks partitioned with the Acorn Disc Filing System (ADFS) used on RiscOS. @node part_amiga_module @section part_amiga This module provides support for reading from disks partitioned with the Amiga partition table. @node part_apple_module @section part_apple This module provides support for reading from disks partitioned with the Macintosh partition table. @node part_bsd_module @section part_bsd This module provides support for reading from disks partitioned with BSD style partition tables. @node part_dfly_module @section part_dfly This module provides support for reading from disks partitioned with the DragonFly BSD partition table. @node part_dvh_module @section part_dvh This module provides support for reading from disks partitioned with the SGI Disk Volume Header partition table. @node part_gpt_module @section part_gpt This module provides support for reading from disks partitioned with the GUID Partition Tables (GPT) partition table. @node part_msdos_module @section part_msdos This module provides support for reading from disks partitioned with the MSDOS (Master Boot Record / MBR) style partition tables. @node part_plan_module @section part_plan This module provides support for reading from disk partitioned with the Plan9 style partition table. @node part_sun_module @section part_sun This module provides support for reading from disk partitioned with the Sun style partition table. @node part_sunpc_module @section part_sunpc This module provides support for reading from disk partitioned with the Sun PC style partition table. @node parttool_module @section parttool This module provides support for the @command{parttool} command. @xref{parttool} for more information. @node password_module @section password This module provides support for the @command{password} command. Please note that this uses the password in plain text, if security is a concern consider using @ref{password_pbkdf2_module} instead. @xref{password} for more information. @node password_pbkdf2_module @section password_pbkdf2 This module provides support for the @command{password_pbkdf2} command. @xref{password_pbkdf2} for more information. @node pata_module @section pata This module provides support for Parallel ATA (PATA) disk device interfaces. @node pbkdf2_module @section pbkdf2 This module provides support for the Password-Based Key Derivation Function 2 (PBKDF2) / PKCS#5 PBKDF2 as per RFC 2898. @node pbkdf2_test_module @section pbkdf2_test This module is intended for performing a functional test of the PBKDF2 operation in GRUB. @node pci_module @section pci This module provides support for generic Peripheral Component Interconnect (PCI) bus in GRUB. @node pcidump_module @section pcidump This module provides support for the @command{pcidump} command in GRUB to dump the PCI configuration registers in hexadecimal of a specified PCI device (vendor / device ID) or by position on the bus. @node pgp_module @section pgp This module provides support for the commands: @command{verify_detached}, @command{trust}, @command{list_trusted}, @command{distrust} associated with digital signature checking via the "Open Pretty Good Privacy" (PGP) protocol / RFC 4880 using a provided public key. This module also uses / sets environment variable @code{check_signatures}. @xref{verify_detached}, @ref{trust}, @ref{list_trusted}, @ref{distrust}, and @ref{check_signatures}. @node plainmount_module @section plainmount This module provides support for accessing / mounting partitions encrypted by "cryptsetup" operating in "plain mode". @xref{plainmount} for more information. @node plan9_module @section plan9 This module provides support for the @command{plan9} command to load a Plan9 kernel. @node play_module @section play This module provides support for the @command{play} command to play a tune through the PC speaker. @xref{play} for more information. @node png_module @section png This module provides support for reading Portable Network Graphics (PNG) image files in GRUB. @node priority_queue_module @section priority_queue This module provides support for a priority queue function within GRUB such as to support networking functions. @node probe_module @section probe This module provides support for the @command{probe} command to retrieve device information. @xref{probe} for more information. @node procfs_module @section procfs This module provides support for a Proc File System to provide a file system like interface to some GRUB internal data. @node progress_module @section progress This module provides support for showing file loading progress to the terminal. @node pxe_module @section pxe This module provides support for Preboot Execution Environment (PXE) network boot services as a file system driver for other GRUB modules. @node pxechain_module @section pxechain This module provides support for the @command{pxechainloader} command to load another bootloader by PXE. @node raid5rec_module @section raid5rec This module provides support for recovering from faulty RAID4/5 disk arrays @node raid6rec_module @section raid6rec This module provides support for recovering from faulty RAID6 disk arrays. @node random_module @section random This module provides support for library functions to get random data via the hardware ACPI Power Management Timer and the TSC time source (Timestamp Counter). @node rdmsr_module @section rdmsr This module provides support for the @command{rdmsr} command to read CPU Model Specific Registers. @xref{rdmsr} for more information. @node read_module @section read This module provides support for the @command{read} command for getting user input. @xref{read} for more information. @node reboot_module @section reboot This module provides support for the @command{reboot} command to reboot the computer. @xref{reboot} for more information. @node regexp_module @section regexp This module provides support for the @command{regexp} command to check if a regular expression matches a string. This module also provides support for the GRUB script wildcard translator. @xref{regexp} for more information. @node reiserfs_module @section reiserfs This module provides support for the ReiserFS File System in GRUB. Note: This module is not allowed in lockdown mode, @pxref{Lockdown} for more information. @node relocator_module @section relocator This module provides support for relocating the image / executable being loaded to the expected memory location(s) and jumping to (invoking) the executable. @node romfs_module @section romfs This module provides support for the Read-Only Memory File System (ROMFS). Note: This module is not allowed in lockdown mode, @pxref{Lockdown} for more information. @node scsi_module @section scsi This module provides support for the Small Computer System Interface (SCSI) protocol used for some types of disk communication include some modern ones such as USB Mass Storage Devices supporting "USB Attached SCSI" (UAS). @node sdl_module @section sdl This module provides support for Simple DirectMedia Layer (SDL) video / image output from the grub-emu tool used to preview the GRUB menu from a running Operating System such as Linux (useful to test GRUB menu configuration changes without rebooting). When available in the compilation target environment, SDL2 will be used instead of SDL1. @node search_module @section search This module provides support for the @command{search} command to search devices by file, filesystem label, or filesystem UUID. @xref{search} for more information. @node search_fs_file_module @section search_fs_file This module provides support for the @command{search.file} command which is an alias for the corresponding @command{search} command. @xref{search} for more information. @node search_fs_uuid_module @section search_fs_uuid This module provides support for the @command{search.fs_uuid} command which is an alias for the corresponding @command{search} command. @xref{search} for more information. @node search_label_module @section search_label This module provides support for the @command{search.fs_label} command which is an alias for the corresponding @command{search} command. @xref{search} for more information. @node sendkey_module @section sendkey This module provides support for the @command{sendkey} command to send emulated keystrokes. @xref{sendkey} for more information. @node serial_module @section serial This module provides support for the @command{serial} command and associated driver support for communication over a serial interface from GRUB. @xref{serial} for more information. @node setjmp_module @section setjmp This module provides support for the @code{setjmp} and @code{longjmp} functions used within GRUB. @node setjmp_test_module @section setjmp_test This module is intended for performing a functional test of the @code{setjmp} and @code{longjmp} functions in GRUB. @node setpci_module @section setpci This module provides support for the @command{setpci} command to get / set values from / to specified PCI / PCIe devices. @node sfs_module @section sfs This module provides support for the Amiga Smart File System (SFS) in GRUB. Note: This module is not allowed in lockdown mode, @pxref{Lockdown} for more information. @node shift_test_module @section shift_test This module is intended for performing a functional test of the bit-wise shift operations in GRUB. @node signature_test_module @section signature_test This module is intended for performing a functional test of the digital signature verification functions in GRUB. @node sleep_module @section sleep This module provides support for the @command{sleep} command to wait a specified number of seconds in GRUB. @xref{sleep} for more information. @node sleep_test_module @section sleep_test This module is intended for performing a functional test of the sleep function in GRUB. @node smbios_module @section smbios This module provides support for the @command{smbios} command to retrieve SMBIOS information in GRUB. @xref{smbios} for more information. @node spkmodem_module @section spkmodem This module provides support for outputting GRUB console information over an audio output. This output can be fed into another computer's sound input and decoded using the @code{spkmodem_recv} utility. Note that this will slow down GRUB's performance. @node squash4_module @section squash4 This module provides support for the SquashFS compressed read-only file system in GRUB. @node strtoull_test_module @section strtoull_test This module is intended for performing a functional test of the strtoull function in GRUB. @node suspend_module @section suspend This module provides support for the @command{suspend} command in GRUB to return to IEEE1275 prompt on "Open Firmware" systems. @node syslinuxcfg_module @section syslinuxcfg This module provides support for commands @command{syslinux_source}, @command{syslinux_configfile}, @command{extract_syslinux_entries_source}, and @command{extract_syslinux_entries_configfile} in GRUB. These commands can be used to parse and display GRUB menu entries based on a Syslinux based configuration (used for SYSLINUX, ISOLINUX, and PXELINUX). It can also be used to execute the Syslinux loader from GRUB. @node tar_module @section tar This module provides support for the GNU Tar and POSIX Tar file archives as a file system in GRUB. @node terminal_module @section terminal This module provides support for the commands @command{terminal_input} and @command{terminal_output} in GRUB. @xref{terminal_input} and @ref{terminal_output} for more information. @node terminfo_module @section terminfo This module provides support for the @command{terminfo} command in GRUB to set various terminal modes / options. @xref{terminfo} for more information. @node test_module @section test This module provides support for the commands @command{test} and @command{[}. These commands can be used to evaluate (test) an expression. @xref{test} for more information. @node test_blockarg_module @section test_blockarg This module is intended for performing a functional test of the "block" command argument function in GRUB internal functions via a test command @command{test_blockarg}. @node testload_module @section testload This module is intended for performing a functional test of some file reading / seeking functions in GRUB internals via a test command @command{testload}. @node testspeed_module @section testspeed This module provides support for the @command{testspeed} command to test and print file read speed of a specified file. @node tftp_module @section tftp This module provides support for the Trivial File Transfer Protocol (TFTP) for receiving files via the network to GRUB. TFTP may be used along with PXE for network booting for example. @node tga_module @section tga This module provides support for reading Truevision Graphics Adapter (TGA) image files in GRUB. @node time_module @section time This module provides support for the @command{time} command to measure the time taken by a given command and output it to the terminal. @node tpm_module @section tpm This module provides support for interacting with a Trusted Platform Module (TPM) with GRUB to perform Measured Boot. @xref{Measured Boot} for more information. @node tr_module @section tr This module provides support for the @command{tr} command in GRUB. This can be used to translate characters in a string according to the provided arguments. For example this can be used to convert upper-case to lower-case and visa-versa. @node trig_module @section trig This module provides support for internal trig functions @code{grub_cos} and @code{grub_sin} using lookup based computation. Currently these trig functions are used by the gfxmenu circular progress bar. @node true_module @section true This module provides support for the commands @command{true} and @command{false}. @xref{true} and @ref{false} for more information. @node truecrypt_module @section truecrypt This module provides support for the @command{truecrypt} command. This can be used to load a Truecrypt ISO image. @node ubootnet_module @section ubootnet This module provides support for configuring network interfaces in GRUB using information provided by a U-Boot bootloader. @node udf_module @section udf This module provides support for the Universal Disk Format (UDF) used on some newer optical disks. Note: This module is not allowed in lockdown mode, @pxref{Lockdown} for more information. @node ufs1_module @section ufs1 This module provides support for the Unix File System version 1 in GRUB. Note: This module is not allowed in lockdown mode, @pxref{Lockdown} for more information. @node ufs1_be_module @section ufs1_be This module provides support for the Unix File System version 1 (big-endian) in GRUB. Note: This module is not allowed in lockdown mode, @pxref{Lockdown} for more information. @node ufs2_module @section ufs2 This module provides support for the Unix File System version 2 in GRUB. Note: This module is not allowed in lockdown mode, @pxref{Lockdown} for more information. @node uhci_module @section uhci This module provides support for the Universal Host Controller Interface (UHCI) for USB 1.x. @node usb_module @section usb This module provides support for USB interfaces, USB hubs, and USB transfers in GRUB. @node usb_keyboard_module @section usb_keyboard This module provides support for a USB keyboard in GRUB. @node usbms_module @section usbms This module provides support for USB Mass Storage devices in GRUB. @node usbserial_common_module @section usbserial_common This module provides support for common operations needed to support USB Serial port adapters in GRUB (to support a model / type specific USB to serial adapter defined in another module). @node usbserial_ftdi_module @section usbserial_ftdi This module provides support for USB to serial adapters with vendor ID 0x0403 and product ID 0x6001 (often associated with FTDI devices). @node usbserial_pl2303_module @section usbserial_pl2303 This module provides support for USB to serial adapters with vendor ID 0x067b and product ID 0x2303 (PL2303 USB to Serial adapter). @node usbserial_usbdebug_module @section usbserial_usbdebug This module provides support for debugging GRUB via a "USB 2.0 Debug Cable". The USB 2.0 specification includes a "USB2 Debug Device Functional Specification" that this driver is intended to support for GRUB. This may integrate with GDB server function in GRUB (@pxref{gdb_module}). @node usbtest_module @section usbtest This module provides support for the @command{usb} command in GRUB to test USB functionality by iterating through all connected USB devices and printing information for each to the terminal. @node vbe_module @section vbe This module provides support for the VESA BIOS Extension (VBE) Video Driver in GRUB. @node verifiers_module @section verifiers This module is a built-in kernel module to provide a framework for GRUB file verifiers and string verifiers. @node vga_module @section vga This module provides support for the Video Graphics Array (VGA) Video Driver in GRUB. @node vga_text_module @section vga_text This module provides support for the Video Graphics Array (VGA) terminal output device. @node video_module @section video This module provides support for video output support functions within GRUB. @node video_bochs_module @section video_bochs This module provides support for the Bochs PCI Video Driver (also known as Bochs Graphics Adapter / BGA) in GRUB. @node video_cirrus_module @section video_cirrus This module provides support for the Cirrus CLGD 5446 PCI Video Driver (Cirrus Video) in GRUB. @node video_colors_module @section video_colors This module provides support for interpreting named colors and parsing RBG hexadecimal values. @node video_fb_module @section video_fb This module provides support for video frame buffer (FB) support in GRUB. @node videoinfo_module @section videoinfo This module provides support for the @command{videoinfo} command and (depending on architecture) the @command{vbeinfo} command. @xref{videoinfo} for more information. @node videotest_module @section videotest This module provides support for the @command{videotest} command and (depending on architecture) the @command{vbetest} to test the video subsystem in the specified width and height. @node videotest_checksum_module @section videotest_checksum This module is intended for performing a functional test of the video functions in GRUB by displaying a test image and capturing a checksum. @node wrmsr_module @section wrmsr This module provides support for the @command{wrmsr} command to write to CPU model-specific registers. @xref{wrmsr} for more information. @node xen_boot_module @section xen_boot This module provides support for the commands @command{xen_hypervisor} and @command{xen_module} to load a XEN hypervisor and module respectively. @node xfs_module @section xfs This module provides support for the XFS file system in GRUB. @node xnu_module @section xnu This module provides support for the commands: @command{xnu_devprop_load}, @command{xnu_kernel}, @command{xnu_kernel64}, @command{xnu_mkext}, @command{xnu_kext}, @command{xnu_kextdir}, @command{xnu_ramdisk}, @command{xnu_splash}, and @command{xnu_resume} (only for emulated machine). These commands support loading and interacting with a XNU (MacOS / Apple) based system / kernel. @node xnu_uuid_module @section xnu_uuid This module provides support for the @command{xnu_uuid} command to transform a 64-bit UUID to a format suitable for XNU. @node xnu_uuid_test_module @section xnu_uuid_test This module is intended for performing a functional test of the XNU UUID conversion function. @node xzio_module @section xzio This module provides support for decompression of XZ compressed data. @node zfs_module @section zfs This module provides support for the ZFS file system in GRUB. @node zfscrypt_module @section zfscrypt This module provides support for the @command{zfskey} to import a decryption key as well as decryption support for encrypted ZFS file systems. @node zfsinfo_module @section zfsinfo This module provides support for the commands @command{zfsinfo} to output ZFS info about a device and @command{zfs-bootfs} to output ZFS-BOOTFSOBJ or store it into a variable. @node zstd_module @section zstd This module provides support for the Zstandard (zstd) decompression algorithm in GRUB. @node Commands @chapter Available commands In this chapter, we list all commands that are available in GRUB. Commands belong to different groups. A few can only be used in the global section of the configuration file (or ``menu''); most of them can be entered on the command-line and can be used either anywhere in the menu or specifically in the menu entries. In rescue mode, only the @command{insmod} (@pxref{insmod}), @command{ls} (@pxref{ls}), @command{set} (@pxref{set}), and @command{unset} (@pxref{unset}) commands are normally available. If you end up in rescue mode and do not know what to do, then @pxref{GRUB only offers a rescue shell}. @menu * Menu-specific commands:: * Loader commands:: * General commands:: * Command-line commands:: * Networking commands:: * Undocumented commands:: @end menu @node Menu-specific commands @section Commands for the menu only The semantics used in parsing the configuration file are the following: @itemize @bullet @item The files @emph{must} be in plain-text format. @item @samp{#} at the beginning of a line in a configuration file means it is only a comment. @item Options are separated by spaces. @item All numbers can be either decimal or hexadecimal. A hexadecimal number must be preceded by @samp{0x}, and is case-insensitive. @end itemize These commands can only be used in the menu: @menu * menuentry:: Start a menu entry * submenu:: Group menu entries @end menu @node menuentry @subsection menuentry @deffn Command menuentry @var{title} @ [@option{--class=class} @dots{}] [@option{--users=users}] @ [@option{--unrestricted}] [@option{--hotkey=key}] [@option{--id=id}] @ [@var{arg} @dots{}] @{ @var{command}; @dots{} @} This defines a GRUB menu entry named @var{title}. When this entry is selected from the menu, GRUB will set the @var{chosen} environment variable to value of @option{--id} if @option{--id} is given, execute the list of commands given within braces, and if the last command in the list returned successfully and a kernel was loaded it will execute the @command{boot} command. The @option{--class} option may be used any number of times to group menu entries into classes. Menu themes may display different classes using different styles. The @option{--users} option grants specific users access to specific menu entries. @xref{Security}. The @option{--unrestricted} option grants all users access to specific menu entries. @xref{Security}. The @option{--hotkey} option associates a hotkey with a menu entry. @var{key} may be a single letter, or one of the aliases @samp{backspace}, @samp{tab}, or @samp{delete}. The @option{--id} may be used to associate unique identifier with a menu entry. @var{id} is string of ASCII aphanumeric characters, underscore and hyphen and should not start with a digit. All other arguments including @var{title} are passed as positional parameters when list of commands is executed with @var{title} always assigned to @code{$1}. @end deffn @node submenu @subsection submenu @deffn Command submenu @var{title} @ [@option{--class=class} @dots{}] [@option{--users=users}] @ [@option{--unrestricted}] [@option{--hotkey=key}] [@option{--id=id}] @ @{ @var{menu entries} @dots{} @} This defines a submenu. An entry called @var{title} will be added to the menu; when that entry is selected, a new menu will be displayed showing all the entries within this submenu. All options are the same as in the @command{menuentry} command (@pxref{menuentry}). @end deffn @node Loader commands @section Various loader commands These commands are used to load necessary components to boot desired OS. Many of the loader commands are not sufficiently documented. The following is a list of commands that could use more documentation: @itemize @bullet @item @command{appleloader} - Boot BIOS-based system. @item @command{freedos} - Load FreeDOS kernel.sys. @item @command{kfreebsd_loadenv} - Load FreeBSD env. @item @command{kfreebsd_module_elf} - Load FreeBSD kernel module (ELF). @item @command{kfreebsd_module} - Load FreeBSD kernel module. @item @command{kfreebsd} - Load kernel of FreeBSD. @item @command{knetbsd_module_elf} - Load NetBSD kernel module (ELF). @item @command{knetbsd_module} - Load NetBSD kernel module. @item @command{knetbsd} - Load kernel of NetBSD. @item @command{kopenbsd} - Load kernel of OpenBSD. @item @command{kopenbsd_ramdisk} - Load kOpenBSD ramdisk. @item @command{legacy_initrd_nounzip} - Simulate grub-legacy `modulenounzip' command @item @command{legacy_initrd} - Simulate grub-legacy `initrd' command @item @command{legacy_kernel} - Simulate grub-legacy `kernel' command @item @command{module2} - Load a multiboot 2 module. @item @command{module} - Load a multiboot module. @item @command{multiboot2} - Load a multiboot 2 kernel. @item @command{multiboot} - Load a multiboot kernel. @item @command{ntldr} - Load NTLDR or BootMGR. @item @command{plan9} - Load Plan9 kernel. @item @command{pxechainloader} - Load a PXE image. @item @command{truecrypt} - Load Truecrypt ISO. @item @command{xnu_kernel64} - Load 64-bit XNU image. @item @command{xnu_kernel} - Load XNU image. @item @command{xnu_kextdir} - Load XNU extension directory. @item @command{xnu_kext} - Load XNU extension. @item @command{xnu_mkext} - Load XNU extension package. @item @command{xnu_ramdisk} - Load XNU ramdisk. It will be available in OS as md0. @item @command{xnu_resume} - Load an image of hibernated XNU. @item @command{xnu_splash} - Load a splash image for XNU. @end itemize @menu * chainloader:: Chain-load another boot loader * initrd:: Load a Linux initrd * initrd16:: Load a Linux initrd (16-bit mode) * linux:: Load a Linux kernel * linux16:: Load a Linux kernel (16-bit mode) @comment * xen_*:: Xen boot commands for AArch64 * xen_hypervisor:: Load xen hypervisor binary (only on AArch64) * xen_module:: Load xen modules for xen hypervisor (only on AArch64) @end menu @node chainloader @subsection chainloader @deffn Command chainloader [@option{--force}] file [args...] Load @var{file} as a chain-loader. Like any other file loaded by the filesystem code, it can use the blocklist notation (@pxref{Block list syntax}) to grab the first sector of the current partition with @samp{+1}. On EFI platforms, any arguments after @var{file} will be sent to the loaded image. If you specify the option @option{--force}, then load @var{file} forcibly, whether it has a correct signature or not. This is required when you want to load a defective boot loader, such as SCO UnixWare 7.1. @end deffn @node initrd @subsection initrd @deffn Command initrd file [file @dots{}] Load, in order, all initrds for a Linux kernel image, and set the appropriate parameters in the Linux setup area in memory. This may only be used after the @command{linux} command (@pxref{linux}) has been run. See @ref{GNU/Linux} for more info on booting GNU/Linux. For more information on initrds see the GNU/Linux kernel @uref{https://docs.kernel.org/filesystems/ramfs-rootfs-initramfs.html, documentation}. A new-style initrd (for kernels newer than 2.6) containing one file with leading path components can also be generated at run time. This can be done by prefixing an argument with @code{newc:} followed by the path of the file in the new initrd, a @code{:}, and then the GRUB file path to the file data to be be included. For example: @example initrd newc:/etc/ssh/config:(hd0,2)/home/user/.ssh/config \ newc:/etc/ssh/ssh_host_rsa_key:/etc/ssh/ssh_host_rsa_key \ /boot/initrd.gz \ newc:/init:/home/user/init.fixed @end example This command will generate two new-style initrds on the fly. The first contains the path @samp{/etc/ssh/config} with the contents of @samp{(hd0,2)/home/user/.ssh/config} and the path @samp{/etc/ssh/ssh_host_rsa_key} with the contents of @samp{/etc/ssh/ssh_host_rsa_key} on the @var{root} device. Parent directory paths will automatically be generated as needed. This first generated initrd will then have @samp{/boot/initrd.gz} concatenated after it. Next, another new-style archive will be generated with the contents of @samp{/home/user/init.fixed} in the path @samp{/init} and appended to the previous concatenation. Finally, the result will be sent to the kernel when booted. Keep in mind that paths that come later will take precedence. So in the example above, the generated path @samp{/init} will overwrite any @samp{/init} in @samp{/boot/initrd.gz}. This can be useful when changing the main initrd is undesirable or difficult. @end deffn @node initrd16 @subsection initrd16 @deffn Command initrd16 file [file @dots{}] Load, in order, all initrds for a Linux kernel image to be booted in 16-bit mode, and set the appropriate parameters in the Linux setup area in memory. This may only be used after the @command{linux16} command (@pxref{linux16}) has been run. See also @ref{GNU/Linux} and the @command{initrd} command (@pxref{initrd}) for more details on arguments. This command is only available on the pc platform for x86 systems. @end deffn @node linux @subsection linux @deffn Command linux file @dots{} Load a Linux kernel image from @var{file}. The rest of the line is passed verbatim as the @dfn{kernel command-line}. Any initrd must be reloaded after using this command (@pxref{initrd}). On x86 systems, the kernel will be booted using the 32-bit boot protocol. Note that this means that the @samp{vga=} boot option will not work; if you want to set a special video mode, you will need to use GRUB commands such as @samp{set gfxpayload=1024x768} or @samp{set gfxpayload=keep} (to keep the same mode as used in GRUB) instead. GRUB can automatically detect some uses of @samp{vga=} and translate them to appropriate settings of @samp{gfxpayload}. The @command{linux16} command (@pxref{linux16}) avoids this restriction. @end deffn @node linux16 @subsection linux16 @deffn Command linux16 file @dots{} Load a Linux kernel image from @var{file} in 16-bit mode. The rest of the line is passed verbatim as the @dfn{kernel command-line}. Any initrd must be reloaded after using this command (@pxref{initrd16}). The kernel will be booted using the traditional 16-bit boot protocol. As well as bypassing problems with @samp{vga=} described in @ref{linux}, this permits booting some other programs that implement the Linux boot protocol for the sake of convenience. This command is only available on x86 systems. @end deffn @node xen_hypervisor @subsection xen_hypervisor @deffn Command xen_hypervisor file [arguments] @dots{} Load a Xen hypervisor binary from @var{file}. The rest of the line is passed verbatim as the @dfn{kernel command-line}. Any other binaries must be reloaded after using this command. This command is only available on AArch64 systems. @end deffn @node xen_module @subsection xen_module @deffn Command xen_module [--nounzip] file [arguments] Load a module for xen hypervisor at the booting process of xen. The rest of the line is passed verbatim as the module command line. Modules should be loaded in the following order: - dom0 kernel image - dom0 ramdisk if present - XSM policy if present This command is only available on AArch64 systems. @end deffn @node General commands @section General commands Commands usable anywhere in the menu and in the command-line. @menu * serial:: Set up a serial device * terminal_input:: Manage input terminals * terminal_output:: Manage output terminals * terminfo:: Define terminal type @end menu @node serial @subsection serial @deffn Command serial [@option{--unit=unit}] [@option{--port=port}] [@option{--speed=speed}] [@option{--word=word}] [@option{--parity=parity}] [@option{--stop=stop}] Initialize a serial device. @var{unit} is a number in the range 0-3 specifying which serial port to use; default is 0, which corresponds to the port often called COM1. @var{port} is the I/O port where the UART is to be found or, if prefixed with @samp{mmio,}, the MMIO address of the UART. If specified it takes precedence over @var{unit}. Additionally, an MMIO address can be suffixed with: @itemize @bullet @item @samp{.b} for bytes access (default) @item @samp{.w} for 16-bit word access @item @samp{.l} for 32-bit long word access or @item @samp{.q} for 64-bit long long word access @end itemize Also, @var{port} can be of the form @samp{pci,XX:XX.X} to indicate a serial device exposed on the PCI bus. @var{speed} is the transmission speed; default is 9600. @var{word} and @var{stop} are the number of data bits and stop bits. Data bits must be in the range 5-8 and stop bits must be 1 or 2. Default is 8 data bits and one stop bit. @var{parity} is one of @samp{no}, @samp{odd}, @samp{even} and defaults to @samp{no}. If passed no @var{unit} nor @var{port}, or if @var{port} is set to @samp{auto} then GRUB will attempt to use ACPI to automatically detect the system default serial port and its configuration. If this information is not available, it will default to @var{unit} 0. The serial port is not used as a communication channel unless the @command{terminal_input} or @command{terminal_output} command is used (@pxref{terminal_input}, @pxref{terminal_output}). Note, valid @var{port} values, excluding IO port addresses, can be found by listing terminals with @command{terminal_output}, selecting all names prefixed by @samp{serial_} and removing that prefix. Examples: @example serial --port=0x3f8 --speed=9600 serial --port=mmio,fefb0000.l --speed=115200 serial --port=pci,00:16.3 --speed=115200 @end example See also @ref{Serial terminal}. @end deffn @node terminal_input @subsection terminal_input @deffn Command terminal_input [@option{--append}|@option{--remove}] @ [terminal1] [terminal2] @dots{} List or select an input terminal. With no arguments, list the active and available input terminals. With @option{--append}, add the named terminals to the list of active input terminals; any of these may be used to provide input to GRUB. With @option{--remove}, remove the named terminals from the active list. With no options but a list of terminal names, make only the listed terminal names active. @end deffn @node terminal_output @subsection terminal_output @deffn Command terminal_output [@option{--append}|@option{--remove}] @ [terminal1] [terminal2] @dots{} List or select an output terminal. With no arguments, list the active and available output terminals. With @option{--append}, add the named terminals to the list of active output terminals; all of these will receive output from GRUB. With @option{--remove}, remove the named terminals from the active list. With no options but a list of terminal names, make only the listed terminal names active. @end deffn @node terminfo @subsection terminfo @deffn Command terminfo [@option{-a}|@option{-u}|@option{-v}] [@option{-g WxH}] [term] [type] Define the capabilities of your terminal by giving the name of an entry in the terminfo database, which should correspond roughly to a @samp{TERM} environment variable in Unix. The currently available terminal types are @samp{vt100}, @samp{vt100-color}, @samp{ieee1275}, and @samp{dumb}. If you need other terminal types, please contact us to discuss the best way to include support for these in GRUB. The @option{-a} (@option{--ascii}), @option{-u} (@option{--utf8}), and @option{-v} (@option{--visual-utf8}) options control how non-ASCII text is displayed. @option{-a} specifies an ASCII-only terminal; @option{-u} specifies logically-ordered UTF-8; and @option{-v} specifies "visually-ordered UTF-8" (in other words, arranged such that a terminal emulator without bidirectional text support will display right-to-left text in the proper order; this is not really proper UTF-8, but a workaround). The @option{-g} (@option{--geometry}) can be used to specify terminal geometry. If no option or terminal type is specified, the current terminal type is printed. @end deffn @node Command-line commands @section Command-line commands These commands are usable in the command-line and in menu entries. If you forget a command, you can run the command @command{help} (@pxref{help}). @menu * [:: Check file types and compare values * acpi:: Load ACPI tables * authenticate:: Check whether user is in user list * background_color:: Set background color for active terminal * background_image:: Load background image for active terminal * badram:: Filter out bad regions of RAM * blocklist:: Print a block list * boot:: Start up your operating system * cat:: Show the contents of a file * clear:: Clear the screen * cmosclean:: Clear bit in CMOS * cmosdump:: Dump CMOS contents * cmostest:: Test bit in CMOS * cmp:: Compare two files * configfile:: Load a configuration file * cpuid:: Check for CPU features * crc:: Compute or check CRC32 checksums * cryptocheck:: Check if a device is encrypted * cryptomount:: Mount a crypto device * cutmem:: Remove memory regions * date:: Display or set current date and time * devicetree:: Load a device tree blob * distrust:: Remove a pubkey from trusted keys * drivemap:: Map a drive to another * echo:: Display a line of text * efitextmode:: Set/Get text output mode resolution * eval:: Evaluate agruments as GRUB commands * export:: Export an environment variable * false:: Do nothing, unsuccessfully * fdtdump:: Retrieve device tree information * file:: Test the provided file against a type * fwsetup:: Reboot into the firmware setup menu * gdbinfo:: Provide info for debugging with GDB * gettext:: Translate a string * gptsync:: Fill an MBR based on GPT entries * halt:: Shut down your computer * hashsum:: Compute or check hash checksum * help:: Show help messages * hexdump:: Show raw contents of a file or memory * insmod:: Insert a module * keystatus:: Check key modifier status * list_env:: List variables in environment block * list_trusted:: List trusted public keys * load_env:: Load variables from environment block * loadfont:: Load font files * loopback:: Make a device from a filesystem image * ls:: List devices or files * lsfonts:: List loaded fonts * lsmod:: Show loaded modules * md5sum:: Compute or check MD5 hash * module:: Load module for multiboot kernel * multiboot:: Load multiboot compliant kernel * nativedisk:: Switch to native disk drivers * normal:: Enter normal mode * normal_exit:: Exit from normal mode * parttool:: Modify partition table entries * password:: Set a clear-text password * password_pbkdf2:: Set a hashed password * plainmount:: Open device encrypted in plain mode * play:: Play a tune * probe:: Retrieve device info * rdmsr:: Read values from model-specific registers * read:: Read user input * reboot:: Reboot your computer * regexp:: Test if regular expression matches string * rmmod:: Remove a module * save_env:: Save variables to environment block * search:: Search devices by file, label, or UUID * sendkey:: Emulate keystrokes * set:: Set an environment variable * sha1sum:: Compute or check SHA1 hash * sha256sum:: Compute or check SHA256 hash * sha512sum:: Compute or check SHA512 hash * sleep:: Wait for a specified number of seconds * smbios:: Retrieve SMBIOS information * source:: Read a configuration file in same context * test:: Check file types and compare values * tpm2_key_protector_init:: Initialize the TPM2 key protector * tpm2_key_protector_clear:: Clear the TPM2 key protector * tpm2_dump_pcr:: Dump TPM2 PCRs * true:: Do nothing, successfully * trust:: Add public key to list of trusted keys * unset:: Unset an environment variable @comment * vbeinfo:: List available video modes * verify_detached:: Verify detached digital signature * videoinfo:: List available video modes * wrmsr:: Write values to model-specific registers @end menu @node [ @subsection [ @deffn Command @code{[} expression @code{]} Alias for @code{test @var{expression}} (@pxref{test}). @end deffn @node acpi @subsection acpi @deffn Command acpi [@option{-1}|@option{-2}] @ [@option{--exclude=table1,@dots{}}|@option{--load-only=table1,@dots{}}] @ [@option{--oemid=id}] [@option{--oemtable=table}] @ [@option{--oemtablerev=rev}] [@option{--oemtablecreator=creator}] @ [@option{--oemtablecreatorrev=rev}] [@option{--no-ebda}] @ filename @dots{} Modern BIOS systems normally implement the Advanced Configuration and Power Interface (ACPI), and define various tables that describe the interface between an ACPI-compliant operating system and the firmware. In some cases, the tables provided by default only work well with certain operating systems, and it may be necessary to replace some of them. Normally, this command will replace the Root System Description Pointer (RSDP) in the Extended BIOS Data Area to point to the new tables. If the @option{--no-ebda} option is used, the new tables will be known only to GRUB, but may be used by GRUB's EFI emulation. Note: The command is not allowed when lockdown is enforced (@pxref{Lockdown}). Otherwise an attacker can instruct the GRUB to load an SSDT table to overwrite the kernel lockdown configuration and later load and execute unsigned code. @end deffn @node authenticate @subsection authenticate @deffn Command authenticate [userlist] Check whether user is in @var{userlist} or listed in the value of variable @samp{superusers}. See @pxref{superusers} for valid user list format. If @samp{superusers} is empty, this command returns true. @xref{Security}. @end deffn @node background_color @subsection background_color @deffn Command background_color color Set background color for active terminal. For valid color specifications see @pxref{Theme file format, ,Colors}. Background color can be changed only when using @samp{gfxterm} for terminal output. This command sets color of empty areas without text. Text background color is controlled by environment variables @var{color_normal}, @var{color_highlight}, @var{menu_color_normal}, @var{menu_color_highlight}. @xref{Special environment variables}. @end deffn @node background_image @subsection background_image @deffn Command background_image [[@option{--mode} @samp{stretch}|@samp{normal}] file] Load background image for active terminal from @var{file}. Image is stretched to fill up entire screen unless option @option{--mode} @samp{normal} is given. Without arguments remove currently loaded background image. Background image can be changed only when using @samp{gfxterm} for terminal output. @end deffn @node badram @subsection badram @deffn Command badram addr,mask[,addr,mask...] Filter out bad RAM. This command notifies the memory manager that specified regions of RAM ought to be filtered out (usually, because they're damaged). This remains in effect after a payload kernel has been loaded by GRUB, as long as the loaded kernel obtains its memory map from GRUB. Kernels that support this include Linux, GNU Mach, the kernel of FreeBSD and Multiboot kernels in general. Syntax is the same as provided by the @uref{http://www.memtest.org/, Memtest86+ utility}: a list of address/mask pairs. Given a page-aligned address and a base address / mask pair, if all the bits of the page-aligned address that are enabled by the mask match with the base address, it means this page is to be filtered. This syntax makes it easy to represent patterns that are often result of memory damage, due to physical distribution of memory cells. The command is similar to @command{cutmem} command. Note: The command is not allowed when lockdown is enforced (@pxref{Lockdown}). This prevents removing EFI memory regions to potentially subvert the security mechanisms provided by the UEFI secure boot. @end deffn @node blocklist @subsection blocklist @deffn Command blocklist file Print a block list (@pxref{Block list syntax}) for @var{file}. @end deffn @node boot @subsection boot @deffn Command boot Boot the OS or chain-loader which has been loaded. Only necessary if running the fully interactive command-line (it is implicit at the end of a menu entry). @end deffn @node cat @subsection cat @deffn Command cat [@option{--dos}] file Display the contents of the file @var{file}. This command may be useful to remind you of your OS's root partition: @example grub> @kbd{cat /etc/fstab} @end example If the @option{--dos} option is used, then carriage return / new line pairs will be displayed as a simple new line. Otherwise, the carriage return will be displayed as a control character (@samp{}) to make it easier to see when boot problems are caused by a file formatted using DOS-style line endings. Note: @command{cat} can be used to view the contents of devices using the block list syntax (@pxref{Block list syntax}). However, it is not advised to view binary data because it will try to decode UTF-8 strings, which can lead to some bytes missing or added in the output. Instead, use the @command{hexdump} command (@pxref{hexdump}). @end deffn @node clear @subsection clear @deffn Command clear Clear the screen. @end deffn @node cmosclean @subsection cmosclean @deffn Command cmosclean byte:bit Clear value of bit in CMOS at location @var{byte}:@var{bit}. This command is available only on platforms that support CMOS. @end deffn @node cmosdump @subsection cmosdump @deffn Dump CMOS contents Dump full CMOS contents as hexadecimal values. This command is available only on platforms that support CMOS. @end deffn @node cmostest @subsection cmostest @deffn Command cmostest byte:bit Test value of bit in CMOS at location @var{byte}:@var{bit}. Exit status is zero if bit is set, non zero otherwise. This command is available only on platforms that support CMOS. @end deffn @node cmp @subsection cmp @deffn Command cmp [@option{-v}] file1 file2 Compare the file @var{file1} with the file @var{file2}. If they are completely identical, @code{$?} will be set to 0. Otherwise, if the files are not identical, @code{$?} will be set to a nonzero value. By default nothing will be output. If the @option{-v} is used, verbose mode is enabled. In this mode when when the files differ in size, print the sizes like this: @example Differ in size: 0x1234 [foo], 0x4321 [bar] @end example If the sizes are equal but the bytes at an offset differ, then print the bytes like this: @example Differ at the offset 777: 0xbe [foo], 0xef [bar] @end example @end deffn @node configfile @subsection configfile @deffn Command configfile file Load @var{file} as a configuration file. If @var{file} defines any menu entries, then show a menu containing them immediately. Any environment variable changes made by the commands in @var{file} will not be preserved after @command{configfile} returns. @end deffn @node cpuid @subsection cpuid @deffn Command cpuid [-l] [-p] Check for CPU features. This command is only available on x86 systems. With the @option{-l} option, return true if the CPU supports long mode (64-bit). With the @option{-p} option, return true if the CPU supports Physical Address Extension (PAE). If invoked without options, this command currently behaves as if it had been invoked with @option{-l}. This may change in the future. @end deffn @node crc @subsection crc @deffn Command crc arg @dots{} Alias for @code{hashsum --hash crc32 arg @dots{}}. See command @command{hashsum} (@pxref{hashsum}) for full description. @end deffn @node cryptocheck @subsection cryptocheck @deffn Command cryptocheck [ @option{--quiet} ] device Check if a given diskfilter device is backed by encrypted devices (@pxref{cryptomount} for additional information). The command examines all backing devices, physical volumes, of a specified logical volume, like LVM2, and fails when at least one of them is unencrypted. The option @option{--quiet} can be given to suppress the output. @end deffn @node cryptomount @subsection cryptomount @deffn Command cryptomount [ [@option{-p} password] | [@option{-k} keyfile [@option{-O} keyoffset] [@option{-S} keysize] ] | [@option{-P} protector] ] [@option{-H} file] device|@option{-u} uuid|@option{-a}|@option{-b} Setup access to encrypted device. A passphrase will be requested interactively, if neither the @option{-p} nor @option{-k} options are given. The option @option{-p} can be used to supply a passphrase (useful for scripts). Alternatively the @option{-k} option can be used to supply a keyfile with options @option{-O} and @option{-S} optionally supplying the offset and size, respectively, of the key data in the given key file. Besides the keyfile, the key can be stored in a key protector, and option @option{-P} configures specific key protector, e.g. tpm2, to retrieve the key from. The @option{-H} options can be used to supply cryptomount backends with an alternative header file (aka detached header). Not all backends have headers nor support alternative header files (currently only LUKS1 and LUKS2 support them). Argument @var{device} configures specific grub device (@pxref{Naming convention}); option @option{-u} @var{uuid} configures device with specified @var{uuid}; option @option{-a} configures all detected encrypted devices; option @option{-b} configures all geli containers that have boot flag set. Devices are not allowed to be given as key files nor as detached header files. However, this limitation can be worked around by using blocklist syntax. So for instance, @code{(hd1,gpt2)} can not be used, but @code{(hd1,gpt2)0+} will achieve the desired result. GRUB supports devices encrypted using LUKS, LUKS2 and geli. Note that necessary modules (@var{luks}, @var{luks2} and @var{geli}) have to be loaded manually before this command can be used. For LUKS2 only the PBKDF2 key derivation function is supported, as Argon2 is not yet supported. Successfully decrypted disks are named as (cryptoX) and have increasing numeration suffix for each new decrypted disk. If the encrypted disk hosts some higher level of abstraction (like LVM2 or MDRAID) it will be created under a separate device namespace in addition to the cryptodisk namespace. Support for plain encryption mode (plain dm-crypt) is provided via separate @command{@pxref{plainmount}} command. On the EFI platform, GRUB tries to erase master keys from memory when the cryptodisk module is unloaded or the command @command{exit} is executed. All secrets remain in memory when the command @command{chainloader} is issued, because execution can return to GRUB on the EFI platform. @end deffn @node cutmem @subsection cutmem @deffn Command cutmem from[K|M|G] to[K|M|G] Remove any memory regions in specified range. This command notifies the memory manager that specified regions of RAM ought to be filtered out. This remains in effect after a payload kernel has been loaded by GRUB, as long as the loaded kernel obtains its memory map from GRUB. Kernels that support this include Linux, GNU Mach, the kernel of FreeBSD and Multiboot kernels in general. The command is similar to @command{badram} command. Note: The command is not allowed when lockdown is enforced (@pxref{Lockdown}). This prevents removing EFI memory regions to potentially subvert the security mechanisms provided by the UEFI secure boot. @end deffn @node date @subsection date @deffn Command date [[year-]month-day] [hour:minute[:second]] With no arguments, print the current date and time. Otherwise, take the current date and time, change any elements specified as arguments, and set the result as the new date and time. For example, `date 01-01' will set the current month and day to January 1, but leave the year, hour, minute, and second unchanged. @end deffn @node devicetree @subsection devicetree @deffn Command devicetree file Load a device tree blob (.dtb) from a filesystem, for later use by a Linux kernel. Does not perform merging with any device tree supplied by firmware, but rather replaces it completely. Note: The command is not allowed when lockdown is enforced (@pxref{Lockdown}). This is done to prevent subverting various security mechanisms. @end deffn @node distrust @subsection distrust @deffn Command distrust pubkey_id Remove public key @var{pubkey_id} from GRUB's keyring of trusted keys. @var{pubkey_id} is the last four bytes (eight hexadecimal digits) of the GPG v4 key id, which is also the output of @command{list_trusted} (@pxref{list_trusted}). Outside of GRUB, the key id can be obtained using @code{gpg --fingerprint}). These keys are used to validate signatures when environment variable @code{check_signatures} is set to @code{enforce} (@pxref{check_signatures}), and by some invocations of @command{verify_detached} (@pxref{verify_detached}). @xref{Using digital signatures}, for more information. @end deffn @node drivemap @subsection drivemap @deffn Command drivemap @option{-l}|@option{-r}|[@option{-s}] @ from_drive to_drive Without options, map the drive @var{from_drive} to the drive @var{to_drive}. This is necessary when you chain-load some operating systems, such as DOS, if such an OS resides at a non-first drive. For convenience, any partition suffix on the drive is ignored, so you can safely use @verb{'${root}'} as a drive specification. With the @option{-s} option, perform the reverse mapping as well, swapping the two drives. With the @option{-l} option, list the current mappings. With the @option{-r} option, reset all mappings to the default values. For example: @example drivemap -s (hd0) (hd1) @end example NOTE: Only available on i386-pc. @end deffn @node echo @subsection echo @deffn Command echo [@option{-n}] [@option{-e}] string @dots{} Display the requested text and, unless the @option{-n} option is used, a trailing new line. If there is more than one string, they are separated by spaces in the output. As usual in GRUB commands, variables may be substituted using @samp{$@{var@}}. The @option{-e} option enables interpretation of backslash escapes. The following sequences are recognised: @table @code @item \\ backslash @item \a alert (BEL) @item \c suppress trailing new line @item \f form feed @item \n new line @item \r carriage return @item \t horizontal tab @item \v vertical tab @end table When interpreting backslash escapes, backslash followed by any other character will print that character. @end deffn @node efitextmode @subsection efitextmode @deffn Command efitextmode [min | max | | ] When used with no arguments displays all available text output modes. The set mode determines the columns and rows of the text display when in text mode. An asterisk, @samp{*}, will be at the end of the line of the currently set mode. If given a single parameter, it must be @samp{min}, @samp{max}, or a mode number given by the listing when run with no arguments. These arguments set the mode to the minimum, maximum, and particular mode respectively. Otherwise, the command must be given two numerical arguments specifying the columns and rows of the desired mode. Specifying a columns and rows combination that corresponds to no supported mode, will return error, but otherwise have no effect. By default GRUB will start in whatever mode the EFI firmware defaults to. There are firmwares known to set up the default mode such that output behaves strangely, for example the cursor in the GRUB shell never reaches the bottom of the screen or, when typing characters at the prompt, characters from previous command output are overwritten. Setting the mode may fix this. The EFI specification says that mode 0 must be available and have columns and rows of 80 and 25 respectively. Mode 1 may be defined and if so must have columns and rows of 80 and 50 respectively. Any other modes may have columns and rows arbitrarily defined by the firmware. This means that a mode with columns and rows of 100 and 31 on one firmware may be a different mode number on a different firmware or not exist at all. Likewise, mode number 2 on one firmware may have a different number of columns and rows than mode 2 on a different firmware. So one should not rely on a particular mode number or a mode of a certain number of columns and rows existing on all firmwares, except for mode 0. Note: This command is only available on EFI platforms and is similar to EFI shell "mode" command. @end deffn @node eval @subsection eval @deffn Command eval string ... Concatenate arguments together using single space as separator and evaluate result as sequence of GRUB commands. @end deffn @node export @subsection export @deffn Command export envvar Export the environment variable @var{envvar}. Exported variables are visible to subsidiary configuration files loaded using @command{configfile}. @end deffn @node false @subsection false @deffn Command false Do nothing, unsuccessfully. This is mainly useful in control constructs such as @code{if} and @code{while} (@pxref{Shell-like scripting}). @end deffn @node fdtdump @subsection fdtdump @deffn Command fdtdump @ [@option{--prop} @var{prop}] @ [@option{--set} @var{variable}] Retrieve device tree information. The @command{fdtdump} command returns the value of a property in the device tree provided by the firmware. The @option{--prop} option determines which property to select. The default action is to print the value of the requested field to the console, but a variable name can be specified with @option{--set} to store the value instead of printing it. For example, this will store and then display the model string. @example fdtdump --prop model --set machine_model echo $machine_model @end example @end deffn @node file @subsection file @deffn Command file is_file_type filename The @command{file} command tests whether the provided @var{filename} is the type provided by @var{is_file_type}. When the @command{file} is of type @var{is_file_type} this command will return 0, otherwise it will return non-zero (no output is provided to the terminal). @var{is_file_type} may be one of the following options: @itemize @bullet @item @option{--is-i386-xen-pae-domu} Check if @var{filename} can be booted as i386 PAE Xen unprivileged guest kernel @item @option{--is-x86_64-xen-domu} Check if @var{filename} can be booted as x86_64 Xen unprivileged guest kernel @item @option{--is-x86-xen-dom0} Check if @var{filename} can be used as Xen x86 privileged guest kernel @item @option{--is-x86-multiboot} Check if @var{filename} can be used as x86 multiboot kernel @item @option{--is-x86-multiboot2} Check if @var{filename} can be used as x86 multiboot2 kernel @item @option{--is-arm-linux} Check if @var{filename} is ARM Linux @item @option{--is-arm64-linux} Check if @var{filename} is ARM64 Linux @item @option{--is-ia64-linux} Check if @var{filename} is IA64 Linux @item @option{--is-mips-linux} Check if @var{filename} is MIPS Linux @item @option{--is-mipsel-linux} Check if @var{filename} is MIPSEL Linux @item @option{--is-sparc64-linux} Check if @var{filename} is SPARC64 Linux @item @option{--is-powerpc-linux} Check if @var{filename} is POWERPC Linux @item @option{--is-x86-linux} Check if @var{filename} is x86 Linux @item @option{--is-x86-linux32} Check if @var{filename} is x86 Linux supporting 32-bit protocol @item @option{--is-x86-kfreebsd} Check if @var{filename} is x86 kFreeBSD @item @option{--is-i386-kfreebsd} Check if @var{filename} is i386 kFreeBSD @item @option{--is-x86_64-kfreebsd} Check if @var{filename} is x86_64 kFreeBSD @item @option{--is-x86-knetbsd} Check if @var{filename} is x86 kNetBSD @item @option{--is-i386-knetbsd} Check if @var{filename} is i386 kNetBSD @item @option{--is-x86_64-knetbsd} Check if @var{filename} is x86_64 kNetBSD @item @option{--is-i386-efi} Check if @var{filename} is i386 EFI file @item @option{--is-x86_64-efi} Check if @var{filename} is x86_64 EFI file @item @option{--is-ia64-efi} Check if @var{filename} is IA64 EFI file @item @option{--is-arm64-efi} Check if @var{filename} is ARM64 EFI file @item @option{--is-arm-efi} Check if @var{filename} is ARM EFI file @item @option{--is-riscv32-efi} Check if @var{filename} is RISC-V 32bit EFI file @item @option{--is-riscv64-efi} Check if @var{filename} is RISC-V 64bit EFI file @item @option{--is-hibernated-hiberfil} Check if @var{filename} is hiberfil.sys in hibernated state @item @option{--is-x86_64-xnu} Check if @var{filename} is x86_64 XNU (Mac OS X kernel) @item @option{--is-i386-xnu} Check if @var{filename} is i386 XNU (Mac OS X kernel) @item @option{--is-xnu-hibr} Check if @var{filename} is XNU (Mac OS X kernel) hibernated image @item @option{--is-x86-bios-bootsector} Check if @var{filename} is BIOS bootsector @end itemize @end deffn @node fwsetup @subsection fwsetup @deffn Command fwsetup [@option{--is-supported}] Reboot into the firmware setup menu. If @option{--is-supported} option is specified, instead check whether the firmware supports a setup menu and exit successfully if so. @end deffn @node gdbinfo @subsection gdbinfo @deffn Command gdbinfo Output text to be used as a GDB command for a GDB session using the gdb_grub script and attached to a running GRUB instance. The GDB command that is output will tell GDB how to load debugging symbols to their proper runtime address. Currently this is only available for EFI platforms. See the Debugging in the developer documentation for more information. @end deffn @node gettext @subsection gettext @deffn Command gettext string Translate @var{string} into the current language. The current language code is stored in the @samp{lang} variable in GRUB's environment (@pxref{lang}). Translation files in MO format are read from @samp{locale_dir} (@pxref{locale_dir}), usually @file{/boot/grub/locale}. @end deffn @node gptsync @subsection gptsync @deffn Command gptsync device [partition[+/-[type]]] @dots{} Disks using the GUID Partition Table (GPT) also have a legacy Master Boot Record (MBR) partition table for compatibility with the BIOS and with older operating systems. The legacy MBR can only represent a limited subset of GPT partition entries. This command populates the legacy MBR with the specified @var{partition} entries on @var{device}. Up to three partitions may be used. @var{type} is an MBR partition type code; prefix with @samp{0x} if you want to enter this in hexadecimal. The separator between @var{partition} and @var{type} may be @samp{+} to make the partition active, or @samp{-} to make it inactive; only one partition may be active. If both the separator and type are omitted, then the partition will be inactive. @end deffn @node halt @subsection halt @deffn Command halt [@option{--no-apm}] The command halts the computer. On the i386-pc target, the @option{--no-apm} option, or short @option{-n}, is specified, no APM BIOS call is performed. Otherwise, the computer is shut down using APM on that target. @end deffn @node hashsum @subsection hashsum @deffn Command hashsum @option{--hash} hash @option{--keep-going} @option{--uncompress} @option{--check} file [@option{--prefix} dir]|file @dots{} Compute or verify file hashes. Hash type is selected with option @option{--hash}. Supported hashes are: @samp{adler32}, @samp{crc64}, @samp{crc32}, @samp{crc32rfc1510}, @samp{crc24rfc2440}, @samp{md4}, @samp{md5}, @samp{ripemd160}, @samp{sha1}, @samp{sha224}, @samp{sha256}, @samp{sha512}, @samp{sha384}, @samp{tiger192}, @samp{tiger}, @samp{tiger2}, @samp{whirlpool}. Option @option{--uncompress} uncompresses files before computing hash. When list of files is given, hash of each file is computed and printed, followed by file name, each file on a new line. When option @option{--check} is given, it points to a file that contains list of @var{hash name} pairs in the same format as used by UNIX @command{md5sum} command. Option @option{--prefix} may be used to give directory where files are located. Hash verification stops after the first mismatch was found unless option @option{--keep-going} was given. The exit code @code{$?} is set to 0 if hash verification is successful. If it fails, @code{$?} is set to a nonzero value. @end deffn @node help @subsection help @deffn Command help [pattern @dots{}] Display helpful information about builtin commands. If you do not specify @var{pattern}, this command shows short descriptions of all available commands. If you specify any @var{patterns}, it displays longer information about each of the commands whose names begin with those @var{patterns}. @end deffn @node hexdump @subsection hexdump @deffn Command hexdump [--skip offset] [--length len] FILE_OR_DEVICE Show raw contents of a file or memory. When option @option{--skip} is given, @samp{offset} number of bytes are skipped from the start of the device or file given. And @option{--length} allows specifying a maximum number of bytes to be shown. If given the special device named @samp{(mem)}, then the @samp{offset} given to @option{--skip} is treated as the address of a memory location to dump from. Note: The dumping of RAM memory (by the (mem) argument) is not allowed when when lockdown is enforced (@pxref{Lockdown}). The dumping of disk or file data is allowed when lockdown is enforced. @end deffn @node insmod @subsection insmod @deffn Command insmod module Insert the dynamic GRUB module called @var{module}. @end deffn @node keystatus @subsection keystatus @deffn Command keystatus [@option{--shift}] [@option{--ctrl}] [@option{--alt}] Return true if the Shift, Control, or Alt modifier keys are held down, as requested by options. This is useful in scripting, to allow some user control over behaviour without having to wait for a keypress. Checking key modifier status is only supported on some platforms. If invoked without any options, the @command{keystatus} command returns true if and only if checking key modifier status is supported. @end deffn @node list_env @subsection list_env @deffn Command list_env [@option{--file} file] List all variables in the environment block file. @xref{Environment block}. The @option{--file} option overrides the default location of the environment block. @end deffn @node list_trusted @subsection list_trusted @deffn Command list_trusted List all public keys trusted by GRUB for validating signatures. The output is in GPG's v4 key fingerprint format (i.e., the output of @code{gpg --fingerprint}). The least significant four bytes (last eight hexadecimal digits) can be used as an argument to @command{distrust} (@pxref{distrust}). @xref{Using digital signatures}, for more information about uses for these keys. @end deffn @node load_env @subsection load_env @deffn Command load_env [@option{--file} file] [@option{--skip-sig}] [whitelisted_variable_name] @dots{} Load all variables from the environment block file into the environment. @xref{Environment block}. The @option{--file} option overrides the default location of the environment block. The @option{--skip-sig} option skips signature checking even when the value of environment variable @code{check_signatures} is set to @code{enforce} (@pxref{check_signatures}). If one or more variable names are provided as arguments, they are interpreted as a whitelist of variables to load from the environment block file. Variables set in the file but not present in the whitelist are ignored. The @option{--skip-sig} option should be used with care, and should always be used in concert with a whitelist of acceptable variables whose values should be set. Failure to employ a carefully constructed whitelist could result in reading a malicious value into critical environment variables from the file, such as setting @code{check_signatures=no}, modifying @code{prefix} to boot from an unexpected location or not at all, etc. When used with care, @option{--skip-sig} and the whitelist enable an administrator to configure a system to boot only signed configurations, but to allow the user to select from among multiple configurations, and to enable ``one-shot'' boot attempts and ``savedefault'' behavior. @xref{Using digital signatures}, for more information. @end deffn @node loadfont @subsection loadfont @deffn Command loadfont file @dots{} Load specified font files. Unless absolute pathname is given, @var{file} is assumed to be in directory @samp{$prefix/fonts} with suffix @samp{.pf2} appended. @xref{Theme file format,,Fonts}. @end deffn @node loopback @subsection loopback @deffn Command loopback [@option{-d}] [@option{-D}] device file Make the device named @var{device} correspond to the contents of the filesystem image in @var{file}. For example: @example loopback loop0 /path/to/image ls (loop0)/ @end example Specifying the @option{-D} option allows the loopback file to be tranparently decompressed if there is an appropriate decompressor loaded. With the @option{-d} option, delete a device previously created using this command. @end deffn @node ls @subsection ls @deffn Command ls [arg @dots{}] List devices or files. With no arguments, print all devices known to GRUB. If the argument is a device name enclosed in parentheses (@pxref{Device syntax}), then print the name of the filesystem of that device. If the argument is a directory given as an absolute file name (@pxref{File name syntax}), then list the contents of that directory. @end deffn @node lsfonts @subsection lsfonts @deffn Command lsfonts List loaded fonts. @end deffn @node lsmod @subsection lsmod @deffn Command lsmod Show list of loaded modules. @end deffn @node md5sum @subsection md5sum @deffn Command md5sum arg @dots{} Alias for @code{hashsum --hash md5 arg @dots{}}. See command @command{hashsum} (@pxref{hashsum}) for full description. @end deffn @node module @subsection module @deffn Command module [--nounzip] file [arguments] Load a module for multiboot kernel image. The rest of the line is passed verbatim as the module command line. @end deffn @node multiboot @subsection multiboot @deffn Command multiboot [--quirk-bad-kludge] [--quirk-modules-after-kernel] file @dots{} Load a multiboot kernel image from @var{file}. The rest of the line is passed verbatim as the @dfn{kernel command-line}. Any module must be reloaded after using this command (@pxref{module}). Some kernels have known problems. You need to specify --quirk-* for those. --quirk-bad-kludge is a problem seen in several products that they include loading kludge information with invalid data in ELF file. GRUB prior to 0.97 and some custom builds preferred ELF information while 0.97 and GRUB 2 use kludge. Use this option to ignore kludge. Known affected systems: old Solaris, SkyOS. --quirk-modules-after-kernel is needed for kernels which load at relatively high address e.g. 16MiB mark and can't cope with modules stuffed between 1MiB mark and beginning of the kernel. Known afftected systems: VMWare. @end deffn @node nativedisk @subsection nativedisk @deffn Command nativedisk Switch from firmware disk drivers to native ones. Really useful only on platforms where both firmware and native disk drives are available. Currently i386-pc, i386-efi, i386-ieee1275 and x86_64-efi. @end deffn @node normal @subsection normal @deffn Command normal [file] Enter normal mode and display the GRUB menu. In normal mode, commands, filesystem modules, and cryptography modules are automatically loaded, and the full GRUB script parser is available. Other modules may be explicitly loaded using @command{insmod} (@pxref{insmod}). If a @var{file} is given, then commands will be read from that file. Otherwise, they will be read from @file{$prefix/grub.cfg} if it exists. @command{normal} may be called from within normal mode, creating a nested environment. It is more usual to use @command{configfile} (@pxref{configfile}) for this. @end deffn @node normal_exit @subsection normal_exit @deffn Command normal_exit Exit normal mode (@pxref{normal}). If this instance of normal mode was not nested within another one, then return to rescue mode. @end deffn @node parttool @subsection parttool @deffn Command parttool partition commands Make various modifications to partition table entries. Each @var{command} is either a boolean option, in which case it must be followed with @samp{+} or @samp{-} (with no intervening space) to enable or disable that option, or else it takes a value in the form @samp{@var{command}=@var{value}}. Currently, @command{parttool} is only useful on DOS partition tables (also known as Master Boot Record, or MBR). On these partition tables, the following commands are available: @table @asis @item @samp{boot} (boolean) When enabled, this makes the selected partition be the active (bootable) partition on its disk, clearing the active flag on all other partitions. This command is limited to @emph{primary} partitions. @item @samp{type} (value) Change the type of an existing partition. The value must be a number in the range 0-0xFF (prefix with @samp{0x} to enter it in hexadecimal). @item @samp{hidden} (boolean) When enabled, this hides the selected partition by setting the @dfn{hidden} bit in its partition type code; when disabled, unhides the selected partition by clearing this bit. This is useful only when booting DOS or Windows and multiple primary FAT partitions exist in one disk. See also @ref{DOS/Windows}. @end table @end deffn @node password @subsection password @deffn Command password user clear-password Define a user named @var{user} with password @var{clear-password}. @xref{Security}. @end deffn @node password_pbkdf2 @subsection password_pbkdf2 @deffn Command password_pbkdf2 user hashed-password Define a user named @var{user} with password hash @var{hashed-password}. Use @command{grub-mkpasswd-pbkdf2} (@pxref{Invoking grub-mkpasswd-pbkdf2}) to generate password hashes. @xref{Security}. @end deffn @node plainmount @subsection plainmount @deffn Command plainmount device @option{-c} cipher @option{-s} key size [@option{-h} hash] [@option{-S} sector size] [@option{-p} password] [@option{-u} uuid] [[@option{-d} keyfile] [@option{-O} keyfile offset]] Setup access to the encrypted device in plain mode. Offset of the encrypted data at the device is specified in terms of 512 byte sectors using the blocklist syntax and loopback device. The following example shows how to specify 1MiB offset: @example loopback node (hd0,gpt1)2048+ plainmount node @var{...} @end example The @command{plainmount} command can be used to open LUKS encrypted volume if its master key and parameters (key size, cipher, offset, etc) are known. There are two ways to specify a password: a keyfile and a secret passphrase. The keyfile path parameter has higher priority than the secret passphrase parameter and is specified with the option @option{-d}. Password data obtained from keyfiles is not hashed and is used directly as a cipher key. An optional offset of password data in the keyfile can be specified with the option @option{-O} or directly with the option @option{-d} and GRUB blocklist syntax, if the keyfile data can be accessed from a device and is 512 byte aligned. The following example shows both methods to specify password data in the keyfile at offset 1MiB: @example plainmount -d (hd0,gpt1)2048+ @var{...} plainmount -d (hd0,gpt1)+ -O 1048576 @var{...} @end example If no keyfile is specified then the password is set to the string specified by option @option{-p} or is requested interactively from the console. In both cases the provided password is hashed with the algorithm specified by the option @option{-h}. This option is mandatory if no keyfile is specified, but it can be set to @samp{plain} which means that no hashing is done and such password is used directly as a key. Cipher @option{-c} and keysize @option{-s} options specify the cipher algorithm and the key size respectively and are mandatory options. Cipher must be specified with the mode separated by a dash (for example, @samp{aes-xts-plain64}). Key size option @option{-s} is the key size of the cipher in bits, not to be confused with the offset of the key data in a keyfile specified with the @option{-O} option. It must not exceed 1024 bits, so a 32 byte key would be specified as 256 bits The optional parameter @option{-S} specifies encrypted device sector size. It must be at least 512 bytes long (default value) and a power of 2. @footnote{Current implementation of cryptsetup supports only 512/1024/2048/4096 byte sectors}. Disk sector size is configured when creating the encrypted volume. Attempting to decrypt volumes with a different sector size than it was created with will not result in an error, but will decrypt to random bytes and thus prevent accessing the volume (in some cases the filesystem driver can detect the presence of a filesystem, but nevertheless will refuse to mount it). By default new plainmount devices will be given a UUID starting with '109fea84-a6b7-34a8-4bd1-1c506305a401' where the last digits are incremented by one for each plainmounted device beyond the first up to 2^10 devices. All encryption arguments (cipher, hash, key size, disk offset and disk sector size) must match the parameters used to create the volume. If any of them does not match the actual arguments used during the initial encryption, plainmount will create virtual device with the garbage data and GRUB will report unknown filesystem for such device. @end deffn @node play @subsection play @deffn Command play file | tempo [pitch1 duration1] [pitch2 duration2] @dots{} Plays a tune If the argument is a file name (@pxref{File name syntax}), play the tune recorded in it. The file format is first the tempo as an unsigned 32bit little-endian number, then pairs of unsigned 16bit little-endian numbers for pitch and duration pairs. If the arguments are a series of numbers, play the inline tune. The tempo is the base for all note durations. 60 gives a 1-second base, 120 gives a half-second base, etc. Pitches are Hz. Set pitch to 0 to produce a rest. @end deffn @node probe @subsection probe @deffn Command probe [@option{--set} var] @option{--driver}|@option{--partmap}|@option{--fs}|@option{--fs-uuid}|@option{--label}|@option{--part-uuid} device Retrieve device information. If option @option{--set} is given, assign result to variable @var{var}, otherwise print information on the screen. The option @option{--part-uuid} is currently only implemented for MSDOS and GPT formatted disks. @end deffn @node rdmsr @subsection rdmsr @deffn Command: rdmsr 0xADDR [-v VARNAME] Read a model-specific register at address 0xADDR. If the parameter @option{-v} is used and an environment variable @var{VARNAME} is given, set that environment variable to the value that was read. Please note that on SMP systems, reading from a MSR that has a scope per hardware thread, implies that the value that is returned only applies to the particular cpu/core/thread that runs the command. Also, if you specify a reserved or unimplemented MSR address, it will cause a general protection exception (which is not currently being handled) and the system will reboot. @end deffn @node read @subsection read @deffn Command read [-s] [var] Read a line of input from the user. If an environment variable @var{var} is given, set that environment variable to the line of input that was read, with no terminating newline. If the parameter @option{-s} is used, enable silent mode where input is not printed to the terminal. @end deffn @node reboot @subsection reboot @deffn Command reboot Reboot the computer. @end deffn @node regexp @subsection regexp @deffn Command regexp [@option{--set} [number:]var] regexp string Test if regular expression @var{regexp} matches @var{string}. Supported regular expressions are POSIX.2 Extended Regular Expressions. If option @option{--set} is given, store @var{number}th matched subexpression in variable @var{var}. Subexpressions are numbered in order of their opening parentheses starting from @samp{1}. @var{number} defaults to @samp{1}. @end deffn @node rmmod @subsection rmmod @deffn Command rmmod module Remove a loaded @var{module}. @end deffn @node save_env @subsection save_env @deffn Command save_env [@option{--file} file] var @dots{} Save the named variables from the environment to the environment block file. @xref{Environment block}. The @option{--file} option overrides the default location of the environment block. This command will operate successfully even when environment variable @code{check_signatures} is set to @code{enforce} (@pxref{check_signatures}), since it writes to disk and does not alter the behavior of GRUB based on any contents of disk that have been read. It is possible to modify a digitally signed environment block file from within GRUB using this command, such that its signature will no longer be valid on subsequent boots. Care should be taken in such advanced configurations to avoid rendering the system unbootable. @xref{Using digital signatures}, for more information. @end deffn @node search @subsection search @deffn Command search @ [@option{--file}|@option{--label}|@option{--fs-uuid}] @ [@option{--set} [var]] [@option{--no-floppy}|@option{--efidisk-only}|@option{--cryptodisk-only}] @ name Search devices by file (@option{-f}, @option{--file}), filesystem label (@option{-l}, @option{--label}), or filesystem UUID (@option{-u}, @option{--fs-uuid}). If the (@option{-s}, @option{--set}) option is used, the first device found is set as the value of environment variable @var{var}. The default variable is @samp{root}. The (@option{-n}, @option{--no-floppy}) option prevents searching floppy devices, which can be slow. The (@option{--efidisk-only}) option prevents searching any other devices then EFI disks. This is typically used when chainloading to local EFI partition. The (@option{--cryptodisk-only}) option prevents searching any devices other than encrypted disks. This is typically used when booting from an encrypted file system to ensure that no code gets executed from an unencrypted device having the same filesystem UUID or label. This option implicitly invokes the command @command{cryptocheck}, if it is available (@pxref{cryptocheck} for additional information). The @samp{search.file}, @samp{search.fs_label}, and @samp{search.fs_uuid} commands are aliases for @samp{search --file}, @samp{search --label}, and @samp{search --fs-uuid} respectively. Also hints as to which device may be the most likely to contain the item searched for may be given via the (@option{-h}, @option{--hint}) option with a device name as an argument. If the argument ends with a comma, then partitions on the device are also searched. Furthermore, platform specific hints may be given via the options @option{--hint-ieee1275}, @option{--hint-bios}, @option{--hint-baremetal}, @option{--hint-efi}, and @option{--hint-arc}. When specified, these options take an argument and operate like @option{--hint}, but only on the specified platform. @end deffn @node sendkey @subsection sendkey @deffn Command sendkey @ [@option{--num}|@option{--caps}|@option{--scroll}|@option{--insert}|@ @option{--pause}|@option{--left-shift}|@option{--right-shift}|@ @option{--sysrq}|@option{--numkey}|@option{--capskey}|@option{--scrollkey}|@ @option{--insertkey}|@option{--left-alt}|@option{--right-alt}|@ @option{--left-ctrl}|@option{--right-ctrl} @ @samp{on}|@samp{off}]@dots{} @ [@option{no-led}] @ keystroke Insert keystrokes into the keyboard buffer when booting. Sometimes an operating system or chainloaded boot loader requires particular keys to be pressed: for example, one might need to press a particular key to enter "safe mode", or when chainloading another boot loader one might send keystrokes to it to navigate its menu. Note: This command is currently only available on the i386-pc target. You may provide up to 16 keystrokes (the length of the BIOS keyboard buffer). Keystroke names may be upper-case or lower-case letters, digits, or taken from the following table: @c Please keep this table in the same order as in @c commands/i386/pc/sendkey.c, for ease of maintenance. @c Exception: The function and numeric keys are sorted, for aesthetics. @multitable @columnfractions .4 .5 @headitem Name @tab Key @item escape @tab Escape @item exclam @tab ! @item at @tab @@ @item numbersign @tab # @item dollar @tab $ @item percent @tab % @item caret @tab ^ @item ampersand @tab & @item asterisk @tab * @item parenleft @tab ( @item parenright @tab ) @item minus @tab - @item underscore @tab _ @item equal @tab = @item plus @tab + @item backspace @tab Backspace @item tab @tab Tab @item bracketleft @tab [ @item braceleft @tab @{ @item bracketright @tab ] @item braceright @tab @} @item enter @tab Enter @item control @tab press and release Control @item semicolon @tab ; @item colon @tab : @item quote @tab ' @item doublequote @tab " @item backquote @tab ` @item tilde @tab ~ @item shift @tab press and release left Shift @item backslash @tab \ @item bar @tab | @item comma @tab , @item less @tab < @item period @tab . @item greater @tab > @item slash @tab / @item question @tab ? @item rshift @tab press and release right Shift @item alt @tab press and release Alt @item space @tab space bar @item capslock @tab Caps Lock @item F1 @tab F1 @item F2 @tab F2 @item F3 @tab F3 @item F4 @tab F4 @item F5 @tab F5 @item F6 @tab F6 @item F7 @tab F7 @item F8 @tab F8 @item F9 @tab F9 @item F10 @tab F10 @item F11 @tab F11 @item F12 @tab F12 @item num1 @tab 1 (numeric keypad) @item num2 @tab 2 (numeric keypad) @item num3 @tab 3 (numeric keypad) @item num4 @tab 4 (numeric keypad) @item num5 @tab 5 (numeric keypad) @item num6 @tab 6 (numeric keypad) @item num7 @tab 7 (numeric keypad) @item num8 @tab 8 (numeric keypad) @item num9 @tab 9 (numeric keypad) @item num0 @tab 0 (numeric keypad) @item numperiod @tab . (numeric keypad) @item numend @tab End (numeric keypad) @item numdown @tab Down (numeric keypad) @item numpgdown @tab Page Down (numeric keypad) @item numleft @tab Left (numeric keypad) @item numcenter @tab 5 with Num Lock inactive (numeric keypad) @item numright @tab Right (numeric keypad) @item numhome @tab Home (numeric keypad) @item numup @tab Up (numeric keypad) @item numpgup @tab Page Up (numeric keypad) @item numinsert @tab Insert (numeric keypad) @item numdelete @tab Delete (numeric keypad) @item numasterisk @tab * (numeric keypad) @item numminus @tab - (numeric keypad) @item numplus @tab + (numeric keypad) @item numslash @tab / (numeric keypad) @item numenter @tab Enter (numeric keypad) @item delete @tab Delete @item insert @tab Insert @item home @tab Home @item end @tab End @item pgdown @tab Page Down @item pgup @tab Page Up @item down @tab Down @item up @tab Up @item left @tab Left @item right @tab Right @end multitable As well as keystrokes, the @command{sendkey} command takes various options that affect the BIOS keyboard status flags. These options take an @samp{on} or @samp{off} parameter, specifying that the corresponding status flag be set or unset; omitting the option for a given status flag will leave that flag at its initial state at boot. The @option{--num}, @option{--caps}, @option{--scroll}, and @option{--insert} options emulate setting the corresponding mode, while the @option{--numkey}, @option{--capskey}, @option{--scrollkey}, and @option{--insertkey} options emulate pressing and holding the corresponding key. The other status flag options are self-explanatory. If the @option{--no-led} option is given, the status flag options will have no effect on keyboard LEDs. If the @command{sendkey} command is given multiple times, then only the last invocation has any effect. Since @command{sendkey} manipulates the BIOS keyboard buffer, it may cause hangs, reboots, or other misbehaviour on some systems. If the operating system or boot loader that runs after GRUB uses its own keyboard driver rather than the BIOS keyboard functions, then @command{sendkey} will have no effect. This command is only available on PC BIOS systems. @end deffn @node set @subsection set @deffn Command set [envvar=value] Set the environment variable @var{envvar} to @var{value}. If invoked with no arguments, print all environment variables with their values. For the list of environment variables currently used by GRUB itself see the relevant section @pxref{Environment}. @end deffn @node sha1sum @subsection sha1sum @deffn Command sha1sum arg @dots{} Alias for @code{hashsum --hash sha1 arg @dots{}}. See command @command{hashsum} (@pxref{hashsum}) for full description. @end deffn @node sha256sum @subsection sha256sum @deffn Command sha256sum arg @dots{} Alias for @code{hashsum --hash sha256 arg @dots{}}. See command @command{hashsum} (@pxref{hashsum}) for full description. @end deffn @node sha512sum @subsection sha512sum @deffn Command sha512sum arg @dots{} Alias for @code{hashsum --hash sha512 arg @dots{}}. See command @command{hashsum} (@pxref{hashsum}) for full description. @end deffn @node sleep @subsection sleep @deffn Command sleep [@option{--verbose}] [@option{--interruptible}] count Sleep for @var{count} seconds. If option @option{--interruptible} is given, allow pressing @key{ESC}, @key{F4} or holding down @key{SHIFT} to interrupt sleep. With @option{--verbose} show countdown of remaining seconds. Exit code is set to 0 if timeout expired and to 1 if timeout was interrupted using any of the mentioned keys. @end deffn @node smbios @subsection smbios @deffn Command smbios @ [@option{--type} @var{type}] @ [@option{--handle} @var{handle}] @ [@option{--match} @var{match}] @ (@option{--get-byte} | @option{--get-word} | @option{--get-dword} | @ @option{--get-qword} | @option{--get-string} | @option{--get-uuid}) @ @var{offset} @ [@option{--set} @var{variable}] Retrieve SMBIOS information. The @command{smbios} command returns the value of a field in an SMBIOS structure. The following options determine which structure to select. @itemize @bullet @item Specifying @option{--type} will select structures with a matching @var{type}. The type can be any integer from 0 to 255. @item Specifying @option{--handle} will select structures with a matching @var{handle}. The handle can be any integer from 0 to 65535. @item Specifying @option{--match} will select structure number @var{match} in the filtered list of structures; e.g. @code{smbios --type 4 --match 2} will select the second Process Information (Type 4) structure. The list is always ordered the same as the hardware's SMBIOS table. The match number must be a positive integer. If unspecified, the first matching structure will be selected. @end itemize The remaining options determine which field in the selected SMBIOS structure to return. Only one of these options may be specified at a time. @itemize @bullet @item When given @option{--get-byte}, return the value of the byte at @var{offset} bytes into the selected SMBIOS structure. It will be formatted as an unsigned decimal integer. @item When given @option{--get-word}, return the value of the word (two bytes) at @var{offset} bytes into the selected SMBIOS structure. It will be formatted as an unsigned decimal integer. @item When given @option{--get-dword}, return the value of the dword (four bytes) at @var{offset} bytes into the selected SMBIOS structure. It will be formatted as an unsigned decimal integer. @item When given @option{--get-qword}, return the value of the qword (eight bytes) at @var{offset} bytes into the selected SMBIOS structure. It will be formatted as an unsigned decimal integer. @item When given @option{--get-string}, return the string with its index found at @var{offset} bytes into the selected SMBIOS structure. @item When given @option{--get-uuid}, return the value of the UUID (sixteen bytes) at @var{offset} bytes into the selected SMBIOS structure. It will be formatted as lower-case hyphenated hexadecimal digits, with the first three fields as little-endian, and the rest printed byte-by-byte. @end itemize The default action is to print the value of the requested field to the console, but a variable name can be specified with @option{--set} to store the value instead of printing it. For example, this will store and then display the system manufacturer's name. @example smbios --type 1 --get-string 4 --set system_manufacturer echo $system_manufacturer @end example @end deffn @node source @subsection source @deffn Command source file Read @var{file} as a configuration file, as if its contents had been incorporated directly into the sourcing file. Unlike @command{configfile} (@pxref{configfile}), this executes the contents of @var{file} without changing context: any environment variable changes made by the commands in @var{file} will be preserved after @command{source} returns, and the menu will not be shown immediately. @end deffn @node test @subsection test @deffn Command test expression Evaluate @var{expression} and return zero exit status if result is true, non zero status otherwise. @var{expression} is one of: @table @asis @item @var{string1} @code{==} @var{string2} the strings are equal @item @var{string1} @code{!=} @var{string2} the strings are not equal @item @var{string1} @code{<} @var{string2} @var{string1} is lexicographically less than @var{string2} @item @var{string1} @code{<=} @var{string2} @var{string1} is lexicographically less or equal than @var{string2} @item @var{string1} @code{>} @var{string2} @var{string1} is lexicographically greater than @var{string2} @item @var{string1} @code{>=} @var{string2} @var{string1} is lexicographically greater or equal than @var{string2} @item @var{integer1} @code{-eq} @var{integer2} @var{integer1} is equal to @var{integer2} @item @var{integer1} @code{-ge} @var{integer2} @var{integer1} is greater than or equal to @var{integer2} @item @var{integer1} @code{-gt} @var{integer2} @var{integer1} is greater than @var{integer2} @item @var{integer1} @code{-le} @var{integer2} @var{integer1} is less than or equal to @var{integer2} @item @var{integer1} @code{-lt} @var{integer2} @var{integer1} is less than @var{integer2} @item @var{integer1} @code{-ne} @var{integer2} @var{integer1} is not equal to @var{integer2} @item @var{prefix}@var{integer1} @code{-pgt} @var{prefix}@var{integer2} @var{integer1} is greater than @var{integer2} after stripping off common non-numeric @var{prefix}. @item @var{prefix}@var{integer1} @code{-plt} @var{prefix}@var{integer2} @var{integer1} is less than @var{integer2} after stripping off common non-numeric @var{prefix}. @item @var{file1} @code{-nt} @var{file2} @var{file1} is newer than @var{file2} (modification time). Optionally numeric @var{bias} may be directly appended to @code{-nt} in which case it is added to the first file modification time. @item @var{file1} @code{-ot} @var{file2} @var{file1} is older than @var{file2} (modification time). Optionally numeric @var{bias} may be directly appended to @code{-ot} in which case it is added to the first file modification time. @item @code{-d} @var{file} @var{file} exists and is a directory @item @code{-e} @var{file} @var{file} exists @item @code{-f} @var{file} @var{file} exists and is not a directory @item @code{-s} @var{file} @var{file} exists and has a size greater than zero @item @code{-n} @var{string} the length of @var{string} is nonzero @item @var{string} @var{string} is equivalent to @code{-n @var{string}} @item @code{-z} @var{string} the length of @var{string} is zero @item @code{(} @var{expression} @code{)} @var{expression} is true @item @code{!} @var{expression} @var{expression} is false @item @var{expression1} @code{-a} @var{expression2} both @var{expression1} and @var{expression2} are true @item @var{expression1} @var{expression2} both @var{expression1} and @var{expression2} are true. This syntax is not POSIX-compliant and is not recommended. @item @var{expression1} @code{-o} @var{expression2} either @var{expression1} or @var{expression2} is true @end table @end deffn @node tpm2_key_protector_init @subsection tpm2_key_protector_init @deffn Command tpm2_key_protector_init [@option{--mode} | @option{-m} mode] | [@option{--pcrs} | @option{-p} pcrlist] | [@option{--bank} | @option{-b} pcrbank] | [ [@option{--tpm2key} | @option{-T} tpm2key_file] | [@option{--keyfile} | @option{-k} keyfile] ] | [@option{--srk} | @option{-s} handle] | [@option{--asymmetric} | @option{-a} srk_type] | [@option{--nvindex} | @option{-n} nv_index] Initialize the TPM2 key protector to unseal the key for the @command{cryptomount} (@pxref{cryptomount}) command. There are two supported modes, SRK(@kbd{srk}) and NV index(@kbd{nv}), to be specified by the option @option{-m}. The default mode is SRK. The main difference between SRK mode and NV index mode is the storage of the sealed key. For SRK mode, the sealed key is stored in a file while NV index mode stores the sealed key in the non-volatile memory inside TPM with a given NV index. The @option{-p} and @option{-b} options are used to supply the PCR list and bank that the key is sealed with. The PCR list is a comma-separated list, e.g., '0,2,4,7,9', to represent the involved PCRs, and the default is '7'. The PCR bank is chosen by selecting a hash algorithm. The current supported PCR banks are SHA1, SHA256, SHA384, and SHA512, and the default is SHA256. Some options are only available for the specific mode. The SRK-specific options are @option{-T}, @option{-k}, @option{-a}, and @option{-s}. On the other hand, the NV index-specific option is @option{-n}. The key file for SRK mode can be supplied with either @option{-T} or @option{-k}. Those two options were used to distinguish the file formats but are same now. There are two supported file formats: raw format and TPM 2.0 Key File format. When using the key file in the raw format, the @option{-p} and @option{-b} options are necessary for the non-default PCR list or bank. On the other hand, when using the key file in TPM 2.0 Key File format, the the parameters for the TPM commands are written in the file, and there is no need to set the PCR list(@option{-p}) and bank(@option{-b}). In general, TPM 2.0 Key File format is preferred due to the simplified GRUB command options and the authorized policy support Besides the key file, there are two options, @option{-a} and @option{-s}, to tweak the TPM Storage Root Key (SRK). The SRK can be either created at runtime or stored in the non-volatile memory. When creating SRK at runtime, GRUB provides the SRK template to the TPM to create the key. There are two SRK templates for the @option{-a} option, ECC and RSA, and the default is ECC. If the SRK is stored in a specific handle, e.g. @code{0x81000001}, the @option{-s} option can be used to set the handle to notify GRUB to load the SRK from the given handle. The only NV index-specific option is the @option{-n} option which is used to set the NV index containing the sealed key. Then GRUB can load the sealed key and unseal it with the given PCR list and bank. @end deffn @node tpm2_key_protector_clear @subsection tpm2_key_protector_clear @deffn Command tpm2_key_protector_clear Clear the TPM2 key protector if previously initialized. @end deffn @node tpm2_dump_pcr @subsection tpm2_dump_pcr @deffn Command tpm2_dump_pcr [@var{bank}] Print all PCRs of the specified TPM 2.0 @var{bank}. The supported banks are @samp{sha1}, @samp{sha256}, @samp{sha384}, and @samp{sha512}. If @var{bank} is not specified, @samp{sha256} is chosen by default. Since GRUB measures every command into PCR 8, invoking @command{tpm2_dump_pcr} also extends PCR 8, so PCR 8 will not be a stable value in GRUB shell. @end deffn @node true @subsection true @deffn Command true Do nothing, successfully. This is mainly useful in control constructs such as @code{if} and @code{while} (@pxref{Shell-like scripting}). @end deffn @node trust @subsection trust @deffn Command trust [@option{--skip-sig}] pubkey_file Read public key from @var{pubkey_file} and add it to GRUB's internal list of trusted public keys. These keys are used to validate digital signatures when environment variable @code{check_signatures} is set to @code{enforce}. Note that if @code{check_signatures} is set to @code{enforce} when @command{trust} executes, then @var{pubkey_file} must itself be properly signed. The @option{--skip-sig} option can be used to disable signature-checking when reading @var{pubkey_file} itself. It is expected that @option{--skip-sig} is useful for testing and manual booting. @xref{Using digital signatures}, for more information. @end deffn @node unset @subsection unset @deffn Command unset envvar Unset the environment variable @var{envvar}. @end deffn @ignore @node vbeinfo @subsection vbeinfo @deffn Command vbeinfo [[WxH]xD] Alias for command @command{videoinfo} (@pxref{videoinfo}). It is available only on PC BIOS platforms. @end deffn @end ignore @node verify_detached @subsection verify_detached @deffn Command verify_detached [@option{--skip-sig}] file signature_file [pubkey_file] Verifies a GPG-style detached signature, where the signed file is @var{file}, and the signature itself is in file @var{signature_file}. Optionally, a specific public key to use can be specified using @var{pubkey_file}. When environment variable @code{check_signatures} is set to @code{enforce}, then @var{pubkey_file} must itself be properly signed by an already-trusted key. An unsigned @var{pubkey_file} can be loaded by specifying @option{--skip-sig}. If @var{pubkey_file} is omitted, then public keys from GRUB's trusted keys (@pxref{list_trusted}, @pxref{trust}, and @pxref{distrust}) are tried. Exit code @code{$?} is set to 0 if the signature validates successfully. If validation fails, it is set to a non-zero value. @xref{Using digital signatures}, for more information. @end deffn @node videoinfo @subsection videoinfo @deffn Command videoinfo [[WxH]xD] List available video modes. If resolution is given, show only matching modes. @end deffn @node wrmsr @subsection wrmsr @deffn Command: wrmsr 0xADDR 0xVALUE Write a 0xVALUE to a model-specific register at address 0xADDR. Please note that on SMP systems, writing to a MSR that has a scope per hardware thread, implies that the value that is written only applies to the particular cpu/core/thread that runs the command. Also, if you specify a reserved or unimplemented MSR address, it will cause a general protection exception (which is not currently being handled) and the system will reboot. Note: The command is not allowed when lockdown is enforced (@pxref{Lockdown}). This is done to prevent subverting various security mechanisms. @end deffn @node Networking commands @section Networking commands @menu * net_add_addr:: Add a network address * net_add_dns:: Add a DNS server * net_add_route:: Add routing entry * net_bootp:: Perform a bootp/DHCP autoconfiguration * net_del_addr:: Remove IP address from interface * net_del_dns:: Remove a DNS server * net_del_route:: Remove a route entry * net_dhcp:: Perform a DHCP autoconfiguration * net_get_dhcp_option:: Retrieve DHCP options * net_ipv6_autoconf:: Perform IPv6 autoconfiguration * net_ls_addr:: List interfaces * net_ls_cards:: List network cards * net_ls_dns:: List DNS servers * net_ls_routes:: List routing entries * net_nslookup:: Perform a DNS lookup * net_set_vlan:: Set vlan id on an interface @end menu @node net_add_addr @subsection net_add_addr @deffn Command net_add_addr @var{interface} @var{card} @var{address} Configure additional network @var{interface} with @var{address} on a network @var{card}. @var{address} can be either IP in dotted decimal notation, or symbolic name which is resolved using DNS lookup. If successful, this command also adds local link routing entry to the default subnet of @var{address} with name @var{interface}@samp{:local} via @var{interface}. @end deffn @node net_add_dns @subsection net_add_dns @deffn Command net_add_dns @var{server} Resolve @var{server} IP address and add to the list of DNS servers used during name lookup. @end deffn @node net_add_route @subsection net_add_route @deffn Command net_add_route @var{shortname} @var{ip}[/@var{prefix}] [@var{interface} | @samp{gw} @var{gateway}] Add route to network with address @var{ip} as modified by @var{prefix} via either local @var{interface} or @var{gateway}. @var{prefix} is optional and defaults to 32 for IPv4 address and 128 for IPv6 address. Route is identified by @var{shortname} which can be used to remove it (@pxref{net_del_route}). @end deffn @node net_bootp @subsection net_bootp @deffn Command net_bootp [@var{card}] Alias for net_dhcp, for compatibility with older Grub versions. Will perform the same DHCP handshake with potential fallback to BOOTP as the net_dhcp command (@pxref{net_dhcp}). @end deffn @node net_del_addr @subsection net_del_addr @deffn Command net_del_addr @var{interface} Remove configured @var{interface} with associated address. @end deffn @node net_del_dns @subsection net_del_dns @deffn Command net_del_dns @var{address} Remove @var{address} from list of servers used during name lookup. @end deffn @node net_del_route @subsection net_del_route @deffn Command net_del_route @var{shortname} Remove route entry identified by @var{shortname}. @end deffn @node net_dhcp @subsection net_dhcp @deffn Command net_dhcp [@var{card}] Perform configuration of @var{card} using DHCP protocol. If no card name is specified, try to configure all existing cards. Falls back to the BOOTP protocol, if needed. If configuration was successful, interface with name @var{card}@samp{:dhcp} and configured address is added to @var{card}. @comment If server provided gateway information in @comment DHCP ACK packet, it is added as route entry with the name @var{card}@samp{:dhcp:gw}. Additionally the following DHCP options are recognized and processed: @table @samp @item 1 (Subnet Mask) Used to calculate network local routing entry for interface @var{card}@samp{:dhcp}. @item 3 (Router) Adds default route entry with the name @var{card}@samp{:dhcp:default} via gateway from DHCP option. Note that only option with single route is accepted. @item 6 (Domain Name Server) Adds all servers from option value to the list of servers used during name resolution. @item 12 (Host Name) Sets environment variable @samp{net_}@var{}@samp{_dhcp_hostname} (@pxref{net_@var{}_hostname}) to the value of option. @item 15 (Domain Name) Sets environment variable @samp{net_}@var{}@samp{_dhcp_domain} (@pxref{net_@var{}_domain}) to the value of option. @item 17 (Root Path) Sets environment variable @samp{net_}@var{}@samp{_dhcp_rootpath} (@pxref{net_@var{}_rootpath}) to the value of option. @item 18 (Extensions Path) Sets environment variable @samp{net_}@var{}@samp{_dhcp_extensionspath} (@pxref{net_@var{}_extensionspath}) to the value of option. @item 66 (TFTP Server Name) Sets environment variable @samp{net_}@var{}@samp{_dhcp_server_name} (@pxref{net_@var{}_dhcp_server_name}) to the value of option. @item 67 (Filename) Sets environment variable @samp{net_}@var{}@samp{_boot_file} (@pxref{net_@var{}_boot_file}) to the value of option. @end table @end deffn @node net_get_dhcp_option @subsection net_get_dhcp_option @deffn Command net_get_dhcp_option @var{var} @var{interface} @var{number} @var{type} Request DHCP option @var{number} of @var{type} via @var{interface}. @var{type} can be one of @samp{string}, @samp{number} or @samp{hex}. If option is found, assign its value to variable @var{var}. Values of types @samp{number} and @samp{hex} are converted to string representation. @end deffn @node net_ipv6_autoconf @subsection net_ipv6_autoconf @deffn Command net_ipv6_autoconf [@var{card}] Perform IPv6 autoconfiguration by adding to the @var{card} interface with name @var{card}@samp{:link} and link local MAC-based address. If no card is specified, perform autoconfiguration for all existing cards. @end deffn @node net_ls_addr @subsection net_ls_addr @deffn Command net_ls_addr List all configured interfaces with their MAC and IP addresses. @end deffn @node net_ls_cards @subsection net_ls_cards @deffn Command net_ls_cards List all detected network cards with their MAC address. @end deffn @node net_ls_dns @subsection net_ls_dns @deffn Command net_ls_dns List addresses of DNS servers used during name lookup. @end deffn @node net_ls_routes @subsection net_ls_routes @deffn Command net_ls_routes List routing entries. @end deffn @node net_nslookup @subsection net_nslookup @deffn Command net_nslookup @var{name} [@var{server}] Resolve address of @var{name} using DNS server @var{server}. If no server is given, use default list of servers. @end deffn @node net_set_vlan @subsection net_set_vlan @deffn Command net_set_vlan @var{interface} @var{vlanid} Set the 802.1Q VLAN identifier on @var{interface} to @var{vlanid}. For example, to set the VLAN identifier on interface @samp{efinet1} to @samp{100}: @example net_set_vlan efinet1 100 @end example The VLAN identifier can be removed by setting it to @samp{0}: @example net_set_vlan efinet1 0 @end example @end deffn @node Undocumented commands @section Commands currently undocumented Unfortunately, not all GRUB commands are documented at this time due to developer resource constraints. One way to contribute back to the GRUB project would be to help document these commands, and submit patches or ideas to the mailing list. The following is a (most likely incomplete) list of undocumented or poorly documented commands and not all of them are allowed for all platforms. Running the command help from within the GRUB shell may provide more information on parameters and usage. @itemize @bullet @item @command{all_functional_test} - Run all functional tests. @item @command{backtrace} - Print backtrace. @item @command{boottime} - Show boot time statistics. @item @command{cacheinfo} - Get disk cache info. @item @command{cbmemc} - Show CBMEM console content. @item @command{cmosset} - Set bit at BYTE:BIT in CMOS. @item @command{coreboot_boottime} - Show coreboot boot time statistics. @item @command{dump} - Show memory contents. @item @command{efiemu_loadcore} - Load and initialize EFI emulator. @item @command{efiemu_prepare} - Finalize loading of EFI emulator. @item @command{efiemu_unload} - Unload EFI emulator. @item @command{exit} - Exit from GRUB. @item @command{extract_entries_configfile} - Load another config file but take only menu entries. @item @command{extract_entries_source} - Load another config file without changing context but take only menu entries. @item @command{extract_legacy_entries_configfile} - Parse legacy config in new context taking only menu entries @item @command{extract_legacy_entries_source} - Parse legacy config in same context taking only menu entries @item @command{extract_syslinux_entries_configfile} - Execute syslinux config in new context taking only menu entries @item @command{extract_syslinux_entries_source} - Execute syslinux config in same context taking only menu entries @item @command{fakebios} - Create BIOS-like structures for backward compatibility with existing OS. @item @command{fix_video} - Fix video problem. @item @command{fpswa} - Display FPSWA version. @item @command{functional_test} - Run all loaded functional tests. @item @command{gdbstub_break} - Break into GDB @item @command{gdbstub} - Start GDB stub on given port @item @command{gdbstub_stop} - Stop GDB stub @item @command{hdparm} - Get/set ATA disk parameters. @item @command{hexdump_random} - Hexdump random data. @item @command{inb} - Read 8-bit value from PORT. @item @command{inl} - Read 32-bit value from PORT. @item @command{inw} - Read 16-bit value from PORT. @item @command{jpegtest} - Tests loading of JPEG bitmap. @item @command{keymap} - Load a keyboard layout. @item @command{legacy_check_password} - Simulate grub-legacy `password' command in menu entry mode @item @command{legacy_configfile} - Parse legacy config in new context @item @command{legacy_password} - Simulate grub-legacy `password' command @item @command{legacy_source} - Parse legacy config in same context @item @command{loadbios} - Load BIOS dump. @item @command{lsacpi} - Show ACPI information. @item @command{lsapm} - Show APM information. @item @command{lscoreboot} - List coreboot tables. @item @command{lsdev} - List devices. @item @command{lsefi} - Display EFI handles. @item @command{lsefimmap} - Display EFI memory map. @item @command{lsefisystab} - Display EFI system tables. @item @command{lsmmap} - List memory map provided by firmware. @item @command{lspci} - List PCI devices. @item @command{lssal} - Display SAL system table. @item @command{lsspd} - Print Memory information. @item @command{macppcbless} - Bless DIR of HFS or HFS+ partition for PPC macs. @item @command{mactelbless} - Bless FILE of HFS or HFS+ partition for intel macs. @item @command{net_set_vlan} - Set an interface's vlan id. @item @command{outb} - Write 8-bit VALUE to PORT. @item @command{outl} - Write 32-bit VALUE to PORT. @item @command{outw} - Write 16-bit VALUE to PORT. @item @command{pcidump} - Show raw dump of the PCI configuration space. @item @command{pngtest} - Tests loading of PNG bitmap. @item @command{read_byte} - Read 8-bit value from ADDR. @item @command{read_dword} - Read 32-bit value from ADDR. @item @command{read_word} - Read 16-bit value from ADDR. @item @command{setpci} - Manipulate PCI devices. @item @command{suspend} - Return to IEEE1275 prompt. @item @command{syslinux_configfile} - Execute syslinux config in new context @item @command{syslinux_source} - Execute syslinux config in same context @item @command{test_blockarg} - Print and execute block argument., 0 @item @command{testload} - Load the same file in multiple ways. @item @command{testspeed} - Test file read speed. @item @command{tgatest} - Tests loading of TGA bitmap. @item @command{time} - Measure time used by COMMAND @item @command{tr} - Translate SET1 characters to SET2 in STRING. @item @command{usb} - Test USB support. @item @command{vbeinfo} - List available video modes. If resolution is given show only modes matching it. @item @command{vbetest} - Test video subsystem. @item @command{videotest} - Test video subsystem in mode WxH. @item @command{write_byte} - Write 8-bit VALUE to ADDR. @item @command{write_dword} - Write 32-bit VALUE to ADDR. @item @command{write_word} - Write 16-bit VALUE to ADDR. @item @command{xen_cat} - List Xen storage. @item @command{xen_ls} - List Xen storage. @item @command{xnu_devprop_load} - Load `device-properties' dump. @item @command{xnu_uuid} - Transform 64-bit UUID to format suitable for XNU. If -l is given keep it lowercase as done by blkid. @item @command{zfs-bootfs} - Print ZFS-BOOTFSOBJ or store it into VARIABLE @item @command{zfsinfo} - Print ZFS info about DEVICE. @item @command{zfskey} - Import ZFS wrapping key stored in FILE. @end itemize @node Internationalisation @chapter Internationalisation @section Charset GRUB uses UTF-8 internally other than in rendering where some GRUB-specific appropriate representation is used. All text files (including config) are assumed to be encoded in UTF-8. @section Filesystems NTFS, JFS, UDF, HFS+, exFAT, long filenames in FAT, Joliet part of ISO9660 are treated as UTF-16 as per specification. AFS and BFS are read as UTF-8, again according to specification. BtrFS, cpio, tar, squash4, minix, minix2, minix3, ROMFS, ReiserFS, XFS, EROFS, ext2, ext3, ext4, FAT (short names), F2FS, RockRidge part of ISO9660, nilfs2, UFS1, UFS2 and ZFS are assumed to be UTF-8. This might be false on systems configured with legacy charset but as long as the charset used is superset of ASCII you should be able to access ASCII-named files. And it's recommended to configure your system to use UTF-8 to access the filesystem, convmv may help with migration. ISO9660 (plain) filenames are specified as being ASCII or being described with unspecified escape sequences. GRUB assumes that the ISO9660 names are UTF-8 (since any ASCII is valid UTF-8). There are some old CD-ROMs which use CP437 in non-compliant way. You're still able to access files with names containing only ASCII characters on such filesystems though. You're also able to access any file if the filesystem contains valid Joliet (UTF-16) or RockRidge (UTF-8). AFFS, SFS and HFS never use unicode and GRUB assumes them to be in Latin1, Latin1 and MacRoman respectively. GRUB handles filesystem case-insensitivity however no attempt is performed at case conversion of international characters so e.g. a file named lowercase greek alpha is treated as different from the one named as uppercase alpha. The filesystems in questions are NTFS (except POSIX namespace), HFS+ (configurable at mkfs time, default insensitive), SFS (configurable at mkfs time, default insensitive), JFS (configurable at mkfs time, default sensitive), HFS, AFFS, FAT, exFAT and ZFS (configurable on per-subvolume basis by property ``casesensitivity'', default sensitive). On ZFS subvolumes marked as case insensitive files containing lowercase international characters are inaccessible. Also like all supported filesystems except HFS+ and ZFS (configurable on per-subvolume basis by property ``normalization'', default none) GRUB makes no attempt at check of canonical equivalence so a file name u-diaresis is treated as distinct from u+combining diaresis. This however means that in order to access file on HFS+ its name must be specified in normalisation form D. On normalized ZFS subvolumes filenames out of normalisation are inaccessible. @section Output terminal Firmware output console ``console'' on ARC and IEEE1275 are limited to ASCII. BIOS firmware console and VGA text are limited to ASCII and some pseudographics. None of above mentioned is appropriate for displaying international and any unsupported character is replaced with question mark except pseudographics which we attempt to approximate with ASCII. EFI console on the other hand nominally supports UTF-16 but actual language coverage depends on firmware and may be very limited. The encoding used on serial can be chosen with @command{terminfo} as either ASCII, UTF-8 or ``visual UTF-8''. Last one is against the specification but results in correct rendering of right-to-left on some readers which don't have own bidi implementation. On emu GRUB checks if charset is UTF-8 and uses it if so and uses ASCII otherwise. When using gfxterm or gfxmenu GRUB itself is responsible for rendering the text. In this case GRUB is limited by loaded fonts. If fonts contain all required characters then bidirectional text, cursive variants and combining marks other than enclosing, half (e.g. left half tilde or combining overline) and double ones. Ligatures aren't supported though. This should cover European, Middle Eastern (if you don't mind lack of lam-alif ligature in Arabic) and East Asian scripts. Notable unsupported scripts are Brahmic family and derived as well as Mongolian, Tifinagh, Korean Jamo (precomposed characters have no problem) and tonal writing (2e5-2e9). GRUB also ignores deprecated (as specified in Unicode) characters (e.g. tags). GRUB also doesn't handle so called ``annotation characters'' If you can complete either of two lists or, better, propose a patch to improve rendering, please contact developer team. @section Input terminal Firmware console on BIOS, IEEE1275 and ARC doesn't allow you to enter non-ASCII characters. EFI specification allows for such but author is unaware of any actual implementations. Serial input is currently limited for latin1 (unlikely to change). Own keyboard implementations (at_keyboard and usb_keyboard) supports any key but work on one-char-per-keystroke. So no dead keys or advanced input method. Also there is no keymap change hotkey. In practice it makes difficult to enter any text using non-Latin alphabet. Moreover all current input consumers are limited to ASCII. @section Gettext GRUB supports being translated. For this you need to have language *.mo files in $prefix/locale, load gettext module and set ``lang'' variable. @section Regexp Regexps work on unicode characters, however no attempt at checking canonical equivalence has been made. Moreover the classes like [:alpha:] match only ASCII subset. @section Other Currently GRUB always uses YEAR-MONTH-DAY HOUR:MINUTE:SECOND [WEEKDAY] 24-hour datetime format but weekdays are translated. GRUB always uses the decimal number format with [0-9] as digits and . as descimal separator and no group separator. IEEE1275 aliases are matched case-insensitively except non-ASCII which is matched as binary. Similar behaviour is for matching OSBundleRequired. Since IEEE1275 aliases and OSBundleRequired don't contain any non-ASCII it should never be a problem in practice. Case-sensitive identifiers are matched as raw strings, no canonical equivalence check is performed. Case-insensitive identifiers are matched as RAW but additionally [a-z] is equivalent to [A-Z]. GRUB-defined identifiers use only ASCII and so should user-defined ones. Identifiers containing non-ASCII may work but aren't supported. Only the ASCII space characters (space U+0020, tab U+000b, CR U+000d and LF U+000a) are recognised. Other unicode space characters aren't a valid field separator. @command{test} (@pxref{test}) tests <, >, <=, >=, -pgt and -plt compare the strings in the lexicographical order of unicode codepoints, replicating the behaviour of test from coreutils. environment variables and commands are listed in the same order. @node Security @chapter Security @menu * Authentication and authorisation:: Users and access control * Using digital signatures:: Booting digitally signed code * UEFI secure boot and shim:: Booting digitally signed PE files * Secure Boot Advanced Targeting:: Embedded information for generation number based revocation * Measured Boot:: Measuring boot components * Lockdown:: Lockdown when booting on a secure setup * TPM2 key protector:: Managing disk key with TPM2 key protector @end menu @node Authentication and authorisation @section Authentication and authorisation in GRUB By default, the boot loader interface is accessible to anyone with physical access to the console: anyone can select and edit any menu entry, and anyone can get direct access to a GRUB shell prompt. For most systems, this is reasonable since anyone with direct physical access has a variety of other ways to gain full access, and requiring authentication at the boot loader level would only serve to make it difficult to recover broken systems. However, in some environments, such as kiosks, it may be appropriate to lock down the boot loader to require authentication before performing certain operations. The @samp{password} (@pxref{password}) and @samp{password_pbkdf2} (@pxref{password_pbkdf2}) commands can be used to define users, each of which has an associated password. @samp{password} sets the password in plain text, requiring @file{grub.cfg} to be secure; @samp{password_pbkdf2} sets the password hashed using the Password-Based Key Derivation Function (RFC 2898), requiring the use of @command{grub-mkpasswd-pbkdf2} (@pxref{Invoking grub-mkpasswd-pbkdf2}) to generate password hashes. In order to enable authentication support, the @samp{superusers} environment variable must be set to a list of usernames, separated by any of spaces, commas, semicolons, pipes, or ampersands. Superusers are permitted to use the GRUB command line, edit menu entries, and execute any menu entry. If @samp{superusers} is set, then use of the command line and editing of menu entries are automatically restricted to superusers. Setting @samp{superusers} to empty string effectively disables both access to CLI and editing of menu entries. Building a grub image with @samp{--disable-cli} option will also disable access to CLI and editing of menu entries, as well as disabling rescue mode. Note: The environment variable needs to be exported to also affect the section defined by the @samp{submenu} command (@pxref{submenu}). Other users may be allowed to execute specific menu entries by giving a list of usernames (as above) using the @option{--users} option to the @samp{menuentry} command (@pxref{menuentry}). If the @option{--unrestricted} option is used for a menu entry, then that entry is unrestricted. If the @option{--users} option is not used for a menu entry, then that only superusers are able to use it. Putting this together, a typical @file{grub.cfg} fragment might look like this: @example @group set superusers="root" password_pbkdf2 root grub.pbkdf2.sha512.10000.biglongstring password user1 insecure menuentry "May be run by any user" --unrestricted @{ set root=(hd0,1) linux /vmlinuz @} menuentry "Superusers only" --users "" @{ set root=(hd0,1) linux /vmlinuz single @} menuentry "May be run by user1 or a superuser" --users user1 @{ set root=(hd0,2) chainloader +1 @} @end group @end example The @command{grub-mkconfig} program does not yet have built-in support for generating configuration files with authentication. You can use @file{/etc/grub.d/40_custom} to add simple superuser authentication, by adding @kbd{set superusers=} and @kbd{password} or @kbd{password_pbkdf2} commands. @node Using digital signatures @section Using digital signatures in GRUB GRUB's @file{core.img} can optionally provide enforcement that all files subsequently read from disk are covered by a valid digital signature. This document does @strong{not} cover how to ensure that your platform's firmware (e.g., Coreboot) validates @file{core.img}. If environment variable @code{check_signatures} (@pxref{check_signatures}) is set to @code{enforce}, then every attempt by the GRUB @file{core.img} to load another file @file{foo} implicitly invokes @code{verify_detached foo foo.sig} (@pxref{verify_detached}). @code{foo.sig} must contain a valid digital signature over the contents of @code{foo}, which can be verified with a public key currently trusted by GRUB (@pxref{list_trusted}, @pxref{trust}, and @pxref{distrust}). If validation fails, then file @file{foo} cannot be opened. This failure may halt or otherwise impact the boot process. An initial trusted public key can be embedded within the GRUB @file{core.img} using the @code{--pubkey} option to @command{grub-install} (@pxref{Invoking grub-install}). GRUB uses GPG-style detached signatures (meaning that a file @file{foo.sig} will be produced when file @file{foo} is signed), and currently supports the DSA and RSA signing algorithms. A signing key can be generated as follows: @example gpg --gen-key @end example An individual file can be signed as follows: @example gpg --detach-sign /path/to/file @end example For successful validation of all of GRUB's subcomponents and the loaded OS kernel, they must all be signed. One way to accomplish this is the following (after having already produced the desired @file{grub.cfg} file, e.g., by running @command{grub-mkconfig} (@pxref{Invoking grub-mkconfig}): @example @group # Edit /dev/shm/passphrase.txt to contain your signing key's passphrase for i in `find /boot -name "*.cfg" -or -name "*.lst" -or \ -name "*.mod" -or -name "vmlinuz*" -or -name "initrd*" -or \ -name "grubenv"`; do gpg --batch --detach-sign --passphrase-fd 0 $i < \ /dev/shm/passphrase.txt done shred /dev/shm/passphrase.txt @end group @end example See also: @ref{check_signatures}, @ref{verify_detached}, @ref{trust}, @ref{list_trusted}, @ref{distrust}, @ref{load_env}, @ref{save_env}. Note that internally signature enforcement is controlled by setting the environment variable @code{check_signatures} equal to @code{enforce}. Passing one or more @code{--pubkey} options to @command{grub-mkimage} implicitly defines @code{check_signatures} equal to @code{enforce} in @file{core.img} prior to processing any configuration files. Note that signature checking does @strong{not} prevent an attacker with (serial, physical, ...) console access from dropping manually to the GRUB console and executing: @example set check_signatures=no @end example To prevent this, password-protection (@pxref{Authentication and authorisation}) is essential. Note that even with GRUB password protection, GRUB itself cannot prevent someone with physical access to the machine from altering that machine's firmware (e.g., Coreboot or BIOS) configuration to cause the machine to boot from a different (attacker-controlled) device. GRUB is at best only one link in a secure boot chain. @node UEFI secure boot and shim @section UEFI secure boot and shim support The GRUB works with UEFI secure boot and the shim. This functionality is provided by the shim_lock verifier. It is built into the @file{core.img} and is registered if the UEFI secure boot is enabled. The @samp{shim_lock} variable is set to @samp{y} when shim_lock verifier is registered. If it is desired to use UEFI secure boot without shim, one can disable shim_lock by disabling shim verification with MokSbState UEFI variable or by building grub image with @samp{--disable-shim-lock} option. All GRUB modules not stored in the @file{core.img}, OS kernels, ACPI tables, Device Trees, etc. have to be signed, e.g, using PGP. Additionally, the commands that can be used to subvert the UEFI secure boot mechanism, such as @command{iorw} and @command{memrw} will not be available when the UEFI secure boot is enabled. This is done for security reasons and are enforced by the GRUB Lockdown mechanism (@pxref{Lockdown}). @node Secure Boot Advanced Targeting @section Embedded information for generation number based revocation The Secure Boot Advanced Targeting (SBAT) is a mechanism to allow the revocation of components in the boot path by using generation numbers embedded into the EFI binaries. The SBAT metadata is located in an .sbat data section that has set of UTF-8 strings as comma-separated values (CSV). See @uref{https://github.com/rhboot/shim/blob/main/SBAT.md} for more details. To add a data section containing the SBAT information into the binary, the @option{--sbat} option of @command{grub-mkimage} command should be used. The content of a CSV file, encoded with UTF-8, is copied as is to the .sbat data section into the generated EFI binary. The CSV file can be stored anywhere on the file system. @example grub-mkimage -O x86_64-efi -o grubx64.efi -p '(tftp)/grub' --sbat sbat.csv efinet tftp @end example @node Measured Boot @section Measuring boot components If the tpm module is loaded and the platform has a Trusted Platform Module installed, GRUB will log each command executed and each file loaded into the TPM event log and extend the PCR values in the TPM correspondingly. All events will be logged into the PCR described below with a type of EV_IPL and an event description as described below. @multitable @columnfractions 0.3 0.1 0.6 @headitem Event type @tab PCR @tab Description @item Command @tab 8 @tab All executed commands (including those from configuration files) will be logged and measured as entered with a prefix of ``grub_cmd: `` @item Kernel command line @tab 8 @tab Any command line passed to a kernel will be logged and measured as entered with a prefix of ``kernel_cmdline: '' @item Module command line @tab 8 @tab Any command line passed to a kernel module will be logged and measured as entered with a prefix of ``module_cmdline: `` @item Files @tab 9 @tab Any file read by GRUB will be logged and measured with a descriptive text corresponding to the filename. @end multitable GRUB will not measure its own @file{core.img} - it is expected that firmware will carry this out. GRUB will also not perform any measurements until the tpm module is loaded. As such it is recommended that the tpm module be built into @file{core.img} in order to avoid a potential gap in measurement between @file{core.img} being loaded and the tpm module being loaded. Measured boot is currently only supported on EFI and IBM IEEE1275 PowerPC platforms. @node Lockdown @section Lockdown when booting on a secure setup The GRUB can be locked down when booted on a secure boot environment, for example if the UEFI secure boot is enabled. On a locked down configuration, the GRUB will be restricted and some operations/commands cannot be executed. This also includes limiting which filesystems are supported to those thought to be more robust and widely used within GRUB. The filesystems currently allowed in lockdown mode include: @itemize @bullet @item BtrFS @item cpio @item exFAT @item Enhanced Read-Only File System (EROFS) @item Linux ext2/ext3/ext4 @item F2FS @item DOS FAT12/FAT16/FAT32 @item HFS+ @item ISO9660 @item Squash4 @item tar @item XFS @item ZFS @end itemize The filesystems currently not allowed in lockdown mode include: @itemize @bullet @item Amiga Fast FileSystem (AFFS) @item AtheOS File System (AFS) @item Bee File System (BFS) @item Coreboot File System (CBFS) @item Hierarchical File System (HFS) @item Journaled File System (JFS) @item Minix filesystem @item New Implementation of Log filesystem (nilfs2) @item Windows New Technology File System (NTFS) @item ReiserFS @item Read-Only Memory File System (ROMFS) @item Amiga Smart File System (SFS) @item Universal Disk Format (UDF) @item Unix File System (UFS) @end itemize The @samp{lockdown} variable is set to @samp{y} when the GRUB is locked down. Otherwise it does not exist. @node TPM2 key protector @section TPM2 key protector in GRUB TPM2 key protector extends measured boot to unlock the encrypted partition without user intervention. It uses the TPM Storage Root Key (SRK) to seal the disk key with a given set of PCR values. If the system state matches, i.e. PCR values match the sealed PCR set, TPM2 key protector unseals the disk key for @command{cryptomount} (@pxref{cryptomount}) to unlock the encrypted partition. In case the unsealed key fails to unlock the partition, @command{cryptomount} falls back to the passphrase prompt. Please note that TPM2 key protector uses the SRK in the owner hierarchy @emph{without} authorization. If the owner hierarchy is password-protected, TPM2 key protector may fail to unseal the key due to the absence of the password. For the systems that already enable the password protection for the owner hierarchy, the following command removes the password protection with the existing password. @example # @kbd{tpm2_changeauth -c owner -p password} @end example There are two supported modes to store the sealed key, SRK and NV index. The details will be addressed in later sections. TPM2 key protector is currently only supported on EFI and EMU platforms. @subsection TPM PCR usage Since TPM2 key protector relies on PCRs to check the system state, it is important to decide which PCRs to seal the key with. The following table lists uses of PCRs and the measured objects on EFI platforms. @multitable @columnfractions 0.1 0.2 0.7 @headitem PCR @tab Used by @tab Measured Objects @item 0 @tab Firmware @tab Core system firmware executable code @item 1 @tab Firmware @tab Core system firmware data/host platform configuration; typically contains serial and model numbers @item 2 @tab Firmware @tab Extended or pluggable executable code; includes option ROMs on pluggable hardware @item 3 @tab Firmware @tab Extended or pluggable firmware data; includes information about pluggable hardware @item 4 @tab Firmware @tab Boot loader and additional drivers; binaries and extensions loaded by the boot loader @item 5 @tab Firmware @tab GPT/Partition table @item 7 @tab Firmware @tab SecureBoot state @item 8 @tab GRUB @tab Commands and kernel command line @item 9 @tab GRUB @tab All files read (including kernel image) @item 9 @tab Linux Kernel @tab All passed initrds (when the new LOAD_FILE2 initrd protocol is used) @item 10 @tab Linux Kernel @tab Protection of the IMA measurement log @item 14 @tab shim @tab “MOK” certificates and hashes @end multitable PCR 0, 2, 4, and 7 can be used to check the integrity of the firmware code and bootloaders. PCR 8 and 9 are useful to check the file and data processed by GRUB. PCRs 10, 11, 12, 13, and 15 are controlled by the operating system, so those PCRs are usually still in the initial state when GRUB is running. In general, it is nice to include PCR 0, 2, 4, and 7 to ensure the integrity of the firmware and bootloaders. For PCR 8 and 9, a sophisticated tool is required to examine the GRUB configuration files and the files to be loaded to calculate the correct PCR values. Please note that PCRs are sensitive to any change, so an update of a component could invalidate the sealed key, due to the so-called PCR brittleness. For the bootloader update, PCR 4 may be affected. This can be mitigated by extracting the events from the TPM event log and predict the value with the updated bootloader binary. On the other hand, it is difficult to predict PCR 0~7 after a firmware update since the content of the code and the order of drivers may not follow the TPM event log from the previous firmware version, so it is necessary to reboot the system to update the measurement results of PCR 0~7 and seal or sign the sealed key again. Reference: @url{https://uapi-group.org/specifications/specs/linux_tpm_pcr_registry/, Linux TPM PCR Registry} @subsection Setting up the extra disk key Instead of using the existing password, it is recommended to seal a new random disk key and use the existing password for recovery. Here are the sample commands to create a 128 random bytes key file and enroll the key into the target partition (sda2). @example # @kbd{dd if=/dev/urandom of=luks.key bs=1 count=128} # @kbd{cryptsetup luksAddKey /dev/sda2 luks.key --pbkdf=pbkdf2 --hash=sha512} @end example @subsection SRK mode To unlock the partition with SRK mode, assume that the sealed key is in @file{(hd0,gpt1)/efi/grub/sealed.tpm}, the following GRUB commands unseal the disk key with SRK mode and supply it to @command{cryptomount}. @example grub> @kbd{tpm2_key_protector_init -T (hd0,gpt1)/efi/grub/sealed.tpm} grub> @kbd{cryptomount -u -P tpm2} @end example There are two programs to create the sealed key for SRK mode: @command{grub-protect} and @command{pcr-oracle} (@url{https://github.com/okirch/pcr-oracle}). The following sample command uses @command{grub-protect} to seal the random key, @file{luks.key}, with PCR 0, 2, 4 and 7 in TPM 2.0 Key File format. @example @group # @kbd{grub-protect --action=add \ --protector=tpm2 \ --tpm2-pcrs=0,2,4,7 \ --tpm2key \ --tpm2-keyfile=luks.key \ --tpm2-outfile=/boot/efi/efi/grub/sealed.tpm} @end group @end example @command{grub-protect} only seals the key with the current PCR values. Therefore, when a boot component, such as shim or GRUB, is updated, it is necessary to reboot the system to update the measurement results and seal the key again. That means the random disk key has to be stored in cleartext for the next key sealing. Besides this, the measurement result of some PCRs may differ between boot time and OS runtime. For example, PCR 9 measures the files loaded by GRUB including the Linux kernel and initrd. To unlock the disk containing the kernel and initrd, the key has to be sealed with PCR 9 value before loading the kernel and initrd. However, PCR 9 changes after GRUB loading the kernel and initrd, so PCR 9 at OS runtime cannot be used directly for key sealing. To solve these problems, @command{pcr-oracle} takes a different approach. It reads the TPM eventlog and predicts the PCR values. Besides, @command{pcr-oracle} also supports ``authorized policy'' which allows the PCR policy to be updated with a valid signature, so that the user only seals the random disk key once. If at some later time the PCR values change due to an update of the system firmware, bootloader, or config file, the user just needs to update the signature of the PCR policy. To seal the key with the authorized policy, the first thing is to generate the RSA policy key, @file{policy-key.pem}, and the authorized policy file, @file{authorized.policy}. In this example, PCR 0, 2, 4, 7 and 9 are chosen for key sealing. @example @group # @kbd{pcr-oracle --rsa-generate-key \ --private-key policy-key.pem \ --auth authorized.policy \ create-authorized-policy 0,2,4,7,9} @end group @end example Then, we seal the random disk key, @file{luks.key}, with the authorized policy file and save the sealed key in @file{sealed.key}. @example @group # @kbd{pcr-oracle --key-format tpm2.0 \ --auth authorized.policy \ --input luks.key \ --output sealed.key \ seal-secret} @end group @end example Since we now have the sealed key, we can remove the random disk key file @file{luks.key}. The last step is to sign the predicted PCR policy and save the final key file, @file{sealed.tpm}. @example @group # @kbd{pcr-oracle --key-format tpm2.0 \ --private-key policy-key.pem \ --from eventlog \ --stop-event "grub-file=grub.cfg" \ --after \ --input sealed.key \ --output /boot/efi/efi/grub/sealed.tpm \ sign 0,2,4,7,9} @end group @end example Here we also set a stop event for the prediction. With @kbd{--stop-event grub-file=grub.cfg --after}, @command{pcr-oracle} stops the calculation of PCR values right after GRUB loads @file{grub.cfg}. When/After the shim or GRUB are updated, it only requires to run the last @command{pcr-oracle} command to update the predicted PCR policy. @subsection NV index mode Instead of storing the sealed key in a file, NV index mode uses the TPM non-volatile memory to store the sealed key and could be useful when accessing the file is not possible. However, the Linux root user must be careful who she/he gives access to the TPM (tss group) since those users will also be able to modify the NV index that's holding the key. There are two types of TPM handles supported by NV index mode: persistent handle and NV index handle. @subsubsection Persistent handle The range of persistent handles is from @kbd{0x81000000} to @kbd{0x81FFFFFF}. The persistent handle is designed to make TPM objects persistent through power cycles, and only TPM objects, such as RSA or EC keys, are accepted. Thus, only the raw format is supported by persistent handles. The following shows the @command{grub-protect} command to seal the disk key @file{luks.key} into the persistent handle @kbd{0x81000000} with the PCRs @kbd{0,2,4,7}. @example @group # @kbd{grub-protect \ --protector=tpm2 \ --action=add \ --tpm2-bank=sha256 \ --tpm2-pcrs=0,2,4,7 \ --tpm2-keyfile=luks.key \ --tpm2-nvindex=0x81000000} @end group @end example To unseal the key, we have to specify the mode @kbd{nv}, the persistent handle @kbd{0x81000000}, and the PCRs @kbd{0,2,4,7} for the @command{tpm2_key_protector_init} command. @example grub> @kbd{tpm2_key_protector_init --mode=nv --nvindex=0x81000000 --pcrs=0,2,4,7} grub> @kbd{cryptomount -u --protector tpm2} @end example If the key in the persistent handle becomes unwanted, the following @command{grub-protect} command removes the specified persistent handle @kbd{0x81000000}. @example @group # @kbd{grub-protect \ --protector=tpm2 \ --action=remove \ --tpm2-evict \ --tpm2-nvindex=0x81000000} @end group @end example @subsubsection NV index handle The range of NV index handles is from @kbd{0x1000000} to @kbd{0x1FFFFFF}. Unlike the persistent handle, the NV index handle allows user-defined data, so it can easily support both the TPM 2.0 Key File format as well as the raw format. The following @kbd{grub-protect} command seals the disk key @file{luks.key} into the NV index handle @kbd{0x1000000} with the PCRs @kbd{0,2,4,7} while using the TPM 2.0 Key File format. @example @group # @kbd{grub-protect \ --protector=tpm2 \ --action=add \ --tpm2key \ --tpm2-bank=sha256 \ --tpm2-pcrs=0,2,4,7 \ --tpm2-keyfile=luks.key \ --tpm2-nvindex=0x1000000} @end group @end example Furthermore, it is also possible to insert an existing key file, @file{sealed.tpm}, into a specific NV index handle using the following tpm2-tools (@url{https://github.com/tpm2-software/tpm2-tools}) commands. @example @group # @kbd{tpm2_nvdefine -C o \ -a "ownerread|ownerwrite" \ -s $(stat -c %s sealed.tpm) \ 0x1000000} @end group # @kbd{tpm2_nvwrite -C o -i sealed.tpm 0x1000000} @end example When unsealing the key in TPM 2.0 Key File format, only the mode @kbd{nv} and the NV index handle @kbd{0x1000000} have to be specified for the @command{tpm2_key_protector_init} command. @example grub> @kbd{tpm2_key_protector_init --mode=nv --nvindex=0x1000000} grub> @kbd{cryptomount -u --protector tpm2} @end example The following @command{grub-protect} command allows to remove the specified NV index handle @kbd{0x1000000}. @example @group # @kbd{grub-protect \ --protector=tpm2 \ --action=remove \ --tpm2-evict \ --tpm2-nvindex=0x1000000} @end group @end example @subsection Setting up software TPM for EMU platform In order to test TPM2 key protector and TPM2 Software Stack (TSS2), it is useful to set up a software TPM (swtpm) instance and run the commands on the EMU platform. Here are the commands to start a swtpm instance which provides a character device interface. To store the TPM states, the directory, @file{swtpm-state}, is created before the @command{swtpm} command. All the messages are stored in @file{swtpm.log} including the name of the character device. @example # @kbd{mkdir swtpm-state} @group # @kbd{swtpm chardev --vtpm-proxy --tpmstate dir=swtpm-state \ --tpm2 --ctrl type=unixio,path="swtpm-state/ctrl" \ --flags startup-clear --daemon > swtpm.log} @end group @end example Then, we extract the name of the character device from @file{swtpm.log} and save it to the variable, @samp{tpm2dev}. @example # @kbd{tpm2dev=$(grep "New TPM device" swtpm.log | cut -d' ' -f 4)} @end example Now we can start @kbd{grub-emu} with @kbd{--tpm-device $tpm2dev} to interact with the swtpm instance. @example # @kbd{grub-emu --tpm-device $tpm2dev} @end example On the host, the tpm2-tools commands can interact with the swtpm instance by setting @samp{TPM2TOOLS_TCTI}. @example # @kbd{export TPM2TOOLS_TCTI="device:$tpm2dev"} @end example When the test is done, use @kbd{swtpm_ioctl} to send the shutdown command through the swtpm control channel. @example # @kbd{swtpm_ioctl -s --unix swtpm-state/ctrl} @end example @subsection Command line and menuentry editor protection The TPM key protector provides full disk encryption support on servers or virtual machine images, meanwhile keeping the boot process unattended. This prevents service disruptions by eliminating the need for manual password input during startup, improving system uptime and continuity. It is achieved by TPM, which verifies the integrity of boot components by checking cryptographic hashes against securely stored values, to confirm the disks are unlocked in a trusted state. However, for users to access the system interactively, some form of authentication is still required, as the disks are not unlocked by an authorized user. This raised concerns about using an unprotected @samp{command-line interface} (@pxref{Command-line interface}), as anyone could execute commands to access decrypted data. To address this issue, the LUKS password is used to ensure that only authorized users are granted access to the interface. Additionally, the @samp{menu entry editor} (@pxref{Menu entry editor}) is also safeguarded by the LUKS password, as modifying a boot entry is effectively the same as altering the @file{grub.cfg} file read from encrypted files. It is worth mentioning that the built-in password support, as described in @samp{Authentication and Authorization in GRUB} (@pxref{Authentication and authorisation}), can also be used to protect the command-line interface from unauthorized access. However, it is not recommended to rely on this approach as it is an optional step. Setting it up requires additional manual intervention, which increases the risk of password leakage during the process. Moreover, the superuser list must be well maintained, and the password used cannot be synchronized with LUKS key rotation. @node Platform limitations @chapter Platform limitations GRUB2 is designed to be portable and is actually ported across platforms. We try to keep all platforms at the level. Unfortunately some platforms are better supported than others. This is detailed in current and 2 following sections. All platforms have an artificially GRUB imposed disk size restriction of 1 EiB. In some cases, larger disk sizes can be used, but access will not be allowed beyond 1 EiB. LUKS2 devices with size larger than 16 EiB are currently not supported. They can not be created as crypto devices by cryptomount, so can not even be partially read from. LUKS have no limitations other than those imposed by the format. ARC platform is unable to change datetime (firmware doesn't seem to provide a function for it). EMU has similar limitation. On EMU platform no serial port is available. Console charset refers only to firmware-assisted console. gfxterm is always Unicode (see Internationalisation section for its limitations). Serial is configurable to UTF-8 or ASCII (see Internationalisation). In case of qemu and coreboot ports the referred console is vga_text. Loongson always uses gfxterm. Most limited one is ASCII. CP437 provides additionally pseudographics. GRUB2 doesn't use any language characters from CP437 as often CP437 is replaced by national encoding compatible only in pseudographics. Unicode is the most versatile charset which supports many languages. However the actual console may be much more limited depending on firmware On BIOS, network is supported only if the image is loaded through network. On sparc64, GRUB is unable to determine which server it was booted from. Direct ATA/AHCI support allows to circumvent various firmware limitations but isn't needed for normal operation except on baremetal ports. AT keyboard support allows keyboard layout remapping and support for keys not available through firmware. It isn't needed for normal operation except baremetal ports. Speaker allows morse and spkmodem communication. USB support provides benefits similar to ATA (for USB disks) or AT (for USB keyboards). In addition it allows USBserial. Chainloading refers to the ability to load another bootloader through the same protocol and on some platforms, like EFI, allow that bootloader to return to the GRUB. Hints allow faster disk discovery by already knowing in advance which is the disk in question. On some platforms hints are correct unless you move the disk between boots. On other platforms it's just an educated guess. Note that hint failure results in just reduced performance, not a failure BadRAM is the ability to mark some of the RAM as ``bad''. Note: due to protocol limitations mips-loongson (with Linux protocol) and mips-qemu_mips can use only memory up to first hole. Bootlocation is ability of GRUB to automatically detect where it boots from. ``disk'' means the detection is limited to detecting the disk with partition being discovered on install time. ``partition'' means that disk and partiton can be automatically discovered. ``file'' means that boot image file name as well as disk and partition can be discovered. For consistency, default install ignores partition and relies solely on disk detection. If no bootlocation discovery is available or boot and grub-root disks are different, UUID is used instead. On ARC if no device to install to is specified, UUID is used instead as well. @multitable @columnfractions .20 .20 .20 .20 .20 @item @tab BIOS @tab Coreboot @tab Multiboot @tab Qemu @item video @tab yes @tab yes @tab yes @tab yes @item console charset @tab CP437 @tab CP437 @tab CP437 @tab CP437 @item network @tab yes (*) @tab no @tab no @tab no @item ATA/AHCI @tab yes @tab yes @tab yes @tab yes @item AT keyboard @tab yes @tab yes @tab yes @tab yes @item Speaker @tab yes @tab yes @tab yes @tab yes @item USB @tab yes @tab yes @tab yes @tab yes @item chainloader @tab local @tab yes @tab yes @tab no @item cpuid @tab partial @tab partial @tab partial @tab partial @item rdmsr @tab partial @tab partial @tab partial @tab partial @item wrmsr @tab partial @tab partial @tab partial @tab partial @item hints @tab guess @tab guess @tab guess @tab guess @item PCI @tab yes @tab yes @tab yes @tab yes @item badram @tab yes @tab yes @tab yes @tab yes @item compression @tab always @tab pointless @tab no @tab no @item exit @tab yes @tab no @tab no @tab no @item bootlocation @tab disk @tab no @tab no @tab no @end multitable @multitable @columnfractions .20 .20 .20 .20 .20 @item @tab ia32 EFI @tab amd64 EFI @tab ia32 IEEE1275 @tab Itanium @item video @tab yes @tab yes @tab no @tab no @item console charset @tab Unicode @tab Unicode @tab ASCII @tab Unicode @item network @tab yes @tab yes @tab yes @tab yes @item ATA/AHCI @tab yes @tab yes @tab yes @tab no @item AT keyboard @tab yes @tab yes @tab yes @tab no @item Speaker @tab yes @tab yes @tab yes @tab no @item USB @tab yes @tab yes @tab yes @tab no @item chainloader @tab local @tab local @tab no @tab local @item cpuid @tab partial @tab partial @tab partial @tab no @item rdmsr @tab partial @tab partial @tab partial @tab no @item wrmsr @tab partial @tab partial @tab partial @tab no @item hints @tab guess @tab guess @tab good @tab guess @item PCI @tab yes @tab yes @tab yes @tab no @item badram @tab yes @tab yes @tab no @tab yes @item compression @tab no @tab no @tab no @tab no @item exit @tab yes @tab yes @tab yes @tab yes @item bootlocation @tab file @tab file @tab file, ignored @tab file @end multitable @multitable @columnfractions .20 .20 .20 .20 .20 @item @tab Loongson @tab sparc64 @tab Powerpc @tab ARC @item video @tab yes @tab no @tab yes @tab no @item console charset @tab N/A @tab ASCII @tab ASCII @tab ASCII @item network @tab no @tab yes (*) @tab yes @tab no @item ATA/AHCI @tab yes @tab no @tab no @tab no @item AT keyboard @tab yes @tab no @tab no @tab no @item Speaker @tab no @tab no @tab no @tab no @item USB @tab yes @tab no @tab no @tab no @item chainloader @tab yes @tab no @tab no @tab no @item cpuid @tab no @tab no @tab no @tab no @item rdmsr @tab no @tab no @tab no @tab no @item wrmsr @tab no @tab no @tab no @tab no @item hints @tab good @tab good @tab good @tab no @item PCI @tab yes @tab no @tab no @tab no @item badram @tab yes (*) @tab no @tab no @tab no @item compression @tab configurable @tab no @tab no @tab configurable @item exit @tab no @tab yes @tab yes @tab yes @item bootlocation @tab no @tab partition @tab file @tab file (*) @end multitable @multitable @columnfractions .20 .20 .20 .20 .20 @item @tab MIPS qemu @tab emu @tab xen @item video @tab no @tab yes @tab no @item console charset @tab CP437 @tab Unicode (*) @tab ASCII @item network @tab no @tab yes @tab no @item ATA/AHCI @tab yes @tab no @tab no @item AT keyboard @tab yes @tab no @tab no @item Speaker @tab no @tab no @tab no @item USB @tab N/A @tab yes @tab no @item chainloader @tab yes @tab no @tab yes @item cpuid @tab no @tab no @tab yes @item rdmsr @tab no @tab no @tab yes @item wrmsr @tab no @tab no @tab yes @item hints @tab guess @tab no @tab no @item PCI @tab no @tab no @tab no @item badram @tab yes (*) @tab no @tab no @item compression @tab configurable @tab no @tab no @item exit @tab no @tab yes @tab no @item bootlocation @tab no @tab file @tab no @end multitable @node Platform-specific operations @chapter Outline Some platforms have features which allows to implement some commands useless or not implementable on others. Quick summary: Information retrieval: @itemize @item mipsel-loongson: lsspd @item mips-arc: lsdev @item efi: lsefisystab, lssal, lsefimmap, lsefi @item i386-pc: lsapm @item i386-coreboot: lscoreboot, coreboot_boottime, cbmemc @item acpi-enabled (i386-pc, i386-coreboot, i386-multiboot, *-efi): lsacpi @end itemize Workarounds for platform-specific issues: @itemize @item i386-efi/x86_64-efi: loadbios, fakebios, fix_video @item acpi-enabled (i386-pc, i386-coreboot, i386-multiboot, *-efi): acpi (override ACPI tables) @item i386-pc: drivemap @item i386-pc: sendkey @end itemize Advanced operations for power users: @itemize @item x86: iorw (direct access to I/O ports) @end itemize Miscellaneous: @itemize @item cmos (x86-*, ieee1275, mips-qemu_mips, mips-loongson): cmostest (used on some laptops to check for special power-on key), cmosclean @item i386-pc: play @end itemize @node Supported kernels @chapter Supported boot targets X86 support is summarised in the following table. ``Yes'' means that the kernel works on the given platform, ``crashes'' means an early kernel crash which we hope will be fixed by concerned kernel developers. ``no'' means GRUB doesn't load the given kernel on a given platform. ``headless'' means that the kernel works but lacks console drivers (you can still use serial or network console). In case of ``no'' and ``crashes'' the reason is given in footnote. @multitable @columnfractions .50 .22 .22 @item @tab BIOS @tab Coreboot @item BIOS chainloading @tab yes @tab no (1) @item NTLDR @tab yes @tab no (1) @item Plan9 @tab yes @tab no (1) @item Freedos @tab yes @tab no (1) @item FreeBSD bootloader @tab yes @tab crashes (1) @item 32-bit kFreeBSD @tab yes @tab crashes (5) @item 64-bit kFreeBSD @tab yes @tab crashes (5) @item 32-bit kNetBSD @tab yes @tab crashes (1) @item 64-bit kNetBSD @tab yes @tab crashes @item 32-bit kOpenBSD @tab yes @tab yes @item 64-bit kOpenBSD @tab yes @tab yes @item Multiboot @tab yes @tab yes @item Multiboot2 @tab yes @tab yes @item 32-bit Linux (legacy protocol) @tab yes @tab no (1) @item 64-bit Linux (legacy protocol) @tab yes @tab no (1) @item 32-bit Linux (modern protocol) @tab yes @tab yes @item 64-bit Linux (modern protocol) @tab yes @tab yes @item 32-bit XNU @tab yes @tab ? @item 64-bit XNU @tab yes @tab ? @item 32-bit EFI chainloader @tab no (2) @tab no (2) @item 64-bit EFI chainloader @tab no (2) @tab no (2) @item Appleloader @tab no (2) @tab no (2) @end multitable @multitable @columnfractions .50 .22 .22 @item @tab Multiboot @tab Qemu @item BIOS chainloading @tab no (1) @tab no (1) @item NTLDR @tab no (1) @tab no (1) @item Plan9 @tab no (1) @tab no (1) @item FreeDOS @tab no (1) @tab no (1) @item FreeBSD bootloader @tab crashes (1) @tab crashes (1) @item 32-bit kFreeBSD @tab crashes (5) @tab crashes (5) @item 64-bit kFreeBSD @tab crashes (5) @tab crashes (5) @item 32-bit kNetBSD @tab crashes (1) @tab crashes (1) @item 64-bit kNetBSD @tab yes @tab yes @item 32-bit kOpenBSD @tab yes @tab yes @item 64-bit kOpenBSD @tab yes @tab yes @item Multiboot @tab yes @tab yes @item Multiboot2 @tab yes @tab yes @item 32-bit Linux (legacy protocol) @tab no (1) @tab no (1) @item 64-bit Linux (legacy protocol) @tab no (1) @tab no (1) @item 32-bit Linux (modern protocol) @tab yes @tab yes @item 64-bit Linux (modern protocol) @tab yes @tab yes @item 32-bit XNU @tab ? @tab ? @item 64-bit XNU @tab ? @tab ? @item 32-bit EFI chainloader @tab no (2) @tab no (2) @item 64-bit EFI chainloader @tab no (2) @tab no (2) @item Appleloader @tab no (2) @tab no (2) @end multitable @multitable @columnfractions .50 .22 .22 @item @tab ia32 EFI @tab amd64 EFI @item BIOS chainloading @tab no (1) @tab no (1) @item NTLDR @tab no (1) @tab no (1) @item Plan9 @tab no (1) @tab no (1) @item FreeDOS @tab no (1) @tab no (1) @item FreeBSD bootloader @tab crashes (1) @tab crashes (1) @item 32-bit kFreeBSD @tab headless @tab headless @item 64-bit kFreeBSD @tab headless @tab headless @item 32-bit kNetBSD @tab crashes (1) @tab crashes (1) @item 64-bit kNetBSD @tab yes @tab yes @item 32-bit kOpenBSD @tab headless @tab headless @item 64-bit kOpenBSD @tab headless @tab headless @item Multiboot @tab yes @tab yes @item Multiboot2 @tab yes @tab yes @item 32-bit Linux (legacy protocol) @tab no (1) @tab no (1) @item 64-bit Linux (legacy protocol) @tab no (1) @tab no (1) @item 32-bit Linux (modern protocol) @tab yes @tab yes @item 64-bit Linux (modern protocol) @tab yes @tab yes @item 32-bit XNU @tab yes @tab yes @item 64-bit XNU @tab yes (4) @tab yes @item 32-bit EFI chainloader @tab yes @tab no (3) @item 64-bit EFI chainloader @tab no (3) @tab yes @item Appleloader @tab yes @tab yes @end multitable @multitable @columnfractions .50 .22 .22 @item @tab ia32 IEEE1275 @item BIOS chainloading @tab no (1) @item NTLDR @tab no (1) @item Plan9 @tab no (1) @item FreeDOS @tab no (1) @item FreeBSD bootloader @tab crashes (1) @item 32-bit kFreeBSD @tab crashes (5) @item 64-bit kFreeBSD @tab crashes (5) @item 32-bit kNetBSD @tab crashes (1) @item 64-bit kNetBSD @tab ? @item 32-bit kOpenBSD @tab ? @item 64-bit kOpenBSD @tab ? @item Multiboot @tab ? @item Multiboot2 @tab ? @item 32-bit Linux (legacy protocol) @tab no (1) @item 64-bit Linux (legacy protocol) @tab no (1) @item 32-bit Linux (modern protocol) @tab ? @item 64-bit Linux (modern protocol) @tab ? @item 32-bit XNU @tab ? @item 64-bit XNU @tab ? @item 32-bit EFI chainloader @tab no (2) @item 64-bit EFI chainloader @tab no (2) @item Appleloader @tab no (2) @end multitable @enumerate @item Requires BIOS @item EFI only @item 32-bit and 64-bit EFI have different structures and work in different CPU modes so it's not possible to chainload 32-bit bootloader on 64-bit platform and vice-versa @item Some modules may need to be disabled @item Requires ACPI @end enumerate PowerPC, IA64 and Sparc64 ports support only Linux. MIPS port supports Linux and multiboot2. @section Boot tests As you have seen in previous chapter the support matrix is pretty big and some of the configurations are only rarely used. To ensure the quality bootchecks are available for all x86 targets except EFI chainloader, Appleloader and XNU. All x86 platforms have bootcheck facility except ieee1275. Multiboot, multiboot2, BIOS chainloader, ntldr and freebsd-bootloader boot targets are tested only with a fake kernel images. Only Linux is tested among the payloads using Linux protocols. Following variables must be defined: @multitable @columnfractions .30 .65 @item GRUB_PAYLOADS_DIR @tab directory containing the required kernels @item GRUB_CBFSTOOL @tab cbfstool from Coreboot package (for coreboot platform only) @item GRUB_COREBOOT_ROM @tab empty Coreboot ROM @item GRUB_QEMU_OPTS @tab additional options to be supplied to QEMU @end multitable Required files are: @multitable @columnfractions .40 .55 @item kfreebsd_env.i386 @tab 32-bit kFreeBSD device hints @item kfreebsd.i386 @tab 32-bit FreeBSD kernel image @item kfreebsd.x86_64, kfreebsd_env.x86_64 @tab same from 64-bit kFreeBSD @item knetbsd.i386 @tab 32-bit NetBSD kernel image @item knetbsd.miniroot.i386 @tab 32-bit kNetBSD miniroot.kmod. @item knetbsd.x86_64, knetbsd.miniroot.x86_64 @tab same from 64-bit kNetBSD @item kopenbsd.i386 @tab 32-bit OpenBSD kernel bsd.rd image @item kopenbsd.x86_64 @tab same from 64-bit kOpenBSD @item linux.i386 @tab 32-bit Linux @item linux.x86_64 @tab 64-bit Linux @end multitable @node Troubleshooting @chapter Error messages produced by GRUB @menu * GRUB only offers a rescue shell:: * Firmware stalls instead of booting GRUB:: @end menu @node GRUB only offers a rescue shell @section GRUB only offers a rescue shell GRUB's normal start-up procedure involves setting the @samp{prefix} environment variable to a value set in the core image by @command{grub-install}, setting the @samp{root} variable to match, loading the @samp{normal} module from the prefix, and running the @samp{normal} command (@pxref{normal}). This command is responsible for reading @file{/boot/grub/grub.cfg}, running the menu, and doing all the useful things GRUB is supposed to do. If, instead, you only get a rescue shell, this usually means that GRUB failed to load the @samp{normal} module for some reason. It may be possible to work around this temporarily: for instance, if the reason for the failure is that @samp{prefix} is wrong (perhaps it refers to the wrong device, or perhaps the path to @file{/boot/grub} was not correctly made relative to the device), then you can correct this and enter normal mode manually: @example @group # Inspect the current prefix (and other preset variables): set # Find out which devices are available: ls # Set to the correct value, which might be something like this: set prefix=(hd0,1)/grub set root=(hd0,1) insmod normal normal @end group @end example However, any problem that leaves you in the rescue shell probably means that GRUB was not correctly installed. It may be more useful to try to reinstall it properly using @kbd{grub-install @var{device}} (@pxref{Invoking grub-install}). When doing this, there are a few things to remember: @itemize @bullet{} @item Drive ordering in your operating system may not be the same as the boot drive ordering used by your firmware. Do not assume that your first hard drive (e.g. @samp{/dev/sda}) is the one that your firmware will boot from. @file{device.map} (@pxref{Device map}) can be used to override this, but it is usually better to use UUIDs or file system labels and avoid depending on drive ordering entirely. @item At least on BIOS systems, if you tell @command{grub-install} to install GRUB to a partition but GRUB has already been installed in the master boot record, then the GRUB installation in the partition will be ignored. @item If possible, it is generally best to avoid installing GRUB to a partition (unless it is a special partition for the use of GRUB alone, such as the BIOS Boot Partition used on GPT). Doing this means that GRUB may stop being able to read its core image due to a file system moving blocks around, such as while defragmenting, running checks, or even during normal operation. Installing to the whole disk device is normally more robust. @item Check that GRUB actually knows how to read from the device and file system containing @file{/boot/grub}. It will not be able to read from encrypted devices with unsupported encryption scheme, nor from file systems for which support has not yet been added to GRUB. @end itemize @node Firmware stalls instead of booting GRUB @section Firmware stalls instead of booting GRUB The EFI implementation of some older MacBook laptops stalls when it gets presented a grub-mkrescue ISO image for x86_64-efi target on an USB stick. Affected are models of year 2010 or earlier. Workaround is to zeroize the bytes 446 to 461 of the EFI partition, where mformat has put a partition table entry which claims partition start at block 0. This change will not hamper bootability on other machines. @node User-space utilities @chapter User-space utilities @menu * Invoking grub-install:: How to use the GRUB installer * Invoking grub-mkconfig:: Generate a GRUB configuration file * Invoking grub-mkpasswd-pbkdf2:: Generate GRUB password hashes * Invoking grub-mkrelpath:: Make system path relative to its root * Invoking grub-mkrescue:: Make a GRUB rescue image * Invoking grub-mount:: Mount a file system using GRUB * Invoking grub-probe:: Probe device information for GRUB * Invoking grub-protect:: Protect a disk key with a key protector * Invoking grub-script-check:: Check GRUB script file for syntax errors @end menu @node Invoking grub-install @section Invoking grub-install The program @command{grub-install} generates a GRUB core image using @command{grub-mkimage} and installs it on your system. You must specify the device name on which you want to install GRUB, like this: @example grub-install @var{install_device} @end example The device name @var{install_device} is an OS device name or a GRUB device name. @command{grub-install} accepts the following options: @table @option @item --help Print a summary of the command-line options and exit. @item --version Print the version number of GRUB and exit. @item --boot-directory=@var{dir} Install GRUB images under the directory @file{@var{dir}/grub/} This option is useful when you want to install GRUB into a separate partition or a removable disk. If this option is not specified then it defaults to @file{/boot}, so @example @kbd{grub-install /dev/sda} @end example is equivalent to @example @kbd{grub-install --boot-directory=/boot/ /dev/sda} @end example Here is an example in which you have a separate @dfn{boot} partition which is mounted on @file{/mnt/boot}: @example @kbd{grub-install --boot-directory=/mnt/boot /dev/sdb} @end example @item --recheck Recheck the device map, even if @file{/boot/grub/device.map} already exists. You should use this option whenever you add/remove a disk into/from your computer. @item --no-rs-codes By default on x86 BIOS systems, @command{grub-install} will use some extra space in the bootloader embedding area for Reed-Solomon error-correcting codes. This enables GRUB to still boot successfully if some blocks are corrupted. The exact amount of protection offered is dependent on available space in the embedding area. R sectors of redundancy can tolerate up to R/2 corrupted sectors. This redundancy may be cumbersome if attempting to cryptographically validate the contents of the bootloader embedding area, or in more modern systems with GPT-style partition tables (@pxref{BIOS installation}) where GRUB does not reside in any unpartitioned space outside of the MBR. Disable the Reed-Solomon codes with this option. @end table @node Invoking grub-mkconfig @section Invoking grub-mkconfig The program @command{grub-mkconfig} generates a configuration file for GRUB (@pxref{Simple configuration}). @example grub-mkconfig -o /boot/grub/grub.cfg @end example @command{grub-mkconfig} accepts the following options: @table @option @item --help Print a summary of the command-line options and exit. @item --version Print the version number of GRUB and exit. @item -o @var{file} @itemx --output=@var{file} Send the generated configuration file to @var{file}. The default is to send it to standard output. @end table @node Invoking grub-mkpasswd-pbkdf2 @section Invoking grub-mkpasswd-pbkdf2 The program @command{grub-mkpasswd-pbkdf2} generates password hashes for GRUB (@pxref{Security}). @example grub-mkpasswd-pbkdf2 @end example @command{grub-mkpasswd-pbkdf2} accepts the following options: @table @option @item -c @var{number} @itemx --iteration-count=@var{number} Number of iterations of the underlying pseudo-random function. Defaults to 10000. @item -l @var{number} @itemx --buflen=@var{number} Length of the generated hash. Defaults to 64. @item -s @var{number} @itemx --salt=@var{number} Length of the salt. Defaults to 64. @end table @node Invoking grub-mkrelpath @section Invoking grub-mkrelpath The program @command{grub-mkrelpath} makes a file system path relative to the root of its containing file system. For instance, if @file{/usr} is a mount point, then: @example $ @kbd{grub-mkrelpath /usr/share/grub/unicode.pf2} @samp{/share/grub/unicode.pf2} @end example This is mainly used internally by other GRUB utilities such as @command{grub-mkconfig} (@pxref{Invoking grub-mkconfig}), but may occasionally also be useful for debugging. @command{grub-mkrelpath} accepts the following options: @table @option @item --help Print a summary of the command-line options and exit. @item --version Print the version number of GRUB and exit. @end table @node Invoking grub-mkrescue @section Invoking grub-mkrescue The program @command{grub-mkrescue} generates a bootable GRUB rescue image (@pxref{Making a GRUB bootable CD-ROM}). @example grub-mkrescue -o grub.iso @end example All arguments not explicitly listed as @command{grub-mkrescue} options are passed on directly to @command{xorriso} in @command{mkisofs} emulation mode. Options passed to @command{xorriso} will normally be interpreted as @command{mkisofs} options; if the option @samp{--} is used, then anything after that will be interpreted as native @command{xorriso} options. Non-option arguments specify additional source directories. This is commonly used to add extra files to the image: @example mkdir -p disk/boot/grub @r{(add extra files to @file{disk/boot/grub})} grub-mkrescue -o grub.iso disk @end example @command{grub-mkrescue} accepts the following options: @table @option @item --help Print a summary of the command-line options and exit. @item --version Print the version number of GRUB and exit. @item -o @var{file} @itemx --output=@var{file} Save output in @var{file}. This "option" is required. @item --modules=@var{modules} Pre-load the named GRUB modules in the image. Multiple entries in @var{modules} should be separated by whitespace (so you will probably need to quote this for your shell). @item --rom-directory=@var{dir} If generating images for the QEMU or Coreboot platforms, copy the resulting @file{qemu.img} or @file{coreboot.elf} files respectively to the @var{dir} directory as well as including them in the image. @item --xorriso=@var{file} Use @var{file} as the @command{xorriso} program, rather than the built-in default. @item --grub-mkimage=@var{file} Use @var{file} as the @command{grub-mkimage} program, rather than the built-in default. @end table @node Invoking grub-mount @section Invoking grub-mount The program @command{grub-mount} performs a read-only mount of any file system or file system image that GRUB understands, using GRUB's file system drivers via FUSE. (It is only available if FUSE development files were present when GRUB was built.) This has a number of uses: @itemize @bullet @item It provides a convenient way to check how GRUB will view a file system at boot time. You can use normal command-line tools to compare that view with that of your operating system, making it easy to find bugs. @item It offers true read-only mounts. Linux does not have these for journalling file systems, because it will always attempt to replay the journal at mount time; while you can temporarily mark the block device read-only to avoid this, that causes the mount to fail. Since GRUB intentionally contains no code for writing to file systems, it can easily provide a guaranteed read-only mount mechanism. @item It allows you to examine any file system that GRUB understands without needing to load additional modules into your running kernel, which may be useful in constrained environments such as installers. @item Since it can examine file system images (contained in regular files) just as easily as file systems on block devices, you can use it to inspect any file system image that GRUB understands with only enough privileges to use FUSE, even if nobody has yet written a FUSE module specifically for that file system type. @end itemize Using @command{grub-mount} is normally as simple as: @example grub-mount /dev/sda1 /mnt @end example @command{grub-mount} must be given one or more images and a mount point as non-option arguments (if it is given more than one image, it will treat them as a RAID set), and also accepts the following options: @table @option @item --help Print a summary of the command-line options and exit. @item --version Print the version number of GRUB and exit. @item -C @itemx --crypto Mount encrypted devices, prompting for a passphrase if necessary. @item -d @var{string} @itemx --debug=@var{string} Show debugging output for conditions matching @var{string}. @item -K prompt|@var{file} @itemx --zfs-key=prompt|@var{file} Load a ZFS encryption key. If you use @samp{prompt} as the argument, @command{grub-mount} will read a passphrase from the terminal; otherwise, it will read key material from the specified file. @item -r @var{device} @itemx --root=@var{device} Set the GRUB root device to @var{device}. You do not normally need to set this; @command{grub-mount} will automatically set the root device to the root of the supplied file system. If @var{device} is just a number, then it will be treated as a partition number within the supplied image. This means that, if you have an image of an entire disk in @file{disk.img}, then you can use this command to mount its second partition: @example grub-mount -r 2 disk.img mount-point @end example @item -v @itemx --verbose Print verbose messages. @end table @node Invoking grub-probe @section Invoking grub-probe The program @command{grub-probe} probes device information for a given path or device. @example grub-probe --target=fs /boot/grub grub-probe --target=drive --device /dev/sda1 @end example @command{grub-probe} must be given a path or device as a non-option argument, and also accepts the following options: @table @option @item --help Print a summary of the command-line options and exit. @item --version Print the version number of GRUB and exit. @item -d @itemx --device If this option is given, then the non-option argument is a system device name (such as @samp{/dev/sda1}), and @command{grub-probe} will print information about that device. If it is not given, then the non-option argument is a filesystem path (such as @samp{/boot/grub}), and @command{grub-probe} will print information about the device containing that part of the filesystem. @item -m @var{file} @itemx --device-map=@var{file} Use @var{file} as the device map (@pxref{Device map}) rather than the default, usually @samp{/boot/grub/device.map}. @item -t @var{target} @itemx --target=@var{target} Print information about the given path or device as defined by @var{target}. The available targets and their meanings are: @table @samp @item fs GRUB filesystem module. @item fs_uuid Filesystem Universally Unique Identifier (UUID). @item fs_label Filesystem label. @item drive GRUB device name. @item device System device name. @item partmap GRUB partition map module. @item abstraction GRUB abstraction module (e.g. @samp{lvm}). @item cryptodisk_uuid Crypto device UUID. @item msdos_parttype MBR partition type code (two hexadecimal digits). @item hints_string A string of platform search hints suitable for passing to the @command{search} command (@pxref{search}). @item bios_hints Search hints for the PC BIOS platform. @item ieee1275_hints Search hints for the IEEE1275 platform. @item baremetal_hints Search hints for platforms where disks are addressed directly rather than via firmware. @item efi_hints Search hints for the EFI platform. @item arc_hints Search hints for the ARC platform. @item compatibility_hint A guess at a reasonable GRUB drive name for this device, which may be used as a fallback if the @command{search} command fails. @item disk System device name for the whole disk. @end table @item -v @itemx --verbose Print verbose messages. @end table @node Invoking grub-protect @section Invoking grub-protect The program @command{grub-protect} protects a disk encryption key with a specified key protector. @table @option @item --help Print a summary of the command-line options and exit. @item --version Print the version number of GRUB and exit. @item -a add|remove @itemx --action=add|remove Add or remove a key protector to or from a key. @item -p @var{protector} @itemx --protector=@var{protector} Set the key protector. Currently, @samp{tpm2} is the only supported key protector. @item --tpm2-asymmetric=@var{type} Choose the the type of SRK. The valid options are @samp{RSA} (@samp{RSA2048}) and @samp{ECC} (@samp{ECC_NIST_P256}).(default: @samp{ECC}) @item --tpm2-bank=@var{alg} Choose bank of PCRs used to authorize key release: @samp{SHA1}, @samp{SHA256}, @samp{SHA384}, or @samp{SHA512}. (default: @samp{SHA256}) @item --tpm2-device=@var{device} Set the path to the TPM2 device. (default: @samp{/dev/tpm0}) @item --tpm2-evict Evict a previously persisted SRK from the TPM, if any. @item --tpm2-keyfile=@var{file} Set the path to a file that contains the cleartext key to protect. @item --tpm2-outfile=@var{file} Set the path to the file that will contain the key after sealing (must be accessible to GRUB during boot). @item --tpm2-pcrs=@var{pcrs} Set a comma-separated list of PCRs used to authorize key release e.g., @samp{7,11}. Please be aware that PCR 0~7 are used by the firmware and the measurement result may change after a firmware update (for baremetal systems) or a package (OVMF/SLOF) update in the VM host. This may lead to the failure of key unsealing. (default: @samp{7}) @item --tpm2-srk=@var{handle} Set the SRK handle, e.g. @samp{0x81000000}, if the SRK is to be made persistent. @item --tpm2-nvindex=@var{handle} Set the handle, e.g. @samp{0x81000000} or @samp{0x1000000}, for NV index mode. @item --tpm2key Use TPM 2.0 Key File format. @end table @subsection 'Add' action Before sealing the key, please check the TPM PCR usage (@pxref{TPM2 key protector, TPM PCR usage}) to choose a proper set of PCRs. Assume that there is a key file, @file{luks.key}, to be sealed with PCR 0, 2, 4, and 7, and here is the @command{grub-protect} command to create the sealed key file: @example @group # @kbd{grub-protect --action=add \ --protector=tpm2 \ --tpm2-pcrs=0,2,4,7 \ --tpm2key \ --tpm2-keyfile=luks.key \ --tpm2-outfile=/boot/efi/efi/grub/sealed.tpm} @end group @end example Then, GRUB can unlock the target partition with the following commands: @example grub> @kbd{tpm2_key_protector_init -T (hd0,gpt1)/efi/grub/sealed.tpm} grub> @kbd{cryptomount -u -P tpm2} @end example Besides writing the PCR-sealed key into a file, @command{grub-protect} can write the sealed key into TPM non-volatile memory. Here is the @command{grub-protect} command to write the sealed key into the NV index handle @samp{0x1000000}. @example @group # @kbd{grub-protect --action=add \ --protector=tpm2 \ --tpm2-pcrs=0,2,4,7 \ --tpm2key \ --tpm2-keyfile=luks.key \ --tpm2-nvindex=0x1000000} @end group @end example Later, GRUB can fetch the key from @samp{0x1000000}. @example grub> @kbd{tpm2_key_protector_init --mode=nv --nvindex=0x1000000} grub> @kbd{cryptomount -u -P tpm2} @end example In most of cases, the user only needs to create the key with the `add' action. If auto-unlocking is unwanted, just remove the file and the @command{tpm2_key_protector_init} command and invoke the @command{cryptomount} command without @kbd{-P tpm2}. @subsection 'Remove' action The `remove' action is used to remove the handles for NV index mode and the persistent SRK. @subsubsection Handles for NV index mode There are two types of TPM handles supported by NV index mode: persistent handles and NV index handles, and @command{tpm2_getcap} can be used to check the existing handles. To display the list of existing persistent handles: @example @group # @kbd{tpm2_getcap handles-persistent} - 0x81000000 @end group @end example Similarly, to display the list of existing NV index handles: @example @group # @kbd{tpm2_getcap handles-nv-index} - 0x1000000 @end group @end example If the sealed key at an NV index handle is not needed anymore, the user can remove the handle with @kbd{--tpm2-nvindex} and @kbd{--tpm2-evict}. For example, this command removes the data from NV index @samp{0x1000000}: @example @group # @kbd{grub-protect --action=remove \ --protector=tpm2 \ --tpm2-evict \ --tpm2-nvindex 0x1000000} \ @end group @end example @subsubsection Persistent SRK There are two supported SRKs in @command{grub-protect}: @samp{RSA} and @samp{ECC}. Due to slower key generation, some users of the @samp{RSA} SRK may prefer making it persistent so that the TPM can skip the SRK generation when GRUB tries to unseal the key. The available persistent handles can be checked with @command{tpm2_getcap}. @example @group # @kbd{tpm2_getcap properties-variable} ... TPM2_PT_HR_PERSISTENT: 0x0 TPM2_PT_HR_PERSISTENT_AVAIL: 0x41 ... @end group @end example In this system, there is no persistent handle. A TPM handle is an unsigned 32-bit integer, and the persistent handles starts with @samp{0x81}. Here we choose the well-known persistent handle: @samp{0x81000000}. @example @group # @kbd{grub-protect --action=add \ --protector=tpm2 \ --tpm2-pcrs=0,2,4,7 \ --tpm2-asymmetric=RSA \ --tpm2-srk=0x81000000 \ --tpm2key \ --tpm2-keyfile=luks.key \ --tpm2-outfile=/boot/efi/efi/grub/sealed.tpm} @end group @end example The additional @kbd{--tpm2-asymmetric=RSA} and @kbd{--tpm2-srk=0x81000000} options are used to make the key sealed with the RSA SRK and store the SRK in @samp{0x81000000}. For the @command{tpm2_key_protector_init} command, the additional @kbd{-s 0x81000000} informs the TPM2 key protector to fetch the SRK from @samp{0x81000000}. @example grub> @kbd{tpm2_key_protector_init -s 0x81000000 -T (hd0,gpt1)/efi/grub/sealed.tpm} grub> @kbd{cryptomount -u -P tpm2} @end example After making the SRK handle persistent, we can check the status of the persistent handles with @command{tpm2_getcap}. @example @group # @kbd{tpm2_getcap properties-variable} ... TPM2_PT_HR_PERSISTENT: 0x1 TPM2_PT_HR_PERSISTENT_AVAIL: 0x40 ... # @kbd{tpm2_getcap handles-persistent} - 0x81000000 @end group @end example The sealed key can be removed once the user does not want to use the TPM2 key protector anymore. Here is the command to remove the persistent SRK handle (@samp{0x81000000}) with @kbd{--tpm2-srk} and @kbd{--tpm2-evict}. @example @group # @kbd{grub-protect --action=remove \ --protector=tpm2 \ --tpm2-srk 0x81000000 \ --tpm2-evict} @end group @end example @node Invoking grub-script-check @section Invoking grub-script-check The program @command{grub-script-check} takes a GRUB script file (@pxref{Shell-like scripting}) and checks it for syntax errors, similar to commands such as @command{sh -n}. It may take a @var{path} as a non-option argument; if none is supplied, it will read from standard input. @example grub-script-check /boot/grub/grub.cfg @end example @command{grub-script-check} accepts the following options: @table @option @item --help Print a summary of the command-line options and exit. @item --version Print the version number of GRUB and exit. @item -v @itemx --verbose Print each line of input after reading it. @end table @node Obtaining and Building GRUB @appendix How to obtain and build GRUB @quotation @strong{Caution:} GRUB requires binutils-2.9.1.0.23 or later because the GNU assembler has been changed so that it can produce real 16bits machine code between 2.9.1 and 2.9.1.0.x. See @uref{http://sources.redhat.com/binutils/}, to obtain information on how to get the latest version. @end quotation GRUB is available from the GNU alpha archive site @uref{ftp://ftp.gnu.org/gnu/grub} or any of its mirrors. The file will be named grub-version.tar.gz. The current version is @value{VERSION}, so the file you should grab is: @uref{ftp://ftp.gnu.org/gnu/grub/grub-@value{VERSION}.tar.gz} To unbundle GRUB use the instruction: @example @kbd{zcat grub-@value{VERSION}.tar.gz | tar xvf -} @end example which will create a directory called @file{grub-@value{VERSION}} with all the sources. You can look at the file @file{INSTALL} for detailed instructions on how to build and install GRUB, but you should be able to just do: @example @group @kbd{cd grub-@value{VERSION}} @kbd{./configure} @kbd{make install} @end group @end example Also, the latest version is available using Git. See @uref{http://www.gnu.org/software/grub/grub-download.html} for more information. @node Reporting bugs @appendix Reporting bugs These are the guideline for how to report bugs. Take a look at this list below before you submit bugs: @enumerate @item Before getting unsettled, read this manual through and through. Also, see the @uref{http://www.gnu.org/software/grub/grub-faq.html, GNU GRUB FAQ}. @item Always mention the information on your GRUB. The version number and the configuration are quite important. If you build it yourself, write the options specified to the configure script and your operating system, including the versions of gcc and binutils. @item If you have trouble with the installation, inform us of how you installed GRUB. Don't omit error messages, if any. Just @samp{GRUB hangs up when it boots} is not enough. The information on your hardware is also essential. These are especially important: the geometries and the partition tables of your hard disk drives and your BIOS. @item If GRUB cannot boot your operating system, write down @emph{everything} you see on the screen. Don't paraphrase them, like @samp{The foo OS crashes with GRUB, even though it can boot with the bar boot loader just fine}. Mention the commands you executed, the messages printed by them, and information on your operating system including the version number. @item Explain what you wanted to do. It is very useful to know your purpose and your wish, and how GRUB didn't satisfy you. @item If you can investigate the problem yourself, please do. That will give you and us much more information on the problem. Attaching a patch is even better. When you attach a patch, make the patch in unified diff format, and write ChangeLog entries. But, even when you make a patch, don't forget to explain the problem, so that we can understand what your patch is for. @item Write down anything that you think might be related. Please understand that we often need to reproduce the same problem you encountered in our environment. So your information should be sufficient for us to do the same thing---Don't forget that we cannot see your computer directly. If you are not sure whether to state a fact or leave it out, state it! Reporting too many things is much better than omitting something important. @end enumerate If you follow the guideline above, submit a report to the @uref{http://savannah.gnu.org/bugs/?group=grub, Bug Tracking System}. Alternatively, you can submit a report via electronic mail to @email{bug-grub@@gnu.org}, but we strongly recommend that you use the Bug Tracking System, because e-mail can be passed over easily. Once we get your report, we will try to fix the bugs. @node Future @appendix Where GRUB will go GRUB 2 is now quite stable and used in many production systems. We are currently working towards a 2.0 release. If you are interested in the development of GRUB 2, take a look at @uref{http://www.gnu.org/software/grub/grub.html, the homepage}. @node Copying This Manual @appendix Copying This Manual @menu * GNU Free Documentation License:: License for copying this manual. @end menu @include fdl.texi @node Index @unnumbered Index @c Currently, we use only the Concept Index. @printindex cp @bye Some notes: This is an attempt to make a manual for GRUB 2. The contents are copied from the GRUB manual in GRUB Legacy, so they are not always appropriate yet for GRUB 2. grub-2.14~git20250718.0e36779/docs/version-dev.texi0000644000175000017500000000020315036452576016072 00000000000000@set UPDATED 18 July 2025 @set UPDATED-MONTH July 2025 @set EDITION 2.14~git20250718.0e36779 @set VERSION 2.14~git20250718.0e36779 grub-2.14~git20250718.0e36779/docs/grub.info0000644000175000017500000004207515036452577014570 00000000000000This is grub.info, produced by makeinfo version 6.8 from grub.texi. This manual is for GNU GRUB (version 2.14~git20250718.0e36779, 18 July 2025). Copyright (C) 1999,2000,2001,2002,2004,2006,2008,2009,2010,2011,2012,2013 Free Software Foundation, Inc. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections. INFO-DIR-SECTION Kernel START-INFO-DIR-ENTRY * GRUB: (grub). The GRand Unified Bootloader * grub-install: (grub)Invoking grub-install. Install GRUB on your drive * grub-mkconfig: (grub)Invoking grub-mkconfig. Generate GRUB configuration * grub-mkpasswd-pbkdf2: (grub)Invoking grub-mkpasswd-pbkdf2. * grub-mkrelpath: (grub)Invoking grub-mkrelpath. * grub-mkrescue: (grub)Invoking grub-mkrescue. Make a GRUB rescue image * grub-mount: (grub)Invoking grub-mount. Mount a file system using GRUB * grub-probe: (grub)Invoking grub-probe. Probe device information * grub-script-check: (grub)Invoking grub-script-check. END-INFO-DIR-ENTRY  Indirect: grub.info-1: 1173 grub.info-2: 301381  Tag Table: (Indirect) Node: Top1173 Node: Introduction3783 Node: Overview4227 Node: Overview-Footnotes6217 Ref: Overview-Footnote-16278 Node: History6440 Node: Changes from GRUB Legacy8530 Node: Features11006 Node: Features-Footnotes17638 Ref: Features-Footnote-117699 Ref: Features-Footnote-217795 Ref: Features-Footnote-317942 Node: Role of a boot loader18087 Node: Role of a boot loader-Footnotes19426 Ref: Role of a boot loader-Footnote-119513 Node: Naming convention19592 Node: OS-specific notes about grub tools22503 Node: Installation23539 Node: Installing GRUB using grub-install24661 Node: Making a GRUB bootable CD-ROM26976 Node: Making a GRUB bootable CD-ROM-Footnotes28835 Ref: Making a GRUB bootable CD-ROM-Footnote-128938 Node: Device map29013 Node: BIOS installation30980 Node: Booting35601 Node: General boot methods36136 Node: Loading an operating system directly36833 Node: Kexec37556 Node: Chain-loading38307 Node: Loopback booting39267 Node: LVM cache booting40969 Node: OS-specific notes42235 Node: GNU/Hurd42525 Node: GNU/Linux43648 Node: NetBSD44966 Node: DOS/Windows46440 Node: Configuration48218 Node: Simple configuration48930 Node: Root Identification Heuristics66347 Node: Shell-like scripting69390 Node: Shell-like scripting-Footnotes77630 Ref: Shell-like scripting-Footnote-177715 Node: Multi-boot manual config77842 Node: Embedded configuration81451 Node: Theme file format84287 Ref: Pixmap-styled progress bar85746 Ref: Plain progress bar, drawn with solid color.85758 Ref: An example of the slices (in red) used for a terminal window. This drawing was created and sliced in Inkscape_, as the next section explains.89250 Node: Network109662 Node: Serial terminal114221 Node: Vendor power-on keys116620 Node: Images118555 Node: Core image size limitation123530 Node: Filesystem126094 Node: Device syntax126803 Node: File name syntax129868 Node: Block list syntax130914 Node: Interface131794 Node: Command-line interface132618 Node: Command-line interface-Footnotes134534 Ref: Command-line interface-Footnote-1134623 Node: Menu interface134718 Node: Menu entry editor135853 Node: Environment136591 Node: Special environment variables137293 Node: biosnum138445 Node: check_signatures138969 Node: chosen139256 Node: cmdpath139699 Node: color_highlight140126 Node: color_normal140538 Node: config_directory142201 Node: config_file142495 Node: cryptodisk_passphrase_tries142910 Node: debug143320 Node: default144287 Node: fallback145715 Node: gfxmode146048 Node: gfxpayload146846 Node: gfxterm_font148000 Node: grub_cpu148300 Node: grub_platform148588 Node: icondir148880 Node: lang149197 Node: locale_dir149666 Node: lockdown150163 Node: menu_color_highlight150405 Node: menu_color_normal150899 Node: net__boot_file151400 Node: net__clientid151635 Node: net__clientuuid151877 Node: net__dhcp_server_name152130 Node: net__domain152393 Node: net__extensionspath152640 Node: net__hostname152895 Node: net__ip153134 Node: net__mac153350 Node: net__next_server153571 Node: net__rootpath153814 Node: net_default_interface154053 Node: net_default_ip154273 Node: net_default_mac154470 Node: net_default_server154666 Node: pager154859 Node: prefix155115 Node: pxe_default_server155571 Node: root155754 Node: shim_lock156294 Node: superusers156561 Node: theme156814 Node: timeout157135 Node: timeout_style157772 Node: tpm_fail_fatal158180 Node: Environment block158865 Node: Modules160297 Node: acpi_module166401 Node: adler32_module166664 Node: affs_module166920 Node: afs_module167194 Node: afsplitter_module167465 Node: ahci_module167738 Node: all_video_module168089 Node: aout_module168369 Node: appleldr_module168752 Node: archelp_module168990 Node: at_keyboard_module169235 Node: ata_module169453 Node: backtrace_module169662 Node: bfs_module169906 Node: biosdisk_module170185 Node: bitmap_module170418 Node: bitmap_scale_module170635 Node: bli_module170838 Node: blocklist_module171867 Node: boot_module172136 Node: boottime_module172386 Node: bsd_module172733 Node: bswap_test_module173156 Node: btrfs_module173392 Node: bufio_module173584 Node: cacheinfo_module173826 Node: cat_module174126 Node: cbfs_module174384 Node: cbls_module174695 Node: cbmemc_module174901 Node: cbtable_module175133 Node: cbtime_module175327 Node: chain_module175562 Node: cmdline_cat_test_module175833 Node: cmosdump_module176078 Node: cmostest_module176367 Node: cmp_module176668 Node: cmp_test_module176913 Node: configfile_module177240 Node: cpio_module177563 Node: cpio_be_module177843 Node: cpuid_module178145 Node: crc64_module178393 Node: crypto_module178570 Node: cryptodisk_module178787 Node: cs5536_module179069 Node: ctz_test_module179274 Node: date_module179521 Node: datehook_module179777 Node: datetime_module180055 Node: disk_module180300 Node: diskfilter_module180495 Node: div_module180797 Node: div_test_module180994 Node: dm_nv_module181212 Node: drivemap_module181419 Node: echo_module181668 Node: efi_gop_module181898 Node: efi_uga_module182125 Node: efiemu_module182347 Node: efifwsetup_module182616 Node: efinet_module182890 Node: efitextmode_module183126 Node: ehci_module183403 Node: elf_module183634 Node: emunet_module183835 Node: emupci_module184032 Node: erofs_module184242 Node: escc_module184441 Node: eval_module184633 Node: exfat_module184898 Node: exfctest_module185121 Node: ext2_module185396 Node: extcmd_module185643 Node: f2fs_module185914 Node: fat_module186112 Node: fdt_module186359 Node: file_module186776 Node: fixvideo_module187043 Node: font_module187424 Node: freedos_module187726 Node: fshelp_module187935 Node: functional_test_module188148 Node: gcry_arcfour_module188435 Node: gcry_blowfish_module188835 Node: gcry_camellia_module189091 Node: gcry_cast5_module189345 Node: gcry_crc_module189619 Node: gcry_des_module189902 Node: gcry_dsa_module190301 Node: gcry_idea_module190559 Node: gcry_md4_module190832 Node: gcry_md5_module191168 Node: gcry_rfc2268_module191507 Node: gcry_rijndael_module191859 Node: gcry_rmd160_module192166 Node: gcry_rsa_module192422 Node: gcry_seed_module192680 Node: gcry_serpent_module192915 Node: gcry_sha1_module193181 Node: gcry_sha256_module193539 Node: gcry_sha512_module193848 Node: gcry_tiger_module194158 Node: gcry_twofish_module194433 Node: gcry_whirlpool_module194700 Node: gdb_module194960 Node: geli_module195510 Node: gettext_module195876 Node: gfxmenu_module196163 Node: gfxterm_module196489 Node: gfxterm_background_module196739 Node: gfxterm_menu_module197137 Node: gptsync_module197387 Node: gzio_module197619 Node: halt_module198059 Node: hashsum_module198300 Node: hdparm_module198709 Node: hello_module199299 Node: help_module199568 Node: hexdump_module199799 Node: hfs_module200067 Node: hfsplus_module200368 Node: hfspluscomp_module200597 Node: http_module200857 Node: ieee1275_fb_module201192 Node: iorw_module201437 Node: iso9660_module201874 Node: jfs_module202231 Node: jpeg_module202519 Node: json_module202785 Node: keylayouts_module203128 Node: keystatus_module203774 Node: ldm_module204041 Node: legacy_password_test_module204416 Node: legacycfg_module204685 Node: linux_module205186 Node: linux16_module205491 Node: loadbios_module205837 Node: loadenv_module206282 Node: loopback_module206710 Node: ls_module206939 Node: lsacpi_module207143 Node: lsapm_module207417 Node: lsdev_module207678 Node: lsefi_module207950 Node: lsefimmap_module208199 Node: lsefisystab_module208473 Node: lsmmap_module208757 Node: lspci_module209019 Node: lssal_module209259 Node: lsspd_module209560 Node: lsxen_module209856 Node: luks_module210086 Node: luks2_module210326 Node: lvm_module210557 Node: lzopio_module210934 Node: macbless_module211149 Node: macho_module211510 Node: mda_text_module211749 Node: mdraid09_module212009 Node: mdraid09_be_module212421 Node: mdraid1x_module212836 Node: memdisk_module213150 Node: memrw_module213379 Node: memtools_module213979 Node: minicmd_module214232 Node: minix_module214716 Node: minix2_module215000 Node: minix2_be_module215288 Node: minix3_module215594 Node: minix3_be_module215886 Node: minix_be_module216194 Node: mmap_module216498 Node: morse_module216784 Node: mpi_module217008 Node: msdospart_module217331 Node: mul_test_module217584 Node: multiboot_module217824 Node: multiboot2_module218237 Node: nand_module218591 Node: nativedisk_module218809 Node: net_module219046 Node: newc_module220083 Node: nilfs2_module220833 Node: normal_module221135 Node: ntfs_module221357 Node: ntfscomp_module221652 Node: ntldr_module221971 Node: odc_module222227 Node: offsetio_module222703 Node: ofnet_module222927 Node: ohci_module223148 Node: part_acorn_module223386 Node: part_amiga_module223650 Node: part_apple_module223895 Node: part_bsd_module224142 Node: part_dfly_module224381 Node: part_dvh_module224627 Node: part_gpt_module224880 Node: part_msdos_module225139 Node: part_plan_module225415 Node: part_sun_module225660 Node: part_sunpc_module225901 Node: parttool_module226148 Node: password_module226386 Node: password_pbkdf2_module226765 Node: pata_module227032 Node: pbkdf2_module227241 Node: pbkdf2_test_module227493 Node: pci_module227724 Node: pcidump_module227944 Node: pgp_module228262 Node: plainmount_module228804 Node: plan9_module229101 Node: play_module229306 Node: png_module229552 Node: priority_queue_module229772 Node: probe_module230033 Node: procfs_module230289 Node: progress_module230539 Node: pxe_module230751 Node: pxechain_module231014 Node: raid5rec_module231245 Node: raid6rec_module231460 Node: random_module231672 Node: rdmsr_module231962 Node: read_module232214 Node: reboot_module232448 Node: regexp_module232691 Node: reiserfs_module233041 Node: relocator_module233336 Node: romfs_module233632 Node: scsi_module233924 Node: sdl_module234266 Node: search_module234726 Node: search_fs_file_module235016 Node: search_fs_uuid_module235332 Node: search_label_module235657 Node: sendkey_module235972 Node: serial_module236233 Node: setjmp_module236537 Node: setjmp_test_module236759 Node: setpci_module237009 Node: sfs_module237254 Node: shift_test_module237544 Node: signature_test_module237789 Node: sleep_module238059 Node: sleep_test_module238333 Node: smbios_module238561 Node: spkmodem_module238827 Node: squash4_module239212 Node: strtoull_test_module239441 Node: suspend_module239684 Node: syslinuxcfg_module239948 Node: tar_module240473 Node: terminal_module240699 Node: terminfo_module241000 Node: test_module241280 Node: test_blockarg_module241572 Node: testload_module241883 Node: testspeed_module242175 Node: tftp_module242425 Node: tga_module242733 Node: time_module242945 Node: tpm_module243190 Node: tr_module243467 Node: trig_module243810 Node: true_module244121 Node: truecrypt_module244365 Node: ubootnet_module244610 Node: udf_module244868 Node: ufs1_module245178 Node: ufs1_be_module245462 Node: ufs2_module245766 Node: uhci_module246051 Node: usb_module246262 Node: usb_keyboard_module246472 Node: usbms_module246672 Node: usbserial_common_module246881 Node: usbserial_ftdi_module247235 Node: usbserial_pl2303_module247546 Node: usbserial_usbdebug_module247857 Node: usbtest_module248317 Node: vbe_module248641 Node: verifiers_module248850 Node: vga_module249091 Node: vga_text_module249302 Node: video_module249521 Node: video_bochs_module249731 Node: video_cirrus_module249994 Node: video_colors_module250247 Node: video_fb_module250497 Node: videoinfo_module250715 Node: videotest_module251011 Node: videotest_checksum_module251330 Node: wrmsr_module251638 Node: xen_boot_module251910 Node: xfs_module252171 Node: xnu_module252352 Node: xnu_uuid_module252781 Node: xnu_uuid_test_module253033 Node: xzio_module253277 Node: zfs_module253474 Node: zfscrypt_module253656 Node: zfsinfo_module253924 Node: zstd_module254216 Node: Commands254405 Node: Menu-specific commands255278 Node: menuentry255981 Node: submenu257522 Node: Loader commands258051 Node: chainloader260367 Node: initrd261052 Node: initrd16263196 Node: linux263794 Node: linux16264673 Node: xen_hypervisor265370 Node: xen_module265810 Node: General commands266311 Node: serial266761 Node: terminal_input268825 Node: terminal_output269487 Node: terminfo270150 Node: Command-line commands271373 Node: [276878 Node: acpi277045 Node: authenticate278313 Node: background_color278725 Node: background_image279383 Node: badram279912 Node: blocklist281282 Node: boot281501 Node: cat281808 Node: clear282769 Node: cmosclean282932 Node: cmosdump283221 Node: cmostest283501 Node: cmp283844 Node: configfile284587 Node: cpuid284997 Node: crc285553 Node: cryptocheck285812 Node: cryptomount286357 Node: cutmem289067 Node: date289931 Node: devicetree290460 Node: distrust290987 Node: drivemap291753 Node: echo292578 Node: efitextmode293509 Node: eval295731 Node: export296006 Node: false296302 Node: fdtdump296583 Node: file297312 Node: fwsetup301381 Node: gdbinfo301725 Node: gettext302264 Node: gptsync302698 Node: halt303628 Node: hashsum304000 Node: help305201 Node: hexdump305654 Node: insmod306457 Node: keystatus306663 Node: list_env307284 Node: list_trusted307635 Node: load_env308203 Node: loadfont309857 Node: loopback310213 Node: ls310797 Node: lsfonts311324 Node: lsmod311491 Node: md5sum311666 Node: module311930 Node: multiboot312227 Node: nativedisk313321 Node: normal313705 Node: normal_exit314457 Node: parttool314764 Node: password316255 Node: password_pbkdf2316522 Node: plainmount316921 Node: plainmount-Footnotes320611 Ref: plainmount-Footnote-1320676 Node: play320767 Node: probe321495 Node: rdmsr321958 Node: read322726 Node: reboot323165 Node: regexp323333 Node: rmmod323853 Node: save_env324031 Node: search325036 Node: sendkey326993 Node: set333447 Node: sha1sum333859 Node: sha256sum334129 Node: sha512sum334413 Node: sleep334695 Node: smbios335200 Node: source338198 Node: test338736 Node: tpm2_key_protector_init341509 Node: tpm2_key_protector_clear344589 Node: tpm2_dump_pcr344890 Node: true345429 Node: trust345709 Node: unset346484 Node: verify_detached346683 Node: videoinfo347711 Node: wrmsr347974 Node: Networking commands348750 Node: net_add_addr349823 Node: net_add_dns350343 Node: net_add_route350619 Node: net_bootp351147 Node: net_del_addr351512 Node: net_del_dns351752 Node: net_del_route351999 Node: net_dhcp352233 Node: net_get_dhcp_option354212 Node: net_ipv6_autoconf354693 Node: net_ls_addr355114 Node: net_ls_cards355362 Node: net_ls_dns355598 Node: net_ls_routes355829 Node: net_nslookup356036 Node: net_set_vlan356341 Node: Undocumented commands356792 Node: Internationalisation361950 Node: Security368789 Node: Authentication and authorisation369444 Node: Using digital signatures372706 Node: UEFI secure boot and shim375976 Node: Secure Boot Advanced Targeting377084 Node: Measured Boot378115 Node: Lockdown380105 Node: TPM2 key protector381550 Node: Platform limitations396561 Node: Platform-specific operations404649 Node: Supported kernels405715 Node: Troubleshooting413352 Node: GRUB only offers a rescue shell413621 Node: Firmware stalls instead of booting GRUB416630 Node: User-space utilities417261 Node: Invoking grub-install418064 Node: Invoking grub-mkconfig420231 Node: Invoking grub-mkpasswd-pbkdf2420889 Node: Invoking grub-mkrelpath421569 Node: Invoking grub-mkrescue422363 Node: Invoking grub-mount424133 Node: Invoking grub-probe427203 Node: Invoking grub-protect429813 Node: Invoking grub-script-check436524 Node: Obtaining and Building GRUB437255 Node: Reporting bugs438592 Node: Future441408 Node: Copying This Manual441808 Node: GNU Free Documentation License442036 Node: Index464425  End Tag Table  Local Variables: coding: utf-8 End: grub-2.14~git20250718.0e36779/docs/fdl.texi0000644000175000017500000005101015000202015014344 00000000000000 @node GNU Free Documentation License @appendixsec GNU Free Documentation License @cindex FDL, GNU Free Documentation License @center Version 1.2, November 2002 @display Copyright @copyright{} 2000,2001,2002 Free Software Foundation, Inc. 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. @end display @enumerate 0 @item PREAMBLE The purpose of this License is to make a manual, textbook, or other functional and useful document @dfn{free} in the sense of freedom: to assure everyone the effective freedom to copy and redistribute it, with or without modifying it, either commercially or noncommercially. Secondarily, this License preserves for the author and publisher a way to get credit for their work, while not being considered responsible for modifications made by others. This License is a kind of ``copyleft'', which means that derivative works of the document must themselves be free in the same sense. It complements the GNU General Public License, which is a copyleft license designed for free software. We have designed this License in order to use it for manuals for free software, because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. But this License is not limited to software manuals; it can be used for any textual work, regardless of subject matter or whether it is published as a printed book. We recommend this License principally for works whose purpose is instruction or reference. @item APPLICABILITY AND DEFINITIONS This License applies to any manual or other work, in any medium, that contains a notice placed by the copyright holder saying it can be distributed under the terms of this License. Such a notice grants a world-wide, royalty-free license, unlimited in duration, to use that work under the conditions stated herein. The ``Document'', below, refers to any such manual or work. Any member of the public is a licensee, and is addressed as ``you''. You accept the license if you copy, modify or distribute the work in a way requiring permission under copyright law. A ``Modified Version'' of the Document means any work containing the Document or a portion of it, either copied verbatim, or with modifications and/or translated into another language. A ``Secondary Section'' is a named appendix or a front-matter section of the Document that deals exclusively with the relationship of the publishers or authors of the Document to the Document's overall subject (or to related matters) and contains nothing that could fall directly within that overall subject. (Thus, if the Document is in part a textbook of mathematics, a Secondary Section may not explain any mathematics.) The relationship could be a matter of historical connection with the subject or with related matters, or of legal, commercial, philosophical, ethical or political position regarding them. The ``Invariant Sections'' are certain Secondary Sections whose titles are designated, as being those of Invariant Sections, in the notice that says that the Document is released under this License. If a section does not fit the above definition of Secondary then it is not allowed to be designated as Invariant. The Document may contain zero Invariant Sections. If the Document does not identify any Invariant Sections then there are none. The ``Cover Texts'' are certain short passages of text that are listed, as Front-Cover Texts or Back-Cover Texts, in the notice that says that the Document is released under this License. A Front-Cover Text may be at most 5 words, and a Back-Cover Text may be at most 25 words. A ``Transparent'' copy of the Document means a machine-readable copy, represented in a format whose specification is available to the general public, that is suitable for revising the document straightforwardly with generic text editors or (for images composed of pixels) generic paint programs or (for drawings) some widely available drawing editor, and that is suitable for input to text formatters or for automatic translation to a variety of formats suitable for input to text formatters. A copy made in an otherwise Transparent file format whose markup, or absence of markup, has been arranged to thwart or discourage subsequent modification by readers is not Transparent. An image format is not Transparent if used for any substantial amount of text. A copy that is not ``Transparent'' is called ``Opaque''. Examples of suitable formats for Transparent copies include plain @sc{ascii} without markup, Texinfo input format, La@TeX{} input format, @acronym{SGML} or @acronym{XML} using a publicly available @acronym{DTD}, and standard-conforming simple @acronym{HTML}, PostScript or @acronym{PDF} designed for human modification. Examples of transparent image formats include @acronym{PNG}, @acronym{XCF} and @acronym{JPG}. Opaque formats include proprietary formats that can be read and edited only by proprietary word processors, @acronym{SGML} or @acronym{XML} for which the @acronym{DTD} and/or processing tools are not generally available, and the machine-generated @acronym{HTML}, PostScript or @acronym{PDF} produced by some word processors for output purposes only. The ``Title Page'' means, for a printed book, the title page itself, plus such following pages as are needed to hold, legibly, the material this License requires to appear in the title page. For works in formats which do not have any title page as such, ``Title Page'' means the text near the most prominent appearance of the work's title, preceding the beginning of the body of the text. A section ``Entitled XYZ'' means a named subunit of the Document whose title either is precisely XYZ or contains XYZ in parentheses following text that translates XYZ in another language. (Here XYZ stands for a specific section name mentioned below, such as ``Acknowledgements'', ``Dedications'', ``Endorsements'', or ``History''.) To ``Preserve the Title'' of such a section when you modify the Document means that it remains a section ``Entitled XYZ'' according to this definition. The Document may include Warranty Disclaimers next to the notice which states that this License applies to the Document. These Warranty Disclaimers are considered to be included by reference in this License, but only as regards disclaiming warranties: any other implication that these Warranty Disclaimers may have is void and has no effect on the meaning of this License. @item VERBATIM COPYING You may copy and distribute the Document in any medium, either commercially or noncommercially, provided that this License, the copyright notices, and the license notice saying this License applies to the Document are reproduced in all copies, and that you add no other conditions whatsoever to those of this License. You may not use technical measures to obstruct or control the reading or further copying of the copies you make or distribute. However, you may accept compensation in exchange for copies. If you distribute a large enough number of copies you must also follow the conditions in section 3. You may also lend copies, under the same conditions stated above, and you may publicly display copies. @item COPYING IN QUANTITY If you publish printed copies (or copies in media that commonly have printed covers) of the Document, numbering more than 100, and the Document's license notice requires Cover Texts, you must enclose the copies in covers that carry, clearly and legibly, all these Cover Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on the back cover. Both covers must also clearly and legibly identify you as the publisher of these copies. The front cover must present the full title with all words of the title equally prominent and visible. You may add other material on the covers in addition. Copying with changes limited to the covers, as long as they preserve the title of the Document and satisfy these conditions, can be treated as verbatim copying in other respects. If the required texts for either cover are too voluminous to fit legibly, you should put the first ones listed (as many as fit reasonably) on the actual cover, and continue the rest onto adjacent pages. If you publish or distribute Opaque copies of the Document numbering more than 100, you must either include a machine-readable Transparent copy along with each Opaque copy, or state in or with each Opaque copy a computer-network location from which the general network-using public has access to download using public-standard network protocols a complete Transparent copy of the Document, free of added material. If you use the latter option, you must take reasonably prudent steps, when you begin distribution of Opaque copies in quantity, to ensure that this Transparent copy will remain thus accessible at the stated location until at least one year after the last time you distribute an Opaque copy (directly or through your agents or retailers) of that edition to the public. It is requested, but not required, that you contact the authors of the Document well before redistributing any large number of copies, to give them a chance to provide you with an updated version of the Document. @item MODIFICATIONS You may copy and distribute a Modified Version of the Document under the conditions of sections 2 and 3 above, provided that you release the Modified Version under precisely this License, with the Modified Version filling the role of the Document, thus licensing distribution and modification of the Modified Version to whoever possesses a copy of it. In addition, you must do these things in the Modified Version: @enumerate A @item Use in the Title Page (and on the covers, if any) a title distinct from that of the Document, and from those of previous versions (which should, if there were any, be listed in the History section of the Document). You may use the same title as a previous version if the original publisher of that version gives permission. @item List on the Title Page, as authors, one or more persons or entities responsible for authorship of the modifications in the Modified Version, together with at least five of the principal authors of the Document (all of its principal authors, if it has fewer than five), unless they release you from this requirement. @item State on the Title page the name of the publisher of the Modified Version, as the publisher. @item Preserve all the copyright notices of the Document. @item Add an appropriate copyright notice for your modifications adjacent to the other copyright notices. @item Include, immediately after the copyright notices, a license notice giving the public permission to use the Modified Version under the terms of this License, in the form shown in the Addendum below. @item Preserve in that license notice the full lists of Invariant Sections and required Cover Texts given in the Document's license notice. @item Include an unaltered copy of this License. @item Preserve the section Entitled ``History'', Preserve its Title, and add to it an item stating at least the title, year, new authors, and publisher of the Modified Version as given on the Title Page. If there is no section Entitled ``History'' in the Document, create one stating the title, year, authors, and publisher of the Document as given on its Title Page, then add an item describing the Modified Version as stated in the previous sentence. @item Preserve the network location, if any, given in the Document for public access to a Transparent copy of the Document, and likewise the network locations given in the Document for previous versions it was based on. These may be placed in the ``History'' section. You may omit a network location for a work that was published at least four years before the Document itself, or if the original publisher of the version it refers to gives permission. @item For any section Entitled ``Acknowledgements'' or ``Dedications'', Preserve the Title of the section, and preserve in the section all the substance and tone of each of the contributor acknowledgements and/or dedications given therein. @item Preserve all the Invariant Sections of the Document, unaltered in their text and in their titles. Section numbers or the equivalent are not considered part of the section titles. @item Delete any section Entitled ``Endorsements''. Such a section may not be included in the Modified Version. @item Do not retitle any existing section to be Entitled ``Endorsements'' or to conflict in title with any Invariant Section. @item Preserve any Warranty Disclaimers. @end enumerate If the Modified Version includes new front-matter sections or appendices that qualify as Secondary Sections and contain no material copied from the Document, you may at your option designate some or all of these sections as invariant. To do this, add their titles to the list of Invariant Sections in the Modified Version's license notice. These titles must be distinct from any other section titles. You may add a section Entitled ``Endorsements'', provided it contains nothing but endorsements of your Modified Version by various parties---for example, statements of peer review or that the text has been approved by an organization as the authoritative definition of a standard. You may add a passage of up to five words as a Front-Cover Text, and a passage of up to 25 words as a Back-Cover Text, to the end of the list of Cover Texts in the Modified Version. Only one passage of Front-Cover Text and one of Back-Cover Text may be added by (or through arrangements made by) any one entity. If the Document already includes a cover text for the same cover, previously added by you or by arrangement made by the same entity you are acting on behalf of, you may not add another; but you may replace the old one, on explicit permission from the previous publisher that added the old one. The author(s) and publisher(s) of the Document do not by this License give permission to use their names for publicity for or to assert or imply endorsement of any Modified Version. @item COMBINING DOCUMENTS You may combine the Document with other documents released under this License, under the terms defined in section 4 above for modified versions, provided that you include in the combination all of the Invariant Sections of all of the original documents, unmodified, and list them all as Invariant Sections of your combined work in its license notice, and that you preserve all their Warranty Disclaimers. The combined work need only contain one copy of this License, and multiple identical Invariant Sections may be replaced with a single copy. If there are multiple Invariant Sections with the same name but different contents, make the title of each such section unique by adding at the end of it, in parentheses, the name of the original author or publisher of that section if known, or else a unique number. Make the same adjustment to the section titles in the list of Invariant Sections in the license notice of the combined work. In the combination, you must combine any sections Entitled ``History'' in the various original documents, forming one section Entitled ``History''; likewise combine any sections Entitled ``Acknowledgements'', and any sections Entitled ``Dedications''. You must delete all sections Entitled ``Endorsements.'' @item COLLECTIONS OF DOCUMENTS You may make a collection consisting of the Document and other documents released under this License, and replace the individual copies of this License in the various documents with a single copy that is included in the collection, provided that you follow the rules of this License for verbatim copying of each of the documents in all other respects. You may extract a single document from such a collection, and distribute it individually under this License, provided you insert a copy of this License into the extracted document, and follow this License in all other respects regarding verbatim copying of that document. @item AGGREGATION WITH INDEPENDENT WORKS A compilation of the Document or its derivatives with other separate and independent documents or works, in or on a volume of a storage or distribution medium, is called an ``aggregate'' if the copyright resulting from the compilation is not used to limit the legal rights of the compilation's users beyond what the individual works permit. When the Document is included in an aggregate, this License does not apply to the other works in the aggregate which are not themselves derivative works of the Document. If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if the Document is less than one half of the entire aggregate, the Document's Cover Texts may be placed on covers that bracket the Document within the aggregate, or the electronic equivalent of covers if the Document is in electronic form. Otherwise they must appear on printed covers that bracket the whole aggregate. @item TRANSLATION Translation is considered a kind of modification, so you may distribute translations of the Document under the terms of section 4. Replacing Invariant Sections with translations requires special permission from their copyright holders, but you may include translations of some or all Invariant Sections in addition to the original versions of these Invariant Sections. You may include a translation of this License, and all the license notices in the Document, and any Warranty Disclaimers, provided that you also include the original English version of this License and the original versions of those notices and disclaimers. In case of a disagreement between the translation and the original version of this License or a notice or disclaimer, the original version will prevail. If a section in the Document is Entitled ``Acknowledgements'', ``Dedications'', or ``History'', the requirement (section 4) to Preserve its Title (section 1) will typically require changing the actual title. @item TERMINATION You may not copy, modify, sublicense, or distribute the Document except as expressly provided for under this License. Any other attempt to copy, modify, sublicense or distribute the Document is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. @item FUTURE REVISIONS OF THIS LICENSE The Free Software Foundation may publish new, revised versions of the GNU Free Documentation License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. See @uref{http://www.gnu.org/copyleft/}. Each version of the License is given a distinguishing version number. If the Document specifies that a particular numbered version of this License ``or any later version'' applies to it, you have the option of following the terms and conditions either of that specified version or of any later version that has been published (not as a draft) by the Free Software Foundation. If the Document does not specify a version number of this License, you may choose any version ever published (not as a draft) by the Free Software Foundation. @end enumerate @page @appendixsubsec ADDENDUM: How to use this License for your documents To use this License in a document you have written, include a copy of the License in the document and put the following copyright and license notices just after the title page: @smallexample @group Copyright (C) @var{year} @var{your name}. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled ``GNU Free Documentation License''. @end group @end smallexample If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, replace the ``with...Texts.'' line with this: @smallexample @group with the Invariant Sections being @var{list their titles}, with the Front-Cover Texts being @var{list}, and with the Back-Cover Texts being @var{list}. @end group @end smallexample If you have Invariant Sections without Cover Texts, or some other combination of the three, merge those two alternatives to suit the situation. If your document contains nontrivial examples of program code, we recommend releasing these examples in parallel under your choice of free software license, such as the GNU General Public License, to permit their use in free software. @c Local Variables: @c ispell-local-pdict: "ispell-dict" @c End: grub-2.14~git20250718.0e36779/docs/stamp-10000644000175000017500000000020315036452576014143 00000000000000@set UPDATED 18 July 2025 @set UPDATED-MONTH July 2025 @set EDITION 2.14~git20250718.0e36779 @set VERSION 2.14~git20250718.0e36779 grub-2.14~git20250718.0e36779/docs/osdetect.cfg0000644000175000017500000002241615000202015015207 00000000000000# Sample GRUB script to autodetect operating systems # # Copyright (C) 2010 Free Software Foundation, Inc. # # GRUB is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # GRUB is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GRUB. If not, see . set saved_root=$root function freebsd_ufs_variants { set device=$1 set fstype=$2 set uuid=$3 menuentry "FreeBSD (on $fstype $device)" $device $uuid { set root=$2 set uuid=$3 freebsd /boot/kernel/kernel set FreeBSD.acpi_load=YES set FreeBSD.hint.acpi.0.disabled=0 set FreeBSD.vfs.root.mountfrom=ufs:ufsid/$uuid frebsd_loadenv /boot/device.hints } menuentry "FreeBSD (on $fstype $device) (single)" $device $uuid { set root=$2 set uuid=$3 freebsd /boot/kernel/kernel --single set FreeBSD.acpi_load=YES set FreeBSD.hint.acpi.0.disabled=0 set FreeBSD.vfs.root.mountfrom=ufs:ufsid/$uuid frebsd_loadenv /boot/device.hints } menuentry "FreeBSD (on $fstype $device) (verbose)" $device $uuid { set root=$2 set uuid=$3 freebsd /boot/kernel/kernel --verbose set FreeBSD.acpi_load=YES set FreeBSD.hint.acpi.0.disabled=0 set FreeBSD.vfs.root.mountfrom=ufs:ufsid/$uuid frebsd_loadenv /boot/device.hints } menuentry "FreeBSD (on $fstype $device) (without ACPI)" $device $uuid { set root=$2 set uuid=$3 freebsd /boot/kernel/kernel --verbose unset FreeBSD.acpi_load set FreeBSD.hint.acpi.0.disabled=1 set FreeBSD.loader.acpi_disabled_by_user=1 set FreeBSD.vfs.root.mountfrom=ufs:ufsid/$uuid frebsd_loadenv /boot/device.hints } menuentry "FreeBSD (on $fstype $device) (safe mode)" $device $uuid { set root=$2 set uuid=$3 freebsd /boot/kernel/kernel --verbose unset FreeBSD.acpi_load set FreeBSD.hint.acpi.0.disabled=1 set FreeBSD.loader.acpi_disabled_by_user=1 set FreeBSD.hint.apic.0.disabled=1 set FreeBSD.hw.ata.ata_dma=0 set FreeBSD.hw.ata.atapi_dma=0 set FreeBSD.hw.ata.wc=0 set FreeBSD.hw.eisa_slots=0 set FreeBSD.hint.kbdmux.0.disabled=1 set FreeBSD.vfs.root.mountfrom=ufs:ufsid/$uuid frebsd_loadenv /boot/device.hints } } function freebsd_zfs_variants { set device=$1 set fstype=zfs menuentry "FreeBSD (on $fstype $device)" $device { set root=$2 freebsd /@/boot/kernel/kernel set FreeBSD.acpi_load=YES set FreeBSD.hint.acpi.0.disabled=0 freebsd_module_elf /@/boot/kernel/opensolaris.ko freebsd_module_elf /@/boot/kernel/zfs.ko freebsd_module /@/boot/zfs/zpool.cache type=/boot/zfs/zpool.cache probe -l -s name $root set FreeBSD.vfs.root.mountfrom=zfs:$name freebsd_loadenv /@/boot/device.hints } menuentry "FreeBSD (on $fstype $device) (single)" $device { set root=$2 freebsd /@/boot/kernel/kernel --single set FreeBSD.acpi_load=YES set FreeBSD.hint.acpi.0.disabled=0 freebsd_module_elf /@/boot/kernel/opensolaris.ko freebsd_module_elf /@/boot/kernel/zfs.ko freebsd_module /@/boot/zfs/zpool.cache type=/boot/zfs/zpool.cache probe -l -s name $root set FreeBSD.vfs.root.mountfrom=zfs:$name freebsd_loadenv /@/boot/device.hints } menuentry "FreeBSD (on $fstype $device) (verbose)" $device { set root=$2 freebsd /@/boot/kernel/kernel --verbose set FreeBSD.acpi_load=YES set FreeBSD.hint.acpi.0.disabled=0 freebsd_module_elf /@/boot/kernel/opensolaris.ko freebsd_module_elf /@/boot/kernel/zfs.ko freebsd_module /@/boot/zfs/zpool.cache type=/boot/zfs/zpool.cache probe -l -s name $root set FreeBSD.vfs.root.mountfrom=zfs:$name freebsd_loadenv /@/boot/device.hints } menuentry "FreeBSD (on $fstype $device) (without ACPI)" $device { set root=$2 freebsd /@/boot/kernel/kernel --verbose unset FreeBSD.acpi_load set FreeBSD.hint.acpi.0.disabled=1 set FreeBSD.loader.acpi_disabled_by_user=1 freebsd_module_elf /@/boot/kernel/opensolaris.ko freebsd_module_elf /@/boot/kernel/zfs.ko freebsd_module /@/boot/zfs/zpool.cache type=/boot/zfs/zpool.cache probe -l -s name $root set FreeBSD.vfs.root.mountfrom=zfs:$name freebsd_loadenv /@/boot/device.hints } menuentry "FreeBSD (on $fstype $device) (safe mode)" $device { set root=$2 freebsd /@/boot/kernel/kernel --verbose unset FreeBSD.acpi_load set FreeBSD.hint.acpi.0.disabled=1 set FreeBSD.loader.acpi_disabled_by_user=1 set FreeBSD.hint.apic.0.disabled=1 set FreeBSD.hw.ata.ata_dma=0 set FreeBSD.hw.ata.atapi_dma=0 set FreeBSD.hw.ata.wc=0 set FreeBSD.hw.eisa_slots=0 set FreeBSD.hint.kbdmux.0.disabled=1 freebsd_module_elf /@/boot/kernel/opensolaris.ko freebsd_module_elf /@/boot/kernel/zfs.ko freebsd_module /@/boot/zfs/zpool.cache type=/boot/zfs/zpool.cache probe -l -s name $root set FreeBSD.vfs.root.mountfrom=zfs:$name freebsd_loadenv /@/boot/device.hints } } insmod regexp for dev in (*); do # $device: parenthesis removed from $dev regexp -s device '\((.*)\)' $dev # $fstype: filesystem type identified probe -s fstype -f $dev # uuid: filesystem UUID probe -s uuid -u $dev if test -f ($device)/isolinux/isolinux.cfg ; then menuentry "ISOLINUX config (on $device)" $device { set root=$2 syslinux_configfile -i /isolinux/isolinux.cfg } fi if test -f ($device)/bootmgr -a -f ($device)/boot/bcd; then menuentry "Windows Vista bootmgr (on $device)" $device { set root=$2 chainloader +1 } elif test -f ($device)/ntldr -a \ -e ($device)/ntdetect.com -a -f ($device)/boot.ini; then menuentry "Windows NT/2000/XP loader (on $device)" $device { set root=$2 regexp -s devnum 'hd([0-9]+)' $root if test "$devnum" != "0"; then drivemap -s hd0 $root fi chainloader +1 } elif test -f ($device)/windows/win.com; then menuentry "Windows 98/ME (on $device)" $device { set root=$2 regexp -s devnum 'hd([0-9]+)' $root if test "$devnum" != "0"; then drivemap -s hd0 $root fi chainloader +1 } elif test -f ($device)/io.sys -a -f ($device)/command.com; then menuentry "MS-DOS (on $device)" $device { set root=$2 regexp -s devnum 'hd([0-9]+)' $root if test "$devnum" != "0"; then drivemap -s hd0 $root fi chainloader +1 } elif test -f ($device)/kernel.sys; then menuentry "FreeDOS (on $device)" $device { set root=$2 regexp -s type '([fh])d[0-9]+' $root regexp -s devnum '[fh]d([0-9]+)' $root if test $type = 'h' -a "$devnum" != "0"; then drivemap -s hd0 $root fi chainloader +1 } elif test "$fstype" = ufs1 -o "$fstype" = ufs2 -a \ -e ($device)/boot/kernel/kernel -a \ -e ($device)/boot/device.hints; then freebsd_ufs_variants $device $fstype $uuid elif test "$fstype" = zfs -a \ -e ($device)/@/boot/kernel/kernel -a \ -e ($device)/@/boot/device.hints; then freebsd_zfs_variants $device elif test "$fstype" = hfsplus -a -f ($device)/mach_kernel; then menuentry "Mac OS X/Darwin" $device $uuid { set root=$2 set uuid=$3 insmod vbe do_resume=0 if [ /var/vm/sleepimage -nt10 / ]; then if xnu_resume /var/vm/sleepimage; then do_resume=1 fi fi if [ $do_resume = 1 ]; then xnu_uuid $uuid uuid if [ -f /Extra/DSDT.aml ]; then acpi -e /Extra/DSDT.aml fi xnu_kernel /mach_kernel boot-uuid=${uuid} rd=*uuid if [ /System/Library/Extensions.mkext -nt /System/Library/Extensions ]; then xnu_mkext /System/Library/Extensions.mkext else xnu_mkext /System/Library/Extensions fi if [ -f /Extra/Extensions.mkext ]; then xnu_mkext /Extra/Extensions.mkext fi if [ -d /Extra/Extensions ]; then xnu_kextdir /Extra/Extensions fi if [ -f /Extra/devtree.txt ]; then xnu_devtree /Extra/devtree.txt fi if [ -f /Extra/splash.jpg ]; then insmod jpeg xnu_splash /Extra/splash.jpg fi if [ -f /Extra/splash.png ]; then insmod png xnu_splash /Extra/splash.png fi if [ -f /Extra/splash.tga ]; then insmod tga xnu_splash /Extra/splash.tga fi fi } else set root=$device for file in /boot/vmlinuz-* /boot/linux-*; do if test -f $file; then regexp -s version '/boot/vmlinuz-(.*)' $file regexp -s version '/boot/linux-(.*)' $file menuentry "Linux $file" $device $uuid $file $version { set root=$2 set uuid=$3 set kernel=$4 set version=$5 linux $kernel root=UUID=$uuid ro if test -f /boot/initrd-$version.img; then initrd /boot/initrd-$version.img elif test -f /boot/initrd.img-$version; then initrd /boot/initrd.img-$version elif test -f /boot/initrd-$version; then initrd /boot/initrd-$version fi } menuentry "Linux $file (single)" $device $uuid $file $version { set root=$2 set uuid=$3 set kernel=$4 set version=$5 linux $kernel root=UUID=$uuid ro single if test -f /boot/initrd-$version.img; then initrd /boot/initrd-$version.img elif test -f /boot/initrd.img-$version; then initrd /boot/initrd.img-$version elif test -f /boot/initrd-$version; then initrd /boot/initrd-$version fi } fi done fi done set root=$saved_root grub-2.14~git20250718.0e36779/Makefile.util.am0000644000175000017500000023012115036452442015012 00000000000000libgrubkern_a_SOURCES = nodist_libgrubkern_a_SOURCES = libgrubkern_a_CFLAGS = libgrubkern_a_CPPFLAGS = libgrubkern_a_CCASFLAGS = libgrubmods_a_SOURCES = nodist_libgrubmods_a_SOURCES = libgrubmods_a_CFLAGS = libgrubmods_a_CPPFLAGS = libgrubmods_a_CCASFLAGS = libgrubgcry_a_SOURCES = nodist_libgrubgcry_a_SOURCES = libgrubgcry_a_CFLAGS = libgrubgcry_a_CPPFLAGS = libgrubgcry_a_CCASFLAGS = noinst_LIBRARIES += libgrubkern.a libgrubkern_a_SOURCES += grub-core/commands/extcmd.c grub-core/disk/AFSplitter.c grub-core/disk/cryptodisk.c grub-core/disk/diskfilter.c grub-core/disk/geli.c grub-core/disk/key_protector.c grub-core/disk/ldm.c grub-core/disk/luks.c grub-core/disk/luks2.c grub-core/fs/archelp.c grub-core/fs/proc.c grub-core/kern/command.c grub-core/kern/device.c grub-core/kern/disk.c grub-core/kern/emu/hostdisk.c grub-core/kern/emu/misc.c grub-core/kern/emu/mm.c grub-core/kern/env.c grub-core/kern/err.c grub-core/kern/file.c grub-core/kern/fs.c grub-core/kern/list.c grub-core/kern/misc.c grub-core/kern/partition.c grub-core/lib/arg.c grub-core/lib/crypto.c grub-core/lib/disk.c grub-core/lib/json/json.c grub-core/lib/pbkdf2.c grub-core/osdep/devmapper/getroot.c grub-core/osdep/devmapper/hostdisk.c grub-core/osdep/exec.c grub-core/osdep/getroot.c grub-core/osdep/hostdisk.c grub-core/osdep/password.c grub-core/osdep/relpath.c grub-core/osdep/sleep.c grub-core/osdep/unix/getroot.c grub-core/osdep/unix/hostdisk.c grub-core/partmap/gpt.c grub-core/partmap/msdos.c util/getroot.c util/misc.c nodist_libgrubkern_a_SOURCES += libgrubkern_a_CFLAGS += $(AM_CFLAGS) $(CFLAGS_LIBRARY) $(CFLAGS_GNULIB) libgrubkern_a_CPPFLAGS += $(AM_CPPFLAGS) $(CPPFLAGS_LIBRARY) $(CPPFLAGS_GNULIB) -I$(srcdir)/grub-core/lib/json libgrubkern_a_CCASFLAGS += $(AM_CCASFLAGS) $(CCASFLAGS_LIBRARY) dist_noinst_DATA += grub-core/kern/disk_common.c grub-core/osdep/unix/relpath.c grub-core/osdep/aros/relpath.c grub-core/osdep/windows/relpath.c BUILT_SOURCES += $(nodist_libgrubkern_a_SOURCES) CLEANFILES += $(nodist_libgrubkern_a_SOURCES) noinst_LIBRARIES += libgrubmods.a libgrubmods_a_SOURCES += grub-core/commands/blocklist.c grub-core/commands/ls.c grub-core/commands/macbless.c grub-core/commands/testload.c grub-core/commands/xnu_uuid.c grub-core/disk/dmraid_nvidia.c grub-core/disk/loopback.c grub-core/disk/lvm.c grub-core/disk/mdraid1x_linux.c grub-core/disk/mdraid_linux.c grub-core/disk/mdraid_linux_be.c grub-core/disk/raid5_recover.c grub-core/disk/raid6_recover.c grub-core/font/font.c grub-core/fs/affs.c grub-core/fs/afs.c grub-core/fs/bfs.c grub-core/fs/btrfs.c grub-core/fs/cbfs.c grub-core/fs/cpio.c grub-core/fs/cpio_be.c grub-core/fs/erofs.c grub-core/fs/exfat.c grub-core/fs/ext2.c grub-core/fs/f2fs.c grub-core/fs/fat.c grub-core/fs/fshelp.c grub-core/fs/hfs.c grub-core/fs/hfsplus.c grub-core/fs/hfspluscomp.c grub-core/fs/iso9660.c grub-core/fs/jfs.c grub-core/fs/minix.c grub-core/fs/minix2.c grub-core/fs/minix2_be.c grub-core/fs/minix3.c grub-core/fs/minix3_be.c grub-core/fs/minix_be.c grub-core/fs/newc.c grub-core/fs/nilfs2.c grub-core/fs/ntfs.c grub-core/fs/ntfscomp.c grub-core/fs/odc.c grub-core/fs/reiserfs.c grub-core/fs/romfs.c grub-core/fs/sfs.c grub-core/fs/squash4.c grub-core/fs/tar.c grub-core/fs/udf.c grub-core/fs/ufs.c grub-core/fs/ufs2.c grub-core/fs/ufs_be.c grub-core/fs/xfs.c grub-core/fs/zfs/zfs.c grub-core/fs/zfs/zfs_fletcher.c grub-core/fs/zfs/zfs_lz4.c grub-core/fs/zfs/zfs_lzjb.c grub-core/fs/zfs/zfs_sha256.c grub-core/fs/zfs/zfscrypt.c grub-core/fs/zfs/zfsinfo.c grub-core/gfxmenu/font.c grub-core/io/bufio.c grub-core/io/gzio.c grub-core/io/lzopio.c grub-core/io/xzio.c grub-core/kern/arm/dl_helper.c grub-core/kern/arm64/dl_helper.c grub-core/kern/ia64/dl_helper.c grub-core/kern/loongarch64/dl_helper.c grub-core/lib/LzFind.c grub-core/lib/LzmaEnc.c grub-core/lib/adler32.c grub-core/lib/crc.c grub-core/lib/crc64.c grub-core/lib/datetime.c grub-core/lib/envblk.c grub-core/lib/hexdump.c grub-core/lib/minilzo/minilzo.c grub-core/lib/xzembed/xz_dec_bcj.c grub-core/lib/xzembed/xz_dec_lzma2.c grub-core/lib/xzembed/xz_dec_stream.c grub-core/lib/zstd/debug.c grub-core/lib/zstd/entropy_common.c grub-core/lib/zstd/error_private.c grub-core/lib/zstd/fse_decompress.c grub-core/lib/zstd/huf_decompress.c grub-core/lib/zstd/module.c grub-core/lib/zstd/xxhash.c grub-core/lib/zstd/zstd_common.c grub-core/lib/zstd/zstd_decompress.c grub-core/normal/charset.c grub-core/normal/misc.c grub-core/partmap/acorn.c grub-core/partmap/amiga.c grub-core/partmap/apple.c grub-core/partmap/bsdlabel.c grub-core/partmap/dfly.c grub-core/partmap/dvh.c grub-core/partmap/plan.c grub-core/partmap/sun.c grub-core/partmap/sunpc.c grub-core/script/argv.c grub-core/script/function.c grub-core/script/lexer.c grub-core/script/main.c grub-core/script/script.c grub-core/unidata.c grub-core/video/capture.c grub-core/video/colors.c grub-core/video/fb/fbblit.c grub-core/video/fb/fbfill.c grub-core/video/fb/fbutil.c grub-core/video/fb/video_fb.c grub-core/video/video.c nodist_libgrubmods_a_SOURCES += grub_script.tab.c grub_script.tab.h grub_script.yy.c grub_script.yy.h libgrub_a_init.c libgrubmods_a_CFLAGS += $(AM_CFLAGS) $(CFLAGS_LIBRARY) -fno-builtin -Wno-undef -Wno-unused-but-set-variable libgrubmods_a_CPPFLAGS += $(AM_CPPFLAGS) $(CPPFLAGS_LIBRARY) -I$(srcdir)/grub-core/lib/minilzo -I$(srcdir)/grub-core/lib/xzembed -I$(srcdir)/grub-core/lib/zstd -DMINILZO_HAVE_CONFIG_H libgrubmods_a_CCASFLAGS += $(AM_CCASFLAGS) $(CCASFLAGS_LIBRARY) dist_noinst_DATA += BUILT_SOURCES += $(nodist_libgrubmods_a_SOURCES) CLEANFILES += $(nodist_libgrubmods_a_SOURCES) noinst_LIBRARIES += libgrubgcry.a libgrubgcry_a_SOURCES += grub-core/lib/libgcrypt-grub/cipher/arcfour.c grub-core/lib/libgcrypt-grub/cipher/aria.c grub-core/lib/libgcrypt-grub/cipher/blake2.c grub-core/lib/libgcrypt-grub/cipher/blowfish.c grub-core/lib/libgcrypt-grub/cipher/camellia-glue.c grub-core/lib/libgcrypt-grub/cipher/camellia.c grub-core/lib/libgcrypt-grub/cipher/cast5.c grub-core/lib/libgcrypt-grub/cipher/crc.c grub-core/lib/libgcrypt-grub/cipher/des.c grub-core/lib/libgcrypt-grub/cipher/gost28147.c grub-core/lib/libgcrypt-grub/cipher/gostr3411-94.c grub-core/lib/libgcrypt-grub/cipher/hash-common.c grub-core/lib/libgcrypt-grub/cipher/idea.c grub-core/lib/libgcrypt-grub/cipher/init.c grub-core/lib/libgcrypt-grub/cipher/keccak.c grub-core/lib/libgcrypt-grub/cipher/md4.c grub-core/lib/libgcrypt-grub/cipher/md5.c grub-core/lib/libgcrypt-grub/cipher/rfc2268.c grub-core/lib/libgcrypt-grub/cipher/rijndael.c grub-core/lib/libgcrypt-grub/cipher/rmd160.c grub-core/lib/libgcrypt-grub/cipher/salsa20.c grub-core/lib/libgcrypt-grub/cipher/seed.c grub-core/lib/libgcrypt-grub/cipher/serpent.c grub-core/lib/libgcrypt-grub/cipher/sha1.c grub-core/lib/libgcrypt-grub/cipher/sha256.c grub-core/lib/libgcrypt-grub/cipher/sha512.c grub-core/lib/libgcrypt-grub/cipher/sm3.c grub-core/lib/libgcrypt-grub/cipher/sm4.c grub-core/lib/libgcrypt-grub/cipher/stribog.c grub-core/lib/libgcrypt-grub/cipher/tiger.c grub-core/lib/libgcrypt-grub/cipher/twofish.c grub-core/lib/libgcrypt-grub/cipher/whirlpool.c grub-core/lib/libgcrypt-grub/src/const-time.c nodist_libgrubgcry_a_SOURCES += libgrubgcry_a_CFLAGS += $(AM_CFLAGS) $(CFLAGS_LIBRARY) $(CFLAGS_GCRY) libgrubgcry_a_CPPFLAGS += $(AM_CPPFLAGS) $(CPPFLAGS_LIBRARY) $(CPPFLAGS_GCRY) libgrubgcry_a_CCASFLAGS += $(AM_CCASFLAGS) $(CCASFLAGS_LIBRARY) dist_noinst_DATA += grub-core/lib/libgcrypt-grub/cipher/ChangeLog BUILT_SOURCES += $(nodist_libgrubgcry_a_SOURCES) CLEANFILES += $(nodist_libgrubgcry_a_SOURCES) bin_PROGRAMS += grub-mkimage if COND_MAN_PAGES man_MANS += grub-mkimage.1 grub-mkimage.1: grub-mkimage chmod a+x grub-mkimage PATH=$(builddir):$$PATH pkgdatadir=$(builddir) $(HELP2MAN) --section=1 -i $(top_srcdir)/docs/man/grub-mkimage.h2m -o $@ grub-mkimage CLEANFILES += grub-mkimage.1 endif grub_mkimage_SOURCES = grub-core/kern/emu/argp_common.c grub-core/osdep/config.c grub-core/osdep/init.c util/config.c util/grub-mkimage.c util/grub-mkimage32.c util/grub-mkimage64.c util/mkimage.c util/resolve.c nodist_grub_mkimage_SOURCES = grub_mkimage_LDADD = libgrubmods.a libgrubgcry.a libgrubkern.a grub-core/lib/gnulib/libgnu.a $(LIBLZMA) $(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM) grub_mkimage_CFLAGS = $(AM_CFLAGS) $(CFLAGS_PROGRAM) grub_mkimage_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_PROGRAM) grub_mkimage_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS_PROGRAM) grub_mkimage_CCASFLAGS = $(AM_CCASFLAGS) $(CCASFLAGS_PROGRAM) dist_noinst_DATA += grub-core/osdep/aros/config.c grub-core/osdep/windows/config.c grub-core/osdep/unix/config.c util/grub-mkimagexx.c BUILT_SOURCES += $(nodist_grub_mkimage_SOURCES) CLEANFILES += $(nodist_grub_mkimage_SOURCES) if COND_GRUB_PROTECT bin_PROGRAMS += grub-protect if COND_MAN_PAGES man_MANS += grub-protect.1 grub-protect.1: grub-protect chmod a+x grub-protect PATH=$(builddir):$$PATH pkgdatadir=$(builddir) $(HELP2MAN) --section=1 -i $(top_srcdir)/docs/man/grub-protect.h2m -o $@ grub-protect CLEANFILES += grub-protect.1 endif grub_protect_SOURCES = grub-core/commands/tpm2_key_protector/args.c grub-core/commands/tpm2_key_protector/tpm2key_asn1_tab.c grub-core/kern/emu/argp_common.c grub-core/lib/tss2/buffer.c grub-core/lib/tss2/tpm2_cmd.c grub-core/lib/tss2/tss2_mu.c grub-core/osdep/init.c util/grub-protect.c util/probe.c nodist_grub_protect_SOURCES = grub_protect_LDADD = libgrubmods.a libgrubgcry.a libgrubkern.a grub-core/lib/gnulib/libgnu.a $(LIBTASN1) $(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM) grub_protect_CFLAGS = $(AM_CFLAGS) $(CFLAGS_PROGRAM) -I$(srcdir)/grub-core/lib/tss2 -I$(srcdir)/grub-core/commands/tpm2_key_protector grub_protect_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_PROGRAM) grub_protect_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS_PROGRAM) grub_protect_CCASFLAGS = $(AM_CCASFLAGS) $(CCASFLAGS_PROGRAM) dist_noinst_DATA += BUILT_SOURCES += $(nodist_grub_protect_SOURCES) CLEANFILES += $(nodist_grub_protect_SOURCES) endif COND_GRUB_PROTECT bin_PROGRAMS += grub-mkrelpath if COND_MAN_PAGES man_MANS += grub-mkrelpath.1 grub-mkrelpath.1: grub-mkrelpath chmod a+x grub-mkrelpath PATH=$(builddir):$$PATH pkgdatadir=$(builddir) $(HELP2MAN) --section=1 -i $(top_srcdir)/docs/man/grub-mkrelpath.h2m -o $@ grub-mkrelpath CLEANFILES += grub-mkrelpath.1 endif grub_mkrelpath_SOURCES = grub-core/kern/emu/argp_common.c grub-core/osdep/init.c util/grub-mkrelpath.c nodist_grub_mkrelpath_SOURCES = grub_mkrelpath_LDADD = libgrubmods.a libgrubgcry.a libgrubkern.a grub-core/lib/gnulib/libgnu.a $(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM) grub_mkrelpath_CFLAGS = $(AM_CFLAGS) $(CFLAGS_PROGRAM) grub_mkrelpath_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_PROGRAM) grub_mkrelpath_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS_PROGRAM) grub_mkrelpath_CCASFLAGS = $(AM_CCASFLAGS) $(CCASFLAGS_PROGRAM) dist_noinst_DATA += BUILT_SOURCES += $(nodist_grub_mkrelpath_SOURCES) CLEANFILES += $(nodist_grub_mkrelpath_SOURCES) bin_PROGRAMS += grub-script-check if COND_MAN_PAGES man_MANS += grub-script-check.1 grub-script-check.1: grub-script-check chmod a+x grub-script-check PATH=$(builddir):$$PATH pkgdatadir=$(builddir) $(HELP2MAN) --section=1 -i $(top_srcdir)/docs/man/grub-script-check.h2m -o $@ grub-script-check CLEANFILES += grub-script-check.1 endif grub_script_check_SOURCES = grub-core/kern/emu/argp_common.c grub-core/osdep/init.c util/grub-script-check.c nodist_grub_script_check_SOURCES = grub_script_check_LDADD = libgrubmods.a libgrubgcry.a libgrubkern.a grub-core/lib/gnulib/libgnu.a $(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM) grub_script_check_CFLAGS = $(AM_CFLAGS) $(CFLAGS_PROGRAM) grub_script_check_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_PROGRAM) grub_script_check_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS_PROGRAM) grub_script_check_CCASFLAGS = $(AM_CCASFLAGS) $(CCASFLAGS_PROGRAM) dist_noinst_DATA += BUILT_SOURCES += $(nodist_grub_script_check_SOURCES) CLEANFILES += $(nodist_grub_script_check_SOURCES) bin_PROGRAMS += grub-editenv if COND_MAN_PAGES man_MANS += grub-editenv.1 grub-editenv.1: grub-editenv chmod a+x grub-editenv PATH=$(builddir):$$PATH pkgdatadir=$(builddir) $(HELP2MAN) --section=1 -i $(top_srcdir)/docs/man/grub-editenv.h2m -o $@ grub-editenv CLEANFILES += grub-editenv.1 endif grub_editenv_SOURCES = grub-core/osdep/compress.c grub-core/osdep/config.c grub-core/osdep/init.c util/config.c util/editenv.c util/grub-editenv.c util/grub-install-common.c util/grub-mkimage32.c util/grub-mkimage64.c util/mkimage.c util/resolve.c nodist_grub_editenv_SOURCES = grub_editenv_LDADD = $(LIBLZMA) libgrubmods.a libgrubgcry.a libgrubkern.a grub-core/lib/gnulib/libgnu.a $(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM) grub_editenv_CFLAGS = $(AM_CFLAGS) $(CFLAGS_PROGRAM) grub_editenv_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_PROGRAM) grub_editenv_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS_PROGRAM) grub_editenv_CCASFLAGS = $(AM_CCASFLAGS) $(CCASFLAGS_PROGRAM) dist_noinst_DATA += grub-core/osdep/unix/compress.c grub-core/osdep/basic/compress.c BUILT_SOURCES += $(nodist_grub_editenv_SOURCES) CLEANFILES += $(nodist_grub_editenv_SOURCES) bin_PROGRAMS += grub-mkpasswd-pbkdf2 if COND_MAN_PAGES man_MANS += grub-mkpasswd-pbkdf2.1 grub-mkpasswd-pbkdf2.1: grub-mkpasswd-pbkdf2 chmod a+x grub-mkpasswd-pbkdf2 PATH=$(builddir):$$PATH pkgdatadir=$(builddir) $(HELP2MAN) --section=1 -i $(top_srcdir)/docs/man/grub-mkpasswd-pbkdf2.h2m -o $@ grub-mkpasswd-pbkdf2 CLEANFILES += grub-mkpasswd-pbkdf2.1 endif grub_mkpasswd_pbkdf2_SOURCES = grub-core/kern/emu/argp_common.c grub-core/osdep/init.c grub-core/osdep/random.c util/grub-mkpasswd-pbkdf2.c nodist_grub_mkpasswd_pbkdf2_SOURCES = grub_mkpasswd_pbkdf2_LDADD = libgrubmods.a libgrubgcry.a libgrubkern.a grub-core/lib/gnulib/libgnu.a $(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM) grub_mkpasswd_pbkdf2_CFLAGS = $(AM_CFLAGS) $(CFLAGS_PROGRAM) grub_mkpasswd_pbkdf2_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_PROGRAM) grub_mkpasswd_pbkdf2_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS_PROGRAM) grub_mkpasswd_pbkdf2_CCASFLAGS = $(AM_CCASFLAGS) $(CCASFLAGS_PROGRAM) dist_noinst_DATA += BUILT_SOURCES += $(nodist_grub_mkpasswd_pbkdf2_SOURCES) CLEANFILES += $(nodist_grub_mkpasswd_pbkdf2_SOURCES) if COND_APPLE_LINKER bin_PROGRAMS += grub-macho2img if COND_MAN_PAGES man_MANS += grub-macho2img.1 grub-macho2img.1: grub-macho2img chmod a+x grub-macho2img PATH=$(builddir):$$PATH pkgdatadir=$(builddir) $(HELP2MAN) --section=1 -i $(top_srcdir)/docs/man/grub-macho2img.h2m -o $@ grub-macho2img CLEANFILES += grub-macho2img.1 endif grub_macho2img_SOURCES = util/grub-macho2img.c nodist_grub_macho2img_SOURCES = grub_macho2img_LDADD = grub_macho2img_CFLAGS = $(AM_CFLAGS) $(CFLAGS_PROGRAM) grub_macho2img_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_PROGRAM) grub_macho2img_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS_PROGRAM) grub_macho2img_CCASFLAGS = $(AM_CCASFLAGS) $(CCASFLAGS_PROGRAM) dist_noinst_DATA += BUILT_SOURCES += $(nodist_grub_macho2img_SOURCES) CLEANFILES += $(nodist_grub_macho2img_SOURCES) endif COND_APPLE_LINKER bin_PROGRAMS += grub-fstest if COND_MAN_PAGES man_MANS += grub-fstest.1 grub-fstest.1: grub-fstest chmod a+x grub-fstest PATH=$(builddir):$$PATH pkgdatadir=$(builddir) $(HELP2MAN) --section=1 -i $(top_srcdir)/docs/man/grub-fstest.h2m -o $@ grub-fstest CLEANFILES += grub-fstest.1 endif grub_fstest_SOURCES = grub-core/disk/host.c grub-core/kern/emu/hostfs.c grub-core/osdep/init.c util/grub-fstest.c nodist_grub_fstest_SOURCES = grub_fstest_init.c grub_fstest_LDADD = libgrubmods.a libgrubgcry.a libgrubkern.a grub-core/lib/gnulib/libgnu.a $(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM) grub_fstest_CFLAGS = $(AM_CFLAGS) $(CFLAGS_PROGRAM) grub_fstest_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_PROGRAM) grub_fstest_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS_PROGRAM) grub_fstest_CCASFLAGS = $(AM_CCASFLAGS) $(CCASFLAGS_PROGRAM) dist_noinst_DATA += BUILT_SOURCES += $(nodist_grub_fstest_SOURCES) CLEANFILES += $(nodist_grub_fstest_SOURCES) if COND_GRUB_MOUNT bin_PROGRAMS += grub-mount if COND_MAN_PAGES man_MANS += grub-mount.1 grub-mount.1: grub-mount chmod a+x grub-mount PATH=$(builddir):$$PATH pkgdatadir=$(builddir) $(HELP2MAN) --section=1 -i $(top_srcdir)/docs/man/grub-mount.h2m -o $@ grub-mount CLEANFILES += grub-mount.1 endif grub_mount_SOURCES = grub-core/disk/host.c grub-core/kern/emu/hostfs.c grub-core/osdep/init.c util/grub-mount.c nodist_grub_mount_SOURCES = grub_fstest_init.c grub_mount_LDADD = libgrubmods.a libgrubgcry.a libgrubkern.a grub-core/lib/gnulib/libgnu.a $(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM) $(FUSE_LIBS) grub_mount_CFLAGS = $(AM_CFLAGS) $(CFLAGS_PROGRAM) $(FUSE_CFLAGS) grub_mount_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_PROGRAM) grub_mount_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS_PROGRAM) grub_mount_CCASFLAGS = $(AM_CCASFLAGS) $(CCASFLAGS_PROGRAM) dist_noinst_DATA += BUILT_SOURCES += $(nodist_grub_mount_SOURCES) CLEANFILES += $(nodist_grub_mount_SOURCES) endif COND_GRUB_MOUNT if COND_GRUB_MKFONT bin_PROGRAMS += grub-mkfont if COND_MAN_PAGES man_MANS += grub-mkfont.1 grub-mkfont.1: grub-mkfont chmod a+x grub-mkfont PATH=$(builddir):$$PATH pkgdatadir=$(builddir) $(HELP2MAN) --section=1 -i $(top_srcdir)/docs/man/grub-mkfont.h2m -o $@ grub-mkfont CLEANFILES += grub-mkfont.1 endif grub_mkfont_SOURCES = grub-core/kern/emu/argp_common.c grub-core/osdep/init.c util/grub-mkfont.c nodist_grub_mkfont_SOURCES = grub_mkfont_LDADD = libgrubmods.a libgrubgcry.a libgrubkern.a grub-core/lib/gnulib/libgnu.a $(FREETYPE_LIBS) $(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM) grub_mkfont_CFLAGS = $(AM_CFLAGS) $(CFLAGS_PROGRAM) $(FREETYPE_CFLAGS) grub_mkfont_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_PROGRAM) grub_mkfont_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS_PROGRAM) -DGRUB_MKFONT=1 grub_mkfont_CCASFLAGS = $(AM_CCASFLAGS) $(CCASFLAGS_PROGRAM) dist_noinst_DATA += BUILT_SOURCES += $(nodist_grub_mkfont_SOURCES) CLEANFILES += $(nodist_grub_mkfont_SOURCES) endif COND_GRUB_MKFONT sbin_PROGRAMS += grub-probe if COND_MAN_PAGES man_MANS += grub-probe.8 grub-probe.8: grub-probe chmod a+x grub-probe PATH=$(builddir):$$PATH pkgdatadir=$(builddir) $(HELP2MAN) --section=8 -i $(top_srcdir)/docs/man/grub-probe.h2m -o $@ grub-probe CLEANFILES += grub-probe.8 endif grub_probe_SOURCES = grub-core/kern/emu/argp_common.c grub-core/osdep/init.c grub-core/osdep/ofpath.c util/grub-probe.c util/probe.c nodist_grub_probe_SOURCES = grub_probe_LDADD = libgrubmods.a libgrubgcry.a libgrubkern.a grub-core/lib/gnulib/libgnu.a $(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM) grub_probe_CFLAGS = $(AM_CFLAGS) $(CFLAGS_PROGRAM) grub_probe_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_PROGRAM) grub_probe_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS_PROGRAM) grub_probe_CCASFLAGS = $(AM_CCASFLAGS) $(CCASFLAGS_PROGRAM) dist_noinst_DATA += BUILT_SOURCES += $(nodist_grub_probe_SOURCES) CLEANFILES += $(nodist_grub_probe_SOURCES) sbin_PROGRAMS += grub-bios-setup if COND_MAN_PAGES man_MANS += grub-bios-setup.8 grub-bios-setup.8: grub-bios-setup chmod a+x grub-bios-setup PATH=$(builddir):$$PATH pkgdatadir=$(builddir) $(HELP2MAN) --section=8 -i $(top_srcdir)/docs/man/grub-bios-setup.h2m -o $@ grub-bios-setup CLEANFILES += grub-bios-setup.8 endif grub_bios_setup_SOURCES = grub-core/kern/emu/argp_common.c grub-core/lib/reed_solomon.c grub-core/osdep/blocklist.c grub-core/osdep/init.c util/grub-setup.c util/setup_bios.c nodist_grub_bios_setup_SOURCES = grub_bios_setup_LDADD = libgrubmods.a libgrubkern.a libgrubgcry.a grub-core/lib/gnulib/libgnu.a $(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM) grub_bios_setup_CFLAGS = $(AM_CFLAGS) $(CFLAGS_PROGRAM) grub_bios_setup_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_PROGRAM) grub_bios_setup_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS_PROGRAM) -DGRUB_SETUP_FUNC=grub_util_bios_setup grub_bios_setup_CCASFLAGS = $(AM_CCASFLAGS) $(CCASFLAGS_PROGRAM) dist_noinst_DATA += util/setup.c grub-core/osdep/generic/blocklist.c grub-core/osdep/linux/blocklist.c grub-core/osdep/windows/blocklist.c BUILT_SOURCES += $(nodist_grub_bios_setup_SOURCES) CLEANFILES += $(nodist_grub_bios_setup_SOURCES) sbin_PROGRAMS += grub-sparc64-setup if COND_MAN_PAGES man_MANS += grub-sparc64-setup.8 grub-sparc64-setup.8: grub-sparc64-setup chmod a+x grub-sparc64-setup PATH=$(builddir):$$PATH pkgdatadir=$(builddir) $(HELP2MAN) --section=8 -i $(top_srcdir)/docs/man/grub-sparc64-setup.h2m -o $@ grub-sparc64-setup CLEANFILES += grub-sparc64-setup.8 endif grub_sparc64_setup_SOURCES = grub-core/kern/emu/argp_common.c grub-core/lib/reed_solomon.c grub-core/osdep/blocklist.c grub-core/osdep/init.c grub-core/osdep/ofpath.c util/grub-setup.c util/setup_sparc.c nodist_grub_sparc64_setup_SOURCES = grub_sparc64_setup_LDADD = libgrubmods.a libgrubkern.a libgrubgcry.a grub-core/lib/gnulib/libgnu.a $(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM) grub_sparc64_setup_CFLAGS = $(AM_CFLAGS) $(CFLAGS_PROGRAM) grub_sparc64_setup_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_PROGRAM) grub_sparc64_setup_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS_PROGRAM) -DGRUB_SETUP_FUNC=grub_util_sparc_setup grub_sparc64_setup_CCASFLAGS = $(AM_CCASFLAGS) $(CCASFLAGS_PROGRAM) dist_noinst_DATA += BUILT_SOURCES += $(nodist_grub_sparc64_setup_SOURCES) CLEANFILES += $(nodist_grub_sparc64_setup_SOURCES) sbin_PROGRAMS += grub-ofpathname if COND_MAN_PAGES man_MANS += grub-ofpathname.8 grub-ofpathname.8: grub-ofpathname chmod a+x grub-ofpathname PATH=$(builddir):$$PATH pkgdatadir=$(builddir) $(HELP2MAN) --section=8 -i $(top_srcdir)/docs/man/grub-ofpathname.h2m -o $@ grub-ofpathname CLEANFILES += grub-ofpathname.8 endif grub_ofpathname_SOURCES = grub-core/osdep/init.c grub-core/osdep/ofpath.c util/ieee1275/grub-ofpathname.c nodist_grub_ofpathname_SOURCES = grub_ofpathname_LDADD = libgrubmods.a libgrubgcry.a libgrubkern.a grub-core/lib/gnulib/libgnu.a $(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM) grub_ofpathname_CFLAGS = $(AM_CFLAGS) $(CFLAGS_PROGRAM) grub_ofpathname_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_PROGRAM) grub_ofpathname_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS_PROGRAM) grub_ofpathname_CCASFLAGS = $(AM_CCASFLAGS) $(CCASFLAGS_PROGRAM) dist_noinst_DATA += BUILT_SOURCES += $(nodist_grub_ofpathname_SOURCES) CLEANFILES += $(nodist_grub_ofpathname_SOURCES) bin_PROGRAMS += grub-mklayout if COND_MAN_PAGES man_MANS += grub-mklayout.1 grub-mklayout.1: grub-mklayout chmod a+x grub-mklayout PATH=$(builddir):$$PATH pkgdatadir=$(builddir) $(HELP2MAN) --section=1 -i $(top_srcdir)/docs/man/grub-mklayout.h2m -o $@ grub-mklayout CLEANFILES += grub-mklayout.1 endif grub_mklayout_SOURCES = grub-core/kern/emu/argp_common.c grub-core/osdep/init.c util/grub-mklayout.c nodist_grub_mklayout_SOURCES = grub_mklayout_LDADD = libgrubmods.a libgrubgcry.a libgrubkern.a grub-core/lib/gnulib/libgnu.a $(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM) grub_mklayout_CFLAGS = $(AM_CFLAGS) $(CFLAGS_PROGRAM) grub_mklayout_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_PROGRAM) grub_mklayout_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS_PROGRAM) grub_mklayout_CCASFLAGS = $(AM_CCASFLAGS) $(CCASFLAGS_PROGRAM) dist_noinst_DATA += BUILT_SOURCES += $(nodist_grub_mklayout_SOURCES) CLEANFILES += $(nodist_grub_mklayout_SOURCES) sbin_PROGRAMS += grub-macbless if COND_MAN_PAGES man_MANS += grub-macbless.8 grub-macbless.8: grub-macbless chmod a+x grub-macbless PATH=$(builddir):$$PATH pkgdatadir=$(builddir) $(HELP2MAN) --section=8 -i $(top_srcdir)/docs/man/grub-macbless.h2m -o $@ grub-macbless CLEANFILES += grub-macbless.8 endif grub_macbless_SOURCES = grub-core/kern/emu/argp_common.c grub-core/osdep/init.c util/grub-macbless.c nodist_grub_macbless_SOURCES = grub_macbless_LDADD = libgrubmods.a libgrubgcry.a libgrubkern.a grub-core/lib/gnulib/libgnu.a $(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM) grub_macbless_CFLAGS = $(AM_CFLAGS) $(CFLAGS_PROGRAM) grub_macbless_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_PROGRAM) grub_macbless_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS_PROGRAM) grub_macbless_CCASFLAGS = $(AM_CCASFLAGS) $(CCASFLAGS_PROGRAM) dist_noinst_DATA += BUILT_SOURCES += $(nodist_grub_macbless_SOURCES) CLEANFILES += $(nodist_grub_macbless_SOURCES) if COND_HAVE_EXEC bin_PROGRAMS += grub-mkrescue if COND_MAN_PAGES man_MANS += grub-mkrescue.1 grub-mkrescue.1: grub-mkrescue chmod a+x grub-mkrescue PATH=$(builddir):$$PATH pkgdatadir=$(builddir) $(HELP2MAN) --section=1 -i $(top_srcdir)/docs/man/grub-mkrescue.h2m -o $@ grub-mkrescue CLEANFILES += grub-mkrescue.1 endif grub_mkrescue_SOURCES = grub-core/disk/host.c grub-core/kern/emu/argp_common.c grub-core/kern/emu/hostfs.c grub-core/lib/reed_solomon.c grub-core/osdep/blocklist.c grub-core/osdep/compress.c grub-core/osdep/config.c grub-core/osdep/init.c grub-core/osdep/ofpath.c grub-core/osdep/platform.c grub-core/osdep/platform_unix.c grub-core/osdep/random.c util/config.c util/editenv.c util/glue-efi.c util/grub-install-common.c util/grub-mkimage32.c util/grub-mkimage64.c util/grub-mkrescue.c util/mkimage.c util/render-label.c util/resolve.c util/setup_bios.c util/setup_sparc.c nodist_grub_mkrescue_SOURCES = grub_mkrescue_LDADD = $(LIBLZMA) libgrubmods.a libgrubgcry.a libgrubkern.a grub-core/lib/gnulib/libgnu.a $(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM) grub_mkrescue_CFLAGS = $(AM_CFLAGS) $(CFLAGS_PROGRAM) grub_mkrescue_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_PROGRAM) grub_mkrescue_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS_PROGRAM) grub_mkrescue_CCASFLAGS = $(AM_CCASFLAGS) $(CCASFLAGS_PROGRAM) dist_noinst_DATA += grub-core/osdep/unix/compress.c grub-core/osdep/basic/compress.c BUILT_SOURCES += $(nodist_grub_mkrescue_SOURCES) CLEANFILES += $(nodist_grub_mkrescue_SOURCES) endif COND_HAVE_EXEC bin_PROGRAMS += grub-mkstandalone if COND_MAN_PAGES man_MANS += grub-mkstandalone.1 grub-mkstandalone.1: grub-mkstandalone chmod a+x grub-mkstandalone PATH=$(builddir):$$PATH pkgdatadir=$(builddir) $(HELP2MAN) --section=1 -i $(top_srcdir)/docs/man/grub-mkstandalone.h2m -o $@ grub-mkstandalone CLEANFILES += grub-mkstandalone.1 endif grub_mkstandalone_SOURCES = grub-core/disk/host.c grub-core/kern/emu/argp_common.c grub-core/kern/emu/hostfs.c grub-core/lib/reed_solomon.c grub-core/osdep/blocklist.c grub-core/osdep/compress.c grub-core/osdep/config.c grub-core/osdep/init.c grub-core/osdep/ofpath.c grub-core/osdep/platform.c grub-core/osdep/platform_unix.c grub-core/osdep/random.c util/config.c util/editenv.c util/glue-efi.c util/grub-install-common.c util/grub-mkimage32.c util/grub-mkimage64.c util/grub-mkstandalone.c util/mkimage.c util/render-label.c util/resolve.c util/setup_bios.c util/setup_sparc.c nodist_grub_mkstandalone_SOURCES = grub_mkstandalone_LDADD = $(LIBLZMA) libgrubmods.a libgrubgcry.a libgrubkern.a grub-core/lib/gnulib/libgnu.a $(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM) grub_mkstandalone_CFLAGS = $(AM_CFLAGS) $(CFLAGS_PROGRAM) grub_mkstandalone_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_PROGRAM) grub_mkstandalone_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS_PROGRAM) grub_mkstandalone_CCASFLAGS = $(AM_CCASFLAGS) $(CCASFLAGS_PROGRAM) dist_noinst_DATA += grub-core/osdep/linux/platform.c grub-core/osdep/windows/platform.c grub-core/osdep/basic/platform.c grub-core/osdep/basic/no_platform.c grub-core/osdep/unix/platform.c BUILT_SOURCES += $(nodist_grub_mkstandalone_SOURCES) CLEANFILES += $(nodist_grub_mkstandalone_SOURCES) sbin_PROGRAMS += grub-install if COND_MAN_PAGES man_MANS += grub-install.8 grub-install.8: grub-install chmod a+x grub-install PATH=$(builddir):$$PATH pkgdatadir=$(builddir) $(HELP2MAN) --section=8 -i $(top_srcdir)/docs/man/grub-install.h2m -o $@ grub-install CLEANFILES += grub-install.8 endif grub_install_SOURCES = grub-core/disk/host.c grub-core/kern/emu/argp_common.c grub-core/kern/emu/hostfs.c grub-core/lib/reed_solomon.c grub-core/osdep/blocklist.c grub-core/osdep/compress.c grub-core/osdep/config.c grub-core/osdep/init.c grub-core/osdep/ofpath.c grub-core/osdep/platform.c grub-core/osdep/platform_unix.c grub-core/osdep/random.c util/config.c util/editenv.c util/grub-install-common.c util/grub-install.c util/grub-mkimage32.c util/grub-mkimage64.c util/mkimage.c util/probe.c util/render-label.c util/resolve.c util/setup_bios.c util/setup_sparc.c nodist_grub_install_SOURCES = grub_install_LDADD = $(LIBLZMA) libgrubmods.a libgrubgcry.a libgrubkern.a grub-core/lib/gnulib/libgnu.a $(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM) grub_install_CFLAGS = $(AM_CFLAGS) $(CFLAGS_PROGRAM) grub_install_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_PROGRAM) grub_install_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS_PROGRAM) grub_install_CCASFLAGS = $(AM_CCASFLAGS) $(CCASFLAGS_PROGRAM) dist_noinst_DATA += BUILT_SOURCES += $(nodist_grub_install_SOURCES) CLEANFILES += $(nodist_grub_install_SOURCES) bin_PROGRAMS += grub-mknetdir if COND_MAN_PAGES man_MANS += grub-mknetdir.1 grub-mknetdir.1: grub-mknetdir chmod a+x grub-mknetdir PATH=$(builddir):$$PATH pkgdatadir=$(builddir) $(HELP2MAN) --section=1 -i $(top_srcdir)/docs/man/grub-mknetdir.h2m -o $@ grub-mknetdir CLEANFILES += grub-mknetdir.1 endif grub_mknetdir_SOURCES = grub-core/kern/emu/argp_common.c grub-core/lib/reed_solomon.c grub-core/osdep/blocklist.c grub-core/osdep/compress.c grub-core/osdep/config.c grub-core/osdep/init.c grub-core/osdep/ofpath.c grub-core/osdep/platform.c grub-core/osdep/platform_unix.c grub-core/osdep/random.c util/config.c util/editenv.c util/grub-install-common.c util/grub-mkimage32.c util/grub-mkimage64.c util/grub-mknetdir.c util/mkimage.c util/resolve.c util/setup_bios.c util/setup_sparc.c nodist_grub_mknetdir_SOURCES = grub_mknetdir_LDADD = $(LIBLZMA) libgrubmods.a libgrubgcry.a libgrubkern.a grub-core/lib/gnulib/libgnu.a $(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM) grub_mknetdir_CFLAGS = $(AM_CFLAGS) $(CFLAGS_PROGRAM) grub_mknetdir_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_PROGRAM) grub_mknetdir_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS_PROGRAM) grub_mknetdir_CCASFLAGS = $(AM_CCASFLAGS) $(CCASFLAGS_PROGRAM) dist_noinst_DATA += BUILT_SOURCES += $(nodist_grub_mknetdir_SOURCES) CLEANFILES += $(nodist_grub_mknetdir_SOURCES) check_PROGRAMS_native += example_unit_test example_unit_test_SOURCES = grub-core/kern/list.c grub-core/kern/misc.c grub-core/tests/lib/test.c tests/example_unit_test.c tests/lib/unit_test.c nodist_example_unit_test_SOURCES = example_unit_test_LDADD = libgrubmods.a libgrubgcry.a libgrubkern.a grub-core/lib/gnulib/libgnu.a $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM) example_unit_test_CFLAGS = $(AM_CFLAGS) $(CFLAGS_PROGRAM) example_unit_test_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_PROGRAM) example_unit_test_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS_PROGRAM) example_unit_test_CCASFLAGS = $(AM_CCASFLAGS) $(CCASFLAGS_PROGRAM) dist_noinst_DATA += BUILT_SOURCES += $(nodist_example_unit_test_SOURCES) CLEANFILES += $(nodist_example_unit_test_SOURCES) check_PROGRAMS_native += printf_test printf_test_SOURCES = grub-core/kern/list.c grub-core/kern/misc.c grub-core/tests/lib/test.c tests/lib/unit_test.c tests/printf_unit_test.c nodist_printf_test_SOURCES = printf_test_LDADD = libgrubmods.a libgrubgcry.a libgrubkern.a grub-core/lib/gnulib/libgnu.a $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM) printf_test_CFLAGS = $(AM_CFLAGS) $(CFLAGS_PROGRAM) printf_test_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_PROGRAM) printf_test_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS_PROGRAM) printf_test_CCASFLAGS = $(AM_CCASFLAGS) $(CCASFLAGS_PROGRAM) dist_noinst_DATA += BUILT_SOURCES += $(nodist_printf_test_SOURCES) CLEANFILES += $(nodist_printf_test_SOURCES) check_PROGRAMS_native += date_test date_test_SOURCES = grub-core/kern/list.c grub-core/kern/misc.c grub-core/tests/lib/test.c tests/date_unit_test.c tests/lib/unit_test.c nodist_date_test_SOURCES = date_test_LDADD = libgrubmods.a libgrubgcry.a libgrubkern.a grub-core/lib/gnulib/libgnu.a $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM) date_test_CFLAGS = $(AM_CFLAGS) $(CFLAGS_PROGRAM) date_test_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_PROGRAM) date_test_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS_PROGRAM) date_test_CCASFLAGS = $(AM_CCASFLAGS) $(CCASFLAGS_PROGRAM) dist_noinst_DATA += BUILT_SOURCES += $(nodist_date_test_SOURCES) CLEANFILES += $(nodist_date_test_SOURCES) if COND_HAVE_CXX check_PROGRAMS_native += priority_queue_unit_test priority_queue_unit_test_SOURCES = grub-core/kern/list.c grub-core/kern/misc.c grub-core/lib/priority_queue.c grub-core/tests/lib/test.c tests/lib/unit_test.c tests/priority_queue_unit_test.cc nodist_priority_queue_unit_test_SOURCES = priority_queue_unit_test_LDADD = libgrubmods.a libgrubgcry.a libgrubkern.a grub-core/lib/gnulib/libgnu.a $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM) priority_queue_unit_test_CFLAGS = $(AM_CFLAGS) $(CFLAGS_PROGRAM) priority_queue_unit_test_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_PROGRAM) priority_queue_unit_test_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS_PROGRAM) priority_queue_unit_test_CCASFLAGS = $(AM_CCASFLAGS) $(CCASFLAGS_PROGRAM) dist_noinst_DATA += BUILT_SOURCES += $(nodist_priority_queue_unit_test_SOURCES) CLEANFILES += $(nodist_priority_queue_unit_test_SOURCES) endif COND_HAVE_CXX check_PROGRAMS_native += cmp_test cmp_test_SOURCES = grub-core/kern/list.c grub-core/kern/misc.c grub-core/tests/lib/test.c tests/cmp_unit_test.c tests/lib/unit_test.c nodist_cmp_test_SOURCES = cmp_test_LDADD = libgrubmods.a libgrubgcry.a libgrubkern.a grub-core/lib/gnulib/libgnu.a $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM) cmp_test_CFLAGS = $(AM_CFLAGS) $(CFLAGS_PROGRAM) cmp_test_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_PROGRAM) cmp_test_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS_PROGRAM) cmp_test_CCASFLAGS = $(AM_CCASFLAGS) $(CCASFLAGS_PROGRAM) dist_noinst_DATA += BUILT_SOURCES += $(nodist_cmp_test_SOURCES) CLEANFILES += $(nodist_cmp_test_SOURCES) bin_PROGRAMS += grub-menulst2cfg if COND_MAN_PAGES man_MANS += grub-menulst2cfg.1 grub-menulst2cfg.1: grub-menulst2cfg chmod a+x grub-menulst2cfg PATH=$(builddir):$$PATH pkgdatadir=$(builddir) $(HELP2MAN) --section=1 -i $(top_srcdir)/docs/man/grub-menulst2cfg.h2m -o $@ grub-menulst2cfg CLEANFILES += grub-menulst2cfg.1 endif grub_menulst2cfg_SOURCES = grub-core/lib/i386/pc/vesa_modes_table.c grub-core/lib/legacy_parse.c grub-core/osdep/init.c util/grub-menulst2cfg.c nodist_grub_menulst2cfg_SOURCES = grub_menulst2cfg_LDADD = libgrubmods.a libgrubgcry.a libgrubkern.a grub-core/lib/gnulib/libgnu.a $(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM) grub_menulst2cfg_CFLAGS = $(AM_CFLAGS) $(CFLAGS_PROGRAM) grub_menulst2cfg_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_PROGRAM) grub_menulst2cfg_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS_PROGRAM) grub_menulst2cfg_CCASFLAGS = $(AM_CCASFLAGS) $(CCASFLAGS_PROGRAM) dist_noinst_DATA += BUILT_SOURCES += $(nodist_grub_menulst2cfg_SOURCES) CLEANFILES += $(nodist_grub_menulst2cfg_SOURCES) bin_PROGRAMS += grub-syslinux2cfg if COND_MAN_PAGES man_MANS += grub-syslinux2cfg.1 grub-syslinux2cfg.1: grub-syslinux2cfg chmod a+x grub-syslinux2cfg PATH=$(builddir):$$PATH pkgdatadir=$(builddir) $(HELP2MAN) --section=1 -i $(top_srcdir)/docs/man/grub-syslinux2cfg.h2m -o $@ grub-syslinux2cfg CLEANFILES += grub-syslinux2cfg.1 endif grub_syslinux2cfg_SOURCES = grub-core/disk/host.c grub-core/kern/emu/argp_common.c grub-core/kern/emu/hostfs.c grub-core/lib/getline.c grub-core/lib/syslinux_parse.c grub-core/osdep/init.c util/grub-syslinux2cfg.c nodist_grub_syslinux2cfg_SOURCES = grub_syslinux2cfg_LDADD = libgrubmods.a libgrubgcry.a libgrubkern.a grub-core/lib/gnulib/libgnu.a $(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM) grub_syslinux2cfg_CFLAGS = $(AM_CFLAGS) $(CFLAGS_PROGRAM) grub_syslinux2cfg_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_PROGRAM) grub_syslinux2cfg_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS_PROGRAM) grub_syslinux2cfg_CCASFLAGS = $(AM_CCASFLAGS) $(CCASFLAGS_PROGRAM) dist_noinst_DATA += BUILT_SOURCES += $(nodist_grub_syslinux2cfg_SOURCES) CLEANFILES += $(nodist_grub_syslinux2cfg_SOURCES) bin_PROGRAMS += grub-glue-efi if COND_MAN_PAGES man_MANS += grub-glue-efi.1 grub-glue-efi.1: grub-glue-efi chmod a+x grub-glue-efi PATH=$(builddir):$$PATH pkgdatadir=$(builddir) $(HELP2MAN) --section=1 -i $(top_srcdir)/docs/man/grub-glue-efi.h2m -o $@ grub-glue-efi CLEANFILES += grub-glue-efi.1 endif grub_glue_efi_SOURCES = grub-core/kern/emu/argp_common.c grub-core/osdep/init.c util/glue-efi.c util/grub-glue-efi.c nodist_grub_glue_efi_SOURCES = grub_glue_efi_LDADD = libgrubmods.a libgrubgcry.a libgrubkern.a grub-core/lib/gnulib/libgnu.a $(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM) grub_glue_efi_CFLAGS = $(AM_CFLAGS) $(CFLAGS_PROGRAM) grub_glue_efi_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_PROGRAM) grub_glue_efi_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS_PROGRAM) grub_glue_efi_CCASFLAGS = $(AM_CCASFLAGS) $(CCASFLAGS_PROGRAM) dist_noinst_DATA += BUILT_SOURCES += $(nodist_grub_glue_efi_SOURCES) CLEANFILES += $(nodist_grub_glue_efi_SOURCES) bin_PROGRAMS += grub-render-label if COND_MAN_PAGES man_MANS += grub-render-label.1 grub-render-label.1: grub-render-label chmod a+x grub-render-label PATH=$(builddir):$$PATH pkgdatadir=$(builddir) $(HELP2MAN) --section=1 -i $(top_srcdir)/docs/man/grub-render-label.h2m -o $@ grub-render-label CLEANFILES += grub-render-label.1 endif grub_render_label_SOURCES = grub-core/disk/host.c grub-core/kern/emu/argp_common.c grub-core/kern/emu/hostfs.c grub-core/osdep/init.c util/grub-render-label.c util/render-label.c nodist_grub_render_label_SOURCES = grub_render_label_LDADD = libgrubmods.a libgrubgcry.a libgrubkern.a grub-core/lib/gnulib/libgnu.a $(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM) grub_render_label_CFLAGS = $(AM_CFLAGS) $(CFLAGS_PROGRAM) grub_render_label_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_PROGRAM) grub_render_label_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS_PROGRAM) grub_render_label_CCASFLAGS = $(AM_CCASFLAGS) $(CCASFLAGS_PROGRAM) dist_noinst_DATA += BUILT_SOURCES += $(nodist_grub_render_label_SOURCES) CLEANFILES += $(nodist_grub_render_label_SOURCES) bin_PROGRAMS += grub-file if COND_MAN_PAGES man_MANS += grub-file.1 grub-file.1: grub-file chmod a+x grub-file PATH=$(builddir):$$PATH pkgdatadir=$(builddir) $(HELP2MAN) --section=1 -i $(top_srcdir)/docs/man/grub-file.h2m -o $@ grub-file CLEANFILES += grub-file.1 endif grub_file_SOURCES = grub-core/commands/file.c grub-core/commands/file32.c grub-core/commands/file64.c grub-core/disk/host.c grub-core/io/offset.c grub-core/kern/elf.c grub-core/kern/emu/hostfs.c grub-core/loader/i386/xen_file.c grub-core/loader/i386/xen_file32.c grub-core/loader/i386/xen_file64.c grub-core/loader/lzss.c grub-core/loader/macho.c grub-core/loader/macho32.c grub-core/loader/macho64.c grub-core/osdep/init.c util/grub-file.c util/render-label.c nodist_grub_file_SOURCES = grub_file_LDADD = libgrubmods.a libgrubgcry.a libgrubkern.a grub-core/lib/gnulib/libgnu.a $(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM) grub_file_CFLAGS = $(AM_CFLAGS) $(CFLAGS_PROGRAM) grub_file_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_PROGRAM) grub_file_CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS_PROGRAM) grub_file_CCASFLAGS = $(AM_CCASFLAGS) $(CCASFLAGS_PROGRAM) dist_noinst_DATA += BUILT_SOURCES += $(nodist_grub_file_SOURCES) CLEANFILES += $(nodist_grub_file_SOURCES) grubconf_SCRIPTS += 00_header 00_header: $(top_builddir)/config.status util/grub.d/00_header.in (for x in util/grub.d/00_header.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x 00_header CLEANFILES += 00_header EXTRA_DIST += dist_noinst_DATA += util/grub.d/00_header.in if COND_HOST_WINDOWS grubconf_SCRIPTS += 10_windows 10_windows: $(top_builddir)/config.status util/grub.d/10_windows.in (for x in util/grub.d/10_windows.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x 10_windows CLEANFILES += 10_windows EXTRA_DIST += dist_noinst_DATA += util/grub.d/10_windows.in endif COND_HOST_WINDOWS if COND_HOST_HURD grubconf_SCRIPTS += 10_hurd 10_hurd: $(top_builddir)/config.status util/grub.d/10_hurd.in (for x in util/grub.d/10_hurd.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x 10_hurd CLEANFILES += 10_hurd EXTRA_DIST += dist_noinst_DATA += util/grub.d/10_hurd.in endif COND_HOST_HURD if COND_HOST_KFREEBSD grubconf_SCRIPTS += 10_kfreebsd 10_kfreebsd: $(top_builddir)/config.status util/grub.d/10_kfreebsd.in (for x in util/grub.d/10_kfreebsd.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x 10_kfreebsd CLEANFILES += 10_kfreebsd EXTRA_DIST += dist_noinst_DATA += util/grub.d/10_kfreebsd.in endif COND_HOST_KFREEBSD if COND_HOST_ILLUMOS grubconf_SCRIPTS += 10_illumos 10_illumos: $(top_builddir)/config.status util/grub.d/10_illumos.in (for x in util/grub.d/10_illumos.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x 10_illumos CLEANFILES += 10_illumos EXTRA_DIST += dist_noinst_DATA += util/grub.d/10_illumos.in endif COND_HOST_ILLUMOS if COND_HOST_NETBSD grubconf_SCRIPTS += 10_netbsd 10_netbsd: $(top_builddir)/config.status util/grub.d/10_netbsd.in (for x in util/grub.d/10_netbsd.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x 10_netbsd CLEANFILES += 10_netbsd EXTRA_DIST += dist_noinst_DATA += util/grub.d/10_netbsd.in endif COND_HOST_NETBSD if COND_HOST_LINUX grubconf_SCRIPTS += 10_linux 10_linux: $(top_builddir)/config.status util/grub.d/10_linux.in (for x in util/grub.d/10_linux.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x 10_linux CLEANFILES += 10_linux EXTRA_DIST += dist_noinst_DATA += util/grub.d/10_linux.in endif COND_HOST_LINUX if COND_HOST_XNU grubconf_SCRIPTS += 10_xnu 10_xnu: $(top_builddir)/config.status util/grub.d/10_xnu.in (for x in util/grub.d/10_xnu.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x 10_xnu CLEANFILES += 10_xnu EXTRA_DIST += dist_noinst_DATA += util/grub.d/10_xnu.in endif COND_HOST_XNU if COND_HOST_LINUX grubconf_SCRIPTS += 20_linux_xen 20_linux_xen: $(top_builddir)/config.status util/grub.d/20_linux_xen.in (for x in util/grub.d/20_linux_xen.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x 20_linux_xen CLEANFILES += 20_linux_xen EXTRA_DIST += dist_noinst_DATA += util/grub.d/20_linux_xen.in endif COND_HOST_LINUX grubconf_SCRIPTS += 25_bli 25_bli: $(top_builddir)/config.status util/grub.d/25_bli.in (for x in util/grub.d/25_bli.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x 25_bli CLEANFILES += 25_bli EXTRA_DIST += dist_noinst_DATA += util/grub.d/25_bli.in grubconf_SCRIPTS += 30_os-prober 30_os-prober: $(top_builddir)/config.status util/grub.d/30_os-prober.in (for x in util/grub.d/30_os-prober.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x 30_os-prober CLEANFILES += 30_os-prober EXTRA_DIST += dist_noinst_DATA += util/grub.d/30_os-prober.in grubconf_SCRIPTS += 30_uefi-firmware 30_uefi-firmware: $(top_builddir)/config.status util/grub.d/30_uefi-firmware.in (for x in util/grub.d/30_uefi-firmware.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x 30_uefi-firmware CLEANFILES += 30_uefi-firmware EXTRA_DIST += dist_noinst_DATA += util/grub.d/30_uefi-firmware.in grubconf_SCRIPTS += 40_custom 40_custom: $(top_builddir)/config.status util/grub.d/40_custom.in (for x in util/grub.d/40_custom.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x 40_custom CLEANFILES += 40_custom EXTRA_DIST += dist_noinst_DATA += util/grub.d/40_custom.in grubconf_SCRIPTS += 41_custom 41_custom: $(top_builddir)/config.status util/grub.d/41_custom.in (for x in util/grub.d/41_custom.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x 41_custom CLEANFILES += 41_custom EXTRA_DIST += dist_noinst_DATA += util/grub.d/41_custom.in sbin_SCRIPTS += grub-mkconfig if COND_MAN_PAGES man_MANS += grub-mkconfig.8 grub-mkconfig.8: grub-mkconfig grub-mkconfig_lib chmod a+x grub-mkconfig PATH=$(builddir):$$PATH pkgdatadir=$(builddir) $(HELP2MAN) --section=8 -i $(top_srcdir)/docs/man/grub-mkconfig.h2m -o $@ grub-mkconfig CLEANFILES += grub-mkconfig.8 endif grub-mkconfig: $(top_builddir)/config.status util/grub-mkconfig.in (for x in util/grub-mkconfig.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub-mkconfig CLEANFILES += grub-mkconfig EXTRA_DIST += dist_noinst_DATA += util/grub-mkconfig.in sbin_SCRIPTS += grub-set-default if COND_MAN_PAGES man_MANS += grub-set-default.8 grub-set-default.8: grub-set-default grub-mkconfig_lib chmod a+x grub-set-default PATH=$(builddir):$$PATH pkgdatadir=$(builddir) $(HELP2MAN) --section=8 -i $(top_srcdir)/docs/man/grub-set-default.h2m -o $@ grub-set-default CLEANFILES += grub-set-default.8 endif grub-set-default: $(top_builddir)/config.status util/grub-set-default.in (for x in util/grub-set-default.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub-set-default CLEANFILES += grub-set-default EXTRA_DIST += dist_noinst_DATA += util/grub-set-default.in sbin_SCRIPTS += grub-reboot if COND_MAN_PAGES man_MANS += grub-reboot.8 grub-reboot.8: grub-reboot grub-mkconfig_lib chmod a+x grub-reboot PATH=$(builddir):$$PATH pkgdatadir=$(builddir) $(HELP2MAN) --section=8 -i $(top_srcdir)/docs/man/grub-reboot.h2m -o $@ grub-reboot CLEANFILES += grub-reboot.8 endif grub-reboot: $(top_builddir)/config.status util/grub-reboot.in (for x in util/grub-reboot.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub-reboot CLEANFILES += grub-reboot EXTRA_DIST += dist_noinst_DATA += util/grub-reboot.in noinst_SCRIPTS += grub-mkconfig_lib grub-mkconfig_lib: $(top_builddir)/config.status util/grub-mkconfig_lib.in (for x in util/grub-mkconfig_lib.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub-mkconfig_lib CLEANFILES += grub-mkconfig_lib EXTRA_DIST += dist_noinst_DATA += util/grub-mkconfig_lib.in bin_SCRIPTS += grub-kbdcomp if COND_MAN_PAGES man_MANS += grub-kbdcomp.1 grub-kbdcomp.1: grub-kbdcomp grub-mkconfig_lib chmod a+x grub-kbdcomp PATH=$(builddir):$$PATH pkgdatadir=$(builddir) $(HELP2MAN) --section=1 -i $(top_srcdir)/docs/man/grub-kbdcomp.h2m -o $@ grub-kbdcomp CLEANFILES += grub-kbdcomp.1 endif grub-kbdcomp: $(top_builddir)/config.status util/grub-kbdcomp.in (for x in util/grub-kbdcomp.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub-kbdcomp CLEANFILES += grub-kbdcomp EXTRA_DIST += dist_noinst_DATA += util/grub-kbdcomp.in noinst_SCRIPTS += grub-shell grub-shell: $(top_builddir)/config.status tests/util/grub-shell.in (for x in tests/util/grub-shell.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub-shell CLEANFILES += grub-shell EXTRA_DIST += dist_noinst_DATA += tests/util/grub-shell.in noinst_SCRIPTS += grub-shell-tester grub-shell-tester: $(top_builddir)/config.status tests/util/grub-shell-tester.in (for x in tests/util/grub-shell-tester.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub-shell-tester CLEANFILES += grub-shell-tester EXTRA_DIST += dist_noinst_DATA += tests/util/grub-shell-tester.in noinst_SCRIPTS += grub-shell-luks-tester grub-shell-luks-tester: $(top_builddir)/config.status tests/util/grub-shell-luks-tester.in (for x in tests/util/grub-shell-luks-tester.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub-shell-luks-tester CLEANFILES += grub-shell-luks-tester EXTRA_DIST += dist_noinst_DATA += tests/util/grub-shell-luks-tester.in noinst_SCRIPTS += grub-fs-tester grub-fs-tester: $(top_builddir)/config.status tests/util/grub-fs-tester.in garbage-gen$(BUILD_EXEEXT) (for x in tests/util/grub-fs-tester.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub-fs-tester CLEANFILES += grub-fs-tester EXTRA_DIST += dist_noinst_DATA += tests/util/grub-fs-tester.in check_SCRIPTS_native += erofs_test erofs_test: $(top_builddir)/config.status tests/erofs_test.in (for x in tests/erofs_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x erofs_test CLEANFILES += erofs_test EXTRA_DIST += dist_noinst_DATA += tests/erofs_test.in check_SCRIPTS_native += ext234_test ext234_test: $(top_builddir)/config.status tests/ext234_test.in (for x in tests/ext234_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x ext234_test CLEANFILES += ext234_test EXTRA_DIST += dist_noinst_DATA += tests/ext234_test.in check_SCRIPTS_native += squashfs_test squashfs_test: $(top_builddir)/config.status tests/squashfs_test.in (for x in tests/squashfs_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x squashfs_test CLEANFILES += squashfs_test EXTRA_DIST += dist_noinst_DATA += tests/squashfs_test.in check_SCRIPTS_native += iso9660_test iso9660_test: $(top_builddir)/config.status tests/iso9660_test.in (for x in tests/iso9660_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x iso9660_test CLEANFILES += iso9660_test EXTRA_DIST += dist_noinst_DATA += tests/iso9660_test.in check_SCRIPTS_native += hfsplus_test hfsplus_test: $(top_builddir)/config.status tests/hfsplus_test.in (for x in tests/hfsplus_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x hfsplus_test CLEANFILES += hfsplus_test EXTRA_DIST += dist_noinst_DATA += tests/hfsplus_test.in check_SCRIPTS_native += ntfs_test ntfs_test: $(top_builddir)/config.status tests/ntfs_test.in (for x in tests/ntfs_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x ntfs_test CLEANFILES += ntfs_test EXTRA_DIST += dist_noinst_DATA += tests/ntfs_test.in check_SCRIPTS_native += reiserfs_test reiserfs_test: $(top_builddir)/config.status tests/reiserfs_test.in (for x in tests/reiserfs_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x reiserfs_test CLEANFILES += reiserfs_test EXTRA_DIST += dist_noinst_DATA += tests/reiserfs_test.in check_SCRIPTS_native += fat_test fat_test: $(top_builddir)/config.status tests/fat_test.in (for x in tests/fat_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x fat_test CLEANFILES += fat_test EXTRA_DIST += dist_noinst_DATA += tests/fat_test.in check_SCRIPTS_native += minixfs_test minixfs_test: $(top_builddir)/config.status tests/minixfs_test.in (for x in tests/minixfs_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x minixfs_test CLEANFILES += minixfs_test EXTRA_DIST += dist_noinst_DATA += tests/minixfs_test.in check_SCRIPTS_native += xfs_test xfs_test: $(top_builddir)/config.status tests/xfs_test.in (for x in tests/xfs_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x xfs_test CLEANFILES += xfs_test EXTRA_DIST += dist_noinst_DATA += tests/xfs_test.in check_SCRIPTS_native += f2fs_test f2fs_test: $(top_builddir)/config.status tests/f2fs_test.in (for x in tests/f2fs_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x f2fs_test CLEANFILES += f2fs_test EXTRA_DIST += dist_noinst_DATA += tests/f2fs_test.in check_SCRIPTS_native += nilfs2_test nilfs2_test: $(top_builddir)/config.status tests/nilfs2_test.in (for x in tests/nilfs2_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x nilfs2_test CLEANFILES += nilfs2_test EXTRA_DIST += dist_noinst_DATA += tests/nilfs2_test.in check_SCRIPTS_native += romfs_test romfs_test: $(top_builddir)/config.status tests/romfs_test.in (for x in tests/romfs_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x romfs_test CLEANFILES += romfs_test EXTRA_DIST += dist_noinst_DATA += tests/romfs_test.in check_SCRIPTS_native += exfat_test exfat_test: $(top_builddir)/config.status tests/exfat_test.in (for x in tests/exfat_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x exfat_test CLEANFILES += exfat_test EXTRA_DIST += dist_noinst_DATA += tests/exfat_test.in check_SCRIPTS_native += tar_test tar_test: $(top_builddir)/config.status tests/tar_test.in (for x in tests/tar_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x tar_test CLEANFILES += tar_test EXTRA_DIST += dist_noinst_DATA += tests/tar_test.in check_SCRIPTS_native += udf_test udf_test: $(top_builddir)/config.status tests/udf_test.in (for x in tests/udf_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x udf_test CLEANFILES += udf_test EXTRA_DIST += dist_noinst_DATA += tests/udf_test.in check_SCRIPTS_native += hfs_test hfs_test: $(top_builddir)/config.status tests/hfs_test.in (for x in tests/hfs_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x hfs_test CLEANFILES += hfs_test EXTRA_DIST += dist_noinst_DATA += tests/hfs_test.in check_SCRIPTS_native += jfs_test jfs_test: $(top_builddir)/config.status tests/jfs_test.in (for x in tests/jfs_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x jfs_test CLEANFILES += jfs_test EXTRA_DIST += dist_noinst_DATA += tests/jfs_test.in check_SCRIPTS_native += btrfs_test btrfs_test: $(top_builddir)/config.status tests/btrfs_test.in (for x in tests/btrfs_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x btrfs_test CLEANFILES += btrfs_test EXTRA_DIST += dist_noinst_DATA += tests/btrfs_test.in check_SCRIPTS_native += zfs_test zfs_test: $(top_builddir)/config.status tests/zfs_test.in (for x in tests/zfs_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x zfs_test CLEANFILES += zfs_test EXTRA_DIST += dist_noinst_DATA += tests/zfs_test.in check_SCRIPTS_native += cpio_test cpio_test: $(top_builddir)/config.status tests/cpio_test.in (for x in tests/cpio_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x cpio_test CLEANFILES += cpio_test EXTRA_DIST += dist_noinst_DATA += tests/cpio_test.in check_SCRIPTS_native += example_scripted_test example_scripted_test: $(top_builddir)/config.status tests/example_scripted_test.in (for x in tests/example_scripted_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x example_scripted_test CLEANFILES += example_scripted_test EXTRA_DIST += dist_noinst_DATA += tests/example_scripted_test.in check_SCRIPTS_native += gettext_strings_test gettext_strings_test: $(top_builddir)/config.status tests/gettext_strings_test.in (for x in tests/gettext_strings_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x gettext_strings_test CLEANFILES += gettext_strings_test EXTRA_DIST += po/exclude.pot dist_noinst_DATA += tests/gettext_strings_test.in check_SCRIPTS_nonnative += pata_test pata_test: $(top_builddir)/config.status tests/pata_test.in (for x in tests/pata_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x pata_test CLEANFILES += pata_test EXTRA_DIST += dist_noinst_DATA += tests/pata_test.in check_SCRIPTS_nonnative += ahci_test ahci_test: $(top_builddir)/config.status tests/ahci_test.in (for x in tests/ahci_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x ahci_test CLEANFILES += ahci_test EXTRA_DIST += dist_noinst_DATA += tests/ahci_test.in check_SCRIPTS_nonnative += uhci_test uhci_test: $(top_builddir)/config.status tests/uhci_test.in (for x in tests/uhci_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x uhci_test CLEANFILES += uhci_test EXTRA_DIST += dist_noinst_DATA += tests/uhci_test.in check_SCRIPTS_nonnative += ohci_test ohci_test: $(top_builddir)/config.status tests/ohci_test.in (for x in tests/ohci_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x ohci_test CLEANFILES += ohci_test EXTRA_DIST += dist_noinst_DATA += tests/ohci_test.in check_SCRIPTS_nonnative += ehci_test ehci_test: $(top_builddir)/config.status tests/ehci_test.in (for x in tests/ehci_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x ehci_test CLEANFILES += ehci_test EXTRA_DIST += dist_noinst_DATA += tests/ehci_test.in check_SCRIPTS_nonnative += example_grub_script_test example_grub_script_test: $(top_builddir)/config.status tests/example_grub_script_test.in (for x in tests/example_grub_script_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x example_grub_script_test CLEANFILES += example_grub_script_test EXTRA_DIST += dist_noinst_DATA += tests/example_grub_script_test.in check_SCRIPTS_nonnative += grub_script_eval grub_script_eval: $(top_builddir)/config.status tests/grub_script_eval.in (for x in tests/grub_script_eval.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub_script_eval CLEANFILES += grub_script_eval EXTRA_DIST += dist_noinst_DATA += tests/grub_script_eval.in check_SCRIPTS_nonnative += grub_script_test grub_script_test: $(top_builddir)/config.status tests/grub_script_test.in (for x in tests/grub_script_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub_script_test CLEANFILES += grub_script_test EXTRA_DIST += dist_noinst_DATA += tests/grub_script_test.in check_SCRIPTS_nonnative += grub_script_echo1 grub_script_echo1: $(top_builddir)/config.status tests/grub_script_echo1.in (for x in tests/grub_script_echo1.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub_script_echo1 CLEANFILES += grub_script_echo1 EXTRA_DIST += dist_noinst_DATA += tests/grub_script_echo1.in check_SCRIPTS_nonnative += grub_script_leading_whitespace grub_script_leading_whitespace: $(top_builddir)/config.status tests/grub_script_leading_whitespace.in (for x in tests/grub_script_leading_whitespace.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub_script_leading_whitespace CLEANFILES += grub_script_leading_whitespace EXTRA_DIST += dist_noinst_DATA += tests/grub_script_leading_whitespace.in check_SCRIPTS_nonnative += grub_script_echo_keywords grub_script_echo_keywords: $(top_builddir)/config.status tests/grub_script_echo_keywords.in (for x in tests/grub_script_echo_keywords.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub_script_echo_keywords CLEANFILES += grub_script_echo_keywords EXTRA_DIST += dist_noinst_DATA += tests/grub_script_echo_keywords.in check_SCRIPTS_nonnative += grub_script_vars1 grub_script_vars1: $(top_builddir)/config.status tests/grub_script_vars1.in (for x in tests/grub_script_vars1.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub_script_vars1 CLEANFILES += grub_script_vars1 EXTRA_DIST += dist_noinst_DATA += tests/grub_script_vars1.in check_SCRIPTS_nonnative += grub_script_for1 grub_script_for1: $(top_builddir)/config.status tests/grub_script_for1.in (for x in tests/grub_script_for1.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub_script_for1 CLEANFILES += grub_script_for1 EXTRA_DIST += dist_noinst_DATA += tests/grub_script_for1.in check_SCRIPTS_nonnative += grub_script_while1 grub_script_while1: $(top_builddir)/config.status tests/grub_script_while1.in (for x in tests/grub_script_while1.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub_script_while1 CLEANFILES += grub_script_while1 EXTRA_DIST += dist_noinst_DATA += tests/grub_script_while1.in check_SCRIPTS_nonnative += grub_script_if grub_script_if: $(top_builddir)/config.status tests/grub_script_if.in (for x in tests/grub_script_if.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub_script_if CLEANFILES += grub_script_if EXTRA_DIST += dist_noinst_DATA += tests/grub_script_if.in check_SCRIPTS_native += grub_script_blanklines grub_script_blanklines: $(top_builddir)/config.status tests/grub_script_blanklines.in (for x in tests/grub_script_blanklines.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub_script_blanklines CLEANFILES += grub_script_blanklines EXTRA_DIST += dist_noinst_DATA += tests/grub_script_blanklines.in check_SCRIPTS_native += grub_script_final_semicolon grub_script_final_semicolon: $(top_builddir)/config.status tests/grub_script_final_semicolon.in (for x in tests/grub_script_final_semicolon.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub_script_final_semicolon CLEANFILES += grub_script_final_semicolon EXTRA_DIST += dist_noinst_DATA += tests/grub_script_final_semicolon.in check_SCRIPTS_native += grub_script_dollar grub_script_dollar: $(top_builddir)/config.status tests/grub_script_dollar.in (for x in tests/grub_script_dollar.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub_script_dollar CLEANFILES += grub_script_dollar EXTRA_DIST += dist_noinst_DATA += tests/grub_script_dollar.in check_SCRIPTS_nonnative += grub_script_comments grub_script_comments: $(top_builddir)/config.status tests/grub_script_comments.in (for x in tests/grub_script_comments.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub_script_comments CLEANFILES += grub_script_comments EXTRA_DIST += dist_noinst_DATA += tests/grub_script_comments.in check_SCRIPTS_nonnative += grub_script_functions grub_script_functions: $(top_builddir)/config.status tests/grub_script_functions.in (for x in tests/grub_script_functions.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub_script_functions CLEANFILES += grub_script_functions EXTRA_DIST += dist_noinst_DATA += tests/grub_script_functions.in check_SCRIPTS_nonnative += grub_script_break grub_script_break: $(top_builddir)/config.status tests/grub_script_break.in (for x in tests/grub_script_break.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub_script_break CLEANFILES += grub_script_break EXTRA_DIST += dist_noinst_DATA += tests/grub_script_break.in check_SCRIPTS_nonnative += grub_script_continue grub_script_continue: $(top_builddir)/config.status tests/grub_script_continue.in (for x in tests/grub_script_continue.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub_script_continue CLEANFILES += grub_script_continue EXTRA_DIST += dist_noinst_DATA += tests/grub_script_continue.in check_SCRIPTS_nonnative += grub_script_shift grub_script_shift: $(top_builddir)/config.status tests/grub_script_shift.in (for x in tests/grub_script_shift.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub_script_shift CLEANFILES += grub_script_shift EXTRA_DIST += dist_noinst_DATA += tests/grub_script_shift.in check_SCRIPTS_nonnative += grub_script_blockarg grub_script_blockarg: $(top_builddir)/config.status tests/grub_script_blockarg.in (for x in tests/grub_script_blockarg.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub_script_blockarg CLEANFILES += grub_script_blockarg EXTRA_DIST += dist_noinst_DATA += tests/grub_script_blockarg.in check_SCRIPTS_nonnative += grub_script_setparams grub_script_setparams: $(top_builddir)/config.status tests/grub_script_setparams.in (for x in tests/grub_script_setparams.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub_script_setparams CLEANFILES += grub_script_setparams EXTRA_DIST += dist_noinst_DATA += tests/grub_script_setparams.in check_SCRIPTS_nonnative += grub_script_return grub_script_return: $(top_builddir)/config.status tests/grub_script_return.in (for x in tests/grub_script_return.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub_script_return CLEANFILES += grub_script_return EXTRA_DIST += dist_noinst_DATA += tests/grub_script_return.in check_SCRIPTS_nonnative += grub_cmd_cryptomount grub_cmd_cryptomount: $(top_builddir)/config.status tests/grub_cmd_cryptomount.in (for x in tests/grub_cmd_cryptomount.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub_cmd_cryptomount CLEANFILES += grub_cmd_cryptomount EXTRA_DIST += dist_noinst_DATA += tests/grub_cmd_cryptomount.in check_SCRIPTS_nonnative += grub_cmd_regexp grub_cmd_regexp: $(top_builddir)/config.status tests/grub_cmd_regexp.in (for x in tests/grub_cmd_regexp.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub_cmd_regexp CLEANFILES += grub_cmd_regexp EXTRA_DIST += dist_noinst_DATA += tests/grub_cmd_regexp.in check_SCRIPTS_nonnative += grub_cmd_date grub_cmd_date: $(top_builddir)/config.status tests/grub_cmd_date.in (for x in tests/grub_cmd_date.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub_cmd_date CLEANFILES += grub_cmd_date EXTRA_DIST += dist_noinst_DATA += tests/grub_cmd_date.in check_SCRIPTS_nonnative += grub_cmd_set_date grub_cmd_set_date: $(top_builddir)/config.status tests/grub_cmd_set_date.in (for x in tests/grub_cmd_set_date.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub_cmd_set_date CLEANFILES += grub_cmd_set_date EXTRA_DIST += dist_noinst_DATA += tests/grub_cmd_set_date.in check_SCRIPTS_nonnative += grub_cmd_sleep grub_cmd_sleep: $(top_builddir)/config.status tests/grub_cmd_sleep.in (for x in tests/grub_cmd_sleep.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub_cmd_sleep CLEANFILES += grub_cmd_sleep EXTRA_DIST += dist_noinst_DATA += tests/grub_cmd_sleep.in check_SCRIPTS_nonnative += grub_script_expansion grub_script_expansion: $(top_builddir)/config.status tests/grub_script_expansion.in (for x in tests/grub_script_expansion.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub_script_expansion CLEANFILES += grub_script_expansion EXTRA_DIST += dist_noinst_DATA += tests/grub_script_expansion.in check_SCRIPTS_nonnative += grub_script_not grub_script_not: $(top_builddir)/config.status tests/grub_script_not.in (for x in tests/grub_script_not.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub_script_not CLEANFILES += grub_script_not EXTRA_DIST += dist_noinst_DATA += tests/grub_script_not.in check_SCRIPTS_native += grub_script_no_commands grub_script_no_commands: $(top_builddir)/config.status tests/grub_script_no_commands.in (for x in tests/grub_script_no_commands.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub_script_no_commands CLEANFILES += grub_script_no_commands EXTRA_DIST += dist_noinst_DATA += tests/grub_script_no_commands.in check_SCRIPTS_nonnative += partmap_test partmap_test: $(top_builddir)/config.status tests/partmap_test.in (for x in tests/partmap_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x partmap_test CLEANFILES += partmap_test EXTRA_DIST += dist_noinst_DATA += tests/partmap_test.in check_SCRIPTS_nonnative += hddboot_test hddboot_test: $(top_builddir)/config.status tests/hddboot_test.in (for x in tests/hddboot_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x hddboot_test CLEANFILES += hddboot_test EXTRA_DIST += dist_noinst_DATA += tests/hddboot_test.in check_SCRIPTS_nonnative += fddboot_test fddboot_test: $(top_builddir)/config.status tests/fddboot_test.in (for x in tests/fddboot_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x fddboot_test CLEANFILES += fddboot_test EXTRA_DIST += dist_noinst_DATA += tests/fddboot_test.in check_SCRIPTS_nonnative += cdboot_test cdboot_test: $(top_builddir)/config.status tests/cdboot_test.in (for x in tests/cdboot_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x cdboot_test CLEANFILES += cdboot_test EXTRA_DIST += dist_noinst_DATA += tests/cdboot_test.in check_SCRIPTS_nonnative += netboot_test netboot_test: $(top_builddir)/config.status tests/netboot_test.in (for x in tests/netboot_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x netboot_test CLEANFILES += netboot_test EXTRA_DIST += dist_noinst_DATA += tests/netboot_test.in check_SCRIPTS_nonnative += serial_test serial_test: $(top_builddir)/config.status tests/serial_test.in (for x in tests/serial_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x serial_test CLEANFILES += serial_test EXTRA_DIST += dist_noinst_DATA += tests/serial_test.in check_SCRIPTS_nonnative += pseries_test pseries_test: $(top_builddir)/config.status tests/pseries_test.in (for x in tests/pseries_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x pseries_test CLEANFILES += pseries_test EXTRA_DIST += dist_noinst_DATA += tests/pseries_test.in check_SCRIPTS_nonnative += core_compress_test core_compress_test: $(top_builddir)/config.status tests/core_compress_test.in (for x in tests/core_compress_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x core_compress_test CLEANFILES += core_compress_test EXTRA_DIST += dist_noinst_DATA += tests/core_compress_test.in check_SCRIPTS_nonnative += xzcompress_test xzcompress_test: $(top_builddir)/config.status tests/xzcompress_test.in (for x in tests/xzcompress_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x xzcompress_test CLEANFILES += xzcompress_test EXTRA_DIST += dist_noinst_DATA += tests/xzcompress_test.in check_SCRIPTS_nonnative += gzcompress_test gzcompress_test: $(top_builddir)/config.status tests/gzcompress_test.in (for x in tests/gzcompress_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x gzcompress_test CLEANFILES += gzcompress_test EXTRA_DIST += dist_noinst_DATA += tests/gzcompress_test.in check_SCRIPTS_nonnative += lzocompress_test lzocompress_test: $(top_builddir)/config.status tests/lzocompress_test.in (for x in tests/lzocompress_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x lzocompress_test CLEANFILES += lzocompress_test EXTRA_DIST += dist_noinst_DATA += tests/lzocompress_test.in check_SCRIPTS_nonnative += grub_cmd_echo grub_cmd_echo: $(top_builddir)/config.status tests/grub_cmd_echo.in (for x in tests/grub_cmd_echo.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub_cmd_echo CLEANFILES += grub_cmd_echo EXTRA_DIST += dist_noinst_DATA += tests/grub_cmd_echo.in check_SCRIPTS_nonnative += help_test help_test: $(top_builddir)/config.status tests/help_test.in (for x in tests/help_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x help_test CLEANFILES += help_test EXTRA_DIST += dist_noinst_DATA += tests/help_test.in check_SCRIPTS_nonnative += grub_script_gettext grub_script_gettext: $(top_builddir)/config.status tests/grub_script_gettext.in (for x in tests/grub_script_gettext.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub_script_gettext CLEANFILES += grub_script_gettext EXTRA_DIST += dist_noinst_DATA += tests/grub_script_gettext.in check_SCRIPTS_nonnative += grub_script_escape_comma grub_script_escape_comma: $(top_builddir)/config.status tests/grub_script_escape_comma.in (for x in tests/grub_script_escape_comma.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub_script_escape_comma CLEANFILES += grub_script_escape_comma EXTRA_DIST += dist_noinst_DATA += tests/grub_script_escape_comma.in check_SCRIPTS_nonnative += grub_script_strcmp grub_script_strcmp: $(top_builddir)/config.status tests/grub_script_strcmp.in (for x in tests/grub_script_strcmp.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub_script_strcmp CLEANFILES += grub_script_strcmp EXTRA_DIST += dist_noinst_DATA += tests/grub_script_strcmp.in check_SCRIPTS_nonnative += test_sha512sum test_sha512sum: $(top_builddir)/config.status tests/test_sha512sum.in (for x in tests/test_sha512sum.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x test_sha512sum CLEANFILES += test_sha512sum EXTRA_DIST += dist_noinst_DATA += tests/test_sha512sum.in check_SCRIPTS_nonnative += test_unset test_unset: $(top_builddir)/config.status tests/test_unset.in (for x in tests/test_unset.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x test_unset CLEANFILES += test_unset EXTRA_DIST += dist_noinst_DATA += tests/test_unset.in check_SCRIPTS_nonnative += grub_func_test grub_func_test: $(top_builddir)/config.status tests/grub_func_test.in (for x in tests/grub_func_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub_func_test CLEANFILES += grub_func_test EXTRA_DIST += dist_noinst_DATA += tests/grub_func_test.in check_SCRIPTS_nonnative += grub_cmd_tr grub_cmd_tr: $(top_builddir)/config.status tests/grub_cmd_tr.in (for x in tests/grub_cmd_tr.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub_cmd_tr CLEANFILES += grub_cmd_tr EXTRA_DIST += dist_noinst_DATA += tests/grub_cmd_tr.in check_SCRIPTS_nonnative += file_filter_test file_filter_test: $(top_builddir)/config.status tests/file_filter_test.in (for x in tests/file_filter_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x file_filter_test CLEANFILES += file_filter_test EXTRA_DIST += dist_noinst_DATA += tests/file_filter_test.in check_SCRIPTS_nonnative += grub_cmd_test grub_cmd_test: $(top_builddir)/config.status tests/grub_cmd_test.in (for x in tests/grub_cmd_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x grub_cmd_test CLEANFILES += grub_cmd_test EXTRA_DIST += dist_noinst_DATA += tests/grub_cmd_test.in check_SCRIPTS_native += syslinux_test syslinux_test: $(top_builddir)/config.status tests/syslinux_test.in (for x in tests/syslinux_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x syslinux_test CLEANFILES += syslinux_test EXTRA_DIST += dist_noinst_DATA += tests/syslinux_test.in check_SCRIPTS_native += luks1_test luks1_test: $(top_builddir)/config.status tests/luks1_test.in (for x in tests/luks1_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x luks1_test CLEANFILES += luks1_test EXTRA_DIST += dist_noinst_DATA += tests/luks1_test.in check_SCRIPTS_native += luks2_test luks2_test: $(top_builddir)/config.status tests/luks2_test.in (for x in tests/luks2_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x luks2_test CLEANFILES += luks2_test EXTRA_DIST += dist_noinst_DATA += tests/luks2_test.in check_SCRIPTS_native += asn1_test asn1_test: $(top_builddir)/config.status tests/asn1_test.in (for x in tests/asn1_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x asn1_test CLEANFILES += asn1_test EXTRA_DIST += dist_noinst_DATA += tests/asn1_test.in check_SCRIPTS_native += tpm2_key_protector_test tpm2_key_protector_test: $(top_builddir)/config.status tests/tpm2_key_protector_test.in (for x in tests/tpm2_key_protector_test.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:- chmod a+x tpm2_key_protector_test CLEANFILES += tpm2_key_protector_test EXTRA_DIST += dist_noinst_DATA += tests/tpm2_key_protector_test.in dist_grubconf_DATA += util/grub.d/README dist_noinst_DATA += grub-2.14~git20250718.0e36779/po/0000755000175000017500000000000015036452576012511 500000000000000grub-2.14~git20250718.0e36779/po/en@boldquot.header0000644000175000017500000000247115000202015016027 00000000000000# All this catalog "translates" are quotation characters. # The msgids must be ASCII and therefore cannot contain real quotation # characters, only substitutes like grave accent (0x60), apostrophe (0x27) # and double quote (0x22). These substitutes look strange; see # http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html # # This catalog translates grave accent (0x60) and apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019). # It also translates pairs of apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019) # and pairs of quotation mark (0x22) to # left double quotation mark (U+201C) and right double quotation mark (U+201D). # # When output to an UTF-8 terminal, the quotation characters appear perfectly. # When output to an ISO-8859-1 terminal, the single quotation marks are # transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to # grave/acute accent (by libiconv), and the double quotation marks are # transliterated to 0x22. # When output to an ASCII terminal, the single quotation marks are # transliterated to apostrophes, and the double quotation marks are # transliterated to 0x22. # # This catalog furthermore displays the text between the quotation marks in # bold face, assuming the VT100/XTerm escape sequences. # grub-2.14~git20250718.0e36779/po/POTFILES-shell.in0000644000175000017500000000213315036452440015300 00000000000000util/bash-completion.d/grub-bios-setup.bash.in util/bash-completion.d/grub-completion.bash.in util/bash-completion.d/grub-editenv.bash.in util/bash-completion.d/grub-install.bash.in util/bash-completion.d/grub-mkconfig.bash.in util/bash-completion.d/grub-mkfont.bash.in util/bash-completion.d/grub-mkimage.bash.in util/bash-completion.d/grub-mkpasswd-pbkdf2.bash.in util/bash-completion.d/grub-mkrescue.bash.in util/bash-completion.d/grub-probe.bash.in util/bash-completion.d/grub-reboot.bash.in util/bash-completion.d/grub-script-check.bash.in util/bash-completion.d/grub-set-default.bash.in util/bash-completion.d/grub-sparc64-setup.bash.in util/grub-kbdcomp.in util/grub-mkconfig.in util/grub-mkconfig_lib.in util/grub-reboot.in util/grub-set-default.in util/grub.d/00_header.in util/grub.d/10_hurd.in util/grub.d/10_illumos.in util/grub.d/10_kfreebsd.in util/grub.d/10_linux.in util/grub.d/10_netbsd.in util/grub.d/10_windows.in util/grub.d/10_xnu.in util/grub.d/20_linux_xen.in util/grub.d/25_bli.in util/grub.d/30_os-prober.in util/grub.d/30_uefi-firmware.in util/grub.d/40_custom.in util/grub.d/41_custom.in grub-2.14~git20250718.0e36779/po/Makefile.in.in0000644000175000017500000004274215036452440015102 00000000000000# Makefile for PO directory in any package using GNU gettext. # Copyright (C) 1995-1997, 2000-2007, 2009-2010 by Ulrich Drepper # # This file can be copied and used freely without restrictions. It can # be used in projects which are not available under the GNU General Public # License but which still want to provide support for the GNU gettext # functionality. # Please note that the actual code of GNU gettext is covered by the GNU # General Public License and is *not* in the public domain. # # Origin: gettext-0.18.3 GETTEXT_MACRO_VERSION = 0.18 PACKAGE = @PACKAGE@ VERSION = @VERSION@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ SED = @SED@ SHELL = @SHELL@ @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ datarootdir = @datarootdir@ datadir = @datadir@ localedir = @localedir@ gettextsrcdir = $(datadir)/gettext/po INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ # We use $(mkdir_p). # In automake <= 1.9.x, $(mkdir_p) is defined either as "mkdir -p --" or as # "$(mkinstalldirs)" or as "$(install_sh) -d". For these automake versions, # @install_sh@ does not start with $(SHELL), so we add it. # In automake >= 1.10, @mkdir_p@ is derived from ${MKDIR_P}, which is defined # either as "/path/to/mkdir -p" or ".../install-sh -c -d". For these automake # versions, $(mkinstalldirs) and $(install_sh) are unused. mkinstalldirs = $(SHELL) @install_sh@ -d install_sh = $(SHELL) @install_sh@ MKDIR_P = @MKDIR_P@ mkdir_p = @mkdir_p@ GMSGFMT_ = @GMSGFMT@ GMSGFMT_no = @GMSGFMT@ GMSGFMT_yes = @GMSGFMT_015@ GMSGFMT = $(GMSGFMT_$(USE_MSGCTXT)) MSGFMT_ = @MSGFMT@ MSGFMT_no = @MSGFMT@ MSGFMT_yes = @MSGFMT_015@ MSGFMT = $(MSGFMT_$(USE_MSGCTXT)) XGETTEXT_ = @XGETTEXT@ XGETTEXT_no = @XGETTEXT@ XGETTEXT_yes = @XGETTEXT_015@ XGETTEXT = $(XGETTEXT_$(USE_MSGCTXT)) MSGMERGE = msgmerge MSGMERGE_UPDATE = @MSGMERGE@ --update MSGINIT = msginit MSGCONV = msgconv MSGFILTER = msgfilter POFILES = @POFILES@ GMOFILES = @GMOFILES@ UPDATEPOFILES = @UPDATEPOFILES@ DUMMYPOFILES = @DUMMYPOFILES@ DISTFILES.common = Makefile.in.in remove-potcdate.sin \ $(DISTFILES.common.extra1) $(DISTFILES.common.extra2) $(DISTFILES.common.extra3) DISTFILES = $(DISTFILES.common) Makevars POTFILES.in \ $(POFILES) $(GMOFILES) \ $(DISTFILES.extra1) $(DISTFILES.extra2) $(DISTFILES.extra3) POTFILES = \ CATALOGS = @CATALOGS@ # Makevars gets inserted here. (Don't remove this line!) .SUFFIXES: .SUFFIXES: .po .gmo .mo .sed .sin .nop .po-create .po-update .po.mo: @echo "$(MSGFMT) -c -o $@ $<"; \ $(MSGFMT) --endianness=little -c -o t-$@ $< && mv t-$@ $@ .po.gmo: @lang=`echo $* | sed -e 's,.*/,,'`; \ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ echo "$${cdcmd}rm -f $${lang}.gmo && $(GMSGFMT) --endianness=little -c --statistics --verbose -o $${lang}.gmo $${lang}.po"; \ cd $(srcdir) && rm -f $${lang}.gmo && $(GMSGFMT) --endianness=little -c --statistics --verbose -o t-$${lang}.gmo $${lang}.po && mv t-$${lang}.gmo $${lang}.gmo .sin.sed: sed -e '/^#/d' $< > t-$@ mv t-$@ $@ all: all-@USE_NLS@ all-yes: stamp-po all-no: # Ensure that the gettext macros and this Makefile.in.in are in sync. CHECK_MACRO_VERSION = \ test "$(GETTEXT_MACRO_VERSION)" = "@GETTEXT_MACRO_VERSION@" \ || { echo "*** error: gettext infrastructure mismatch: using a Makefile.in.in from gettext version $(GETTEXT_MACRO_VERSION) but the autoconf macros are from gettext version @GETTEXT_MACRO_VERSION@" 1>&2; \ exit 1; \ } # $(srcdir)/$(DOMAIN).pot is only created when needed. When xgettext finds no # internationalized messages, no $(srcdir)/$(DOMAIN).pot is created (because # we don't want to bother translators with empty POT files). We assume that # LINGUAS is empty in this case, i.e. $(POFILES) and $(GMOFILES) are empty. # In this case, stamp-po is a nop (i.e. a phony target). # stamp-po is a timestamp denoting the last time at which the CATALOGS have # been loosely updated. Its purpose is that when a developer or translator # checks out the package via CVS, and the $(DOMAIN).pot file is not in CVS, # "make" will update the $(DOMAIN).pot and the $(CATALOGS), but subsequent # invocations of "make" will do nothing. This timestamp would not be necessary # if updating the $(CATALOGS) would always touch them; however, the rule for # $(POFILES) has been designed to not touch files that don't need to be # changed. stamp-po: $(srcdir)/$(DOMAIN).pot @$(CHECK_MACRO_VERSION) test ! -f $(srcdir)/$(DOMAIN).pot || \ test -z "$(GMOFILES)" || $(MAKE) $(GMOFILES) @test ! -f $(srcdir)/$(DOMAIN).pot || { \ echo "touch stamp-po" && \ echo timestamp > stamp-poT && \ mv stamp-poT stamp-po; \ } # Note: Target 'all' must not depend on target '$(DOMAIN).pot-update', # otherwise packages like GCC can not be built if only parts of the source # have been downloaded. # This target rebuilds $(DOMAIN).pot; it is an expensive operation. # Note that $(DOMAIN).pot is not touched if it doesn't need to be changed. # The determination of whether the package xyz is a GNU one is based on the # heuristic whether some file in the top level directory mentions "GNU xyz". # If GNU 'find' is available, we avoid grepping through monster files. $(DOMAIN).pot-update: $(POTFILES) $(srcdir)/POTFILES.in $(srcdir)/POTFILES-shell.in remove-potcdate.sed if { if (LC_ALL=C find --version) 2>/dev/null | grep GNU >/dev/null; then \ LC_ALL=C find -L $(top_srcdir) -maxdepth 1 -type f -size -10000000c -exec grep 'GNU @PACKAGE@' /dev/null '{}' ';' 2>/dev/null; \ else \ LC_ALL=C grep 'GNU @PACKAGE@' $(top_srcdir)/* 2>/dev/null; \ fi; \ } | grep -v 'libtool:' >/dev/null; then \ package_gnu='GNU '; \ else \ package_gnu=''; \ fi; \ if test -n '$(MSGID_BUGS_ADDRESS)' || test '$(PACKAGE_BUGREPORT)' = '@'PACKAGE_BUGREPORT'@'; then \ msgid_bugs_address='$(MSGID_BUGS_ADDRESS)'; \ else \ msgid_bugs_address='$(PACKAGE_BUGREPORT)'; \ fi; \ case `$(XGETTEXT) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \ '' | 0.[0-9] | 0.[0-9].* | 0.1[0-5] | 0.1[0-5].* | 0.16 | 0.16.[0-1]*) \ $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \ --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) @XGETTEXT_EXTRA_OPTIONS@ \ --files-from=$(srcdir)/POTFILES.in \ --copyright-holder='$(COPYRIGHT_HOLDER)' \ --msgid-bugs-address="$$msgid_bugs_address" \ ;; \ *) \ $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \ --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) @XGETTEXT_EXTRA_OPTIONS@ \ --files-from=$(srcdir)/POTFILES.in \ --copyright-holder='$(COPYRIGHT_HOLDER)' \ --package-name="$${package_gnu}@PACKAGE@" \ --package-version='@VERSION@' \ --msgid-bugs-address="$$msgid_bugs_address" \ ;; \ esac; \ case `$(XGETTEXT) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \ '' | 0.[0-9] | 0.[0-9].* | 0.1[0-5] | 0.1[0-5].* | 0.16 | 0.16.[0-1]*) \ $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \ --add-comments=TRANSLATORS: @XGETTEXT_EXTRA_OPTIONS@ \ --files-from=$(srcdir)/POTFILES-shell.in \ --copyright-holder='$(COPYRIGHT_HOLDER)' \ --msgid-bugs-address="$$msgid_bugs_address" \ --join-existing --language=Shell \ --keyword=gettext_quoted --keyword=gettext_printf \ ;; \ *) \ $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \ --add-comments=TRANSLATORS: @XGETTEXT_EXTRA_OPTIONS@ \ --files-from=$(srcdir)/POTFILES-shell.in \ --copyright-holder='$(COPYRIGHT_HOLDER)' \ --package-name="$${package_gnu}@PACKAGE@" \ --package-version='@VERSION@' \ --msgid-bugs-address="$$msgid_bugs_address" \ --join-existing --language=Shell \ --keyword=gettext_quoted --keyword=gettext_printf \ ;; \ esac; \ test ! -f $(DOMAIN).po || { \ sed -f grub.d.sed < $(DOMAIN).po > $(DOMAIN).1po && \ mv $(DOMAIN).1po $(DOMAIN).po; \ if test -f $(srcdir)/$(DOMAIN).pot; then \ sed -f remove-potcdate.sed < $(srcdir)/$(DOMAIN).pot > $(DOMAIN).1po && \ sed -f remove-potcdate.sed < $(DOMAIN).po > $(DOMAIN).2po && \ if cmp $(DOMAIN).1po $(DOMAIN).2po >/dev/null 2>&1; then \ rm -f $(DOMAIN).1po $(DOMAIN).2po $(DOMAIN).po; \ else \ rm -f $(DOMAIN).1po $(DOMAIN).2po $(srcdir)/$(DOMAIN).pot && \ mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \ fi; \ else \ mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \ fi; \ } # This rule has no dependencies: we don't need to update $(DOMAIN).pot at # every "make" invocation, only create it when it is missing. # Only "make $(DOMAIN).pot-update" or "make dist" will force an update. $(srcdir)/$(DOMAIN).pot: $(MAKE) $(DOMAIN).pot-update # This target rebuilds a PO file if $(DOMAIN).pot has changed. # Note that a PO file is not touched if it doesn't need to be changed. $(POFILES): $(srcdir)/$(DOMAIN).pot @lang=`echo $@ | sed -e 's,.*/,,' -e 's/\.po$$//'`; \ if test -f "$(srcdir)/$${lang}.po"; then \ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ echo "$${cdcmd}$(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) --lang=$${lang} $${lang}.po $(DOMAIN).pot"; \ cd $(srcdir) \ && { case `$(MSGMERGE_UPDATE) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \ '' | 0.[0-9] | 0.[0-9].* | 0.1[0-7] | 0.1[0-7].*) \ $(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) $${lang}.po $(DOMAIN).pot;; \ *) \ $(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) --lang=$${lang} $${lang}.po $(DOMAIN).pot;; \ esac; \ }; \ else \ $(MAKE) $${lang}.po-create; \ fi install: install-exec install-data install-exec: install-data: install-data-@USE_NLS@ if test "$(PACKAGE)" = "gettext-tools"; then \ $(mkdir_p) $(DESTDIR)$(gettextsrcdir); \ for file in $(DISTFILES.common) Makevars.template; do \ $(INSTALL_DATA) $(srcdir)/$$file \ $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ for file in Makevars; do \ rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ else \ : ; \ fi install-data-no: all install-data-yes: all @catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ dir=$(localedir)/$$lang/LC_MESSAGES; \ $(mkdir_p) $(DESTDIR)$$dir; \ if test -r $$cat; then realcat=$$cat; else realcat=$(srcdir)/$$cat; fi; \ $(INSTALL_DATA) $$realcat $(DESTDIR)$$dir/$(DOMAIN).mo; \ echo "installing $$realcat as $(DESTDIR)$$dir/$(DOMAIN).mo"; \ for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ if test -n "$$lc"; then \ if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ for file in *; do \ if test -f $$file; then \ ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ fi; \ done); \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ else \ if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ :; \ else \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ fi; \ fi; \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ ln -s ../LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ ln $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ cp -p $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ echo "installing $$realcat link as $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo"; \ fi; \ done; \ done install-strip: install installdirs: installdirs-exec installdirs-data installdirs-exec: installdirs-data: installdirs-data-@USE_NLS@ if test "$(PACKAGE)" = "gettext-tools"; then \ $(mkdir_p) $(DESTDIR)$(gettextsrcdir); \ else \ : ; \ fi installdirs-data-no: installdirs-data-yes: @catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ dir=$(localedir)/$$lang/LC_MESSAGES; \ $(mkdir_p) $(DESTDIR)$$dir; \ for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ if test -n "$$lc"; then \ if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ for file in *; do \ if test -f $$file; then \ ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ fi; \ done); \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ else \ if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ :; \ else \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ fi; \ fi; \ fi; \ done; \ done # Define this as empty until I found a useful application. installcheck: uninstall: uninstall-exec uninstall-data uninstall-exec: uninstall-data: uninstall-data-@USE_NLS@ if test "$(PACKAGE)" = "gettext-tools"; then \ for file in $(DISTFILES.common) Makevars.template; do \ rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ else \ : ; \ fi uninstall-data-no: uninstall-data-yes: catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ for lc in LC_MESSAGES $(EXTRA_LOCALE_CATEGORIES); do \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ done; \ done check: all info dvi ps pdf html tags TAGS ctags CTAGS ID: mostlyclean: rm -f remove-potcdate.sed rm -f stamp-poT rm -f core core.* $(DOMAIN).po $(DOMAIN).1po $(DOMAIN).2po *.new.po rm -fr *.o clean: mostlyclean distclean: clean rm -f Makefile Makefile.in POTFILES *.mo maintainer-clean: distclean @echo "This command is intended for maintainers to use;" @echo "it deletes files that may require special tools to rebuild." rm -f stamp-po $(GMOFILES) distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) dist distdir: $(MAKE) update-po @$(MAKE) dist2 # This is a separate target because 'update-po' must be executed before. dist2: stamp-po $(DISTFILES) dists="$(DISTFILES)"; \ if test "$(PACKAGE)" = "gettext-tools"; then \ dists="$$dists Makevars.template"; \ fi; \ if test -f $(srcdir)/$(DOMAIN).pot; then \ dists="$$dists $(DOMAIN).pot stamp-po"; \ fi; \ if test -f $(srcdir)/ChangeLog; then \ dists="$$dists ChangeLog"; \ fi; \ for i in 0 1 2 3 4 5 6 7 8 9; do \ if test -f $(srcdir)/ChangeLog.$$i; then \ dists="$$dists ChangeLog.$$i"; \ fi; \ done; \ if test -f $(srcdir)/LINGUAS; then dists="$$dists LINGUAS"; fi; \ for file in $$dists; do \ if test -f $$file; then \ cp -p $$file $(distdir) || exit 1; \ else \ cp -p $(srcdir)/$$file $(distdir) || exit 1; \ fi; \ done update-po: Makefile $(MAKE) $(DOMAIN).pot-update test -z "$(UPDATEPOFILES)" || $(MAKE) $(UPDATEPOFILES) $(MAKE) update-gmo # General rule for creating PO files. .nop.po-create: @lang=`echo $@ | sed -e 's/\.po-create$$//'`; \ echo "File $$lang.po does not exist. If you are a translator, you can create it through 'msginit'." 1>&2; \ exit 1 # General rule for updating PO files. .nop.po-update: @lang=`echo $@ | sed -e 's/\.po-update$$//'`; \ if test "$(PACKAGE)" = "gettext-tools"; then PATH=`pwd`/../src:$$PATH; fi; \ tmpdir=`pwd`; \ echo "$$lang:"; \ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ echo "$${cdcmd}$(MSGMERGE) $(MSGMERGE_OPTIONS) --lang=$$lang $$lang.po $(DOMAIN).pot -o $$lang.new.po"; \ cd $(srcdir); \ if { case `$(MSGMERGE) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \ '' | 0.[0-9] | 0.[0-9].* | 0.1[0-7] | 0.1[0-7].*) \ $(MSGMERGE) $(MSGMERGE_OPTIONS) -o $$tmpdir/$$lang.new.po $$lang.po $(DOMAIN).pot;; \ *) \ $(MSGMERGE) $(MSGMERGE_OPTIONS) --lang=$$lang -o $$tmpdir/$$lang.new.po $$lang.po $(DOMAIN).pot;; \ esac; \ }; then \ if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ rm -f $$tmpdir/$$lang.new.po; \ else \ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ :; \ else \ echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ exit 1; \ fi; \ fi; \ else \ echo "msgmerge for $$lang.po failed!" 1>&2; \ rm -f $$tmpdir/$$lang.new.po; \ fi $(DUMMYPOFILES): update-gmo: Makefile $(GMOFILES) @: # Recreate Makefile by invoking config.status. Explicitly invoke the shell, # because execution permission bits may not work on the current file system. # Use @SHELL@, which is the shell determined by autoconf for the use by its # scripts, not $(SHELL) which is hardwired to /bin/sh and may be deficient. Makefile: Makefile.in.in Makevars $(top_builddir)/config.status @POMAKEFILEDEPS@ cd $(top_builddir) \ && @SHELL@ ./config.status $(subdir)/$@.in po-directories force: # Tell versions [3.59,3.63) of GNU make not to export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: grub-2.14~git20250718.0e36779/po/grub.d.sed0000644000175000017500000000004415000202015014251 00000000000000/^#: util\/grub\.d\//a\ #, c-format grub-2.14~git20250718.0e36779/po/cyrillic.sed0000644000175000017500000000247015033157230014725 00000000000000/^Project-Id-Version:/ b /^Report-Msgid-Bugs-To:/ b /^POT-Creation-Date:/ b /^PO-Revision-Date:/ b /^Last-Translator:/ b /^Language-Team:/ b /^Language:/ b /^MIME-Version:/ b /^Content-Type:/ b /^Content-Transfer-Encoding:/ b /^Plural-Forms:/ b s,a,а,g s,b,б,g s,c,ц,g s,d,д,g s,e,е,g s,f,ф,g s,g,г,g s,h,х,g s,i,и,g s,j,й,g s,k,к,g s,l,л,g s,m,м,g s,n,н,g s,o,о,g s,p,п,g s,q,ќ,g s,r,р,g s,s,с,g s,t,т,g s,u,у,g s,v,в,g s,w,ў,g s,x,ѯ,g s,y,ѝ,g s,z,з,g s,A,А,g s,B,Б,g s,C,Ц,g s,D,Д,g s,E,Е,g s,F,Ф,g s,G,Г,g s,H,Х,g s,I,И,g s,J,Й,g s,K,К,g s,L,Л,g s,M,М,g s,N,Н,g s,O,О,g s,P,П,g s,Q,Ќ,g s,R,Р,g s,S,С,g s,T,Т,g s,U,У,g s,V,В,g s,W,Ў,g s,X,Ѯ,g s,Y,Ѝ,g s,Z,З,g s,А,А,g s,Б,Б,g s,Ц,Ц,g s,Д,Д,g s,Е,Е,g s,Ф,Ф,g s,Г,Г,g s,Х,Х,g s,И,И,g s,Й,Й,g s,К,К,g s,Л,Л,g s,М,М,g s,Н,Н,g s,О,О,g s,П,П,g s,Ќ,Ќ,g s,Р,Р,g s,С,С,g s,Т,Т,g s,У,У,g s,В,В,g s,Ў,Ў,g s,Ѯ,Ѯ,g s,Ѝ,Ѝ,g s,З,З,g s,%\([0-9]*\)Ц,%\1C,g s,%\([0-9]*\)ц,%\1c,g s,%\([0-9]*\)д,%\1d,g s,%\([0-9]*\)лд,%\1ld,g s,%\([0-9]*\)ллд,%\1lld,g s,%\([0-9\.\*]*\)с,%\1s,g s,%\([0-9\.\*]*\)м,%\1m,g s,%\([0-9]*\)у,%\1u,g s,%\([0-9]*\)лу,%\1lu,g s,%\([0-9]*\)ллу,%\1llu,g s,%\([0-9]*\)зу,%\1zu,g s,%\([0-9]*\)ѯ,%\1x,g s,%\([0-9]*\)лѯ,%\1lx,g s,%\([0-9]*\)ллѯ,%\1llx,g grub-2.14~git20250718.0e36779/po/en@piglatin.header0000644000175000017500000000040115000202015015774 00000000000000# This catalog in addition to fixing quoting like en@quot translates the # messages into Pig Latin. Can be useful for testing that all strings are # marked even before any translation is available or without knowing any # specific language besides English. grub-2.14~git20250718.0e36779/po/en@quot.header0000644000175000017500000000226315000202015015165 00000000000000# All this catalog "translates" are quotation characters. # The msgids must be ASCII and therefore cannot contain real quotation # characters, only substitutes like grave accent (0x60), apostrophe (0x27) # and double quote (0x22). These substitutes look strange; see # http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html # # This catalog translates grave accent (0x60) and apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019). # It also translates pairs of apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019) # and pairs of quotation mark (0x22) to # left double quotation mark (U+201C) and right double quotation mark (U+201D). # # When output to an UTF-8 terminal, the quotation characters appear perfectly. # When output to an ISO-8859-1 terminal, the single quotation marks are # transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to # grave/acute accent (by libiconv), and the double quotation marks are # transliterated to 0x22. # When output to an ASCII terminal, the single quotation marks are # transliterated to apostrophes, and the double quotation marks are # transliterated to 0x22. # grub-2.14~git20250718.0e36779/po/arabic.sed0000644000175000017500000000214315033157230014331 00000000000000/^Project-Id-Version:/ b /^Report-Msgid-Bugs-To:/ b /^POT-Creation-Date:/ b /^PO-Revision-Date:/ b /^Last-Translator:/ b /^Language-Team:/ b /^Language:/ b /^MIME-Version:/ b /^Content-Type:/ b /^Content-Transfer-Encoding:/ b /^Plural-Forms:/ b s,%\([0-9]*\)C,%\1#,g s,a,ا,g s,b,ب,g s,c,ص,g s,d,د,g s,e,ع,g s,f,ف,g s,g,غ,g s,h,ه,g s,i,ִي,g s,j,يِ,g s,k,ك,g s,l,ل,g s,m,م,g s,n,ن,g s,o,و,g s,p,پ‎,g s,q,ق,g s,r,ر,g s,s,س,g s,t,ت,g s,u,و,g s,v,و,g s,w,و,g s,x,كس,g s,y,ي,g s,z,ز,g s,A,ا,g s,B,ب,g s,C,ص,g s,D,د,g s,E,ع,g s,F,ف,g s,G,غ,g s,H,ه,g s,I,ִي,g s,J,يِ,g s,K,ك,g s,L,ل,g s,M,م,g s,N,ن,g s,O,و,g s,P,پ‎,g s,Q,ق,g s,R,ر,g s,S,س,g s,T,ت,g s,U,و,g s,V,و,g s,W,و,g s,X,كس,g s,Y,ي,g s,Z,ز,g s,%\([0-9]*\)#,%\1C,g s,%\([0-9]*\)ص,%\1c,g s,%\([0-9]*\)د,%\1d,g s,%\([0-9]*\)لد,%\1ld,g s,%\([0-9]*\)للد,%\1lld,g s,%\([0-9\.\*]*\)س,%\1s,g s,%\([0-9\.\*]*\)م,%\1m,g s,%\([0-9]*\)و,%\1u,g s,%\([0-9]*\)لو,%\1lu,g s,%\([0-9]*\)للو,%\1llu,g s,%\([0-9]*\)زو,%\1zu,g s,%\([0-9]*\)كس,%\1x,g s,%\([0-9]*\)لكس,%\1lx,g s,%\([0-9]*\)للكس,%\1llx,g grub-2.14~git20250718.0e36779/po/Rules-quot0000644000175000017500000000341115036447570014431 00000000000000# Special Makefile rules for English message catalogs with quotation marks. DISTFILES.common.extra1 = quot.sed boldquot.sed en@quot.header en@boldquot.header insert-header.sin Rules-quot .SUFFIXES: .insert-header .po-update-en en@quot.po-create: $(MAKE) en@quot.po-update en@boldquot.po-create: $(MAKE) en@boldquot.po-update en@quot.po-update: en@quot.po-update-en en@boldquot.po-update: en@boldquot.po-update-en .insert-header.po-update-en: @lang=`echo $@ | sed -e 's/\.po-update-en$$//'`; \ if test "$(PACKAGE)" = "gettext-tools"; then PATH=`pwd`/../src:$$PATH; GETTEXTLIBDIR=`cd $(top_srcdir)/src && pwd`; export GETTEXTLIBDIR; fi; \ tmpdir=`pwd`; \ echo "$$lang:"; \ ll=`echo $$lang | sed -e 's/@.*//'`; \ LC_ALL=C; export LC_ALL; \ cd $(srcdir); \ if $(MSGINIT) -i $(DOMAIN).pot --no-translator -l $$lang -o - 2>/dev/null | sed -f $$tmpdir/$$lang.insert-header | $(MSGCONV) -t UTF-8 | $(MSGFILTER) $(SED) -f `echo $$lang | sed -e 's/.*@//'`.sed 2>/dev/null > $$tmpdir/$$lang.new.po; then \ if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ rm -f $$tmpdir/$$lang.new.po; \ else \ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ :; \ else \ echo "creation of $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ exit 1; \ fi; \ fi; \ else \ echo "creation of $$lang.po failed!" 1>&2; \ rm -f $$tmpdir/$$lang.new.po; \ fi en@quot.insert-header: insert-header.sin sed -e '/^#/d' -e 's/HEADER/en@quot.header/g' $(srcdir)/insert-header.sin > en@quot.insert-header en@boldquot.insert-header: insert-header.sin sed -e '/^#/d' -e 's/HEADER/en@boldquot.header/g' $(srcdir)/insert-header.sin > en@boldquot.insert-header mostlyclean: mostlyclean-quot mostlyclean-quot: rm -f *.insert-header grub-2.14~git20250718.0e36779/po/Makevars0000644000175000017500000000475715036452460014132 00000000000000# Makefile variables for PO directory in any package using GNU gettext. # Usually the message domain is the same as the package name. DOMAIN = $(PACKAGE) # These two variables depend on the location of this directory. subdir = po top_builddir = .. # These options get passed to xgettext. XGETTEXT_OPTIONS = --keyword=_ --keyword=N_ \ \ --flag=_:1:pass-c-format\ --flag=N_:1:pass-c-format\ --flag=error:3:c-format --flag=error_at_line:5:c-format\ \ --from-code=UTF-8\ $${end_of_xgettext_options+} # This is the copyright holder that gets inserted into the header of the # $(DOMAIN).pot file. Set this to the copyright holder of the surrounding # package. (Note that the msgstr strings, extracted from the package's # sources, belong to the copyright holder of the package.) Translators are # expected to transfer the copyright for their translations to this person # or entity, or to disclaim their copyright. The empty string stands for # the public domain; in this case the translators are expected to disclaim # their copyright. COPYRIGHT_HOLDER = Free Software Foundation, Inc. # This is the email address or URL to which the translators shall report # bugs in the untranslated strings: # - Strings which are not entire sentences, see the maintainer guidelines # in the GNU gettext documentation, section 'Preparing Strings'. # - Strings which use unclear terms or require additional context to be # understood. # - Strings which make invalid assumptions about notation of date, time or # money. # - Pluralisation problems. # - Incorrect English spelling. # - Incorrect formatting. # It can be your email address, or a mailing list address where translators # can write to without being subscribed, or the URL of a web page through # which the translators can contact you. MSGID_BUGS_ADDRESS = bug-grub@gnu.org # This is the list of locale categories, beyond LC_MESSAGES, for which the # message catalogs shall be used. It is usually empty. EXTRA_LOCALE_CATEGORIES = # This tells whether the $(DOMAIN).pot file contains messages with an 'msgctxt' # context. Possible values are "yes" and "no". Set this to yes if the # package uses functions taking also a message context, like pgettext(), or # if in $(XGETTEXT_OPTIONS) you define keywords with a context argument. USE_MSGCTXT = no # These options get passed to msgmerge. # Useful options are in particular: # --previous to keep previous msgids of translated messages, # --quiet to reduce the verbosity. MSGMERGE_OPTIONS = grub-2.14~git20250718.0e36779/po/stamp-po0000644000175000017500000000001215036452576014105 00000000000000timestamp grub-2.14~git20250718.0e36779/po/greek.sed0000644000175000017500000000251615033157230014211 00000000000000/^Project-Id-Version:/ b /^Report-Msgid-Bugs-To:/ b /^POT-Creation-Date:/ b /^PO-Revision-Date:/ b /^Last-Translator:/ b /^Language-Team:/ b /^Language:/ b /^MIME-Version:/ b /^Content-Type:/ b /^Content-Transfer-Encoding:/ b /^Plural-Forms:/ b s,%\([0-9]*\)C,%\1#,g s,a,α,g s,b,ϭ,g s,c,ϲ,g s,d,δ,g s,e,ε,g s,f,φ,g s,g,γ,g s,h,χ,g s,i,ι,g s,j,ϊ,g s,k,κ,g s,l,λ,g s,m,μ,g s,n,ν,g s,o,ο,g s,p,π,g s,q,ϗ,g s,r,ρ,g s,s,σ,g s,t,τ,g s,u,υ,g s,v,β,g s,w,ω,g s,x,ξ,g s,y,ϋ,g s,z,ζ,g s,A,Α,g s,B,Ϭ,g s,C,ϲ,g s,D,Δ,g s,E,Ε,g s,F,Φ,g s,G,Γ,g s,H,Χ,g s,I,Ι,g s,J,Ϊ,g s,K,Κ,g s,L,Λ,g s,M,Μ,g s,N,Ν,g s,O,Ο,g s,P,Π,g s,Q,Ϗ,g s,R,Ρ,g s,S,Σ,g s,T,Τ,g s,U,Υ,g s,V,Β,g s,W,Ω,g s,X,Ξ,g s,Y,Ϋ,g s,Z,Ζ,g s,А,А,g s,Б,Б,g s,Ц,Ц,g s,Д,Д,g s,Е,Е,g s,Ф,Ф,g s,Г,Г,g s,Х,Х,g s,И,И,g s,Й,Й,g s,К,К,g s,Л,Л,g s,М,М,g s,Н,Н,g s,О,О,g s,П,П,g s,Ќ,Ќ,g s,Р,Р,g s,С,С,g s,Т,Т,g s,У,У,g s,В,В,g s,Ў,Ў,g s,Ѯ,Ѯ,g s,Ѝ,Ѝ,g s,З,З,g s,%\([0-9]*\)#,%\1C,g s,%\([0-9]*\)ϲ,%\1c,g s,%\([0-9]*\)δ,%\1d,g s,%\([0-9]*\)λδ,%\1ld,g s,%\([0-9]*\)λλδ,%\1lld,g s,%\([0-9\.\*]*\)σ,%\1s,g s,%\([0-9\.\*]*\)μ,%\1m,g s,%\([0-9]*\)υ,%\1u,g s,%\([0-9]*\)λυ,%\1lu,g s,%\([0-9]*\)λλυ,%\1llu,g s,%\([0-9]*\)ζυ,%\1zu,g s,%\([0-9]*\)ξ,%\1x,g s,%\([0-9]*\)λξ,%\1lx,g s,%\([0-9]*\)λλξ,%\1llx,g grub-2.14~git20250718.0e36779/po/remove-potcdate.sin0000644000175000017500000000066015000202015016210 00000000000000# Sed script that remove the POT-Creation-Date line in the header entry # from a POT file. # # The distinction between the first and the following occurrences of the # pattern is achieved by looking at the hold space. /^"POT-Creation-Date: .*"$/{ x # Test if the hold space is empty. s/P/P/ ta # Yes it was empty. First occurrence. Remove the line. g d bb :a # The hold space was nonempty. Following occurrences. Do nothing. x :b } grub-2.14~git20250718.0e36779/po/piglatin.sed0000644000175000017500000000111415000202015014676 00000000000000/^Project-Id-Version:/ b /^Report-Msgid-Bugs-To:/ b /^POT-Creation-Date:/ b /^PO-Revision-Date:/ b /^Last-Translator:/ b /^Language-Team:/ b /^Language:/ b /^MIME-Version:/ b /^Content-Type:/ b /^Content-Transfer-Encoding:/ b /^Plural-Forms:/ b s/"\([^"]*\)"/“\1”/g s/`\([^`']*\)'/‘\1’/g s/ '\([^`']*\)' / ‘\1’ /g s/ '\([^`']*\)'$/ ‘\1’/g s/^'\([^`']*\)' /‘\1’ /g s/“”/""/g s,\(^\|[^a-zA-Z0-9%\\]\)\([aoeuiAOEUI]\)\([a-zA-Z]*\),\1\2\3way,g s,\(^\|[^a-zA-Z0-9%\\]\)\([bcdfghj-np-tvwxzBCDFGHJ-NP-TVWXZ][bcdfghj-np-tvwxzBCDFGHJ-NP-TVWXZ]*\)\([a-zA-Z]*\),\1\3\2ay,g grub-2.14~git20250718.0e36779/po/Rules-windowsdir0000644000175000017500000000063415000202015015604 00000000000000# generate windowsdir DISTFILES.common.extra5 = Rules-windowsdir windowsdir="$(top_builddir)/$(PACKAGE)-$(VERSION)-for-windows" windowsdir: $(GMOFILES) test -d "$(windowsdir)/locale" || mkdir "$(windowsdir)/locale" for x in $(CATALOGS); do \ test -d "$(windowsdir)/locale/$${x%.gmo}" || mkdir "$(windowsdir)/locale/$${x%.gmo}"; \ cp -fp "$(srcdir)/$$x" "$(windowsdir)/locale/$${x%.gmo}/grub.mo"; \ done grub-2.14~git20250718.0e36779/po/exclude.pot0000644000175000017500000042320315002425525014575 00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Free Software Foundation, Inc. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "PO-Revision-Date: 2013-05-12 14:21+0200\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" msgid "GPLv3+" msgstr "" #: grub-core/bus/usb/serial/common.c:62 #, c-format msgid "usb%d" msgstr "" #: grub-core/commands/acpi.c:373 msgid "RSDT" msgstr "" #: grub-core/commands/acpi.c:427 msgid "XSDT" msgstr "" #: grub-core/commands/acpi.c:539 msgid "facp" msgstr "" #: grub-core/commands/acpi.c:558 grub-core/commands/acpi.c:559 msgid "dsdt" msgstr "" #: grub-core/commands/acpi.c:678 grub-core/commands/acpihalt.c:371 msgid "DSDT" msgstr "" #: grub-core/commands/acpihalt.c:218 msgid "_S5_" msgstr "" #: grub-core/commands/acpihalt.c:218 msgid "\\_S5_" msgstr "" #: grub-core/commands/acpihalt.c:302 grub-core/kern/emu/hostfs.c:112 #: grub-core/lib/reed_solomon.c:428 grub-core/lib/reed_solomon.c:445 #: util/grub-editenv.c:151 util/grub-editenv.c:156 util/grub-fstest.c:309 #: util/grub-fstest.c:561 util/grub-mkpasswd-pbkdf2.c:176 #: util/grub-mount.c:477 util/grub-setup.c:734 util/misc.c:111 util/misc.c:135 msgid "rb" msgstr "" #: grub-core/commands/acpihalt.c:359 include/grub/acpi.h:61 msgid "FACP" msgstr "" #: grub-core/commands/acpihalt.c:376 msgid "SSDT" msgstr "" #: grub-core/commands/arc/lsdev.c:33 grub-core/commands/cacheinfo.c:43 #: grub-core/commands/xnu_uuid.c:90 grub-core/font/font_cmd.c:56 #: grub-core/fs/zfs/zfsinfo.c:402 grub-core/gettext/gettext.c:492 #: grub-core/hello/hello.c:36 grub-core/lib/arg.c:147 #: grub-core/lib/hexdump.c:63 grub-core/loader/ia64/efi/linux.c:123 #: grub-core/loader/ia64/efi/linux.c:130 grub-core/net/bootp.c:381 #: grub-core/net/bootp.c:417 grub-core/net/dns.c:628 grub-core/net/dns.c:644 #: grub-core/net/net.c:1086 util/grub-mkfont.c:770 util/grub-mkimage.c:1967 #: util/grub-mkrelpath.c:99 util/ieee1275/grub-ofpathname.c:46 #: util/ieee1275/grub-ofpathname.c:51 #, c-format msgid "%s\n" msgstr "" #: grub-core/commands/blocklist.c:46 grub-core/commands/minicmd.c:162 #: grub-core/disk/geli.c:427 grub-core/disk/luks.c:334 #: grub-core/disk/lvm.c:496 grub-core/normal/completion.c:172 msgid "," msgstr "" #: grub-core/commands/blocklist.c:48 #, c-format msgid "%llu" msgstr "" #: grub-core/commands/blocklist.c:50 #, c-format msgid "+%u" msgstr "" #: grub-core/commands/blocklist.c:52 #, c-format msgid "[%u-%u]" msgstr "" #: grub-core/commands/cacheinfo.c:37 #, c-format msgid "(%lu.%lu%%)\n" msgstr "" #: grub-core/commands/cat.c:66 grub-core/commands/minicmd.c:59 #: grub-core/commands/read.c:52 grub-core/normal/auth.c:188 #: util/spkmodem-recv.c:101 #, c-format msgid "%c" msgstr "" msgid "\n" msgstr "" #: grub-core/commands/cat.c:75 grub-core/commands/minicmd.c:63 #, c-format msgid "<%x>" msgstr "" #: grub-core/commands/configfile.c:38 msgid "extract_entries_" msgstr "" #: grub-core/commands/echo.c:116 grub-core/commands/parttool.c:131 #: grub-core/commands/videoinfo.c:54 grub-core/disk/cryptodisk.c:1029 #: grub-core/fs/zfs/zfsinfo.c:38 grub-core/kern/emu/misc.c:74 #: grub-core/kern/emu/misc.c:90 grub-core/kern/emu/misc.c:105 #: grub-core/lib/arg.c:145 grub-core/normal/cmdline.c:367 #: grub-core/normal/cmdline.c:474 grub-core/normal/completion.c:137 #: grub-core/normal/completion.c:348 grub-core/normal/completion.c:358 #: grub-core/normal/completion.c:364 grub-core/normal/completion.c:366 #: grub-core/normal/completion.c:380 grub-core/normal/completion.c:451 #: grub-core/normal/misc.c:97 grub-core/normal/misc.c:102 #: grub-core/normal/misc.c:130 grub-core/normal/misc.c:145 #: grub-core/script/execute.c:309 util/grub-probe.c:515 util/grub-probe.c:524 #: util/grub-probe.c:533 #, c-format msgid " " msgstr "" #: grub-core/commands/efi/efifwsetup.c:41 #: grub-core/commands/efi/efifwsetup.c:47 msgid "OsIndications" msgstr "" #: grub-core/commands/efi/efifwsetup.c:66 msgid "OsIndicationsSupported" msgstr "" #: grub-core/commands/efi/fixvideo.c:39 msgid "Intel 945GM" msgstr "" #: grub-core/commands/efi/fixvideo.c:40 msgid "Intel 965GM" msgstr "" #: grub-core/commands/hashsum.c:46 grub-core/commands/verify.c:127 msgid "sha1" msgstr "" #: grub-core/commands/hashsum.c:47 grub-core/commands/verify.c:126 msgid "md5" msgstr "" #: grub-core/commands/hashsum.c:124 grub-core/commands/ls.c:125 #: util/grub-mount.c:304 util/misc.c:82 #, c-format msgid "%s/%s" msgstr "" #: grub-core/commands/hashsum.c:249 grub-core/disk/geli.c:192 #: grub-core/loader/i386/xnu.c:767 util/grub-probe.c:721 #, c-format msgid "%02x" msgstr "" #: grub-core/commands/hashsum.c:250 #, c-format msgid " %s\n" msgstr "" #: grub-core/commands/help.c:51 #, c-format msgid "%s %s" msgstr "" #: grub-core/commands/help.c:126 grub-core/normal/menu.c:682 #: grub-core/normal/menu.c:694 grub-core/normal/menu_entry.c:1128 msgid "" "\n" "\n" msgstr "" #: grub-core/commands/help.c:132 #, c-format msgid "" "%s %s %s\n" "%s\n" msgstr "" #: grub-core/commands/hexdump.c:53 msgid "(mem)" msgstr "" #: grub-core/commands/i386/cmosdump.c:38 #, c-format msgid "%02x: " msgstr "" #: grub-core/commands/i386/cmosdump.c:44 grub-core/commands/testload.c:129 #: grub-core/fs/reiserfs.c:306 grub-core/fs/reiserfs.c:334 #: grub-core/lib/hexdump.c:42 #, c-format msgid "%02x " msgstr "" #: grub-core/commands/i386/cpuid.c:34 grub-core/efiemu/i386/coredetect.c:24 #: grub-core/efiemu/runtime/efiemu.c:187 grub-core/gdb/i386/idt.c:53 #: grub-core/loader/i386/xnu.c:145 grub-core/loader/i386/xnu.c:155 #: grub-core/video/i386/pc/vbe.c:63 grub-core/video/i386/pc/vbe.c:67 #: include/grub/i386/io.h:31 include/grub/i386/io.h:40 #: include/grub/i386/io.h:49 include/grub/i386/tsc.h:52 #: include/grub/i386/tsc.h:73 include/grub/i386/tsc.h:96 msgid "=a" msgstr "" #: grub-core/commands/i386/cpuid.c:35 grub-core/efiemu/i386/coredetect.c:25 #: grub-core/net/tftp.c:347 grub-core/net/tftp.c:348 grub-core/net/tftp.c:349 #: grub-core/normal/menu.c:188 grub-core/script/execute.c:1051 #: grub-core/video/i386/pc/vbe.c:64 msgid "0" msgstr "" #: grub-core/commands/i386/cpuid.c:76 grub-core/efiemu/i386/coredetect.c:41 msgid "i" msgstr "" #: grub-core/commands/i386/cpuid.c:98 msgid "[-l]" msgstr "" #: grub-core/commands/i386/pc/halt.c:118 msgid "[-n]" msgstr "" #: grub-core/commands/iorw.c:50 msgid "in" msgstr "" #: grub-core/commands/iorw.c:67 grub-core/commands/memrw.c:44 #: grub-core/commands/setpci.c:124 msgid "XXXXXXXX" msgstr "" #: grub-core/commands/iorw.c:68 grub-core/commands/memrw.c:67 #: grub-core/commands/setpci.c:125 #, c-format msgid "%x" msgstr "" #: grub-core/commands/iorw.c:72 grub-core/commands/memrw.c:71 #, c-format msgid "0x%x\n" msgstr "" #: grub-core/commands/iorw.c:92 msgid "out" msgstr "" #: grub-core/commands/keylayouts.c:214 #, c-format msgid "%s/layouts/%s.gkb" msgstr "" #: grub-core/commands/keystatus.c:104 msgid "[--shift] [--ctrl] [--alt]" msgstr "" #: grub-core/commands/legacycfg.c:127 grub-core/commands/legacycfg.c:712 #: grub-core/commands/legacycfg.c:717 grub-core/commands/legacycfg.c:724 msgid "legacy" msgstr "" #: grub-core/commands/legacycfg.c:203 msgid "extract_legacy_entries_" msgstr "" #: grub-core/commands/legacycfg.c:204 msgid "legacy_" msgstr "" #: grub-core/commands/legacycfg.c:251 msgid "--no-mem-option" msgstr "" #: grub-core/commands/legacycfg.c:262 msgid "--type=linux" msgstr "" #: grub-core/commands/legacycfg.c:263 msgid "--type=biglinux" msgstr "" #: grub-core/commands/legacycfg.c:271 msgid "--type=multiboot" msgstr "" #: grub-core/commands/legacycfg.c:279 msgid "--type=freebsd" msgstr "" #: grub-core/commands/legacycfg.c:287 msgid "--type=openbsd" msgstr "" #: grub-core/commands/legacycfg.c:295 msgid "--type=netbsd" msgstr "" #: grub-core/commands/legacycfg.c:380 msgid "adXXXXXXXXXXXXsXXXXXXXXXXXXYYY" msgstr "" #: grub-core/commands/legacycfg.c:384 #, c-format msgid "ad%ds%d%c" msgstr "" #: grub-core/commands/legacycfg.c:387 #, c-format msgid "ad%ds%d" msgstr "" #: grub-core/commands/legacycfg.c:390 #, c-format msgid "ad%d" msgstr "" #: grub-core/commands/legacycfg.c:409 msgid "wdXXXXXXXXXXXXY" msgstr "" #: grub-core/commands/legacycfg.c:417 msgid "-r" msgstr "" #: grub-core/commands/legacycfg.c:424 #, c-format msgid "wd%d%c" msgstr "" #: grub-core/commands/legacycfg.c:512 grub-core/loader/multiboot.c:290 msgid "--nounzip" msgstr "" #: grub-core/commands/legacycfg.c:645 msgid "--md5" msgstr "" #: grub-core/commands/loadenv.c:154 grub-core/kern/corecmd.c:43 #: util/grub-editenv.c:190 #, c-format msgid "%s=%s\n" msgstr "" #: grub-core/commands/ls.c:55 grub-core/kern/corecmd.c:95 #, c-format msgid "(%s) " msgstr "" #: grub-core/commands/ls.c:75 grub-core/commands/terminal.c:55 #: grub-core/commands/terminal.c:59 grub-core/commands/terminal.c:78 #: grub-core/disk/cryptodisk.c:756 grub-core/disk/cryptodisk.c:758 #: grub-core/disk/cryptodisk.c:760 grub-core/disk/cryptodisk.c:762 #: grub-core/disk/cryptodisk.c:764 grub-core/disk/cryptodisk.c:766 #: grub-core/disk/cryptodisk.c:773 grub-core/disk/diskfilter.c:365 #: grub-core/net/net.c:1128 util/grub-probe.c:89 util/grub-probe.c:310 #, c-format msgid "%s " msgstr "" #: grub-core/commands/ls.c:102 grub-core/kern/corecmd.c:105 #, c-format msgid "%s%s " msgstr "" #: grub-core/commands/ls.c:102 grub-core/commands/ls.c:168 #: grub-core/commands/test.c:116 grub-core/commands/wildcard.c:451 #: grub-core/disk/ieee1275/ofdisk.c:240 grub-core/fs/iso9660.c:624 #: grub-core/fs/iso9660.c:640 grub-core/fs/zfs/zfs.c:2950 #: grub-core/gfxmenu/gui_string_util.c:129 #: grub-core/gfxmenu/gui_string_util.c:203 grub-core/kern/corecmd.c:105 #: grub-core/kern/emu/hostfs.c:53 grub-core/kern/fs.c:73 #: grub-core/kern/fs.c:97 grub-core/kern/ieee1275/cmain.c:65 #: grub-core/kern/ieee1275/mmap.c:35 grub-core/kern/ieee1275/openfw.c:156 #: grub-core/loader/xnu.c:241 grub-core/loader/xnu.c:252 #: grub-core/loader/xnu.c:1209 grub-core/normal/completion.c:312 #: include/grub/emu/misc.h:37 include/grub/emu/misc.h:39 #: util/grub-editenv.c:36 util/grub-fstest.c:288 util/grub-fstest.c:290 #: util/grub-mount.c:183 msgid "/" msgstr "" #: grub-core/commands/ls.c:123 grub-core/commands/menuentry.c:100 #: grub-core/commands/wildcard.c:310 grub-core/kern/main.c:169 #: grub-core/kern/main.c:173 grub-core/net/drivers/ieee1275/ofnet.c:46 #: util/grub-menulst2cfg.c:106 #, c-format msgid "%s%s" msgstr "" #: grub-core/commands/ls.c:142 #, c-format msgid "%-12llu" msgstr "" #: grub-core/commands/ls.c:144 grub-core/commands/ls.c:150 #, c-format msgid "%-12s" msgstr "" #: grub-core/commands/ls.c:168 #, c-format msgid "%s%s\n" msgstr "" #: grub-core/commands/memrw.c:50 msgid "read_" msgstr "" #: grub-core/commands/memrw.c:91 msgid "write_" msgstr "" #: grub-core/commands/menuentry.c:59 msgid "f1" msgstr "" #: grub-core/commands/menuentry.c:60 msgid "f2" msgstr "" #: grub-core/commands/menuentry.c:61 msgid "f3" msgstr "" #: grub-core/commands/menuentry.c:62 msgid "f4" msgstr "" #: grub-core/commands/menuentry.c:63 msgid "f5" msgstr "" #: grub-core/commands/menuentry.c:64 msgid "f6" msgstr "" #: grub-core/commands/menuentry.c:65 msgid "f7" msgstr "" #: grub-core/commands/menuentry.c:66 msgid "f8" msgstr "" #: grub-core/commands/menuentry.c:67 msgid "f9" msgstr "" #: grub-core/commands/menuentry.c:68 msgid "f10" msgstr "" #: grub-core/commands/menuentry.c:69 msgid "f11" msgstr "" #: grub-core/commands/menuentry.c:70 msgid "f12" msgstr "" #: grub-core/commands/menuentry.c:247 msgid "'\\''" msgstr "" #: grub-core/commands/nativedisk.c:37 msgid "ehcipata" msgstr "" #: grub-core/commands/nativedisk.c:143 #, c-format msgid "(%s)/%s" msgstr "" #: grub-core/commands/nativedisk.c:226 grub-core/commands/parttool.c:190 #: grub-core/efiemu/main.c:239 grub-core/kern/dl.c:721 #: grub-core/normal/autofs.c:73 grub-core/normal/completion.c:146 #: grub-core/normal/crypto.c:89 grub-core/normal/dyncmd.c:103 #: grub-core/normal/term.c:325 #, c-format msgid "%s/" msgstr "" #: grub-core/commands/nativedisk.c:226 grub-core/commands/parttool.c:190 #: grub-core/efiemu/main.c:239 grub-core/kern/dl.c:721 #: grub-core/kern/main.c:186 grub-core/kern/main.c:187 #: grub-core/kern/main.c:188 grub-core/kern/main.c:189 #: grub-core/loader/xnu.c:949 grub-core/loader/xnu.c:1253 #: grub-core/loader/xnu.c:1259 grub-core/normal/autofs.c:73 #: grub-core/normal/crypto.c:89 grub-core/normal/dyncmd.c:103 #: grub-core/normal/term.c:325 util/grub-editenv.c:296 msgid "-" msgstr "" #: grub-core/commands/nativedisk.c:226 grub-core/kern/dl.c:721 #, c-format msgid "/%s.mod" msgstr "" #: grub-core/commands/parttool.c:34 grub-core/lib/pbkdf2.c:26 #: grub-core/parttool/msdospart.c:32 msgid "GPLv2+" msgstr "" #: grub-core/commands/parttool.c:118 msgid "+/-" msgstr "" #: grub-core/commands/parttool.c:191 msgid "/parttool.lst" msgstr "" #: grub-core/commands/password_pbkdf2.c:95 #: grub-core/commands/password_pbkdf2.c:96 #: grub-core/commands/password_pbkdf2.c:99 msgid "grub.pbkdf2.sha512." msgstr "" #: grub-core/commands/pcidump.c:65 #, c-format msgid "%08x " msgstr "" #: grub-core/commands/search.c:80 grub-core/kern/main.c:198 #, c-format msgid "(%s)%s" msgstr "" #: grub-core/commands/search.c:160 grub-core/normal/cmdline.c:204 #, c-format msgid " %s" msgstr "" #: grub-core/commands/search.c:179 grub-core/disk/efi/efidisk.c:855 #: grub-core/kern/device.c:123 grub-core/normal/completion.c:114 #: util/grub-fstest.c:755 util/grub-mount.c:579 util/grub-probe.c:269 #, c-format msgid "%s,%s" msgstr "" #: grub-core/commands/search_file.c:3 msgid "search.file" msgstr "" #: grub-core/commands/search_label.c:3 msgid "search.fs_label" msgstr "" #: grub-core/commands/search_uuid.c:3 msgid "search.fs_uuid" msgstr "" #: grub-core/commands/search_wrap.c:164 msgid "--hint-" msgstr "" #: util/grub-mkpasswd-pbkdf2.c:146 #, c-format msgid "" "\n" "%s" msgstr "" #: util/grub-mkpasswd-pbkdf2.c:176 msgid "/dev/urandom" msgstr "" #: util/grub-mkpasswd-pbkdf2.c:223 util/grub-mkpasswd-pbkdf2.c:225 msgid "grub.pbkdf2.sha512.XXXXXXXXXXXXXXXXXXX.S.S" msgstr "" #: util/grub-mkpasswd-pbkdf2.c:227 #, c-format msgid "grub.pbkdf2.sha512.%d.%s.%s" msgstr "" #: util/grub-probe.c:250 #, c-format msgid "ata%d" msgstr "" #: util/grub-probe.c:256 #, c-format msgid "ahci%d" msgstr "" #: util/grub-probe.c:296 #, c-format msgid "lvm " msgstr "" #: util/grub-probe.c:300 #, c-format msgid "ldm " msgstr "" #: util/grub-probe.c:308 #, c-format msgid "diskfilter " msgstr "" #: util/grub-probe.c:313 #, c-format msgid "raid5rec " msgstr "" #: util/grub-probe.c:315 #, c-format msgid "raid6rec " msgstr "" #: util/grub-probe.c:421 msgid "false\n" msgstr "" #: util/grub-probe.c:429 msgid "true\n" msgstr "" #: util/grub-probe.c:504 #, c-format msgid "--hint-ieee1275='" msgstr "" #: util/grub-probe.c:513 #, c-format msgid "--hint-bios=" msgstr "" #: util/grub-probe.c:522 #, c-format msgid "--hint-efi=" msgstr "" #: util/grub-probe.c:531 #, c-format msgid "--hint-baremetal=" msgstr "" #: util/grub-probe.c:542 #, c-format msgid "--hint='" msgstr "" #: util/grub-probe.c:740 msgid "" "(fs|fs_uuid|fs_label|drive|device|partmap|abstraction|cryptodisk_uuid|" "msdos_parttype)" msgstr "" #: util/grub-probe.c:791 msgid "fs_uuid" msgstr "" #: util/grub-probe.c:793 msgid "fs_label" msgstr "" #: util/grub-probe.c:795 msgid "drive" msgstr "" #: util/grub-probe.c:801 msgid "abstraction" msgstr "" #: util/grub-probe.c:803 msgid "cryptodisk_uuid" msgstr "" #: util/grub-probe.c:805 msgid "msdos_parttype" msgstr "" #: util/grub-probe.c:807 msgid "hints_string" msgstr "" #: util/grub-probe.c:809 msgid "bios_hints" msgstr "" #: util/grub-probe.c:811 msgid "ieee1275_hints" msgstr "" #: util/grub-probe.c:813 msgid "baremetal_hints" msgstr "" #: util/grub-probe.c:815 msgid "efi_hints" msgstr "" #: util/grub-probe.c:817 msgid "arc_hints" msgstr "" #: util/grub-probe.c:819 msgid "compatibility_hint" msgstr "" #: util/grub-probe.c:821 msgid "zero_check" msgstr "" #: util/grub-render-label.c:273 #, c-format msgid "(host)/%s" msgstr "" #: util/grub-setup.c:87 msgid "core.img" msgstr "" #: util/grub-setup.c:147 util/grub-setup.c:173 #, c-format msgid ",%u,%u>" msgstr "" #: util/grub-setup.c:665 msgid "dump.img" msgstr "" #: util/grub-setup.c:672 msgid "dump2.img" msgstr "" #: util/grub-setup.c:896 msgid "r+b" msgstr "" #: util/ieee1275/grub-ofpathname.c:44 msgid "--version" msgstr "" #: util/resolve.c:148 util/resolve.c:170 msgid ".mod" msgstr "" #: util/resolve.c:175 #, c-format msgid "%s.mod" msgstr "" #: util/spkmodem-recv.c:90 #, c-format msgid "%d %d %d @%d\n" msgstr "" #: util/spkmodem-recv.c:99 #, c-format msgid "<%c, %x>" msgstr "" #: util/grub-mkimage.c:764 msgid "moddep.lst" msgstr "" #: util/grub-mkimage.c:766 msgid "kernel.img" msgstr "" #: util/grub-mkimage.c:973 msgid "xz_decompress.img" msgstr "" #: util/grub-mkimage.c:976 msgid "lzma_decompress.img" msgstr "" #: util/grub-mkimage.c:979 msgid "none_decompress.img" msgstr "" #: util/grub-mkimage.c:1079 msgid "pxeboot.img" msgstr "" #: util/grub-mkimage.c:1101 util/grub-mkimage.c:1380 msgid "diskboot.img" msgstr "" #: util/grub-mkimage.c:1158 msgid "PE" msgstr "" #: util/grub-mkimage.c:1263 msgid ".data" msgstr "" #: util/grub-mkimage.c:1275 msgid ".bss" msgstr "" #: util/grub-mkimage.c:1289 msgid "mods" msgstr "" #: util/grub-mkimage.c:1300 msgid ".reloc" msgstr "" #: util/grub-mkimage.c:1321 util/grub-setup.c:86 msgid "boot.img" msgstr "" #: util/grub-mkimage.c:1435 msgid "fwstart_fuloong2f.img" msgstr "" #: util/grub-mkimage.c:1440 msgid "fwstart.img" msgstr "" #: util/grub-mkimage.c:1766 msgid "(xz|none|auto)" msgstr "" #: util/grub-mkimage.c:1798 #, c-format msgid "" "%s\n" "%s %s" msgstr "" #: util/grub-mkimage.c:113 util/grub-mkimage.c:114 msgid "i386-coreboot" msgstr "" #: util/grub-mkimage.c:132 util/grub-mkimage.c:133 msgid "i386-multiboot" msgstr "" #: util/grub-mkimage.c:151 util/grub-mkimage.c:152 util/grub-mkimage.c:167 msgid "i386-pc" msgstr "" #: util/grub-mkimage.c:168 msgid "i386-pc-pxe" msgstr "" #: util/grub-mkimage.c:183 util/grub-mkimage.c:184 msgid "i386-efi" msgstr "" #: util/grub-mkimage.c:199 util/grub-mkimage.c:200 msgid "i386-ieee1275" msgstr "" #: util/grub-mkimage.c:218 util/grub-mkimage.c:219 msgid "i386-qemu" msgstr "" #: util/grub-mkimage.c:233 util/grub-mkimage.c:234 msgid "x86_64-efi" msgstr "" #: util/grub-mkimage.c:249 util/grub-mkimage.c:267 util/grub-mkimage.c:285 msgid "mipsel-loongson" msgstr "" #: util/grub-mkimage.c:250 msgid "mipsel-yeeloong-flash" msgstr "" #: util/grub-mkimage.c:268 msgid "mipsel-fuloong2f-flash" msgstr "" #: util/grub-mkimage.c:286 msgid "mipsel-loongson-elf" msgstr "" #: util/grub-mkimage.c:286 msgid "mipsel-yeeloong-elf" msgstr "" #: util/grub-mkimage.c:287 msgid "mipsel-fuloong2f-elf" msgstr "" #: util/grub-mkimage.c:287 msgid "mipsel-fuloong2e-elf" msgstr "" #: util/grub-mkimage.c:288 msgid "mipsel-fuloong-elf" msgstr "" #: util/grub-mkimage.c:305 util/grub-mkimage.c:306 msgid "powerpc-ieee1275" msgstr "" #: util/grub-mkimage.c:324 util/grub-mkimage.c:339 util/grub-mkimage.c:354 msgid "sparc64-ieee1275" msgstr "" #: util/grub-mkimage.c:325 msgid "sparc64-ieee1275-raw" msgstr "" #: util/grub-mkimage.c:340 msgid "sparc64-ieee1275-cdcore" msgstr "" #: util/grub-mkimage.c:355 msgid "sparc64-ieee1275-aout" msgstr "" #: util/grub-mkimage.c:369 util/grub-mkimage.c:370 msgid "ia64-efi" msgstr "" #: util/grub-mkimage.c:385 util/grub-mkimage.c:386 msgid "mips-arc" msgstr "" #: util/grub-mkimage.c:403 util/grub-mkimage.c:404 msgid "mipsel-arc" msgstr "" #: util/grub-mkimage.c:421 util/grub-mkimage.c:457 msgid "mipsel-qemu_mips" msgstr "" #: util/grub-mkimage.c:422 msgid "mipsel-qemu_mips-elf" msgstr "" #: util/grub-mkimage.c:439 util/grub-mkimage.c:475 msgid "mips-qemu_mips" msgstr "" #: util/grub-mkimage.c:440 msgid "mips-qemu_mips-flash" msgstr "" #: util/grub-mkimage.c:458 msgid "mipsel-qemu_mips-flash" msgstr "" #: util/grub-mkimage.c:476 msgid "mips-qemu_mips-elf" msgstr "" #: grub-core/commands/terminal.c:85 grub-core/commands/terminal.c:145 msgid "--append" msgstr "" #: grub-core/commands/terminal.c:86 grub-core/commands/terminal.c:166 msgid "--remove" msgstr "" #: grub-core/commands/terminal.c:99 grub-core/commands/terminal.c:105 #: grub-core/commands/terminal.c:116 grub-core/commands/terminal.c:151 #: grub-core/commands/terminal.c:172 grub-core/commands/terminal.c:192 #: grub-core/commands/terminal.c:212 grub-core/loader/i386/linux.c:552 msgid "ofconsole" msgstr "" #: grub-core/commands/terminal.c:129 grub-core/commands/terminal.c:130 msgid "serial_usb" msgstr "" #: grub-core/commands/test.c:168 msgid "=" msgstr "" #: grub-core/commands/test.c:169 msgid "==" msgstr "" #: grub-core/commands/test.c:177 msgid "!=" msgstr "" #: grub-core/commands/test.c:186 grub-core/fs/reiserfs.c:569 #: grub-core/kern/emu/argp_common.c:38 util/grub-editenv.c:66 msgid "<" msgstr "" #: grub-core/commands/test.c:194 msgid "<=" msgstr "" #: grub-core/commands/test.c:210 msgid ">=" msgstr "" #: grub-core/commands/test.c:219 msgid "-eq" msgstr "" #: grub-core/commands/test.c:227 msgid "-ge" msgstr "" #: grub-core/commands/test.c:235 msgid "-gt" msgstr "" #: grub-core/commands/test.c:243 msgid "-le" msgstr "" #: grub-core/commands/test.c:251 msgid "-lt" msgstr "" #: grub-core/commands/test.c:259 msgid "-ne" msgstr "" #: grub-core/commands/test.c:269 grub-core/commands/test.c:283 msgid "-pgt" msgstr "" #: grub-core/commands/test.c:270 msgid "-plt" msgstr "" #: grub-core/commands/test.c:295 grub-core/commands/test.c:311 msgid "-nt" msgstr "" #: grub-core/commands/test.c:296 msgid "-ot" msgstr "" #: grub-core/commands/test.c:330 util/grub-fstest.c:492 util/grub-mount.c:422 msgid "-d" msgstr "" #: grub-core/commands/test.c:338 msgid "-e" msgstr "" #: grub-core/commands/test.c:346 msgid "-f" msgstr "" #: grub-core/commands/test.c:355 util/grub-mount.c:552 msgid "-s" msgstr "" #: grub-core/commands/test.c:369 msgid "-n" msgstr "" #: grub-core/commands/test.c:376 msgid "-z" msgstr "" #: grub-core/commands/test.c:387 grub-core/normal/completion.c:120 #: grub-core/normal/completion.c:178 util/grub-mkimagexx.c:349 msgid ")" msgstr "" #: grub-core/commands/test.c:393 msgid "(" msgstr "" #: grub-core/commands/test.c:400 grub-core/script/execute.c:917 msgid "!" msgstr "" #: grub-core/commands/test.c:406 util/grub-fstest.c:408 util/grub-mount.c:383 msgid "-a" msgstr "" #: grub-core/commands/test.c:411 msgid "-o" msgstr "" #: grub-core/commands/test.c:432 msgid "]" msgstr "" #: grub-core/commands/verify.c:128 msgid "ripemd160" msgstr "" #: grub-core/commands/verify.c:130 msgid "sha384" msgstr "" #: grub-core/commands/verify.c:132 msgid "sha224" msgstr "" #: grub-core/commands/verify.c:142 grub-core/commands/verify.c:143 msgid "rsa" msgstr "" #: grub-core/commands/verify.c:144 msgid "dsa" msgstr "" #: grub-core/commands/verify.c:258 msgid "" msgstr "" #: grub-core/commands/verify.c:531 msgid "gcry_dsa" msgstr "" #: grub-core/commands/verify.c:587 #, c-format msgid "%02x%02x " msgstr "" #: grub-core/commands/verify.c:696 msgid "verified_read" msgstr "" #: grub-core/commands/verify.c:714 grub-core/commands/verify.c:718 msgid ".sig" msgstr "" #: grub-core/commands/verify.c:771 grub-core/commands/verify.c:836 msgid "enforce" msgstr "" #: grub-core/commands/verify.c:771 grub-core/commands/verify.c:836 #: grub-core/term/serial.c:217 msgid "no" msgstr "" #: grub-core/commands/videoinfo.c:48 msgid " " msgstr "" #: grub-core/commands/videoinfo.c:52 grub-core/script/execute.c:254 #: grub-core/script/execute.c:296 msgid "*" msgstr "" #: grub-core/commands/videoinfo.c:55 #, c-format msgid " 0x%03x " msgstr "" #: grub-core/commands/videoinfo.c:57 #, c-format msgid "%4d x %4d x %2d (%4d) " msgstr "" #: grub-core/commands/videotest.c:56 grub-core/loader/i386/linux.c:48 #: grub-core/loader/i386/xnu.c:41 grub-core/loader/multiboot.c:57 #: grub-core/loader/multiboot.c:212 grub-core/term/gfxterm.c:36 #: grub-core/video/video.c:437 util/grub-mkimage.c:1907 msgid "auto" msgstr "" #: grub-core/commands/videotest.c:82 grub-core/commands/videotest.c:83 #: grub-core/commands/videotest.c:84 grub-core/gfxmenu/gui_label.c:261 #: grub-core/gfxmenu/gui_list.c:594 grub-core/gfxmenu/gui_progress_bar.c:391 #: grub-core/gfxmenu/view.c:74 msgid "Unknown Regular 16" msgstr "" #: grub-core/commands/videotest.c:85 msgid "Fixed 20" msgstr "" #: grub-core/commands/wildcard.c:234 util/grub-probe.c:387 #, c-format msgid "(%s)" msgstr "" #: grub-core/commands/wildcard.c:301 grub-core/fs/affs.c:421 #: grub-core/fs/hfsplus.c:829 grub-core/fs/iso9660.c:557 #: grub-core/fs/iso9660.c:731 grub-core/fs/reiserfs.c:938 #: grub-core/fs/squash4.c:536 grub-core/fs/udf.c:886 grub-core/fs/xfs.c:522 #: grub-core/gfxmenu/gui_string_util.c:98 grub-core/normal/completion.c:142 #: util/grub-fstest.c:286 msgid ".." msgstr "" #: grub-core/commands/xnu_uuid.c:51 msgid "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" msgstr "" #: grub-core/commands/xnu_uuid.c:59 util/grub-fstest.c:463 msgid "-l" msgstr "" #: grub-core/commands/xnu_uuid.c:75 grub-core/fs/jfs.c:924 #: grub-core/fs/nilfs2.c:1135 #: grub-core/fs/f2fs.c:1259 #, c-format msgid "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x" msgstr "" #: grub-core/disk/ahci.c:968 msgid ", %x, %x (%" msgstr "" #: grub-core/disk/ahci.c:969 grub-core/fs/btrfs.c:720 #: grub-core/fs/zfs/zfs.c:1307 msgid ")\n" msgstr "" #: grub-core/disk/arc/arcdisk.c:117 msgid "partition(0)" msgstr "" #: grub-core/disk/arc/arcdisk.c:119 msgid "partition(10)" msgstr "" #: grub-core/disk/arc/arcdisk.c:166 msgid "arc/" msgstr "" #: grub-core/disk/ata.c:426 grub-core/disk/scsi.c:445 #: grub-core/loader/xnu.c:576 #, c-format msgid "%s%d" msgstr "" #: grub-core/disk/cryptodisk.c:467 #, c-format msgid "crypto%lu" msgstr "" #: grub-core/disk/cryptodisk.c:483 grub-core/disk/cryptodisk.c:486 msgid "cryptouuid/" msgstr "" #: grub-core/disk/cryptodisk.c:753 #, c-format msgid "cryptodisk %s " msgstr "" #: grub-core/disk/cryptodisk.c:1006 grub-core/disk/cryptodisk.c:1026 msgid "luks_mount " msgstr "" #: grub-core/disk/cryptodisk.c:1037 msgid "-ecb" msgstr "" #: grub-core/disk/cryptodisk.c:1040 msgid "-cbc" msgstr "" #: grub-core/disk/cryptodisk.c:1043 msgid "-pcbc" msgstr "" #: grub-core/disk/cryptodisk.c:1046 msgid "-xts" msgstr "" #: grub-core/disk/cryptodisk.c:1049 msgid "-lrw" msgstr "" #: grub-core/disk/cryptodisk.c:1056 msgid "-null" msgstr "" #: grub-core/disk/cryptodisk.c:1059 msgid "-plain" msgstr "" #: grub-core/disk/cryptodisk.c:1062 msgid "-plain64" msgstr "" #: grub-core/disk/cryptodisk.c:1065 msgid "-benbi" msgstr "" #: grub-core/disk/cryptodisk.c:1068 msgid "-essiv:" msgstr "" #: grub-core/disk/cryptodisk.c:1089 grub-core/disk/cryptodisk.c:1101 msgid "luks_script" msgstr "" #: grub-core/disk/diskfilter.c:118 grub-core/disk/diskfilter.c:431 msgid "md" msgstr "" #: grub-core/disk/diskfilter.c:119 grub-core/disk/diskfilter.c:432 #: grub-core/disk/lvm.c:369 grub-core/disk/lvm.c:374 grub-core/disk/lvm.c:375 #: util/grub-probe.c:295 msgid "lvm/" msgstr "" #: grub-core/disk/diskfilter.c:120 grub-core/disk/diskfilter.c:433 #: util/grub-probe.c:299 msgid "ldm/" msgstr "" #: grub-core/disk/diskfilter.c:396 grub-core/disk/diskfilter.c:398 msgid "mduuid/" msgstr "" #: grub-core/disk/diskfilter.c:688 msgid "raid6rec" msgstr "" #: grub-core/disk/diskfilter.c:698 msgid "raid5rec" msgstr "" #: grub-core/disk/diskfilter.c:892 #, c-format msgid "%s_%d" msgstr "" #: grub-core/disk/diskfilter.c:978 #, c-format msgid "md/%s" msgstr "" #: grub-core/disk/dmraid_nvidia.c:173 msgid "dmraid_nv" msgstr "" #: grub-core/disk/efi/efidisk.c:419 grub-core/disk/i386/pc/biosdisk.c:284 #: util/grub-probe.c:192 util/grub-probe.c:221 #, c-format msgid "hd%d" msgstr "" #: grub-core/disk/efi/efidisk.c:428 grub-core/disk/i386/pc/biosdisk.c:284 #: util/grub-probe.c:198 util/grub-probe.c:227 #, c-format msgid "fd%d" msgstr "" #: grub-core/disk/efi/efidisk.c:436 #, c-format msgid "cd%d" msgstr "" #: grub-core/disk/efi/efidisk.c:718 msgid "XdXXXXXXXXXX" msgstr "" #: grub-core/disk/efi/efidisk.c:729 #, c-format msgid "d%d" msgstr "" #: grub-core/disk/geli.c:103 msgid "GEOM::ELI" msgstr "" #: grub-core/disk/geli.c:127 msgid "des" msgstr "" #: grub-core/disk/geli.c:128 msgid "3des" msgstr "" #: grub-core/disk/geli.c:129 msgid "blowfish" msgstr "" #: grub-core/disk/geli.c:130 msgid "cast5" msgstr "" #: grub-core/disk/geli.c:132 grub-core/disk/geli.c:135 msgid "aes" msgstr "" #: grub-core/disk/geli.c:134 msgid "camellia128" msgstr "" #: grub-core/disk/i386/pc/biosdisk.c:281 msgid "cd" msgstr "" #: grub-core/disk/ieee1275/nand.c:84 grub-core/disk/ieee1275/nand.c:85 msgid "nand/" msgstr "" #: grub-core/disk/ieee1275/nand.c:105 grub-core/disk/ieee1275/ofdisk.c:597 msgid "block-size" msgstr "" #: grub-core/disk/ieee1275/nand.c:173 msgid "pio-read" msgstr "" #: grub-core/disk/ieee1275/ofdisk.c:162 msgid "vscsi" msgstr "" #: grub-core/disk/ieee1275/ofdisk.c:182 msgid "vscsi-report-luns" msgstr "" #: grub-core/disk/ieee1275/ofdisk.c:205 msgid "/disk@%" msgstr "" #: grub-core/disk/ieee1275/ofdisk.c:215 grub-core/disk/ieee1275/ofdisk.c:235 #: grub-core/disk/ieee1275/ofdisk.c:370 grub-core/kern/ieee1275/openfw.c:422 msgid "block" msgstr "" #: grub-core/disk/ieee1275/ofdisk.c:281 msgid "sdmmc" msgstr "" #: grub-core/disk/ieee1275/ofdisk.c:292 grub-core/disk/ieee1275/ofdisk.c:295 #: grub-core/disk/ieee1275/ofdisk.c:347 grub-core/disk/ieee1275/ofdisk.c:350 #: grub-core/kern/ieee1275/openfw.c:482 grub-core/kern/ieee1275/openfw.c:492 #: grub-core/term/ieee1275/serial.c:233 grub-core/term/ieee1275/serial.c:238 #: grub-core/term/serial.c:156 grub-core/term/serial.c:158 #: util/grub-probe.c:500 util/grub-probe.c:502 util/grub-probe.c:617 #: util/grub-probe.c:619 msgid "ieee1275/" msgstr "" #: grub-core/disk/ieee1275/ofdisk.c:541 grub-core/kern/ieee1275/init.c:115 #: grub-core/net/drivers/ieee1275/ofnet.c:207 msgid "network" msgstr "" #: grub-core/disk/ldm.c:53 msgid "VBLK" msgstr "" #: grub-core/disk/ldm.c:89 msgid "PRIVHEAD" msgstr "" #: grub-core/disk/ldm.c:362 #, c-format msgid "ldm/%s/%s" msgstr "" #: grub-core/disk/ldm.c:1004 msgid "Volume5" msgstr "" #: grub-core/disk/luks.c:40 msgid "LUKS" msgstr "" #: grub-core/disk/luks.c:150 msgid "ecb" msgstr "" #: grub-core/disk/luks.c:156 grub-core/disk/luks.c:218 msgid "plain" msgstr "" #: grub-core/disk/luks.c:162 grub-core/disk/luks.c:165 msgid "cbc-" msgstr "" #: grub-core/disk/luks.c:167 grub-core/disk/luks.c:170 msgid "pcbc-" msgstr "" #: grub-core/disk/luks.c:172 grub-core/disk/luks.c:175 msgid "xts-" msgstr "" #: grub-core/disk/luks.c:197 grub-core/disk/luks.c:200 msgid "lrw-" msgstr "" #: grub-core/disk/luks.c:220 msgid "plain64" msgstr "" #: grub-core/disk/luks.c:222 msgid "benbi" msgstr "" #: grub-core/disk/luks.c:233 msgid "null" msgstr "" #: grub-core/disk/luks.c:235 msgid "essiv:" msgstr "" #: grub-core/disk/luks.c:40 msgid "LUKS" msgstr "" #: grub-core/disk/mdraid_linux.c:250 #, c-format msgid "md%d" msgstr "" #: grub-core/disk/mdraid_linux.c:263 msgid "mdraid09_be" msgstr "" #: grub-core/disk/memdisk.c:49 msgid "mdsk" msgstr "" #: grub-core/disk/scsi.c:459 #, c-format msgid "%s%d%c" msgstr "" #: grub-core/efiemu/i386/coredetect.c:43 grub-core/efiemu/i386/coredetect.c:50 #: grub-core/efiemu/i386/coredetect.c:55 grub-core/efiemu/i386/coredetect.c:58 msgid "efiemu32.o" msgstr "" #: grub-core/efiemu/i386/coredetect.c:58 msgid "efiemu64.o" msgstr "" #: grub-core/efiemu/i386/pc/cfgtables.c:63 msgid "_SM_" msgstr "" #: grub-core/efiemu/loadcore.c:166 grub-core/efiemu/runtime/efiemu.c:52 msgid ".text-physical" msgstr "" #: grub-core/efiemu/main.c:239 #, c-format msgid "/%s" msgstr "" #: grub-core/efiemu/pnvram.c:129 grub-core/efiemu/pnvram.c:130 #: grub-core/efiemu/pnvram.c:133 msgid "EfiEmu.pnvram." msgstr "" #: grub-core/efiemu/runtime/efiemu.c:50 msgid "_text-physical, _text-physical" msgstr "" #: grub-core/efiemu/runtime/efiemu.c:116 msgid "EFIEMULOG" msgstr "" #: grub-core/fs/affs.c:205 msgid "DOS" msgstr "" #: grub-core/fs/bfs.c:1096 msgid "be:volume_id" msgstr "" #: grub-core/fs/bfs.c:1099 msgid "%016" msgstr "" #: grub-core/fs/btrfs.c:34 msgid "_BHRfS_M" msgstr "" #: grub-core/fs/btrfs.c:414 grub-core/fs/btrfs.c:446 grub-core/fs/btrfs.c:499 msgid " %x %" msgstr "" #: grub-core/fs/btrfs.c:663 grub-core/loader/i386/pc/plan9.c:211 msgid " %" msgstr "" #: grub-core/fs/btrfs.c:663 msgid " \n" msgstr "" #: grub-core/fs/btrfs.c:718 grub-core/fs/btrfs.c:813 grub-core/fs/btrfs.c:1074 msgid "+0x%" msgstr "" #: grub-core/fs/cpio.c:36 msgid "070707" msgstr "" #: grub-core/fs/cpio.c:53 grub-core/loader/linux.c:66 msgid "070701" msgstr "" #: grub-core/fs/cpio.c:54 msgid "070702" msgstr "" #: grub-core/fs/cpio.c:76 msgid "q" msgstr "" #: grub-core/fs/cpio.c:78 msgid "q" msgstr "" #: grub-core/fs/cpio.c:96 msgid "ustar" msgstr "" #: grub-core/fs/cpio.c:246 grub-core/loader/linux.c:193 #: grub-core/loader/linux.c:214 grub-core/loader/linux.c:268 #: grub-core/loader/linux.c:290 msgid "TRAILER!!!" msgstr "" #: grub-core/fs/fat.c:245 msgid "EXFAT " msgstr "" #: grub-core/fs/fat.c:1164 #, c-format msgid "%04x-%04x" msgstr "" #: grub-core/fs/hfsplus.c:1145 grub-core/fs/ntfs.c:1233 #: grub-core/fs/zfs/zfs.c:3484 #, c-format msgid "%016llx" msgstr "" #: grub-core/fs/iso9660.c:287 msgid "ST" msgstr "" #: grub-core/fs/iso9660.c:291 msgid "CE" msgstr "" #: grub-core/fs/iso9660.c:352 msgid "ER" msgstr "" #: grub-core/fs/iso9660.c:402 msgid "SP" msgstr "" #: grub-core/fs/iso9660.c:458 grub-core/fs/udf.c:96 msgid "CD001" msgstr "" #: grub-core/fs/iso9660.c:549 msgid "NM" msgstr "" #: grub-core/fs/iso9660.c:586 msgid "PX" msgstr "" #: grub-core/fs/iso9660.c:608 msgid "SL" msgstr "" #: grub-core/fs/iso9660.c:632 msgid "./" msgstr "" #: grub-core/fs/iso9660.c:636 msgid "../" msgstr "" #: grub-core/fs/jfs.c:364 msgid "JFS1" msgstr "" #: grub-core/fs/minix.c:670 msgid "minix3_be" msgstr "" #: grub-core/fs/minix.c:672 msgid "minix2_be" msgstr "" #: grub-core/fs/minix.c:674 msgid "minix_be" msgstr "" #: grub-core/fs/ntfs.c:483 msgid "ntfscomp" msgstr "" #: grub-core/fs/ntfs.c:757 msgid "/??/" msgstr "" #: grub-core/fs/ntfs.c:894 msgid "INDX" msgstr "" #: grub-core/fs/ntfs.c:938 grub-core/loader/i386/pc/chainloader.c:93 msgid "NTFS" msgstr "" #: grub-core/fs/ntfs.c:1167 msgid "/$Volume" msgstr "" #: grub-core/fs/reiserfs.c:57 msgid "ReIsEr" msgstr "" #: grub-core/fs/reiserfs.c:58 msgid "ReIsErLB" msgstr "" #: grub-core/fs/romfs.c:32 msgid "-rom1fs-" msgstr "" #: grub-core/fs/sfs.c:377 msgid "SFS" msgstr "" #: grub-core/fs/udf.c:94 msgid "BEA01" msgstr "" #: grub-core/fs/udf.c:95 msgid "BOOT2" msgstr "" #: grub-core/fs/udf.c:97 msgid "CDW02" msgstr "" #: grub-core/fs/udf.c:98 msgid "NSR02" msgstr "" #: grub-core/fs/udf.c:99 msgid "NSR03" msgstr "" #: grub-core/fs/udf.c:100 msgid "TEA01" msgstr "" #: grub-core/fs/ufs.c:798 #, c-format msgid "%08x%08x" msgstr "" #: grub-core/fs/ufs.c:847 msgid "ufs1_be" msgstr "" #: grub-core/fs/xfs.c:271 msgid "IN" msgstr "" #: grub-core/fs/xfs.c:325 msgid "BMAP" msgstr "" #: grub-core/fs/xfs.c:674 msgid "XFSB" msgstr "" #: grub-core/fs/zfs/zfs.c:60 msgid "bootfs" msgstr "" #: grub-core/fs/zfs/zfs.c:318 grub-core/fs/zfs/zfs.c:367 #: grub-core/gfxmenu/gui_list.c:432 grub-core/gfxmenu/gui_list.c:443 msgid "inherit" msgstr "" #: grub-core/fs/zfs/zfs.c:319 grub-core/fs/zfs/zfs.c:368 msgid "on" msgstr "" #: grub-core/fs/zfs/zfs.c:320 grub-core/fs/zfs/zfs.c:369 #: grub-core/loader/ia64/efi/linux.c:429 msgid "off" msgstr "" #: grub-core/fs/zfs/zfs.c:321 msgid "lzjb" msgstr "" #: grub-core/fs/zfs/zfs.c:322 msgid "empty" msgstr "" #: grub-core/fs/zfs/zfs.c:323 msgid "gzip-1" msgstr "" #: grub-core/fs/zfs/zfs.c:324 msgid "gzip-2" msgstr "" #: grub-core/fs/zfs/zfs.c:325 msgid "gzip-3" msgstr "" #: grub-core/fs/zfs/zfs.c:326 msgid "gzip-4" msgstr "" #: grub-core/fs/zfs/zfs.c:327 msgid "gzip-5" msgstr "" #: grub-core/fs/zfs/zfs.c:328 msgid "gzip-6" msgstr "" #: grub-core/fs/zfs/zfs.c:329 msgid "gzip-7" msgstr "" #: grub-core/fs/zfs/zfs.c:330 msgid "gzip-8" msgstr "" #: grub-core/fs/zfs/zfs.c:331 msgid "gzip-9" msgstr "" #: grub-core/fs/zfs/zfs.c:332 msgid "zle" msgstr "" #: grub-core/fs/zfs/zfs.c:371 msgid "gang_header" msgstr "" #: grub-core/fs/zfs/zfs.c:372 msgid "zilog" msgstr "" #: grub-core/fs/zfs/zfs.c:373 msgid "fletcher2" msgstr "" #: grub-core/fs/zfs/zfs.c:374 msgid "fletcher4" msgstr "" #: grub-core/fs/zfs/zfs.c:375 grub-core/lib/xzembed/xz_dec_stream.c:445 msgid "SHA256" msgstr "" #: grub-core/fs/zfs/zfs.c:376 msgid "zilog2" msgstr "" #: grub-core/fs/zfs/zfs.c:377 msgid "SHA256+MAC" msgstr "" #: grub-core/fs/zfs/zfs.c:623 grub-core/loader/i386/xnu.c:776 msgid "guid" msgstr "" #: grub-core/fs/zfs/zfs.c:631 msgid "ashift" msgstr "" #: grub-core/fs/zfs/zfs.c:677 msgid "nparity" msgstr "" #: grub-core/fs/zfs/zfs.c:1305 msgid "+%u (%" msgstr "" #: grub-core/fs/zfs/zfs.c:1305 msgid ", %" msgstr "" #: grub-core/fs/zfs/zfs.c:1306 msgid ") -> (0x%" msgstr "" #: grub-core/fs/zfs/zfs.c:1306 grub-core/kern/mm.c:594 msgid ", 0x%" msgstr "" #: grub-core/fs/zfs/zfs.c:1637 msgid "zfscrypt" msgstr "" #: grub-core/fs/zfs/zfs.c:2464 msgid "casesensitivity" msgstr "" #: grub-core/fs/zfs/zfs.c:3940 grub-core/script/execute.c:255 #: grub-core/script/execute.c:317 msgid "@" msgstr "" #: grub-core/gdb/cstub.c:281 grub-core/gdb/cstub.c:293 #: grub-core/gdb/cstub.c:299 grub-core/gdb/cstub.c:327 msgid "OK" msgstr "" #: grub-core/gdb/cstub.c:315 msgid "E01" msgstr "" #: grub-core/gdb/cstub.c:332 msgid "E02" msgstr "" #: grub-core/gdb/i386/idt.c:64 grub-core/gdb/i386/idt.c:65 #: grub-core/gdb/i386/idt.c:71 msgid "m" msgstr "" #: grub-core/gettext/gettext.c:353 #, c-format msgid "%s%s/%s.mo" msgstr "" #: grub-core/gettext/gettext.c:364 #, c-format msgid "%s%s/%s.mo.gz" msgstr "" #: grub-core/gettext/gettext.c:375 #, c-format msgid "%s%s/%s.gmo" msgstr "" #: grub-core/gettext/gettext.c:403 msgid "/locale" msgstr "" #: grub-core/gfxmenu/gfxmenu.c:78 #, c-format msgid "%s/themes/%s" msgstr "" #: grub-core/gfxmenu/gui_box.c:83 grub-core/gfxmenu/gui_canvas.c:75 #: grub-core/gfxmenu/gui_circular_progress.c:71 #: grub-core/gfxmenu/gui_image.c:65 grub-core/gfxmenu/gui_label.c:79 #: grub-core/gfxmenu/gui_list.c:157 grub-core/gfxmenu/gui_progress_bar.c:79 msgid "component" msgstr "" #: grub-core/gfxmenu/gui_box.c:84 grub-core/gfxmenu/gui_canvas.c:76 #: grub-core/gfxmenu/gui_util.c:44 grub-core/gfxmenu/gui_util.c:82 #: grub-core/gfxmenu/theme_loader.c:503 msgid "container" msgstr "" #: grub-core/gfxmenu/gui_circular_progress.c:237 msgid "deg" msgstr "" #: grub-core/gfxmenu/gui_circular_progress.c:249 msgid "num_ticks" msgstr "" #: grub-core/gfxmenu/gui_circular_progress.c:253 msgid "start_angle" msgstr "" #: grub-core/gfxmenu/gui_circular_progress.c:257 msgid "ticks_disappear" msgstr "" #: grub-core/gfxmenu/gui_circular_progress.c:261 msgid "center_bitmap" msgstr "" #: grub-core/gfxmenu/gui_circular_progress.c:267 msgid "tick_bitmap" msgstr "" #: grub-core/gfxmenu/gui_circular_progress.c:273 #: grub-core/gfxmenu/gui_image.c:210 grub-core/gfxmenu/gui_list.c:520 #: grub-core/gfxmenu/gui_progress_bar.c:339 #: grub-core/gfxmenu/theme_loader.c:458 msgid "theme_dir" msgstr "" #: grub-core/gfxmenu/gui_label.c:30 msgid "center" msgstr "" #: grub-core/gfxmenu/gui_label.c:164 grub-core/hook/datehook.c:81 #: grub-core/kern/emu/hostdisk.c:713 grub-core/kern/ieee1275/openfw.c:509 #: grub-core/kern/partition.c:265 grub-core/normal/menu.c:111 #: grub-core/script/execute.c:801 grub-core/script/execute.c:956 #: grub-core/script/execute.c:1004 grub-core/term/tparm.c:544 #, c-format msgid "%d" msgstr "" #: grub-core/gfxmenu/gui_label.c:182 msgid "@KEYMAP_LONG@" msgstr "" #: grub-core/gfxmenu/gui_label.c:186 msgid "@KEYMAP_MIDDLE@" msgstr "" #: grub-core/gfxmenu/gui_label.c:190 msgid "@KEYMAP_SHORT@" msgstr "" #: grub-core/gfxmenu/gui_label.c:205 msgid "align" msgstr "" #: grub-core/gfxmenu/gui_label.c:217 grub-core/gfxmenu/gui_list.c:484 msgid "visible" msgstr "" #: grub-core/gfxmenu/gui_list.c:401 grub-core/gfxmenu/gui_list.c:403 msgid "Typical OS" msgstr "" #: grub-core/gfxmenu/gui_list.c:426 msgid "item_font" msgstr "" #: grub-core/gfxmenu/gui_list.c:430 msgid "selected_item_font" msgstr "" #: grub-core/gfxmenu/gui_list.c:437 msgid "item_color" msgstr "" #: grub-core/gfxmenu/gui_list.c:441 msgid "selected_item_color" msgstr "" #: grub-core/gfxmenu/gui_list.c:454 msgid "icon_width" msgstr "" #: grub-core/gfxmenu/gui_list.c:461 msgid "icon_height" msgstr "" #: grub-core/gfxmenu/gui_list.c:468 msgid "item_height" msgstr "" #: grub-core/gfxmenu/gui_list.c:472 msgid "item_padding" msgstr "" #: grub-core/gfxmenu/gui_list.c:476 msgid "item_icon_space" msgstr "" #: grub-core/gfxmenu/gui_list.c:480 msgid "item_spacing" msgstr "" #: grub-core/gfxmenu/gui_list.c:488 msgid "menu_pixmap_style" msgstr "" #: grub-core/gfxmenu/gui_list.c:494 msgid "selected_item_pixmap_style" msgstr "" #: grub-core/gfxmenu/gui_list.c:500 msgid "scrollbar_frame" msgstr "" #: grub-core/gfxmenu/gui_list.c:506 msgid "scrollbar_thumb" msgstr "" #: grub-core/gfxmenu/gui_list.c:512 msgid "scrollbar_width" msgstr "" #: grub-core/gfxmenu/gui_list.c:516 msgid "scrollbar" msgstr "" #: grub-core/gfxmenu/gui_progress_bar.c:259 msgid "XXXXXXXXXX" msgstr "" #: grub-core/gfxmenu/gui_progress_bar.c:289 msgid "@TIMEOUT_NOTIFICATION_LONG@" msgstr "" #: grub-core/gfxmenu/gui_progress_bar.c:292 msgid "@TIMEOUT_NOTIFICATION_MIDDLE@" msgstr "" #: grub-core/gfxmenu/gui_progress_bar.c:297 msgid "@TIMEOUT_NOTIFICATION_SHORT@" msgstr "" #: grub-core/gfxmenu/gui_progress_bar.c:309 msgid "text_color" msgstr "" #: grub-core/gfxmenu/gui_progress_bar.c:313 msgid "border_color" msgstr "" #: grub-core/gfxmenu/gui_progress_bar.c:317 msgid "bg_color" msgstr "" #: grub-core/gfxmenu/gui_progress_bar.c:321 msgid "fg_color" msgstr "" #: grub-core/gfxmenu/gui_progress_bar.c:325 msgid "bar_style" msgstr "" #: grub-core/gfxmenu/gui_progress_bar.c:332 msgid "highlight_style" msgstr "" #: grub-core/gfxmenu/icon_manager.c:32 grub-core/video/readers/png.c:948 msgid ".png" msgstr "" #: grub-core/gfxmenu/icon_manager.c:201 msgid "icons/" msgstr "" #: grub-core/gfxmenu/theme_loader.c:126 msgid "title-font" msgstr "" #: grub-core/gfxmenu/theme_loader.c:128 msgid "message-font" msgstr "" #: grub-core/gfxmenu/theme_loader.c:130 msgid "terminal-font" msgstr "" #: grub-core/gfxmenu/theme_loader.c:137 msgid "title-color" msgstr "" #: grub-core/gfxmenu/theme_loader.c:139 msgid "message-color" msgstr "" #: grub-core/gfxmenu/theme_loader.c:141 msgid "message-bg-color" msgstr "" #: grub-core/gfxmenu/theme_loader.c:143 msgid "desktop-image" msgstr "" #: grub-core/gfxmenu/theme_loader.c:172 msgid "desktop-color" msgstr "" #: grub-core/gfxmenu/theme_loader.c:174 msgid "terminal-box" msgstr "" #: grub-core/gfxmenu/theme_loader.c:181 msgid "title-text" msgstr "" #: grub-core/gfxmenu/theme_loader.c:418 msgid "image" msgstr "" #: grub-core/gfxmenu/theme_loader.c:422 msgid "vbox" msgstr "" #: grub-core/gfxmenu/theme_loader.c:426 msgid "hbox" msgstr "" #: grub-core/gfxmenu/theme_loader.c:430 msgid "canvas" msgstr "" #: grub-core/gfxmenu/theme_loader.c:434 msgid "progress_bar" msgstr "" #: grub-core/gfxmenu/theme_loader.c:438 msgid "circular_progress" msgstr "" #: grub-core/gfxmenu/theme_loader.c:442 msgid "boot_menu" msgstr "" #: grub-core/gfxmenu/theme_loader.c:459 msgid "theme_path" msgstr "" #: grub-core/gfxmenu/theme_loader.c:552 msgid "top" msgstr "" #: grub-core/gfxmenu/view.c:82 msgid "Fixed 10" msgstr "" #: grub-core/gfxmenu/widget-box.c:38 msgid "nw" msgstr "" #: grub-core/gfxmenu/widget-box.c:38 msgid "ne" msgstr "" #: grub-core/gfxmenu/widget-box.c:38 msgid "se" msgstr "" #: grub-core/gfxmenu/widget-box.c:38 msgid "sw" msgstr "" #: grub-core/gfxmenu/widget-box.c:40 msgid "n" msgstr "" #: grub-core/gfxmenu/widget-box.c:40 msgid "e" msgstr "" #: grub-core/gfxmenu/widget-box.c:40 msgid "s" msgstr "" #: grub-core/gfxmenu/widget-box.c:40 util/grub-menulst2cfg.c:61 msgid "w" msgstr "" #: grub-core/hook/datehook.c:31 msgid "YEAR" msgstr "" #: grub-core/hook/datehook.c:32 msgid "MONTH" msgstr "" #: grub-core/hook/datehook.c:33 msgid "DAY" msgstr "" #: grub-core/hook/datehook.c:34 msgid "HOUR" msgstr "" #: grub-core/hook/datehook.c:35 msgid "MINUTE" msgstr "" #: grub-core/hook/datehook.c:36 msgid "SECOND" msgstr "" #: grub-core/hook/datehook.c:37 msgid "WEEKDAY" msgstr "" #: grub-core/kern/dl.c:412 msgid "grub_mod_init" msgstr "" #: grub-core/kern/dl.c:414 msgid "grub_mod_fini" msgstr "" #: grub-core/kern/dl.c:457 msgid ".module_license" msgstr "" #: grub-core/kern/dl.c:459 msgid "LICENSE=GPLv3" msgstr "" #: grub-core/kern/dl.c:460 msgid "LICENSE=GPLv3+" msgstr "" #: grub-core/kern/dl.c:461 msgid "LICENSE=GPLv2+" msgstr "" #: grub-core/kern/dl.c:481 msgid ".modname" msgstr "" #: grub-core/kern/dl.c:508 msgid ".moddeps" msgstr "" #: grub-core/kern/emu/hostdisk.c:147 msgid "/dev/.devfsd" msgstr "" #: grub-core/kern/emu/hostdisk.c:460 msgid "linear" msgstr "" #: grub-core/kern/emu/hostdisk.c:539 msgid "part" msgstr "" #: grub-core/kern/emu/hostdisk.c:561 util/grub-mkimagexx.c:131 msgid "start" msgstr "" #: grub-core/kern/emu/hostdisk.c:579 grub-core/kern/emu/hostdisk.c:581 #: grub-core/kern/emu/hostdisk.c:877 msgid "/dev/" msgstr "" #: grub-core/kern/emu/hostdisk.c:694 msgid "/disc" msgstr "" #: grub-core/kern/emu/hostdisk.c:697 #, c-format msgid "part%d" msgstr "" #: grub-core/kern/emu/hostdisk.c:699 grub-core/kern/emu/hostdisk.c:700 msgid "/dev/disk/by-id/" msgstr "" #: grub-core/kern/emu/hostdisk.c:703 #, c-format msgid "-part%d" msgstr "" #: grub-core/kern/emu/hostdisk.c:708 #, c-format msgid "p%d" msgstr "" #: grub-core/kern/emu/hostdisk.c:833 grub-core/kern/emu/hostdisk.c:834 #: grub-core/kern/emu/hostdisk.c:835 grub-core/kern/emu/hostdisk.c:1347 #: grub-core/kern/emu/hostdisk.c:1348 grub-core/kern/emu/hostdisk.c:1349 msgid "hostdisk/" msgstr "" #: grub-core/kern/emu/hostdisk.c:954 grub-core/kern/emu/hostdisk.c:961 #: grub-core/kern/emu/hostdisk.c:1003 msgid "kern.geom.debugflags" msgstr "" #: grub-core/kern/emu/hostdisk.c:1250 grub-core/kern/emu/hostdisk.c:1257 #: grub-core/kern/emu/hostdisk.c:1265 grub-core/kern/emu/hostdisk.c:1310 #, c-format msgid "%s:%d: %s" msgstr "" #: grub-core/kern/emu/hostdisk.c:1335 include/grub/util/lvm.h:26 msgid "/dev/mapper/" msgstr "" #: grub-core/kern/emu/misc.c:78 grub-core/kern/emu/misc.c:94 #: grub-core/kern/emu/misc.c:109 #, c-format msgid ".\n" msgstr "" #: grub-core/kern/i386/coreboot/mmap.c:29 msgid "LBIO" msgstr "" #: grub-core/kern/i386/pc/init.c:91 #, c-format msgid "%cd%u" msgstr "" #: grub-core/kern/i386/pc/init.c:97 grub-core/kern/i386/pc/init.c:101 #, c-format msgid ",%u" msgstr "" #: grub-core/kern/ieee1275/cmain.c:66 grub-core/term/ieee1275/console.c:107 msgid "/options" msgstr "" #: grub-core/kern/ieee1275/cmain.c:67 msgid "/openprom" msgstr "" #: grub-core/kern/ieee1275/cmain.c:76 grub-core/kern/ieee1275/cmain.c:77 msgid "SmartFirmware(tm)" msgstr "" #: grub-core/kern/ieee1275/cmain.c:82 msgid "OLPC" msgstr "" #: grub-core/kern/ieee1275/cmain.c:87 msgid "Emulated PC" msgstr "" #: grub-core/kern/ieee1275/cmain.c:90 msgid "IBM" msgstr "" #: grub-core/kern/ieee1275/cmain.c:101 msgid "PowerBook3,3" msgstr "" #: grub-core/kern/ieee1275/cmain.c:111 grub-core/kern/ieee1275/cmain.c:112 #: grub-core/kern/ieee1275/cmain.c:113 msgid "MacRISC" msgstr "" #: grub-core/kern/ieee1275/cmain.c:145 msgid "1.0" msgstr "" #: grub-core/kern/ieee1275/cmain.c:146 msgid "1.1" msgstr "" #: grub-core/kern/ieee1275/cmain.c:147 msgid "1.2" msgstr "" #: grub-core/kern/ieee1275/cmain.c:148 msgid "1.3" msgstr "" #: grub-core/kern/ieee1275/cmain.c:189 msgid "/rom/boot-rom" msgstr "" #: grub-core/kern/ieee1275/cmain.c:190 msgid "/boot-rom" msgstr "" #: grub-core/kern/ieee1275/cmain.c:193 grub-core/kern/ieee1275/cmain.c:194 msgid "PPC Open Hack'Ware" msgstr "" #: grub-core/kern/ieee1275/cmain.c:208 msgid "/chosen" msgstr "" #: grub-core/kern/ieee1275/ieee1275.c:581 msgid "color!" msgstr "" #: grub-core/kern/ieee1275/mmap.c:45 msgid "/memory" msgstr "" #: grub-core/kern/ieee1275/openfw.c:169 msgid "/aliases" msgstr "" #: grub-core/kern/ieee1275/openfw.c:410 #, c-format msgid "\\%s" msgstr "" #: grub-core/kern/ieee1275/openfw.c:483 msgid ",XXXXXXXXXXXX" msgstr "" #: grub-core/kern/ieee1275/openfw.c:509 msgid "XXXXXXXXXXXX" msgstr "" #: grub-core/kern/mips/dl.c:254 msgid "__gnu_local_gp" msgstr "" #: grub-core/kern/misc.c:172 #, c-format msgid "%s:%d: " msgstr "" #: grub-core/kern/misc.c:919 msgid "0x" msgstr "" #: grub-core/kern/misc.c:1018 msgid "(null)" msgstr "" #: grub-core/lib/backtrace.c:47 #, c-format msgid "%p" msgstr "" #: grub-core/lib/crc64.c:100 grub-core/lib/xzembed/xz_dec_stream.c:444 msgid "CRC64" msgstr "" #: grub-core/lib/crypto.c:450 msgid "/dev/tty" msgstr "" #: grub-core/lib/crypto.c:450 msgid "w+c" msgstr "" #: grub-core/lib/i386/backtrace.c:60 grub-core/lib/i386/backtrace.c:63 msgid "grub_backtrace_pointer" msgstr "" #: grub-core/lib/ieee1275/cmos.c:41 msgid "m5819" msgstr "" #: grub-core/lib/ieee1275/datetime.c:37 msgid "rtc" msgstr "" #: grub-core/lib/ieee1275/datetime.c:87 msgid "get-time" msgstr "" #: grub-core/lib/ieee1275/datetime.c:139 msgid "set-time" msgstr "" #: grub-core/lib/ieee1275/halt.c:28 msgid "power-off" msgstr "" #: grub-core/lib/ieee1275/halt.c:29 msgid "shut-down" msgstr "" #: grub-core/lib/ieee1275/halt.c:30 msgid "poweroff" msgstr "" #: grub-core/lib/ieee1275/reboot.c:25 msgid "reset-all" msgstr "" #: grub-core/lib/ieee1275/cmos.c:41 msgid "m5819" msgstr "" #: grub-core/lib/ieee1275/datetime.c:37 msgid "rtc" msgstr "" #: grub-core/lib/ieee1275/datetime.c:87 msgid "get-time" msgstr "" #: grub-core/lib/ieee1275/datetime.c:139 msgid "set-time" msgstr "" #: grub-core/lib/ieee1275/halt.c:28 msgid "power-off" msgstr "" #: grub-core/lib/ieee1275/halt.c:29 msgid "shut-down" msgstr "" #: grub-core/lib/ieee1275/halt.c:30 msgid "poweroff" msgstr "" #: grub-core/lib/ieee1275/reboot.c:25 msgid "reset-all" msgstr "" #: grub-core/lib/posix_wrap/wctype.h:32 grub-core/lib/posix_wrap/wctype.h:42 msgid "xdigit" msgstr "" #: grub-core/lib/posix_wrap/wctype.h:39 msgid "alnum" msgstr "" #: grub-core/lib/posix_wrap/wctype.h:39 msgid "cntrl" msgstr "" #: grub-core/lib/posix_wrap/wctype.h:39 msgid "lower" msgstr "" #: grub-core/lib/posix_wrap/wctype.h:40 msgid "alpha" msgstr "" #: grub-core/lib/posix_wrap/wctype.h:40 msgid "digit" msgstr "" #: grub-core/lib/posix_wrap/wctype.h:41 msgid "print" msgstr "" #: grub-core/lib/posix_wrap/wctype.h:41 msgid "upper" msgstr "" #: grub-core/lib/posix_wrap/wctype.h:41 msgid "blank" msgstr "" #: grub-core/lib/posix_wrap/wctype.h:42 msgid "graph" msgstr "" #: grub-core/lib/posix_wrap/wctype.h:42 msgid "punct" msgstr "" #: grub-core/lib/reed_solomon.c:64 grub-core/lib/reed_solomon.c:65 #: grub-core/lib/reed_solomon.c:66 grub-core/lib/reed_solomon.c:67 #: grub-core/lib/reed_solomon.c:68 grub-core/lib/reed_solomon.c:69 #: grub-core/lib/reed_solomon.c:70 grub-core/lib/reed_solomon.c:71 #: grub-core/lib/reed_solomon.c:72 grub-core/lib/reed_solomon.c:73 #: include/grub/mips/loongson/kernel.h:31 #: include/grub/mips/loongson/memory.h:46 #: include/grub/mips/loongson/memory.h:47 include/grub/mips/loongson/time.h:25 #: include/grub/mips/qemu_mips/memory.h:33 include/grub/mips/time.h:29 #: util/grub-mkimage.c:1253 util/grub-mkimage.c:1564 msgid ".text" msgstr "" #: grub-core/lib/reed_solomon.c:428 msgid "tst.bin" msgstr "" #: grub-core/lib/reed_solomon.c:441 grub-core/lib/reed_solomon.c:445 msgid "tst_rs.bin" msgstr "" #: grub-core/lib/reed_solomon.c:441 grub-core/lib/reed_solomon.c:460 #: grub-core/lib/reed_solomon.c:465 util/grub-editenv.c:121 #: util/grub-editenv.c:209 util/grub-fstest.c:202 util/grub-glue-efi.c:199 #: util/grub-mkfont.c:782 util/grub-mkfont.c:819 util/grub-mkfont.c:843 #: util/grub-mkimage.c:1975 util/grub-render-label.c:257 util/grub-setup.c:665 #: util/grub-setup.c:672 msgid "wb" msgstr "" #: grub-core/lib/reed_solomon.c:460 msgid "tst_dam.bin" msgstr "" #: grub-core/lib/reed_solomon.c:465 msgid "tst_rec.bin" msgstr "" #: grub-core/loader/efi/appleloader.c:142 msgid "Core Duo/Solo" msgstr "" #: grub-core/loader/efi/appleloader.c:143 msgid "Mac Pro" msgstr "" #: grub-core/loader/efi/appleloader.c:144 msgid "MBP" msgstr "" #: grub-core/loader/efi/appleloader.c:145 msgid "MBA" msgstr "" #: grub-core/loader/efi/appleloader.c:146 msgid "MB NV" msgstr "" #: grub-core/loader/efi/appleloader.c:147 msgid "MB NV2" msgstr "" #: grub-core/loader/efi/appleloader.c:148 msgid "MBP2011" msgstr "" #: grub-core/loader/efi/appleloader.c:149 msgid "MBP2012" msgstr "" #: grub-core/loader/i386/bsd.c:135 msgid "wdXY" msgstr "" #: grub-core/loader/i386/bsd.c:428 grub-core/loader/i386/bsd.c:429 msgid "/boot/zfs/zpool.cache" msgstr "" #: grub-core/loader/i386/bsd.c:1606 grub-core/loader/i386/bsd.c:1609 #: grub-core/loader/i386/bsd.c:1700 grub-core/loader/i386/bsd.c:1708 #: grub-core/loader/i386/bsd.c:1710 msgid "com" msgstr "" #: grub-core/loader/i386/bsd.c:1735 msgid "pc" msgstr "" #: grub-core/loader/i386/bsd.c:1825 #, c-format msgid "kFreeBSD.%s" msgstr "" #: grub-core/loader/i386/bsd.c:1892 msgid "type=" msgstr "" #: grub-core/loader/i386/bsdXX.c:369 msgid "_DYNAMIC" msgstr "" #: grub-core/loader/i386/bsdXX.c:604 msgid "rd_root_image" msgstr "" #: grub-core/loader/i386/bsdXX.c:606 msgid "rd_root_size" msgstr "" #: grub-core/loader/i386/linux.c:550 grub-core/term/i386/pc/vga_text.c:256 #: grub-core/term/i386/pc/vga_text.c:281 msgid "vga_text" msgstr "" #: grub-core/loader/i386/linux.c:900 grub-core/loader/i386/pc/linux.c:244 msgid "vga=" msgstr "" #: grub-core/loader/i386/linux.c:913 grub-core/loader/i386/pc/linux.c:252 msgid "ext" msgstr "" #: grub-core/loader/i386/linux.c:915 grub-core/loader/i386/pc/linux.c:254 msgid "ask" msgstr "" #: grub-core/loader/i386/linux.c:985 grub-core/loader/i386/pc/linux.c:264 msgid "mem=" msgstr "" #: grub-core/loader/i386/pc/chainloader.c:104 msgid "FAT12" msgstr "" #: grub-core/loader/i386/pc/chainloader.c:105 msgid "FAT16" msgstr "" #: grub-core/loader/i386/pc/chainloader.c:106 msgid "FAT32" msgstr "" #: grub-core/loader/i386/pc/chainloader.c:256 msgid "--force" msgstr "" #: grub-core/loader/i386/pc/chainloader.c:263 msgid "--bpb" msgstr "" #: grub-core/loader/i386/pc/linux.c:235 msgid "bzImage" msgstr "" #: grub-core/loader/i386/pc/linux.c:235 msgid "zImage" msgstr "" #: include/grub/util/lvm.h:28 msgid "/dev/linux_lvm/" msgstr "" #: include/grub/zfs/dmu.h:110 msgid "root_dataset" msgstr "" #: include/grub/zfs/dmu.h:111 msgid "sync_bplist" msgstr "" #: include/grub/zfs/dmu.h:112 msgid "errlog_scrub" msgstr "" #: include/grub/zfs/dmu.h:113 msgid "errlog_last" msgstr "" #: include/grub/zfs/dmu.h:114 msgid "spares" msgstr "" #: include/grub/zfs/dmu.h:115 msgid "deflate" msgstr "" #: include/grub/zfs/dmu.h:116 msgid "history" msgstr "" #: include/grub/zfs/dmu.h:117 msgid "pool_props" msgstr "" #: include/grub/zfs/dmu.h:118 msgid "l2cache" msgstr "" #: include/grub/zfs/zfs_znode.h:29 msgid "ROOT" msgstr "" #: include/grub/zfs/zfs_znode.h:30 msgid "VERSION" msgstr "" #: include/grub/zfs/zfs_znode.h:31 msgid "SA_ATTRS" msgstr "" #: util/grub-editenv.c:106 util/grub-setup.c:1117 msgid "\v" msgstr "" #: util/grub-editenv.c:120 #, c-format msgid "%s.new" msgstr "" #: util/grub-fstest.c:547 util/grub-mount.c:463 msgid "prompt" msgstr "" #: util/grub-fstest.c:666 msgid "cp" msgstr "" #: util/grub-fstest.c:747 util/grub-mount.c:571 msgid "loop0" msgstr "" #: util/grub-fstest.c:747 util/grub-mount.c:571 msgid "md0" msgstr "" #: util/grub-mkfont.c:981 msgid "ascii-bitmaps" msgstr "" #: util/grub-mkfont.c:982 msgid "width-spec" msgstr "" #: util/grub-mkfont.c:1003 msgid "no-hinting" msgstr "" #: util/grub-mkfont.c:1004 msgid "no-bitmap" msgstr "" #: util/grub-mkimage.c:574 msgid "PowerPC" msgstr "" #: util/grub-mkimage.c:1878 msgid "(memdisk)/boot/grub" msgstr "" #: util/grub-mkimage.c:1896 msgid "xz" msgstr "" #: util/misc.c:312 msgid "PHYSICALDRIVE" msgstr "" #: grub-core/term/ns8250.c:268 #, c-format msgid "com%d" msgstr "" #: grub-core/term/ns8250.c:315 grub-core/term/serial.c:190 #, c-format msgid "port%lx" msgstr "" #: grub-core/term/serial.c:183 #, c-format msgid "com%ld" msgstr "" #: grub-core/term/serial.c:199 grub-core/term/serial.c:268 msgid "com0" msgstr "" #: grub-core/term/serial.c:219 msgid "odd" msgstr "" #: grub-core/term/serial.c:221 msgid "even" msgstr "" #: grub-core/term/serial.c:230 msgid "1" msgstr "" #: grub-core/term/serial.c:232 msgid "2" msgstr "" #: grub-core/term/serial.c:234 msgid "1.5" msgstr "" #: grub-core/term/serial.c:269 msgid "com2" msgstr "" #: grub-core/term/serial.c:270 msgid "com1" msgstr "" #: grub-core/term/serial.c:295 #, c-format msgid "serial_%s" msgstr "" #: grub-core/term/serial.c:338 grub-core/term/serial.c:339 #: grub-core/term/serial.c:343 grub-core/term/serial.c:344 #: grub-core/term/serial.c:347 grub-core/term/serial.c:348 msgid "serial_*" msgstr "" #: grub-core/term/usb_keyboard.c:217 #, c-format msgid "usb_keyboard%d" msgstr "" #: grub-core/video/efi_gop.c:308 msgid "agp-internal-edid" msgstr "" #: grub-core/video/efi_uga.c:134 msgid "VMEM" msgstr "" #: grub-core/video/efi_uga.c:134 msgid "MMIO" msgstr "" #: grub-core/video/ieee1275.c:74 msgid "display" msgstr "" #: grub-core/video/readers/jpeg.c:802 msgid ".jpg" msgstr "" #: grub-core/video/readers/jpeg.c:808 msgid ".jpeg" msgstr "" #: grub-core/video/readers/tga.c:477 msgid ".tga" msgstr "" #: grub-core/video/video.c:516 grub-core/video/video.c:545 msgid "keep" msgstr "" #: grub-core/video/video.c:517 msgid "keep," msgstr "" #: grub-core/video/video.c:518 msgid "keep;" msgstr "" #: include/grub/acpi.h:27 msgid "RSD PTR " msgstr "" #: include/grub/acpi.h:76 msgid "APIC" msgstr "" #: include/grub/dl.h:82 msgid ", _" msgstr "" #: include/grub/dl.h:113 include/grub/dl.h:121 include/grub/dl.h:128 msgid "LICENSE=" msgstr "" #: include/grub/dl.h:129 msgid "\\license" msgstr "" #: include/grub/efi/api.h:465 include/grub/types.h:78 include/grub/types.h:96 #: include/grub/types.h:97 msgid "lx" msgstr "" #: include/grub/elf.h:117 msgid "ELF" msgstr "" #: include/grub/elf.h:968 msgid "SUNW Solaris" msgstr "" #: include/grub/elf.h:971 msgid "GNU" msgstr "" #: include/grub/emu/misc.h:42 msgid "/device.map" msgstr "" #: include/grub/fontformat.h:23 msgid "PFF2" msgstr "" #: include/grub/fontformat.h:26 msgid "PTSZ" msgstr "" #: include/grub/fontformat.h:27 msgid "WEIG" msgstr "" #: include/grub/fontformat.h:28 msgid "MAXW" msgstr "" #: include/grub/fontformat.h:29 msgid "MAXH" msgstr "" #: include/grub/fontformat.h:30 msgid "ASCE" msgstr "" #: include/grub/fontformat.h:31 msgid "DESC" msgstr "" #: include/grub/fontformat.h:32 msgid "CHIX" msgstr "" #: include/grub/fontformat.h:33 msgid "DATA" msgstr "" #: include/grub/fontformat.h:34 msgid "FAMI" msgstr "" #: include/grub/fontformat.h:35 msgid "SLAN" msgstr "" #: include/grub/gcrypt/gcrypt.h:55 msgid "@VERSION@" msgstr "" #: include/grub/gui.h:32 msgid "__timeout__" msgstr "" #: include/grub/i386/bsd.h:48 msgid "elf kernel" msgstr "" #: include/grub/i386/bsd.h:49 msgid "elf64 kernel" msgstr "" #: include/grub/i386/bsd.h:50 msgid "elf module" msgstr "" #: include/grub/i386/bsd.h:51 msgid "elf obj module" msgstr "" #: include/grub/i386/pc/pxe.h:166 msgid "PXENV+" msgstr "" #: include/grub/i386/pc/pxe.h:193 msgid "!PXE" msgstr "" #: include/grub/keyboard_layouts.h:22 msgid "GRUBLAYO" msgstr "" #: grub-core/video/sm712.c:263 #, c-format msgid " {-1, 0x%x, 0x5},\n" msgstr "" #: grub-core/video/sm712.c:248 #, c-format msgid " {1, 0x%x, 0x%x},\n" msgstr "" #: grub-core/video/sm712.c:250 #, c-format msgid " .byte 0x%02x, 0x%02x\n" msgstr "" #: include/grub/types.h:74 include/grub/types.h:113 include/grub/types.h:114 msgid "x" msgstr "" #: include/grub/types.h:75 include/grub/types.h:115 msgid "u" msgstr "" #: include/grub/types.h:79 include/grub/types.h:98 msgid "lu" msgstr "" #: include/grub/types.h:82 include/grub/types.h:101 include/grub/types.h:102 msgid "llx" msgstr "" #: include/grub/types.h:83 include/grub/types.h:103 msgid "llu" msgstr "" #: include/grub/types.h:99 msgid "ld" msgstr "" #: include/grub/types.h:104 msgid "lld" msgstr "" #: util/grub-fstest.c:363 #, c-format msgid "%08x\n" msgstr "" #: util/grub-fstest.c:387 util/grub-fstest.c:488 util/grub-mount.c:363 #: util/grub-mount.c:418 #, c-format msgid "loop%d" msgstr "" #: util/grub-fstest.c:391 util/grub-mount.c:367 #, c-format msgid "(host)%s" msgstr "" #: util/grub-menulst2cfg.c:95 util/grub-menulst2cfg.c:112 #, c-format msgid "" "}\n" "\n" msgstr "" #: util/grub-menulst2cfg.c:99 #, c-format msgid "menuentry '%s' {\n" msgstr "" #: util/grub-mkfont.c:159 util/grub-mkfont.c:1203 #, c-format msgid ": %s\n" msgstr "" #: util/grub-mkfont.c:171 #, c-format msgid "%x\n" msgstr "" #: grub-core/loader/i386/xnu.c:181 grub-core/loader/i386/xnu.c:186 #: include/grub/i386/tsc.h:45 include/grub/i386/tsc.h:48 #: include/grub/i386/tsc.h:127 include/grub/i386/tsc.h:133 msgid "%rax" msgstr "" #: grub-core/loader/i386/xnu.c:459 msgid "device-properties" msgstr "" #: grub-core/loader/i386/xnu.c:658 msgid "firmware-revision" msgstr "" #: grub-core/loader/i386/xnu.c:668 msgid "firmware-vendor" msgstr "" #: grub-core/loader/i386/xnu.c:679 msgid "firmware-abi" msgstr "" #: grub-core/loader/i386/xnu.c:682 grub-core/loader/i386/xnu.c:687 msgid "EFI32" msgstr "" #: grub-core/loader/i386/xnu.c:689 msgid "EFI64" msgstr "" #: grub-core/loader/i386/xnu.c:693 msgid "platform" msgstr "" #: grub-core/loader/i386/xnu.c:698 msgid "FSBFrequency" msgstr "" #: grub-core/loader/i386/xnu.c:720 msgid "configuration-table" msgstr "" #: grub-core/loader/i386/xnu.c:761 #, c-format msgid "%08x-%04x-%04x-%02x%02x-" msgstr "" #: grub-core/loader/i386/xnu.c:786 grub-core/loader/i386/xnu.c:820 msgid "table" msgstr "" #: grub-core/loader/i386/xnu.c:804 msgid "alias" msgstr "" #: grub-core/loader/i386/xnu.c:817 msgid "runtime-services" msgstr "" #: grub-core/loader/ia64/efi/linux.c:343 msgid "b" msgstr "" #: grub-core/loader/ia64/efi/linux.c:522 include/grub/lib/cmdline.h:25 msgid "BOOT_IMAGE=" msgstr "" #: grub-core/loader/ia64/efi/linux.c:539 msgid "BOOT_IMAGE" msgstr "" #: grub-core/loader/linux.c:164 msgid "newc:" msgstr "" #: grub-core/loader/macho32.c:18 msgid "32" msgstr "" #: grub-core/loader/macho64.c:18 msgid "64" msgstr "" #: grub-core/loader/mips/linux.c:46 msgid "machtype=lemote-yeeloong-2f-8.9inches" msgstr "" #: grub-core/loader/mips/linux.c:47 msgid "machtype=lemote-fuloong-2f-box" msgstr "" #: grub-core/loader/mips/linux.c:48 msgid "machtype=lemote-fuloong-2e-unknown" msgstr "" #: grub-core/loader/mips/linux.c:280 grub-core/loader/mips/linux.c:357 #: grub-core/loader/mips/linux.c:466 msgid "rd_start=0xXXXXXXXXXXXXXXXX" msgstr "" #: grub-core/loader/mips/linux.c:281 grub-core/loader/mips/linux.c:362 msgid "rd_size=0xXXXXXXXXXXXXXXXX" msgstr "" #: grub-core/loader/mips/linux.c:286 grub-core/loader/mips/linux.c:374 msgid "memsize=XXXXXXXXXXXXXXXXXXXX" msgstr "" #: grub-core/loader/mips/linux.c:287 grub-core/loader/mips/linux.c:380 msgid "highmemsize=XXXXXXXXXXXXXXXXXXXX" msgstr "" #: grub-core/loader/mips/linux.c:288 grub-core/loader/mips/linux.c:387 msgid "busclock=XXXXXXXXXX" msgstr "" #: grub-core/loader/mips/linux.c:289 grub-core/loader/mips/linux.c:392 msgid "cpuclock=XXXXXXXXXX" msgstr "" #: grub-core/loader/mips/linux.c:375 #, c-format msgid "memsize=%lld" msgstr "" #: grub-core/loader/mips/linux.c:381 #, c-format msgid "highmemsize=%lld" msgstr "" #: grub-core/loader/mips/linux.c:388 #, c-format msgid "busclock=%d" msgstr "" #: grub-core/loader/mips/linux.c:393 #, c-format msgid "cpuclock=%d" msgstr "" #: grub-core/loader/mips/linux.c:456 msgid "%s rd_start=0x%" msgstr "" #: grub-core/loader/mips/linux.c:457 msgid " rd_size=0x%" msgstr "" #: grub-core/loader/mips/linux.c:466 #, c-format msgid "rd_start=0x%llx" msgstr "" #: grub-core/loader/mips/linux.c:473 msgid "rd_size=0xXXXXXXXXXXXXXXXXX" msgstr "" #: grub-core/loader/mips/linux.c:473 #, c-format msgid "rd_size=0x%llx" msgstr "" #: grub-core/loader/multiboot.c:207 #, c-format msgid "%dx%dx%d,%dx%d,auto" msgstr "" #: grub-core/loader/multiboot.c:210 #, c-format msgid "%dx%d,auto" msgstr "" #: grub-core/loader/sparc64/ieee1275/linux.c:454 msgid "/virtual-memory" msgstr "" #: grub-core/loader/xnu.c:222 grub-core/loader/xnu.c:568 msgid "memory-map" msgstr "" #: grub-core/loader/xnu.c:229 msgid "DeviceTree" msgstr "" #: grub-core/loader/xnu.c:617 msgid "/Contents/" msgstr "" #: grub-core/loader/xnu.c:748 msgid "Driver-" msgstr "" #: grub-core/loader/xnu.c:867 msgid "DriversPackage-" msgstr "" #: grub-core/loader/xnu.c:907 msgid "RAMDisk" msgstr "" #: grub-core/loader/xnu.c:961 msgid "OSBundleRequired" msgstr "" #: grub-core/loader/xnu.c:964 msgid "CFBundleExecutable" msgstr "" #: grub-core/loader/xnu.c:998 msgid "key" msgstr "" #: grub-core/loader/xnu.c:1000 grub-core/net/bootp.c:373 msgid "string" msgstr "" #: grub-core/loader/xnu.c:1002 msgid "/key" msgstr "" #: grub-core/loader/xnu.c:1043 msgid ".kext" msgstr "" #: grub-core/loader/xnu.c:1128 msgid "Contents" msgstr "" #: grub-core/loader/xnu.c:1133 msgid "Plugins" msgstr "" #: grub-core/loader/xnu.c:1139 msgid "MacOS" msgstr "" #: grub-core/loader/xnu.c:1143 msgid "Info.plist" msgstr "" #: grub-core/loader/xnu.c:1204 grub-core/loader/xnu.c:1207 msgid "/MacOS/" msgstr "" #: grub-core/loader/xnu.c:1283 msgid "console,root,local-root,network-root" msgstr "" #: grub-core/loader/xnu.c:1344 grub-core/loader/xnu.c:1345 #: grub-core/loader/xnu.c:1348 msgid "XNU.DeviceTree." msgstr "" #: grub-core/net/bootp.c:40 msgid "net_" msgstr "" #: grub-core/net/bootp.c:40 include/grub/dl.h:82 include/grub/symbol.h:34 msgid "_" msgstr "" #: grub-core/net/bootp.c:43 #, c-format msgid "net_%s_%s" msgstr "" #: grub-core/net/bootp.c:102 msgid ":default" msgstr "" #: grub-core/net/bootp.c:109 #, c-format msgid "%s:default" msgstr "" #: grub-core/net/bootp.c:127 msgid "hostname" msgstr "" #: grub-core/net/bootp.c:131 msgid "domain" msgstr "" #: grub-core/net/bootp.c:135 msgid "rootpath" msgstr "" #: grub-core/net/bootp.c:139 msgid "extensionspath" msgstr "" #: grub-core/net/bootp.c:183 msgid ":gw" msgstr "" #: grub-core/net/bootp.c:190 #, c-format msgid "%s:gw" msgstr "" #: grub-core/net/bootp.c:200 msgid "boot_file" msgstr "" #: grub-core/net/bootp.c:206 grub-core/net/net.c:713 #, c-format msgid "%d.%d.%d.%d" msgstr "" #: grub-core/net/bootp.c:216 #, c-format msgid "tftp,%d.%d.%d.%d" msgstr "" #: grub-core/net/bootp.c:226 msgid "dhcp_server_name" msgstr "" #: grub-core/net/bootp.c:235 #, c-format msgid "tftp,%s" msgstr "" #: grub-core/net/bootp.c:277 #, c-format msgid "%s:dhcp" msgstr "" #: grub-core/net/bootp.c:294 msgid ":dhcp_tmp" msgstr "" #: grub-core/net/bootp.c:387 msgid "number" msgstr "" #: grub-core/net/bootp.c:394 #, c-format msgid "%llu\n" msgstr "" #: grub-core/net/bootp.c:398 #, c-format msgid "%lld\n" msgstr "" #: grub-core/net/bootp.c:460 #, c-format msgid "%s:dhcp_tmp" msgstr "" #: grub-core/net/drivers/arc/arcnet.c:89 #, c-format msgid "<%lu>" msgstr "" #: grub-core/net/drivers/efi/efinet.c:205 #, c-format msgid "efinet%d" msgstr "" #: grub-core/net/drivers/emu/emunet.c:104 msgid "/dev/net/tun" msgstr "" #: grub-core/net/drivers/ieee1275/ofnet.c:43 #: grub-core/net/drivers/ieee1275/ofnet.c:47 msgid ":speed=auto,duplex=auto,1.1.1.1,dummy,1.1.1.1,1.1.1.1,5,5,1.1.1.1,512" msgstr "" #: grub-core/net/drivers/ieee1275/ofnet.c:135 msgid "bootp-response" msgstr "" #: grub-core/net/drivers/ieee1275/ofnet.c:136 msgid "dhcp-response" msgstr "" #: grub-core/net/drivers/ieee1275/ofnet.c:137 msgid "bootpreply-packet" msgstr "" #: grub-core/net/drivers/ieee1275/ofnet.c:266 msgid "alloc-mem" msgstr "" #: grub-core/net/drivers/ieee1275/ofnet.c:291 #, c-format msgid "ofnet_%s" msgstr "" #: grub-core/net/http.c:103 grub-core/net/http.c:109 msgid "HTTP/1.1 " msgstr "" #: grub-core/net/http.c:133 grub-core/net/http.c:136 msgid "Content-Length: " msgstr "" #: grub-core/net/http.c:141 grub-core/net/http.c:142 msgid "Transfer-Encoding: chunked" msgstr "" #: grub-core/net/http.c:317 grub-core/net/http.c:330 grub-core/net/http.c:336 msgid "GET " msgstr "" #: grub-core/net/http.c:319 grub-core/net/http.c:349 grub-core/net/http.c:355 #: grub-core/net/http.c:356 msgid "" " HTTP/1.1\r\n" "Host: " msgstr "" #: grub-core/net/http.c:321 grub-core/net/http.c:370 grub-core/net/http.c:377 #: grub-core/net/http.c:378 msgid "" "\r\n" "User-Agent: " msgstr "" #: grub-core/net/http.c:322 grub-core/net/http.c:370 grub-core/net/http.c:377 #: grub-core/net/http.c:378 grub-core/net/http.c:392 msgid "\r\n" msgstr "" #: grub-core/net/http.c:323 grub-core/net/http.c:383 msgid "" "Range: bytes=XXXXXXXXXXXXXXXXXXXX-\r\n" "\r\n" msgstr "" #: grub-core/net/http.c:386 msgid "Range: bytes=%" msgstr "" #: grub-core/net/http.c:386 msgid "" "-\r\n" "\r\n" msgstr "" #: grub-core/net/icmp6.c:416 msgid ":XXXXXXXXXXXXXXXXXXXX" msgstr "" #: grub-core/net/icmp6.c:417 #, c-format msgid "%s:%d" msgstr "" #: grub-core/net/net.c:230 grub-core/net/net.c:238 msgid ":slaac" msgstr "" #: grub-core/net/net.c:253 grub-core/net/net.c:276 msgid ":link" msgstr "" #: grub-core/net/net.c:822 msgid "net__mac" msgstr "" #: grub-core/net/net.c:825 #, c-format msgid "net_%s_mac" msgstr "" #: grub-core/net/net.c:835 msgid "net__ip" msgstr "" #: grub-core/net/net.c:838 #, c-format msgid "net_%s_ip" msgstr "" #: grub-core/net/net.c:908 #, c-format msgid "%s:local" msgstr "" #: grub-core/net/net.c:1054 msgid "gw" msgstr "" #: grub-core/net/net.c:1091 #, c-format msgid "%d.%d.%d.%d/%d " msgstr "" #: grub-core/net/net.c:1184 grub-core/net/net.c:1188 msgid "pxe:" msgstr "" #: grub-core/net/tftp.c:180 grub-core/net/tftp.c:181 grub-core/net/tftp.c:343 #: grub-core/net/tftp.c:344 grub-core/net/tftp.c:345 msgid "tsize" msgstr "" #: grub-core/net/tftp.c:183 grub-core/net/tftp.c:184 grub-core/net/tftp.c:335 #: grub-core/net/tftp.c:336 grub-core/net/tftp.c:337 msgid "blksize" msgstr "" #: grub-core/net/tftp.c:331 grub-core/net/tftp.c:332 grub-core/net/tftp.c:333 msgid "octet" msgstr "" #: grub-core/net/tftp.c:339 grub-core/net/tftp.c:340 grub-core/net/tftp.c:341 msgid "1024" msgstr "" #: grub-core/net/tftp.c:431 grub-core/net/tftp.c:437 msgid "closed" msgstr "" #: grub-core/normal/auth.c:178 msgid "\b" msgstr "" #: grub-core/normal/autofs.c:74 msgid "/fs.lst" msgstr "" #: grub-core/normal/completion.c:133 msgid "\" " msgstr "" #: grub-core/normal/completion.c:135 util/grub-probe.c:506 #: util/grub-probe.c:544 #, c-format msgid "' " msgstr "" #: grub-core/normal/completion.c:337 msgid "- " msgstr "" #: grub-core/normal/completion.c:348 msgid "-u" msgstr "" #: grub-core/normal/completion.c:364 util/ieee1275/grub-ofpathname.c:39 msgid "--help" msgstr "" #: grub-core/normal/completion.c:366 msgid "--usage" msgstr "" #: grub-core/normal/crypto.c:90 msgid "/crypto.lst" msgstr "" #: grub-core/normal/dyncmd.c:104 msgid "/command.lst" msgstr "" #: grub-core/normal/main.c:363 #, c-format msgid "%s/grub.cfg" msgstr "" #: grub-core/normal/main.c:516 msgid "feature_chainloader_bpb" msgstr "" #: grub-core/normal/main.c:516 msgid "feature_ntldr" msgstr "" #: grub-core/normal/main.c:516 msgid "feature_platform_search_hint" msgstr "" #: grub-core/normal/main.c:517 msgid "feature_default_font_path" msgstr "" #: grub-core/normal/main.c:517 msgid "feature_all_video_module" msgstr "" #: grub-core/normal/main.c:518 msgid "feature_menuentry_id" msgstr "" #: grub-core/normal/main.c:518 msgid "feature_menuentry_options" msgstr "" #: grub-core/normal/main.c:518 msgid "feature_200_final" msgstr "" #: grub-core/normal/main.c:519 msgid "feature_nativedisk_cmd" msgstr "" #: grub-core/normal/main.c:568 msgid "white/black" msgstr "" #: grub-core/normal/main.c:569 msgid "black/white" msgstr "" #: grub-core/normal/term.c:326 msgid "/terminal.lst" msgstr "" #: grub-core/partmap/amiga.c:34 msgid "RDSK" msgstr "" #: grub-core/partmap/amiga.c:51 msgid "PART" msgstr "" #: grub-core/term/at_keyboard.c:642 grub-core/term/at_keyboard.c:654 msgid "at_keyboard" msgstr "" #: grub-core/term/efi/serial.c:170 grub-core/term/efi/serial.c:173 msgid "efiXXXXXXXXXXXXXXXXXXXX" msgstr "" #: grub-core/term/efi/serial.c:174 #, c-format msgid "efi%d" msgstr "" #: grub-core/term/emu/console.c:166 msgid "vt100-color" msgstr "" #: grub-core/term/i386/pc/vga_text.c:254 grub-core/term/i386/pc/vga_text.c:279 msgid "mda_text" msgstr "" #: grub-core/term/ieee1275/console.c:152 msgid "cursor-on" msgstr "" #: grub-core/term/ieee1275/console.c:154 msgid "cursor-off" msgstr "" #: grub-core/term/ieee1275/console.c:179 msgid "output-device output" msgstr "" #: grub-core/term/ieee1275/console.c:255 msgid "dumb" msgstr "" #: grub-core/term/ieee1275/console.c:257 msgid "ieee1275-nocursor" msgstr "" #: grub-core/term/ieee1275/console.c:259 msgid "ieee1275" msgstr "" #: grub-core/term/ieee1275/escc.c:229 #, c-format msgid "escc-ch-%c" msgstr "" #: grub-core/term/ieee1275/escc.c:250 msgid "mac-io" msgstr "" #: grub-core/term/ieee1275/escc.c:269 msgid "escc" msgstr "" #: grub-core/term/morse.c:126 msgid "audio" msgstr "" #: include/grub/lvm.h:32 msgid "LABELONE" msgstr "" #: include/grub/lvm.h:33 msgid "LVM2 001" msgstr "" #: include/grub/macho.h:127 msgid "complzss" msgstr "" #: include/grub/net.h:459 msgid "XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX" msgstr "" #: include/grub/net.h:466 msgid "XX:XX:XX:XX:XX:XX" msgstr "" #: include/grub/symbol.h:44 msgid "function" msgstr "" #: include/grub/symbol.h:45 msgid "object" msgstr "" #: grub-core/lib/adler32.c:84 msgid "ADLER32" msgstr "" #: grub-core/lib/arg.c:123 msgid "-h, " msgstr "" #: grub-core/lib/arg.c:125 msgid "-u, " msgstr "" #: grub-core/lib/arg.c:127 msgid " " msgstr "" #: grub-core/lib/arg.c:131 grub-core/normal/completion.c:376 #, c-format msgid "--%s" msgstr "" #: grub-core/lib/arg.c:136 #, c-format msgid "=%s" msgstr "" #: grub-core/loader/i386/xnu.c:55 msgid "ACPI_20" msgstr "" #: grub-core/loader/i386/xnu.c:56 grub-core/loader/i386/xnu.c:644 #: grub-core/loader/i386/xnu.c:645 grub-core/loader/i386/xnu.c:649 #: grub-core/loader/i386/xnu.c:650 msgid "ACPI" msgstr "" #: grub-core/net/net.c:1132 msgid "gw " msgstr "" #: grub-core/kern/rescue_reader.c:40 msgid "> " msgstr "" #: grub-core/kern/rescue_reader.c:40 msgid "grub rescue> " msgstr "" #: grub-core/term/arc/console.c:87 grub-core/term/arc/console.c:88 #: grub-core/term/arc/console.c:89 grub-core/term/arc/console.c:91 msgid "line" msgstr "" #: grub-core/term/arc/console.c:120 msgid "ConsoleOut" msgstr "" #: grub-core/term/arc/console.c:206 grub-core/term/serial.c:252 #: grub-core/term/serial.c:334 msgid "vt100" msgstr "" #: grub-core/term/arc/console.c:208 msgid "arc" msgstr "" #: grub-core/parttool/msdospart.c:88 msgid "hidden" msgstr "" #: grub-core/loader/xnu.c:1422 grub-core/term/gfxterm.c:1153 msgid "stretch" msgstr "" #: grub-core/loader/machoXX.c:326 grub-core/loader/machoXX.c:328 #: grub-core/loader/machoXX.c:329 grub-core/loader/machoXX.c:331 #: grub-core/loader/machoXX.c:333 msgid "Darwin Kernel Version " msgstr "" #: grub-core/loader/i386/pc/plan9.c:267 #, c-format msgid "sdB%u" msgstr "" #: grub-core/loader/i386/pc/plan9.c:270 #, c-format msgid "fd%u" msgstr "" #: grub-core/loader/i386/pc/plan9.c:290 msgid "sdZ0" msgstr "" #: grub-core/loader/i386/pc/plan9.c:296 grub-core/loader/i386/pc/plan9.c:299 #: grub-core/loader/i386/pc/plan9.c:308 grub-core/loader/i386/pc/plan9.c:311 msgid "ata0" msgstr "" #: grub-core/loader/i386/pc/plan9.c:300 grub-core/loader/i386/pc/plan9.c:313 #, c-format msgid "sd%c%d" msgstr "" #: grub-core/loader/i386/pc/plan9.c:320 #, c-format msgid "sd0%u" msgstr "" #: grub-core/loader/i386/pc/plan9.c:331 grub-core/loader/i386/pc/plan9.c:346 #: grub-core/loader/i386/pc/plan9.c:347 msgid "part=" msgstr "" #: grub-core/loader/i386/pc/plan9.c:416 #, c-format msgid "%s!%s!%s" msgstr "" #: grub-core/loader/i386/pc/plan9.c:419 #, c-format msgid "%s!%s" msgstr "" #: grub-core/commands/wildcard.c:83 msgid "*.\\|+{}[]?" msgstr "" #: grub-core/disk/dmraid_nvidia.c:71 msgid "NVIDIA" msgstr "" #: grub-core/commands/sleep.c:45 #, c-format msgid "%d " msgstr "" #: grub-core/commands/verify.c:258 msgid "" msgstr "" #: grub-core/disk/cryptodisk.c:576 msgid " sectors from sector 0x%" msgstr "" #: grub-core/disk/cryptodisk.c:577 grub-core/disk/cryptodisk.c:626 msgid " with offset of %" msgstr "" #: grub-core/disk/cryptodisk.c:625 msgid " sectors to sector 0x%" msgstr "" #: grub-core/disk/geli.c:469 msgid "" msgstr "" #: grub-core/disk/luks.c:40 msgid "LUKS" msgstr "" #: grub-core/font/font.c:450 grub-core/font/font.c:454 msgid "/fonts/" msgstr "" #: grub-core/font/font.c:450 grub-core/font/font.c:456 msgid ".pf2" msgstr "" #: grub-core/fs/zfs/zfsinfo.c:117 msgid "path" msgstr "" #: grub-core/fs/zfs/zfsinfo.c:389 #, c-format msgid "zfs-bootfs=%s/%llu%s%s%s%s%s%s" msgstr "" #: grub-core/fs/zfs/zfsinfo.c:391 msgid ",bootpath=\"" msgstr "" #: grub-core/fs/zfs/zfsinfo.c:393 grub-core/fs/zfs/zfsinfo.c:396 msgid "\"" msgstr "" #: grub-core/fs/zfs/zfsinfo.c:394 msgid ",diskdevid=\"" msgstr "" #: grub-core/gdb/cstub.c:26 msgid "0123456789abcdef" msgstr "" #: grub-core/lib/i386/halt.c:26 msgid "Shutdown" msgstr "" #: grub-core/lib/minilzo/lzoconf.h:48 msgid "2.05" msgstr "" #: grub-core/lib/minilzo/lzoconf.h:49 msgid "Apr 23 2011" msgstr "" #: grub-core/lib/minilzo/lzoconf.h:80 grub-core/lib/minilzo/lzoconf.h:233 #: grub-core/lib/minilzo/minilzo.h:68 include/grub/gcrypt/gcrypt.h:44 msgid "C" msgstr "" #: grub-core/loader/i386/bsd.c:611 grub-core/loader/i386/bsd.c:613 #: grub-core/loader/i386/bsd.c:657 grub-core/loader/i386/bsd.c:659 msgid "kFreeBSD." msgstr "" #: grub-core/loader/i386/bsd.c:939 grub-core/loader/i386/linux.c:497 #: grub-core/loader/i386/xnu.c:870 grub-core/loader/multiboot.c:106 #: grub-core/term/gfxterm.c:378 #, c-format msgid "%s;" msgstr "" #: grub-core/loader/i386/linux.c:966 #, c-format msgid "%ux%ux%u,%ux%u" msgstr "" #: grub-core/loader/i386/pc/plan9.c:119 msgid "linuxswap" msgstr "" #: grub-core/loader/i386/pc/plan9.c:146 grub-core/partmap/plan.c:46 #: grub-core/partmap/plan.c:55 msgid "part " msgstr "" #: grub-core/loader/i386/pc/plan9.c:196 #, c-format msgid "%s.%d" msgstr "" #: grub-core/loader/i386/pc/plan9.c:457 grub-core/loader/i386/pc/plan9.c:479 msgid "bootfile=" msgstr "" #: grub-core/loader/i386/xnu.c:149 msgid "ineIntel" msgstr "" #: grub-core/loader/i386/xnu.c:159 msgid "GenuineIntel" msgstr "" #: grub-core/loader/i386/bsd.c:50 msgid "800x600" msgstr "" #: util/misc.c:151 #, c-format msgid " bytes at offset 0x%llx" msgstr "" #: util/misc.c:165 msgid " bytes" msgstr "" #: include/grub/lib/envblk.h:22 msgid "# GRUB Environment Block\n" msgstr "" #: include/grub/lib/envblk.h:23 msgid "grubenv" msgstr "" #: grub-core/normal/misc.c:120 msgid "ext*" msgstr "" #: grub-core/partmap/msdos.c:86 msgid "HP Backup and Recovery Manager (?)" msgstr "" #: grub-core/partmap/msdos.c:94 msgid "ycgl" msgstr "" #: grub-core/partmap/msdos.c:100 msgid "Acer registration utility (?)" msgstr "" #: grub-core/partmap/msdos.c:101 msgid "GREGRegDone.Tag" msgstr "" #: grub-core/script/execute.c:253 grub-core/script/execute.c:289 msgid "#" msgstr "" #: grub-core/script/execute.c:292 grub-core/script/execute.c:489 #, c-format msgid "%u" msgstr "" #: grub-core/script/execute.c:693 msgid "{" msgstr "" #: grub-core/script/execute.c:705 msgid "}" msgstr "" #: grub-core/term/usb_keyboard.c:410 #, c-format msgid " report: 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x\n" msgstr "" #: grub-core/loader/i386/pc/plan9.c:47 msgid "ZORT 0\r\n" msgstr "" #: grub-core/loader/i386/bsd.c:486 #, c-format msgid " %-18s %-18s%14s%14s\n" msgstr "" #: grub-core/loader/i386/bsd.c:495 #, c-format msgid " %-18s" msgstr "" #: grub-core/loader/i386/bsd.c:502 #, c-format msgid " 0x%08x" msgstr "" #: grub-core/loader/i386/bsd.c:510 #, c-format msgid " 0x%08x\n" msgstr "" #: grub-core/loader/i386/bsd.c:552 #, c-format msgid " %-18s%14s%14s%14s\n" msgstr "" #: grub-core/loader/i386/bsd.c:556 #, c-format msgid " %-18s 0x%08x 0x%08x 0x%08x" msgstr "" #: grub-core/loader/mips/linux.c:271 grub-core/loader/mips/linux.c:324 #: grub-core/loader/mips/linux.c:328 msgid "a0" msgstr "" #: grub-core/fs/btrfs.c:719 grub-core/fs/btrfs.c:814 msgid " (%d stripes (%d substripes) of %" msgstr "" #: grub-core/fs/btrfs.c:815 msgid ") stripe %" msgstr "" #: grub-core/fs/btrfs.c:816 msgid " maps to 0x%" msgstr "" #: grub-core/fs/btrfs.c:824 msgid " for laddr 0x%" msgstr "" #: grub-core/fs/btrfs.c:1671 grub-core/fs/ext2.c:961 #: grub-core/fs/reiserfs.c:1363 grub-core/fs/xfs.c:881 #, c-format msgid "%04x%04x-%04x-%04x-%04x-%04x%04x%04x" msgstr "" #: grub-core/lib/arg.c:109 grub-core/net/net.c:1169 #, c-format msgid "%s %s %s\n" msgstr "" #: grub-core/lib/arg.c:121 #, c-format msgid "-%c%c " msgstr "" #: grub-core/lib/arg.c:159 #, c-format msgid "" "%s\n" "\n" msgstr "" #: grub-core/normal/menu.c:680 grub-core/normal/menu_entry.c:1126 #: util/grub-menulst2cfg.c:106 msgid " " msgstr "" #: grub-core/normal/menu.c:692 msgid "" "\n" " " msgstr "" #: grub-core/normal/menu.c:708 msgid "" "\n" " " msgstr "" #: grub-core/normal/menu_entry.c:1052 msgid "" "\n" " " msgstr "" #: grub-core/normal/misc.c:76 msgid ".%02" msgstr "" #: grub-core/normal/misc.c:80 #, c-format msgid "%llu%s" msgstr "" #: grub-core/normal/misc.c:95 msgid "\t" msgstr "" #: grub-core/normal/main.c:573 msgid "y" msgstr "" #: grub-core/normal/menu.c:300 grub-core/normal/menu.c:572 msgid "fallback" msgstr "" #: grub-core/net/net.c:737 #, c-format msgid "%02x:" msgstr "" #: grub-core/net/net.c:1105 #, c-format msgid "%s/%d " msgstr "" #: grub-core/net/net.c:1152 #, c-format msgid "%s %s\n" msgstr "" #: grub-core/net/net.c:234 grub-core/net/net.c:272 grub-core/net/net.c:696 #: grub-core/net/net.c:703 msgid ":" msgstr "" #: grub-core/net/ip.c:427 grub-core/net/ip.c:685 msgid ", expected %" msgstr "" #: grub-core/disk/geli.c:151 #, c-format msgid " keysize=%d\n" msgstr "" #: grub-core/disk/scsi.c:619 #, c-format msgid ", blocksize=%u\n" msgstr "" #: grub-core/fs/iso9660.c:1045 #, c-format msgid "%c%c%c%c-%c%c-%c%c-%c%c-%c%c-%c%c-%c%c" msgstr "" #: grub-core/fs/zfs/zfs.c:1492 msgid "big-endian gang\n" msgstr "" #: grub-core/fs/zfs/zfs.c:1660 msgid ", %p) for txg %" msgstr "" #: include/grub/lvm.h:65 msgid " LVM2 x[5A%r0N*>" msgstr "" #: grub-core/video/sm712.c:267 #, c-format msgid " .byte 0x%04x, 0x00\n" msgstr "" #: grub-core/kern/efi/mm.c:429 #, c-format msgid "MD: t=%x, p=%llx, v=%llx, n=%llx, a=%llx\n" msgstr "" #: grub-core/kern/mm.c:402 #, c-format msgid "%s:%d: q=%p, q->size=0x%x, q->magic=0x%x\n" msgstr "" #: grub-core/kern/mm.c:501 grub-core/kern/mm.c:529 #, c-format msgid "F:%p:%u:%p\n" msgstr "" #: grub-core/kern/mm.c:516 #, c-format msgid "called at line %u\n" msgstr "" #: grub-core/kern/mm.c:533 #, c-format msgid "A:%p:%u\n" msgstr "" #: grub-core/kern/mm.c:548 msgid "%s:%d: malloc (0x%" msgstr "" #: grub-core/kern/mm.c:548 grub-core/kern/mm.c:561 grub-core/kern/mm.c:580 #: grub-core/kern/mm.c:595 msgid ") = " msgstr "" #: grub-core/kern/mm.c:551 grub-core/kern/mm.c:564 grub-core/kern/mm.c:583 #: grub-core/kern/mm.c:598 #, c-format msgid "%p\n" msgstr "" #: grub-core/kern/mm.c:561 msgid "%s:%d: zalloc (0x%" msgstr "" #: grub-core/kern/mm.c:572 #, c-format msgid "%s:%d: free (%p)\n" msgstr "" #: grub-core/kern/mm.c:580 msgid "%s:%d: realloc (%p, 0x%" msgstr "" #: grub-core/kern/mm.c:594 msgid "%s:%d: memalign (0x%" msgstr "" #: grub-core/lib/hexdump.c:49 grub-core/normal/menu_entry.c:1023 msgid " " msgstr "" #: grub-core/lib/hexdump.c:71 msgid "*\n" msgstr "" #: grub-core/lib/i386/backtrace.c:38 #, c-format msgid "%p: " msgstr "" #: grub-core/lib/i386/backtrace.c:40 msgid " (" msgstr "" #: grub-core/lib/i386/backtrace.c:42 #, c-format msgid "%p," msgstr "" #: grub-core/lib/i386/backtrace.c:43 #, c-format msgid "%p)\n" msgstr "" #: grub-core/net/net.c:738 msgid "XX:" msgstr "" #: util/grub-mkimagexx.c:131 msgid "_start" msgstr "" #: grub-core/gfxmenu/gui_circular_progress.c:240 msgid "°" msgstr "" #: grub-core/kern/emu/argp_common.c:33 util/grub-editenv.c:61 #: util/grub-fstest.c:531 util/grub-mount.c:449 #, c-format msgid "%s (%s) %s\n" msgstr "" #: grub-core/video/sm712.c:252 grub-core/video/sm712.c:266 #, c-format msgid "FAIL\n" msgstr "" #: grub-core/lib/hexdump.c:34 #, c-format msgid "%08lx " msgstr "" #: grub-core/lib/backtrace.c:41 msgid "%s.%x+%" msgstr "" #: grub-core/commands/minicmd.c:113 #, c-format msgid "%x%x " msgstr "" #: grub-core/commands/minicmd.c:158 #, c-format msgid "%s\t%d\t\t" msgstr "" #: grub-core/disk/arc/arcdisk.c:238 grub-core/disk/arc/arcdisk.c:275 #, c-format msgid " failed: %ld\n" msgstr "" #: grub-core/lib/xzembed/xz_stream.h:38 msgid "YZ" msgstr "" #: grub-core/font/font.c:197 msgid "" msgstr "" #: grub-core/font/font.c:635 msgid "Unknown" msgstr "" #: grub-core/lib/crypto.c:83 grub-core/lib/libgcrypt_wrap/mem.c:99 msgid "gcrypt" msgstr "" #: grub-core/lib/crypto.c:85 msgid "gcrypt error: " msgstr "" #: grub-core/commands/acpihalt.c:217 msgid "\\" msgstr "" #: grub-core/commands/minicmd.c:85 #, c-format msgid "%s (%d%c)\t%s\n" msgstr "" #: grub-core/commands/probe.c:77 grub-core/commands/probe.c:91 #: util/grub-mkimage.c:1905 msgid "none" msgstr "" #: grub-core/lib/libgcrypt_wrap/mem.c:101 msgid "gcrypt: " msgstr "" #: grub-core/lib/libgcrypt_wrap/mem.c:113 msgid "gcrypt bug: " msgstr "" #: grub-core/lib/posix_wrap/assert.h:30 #, c-format msgid "Assertion failed at %s:%d\n" msgstr "" #: include/grub/list.h:42 msgid "bad type cast between incompatible grub types" msgstr "" #: grub-core/kern/mm.c:117 #, c-format msgid "Using memory for heap: start=%p, end=%p\n" msgstr "" #: grub-core/loader/efi/chainloader.c:263 msgid "file path: " msgstr "" #: grub-core/net/net.c:720 #, c-format msgid "Unknown address type %d" msgstr "" #: grub-core/normal/misc.c:164 #, c-format msgid ", UUID %s" msgstr "" #: grub-core/video/readers/jpeg.c:817 msgid "Tests loading of JPEG bitmap." msgstr "" #: grub-core/video/readers/png.c:959 msgid "Tests loading of PNG bitmap." msgstr "" #: grub-core/video/readers/tga.c:485 msgid "Tests loading of TGA bitmap." msgstr "" #: util/grub-mkimagexx.c:107 #, c-format msgid "undefined symbol %s" msgstr "" #: util/grub-mkimagexx.c:112 #, c-format msgid "section %d does not exist" msgstr "" #: util/grub-mkimagexx.c:348 msgid "trampoline offset too big (%" msgstr "" #: util/grub-mkimagexx.c:395 #, c-format msgid " at the offset 0x%llx" msgstr "" #: util/grub-mkimagexx.c:412 #, c-format msgid "unknown architecture type %d" msgstr "" #: util/grub-mkimagexx.c:502 msgid "too many fixup entries" msgstr "" #: util/grub-mkimagexx.c:584 msgid "can't add fixup entry for R_X86_64_32(S)" msgstr "" #: util/grub-mkimagexx.c:639 #, c-format msgid "unknown machine type 0x%x" msgstr "" #: util/grub-mkimagexx.c:828 msgid "invalid ELF header" msgstr "" #: util/grub-mkimagexx.c:946 msgid "start symbol is not defined" msgstr "" #: grub-core/commands/acpihalt.c:132 grub-core/commands/acpihalt.c:284 #, c-format msgid "Unknown opcode 0x%x\n" msgstr "" #: grub-core/commands/acpihalt.c:176 #, c-format msgid "Unexpected extended opcode: 0x%x\n" msgstr "" #: grub-core/commands/acpihalt.c:226 #, c-format msgid "Unknown opcode in _S5: 0x%x\n" msgstr "" #: grub-core/commands/acpihalt.c:245 #, c-format msgid "Unknown data type in _S5: 0x%x\n" msgstr "" #: grub-core/commands/acpihalt.c:301 #, c-format msgid "Usage: %s FILE\n" msgstr "" #: grub-core/commands/acpihalt.c:305 #, c-format msgid "Couldn't open file\n" msgstr "" #: grub-core/commands/acpihalt.c:326 #, c-format msgid "Sleep type = %d\n" msgstr "" #: grub-core/loader/sparc64/ieee1275/linux.c:456 msgid "Cannot find /virtual-memory node.\n" msgstr "" #: grub-core/loader/sparc64/ieee1275/linux.c:462 msgid "Cannot find /virtual-memory/translations size.\n" msgstr "" #: grub-core/loader/sparc64/ieee1275/linux.c:469 msgid "Cannot allocate translations buffer.\n" msgstr "" #: grub-core/loader/sparc64/ieee1275/linux.c:475 msgid "Cannot fetch /virtual-memory/translations property.\n" msgstr "" #: grub-core/mmap/efi/mmap.c:87 #, c-format msgid "Unknown memory type %d, considering reserved\n" msgstr "" #: grub-core/gdb/cstub.c:215 #, c-format msgid "Unhandled exception 0x%x at " msgstr "" #: grub-core/gfxmenu/view.c:476 #, c-format msgid "Booting '%s'" msgstr "" #: grub-core/gfxmenu/view.c:494 #, c-format msgid "Falling back to '%s'" msgstr "" #: grub-core/disk/ieee1275/ofdisk.c:524 grub-core/kern/ieee1275/init.c:98 msgid "/chosen/bootpath property missing!\n" msgstr "" #: grub-core/commands/videotest.c:95 grub-core/commands/videotest.c:100 msgid "The quick brown fox jumped over the lazy dog." msgstr "" #: grub-core/commands/videotest.c:122 msgid "Unicode test: happy☺ £ 5.00 ¡τäu! ℤ⊆ℝ" msgstr "" #: grub-core/kern/i386/multiboot_mmap.c:51 #, c-format msgid "" "WARNING: Memory map size exceeds limit (0x%x > 0x%x); it will be truncated\n" msgstr "" #: grub-core/kern/main.c:261 msgid "" "Welcome to GRUB!\n" "\n" msgstr "" #: grub-core/kern/misc.c:1105 msgid "" "\n" "Aborted." msgstr "" #: grub-core/kern/misc.c:1111 msgid " Press any key to exit." msgstr "" #: grub-core/kern/err.c:131 msgid "assert: error stack overflow detected!\n" msgstr "" #: grub-core/kern/ieee1275/init.c:202 msgid "Warning: attempt to claim over our own code!\n" msgstr "" #: grub-core/lib/arg.c:177 #, c-format msgid "" "\n" "Report bugs to <%s>.\n" msgstr "" #: grub-core/lib/i386/backtrace.c:48 #, c-format msgid "Invalid stack frame at %p (%p)\n" msgstr "" #: grub-core/kern/efi/mm.c:511 msgid "printing memory map\n" msgstr "" #: grub-core/bus/emu/pci.c:58 #, c-format msgid "mapping 0x%x failed (error %d)\n" msgstr "" #: grub-core/bus/usb/ehci.c:1572 #, c-format msgid "%s: prev not found, queues are corrupt\n" msgstr "" #: grub-core/commands/boottime.c:46 #, c-format msgid "%3d.%03ds %2d.%03ds %s:%d %s\n" msgstr "" #: grub-core/commands/date.c:49 #, c-format msgid "%d-%02d-%02d %02d:%02d:%02d %s\n" msgstr "" #: grub-core/commands/i386/pc/drivemap.c:195 #, c-format msgid "%cD #%-3u (0x%02x) %cd%d\n" msgstr "" #: grub-core/commands/i386/pc/drivemap.c:259 msgid "Swapping" msgstr "" #: grub-core/commands/i386/pc/drivemap.c:259 msgid "Mapping" msgstr "" #: grub-core/kern/rescue_parser.c:71 msgid "Try `help' for usage\n" msgstr "" #: grub-core/kern/rescue_reader.c:81 msgid "Entering rescue mode...\n" msgstr "" #: grub-core/kern/corecmd.c:153 #, c-format msgid "(%s): Filesystem is %s.\n" msgstr "" #: grub-core/kern/corecmd.c:154 msgid "unknown" msgstr "" #: grub-core/commands/ls.c:157 #, c-format msgid " %d-%02d-%02d %02d:%02d:%02d %-11s " msgstr "" #: grub-core/commands/ls.c:163 #, c-format msgid " %04d%02d%02d%02d%02d%02d " msgstr "" #: grub-core/commands/testload.c:72 #, c-format msgid "Reading %s sequentially" msgstr "" #: grub-core/commands/testload.c:76 grub-core/commands/testload.c:101 #: grub-core/commands/testload.c:140 msgid " Done.\n" msgstr "" #: grub-core/commands/testload.c:79 #, c-format msgid "Reading %s sequentially again" msgstr "" #: grub-core/commands/testload.c:96 grub-core/commands/testload.c:125 #, c-format msgid "" "\n" "Differs in %lld\n" msgstr "" #: grub-core/commands/testload.c:104 #, c-format msgid "Reading %s backwards" msgstr "" #: grub-core/commands/keylayouts.c:177 #, c-format msgid "Unknown key 0x%x detected\n" msgstr "" #: grub-core/commands/videotest.c:203 #, c-format msgid "color %d: %08x\n" msgstr "" #: grub-core/kern/efi/mm.c:196 msgid "Trying to terminate EFI services again\n" msgstr "" #: grub-core/kern/emu/hostdisk.c:639 #, c-format msgid "cannot get disk label of `%s'" msgstr "" #: grub-core/term/at_keyboard.c:370 msgid "No supported scancode set found\n" msgstr "" #: grub-core/term/usb_keyboard.c:402 #, c-format msgid "%s failed. Stopped\n" msgstr "" #: util/grub-setup.c:343 #, c-format msgid "guessing the root device failed, because of `%s'" msgstr "" #: grub-core/commands/keylayouts.c:177 #, c-format msgid "Unknown key 0x%x detected\n" msgstr "" #: grub-core/commands/videotest.c:203 #, c-format msgid "color %d: %08x\n" msgstr "" #: grub-core/kern/efi/mm.c:196 msgid "Trying to terminate EFI services again\n" msgstr "" #: grub-core/kern/emu/hostdisk.c:639 #, c-format msgid "cannot get disk label of `%s'" msgstr "" #: grub-core/term/at_keyboard.c:370 msgid "No supported scancode set found\n" msgstr "" #: grub-core/term/usb_keyboard.c:402 #, c-format msgid "%s failed. Stopped\n" msgstr "" #: util/grub-setup.c:343 #, c-format msgid "guessing the root device failed, because of `%s'" msgstr "" #: grub-core/commands/cat.c:106 #, c-format msgid "%C" msgstr "" #: grub-core/fs/zfs/zfs.c:284 msgid "org.illumos:lz4_compress" msgstr "" #: grub-core/fs/zfs/zfs.c:350 msgid "lz4" msgstr "" #: include/grub/cbfs_core.h:125 msgid "LARCHIVE" msgstr "" #: include/grub/zfs/dmu.h:162 msgid "features_for_read" msgstr "" #: util/grub-mkimage.c:495 util/grub-mkimage.c:496 msgid "arm-uboot" msgstr "" #: util/grub-mkimage.c:514 util/grub-mkimage.c:515 msgid "arm-efi" msgstr "" #: grub-core/fs/newc.c:61 msgid "newc" msgstr "" #: grub-core/fs/odc.c:49 msgid "odc" msgstr "" #: grub-core/fs/cpio.c:49 msgid "cpiofs" msgstr "" #: grub-core/fs/cpio_be.c:49 msgid "cpiofs_be" msgstr "" #: grub-core/fs/cpio_common.c:153 msgid " filesystem" msgstr "" #: include/grub/uboot/api_public.h:65 msgid "UBootAPI" msgstr "" #: grub-core/net/drivers/uboot/ubootnet.c:146 #, c-format msgid "ubnet_%d" msgstr "" #: grub-core/loader/arm/linux.c:103 msgid "linux,initrd-start" msgstr "" #: grub-core/loader/arm/linux.c:107 msgid "linux,initrd-end" msgstr "" #: grub-core/kern/uboot/init.c:131 msgid "grub_bootdev" msgstr "" #: grub-core/kern/uboot/init.c:141 msgid "grub_bootpath" msgstr "" #: grub-core/kern/arm/dl_helper.c:106 msgid "BLX" msgstr "" #: grub-core/kern/arm/dl_helper.c:106 msgid "BL" msgstr "" #: grub-core/term/uboot/console.c:130 msgid "grub_term" msgstr "" #: grub-core/gfxmenu/theme_loader.c:203 msgid "terminal-border" msgstr "" #: grub-core/gfxmenu/theme_loader.c:209 msgid "terminal-left" msgstr "" #: grub-core/gfxmenu/theme_loader.c:219 msgid "terminal-top" msgstr "" #: grub-core/gfxmenu/theme_loader.c:229 msgid "terminal-width" msgstr "" #: grub-core/gfxmenu/theme_loader.c:239 msgid "terminal-height" msgstr "" #: grub-core/gfxmenu/theme_loader.c:181 msgid "desktop-image-scale-method" msgstr "" #: grub-core/gfxmenu/theme_loader.c:186 msgid "crop" msgstr "" #: grub-core/gfxmenu/theme_loader.c:189 msgid "padding" msgstr "" #: grub-core/gfxmenu/theme_loader.c:192 msgid "fitwidth" msgstr "" #: grub-core/gfxmenu/theme_loader.c:195 msgid "fitheight" msgstr "" #: grub-core/gfxmenu/theme_loader.c:203 msgid "desktop-image-h-align" msgstr "" #: grub-core/gfxmenu/theme_loader.c:216 msgid "desktop-image-v-align" msgstr "" #: grub-core/gfxmenu/theme_loader.c:222 msgid "bottom" msgstr "" #: include/grub/emu/misc.h:29 msgid "C:\\" msgstr "" #: grub-core/disk/diskfilter.c:120 util/grub-probe.c:298 msgid "lvmid/" msgstr "" #: grub-core/kern/emu/hostdisk_devmapper.c:112 msgid "LVM-" msgstr "" #: grub-core/kern/emu/hostdisk_devmapper.c:113 msgid "mpath-" msgstr "" #: grub-core/kern/emu/hostdisk_devmapper.c:114 msgid "DMRAID-" msgstr "" #: util/grub-probe.c:749 #, c-format msgid "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x" msgstr "" #: util/grub-probe.c:843 msgid "gpt_parttype" msgstr "" #: grub-core/kern/uboot/init.c:85 msgid "invalid U-Boot API version\n" msgstr "" #: util/grub-mknetdir.c:144 #, c-format msgid "source %s/grub.cfg" msgstr "" #: util/grub-mknetdir.c:149 msgid "core" msgstr "" #: util/grub-mknetdir.c:174 msgid "/srv/tftp" msgstr "" #: util/grub-mkpasswd-pbkdf2.c:188 msgid "XXXXXXXXXXXXXXXXXXX" msgstr "" #: util/grub-mkrescue.c:71 #, c-format msgid "%s=%s" msgstr "" #: util/grub-mkrescue.c:97 msgid "rom-directory" msgstr "" #: util/grub-mkrescue.c:99 util/grub-mkrescue.c:373 msgid "xorriso" msgstr "" #: util/grub-mkrescue.c:102 msgid "grub-glue-efi" msgstr "" #: util/grub-mkrescue.c:103 msgid "grub-render-label" msgstr "" #: util/grub-mkrescue.c:104 msgid "label-font" msgstr "" #: util/grub-mkrescue.c:105 msgid "label-color" msgstr "" #: util/grub-mkrescue.c:106 msgid "label-bgcolor" msgstr "" #: util/grub-mkrescue.c:107 msgid "product-name" msgstr "" #: util/grub-mkrescue.c:108 msgid "product-version" msgstr "" #: util/grub-mkrescue.c:109 msgid "sparc-boot" msgstr "" #: util/grub-mkrescue.c:110 msgid "arcs-boot" msgstr "" #: util/grub-mkrescue.c:120 msgid "xorriso -as mkisofs -help" msgstr "" #: util/grub-mkrescue.c:236 #, c-format msgid "insmod %s\n" msgstr "" #: util/grub-mkrescue.c:258 #, c-format msgid "search --fs-uuid --set=root %s" msgstr "" #: util/grub-mkrescue.c:259 #, c-format msgid "set prefix=(${root})/boot/grub" msgstr "" #: util/grub-mkrescue.c:266 util/grub-mkrescue.c:479 util/grub-mkrescue.c:523 msgid "/boot/grub" msgstr "" #: util/grub-mkrescue.c:305 msgid "()/boot/grub" msgstr "" #: util/grub-mkrescue.c:322 util/grub-mkrescue.c:382 msgid "-as" msgstr "" #: util/grub-mkrescue.c:323 util/grub-mkrescue.c:383 msgid "mkisofs" msgstr "" #: util/grub-mkrescue.c:324 msgid "-help" msgstr "" #: util/grub-mkrescue.c:374 msgid "unicode.pf2" msgstr "" #: util/grub-mkrescue.c:384 msgid "-graft-points" msgstr "" #: util/grub-mkrescue.c:390 msgid "roms" msgstr "" #: util/grub-mkrescue.c:442 #, c-format msgid "%04d-%02d-%02d-%02d-%02d-%02d-00" msgstr "" #: util/grub-mkrescue.c:454 msgid "--modification-date=" msgstr "" #: util/grub-mkrescue.c:468 msgid "eltorito.img" msgstr "" #: util/grub-mkrescue.c:471 msgid "BIOS" msgstr "" #: util/grub-mkrescue.c:481 util/mkimage.c:180 msgid "i386-pc-eltorito" msgstr "" #: util/grub-mkrescue.c:484 msgid "boot/grub/i386-pc/eltorito.img" msgstr "" #: util/grub-mkrescue.c:485 msgid "-no-emul-boot" msgstr "" #: util/grub-mkrescue.c:486 msgid "-boot-load-size" msgstr "" #: util/grub-mkrescue.c:487 msgid "4" msgstr "" #: util/grub-mkrescue.c:488 msgid "-boot-info-table" msgstr "" #: util/grub-mkrescue.c:491 msgid "grub2-boot-info" msgstr "" #: util/grub-mkrescue.c:494 msgid "boot_hybrid.img" msgstr "" #: util/grub-mkrescue.c:495 msgid "--grub2-boot-info" msgstr "" #: util/grub-mkrescue.c:496 msgid "--grub2-mbr" msgstr "" #: util/grub-mkrescue.c:537 util/grub-mkrescue.c:742 msgid "-G" msgstr "" #: util/grub-mkrescue.c:550 msgid "i386-multiboot/core.elf" msgstr "" #: util/grub-mkrescue.c:555 msgid "ofwx86.elf" msgstr "" #: util/grub-mkrescue.c:565 msgid "System" msgstr "" #: util/grub-mkrescue.c:565 msgid "Library" msgstr "" #: util/grub-mkrescue.c:565 msgid "CoreServices" msgstr "" #: util/grub-mkrescue.c:568 msgid "mach_kernel" msgstr "" #: util/grub-mkrescue.c:573 msgid "SystemVersion.plist" msgstr "" #: util/grub-mkrescue.c:587 msgid ".disk_label" msgstr "" #: util/grub-mkrescue.c:589 msgid "white" msgstr "" #: util/grub-mkrescue.c:590 msgid "black" msgstr "" #: util/grub-mkrescue.c:592 msgid ".disk_label.contentDetails" msgstr "" #: util/grub-mkrescue.c:600 msgid "-hfsplus" msgstr "" #: util/grub-mkrescue.c:601 msgid "-apm-block-size" msgstr "" #: util/grub-mkrescue.c:602 msgid "2048" msgstr "" #: util/grub-mkrescue.c:603 util/grub-mkrescue.c:702 msgid "-hfsplus-file-creator-type" msgstr "" #: util/grub-mkrescue.c:604 util/grub-mkrescue.c:692 util/grub-mkrescue.c:703 msgid "chrp" msgstr "" #: util/grub-mkrescue.c:605 msgid "tbxj" msgstr "" #: util/grub-mkrescue.c:606 msgid "/System/Library/CoreServices/.disk_label" msgstr "" #: util/grub-mkrescue.c:611 util/grub-mkrescue.c:706 msgid "-hfs-bless-by" msgstr "" #: util/grub-mkrescue.c:613 msgid "/System/Library/CoreServices/boot.efi" msgstr "" #: util/grub-mkrescue.c:630 msgid "bootia64.efi" msgstr "" #: util/grub-mkrescue.c:634 msgid "bootx64.efi" msgstr "" #: util/grub-mkrescue.c:637 msgid "bootia32.efi" msgstr "" #: util/grub-mkrescue.c:640 msgid "bootarm.efi" msgstr "" #: util/grub-mkrescue.c:646 util/grub-mkrescue.c:653 msgid "boot.efi" msgstr "" #: util/grub-mkrescue.c:668 util/grub-mkrescue.c:673 msgid "efi.img" msgstr "" #: util/grub-mkrescue.c:669 msgid "mformat" msgstr "" #: util/grub-mkrescue.c:669 msgid "-C" msgstr "" #: util/grub-mkrescue.c:669 msgid "2880" msgstr "" #: util/grub-mkrescue.c:669 msgid "16" msgstr "" #: util/grub-mkrescue.c:669 util/grub-mkrescue.c:671 msgid "-i" msgstr "" #: util/grub-mkrescue.c:670 msgid "::" msgstr "" #: util/grub-mkrescue.c:671 msgid "mcopy" msgstr "" #: util/grub-mkrescue.c:671 msgid "::/" msgstr "" #: util/grub-mkrescue.c:672 msgid "--efi-boot" msgstr "" #: util/grub-mkrescue.c:674 msgid "-efi-boot-part" msgstr "" #: util/grub-mkrescue.c:675 msgid "--efi-boot-image" msgstr "" #: util/grub-mkrescue.c:683 msgid "powerpc-ieee1275/core.elf" msgstr "" #: util/grub-mkrescue.c:688 msgid "grub.chrp" msgstr "" #: util/grub-mkrescue.c:690 util/grub-mkrescue.c:693 msgid "bootinfo.txt" msgstr "" #: util/grub-mkrescue.c:691 msgid "BootX" msgstr "" #: util/grub-mkrescue.c:692 util/grub-mkrescue.c:693 msgid "ppc" msgstr "" #: util/grub-mkrescue.c:697 msgid "/System/Library/CoreServices/grub.elf" msgstr "" #: util/grub-mkrescue.c:697 util/grub-mkrescue.c:698 msgid "/boot/grub/powerpc-ieee1275/core.elf" msgstr "" #: util/grub-mkrescue.c:698 msgid "/boot/grub/powerpc.elf" msgstr "" #: util/grub-mkrescue.c:704 msgid "tbxi" msgstr "" #: util/grub-mkrescue.c:705 msgid "/System/Library/CoreServices/BootX" msgstr "" #: util/grub-mkrescue.c:707 msgid "p" msgstr "" #: util/grub-mkrescue.c:708 msgid "/System/Library/CoreServices" msgstr "" #: util/grub-mkrescue.c:710 msgid "-sysid" msgstr "" #: util/grub-mkrescue.c:711 msgid "PPC" msgstr "" #: util/grub-mkrescue.c:715 msgid "sparc64-ieee1275/core.img" msgstr "" #: util/grub-mkrescue.c:725 util/mkimage.c:1361 msgid "cdboot.img" msgstr "" #: util/grub-mkrescue.c:746 msgid "--grub2-sparc-core" msgstr "" #: util/grub-mkrescue.c:747 msgid "/boot/grub/sparc64-ieee1275/core.img" msgstr "" #: util/grub-mkrescue.c:750 msgid "mips-arc/core.img" msgstr "" #: util/grub-mkrescue.c:754 util/grub-mkrescue.c:765 msgid "/boot/grub/mips-arc/grub" msgstr "" #: util/grub-mkrescue.c:754 util/grub-mkrescue.c:755 util/grub-mkrescue.c:756 msgid "/boot/grub/mips-arc/core.img" msgstr "" #: util/grub-mkrescue.c:755 util/grub-mkrescue.c:761 msgid "/boot/grub/mips-arc/sashARCS" msgstr "" #: util/grub-mkrescue.c:756 util/grub-mkrescue.c:763 msgid "/boot/grub/mips-arc/sash" msgstr "" #: util/grub-mkrescue.c:760 util/grub-mkrescue.c:762 util/grub-mkrescue.c:764 msgid "-mips-boot" msgstr "" #: util/grub-mkrescue.c:768 msgid "arc.exe" msgstr "" #: util/grub-mkrescue.c:771 util/grub-mkrescue.c:799 msgid "roms/mipsel-qemu_mips.elf" msgstr "" #: util/grub-mkrescue.c:773 util/grub-mkrescue.c:800 msgid "loongson.elf" msgstr "" #: util/grub-mkrescue.c:775 util/grub-mkrescue.c:801 msgid "mipsel-yeeloong.bin" msgstr "" #: util/grub-mkrescue.c:776 msgid "mipsel-fuloong2f.bin" msgstr "" #: util/grub-mkrescue.c:778 util/grub-mkrescue.c:803 msgid "roms/mips-qemu_mips.elf" msgstr "" #: util/grub-mkrescue.c:782 util/grub-mkrescue.c:804 msgid "roms/qemu.img" msgstr "" #: util/grub-mkrescue.c:786 util/grub-mkrescue.c:805 msgid "roms/coreboot.elf" msgstr "" #: util/grub-mkrescue.c:799 msgid "mipsel-qemu_mips.elf" msgstr "" #: util/grub-mkrescue.c:800 msgid "mipsel-loongson.elf" msgstr "" #: util/grub-mkrescue.c:801 msgid "roms/mipsel-yeeloong.bin" msgstr "" #: util/grub-mkrescue.c:802 msgid "roms/mipsel-fulong.bin" msgstr "" #: util/grub-mkrescue.c:802 msgid "mipsel-fulong.bin" msgstr "" #: util/grub-mkrescue.c:803 msgid "mips-qemu_mips.elf" msgstr "" #: util/grub-mkrescue.c:804 msgid "qemu.img" msgstr "" #: util/grub-mkrescue.c:805 msgid "coreboot.elf" msgstr "" #: util/grub-mkrescue.c:816 msgid "--protective-msdos-label" msgstr "" #: util/grub-mkrescue.c:821 util/grub-mkrescue.c:824 msgid "--sort-weight" msgstr "" #: util/grub-mkrescue.c:826 msgid "/boot" msgstr "" #: util/grub-mkstandalone.c:227 util/grub-mkstandalone.c:257 msgid "0000600" msgstr "" #: util/grub-mkstandalone.c:228 util/grub-mkstandalone.c:229 #: util/grub-mkstandalone.c:258 util/grub-mkstandalone.c:259 msgid "0001750" msgstr "" #: util/grub-mkstandalone.c:234 util/grub-mkstandalone.c:264 msgid "ustar " msgstr "" #: util/grub-mkstandalone.c:346 msgid "tar" msgstr "" #: util/mkimage.c:261 util/mkimage.c:262 msgid "i386-xen" msgstr "" #: util/mkimage.c:280 util/mkimage.c:281 msgid "x86_64-xen" msgstr "" #: grub-core/commands/verify.c:170 grub-core/commands/verify.c:171 msgid "gcry_rsa" msgstr "" #: grub-core/commands/xen/lsxen.c:46 grub-core/commands/xen/lsxen.c:60 msgid "domid" msgstr "" #: grub-core/commands/xen/lsxen.c:49 #, c-format msgid "/local/domain/%s" msgstr "" #: grub-core/disk/xen/xendisk.c:82 #, c-format msgid "%s/sectors" msgstr "" #: grub-core/disk/xen/xendisk.c:90 #, c-format msgid "%s/sector-size" msgstr "" #: grub-core/disk/xen/xendisk.c:280 #, c-format msgid "device/vbd/%s/backend" msgstr "" #: grub-core/disk/xen/xendisk.c:285 #, c-format msgid "%s/dev" msgstr "" #: grub-core/disk/xen/xendisk.c:291 #, c-format msgid "xenid/%s" msgstr "" #: grub-core/disk/xen/xendisk.c:295 #, c-format msgid "xen/%s" msgstr "" #: grub-core/disk/xen/xendisk.c:301 #, c-format msgid "device/vbd/%s/backend-id" msgstr "" #: grub-core/disk/xen/xendisk.c:331 #, c-format msgid "device/vbd/%s/ring-ref" msgstr "" #: grub-core/disk/xen/xendisk.c:337 #, c-format msgid "device/vbd/%s/event-channel" msgstr "" #: grub-core/disk/xen/xendisk.c:343 #, c-format msgid "device/vbd/%s/protocol" msgstr "" #: grub-core/disk/xen/xendisk.c:353 #, c-format msgid "device/vbd/%s/state" msgstr "" #: grub-core/disk/xen/xendisk.c:354 msgid "3" msgstr "" #: grub-core/disk/xen/xendisk.c:360 grub-core/disk/xen/xendisk.c:422 #: grub-core/disk/xen/xendisk.c:428 grub-core/disk/xen/xendisk.c:454 #, c-format msgid "%s/state" msgstr "" #: grub-core/disk/xen/xendisk.c:373 #, c-format msgid "device/vbd/%s" msgstr "" #: grub-core/disk/xen/xendisk.c:396 grub-core/disk/xen/xendisk.c:405 msgid "device/vbd" msgstr "" #: grub-core/disk/xen/xendisk.c:424 grub-core/disk/xen/xendisk.c:433 msgid "6" msgstr "" #: grub-core/disk/xen/xendisk.c:440 #, c-format msgid "%s/ring-ref" msgstr "" #: grub-core/disk/xen/xendisk.c:444 #, c-format msgid "%s/event-channel" msgstr "" #: grub-core/gfxmenu/gui_list.c:747 msgid "item_pixmap_style" msgstr "" #: grub-core/gfxmenu/gui_list.c:787 msgid "scrollbar_thumb_overlay" msgstr "" #: grub-core/gfxmenu/gui_list.c:795 msgid "scrollbar_slice" msgstr "" #: grub-core/gfxmenu/gui_list.c:797 msgid "west" msgstr "" #: grub-core/gfxmenu/gui_list.c:801 msgid "east" msgstr "" #: grub-core/gfxmenu/gui_list.c:804 msgid "scrollbar_left_pad" msgstr "" #: grub-core/gfxmenu/gui_list.c:808 msgid "scrollbar_right_pad" msgstr "" #: grub-core/gfxmenu/gui_list.c:812 msgid "scrollbar_top_pad" msgstr "" #: grub-core/gfxmenu/gui_list.c:816 msgid "scrollbar_bottom_pad" msgstr "" #: grub-core/gfxmenu/gui_progress_bar.c:377 msgid "highlight_overlay" msgstr "" #: grub-core/kern/mips/dl.c:267 msgid "_gp_disp" msgstr "" #: grub-core/lib/progress.c:81 #, c-format msgid " [ %.20s %s %llu%% " msgstr "" #: grub-core/lib/progress.c:88 #, c-format msgid "%s ]" msgstr "" #: grub-core/lib/reed_solomon.c:74 msgid "_text,_text" msgstr "" #: grub-core/loader/i386/bsd.c:1571 msgid "wd" msgstr "" #: grub-core/loader/i386/bsd.c:1572 msgid "fd" msgstr "" #: grub-core/loader/i386/bsd.c:1573 grub-core/osdep/linux/ofpath.c:415 msgid "sd" msgstr "" #: grub-core/loader/i386/bsd.c:1575 msgid "vnd" msgstr "" #: grub-core/loader/i386/bsd.c:1576 msgid "rd" msgstr "" #: grub-core/loader/i386/xen_fileXX.c:45 msgid "PAE=no," msgstr "" #: grub-core/loader/i386/xen_fileXX.c:55 msgid "PAE=yes," msgstr "" #: grub-core/loader/i386/xen_fileXX.c:65 grub-core/loader/i386/xen_fileXX.c:66 msgid "PAE=yes[extended-cr3]," msgstr "" #: grub-core/loader/i386/xen_fileXX.c:77 msgid "PAE=bimodal," msgstr "" #: grub-core/loader/i386/xen_fileXX.c:87 grub-core/loader/i386/xen_fileXX.c:88 msgid "PAE=bimodal[extended-cr3]," msgstr "" #: grub-core/loader/i386/xen_fileXX.c:99 msgid "PAE=yes,bimodal," msgstr "" #: grub-core/loader/i386/xen_fileXX.c:109 #: grub-core/loader/i386/xen_fileXX.c:110 msgid "PAE=yes[extended-cr3],bimodal," msgstr "" #: grub-core/loader/i386/xen_fileXX.c:121 #: grub-core/loader/i386/xen_fileXX.c:123 msgid "VIRT_BASE=" msgstr "" #: grub-core/loader/i386/xen_fileXX.c:128 #: grub-core/loader/i386/xen_fileXX.c:130 msgid "VIRT_ENTRY=" msgstr "" #: grub-core/loader/i386/xen_fileXX.c:135 #: grub-core/loader/i386/xen_fileXX.c:137 msgid "HYPERCALL_PAGE=" msgstr "" #: grub-core/loader/i386/xen_fileXX.c:143 #: grub-core/loader/i386/xen_fileXX.c:145 msgid "ELF_PADDR_OFFSET=" msgstr "" #: grub-core/loader/i386/xen_fileXX.c:191 util/mkimage.c:712 msgid "Xen" msgstr "" #: grub-core/loader/i386/xen_fileXX.c:220 util/grub-mkimagexx.c:207 #: util/grub-mkimagexx.c:212 util/grub-mkimagexx.c:213 msgid "generic" msgstr "" #: grub-core/loader/i386/xen_fileXX.c:231 util/grub-mkimagexx.c:258 #: util/grub-mkimagexx.c:259 msgid "yes" msgstr "" #: grub-core/loader/i386/xen_fileXX.c:237 msgid "bimodal" msgstr "" #: grub-core/loader/i386/xen_fileXX.c:243 util/grub-mkimagexx.c:253 msgid "yes,bimodal" msgstr "" #: grub-core/loader/i386/xen_fileXX.c:327 #: grub-core/loader/i386/xen_fileXX.c:338 #: grub-core/loader/i386/xen_fileXX.c:339 msgid "__xen_guest" msgstr "" #: grub-core/loader/multiboot.c:244 msgid "--quirk-bad-kludge" msgstr "" #: grub-core/loader/multiboot.c:251 msgid "--quirk-modules-after-kernel" msgstr "" #: grub-core/net/dns.c:712 msgid "--only-ipv4" msgstr "" #: grub-core/net/dns.c:714 msgid "--only-ipv6" msgstr "" #: grub-core/net/dns.c:716 msgid "--prefer-ipv4" msgstr "" #: grub-core/net/dns.c:718 msgid "--prefer-ipv6" msgstr "" #: grub-core/normal/main.c:538 msgid "feature_timeout_style" msgstr "" #: grub-core/normal/main.c:587 msgid "light-gray/black" msgstr "" #: grub-core/normal/main.c:588 msgid "black/light-gray" msgstr "" #: grub-core/normal/menu.c:53 msgid "menu" msgstr "" #: grub-core/normal/menu.c:54 msgid "countdown" msgstr "" #: grub-core/osdep/aros/config.c:39 grub-core/osdep/unix/config.c:39 #: util/grub-install.c:739 util/grub-install.c:1395 util/grub-install.c:1540 #: util/grub-mkrescue.c:388 util/grub-mkstandalone.c:235 #: util/grub-mkstandalone.c:236 util/grub-mkstandalone.c:265 #: util/grub-mkstandalone.c:266 util/grub-mkstandalone.c:311 msgid "grub" msgstr "" #: grub-core/osdep/aros/config.c:46 grub-core/osdep/unix/config.c:46 msgid "pkgdatadir" msgstr "" #: grub-core/osdep/aros/config.c:73 grub-core/osdep/unix/config.c:77 #: grub-core/osdep/windows/config.c:40 msgid "GRUB_ENABLE_CRYPTODISK" msgstr "" #: grub-core/osdep/aros/config.c:77 grub-core/osdep/unix/config.c:81 #: grub-core/osdep/windows/config.c:44 msgid "GRUB_DISTRIBUTOR" msgstr "" #: grub-core/osdep/linux/hostdisk.c:109 grub-core/osdep/linux/hostdisk.c:127 msgid "udevadm" msgstr "" #: grub-core/osdep/linux/hostdisk.c:110 msgid "info" msgstr "" #: grub-core/osdep/linux/hostdisk.c:111 msgid "--query" msgstr "" #: grub-core/osdep/linux/hostdisk.c:113 msgid "--name" msgstr "" #: grub-core/osdep/linux/hostdisk.c:139 #, c-format msgid "/sys%s/%s" msgstr "" #: grub-core/osdep/linux/ofpath.c:105 msgid "/obppath" msgstr "" #: grub-core/osdep/linux/ofpath.c:117 #, c-format msgid "%s/obppath" msgstr "" #: grub-core/osdep/linux/ofpath.c:125 #, c-format msgid "%s/devspec" msgstr "" #: grub-core/osdep/linux/ofpath.c:132 msgid "/sys" msgstr "" #: grub-core/osdep/linux/ofpath.c:182 grub-core/osdep/linux/ofpath.c:185 msgid "/sys/block/" msgstr "" #: grub-core/osdep/linux/ofpath.c:189 grub-core/osdep/linux/ofpath.c:191 msgid "/device" msgstr "" #: grub-core/osdep/linux/ofpath.c:237 #, c-format msgid "/disk@%d" msgstr "" #: grub-core/osdep/linux/ofpath.c:244 #, c-format msgid "/disk@%d:%c" msgstr "" #: grub-core/osdep/linux/ofpath.c:277 #, c-format msgid "vdc-port-%d-%d" msgstr "" #: grub-core/osdep/linux/ofpath.c:295 #, c-format msgid "%d.%d" msgstr "" #: grub-core/osdep/linux/ofpath.c:311 msgid "/vendor" msgstr "" #: grub-core/osdep/linux/ofpath.c:315 #, c-format msgid "%s/vendor" msgstr "" #: grub-core/osdep/linux/ofpath.c:334 grub-core/osdep/linux/ofpath.c:345 msgid "end_device" msgstr "" #: grub-core/osdep/linux/ofpath.c:353 grub-core/osdep/linux/ofpath.c:355 #, c-format msgid "%s/sas_device/%s/phy_identifier" msgstr "" #: grub-core/osdep/linux/ofpath.c:368 #, c-format msgid "%s/sas_device/%s/sas_address" msgstr "" #: grub-core/osdep/linux/ofpath.c:376 #, c-format msgid "%lx" msgstr "" #: grub-core/osdep/linux/ofpath.c:391 grub-core/osdep/linux/ofpath.c:412 msgid "/fp@0,0" msgstr "" #: grub-core/osdep/linux/ofpath.c:396 #, c-format msgid "%d:%d:%d:%d" msgstr "" #: grub-core/osdep/linux/ofpath.c:411 msgid "qlc" msgstr "" #: grub-core/osdep/linux/ofpath.c:414 msgid "sbus" msgstr "" #: grub-core/osdep/linux/ofpath.c:420 msgid "/vdevice/" msgstr "" #: grub-core/osdep/linux/ofpath.c:425 #, c-format msgid "/%s@%04lx000000000000" msgstr "" #: grub-core/osdep/linux/ofpath.c:433 #, c-format msgid "/%s@%04lx000000000000:%c" msgstr "" #: grub-core/osdep/linux/ofpath.c:445 #, c-format msgid "/sas/%s@%x" msgstr "" #: grub-core/osdep/linux/ofpath.c:453 #, c-format msgid "/sas/%s@%x:%c" msgstr "" #: grub-core/osdep/linux/ofpath.c:468 #, c-format msgid "%02x%02x%02x%02x00000000" msgstr "" #: grub-core/osdep/linux/ofpath.c:473 #, c-format msgid "/sas/%s@%lx,%lu" msgstr "" #: grub-core/osdep/linux/ofpath.c:481 #, c-format msgid "/sas/%s@%lx,%lu:%c" msgstr "" #: grub-core/osdep/linux/ofpath.c:529 msgid "floppy" msgstr "" #: grub-core/osdep/linux/platform.c:60 util/grub-install-common.c:650 #: util/grub-install-common.c:652 msgid "x86_64" msgstr "" #: grub-core/osdep/linux/platform.c:73 grub-core/osdep/unix/platform.c:151 msgid "modprobe" msgstr "" #: grub-core/osdep/linux/platform.c:73 grub-core/osdep/unix/platform.c:151 msgid "efivars" msgstr "" #: grub-core/osdep/linux/platform.c:74 grub-core/osdep/unix/exec.c:153 msgid "/dev/null" msgstr "" #: grub-core/osdep/linux/platform.c:77 msgid "/sys/firmware/efi" msgstr "" #: grub-core/osdep/linux/platform.c:87 msgid "/proc/device-tree" msgstr "" #: grub-core/osdep/unix/compress.c:25 msgid "gzip" msgstr "" #: grub-core/osdep/unix/compress.c:25 msgid "--best" msgstr "" #: grub-core/osdep/unix/compress.c:26 grub-core/osdep/unix/compress.c:33 msgid "--stdout" msgstr "" #: grub-core/osdep/unix/compress.c:33 msgid "--lzma2=dict=128KiB" msgstr "" #: grub-core/osdep/unix/compress.c:33 msgid "--check=none" msgstr "" #: grub-core/osdep/unix/compress.c:39 msgid "lzop" msgstr "" #: grub-core/osdep/unix/compress.c:39 msgid "-9" msgstr "" #: grub-core/osdep/unix/compress.c:39 grub-core/osdep/unix/config.c:90 #: grub-core/osdep/unix/platform.c:160 grub-core/osdep/unix/platform.c:166 msgid "-c" msgstr "" #: grub-core/osdep/unix/config.c:89 msgid "sh" msgstr "" #: grub-core/osdep/unix/config.c:95 msgid ". '" msgstr "" #: grub-core/osdep/unix/exec.c:126 grub-core/osdep/unix/exec.c:184 #: grub-core/osdep/unix/exec.c:229 msgid "LC_ALL" msgstr "" #: grub-core/osdep/unix/hostdisk.c:296 grub-core/osdep/unix/hostdisk.c:314 msgid "TMPDIR" msgstr "" #: grub-core/osdep/unix/hostdisk.c:300 grub-core/osdep/unix/hostdisk.c:318 msgid "/tmp" msgstr "" #: grub-core/osdep/unix/hostdisk.c:302 grub-core/osdep/unix/hostdisk.c:304 #: grub-core/osdep/unix/hostdisk.c:305 grub-core/osdep/unix/hostdisk.c:320 #: grub-core/osdep/unix/hostdisk.c:322 grub-core/osdep/unix/hostdisk.c:323 msgid "/grub.XXXXXX" msgstr "" #: grub-core/osdep/unix/platform.c:41 grub-core/osdep/unix/platform.c:179 #: grub-core/osdep/unix/platform.c:183 msgid "ofpathname" msgstr "" #: grub-core/osdep/unix/platform.c:85 grub-core/osdep/unix/platform.c:92 #: grub-core/osdep/unix/platform.c:100 grub-core/osdep/unix/platform.c:122 #: grub-core/osdep/unix/platform.c:125 grub-core/osdep/unix/platform.c:142 #: grub-core/osdep/unix/platform.c:146 grub-core/osdep/unix/platform.c:159 #: grub-core/osdep/unix/platform.c:165 msgid "efibootmgr" msgstr "" #: grub-core/osdep/unix/platform.c:113 grub-core/osdep/unix/platform.c:114 #: grub-core/osdep/unix/platform.c:115 grub-core/osdep/unix/platform.c:119 msgid "Boot" msgstr "" #: grub-core/osdep/unix/platform.c:122 grub-core/osdep/unix/platform.c:151 #: grub-core/osdep/unix/platform.c:159 msgid "-q" msgstr "" #: grub-core/osdep/unix/platform.c:123 grub-core/osdep/unix/platform.c:126 #: util/grub-mkrescue.c:483 msgid "-b" msgstr "" #: grub-core/osdep/unix/platform.c:123 grub-core/osdep/unix/platform.c:126 #: util/grub-mkrescue.c:744 msgid "-B" msgstr "" #: grub-core/osdep/unix/platform.c:161 grub-core/osdep/unix/platform.c:167 msgid "-p" msgstr "" #: grub-core/osdep/unix/platform.c:161 grub-core/osdep/unix/platform.c:167 msgid "-w" msgstr "" #: grub-core/osdep/unix/platform.c:162 grub-core/osdep/unix/platform.c:168 #: util/grub-mkrescue.c:669 msgid "-L" msgstr "" #: grub-core/osdep/unix/platform.c:195 grub-core/osdep/unix/platform.c:199 msgid "XXXXXXXXXXXXXXXXXXXX" msgstr "" #: grub-core/osdep/unix/platform.c:215 msgid "nvsetenv" msgstr "" #: grub-core/osdep/unix/platform.c:215 msgid "boot-device" msgstr "" #: grub-core/osdep/unix/platform.c:218 #, c-format msgid "setenv boot-device %s" msgstr "" #: grub-core/osdep/unix/platform.c:231 msgid "dvhtool" msgstr "" #: grub-core/osdep/unix/platform.c:232 msgid "--unix-to-vh" msgstr "" #: grub-core/osdep/unix/relpath.c:109 #, c-format msgid "/%s/@" msgstr "" #: grub-core/osdep/unix/relpath.c:141 #, c-format msgid "/%s/@%s" msgstr "" #: grub-core/osdep/windows/hostdisk.c:494 #: grub-core/osdep/windows/hostdisk.c:495 msgid "\\GRUB." msgstr "" #: grub-core/osdep/windows/init.c:50 msgid "GetCurrentConsoleFont" msgstr "" #: grub-core/osdep/windows/init.c:71 grub-core/osdep/windows/platform.c:73 msgid "kernel32.dll" msgstr "" #: grub-core/osdep/windows/init.c:81 msgid "SetCurrentConsoleFontEx" msgstr "" #: grub-core/osdep/windows/init.c:93 grub-core/osdep/windows/init.c:94 msgid "Lucida Console" msgstr "" #: grub-core/osdep/windows/init.c:105 msgid "SetConsoleFont" msgstr "" #: grub-core/osdep/windows/init.c:123 util/grub-mknetdir.c:139 msgid "grub.cfg" msgstr "" #: grub-core/osdep/windows/init.c:181 util/grub-install-common.c:702 msgid "locale" msgstr "" #: grub-core/osdep/windows/platform.c:28 msgid "{8be4df61-93ca-11d2-aa0d-00e098032b8c}" msgstr "" #: grub-core/osdep/windows/platform.c:81 msgid "GetFirmwareEnvironmentVariableW" msgstr "" #: grub-core/osdep/windows/platform.c:83 msgid "SetFirmwareEnvironmentVariableW" msgstr "" #: grub-core/osdep/windows/platform.c:85 msgid "GetNativeSystemInfo" msgstr "" #: grub-core/osdep/windows/platform.c:101 #: grub-core/osdep/windows/platform.c:238 #: grub-core/osdep/windows/platform.c:409 msgid "BootOrder" msgstr "" #: grub-core/osdep/windows/platform.c:185 #: grub-core/osdep/windows/platform.c:196 msgid "Boot0000" msgstr "" #: include/grub/i386/cpuid.h:42 include/grub/i386/cpuid.h:65 msgid "%rcx" msgstr "" #: include/grub/osdep/hostfile_aros.h:110 msgid "SYS:" msgstr "" #: include/grub/util/install.h:32 msgid "install-modules" msgstr "" #: include/grub/util/install.h:35 util/grub-install-common.c:64 #: util/grub-install-common.c:812 util/grub-install-common.c:823 msgid "themes" msgstr "" #: include/grub/util/install.h:37 util/grub-install-common.c:703 msgid "fonts" msgstr "" #: include/grub/util/install.h:39 msgid "locales" msgstr "" #: include/grub/util/install.h:41 msgid "compress" msgstr "" #: include/grub/util/install.h:42 msgid "no,xz,gz,lzo" msgstr "" #: include/grub/util/install.h:44 msgid "core-compress" msgstr "" #: include/grub/util/install.h:50 msgid "override-directory" msgstr "" #: include/grub/util/install.h:53 msgid "locale-directory" msgstr "" #: include/grub/util/install.h:56 msgid "themes-directory" msgstr "" #: include/grub/util/install.h:59 msgid "grub-mkimage" msgstr "" #: util/config.c:35 util/config.c:36 util/config.c:38 msgid "GRUB_ENABLE_CRYPTODISK=" msgstr "" #: util/config.c:45 util/config.c:46 util/config.c:51 msgid "GRUB_DISTRIBUTOR=" msgstr "" #: util/grub-install-common.c:55 util/grub-install-common.c:804 msgid "starfield" msgstr "" #: util/grub-install-common.c:57 util/grub-install-common.c:840 msgid "unicode" msgstr "" #: util/grub-install-common.c:193 msgid ".lst" msgstr "" #: util/grub-install-common.c:194 util/grub-mknetdir.c:97 msgid ".img" msgstr "" #: util/grub-install-common.c:195 util/grub-install-common.c:617 #: util/grub-install-common.c:623 util/grub-install-common.c:628 #: util/grub-install-common.c:629 util/grub-install-common.c:758 #: util/grub-install-common.c:771 util/grub-install-common.c:774 #: util/grub-install-common.c:787 msgid ".mo" msgstr "" #: util/grub-install-common.c:196 msgid "menu.lst" msgstr "" #: util/grub-install-common.c:370 msgid "gz" msgstr "" #: util/grub-install-common.c:380 msgid "lzo" msgstr "" #: util/grub-install-common.c:404 util/grub-install-common.c:411 msgid "gcry_crc" msgstr "" #: util/grub-install-common.c:430 msgid "lzma" msgstr "" #: util/grub-install-common.c:453 msgid "--memdisk '" msgstr "" #: util/grub-install-common.c:460 msgid "--config '" msgstr "" #: util/grub-install-common.c:467 msgid "--pubkey '" msgstr "" #: util/grub-install-common.c:488 msgid "--note" msgstr "" #: util/grub-install-common.c:618 msgid ".gmo" msgstr "" #: util/grub-install-common.c:628 util/grub-install-common.c:785 msgid "LC_MESSAGES" msgstr "" #: util/grub-install-common.c:644 util/grub-install-common.c:645 #: util/grub-install-common.c:646 util/grub-install-common.c:647 #: util/grub-install-common.c:648 util/grub-install-common.c:649 #: util/grub-install-common.c:651 msgid "i386" msgstr "" #: util/grub-install-common.c:646 msgid "qemu" msgstr "" #: util/grub-install-common.c:647 msgid "coreboot" msgstr "" #: util/grub-install-common.c:653 util/grub-install-common.c:654 #: util/grub-install-common.c:656 msgid "mipsel" msgstr "" #: util/grub-install-common.c:653 msgid "loongson" msgstr "" #: util/grub-install-common.c:654 util/grub-install-common.c:655 msgid "qemu_mips" msgstr "" #: util/grub-install-common.c:655 util/grub-install-common.c:657 msgid "mips" msgstr "" #: util/grub-install-common.c:658 msgid "sparc64" msgstr "" #: util/grub-install-common.c:659 msgid "powerpc" msgstr "" #: util/grub-install-common.c:660 msgid "ia64" msgstr "" #: util/grub-install-common.c:661 util/grub-install-common.c:663 msgid "arm" msgstr "" #: util/grub-install-common.c:662 msgid "arm64" msgstr "" #: util/grub-install-common.c:663 msgid "uboot" msgstr "" #: util/grub-install-common.c:669 util/grub-install-common.c:697 #: util/grub-install.c:1317 util/grub-install.c:1339 util/grub-install.c:1351 #, c-format msgid "%s-%s" msgstr "" #: util/grub-install-common.c:736 msgid "command.lst" msgstr "" #: util/grub-install-common.c:737 msgid "fs.lst" msgstr "" #: util/grub-install-common.c:737 util/grub-mkrescue.c:224 msgid "partmap.lst" msgstr "" #: util/grub-install-common.c:738 msgid "parttool.lst" msgstr "" #: util/grub-install-common.c:739 msgid "video.lst" msgstr "" #: util/grub-install-common.c:739 msgid "crypto.lst" msgstr "" #: util/grub-install-common.c:740 msgid "terminal.lst" msgstr "" #: util/grub-install-common.c:757 util/grub-install-common.c:769 msgid "po" msgstr "" #: util/grub-install-common.c:818 msgid "theme.txt" msgstr "" #: util/grub-install-common.c:874 msgid "modinfo.sh" msgstr "" #: util/grub-install-common.c:882 util/grub-install-common.c:888 msgid "grub_modinfo_target_cpu=" msgstr "" #: util/grub-install-common.c:885 util/grub-install-common.c:889 msgid "grub_modinfo_platform=" msgstr "" #: util/grub-install.c:118 msgid "setup" msgstr "" #: util/grub-install.c:212 msgid "boot-directory" msgstr "" #: util/grub-install.c:214 msgid "root-directory" msgstr "" #: util/grub-install.c:221 msgid "grub-setup" msgstr "" #: util/grub-install.c:222 msgid "grub-mkrelpath" msgstr "" #: util/grub-install.c:223 msgid "grub-mkdevicemap" msgstr "" #: util/grub-install.c:224 msgid "grub-probe" msgstr "" #: util/grub-install.c:225 msgid "grub-editenv" msgstr "" #: util/grub-install.c:231 msgid "recheck" msgstr "" #: util/grub-install.c:235 msgid "force-file-id" msgstr "" #: util/grub-install.c:237 msgid "disk-module" msgstr "" #: util/grub-install.c:240 msgid "no-nvram" msgstr "" #: util/grub-install.c:245 msgid "no-bootsector" msgstr "" #: util/grub-install.c:247 util/grub-setup.c:91 msgid "no-rs-codes" msgstr "" #: util/grub-install.c:253 util/grub-mknetdir.c:46 msgid "debug-image" msgstr "" #: util/grub-install.c:254 msgid "removable" msgstr "" #: util/grub-install.c:257 msgid "bootloader-id" msgstr "" #: util/grub-install.c:259 msgid "efi-directory" msgstr "" #: util/grub-install.c:280 util/mkimage.c:586 util/mkimage.c:587 msgid "arm64-efi" msgstr "" #: util/grub-install.c:341 msgid "part_bsd" msgstr "" #: util/grub-install.c:345 #, c-format msgid "part_%s" msgstr "" #: util/grub-install.c:471 #, c-format msgid "cryptomount -u %s\n" msgstr "" #: util/grub-install.c:788 util/grub-install.c:1067 msgid "native" msgstr "" #: util/grub-install.c:842 msgid "device.map" msgstr "" #: util/grub-install.c:885 util/grub-install.c:998 msgid "EFI" msgstr "" #: util/grub-install.c:948 msgid "BOOT" msgstr "" #: util/grub-install.c:952 msgid "BOOTIA32.EFI" msgstr "" #: util/grub-install.c:955 msgid "BOOTX64.EFI" msgstr "" #: util/grub-install.c:958 msgid "BOOTIA64.EFI" msgstr "" #: util/grub-install.c:961 msgid "BOOTARM.EFI" msgstr "" #: util/grub-install.c:964 msgid "BOOTAARCH64.EFI" msgstr "" #: util/grub-install.c:979 msgid "grubia32.efi" msgstr "" #: util/grub-install.c:982 msgid "grubx64.efi" msgstr "" #: util/grub-install.c:985 msgid "grubia64.efi" msgstr "" #: util/grub-install.c:988 msgid "grubarm.efi" msgstr "" #: util/grub-install.c:991 msgid "grubarm64.efi" msgstr "" #: util/grub-install.c:994 util/grub-install.c:1404 util/grub-install.c:1545 msgid "grub.efi" msgstr "" #: util/grub-install.c:1062 msgid "GRUB_ENABLE_CRYPTODISK=1" msgstr "" #: util/grub-install.c:1097 util/grub-mknetdir.c:111 msgid "load.cfg" msgstr "" #: util/grub-install.c:1105 util/grub-mknetdir.c:126 #, c-format msgid "set debug='%s'\n" msgstr "" #: util/grub-install.c:1155 #, c-format msgid "search.fs_uuid %s root " msgstr "" #: util/grub-install.c:1157 msgid "search_fs_uuid" msgstr "" #: util/grub-install.c:1174 #, c-format msgid "search.file %s root " msgstr "" #: util/grub-install.c:1176 msgid "search_fs_file" msgstr "" #: util/grub-install.c:1232 #, c-format msgid "ieee1275/%s" msgstr "" #: util/grub-install.c:1315 msgid "core.efi" msgstr "" #: util/grub-install.c:1324 util/grub-install.c:1337 msgid "core.elf" msgstr "" #: util/grub-install.c:1326 #, c-format msgid "%s-%s-elf" msgstr "" #: util/grub-install.c:1386 msgid "grub.elf" msgstr "" #: util/grub-install.c:1449 util/grub-install.c:1476 msgid "--allow-floppy " msgstr "" #: util/grub-install.c:1450 util/grub-install.c:1477 msgid "--verbose " msgstr "" #: util/grub-install.c:1451 util/grub-install.c:1478 msgid "--force " msgstr "" #: util/grub-install.c:1452 util/grub-install.c:1479 msgid "--skip-fs-probe" msgstr "" #: util/grub-install.c:1453 msgid "--no-rs-codes" msgstr "" #: util/grub-install.c:1510 #, c-format msgid "dd if=/dev/zero of=%s" msgstr "" #: util/grub-install.c:1568 #, c-format msgid "\\EFI\\%s\\%s" msgstr "" #: util/grub-mkimagexx.c:95 util/grub-mkimagexx.c:352 #: util/grub-mkimagexx.c:354 msgid ".xen" msgstr "" #: util/grub-mkimagexx.c:218 util/grub-mkimagexx.c:223 #: util/grub-mkimagexx.c:224 msgid "xen-3.0" msgstr "" #: util/grub-mknetdir.c:41 msgid "net-directory" msgstr "" #: util/grub-mknetdir.c:43 msgid "subdir" msgstr "" #: util/grub-mknetdir.c:96 msgid ".0" msgstr "" #: util/grub-mknetdir.c:98 util/grub-mknetdir.c:99 msgid ".elf" msgstr "" #: util/grub-mknetdir.c:100 util/grub-mknetdir.c:101 util/grub-mknetdir.c:102 #: util/grub-mknetdir.c:103 msgid ".efi" msgstr "" #: util/grub-mkrescue.c:259 #, c-format msgid "set prefix=(${root})/boot/grub\n" msgstr "" #: util/grub-mkrescue.c:258 #, c-format msgid "search --fs-uuid --set=root %s\n" msgstr "" #: util/grub-mkrescue.c:575 #, c-format msgid "\n" "\n" " ProductBuildVersion\n" " \n" " ProductName\n" " %s\n" " ProductVersion\n" " %s\n" "\n" "\n" msgstr "" #: util/grub-install.c:1264 #, c-format msgid "set prefix=($root)'%s'\n" msgstr "" #: grub-core/osdep/unix/config.c:108 #, c-format msgid "'; printf \"GRUB_ENABLE_CRYPTODISK=%s\\nGRUB_DISTRIBUTOR=%s\\n\", " "\"$GRUB_ENABLE_CRYPTODISK\", \"$GRUB_DISTRIBUTOR\"" msgstr "" #: grub-core/commands/tr.c:33 msgid "upcase" msgstr "" #: grub-core/commands/tr.c:34 msgid "downcase" msgstr "" #: grub-core/commands/tr.c:38 msgid "abcdefghijklmnopqrstuvwxyz" msgstr "" #: grub-core/commands/tr.c:39 msgid "ABCDEFGHIJKLMNOPQRSTUVWXYZ" msgstr "" #: grub-core/net/dns.c:694 #, c-format msgid "%s (%s)\n" msgstr "" #: grub-core/osdep/aros/hostdisk.c:570 #, c-format msgid "T:grub.%d.%d.%d.%d" msgstr "" #: util/grub-install.c:1722 msgid "\\\\BootX" msgstr "" #: util/grub-install.c:1816 msgid "\\System\\Library\\CoreServices" msgstr "" #: util/grub-install.c:1702 util/grub-install.c:1802 msgid "r+" msgstr "" #: util/grub-install.c:1128 msgid "macppc" msgstr "" #: util/grub-install.c:296 msgid "macppc-directory" msgstr "" #: grub-core/term/xen/xen_kbd.c:468 grub-core/term/xen/xen_kbd.c:477 msgid "xen_keyboard" msgstr "" #: grub-core/video/xen/xenfb.c:79 #, c-format msgid "device/vfb/%s/backend" msgstr "" #: grub-core/video/xen/xenfb.c:87 #, c-format msgid "device/vfb/%s/backend-id" msgstr "" #: grub-core/video/xen/xenfb.c:102 #, c-format msgid "device/vfb/%s/page-ref" msgstr "" #: grub-core/video/xen/xenfb.c:108 #, c-format msgid "device/vfb/%s/protocol" msgstr "" #: grub-core/video/xen/xenfb.c:120 #, c-format msgid "device/vfb/%s/event-channel" msgstr "" #: grub-core/video/xen/xenfb.c:131 #, c-format msgid "device/vfb/%s" msgstr "" #: grub-core/video/xen/xenfb.c:172 #, c-format msgid "device/vfb/%s/state" msgstr "" #: grub-core/video/xen/xenfb.c:270 msgid "device/vfb" msgstr "" #: include/grub/emu/misc.h:46 msgid "I64u" msgstr "" #: include/grub/emu/misc.h:47 msgid "I64x" msgstr "" #: grub-core/term/xen/xen_kbd.c:143 #, c-format msgid "device/vkbd/%s/backend" msgstr "" #: grub-core/term/xen/xen_kbd.c:151 #, c-format msgid "device/vkbd/%s/backend-id" msgstr "" #: grub-core/term/xen/xen_kbd.c:166 #, c-format msgid "device/vkbd/%s/page-ref" msgstr "" #: grub-core/term/xen/xen_kbd.c:172 #, c-format msgid "device/vkbd/%s/protocol" msgstr "" #: grub-core/term/xen/xen_kbd.c:184 #, c-format msgid "device/vkbd/%s/event-channel" msgstr "" #: grub-core/term/xen/xen_kbd.c:195 #, c-format msgid "device/vkbd/%s" msgstr "" #: grub-core/term/xen/xen_kbd.c:204 #, c-format msgid "device/vkbd/%s/state" msgstr "" #: grub-core/term/xen/xen_kbd.c:267 grub-core/video/xen/xenfb.c:239 #, c-format msgid "%s/page-ref" msgstr "" #: grub-core/term/xen/xen_kbd.c:291 msgid "device/vkbd" msgstr "" #: grub-core/commands/fileXX.c:51 grub-core/commands/fileXX.c:62 #: grub-core/commands/fileXX.c:63 msgid ".note.netbsd.ident" msgstr "" #: grub-core/commands/legacycfg.c:484 msgid "initrd16initrd" msgstr "" #: grub-core/commands/syslinuxcfg.c:146 msgid "extract_syslinux_entries_" msgstr "" #: grub-core/commands/syslinuxcfg.c:147 msgid "syslinux_" msgstr "" #: grub-core/commands/file.c:41 msgid "is-x86_64-xen-domu" msgstr "" #: grub-core/commands/file.c:69 msgid "is-x86_64-kfreebsd" msgstr "" #: grub-core/commands/file.c:76 msgid "is-x86_64-knetbsd" msgstr "" #: grub-core/commands/file.c:81 msgid "is-x86_64-efi" msgstr "" #: grub-core/commands/file.c:89 msgid "is-x86_64-xnu" msgstr "" #: grub-core/commands/file.c:506 msgid "hibr" msgstr "" #: grub-core/commands/file.c:508 msgid "HIBR" msgstr "" #: grub-core/disk/diskfilter.c:1060 msgid ",%" msgstr "" #: grub-core/disk/diskfilter.c:1061 #, c-format msgid ") into %s (%s)\n" msgstr "" #: grub-core/osdep/windows/blocklist.c:88 msgid ", first_lcn=%" msgstr "" #: util/grub-mkimagexx.c:438 msgid " (0x%" msgstr "" #: util/grub-mkimagexx.c:666 util/grub-mkimagexx.c:679 #: util/grub-mkimagexx.c:702 util/grub-mkimagexx.c:728 #: util/grub-mkimagexx.c:812 msgid " at the offset 0x%" msgstr "" #: util/misc.c:149 msgid " bytes at offset 0x%" msgstr "" #: grub-core/term/serial.c:64 msgid "on|off" msgstr "" #: util/grub-mkimagexx.c:898 msgid "jump24 relocation out of range" msgstr "" #: grub-core/osdep/linux/ofpath.c:48 #, c-format msgid "ofpath: error: " msgstr "" #: grub-core/osdep/linux/ofpath.c:61 #, c-format msgid "ofpath: info: " msgstr "" #: grub-core/osdep/linux/ofpath.c:119 #, c-format msgid "Trying %s\n" msgstr "" #: grub-core/osdep/windows/blocklist.c:108 #, c-format msgid "FSCTL_GET_RETRIEVAL_POINTERS fails: %s" msgstr "" #: grub-core/osdep/windows/blocklist.c:84 #, c-format msgid "unsupported fs for blocklist on windows: %s" msgstr "" #: include/grub/util/install.h:45 util/grub-mkstandalone.c:45 msgid "xz|none|auto" msgstr "" #: util/grub-mkimagexx.c:845 msgid "CALL26 Relocation out of range" msgstr "" #: grub-core/commands/verify.c:313 msgid "\x99" msgstr "" #: grub-core/commands/videotest.c:122 msgid "Unicode test: happy\xE2\x98\xBA \xC2\xA3 5.00" " \xC2\xA1\xCF\x84\xC3\xA4u! " " \xE2\x84\xA4\xE2\x8A\x86\xE2\x84\x9D" msgstr "" #: grub-core/disk/luks.c:40 msgid "LUKS\xBA\xBE" msgstr "" #: grub-core/disk/lvmparse.c:67 grub-core/disk/lvmparse.c:69 msgid " = [" msgstr "" #: grub-core/disk/lvmparse.c:115 grub-core/disk/lvmparse.c:123 #: grub-core/disk/lvmparse.c:167 grub-core/disk/lvmparse.c:170 msgid "id = \"" msgstr "" #: grub-core/disk/lvmparse.c:127 msgid "extent_size = " msgstr "" #: grub-core/disk/lvmparse.c:143 grub-core/disk/lvmparse.c:146 msgid "physical_volumes {" msgstr "" #: grub-core/disk/lvmparse.c:174 msgid "pe_start = " msgstr "" #: grub-core/disk/lvmparse.c:199 msgid "logical_volumes" msgstr "" #: grub-core/disk/lvmparse.c:202 msgid "logical_volumes = " msgstr "" #: grub-core/disk/lvmparse.c:226 grub-core/disk/lvmparse.c:227 msgid "status" msgstr "" #: grub-core/disk/lvmparse.c:226 msgid "VISIBLE" msgstr "" #: grub-core/disk/lvmparse.c:227 msgid "PVMOVE" msgstr "" #: grub-core/disk/lvmparse.c:228 msgid "segment_count = " msgstr "" #: grub-core/disk/lvmparse.c:246 msgid "segment" msgstr "" #: grub-core/disk/lvmparse.c:255 msgid "start_extent = " msgstr "" #: grub-core/disk/lvmparse.c:263 msgid "extent_count = " msgstr "" #: grub-core/disk/lvmparse.c:272 grub-core/disk/lvmparse.c:275 msgid "type = \"" msgstr "" #: grub-core/disk/lvmparse.c:277 grub-core/disk/lvmparse.c:278 msgid "striped\"" msgstr "" #: grub-core/disk/lvmparse.c:282 msgid "stripe_count = " msgstr "" #: grub-core/disk/lvmparse.c:292 grub-core/disk/lvmparse.c:396 msgid "stripe_size = " msgstr "" #: grub-core/disk/lvmparse.c:299 grub-core/disk/lvmparse.c:307 msgid "stripes = [" msgstr "" #: grub-core/disk/lvmparse.c:332 msgid "mirror\"" msgstr "" #: grub-core/disk/lvmparse.c:336 msgid "mirror_count = " msgstr "" #: grub-core/disk/lvmparse.c:350 grub-core/disk/lvmparse.c:358 msgid "mirrors = [" msgstr "" #: grub-core/disk/lvmparse.c:375 grub-core/disk/lvmparse.c:376 #: grub-core/disk/lvmparse.c:377 grub-core/disk/lvmparse.c:384 msgid "raid" msgstr "" #: grub-core/disk/lvmparse.c:378 msgid "raidX" msgstr "" #: grub-core/disk/lvmparse.c:386 msgid "device_count = " msgstr "" #: grub-core/disk/lvmparse.c:410 grub-core/disk/lvmparse.c:418 msgid "raids = [" msgstr "" #: grub-core/fs/cpio.c:24 msgid "\xc7\x71" msgstr "" #: grub-core/fs/cpio_be.c:23 msgid "\x71\xc7" msgstr "" #: grub-core/gfxmenu/gui_circular_progress.c:244 msgid "\xc2\xb0" msgstr "" #: grub-core/kern/ieee1275/cmain.c:88 msgid "IBM pSeries (emulated by qemu)" msgstr "" #: grub-core/lib/all_video.c:36 msgid "/video.lst" msgstr "" #: grub-core/osdep/unix/config.c:108 #, c-format msgid "" "'; printf \"GRUB_ENABLE_CRYPTODISK=%s\\nGRUB_DISTRIBUTOR=%s\\n\" " "\"$GRUB_ENABLE_CRYPTODISK\" \"$GRUB_DISTRIBUTOR\"" msgstr "" #: include/grub/dl.h:141 msgid "license" msgstr "" #: util/grub-install.c:1106 msgid "BOOTAA64.EFI" msgstr "" #: util/grub-install.c:1133 msgid "grubaa64.efi" msgstr "" #: util/grub-install.c:1274 msgid "GRUB_ENABLE_CRYPTODISK=y" msgstr "" #: util/grub-mkrescue.c:656 msgid "part_gpt" msgstr "" #: util/grub-mkrescue.c:657 msgid "part_msdos" msgstr "" #: util/grub-mkrescue.c:663 util/grub-mkrescue.c:668 util/grub-mkrescue.c:723 msgid "part_apple" msgstr "" #: util/grub-mkrescue.c:677 msgid "bootaa64.efi" msgstr "" #: util/grub-probe.c:136 util/grub-probe.c:151 util/grub-probe.c:190 #: util/grub-probe.c:247 #, c-format msgid "%s%c" msgstr "" #: util/grub-probe.c:233 #, c-format msgid "lvm%c" msgstr "" #: util/grub-probe.c:237 #, c-format msgid "ldm%c" msgstr "" #: util/grub-probe.c:245 #, c-format msgid "diskfilter%c" msgstr "" #: util/grub-probe.c:250 #, c-format msgid "raid5rec%c" msgstr "" #: util/grub-probe.c:252 #, c-format msgid "raid6rec%c" msgstr "" #: util/grub-mkrescue.c:136 #, c-format msgid "%s\n\n%s\n\n%s" msgstr "" #: grub-core/kern/arm/cache.c:133 msgid "couldn't get memory map, not enabling caches" msgstr "" #: grub-core/kern/arm/cache.c:149 #, c-format msgid "%d crossers\n" msgstr "" #: grub-core/kern/arm/cache.c:154 msgid "couldn't allocate place for MMU table, not enabling caches" msgstr "" #: grub-core/kern/arm/cache.c:212 msgid "MMU tables generated\n" msgstr "" #: grub-core/kern/arm/cache.c:216 msgid "enabling MMU\n" msgstr "" #: grub-core/kern/arm/cache.c:218 msgid "MMU enabled\n" msgstr "" #: grub-core/commands/verify.c:313 msgid "™" msgstr "" #: grub-core/commands/videotest.c:122 msgid "Unicode test: happy☺ £ 5.00 ¡τäu! ℤ⊆ℝ" msgstr "" #: grub-core/disk/luks.c:40 msgid "LUKSº¾" msgstr "" #: grub-core/fs/cpio.c:24 msgid "Çq" msgstr "" #: grub-core/fs/cpio_be.c:23 msgid "qÇ" msgstr "" #: grub-core/gfxmenu/gui_circular_progress.c:244 msgid "°" msgstr "" #: grub-core/lib/xzembed/xz_stream.h:35 msgid "ý7zXZ" msgstr "" #: grub-core/partmap/msdos.c:74 msgid "ÔA õ" msgstr "" #: grub-core/partmap/msdos.c:80 msgid "ØA õ" msgstr "" #: grub-core/partmap/msdos.c:87 msgid "pŠ]F5Å“®=†ý±U>à" msgstr "" #: grub-core/io/lzopio.c:30 msgid "" "‰LZO\n" "\n" msgstr "" #: grub-core/bus/emu/pci.c:58 #, c-format msgid "mapping 0x%llx failed (error %d)" msgstr "" #: grub-core/disk/dmraid_nvidia.c:175 msgid "nv" msgstr "" #: grub-core/fs/xfs.c:478 msgid ") - %" msgstr "" #: grub-core/fs/xfs.c:478 #, c-format msgid ", %d " msgstr "" #: grub-core/fs/xfs.c:550 msgid "BMA3" msgstr "" #: grub-core/fs/zfs/zfs.c:284 msgid "com.delphix:hole_birth" msgstr "" #: grub-core/fs/zfs/zfs.c:285 msgid "com.delphix:embedded_data" msgstr "" #: grub-core/fs/zfs/zfs.c:286 msgid "com.delphix:extensible_dataset" msgstr "" #: grub-core/fs/zfs/zfs.c:287 msgid "org.open-zfs:large_blocks" msgstr "" #: grub-core/fs/zfs/zfs.c:1877 msgid "/%" msgstr "" #: grub-core/osdep/linux/platform.c:73 msgid "/sys/firmware/efi/fw_platform_size" msgstr "" #: util/grub-mkrescue.c:454 msgid "-output" msgstr "" #: util/grub-mkrescue.c:455 msgid "--output" msgstr "" grub-2.14~git20250718.0e36779/po/insert-header.sin0000644000175000017500000000124015000202015015637 00000000000000# Sed script that inserts the file called HEADER before the header entry. # # At each occurrence of a line starting with "msgid ", we execute the following # commands. At the first occurrence, insert the file. At the following # occurrences, do nothing. The distinction between the first and the following # occurrences is achieved by looking at the hold space. /^msgid /{ x # Test if the hold space is empty. s/m/m/ ta # Yes it was empty. First occurrence. Read the file. r HEADER # Output the file's contents by reading the next line. But don't lose the # current line while doing this. g N bb :a # The hold space was nonempty. Following occurrences. Do nothing. x :b } grub-2.14~git20250718.0e36779/po/swiss.sed0000644000175000017500000000015115000202015014237 00000000000000s,ß,ss,g y,»«,«», s,\bRechner\b,Computer,g s,\bStrg\b,Ctrl,g s,\bEinfg\b,Insert,g s,\bEntf\b,Del,g grub-2.14~git20250718.0e36779/po/README0000644000175000017500000000177415000202015013266 00000000000000 If you checked out this source tree directly from GRUB Git, you might be wondering where are the POT and PO files. Here are some instructions that will hopefully clarify the situation. - If you're a user or a distributor, simply fill the po directory by importing translations from the Translation Project: ./linguas.sh GRUB's build system will automatically detect those and include them in your install. - If you're a translator and want to add a new translation or improve an existing one, get in touch with the Translation Project (http://translationproject.org/). The GRUB project doesn't interact with translators directly (but we dearly appreciate your work!). - If you're a developer adding/removing/modifying translatable strings, you can check that these turn into a sane POT file by using the `po/grub.pot' make rule. - If you're the maintainer of GNU GRUB preparing a new release, don't forget to include the latest PO files in your source tarball! grub-2.14~git20250718.0e36779/po/hebrew.sed0000644000175000017500000000233715033157230014371 00000000000000/^Project-Id-Version:/ b /^Report-Msgid-Bugs-To:/ b /^POT-Creation-Date:/ b /^PO-Revision-Date:/ b /^Last-Translator:/ b /^Language-Team:/ b /^Language:/ b /^MIME-Version:/ b /^Content-Type:/ b /^Content-Transfer-Encoding:/ b /^Plural-Forms:/ b s,%\([0-9]*\)C,%\1#,g s,a,א,g s,b,בּ,g s,c,צ,g s,d,ד,g s,e,ע,g s,f,פֿ,g s,g,ג,g s,h,ה,g s,i,ִי,g s,j,י,g s,k,כּ,g s,l,ל,g s,m,מ,g s,n,נ,g s,o,וֹ,g s,p,פּ,g s,q,ק,g s,r,ר,g s,s,ש,g s,t,ת,g s,u,וּ,g s,v,בֿ,g s,w,ו,g s,x,כּס,g s,y,יִ,g s,z,ז,g s,ü,ֻ,g s,ä,ֶ,g s,ö,ֵ,g s,ß,סס,g s,A,א,g s,B,בּ,g s,C,צ,g s,D,ד,g s,E,ע,g s,F,פֿ,g s,G,ג,g s,H,ה,g s,I,ִי,g s,J,י,g s,K,כּ,g s,L,ל,g s,M,מ,g s,N,נ,g s,O,וֹ,g s,P,פּ,g s,Q,ק,g s,R,ר,g s,S,ש,g s,T,ת,g s,U,וּ,g s,V,בֿ,g s,W,ו,g s,X,כּס,g s,Y,יִ,g s,Z,ז,g s,Ü,ֻ,g s,Ä,ֶ,g s,Ö,ֵ,g s,ß,סס,g s,%\([0-9]*\)#,%\1C,g s,%\([0-9]*\)צ,%\1c,g s,%\([0-9]*\)ד,%\1d,g s,%\([0-9]*\)לד,%\1ld,g s,%\([0-9]*\)ללד,%\1lld,g s,%\([0-9\.\*]*\)ש,%\1s,g s,%\([0-9\.\*]*\)מ,%\1m,g s,%\([0-9]*\)וּ,%\1u,g s,%\([0-9]*\)לוּ,%\1lu,g s,%\([0-9]*\)ללוּ,%\1llu,g s,%\([0-9]*\)זוּ,%\1zu,g s,%\([0-9]*\)כּס,%\1x,g s,%\([0-9]*\)לכּס,%\1lx,g s,%\([0-9]*\)ללכּס,%\1llx,g grub-2.14~git20250718.0e36779/po/Rules-swiss0000644000175000017500000000036415000202015014563 00000000000000# Special Makefile rules for transforming German typography into Swiss one. DISTFILES.common.extra2 = swiss.sed Rules-swiss de_CH.po-create: de.po swiss.sed LC_ALL=C.UTF-8 $(MSGFILTER) -i $< -o $(srcdir)/de_CH.po sed -f $(srcdir)/swiss.sed grub-2.14~git20250718.0e36779/po/gettext-patches/0000755000175000017500000000000015036452574015620 500000000000000grub-2.14~git20250718.0e36779/po/gettext-patches/0004-Use-SHELL-rather-than-bin-sh.patch0000644000175000017500000000126315002425525024123 00000000000000From f36f12e77798223ee7ee882c0d09e0e63db11454 Mon Sep 17 00:00:00 2001 From: Colin Watson Date: Sun, 1 Mar 2020 12:14:07 +0000 Subject: [PATCH 4/4] Use @SHELL rather than /bin/sh /bin/sh might not exist. --- gettext-runtime/po/Makefile.in.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gettext-runtime/po/Makefile.in.in b/gettext-runtime/po/Makefile.in.in index f3ef54c39..285a55a9d 100644 --- a/gettext-runtime/po/Makefile.in.in +++ b/gettext-runtime/po/Makefile.in.in @@ -16,7 +16,7 @@ VERSION = @VERSION@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ SED = @SED@ -SHELL = /bin/sh +SHELL = @SHELL@ @SET_MAKE@ srcdir = @srcdir@ -- 2.17.1 grub-2.14~git20250718.0e36779/po/gettext-patches/0003-Make-msgfmt-output-in-little-endian.patch0000644000175000017500000000262015002425525025767 00000000000000From 156c523e2945c9b43c5500fb93988b0dd2f08d75 Mon Sep 17 00:00:00 2001 From: Vladimir Serbinenko Date: Sun, 1 Mar 2020 12:09:25 +0000 Subject: [PATCH 3/4] Make msgfmt output in little-endian GRUB expects this. --- gettext-runtime/po/Makefile.in.in | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gettext-runtime/po/Makefile.in.in b/gettext-runtime/po/Makefile.in.in index 32e0c99a2..f3ef54c39 100644 --- a/gettext-runtime/po/Makefile.in.in +++ b/gettext-runtime/po/Makefile.in.in @@ -84,13 +84,13 @@ CATALOGS = @CATALOGS@ .po.mo: @echo "$(MSGFMT) -c -o $@ $<"; \ - $(MSGFMT) -c -o t-$@ $< && mv t-$@ $@ + $(MSGFMT) --endianness=little -c -o t-$@ $< && mv t-$@ $@ .po.gmo: @lang=`echo $* | sed -e 's,.*/,,'`; \ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ - echo "$${cdcmd}rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics --verbose -o $${lang}.gmo $${lang}.po"; \ - cd $(srcdir) && rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics --verbose -o t-$${lang}.gmo $${lang}.po && mv t-$${lang}.gmo $${lang}.gmo + echo "$${cdcmd}rm -f $${lang}.gmo && $(GMSGFMT) --endianness=little -c --statistics --verbose -o $${lang}.gmo $${lang}.po"; \ + cd $(srcdir) && rm -f $${lang}.gmo && $(GMSGFMT) --endianness=little -c --statistics --verbose -o t-$${lang}.gmo $${lang}.po && mv t-$${lang}.gmo $${lang}.gmo .sin.sed: sed -e '/^#/d' $< > t-$@ -- 2.17.1 grub-2.14~git20250718.0e36779/po/gettext-patches/0001-Support-POTFILES-shell.patch0000644000175000017500000000504115002425525023130 00000000000000From d5bbd8f60aacb0f73ea5a0bde999152c467d0e78 Mon Sep 17 00:00:00 2001 From: Colin Watson Date: Sun, 1 Mar 2020 11:57:58 +0000 Subject: [PATCH 1/4] Support POTFILES-shell --- gettext-runtime/po/Makefile.in.in | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/gettext-runtime/po/Makefile.in.in b/gettext-runtime/po/Makefile.in.in index fabdc76c9..32e9323d3 100644 --- a/gettext-runtime/po/Makefile.in.in +++ b/gettext-runtime/po/Makefile.in.in @@ -142,7 +142,7 @@ stamp-po: $(srcdir)/$(DOMAIN).pot # The determination of whether the package xyz is a GNU one is based on the # heuristic whether some file in the top level directory mentions "GNU xyz". # If GNU 'find' is available, we avoid grepping through monster files. -$(DOMAIN).pot-update: $(POTFILES) $(srcdir)/POTFILES.in remove-potcdate.sed +$(DOMAIN).pot-update: $(POTFILES) $(srcdir)/POTFILES.in $(srcdir)/POTFILES-shell.in remove-potcdate.sed if { if (LC_ALL=C find --version) 2>/dev/null | grep GNU >/dev/null; then \ LC_ALL=C find -L $(top_srcdir) -maxdepth 1 -type f -size -10000000c -exec grep 'GNU @PACKAGE@' /dev/null '{}' ';' 2>/dev/null; \ else \ @@ -175,7 +175,27 @@ $(DOMAIN).pot-update: $(POTFILES) $(srcdir)/POTFILES.in remove-potcdate.sed --package-version='@VERSION@' \ --msgid-bugs-address="$$msgid_bugs_address" \ ;; \ - esac + esac; \ + case `$(XGETTEXT) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \ + '' | 0.[0-9] | 0.[0-9].* | 0.1[0-5] | 0.1[0-5].* | 0.16 | 0.16.[0-1]*) \ + $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \ + --add-comments=TRANSLATORS: @XGETTEXT_EXTRA_OPTIONS@ \ + --files-from=$(srcdir)/POTFILES-shell.in \ + --copyright-holder='$(COPYRIGHT_HOLDER)' \ + --msgid-bugs-address="$$msgid_bugs_address" \ + --join-existing --language=Shell --keyword=gettext_quoted \ + ;; \ + *) \ + $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \ + --add-comments=TRANSLATORS: @XGETTEXT_EXTRA_OPTIONS@ \ + --files-from=$(srcdir)/POTFILES-shell.in \ + --copyright-holder='$(COPYRIGHT_HOLDER)' \ + --package-name="$${package_gnu}@PACKAGE@" \ + --package-version='@VERSION@' \ + --msgid-bugs-address="$$msgid_bugs_address" \ + --join-existing --language=Shell --keyword=gettext_quoted \ + ;; \ + esac; \ test ! -f $(DOMAIN).po || { \ if test -f $(srcdir)/$(DOMAIN).pot; then \ sed -f remove-potcdate.sed < $(srcdir)/$(DOMAIN).pot > $(DOMAIN).1po && \ -- 2.17.1 grub-2.14~git20250718.0e36779/po/gettext-patches/0002-Handle-gettext_printf-shell-function.patch0000644000175000017500000000377515002425525026330 00000000000000From fd17c51f2e6c87427679fbdfb5f6224ff48795db Mon Sep 17 00:00:00 2001 From: Colin Watson Date: Sun, 1 Mar 2020 12:00:41 +0000 Subject: [PATCH 2/4] Handle gettext_printf shell function Extract gettext_printf arguments. Run grub.d.sed over strings extracted from util/grub.d/, in order to set c-format flags (xgettext refuses to include these itself for strings it extracted from a shell file, but these really are c-format). --- gettext-runtime/po/Makefile.in.in | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/gettext-runtime/po/Makefile.in.in b/gettext-runtime/po/Makefile.in.in index 32e9323d3..32e0c99a2 100644 --- a/gettext-runtime/po/Makefile.in.in +++ b/gettext-runtime/po/Makefile.in.in @@ -183,7 +183,8 @@ $(DOMAIN).pot-update: $(POTFILES) $(srcdir)/POTFILES.in $(srcdir)/POTFILES-shell --files-from=$(srcdir)/POTFILES-shell.in \ --copyright-holder='$(COPYRIGHT_HOLDER)' \ --msgid-bugs-address="$$msgid_bugs_address" \ - --join-existing --language=Shell --keyword=gettext_quoted \ + --join-existing --language=Shell \ + --keyword=gettext_quoted --keyword=gettext_printf \ ;; \ *) \ $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \ @@ -193,10 +194,13 @@ $(DOMAIN).pot-update: $(POTFILES) $(srcdir)/POTFILES.in $(srcdir)/POTFILES-shell --package-name="$${package_gnu}@PACKAGE@" \ --package-version='@VERSION@' \ --msgid-bugs-address="$$msgid_bugs_address" \ - --join-existing --language=Shell --keyword=gettext_quoted \ + --join-existing --language=Shell \ + --keyword=gettext_quoted --keyword=gettext_printf \ ;; \ esac; \ test ! -f $(DOMAIN).po || { \ + sed -f grub.d.sed < $(DOMAIN).po > $(DOMAIN).1po && \ + mv $(DOMAIN).1po $(DOMAIN).po; \ if test -f $(srcdir)/$(DOMAIN).pot; then \ sed -f remove-potcdate.sed < $(srcdir)/$(DOMAIN).pot > $(DOMAIN).1po && \ sed -f remove-potcdate.sed < $(DOMAIN).po > $(DOMAIN).2po && \ -- 2.17.1 grub-2.14~git20250718.0e36779/po/Rules-translit0000644000175000017500000000232115002425525015265 00000000000000DISTFILES.common.extra4 = hebrew.sed cyrillic.sed greek.sed arabic.sed Rules-translit de@hebrew.po-create: de.po hebrew.sed LC_ALL=C $(MSGFILTER) -i $< -o $(srcdir)/de@hebrew.po sed -f $(srcdir)/hebrew.sed en@hebrew.po-create: $(DOMAIN).pot hebrew.sed LC_ALL=C $(MSGINIT) -i $(srcdir)/$(DOMAIN).pot --no-translator -l en@hebrew -o - 2>/dev/null | LC_ALL=C $(MSGCONV) -t UTF-8 | LC_ALL=C $(MSGFILTER) -o $(srcdir)/en@hebrew.po -i - sed -f $(srcdir)/hebrew.sed en@cyrillic.po-create: $(DOMAIN).pot cyrillic.sed LC_ALL=C $(MSGINIT) -i $(srcdir)/$(DOMAIN).pot --no-translator -l en@cyrillic -o - 2>/dev/null | LC_ALL=C $(MSGCONV) -t UTF-8 | LC_ALL=C $(MSGFILTER) -o $(srcdir)/en@cyrillic.po -i - sed -f $(srcdir)/cyrillic.sed en@greek.po-create: $(DOMAIN).pot greek.sed LC_ALL=C $(MSGINIT) -i $(srcdir)/$(DOMAIN).pot --no-translator -l en@greek -o - 2>/dev/null | LC_ALL=C $(MSGCONV) -t UTF-8 | LC_ALL=C $(MSGFILTER) -o $(srcdir)/en@greek.po -i - sed -f $(srcdir)/greek.sed en@arabic.po-create: $(DOMAIN).pot arabic.sed LC_ALL=C $(MSGINIT) -i $(srcdir)/$(DOMAIN).pot --no-translator -l en@arabic -o - 2>/dev/null | LC_ALL=C $(MSGCONV) -t UTF-8 | LC_ALL=C $(MSGFILTER) -o $(srcdir)/en@arabic.po -i - sed -f $(srcdir)/arabic.sed grub-2.14~git20250718.0e36779/po/boldquot.sed0000644000175000017500000000033115000202015014720 00000000000000s/"\([^"]*\)"/“\1”/g s/`\([^`']*\)'/‘\1’/g s/ '\([^`']*\)' / ‘\1’ /g s/ '\([^`']*\)'$/ ‘\1’/g s/^'\([^`']*\)' /‘\1’ /g s/“”/""/g s/“/“/g s/”/”/g s/‘/‘/g s/’/’/g grub-2.14~git20250718.0e36779/po/Rules-piglatin0000644000175000017500000000305615000202015015223 00000000000000# Special Makefile rules for Pig Latin message catalogs with quotation marks. DISTFILES.common.extra3 = piglatin.sed en@piglatin.header insert-header.sin Rules-piglatin .SUFFIXES: .insert-header .po-update-en-piglatin en@piglatin.po-create: $(MAKE) en@piglatin.po-update en@piglatin.po-update: en@piglatin.po-update-en .insert-header.po-update-en-piglatin: @lang=`echo $@ | sed -e 's/\.po-update-en-piglatin$$//'`; \ if test "$(PACKAGE)" = "gettext"; then PATH=`pwd`/../src:$$PATH; GETTEXTLIBDIR=`cd $(top_srcdir)/src && pwd`; export GETTEXTLIBDIR; fi; \ tmpdir=`pwd`; \ echo "$$lang:"; \ ll=`echo $$lang | sed -e 's/@.*//'`; \ LC_ALL=C; export LC_ALL; \ cd $(srcdir); \ if $(MSGINIT) -i $(DOMAIN).pot --no-translator -l $$lang -o - 2>/dev/null | sed -f $$tmpdir/$$lang.insert-header | $(MSGCONV) -t UTF-8 | $(MSGFILTER) sed -f `echo $$lang | sed -e 's/.*@//'`.sed 2>/dev/null > $$tmpdir/$$lang.new.po; then \ if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ rm -f $$tmpdir/$$lang.new.po; \ else \ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ :; \ else \ echo "creation of $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ exit 1; \ fi; \ fi; \ else \ echo "creation of $$lang.po failed!" 1>&2; \ rm -f $$tmpdir/$$lang.new.po; \ fi en@piglatin.insert-header: insert-header.sin sed -e '/^#/d' -e 's/HEADER/en@piglatin.header/g' $(srcdir)/insert-header.sin > en@piglatin.insert-header mostlyclean: mostlyclean-piglatin mostlyclean-piglatin: rm -f *.insert-header grub-2.14~git20250718.0e36779/po/grub.pot0000644000175000017500000063006515036452576014126 00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Free Software Foundation, Inc. # This file is distributed under the same license as the grub package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: grub 2.14~git20250718.0e36779\n" "Report-Msgid-Bugs-To: bug-grub@gnu.org\n" "POT-Creation-Date: 2025-07-18 15:09+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" #: grub-core/bus/usb/serial/ftdi.c:145 grub-core/bus/usb/serial/pl2303.c:158 #: grub-core/term/ieee1275/escc.c:169 grub-core/term/ns8250.c:262 msgid "unsupported serial port speed" msgstr "" #: grub-core/bus/usb/serial/ftdi.c:151 grub-core/bus/usb/serial/pl2303.c:164 #: grub-core/term/efi/serial.c:116 grub-core/term/ieee1275/escc.c:175 #: grub-core/term/ns8250.c:268 grub-core/term/serial.c:288 #: grub-core/term/serial.c:304 msgid "unsupported serial port parity" msgstr "" #: grub-core/bus/usb/serial/ftdi.c:157 grub-core/bus/usb/serial/pl2303.c:170 #: grub-core/term/efi/serial.c:122 grub-core/term/ieee1275/escc.c:181 #: grub-core/term/ns8250.c:273 grub-core/term/serial.c:328 msgid "unsupported serial port stop bits number" msgstr "" #: grub-core/bus/usb/serial/ftdi.c:161 grub-core/bus/usb/serial/pl2303.c:174 #: grub-core/term/efi/serial.c:126 grub-core/term/ieee1275/escc.c:185 #: grub-core/term/ns8250.c:277 msgid "unsupported serial port word length" msgstr "" #: grub-core/commands/acpi.c:57 msgid "Don't load host tables specified by comma-separated list." msgstr "" #: grub-core/commands/acpi.c:60 msgid "Load only tables specified by comma-separated list." msgstr "" #: grub-core/commands/acpi.c:61 msgid "Export version 1 tables to the OS." msgstr "" #: grub-core/commands/acpi.c:62 msgid "Export version 2 and version 3 tables to the OS." msgstr "" #: grub-core/commands/acpi.c:63 msgid "Set OEMID of RSDP, XSDT and RSDT." msgstr "" #: grub-core/commands/acpi.c:65 msgid "Set OEMTABLE ID of RSDP, XSDT and RSDT." msgstr "" #: grub-core/commands/acpi.c:67 msgid "Set OEMTABLE revision of RSDP, XSDT and RSDT." msgstr "" #: grub-core/commands/acpi.c:69 msgid "Set creator field of RSDP, XSDT and RSDT." msgstr "" #: grub-core/commands/acpi.c:71 msgid "Set creator revision of RSDP, XSDT and RSDT." msgstr "" #. TRANSLATORS: "hangs" here is a noun, not a verb. #: grub-core/commands/acpi.c:73 msgid "" "Don't update EBDA. May fix failures or hangs on some BIOSes but makes it " "ineffective with OS not receiving RSDP from GRUB." msgstr "" #: grub-core/commands/acpi.c:680 grub-core/commands/acpi.c:697 #: grub-core/commands/i386/pc/play.c:105 grub-core/commands/keylayouts.c:230 #: grub-core/commands/keylayouts.c:245 grub-core/commands/keylayouts.c:263 #: grub-core/efiemu/loadcore.c:350 grub-core/kern/elf.c:117 #: grub-core/kern/elfXX.c:29 grub-core/kern/elfXX.c:156 #: grub-core/kern/verifiers.c:156 grub-core/loader/arm/linux.c:320 #: grub-core/loader/arm64/xen_boot.c:346 grub-core/loader/efi/chainloader.c:278 #: grub-core/loader/efi/chainloader.c:299 #: grub-core/loader/efi/chainloader.c:331 grub-core/loader/efi/fdt.c:155 #: grub-core/loader/efi/linux.c:541 grub-core/loader/i386/bsd.c:1282 #: grub-core/loader/i386/bsd.c:2127 grub-core/loader/i386/bsdXX.c:20 #: grub-core/loader/i386/bsdXX.c:39 grub-core/loader/i386/bsdXX.c:70 #: grub-core/loader/i386/bsdXX.c:379 grub-core/loader/i386/bsdXX.c:398 #: grub-core/loader/i386/bsdXX.c:545 grub-core/loader/i386/bsdXX.c:561 #: grub-core/loader/i386/bsdXX.c:647 grub-core/loader/i386/bsdXX.c:670 #: grub-core/loader/i386/coreboot/chainloader.c:112 #: grub-core/loader/i386/coreboot/chainloader.c:148 #: grub-core/loader/i386/coreboot/chainloader.c:170 #: grub-core/loader/i386/linux.c:687 grub-core/loader/i386/linux.c:803 #: grub-core/loader/i386/linux.c:1024 grub-core/loader/i386/multiboot_mbi.c:174 #: grub-core/loader/i386/pc/chainloader.c:202 #: grub-core/loader/i386/pc/linux.c:150 grub-core/loader/i386/pc/linux.c:326 #: grub-core/loader/i386/pc/linux.c:368 grub-core/loader/i386/pc/plan9.c:457 #: grub-core/loader/i386/pc/plan9.c:550 grub-core/loader/i386/pc/plan9.c:566 #: grub-core/loader/i386/xen.c:940 grub-core/loader/i386/xen_file.c:72 #: grub-core/loader/i386/xen_fileXX.c:43 grub-core/loader/i386/xen_fileXX.c:186 #: grub-core/loader/i386/xen_fileXX.c:339 grub-core/loader/ia64/efi/linux.c:424 #: grub-core/loader/ia64/efi/linux.c:472 grub-core/loader/linux.c:332 #: grub-core/loader/macho.c:84 grub-core/loader/macho.c:109 #: grub-core/loader/machoXX.c:33 grub-core/loader/machoXX.c:46 #: grub-core/loader/machoXX.c:76 grub-core/loader/machoXX.c:116 #: grub-core/loader/machoXX.c:131 grub-core/loader/machoXX.c:147 #: grub-core/loader/machoXX.c:196 grub-core/loader/machoXX.c:317 #: grub-core/loader/multiboot.c:427 grub-core/loader/multiboot_elfxx.c:198 #: grub-core/loader/multiboot_elfxx.c:267 #: grub-core/loader/multiboot_elfxx.c:315 grub-core/loader/multiboot_mbi2.c:135 #: grub-core/loader/xnu.c:756 grub-core/loader/xnu.c:814 #: grub-core/loader/xnu.c:835 grub-core/loader/xnu.c:890 #: grub-core/loader/xnu.c:933 grub-core/loader/xnu.c:971 #: grub-core/loader/xnu_resume.c:68 grub-core/loader/xnu_resume.c:153 #: grub-core/loader/xnu_resume.c:165 util/grub-mkimagexx.c:2461 #, c-format msgid "premature end of file %s" msgstr "" #: grub-core/commands/acpi.c:809 msgid "" "[-1|-2] [--exclude=TABLE1,TABLE2|--load-only=TABLE1,TABLE2] FILE1 [FILE2] " "[...]" msgstr "" #: grub-core/commands/acpi.c:812 msgid "Load host ACPI tables and tables specified by arguments." msgstr "" #: grub-core/commands/acpihalt.c:368 grub-core/kern/err.c:110 #: grub-core/kern/fs.c:79 #, c-format msgid "error: %s.\n" msgstr "" #: grub-core/commands/acpihalt.c:368 script/yylex.l:390 #: grub-core/kern/efi/mm.c:145 grub-core/kern/efi/mm.c:158 #: grub-core/kern/emu/misc.c:100 grub-core/kern/emu/misc.c:112 #: grub-core/kern/emu/misc.c:122 grub-core/kern/emu/misc.c:151 #: grub-core/kern/emu/mm.c:34 grub-core/kern/emu/mm.c:44 #: grub-core/kern/emu/mm.c:73 grub-core/kern/mm.c:552 #: grub-core/lib/relocator.c:1286 grub-core/lib/relocator.c:1444 #: grub-core/lib/relocator.c:1546 grub-core/loader/arm/linux.c:260 #: grub-core/loader/arm64/xen_boot.c:334 grub-core/loader/arm64/xen_boot.c:357 #: grub-core/loader/efi/chainloader.c:291 grub-core/loader/efi/linux.c:422 #: grub-core/loader/efi/linux.c:444 grub-core/loader/efi/linux.c:532 #: grub-core/loader/efi/linux.c:551 grub-core/osdep/unix/dl.c:48 #: grub-core/osdep/windows/dl.c:46 grub-core/script/lexer.c:161 #: grub-core/script/lexer.c:197 grub-core/video/efi_gop.c:485 #: grub-core/script/yylex.l:390 msgid "out of memory" msgstr "" #: grub-core/commands/acpihalt.c:374 grub-core/disk/cryptodisk.c:812 #: grub-core/disk/cryptodisk.c:856 grub-core/kern/emu/hostdisk.c:307 #: grub-core/kern/emu/hostfs.c:149 grub-core/kern/emu/misc.c:220 #: grub-core/osdep/linux/ofpath.c:195 grub-core/osdep/linux/ofpath.c:521 #: grub-core/osdep/linux/ofpath.c:534 util/glue-efi.c:90 util/glue-efi.c:104 #: util/grub-editenv.c:161 util/grub-fstest.c:588 #: util/grub-install-common.c:1135 util/grub-mkrescue.c:662 #: util/grub-mkrescue.c:935 util/grub-mount.c:526 util/grub-render-label.c:176 #: util/misc.c:95 util/setup.c:817 util/setup.c:836 #, c-format msgid "cannot read `%s': %s" msgstr "" #. TRANSLATORS: It's computer shutdown using ACPI, not disabling ACPI. #: grub-core/commands/acpihalt.c:452 msgid "ACPI shutdown failed" msgstr "" #: grub-core/commands/arc/lsdev.c:51 msgid "List devices." msgstr "" #: grub-core/commands/bli.c:49 #, c-format msgid "cannot open device: %s" msgstr "" #: grub-core/commands/bli.c:70 #, c-format msgid "cannot open disk: %s" msgstr "" #: grub-core/commands/bli.c:78 #, c-format msgid "this is not a GPT partition table: %s" msgstr "" #: grub-core/commands/bli.c:85 #, c-format msgid "read error: %s" msgstr "" #: grub-core/commands/bli.c:110 grub-core/commands/bli.c:114 msgid "unable to find boot device" msgstr "" #: grub-core/commands/bli.c:123 msgid "unable to determine partition UUID of boot device" msgstr "" #: grub-core/commands/blocklist.c:124 grub-core/commands/cat.c:57 #: grub-core/commands/configfile.c:35 grub-core/commands/efi/loadbios.c:150 #: grub-core/commands/file.c:160 grub-core/commands/hexdump.c:48 #: grub-core/commands/legacycfg.c:227 grub-core/commands/legacycfg.c:333 #: grub-core/commands/minicmd.c:48 grub-core/commands/syslinuxcfg.c:146 #: grub-core/commands/testload.c:60 grub-core/commands/testspeed.c:52 #: grub-core/disk/loopback.c:102 grub-core/efiemu/main.c:293 #: grub-core/font/font_cmd.c:32 grub-core/kern/emu/hostdisk.c:519 #: grub-core/loader/arm/linux.c:365 grub-core/loader/arm/linux.c:410 #: grub-core/loader/arm/linux.c:473 grub-core/loader/arm64/xen_boot.c:388 #: grub-core/loader/arm64/xen_boot.c:401 grub-core/loader/arm64/xen_boot.c:452 #: grub-core/loader/efi/chainloader.c:230 grub-core/loader/efi/linux.c:391 #: grub-core/loader/efi/linux.c:494 grub-core/loader/emu/linux.c:119 #: grub-core/loader/emu/linux.c:152 grub-core/loader/i386/bsd.c:1474 #: grub-core/loader/i386/bsd.c:1817 grub-core/loader/i386/bsd.c:2095 #: grub-core/loader/i386/coreboot/chainloader.c:438 #: grub-core/loader/i386/linux.c:676 grub-core/loader/i386/linux.c:1060 #: grub-core/loader/i386/pc/chainloader.c:290 #: grub-core/loader/i386/pc/freedos.c:105 grub-core/loader/i386/pc/linux.c:139 #: grub-core/loader/i386/pc/linux.c:406 grub-core/loader/i386/pc/ntldr.c:85 #: grub-core/loader/i386/pc/plan9.c:409 #: grub-core/loader/i386/pc/pxechainloader.c:94 #: grub-core/loader/i386/pc/truecrypt.c:96 grub-core/loader/i386/xen.c:642 #: grub-core/loader/i386/xen.c:775 grub-core/loader/i386/xen.c:850 #: grub-core/loader/i386/xen.c:860 grub-core/loader/i386/xnu.c:487 #: grub-core/loader/ia64/efi/linux.c:460 grub-core/loader/ia64/efi/linux.c:540 #: grub-core/loader/mips/linux.c:238 grub-core/loader/mips/linux.c:429 #: grub-core/loader/multiboot.c:322 grub-core/loader/multiboot.c:374 #: grub-core/loader/multiboot.c:384 #: grub-core/loader/powerpc/ieee1275/linux.c:280 #: grub-core/loader/powerpc/ieee1275/linux.c:352 #: grub-core/loader/sparc64/ieee1275/linux.c:305 #: grub-core/loader/sparc64/ieee1275/linux.c:381 grub-core/loader/xnu.c:370 #: grub-core/loader/xnu.c:479 grub-core/loader/xnu.c:797 #: grub-core/loader/xnu.c:911 grub-core/loader/xnu.c:1297 #: grub-core/loader/xnu.c:1447 grub-core/loader/xnu.c:1473 #: grub-core/video/readers/jpeg.c:920 grub-core/video/readers/png.c:1118 msgid "filename expected" msgstr "" #. TRANSLATORS: "embed" is a verb (command description). " #: grub-core/commands/blocklist.c:156 grub-core/commands/cat.c:163 #: grub-core/commands/configfile.c:65 grub-core/commands/configfile.c:68 #: grub-core/commands/configfile.c:74 grub-core/commands/configfile.c:80 #: grub-core/commands/configfile.c:86 grub-core/commands/hashsum.c:34 #: grub-core/commands/legacycfg.c:852 grub-core/commands/legacycfg.c:859 #: grub-core/commands/legacycfg.c:864 grub-core/commands/legacycfg.c:869 #: grub-core/commands/macbless.c:222 grub-core/commands/minicmd.c:212 #: grub-core/commands/syslinuxcfg.c:186 grub-core/commands/syslinuxcfg.c:194 #: grub-core/commands/syslinuxcfg.c:200 grub-core/commands/syslinuxcfg.c:206 #: grub-core/commands/testload.c:165 grub-core/efiemu/main.c:312 #: grub-core/kern/emu/main.c:100 grub-core/kern/emu/main.c:103 #: grub-core/loader/i386/bsd.c:2148 grub-core/loader/i386/bsd.c:2151 #: grub-core/loader/i386/bsd.c:2154 #: grub-core/loader/i386/coreboot/chainloader.c:505 #: grub-core/loader/ia64/efi/linux.c:595 include/grub/util/install.h:32 #: include/grub/util/install.h:64 include/grub/util/install.h:66 #: util/grub-glue-efi.c:52 util/grub-glue-efi.c:54 util/grub-glue-efi.c:56 #: util/grub-install.c:254 util/grub-install.c:301 util/grub-mkfont.c:982 #: util/grub-mkimage.c:68 util/grub-mkimage.c:74 util/grub-mkimage.c:76 #: util/grub-mkimage.c:78 util/grub-mkimage.c:81 util/grub-mkimage.c:84 #: util/grub-mklayout.c:52 util/grub-mklayout.c:54 util/grub-mkrescue.c:97 #: util/grub-mkrescue.c:101 util/grub-mkrescue.c:104 util/grub-mkrescue.c:105 #: util/grub-mkrescue.c:106 util/grub-mkstandalone.c:50 #: util/grub-mkstandalone.c:52 util/grub-probe.c:732 #: util/grub-render-label.c:59 util/grub-render-label.c:70 #: util/grub-render-label.c:72 util/grub-setup.c:78 util/grub-setup.c:80 #: util/grub-setup.c:84 util/grub-syslinux2cfg.c:74 #: util/grub-syslinux2cfg.c:147 util/grub-kbdcomp.in:29 #: util/grub-mkconfig.in:60 msgid "FILE" msgstr "" #: grub-core/commands/blocklist.c:156 msgid "Print a block list." msgstr "" #: grub-core/commands/boot.c:197 grub-core/commands/legacycfg.c:551 #: grub-core/commands/legacycfg.c:592 grub-core/loader/efi/linux.c:403 #: grub-core/loader/i386/bsd.c:1809 grub-core/loader/i386/bsd.c:1910 #: grub-core/loader/i386/bsd.c:2017 grub-core/loader/i386/bsd.c:2050 #: grub-core/loader/i386/bsd.c:2099 grub-core/loader/i386/linux.c:1066 #: grub-core/loader/i386/pc/linux.c:412 grub-core/loader/i386/xen.c:782 #: grub-core/loader/i386/xen.c:865 grub-core/loader/ia64/efi/linux.c:546 #: grub-core/loader/mips/linux.c:432 grub-core/loader/multiboot.c:388 #: grub-core/loader/powerpc/ieee1275/linux.c:358 #: grub-core/loader/sparc64/ieee1275/linux.c:387 grub-core/loader/xnu.c:591 #: grub-core/loader/xnu.c:687 grub-core/loader/xnu.c:800 #: grub-core/loader/xnu.c:914 grub-core/loader/xnu.c:1110 #: grub-core/loader/xnu.c:1278 grub-core/loader/xnu.c:1309 #: grub-core/loader/xnu.c:1450 msgid "you need to load the kernel first" msgstr "" #: grub-core/commands/boot.c:239 msgid "Boot an operating system." msgstr "" #: grub-core/commands/boottime.c:36 #: grub-core/commands/i386/coreboot/cb_timestamps.c:108 msgid "No boot time statistics is available\n" msgstr "" #: grub-core/commands/boottime.c:59 msgid "Show boot time statistics." msgstr "" #: grub-core/commands/cacheinfo.c:40 #, c-format msgid "Disk cache statistics: hits = %lu (%lu.%02lu%%), misses = %lu\n" msgstr "" #: grub-core/commands/cacheinfo.c:45 msgid "No disk cache statistics available\n" msgstr "" #: grub-core/commands/cacheinfo.c:56 msgid "Get disk cache info." msgstr "" #: grub-core/commands/cat.c:33 msgid "Accept DOS-style CR/NL line endings." msgstr "" #: grub-core/commands/cat.c:163 grub-core/commands/minicmd.c:212 msgid "Show the contents of a file." msgstr "" #: grub-core/commands/cmp.c:34 msgid "Enable verbose output" msgstr "" #: grub-core/commands/cmp.c:51 grub-core/commands/i386/pc/drivemap.c:236 #: grub-core/commands/i386/wrmsr.c:50 grub-core/commands/iorw.c:86 #: grub-core/commands/memrw.c:85 grub-core/commands/password.c:75 #: grub-core/commands/password_pbkdf2.c:94 grub-core/commands/pgp.c:778 #: grub-core/commands/regexp.c:113 grub-core/mmap/mmap.c:520 #: grub-core/net/dns.c:642 grub-core/net/net.c:1250 msgid "two arguments expected" msgstr "" #: grub-core/commands/cmp.c:54 #, c-format msgid "Compare file `%s' with `%s':\n" msgstr "" #: grub-core/commands/cmp.c:62 #, c-format msgid "Files differ in size: %llu [%s], %llu [%s]\n" msgstr "" #: grub-core/commands/cmp.c:90 #, c-format msgid "Files differ at the offset %llu: 0x%x [%s], 0x%x [%s]\n" msgstr "" #: grub-core/commands/cmp.c:103 msgid "The files are identical.\n" msgstr "" #: grub-core/commands/cmp.c:124 msgid "FILE1 FILE2" msgstr "" #: grub-core/commands/cmp.c:124 msgid "Compare two files." msgstr "" #: grub-core/commands/configfile.c:65 msgid "Load another config file." msgstr "" #: grub-core/commands/configfile.c:69 grub-core/commands/configfile.c:87 msgid "Load another config file without changing context." msgstr "" #: grub-core/commands/configfile.c:75 msgid "" "Load another config file without changing context but take only menu entries." msgstr "" #: grub-core/commands/configfile.c:81 msgid "Load another config file but take only menu entries." msgstr "" #: grub-core/commands/date.c:142 msgid "[[year-]month-day] [hour:minute[:second]]" msgstr "" #: grub-core/commands/date.c:143 msgid "Display/set current datetime." msgstr "" #: grub-core/commands/echo.c:30 msgid "Do not output the trailing newline." msgstr "" #: grub-core/commands/echo.c:31 msgid "Enable interpretation of backslash escapes." msgstr "" #: grub-core/commands/echo.c:134 msgid "[-e|-n] STRING" msgstr "" #: grub-core/commands/echo.c:134 msgid "Display a line of text." msgstr "" #: grub-core/commands/efi/efifwsetup.c:48 msgid "reboot to firmware setup is not supported by the current firmware" msgstr "" #: grub-core/commands/efi/efifwsetup.c:95 msgid "Reboot into firmware setup menu." msgstr "" #: grub-core/commands/efi/efitextmode.c:44 msgid "device error: could not set requested mode" msgstr "" #: grub-core/commands/efi/efitextmode.c:47 msgid "invalid mode: number not valid" msgstr "" #: grub-core/commands/efi/efitextmode.c:50 #, c-format msgid "unexpected EFI error number: `%u'" msgstr "" #: grub-core/commands/efi/efitextmode.c:69 msgid "no UEFI output console interface" msgstr "" #: grub-core/commands/efi/efitextmode.c:72 msgid "no mode struct for UEFI output console" msgstr "" #: grub-core/commands/efi/efitextmode.c:75 msgid "at most two arguments expected" msgstr "" #: grub-core/commands/efi/efitextmode.c:79 msgid "Available modes for console output device.\n" msgstr "" #: grub-core/commands/efi/efitextmode.c:83 msgid " [%" msgstr "" #: grub-core/commands/efi/efitextmode.c:100 #, c-format msgid "non-numeric or invalid mode `%s'" msgstr "" #: grub-core/commands/efi/efitextmode.c:111 #, c-format msgid "invalid mode: `%lu' is greater than maximum mode `%lu'" msgstr "" #: grub-core/commands/efi/efitextmode.c:122 #, c-format msgid "non-numeric or invalid columns number `%s'" msgstr "" #: grub-core/commands/efi/efitextmode.c:128 #, c-format msgid "non-numeric or invalid rows number `%s'" msgstr "" #: grub-core/commands/efi/efitextmode.c:136 msgid "no mode found with requested columns and rows" msgstr "" #: grub-core/commands/efi/efitextmode.c:146 msgid "[min | max | | ]" msgstr "" #: grub-core/commands/efi/efitextmode.c:147 msgid "Get or set EFI text mode." msgstr "" #: grub-core/commands/efi/fixvideo.c:107 msgid "Fix video problem." msgstr "" #: grub-core/commands/efi/loadbios.c:52 msgid "ROM image is present." msgstr "" #: grub-core/commands/efi/loadbios.c:70 msgid "Can't enable ROM area." msgstr "" #: grub-core/commands/efi/loadbios.c:191 msgid "" "Create BIOS-like structures for backward compatibility with existing OS." msgstr "" #: grub-core/commands/efi/loadbios.c:196 msgid "BIOS_DUMP [INT10_DUMP]" msgstr "" #: grub-core/commands/efi/loadbios.c:197 msgid "Load BIOS dump." msgstr "" #: grub-core/commands/efi/tpm.c:141 msgid "command failed" msgstr "" #: grub-core/commands/efi/tpm.c:143 msgid "invalid parameter" msgstr "" #: grub-core/commands/efi/tpm.c:145 msgid "output buffer too small" msgstr "" #: grub-core/commands/efi/tpm.c:147 msgid "TPM unavailable" msgstr "" #: grub-core/commands/efi/tpm.c:149 msgid "unknown TPM error" msgstr "" #: grub-core/commands/efi/tpm.c:174 grub-core/commands/efi/tpm.c:208 msgid "cannot allocate TPM event buffer" msgstr "" #: grub-core/commands/efi/tpm.c:249 msgid "cannot allocate CC event buffer" msgstr "" #: grub-core/commands/eval.c:63 msgid "STRING ..." msgstr "" #: grub-core/commands/eval.c:64 msgid "Evaluate arguments as GRUB commands" msgstr "" #: grub-core/commands/extcmd.c:123 grub-core/kern/command.c:88 #, c-format msgid "%s: the command is not allowed when lockdown is enforced" msgstr "" #: grub-core/commands/file.c:41 msgid "Check if FILE can be booted as i386 PAE Xen unprivileged guest kernel" msgstr "" #: grub-core/commands/file.c:44 msgid "Check if FILE can be booted as x86_64 Xen unprivileged guest kernel" msgstr "" #: grub-core/commands/file.c:46 msgid "Check if FILE can be used as Xen x86 privileged guest kernel" msgstr "" #: grub-core/commands/file.c:48 msgid "Check if FILE can be used as x86 multiboot kernel" msgstr "" #: grub-core/commands/file.c:50 msgid "Check if FILE can be used as x86 multiboot2 kernel" msgstr "" #: grub-core/commands/file.c:52 msgid "Check if FILE is ARM Linux" msgstr "" #: grub-core/commands/file.c:54 msgid "Check if FILE is ARM64 Linux" msgstr "" #: grub-core/commands/file.c:56 msgid "Check if FILE is IA64 Linux" msgstr "" #: grub-core/commands/file.c:58 msgid "Check if FILE is MIPS Linux" msgstr "" #: grub-core/commands/file.c:60 msgid "Check if FILE is MIPSEL Linux" msgstr "" #: grub-core/commands/file.c:62 msgid "Check if FILE is SPARC64 Linux" msgstr "" #: grub-core/commands/file.c:64 msgid "Check if FILE is POWERPC Linux" msgstr "" #: grub-core/commands/file.c:66 msgid "Check if FILE is x86 Linux" msgstr "" #: grub-core/commands/file.c:68 msgid "Check if FILE is x86 Linux supporting 32-bit protocol" msgstr "" #: grub-core/commands/file.c:70 msgid "Check if FILE is x86 kFreeBSD" msgstr "" #: grub-core/commands/file.c:72 msgid "Check if FILE is i386 kFreeBSD" msgstr "" #: grub-core/commands/file.c:74 msgid "Check if FILE is x86_64 kFreeBSD" msgstr "" #: grub-core/commands/file.c:77 msgid "Check if FILE is x86 kNetBSD" msgstr "" #: grub-core/commands/file.c:79 msgid "Check if FILE is i386 kNetBSD" msgstr "" #: grub-core/commands/file.c:81 msgid "Check if FILE is x86_64 kNetBSD" msgstr "" #: grub-core/commands/file.c:84 msgid "Check if FILE is i386 EFI file" msgstr "" #: grub-core/commands/file.c:86 msgid "Check if FILE is x86_64 EFI file" msgstr "" #: grub-core/commands/file.c:88 msgid "Check if FILE is IA64 EFI file" msgstr "" #: grub-core/commands/file.c:90 msgid "Check if FILE is ARM64 EFI file" msgstr "" #: grub-core/commands/file.c:92 msgid "Check if FILE is ARM EFI file" msgstr "" #: grub-core/commands/file.c:94 msgid "Check if FILE is RISC-V 32bit EFI file" msgstr "" #: grub-core/commands/file.c:96 msgid "Check if FILE is RISC-V 64bit EFI file" msgstr "" #: grub-core/commands/file.c:98 msgid "Check if FILE is hiberfil.sys in hibernated state" msgstr "" #: grub-core/commands/file.c:100 msgid "Check if FILE is x86_64 XNU (Mac OS X kernel)" msgstr "" #: grub-core/commands/file.c:102 msgid "Check if FILE is i386 XNU (Mac OS X kernel)" msgstr "" #: grub-core/commands/file.c:104 msgid "Check if FILE is XNU (Mac OS X kernel) hibernated image" msgstr "" #: grub-core/commands/file.c:106 msgid "Check if FILE is BIOS bootsector" msgstr "" #. TRANSLATORS: it's a standalone boolean value, #. opposite of "true". #: grub-core/commands/file.c:690 grub-core/commands/i386/cmostest.c:63 #: grub-core/commands/i386/cpuid.c:71 grub-core/commands/keystatus.c:65 #: grub-core/commands/keystatus.c:69 grub-core/commands/keystatus.c:78 #: grub-core/commands/test.c:451 grub-core/commands/true.c:39 #: grub-core/script/execute.c:255 grub-core/script/execute.c:1064 msgid "false" msgstr "" #: grub-core/commands/file.c:699 msgid "OPTIONS FILE" msgstr "" #: grub-core/commands/file.c:700 msgid "Check if FILE is of specified type." msgstr "" #. TRANSLATORS: It means that the specified partition e.g. #. hd0,msdos1=/dev/sda1 doesn't exist. #: grub-core/commands/gptsync.c:140 grub-core/kern/disk.c:262 msgid "no such partition" msgstr "" #: grub-core/commands/gptsync.c:240 #, c-format msgid "New MBR is written to `%s'\n" msgstr "" #: grub-core/commands/gptsync.c:252 msgid "DEVICE [PARTITION[+/-[TYPE]]] ..." msgstr "" #. TRANSLATORS: MBR type is one-byte partition #. type id. #: grub-core/commands/gptsync.c:255 msgid "" "Fill hybrid MBR of GPT drive DEVICE. Specified partitions will be a part of " "hybrid MBR. Up to 3 partitions are allowed. TYPE is an MBR type. + means " "that partition is active. Only one partition can be active." msgstr "" #: grub-core/commands/halt.c:40 msgid "" "Halts the computer. This command does not work on all firmware " "implementations." msgstr "" #: grub-core/commands/hashsum.c:32 msgid "Specify hash to use." msgstr "" #: grub-core/commands/hashsum.c:32 msgid "HASH" msgstr "" #: grub-core/commands/hashsum.c:33 msgid "Check hashes of files with hash list FILE." msgstr "" #: grub-core/commands/hashsum.c:35 msgid "Base directory for hash list." msgstr "" #. TRANSLATORS: platform here isn't identifier. It can be translated. #: grub-core/commands/hashsum.c:35 grub-core/commands/ls.c:156 #: grub-core/commands/macbless.c:225 grub-core/commands/syslinuxcfg.c:51 #: grub-core/commands/syslinuxcfg.c:54 grub-core/kern/emu/main.c:106 #: include/grub/util/install.h:50 include/grub/util/install.h:53 #: include/grub/util/install.h:56 include/grub/util/install.h:59 #: util/grub-install.c:250 util/grub-install.c:252 util/grub-install.c:297 #: util/grub-install.c:299 util/grub-mkimage.c:64 util/grub-mkimage.c:67 #: util/grub-mknetdir.c:46 util/grub-mknetdir.c:48 util/grub-mkrescue.c:99 #: util/grub-setup.c:82 util/grub-syslinux2cfg.c:63 util/grub-syslinux2cfg.c:65 #: util/grub-syslinux2cfg.c:67 util/grub-syslinux2cfg.c:71 #: util/grub-reboot.in:54 util/grub-set-default.in:54 msgid "DIR" msgstr "" #: grub-core/commands/hashsum.c:37 msgid "Don't stop after first error." msgstr "" #: grub-core/commands/hashsum.c:38 msgid "Uncompress file before checksumming." msgstr "" #: grub-core/commands/hashsum.c:172 #, c-format msgid "%s: READ ERROR\n" msgstr "" #: grub-core/commands/hashsum.c:186 #, c-format msgid "%s: HASH MISMATCH\n" msgstr "" #: grub-core/commands/hashsum.c:197 #, c-format msgid "%s: OK\n" msgstr "" #: grub-core/commands/hashsum.c:291 msgid "-h HASH [-c FILE [-p PREFIX]] [FILE1 [FILE2 ...]]" msgstr "" #. TRANSLATORS: "hash checksum" is just to #. be a bit more precise, you can treat it as #. just "hash". #: grub-core/commands/hashsum.c:296 grub-core/commands/hashsum.c:301 #: grub-core/commands/hashsum.c:306 grub-core/commands/hashsum.c:311 #: grub-core/commands/hashsum.c:316 grub-core/commands/hashsum.c:322 msgid "Compute or check hash checksum." msgstr "" #: grub-core/commands/hashsum.c:299 grub-core/commands/hashsum.c:304 #: grub-core/commands/hashsum.c:309 grub-core/commands/hashsum.c:314 #: grub-core/commands/hashsum.c:320 msgid "[-c FILE [-p PREFIX]] [FILE1 [FILE2 ...]]" msgstr "" #: grub-core/commands/hdparm.c:33 msgid "" "Set Advanced Power Management\n" "(1=low, ..., 254=high, 255=off)." msgstr "" #: grub-core/commands/hdparm.c:36 msgid "Display power mode." msgstr "" #: grub-core/commands/hdparm.c:37 msgid "Freeze ATA security settings until reset." msgstr "" #: grub-core/commands/hdparm.c:39 msgid "Display SMART health status." msgstr "" #: grub-core/commands/hdparm.c:40 msgid "" "Set Automatic Acoustic Management\n" "(0=off, 128=quiet, ..., 254=fast)." msgstr "" #: grub-core/commands/hdparm.c:43 msgid "" "Set standby timeout\n" "(0=off, 1=5s, 2=10s, ..., 240=20m, 241=30m, ...)." msgstr "" #: grub-core/commands/hdparm.c:46 msgid "Set drive to standby mode." msgstr "" #: grub-core/commands/hdparm.c:47 msgid "Set drive to sleep mode." msgstr "" #: grub-core/commands/hdparm.c:48 msgid "Print drive identity and settings." msgstr "" #: grub-core/commands/hdparm.c:50 msgid "Show raw contents of ATA IDENTIFY sector." msgstr "" #: grub-core/commands/hdparm.c:52 msgid "Disable/enable SMART (0/1)." msgstr "" #: grub-core/commands/hdparm.c:53 msgid "Do not print messages." msgstr "" #: grub-core/commands/hdparm.c:286 grub-core/commands/i386/rdmsr.c:57 #: grub-core/commands/iorw.c:48 grub-core/commands/legacycfg.c:778 #: grub-core/commands/legacycfg.c:830 grub-core/commands/macbless.c:190 #: grub-core/commands/memrw.c:48 grub-core/commands/pgp.c:690 #: grub-core/commands/pgp.c:744 grub-core/commands/search.c:379 #: grub-core/commands/search_wrap.c:184 grub-core/commands/setpci.c:242 #: grub-core/commands/sleep.c:71 grub-core/fs/zfs/zfsinfo.c:279 #: grub-core/fs/zfs/zfsinfo.c:358 grub-core/gettext/gettext.c:497 #: grub-core/kern/corecmd.c:68 grub-core/kern/corecmd.c:82 #: grub-core/mmap/mmap.c:433 grub-core/net/dns.c:718 grub-core/net/dns.c:750 #: grub-core/net/net.c:729 grub-core/net/net.c:1133 #: grub-core/normal/context.c:194 grub-core/script/execute.c:139 #: grub-core/term/gfxterm_background.c:136 msgid "one argument expected" msgstr "" #: grub-core/commands/hdparm.c:440 msgid "[OPTIONS] DISK" msgstr "" #: grub-core/commands/hdparm.c:441 msgid "Get/set ATA disk parameters." msgstr "" #: grub-core/commands/help.c:132 grub-core/lib/arg.c:110 msgid "Usage:" msgstr "" #: grub-core/commands/help.c:148 msgid "[PATTERN ...]" msgstr "" #: grub-core/commands/help.c:149 msgid "Show a help message." msgstr "" #: grub-core/commands/hexdump.c:32 msgid "Skip offset bytes from the beginning of file." msgstr "" #: grub-core/commands/hexdump.c:34 msgid "Read only LENGTH bytes." msgstr "" #: grub-core/commands/hexdump.c:57 msgid "memory reading is disabled in lockdown mode" msgstr "" #: grub-core/commands/hexdump.c:130 msgid "[OPTIONS] FILE_OR_DEVICE" msgstr "" #: grub-core/commands/hexdump.c:131 msgid "Show raw contents of a file or memory." msgstr "" #: grub-core/commands/i386/cmosdump.c:58 msgid "Show raw dump of the CMOS contents." msgstr "" #: grub-core/commands/i386/cmostest.c:108 #: grub-core/commands/i386/cmostest.c:111 #: grub-core/commands/i386/cmostest.c:114 msgid "BYTE:BIT" msgstr "" #: grub-core/commands/i386/cmostest.c:109 msgid "Test bit at BYTE:BIT in CMOS." msgstr "" #: grub-core/commands/i386/cmostest.c:112 msgid "Clear bit at BYTE:BIT in CMOS." msgstr "" #. TRANSLATORS: A bit may be either set (1) or clear (0). #: grub-core/commands/i386/cmostest.c:116 msgid "Set bit at BYTE:BIT in CMOS." msgstr "" #: grub-core/commands/i386/coreboot/cb_timestamps.c:120 msgid "Show coreboot boot time statistics." msgstr "" #: grub-core/commands/i386/coreboot/cbls.c:137 msgid "List coreboot tables." msgstr "" #. TRANSLATORS: "(default)" at the end means that this option is used if #. no argument is specified. #: grub-core/commands/i386/cpuid.c:36 msgid "Check if CPU supports 64-bit (long) mode (default)." msgstr "" #: grub-core/commands/i386/cpuid.c:37 msgid "Check if CPU supports Physical Address Extension." msgstr "" #: grub-core/commands/i386/cpuid.c:119 msgid "Check for CPU features." msgstr "" #. TRANSLATORS: In this file "mapping" refers to a change GRUB makes so if #. your language doesn't have an equivalent of "mapping" you can #. use the word like "rerouting". #. #: grub-core/commands/i386/pc/drivemap.c:40 msgid "Show the current mappings." msgstr "" #: grub-core/commands/i386/pc/drivemap.c:41 msgid "Reset all mappings to the default values." msgstr "" #: grub-core/commands/i386/pc/drivemap.c:42 msgid "Perform both direct and reverse mappings." msgstr "" #: grub-core/commands/i386/pc/drivemap.c:181 msgid "No drives have been remapped" msgstr "" #. TRANSLATORS: This is the header of mapping list. #. On the left is how OS will see the disks and #. on the right current GRUB vision. #: grub-core/commands/i386/pc/drivemap.c:188 msgid "OS disk #num ------> GRUB/BIOS device" msgstr "" #: grub-core/commands/i386/pc/drivemap.c:415 msgid "-l | -r | [-s] grubdev osdisk." msgstr "" #: grub-core/commands/i386/pc/drivemap.c:416 msgid "Manage the BIOS drive mappings." msgstr "" #: grub-core/commands/i386/pc/halt.c:31 msgid "Do not use APM to halt the computer." msgstr "" #: grub-core/commands/i386/pc/halt.c:119 msgid "Halt the system, if possible using APM." msgstr "" #: grub-core/commands/i386/pc/lsapm.c:75 msgid "no APM found" msgstr "" #: grub-core/commands/i386/pc/lsapm.c:77 #, c-format msgid "" "Version %u.%u\n" "32-bit CS = 0x%x, len = 0x%x, offset = 0x%x\n" "16-bit CS = 0x%x, len = 0x%x\n" "DS = 0x%x, len = 0x%x\n" msgstr "" #: grub-core/commands/i386/pc/lsapm.c:86 msgid "16-bit protected interface supported\n" msgstr "" #: grub-core/commands/i386/pc/lsapm.c:87 msgid "16-bit protected interface unsupported\n" msgstr "" #: grub-core/commands/i386/pc/lsapm.c:89 msgid "32-bit protected interface supported\n" msgstr "" #: grub-core/commands/i386/pc/lsapm.c:90 msgid "32-bit protected interface unsupported\n" msgstr "" #: grub-core/commands/i386/pc/lsapm.c:92 msgid "CPU Idle slows down processor\n" msgstr "" #: grub-core/commands/i386/pc/lsapm.c:93 msgid "CPU Idle doesn't slow down processor\n" msgstr "" #: grub-core/commands/i386/pc/lsapm.c:95 msgid "APM disabled\n" msgstr "" #: grub-core/commands/i386/pc/lsapm.c:95 msgid "APM enabled\n" msgstr "" #: grub-core/commands/i386/pc/lsapm.c:97 msgid "APM disengaged\n" msgstr "" #: grub-core/commands/i386/pc/lsapm.c:97 msgid "APM engaged\n" msgstr "" #: grub-core/commands/i386/pc/lsapm.c:107 msgid "Show APM information." msgstr "" #. TRANSLATORS: It's musical notes, not the notes #. you take. Play command expects arguments which can #. be either a filename or tempo+notes. #. This error happens if none is specified. #: grub-core/commands/i386/pc/play.c:88 msgid "filename or tempo and notes expected" msgstr "" #: grub-core/commands/i386/pc/play.c:113 grub-core/commands/i386/pc/play.c:144 #, c-format msgid "Invalid tempo in %s" msgstr "" #: grub-core/commands/i386/pc/play.c:151 grub-core/commands/macbless.c:172 #: grub-core/fs/archelp.c:275 grub-core/fs/bfs.c:624 grub-core/fs/bfs.c:707 #: grub-core/fs/btrfs.c:1861 grub-core/fs/btrfs.c:1890 #: grub-core/fs/btrfs.c:1940 grub-core/fs/btrfs.c:2036 #: grub-core/fs/btrfs.c:2060 grub-core/fs/fshelp.c:260 grub-core/fs/jfs.c:750 #: grub-core/fs/minix.c:431 grub-core/fs/ufs.c:545 grub-core/fs/zfs/zfs.c:2147 #: grub-core/fs/zfs/zfs.c:2159 grub-core/fs/zfs/zfs.c:2366 #: grub-core/net/http.c:124 #, c-format msgid "file `%s' not found" msgstr "" #: grub-core/commands/i386/pc/play.c:162 grub-core/commands/i386/pc/play.c:171 #: grub-core/kern/misc.c:493 grub-core/script/execute.c:146 #: grub-core/script/execute.c:252 msgid "unrecognized number" msgstr "" #: grub-core/commands/i386/pc/play.c:190 msgid "FILE | TEMPO [PITCH1 DURATION1] [PITCH2 DURATION2] ... " msgstr "" #: grub-core/commands/i386/pc/play.c:191 msgid "Play a tune." msgstr "" #: grub-core/commands/i386/pc/sendkey.c:39 msgid "set numlock mode" msgstr "" #: grub-core/commands/i386/pc/sendkey.c:40 msgid "set capslock mode" msgstr "" #: grub-core/commands/i386/pc/sendkey.c:41 msgid "set scrolllock mode" msgstr "" #: grub-core/commands/i386/pc/sendkey.c:42 msgid "set insert mode" msgstr "" #: grub-core/commands/i386/pc/sendkey.c:43 msgid "set pause mode" msgstr "" #: grub-core/commands/i386/pc/sendkey.c:44 msgid "press left shift" msgstr "" #: grub-core/commands/i386/pc/sendkey.c:45 msgid "press right shift" msgstr "" #: grub-core/commands/i386/pc/sendkey.c:46 msgid "press SysRq" msgstr "" #: grub-core/commands/i386/pc/sendkey.c:47 msgid "press NumLock key" msgstr "" #: grub-core/commands/i386/pc/sendkey.c:48 msgid "press CapsLock key" msgstr "" #: grub-core/commands/i386/pc/sendkey.c:49 msgid "press ScrollLock key" msgstr "" #: grub-core/commands/i386/pc/sendkey.c:50 msgid "press Insert key" msgstr "" #: grub-core/commands/i386/pc/sendkey.c:51 msgid "press left alt" msgstr "" #: grub-core/commands/i386/pc/sendkey.c:52 msgid "press right alt" msgstr "" #: grub-core/commands/i386/pc/sendkey.c:53 msgid "press left ctrl" msgstr "" #: grub-core/commands/i386/pc/sendkey.c:54 msgid "press right ctrl" msgstr "" #: grub-core/commands/i386/pc/sendkey.c:55 msgid "don't update LED state" msgstr "" #: grub-core/commands/i386/pc/sendkey.c:372 msgid "[KEYSTROKE1] [KEYSTROKE2] ..." msgstr "" #. TRANSLATORS: It can emulate multiple #. keypresses. #: grub-core/commands/i386/pc/sendkey.c:375 msgid "Emulate a keystroke sequence" msgstr "" #: grub-core/commands/i386/rdmsr.c:37 grub-core/commands/iorw.c:35 #: grub-core/commands/memrw.c:34 grub-core/commands/setpci.c:73 msgid "Save read value into variable VARNAME." msgstr "" #: grub-core/commands/i386/rdmsr.c:38 grub-core/commands/iorw.c:36 #: grub-core/commands/memrw.c:35 grub-core/commands/probe.c:42 #: grub-core/commands/search_wrap.c:40 grub-core/commands/setpci.c:74 #: grub-core/commands/tr.c:32 msgid "VARNAME" msgstr "" #: grub-core/commands/i386/rdmsr.c:54 msgid "RDMSR is unsupported" msgstr "" #: grub-core/commands/i386/rdmsr.c:66 grub-core/commands/i386/wrmsr.c:59 #: grub-core/commands/i386/wrmsr.c:67 grub-core/net/dns.c:732 msgid "invalid argument" msgstr "" #: grub-core/commands/i386/rdmsr.c:83 grub-core/commands/memrw.c:126 #: grub-core/commands/memrw.c:131 grub-core/commands/memrw.c:136 msgid "ADDR" msgstr "" #: grub-core/commands/i386/rdmsr.c:84 msgid "Read a CPU model specific register." msgstr "" #: grub-core/commands/i386/wrmsr.c:47 msgid "WRMSR is unsupported" msgstr "" #: grub-core/commands/i386/wrmsr.c:76 msgid "ADDR VALUE" msgstr "" #: grub-core/commands/i386/wrmsr.c:77 msgid "Write a value to a CPU model specific register." msgstr "" #: grub-core/commands/ieee1275/suspend.c:34 msgid "Run `go' to resume GRUB." msgstr "" #: grub-core/commands/ieee1275/suspend.c:45 msgid "Return to IEEE1275 prompt." msgstr "" #: grub-core/commands/iorw.c:124 grub-core/commands/iorw.c:128 #: grub-core/commands/iorw.c:132 grub-core/gdb/gdb.c:79 msgid "PORT" msgstr "" #: grub-core/commands/iorw.c:124 msgid "Read 8-bit value from PORT." msgstr "" #: grub-core/commands/iorw.c:128 msgid "Read 16-bit value from PORT." msgstr "" #: grub-core/commands/iorw.c:132 msgid "Read 32-bit value from PORT." msgstr "" #: grub-core/commands/iorw.c:136 grub-core/commands/iorw.c:140 msgid "PORT VALUE [MASK]" msgstr "" #: grub-core/commands/iorw.c:137 msgid "Write 8-bit VALUE to PORT." msgstr "" #: grub-core/commands/iorw.c:141 msgid "Write 16-bit VALUE to PORT." msgstr "" #: grub-core/commands/iorw.c:144 grub-core/commands/memrw.c:141 #: grub-core/commands/memrw.c:145 grub-core/commands/memrw.c:149 msgid "ADDR VALUE [MASK]" msgstr "" #: grub-core/commands/iorw.c:145 msgid "Write 32-bit VALUE to PORT." msgstr "" #: grub-core/commands/keylayouts.c:215 grub-core/commands/loadenv.c:61 #: grub-core/commands/nativedisk.c:189 grub-core/efiemu/main.c:235 #: grub-core/font/font.c:464 grub-core/gfxmenu/gfxmenu.c:63 #: grub-core/kern/device.c:42 grub-core/kern/dl.c:883 #, c-format msgid "variable `%s' isn't set" msgstr "" #: grub-core/commands/keylayouts.c:301 msgid "Load a keyboard layout." msgstr "" #. TRANSLATORS: "Check" in a sense that if this key is pressed then #. "true" is returned, otherwise "false". #: grub-core/commands/keystatus.c:32 msgid "Check Shift key." msgstr "" #: grub-core/commands/keystatus.c:33 msgid "Check Control key." msgstr "" #: grub-core/commands/keystatus.c:34 msgid "Check Alt key." msgstr "" #. TRANSLATORS: there are 3 modifiers. #: grub-core/commands/keystatus.c:88 msgid "Check key modifier status." msgstr "" #: grub-core/commands/legacycfg.c:530 grub-core/commands/legacycfg.c:544 #: grub-core/commands/legacycfg.c:564 grub-core/commands/legacycfg.c:577 #: grub-core/commands/time.c:43 grub-core/script/function.c:119 #: util/grub-file.c:100 util/grub-fstest.c:57 util/grub-mount.c:68 #, c-format msgid "can't find command `%s'" msgstr "" #: grub-core/commands/legacycfg.c:831 grub-core/normal/auth.c:258 #: util/grub-mkpasswd-pbkdf2.c:136 msgid "Enter password: " msgstr "" #. TRANSLATORS: "legacy config" means #. "config as used by grub-legacy". #: grub-core/commands/legacycfg.c:855 msgid "Parse legacy config in same context" msgstr "" #: grub-core/commands/legacycfg.c:860 msgid "Parse legacy config in new context" msgstr "" #: grub-core/commands/legacycfg.c:865 msgid "Parse legacy config in same context taking only menu entries" msgstr "" #: grub-core/commands/legacycfg.c:870 msgid "Parse legacy config in new context taking only menu entries" msgstr "" #: grub-core/commands/legacycfg.c:874 msgid "[--no-mem-option] [--type=TYPE] FILE [ARG ...]" msgstr "" #: grub-core/commands/legacycfg.c:875 msgid "Simulate grub-legacy `kernel' command" msgstr "" #: grub-core/commands/legacycfg.c:879 grub-core/commands/legacycfg.c:883 msgid "FILE [ARG ...]" msgstr "" #: grub-core/commands/legacycfg.c:880 msgid "Simulate grub-legacy `initrd' command" msgstr "" #: grub-core/commands/legacycfg.c:884 msgid "Simulate grub-legacy `modulenounzip' command" msgstr "" #: grub-core/commands/legacycfg.c:888 grub-core/commands/legacycfg.c:893 msgid "[--md5] PASSWD [FILE]" msgstr "" #: grub-core/commands/legacycfg.c:889 msgid "Simulate grub-legacy `password' command" msgstr "" #: grub-core/commands/legacycfg.c:894 msgid "Simulate grub-legacy `password' command in menu entry mode" msgstr "" #. TRANSLATORS: This option is used to override default filename #. for loading and storing environment. #: grub-core/commands/loadenv.c:37 msgid "Specify filename." msgstr "" #: grub-core/commands/loadenv.c:39 msgid "Skip signature-checking of the environment file." msgstr "" #: grub-core/commands/loadenv.c:453 msgid "[-f FILE] [-s|--skip-sig] [variable_name_to_whitelist] [...]" msgstr "" #: grub-core/commands/loadenv.c:454 msgid "Load variables from environment block file." msgstr "" #: grub-core/commands/loadenv.c:457 msgid "[-f FILE]" msgstr "" #: grub-core/commands/loadenv.c:458 msgid "List variables from environment block file." msgstr "" #: grub-core/commands/loadenv.c:462 msgid "[-f FILE] variable_name [...]" msgstr "" #: grub-core/commands/loadenv.c:463 msgid "Save variables to environment block file." msgstr "" #: grub-core/commands/ls.c:40 msgid "Show a long list with more detailed information." msgstr "" #: grub-core/commands/ls.c:41 msgid "Print sizes in a human readable format." msgstr "" #: grub-core/commands/ls.c:42 msgid "List all files." msgstr "" #: grub-core/commands/ls.c:73 msgid "Network protocols:" msgstr "" #: grub-core/commands/ls.c:304 msgid "[-l|-h|-a] [FILE ...]" msgstr "" #: grub-core/commands/ls.c:305 msgid "List devices and files." msgstr "" #: grub-core/commands/lsacpi.c:255 msgid "Show version 1 tables only." msgstr "" #: grub-core/commands/lsacpi.c:256 msgid "Show version 2 and version 3 tables only." msgstr "" #: grub-core/commands/lsacpi.c:306 msgid "Show ACPI information." msgstr "" #: grub-core/commands/lsmmap.c:31 msgid "available RAM" msgstr "" #: grub-core/commands/lsmmap.c:32 msgid "reserved RAM" msgstr "" #. TRANSLATORS: this refers to memory where ACPI tables are stored #. and which can be used by OS once it loads ACPI tables. #: grub-core/commands/lsmmap.c:35 msgid "ACPI reclaimable RAM" msgstr "" #. TRANSLATORS: this refers to memory which ACPI-compliant OS #. is required to save accross hibernations. #: grub-core/commands/lsmmap.c:38 msgid "ACPI non-volatile storage RAM" msgstr "" #: grub-core/commands/lsmmap.c:39 msgid "faulty RAM (BadRAM)" msgstr "" #: grub-core/commands/lsmmap.c:40 msgid "persistent RAM" msgstr "" #: grub-core/commands/lsmmap.c:41 msgid "persistent RAM (legacy)" msgstr "" #: grub-core/commands/lsmmap.c:42 msgid "RAM holding coreboot tables" msgstr "" #: grub-core/commands/lsmmap.c:43 msgid "RAM holding firmware code" msgstr "" #: grub-core/commands/lsmmap.c:52 #, c-format msgid "base_addr = 0x%llx, length = 0x%llx, %s\n" msgstr "" #: grub-core/commands/lsmmap.c:55 #, c-format msgid "base_addr = 0x%llx, length = 0x%llx, type = 0x%x\n" msgstr "" #: grub-core/commands/lsmmap.c:79 msgid "List memory map provided by firmware." msgstr "" #: grub-core/commands/lspci.c:232 msgid "List PCI devices." msgstr "" #: grub-core/commands/macbless.c:223 msgid "Bless FILE of HFS or HFS+ partition for intel macs." msgstr "" #: grub-core/commands/macbless.c:226 msgid "Bless DIR of HFS or HFS+ partition for PPC macs." msgstr "" #: grub-core/commands/memrw.c:127 msgid "Read 8-bit value from ADDR." msgstr "" #: grub-core/commands/memrw.c:132 msgid "Read 16-bit value from ADDR." msgstr "" #: grub-core/commands/memrw.c:137 msgid "Read 32-bit value from ADDR." msgstr "" #: grub-core/commands/memrw.c:142 msgid "Write 8-bit VALUE to ADDR." msgstr "" #: grub-core/commands/memrw.c:146 msgid "Write 16-bit VALUE to ADDR." msgstr "" #: grub-core/commands/memrw.c:150 msgid "Write 32-bit VALUE to ADDR." msgstr "" #: grub-core/commands/memtools.c:140 msgid "List free and allocated memory blocks." msgstr "" #: grub-core/commands/memtools.c:142 msgid "List free memory blocks." msgstr "" #: grub-core/commands/memtools.c:144 msgid "Stress test large allocations." msgstr "" #: grub-core/commands/menuentry.c:31 msgid "Menu entry type." msgstr "" #: grub-core/commands/menuentry.c:31 grub-core/commands/menuentry.c:38 #: grub-core/commands/menuentry.c:39 grub-core/gettext/gettext.c:525 #: util/grub-fstest.c:531 util/grub-install.c:291 util/grub-install.c:304 #: util/grub-mknetdir.c:51 util/grub-mkrescue.c:109 util/grub-mkrescue.c:110 #: util/grub-mount.c:473 util/grub-render-label.c:65 msgid "STRING" msgstr "" #: grub-core/commands/menuentry.c:33 msgid "List of users allowed to boot this entry." msgstr "" #: grub-core/commands/menuentry.c:33 msgid "USERNAME[,USERNAME]" msgstr "" #: grub-core/commands/menuentry.c:36 msgid "Keyboard key to quickly boot this entry." msgstr "" #: grub-core/commands/menuentry.c:36 msgid "KEYBOARD_KEY" msgstr "" #: grub-core/commands/menuentry.c:38 msgid "Use STRING as menu entry body." msgstr "" #: grub-core/commands/menuentry.c:39 msgid "Menu entry identifier." msgstr "" #. TRANSLATORS: menu entry can either be bootable by anyone or only by #. handful of users. By default when security is active only superusers can #. boot a given menu entry. With --unrestricted (this option) #. anyone can boot it. #: grub-core/commands/menuentry.c:44 msgid "This entry can be booted by any user." msgstr "" #: grub-core/commands/menuentry.c:323 grub-core/commands/menuentry.c:328 #: grub-core/tests/test_blockarg.c:46 msgid "BLOCK" msgstr "" #: grub-core/commands/menuentry.c:323 msgid "Define a menu entry." msgstr "" #: grub-core/commands/menuentry.c:328 msgid "Define a submenu." msgstr "" #. TRANSLATORS: this is module list header. Name #. is module name, Ref Count is a reference counter #. (how many modules or open descriptors use it). #. Dependencies are the other modules it uses. #. #: grub-core/commands/minicmd.c:169 msgid "Name\tRef Count\tDependencies\n" msgstr "" #: grub-core/commands/minicmd.c:215 msgid "Show this message." msgstr "" #: grub-core/commands/minicmd.c:218 msgid "ADDR [SIZE]" msgstr "" #: grub-core/commands/minicmd.c:218 msgid "Show memory contents." msgstr "" #: grub-core/commands/minicmd.c:221 grub-core/kern/corecmd.c:191 #: util/grub-install.c:275 msgid "MODULE" msgstr "" #: grub-core/commands/minicmd.c:221 msgid "Remove a module." msgstr "" #: grub-core/commands/minicmd.c:224 msgid "Show loaded modules." msgstr "" #: grub-core/commands/minicmd.c:227 msgid "Exit from GRUB." msgstr "" #: grub-core/commands/mips/loongson/lsspd.c:42 msgid "No CS5536 found" msgstr "" #: grub-core/commands/mips/loongson/lsspd.c:45 #, c-format msgid "CS5536 at %d:%d.%d\n" msgstr "" #. TRANSLATORS: System management bus is often used to access components like #. RAM (info only, not data) or batteries. I/O space is where in memory #. its ports are. #: grub-core/commands/mips/loongson/lsspd.c:55 #, c-format msgid "System management bus controller I/O space is at 0x%x\n" msgstr "" #. TRANSLATORS: it's shown in a report in a way #. like number 1: ... number 2: ... #. #: grub-core/commands/mips/loongson/lsspd.c:66 #, c-format msgid "RAM slot number %d\n" msgstr "" #: grub-core/commands/mips/loongson/lsspd.c:73 #, c-format msgid "Written SPD bytes: %d B.\n" msgstr "" #: grub-core/commands/mips/loongson/lsspd.c:74 #, c-format msgid "Total flash size: %d B.\n" msgstr "" #: grub-core/commands/mips/loongson/lsspd.c:79 msgid "Memory type: DDR2." msgstr "" #: grub-core/commands/mips/loongson/lsspd.c:83 #, c-format msgid "Part no: %s.\n" msgstr "" #: grub-core/commands/mips/loongson/lsspd.c:86 msgid "Memory type: Unknown." msgstr "" #: grub-core/commands/mips/loongson/lsspd.c:97 msgid "Print Memory information." msgstr "" #: grub-core/commands/nativedisk.c:118 grub-core/commands/probe.c:180 #: grub-core/commands/probe.c:192 util/grub-probe.c:450 #, c-format msgid "%s does not support UUIDs" msgstr "" #: grub-core/commands/nativedisk.c:325 msgid "[MODULE1 MODULE2 ...]" msgstr "" #: grub-core/commands/nativedisk.c:326 msgid "" "Switch to native disk drivers. If no modules are specified default set (pata," "ahci,usbms,ohci,uhci,ehci) is used" msgstr "" #: grub-core/commands/parttool.c:40 msgid "" "Perform COMMANDS on partition.\n" "Use `parttool PARTITION help' for the list of available commands." msgstr "" #: grub-core/commands/parttool.c:129 msgid "=VAL" msgstr "" #: grub-core/commands/parttool.c:142 #, c-format msgid "Sorry, no parttool is available for %s\n" msgstr "" #: grub-core/commands/parttool.c:294 grub-core/lib/arg.c:292 #: grub-core/lib/arg.c:371 #, c-format msgid "unknown argument `%s'" msgstr "" #: grub-core/commands/parttool.c:350 msgid "PARTITION COMMANDS" msgstr "" #: grub-core/commands/password.c:85 msgid "USER PASSWORD" msgstr "" #: grub-core/commands/password.c:86 msgid "Set user password (plaintext). Unrecommended and insecure." msgstr "" #. TRANSLATORS: it means that the string which #. was supposed to be a password hash doesn't #. have a correct format, not to password #. mismatch. #: grub-core/commands/password_pbkdf2.c:98 #: grub-core/commands/password_pbkdf2.c:115 #: grub-core/commands/password_pbkdf2.c:123 #: grub-core/commands/password_pbkdf2.c:150 #: grub-core/commands/password_pbkdf2.c:179 msgid "invalid PBKDF2 password" msgstr "" #: grub-core/commands/password_pbkdf2.c:202 msgid "USER PBKDF2_PASSWORD" msgstr "" #: grub-core/commands/password_pbkdf2.c:203 msgid "Set user password (PBKDF2). " msgstr "" #: grub-core/commands/pcidump.c:39 grub-core/commands/setpci.c:69 msgid "Select device by vendor and device IDs." msgstr "" #: grub-core/commands/pcidump.c:40 grub-core/commands/setpci.c:70 msgid "[vendor]:[device]" msgstr "" #: grub-core/commands/pcidump.c:41 grub-core/commands/setpci.c:71 msgid "Select device by its position on the bus." msgstr "" #: grub-core/commands/pcidump.c:42 grub-core/commands/setpci.c:72 msgid "[bus]:[slot][.func]" msgstr "" #: grub-core/commands/pcidump.c:109 grub-core/commands/pcidump.c:137 #: grub-core/commands/setpci.c:183 grub-core/commands/setpci.c:213 #: grub-core/fs/zfs/zfs.c:3958 grub-core/kern/emu/hostdisk.c:458 #: grub-core/kern/emu/hostdisk.c:473 grub-core/kern/file.c:45 #, c-format msgid "missing `%c' symbol" msgstr "" #: grub-core/commands/pcidump.c:167 msgid "[-s POSITION] [-d DEVICE]" msgstr "" #: grub-core/commands/pcidump.c:168 msgid "Show raw dump of the PCI configuration space." msgstr "" #: grub-core/commands/pgp.c:45 msgid "Skip signature-checking of the public key file." msgstr "" #. TRANSLATORS: it's about GNUPG signatures. #: grub-core/commands/pgp.c:71 grub-core/commands/pgp.c:81 #: grub-core/commands/pgp.c:86 grub-core/commands/pgp.c:96 #: grub-core/commands/pgp.c:103 grub-core/commands/pgp.c:107 #: grub-core/commands/pgp.c:114 grub-core/commands/pgp.c:119 #: grub-core/commands/pgp.c:124 grub-core/commands/pgp.c:128 #: grub-core/commands/pgp.c:254 grub-core/commands/pgp.c:262 #: grub-core/commands/pgp.c:267 grub-core/commands/pgp.c:275 #: grub-core/commands/pgp.c:306 grub-core/commands/pgp.c:313 #: grub-core/commands/pgp.c:318 grub-core/commands/pgp.c:328 #: grub-core/commands/pgp.c:409 grub-core/commands/pgp.c:412 #: grub-core/commands/pgp.c:415 grub-core/commands/pgp.c:418 #: grub-core/commands/pgp.c:425 grub-core/commands/pgp.c:428 #: grub-core/commands/pgp.c:617 msgid "bad signature" msgstr "" #: grub-core/commands/pgp.c:574 msgid "public key %08" msgstr "" #: grub-core/commands/pgp.c:586 grub-core/disk/diskfilter.c:812 #: grub-core/disk/diskfilter.c:822 grub-core/fs/ntfs.c:731 #: grub-core/fs/zfs/zfs.c:1997 grub-core/normal/menu.c:428 #, c-format msgid "module `%s' isn't loaded" msgstr "" #. TRANSLATORS: %08x is 32-bit key id. #: grub-core/commands/pgp.c:764 #, c-format msgid "public key %08x not found" msgstr "" #: grub-core/commands/pgp.c:946 msgid "[-s|--skip-sig] FILE SIGNATURE_FILE [PUBKEY_FILE]" msgstr "" #: grub-core/commands/pgp.c:947 msgid "Verify detached signature." msgstr "" #: grub-core/commands/pgp.c:950 msgid "[-s|--skip-sig] PUBKEY_FILE" msgstr "" #: grub-core/commands/pgp.c:951 msgid "Add PUBKEY_FILE to trusted keys." msgstr "" #: grub-core/commands/pgp.c:955 msgid "Show the list of trusted keys." msgstr "" #: grub-core/commands/pgp.c:957 msgid "PUBKEY_ID" msgstr "" #: grub-core/commands/pgp.c:958 msgid "Remove PUBKEY_ID from trusted keys." msgstr "" #: grub-core/commands/probe.c:42 grub-core/commands/tr.c:32 msgid "Set a variable to return value." msgstr "" #. TRANSLATORS: It's a driver that is currently in use to access #. the diven disk. #: grub-core/commands/probe.c:45 msgid "Determine driver." msgstr "" #: grub-core/commands/probe.c:46 msgid "Determine partition map type." msgstr "" #: grub-core/commands/probe.c:47 msgid "Determine filesystem type." msgstr "" #: grub-core/commands/probe.c:48 msgid "Determine filesystem UUID." msgstr "" #: grub-core/commands/probe.c:49 msgid "Determine filesystem label." msgstr "" #: grub-core/commands/probe.c:50 msgid "Determine partition UUID." msgstr "" #: grub-core/commands/probe.c:210 grub-core/commands/probe.c:223 #: util/grub-probe.c:462 #, c-format msgid "filesystem `%s' does not support labels" msgstr "" #: grub-core/commands/probe.c:243 grub-core/fs/zfs/zfsinfo.c:433 #: grub-core/loader/i386/bsd.c:170 util/grub-setup.c:223 msgid "DEVICE" msgstr "" #: grub-core/commands/probe.c:244 msgid "Retrieve device info." msgstr "" #: grub-core/commands/read.c:34 msgid "Do not echo input" msgstr "" #: grub-core/commands/read.c:66 grub-core/commands/read.c:71 #: grub-core/fs/ext2.c:771 grub-core/kern/buffer.c:111 #: grub-core/kern/misc.c:420 grub-core/kern/misc.c:478 grub-core/kern/mm.c:568 #: grub-core/lib/arg.c:224 grub-core/lib/arg.c:471 #: grub-core/loader/i386/pc/linux.c:225 grub-core/loader/linux.c:152 #: grub-core/loader/linux.c:261 grub-core/script/lexer.c:179 #: grub-core/video/bitmap.c:145 grub-core/video/readers/png.c:327 #: grub-core/video/readers/png.c:332 include/grub/buffer.h:79 #: include/grub/buffer.h:117 include/grub/misc.h:357 include/grub/misc.h:366 msgid "overflow is detected" msgstr "" #: grub-core/commands/read.c:107 msgid "[-s] [ENVVAR]" msgstr "" #: grub-core/commands/read.c:108 msgid "Set variable with user input." msgstr "" #: grub-core/commands/reboot.c:40 msgid "Reboot the computer." msgstr "" #. TRANSLATORS: in regexp you can mark some #. groups with parentheses. These groups are #. then numbered and you can save some of #. them in variables. In other programs #. those components are often referenced with #. back slash, e.g. \1. Compare #. sed -e 's,\([a-z][a-z]*\),lowercase=\1,g' #. The whole matching component is saved in VARNAME, not its number. #. #: grub-core/commands/regexp.c:44 msgid "Store matched component NUMBER in VARNAME." msgstr "" #: grub-core/commands/regexp.c:45 msgid "[NUMBER:]VARNAME" msgstr "" #. TRANSLATORS: This are two arguments. So it's #. two separate units to translate and pay #. attention not to reverse them. #: grub-core/commands/regexp.c:157 msgid "REGEXP STRING" msgstr "" #: grub-core/commands/regexp.c:158 msgid "Test if REGEXP matches STRING." msgstr "" #: grub-core/commands/search.c:399 msgid "NAME [VARIABLE] [HINTS]" msgstr "" #: grub-core/commands/search_file.c:4 msgid "" "Search devices by file. If VARIABLE is specified, the first device found is " "set to a variable." msgstr "" #: grub-core/commands/search_label.c:4 msgid "" "Search devices by label. If VARIABLE is specified, the first device found is " "set to a variable." msgstr "" #: grub-core/commands/search_uuid.c:4 msgid "" "Search devices by UUID. If VARIABLE is specified, the first device found is " "set to a variable." msgstr "" #: grub-core/commands/search_wrap.c:34 msgid "Search devices by a file." msgstr "" #: grub-core/commands/search_wrap.c:35 msgid "Search devices by a filesystem label." msgstr "" #: grub-core/commands/search_wrap.c:37 msgid "Search devices by a filesystem UUID." msgstr "" #: grub-core/commands/search_wrap.c:40 msgid "Set a variable to the first device found." msgstr "" #: grub-core/commands/search_wrap.c:42 msgid "Do not probe any floppy drive." msgstr "" #: grub-core/commands/search_wrap.c:43 msgid "Only probe EFI disks." msgstr "" #: grub-core/commands/search_wrap.c:44 msgid "Only probe encrypted disks." msgstr "" #: grub-core/commands/search_wrap.c:46 msgid "" "First try the device HINT. If HINT ends in comma, also try subpartitions" msgstr "" #: grub-core/commands/search_wrap.c:47 grub-core/commands/search_wrap.c:51 #: grub-core/commands/search_wrap.c:55 grub-core/commands/search_wrap.c:59 #: grub-core/commands/search_wrap.c:63 grub-core/commands/search_wrap.c:67 msgid "HINT" msgstr "" #: grub-core/commands/search_wrap.c:49 msgid "" "First try the device HINT if currently running on IEEE1275. If HINT ends in " "comma, also try subpartitions" msgstr "" #: grub-core/commands/search_wrap.c:53 msgid "" "First try the device HINT if currently running on BIOS. If HINT ends in " "comma, also try subpartitions" msgstr "" #: grub-core/commands/search_wrap.c:57 msgid "" "First try the device HINT if direct hardware access is supported. If HINT " "ends in comma, also try subpartitions" msgstr "" #: grub-core/commands/search_wrap.c:61 msgid "" "First try the device HINT if currently running on EFI. If HINT ends in " "comma, also try subpartitions" msgstr "" #: grub-core/commands/search_wrap.c:65 msgid "" "First try the device HINT if currently running on ARC. If HINT ends in " "comma, also try subpartitions" msgstr "" #: grub-core/commands/search_wrap.c:218 msgid "" "[-f|-l|-u|-s|-n] [--cryptodisk-only] [--hint HINT [--hint HINT] ...] NAME" msgstr "" #: grub-core/commands/search_wrap.c:220 msgid "" "Search devices by file, filesystem label or filesystem UUID. If --set is " "specified, the first device found is set to a variable. If no variable name " "is specified, `root' is used." msgstr "" #: grub-core/commands/setpci.c:132 #, c-format msgid "Register %x of %x:%02x.%x is %x\n" msgstr "" #: grub-core/commands/setpci.c:331 msgid "[-s POSITION] [-d DEVICE] [-v VAR] REGISTER[=VALUE[:MASK]]" msgstr "" #: grub-core/commands/setpci.c:333 msgid "Manipulate PCI devices." msgstr "" #: grub-core/commands/sleep.c:32 msgid "Verbose countdown." msgstr "" #: grub-core/commands/sleep.c:33 msgid "Allow to interrupt with ESC." msgstr "" #: grub-core/commands/sleep.c:109 msgid "NUMBER_OF_SECONDS" msgstr "" #: grub-core/commands/sleep.c:110 msgid "Wait for a specified number of seconds." msgstr "" #: grub-core/commands/smbios.c:197 msgid "Match structures with the given type." msgstr "" #: grub-core/commands/smbios.c:198 grub-core/loader/i386/bsd.c:490 #: grub-core/loader/i386/bsd.c:556 msgid "type" msgstr "" #: grub-core/commands/smbios.c:199 msgid "Match structures with the given handle." msgstr "" #: grub-core/commands/smbios.c:200 msgid "handle" msgstr "" #: grub-core/commands/smbios.c:201 msgid "Select a structure when several match." msgstr "" #: grub-core/commands/smbios.c:202 msgid "match" msgstr "" #: grub-core/commands/smbios.c:203 msgid "Get the byte's value at the given offset." msgstr "" #: grub-core/commands/smbios.c:204 grub-core/commands/smbios.c:206 #: grub-core/commands/smbios.c:208 grub-core/commands/smbios.c:210 #: grub-core/commands/smbios.c:212 grub-core/commands/smbios.c:214 msgid "offset" msgstr "" #: grub-core/commands/smbios.c:205 msgid "Get two bytes' value at the given offset." msgstr "" #: grub-core/commands/smbios.c:207 msgid "Get four bytes' value at the given offset." msgstr "" #: grub-core/commands/smbios.c:209 msgid "Get eight bytes' value at the given offset." msgstr "" #: grub-core/commands/smbios.c:211 msgid "Get the string specified at the given offset." msgstr "" #: grub-core/commands/smbios.c:213 msgid "Get the UUID's value at the given offset." msgstr "" #: grub-core/commands/smbios.c:215 grub-core/loader/efi/fdt.c:44 msgid "Store the value in the given variable name." msgstr "" #: grub-core/commands/smbios.c:216 grub-core/commands/smbios.c:218 #: grub-core/loader/efi/fdt.c:45 msgid "variable" msgstr "" #: grub-core/commands/smbios.c:217 msgid "Filter the result like linux does." msgstr "" #: grub-core/commands/smbios.c:289 msgid "the SMBIOS entry point structure was not found" msgstr "" #: grub-core/commands/smbios.c:297 msgid "the type must be between 0 and 255" msgstr "" #: grub-core/commands/smbios.c:305 msgid "the handle must be between 0 and 65535" msgstr "" #: grub-core/commands/smbios.c:313 msgid "the match must be a positive integer" msgstr "" #: grub-core/commands/smbios.c:323 msgid "only one --get option is usable at a time" msgstr "" #: grub-core/commands/smbios.c:330 msgid "one of the --get options is required" msgstr "" #: grub-core/commands/smbios.c:336 msgid "no structure matched the given options" msgstr "" #: grub-core/commands/smbios.c:342 msgid "the given offset is outside the structure" msgstr "" #: grub-core/commands/smbios.c:348 msgid "the field ends outside the structure" msgstr "" #: grub-core/commands/smbios.c:354 msgid "failed to retrieve the structure field" msgstr "" #: grub-core/commands/smbios.c:389 msgid "" "[-t type] [-h handle] [-m match] (-b|-w|-d|-q|-s|-u) offset [--set variable]" msgstr "" #: grub-core/commands/smbios.c:392 msgid "Retrieve SMBIOS information." msgstr "" #: grub-core/commands/syslinuxcfg.c:50 util/grub-syslinux2cfg.c:66 msgid "root directory of the syslinux disk [default=/]." msgstr "" #: grub-core/commands/syslinuxcfg.c:53 util/grub-syslinux2cfg.c:72 msgid "" "current directory of syslinux [default is parent directory of input file]." msgstr "" #: grub-core/commands/syslinuxcfg.c:55 util/grub-syslinux2cfg.c:75 msgid "assume input is an isolinux configuration file." msgstr "" #: grub-core/commands/syslinuxcfg.c:56 util/grub-syslinux2cfg.c:76 msgid "assume input is a pxelinux configuration file." msgstr "" #: grub-core/commands/syslinuxcfg.c:57 util/grub-syslinux2cfg.c:77 msgid "assume input is a syslinux configuration file." msgstr "" #. TRANSLATORS: "syslinux config" means #. "config as used by syslinux". #: grub-core/commands/syslinuxcfg.c:189 msgid "Execute syslinux config in same context" msgstr "" #: grub-core/commands/syslinuxcfg.c:195 msgid "Execute syslinux config in new context" msgstr "" #: grub-core/commands/syslinuxcfg.c:201 msgid "Execute syslinux config in same context taking only menu entries" msgstr "" #: grub-core/commands/syslinuxcfg.c:207 msgid "Execute syslinux config in new context taking only menu entries" msgstr "" #: grub-core/commands/terminal.c:90 msgid "no terminal specified" msgstr "" #: grub-core/commands/terminal.c:112 grub-core/commands/terminal.c:139 #, c-format msgid "terminal `%s' isn't found" msgstr "" #: grub-core/commands/terminal.c:244 msgid "Active input terminals:" msgstr "" #: grub-core/commands/terminal.c:245 msgid "Available input terminals:" msgstr "" #: grub-core/commands/terminal.c:261 msgid "Active output terminals:" msgstr "" #: grub-core/commands/terminal.c:262 msgid "Available output terminals:" msgstr "" #: grub-core/commands/terminal.c:271 grub-core/commands/terminal.c:276 msgid "[--append|--remove] [TERMINAL1] [TERMINAL2] ..." msgstr "" #: grub-core/commands/terminal.c:273 msgid "List or select an input terminal." msgstr "" #: grub-core/commands/terminal.c:278 msgid "List or select an output terminal." msgstr "" #: grub-core/commands/test.c:405 msgid "max recursion depth exceeded" msgstr "" #: grub-core/commands/test.c:459 msgid "EXPRESSION ]" msgstr "" #: grub-core/commands/test.c:459 grub-core/commands/test.c:462 msgid "Evaluate an expression." msgstr "" #: grub-core/commands/test.c:462 msgid "EXPRESSION" msgstr "" #: grub-core/commands/testload.c:166 msgid "Load the same file in multiple ways." msgstr "" #: grub-core/commands/testspeed.c:35 msgid "Specify size for each read operation" msgstr "" #: grub-core/commands/testspeed.c:58 msgid "invalid block size" msgstr "" #: grub-core/commands/testspeed.c:80 #, c-format msgid "File size: %s\n" msgstr "" #: grub-core/commands/testspeed.c:83 #, c-format msgid "Elapsed time: %d.%03d s \n" msgstr "" #: grub-core/commands/testspeed.c:92 #, c-format msgid "Speed: %s \n" msgstr "" #: grub-core/commands/testspeed.c:107 msgid "[-s SIZE] FILENAME" msgstr "" #: grub-core/commands/testspeed.c:108 msgid "Test file read speed." msgstr "" #: grub-core/commands/time.c:38 grub-core/script/execute.c:999 msgid "no command is specified" msgstr "" #: grub-core/commands/time.c:50 #, c-format msgid "Elapsed time: %d.%03d seconds \n" msgstr "" #: grub-core/commands/time.c:61 msgid "COMMAND [ARGS]" msgstr "" #: grub-core/commands/time.c:62 msgid "Measure time used by COMMAND" msgstr "" #: grub-core/commands/tpm2_key_protector/args.c:44 msgid "empty entry in PCR list" msgstr "" #: grub-core/commands/tpm2_key_protector/args.c:50 #, c-format msgid "entry '%s' in PCR list is not a number" msgstr "" #: grub-core/commands/tpm2_key_protector/args.c:53 #, c-format msgid "" "entry %llu in PCR list is too large to be a PCR number, PCR numbers range " "from 0 to %u" msgstr "" #: grub-core/commands/tpm2_key_protector/args.c:63 msgid "trailing comma at the end of PCR list" msgstr "" #: grub-core/commands/tpm2_key_protector/args.c:67 #, c-format msgid "too many PCRs in PCR list, the maximum number of PCRs is %u" msgstr "" #: grub-core/commands/tpm2_key_protector/args.c:89 #, c-format msgid "value '%s' is not a valid asymmetric key type" msgstr "" #: grub-core/commands/tpm2_key_protector/args.c:106 #, c-format msgid "value '%s' is not a valid PCR bank" msgstr "" #: grub-core/commands/tpm2_key_protector/args.c:119 #, c-format msgid "TPM handle value '%s' is not a number" msgstr "" #: grub-core/commands/tpm2_key_protector/args.c:122 #, c-format msgid "" "value %llu is too large to be a TPM handle, TPM handles are unsigned 32-bit " "integers" msgstr "" #: grub-core/commands/tpm2_key_protector/module.c:80 msgid "" "Unseal key using SRK ('srk') (default) or retrieve it from an NV Index " "('nv')." msgstr "" #: grub-core/commands/tpm2_key_protector/module.c:90 msgid "" "Comma-separated list of PCRs used to authorize key release e.g., '7,11'. " "(default: 7)" msgstr "" #: grub-core/commands/tpm2_key_protector/module.c:100 msgid "" "Bank of PCRs used to authorize key release: SHA1, SHA256, SHA384 or SHA512. " "(default: SHA256)" msgstr "" #: grub-core/commands/tpm2_key_protector/module.c:111 msgid "" "In SRK mode, path to the key file in the TPM 2.0 Key File format to unseal " "using the TPM (e.g., (hd0,gpt1)/boot/grub2/sealed.tpm)." msgstr "" #: grub-core/commands/tpm2_key_protector/module.c:121 msgid "" "In SRK mode, path to the key file in the raw format to unseal using the TPM " "(e.g., (hd0,gpt1)/boot/grub2/sealed.key). (Mainly for backward " "compatibility. Please use '--tpm2key'.)" msgstr "" #: grub-core/commands/tpm2_key_protector/module.c:132 msgid "In SRK mode, the SRK handle if the SRK is persistent." msgstr "" #: grub-core/commands/tpm2_key_protector/module.c:141 msgid "" "In SRK mode, the type of SRK: RSA (RSA2048) and ECC (ECC_NIST_P256)(default: " "ECC)" msgstr "" #: grub-core/commands/tpm2_key_protector/module.c:152 msgid "" "Required in NV Index mode, the NV handle to read which must readily exist on " "the TPM and which contains the key." msgstr "" #: grub-core/commands/tpm2_key_protector/module.c:185 #, c-format msgid "could not open file: %s" msgstr "" #: grub-core/commands/tpm2_key_protector/module.c:192 #, c-format msgid "could not read file size: %s" msgstr "" #: grub-core/commands/tpm2_key_protector/module.c:199 #, c-format msgid "could not allocate buffer for %s" msgstr "" #: grub-core/commands/tpm2_key_protector/module.c:207 #, c-format msgid "could not retrieve file contents: %s" msgstr "" #: grub-core/commands/tpm2_key_protector/module.c:273 #: grub-core/commands/tpm2_key_protector/module.c:376 #, c-format msgid "sealed key larger than %llu bytes" msgstr "" #: grub-core/commands/tpm2_key_protector/module.c:282 msgid "malformed TPM wire key file" msgstr "" #: grub-core/commands/tpm2_key_protector/module.c:390 msgid "malformed TPM 2.0 key file" msgstr "" #: grub-core/commands/tpm2_key_protector/module.c:888 msgid "no memory left to allocate unlock key buffer" msgstr "" #: grub-core/commands/tpm2_key_protector/module.c:1128 msgid "key file not specified" msgstr "" #: grub-core/commands/tpm2_key_protector/module.c:1235 msgid "" "cannot use TPM2 key protector without initializing it, call " "tpm2_protector_init first" msgstr "" #: grub-core/commands/tpm2_key_protector/module.c:1252 msgid "in SRK mode, a key file must be specified: --tpm2key/-T or --keyfile/-k" msgstr "" #: grub-core/commands/tpm2_key_protector/module.c:1256 msgid "" "in SRK mode, please specify a key file with only --tpm2key/-T or --keyfile/-k" msgstr "" #: grub-core/commands/tpm2_key_protector/module.c:1259 msgid "in SRK mode, an NV Index cannot be specified" msgstr "" #: grub-core/commands/tpm2_key_protector/module.c:1263 msgid "in NV Index mode, an NV Index must be specified: --nvindex or -n" msgstr "" #: grub-core/commands/tpm2_key_protector/module.c:1267 msgid "a key file cannot be specified when using NV index mode" msgstr "" #: grub-core/commands/tpm2_key_protector/module.c:1271 msgid "" "an SRK cannot be specified when using NV index mode with a persistent handle" msgstr "" #: grub-core/commands/tpm2_key_protector/module.c:1275 msgid "" "an NV index must be either a persistent handle or an NV index handle when " "using NV index mode" msgstr "" #: grub-core/commands/tpm2_key_protector/module.c:1312 msgid "no memory to duplicate file path" msgstr "" #: grub-core/commands/tpm2_key_protector/module.c:1325 #, c-format msgid "value '%s' is not a valid TPM2 key protector mode" msgstr "" #: grub-core/commands/tpm2_key_protector/module.c:1338 msgid "" "the TPM2 key protector does not accept any non-option arguments (i.e., like -" "o and/or --option only)" msgstr "" #: grub-core/commands/tpm2_key_protector/module.c:1419 msgid "tpm2_key_protector_clear accepts no arguments" msgstr "" #: grub-core/commands/tpm2_key_protector/module.c:1465 msgid "" "[-m mode] [-p pcr_list] [-b pcr_bank] [-T tpm2_key_file_path] [-k " "sealed_key_file_path] [-s srk_handle] [-a asymmetric_key_type] [-n nv_index]" msgstr "" #: grub-core/commands/tpm2_key_protector/module.c:1473 msgid "Initialize the TPM2 key protector." msgstr "" #: grub-core/commands/tpm2_key_protector/module.c:1478 msgid "Clear the TPM2 key protector if previously initialized." msgstr "" #: grub-core/commands/tpm2_key_protector/module.c:1483 msgid "Dump TPM2 PCRs" msgstr "" #: grub-core/commands/tpm2_key_protector/module.c:1484 msgid "Print all PCRs of the specified TPM 2.0 bank" msgstr "" #: grub-core/commands/tr.c:33 msgid "Translate to upper case." msgstr "" #: grub-core/commands/tr.c:34 msgid "Translate to lower case." msgstr "" #: grub-core/commands/tr.c:119 msgid "[OPTIONS] [SET1] [SET2] [STRING]" msgstr "" #: grub-core/commands/tr.c:120 msgid "Translate SET1 characters to SET2 in STRING." msgstr "" #. TRANSLATORS: it's a command description. #: grub-core/commands/true.c:50 msgid "Do nothing, successfully." msgstr "" #. TRANSLATORS: it's a command description. #: grub-core/commands/true.c:54 msgid "Do nothing, unsuccessfully." msgstr "" #: grub-core/commands/usbtest.c:221 msgid "Test USB support." msgstr "" #: grub-core/commands/videoinfo.c:61 msgid "Text-only " msgstr "" #. TRANSLATORS: "Direct color" is a mode when the color components #. are written dirrectly into memory. #: grub-core/commands/videoinfo.c:66 #, c-format msgid "Direct color, mask: %d/%d/%d/%d pos: %d/%d/%d/%d" msgstr "" #. TRANSLATORS: In "paletted color" mode you write the index of the color #. in the palette. Synonyms include "packed pixel". #: grub-core/commands/videoinfo.c:78 msgid "Paletted " msgstr "" #: grub-core/commands/videoinfo.c:80 msgid "YUV " msgstr "" #. TRANSLATORS: "Planar" is the video memory where you have to write #. in several different banks "plans" to control the different color #. components of the same pixel. #: grub-core/commands/videoinfo.c:85 msgid "Planar " msgstr "" #: grub-core/commands/videoinfo.c:87 msgid "Hercules " msgstr "" #: grub-core/commands/videoinfo.c:89 msgid "CGA " msgstr "" #. TRANSLATORS: Non-chain 4 is a 256-color planar #. (unchained) video memory mode. #: grub-core/commands/videoinfo.c:93 msgid "Non-chain 4 " msgstr "" #: grub-core/commands/videoinfo.c:95 msgid "Monochrome " msgstr "" #: grub-core/commands/videoinfo.c:97 msgid "Unknown video mode " msgstr "" #: grub-core/commands/videoinfo.c:111 msgid " EDID checksum invalid" msgstr "" #: grub-core/commands/videoinfo.c:116 #, c-format msgid " EDID version: %u.%u\n" msgstr "" #: grub-core/commands/videoinfo.c:120 #, c-format msgid " Preferred mode: %ux%u\n" msgstr "" #: grub-core/commands/videoinfo.c:123 msgid " No preferred mode available\n" msgstr "" #: grub-core/commands/videoinfo.c:146 grub-core/video/video.c:490 #: grub-core/video/video.c:498 grub-core/video/video.c:509 #: grub-core/video/video.c:520 grub-core/video/video.c:528 #, c-format msgid "invalid video mode specification `%s'" msgstr "" #: grub-core/commands/videoinfo.c:168 msgid "List of supported video modes:" msgstr "" #: grub-core/commands/videoinfo.c:169 msgid "Legend: mask/position=red/green/blue/reserved" msgstr "" #: grub-core/commands/videoinfo.c:176 #, c-format msgid "Adapter `%s':\n" msgstr "" #: grub-core/commands/videoinfo.c:180 msgid " No info available" msgstr "" #: grub-core/commands/videoinfo.c:196 msgid "" " A video driver is active, cannot initialize this driver until it is " "deactivated\n" msgstr "" #: grub-core/commands/videoinfo.c:203 msgid " Failed to initialize video adapter" msgstr "" #. TRANSLATORS: "x" has to be entered in, #. like an identifier, so please don't #. use better Unicode codepoints. #: grub-core/commands/videoinfo.c:244 grub-core/commands/videoinfo.c:253 msgid "[WxH[xD]]" msgstr "" #: grub-core/commands/videoinfo.c:245 grub-core/commands/videoinfo.c:254 msgid "" "List available video modes. If resolution is given show only modes matching " "it." msgstr "" #. TRANSLATORS: "x" has to be entered in, #. like an identifier, so please don't #. use better Unicode codepoints. #: grub-core/commands/videotest.c:225 msgid "[WxH]" msgstr "" #. TRANSLATORS: Here, on the other hand, it's #. nicer to use unicode cross instead of x. #: grub-core/commands/videotest.c:228 msgid "Test video subsystem in mode WxH." msgstr "" #: grub-core/commands/videotest.c:231 msgid "Test video subsystem." msgstr "" #: grub-core/commands/xen/lsxen.c:80 grub-core/commands/xen/lsxen.c:82 msgid "[DIR]" msgstr "" #: grub-core/commands/xen/lsxen.c:81 grub-core/commands/xen/lsxen.c:83 msgid "List Xen storage." msgstr "" #. TRANSLATORS: GRUBUUID stands for "filesystem #. UUID as used in GRUB". #: grub-core/commands/xnu_uuid.c:110 msgid "[-l] GRUBUUID [VARNAME]" msgstr "" #: grub-core/commands/xnu_uuid.c:111 msgid "" "Transform 64-bit UUID to format suitable for XNU. If -l is given keep it " "lowercase as done by blkid." msgstr "" #: grub-core/disk/arc/arcdisk.c:248 grub-core/disk/efi/efidisk.c:613 #: grub-core/disk/i386/pc/biosdisk.c:494 grub-core/disk/i386/pc/biosdisk.c:539 #: grub-core/disk/ieee1275/nand.c:198 grub-core/disk/ieee1275/obdisk.c:564 #: grub-core/disk/ieee1275/ofdisk.c:621 #, c-format msgid "failure reading sector 0x%llx from `%s'" msgstr "" #: grub-core/disk/arc/arcdisk.c:284 grub-core/disk/efi/efidisk.c:636 #: grub-core/disk/i386/pc/biosdisk.c:544 grub-core/disk/ieee1275/ofdisk.c:641 #, c-format msgid "failure writing sector 0x%llx to `%s'" msgstr "" #: grub-core/disk/cryptodisk.c:56 msgid "Mount by UUID." msgstr "" #. TRANSLATORS: It's still restricted to cryptodisks only. #: grub-core/disk/cryptodisk.c:58 msgid "Mount all." msgstr "" #: grub-core/disk/cryptodisk.c:59 msgid "Mount all volumes with `boot' flag set." msgstr "" #: grub-core/disk/cryptodisk.c:60 msgid "Password to open volumes." msgstr "" #: grub-core/disk/cryptodisk.c:61 msgid "Key file" msgstr "" #: grub-core/disk/cryptodisk.c:62 msgid "Key file offset (bytes)" msgstr "" #: grub-core/disk/cryptodisk.c:63 msgid "Key file data size (bytes)" msgstr "" #: grub-core/disk/cryptodisk.c:64 msgid "Read header from file" msgstr "" #: grub-core/disk/cryptodisk.c:66 msgid "Unlock volume(s) using key protector(s)." msgstr "" #. TRANSLATORS: The first %s is the file being looked at, the second %s is #. the error message. #: grub-core/disk/cryptodisk.c:736 grub-core/kern/emu/hostdisk.c:152 #: grub-core/kern/emu/hostdisk.c:262 grub-core/kern/emu/hostdisk.c:434 #: grub-core/kern/emu/misc.c:188 grub-core/kern/emu/misc.c:194 #: grub-core/kern/emu/misc.c:216 grub-core/osdep/bsd/getroot.c:92 #: grub-core/osdep/bsd/getroot.c:168 grub-core/osdep/hurd/getroot.c:68 #: grub-core/osdep/linux/blocklist.c:65 grub-core/osdep/linux/getroot.c:147 #: grub-core/osdep/linux/hostdisk.c:152 grub-core/osdep/linux/hostdisk.c:383 #: grub-core/osdep/linux/ofpath.c:417 grub-core/osdep/linux/ofpath.c:422 #: grub-core/osdep/linux/ofpath.c:517 grub-core/osdep/linux/ofpath.c:530 #: grub-core/osdep/sun/getroot.c:110 grub-core/osdep/windows/blocklist.c:98 #: grub-core/tests/video_checksum.c:279 util/editenv.c:54 util/glue-efi.c:125 #: util/glue-efi.c:130 util/glue-efi.c:140 util/grub-editenv.c:139 #: util/grub-editenv.c:198 util/grub-file.c:83 util/grub-fstest.c:129 #: util/grub-fstest.c:579 util/grub-install-common.c:92 #: util/grub-install-common.c:94 util/grub-install-common.c:101 #: util/grub-install-common.c:717 util/grub-menulst2cfg.c:53 #: util/grub-menulst2cfg.c:68 util/grub-mkimage.c:313 util/grub-mklayout.c:504 #: util/grub-mklayout.c:516 util/grub-mknetdir.c:134 util/grub-mknetdir.c:152 #: util/grub-mkrescue.c:655 util/grub-mkrescue.c:659 util/grub-mkrescue.c:926 #: util/grub-mkrescue.c:930 util/grub-mkstandalone.c:274 util/grub-mount.c:518 #: util/grub-render-label.c:169 util/grub-script-check.c:175 #: util/grub-syslinux2cfg.c:181 util/grub-syslinux2cfg.c:191 #: util/grub-syslinux2cfg.c:212 util/grub-syslinux2cfg.c:228 util/misc.c:91 #: util/render-label.c:76 util/render-label.c:163 util/render-label.c:174 #: util/resolve.c:249 util/setup.c:786 #, c-format msgid "cannot open `%s': %s" msgstr "" #: grub-core/disk/cryptodisk.c:746 #, c-format msgid "failed to query size of device `%s': %s" msgstr "" #: grub-core/disk/cryptodisk.c:808 grub-core/disk/cryptodisk.c:852 #: grub-core/kern/emu/hostdisk.c:270 grub-core/kern/emu/hostfs.c:142 #: grub-core/osdep/linux/hostdisk.c:418 util/grub-editenv.c:144 #: util/grub-editenv.c:155 util/grub-fstest.c:327 util/misc.c:111 #, c-format msgid "cannot seek `%s': %s" msgstr "" #: grub-core/disk/cryptodisk.c:1045 msgid "header file not found" msgstr "" #: grub-core/disk/cryptodisk.c:1055 msgid "header file too small" msgstr "" #: grub-core/disk/cryptodisk.c:1181 grub-core/disk/cryptodisk.c:1201 #: grub-core/disk/cryptodisk.c:1260 grub-core/disk/cryptodisk.c:1827 #: grub-core/disk/plainmount.c:379 msgid "UNKNOWN" msgstr "" #: grub-core/disk/cryptodisk.c:1199 #, c-format msgid "no key protector provided a usable key for %s%s%s (%s)" msgstr "" #: grub-core/disk/cryptodisk.c:1250 #, c-format msgid "Invalid cryptodisk_passphrase_tries value `%s'. Defaulting to %lu.\n" msgstr "" #: grub-core/disk/cryptodisk.c:1258 grub-core/disk/cryptodisk.c:1825 #, c-format msgid "Enter passphrase for %s%s%s (%s): " msgstr "" #: grub-core/disk/cryptodisk.c:1276 msgid "Invalid passphrase." msgstr "" #: grub-core/disk/cryptodisk.c:1461 #, c-format msgid "non-numeric or invalid keyfile offset `%s'" msgstr "" #: grub-core/disk/cryptodisk.c:1472 #, c-format msgid "non-numeric or invalid keyfile size `%s'" msgstr "" #: grub-core/disk/cryptodisk.c:1476 msgid "key file size is 0" msgstr "" #: grub-core/disk/cryptodisk.c:1480 #, c-format msgid "key file size exceeds maximum (%d)" msgstr "" #: grub-core/disk/cryptodisk.c:1491 #, c-format msgid "Keyfile offset, %llu, is greater than keyfile size, %llu" msgstr "" #: grub-core/disk/cryptodisk.c:1502 msgid "keyfile is too small: requested %llu bytes, but the file only has %" msgstr "" #: grub-core/disk/cryptodisk.c:1519 msgid "failed to read key file" msgstr "" #: grub-core/disk/cryptodisk.c:1526 msgid "cannot use UUID lookup with detached header" msgstr "" #: grub-core/disk/cryptodisk.c:1899 msgid "" "[ [-p password] | [-k keyfile [-O keyoffset] [-S keysize] ] ] [-H file] [-P " "protector [-P protector ...]] " msgstr "" #: grub-core/disk/cryptodisk.c:1903 msgid "Mount a crypto device." msgstr "" #. TRANSLATORS: This message kicks in during the detection of #. which modules needs to be included in core image. This happens #. in the case of degraded RAID and means that autodetection may #. fail to include some of modules. It's an installation time #. message, not runtime message. #. #. TRANSLATORS: This message kicks in during the detection of #. which modules needs to be included in core image. This happens #. in the case of degraded RAID and means that autodetection may #. fail to include some of modules. It's an installation time #. message, not runtime message. #: grub-core/disk/diskfilter.c:366 grub-core/disk/diskfilter.c:418 #, c-format msgid "" "Couldn't find physical volume `%s'. Some modules may be missing from core " "image." msgstr "" #: grub-core/disk/diskfilter.c:522 #, c-format msgid "physical volume %s not found" msgstr "" #: grub-core/disk/diskfilter.c:1428 #, c-format msgid "unrecognized option: %s" msgstr "" #: grub-core/disk/diskfilter.c:1432 msgid "disk name expected" msgstr "" #: grub-core/disk/diskfilter.c:1438 #, c-format msgid "invalid disk: %s" msgstr "" #: grub-core/disk/diskfilter.c:1442 #, c-format msgid "unrecognized disk: %s" msgstr "" #: grub-core/disk/diskfilter.c:1447 #, c-format msgid "no such disk: %s" msgstr "" #: grub-core/disk/diskfilter.c:1484 msgid "[--quiet] DEVICE" msgstr "" #: grub-core/disk/diskfilter.c:1485 msgid "Check if a logical volume resides on encrypted disks." msgstr "" #: grub-core/disk/efi/efidisk.c:610 grub-core/disk/efi/efidisk.c:633 #, c-format msgid "no media in `%s'" msgstr "" #: grub-core/disk/geli.c:75 msgid "Couldn't load sha256" msgstr "" #: grub-core/disk/geli.c:85 msgid "Couldn't load sha512" msgstr "" #: grub-core/disk/geli.c:214 grub-core/disk/geli.c:218 msgid "couldn't read ELI metadata" msgstr "" #: grub-core/disk/geli.c:229 msgid "wrong ELI magic or version" msgstr "" #: grub-core/disk/geli.c:435 grub-core/disk/luks.c:158 #: grub-core/disk/luks2.c:582 msgid "Attempting to decrypt master key..." msgstr "" #. TRANSLATORS: It's a cryptographic key slot: one element of an array #. where each element is either empty or holds a key. #: grub-core/disk/geli.c:519 grub-core/disk/luks.c:267 #, c-format msgid "Slot %d opened\n" msgstr "" #: grub-core/disk/i386/pc/biosdisk.c:466 grub-core/disk/i386/pc/biosdisk.c:520 #: grub-core/disk/i386/pc/biosdisk.c:530 grub-core/kern/disk_common.c:48 #, c-format msgid "attempt to read or write outside of disk `%s'" msgstr "" #: grub-core/disk/i386/pc/biosdisk.c:487 grub-core/disk/i386/pc/biosdisk.c:610 #: grub-core/disk/scsi.c:724 msgid "cannot write to CD-ROM" msgstr "" #: grub-core/disk/i386/pc/biosdisk.c:661 msgid "" "Native disk drivers are in use. Refusing to use firmware disk interface." msgstr "" #: grub-core/disk/ieee1275/obdisk.c:138 msgid "overflow detected while obtaining size of device name" msgstr "" #: grub-core/disk/ieee1275/obdisk.c:176 msgid "overflow detected while obtaining encoding size" msgstr "" #: grub-core/disk/ieee1275/obdisk.c:420 msgid "overflow detected while obtaining size of canonical name" msgstr "" #: grub-core/disk/ieee1275/ofdisk.c:95 grub-core/disk/ieee1275/ofdisk.c:467 msgid "overflow detected while obtaining size of device path" msgstr "" #: grub-core/disk/ieee1275/ofdisk.c:111 msgid "overflow detected while obtaining size of an open path" msgstr "" #: grub-core/disk/ieee1275/ofdisk.c:680 msgid "overflow detected while obtaining bootpath size" msgstr "" #. TRANSLATORS: it's a partition for embedding, #. not a partition embed into something. GRUB #. install tools put core.img into a place #. usable for bootloaders (called generically #. "embedding zone") and this operation is #. called "embedding". #: grub-core/disk/ldm.c:1086 msgid "your LDM Embedding Partition is too small; embedding won't be possible" msgstr "" #. TRANSLATORS: it's a partition for embedding, #. not a partition embed into something. #: grub-core/disk/ldm.c:1104 msgid "this LDM has no Embedding Partition; embedding won't be possible" msgstr "" #. TRANSLATORS: The disk is simply removed from the list of available ones, #. not wiped, avoid to scare user. #: grub-core/disk/loopback.c:47 msgid "Delete the specified loopback drive." msgstr "" #: grub-core/disk/loopback.c:48 msgid "Transparently decompress backing file." msgstr "" #: grub-core/disk/loopback.c:251 msgid "[-d] [-D] DEVICENAME FILE." msgstr "" #. TRANSLATORS: The file itself is not destroyed #. or transformed into drive. #: grub-core/disk/loopback.c:254 msgid "Make a virtual drive from a file." msgstr "" #: grub-core/disk/luks2.c:389 msgid "could not unescape Base64 string" msgstr "" #: grub-core/disk/luks2.c:394 msgid "could not decode Base64 string" msgstr "" #. TRANSLATORS: It's a cryptographic key slot: one element of an array #. where each element is either empty or holds a key. #. #: grub-core/disk/luks2.c:761 #, c-format msgid "Slot \"%s\" opened\n" msgstr "" #. TRANSLATORS: It's still restricted to this module only. #: grub-core/disk/plainmount.c:50 msgid "Password hash" msgstr "" #: grub-core/disk/plainmount.c:51 msgid "Password cipher" msgstr "" #: grub-core/disk/plainmount.c:52 msgid "Key size (in bits)" msgstr "" #: grub-core/disk/plainmount.c:53 msgid "Device sector size" msgstr "" #: grub-core/disk/plainmount.c:54 msgid "Password (key)" msgstr "" #: grub-core/disk/plainmount.c:55 msgid "Keyfile path" msgstr "" #: grub-core/disk/plainmount.c:56 msgid "Keyfile offset" msgstr "" #: grub-core/disk/plainmount.c:57 msgid "Set device UUID" msgstr "" #: grub-core/disk/plainmount.c:70 msgid "cannot set specified key" msgstr "" #: grub-core/disk/plainmount.c:103 #, c-format msgid "cannot determine disk %s size" msgstr "" #: grub-core/disk/plainmount.c:113 #, c-format msgid "cannot set specified sector size on disk %s" msgstr "" #: grub-core/disk/plainmount.c:151 msgid "overflow detected while allocating size of password buffer" msgstr "" #: grub-core/disk/plainmount.c:193 #, c-format msgid "cannot open keyfile %s" msgstr "" #: grub-core/disk/plainmount.c:198 msgid "cannot seek keyfile at offset %" msgstr "" #: grub-core/disk/plainmount.c:202 msgid "Specified key size (%" msgstr "" #: grub-core/disk/plainmount.c:208 msgid "error reading key file" msgstr "" #: grub-core/disk/plainmount.c:227 msgid "device name required" msgstr "" #: grub-core/disk/plainmount.c:240 #, c-format msgid "couldn't load hash %s" msgstr "" #: grub-core/disk/plainmount.c:245 msgid "hash length %" msgstr "" #: grub-core/disk/plainmount.c:253 msgid "invalid cipher mode, must be of format cipher-mode" msgstr "" #: grub-core/disk/plainmount.c:259 msgid "password exceeds maximium size" msgstr "" #: grub-core/disk/plainmount.c:265 msgid "specified UUID exceeds maximum size" msgstr "" #: grub-core/disk/plainmount.c:267 msgid "specified UUID too short" msgstr "" #: grub-core/disk/plainmount.c:276 msgid "unrecognized keyfile offset" msgstr "" #: grub-core/disk/plainmount.c:283 msgid "unrecognized sector size" msgstr "" #: grub-core/disk/plainmount.c:289 msgid "unrecognized key size" msgstr "" #: grub-core/disk/plainmount.c:292 #, c-format msgid "key size is not multiple of %d bits" msgstr "" #: grub-core/disk/plainmount.c:296 msgid "key size %" msgstr "" #: grub-core/disk/plainmount.c:303 #, c-format msgid "sector size -S must be at least %d" msgstr "" #: grub-core/disk/plainmount.c:307 msgid "sector size -S %" msgstr "" #: grub-core/disk/plainmount.c:346 #, c-format msgid "invalid cipher %s" msgstr "" #: grub-core/disk/plainmount.c:348 #, c-format msgid "invalid mode %s" msgstr "" #: grub-core/disk/plainmount.c:350 #, c-format msgid "invalid cipher %s or mode %s" msgstr "" #: grub-core/disk/plainmount.c:369 #, c-format msgid "cannot open disk %s" msgstr "" #: grub-core/disk/plainmount.c:377 #, c-format msgid "Enter passphrase for %s%s%s: " msgstr "" #: grub-core/disk/plainmount.c:384 msgid "error reading password" msgstr "" #: grub-core/disk/plainmount.c:396 msgid "warning: hash is ignored if keyfile is specified\n" msgstr "" #: grub-core/disk/plainmount.c:400 msgid "" "warning: password specified with -p option is ignored if keyfile is " "provided\n" msgstr "" #: grub-core/disk/plainmount.c:405 msgid "warning: keyfile offset option -O specified without keyfile option -d\n" msgstr "" #: grub-core/disk/plainmount.c:453 msgid "" "-c cipher -s key-size [-h hash] [-S sector-size] [-o offset] [-p password] [-" "u uuid] [[-d keyfile] [-O keyfile offset]] " msgstr "" #: grub-core/disk/plainmount.c:456 msgid "Open partition encrypted in plain mode." msgstr "" #: grub-core/efiemu/i386/loadcore32.c:111 grub-core/kern/arm/dl.c:256 #: grub-core/kern/i386/dl.c:75 grub-core/kern/mips/dl.c:258 #: grub-core/kern/powerpc/dl.c:163 util/grub-mkimagexx.c:801 #: util/grub-mkimagexx.c:928 util/grub-mkimagexx.c:992 #: util/grub-mkimagexx.c:1073 util/grub-mkimagexx.c:1167 #: util/grub-mkimagexx.c:1232 util/grub-mkimagexx.c:1334 #: util/grub-mkimagexx.c:1526 util/grub-mkimagexx.c:1741 #: util/grub-mkimagexx.c:1779 util/grub-mkimagexx.c:1837 #: util/grub-mkimagexx.c:1869 util/grub-mkimagexx.c:1940 #: util/grub-mkimagexx.c:1970 #, c-format msgid "relocation 0x%x is not implemented yet" msgstr "" #: grub-core/efiemu/i386/loadcore64.c:130 grub-core/kern/arm64/dl.c:192 #: grub-core/kern/ia64/dl.c:145 grub-core/kern/loongarch64/dl.c:144 #: grub-core/kern/riscv/dl.c:340 grub-core/kern/sparc64/dl.c:185 #: grub-core/kern/x86_64/dl.c:115 #, c-format msgid "relocation 0x%s is not implemented yet" msgstr "" #: grub-core/efiemu/loadcore.c:200 grub-core/efiemu/loadcore.c:237 #: grub-core/loader/i386/bsdXX.c:339 util/grub-mkimagexx.c:2549 msgid "no symbol table" msgstr "" #: grub-core/efiemu/loadcore.c:346 grub-core/kern/dl.c:751 #: grub-core/loader/ia64/efi/linux.c:345 grub-core/loader/mips/linux.c:248 #: grub-core/loader/multiboot_elfxx.c:89 #: grub-core/loader/powerpc/ieee1275/linux.c:291 #: grub-core/loader/sparc64/ieee1275/linux.c:320 msgid "this ELF file is not of the right type" msgstr "" #: grub-core/efiemu/main.c:313 msgid "Load and initialize EFI emulator." msgstr "" #: grub-core/efiemu/main.c:317 msgid "Finalize loading of EFI emulator." msgstr "" #: grub-core/efiemu/main.c:320 msgid "Unload EFI emulator." msgstr "" #: grub-core/efiemu/symbols.c:92 grub-core/kern/dl.c:404 #, c-format msgid "symbol `%s' not found" msgstr "" #: grub-core/font/font_cmd.c:52 msgid "Loaded fonts:" msgstr "" #: grub-core/font/font_cmd.c:74 msgid "FILE..." msgstr "" #: grub-core/font/font_cmd.c:75 msgid "Specify one or more font files to load." msgstr "" #: grub-core/font/font_cmd.c:78 msgid "List the loaded fonts." msgstr "" #: grub-core/fs/archelp.c:106 msgid "link target length overflow" msgstr "" #: grub-core/fs/archelp.c:193 grub-core/fs/btrfs.c:1833 #: grub-core/fs/btrfs.c:2113 grub-core/fs/fshelp.c:189 #: grub-core/fs/fshelp.c:312 grub-core/fs/jfs.c:469 grub-core/fs/minix.c:419 #: grub-core/fs/minix.c:581 grub-core/fs/reiserfs.c:733 grub-core/fs/ufs.c:532 #: grub-core/fs/ufs.c:672 grub-core/fs/zfs/zfs.c:2927 #: grub-core/fs/zfs/zfs.c:4447 msgid "not a directory" msgstr "" #: grub-core/fs/archelp.c:231 grub-core/fs/archelp.c:293 #: grub-core/fs/btrfs.c:1956 grub-core/fs/fshelp.c:227 grub-core/fs/jfs.c:789 #: grub-core/fs/minix.c:372 grub-core/fs/ufs.c:455 msgid "too deep nesting of symlinks" msgstr "" #: grub-core/fs/bfs.c:229 grub-core/fs/fshelp.c:383 grub-core/fs/minix.c:273 #: grub-core/kern/file.c:168 msgid "attempt to read past the end of file" msgstr "" #: grub-core/fs/btrfs.c:1903 msgid "directory item size overflow" msgstr "" #: grub-core/fs/btrfs.c:1975 grub-core/fs/zfs/zfs.c:2509 msgid "buffer size overflow" msgstr "" #: grub-core/fs/btrfs.c:2145 msgid "directory element size overflow" msgstr "" #: grub-core/fs/btrfs.c:2251 grub-core/fs/fshelp.c:310 grub-core/fs/jfs.c:888 #: grub-core/fs/zfs/zfs.c:3965 msgid "not a regular file" msgstr "" #: grub-core/fs/btrfs.c:2401 grub-core/fs/zfs/zfs.c:4535 #: grub-core/partmap/msdos.c:404 msgid "your core.img is unusually large. It won't fit in the embedding area" msgstr "" #: grub-core/fs/cpio_common.c:67 grub-core/fs/tar.c:180 msgid "data size overflow" msgstr "" #: grub-core/fs/cpio_common.c:72 grub-core/fs/tar.c:188 msgid "mtime overflow" msgstr "" #: grub-core/fs/cpio_common.c:76 grub-core/fs/tar.c:193 msgid "mode overflow" msgstr "" #: grub-core/fs/cpio_common.c:79 msgid "namesize overflow" msgstr "" #: grub-core/fs/cpio_common.c:92 msgid "file name size overflow" msgstr "" #: grub-core/fs/cpio_common.c:135 msgid "target data size overflow" msgstr "" #: grub-core/fs/erofs.c:704 grub-core/fs/f2fs.c:975 grub-core/fs/xfs.c:760 msgid "symlink size overflow" msgstr "" #: grub-core/fs/f2fs.c:1023 msgid "directory entry name length overflow" msgstr "" #: grub-core/fs/fshelp.c:284 grub-core/fs/minix.c:649 grub-core/fs/ufs.c:662 #: grub-core/fs/ufs.c:758 grub-core/kern/fs.c:172 grub-core/kern/fs.c:188 #, c-format msgid "invalid file name `%s'" msgstr "" #: grub-core/fs/fshelp.c:376 msgid "blocksize too large" msgstr "" #: grub-core/fs/jfs.c:486 msgid "invalid JFS inode" msgstr "" #: grub-core/fs/jfs.c:507 msgid "invalid directory slot index" msgstr "" #: grub-core/fs/ntfscomp.c:356 msgid "compression buffer size overflow" msgstr "" #: grub-core/fs/squash4.c:467 msgid "symlink name length overflow" msgstr "" #: grub-core/fs/squash4.c:601 grub-core/fs/zfs/zfs.c:4353 #: grub-core/net/dns.c:234 msgid "name length overflow" msgstr "" #: grub-core/fs/tar.c:106 msgid "name size overflow" msgstr "" #: grub-core/fs/tar.c:131 msgid "link size overflow" msgstr "" #: grub-core/fs/tar.c:166 msgid "long name size overflow" msgstr "" #: grub-core/fs/xfs.c:817 msgid "directory data size overflow" msgstr "" #: grub-core/fs/zfs/zfs.c:499 msgid "checksum verification failed" msgstr "" #: grub-core/fs/zfs/zfs.c:1528 msgid "couldn't find a necessary member device of multi-device filesystem" msgstr "" #: grub-core/fs/zfs/zfs.c:3010 grub-core/fs/zfs/zfs.c:3093 msgid "path buffer size overflow" msgstr "" #: grub-core/fs/zfs/zfs.c:3720 msgid "elemsize overflow" msgstr "" #: grub-core/fs/zfs/zfscrypt.c:297 msgid "no decryption key available" msgstr "" #: grub-core/fs/zfs/zfscrypt.c:309 msgid "MAC verification failed" msgstr "" #: grub-core/fs/zfs/zfscrypt.c:418 msgid "Assume input is raw." msgstr "" #: grub-core/fs/zfs/zfscrypt.c:419 msgid "Assume input is hex." msgstr "" #: grub-core/fs/zfs/zfscrypt.c:420 msgid "Assume input is passphrase." msgstr "" #: grub-core/fs/zfs/zfscrypt.c:442 util/grub-fstest.c:564 util/grub-mount.c:503 msgid "Enter ZFS password: " msgstr "" #: grub-core/fs/zfs/zfscrypt.c:481 msgid "[-h|-p|-r] [FILE]" msgstr "" #: grub-core/fs/zfs/zfscrypt.c:482 msgid "Import ZFS wrapping key stored in FILE." msgstr "" #: grub-core/fs/zfs/zfsinfo.c:51 msgid "Virtual device is removed" msgstr "" #: grub-core/fs/zfs/zfsinfo.c:57 msgid "Virtual device is faulted" msgstr "" #: grub-core/fs/zfs/zfsinfo.c:63 msgid "Virtual device is offline" msgstr "" #. TRANSLATORS: degraded doesn't mean broken but that some of #. component are missing but virtual device as whole is still usable. #: grub-core/fs/zfs/zfsinfo.c:70 msgid "Virtual device is degraded" msgstr "" #: grub-core/fs/zfs/zfsinfo.c:73 msgid "Virtual device is online" msgstr "" #: grub-core/fs/zfs/zfsinfo.c:89 msgid "Incorrect virtual device: no type available" msgstr "" #. TRANSLATORS: The virtual devices form a tree (in graph-theoretical #. sense). The nodes like mirror or raidz have children: member devices. #. The "real" devices which actually store data are called "leafs" #. (again borrowed from graph theory) and can be either disks #. (or partitions) or files. #: grub-core/fs/zfs/zfsinfo.c:105 msgid "Leaf virtual device (file or disk)" msgstr "" #: grub-core/fs/zfs/zfsinfo.c:113 msgid "Bootpath: unavailable\n" msgstr "" #: grub-core/fs/zfs/zfsinfo.c:115 #, c-format msgid "Bootpath: %s\n" msgstr "" #: grub-core/fs/zfs/zfsinfo.c:120 msgid "Path: unavailable" msgstr "" #: grub-core/fs/zfs/zfsinfo.c:122 #, c-format msgid "Path: %s\n" msgstr "" #: grub-core/fs/zfs/zfsinfo.c:127 msgid "Devid: unavailable" msgstr "" #: grub-core/fs/zfs/zfsinfo.c:129 #, c-format msgid "Devid: %s\n" msgstr "" #: grub-core/fs/zfs/zfsinfo.c:148 msgid "This VDEV is a mirror" msgstr "" #: grub-core/fs/zfs/zfsinfo.c:153 #, c-format msgid "This VDEV is a RAIDZ%llu\n" msgstr "" #: grub-core/fs/zfs/zfsinfo.c:158 msgid "Incorrect VDEV" msgstr "" #: grub-core/fs/zfs/zfsinfo.c:161 #, c-format msgid "VDEV with %d children\n" msgstr "" #. TRANSLATORS: it's the element carying the number %d, not #. total element number. And the number itself is fine, #. only the element isn't. #. #: grub-core/fs/zfs/zfsinfo.c:177 #, c-format msgid "VDEV element number %d isn't correct\n" msgstr "" #. TRANSLATORS: it's the element carying the number %d, not #. total element number. This is used in enumeration #. "Element number 1", "Element number 2", ... #: grub-core/fs/zfs/zfsinfo.c:184 #, c-format msgid "VDEV element number %d:\n" msgstr "" #: grub-core/fs/zfs/zfsinfo.c:193 #, c-format msgid "Unknown virtual device type: %s\n" msgstr "" #. TRANSLATORS: Here we speak about ZFS pools it's semi-marketing, #. semi-technical term by Sun/Oracle and should be translated in sync with #. other ZFS-related software and documentation. #: grub-core/fs/zfs/zfsinfo.c:254 msgid "Pool state: active" msgstr "" #: grub-core/fs/zfs/zfsinfo.c:255 msgid "Pool state: exported" msgstr "" #: grub-core/fs/zfs/zfsinfo.c:256 msgid "Pool state: destroyed" msgstr "" #: grub-core/fs/zfs/zfsinfo.c:257 msgid "Pool state: reserved for hot spare" msgstr "" #: grub-core/fs/zfs/zfsinfo.c:258 msgid "Pool state: level 2 ARC device" msgstr "" #: grub-core/fs/zfs/zfsinfo.c:259 msgid "Pool state: uninitialized" msgstr "" #: grub-core/fs/zfs/zfsinfo.c:260 msgid "Pool state: unavailable" msgstr "" #: grub-core/fs/zfs/zfsinfo.c:261 msgid "Pool state: potentially active" msgstr "" #: grub-core/fs/zfs/zfsinfo.c:306 msgid "Pool name: unavailable" msgstr "" #: grub-core/fs/zfs/zfsinfo.c:308 #, c-format msgid "Pool name: %s\n" msgstr "" #: grub-core/fs/zfs/zfsinfo.c:313 msgid "Pool GUID: unavailable" msgstr "" #: grub-core/fs/zfs/zfsinfo.c:315 #, c-format msgid "Pool GUID: %016llx\n" msgstr "" #: grub-core/fs/zfs/zfsinfo.c:320 msgid "Unable to retrieve pool state" msgstr "" #: grub-core/fs/zfs/zfsinfo.c:322 msgid "Unrecognized pool state" msgstr "" #. TRANSLATORS: There are undetermined number of virtual devices #. in a device tree, not just one. #. #: grub-core/fs/zfs/zfsinfo.c:332 msgid "No virtual device tree available" msgstr "" #: grub-core/fs/zfs/zfsinfo.c:434 msgid "Print ZFS info about DEVICE." msgstr "" #: grub-core/fs/zfs/zfsinfo.c:436 msgid "FILESYSTEM [VARIABLE]" msgstr "" #: grub-core/fs/zfs/zfsinfo.c:437 msgid "Print ZFS-BOOTFSOBJ or store it into VARIABLE" msgstr "" #. TRANSLATORS: at this position GRUB waits for the user to do an action #. in remote debugger, namely to tell it to establish connection. #: grub-core/gdb/gdb.c:48 msgid "Now connect the remote debugger, please." msgstr "" #. TRANSLATORS: GDB stub is a small part of #. GDB functionality running on local host #. which allows remote debugger to #. connect to it. #. #: grub-core/gdb/gdb.c:86 msgid "Start GDB stub on given port" msgstr "" #. TRANSLATORS: this refers to triggering #. a breakpoint so that the user will land #. into GDB. #. #: grub-core/gdb/gdb.c:93 msgid "Break into GDB" msgstr "" #: grub-core/gdb/gdb.c:95 msgid "Stop GDB stub" msgstr "" #: grub-core/gettext/gettext.c:86 msgid "premature end of file" msgstr "" #. TRANSLATORS: It refers to passing the string through gettext. #. So it's "translate" in the same meaning as in what you're #. doing now. #. #: grub-core/gettext/gettext.c:530 msgid "Translates the string with the current settings." msgstr "" #: grub-core/gfxmenu/gui_label.c:186 grub-core/normal/menu_text.c:186 msgid "" "Press enter to boot the selected OS, `e' to edit the commands before booting " "or `c' for a command-line. ESC to return previous menu." msgstr "" #: grub-core/gfxmenu/gui_label.c:190 grub-core/normal/menu_text.c:194 msgid "" "Press enter to boot the selected OS, `e' to edit the commands before booting " "or `c' for a command-line." msgstr "" #: grub-core/gfxmenu/gui_label.c:194 msgid "enter: boot, `e': options, `c': cmd-line" msgstr "" #: grub-core/gfxmenu/gui_progress_bar.c:339 grub-core/normal/menu_text.c:449 #, c-format msgid "The highlighted entry will be executed automatically in %ds." msgstr "" #. TRANSLATORS: 's' stands for seconds. #. It's a standalone timeout notification. #. Please use the short form in your language. #: grub-core/gfxmenu/gui_progress_bar.c:344 #, c-format msgid "%ds remaining." msgstr "" #. TRANSLATORS: 's' stands for seconds. #. It's a standalone timeout notification. #. Please use the shortest form available in you language. #: grub-core/gfxmenu/gui_progress_bar.c:349 grub-core/normal/menu_text.c:447 #: grub-core/normal/menu_text.c:465 #, c-format msgid "%ds" msgstr "" #: grub-core/gfxmenu/view.c:103 msgid "GRUB Boot Menu" msgstr "" #: script/parser.y:114 grub-core/script/parser.y:114 msgid "Incorrect command" msgstr "" #: script/yylex.l:44 grub-core/script/yylex.l:44 #, c-format msgid "fatal error: %s\n" msgstr "" #: grub-core/hello/hello.c:36 msgid "Hello World" msgstr "" #: grub-core/hello/hello.c:45 msgid "Say `Hello World'." msgstr "" #: grub-core/io/gzio.c:426 grub-core/kern/file.c:225 msgid "attempt to seek outside of the file" msgstr "" #. TRANSLATORS: It's about given file having some strange format, not #. complete lack of gzip support. #: grub-core/io/gzio.c:1282 grub-core/io/gzio.c:1291 grub-core/io/gzio.c:1298 msgid "unsupported gzip format" msgstr "" #: grub-core/io/lzopio.c:507 msgid "lzop file corrupted" msgstr "" #: grub-core/io/xzio.c:278 msgid "xz file corrupted or unsupported block options" msgstr "" #: grub-core/kern/arm/dl.c:277 grub-core/kern/arm64/dl.c:44 #: grub-core/kern/i386/dl.c:36 grub-core/kern/ia64/dl.c:41 #: grub-core/kern/loongarch64/dl.c:37 grub-core/kern/mips/dl.c:48 #: grub-core/kern/powerpc/dl.c:36 grub-core/kern/riscv/dl.c:47 #: grub-core/kern/sparc64/dl.c:36 grub-core/kern/x86_64/dl.c:36 #: grub-core/loader/i386/bsd.c:1457 grub-core/loader/i386/bsdXX.c:52 #: grub-core/loader/ia64/efi/linux.c:341 grub-core/loader/mips/linux.c:298 #: grub-core/loader/multiboot.c:232 grub-core/loader/multiboot_elfxx.c:86 #: grub-core/loader/powerpc/ieee1275/linux.c:305 #: grub-core/loader/sparc64/ieee1275/linux.c:331 msgid "invalid arch-dependent ELF magic" msgstr "" #: grub-core/kern/buffer.c:74 msgid "requested buffer size is too large" msgstr "" #: grub-core/kern/buffer.c:115 msgid "new read is position beyond the end of the written data" msgstr "" #: grub-core/kern/corecmd.c:181 msgid "[ENVVAR=VALUE]" msgstr "" #: grub-core/kern/corecmd.c:182 msgid "Set an environment variable." msgstr "" #: grub-core/kern/corecmd.c:186 msgid "ENVVAR" msgstr "" #: grub-core/kern/corecmd.c:187 msgid "Remove an environment variable." msgstr "" #: grub-core/kern/corecmd.c:189 msgid "[ARG]" msgstr "" #: grub-core/kern/corecmd.c:189 msgid "List devices or files." msgstr "" #: grub-core/kern/corecmd.c:191 msgid "Insert a module." msgstr "" #: grub-core/kern/disk.c:240 grub-core/net/net.c:1580 #, c-format msgid "disk `%s' not found" msgstr "" #: grub-core/kern/disk_common.c:27 msgid "attempt to read or write outside of partition" msgstr "" #: grub-core/kern/dl.c:221 grub-core/kern/elf.c:61 grub-core/kern/elf.c:79 #: grub-core/loader/i386/bsdXX.c:49 grub-core/loader/ia64/efi/linux.c:335 #: grub-core/loader/multiboot_elfxx.c:82 msgid "invalid arch-independent ELF magic" msgstr "" #: grub-core/kern/efi/debug.c:37 msgid "Print infomation useful for GDB debugging" msgstr "" #: grub-core/kern/efi/mm.c:137 #, c-format msgid "invalid memory address (0x%s > 0x%s)" msgstr "" #: grub-core/kern/efi/sb.c:175 msgid "prohibited by secure boot policy" msgstr "" #: grub-core/kern/efi/sb.c:198 msgid "bad shim loader signature" msgstr "" #: grub-core/kern/efi/sb.c:210 msgid "bad shim lock signature" msgstr "" #: grub-core/kern/efi/sb.c:214 msgid "shim protocols not found" msgstr "" #: grub-core/kern/elfXX.c:215 msgid "NULL pointer passed for shnum" msgstr "" #: grub-core/kern/elfXX.c:221 grub-core/kern/elfXX.c:255 #: grub-core/kern/elfXX.c:288 msgid "NULL pointer passed for elf header" msgstr "" #: grub-core/kern/elfXX.c:227 grub-core/kern/elfXX.c:261 #: grub-core/kern/elfXX.c:294 msgid "invalid section header table offset in e_shoff" msgstr "" #: grub-core/kern/elfXX.c:232 msgid "invalid number of section header table entries in sh_size: %" msgstr "" #: grub-core/kern/elfXX.c:237 msgid "invalid number of section header table entries in e_shnum: %" msgstr "" #: grub-core/kern/elfXX.c:249 msgid "NULL pointer passed for shstrndx" msgstr "" #: grub-core/kern/elfXX.c:266 #, c-format msgid "invalid section header table index in sh_link: %d" msgstr "" #: grub-core/kern/elfXX.c:271 #, c-format msgid "invalid section header table index in e_shstrndx: %d" msgstr "" #: grub-core/kern/elfXX.c:282 msgid "NULL pointer passed for phnum" msgstr "" #: grub-core/kern/elfXX.c:299 #, c-format msgid "invalid number of program header table entries in sh_info: %d" msgstr "" #: grub-core/kern/elfXX.c:304 #, c-format msgid "invalid number of program header table entries in e_phnum: %d" msgstr "" #. TRANSLATORS: it refers to the lack of free slots. #: grub-core/kern/emu/hostdisk.c:208 grub-core/kern/emu/hostdisk.c:466 msgid "device count exceeds limit" msgstr "" #: grub-core/kern/emu/hostdisk.c:342 util/editenv.c:66 util/grub-editenv.c:203 #: util/grub-fstest.c:192 util/grub-mkfont.c:841 util/misc.c:114 #: util/misc.c:129 util/setup.c:791 #, c-format msgid "cannot write to `%s': %s" msgstr "" #. TRANSLATORS: Only one entry is ignored. However the suggestion #. is to correct/delete the whole file. #. device.map is a file indicating which #. devices are available at boot time. Fedora populated it with #. entries like (hd0,1) /dev/sda1 which would mean that every #. partition is a separate disk for BIOS. Such entries were #. inactive in GRUB due to its bug which is now gone. Without #. this additional check these entries would be harmful now. #. #: grub-core/kern/emu/hostdisk.c:503 #, c-format msgid "" "the device.map entry `%s' is invalid. Ignoring it. Please correct or delete " "your device.map" msgstr "" #. TRANSLATORS: device.map is a filename. Not to be translated. #. device.map specifies disk correspondance overrides. Previously #. one could create any kind of device name with this. Due to #. some problems we decided to limit it to just a handful #. possibilities. #: grub-core/kern/emu/hostdisk.c:555 #, c-format msgid "" "the drive name `%s' in device.map is incorrect. Using %s instead. Please use " "the form [hfc]d[0-9]* (E.g. `hd0' or `cd')" msgstr "" #: grub-core/kern/emu/hostfs.c:76 grub-core/kern/emu/hostfs.c:109 #, c-format msgid "can't open `%s': %s" msgstr "" #: grub-core/kern/emu/main.c:99 util/grub-fstest.c:527 util/grub-mount.c:472 msgid "DEVICE_NAME" msgstr "" #: grub-core/kern/emu/main.c:99 grub-core/loader/i386/bsd.c:137 #: grub-core/loader/i386/bsd.c:170 util/grub-fstest.c:527 util/grub-mount.c:472 msgid "Set root device." msgstr "" #. TRANSLATORS: There are many devices in device map. #: grub-core/kern/emu/main.c:102 util/grub-probe.c:733 util/grub-setup.c:85 #, c-format msgid "use FILE as the device map [default=%s]" msgstr "" #. TRANSLATORS: There are many devices in device map. #: grub-core/kern/emu/main.c:105 msgid "use FILE as memdisk" msgstr "" #: grub-core/kern/emu/main.c:107 util/grub-setup.c:83 #, c-format msgid "use GRUB files in the directory DIR [default=%s]" msgstr "" #: grub-core/kern/emu/main.c:108 include/grub/util/install.h:73 #: util/grub-editenv.c:58 util/grub-fstest.c:536 util/grub-glue-efi.c:58 #: util/grub-macbless.c:104 util/grub-mkfont.c:1008 util/grub-mkimage.c:87 #: util/grub-mklayout.c:56 util/grub-mount.c:478 util/grub-render-label.c:74 #: util/grub-script-check.c:52 util/grub-setup.c:90 util/grub-syslinux2cfg.c:78 msgid "print verbose messages." msgstr "" #: grub-core/kern/emu/main.c:109 msgid "SECS" msgstr "" #: grub-core/kern/emu/main.c:109 msgid "wait until a debugger will attach" msgstr "" #: grub-core/kern/emu/main.c:110 msgid "" "use kexec to boot Linux kernels via systemctl (pass twice to enable " "dangerous fallback to non-systemctl)." msgstr "" #: grub-core/kern/emu/main.c:111 msgid "DEV" msgstr "" #: grub-core/kern/emu/main.c:111 msgid "set TPM device." msgstr "" #: grub-core/kern/emu/main.c:180 util/grub-macbless.c:143 #: util/grub-mkrelpath.c:61 util/grub-probe.c:875 util/grub-script-check.c:75 #: util/grub-setup.c:203 #, c-format msgid "Unknown extra argument `%s'." msgstr "" #: grub-core/kern/emu/main.c:194 msgid "GRUB emulator." msgstr "" #: grub-core/kern/emu/main.c:222 util/grub-editenv.c:268 #: util/grub-glue-efi.c:110 util/grub-macbless.c:173 util/grub-mkfont.c:1223 #: util/grub-mkimage.c:287 util/grub-mklayout.c:494 #: util/grub-mkpasswd-pbkdf2.c:132 util/grub-mkrelpath.c:96 #: util/grub-probe.c:864 util/grub-render-label.c:152 #: util/grub-script-check.c:160 util/grub-setup.c:262 #: util/grub-syslinux2cfg.c:163 msgid "Error in parsing command line arguments\n" msgstr "" #. TRANSLATORS: In this case GRUB tells user what he has to do. #: grub-core/kern/emu/main.c:257 #, c-format msgid "Run `gdb %s %d', and set ARGS.HOLD to zero.\n" msgstr "" #: grub-core/kern/emu/misc.c:53 #, c-format msgid "%s: warning:" msgstr "" #: grub-core/kern/emu/misc.c:69 #, c-format msgid "%s: info:" msgstr "" #: grub-core/kern/emu/misc.c:84 util/grub-fstest.c:578 util/grub-fstest.c:587 #: util/grub-mount.c:517 util/grub-mount.c:525 #, c-format msgid "%s: error:" msgstr "" #: grub-core/kern/emu/misc.c:196 #, c-format msgid "file `%s' is too big" msgstr "" #: grub-core/kern/emu/misc.c:246 #, c-format msgid "cannot open TPM device '%s': %s" msgstr "" #: grub-core/kern/emu/misc.c:261 #, c-format msgid "cannot close TPM device: %s" msgstr "" #: grub-core/kern/fs.c:122 msgid "unknown filesystem" msgstr "" #: grub-core/kern/ieee1275/init.c:269 #, c-format msgid "Error: ibm,kernel-dump has an unexpected format version '%u'\n" msgstr "" #: grub-core/kern/ieee1275/init.c:276 #, c-format msgid "Error: Too many kernel dump sections: %d\n" msgstr "" #: grub-core/kern/ieee1275/init.c:289 msgid "Error: 'kds' address beyond last available section\n" msgstr "" #: grub-core/kern/mips/arc/init.c:273 grub-core/kern/mips/loongson/init.c:301 msgid "Shutdown failed" msgstr "" #: grub-core/kern/mips/arc/init.c:285 msgid "Exit failed" msgstr "" #: grub-core/kern/misc.c:1347 msgid "string too long" msgstr "" #: grub-core/kern/partition.c:54 grub-core/partmap/bsdlabel.c:108 #, c-format msgid "Discarding improperly nested partition (%s,%s,%s%d)" msgstr "" #: grub-core/kern/partition.c:139 msgid "invalid partition number" msgstr "" #: grub-core/kern/rescue_parser.c:79 util/grub-editenv.c:298 #, c-format msgid "Unknown command `%s'.\n" msgstr "" #: grub-core/kern/verifiers.c:120 #, c-format msgid "verification requested but nobody cares: %s" msgstr "" #: grub-core/kern/verifiers.c:140 msgid "big file signature isn't implemented yet" msgstr "" #: grub-core/lib/arg.c:32 msgid "Display this help and exit." msgstr "" #: grub-core/lib/arg.c:34 msgid "Display the usage of this command and exit." msgstr "" #: grub-core/lib/arg.c:310 grub-core/lib/arg.c:382 #, c-format msgid "missing mandatory option for `%s'" msgstr "" #: grub-core/lib/arg.c:404 #, c-format msgid "the argument `%s' requires an integer" msgstr "" #: grub-core/lib/arg.c:427 #, c-format msgid "" "a value was assigned to the argument `%s' while it doesn't require an " "argument" msgstr "" #: grub-core/lib/backtrace.c:64 msgid "Print backtrace." msgstr "" #: grub-core/lib/datetime.c:32 msgid "Sunday" msgstr "" #: grub-core/lib/datetime.c:33 msgid "Monday" msgstr "" #: grub-core/lib/datetime.c:34 msgid "Tuesday" msgstr "" #: grub-core/lib/datetime.c:35 msgid "Wednesday" msgstr "" #: grub-core/lib/datetime.c:36 msgid "Thursday" msgstr "" #: grub-core/lib/datetime.c:37 msgid "Friday" msgstr "" #: grub-core/lib/datetime.c:38 msgid "Saturday" msgstr "" #: grub-core/lib/i386/halt.c:77 msgid "GRUB doesn't know how to halt this machine yet!" msgstr "" #: grub-core/lib/json/json.c:274 msgid "output parameters are not set" msgstr "" #: grub-core/lib/json/json.c:287 msgid "expected escaped character" msgstr "" #: grub-core/lib/json/json.c:333 msgid "unicode sequence too short" msgstr "" #: grub-core/lib/json/json.c:350 #, c-format msgid "unicode sequence with invalid character '%c'" msgstr "" #: grub-core/lib/json/json.c:366 #, c-format msgid "unrecognized escaped character '%c'" msgstr "" #: grub-core/lib/legacy_parse.c:75 msgid "Default server is ${net_default_server}" msgstr "" #: grub-core/lib/legacy_parse.c:844 grub-core/video/colors.c:296 #: grub-core/video/colors.c:305 grub-core/video/colors.c:311 #: grub-core/video/colors.c:327 util/render-label.c:84 util/render-label.c:98 #, c-format msgid "invalid color specification `%s'" msgstr "" #: grub-core/lib/mips/arc/reboot.c:32 grub-core/lib/mips/loongson/reboot.c:61 msgid "Reboot failed" msgstr "" #: grub-core/lib/random.c:113 msgid "[LENGTH]" msgstr "" #: grub-core/lib/random.c:114 msgid "Hexdump random data." msgstr "" #: grub-core/loader/arm/linux.c:243 msgid "device tree must be supplied (see `devicetree' command)" msgstr "" #: grub-core/loader/arm/linux.c:335 msgid "invalid zImage" msgstr "" #: grub-core/loader/arm/linux.c:451 grub-core/loader/efi/fdt.c:161 msgid "invalid device tree" msgstr "" #: grub-core/loader/arm/linux.c:494 grub-core/loader/efi/linux.c:594 #: grub-core/loader/emu/linux.c:172 grub-core/loader/i386/linux.c:1158 #: grub-core/loader/i386/pc/linux.c:483 grub-core/loader/i386/xen.c:968 #: grub-core/loader/i386/xen.c:970 grub-core/loader/ia64/efi/linux.c:592 #: grub-core/loader/mips/linux.c:498 #: grub-core/loader/powerpc/ieee1275/linux.c:406 #: grub-core/loader/sparc64/ieee1275/linux.c:511 msgid "Load Linux." msgstr "" #: grub-core/loader/arm/linux.c:496 grub-core/loader/efi/linux.c:596 #: grub-core/loader/emu/linux.c:174 grub-core/loader/i386/linux.c:1160 #: grub-core/loader/i386/pc/linux.c:486 grub-core/loader/i386/xen.c:972 #: grub-core/loader/ia64/efi/linux.c:595 grub-core/loader/mips/linux.c:500 #: grub-core/loader/powerpc/ieee1275/linux.c:408 #: grub-core/loader/sparc64/ieee1275/linux.c:513 msgid "Load initrd." msgstr "" #. TRANSLATORS: DTB stands for device tree blob. #: grub-core/loader/arm/linux.c:499 grub-core/loader/efi/fdt.c:221 msgid "Load DTB file." msgstr "" #: grub-core/loader/arm64/xen_boot.c:142 msgid "failed to get FDT" msgstr "" #: grub-core/loader/arm64/xen_boot.c:408 msgid "you need to load the Xen Hypervisor first" msgstr "" #: grub-core/loader/arm64/xen_boot.c:504 msgid "Load a xen hypervisor." msgstr "" #: grub-core/loader/arm64/xen_boot.c:507 msgid "Load a xen module." msgstr "" #: grub-core/loader/efi/appleloader.c:231 msgid "[OPTS]" msgstr "" #. TRANSLATORS: This command is used on EFI to #. switch to BIOS mode and boot the OS requiring #. BIOS. #: grub-core/loader/efi/appleloader.c:235 msgid "Boot BIOS-based system." msgstr "" #: grub-core/loader/efi/chainloader.c:435 #: grub-core/loader/i386/pc/chainloader.c:303 msgid "Load another boot loader." msgstr "" #: grub-core/loader/efi/fdt.c:43 msgid "Get property." msgstr "" #: grub-core/loader/efi/fdt.c:43 msgid "prop" msgstr "" #: grub-core/loader/efi/fdt.c:192 msgid "No device tree found" msgstr "" #: grub-core/loader/efi/fdt.c:199 msgid "failed to retrieve the prop field" msgstr "" #: grub-core/loader/efi/fdt.c:216 msgid "[-p] [--set variable]" msgstr "" #: grub-core/loader/efi/fdt.c:217 msgid "Retrieve device tree information." msgstr "" #: grub-core/loader/efi/linux.c:100 msgid "" "plain image kernel not supported - rebuild with CONFIG_(U)EFI_STUB enabled" msgstr "" #: grub-core/loader/efi/linux.c:427 msgid "failed to install protocols" msgstr "" #: grub-core/loader/emu/linux.c:65 msgid "error trying to perform kexec load operation" msgstr "" #: grub-core/loader/emu/linux.c:71 #, c-format msgid "use '%s %s' to force a system restart" msgstr "" #: grub-core/loader/emu/linux.c:82 #, c-format msgid "error trying to perform 'systemctl kexec': %d" msgstr "" #: grub-core/loader/emu/linux.c:93 #, c-format msgid "error trying to directly perform 'kexec -ex': %d" msgstr "" #: grub-core/loader/emu/linux.c:123 #, c-format msgid "cannot find kernel file %s" msgstr "" #: grub-core/loader/emu/linux.c:156 #, c-format msgid "Cannot find initrd file %s" msgstr "" #: grub-core/loader/i386/bsd.c:104 msgid "Display output on all consoles." msgstr "" #: grub-core/loader/i386/bsd.c:105 grub-core/loader/i386/bsd.c:139 #: grub-core/loader/i386/bsd.c:172 msgid "Use serial console." msgstr "" #: grub-core/loader/i386/bsd.c:106 grub-core/loader/i386/bsd.c:132 #: grub-core/loader/i386/bsd.c:160 msgid "Ask for file name to reboot from." msgstr "" #: grub-core/loader/i386/bsd.c:107 msgid "Use CD-ROM as root." msgstr "" #: grub-core/loader/i386/bsd.c:108 msgid "Invoke user configuration routing." msgstr "" #: grub-core/loader/i386/bsd.c:109 grub-core/loader/i386/bsd.c:136 #: grub-core/loader/i386/bsd.c:163 msgid "Enter in KDB on boot." msgstr "" #: grub-core/loader/i386/bsd.c:110 msgid "Use GDB remote debugger instead of DDB." msgstr "" #: grub-core/loader/i386/bsd.c:111 msgid "Disable all boot output." msgstr "" #: grub-core/loader/i386/bsd.c:113 msgid "Wait for keypress after every line of output." msgstr "" #: grub-core/loader/i386/bsd.c:115 msgid "Use compiled-in root device." msgstr "" #: grub-core/loader/i386/bsd.c:116 grub-core/loader/i386/bsd.c:135 #: grub-core/loader/i386/bsd.c:166 msgid "Boot into single mode." msgstr "" #: grub-core/loader/i386/bsd.c:117 grub-core/loader/i386/bsd.c:167 msgid "Boot with verbose messages." msgstr "" #: grub-core/loader/i386/bsd.c:133 grub-core/loader/i386/bsd.c:161 msgid "Don't reboot, just halt." msgstr "" #: grub-core/loader/i386/bsd.c:134 grub-core/loader/i386/bsd.c:162 msgid "Change configured devices." msgstr "" #. TRANSLATORS: "com" is static and not to be translated. It refers to #. serial ports e.g. com1. #. #: grub-core/loader/i386/bsd.c:143 msgid "comUNIT[,SPEED]" msgstr "" #: grub-core/loader/i386/bsd.c:158 msgid "Disable SMP." msgstr "" #: grub-core/loader/i386/bsd.c:159 msgid "Disable ACPI." msgstr "" #: grub-core/loader/i386/bsd.c:165 msgid "Don't display boot diagnostic messages." msgstr "" #: grub-core/loader/i386/bsd.c:168 msgid "Boot with debug messages." msgstr "" #: grub-core/loader/i386/bsd.c:169 msgid "Suppress normal output (warnings remain)." msgstr "" #. TRANSLATORS: "com" is static and not to be translated. It refers to #. serial ports e.g. com1. #. #: grub-core/loader/i386/bsd.c:176 msgid "[ADDR|comUNIT][,SPEED]" msgstr "" #: grub-core/loader/i386/bsd.c:490 grub-core/loader/i386/bsd.c:556 msgid "name" msgstr "" #: grub-core/loader/i386/bsd.c:490 grub-core/loader/i386/bsd.c:556 msgid "addr" msgstr "" #: grub-core/loader/i386/bsd.c:491 grub-core/loader/i386/bsd.c:557 msgid "size" msgstr "" #: grub-core/loader/i386/bsd.c:1153 grub-core/loader/i386/linux.c:467 #: grub-core/loader/i386/xnu.c:1025 msgid "Booting in blind mode" msgstr "" #: grub-core/loader/i386/bsd.c:2148 msgid "Load kernel of FreeBSD." msgstr "" #: grub-core/loader/i386/bsd.c:2151 msgid "Load kernel of OpenBSD." msgstr "" #: grub-core/loader/i386/bsd.c:2154 msgid "Load kernel of NetBSD." msgstr "" #: grub-core/loader/i386/bsd.c:2158 msgid "Load FreeBSD env." msgstr "" #: grub-core/loader/i386/bsd.c:2161 msgid "Load FreeBSD kernel module." msgstr "" #: grub-core/loader/i386/bsd.c:2164 msgid "Load NetBSD kernel module." msgstr "" #: grub-core/loader/i386/bsd.c:2167 msgid "Load NetBSD kernel module (ELF)." msgstr "" #: grub-core/loader/i386/bsd.c:2170 msgid "Load FreeBSD kernel module (ELF)." msgstr "" #. TRANSLATORS: ramdisk isn't identifier, #. it can be translated. #: grub-core/loader/i386/bsd.c:2176 msgid "Load kOpenBSD ramdisk." msgstr "" #. TRANSLATORS: "payload" is a term used #. by coreboot and must be translated in #. sync with coreboot. If unsure, #. let it untranslated. #: grub-core/loader/i386/coreboot/chainloader.c:510 msgid "Load another coreboot payload" msgstr "" #: grub-core/loader/i386/linux.c:895 msgid "Legacy `ask' parameter no longer supported." msgstr "" #: grub-core/loader/i386/linux.c:911 grub-core/loader/i386/linux.c:921 #: grub-core/loader/i386/linux.c:951 #, c-format msgid "%s is deprecated. Use set gfxpayload=%s before linux command instead.\n" msgstr "" #. TRANSLATORS: "x" has to be entered in, like an identifier, #. so please don't use better Unicode codepoints. #: grub-core/loader/i386/linux.c:934 #, c-format msgid "" "%s is deprecated. VGA mode %d isn't recognized. Use set " "gfxpayload=WIDTHxHEIGHT[xDEPTH] before linux command instead.\n" msgstr "" #: grub-core/loader/i386/linux.c:1105 msgid "the size of initrd is bigger than addr_max" msgstr "" #: grub-core/loader/i386/pc/chainloader.c:302 msgid "[--force|--bpb] FILE" msgstr "" #: grub-core/loader/i386/pc/freedos.c:148 util/setup.c:297 #, c-format msgid "the size of `%s' is too large" msgstr "" #: grub-core/loader/i386/pc/freedos.c:183 msgid "Load FreeDOS kernel.sys." msgstr "" #: grub-core/loader/i386/pc/ntldr.c:155 msgid "Load NTLDR or BootMGR." msgstr "" #. TRANSLATORS: it's about guessing which GRUB disk #. is which Plan9 disk. If your language has no #. word "mapping" you can use another word which #. means that the GRUBDEVICE and PLAN9DEVICE are #. actually the same device, just named differently #. in OS and GRUB. #: grub-core/loader/i386/pc/plan9.c:59 msgid "Override guessed mapping of Plan9 devices." msgstr "" #: grub-core/loader/i386/pc/plan9.c:60 msgid "GRUBDEVICE=PLAN9DEVICE" msgstr "" #: grub-core/loader/i386/pc/plan9.c:599 msgid "KERNEL ARGS" msgstr "" #: grub-core/loader/i386/pc/plan9.c:599 msgid "Load Plan9 kernel." msgstr "" #: grub-core/loader/i386/pc/pxechainloader.c:161 msgid "Load a PXE image." msgstr "" #: grub-core/loader/i386/pc/truecrypt.c:226 msgid "Load Truecrypt ISO." msgstr "" #: grub-core/loader/i386/xen.c:788 grub-core/loader/i386/xen.c:871 msgid "initrd already loaded" msgstr "" #: grub-core/loader/i386/xen.c:974 msgid "Load module." msgstr "" #: grub-core/loader/i386/xnu.c:998 msgid "Press any key to launch xnu" msgstr "" #. TRANSLATORS: `device-properties' #. is a variable name, #. not a program. #: grub-core/loader/i386/xnu.c:1154 msgid "Load `device-properties' dump." msgstr "" #: grub-core/loader/ia64/efi/linux.c:124 msgid "Could not locate FPSWA driver" msgstr "" #: grub-core/loader/ia64/efi/linux.c:132 msgid "FPSWA protocol wasn't able to find the interface" msgstr "" #: grub-core/loader/ia64/efi/linux.c:581 msgid "No FPSWA found" msgstr "" #: grub-core/loader/ia64/efi/linux.c:583 #, c-format msgid "FPSWA revision: %x\n" msgstr "" #: grub-core/loader/ia64/efi/linux.c:592 msgid "FILE [ARGS...]" msgstr "" #: grub-core/loader/ia64/efi/linux.c:598 msgid "Display FPSWA version." msgstr "" #: grub-core/loader/multiboot.c:248 msgid "WARNING: no console will be available to OS" msgstr "" #: grub-core/loader/multiboot.c:444 msgid "Load a multiboot 2 kernel." msgstr "" #: grub-core/loader/multiboot.c:447 msgid "Load a multiboot 2 module." msgstr "" #: grub-core/loader/multiboot.c:450 msgid "Load a multiboot kernel." msgstr "" #: grub-core/loader/multiboot.c:453 msgid "Load a multiboot module." msgstr "" #: grub-core/loader/multiboot_elfxx.c:208 msgid "memory being set is larger than allocated memory" msgstr "" #: grub-core/loader/multiboot_elfxx.c:254 msgid "ELF section header region is larger than the file size" msgstr "" #: grub-core/loader/xnu.c:674 msgid "missing p-list filename" msgstr "" #: grub-core/loader/xnu.c:1436 grub-core/term/gfxterm_background.c:45 msgid "Background image mode." msgstr "" #. TRANSLATORS: This refers to background image mode (stretched or #. in left-top corner). Note that GRUB will accept only original #. keywords stretch and normal, not the translated ones. #. So please put both in translation #. e.g. stretch(=%STRETCH%)|normal(=%NORMAL%). #. The percents mark the translated version. Since many people #. may not know the word stretch or normal I recommend #. putting the translation either here or in "Background image mode." #. string. #: grub-core/loader/xnu.c:1436 grub-core/term/gfxterm_background.c:55 msgid "stretch|normal" msgstr "" #: grub-core/loader/xnu.c:1502 msgid "Load XNU image." msgstr "" #: grub-core/loader/xnu.c:1504 msgid "Load 64-bit XNU image." msgstr "" #: grub-core/loader/xnu.c:1506 msgid "Load XNU extension package." msgstr "" #: grub-core/loader/xnu.c:1508 msgid "Load XNU extension." msgstr "" #. TRANSLATORS: OSBundleRequired is #. a variable name in xnu extensions #. manifests. It behaves mostly like #. GNU/Linux runlevels. #. #: grub-core/loader/xnu.c:1516 msgid "DIRECTORY [OSBundleRequired]" msgstr "" #. TRANSLATORS: There are many extensions #. in extension directory. #. #: grub-core/loader/xnu.c:1521 msgid "Load XNU extension directory." msgstr "" #. TRANSLATORS: ramdisk here isn't identifier. It can be translated. #: grub-core/loader/xnu.c:1524 msgid "Load XNU ramdisk. It will be available in OS as md0." msgstr "" #: grub-core/loader/xnu.c:1528 msgid "Load a splash image for XNU." msgstr "" #: grub-core/loader/xnu.c:1533 msgid "Load an image of hibernated XNU." msgstr "" #: grub-core/mmap/mmap.c:541 msgid "ADDR1,MASK1[,ADDR2,MASK2[,...]]" msgstr "" #: grub-core/mmap/mmap.c:542 msgid "Declare memory regions as faulty (badram)." msgstr "" #: grub-core/mmap/mmap.c:544 msgid "FROM[K|M|G] TO[K|M|G]" msgstr "" #: grub-core/mmap/mmap.c:545 msgid "Remove any memory regions in specified range." msgstr "" #: grub-core/net/bootp.c:694 msgid "four arguments expected" msgstr "" #: grub-core/net/bootp.c:702 grub-core/net/net.c:1236 #, c-format msgid "unrecognised network interface `%s'" msgstr "" #: grub-core/net/bootp.c:705 msgid "no DHCP info found" msgstr "" #: grub-core/net/bootp.c:715 msgid "no DHCP options found" msgstr "" #: grub-core/net/bootp.c:723 msgid "invalid DHCP option code" msgstr "" #: grub-core/net/bootp.c:727 #, c-format msgid "no DHCP option %u found" msgstr "" #: grub-core/net/bootp.c:735 grub-core/net/bootp.c:773 msgid "tag length overflow" msgstr "" #: grub-core/net/bootp.c:794 #, c-format msgid "unrecognised DHCP option format specification `%s'" msgstr "" #: grub-core/net/bootp.c:818 msgid "no network card found" msgstr "" #: grub-core/net/bootp.c:910 grub-core/net/net.c:415 #, c-format msgid "couldn't autoconfigure %s" msgstr "" #: grub-core/net/bootp.c:924 grub-core/net/bootp.c:927 msgid "[CARD]" msgstr "" #: grub-core/net/bootp.c:925 msgid "perform a bootp autoconfiguration" msgstr "" #: grub-core/net/bootp.c:928 msgid "perform a DHCP autoconfiguration" msgstr "" #: grub-core/net/bootp.c:930 msgid "VAR INTERFACE NUMBER DESCRIPTION" msgstr "" #: grub-core/net/bootp.c:931 msgid "" "retrieve DHCP option and save it into VAR. If VAR is - then print the value." msgstr "" #: grub-core/net/dns.c:462 msgid "no DNS servers configured" msgstr "" #: grub-core/net/dns.c:525 msgid "domain name component is too long" msgstr "" #: grub-core/net/dns.c:621 grub-core/net/dns.c:671 msgid "no DNS record found" msgstr "" #: grub-core/net/dns.c:629 msgid "no DNS reply received" msgstr "" #: grub-core/net/dns.c:687 msgid "only ipv4" msgstr "" #: grub-core/net/dns.c:691 msgid "only ipv6" msgstr "" #: grub-core/net/dns.c:695 msgid "prefer ipv4" msgstr "" #: grub-core/net/dns.c:699 msgid "prefer ipv6" msgstr "" #: grub-core/net/dns.c:767 msgid "ADDRESS DNSSERVER" msgstr "" #: grub-core/net/dns.c:768 msgid "Perform a DNS lookup" msgstr "" #: grub-core/net/dns.c:770 grub-core/net/dns.c:773 msgid "DNSSERVER" msgstr "" #: grub-core/net/dns.c:771 msgid "Add a DNS server" msgstr "" #: grub-core/net/dns.c:774 msgid "Remove a DNS server" msgstr "" #: grub-core/net/dns.c:776 msgid "List DNS servers" msgstr "" #: grub-core/net/drivers/efi/efinet.c:44 msgid "network protocol not available, can't send packet" msgstr "" #: grub-core/net/drivers/efi/efinet.c:52 grub-core/net/drivers/efi/efinet.c:68 #: grub-core/net/drivers/efi/efinet.c:80 grub-core/net/drivers/emu/emunet.c:62 #: grub-core/net/drivers/i386/pc/pxe.c:273 #: grub-core/net/drivers/ieee1275/ofnet.c:76 #: grub-core/net/drivers/uboot/ubootnet.c:62 msgid "couldn't send network packet" msgstr "" #: grub-core/net/drivers/ieee1275/ofnet.c:326 msgid "alloc-mem failed" msgstr "" #: grub-core/net/drivers/ieee1275/ofnet.c:354 msgid "free-mem failed" msgstr "" #: grub-core/net/drivers/ieee1275/ofnet.c:452 #: grub-core/net/drivers/ieee1275/ofnet.c:461 msgid "overflow detected while obatining size of ofdata path" msgstr "" #: grub-core/net/http.c:71 msgid "invalid HTTP header - LF without CR" msgstr "" #: grub-core/net/http.c:109 msgid "unsupported HTTP response" msgstr "" #. TRANSLATORS: GRUB HTTP code is pretty young. So even perfectly #. valid answers like 403 will trigger this very generic message. #: grub-core/net/http.c:130 #, c-format msgid "unsupported HTTP error %d: %s" msgstr "" #: grub-core/net/http.c:442 grub-core/net/tftp.c:410 #, c-format msgid "time out opening `%s'" msgstr "" #: grub-core/net/net.c:185 msgid "timeout: could not resolve hardware address" msgstr "" #: grub-core/net/net.c:583 #, c-format msgid "unresolvable address %s" msgstr "" #: grub-core/net/net.c:629 #, c-format msgid "unrecognised network address `%s'" msgstr "" #: grub-core/net/net.c:696 msgid "destination unreachable" msgstr "" #. TRANSLATORS: route loop is a condition when e.g. #. to contact server A you need to go through B #. and to contact B you need to go through A. #: grub-core/net/net.c:719 msgid "route loop detected" msgstr "" #: grub-core/net/net.c:735 msgid "address not found" msgstr "" #: grub-core/net/net.c:739 msgid "you can't delete this address" msgstr "" #: grub-core/net/net.c:811 grub-core/net/net.c:841 #, c-format msgid "Unsupported hw address type %d\n" msgstr "" #: grub-core/net/net.c:862 #, c-format msgid "Unsupported address type %d\n" msgstr "" #: grub-core/net/net.c:1098 grub-core/net/net.c:1212 msgid "three arguments expected" msgstr "" #: grub-core/net/net.c:1104 msgid "card not found" msgstr "" #: grub-core/net/net.c:1257 #, c-format msgid "non-numeric or invalid number `%s'" msgstr "" #: grub-core/net/net.c:1261 #, c-format msgid "vlan id `%s' not in the valid range of 0-4094" msgstr "" #: grub-core/net/net.c:1274 msgid "network interface not found" msgstr "" #. TRANSLATORS: it refers to the network address. #: grub-core/net/net.c:1284 msgid "temporary" msgstr "" #: grub-core/net/net.c:1307 #, c-format msgid "Unknown address type %d\n" msgstr "" #: grub-core/net/net.c:1420 msgid "no server is specified" msgstr "" #: grub-core/net/net.c:1435 msgid "mismatched [ in address" msgstr "" #: grub-core/net/net.c:1445 grub-core/net/net.c:1480 msgid "bad port number" msgstr "" #: grub-core/net/net.c:1462 msgid "overflow detected while obtaining length of host" msgstr "" #: grub-core/net/net.c:1836 #, c-format msgid "timeout reading `%s'" msgstr "" #. TRANSLATORS: HWADDRESS stands for #. "hardware address". #: grub-core/net/net.c:2100 msgid "SHORTNAME CARD ADDRESS [HWADDRESS]" msgstr "" #: grub-core/net/net.c:2101 msgid "Add a network address." msgstr "" #: grub-core/net/net.c:2104 msgid "[CARD [HWADDRESS]]" msgstr "" #: grub-core/net/net.c:2105 msgid "Perform an IPV6 autoconfiguration" msgstr "" #: grub-core/net/net.c:2108 grub-core/net/net.c:2115 msgid "SHORTNAME" msgstr "" #: grub-core/net/net.c:2109 msgid "Delete a network address." msgstr "" #. TRANSLATORS: "gw" is a keyword. #: grub-core/net/net.c:2112 msgid "SHORTNAME NET [INTERFACE| gw GATEWAY]" msgstr "" #: grub-core/net/net.c:2113 msgid "Add a network route." msgstr "" #: grub-core/net/net.c:2116 msgid "Delete a network route." msgstr "" #: grub-core/net/net.c:2118 msgid "SHORTNAME VLANID" msgstr "" #: grub-core/net/net.c:2119 msgid "Set an interface's vlan id." msgstr "" #: grub-core/net/net.c:2121 msgid "list network routes" msgstr "" #: grub-core/net/net.c:2123 msgid "list network cards" msgstr "" #: grub-core/net/net.c:2125 msgid "list network addresses" msgstr "" #: grub-core/net/tcp.c:686 msgid "connection refused" msgstr "" #: grub-core/net/tcp.c:689 msgid "connection timeout" msgstr "" #: grub-core/net/tftp.c:343 msgid "filename too long" msgstr "" #: grub-core/normal/auth.c:253 msgid "Enter username: " msgstr "" #: grub-core/normal/auth.c:302 msgid "[USERLIST]" msgstr "" #: grub-core/normal/auth.c:303 msgid "Check whether user is in USERLIST." msgstr "" #: grub-core/normal/cmdline.c:175 grub-core/normal/menu_entry.c:1077 msgid "Possible commands are:" msgstr "" #: grub-core/normal/cmdline.c:178 grub-core/normal/menu_entry.c:1081 msgid "Possible devices are:" msgstr "" #: grub-core/normal/cmdline.c:181 grub-core/normal/menu_entry.c:1085 msgid "Possible files are:" msgstr "" #: grub-core/normal/cmdline.c:184 grub-core/normal/menu_entry.c:1089 msgid "Possible partitions are:" msgstr "" #: grub-core/normal/cmdline.c:187 grub-core/normal/menu_entry.c:1093 msgid "Possible arguments are:" msgstr "" #. TRANSLATORS: this message is used if none of above matches. #. This shouldn't happen but please use the general term for #. "thing" or "object". #: grub-core/normal/cmdline.c:193 grub-core/normal/menu_entry.c:1097 msgid "Possible things are:" msgstr "" #: grub-core/normal/color.c:81 #, c-format msgid "Warning: syntax error (missing slash) in `%s'\n" msgstr "" #: grub-core/normal/color.c:90 #, c-format msgid "Warning: invalid foreground color `%s'\n" msgstr "" #: grub-core/normal/color.c:96 #, c-format msgid "Warning: invalid background color `%s'\n" msgstr "" #: grub-core/normal/context.c:206 msgid "ENVVAR [ENVVAR] ..." msgstr "" #: grub-core/normal/context.c:207 msgid "Export variables." msgstr "" #: grub-core/normal/dyncmd.c:187 msgid "module isn't loaded" msgstr "" #: grub-core/normal/main.c:212 #, c-format msgid "GNU GRUB version %s" msgstr "" #: grub-core/normal/main.c:378 msgid "ESC at any time exits." msgstr "" #: grub-core/normal/main.c:381 #, c-format msgid "" "Minimal BASH-like line editing is supported. For the first word, TAB lists " "possible command completions. Anywhere else TAB lists possible device or " "file completions. To enable less(1)-like paging, \"set pager=1\". %s" msgstr "" #. TRANSLATORS: it's command line prompt. #: grub-core/normal/main.c:414 msgid ">" msgstr "" #. TRANSLATORS: it's command line prompt. #: grub-core/normal/main.c:417 msgid "grub>" msgstr "" #: grub-core/normal/main.c:542 msgid "Clear the screen." msgstr "" #: grub-core/normal/main.c:551 msgid "Enter normal mode." msgstr "" #: grub-core/normal/main.c:553 msgid "Exit from normal mode." msgstr "" #: grub-core/normal/menu.c:67 grub-core/normal/menu_entry.c:1462 msgid "Press any key to continue..." msgstr "" #: grub-core/normal/menu.c:823 #, c-format msgid "Booting `%s'" msgstr "" #: grub-core/normal/menu.c:836 #, c-format msgid "Falling back to `%s'" msgstr "" #: grub-core/normal/menu.c:852 msgid "Failed to boot both default and fallback entries.\n" msgstr "" #: grub-core/normal/menu_entry.c:1180 msgid "Booting a command list" msgstr "" #: grub-core/normal/menu_text.c:160 msgid "" "Minimum Emacs-like screen editing is supported. TAB lists completions. Press " "Ctrl-x or F10 to boot, Ctrl-c or F2 for a command-line or ESC to discard " "edits and return to the GRUB menu." msgstr "" #: grub-core/normal/menu_text.c:170 #, c-format msgid "Use the %C and %C keys to select which entry is highlighted." msgstr "" #. TRANSLATORS: that's the list of binary unit prefixes. #: grub-core/normal/misc.c:38 msgid "B" msgstr "" #: grub-core/normal/misc.c:38 msgid "KiB" msgstr "" #: grub-core/normal/misc.c:38 msgid "MiB" msgstr "" #: grub-core/normal/misc.c:38 msgid "GiB" msgstr "" #: grub-core/normal/misc.c:38 msgid "TiB" msgstr "" #: grub-core/normal/misc.c:38 msgid "PiB" msgstr "" #. TRANSLATORS: that's the list of binary unit prefixes. #: grub-core/normal/misc.c:40 msgid "K" msgstr "" #: grub-core/normal/misc.c:40 msgid "M" msgstr "" #: grub-core/normal/misc.c:40 msgid "G" msgstr "" #: grub-core/normal/misc.c:40 msgid "T" msgstr "" #: grub-core/normal/misc.c:40 msgid "P" msgstr "" #. TRANSLATORS: that's the list of binary unit prefixes. #: grub-core/normal/misc.c:42 msgid "B/s" msgstr "" #: grub-core/normal/misc.c:42 msgid "KiB/s" msgstr "" #: grub-core/normal/misc.c:42 msgid "MiB/s" msgstr "" #: grub-core/normal/misc.c:42 msgid "GiB/s" msgstr "" #: grub-core/normal/misc.c:42 msgid "TiB/s" msgstr "" #: grub-core/normal/misc.c:42 msgid "PiB/s" msgstr "" #: grub-core/normal/misc.c:96 #, c-format msgid "Partition %s:" msgstr "" #: grub-core/normal/misc.c:101 #, c-format msgid "Device %s:" msgstr "" #: grub-core/normal/misc.c:107 msgid "Filesystem cannot be accessed" msgstr "" #: grub-core/normal/misc.c:121 #, c-format msgid "Filesystem type %s" msgstr "" #: grub-core/normal/misc.c:131 #, c-format msgid "- Label `%s'" msgstr "" #. TRANSLATORS: Arguments are year, month, day, hour, minute, #. second, day of the week (translated). #: grub-core/normal/misc.c:148 #, c-format msgid "- Last modification time %d-%02d-%02d %02d:%02d:%02d %s" msgstr "" #: grub-core/normal/misc.c:171 msgid "No known filesystem detected" msgstr "" #: grub-core/normal/misc.c:174 #, c-format msgid " - Partition start at %llu%sKiB" msgstr "" #: grub-core/normal/misc.c:178 #, c-format msgid " - Sector size %uB" msgstr "" #: grub-core/normal/misc.c:180 msgid " - Total size unknown" msgstr "" #: grub-core/normal/misc.c:182 #, c-format msgid " - Total size %llu%sKiB" msgstr "" #. TRANSLATORS: Replace dot with appropriate decimal separator for #. your language. #: grub-core/normal/misc.c:186 msgid ".5" msgstr "" #. TRANSLATORS: This has to fit on one line. It's ok to include few #. words but don't write poems. #: grub-core/normal/term.c:82 msgid "--MORE--" msgstr "" #: grub-core/osdep/aros/config.c:92 grub-core/osdep/unix/config.c:137 #: grub-core/osdep/windows/config.c:55 #, c-format msgid "cannot open configuration file `%s': %s" msgstr "" #: grub-core/osdep/aros/hostdisk.c:521 msgid "Success" msgstr "" #: grub-core/osdep/basic/compress.c:8 grub-core/osdep/basic/compress.c:14 #: grub-core/osdep/basic/compress.c:20 msgid "no compression is available for your platform" msgstr "" #: grub-core/osdep/basic/no_platform.c:30 #: grub-core/osdep/windows/platform.c:428 msgid "no IEEE1275 routines are available for your platform" msgstr "" #: grub-core/osdep/basic/no_platform.c:38 msgid "no EFI routines are available for your platform" msgstr "" #: grub-core/osdep/basic/no_platform.c:45 #: grub-core/osdep/windows/platform.c:435 msgid "no SGI routines are available for your platform" msgstr "" #. TRANSLATORS: The OS itself may very well have a random #. number generator but GRUB doesn't know how to access it. #: grub-core/osdep/basic/random.c:42 msgid "no random number generator is available for your OS" msgstr "" #: grub-core/osdep/devmapper/getroot.c:78 msgid "Failed to create `device-mapper' tree" msgstr "" #: grub-core/osdep/devmapper/getroot.c:196 #: grub-core/osdep/freebsd/getroot.c:202 #, c-format msgid "can't mount encrypted volume `%s': %s" msgstr "" #: grub-core/osdep/devmapper/getroot.c:218 #, c-format msgid "cannot open grub disk `%s'" msgstr "" #: grub-core/osdep/devmapper/getroot.c:221 #, c-format msgid "cannot get cryptodisk from source disk `%s'" msgstr "" #: grub-core/osdep/devmapper/getroot.c:230 #, c-format msgid "cannot get dm node name for grub dev `%s'" msgstr "" #: grub-core/osdep/devmapper/getroot.c:237 msgid "can't create dm task DM_DEVICE_TABLE" msgstr "" #: grub-core/osdep/devmapper/getroot.c:239 #, c-format msgid "can't set dm task name to `%s'" msgstr "" #: grub-core/osdep/devmapper/getroot.c:241 #, c-format msgid "can't run dm task for `%s'" msgstr "" #: grub-core/osdep/devmapper/getroot.c:249 #, c-format msgid "dm target of type `%s' is not `crypt'" msgstr "" #: grub-core/osdep/devmapper/getroot.c:261 #, c-format msgid "can't get cipher from dm-crypt parameters `%s'" msgstr "" #: grub-core/osdep/devmapper/getroot.c:272 #, c-format msgid "can't get cipher mode from dm-crypt parameters `%s'" msgstr "" #: grub-core/osdep/devmapper/getroot.c:283 #, c-format msgid "can't set cipher of cryptodisk `%s' to `%s' with mode `%s'" msgstr "" #: grub-core/osdep/devmapper/getroot.c:297 msgid "can't lookup hash sha256 by name" msgstr "" #. TRANSLATORS: geom is the name of (k)FreeBSD device framework. #. Usually left untranslated. #. #: grub-core/osdep/freebsd/getroot.c:82 grub-core/osdep/freebsd/getroot.c:164 #: grub-core/osdep/freebsd/getroot.c:258 grub-core/osdep/freebsd/getroot.c:316 msgid "couldn't open geom" msgstr "" #: grub-core/osdep/freebsd/getroot.c:182 grub-core/osdep/freebsd/getroot.c:277 msgid "couldn't find geli consumer" msgstr "" #: grub-core/osdep/freebsd/getroot.c:282 msgid "couldn't retrieve geli UUID" msgstr "" #. TRANSLATORS: geom is the name of (k)FreeBSD device framework. #. Usually left untranslated. "part" is the identifier of one of its #. classes. #: grub-core/osdep/freebsd/getroot.c:325 msgid "couldn't find geom `part' class" msgstr "" #: grub-core/osdep/freebsd/hostdisk.c:70 grub-core/osdep/linux/hostdisk.c:92 msgid "unaligned device size" msgstr "" #: grub-core/osdep/generic/blocklist.c:80 #, c-format msgid "attempting to read the core image `%s' from GRUB" msgstr "" #: grub-core/osdep/generic/blocklist.c:81 #, c-format msgid "attempting to read the core image `%s' from GRUB again" msgstr "" #: grub-core/osdep/generic/blocklist.c:139 #, c-format msgid "cannot read `%s' correctly" msgstr "" #: grub-core/osdep/generic/blocklist.c:150 msgid "failed to read the sectors of the core image" msgstr "" #. TRANSLATORS: On GNU/Hurd, a "translator" is similar to a filesystem #. mount, but handled by a userland daemon, whose invocation command line #. is being fetched here. First %s is the file being looked at (for which #. we are fetching the "translator" command line), second %s is the error #. message. #. #: grub-core/osdep/hurd/getroot.c:79 #, c-format msgid "cannot get translator command line for path `%s': %s" msgstr "" #: grub-core/osdep/hurd/getroot.c:82 #, c-format msgid "translator command line is empty for path `%s'" msgstr "" #. TRANSLATORS: we expect to get something like #. /hurd/foobar --option1 --option2=baz /dev/something #. #: grub-core/osdep/hurd/getroot.c:98 #, c-format msgid "" "translator `%s' for path `%s' has several non-option words, at least `%s' " "and `%s'" msgstr "" #. TRANSLATORS: we expect to get something like #. /hurd/foobar --option1 --option2=baz /dev/something #. #: grub-core/osdep/hurd/getroot.c:109 #, c-format msgid "" "translator `%s' for path `%s' is given only options, cannot find device part" msgstr "" #: grub-core/osdep/hurd/hostdisk.c:73 #, c-format msgid "Storage information for `%s' does not include type" msgstr "" #: grub-core/osdep/hurd/hostdisk.c:75 #, c-format msgid "`%s' is not a local disk" msgstr "" #: grub-core/osdep/hurd/hostdisk.c:78 #, c-format msgid "" "Storage information for `%s' indicates neither a plain partition nor a plain " "disk" msgstr "" #: grub-core/osdep/linux/blocklist.c:81 grub-core/osdep/linux/blocklist.c:96 #: grub-core/osdep/linux/blocklist.c:122 #, c-format msgid "can't retrieve blocklists: %s" msgstr "" #: grub-core/osdep/linux/blocklist.c:84 msgid "blocksize is not divisible by 512" msgstr "" #: grub-core/osdep/linux/blocklist.c:86 msgid "invalid zero blocksize" msgstr "" #: grub-core/osdep/linux/blocklist.c:90 util/setup.c:747 msgid "can't retrieve blocklists" msgstr "" #: grub-core/osdep/linux/getroot.c:151 #, c-format msgid "ioctl RAID_VERSION error: %s" msgstr "" #: grub-core/osdep/linux/getroot.c:157 grub-core/osdep/linux/getroot.c:161 #, c-format msgid "unsupported RAID version: %d.%d" msgstr "" #: grub-core/osdep/linux/getroot.c:166 #, c-format msgid "ioctl GET_ARRAY_INFO error: %s" msgstr "" #: grub-core/osdep/linux/getroot.c:176 #, c-format msgid "ioctl GET_DISK_INFO error: %s" msgstr "" #: grub-core/osdep/linux/getroot.c:608 grub-core/osdep/linux/getroot.c:678 #: grub-core/osdep/unix/getroot.c:249 grub-core/osdep/unix/getroot.c:637 #: grub-core/osdep/unix/platform.c:92 grub-core/osdep/unix/platform.c:100 #, c-format msgid "Unable to open stream from %s: %s" msgstr "" #: grub-core/osdep/linux/getroot.c:1053 #, c-format msgid "unknown kind of RAID device `%s'" msgstr "" #: grub-core/osdep/linux/ofpath.c:181 #, c-format msgid "`obppath' not found in parent dirs of `%s', no IEEE1275 name discovery" msgstr "" #: grub-core/osdep/linux/ofpath.c:222 grub-core/osdep/unix/getroot.c:501 #: grub-core/osdep/unix/getroot.c:525 grub-core/osdep/unix/relpath.c:49 #: util/grub-install.c:1010 util/grub-install.c:1406 util/grub-probe.c:323 #, c-format msgid "failed to get canonical path of `%s'" msgstr "" #: grub-core/osdep/linux/ofpath.c:740 #, c-format msgid "unknown device type %s" msgstr "" #: grub-core/osdep/linux/ofpath.c:758 util/ieee1275/grub-ofpathname.c:39 #, c-format msgid "Usage: %s DEVICE\n" msgstr "" #: grub-core/osdep/unix/exec.c:86 grub-core/osdep/unix/exec.c:172 #: grub-core/osdep/unix/exec.c:217 #, c-format msgid "Unable to fork: %s" msgstr "" #: grub-core/osdep/unix/exec.c:166 grub-core/osdep/unix/exec.c:211 #, c-format msgid "Unable to create pipe: %s" msgstr "" #: grub-core/osdep/unix/getroot.c:366 msgid "cannot save the original directory" msgstr "" #: grub-core/osdep/unix/getroot.c:419 grub-core/osdep/unix/getroot.c:476 #: grub-core/osdep/unix/getroot.c:485 msgid "cannot restore the original directory" msgstr "" #. TRANSLATORS: "stat" comes from the name of POSIX function. #: grub-core/osdep/unix/getroot.c:546 grub-core/osdep/unix/hostdisk.c:61 #: grub-core/osdep/unix/relpath.c:73 grub-core/osdep/unix/relpath.c:97 #: util/getroot.c:160 util/getroot.c:162 util/grub-install.c:785 #: util/grub-macbless.c:70 #, c-format msgid "cannot stat `%s': %s" msgstr "" #: grub-core/osdep/unix/hostdisk.c:302 #, c-format msgid "cannot make temporary file: %s" msgstr "" #: grub-core/osdep/unix/hostdisk.c:320 #, c-format msgid "cannot make temporary directory: %s" msgstr "" #: grub-core/osdep/unix/platform.c:77 #, c-format msgid "" "couldn't find IEEE1275 device path for %s.\n" "You will have to set `boot-device' variable manually" msgstr "" #. TRANSLATORS: This message is shown when required executable `%s' #. isn't found. #: grub-core/osdep/unix/platform.c:149 grub-core/osdep/unix/platform.c:189 #, c-format msgid "%s: not found" msgstr "" #: grub-core/osdep/unix/platform.c:225 #, c-format msgid "" "`nvsetenv' failed. \n" "You will have to set `boot-device' variable manually. At the IEEE1275 " "prompt, type:\n" " %s\n" msgstr "" #: grub-core/osdep/unix/platform.c:240 msgid "You will have to set `SystemPartition' and `OSLoader' manually." msgstr "" #. TRANSLATORS: canonical pathname is the #. complete one e.g. /etc/fstab. It has #. to contain `/' normally, if it doesn't #. we're in trouble and throw this error. #: grub-core/osdep/unix/relpath.c:90 msgid "no `/' in canonical filename" msgstr "" #: grub-core/osdep/windows/hostdisk.c:151 msgid "cygwin_conv_path() failed" msgstr "" #: grub-core/osdep/windows/hostdisk.c:499 util/grub-install.c:581 msgid "couldn't retrieve random data" msgstr "" #: grub-core/osdep/windows/platform.c:97 msgid "Insufficient privileges to access firmware, assuming BIOS" msgstr "" #: grub-core/osdep/windows/platform.c:225 msgid "no EFI routines are available when running in BIOS mode" msgstr "" #: grub-core/osdep/windows/platform.c:240 msgid "unexpected EFI error" msgstr "" #: grub-core/osdep/windows/platform.c:315 msgid "Couldn't find a free BootNNNN slot" msgstr "" #: grub-core/partmap/gpt.c:195 msgid "" "this GPT partition label contains no BIOS Boot Partition; embedding won't be " "possible" msgstr "" #: grub-core/partmap/gpt.c:203 msgid "your BIOS Boot Partition is too small; embedding won't be possible" msgstr "" #. TRANSLATORS: MBR gap and boot track is the same thing and is the space #. between MBR and first partitition. If your language translates well only #. "boot track", you can just use it everywhere. Next two messages are about #. RAID controllers/software bugs which GRUB has to live with. Please spread #. the message that these are bugs in other software and not merely #. suboptimal behaviour. #: grub-core/partmap/msdos.c:51 #, c-format msgid "" "Sector %llu is already in use by raid controller `%s'; avoiding it. Please " "ask the manufacturer not to store data in MBR gap" msgstr "" #: grub-core/partmap/msdos.c:54 #, c-format msgid "" "Sector %llu is already in use by the program `%s'; avoiding it. This " "software may cause boot or other problems in future. Please ask its authors " "not to store data in the boot track" msgstr "" #: grub-core/partmap/msdos.c:385 msgid "" "other software is using the embedding area, and there is not enough room for " "core.img. Such software is often trying to store data in a way that avoids " "detection. We recommend you investigate" msgstr "" #: grub-core/partmap/msdos.c:399 msgid "" "this msdos-style partition label has no post-MBR gap; embedding won't be " "possible" msgstr "" #: grub-core/partmap/msdos.c:408 msgid "your embedding area is unusually small. core.img won't fit in it." msgstr "" #: grub-core/parttool/msdospart.c:39 msgid "Make partition active" msgstr "" #: grub-core/parttool/msdospart.c:51 msgid "not a primary partition" msgstr "" #: grub-core/parttool/msdospart.c:69 #, c-format msgid "Partition %d is active now. \n" msgstr "" #: grub-core/parttool/msdospart.c:74 #, c-format msgid "Cleared active flag on %d. \n" msgstr "" #: grub-core/parttool/msdospart.c:87 msgid "Change partition type" msgstr "" #: grub-core/parttool/msdospart.c:88 msgid "Set `hidden' flag in partition type" msgstr "" #: grub-core/parttool/msdospart.c:130 #, c-format msgid "the partition type 0x%x isn't valid" msgstr "" #. TRANSLATORS: In this case we're actually writing to the disk and actively #. modifying partition type rather than just defining it. #: grub-core/parttool/msdospart.c:136 #, c-format msgid "Setting partition type to 0x%x\n" msgstr "" #. TRANSLATORS: 0 is a quantifier. "break" (similar to bash) #. can be used e.g. to break 3 loops at once. #. But asking it to break 0 loops makes no sense. #: grub-core/script/execute.c:151 msgid "can't break 0 loops" msgstr "" #. TRANSLATORS: It's about not being #. inside a function. "return" can be used only #. in a function and this error occurs if it's used #. anywhere else. #: grub-core/script/execute.c:235 msgid "not in function body" msgstr "" #: grub-core/script/execute.c:379 #, c-format msgid "invalid variable name `%s'" msgstr "" #: grub-core/script/execute.c:833 msgid "maximum recursion depth exceeded" msgstr "" #: grub-core/script/execute.c:978 msgid "cannot allocate command buffer" msgstr "" #: grub-core/script/function.c:68 msgid "attempt to redefine a function being executed" msgstr "" #: grub-core/script/lexer.c:149 util/grub-fstest.c:337 msgid "unexpected end of file" msgstr "" #: grub-core/script/main.c:55 grub-core/script/main.c:57 #: grub-core/script/main.c:59 grub-core/script/main.c:67 msgid "[NUM]" msgstr "" #: grub-core/script/main.c:55 msgid "Exit from loops" msgstr "" #: grub-core/script/main.c:57 msgid "Continue loops" msgstr "" #. TRANSLATORS: Positional arguments are #. arguments $0, $1, $2, ... #: grub-core/script/main.c:62 msgid "Shift positional parameters." msgstr "" #: grub-core/script/main.c:64 msgid "[VALUE]..." msgstr "" #: grub-core/script/main.c:65 msgid "Set positional parameters." msgstr "" #. TRANSLATORS: It's a command description #. and "Return" is a verb, not a noun. The #. command in question is "return" and #. has exactly the same semanics as bash #. equivalent. #: grub-core/script/main.c:73 msgid "Return from a function." msgstr "" #: grub-core/term/gfxterm_background.c:176 msgid "[-m (stretch|normal)] FILE" msgstr "" #: grub-core/term/gfxterm_background.c:177 msgid "Load background image for active terminal." msgstr "" #: grub-core/term/gfxterm_background.c:182 util/grub-install.c:302 #: util/grub-install.c:303 util/grub-mkrescue.c:107 util/grub-mkrescue.c:108 #: util/grub-render-label.c:61 util/grub-render-label.c:63 msgid "COLOR" msgstr "" #: grub-core/term/gfxterm_background.c:183 msgid "Set background color for active terminal." msgstr "" #: grub-core/term/i386/coreboot/cbmemc.c:139 msgid "Show CBMEM console content." msgstr "" #: grub-core/term/serial.c:55 msgid "Set the serial unit." msgstr "" #: grub-core/term/serial.c:56 msgid "Set the serial port address." msgstr "" #: grub-core/term/serial.c:57 msgid "Set the serial port speed." msgstr "" #: grub-core/term/serial.c:58 msgid "Set the serial port word length." msgstr "" #: grub-core/term/serial.c:59 msgid "Set the serial port parity." msgstr "" #: grub-core/term/serial.c:60 msgid "Set the serial port stop bits." msgstr "" #: grub-core/term/serial.c:61 msgid "Set the base frequency." msgstr "" #: grub-core/term/serial.c:62 msgid "Enable/disable RTS/CTS." msgstr "" #: grub-core/term/serial.c:181 msgid "incorrect MMIO address syntax" msgstr "" #: grub-core/term/serial.c:205 msgid "incorrect MMIO access size" msgstr "" #: grub-core/term/serial.c:279 #, c-format msgid "serial port `%s' isn't found" msgstr "" #: grub-core/term/serial.c:315 msgid "unsupported serial port flow control" msgstr "" #: grub-core/term/serial.c:490 msgid "[OPTIONS...]" msgstr "" #: grub-core/term/serial.c:491 msgid "Configure serial port." msgstr "" #: grub-core/term/terminfo.c:184 #, c-format msgid "unknown terminfo type `%s'" msgstr "" #: grub-core/term/terminfo.c:671 msgid "ASCII" msgstr "" #: grub-core/term/terminfo.c:674 msgid "UTF-8" msgstr "" #. TRANSLATORS: visually ordered UTF-8 is a non-compliant encoding #. based on UTF-8 with right-to-left languages written in reverse. #. Used on some terminals. Normal UTF-8 is refered as #. "logically-ordered UTF-8" by opposition. #: grub-core/term/terminfo.c:680 msgid "visually-ordered UTF-8" msgstr "" #: grub-core/term/terminfo.c:683 msgid "Unknown encoding" msgstr "" #: grub-core/term/terminfo.c:687 msgid "Current terminfo types:" msgstr "" #: grub-core/term/terminfo.c:702 msgid "Terminal is ASCII-only [default]." msgstr "" #: grub-core/term/terminfo.c:703 msgid "Terminal is logical-ordered UTF-8." msgstr "" #: grub-core/term/terminfo.c:704 msgid "Terminal is visually-ordered UTF-8." msgstr "" #: grub-core/term/terminfo.c:706 msgid "Terminal has specified geometry." msgstr "" #. TRANSLATORS: "x" has to be entered in, like an identifier, so please don't #. use better Unicode codepoints. #: grub-core/term/terminfo.c:709 msgid "WIDTHxHEIGHT." msgstr "" #: grub-core/term/terminfo.c:749 msgid "incorrect terminal dimensions specification" msgstr "" #: grub-core/term/terminfo.c:779 #, c-format msgid "terminal %s isn't found or it's not handled by terminfo" msgstr "" #: grub-core/term/terminfo.c:788 msgid "[[-a|-u|-v] [-g WxH] [TERM] [TYPE]]" msgstr "" #: grub-core/term/terminfo.c:789 msgid "Set terminfo type of TERM to TYPE.\n" msgstr "" #. TRANSLATORS: this is the BLOCK-argument, not #. environment block. #: grub-core/tests/test_blockarg.c:49 msgid "Print and execute block argument." msgstr "" #. TRANSLATORS: We're speaking about bitmap images like #. JPEG or PNG. #: grub-core/video/bitmap.c:216 #, c-format msgid "bitmap file `%s' is of unsupported format" msgstr "" #: grub-core/video/i386/pc/vbe.c:1191 #, c-format msgid " VBE info: version: %d.%d OEM software rev: %d.%d\n" msgstr "" #: grub-core/video/i386/pc/vbe.c:1198 #, c-format msgid " total memory: %d KiB\n" msgstr "" #: grub-core/video/video.c:596 grub-core/video/video.c:762 msgid "no suitable video mode found" msgstr "" #: include/grub/buffer.h:123 msgid "peek out of range" msgstr "" #: include/grub/crypto.h:543 msgid "access denied" msgstr "" #: include/grub/util/install.h:30 include/grub/util/install.h:35 msgid "MODULES" msgstr "" #: include/grub/util/install.h:31 msgid "pre-load specified modules MODULES" msgstr "" #: include/grub/util/install.h:33 msgid "embed a specific DTB" msgstr "" #: include/grub/util/install.h:36 msgid "install only MODULES and their dependencies [default=all]" msgstr "" #: include/grub/util/install.h:37 msgid "THEMES" msgstr "" #: include/grub/util/install.h:38 #, c-format msgid "install THEMES [default=%s]" msgstr "" #: include/grub/util/install.h:39 msgid "FONTS" msgstr "" #: include/grub/util/install.h:40 #, c-format msgid "install FONTS [default=%s]" msgstr "" #: include/grub/util/install.h:41 msgid "LOCALES" msgstr "" #: include/grub/util/install.h:42 msgid "install only LOCALES [default=all]" msgstr "" #: include/grub/util/install.h:45 msgid "compress GRUB files [optional]" msgstr "" #: include/grub/util/install.h:48 util/grub-mkimage.c:83 msgid "choose the compression to use for core image" msgstr "" #. TRANSLATORS: platform here isn't identifier. It can be translated. #: include/grub/util/install.h:51 include/grub/util/install.h:54 #: util/grub-mkimage.c:66 #, c-format msgid "use images and modules under DIR [default=%s/]" msgstr "" #: include/grub/util/install.h:57 #, c-format msgid "use translations under DIR [default=%s]" msgstr "" #: include/grub/util/install.h:60 #, c-format msgid "use themes under DIR [default=%s]" msgstr "" #: include/grub/util/install.h:65 util/grub-mkimage.c:78 msgid "embed FILE as public key for signature checking" msgstr "" #: include/grub/util/install.h:67 util/grub-mkimage.c:84 msgid "SBAT metadata" msgstr "" #: include/grub/util/install.h:69 util/grub-mkimage.c:85 msgid "disable shim_lock verifier" msgstr "" #: include/grub/util/install.h:71 msgid "disabled command line interface access" msgstr "" #: util/editenv.c:71 util/grub-editenv.c:207 util/grub-install-common.c:723 #: util/grub-mkimage.c:338 util/setup.c:794 #, c-format msgid "cannot sync `%s': %s" msgstr "" #: util/editenv.c:77 #, c-format msgid "cannot rename the file %s to %s" msgstr "" #: util/editenv.c:94 util/editenv.c:131 #, c-format msgid "cannot rename the file %s to %s: %s" msgstr "" #: util/getroot.c:402 #, c-format msgid "disk does not exist, so falling back to partition device %s" msgstr "" #: util/grub-editenv.c:45 util/grub-fstest.c:516 msgid "Commands:" msgstr "" #: util/grub-editenv.c:47 msgid "Create a blank environment block file." msgstr "" #: util/grub-editenv.c:49 msgid "List the current variables." msgstr "" #. TRANSLATORS: "set" is a keyword. It's a summary of "set" subcommand. #: util/grub-editenv.c:51 msgid "set [NAME=VALUE ...]" msgstr "" #: util/grub-editenv.c:52 msgid "Set variables." msgstr "" #. TRANSLATORS: "unset" is a keyword. It's a summary of "unset" subcommand. #: util/grub-editenv.c:54 msgid "unset [NAME ...]" msgstr "" #: util/grub-editenv.c:55 msgid "Delete variables." msgstr "" #: util/grub-editenv.c:57 msgid "Options:" msgstr "" #: util/grub-editenv.c:84 msgid "You need to specify at least one command.\n" msgstr "" #: util/grub-editenv.c:113 msgid "FILENAME COMMAND" msgstr "" #: util/grub-editenv.c:114 msgid "Tool to edit environment block." msgstr "" #: util/grub-editenv.c:116 #, c-format msgid "" "If FILENAME is `-', the default value %s is used.\n" "\n" "There is no `delete' command; if you want to delete the whole environment\n" "block, use `rm %s'." msgstr "" #: util/grub-editenv.c:149 #, c-format msgid "cannot get file location `%s': %s" msgstr "" #: util/grub-editenv.c:168 msgid "invalid environment block" msgstr "" #: util/grub-editenv.c:223 #, c-format msgid "invalid parameter %s" msgstr "" #: util/grub-editenv.c:228 msgid "environment block too small" msgstr "" #: util/grub-fstest.c:108 #, c-format msgid "disk read fails at offset %lld, length %lld" msgstr "" #: util/grub-fstest.c:139 #, c-format msgid "invalid skip value %lld" msgstr "" #: util/grub-fstest.c:161 util/grub-fstest.c:247 #, c-format msgid "read error at offset %llu: %s" msgstr "" #: util/grub-fstest.c:211 #, c-format msgid "cannot open OS file `%s': %s" msgstr "" #: util/grub-fstest.c:226 util/misc.c:126 #, c-format msgid "cannot write to the stdout: %s" msgstr "" #: util/grub-fstest.c:260 #, c-format msgid "compare fail at offset %llu" msgstr "" #: util/grub-fstest.c:281 util/grub-fstest.c:321 #, c-format msgid "OS file %s open error: %s" msgstr "" #: util/grub-fstest.c:409 util/grub-mount.c:412 #, c-format msgid "`loopback' command fails: %s" msgstr "" #: util/grub-fstest.c:420 util/grub-mount.c:422 #, c-format msgid "`cryptomount' command fails: %s" msgstr "" #: util/grub-fstest.c:484 util/grub-fstest.c:488 msgid "couldn't retrieve UUID" msgstr "" #: util/grub-fstest.c:517 msgid "ls PATH" msgstr "" #: util/grub-fstest.c:517 msgid "List files in PATH." msgstr "" #: util/grub-fstest.c:518 msgid "cp FILE LOCAL" msgstr "" #: util/grub-fstest.c:518 msgid "Copy FILE to local file LOCAL." msgstr "" #: util/grub-fstest.c:519 msgid "cat FILE" msgstr "" #: util/grub-fstest.c:519 msgid "Copy FILE to standard output." msgstr "" #: util/grub-fstest.c:520 msgid "cmp FILE LOCAL" msgstr "" #: util/grub-fstest.c:520 msgid "Compare FILE with local file LOCAL." msgstr "" #: util/grub-fstest.c:521 msgid "hex FILE" msgstr "" #: util/grub-fstest.c:521 msgid "Show contents of FILE in hex." msgstr "" #: util/grub-fstest.c:522 msgid "crc FILE" msgstr "" #: util/grub-fstest.c:522 msgid "Get crc32 checksum of FILE." msgstr "" #: util/grub-fstest.c:523 msgid "blocklist FILE" msgstr "" #: util/grub-fstest.c:523 msgid "Display blocklist of FILE." msgstr "" #: util/grub-fstest.c:524 msgid "xnu_uuid DEVICE" msgstr "" #: util/grub-fstest.c:524 msgid "Compute XNU UUID of the device." msgstr "" #: util/grub-fstest.c:525 msgid "zfs-bootfs ZFS_DATASET" msgstr "" #: util/grub-fstest.c:525 msgid "Compute ZFS dataset bootpath." msgstr "" #. TRANSLATORS: bitmaps are images like e.g. in JPEG. #: util/grub-fstest.c:528 util/grub-fstest.c:529 util/grub-fstest.c:530 #: util/grub-mkfont.c:984 util/grub-mkfont.c:997 util/grub-mkfont.c:998 #: util/grub-mkpasswd-pbkdf2.c:46 util/grub-mkpasswd-pbkdf2.c:47 #: util/grub-mkpasswd-pbkdf2.c:48 msgid "NUM" msgstr "" #: util/grub-fstest.c:528 msgid "Skip N bytes from output file." msgstr "" #: util/grub-fstest.c:529 msgid "Handle N bytes in output file." msgstr "" #: util/grub-fstest.c:530 msgid "Specify the number of input files." msgstr "" #: util/grub-fstest.c:531 util/grub-mount.c:473 msgid "Set debug environment variable." msgstr "" #: util/grub-fstest.c:532 util/grub-mount.c:474 msgid "Mount crypto devices." msgstr "" #. TRANSLATORS: "prompt" is a keyword. #: util/grub-fstest.c:535 util/grub-mount.c:477 msgid "FILE|prompt" msgstr "" #: util/grub-fstest.c:535 util/grub-mount.c:477 msgid "Load zfs crypto key." msgstr "" #: util/grub-fstest.c:537 msgid "Uncompress data." msgstr "" #: util/grub-fstest.c:616 msgid "Invalid disk count.\n" msgstr "" #. TRANSLATORS: disk count is optional but if it's there it must #. be before disk list. So please don't imply disk count as mandatory. #. #: util/grub-fstest.c:624 msgid "Disk count must precede disks list.\n" msgstr "" #: util/grub-fstest.c:644 msgid "No command is specified.\n" msgstr "" #: util/grub-fstest.c:649 msgid "Not enough parameters to command.\n" msgstr "" #: util/grub-fstest.c:727 #, c-format msgid "Invalid command %s.\n" msgstr "" #: util/grub-fstest.c:740 msgid "IMAGE_PATH COMMANDS" msgstr "" #: util/grub-fstest.c:741 util/grub-mount.c:575 msgid "Debug tool for filesystem driver." msgstr "" #: util/grub-glue-efi.c:53 msgid "set input filename for 32-bit part." msgstr "" #: util/grub-glue-efi.c:55 msgid "set input filename for 64-bit part." msgstr "" #: util/grub-glue-efi.c:57 util/grub-mklayout.c:55 util/grub-render-label.c:71 msgid "set output filename. Default is STDOUT" msgstr "" #: util/grub-glue-efi.c:94 util/grub-mklayout.c:476 #: util/grub-mkpasswd-pbkdf2.c:86 util/grub-render-label.c:131 msgid "[OPTIONS]" msgstr "" #: util/grub-glue-efi.c:95 msgid "Glue 32-bit and 64-bit binary into Apple universal one." msgstr "" #: util/grub-glue-efi.c:116 msgid "Missing input file\n" msgstr "" #: util/grub-install-common.c:127 util/grub-install-common.c:151 #, c-format msgid "cannot copy `%s' to `%s': %s" msgstr "" #: util/grub-install-common.c:147 #, c-format msgid "can't compress `%s' to `%s'" msgstr "" #: util/grub-install-common.c:182 util/grub-install-common.c:189 #, c-format msgid "failed to make directory: '%s'" msgstr "" #: util/grub-install-common.c:239 util/grub-install-common.c:740 #: util/grub-install-common.c:767 util/grub-install-common.c:812 #, c-format msgid "cannot open directory `%s': %s" msgstr "" #: util/grub-install-common.c:264 #, c-format msgid "cannot backup `%s': %s" msgstr "" #: util/grub-install-common.c:274 #, c-format msgid "cannot restore `%s': %s" msgstr "" #: util/grub-install-common.c:281 #, c-format msgid "cannot delete `%s': %s" msgstr "" #: util/grub-install-common.c:483 util/grub-mkimage.c:215 msgid "grub-mkimage is compiled without XZ support" msgstr "" #: util/grub-install-common.c:491 util/grub-mkimage.c:223 #, c-format msgid "Unknown compression format %s" msgstr "" #: util/grub-install-common.c:571 #, c-format msgid "Unrecognized compression `%s'" msgstr "" #: util/grub-install-common.c:696 #, c-format msgid "unknown target format %s" msgstr "" #: util/grub-install-common.c:891 #, c-format msgid "cannot find locale `%s'" msgstr "" #: util/grub-install-common.c:1131 #, c-format msgid "%s doesn't exist. Please specify --target or --directory" msgstr "" #: util/grub-install-common.c:1140 util/grub-install-common.c:1143 #, c-format msgid "invalid modinfo file `%s'" msgstr "" #: util/grub-install-common.c:1158 #, c-format msgid "Unknown platform `%s-%s'" msgstr "" #: util/grub-install.c:238 msgid "More than one install device?" msgstr "" #: util/grub-install.c:251 #, c-format msgid "" "install GRUB images under the directory DIR/%s instead of the %s directory" msgstr "" #: util/grub-install.c:256 util/grub-probe.c:734 msgid "TARGET" msgstr "" #. TRANSLATORS: "TARGET" as in "target platform". #: util/grub-install.c:258 #, c-format msgid "install GRUB for TARGET platform [default=%s]; available targets: %s" msgstr "" #. TRANSLATORS: "may break" doesn't just mean that option wouldn't have any #. effect but that it will make the resulting install unbootable from HDD. #. TRANSLATORS: The potential breakage isn't limited to floppies but it's #. likely to make the install unbootable from HDD. #: util/grub-install.c:267 util/grub-setup.c:94 msgid "" "make the drive also bootable as floppy (default for fdX devices). May break " "on some BIOSes." msgstr "" #: util/grub-install.c:270 msgid "delete device map if it already exists" msgstr "" #: util/grub-install.c:272 util/grub-setup.c:87 msgid "install even if problems are detected" msgstr "" #: util/grub-install.c:274 msgid "use identifier file even if UUID is available" msgstr "" #: util/grub-install.c:276 msgid "" "disk module to use (biosdisk or native). This option is only available on " "BIOS target." msgstr "" #: util/grub-install.c:279 msgid "" "don't update the `boot-device'/`Boot*' NVRAM variables. This option is only " "available on EFI and IEEE1275 targets." msgstr "" #: util/grub-install.c:282 util/grub-setup.c:89 msgid "do not probe for filesystems in DEVICE" msgstr "" #: util/grub-install.c:284 msgid "do not install bootsector" msgstr "" #: util/grub-install.c:286 util/grub-setup.c:96 msgid "" "Do not apply any reed-solomon codes when embedding core.img. This option is " "only available on x86 BIOS targets." msgstr "" #: util/grub-install.c:293 msgid "" "the installation device is removable. This option is only available on EFI." msgstr "" #: util/grub-install.c:295 msgid "ID" msgstr "" #: util/grub-install.c:296 msgid "the ID of bootloader. This option is only available on EFI and Macs." msgstr "" #: util/grub-install.c:298 msgid "use DIR as the EFI System Partition root." msgstr "" #: util/grub-install.c:300 msgid "use DIR for PPC MAC install." msgstr "" #: util/grub-install.c:301 util/grub-mkrescue.c:106 msgid "use FILE as font for label" msgstr "" #: util/grub-install.c:302 util/grub-mkrescue.c:107 msgid "use COLOR for label" msgstr "" #: util/grub-install.c:303 util/grub-mkrescue.c:108 msgid "use COLOR for label background" msgstr "" #: util/grub-install.c:304 util/grub-mkrescue.c:110 msgid "use STRING as product version" msgstr "" #: util/grub-install.c:371 msgid "[OPTION] [INSTALL_DEVICE]" msgstr "" #: util/grub-install.c:372 msgid "Install GRUB on your drive." msgstr "" #: util/grub-install.c:373 #, c-format msgid "" "INSTALL_DEVICE must be system device filename.\n" "%s copies GRUB images into %s. On some platforms, it may also install GRUB " "into the boot sector." msgstr "" #: util/grub-install.c:683 #, c-format msgid "the drive %s is defined multiple times in the device map %s" msgstr "" #: util/grub-install.c:841 #, c-format msgid "Unable to open %s: %s" msgstr "" #: util/grub-install.c:902 msgid "Unable to determine your platform. Use --target." msgstr "" #: util/grub-install.c:915 #, c-format msgid "Installing for %s platform.\n" msgstr "" #: util/grub-install.c:964 msgid "install device isn't specified" msgstr "" #: util/grub-install.c:1098 msgid "cannot find EFI directory" msgstr "" #: util/grub-install.c:1101 util/grub-install.c:1261 util/grub-install.c:1299 #: util/grub-macbless.c:76 util/grub-probe.c:329 util/setup.c:320 #, c-format msgid "cannot find a device for %s (is /dev mounted?)" msgstr "" #: util/grub-install.c:1110 util/grub-install.c:1269 util/grub-install.c:1315 #: util/grub-install.c:1387 util/grub-macbless.c:80 util/grub-probe.c:372 #, c-format msgid "cannot find a GRUB drive for %s. Check your device.map" msgstr "" #: util/grub-install.c:1130 #, c-format msgid "%s doesn't look like an EFI partition, system may not boot" msgstr "" #: util/grub-install.c:1132 #, c-format msgid "%s doesn't look like an EFI partition" msgstr "" #: util/grub-install.c:1178 util/grub-install.c:1670 msgid "You've found a bug" msgstr "" #: util/grub-install.c:1283 #, c-format msgid "filesystem on %s is neither HFS nor HFS+" msgstr "" #: util/grub-install.c:1344 #, c-format msgid "" "attempt to install to encrypted disk without cryptodisk enabled. Set `%s' in " "file `%s'" msgstr "" #: util/grub-install.c:1464 util/grub-install.c:1840 util/grub-install.c:1945 #, c-format msgid "Can't create file: %s" msgstr "" #: util/grub-install.c:1546 msgid "no hints available for your platform. Expect reduced performance" msgstr "" #. TRANSLATORS: This is a prefix in the log to indicate that usually #. a command would be executed but due to an option was skipped. #: util/grub-install.c:1759 msgid "NOT RUNNING: " msgstr "" #: util/grub-install.c:1876 msgid "the chosen partition is not a PReP partition" msgstr "" #: util/grub-install.c:1881 msgid "failed to copy Grub to the PReP partition" msgstr "" #: util/grub-install.c:1887 #, c-format msgid "" "the PReP partition is not empty. If you are sure you want to use it, run dd " "to clear it: `%s'" msgstr "" #: util/grub-install.c:1963 util/grub-install.c:2011 #, c-format msgid "efibootmgr failed to register the boot entry: %s" msgstr "" #: util/grub-install.c:1995 msgid "EFI bootloader id isn't specified." msgstr "" #: util/grub-install.c:2029 msgid "WARNING: no platform-specific install was performed" msgstr "" #: util/grub-install.c:2044 msgid "Installation finished. No error reported." msgstr "" #: util/grub-macbless.c:101 msgid "bless for x86-based macs" msgstr "" #: util/grub-macbless.c:103 msgid "bless for ppc-based macs" msgstr "" #: util/grub-macbless.c:136 util/grub-probe.c:824 msgid "No path or device is specified.\n" msgstr "" #: util/grub-macbless.c:157 msgid "--ppc PATH|--x86 FILE" msgstr "" #: util/grub-macbless.c:158 msgid "Mac-style bless on HFS or HFS+" msgstr "" #: util/grub-menulst2cfg.c:44 #, c-format msgid "Usage: %s [INFILE [OUTFILE]]\n" msgstr "" #: util/grub-mkfont.c:162 #, c-format msgid "Freetype Error %d loading glyph 0x%x for U+0x%x%s" msgstr "" #. TRANSLATORS: These qualifiers are used for cursive typography, #. mainly Arabic. Note that the terms refer to the visual position #. and not logical order and if used in left-to-right script then #. leftmost is initial but with right-to-left script like Arabic #. rightmost is the initial. #: util/grub-mkfont.c:170 msgid " (medial)" msgstr "" #: util/grub-mkfont.c:171 msgid " (leftmost)" msgstr "" #: util/grub-mkfont.c:172 msgid " (rightmost)" msgstr "" #: util/grub-mkfont.c:486 #, c-format msgid "Out of range substitution (%d, %u)\n" msgstr "" #. TRANSLATORS: "lookup" is taken directly from font specifications #. which are formulated as "Under condition X replace LOOKUP with #. SUBSTITUITION". " #: util/grub-mkfont.c:517 #, c-format msgid "Out of range lookup: %d\n" msgstr "" #: util/grub-mkfont.c:525 #, c-format msgid "Unsupported substitution type: %d\n" msgstr "" #: util/grub-mkfont.c:566 #, c-format msgid "Unsupported substitution specification: %u\n" msgstr "" #. TRANSLATORS: It refers to the range of characters in font. #: util/grub-mkfont.c:600 util/grub-mkfont.c:1105 util/grub-mkfont.c:1121 msgid "invalid font range" msgstr "" #: util/grub-mkfont.c:613 #, c-format msgid "Unsupported coverage specification: %u\n" msgstr "" #: util/grub-mkfont.c:665 #, c-format msgid "WARNING: unsupported font feature parameters: %x\n" msgstr "" #: util/grub-mkfont.c:982 util/grub-mkrescue.c:98 util/grub-mkstandalone.c:51 #: util/grub-kbdcomp.in:29 msgid "save output in FILE [required]" msgstr "" #. TRANSLATORS: some font files may have multiple faces (fonts). #. This option is used to chose among them, the first face being '0'. #. Rarely used. #: util/grub-mkfont.c:988 msgid "select face index" msgstr "" #: util/grub-mkfont.c:989 msgid "FROM-TO[,FROM-TO]" msgstr "" #. TRANSLATORS: It refers to the range of characters in font. #: util/grub-mkfont.c:991 msgid "set font range" msgstr "" #: util/grub-mkfont.c:992 msgid "NAME" msgstr "" #. TRANSLATORS: "family name" for font is just a generic name without suffix #. like "Bold". #: util/grub-mkfont.c:995 msgid "set font family name" msgstr "" #: util/grub-mkfont.c:996 msgid "SIZE" msgstr "" #: util/grub-mkfont.c:996 msgid "set font size" msgstr "" #: util/grub-mkfont.c:997 msgid "set font descent" msgstr "" #: util/grub-mkfont.c:998 msgid "set font ascent" msgstr "" #: util/grub-mkfont.c:999 msgid "convert to bold font" msgstr "" #: util/grub-mkfont.c:1000 msgid "force autohint" msgstr "" #: util/grub-mkfont.c:1001 msgid "disable hinting" msgstr "" #. TRANSLATORS: some fonts contain bitmap rendering for #. some sizes. This option forces rerendering even if #. pre-rendered bitmap is available. #. #: util/grub-mkfont.c:1007 msgid "ignore bitmap strikes when loading" msgstr "" #: util/grub-mkfont.c:1197 msgid "[OPTIONS] FONT_FILES" msgstr "" #: util/grub-mkfont.c:1198 msgid "Convert common font file formats into PF2" msgstr "" #: util/grub-mkfont.c:1228 util/grub-mkrescue.c:507 #: util/grub-mkstandalone.c:327 util/grub-kbdcomp.in:70 msgid "output file must be specified" msgstr "" #: util/grub-mkfont.c:1231 msgid "FT_Init_FreeType fails" msgstr "" #: util/grub-mkfont.c:1245 #, c-format msgid "can't open file %s, index %d: error %d" msgstr "" #: util/grub-mkfont.c:1275 #, c-format msgid "can't set %dx%d font size: Freetype error %d: %s" msgstr "" #: util/grub-mkimage.c:67 msgid "set prefix directory" msgstr "" #. TRANSLATORS: "memdisk" here isn't an identifier, it can be translated. #. "embed" is a verb (command description). " #: util/grub-mkimage.c:71 msgid "" "embed FILE as a memdisk image\n" "Implies `-p (memdisk)/boot/grub' and overrides any prefix supplied " "previously, but the prefix itself can be overridden by later options" msgstr "" #: util/grub-mkimage.c:74 msgid "embed FILE as a device tree (DTB)\n" msgstr "" #: util/grub-mkimage.c:76 msgid "embed FILE as an early config" msgstr "" #. TRANSLATORS: NOTE is a name of segment. #: util/grub-mkimage.c:80 msgid "add NOTE segment for CHRP IEEE1275" msgstr "" #: util/grub-mkimage.c:81 msgid "output a generated image to FILE [default=stdout]" msgstr "" #: util/grub-mkimage.c:82 msgid "FORMAT" msgstr "" #: util/grub-mkimage.c:86 msgid "disable command line interface access" msgstr "" #: util/grub-mkimage.c:103 util/grub-mkstandalone.c:65 msgid "generate an image in FORMAT" msgstr "" #: util/grub-mkimage.c:104 util/grub-mkstandalone.c:66 msgid "available formats:" msgstr "" #: util/grub-mkimage.c:158 util/grub-mkstandalone.c:99 #, c-format msgid "unknown target format %s\n" msgstr "" #: util/grub-mkimage.c:263 msgid "[OPTION]... [MODULES]" msgstr "" #: util/grub-mkimage.c:264 msgid "Make a bootable image of GRUB." msgstr "" #: util/grub-mkimage.c:294 util/grub-mkstandalone.c:330 msgid "Target format not specified (use the -O option)." msgstr "" #: util/grub-mkimage.c:303 msgid "Prefix not specified (use the -p option)." msgstr "" #: util/grub-mkimage.c:341 util/setup.c:796 #, c-format msgid "cannot close `%s': %s" msgstr "" #: util/grub-mkimagexx.c:2364 #, c-format msgid "" "`%s' is miscompiled: its start address is 0x%llx instead of 0x%llx: ld.gold " "bug?" msgstr "" #: util/grub-mklayout.c:53 msgid "set input filename. Default is STDIN" msgstr "" #. TRANSLATORS: scan identifier is keyboard key symbolic name. #: util/grub-mklayout.c:307 #, c-format msgid "Unknown keyboard scan identifier %s\n" msgstr "" #. TRANSLATORS: scan code is keyboard key numeric identifier. #: util/grub-mklayout.c:390 util/grub-mklayout.c:418 #, c-format msgid "Unknown keyboard scan code 0x%02x\n" msgstr "" #. TRANSLATORS: this error is triggered when input doesn't contain any #. key descriptions. #: util/grub-mklayout.c:438 msgid "ERROR: no valid keyboard layout found. Check the input.\n" msgstr "" #. TRANSLATORS: "one" is a shortcut for "keyboard layout". #: util/grub-mklayout.c:478 msgid "Generate GRUB keyboard layout from Linux console one." msgstr "" #: util/grub-mknetdir.c:47 msgid "root directory of TFTP server" msgstr "" #: util/grub-mknetdir.c:49 msgid "relative subdirectory on network server" msgstr "" #: util/grub-mknetdir.c:88 msgid "" "Prepares GRUB network boot images at net_directory/subdir assuming " "net_directory being TFTP root." msgstr "" #: util/grub-mknetdir.c:147 #, c-format msgid "unsupported platform %s" msgstr "" #. TRANSLATORS: First %s is replaced by platform name. Second one by filename. #: util/grub-mknetdir.c:169 #, c-format msgid "" "Netboot directory for %s created. Configure your DHCP server to point to %s\n" msgstr "" #: util/grub-mkpasswd-pbkdf2.c:46 msgid "Number of PBKDF2 iterations" msgstr "" #: util/grub-mkpasswd-pbkdf2.c:47 msgid "Length of generated hash" msgstr "" #: util/grub-mkpasswd-pbkdf2.c:48 msgid "Length of salt" msgstr "" #: util/grub-mkpasswd-pbkdf2.c:87 msgid "Generate PBKDF2 password hash." msgstr "" #: util/grub-mkpasswd-pbkdf2.c:138 util/grub-mkpasswd-pbkdf2.c:141 msgid "failure to read password" msgstr "" #: util/grub-mkpasswd-pbkdf2.c:139 msgid "Reenter password: " msgstr "" #: util/grub-mkpasswd-pbkdf2.c:147 msgid "passwords don't match" msgstr "" #: util/grub-mkpasswd-pbkdf2.c:159 msgid "couldn't retrieve random data for salt" msgstr "" #: util/grub-mkpasswd-pbkdf2.c:174 #, c-format msgid "cryptographic error number %d" msgstr "" #: util/grub-mkpasswd-pbkdf2.c:193 #, c-format msgid "PBKDF2 hash of your password is %s\n" msgstr "" #: util/grub-mkrelpath.c:67 msgid "No path is specified.\n" msgstr "" #: util/grub-mkrelpath.c:78 msgid "PATH" msgstr "" #: util/grub-mkrelpath.c:79 msgid "Transform a system filename into GRUB one." msgstr "" #: util/grub-mkrescue.c:100 msgid "save ROM images in DIR [optional]" msgstr "" #. TRANSLATORS: xorriso is a program for creating ISOs and burning CDs. #: util/grub-mkrescue.c:103 msgid "use FILE as xorriso [optional]" msgstr "" #: util/grub-mkrescue.c:109 msgid "use STRING as product name" msgstr "" #: util/grub-mkrescue.c:111 msgid "" "enable sparc boot. Disables HFS+, APM, ARCS and boot as disk image for i386-" "pc" msgstr "" #: util/grub-mkrescue.c:112 msgid "" "enable ARCS (big-endian mips machines, mostly SGI) boot. Disables HFS+, APM, " "sparc64 and boot as disk image for i386-pc" msgstr "" #. TRANSLATORS: it generates one single image which is bootable through any method. #: util/grub-mkrescue.c:125 msgid "Make GRUB CD-ROM, disk, pendrive and floppy bootable image." msgstr "" #: util/grub-mkrescue.c:130 #, c-format msgid "" "Generates a bootable CD/USB/floppy image. Arguments other than options to " "this program are passed to xorriso, and indicate source files, source " "directories, or any of the mkisofs options listed by the output of `%s'." msgstr "" #: util/grub-mkrescue.c:134 msgid "Option -- switches to native xorriso command mode." msgstr "" #: util/grub-mkrescue.c:135 msgid "Mail xorriso support requests to ." msgstr "" #: util/grub-mkrescue.c:221 util/grub-mkstandalone.c:117 msgid "[OPTION] SOURCE..." msgstr "" #: util/grub-mkrescue.c:258 util/grub-mkrescue.c:320 util/grub-mkrescue.c:616 #, c-format msgid "enabling %s support ..." msgstr "" #: util/grub-mkrescue.c:481 util/grub-mkrescue.c:491 msgid "option requires an argument" msgstr "" #: util/grub-mkrescue.c:510 msgid "xorriso not found" msgstr "" #: util/grub-mkrescue.c:651 msgid "" "Your xorriso doesn't support `--grub2-boot-info'. Some features are " "disabled. Please use xorriso 1.2.9 or later." msgstr "" #: util/grub-mkrescue.c:678 msgid "" "Your xorriso doesn't support `--grub2-boot-info'. Your core image is too " "big. Boot as disk is disabled. Please use xorriso 1.2.9 or later." msgstr "" #: util/grub-mkstandalone.c:118 msgid "" "Generate a standalone image (containing all modules) in the selected format" msgstr "" #: util/grub-mkstandalone.c:118 msgid "Graft point syntax (E.g. /boot/grub/grub.cfg=./grub.cfg) is accepted" msgstr "" #: util/grub-mount.c:567 #, c-format msgid "cannot find `%s': %s" msgstr "" #: util/grub-mount.c:574 msgid "IMAGE1 [IMAGE2 ...] MOUNTPOINT" msgstr "" #: util/grub-mount.c:597 msgid "need an image and mountpoint" msgstr "" #: util/grub-probe.c:731 msgid "given argument is a system device, not a path" msgstr "" #: util/grub-probe.c:736 msgid "print verbose messages (pass twice to enable debug printing)." msgstr "" #: util/grub-probe.c:737 msgid "separate items in output using ASCII NUL characters" msgstr "" #: util/grub-probe.c:755 #, c-format msgid "[default=%s]" msgstr "" #: util/grub-probe.c:757 msgid "print TARGET" msgstr "" #: util/grub-probe.c:758 msgid "available targets:" msgstr "" #: util/grub-probe.c:840 msgid "[OPTION]... [PATH|DEVICE]" msgstr "" #: util/grub-probe.c:841 msgid "" "Probe device information for a given path (or device, if the -d option is " "given)." msgstr "" #: util/grub-protect.c:128 msgid "Add or remove a key protector to or from a key." msgstr "" #: util/grub-protect.c:137 msgid "Set key protector to use (only tpm2 is currently supported)." msgstr "" #: util/grub-protect.c:147 msgid "Set the path to the TPM2 device. (default: /dev/tpm0)" msgstr "" #: util/grub-protect.c:156 msgid "" "Set a comma-separated list of PCRs used to authorize key release e.g., " "'7,11'. Please be aware that PCR 0~7 are used by the firmware and the " "measurement result may change after a firmware update (for baremetal " "systems) or a package (OVMF/SLOF) update in the VM host. This may lead to " "the failure of key unsealing. (default: 7)" msgstr "" #: util/grub-protect.c:170 msgid "" "Set the bank of PCRs used to authorize key release: SHA1, SHA256, SHA384, or " "SHA512. (default: SHA256)" msgstr "" #: util/grub-protect.c:180 msgid "Set the path to a file that contains the cleartext key to protect." msgstr "" #: util/grub-protect.c:189 msgid "" "Set the path to the file that will contain the key after sealing (must be " "accessible to GRUB during boot)." msgstr "" #: util/grub-protect.c:199 msgid "Set the SRK handle if the SRK is to be made persistent." msgstr "" #: util/grub-protect.c:208 msgid "" "Set the type of SRK: RSA (RSA2048) and ECC (ECC_NIST_P256).(default: ECC)" msgstr "" #: util/grub-protect.c:218 msgid "Evict a previously persisted SRK from the TPM, if any." msgstr "" #: util/grub-protect.c:227 msgid "Use TPM 2.0 Key File format." msgstr "" #: util/grub-protect.c:236 msgid "Store the sealed key in a persistent or NV index handle." msgstr "" #: util/grub-protect.c:256 #, c-format msgid "Could not open file: %s\n" msgstr "" #: util/grub-protect.c:262 #, c-format msgid "Could not seek file: %s\n" msgstr "" #: util/grub-protect.c:270 #, c-format msgid "Could not get file length: %s\n" msgstr "" #: util/grub-protect.c:280 #, c-format msgid "Could not allocate memory for file: %s\n" msgstr "" #: util/grub-protect.c:287 #, c-format msgid "Could not read file: %s\n" msgstr "" #: util/grub-protect.c:348 #, c-format msgid "Could not send TPM command.\n" msgstr "" #: util/grub-protect.c:354 #, c-format msgid "Could not get TPM response.\n" msgstr "" #: util/grub-protect.c:370 #, c-format msgid "Could not open TPM device (%s).\n" msgstr "" #: util/grub-protect.c:388 #, c-format msgid "Could not close TPM device (%s).\n" msgstr "" #: util/grub-protect.c:440 #, c-format msgid "Could not read all the specified PCRs.\n" msgstr "" #: util/grub-protect.c:466 #, c-format msgid "PCR concatenation buffer not big enough.\n" msgstr "" #: util/grub-protect.c:476 #, c-format msgid "Bad PCR value size: expected %llu bytes but got %u bytes.\n" msgstr "" #: util/grub-protect.c:909 #, c-format msgid "Could not allocate memory for the raw format key.\n" msgstr "" #: util/grub-protect.c:965 #, c-format msgid "Invalid tpm2key size for TPM NV buffer\n" msgstr "" #: util/grub-protect.c:1018 #, c-format msgid "Input key size larger than %u bytes.\n" msgstr "" #: util/grub-protect.c:1040 #, c-format msgid "Could not export to TPM 2.0 Key File format\n" msgstr "" #: util/grub-protect.c:1049 #, c-format msgid "Could not export to the raw format\n" msgstr "" #: util/grub-protect.c:1059 #, c-format msgid "Could not write key file (%s).\n" msgstr "" #: util/grub-protect.c:1224 #, c-format msgid "--tpm2-evict is invalid when --action is 'add'.\n" msgstr "" #: util/grub-protect.c:1230 #, c-format msgid "--tpm2-keyfile must be specified.\n" msgstr "" #: util/grub-protect.c:1236 #, c-format msgid "--tpm2-outfile or --tpm2-nvindex must be specified.\n" msgstr "" #: util/grub-protect.c:1244 #, c-format msgid "Persistent handle does not support TPM 2.0 Key File format.\n" msgstr "" #: util/grub-protect.c:1250 #, c-format msgid "--tpm2-nvindex must be a persistent or NV index handle.\n" msgstr "" #: util/grub-protect.c:1256 #, c-format msgid "--tpm2-nvindex and --tpm2-srk must be different.\n" msgstr "" #: util/grub-protect.c:1263 #, c-format msgid "--tpm2-srk must be a persistent handle, e.g. 0x81000000.\n" msgstr "" #: util/grub-protect.c:1287 #, c-format msgid "--tpm2-asymmetric is invalid when --action is 'remove'.\n" msgstr "" #: util/grub-protect.c:1293 #, c-format msgid "--tpm2-bank is invalid when --action is 'remove'.\n" msgstr "" #: util/grub-protect.c:1299 #, c-format msgid "--tpm2-keyfile is invalid when --action is 'remove'.\n" msgstr "" #: util/grub-protect.c:1305 #, c-format msgid "--tpm2-outfile is invalid when --action is 'remove'.\n" msgstr "" #: util/grub-protect.c:1311 #, c-format msgid "--tpm2-pcrs is invalid when --action is 'remove'.\n" msgstr "" #: util/grub-protect.c:1317 #, c-format msgid "missing --tpm2-srk or --tpm2-nvindex for --action 'remove'.\n" msgstr "" #: util/grub-protect.c:1324 #, c-format msgid "" "The TPM2 key protector only supports the following actions: add, remove.\n" msgstr "" #: util/grub-protect.c:1342 #, c-format msgid "--action|-a can only be specified once.\n" msgstr "" #: util/grub-protect.c:1352 #, c-format msgid "'%s' is not a valid action.\n" msgstr "" #: util/grub-protect.c:1362 #, c-format msgid "--protector|-p can only be specified once.\n" msgstr "" #: util/grub-protect.c:1370 #, c-format msgid "'%s' is not a valid protector.\n" msgstr "" #: util/grub-protect.c:1380 #, c-format msgid "--tpm2-device can only be specified once.\n" msgstr "" #: util/grub-protect.c:1391 #, c-format msgid "--tpm2-pcrs can only be specified once.\n" msgstr "" #: util/grub-protect.c:1410 #, c-format msgid "--tpm2-srk can only be specified once.\n" msgstr "" #: util/grub-protect.c:1428 #, c-format msgid "--tpm2-asymmetric can only be specified once.\n" msgstr "" #: util/grub-protect.c:1446 #, c-format msgid "--tpm2-bank can only be specified once.\n" msgstr "" #: util/grub-protect.c:1464 #, c-format msgid "--tpm2-keyfile can only be specified once.\n" msgstr "" #: util/grub-protect.c:1475 #, c-format msgid "--tpm2-outfile can only be specified once.\n" msgstr "" #: util/grub-protect.c:1486 #, c-format msgid "--tpm2-evict can only be specified once.\n" msgstr "" #: util/grub-protect.c:1497 #, c-format msgid "--tpm2-tpm2key can only be specified once.\n" msgstr "" #: util/grub-protect.c:1508 #, c-format msgid "--tpm2-nvindex can only be specified once.\n" msgstr "" #: util/grub-protect.c:1535 #, c-format msgid "--action is mandatory.\n" msgstr "" #: util/grub-protect.c:1545 #, c-format msgid "--protector is mandatory and only 'tpm2' is currently supported.\n" msgstr "" #: util/grub-protect.c:1604 msgid "" "Protect a cleartext key using a GRUB key protector that can retrieve the key " "during boot to unlock fully-encrypted disks automatically." msgstr "" #: util/grub-protect.c:1619 #, c-format msgid "Could not parse arguments.\n" msgstr "" #: util/grub-render-label.c:60 msgid "read text from FILE." msgstr "" #: util/grub-render-label.c:62 msgid "use COLOR for text" msgstr "" #: util/grub-render-label.c:64 msgid "use COLOR for background" msgstr "" #. TRANSLATORS: The result is always stored to file and #. never shown directly, so don't use "show" as synonym for render. Use "create" if #. "render" doesn't translate directly. #: util/grub-render-label.c:69 msgid "set the label to render" msgstr "" #: util/grub-render-label.c:73 msgid "use FILE as font (PF2)." msgstr "" #. TRANSLATORS: This file takes a text and creates a graphical representation of it, #. putting the result into .disk_label file. The result is always stored to file and #. never shown directly, so don't use "show" as synonym for render. Use "create" if #. "render" doesn't translate directly. #: util/grub-render-label.c:136 msgid "Render Apple .disk_label." msgstr "" #: util/grub-render-label.c:158 util/grub-syslinux2cfg.c:169 msgid "Missing arguments\n" msgstr "" #: util/grub-script-check.c:87 msgid "[PATH]" msgstr "" #: util/grub-script-check.c:88 msgid "Checks GRUB script configuration file for syntax errors." msgstr "" #: util/grub-script-check.c:207 #, c-format msgid "Syntax error at line %u\n" msgstr "" #: util/grub-script-check.c:212 #, c-format msgid "Script `%s' contains no commands and will do nothing\n" msgstr "" #: util/grub-setup.c:79 #, c-format msgid "use FILE as the boot image [default=%s]" msgstr "" #: util/grub-setup.c:81 #, c-format msgid "use FILE as the core image [default=%s]" msgstr "" #: util/grub-setup.c:210 msgid "No device is specified.\n" msgstr "" #: util/grub-setup.c:224 msgid "" "Set up images to boot from DEVICE.\n" "\n" "You should not normally run this program directly. Use grub-install instead." msgstr "" #: util/grub-setup.c:228 msgid "DEVICE must be an OS device (e.g. /dev/sda)." msgstr "" #: util/grub-setup.c:297 #, c-format msgid "Invalid device `%s'.\n" msgstr "" #: util/grub-syslinux2cfg.c:64 msgid "root directory as it will be seen on runtime [default=/]." msgstr "" #: util/grub-syslinux2cfg.c:69 msgid "" "current directory of syslinux as it will be seen on runtime [default is " "parent directory of input file]." msgstr "" #: util/grub-syslinux2cfg.c:74 msgid "write output to FILE [default=stdout]." msgstr "" #: util/grub-syslinux2cfg.c:148 msgid "Transform syslinux config into GRUB one." msgstr "" #: util/mkimage.c:704 util/mkimage.c:733 util/mkimage.c:750 msgid "cannot compress the kernel image" msgstr "" #: util/mkimage.c:782 util/mkimage.c:1171 #, c-format msgid "unknown compression %d" msgstr "" #: util/mkimage.c:849 #, c-format msgid "section name %s length is bigger than %lu" msgstr "" #: util/mkimage.c:947 msgid "SBAT data can be added only to EFI or powerpc-ieee1275 images" msgstr "" #: util/mkimage.c:1182 msgid "Decompressor is too big" msgstr "" #: util/mkimage.c:1227 #, c-format msgid "core image is too big (0x%x > 0x%x)" msgstr "" #: util/mkimage.c:1234 #, c-format msgid "kernel image is too big (0x%x > 0x%x)" msgstr "" #: util/mkimage.c:1314 util/mkimage.c:1584 #, c-format msgid "diskboot.img size must be %u bytes" msgstr "" #: util/mkimage.c:1654 msgid "" "fwstart.img doesn't match the known good version. proceed at your own risk" msgstr "" #: util/mkimage.c:1658 util/mkimage.c:1684 msgid "firmware image is too big" msgstr "" #: util/resolve.c:93 #, c-format msgid "invalid line format: %s" msgstr "" #: util/resolve.c:132 #, c-format msgid "line too long, length greater than %zu: module %s" msgstr "" #: util/setup.c:167 msgid "the first sector of the core file is not sector-aligned" msgstr "" #: util/setup.c:177 msgid "non-sector-aligned data is found in the core file" msgstr "" #: util/setup.c:199 msgid "the sectors of the core file are too fragmented" msgstr "" #: util/setup.c:284 #, c-format msgid "the size of `%s' is not %u" msgstr "" #: util/setup.c:294 #, c-format msgid "the size of `%s' is too small" msgstr "" #: util/setup.c:432 msgid "" "Attempting to install GRUB to a disk with multiple partition labels or both " "partition label and filesystem. This is not supported yet." msgstr "" #: util/setup.c:445 #, c-format msgid "unable to identify a filesystem in %s; safety check can't be performed" msgstr "" #. TRANSLATORS: Filesystem may reserve the space just GRUB isn't sure about it. #: util/setup.c:449 #, c-format msgid "" "%s appears to contain a %s filesystem which isn't known to reserve space for " "DOS-style boot. Installing GRUB there could result in FILESYSTEM " "DESTRUCTION if valuable data is overwritten by grub-setup (--skip-fs-probe " "disables this check, use at your own risk)" msgstr "" #. TRANSLATORS: Partition map may reserve the space just GRUB isn't sure about it. #: util/setup.c:462 #, c-format msgid "" "%s appears to contain a %s partition map which isn't known to reserve space " "for DOS-style boot. Installing GRUB there could result in FILESYSTEM " "DESTRUCTION if valuable data is overwritten by grub-setup (--skip-fs-probe " "disables this check, use at your own risk)" msgstr "" #: util/setup.c:469 #, c-format msgid "" "%s appears to contain a %s partition map and LDM which isn't known to be a " "safe combination. Installing GRUB there could result in FILESYSTEM " "DESTRUCTION if valuable data is overwritten by grub-setup (--skip-fs-probe " "disables this check, use at your own risk)" msgstr "" #: util/setup.c:482 msgid "" "Attempting to install GRUB to a partitionless disk or to a partition. This " "is a BAD idea." msgstr "" #: util/setup.c:487 msgid "" "Attempting to install GRUB to a disk with multiple partition labels. This " "is not supported yet." msgstr "" #: util/setup.c:493 #, c-format msgid "Partition style `%s' doesn't support embedding" msgstr "" #: util/setup.c:500 #, c-format msgid "File system `%s' doesn't support embedding" msgstr "" #: util/setup.c:541 msgid "Your embedding area is unusually small. core.img won't fit in it." msgstr "" #: util/setup.c:563 util/setup.c:729 util/setup.c:847 msgid "no terminator in the core image" msgstr "" #: util/setup.c:626 msgid "core.img version mismatch" msgstr "" #: util/setup.c:679 msgid "" "embedding is not possible, but this is required for RAID and LVM install" msgstr "" #: util/setup.c:686 #, c-format msgid "can't determine filesystem on %s" msgstr "" #: util/setup.c:689 #, c-format msgid "filesystem `%s' doesn't support blocklists" msgstr "" #. TRANSLATORS: cross-disk refers to /boot being on one disk #. but MBR on another. #: util/setup.c:698 msgid "embedding is not possible, but this is required for cross-disk install" msgstr "" #: util/setup.c:704 msgid "" "Embedding is not possible. GRUB can only be installed in this setup by " "using blocklists. However, blocklists are UNRELIABLE and their use is " "discouraged." msgstr "" #. TRANSLATORS: Here GRUB refuses to continue with blocklist install. #: util/setup.c:709 msgid "will not proceed with blocklists" msgstr "" #: util/setup.c:820 util/setup.c:840 msgid "blocklists are invalid" msgstr "" #: util/setup.c:850 msgid "blocklists are incomplete" msgstr "" #: util/grub-kbdcomp.in:24 msgid "Usage: %s -o OUTPUT CKBMAP_ARGUMENTS...\\n" msgstr "" #: util/grub-kbdcomp.in:25 msgid "Make GRUB keyboard layout file." msgstr "" #: util/grub-kbdcomp.in:27 util/grub-mkconfig.in:61 util/grub-reboot.in:51 #: util/grub-set-default.in:51 msgid "print this message and exit" msgstr "" #: util/grub-kbdcomp.in:28 util/grub-mkconfig.in:62 util/grub-reboot.in:52 #: util/grub-set-default.in:52 msgid "print the version information and exit" msgstr "" #: util/grub-kbdcomp.in:31 msgid "%s generates a keyboard layout for GRUB using ckbcomp\\n" msgstr "" #: util/grub-kbdcomp.in:33 util/grub-mkconfig.in:64 util/grub-reboot.in:64 #: util/grub-set-default.in:58 msgid "Report bugs to ." msgstr "" #: util/grub-kbdcomp.in:41 util/grub-mkconfig.in:72 util/grub-reboot.in:72 #: util/grub-set-default.in:66 msgid "%s: option requires an argument -- `%s'\\n" msgstr "" #: util/grub-mkconfig.in:57 msgid "Usage: %s [OPTION]\\n" msgstr "" #: util/grub-mkconfig.in:58 msgid "Generate a grub config file" msgstr "" #: util/grub-mkconfig.in:60 msgid "output generated config to FILE [default=stdout]" msgstr "" #: util/grub-mkconfig.in:97 util/grub-reboot.in:104 util/grub-set-default.in:98 msgid "Unrecognized option `%s'\\n" msgstr "" #: util/grub-mkconfig.in:121 msgid "%s: You must run this as root\\n" msgstr "" #: util/grub-mkconfig.in:130 msgid "%s: Not found.\\n" msgstr "" #: util/grub-mkconfig.in:266 msgid "Generating grub configuration file ..." msgstr "" #. TRANSLATORS: %s is replaced by filename #: util/grub-mkconfig.in:299 msgid "" "Syntax errors are detected in generated GRUB config file.\n" "Ensure that there are no errors in /etc/default/grub\n" "and /etc/grub.d/* files or please file a bug report with\n" "%s file attached." msgstr "" #: util/grub-mkconfig.in:315 msgid "done" msgstr "" #: util/grub-mkconfig_lib.in:47 msgid "Warning:" msgstr "" #: util/grub-reboot.in:49 util/grub-set-default.in:47 msgid "Usage: %s [OPTION] MENU_ENTRY\\n" msgstr "" #: util/grub-reboot.in:50 msgid "Set the default boot menu entry for GRUB, for the next boot only." msgstr "" #: util/grub-reboot.in:53 util/grub-set-default.in:53 msgid "" "expect GRUB images under the directory DIR/%s instead of the %s directory" msgstr "" #: util/grub-reboot.in:56 msgid "" "MENU_ENTRY is a number, a menu item title or a menu item identifier. Please " "note that menu items in\n" "submenus or sub-submenus require specifying the submenu components and then " "the\n" "menu item component. The titles should be separated using the greater-than\n" "character (>) with no extra spaces. Depending on your shell some characters " "including > may need escaping. More information about this is available\n" "in the GRUB Manual in the section about the 'default' command. " msgstr "" #: util/grub-reboot.in:62 msgid "" "NOTE: In cases where GRUB cannot write to the environment block, such as " "when it is stored on an MDRAID or LVM device, the chosen boot menu entry " "will remain the default even after reboot. " msgstr "" #: util/grub-reboot.in:110 util/grub-set-default.in:104 msgid "More than one menu entry?" msgstr "" #: util/grub-reboot.in:120 util/grub-set-default.in:114 msgid "Menu entry not specified." msgstr "" #: util/grub-reboot.in:143 msgid "%s will remain the default boot entry until manually cleared with:\\n" msgstr "" #: util/grub-set-default.in:48 msgid "Set the default boot menu entry for GRUB." msgstr "" #: util/grub-set-default.in:49 msgid "This requires setting GRUB_DEFAULT=saved in %s/default/grub.\\n" msgstr "" #: util/grub-set-default.in:56 msgid "MENU_ENTRY is a number, a menu item title or a menu item identifier." msgstr "" #: util/grub.d/00_header.in:141 #, c-format msgid "" "Requested serial terminal but GRUB_SERIAL_COMMAND is unspecified. Default " "parameters will be used." msgstr "" #: util/grub.d/00_header.in:232 #, c-format msgid "Found theme: %s\\n" msgstr "" #: util/grub.d/00_header.in:268 #, c-format msgid "Found background: %s\\n" msgstr "" #: util/grub.d/00_header.in:273 #, c-format msgid "Unsupported image format" msgstr "" #: util/grub.d/00_header.in:292 #, c-format msgid "" "Setting GRUB_TIMEOUT to a non-zero value when GRUB_HIDDEN_TIMEOUT is set is " "no longer supported." msgstr "" #: util/grub.d/10_hurd.in:48 #, c-format msgid "Found GNU Mach: %s" msgstr "" #: util/grub.d/10_hurd.in:63 #, c-format msgid "Found Hurd module: %s" msgstr "" #: util/grub.d/10_hurd.in:102 #, c-format msgid "Some Hurd stuff found, but not enough to boot." msgstr "" #: util/grub.d/10_hurd.in:116 #, c-format msgid "%s, with Hurd %s (recovery mode)" msgstr "" #: util/grub.d/10_hurd.in:119 #, c-format msgid "%s, with Hurd %s" msgstr "" #: util/grub.d/10_hurd.in:125 util/grub.d/10_kfreebsd.in:87 #, c-format #: util/grub.d/10_linux.in:105 util/grub.d/10_netbsd.in:113 #, c-format #: util/grub.d/20_linux_xen.in:131 util/grub.d/30_os-prober.in:306 #, c-format msgid "" "Please don't use old title `%s' for GRUB_DEFAULT, use `%s' (for versions " "before 2.00) or `%s' (for 2.00 or later)" msgstr "" #: util/grub.d/10_hurd.in:137 #, c-format msgid "Loading GNU Mach ..." msgstr "" #: util/grub.d/10_hurd.in:155 #, c-format msgid "Loading the Hurd ..." msgstr "" #. TRANSLATORS: %s is replaced with an OS name #: util/grub.d/10_hurd.in:259 util/grub.d/10_kfreebsd.in:243 #, c-format #: util/grub.d/10_linux.in:296 util/grub.d/10_netbsd.in:182 #, c-format #: util/grub.d/30_os-prober.in:282 #, c-format msgid "Advanced options for %s" msgstr "" #: util/grub.d/10_illumos.in:40 #, c-format msgid "Loading kernel of Illumos ..." msgstr "" #: util/grub.d/10_kfreebsd.in:79 #, c-format msgid "%s, with kFreeBSD %s (recovery mode)" msgstr "" #: util/grub.d/10_kfreebsd.in:81 #, c-format msgid "%s, with kFreeBSD %s" msgstr "" #: util/grub.d/10_kfreebsd.in:101 #, c-format msgid "Loading kernel of FreeBSD %s ..." msgstr "" #: util/grub.d/10_kfreebsd.in:174 #, c-format msgid "Found kernel of FreeBSD: %s\\n" msgstr "" #: util/grub.d/10_kfreebsd.in:223 #, c-format msgid "Found kernel module directory: %s\\n" msgstr "" #: util/grub.d/10_linux.in:97 #, c-format msgid "%s, with Linux %s (recovery mode)" msgstr "" #: util/grub.d/10_linux.in:99 #, c-format msgid "%s, with Linux %s" msgstr "" #: util/grub.d/10_linux.in:143 util/grub.d/20_linux_xen.in:147 #, c-format msgid "Loading Linux %s ..." msgstr "" #. TRANSLATORS: ramdisk isn't identifier. Should be translated. #: util/grub.d/10_linux.in:150 util/grub.d/20_linux_xen.in:161 #, c-format msgid "Loading initial ramdisk ..." msgstr "" #: util/grub.d/10_linux.in:209 util/grub.d/20_linux_xen.in:289 #, c-format msgid "Found linux image: %s\\n" msgstr "" #: util/grub.d/10_linux.in:250 util/grub.d/20_linux_xen.in:325 #, c-format msgid "Found initrd image: %s\\n" msgstr "" #: util/grub.d/10_netbsd.in:105 #, c-format msgid "%s, with kernel %s (via %s, recovery mode)" msgstr "" #: util/grub.d/10_netbsd.in:107 #, c-format msgid "%s, with kernel %s (via %s)" msgstr "" #: util/grub.d/10_netbsd.in:164 #, c-format msgid "Found NetBSD kernel: %s\\n" msgstr "" #: util/grub.d/10_windows.in:70 #, c-format msgid "Windows Vista/7 (loader)" msgstr "" #: util/grub.d/10_windows.in:74 #, c-format msgid "Windows NT/2000/XP (loader)" msgstr "" #: util/grub.d/10_windows.in:85 #, c-format msgid "Found %s on %s (%s)\\n" msgstr "" #. TRANSLATORS: it refers to kernel architecture (32-bit) #: util/grub.d/10_xnu.in:32 util/grub.d/30_os-prober.in:50 #, c-format msgid "(32-bit)" msgstr "" #. TRANSLATORS: it refers to kernel architecture (64-bit) #: util/grub.d/10_xnu.in:35 util/grub.d/30_os-prober.in:53 #, c-format msgid "(64-bit)" msgstr "" #. TRANSLATORS: it refers on the OS residing on device %s #: util/grub.d/10_xnu.in:38 util/grub.d/30_os-prober.in:56 #, c-format #: util/grub.d/30_os-prober.in:163 util/grub.d/30_os-prober.in:198 #, c-format #: util/grub.d/30_os-prober.in:242 util/grub.d/30_os-prober.in:322 #, c-format msgid "(on %s)" msgstr "" #: util/grub.d/20_linux_xen.in:115 #, c-format msgid "%s (XSM enabled)" msgstr "" #: util/grub.d/20_linux_xen.in:123 #, c-format msgid "%s, with Xen %s and Linux %s (recovery mode)" msgstr "" #: util/grub.d/20_linux_xen.in:125 #, c-format msgid "%s, with Xen %s and Linux %s" msgstr "" #: util/grub.d/20_linux_xen.in:135 #, c-format msgid "%s, with Xen hypervisor" msgstr "" #: util/grub.d/20_linux_xen.in:146 #, c-format msgid "Loading Xen %s ..." msgstr "" #: util/grub.d/20_linux_xen.in:172 #, c-format msgid "Loading XSM policy ..." msgstr "" #: util/grub.d/20_linux_xen.in:265 util/grub.d/20_linux_xen.in:358 #, c-format msgid "Xen hypervisor, version %s" msgstr "" #. TRANSLATORS: %s is replaced with an OS name #: util/grub.d/20_linux_xen.in:357 #, c-format msgid "Advanced options for %s (with Xen hypervisor)" msgstr "" #: util/grub.d/30_os-prober.in:30 #, c-format msgid "" "os-prober will not be executed to detect other bootable partitions." "\\nSystems on them will not be added to the GRUB boot configuration.\\nCheck " "GRUB_DISABLE_OS_PROBER documentation entry." msgstr "" #: util/grub.d/30_os-prober.in:39 #, c-format msgid "" "os-prober will be executed to detect other bootable partitions.\\nIts output " "will be used to detect bootable binaries on them and create new boot entries." msgstr "" #: util/grub.d/30_os-prober.in:121 #, c-format msgid "" "GRUB_OS_PROBER_SKIP_LIST contains deprecated @/dev/* notation. The @/" "dev/* suffix is ignored." msgstr "" #: util/grub.d/30_os-prober.in:158 #, c-format msgid "Found %s on %s\\n" msgstr "" #. TRANSLATORS: %s is replaced by OS name. #: util/grub.d/30_os-prober.in:360 #, c-format msgid "%s is not yet supported by grub-mkconfig.\\n" msgstr "" #: util/grub.d/30_uefi-firmware.in:31 #, c-format msgid "Adding boot menu entry for UEFI Firmware Settings ...\\n" msgstr "" grub-2.14~git20250718.0e36779/po/POTFILES.in0000644000175000017500000014157115036452440014205 00000000000000./config-util.h ./config.h ./grub-core/boot/decompressor/minilib.c ./grub-core/boot/decompressor/none.c ./grub-core/boot/decompressor/xz.c ./grub-core/bus/bonito.c ./grub-core/bus/cs5536.c ./grub-core/bus/emu/pci.c ./grub-core/bus/fdt.c ./grub-core/bus/i386/ieee1275/pci.c ./grub-core/bus/pci.c ./grub-core/bus/spi/rk3288_spi.c ./grub-core/bus/usb/ehci-fdt.c ./grub-core/bus/usb/ehci-pci.c ./grub-core/bus/usb/ehci.c ./grub-core/bus/usb/ohci.c ./grub-core/bus/usb/serial/common.c ./grub-core/bus/usb/serial/ftdi.c ./grub-core/bus/usb/serial/pl2303.c ./grub-core/bus/usb/serial/usbdebug_late.c ./grub-core/bus/usb/uhci.c ./grub-core/bus/usb/usb.c ./grub-core/bus/usb/usbhub.c ./grub-core/bus/usb/usbtrans.c ./grub-core/commands/acpi.c ./grub-core/commands/acpihalt.c ./grub-core/commands/arc/lsdev.c ./grub-core/commands/bli.c ./grub-core/commands/blocklist.c ./grub-core/commands/boot.c ./grub-core/commands/boottime.c ./grub-core/commands/cacheinfo.c ./grub-core/commands/cat.c ./grub-core/commands/cmp.c ./grub-core/commands/configfile.c ./grub-core/commands/date.c ./grub-core/commands/echo.c ./grub-core/commands/efi/efifwsetup.c ./grub-core/commands/efi/efitextmode.c ./grub-core/commands/efi/fixvideo.c ./grub-core/commands/efi/loadbios.c ./grub-core/commands/efi/lsefi.c ./grub-core/commands/efi/lsefimmap.c ./grub-core/commands/efi/lsefisystab.c ./grub-core/commands/efi/lssal.c ./grub-core/commands/efi/smbios.c ./grub-core/commands/efi/tpm.c ./grub-core/commands/eval.c ./grub-core/commands/extcmd.c ./grub-core/commands/file.c ./grub-core/commands/file32.c ./grub-core/commands/file64.c ./grub-core/commands/fileXX.c ./grub-core/commands/gptsync.c ./grub-core/commands/halt.c ./grub-core/commands/hashsum.c ./grub-core/commands/hdparm.c ./grub-core/commands/help.c ./grub-core/commands/hexdump.c ./grub-core/commands/i386/cmosdump.c ./grub-core/commands/i386/cmostest.c ./grub-core/commands/i386/coreboot/cb_timestamps.c ./grub-core/commands/i386/coreboot/cbls.c ./grub-core/commands/i386/cpuid.c ./grub-core/commands/i386/pc/drivemap.c ./grub-core/commands/i386/pc/halt.c ./grub-core/commands/i386/pc/lsapm.c ./grub-core/commands/i386/pc/play.c ./grub-core/commands/i386/pc/sendkey.c ./grub-core/commands/i386/pc/smbios.c ./grub-core/commands/i386/rdmsr.c ./grub-core/commands/i386/wrmsr.c ./grub-core/commands/ieee1275/ibmvtpm.c ./grub-core/commands/ieee1275/suspend.c ./grub-core/commands/iorw.c ./grub-core/commands/keylayouts.c ./grub-core/commands/keystatus.c ./grub-core/commands/legacycfg.c ./grub-core/commands/loadenv.c ./grub-core/commands/ls.c ./grub-core/commands/lsacpi.c ./grub-core/commands/lsmmap.c ./grub-core/commands/lspci.c ./grub-core/commands/macbless.c ./grub-core/commands/memrw.c ./grub-core/commands/memtools.c ./grub-core/commands/menuentry.c ./grub-core/commands/minicmd.c ./grub-core/commands/mips/loongson/lsspd.c ./grub-core/commands/nativedisk.c ./grub-core/commands/parttool.c ./grub-core/commands/password.c ./grub-core/commands/password_pbkdf2.c ./grub-core/commands/pcidump.c ./grub-core/commands/pgp.c ./grub-core/commands/probe.c ./grub-core/commands/read.c ./grub-core/commands/reboot.c ./grub-core/commands/regexp.c ./grub-core/commands/search.c ./grub-core/commands/search_file.c ./grub-core/commands/search_label.c ./grub-core/commands/search_uuid.c ./grub-core/commands/search_wrap.c ./grub-core/commands/setpci.c ./grub-core/commands/sleep.c ./grub-core/commands/smbios.c ./grub-core/commands/syslinuxcfg.c ./grub-core/commands/terminal.c ./grub-core/commands/test.c ./grub-core/commands/testload.c ./grub-core/commands/testspeed.c ./grub-core/commands/time.c ./grub-core/commands/tpm.c ./grub-core/commands/tpm2_key_protector/args.c ./grub-core/commands/tpm2_key_protector/module.c ./grub-core/commands/tpm2_key_protector/tpm2.h ./grub-core/commands/tpm2_key_protector/tpm2_args.h ./grub-core/commands/tpm2_key_protector/tpm2key.c ./grub-core/commands/tpm2_key_protector/tpm2key.h ./grub-core/commands/tpm2_key_protector/tpm2key_asn1_tab.c ./grub-core/commands/tr.c ./grub-core/commands/true.c ./grub-core/commands/usbtest.c ./grub-core/commands/videoinfo.c ./grub-core/commands/videotest.c ./grub-core/commands/wildcard.c ./grub-core/commands/xen/lsxen.c ./grub-core/commands/xnu_uuid.c ./grub-core/disk/AFSplitter.c ./grub-core/disk/ahci.c ./grub-core/disk/arc/arcdisk.c ./grub-core/disk/ata.c ./grub-core/disk/cryptodisk.c ./grub-core/disk/diskfilter.c ./grub-core/disk/dmraid_nvidia.c ./grub-core/disk/efi/efidisk.c ./grub-core/disk/geli.c ./grub-core/disk/host.c ./grub-core/disk/i386/pc/biosdisk.c ./grub-core/disk/ieee1275/nand.c ./grub-core/disk/ieee1275/obdisk.c ./grub-core/disk/ieee1275/ofdisk.c ./grub-core/disk/key_protector.c ./grub-core/disk/ldm.c ./grub-core/disk/loopback.c ./grub-core/disk/luks.c ./grub-core/disk/luks2.c ./grub-core/disk/lvm.c ./grub-core/disk/mdraid1x_linux.c ./grub-core/disk/mdraid_linux.c ./grub-core/disk/mdraid_linux_be.c ./grub-core/disk/memdisk.c ./grub-core/disk/pata.c ./grub-core/disk/plainmount.c ./grub-core/disk/raid5_recover.c ./grub-core/disk/raid6_recover.c ./grub-core/disk/scsi.c ./grub-core/disk/uboot/ubootdisk.c ./grub-core/disk/usbms.c ./grub-core/disk/xen/xendisk.c ./grub-core/efiemu/i386/coredetect.c ./grub-core/efiemu/i386/loadcore32.c ./grub-core/efiemu/i386/loadcore64.c ./grub-core/efiemu/i386/nocfgtables.c ./grub-core/efiemu/i386/pc/cfgtables.c ./grub-core/efiemu/loadcore.c ./grub-core/efiemu/loadcore32.c ./grub-core/efiemu/loadcore64.c ./grub-core/efiemu/loadcore_common.c ./grub-core/efiemu/main.c ./grub-core/efiemu/mm.c ./grub-core/efiemu/pnvram.c ./grub-core/efiemu/prepare.c ./grub-core/efiemu/prepare32.c ./grub-core/efiemu/prepare64.c ./grub-core/efiemu/runtime/config.h ./grub-core/efiemu/runtime/efiemu.c ./grub-core/efiemu/symbols.c ./grub-core/font/font.c ./grub-core/font/font_cmd.c ./grub-core/fs/affs.c ./grub-core/fs/afs.c ./grub-core/fs/archelp.c ./grub-core/fs/bfs.c ./grub-core/fs/btrfs.c ./grub-core/fs/cbfs.c ./grub-core/fs/cpio.c ./grub-core/fs/cpio_be.c ./grub-core/fs/cpio_common.c ./grub-core/fs/erofs.c ./grub-core/fs/exfat.c ./grub-core/fs/ext2.c ./grub-core/fs/f2fs.c ./grub-core/fs/fat.c ./grub-core/fs/fshelp.c ./grub-core/fs/hfs.c ./grub-core/fs/hfsplus.c ./grub-core/fs/hfspluscomp.c ./grub-core/fs/iso9660.c ./grub-core/fs/jfs.c ./grub-core/fs/minix.c ./grub-core/fs/minix2.c ./grub-core/fs/minix2_be.c ./grub-core/fs/minix3.c ./grub-core/fs/minix3_be.c ./grub-core/fs/minix_be.c ./grub-core/fs/newc.c ./grub-core/fs/nilfs2.c ./grub-core/fs/ntfs.c ./grub-core/fs/ntfscomp.c ./grub-core/fs/odc.c ./grub-core/fs/proc.c ./grub-core/fs/reiserfs.c ./grub-core/fs/romfs.c ./grub-core/fs/sfs.c ./grub-core/fs/squash4.c ./grub-core/fs/tar.c ./grub-core/fs/udf.c ./grub-core/fs/ufs.c ./grub-core/fs/ufs2.c ./grub-core/fs/ufs_be.c ./grub-core/fs/xfs.c ./grub-core/fs/zfs/zfs.c ./grub-core/fs/zfs/zfs_fletcher.c ./grub-core/fs/zfs/zfs_lz4.c ./grub-core/fs/zfs/zfs_lzjb.c ./grub-core/fs/zfs/zfs_sha256.c ./grub-core/fs/zfs/zfscrypt.c ./grub-core/fs/zfs/zfsinfo.c ./grub-core/gdb/cstub.c ./grub-core/gdb/gdb.c ./grub-core/gdb/i386/idt.c ./grub-core/gdb/i386/signal.c ./grub-core/gentrigtables.c ./grub-core/gettext/gettext.c ./grub-core/gfxmenu/font.c ./grub-core/gfxmenu/gfxmenu.c ./grub-core/gfxmenu/gui_box.c ./grub-core/gfxmenu/gui_canvas.c ./grub-core/gfxmenu/gui_circular_progress.c ./grub-core/gfxmenu/gui_image.c ./grub-core/gfxmenu/gui_label.c ./grub-core/gfxmenu/gui_list.c ./grub-core/gfxmenu/gui_progress_bar.c ./grub-core/gfxmenu/gui_string_util.c ./grub-core/gfxmenu/gui_util.c ./grub-core/gfxmenu/icon_manager.c ./grub-core/gfxmenu/theme_loader.c ./grub-core/gfxmenu/view.c ./grub-core/gfxmenu/widget-box.c ./grub-core/grub_script.tab.c ./grub-core/grub_script.tab.h ./grub-core/grub_script.yy.c ./grub-core/grub_script.yy.h ./grub-core/hello/hello.c ./grub-core/hook/datehook.c ./grub-core/io/bufio.c ./grub-core/io/gzio.c ./grub-core/io/lzopio.c ./grub-core/io/offset.c ./grub-core/io/xzio.c ./grub-core/kern/acpi.c ./grub-core/kern/arm/cache.c ./grub-core/kern/arm/coreboot/cbtable.c ./grub-core/kern/arm/coreboot/dma.c ./grub-core/kern/arm/coreboot/init.c ./grub-core/kern/arm/coreboot/timer.c ./grub-core/kern/arm/dl.c ./grub-core/kern/arm/dl_helper.c ./grub-core/kern/arm/efi/init.c ./grub-core/kern/arm/uboot/init.c ./grub-core/kern/arm64/cache.c ./grub-core/kern/arm64/dl.c ./grub-core/kern/arm64/dl_helper.c ./grub-core/kern/arm64/efi/init.c ./grub-core/kern/buffer.c ./grub-core/kern/command.c ./grub-core/kern/compiler-rt.c ./grub-core/kern/coreboot/cbtable.c ./grub-core/kern/coreboot/mmap.c ./grub-core/kern/corecmd.c ./grub-core/kern/device.c ./grub-core/kern/disk.c ./grub-core/kern/disk_common.c ./grub-core/kern/dl.c ./grub-core/kern/efi/acpi.c ./grub-core/kern/efi/debug.c ./grub-core/kern/efi/efi.c ./grub-core/kern/efi/fdt.c ./grub-core/kern/efi/init.c ./grub-core/kern/efi/mm.c ./grub-core/kern/efi/sb.c ./grub-core/kern/elf.c ./grub-core/kern/elfXX.c ./grub-core/kern/emu/argp_common.c ./grub-core/kern/emu/cache.c ./grub-core/kern/emu/full.c ./grub-core/kern/emu/hostdisk.c ./grub-core/kern/emu/hostfs.c ./grub-core/kern/emu/lite.c ./grub-core/kern/emu/main.c ./grub-core/kern/emu/misc.c ./grub-core/kern/emu/mm.c ./grub-core/kern/emu/time.c ./grub-core/kern/env.c ./grub-core/kern/err.c ./grub-core/kern/file.c ./grub-core/kern/fs.c ./grub-core/kern/generic/millisleep.c ./grub-core/kern/generic/rtc_get_time_ms.c ./grub-core/kern/i386/coreboot/cbtable.c ./grub-core/kern/i386/coreboot/init.c ./grub-core/kern/i386/dl.c ./grub-core/kern/i386/efi/init.c ./grub-core/kern/i386/efi/tsc.c ./grub-core/kern/i386/multiboot_mmap.c ./grub-core/kern/i386/pc/acpi.c ./grub-core/kern/i386/pc/init.c ./grub-core/kern/i386/pc/mmap.c ./grub-core/kern/i386/qemu/init.c ./grub-core/kern/i386/qemu/mmap.c ./grub-core/kern/i386/tsc.c ./grub-core/kern/i386/tsc_pit.c ./grub-core/kern/i386/tsc_pmtimer.c ./grub-core/kern/i386/xen/pvh.c ./grub-core/kern/i386/xen/tsc.c ./grub-core/kern/ia64/cache.c ./grub-core/kern/ia64/dl.c ./grub-core/kern/ia64/dl_helper.c ./grub-core/kern/ia64/efi/init.c ./grub-core/kern/ieee1275/cmain.c ./grub-core/kern/ieee1275/ieee1275.c ./grub-core/kern/ieee1275/init.c ./grub-core/kern/ieee1275/mmap.c ./grub-core/kern/ieee1275/openfw.c ./grub-core/kern/list.c ./grub-core/kern/lockdown.c ./grub-core/kern/loongarch64/cache.c ./grub-core/kern/loongarch64/dl.c ./grub-core/kern/loongarch64/dl_helper.c ./grub-core/kern/loongarch64/efi/init.c ./grub-core/kern/main.c ./grub-core/kern/mips/arc/init.c ./grub-core/kern/mips/dl.c ./grub-core/kern/mips/init.c ./grub-core/kern/mips/loongson/init.c ./grub-core/kern/mips/qemu_mips/init.c ./grub-core/kern/misc.c ./grub-core/kern/mm.c ./grub-core/kern/parser.c ./grub-core/kern/partition.c ./grub-core/kern/powerpc/dl.c ./grub-core/kern/rescue_parser.c ./grub-core/kern/rescue_reader.c ./grub-core/kern/riscv/cache.c ./grub-core/kern/riscv/dl.c ./grub-core/kern/riscv/efi/init.c ./grub-core/kern/sparc64/dl.c ./grub-core/kern/sparc64/ieee1275/ieee1275.c ./grub-core/kern/term.c ./grub-core/kern/time.c ./grub-core/kern/uboot/hw.c ./grub-core/kern/uboot/init.c ./grub-core/kern/uboot/uboot.c ./grub-core/kern/verifiers.c ./grub-core/kern/vga_init.c ./grub-core/kern/x86_64/dl.c ./grub-core/kern/xen/init.c ./grub-core/lib/LzFind.c ./grub-core/lib/LzmaDec.c ./grub-core/lib/LzmaEnc.c ./grub-core/lib/adler32.c ./grub-core/lib/arc/datetime.c ./grub-core/lib/arg.c ./grub-core/lib/b64dec.c ./grub-core/lib/backtrace.c ./grub-core/lib/cmdline.c ./grub-core/lib/cmos_datetime.c ./grub-core/lib/crc.c ./grub-core/lib/crc64.c ./grub-core/lib/crypto.c ./grub-core/lib/datetime.c ./grub-core/lib/disk.c ./grub-core/lib/division.c ./grub-core/lib/dummy/datetime.c ./grub-core/lib/dummy/halt.c ./grub-core/lib/dummy/reboot.c ./grub-core/lib/efi/datetime.c ./grub-core/lib/efi/halt.c ./grub-core/lib/efi/relocator.c ./grub-core/lib/efi/tcg2.c ./grub-core/lib/emu/halt.c ./grub-core/lib/envblk.c ./grub-core/lib/fake_module.c ./grub-core/lib/fdt.c ./grub-core/lib/getline.c ./grub-core/lib/gpgrt-int.h ./grub-core/lib/hexdump.c ./grub-core/lib/i386/backtrace.c ./grub-core/lib/i386/halt.c ./grub-core/lib/i386/pc/biosnum.c ./grub-core/lib/i386/pc/vesa_modes_table.c ./grub-core/lib/i386/random.c ./grub-core/lib/i386/reboot.c ./grub-core/lib/i386/relocator.c ./grub-core/lib/i386/relocator_common_c.c ./grub-core/lib/ieee1275/cmos.c ./grub-core/lib/ieee1275/datetime.c ./grub-core/lib/ieee1275/halt.c ./grub-core/lib/ieee1275/reboot.c ./grub-core/lib/ieee1275/relocator.c ./grub-core/lib/ieee1275/tcg2.c ./grub-core/lib/json/jsmn.h ./grub-core/lib/json/json.c ./grub-core/lib/json/json.h ./grub-core/lib/legacy_parse.c ./grub-core/lib/libgcrypt/cipher/arcfour.c ./grub-core/lib/libgcrypt/cipher/aria.c ./grub-core/lib/libgcrypt/cipher/asm-common-aarch64.h ./grub-core/lib/libgcrypt/cipher/asm-common-amd64.h ./grub-core/lib/libgcrypt/cipher/asm-common-i386.h ./grub-core/lib/libgcrypt/cipher/asm-common-s390x.h ./grub-core/lib/libgcrypt/cipher/asm-inline-s390x.h ./grub-core/lib/libgcrypt/cipher/asm-poly1305-aarch64.h ./grub-core/lib/libgcrypt/cipher/asm-poly1305-amd64.h ./grub-core/lib/libgcrypt/cipher/asm-poly1305-s390x.h ./grub-core/lib/libgcrypt/cipher/bithelp.h ./grub-core/lib/libgcrypt/cipher/blake2.c ./grub-core/lib/libgcrypt/cipher/blowfish.c ./grub-core/lib/libgcrypt/cipher/bufhelp.h ./grub-core/lib/libgcrypt/cipher/bulkhelp.h ./grub-core/lib/libgcrypt/cipher/camellia-aarch64-ce.c ./grub-core/lib/libgcrypt/cipher/camellia-aesni-avx2-amd64.h ./grub-core/lib/libgcrypt/cipher/camellia-glue.c ./grub-core/lib/libgcrypt/cipher/camellia-ppc8le.c ./grub-core/lib/libgcrypt/cipher/camellia-ppc9le.c ./grub-core/lib/libgcrypt/cipher/camellia-simd128.h ./grub-core/lib/libgcrypt/cipher/camellia.c ./grub-core/lib/libgcrypt/cipher/camellia.h ./grub-core/lib/libgcrypt/cipher/cast5.c ./grub-core/lib/libgcrypt/cipher/chacha20-ppc.c ./grub-core/lib/libgcrypt/cipher/chacha20.c ./grub-core/lib/libgcrypt/cipher/cipher-aeswrap.c ./grub-core/lib/libgcrypt/cipher/cipher-cbc.c ./grub-core/lib/libgcrypt/cipher/cipher-ccm.c ./grub-core/lib/libgcrypt/cipher/cipher-cfb.c ./grub-core/lib/libgcrypt/cipher/cipher-cmac.c ./grub-core/lib/libgcrypt/cipher/cipher-ctr.c ./grub-core/lib/libgcrypt/cipher/cipher-eax.c ./grub-core/lib/libgcrypt/cipher/cipher-gcm-intel-pclmul.c ./grub-core/lib/libgcrypt/cipher/cipher-gcm-ppc.c ./grub-core/lib/libgcrypt/cipher/cipher-gcm-siv.c ./grub-core/lib/libgcrypt/cipher/cipher-gcm.c ./grub-core/lib/libgcrypt/cipher/cipher-internal.h ./grub-core/lib/libgcrypt/cipher/cipher-ocb.c ./grub-core/lib/libgcrypt/cipher/cipher-ofb.c ./grub-core/lib/libgcrypt/cipher/cipher-poly1305.c ./grub-core/lib/libgcrypt/cipher/cipher-siv.c ./grub-core/lib/libgcrypt/cipher/cipher-xts.c ./grub-core/lib/libgcrypt/cipher/cipher.c ./grub-core/lib/libgcrypt/cipher/crc-armv8-ce.c ./grub-core/lib/libgcrypt/cipher/crc-intel-pclmul.c ./grub-core/lib/libgcrypt/cipher/crc-ppc.c ./grub-core/lib/libgcrypt/cipher/crc.c ./grub-core/lib/libgcrypt/cipher/des.c ./grub-core/lib/libgcrypt/cipher/dsa-common.c ./grub-core/lib/libgcrypt/cipher/dsa.c ./grub-core/lib/libgcrypt/cipher/ecc-common.h ./grub-core/lib/libgcrypt/cipher/ecc-curves.c ./grub-core/lib/libgcrypt/cipher/ecc-ecdh.c ./grub-core/lib/libgcrypt/cipher/ecc-ecdsa.c ./grub-core/lib/libgcrypt/cipher/ecc-eddsa.c ./grub-core/lib/libgcrypt/cipher/ecc-gost.c ./grub-core/lib/libgcrypt/cipher/ecc-misc.c ./grub-core/lib/libgcrypt/cipher/ecc-sm2.c ./grub-core/lib/libgcrypt/cipher/ecc.c ./grub-core/lib/libgcrypt/cipher/elgamal.c ./grub-core/lib/libgcrypt/cipher/gost-s-box.c ./grub-core/lib/libgcrypt/cipher/gost-sb.h ./grub-core/lib/libgcrypt/cipher/gost.h ./grub-core/lib/libgcrypt/cipher/gost28147.c ./grub-core/lib/libgcrypt/cipher/gostr3411-94.c ./grub-core/lib/libgcrypt/cipher/hash-common.c ./grub-core/lib/libgcrypt/cipher/hash-common.h ./grub-core/lib/libgcrypt/cipher/idea.c ./grub-core/lib/libgcrypt/cipher/kdf-internal.h ./grub-core/lib/libgcrypt/cipher/kdf.c ./grub-core/lib/libgcrypt/cipher/keccak.c ./grub-core/lib/libgcrypt/cipher/keccak_permute_32.h ./grub-core/lib/libgcrypt/cipher/keccak_permute_64.h ./grub-core/lib/libgcrypt/cipher/kem-ecc.c ./grub-core/lib/libgcrypt/cipher/kem-ecc.h ./grub-core/lib/libgcrypt/cipher/kem.c ./grub-core/lib/libgcrypt/cipher/kyber-common.c ./grub-core/lib/libgcrypt/cipher/kyber-kdep.c ./grub-core/lib/libgcrypt/cipher/kyber.c ./grub-core/lib/libgcrypt/cipher/kyber.h ./grub-core/lib/libgcrypt/cipher/mac-cmac.c ./grub-core/lib/libgcrypt/cipher/mac-gmac.c ./grub-core/lib/libgcrypt/cipher/mac-hmac.c ./grub-core/lib/libgcrypt/cipher/mac-internal.h ./grub-core/lib/libgcrypt/cipher/mac-poly1305.c ./grub-core/lib/libgcrypt/cipher/mac.c ./grub-core/lib/libgcrypt/cipher/mceliece6688128f.c ./grub-core/lib/libgcrypt/cipher/mceliece6688128f.h ./grub-core/lib/libgcrypt/cipher/md.c ./grub-core/lib/libgcrypt/cipher/md4.c ./grub-core/lib/libgcrypt/cipher/md5.c ./grub-core/lib/libgcrypt/cipher/poly1305-internal.h ./grub-core/lib/libgcrypt/cipher/poly1305.c ./grub-core/lib/libgcrypt/cipher/primegen.c ./grub-core/lib/libgcrypt/cipher/pubkey-internal.h ./grub-core/lib/libgcrypt/cipher/pubkey-util.c ./grub-core/lib/libgcrypt/cipher/pubkey.c ./grub-core/lib/libgcrypt/cipher/rfc2268.c ./grub-core/lib/libgcrypt/cipher/rijndael-aesni.c ./grub-core/lib/libgcrypt/cipher/rijndael-armv8-ce.c ./grub-core/lib/libgcrypt/cipher/rijndael-internal.h ./grub-core/lib/libgcrypt/cipher/rijndael-p10le.c ./grub-core/lib/libgcrypt/cipher/rijndael-padlock.c ./grub-core/lib/libgcrypt/cipher/rijndael-ppc-common.h ./grub-core/lib/libgcrypt/cipher/rijndael-ppc-functions.h ./grub-core/lib/libgcrypt/cipher/rijndael-ppc.c ./grub-core/lib/libgcrypt/cipher/rijndael-ppc9le.c ./grub-core/lib/libgcrypt/cipher/rijndael-s390x.c ./grub-core/lib/libgcrypt/cipher/rijndael-ssse3-amd64.c ./grub-core/lib/libgcrypt/cipher/rijndael-tables.h ./grub-core/lib/libgcrypt/cipher/rijndael-vaes-i386.c ./grub-core/lib/libgcrypt/cipher/rijndael-vaes.c ./grub-core/lib/libgcrypt/cipher/rijndael.c ./grub-core/lib/libgcrypt/cipher/rmd160.c ./grub-core/lib/libgcrypt/cipher/rsa-common.c ./grub-core/lib/libgcrypt/cipher/rsa.c ./grub-core/lib/libgcrypt/cipher/salsa20.c ./grub-core/lib/libgcrypt/cipher/scrypt.c ./grub-core/lib/libgcrypt/cipher/seed.c ./grub-core/lib/libgcrypt/cipher/serpent-avx512-x86.c ./grub-core/lib/libgcrypt/cipher/serpent.c ./grub-core/lib/libgcrypt/cipher/sha1-intel-shaext.c ./grub-core/lib/libgcrypt/cipher/sha1.c ./grub-core/lib/libgcrypt/cipher/sha1.h ./grub-core/lib/libgcrypt/cipher/sha256-intel-shaext.c ./grub-core/lib/libgcrypt/cipher/sha256-ppc.c ./grub-core/lib/libgcrypt/cipher/sha256.c ./grub-core/lib/libgcrypt/cipher/sha512-ppc.c ./grub-core/lib/libgcrypt/cipher/sha512-ssse3-i386.c ./grub-core/lib/libgcrypt/cipher/sha512.c ./grub-core/lib/libgcrypt/cipher/sm3.c ./grub-core/lib/libgcrypt/cipher/sm4-ppc.c ./grub-core/lib/libgcrypt/cipher/sm4.c ./grub-core/lib/libgcrypt/cipher/sntrup761.c ./grub-core/lib/libgcrypt/cipher/sntrup761.h ./grub-core/lib/libgcrypt/cipher/stribog.c ./grub-core/lib/libgcrypt/cipher/tiger.c ./grub-core/lib/libgcrypt/cipher/twofish.c ./grub-core/lib/libgcrypt/cipher/whirlpool.c ./grub-core/lib/libgcrypt/compat/clock.c ./grub-core/lib/libgcrypt/compat/compat.c ./grub-core/lib/libgcrypt/compat/getpid.c ./grub-core/lib/libgcrypt/compat/libcompat.h ./grub-core/lib/libgcrypt/mpi/aarch64/mpi-asm-defs.h ./grub-core/lib/libgcrypt/mpi/amd64/func_abi.h ./grub-core/lib/libgcrypt/mpi/amd64/mpi-asm-defs.h ./grub-core/lib/libgcrypt/mpi/arm/mpi-asm-defs.h ./grub-core/lib/libgcrypt/mpi/asm-common-aarch64.h ./grub-core/lib/libgcrypt/mpi/asm-common-amd64.h ./grub-core/lib/libgcrypt/mpi/asm-common-i386.h ./grub-core/lib/libgcrypt/mpi/ec-ed25519.c ./grub-core/lib/libgcrypt/mpi/ec-hw-s390x.c ./grub-core/lib/libgcrypt/mpi/ec-inline.h ./grub-core/lib/libgcrypt/mpi/ec-internal.h ./grub-core/lib/libgcrypt/mpi/ec-nist.c ./grub-core/lib/libgcrypt/mpi/ec.c ./grub-core/lib/libgcrypt/mpi/generic/mpi-asm-defs.h ./grub-core/lib/libgcrypt/mpi/generic/mpih-add1.c ./grub-core/lib/libgcrypt/mpi/generic/mpih-lshift.c ./grub-core/lib/libgcrypt/mpi/generic/mpih-mul1.c ./grub-core/lib/libgcrypt/mpi/generic/mpih-mul2.c ./grub-core/lib/libgcrypt/mpi/generic/mpih-mul3.c ./grub-core/lib/libgcrypt/mpi/generic/mpih-rshift.c ./grub-core/lib/libgcrypt/mpi/generic/mpih-sub1.c ./grub-core/lib/libgcrypt/mpi/generic/udiv-w-sdiv.c ./grub-core/lib/libgcrypt/mpi/i386/syntax.h ./grub-core/lib/libgcrypt/mpi/longlong.h ./grub-core/lib/libgcrypt/mpi/m68k/syntax.h ./grub-core/lib/libgcrypt/mpi/mips3/mpi-asm-defs.h ./grub-core/lib/libgcrypt/mpi/mpi-add.c ./grub-core/lib/libgcrypt/mpi/mpi-bit.c ./grub-core/lib/libgcrypt/mpi/mpi-cmp.c ./grub-core/lib/libgcrypt/mpi/mpi-div.c ./grub-core/lib/libgcrypt/mpi/mpi-gcd.c ./grub-core/lib/libgcrypt/mpi/mpi-inline.c ./grub-core/lib/libgcrypt/mpi/mpi-inline.h ./grub-core/lib/libgcrypt/mpi/mpi-internal.h ./grub-core/lib/libgcrypt/mpi/mpi-inv.c ./grub-core/lib/libgcrypt/mpi/mpi-mod.c ./grub-core/lib/libgcrypt/mpi/mpi-mpow.c ./grub-core/lib/libgcrypt/mpi/mpi-mul.c ./grub-core/lib/libgcrypt/mpi/mpi-pow.c ./grub-core/lib/libgcrypt/mpi/mpi-scan.c ./grub-core/lib/libgcrypt/mpi/mpicoder.c ./grub-core/lib/libgcrypt/mpi/mpih-const-time.c ./grub-core/lib/libgcrypt/mpi/mpih-div.c ./grub-core/lib/libgcrypt/mpi/mpih-mul.c ./grub-core/lib/libgcrypt/mpi/mpiutil.c ./grub-core/lib/libgcrypt/mpi/powerpc32/syntax.h ./grub-core/lib/libgcrypt/src/cipher-proto.h ./grub-core/lib/libgcrypt/src/cipher.h ./grub-core/lib/libgcrypt/src/const-time.c ./grub-core/lib/libgcrypt/src/const-time.h ./grub-core/lib/libgcrypt/src/context.c ./grub-core/lib/libgcrypt/src/context.h ./grub-core/lib/libgcrypt/src/dumpsexp.c ./grub-core/lib/libgcrypt/src/ec-context.h ./grub-core/lib/libgcrypt/src/fips.c ./grub-core/lib/libgcrypt/src/g10lib.h ./grub-core/lib/libgcrypt/src/gcrypt-int.h ./grub-core/lib/libgcrypt/src/gcrypt-testapi.h ./grub-core/lib/libgcrypt/src/hmac256.c ./grub-core/lib/libgcrypt/src/hmac256.h ./grub-core/lib/libgcrypt/src/hwf-arm.c ./grub-core/lib/libgcrypt/src/hwf-common.h ./grub-core/lib/libgcrypt/src/hwf-ppc.c ./grub-core/lib/libgcrypt/src/hwf-s390x.c ./grub-core/lib/libgcrypt/src/hwf-x86.c ./grub-core/lib/libgcrypt/src/hwfeatures.c ./grub-core/lib/libgcrypt/src/missing-string.c ./grub-core/lib/libgcrypt/src/mpi.h ./grub-core/lib/libgcrypt/src/mpicalc.c ./grub-core/lib/libgcrypt/src/secmem.h ./grub-core/lib/libgcrypt/src/sexp.c ./grub-core/lib/libgcrypt/src/stdmem.c ./grub-core/lib/libgcrypt/src/stdmem.h ./grub-core/lib/libgcrypt/src/types.h ./grub-core/lib/libgcrypt/src/visibility.c ./grub-core/lib/libgcrypt/src/visibility.h ./grub-core/lib/libgcrypt_wrap/cipher_wrap.h ./grub-core/lib/libgcrypt_wrap/mem.c ./grub-core/lib/libtasn1-grub/lib/coding.c ./grub-core/lib/libtasn1-grub/lib/decoding.c ./grub-core/lib/libtasn1-grub/lib/element.c ./grub-core/lib/libtasn1-grub/lib/element.h ./grub-core/lib/libtasn1-grub/lib/errors.c ./grub-core/lib/libtasn1-grub/lib/gstr.c ./grub-core/lib/libtasn1-grub/lib/gstr.h ./grub-core/lib/libtasn1-grub/lib/int.h ./grub-core/lib/libtasn1-grub/lib/parser_aux.c ./grub-core/lib/libtasn1-grub/lib/parser_aux.h ./grub-core/lib/libtasn1-grub/lib/structure.c ./grub-core/lib/libtasn1-grub/lib/structure.h ./grub-core/lib/libtasn1-grub/libtasn1.h ./grub-core/lib/libtasn1/lib/coding.c ./grub-core/lib/libtasn1/lib/decoding.c ./grub-core/lib/libtasn1/lib/element.c ./grub-core/lib/libtasn1/lib/element.h ./grub-core/lib/libtasn1/lib/errors.c ./grub-core/lib/libtasn1/lib/gstr.c ./grub-core/lib/libtasn1/lib/gstr.h ./grub-core/lib/libtasn1/lib/int.h ./grub-core/lib/libtasn1/lib/parser_aux.c ./grub-core/lib/libtasn1/lib/parser_aux.h ./grub-core/lib/libtasn1/lib/structure.c ./grub-core/lib/libtasn1/lib/structure.h ./grub-core/lib/libtasn1/libtasn1.h ./grub-core/lib/libtasn1/tests/CVE-2018-1000654-1_asn1_tab.h ./grub-core/lib/libtasn1/tests/CVE-2018-1000654-2_asn1_tab.h ./grub-core/lib/libtasn1/tests/CVE-2018-1000654.c ./grub-core/lib/libtasn1/tests/Test_overflow.c ./grub-core/lib/libtasn1/tests/Test_simple.c ./grub-core/lib/libtasn1/tests/Test_strings.c ./grub-core/lib/libtasn1/tests/object-id-decoding.c ./grub-core/lib/libtasn1/tests/object-id-encoding.c ./grub-core/lib/libtasn1/tests/octet-string.c ./grub-core/lib/libtasn1/tests/reproducers.c ./grub-core/lib/libtasn1_wrap/wrap.c ./grub-core/lib/minilzo/lzoconf.h ./grub-core/lib/minilzo/lzodefs.h ./grub-core/lib/minilzo/minilzo.c ./grub-core/lib/minilzo/minilzo.h ./grub-core/lib/mips/arc/reboot.c ./grub-core/lib/mips/loongson/reboot.c ./grub-core/lib/mips/qemu_mips/reboot.c ./grub-core/lib/mips/relocator.c ./grub-core/lib/pbkdf2.c ./grub-core/lib/posix_wrap/assert.h ./grub-core/lib/posix_wrap/c-ctype.h ./grub-core/lib/posix_wrap/ctype.h ./grub-core/lib/posix_wrap/errno.h ./grub-core/lib/posix_wrap/inttypes.h ./grub-core/lib/posix_wrap/langinfo.h ./grub-core/lib/posix_wrap/limits.h ./grub-core/lib/posix_wrap/localcharset.h ./grub-core/lib/posix_wrap/locale.h ./grub-core/lib/posix_wrap/stdint.h ./grub-core/lib/posix_wrap/stdio.h ./grub-core/lib/posix_wrap/stdlib.h ./grub-core/lib/posix_wrap/string.h ./grub-core/lib/posix_wrap/sys/types.h ./grub-core/lib/posix_wrap/unistd.h ./grub-core/lib/posix_wrap/wchar.h ./grub-core/lib/posix_wrap/wctype.h ./grub-core/lib/powerpc/relocator.c ./grub-core/lib/priority_queue.c ./grub-core/lib/progress.c ./grub-core/lib/random.c ./grub-core/lib/reed_solomon.c ./grub-core/lib/relocator.c ./grub-core/lib/syslinux_parse.c ./grub-core/lib/tss2/buffer.c ./grub-core/lib/tss2/tcg2.h ./grub-core/lib/tss2/tcg2_emu.c ./grub-core/lib/tss2/tpm2_cmd.c ./grub-core/lib/tss2/tpm2_cmd.h ./grub-core/lib/tss2/tss2.c ./grub-core/lib/tss2/tss2_buffer.h ./grub-core/lib/tss2/tss2_mu.c ./grub-core/lib/tss2/tss2_mu.h ./grub-core/lib/tss2/tss2_structs.h ./grub-core/lib/tss2/tss2_types.h ./grub-core/lib/uboot/reboot.c ./grub-core/lib/x86_64/efi/relocator.c ./grub-core/lib/xen/datetime.c ./grub-core/lib/xen/halt.c ./grub-core/lib/xen/reboot.c ./grub-core/lib/xen/relocator.c ./grub-core/lib/xzembed/xz.h ./grub-core/lib/xzembed/xz_config.h ./grub-core/lib/xzembed/xz_dec_bcj.c ./grub-core/lib/xzembed/xz_dec_lzma2.c ./grub-core/lib/xzembed/xz_dec_stream.c ./grub-core/lib/xzembed/xz_lzma2.h ./grub-core/lib/xzembed/xz_private.h ./grub-core/lib/xzembed/xz_stream.h ./grub-core/lib/zstd/bitstream.h ./grub-core/lib/zstd/compiler.h ./grub-core/lib/zstd/cpu.h ./grub-core/lib/zstd/debug.c ./grub-core/lib/zstd/debug.h ./grub-core/lib/zstd/entropy_common.c ./grub-core/lib/zstd/error_private.c ./grub-core/lib/zstd/error_private.h ./grub-core/lib/zstd/fse.h ./grub-core/lib/zstd/fse_decompress.c ./grub-core/lib/zstd/huf.h ./grub-core/lib/zstd/huf_decompress.c ./grub-core/lib/zstd/mem.h ./grub-core/lib/zstd/module.c ./grub-core/lib/zstd/xxhash.c ./grub-core/lib/zstd/xxhash.h ./grub-core/lib/zstd/zstd.h ./grub-core/lib/zstd/zstd_common.c ./grub-core/lib/zstd/zstd_decompress.c ./grub-core/lib/zstd/zstd_errors.h ./grub-core/lib/zstd/zstd_internal.h ./grub-core/loader/aout.c ./grub-core/loader/arm/linux.c ./grub-core/loader/arm64/xen_boot.c ./grub-core/loader/efi/appleloader.c ./grub-core/loader/efi/chainloader.c ./grub-core/loader/efi/fdt.c ./grub-core/loader/efi/linux.c ./grub-core/loader/emu/linux.c ./grub-core/loader/i386/bsd.c ./grub-core/loader/i386/bsd32.c ./grub-core/loader/i386/bsd64.c ./grub-core/loader/i386/bsdXX.c ./grub-core/loader/i386/bsd_pagetable.c ./grub-core/loader/i386/coreboot/chainloader.c ./grub-core/loader/i386/linux.c ./grub-core/loader/i386/multiboot_mbi.c ./grub-core/loader/i386/pc/chainloader.c ./grub-core/loader/i386/pc/freedos.c ./grub-core/loader/i386/pc/linux.c ./grub-core/loader/i386/pc/ntldr.c ./grub-core/loader/i386/pc/plan9.c ./grub-core/loader/i386/pc/pxechainloader.c ./grub-core/loader/i386/pc/truecrypt.c ./grub-core/loader/i386/xen.c ./grub-core/loader/i386/xen_file.c ./grub-core/loader/i386/xen_file32.c ./grub-core/loader/i386/xen_file64.c ./grub-core/loader/i386/xen_fileXX.c ./grub-core/loader/i386/xnu.c ./grub-core/loader/ia64/efi/linux.c ./grub-core/loader/linux.c ./grub-core/loader/lzss.c ./grub-core/loader/macho.c ./grub-core/loader/macho32.c ./grub-core/loader/macho64.c ./grub-core/loader/machoXX.c ./grub-core/loader/mips/linux.c ./grub-core/loader/multiboot.c ./grub-core/loader/multiboot_elfxx.c ./grub-core/loader/multiboot_mbi2.c ./grub-core/loader/powerpc/ieee1275/linux.c ./grub-core/loader/sparc64/ieee1275/linux.c ./grub-core/loader/xnu.c ./grub-core/loader/xnu_resume.c ./grub-core/mmap/efi/mmap.c ./grub-core/mmap/i386/mmap.c ./grub-core/mmap/i386/pc/mmap.c ./grub-core/mmap/i386/uppermem.c ./grub-core/mmap/mips/uppermem.c ./grub-core/mmap/mmap.c ./grub-core/net/arp.c ./grub-core/net/bootp.c ./grub-core/net/dns.c ./grub-core/net/drivers/efi/efinet.c ./grub-core/net/drivers/emu/emunet.c ./grub-core/net/drivers/i386/pc/pxe.c ./grub-core/net/drivers/ieee1275/ofnet.c ./grub-core/net/drivers/uboot/ubootnet.c ./grub-core/net/ethernet.c ./grub-core/net/http.c ./grub-core/net/icmp.c ./grub-core/net/icmp6.c ./grub-core/net/ip.c ./grub-core/net/net.c ./grub-core/net/netbuff.c ./grub-core/net/tcp.c ./grub-core/net/tftp.c ./grub-core/net/udp.c ./grub-core/normal/auth.c ./grub-core/normal/autofs.c ./grub-core/normal/charset.c ./grub-core/normal/cmdline.c ./grub-core/normal/color.c ./grub-core/normal/completion.c ./grub-core/normal/context.c ./grub-core/normal/crypto.c ./grub-core/normal/dyncmd.c ./grub-core/normal/main.c ./grub-core/normal/menu.c ./grub-core/normal/menu_entry.c ./grub-core/normal/menu_text.c ./grub-core/normal/misc.c ./grub-core/normal/term.c ./grub-core/osdep/apple/getroot.c ./grub-core/osdep/apple/hostdisk.c ./grub-core/osdep/aros/config.c ./grub-core/osdep/aros/getroot.c ./grub-core/osdep/aros/hostdisk.c ./grub-core/osdep/aros/relpath.c ./grub-core/osdep/basic/compress.c ./grub-core/osdep/basic/emunet.c ./grub-core/osdep/basic/getroot.c ./grub-core/osdep/basic/hostdisk.c ./grub-core/osdep/basic/init.c ./grub-core/osdep/basic/no_platform.c ./grub-core/osdep/basic/ofpath.c ./grub-core/osdep/basic/platform.c ./grub-core/osdep/basic/random.c ./grub-core/osdep/blocklist.c ./grub-core/osdep/bsd/getroot.c ./grub-core/osdep/bsd/hostdisk.c ./grub-core/osdep/compress.c ./grub-core/osdep/config.c ./grub-core/osdep/cputime.c ./grub-core/osdep/devmapper/getroot.c ./grub-core/osdep/devmapper/hostdisk.c ./grub-core/osdep/dl.c ./grub-core/osdep/emuconsole.c ./grub-core/osdep/emunet.c ./grub-core/osdep/exec.c ./grub-core/osdep/freebsd/getroot.c ./grub-core/osdep/freebsd/hostdisk.c ./grub-core/osdep/generic/blocklist.c ./grub-core/osdep/getroot.c ./grub-core/osdep/haiku/getroot.c ./grub-core/osdep/haiku/hostdisk.c ./grub-core/osdep/hostdisk.c ./grub-core/osdep/hurd/getroot.c ./grub-core/osdep/hurd/hostdisk.c ./grub-core/osdep/init.c ./grub-core/osdep/linux/blocklist.c ./grub-core/osdep/linux/emunet.c ./grub-core/osdep/linux/getroot.c ./grub-core/osdep/linux/hostdisk.c ./grub-core/osdep/linux/ofpath.c ./grub-core/osdep/linux/platform.c ./grub-core/osdep/ofpath.c ./grub-core/osdep/password.c ./grub-core/osdep/platform.c ./grub-core/osdep/platform_unix.c ./grub-core/osdep/random.c ./grub-core/osdep/relpath.c ./grub-core/osdep/sleep.c ./grub-core/osdep/sun/getroot.c ./grub-core/osdep/sun/hostdisk.c ./grub-core/osdep/unix/compress.c ./grub-core/osdep/unix/config.c ./grub-core/osdep/unix/cputime.c ./grub-core/osdep/unix/dl.c ./grub-core/osdep/unix/emuconsole.c ./grub-core/osdep/unix/exec.c ./grub-core/osdep/unix/getroot.c ./grub-core/osdep/unix/hostdisk.c ./grub-core/osdep/unix/password.c ./grub-core/osdep/unix/platform.c ./grub-core/osdep/unix/random.c ./grub-core/osdep/unix/relpath.c ./grub-core/osdep/unix/sleep.c ./grub-core/osdep/windows/blocklist.c ./grub-core/osdep/windows/config.c ./grub-core/osdep/windows/cputime.c ./grub-core/osdep/windows/dl.c ./grub-core/osdep/windows/emuconsole.c ./grub-core/osdep/windows/getroot.c ./grub-core/osdep/windows/hostdisk.c ./grub-core/osdep/windows/init.c ./grub-core/osdep/windows/password.c ./grub-core/osdep/windows/platform.c ./grub-core/osdep/windows/random.c ./grub-core/osdep/windows/relpath.c ./grub-core/osdep/windows/sleep.c ./grub-core/partmap/acorn.c ./grub-core/partmap/amiga.c ./grub-core/partmap/apple.c ./grub-core/partmap/bsdlabel.c ./grub-core/partmap/dfly.c ./grub-core/partmap/dvh.c ./grub-core/partmap/gpt.c ./grub-core/partmap/msdos.c ./grub-core/partmap/plan.c ./grub-core/partmap/sun.c ./grub-core/partmap/sunpc.c ./grub-core/parttool/msdospart.c ./grub-core/rs_decoder.h ./grub-core/script/argv.c ./grub-core/script/execute.c ./grub-core/script/function.c ./grub-core/script/lexer.c ./grub-core/script/main.c ./grub-core/script/script.c ./grub-core/symlist.c ./grub-core/symlist.h ./grub-core/term/arc/console.c ./grub-core/term/arc/serial.c ./grub-core/term/arm/cros.c ./grub-core/term/arm/cros_ec.c ./grub-core/term/arm/pl050.c ./grub-core/term/at_keyboard.c ./grub-core/term/efi/console.c ./grub-core/term/efi/serial.c ./grub-core/term/gfxterm.c ./grub-core/term/gfxterm_background.c ./grub-core/term/i386/coreboot/cbmemc.c ./grub-core/term/i386/pc/console.c ./grub-core/term/i386/pc/mda_text.c ./grub-core/term/i386/pc/vga_text.c ./grub-core/term/ieee1275/console.c ./grub-core/term/ieee1275/escc.c ./grub-core/term/ieee1275/serial.c ./grub-core/term/morse.c ./grub-core/term/ns8250-spcr.c ./grub-core/term/ns8250.c ./grub-core/term/pci/serial.c ./grub-core/term/ps2.c ./grub-core/term/serial.c ./grub-core/term/spkmodem.c ./grub-core/term/terminfo.c ./grub-core/term/tparm.c ./grub-core/term/uboot/console.c ./grub-core/term/usb_keyboard.c ./grub-core/term/xen/console.c ./grub-core/tests/asn1/asn1_test.c ./grub-core/tests/asn1/asn1_test.h ./grub-core/tests/asn1/tests/CVE-2018-1000654-1_asn1_tab.h ./grub-core/tests/asn1/tests/CVE-2018-1000654-2_asn1_tab.h ./grub-core/tests/asn1/tests/CVE-2018-1000654.c ./grub-core/tests/asn1/tests/Test_overflow.c ./grub-core/tests/asn1/tests/Test_simple.c ./grub-core/tests/asn1/tests/Test_strings.c ./grub-core/tests/asn1/tests/object-id-decoding.c ./grub-core/tests/asn1/tests/object-id-encoding.c ./grub-core/tests/asn1/tests/octet-string.c ./grub-core/tests/asn1/tests/reproducers.c ./grub-core/tests/bswap_test.c ./grub-core/tests/checksums.h ./grub-core/tests/cmdline_cat_test.c ./grub-core/tests/cmp_test.c ./grub-core/tests/ctz_test.c ./grub-core/tests/div_test.c ./grub-core/tests/dsa_sexp_test.c ./grub-core/tests/example_functional_test.c ./grub-core/tests/fake_input.c ./grub-core/tests/gfxterm_menu.c ./grub-core/tests/legacy_password_test.c ./grub-core/tests/lib/functional_test.c ./grub-core/tests/lib/test.c ./grub-core/tests/mul_test.c ./grub-core/tests/pbkdf2_test.c ./grub-core/tests/rsa_sexp_test.c ./grub-core/tests/setjmp_test.c ./grub-core/tests/shift_test.c ./grub-core/tests/signature_test.c ./grub-core/tests/signatures.h ./grub-core/tests/sleep_test.c ./grub-core/tests/strtoull_test.c ./grub-core/tests/test_blockarg.c ./grub-core/tests/video_checksum.c ./grub-core/tests/videotest_checksum.c ./grub-core/tests/xnu_uuid_test.c ./grub-core/trigtables.c ./grub-core/unidata.c ./grub-core/video/bitmap.c ./grub-core/video/bitmap_scale.c ./grub-core/video/bochs.c ./grub-core/video/capture.c ./grub-core/video/cirrus.c ./grub-core/video/colors.c ./grub-core/video/coreboot/cbfb.c ./grub-core/video/efi_gop.c ./grub-core/video/efi_uga.c ./grub-core/video/emu/sdl.c ./grub-core/video/fb/fbblit.c ./grub-core/video/fb/fbfill.c ./grub-core/video/fb/fbutil.c ./grub-core/video/fb/video_fb.c ./grub-core/video/i386/pc/vbe.c ./grub-core/video/i386/pc/vga.c ./grub-core/video/ieee1275.c ./grub-core/video/radeon_fuloong2e.c ./grub-core/video/radeon_yeeloong3a.c ./grub-core/video/readers/jpeg.c ./grub-core/video/readers/png.c ./grub-core/video/readers/tga.c ./grub-core/video/sis315_init.c ./grub-core/video/sis315pro.c ./grub-core/video/sm712.c ./grub-core/video/sm712_init.c ./grub-core/video/video.c ./grub_fstest_init.c ./grub_script.tab.c ./grub_script.tab.h ./grub_script.yy.c ./grub_script.yy.h ./include/grub/acorn_filecore.h ./include/grub/acpi.h ./include/grub/aout.h ./include/grub/arc/arc.h ./include/grub/arc/console.h ./include/grub/archelp.h ./include/grub/arm/coreboot/console.h ./include/grub/arm/coreboot/kernel.h ./include/grub/arm/cros_ec.h ./include/grub/arm/efi/memory.h ./include/grub/arm/linux.h ./include/grub/arm/reloc.h ./include/grub/arm/setjmp.h ./include/grub/arm/startup.h ./include/grub/arm/system.h ./include/grub/arm/time.h ./include/grub/arm/types.h ./include/grub/arm/uboot/kernel.h ./include/grub/arm64/efi/memory.h ./include/grub/arm64/reloc.h ./include/grub/arm64/setjmp.h ./include/grub/arm64/time.h ./include/grub/arm64/types.h ./include/grub/at_keyboard.h ./include/grub/ata.h ./include/grub/auth.h ./include/grub/autoefi.h ./include/grub/backtrace.h ./include/grub/bitmap.h ./include/grub/bitmap_scale.h ./include/grub/boottime.h ./include/grub/bsdlabel.h ./include/grub/btrfs.h ./include/grub/buffer.h ./include/grub/bufio.h ./include/grub/cache.h ./include/grub/cbfs_core.h ./include/grub/charset.h ./include/grub/cmos.h ./include/grub/color.h ./include/grub/command.h ./include/grub/compiler-rt-emu.h ./include/grub/compiler-rt.h ./include/grub/compiler.h ./include/grub/coreboot/lbio.h ./include/grub/crypto.h ./include/grub/cryptodisk.h ./include/grub/cs5536.h ./include/grub/datetime.h ./include/grub/decompressor.h ./include/grub/deflate.h ./include/grub/device.h ./include/grub/disk.h ./include/grub/diskfilter.h ./include/grub/dl.h ./include/grub/dma.h ./include/grub/efi/api.h ./include/grub/efi/cc.h ./include/grub/efi/console.h ./include/grub/efi/console_control.h ./include/grub/efi/debug.h ./include/grub/efi/disk.h ./include/grub/efi/edid.h ./include/grub/efi/efi.h ./include/grub/efi/fdtload.h ./include/grub/efi/graphics_output.h ./include/grub/efi/memory.h ./include/grub/efi/pci.h ./include/grub/efi/pe32.h ./include/grub/efi/sb.h ./include/grub/efi/tpm.h ./include/grub/efi/uga_draw.h ./include/grub/efiemu/efiemu.h ./include/grub/efiemu/runtime.h ./include/grub/elf.h ./include/grub/elfload.h ./include/grub/emu/config.h ./include/grub/emu/console.h ./include/grub/emu/exec.h ./include/grub/emu/getroot.h ./include/grub/emu/hostdisk.h ./include/grub/emu/hostfile.h ./include/grub/emu/misc.h ./include/grub/emu/net.h ./include/grub/env.h ./include/grub/env_private.h ./include/grub/err.h ./include/grub/exfat.h ./include/grub/extcmd.h ./include/grub/fat.h ./include/grub/fbblit.h ./include/grub/fbfill.h ./include/grub/fbutil.h ./include/grub/fdt.h ./include/grub/fdtbus.h ./include/grub/file.h ./include/grub/fileid.h ./include/grub/font.h ./include/grub/fontformat.h ./include/grub/fs.h ./include/grub/fshelp.h ./include/grub/gcry/types.h ./include/grub/gcrypt/g10lib.h ./include/grub/gcrypt/gcrypt.h ./include/grub/gcrypt/gpg-error.h ./include/grub/gdb.h ./include/grub/gfxmenu_model.h ./include/grub/gfxmenu_view.h ./include/grub/gfxterm.h ./include/grub/gfxwidgets.h ./include/grub/gpt_partition.h ./include/grub/gui.h ./include/grub/gui_string_util.h ./include/grub/hfs.h ./include/grub/hfsplus.h ./include/grub/i18n.h ./include/grub/i386/at_keyboard.h ./include/grub/i386/bsd.h ./include/grub/i386/cmos.h ./include/grub/i386/coreboot/boot.h ./include/grub/i386/coreboot/console.h ./include/grub/i386/coreboot/kernel.h ./include/grub/i386/coreboot/memory.h ./include/grub/i386/coreboot/serial.h ./include/grub/i386/coreboot/time.h ./include/grub/i386/cpuid.h ./include/grub/i386/efi/kernel.h ./include/grub/i386/efi/memory.h ./include/grub/i386/efi/serial.h ./include/grub/i386/efiemu.h ./include/grub/i386/floppy.h ./include/grub/i386/freebsd_linker.h ./include/grub/i386/freebsd_reboot.h ./include/grub/i386/gdb.h ./include/grub/i386/ieee1275/ieee1275.h ./include/grub/i386/ieee1275/kernel.h ./include/grub/i386/ieee1275/memory.h ./include/grub/i386/ieee1275/serial.h ./include/grub/i386/io.h ./include/grub/i386/linux.h ./include/grub/i386/macho.h ./include/grub/i386/memory.h ./include/grub/i386/memory_raw.h ./include/grub/i386/msr.h ./include/grub/i386/multiboot.h ./include/grub/i386/multiboot/boot.h ./include/grub/i386/multiboot/console.h ./include/grub/i386/multiboot/kernel.h ./include/grub/i386/multiboot/memory.h ./include/grub/i386/multiboot/serial.h ./include/grub/i386/multiboot/time.h ./include/grub/i386/netbsd_bootinfo.h ./include/grub/i386/netbsd_reboot.h ./include/grub/i386/openbsd_bootarg.h ./include/grub/i386/openbsd_reboot.h ./include/grub/i386/pc/apm.h ./include/grub/i386/pc/biosdisk.h ./include/grub/i386/pc/biosnum.h ./include/grub/i386/pc/boot.h ./include/grub/i386/pc/chainloader.h ./include/grub/i386/pc/console.h ./include/grub/i386/pc/int.h ./include/grub/i386/pc/int_types.h ./include/grub/i386/pc/kernel.h ./include/grub/i386/pc/memory.h ./include/grub/i386/pc/pxe.h ./include/grub/i386/pc/time.h ./include/grub/i386/pc/vbe.h ./include/grub/i386/pc/vesa_modes_table.h ./include/grub/i386/pci.h ./include/grub/i386/pit.h ./include/grub/i386/pmtimer.h ./include/grub/i386/qemu/boot.h ./include/grub/i386/qemu/console.h ./include/grub/i386/qemu/kernel.h ./include/grub/i386/qemu/memory.h ./include/grub/i386/qemu/serial.h ./include/grub/i386/qemu/time.h ./include/grub/i386/reboot.h ./include/grub/i386/relocator.h ./include/grub/i386/relocator_private.h ./include/grub/i386/setjmp.h ./include/grub/i386/time.h ./include/grub/i386/tsc.h ./include/grub/i386/types.h ./include/grub/i386/xen/hypercall.h ./include/grub/i386/xen/kernel.h ./include/grub/i386/xen/memory.h ./include/grub/i386/xen_pvh/boot.h ./include/grub/i386/xen_pvh/console.h ./include/grub/i386/xen_pvh/int.h ./include/grub/i386/xen_pvh/kernel.h ./include/grub/i386/xen_pvh/memory.h ./include/grub/i386/xen_pvh/time.h ./include/grub/i386/xnu.h ./include/grub/ia64/efi/memory.h ./include/grub/ia64/efi/time.h ./include/grub/ia64/kernel.h ./include/grub/ia64/reloc.h ./include/grub/ia64/setjmp.h ./include/grub/ia64/time.h ./include/grub/ia64/types.h ./include/grub/icon_manager.h ./include/grub/ieee1275/alloc.h ./include/grub/ieee1275/console.h ./include/grub/ieee1275/ieee1275.h ./include/grub/ieee1275/obdisk.h ./include/grub/ieee1275/ofdisk.h ./include/grub/ieee1275/tpm.h ./include/grub/kernel.h ./include/grub/key_protector.h ./include/grub/keyboard_layouts.h ./include/grub/legacy_parse.h ./include/grub/lib/LzFind.h ./include/grub/lib/LzHash.h ./include/grub/lib/LzmaDec.h ./include/grub/lib/LzmaEnc.h ./include/grub/lib/LzmaTypes.h ./include/grub/lib/arg.h ./include/grub/lib/cmdline.h ./include/grub/lib/crc.h ./include/grub/lib/envblk.h ./include/grub/lib/hexdump.h ./include/grub/libpciaccess.h ./include/grub/linux.h ./include/grub/list.h ./include/grub/loader.h ./include/grub/lockdown.h ./include/grub/loongarch64/efi/memory.h ./include/grub/loongarch64/reloc.h ./include/grub/loongarch64/setjmp.h ./include/grub/loongarch64/time.h ./include/grub/loongarch64/types.h ./include/grub/lvm.h ./include/grub/macho.h ./include/grub/machoload.h ./include/grub/memory.h ./include/grub/menu.h ./include/grub/menu_viewer.h ./include/grub/mips/arc/kernel.h ./include/grub/mips/arc/memory.h ./include/grub/mips/arc/time.h ./include/grub/mips/asm.h ./include/grub/mips/at_keyboard.h ./include/grub/mips/cmos.h ./include/grub/mips/io.h ./include/grub/mips/kernel.h ./include/grub/mips/loongson.h ./include/grub/mips/loongson/at_keyboard.h ./include/grub/mips/loongson/cmos.h ./include/grub/mips/loongson/ec.h ./include/grub/mips/loongson/kernel.h ./include/grub/mips/loongson/memory.h ./include/grub/mips/loongson/pci.h ./include/grub/mips/loongson/serial.h ./include/grub/mips/loongson/time.h ./include/grub/mips/memory.h ./include/grub/mips/mips.h ./include/grub/mips/multiboot.h ./include/grub/mips/pci.h ./include/grub/mips/qemu_mips/at_keyboard.h ./include/grub/mips/qemu_mips/cmos.h ./include/grub/mips/qemu_mips/console.h ./include/grub/mips/qemu_mips/kernel.h ./include/grub/mips/qemu_mips/loader.h ./include/grub/mips/qemu_mips/memory.h ./include/grub/mips/qemu_mips/serial.h ./include/grub/mips/qemu_mips/time.h ./include/grub/mips/relocator.h ./include/grub/mips/setjmp.h ./include/grub/mips/time.h ./include/grub/mips/types.h ./include/grub/misc.h ./include/grub/mm.h ./include/grub/mm_private.h ./include/grub/module_verifier.h ./include/grub/msdos_partition.h ./include/grub/multiboot.h ./include/grub/multiboot2.h ./include/grub/multiboot_loader.h ./include/grub/net.h ./include/grub/net/arp.h ./include/grub/net/ethernet.h ./include/grub/net/ip.h ./include/grub/net/netbuff.h ./include/grub/net/tcp.h ./include/grub/net/udp.h ./include/grub/normal.h ./include/grub/ns8250.h ./include/grub/ntfs.h ./include/grub/offsets.h ./include/grub/osdep/hostfile.h ./include/grub/osdep/hostfile_aros.h ./include/grub/osdep/hostfile_unix.h ./include/grub/osdep/hostfile_windows.h ./include/grub/osdep/major.h ./include/grub/parser.h ./include/grub/partition.h ./include/grub/parttool.h ./include/grub/pci.h ./include/grub/pciutils.h ./include/grub/powerpc/ieee1275/ieee1275.h ./include/grub/powerpc/kernel.h ./include/grub/powerpc/memory.h ./include/grub/powerpc/relocator.h ./include/grub/powerpc/setjmp.h ./include/grub/powerpc/time.h ./include/grub/powerpc/types.h ./include/grub/priority_queue.h ./include/grub/procfs.h ./include/grub/ps2.h ./include/grub/pubkey.h ./include/grub/random.h ./include/grub/reader.h ./include/grub/reed_solomon.h ./include/grub/relocator.h ./include/grub/relocator_private.h ./include/grub/riscv32/efi/memory.h ./include/grub/riscv32/setjmp.h ./include/grub/riscv32/time.h ./include/grub/riscv32/types.h ./include/grub/riscv64/efi/memory.h ./include/grub/riscv64/setjmp.h ./include/grub/riscv64/time.h ./include/grub/riscv64/types.h ./include/grub/safemath.h ./include/grub/script_sh.h ./include/grub/scsi.h ./include/grub/scsicmd.h ./include/grub/sdl.h ./include/grub/search.h ./include/grub/serial.h ./include/grub/setjmp.h ./include/grub/smbios.h ./include/grub/smbus.h ./include/grub/sparc64/ieee1275/boot.h ./include/grub/sparc64/ieee1275/ieee1275.h ./include/grub/sparc64/ieee1275/kernel.h ./include/grub/sparc64/setjmp.h ./include/grub/sparc64/time.h ./include/grub/sparc64/types.h ./include/grub/speaker.h ./include/grub/stack_protector.h ./include/grub/symbol.h ./include/grub/syslinux_parse.h ./include/grub/term.h ./include/grub/terminfo.h ./include/grub/test.h ./include/grub/time.h ./include/grub/tparm.h ./include/grub/tpm.h ./include/grub/trig.h ./include/grub/types.h ./include/grub/uboot/api_public.h ./include/grub/uboot/console.h ./include/grub/uboot/disk.h ./include/grub/uboot/image.h ./include/grub/uboot/uboot.h ./include/grub/udf.h ./include/grub/unicode.h ./include/grub/usb.h ./include/grub/usbdesc.h ./include/grub/usbserial.h ./include/grub/usbtrans.h ./include/grub/util/install.h ./include/grub/util/libnvpair.h ./include/grub/util/libzfs.h ./include/grub/util/misc.h ./include/grub/util/mkimage.h ./include/grub/util/ofpath.h ./include/grub/util/resolve.h ./include/grub/util/windows.h ./include/grub/verify.h ./include/grub/vga.h ./include/grub/vgaregs.h ./include/grub/video.h ./include/grub/video_fb.h ./include/grub/x86_64/at_keyboard.h ./include/grub/x86_64/cmos.h ./include/grub/x86_64/efi/boot.h ./include/grub/x86_64/efi/kernel.h ./include/grub/x86_64/efi/loader.h ./include/grub/x86_64/efi/memory.h ./include/grub/x86_64/efi/serial.h ./include/grub/x86_64/io.h ./include/grub/x86_64/linux.h ./include/grub/x86_64/macho.h ./include/grub/x86_64/memory.h ./include/grub/x86_64/multiboot.h ./include/grub/x86_64/pci.h ./include/grub/x86_64/relocator.h ./include/grub/x86_64/setjmp.h ./include/grub/x86_64/time.h ./include/grub/x86_64/types.h ./include/grub/x86_64/xen/hypercall.h ./include/grub/x86_64/xnu.h ./include/grub/xen.h ./include/grub/xen/relocator.h ./include/grub/xen_file.h ./include/grub/xnu.h ./include/grub/zfs/dmu.h ./include/grub/zfs/dmu_objset.h ./include/grub/zfs/dnode.h ./include/grub/zfs/dsl_dataset.h ./include/grub/zfs/dsl_dir.h ./include/grub/zfs/sa_impl.h ./include/grub/zfs/spa.h ./include/grub/zfs/uberblock_impl.h ./include/grub/zfs/vdev_impl.h ./include/grub/zfs/zap_impl.h ./include/grub/zfs/zap_leaf.h ./include/grub/zfs/zfs.h ./include/grub/zfs/zfs_acl.h ./include/grub/zfs/zfs_znode.h ./include/grub/zfs/zil.h ./include/grub/zfs/zio.h ./include/grub/zfs/zio_checksum.h ./include/multiboot.h ./include/multiboot2.h ./include/xen/arch-x86/xen-x86_32.h ./include/xen/arch-x86/xen-x86_64.h ./include/xen/arch-x86/xen.h ./include/xen/elfnote.h ./include/xen/event_channel.h ./include/xen/grant_table.h ./include/xen/hvm/hvm_op.h ./include/xen/hvm/params.h ./include/xen/hvm/start_info.h ./include/xen/io/blkif.h ./include/xen/io/console.h ./include/xen/io/protocols.h ./include/xen/io/ring.h ./include/xen/io/xenbus.h ./include/xen/io/xs_wire.h ./include/xen/memory.h ./include/xen/physdev.h ./include/xen/sched.h ./include/xen/trace.h ./include/xen/xen-compat.h ./include/xen/xen.h ./libgrub_a_init.c ./tests/cmp_unit_test.c ./tests/date_unit_test.c ./tests/example_unit_test.c ./tests/lib/unit_test.c ./tests/printf_unit_test.c ./util/bin2h.c ./util/config.c ./util/editenv.c ./util/garbage-gen.c ./util/getroot.c ./util/glue-efi.c ./util/grub-editenv.c ./util/grub-file.c ./util/grub-fstest.c ./util/grub-glue-efi.c ./util/grub-install-common.c ./util/grub-install.c ./util/grub-macbless.c ./util/grub-macho2img.c ./util/grub-menulst2cfg.c ./util/grub-mkfont.c ./util/grub-mkimage.c ./util/grub-mkimage32.c ./util/grub-mkimage64.c ./util/grub-mkimagexx.c ./util/grub-mklayout.c ./util/grub-mknetdir.c ./util/grub-mkpasswd-pbkdf2.c ./util/grub-mkrelpath.c ./util/grub-mkrescue.c ./util/grub-mkstandalone.c ./util/grub-module-verifier.c ./util/grub-module-verifier32.c ./util/grub-module-verifier64.c ./util/grub-module-verifierXX.c ./util/grub-mount.c ./util/grub-pe2elf.c ./util/grub-probe.c ./util/grub-protect.c ./util/grub-render-label.c ./util/grub-script-check.c ./util/grub-setup.c ./util/grub-syslinux2cfg.c ./util/ieee1275/grub-ofpathname.c ./util/misc.c ./util/mkimage.c ./util/probe.c ./util/render-label.c ./util/resolve.c ./util/setup.c ./util/setup_bios.c ./util/setup_sparc.c ./util/spkmodem-recv.c grub-2.14~git20250718.0e36779/po/quot.sed0000644000175000017500000000023115000202015014056 00000000000000s/"\([^"]*\)"/“\1”/g s/`\([^`']*\)'/‘\1’/g s/ '\([^`']*\)' / ‘\1’ /g s/ '\([^`']*\)'$/ ‘\1’/g s/^'\([^`']*\)' /‘\1’ /g s/“”/""/g grub-2.14~git20250718.0e36779/COPYING0000644000175000017500000010451315000202015013016 00000000000000 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . grub-2.14~git20250718.0e36779/grub-core/0000755000175000017500000000000015036452575013757 500000000000000grub-2.14~git20250718.0e36779/grub-core/hook/0000755000175000017500000000000015036452575014717 500000000000000grub-2.14~git20250718.0e36779/grub-core/hook/datehook.c0000644000175000017500000000521415000202015016550 00000000000000/* datehook.c - Module to install datetime hooks. */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2008 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); static const char *grub_datetime_names[] = { "YEAR", "MONTH", "DAY", "HOUR", "MINUTE", "SECOND", "WEEKDAY", }; static const char * grub_read_hook_datetime (struct grub_env_var *var, const char *val __attribute__ ((unused))) { struct grub_datetime datetime; static char buf[6]; buf[0] = 0; if (! grub_get_datetime (&datetime)) { int i; for (i = 0; i < 7; i++) if (grub_strcmp (var->name, grub_datetime_names[i]) == 0) { int n; switch (i) { case 0: n = datetime.year; break; case 1: n = datetime.month; break; case 2: n = datetime.day; break; case 3: n = datetime.hour; break; case 4: n = datetime.minute; break; case 5: n = datetime.second; break; default: return grub_get_weekday_name (&datetime); } grub_snprintf (buf, sizeof (buf), "%d", n); break; } } return buf; } GRUB_MOD_INIT(datehook) { unsigned i; for (i = 0; i < ARRAY_SIZE (grub_datetime_names); i++) { grub_register_variable_hook (grub_datetime_names[i], grub_read_hook_datetime, 0); grub_env_export (grub_datetime_names[i]); } } GRUB_MOD_FINI(datehook) { unsigned i; for (i = 0; i < ARRAY_SIZE (grub_datetime_names); i++) { grub_register_variable_hook (grub_datetime_names[i], 0, 0); grub_env_unset (grub_datetime_names[i]); } } grub-2.14~git20250718.0e36779/grub-core/script/0000755000175000017500000000000015036452576015264 500000000000000grub-2.14~git20250718.0e36779/grub-core/script/argv.c0000644000175000017500000000650315002425525016276 00000000000000/* argv.c - methods for constructing argument vector */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2010 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include /* Return nearest power of two that is >= v. */ static unsigned round_up_exp (unsigned v) { COMPILE_TIME_ASSERT (sizeof (v) == 4); v--; v |= v >> 1; v |= v >> 2; v |= v >> 4; v |= v >> 8; v |= v >> 16; v++; v += (v == 0); return v; } void grub_script_argv_free (struct grub_script_argv *argv) { unsigned i; if (argv->args) { for (i = 0; i < argv->argc; i++) grub_free (argv->args[i]); grub_free (argv->args); } argv->argc = 0; argv->args = 0; argv->script = 0; } /* Make argv from argc, args pair. */ int grub_script_argv_make (struct grub_script_argv *argv, int argc, char **args) { int i; struct grub_script_argv r = { 0, 0, 0 }; for (i = 0; i < argc; i++) if (grub_script_argv_next (&r) || grub_script_argv_append (&r, args[i], grub_strlen (args[i]))) { grub_script_argv_free (&r); return 1; } *argv = r; return 0; } /* Prepare for next argc. */ int grub_script_argv_next (struct grub_script_argv *argv) { char **p = argv->args; grub_size_t sz; if (argv->args && argv->argc && argv->args[argv->argc - 1] == 0) return 0; if (grub_add (argv->argc, 2, &sz) || grub_mul (sz, sizeof (char *), &sz)) return 1; p = grub_realloc (p, round_up_exp (sz)); if (! p) return 1; argv->argc++; argv->args = p; if (argv->argc == 1) argv->args[0] = 0; argv->args[argv->argc] = 0; return 0; } /* Append `s' to the last argument. */ int grub_script_argv_append (struct grub_script_argv *argv, const char *s, grub_size_t slen) { grub_size_t a; char *p = argv->args[argv->argc - 1]; grub_size_t sz; if (! s) return 0; a = p ? grub_strlen (p) : 0; if (grub_add (a, slen, &sz) || grub_add (sz, 1, &sz) || grub_mul (sz, sizeof (char), &sz)) return 1; p = grub_realloc (p, round_up_exp (sz)); if (! p) return 1; grub_memcpy (p + a, s, slen); p[a+slen] = 0; argv->args[argv->argc - 1] = p; return 0; } /* Split `s' and append words as multiple arguments. */ int grub_script_argv_split_append (struct grub_script_argv *argv, const char *s) { const char *p; int errors = 0; if (! s) return 0; while (*s && grub_isspace (*s)) s++; while (! errors && *s) { p = s; while (*s && ! grub_isspace (*s)) s++; errors += grub_script_argv_append (argv, p, s - p); while (*s && grub_isspace (*s)) s++; if (*s) errors += grub_script_argv_next (argv); } return errors; } grub-2.14~git20250718.0e36779/grub-core/script/main.c0000644000175000017500000000547615000202015016254 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (C) 2009 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include grub_err_t grub_normal_parse_line (char *line, grub_reader_getline_t getline, void *getline_data) { struct grub_script *parsed_script; /* Parse the script. */ parsed_script = grub_script_parse (line, getline, getline_data); if (parsed_script) { /* Execute the command(s). */ grub_script_execute (parsed_script); /* The parsed script was executed, throw it away. */ grub_script_unref (parsed_script); } return grub_errno; } static grub_command_t cmd_break; static grub_command_t cmd_continue; static grub_command_t cmd_shift; static grub_command_t cmd_setparams; static grub_command_t cmd_return; void grub_script_init (void) { cmd_break = grub_register_command ("break", grub_script_break, N_("[NUM]"), N_("Exit from loops")); cmd_continue = grub_register_command ("continue", grub_script_break, N_("[NUM]"), N_("Continue loops")); cmd_shift = grub_register_command ("shift", grub_script_shift, N_("[NUM]"), /* TRANSLATORS: Positional arguments are arguments $0, $1, $2, ... */ N_("Shift positional parameters.")); cmd_setparams = grub_register_command ("setparams", grub_script_setparams, N_("[VALUE]..."), N_("Set positional parameters.")); cmd_return = grub_register_command ("return", grub_script_return, N_("[NUM]"), /* TRANSLATORS: It's a command description and "Return" is a verb, not a noun. The command in question is "return" and has exactly the same semanics as bash equivalent. */ N_("Return from a function.")); } void grub_script_fini (void) { if (cmd_break) grub_unregister_command (cmd_break); cmd_break = 0; if (cmd_continue) grub_unregister_command (cmd_continue); cmd_continue = 0; if (cmd_shift) grub_unregister_command (cmd_shift); cmd_shift = 0; if (cmd_setparams) grub_unregister_command (cmd_setparams); cmd_setparams = 0; if (cmd_return) grub_unregister_command (cmd_return); cmd_return = 0; } grub-2.14~git20250718.0e36779/grub-core/script/yylex.l0000644000175000017500000002677215002425525016534 00000000000000%{ /* yylex.l The scripting lexer. */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2009,2010 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include "grub_script.tab.h" #pragma GCC diagnostic ignored "-Wunused-parameter" #pragma GCC diagnostic ignored "-Wmissing-prototypes" #pragma GCC diagnostic ignored "-Wmissing-declarations" #pragma GCC diagnostic ignored "-Wunused-function" #pragma GCC diagnostic ignored "-Wsign-compare" #define yyalloc(size, scanner) (grub_malloc((size))) #define yyfree(ptr, scanner) (grub_free((ptr))) #define yyrealloc(ptr, size, scanner) (grub_realloc((ptr), (size))) /* * As we don't have access to yyscanner, we cannot do much except to * print the fatal error and exit. */ #define YY_FATAL_ERROR(msg) \ do { \ grub_fatal (_("fatal error: %s\n"), _(msg));\ } while (0) #define COPY(str, hint) \ do { \ copy_string (yyextra, str, hint); \ } while (0) #define RECORD \ do { \ grub_script_lexer_record (yyextra, yytext); \ } while (0) #define ARG(t) \ do { \ yyextra->lexerstate->type = t; \ return GRUB_PARSER_TOKEN_WORD; \ } while (0) /* We don't need YY_INPUT, as we rely on yy_scan_strings */ #define YY_INPUT(buf,res,max) do { res = 0; } while (0) /* forward declarations */ static int grub_lexer_unput (const char *input, yyscan_t yyscanner); static int grub_lexer_resplit (const char *input, yyscan_t yyscanner); static void copy_string (struct grub_parser_param *, const char *, unsigned hint); %} %top{ #include #include typedef size_t yy_size_t; #define YY_TYPEDEF_YY_SIZE_T 1 /* * Some flex hacks for -nostdinc; XXX We need to fix these when libc * support becomes availble in GRUB. */ #ifndef GRUB_UTIL #define stdin 0 #define stdout 0 #define fprintf(...) (void)0 #define exit(...) grub_fatal("fatal error in lexer") #endif } %option ecs %option meta-ecs %option warn %option array %option stack %option reentrant %option bison-bridge %option never-interactive %option noyyfree noyyalloc noyyrealloc %option nounistd nostdinit nodefault noyylineno /* Reduce lexer size, by not defining these. */ %option noyy_top_state %option noinput nounput %option noyyget_in noyyset_in %option noyyget_out noyyset_out %option noyyget_debug noyyset_debug %option noyyget_lineno noyyset_lineno %option extra-type="struct grub_parser_param*" BLANK [ \t] COMMENT #.*$ CHAR [^{}|&$;<> \t\n\'\"\\] DIGITS [[:digit:]]+ NAME [[:alpha:]_][[:alnum:]_]* ESC \\(.|\n) SQCHR [^\'] DQCHR {ESC}|[^\\\"] DQSTR \"{DQCHR}*\" I18NSTR \$\"{DQCHR}*\" SQSTR \'{SQCHR}*\' SPECIAL \?|\#|\*|\@ VARIABLE ${NAME}|$\{{NAME}\}|${DIGITS}|$\{{DIGITS}\}|${SPECIAL}|$\{{SPECIAL}\} WORD ({CHAR}|{DQSTR}|{SQSTR}|{ESC}|{VARIABLE}|{I18NSTR})+ MULTILINE {WORD}?((\"{DQCHR}*)|(\$\"{DQCHR}*)|(\'{SQCHR}*)) POS_MULTILINE {WORD}?\\\n %x SPLIT %x DQUOTE %x I18NQUOTE %x SQUOTE %x VAR %% /* White spaces */ {BLANK}+ { RECORD; } {COMMENT} { RECORD; } /* Special symbols */ "\n" { RECORD; return GRUB_PARSER_TOKEN_NEWLINE; } "||" { RECORD; return GRUB_PARSER_TOKEN_OR; } "&&" { RECORD; return GRUB_PARSER_TOKEN_AND; } ";;" { RECORD; return GRUB_PARSER_TOKEN_SEMI2; } "|" { RECORD; return GRUB_PARSER_TOKEN_PIPE; } "&" { RECORD; return GRUB_PARSER_TOKEN_AMP; } ";" { RECORD; return GRUB_PARSER_TOKEN_SEMI; } "<" { RECORD; return GRUB_PARSER_TOKEN_LT; } ">" { RECORD; return GRUB_PARSER_TOKEN_GT; } /* Reserved words */ "{" { RECORD; return GRUB_PARSER_TOKEN_LBR; } "}" { RECORD; return GRUB_PARSER_TOKEN_RBR; } "[[" { RECORD; return GRUB_PARSER_TOKEN_LSQBR2; } "]]" { RECORD; return GRUB_PARSER_TOKEN_RSQBR2; } "case" { RECORD; return GRUB_PARSER_TOKEN_CASE; } "do" { RECORD; return GRUB_PARSER_TOKEN_DO; } "done" { RECORD; return GRUB_PARSER_TOKEN_DONE; } "elif" { RECORD; return GRUB_PARSER_TOKEN_ELIF; } "else" { RECORD; return GRUB_PARSER_TOKEN_ELSE; } "esac" { RECORD; return GRUB_PARSER_TOKEN_ESAC; } "fi" { RECORD; return GRUB_PARSER_TOKEN_FI; } "for" { RECORD; return GRUB_PARSER_TOKEN_FOR; } "if" { RECORD; return GRUB_PARSER_TOKEN_IF; } "in" { RECORD; return GRUB_PARSER_TOKEN_IN; } "select" { RECORD; return GRUB_PARSER_TOKEN_SELECT; } "then" { RECORD; return GRUB_PARSER_TOKEN_THEN; } "until" { RECORD; return GRUB_PARSER_TOKEN_UNTIL; } "while" { RECORD; return GRUB_PARSER_TOKEN_WHILE; } "function" { RECORD; return GRUB_PARSER_TOKEN_FUNCTION; } {MULTILINE} { if (grub_lexer_unput (yytext, yyscanner)) return GRUB_PARSER_TOKEN_BAD; } {POS_MULTILINE} { if (yyg->yy_c_buf_p + 1 == &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars + 1] ) { if (grub_lexer_unput (yytext, yyscanner)) return GRUB_PARSER_TOKEN_BAD; } else { RECORD; yypush_buffer_state (YY_CURRENT_BUFFER, yyscanner); if (grub_lexer_resplit (yytext, yyscanner)) { yypop_buffer_state (yyscanner); return GRUB_PARSER_TOKEN_WORD; } yyextra->lexerstate->resplit = 1; } } {NAME} { RECORD; return GRUB_PARSER_TOKEN_NAME; } {WORD} { RECORD; yypush_buffer_state (YY_CURRENT_BUFFER, yyscanner); if (grub_lexer_resplit (yytext, yyscanner)) { yypop_buffer_state (yyscanner); return GRUB_PARSER_TOKEN_WORD; } yyextra->lexerstate->resplit = 1; } . { grub_script_yyerror (yyextra, yytext); return GRUB_PARSER_TOKEN_BAD; } /* Split word into multiple args */ { \\. { COPY (yytext, yyleng); } \\\n { /* ignore */ } \" { yy_push_state (DQUOTE, yyscanner); ARG (GRUB_SCRIPT_ARG_TYPE_TEXT); } \' { yy_push_state (SQUOTE, yyscanner); ARG (GRUB_SCRIPT_ARG_TYPE_TEXT); } "\$\"" { yy_push_state (I18NQUOTE, yyscanner); ARG (GRUB_SCRIPT_ARG_TYPE_GETTEXT); } \$ { yy_push_state (VAR, yyscanner); ARG (GRUB_SCRIPT_ARG_TYPE_TEXT); } \\ | [^\"\'\$\\]+ { COPY (yytext, yyleng); } <> { yy_pop_state (yyscanner); yypop_buffer_state (yyscanner); yyextra->lexerstate->resplit = 0; yyextra->lexerstate->merge_end = 1; ARG (GRUB_SCRIPT_ARG_TYPE_TEXT); } } { {SPECIAL} | {DIGITS} | {NAME} { COPY (yytext, yyleng); yy_pop_state (yyscanner); if (YY_START == SPLIT) ARG (GRUB_SCRIPT_ARG_TYPE_VAR); else ARG (GRUB_SCRIPT_ARG_TYPE_DQVAR); } \{{SPECIAL}\} | \{{DIGITS}\} | \{{NAME}\} { yytext[yyleng - 1] = '\0'; COPY (yytext + 1, yyleng - 2); yy_pop_state (yyscanner); if (YY_START == SPLIT) ARG (GRUB_SCRIPT_ARG_TYPE_VAR); else ARG (GRUB_SCRIPT_ARG_TYPE_DQVAR); } .|\n { return GRUB_PARSER_TOKEN_BAD; } } { \' { yy_pop_state (yyscanner); ARG (GRUB_SCRIPT_ARG_TYPE_SQSTR); } [^\']+ { COPY (yytext, yyleng); } } { \\\$ { COPY ("$", 1); } \\\\ { COPY ("\\", 1); } \\\" { COPY ("\"", 1); } \\\n { /* ignore */ } [^\"\$\\\n]+ { COPY (yytext, yyleng); } \" { yy_pop_state (yyscanner); ARG (GRUB_SCRIPT_ARG_TYPE_DQSTR); } \$ { yy_push_state (VAR, yyscanner); ARG (GRUB_SCRIPT_ARG_TYPE_DQSTR); } (.|\n) { COPY (yytext, yyleng); } } { \\\\ { COPY ("\\\\", 2); } \\\" { COPY ("\"", 1); } \\\n { /* ignore */ } [^\"\\\n]+ { COPY (yytext, yyleng); } \" { yy_pop_state (yyscanner); ARG (GRUB_SCRIPT_ARG_TYPE_GETTEXT); } \\ { COPY ("\\", 1); } (.|\n) { COPY (yytext, yyleng); } } <> { yypop_buffer_state (yyscanner); yyextra->lexerstate->eof = 1; return GRUB_PARSER_TOKEN_EOF; } %% int yywrap (yyscan_t yyscanner) { if (yyget_extra (yyscanner)->lexerstate->resplit) return 1; return grub_script_lexer_yywrap (yyget_extra (yyscanner), 0); } static void copy_string (struct grub_parser_param *parser, const char *str, unsigned hint) { grub_size_t size; char *ptr; unsigned len; len = hint ? hint : grub_strlen (str); if (parser->lexerstate->used + len >= parser->lexerstate->size) { size = len * 2; if (size < parser->lexerstate->size * 2) size = parser->lexerstate->size * 2; ptr = grub_realloc (parser->lexerstate->text, size); if (!ptr) { grub_script_yyerror (parser, 0); return; } parser->lexerstate->text = ptr; parser->lexerstate->size = size; } grub_strcpy (parser->lexerstate->text + parser->lexerstate->used - 1, str); parser->lexerstate->used += len; } static int grub_lexer_resplit (const char *text, yyscan_t yyscanner) { /* resplit text */ if (yy_scan_string (text, yyscanner)) { yyget_extra (yyscanner)->lexerstate->merge_start = 1; yy_push_state (SPLIT, yyscanner); return 0; } grub_script_yyerror (yyget_extra (yyscanner), 0); return 1; } static int grub_lexer_unput (const char *text, yyscan_t yyscanner) { struct grub_lexer_param *lexerstate = yyget_extra (yyscanner)->lexerstate; grub_free (lexerstate->prefix); lexerstate->prefix = grub_strdup (text); if (! lexerstate->prefix) { grub_script_yyerror (yyget_extra (yyscanner), N_("out of memory")); return 1; } return 0; } grub-2.14~git20250718.0e36779/grub-core/script/script.c0000644000175000017500000002341615000202015016626 00000000000000/* script.c -- Functions to create an in memory description of the script. */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2005,2006,2007,2009,2010 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include /* It is not possible to deallocate the memory when a syntax error was found. Because of that it is required to keep track of all memory allocations. The memory is freed in case of an error, or assigned to the parsed script when parsing was successful. In case of the normal malloc, some additional bytes are allocated for this datastructure. All reserved memory is stored in a linked list so it can be easily freed. The original memory can be found from &mem. */ struct grub_script_mem { struct grub_script_mem *next; char mem; }; /* Return malloc'ed memory and keep track of the allocation. */ void * grub_script_malloc (struct grub_parser_param *state, grub_size_t size) { struct grub_script_mem *mem; mem = (struct grub_script_mem *) grub_malloc (size + sizeof (*mem) - sizeof (char)); if (!mem) return 0; grub_dprintf ("scripting", "malloc %p\n", mem); mem->next = state->memused; state->memused = mem; return (void *) &mem->mem; } /* Free all memory described by MEM. */ void grub_script_mem_free (struct grub_script_mem *mem) { struct grub_script_mem *memfree; while (mem) { memfree = mem->next; grub_dprintf ("scripting", "free %p\n", mem); grub_free (mem); mem = memfree; } } /* Start recording memory usage. Returns the memory that should be restored when calling stop. */ struct grub_script_mem * grub_script_mem_record (struct grub_parser_param *state) { struct grub_script_mem *mem = state->memused; state->memused = 0; return mem; } /* Stop recording memory usage. Restore previous recordings using RESTORE. Return the recorded memory. */ struct grub_script_mem * grub_script_mem_record_stop (struct grub_parser_param *state, struct grub_script_mem *restore) { struct grub_script_mem *mem = state->memused; state->memused = restore; return mem; } /* Free the memory reserved for CMD and all of it's children. */ void grub_script_free (struct grub_script *script) { struct grub_script *s; struct grub_script *t; if (! script) return; if (script->mem) grub_script_mem_free (script->mem); s = script->children; while (s) { t = s->next_siblings; grub_script_unref (s); s = t; } grub_free (script); } /* Extend the argument arg with a variable or string of text. If ARG is zero a new list is created. */ struct grub_script_arg * grub_script_arg_add (struct grub_parser_param *state, struct grub_script_arg *arg, grub_script_arg_type_t type, char *str) { struct grub_script_arg *argpart; struct grub_script_arg *ll; int len; argpart = (struct grub_script_arg *) grub_script_malloc (state, sizeof (*arg)); if (!argpart) return arg; argpart->type = type; argpart->script = 0; len = grub_strlen (str) + 1; argpart->str = grub_script_malloc (state, len); if (!argpart->str) return arg; /* argpart is freed later, during grub_script_free. */ grub_memcpy (argpart->str, str, len); argpart->next = 0; if (!arg) return argpart; for (ll = arg; ll->next; ll = ll->next); ll->next = argpart; return arg; } /* Add the argument ARG to the end of the argument list LIST. If LIST is zero, a new list will be created. */ struct grub_script_arglist * grub_script_add_arglist (struct grub_parser_param *state, struct grub_script_arglist *list, struct grub_script_arg *arg) { struct grub_script_arglist *link; struct grub_script_arglist *ll; grub_dprintf ("scripting", "arglist\n"); link = (struct grub_script_arglist *) grub_script_malloc (state, sizeof (*link)); if (!link) return list; link->next = 0; link->arg = arg; link->argcount = 0; if (!list) { link->argcount++; return link; } list->argcount++; /* Look up the last link in the chain. */ for (ll = list; ll->next; ll = ll->next); ll->next = link; return list; } /* Create a command that describes a single command line. CMDLINE contains the name of the command that should be executed. ARGLIST holds all arguments for this command. */ struct grub_script_cmd * grub_script_create_cmdline (struct grub_parser_param *state, struct grub_script_arglist *arglist) { struct grub_script_cmdline *cmd; grub_dprintf ("scripting", "cmdline\n"); cmd = grub_script_malloc (state, sizeof (*cmd)); if (!cmd) return 0; cmd->cmd.exec = grub_script_execute_cmdline; cmd->cmd.next = 0; cmd->arglist = arglist; return (struct grub_script_cmd *) cmd; } /* Create a command that functions as an if statement. If BOOL is evaluated to true (the value is returned in envvar '?'), the interpreter will run the command TRUE, otherwise the interpreter runs the command FALSE. */ struct grub_script_cmd * grub_script_create_cmdif (struct grub_parser_param *state, struct grub_script_cmd *exec_to_evaluate, struct grub_script_cmd *exec_on_true, struct grub_script_cmd *exec_on_false) { struct grub_script_cmdif *cmd; grub_dprintf ("scripting", "cmdif\n"); cmd = grub_script_malloc (state, sizeof (*cmd)); if (!cmd) return 0; cmd->cmd.exec = grub_script_execute_cmdif; cmd->cmd.next = 0; cmd->exec_to_evaluate = exec_to_evaluate; cmd->exec_on_true = exec_on_true; cmd->exec_on_false = exec_on_false; return (struct grub_script_cmd *) cmd; } /* Create a command that functions as a for statement. */ struct grub_script_cmd * grub_script_create_cmdfor (struct grub_parser_param *state, struct grub_script_arg *name, struct grub_script_arglist *words, struct grub_script_cmd *list) { struct grub_script_cmdfor *cmd; grub_dprintf ("scripting", "cmdfor\n"); cmd = grub_script_malloc (state, sizeof (*cmd)); if (! cmd) return 0; cmd->cmd.exec = grub_script_execute_cmdfor; cmd->cmd.next = 0; cmd->name = name; cmd->words = words; cmd->list = list; return (struct grub_script_cmd *) cmd; } /* Create a "while" or "until" command. */ struct grub_script_cmd * grub_script_create_cmdwhile (struct grub_parser_param *state, struct grub_script_cmd *cond, struct grub_script_cmd *list, int is_an_until_loop) { struct grub_script_cmdwhile *cmd; cmd = grub_script_malloc (state, sizeof (*cmd)); if (! cmd) return 0; cmd->cmd.exec = grub_script_execute_cmdwhile; cmd->cmd.next = 0; cmd->cond = cond; cmd->list = list; cmd->until = is_an_until_loop; return (struct grub_script_cmd *) cmd; } /* Create a chain of commands. LAST contains the command that should be added at the end of LIST's list. If LIST is zero, a new list will be created. */ struct grub_script_cmd * grub_script_append_cmd (struct grub_parser_param *state, struct grub_script_cmd *list, struct grub_script_cmd *last) { struct grub_script_cmd *ptr; grub_dprintf ("scripting", "append command\n"); if (! last) return list; if (! list) { list = grub_script_malloc (state, sizeof (*list)); if (! list) return 0; list->exec = grub_script_execute_cmdlist; list->next = last; } else { ptr = list; while (ptr->next) ptr = ptr->next; ptr->next = last; } return list; } struct grub_script * grub_script_create (struct grub_script_cmd *cmd, struct grub_script_mem *mem) { struct grub_script *parsed; parsed = grub_malloc (sizeof (*parsed)); if (! parsed) return 0; parsed->mem = mem; parsed->cmd = cmd; parsed->refcnt = 0; parsed->children = 0; parsed->next_siblings = 0; return parsed; } /* Parse the script passed in SCRIPT and return the parsed datastructure that is ready to be interpreted. */ struct grub_script * grub_script_parse (char *script, grub_reader_getline_t getline, void *getline_data) { struct grub_script *parsed; struct grub_script_mem *membackup; struct grub_lexer_param *lexstate; struct grub_parser_param *parsestate; parsed = grub_script_create (0, 0); if (!parsed) return 0; parsestate = grub_zalloc (sizeof (*parsestate)); if (!parsestate) { grub_free (parsed); return 0; } /* Initialize the lexer. */ lexstate = grub_script_lexer_init (parsestate, script, getline, getline_data); if (!lexstate) { grub_free (parsed); grub_free (parsestate); return 0; } parsestate->lexerstate = lexstate; membackup = grub_script_mem_record (parsestate); /* Parse the script. */ if (grub_script_yyparse (parsestate) || parsestate->err) { struct grub_script_mem *memfree; memfree = grub_script_mem_record_stop (parsestate, membackup); grub_script_mem_free (memfree); grub_script_lexer_fini (lexstate); grub_free (parsestate); grub_free (parsed); return 0; } parsed->mem = grub_script_mem_record_stop (parsestate, membackup); parsed->cmd = parsestate->parsed; parsed->children = parsestate->scripts; grub_script_lexer_fini (lexstate); grub_free (parsestate); return parsed; } grub-2.14~git20250718.0e36779/grub-core/script/parser.y0000644000175000017500000002477115002425525016670 00000000000000/* parser.y - The scripting parser. */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2005,2006,2007,2008,2009,2010 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ %{ #include #include #include #include #define YYFREE grub_free #define YYMALLOC grub_malloc #define YYLTYPE_IS_TRIVIAL 0 #define YYENABLE_NLS 0 #include "grub_script.tab.h" #pragma GCC diagnostic ignored "-Wmissing-declarations" %} %union { struct grub_script_cmd *cmd; struct grub_script_arglist *arglist; struct grub_script_arg *arg; char *string; struct { unsigned offset; struct grub_script_mem *memory; struct grub_script *scripts; }; } %token GRUB_PARSER_TOKEN_BAD %token GRUB_PARSER_TOKEN_EOF 0 "end-of-input" %token GRUB_PARSER_TOKEN_NEWLINE "\n" %token GRUB_PARSER_TOKEN_AND "&&" %token GRUB_PARSER_TOKEN_OR "||" %token GRUB_PARSER_TOKEN_SEMI2 ";;" %token GRUB_PARSER_TOKEN_PIPE "|" %token GRUB_PARSER_TOKEN_AMP "&" %token GRUB_PARSER_TOKEN_SEMI ";" %token GRUB_PARSER_TOKEN_LBR "{" %token GRUB_PARSER_TOKEN_RBR "}" %token GRUB_PARSER_TOKEN_NOT "!" %token GRUB_PARSER_TOKEN_LSQBR2 "[" %token GRUB_PARSER_TOKEN_RSQBR2 "]" %token GRUB_PARSER_TOKEN_LT "<" %token GRUB_PARSER_TOKEN_GT ">" %token GRUB_PARSER_TOKEN_CASE "case" %token GRUB_PARSER_TOKEN_DO "do" %token GRUB_PARSER_TOKEN_DONE "done" %token GRUB_PARSER_TOKEN_ELIF "elif" %token GRUB_PARSER_TOKEN_ELSE "else" %token GRUB_PARSER_TOKEN_ESAC "esac" %token GRUB_PARSER_TOKEN_FI "fi" %token GRUB_PARSER_TOKEN_FOR "for" %token GRUB_PARSER_TOKEN_IF "if" %token GRUB_PARSER_TOKEN_IN "in" %token GRUB_PARSER_TOKEN_SELECT "select" %token GRUB_PARSER_TOKEN_THEN "then" %token GRUB_PARSER_TOKEN_UNTIL "until" %token GRUB_PARSER_TOKEN_WHILE "while" %token GRUB_PARSER_TOKEN_FUNCTION "function" %token GRUB_PARSER_TOKEN_NAME "name" %token GRUB_PARSER_TOKEN_WORD "word" %type block block0 %type word argument arguments0 arguments1 %type script_init script %type grubcmd ifclause ifcmd forcmd whilecmd untilcmd %type command commands1 statement %pure-parser %lex-param { struct grub_parser_param *state }; %parse-param { struct grub_parser_param *state }; %start script_init %% /* It should be possible to do this in a clean way... */ script_init: { state->err = 0; } script { state->parsed = $2; state->err = 0; } ; script: newlines0 { $$ = 0; } | script statement delimiter newlines0 { $$ = grub_script_append_cmd (state, $1, $2); } | error { $$ = 0; yyerror (state, N_("Incorrect command")); yyerrok; } ; newlines0: /* Empty */ | newlines1 ; newlines1: newlines0 "\n" ; delimiter: ";" | "\n" ; delimiters0: /* Empty */ | delimiters1 ; delimiters1: delimiter | delimiters1 "\n" ; word: GRUB_PARSER_TOKEN_NAME { $$ = grub_script_add_arglist (state, 0, $1); } | GRUB_PARSER_TOKEN_WORD { $$ = grub_script_add_arglist (state, 0, $1); } ; statement: command { $$ = $1; } | function { $$ = 0; } ; argument : "case" { $$ = grub_script_add_arglist (state, 0, $1); } | "do" { $$ = grub_script_add_arglist (state, 0, $1); } | "done" { $$ = grub_script_add_arglist (state, 0, $1); } | "elif" { $$ = grub_script_add_arglist (state, 0, $1); } | "else" { $$ = grub_script_add_arglist (state, 0, $1); } | "esac" { $$ = grub_script_add_arglist (state, 0, $1); } | "fi" { $$ = grub_script_add_arglist (state, 0, $1); } | "for" { $$ = grub_script_add_arglist (state, 0, $1); } | "if" { $$ = grub_script_add_arglist (state, 0, $1); } | "in" { $$ = grub_script_add_arglist (state, 0, $1); } | "select" { $$ = grub_script_add_arglist (state, 0, $1); } | "then" { $$ = grub_script_add_arglist (state, 0, $1); } | "until" { $$ = grub_script_add_arglist (state, 0, $1); } | "while" { $$ = grub_script_add_arglist (state, 0, $1); } | "function" { $$ = grub_script_add_arglist (state, 0, $1); } | word { $$ = $1; } ; /* Block parameter is passed to commands in two forms: as unparsed string and as pre-parsed grub_script object. Passing as grub_script object makes memory management difficult, because: (1) Command may want to keep a reference to grub_script objects for later use, so script framework may not free the grub_script object after command completes. (2) Command may get called multiple times with same grub_script object under loops, so we should not let command implementation to free the grub_script object. To solve above problems, we rely on reference counting for grub_script objects. Commands that want to keep the grub_script object must take a reference to it. Other complexity comes with arbitrary nesting of grub_script objects: a grub_script object may have commands with several block parameters, and each block parameter may further contain multiple block parameters nested. We use temporary variable, state->scripts to collect nested child scripts (that are linked by siblings and children members), and will build grub_scripts tree from bottom. */ block: "{" { grub_script_lexer_ref (state->lexerstate); $$ = grub_script_lexer_record_start (state); $$ = grub_script_mem_record (state); /* save currently known scripts. */ $$ = state->scripts; state->scripts = 0; } commands1 delimiters0 "}" { char *p; struct grub_script_mem *memory; struct grub_script *s = $2; memory = grub_script_mem_record_stop (state, $2); if ((p = grub_script_lexer_record_stop (state, $2))) *grub_strrchr (p, '}') = '\0'; $$ = grub_script_arg_add (state, 0, GRUB_SCRIPT_ARG_TYPE_BLOCK, p); if (! $$ || ! ($$->script = grub_script_create ($3, memory))) grub_script_mem_free (memory); else { /* attach nested scripts to $$->script as children */ $$->script->children = state->scripts; /* restore old scripts; append $$->script to siblings. */ state->scripts = $2 ?: $$->script; if (s) { while (s->next_siblings) s = s->next_siblings; s->next_siblings = $$->script; } } grub_script_lexer_deref (state->lexerstate); } ; block0: /* Empty */ { $$ = 0; } | block { $$ = $1; } ; arguments0: /* Empty */ { $$ = 0; } | arguments1 { $$ = $1; } ; arguments1: argument arguments0 { if ($1 && $2) { $1->next = $2; $1->argcount += $2->argcount; $2->argcount = 0; } $$ = $1; } ; grubcmd: word arguments0 block0 { struct grub_script_arglist *x = $2; if ($3) x = grub_script_add_arglist (state, $2, $3); if ($1 && x) { $1->next = x; $1->argcount += x->argcount; x->argcount = 0; } $$ = grub_script_create_cmdline (state, $1); } ; /* A single command. */ command: grubcmd { $$ = $1; } | ifcmd { $$ = $1; } | forcmd { $$ = $1; } | whilecmd { $$ = $1; } | untilcmd { $$ = $1; } ; /* A list of commands. */ commands1: newlines0 command { $$ = grub_script_append_cmd (state, 0, $2); } | commands1 delimiters1 command { $$ = grub_script_append_cmd (state, $1, $3); } ; function: "function" "name" { grub_script_lexer_ref (state->lexerstate); state->func_mem = grub_script_mem_record (state); $$ = state->scripts; state->scripts = 0; } newlines0 "{" commands1 delimiters1 "}" { struct grub_script *script; state->func_mem = grub_script_mem_record_stop (state, state->func_mem); script = grub_script_create ($6, state->func_mem); if (! script) grub_script_mem_free (state->func_mem); else { script->children = state->scripts; if (!grub_script_function_create ($2, script)) grub_script_free (script); } state->scripts = $3; grub_script_lexer_deref (state->lexerstate); } ; ifcmd: "if" { grub_script_lexer_ref (state->lexerstate); } ifclause "fi" { $$ = $3; grub_script_lexer_deref (state->lexerstate); } ; ifclause: commands1 delimiters1 "then" commands1 delimiters1 { $$ = grub_script_create_cmdif (state, $1, $4, 0); } | commands1 delimiters1 "then" commands1 delimiters1 "else" commands1 delimiters1 { $$ = grub_script_create_cmdif (state, $1, $4, $7); } | commands1 delimiters1 "then" commands1 delimiters1 "elif" ifclause { $$ = grub_script_create_cmdif (state, $1, $4, $7); } ; forcmd: "for" "name" { grub_script_lexer_ref (state->lexerstate); } "in" arguments0 delimiters1 "do" commands1 delimiters1 "done" { $$ = grub_script_create_cmdfor (state, $2, $5, $8); grub_script_lexer_deref (state->lexerstate); } ; whilecmd: "while" { grub_script_lexer_ref (state->lexerstate); } commands1 delimiters1 "do" commands1 delimiters1 "done" { $$ = grub_script_create_cmdwhile (state, $3, $6, 0); grub_script_lexer_deref (state->lexerstate); } ; untilcmd: "until" { grub_script_lexer_ref (state->lexerstate); } commands1 delimiters1 "do" commands1 delimiters1 "done" { $$ = grub_script_create_cmdwhile (state, $3, $6, 1); grub_script_lexer_deref (state->lexerstate); } ; grub-2.14~git20250718.0e36779/grub-core/script/lexer.c0000644000175000017500000001772515033157230016465 00000000000000/* lexer.c - The scripting lexer. */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2005,2006,2007,2008,2009,2010 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include #include #define yytext_ptr char * #include "grub_script.tab.h" #include "grub_script.yy.h" void grub_script_lexer_ref (struct grub_lexer_param *state) { state->refs++; } void grub_script_lexer_deref (struct grub_lexer_param *state) { state->refs--; } /* Start recording all characters passing through the lexer. */ unsigned grub_script_lexer_record_start (struct grub_parser_param *parser) { struct grub_lexer_param *lexer = parser->lexerstate; lexer->record++; if (lexer->recording) return lexer->recordpos; lexer->recordpos = 0; lexer->recordlen = GRUB_LEXER_INITIAL_RECORD_SIZE; lexer->recording = grub_malloc (lexer->recordlen); if (!lexer->recording) { grub_script_yyerror (parser, 0); lexer->recordlen = 0; } return lexer->recordpos; } char * grub_script_lexer_record_stop (struct grub_parser_param *parser, unsigned offset) { int count; char *result; struct grub_lexer_param *lexer = parser->lexerstate; if (!lexer->record) return 0; lexer->record--; if (!lexer->recording) return 0; count = lexer->recordpos - offset; result = grub_script_malloc (parser, count + 1); if (result) { grub_strncpy (result, lexer->recording + offset, count); result[count] = '\0'; } if (lexer->record == 0) { grub_free (lexer->recording); lexer->recording = 0; lexer->recordlen = 0; lexer->recordpos = 0; } return result; } /* Record STR if input recording is enabled. */ void grub_script_lexer_record (struct grub_parser_param *parser, char *str) { int len; char *old; struct grub_lexer_param *lexer = parser->lexerstate; if (!lexer->record || !lexer->recording) return; len = grub_strlen (str); if (lexer->recordpos + len + 1 > lexer->recordlen) { old = lexer->recording; if (lexer->recordlen < len) lexer->recordlen = len; if (grub_mul (lexer->recordlen, 2, &lexer->recordlen)) goto fail; lexer->recording = grub_realloc (lexer->recording, lexer->recordlen); if (!lexer->recording) { fail: grub_free (old); lexer->recordpos = 0; lexer->recordlen = 0; grub_script_yyerror (parser, 0); return; } } grub_strcpy (lexer->recording + lexer->recordpos, str); lexer->recordpos += len; } /* Read next line of input if necessary, and set yyscanner buffers. */ int grub_script_lexer_yywrap (struct grub_parser_param *parserstate, const char *input) { grub_size_t len = 0, sz; char *p = 0; char *line = 0; YY_BUFFER_STATE buffer; struct grub_lexer_param *lexerstate = parserstate->lexerstate; if (! lexerstate->refs && ! lexerstate->prefix && ! input) return 1; if (! lexerstate->getline && ! input) { grub_script_yyerror (parserstate, N_("unexpected end of file")); return 1; } line = 0; if (! input) lexerstate->getline (&line, 1, lexerstate->getline_data); else line = grub_strdup (input); if (! line) { grub_script_yyerror (parserstate, N_("out of memory")); return 1; } len = grub_strlen (line); /* Ensure '\n' at the end. */ if (line[0] == '\0') { grub_free (line); line = grub_strdup ("\n"); len = 1; } else if (len && line[len - 1] != '\n') { if (grub_add (len, 2, &sz)) { grub_free (line); grub_script_yyerror (parserstate, N_("overflow is detected")); return 1; } p = grub_realloc (line, sz); if (p) { p[len++] = '\n'; p[len] = '\0'; } else grub_free (line); line = p; } if (! line) { grub_script_yyerror (parserstate, N_("out of memory")); return 1; } /* Prepend any left over unput-text. */ if (lexerstate->prefix) { int plen = grub_strlen (lexerstate->prefix); p = grub_malloc (len + plen + 1); if (! p) { grub_free (line); return 1; } grub_strcpy (p, lexerstate->prefix); lexerstate->prefix = 0; grub_strcpy (p + plen, line); grub_free (line); line = p; len = len + plen; } buffer = yy_scan_string (line, lexerstate->yyscanner); grub_free (line); if (! buffer) { grub_script_yyerror (parserstate, 0); return 1; } return 0; } struct grub_lexer_param * grub_script_lexer_init (struct grub_parser_param *parser, char *script, grub_reader_getline_t arg_getline, void *getline_data) { struct grub_lexer_param *lexerstate; lexerstate = grub_zalloc (sizeof (*lexerstate)); if (!lexerstate) return 0; lexerstate->size = GRUB_LEXER_INITIAL_TEXT_SIZE; lexerstate->text = grub_malloc (lexerstate->size); if (!lexerstate->text) { grub_free (lexerstate); return 0; } lexerstate->getline = arg_getline; lexerstate->getline_data = getline_data; /* The other elements of lexerstate are all zeros already. */ if (yylex_init (&lexerstate->yyscanner)) { grub_free (lexerstate->text); grub_free (lexerstate); return 0; } yyset_extra (parser, lexerstate->yyscanner); parser->lexerstate = lexerstate; if (grub_script_lexer_yywrap (parser, script ?: "\n")) { parser->lexerstate = 0; yylex_destroy (lexerstate->yyscanner); grub_free (lexerstate->text); grub_free (lexerstate); return 0; } return lexerstate; } void grub_script_lexer_fini (struct grub_lexer_param *lexerstate) { if (!lexerstate) return; yylex_destroy (lexerstate->yyscanner); grub_free (lexerstate->recording); grub_free (lexerstate->text); grub_free (lexerstate); } int grub_script_yylex (union YYSTYPE *value, struct grub_parser_param *parserstate) { char *str; int token; grub_script_arg_type_t type; struct grub_lexer_param *lexerstate = parserstate->lexerstate; value->arg = 0; if (parserstate->err) return GRUB_PARSER_TOKEN_BAD; if (lexerstate->eof) return GRUB_PARSER_TOKEN_EOF; /* * Words with environment variables, like foo${bar}baz needs * multiple tokens to be merged into a single grub_script_arg. We * use two variables to achieve this: lexerstate->merge_start and * lexerstate->merge_end */ lexerstate->merge_start = 0; lexerstate->merge_end = 0; do { /* Empty lexerstate->text. */ lexerstate->used = 1; lexerstate->text[0] = '\0'; token = yylex (value, lexerstate->yyscanner); if (token == GRUB_PARSER_TOKEN_BAD) break; /* Merging feature uses lexerstate->text instead of yytext. */ if (lexerstate->merge_start) { str = lexerstate->text; type = lexerstate->type; } else { str = yyget_text (lexerstate->yyscanner); type = GRUB_SCRIPT_ARG_TYPE_TEXT; } grub_dprintf("lexer", "token %u text [%s]\n", token, str); value->arg = grub_script_arg_add (parserstate, value->arg, type, str); } while (lexerstate->merge_start && !lexerstate->merge_end); if (!value->arg || parserstate->err) return GRUB_PARSER_TOKEN_BAD; return token; } void grub_script_yyerror (struct grub_parser_param *state, const char *err) { if (err) grub_error (GRUB_ERR_INVALID_COMMAND, "%s", err); grub_print_error (); state->err++; } grub-2.14~git20250718.0e36779/grub-core/script/function.c0000644000175000017500000000574515002425525017173 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (C) 2005,2007,2009,2010 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include grub_script_function_t grub_script_function_list; grub_script_function_t grub_script_function_create (struct grub_script_arg *functionname_arg, struct grub_script *cmd) { grub_script_function_t func; grub_script_function_t *p; func = (grub_script_function_t) grub_malloc (sizeof (*func)); if (! func) return 0; func->executing = 0; func->name = grub_strdup (functionname_arg->str); if (! func->name) { grub_free (func); return 0; } func->func = cmd; /* Keep the list sorted for simplicity. */ p = &grub_script_function_list; while (*p) { if (grub_strcmp ((*p)->name, func->name) >= 0) break; p = &((*p)->next); } /* If the function already exists, overwrite the old function. */ if (*p && grub_strcmp ((*p)->name, func->name) == 0) { grub_script_function_t q; q = *p; grub_free (func); if (q->executing > 0) { grub_error (GRUB_ERR_BAD_ARGUMENT, N_("attempt to redefine a function being executed")); func = NULL; } else { grub_script_free (q->func); q->func = cmd; func = q; } } else { func->next = *p; *p = func; } return func; } void grub_script_function_remove (const char *name) { grub_script_function_t *p, q; for (p = &grub_script_function_list, q = *p; q; p = &(q->next), q = q->next) if (grub_strcmp (name, q->name) == 0) { *p = q->next; grub_free (q->name); grub_script_free (q->func); grub_free (q); break; } } grub_script_function_t grub_script_function_find (char *functionname) { grub_script_function_t func; for (func = grub_script_function_list; func; func = func->next) if (grub_strcmp (functionname, func->name) == 0) break; if (! func) { char tmp[21]; grub_strncpy (tmp, functionname, 20); tmp[20] = 0; /* Avoid truncating inside UTF-8 character. */ tmp[grub_getend (tmp, tmp + grub_strlen (tmp))] = 0; grub_error (GRUB_ERR_UNKNOWN_COMMAND, N_("can't find command `%s'"), tmp); } return func; } grub-2.14~git20250718.0e36779/grub-core/script/execute.c0000644000175000017500000006415115036447510017011 00000000000000/* execute.c -- Execute a GRUB script. */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2005,2007,2008,2009,2010 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include /* Max digits for a char is 3 (0xFF is 255), similarly for an int it is sizeof (int) * 3, and one extra for a possible -ve sign. */ #define ERRNO_DIGITS_MAX (sizeof (int) * 3 + 1) /* * A limit on recursion, to avoid colliding with the heap. UEFI defines a baseline * stack size of 128 KiB. So, assuming at most 1-2 KiB per iteration this should * keep us safe. */ #define MAX_RECURSION_DEPTH 64 static unsigned long is_continue; static unsigned long active_loops; static unsigned long active_breaks; static unsigned long function_return; static unsigned long recursion_depth; #define GRUB_SCRIPT_SCOPE_MALLOCED 1 #define GRUB_SCRIPT_SCOPE_ARGS_MALLOCED 2 /* Scope for grub script functions. */ struct grub_script_scope { unsigned flags; unsigned shifts; struct grub_script_argv argv; }; static struct grub_script_scope *scope = 0; /* Wildcard translator for GRUB script. */ struct grub_script_wildcard_translator *grub_wildcard_translator; static char* wildcard_escape (const char *s) { int i; int len; char ch; char *p; len = grub_strlen (s); p = grub_malloc (len * 2 + 1); if (! p) return NULL; i = 0; while ((ch = *s++)) { if (ch == '*' || ch == '\\' || ch == '?') p[i++] = '\\'; p[i++] = ch; } p[i] = '\0'; return p; } static char* wildcard_unescape (const char *s) { int i; int len; char ch; char *p; len = grub_strlen (s); p = grub_malloc (len + 1); if (! p) return NULL; i = 0; while ((ch = *s++)) { if (ch == '\\') p[i++] = *s++; else p[i++] = ch; } p[i] = '\0'; return p; } static void replace_scope (struct grub_script_scope *new_scope) { if (scope) { scope->argv.argc += scope->shifts; scope->argv.args -= scope->shifts; if (scope->flags & GRUB_SCRIPT_SCOPE_ARGS_MALLOCED) grub_script_argv_free (&scope->argv); if (scope->flags & GRUB_SCRIPT_SCOPE_MALLOCED) grub_free (scope); } scope = new_scope; } grub_err_t grub_script_break (grub_command_t cmd, int argc, char *argv[]) { const char *p = NULL; unsigned long count; if (argc == 0) count = 1; else if (argc > 1) return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("one argument expected")); else { count = grub_strtoul (argv[0], &p, 10); if (grub_errno) return grub_errno; if (*p != '\0') return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("unrecognized number")); if (count == 0) /* TRANSLATORS: 0 is a quantifier. "break" (similar to bash) can be used e.g. to break 3 loops at once. But asking it to break 0 loops makes no sense. */ return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("can't break 0 loops")); } is_continue = grub_strcmp (cmd->name, "break") ? 1 : 0; active_breaks = count; if (active_breaks > active_loops) active_breaks = active_loops; return GRUB_ERR_NONE; } grub_err_t grub_script_shift (grub_command_t cmd __attribute__((unused)), int argc, char *argv[]) { const char *p = NULL; unsigned long n = 0; if (! scope) return GRUB_ERR_NONE; if (argc == 0) n = 1; else if (argc > 1) return GRUB_ERR_BAD_ARGUMENT; else { n = grub_strtoul (argv[0], &p, 10); if (*p != '\0') return GRUB_ERR_BAD_ARGUMENT; } if (n > scope->argv.argc) return GRUB_ERR_BAD_ARGUMENT; scope->shifts += n; scope->argv.argc -= n; scope->argv.args += n; return GRUB_ERR_NONE; } grub_err_t grub_script_setparams (grub_command_t cmd __attribute__((unused)), int argc, char **args) { struct grub_script_scope *new_scope; struct grub_script_argv argv = { 0, 0, 0 }; if (! scope) return GRUB_ERR_INVALID_COMMAND; new_scope = grub_malloc (sizeof (*new_scope)); if (! new_scope) return grub_errno; if (grub_script_argv_make (&argv, argc, args)) { grub_free (new_scope); return grub_errno; } new_scope->shifts = 0; new_scope->argv = argv; new_scope->flags = GRUB_SCRIPT_SCOPE_MALLOCED | GRUB_SCRIPT_SCOPE_ARGS_MALLOCED; replace_scope (new_scope); return GRUB_ERR_NONE; } grub_err_t grub_script_return (grub_command_t cmd __attribute__((unused)), int argc, char *argv[]) { const char *p = NULL; unsigned long n; if (! scope || argc > 1) return grub_error (GRUB_ERR_BAD_ARGUMENT, /* TRANSLATORS: It's about not being inside a function. "return" can be used only in a function and this error occurs if it's used anywhere else. */ N_("not in function body")); if (argc == 0) { const char *t; function_return = 1; t = grub_env_get ("?"); if (!t) return GRUB_ERR_NONE; return grub_strtoul (t, NULL, 10); } n = grub_strtoul (argv[0], &p, 10); if (grub_errno) return grub_errno; if (*p != '\0') return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("unrecognized number")); function_return = 1; return n ? grub_error (n, N_("false")) : GRUB_ERR_NONE; } static int grub_env_special (const char *name) { if (grub_isdigit (name[0]) || grub_strcmp (name, "#") == 0 || grub_strcmp (name, "*") == 0 || grub_strcmp (name, "@") == 0) return 1; return 0; } static char ** grub_script_env_get (const char *name, grub_script_arg_type_t type) { unsigned i; struct grub_script_argv result = { 0, 0, 0 }; if (grub_script_argv_next (&result)) goto fail; if (! grub_env_special (name)) { const char *v = grub_env_get (name); if (v && v[0]) { if (type == GRUB_SCRIPT_ARG_TYPE_VAR) { if (grub_script_argv_split_append (&result, v)) goto fail; } else if (grub_script_argv_append (&result, v, grub_strlen (v))) goto fail; } } else if (! scope) { if (grub_script_argv_append (&result, 0, 0)) goto fail; } else if (grub_strcmp (name, "#") == 0) { char buffer[ERRNO_DIGITS_MAX + 1]; grub_snprintf (buffer, sizeof (buffer), "%u", scope->argv.argc); if (grub_script_argv_append (&result, buffer, grub_strlen (buffer))) goto fail; } else if (grub_strcmp (name, "*") == 0) { for (i = 0; i < scope->argv.argc; i++) if (type == GRUB_SCRIPT_ARG_TYPE_VAR) { if (i != 0 && grub_script_argv_next (&result)) goto fail; if (grub_script_argv_split_append (&result, scope->argv.args[i])) goto fail; } else { if (i != 0 && grub_script_argv_append (&result, " ", 1)) goto fail; if (grub_script_argv_append (&result, scope->argv.args[i], grub_strlen (scope->argv.args[i]))) goto fail; } } else if (grub_strcmp (name, "@") == 0) { for (i = 0; i < scope->argv.argc; i++) { if (i != 0 && grub_script_argv_next (&result)) goto fail; if (type == GRUB_SCRIPT_ARG_TYPE_VAR) { if (grub_script_argv_split_append (&result, scope->argv.args[i])) goto fail; } else if (grub_script_argv_append (&result, scope->argv.args[i], grub_strlen (scope->argv.args[i]))) goto fail; } } else { unsigned long num = grub_strtoul (name, 0, 10); if (num == 0) ; /* XXX no file name, for now. */ else if (num <= scope->argv.argc) { if (type == GRUB_SCRIPT_ARG_TYPE_VAR) { if (grub_script_argv_split_append (&result, scope->argv.args[num - 1])) goto fail; } else if (grub_script_argv_append (&result, scope->argv.args[num - 1], grub_strlen (scope->argv.args[num - 1]) )) goto fail; } } return result.args; fail: grub_script_argv_free (&result); return 0; } static grub_err_t grub_script_env_set (const char *name, const char *val) { if (grub_env_special (name)) return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("invalid variable name `%s'"), name); return grub_env_set (name, val); } struct gettext_context { char **allowed_strings; grub_size_t nallowed_strings; grub_size_t additional_len; }; static int parse_string (const char *str, int (*hook) (const char *var, grub_size_t varlen, char **ptr, struct gettext_context *ctx), struct gettext_context *ctx, char *put) { const char *ptr; int escaped = 0; const char *optr; for (ptr = str; ptr && *ptr; ) switch (*ptr) { case '\\': escaped = !escaped; if (!escaped && put) *(put++) = '\\'; ptr++; break; case '$': if (escaped) { escaped = 0; if (put) *(put++) = *ptr; ptr++; break; } ptr++; switch (*ptr) { case '{': { optr = ptr + 1; ptr = grub_strchr (optr, '}'); if (!ptr) break; if (hook (optr, ptr - optr, &put, ctx)) return 1; ptr++; break; } case '0' ... '9': optr = ptr; while (*ptr >= '0' && *ptr <= '9') ptr++; if (hook (optr, ptr - optr, &put, ctx)) return 1; break; case 'a' ... 'z': case 'A' ... 'Z': case '_': optr = ptr; while ((*ptr >= '0' && *ptr <= '9') || (*ptr >= 'a' && *ptr <= 'z') || (*ptr >= 'A' && *ptr <= 'Z') || *ptr == '_') ptr++; if (hook (optr, ptr - optr, &put, ctx)) return 1; break; case '?': case '#': if (hook (ptr, 1, &put, ctx)) return 1; ptr++; break; default: if (put) *(put++) = '$'; } break; default: if (escaped && put) *(put++) = '\\'; escaped = 0; if (put) *(put++) = *ptr; ptr++; break; } if (put) *(put++) = 0; return 0; } static int gettext_putvar (const char *str, grub_size_t len, char **ptr, struct gettext_context *ctx) { const char *var; grub_size_t i; for (i = 0; i < ctx->nallowed_strings; i++) if (grub_strncmp (ctx->allowed_strings[i], str, len) == 0 && ctx->allowed_strings[i][len] == 0) { break; } if (i == ctx->nallowed_strings) return 0; /* Enough for any number. */ if (len == 1 && str[0] == '#' && scope != NULL) { grub_snprintf (*ptr, 30, "%u", scope->argv.argc); *ptr += grub_strlen (*ptr); return 0; } var = grub_env_get (ctx->allowed_strings[i]); if (var) *ptr = grub_stpcpy (*ptr, var); return 0; } static int gettext_save_allow (const char *str, grub_size_t len, char **ptr __attribute__ ((unused)), struct gettext_context *ctx) { ctx->allowed_strings[ctx->nallowed_strings++] = grub_strndup (str, len); if (!ctx->allowed_strings[ctx->nallowed_strings - 1]) return 1; return 0; } static int gettext_getlen (const char *str, grub_size_t len, char **ptr __attribute__ ((unused)), struct gettext_context *ctx) { const char *var; grub_size_t i; for (i = 0; i < ctx->nallowed_strings; i++) if (grub_strncmp (ctx->allowed_strings[i], str, len) == 0 && ctx->allowed_strings[i][len] == 0) break; if (i == ctx->nallowed_strings) return 0; /* Enough for any number. */ if (len == 1 && str[0] == '#') { ctx->additional_len += 30; return 0; } var = grub_env_get (ctx->allowed_strings[i]); if (var) ctx->additional_len += grub_strlen (var); return 0; } static int gettext_append (struct grub_script_argv *result, const char *orig_str) { const char *template; char *res = 0; struct gettext_context ctx = { .allowed_strings = 0, .nallowed_strings = 0, .additional_len = 1 }; int rval = 1; const char *iptr; grub_size_t dollar_cnt = 0; for (iptr = orig_str; *iptr; iptr++) if (*iptr == '$') dollar_cnt++; ctx.allowed_strings = grub_calloc (dollar_cnt, sizeof (ctx.allowed_strings[0])); if (parse_string (orig_str, gettext_save_allow, &ctx, 0)) goto fail; template = _(orig_str); if (parse_string (template, gettext_getlen, &ctx, 0)) goto fail; res = grub_malloc (grub_strlen (template) + ctx.additional_len); if (!res) goto fail; if (parse_string (template, gettext_putvar, &ctx, res)) goto fail; char *escaped = 0; escaped = wildcard_escape (res); if (grub_script_argv_append (result, escaped, grub_strlen (escaped))) { grub_free (escaped); goto fail; } grub_free (escaped); rval = 0; fail: grub_free (res); { grub_size_t i; for (i = 0; i < ctx.nallowed_strings; i++) grub_free (ctx.allowed_strings[i]); } grub_free (ctx.allowed_strings); return rval; } static int append (struct grub_script_argv *result, const char *s, int escape_type) { int r; char *p = 0; if (escape_type == 0) return grub_script_argv_append (result, s, grub_strlen (s)); if (escape_type > 0) p = wildcard_escape (s); else if (escape_type < 0) p = wildcard_unescape (s); if (! p) return 1; r = grub_script_argv_append (result, p, grub_strlen (p)); grub_free (p); return r; } /* Convert arguments in ARGLIST into ARGV form. */ static int grub_script_arglist_to_argv (struct grub_script_arglist *arglist, struct grub_script_argv *argv) { int i; char **values = 0; struct grub_script_arg *arg = 0; struct grub_script_argv result = { 0, 0, 0 }; if (arglist == NULL) return 1; for (; arglist && arglist->arg; arglist = arglist->next) { if (grub_script_argv_next (&result)) goto fail; arg = arglist->arg; while (arg) { switch (arg->type) { case GRUB_SCRIPT_ARG_TYPE_VAR: case GRUB_SCRIPT_ARG_TYPE_DQVAR: { int need_cleanup = 0; values = grub_script_env_get (arg->str, arg->type); for (i = 0; values && values[i]; i++) { if (!need_cleanup) { if (i != 0 && grub_script_argv_next (&result)) { need_cleanup = 1; goto cleanup; } if (arg->type == GRUB_SCRIPT_ARG_TYPE_VAR) { int len; char ch; char *p; char *op; const char *s = values[i]; len = grub_strlen (values[i]); /* \? -> \\\? */ /* \* -> \\\* */ /* \ -> \\ */ p = grub_malloc (len * 2 + 1); if (! p) { need_cleanup = 1; goto cleanup; } op = p; while ((ch = *s++)) { if (ch == '\\') { *op++ = '\\'; if (*s == '?' || *s == '*') *op++ = '\\'; } *op++ = ch; } *op = '\0'; need_cleanup = grub_script_argv_append (&result, p, op - p); grub_free (p); /* Fall through to cleanup */ } else { need_cleanup = append (&result, values[i], 1); /* Fall through to cleanup */ } } cleanup: grub_free (values[i]); } grub_free (values); if (need_cleanup) goto fail; break; } case GRUB_SCRIPT_ARG_TYPE_BLOCK: { char *p; if (grub_script_argv_append (&result, "{", 1)) goto fail; p = wildcard_escape (arg->str); if (!p) goto fail; if (grub_script_argv_append (&result, p, grub_strlen (p))) { grub_free (p); goto fail; } grub_free (p); if (grub_script_argv_append (&result, "}", 1)) goto fail; } result.script = arg->script; break; case GRUB_SCRIPT_ARG_TYPE_TEXT: if (arg->str[0] && grub_script_argv_append (&result, arg->str, grub_strlen (arg->str))) goto fail; break; case GRUB_SCRIPT_ARG_TYPE_GETTEXT: { if (gettext_append (&result, arg->str)) goto fail; } break; case GRUB_SCRIPT_ARG_TYPE_DQSTR: case GRUB_SCRIPT_ARG_TYPE_SQSTR: if (append (&result, arg->str, 1)) goto fail; break; } arg = arg->next; } } if (result.args == NULL || result.argc == 0) goto fail; if (! result.args[result.argc - 1]) result.argc--; /* Perform wildcard expansion. */ int j; int failed = 0; struct grub_script_argv unexpanded = result; result.argc = 0; result.args = 0; for (i = 0; unexpanded.args[i]; i++) { char **expansions = 0; if (grub_wildcard_translator && grub_wildcard_translator->expand (unexpanded.args[i], &expansions)) { grub_script_argv_free (&unexpanded); goto fail; } if (! expansions) { grub_script_argv_next (&result); append (&result, unexpanded.args[i], -1); } else { for (j = 0; expansions[j]; j++) { failed = (failed || grub_script_argv_next (&result) || append (&result, expansions[j], 0)); grub_free (expansions[j]); } grub_free (expansions); if (failed) { grub_script_argv_free (&unexpanded); goto fail; } } } grub_script_argv_free (&unexpanded); *argv = result; return 0; fail: grub_script_argv_free (&result); return 1; } static grub_err_t grub_script_execute_cmd (struct grub_script_cmd *cmd) { int ret; char errnobuf[ERRNO_DIGITS_MAX + 1]; if (cmd == 0) return 0; recursion_depth++; if (recursion_depth >= MAX_RECURSION_DEPTH) return grub_error (GRUB_ERR_RECURSION_DEPTH, N_("maximum recursion depth exceeded")); ret = cmd->exec (cmd); recursion_depth--; grub_snprintf (errnobuf, sizeof (errnobuf), "%d", ret); grub_env_set ("?", errnobuf); return ret; } /* Execute a function call. */ grub_err_t grub_script_function_call (grub_script_function_t func, int argc, char **args) { grub_err_t ret = 0; unsigned long loops = active_loops; struct grub_script_scope *old_scope; struct grub_script_scope new_scope; active_loops = 0; new_scope.flags = 0; new_scope.shifts = 0; new_scope.argv.argc = argc; new_scope.argv.args = args; old_scope = scope; scope = &new_scope; func->executing++; ret = grub_script_execute (func->func); func->executing--; function_return = 0; active_loops = loops; replace_scope (old_scope); /* free any scopes by setparams */ return ret; } /* Helper for grub_script_execute_sourcecode. */ static grub_err_t grub_script_execute_sourcecode_getline (char **line, int cont __attribute__ ((unused)), void *data) { const char **source = data; const char *p; if (! *source) { *line = 0; return 0; } p = grub_strchr (*source, '\n'); if (p) *line = grub_strndup (*source, p - *source); else *line = grub_strdup (*source); *source = p ? p + 1 : 0; return 0; } /* Execute a source script. */ grub_err_t grub_script_execute_sourcecode (const char *source) { grub_err_t ret = 0; struct grub_script *parsed_script; while (source) { char *line; grub_script_execute_sourcecode_getline (&line, 0, &source); parsed_script = grub_script_parse (line, grub_script_execute_sourcecode_getline, &source); if (! parsed_script) { ret = grub_errno; grub_free (line); break; } /* Don't let trailing blank lines determine the return code. */ if (parsed_script->cmd) ret = grub_script_execute (parsed_script); grub_script_free (parsed_script); grub_free (line); } return ret; } /* Execute a source script in new scope. */ grub_err_t grub_script_execute_new_scope (const char *source, int argc, char **args) { grub_err_t ret = 0; struct grub_script_scope new_scope; struct grub_script_scope *old_scope; new_scope.argv.argc = argc; new_scope.argv.args = args; new_scope.flags = 0; old_scope = scope; scope = &new_scope; ret = grub_script_execute_sourcecode (source); scope = old_scope; return ret; } /* Execute a single command line. */ grub_err_t grub_script_execute_cmdline (struct grub_script_cmd *cmd) { struct grub_script_cmdline *cmdline = (struct grub_script_cmdline *) cmd; grub_command_t grubcmd; grub_err_t ret = 0; grub_script_function_t func = 0; char errnobuf[18]; char *cmdname, *cmdstring; int argc, offset = 0, cmdlen = 0; unsigned int i; char **args; int invert; struct grub_script_argv argv = { 0, 0, 0 }; /* Lookup the command. */ if (grub_script_arglist_to_argv (cmdline->arglist, &argv) || ! argv.args || ! argv.args[0]) return grub_errno; for (i = 0; i < argv.argc; i++) { cmdlen += grub_strlen (argv.args[i]) + 1; } cmdstring = grub_malloc (cmdlen); if (!cmdstring) { return grub_error (GRUB_ERR_OUT_OF_MEMORY, N_("cannot allocate command buffer")); } for (i = 0; i < argv.argc; i++) { offset += grub_snprintf (cmdstring + offset, cmdlen - offset, "%s ", argv.args[i]); } cmdstring[cmdlen - 1] = '\0'; grub_verify_string (cmdstring, GRUB_VERIFY_COMMAND); grub_free (cmdstring); invert = 0; argc = argv.argc - 1; args = argv.args + 1; cmdname = argv.args[0]; if (grub_strcmp (cmdname, "!") == 0) { if (argv.argc < 2 || ! argv.args[1]) { grub_script_argv_free (&argv); return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("no command is specified")); } invert = 1; argc = argv.argc - 2; args = argv.args + 2; cmdname = argv.args[1]; } grubcmd = grub_command_find (cmdname); if (! grubcmd) { grub_errno = GRUB_ERR_NONE; /* It's not a GRUB command, try all functions. */ func = grub_script_function_find (cmdname); if (! func) { /* As a last resort, try if it is an assignment. */ char *assign = grub_strdup (cmdname); char *eq = grub_strchr (assign, '='); if (eq) { /* This was set because the command was not found. */ grub_errno = GRUB_ERR_NONE; /* Create two strings and set the variable. */ *eq = '\0'; eq++; grub_script_env_set (assign, eq); } grub_free (assign); grub_snprintf (errnobuf, sizeof (errnobuf), "%d", grub_errno); grub_script_env_set ("?", errnobuf); grub_script_argv_free (&argv); grub_print_error (); return 0; } } /* Execute the GRUB command or function. */ if (grubcmd) { if (grub_extractor_level && !(grubcmd->flags & GRUB_COMMAND_FLAG_EXTRACTOR)) ret = grub_error (GRUB_ERR_EXTRACTOR, "%s isn't allowed to execute in an extractor", cmdname); else if ((grubcmd->flags & GRUB_COMMAND_FLAG_BLOCKS) && (grubcmd->flags & GRUB_COMMAND_FLAG_EXTCMD)) ret = grub_extcmd_dispatcher (grubcmd, argc, args, argv.script); else ret = (grubcmd->func) (grubcmd, argc, args); } else ret = grub_script_function_call (func, argc, args); if (invert) { if (ret == GRUB_ERR_TEST_FAILURE) grub_errno = ret = GRUB_ERR_NONE; else if (ret == GRUB_ERR_NONE) ret = grub_error (GRUB_ERR_TEST_FAILURE, N_("false")); else { grub_print_error (); ret = GRUB_ERR_NONE; } } /* Free arguments. */ grub_script_argv_free (&argv); if (grub_errno == GRUB_ERR_TEST_FAILURE) grub_errno = GRUB_ERR_NONE; grub_print_error (); grub_snprintf (errnobuf, sizeof (errnobuf), "%d", ret); grub_env_set ("?", errnobuf); return ret; } /* Execute a block of one or more commands. */ grub_err_t grub_script_execute_cmdlist (struct grub_script_cmd *list) { int ret = 0; struct grub_script_cmd *cmd; /* Loop over every command and execute it. */ for (cmd = list->next; cmd; cmd = cmd->next) { if (active_breaks) break; ret = grub_script_execute_cmd (cmd); if (function_return) break; } return ret; } /* Execute an if statement. */ grub_err_t grub_script_execute_cmdif (struct grub_script_cmd *cmd) { int ret; const char *result; struct grub_script_cmdif *cmdif = (struct grub_script_cmdif *) cmd; /* Check if the commands results in a true or a false. The value is read from the env variable `?'. */ ret = grub_script_execute_cmd (cmdif->exec_to_evaluate); if (function_return) return ret; result = grub_env_get ("?"); grub_errno = GRUB_ERR_NONE; /* Execute the `if' or the `else' part depending on the value of `?'. */ if (result && ! grub_strcmp (result, "0")) return grub_script_execute_cmd (cmdif->exec_on_true); else return grub_script_execute_cmd (cmdif->exec_on_false); } /* Execute a for statement. */ grub_err_t grub_script_execute_cmdfor (struct grub_script_cmd *cmd) { unsigned i; grub_err_t result; struct grub_script_argv argv = { 0, 0, 0 }; struct grub_script_cmdfor *cmdfor = (struct grub_script_cmdfor *) cmd; if (grub_script_arglist_to_argv (cmdfor->words, &argv)) return grub_errno; active_loops++; result = 0; for (i = 0; i < argv.argc; i++) { if (is_continue && active_breaks == 1) active_breaks = 0; if (! active_breaks) { grub_script_env_set (cmdfor->name->str, argv.args[i]); result = grub_script_execute_cmd (cmdfor->list); if (function_return) break; } } if (active_breaks) active_breaks--; active_loops--; grub_script_argv_free (&argv); return result; } /* Execute a "while" or "until" command. */ grub_err_t grub_script_execute_cmdwhile (struct grub_script_cmd *cmd) { int result; struct grub_script_cmdwhile *cmdwhile = (struct grub_script_cmdwhile *) cmd; active_loops++; do { result = grub_script_execute_cmd (cmdwhile->cond); if (function_return) break; if (cmdwhile->until ? !result : result) break; result = grub_script_execute_cmd (cmdwhile->list); if (function_return) break; if (active_breaks == 1 && is_continue) active_breaks = 0; if (active_breaks) break; } while (1); /* XXX Put a check for ^C here */ if (active_breaks) active_breaks--; active_loops--; return result; } /* Execute any GRUB pre-parsed command or script. */ grub_err_t grub_script_execute (struct grub_script *script) { if (script == 0) return 0; return grub_script_execute_cmd (script->cmd); } grub-2.14~git20250718.0e36779/grub-core/gdb_helper.py.in0000644000175000017500000001422115036447510016742 00000000000000import os import re import subprocess def prompt_hook (current_prompt): return "(grub gdb) " gdb.prompt_hook = prompt_hook ##### Convenience functions ##### class IsGrubLoaded (gdb.Function): """Return 1 if GRUB has been loaded in memory, otherwise 0. The heuristic used is checking if the first 4 bytes of the memory pointed to by the _start symbol are not 0. This is true for QEMU on the first run of GRUB. This may not be true on physical hardware, where memory is not necessarily cleared on soft reset. This may not also be true in QEMU on soft resets. Also this many not be true when chainloading GRUB. """ def __init__ (self): super (IsGrubLoaded, self).__init__ ("is_grub_loaded") def invoke (self): return int (gdb.parse_and_eval ("*(int *) _start")) != 0 is_grub_loaded = IsGrubLoaded () class IsUserCommand (gdb.Function): """Set the second argument to true value if first argument is the name of a user-defined command. """ def __init__ (self): super (IsUserCommand, self).__init__ ("is_user_command") def invoke (self, fmt, *args): name = fmt.string () % tuple(a.string () for a in args) for line in gdb.execute ("help user-defined", to_string=True).splitlines (): line_parts = line.split(' -- ', 1) if len (line_parts) > 1 and line_parts[0] == name: return True return False is_user_command = IsUserCommand () ##### Commands ##### # Loading symbols is complicated by the fact that kernel.exec is an ELF # ELF binary, but the UEFI runtime is PE32+. All the data sections of # the ELF binary are concatenated (accounting for ELF section alignment) # and put into one .data section of the PE32+ runtime image. So given # the load address of the .data PE32+ section we can determine the # addresses each ELF data section maps to. The UEFI application is # loaded into memory just as it is laid out in the file. It is not # assumed that the binary is available, but it is known that the .text # section directly precedes the .data section and that .data is EFI # page aligned. Using this, the .data offset can be found from the .text # address. class GrubLoadKernelExecSymbols (gdb.Command): """Load debugging symbols from kernel.exec given the address of the .text segment of the UEFI binary in memory.""" PE_SECTION_ALIGN = 12 def __init__ (self): super (GrubLoadKernelExecSymbols, self).__init__ ("dynamic_load_kernel_exec_symbols", gdb.COMMAND_USER, gdb.COMPLETE_EXPRESSION) def invoke (self, arg, from_tty): self.dont_repeat () args = gdb.string_to_argv (arg) if len (args) != 1: raise RuntimeError ("dynamic_load_kernel_exec_symbols expects exactly one argument") sections = self.parse_objdump_sections ("kernel.exec") pe_text = args[0] text_size = [s['size'] for s in sections if s['name'] == '.text'][0] pe_data_offset = self.alignup (text_size, self.PE_SECTION_ALIGN) sym_load_cmd_parts = ["add-symbol-file", "kernel.exec", pe_text] offset = 0 for section in sections: if 'DATA' in section["flags"] or section["name"] == ".bss": offset = self.alignup (offset, section["align"]) sym_load_cmd_parts.extend (["-s", section["name"], "(%s+0x%x+0x%x)" % (pe_text, pe_data_offset, offset)]) offset += section["size"] gdb.execute (' '.join (sym_load_cmd_parts)) @staticmethod def parse_objdump_sections (filename): fields = ("idx", "name", "size", "vma", "lma", "fileoff", "align") re_section = re.compile ("^\s*" + "\s+".join(["(?P<%s>\S+)" % f for f in fields])) c = subprocess.run (["objdump", "-h", filename], text=True, capture_output=True) section_lines = c.stdout.splitlines ()[5:] sections = [] for i in range (len (section_lines) >> 1): m = re_section.match (section_lines[i * 2]) s = dict (m.groupdict ()) for f in ("size", "vma", "lma", "fileoff"): s[f] = int (s[f], 16) s["idx"] = int (s["idx"]) s["align"] = int (s["align"].split ("**", 1)[1]) s["flags"] = section_lines[(i * 2) + 1].strip ().split (", ") sections.append (s) return sections @staticmethod def alignup (addr, align): pad = (addr % (1 << align)) and 1 or 0 return ((addr >> align) + pad) << align dynamic_load_kernel_exec_symbols = GrubLoadKernelExecSymbols () class GrubLoadModuleSymbols (gdb.Command): """Load module symbols at correct locations. Takes one argument which is a pointer to a grub_dl_t struct.""" def __init__ (self): super (GrubLoadModuleSymbols, self).__init__ ("load_module", gdb.COMMAND_USER, gdb.COMPLETE_EXPRESSION) def invoke (self, arg, from_tty): self.dont_repeat () args = gdb.string_to_argv (arg) self.mod = gdb.parse_and_eval (args[0]) sections = self.get_section_offsets () section_names = self.get_section_names () sym_load_cmd_parts = ["add-symbol-file", "%s.module" % (self.mod['name'].string (),)] for idx, addr in sections: section_name = section_names[idx] if section_name == ".text": sym_load_cmd_parts.append (addr) else: sym_load_cmd_parts.extend (["-s", section_name, addr]) gdb.execute (' '.join (sym_load_cmd_parts)) if is_user_command.invoke (gdb.Value ("onload_%s"), self.mod['name']): gdb.execute ("onload_%s (grub_dl_t)%s" % (self.mod['name'].string (), self.mod.format_string (format='x'))) def get_section_offsets (self): sections = [] segment = self.mod['segment'] while segment: sections.append ((int (segment['section']), segment['addr'].format_string (format='x'))) segment = segment['next'] return sections def get_section_names (self): re_index = re.compile ("^\s+\[\s*(\d+)\] (\S*)") names = {} modfilename = "%s.mod" % (self.mod['name'].string (),) if not os.path.exists (modfilename): raise RuntimeError ("%s not found in current directory" % (modfilename,)) c = subprocess.run (["readelf", "-SW", modfilename], text=True, capture_output=True) for line in c.stdout.splitlines ()[4:]: m = re_index.match (line) if not m: continue idx, name = m.groups () names[int (idx)] = name return names grub_load_module = GrubLoadModuleSymbols () grub-2.14~git20250718.0e36779/grub-core/gentrigtables.c0000644000175000017500000000335515000202015016650 00000000000000/* Generate trigonometric function tables. */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2008, 2009 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #define _GNU_SOURCE 1 #include #include #include int main (int argc __attribute__ ((unused)), char **argv __attribute__ ((unused))) { int i; printf ("#include \n"); printf ("#include \n"); printf ("\n"); printf ("/* Under copyright legislature such automated output isn't\n"); printf ("covered by any copyright. Hence it's public domain. Public\n"); printf ("domain works can be dual-licenced with any license. */\n"); printf ("GRUB_MOD_LICENSE (\"GPLv3+\");"); printf ("GRUB_MOD_DUAL_LICENSE (\"Public Domain\");"); #define TAB(op) \ printf ("const grub_int16_t grub_trig_" #op "tab[] =\n{"); \ for (i = 0; i < GRUB_TRIG_ANGLE_MAX; i++) \ { \ double x = i * 2 * M_PI / GRUB_TRIG_ANGLE_MAX; \ if (i % 10 == 0) \ printf ("\n "); \ printf ("%d,", (int) (round (op (x) * GRUB_TRIG_FRACTION_SCALE))); \ } \ printf ("\n};\n") TAB(sin); TAB(cos); return 0; } grub-2.14~git20250718.0e36779/grub-core/commands/0000755000175000017500000000000015036452576015561 500000000000000grub-2.14~git20250718.0e36779/grub-core/commands/cat.c0000644000175000017500000001012715033157230016377 00000000000000/* cat.c - command to show the contents of a file */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2003,2005,2007,2008 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); static const struct grub_arg_option options[] = { {"dos", -1, 0, N_("Accept DOS-style CR/NL line endings."), 0, 0}, {0, 0, 0, 0, 0, 0} }; static grub_err_t grub_cmd_cat (grub_extcmd_context_t ctxt, int argc, char **args) { struct grub_arg_list *state = ctxt->state; int dos = 0; grub_file_t file; unsigned char buf[GRUB_DISK_SECTOR_SIZE]; grub_ssize_t size; int key = GRUB_TERM_NO_KEY; grub_uint32_t code = 0; int count = 0; unsigned char utbuf[GRUB_MAX_UTF8_PER_CODEPOINT + 1]; int utcount = 0; int is_0d = 0; int j; if (state[0].set) dos = 1; if (argc != 1) return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected")); file = grub_file_open (args[0], GRUB_FILE_TYPE_CAT); if (! file) return grub_errno; while ((size = grub_file_read (file, buf, sizeof (buf))) > 0 && key != GRUB_TERM_ESC) { int i; for (i = 0; i < size; i++) { utbuf[utcount++] = buf[i]; if (is_0d && buf[i] != '\n') { grub_setcolorstate (GRUB_TERM_COLOR_HIGHLIGHT); grub_printf ("<%x>", (int) '\r'); grub_setcolorstate (GRUB_TERM_COLOR_STANDARD); } is_0d = 0; if (!grub_utf8_process (buf[i], &code, &count)) { grub_setcolorstate (GRUB_TERM_COLOR_HIGHLIGHT); for (j = 0; j < utcount - 1; j++) grub_printf ("<%x>", (unsigned int) utbuf[j]); code = 0; count = 0; if (utcount == 1 || !grub_utf8_process (buf[i], &code, &count)) { grub_printf ("<%x>", (unsigned int) buf[i]); code = 0; count = 0; utcount = 0; grub_setcolorstate (GRUB_TERM_COLOR_STANDARD); continue; } grub_setcolorstate (GRUB_TERM_COLOR_STANDARD); utcount = 1; } if (count) continue; if ((code >= 0xa1 || grub_isprint (code) || grub_isspace (code)) && code != '\r') { grub_printf ("%C", code); count = 0; code = 0; utcount = 0; continue; } if (dos && code == '\r') { is_0d = 1; count = 0; code = 0; utcount = 0; continue; } grub_setcolorstate (GRUB_TERM_COLOR_HIGHLIGHT); for (j = 0; j < utcount; j++) grub_printf ("<%x>", (unsigned int) utbuf[j]); grub_setcolorstate (GRUB_TERM_COLOR_STANDARD); count = 0; code = 0; utcount = 0; } do key = grub_getkey_noblock (); while (key != GRUB_TERM_ESC && key != GRUB_TERM_NO_KEY); } if (is_0d) { grub_setcolorstate (GRUB_TERM_COLOR_HIGHLIGHT); grub_printf ("<%x>", (unsigned int) '\r'); grub_setcolorstate (GRUB_TERM_COLOR_STANDARD); } if (utcount) { grub_setcolorstate (GRUB_TERM_COLOR_HIGHLIGHT); for (j = 0; j < utcount; j++) grub_printf ("<%x>", (unsigned int) utbuf[j]); grub_setcolorstate (GRUB_TERM_COLOR_STANDARD); } grub_xputs ("\n"); grub_refresh (); grub_file_close (file); return 0; } static grub_extcmd_t cmd; GRUB_MOD_INIT(cat) { cmd = grub_register_extcmd ("cat", grub_cmd_cat, 0, N_("FILE"), N_("Show the contents of a file."), options); } GRUB_MOD_FINI(cat) { grub_unregister_extcmd (cmd); } grub-2.14~git20250718.0e36779/grub-core/commands/syslinuxcfg.c0000644000175000017500000001325415002425525020213 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (C) 2013 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); /* Helper for syslinux_file. */ static grub_err_t syslinux_file_getline (char **line, int cont __attribute__ ((unused)), void *data __attribute__ ((unused))) { *line = 0; return GRUB_ERR_NONE; } static const struct grub_arg_option options[] = { {"root", 'r', 0, N_("root directory of the syslinux disk [default=/]."), N_("DIR"), ARG_TYPE_STRING}, {"cwd", 'c', 0, N_("current directory of syslinux [default is parent directory of input file]."), N_("DIR"), ARG_TYPE_STRING}, {"isolinux", 'i', 0, N_("assume input is an isolinux configuration file."), 0, 0}, {"pxelinux", 'p', 0, N_("assume input is a pxelinux configuration file."), 0, 0}, {"syslinux", 's', 0, N_("assume input is a syslinux configuration file."), 0, 0}, {0, 0, 0, 0, 0, 0} }; enum { OPTION_ROOT, OPTION_CWD, OPTION_ISOLINUX, OPTION_PXELINUX, OPTION_SYSLINUX }; static grub_err_t syslinux_file (grub_extcmd_context_t ctxt, const char *filename) { char *result; const char *root = ctxt->state[OPTION_ROOT].set ? ctxt->state[OPTION_ROOT].arg : "/"; const char *cwd = ctxt->state[OPTION_CWD].set ? ctxt->state[OPTION_CWD].arg : NULL; grub_syslinux_flavour_t flav = GRUB_SYSLINUX_UNKNOWN; char *cwdf = NULL; grub_menu_t menu; if (ctxt->state[OPTION_ISOLINUX].set) flav = GRUB_SYSLINUX_ISOLINUX; if (ctxt->state[OPTION_PXELINUX].set) flav = GRUB_SYSLINUX_PXELINUX; if (ctxt->state[OPTION_SYSLINUX].set) flav = GRUB_SYSLINUX_SYSLINUX; if (!cwd) { char *p; cwdf = grub_strdup (filename); if (!cwdf) return grub_errno; p = grub_strrchr (cwdf, '/'); if (!p) { grub_free (cwdf); cwd = "/"; cwdf = NULL; } else { *p = '\0'; cwd = cwdf; } } grub_dprintf ("syslinux", "transforming syslinux config %s, root = %s, cwd = %s\n", filename, root, cwd); result = grub_syslinux_config_file (root, root, cwd, cwd, filename, flav); if (!result) return grub_errno; grub_dprintf ("syslinux", "syslinux config transformed\n"); menu = grub_env_get_menu (); if (! menu) { menu = grub_zalloc (sizeof (*menu)); if (! menu) { grub_free (result); return grub_errno; } grub_env_set_menu (menu); } grub_normal_parse_line (result, syslinux_file_getline, NULL); grub_print_error (); grub_free (result); grub_free (cwdf); return GRUB_ERR_NONE; } static grub_err_t grub_cmd_syslinux_source (grub_extcmd_context_t ctxt, int argc, char **args) { int new_env, extractor; grub_err_t ret; if (argc != 1) return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected")); extractor = (ctxt->extcmd->cmd->name[0] == 'e'); new_env = (ctxt->extcmd->cmd->name[extractor ? (sizeof ("extract_syslinux_entries_") - 1) : (sizeof ("syslinux_") - 1)] == 'c'); if (new_env) grub_cls (); if (new_env && !extractor) grub_env_context_open (); if (extractor) grub_env_extractor_open (!new_env); ret = syslinux_file (ctxt, args[0]); if (new_env) { grub_menu_t menu; menu = grub_env_get_menu (); if (menu && menu->size) grub_show_menu (menu, 1, 0); if (!extractor) grub_env_context_close (); } if (extractor) grub_env_extractor_close (!new_env); return ret; } static grub_extcmd_t cmd_source, cmd_configfile; static grub_extcmd_t cmd_source_extract, cmd_configfile_extract; GRUB_MOD_INIT(syslinuxcfg) { cmd_source = grub_register_extcmd ("syslinux_source", grub_cmd_syslinux_source, 0, N_("FILE"), /* TRANSLATORS: "syslinux config" means "config as used by syslinux". */ N_("Execute syslinux config in same context"), options); cmd_configfile = grub_register_extcmd ("syslinux_configfile", grub_cmd_syslinux_source, 0, N_("FILE"), N_("Execute syslinux config in new context"), options); cmd_source_extract = grub_register_extcmd ("extract_syslinux_entries_source", grub_cmd_syslinux_source, 0, N_("FILE"), N_("Execute syslinux config in same context taking only menu entries"), options); cmd_configfile_extract = grub_register_extcmd ("extract_syslinux_entries_configfile", grub_cmd_syslinux_source, 0, N_("FILE"), N_("Execute syslinux config in new context taking only menu entries"), options); } GRUB_MOD_FINI(syslinuxcfg) { grub_unregister_extcmd (cmd_source); grub_unregister_extcmd (cmd_configfile); grub_unregister_extcmd (cmd_source_extract); grub_unregister_extcmd (cmd_configfile_extract); } grub-2.14~git20250718.0e36779/grub-core/commands/i386/0000755000175000017500000000000015036452576016252 500000000000000grub-2.14~git20250718.0e36779/grub-core/commands/i386/pc/0000755000175000017500000000000015036452576016654 500000000000000grub-2.14~git20250718.0e36779/grub-core/commands/i386/pc/lsapm.c0000644000175000017500000000652015033157230020041 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (C) 2010 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); int grub_apm_get_info (struct grub_apm_info *info) { struct grub_bios_int_registers regs; /* detect APM */ regs.eax = 0x5300; regs.ebx = 0; regs.flags = GRUB_CPU_INT_FLAGS_DEFAULT; grub_bios_interrupt (0x15, ®s); if (regs.flags & GRUB_CPU_INT_FLAGS_CARRY) return 0; info->version = regs.eax & 0xffff; info->flags = regs.ecx & 0xffff; /* disconnect APM first */ regs.eax = 0x5304; regs.ebx = 0; regs.flags = GRUB_CPU_INT_FLAGS_DEFAULT; grub_bios_interrupt (0x15, ®s); /* connect APM */ regs.eax = 0x5303; regs.ebx = 0; regs.flags = GRUB_CPU_INT_FLAGS_DEFAULT; grub_bios_interrupt (0x15, ®s); if (regs.flags & GRUB_CPU_INT_FLAGS_CARRY) return 0; info->cseg = regs.eax & 0xffff; info->offset = regs.ebx; info->cseg_16 = regs.ecx & 0xffff; info->dseg = regs.edx & 0xffff; info->cseg_len = regs.esi >> 16; info->cseg_16_len = regs.esi & 0xffff; info->dseg_len = regs.edi; return 1; } static grub_err_t grub_cmd_lsapm (grub_command_t cmd __attribute__ ((unused)), int argc __attribute__ ((unused)), char **args __attribute__ ((unused))) { struct grub_apm_info info; if (!grub_apm_get_info (&info)) return grub_error (GRUB_ERR_IO, N_("no APM found")); grub_printf_ (N_("Version %u.%u\n" "32-bit CS = 0x%x, len = 0x%x, offset = 0x%x\n" "16-bit CS = 0x%x, len = 0x%x\n" "DS = 0x%x, len = 0x%x\n"), info.version >> 8, info.version & 0xff, info.cseg, info.cseg_len, info.offset, info.cseg_16, info.cseg_16_len, info.dseg, info.dseg_len); grub_xputs (info.flags & GRUB_APM_FLAGS_16BITPROTECTED_SUPPORTED ? _("16-bit protected interface supported\n") : _("16-bit protected interface unsupported\n")); grub_xputs (info.flags & GRUB_APM_FLAGS_32BITPROTECTED_SUPPORTED ? _("32-bit protected interface supported\n") : _("32-bit protected interface unsupported\n")); grub_xputs (info.flags & GRUB_APM_FLAGS_CPUIDLE_SLOWS_DOWN ? _("CPU Idle slows down processor\n") : _("CPU Idle doesn't slow down processor\n")); grub_xputs (info.flags & GRUB_APM_FLAGS_DISABLED ? _("APM disabled\n") : _("APM enabled\n")); grub_xputs (info.flags & GRUB_APM_FLAGS_DISENGAGED ? _("APM disengaged\n") : _("APM engaged\n")); return GRUB_ERR_NONE; } static grub_command_t cmd; GRUB_MOD_INIT(lsapm) { cmd = grub_register_command ("lsapm", grub_cmd_lsapm, 0, N_("Show APM information.")); } GRUB_MOD_FINI(lsapm) { grub_unregister_command (cmd); } grub-2.14~git20250718.0e36779/grub-core/commands/i386/pc/play.c0000644000175000017500000001150615033157230017672 00000000000000/* play.c - command to play a tune */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2005,2007,2009 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ /* Lots of this file is borrowed from GNU/Hurd generic-speaker driver. */ #include #include #include #include #include #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); #define BASE_TEMPO (60 * 1000) #define T_REST ((grub_uint16_t) 0) #define T_FINE ((grub_uint16_t) -1) struct note { grub_uint16_t pitch; grub_uint16_t duration; }; /* Returns whether playing should continue. */ static int play (unsigned tempo, struct note *note) { grub_uint64_t to; if (note->pitch == T_FINE || grub_getkey_noblock () != GRUB_TERM_NO_KEY) return 1; grub_dprintf ("play", "pitch = %d, duration = %d\n", note->pitch, note->duration); switch (note->pitch) { case T_REST: grub_speaker_beep_off (); break; default: grub_speaker_beep_on (note->pitch); break; } to = grub_get_time_ms () + BASE_TEMPO * note->duration / tempo; while ((grub_get_time_ms () <= to) && (grub_getkey_noblock () == GRUB_TERM_NO_KEY)); return 0; } static grub_err_t grub_cmd_play (grub_command_t cmd __attribute__ ((unused)), int argc, char **args) { if (argc < 1) return grub_error (GRUB_ERR_BAD_ARGUMENT, /* TRANSLATORS: It's musical notes, not the notes you take. Play command expects arguments which can be either a filename or tempo+notes. This error happens if none is specified. */ N_("filename or tempo and notes expected")); if (argc == 1) { struct note buf; grub_uint32_t tempo; grub_file_t file; file = grub_file_open (args[0], GRUB_FILE_TYPE_AUDIO); if (! file) return grub_errno; if (grub_file_read (file, &tempo, sizeof (tempo)) != sizeof (tempo)) { grub_file_close (file); if (!grub_errno) grub_error (GRUB_ERR_FILE_READ_ERROR, N_("premature end of file %s"), args[0]); return grub_errno; } if (!tempo) { grub_file_close (file); grub_error (GRUB_ERR_BAD_ARGUMENT, N_("Invalid tempo in %s"), args[0]); return grub_errno; } tempo = grub_le_to_cpu32 (tempo); grub_dprintf ("play","tempo = %d\n", tempo); while (grub_file_read (file, &buf, sizeof (struct note)) == sizeof (struct note)) { buf.pitch = grub_le_to_cpu16 (buf.pitch); buf.duration = grub_le_to_cpu16 (buf.duration); if (play (tempo, &buf)) break; } grub_file_close (file); } else { const char *end; unsigned tempo; struct note note; int i; tempo = grub_strtoul (args[0], &end, 0); if (!tempo) { grub_error (GRUB_ERR_BAD_ARGUMENT, N_("Invalid tempo in %s"), args[0]); return grub_errno; } if (*end) /* Was not a number either, assume it was supposed to be a file name. */ return grub_error (GRUB_ERR_FILE_NOT_FOUND, N_("file `%s' not found"), args[0]); grub_dprintf ("play","tempo = %d\n", tempo); for (i = 1; i + 1 < argc; i += 2) { note.pitch = grub_strtoul (args[i], &end, 0); if (grub_errno) break; if (*end) { grub_error (GRUB_ERR_BAD_NUMBER, N_("unrecognized number")); break; } note.duration = grub_strtoul (args[i + 1], &end, 0); if (grub_errno) break; if (*end) { grub_error (GRUB_ERR_BAD_NUMBER, N_("unrecognized number")); break; } if (play (tempo, ¬e)) break; } } grub_speaker_beep_off (); return 0; } static grub_command_t cmd; GRUB_MOD_INIT(play) { cmd = grub_register_command ("play", grub_cmd_play, N_("FILE | TEMPO [PITCH1 DURATION1] [PITCH2 DURATION2] ... "), N_("Play a tune.")); } GRUB_MOD_FINI(play) { grub_unregister_command (cmd); } grub-2.14~git20250718.0e36779/grub-core/commands/i386/pc/smbios.c0000644000175000017500000000320415002425525020216 00000000000000/* smbios.c - get smbios tables. */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2019 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include struct grub_smbios_eps * grub_machine_smbios_get_eps (void) { grub_uint8_t *ptr; grub_dprintf ("smbios", "Looking for SMBIOS EPS. Scanning BIOS\n"); for (ptr = (grub_uint8_t *) 0xf0000; ptr < (grub_uint8_t *) 0x100000; ptr += 16) if (grub_memcmp (ptr, "_SM_", 4) == 0 && grub_byte_checksum (ptr, sizeof (struct grub_smbios_eps)) == 0) return (struct grub_smbios_eps *) ptr; return 0; } struct grub_smbios_eps3 * grub_machine_smbios_get_eps3 (void) { grub_uint8_t *ptr; grub_dprintf ("smbios", "Looking for SMBIOS3 EPS. Scanning BIOS\n"); for (ptr = (grub_uint8_t *) 0xf0000; ptr < (grub_uint8_t *) 0x100000; ptr += 16) if (grub_memcmp (ptr, "_SM3_", 5) == 0 && grub_byte_checksum (ptr, sizeof (struct grub_smbios_eps3)) == 0) return (struct grub_smbios_eps3 *) ptr; return 0; } grub-2.14~git20250718.0e36779/grub-core/commands/i386/pc/halt.c0000644000175000017500000000577715033157230017672 00000000000000/* halt.c - command to halt the computer. */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2005,2007,2009 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); static const struct grub_arg_option options[] = { {"no-apm", 'n', 0, N_("Do not use APM to halt the computer."), 0, 0}, {0, 0, 0, 0, 0, 0} }; static inline void __attribute__ ((noreturn)) stop (void) { while (1) { asm volatile ("hlt"); } } /* * Halt the system, using APM if possible. If NO_APM is true, don't use * APM even if it is available. */ void __attribute__ ((noreturn)) grub_halt (int no_apm) { struct grub_bios_int_registers regs; grub_acpi_halt (); if (no_apm) stop (); /* detect APM */ regs.eax = 0x5300; regs.ebx = 0; regs.flags = GRUB_CPU_INT_FLAGS_DEFAULT; grub_bios_interrupt (0x15, ®s); if (regs.flags & GRUB_CPU_INT_FLAGS_CARRY) stop (); /* disconnect APM first */ regs.eax = 0x5304; regs.ebx = 0; regs.flags = GRUB_CPU_INT_FLAGS_DEFAULT; grub_bios_interrupt (0x15, ®s); /* connect APM */ regs.eax = 0x5301; regs.ebx = 0; regs.flags = GRUB_CPU_INT_FLAGS_DEFAULT; grub_bios_interrupt (0x15, ®s); if (regs.flags & GRUB_CPU_INT_FLAGS_CARRY) stop (); /* set APM protocol level - 1.1 or bust. (this covers APM 1.2 also) */ regs.eax = 0x530E; regs.ebx = 0; regs.ecx = 0x0101; regs.flags = GRUB_CPU_INT_FLAGS_DEFAULT; grub_bios_interrupt (0x15, ®s); if (regs.flags & GRUB_CPU_INT_FLAGS_CARRY) stop (); /* set the power state to off */ regs.eax = 0x5307; regs.ebx = 1; regs.ecx = 3; regs.flags = GRUB_CPU_INT_FLAGS_DEFAULT; grub_bios_interrupt (0x15, ®s); /* shouldn't reach here */ stop (); } static grub_err_t __attribute__ ((noreturn)) grub_cmd_halt (grub_extcmd_context_t ctxt, int argc __attribute__ ((unused)), char **args __attribute__ ((unused))) { struct grub_arg_list *state = ctxt->state; int no_apm = 0; if (state[0].set) no_apm = 1; grub_halt (no_apm); } static grub_extcmd_t cmd; GRUB_MOD_INIT(halt) { cmd = grub_register_extcmd ("halt", grub_cmd_halt, 0, "[-n]", N_("Halt the system, if possible using APM."), options); } GRUB_MOD_FINI(halt) { grub_unregister_extcmd (cmd); } grub-2.14~git20250718.0e36779/grub-core/commands/i386/pc/drivemap.c0000644000175000017500000003104315033157230020532 00000000000000/* drivemap.c - command to manage the BIOS drive mappings. */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2008, 2009 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); /* Remember to update enum opt_idxs accordingly. */ static const struct grub_arg_option options[] = { /* TRANSLATORS: In this file "mapping" refers to a change GRUB makes so if your language doesn't have an equivalent of "mapping" you can use the word like "rerouting". */ {"list", 'l', 0, N_("Show the current mappings."), 0, 0}, {"reset", 'r', 0, N_("Reset all mappings to the default values."), 0, 0}, {"swap", 's', 0, N_("Perform both direct and reverse mappings."), 0, 0}, {0, 0, 0, 0, 0, 0} }; /* Remember to update options[] accordingly. */ enum opt_idxs { OPTIDX_LIST = 0, OPTIDX_RESET, OPTIDX_SWAP, }; /* Realmode far ptr (2 * 16b) to the previous INT13h handler. */ extern grub_uint32_t grub_drivemap_oldhandler; /* The type "void" is used for imported assembly labels, takes no storage and serves just to take the address with &label. */ /* The assembly function to replace the old INT13h handler. It does not follow any C callspecs and returns with IRET. */ extern const void grub_drivemap_handler; /* Start of the drive mappings area (space reserved at runtime). */ extern const void grub_drivemap_mapstart; typedef struct drivemap_node { struct drivemap_node *next; grub_uint8_t newdrive; grub_uint8_t redirto; } drivemap_node_t; typedef struct GRUB_PACKED int13map_node { grub_uint8_t disknum; grub_uint8_t mapto; } int13map_node_t; #define INT13H_OFFSET(x) \ (((grub_uint8_t *)(x)) - ((grub_uint8_t *)&grub_drivemap_handler)) static drivemap_node_t *map_head; static void *drivemap_hook; static int drivemap_mmap; /* Puts the specified mapping into the table, replacing an existing mapping for newdrive or adding a new one if required. */ static grub_err_t drivemap_set (grub_uint8_t newdrive, grub_uint8_t redirto) { drivemap_node_t *mapping = 0; drivemap_node_t *search = map_head; while (search) { if (search->newdrive == newdrive) { mapping = search; break; } search = search->next; } /* Check for pre-existing mappings to modify before creating a new one. */ if (mapping) mapping->redirto = redirto; else { mapping = grub_malloc (sizeof (drivemap_node_t)); if (! mapping) return grub_errno; mapping->newdrive = newdrive; mapping->redirto = redirto; mapping->next = map_head; map_head = mapping; } return GRUB_ERR_NONE; } /* Removes the mapping for newdrive from the table. If there is no mapping, then this function behaves like a no-op on the map. */ static void drivemap_remove (grub_uint8_t newdrive) { drivemap_node_t *mapping = 0; drivemap_node_t *search = map_head; drivemap_node_t *previous = 0; while (search) { if (search->newdrive == newdrive) { mapping = search; break; } previous = search; search = search->next; } if (mapping) { if (previous) previous->next = mapping->next; else map_head = mapping->next; grub_free (mapping); } } /* Given a GRUB-like device name and a convenient location, stores the related BIOS disk number. Accepts devices like \((f|h)dN\), with 0 <= N < 128. */ static grub_err_t tryparse_diskstring (const char *str, grub_uint8_t *output) { /* Skip opening paren in order to allow both (hd0) and hd0. */ if (*str == '(') str++; if ((str[0] == 'f' || str[0] == 'h') && str[1] == 'd') { grub_uint8_t bios_num = (str[0] == 'h') ? 0x80 : 0x00; unsigned long drivenum = grub_strtoul (str + 2, 0, 0); if (grub_errno == GRUB_ERR_NONE && drivenum < 128) { bios_num |= drivenum; if (output) *output = bios_num; return GRUB_ERR_NONE; } } return grub_error (GRUB_ERR_BAD_ARGUMENT, "device format \"%s\" " "invalid: must be (f|h)dN, with 0 <= N < 128", str); } static grub_err_t list_mappings (void) { /* Show: list mappings. */ if (! map_head) { grub_puts_ (N_("No drives have been remapped")); return GRUB_ERR_NONE; } /* TRANSLATORS: This is the header of mapping list. On the left is how OS will see the disks and on the right current GRUB vision. */ grub_puts_ (N_("OS disk #num ------> GRUB/BIOS device")); drivemap_node_t *curnode = map_head; while (curnode) { grub_printf ("%cD #%-3u (0x%02x) %cd%d\n", (curnode->newdrive & 0x80) ? 'H' : 'F', curnode->newdrive & 0x7F, curnode->newdrive, (curnode->redirto & 0x80) ? 'h' : 'f', curnode->redirto & 0x7F ); curnode = curnode->next; } return GRUB_ERR_NONE; } static grub_err_t grub_cmd_drivemap (struct grub_extcmd_context *ctxt, int argc, char **args) { if (ctxt->state[OPTIDX_LIST].set) { return list_mappings (); } else if (ctxt->state[OPTIDX_RESET].set) { /* Reset: just delete all mappings, freeing their memory. */ drivemap_node_t *curnode = map_head; drivemap_node_t *prevnode = 0; while (curnode) { prevnode = curnode; curnode = curnode->next; grub_free (prevnode); } map_head = 0; return GRUB_ERR_NONE; } else if (!ctxt->state[OPTIDX_SWAP].set && argc == 0) { /* No arguments */ return list_mappings (); } /* Neither flag: put mapping. */ grub_uint8_t mapfrom = 0; grub_uint8_t mapto = 0xFF; grub_err_t err; if (argc != 2) return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("two arguments expected")); err = tryparse_diskstring (args[0], &mapfrom); if (err != GRUB_ERR_NONE) return err; err = tryparse_diskstring (args[1], &mapto); if (err != GRUB_ERR_NONE) return err; if (mapto == mapfrom) { /* Reset to default. */ grub_dprintf ("drivemap", "Removing mapping for %s (%02x)\n", args[0], mapfrom); drivemap_remove (mapfrom); return GRUB_ERR_NONE; } /* Set the mapping for the disk (overwrites any existing mapping). */ grub_dprintf ("drivemap", "%s %s (%02x) = %s (%02x)\n", ctxt->state[OPTIDX_SWAP].set ? "Swapping" : "Mapping", args[1], mapto, args[0], mapfrom); err = drivemap_set (mapto, mapfrom); /* If -s, perform the reverse mapping too (only if the first was OK). */ if (ctxt->state[OPTIDX_SWAP].set && err == GRUB_ERR_NONE) err = drivemap_set (mapfrom, mapto); return err; } /* Int13h handler installer - reserves conventional memory for the handler, copies it over and sets the IVT entry for int13h. This code rests on the assumption that GRUB does not activate any kind of memory mapping apart from identity paging, since it accesses realmode structures by their absolute addresses, like the IVT at 0; and transforms a pmode pointer into a rmode seg:off far ptr. */ static grub_err_t install_int13_handler (int noret __attribute__ ((unused))) { /* Size of the full int13 handler "bundle", including code and map. */ grub_uint32_t total_size; /* Base address of the space reserved for the handler bundle. */ grub_uint8_t *handler_base = 0; /* Address of the map within the deployed bundle. */ int13map_node_t *handler_map; /* Real mode IVT slot (seg:off far pointer) for interrupt 0x13. */ grub_uint32_t *int13slot = (grub_uint32_t *) grub_absolute_pointer (4 * 0x13); int i; int entries = 0; drivemap_node_t *curentry = map_head; /* Count entries to prepare a contiguous map block. */ while (curentry) { entries++; curentry = curentry->next; } if (entries == 0) { /* No need to install the int13h handler. */ grub_dprintf ("drivemap", "No drives marked as remapped, not installing " "our int13h handler.\n"); return GRUB_ERR_NONE; } grub_dprintf ("drivemap", "Installing our int13h handler\n"); /* Save the pointer to the old handler. */ grub_drivemap_oldhandler = *int13slot; grub_dprintf ("drivemap", "Original int13 handler: %04x:%04x\n", (grub_drivemap_oldhandler >> 16) & 0x0ffff, grub_drivemap_oldhandler & 0x0ffff); /* Find a rmode-segment-aligned zone in conventional memory big enough to hold the handler and its data. */ total_size = INT13H_OFFSET (&grub_drivemap_mapstart) + (entries + 1) * sizeof (int13map_node_t); grub_dprintf ("drivemap", "Payload is %u bytes long\n", total_size); handler_base = grub_mmap_malign_and_register (16, ALIGN_UP (total_size, 16), &drivemap_mmap, GRUB_MEMORY_RESERVED, GRUB_MMAP_MALLOC_LOW); if (! handler_base) return grub_error (GRUB_ERR_OUT_OF_MEMORY, "couldn't reserve " "memory for the int13h handler"); /* Copy int13h handler bundle to reserved area. */ grub_dprintf ("drivemap", "Reserved memory at %p, copying handler\n", handler_base); grub_memcpy (handler_base, &grub_drivemap_handler, INT13H_OFFSET (&grub_drivemap_mapstart)); /* Copy the mappings to the reserved area. */ curentry = map_head; handler_map = (int13map_node_t *) (handler_base + INT13H_OFFSET (&grub_drivemap_mapstart)); grub_dprintf ("drivemap", "Target map at %p, copying mappings\n", handler_map); for (i = 0; i < entries; ++i, curentry = curentry->next) { handler_map[i].disknum = curentry->newdrive; handler_map[i].mapto = curentry->redirto; grub_dprintf ("drivemap", "\t#%d: 0x%02x <- 0x%02x\n", i, handler_map[i].disknum, handler_map[i].mapto); } /* Signal end-of-map. */ handler_map[i].disknum = 0; handler_map[i].mapto = 0; grub_dprintf ("drivemap", "\t#%d: 0x00 <- 0x00 (end)\n", i); /* Install our function as the int13h handler in the IVT. */ *int13slot = ((grub_uint32_t) handler_base) << 12; /* Segment address. */ grub_dprintf ("drivemap", "New int13 handler: %04x:%04x\n", (*int13slot >> 16) & 0x0ffff, *int13slot & 0x0ffff); return GRUB_ERR_NONE; } static grub_err_t uninstall_int13_handler (void) { /* Real mode IVT slot (seg:off far pointer) for interrupt 0x13. */ grub_uint32_t *int13slot = (grub_uint32_t *) grub_absolute_pointer (4 * 0x13); if (! grub_drivemap_oldhandler) return GRUB_ERR_NONE; *int13slot = grub_drivemap_oldhandler; grub_mmap_free_and_unregister (drivemap_mmap); grub_drivemap_oldhandler = 0; grub_dprintf ("drivemap", "Restored int13 handler: %04x:%04x\n", (*int13slot >> 16) & 0x0ffff, *int13slot & 0x0ffff); return GRUB_ERR_NONE; } static int grub_get_root_biosnumber_drivemap (void) { const char *biosnum; int ret = -1; grub_device_t dev; biosnum = grub_env_get ("biosnum"); if (biosnum) return grub_strtoul (biosnum, 0, 0); dev = grub_device_open (0); if (dev && dev->disk && dev->disk->dev && dev->disk->dev->id == GRUB_DISK_DEVICE_BIOSDISK_ID) { drivemap_node_t *curnode = map_head; ret = (int) dev->disk->id; while (curnode) { if (curnode->redirto == ret) { ret = curnode->newdrive; break; } curnode = curnode->next; } } if (dev) grub_device_close (dev); return ret; } static grub_extcmd_t cmd; static int (*grub_get_root_biosnumber_saved) (void); GRUB_MOD_INIT (drivemap) { grub_get_root_biosnumber_saved = grub_get_root_biosnumber; grub_get_root_biosnumber = grub_get_root_biosnumber_drivemap; cmd = grub_register_extcmd ("drivemap", grub_cmd_drivemap, 0, N_("-l | -r | [-s] grubdev osdisk."), N_("Manage the BIOS drive mappings."), options); drivemap_hook = grub_loader_register_preboot_hook (&install_int13_handler, &uninstall_int13_handler, GRUB_LOADER_PREBOOT_HOOK_PRIO_NORMAL); } GRUB_MOD_FINI (drivemap) { grub_get_root_biosnumber = grub_get_root_biosnumber_saved; grub_loader_unregister_preboot_hook (drivemap_hook); drivemap_hook = 0; grub_unregister_extcmd (cmd); } grub-2.14~git20250718.0e36779/grub-core/commands/i386/pc/drivemap_int13h.S0000644000175000017500000000564115000202015021667 00000000000000/* drivemap_int13h.S - interrupt handler for the BIOS drive remapper */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2008, 2009 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #define INT13H_OFFSET(x) ((x) - LOCAL (base)) .code16 /* Copy starts here. When deployed, this code must be segment-aligned. */ /* The replacement int13 handler. Preserve all registers. */ FUNCTION(grub_drivemap_handler) LOCAL (base): /* Save %dx for future restore. */ push %dx /* Push flags. Used to simulate interrupt with original flags. */ pushf /* Map the drive number (always in DL). */ push %ax push %bx #ifdef __APPLE__ LOCAL(mapstart_offset) = INT13H_OFFSET(LOCAL (mapstart)) movw $LOCAL(mapstart_offset), %bx #else movw $INT13H_OFFSET(LOCAL (mapstart)), %bx #endif more_remaining: movw %cs:(%bx), %ax cmpb %ah, %al jz not_found /* DRV=DST => map end - drive not remapped, keep DL. */ inc %bx inc %bx cmpb %dl, %al jnz more_remaining /* Not found, but more remaining, loop. */ movb %ah, %dl /* Found - drive remapped, modify DL. */ not_found: pop %bx pop %ax /* If the call isn't ah=0x8 or ah=0x15 we must restore %dx. */ cmpb $0x8, %ah jz norestore cmpb $0x15, %ah jz norestore /* Restore flags. */ popf pushf #ifdef __APPLE__ LOCAL(oldhandler_offset) = INT13H_OFFSET (LOCAL (oldhandler)) lcall *%cs:LOCAL(oldhandler_offset) #else lcall *%cs:INT13H_OFFSET (LOCAL (oldhandler)) #endif push %bp mov %sp, %bp tail: /* Save new flags below %esp so the caller will recieve new flags. */ pushf pop %dx mov %dx, 8(%bp) pop %bp /* Restore %dx. */ pop %dx iret norestore: /* Restore flags. */ popf pushf #ifdef __APPLE__ lcall *%cs:LOCAL(oldhandler_offset) #else lcall *%cs:INT13H_OFFSET (LOCAL (oldhandler)) #endif push %bp mov %sp, %bp /* Save %dx. So it won't be restored to original value. */ mov %dx, 2(%bp) jmp tail /* Far pointer to the old handler. Stored as a CS:IP in the style of real-mode IVT entries (thus PI:SC in mem). */ VARIABLE(grub_drivemap_oldhandler) LOCAL (oldhandler): .word 0x0, 0x0 /* This label MUST be at the end of the copied block, since the installer code reserves additional space for mappings at runtime and copies them over it. */ .align 2 VARIABLE(grub_drivemap_mapstart) LOCAL (mapstart): .byte 0 grub-2.14~git20250718.0e36779/grub-core/commands/i386/pc/sendkey.c0000644000175000017500000002611015033157230020364 00000000000000/* sendkey.c - fake keystroke. */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2009 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include #include #include #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv2+"); static char sendkey[0x20]; /* Length of sendkey. */ static int keylen = 0; static int noled = 0; static const struct grub_arg_option options[] = { {"num", 'n', 0, N_("set numlock mode"), "[on|off]", ARG_TYPE_STRING}, {"caps", 'c', 0, N_("set capslock mode"), "[on|off]", ARG_TYPE_STRING}, {"scroll", 's', 0, N_("set scrolllock mode"), "[on|off]", ARG_TYPE_STRING}, {"insert", 0, 0, N_("set insert mode"), "[on|off]", ARG_TYPE_STRING}, {"pause", 0, 0, N_("set pause mode"), "[on|off]", ARG_TYPE_STRING}, {"left-shift", 0, 0, N_("press left shift"), "[on|off]", ARG_TYPE_STRING}, {"right-shift", 0, 0, N_("press right shift"), "[on|off]", ARG_TYPE_STRING}, {"sysrq", 0, 0, N_("press SysRq"), "[on|off]", ARG_TYPE_STRING}, {"numkey", 0, 0, N_("press NumLock key"), "[on|off]", ARG_TYPE_STRING}, {"capskey", 0, 0, N_("press CapsLock key"), "[on|off]", ARG_TYPE_STRING}, {"scrollkey", 0, 0, N_("press ScrollLock key"), "[on|off]", ARG_TYPE_STRING}, {"insertkey", 0, 0, N_("press Insert key"), "[on|off]", ARG_TYPE_STRING}, {"left-alt", 0, 0, N_("press left alt"), "[on|off]", ARG_TYPE_STRING}, {"right-alt", 0, 0, N_("press right alt"), "[on|off]", ARG_TYPE_STRING}, {"left-ctrl", 0, 0, N_("press left ctrl"), "[on|off]", ARG_TYPE_STRING}, {"right-ctrl", 0, 0, N_("press right ctrl"), "[on|off]", ARG_TYPE_STRING}, {"no-led", 0, 0, N_("don't update LED state"), 0, 0}, {0, 0, 0, 0, 0, 0} }; static int simple_flag_offsets[] = {5, 6, 4, 7, 11, 1, 0, 10, 13, 14, 12, 15, 9, 3, 8, 2}; static grub_uint32_t andmask = 0xffffffff, ormask = 0; struct keysym { const char *unshifted_name; /* the name in unshifted state */ const char *shifted_name; /* the name in shifted state */ unsigned char unshifted_ascii; /* the ascii code in unshifted state */ unsigned char shifted_ascii; /* the ascii code in shifted state */ unsigned char keycode; /* keyboard scancode */ }; /* The table for key symbols. If the "shifted" member of an entry is NULL, the entry does not have shifted state. Copied from GRUB Legacy setkey fuction */ static struct keysym keysym_table[] = { {"escape", 0, 0x1b, 0, 0x01}, {"1", "exclam", '1', '!', 0x02}, {"2", "at", '2', '@', 0x03}, {"3", "numbersign", '3', '#', 0x04}, {"4", "dollar", '4', '$', 0x05}, {"5", "percent", '5', '%', 0x06}, {"6", "caret", '6', '^', 0x07}, {"7", "ampersand", '7', '&', 0x08}, {"8", "asterisk", '8', '*', 0x09}, {"9", "parenleft", '9', '(', 0x0a}, {"0", "parenright", '0', ')', 0x0b}, {"minus", "underscore", '-', '_', 0x0c}, {"equal", "plus", '=', '+', 0x0d}, {"backspace", 0, '\b', 0, 0x0e}, {"tab", 0, '\t', 0, 0x0f}, {"q", "Q", 'q', 'Q', 0x10}, {"w", "W", 'w', 'W', 0x11}, {"e", "E", 'e', 'E', 0x12}, {"r", "R", 'r', 'R', 0x13}, {"t", "T", 't', 'T', 0x14}, {"y", "Y", 'y', 'Y', 0x15}, {"u", "U", 'u', 'U', 0x16}, {"i", "I", 'i', 'I', 0x17}, {"o", "O", 'o', 'O', 0x18}, {"p", "P", 'p', 'P', 0x19}, {"bracketleft", "braceleft", '[', '{', 0x1a}, {"bracketright", "braceright", ']', '}', 0x1b}, {"enter", 0, '\r', 0, 0x1c}, {"control", 0, 0, 0, 0x1d}, {"a", "A", 'a', 'A', 0x1e}, {"s", "S", 's', 'S', 0x1f}, {"d", "D", 'd', 'D', 0x20}, {"f", "F", 'f', 'F', 0x21}, {"g", "G", 'g', 'G', 0x22}, {"h", "H", 'h', 'H', 0x23}, {"j", "J", 'j', 'J', 0x24}, {"k", "K", 'k', 'K', 0x25}, {"l", "L", 'l', 'L', 0x26}, {"semicolon", "colon", ';', ':', 0x27}, {"quote", "doublequote", '\'', '"', 0x28}, {"backquote", "tilde", '`', '~', 0x29}, {"shift", 0, 0, 0, 0x2a}, {"backslash", "bar", '\\', '|', 0x2b}, {"z", "Z", 'z', 'Z', 0x2c}, {"x", "X", 'x', 'X', 0x2d}, {"c", "C", 'c', 'C', 0x2e}, {"v", "V", 'v', 'V', 0x2f}, {"b", "B", 'b', 'B', 0x30}, {"n", "N", 'n', 'N', 0x31}, {"m", "M", 'm', 'M', 0x32}, {"comma", "less", ',', '<', 0x33}, {"period", "greater", '.', '>', 0x34}, {"slash", "question", '/', '?', 0x35}, {"rshift", 0, 0, 0, 0x36}, {"numasterisk", 0, '*', 0, 0x37}, {"alt", 0, 0, 0, 0x38}, {"space", 0, ' ', 0, 0x39}, {"capslock", 0, 0, 0, 0x3a}, {"F1", 0, 0, 0, 0x3b}, {"F2", 0, 0, 0, 0x3c}, {"F3", 0, 0, 0, 0x3d}, {"F4", 0, 0, 0, 0x3e}, {"F5", 0, 0, 0, 0x3f}, {"F6", 0, 0, 0, 0x40}, {"F7", 0, 0, 0, 0x41}, {"F8", 0, 0, 0, 0x42}, {"F9", 0, 0, 0, 0x43}, {"F10", 0, 0, 0, 0x44}, {"num7", "numhome", '7', 0, 0x47}, {"num8", "numup", '8', 0, 0x48}, {"num9", "numpgup", '9', 0, 0x49}, {"numminus", 0, '-', 0, 0x4a}, {"num4", "numleft", '4', 0, 0x4b}, {"num5", "numcenter", '5', 0, 0x4c}, {"num6", "numright", '6', 0, 0x4d}, {"numplus", 0, '-', 0, 0x4e}, {"num1", "numend", '1', 0, 0x4f}, {"num2", "numdown", '2', 0, 0x50}, {"num3", "numpgdown", '3', 0, 0x51}, {"num0", "numinsert", '0', 0, 0x52}, {"numperiod", "numdelete", 0, 0x7f, 0x53}, {"F11", 0, 0, 0, 0x57}, {"F12", 0, 0, 0, 0x58}, {"numenter", 0, '\r', 0, 0xe0}, {"numslash", 0, '/', 0, 0xe0}, {"delete", 0, 0x7f, 0, 0xe0}, {"insert", 0, 0xe0, 0, 0x52}, {"home", 0, 0xe0, 0, 0x47}, {"end", 0, 0xe0, 0, 0x4f}, {"pgdown", 0, 0xe0, 0, 0x51}, {"pgup", 0, 0xe0, 0, 0x49}, {"down", 0, 0xe0, 0, 0x50}, {"up", 0, 0xe0, 0, 0x48}, {"left", 0, 0xe0, 0, 0x4b}, {"right", 0, 0xe0, 0, 0x4d} }; /* Set a simple flag in flags variable OUTOFFSET - offset of flag in FLAGS, OP - action id */ static void grub_sendkey_set_simple_flag (int outoffset, int op) { if (op == 2) { andmask |= (1 << outoffset); ormask &= ~(1 << outoffset); } else { andmask &= (~(1 << outoffset)); if (op == 1) ormask |= (1 << outoffset); else ormask &= ~(1 << outoffset); } } static int grub_sendkey_parse_op (struct grub_arg_list state) { if (! state.set) return 2; if (grub_strcmp (state.arg, "off") == 0 || grub_strcmp (state.arg, "0") == 0 || grub_strcmp (state.arg, "unpress") == 0) return 0; if (grub_strcmp (state.arg, "on") == 0 || grub_strcmp (state.arg, "1") == 0 || grub_strcmp (state.arg, "press") == 0) return 1; return 2; } static grub_uint32_t oldflags; static grub_err_t grub_sendkey_postboot (void) { /* For convention: pointer to flags. */ grub_uint32_t *flags = grub_absolute_pointer (0x417); *flags = oldflags; *((volatile char *) grub_absolute_pointer (0x41a)) = 0x1e; *((volatile char *) grub_absolute_pointer (0x41c)) = 0x1e; return GRUB_ERR_NONE; } /* Set keyboard buffer to our sendkey */ static grub_err_t grub_sendkey_preboot (int noret __attribute__ ((unused))) { /* For convention: pointer to flags. */ grub_uint32_t *flags = grub_absolute_pointer (0x417); oldflags = *flags; /* Set the sendkey. */ *((volatile char *) grub_absolute_pointer (0x41a)) = 0x1e; *((volatile char *) grub_absolute_pointer (0x41c)) = keylen + 0x1e; grub_memcpy ((char *) 0x41e, sendkey, 0x20); /* Transform "any ctrl" to "right ctrl" flag. */ if (*flags & (1 << 8)) *flags &= ~(1 << 2); /* Transform "any alt" to "right alt" flag. */ if (*flags & (1 << 9)) *flags &= ~(1 << 3); *flags = (*flags & andmask) | ormask; /* Transform "right ctrl" to "any ctrl" flag. */ if (*flags & (1 << 8)) *flags |= (1 << 2); /* Transform "right alt" to "any alt" flag. */ if (*flags & (1 << 9)) *flags |= (1 << 3); /* Write new LED state */ if (!noled) { int value = 0; int failed; /* Try 5 times */ for (failed = 0; failed < 5; failed++) { value = 0; /* Send command change LEDs */ grub_outb (0xed, 0x60); /* Wait */ do value = grub_inb (0x60); while ((value != 0xfa) && (value != 0xfe)); if (value == 0xfa) { /* Set new LEDs*/ grub_outb ((*flags >> 4) & 7, 0x60); break; } } } return GRUB_ERR_NONE; } /* Helper for grub_cmd_sendkey. */ static int find_key_code (char *key) { unsigned i; for (i = 0; i < ARRAY_SIZE(keysym_table); i++) { if (keysym_table[i].unshifted_name && grub_strcmp (key, keysym_table[i].unshifted_name) == 0) return keysym_table[i].keycode; else if (keysym_table[i].shifted_name && grub_strcmp (key, keysym_table[i].shifted_name) == 0) return keysym_table[i].keycode; } return 0; } /* Helper for grub_cmd_sendkey. */ static int find_ascii_code (char *key) { unsigned i; for (i = 0; i < ARRAY_SIZE(keysym_table); i++) { if (keysym_table[i].unshifted_name && grub_strcmp (key, keysym_table[i].unshifted_name) == 0) return keysym_table[i].unshifted_ascii; else if (keysym_table[i].shifted_name && grub_strcmp (key, keysym_table[i].shifted_name) == 0) return keysym_table[i].shifted_ascii; } return 0; } static grub_err_t grub_cmd_sendkey (grub_extcmd_context_t ctxt, int argc, char **args) { struct grub_arg_list *state = ctxt->state; andmask = 0xffffffff; ormask = 0; { int i; keylen = 0; for (i = 0; i < argc && keylen < 0x20; i++) { int key_code; key_code = find_key_code (args[i]); if (key_code) { sendkey[keylen++] = find_ascii_code (args[i]); sendkey[keylen++] = key_code; } } } { unsigned i; for (i = 0; i < ARRAY_SIZE(simple_flag_offsets); i++) grub_sendkey_set_simple_flag (simple_flag_offsets[i], grub_sendkey_parse_op(state[i])); } /* Set noled. */ noled = (state[ARRAY_SIZE(simple_flag_offsets)].set); return GRUB_ERR_NONE; } static grub_extcmd_t cmd; static struct grub_preboot *preboot_hook; GRUB_MOD_INIT (sendkey) { cmd = grub_register_extcmd ("sendkey", grub_cmd_sendkey, 0, N_("[KEYSTROKE1] [KEYSTROKE2] ..."), /* TRANSLATORS: It can emulate multiple keypresses. */ N_("Emulate a keystroke sequence"), options); preboot_hook = grub_loader_register_preboot_hook (grub_sendkey_preboot, grub_sendkey_postboot, GRUB_LOADER_PREBOOT_HOOK_PRIO_CONSOLE); } GRUB_MOD_FINI (sendkey) { grub_unregister_extcmd (cmd); grub_loader_unregister_preboot_hook (preboot_hook); } grub-2.14~git20250718.0e36779/grub-core/commands/i386/cpuid.c0000644000175000017500000000626415000202015017416 00000000000000/* cpuid.c - test for CPU features */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2006, 2007, 2009 Free Software Foundation, Inc. * Based on gcc/gcc/config/i386/driver-i386.c * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); static const struct grub_arg_option options[] = { /* TRANSLATORS: "(default)" at the end means that this option is used if no argument is specified. */ {"long-mode", 'l', 0, N_("Check if CPU supports 64-bit (long) mode (default)."), 0, 0}, {"pae", 'p', 0, N_("Check if CPU supports Physical Address Extension."), 0, 0}, {0, 0, 0, 0, 0, 0} }; enum { MODE_LM = 0, MODE_PAE = 1 }; enum { bit_PAE = (1 << 6), }; enum { bit_LM = (1 << 29) }; unsigned char grub_cpuid_has_longmode = 0, grub_cpuid_has_pae = 0; static grub_err_t grub_cmd_cpuid (grub_extcmd_context_t ctxt, int argc __attribute__ ((unused)), char **args __attribute__ ((unused))) { int val = 0; if (ctxt->state[MODE_PAE].set) val = grub_cpuid_has_pae; else val = grub_cpuid_has_longmode; return val ? GRUB_ERR_NONE /* TRANSLATORS: it's a standalone boolean value, opposite of "true". */ : grub_error (GRUB_ERR_TEST_FAILURE, N_("false")); } static grub_extcmd_t cmd; GRUB_MOD_INIT(cpuid) { #ifdef __x86_64__ /* grub-emu */ grub_cpuid_has_longmode = 1; grub_cpuid_has_pae = 1; #else unsigned int eax, ebx, ecx, edx; unsigned int max_level; unsigned int ext_level; /* See if we can use cpuid. */ asm volatile ("pushfl; pushfl; popl %0; movl %0,%1; xorl %2,%0;" "pushl %0; popfl; pushfl; popl %0; popfl" : "=&r" (eax), "=&r" (ebx) : "i" (0x00200000)); if (((eax ^ ebx) & 0x00200000) == 0) goto done; /* Check the highest input value for eax. */ grub_cpuid (0, eax, ebx, ecx, edx); /* We only look at the first four characters. */ max_level = eax; if (max_level == 0) goto done; if (max_level >= 1) { grub_cpuid (1, eax, ebx, ecx, edx); grub_cpuid_has_pae = !!(edx & bit_PAE); } grub_cpuid (0x80000000, eax, ebx, ecx, edx); ext_level = eax; if (ext_level < 0x80000000) goto done; grub_cpuid (0x80000001, eax, ebx, ecx, edx); grub_cpuid_has_longmode = !!(edx & bit_LM); done: #endif cmd = grub_register_extcmd ("cpuid", grub_cmd_cpuid, 0, "[-l]", N_("Check for CPU features."), options); } GRUB_MOD_FINI(cpuid) { grub_unregister_extcmd (cmd); } grub-2.14~git20250718.0e36779/grub-core/commands/i386/wrmsr.c0000644000175000017500000000444415036447510017506 00000000000000/* wrmsr.c - Write CPU model-specific registers. */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2019 Free Software Foundation, Inc. * Based on gcc/gcc/config/i386/driver-i386.c * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include #include #include #include #include GRUB_MOD_LICENSE("GPLv3+"); static grub_command_t cmd_write; static grub_err_t grub_cmd_msr_write (grub_command_t cmd __attribute__ ((unused)), int argc, char **argv) { grub_err_t err; grub_uint32_t addr; grub_uint64_t value; const char *ptr; err = grub_cpu_is_msr_supported (); if (err != GRUB_ERR_NONE) return grub_error (err, N_("WRMSR is unsupported")); if (argc != 2) return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("two arguments expected")); grub_errno = GRUB_ERR_NONE; ptr = argv[0]; addr = grub_strtoul (ptr, &ptr, 0); if (grub_errno != GRUB_ERR_NONE) return grub_errno; if (*ptr != '\0') return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("invalid argument")); ptr = argv[1]; value = grub_strtoull (ptr, &ptr, 0); if (grub_errno != GRUB_ERR_NONE) return grub_errno; if (*ptr != '\0') return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("invalid argument")); grub_wrmsr (addr, value); return GRUB_ERR_NONE; } GRUB_MOD_INIT(wrmsr) { cmd_write = grub_register_command_lockdown ("wrmsr", grub_cmd_msr_write, N_("ADDR VALUE"), N_("Write a value to a CPU model specific register.")); } GRUB_MOD_FINI(wrmsr) { grub_unregister_command (cmd_write); } grub-2.14~git20250718.0e36779/grub-core/commands/i386/cmostest.c0000644000175000017500000000617415036447510020177 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (C) 2009 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); static grub_err_t parse_args (int argc, char *argv[], int *byte, int *bit) { const char *rest; if (argc != 1) return grub_error (GRUB_ERR_BAD_ARGUMENT, "address required"); *byte = grub_strtoul (argv[0], &rest, 0); if (*rest != ':') return grub_error (GRUB_ERR_BAD_ARGUMENT, "address required"); *bit = grub_strtoul (rest + 1, 0, 0); return GRUB_ERR_NONE; } static grub_err_t grub_cmd_cmostest (struct grub_command *cmd __attribute__ ((unused)), int argc, char *argv[]) { int byte = 0, bit = 0; grub_err_t err; grub_uint8_t value; err = parse_args (argc, argv, &byte, &bit); if (err) return err; err = grub_cmos_read (byte, &value); if (err) return err; if (value & (1 << bit)) return GRUB_ERR_NONE; return grub_error (GRUB_ERR_TEST_FAILURE, N_("false")); } static grub_err_t grub_cmd_cmosclean (struct grub_command *cmd __attribute__ ((unused)), int argc, char *argv[]) { int byte = 0, bit = 0; grub_err_t err; grub_uint8_t value; err = parse_args (argc, argv, &byte, &bit); if (err) return err; err = grub_cmos_read (byte, &value); if (err) return err; return grub_cmos_write (byte, value & (~(1 << bit))); } static grub_err_t grub_cmd_cmosset (struct grub_command *cmd __attribute__ ((unused)), int argc, char *argv[]) { int byte = 0, bit = 0; grub_err_t err; grub_uint8_t value; err = parse_args (argc, argv, &byte, &bit); if (err) return err; err = grub_cmos_read (byte, &value); if (err) return err; return grub_cmos_write (byte, value | (1 << bit)); } static grub_command_t cmd, cmd_clean, cmd_set; GRUB_MOD_INIT(cmostest) { cmd = grub_register_command_lockdown ("cmostest", grub_cmd_cmostest, N_("BYTE:BIT"), N_("Test bit at BYTE:BIT in CMOS.")); cmd_clean = grub_register_command_lockdown ("cmosclean", grub_cmd_cmosclean, N_("BYTE:BIT"), N_("Clear bit at BYTE:BIT in CMOS.")); cmd_set = grub_register_command_lockdown ("cmosset", grub_cmd_cmosset, N_("BYTE:BIT"), /* TRANSLATORS: A bit may be either set (1) or clear (0). */ N_("Set bit at BYTE:BIT in CMOS.")); } GRUB_MOD_FINI(cmostest) { grub_unregister_command (cmd); grub_unregister_command (cmd_clean); grub_unregister_command (cmd_set); } grub-2.14~git20250718.0e36779/grub-core/commands/i386/rdmsr.c0000644000175000017500000000464415036447510017465 00000000000000/* rdmsr.c - Read CPU model-specific registers. */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2019 Free Software Foundation, Inc. * Based on gcc/gcc/config/i386/driver-i386.c * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include #include #include #include GRUB_MOD_LICENSE("GPLv3+"); static grub_extcmd_t cmd_read; static const struct grub_arg_option options[] = { {0, 'v', 0, N_("Save read value into variable VARNAME."), N_("VARNAME"), ARG_TYPE_STRING}, {0, 0, 0, 0, 0, 0} }; static grub_err_t grub_cmd_msr_read (grub_extcmd_context_t ctxt, int argc, char **argv) { grub_err_t err; grub_uint32_t addr; grub_uint64_t value; const char *ptr; char buf[sizeof("1122334455667788")]; err = grub_cpu_is_msr_supported (); if (err != GRUB_ERR_NONE) return grub_error (err, N_("RDMSR is unsupported")); if (argc != 1) return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("one argument expected")); grub_errno = GRUB_ERR_NONE; ptr = argv[0]; addr = grub_strtoul (ptr, &ptr, 0); if (grub_errno != GRUB_ERR_NONE) return grub_errno; if (*ptr != '\0') return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("invalid argument")); value = grub_rdmsr (addr); if (ctxt->state[0].set) { grub_snprintf (buf, sizeof(buf), "%llx", (unsigned long long) value); grub_env_set (ctxt->state[0].arg, buf); } else grub_printf ("0x%llx\n", (unsigned long long) value); return GRUB_ERR_NONE; } GRUB_MOD_INIT(rdmsr) { cmd_read = grub_register_extcmd ("rdmsr", grub_cmd_msr_read, 0, N_("ADDR"), N_("Read a CPU model specific register."), options); } GRUB_MOD_FINI(rdmsr) { grub_unregister_extcmd (cmd_read); } grub-2.14~git20250718.0e36779/grub-core/commands/i386/cmosdump.c0000644000175000017500000000315115000202015020131 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (C) 2009,2013 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); static grub_err_t grub_cmd_cmosdump (struct grub_command *cmd __attribute__ ((unused)), int argc __attribute__ ((unused)), char *argv[] __attribute__ ((unused))) { int i; for (i = 0; i < 256; i++) { grub_err_t err; grub_uint8_t value; if ((i & 0xf) == 0) grub_printf ("%02x: ", i); err = grub_cmos_read (i, &value); if (err) return err; grub_printf ("%02x ", value); if ((i & 0xf) == 0xf) grub_printf ("\n"); } return GRUB_ERR_NONE; } static grub_command_t cmd; GRUB_MOD_INIT(cmosdump) { cmd = grub_register_command ("cmosdump", grub_cmd_cmosdump, 0, N_("Show raw dump of the CMOS contents.")); } GRUB_MOD_FINI(cmosdump) { grub_unregister_command (cmd); } grub-2.14~git20250718.0e36779/grub-core/commands/i386/coreboot/0000755000175000017500000000000015036452575020065 500000000000000grub-2.14~git20250718.0e36779/grub-core/commands/i386/coreboot/cbls.c0000644000175000017500000000775715033157230021077 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (C) 2013 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); static const char *console_descs[] = { "8250 UART", "VGA", "BTEXT", "log buffer console", "SROM", "EHCI debug", "memory-mapped 8250 UART" }; static const char *descs[] = { [GRUB_LINUXBIOS_MEMBER_MEMORY] = "memory map (`lsmmap' to list)", [GRUB_LINUXBIOS_MEMBER_MAINBOARD] = "mainboard", [4] = "version", [5] = "extra version", [6] = "build", [7] = "compile time", [8] = "compile by", [9] = "compile host", [0xa] = "compile domain", [0xb] = "compiler", [0xc] = "linker", [0xd] = "assembler", [0xf] = "serial", [GRUB_LINUXBIOS_MEMBER_CONSOLE] = "console", [GRUB_LINUXBIOS_MEMBER_FRAMEBUFFER] = "framebuffer", [0x13] = "GPIO", [0x15] = "VDAT", [GRUB_LINUXBIOS_MEMBER_TIMESTAMPS] = "timestamps (`coreboot_boottime' to list)", [GRUB_LINUXBIOS_MEMBER_CBMEMC] = "CBMEM console (`cbmemc' to list)", [0x18] = "MRC cache", [0x19] = "VBNV", [0xc8] = "CMOS option table", [0xc9] = "CMOS option", [0xca] = "CMOS option enum", [0xcb] = "CMOS option defaults", [0xcc] = "CMOS checksum", }; static int iterate_linuxbios_table (grub_linuxbios_table_item_t table_item, void *data __attribute__ ((unused))) { if (table_item->tag < ARRAY_SIZE (descs) && descs[table_item->tag]) grub_printf ("tag=%02x size=%02x %s", table_item->tag, table_item->size, descs[table_item->tag]); else grub_printf ("tag=%02x size=%02x", table_item->tag, table_item->size); switch (table_item->tag) { case GRUB_LINUXBIOS_MEMBER_FRAMEBUFFER: { struct grub_linuxbios_table_framebuffer *fb; fb = (struct grub_linuxbios_table_framebuffer *) (table_item + 1); grub_printf (": %dx%dx%d pitch=%d lfb=0x%llx %d/%d/%d/%d %d/%d/%d/%d", fb->width, fb->height, fb->bpp, fb->pitch, (unsigned long long) fb->lfb, fb->red_mask_size, fb->green_mask_size, fb->blue_mask_size, fb->reserved_mask_size, fb->red_field_pos, fb->green_field_pos, fb->blue_field_pos, fb->reserved_field_pos); break; } case GRUB_LINUXBIOS_MEMBER_MAINBOARD: { struct grub_linuxbios_mainboard *mb; mb = (struct grub_linuxbios_mainboard *) (table_item + 1); grub_printf (": vendor=`%s' part_number=`%s'", mb->strings + mb->vendor, mb->strings + mb->part_number); break; } case 0x04 ... 0x0d: grub_printf (": `%s'", (char *) (table_item + 1)); break; case GRUB_LINUXBIOS_MEMBER_CONSOLE: { grub_uint16_t *val = (grub_uint16_t *) (table_item + 1); grub_printf (": id=%d", *val); if (*val < ARRAY_SIZE (console_descs) && console_descs[*val]) grub_printf (" %s", console_descs[*val]); } } grub_printf ("\n"); return 0; } static grub_err_t grub_cmd_lscoreboot (struct grub_command *cmd __attribute__ ((unused)), int argc __attribute__ ((unused)), char *argv[] __attribute__ ((unused))) { grub_linuxbios_table_iterate (iterate_linuxbios_table, 0); return 0; } static grub_command_t cmd; GRUB_MOD_INIT(cbls) { cmd = grub_register_command ("lscoreboot", grub_cmd_lscoreboot, 0, N_("List coreboot tables.")); } GRUB_MOD_FINI(cbls) { grub_unregister_command (cmd); } grub-2.14~git20250718.0e36779/grub-core/commands/i386/coreboot/cb_timestamps.c0000644000175000017500000000671015033157230022772 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (C) 2013 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); static grub_uint32_t tsc2ms (grub_uint64_t tsc) { grub_uint64_t ah = tsc >> 32; grub_uint64_t al = tsc & 0xffffffff; return ((al * grub_tsc_rate) >> 32) + ah * grub_tsc_rate; } static const char *descs[] = { [1] = "romstage", [2] = "before RAM init", [3] = "after RAM init", [4] = "end of romstage", [5] = "start of verified boot", [6] = "end of verified boot", [8] = "start of RAM copy", [9] = "end of RAM copy", [10] = "start of ramstage", [11] = "start of bootblock", [12] = "end of bootblock", [13] = "starting to load romstage", [14] = "finished loading romstage", [15] = "starting LZMA decompress (ignore for x86)", [16] = "finished LZMA decompress (ignore for x86)", [30] = "device enumerate", [40] = "device configure", [50] = "device enable", [60] = "device initialize", [70] = "device done", [75] = "CBMEM POST", [80] = "writing tables", [90] = "loading payload", [98] = "wake jump", [99] = "selfboot jump", }; static int iterate_linuxbios_table (grub_linuxbios_table_item_t table_item, void *data) { int *available = data; grub_uint64_t last_tsc = 0; struct grub_linuxbios_timestamp_table *ts_table; unsigned i; if (table_item->tag != GRUB_LINUXBIOS_MEMBER_TIMESTAMPS) return 0; *available = 1; ts_table = (struct grub_linuxbios_timestamp_table *) (grub_addr_t) *(grub_uint64_t *) (table_item + 1); for (i = 0; i < ts_table->used; i++) { grub_uint32_t tmabs = tsc2ms (ts_table->entries[i].tsc); grub_uint32_t tmrel = tsc2ms (ts_table->entries[i].tsc - last_tsc); last_tsc = ts_table->entries[i].tsc; grub_printf ("%3d.%03ds %2d.%03ds %02d %s\n", tmabs / 1000, tmabs % 1000, tmrel / 1000, tmrel % 1000, ts_table->entries[i].id, (ts_table->entries[i].id < ARRAY_SIZE (descs) && descs[ts_table->entries[i].id]) ? descs[ts_table->entries[i].id] : ""); } return 1; } static grub_err_t grub_cmd_coreboot_boottime (struct grub_command *cmd __attribute__ ((unused)), int argc __attribute__ ((unused)), char *argv[] __attribute__ ((unused))) { int available = 0; grub_linuxbios_table_iterate (iterate_linuxbios_table, &available); if (!available) { grub_puts_ (N_("No boot time statistics is available\n")); return 0; } return 0; } static grub_command_t cmd_boottime; GRUB_MOD_INIT(cbtime) { cmd_boottime = grub_register_command ("coreboot_boottime", grub_cmd_coreboot_boottime, 0, N_("Show coreboot boot time statistics.")); } GRUB_MOD_FINI(cbtime) { grub_unregister_command (cmd_boottime); } grub-2.14~git20250718.0e36779/grub-core/commands/file32.c0000644000175000017500000000022315000202015016672 00000000000000#define GRUB_TARGET_WORDSIZE 32 #define XX 32 #define ehdrXX ehdr32 #define grub_file_check_netbsdXX grub_file_check_netbsd32 #include "fileXX.c" grub-2.14~git20250718.0e36779/grub-core/commands/ls.c0000644000175000017500000001644115036447510016261 00000000000000/* ls.c - command to list files and devices */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2003,2005,2007,2008,2009 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); static const struct grub_arg_option options[] = { {"long", 'l', 0, N_("Show a long list with more detailed information."), 0, 0}, {"human-readable", 'h', 0, N_("Print sizes in a human readable format."), 0, 0}, {"all", 'a', 0, N_("List all files."), 0, 0}, {0, 0, 0, 0, 0, 0} }; /* Helper for grub_ls_list_devices. */ static int grub_ls_print_devices (const char *name, void *data) { int *longlist = data; if (*longlist) grub_normal_print_device_info (name); else grub_printf ("(%s) ", name); return 0; } static grub_err_t grub_ls_list_devices (int longlist) { grub_device_iterate (grub_ls_print_devices, &longlist); grub_xputs ("\n"); #if 0 { grub_net_app_level_t proto; int first = 1; FOR_NET_APP_LEVEL (proto) { if (first) grub_puts_ (N_("Network protocols:")); first = 0; grub_printf ("%s ", proto->name); } grub_xputs ("\n"); } #endif grub_refresh (); return 0; } /* Context for grub_ls_list_files. */ struct grub_ls_list_files_ctx { char *dirname; char *filename; int all; int human; int longlist; int print_dirhdr; }; /* Helper for grub_ls_list_files. */ static int print_file (const char *filename, const struct grub_dirhook_info *info, void *data) { char *pathname = NULL; struct grub_ls_list_files_ctx *ctx = data; if ((! ctx->all) && (filename[0] == '.')) return 0; if ((ctx->filename != NULL) && (grub_strcmp (filename, ctx->filename) != 0)) return 0; if (ctx->print_dirhdr) { grub_printf ("%s:\n", ctx->dirname); ctx->print_dirhdr = 0; } if (! ctx->longlist) { if (ctx->filename != NULL) grub_xputs (ctx->dirname); grub_printf ("%s%s ", filename, info->dir ? "/" : ""); return 0; } if (! info->dir) { grub_file_t file; if (ctx->dirname[grub_strlen (ctx->dirname) - 1] == '/') pathname = grub_xasprintf ("%s%s", ctx->dirname, filename); else pathname = grub_xasprintf ("%s/%s", ctx->dirname, filename); if (!pathname) return 1; /* XXX: For ext2fs symlinks are detected as files while they should be reported as directories. */ file = grub_file_open (pathname, GRUB_FILE_TYPE_GET_SIZE | GRUB_FILE_TYPE_NO_DECOMPRESS); if (file) { if (! ctx->human) grub_printf ("%-12llu", (unsigned long long) file->size); else grub_printf ("%-12s", grub_get_human_size (file->size, GRUB_HUMAN_SIZE_SHORT)); grub_file_close (file); } else grub_xputs ("????????????"); grub_errno = GRUB_ERR_NONE; } else grub_printf ("%-12s", _("DIR")); if (info->mtimeset) { struct grub_datetime datetime; grub_unixtime2datetime (info->mtime, &datetime); if (ctx->human) grub_printf (" %d-%02d-%02d %02d:%02d:%02d %-11s ", datetime.year, datetime.month, datetime.day, datetime.hour, datetime.minute, datetime.second, grub_get_weekday_name (&datetime)); else grub_printf (" %04d%02d%02d%02d%02d%02d ", datetime.year, datetime.month, datetime.day, datetime.hour, datetime.minute, datetime.second); } /* * Only print the full path when listing a file path given as an argument * to ls, i.e. when ctx->filename != NULL. File listings that are printed * due to showing the contents of a directory do not need a full path because * the full path to the directory will have already been printed. */ grub_printf ("%s%s\n", (ctx->filename != NULL) ? pathname : filename, info->dir ? "/" : ""); grub_free (pathname); return 0; } static grub_err_t grub_ls_list_files (char *dirname, int longlist, int all, int human, int dirhdr) { char *device_name; grub_fs_t fs; const char *path; grub_device_t dev; device_name = grub_file_get_device_name (dirname); dev = grub_device_open (device_name); if (! dev) goto fail; fs = grub_fs_probe (dev); path = grub_strchr (dirname, ')'); if (! path) path = dirname; else path++; if (! path && ! device_name) { grub_error (GRUB_ERR_BAD_ARGUMENT, "invalid argument"); goto fail; } if (! *path && device_name) { if (grub_errno == GRUB_ERR_UNKNOWN_FS) grub_errno = GRUB_ERR_NONE; #ifdef GRUB_MACHINE_IEEE1275 /* * Close device to prevent a double open in grub_normal_print_device_info(). * Otherwise it may lead to hangs on some IEEE 1275 platforms. */ grub_device_close (dev); dev = NULL; #endif grub_normal_print_device_info (device_name); } else if (fs) { struct grub_ls_list_files_ctx ctx = { .dirname = dirname, .filename = NULL, .all = all, .human = human, .longlist = longlist, .print_dirhdr = dirhdr }; (fs->fs_dir) (dev, path, print_file, &ctx); if (grub_errno == GRUB_ERR_BAD_FILE_TYPE && path[grub_strlen (path) - 1] != '/') { /* * Reset errno as it is currently set, but will cause subsequent code * to think there is an error. */ grub_errno = GRUB_ERR_NONE; /* PATH might be a regular file. */ ctx.print_dirhdr = 0; ctx.filename = grub_strrchr (dirname, '/'); if (ctx.filename == NULL) goto fail; ++(ctx.filename); ctx.dirname = grub_strndup (dirname, ctx.filename - dirname); if (ctx.dirname == NULL) goto fail; (fs->fs_dir) (dev, ctx.dirname + (path - dirname), print_file, &ctx); grub_free (ctx.dirname); } if (grub_errno == GRUB_ERR_NONE) grub_xputs ("\n"); grub_refresh (); } fail: if (dev) grub_device_close (dev); grub_free (device_name); return GRUB_ERR_NONE; } static grub_err_t grub_cmd_ls (grub_extcmd_context_t ctxt, int argc, char **args) { struct grub_arg_list *state = ctxt->state; int i; if (argc == 0) grub_ls_list_devices (state[0].set); else for (i = 0; i < argc; i++) grub_ls_list_files (args[i], state[0].set, state[2].set, state[1].set, argc > 1); return GRUB_ERR_NONE; } static grub_extcmd_t cmd; GRUB_MOD_INIT(ls) { cmd = grub_register_extcmd ("ls", grub_cmd_ls, 0, N_("[-l|-h|-a] [FILE ...]"), N_("List devices and files."), options); } GRUB_MOD_FINI(ls) { grub_unregister_extcmd (cmd); } grub-2.14~git20250718.0e36779/grub-core/commands/efi/0000755000175000017500000000000015036452576016324 500000000000000grub-2.14~git20250718.0e36779/grub-core/commands/efi/lsefi.c0000644000175000017500000001200115033157230017466 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (C) 2012 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); static struct known_protocol { grub_guid_t guid; const char *name; } known_protocols[] = { { GRUB_EFI_DISK_IO_GUID, "disk" }, { GRUB_EFI_BLOCK_IO_GUID, "block" }, { GRUB_EFI_SERIAL_IO_GUID, "serial" }, { GRUB_EFI_SIMPLE_NETWORK_GUID, "network" }, { GRUB_EFI_PXE_GUID, "pxe" }, { GRUB_EFI_DEVICE_PATH_GUID, "device path" }, { GRUB_EFI_PCI_IO_GUID, "PCI" }, { GRUB_EFI_PCI_ROOT_IO_GUID, "PCI root" }, { GRUB_EFI_EDID_ACTIVE_GUID, "active EDID" }, { GRUB_EFI_EDID_DISCOVERED_GUID, "discovered EDID" }, { GRUB_EFI_EDID_OVERRIDE_GUID, "override EDID" }, { GRUB_EFI_GOP_GUID, "GOP" }, { GRUB_EFI_UGA_DRAW_GUID, "UGA draw" }, { GRUB_EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL_GUID, "simple text output" }, { GRUB_EFI_SIMPLE_TEXT_INPUT_PROTOCOL_GUID, "simple text input" }, { GRUB_EFI_SIMPLE_POINTER_PROTOCOL_GUID, "simple pointer" }, { GRUB_EFI_CONSOLE_CONTROL_GUID, "console control" }, { GRUB_EFI_ABSOLUTE_POINTER_PROTOCOL_GUID, "absolute pointer" }, { GRUB_EFI_DRIVER_BINDING_PROTOCOL_GUID, "EFI driver binding" }, { GRUB_EFI_LOAD_FILE_PROTOCOL_GUID, "load file" }, { GRUB_EFI_LOAD_FILE2_PROTOCOL_GUID, "load file2" }, { GRUB_EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID, "simple FS" }, { GRUB_EFI_TAPE_IO_PROTOCOL_GUID, "tape I/O" }, { GRUB_EFI_UNICODE_COLLATION_PROTOCOL_GUID, "unicode collation" }, { GRUB_EFI_SCSI_IO_PROTOCOL_GUID, "SCSI I/O" }, { GRUB_EFI_USB2_HC_PROTOCOL_GUID, "USB host" }, { GRUB_EFI_DEBUG_SUPPORT_PROTOCOL_GUID, "debug support" }, { GRUB_EFI_DEBUGPORT_PROTOCOL_GUID, "debug port" }, { GRUB_EFI_DECOMPRESS_PROTOCOL_GUID, "decompress" }, { GRUB_EFI_LOADED_IMAGE_PROTOCOL_GUID, "loaded image" }, { GRUB_EFI_DEVICE_PATH_TO_TEXT_PROTOCOL_GUID, "device path to text" }, { GRUB_EFI_DEVICE_PATH_UTILITIES_PROTOCOL_GUID, "device path utilities" }, { GRUB_EFI_DEVICE_PATH_FROM_TEXT_PROTOCOL_GUID, "device path from text" }, { GRUB_EFI_HII_CONFIG_ROUTING_PROTOCOL_GUID, "HII config routing" }, { GRUB_EFI_HII_DATABASE_PROTOCOL_GUID, "HII database" }, { GRUB_EFI_HII_STRING_PROTOCOL_GUID, "HII string" }, { GRUB_EFI_HII_IMAGE_PROTOCOL_GUID, "HII image" }, { GRUB_EFI_HII_FONT_PROTOCOL_GUID, "HII font" }, { GRUB_EFI_COMPONENT_NAME2_PROTOCOL_GUID, "component name 2" }, { GRUB_EFI_HII_CONFIGURATION_ACCESS_PROTOCOL_GUID, "HII configuration access" }, { GRUB_EFI_USB_IO_PROTOCOL_GUID, "USB I/O" }, }; static grub_err_t grub_cmd_lsefi (grub_command_t cmd __attribute__ ((unused)), int argc __attribute__ ((unused)), char **args __attribute__ ((unused))) { grub_efi_handle_t *handles; grub_efi_uintn_t num_handles; unsigned i, j, k; handles = grub_efi_locate_handle (GRUB_EFI_ALL_HANDLES, NULL, NULL, &num_handles); for (i = 0; i < num_handles; i++) { grub_efi_handle_t handle = handles[i]; grub_efi_status_t status; grub_efi_uintn_t num_protocols; grub_packed_guid_t **protocols; grub_efi_device_path_t *dp; grub_printf ("Handle %p\n", handle); dp = grub_efi_get_device_path (handle); if (dp) { grub_printf (" "); grub_efi_print_device_path (dp); } status = grub_efi_system_table->boot_services->protocols_per_handle (handle, &protocols, &num_protocols); if (status != GRUB_EFI_SUCCESS) { grub_printf ("Unable to retrieve protocols\n"); continue; } for (j = 0; j < num_protocols; j++) { for (k = 0; k < ARRAY_SIZE (known_protocols); k++) if (grub_memcmp (protocols[j], &known_protocols[k].guid, sizeof (known_protocols[k].guid)) == 0) break; if (k < ARRAY_SIZE (known_protocols)) grub_printf (" %s\n", known_protocols[k].name); else grub_printf (" %pG\n", protocols[j]); } } return 0; } static grub_command_t cmd; GRUB_MOD_INIT(lsefi) { cmd = grub_register_command ("lsefi", grub_cmd_lsefi, NULL, "Display EFI handles."); } GRUB_MOD_FINI(lsefi) { grub_unregister_command (cmd); } grub-2.14~git20250718.0e36779/grub-core/commands/efi/efitextmode.c0000644000175000017500000001074215033157230020713 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (C) 2022 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . * * Set/Get UEFI text output mode resolution. */ #include #include #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); static grub_err_t grub_efi_set_mode (grub_efi_simple_text_output_interface_t *o, grub_efi_int32_t mode) { grub_efi_status_t status; if (mode != o->mode->mode) { status = o->set_mode (o, mode); if (status == GRUB_EFI_SUCCESS) ; else if (status == GRUB_EFI_DEVICE_ERROR) return grub_error (GRUB_ERR_BAD_DEVICE, N_("device error: could not set requested mode")); else if (status == GRUB_EFI_UNSUPPORTED) return grub_error (GRUB_ERR_OUT_OF_RANGE, N_("invalid mode: number not valid")); else return grub_error (GRUB_ERR_BAD_FIRMWARE, N_("unexpected EFI error number: `%u'"), (unsigned) status); } return GRUB_ERR_NONE; } static grub_err_t grub_cmd_efitextmode (grub_command_t cmd __attribute__ ((unused)), int argc, char **args) { grub_efi_simple_text_output_interface_t *o = grub_efi_system_table->con_out; unsigned long mode; const char *p = NULL; grub_err_t err; grub_efi_uintn_t columns, rows; grub_efi_int32_t i; if (o == NULL) return grub_error (GRUB_ERR_BAD_DEVICE, N_("no UEFI output console interface")); if (o->mode == NULL) return grub_error (GRUB_ERR_BUG, N_("no mode struct for UEFI output console")); if (argc > 2) return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("at most two arguments expected")); if (argc == 0) { grub_printf_ (N_("Available modes for console output device.\n")); for (i = 0; i < o->mode->max_mode; i++) if (GRUB_EFI_SUCCESS == o->query_mode (o, i, &columns, &rows)) grub_printf_ (N_(" [%" PRIuGRUB_EFI_UINT32_T "] Col %5" PRIuGRUB_EFI_UINTN_T " Row %5" PRIuGRUB_EFI_UINTN_T " %c\n"), i, columns, rows, (i == o->mode->mode) ? '*' : ' '); } else if (argc == 1) { if (grub_strcmp (args[0], "min") == 0) mode = 0; else if (grub_strcmp (args[0], "max") == 0) mode = o->mode->max_mode - 1; else { mode = grub_strtoul (args[0], &p, 0); if (*args[0] == '\0' || *p != '\0') return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("non-numeric or invalid mode `%s'"), args[0]); } if (mode < (unsigned long) o->mode->max_mode) { err = grub_efi_set_mode (o, (grub_efi_int32_t) mode); if (err != GRUB_ERR_NONE) return err; } else return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("invalid mode: `%lu' is greater than maximum mode `%lu'"), mode, (unsigned long) o->mode->max_mode); } else if (argc == 2) { grub_efi_uintn_t u_columns, u_rows; u_columns = (grub_efi_uintn_t) grub_strtoul (args[0], &p, 0); if (*args[0] == '\0' || *p != '\0') return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("non-numeric or invalid columns number `%s'"), args[0]); u_rows = (grub_efi_uintn_t) grub_strtoul (args[1], &p, 0); if (*args[1] == '\0' || *p != '\0') return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("non-numeric or invalid rows number `%s'"), args[1]); for (i = 0; i < o->mode->max_mode; i++) if (GRUB_EFI_SUCCESS == o->query_mode (o, i, &columns, &rows)) if (u_columns == columns && u_rows == rows) return grub_efi_set_mode (o, (grub_efi_int32_t) i); return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("no mode found with requested columns and rows")); } return GRUB_ERR_NONE; } static grub_command_t cmd; GRUB_MOD_INIT (efitextmode) { cmd = grub_register_command ("efitextmode", grub_cmd_efitextmode, N_("[min | max | | ]"), N_("Get or set EFI text mode.")); } GRUB_MOD_FINI (efitextmode) { grub_unregister_command (cmd); } grub-2.14~git20250718.0e36779/grub-core/commands/efi/efifwsetup.c0000644000175000017500000000565215033157230020563 00000000000000/* fwsetup.c - Reboot into firmware setup menu. */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2012 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); static grub_efi_boolean_t efifwsetup_is_supported (void); static grub_err_t grub_cmd_fwsetup (grub_command_t cmd __attribute__ ((unused)), int argc __attribute__ ((unused)), char **args __attribute__ ((unused))) { grub_efi_uint64_t *old_os_indications; grub_efi_uint64_t os_indications = GRUB_EFI_OS_INDICATIONS_BOOT_TO_FW_UI; grub_err_t status; grub_size_t oi_size; static grub_guid_t global = GRUB_EFI_GLOBAL_VARIABLE_GUID; if (argc >= 1 && grub_strcmp(args[0], "--is-supported") == 0) return !efifwsetup_is_supported (); if (!efifwsetup_is_supported ()) return grub_error (GRUB_ERR_INVALID_COMMAND, N_("reboot to firmware setup is not supported by the current firmware")); grub_efi_get_variable ("OsIndications", &global, &oi_size, (void **) &old_os_indications); if (old_os_indications != NULL && oi_size == sizeof (os_indications)) os_indications |= *old_os_indications; grub_free (old_os_indications); status = grub_efi_set_variable ("OsIndications", &global, &os_indications, sizeof (os_indications)); if (status != GRUB_ERR_NONE) return status; grub_reboot (); return GRUB_ERR_BUG; } static grub_command_t cmd = NULL; static grub_efi_boolean_t efifwsetup_is_supported (void) { grub_efi_uint64_t *os_indications_supported = NULL; grub_size_t oi_size = 0; static grub_guid_t global = GRUB_EFI_GLOBAL_VARIABLE_GUID; grub_efi_boolean_t ret = 0; grub_efi_get_variable ("OsIndicationsSupported", &global, &oi_size, (void **) &os_indications_supported); if (!os_indications_supported) goto done; if (*os_indications_supported & GRUB_EFI_OS_INDICATIONS_BOOT_TO_FW_UI) ret = 1; done: grub_free (os_indications_supported); return ret; } GRUB_MOD_INIT (efifwsetup) { cmd = grub_register_command ("fwsetup", grub_cmd_fwsetup, NULL, N_("Reboot into firmware setup menu.")); } GRUB_MOD_FINI (efifwsetup) { if (cmd) grub_unregister_command (cmd); } grub-2.14~git20250718.0e36779/grub-core/commands/efi/lsefisystab.c0000644000175000017500000001043715033157230020727 00000000000000/* lsefisystab.c - Display EFI systab. */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2008 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); struct guid_mapping { grub_guid_t guid; const char *name; }; static const struct guid_mapping guid_mappings[] = { { GRUB_EFI_ACPI_20_TABLE_GUID, "ACPI-2.0"}, { GRUB_EFI_ACPI_TABLE_GUID, "ACPI-1.0"}, { GRUB_EFI_CONFORMANCE_PROFILES_TABLE_GUID, "CONFORMANCE PROFILES"}, { GRUB_EFI_CRC32_GUIDED_SECTION_EXTRACTION_GUID, "CRC32 GUIDED SECTION EXTRACTION"}, { GRUB_EFI_DEBUG_IMAGE_INFO_TABLE_GUID, "DEBUG IMAGE INFO"}, { GRUB_EFI_DEVICE_TREE_GUID, "DEVICE TREE"}, { GRUB_EFI_DXE_SERVICES_TABLE_GUID, "DXE SERVICES"}, { GRUB_EFI_HCDP_TABLE_GUID, "HCDP"}, { GRUB_EFI_HOB_LIST_GUID, "HOB LIST"}, { GRUB_EFI_IMAGE_SECURITY_DATABASE_GUID, "IMAGE EXECUTION INFORMATION"}, { GRUB_EFI_LZMA_CUSTOM_DECOMPRESS_GUID, "LZMA CUSTOM DECOMPRESS"}, { GRUB_EFI_MEMORY_TYPE_INFORMATION_GUID, "MEMORY TYPE INFO"}, { GRUB_EFI_MPS_TABLE_GUID, "MPS"}, { GRUB_EFI_RT_PROPERTIES_TABLE_GUID, "RT PROPERTIES"}, { GRUB_EFI_SAL_TABLE_GUID, "SAL"}, { GRUB_EFI_SMBIOS_TABLE_GUID, "SMBIOS"}, { GRUB_EFI_SMBIOS3_TABLE_GUID, "SMBIOS3"}, { GRUB_EFI_SYSTEM_RESOURCE_TABLE_GUID, "SYSTEM RESOURCE TABLE"}, { GRUB_EFI_TIANO_CUSTOM_DECOMPRESS_GUID, "TIANO CUSTOM DECOMPRESS"}, { GRUB_EFI_TSC_FREQUENCY_GUID, "TSC FREQUENCY"}, }; static grub_err_t grub_cmd_lsefisystab (struct grub_command *cmd __attribute__ ((unused)), int argc __attribute__ ((unused)), char **args __attribute__ ((unused))) { const grub_efi_system_table_t *st = grub_efi_system_table; const grub_efi_uint32_t major_rev = st->hdr.revision >> 16; const grub_efi_uint32_t minor_rev_upper = (st->hdr.revision & 0xffff) / 10; const grub_efi_uint32_t minor_rev_lower = (st->hdr.revision & 0xffff) % 10; grub_efi_configuration_table_t *t; unsigned int i; grub_printf ("Address: %p\n", st); grub_printf ("Signature: %016" PRIxGRUB_UINT64_T " revision: %u.%u", st->hdr.signature, major_rev, minor_rev_upper); if (minor_rev_lower) grub_printf (".%u", minor_rev_lower); grub_printf ("\n"); { char *vendor; grub_uint16_t *vendor_utf16; grub_printf ("Vendor: "); for (vendor_utf16 = st->firmware_vendor; *vendor_utf16; vendor_utf16++); /* Allocate extra 3 bytes to simplify math. */ vendor = grub_calloc (4, vendor_utf16 - st->firmware_vendor + 1); if (!vendor) return grub_errno; *grub_utf16_to_utf8 ((grub_uint8_t *) vendor, st->firmware_vendor, vendor_utf16 - st->firmware_vendor) = 0; grub_printf ("%s", vendor); grub_free (vendor); } grub_printf (", Version=%x\n", st->firmware_revision); grub_printf ("%lld tables:\n", (long long) st->num_table_entries); t = st->configuration_table; for (i = 0; i < st->num_table_entries; i++) { unsigned int j; grub_printf ("%p ", t->vendor_table); grub_printf ("%pG", &t->vendor_guid); for (j = 0; j < ARRAY_SIZE (guid_mappings); j++) if (grub_memcmp (&guid_mappings[j].guid, &t->vendor_guid, sizeof (grub_guid_t)) == 0) grub_printf (" %s", guid_mappings[j].name); grub_printf ("\n"); t++; } return GRUB_ERR_NONE; } static grub_command_t cmd; GRUB_MOD_INIT(lsefisystab) { cmd = grub_register_command ("lsefisystab", grub_cmd_lsefisystab, "", "Display EFI system tables."); } GRUB_MOD_FINI(lsefisystab) { grub_unregister_command (cmd); } grub-2.14~git20250718.0e36779/grub-core/commands/efi/smbios.c0000644000175000017500000000235415033157230017672 00000000000000/* smbios.c - get smbios tables. */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2019 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include struct grub_smbios_eps * grub_machine_smbios_get_eps (void) { static grub_guid_t smbios_guid = GRUB_EFI_SMBIOS_TABLE_GUID; return (struct grub_smbios_eps *) grub_efi_find_configuration_table (&smbios_guid); } struct grub_smbios_eps3 * grub_machine_smbios_get_eps3 (void) { static grub_guid_t smbios3_guid = GRUB_EFI_SMBIOS3_TABLE_GUID; return (struct grub_smbios_eps3 *) grub_efi_find_configuration_table (&smbios3_guid); } grub-2.14~git20250718.0e36779/grub-core/commands/efi/lsefimmap.c0000644000175000017500000001137215033157230020353 00000000000000/* lsefimemmap.c - Display memory map. */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2008 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); #define ADD_MEMORY_DESCRIPTOR(desc, size) \ ((grub_efi_memory_descriptor_t *) ((char *) (desc) + (size))) static grub_err_t grub_cmd_lsefimmap (grub_command_t cmd __attribute__ ((unused)), int argc __attribute__ ((unused)), char **args __attribute__ ((unused))) { grub_efi_uintn_t map_size; grub_efi_memory_descriptor_t *memory_map; grub_efi_memory_descriptor_t *memory_map_end; grub_efi_memory_descriptor_t *desc; grub_efi_uintn_t desc_size; map_size = 0; if (grub_efi_get_memory_map (&map_size, NULL, NULL, &desc_size, 0) < 0) return 0; memory_map = grub_malloc (map_size); if (memory_map == NULL) return grub_errno; if (grub_efi_get_memory_map (&map_size, memory_map, NULL, &desc_size, 0) <= 0) goto fail; grub_printf ("Type Physical start - end #Pages " " Size Attributes\n"); memory_map_end = ADD_MEMORY_DESCRIPTOR (memory_map, map_size); for (desc = memory_map; desc < memory_map_end; desc = ADD_MEMORY_DESCRIPTOR (desc, desc_size)) { grub_efi_uint64_t size; grub_efi_uint64_t attr; static const char types_str[][9] = { "reserved", "ldr-code", "ldr-data", "BS-code ", "BS-data ", "RT-code ", "RT-data ", "conv-mem", "unusable", "ACPI-rec", "ACPI-nvs", "MMIO ", "IO-ports", "PAL-code", "persist ", }; if (desc->type < ARRAY_SIZE (types_str)) grub_printf ("%s ", types_str[desc->type]); else grub_printf ("Unk %02x ", desc->type); grub_printf (" %016" PRIxGRUB_UINT64_T "-%016" PRIxGRUB_UINT64_T " %08" PRIxGRUB_UINT64_T, desc->physical_start, desc->physical_start + (desc->num_pages << 12) - 1, desc->num_pages); size = desc->num_pages << 12; /* 4 KiB page size */ /* * Since size is a multiple of 4 KiB, no need to handle units * of just Bytes (which would use a mask of 0x3ff). * * 14 characters would support the largest possible number of 4 KiB * pages that are not a multiple of larger units (e.g., MiB): * 17592186044415 (0xffffff_fffff000), but that uses a lot of * whitespace for a rare case. 6 characters usually suffices; * columns will be off if not, but this is preferable to rounding. */ if (size & 0xfffff) grub_printf (" %6" PRIuGRUB_UINT64_T "KiB", size >> 10); else if (size & 0x3fffffff) grub_printf (" %6" PRIuGRUB_UINT64_T "MiB", size >> 20); else if (size & 0xffffffffff) grub_printf (" %6" PRIuGRUB_UINT64_T "GiB", size >> 30); else if (size & 0x3ffffffffffff) grub_printf (" %6" PRIuGRUB_UINT64_T "TiB", size >> 40); else if (size & 0xfffffffffffffff) grub_printf (" %6" PRIuGRUB_UINT64_T "PiB", size >> 50); else grub_printf (" %6" PRIuGRUB_UINT64_T "EiB", size >> 60); attr = desc->attribute; if (attr & GRUB_EFI_MEMORY_RUNTIME) grub_printf (" RT"); if (attr & GRUB_EFI_MEMORY_UC) grub_printf (" UC"); if (attr & GRUB_EFI_MEMORY_WC) grub_printf (" WC"); if (attr & GRUB_EFI_MEMORY_WT) grub_printf (" WT"); if (attr & GRUB_EFI_MEMORY_WB) grub_printf (" WB"); if (attr & GRUB_EFI_MEMORY_UCE) grub_printf (" UCE"); if (attr & GRUB_EFI_MEMORY_WP) grub_printf (" WP"); if (attr & GRUB_EFI_MEMORY_RP) grub_printf (" RP"); if (attr & GRUB_EFI_MEMORY_XP) grub_printf (" XP"); if (attr & GRUB_EFI_MEMORY_NV) grub_printf (" NV"); if (attr & GRUB_EFI_MEMORY_MORE_RELIABLE) grub_printf (" MR"); if (attr & GRUB_EFI_MEMORY_RO) grub_printf (" RO"); grub_printf ("\n"); } fail: grub_free (memory_map); return 0; } static grub_command_t cmd; GRUB_MOD_INIT(lsefimmap) { cmd = grub_register_command ("lsefimmap", grub_cmd_lsefimmap, "", "Display EFI memory map."); } GRUB_MOD_FINI(lsefimmap) { grub_unregister_command (cmd); } grub-2.14~git20250718.0e36779/grub-core/commands/efi/loadbios.c0000644000175000017500000001253415033157230020173 00000000000000/* loadbios.c - command to load a bios dump */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2009 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); static grub_guid_t acpi_guid = GRUB_EFI_ACPI_TABLE_GUID; static grub_guid_t acpi2_guid = GRUB_EFI_ACPI_20_TABLE_GUID; static grub_guid_t smbios_guid = GRUB_EFI_SMBIOS_TABLE_GUID; #define EBDA_SEG_ADDR 0x40e #define LOW_MEM_ADDR 0x413 #define FAKE_EBDA_SEG 0x9fc0 #define BLANK_MEM 0xffffffff #define VBIOS_ADDR 0xc0000 #define SBIOS_ADDR 0xf0000 static int enable_rom_area (void) { grub_pci_address_t addr; grub_uint32_t *rom_ptr; grub_pci_device_t dev = { .bus = 0, .device = 0, .function = 0}; rom_ptr = grub_absolute_pointer (VBIOS_ADDR); if (*rom_ptr != BLANK_MEM) { grub_puts_ (N_("ROM image is present.")); return 0; } /* FIXME: should be macroified. */ addr = grub_pci_make_address (dev, 144); grub_pci_write_byte (addr++, 0x30); grub_pci_write_byte (addr++, 0x33); grub_pci_write_byte (addr++, 0x33); grub_pci_write_byte (addr++, 0x33); grub_pci_write_byte (addr++, 0x33); grub_pci_write_byte (addr++, 0x33); grub_pci_write_byte (addr++, 0x33); grub_pci_write_byte (addr, 0); *rom_ptr = 0; if (*rom_ptr != 0) { grub_puts_ (N_("Can\'t enable ROM area.")); return 0; } return 1; } static void lock_rom_area (void) { grub_pci_address_t addr; grub_pci_device_t dev = { .bus = 0, .device = 0, .function = 0}; /* FIXME: should be macroified. */ addr = grub_pci_make_address (dev, 144); grub_pci_write_byte (addr++, 0x10); grub_pci_write_byte (addr++, 0x11); grub_pci_write_byte (addr++, 0x11); grub_pci_write_byte (addr++, 0x11); grub_pci_write_byte (addr, 0x11); } static void fake_bios_data (int use_rom) { void *acpi, *smbios; grub_uint16_t *ebda_seg_ptr, *low_mem_ptr; ebda_seg_ptr = grub_absolute_pointer (EBDA_SEG_ADDR); low_mem_ptr = grub_absolute_pointer (LOW_MEM_ADDR); if ((*ebda_seg_ptr) || (*low_mem_ptr)) return; acpi = grub_efi_find_configuration_table (&acpi2_guid); grub_dprintf ("efi", "ACPI2: %p\n", acpi); if (!acpi) { acpi = grub_efi_find_configuration_table (&acpi_guid); grub_dprintf ("efi", "ACPI: %p\n", acpi); } smbios = grub_efi_find_configuration_table (&smbios_guid); grub_dprintf ("efi", "SMBIOS: %p\n", smbios); *ebda_seg_ptr = FAKE_EBDA_SEG; *low_mem_ptr = (FAKE_EBDA_SEG >> 6); /* *((grub_uint16_t *) (FAKE_EBDA_SEG << 4)) = 640 - *low_mem_ptr; */ *((grub_uint16_t *) (grub_absolute_pointer (FAKE_EBDA_SEG << 4))) = 640 - *low_mem_ptr; if (acpi) grub_memcpy ((char *) ((FAKE_EBDA_SEG << 4) + 16), acpi, 1024 - 16); if ((use_rom) && (smbios)) grub_memcpy ((char *) SBIOS_ADDR, (char *) smbios + 16, 16); } static grub_err_t grub_cmd_fakebios (struct grub_command *cmd __attribute__ ((unused)), int argc __attribute__ ((unused)), char *argv[] __attribute__ ((unused))) { if (enable_rom_area ()) { fake_bios_data (1); lock_rom_area (); } else fake_bios_data (0); return 0; } static grub_err_t grub_cmd_loadbios (grub_command_t cmd __attribute__ ((unused)), int argc, char *argv[]) { grub_file_t file; int size; if (argc == 0) return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected")); if (argc > 1) { file = grub_file_open (argv[1], GRUB_FILE_TYPE_VBE_DUMP); if (! file) return grub_errno; if (file->size != 4) grub_error (GRUB_ERR_BAD_ARGUMENT, "invalid int10 dump size"); else grub_file_read (file, (void *) 0x40, 4); grub_file_close (file); if (grub_errno) return grub_errno; } file = grub_file_open (argv[0], GRUB_FILE_TYPE_VBE_DUMP); if (! file) return grub_errno; size = file->size; if ((size < 0x10000) || (size > 0x40000)) grub_error (GRUB_ERR_BAD_ARGUMENT, "invalid bios dump size"); else if (enable_rom_area ()) { grub_file_read (file, (void *) VBIOS_ADDR, size); fake_bios_data (size <= 0x40000); lock_rom_area (); } grub_file_close (file); return grub_errno; } static grub_command_t cmd_fakebios, cmd_loadbios; GRUB_MOD_INIT(loadbios) { cmd_fakebios = grub_register_command_lockdown ("fakebios", grub_cmd_fakebios, 0, N_("Create BIOS-like structures for" " backward compatibility with" " existing OS.")); cmd_loadbios = grub_register_command_lockdown ("loadbios", grub_cmd_loadbios, N_("BIOS_DUMP [INT10_DUMP]"), N_("Load BIOS dump.")); } GRUB_MOD_FINI(loadbios) { grub_unregister_command (cmd_fakebios); grub_unregister_command (cmd_loadbios); } grub-2.14~git20250718.0e36779/grub-core/commands/efi/lssal.c0000644000175000017500000001165115033157230017514 00000000000000/* lssal.c - Display EFI SAL systab. */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2008 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); static void disp_sal (void *table) { struct grub_efi_sal_system_table *t = table; void *desc; grub_uint32_t len, l, i; grub_printf ("SAL rev: %02x, signature: %x, len:%x\n", t->sal_rev, t->signature, t->total_table_len); grub_printf ("nbr entry: %d, chksum: %02x, SAL version A: %02x B: %02x\n", t->entry_count, t->checksum, t->sal_a_version, t->sal_b_version); grub_printf ("OEM-ID: %-32s\n", t->oem_id); grub_printf ("Product-ID: %-32s\n", t->product_id); desc = t->entries; len = t->total_table_len - sizeof (struct grub_efi_sal_system_table); if (t->total_table_len <= sizeof (struct grub_efi_sal_system_table)) return; for (i = 0; i < t->entry_count; i++) { switch (*(grub_uint8_t *) desc) { case GRUB_EFI_SAL_SYSTEM_TABLE_TYPE_ENTRYPOINT_DESCRIPTOR: { struct grub_efi_sal_system_table_entrypoint_descriptor *c = desc; l = sizeof (*c); grub_printf (" Entry point: PAL=%016" PRIxGRUB_UINT64_T " SAL=%016" PRIxGRUB_UINT64_T " GP=%016" PRIxGRUB_UINT64_T "\n", c->pal_proc_addr, c->sal_proc_addr, c->global_data_ptr); } break; case GRUB_EFI_SAL_SYSTEM_TABLE_TYPE_MEMORY_DESCRIPTOR: { struct grub_efi_sal_system_table_memory_descriptor *c = desc; l = sizeof (*c); grub_printf (" Memory descriptor entry addr=%016" PRIxGRUB_UINT64_T " len=%" PRIuGRUB_UINT64_T "KB\n", c->addr, c->len * 4); grub_printf (" sal_used=%d attr=%x AR=%x attr_mask=%x " "type=%x usage=%x\n", c->sal_used, c->attr, c->ar, c->attr_mask, c->mem_type, c->usage); } break; case GRUB_EFI_SAL_SYSTEM_TABLE_TYPE_PLATFORM_FEATURES: { struct grub_efi_sal_system_table_platform_features *c = desc; l = sizeof (*c); grub_printf (" Platform features: %02x", c->flags); if (c->flags & GRUB_EFI_SAL_SYSTEM_TABLE_PLATFORM_FEATURE_BUSLOCK) grub_printf (" BusLock"); if (c->flags & GRUB_EFI_SAL_SYSTEM_TABLE_PLATFORM_FEATURE_IRQREDIRECT) grub_printf (" IrqRedirect"); if (c->flags & GRUB_EFI_SAL_SYSTEM_TABLE_PLATFORM_FEATURE_IPIREDIRECT) grub_printf (" IPIRedirect"); if (c->flags & GRUB_EFI_SAL_SYSTEM_TABLE_PLATFORM_FEATURE_ITCDRIFT) grub_printf (" ITCDrift"); grub_printf ("\n"); } break; case GRUB_EFI_SAL_SYSTEM_TABLE_TYPE_TRANSLATION_REGISTER_DESCRIPTOR: { struct grub_efi_sal_system_table_translation_register_descriptor *c = desc; l = sizeof (*c); grub_printf (" TR type=%d num=%d va=%016" PRIxGRUB_UINT64_T " pte=%016" PRIxGRUB_UINT64_T "\n", c->register_type, c->register_number, c->addr, c->page_size); } break; case GRUB_EFI_SAL_SYSTEM_TABLE_TYPE_PURGE_TRANSLATION_COHERENCE: { struct grub_efi_sal_system_table_purge_translation_coherence *c = desc; l = sizeof (*c); grub_printf (" PTC coherence nbr=%d addr=%016" PRIxGRUB_UINT64_T "\n", c->ndomains, c->coherence); } break; case GRUB_EFI_SAL_SYSTEM_TABLE_TYPE_AP_WAKEUP: { struct grub_efi_sal_system_table_ap_wakeup *c = desc; l = sizeof (*c); grub_printf (" AP wake-up: mec=%d vect=%" PRIxGRUB_UINT64_T "\n", c->mechanism, c->vector); } break; default: grub_printf (" unknown entry 0x%x\n", *(grub_uint8_t *)desc); return; } desc = (grub_uint8_t *)desc + l; if (len <= l) return; len -= l; } } static grub_err_t grub_cmd_lssal (struct grub_command *cmd __attribute__ ((unused)), int argc __attribute__ ((unused)), char **args __attribute__ ((unused))) { static grub_guid_t guid = GRUB_EFI_SAL_TABLE_GUID; void *table = grub_efi_find_configuration_table (&guid); if (table == NULL) { grub_printf ("SAL not found\n"); return GRUB_ERR_NONE; } disp_sal (table); return GRUB_ERR_NONE; } static grub_command_t cmd; GRUB_MOD_INIT(lssal) { cmd = grub_register_command ("lssal", grub_cmd_lssal, "", "Display SAL system table."); } GRUB_MOD_FINI(lssal) { grub_unregister_command (cmd); } grub-2.14~git20250718.0e36779/grub-core/commands/efi/tpm.c0000644000175000017500000002225715036447510017210 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (C) 2018 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . * * EFI TPM support code. */ #include #include #include #include #include #include #include #include #include typedef TCG_PCR_EVENT grub_tpm_event_t; static grub_guid_t tpm_guid = EFI_TPM_GUID; static grub_guid_t tpm2_guid = EFI_TPM2_GUID; static grub_guid_t cc_measurement_guid = GRUB_EFI_CC_MEASUREMENT_PROTOCOL_GUID; static grub_efi_handle_t *grub_tpm_handle; static grub_uint8_t grub_tpm_version; static grub_int8_t tpm1_present = -1; static grub_int8_t tpm2_present = -1; static grub_efi_boolean_t grub_tpm1_present (grub_efi_tpm_protocol_t *tpm) { grub_efi_status_t status; TCG_EFI_BOOT_SERVICE_CAPABILITY caps; grub_uint32_t flags; grub_efi_physical_address_t eventlog, lastevent; if (tpm1_present != -1) return (grub_efi_boolean_t) tpm1_present; caps.Size = (grub_uint8_t) sizeof (caps); status = tpm->status_check (tpm, &caps, &flags, &eventlog, &lastevent); if (status != GRUB_EFI_SUCCESS || caps.TPMDeactivatedFlag || !caps.TPMPresentFlag) tpm1_present = 0; else tpm1_present = 1; grub_dprintf ("tpm", "tpm1%s present\n", tpm1_present ? "" : " NOT"); return (grub_efi_boolean_t) tpm1_present; } static grub_efi_boolean_t grub_tpm2_present (grub_efi_tpm2_protocol_t *tpm) { grub_efi_status_t status; EFI_TCG2_BOOT_SERVICE_CAPABILITY caps; caps.Size = (grub_uint8_t) sizeof (caps); if (tpm2_present != -1) return (grub_efi_boolean_t) tpm2_present; status = tpm->get_capability (tpm, &caps); if (status != GRUB_EFI_SUCCESS || !caps.TPMPresentFlag) tpm2_present = 0; else tpm2_present = 1; grub_dprintf ("tpm", "tpm2%s present\n", tpm2_present ? "" : " NOT"); return (grub_efi_boolean_t) tpm2_present; } static grub_efi_boolean_t grub_tpm_handle_find (grub_efi_handle_t *tpm_handle, grub_efi_uint8_t *protocol_version) { grub_efi_handle_t *handles; grub_efi_uintn_t num_handles; if (grub_tpm_handle != NULL) { *tpm_handle = grub_tpm_handle; *protocol_version = grub_tpm_version; return 1; } handles = grub_efi_locate_handle (GRUB_EFI_BY_PROTOCOL, &tpm_guid, NULL, &num_handles); if (handles && num_handles > 0) { grub_tpm_handle = handles[0]; *tpm_handle = handles[0]; grub_tpm_version = 1; *protocol_version = 1; grub_dprintf ("tpm", "TPM handle Found, version: 1\n"); return 1; } handles = grub_efi_locate_handle (GRUB_EFI_BY_PROTOCOL, &tpm2_guid, NULL, &num_handles); if (handles && num_handles > 0) { grub_tpm_handle = handles[0]; *tpm_handle = handles[0]; grub_tpm_version = 2; *protocol_version = 2; grub_dprintf ("tpm", "TPM handle Found, version: 2\n"); return 1; } return 0; } static grub_err_t grub_efi_log_event_status (grub_efi_status_t status) { switch (status) { case GRUB_EFI_SUCCESS: return GRUB_ERR_NONE; case GRUB_EFI_DEVICE_ERROR: return grub_error (GRUB_ERR_IO, N_("command failed")); case GRUB_EFI_INVALID_PARAMETER: return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("invalid parameter")); case GRUB_EFI_BUFFER_TOO_SMALL: return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("output buffer too small")); case GRUB_EFI_NOT_FOUND: return grub_error (GRUB_ERR_UNKNOWN_DEVICE, N_("TPM unavailable")); default: return grub_error (grub_is_tpm_fail_fatal () ? GRUB_ERR_UNKNOWN_DEVICE : GRUB_ERR_NONE, N_("unknown TPM error")); } } static grub_err_t grub_tpm1_log_event (grub_efi_handle_t tpm_handle, unsigned char *buf, grub_size_t size, grub_uint8_t pcr, const char *description) { grub_tpm_event_t *event; grub_efi_status_t status; grub_efi_tpm_protocol_t *tpm; grub_efi_physical_address_t lastevent; grub_uint32_t algorithm; grub_uint32_t eventnum = 0; tpm = grub_efi_open_protocol (tpm_handle, &tpm_guid, GRUB_EFI_OPEN_PROTOCOL_GET_PROTOCOL); if (!grub_tpm1_present (tpm)) return 0; event = grub_zalloc (sizeof (*event) + grub_strlen (description) + 1); if (!event) return grub_error (GRUB_ERR_OUT_OF_MEMORY, N_("cannot allocate TPM event buffer")); event->PCRIndex = pcr; event->EventType = EV_IPL; event->EventSize = grub_strlen (description) + 1; grub_strcpy ((char *) event->Event, description); algorithm = TCG_ALG_SHA; status = tpm->log_extend_event (tpm, (grub_addr_t) buf, (grub_uint64_t) size, algorithm, event, &eventnum, &lastevent); grub_free (event); return grub_efi_log_event_status (status); } static grub_err_t grub_tpm2_log_event (grub_efi_handle_t tpm_handle, unsigned char *buf, grub_size_t size, grub_uint8_t pcr, const char *description) { EFI_TCG2_EVENT *event; grub_efi_status_t status; grub_efi_tpm2_protocol_t *tpm; tpm = grub_efi_open_protocol (tpm_handle, &tpm2_guid, GRUB_EFI_OPEN_PROTOCOL_GET_PROTOCOL); if (!grub_tpm2_present (tpm)) return 0; event = grub_zalloc (sizeof (EFI_TCG2_EVENT) + grub_strlen (description) + 1); if (!event) return grub_error (GRUB_ERR_OUT_OF_MEMORY, N_("cannot allocate TPM event buffer")); event->Header.HeaderSize = sizeof (EFI_TCG2_EVENT_HEADER); event->Header.HeaderVersion = 1; event->Header.PCRIndex = pcr; event->Header.EventType = EV_IPL; event->Size = sizeof (*event) - sizeof (event->Event) + grub_strlen (description) + 1; grub_strcpy ((char *) event->Event, description); status = tpm->hash_log_extend_event (tpm, 0, (grub_addr_t) buf, (grub_uint64_t) size, event); grub_free (event); return grub_efi_log_event_status (status); } static void grub_cc_log_event (unsigned char *buf, grub_size_t size, grub_uint8_t pcr, const char *description) { grub_efi_cc_event_t *event; grub_efi_status_t status; grub_efi_cc_protocol_t *cc; grub_efi_cc_mr_index_t mr; cc = grub_efi_locate_protocol (&cc_measurement_guid, NULL); if (cc == NULL) return; status = cc->map_pcr_to_mr_index (cc, pcr, &mr); if (status != GRUB_EFI_SUCCESS) { grub_efi_log_event_status (status); return; } event = grub_zalloc (sizeof (grub_efi_cc_event_t) + grub_strlen (description) + 1); if (event == NULL) { grub_error (GRUB_ERR_OUT_OF_MEMORY, N_("cannot allocate CC event buffer")); return; } event->Header.HeaderSize = sizeof (grub_efi_cc_event_header_t); event->Header.HeaderVersion = GRUB_EFI_CC_EVENT_HEADER_VERSION; event->Header.MrIndex = mr; event->Header.EventType = EV_IPL; event->Size = sizeof (*event) + grub_strlen (description) + 1; grub_strcpy ((char *) event->Event, description); status = cc->hash_log_extend_event (cc, 0, (grub_efi_physical_address_t)(grub_addr_t) buf, (grub_efi_uint64_t) size, event); grub_free (event); if (status != GRUB_EFI_SUCCESS) grub_efi_log_event_status (status); } grub_err_t grub_tpm_measure (unsigned char *buf, grub_size_t size, grub_uint8_t pcr, const char *description) { grub_efi_handle_t tpm_handle; grub_efi_uint8_t protocol_version; grub_cc_log_event(buf, size, pcr, description); if (!grub_tpm_handle_find (&tpm_handle, &protocol_version)) return 0; grub_dprintf ("tpm", "log_event, pcr = %d, size = 0x%" PRIxGRUB_SIZE ", %s\n", pcr, size, description); if (protocol_version == 1) return grub_tpm1_log_event (tpm_handle, buf, size, pcr, description); else return grub_tpm2_log_event (tpm_handle, buf, size, pcr, description); } int grub_tpm_present (void) { grub_efi_handle_t tpm_handle; grub_efi_uint8_t protocol_version; grub_efi_cc_protocol_t *cc; /* * When confidential computing measurement protocol is enabled * we assume the TPM is present. */ cc = grub_efi_locate_protocol (&cc_measurement_guid, NULL); if (cc != NULL) return 1; if (!grub_tpm_handle_find (&tpm_handle, &protocol_version)) return 0; if (protocol_version == 1) { grub_efi_tpm_protocol_t *tpm; tpm = grub_efi_open_protocol (tpm_handle, &tpm_guid, GRUB_EFI_OPEN_PROTOCOL_GET_PROTOCOL); if (!tpm) { grub_dprintf ("tpm", "Cannot open TPM protocol\n"); return 0; } return grub_tpm1_present (tpm); } else { grub_efi_tpm2_protocol_t *tpm; tpm = grub_efi_open_protocol (tpm_handle, &tpm2_guid, GRUB_EFI_OPEN_PROTOCOL_GET_PROTOCOL); if (!tpm) { grub_dprintf ("tpm", "Cannot open TPM protocol\n"); return 0; } return grub_tpm2_present (tpm); } } grub-2.14~git20250718.0e36779/grub-core/commands/efi/fixvideo.c0000644000175000017500000000564615000202015020204 00000000000000/* fixvideo.c - fix video problem in efi */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2009 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); static struct grub_video_patch { const char *name; grub_uint32_t pci_id; grub_uint32_t mmio_bar; grub_uint32_t mmio_reg; grub_uint32_t mmio_old; } video_patches[] = { {"Intel 945GM", 0x27a28086, 0, 0x71184, 0x1000000}, /* DSPBBASE */ {"Intel 965GM", 0x2a028086, 0, 0x7119C, 0x1000000}, /* DSPBSURF */ {0, 0, 0, 0, 0} }; static int scan_card (grub_pci_device_t dev, grub_pci_id_t pciid, void *data __attribute__ ((unused))) { grub_pci_address_t addr; addr = grub_pci_make_address (dev, GRUB_PCI_REG_CLASS); if (grub_pci_read_byte (addr + 3) == 0x3) { struct grub_video_patch *p = video_patches; while (p->name) { if (p->pci_id == pciid) { grub_addr_t base; grub_dprintf ("fixvideo", "Found graphic card: %s\n", p->name); addr += 8 + p->mmio_bar * 4; base = grub_pci_read (addr); if ((! base) || (base & GRUB_PCI_ADDR_SPACE_IO) || (base & GRUB_PCI_ADDR_MEM_PREFETCH)) grub_dprintf ("fixvideo", "Invalid MMIO bar %d\n", p->mmio_bar); else { base &= GRUB_PCI_ADDR_MEM_MASK; base += p->mmio_reg; if (*((volatile grub_uint32_t *) base) != p->mmio_old) grub_dprintf ("fixvideo", "Old value doesn't match\n"); else { *((volatile grub_uint32_t *) base) = 0; if (*((volatile grub_uint32_t *) base)) grub_dprintf ("fixvideo", "Setting MMIO fails\n"); } } return 1; } p++; } grub_dprintf ("fixvideo", "Unknown graphic card: %x\n", pciid); } return 0; } static grub_err_t grub_cmd_fixvideo (grub_command_t cmd __attribute__ ((unused)), int argc __attribute__ ((unused)), char *argv[] __attribute__ ((unused))) { grub_pci_iterate (scan_card, NULL); return 0; } static grub_command_t cmd_fixvideo; GRUB_MOD_INIT(fixvideo) { cmd_fixvideo = grub_register_command ("fix_video", grub_cmd_fixvideo, 0, N_("Fix video problem.")); } GRUB_MOD_FINI(fixvideo) { grub_unregister_command (cmd_fixvideo); } grub-2.14~git20250718.0e36779/grub-core/commands/setpci.c0000644000175000017500000002101015033157230017110 00000000000000/* lspci.c - List PCI devices. */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2008, 2009 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); struct pci_register { const char *name; grub_uint16_t addr; unsigned size; }; static struct pci_register pci_registers[] = { {"VENDOR_ID", GRUB_PCI_REG_VENDOR , 2}, {"DEVICE_ID", GRUB_PCI_REG_DEVICE , 2}, {"COMMAND", GRUB_PCI_REG_COMMAND , 2}, {"STATUS", GRUB_PCI_REG_STATUS , 2}, {"REVISION", GRUB_PCI_REG_REVISION , 1}, {"CLASS_PROG", GRUB_PCI_REG_CLASS + 1 , 1}, {"CLASS_DEVICE", GRUB_PCI_REG_CLASS + 2 , 2}, {"CACHE_LINE_SIZE", GRUB_PCI_REG_CACHELINE , 1}, {"LATENCY_TIMER", GRUB_PCI_REG_LAT_TIMER , 1}, {"HEADER_TYPE", GRUB_PCI_REG_HEADER_TYPE , 1}, {"BIST", GRUB_PCI_REG_BIST , 1}, {"BASE_ADDRESS_0", GRUB_PCI_REG_ADDRESS_REG0, 4}, {"BASE_ADDRESS_1", GRUB_PCI_REG_ADDRESS_REG1, 4}, {"BASE_ADDRESS_2", GRUB_PCI_REG_ADDRESS_REG2, 4}, {"BASE_ADDRESS_3", GRUB_PCI_REG_ADDRESS_REG3, 4}, {"BASE_ADDRESS_4", GRUB_PCI_REG_ADDRESS_REG4, 4}, {"BASE_ADDRESS_5", GRUB_PCI_REG_ADDRESS_REG5, 4}, {"CARDBUS_CIS", GRUB_PCI_REG_CIS_POINTER , 4}, {"SUBVENDOR_ID", GRUB_PCI_REG_SUBVENDOR , 2}, {"SUBSYSTEM_ID", GRUB_PCI_REG_SUBSYSTEM , 2}, {"ROM_ADDRESS", GRUB_PCI_REG_ROM_ADDRESS , 4}, {"CAP_POINTER", GRUB_PCI_REG_CAP_POINTER , 1}, {"INTERRUPT_LINE", GRUB_PCI_REG_IRQ_LINE , 1}, {"INTERRUPT_PIN", GRUB_PCI_REG_IRQ_PIN , 1}, {"MIN_GNT", GRUB_PCI_REG_MIN_GNT , 1}, {"MAX_LAT", GRUB_PCI_REG_MIN_GNT , 1}, }; static const struct grub_arg_option options[] = { {0, 'd', 0, N_("Select device by vendor and device IDs."), N_("[vendor]:[device]"), ARG_TYPE_STRING}, {0, 's', 0, N_("Select device by its position on the bus."), N_("[bus]:[slot][.func]"), ARG_TYPE_STRING}, {0, 'v', 0, N_("Save read value into variable VARNAME."), N_("VARNAME"), ARG_TYPE_STRING}, {0, 0, 0, 0, 0, 0} }; static grub_uint32_t pciid_check_mask, pciid_check_value; static int bus, device, function; static int check_bus, check_device, check_function; static grub_uint32_t write_mask, regwrite; static int regsize; static grub_uint16_t regaddr; static const char *varname; static int grub_setpci_iter (grub_pci_device_t dev, grub_pci_id_t pciid, void *data __attribute__ ((unused))) { grub_uint32_t regval = 0; grub_pci_address_t addr; if ((pciid & pciid_check_mask) != pciid_check_value) return 0; if (check_bus && grub_pci_get_bus (dev) != bus) return 0; if (check_device && grub_pci_get_device (dev) != device) return 0; if (check_function && grub_pci_get_function (dev) != function) return 0; addr = grub_pci_make_address (dev, regaddr); switch (regsize) { case 1: regval = grub_pci_read_byte (addr); break; case 2: regval = grub_pci_read_word (addr); break; case 4: regval = grub_pci_read (addr); break; } if (varname) { char buf[sizeof ("XXXXXXXX")]; grub_snprintf (buf, sizeof (buf), "%x", regval); grub_env_set (varname, buf); return 1; } if (!write_mask) { grub_printf (_("Register %x of %x:%02x.%x is %x\n"), regaddr, grub_pci_get_bus (dev), grub_pci_get_device (dev), grub_pci_get_function (dev), regval); return 0; } regval = (regval & ~write_mask) | regwrite; switch (regsize) { case 1: grub_pci_write_byte (addr, regval); break; case 2: grub_pci_write_word (addr, regval); break; case 4: grub_pci_write (addr, regval); break; } return 0; } static grub_err_t grub_cmd_setpci (grub_extcmd_context_t ctxt, int argc, char **argv) { const char *ptr; unsigned i; pciid_check_value = 0; pciid_check_mask = 0; if (ctxt->state[0].set) { ptr = ctxt->state[0].arg; pciid_check_value |= (grub_strtoul (ptr, &ptr, 16) & 0xffff); if (grub_errno == GRUB_ERR_BAD_NUMBER) { grub_errno = GRUB_ERR_NONE; ptr = ctxt->state[0].arg; } else pciid_check_mask |= 0xffff; if (grub_errno) return grub_errno; if (*ptr != ':') return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("missing `%c' symbol"), ':'); ptr++; pciid_check_value |= (grub_strtoul (ptr, &ptr, 16) & 0xffff) << 16; if (grub_errno == GRUB_ERR_BAD_NUMBER) grub_errno = GRUB_ERR_NONE; else pciid_check_mask |= 0xffff0000; } pciid_check_value &= pciid_check_mask; check_bus = check_device = check_function = 0; if (ctxt->state[1].set) { const char *optr; ptr = ctxt->state[1].arg; optr = ptr; bus = grub_strtoul (ptr, &ptr, 16); if (grub_errno == GRUB_ERR_BAD_NUMBER) { grub_errno = GRUB_ERR_NONE; ptr = optr; } else check_bus = 1; if (grub_errno) return grub_errno; if (*ptr != ':') return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("missing `%c' symbol"), ':'); ptr++; optr = ptr; device = grub_strtoul (ptr, &ptr, 16); if (grub_errno == GRUB_ERR_BAD_NUMBER) { grub_errno = GRUB_ERR_NONE; ptr = optr; } else check_device = 1; if (*ptr == '.') { ptr++; function = grub_strtoul (ptr, &ptr, 16); if (grub_errno) return grub_errno; check_function = 1; } } if (ctxt->state[2].set) varname = ctxt->state[2].arg; else varname = NULL; write_mask = 0; if (argc != 1) return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("one argument expected")); ptr = argv[0]; for (i = 0; i < ARRAY_SIZE (pci_registers); i++) { if (grub_strncmp (ptr, pci_registers[i].name, grub_strlen (pci_registers[i].name)) == 0) break; } if (i == ARRAY_SIZE (pci_registers)) { regsize = 0; regaddr = grub_strtoul (ptr, &ptr, 16); if (grub_errno) return grub_error (GRUB_ERR_BAD_ARGUMENT, "unknown register"); } else { regaddr = pci_registers[i].addr; regsize = pci_registers[i].size; ptr += grub_strlen (pci_registers[i].name); } if (grub_errno) return grub_errno; if (*ptr == '+') { ptr++; regaddr += grub_strtoul (ptr, &ptr, 16); if (grub_errno) return grub_errno; } if (grub_memcmp (ptr, ".L", sizeof (".L") - 1) == 0 || grub_memcmp (ptr, ".l", sizeof (".l") - 1) == 0) { regsize = 4; ptr += sizeof (".l") - 1; } else if (grub_memcmp (ptr, ".W", sizeof (".W") - 1) == 0 || grub_memcmp (ptr, ".w", sizeof (".w") - 1) == 0) { regsize = 2; ptr += sizeof (".w") - 1; } else if (grub_memcmp (ptr, ".B", sizeof (".B") - 1) == 0 || grub_memcmp (ptr, ".b", sizeof (".b") - 1) == 0) { regsize = 1; ptr += sizeof (".b") - 1; } if (!regsize) return grub_error (GRUB_ERR_BAD_ARGUMENT, "unknown register size"); write_mask = 0; if (*ptr == '=') { ptr++; regwrite = grub_strtoul (ptr, &ptr, 16); if (grub_errno) return grub_errno; write_mask = 0xffffffff; if (*ptr == ':') { ptr++; write_mask = grub_strtoul (ptr, &ptr, 16); if (grub_errno) return grub_errno; } regwrite &= write_mask; } if (write_mask && varname) return grub_error (GRUB_ERR_BAD_ARGUMENT, "option -v isn't valid for writes"); grub_pci_iterate (grub_setpci_iter, NULL); return GRUB_ERR_NONE; } static grub_extcmd_t cmd; GRUB_MOD_INIT(setpci) { cmd = grub_register_extcmd_lockdown ("setpci", grub_cmd_setpci, 0, N_("[-s POSITION] [-d DEVICE] [-v VAR] " "REGISTER[=VALUE[:MASK]]"), N_("Manipulate PCI devices."), options); } GRUB_MOD_FINI(setpci) { grub_unregister_extcmd (cmd); } grub-2.14~git20250718.0e36779/grub-core/commands/search.c0000644000175000017500000002152715036447510017111 00000000000000/* search.c - search devices based on a file or a filesystem label */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2005,2007,2008,2009 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); struct cache_entry { struct cache_entry *next; char *key; char *value; }; static struct cache_entry *cache; /* Context for FUNC_NAME. */ struct search_ctx { const char *key; const char *var; enum search_flags flags; char **hints; unsigned nhints; int count; int is_cache; }; static bool is_unencrypted_disk (grub_disk_t disk) { grub_command_t cmd; char *disk_str; int disk_str_len; int res; if (disk->dev->id == GRUB_DISK_DEVICE_CRYPTODISK_ID) return false; /* This is (crypto) disk. */ if (disk->dev->id == GRUB_DISK_DEVICE_DISKFILTER_ID) { char opt[] = "--quiet"; char *args[2]; cmd = grub_command_find ("cryptocheck"); if (cmd == NULL) /* No diskfilter module loaded for some reason. */ return true; disk_str_len = grub_strlen (disk->name) + 2 + 1; disk_str = grub_malloc (disk_str_len); if (disk_str == NULL) /* Something is wrong, better report as unencrypted. */ return true; grub_snprintf (disk_str, disk_str_len, "(%s)", disk->name); args[0] = opt; args[1] = disk_str; res = cmd->func (cmd, 2, args); grub_free (disk_str); return (res != GRUB_ERR_NONE) ? true : false; /* GRUB_ERR_NONE for encrypted. */ } return true; } /* Helper for FUNC_NAME. */ static int iterate_device (const char *name, void *data) { struct search_ctx *ctx = data; int found = 0; /* Skip floppy drives when requested. */ if (ctx->flags & SEARCH_FLAGS_NO_FLOPPY && name[0] == 'f' && name[1] == 'd' && name[2] >= '0' && name[2] <= '9') return 0; /* Limit to EFI disks when requested. */ if (ctx->flags & SEARCH_FLAGS_EFIDISK_ONLY) { grub_device_t dev; dev = grub_device_open (name); if (dev == NULL) { grub_errno = GRUB_ERR_NONE; return 0; } if (dev->disk == NULL || dev->disk->dev->id != GRUB_DISK_DEVICE_EFIDISK_ID) { grub_device_close (dev); grub_errno = GRUB_ERR_NONE; return 0; } grub_device_close (dev); } /* Limit to encrypted disks when requested. */ if (ctx->flags & SEARCH_FLAGS_CRYPTODISK_ONLY) { grub_device_t dev; dev = grub_device_open (name); if (dev == NULL) { grub_errno = GRUB_ERR_NONE; return 0; } if (dev->disk == NULL || is_unencrypted_disk (dev->disk) == true) { grub_device_close (dev); grub_errno = GRUB_ERR_NONE; return 0; } grub_device_close (dev); } #ifdef DO_SEARCH_FS_UUID #define compare_fn grub_strcasecmp #else #define compare_fn grub_strcmp #endif #ifdef DO_SEARCH_FILE { char *buf; grub_file_t file; buf = grub_xasprintf ("(%s)%s", name, ctx->key); if (! buf) return 1; file = grub_file_open (buf, GRUB_FILE_TYPE_FS_SEARCH | GRUB_FILE_TYPE_NO_DECOMPRESS); if (file) { found = 1; grub_file_close (file); } grub_free (buf); } #else { /* SEARCH_FS_UUID or SEARCH_LABEL */ grub_device_t dev; grub_fs_t fs; char *quid; dev = grub_device_open (name); if (dev) { fs = grub_fs_probe (dev); #ifdef DO_SEARCH_FS_UUID #define read_fn fs_uuid #else #define read_fn fs_label #endif if (fs && fs->read_fn) { fs->read_fn (dev, &quid); if (grub_errno == GRUB_ERR_NONE && quid) { if (compare_fn (quid, ctx->key) == 0) found = 1; grub_free (quid); } } grub_device_close (dev); } } #endif if (!ctx->is_cache && found && ctx->count == 0) { struct cache_entry *cache_ent; cache_ent = grub_malloc (sizeof (*cache_ent)); if (cache_ent) { cache_ent->key = grub_strdup (ctx->key); cache_ent->value = grub_strdup (name); if (cache_ent->value && cache_ent->key) { cache_ent->next = cache; cache = cache_ent; } else { grub_free (cache_ent->value); grub_free (cache_ent->key); grub_free (cache_ent); grub_errno = GRUB_ERR_NONE; } } else grub_errno = GRUB_ERR_NONE; } if (found) { ctx->count++; if (ctx->var) grub_env_set (ctx->var, name); else grub_printf (" %s", name); } grub_errno = GRUB_ERR_NONE; return (found && ctx->var); } /* Helper for FUNC_NAME. */ static int part_hook (grub_disk_t disk, const grub_partition_t partition, void *data) { struct search_ctx *ctx = data; char *partition_name, *devname; int ret; partition_name = grub_partition_get_name (partition); if (! partition_name) return 1; devname = grub_xasprintf ("%s,%s", disk->name, partition_name); grub_free (partition_name); if (!devname) return 1; ret = iterate_device (devname, ctx); grub_free (devname); return ret; } /* Helper for FUNC_NAME. */ static void try (struct search_ctx *ctx) { unsigned i; struct cache_entry **prev; struct cache_entry *cache_ent; for (prev = &cache, cache_ent = *prev; cache_ent; prev = &cache_ent->next, cache_ent = *prev) if (compare_fn (cache_ent->key, ctx->key) == 0) break; if (cache_ent) { ctx->is_cache = 1; if (iterate_device (cache_ent->value, ctx)) { ctx->is_cache = 0; return; } ctx->is_cache = 0; /* Cache entry was outdated. Remove it. */ if (!ctx->count) { *prev = cache_ent->next; grub_free (cache_ent->key); grub_free (cache_ent->value); grub_free (cache_ent); } } for (i = 0; i < ctx->nhints; i++) { char *end; if (!ctx->hints[i][0]) continue; end = ctx->hints[i] + grub_strlen (ctx->hints[i]) - 1; if (*end == ',') *end = 0; if (iterate_device (ctx->hints[i], ctx)) { if (!*end) *end = ','; return; } if (!*end) { grub_device_t dev; int ret; dev = grub_device_open (ctx->hints[i]); if (!dev) { if (!*end) *end = ','; continue; } if (!dev->disk) { grub_device_close (dev); if (!*end) *end = ','; continue; } ret = grub_partition_iterate (dev->disk, part_hook, ctx); if (!*end) *end = ','; grub_device_close (dev); if (ret) return; } } grub_device_iterate (iterate_device, ctx); } void FUNC_NAME (const char *key, const char *var, enum search_flags flags, char **hints, unsigned nhints) { struct search_ctx ctx = { .key = key, .var = var, .flags = flags, .hints = hints, .nhints = nhints, .count = 0, .is_cache = 0 }; grub_fs_autoload_hook_t saved_autoload; /* First try without autoloading if we're setting variable. */ if (var) { saved_autoload = grub_fs_autoload_hook; grub_fs_autoload_hook = 0; try (&ctx); /* Restore autoload hook. */ grub_fs_autoload_hook = saved_autoload; /* Retry with autoload if nothing found. */ if (grub_errno == GRUB_ERR_NONE && ctx.count == 0) try (&ctx); } else try (&ctx); if (grub_errno == GRUB_ERR_NONE && ctx.count == 0) grub_error (GRUB_ERR_FILE_NOT_FOUND, "no such device: %s", key); } static grub_err_t grub_cmd_do_search (grub_command_t cmd __attribute__ ((unused)), int argc, char **args) { if (argc == 0) return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("one argument expected")); FUNC_NAME (args[0], argc == 1 ? 0 : args[1], 0, (args + 2), argc > 2 ? argc - 2 : 0); return grub_errno; } static grub_command_t cmd; #ifdef DO_SEARCH_FILE GRUB_MOD_INIT(search_fs_file) #elif defined (DO_SEARCH_FS_UUID) GRUB_MOD_INIT(search_fs_uuid) #else GRUB_MOD_INIT(search_label) #endif { cmd = grub_register_command (COMMAND_NAME, grub_cmd_do_search, N_("NAME [VARIABLE] [HINTS]"), HELP_MESSAGE); } #ifdef DO_SEARCH_FILE GRUB_MOD_FINI(search_fs_file) #elif defined (DO_SEARCH_FS_UUID) GRUB_MOD_FINI(search_fs_uuid) #else GRUB_MOD_FINI(search_label) #endif { grub_unregister_command (cmd); } grub-2.14~git20250718.0e36779/grub-core/commands/regexp.c0000644000175000017500000001034015033157230017117 00000000000000/* regexp.c -- The regexp command. */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2005,2007 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); static const struct grub_arg_option options[] = { { "set", 's', GRUB_ARG_OPTION_REPEATABLE, /* TRANSLATORS: in regexp you can mark some groups with parentheses. These groups are then numbered and you can save some of them in variables. In other programs those components are often referenced with back slash, e.g. \1. Compare sed -e 's,\([a-z][a-z]*\),lowercase=\1,g' The whole matching component is saved in VARNAME, not its number. */ N_("Store matched component NUMBER in VARNAME."), N_("[NUMBER:]VARNAME"), ARG_TYPE_STRING }, { 0, 0, 0, 0, 0, 0 } }; static grub_err_t setvar (char *str, char *v, regmatch_t *m) { char ch; grub_err_t err; ch = str[m->rm_eo]; str[m->rm_eo] = '\0'; err = grub_env_set (v, str + m->rm_so); str[m->rm_eo] = ch; return err; } static grub_err_t set_matches (char **varnames, char *str, grub_size_t nmatches, regmatch_t *matches) { int i; char *p; const char * q; grub_err_t err; unsigned long j; for (i = 0; varnames && varnames[i]; i++) { err = GRUB_ERR_NONE; p = grub_strchr (varnames[i], ':'); if (! p) { /* varname w/o index defaults to 1 */ if (nmatches < 2 || matches[1].rm_so == -1) grub_env_unset (varnames[i]); else err = setvar (str, varnames[i], &matches[1]); } else { j = grub_strtoul (varnames[i], &q, 10); if (q != p) return grub_error (GRUB_ERR_BAD_ARGUMENT, "invalid variable name format %s", varnames[i]); if (nmatches <= j || matches[j].rm_so == -1) grub_env_unset (p + 1); else err = setvar (str, p + 1, &matches[j]); } if (err != GRUB_ERR_NONE) return err; } return GRUB_ERR_NONE; } static grub_err_t grub_cmd_regexp (grub_extcmd_context_t ctxt, int argc, char **args) { regex_t regex; int ret; grub_size_t s; char *comperr; grub_err_t err; regmatch_t *matches = 0; if (argc != 2) return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("two arguments expected")); ret = regcomp (®ex, args[0], REG_EXTENDED); if (ret) goto fail; matches = grub_calloc (regex.re_nsub + 1, sizeof (*matches)); if (! matches) goto fail; ret = regexec (®ex, args[1], regex.re_nsub + 1, matches, 0); if (!ret) { err = set_matches (ctxt->state[0].args, args[1], regex.re_nsub + 1, matches); regfree (®ex); grub_free (matches); return err; } fail: grub_free (matches); s = regerror (ret, ®ex, 0, 0); comperr = grub_malloc (s); if (!comperr) { regfree (®ex); return grub_errno; } regerror (ret, ®ex, comperr, s); err = grub_error (GRUB_ERR_TEST_FAILURE, "%s", comperr); regfree (®ex); grub_free (comperr); return err; } static grub_extcmd_t cmd; GRUB_MOD_INIT(regexp) { cmd = grub_register_extcmd ("regexp", grub_cmd_regexp, 0, /* TRANSLATORS: This are two arguments. So it's two separate units to translate and pay attention not to reverse them. */ N_("REGEXP STRING"), N_("Test if REGEXP matches STRING."), options); /* Setup GRUB script wildcard translator. */ grub_wildcard_translator = &grub_filename_translator; } GRUB_MOD_FINI(regexp) { grub_unregister_extcmd (cmd); grub_wildcard_translator = 0; } grub-2.14~git20250718.0e36779/grub-core/commands/wildcard.c0000644000175000017500000003033415033157230017423 00000000000000/* wildcard.c - Wildcard character expansion for GRUB script. */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2010 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include #include #include static inline int isregexop (char ch); static char ** merge (char **lhs, char **rhs); static char *make_dir (const char *prefix, const char *start, const char *end); static int make_regex (const char *regex_start, const char *regex_end, regex_t *regexp); static void split_path (const char *path, const char **suffix_end, const char **regex_end); static char ** match_devices (const regex_t *regexp, int noparts); static char ** match_files (const char *prefix, const char *suffix_start, const char *suffix_end, const regex_t *regexp); static grub_err_t wildcard_expand (const char *s, char ***strs); struct grub_script_wildcard_translator grub_filename_translator = { .expand = wildcard_expand, }; static char ** merge (char **dest, char **ps) { int i; int j; char **p; grub_size_t sz; if (! dest) return ps; if (! ps) return dest; for (i = 0; dest[i]; i++) ; for (j = 0; ps[j]; j++) ; if (grub_add (i, j, &sz) || grub_add (sz, 1, &sz) || grub_mul (sz, sizeof (char *), &sz)) return dest; p = grub_realloc (dest, sz); if (! p) { grub_free (dest); grub_free (ps); return 0; } dest = p; for (j = 0; ps[j]; j++) dest[i++] = ps[j]; dest[i] = 0; grub_free (ps); return dest; } static inline int isregexop (char ch) { return grub_strchr ("*.\\|+{}[]?", ch) ? 1 : 0; } static char * make_dir (const char *prefix, const char *start, const char *end) { char ch; unsigned i; unsigned n; char *result; i = grub_strlen (prefix); n = i + end - start; result = grub_malloc (n + 1); if (! result) return 0; grub_strcpy (result, prefix); while (start < end && (ch = *start++)) if (ch == '\\' && isregexop (*start)) result[i++] = *start++; else result[i++] = ch; result[i] = '\0'; return result; } static int make_regex (const char *start, const char *end, regex_t *regexp) { char ch; int i = 0; unsigned len = end - start; char *buffer; grub_size_t sz; /* Worst case size is (len * 2 + 2 + 1). */ if (grub_mul (len, 2, &sz) || grub_add (sz, 3, &sz)) return 1; buffer = grub_malloc (sz); if (! buffer) return 1; buffer[i++] = '^'; while (start < end) { /* XXX Only * and ? expansion for now. */ switch ((ch = *start++)) { case '\\': buffer[i++] = ch; if (*start != '\0') buffer[i++] = *start++; break; case '.': case '(': case ')': case '@': case '+': case '|': case '{': case '}': case '[': case ']': buffer[i++] = '\\'; buffer[i++] = ch; break; case '*': buffer[i++] = '.'; buffer[i++] = '*'; break; case '?': buffer[i++] = '.'; break; default: buffer[i++] = ch; } } buffer[i++] = '$'; buffer[i] = '\0'; grub_dprintf ("expand", "Regexp is %s\n", buffer); if (regcomp (regexp, buffer, RE_SYNTAX_GNU_AWK)) { grub_free (buffer); return 1; } grub_free (buffer); return 0; } /* Split `str' into two parts: (1) dirname that is regexop free (2) dirname that has a regexop. */ static void split_path (const char *str, const char **noregexop, const char **regexop) { char ch = 0; int regex = 0; const char *end; const char *split; /* points till the end of dirnaname that doesn't need expansion. */ split = end = str; while ((ch = *end)) { if (ch == '\\' && end[1]) end++; else if (ch == '*' || ch == '?') regex = 1; else if (ch == '/' && ! regex) split = end + 1; /* forward to next regexop-free dirname */ else if (ch == '/' && regex) break; /* stop at the first dirname with a regexop */ end++; } *regexop = end; if (! regex) *noregexop = end; else *noregexop = split; } /* Context for match_devices. */ struct match_devices_ctx { const regex_t *regexp; int noparts; int ndev; char **devs; }; /* Helper for match_devices. */ static int match_devices_iter (const char *name, void *data) { struct match_devices_ctx *ctx = data; char **t; char *buffer; grub_size_t sz; /* skip partitions if asked to. */ if (ctx->noparts && grub_strchr (name, ',')) return 0; buffer = grub_xasprintf ("(%s)", name); if (! buffer) return 1; grub_dprintf ("expand", "matching: %s\n", buffer); if (regexec (ctx->regexp, buffer, 0, 0, 0)) { grub_dprintf ("expand", "not matched\n"); fail: grub_free (buffer); return 0; } if (grub_add (ctx->ndev, 2, &sz) || grub_mul (sz, sizeof (char *), &sz)) goto fail; t = grub_realloc (ctx->devs, sz); if (! t) { grub_free (buffer); return 1; } ctx->devs = t; ctx->devs[ctx->ndev++] = buffer; ctx->devs[ctx->ndev] = 0; return 0; } static char ** match_devices (const regex_t *regexp, int noparts) { struct match_devices_ctx ctx = { .regexp = regexp, .noparts = noparts, .ndev = 0, .devs = 0 }; int i; if (grub_device_iterate (match_devices_iter, &ctx)) goto fail; return ctx.devs; fail: for (i = 0; ctx.devs && ctx.devs[i]; i++) grub_free (ctx.devs[i]); grub_free (ctx.devs); return 0; } /* Context for match_files. */ struct match_files_ctx { const regex_t *regexp; char **files; unsigned nfile; char *dir; }; /* Helper for match_files. */ static int match_files_iter (const char *name, const struct grub_dirhook_info *info __attribute__((unused)), void *data) { struct match_files_ctx *ctx = data; char **t; char *buffer; grub_size_t sz; /* skip . and .. names */ if (grub_strcmp(".", name) == 0 || grub_strcmp("..", name) == 0) return 0; grub_dprintf ("expand", "matching: %s in %s\n", name, ctx->dir); if (regexec (ctx->regexp, name, 0, 0, 0)) return 0; grub_dprintf ("expand", "matched\n"); buffer = grub_xasprintf ("%s%s", ctx->dir, name); if (! buffer) return 1; if (grub_add (ctx->nfile, 2, &sz) || grub_mul (sz, sizeof (char *), &sz)) goto fail; t = grub_realloc (ctx->files, sz); if (!t) { fail: grub_free (buffer); return 1; } ctx->files = t; ctx->files[ctx->nfile++] = buffer; ctx->files[ctx->nfile] = 0; return 0; } static char ** match_files (const char *prefix, const char *suffix, const char *end, const regex_t *regexp) { struct match_files_ctx ctx = { .regexp = regexp, .nfile = 0, .files = 0 }; int i; const char *path; char *device_name; grub_fs_t fs; grub_device_t dev; dev = 0; device_name = 0; grub_error_push (); ctx.dir = make_dir (prefix, suffix, end); if (! ctx.dir) goto fail; device_name = grub_file_get_device_name (ctx.dir); dev = grub_device_open (device_name); if (! dev) goto fail; fs = grub_fs_probe (dev); if (! fs) goto fail; if (ctx.dir[0] == '(') { path = grub_strchr (ctx.dir, ')'); if (!path) goto fail; path++; } else path = ctx.dir; if (fs->fs_dir (dev, path, match_files_iter, &ctx)) goto fail; grub_free (ctx.dir); grub_device_close (dev); grub_free (device_name); grub_error_pop (); return ctx.files; fail: grub_free (ctx.dir); for (i = 0; ctx.files && ctx.files[i]; i++) grub_free (ctx.files[i]); grub_free (ctx.files); if (dev) grub_device_close (dev); grub_free (device_name); grub_error_pop (); return 0; } /* Context for check_file. */ struct check_file_ctx { const char *basename; int found; }; /* Helper for check_file. */ static int check_file_iter (const char *name, const struct grub_dirhook_info *info, void *data) { struct check_file_ctx *ctx = data; if (ctx->basename[0] == 0 || (info->case_insensitive ? grub_strcasecmp (name, ctx->basename) == 0 : grub_strcmp (name, ctx->basename) == 0)) { ctx->found = 1; return 1; } return 0; } static int check_file (const char *dir, const char *basename) { struct check_file_ctx ctx = { .basename = basename, .found = 0 }; grub_fs_t fs; grub_device_t dev; const char *device_name, *path; device_name = grub_file_get_device_name (dir); dev = grub_device_open (device_name); if (! dev) goto fail; fs = grub_fs_probe (dev); if (! fs) goto fail; if (dir[0] == '(') { path = grub_strchr (dir, ')'); if (!path) goto fail; path++; } else path = dir; fs->fs_dir (dev, path[0] ? path : "/", check_file_iter, &ctx); if (grub_errno == 0 && basename[0] == 0) ctx.found = 1; fail: grub_errno = 0; return ctx.found; } static void unescape (char *out, const char *in, const char *end) { char *optr; const char *iptr; for (optr = out, iptr = in; iptr < end;) { if (*iptr == '\\' && iptr + 1 < end) { *optr++ = iptr[1]; iptr += 2; continue; } if (*iptr == '\\') break; *optr++ = *iptr++; } *optr = 0; } static grub_err_t wildcard_expand (const char *s, char ***strs) { const char *start; const char *regexop; const char *noregexop; char **paths = 0; int had_regexp = 0; unsigned i; regex_t regexp; *strs = 0; if (s[0] != '/' && s[0] != '(' && s[0] != '*') return 0; start = s; while (*start) { split_path (start, &noregexop, ®exop); if (noregexop == regexop) { grub_dprintf ("expand", "no expansion needed\n"); if (paths == 0) { paths = grub_malloc (sizeof (char *) * 2); if (!paths) goto fail; paths[0] = grub_malloc (regexop - start + 1); if (!paths[0]) goto fail; unescape (paths[0], start, regexop); paths[1] = 0; } else { int j = 0; for (i = 0; paths[i]; i++) { char *o, *oend; char *n; char *p; o = paths[i]; oend = o + grub_strlen (o); n = grub_malloc ((oend - o) + (regexop - start) + 1); if (!n) goto fail; grub_memcpy (n, o, oend - o); unescape (n + (oend - o), start, regexop); if (had_regexp) p = grub_strrchr (n, '/'); else p = 0; if (!p) { grub_free (o); paths[j++] = n; continue; } *p = 0; if (!check_file (n, p + 1)) { grub_dprintf ("expand", "file <%s> in <%s> not found\n", p + 1, n); grub_free (o); grub_free (n); continue; } *p = '/'; grub_free (o); paths[j++] = n; } if (j == 0) { grub_free (paths); paths = 0; goto done; } paths[j] = 0; } grub_dprintf ("expand", "paths[0] = `%s'\n", paths[0]); start = regexop; continue; } if (make_regex (noregexop, regexop, ®exp)) goto fail; had_regexp = 1; if (paths == 0) { if (start == noregexop) /* device part has regexop */ paths = match_devices (®exp, *start != '('); else /* device part explicit wo regexop */ paths = match_files ("", start, noregexop, ®exp); } else { char **r = 0; for (i = 0; paths[i]; i++) { char **p; p = match_files (paths[i], start, noregexop, ®exp); grub_free (paths[i]); if (! p) continue; r = merge (r, p); if (! r) goto fail; } grub_free (paths); paths = r; } regfree (®exp); if (! paths) goto done; start = regexop; } done: *strs = paths; return 0; fail: for (i = 0; paths && paths[i]; i++) grub_free (paths[i]); grub_free (paths); regfree (®exp); return grub_errno; } grub-2.14~git20250718.0e36779/grub-core/commands/keystatus.c0000644000175000017500000000541415002425525017670 00000000000000/* keystatus.c - Command to check key modifier status. */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2009 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); static const struct grub_arg_option options[] = { /* TRANSLATORS: "Check" in a sense that if this key is pressed then "true" is returned, otherwise "false". */ {"shift", 's', 0, N_("Check Shift key."), 0, 0}, {"ctrl", 'c', 0, N_("Check Control key."), 0, 0}, {"alt", 'a', 0, N_("Check Alt key."), 0, 0}, {0, 0, 0, 0, 0, 0} }; static grub_err_t grub_cmd_keystatus (grub_extcmd_context_t ctxt, int argc __attribute__ ((unused)), char **args __attribute__ ((unused))) { struct grub_arg_list *state = ctxt->state; int expect_mods = 0; int mods; if (state[0].set) expect_mods |= (GRUB_TERM_STATUS_LSHIFT | GRUB_TERM_STATUS_RSHIFT); if (state[1].set) expect_mods |= (GRUB_TERM_STATUS_LCTRL | GRUB_TERM_STATUS_RCTRL); if (state[2].set) expect_mods |= (GRUB_TERM_STATUS_LALT | GRUB_TERM_STATUS_RALT); grub_dprintf ("keystatus", "expect_mods: %d\n", expect_mods); /* Without arguments, just check whether getkeystatus is supported at all. */ if (expect_mods == 0) { grub_term_input_t term; int nterms = 0; FOR_ACTIVE_TERM_INPUTS (term) if (!term->getkeystatus) return grub_error (GRUB_ERR_TEST_FAILURE, N_("false")); else nterms++; if (!nterms) return grub_error (GRUB_ERR_TEST_FAILURE, N_("false")); return 0; } mods = grub_getkeystatus (); grub_dprintf ("keystatus", "mods: %d\n", mods); if (mods >= 0 && (mods & expect_mods) != 0) return 0; else return grub_error (GRUB_ERR_TEST_FAILURE, N_("false")); } static grub_extcmd_t cmd; GRUB_MOD_INIT(keystatus) { cmd = grub_register_extcmd ("keystatus", grub_cmd_keystatus, 0, "[--shift] [--ctrl] [--alt]", /* TRANSLATORS: there are 3 modifiers. */ N_("Check key modifier status."), options); } GRUB_MOD_FINI(keystatus) { grub_unregister_extcmd (cmd); } grub-2.14~git20250718.0e36779/grub-core/commands/blocklist.c0000644000175000017500000001021515033157230017614 00000000000000/* blocklist.c - print the block list of a file */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2006,2007 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); /* Context for grub_cmd_blocklist. */ struct blocklist_ctx { unsigned long start_sector; unsigned num_sectors; int num_entries; grub_disk_addr_t part_start; }; /* Helper for grub_cmd_blocklist. */ static void print_blocklist (grub_disk_addr_t sector, unsigned num, unsigned offset, unsigned length, struct blocklist_ctx *ctx) { if (ctx->num_entries++) grub_printf (","); grub_printf ("%llu", (unsigned long long) (sector - ctx->part_start)); if (num > 0) grub_printf ("+%u", num); if (offset != 0 || length != 0) grub_printf ("[%u-%u]", offset, offset + length); } /* Helper for grub_cmd_blocklist. */ static grub_err_t read_blocklist (grub_disk_addr_t sector, unsigned offset, unsigned length, char *buf __attribute__ ((unused)), void *data) { struct blocklist_ctx *ctx = data; if (ctx->num_sectors > 0) { if (ctx->start_sector + ctx->num_sectors == sector && offset == 0 && length >= GRUB_DISK_SECTOR_SIZE) { ctx->num_sectors += length >> GRUB_DISK_SECTOR_BITS; sector += length >> GRUB_DISK_SECTOR_BITS; length &= (GRUB_DISK_SECTOR_SIZE - 1); } if (!length) return GRUB_ERR_NONE; print_blocklist (ctx->start_sector, ctx->num_sectors, 0, 0, ctx); ctx->num_sectors = 0; } if (offset) { unsigned l = length + offset; l &= (GRUB_DISK_SECTOR_SIZE - 1); l -= offset; print_blocklist (sector, 0, offset, l, ctx); length -= l; sector++; offset = 0; } if (!length) return GRUB_ERR_NONE; if (length & (GRUB_DISK_SECTOR_SIZE - 1)) { if (length >> GRUB_DISK_SECTOR_BITS) { print_blocklist (sector, length >> GRUB_DISK_SECTOR_BITS, 0, 0, ctx); sector += length >> GRUB_DISK_SECTOR_BITS; } print_blocklist (sector, 0, 0, length & (GRUB_DISK_SECTOR_SIZE - 1), ctx); } else { ctx->start_sector = sector; ctx->num_sectors = length >> GRUB_DISK_SECTOR_BITS; } return GRUB_ERR_NONE; } static grub_err_t grub_cmd_blocklist (grub_command_t cmd __attribute__ ((unused)), int argc, char **args) { grub_file_t file; char buf[GRUB_DISK_SECTOR_SIZE]; struct blocklist_ctx ctx = { .start_sector = 0, .num_sectors = 0, .num_entries = 0, .part_start = 0 }; if (argc < 1) return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected")); file = grub_file_open (args[0], GRUB_FILE_TYPE_PRINT_BLOCKLIST | GRUB_FILE_TYPE_NO_DECOMPRESS); if (! file) return grub_errno; if (! file->device->disk) return grub_error (GRUB_ERR_BAD_DEVICE, "this command is available only for disk devices"); ctx.part_start = grub_partition_get_start (file->device->disk->partition); file->read_hook = read_blocklist; file->read_hook_data = &ctx; while (grub_file_read (file, buf, sizeof (buf)) > 0) ; if (ctx.num_sectors > 0) print_blocklist (ctx.start_sector, ctx.num_sectors, 0, 0, &ctx); grub_file_close (file); return grub_errno; } static grub_command_t cmd; GRUB_MOD_INIT(blocklist) { cmd = grub_register_command ("blocklist", grub_cmd_blocklist, N_("FILE"), N_("Print a block list.")); } GRUB_MOD_FINI(blocklist) { grub_unregister_command (cmd); } grub-2.14~git20250718.0e36779/grub-core/commands/terminal.c0000644000175000017500000002276515033157230017456 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (C) 2009,2010 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); struct grub_term_autoload *grub_term_input_autoload = NULL; struct grub_term_autoload *grub_term_output_autoload = NULL; struct abstract_terminal { struct abstract_terminal *next; struct abstract_terminal *prev; const char *name; grub_err_t (*init) (struct abstract_terminal *term); grub_err_t (*fini) (struct abstract_terminal *term); }; static grub_err_t handle_command (int argc, char **args, struct abstract_terminal **enabled, struct abstract_terminal **disabled, struct grub_term_autoload *autoloads, const char *active_str, const char *available_str) { int i; struct abstract_terminal *term; struct grub_term_autoload *aut; if (argc == 0) { grub_puts_ (active_str); for (term = *enabled; term; term = term->next) grub_printf ("%s ", term->name); grub_printf ("\n"); grub_puts_ (available_str); for (term = *disabled; term; term = term->next) grub_printf ("%s ", term->name); /* This is quadratic but we don't expect mode than 30 terminal modules ever. */ for (aut = autoloads; aut; aut = aut->next) { for (term = *disabled; term; term = term->next) if (grub_strcmp (term->name, aut->name) == 0 || (aut->name[0] && aut->name[grub_strlen (aut->name) - 1] == '*' && grub_memcmp (term->name, aut->name, grub_strlen (aut->name) - 1) == 0)) break; if (!term) for (term = *enabled; term; term = term->next) if (grub_strcmp (term->name, aut->name) == 0 || (aut->name[0] && aut->name[grub_strlen (aut->name) - 1] == '*' && grub_memcmp (term->name, aut->name, grub_strlen (aut->name) - 1) == 0)) break; if (!term) grub_printf ("%s ", aut->name); } grub_printf ("\n"); return GRUB_ERR_NONE; } i = 0; if (grub_strcmp (args[0], "--append") == 0 || grub_strcmp (args[0], "--remove") == 0) i++; if (i == argc) return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("no terminal specified")); for (; i < argc; i++) { int again = 0; while (1) { for (term = *disabled; term; term = term->next) if (grub_strcmp (args[i], term->name) == 0 || (grub_strcmp (args[i], "ofconsole") == 0 && grub_strcmp ("console", term->name) == 0)) break; if (term == 0) for (term = *enabled; term; term = term->next) if (grub_strcmp (args[i], term->name) == 0 || (grub_strcmp (args[i], "ofconsole") == 0 && grub_strcmp ("console", term->name) == 0)) break; if (term) break; if (again) return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("terminal `%s' isn't found"), args[i]); for (aut = autoloads; aut; aut = aut->next) if (grub_strcmp (args[i], aut->name) == 0 || (grub_strcmp (args[i], "ofconsole") == 0 && grub_strcmp ("console", aut->name) == 0) || (aut->name[0] && aut->name[grub_strlen (aut->name) - 1] == '*' && grub_memcmp (args[i], aut->name, grub_strlen (aut->name) - 1) == 0)) { grub_dl_t mod; mod = grub_dl_load (aut->modname); if (mod) grub_dl_ref (mod); grub_errno = GRUB_ERR_NONE; break; } if (grub_memcmp (args[i], "serial_usb", sizeof ("serial_usb") - 1) == 0 && grub_term_poll_usb) { grub_term_poll_usb (1); again = 1; continue; } if (!aut) return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("terminal `%s' isn't found"), args[i]); again = 1; } } if (grub_strcmp (args[0], "--append") == 0) { for (i = 1; i < argc; i++) { for (term = *disabled; term; term = term->next) if (grub_strcmp (args[i], term->name) == 0 || (grub_strcmp (args[i], "ofconsole") == 0 && grub_strcmp ("console", term->name) == 0)) break; if (term) { if (term->init && term->init (term) != GRUB_ERR_NONE) return grub_errno; grub_list_remove (GRUB_AS_LIST (term)); grub_list_push (GRUB_AS_LIST_P (enabled), GRUB_AS_LIST (term)); } } return GRUB_ERR_NONE; } if (grub_strcmp (args[0], "--remove") == 0) { for (i = 1; i < argc; i++) { for (term = *enabled; term; term = term->next) if (grub_strcmp (args[i], term->name) == 0 || (grub_strcmp (args[i], "ofconsole") == 0 && grub_strcmp ("console", term->name) == 0)) break; if (term) { if (!term->next && term == *enabled) return grub_error (GRUB_ERR_BAD_ARGUMENT, "can't remove the last terminal"); grub_list_remove (GRUB_AS_LIST (term)); if (term->fini) term->fini (term); grub_list_push (GRUB_AS_LIST_P (disabled), GRUB_AS_LIST (term)); } } return GRUB_ERR_NONE; } for (i = 0; i < argc; i++) { for (term = *disabled; term; term = term->next) if (grub_strcmp (args[i], term->name) == 0 || (grub_strcmp (args[i], "ofconsole") == 0 && grub_strcmp ("console", term->name) == 0)) break; if (term) { if (term->init && term->init (term) != GRUB_ERR_NONE) return grub_errno; grub_list_remove (GRUB_AS_LIST (term)); grub_list_push (GRUB_AS_LIST_P (enabled), GRUB_AS_LIST (term)); } } { struct abstract_terminal *next; for (term = *enabled; term; term = next) { next = term->next; for (i = 0; i < argc; i++) if (grub_strcmp (args[i], term->name) == 0 || (grub_strcmp (args[i], "ofconsole") == 0 && grub_strcmp ("console", term->name) == 0)) break; if (i == argc) { if (!term->next && term == *enabled) return grub_error (GRUB_ERR_BAD_ARGUMENT, "can't remove the last terminal"); grub_list_remove (GRUB_AS_LIST (term)); if (term->fini) term->fini (term); grub_list_push (GRUB_AS_LIST_P (disabled), GRUB_AS_LIST (term)); } } } return GRUB_ERR_NONE; } static grub_err_t grub_cmd_terminal_input (grub_command_t cmd __attribute__ ((unused)), int argc, char **args) { (void) GRUB_FIELD_MATCH (grub_term_inputs, struct abstract_terminal *, next); (void) GRUB_FIELD_MATCH (grub_term_inputs, struct abstract_terminal *, prev); (void) GRUB_FIELD_MATCH (grub_term_inputs, struct abstract_terminal *, name); (void) GRUB_FIELD_MATCH (grub_term_inputs, struct abstract_terminal *, init); (void) GRUB_FIELD_MATCH (grub_term_inputs, struct abstract_terminal *, fini); return handle_command (argc, args, (struct abstract_terminal **) (void *) &grub_term_inputs, (struct abstract_terminal **) (void *) &grub_term_inputs_disabled, grub_term_input_autoload, N_("Active input terminals:"), N_("Available input terminals:")); } static grub_err_t grub_cmd_terminal_output (grub_command_t cmd __attribute__ ((unused)), int argc, char **args) { (void) GRUB_FIELD_MATCH (grub_term_outputs, struct abstract_terminal *, next); (void) GRUB_FIELD_MATCH (grub_term_outputs, struct abstract_terminal *, prev); (void) GRUB_FIELD_MATCH (grub_term_outputs, struct abstract_terminal *, name); (void) GRUB_FIELD_MATCH (grub_term_outputs, struct abstract_terminal *, init); (void) GRUB_FIELD_MATCH (grub_term_outputs, struct abstract_terminal *, fini); return handle_command (argc, args, (struct abstract_terminal **) (void *) &grub_term_outputs, (struct abstract_terminal **) (void *) &grub_term_outputs_disabled, grub_term_output_autoload, N_("Active output terminals:"), N_("Available output terminals:")); } static grub_command_t cmd_terminal_input, cmd_terminal_output; GRUB_MOD_INIT(terminal) { cmd_terminal_input = grub_register_command ("terminal_input", grub_cmd_terminal_input, N_("[--append|--remove] " "[TERMINAL1] [TERMINAL2] ..."), N_("List or select an input terminal.")); cmd_terminal_output = grub_register_command ("terminal_output", grub_cmd_terminal_output, N_("[--append|--remove] " "[TERMINAL1] [TERMINAL2] ..."), N_("List or select an output terminal.")); } GRUB_MOD_FINI(terminal) { grub_unregister_command (cmd_terminal_input); grub_unregister_command (cmd_terminal_output); } grub-2.14~git20250718.0e36779/grub-core/commands/xnu_uuid.c0000644000175000017500000000704415036447510017502 00000000000000/* xnu_uuid.c - transform 64-bit serial number to 128-bit uuid suitable for xnu. */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 1995,1996,1998,1999,2001,2002, * 2003, 2009 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); /* This prefix is used by xnu and boot-132 to hash together with volume serial. */ static grub_uint8_t hash_prefix[16] = {0xB3, 0xE2, 0x0F, 0x39, 0xF2, 0x92, 0x11, 0xD6, 0x97, 0xA4, 0x00, 0x30, 0x65, 0x43, 0xEC, 0xAC}; static grub_err_t grub_cmd_xnu_uuid (grub_command_t cmd __attribute__ ((unused)), int argc, char **args) { grub_uint64_t serial; grub_uint8_t *xnu_uuid; char uuid_string[sizeof ("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx")]; char *ptr; void *ctx; int low = 0; if (argc < 1) return grub_error (GRUB_ERR_BAD_ARGUMENT, "UUID required"); if (argc > 1 && grub_strcmp (args[0], "-l") == 0) { low = 1; argc--; args++; } serial = grub_cpu_to_be64 (grub_strtoull (args[0], 0, 16)); ctx = grub_zalloc (GRUB_MD_MD5->contextsize); if (!ctx) return grub_errno; GRUB_MD_MD5->init (ctx, 0); GRUB_MD_MD5->write (ctx, hash_prefix, sizeof (hash_prefix)); GRUB_MD_MD5->write (ctx, &serial, sizeof (serial)); GRUB_MD_MD5->final (ctx); xnu_uuid = GRUB_MD_MD5->read (ctx); grub_snprintf (uuid_string, sizeof (uuid_string), "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x", (unsigned int) xnu_uuid[0], (unsigned int) xnu_uuid[1], (unsigned int) xnu_uuid[2], (unsigned int) xnu_uuid[3], (unsigned int) xnu_uuid[4], (unsigned int) xnu_uuid[5], (unsigned int) ((xnu_uuid[6] & 0xf) | 0x30), (unsigned int) xnu_uuid[7], (unsigned int) ((xnu_uuid[8] & 0x3f) | 0x80), (unsigned int) xnu_uuid[9], (unsigned int) xnu_uuid[10], (unsigned int) xnu_uuid[11], (unsigned int) xnu_uuid[12], (unsigned int) xnu_uuid[13], (unsigned int) xnu_uuid[14], (unsigned int) xnu_uuid[15]); if (!low) for (ptr = uuid_string; *ptr; ptr++) *ptr = grub_toupper (*ptr); if (argc == 1) grub_printf ("%s\n", uuid_string); if (argc > 1) grub_env_set (args[1], uuid_string); grub_free (ctx); return GRUB_ERR_NONE; } static grub_command_t cmd; GRUB_MOD_INIT (xnu_uuid) { cmd = grub_register_command ("xnu_uuid", grub_cmd_xnu_uuid, /* TRANSLATORS: GRUBUUID stands for "filesystem UUID as used in GRUB". */ N_("[-l] GRUBUUID [VARNAME]"), N_("Transform 64-bit UUID to format " "suitable for XNU. If -l is given keep " "it lowercase as done by blkid.")); } GRUB_MOD_FINI (xnu_uuid) { grub_unregister_command (cmd); } grub-2.14~git20250718.0e36779/grub-core/commands/ieee1275/0000755000175000017500000000000015036452576017007 500000000000000grub-2.14~git20250718.0e36779/grub-core/commands/ieee1275/suspend.c0000644000175000017500000000274215000202015020525 00000000000000/* suspend.c - command to suspend GRUB and return to Open Firmware */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2005,2007 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); static grub_err_t grub_cmd_suspend (grub_command_t cmd __attribute__ ((unused)), int argc __attribute__ ((unused)), char **args __attribute__ ((unused))) { grub_puts_ (N_("Run `go' to resume GRUB.")); grub_ieee1275_enter (); grub_cls (); return 0; } static grub_command_t cmd; GRUB_MOD_INIT(ieee1275_suspend) { cmd = grub_register_command ("suspend", grub_cmd_suspend, 0, N_("Return to IEEE1275 prompt.")); } GRUB_MOD_FINI(ieee1275_suspend) { grub_unregister_command (cmd); } grub-2.14~git20250718.0e36779/grub-core/commands/ieee1275/ibmvtpm.c0000644000175000017500000000650515036447510020547 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (C) 2022 Free Software Foundation, Inc. * Copyright (C) 2022 IBM Corporation * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . * * IBM vTPM support code. */ #include #include #include #include #include #include #include static int ibmvtpm_2hash_ext_log (grub_uint8_t pcrindex, grub_uint32_t eventtype, const char *description, grub_size_t description_size, void *buf, grub_size_t size) { struct tpm_2hash_ext_log { struct grub_ieee1275_common_hdr common; grub_ieee1275_cell_t method; grub_ieee1275_cell_t ihandle; grub_ieee1275_cell_t size; grub_ieee1275_cell_t buf; grub_ieee1275_cell_t description_size; grub_ieee1275_cell_t description; grub_ieee1275_cell_t eventtype; grub_ieee1275_cell_t pcrindex; grub_ieee1275_cell_t catch_result; grub_ieee1275_cell_t rc; }; struct tpm_2hash_ext_log args; INIT_IEEE1275_COMMON (&args.common, "call-method", 8, 2); args.method = (grub_ieee1275_cell_t) "2hash-ext-log"; args.ihandle = grub_ieee1275_tpm_ihandle; args.pcrindex = pcrindex; args.eventtype = eventtype; args.description = (grub_ieee1275_cell_t) description; args.description_size = description_size; args.buf = (grub_ieee1275_cell_t) buf; args.size = (grub_ieee1275_cell_t) size; if (IEEE1275_CALL_ENTRY_FN (&args) == -1) return -1; /* * catch_result is set if firmware does not support 2hash-ext-log * rc is GRUB_IEEE1275_CELL_FALSE (0) on failure */ if ((args.catch_result) || args.rc == GRUB_IEEE1275_CELL_FALSE) return -1; return 0; } static grub_err_t tpm2_log_event (unsigned char *buf, grub_size_t size, grub_uint8_t pcr, const char *description) { static int error_displayed = 0; int rc; rc = ibmvtpm_2hash_ext_log (pcr, EV_IPL, description, grub_strlen(description) + 1, buf, size); if (rc && !error_displayed) { error_displayed++; return grub_error (GRUB_ERR_BAD_DEVICE, "2HASH-EXT-LOG failed: Firmware is likely too old.\n"); } return GRUB_ERR_NONE; } grub_err_t grub_tpm_measure (unsigned char *buf, grub_size_t size, grub_uint8_t pcr, const char *description) { grub_dprintf ("tpm", "log_event, pcr = %d, size = 0x%" PRIxGRUB_SIZE ", %s\n", pcr, size, description); if (grub_ieee1275_tpm_ihandle != GRUB_IEEE1275_IHANDLE_INVALID) return tpm2_log_event (buf, size, pcr, description); return GRUB_ERR_NONE; } int grub_tpm_present (void) { /* * Call tpm_init() "late" rather than from GRUB_MOD_INIT() so that device nodes * can be found. */ return grub_ieee1275_tpm_init() == GRUB_ERR_NONE; } grub-2.14~git20250718.0e36779/grub-core/commands/testload.c0000644000175000017500000001004515033157230017446 00000000000000/* testload.c - load the same file in multiple ways */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2003,2005,2006,2007,2009,2010 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); /* Helper for grub_cmd_testload. */ static grub_err_t read_progress (grub_disk_addr_t sector __attribute__ ((unused)), unsigned offset __attribute__ ((unused)), unsigned len, char *buf __attribute__ ((unused)), void *data __attribute__ ((unused))) { for (; len >= GRUB_DISK_SECTOR_SIZE; len -= GRUB_DISK_SECTOR_SIZE) grub_xputs ("."); if (len) grub_xputs ("."); grub_refresh (); return GRUB_ERR_NONE; } static grub_err_t grub_cmd_testload (struct grub_command *cmd __attribute__ ((unused)), int argc, char *argv[]) { grub_file_t file; char *buf; grub_size_t size; grub_off_t pos; if (argc < 1) return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected")); file = grub_file_open (argv[0], GRUB_FILE_TYPE_TESTLOAD); if (! file) return grub_errno; size = grub_file_size (file) & ~(GRUB_DISK_SECTOR_SIZE - 1); if (size == 0) { grub_file_close (file); return GRUB_ERR_NONE; } buf = grub_malloc (size); if (! buf) goto fail; grub_printf ("Reading %s sequentially", argv[0]); file->read_hook = read_progress; if (grub_file_read (file, buf, size) != (grub_ssize_t) size) goto fail; grub_printf (" Done.\n"); /* Read sequentially again. */ grub_printf ("Reading %s sequentially again", argv[0]); grub_file_seek (file, 0); for (pos = 0; pos < size;) { char sector[GRUB_DISK_SECTOR_SIZE]; grub_size_t curlen = GRUB_DISK_SECTOR_SIZE; if (curlen > size - pos) curlen = size - pos; if (grub_file_read (file, sector, curlen) != (grub_ssize_t) curlen) goto fail; if (grub_memcmp (sector, buf + pos, curlen) != 0) { grub_printf ("\nDiffers in %lld\n", (unsigned long long) pos); goto fail; } pos += curlen; } grub_printf (" Done.\n"); /* Read backwards and compare. */ grub_printf ("Reading %s backwards", argv[0]); pos = size; while (pos > 0) { char sector[GRUB_DISK_SECTOR_SIZE]; if (pos >= GRUB_DISK_SECTOR_SIZE) pos -= GRUB_DISK_SECTOR_SIZE; else pos = 0; grub_file_seek (file, pos); if (grub_file_read (file, sector, GRUB_DISK_SECTOR_SIZE) != GRUB_DISK_SECTOR_SIZE) goto fail; if (grub_memcmp (sector, buf + pos, GRUB_DISK_SECTOR_SIZE) != 0) { int i; grub_printf ("\nDiffers in %lld\n", (unsigned long long) pos); for (i = 0; i < GRUB_DISK_SECTOR_SIZE; i++) { grub_printf ("%02x ", buf[pos + i]); if ((i & 15) == 15) grub_printf ("\n"); } if (i) grub_refresh (); goto fail; } } grub_printf (" Done.\n"); return GRUB_ERR_NONE; fail: grub_file_close (file); grub_free (buf); if (!grub_errno) grub_error (GRUB_ERR_IO, "bad read"); return grub_errno; } static grub_command_t cmd; GRUB_MOD_INIT(testload) { cmd = grub_register_command ("testload", grub_cmd_testload, N_("FILE"), N_("Load the same file in multiple ways.")); } GRUB_MOD_FINI(testload) { grub_unregister_command (cmd); } grub-2.14~git20250718.0e36779/grub-core/commands/loadenv.c0000644000175000017500000002651315033157230017266 00000000000000/* loadenv.c - command to load/save environment variable. */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2008,2009,2010 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); static const struct grub_arg_option options[] = { /* TRANSLATORS: This option is used to override default filename for loading and storing environment. */ {"file", 'f', 0, N_("Specify filename."), 0, ARG_TYPE_PATHNAME}, {"skip-sig", 's', 0, N_("Skip signature-checking of the environment file."), 0, ARG_TYPE_NONE}, {0, 0, 0, 0, 0, 0} }; /* Opens 'filename' with compression filters disabled. Optionally disables the PUBKEY filter (that insists upon properly signed files) as well. PUBKEY filter is restored before the function returns. */ static grub_file_t open_envblk_file (char *filename, enum grub_file_type type) { grub_file_t file; char *buf = 0; if (! filename) { const char *prefix; int len; prefix = grub_env_get ("prefix"); if (! prefix) { grub_error (GRUB_ERR_FILE_NOT_FOUND, N_("variable `%s' isn't set"), "prefix"); return 0; } len = grub_strlen (prefix); buf = grub_malloc (len + 1 + sizeof (GRUB_ENVBLK_DEFCFG)); if (! buf) return 0; filename = buf; grub_strcpy (filename, prefix); filename[len] = '/'; grub_strcpy (filename + len + 1, GRUB_ENVBLK_DEFCFG); } file = grub_file_open (filename, type); grub_free (buf); return file; } static grub_envblk_t read_envblk_file (grub_file_t file) { grub_off_t offset = 0; char *buf; grub_size_t size = grub_file_size (file); grub_envblk_t envblk; buf = grub_malloc (size); if (! buf) return 0; while (size > 0) { grub_ssize_t ret; ret = grub_file_read (file, buf + offset, size); if (ret <= 0) { grub_free (buf); return 0; } size -= ret; offset += ret; } envblk = grub_envblk_open (buf, offset); if (! envblk) { grub_free (buf); grub_error (GRUB_ERR_BAD_FILE_TYPE, "invalid environment block"); return 0; } return envblk; } struct grub_env_whitelist { grub_size_t len; char **list; }; typedef struct grub_env_whitelist grub_env_whitelist_t; static int test_whitelist_membership (const char* name, const grub_env_whitelist_t* whitelist) { grub_size_t i; for (i = 0; i < whitelist->len; i++) if (grub_strcmp (name, whitelist->list[i]) == 0) return 1; /* found it */ return 0; /* not found */ } /* Helper for grub_cmd_load_env. */ static int set_var (const char *name, const char *value, void *whitelist) { if (! whitelist) { grub_env_set (name, value); return 0; } if (test_whitelist_membership (name, (const grub_env_whitelist_t *) whitelist)) grub_env_set (name, value); return 0; } static grub_err_t grub_cmd_load_env (grub_extcmd_context_t ctxt, int argc, char **args) { struct grub_arg_list *state = ctxt->state; grub_file_t file; grub_envblk_t envblk; grub_env_whitelist_t whitelist; whitelist.len = argc; whitelist.list = args; /* state[0] is the -f flag; state[1] is the --skip-sig flag */ file = open_envblk_file ((state[0].set) ? state[0].arg : 0, GRUB_FILE_TYPE_LOADENV | (state[1].set ? GRUB_FILE_TYPE_SKIP_SIGNATURE : GRUB_FILE_TYPE_NONE)); if (! file) return grub_errno; envblk = read_envblk_file (file); if (! envblk) goto fail; /* argc > 0 indicates caller provided a whitelist of variables to read. */ grub_envblk_iterate (envblk, argc > 0 ? &whitelist : 0, set_var); grub_envblk_close (envblk); fail: grub_file_close (file); return grub_errno; } /* Print all variables in current context. */ static int print_var (const char *name, const char *value, void *hook_data __attribute__ ((unused))) { grub_printf ("%s=%s\n", name, value); return 0; } static grub_err_t grub_cmd_list_env (grub_extcmd_context_t ctxt, int argc __attribute__ ((unused)), char **args __attribute__ ((unused))) { struct grub_arg_list *state = ctxt->state; grub_file_t file; grub_envblk_t envblk; file = open_envblk_file ((state[0].set) ? state[0].arg : 0, GRUB_FILE_TYPE_LOADENV | (state[1].set ? GRUB_FILE_TYPE_SKIP_SIGNATURE : GRUB_FILE_TYPE_NONE)); if (! file) return grub_errno; envblk = read_envblk_file (file); if (! envblk) goto fail; grub_envblk_iterate (envblk, NULL, print_var); grub_envblk_close (envblk); fail: grub_file_close (file); return grub_errno; } /* Used to maintain a variable length of blocklists internally. */ struct blocklist { grub_disk_addr_t sector; unsigned offset; unsigned length; struct blocklist *next; }; static void free_blocklists (struct blocklist *p) { struct blocklist *q; for (; p; p = q) { q = p->next; grub_free (p); } } static grub_err_t check_blocklists (grub_envblk_t envblk, struct blocklist *blocklists, grub_file_t file) { grub_size_t total_length; grub_size_t index; grub_disk_t disk; grub_disk_addr_t part_start; struct blocklist *p; char *buf; /* Sanity checks. */ total_length = 0; for (p = blocklists; p; p = p->next) { struct blocklist *q; /* Check if any pair of blocks overlap. */ for (q = p->next; q; q = q->next) { grub_disk_addr_t s1, s2; grub_disk_addr_t e1, e2; s1 = p->sector; e1 = s1 + ((p->length + GRUB_DISK_SECTOR_SIZE - 1) >> GRUB_DISK_SECTOR_BITS); s2 = q->sector; e2 = s2 + ((q->length + GRUB_DISK_SECTOR_SIZE - 1) >> GRUB_DISK_SECTOR_BITS); if (s1 < e2 && s2 < e1) { /* This might be actually valid, but it is unbelievable that any filesystem makes such a silly allocation. */ return grub_error (GRUB_ERR_BAD_FS, "malformed file"); } } total_length += p->length; } if (total_length != grub_file_size (file)) { /* Maybe sparse, unallocated sectors. No way in GRUB. */ return grub_error (GRUB_ERR_BAD_FILE_TYPE, "sparse file not allowed"); } /* One more sanity check. Re-read all sectors by blocklists, and compare those with the data read via a file. */ disk = file->device->disk; part_start = grub_partition_get_start (disk->partition); buf = grub_envblk_buffer (envblk); char *blockbuf = NULL; grub_size_t blockbuf_len = 0; for (p = blocklists, index = 0; p; index += p->length, p = p->next) { if (p->length > blockbuf_len) { grub_free (blockbuf); blockbuf_len = 2 * p->length; blockbuf = grub_malloc (blockbuf_len); if (!blockbuf) return grub_errno; } if (grub_disk_read (disk, p->sector - part_start, p->offset, p->length, blockbuf)) return grub_errno; if (grub_memcmp (buf + index, blockbuf, p->length) != 0) return grub_error (GRUB_ERR_FILE_READ_ERROR, "invalid blocklist"); } return GRUB_ERR_NONE; } static int write_blocklists (grub_envblk_t envblk, struct blocklist *blocklists, grub_file_t file) { char *buf; grub_disk_t disk; grub_disk_addr_t part_start; struct blocklist *p; grub_size_t index; buf = grub_envblk_buffer (envblk); disk = file->device->disk; part_start = grub_partition_get_start (disk->partition); index = 0; for (p = blocklists; p; index += p->length, p = p->next) { if (grub_disk_write (disk, p->sector - part_start, p->offset, p->length, buf + index)) return 0; } return 1; } /* Context for grub_cmd_save_env. */ struct grub_cmd_save_env_ctx { struct blocklist *head, *tail; }; /* Store blocklists in a linked list. */ static grub_err_t save_env_read_hook (grub_disk_addr_t sector, unsigned offset, unsigned length, char *buf __attribute__ ((unused)), void *data) { struct grub_cmd_save_env_ctx *ctx = data; struct blocklist *block; block = grub_malloc (sizeof (*block)); if (! block) return GRUB_ERR_NONE; block->sector = sector; block->offset = offset; block->length = length; /* Slightly complicated, because the list should be FIFO. */ block->next = 0; if (ctx->tail) ctx->tail->next = block; ctx->tail = block; if (! ctx->head) ctx->head = block; return GRUB_ERR_NONE; } static grub_err_t grub_cmd_save_env (grub_extcmd_context_t ctxt, int argc, char **args) { struct grub_arg_list *state = ctxt->state; grub_file_t file; grub_envblk_t envblk; struct grub_cmd_save_env_ctx ctx = { .head = 0, .tail = 0 }; if (! argc) return grub_error (GRUB_ERR_BAD_ARGUMENT, "no variable is specified"); file = open_envblk_file ((state[0].set) ? state[0].arg : 0, GRUB_FILE_TYPE_SAVEENV | GRUB_FILE_TYPE_SKIP_SIGNATURE); if (! file) return grub_errno; if (! file->device->disk) { grub_file_close (file); return grub_error (GRUB_ERR_BAD_DEVICE, "disk device required"); } file->read_hook = save_env_read_hook; file->read_hook_data = &ctx; envblk = read_envblk_file (file); file->read_hook = 0; if (! envblk) goto fail; if (check_blocklists (envblk, ctx.head, file)) goto fail; while (argc) { const char *value; value = grub_env_get (args[0]); if (value) { if (! grub_envblk_set (envblk, args[0], value)) { grub_error (GRUB_ERR_BAD_ARGUMENT, "environment block too small"); goto fail; } } else grub_envblk_delete (envblk, args[0]); argc--; args++; } write_blocklists (envblk, ctx.head, file); fail: if (envblk) grub_envblk_close (envblk); free_blocklists (ctx.head); grub_file_close (file); return grub_errno; } static grub_extcmd_t cmd_load, cmd_list, cmd_save; GRUB_MOD_INIT(loadenv) { cmd_load = grub_register_extcmd ("load_env", grub_cmd_load_env, 0, N_("[-f FILE] [-s|--skip-sig] [variable_name_to_whitelist] [...]"), N_("Load variables from environment block file."), options); cmd_list = grub_register_extcmd ("list_env", grub_cmd_list_env, 0, N_("[-f FILE]"), N_("List variables from environment block file."), options); cmd_save = grub_register_extcmd ("save_env", grub_cmd_save_env, 0, N_("[-f FILE] variable_name [...]"), N_("Save variables to environment block file."), options); } GRUB_MOD_FINI(loadenv) { grub_unregister_extcmd (cmd_load); grub_unregister_extcmd (cmd_list); grub_unregister_extcmd (cmd_save); } grub-2.14~git20250718.0e36779/grub-core/commands/iorw.c0000644000175000017500000001040615002425525016611 00000000000000/* memrw.c - command to read / write physical memory */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2009 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); static grub_extcmd_t cmd_read_byte, cmd_read_word, cmd_read_dword; static grub_command_t cmd_write_byte, cmd_write_word, cmd_write_dword; static const struct grub_arg_option options[] = { {0, 'v', 0, N_("Save read value into variable VARNAME."), N_("VARNAME"), ARG_TYPE_STRING}, {0, 0, 0, 0, 0, 0} }; static grub_err_t grub_cmd_read (grub_extcmd_context_t ctxt, int argc, char **argv) { grub_port_t addr; grub_uint32_t value = 0; if (argc != 1) return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("one argument expected")); addr = grub_strtoul (argv[0], 0, 0); switch (ctxt->extcmd->cmd->name[sizeof ("in") - 1]) { case 'l': value = grub_inl (addr); break; case 'w': value = grub_inw (addr); break; case 'b': value = grub_inb (addr); break; } if (ctxt->state[0].set) { char buf[sizeof ("XXXXXXXX")]; grub_snprintf (buf, sizeof (buf), "%x", value); grub_env_set (ctxt->state[0].arg, buf); } else grub_printf ("0x%x\n", value); return 0; } static grub_err_t grub_cmd_write (grub_command_t cmd, int argc, char **argv) { grub_port_t addr; grub_uint32_t value; grub_uint32_t mask = 0xffffffff; if (argc != 2 && argc != 3) return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("two arguments expected")); addr = grub_strtoul (argv[0], 0, 0); value = grub_strtoul (argv[1], 0, 0); if (argc == 3) mask = grub_strtoul (argv[2], 0, 0); value &= mask; switch (cmd->name[sizeof ("out") - 1]) { case 'l': if (mask != 0xffffffff) grub_outl ((grub_inl (addr) & ~mask) | value, addr); else grub_outl (value, addr); break; case 'w': if ((mask & 0xffff) != 0xffff) grub_outw ((grub_inw (addr) & ~mask) | value, addr); else grub_outw (value, addr); break; case 'b': if ((mask & 0xff) != 0xff) grub_outb ((grub_inb (addr) & ~mask) | value, addr); else grub_outb (value, addr); break; } return 0; } GRUB_MOD_INIT(memrw) { cmd_read_byte = grub_register_extcmd ("inb", grub_cmd_read, 0, N_("PORT"), N_("Read 8-bit value from PORT."), options); cmd_read_word = grub_register_extcmd ("inw", grub_cmd_read, 0, N_("PORT"), N_("Read 16-bit value from PORT."), options); cmd_read_dword = grub_register_extcmd ("inl", grub_cmd_read, 0, N_("PORT"), N_("Read 32-bit value from PORT."), options); cmd_write_byte = grub_register_command_lockdown ("outb", grub_cmd_write, N_("PORT VALUE [MASK]"), N_("Write 8-bit VALUE to PORT.")); cmd_write_word = grub_register_command_lockdown ("outw", grub_cmd_write, N_("PORT VALUE [MASK]"), N_("Write 16-bit VALUE to PORT.")); cmd_write_dword = grub_register_command_lockdown ("outl", grub_cmd_write, N_("ADDR VALUE [MASK]"), N_("Write 32-bit VALUE to PORT.")); } GRUB_MOD_FINI(memrw) { grub_unregister_extcmd (cmd_read_byte); grub_unregister_extcmd (cmd_read_word); grub_unregister_extcmd (cmd_read_dword); grub_unregister_command (cmd_write_byte); grub_unregister_command (cmd_write_word); grub_unregister_command (cmd_write_dword); } grub-2.14~git20250718.0e36779/grub-core/commands/extcmd.c0000644000175000017500000000752515036447510017132 00000000000000/* extcmd.c - support extended command */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2009 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); grub_err_t grub_extcmd_dispatcher (struct grub_command *cmd, int argc, char **args, struct grub_script *script) { int new_argc; char **new_args; struct grub_arg_list *state; struct grub_extcmd_context context; grub_err_t ret; grub_extcmd_t ext = cmd->data; context.state = 0; context.extcmd = ext; context.script = script; if (! ext->options) { ret = (ext->func) (&context, argc, args); return ret; } state = grub_arg_list_alloc (ext, argc, args); if (state == NULL) return grub_errno; if (grub_arg_parse (ext, argc, args, state, &new_args, &new_argc)) { context.state = state; ret = (ext->func) (&context, new_argc, new_args); grub_free (new_args); grub_free (state); return ret; } grub_free (state); return grub_errno; } static grub_err_t grub_extcmd_dispatch (struct grub_command *cmd, int argc, char **args) { return grub_extcmd_dispatcher (cmd, argc, args, 0); } grub_extcmd_t grub_register_extcmd_prio (const char *name, grub_extcmd_func_t func, grub_command_flags_t flags, const char *summary, const char *description, const struct grub_arg_option *parser, int prio) { grub_extcmd_t ext; grub_command_t cmd; ext = (grub_extcmd_t) grub_malloc (sizeof (*ext)); if (! ext) return 0; cmd = grub_register_command_prio (name, grub_extcmd_dispatch, summary, description, prio); if (! cmd) { grub_free (ext); return 0; } cmd->flags = (flags | GRUB_COMMAND_FLAG_EXTCMD); cmd->data = ext; ext->cmd = cmd; ext->func = func; ext->options = parser; ext->data = 0; return ext; } grub_extcmd_t grub_register_extcmd (const char *name, grub_extcmd_func_t func, grub_command_flags_t flags, const char *summary, const char *description, const struct grub_arg_option *parser) { return grub_register_extcmd_prio (name, func, flags, summary, description, parser, 1); } static grub_err_t grub_extcmd_lockdown (grub_extcmd_context_t ctxt __attribute__ ((unused)), int argc __attribute__ ((unused)), char **argv __attribute__ ((unused))) { return grub_error (GRUB_ERR_ACCESS_DENIED, N_("%s: the command is not allowed when lockdown is enforced"), ctxt->extcmd->cmd->name); } grub_extcmd_t grub_register_extcmd_lockdown (const char *name, grub_extcmd_func_t func, grub_command_flags_t flags, const char *summary, const char *description, const struct grub_arg_option *parser) { if (grub_is_lockdown () == GRUB_LOCKDOWN_ENABLED) func = grub_extcmd_lockdown; return grub_register_extcmd (name, func, flags, summary, description, parser); } void grub_unregister_extcmd (grub_extcmd_t ext) { grub_unregister_command (ext->cmd); grub_free (ext); } grub-2.14~git20250718.0e36779/grub-core/commands/configfile.c0000644000175000017500000000552015000202015017720 00000000000000/* configfile.c - command to manually load config file */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2005,2006,2007,2009 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); static grub_err_t grub_cmd_source (grub_command_t cmd, int argc, char **args) { int new_env, extractor; if (argc != 1) return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected")); extractor = (cmd->name[0] == 'e'); new_env = (cmd->name[extractor ? sizeof ("extract_entries_") - 1 : 0] == 'c'); if (new_env) grub_cls (); if (new_env && !extractor) grub_env_context_open (); if (extractor) grub_env_extractor_open (!new_env); grub_normal_execute (args[0], 1, ! new_env); if (new_env && !extractor) grub_env_context_close (); if (extractor) grub_env_extractor_close (!new_env); return 0; } static grub_command_t cmd_configfile, cmd_source, cmd_dot; static grub_command_t cmd_extractor_source, cmd_extractor_configfile; GRUB_MOD_INIT(configfile) { cmd_configfile = grub_register_command ("configfile", grub_cmd_source, N_("FILE"), N_("Load another config file.")); cmd_source = grub_register_command ("source", grub_cmd_source, N_("FILE"), N_("Load another config file without changing context.") ); cmd_extractor_source = grub_register_command ("extract_entries_source", grub_cmd_source, N_("FILE"), N_("Load another config file without changing context but take only menu entries.") ); cmd_extractor_configfile = grub_register_command ("extract_entries_configfile", grub_cmd_source, N_("FILE"), N_("Load another config file but take only menu entries.") ); cmd_dot = grub_register_command (".", grub_cmd_source, N_("FILE"), N_("Load another config file without changing context.") ); } GRUB_MOD_FINI(configfile) { grub_unregister_command (cmd_configfile); grub_unregister_command (cmd_source); grub_unregister_command (cmd_extractor_configfile); grub_unregister_command (cmd_extractor_source); grub_unregister_command (cmd_dot); } grub-2.14~git20250718.0e36779/grub-core/commands/smbios.c0000644000175000017500000003174615002425525017137 00000000000000/* smbios.c - retrieve smbios information. */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2019 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); /* Abstract useful values found in either the SMBIOS3 or SMBIOS EPS. */ static struct { grub_addr_t start; grub_addr_t end; grub_uint16_t structures; } table_desc; static grub_extcmd_t cmd; /* Locate the SMBIOS entry point structure depending on the hardware. */ struct grub_smbios_eps * grub_smbios_get_eps (void) { static struct grub_smbios_eps *eps = NULL; if (eps != NULL) return eps; eps = grub_machine_smbios_get_eps (); return eps; } /* Locate the SMBIOS3 entry point structure depending on the hardware. */ static struct grub_smbios_eps3 * grub_smbios_get_eps3 (void) { static struct grub_smbios_eps3 *eps = NULL; if (eps != NULL) return eps; eps = grub_machine_smbios_get_eps3 (); return eps; } static char * linux_string (const char *value) { char *out = grub_malloc( grub_strlen (value) + 1); const char *src = value; char *dst = out; for (; *src; src++) if (*src > ' ' && *src < 127 && *src != ':') *dst++ = *src; *dst = 0; return out; } /* * These functions convert values from the various SMBIOS structure field types * into a string formatted to be returned to the user. They expect that the * structure and offset were already validated. When the requested data is * successfully retrieved and formatted, the pointer to the string is returned; * otherwise, NULL is returned on failure. Don't free the result. */ static const char * grub_smbios_format_byte (const grub_uint8_t *structure, grub_uint8_t offset) { static char buffer[sizeof ("255")]; grub_snprintf (buffer, sizeof (buffer), "%u", structure[offset]); return (const char *)buffer; } static const char * grub_smbios_format_word (const grub_uint8_t *structure, grub_uint8_t offset) { static char buffer[sizeof ("65535")]; grub_uint16_t value = grub_get_unaligned16 (structure + offset); grub_snprintf (buffer, sizeof (buffer), "%u", value); return (const char *)buffer; } static const char * grub_smbios_format_dword (const grub_uint8_t *structure, grub_uint8_t offset) { static char buffer[sizeof ("4294967295")]; grub_uint32_t value = grub_get_unaligned32 (structure + offset); grub_snprintf (buffer, sizeof (buffer), "%" PRIuGRUB_UINT32_T, value); return (const char *)buffer; } static const char * grub_smbios_format_qword (const grub_uint8_t *structure, grub_uint8_t offset) { static char buffer[sizeof ("18446744073709551615")]; grub_uint64_t value = grub_get_unaligned64 (structure + offset); grub_snprintf (buffer, sizeof (buffer), "%" PRIuGRUB_UINT64_T, value); return (const char *)buffer; } static const char * grub_smbios_get_string (const grub_uint8_t *structure, grub_uint8_t offset) { const grub_uint8_t *ptr = structure + structure[1]; const grub_uint8_t *table_end = (const grub_uint8_t *)table_desc.end; const grub_uint8_t referenced_string_number = structure[offset]; grub_uint8_t i; /* A string referenced with zero is interpreted as unset. */ if (referenced_string_number == 0) return NULL; /* Search the string set. */ for (i = 1; *ptr != 0 && ptr < table_end; i++) if (i == referenced_string_number) { const char *str = (const char *)ptr; while (*ptr++ != 0) if (ptr >= table_end) return NULL; /* The string isn't terminated. */ return str; } else while (*ptr++ != 0 && ptr < table_end); /* The string number is greater than the number of strings in the set. */ return NULL; } static const char * grub_smbios_format_uuid (const grub_uint8_t *structure, grub_uint8_t offset) { static char buffer[sizeof ("ffffffff-ffff-ffff-ffff-ffffffffffff")]; const grub_uint8_t *f = structure + offset; /* little-endian fields */ const grub_uint8_t *g = f + 8; /* byte-by-byte fields */ grub_snprintf (buffer, sizeof (buffer), "%02x%02x%02x%02x-%02x%02x-%02x%02x-" "%02x%02x-%02x%02x%02x%02x%02x%02x", f[3], f[2], f[1], f[0], f[5], f[4], f[7], f[6], g[0], g[1], g[2], g[3], g[4], g[5], g[6], g[7]); return (const char *)buffer; } /* List the field formatting functions and the number of bytes they need. */ static const struct { const char *(*format) (const grub_uint8_t *structure, grub_uint8_t offset); grub_uint8_t field_length; } field_extractors[] = { {grub_smbios_format_byte, 1}, {grub_smbios_format_word, 2}, {grub_smbios_format_dword, 4}, {grub_smbios_format_qword, 8}, {grub_smbios_get_string, 1}, {grub_smbios_format_uuid, 16} }; /* List command options, with structure field getters ordered as above. */ #define FIRST_GETTER_OPT (3) #define SETTER_OPT (FIRST_GETTER_OPT + ARRAY_SIZE(field_extractors)) #define LINUX_OPT (FIRST_GETTER_OPT + ARRAY_SIZE(field_extractors) + 1) static const struct grub_arg_option options[] = { {"type", 't', 0, N_("Match structures with the given type."), N_("type"), ARG_TYPE_INT}, {"handle", 'h', 0, N_("Match structures with the given handle."), N_("handle"), ARG_TYPE_INT}, {"match", 'm', 0, N_("Select a structure when several match."), N_("match"), ARG_TYPE_INT}, {"get-byte", 'b', 0, N_("Get the byte's value at the given offset."), N_("offset"), ARG_TYPE_INT}, {"get-word", 'w', 0, N_("Get two bytes' value at the given offset."), N_("offset"), ARG_TYPE_INT}, {"get-dword", 'd', 0, N_("Get four bytes' value at the given offset."), N_("offset"), ARG_TYPE_INT}, {"get-qword", 'q', 0, N_("Get eight bytes' value at the given offset."), N_("offset"), ARG_TYPE_INT}, {"get-string", 's', 0, N_("Get the string specified at the given offset."), N_("offset"), ARG_TYPE_INT}, {"get-uuid", 'u', 0, N_("Get the UUID's value at the given offset."), N_("offset"), ARG_TYPE_INT}, {"set", '\0', 0, N_("Store the value in the given variable name."), N_("variable"), ARG_TYPE_STRING}, {"linux", '\0', 0, N_("Filter the result like linux does."), N_("variable"), ARG_TYPE_NONE}, {0, 0, 0, 0, 0, 0} }; /* * Return a matching SMBIOS structure. * * This method can use up to three criteria for selecting a structure: * - The "type" field (use -1 to ignore) * - The "handle" field (use -1 to ignore) * - Which to return if several match (use 0 to ignore) * * The return value is a pointer to the first matching structure. If no * structures match the given parameters, NULL is returned. */ static const grub_uint8_t * grub_smbios_match_structure (const grub_int16_t type, const grub_int32_t handle, const grub_uint16_t match) { const grub_uint8_t *ptr = (const grub_uint8_t *)table_desc.start; const grub_uint8_t *table_end = (const grub_uint8_t *)table_desc.end; grub_uint16_t structures = table_desc.structures; grub_uint16_t structure_count = 0; grub_uint16_t matches = 0; while (ptr < table_end && ptr[1] >= 4 /* Valid structures include the 4-byte header. */ && (structure_count++ < structures || structures == 0)) { grub_uint16_t structure_handle = grub_get_unaligned16 (ptr + 2); grub_uint8_t structure_type = ptr[0]; if ((handle < 0 || handle == structure_handle) && (type < 0 || type == structure_type) && (match == 0 || match == ++matches)) return ptr; else { ptr += ptr[1]; while ((*ptr++ != 0 || *ptr++ != 0) && ptr < table_end); } if (structure_type == GRUB_SMBIOS_TYPE_END_OF_TABLE) break; } return NULL; } static grub_err_t grub_cmd_smbios (grub_extcmd_context_t ctxt, int argc __attribute__ ((unused)), char **argv __attribute__ ((unused))) { struct grub_arg_list *state = ctxt->state; grub_int16_t type = -1; grub_int32_t handle = -1; grub_uint16_t match = 0; grub_uint8_t offset = 0; const grub_uint8_t *structure; const char *value; char *modified_value = NULL; grub_int32_t option; grub_int8_t field_type = -1; grub_uint8_t i; if (table_desc.start == 0) return grub_error (GRUB_ERR_IO, N_("the SMBIOS entry point structure was not found")); /* Read the given filtering options. */ if (state[0].set) { option = grub_strtol (state[0].arg, NULL, 0); if (option < 0 || option > 255) return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("the type must be between 0 and 255")); type = (grub_int16_t)option; } if (state[1].set) { option = grub_strtol (state[1].arg, NULL, 0); if (option < 0 || option > 65535) return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("the handle must be between 0 and 65535")); handle = (grub_int32_t)option; } if (state[2].set) { option = grub_strtol (state[2].arg, NULL, 0); if (option <= 0 || option > 65535) return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("the match must be a positive integer")); match = (grub_uint16_t)option; } /* Determine the data type of the structure field to retrieve. */ for (i = 0; i < ARRAY_SIZE(field_extractors); i++) if (state[FIRST_GETTER_OPT + i].set) { if (field_type >= 0) return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("only one --get option is usable at a time")); field_type = i; } /* Require a choice of a structure field to return. */ if (field_type < 0) return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("one of the --get options is required")); /* Locate a matching SMBIOS structure. */ structure = grub_smbios_match_structure (type, handle, match); if (structure == NULL) return grub_error (GRUB_ERR_IO, N_("no structure matched the given options")); /* Ensure the requested byte offset is inside the structure. */ option = grub_strtol (state[FIRST_GETTER_OPT + field_type].arg, NULL, 0); if (option < 0 || option >= structure[1]) return grub_error (GRUB_ERR_OUT_OF_RANGE, N_("the given offset is outside the structure")); /* Ensure the requested data type at the offset is inside the structure. */ offset = (grub_uint8_t)option; if (offset + field_extractors[field_type].field_length > structure[1]) return grub_error (GRUB_ERR_OUT_OF_RANGE, N_("the field ends outside the structure")); /* Format the requested structure field into a readable string. */ value = field_extractors[field_type].format (structure, offset); if (value == NULL) return grub_error (GRUB_ERR_IO, N_("failed to retrieve the structure field")); if (state[LINUX_OPT].set) value = modified_value = linux_string (value); /* Store or print the formatted value. */ if (state[SETTER_OPT].set) grub_env_set (state[SETTER_OPT].arg, value); else grub_printf ("%s\n", value); grub_free(modified_value); return GRUB_ERR_NONE; } GRUB_MOD_INIT(smbios) { struct grub_smbios_eps3 *eps3; struct grub_smbios_eps *eps; if ((eps3 = grub_smbios_get_eps3 ())) { table_desc.start = (grub_addr_t)eps3->table_address; table_desc.end = table_desc.start + eps3->maximum_table_length; table_desc.structures = 0; /* SMBIOS3 drops the structure count. */ } else if ((eps = grub_smbios_get_eps ())) { table_desc.start = (grub_addr_t)eps->intermediate.table_address; table_desc.end = table_desc.start + eps->intermediate.table_length; table_desc.structures = eps->intermediate.structures; } cmd = grub_register_extcmd ("smbios", grub_cmd_smbios, 0, N_("[-t type] [-h handle] [-m match] " "(-b|-w|-d|-q|-s|-u) offset " "[--set variable]"), N_("Retrieve SMBIOS information."), options); } GRUB_MOD_FINI(smbios) { grub_unregister_extcmd (cmd); } grub-2.14~git20250718.0e36779/grub-core/commands/tr.c0000644000175000017500000000623515002425525016263 00000000000000/* tr.c -- The tr command. */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2010,2013 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); static const struct grub_arg_option options[] = { { "set", 's', 0, N_("Set a variable to return value."), N_("VARNAME"), ARG_TYPE_STRING }, { "upcase", 'U', 0, N_("Translate to upper case."), 0, 0 }, { "downcase", 'D', 0, N_("Translate to lower case."), 0, 0 }, { 0, 0, 0, 0, 0, 0 } }; static const char *letters_lowercase = "abcdefghijklmnopqrstuvwxyz"; static const char *letters_uppercase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; static grub_err_t grub_cmd_tr (grub_extcmd_context_t ctxt, int argc, char **args) { char *var = 0; const char *input = 0; char *output = 0, *optr; const char *s1 = 0; const char *s2 = 0; const char *iptr; /* Select the defaults from options. */ if (ctxt->state[0].set) { var = ctxt->state[0].arg; input = grub_env_get (var); } if (ctxt->state[1].set) { s1 = letters_lowercase; s2 = letters_uppercase; } if (ctxt->state[2].set) { s1 = letters_uppercase; s2 = letters_lowercase; } /* Check for arguments and update the defaults. */ if (argc == 1) input = args[0]; else if (argc == 2) { s1 = args[0]; s2 = args[1]; } else if (argc == 3) { s1 = args[0]; s2 = args[1]; input = args[2]; } else if (argc > 3) return grub_error (GRUB_ERR_BAD_ARGUMENT, "too many parameters"); if (!s1 || !s2 || !input) return grub_error (GRUB_ERR_BAD_ARGUMENT, "missing parameters"); if (grub_strlen (s1) != grub_strlen (s2)) return grub_error (GRUB_ERR_BAD_ARGUMENT, "set sizes did not match"); /* Translate input into output buffer. */ output = grub_malloc (grub_strlen (input) + 1); if (! output) return grub_errno; optr = output; for (iptr = input; *iptr; iptr++) { char *p = grub_strchr (s1, *iptr); if (p) *optr++ = s2[p - s1]; else *optr++ = *iptr; } *optr = '\0'; if (ctxt->state[0].set) grub_env_set (var, output); else grub_printf ("%s\n", output); grub_free (output); return GRUB_ERR_NONE; } static grub_extcmd_t cmd; GRUB_MOD_INIT(tr) { cmd = grub_register_extcmd ("tr", grub_cmd_tr, 0, N_("[OPTIONS] [SET1] [SET2] [STRING]"), N_("Translate SET1 characters to SET2 in STRING."), options); } GRUB_MOD_FINI(tr) { grub_unregister_extcmd (cmd); } grub-2.14~git20250718.0e36779/grub-core/commands/testspeed.c0000644000175000017500000000572215002425525017636 00000000000000/* testspeed.c - Command to test file read speed */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2012 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); #define DEFAULT_BLOCK_SIZE 65536 static const struct grub_arg_option options[] = { {"size", 's', 0, N_("Specify size for each read operation"), 0, ARG_TYPE_INT}, {0, 0, 0, 0, 0, 0} }; static grub_err_t grub_cmd_testspeed (grub_extcmd_context_t ctxt, int argc, char **args) { struct grub_arg_list *state = ctxt->state; grub_uint64_t start; grub_uint64_t end; grub_ssize_t block_size; grub_disk_addr_t total_size; char *buffer; grub_file_t file; grub_uint64_t whole, fraction; if (argc == 0) return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected")); block_size = (state[0].set) ? grub_strtoul (state[0].arg, 0, 0) : DEFAULT_BLOCK_SIZE; if (block_size <= 0) return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("invalid block size")); buffer = grub_malloc (block_size); if (buffer == NULL) return grub_errno; file = grub_file_open (args[0], GRUB_FILE_TYPE_TESTLOAD); if (file == NULL) goto quit; total_size = 0; start = grub_get_time_ms (); while (1) { grub_ssize_t size = grub_file_read (file, buffer, block_size); if (size <= 0) break; total_size += size; } end = grub_get_time_ms (); grub_file_close (file); grub_printf_ (N_("File size: %s\n"), grub_get_human_size (total_size, GRUB_HUMAN_SIZE_NORMAL)); whole = grub_divmod64 (end - start, 1000, &fraction); grub_printf_ (N_("Elapsed time: %d.%03d s \n"), (unsigned) whole, (unsigned) fraction); if (end != start) { grub_uint64_t speed = grub_divmod64 (total_size * 100ULL * 1000ULL, end - start, 0); grub_printf_ (N_("Speed: %s \n"), grub_get_human_size (speed, GRUB_HUMAN_SIZE_SPEED)); } quit: grub_free (buffer); return grub_errno; } static grub_extcmd_t cmd; GRUB_MOD_INIT(testspeed) { cmd = grub_register_extcmd ("testspeed", grub_cmd_testspeed, 0, N_("[-s SIZE] FILENAME"), N_("Test file read speed."), options); } GRUB_MOD_FINI(testspeed) { grub_unregister_extcmd (cmd); } grub-2.14~git20250718.0e36779/grub-core/commands/time.c0000644000175000017500000000345115000202015016552 00000000000000/* echo.c - Command to display a line of text */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2011 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); static grub_err_t grub_cmd_time (grub_command_t ctxt __attribute__ ((unused)), int argc, char **args) { grub_command_t cmd; grub_uint32_t start; grub_uint32_t end; if (argc == 0) return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("no command is specified")); cmd = grub_command_find (args[0]); if (!cmd) return grub_error (GRUB_ERR_UNKNOWN_COMMAND, N_("can't find command `%s'"), args[0]); start = grub_get_time_ms (); (cmd->func) (cmd, argc - 1, &args[1]); end = grub_get_time_ms (); grub_printf_ (N_("Elapsed time: %d.%03d seconds \n"), (end - start) / 1000, (end - start) % 1000); return grub_errno; } static grub_command_t cmd; GRUB_MOD_INIT(time) { cmd = grub_register_command ("time", grub_cmd_time, N_("COMMAND [ARGS]"), N_("Measure time used by COMMAND")); } GRUB_MOD_FINI(time) { grub_unregister_command (cmd); } grub-2.14~git20250718.0e36779/grub-core/commands/videotest.c0000644000175000017500000001663415033157230017647 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (C) 2006,2007,2009 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); static grub_err_t grub_cmd_videotest (grub_command_t cmd __attribute__ ((unused)), int argc, char **args) { grub_err_t err; grub_video_color_t color; unsigned int x; unsigned int y; unsigned int width; unsigned int height; int i; struct grub_video_render_target *text_layer; grub_video_color_t palette[16]; const char *mode = NULL; #ifdef GRUB_MACHINE_PCBIOS if (grub_strcmp (cmd->name, "vbetest") == 0) grub_dl_load ("vbe"); #endif mode = grub_env_get ("gfxmode"); if (argc) mode = args[0]; if (!mode) mode = "auto"; err = grub_video_set_mode (mode, GRUB_VIDEO_MODE_TYPE_PURE_TEXT, 0); if (err) return err; grub_video_get_viewport (&x, &y, &width, &height); { const char *str; int texty; grub_font_t sansbig; grub_font_t sans; grub_font_t sanssmall; grub_font_t fixed; struct grub_font_glyph *glyph; if (grub_video_create_render_target (&text_layer, width, height, GRUB_VIDEO_MODE_TYPE_RGB | GRUB_VIDEO_MODE_TYPE_ALPHA) || !text_layer) goto fail; grub_video_set_active_render_target (text_layer); color = grub_video_map_rgb (0, 255, 255); sansbig = grub_font_get ("Unknown Regular 16"); sans = grub_font_get ("Unknown Regular 16"); sanssmall = grub_font_get ("Unknown Regular 16"); fixed = grub_font_get ("Fixed 20"); if (! sansbig || ! sans || ! sanssmall || ! fixed) return grub_error (GRUB_ERR_BAD_FONT, "no font loaded"); glyph = grub_font_get_glyph (fixed, '*'); grub_font_draw_glyph (glyph, color, 200 ,0); color = grub_video_map_rgb (255, 255, 255); texty = 32; grub_font_draw_string ("The quick brown fox jumped over the lazy dog.", sans, color, 16, texty); texty += grub_font_get_descent (sans) + grub_font_get_leading (sans); texty += grub_font_get_ascent (fixed); grub_font_draw_string ("The quick brown fox jumped over the lazy dog.", fixed, color, 16, texty); texty += grub_font_get_descent (fixed) + grub_font_get_leading (fixed); /* To convert Unicode characters into UTF-8 for this test, the following command is useful: echo -ne '\x00\x00\x26\x3A' | iconv -f UTF-32BE -t UTF-8 | od -t x1 This converts the Unicode character U+263A to UTF-8. */ /* Characters used: Code point Description UTF-8 encoding ----------- ------------------------------ -------------- U+263A unfilled smiley face E2 98 BA U+00A1 inverted exclamation point C2 A1 U+00A3 British pound currency symbol C2 A3 U+03C4 Greek tau CF 84 U+00E4 lowercase letter a with umlaut C3 A4 U+2124 set 'Z' symbol (integers) E2 84 A4 U+2286 subset symbol E2 8A 86 U+211D set 'R' symbol (real numbers) E2 84 9D */ str = "Unicode test: happy\xE2\x98\xBA \xC2\xA3 5.00" " \xC2\xA1\xCF\x84\xC3\xA4u! " " \xE2\x84\xA4\xE2\x8A\x86\xE2\x84\x9D"; color = grub_video_map_rgb (128, 128, 255); /* All characters in the string exist in the 'Fixed 20' (10x20) font. */ texty += grub_font_get_ascent(fixed); grub_font_draw_string (str, fixed, color, 16, texty); texty += grub_font_get_descent (fixed) + grub_font_get_leading (fixed); texty += grub_font_get_ascent(sansbig); grub_font_draw_string (str, sansbig, color, 16, texty); texty += grub_font_get_descent (sansbig) + grub_font_get_leading (sansbig); texty += grub_font_get_ascent(sans); grub_font_draw_string (str, sans, color, 16, texty); texty += grub_font_get_descent (sans) + grub_font_get_leading (sans); texty += grub_font_get_ascent(sanssmall); grub_font_draw_string (str, sanssmall, color, 16, texty); texty += (grub_font_get_descent (sanssmall) + grub_font_get_leading (sanssmall)); glyph = grub_font_get_glyph (fixed, '*'); for (i = 0; i < 16; i++) { color = grub_video_map_color (i); palette[i] = color; grub_font_draw_glyph (glyph, color, 16 + i * 16, 220); } } grub_video_set_active_render_target (GRUB_VIDEO_RENDER_TARGET_DISPLAY); for (i = 0; i < 5; i++) { if (i == 0 || i == 1) { color = grub_video_map_rgb (0, 0, 0); grub_video_fill_rect (color, 0, 0, width, height); color = grub_video_map_rgb (255, 0, 0); grub_video_fill_rect (color, 0, 0, 100, 100); color = grub_video_map_rgb (0, 255, 0); grub_video_fill_rect (color, 100, 0, 100, 100); color = grub_video_map_rgb (0, 0, 255); grub_video_fill_rect (color, 200, 0, 100, 100); color = grub_video_map_rgb (0, 255, 255); grub_video_fill_rect (color, 0, 100, 100, 100); color = grub_video_map_rgb (255, 0, 255); grub_video_fill_rect (color, 100, 100, 100, 100); color = grub_video_map_rgb (255, 255, 0); grub_video_fill_rect (color, 200, 100, 100, 100); grub_video_set_viewport (x + 150, y + 150, width - 150 * 2, height - 150 * 2); color = grub_video_map_rgb (77, 33, 77); grub_video_fill_rect (color, 0, 0, width, height); } color = grub_video_map_rgb (i, 33, 77); grub_video_fill_rect (color, 0, 0, width, height); grub_video_blit_render_target (text_layer, GRUB_VIDEO_BLIT_BLEND, 0, 0, 0, 0, width, height); grub_video_swap_buffers (); } grub_getkey (); grub_video_delete_render_target (text_layer); grub_video_restore (); for (i = 0; i < 16; i++) grub_printf("color %d: %08x\n", i, palette[i]); grub_errno = GRUB_ERR_NONE; return grub_errno; fail: grub_video_delete_render_target (text_layer); grub_video_restore (); return grub_errno; } static grub_command_t cmd; #ifdef GRUB_MACHINE_PCBIOS static grub_command_t cmd_vbe; #endif GRUB_MOD_INIT(videotest) { cmd = grub_register_command ("videotest", grub_cmd_videotest, /* TRANSLATORS: "x" has to be entered in, like an identifier, so please don't use better Unicode codepoints. */ N_("[WxH]"), /* TRANSLATORS: Here, on the other hand, it's nicer to use unicode cross instead of x. */ N_("Test video subsystem in mode WxH.")); #ifdef GRUB_MACHINE_PCBIOS cmd_vbe = grub_register_command ("vbetest", grub_cmd_videotest, 0, N_("Test video subsystem.")); #endif } GRUB_MOD_FINI(videotest) { grub_unregister_command (cmd); #ifdef GRUB_MACHINE_PCBIOS grub_unregister_command (cmd_vbe); #endif } grub-2.14~git20250718.0e36779/grub-core/commands/file64.c0000644000175000017500000000022315000202015016677 00000000000000#define GRUB_TARGET_WORDSIZE 64 #define XX 64 #define ehdrXX ehdr64 #define grub_file_check_netbsdXX grub_file_check_netbsd64 #include "fileXX.c" grub-2.14~git20250718.0e36779/grub-core/commands/probe.c0000644000175000017500000001465215033157230016746 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (C) 2009 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); static const struct grub_arg_option options[] = { {"set", 's', 0, N_("Set a variable to return value."), N_("VARNAME"), ARG_TYPE_STRING}, /* TRANSLATORS: It's a driver that is currently in use to access the diven disk. */ {"driver", 'd', 0, N_("Determine driver."), 0, 0}, {"partmap", 'p', 0, N_("Determine partition map type."), 0, 0}, {"fs", 'f', 0, N_("Determine filesystem type."), 0, 0}, {"fs-uuid", 'u', 0, N_("Determine filesystem UUID."), 0, 0}, {"label", 'l', 0, N_("Determine filesystem label."), 0, 0}, {"part-uuid", 0, 0, N_("Determine partition UUID."), 0, 0}, {0, 0, 0, 0, 0, 0} }; static grub_err_t grub_cmd_probe (grub_extcmd_context_t ctxt, int argc, char **args) { struct grub_arg_list *state = ctxt->state; grub_device_t dev; grub_fs_t fs; char *ptr; grub_err_t err; if (argc < 1) return grub_error (GRUB_ERR_BAD_ARGUMENT, "device name required"); ptr = args[0] + grub_strlen (args[0]) - 1; if (args[0][0] == '(' && *ptr == ')') { *ptr = 0; dev = grub_device_open (args[0] + 1); *ptr = ')'; } else dev = grub_device_open (args[0]); if (! dev) return grub_errno; if (state[1].set) { const char *val = "none"; if (dev->net) val = dev->net->protocol->name; if (dev->disk) val = dev->disk->dev->name; if (state[0].set) grub_env_set (state[0].arg, val); else grub_printf ("%s", val); grub_device_close (dev); return GRUB_ERR_NONE; } if (state[2].set) { const char *val = "none"; if (dev->disk && dev->disk->partition) val = dev->disk->partition->partmap->name; if (state[0].set) grub_env_set (state[0].arg, val); else grub_printf ("%s", val); grub_device_close (dev); return GRUB_ERR_NONE; } if (state[6].set) { /* AAAABBBB-CCCC-DDDD-EEEE-FFFFFFFFFFFF + null terminator */ char val[37] = "none"; if (dev->disk && dev->disk->partition) { struct grub_partition *p = dev->disk->partition; grub_disk_t disk = grub_disk_open(dev->disk->name); if (!disk) { grub_device_close (dev); return grub_errno; } if (grub_strcmp(dev->disk->partition->partmap->name, "gpt") == 0) { struct grub_gpt_partentry entry; grub_guid_t *guid; if (grub_disk_read(disk, p->offset, p->index, sizeof(entry), &entry)) { grub_error_push (); grub_disk_close (disk); grub_device_close (dev); grub_error_pop (); return grub_errno; } guid = &entry.guid; guid->data1 = grub_le_to_cpu32 (guid->data1); guid->data2 = grub_le_to_cpu16 (guid->data2); guid->data3 = grub_le_to_cpu16 (guid->data3); grub_snprintf (val, sizeof(val), "%pG", guid); } else if (grub_strcmp(dev->disk->partition->partmap->name, "msdos") == 0) { grub_uint32_t nt_disk_sig; if (grub_disk_read(disk, 0, GRUB_BOOT_MACHINE_WINDOWS_NT_MAGIC, sizeof(nt_disk_sig), &nt_disk_sig) == 0) grub_snprintf (val, sizeof(val), "%08x-%02x", grub_le_to_cpu32(nt_disk_sig), 1 + p->number); } grub_disk_close(disk); } if (state[0].set) grub_env_set (state[0].arg, val); else grub_printf ("%s", val); grub_device_close (dev); return GRUB_ERR_NONE; } fs = grub_fs_probe (dev); if (! fs) { grub_error_push (); grub_device_close (dev); grub_error_pop (); return grub_errno; } if (state[3].set) { if (state[0].set) grub_env_set (state[0].arg, fs->name); else grub_printf ("%s", fs->name); grub_device_close (dev); return GRUB_ERR_NONE; } if (state[4].set) { char *uuid; if (! fs->fs_uuid) { grub_device_close (dev); return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET, N_("%s does not support UUIDs"), fs->name); } err = fs->fs_uuid (dev, &uuid); if (err) { grub_device_close (dev); return err; } if (! uuid) { grub_device_close (dev); return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET, N_("%s does not support UUIDs"), fs->name); } if (state[0].set) grub_env_set (state[0].arg, uuid); else grub_printf ("%s", uuid); grub_free (uuid); grub_device_close (dev); return GRUB_ERR_NONE; } if (state[5].set) { char *label; if (! fs->fs_label) { grub_device_close (dev); return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET, N_("filesystem `%s' does not support labels"), fs->name); } err = fs->fs_label (dev, &label); if (err) { grub_device_close (dev); return err; } if (! label) { grub_device_close (dev); return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET, N_("filesystem `%s' does not support labels"), fs->name); } if (state[0].set) grub_env_set (state[0].arg, label); else grub_printf ("%s", label); grub_free (label); grub_device_close (dev); return GRUB_ERR_NONE; } grub_device_close (dev); return grub_error (GRUB_ERR_BAD_ARGUMENT, "unrecognised target"); } static grub_extcmd_t cmd; GRUB_MOD_INIT (probe) { cmd = grub_register_extcmd ("probe", grub_cmd_probe, 0, N_("DEVICE"), N_("Retrieve device info."), options); } GRUB_MOD_FINI (probe) { grub_unregister_extcmd (cmd); } grub-2.14~git20250718.0e36779/grub-core/commands/acpi.c0000644000175000017500000005760115036447510016562 00000000000000/* acpi.c - modify acpi tables. */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2009 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #ifdef GRUB_MACHINE_EFI #include #include #endif #pragma GCC diagnostic ignored "-Wcast-align" GRUB_MOD_LICENSE ("GPLv3+"); enum { OPTION_EXCLUDE = 0, OPTION_LOAD_ONLY, OPTION_V1, OPTION_V2, OPTION_OEMID, OPTION_OEMTABLE, OPTION_OEMTABLEREV, OPTION_OEMTABLECREATOR, OPTION_OEMTABLECREATORREV, OPTION_NO_EBDA }; static const struct grub_arg_option options[] = { {"exclude", 'x', 0, N_("Don't load host tables specified by comma-separated list."), 0, ARG_TYPE_STRING}, {"load-only", 'n', 0, N_("Load only tables specified by comma-separated list."), 0, ARG_TYPE_STRING}, {"v1", '1', 0, N_("Export version 1 tables to the OS."), 0, ARG_TYPE_NONE}, {"v2", '2', 0, N_("Export version 2 and version 3 tables to the OS."), 0, ARG_TYPE_NONE}, {"oemid", 'o', 0, N_("Set OEMID of RSDP, XSDT and RSDT."), 0, ARG_TYPE_STRING}, {"oemtable", 't', 0, N_("Set OEMTABLE ID of RSDP, XSDT and RSDT."), 0, ARG_TYPE_STRING}, {"oemtablerev", 'r', 0, N_("Set OEMTABLE revision of RSDP, XSDT and RSDT."), 0, ARG_TYPE_INT}, {"oemtablecreator", 'c', 0, N_("Set creator field of RSDP, XSDT and RSDT."), 0, ARG_TYPE_STRING}, {"oemtablecreatorrev", 'd', 0, N_("Set creator revision of RSDP, XSDT and RSDT."), 0, ARG_TYPE_INT}, /* TRANSLATORS: "hangs" here is a noun, not a verb. */ {"no-ebda", 'e', 0, N_("Don't update EBDA. May fix failures or hangs on some " "BIOSes but makes it ineffective with OS not receiving RSDP from GRUB."), 0, ARG_TYPE_NONE}, {0, 0, 0, 0, 0, 0} }; /* rev1 is 1 if ACPIv1 is to be generated, 0 otherwise. rev2 contains the revision of ACPIv2+ to generate or 0 if none. */ static int rev1, rev2; /* OEMID of RSDP, RSDT and XSDT. */ static char root_oemid[6]; /* OEMTABLE of the same tables. */ static char root_oemtable[8]; /* OEMREVISION of the same tables. */ static grub_uint32_t root_oemrev; /* CreatorID of the same tables. */ static char root_creator_id[4]; /* CreatorRevision of the same tables. */ static grub_uint32_t root_creator_rev; static struct grub_acpi_rsdp_v10 *rsdpv1_new = 0; static struct grub_acpi_rsdp_v20 *rsdpv2_new = 0; static char *playground = 0, *playground_ptr = 0; static int playground_size = 0; /* Linked list of ACPI tables. */ struct efiemu_acpi_table { void *addr; grub_size_t size; struct efiemu_acpi_table *next; }; static struct efiemu_acpi_table *acpi_tables = 0; /* DSDT isn't in RSDT. So treat it specially. */ static void *table_dsdt = 0; /* Pointer to recreated RSDT. */ static void *rsdt_addr = 0; /* Allocation handles for different tables. */ static grub_size_t dsdt_size = 0; /* Address of original FACS. */ static grub_uint32_t facs_addr = 0; struct grub_acpi_rsdp_v20 * grub_acpi_get_rsdpv2 (void) { if (rsdpv2_new) return rsdpv2_new; if (rsdpv1_new) return 0; return grub_machine_acpi_get_rsdpv2 (); } struct grub_acpi_rsdp_v10 * grub_acpi_get_rsdpv1 (void) { if (rsdpv1_new) return rsdpv1_new; if (rsdpv2_new) return 0; return grub_machine_acpi_get_rsdpv1 (); } #if defined (__i386__) || defined (__x86_64__) static inline int iszero (grub_uint8_t *reg, int size) { int i; for (i = 0; i < size; i++) if (reg[i]) return 0; return 1; } /* Context for grub_acpi_create_ebda. */ struct grub_acpi_create_ebda_ctx { int ebda_len; grub_uint64_t highestlow; }; /* Helper for grub_acpi_create_ebda. */ static int find_hook (grub_uint64_t start, grub_uint64_t size, grub_memory_type_t type, void *data) { struct grub_acpi_create_ebda_ctx *ctx = data; grub_uint64_t end = start + size; if (type != GRUB_MEMORY_AVAILABLE) return 0; if (end > 0x100000) end = 0x100000; if (end > start + ctx->ebda_len && ctx->highestlow < ((end - ctx->ebda_len) & (~0xf)) ) ctx->highestlow = (end - ctx->ebda_len) & (~0xf); return 0; } grub_err_t grub_acpi_create_ebda (void) { struct grub_acpi_create_ebda_ctx ctx = { .highestlow = 0 }; int ebda_kb_len = 0; int mmapregion = 0; grub_uint8_t *ebda, *v1inebda = 0, *v2inebda = 0; grub_uint8_t *targetebda, *target; struct grub_acpi_rsdp_v10 *v1; struct grub_acpi_rsdp_v20 *v2; ebda = (grub_uint8_t *) (grub_addr_t) ((*((grub_uint16_t *) grub_absolute_pointer (0x40e))) << 4); grub_dprintf ("acpi", "EBDA @%p\n", ebda); if (ebda) ebda_kb_len = *(grub_uint16_t *) ebda; grub_dprintf ("acpi", "EBDA length 0x%x\n", ebda_kb_len); if (ebda_kb_len > 16) ebda_kb_len = 0; ctx.ebda_len = (ebda_kb_len + 1) << 10; /* FIXME: use low-memory mm allocation once it's available. */ grub_mmap_iterate (find_hook, &ctx); targetebda = (grub_uint8_t *) (grub_addr_t) ctx.highestlow; grub_dprintf ("acpi", "creating ebda @%llx\n", (unsigned long long) ctx.highestlow); if (! ctx.highestlow) return grub_error (GRUB_ERR_OUT_OF_MEMORY, "couldn't find space for the new EBDA"); mmapregion = grub_mmap_register ((grub_addr_t) targetebda, ctx.ebda_len, GRUB_MEMORY_RESERVED); if (! mmapregion) return grub_errno; /* XXX: EBDA is unstandardized, so this implementation is heuristical. */ if (ebda_kb_len) grub_memcpy (targetebda, ebda, 0x400); else grub_memset (targetebda, 0, 0x400); *((grub_uint16_t *) targetebda) = ebda_kb_len + 1; target = targetebda; v1 = grub_acpi_get_rsdpv1 (); v2 = grub_acpi_get_rsdpv2 (); if (v2 && v2->length > 40) v2 = 0; /* First try to replace already existing rsdp. */ if (v2) { grub_dprintf ("acpi", "Scanning EBDA for old rsdpv2\n"); for (; target < targetebda + 0x400 - v2->length; target += 0x10) if (grub_memcmp (target, GRUB_RSDP_SIGNATURE, GRUB_RSDP_SIGNATURE_SIZE) == 0 && grub_byte_checksum (target, sizeof (struct grub_acpi_rsdp_v10)) == 0 && ((struct grub_acpi_rsdp_v10 *) target)->revision != 0 && ((struct grub_acpi_rsdp_v20 *) target)->length <= v2->length) { grub_memcpy (target, v2, v2->length); grub_dprintf ("acpi", "Copying rsdpv2 to %p\n", target); v2inebda = target; target += v2->length; target = (grub_uint8_t *) ALIGN_UP((grub_addr_t) target, 16); v2 = 0; break; } } if (v1) { grub_dprintf ("acpi", "Scanning EBDA for old rsdpv1\n"); for (; target < targetebda + 0x400 - sizeof (struct grub_acpi_rsdp_v10); target += 0x10) if (grub_memcmp (target, GRUB_RSDP_SIGNATURE, GRUB_RSDP_SIGNATURE_SIZE) == 0 && grub_byte_checksum (target, sizeof (struct grub_acpi_rsdp_v10)) == 0) { grub_memcpy (target, v1, sizeof (struct grub_acpi_rsdp_v10)); grub_dprintf ("acpi", "Copying rsdpv1 to %p\n", target); v1inebda = target; target += sizeof (struct grub_acpi_rsdp_v10); target = (grub_uint8_t *) ALIGN_UP((grub_addr_t) target, 16); v1 = 0; break; } } target = targetebda + 0x100; /* Try contiguous zeros. */ if (v2) { grub_dprintf ("acpi", "Scanning EBDA for block of zeros\n"); for (; target < targetebda + 0x400 - v2->length; target += 0x10) if (iszero (target, v2->length)) { grub_dprintf ("acpi", "Copying rsdpv2 to %p\n", target); grub_memcpy (target, v2, v2->length); v2inebda = target; target += v2->length; target = (grub_uint8_t *) ALIGN_UP((grub_addr_t) target, 16); v2 = 0; break; } } if (v1) { grub_dprintf ("acpi", "Scanning EBDA for block of zeros\n"); for (; target < targetebda + 0x400 - sizeof (struct grub_acpi_rsdp_v10); target += 0x10) if (iszero (target, sizeof (struct grub_acpi_rsdp_v10))) { grub_dprintf ("acpi", "Copying rsdpv1 to %p\n", target); grub_memcpy (target, v1, sizeof (struct grub_acpi_rsdp_v10)); v1inebda = target; target += sizeof (struct grub_acpi_rsdp_v10); target = (grub_uint8_t *) ALIGN_UP((grub_addr_t) target, 16); v1 = 0; break; } } if (v1 || v2) { grub_mmap_unregister (mmapregion); return grub_error (GRUB_ERR_OUT_OF_MEMORY, "couldn't find suitable spot in EBDA"); } /* Remove any other RSDT. */ for (target = targetebda; target < targetebda + 0x400 - sizeof (struct grub_acpi_rsdp_v10); target += 0x10) if (grub_memcmp (target, GRUB_RSDP_SIGNATURE, GRUB_RSDP_SIGNATURE_SIZE) == 0 && grub_byte_checksum (target, sizeof (struct grub_acpi_rsdp_v10)) == 0 && target != v1inebda && target != v2inebda) *target = 0; grub_dprintf ("acpi", "Switching EBDA\n"); (*((grub_uint16_t *) grub_absolute_pointer (0x40e))) = ((grub_addr_t) targetebda) >> 4; grub_dprintf ("acpi", "EBDA switched\n"); return GRUB_ERR_NONE; } #endif /* Create tables common to ACPIv1 and ACPIv2+ */ static void setup_common_tables (void) { struct efiemu_acpi_table *cur; struct grub_acpi_table_header *rsdt; grub_uint32_t *rsdt_entry; int numoftables; /* Treat DSDT. */ grub_memcpy (playground_ptr, table_dsdt, dsdt_size); grub_free (table_dsdt); table_dsdt = playground_ptr; playground_ptr += dsdt_size; /* Treat other tables. */ for (cur = acpi_tables; cur; cur = cur->next) { struct grub_acpi_fadt *fadt; grub_memcpy (playground_ptr, cur->addr, cur->size); grub_free (cur->addr); cur->addr = playground_ptr; playground_ptr += cur->size; /* If it's FADT correct DSDT and FACS addresses. */ fadt = (struct grub_acpi_fadt *) cur->addr; if (grub_memcmp (fadt->hdr.signature, GRUB_ACPI_FADT_SIGNATURE, sizeof (fadt->hdr.signature)) == 0) { fadt->dsdt_addr = (grub_addr_t) table_dsdt; fadt->facs_addr = facs_addr; /* Does a revision 2 exist at all? */ if (fadt->hdr.revision >= 3) { fadt->dsdt_xaddr = (grub_addr_t) table_dsdt; fadt->facs_xaddr = facs_addr; } /* Recompute checksum. */ fadt->hdr.checksum = 0; fadt->hdr.checksum = 1 + ~grub_byte_checksum (fadt, fadt->hdr.length); } } /* Fill RSDT entries. */ numoftables = 0; for (cur = acpi_tables; cur; cur = cur->next) numoftables++; rsdt_addr = rsdt = (struct grub_acpi_table_header *) playground_ptr; playground_ptr += sizeof (struct grub_acpi_table_header) + sizeof (grub_uint32_t) * numoftables; rsdt_entry = (grub_uint32_t *) (rsdt + 1); /* Fill RSDT header. */ grub_memcpy (&(rsdt->signature), "RSDT", 4); rsdt->length = sizeof (struct grub_acpi_table_header) + sizeof (grub_uint32_t) * numoftables; rsdt->revision = 1; grub_memcpy (&(rsdt->oemid), root_oemid, sizeof (rsdt->oemid)); grub_memcpy (&(rsdt->oemtable), root_oemtable, sizeof (rsdt->oemtable)); rsdt->oemrev = root_oemrev; grub_memcpy (&(rsdt->creator_id), root_creator_id, sizeof (rsdt->creator_id)); rsdt->creator_rev = root_creator_rev; for (cur = acpi_tables; cur; cur = cur->next) *(rsdt_entry++) = (grub_addr_t) cur->addr; /* Recompute checksum. */ rsdt->checksum = 0; rsdt->checksum = 1 + ~grub_byte_checksum (rsdt, rsdt->length); } /* Regenerate ACPIv1 RSDP */ static void setv1table (void) { /* Create RSDP. */ rsdpv1_new = (struct grub_acpi_rsdp_v10 *) playground_ptr; playground_ptr += sizeof (struct grub_acpi_rsdp_v10); grub_memcpy (&(rsdpv1_new->signature), GRUB_RSDP_SIGNATURE, sizeof (rsdpv1_new->signature)); grub_memcpy (&(rsdpv1_new->oemid), root_oemid, sizeof (rsdpv1_new->oemid)); rsdpv1_new->revision = 0; rsdpv1_new->rsdt_addr = (grub_addr_t) rsdt_addr; rsdpv1_new->checksum = 0; rsdpv1_new->checksum = 1 + ~grub_byte_checksum (rsdpv1_new, sizeof (*rsdpv1_new)); grub_dprintf ("acpi", "Generated ACPIv1 tables\n"); } static void setv2table (void) { struct grub_acpi_table_header *xsdt; struct efiemu_acpi_table *cur; grub_uint64_t *xsdt_entry; int numoftables; numoftables = 0; for (cur = acpi_tables; cur; cur = cur->next) numoftables++; /* Create XSDT. */ xsdt = (struct grub_acpi_table_header *) playground_ptr; playground_ptr += sizeof (struct grub_acpi_table_header) + sizeof (grub_uint64_t) * numoftables; xsdt_entry = (grub_uint64_t *)(xsdt + 1); for (cur = acpi_tables; cur; cur = cur->next) *(xsdt_entry++) = (grub_addr_t) cur->addr; grub_memcpy (&(xsdt->signature), "XSDT", 4); xsdt->length = sizeof (struct grub_acpi_table_header) + sizeof (grub_uint64_t) * numoftables; xsdt->revision = 1; grub_memcpy (&(xsdt->oemid), root_oemid, sizeof (xsdt->oemid)); grub_memcpy (&(xsdt->oemtable), root_oemtable, sizeof (xsdt->oemtable)); xsdt->oemrev = root_oemrev; grub_memcpy (&(xsdt->creator_id), root_creator_id, sizeof (xsdt->creator_id)); xsdt->creator_rev = root_creator_rev; xsdt->checksum = 0; xsdt->checksum = 1 + ~grub_byte_checksum (xsdt, xsdt->length); /* Create RSDPv2. */ rsdpv2_new = (struct grub_acpi_rsdp_v20 *) playground_ptr; playground_ptr += sizeof (struct grub_acpi_rsdp_v20); grub_memcpy (&(rsdpv2_new->rsdpv1.signature), GRUB_RSDP_SIGNATURE, sizeof (rsdpv2_new->rsdpv1.signature)); grub_memcpy (&(rsdpv2_new->rsdpv1.oemid), root_oemid, sizeof (rsdpv2_new->rsdpv1.oemid)); rsdpv2_new->rsdpv1.revision = rev2; rsdpv2_new->rsdpv1.rsdt_addr = (grub_addr_t) rsdt_addr; rsdpv2_new->rsdpv1.checksum = 0; rsdpv2_new->rsdpv1.checksum = 1 + ~grub_byte_checksum (&(rsdpv2_new->rsdpv1), sizeof (rsdpv2_new->rsdpv1)); rsdpv2_new->length = sizeof (*rsdpv2_new); rsdpv2_new->xsdt_addr = (grub_addr_t) xsdt; rsdpv2_new->checksum = 0; rsdpv2_new->checksum = 1 + ~grub_byte_checksum (rsdpv2_new, rsdpv2_new->length); grub_dprintf ("acpi", "Generated ACPIv2 tables\n"); } static void free_tables (void) { struct efiemu_acpi_table *cur, *t; if (table_dsdt) grub_free (table_dsdt); for (cur = acpi_tables; cur;) { t = cur; grub_free (cur->addr); cur = cur->next; grub_free (t); } acpi_tables = 0; table_dsdt = 0; } static grub_err_t grub_cmd_acpi (struct grub_extcmd_context *ctxt, int argc, char **args) { struct grub_arg_list *state = ctxt->state; struct grub_acpi_rsdp_v10 *rsdp; struct efiemu_acpi_table *cur, *t; int i, mmapregion; int numoftables; /* Default values if no RSDP is found. */ rev1 = 1; rev2 = 3; facs_addr = 0; playground = playground_ptr = 0; playground_size = 0; rsdp = (struct grub_acpi_rsdp_v10 *) grub_machine_acpi_get_rsdpv2 (); if (! rsdp) rsdp = grub_machine_acpi_get_rsdpv1 (); grub_dprintf ("acpi", "RSDP @%p\n", rsdp); if (rsdp) { grub_uint8_t *entry_ptr; char *exclude = 0; char *load_only = 0; char *ptr; grub_size_t tbl_addr_size; struct grub_acpi_table_header *table_head; exclude = state[OPTION_EXCLUDE].set ? grub_strdup (state[OPTION_EXCLUDE].arg) : 0; if (exclude) { for (ptr = exclude; *ptr; ptr++) *ptr = grub_tolower (*ptr); } load_only = state[OPTION_LOAD_ONLY].set ? grub_strdup (state[OPTION_LOAD_ONLY].arg) : 0; if (load_only) { for (ptr = load_only; *ptr; ptr++) *ptr = grub_tolower (*ptr); } /* Set revision variables to replicate the same version as host. */ rev1 = ! rsdp->revision; rev2 = rsdp->revision; if (rev2 && ((struct grub_acpi_table_header *) (grub_addr_t) ((struct grub_acpi_rsdp_v20 *) rsdp)->xsdt_addr) != NULL) { /* XSDT consists of header and an array of 64-bit pointers. */ table_head = (struct grub_acpi_table_header *) (grub_addr_t) ((struct grub_acpi_rsdp_v20 *) rsdp)->xsdt_addr; tbl_addr_size = sizeof (((struct grub_acpi_rsdp_v20 *) rsdp)->xsdt_addr); } else { /* RSDT consists of header and an array of 32-bit pointers. */ table_head = (struct grub_acpi_table_header *) (grub_addr_t) rsdp->rsdt_addr; tbl_addr_size = sizeof (rsdp->rsdt_addr); } /* Load host tables. */ for (entry_ptr = (grub_uint8_t *) (table_head + 1); entry_ptr < (grub_uint8_t *) (((grub_uint8_t *) table_head) + table_head->length); entry_ptr += tbl_addr_size) { char signature[5]; struct efiemu_acpi_table *table; struct grub_acpi_table_header *curtable; if (tbl_addr_size == sizeof (rsdp->rsdt_addr)) curtable = (struct grub_acpi_table_header *) (grub_addr_t) *((grub_uint32_t *) entry_ptr); else curtable = (struct grub_acpi_table_header *) (grub_addr_t) *((grub_uint64_t *) entry_ptr); signature[4] = 0; for (i = 0; i < 4;i++) signature[i] = grub_tolower (curtable->signature[i]); /* If it's FADT it contains addresses of DSDT and FACS. */ if (grub_strcmp (signature, "facp") == 0) { struct grub_acpi_table_header *dsdt; struct grub_acpi_fadt *fadt = (struct grub_acpi_fadt *) curtable; /* Set root header variables to the same values as FADT by default. */ grub_memcpy (&root_oemid, &(fadt->hdr.oemid), sizeof (root_oemid)); grub_memcpy (&root_oemtable, &(fadt->hdr.oemtable), sizeof (root_oemtable)); root_oemrev = fadt->hdr.oemrev; grub_memcpy (&root_creator_id, &(fadt->hdr.creator_id), sizeof (root_creator_id)); root_creator_rev = fadt->hdr.creator_rev; /* Load DSDT if not excluded. */ dsdt = (struct grub_acpi_table_header *) (grub_addr_t) fadt->dsdt_addr; if (dsdt && (! exclude || ! grub_strword (exclude, "dsdt")) && (! load_only || grub_strword (load_only, "dsdt")) && dsdt->length >= sizeof (*dsdt)) { dsdt_size = dsdt->length; table_dsdt = grub_malloc (dsdt->length); if (! table_dsdt) { free_tables (); grub_free (exclude); grub_free (load_only); return grub_errno; } grub_memcpy (table_dsdt, dsdt, dsdt->length); } /* Save FACS address. FACS shouldn't be overridden. */ facs_addr = fadt->facs_addr; } /* Skip excluded tables. */ if (exclude && grub_strword (exclude, signature)) continue; if (load_only && ! grub_strword (load_only, signature)) continue; /* Sanity check. */ if (curtable->length < sizeof (*curtable)) continue; table = (struct efiemu_acpi_table *) grub_malloc (sizeof (struct efiemu_acpi_table)); if (! table) { free_tables (); grub_free (exclude); grub_free (load_only); return grub_errno; } table->size = curtable->length; table->addr = grub_malloc (table->size); playground_size += table->size; if (! table->addr) { free_tables (); grub_free (exclude); grub_free (load_only); grub_free (table); return grub_errno; } table->next = acpi_tables; acpi_tables = table; grub_memcpy (table->addr, curtable, table->size); } grub_free (exclude); grub_free (load_only); } /* Does user specify versions to generate? */ if (state[OPTION_V1].set || state[OPTION_V2].set) { rev1 = state[OPTION_V1].set; if (state[OPTION_V2].set) rev2 = rev2 ? : 2; else rev2 = 0; } /* Does user override root header information? */ if (state[OPTION_OEMID].set) grub_strncpy (root_oemid, state[OPTION_OEMID].arg, sizeof (root_oemid)); if (state[OPTION_OEMTABLE].set) grub_strncpy (root_oemtable, state[OPTION_OEMTABLE].arg, sizeof (root_oemtable)); if (state[OPTION_OEMTABLEREV].set) root_oemrev = grub_strtoul (state[OPTION_OEMTABLEREV].arg, 0, 0); if (state[OPTION_OEMTABLECREATOR].set) grub_strncpy (root_creator_id, state[OPTION_OEMTABLECREATOR].arg, sizeof (root_creator_id)); if (state[OPTION_OEMTABLECREATORREV].set) root_creator_rev = grub_strtoul (state[OPTION_OEMTABLECREATORREV].arg, 0, 0); /* Load user tables */ for (i = 0; i < argc; i++) { grub_file_t file; grub_size_t size; char *buf; file = grub_file_open (args[i], GRUB_FILE_TYPE_ACPI_TABLE); if (! file) { free_tables (); return grub_errno; } size = grub_file_size (file); if (size < sizeof (struct grub_acpi_table_header)) { grub_file_close (file); free_tables (); return grub_error (GRUB_ERR_BAD_OS, N_("premature end of file %s"), args[i]); } buf = (char *) grub_malloc (size); if (! buf) { grub_file_close (file); free_tables (); return grub_errno; } if (grub_file_read (file, buf, size) != (int) size) { grub_file_close (file); free_tables (); if (!grub_errno) grub_error (GRUB_ERR_BAD_OS, N_("premature end of file %s"), args[i]); return grub_errno; } grub_file_close (file); if (grub_memcmp (((struct grub_acpi_table_header *) buf)->signature, "DSDT", 4) == 0) { grub_free (table_dsdt); table_dsdt = buf; dsdt_size = size; } else { struct efiemu_acpi_table *table; table = (struct efiemu_acpi_table *) grub_malloc (sizeof (struct efiemu_acpi_table)); if (! table) { free_tables (); return grub_errno; } table->size = size; table->addr = buf; playground_size += table->size; table->next = acpi_tables; acpi_tables = table; } } numoftables = 0; for (cur = acpi_tables; cur; cur = cur->next) numoftables++; /* DSDT. */ playground_size += dsdt_size; /* RSDT. */ playground_size += sizeof (struct grub_acpi_table_header) + sizeof (grub_uint32_t) * numoftables; /* RSDPv1. */ playground_size += sizeof (struct grub_acpi_rsdp_v10); /* XSDT. */ playground_size += sizeof (struct grub_acpi_table_header) + sizeof (grub_uint64_t) * numoftables; /* RSDPv2. */ playground_size += sizeof (struct grub_acpi_rsdp_v20); playground = playground_ptr = grub_mmap_malign_and_register (1, playground_size, &mmapregion, GRUB_MEMORY_ACPI, 0); if (! playground) { free_tables (); return grub_error (GRUB_ERR_OUT_OF_MEMORY, "couldn't allocate space for ACPI tables"); } setup_common_tables (); /* Request space for RSDPv1. */ if (rev1) setv1table (); /* Request space for RSDPv2+ and XSDT. */ if (rev2) setv2table (); for (cur = acpi_tables; cur;) { t = cur; cur = cur->next; grub_free (t); } acpi_tables = 0; #if defined (__i386__) || defined (__x86_64__) if (! state[OPTION_NO_EBDA].set) { grub_err_t err; err = grub_acpi_create_ebda (); if (err) { rsdpv1_new = 0; rsdpv2_new = 0; grub_mmap_free_and_unregister (mmapregion); return err; } } #endif #ifdef GRUB_MACHINE_EFI { static grub_guid_t acpi = GRUB_EFI_ACPI_TABLE_GUID; static grub_guid_t acpi20 = GRUB_EFI_ACPI_20_TABLE_GUID; grub_efi_system_table->boot_services->install_configuration_table (&acpi20, grub_acpi_get_rsdpv2 ()); grub_efi_system_table->boot_services->install_configuration_table (&acpi, grub_acpi_get_rsdpv1 ()); } #endif return GRUB_ERR_NONE; } static grub_extcmd_t cmd; GRUB_MOD_INIT(acpi) { cmd = grub_register_extcmd_lockdown ("acpi", grub_cmd_acpi, 0, N_("[-1|-2] [--exclude=TABLE1,TABLE2|" "--load-only=TABLE1,TABLE2] FILE1" " [FILE2] [...]"), N_("Load host ACPI tables and tables " "specified by arguments."), options); } GRUB_MOD_FINI(acpi) { grub_unregister_extcmd (cmd); } grub-2.14~git20250718.0e36779/grub-core/commands/bli.c0000644000175000017500000001006015036447510016400 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (C) 2023 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . * * Implementation of the Boot Loader Interface. */ #include #include #include #include #include #include #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); #define MODNAME "bli" static const grub_guid_t bli_vendor_guid = GRUB_EFI_VENDOR_BOOT_LOADER_INTERFACE_GUID; static grub_err_t get_part_uuid (const char *device_name, char **part_uuid) { grub_device_t device; grub_err_t status = GRUB_ERR_NONE; grub_disk_t disk = NULL; struct grub_gpt_partentry entry; device = grub_device_open (device_name); if (device == NULL) return grub_error (grub_errno, N_("cannot open device: %s"), device_name); if (device->disk == NULL) { grub_dprintf ("bli", "%s is not a disk device, partuuid skipped\n", device_name); *part_uuid = NULL; grub_device_close (device); return GRUB_ERR_NONE; } if (device->disk->partition == NULL) { grub_dprintf ("bli", "%s has no partition, partuuid skipped\n", device_name); *part_uuid = NULL; grub_device_close (device); return GRUB_ERR_NONE; } disk = grub_disk_open (device->disk->name); if (disk == NULL) { status = grub_error (grub_errno, N_("cannot open disk: %s"), device_name); grub_device_close (device); return status; } if (grub_strcmp (device->disk->partition->partmap->name, "gpt") != 0) { status = grub_error (GRUB_ERR_BAD_PART_TABLE, N_("this is not a GPT partition table: %s"), device_name); goto fail; } if (grub_disk_read (disk, device->disk->partition->offset, device->disk->partition->index, sizeof (entry), &entry) != GRUB_ERR_NONE) { status = grub_error (grub_errno, N_("read error: %s"), device_name); goto fail; } *part_uuid = grub_xasprintf ("%pG", &entry.guid); if (*part_uuid == NULL) status = grub_errno; fail: grub_disk_close (disk); grub_device_close (device); return status; } static grub_err_t set_loader_device_part_uuid (void) { grub_efi_loaded_image_t *image; char *device_name; grub_err_t status = GRUB_ERR_NONE; char *part_uuid = NULL; image = grub_efi_get_loaded_image (grub_efi_image_handle); if (image == NULL) return grub_error (GRUB_ERR_BAD_DEVICE, N_("unable to find boot device")); device_name = grub_efidisk_get_device_name (image->device_handle); if (device_name == NULL) return grub_error (GRUB_ERR_BAD_DEVICE, N_("unable to find boot device")); status = get_part_uuid (device_name, &part_uuid); if (status == GRUB_ERR_NONE && part_uuid) status = grub_efi_set_variable_to_string ("LoaderDevicePartUUID", &bli_vendor_guid, part_uuid, GRUB_EFI_VARIABLE_BOOTSERVICE_ACCESS | GRUB_EFI_VARIABLE_RUNTIME_ACCESS); else grub_error (status, N_("unable to determine partition UUID of boot device")); grub_free (part_uuid); grub_free (device_name); return status; } GRUB_MOD_INIT (bli) { grub_efi_set_variable_to_string ("LoaderInfo", &bli_vendor_guid, PACKAGE_STRING, GRUB_EFI_VARIABLE_BOOTSERVICE_ACCESS | GRUB_EFI_VARIABLE_RUNTIME_ACCESS); set_loader_device_part_uuid (); /* No error here is critical, other than being logged */ grub_print_error (); } grub-2.14~git20250718.0e36779/grub-core/commands/read.c0000644000175000017500000000507315036447510016555 00000000000000/* read.c - Command to read variables from user. */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2006,2007,2008 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); static const struct grub_arg_option options[] = { {"silent", 's', 0, N_("Do not echo input"), 0, 0}, {0, 0, 0, 0, 0, 0} }; static char * grub_getline (int silent) { grub_size_t i; char *line; char *tmp; int c; grub_size_t alloc_size; i = 0; line = grub_malloc (1 + sizeof('\0')); if (! line) return NULL; while (1) { c = grub_getkey (); if ((c == '\n') || (c == '\r')) break; if (!grub_isprint (c)) continue; line[i] = (char) c; if (!silent) grub_printf ("%c", c); if (grub_add (i, 1, &i)) { grub_error (GRUB_ERR_OUT_OF_RANGE, N_("overflow is detected")); return NULL; } if (grub_add (i, 1 + sizeof('\0'), &alloc_size)) { grub_error (GRUB_ERR_OUT_OF_RANGE, N_("overflow is detected")); return NULL; } tmp = grub_realloc (line, alloc_size); if (! tmp) { grub_free (line); return NULL; } line = tmp; } line[i] = '\0'; return line; } static grub_err_t grub_cmd_read (grub_extcmd_context_t ctxt, int argc, char **args) { struct grub_arg_list *state = ctxt->state; char *line = grub_getline (state[0].set); if (! line) return grub_errno; if (argc > 0) grub_env_set (args[0], line); grub_free (line); return 0; } static grub_extcmd_t cmd; GRUB_MOD_INIT(read) { cmd = grub_register_extcmd ("read", grub_cmd_read, 0, N_("[-s] [ENVVAR]"), N_("Set variable with user input."), options); } GRUB_MOD_FINI(read) { grub_unregister_extcmd (cmd); } grub-2.14~git20250718.0e36779/grub-core/commands/lspci.c0000644000175000017500000001525415033157230016750 00000000000000/* lspci.c - List PCI devices. */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2008, 2009 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); struct grub_pci_classname { int class; int subclass; const char *desc; }; static const struct grub_pci_classname grub_pci_classes[] = { { 0, 0, "" }, { 1, 0, "SCSI Controller" }, { 1, 1, "IDE Controller" }, { 1, 2, "Floppy Controller" }, { 1, 3, "IPI Controller" }, { 1, 4, "RAID Controller" }, { 1, 6, "SATA Controller" }, { 1, 0x80, "Mass storage Controller" }, { 2, 0, "Ethernet Controller" }, { 2, 1, "Token Ring Controller" }, { 2, 2, "FDDI Controller" }, { 2, 3, "ATM Controller" }, { 2, 4, "ISDN Controller" }, { 2, 0x80, "Network controller" }, { 3, 0, "VGA Controller" }, { 3, 1, "XGA Controller" }, { 3, 2, "3D Controller" }, { 3, 0x80, "Display Controller" }, { 4, 0, "Multimedia Video Device" }, { 4, 1, "Multimedia Audio Device" }, { 4, 2, "Multimedia Telephony Device" }, { 4, 0x80, "Multimedia device" }, { 5, 0, "RAM Controller" }, { 5, 1, "Flash Memory Controller" }, { 5, 0x80, "Memory Controller" }, { 6, 0, "Host Bridge" }, { 6, 1, "ISA Bridge" }, { 6, 2, "EISA Bride" }, { 6, 3, "MCA Bridge" }, { 6, 4, "PCI-PCI Bridge" }, { 6, 5, "PCMCIA Bridge" }, { 6, 6, "NuBus Bridge" }, { 6, 7, "CardBus Bridge" }, { 6, 8, "Raceway Bridge" }, { 6, 0x80, "Unknown Bridge" }, { 7, 0x80, "Communication controller" }, { 8, 0x80, "System hardware" }, { 9, 0, "Keyboard Controller" }, { 9, 1, "Digitizer" }, { 9, 2, "Mouse Controller" }, { 9, 3, "Scanner Controller" }, { 9, 4, "Gameport Controller" }, { 9, 0x80, "Unknown Input Device" }, { 10, 0, "Generic Docking Station" }, { 10, 0x80, "Unknown Docking Station" }, { 11, 0, "80386 Processor" }, { 11, 1, "80486 Processor" }, { 11, 2, "Pentium Processor" }, { 11, 0x10, "Alpha Processor" }, { 11, 0x20, "PowerPC Processor" }, { 11, 0x30, "MIPS Processor" }, { 11, 0x40, "Co-Processor" }, { 11, 0x80, "Unknown Processor" }, { 12, 3, "USB Controller" }, { 12, 0x80, "Serial Bus Controller" }, { 13, 0x80, "Wireless Controller" }, { 14, 0, "I2O" }, { 15, 0, "IrDA Controller" }, { 15, 1, "Consumer IR" }, { 15, 0x10, "RF-Controller" }, { 15, 0x80, "Satellite Communication Controller" }, { 16, 0, "Network Decryption" }, { 16, 1, "Entertainment Decryption" }, { 16, 0x80, "Unknown Decryption Controller" }, { 17, 0, "Digital IO Module" }, { 17, 0x80, "Unknown Data Input System" }, { 0, 0, 0 }, }; static const char * grub_pci_get_class (int class, int subclass) { const struct grub_pci_classname *curr = grub_pci_classes; while (curr->desc) { if (curr->class == class && curr->subclass == subclass) return curr->desc; curr++; } return 0; } static const struct grub_arg_option options[] = { {"iospace", 'i', 0, "show I/O spaces", 0, 0}, {0, 0, 0, 0, 0, 0} }; static int iospace; static int grub_lspci_iter (grub_pci_device_t dev, grub_pci_id_t pciid, void *data __attribute__ ((unused))) { grub_uint32_t class; const char *sclass; grub_pci_address_t addr; int reg; grub_printf ("%02x:%02x.%x %04x:%04x", grub_pci_get_bus (dev), grub_pci_get_device (dev), grub_pci_get_function (dev), pciid & 0xFFFF, pciid >> 16); addr = grub_pci_make_address (dev, GRUB_PCI_REG_CLASS); class = grub_pci_read (addr); /* Lookup the class name, if there isn't a specific one, retry with 0x80 to get the generic class name. */ sclass = grub_pci_get_class (class >> 24, (class >> 16) & 0xFF); if (! sclass) sclass = grub_pci_get_class (class >> 24, 0x80); if (! sclass) sclass = ""; grub_printf (" [%04x] %s", (class >> 16) & 0xffff, sclass); grub_uint8_t pi = (class >> 8) & 0xff; if (pi) grub_printf (" [PI %02x]", pi); grub_printf ("\n"); if (iospace) { reg = GRUB_PCI_REG_ADDRESSES; while (reg < GRUB_PCI_REG_CIS_POINTER) { grub_uint64_t space; addr = grub_pci_make_address (dev, reg); space = grub_pci_read (addr); reg += sizeof (grub_uint32_t); if (space == 0) continue; switch (space & GRUB_PCI_ADDR_SPACE_MASK) { case GRUB_PCI_ADDR_SPACE_IO: grub_printf ("\tIO space %d at 0x%llx\n", (unsigned) ((reg - GRUB_PCI_REG_ADDRESSES) / sizeof (grub_uint32_t)) - 1, (unsigned long long) (space & GRUB_PCI_ADDR_IO_MASK)); break; case GRUB_PCI_ADDR_SPACE_MEMORY: if ((space & GRUB_PCI_ADDR_MEM_TYPE_MASK) == GRUB_PCI_ADDR_MEM_TYPE_64) { addr = grub_pci_make_address (dev, reg); space |= ((grub_uint64_t) grub_pci_read (addr)) << 32; reg += sizeof (grub_uint32_t); grub_printf ("\t64-bit memory space %d at 0x%016llx [%s]\n", (unsigned) ((reg - GRUB_PCI_REG_ADDRESSES) / sizeof (grub_uint32_t)) - 2, (unsigned long long) (space & GRUB_PCI_ADDR_MEM_MASK), space & GRUB_PCI_ADDR_MEM_PREFETCH ? "prefetchable" : "non-prefetchable"); } else grub_printf ("\t32-bit memory space %d at 0x%016llx [%s]\n", (unsigned) ((reg - GRUB_PCI_REG_ADDRESSES) / sizeof (grub_uint32_t)) - 1, (unsigned long long) (space & GRUB_PCI_ADDR_MEM_MASK), space & GRUB_PCI_ADDR_MEM_PREFETCH ? "prefetchable" : "non-prefetchable"); break; } } } return 0; } static grub_err_t grub_cmd_lspci (grub_extcmd_context_t ctxt, int argc __attribute__ ((unused)), char **args __attribute__ ((unused))) { iospace = ctxt->state[0].set; grub_pci_iterate (grub_lspci_iter, NULL); return GRUB_ERR_NONE; } static grub_extcmd_t cmd; GRUB_MOD_INIT(lspci) { cmd = grub_register_extcmd ("lspci", grub_cmd_lspci, 0, "[-i]", N_("List PCI devices."), options); } GRUB_MOD_FINI(lspci) { grub_unregister_extcmd (cmd); } grub-2.14~git20250718.0e36779/grub-core/commands/memtools.c0000644000175000017500000000744715033157230017502 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (C) 2022 Free Software Foundation, Inc. * Copyright (C) 2022 IBM Corporation * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); static grub_err_t grub_cmd_lsmem (grub_command_t cmd __attribute__ ((unused)), int argc __attribute__ ((unused)), char **args __attribute__ ((unused))) { #ifndef GRUB_MACHINE_EMU grub_mm_dump (0); #endif return 0; } static grub_err_t grub_cmd_lsfreemem (grub_command_t cmd __attribute__ ((unused)), int argc __attribute__ ((unused)), char **args __attribute__ ((unused))) { #ifndef GRUB_MACHINE_EMU grub_mm_dump_free (); #endif return 0; } static grub_err_t grub_cmd_stress_big_allocs (grub_command_t cmd __attribute__ ((unused)), int argc __attribute__ ((unused)), char **args __attribute__ ((unused))) { int i, max_mb, blocks_alloced; void *mem; void **blocklist; grub_printf ("Test 1: increasingly sized allocs to 1GB block\n"); for (i = 1; i < 1024; i++) { grub_printf ("%4d MB . ", i); mem = grub_malloc (i * 1024 * 1024); if (mem == NULL) { grub_printf ("failed\n"); break; } else grub_free (mem); if (i % 7 == 0) grub_printf ("\n"); } max_mb = i - 1; grub_printf ("\nMax sized allocation we did was %d MB\n", max_mb); grub_printf ("\nTest 2: 1MB at a time, max 4GB\n"); blocklist = grub_calloc (4096, sizeof (void *)); for (i = 0; i < 4096; i++) { blocklist[i] = grub_malloc (1024 * 1024); if (blocklist[i] == NULL) { grub_printf ("Ran out of memory at iteration %d\n", i); break; } } blocks_alloced = i; for (i = 0; i < blocks_alloced; i++) grub_free (blocklist[i]); grub_printf ("\nTest 3: 1MB aligned 900kB + 100kB\n"); /* grub_mm_debug=1;*/ for (i = 0; i < 4096; i += 2) { blocklist[i] = grub_memalign (1024 * 1024, 900 * 1024); if (blocklist[i] == NULL) { grub_printf ("Failed big allocation, iteration %d\n", i); blocks_alloced = i; break; } blocklist[i + 1] = grub_malloc (100 * 1024); if (blocklist[i + 1] == NULL) { grub_printf ("Failed small allocation, iteration %d\n", i); blocks_alloced = i + 1; break; } grub_printf ("."); } for (i = 0; i < blocks_alloced; i++) grub_free (blocklist[i]); grub_free (blocklist); #if defined(__powerpc__) grub_printf ("\nA reboot may now be required.\n"); #endif grub_errno = GRUB_ERR_NONE; return GRUB_ERR_NONE; } static grub_command_t cmd_lsmem, cmd_lsfreemem, cmd_sba; GRUB_MOD_INIT (memtools) { cmd_lsmem = grub_register_command ("lsmem", grub_cmd_lsmem, 0, N_("List free and allocated memory blocks.")); cmd_lsfreemem = grub_register_command ("lsfreemem", grub_cmd_lsfreemem, 0, N_("List free memory blocks.")); cmd_sba = grub_register_command ("stress_big_allocs", grub_cmd_stress_big_allocs, 0, N_("Stress test large allocations.")); } GRUB_MOD_FINI (memtools) { grub_unregister_command (cmd_lsmem); grub_unregister_command (cmd_lsfreemem); grub_unregister_command (cmd_sba); } grub-2.14~git20250718.0e36779/grub-core/commands/search_wrap.c0000644000175000017500000001567215036447510020146 00000000000000/* search.c - search devices based on a file or a filesystem label */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2005,2007,2008,2009 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); static const struct grub_arg_option options[] = { {"file", 'f', 0, N_("Search devices by a file."), 0, 0}, {"label", 'l', 0, N_("Search devices by a filesystem label."), 0, 0}, {"fs-uuid", 'u', 0, N_("Search devices by a filesystem UUID."), 0, 0}, {"set", 's', GRUB_ARG_OPTION_OPTIONAL, N_("Set a variable to the first device found."), N_("VARNAME"), ARG_TYPE_STRING}, {"no-floppy", 'n', 0, N_("Do not probe any floppy drive."), 0, 0}, {"efidisk-only", 0, 0, N_("Only probe EFI disks."), 0, 0}, {"cryptodisk-only", 0, 0, N_("Only probe encrypted disks."), 0, 0}, {"hint", 'h', GRUB_ARG_OPTION_REPEATABLE, N_("First try the device HINT. If HINT ends in comma, " "also try subpartitions"), N_("HINT"), ARG_TYPE_STRING}, {"hint-ieee1275", 0, GRUB_ARG_OPTION_REPEATABLE, N_("First try the device HINT if currently running on IEEE1275. " "If HINT ends in comma, also try subpartitions"), N_("HINT"), ARG_TYPE_STRING}, {"hint-bios", 0, GRUB_ARG_OPTION_REPEATABLE, N_("First try the device HINT if currently running on BIOS. " "If HINT ends in comma, also try subpartitions"), N_("HINT"), ARG_TYPE_STRING}, {"hint-baremetal", 0, GRUB_ARG_OPTION_REPEATABLE, N_("First try the device HINT if direct hardware access is supported. " "If HINT ends in comma, also try subpartitions"), N_("HINT"), ARG_TYPE_STRING}, {"hint-efi", 0, GRUB_ARG_OPTION_REPEATABLE, N_("First try the device HINT if currently running on EFI. " "If HINT ends in comma, also try subpartitions"), N_("HINT"), ARG_TYPE_STRING}, {"hint-arc", 0, GRUB_ARG_OPTION_REPEATABLE, N_("First try the device HINT if currently running on ARC." " If HINT ends in comma, also try subpartitions"), N_("HINT"), ARG_TYPE_STRING}, {0, 0, 0, 0, 0, 0} }; enum options { SEARCH_FILE, SEARCH_LABEL, SEARCH_FS_UUID, SEARCH_SET, SEARCH_NO_FLOPPY, SEARCH_EFIDISK_ONLY, SEARCH_CRYPTODISK_ONLY, SEARCH_HINT, SEARCH_HINT_IEEE1275, SEARCH_HINT_BIOS, SEARCH_HINT_BAREMETAL, SEARCH_HINT_EFI, SEARCH_HINT_ARC, }; static grub_err_t grub_cmd_search (grub_extcmd_context_t ctxt, int argc, char **args) { struct grub_arg_list *state = ctxt->state; const char *var = 0; const char *id = 0; int i = 0, j = 0, nhints = 0; char **hints = NULL; enum search_flags flags = SEARCH_FLAGS_NONE; if (state[SEARCH_HINT].set) for (i = 0; state[SEARCH_HINT].args[i]; i++) nhints++; #ifdef GRUB_MACHINE_IEEE1275 if (state[SEARCH_HINT_IEEE1275].set) for (i = 0; state[SEARCH_HINT_IEEE1275].args[i]; i++) nhints++; #endif #ifdef GRUB_MACHINE_EFI if (state[SEARCH_HINT_EFI].set) for (i = 0; state[SEARCH_HINT_EFI].args[i]; i++) nhints++; #endif #ifdef GRUB_MACHINE_PCBIOS if (state[SEARCH_HINT_BIOS].set) for (i = 0; state[SEARCH_HINT_BIOS].args[i]; i++) nhints++; #endif #ifdef GRUB_MACHINE_ARC if (state[SEARCH_HINT_ARC].set) for (i = 0; state[SEARCH_HINT_ARC].args[i]; i++) nhints++; #endif if (state[SEARCH_HINT_BAREMETAL].set) for (i = 0; state[SEARCH_HINT_BAREMETAL].args[i]; i++) nhints++; hints = grub_calloc (nhints, sizeof (hints[0])); if (!hints) return grub_errno; j = 0; if (state[SEARCH_HINT].set) for (i = 0; state[SEARCH_HINT].args[i]; i++) hints[j++] = state[SEARCH_HINT].args[i]; #ifdef GRUB_MACHINE_IEEE1275 if (state[SEARCH_HINT_IEEE1275].set) for (i = 0; state[SEARCH_HINT_IEEE1275].args[i]; i++) hints[j++] = state[SEARCH_HINT_IEEE1275].args[i]; #endif #ifdef GRUB_MACHINE_EFI if (state[SEARCH_HINT_EFI].set) for (i = 0; state[SEARCH_HINT_EFI].args[i]; i++) hints[j++] = state[SEARCH_HINT_EFI].args[i]; #endif #ifdef GRUB_MACHINE_ARC if (state[SEARCH_HINT_ARC].set) for (i = 0; state[SEARCH_HINT_ARC].args[i]; i++) hints[j++] = state[SEARCH_HINT_ARC].args[i]; #endif #ifdef GRUB_MACHINE_PCBIOS if (state[SEARCH_HINT_BIOS].set) for (i = 0; state[SEARCH_HINT_BIOS].args[i]; i++) hints[j++] = state[SEARCH_HINT_BIOS].args[i]; #endif if (state[SEARCH_HINT_BAREMETAL].set) for (i = 0; state[SEARCH_HINT_BAREMETAL].args[i]; i++) hints[j++] = state[SEARCH_HINT_BAREMETAL].args[i]; /* Skip hints for future platforms. */ for (j = 0; j < argc; j++) if (grub_memcmp (args[j], "--hint-", sizeof ("--hint-") - 1) != 0) break; if (state[SEARCH_SET].set) var = state[SEARCH_SET].arg ? state[SEARCH_SET].arg : "root"; if (argc != j) id = args[j]; else if (state[SEARCH_SET].set && state[SEARCH_SET].arg) { id = state[SEARCH_SET].arg; var = "root"; } else { grub_error (GRUB_ERR_BAD_ARGUMENT, N_("one argument expected")); goto out; } if (state[SEARCH_NO_FLOPPY].set) flags |= SEARCH_FLAGS_NO_FLOPPY; if (state[SEARCH_EFIDISK_ONLY].set) flags |= SEARCH_FLAGS_EFIDISK_ONLY; if (state[SEARCH_CRYPTODISK_ONLY].set) flags |= SEARCH_FLAGS_CRYPTODISK_ONLY; if (state[SEARCH_LABEL].set) grub_search_label (id, var, flags, hints, nhints); else if (state[SEARCH_FS_UUID].set) grub_search_fs_uuid (id, var, flags, hints, nhints); else if (state[SEARCH_FILE].set) grub_search_fs_file (id, var, flags, hints, nhints); else grub_error (GRUB_ERR_INVALID_COMMAND, "unspecified search type"); out: grub_free (hints); return grub_errno; } static grub_extcmd_t cmd; GRUB_MOD_INIT(search) { cmd = grub_register_extcmd ("search", grub_cmd_search, GRUB_COMMAND_FLAG_EXTRACTOR | GRUB_COMMAND_ACCEPT_DASH, N_("[-f|-l|-u|-s|-n] [--cryptodisk-only] [--hint HINT [--hint HINT] ...]" " NAME"), N_("Search devices by file, filesystem label" " or filesystem UUID." " If --set is specified, the first device found is" " set to a variable. If no variable name is" " specified, `root' is used."), options); } GRUB_MOD_FINI(search) { grub_unregister_extcmd (cmd); } grub-2.14~git20250718.0e36779/grub-core/commands/macbless.c0000644000175000017500000001415515033157230017426 00000000000000/* hfspbless.c - set the hfs+ boot directory. */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2003,2005,2007,2008,2009,2012,2013 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); struct find_node_context { grub_uint64_t inode_found; char *dirname; enum { FOUND_NONE, FOUND_FILE, FOUND_DIR } found; }; static int find_inode (const char *filename, const struct grub_dirhook_info *info, void *data) { struct find_node_context *ctx = data; if (!info->inodeset) return 0; if ((grub_strcmp (ctx->dirname, filename) == 0 || (info->case_insensitive && grub_strcasecmp (ctx->dirname, filename) == 0))) { ctx->inode_found = info->inode; ctx->found = info->dir ? FOUND_DIR : FOUND_FILE; } return 0; } grub_err_t grub_mac_bless_inode (grub_device_t dev, grub_uint32_t inode, int is_dir, int intel) { grub_err_t err; union { struct grub_hfs_sblock hfs; struct grub_hfsplus_volheader hfsplus; } volheader; grub_disk_addr_t embedded_offset; if (intel && is_dir) return grub_error (GRUB_ERR_BAD_ARGUMENT, "can't bless a directory for mactel"); if (!intel && !is_dir) return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET, "can't bless a file for mac PPC"); /* Read the bootblock. */ err = grub_disk_read (dev->disk, GRUB_HFSPLUS_SBLOCK, 0, sizeof (volheader), (char *) &volheader); if (err) return err; embedded_offset = 0; if (grub_be_to_cpu16 (volheader.hfs.magic) == GRUB_HFS_MAGIC) { int extent_start; int ablk_size; int ablk_start; /* See if there's an embedded HFS+ filesystem. */ if (grub_be_to_cpu16 (volheader.hfs.embed_sig) != GRUB_HFSPLUS_MAGIC) { if (intel) volheader.hfs.intel_bootfile = grub_be_to_cpu32 (inode); else volheader.hfs.ppc_bootdir = grub_be_to_cpu32 (inode); return GRUB_ERR_NONE; } /* Calculate the offset needed to translate HFS+ sector numbers. */ extent_start = grub_be_to_cpu16 (volheader.hfs.embed_extent.first_block); ablk_size = grub_be_to_cpu32 (volheader.hfs.blksz); ablk_start = grub_be_to_cpu16 (volheader.hfs.first_block); embedded_offset = (ablk_start + ((grub_uint64_t) extent_start) * (ablk_size >> GRUB_DISK_SECTOR_BITS)); err = grub_disk_read (dev->disk, embedded_offset + GRUB_HFSPLUS_SBLOCK, 0, sizeof (volheader), (char *) &volheader); if (err) return err; } if ((grub_be_to_cpu16 (volheader.hfsplus.magic) != GRUB_HFSPLUS_MAGIC) && (grub_be_to_cpu16 (volheader.hfsplus.magic) != GRUB_HFSPLUSX_MAGIC)) return grub_error (GRUB_ERR_BAD_FS, "not a HFS+ filesystem"); if (intel) volheader.hfsplus.intel_bootfile = grub_be_to_cpu32 (inode); else volheader.hfsplus.ppc_bootdir = grub_be_to_cpu32 (inode); return grub_disk_write (dev->disk, embedded_offset + GRUB_HFSPLUS_SBLOCK, 0, sizeof (volheader), (char *) &volheader); } grub_err_t grub_mac_bless_file (grub_device_t dev, const char *path_in, int intel) { grub_fs_t fs; char *path, *tail; struct find_node_context ctx; fs = grub_fs_probe (dev); if (!fs || (grub_strcmp (fs->name, "hfsplus") != 0 && grub_strcmp (fs->name, "hfs") != 0)) return grub_error (GRUB_ERR_BAD_FS, "no suitable FS found"); path = grub_strdup (path_in); if (!path) return grub_errno; tail = path + grub_strlen (path) - 1; /* Remove trailing '/'. */ while (tail != path && *tail == '/') *(tail--) = 0; tail = grub_strrchr (path, '/'); ctx.found = 0; if (tail) { *tail = 0; ctx.dirname = tail + 1; (fs->fs_dir) (dev, *path == 0 ? "/" : path, find_inode, &ctx); } else { ctx.dirname = path + 1; (fs->fs_dir) (dev, "/", find_inode, &ctx); } if (!ctx.found) { grub_free (path); return grub_error (GRUB_ERR_FILE_NOT_FOUND, N_("file `%s' not found"), path_in); } grub_free (path); return grub_mac_bless_inode (dev, (grub_uint32_t) ctx.inode_found, (ctx.found == FOUND_DIR), intel); } static grub_err_t grub_cmd_macbless (grub_command_t cmd, int argc, char **args) { char *device_name; char *path = 0; grub_device_t dev = 0; grub_err_t err; if (argc != 1) return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("one argument expected")); device_name = grub_file_get_device_name (args[0]); dev = grub_device_open (device_name); path = grub_strchr (args[0], ')'); if (!path) path = args[0]; else path = path + 1; if (!path || *path == 0 || !dev) { if (dev) grub_device_close (dev); grub_free (device_name); return grub_error (GRUB_ERR_BAD_ARGUMENT, "invalid argument"); } err = grub_mac_bless_file (dev, path, cmd->name[3] == 't'); grub_device_close (dev); grub_free (device_name); return err; } static grub_command_t cmd, cmd_ppc; GRUB_MOD_INIT(macbless) { cmd = grub_register_command ("mactelbless", grub_cmd_macbless, N_("FILE"), N_("Bless FILE of HFS or HFS+ partition for intel macs.")); cmd_ppc = grub_register_command ("macppcbless", grub_cmd_macbless, N_("DIR"), N_("Bless DIR of HFS or HFS+ partition for PPC macs.")); } GRUB_MOD_FINI(macbless) { grub_unregister_command (cmd); grub_unregister_command (cmd_ppc); } grub-2.14~git20250718.0e36779/grub-core/commands/halt.c0000644000175000017500000000260415033157230016561 00000000000000/* halt.c - command to halt the computer. */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2005,2007,2008 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); static grub_err_t __attribute__ ((noreturn)) grub_cmd_halt (grub_command_t cmd __attribute__ ((unused)), int argc __attribute__ ((unused)), char **args __attribute__ ((unused))) { grub_halt (); } static grub_command_t cmd; GRUB_MOD_INIT(halt) { cmd = grub_register_command ("halt", grub_cmd_halt, 0, N_("Halts the computer. This command does" " not work on all firmware implementations.")); } GRUB_MOD_FINI(halt) { grub_unregister_command (cmd); } grub-2.14~git20250718.0e36779/grub-core/commands/eval.c0000644000175000017500000000327415000202015016546 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (C) 2009 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); static grub_err_t grub_cmd_eval (grub_command_t cmd __attribute__((__unused__)), int argc, char *argv[]) { int i; grub_size_t size = argc; /* +1 for final zero */ char *str, *p; grub_err_t ret; if (argc == 0) return GRUB_ERR_NONE; for (i = 0; i < argc; i++) size += grub_strlen (argv[i]); str = p = grub_malloc (size); if (!str) return grub_errno; for (i = 0; i < argc; i++) { p = grub_stpcpy (p, argv[i]); *p++ = ' '; } *--p = '\0'; ret = grub_script_execute_sourcecode (str); grub_free (str); return ret; } static grub_command_t cmd; GRUB_MOD_INIT(eval) { cmd = grub_register_command ("eval", grub_cmd_eval, N_("STRING ..."), N_("Evaluate arguments as GRUB commands")); } GRUB_MOD_FINI(eval) { grub_unregister_command (cmd); } grub-2.14~git20250718.0e36779/grub-core/commands/parttool.c0000644000175000017500000002034115033157230017473 00000000000000/* parttool.c - common dispatcher and parser for partition operations */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2009 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include #include #include #include #include #include #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv2+"); static struct grub_parttool *parts = 0; static int curhandle = 0; static grub_dl_t mymod; static char helpmsg[] = N_("Perform COMMANDS on partition.\n" "Use `parttool PARTITION help' for the list " "of available commands."); int grub_parttool_register(const char *part_name, const grub_parttool_function_t func, const struct grub_parttool_argdesc *args) { struct grub_parttool *cur; int nargs = 0; if (! parts) grub_dl_ref (mymod); cur = (struct grub_parttool *) grub_malloc (sizeof (struct grub_parttool)); cur->next = parts; cur->name = grub_strdup (part_name); cur->handle = curhandle++; for (nargs = 0; args[nargs].name != 0; nargs++); cur->nargs = nargs; cur->args = (struct grub_parttool_argdesc *) grub_calloc (nargs + 1, sizeof (struct grub_parttool_argdesc)); if (!cur->args) { grub_free (cur); curhandle--; return -1; } grub_memcpy (cur->args, args, (nargs + 1) * sizeof (struct grub_parttool_argdesc)); cur->func = func; parts = cur; return cur->handle; } void grub_parttool_unregister (int handle) { struct grub_parttool *prev = 0, *cur, *t; for (cur = parts; cur; ) if (cur->handle == handle) { grub_free (cur->args); grub_free (cur->name); if (prev) prev->next = cur->next; else parts = cur->next; t = cur; cur = cur->next; grub_free (t); } else { prev = cur; cur = cur->next; } if (! parts) grub_dl_unref (mymod); } static grub_err_t show_help (grub_device_t dev) { int found = 0; struct grub_parttool *cur; for (cur = parts; cur; cur = cur->next) if (grub_strcmp (dev->disk->partition->partmap->name, cur->name) == 0) { struct grub_parttool_argdesc *curarg; found = 1; for (curarg = cur->args; curarg->name; curarg++) { int spacing = 20; spacing -= grub_strlen (curarg->name); grub_printf ("%s", curarg->name); switch (curarg->type) { case GRUB_PARTTOOL_ARG_BOOL: grub_printf ("+/-"); spacing -= 3; break; case GRUB_PARTTOOL_ARG_VAL: grub_xputs (_("=VAL")); spacing -= 4; break; case GRUB_PARTTOOL_ARG_END: break; } while (spacing-- > 0) grub_printf (" "); grub_puts_ (curarg->desc); } } if (! found) grub_printf_ (N_("Sorry, no parttool is available for %s\n"), dev->disk->partition->partmap->name); return GRUB_ERR_NONE; } static grub_err_t grub_cmd_parttool (grub_command_t cmd __attribute__ ((unused)), int argc, char **args) { grub_device_t dev; struct grub_parttool *cur, *ptool; int *parsed; int i, j; grub_err_t err = GRUB_ERR_NONE; if (argc < 1) { grub_puts_ (helpmsg); return grub_error (GRUB_ERR_BAD_ARGUMENT, "too few arguments"); } if (args[0][0] == '(' && args[0][grub_strlen (args[0]) - 1] == ')') { args[0][grub_strlen (args[0]) - 1] = 0; dev = grub_device_open (args[0] + 1); args[0][grub_strlen (args[0]) - 1] = ')'; } else dev = grub_device_open (args[0]); if (! dev) return grub_errno; if (! dev->disk) { grub_device_close (dev); return grub_error (GRUB_ERR_BAD_ARGUMENT, "not a disk"); } if (! dev->disk->partition) { grub_device_close (dev); return grub_error (GRUB_ERR_BAD_ARGUMENT, "not a partition"); } /* Load modules. */ if (! grub_no_modules) { const char *prefix; prefix = grub_env_get ("prefix"); if (prefix) { char *filename; filename = grub_xasprintf ("%s/" GRUB_TARGET_CPU "-" GRUB_PLATFORM "/parttool.lst", prefix); if (filename) { grub_file_t file; file = grub_file_open (filename, GRUB_FILE_TYPE_GRUB_MODULE_LIST); if (file) { char *buf = 0; for (;; grub_free(buf)) { char *p, *name; buf = grub_file_getline (file); if (! buf) break; name = buf; while (grub_isspace (name[0])) name++; if (! grub_isgraph (name[0])) continue; p = grub_strchr (name, ':'); if (! p) continue; *p = '\0'; p++; while (*p == ' ' || *p == '\t') p++; if (! grub_isgraph (*p)) continue; if (grub_strcmp (name, dev->disk->partition->partmap->name) != 0) continue; grub_dl_load (p); } grub_file_close (file); } grub_free (filename); } } /* Ignore errors. */ grub_errno = GRUB_ERR_NONE; } if (argc == 1) { err = show_help (dev); grub_device_close (dev); return err; } for (i = 1; i < argc; i++) if (grub_strcmp (args[i], "help") == 0) { err = show_help (dev); grub_device_close (dev); return err; } parsed = (int *) grub_calloc (argc, sizeof (int)); for (i = 1; i < argc; i++) if (! parsed[i]) { struct grub_parttool_argdesc *curarg; struct grub_parttool_args *pargs; for (cur = parts; cur; cur = cur->next) if (grub_strcmp (dev->disk->partition->partmap->name, cur->name) == 0) { for (curarg = cur->args; curarg->name; curarg++) if (grub_strncmp (curarg->name, args[i], grub_strlen (curarg->name)) == 0 && ((curarg->type == GRUB_PARTTOOL_ARG_BOOL && (args[i][grub_strlen (curarg->name)] == '+' || args[i][grub_strlen (curarg->name)] == '-' || args[i][grub_strlen (curarg->name)] == 0)) || (curarg->type == GRUB_PARTTOOL_ARG_VAL && args[i][grub_strlen (curarg->name)] == '='))) break; if (curarg->name) break; } if (! cur) { grub_free (parsed); grub_device_close (dev); return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("unknown argument `%s'"), args[i]); } ptool = cur; pargs = (struct grub_parttool_args *) grub_calloc (ptool->nargs, sizeof (struct grub_parttool_args)); for (j = i; j < argc; j++) if (! parsed[j]) { for (curarg = ptool->args; curarg->name; curarg++) if (grub_strncmp (curarg->name, args[j], grub_strlen (curarg->name)) == 0 && ((curarg->type == GRUB_PARTTOOL_ARG_BOOL && (args[j][grub_strlen (curarg->name)] == '+' || args[j][grub_strlen (curarg->name)] == '-' || args[j][grub_strlen (curarg->name)] == 0)) || (curarg->type == GRUB_PARTTOOL_ARG_VAL && args[j][grub_strlen (curarg->name)] == '='))) { parsed[j] = 1; pargs[curarg - ptool->args].set = 1; switch (curarg->type) { case GRUB_PARTTOOL_ARG_BOOL: pargs[curarg - ptool->args].b = (args[j][grub_strlen (curarg->name)] != '-'); break; case GRUB_PARTTOOL_ARG_VAL: pargs[curarg - ptool->args].str = (args[j] + grub_strlen (curarg->name) + 1); break; case GRUB_PARTTOOL_ARG_END: break; } } } err = ptool->func (dev, pargs); grub_free (pargs); if (err) break; } grub_free (parsed); grub_device_close (dev); return err; } static grub_command_t cmd; GRUB_MOD_INIT(parttool) { mymod = mod; cmd = grub_register_command ("parttool", grub_cmd_parttool, N_("PARTITION COMMANDS"), helpmsg); } GRUB_MOD_FINI(parttool) { grub_unregister_command (cmd); } grub-2.14~git20250718.0e36779/grub-core/commands/arc/0000755000175000017500000000000015036452575016325 500000000000000grub-2.14~git20250718.0e36779/grub-core/commands/arc/lsdev.c0000644000175000017500000000303215000202015017471 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (C) 2011 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); /* Helper for grub_cmd_lsdev. */ static int grub_cmd_lsdev_iter (const char *name, const struct grub_arc_component *comp __attribute__ ((unused)), void *data __attribute__ ((unused))) { grub_printf ("%s\n", name); return 0; } static grub_err_t grub_cmd_lsdev (grub_command_t cmd __attribute__ ((unused)), int argc __attribute__ ((unused)), char **args __attribute__ ((unused))) { grub_arc_iterate_devs (grub_cmd_lsdev_iter, 0, 0); return 0; } static grub_command_t cmd; GRUB_MOD_INIT(lsdev) { cmd = grub_register_command ("lsdev", grub_cmd_lsdev, "", N_("List devices.")); } GRUB_MOD_FINI(lsdev) { grub_unregister_command (cmd); } grub-2.14~git20250718.0e36779/grub-core/commands/boottime.c0000644000175000017500000000355615033157230017462 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (C) 2013 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); static grub_err_t grub_cmd_boottime (struct grub_command *cmd __attribute__ ((unused)), int argc __attribute__ ((unused)), char *argv[] __attribute__ ((unused))) { struct grub_boot_time *cur; grub_uint64_t last_time = 0, start_time = 0; if (!grub_boot_time_head) { grub_puts_ (N_("No boot time statistics is available\n")); return 0; } start_time = last_time = grub_boot_time_head->tp; for (cur = grub_boot_time_head; cur; cur = cur->next) { grub_uint32_t tmabs = cur->tp - start_time; grub_uint32_t tmrel = cur->tp - last_time; last_time = cur->tp; grub_printf ("%3d.%03ds %2d.%03ds %s:%d %s\n", tmabs / 1000, tmabs % 1000, tmrel / 1000, tmrel % 1000, cur->file, cur->line, cur->msg); } return 0; } static grub_command_t cmd_boottime; GRUB_MOD_INIT(boottime) { cmd_boottime = grub_register_command ("boottime", grub_cmd_boottime, 0, N_("Show boot time statistics.")); } GRUB_MOD_FINI(boottime) { grub_unregister_command (cmd_boottime); } grub-2.14~git20250718.0e36779/grub-core/commands/lsacpi.c0000644000175000017500000002243115033157230017104 00000000000000/* acpi.c - Display acpi tables. */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2008 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include #include #include #pragma GCC diagnostic ignored "-Wcast-align" GRUB_MOD_LICENSE ("GPLv3+"); static void print_strn (grub_uint8_t *str, grub_size_t len) { for (; *str && len; str++, len--) grub_printf ("%c", *str); for (len++; len; len--) grub_printf (" "); } #define print_field(x) print_strn(x, sizeof (x)) static void disp_acpi_table (struct grub_acpi_table_header *t) { print_field (t->signature); grub_printf ("%4" PRIuGRUB_UINT32_T "B rev=%u chksum=0x%02x (%s) OEM=", t->length, t->revision, t->checksum, grub_byte_checksum (t, t->length) == 0 ? "valid" : "invalid"); print_field (t->oemid); print_field (t->oemtable); grub_printf ("OEMrev=%08" PRIxGRUB_UINT32_T " ", t->oemrev); print_field (t->creator_id); grub_printf (" %08" PRIxGRUB_UINT32_T "\n", t->creator_rev); } static void disp_madt_table (struct grub_acpi_madt *t) { struct grub_acpi_madt_entry_header *d; grub_uint32_t len; disp_acpi_table (&t->hdr); grub_printf ("Local APIC=%08" PRIxGRUB_UINT32_T " Flags=%08" PRIxGRUB_UINT32_T "\n", t->lapic_addr, t->flags); len = t->hdr.length - sizeof (struct grub_acpi_madt); d = t->entries; for (;len > 0; len -= d->len, d = (void *) ((grub_uint8_t *) d + d->len)) { switch (d->type) { case GRUB_ACPI_MADT_ENTRY_TYPE_LAPIC: { struct grub_acpi_madt_entry_lapic *dt = (void *) d; grub_printf (" LAPIC ACPI_ID=%02x APIC_ID=%02x Flags=%08x\n", dt->acpiid, dt->apicid, dt->flags); if (dt->hdr.len != sizeof (*dt)) grub_printf (" table size mismatch %d != %d\n", dt->hdr.len, (int) sizeof (*dt)); break; } case GRUB_ACPI_MADT_ENTRY_TYPE_IOAPIC: { struct grub_acpi_madt_entry_ioapic *dt = (void *) d; grub_printf (" IOAPIC ID=%02x address=%08x GSI=%08x\n", dt->id, dt->address, dt->global_sys_interrupt); if (dt->hdr.len != sizeof (*dt)) grub_printf (" table size mismatch %d != %d\n", dt->hdr.len, (int) sizeof (*dt)); if (dt->pad) grub_printf (" non-zero pad: %02x\n", dt->pad); break; } case GRUB_ACPI_MADT_ENTRY_TYPE_INTERRUPT_OVERRIDE: { struct grub_acpi_madt_entry_interrupt_override *dt = (void *) d; grub_printf (" Int Override bus=%x src=%x GSI=%08x Flags=%04x\n", dt->bus, dt->source, dt->global_sys_interrupt, dt->flags); if (dt->hdr.len != sizeof (*dt)) grub_printf (" table size mismatch %d != %d\n", dt->hdr.len, (int) sizeof (*dt)); } break; case GRUB_ACPI_MADT_ENTRY_TYPE_LAPIC_NMI: { struct grub_acpi_madt_entry_lapic_nmi *dt = (void *) d; grub_printf (" LAPIC_NMI ACPI_ID=%02x Flags=%04x lint=%02x\n", dt->acpiid, dt->flags, dt->lint); if (dt->hdr.len != sizeof (*dt)) grub_printf (" table size mismatch %d != %d\n", dt->hdr.len, (int) sizeof (*dt)); break; } case GRUB_ACPI_MADT_ENTRY_TYPE_SAPIC: { struct grub_acpi_madt_entry_sapic *dt = (void *) d; grub_printf (" IOSAPIC Id=%02x GSI=%08x Addr=%016" PRIxGRUB_UINT64_T "\n", dt->id, dt->global_sys_interrupt_base, dt->addr); if (dt->hdr.len != sizeof (*dt)) grub_printf (" table size mismatch %d != %d\n", dt->hdr.len, (int) sizeof (*dt)); if (dt->pad) grub_printf (" non-zero pad: %02x\n", dt->pad); } break; case GRUB_ACPI_MADT_ENTRY_TYPE_LSAPIC: { struct grub_acpi_madt_entry_lsapic *dt = (void *) d; grub_printf (" LSAPIC ProcId=%02x ID=%02x EID=%02x Flags=%x", dt->cpu_id, dt->id, dt->eid, dt->flags); if (dt->flags & GRUB_ACPI_MADT_ENTRY_SAPIC_FLAGS_ENABLED) grub_printf (" Enabled\n"); else grub_printf (" Disabled\n"); if (d->len > sizeof (struct grub_acpi_madt_entry_sapic)) grub_printf (" UID val=%08x, Str=%s\n", dt->cpu_uid, dt->cpu_uid_str); if (dt->hdr.len != sizeof (*dt) + grub_strlen ((char *) dt->cpu_uid_str) + 1) grub_printf (" table size mismatch %d != %d\n", dt->hdr.len, (int) sizeof (*dt)); if (dt->pad[0] || dt->pad[1] || dt->pad[2]) grub_printf (" non-zero pad: %02x%02x%02x\n", dt->pad[0], dt->pad[1], dt->pad[2]); } break; case GRUB_ACPI_MADT_ENTRY_TYPE_PLATFORM_INT_SOURCE: { struct grub_acpi_madt_entry_platform_int_source *dt = (void *) d; static const char * const platint_type[] = {"Nul", "PMI", "INIT", "CPEI"}; grub_printf (" Platform INT flags=%04x type=%02x (%s)" " ID=%02x EID=%02x\n", dt->flags, dt->inttype, (dt->inttype < ARRAY_SIZE (platint_type)) ? platint_type[dt->inttype] : "??", dt->cpu_id, dt->cpu_eid); grub_printf (" IOSAPIC Vec=%02x GSI=%08x source flags=%08x\n", dt->sapic_vector, dt->global_sys_int, dt->src_flags); } break; default: grub_printf (" type=%x l=%u ", d->type, d->len); grub_printf (" ??\n"); } } } static void disp_acpi_xsdt_table (struct grub_acpi_table_header *t) { grub_uint32_t len; grub_uint64_t *desc; disp_acpi_table (t); len = t->length - sizeof (*t); desc = (grub_uint64_t *) (t + 1); for (; len >= sizeof (*desc); desc++, len -= sizeof (*desc)) { #if GRUB_CPU_SIZEOF_VOID_P == 4 if (*desc >= (1ULL << 32)) { grub_printf ("Unreachable table\n"); continue; } #endif t = (struct grub_acpi_table_header *) (grub_addr_t) *desc; if (t == NULL) continue; if (grub_memcmp (t->signature, GRUB_ACPI_MADT_SIGNATURE, sizeof (t->signature)) == 0) disp_madt_table ((struct grub_acpi_madt *) t); else disp_acpi_table (t); } } static void disp_acpi_rsdt_table (struct grub_acpi_table_header *t) { grub_uint32_t len; grub_uint32_t *desc; disp_acpi_table (t); len = t->length - sizeof (*t); desc = (grub_uint32_t *) (t + 1); for (; len >= sizeof (*desc); desc++, len -= sizeof (*desc)) { t = (struct grub_acpi_table_header *) (grub_addr_t) *desc; if (t == NULL) continue; if (grub_memcmp (t->signature, GRUB_ACPI_MADT_SIGNATURE, sizeof (t->signature)) == 0) disp_madt_table ((struct grub_acpi_madt *) t); else disp_acpi_table (t); } } static void disp_acpi_rsdpv1 (struct grub_acpi_rsdp_v10 *rsdp) { print_field (rsdp->signature); grub_printf ("chksum:%02x (%s), OEM-ID: ", rsdp->checksum, grub_byte_checksum (rsdp, sizeof (*rsdp)) == 0 ? "valid" : "invalid"); print_field (rsdp->oemid); grub_printf ("rev=%d\n", rsdp->revision); grub_printf ("RSDT=%08" PRIxGRUB_UINT32_T "\n", rsdp->rsdt_addr); } static void disp_acpi_rsdpv2 (struct grub_acpi_rsdp_v20 *rsdp) { disp_acpi_rsdpv1 (&rsdp->rsdpv1); grub_printf ("len=%d chksum=%02x (%s) XSDT=%016" PRIxGRUB_UINT64_T "\n", rsdp->length, rsdp->checksum, grub_byte_checksum (rsdp, rsdp->length) == 0 ? "valid" : "invalid", rsdp->xsdt_addr); if (rsdp->length != sizeof (*rsdp)) grub_printf (" length mismatch %d != %d\n", rsdp->length, (int) sizeof (*rsdp)); if (rsdp->reserved[0] || rsdp->reserved[1] || rsdp->reserved[2]) grub_printf (" non-zero reserved %02x%02x%02x\n", rsdp->reserved[0], rsdp->reserved[1], rsdp->reserved[2]); } static const struct grub_arg_option options[] = { {"v1", '1', 0, N_("Show version 1 tables only."), 0, ARG_TYPE_NONE}, {"v2", '2', 0, N_("Show version 2 and version 3 tables only."), 0, ARG_TYPE_NONE}, {0, 0, 0, 0, 0, 0} }; static grub_err_t grub_cmd_lsacpi (struct grub_extcmd_context *ctxt, int argc __attribute__ ((unused)), char **args __attribute__ ((unused))) { if (!ctxt->state[1].set) { struct grub_acpi_rsdp_v10 *rsdp1 = grub_acpi_get_rsdpv1 (); if (!rsdp1) grub_printf ("No RSDPv1\n"); else { grub_printf ("RSDPv1 signature:"); disp_acpi_rsdpv1 (rsdp1); disp_acpi_rsdt_table ((void *) (grub_addr_t) rsdp1->rsdt_addr); } } if (!ctxt->state[0].set) { struct grub_acpi_rsdp_v20 *rsdp2 = grub_acpi_get_rsdpv2 (); if (!rsdp2) grub_printf ("No RSDPv2\n"); else { #if GRUB_CPU_SIZEOF_VOID_P == 4 if (rsdp2->xsdt_addr >= (1ULL << 32)) grub_printf ("Unreachable RSDPv2\n"); else #endif { grub_printf ("RSDPv2 signature:"); disp_acpi_rsdpv2 (rsdp2); disp_acpi_xsdt_table ((void *) (grub_addr_t) rsdp2->xsdt_addr); grub_printf ("\n"); } } } return GRUB_ERR_NONE; } static grub_extcmd_t cmd; GRUB_MOD_INIT(lsapi) { cmd = grub_register_extcmd ("lsacpi", grub_cmd_lsacpi, 0, "[-1|-2]", N_("Show ACPI information."), options); } GRUB_MOD_FINI(lsacpi) { grub_unregister_extcmd (cmd); } grub-2.14~git20250718.0e36779/grub-core/commands/nativedisk.c0000644000175000017500000001754215033157230020001 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (C) 2013 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); static const char *modnames_def[] = { /* FIXME: autogenerate this. */ #if defined (__i386__) || defined (__x86_64__) || defined (GRUB_MACHINE_MIPS_LOONGSON) "pata", "ahci", "usbms", "ohci", "uhci", "ehci" #elif defined (GRUB_MACHINE_MIPS_QEMU_MIPS) "pata" #else #error "Fill this" #endif }; static grub_err_t get_uuid (const char *name, char **uuid, int getnative) { grub_device_t dev; grub_fs_t fs = 0; *uuid = 0; dev = grub_device_open (name); if (!dev) return grub_errno; if (!dev->disk) { grub_dprintf ("nativedisk", "Skipping non-disk\n"); grub_device_close (dev); return 0; } switch (dev->disk->dev->id) { /* Firmware disks. */ case GRUB_DISK_DEVICE_BIOSDISK_ID: case GRUB_DISK_DEVICE_OFDISK_ID: case GRUB_DISK_DEVICE_OBDISK_ID: case GRUB_DISK_DEVICE_EFIDISK_ID: case GRUB_DISK_DEVICE_NAND_ID: case GRUB_DISK_DEVICE_ARCDISK_ID: case GRUB_DISK_DEVICE_HOSTDISK_ID: case GRUB_DISK_DEVICE_UBOOTDISK_ID: break; /* Native disks. */ case GRUB_DISK_DEVICE_ATA_ID: case GRUB_DISK_DEVICE_SCSI_ID: case GRUB_DISK_DEVICE_XEN: if (getnative) break; /* FALLTHROUGH */ /* Virtual disks. */ /* GRUB dynamically generated files. */ case GRUB_DISK_DEVICE_PROCFS_ID: /* To access through host OS routines (grub-emu only). */ case GRUB_DISK_DEVICE_HOST_ID: /* To access coreboot roms. */ case GRUB_DISK_DEVICE_CBFSDISK_ID: /* GRUB-only memdisk. Can't match any of firmware devices. */ case GRUB_DISK_DEVICE_MEMDISK_ID: grub_dprintf ("nativedisk", "Skipping native disk %s\n", dev->disk->name); grub_device_close (dev); return 0; /* FIXME: those probably need special handling. */ case GRUB_DISK_DEVICE_LOOPBACK_ID: case GRUB_DISK_DEVICE_DISKFILTER_ID: case GRUB_DISK_DEVICE_CRYPTODISK_ID: break; } if (dev) fs = grub_fs_probe (dev); if (!fs) { grub_device_close (dev); return grub_errno; } if (!fs->fs_uuid || fs->fs_uuid (dev, uuid) || !*uuid) { grub_device_close (dev); if (!grub_errno) grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET, N_("%s does not support UUIDs"), fs->name); return grub_errno; } grub_device_close (dev); return GRUB_ERR_NONE; } struct search_ctx { char *root_uuid; char *prefix_uuid; const char *prefix_path; int prefix_found, root_found; }; static int iterate_device (const char *name, void *data) { struct search_ctx *ctx = data; char *cur_uuid; if (get_uuid (name, &cur_uuid, 1)) { if (grub_errno == GRUB_ERR_UNKNOWN_FS) grub_errno = 0; grub_print_error (); return 0; } grub_dprintf ("nativedisk", "checking %s: %s\n", name, cur_uuid); if (ctx->prefix_uuid && grub_strcasecmp (cur_uuid, ctx->prefix_uuid) == 0) { char *prefix; prefix = grub_xasprintf ("(%s)/%s", name, ctx->prefix_path); grub_env_set ("prefix", prefix); grub_free (prefix); ctx->prefix_found = 1; } if (ctx->root_uuid && grub_strcasecmp (cur_uuid, ctx->root_uuid) == 0) { grub_env_set ("root", name); ctx->root_found = 1; } return ctx->prefix_found && ctx->root_found; } static grub_err_t grub_cmd_nativedisk (grub_command_t cmd __attribute__ ((unused)), int argc, char **args_in) { char *uuid_root = 0, *uuid_prefix, *prefdev = 0; const char *prefix = 0; const char *path_prefix = 0; int mods_loaded = 0; grub_dl_t *mods; const char **args; int i; if (argc == 0) { argc = ARRAY_SIZE (modnames_def); args = modnames_def; } else args = (const char **) args_in; prefix = grub_env_get ("prefix"); if (! prefix) return grub_error (GRUB_ERR_FILE_NOT_FOUND, N_("variable `%s' isn't set"), "prefix"); if (prefix) path_prefix = (prefix[0] == '(') ? grub_strchr (prefix, ')') : NULL; if (path_prefix) path_prefix++; else path_prefix = prefix; mods = grub_calloc (argc, sizeof (mods[0])); if (!mods) return grub_errno; if (get_uuid (NULL, &uuid_root, 0)) { grub_free (mods); return grub_errno; } prefdev = grub_file_get_device_name (prefix); if (grub_errno) { grub_print_error (); prefdev = 0; } if (get_uuid (prefdev, &uuid_prefix, 0)) { grub_free (uuid_root); grub_free (prefdev); grub_free (mods); return grub_errno; } grub_dprintf ("nativedisk", "uuid_prefix = %s, uuid_root = %s\n", uuid_prefix, uuid_root); for (mods_loaded = 0; mods_loaded < argc; mods_loaded++) { char *filename; grub_dl_t mod; grub_file_t file = NULL; grub_ssize_t size; void *core = 0; mod = grub_dl_get (args[mods_loaded]); if (mod) { mods[mods_loaded] = 0; continue; } filename = grub_xasprintf ("%s/" GRUB_TARGET_CPU "-" GRUB_PLATFORM "/%s.mod", prefix, args[mods_loaded]); if (! filename) goto fail; file = grub_file_open (filename, GRUB_FILE_TYPE_GRUB_MODULE); grub_free (filename); if (! file) goto fail; size = grub_file_size (file); core = grub_malloc (size); if (! core) { grub_file_close (file); goto fail; } if (grub_file_read (file, core, size) != (grub_ssize_t) size) { grub_file_close (file); grub_free (core); goto fail; } grub_file_close (file); mods[mods_loaded] = grub_dl_load_core_noinit (core, size); if (! mods[mods_loaded]) goto fail; } for (i = 0; i < argc; i++) if (mods[i]) grub_dl_init (mods[i]); if (uuid_prefix || uuid_root) { struct search_ctx ctx; grub_fs_autoload_hook_t saved_autoload; /* No need to autoload FS since obviously we already have the necessary fs modules. */ saved_autoload = grub_fs_autoload_hook; grub_fs_autoload_hook = 0; ctx.root_uuid = uuid_root; ctx.prefix_uuid = uuid_prefix; ctx.prefix_path = path_prefix; ctx.prefix_found = !uuid_prefix; ctx.root_found = !uuid_root; /* FIXME: try to guess the correct values. */ grub_device_iterate (iterate_device, &ctx); grub_fs_autoload_hook = saved_autoload; } grub_free (uuid_root); grub_free (uuid_prefix); grub_free (prefdev); grub_free (mods); return GRUB_ERR_NONE; fail: grub_free (uuid_root); grub_free (uuid_prefix); grub_free (prefdev); for (i = 0; i < mods_loaded; i++) if (mods[i]) { mods[i]->fini = 0; grub_dl_unload (mods[i]); } grub_free (mods); return grub_errno; } static grub_command_t cmd; GRUB_MOD_INIT(nativedisk) { cmd = grub_register_command ("nativedisk", grub_cmd_nativedisk, N_("[MODULE1 MODULE2 ...]"), N_("Switch to native disk drivers. If no modules are specified default set (pata,ahci,usbms,ohci,uhci,ehci) is used")); } GRUB_MOD_FINI(nativedisk) { grub_unregister_command (cmd); } grub-2.14~git20250718.0e36779/grub-core/commands/date.c0000644000175000017500000000713015002425525016546 00000000000000/* date.c - command to display/set current datetime. */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2008 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); #define GRUB_DATETIME_SET_YEAR 1 #define GRUB_DATETIME_SET_MONTH 2 #define GRUB_DATETIME_SET_DAY 4 #define GRUB_DATETIME_SET_HOUR 8 #define GRUB_DATETIME_SET_MINUTE 16 #define GRUB_DATETIME_SET_SECOND 32 static grub_err_t grub_cmd_date (grub_command_t cmd __attribute__ ((unused)), int argc, char **args) { struct grub_datetime datetime; int limit[6][2] = {{1980, 2079}, {1, 12}, {1, 31}, {0, 23}, {0, 59}, {0, 59}}; int value[6], mask; if (argc == 0) { if (grub_get_datetime (&datetime)) return grub_errno; grub_printf ("%d-%02d-%02d %02d:%02d:%02d %s\n", datetime.year, datetime.month, datetime.day, datetime.hour, datetime.minute, datetime.second, grub_get_weekday_name (&datetime)); return 0; } grub_memset (&value, 0, sizeof (value)); mask = 0; for (; argc; argc--, args++) { const char *p; char c; int m1, ofs, n, cur_mask; p = args[0]; m1 = grub_strtoul (p, &p, 10); c = *p; if (c == '-') ofs = 0; else if (c == ':') ofs = 3; else goto fail; value[ofs] = m1; cur_mask = (1 << ofs); mask &= ~(cur_mask * (1 + 2 + 4)); for (n = 1; (n < 3) && (*p); n++) { if (*p != c) goto fail; value[ofs + n] = grub_strtoul (p + 1, &p, 10); cur_mask |= (1 << (ofs + n)); } if (*p) goto fail; if ((ofs == 0) && (n == 2)) { value[ofs + 2] = value[ofs + 1]; value[ofs + 1] = value[ofs]; ofs++; cur_mask <<= 1; } for (; n; n--, ofs++) if ((value [ofs] < limit[ofs][0]) || (value [ofs] > limit[ofs][1])) goto fail; mask |= cur_mask; } if (grub_get_datetime (&datetime)) return grub_errno; if (mask & GRUB_DATETIME_SET_YEAR) datetime.year = value[0]; if (mask & GRUB_DATETIME_SET_MONTH) datetime.month = value[1]; if (mask & GRUB_DATETIME_SET_DAY) datetime.day = value[2]; if (mask & GRUB_DATETIME_SET_HOUR) datetime.hour = value[3]; if (mask & GRUB_DATETIME_SET_MINUTE) datetime.minute = value[4]; if (mask & GRUB_DATETIME_SET_SECOND) datetime.second = value[5]; return grub_set_datetime (&datetime); fail: return grub_error (GRUB_ERR_BAD_ARGUMENT, "invalid datetime"); } static grub_command_t cmd; GRUB_MOD_INIT(date) { cmd = grub_register_command ("date", grub_cmd_date, N_("[[year-]month-day] [hour:minute[:second]]"), N_("Display/set current datetime.")); } GRUB_MOD_FINI(date) { grub_unregister_command (cmd); } grub-2.14~git20250718.0e36779/grub-core/commands/keylayouts.c0000644000175000017500000002425415033157230020047 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (C) 2002,2003,2005,2007,2008,2009 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); static struct grub_keyboard_layout layout_us = { .keyboard_map = { /* Keyboard errors. Handled by driver. */ /* 0x00 */ 0, 0, 0, 0, /* 0x04 */ 'a', 'b', 'c', 'd', /* 0x08 */ 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', /* 0x10 */ 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', /* 0x18 */ 'u', 'v', 'w', 'x', 'y', 'z', '1', '2', /* 0x20 */ '3', '4', '5', '6', '7', '8', '9', '0', /* 0x28 */ '\n', GRUB_TERM_ESC, GRUB_TERM_BACKSPACE, GRUB_TERM_TAB, ' ', '-', '=', '[', /* According to usage table 0x31 should be mapped to '/' but testing with real keyboard shows that 0x32 is remapped to '/'. Map 0x31 to 0. */ /* 0x30 */ ']', 0, '\\', ';', '\'', '`', ',', '.', /* 0x39 is CapsLock. Handled by driver. */ /* 0x38 */ '/', 0, GRUB_TERM_KEY_F1, GRUB_TERM_KEY_F2, /* 0x3c */ GRUB_TERM_KEY_F3, GRUB_TERM_KEY_F4, /* 0x3e */ GRUB_TERM_KEY_F5, GRUB_TERM_KEY_F6, /* 0x40 */ GRUB_TERM_KEY_F7, GRUB_TERM_KEY_F8, /* 0x42 */ GRUB_TERM_KEY_F9, GRUB_TERM_KEY_F10, /* 0x44 */ GRUB_TERM_KEY_F11, GRUB_TERM_KEY_F12, /* PrtScr and ScrollLock. Not handled yet. */ /* 0x46 */ 0, 0, /* 0x48 is Pause. Not handled yet. */ /* 0x48 */ 0, GRUB_TERM_KEY_INSERT, /* 0x4a */ GRUB_TERM_KEY_HOME, GRUB_TERM_KEY_PPAGE, /* 0x4c */ GRUB_TERM_KEY_DC, GRUB_TERM_KEY_END, /* 0x4e */ GRUB_TERM_KEY_NPAGE, GRUB_TERM_KEY_RIGHT, /* 0x50 */ GRUB_TERM_KEY_LEFT, GRUB_TERM_KEY_DOWN, /* 0x53 is NumLock. Handled by driver. */ /* 0x52 */ GRUB_TERM_KEY_UP, 0, /* 0x54 */ '/', '*', /* 0x56 */ '-', '+', /* 0x58 */ '\n', GRUB_TERM_KEY_END, /* 0x5a */ GRUB_TERM_KEY_DOWN, GRUB_TERM_KEY_NPAGE, /* 0x5c */ GRUB_TERM_KEY_LEFT, GRUB_TERM_KEY_CENTER, /* 0x5e */ GRUB_TERM_KEY_RIGHT, GRUB_TERM_KEY_HOME, /* 0x60 */ GRUB_TERM_KEY_UP, GRUB_TERM_KEY_PPAGE, /* 0x62 */ GRUB_TERM_KEY_INSERT, GRUB_TERM_KEY_DC, /* 0x64 */ '\\' }, .keyboard_map_shift = { /* Keyboard errors. Handled by driver. */ /* 0x00 */ 0, 0, 0, 0, /* 0x04 */ 'A', 'B', 'C', 'D', /* 0x08 */ 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', /* 0x10 */ 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', /* 0x18 */ 'U', 'V', 'W', 'X', 'Y', 'Z', '!', '@', /* 0x20 */ '#', '$', '%', '^', '&', '*', '(', ')', /* 0x28 */ '\n' | GRUB_TERM_SHIFT, GRUB_TERM_ESC | GRUB_TERM_SHIFT, /* 0x2a */ GRUB_TERM_BACKSPACE | GRUB_TERM_SHIFT, GRUB_TERM_TAB | GRUB_TERM_SHIFT, /* 0x2c */ ' ' | GRUB_TERM_SHIFT, '_', '+', '{', /* According to usage table 0x31 should be mapped to '/' but testing with real keyboard shows that 0x32 is remapped to '/'. Map 0x31 to 0. */ /* 0x30 */ '}', 0, '|', ':', '"', '~', '<', '>', /* 0x39 is CapsLock. Handled by driver. */ /* 0x38 */ '?', 0, /* 0x3a */ GRUB_TERM_KEY_F1 | GRUB_TERM_SHIFT, /* 0x3b */ GRUB_TERM_KEY_F2 | GRUB_TERM_SHIFT, /* 0x3c */ GRUB_TERM_KEY_F3 | GRUB_TERM_SHIFT, /* 0x3d */ GRUB_TERM_KEY_F4 | GRUB_TERM_SHIFT, /* 0x3e */ GRUB_TERM_KEY_F5 | GRUB_TERM_SHIFT, /* 0x3f */ GRUB_TERM_KEY_F6 | GRUB_TERM_SHIFT, /* 0x40 */ GRUB_TERM_KEY_F7 | GRUB_TERM_SHIFT, /* 0x41 */ GRUB_TERM_KEY_F8 | GRUB_TERM_SHIFT, /* 0x42 */ GRUB_TERM_KEY_F9 | GRUB_TERM_SHIFT, /* 0x43 */ GRUB_TERM_KEY_F10 | GRUB_TERM_SHIFT, /* 0x44 */ GRUB_TERM_KEY_F11 | GRUB_TERM_SHIFT, /* 0x45 */ GRUB_TERM_KEY_F12 | GRUB_TERM_SHIFT, /* PrtScr and ScrollLock. Not handled yet. */ /* 0x46 */ 0, 0, /* 0x48 is Pause. Not handled yet. */ /* 0x48 */ 0, GRUB_TERM_KEY_INSERT | GRUB_TERM_SHIFT, /* 0x4a */ GRUB_TERM_KEY_HOME | GRUB_TERM_SHIFT, /* 0x4b */ GRUB_TERM_KEY_PPAGE | GRUB_TERM_SHIFT, /* 0x4c */ GRUB_TERM_KEY_DC | GRUB_TERM_SHIFT, /* 0x4d */ GRUB_TERM_KEY_END | GRUB_TERM_SHIFT, /* 0x4e */ GRUB_TERM_KEY_NPAGE | GRUB_TERM_SHIFT, /* 0x4f */ GRUB_TERM_KEY_RIGHT | GRUB_TERM_SHIFT, /* 0x50 */ GRUB_TERM_KEY_LEFT | GRUB_TERM_SHIFT, /* 0x51 */ GRUB_TERM_KEY_DOWN | GRUB_TERM_SHIFT, /* 0x53 is NumLock. Handled by driver. */ /* 0x52 */ GRUB_TERM_KEY_UP | GRUB_TERM_SHIFT, 0, /* 0x54 */ '/', '*', /* 0x56 */ '-', '+', /* 0x58 */ '\n' | GRUB_TERM_SHIFT, '1', '2', '3', '4', '5','6', '7', /* 0x60 */ '8', '9', '0', '.', '|' } }; static struct grub_keyboard_layout *grub_current_layout = &layout_us; static int map_key_core (int code, int status, int *alt_gr_consumed) { *alt_gr_consumed = 0; if (code >= GRUB_KEYBOARD_LAYOUTS_ARRAY_SIZE) return 0; if (status & GRUB_TERM_STATUS_RALT) { if (status & (GRUB_TERM_STATUS_LSHIFT | GRUB_TERM_STATUS_RSHIFT)) { if (grub_current_layout->keyboard_map_shift_l3[code]) { *alt_gr_consumed = 1; return grub_current_layout->keyboard_map_shift_l3[code]; } } else if (grub_current_layout->keyboard_map_l3[code]) { *alt_gr_consumed = 1; return grub_current_layout->keyboard_map_l3[code]; } } if (status & (GRUB_TERM_STATUS_LSHIFT | GRUB_TERM_STATUS_RSHIFT)) return grub_current_layout->keyboard_map_shift[code]; else return grub_current_layout->keyboard_map[code]; } unsigned grub_term_map_key (grub_keyboard_key_t code, int status) { int alt_gr_consumed = 0; int key; if (code >= 0x59 && code <= 0x63 && (status & GRUB_TERM_STATUS_NUM)) { if (status & (GRUB_TERM_STATUS_RSHIFT | GRUB_TERM_STATUS_LSHIFT)) status &= ~(GRUB_TERM_STATUS_RSHIFT | GRUB_TERM_STATUS_LSHIFT); else status |= GRUB_TERM_STATUS_RSHIFT; } key = map_key_core (code, status, &alt_gr_consumed); if (key == 0 || key == GRUB_TERM_SHIFT) { grub_printf ("Unknown key 0x%x detected\n", code); return GRUB_TERM_NO_KEY; } if (status & GRUB_TERM_STATUS_CAPS) { if ((key >= 'a') && (key <= 'z')) key += 'A' - 'a'; else if ((key >= 'A') && (key <= 'Z')) key += 'a' - 'A'; } if ((status & GRUB_TERM_STATUS_LALT) || ((status & GRUB_TERM_STATUS_RALT) && !alt_gr_consumed)) key |= GRUB_TERM_ALT; if (status & (GRUB_TERM_STATUS_LCTRL | GRUB_TERM_STATUS_RCTRL)) key |= GRUB_TERM_CTRL; return key; } static grub_err_t grub_cmd_keymap (struct grub_command *cmd __attribute__ ((unused)), int argc, char *argv[]) { char *filename; grub_file_t file; grub_uint32_t version; grub_uint8_t magic[GRUB_KEYBOARD_LAYOUTS_FILEMAGIC_SIZE]; struct grub_keyboard_layout *newmap = NULL; unsigned i; if (argc < 1) return grub_error (GRUB_ERR_BAD_ARGUMENT, "file or layout name required"); if (argv[0][0] != '(' && argv[0][0] != '/' && argv[0][0] != '+') { const char *prefix = grub_env_get ("prefix"); if (!prefix) return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("variable `%s' isn't set"), "prefix"); filename = grub_xasprintf ("%s/layouts/%s.gkb", prefix, argv[0]); if (!filename) return grub_errno; } else filename = argv[0]; file = grub_file_open (filename, GRUB_FILE_TYPE_KEYBOARD_LAYOUT); if (! file) goto fail; if (grub_file_read (file, magic, sizeof (magic)) != sizeof (magic)) { if (!grub_errno) grub_error (GRUB_ERR_BAD_ARGUMENT, N_("premature end of file %s"), filename); goto fail; } if (grub_memcmp (magic, GRUB_KEYBOARD_LAYOUTS_FILEMAGIC, GRUB_KEYBOARD_LAYOUTS_FILEMAGIC_SIZE) != 0) { grub_error (GRUB_ERR_BAD_ARGUMENT, "invalid magic"); goto fail; } if (grub_file_read (file, &version, sizeof (version)) != sizeof (version)) { if (!grub_errno) grub_error (GRUB_ERR_BAD_ARGUMENT, N_("premature end of file %s"), filename); goto fail; } if (version != grub_cpu_to_le32_compile_time (GRUB_KEYBOARD_LAYOUTS_VERSION)) { grub_error (GRUB_ERR_BAD_ARGUMENT, "invalid version"); goto fail; } newmap = grub_malloc (sizeof (*newmap)); if (!newmap) goto fail; if (grub_file_read (file, newmap, sizeof (*newmap)) != sizeof (*newmap)) { if (!grub_errno) grub_error (GRUB_ERR_BAD_ARGUMENT, N_("premature end of file %s"), filename); goto fail; } for (i = 0; i < ARRAY_SIZE (newmap->keyboard_map); i++) newmap->keyboard_map[i] = grub_le_to_cpu32(newmap->keyboard_map[i]); for (i = 0; i < ARRAY_SIZE (newmap->keyboard_map_shift); i++) newmap->keyboard_map_shift[i] = grub_le_to_cpu32(newmap->keyboard_map_shift[i]); for (i = 0; i < ARRAY_SIZE (newmap->keyboard_map_l3); i++) newmap->keyboard_map_l3[i] = grub_le_to_cpu32(newmap->keyboard_map_l3[i]); for (i = 0; i < ARRAY_SIZE (newmap->keyboard_map_shift_l3); i++) newmap->keyboard_map_shift_l3[i] = grub_le_to_cpu32(newmap->keyboard_map_shift_l3[i]); grub_current_layout = newmap; return GRUB_ERR_NONE; fail: if (filename != argv[0]) grub_free (filename); grub_free (newmap); if (file) grub_file_close (file); return grub_errno; } static grub_command_t cmd; GRUB_MOD_INIT(keylayouts) { cmd = grub_register_command ("keymap", grub_cmd_keymap, 0, N_("Load a keyboard layout.")); } GRUB_MOD_FINI(keylayouts) { grub_unregister_command (cmd); } grub-2.14~git20250718.0e36779/grub-core/commands/videoinfo.c0000644000175000017500000001654215033157230017621 00000000000000/* videoinfo.c - command to list video modes. */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2005,2007,2008,2009,2010 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); struct hook_ctx { unsigned height, width, depth; struct grub_video_mode_info *current_mode; }; static int hook (const struct grub_video_mode_info *info, void *hook_arg) { struct hook_ctx *ctx = hook_arg; if (ctx->height && ctx->width && (info->width != ctx->width || info->height != ctx->height)) return 0; if (ctx->depth && info->bpp != ctx->depth) return 0; if (info->mode_number == GRUB_VIDEO_MODE_NUMBER_INVALID) grub_printf (" "); else { if (ctx->current_mode && info->mode_number == ctx->current_mode->mode_number) grub_printf ("*"); else grub_printf (" "); grub_printf (" 0x%03x ", info->mode_number); } grub_printf ("%4d x %4d x %2d (%4d) ", info->width, info->height, info->bpp, info->pitch); if (info->mode_type & GRUB_VIDEO_MODE_TYPE_PURE_TEXT) grub_xputs (_("Text-only ")); /* Show mask and position details for direct color modes. */ if (info->mode_type & GRUB_VIDEO_MODE_TYPE_RGB) /* TRANSLATORS: "Direct color" is a mode when the color components are written dirrectly into memory. */ grub_printf_ (N_("Direct color, mask: %d/%d/%d/%d pos: %d/%d/%d/%d"), info->red_mask_size, info->green_mask_size, info->blue_mask_size, info->reserved_mask_size, info->red_field_pos, info->green_field_pos, info->blue_field_pos, info->reserved_field_pos); if (info->mode_type & GRUB_VIDEO_MODE_TYPE_INDEX_COLOR) /* TRANSLATORS: In "paletted color" mode you write the index of the color in the palette. Synonyms include "packed pixel". */ grub_xputs (_("Paletted ")); if (info->mode_type & GRUB_VIDEO_MODE_TYPE_YUV) grub_xputs (_("YUV ")); if (info->mode_type & GRUB_VIDEO_MODE_TYPE_PLANAR) /* TRANSLATORS: "Planar" is the video memory where you have to write in several different banks "plans" to control the different color components of the same pixel. */ grub_xputs (_("Planar ")); if (info->mode_type & GRUB_VIDEO_MODE_TYPE_HERCULES) grub_xputs (_("Hercules ")); if (info->mode_type & GRUB_VIDEO_MODE_TYPE_CGA) grub_xputs (_("CGA ")); if (info->mode_type & GRUB_VIDEO_MODE_TYPE_NONCHAIN4) /* TRANSLATORS: Non-chain 4 is a 256-color planar (unchained) video memory mode. */ grub_xputs (_("Non-chain 4 ")); if (info->mode_type & GRUB_VIDEO_MODE_TYPE_1BIT_BITMAP) grub_xputs (_("Monochrome ")); if (info->mode_type & GRUB_VIDEO_MODE_TYPE_UNKNOWN) grub_xputs (_("Unknown video mode ")); grub_xputs ("\n"); return 0; } static void print_edid (struct grub_video_edid_info *edid_info) { unsigned int edid_width, edid_height; if (grub_video_edid_checksum (edid_info)) { grub_puts_ (N_(" EDID checksum invalid")); grub_errno = GRUB_ERR_NONE; return; } grub_printf_ (N_(" EDID version: %u.%u\n"), edid_info->version, edid_info->revision); if (grub_video_edid_preferred_mode (edid_info, &edid_width, &edid_height) == GRUB_ERR_NONE) grub_printf_ (N_(" Preferred mode: %ux%u\n"), edid_width, edid_height); else { grub_printf_ (N_(" No preferred mode available\n")); grub_errno = GRUB_ERR_NONE; } } static grub_err_t grub_cmd_videoinfo (grub_command_t cmd __attribute__ ((unused)), int argc, char **args) { grub_video_adapter_t adapter; grub_video_driver_id_t id; struct hook_ctx ctx; ctx.height = ctx.width = ctx.depth = 0; if (argc) { const char *ptr; ptr = args[0]; ctx.width = grub_strtoul (ptr, &ptr, 0); if (grub_errno) return grub_errno; if (*ptr != 'x') return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("invalid video mode specification `%s'"), args[0]); ptr++; ctx.height = grub_strtoul (ptr, &ptr, 0); if (grub_errno) return grub_errno; if (*ptr == 'x') { ptr++; ctx.depth = grub_strtoul (ptr, &ptr, 0); if (grub_errno) return grub_errno; } } #ifdef GRUB_MACHINE_PCBIOS if (grub_strcmp (cmd->name, "vbeinfo") == 0) grub_dl_load ("vbe"); #endif id = grub_video_get_driver_id (); grub_puts_ (N_("List of supported video modes:")); grub_puts_ (N_("Legend: mask/position=red/green/blue/reserved")); FOR_VIDEO_ADAPTERS (adapter) { struct grub_video_mode_info info; struct grub_video_edid_info edid_info; grub_printf_ (N_("Adapter `%s':\n"), adapter->name); if (!adapter->iterate) { grub_puts_ (N_(" No info available")); continue; } ctx.current_mode = NULL; if (adapter->id == id) { if (grub_video_get_info (&info) == GRUB_ERR_NONE) ctx.current_mode = &info; else /* Don't worry about errors. */ grub_errno = GRUB_ERR_NONE; } else if (id != GRUB_VIDEO_DRIVER_NONE) { grub_puts_ (N_(" A video driver is active, cannot initialize this driver until it is deactivated\n")); continue; } else { if (adapter->init ()) { grub_puts_ (N_(" Failed to initialize video adapter")); grub_errno = GRUB_ERR_NONE; continue; } } if (adapter->print_adapter_specific_info) adapter->print_adapter_specific_info (); adapter->iterate (hook, &ctx); if (adapter->get_edid && adapter->get_edid (&edid_info) == GRUB_ERR_NONE) print_edid (&edid_info); else grub_errno = GRUB_ERR_NONE; ctx.current_mode = NULL; if (adapter->id != id) { if (adapter->fini ()) { grub_errno = GRUB_ERR_NONE; continue; } } } return GRUB_ERR_NONE; } static grub_command_t cmd; #ifdef GRUB_MACHINE_PCBIOS static grub_command_t cmd_vbe; #endif GRUB_MOD_INIT(videoinfo) { cmd = grub_register_command ("videoinfo", grub_cmd_videoinfo, /* TRANSLATORS: "x" has to be entered in, like an identifier, so please don't use better Unicode codepoints. */ N_("[WxH[xD]]"), N_("List available video modes. If " "resolution is given show only modes" " matching it.")); #ifdef GRUB_MACHINE_PCBIOS cmd_vbe = grub_register_command ("vbeinfo", grub_cmd_videoinfo, /* TRANSLATORS: "x" has to be entered in, like an identifier, so please don't use better Unicode codepoints. */ N_("[WxH[xD]]"), N_("List available video modes. If " "resolution is given show only modes" " matching it.")); #endif } GRUB_MOD_FINI(videoinfo) { grub_unregister_command (cmd); #ifdef GRUB_MACHINE_PCBIOS grub_unregister_command (cmd_vbe); #endif } grub-2.14~git20250718.0e36779/grub-core/commands/legacycfg.c0000644000175000017500000005243615036447510017573 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (C) 2000, 2001, 2010 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); /* Helper for legacy_file. */ static grub_err_t legacy_file_getline (char **line, int cont __attribute__ ((unused)), void *data __attribute__ ((unused))) { *line = 0; return GRUB_ERR_NONE; } static grub_err_t legacy_file (const char *filename) { grub_file_t file; char *entryname = NULL, *entrysrc = NULL; grub_menu_t menu; char *suffix = grub_strdup (""); if (!suffix) return grub_errno; file = grub_file_open (filename, GRUB_FILE_TYPE_CONFIG); if (! file) { grub_free (suffix); return grub_errno; } menu = grub_env_get_menu (); if (! menu) { menu = grub_zalloc (sizeof (*menu)); if (! menu) { grub_free (suffix); return grub_errno; } grub_env_set_menu (menu); } while (1) { char *buf = grub_file_getline (file); char *parsed = NULL; if (!buf && grub_errno) { grub_file_close (file); grub_free (suffix); return grub_errno; } if (!buf) break; { char *oldname = NULL; char *newsuffix; char *ptr; for (ptr = buf; *ptr && grub_isspace (*ptr); ptr++); oldname = entryname; parsed = grub_legacy_parse (ptr, &entryname, &newsuffix); grub_free (buf); buf = NULL; if (newsuffix) { char *t; grub_size_t sz; if (grub_add (grub_strlen (suffix), grub_strlen (newsuffix), &sz) || grub_add (sz, 1, &sz)) { grub_errno = GRUB_ERR_OUT_OF_RANGE; goto fail_0; } t = suffix; suffix = grub_realloc (suffix, sz); if (!suffix) { grub_free (t); fail_0: grub_free (entrysrc); grub_free (parsed); grub_free (newsuffix); grub_free (suffix); return grub_errno; } grub_memcpy (suffix + grub_strlen (suffix), newsuffix, grub_strlen (newsuffix) + 1); grub_free (newsuffix); newsuffix = NULL; } if (oldname != entryname && oldname) { const char **args = grub_malloc (sizeof (args[0])); if (!args) { grub_file_close (file); return grub_errno; } args[0] = oldname; grub_normal_add_menu_entry (1, args, NULL, NULL, "legacy", NULL, NULL, entrysrc, 0); grub_free (args); entrysrc[0] = 0; grub_free (oldname); } } if (parsed && !entryname) { grub_normal_parse_line (parsed, legacy_file_getline, NULL); grub_print_error (); grub_free (parsed); parsed = NULL; } else if (parsed) { if (!entrysrc) entrysrc = parsed; else { char *t; grub_size_t sz; if (grub_add (grub_strlen (entrysrc), grub_strlen (parsed), &sz) || grub_add (sz, 1, &sz)) { grub_errno = GRUB_ERR_OUT_OF_RANGE; goto fail_1; } t = entrysrc; entrysrc = grub_realloc (entrysrc, sz); if (!entrysrc) { grub_free (t); fail_1: grub_free (parsed); grub_free (suffix); return grub_errno; } grub_memcpy (entrysrc + grub_strlen (entrysrc), parsed, grub_strlen (parsed) + 1); grub_free (parsed); parsed = NULL; } } } grub_file_close (file); if (entryname) { const char **args = grub_malloc (sizeof (args[0])); if (!args) { grub_free (suffix); grub_free (entrysrc); return grub_errno; } args[0] = entryname; grub_normal_add_menu_entry (1, args, NULL, NULL, NULL, NULL, NULL, entrysrc, 0); grub_free (args); } grub_normal_parse_line (suffix, legacy_file_getline, NULL); grub_print_error (); grub_free (suffix); grub_free (entrysrc); return GRUB_ERR_NONE; } static grub_err_t grub_cmd_legacy_source (struct grub_command *cmd, int argc, char **args) { int new_env, extractor; grub_err_t ret; if (argc != 1) return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected")); extractor = (cmd->name[0] == 'e'); new_env = (cmd->name[extractor ? (sizeof ("extract_legacy_entries_") - 1) : (sizeof ("legacy_") - 1)] == 'c'); if (new_env) grub_cls (); if (new_env && !extractor) grub_env_context_open (); if (extractor) grub_env_extractor_open (!new_env); ret = legacy_file (args[0]); if (new_env) { grub_menu_t menu; menu = grub_env_get_menu (); if (menu && menu->size) grub_show_menu (menu, 1, 0); if (!extractor) grub_env_context_close (); } if (extractor) grub_env_extractor_close (!new_env); return ret; } static enum { GUESS_IT, LINUX, MULTIBOOT, KFREEBSD, KNETBSD, KOPENBSD } kernel_type; static grub_err_t grub_cmd_legacy_kernel (struct grub_command *mycmd __attribute__ ((unused)), int argc, char **args) { int i; #ifdef TODO int no_mem_option = 0; #endif struct grub_command *cmd; char **cutargs; int cutargc; grub_err_t err = GRUB_ERR_NONE; for (i = 0; i < 2; i++) { /* FIXME: really support this. */ if (argc >= 1 && grub_strcmp (args[0], "--no-mem-option") == 0) { #ifdef TODO no_mem_option = 1; #endif argc--; args++; continue; } /* linux16 handles both zImages and bzImages. */ if (argc >= 1 && (grub_strcmp (args[0], "--type=linux") == 0 || grub_strcmp (args[0], "--type=biglinux") == 0)) { kernel_type = LINUX; argc--; args++; continue; } if (argc >= 1 && grub_strcmp (args[0], "--type=multiboot") == 0) { kernel_type = MULTIBOOT; argc--; args++; continue; } if (argc >= 1 && grub_strcmp (args[0], "--type=freebsd") == 0) { kernel_type = KFREEBSD; argc--; args++; continue; } if (argc >= 1 && grub_strcmp (args[0], "--type=openbsd") == 0) { kernel_type = KOPENBSD; argc--; args++; continue; } if (argc >= 1 && grub_strcmp (args[0], "--type=netbsd") == 0) { kernel_type = KNETBSD; argc--; args++; continue; } } if (argc < 2) return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected")); cutargs = grub_calloc (argc - 1, sizeof (cutargs[0])); if (!cutargs) return grub_errno; cutargc = argc - 1; grub_memcpy (cutargs + 1, args + 2, sizeof (cutargs[0]) * (argc - 2)); cutargs[0] = args[0]; do { /* First try Linux. */ if (kernel_type == GUESS_IT || kernel_type == LINUX) { #ifdef GRUB_MACHINE_PCBIOS cmd = grub_command_find ("linux16"); #else cmd = grub_command_find ("linux"); #endif if (cmd) { if (!(cmd->func) (cmd, cutargc, cutargs)) { kernel_type = LINUX; goto out; } } grub_errno = GRUB_ERR_NONE; } /* Then multiboot. */ if (kernel_type == GUESS_IT || kernel_type == MULTIBOOT) { cmd = grub_command_find ("multiboot"); if (cmd) { if (!(cmd->func) (cmd, argc, args)) { kernel_type = MULTIBOOT; goto out; } } grub_errno = GRUB_ERR_NONE; } { int bsd_device = -1; int bsd_slice = -1; int bsd_part = -1; { grub_device_t dev; const char *hdbiasstr; int hdbias = 0; hdbiasstr = grub_env_get ("legacy_hdbias"); if (hdbiasstr) { hdbias = grub_strtoul (hdbiasstr, 0, 0); grub_errno = GRUB_ERR_NONE; } dev = grub_device_open (0); if (dev && dev->disk && dev->disk->dev->id == GRUB_DISK_DEVICE_BIOSDISK_ID && dev->disk->id >= 0x80 && dev->disk->id <= 0x90) { struct grub_partition *part = dev->disk->partition; bsd_device = dev->disk->id - 0x80 - hdbias; if (part && (grub_strcmp (part->partmap->name, "netbsd") == 0 || grub_strcmp (part->partmap->name, "openbsd") == 0 || grub_strcmp (part->partmap->name, "bsd") == 0)) { bsd_part = part->number; part = part->parent; } if (part && grub_strcmp (part->partmap->name, "msdos") == 0) bsd_slice = part->number; } if (dev) grub_device_close (dev); } /* k*BSD didn't really work well with grub-legacy. */ if (kernel_type == GUESS_IT || kernel_type == KFREEBSD) { char buf[sizeof("adXXXXXXXXXXXXsXXXXXXXXXXXXYYY")]; if (bsd_device != -1) { if (bsd_slice != -1 && bsd_part != -1) grub_snprintf(buf, sizeof(buf), "ad%ds%d%c", bsd_device, bsd_slice, 'a' + bsd_part); else if (bsd_slice != -1) grub_snprintf(buf, sizeof(buf), "ad%ds%d", bsd_device, bsd_slice); else grub_snprintf(buf, sizeof(buf), "ad%d", bsd_device); grub_env_set ("kFreeBSD.vfs.root.mountfrom", buf); } else grub_env_unset ("kFreeBSD.vfs.root.mountfrom"); cmd = grub_command_find ("kfreebsd"); if (cmd) { if (!(cmd->func) (cmd, cutargc, cutargs)) { kernel_type = KFREEBSD; goto out; } } grub_errno = GRUB_ERR_NONE; } { char **bsdargs; int bsdargc; char bsddevname[sizeof ("wdXXXXXXXXXXXXY")]; int found = 0; if (bsd_device == -1) { bsdargs = cutargs; bsdargc = cutargc; } else { char rbuf[3] = "-r"; bsdargc = cutargc + 2; bsdargs = grub_calloc (bsdargc, sizeof (bsdargs[0])); if (!bsdargs) { err = grub_errno; goto out; } grub_memcpy (bsdargs, args, argc * sizeof (bsdargs[0])); bsdargs[argc] = rbuf; bsdargs[argc + 1] = bsddevname; grub_snprintf (bsddevname, sizeof (bsddevname), "wd%d%c", bsd_device, bsd_part != -1 ? bsd_part + 'a' : 'c'); } if (kernel_type == GUESS_IT || kernel_type == KNETBSD) { cmd = grub_command_find ("knetbsd"); if (cmd) { if (!(cmd->func) (cmd, bsdargc, bsdargs)) { kernel_type = KNETBSD; found = 1; goto free_bsdargs; } } grub_errno = GRUB_ERR_NONE; } if (kernel_type == GUESS_IT || kernel_type == KOPENBSD) { cmd = grub_command_find ("kopenbsd"); if (cmd) { if (!(cmd->func) (cmd, bsdargc, bsdargs)) { kernel_type = KOPENBSD; found = 1; goto free_bsdargs; } } grub_errno = GRUB_ERR_NONE; } free_bsdargs: if (bsdargs != cutargs) grub_free (bsdargs); if (found) goto out; } } } while (0); err = grub_error (GRUB_ERR_BAD_OS, "couldn't load file %s", args[0]); out: grub_free (cutargs); return err; } static grub_err_t grub_cmd_legacy_initrd (struct grub_command *mycmd __attribute__ ((unused)), int argc, char **args) { struct grub_command *cmd; if (kernel_type == LINUX) { #ifdef GRUB_MACHINE_PCBIOS cmd = grub_command_find ("initrd16"); #else cmd = grub_command_find ("initrd"); #endif if (!cmd) return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("can't find command `%s'"), #ifdef GRUB_MACHINE_PCBIOS "initrd16" #else "initrd" #endif ); return cmd->func (cmd, argc ? 1 : 0, args); } if (kernel_type == MULTIBOOT) { cmd = grub_command_find ("module"); if (!cmd) return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("can't find command `%s'"), "module"); return cmd->func (cmd, argc, args); } return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("you need to load the kernel first")); } static grub_err_t grub_cmd_legacy_initrdnounzip (struct grub_command *mycmd __attribute__ ((unused)), int argc, char **args) { struct grub_command *cmd; if (kernel_type == LINUX) { cmd = grub_command_find ("initrd16"); if (!cmd) return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("can't find command `%s'"), "initrd16"); return cmd->func (cmd, argc, args); } if (kernel_type == MULTIBOOT) { char **newargs; grub_err_t err; char nounzipbuf[10] = "--nounzip"; cmd = grub_command_find ("module"); if (!cmd) return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("can't find command `%s'"), "module"); newargs = grub_calloc (argc + 1, sizeof (newargs[0])); if (!newargs) return grub_errno; grub_memcpy (newargs + 1, args, argc * sizeof (newargs[0])); newargs[0] = nounzipbuf; err = cmd->func (cmd, argc + 1, newargs); grub_free (newargs); return err; } return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("you need to load the kernel first")); } static grub_err_t check_password_deny (const char *user __attribute__ ((unused)), const char *entered __attribute__ ((unused)), void *password __attribute__ ((unused))) { return GRUB_ACCESS_DENIED; } #define MD5_HASHLEN 16 struct legacy_md5_password { grub_uint8_t *salt; int saltlen; grub_uint8_t hash[MD5_HASHLEN]; }; static int check_password_md5_real (const char *entered, struct legacy_md5_password *pw) { grub_size_t enteredlen = grub_strlen (entered); unsigned char alt_result[MD5_HASHLEN]; unsigned char *digest; grub_uint8_t *ctx; grub_size_t i; int ret; ctx = grub_zalloc (GRUB_MD_MD5->contextsize); if (!ctx) return 0; GRUB_MD_MD5->init (ctx, 0); GRUB_MD_MD5->write (ctx, entered, enteredlen); GRUB_MD_MD5->write (ctx, pw->salt + 3, pw->saltlen - 3); GRUB_MD_MD5->write (ctx, entered, enteredlen); digest = GRUB_MD_MD5->read (ctx); GRUB_MD_MD5->final (ctx); grub_memcpy (alt_result, digest, MD5_HASHLEN); GRUB_MD_MD5->init (ctx, 0); GRUB_MD_MD5->write (ctx, entered, enteredlen); GRUB_MD_MD5->write (ctx, pw->salt, pw->saltlen); /* include the $1$ header */ for (i = enteredlen; i > 16; i -= 16) GRUB_MD_MD5->write (ctx, alt_result, 16); GRUB_MD_MD5->write (ctx, alt_result, i); for (i = enteredlen; i > 0; i >>= 1) GRUB_MD_MD5->write (ctx, entered + ((i & 1) ? enteredlen : 0), 1); digest = GRUB_MD_MD5->read (ctx); GRUB_MD_MD5->final (ctx); for (i = 0; i < 1000; i++) { grub_memcpy (alt_result, digest, 16); GRUB_MD_MD5->init (ctx, 0); if ((i & 1) != 0) GRUB_MD_MD5->write (ctx, entered, enteredlen); else GRUB_MD_MD5->write (ctx, alt_result, 16); if (i % 3 != 0) GRUB_MD_MD5->write (ctx, pw->salt + 3, pw->saltlen - 3); if (i % 7 != 0) GRUB_MD_MD5->write (ctx, entered, enteredlen); if ((i & 1) != 0) GRUB_MD_MD5->write (ctx, alt_result, 16); else GRUB_MD_MD5->write (ctx, entered, enteredlen); digest = GRUB_MD_MD5->read (ctx); GRUB_MD_MD5->final (ctx); } ret = (grub_crypto_memcmp (digest, pw->hash, MD5_HASHLEN) == 0); grub_free (ctx); return ret; } static grub_err_t check_password_md5 (const char *user, const char *entered, void *password) { if (!check_password_md5_real (entered, password)) return GRUB_ACCESS_DENIED; grub_auth_authenticate (user); return GRUB_ERR_NONE; } static inline int ib64t (char c) { if (c == '.') return 0; if (c == '/') return 1; if (c >= '0' && c <= '9') return c - '0' + 2; if (c >= 'A' && c <= 'Z') return c - 'A' + 12; if (c >= 'a' && c <= 'z') return c - 'a' + 38; return -1; } static struct legacy_md5_password * parse_legacy_md5 (int argc, char **args) { const char *salt, *saltend; struct legacy_md5_password *pw = NULL; int i; const char *p; if (grub_memcmp (args[0], "--md5", sizeof ("--md5")) != 0) goto fail; if (argc == 1) goto fail; if (grub_strlen(args[1]) <= 3) goto fail; salt = args[1]; saltend = grub_strchr (salt + 3, '$'); if (!saltend) goto fail; pw = grub_malloc (sizeof (*pw)); if (!pw) goto fail; p = saltend + 1; for (i = 0; i < 5; i++) { int n; grub_uint32_t w = 0; for (n = 0; n < 4; n++) { int ww = ib64t(*p++); if (ww == -1) goto fail; w |= ww << (n * 6); } pw->hash[i == 4 ? 5 : 12+i] = w & 0xff; pw->hash[6+i] = (w >> 8) & 0xff; pw->hash[i] = (w >> 16) & 0xff; } { int n; grub_uint32_t w = 0; for (n = 0; n < 2; n++) { int ww = ib64t(*p++); if (ww == -1) goto fail; w |= ww << (6 * n); } if (w >= 0x100) goto fail; pw->hash[11] = w; } pw->saltlen = saltend - salt; pw->salt = (grub_uint8_t *) grub_strndup (salt, pw->saltlen); if (!pw->salt) goto fail; return pw; fail: grub_free (pw); return NULL; } static grub_err_t grub_cmd_legacy_password (struct grub_command *mycmd __attribute__ ((unused)), int argc, char **args) { struct legacy_md5_password *pw = NULL; if (argc == 0) return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("one argument expected")); if (args[0][0] != '-' || args[0][1] != '-') return grub_normal_set_password ("legacy", args[0]); pw = parse_legacy_md5 (argc, args); if (pw) return grub_auth_register_authentication ("legacy", check_password_md5, pw); else /* This is to imitate minor difference between grub-legacy in GRUB2. If 2 password commands are executed in a row and second one fails on GRUB2 the password of first one is used, whereas in grub-legacy authenthication is denied. In case of no password command was executed early both versions deny any access. */ return grub_auth_register_authentication ("legacy", check_password_deny, NULL); } int grub_legacy_check_md5_password (int argc, char **args, char *entered) { struct legacy_md5_password *pw = NULL; int ret; if (args[0][0] != '-' || args[0][1] != '-') { char correct[GRUB_AUTH_MAX_PASSLEN]; grub_memset (correct, 0, sizeof (correct)); grub_strncpy (correct, args[0], sizeof (correct)); return grub_crypto_memcmp (entered, correct, GRUB_AUTH_MAX_PASSLEN) == 0; } pw = parse_legacy_md5 (argc, args); if (!pw) return 0; ret = check_password_md5_real (entered, pw); grub_free (pw); return ret; } static grub_err_t grub_cmd_legacy_check_password (struct grub_command *mycmd __attribute__ ((unused)), int argc, char **args) { char entered[GRUB_AUTH_MAX_PASSLEN]; if (argc == 0) return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("one argument expected")); grub_puts_ (N_("Enter password: ")); if (!grub_password_get (entered, GRUB_AUTH_MAX_PASSLEN)) return GRUB_ACCESS_DENIED; if (!grub_legacy_check_md5_password (argc, args, entered)) return GRUB_ACCESS_DENIED; return GRUB_ERR_NONE; } static grub_command_t cmd_source, cmd_configfile; static grub_command_t cmd_source_extract, cmd_configfile_extract; static grub_command_t cmd_kernel, cmd_initrd, cmd_initrdnounzip; static grub_command_t cmd_password, cmd_check_password; GRUB_MOD_INIT(legacycfg) { cmd_source = grub_register_command ("legacy_source", grub_cmd_legacy_source, N_("FILE"), /* TRANSLATORS: "legacy config" means "config as used by grub-legacy". */ N_("Parse legacy config in same context")); cmd_configfile = grub_register_command ("legacy_configfile", grub_cmd_legacy_source, N_("FILE"), N_("Parse legacy config in new context")); cmd_source_extract = grub_register_command ("extract_legacy_entries_source", grub_cmd_legacy_source, N_("FILE"), N_("Parse legacy config in same context taking only menu entries")); cmd_configfile_extract = grub_register_command ("extract_legacy_entries_configfile", grub_cmd_legacy_source, N_("FILE"), N_("Parse legacy config in new context taking only menu entries")); cmd_kernel = grub_register_command ("legacy_kernel", grub_cmd_legacy_kernel, N_("[--no-mem-option] [--type=TYPE] FILE [ARG ...]"), N_("Simulate grub-legacy `kernel' command")); cmd_initrd = grub_register_command ("legacy_initrd", grub_cmd_legacy_initrd, N_("FILE [ARG ...]"), N_("Simulate grub-legacy `initrd' command")); cmd_initrdnounzip = grub_register_command ("legacy_initrd_nounzip", grub_cmd_legacy_initrdnounzip, N_("FILE [ARG ...]"), N_("Simulate grub-legacy `modulenounzip' command")); cmd_password = grub_register_command ("legacy_password", grub_cmd_legacy_password, N_("[--md5] PASSWD [FILE]"), N_("Simulate grub-legacy `password' command")); cmd_check_password = grub_register_command ("legacy_check_password", grub_cmd_legacy_check_password, N_("[--md5] PASSWD [FILE]"), N_("Simulate grub-legacy `password' command in menu entry mode")); } GRUB_MOD_FINI(legacycfg) { grub_unregister_command (cmd_source); grub_unregister_command (cmd_configfile); grub_unregister_command (cmd_source_extract); grub_unregister_command (cmd_configfile_extract); grub_unregister_command (cmd_kernel); grub_unregister_command (cmd_initrd); grub_unregister_command (cmd_initrdnounzip); grub_unregister_command (cmd_password); grub_unregister_command (cmd_check_password); } grub-2.14~git20250718.0e36779/grub-core/commands/search_uuid.c0000644000175000017500000000036615000202015020111 00000000000000#define DO_SEARCH_FS_UUID 1 #define FUNC_NAME grub_search_fs_uuid #define COMMAND_NAME "search.fs_uuid" #define HELP_MESSAGE N_("Search devices by UUID. If VARIABLE is specified, the first device found is set to a variable.") #include "search.c" grub-2.14~git20250718.0e36779/grub-core/commands/hashsum.c0000644000175000017500000002153015036447510017306 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (C) 2009 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); static const struct grub_arg_option options[] = { {"hash", 'h', 0, N_("Specify hash to use."), N_("HASH"), ARG_TYPE_STRING}, {"check", 'c', 0, N_("Check hashes of files with hash list FILE."), N_("FILE"), ARG_TYPE_STRING}, {"prefix", 'p', 0, N_("Base directory for hash list."), N_("DIR"), ARG_TYPE_STRING}, {"keep-going", 'k', 0, N_("Don't stop after first error."), 0, 0}, {"uncompress", 'u', 0, N_("Uncompress file before checksumming."), 0, 0}, {0, 0, 0, 0, 0, 0} }; static struct { const char *name; const char *hashname; } aliases[] = { {"sha256sum", "sha256"}, {"sha512sum", "sha512"}, {"sha1sum", "sha1"}, {"md5sum", "md5"}, {"crc", "crc32"}, }; static inline int hextoval (char c) { if (c >= '0' && c <= '9') return c - '0'; if (c >= 'a' && c <= 'f') return c - 'a' + 10; if (c >= 'A' && c <= 'F') return c - 'A' + 10; return -1; } static grub_err_t hash_file (grub_file_t file, const gcry_md_spec_t *hash, void *result) { void *context; grub_uint8_t *readbuf; #define BUF_SIZE 4096 readbuf = grub_malloc (BUF_SIZE); if (!readbuf) return grub_errno; context = grub_zalloc (hash->contextsize); if (!readbuf || !context) goto fail; hash->init (context, 0); while (1) { grub_ssize_t r; r = grub_file_read (file, readbuf, BUF_SIZE); if (r < 0) goto fail; if (r == 0) break; hash->write (context, readbuf, r); } hash->final (context); grub_memcpy (result, hash->read (context), hash->mdlen); grub_free (readbuf); grub_free (context); return GRUB_ERR_NONE; fail: grub_free (readbuf); grub_free (context); return grub_errno; } static grub_err_t check_list (const gcry_md_spec_t *hash, const char *hashfilename, const char *prefix, int keep, int uncompress) { grub_file_t hashlist, file; char *buf = NULL; grub_uint8_t expected[GRUB_CRYPTO_MAX_MDLEN]; grub_uint8_t actual[GRUB_CRYPTO_MAX_MDLEN]; grub_err_t err; unsigned i; unsigned unread = 0, mismatch = 0; if (hash->mdlen > GRUB_CRYPTO_MAX_MDLEN) return grub_error (GRUB_ERR_BUG, "mdlen is too long"); hashlist = grub_file_open (hashfilename, GRUB_FILE_TYPE_HASHLIST); if (!hashlist) return grub_errno; while (grub_free (buf), (buf = grub_file_getline (hashlist))) { const char *p = buf; while (grub_isspace (p[0])) p++; for (i = 0; i < hash->mdlen; i++) { int high, low; high = hextoval (*p++); low = hextoval (*p++); if (high < 0 || low < 0) { grub_free (buf); return grub_error (GRUB_ERR_BAD_FILE_TYPE, "invalid hash list"); } expected[i] = (high << 4) | low; } if ((p[0] != ' ' && p[0] != '\t') || (p[1] != ' ' && p[1] != '\t')) { grub_free (buf); return grub_error (GRUB_ERR_BAD_FILE_TYPE, "invalid hash list"); } p += 2; if (prefix) { char *filename; filename = grub_xasprintf ("%s/%s", prefix, p); if (!filename) { grub_free (buf); return grub_errno; } file = grub_file_open (filename, GRUB_FILE_TYPE_TO_HASH | (!uncompress ? GRUB_FILE_TYPE_NO_DECOMPRESS : GRUB_FILE_TYPE_NONE)); grub_free (filename); } else file = grub_file_open (p, GRUB_FILE_TYPE_TO_HASH | (!uncompress ? GRUB_FILE_TYPE_NO_DECOMPRESS : GRUB_FILE_TYPE_NONE)); if (!file) { grub_file_close (hashlist); grub_free (buf); return grub_errno; } err = hash_file (file, hash, actual); grub_file_close (file); if (err) { grub_printf_ (N_("%s: READ ERROR\n"), p); if (!keep) { grub_file_close (hashlist); grub_free (buf); return err; } grub_print_error (); grub_errno = GRUB_ERR_NONE; unread++; continue; } if (grub_crypto_memcmp (expected, actual, hash->mdlen) != 0) { grub_printf_ (N_("%s: HASH MISMATCH\n"), p); if (!keep) { grub_file_close (hashlist); grub_free (buf); return grub_error (GRUB_ERR_TEST_FAILURE, "hash of '%s' mismatches", p); } mismatch++; continue; } grub_printf_ (N_("%s: OK\n"), p); } if (mismatch || unread) return grub_error (GRUB_ERR_TEST_FAILURE, "%d files couldn't be read and hash " "of %d files mismatches", unread, mismatch); return GRUB_ERR_NONE; } static grub_err_t grub_cmd_hashsum (struct grub_extcmd_context *ctxt, int argc, char **args) { struct grub_arg_list *state = ctxt->state; const char *hashname = NULL; const char *prefix = NULL; const gcry_md_spec_t *hash; unsigned i; int keep = state[3].set; int uncompress = state[4].set; unsigned unread = 0; for (i = 0; i < ARRAY_SIZE (aliases); i++) if (grub_strcmp (ctxt->extcmd->cmd->name, aliases[i].name) == 0) hashname = aliases[i].hashname; if (state[0].set) hashname = state[0].arg; if (!hashname) return grub_error (GRUB_ERR_BAD_ARGUMENT, "no hash specified"); hash = grub_crypto_lookup_md_by_name (hashname); if (!hash) return grub_error (GRUB_ERR_BAD_ARGUMENT, "unknown hash"); if (hash->mdlen > GRUB_CRYPTO_MAX_MDLEN) return grub_error (GRUB_ERR_BUG, "mdlen is too long"); if (state[2].set) prefix = state[2].arg; if (state[1].set) { if (argc != 0) return grub_error (GRUB_ERR_BAD_ARGUMENT, "--check is incompatible with file list"); return check_list (hash, state[1].arg, prefix, keep, uncompress); } for (i = 0; i < (unsigned) argc; i++) { GRUB_PROPERLY_ALIGNED_ARRAY (result, GRUB_CRYPTO_MAX_MDLEN); grub_file_t file; grub_err_t err; unsigned j; file = grub_file_open (args[i], GRUB_FILE_TYPE_TO_HASH | (!uncompress ? GRUB_FILE_TYPE_NO_DECOMPRESS : GRUB_FILE_TYPE_NONE)); if (!file) { if (!keep) return grub_errno; grub_print_error (); grub_errno = GRUB_ERR_NONE; unread++; continue; } err = hash_file (file, hash, result); grub_file_close (file); if (err) { if (!keep) return err; grub_print_error (); grub_errno = GRUB_ERR_NONE; unread++; continue; } for (j = 0; j < hash->mdlen; j++) grub_printf ("%02x", ((grub_uint8_t *) result)[j]); grub_printf (" %s\n", args[i]); } if (unread) return grub_error (GRUB_ERR_TEST_FAILURE, "%d files couldn't be read", unread); return GRUB_ERR_NONE; } static grub_extcmd_t cmd, cmd_md5, cmd_sha1, cmd_sha256, cmd_sha512, cmd_crc; GRUB_MOD_INIT(hashsum) { cmd = grub_register_extcmd ("hashsum", grub_cmd_hashsum, 0, N_("-h HASH [-c FILE [-p PREFIX]] " "[FILE1 [FILE2 ...]]"), /* TRANSLATORS: "hash checksum" is just to be a bit more precise, you can treat it as just "hash". */ N_("Compute or check hash checksum."), options); cmd_md5 = grub_register_extcmd ("md5sum", grub_cmd_hashsum, 0, N_("[-c FILE [-p PREFIX]] " "[FILE1 [FILE2 ...]]"), N_("Compute or check hash checksum."), options); cmd_sha1 = grub_register_extcmd ("sha1sum", grub_cmd_hashsum, 0, N_("[-c FILE [-p PREFIX]] " "[FILE1 [FILE2 ...]]"), N_("Compute or check hash checksum."), options); cmd_sha256 = grub_register_extcmd ("sha256sum", grub_cmd_hashsum, 0, N_("[-c FILE [-p PREFIX]] " "[FILE1 [FILE2 ...]]"), N_("Compute or check hash checksum."), options); cmd_sha512 = grub_register_extcmd ("sha512sum", grub_cmd_hashsum, 0, N_("[-c FILE [-p PREFIX]] " "[FILE1 [FILE2 ...]]"), N_("Compute or check hash checksum."), options); cmd_crc = grub_register_extcmd ("crc", grub_cmd_hashsum, 0, N_("[-c FILE [-p PREFIX]] " "[FILE1 [FILE2 ...]]"), N_("Compute or check hash checksum."), options); } GRUB_MOD_FINI(hashsum) { grub_unregister_extcmd (cmd); grub_unregister_extcmd (cmd_md5); grub_unregister_extcmd (cmd_sha1); grub_unregister_extcmd (cmd_sha256); grub_unregister_extcmd (cmd_sha512); grub_unregister_extcmd (cmd_crc); } grub-2.14~git20250718.0e36779/grub-core/commands/reboot.c0000644000175000017500000000250115000202015017101 00000000000000/* reboot.c - command to reboot the computer. */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2005,2007,2008 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); static grub_err_t __attribute__ ((noreturn)) grub_cmd_reboot (grub_command_t cmd __attribute__ ((unused)), int argc __attribute__ ((unused)), char **args __attribute__ ((unused))) { grub_reboot (); } static grub_command_t cmd; GRUB_MOD_INIT(reboot) { cmd = grub_register_command ("reboot", grub_cmd_reboot, 0, N_("Reboot the computer.")); } GRUB_MOD_FINI(reboot) { grub_unregister_command (cmd); } grub-2.14~git20250718.0e36779/grub-core/commands/cmp.c0000644000175000017500000000630715033157230016414 00000000000000/* cmd.c - command to cmp an operating system */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2003,2005,2006,2007,2009 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); #define BUFFER_SIZE 512 static const struct grub_arg_option options[] = { {0, 'v', 0, N_("Enable verbose output"), 0, 0}, {0, 0, 0, 0, 0, 0} }; static grub_err_t grub_cmd_cmp (grub_extcmd_context_t ctxt, int argc, char **args) { grub_ssize_t rd1, rd2; grub_off_t pos; grub_file_t file1 = 0; grub_file_t file2 = 0; char *buf1 = 0; char *buf2 = 0; grub_err_t err = GRUB_ERR_TEST_FAILURE; if (argc != 2) return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("two arguments expected")); if (ctxt->state[0].set) grub_printf_ (N_("Compare file `%s' with `%s':\n"), args[0], args[1]); file1 = grub_file_open (args[0], GRUB_FILE_TYPE_CMP); file2 = grub_file_open (args[1], GRUB_FILE_TYPE_CMP); if (! file1 || ! file2) goto cleanup; if (ctxt->state[0].set && (grub_file_size (file1) != grub_file_size (file2))) grub_printf_ (N_("Files differ in size: %llu [%s], %llu [%s]\n"), (unsigned long long) grub_file_size (file1), args[0], (unsigned long long) grub_file_size (file2), args[1]); else { pos = 0; buf1 = grub_malloc (BUFFER_SIZE); buf2 = grub_malloc (BUFFER_SIZE); if (! buf1 || ! buf2) goto cleanup; do { int i; rd1 = grub_file_read (file1, buf1, BUFFER_SIZE); rd2 = grub_file_read (file2, buf2, BUFFER_SIZE); if (rd1 != rd2) goto cleanup; for (i = 0; i < rd2; i++) { if (buf1[i] != buf2[i]) { if (ctxt->state[0].set) grub_printf_ (N_("Files differ at the offset %llu: 0x%x [%s], 0x%x [%s]\n"), (unsigned long long) (i + pos), buf1[i], args[0], buf2[i], args[1]); goto cleanup; } } pos += BUFFER_SIZE; } while (rd2); /* TRANSLATORS: it's always exactly 2 files. */ if (ctxt->state[0].set) grub_printf_ (N_("The files are identical.\n")); err = GRUB_ERR_NONE; } cleanup: grub_free (buf1); grub_free (buf2); if (file1) grub_file_close (file1); if (file2) grub_file_close (file2); return err; } static grub_extcmd_t cmd; GRUB_MOD_INIT(cmp) { cmd = grub_register_extcmd ("cmp", grub_cmd_cmp, 0, N_("FILE1 FILE2"), N_("Compare two files."), options); } GRUB_MOD_FINI(cmp) { grub_unregister_extcmd (cmd); } grub-2.14~git20250718.0e36779/grub-core/commands/hexdump.c0000644000175000017500000000703115036447510017310 00000000000000/* hexdump.c - command to dump the contents of a file or memory */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2007,2008,2009 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); static const struct grub_arg_option options[] = { {"skip", 's', 0, N_("Skip offset bytes from the beginning of file."), 0, ARG_TYPE_INT}, {"length", 'n', 0, N_("Read only LENGTH bytes."), 0, ARG_TYPE_INT}, {0, 0, 0, 0, 0, 0} }; static grub_err_t grub_cmd_hexdump (grub_extcmd_context_t ctxt, int argc, char **args) { struct grub_arg_list *state = ctxt->state; char buf[GRUB_DISK_SECTOR_SIZE * 4]; grub_ssize_t size, length; grub_disk_addr_t skip; int namelen; if (argc != 1) return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected")); namelen = grub_strlen (args[0]); skip = (state[0].set) ? grub_strtoull (state[0].arg, 0, 0) : 0; length = (state[1].set) ? grub_strtoul (state[1].arg, 0, 0) : 256; if (!grub_strcmp (args[0], "(mem)")) { if (grub_is_lockdown() == GRUB_LOCKDOWN_ENABLED) return grub_error (GRUB_ERR_ACCESS_DENIED, N_("memory reading is disabled in lockdown mode")); hexdump (skip, (char *) (grub_addr_t) skip, length); } else if ((args[0][0] == '(') && (args[0][namelen - 1] == ')')) { grub_disk_t disk; grub_disk_addr_t sector; grub_size_t ofs; args[0][namelen - 1] = 0; disk = grub_disk_open (&args[0][1]); if (! disk) return 0; sector = (skip >> (GRUB_DISK_SECTOR_BITS + 2)) * 4; ofs = skip & (GRUB_DISK_SECTOR_SIZE * 4 - 1); while (length) { grub_size_t len; len = length; if (len > sizeof (buf)) len = sizeof (buf); if (grub_disk_read (disk, sector, ofs, len, buf)) break; hexdump (skip, buf, len); ofs = 0; skip += len; length -= len; sector += 4; } grub_disk_close (disk); } else { grub_file_t file; file = grub_file_open (args[0], GRUB_FILE_TYPE_HEXCAT); if (! file) return 0; file->offset = skip; while ((size = grub_file_read (file, buf, sizeof (buf))) > 0) { unsigned long len; len = ((length) && (size > length)) ? length : size; hexdump (skip, buf, len); skip += len; if (length) { length -= len; if (!length) break; } } grub_file_close (file); } return 0; } static grub_extcmd_t cmd; GRUB_MOD_INIT (hexdump) { cmd = grub_register_extcmd ("hexdump", grub_cmd_hexdump, 0, N_("[OPTIONS] FILE_OR_DEVICE"), N_("Show raw contents of a file or memory."), options); } GRUB_MOD_FINI (hexdump) { grub_unregister_extcmd (cmd); } grub-2.14~git20250718.0e36779/grub-core/commands/minicmd.c0000644000175000017500000001377115036447510017266 00000000000000/* minicmd.c - commands for the rescue mode */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2003,2005,2006,2007,2009 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #ifdef GRUB_MACHINE_EFI #include #endif GRUB_MOD_LICENSE ("GPLv3+"); /* cat FILE */ static grub_err_t grub_mini_cmd_cat (struct grub_command *cmd __attribute__ ((unused)), int argc, char *argv[]) { grub_file_t file; char buf[GRUB_DISK_SECTOR_SIZE]; grub_ssize_t size; if (argc < 1) return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected")); file = grub_file_open (argv[0], GRUB_FILE_TYPE_CAT); if (! file) return grub_errno; while ((size = grub_file_read (file, buf, sizeof (buf))) > 0) { int i; for (i = 0; i < size; i++) { unsigned char c = buf[i]; if ((grub_isprint (c) || grub_isspace (c)) && c != '\r') grub_printf ("%c", c); else { grub_setcolorstate (GRUB_TERM_COLOR_HIGHLIGHT); grub_printf ("<%x>", (int) c); grub_setcolorstate (GRUB_TERM_COLOR_STANDARD); } } } grub_xputs ("\n"); grub_refresh (); grub_file_close (file); return 0; } /* help */ static grub_err_t grub_mini_cmd_help (struct grub_command *cmd __attribute__ ((unused)), int argc __attribute__ ((unused)), char *argv[] __attribute__ ((unused))) { grub_command_t p; for (p = grub_command_list; p; p = p->next) grub_printf ("%s (%d%c)\t%s\n", p->name, p->prio & GRUB_COMMAND_PRIO_MASK, (p->prio & GRUB_COMMAND_FLAG_ACTIVE) ? '+' : '-', p->description); return 0; } /* dump ADDRESS [SIZE] */ static grub_err_t grub_mini_cmd_dump (struct grub_command *cmd __attribute__ ((unused)), int argc, char *argv[]) { grub_uint8_t *addr; grub_size_t size = 4; if (argc == 0) return grub_error (GRUB_ERR_BAD_ARGUMENT, "no address specified"); #if GRUB_CPU_SIZEOF_VOID_P == GRUB_CPU_SIZEOF_LONG #define grub_strtoaddr grub_strtoul #else #define grub_strtoaddr grub_strtoull #endif addr = (grub_uint8_t *) grub_strtoaddr (argv[0], 0, 0); if (grub_errno) return grub_errno; if (argc > 1) size = (grub_size_t) grub_strtoaddr (argv[1], 0, 0); while (size--) { grub_printf ("%x%x ", *addr >> 4, *addr & 0xf); addr++; } return 0; } /* rmmod MODULE */ static grub_err_t grub_mini_cmd_rmmod (struct grub_command *cmd __attribute__ ((unused)), int argc, char *argv[]) { grub_dl_t mod; if (argc == 0) return grub_error (GRUB_ERR_BAD_ARGUMENT, "no module specified"); mod = grub_dl_get (argv[0]); if (! mod) return grub_error (GRUB_ERR_BAD_ARGUMENT, "no such module"); if (grub_dl_is_persistent (mod)) return grub_error (GRUB_ERR_BAD_ARGUMENT, "cannot unload persistent module"); if (grub_dl_ref_count (mod) > 1) return grub_error (GRUB_ERR_BAD_ARGUMENT, "cannot unload referenced module"); grub_dl_unref (mod); grub_dl_unload (mod); return 0; } /* lsmod */ static grub_err_t grub_mini_cmd_lsmod (struct grub_command *cmd __attribute__ ((unused)), int argc __attribute__ ((unused)), char *argv[] __attribute__ ((unused))) { grub_dl_t mod; /* TRANSLATORS: this is module list header. Name is module name, Ref Count is a reference counter (how many modules or open descriptors use it). Dependencies are the other modules it uses. */ grub_printf_ (N_("Name\tRef Count\tDependencies\n")); FOR_DL_MODULES (mod) { grub_dl_dep_t dep; grub_printf ("%s\t%" PRIuGRUB_UINT64_T "\t\t", mod->name, mod->ref_count); for (dep = mod->dep; dep; dep = dep->next) { if (dep != mod->dep) grub_xputs (","); grub_printf ("%s", dep->mod->name); } grub_xputs ("\n"); } return 0; } /* exit */ static grub_err_t __attribute__ ((noreturn)) grub_mini_cmd_exit (struct grub_command *cmd __attribute__ ((unused)), int argc __attribute__ ((unused)), char *argv[] __attribute__ ((unused))) { #ifdef GRUB_MACHINE_EFI /* * The "exit" command is often used to launch the next boot application. * So, erase the secrets. */ grub_cryptodisk_erasesecrets (); #endif grub_exit (); /* Not reached. */ } static grub_command_t cmd_cat, cmd_help; static grub_command_t cmd_dump, cmd_rmmod, cmd_lsmod, cmd_exit; GRUB_MOD_INIT(minicmd) { cmd_cat = grub_register_command ("cat", grub_mini_cmd_cat, N_("FILE"), N_("Show the contents of a file.")); cmd_help = grub_register_command ("help", grub_mini_cmd_help, 0, N_("Show this message.")); cmd_dump = grub_register_command_lockdown ("dump", grub_mini_cmd_dump, N_("ADDR [SIZE]"), N_("Show memory contents.")); cmd_rmmod = grub_register_command ("rmmod", grub_mini_cmd_rmmod, N_("MODULE"), N_("Remove a module.")); cmd_lsmod = grub_register_command ("lsmod", grub_mini_cmd_lsmod, 0, N_("Show loaded modules.")); cmd_exit = grub_register_command ("exit", grub_mini_cmd_exit, 0, N_("Exit from GRUB.")); } GRUB_MOD_FINI(minicmd) { grub_unregister_command (cmd_cat); grub_unregister_command (cmd_help); grub_unregister_command (cmd_dump); grub_unregister_command (cmd_rmmod); grub_unregister_command (cmd_lsmod); grub_unregister_command (cmd_exit); } grub-2.14~git20250718.0e36779/grub-core/commands/mips/0000755000175000017500000000000015036452575016530 500000000000000grub-2.14~git20250718.0e36779/grub-core/commands/mips/loongson/0000755000175000017500000000000015036452575020366 500000000000000grub-2.14~git20250718.0e36779/grub-core/commands/mips/loongson/lsspd.c0000644000175000017500000000572015033157230021566 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (C) 2010 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); static grub_err_t grub_cmd_lsspd (grub_command_t cmd __attribute__ ((unused)), int argc __attribute__ ((unused)), char **args __attribute__ ((unused))) { grub_pci_device_t dev; grub_port_t smbbase; int i; grub_err_t err; if (!grub_cs5536_find (&dev)) { grub_puts_ (N_("No CS5536 found")); return GRUB_ERR_NONE; } grub_printf_ (N_("CS5536 at %d:%d.%d\n"), grub_pci_get_bus (dev), grub_pci_get_device (dev), grub_pci_get_function (dev)); err = grub_cs5536_init_smbus (dev, 0x7fff, &smbbase); if (err) return err; /* TRANSLATORS: System management bus is often used to access components like RAM (info only, not data) or batteries. I/O space is where in memory its ports are. */ grub_printf_ (N_("System management bus controller I/O space is at 0x%x\n"), smbbase); for (i = GRUB_SMB_RAM_START_ADDR; i < GRUB_SMB_RAM_START_ADDR + GRUB_SMB_RAM_NUM_MAX; i++) { struct grub_smbus_spd spd; grub_memset (&spd, 0, sizeof (spd)); /* TRANSLATORS: it's shown in a report in a way like number 1: ... number 2: ... */ grub_printf_ (N_("RAM slot number %d\n"), i); err = grub_cs5536_read_spd (smbbase, i, &spd); if (err) { grub_print_error (); continue; } grub_printf_ (N_("Written SPD bytes: %d B.\n"), spd.written_size); grub_printf_ (N_("Total flash size: %d B.\n"), 1 << spd.log_total_flash_size); if (spd.memory_type == GRUB_SMBUS_SPD_MEMORY_TYPE_DDR2) { char str[sizeof (spd.ddr2.part_number) + 1]; grub_puts_ (N_("Memory type: DDR2.")); grub_memcpy (str, spd.ddr2.part_number, sizeof (spd.ddr2.part_number)); str[sizeof (spd.ddr2.part_number)] = 0; grub_printf_ (N_("Part no: %s.\n"), str); } else grub_puts_ (N_("Memory type: Unknown.")); } return GRUB_ERR_NONE; } static grub_command_t cmd; GRUB_MOD_INIT(lsspd) { cmd = grub_register_command ("lsspd", grub_cmd_lsspd, 0, N_("Print Memory information.")); } GRUB_MOD_FINI(lsspd) { grub_unregister_command (cmd); } grub-2.14~git20250718.0e36779/grub-core/commands/help.c0000644000175000017500000000760615033157230016570 00000000000000/* help.c - command to show a help text. */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2005,2007,2008,2009 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); static grub_err_t grub_cmd_help (grub_extcmd_context_t ctxt __attribute__ ((unused)), int argc, char **args) { int cnt = 0; char *currarg; if (argc == 0) { grub_command_t cmd; FOR_COMMANDS(cmd) { if ((cmd->prio & GRUB_COMMAND_FLAG_ACTIVE)) { struct grub_term_output *term; const char *summary_translated = _(cmd->summary); char *command_help; grub_uint32_t *unicode_command_help; grub_uint32_t *unicode_last_position; command_help = grub_xasprintf ("%s %s", cmd->name, summary_translated); if (!command_help) break; grub_utf8_to_ucs4_alloc (command_help, &unicode_command_help, &unicode_last_position); FOR_ACTIVE_TERM_OUTPUTS(term) { unsigned stringwidth; grub_uint32_t *unicode_last_screen_position; unicode_last_screen_position = unicode_command_help; stringwidth = 0; while (unicode_last_screen_position < unicode_last_position && stringwidth < ((grub_term_width (term) / 2) - 2)) { struct grub_unicode_glyph glyph; unicode_last_screen_position += grub_unicode_aglomerate_comb (unicode_last_screen_position, unicode_last_position - unicode_last_screen_position, &glyph); stringwidth += grub_term_getcharwidth (term, &glyph); } grub_print_ucs4 (unicode_command_help, unicode_last_screen_position, 0, 0, term); if (!(cnt % 2)) grub_print_spaces (term, grub_term_width (term) / 2 - stringwidth); } if (cnt % 2) grub_printf ("\n"); cnt++; grub_free (command_help); grub_free (unicode_command_help); } } if (!(cnt % 2)) grub_printf ("\n"); } else { int i; grub_command_t cmd_iter, cmd, cmd_next; for (i = 0; i < argc; i++) { currarg = args[i]; FOR_COMMANDS_SAFE (cmd_iter, cmd_next) { if (!(cmd_iter->prio & GRUB_COMMAND_FLAG_ACTIVE)) continue; if (grub_strncmp (cmd_iter->name, currarg, grub_strlen (currarg)) != 0) continue; if (cmd_iter->flags & GRUB_COMMAND_FLAG_DYNCMD) cmd = grub_dyncmd_get_cmd (cmd_iter); else cmd = cmd_iter; if (!cmd) { grub_print_error (); continue; } if (cnt++ > 0) grub_printf ("\n\n"); if ((cmd->flags & GRUB_COMMAND_FLAG_EXTCMD) && ! (cmd->flags & GRUB_COMMAND_FLAG_DYNCMD)) grub_arg_show_help ((grub_extcmd_t) cmd->data); else grub_printf ("%s %s %s\n%s\n", _("Usage:"), cmd->name, _(cmd->summary), _(cmd->description)); } } } grub_printf ("\n\nTo enable less(1)-like paging, \"set pager=1\".\n"); return 0; } static grub_extcmd_t cmd; GRUB_MOD_INIT(help) { cmd = grub_register_extcmd ("help", grub_cmd_help, 0, N_("[PATTERN ...]"), N_("Show a help message."), 0); } GRUB_MOD_FINI(help) { grub_unregister_extcmd (cmd); } grub-2.14~git20250718.0e36779/grub-core/commands/hdparm.c0000644000175000017500000003010615033157230017102 00000000000000/* hdparm.c - command to get/set ATA disk parameters. */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2009 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); static const struct grub_arg_option options[] = { {"apm", 'B', 0, N_("Set Advanced Power Management\n" "(1=low, ..., 254=high, 255=off)."), 0, ARG_TYPE_INT}, {"power", 'C', 0, N_("Display power mode."), 0, ARG_TYPE_NONE}, {"security-freeze", 'F', 0, N_("Freeze ATA security settings until reset."), 0, ARG_TYPE_NONE}, {"health", 'H', 0, N_("Display SMART health status."), 0, ARG_TYPE_NONE}, {"aam", 'M', 0, N_("Set Automatic Acoustic Management\n" "(0=off, 128=quiet, ..., 254=fast)."), 0, ARG_TYPE_INT}, {"standby-timeout", 'S', 0, N_("Set standby timeout\n" "(0=off, 1=5s, 2=10s, ..., 240=20m, 241=30m, ...)."), 0, ARG_TYPE_INT}, {"standby", 'y', 0, N_("Set drive to standby mode."), 0, ARG_TYPE_NONE}, {"sleep", 'Y', 0, N_("Set drive to sleep mode."), 0, ARG_TYPE_NONE}, {"identify", 'i', 0, N_("Print drive identity and settings."), 0, ARG_TYPE_NONE}, {"dumpid", 'I', 0, N_("Show raw contents of ATA IDENTIFY sector."), 0, ARG_TYPE_NONE}, {"smart", -1, 0, N_("Disable/enable SMART (0/1)."), 0, ARG_TYPE_INT}, {"quiet", 'q', 0, N_("Do not print messages."), 0, ARG_TYPE_NONE}, {0, 0, 0, 0, 0, 0} }; enum grub_ata_smart_commands { GRUB_ATA_FEAT_SMART_ENABLE = 0xd8, GRUB_ATA_FEAT_SMART_DISABLE = 0xd9, GRUB_ATA_FEAT_SMART_STATUS = 0xda, }; static int quiet = 0; static grub_err_t grub_hdparm_do_ata_cmd (grub_ata_t ata, grub_uint8_t cmd, grub_uint8_t features, grub_uint8_t sectors, void * buffer, int size) { struct grub_disk_ata_pass_through_parms apt; grub_memset (&apt, 0, sizeof (apt)); apt.taskfile.cmd = cmd; apt.taskfile.features = features; apt.taskfile.sectors = sectors; apt.taskfile.disk = 0xE0; apt.buffer = buffer; apt.size = size; if (ata->dev->readwrite (ata, &apt, 0)) return grub_errno; return GRUB_ERR_NONE; } static int grub_hdparm_do_check_powermode_cmd (grub_ata_t ata) { struct grub_disk_ata_pass_through_parms apt; grub_memset (&apt, 0, sizeof (apt)); apt.taskfile.cmd = GRUB_ATA_CMD_CHECK_POWER_MODE; apt.taskfile.disk = 0xE0; if (ata->dev->readwrite (ata, &apt, 0)) return -1; return apt.taskfile.sectors; } static int grub_hdparm_do_smart_cmd (grub_ata_t ata, grub_uint8_t features) { struct grub_disk_ata_pass_through_parms apt; grub_memset (&apt, 0, sizeof (apt)); apt.taskfile.cmd = GRUB_ATA_CMD_SMART; apt.taskfile.features = features; apt.taskfile.lba_mid = 0x4f; apt.taskfile.lba_high = 0xc2; apt.taskfile.disk = 0xE0; if (ata->dev->readwrite (ata, &apt, 0)) return -1; if (features == GRUB_ATA_FEAT_SMART_STATUS) { if ( apt.taskfile.lba_mid == 0x4f && apt.taskfile.lba_high == 0xc2) return 0; /* Good SMART status. */ else if ( apt.taskfile.lba_mid == 0xf4 && apt.taskfile.lba_high == 0x2c) return 1; /* Bad SMART status. */ else return -1; } return 0; } static grub_err_t grub_hdparm_simple_cmd (const char * msg, grub_ata_t ata, grub_uint8_t cmd) { if (! quiet && msg) grub_printf ("%s", msg); grub_err_t err = grub_hdparm_do_ata_cmd (ata, cmd, 0, 0, NULL, 0); if (! quiet && msg) grub_printf ("%s\n", ! err ? "" : ": not supported"); return err; } static grub_err_t grub_hdparm_set_val_cmd (const char * msg, int val, grub_ata_t ata, grub_uint8_t cmd, grub_uint8_t features, grub_uint8_t sectors) { if (! quiet && msg && *msg) { if (val >= 0) grub_printf ("Set %s to %d", msg, val); else grub_printf ("Disable %s", msg); } grub_err_t err = grub_hdparm_do_ata_cmd (ata, cmd, features, sectors, NULL, 0); if (! quiet && msg) grub_printf ("%s\n", ! err ? "" : ": not supported"); return err; } static const char * le16_to_char (grub_uint16_t *dest, const grub_uint16_t * src16, unsigned bytes) { unsigned i; for (i = 0; i < bytes / 2; i++) dest[i] = grub_swap_bytes16 (src16[i]); dest[i] = 0; return (char *) dest; } static void grub_hdparm_print_identify (const grub_uint16_t * idw) { /* Print identity strings. */ grub_uint16_t tmp[21]; grub_printf ("Model: \"%.40s\"\n", le16_to_char (tmp, &idw[27], 40)); grub_printf ("Firmware: \"%.8s\"\n", le16_to_char (tmp, &idw[23], 8)); grub_printf ("Serial: \"%.20s\"\n", le16_to_char (tmp, &idw[10], 20)); /* Print AAM, APM and SMART settings. */ grub_uint16_t features1 = grub_le_to_cpu16 (idw[82]); grub_uint16_t features2 = grub_le_to_cpu16 (idw[83]); grub_uint16_t enabled1 = grub_le_to_cpu16 (idw[85]); grub_uint16_t enabled2 = grub_le_to_cpu16 (idw[86]); grub_printf ("Automatic Acoustic Management: "); if (features2 & 0x0200) { if (enabled2 & 0x0200) { grub_uint16_t aam = grub_le_to_cpu16 (idw[94]); grub_printf ("%u (128=quiet, ..., 254=fast, recommended=%u)\n", aam & 0xff, (aam >> 8) & 0xff); } else grub_printf ("disabled\n"); } else grub_printf ("not supported\n"); grub_printf ("Advanced Power Management: "); if (features2 & 0x0008) { if (enabled2 & 0x0008) grub_printf ("%u (1=low, ..., 254=high)\n", grub_le_to_cpu16 (idw[91]) & 0xff); else grub_printf ("disabled\n"); } else grub_printf ("not supported\n"); grub_printf ("SMART Feature Set: "); if (features1 & 0x0001) grub_printf ("%sabled\n", (enabled1 & 0x0001 ? "en" : "dis")); else grub_printf ("not supported\n"); /* Print security settings. */ grub_uint16_t security = grub_le_to_cpu16 (idw[128]); grub_printf ("ATA Security: "); if (security & 0x0001) grub_printf ("%s, %s, %s, %s\n", (security & 0x0002 ? "ENABLED" : "disabled"), (security & 0x0004 ? "**LOCKED**" : "not locked"), (security & 0x0008 ? "frozen" : "NOT FROZEN"), (security & 0x0010 ? "COUNT EXPIRED" : "count not expired")); else grub_printf ("not supported\n"); } static void grub_hdparm_print_standby_tout (int timeout) { if (timeout == 0) grub_printf ("off"); else if (timeout <= 252 || timeout == 255) { int h = 0, m = 0 , s = 0; if (timeout == 255) { m = 21; s = 15; } else if (timeout == 252) m = 21; else if (timeout <= 240) { s = timeout * 5; m = s / 60; s %= 60; } else { m = (timeout - 240) * 30; h = m / 60; m %= 60; } grub_printf ("%02d:%02d:%02d", h, m, s); } else grub_printf ("invalid or vendor-specific"); } static int get_int_arg (const struct grub_arg_list *state) { return (state->set ? (int)grub_strtoul (state->arg, 0, 0) : -1); } static grub_err_t grub_cmd_hdparm (grub_extcmd_context_t ctxt, int argc, char **args) { struct grub_arg_list *state = ctxt->state; struct grub_ata *ata; const char *diskname; /* Check command line. */ if (argc != 1) return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("one argument expected")); if (args[0][0] == '(') { grub_size_t len = grub_strlen (args[0]); if (args[0][len - 1] == ')') args[0][len - 1] = 0; diskname = &args[0][1]; } else diskname = &args[0][0]; int i = 0; int apm = get_int_arg (&state[i++]); int power = state[i++].set; int sec_freeze = state[i++].set; int health = state[i++].set; int aam = get_int_arg (&state[i++]); int standby_tout = get_int_arg (&state[i++]); int standby_now = state[i++].set; int sleep_now = state[i++].set; int ident = state[i++].set; int dumpid = state[i++].set; int enable_smart = get_int_arg (&state[i++]); quiet = state[i++].set; /* Open disk. */ grub_disk_t disk = grub_disk_open (diskname); if (! disk) return grub_errno; switch (disk->dev->id) { case GRUB_DISK_DEVICE_ATA_ID: ata = disk->data; break; case GRUB_DISK_DEVICE_SCSI_ID: if (((disk->id >> GRUB_SCSI_ID_SUBSYSTEM_SHIFT) & 0xFF) == GRUB_SCSI_SUBSYSTEM_PATA || (((disk->id >> GRUB_SCSI_ID_SUBSYSTEM_SHIFT) & 0xFF) == GRUB_SCSI_SUBSYSTEM_AHCI)) { ata = ((struct grub_scsi *) disk->data)->data; break; } /* FALLTHROUGH */ default: grub_disk_close (disk); return grub_error (GRUB_ERR_IO, "not an ATA device"); } /* Change settings. */ if (aam >= 0) grub_hdparm_set_val_cmd ("Automatic Acoustic Management", (aam ? aam : -1), ata, GRUB_ATA_CMD_SET_FEATURES, (aam ? 0x42 : 0xc2), aam); if (apm >= 0) grub_hdparm_set_val_cmd ("Advanced Power Management", (apm != 255 ? apm : -1), ata, GRUB_ATA_CMD_SET_FEATURES, (apm != 255 ? 0x05 : 0x85), (apm != 255 ? apm : 0)); if (standby_tout >= 0) { if (! quiet) { grub_printf ("Set standby timeout to %d (", standby_tout); grub_hdparm_print_standby_tout (standby_tout); grub_printf (")"); } /* The IDLE cmd sets disk to idle mode and configures standby timer. */ grub_hdparm_set_val_cmd ("", -1, ata, GRUB_ATA_CMD_IDLE, 0, standby_tout); } if (enable_smart >= 0) { if (! quiet) grub_printf ("%sable SMART operations", (enable_smart ? "En" : "Dis")); int err = grub_hdparm_do_smart_cmd (ata, (enable_smart ? GRUB_ATA_FEAT_SMART_ENABLE : GRUB_ATA_FEAT_SMART_DISABLE)); if (! quiet) grub_printf ("%s\n", err ? ": not supported" : ""); } if (sec_freeze) grub_hdparm_simple_cmd ("Freeze security settings", ata, GRUB_ATA_CMD_SECURITY_FREEZE_LOCK); /* Print/dump IDENTIFY. */ if (ident || dumpid) { grub_uint16_t buf[GRUB_DISK_SECTOR_SIZE / 2]; if (grub_hdparm_do_ata_cmd (ata, GRUB_ATA_CMD_IDENTIFY_DEVICE, 0, 0, buf, sizeof (buf))) grub_printf ("Cannot read ATA IDENTIFY data\n"); else { if (ident) grub_hdparm_print_identify (buf); if (dumpid) hexdump (0, (char *) buf, sizeof (buf)); } } /* Check power mode. */ if (power) { grub_printf ("Disk power mode is: "); int mode = grub_hdparm_do_check_powermode_cmd (ata); if (mode < 0) grub_printf ("unknown\n"); else grub_printf ("%s (0x%02x)\n", (mode == 0xff ? "active/idle" : mode == 0x80 ? "idle" : mode == 0x00 ? "standby" : "unknown"), mode); } /* Check health. */ int status = 0; if (health) { if (! quiet) grub_printf ("SMART status is: "); int err = grub_hdparm_do_smart_cmd (ata, GRUB_ATA_FEAT_SMART_STATUS); if (! quiet) grub_printf ("%s\n", (err < 0 ? "unknown" : err == 0 ? "OK" : "*BAD*")); status = (err > 0); } /* Change power mode. */ if (standby_now) grub_hdparm_simple_cmd ("Set disk to standby mode", ata, GRUB_ATA_CMD_STANDBY_IMMEDIATE); if (sleep_now) grub_hdparm_simple_cmd ("Set disk to sleep mode", ata, GRUB_ATA_CMD_SLEEP); grub_disk_close (disk); grub_errno = GRUB_ERR_NONE; return status; } static grub_extcmd_t cmd; GRUB_MOD_INIT(hdparm) { cmd = grub_register_extcmd_lockdown ("hdparm", grub_cmd_hdparm, 0, N_("[OPTIONS] DISK"), N_("Get/set ATA disk parameters."), options); } GRUB_MOD_FINI(hdparm) { grub_unregister_extcmd (cmd); } grub-2.14~git20250718.0e36779/grub-core/commands/search_label.c0000644000175000017500000000036715000202015020223 00000000000000#define DO_SEARCH_FS_LABEL 1 #define FUNC_NAME grub_search_label #define COMMAND_NAME "search.fs_label" #define HELP_MESSAGE N_("Search devices by label. If VARIABLE is specified, the first device found is set to a variable.") #include "search.c" grub-2.14~git20250718.0e36779/grub-core/commands/acpihalt.c0000644000175000017500000002546315033157230017426 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (C) 2010 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #ifdef GRUB_DSDT_TEST #include #include #include #include #include #include #define grub_dprintf(cond, args...) printf ( args ) #define grub_printf printf #define grub_util_fopen fopen #define grub_memcmp memcmp typedef uint64_t grub_uint64_t; typedef uint32_t grub_uint32_t; typedef uint16_t grub_uint16_t; typedef uint8_t grub_uint8_t; #endif #include #ifndef GRUB_DSDT_TEST #include #else #define _(x) x #define N_(x) x #endif #ifndef GRUB_DSDT_TEST #include #include #include #include #endif static inline grub_uint32_t decode_length (const grub_uint8_t *ptr, int *numlen) { int num_bytes, i; grub_uint32_t ret; if (*ptr < 64) { if (numlen) *numlen = 1; return *ptr; } num_bytes = *ptr >> 6; if (numlen) *numlen = num_bytes + 1; ret = *ptr & 0xf; ptr++; for (i = 0; i < num_bytes; i++) { ret |= *ptr << (8 * i + 4); ptr++; } return ret; } static inline grub_uint32_t skip_name_string (const grub_uint8_t *ptr, const grub_uint8_t *end) { const grub_uint8_t *ptr0 = ptr; while (ptr < end && (*ptr == '^' || *ptr == '\\')) ptr++; switch (*ptr) { case '.': ptr++; ptr += 8; break; case '/': ptr++; ptr += 1 + (*ptr) * 4; break; case 0: ptr++; break; default: ptr += 4; break; } return ptr - ptr0; } static inline grub_uint32_t skip_data_ref_object (const grub_uint8_t *ptr, const grub_uint8_t *end) { grub_dprintf ("acpi", "data type = 0x%x\n", *ptr); switch (*ptr) { case GRUB_ACPI_OPCODE_PACKAGE: case GRUB_ACPI_OPCODE_BUFFER: return 1 + decode_length (ptr + 1, 0); case GRUB_ACPI_OPCODE_ZERO: case GRUB_ACPI_OPCODE_ONES: case GRUB_ACPI_OPCODE_ONE: return 1; case GRUB_ACPI_OPCODE_BYTE_CONST: return 2; case GRUB_ACPI_OPCODE_WORD_CONST: return 3; case GRUB_ACPI_OPCODE_DWORD_CONST: return 5; case GRUB_ACPI_OPCODE_STRING_CONST: { const grub_uint8_t *ptr0 = ptr; for (ptr++; ptr < end && *ptr; ptr++); if (ptr == end) return 0; return ptr - ptr0 + 1; } default: if (*ptr == '^' || *ptr == '\\' || *ptr == '_' || (*ptr >= 'A' && *ptr <= 'Z')) return skip_name_string (ptr, end); grub_printf ("Unknown opcode 0x%x\n", *ptr); return 0; } } static inline grub_uint32_t skip_term (const grub_uint8_t *ptr, const grub_uint8_t *end) { grub_uint32_t add; const grub_uint8_t *ptr0 = ptr; switch(*ptr) { case GRUB_ACPI_OPCODE_ADD: case GRUB_ACPI_OPCODE_AND: case GRUB_ACPI_OPCODE_CONCAT: case GRUB_ACPI_OPCODE_CONCATRES: case GRUB_ACPI_OPCODE_DIVIDE: case GRUB_ACPI_OPCODE_INDEX: case GRUB_ACPI_OPCODE_LSHIFT: case GRUB_ACPI_OPCODE_MOD: case GRUB_ACPI_OPCODE_MULTIPLY: case GRUB_ACPI_OPCODE_NAND: case GRUB_ACPI_OPCODE_NOR: case GRUB_ACPI_OPCODE_OR: case GRUB_ACPI_OPCODE_RSHIFT: case GRUB_ACPI_OPCODE_SUBTRACT: case GRUB_ACPI_OPCODE_TOSTRING: case GRUB_ACPI_OPCODE_XOR: /* * Parameters for these opcodes: TermArg, TermArg Target, see ACPI * spec r5.0, page 828f. */ ptr++; ptr += add = skip_term (ptr, end); if (!add) return 0; ptr += add = skip_term (ptr, end); if (!add) return 0; ptr += skip_name_string (ptr, end); break; default: return skip_data_ref_object (ptr, end); } return ptr - ptr0; } static inline grub_uint32_t skip_ext_op (const grub_uint8_t *ptr, const grub_uint8_t *end) { const grub_uint8_t *ptr0 = ptr; int add; grub_dprintf ("acpi", "Extended opcode: 0x%x\n", *ptr); switch (*ptr) { case GRUB_ACPI_EXTOPCODE_MUTEX: ptr++; ptr += skip_name_string (ptr, end); ptr++; break; case GRUB_ACPI_EXTOPCODE_EVENT_OP: ptr++; ptr += skip_name_string (ptr, end); break; case GRUB_ACPI_EXTOPCODE_OPERATION_REGION: ptr++; ptr += skip_name_string (ptr, end); ptr++; ptr += add = skip_term (ptr, end); if (!add) return 0; ptr += add = skip_term (ptr, end); if (!add) return 0; break; case GRUB_ACPI_EXTOPCODE_FIELD_OP: case GRUB_ACPI_EXTOPCODE_DEVICE_OP: case GRUB_ACPI_EXTOPCODE_PROCESSOR_OP: case GRUB_ACPI_EXTOPCODE_POWER_RES_OP: case GRUB_ACPI_EXTOPCODE_THERMAL_ZONE_OP: case GRUB_ACPI_EXTOPCODE_INDEX_FIELD_OP: case GRUB_ACPI_EXTOPCODE_BANK_FIELD_OP: ptr++; ptr += decode_length (ptr, 0); break; default: grub_printf ("Unexpected extended opcode: 0x%x\n", *ptr); return 0; } return ptr - ptr0; } static int get_sleep_type (grub_uint8_t *table, grub_uint8_t *ptr, grub_uint8_t *end, grub_uint8_t *scope, int scope_len) { grub_uint8_t *prev = table; if (!ptr) ptr = table + sizeof (struct grub_acpi_table_header); while (ptr < end && prev < ptr) { int add; prev = ptr; grub_dprintf ("acpi", "Opcode 0x%x\n", *ptr); grub_dprintf ("acpi", "Tell %x\n", (unsigned) (ptr - table)); switch (*ptr) { case GRUB_ACPI_OPCODE_EXTOP: ptr++; ptr += add = skip_ext_op (ptr, end); if (!add) return -1; break; case GRUB_ACPI_OPCODE_CREATE_DWORD_FIELD: case GRUB_ACPI_OPCODE_CREATE_WORD_FIELD: case GRUB_ACPI_OPCODE_CREATE_BYTE_FIELD: { ptr += 5; ptr += add = skip_data_ref_object (ptr, end); if (!add) return -1; ptr += 4; break; } case GRUB_ACPI_OPCODE_NAME: ptr++; if ((!scope || grub_memcmp (scope, "\\", scope_len) == 0) && (grub_memcmp (ptr, "_S5_", 4) == 0 || grub_memcmp (ptr, "\\_S5_", 4) == 0)) { int ll; grub_uint8_t *ptr2 = ptr; grub_dprintf ("acpi", "S5 found\n"); ptr2 += skip_name_string (ptr, end); if (*ptr2 != 0x12) { grub_printf ("Unknown opcode in _S5: 0x%x\n", *ptr2); return -1; } ptr2++; decode_length (ptr2, &ll); ptr2 += ll; ptr2++; switch (*ptr2) { case GRUB_ACPI_OPCODE_ZERO: return 0; case GRUB_ACPI_OPCODE_ONE: return 1; case GRUB_ACPI_OPCODE_BYTE_CONST: return ptr2[1]; default: grub_printf ("Unknown data type in _S5: 0x%x\n", *ptr2); return -1; } } ptr += add = skip_name_string (ptr, end); if (!add) return -1; ptr += add = skip_data_ref_object (ptr, end); if (!add) return -1; break; case GRUB_ACPI_OPCODE_ALIAS: ptr++; /* We need to skip two name strings */ ptr += add = skip_name_string (ptr, end); if (!add) return -1; ptr += add = skip_name_string (ptr, end); if (!add) return -1; break; case GRUB_ACPI_OPCODE_SCOPE: { int scope_sleep_type; int ll; grub_uint8_t *name; int name_len; ptr++; add = decode_length (ptr, &ll); name = ptr + ll; name_len = skip_name_string (name, ptr + add); if (!name_len) return -1; scope_sleep_type = get_sleep_type (table, name + name_len, ptr + add, name, name_len); if (scope_sleep_type != -2) return scope_sleep_type; ptr += add; break; } case GRUB_ACPI_OPCODE_IF: case GRUB_ACPI_OPCODE_METHOD: { ptr++; ptr += decode_length (ptr, 0); break; } default: grub_printf ("Unknown opcode 0x%x\n", *ptr); return -1; } } return -2; } #ifdef GRUB_DSDT_TEST int main (int argc, char **argv) { FILE *f; size_t len; unsigned char *buf; if (argc < 2) printf ("Usage: %s FILE\n", argv[0]); f = grub_util_fopen (argv[1], "rb"); if (!f) { printf ("Couldn't open file\n"); return 1; } fseek (f, 0, SEEK_END); len = ftell (f); fseek (f, 0, SEEK_SET); buf = malloc (len); if (!buf) { printf (_("error: %s.\n"), _("out of memory")); fclose (f); return 2; } if (fread (buf, 1, len, f) != len) { printf (_("cannot read `%s': %s"), argv[1], strerror (errno)); free (buf); fclose (f); return 2; } printf ("Sleep type = %d\n", get_sleep_type (buf, NULL, buf + len, NULL, 0)); free (buf); fclose (f); return 0; } #else void grub_acpi_halt (void) { struct grub_acpi_rsdp_v20 *rsdp2; struct grub_acpi_rsdp_v10 *rsdp1; struct grub_acpi_table_header *rsdt; grub_uint32_t *entry_ptr; grub_uint32_t port = 0; int sleep_type = -1; rsdp2 = grub_acpi_get_rsdpv2 (); if (rsdp2) rsdp1 = &(rsdp2->rsdpv1); else rsdp1 = grub_acpi_get_rsdpv1 (); grub_dprintf ("acpi", "rsdp1=%p\n", rsdp1); if (!rsdp1) return; rsdt = (struct grub_acpi_table_header *) (grub_addr_t) rsdp1->rsdt_addr; for (entry_ptr = (grub_uint32_t *) (rsdt + 1); entry_ptr < (grub_uint32_t *) (((grub_uint8_t *) rsdt) + rsdt->length); entry_ptr++) { if (grub_memcmp ((void *) (grub_addr_t) *entry_ptr, "FACP", 4) == 0) { struct grub_acpi_fadt *fadt = ((struct grub_acpi_fadt *) (grub_addr_t) *entry_ptr); struct grub_acpi_table_header *dsdt = (struct grub_acpi_table_header *) (grub_addr_t) fadt->dsdt_addr; grub_uint8_t *buf = (grub_uint8_t *) dsdt; port = fadt->pm1a; grub_dprintf ("acpi", "PM1a port=%x\n", port); if (grub_memcmp (dsdt->signature, "DSDT", sizeof (dsdt->signature)) == 0 && sleep_type < 0) sleep_type = get_sleep_type (buf, NULL, buf + dsdt->length, NULL, 0); } else if (grub_memcmp ((void *) (grub_addr_t) *entry_ptr, "SSDT", 4) == 0 && sleep_type < 0) { struct grub_acpi_table_header *ssdt = (struct grub_acpi_table_header *) (grub_addr_t) *entry_ptr; grub_uint8_t *buf = (grub_uint8_t *) ssdt; grub_dprintf ("acpi", "SSDT = %p\n", ssdt); sleep_type = get_sleep_type (buf, NULL, buf + ssdt->length, NULL, 0); } } grub_dprintf ("acpi", "SLP_TYP = %d, port = 0x%x\n", sleep_type, port); if (port && sleep_type >= 0 && sleep_type < 8) grub_outw (GRUB_ACPI_SLP_EN | (sleep_type << GRUB_ACPI_SLP_TYP_OFFSET), port & 0xffff); grub_millisleep (1500); /* TRANSLATORS: It's computer shutdown using ACPI, not disabling ACPI. */ grub_puts_ (N_("ACPI shutdown failed")); } #endif grub-2.14~git20250718.0e36779/grub-core/commands/sleep.c0000644000175000017500000000524415002425525016745 00000000000000/* sleep.c - Command to wait a specified number of seconds. */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2006,2007,2008 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); static const struct grub_arg_option options[] = { {"verbose", 'v', 0, N_("Verbose countdown."), 0, 0}, {"interruptible", 'i', 0, N_("Allow to interrupt with ESC."), 0, 0}, {0, 0, 0, 0, 0, 0} }; static struct grub_term_coordinate *pos; static void do_print (int n) { grub_term_restore_pos (pos); /* NOTE: Do not remove the trailing space characters. They are required to clear the line. */ grub_printf ("%d ", n); grub_refresh (); } /* Based on grub_millisleep() from kern/generic/millisleep.c. */ static int grub_interruptible_millisleep (grub_uint32_t ms) { grub_uint64_t start; start = grub_get_time_ms (); while (grub_get_time_ms () - start < ms) if (grub_key_is_interrupt (grub_getkey_noblock ())) return 1; return 0; } static grub_err_t grub_cmd_sleep (grub_extcmd_context_t ctxt, int argc, char **args) { struct grub_arg_list *state = ctxt->state; int n; if (argc != 1) return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("one argument expected")); n = grub_strtoul (args[0], 0, 10); if (n == 0) { /* Either `0' or broken input. */ return 0; } grub_refresh (); pos = grub_term_save_pos (); for (; n; n--) { if (state[0].set) do_print (n); if (state[1].set) { if (grub_interruptible_millisleep (1000)) return 1; } else grub_millisleep (1000); } if (state[0].set) do_print (0); return 0; } static grub_extcmd_t cmd; GRUB_MOD_INIT(sleep) { cmd = grub_register_extcmd ("sleep", grub_cmd_sleep, 0, N_("NUMBER_OF_SECONDS"), N_("Wait for a specified number of seconds."), options); } GRUB_MOD_FINI(sleep) { grub_unregister_extcmd (cmd); } grub-2.14~git20250718.0e36779/grub-core/commands/password_pbkdf2.c0000644000175000017500000001164115033157230020724 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (C) 2009 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); static grub_dl_t my_mod; struct pbkdf2_password { grub_uint8_t *salt; grub_size_t saltlen; unsigned int c; grub_uint8_t *expected; grub_size_t buflen; }; static grub_err_t check_password (const char *user, const char *entered, void *pin) { grub_uint8_t *buf; struct pbkdf2_password *pass = pin; gcry_err_code_t err; grub_err_t ret; buf = grub_malloc (pass->buflen); if (!buf) return grub_crypto_gcry_error (GPG_ERR_OUT_OF_MEMORY); err = grub_crypto_pbkdf2 (GRUB_MD_SHA512, (grub_uint8_t *) entered, grub_strlen (entered), pass->salt, pass->saltlen, pass->c, buf, pass->buflen); if (err) ret = grub_crypto_gcry_error (err); else if (grub_crypto_memcmp (buf, pass->expected, pass->buflen) != 0) ret = GRUB_ACCESS_DENIED; else { grub_auth_authenticate (user); ret = GRUB_ERR_NONE; } grub_free (buf); return ret; } static inline int hex2val (char hex) { if ('0' <= hex && hex <= '9') return hex - '0'; if ('a' <= hex && hex <= 'f') return hex - 'a' + 10; if ('A' <= hex && hex <= 'F') return hex - 'A' + 10; return -1; } static grub_err_t grub_cmd_password (grub_command_t cmd __attribute__ ((unused)), int argc, char **args) { grub_err_t err; const char *ptr, *ptr2; grub_uint8_t *ptro; struct pbkdf2_password *pass; if (argc != 2) return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("two arguments expected")); if (grub_memcmp (args[1], "grub.pbkdf2.sha512.", sizeof ("grub.pbkdf2.sha512.") - 1) != 0) return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("invalid PBKDF2 password")); ptr = args[1] + sizeof ("grub.pbkdf2.sha512.") - 1; pass = grub_malloc (sizeof (*pass)); if (!pass) return grub_errno; pass->c = grub_strtoul (ptr, &ptr, 0); if (grub_errno) { grub_free (pass); return grub_errno; } if (*ptr != '.') { grub_free (pass); return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("invalid PBKDF2 password")); } ptr++; ptr2 = grub_strchr (ptr, '.'); if (!ptr2 || ((ptr2 - ptr) & 1) || grub_strlen (ptr2 + 1) & 1) { grub_free (pass); return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("invalid PBKDF2 password")); } pass->saltlen = (ptr2 - ptr) >> 1; pass->buflen = grub_strlen (ptr2 + 1) >> 1; ptro = pass->salt = grub_malloc (pass->saltlen); if (!ptro) { grub_free (pass); return grub_errno; } while (ptr < ptr2) { int hex1, hex2; hex1 = hex2val (*ptr); ptr++; hex2 = hex2val (*ptr); ptr++; if (hex1 < 0 || hex2 < 0) { grub_free (pass->salt); grub_free (pass); return grub_error (GRUB_ERR_BAD_ARGUMENT, /* TRANSLATORS: it means that the string which was supposed to be a password hash doesn't have a correct format, not to password mismatch. */ N_("invalid PBKDF2 password")); } *ptro = (hex1 << 4) | hex2; ptro++; } ptro = pass->expected = grub_malloc (pass->buflen); if (!ptro) { grub_free (pass->salt); grub_free (pass); return grub_errno; } ptr = ptr2 + 1; ptr2 += grub_strlen (ptr2); while (ptr < ptr2) { int hex1, hex2; hex1 = hex2val (*ptr); ptr++; hex2 = hex2val (*ptr); ptr++; if (hex1 < 0 || hex2 < 0) { grub_free (pass->expected); grub_free (pass->salt); grub_free (pass); return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("invalid PBKDF2 password")); } *ptro = (hex1 << 4) | hex2; ptro++; } err = grub_auth_register_authentication (args[0], check_password, pass); if (err) { grub_free (pass); return err; } grub_dl_ref (my_mod); return GRUB_ERR_NONE; } static grub_command_t cmd; GRUB_MOD_INIT(password_pbkdf2) { my_mod = mod; cmd = grub_register_command ("password_pbkdf2", grub_cmd_password, N_("USER PBKDF2_PASSWORD"), N_("Set user password (PBKDF2). ")); } GRUB_MOD_FINI(password_pbkdf2) { grub_unregister_command (cmd); } grub-2.14~git20250718.0e36779/grub-core/commands/pcidump.c0000644000175000017500000001041515002425525017272 00000000000000/* lspci.c - List PCI devices. */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2013 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); struct iter_cxt { grub_uint32_t pciid_check_mask, pciid_check_value; int bus, device, function; int check_bus, check_device, check_function; }; static const struct grub_arg_option options[] = { {0, 'd', 0, N_("Select device by vendor and device IDs."), N_("[vendor]:[device]"), ARG_TYPE_STRING}, {0, 's', 0, N_("Select device by its position on the bus."), N_("[bus]:[slot][.func]"), ARG_TYPE_STRING}, {0, 0, 0, 0, 0, 0} }; static int grub_pcidump_iter (grub_pci_device_t dev, grub_pci_id_t pciid, void *data) { struct iter_cxt *ctx = data; grub_pci_address_t addr; int i; if ((pciid & ctx->pciid_check_mask) != ctx->pciid_check_value) return 0; if (ctx->check_bus && grub_pci_get_bus (dev) != ctx->bus) return 0; if (ctx->check_device && grub_pci_get_device (dev) != ctx->device) return 0; if (ctx->check_function && grub_pci_get_function (dev) != ctx->function) return 0; for (i = 0; i < 256; i += 4) { addr = grub_pci_make_address (dev, i); grub_printf ("%08x ", grub_pci_read (addr)); if ((i & 0xc) == 0xc) grub_printf ("\n"); } return 0; } static grub_err_t grub_cmd_pcidump (grub_extcmd_context_t ctxt, int argc __attribute__ ((unused)), char **argv __attribute__ ((unused))) { const char *ptr; struct iter_cxt ctx = { .pciid_check_value = 0, .pciid_check_mask = 0, .check_bus = 0, .check_device = 0, .check_function = 0, .bus = 0, .function = 0, .device = 0 }; if (ctxt->state[0].set) { ptr = ctxt->state[0].arg; ctx.pciid_check_value |= (grub_strtoul (ptr, &ptr, 16) & 0xffff); if (grub_errno == GRUB_ERR_BAD_NUMBER) { grub_errno = GRUB_ERR_NONE; ptr = ctxt->state[0].arg; } else ctx.pciid_check_mask |= 0xffff; if (grub_errno) return grub_errno; if (*ptr != ':') return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("missing `%c' symbol"), ':'); ptr++; ctx.pciid_check_value |= (grub_strtoul (ptr, &ptr, 16) & 0xffff) << 16; if (grub_errno == GRUB_ERR_BAD_NUMBER) grub_errno = GRUB_ERR_NONE; else ctx.pciid_check_mask |= 0xffff0000; } ctx.pciid_check_value &= ctx.pciid_check_mask; if (ctxt->state[1].set) { const char *optr; ptr = ctxt->state[1].arg; optr = ptr; ctx.bus = grub_strtoul (ptr, &ptr, 16); if (grub_errno == GRUB_ERR_BAD_NUMBER) { grub_errno = GRUB_ERR_NONE; ptr = optr; } else ctx.check_bus = 1; if (grub_errno) return grub_errno; if (*ptr != ':') return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("missing `%c' symbol"), ':'); ptr++; optr = ptr; ctx.device = grub_strtoul (ptr, &ptr, 16); if (grub_errno == GRUB_ERR_BAD_NUMBER) { grub_errno = GRUB_ERR_NONE; ptr = optr; } else ctx.check_device = 1; if (*ptr == '.') { ptr++; ctx.function = grub_strtoul (ptr, &ptr, 16); if (grub_errno) return grub_errno; ctx.check_function = 1; } } grub_pci_iterate (grub_pcidump_iter, &ctx); return GRUB_ERR_NONE; } static grub_extcmd_t cmd; GRUB_MOD_INIT(pcidump) { cmd = grub_register_extcmd ("pcidump", grub_cmd_pcidump, 0, N_("[-s POSITION] [-d DEVICE]"), N_("Show raw dump of the PCI configuration space."), options); } GRUB_MOD_FINI(pcidump) { grub_unregister_extcmd (cmd); } grub-2.14~git20250718.0e36779/grub-core/commands/fileXX.c0000644000175000017500000000410615002425525017030 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (C) 2013 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #pragma GCC diagnostic ignored "-Wcast-align" int grub_file_check_netbsdXX (grub_elf_t elf) { Elf_Shdr *s, *s0; grub_size_t shnum = elf->ehdr.ehdrXX.e_shnum; grub_size_t shentsize = elf->ehdr.ehdrXX.e_shentsize; grub_size_t shsize = shnum * shentsize; grub_off_t stroff; if (!shnum || !shentsize) return 0; s0 = grub_malloc (shsize); if (!s0) return 0; if (grub_file_seek (elf->file, elf->ehdr.ehdrXX.e_shoff) == (grub_off_t) -1) goto fail; if (grub_file_read (elf->file, s0, shsize) != (grub_ssize_t) shsize) goto fail; s = (Elf_Shdr *) ((char *) s0 + elf->ehdr.ehdrXX.e_shstrndx * shentsize); stroff = s->sh_offset; for (s = s0; s < (Elf_Shdr *) ((char *) s0 + shnum * shentsize); s = (Elf_Shdr *) ((char *) s + shentsize)) { char name[sizeof(".note.netbsd.ident")]; grub_memset (name, 0, sizeof (name)); if (grub_file_seek (elf->file, stroff + s->sh_name) == (grub_off_t) -1) goto fail; if (grub_file_read (elf->file, name, sizeof (name)) != (grub_ssize_t) sizeof (name)) { if (grub_errno) goto fail; continue; } if (grub_memcmp (name, ".note.netbsd.ident", sizeof(".note.netbsd.ident")) != 0) continue; grub_free (s0); return 1; } fail: grub_free (s0); return 0; } grub-2.14~git20250718.0e36779/grub-core/commands/search_file.c0000644000175000017500000000036015000202015020054 00000000000000#define DO_SEARCH_FILE 1 #define FUNC_NAME grub_search_fs_file #define COMMAND_NAME "search.file" #define HELP_MESSAGE N_("Search devices by file. If VARIABLE is specified, the first device found is set to a variable.") #include "search.c" grub-2.14~git20250718.0e36779/grub-core/commands/gptsync.c0000644000175000017500000001651115002425525017323 00000000000000/* gptsync.c - fill the mbr based on gpt entries */ /* XXX: I don't know what to do if sector size isn't 512 bytes */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2009 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); /* Convert a LBA address to a CHS address in the INT 13 format. */ /* Taken from grub1. */ /* XXX: use hardcoded geometry of C = 1024, H = 255, S = 63. Is it a problem? */ static void lba_to_chs (grub_uint32_t lba, grub_uint8_t *cl, grub_uint8_t *ch, grub_uint8_t *dh) { grub_uint32_t cylinder, head, sector; grub_uint32_t sectors = 63, heads = 255, cylinders = 1024; sector = lba % sectors + 1; head = (lba / sectors) % heads; cylinder = lba / (sectors * heads); if (cylinder >= cylinders) { *cl = *ch = *dh = 0xff; return; } *cl = sector | ((cylinder & 0x300) >> 2); *ch = cylinder & 0xFF; *dh = head; } static grub_err_t grub_cmd_gptsync (grub_command_t cmd __attribute__ ((unused)), int argc, char **args) { grub_device_t dev; struct grub_msdos_partition_mbr mbr; struct grub_partition *partition; grub_disk_addr_t first_sector; int numactive = 0; int i; if (argc < 1) return grub_error (GRUB_ERR_BAD_ARGUMENT, "device name required"); if (argc > 4) return grub_error (GRUB_ERR_BAD_ARGUMENT, "only 3 partitions can be " "in hybrid MBR"); if (args[0][0] == '(' && args[0][grub_strlen (args[0]) - 1] == ')') { args[0][grub_strlen (args[0]) - 1] = 0; dev = grub_device_open (args[0] + 1); args[0][grub_strlen (args[0])] = ')'; } else dev = grub_device_open (args[0]); if (! dev) return grub_errno; if (! dev->disk) { grub_device_close (dev); return grub_error (GRUB_ERR_BAD_ARGUMENT, "not a disk"); } /* Read the protective MBR. */ if (grub_disk_read (dev->disk, 0, 0, sizeof (mbr), &mbr)) { grub_device_close (dev); return grub_errno; } /* Check if it is valid. */ if (mbr.signature != grub_cpu_to_le16_compile_time (GRUB_PC_PARTITION_SIGNATURE)) { grub_device_close (dev); return grub_error (GRUB_ERR_BAD_PART_TABLE, "no signature"); } /* Make sure the MBR is a protective MBR and not a normal MBR. */ for (i = 0; i < 4; i++) if (mbr.entries[i].type == GRUB_PC_PARTITION_TYPE_GPT_DISK) break; if (i == 4) { grub_device_close (dev); return grub_error (GRUB_ERR_BAD_PART_TABLE, "no GPT partition map found"); } first_sector = dev->disk->total_sectors; for (i = 1; i < argc; i++) { char *separator, csep = 0; grub_uint8_t type; separator = grub_strchr (args[i], '+'); if (! separator) separator = grub_strchr (args[i], '-'); if (separator) { csep = *separator; *separator = 0; } partition = grub_partition_probe (dev->disk, args[i]); if (separator) *separator = csep; if (! partition) { grub_device_close (dev); return grub_error (GRUB_ERR_UNKNOWN_DEVICE, N_("no such partition")); } if (partition->start + partition->len > 0xffffffff) { grub_device_close (dev); return grub_error (GRUB_ERR_OUT_OF_RANGE, "only partitions residing in the first 2TB " "can be present in hybrid MBR"); } if (first_sector > partition->start) first_sector = partition->start; if (separator && *(separator + 1)) type = grub_strtoul (separator + 1, 0, 0); else { grub_fs_t fs = 0; dev->disk->partition = partition; fs = grub_fs_probe (dev); /* Unknown filesystem isn't fatal. */ if (grub_errno == GRUB_ERR_UNKNOWN_FS) { fs = 0; grub_errno = GRUB_ERR_NONE; } if (fs && grub_strcmp (fs->name, "ntfs") == 0) type = GRUB_PC_PARTITION_TYPE_NTFS; else if (fs && grub_strcmp (fs->name, "fat") == 0) /* FIXME: detect FAT16. */ type = GRUB_PC_PARTITION_TYPE_FAT32_LBA; else if (fs && (grub_strcmp (fs->name, "hfsplus") == 0 || grub_strcmp (fs->name, "hfs") == 0)) type = GRUB_PC_PARTITION_TYPE_HFS; else /* FIXME: detect more types. */ type = GRUB_PC_PARTITION_TYPE_EXT2FS; dev->disk->partition = 0; } mbr.entries[i].flag = (csep == '+') ? 0x80 : 0; if (csep == '+') { numactive++; if (numactive == 2) { grub_device_close (dev); return grub_error (GRUB_ERR_BAD_ARGUMENT, "only one partition can be active"); } } mbr.entries[i].type = type; mbr.entries[i].start = grub_cpu_to_le32 (partition->start); lba_to_chs (partition->start, &(mbr.entries[i].start_sector), &(mbr.entries[i].start_cylinder), &(mbr.entries[i].start_head)); lba_to_chs (partition->start + partition->len - 1, &(mbr.entries[i].end_sector), &(mbr.entries[i].end_cylinder), &(mbr.entries[i].end_head)); mbr.entries[i].length = grub_cpu_to_le32 (partition->len); grub_free (partition); } for (; i < 4; i++) grub_memset (&(mbr.entries[i]), 0, sizeof (mbr.entries[i])); /* The protective partition. */ if (first_sector > 0xffffffff) first_sector = 0xffffffff; else first_sector--; mbr.entries[0].flag = 0; mbr.entries[0].type = GRUB_PC_PARTITION_TYPE_GPT_DISK; mbr.entries[0].start = grub_cpu_to_le32_compile_time (1); lba_to_chs (1, &(mbr.entries[0].start_sector), &(mbr.entries[0].start_cylinder), &(mbr.entries[0].start_head)); lba_to_chs (first_sector, &(mbr.entries[0].end_sector), &(mbr.entries[0].end_cylinder), &(mbr.entries[0].end_head)); mbr.entries[0].length = grub_cpu_to_le32 (first_sector); mbr.signature = grub_cpu_to_le16_compile_time (GRUB_PC_PARTITION_SIGNATURE); if (grub_disk_write (dev->disk, 0, 0, sizeof (mbr), &mbr)) { grub_device_close (dev); return grub_errno; } grub_device_close (dev); grub_printf_ (N_("New MBR is written to `%s'\n"), args[0]); return GRUB_ERR_NONE; } static grub_command_t cmd; GRUB_MOD_INIT(gptsync) { (void) mod; /* To stop warning. */ cmd = grub_register_command ("gptsync", grub_cmd_gptsync, N_("DEVICE [PARTITION[+/-[TYPE]]] ..."), /* TRANSLATORS: MBR type is one-byte partition type id. */ N_("Fill hybrid MBR of GPT drive DEVICE. " "Specified partitions will be a part " "of hybrid MBR. Up to 3 partitions are " "allowed. TYPE is an MBR type. " "+ means that partition is active. " "Only one partition can be active.")); } GRUB_MOD_FINI(gptsync) { grub_unregister_command (cmd); } grub-2.14~git20250718.0e36779/grub-core/commands/usbtest.c0000644000175000017500000001307015002425525017322 00000000000000/* usbtest.c - test module for USB */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2008 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); static const char *usb_classes[] = { "Unknown", "Audio", "Communication Interface", "HID", "Unknown", "Physical", "Image", "Printer", "Mass Storage", "Hub", "Data Interface", "Smart Card", "Content Security", "Video" }; static const char *usb_endp_type[] = { "Control", "Isochronous", "Bulk", "Interrupt" }; static const char *usb_devspeed[] = { "", "Low", "Full", "High" }; #if __GNUC__ >= 9 #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Waddress-of-packed-member" #endif static grub_usb_err_t grub_usb_get_string (grub_usb_device_t dev, grub_uint8_t index, int langid, char **string) { struct grub_usb_desc_str descstr; struct grub_usb_desc_str *descstrp; grub_usb_err_t err; /* Only get the length. */ err = grub_usb_control_msg (dev, 1 << 7, 0x06, (3 << 8) | index, langid, 1, (char *) &descstr); if (err) return err; descstrp = grub_malloc (descstr.length); if (! descstrp) return GRUB_USB_ERR_INTERNAL; err = grub_usb_control_msg (dev, 1 << 7, 0x06, (3 << 8) | index, langid, descstr.length, (char *) descstrp); if (descstrp->length == 0) { grub_free (descstrp); *string = grub_strdup (""); if (! *string) return GRUB_USB_ERR_INTERNAL; return GRUB_USB_ERR_NONE; } *string = grub_malloc (descstr.length * 2 + 1); if (! *string) { grub_free (descstrp); return GRUB_USB_ERR_INTERNAL; } *grub_utf16_to_utf8 ((grub_uint8_t *) *string, descstrp->str, descstrp->length / 2 - 1) = 0; grub_free (descstrp); return GRUB_USB_ERR_NONE; } #if __GNUC__ >= 9 #pragma GCC diagnostic pop #endif static void usb_print_str (const char *description, grub_usb_device_t dev, int idx) { char *name = NULL; grub_usb_err_t err; /* XXX: LANGID */ if (! idx) return; err = grub_usb_get_string (dev, idx, 0x0409, &name); if (err) grub_printf ("Error %d retrieving %s\n", err, description); else { grub_printf ("%s: `%s'\n", description, name); grub_free (name); } } static int usb_iterate (grub_usb_device_t dev, void *data __attribute__ ((unused))) { struct grub_usb_desc_device *descdev; int i; descdev = &dev->descdev; usb_print_str ("Product", dev, descdev->strprod); usb_print_str ("Vendor", dev, descdev->strvendor); usb_print_str ("Serial", dev, descdev->strserial); grub_printf ("Class: (0x%02x) %s, Subclass: 0x%02x, Protocol: 0x%02x\n", descdev->class, descdev->class < ARRAY_SIZE (usb_classes) ? usb_classes[descdev->class] : "Unknown", descdev->subclass, descdev->protocol); grub_printf ("USB version %d.%d, VendorID: 0x%02x, ProductID: 0x%02x, #conf: %d\n", descdev->usbrel >> 8, (descdev->usbrel >> 4) & 0x0F, descdev->vendorid, descdev->prodid, descdev->configcnt); grub_printf ("%s speed device\n", usb_devspeed[dev->speed]); for (i = 0; i < descdev->configcnt; i++) { struct grub_usb_desc_config *config; config = dev->config[i].descconf; usb_print_str ("Configuration:", dev, config->strconfig); } for (i = 0; i < dev->config[0].descconf->numif; i++) { int j; struct grub_usb_desc_if *interf; interf = dev->config[0].interf[i].descif; grub_printf ("Interface #%d: #Endpoints: %d ", i, interf->endpointcnt); grub_printf ("Class: (0x%02x) %s, Subclass: 0x%02x, Protocol: 0x%02x\n", interf->class, interf->class < ARRAY_SIZE (usb_classes) ? usb_classes[interf->class] : "Unknown", interf->subclass, interf->protocol); usb_print_str ("Interface", dev, interf->strif); for (j = 0; j < interf->endpointcnt; j++) { struct grub_usb_desc_endp *endp; endp = &dev->config[0].interf[i].descendp[j]; grub_printf ("Endpoint #%d: %s, max packed size: %d, transfer type: %s, latency: %d\n", endp->endp_addr & 15, (endp->endp_addr & 128) ? "IN" : "OUT", endp->maxpacket, usb_endp_type[endp->attrib & 3], endp->interval); } } grub_printf("\n"); return 0; } static grub_err_t grub_cmd_usbtest (grub_command_t cmd __attribute__ ((unused)), int argc __attribute__ ((unused)), char **args __attribute__ ((unused))) { grub_usb_poll_devices (1); grub_printf ("USB devices:\n\n"); grub_usb_iterate (usb_iterate, NULL); return 0; } static grub_command_t cmd; GRUB_MOD_INIT(usbtest) { cmd = grub_register_command ("usb", grub_cmd_usbtest, 0, N_("Test USB support.")); } GRUB_MOD_FINI(usbtest) { grub_unregister_command (cmd); } grub-2.14~git20250718.0e36779/grub-core/commands/true.c0000644000175000017500000000340115000202015016566 00000000000000/* true.c - true and false commands. */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2009 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); static grub_err_t grub_cmd_true (struct grub_command *cmd __attribute__ ((unused)), int argc __attribute__ ((unused)), char *argv[] __attribute__ ((unused))) { return 0; } static grub_err_t grub_cmd_false (struct grub_command *cmd __attribute__ ((unused)), int argc __attribute__ ((unused)), char *argv[] __attribute__ ((unused))) { return grub_error (GRUB_ERR_TEST_FAILURE, N_("false")); } static grub_command_t cmd_true, cmd_false; GRUB_MOD_INIT(true) { cmd_true = grub_register_command ("true", grub_cmd_true, /* TRANSLATORS: it's a command description. */ 0, N_("Do nothing, successfully.")); cmd_false = grub_register_command ("false", grub_cmd_false, /* TRANSLATORS: it's a command description. */ 0, N_("Do nothing, unsuccessfully.")); } GRUB_MOD_FINI(true) { grub_unregister_command (cmd_true); grub_unregister_command (cmd_false); } grub-2.14~git20250718.0e36779/grub-core/commands/echo.c0000644000175000017500000000555715033157230016561 00000000000000/* echo.c - Command to display a line of text */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2006,2007,2010 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); static const struct grub_arg_option options[] = { {0, 'n', 0, N_("Do not output the trailing newline."), 0, 0}, {0, 'e', 0, N_("Enable interpretation of backslash escapes."), 0, 0}, {0, 0, 0, 0, 0, 0} }; static grub_err_t grub_cmd_echo (grub_extcmd_context_t ctxt, int argc, char **args) { struct grub_arg_list *state = ctxt->state; int newline = 1; int i; /* Check if `-n' was used. */ if (state[0].set) newline = 0; for (i = 0; i < argc; i++) { char *arg = *args; /* Unescaping results in a string no longer than the original. */ char *unescaped = grub_malloc (grub_strlen (arg) + 1); char *p = unescaped; args++; if (!unescaped) return grub_errno; while (*arg) { /* In case `-e' is used, parse backslashes. */ if (*arg == '\\' && state[1].set) { arg++; if (*arg == '\0') break; switch (*arg) { case '\\': *p++ = '\\'; break; case 'a': *p++ = '\a'; break; case 'c': newline = 0; break; case 'f': *p++ = '\f'; break; case 'n': *p++ = '\n'; break; case 'r': *p++ = '\r'; break; case 't': *p++ = '\t'; break; case 'v': *p++ = '\v'; break; } arg++; continue; } /* This was not an escaped character, or escaping is not enabled. */ *p++ = *arg; arg++; } *p = '\0'; grub_xputs (unescaped); grub_free (unescaped); /* If another argument follows, insert a space. */ if (i != argc - 1) grub_printf (" " ); } if (newline) grub_printf ("\n"); grub_refresh (); return 0; } static grub_extcmd_t cmd; GRUB_MOD_INIT(echo) { cmd = grub_register_extcmd ("echo", grub_cmd_echo, GRUB_COMMAND_ACCEPT_DASH | GRUB_COMMAND_OPTIONS_AT_START, N_("[-e|-n] STRING"), N_("Display a line of text."), options); } GRUB_MOD_FINI(echo) { grub_unregister_extcmd (cmd); } grub-2.14~git20250718.0e36779/grub-core/commands/lsmmap.c0000644000175000017500000000527415002425525017131 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (C) 2008 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); #ifndef GRUB_MACHINE_EMU static const char *names[] = { [GRUB_MEMORY_AVAILABLE] = N_("available RAM"), [GRUB_MEMORY_RESERVED] = N_("reserved RAM"), /* TRANSLATORS: this refers to memory where ACPI tables are stored and which can be used by OS once it loads ACPI tables. */ [GRUB_MEMORY_ACPI] = N_("ACPI reclaimable RAM"), /* TRANSLATORS: this refers to memory which ACPI-compliant OS is required to save accross hibernations. */ [GRUB_MEMORY_NVS] = N_("ACPI non-volatile storage RAM"), [GRUB_MEMORY_BADRAM] = N_("faulty RAM (BadRAM)"), [GRUB_MEMORY_PERSISTENT] = N_("persistent RAM"), [GRUB_MEMORY_PERSISTENT_LEGACY] = N_("persistent RAM (legacy)"), [GRUB_MEMORY_COREBOOT_TABLES] = N_("RAM holding coreboot tables"), [GRUB_MEMORY_CODE] = N_("RAM holding firmware code") }; /* Helper for grub_cmd_lsmmap. */ static int lsmmap_hook (grub_uint64_t addr, grub_uint64_t size, grub_memory_type_t type, void *data __attribute__ ((unused))) { if (type < (int) ARRAY_SIZE (names) && type >= 0 && names[type]) grub_printf_ (N_("base_addr = 0x%llx, length = 0x%llx, %s\n"), (long long) addr, (long long) size, _(names[type])); else grub_printf_ (N_("base_addr = 0x%llx, length = 0x%llx, type = 0x%x\n"), (long long) addr, (long long) size, type); return 0; } #endif static grub_err_t grub_cmd_lsmmap (grub_command_t cmd __attribute__ ((unused)), int argc __attribute__ ((unused)), char **args __attribute__ ((unused))) { #ifndef GRUB_MACHINE_EMU grub_machine_mmap_iterate (lsmmap_hook, NULL); #endif return 0; } static grub_command_t cmd; GRUB_MOD_INIT(lsmmap) { cmd = grub_register_command ("lsmmap", grub_cmd_lsmmap, 0, N_("List memory map provided by firmware.")); } GRUB_MOD_FINI(lsmmap) { grub_unregister_command (cmd); } grub-2.14~git20250718.0e36779/grub-core/commands/xen/0000755000175000017500000000000015036452575016352 500000000000000grub-2.14~git20250718.0e36779/grub-core/commands/xen/lsxen.c0000644000175000017500000000425115000202015017536 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (C) 2011 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); static int hook (const char *dir, void *hook_data __attribute__ ((unused))) { grub_printf ("%s\n", dir); return 0; } static grub_err_t grub_cmd_lsxen (grub_command_t cmd __attribute__ ((unused)), int argc, char **args) { char *dir; grub_err_t err; char *buf; if (argc >= 1) return grub_xenstore_dir (args[0], hook, NULL); buf = grub_xenstore_get_file ("domid", NULL); if (!buf) return grub_errno; dir = grub_xasprintf ("/local/domain/%s", buf); grub_free (buf); err = grub_xenstore_dir (dir, hook, NULL); grub_free (dir); return err; } static grub_err_t grub_cmd_catxen (grub_command_t cmd __attribute__ ((unused)), int argc, char **args) { const char *dir = "domid"; char *buf; if (argc >= 1) dir = args[0]; buf = grub_xenstore_get_file (dir, NULL); if (!buf) return grub_errno; grub_xputs (buf); grub_xputs ("\n"); grub_free (buf); return GRUB_ERR_NONE; } static grub_command_t cmd_ls, cmd_cat; GRUB_MOD_INIT (lsxen) { cmd_ls = grub_register_command ("xen_ls", grub_cmd_lsxen, N_("[DIR]"), N_("List Xen storage.")); cmd_cat = grub_register_command ("xen_cat", grub_cmd_catxen, N_("[DIR]"), N_("List Xen storage.")); } GRUB_MOD_FINI (lsxen) { grub_unregister_command (cmd_ls); grub_unregister_command (cmd_cat); } grub-2.14~git20250718.0e36779/grub-core/commands/pgp.c0000644000175000017500000006001615036447510016426 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (C) 2013 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); enum { OPTION_SKIP_SIG = 0 }; static const struct grub_arg_option options[] = { {"skip-sig", 's', 0, N_("Skip signature-checking of the public key file."), 0, ARG_TYPE_NONE}, {0, 0, 0, 0, 0, 0} }; static grub_err_t read_packet_header (grub_file_t sig, grub_uint8_t *out_type, grub_size_t *len) { grub_uint8_t type; grub_uint8_t l; grub_uint16_t l16; grub_uint32_t l32; /* New format. */ switch (grub_file_read (sig, &type, sizeof (type))) { case 1: break; case 0: { *out_type = 0xff; return 0; } default: if (grub_errno) return grub_errno; /* TRANSLATORS: it's about GNUPG signatures. */ return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature")); } if (type == 0) { *out_type = 0xfe; return 0; } if (!(type & 0x80)) return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature")); if (type & 0x40) { *out_type = (type & 0x3f); if (grub_file_read (sig, &l, sizeof (l)) != 1) return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature")); if (l < 192) { *len = l; return 0; } if (l < 224) { *len = (l - 192) << GRUB_CHAR_BIT; if (grub_file_read (sig, &l, sizeof (l)) != 1) return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature")); *len |= l; return 0; } if (l == 255) { if (grub_file_read (sig, &l32, sizeof (l32)) != sizeof (l32)) return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature")); *len = grub_be_to_cpu32 (l32); return 0; } return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature")); } *out_type = ((type >> 2) & 0xf); switch (type & 0x3) { case 0: if (grub_file_read (sig, &l, sizeof (l)) != sizeof (l)) return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature")); *len = l; return 0; case 1: if (grub_file_read (sig, &l16, sizeof (l16)) != sizeof (l16)) return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature")); *len = grub_be_to_cpu16 (l16); return 0; case 2: if (grub_file_read (sig, &l32, sizeof (l32)) != sizeof (l32)) return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature")); *len = grub_be_to_cpu32 (l32); return 0; } return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature")); } struct signature_v4_header { grub_uint8_t type; grub_uint8_t pkeyalgo; grub_uint8_t hash; grub_uint16_t hashed_sub; } GRUB_PACKED; struct gcry_pk_spec *grub_crypto_pk_dsa; struct gcry_pk_spec *grub_crypto_pk_ecdsa; struct gcry_pk_spec *grub_crypto_pk_rsa; struct { const char *name; const char *sigsexp; grub_size_t nmpisig; const char *pubsexp; grub_size_t nmpipub; struct gcry_pk_spec **algo; const char *padding; const char *module; } pkalgos[] = { [1] = { "rsa", "(sig-val (rsa (s %M)))", 1, "(public-key (dsa (n %M) (e %M)))", 2, &grub_crypto_pk_rsa, "pkcs1", "gcry_rsa" }, [3] = { "rsa", "(sig-val (rsa (s %M)))", 1, "(public-key (dsa (n %M) (e %M)))", 2, &grub_crypto_pk_rsa, "pkcs1", "gcry_rsa" }, [17] = { "dsa", "(sig-val (dsa (r %M) (s %M)))", 2, "(public-key (dsa (p %M) (q %M) (g %M) (y %M)))", 4, &grub_crypto_pk_dsa, "raw", "gcry_dsa" }, }; struct grub_public_key { struct grub_public_key *next; struct grub_public_subkey *subkeys; }; struct grub_public_subkey { struct grub_public_subkey *next; grub_uint8_t type; grub_uint32_t fingerprint[5]; gcry_mpi_t mpis[10]; }; static void free_pk (struct grub_public_key *pk) { struct grub_public_subkey *nsk, *sk; for (sk = pk->subkeys; sk; sk = nsk) { grub_size_t i; for (i = 0; i < ARRAY_SIZE (sk->mpis); i++) if (sk->mpis[i]) _gcry_mpi_release (sk->mpis[i]); nsk = sk->next; grub_free (sk); } grub_free (pk); } #define READBUF_SIZE 4096 struct grub_public_key * grub_load_public_key (grub_file_t f) { grub_err_t err; struct grub_public_key *ret; struct grub_public_subkey **last = 0; void *fingerprint_context = NULL; grub_uint8_t *buffer = NULL; ret = grub_zalloc (sizeof (*ret)); if (!ret) { grub_free (fingerprint_context); return NULL; } buffer = grub_zalloc (READBUF_SIZE); fingerprint_context = grub_zalloc (GRUB_MD_SHA1->contextsize); if (!buffer || !fingerprint_context) goto fail; last = &ret->subkeys; while (1) { grub_uint8_t type; grub_size_t len; grub_uint8_t v, pk; grub_uint32_t creation_time; grub_off_t pend; struct grub_public_subkey *sk; grub_size_t i; grub_uint16_t len_be; err = read_packet_header (f, &type, &len); if (err) goto fail; if (type == 0xfe) continue; if (type == 0xff) { grub_free (fingerprint_context); grub_free (buffer); return ret; } grub_dprintf ("crypt", "len = %x\n", (int) len); pend = grub_file_tell (f) + len; if (type != 6 && type != 14 && type != 5 && type != 7) { grub_file_seek (f, pend); continue; } if (grub_file_read (f, &v, sizeof (v)) != sizeof (v)) { grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature")); goto fail; } grub_dprintf ("crypt", "v = %x\n", v); if (v != 4) { grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature")); goto fail; } if (grub_file_read (f, &creation_time, sizeof (creation_time)) != sizeof (creation_time)) { grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature")); goto fail; } grub_dprintf ("crypt", "time = %x\n", creation_time); if (grub_file_read (f, &pk, sizeof (pk)) != sizeof (pk)) { grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature")); goto fail; } grub_dprintf ("crypt", "pk = %x\n", pk); if (pk >= ARRAY_SIZE (pkalgos) || pkalgos[pk].name == NULL) { grub_file_seek (f, pend); continue; } sk = grub_zalloc (sizeof (struct grub_public_subkey)); if (!sk) goto fail; grub_memset (fingerprint_context, 0, GRUB_MD_SHA1->contextsize); GRUB_MD_SHA1->init (fingerprint_context, 0); GRUB_MD_SHA1->write (fingerprint_context, "\x99", 1); len_be = grub_cpu_to_be16 (len); GRUB_MD_SHA1->write (fingerprint_context, &len_be, sizeof (len_be)); GRUB_MD_SHA1->write (fingerprint_context, &v, sizeof (v)); GRUB_MD_SHA1->write (fingerprint_context, &creation_time, sizeof (creation_time)); GRUB_MD_SHA1->write (fingerprint_context, &pk, sizeof (pk)); for (i = 0; i < pkalgos[pk].nmpipub; i++) { grub_uint16_t l; grub_size_t lb; if (grub_file_read (f, &l, sizeof (l)) != sizeof (l)) { grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature")); break; } lb = (grub_be_to_cpu16 (l) + GRUB_CHAR_BIT - 1) / GRUB_CHAR_BIT; if (lb > READBUF_SIZE - sizeof (grub_uint16_t)) { grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature")); break; } if (grub_file_read (f, buffer + sizeof (grub_uint16_t), lb) != (grub_ssize_t) lb) { grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature")); break; } grub_memcpy (buffer, &l, sizeof (l)); GRUB_MD_SHA1->write (fingerprint_context, buffer, lb + sizeof (grub_uint16_t)); if (_gcry_mpi_scan (&sk->mpis[i], GCRYMPI_FMT_PGP, buffer, lb + sizeof (grub_uint16_t), 0)) { grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature")); break; } } if (i < pkalgos[pk].nmpipub) { grub_free (sk); goto fail; } GRUB_MD_SHA1->final (fingerprint_context); grub_memcpy (sk->fingerprint, GRUB_MD_SHA1->read (fingerprint_context), 20); *last = sk; last = &sk->next; grub_dprintf ("crypt", "actual pos: %x, expected: %x\n", (int)grub_file_tell (f), (int)pend); grub_file_seek (f, pend); } fail: free_pk (ret); grub_free (fingerprint_context); grub_free (buffer); return NULL; } struct grub_public_key *grub_pk_trusted; struct grub_public_subkey * grub_crypto_pk_locate_subkey (grub_uint64_t keyid, struct grub_public_key *pkey) { struct grub_public_subkey *sk; for (sk = pkey->subkeys; sk; sk = sk->next) if (grub_memcmp (sk->fingerprint + 3, &keyid, 8) == 0) return sk; return 0; } struct grub_public_subkey * grub_crypto_pk_locate_subkey_in_trustdb (grub_uint64_t keyid) { struct grub_public_key *pkey; struct grub_public_subkey *sk; for (pkey = grub_pk_trusted; pkey; pkey = pkey->next) { sk = grub_crypto_pk_locate_subkey (keyid, pkey); if (sk) return sk; } return 0; } struct grub_pubkey_context { grub_file_t sig; struct signature_v4_header v4; grub_uint8_t v; const gcry_md_spec_t *hash; void *hash_context; }; static grub_err_t grub_verify_signature_init (struct grub_pubkey_context *ctxt, grub_file_t sig) { grub_size_t len; grub_uint8_t h; grub_uint8_t t; grub_uint8_t pk; grub_err_t err; grub_uint8_t type = 0; grub_memset (ctxt, 0, sizeof (*ctxt)); err = read_packet_header (sig, &type, &len); if (err) return err; if (type != 0x2) return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature")); if (grub_file_read (sig, &ctxt->v, sizeof (ctxt->v)) != sizeof (ctxt->v)) return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature")); if (ctxt->v != 4) return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature")); if (grub_file_read (sig, &ctxt->v4, sizeof (ctxt->v4)) != sizeof (ctxt->v4)) return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature")); h = ctxt->v4.hash; t = ctxt->v4.type; pk = ctxt->v4.pkeyalgo; if (t != 0) return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature")); if (pk >= ARRAY_SIZE (pkalgos) || pkalgos[pk].name == NULL) return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature")); ctxt->hash = grub_crypto_lookup_md_by_algo (h); if (!ctxt->hash) return grub_error (GRUB_ERR_BAD_SIGNATURE, "hash `%d' not loaded", h); grub_dprintf ("crypt", "alive\n"); ctxt->hash_context = grub_zalloc (ctxt->hash->contextsize); if (!ctxt->hash_context) return grub_errno; ctxt->hash->init (ctxt->hash_context, 0); ctxt->sig = sig; return GRUB_ERR_NONE; } static grub_err_t grub_pubkey_write (void *ctxt_, void *buf, grub_size_t size) { struct grub_pubkey_context *ctxt = ctxt_; ctxt->hash->write (ctxt->hash_context, buf, size); return GRUB_ERR_NONE; } static grub_err_t grub_verify_signature_real (struct grub_pubkey_context *ctxt, struct grub_public_key *pkey) { gcry_mpi_t mpis[10]; grub_uint8_t pk = ctxt->v4.pkeyalgo; grub_size_t i; grub_uint8_t *readbuf = NULL; unsigned char *hval; grub_ssize_t rem = grub_be_to_cpu16 (ctxt->v4.hashed_sub); grub_uint32_t headlen = grub_cpu_to_be32 (rem + 6); grub_uint8_t s; grub_uint16_t unhashed_sub; grub_ssize_t r; grub_uint8_t hash_start[2]; grub_uint64_t keyid = 0; struct grub_public_subkey *sk; readbuf = grub_malloc (READBUF_SIZE); if (!readbuf) goto fail; ctxt->hash->write (ctxt->hash_context, &ctxt->v, sizeof (ctxt->v)); ctxt->hash->write (ctxt->hash_context, &ctxt->v4, sizeof (ctxt->v4)); while (rem) { r = grub_file_read (ctxt->sig, readbuf, rem < READBUF_SIZE ? rem : READBUF_SIZE); if (r < 0) goto fail; if (r == 0) break; ctxt->hash->write (ctxt->hash_context, readbuf, r); rem -= r; } ctxt->hash->write (ctxt->hash_context, &ctxt->v, sizeof (ctxt->v)); s = 0xff; ctxt->hash->write (ctxt->hash_context, &s, sizeof (s)); ctxt->hash->write (ctxt->hash_context, &headlen, sizeof (headlen)); r = grub_file_read (ctxt->sig, &unhashed_sub, sizeof (unhashed_sub)); if (r != sizeof (unhashed_sub)) goto fail; { grub_uint8_t *ptr; grub_uint32_t l; rem = grub_be_to_cpu16 (unhashed_sub); if (rem > READBUF_SIZE) goto fail; r = grub_file_read (ctxt->sig, readbuf, rem); if (r != rem) goto fail; for (ptr = readbuf; ptr < readbuf + rem; ptr += l) { if (*ptr < 192) l = *ptr++; else if (*ptr < 255) { if (ptr + 1 >= readbuf + rem) break; l = (((ptr[0] & ~192) << GRUB_CHAR_BIT) | ptr[1]) + 192; ptr += 2; } else { if (ptr + 5 >= readbuf + rem) break; l = grub_be_to_cpu32 (grub_get_unaligned32 (ptr + 1)); ptr += 5; } if (*ptr == 0x10 && l >= 8) keyid = grub_get_unaligned64 (ptr + 1); } } ctxt->hash->final (ctxt->hash_context); grub_dprintf ("crypt", "alive\n"); hval = ctxt->hash->read (ctxt->hash_context); if (grub_file_read (ctxt->sig, hash_start, sizeof (hash_start)) != sizeof (hash_start)) goto fail; if (grub_memcmp (hval, hash_start, sizeof (hash_start)) != 0) goto fail; grub_dprintf ("crypt", "@ %x\n", (int)grub_file_tell (ctxt->sig)); for (i = 0; i < pkalgos[pk].nmpisig; i++) { grub_uint16_t l; grub_size_t lb; grub_dprintf ("crypt", "alive\n"); if (grub_file_read (ctxt->sig, &l, sizeof (l)) != sizeof (l)) goto fail; grub_dprintf ("crypt", "alive\n"); lb = (grub_be_to_cpu16 (l) + 7) / 8; grub_dprintf ("crypt", "l = 0x%04x\n", grub_be_to_cpu16 (l)); if (lb > READBUF_SIZE - sizeof (grub_uint16_t)) goto fail; grub_dprintf ("crypt", "alive\n"); if (grub_file_read (ctxt->sig, readbuf + sizeof (grub_uint16_t), lb) != (grub_ssize_t) lb) goto fail; grub_dprintf ("crypt", "alive\n"); grub_memcpy (readbuf, &l, sizeof (l)); grub_dprintf ("crypt", "alive\n"); if (_gcry_mpi_scan (&mpis[i], GCRYMPI_FMT_PGP, readbuf, lb + sizeof (grub_uint16_t), 0)) goto fail; grub_dprintf ("crypt", "alive\n"); } if (pkey) sk = grub_crypto_pk_locate_subkey (keyid, pkey); else sk = grub_crypto_pk_locate_subkey_in_trustdb (keyid); if (!sk) { /* TRANSLATORS: %08x is 32-bit key id. */ grub_error (GRUB_ERR_BAD_SIGNATURE, N_("public key %08" PRIxGRUB_UINT64_T " not found"), keyid); goto fail; } if (!*pkalgos[pk].algo) { grub_dl_load (pkalgos[pk].module); grub_errno = GRUB_ERR_NONE; } if (!*pkalgos[pk].algo) { grub_error (GRUB_ERR_BAD_SIGNATURE, N_("module `%s' isn't loaded"), pkalgos[pk].module); goto fail; } gcry_sexp_t hsexp, pubkey, sig; grub_size_t errof; if(_gcry_sexp_build(&hsexp, &errof, "(data (flags %s) (hash %s %b))", pkalgos[pk].padding, ctxt->hash->name, ctxt->hash->mdlen, hval)) goto fail; if(_gcry_sexp_build(&pubkey, &errof, pkalgos[pk].pubsexp, sk->mpis[0], sk->mpis[1], sk->mpis[2], sk->mpis[3])) goto fail; if(_gcry_sexp_build(&sig, &errof, pkalgos[pk].sigsexp, mpis[0], mpis[1])) goto fail; _gcry_sexp_dump(sig); _gcry_sexp_dump(hsexp); _gcry_sexp_dump(pubkey); if ((*pkalgos[pk].algo)->verify (sig, hsexp, pubkey)) goto fail; grub_free (readbuf); return GRUB_ERR_NONE; fail: grub_free (readbuf); if (!grub_errno) return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature")); return grub_errno; } static void grub_pubkey_close_real (struct grub_pubkey_context *ctxt) { if (ctxt->sig) grub_file_close (ctxt->sig); if (ctxt->hash_context) grub_free (ctxt->hash_context); } static void grub_pubkey_close (void *ctxt) { grub_pubkey_close_real (ctxt); grub_free (ctxt); } grub_err_t grub_verify_signature (grub_file_t f, const char *fsig, struct grub_public_key *pkey) { grub_file_t sig; grub_err_t err; struct grub_pubkey_context ctxt; grub_uint8_t *readbuf = NULL; sig = grub_file_open (fsig, GRUB_FILE_TYPE_SIGNATURE | GRUB_FILE_TYPE_NO_DECOMPRESS); if (!sig) return grub_errno; err = grub_verify_signature_init (&ctxt, sig); if (err) { grub_file_close (sig); return err; } readbuf = grub_zalloc (READBUF_SIZE); if (!readbuf) goto fail; while (1) { grub_ssize_t r; r = grub_file_read (f, readbuf, READBUF_SIZE); if (r < 0) goto fail; if (r == 0) break; err = grub_pubkey_write (&ctxt, readbuf, r); if (err) return err; } grub_verify_signature_real (&ctxt, pkey); fail: grub_pubkey_close_real (&ctxt); return grub_errno; } static grub_err_t grub_cmd_trust (grub_extcmd_context_t ctxt, int argc, char **args) { grub_file_t pkf; struct grub_public_key *pk = NULL; if (argc < 1) return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("one argument expected")); pkf = grub_file_open (args[0], GRUB_FILE_TYPE_PUBLIC_KEY_TRUST | GRUB_FILE_TYPE_NO_DECOMPRESS | (ctxt->state[OPTION_SKIP_SIG].set ? GRUB_FILE_TYPE_SKIP_SIGNATURE : GRUB_FILE_TYPE_NONE)); if (!pkf) return grub_errno; pk = grub_load_public_key (pkf); if (!pk) { grub_file_close (pkf); return grub_errno; } grub_file_close (pkf); pk->next = grub_pk_trusted; grub_pk_trusted = pk; return GRUB_ERR_NONE; } static grub_err_t grub_cmd_list (grub_command_t cmd __attribute__ ((unused)), int argc __attribute__ ((unused)), char **args __attribute__ ((unused))) { struct grub_public_key *pk = NULL; struct grub_public_subkey *sk = NULL; for (pk = grub_pk_trusted; pk; pk = pk->next) for (sk = pk->subkeys; sk; sk = sk->next) { unsigned i; for (i = 0; i < 20; i += 2) grub_printf ("%02x%02x ", ((grub_uint8_t *) sk->fingerprint)[i], ((grub_uint8_t *) sk->fingerprint)[i + 1]); grub_printf ("\n"); } return GRUB_ERR_NONE; } static grub_err_t grub_cmd_distrust (grub_command_t cmd __attribute__ ((unused)), int argc, char **args) { grub_uint32_t keyid, keyid_be; struct grub_public_key **pkey; struct grub_public_subkey *sk; if (argc < 1) return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("one argument expected")); keyid = grub_strtoull (args[0], 0, 16); if (grub_errno) return grub_errno; keyid_be = grub_cpu_to_be32 (keyid); for (pkey = &grub_pk_trusted; *pkey; pkey = &((*pkey)->next)) { struct grub_public_key *next; for (sk = (*pkey)->subkeys; sk; sk = sk->next) if (grub_memcmp (sk->fingerprint + 4, &keyid_be, 4) == 0) break; if (!sk) continue; next = (*pkey)->next; free_pk (*pkey); *pkey = next; return GRUB_ERR_NONE; } /* TRANSLATORS: %08x is 32-bit key id. */ return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("public key %08x not found"), keyid); } static grub_err_t grub_cmd_verify_signature (grub_extcmd_context_t ctxt, int argc, char **args) { grub_file_t f = NULL; grub_err_t err = GRUB_ERR_NONE; struct grub_public_key *pk = NULL; grub_dprintf ("crypt", "alive\n"); if (argc < 2) return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("two arguments expected")); grub_dprintf ("crypt", "alive\n"); if (argc > 2) { grub_file_t pkf; pkf = grub_file_open (args[2], GRUB_FILE_TYPE_PUBLIC_KEY | GRUB_FILE_TYPE_NO_DECOMPRESS | (ctxt->state[OPTION_SKIP_SIG].set ? GRUB_FILE_TYPE_SKIP_SIGNATURE : GRUB_FILE_TYPE_NONE)); if (!pkf) return grub_errno; pk = grub_load_public_key (pkf); if (!pk) { grub_file_close (pkf); return grub_errno; } grub_file_close (pkf); } f = grub_file_open (args[0], GRUB_FILE_TYPE_VERIFY_SIGNATURE); if (!f) { err = grub_errno; goto fail; } err = grub_verify_signature (f, args[1], pk); fail: if (f) grub_file_close (f); if (pk) free_pk (pk); return err; } static int sec = 0; static grub_err_t grub_pubkey_init (grub_file_t io, enum grub_file_type type __attribute__ ((unused)), void **context, enum grub_verify_flags *flags) { grub_file_t sig; char *fsuf, *ptr; grub_err_t err; struct grub_pubkey_context *ctxt; if (!sec) { *flags = GRUB_VERIFY_FLAGS_SKIP_VERIFICATION; return GRUB_ERR_NONE; } fsuf = grub_malloc (grub_strlen (io->name) + sizeof (".sig")); if (!fsuf) return grub_errno; ptr = grub_stpcpy (fsuf, io->name); grub_memcpy (ptr, ".sig", sizeof (".sig")); sig = grub_file_open (fsuf, GRUB_FILE_TYPE_SIGNATURE); grub_free (fsuf); if (!sig) return grub_errno; ctxt = grub_malloc (sizeof (*ctxt)); if (!ctxt) { grub_file_close (sig); return grub_errno; } err = grub_verify_signature_init (ctxt, sig); if (err) { grub_free (ctxt); grub_file_close (sig); return err; } *context = ctxt; return GRUB_ERR_NONE; } static grub_err_t grub_pubkey_fini (void *ctxt) { return grub_verify_signature_real (ctxt, NULL); } static char * grub_env_write_sec (struct grub_env_var *var __attribute__ ((unused)), const char *val) { sec = (*val == '1') || (*val == 'e'); return grub_strdup (sec ? "enforce" : "no"); } static grub_ssize_t pseudo_read (struct grub_file *file, char *buf, grub_size_t len) { grub_memcpy (buf, (grub_uint8_t *) file->data + file->offset, len); return len; } /* Filesystem descriptor. */ struct grub_fs pseudo_fs = { .name = "pseudo", .fs_read = pseudo_read }; struct grub_file_verifier grub_pubkey_verifier = { .name = "pgp", .init = grub_pubkey_init, .fini = grub_pubkey_fini, .write = grub_pubkey_write, .close = grub_pubkey_close, }; static grub_extcmd_t cmd, cmd_trust; static grub_command_t cmd_distrust, cmd_list; GRUB_MOD_INIT(pgp) { const char *val; struct grub_module_header *header; val = grub_env_get ("check_signatures"); if (val && (val[0] == '1' || val[0] == 'e')) sec = 1; else sec = 0; grub_register_variable_hook ("check_signatures", 0, grub_env_write_sec); grub_env_export ("check_signatures"); grub_pk_trusted = 0; FOR_MODULES (header) { struct grub_file pseudo_file; struct grub_public_key *pk = NULL; grub_memset (&pseudo_file, 0, sizeof (pseudo_file)); /* Not an ELF module, skip. */ if (header->type != OBJ_TYPE_PUBKEY) continue; pseudo_file.fs = &pseudo_fs; pseudo_file.size = (header->size - sizeof (struct grub_module_header)); pseudo_file.data = (char *) header + sizeof (struct grub_module_header); pk = grub_load_public_key (&pseudo_file); if (!pk) grub_fatal ("error loading initial key: %s\n", grub_errmsg); pk->next = grub_pk_trusted; grub_pk_trusted = pk; } if (!val) grub_env_set ("check_signatures", grub_pk_trusted ? "enforce" : "no"); cmd = grub_register_extcmd ("verify_detached", grub_cmd_verify_signature, 0, N_("[-s|--skip-sig] FILE SIGNATURE_FILE [PUBKEY_FILE]"), N_("Verify detached signature."), options); cmd_trust = grub_register_extcmd ("trust", grub_cmd_trust, 0, N_("[-s|--skip-sig] PUBKEY_FILE"), N_("Add PUBKEY_FILE to trusted keys."), options); cmd_list = grub_register_command ("list_trusted", grub_cmd_list, 0, N_("Show the list of trusted keys.")); cmd_distrust = grub_register_command ("distrust", grub_cmd_distrust, N_("PUBKEY_ID"), N_("Remove PUBKEY_ID from trusted keys.")); grub_verifier_register (&grub_pubkey_verifier); } GRUB_MOD_FINI(pgp) { grub_register_variable_hook ("check_signatures", NULL, NULL); grub_env_unset ("check_signatures"); grub_verifier_unregister (&grub_pubkey_verifier); grub_unregister_extcmd (cmd); grub_unregister_extcmd (cmd_trust); grub_unregister_command (cmd_list); grub_unregister_command (cmd_distrust); } grub-2.14~git20250718.0e36779/grub-core/commands/password.c0000644000175000017500000000453515000202015017462 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (C) 2009 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); static grub_dl_t my_mod; static grub_err_t check_password (const char *user, const char *entered, void *password) { if (grub_crypto_memcmp (entered, password, GRUB_AUTH_MAX_PASSLEN) != 0) return GRUB_ACCESS_DENIED; grub_auth_authenticate (user); return GRUB_ERR_NONE; } grub_err_t grub_normal_set_password (const char *user, const char *password) { grub_err_t err; char *pass; int copylen; pass = grub_zalloc (GRUB_AUTH_MAX_PASSLEN); if (!pass) return grub_errno; copylen = grub_strlen (password); if (copylen >= GRUB_AUTH_MAX_PASSLEN) copylen = GRUB_AUTH_MAX_PASSLEN - 1; grub_memcpy (pass, password, copylen); err = grub_auth_register_authentication (user, check_password, pass); if (err) { grub_free (pass); return err; } grub_dl_ref (my_mod); return GRUB_ERR_NONE; } static grub_err_t grub_cmd_password (grub_command_t cmd __attribute__ ((unused)), int argc, char **args) { if (argc != 2) return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("two arguments expected")); return grub_normal_set_password (args[0], args[1]); } static grub_command_t cmd; GRUB_MOD_INIT(password) { my_mod = mod; cmd = grub_register_command ("password", grub_cmd_password, N_("USER PASSWORD"), N_("Set user password (plaintext). " "Unrecommended and insecure.")); } GRUB_MOD_FINI(password) { grub_unregister_command (cmd); } grub-2.14~git20250718.0e36779/grub-core/commands/memrw.c0000644000175000017500000001146615036447510016774 00000000000000/* memrw.c - command to read / write physical memory */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2009 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); static grub_extcmd_t cmd_read_byte, cmd_read_word, cmd_read_dword; static grub_command_t cmd_write_byte, cmd_write_word, cmd_write_dword; static const struct grub_arg_option options[] = { {0, 'v', 0, N_("Save read value into variable VARNAME."), N_("VARNAME"), ARG_TYPE_STRING}, {0, 0, 0, 0, 0, 0} }; static grub_err_t grub_cmd_read (grub_extcmd_context_t ctxt, int argc, char **argv) { grub_addr_t addr; grub_uint32_t value = 0; char buf[sizeof ("XXXXXXXX")]; if (argc != 1) return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("one argument expected")); addr = grub_strtoul (argv[0], 0, 0); switch (ctxt->extcmd->cmd->name[sizeof ("read_") - 1]) { case 'd': value = *((volatile grub_uint32_t *) addr); break; case 'w': value = *((volatile grub_uint16_t *) addr); break; case 'b': value = *((volatile grub_uint8_t *) addr); break; } if (ctxt->state[0].set) { grub_snprintf (buf, sizeof (buf), "%x", value); grub_env_set (ctxt->state[0].arg, buf); } else grub_printf ("0x%x\n", value); return 0; } static grub_err_t grub_cmd_write (grub_command_t cmd, int argc, char **argv) { grub_addr_t addr; grub_uint32_t value; grub_uint32_t mask = 0xffffffff; if (argc != 2 && argc != 3) return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("two arguments expected")); addr = grub_strtoul (argv[0], 0, 0); value = grub_strtoul (argv[1], 0, 0); if (argc == 3) mask = grub_strtoul (argv[2], 0, 0); value &= mask; switch (cmd->name[sizeof ("write_") - 1]) { case 'd': if (mask != 0xffffffff) *((volatile grub_uint32_t *) addr) = (*((volatile grub_uint32_t *) addr) & ~mask) | value; else *((volatile grub_uint32_t *) addr) = value; break; case 'w': if ((mask & 0xffff) != 0xffff) *((volatile grub_uint16_t *) addr) = (*((volatile grub_uint16_t *) addr) & ~mask) | value; else *((volatile grub_uint16_t *) addr) = value; break; case 'b': if ((mask & 0xff) != 0xff) *((volatile grub_uint8_t *) addr) = (*((volatile grub_uint8_t *) addr) & ~mask) | value; else *((volatile grub_uint8_t *) addr) = value; break; } return 0; } GRUB_MOD_INIT(memrw) { cmd_read_byte = grub_register_extcmd_lockdown ("read_byte", grub_cmd_read, 0, N_("ADDR"), N_("Read 8-bit value from ADDR."), options); cmd_read_word = grub_register_extcmd_lockdown ("read_word", grub_cmd_read, 0, N_("ADDR"), N_("Read 16-bit value from ADDR."), options); cmd_read_dword = grub_register_extcmd_lockdown ("read_dword", grub_cmd_read, 0, N_("ADDR"), N_("Read 32-bit value from ADDR."), options); cmd_write_byte = grub_register_command_lockdown ("write_byte", grub_cmd_write, N_("ADDR VALUE [MASK]"), N_("Write 8-bit VALUE to ADDR.")); cmd_write_word = grub_register_command_lockdown ("write_word", grub_cmd_write, N_("ADDR VALUE [MASK]"), N_("Write 16-bit VALUE to ADDR.")); cmd_write_dword = grub_register_command_lockdown ("write_dword", grub_cmd_write, N_("ADDR VALUE [MASK]"), N_("Write 32-bit VALUE to ADDR.")); } GRUB_MOD_FINI(memrw) { grub_unregister_extcmd (cmd_read_byte); grub_unregister_extcmd (cmd_read_word); grub_unregister_extcmd (cmd_read_dword); grub_unregister_command (cmd_write_byte); grub_unregister_command (cmd_write_word); grub_unregister_command (cmd_write_dword); } grub-2.14~git20250718.0e36779/grub-core/commands/tpm2_key_protector/0000755000175000017500000000000015036452576021414 500000000000000grub-2.14~git20250718.0e36779/grub-core/commands/tpm2_key_protector/tpm2.h0000644000175000017500000000220615036447510022357 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (C) 2022 Microsoft Corporation * Copyright (C) 2024 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #ifndef GRUB_TPM2_TPM2_HEADER #define GRUB_TPM2_TPM2_HEADER 1 #include #include #include /* Well-Known Windows SRK handle */ #define TPM2_SRK_HANDLE 0x81000001 struct tpm2_sealed_key { TPM2B_PUBLIC_t public; TPM2B_PRIVATE_t private; }; typedef struct tpm2_sealed_key tpm2_sealed_key_t; #endif /* ! GRUB_TPM2_TPM2_HEADER */ grub-2.14~git20250718.0e36779/grub-core/commands/tpm2_key_protector/args.c0000644000175000017500000000765415036447510022440 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (C) 2022 Microsoft Corporation * Copyright (C) 2024 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include "tpm2_args.h" grub_err_t grub_tpm2_protector_parse_pcrs (char *value, grub_uint8_t *pcrs, grub_uint8_t *pcr_count) { char *current_pcr = value; char *next_pcr; const char *pcr_end; grub_uint64_t pcr; grub_uint8_t i; if (grub_strlen (value) == 0) return GRUB_ERR_BAD_ARGUMENT; *pcr_count = 0; for (i = 0; i < TPM_MAX_PCRS; i++) { next_pcr = grub_strchr (current_pcr, ','); if (next_pcr == current_pcr) return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("empty entry in PCR list")); if (next_pcr != NULL) *next_pcr = '\0'; pcr = grub_strtoul (current_pcr, &pcr_end, 10); if (*current_pcr == '\0' || *pcr_end != '\0') return grub_error (GRUB_ERR_BAD_NUMBER, N_("entry '%s' in PCR list is not a number"), current_pcr); if (pcr > TPM_MAX_PCRS - 1) return grub_error (GRUB_ERR_OUT_OF_RANGE, N_("entry %llu in PCR list is too large to be a PCR number, PCR numbers range from 0 to %u"), (unsigned long long)pcr, TPM_MAX_PCRS - 1); pcrs[i] = (grub_uint8_t) pcr; ++(*pcr_count); if (next_pcr == NULL) break; current_pcr = next_pcr + 1; if (*current_pcr == '\0') return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("trailing comma at the end of PCR list")); } if (i == TPM_MAX_PCRS) return grub_error (GRUB_ERR_OUT_OF_RANGE, N_("too many PCRs in PCR list, the maximum number of PCRs is %u"), TPM_MAX_PCRS); return GRUB_ERR_NONE; } grub_err_t grub_tpm2_protector_parse_asymmetric (const char *value, grub_srk_type_t *srk_type) { if (grub_strcasecmp (value, "ECC") == 0 || grub_strcasecmp (value, "ECC_NIST_P256") == 0) { srk_type->type = TPM_ALG_ECC; srk_type->detail.ecc_curve = TPM_ECC_NIST_P256; } else if (grub_strcasecmp (value, "RSA") == 0 || grub_strcasecmp (value, "RSA2048") == 0) { srk_type->type = TPM_ALG_RSA; srk_type->detail.rsa_bits = 2048; } else return grub_error (GRUB_ERR_OUT_OF_RANGE, N_("value '%s' is not a valid asymmetric key type"), value); return GRUB_ERR_NONE; } grub_err_t grub_tpm2_protector_parse_bank (const char *value, TPM_ALG_ID_t *bank) { if (grub_strcasecmp (value, "SHA1") == 0) *bank = TPM_ALG_SHA1; else if (grub_strcasecmp (value, "SHA256") == 0) *bank = TPM_ALG_SHA256; else if (grub_strcasecmp (value, "SHA384") == 0) *bank = TPM_ALG_SHA384; else if (grub_strcasecmp (value, "SHA512") == 0) *bank = TPM_ALG_SHA512; else return grub_error (GRUB_ERR_OUT_OF_RANGE, N_("value '%s' is not a valid PCR bank"), value); return GRUB_ERR_NONE; } grub_err_t grub_tpm2_protector_parse_tpm_handle (const char *value, TPM_HANDLE_t *handle) { grub_uint64_t num; const char *str_end; num = grub_strtoul (value, &str_end, 0); if (*value == '\0' || *str_end != '\0') return grub_error (GRUB_ERR_BAD_NUMBER, N_("TPM handle value '%s' is not a number"), value); if (num > GRUB_UINT_MAX) return grub_error (GRUB_ERR_OUT_OF_RANGE, N_("value %llu is too large to be a TPM handle, TPM handles are unsigned 32-bit integers"), (unsigned long long)num); *handle = (TPM_HANDLE_t) num; return GRUB_ERR_NONE; } grub-2.14~git20250718.0e36779/grub-core/commands/tpm2_key_protector/tpm2_args.h0000644000175000017500000000277715036447510023410 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (C) 2022 Microsoft Corporation * Copyright (C) 2024 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #ifndef GRUB_TPM2_INTERNAL_ARGS_HEADER #define GRUB_TPM2_INTERNAL_ARGS_HEADER 1 #include #include "tpm2.h" struct grub_srk_type { TPMI_ALG_PUBLIC_t type; union { TPM_KEY_BITS_t rsa_bits; TPM_ECC_CURVE_t ecc_curve; } detail; }; typedef struct grub_srk_type grub_srk_type_t; extern grub_err_t grub_tpm2_protector_parse_pcrs (char *value, grub_uint8_t *pcrs, grub_uint8_t *pcr_count); extern grub_err_t grub_tpm2_protector_parse_asymmetric (const char *value, grub_srk_type_t *srk_type); extern grub_err_t grub_tpm2_protector_parse_bank (const char *value, TPM_ALG_ID_t *bank); extern grub_err_t grub_tpm2_protector_parse_tpm_handle (const char *value, TPM_HANDLE_t *handle); #endif /* ! GRUB_TPM2_INTERNAL_ARGS_HEADER */ grub-2.14~git20250718.0e36779/grub-core/commands/tpm2_key_protector/tpm2key_asn1_tab.c0000644000175000017500000000403215036447510024632 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (C) 2024 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ /* * This file is generated by 'asn1Parser tpm2key.asn' and the '#include' * headers are replaced with the ones in grub2. * - 'grub/mm.h' for the definition of 'NULL' * - 'libtasn1.h' for the definition of 'asn1_static_node' */ #include #include const asn1_static_node tpm2key_asn1_tab[] = { { "TPM2KEY", 536875024, NULL }, { NULL, 1073741836, NULL }, { "TPMPolicy", 1610612741, NULL }, { "CommandCode", 1610620931, NULL }, { NULL, 2056, "0"}, { "CommandPolicy", 536879111, NULL }, { NULL, 2056, "1"}, { "TPMAuthPolicy", 1610612741, NULL }, { "Name", 1610637346, NULL }, { NULL, 2056, "0"}, { "Policy", 536879115, NULL }, { NULL, 1073743880, "1"}, { NULL, 2, "TPMPolicy"}, { "TPMKey", 536870917, NULL }, { "type", 1073741836, NULL }, { "emptyAuth", 1610637316, NULL }, { NULL, 2056, "0"}, { "policy", 1610637323, NULL }, { NULL, 1073743880, "1"}, { NULL, 2, "TPMPolicy"}, { "secret", 1610637319, NULL }, { NULL, 2056, "2"}, { "authPolicy", 1610637323, NULL }, { NULL, 1073743880, "3"}, { NULL, 2, "TPMAuthPolicy"}, { "description", 1610637346, NULL }, { NULL, 2056, "4"}, { "rsaParent", 1610637316, NULL }, { NULL, 2056, "5"}, { "parent", 1073741827, NULL }, { "pubkey", 1073741831, NULL }, { "privkey", 7, NULL }, { NULL, 0, NULL } }; grub-2.14~git20250718.0e36779/grub-core/commands/tpm2_key_protector/module.c0000644000175000017500000012634415036447510022767 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (C) 2022 Microsoft Corporation * Copyright (C) 2024 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include "tpm2_args.h" #include "tpm2.h" #include "tpm2key.h" GRUB_MOD_LICENSE ("GPLv3+"); typedef enum tpm2_protector_mode { TPM2_PROTECTOR_MODE_UNSET, TPM2_PROTECTOR_MODE_SRK, TPM2_PROTECTOR_MODE_NV } tpm2_protector_mode_t; typedef enum tpm2_protector_options { OPTION_MODE, OPTION_PCRS, OPTION_BANK, OPTION_TPM2KEY, OPTION_KEYFILE, OPTION_SRK, OPTION_ASYMMETRIC, OPTION_NVINDEX } tpm2_protector_options_t; typedef struct tpm2_protector_context { tpm2_protector_mode_t mode; grub_uint8_t pcrs[TPM_MAX_PCRS]; grub_uint8_t pcr_count; grub_srk_type_t srk_type; TPM_ALG_ID_t bank; const char *tpm2key; const char *keyfile; TPM_HANDLE_t srk; TPM_HANDLE_t nv; } tpm2_protector_context_t; static const struct grub_arg_option tpm2_protector_init_cmd_options[] = { /* Options for all modes */ { .longarg = "mode", .shortarg = 'm', .flags = 0, .arg = NULL, .type = ARG_TYPE_STRING, .doc = N_("Unseal key using SRK ('srk') (default) or retrieve it from an NV " "Index ('nv')."), }, { .longarg = "pcrs", .shortarg = 'p', .flags = 0, .arg = NULL, .type = ARG_TYPE_STRING, .doc = N_("Comma-separated list of PCRs used to authorize key release " "e.g., '7,11'. (default: 7)"), }, { .longarg = "bank", .shortarg = 'b', .flags = 0, .arg = NULL, .type = ARG_TYPE_STRING, .doc = N_("Bank of PCRs used to authorize key release: " "SHA1, SHA256, SHA384 or SHA512. (default: SHA256)"), }, /* SRK-mode options */ { .longarg = "tpm2key", .shortarg = 'T', .flags = 0, .arg = NULL, .type = ARG_TYPE_STRING, .doc = N_("In SRK mode, path to the key file in the TPM 2.0 Key File format " "to unseal using the TPM (e.g., (hd0,gpt1)/boot/grub2/sealed.tpm)."), }, { .longarg = "keyfile", .shortarg = 'k', .flags = 0, .arg = NULL, .type = ARG_TYPE_STRING, .doc = N_("In SRK mode, path to the key file in the raw format to unseal " "using the TPM (e.g., (hd0,gpt1)/boot/grub2/sealed.key). " "(Mainly for backward compatibility. Please use '--tpm2key'.)"), }, { .longarg = "srk", .shortarg = 's', .flags = 0, .arg = NULL, .type = ARG_TYPE_STRING, .doc = N_("In SRK mode, the SRK handle if the SRK is persistent."), }, { .longarg = "asymmetric", .shortarg = 'a', .flags = 0, .arg = NULL, .type = ARG_TYPE_STRING, .doc = N_("In SRK mode, the type of SRK: RSA (RSA2048) and ECC (ECC_NIST_P256)" "(default: ECC)"), }, /* NV Index-mode options */ { .longarg = "nvindex", .shortarg = 'n', .flags = 0, .arg = NULL, .type = ARG_TYPE_STRING, .doc = N_("Required in NV Index mode, the NV handle to read which must " "readily exist on the TPM and which contains the key."), }, /* End of list */ {0, 0, 0, 0, 0, 0} }; static grub_extcmd_t tpm2_protector_init_cmd; static grub_extcmd_t tpm2_protector_clear_cmd; static tpm2_protector_context_t tpm2_protector_ctx = {0}; static grub_command_t tpm2_dump_pcr_cmd; static TPM_ALG_ID_t tpm2_dump_bank; static grub_err_t tpm2_protector_srk_read_file (const char *filepath, void **buffer, grub_size_t *buffer_size) { grub_file_t file; grub_off_t file_size; void *read_buffer; grub_off_t read_n; grub_err_t err; /* * Using GRUB_FILE_TYPE_SIGNATURE ensures we do not hash the keyfile into PCR9 * otherwise we'll never be able to predict the value of PCR9 at unseal time */ file = grub_file_open (filepath, GRUB_FILE_TYPE_SIGNATURE); if (file == NULL) { /* Push errno from grub_file_open() into the error message stack */ grub_error_push(); err = grub_error (GRUB_ERR_FILE_NOT_FOUND, N_("could not open file: %s"), filepath); goto error; } file_size = grub_file_size (file); if (file_size == 0) { err = grub_error (GRUB_ERR_OUT_OF_RANGE, N_("could not read file size: %s"), filepath); goto error; } read_buffer = grub_malloc (file_size); if (read_buffer == NULL) { err = grub_error (GRUB_ERR_OUT_OF_MEMORY, N_("could not allocate buffer for %s"), filepath); goto error; } read_n = grub_file_read (file, read_buffer, file_size); if (read_n != file_size) { grub_free (read_buffer); err = grub_error (GRUB_ERR_FILE_READ_ERROR, N_("could not retrieve file contents: %s"), filepath); goto error; } *buffer = read_buffer; *buffer_size = file_size; err = GRUB_ERR_NONE; error: if (file != NULL) grub_file_close (file); return err; } /* Check if the data is in TPM 2.0 Key File format */ static bool tpm2_protector_is_tpm2key (grub_uint8_t *buffer, grub_size_t buffer_size) { /* id-sealedkey OID (2.23.133.10.1.5) in DER */ const grub_uint8_t sealed_key_oid[] = {0x06, 0x06, 0x67, 0x81, 0x05, 0x0a}; grub_size_t skip = 0; /* Need at least the first two bytes to check the tag and the length */ if (buffer_size < 2) return false; /* The first byte is always 0x30 (SEQUENCE). */ if (buffer[0] != 0x30) return false; /* * Get the bytes of the length * * If the bit 8 of the second byte is 0, it is in the short form, so the second byte * alone represents the length. Thus, the first two bytes are skipped. * * Otherwise, it is in the long form, and bits 1~7 indicate how many more bytes are in * the length field, so we skip the first two bytes plus the bytes for the length. */ if ((buffer[1] & 0x80) == 0) skip = 2; else skip = (buffer[1] & 0x7F) + 2; /* Make sure the buffer is large enough to contain id-sealedkey OID */ if (buffer_size < skip + sizeof (sealed_key_oid)) return false; /* Check id-sealedkey OID */ if (grub_memcmp (buffer + skip, sealed_key_oid, sizeof (sealed_key_oid)) != 0) return false; return true; } static grub_err_t tpm2_protector_unmarshal_raw (void *sealed_key, grub_size_t sealed_key_size, tpm2_sealed_key_t *sk) { struct grub_tpm2_buffer buf; grub_tpm2_buffer_init (&buf); if (sealed_key_size > buf.cap) return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("sealed key larger than %llu bytes"), (unsigned long long)buf.cap); grub_memcpy (buf.data, sealed_key, sealed_key_size); buf.size = sealed_key_size; grub_Tss2_MU_TPM2B_PUBLIC_Unmarshal (&buf, &sk->public); grub_Tss2_MU_TPM2B_PRIVATE_Unmarshal (&buf, &sk->private); if (buf.error != 0) return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("malformed TPM wire key file")); return GRUB_ERR_NONE; } static grub_err_t tpm2_protector_unmarshal_tpm2key (void *sealed_key, grub_size_t sealed_key_size, tpm2key_policy_t *policy_seq, tpm2key_authpolicy_t *authpol_seq, grub_uint8_t *rsaparent, grub_uint32_t *parent, tpm2_sealed_key_t *sk) { asn1_node tpm2key = NULL; grub_uint8_t rsaparent_tmp; grub_uint32_t parent_tmp; void *sealed_pub = NULL; grub_size_t sealed_pub_size; void *sealed_priv = NULL; grub_size_t sealed_priv_size; struct grub_tpm2_buffer buf; grub_err_t err; /* * Start to parse the tpm2key file * TPMKey ::= SEQUENCE { * type OBJECT IDENTIFIER, * emptyAuth [0] EXPLICIT BOOLEAN OPTIONAL, * policy [1] EXPLICIT SEQUENCE OF TPMPolicy OPTIONAL, * secret [2] EXPLICIT OCTET STRING OPTIONAL, * authPolicy [3] EXPLICIT SEQUENCE OF TPMAuthPolicy OPTIONAL, * description [4] EXPLICIT UTF8String OPTIONAL, * rsaParent [5] EXPLICIT BOOLEAN OPTIONAL, * parent INTEGER, * pubkey OCTET STRING, * privkey OCTET STRING * } */ err = grub_tpm2key_start_parsing (&tpm2key, sealed_key, sealed_key_size); if (err != GRUB_ERR_NONE) return err; /* * Retrieve the policy sequence from 'policy' * policy_seq will be NULL when 'policy' is not available */ err = grub_tpm2key_get_policy_seq (tpm2key, policy_seq); if (err != GRUB_ERR_NONE) goto error; /* * Retrieve the authpolicy sequence from 'authPolicy' * authpol_seq will be NULL when 'authPolicy' is not available */ err = grub_tpm2key_get_authpolicy_seq (tpm2key, authpol_seq); if (err != GRUB_ERR_NONE) goto error; /* Retrieve rsaParent */ err = grub_tpm2key_get_rsaparent (tpm2key, &rsaparent_tmp); if (err != GRUB_ERR_NONE) goto error; *rsaparent = rsaparent_tmp; /* Retrieve the parent handle */ err = grub_tpm2key_get_parent (tpm2key, &parent_tmp); if (err != GRUB_ERR_NONE) goto error; /* The parent handle should be either PERMANENT or PERSISTENT. */ if (!TPM_HT_IS_PERMANENT (parent_tmp) && !TPM_HT_IS_PERSISTENT (parent_tmp)) { err = GRUB_ERR_OUT_OF_RANGE; goto error; } *parent = parent_tmp; /* Retrieve the public part of the sealed key */ err = grub_tpm2key_get_pubkey (tpm2key, &sealed_pub, &sealed_pub_size); if (err != GRUB_ERR_NONE) goto error; /* Retrieve the private part of the sealed key */ err = grub_tpm2key_get_privkey (tpm2key, &sealed_priv, &sealed_priv_size); if (err != GRUB_ERR_NONE) goto error; /* Unmarshal the sealed key */ grub_tpm2_buffer_init (&buf); if (sealed_pub_size + sealed_priv_size > buf.cap) { err = grub_error (GRUB_ERR_BAD_ARGUMENT, N_("sealed key larger than %llu bytes"), (unsigned long long)buf.cap); goto error; } grub_tpm2_buffer_pack (&buf, sealed_pub, sealed_pub_size); grub_tpm2_buffer_pack (&buf, sealed_priv, sealed_priv_size); buf.offset = 0; grub_Tss2_MU_TPM2B_PUBLIC_Unmarshal (&buf, &sk->public); grub_Tss2_MU_TPM2B_PRIVATE_Unmarshal (&buf, &sk->private); if (buf.error != 0) { err = grub_error (GRUB_ERR_BAD_ARGUMENT, N_("malformed TPM 2.0 key file")); goto error; } err = GRUB_ERR_NONE; error: /* End the parsing */ grub_tpm2key_end_parsing (tpm2key); grub_free (sealed_pub); grub_free (sealed_priv); return err; } /* Check if the SRK exists in the specified handle */ static grub_err_t tpm2_protector_srk_check (const TPM_HANDLE_t srk_handle) { TPM_RC_t rc; TPM2B_PUBLIC_t public; /* Find SRK */ rc = grub_tpm2_readpublic (srk_handle, NULL, &public); if (rc == TPM_RC_SUCCESS) return GRUB_ERR_NONE; return grub_error (GRUB_ERR_BAD_ARGUMENT, "failed to retrieve SRK from 0x%x (TPM2_ReadPublic: 0x%x)", srk_handle, rc); } /* Get the SRK with the template */ static grub_err_t tpm2_protector_srk_get (const grub_srk_type_t srk_type, const TPM_HANDLE_t parent, TPM_HANDLE_t *srk_handle) { TPM_RC_t rc; TPMT_PUBLIC_PARMS_t parms = {0}; TPMS_AUTH_COMMAND_t authCommand = {0}; TPM2B_SENSITIVE_CREATE_t inSensitive = {0}; TPM2B_PUBLIC_t inPublic = {0}; TPM2B_DATA_t outsideInfo = {0}; TPML_PCR_SELECTION_t creationPcr = {0}; TPM2B_PUBLIC_t outPublic = {0}; TPM2B_CREATION_DATA_t creationData = {0}; TPM2B_DIGEST_t creationHash = {0}; TPMT_TK_CREATION_t creationTicket = {0}; TPM2B_NAME_t srkName = {0}; TPM_HANDLE_t tmp_handle = 0; inPublic.publicArea.type = srk_type.type; inPublic.publicArea.nameAlg = TPM_ALG_SHA256; inPublic.publicArea.objectAttributes.restricted = 1; inPublic.publicArea.objectAttributes.userWithAuth = 1; inPublic.publicArea.objectAttributes.decrypt = 1; inPublic.publicArea.objectAttributes.fixedTPM = 1; inPublic.publicArea.objectAttributes.fixedParent = 1; inPublic.publicArea.objectAttributes.sensitiveDataOrigin = 1; inPublic.publicArea.objectAttributes.noDA = 1; if (srk_type.type == TPM_ALG_RSA) { inPublic.publicArea.parameters.rsaDetail.symmetric.algorithm = TPM_ALG_AES; inPublic.publicArea.parameters.rsaDetail.symmetric.keyBits.aes = 128; inPublic.publicArea.parameters.rsaDetail.symmetric.mode.aes = TPM_ALG_CFB; inPublic.publicArea.parameters.rsaDetail.scheme.scheme = TPM_ALG_NULL; inPublic.publicArea.parameters.rsaDetail.keyBits = srk_type.detail.rsa_bits; inPublic.publicArea.parameters.rsaDetail.exponent = 0; } else if (srk_type.type == TPM_ALG_ECC) { inPublic.publicArea.parameters.eccDetail.symmetric.algorithm = TPM_ALG_AES; inPublic.publicArea.parameters.eccDetail.symmetric.keyBits.aes = 128; inPublic.publicArea.parameters.eccDetail.symmetric.mode.aes = TPM_ALG_CFB; inPublic.publicArea.parameters.eccDetail.scheme.scheme = TPM_ALG_NULL; inPublic.publicArea.parameters.eccDetail.curveID = srk_type.detail.ecc_curve; inPublic.publicArea.parameters.eccDetail.kdf.scheme = TPM_ALG_NULL; } else return grub_error (GRUB_ERR_BAD_ARGUMENT, "unknown SRK algorithm"); /* Test the parameters before SRK generation */ parms.type = srk_type.type; grub_memcpy (&parms.parameters, &inPublic.publicArea.parameters, sizeof (TPMU_PUBLIC_PARMS_t)); rc = grub_tpm2_testparms (&parms, NULL); if (rc != TPM_RC_SUCCESS) return grub_error (GRUB_ERR_BAD_ARGUMENT, "unsupported SRK template (TPM2_TestParms: 0x%x)", rc); /* Create SRK */ authCommand.sessionHandle = TPM_RS_PW; rc = grub_tpm2_createprimary (parent, &authCommand, &inSensitive, &inPublic, &outsideInfo, &creationPcr, &tmp_handle, &outPublic, &creationData, &creationHash, &creationTicket, &srkName, NULL); if (rc != TPM_RC_SUCCESS) return grub_error (GRUB_ERR_BAD_DEVICE, "could not create SRK (TPM2_CreatePrimary: 0x%x)", rc); *srk_handle = tmp_handle; return GRUB_ERR_NONE; } /* * Load the SRK from the persistent handle or create one with a given type of * template, and then associate the sealed key with the SRK * Return values: * - GRUB_ERR_NONE: Everything is fine. * - GRUB_ERR_BAD_ARGUMENT: The SRK doesn't match. Try another one. * - Other: Something went wrong. */ static grub_err_t tpm2_protector_srk_load (const grub_srk_type_t srk_type, const tpm2_sealed_key_t *sealed_key, const TPM_HANDLE_t parent, TPM_HANDLE_t *sealed_handle, TPM_HANDLE_t *srk_handle) { TPMS_AUTH_COMMAND_t authCmd = {0}; TPM2B_NAME_t name = {0}; TPM_RC_t rc; grub_err_t err; if (srk_handle == NULL) return GRUB_ERR_BUG; if (*srk_handle != 0) { err = tpm2_protector_srk_check (*srk_handle); if (err != GRUB_ERR_NONE) return err; } else { err = tpm2_protector_srk_get (srk_type, parent, srk_handle); if (err != GRUB_ERR_NONE) return err; } /* Load the sealed key and associate it with the SRK */ authCmd.sessionHandle = TPM_RS_PW; rc = grub_tpm2_load (*srk_handle, &authCmd, &sealed_key->private, &sealed_key->public, sealed_handle, &name, NULL); /* * If TPM2_Load returns (TPM_RC_INTEGRITY | TPM_RC_P | TPM_RC_1), then it * implies the wrong SRK is used. */ if (rc == (TPM_RC_INTEGRITY | TPM_RC_P | TPM_RC_1)) { err = grub_error (GRUB_ERR_BAD_ARGUMENT, "SRK not matched"); goto error; } else if (rc != TPM_RC_SUCCESS) { err = grub_error (GRUB_ERR_BAD_DEVICE, "failed to load sealed key (TPM2_Load: 0x%x)", rc); goto error; } return GRUB_ERR_NONE; error: if (!TPM_HT_IS_PERSISTENT (*srk_handle)) grub_tpm2_flushcontext (*srk_handle); return err; } static const char * srk_type_to_name (grub_srk_type_t srk_type) { if (srk_type.type == TPM_ALG_ECC && srk_type.detail.ecc_curve == TPM_ECC_NIST_P256) return "ECC_NIST_P256"; else if (srk_type.type == TPM_ALG_RSA && srk_type.detail.rsa_bits == 2048) return "RSA2048"; return "Unknown"; } static grub_err_t tpm2_protector_load_key (const tpm2_protector_context_t *ctx, const tpm2_sealed_key_t *sealed_key, const TPM_HANDLE_t parent_handle, TPM_HANDLE_t *sealed_handle, TPM_HANDLE_t *srk_handle) { grub_err_t err; int i; grub_srk_type_t fallback_srks[] = { { .type = TPM_ALG_ECC, .detail.ecc_curve = TPM_ECC_NIST_P256, }, { .type = TPM_ALG_RSA, .detail.rsa_bits = 2048, }, { .type = TPM_ALG_ERROR, } }; /* Try the given persistent SRK if exists */ if (*srk_handle != 0) { err = tpm2_protector_srk_load (ctx->srk_type, sealed_key, parent_handle, sealed_handle, srk_handle); if (err != GRUB_ERR_BAD_ARGUMENT) return err; grub_print_error (); grub_printf ("Trying the specified SRK algorithm: %s\n", srk_type_to_name (ctx->srk_type)); grub_errno = GRUB_ERR_NONE; *srk_handle = 0; } /* Try the specified algorithm for the SRK template */ if (*srk_handle == 0) { err = tpm2_protector_srk_load (ctx->srk_type, sealed_key, parent_handle, sealed_handle, srk_handle); if (err != GRUB_ERR_BAD_ARGUMENT) return err; grub_print_error (); grub_errno = GRUB_ERR_NONE; *srk_handle = 0; } /* Try all the fallback SRK templates */ for (i = 0; fallback_srks[i].type != TPM_ALG_ERROR; i++) { /* Skip the specified algorithm */ if (fallback_srks[i].type == ctx->srk_type.type && (fallback_srks[i].detail.rsa_bits == ctx->srk_type.detail.rsa_bits || fallback_srks[i].detail.ecc_curve == ctx->srk_type.detail.ecc_curve)) continue; grub_printf ("Trying fallback %s template\n", srk_type_to_name (fallback_srks[i])); *srk_handle = 0; err = tpm2_protector_srk_load (fallback_srks[i], sealed_key, parent_handle, sealed_handle, srk_handle); if (err != GRUB_ERR_BAD_ARGUMENT) return err; grub_print_error (); grub_errno = GRUB_ERR_NONE; } return err; } static grub_err_t tpm2_protector_policypcr (TPMI_SH_AUTH_SESSION_t session, struct grub_tpm2_buffer *cmd_buf) { TPM2B_DIGEST_t pcr_digest; TPML_PCR_SELECTION_t pcr_sel; TPM_RC_t rc; grub_Tss2_MU_TPM2B_DIGEST_Unmarshal (cmd_buf, &pcr_digest); grub_Tss2_MU_TPML_PCR_SELECTION_Unmarshal (cmd_buf, &pcr_sel); if (cmd_buf->error != 0) return grub_error (GRUB_ERR_BAD_ARGUMENT, "failed to unmarshal commandPolicy for TPM2_PolicyPCR"); /* Record the chosen PCR bank. */ tpm2_dump_bank = pcr_sel.pcrSelections[0].hash; rc = grub_tpm2_policypcr (session, NULL, &pcr_digest, &pcr_sel, NULL); if (rc != TPM_RC_SUCCESS) return grub_error (GRUB_ERR_BAD_DEVICE, "failed to submit PCR policy (TPM2_PolicyPCR: 0x%x)", rc); return GRUB_ERR_NONE; } static grub_err_t tpm2_protector_policyauthorize (TPMI_SH_AUTH_SESSION_t session, struct grub_tpm2_buffer *cmd_buf) { TPM2B_PUBLIC_t pubkey; TPM2B_DIGEST_t policy_ref; TPMT_SIGNATURE_t signature; TPM2B_DIGEST_t pcr_policy; TPM2B_DIGEST_t pcr_policy_hash; TPMI_ALG_HASH_t sig_hash; TPMT_TK_VERIFIED_t verification_ticket; TPM_HANDLE_t pubkey_handle = 0; TPM2B_NAME_t pubname; TPM_RC_t rc; grub_err_t err; grub_Tss2_MU_TPM2B_PUBLIC_Unmarshal (cmd_buf, &pubkey); grub_Tss2_MU_TPM2B_DIGEST_Unmarshal (cmd_buf, &policy_ref); grub_Tss2_MU_TPMT_SIGNATURE_Unmarshal (cmd_buf, &signature); if (cmd_buf->error != 0) return grub_error (GRUB_ERR_BAD_ARGUMENT, "failed to unmarshal the buffer for TPM2_PolicyAuthorize"); /* Retrieve Policy Digest */ rc = grub_tpm2_policygetdigest (session, NULL, &pcr_policy, NULL); if (rc != TPM_RC_SUCCESS) return grub_error (GRUB_ERR_BAD_DEVICE, "failed to get policy digest (TPM2_PolicyGetDigest: 0x%x).", rc); /* Calculate the digest of the polcy for VerifySignature */ sig_hash = TPMT_SIGNATURE_get_hash_alg (&signature); if (sig_hash == TPM_ALG_NULL) return grub_error (GRUB_ERR_BAD_ARGUMENT, "failed to get the hash algorithm of the signature"); rc = grub_tpm2_hash (NULL, (TPM2B_MAX_BUFFER_t *) &pcr_policy, sig_hash, TPM_RH_NULL, &pcr_policy_hash, NULL, NULL); if (rc != TPM_RC_SUCCESS) return grub_error (GRUB_ERR_BAD_DEVICE, "failed to create PCR policy hash (TPM2_Hash: 0x%x)", rc); /* Load the public key */ rc = grub_tpm2_loadexternal (NULL, NULL, &pubkey, TPM_RH_OWNER, &pubkey_handle, &pubname, NULL); if (rc != TPM_RC_SUCCESS) return grub_error (GRUB_ERR_BAD_DEVICE, "failed to load public key (TPM2_LoadExternal: 0x%x)", rc); /* Verify the signature against the public key and the policy digest */ rc = grub_tpm2_verifysignature (pubkey_handle, NULL, &pcr_policy_hash, &signature, &verification_ticket, NULL); if (rc != TPM_RC_SUCCESS) { err = grub_error (GRUB_ERR_BAD_DEVICE, "failed to verify signature (TPM2_VerifySignature: 0x%x)", rc); goto error; } /* Authorize the signed policy with the public key and the verification ticket */ rc = grub_tpm2_policyauthorize (session, NULL, &pcr_policy, &policy_ref, &pubname, &verification_ticket, NULL); if (rc != TPM_RC_SUCCESS) { err = grub_error (GRUB_ERR_BAD_DEVICE, "failed to authorize PCR policy (TPM2_PolicyAuthorize: 0x%x)", rc); goto error; } err = GRUB_ERR_NONE; error: grub_tpm2_flushcontext (pubkey_handle); return err; } static grub_err_t tpm2_protector_enforce_policy (tpm2key_policy_t policy, TPMI_SH_AUTH_SESSION_t session) { struct grub_tpm2_buffer buf; grub_err_t err; grub_tpm2_buffer_init (&buf); if (policy->cmd_policy_len > buf.cap) return grub_error (GRUB_ERR_BAD_ARGUMENT, "CommandPolicy larger than TPM buffer"); grub_memcpy (buf.data, policy->cmd_policy, policy->cmd_policy_len); buf.size = policy->cmd_policy_len; switch (policy->cmd_code) { case TPM_CC_PolicyPCR: err = tpm2_protector_policypcr (session, &buf); break; case TPM_CC_PolicyAuthorize: err = tpm2_protector_policyauthorize (session, &buf); break; default: return grub_error (GRUB_ERR_BAD_ARGUMENT, "unknown TPM Command: 0x%x", policy->cmd_code); } return err; } static grub_err_t tpm2_protector_enforce_policy_seq (tpm2key_policy_t policy_seq, TPMI_SH_AUTH_SESSION_t session) { tpm2key_policy_t policy; grub_err_t err; FOR_LIST_ELEMENTS (policy, policy_seq) { err = tpm2_protector_enforce_policy (policy, session); if (err != GRUB_ERR_NONE) return err; } return GRUB_ERR_NONE; } static grub_err_t tpm2_protector_simple_policy_seq (const tpm2_protector_context_t *ctx, tpm2key_policy_t *policy_seq) { tpm2key_policy_t policy = NULL; struct grub_tpm2_buffer buf; TPML_PCR_SELECTION_t pcr_sel = { .count = 1, .pcrSelections = { { .hash = ctx->bank, .sizeOfSelect = 3, .pcrSelect = {0} }, } }; grub_uint8_t i; grub_err_t err; if (policy_seq == NULL) return GRUB_ERR_BAD_ARGUMENT; grub_tpm2_buffer_init (&buf); for (i = 0; i < ctx->pcr_count; i++) TPMS_PCR_SELECTION_SelectPCR (&pcr_sel.pcrSelections[0], ctx->pcrs[i]); grub_tpm2_buffer_pack_u16 (&buf, 0); grub_Tss2_MU_TPML_PCR_SELECTION_Marshal (&buf, &pcr_sel); if (buf.error != 0) return GRUB_ERR_BAD_ARGUMENT; policy = grub_malloc (sizeof(struct tpm2key_policy)); if (policy == NULL) { err = GRUB_ERR_OUT_OF_MEMORY; goto error; } policy->cmd_code = TPM_CC_PolicyPCR; policy->cmd_policy = grub_malloc (buf.size); if (policy->cmd_policy == NULL) { err = GRUB_ERR_OUT_OF_MEMORY; goto error; } grub_memcpy (policy->cmd_policy, buf.data, buf.size); policy->cmd_policy_len = buf.size; grub_list_push (GRUB_AS_LIST_P (policy_seq), GRUB_AS_LIST (policy)); return GRUB_ERR_NONE; error: grub_free (policy); return err; } static grub_err_t tpm2_protector_unseal (tpm2key_policy_t policy_seq, TPM_HANDLE_t sealed_handle, grub_uint8_t **key, grub_size_t *key_size, bool *dump_pcr) { TPMS_AUTH_COMMAND_t authCmd = {0}; TPM2B_SENSITIVE_DATA_t data; TPM2B_NONCE_t nonceCaller = {0}; TPMT_SYM_DEF_t symmetric = {0}; TPMI_SH_AUTH_SESSION_t session; grub_uint8_t *key_out; TPM_RC_t rc; grub_err_t err; *dump_pcr = false; /* Start Auth Session */ nonceCaller.size = TPM_SHA256_DIGEST_SIZE; symmetric.algorithm = TPM_ALG_NULL; rc = grub_tpm2_startauthsession (TPM_RH_NULL, TPM_RH_NULL, NULL, &nonceCaller, NULL, TPM_SE_POLICY, &symmetric, TPM_ALG_SHA256, &session, NULL, NULL); if (rc != TPM_RC_SUCCESS) return grub_error (GRUB_ERR_BAD_DEVICE, "failed to start auth session (TPM2_StartAuthSession: 0x%x)", rc); /* Enforce the policy command sequence */ err = tpm2_protector_enforce_policy_seq (policy_seq, session); if (err != GRUB_ERR_NONE) goto error; /* Unseal Sealed Key */ authCmd.sessionHandle = session; rc = grub_tpm2_unseal (sealed_handle, &authCmd, &data, NULL); if (rc != TPM_RC_SUCCESS) { /* * Trigger PCR dump on policy fail * TPM_RC_S (0x800) | TPM_RC_1 (0x100) | RC_FMT (0x80) | TPM_RC_POLICY_FAIL (0x1D) */ if (rc == 0x99D) *dump_pcr = true; err = grub_error (GRUB_ERR_BAD_DEVICE, "failed to unseal sealed key (TPM2_Unseal: 0x%x)", rc); goto error; } /* Epilogue */ key_out = grub_malloc (data.size); if (key_out == NULL) { err = grub_error (GRUB_ERR_OUT_OF_MEMORY, N_("no memory left to allocate unlock key buffer")); goto error; } grub_memcpy (key_out, data.buffer, data.size); *key = key_out; *key_size = data.size; err = GRUB_ERR_NONE; error: grub_tpm2_flushcontext (session); return err; } #define TPM_PCR_STR_SIZE (sizeof (TPMU_HA_t) * 2 + 1) static grub_err_t tpm2_protector_get_pcr_str (const TPM_ALG_ID_t algo, grub_uint32_t index, char *pcr_str, grub_uint16_t buf_size) { TPML_PCR_SELECTION_t pcr_sel = { .count = 1, .pcrSelections = { { .hash = algo, .sizeOfSelect = 3, .pcrSelect = {0} }, } }; TPML_DIGEST_t digest = {0}; grub_uint16_t i; TPM_RC_t rc; if (buf_size < TPM_PCR_STR_SIZE) { grub_snprintf (pcr_str, buf_size, "insufficient buffer"); return GRUB_ERR_OUT_OF_MEMORY; } TPMS_PCR_SELECTION_SelectPCR (&pcr_sel.pcrSelections[0], index); rc = grub_tpm2_pcr_read (NULL, &pcr_sel, NULL, NULL, &digest, NULL); if (rc != TPM_RC_SUCCESS) { grub_snprintf (pcr_str, buf_size, "TPM2_PCR_Read: 0x%x", rc); return GRUB_ERR_BAD_DEVICE; } /* Check the returned digest number and size */ if (digest.count != 1 || digest.digests[0].size > sizeof (TPMU_HA_t)) { grub_snprintf (pcr_str, buf_size, "invalid digest"); return GRUB_ERR_BAD_DEVICE; } /* Print the digest to the buffer */ for (i = 0; i < digest.digests[0].size; i++) grub_snprintf (pcr_str + 2 * i, buf_size - 2 * i, "%02x", digest.digests[0].buffer[i]); return GRUB_ERR_NONE; } static void tpm2_protector_dump_pcr (const TPM_ALG_ID_t bank) { const char *algo_name; char pcr_str[TPM_PCR_STR_SIZE]; grub_uint8_t i; grub_err_t err; if (bank == TPM_ALG_SHA1) algo_name = "sha1"; else if (bank == TPM_ALG_SHA256) algo_name = "sha256"; else if (bank == TPM_ALG_SHA384) algo_name = "sha384"; else if (bank == TPM_ALG_SHA512) algo_name = "sha512"; else algo_name = "other"; /* Try to fetch PCR 0 */ err = tpm2_protector_get_pcr_str (bank, 0, pcr_str, sizeof (pcr_str)); if (err != GRUB_ERR_NONE) { grub_printf ("Unsupported PCR bank [%s]: %s\n", algo_name, pcr_str); return; } grub_printf ("TPM PCR [%s]:\n", algo_name); grub_printf (" %02d: %s\n", 0, pcr_str); for (i = 1; i < TPM_MAX_PCRS; i++) { tpm2_protector_get_pcr_str (bank, i, pcr_str, sizeof (pcr_str)); grub_printf (" %02d: %s\n", i, pcr_str); } } static grub_err_t tpm2_protector_key_from_buffer (const tpm2_protector_context_t *ctx, void *buffer, grub_size_t buf_size, grub_uint8_t **key, grub_size_t *key_size) { tpm2_sealed_key_t sealed_key = {0}; grub_uint8_t rsaparent = 0; TPM_HANDLE_t parent_handle = 0; TPM_HANDLE_t srk_handle = 0; TPM_HANDLE_t sealed_handle = 0; tpm2key_policy_t policy_seq = NULL; tpm2key_authpolicy_t authpol = NULL; tpm2key_authpolicy_t authpol_seq = NULL; bool dump_pcr = false; grub_err_t err; /* * Retrieve sealed key, parent handle, policy sequence, and authpolicy * sequence from the buffer */ if (tpm2_protector_is_tpm2key (buffer, buf_size) == true) { err = tpm2_protector_unmarshal_tpm2key (buffer, buf_size, &policy_seq, &authpol_seq, &rsaparent, &parent_handle, &sealed_key); if (err != GRUB_ERR_NONE) goto exit1; if (rsaparent == 1) { tpm2_protector_context_t *ctx_w; /* Overwrite the SRK type as noted in the key */ ctx_w = (tpm2_protector_context_t *)ctx; ctx_w->srk_type.type = TPM_ALG_RSA; ctx_w->srk_type.detail.rsa_bits = 2048; } } else { parent_handle = TPM_RH_OWNER; err = tpm2_protector_unmarshal_raw (buffer, buf_size, &sealed_key); if (err != GRUB_ERR_NONE) goto exit1; } /* Set the SRK handle if it is specified with '--srk' or inside the key file */ if (ctx->srk != 0) srk_handle = ctx->srk; else if (TPM_HT_IS_PERSISTENT (parent_handle)) srk_handle = parent_handle; /* Load the sealed key into TPM and associate it with the SRK */ err = tpm2_protector_load_key (ctx, &sealed_key, parent_handle, &sealed_handle, &srk_handle); if (err != GRUB_ERR_NONE) goto exit1; /* * Set err to an error code to trigger the standalone policy sequence * if there is no authpolicy sequence */ err = GRUB_ERR_READ_ERROR; /* Iterate the authpolicy sequence to find one that unseals the key */ FOR_LIST_ELEMENTS (authpol, authpol_seq) { err = tpm2_protector_unseal (authpol->policy_seq, sealed_handle, key, key_size, &dump_pcr); if (err == GRUB_ERR_NONE) break; /* * Push the error message into the grub_error stack * Note: The grub_error stack may overflow if there are too many policy * sequences. Anyway, we still can keep the error messages from * the first few policy sequences which are usually most likely to * unseal the key. */ grub_error_push(); } /* Give the standalone policy sequence a try */ if (err != GRUB_ERR_NONE) { /* * Create a basic policy sequence based on the given PCR selection if the * key file doesn't provide one */ if (policy_seq == NULL) { err = tpm2_protector_simple_policy_seq (ctx, &policy_seq); if (err != GRUB_ERR_NONE) goto exit2; } err = tpm2_protector_unseal (policy_seq, sealed_handle, key, key_size, &dump_pcr); } /* Pop error messages on success */ if (err == GRUB_ERR_NONE) while (grub_error_pop ()); /* Dump PCRs if necessary */ if (dump_pcr == true) { grub_printf ("PCR Mismatch! Check firmware and bootloader before typing passphrase!\n"); tpm2_protector_dump_pcr (tpm2_dump_bank); } exit2: grub_tpm2_flushcontext (sealed_handle); if (!TPM_HT_IS_PERSISTENT (srk_handle)) grub_tpm2_flushcontext (srk_handle); exit1: grub_tpm2key_free_policy_seq (policy_seq); grub_tpm2key_free_authpolicy_seq (authpol_seq); return err; } static grub_err_t tpm2_protector_srk_recover (const tpm2_protector_context_t *ctx, grub_uint8_t **key, grub_size_t *key_size) { const char *filepath; void *file_bytes = NULL; grub_size_t file_size = 0; grub_err_t err; if (ctx->tpm2key != NULL) filepath = ctx->tpm2key; else if (ctx->keyfile != NULL) filepath = ctx->keyfile; else return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("key file not specified")); err = tpm2_protector_srk_read_file (filepath, &file_bytes, &file_size); if (err != GRUB_ERR_NONE) return err; err = tpm2_protector_key_from_buffer (ctx, file_bytes, file_size, key, key_size); grub_free (file_bytes); return err; } static grub_err_t tpm2_protector_load_persistent (const tpm2_protector_context_t *ctx, TPM_HANDLE_t sealed_handle, grub_uint8_t **key, grub_size_t *key_size) { tpm2key_policy_t policy_seq = NULL; bool dump_pcr = false; grub_err_t err; /* Create a basic policy sequence based on the given PCR selection */ err = tpm2_protector_simple_policy_seq (ctx, &policy_seq); if (err != GRUB_ERR_NONE) goto exit; err = tpm2_protector_unseal (policy_seq, sealed_handle, key, key_size, &dump_pcr); /* Dump PCRs if necessary */ if (dump_pcr == true) { grub_printf ("PCR Mismatch! Check firmware and bootloader before typing passphrase!\n"); tpm2_protector_dump_pcr (tpm2_dump_bank); } exit: grub_tpm2_flushcontext (sealed_handle); grub_tpm2key_free_policy_seq (policy_seq); return err; } static grub_err_t tpm2_protector_key_from_nvindex (const tpm2_protector_context_t *ctx, TPM_HANDLE_t nvindex, grub_uint8_t **key, grub_size_t *key_size) { TPMS_AUTH_COMMAND_t authCmd = {0}; TPM2B_NV_PUBLIC_t nv_public; TPM2B_NAME_t nv_name; grub_uint16_t data_size; TPM2B_MAX_NV_BUFFER_t data; TPM_RC_t rc; /* Get the data size in the NV index handle */ rc = grub_tpm2_nv_readpublic (nvindex, NULL, &nv_public, &nv_name); if (rc != TPM_RC_SUCCESS) return grub_error (GRUB_ERR_BAD_ARGUMENT, "failed to retrieve info from 0x%x (TPM2_NV_ReadPublic: 0x%x)", nvindex, rc); data_size = nv_public.nvPublic.dataSize; if (data_size > TPM_MAX_NV_BUFFER_SIZE) return grub_error (GRUB_ERR_BAD_ARGUMENT, "insufficient data buffer"); /* Read the data from the NV index handle */ authCmd.sessionHandle = TPM_RS_PW; rc = grub_tpm2_nv_read (TPM_RH_OWNER, nvindex, &authCmd, data_size, 0, &data); if (rc != TPM_RC_SUCCESS) return grub_error (GRUB_ERR_BAD_ARGUMENT, "failed to read data from 0x%x (TPM2_NV_Read: 0x%x)", nvindex, rc); return tpm2_protector_key_from_buffer (ctx, data.buffer, data_size, key, key_size); } static grub_err_t tpm2_protector_nv_recover (const tpm2_protector_context_t *ctx, grub_uint8_t **key, grub_size_t *key_size) { grub_err_t err; if (TPM_HT_IS_PERSISTENT (ctx->nv) == true) err = tpm2_protector_load_persistent (ctx, ctx->nv, key, key_size); else if (TPM_HT_IS_NVINDEX (ctx->nv) == true) err = tpm2_protector_key_from_nvindex (ctx, ctx->nv, key, key_size); else err = GRUB_ERR_BAD_ARGUMENT; return err; } static grub_err_t tpm2_protector_recover (const tpm2_protector_context_t *ctx, grub_uint8_t **key, grub_size_t *key_size) { switch (ctx->mode) { case TPM2_PROTECTOR_MODE_SRK: return tpm2_protector_srk_recover (ctx, key, key_size); case TPM2_PROTECTOR_MODE_NV: return tpm2_protector_nv_recover (ctx, key, key_size); default: return GRUB_ERR_BAD_ARGUMENT; } } static grub_err_t tpm2_protector_recover_key (grub_uint8_t **key, grub_size_t *key_size) { /* Expect a call to tpm2_protector_init before anybody tries to use us */ if (tpm2_protector_ctx.mode == TPM2_PROTECTOR_MODE_UNSET) return grub_error (GRUB_ERR_INVALID_COMMAND, N_("cannot use TPM2 key protector without initializing it, call tpm2_protector_init first")); if (key == NULL || key_size == NULL) return GRUB_ERR_BAD_ARGUMENT; return tpm2_protector_recover (&tpm2_protector_ctx, key, key_size); } static grub_err_t tpm2_protector_check_args (tpm2_protector_context_t *ctx) { if (ctx->mode == TPM2_PROTECTOR_MODE_UNSET) ctx->mode = TPM2_PROTECTOR_MODE_SRK; /* Checks for SRK mode */ if (ctx->mode == TPM2_PROTECTOR_MODE_SRK && (ctx->keyfile == NULL && ctx->tpm2key == NULL)) return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("in SRK mode, a key file must be specified: --tpm2key/-T or --keyfile/-k")); if (ctx->mode == TPM2_PROTECTOR_MODE_SRK && (ctx->keyfile != NULL && ctx->tpm2key != NULL)) return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("in SRK mode, please specify a key file with only --tpm2key/-T or --keyfile/-k")); if (ctx->mode == TPM2_PROTECTOR_MODE_SRK && ctx->nv != 0) return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("in SRK mode, an NV Index cannot be specified")); /* Checks for NV mode */ if (ctx->mode == TPM2_PROTECTOR_MODE_NV && ctx->nv == 0) return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("in NV Index mode, an NV Index must be specified: --nvindex or -n")); if (ctx->mode == TPM2_PROTECTOR_MODE_NV && (ctx->tpm2key != NULL || ctx->keyfile != NULL)) return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("a key file cannot be specified when using NV index mode")); if (ctx->mode == TPM2_PROTECTOR_MODE_NV && TPM_HT_IS_PERSISTENT (ctx->nv) == true && (ctx->srk != 0 || ctx->srk_type.type != TPM_ALG_ERROR)) return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("an SRK cannot be specified when using NV index mode with a persistent handle")); if (ctx->mode == TPM2_PROTECTOR_MODE_NV && (TPM_HT_IS_PERSISTENT (ctx->nv) == false && TPM_HT_IS_NVINDEX (ctx->nv) == false)) return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("an NV index must be either a persistent handle or an NV index handle when using NV index mode")); /* Defaults assignment */ if (ctx->bank == TPM_ALG_ERROR) ctx->bank = TPM_ALG_SHA256; tpm2_dump_bank = ctx->bank; if (ctx->pcr_count == 0) { ctx->pcrs[0] = 7; ctx->pcr_count = 1; } /* * Set ECC_NIST_P256 as the default SRK when using SRK mode or NV mode with * an NV index handle */ if (ctx->srk_type.type == TPM_ALG_ERROR && (ctx->mode == TPM2_PROTECTOR_MODE_SRK || (ctx->mode == TPM2_PROTECTOR_MODE_NV && TPM_HT_IS_NVINDEX (ctx->nv) == true))) { ctx->srk_type.type = TPM_ALG_ECC; ctx->srk_type.detail.ecc_curve = TPM_ECC_NIST_P256; } return GRUB_ERR_NONE; } static grub_err_t tpm2_protector_parse_file (const char *value, const char **file) { if (grub_strlen (value) == 0) return GRUB_ERR_BAD_ARGUMENT; *file = grub_strdup (value); if (*file == NULL) return grub_error (GRUB_ERR_OUT_OF_MEMORY, N_("no memory to duplicate file path")); return GRUB_ERR_NONE; } static grub_err_t tpm2_protector_parse_mode (const char *value, tpm2_protector_mode_t *mode) { if (grub_strcmp (value, "srk") == 0) *mode = TPM2_PROTECTOR_MODE_SRK; else if (grub_strcmp (value, "nv") == 0) *mode = TPM2_PROTECTOR_MODE_NV; else return grub_error (GRUB_ERR_OUT_OF_RANGE, N_("value '%s' is not a valid TPM2 key protector mode"), value); return GRUB_ERR_NONE; } static grub_err_t tpm2_protector_init_cmd_handler (grub_extcmd_context_t ctxt, int argc, char **args __attribute__ ((unused))) { struct grub_arg_list *state = ctxt->state; grub_err_t err; if (argc) return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("the TPM2 key protector does not accept any non-option arguments (i.e., like -o and/or --option only)")); grub_free ((void *) tpm2_protector_ctx.keyfile); grub_memset (&tpm2_protector_ctx, 0, sizeof (tpm2_protector_ctx)); if (state[OPTION_MODE].set) /* mode */ { err = tpm2_protector_parse_mode (state[OPTION_MODE].arg, &tpm2_protector_ctx.mode); if (err != GRUB_ERR_NONE) return err; } if (state[OPTION_PCRS].set) /* pcrs */ { err = grub_tpm2_protector_parse_pcrs (state[OPTION_PCRS].arg, tpm2_protector_ctx.pcrs, &tpm2_protector_ctx.pcr_count); if (err != GRUB_ERR_NONE) return err; } if (state[OPTION_BANK].set) /* bank */ { err = grub_tpm2_protector_parse_bank (state[OPTION_BANK].arg, &tpm2_protector_ctx.bank); if (err != GRUB_ERR_NONE) return err; } if (state[OPTION_TPM2KEY].set) /* tpm2key */ { err = tpm2_protector_parse_file (state[OPTION_TPM2KEY].arg, &tpm2_protector_ctx.tpm2key); if (err != GRUB_ERR_NONE) return err; } if (state[OPTION_KEYFILE].set) /* keyfile */ { err = tpm2_protector_parse_file (state[OPTION_KEYFILE].arg, &tpm2_protector_ctx.keyfile); if (err != GRUB_ERR_NONE) return err; } if (state[OPTION_SRK].set) /* srk */ { err = grub_tpm2_protector_parse_tpm_handle (state[OPTION_SRK].arg, &tpm2_protector_ctx.srk); if (err != GRUB_ERR_NONE) return err; } if (state[OPTION_ASYMMETRIC].set) /* asymmetric */ { err = grub_tpm2_protector_parse_asymmetric (state[OPTION_ASYMMETRIC].arg, &tpm2_protector_ctx.srk_type); if (err != GRUB_ERR_NONE) return err; } if (state[OPTION_NVINDEX].set) /* nvindex */ { err = grub_tpm2_protector_parse_tpm_handle (state[OPTION_NVINDEX].arg, &tpm2_protector_ctx.nv); if (err != GRUB_ERR_NONE) return err; } err = tpm2_protector_check_args (&tpm2_protector_ctx); /* This command only initializes the protector, so nothing else to do. */ return err; } static grub_err_t tpm2_protector_clear_cmd_handler (grub_extcmd_context_t ctxt __attribute__ ((unused)), int argc, char **args __attribute__ ((unused))) { if (argc != 0) return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("tpm2_key_protector_clear accepts no arguments")); grub_free ((void *) tpm2_protector_ctx.keyfile); grub_memset (&tpm2_protector_ctx, 0, sizeof (tpm2_protector_ctx)); return GRUB_ERR_NONE; } static struct grub_key_protector tpm2_key_protector = { .name = "tpm2", .recover_key = tpm2_protector_recover_key }; static grub_err_t tpm2_dump_pcr (grub_command_t cmd __attribute__((__unused__)), int argc, char *argv[]) { TPM_ALG_ID_t pcr_bank; if (argc == 0) pcr_bank = TPM_ALG_SHA256; else if (grub_strcmp (argv[0], "sha1") == 0) pcr_bank = TPM_ALG_SHA1; else if (grub_strcmp (argv[0], "sha256") == 0) pcr_bank = TPM_ALG_SHA256; else if (grub_strcmp (argv[0], "sha384") == 0) pcr_bank = TPM_ALG_SHA384; else if (grub_strcmp (argv[0], "sha512") == 0) pcr_bank = TPM_ALG_SHA512; else { grub_printf ("Unknown PCR bank\n"); return GRUB_ERR_BAD_ARGUMENT; } tpm2_protector_dump_pcr (pcr_bank); return GRUB_ERR_NONE; } GRUB_MOD_INIT (tpm2_key_protector) { tpm2_protector_init_cmd = grub_register_extcmd ("tpm2_key_protector_init", tpm2_protector_init_cmd_handler, 0, N_("[-m mode] " "[-p pcr_list] " "[-b pcr_bank] " "[-T tpm2_key_file_path] " "[-k sealed_key_file_path] " "[-s srk_handle] " "[-a asymmetric_key_type] " "[-n nv_index]"), N_("Initialize the TPM2 key protector."), tpm2_protector_init_cmd_options); tpm2_protector_clear_cmd = grub_register_extcmd ("tpm2_key_protector_clear", tpm2_protector_clear_cmd_handler, 0, NULL, N_("Clear the TPM2 key protector if previously initialized."), NULL); grub_key_protector_register (&tpm2_key_protector); tpm2_dump_pcr_cmd = grub_register_command ("tpm2_dump_pcr", tpm2_dump_pcr, N_("Dump TPM2 PCRs"), N_("Print all PCRs of the specified TPM 2.0 bank")); } GRUB_MOD_FINI (tpm2_key_protector) { grub_free ((void *) tpm2_protector_ctx.keyfile); grub_key_protector_unregister (&tpm2_key_protector); grub_unregister_extcmd (tpm2_protector_clear_cmd); grub_unregister_extcmd (tpm2_protector_init_cmd); grub_unregister_command (tpm2_dump_pcr_cmd); } grub-2.14~git20250718.0e36779/grub-core/commands/tpm2_key_protector/tpm2key.c0000644000175000017500000003313115036447510023064 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (C) 2023 SUSE LLC * Copyright (C) 2024 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include "tpm2key.h" extern asn1_static_node tpm2key_asn1_tab[]; const char *sealed_key_oid = "2.23.133.10.1.5"; static int asn1_allocate_and_read (asn1_node node, const char *name, void **content, grub_size_t *content_size) { grub_uint8_t *tmpstr = NULL; int tmpstr_size = 0; int ret; if (content == NULL) return ASN1_MEM_ERROR; ret = asn1_read_value (node, name, NULL, &tmpstr_size); if (ret != ASN1_MEM_ERROR) return ret; tmpstr = grub_malloc (tmpstr_size); if (tmpstr == NULL) return ASN1_MEM_ERROR; ret = asn1_read_value (node, name, tmpstr, &tmpstr_size); if (ret != ASN1_SUCCESS) return ret; *content = tmpstr; *content_size = tmpstr_size; return ASN1_SUCCESS; } static int asn1_read_uint32 (asn1_node node, const char *name, grub_uint32_t *out) { grub_uint32_t tmp = 0; grub_uint8_t *ptr; void *data = NULL; grub_size_t data_size; int ret; ret = asn1_allocate_and_read (node, name, &data, &data_size); if (ret != ASN1_SUCCESS) return ret; /* * ASN.1 INTEGER is encoded in the following format: * * TAG LENGTH OCTECTS * * The integer TAG is 02 and LENGTH is the number of followed OCTECTS in * big endian. For example: * * 0x1: 02 01 01 * 0xabcd: 02 02 ab cd * * To decribe 0x1, it only takes 1 octect, so LENGTH is 0x01 and the * octect is 0x01. On the other hand, 0xabcd requires 2 octects: 'ab" and * 'cd', so LENGTH is 0x02. * * This function only expects a uint32 integer, so it rejects any integer * containing more than 4 octects. */ if (data_size > 4) { ret = ASN1_MEM_ERROR; goto error; } /* Copy the octects into 'tmp' to make it a big-endian uint32 */ ptr = (grub_uint8_t *) &tmp + (4 - data_size); grub_memcpy (ptr, data, data_size); /* Convert the big-endian integer to host uint32 */ tmp = grub_be_to_cpu32 (tmp); *out = tmp; error: if (data) grub_free (data); return ret; } grub_err_t grub_tpm2key_start_parsing (asn1_node *parsed_tpm2key, void *data, grub_size_t size) { asn1_node tpm2key; asn1_node tpm2key_asn1 = NULL; void *type_oid = NULL; grub_size_t type_oid_size = 0; void *empty_auth = NULL; grub_size_t empty_auth_size = 0; int tmp_size = 0; int ret; grub_err_t err; /* * TPMKey ::= SEQUENCE { * type OBJECT IDENTIFIER, * emptyAuth [0] EXPLICIT BOOLEAN OPTIONAL, * policy [1] EXPLICIT SEQUENCE OF TPMPolicy OPTIONAL, * secret [2] EXPLICIT OCTET STRING OPTIONAL, * authPolicy [3] EXPLICIT SEQUENCE OF TPMAuthPolicy OPTIONAL, * description [4] EXPLICIT UTF8String OPTIONAL, * rsaParent [5] EXPLICIT BOOLEAN OPTIONAL, * parent INTEGER, * pubkey OCTET STRING, * privkey OCTET STRING * } */ ret = asn1_array2tree (tpm2key_asn1_tab, &tpm2key_asn1, NULL); if (ret != ASN1_SUCCESS) return grub_error (GRUB_ERR_BAD_ARGUMENT, "failed to parse TPM2KEY ASN.1 array"); ret = asn1_create_element (tpm2key_asn1, "TPM2KEY.TPMKey", &tpm2key); if (ret != ASN1_SUCCESS) return grub_error (GRUB_ERR_BAD_ARGUMENT, "failed to create TPM2KEY.TPMKey"); ret = asn1_der_decoding (&tpm2key, data, size, NULL); if (ret != ASN1_SUCCESS) return grub_error (GRUB_ERR_BAD_ARGUMENT, "failed to decode TPM2KEY DER"); /* Check if 'type' is Sealed Key or not */ ret = asn1_allocate_and_read (tpm2key, "type", &type_oid, &type_oid_size); if (ret != ASN1_SUCCESS) return grub_error (GRUB_ERR_BAD_FILE_TYPE, "not a valid TPM2KEY file"); if (grub_memcmp (sealed_key_oid, type_oid, type_oid_size) != 0) { err = grub_error (GRUB_ERR_BAD_FILE_TYPE, "not a valid TPM2KEY file"); goto error; } /* 'emptyAuth' must be 'TRUE' since we don't support password authorization */ ret = asn1_allocate_and_read (tpm2key, "emptyAuth", &empty_auth, &empty_auth_size); if (ret != ASN1_SUCCESS || grub_strncmp ("TRUE", empty_auth, empty_auth_size) != 0) { err = grub_error (GRUB_ERR_BAD_ARGUMENT, "emptyAuth not TRUE"); goto error; } /* 'secret' should not be in a sealed key */ ret = asn1_read_value (tpm2key, "secret", NULL, &tmp_size); if (ret != ASN1_ELEMENT_NOT_FOUND) { err = grub_error (GRUB_ERR_BAD_ARGUMENT, "\"secret\" not allowed for Sealed Key"); goto error; } *parsed_tpm2key = tpm2key; err = GRUB_ERR_NONE; error: grub_free (type_oid); grub_free (empty_auth); return err; } void grub_tpm2key_end_parsing (asn1_node tpm2key) { asn1_delete_structure (&tpm2key); tpm2key = NULL; } grub_err_t grub_tpm2key_get_rsaparent (asn1_node tpm2key, grub_uint8_t *rsaparent) { void *bool_str = NULL; grub_size_t bool_str_size = 0; int ret; if (rsaparent == NULL) return grub_error (GRUB_ERR_BAD_ARGUMENT, "NULL pointer detected"); if (tpm2key == NULL) return grub_error (GRUB_ERR_READ_ERROR, "invalid parent node"); ret = asn1_allocate_and_read (tpm2key, "rsaParent", &bool_str, &bool_str_size); if (ret == ASN1_SUCCESS) { if (grub_strncmp ("TRUE", bool_str, bool_str_size) == 0) *rsaparent = 1; else *rsaparent = 0; } else if (ret == ASN1_ELEMENT_NOT_FOUND) *rsaparent = 0; else return grub_error (GRUB_ERR_READ_ERROR, "failed to retrieve rsaParent"); grub_free (bool_str); return GRUB_ERR_NONE; } grub_err_t grub_tpm2key_get_parent (asn1_node tpm2key, grub_uint32_t *parent) { int ret; if (parent == NULL) return grub_error (GRUB_ERR_BAD_ARGUMENT, "NULL pointer detected"); if (tpm2key == NULL) return grub_error (GRUB_ERR_READ_ERROR, "invalid parent node"); ret = asn1_read_uint32 (tpm2key, "parent", parent); if (ret != ASN1_SUCCESS) return grub_error (GRUB_ERR_READ_ERROR, "failed to retrieve parent"); return GRUB_ERR_NONE; } static grub_err_t tpm2key_get_octstring (asn1_node tpm2key, const char *name, void **data, grub_size_t *size) { int ret; if (name == NULL || data == NULL || size == NULL) return grub_error (GRUB_ERR_BAD_ARGUMENT, "invalid parameter(s)"); if (tpm2key == NULL) return grub_error (GRUB_ERR_READ_ERROR, "invalid %s node", name); ret = asn1_allocate_and_read (tpm2key, name, data, size); if (ret != ASN1_SUCCESS) return grub_error (GRUB_ERR_READ_ERROR, "failed to retrieve %s", name); return GRUB_ERR_NONE; } grub_err_t grub_tpm2key_get_pubkey (asn1_node tpm2key, void **data, grub_size_t *size) { return tpm2key_get_octstring (tpm2key, "pubkey", data, size); } grub_err_t grub_tpm2key_get_privkey (asn1_node tpm2key, void **data, grub_size_t *size) { return tpm2key_get_octstring (tpm2key, "privkey", data, size); } /* * The maximum and minimum number of elements for 'policy' and 'authPolicy' sequences * * Although there is no limit for the number of sequences elements, we set the upper * bound to 99 to make it easier to implement the code. * * Any 'policy' or 'authPolicy' contains more than 99 commands/policies would become * extremely complex to manage so it is impractical to support such use case. */ #define TPM2KEY_ELEMENTS_MAX 99 #define TPM2KEY_ELEMENTS_MIN 1 /* * The string to fetch 'Policy' from 'authPolicy': * authPolicy.?XX.Policy */ #define AUTHPOLICY_POL_MAX_STR "authPolicy.?XX.Policy" #define AUTHPOLICY_POL_MAX (sizeof (AUTHPOLICY_POL_MAX_STR)) /* * Expected strings for CommandCode and CommandPolicy: * policy.?XX.CommandCode * policy.?XX.CommandPolicy * authPolicy.?XX.Policy.?YY.CommandCode * authPolicy.?XX.Policy.?YY.CommandPolicy */ #define CMD_CODE_MAX_STR AUTHPOLICY_POL_MAX_STR".?YY.CommandCode" #define CMD_POL_MAX_STR AUTHPOLICY_POL_MAX_STR".?YY.CommandPolicy" #define CMD_CODE_MAX (sizeof (CMD_CODE_MAX_STR)) #define CMD_POL_MAX (sizeof (CMD_POL_MAX_STR)) static int tpm2key_get_policy_seq (asn1_node tpm2key, const char *prefix, tpm2key_policy_t *policy_seq) { tpm2key_policy_t tmp_seq = NULL; tpm2key_policy_t policy = NULL; int policy_n; char cmd_code[CMD_CODE_MAX]; char cmd_pol[CMD_POL_MAX]; grub_size_t cmd_policy_len; int i; int ret; ret = asn1_number_of_elements (tpm2key, prefix, &policy_n); if (ret != ASN1_SUCCESS) return ret; /* * Limit the number of policy commands to two digits (99) * Although there is no upper bound for the number of policy commands, * in practice, it takes one or two policy commands to unseal the key, * so the 99 commands limit is more than enough. */ if (policy_n > TPM2KEY_ELEMENTS_MAX || policy_n < TPM2KEY_ELEMENTS_MIN) return ASN1_VALUE_NOT_VALID; /* * Iterate the policy commands backwards since grub_list_push() prepends * the item into the list. */ for (i = policy_n; i >= 1; i--) { policy = grub_zalloc (sizeof (struct tpm2key_policy)); if (policy == NULL) { ret = ASN1_MEM_ALLOC_ERROR; goto error; } grub_snprintf (cmd_code, CMD_CODE_MAX, "%s.?%d.CommandCode", prefix, i); grub_snprintf (cmd_pol, CMD_POL_MAX, "%s.?%d.CommandPolicy", prefix, i); /* CommandCode [0] EXPLICIT INTEGER */ ret = asn1_read_uint32 (tpm2key, cmd_code, &policy->cmd_code); if (ret != ASN1_SUCCESS) return ret; /* CommandPolicy [1] EXPLICIT OCTET STRING */ ret = tpm2key_get_octstring (tpm2key, cmd_pol, &policy->cmd_policy, &cmd_policy_len); if (ret != ASN1_SUCCESS) { goto error; } else if (cmd_policy_len > GRUB_TPM2_BUFFER_CAPACITY) { /* * CommandPolicy is the marshalled parameters for the TPM command so * it should not be larger than the maximum TPM2 buffer. */ ret = ASN1_VALUE_NOT_VALID; goto error; } policy->cmd_policy_len = (grub_uint16_t)cmd_policy_len; /* Prepend the policy command into the sequence */ grub_list_push (GRUB_AS_LIST_P (&tmp_seq), GRUB_AS_LIST (policy)); } *policy_seq = tmp_seq; return ASN1_SUCCESS; error: if (policy != NULL) { grub_free (policy->cmd_policy); grub_free (policy); } grub_tpm2key_free_policy_seq (tmp_seq); return ret; } grub_err_t grub_tpm2key_get_policy_seq (asn1_node tpm2key, tpm2key_policy_t *policy_seq) { int ret; ret = tpm2key_get_policy_seq (tpm2key, "policy", policy_seq); if (ret == ASN1_ELEMENT_NOT_FOUND) { /* "policy" is optional, so it may not be available */ *policy_seq = NULL; return GRUB_ERR_NONE; } else if (ret != ASN1_SUCCESS) return grub_error (GRUB_ERR_READ_ERROR, "failed to retrieve policy"); return GRUB_ERR_NONE; } void grub_tpm2key_free_policy_seq (tpm2key_policy_t policy_seq) { tpm2key_policy_t policy; tpm2key_policy_t next; if (policy_seq == NULL) return; FOR_LIST_ELEMENTS_SAFE (policy, next, policy_seq) { grub_free (policy->cmd_policy); grub_free (policy); } } grub_err_t grub_tpm2key_get_authpolicy_seq (asn1_node tpm2key, tpm2key_authpolicy_t *authpol_seq) { tpm2key_authpolicy_t tmp_seq = NULL; tpm2key_authpolicy_t authpol = NULL; int authpol_n; char authpol_pol[AUTHPOLICY_POL_MAX]; int i; int ret; grub_err_t err; ret = asn1_number_of_elements (tpm2key, "authPolicy", &authpol_n); if (ret == ASN1_ELEMENT_NOT_FOUND) { /* "authPolicy" is optional, so it may not be available */ *authpol_seq = NULL; return GRUB_ERR_NONE; } else if (ret != ASN1_SUCCESS) return grub_error (GRUB_ERR_READ_ERROR, "failed to retrieve authPolicy"); /* Limit the number of authPolicy elements to two digits (99) */ if (authpol_n > TPM2KEY_ELEMENTS_MAX || authpol_n < TPM2KEY_ELEMENTS_MIN) return grub_error (GRUB_ERR_OUT_OF_RANGE, "invalid number of authPolicy elements"); /* * Iterate the authPolicy elements backwards since grub_list_push() prepends * the item into the list. */ for (i = authpol_n; i >= 1; i--) { authpol = grub_zalloc (sizeof (struct tpm2key_authpolicy)); if (authpol == NULL) { err = grub_error (GRUB_ERR_OUT_OF_MEMORY, "failed to allocate memory for authPolicy"); goto error; } grub_snprintf (authpol_pol, AUTHPOLICY_POL_MAX, "authPolicy.?%d.Policy", i); ret = tpm2key_get_policy_seq (tpm2key, authpol_pol, &authpol->policy_seq); if (ret != ASN1_SUCCESS) { err = grub_error (GRUB_ERR_READ_ERROR, "failed to retrieve policy from authPolicy"); goto error; } /* Prepend the authPolicy element into the sequence */ grub_list_push (GRUB_AS_LIST_P (&tmp_seq), GRUB_AS_LIST (authpol)); } *authpol_seq = tmp_seq; return GRUB_ERR_NONE; error: if (authpol != NULL) { grub_tpm2key_free_policy_seq (authpol->policy_seq); grub_free (authpol); } grub_tpm2key_free_authpolicy_seq (tmp_seq); return err; } void grub_tpm2key_free_authpolicy_seq (tpm2key_authpolicy_t authpol_seq) { tpm2key_authpolicy_t authpol; tpm2key_authpolicy_t next; if (authpol_seq == NULL) return; FOR_LIST_ELEMENTS_SAFE (authpol, next, authpol_seq) { grub_tpm2key_free_policy_seq (authpol->policy_seq); grub_free (authpol); } } grub-2.14~git20250718.0e36779/grub-core/commands/tpm2_key_protector/tpm2key.h0000644000175000017500000000502115036447510023066 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (C) 2023 SUSE LLC * Copyright (C) 2024 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #ifndef GRUB_TPM2_TPM2KEY_HEADER #define GRUB_TPM2_TPM2KEY_HEADER 1 #include #include /* * TPMPolicy ::= SEQUENCE { * CommandCode [0] EXPLICIT INTEGER, * CommandPolicy [1] EXPLICIT OCTET STRING * } */ struct tpm2key_policy { struct tpm2key_policy *next; struct tpm2key_policy **prev; grub_uint32_t cmd_code; void *cmd_policy; grub_uint16_t cmd_policy_len; }; typedef struct tpm2key_policy *tpm2key_policy_t; /* * TPMAuthPolicy ::= SEQUENCE { * Name [0] EXPLICIT UTF8String OPTIONAL, * Policy [1] EXPLICIT SEQUENCE OF TPMPolicy * } * * Name is not a necessary part to unseal the key. Ignore it. */ struct tpm2key_authpolicy { struct tpm2key_authpolicy *next; struct tpm2key_authpolicy **prev; /* char *name; */ tpm2key_policy_t policy_seq; }; typedef struct tpm2key_authpolicy *tpm2key_authpolicy_t; extern grub_err_t grub_tpm2key_start_parsing (asn1_node *parsed_tpm2key, void *data, grub_size_t size); extern void grub_tpm2key_end_parsing (asn1_node tpm2key); extern grub_err_t grub_tpm2key_get_rsaparent (asn1_node tpm2key, grub_uint8_t *rsaparent); extern grub_err_t grub_tpm2key_get_parent (asn1_node tpm2key, grub_uint32_t *parent); extern grub_err_t grub_tpm2key_get_pubkey (asn1_node tpm2key, void **data, grub_size_t *size); extern grub_err_t grub_tpm2key_get_privkey (asn1_node tpm2key, void **data, grub_size_t *size); extern grub_err_t grub_tpm2key_get_policy_seq (asn1_node tpm2key, tpm2key_policy_t *policy_seq); extern void grub_tpm2key_free_policy_seq (tpm2key_policy_t policy_seq); extern grub_err_t grub_tpm2key_get_authpolicy_seq (asn1_node tpm2key, tpm2key_authpolicy_t *authpol_seq); extern void grub_tpm2key_free_authpolicy_seq (tpm2key_authpolicy_t authpol_seq); #endif /* GRUB_TPM2_TPM2KEY_HEADER */ grub-2.14~git20250718.0e36779/grub-core/commands/test.c0000644000175000017500000002671315036447510016625 00000000000000/* test.c -- The test command.. */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2005,2007,2009 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); /* Set a limit on recursion to avoid stack overflow. */ #define MAX_TEST_RECURSION_DEPTH 100 /* A simple implementation for signed numbers. */ static int grub_strtosl (char *arg, const char ** const end, int base) { if (arg[0] == '-') return -grub_strtoul (arg + 1, end, base); return grub_strtoul (arg, end, base); } /* Context for test_parse. */ struct test_parse_ctx { int invert; int or, and; int file_exists; struct grub_dirhook_info file_info; char *filename; }; /* Take care of discarding and inverting. */ static void update_val (int val, struct test_parse_ctx *ctx) { ctx->and = ctx->and && (ctx->invert ? ! val : val); ctx->invert = 0; } /* A hook for iterating directories. */ static int find_file (const char *cur_filename, const struct grub_dirhook_info *info, void *data) { struct test_parse_ctx *ctx = data; if ((info->case_insensitive ? grub_strcasecmp (cur_filename, ctx->filename) : grub_strcmp (cur_filename, ctx->filename)) == 0) { ctx->file_info = *info; ctx->file_exists = 1; return 1; } return 0; } /* Check if file exists and fetch its information. */ static void get_fileinfo (char *path, struct test_parse_ctx *ctx) { char *pathname; char *device_name; grub_fs_t fs; grub_device_t dev; ctx->file_exists = 0; device_name = grub_file_get_device_name (path); dev = grub_device_open (device_name); if (! dev) { grub_free (device_name); return; } fs = grub_fs_probe (dev); if (! fs) { grub_free (device_name); grub_device_close (dev); return; } pathname = grub_strchr (path, ')'); if (! pathname) pathname = path; else pathname++; /* Remove trailing '/'. */ while (*pathname && pathname[grub_strlen (pathname) - 1] == '/') pathname[grub_strlen (pathname) - 1] = 0; /* Split into path and filename. */ ctx->filename = grub_strrchr (pathname, '/'); if (! ctx->filename) { path = grub_strdup ("/"); ctx->filename = pathname; } else { ctx->filename++; path = grub_strdup (pathname); path[ctx->filename - pathname] = 0; } /* It's the whole device. */ if (! *pathname) { ctx->file_exists = 1; grub_memset (&ctx->file_info, 0, sizeof (ctx->file_info)); /* Root is always a directory. */ ctx->file_info.dir = 1; /* Fetch writing time. */ ctx->file_info.mtimeset = 0; if (fs->fs_mtime) { if (! fs->fs_mtime (dev, &ctx->file_info.mtime)) ctx->file_info.mtimeset = 1; grub_errno = GRUB_ERR_NONE; } } else (fs->fs_dir) (dev, path, find_file, ctx); grub_device_close (dev); grub_free (path); grub_free (device_name); } /* Parse a test expression starting from *argn. */ static int test_parse (char **args, int *argn, int argc, int *depth) { struct test_parse_ctx ctx = { .and = 1, .or = 0, .invert = 0 }; /* Here we have the real parsing. */ while (*argn < argc) { /* First try 3 argument tests. */ if (*argn + 2 < argc) { /* String tests. */ if (grub_strcmp (args[*argn + 1], "=") == 0 || grub_strcmp (args[*argn + 1], "==") == 0) { update_val (grub_strcmp (args[*argn], args[*argn + 2]) == 0, &ctx); (*argn) += 3; continue; } if (grub_strcmp (args[*argn + 1], "!=") == 0) { update_val (grub_strcmp (args[*argn], args[*argn + 2]) != 0, &ctx); (*argn) += 3; continue; } /* GRUB extension: lexicographical sorting. */ if (grub_strcmp (args[*argn + 1], "<") == 0) { update_val (grub_strcmp (args[*argn], args[*argn + 2]) < 0, &ctx); (*argn) += 3; continue; } if (grub_strcmp (args[*argn + 1], "<=") == 0) { update_val (grub_strcmp (args[*argn], args[*argn + 2]) <= 0, &ctx); (*argn) += 3; continue; } if (grub_strcmp (args[*argn + 1], ">") == 0) { update_val (grub_strcmp (args[*argn], args[*argn + 2]) > 0, &ctx); (*argn) += 3; continue; } if (grub_strcmp (args[*argn + 1], ">=") == 0) { update_val (grub_strcmp (args[*argn], args[*argn + 2]) >= 0, &ctx); (*argn) += 3; continue; } /* Number tests. */ if (grub_strcmp (args[*argn + 1], "-eq") == 0) { update_val (grub_strtosl (args[*argn], 0, 0) == grub_strtosl (args[*argn + 2], 0, 0), &ctx); (*argn) += 3; continue; } if (grub_strcmp (args[*argn + 1], "-ge") == 0) { update_val (grub_strtosl (args[*argn], 0, 0) >= grub_strtosl (args[*argn + 2], 0, 0), &ctx); (*argn) += 3; continue; } if (grub_strcmp (args[*argn + 1], "-gt") == 0) { update_val (grub_strtosl (args[*argn], 0, 0) > grub_strtosl (args[*argn + 2], 0, 0), &ctx); (*argn) += 3; continue; } if (grub_strcmp (args[*argn + 1], "-le") == 0) { update_val (grub_strtosl (args[*argn], 0, 0) <= grub_strtosl (args[*argn + 2], 0, 0), &ctx); (*argn) += 3; continue; } if (grub_strcmp (args[*argn + 1], "-lt") == 0) { update_val (grub_strtosl (args[*argn], 0, 0) < grub_strtosl (args[*argn + 2], 0, 0), &ctx); (*argn) += 3; continue; } if (grub_strcmp (args[*argn + 1], "-ne") == 0) { update_val (grub_strtosl (args[*argn], 0, 0) != grub_strtosl (args[*argn + 2], 0, 0), &ctx); (*argn) += 3; continue; } /* GRUB extension: compare numbers skipping prefixes. Useful for comparing versions. E.g. vmlinuz-2 -plt vmlinuz-11. */ if (grub_strcmp (args[*argn + 1], "-pgt") == 0 || grub_strcmp (args[*argn + 1], "-plt") == 0) { int i; /* Skip common prefix. */ for (i = 0; args[*argn][i] == args[*argn + 2][i] && args[*argn][i]; i++); /* Go the digits back. */ i--; while (grub_isdigit (args[*argn][i]) && i > 0) i--; i++; if (grub_strcmp (args[*argn + 1], "-pgt") == 0) update_val (grub_strtoul (args[*argn] + i, 0, 0) > grub_strtoul (args[*argn + 2] + i, 0, 0), &ctx); else update_val (grub_strtoul (args[*argn] + i, 0, 0) < grub_strtoul (args[*argn + 2] + i, 0, 0), &ctx); (*argn) += 3; continue; } /* -nt and -ot tests. GRUB extension: when doing -?t bias will be added to the first mtime. */ if (grub_memcmp (args[*argn + 1], "-nt", 3) == 0 || grub_memcmp (args[*argn + 1], "-ot", 3) == 0) { struct grub_dirhook_info file1; int file1exists; int bias = 0; /* Fetch fileinfo. */ get_fileinfo (args[*argn], &ctx); file1 = ctx.file_info; file1exists = ctx.file_exists; get_fileinfo (args[*argn + 2], &ctx); if (args[*argn + 1][3]) bias = grub_strtosl (args[*argn + 1] + 3, 0, 0); if (grub_memcmp (args[*argn + 1], "-nt", 3) == 0) update_val ((file1exists && ! ctx.file_exists) || (file1.mtimeset && ctx.file_info.mtimeset && file1.mtime + bias > ctx.file_info.mtime), &ctx); else update_val ((! file1exists && ctx.file_exists) || (file1.mtimeset && ctx.file_info.mtimeset && file1.mtime + bias < ctx.file_info.mtime), &ctx); (*argn) += 3; continue; } } /* Two-argument tests. */ if (*argn + 1 < argc) { /* File tests. */ if (grub_strcmp (args[*argn], "-d") == 0) { get_fileinfo (args[*argn + 1], &ctx); update_val (ctx.file_exists && ctx.file_info.dir, &ctx); (*argn) += 2; continue; } if (grub_strcmp (args[*argn], "-e") == 0) { get_fileinfo (args[*argn + 1], &ctx); update_val (ctx.file_exists, &ctx); (*argn) += 2; continue; } if (grub_strcmp (args[*argn], "-f") == 0) { get_fileinfo (args[*argn + 1], &ctx); /* FIXME: check for other types. */ update_val (ctx.file_exists && ! ctx.file_info.dir, &ctx); (*argn) += 2; continue; } if (grub_strcmp (args[*argn], "-s") == 0) { grub_file_t file; file = grub_file_open (args[*argn + 1], GRUB_FILE_TYPE_GET_SIZE | GRUB_FILE_TYPE_NO_DECOMPRESS); update_val (file && (grub_file_size (file) != 0), &ctx); if (file) grub_file_close (file); grub_errno = GRUB_ERR_NONE; (*argn) += 2; continue; } /* String tests. */ if (grub_strcmp (args[*argn], "-n") == 0) { update_val (args[*argn + 1][0], &ctx); (*argn) += 2; continue; } if (grub_strcmp (args[*argn], "-z") == 0) { update_val (! args[*argn + 1][0], &ctx); (*argn) += 2; continue; } } /* Special modifiers. */ /* End of expression. return to parent. */ if (grub_strcmp (args[*argn], ")") == 0) { (*argn)++; if (*depth > 0) (*depth)--; return ctx.or || ctx.and; } /* Recursively invoke if parenthesis. */ if (grub_strcmp (args[*argn], "(") == 0) { (*argn)++; if (++(*depth) > MAX_TEST_RECURSION_DEPTH) { grub_error (GRUB_ERR_OUT_OF_RANGE, N_("max recursion depth exceeded")); depth--; return ctx.or || ctx.and; } update_val (test_parse (args, argn, argc, depth), &ctx); continue; } if (grub_strcmp (args[*argn], "!") == 0) { ctx.invert = ! ctx.invert; (*argn)++; continue; } if (grub_strcmp (args[*argn], "-a") == 0) { (*argn)++; continue; } if (grub_strcmp (args[*argn], "-o") == 0) { ctx.or = ctx.or || ctx.and; ctx.and = 1; (*argn)++; continue; } /* No test found. Interpret if as just a string. */ update_val (args[*argn][0], &ctx); (*argn)++; } return ctx.or || ctx.and; } static grub_err_t grub_cmd_test (grub_command_t cmd __attribute__ ((unused)), int argc, char **args) { int argn = 0; int depth = 0; if (argc >= 1 && grub_strcmp (args[argc - 1], "]") == 0) argc--; return test_parse (args, &argn, argc, &depth) ? GRUB_ERR_NONE : grub_error (GRUB_ERR_TEST_FAILURE, N_("false")); } static grub_command_t cmd_1, cmd_2; GRUB_MOD_INIT(test) { cmd_1 = grub_register_command ("[", grub_cmd_test, N_("EXPRESSION ]"), N_("Evaluate an expression.")); cmd_1->flags |= GRUB_COMMAND_FLAG_EXTRACTOR; cmd_2 = grub_register_command ("test", grub_cmd_test, N_("EXPRESSION"), N_("Evaluate an expression.")); cmd_2->flags |= GRUB_COMMAND_FLAG_EXTRACTOR; } GRUB_MOD_FINI(test) { grub_unregister_command (cmd_1); grub_unregister_command (cmd_2); } grub-2.14~git20250718.0e36779/grub-core/commands/tpm.c0000644000175000017500000000735115036447510016443 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (C) 2018 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . * * Core TPM support code. */ #include #include #include #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); static grub_err_t grub_tpm_verify_init (grub_file_t io, enum grub_file_type type __attribute__ ((unused)), void **context, enum grub_verify_flags *flags) { *context = io->name; *flags |= GRUB_VERIFY_FLAGS_SINGLE_CHUNK; /* * The loopback image is mapped as a disk allowing it to function like * a block device. However, we measure files read from the block device * not the device itself. For example, we don't measure block devices like * hd0 disk directly. This process is crucial to prevent out-of-memory * errors as loopback images are inherently large. */ if ((type & GRUB_FILE_TYPE_MASK) == GRUB_FILE_TYPE_LOOPBACK) *flags = GRUB_VERIFY_FLAGS_SKIP_VERIFICATION; return GRUB_ERR_NONE; } static grub_err_t grub_tpm_verify_write (void *context, void *buf, grub_size_t size) { grub_err_t status = grub_tpm_measure (buf, size, GRUB_BINARY_PCR, context); if (status == GRUB_ERR_NONE) return GRUB_ERR_NONE; grub_dprintf ("tpm", "Measuring buffer failed: %d\n", status); return grub_is_tpm_fail_fatal () ? status : GRUB_ERR_NONE; } static grub_err_t grub_tpm_verify_string (char *str, enum grub_verify_string_type type) { const char *prefix = NULL; char *description; grub_err_t status; switch (type) { case GRUB_VERIFY_KERNEL_CMDLINE: prefix = "kernel_cmdline: "; break; case GRUB_VERIFY_MODULE_CMDLINE: prefix = "module_cmdline: "; break; case GRUB_VERIFY_COMMAND: prefix = "grub_cmd: "; break; } description = grub_malloc (grub_strlen (str) + grub_strlen (prefix) + 1); if (!description) return grub_errno; grub_memcpy (description, prefix, grub_strlen (prefix)); grub_memcpy (description + grub_strlen (prefix), str, grub_strlen (str) + 1); status = grub_tpm_measure ((unsigned char *) str, grub_strlen (str), GRUB_STRING_PCR, description); grub_free (description); if (status == GRUB_ERR_NONE) return GRUB_ERR_NONE; grub_dprintf ("tpm", "Measuring string %s failed: %d\n", str, status); return grub_is_tpm_fail_fatal () ? status : GRUB_ERR_NONE; } struct grub_file_verifier grub_tpm_verifier = { .name = "tpm", .init = grub_tpm_verify_init, .write = grub_tpm_verify_write, .verify_string = grub_tpm_verify_string, }; GRUB_MOD_INIT (tpm) { /* * Even though this now calls ibmvtpm's grub_tpm_present() from GRUB_MOD_INIT(), * it does seem to call it late enough in the initialization sequence so * that whatever discovered "device nodes" before this GRUB_MOD_INIT() is * called, enables the ibmvtpm driver to see the device nodes. */ if (!grub_tpm_present()) return; grub_verifier_register (&grub_tpm_verifier); } GRUB_MOD_FINI (tpm) { if (!grub_tpm_present()) return; grub_verifier_unregister (&grub_tpm_verifier); } grub-2.14~git20250718.0e36779/grub-core/commands/menuentry.c0000644000175000017500000002054615002425525017665 00000000000000/* menuentry.c - menuentry command */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2010 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include #include static const struct grub_arg_option options[] = { {"class", 1, GRUB_ARG_OPTION_REPEATABLE, N_("Menu entry type."), N_("STRING"), ARG_TYPE_STRING}, {"users", 2, 0, N_("List of users allowed to boot this entry."), N_("USERNAME[,USERNAME]"), ARG_TYPE_STRING}, {"hotkey", 3, 0, N_("Keyboard key to quickly boot this entry."), N_("KEYBOARD_KEY"), ARG_TYPE_STRING}, {"source", 4, 0, N_("Use STRING as menu entry body."), N_("STRING"), ARG_TYPE_STRING}, {"id", 0, 0, N_("Menu entry identifier."), N_("STRING"), ARG_TYPE_STRING}, /* TRANSLATORS: menu entry can either be bootable by anyone or only by handful of users. By default when security is active only superusers can boot a given menu entry. With --unrestricted (this option) anyone can boot it. */ {"unrestricted", 0, 0, N_("This entry can be booted by any user."), 0, ARG_TYPE_NONE}, {0, 0, 0, 0, 0, 0} }; static struct { const char *name; int key; } hotkey_aliases[] = { {"backspace", GRUB_TERM_BACKSPACE}, {"tab", GRUB_TERM_TAB}, {"delete", GRUB_TERM_KEY_DC}, {"insert", GRUB_TERM_KEY_INSERT}, {"f1", GRUB_TERM_KEY_F1}, {"f2", GRUB_TERM_KEY_F2}, {"f3", GRUB_TERM_KEY_F3}, {"f4", GRUB_TERM_KEY_F4}, {"f5", GRUB_TERM_KEY_F5}, {"f6", GRUB_TERM_KEY_F6}, {"f7", GRUB_TERM_KEY_F7}, {"f8", GRUB_TERM_KEY_F8}, {"f9", GRUB_TERM_KEY_F9}, {"f10", GRUB_TERM_KEY_F10}, {"f11", GRUB_TERM_KEY_F11}, {"f12", GRUB_TERM_KEY_F12}, }; /* Add a menu entry to the current menu context (as given by the environment variable data slot `menu'). As the configuration file is read, the script parser calls this when a menu entry is to be created. */ grub_err_t grub_normal_add_menu_entry (int argc, const char **args, char **classes, const char *id, const char *users, const char *hotkey, const char *prefix, const char *sourcecode, int submenu) { int menu_hotkey = 0; char **menu_args = NULL; char *menu_users = NULL; char *menu_title = NULL; char *menu_sourcecode = NULL; char *menu_id = NULL; struct grub_menu_entry_class *menu_classes = NULL; grub_menu_t menu; grub_menu_entry_t *last; menu = grub_env_get_menu (); if (! menu) return grub_error (GRUB_ERR_MENU, "no menu context"); last = &menu->entry_list; menu_sourcecode = grub_xasprintf ("%s%s", prefix ?: "", sourcecode); if (! menu_sourcecode) return grub_errno; if (classes && classes[0]) { int i; for (i = 0; classes[i]; i++); /* count # of menuentry classes */ menu_classes = grub_zalloc (sizeof (struct grub_menu_entry_class) * (i + 1)); if (! menu_classes) goto fail; for (i = 0; classes[i]; i++) { menu_classes[i].name = grub_strdup (classes[i]); if (! menu_classes[i].name) goto fail; menu_classes[i].next = classes[i + 1] ? &menu_classes[i + 1] : NULL; } } if (users) { menu_users = grub_strdup (users); if (! menu_users) goto fail; } if (hotkey) { unsigned i; for (i = 0; i < ARRAY_SIZE (hotkey_aliases); i++) if (grub_strcmp (hotkey, hotkey_aliases[i].name) == 0) { menu_hotkey = hotkey_aliases[i].key; break; } if (i == ARRAY_SIZE (hotkey_aliases)) menu_hotkey = hotkey[0]; } if (! argc) { grub_error (GRUB_ERR_MENU, "menuentry is missing title"); goto fail; } menu_title = grub_strdup (args[0]); if (! menu_title) goto fail; menu_id = grub_strdup (id ? : menu_title); if (! menu_id) goto fail; /* Save argc, args to pass as parameters to block arg later. */ menu_args = grub_calloc (argc + 1, sizeof (char *)); if (! menu_args) goto fail; { int i; for (i = 0; i < argc; i++) { menu_args[i] = grub_strdup (args[i]); if (! menu_args[i]) goto fail; } menu_args[argc] = NULL; } /* Add the menu entry at the end of the list. */ while (*last) last = &(*last)->next; *last = grub_zalloc (sizeof (**last)); if (! *last) goto fail; (*last)->title = menu_title; (*last)->id = menu_id; (*last)->hotkey = menu_hotkey; (*last)->classes = menu_classes; if (menu_users) (*last)->restricted = 1; (*last)->users = menu_users; (*last)->argc = argc; (*last)->args = menu_args; (*last)->sourcecode = menu_sourcecode; (*last)->submenu = submenu; menu->size++; return GRUB_ERR_NONE; fail: grub_free (menu_sourcecode); { int i; for (i = 0; menu_classes && menu_classes[i].name; i++) grub_free (menu_classes[i].name); grub_free (menu_classes); } { int i; for (i = 0; menu_args && menu_args[i]; i++) grub_free (menu_args[i]); grub_free (menu_args); } grub_free (menu_users); grub_free (menu_title); grub_free (menu_id); return grub_errno; } static char * setparams_prefix (int argc, char **args) { int i; int j; char *p; char *result; grub_size_t len = 10; /* Count resulting string length */ for (i = 0; i < argc; i++) { len += 3; /* 3 = 1 space + 2 quotes */ p = args[i]; while (*p) len += (*p++ == '\'' ? 4 : 1); } result = grub_malloc (len + 2); if (! result) return 0; grub_strcpy (result, "setparams"); p = result + 9; for (j = 0; j < argc; j++) { *p++ = ' '; *p++ = '\''; p = grub_strchrsub (p, args[j], '\'', "'\\''"); *p++ = '\''; } *p++ = '\n'; *p = '\0'; return result; } static grub_err_t grub_cmd_menuentry (grub_extcmd_context_t ctxt, int argc, char **args) { char ch; char *src; char *prefix; unsigned len; grub_err_t r; const char *users; if (! argc) return grub_error (GRUB_ERR_BAD_ARGUMENT, "missing arguments"); if (ctxt->state[3].set && ctxt->script) return grub_error (GRUB_ERR_BAD_ARGUMENT, "multiple menuentry definitions"); if (! ctxt->state[3].set && ! ctxt->script) return grub_error (GRUB_ERR_BAD_ARGUMENT, "no menuentry definition"); if (ctxt->state[1].set) users = ctxt->state[1].arg; else if (ctxt->state[5].set) users = NULL; else users = ""; if (! ctxt->script) return grub_normal_add_menu_entry (argc, (const char **) args, (ctxt->state[0].set ? ctxt->state[0].args : NULL), ctxt->state[4].arg, users, ctxt->state[2].arg, 0, ctxt->state[3].arg, ctxt->extcmd->cmd->name[0] == 's'); src = args[argc - 1]; args[argc - 1] = NULL; len = grub_strlen(src); ch = src[len - 1]; src[len - 1] = '\0'; prefix = setparams_prefix (argc - 1, args); if (! prefix) return grub_errno; r = grub_normal_add_menu_entry (argc - 1, (const char **) args, ctxt->state[0].args, ctxt->state[4].arg, users, ctxt->state[2].arg, prefix, src + 1, ctxt->extcmd->cmd->name[0] == 's'); src[len - 1] = ch; args[argc - 1] = src; grub_free (prefix); return r; } static grub_extcmd_t cmd, cmd_sub; void grub_menu_init (void) { cmd = grub_register_extcmd ("menuentry", grub_cmd_menuentry, GRUB_COMMAND_FLAG_BLOCKS | GRUB_COMMAND_ACCEPT_DASH | GRUB_COMMAND_FLAG_EXTRACTOR, N_("BLOCK"), N_("Define a menu entry."), options); cmd_sub = grub_register_extcmd ("submenu", grub_cmd_menuentry, GRUB_COMMAND_FLAG_BLOCKS | GRUB_COMMAND_ACCEPT_DASH | GRUB_COMMAND_FLAG_EXTRACTOR, N_("BLOCK"), N_("Define a submenu."), options); } void grub_menu_fini (void) { grub_unregister_extcmd (cmd); grub_unregister_extcmd (cmd_sub); } grub-2.14~git20250718.0e36779/grub-core/commands/cacheinfo.c0000644000175000017500000000346315033157230017554 00000000000000/* cacheinfo.c - disk cache statistics */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2008,2010 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); static grub_err_t grub_rescue_cmd_info (struct grub_command *cmd __attribute__ ((unused)), int argc __attribute__ ((unused)), char *argv[] __attribute__ ((unused))) { unsigned long hits, misses; grub_disk_cache_get_performance (&hits, &misses); if (hits + misses) { unsigned long ratio = hits * 10000 / (hits + misses); grub_printf ("(%lu.%lu%%)\n", ratio / 100, ratio % 100); grub_printf_ (N_("Disk cache statistics: hits = %lu (%lu.%02lu%%)," " misses = %lu\n"), ratio / 100, ratio % 100, hits, misses); } else grub_printf ("%s\n", _("No disk cache statistics available\n")); return 0; } static grub_command_t cmd_cacheinfo; GRUB_MOD_INIT(cacheinfo) { cmd_cacheinfo = grub_register_command ("cacheinfo", grub_rescue_cmd_info, 0, N_("Get disk cache info.")); } GRUB_MOD_FINI(cacheinfo) { grub_unregister_command (cmd_cacheinfo); } grub-2.14~git20250718.0e36779/grub-core/commands/file.c0000644000175000017500000004402615036447510016562 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (C) 2013 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); static const struct grub_arg_option options[] = { {"is-i386-xen-pae-domu", 0, 0, N_("Check if FILE can be booted as i386 PAE Xen unprivileged guest kernel"), 0, 0}, {"is-x86_64-xen-domu", 0, 0, N_("Check if FILE can be booted as x86_64 Xen unprivileged guest kernel"), 0, 0}, {"is-x86-xen-dom0", 0, 0, N_("Check if FILE can be used as Xen x86 privileged guest kernel"), 0, 0}, {"is-x86-multiboot", 0, 0, N_("Check if FILE can be used as x86 multiboot kernel"), 0, 0}, {"is-x86-multiboot2", 0, 0, N_("Check if FILE can be used as x86 multiboot2 kernel"), 0, 0}, {"is-arm-linux", 0, 0, N_("Check if FILE is ARM Linux"), 0, 0}, {"is-arm64-linux", 0, 0, N_("Check if FILE is ARM64 Linux"), 0, 0}, {"is-ia64-linux", 0, 0, N_("Check if FILE is IA64 Linux"), 0, 0}, {"is-mips-linux", 0, 0, N_("Check if FILE is MIPS Linux"), 0, 0}, {"is-mipsel-linux", 0, 0, N_("Check if FILE is MIPSEL Linux"), 0, 0}, {"is-sparc64-linux", 0, 0, N_("Check if FILE is SPARC64 Linux"), 0, 0}, {"is-powerpc-linux", 0, 0, N_("Check if FILE is POWERPC Linux"), 0, 0}, {"is-x86-linux", 0, 0, N_("Check if FILE is x86 Linux"), 0, 0}, {"is-x86-linux32", 0, 0, N_("Check if FILE is x86 Linux supporting 32-bit protocol"), 0, 0}, {"is-x86-kfreebsd", 0, 0, N_("Check if FILE is x86 kFreeBSD"), 0, 0}, {"is-i386-kfreebsd", 0, 0, N_("Check if FILE is i386 kFreeBSD"), 0, 0}, {"is-x86_64-kfreebsd", 0, 0, N_("Check if FILE is x86_64 kFreeBSD"), 0, 0}, {"is-x86-knetbsd", 0, 0, N_("Check if FILE is x86 kNetBSD"), 0, 0}, {"is-i386-knetbsd", 0, 0, N_("Check if FILE is i386 kNetBSD"), 0, 0}, {"is-x86_64-knetbsd", 0, 0, N_("Check if FILE is x86_64 kNetBSD"), 0, 0}, {"is-i386-efi", 0, 0, N_("Check if FILE is i386 EFI file"), 0, 0}, {"is-x86_64-efi", 0, 0, N_("Check if FILE is x86_64 EFI file"), 0, 0}, {"is-ia64-efi", 0, 0, N_("Check if FILE is IA64 EFI file"), 0, 0}, {"is-arm64-efi", 0, 0, N_("Check if FILE is ARM64 EFI file"), 0, 0}, {"is-arm-efi", 0, 0, N_("Check if FILE is ARM EFI file"), 0, 0}, {"is-riscv32-efi", 0, 0, N_("Check if FILE is RISC-V 32bit EFI file"), 0, 0}, {"is-riscv64-efi", 0, 0, N_("Check if FILE is RISC-V 64bit EFI file"), 0, 0}, {"is-hibernated-hiberfil", 0, 0, N_("Check if FILE is hiberfil.sys in hibernated state"), 0, 0}, {"is-x86_64-xnu", 0, 0, N_("Check if FILE is x86_64 XNU (Mac OS X kernel)"), 0, 0}, {"is-i386-xnu", 0, 0, N_("Check if FILE is i386 XNU (Mac OS X kernel)"), 0, 0}, {"is-xnu-hibr", 0, 0, N_("Check if FILE is XNU (Mac OS X kernel) hibernated image"), 0, 0}, {"is-x86-bios-bootsector", 0, 0, N_("Check if FILE is BIOS bootsector"), 0, 0}, {0, 0, 0, 0, 0, 0} }; enum { IS_PAE_DOMU, IS_64_DOMU, IS_DOM0, IS_MULTIBOOT, IS_MULTIBOOT2, IS_ARM_LINUX, IS_ARM64_LINUX, IS_IA64_LINUX, IS_MIPS_LINUX, IS_MIPSEL_LINUX, IS_SPARC64_LINUX, IS_POWERPC_LINUX, IS_X86_LINUX, IS_X86_LINUX32, IS_X86_KFREEBSD, IS_X86_KFREEBSD32, IS_X86_KFREEBSD64, IS_X86_KNETBSD, IS_X86_KNETBSD32, IS_X86_KNETBSD64, IS_32_EFI, IS_64_EFI, IS_IA_EFI, IS_ARM64_EFI, IS_ARM_EFI, IS_RISCV32_EFI, IS_RISCV64_EFI, IS_HIBERNATED, IS_XNU64, IS_XNU32, IS_XNU_HIBR, IS_BIOS_BOOTSECTOR, OPT_TYPE_MIN = IS_PAE_DOMU, OPT_TYPE_MAX = IS_BIOS_BOOTSECTOR }; static grub_err_t grub_cmd_file (grub_extcmd_context_t ctxt, int argc, char **args) { grub_file_t file = 0; grub_elf_t elf = 0; grub_err_t err; int type = -1, i; int ret = 0; grub_macho_t macho = 0; if (argc == 0) return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected")); for (i = OPT_TYPE_MIN; i <= OPT_TYPE_MAX; i++) if (ctxt->state[i].set) { if (type == -1) { type = i; continue; } return grub_error (GRUB_ERR_BAD_ARGUMENT, "multiple types specified"); } if (type == -1) return grub_error (GRUB_ERR_BAD_ARGUMENT, "no type specified"); file = grub_file_open (args[0], GRUB_FILE_TYPE_XNU_KERNEL); if (!file) return grub_errno; switch (type) { case IS_BIOS_BOOTSECTOR: { grub_uint16_t sig; if (grub_file_size (file) != 512) break; if (grub_file_seek (file, 510) == (grub_size_t) -1) break; if (grub_file_read (file, &sig, 2) != 2) break; if (sig != grub_cpu_to_le16_compile_time (0xaa55)) break; ret = 1; break; } case IS_IA64_LINUX: { Elf64_Ehdr ehdr; if (grub_file_read (file, &ehdr, sizeof (ehdr)) != sizeof (ehdr)) break; if (ehdr.e_ident[EI_MAG0] != ELFMAG0 || ehdr.e_ident[EI_MAG1] != ELFMAG1 || ehdr.e_ident[EI_MAG2] != ELFMAG2 || ehdr.e_ident[EI_MAG3] != ELFMAG3 || ehdr.e_ident[EI_VERSION] != EV_CURRENT || ehdr.e_version != EV_CURRENT) break; if (ehdr.e_ident[EI_CLASS] != ELFCLASS64 || ehdr.e_ident[EI_DATA] != ELFDATA2LSB || ehdr.e_machine != grub_cpu_to_le16_compile_time (EM_IA_64)) break; ret = 1; break; } case IS_SPARC64_LINUX: { Elf64_Ehdr ehdr; if (grub_file_read (file, &ehdr, sizeof (ehdr)) != sizeof (ehdr)) break; if (ehdr.e_ident[EI_MAG0] != ELFMAG0 || ehdr.e_ident[EI_MAG1] != ELFMAG1 || ehdr.e_ident[EI_MAG2] != ELFMAG2 || ehdr.e_ident[EI_MAG3] != ELFMAG3 || ehdr.e_ident[EI_VERSION] != EV_CURRENT || ehdr.e_version != EV_CURRENT) break; if (ehdr.e_ident[EI_CLASS] != ELFCLASS64 || ehdr.e_ident[EI_DATA] != ELFDATA2MSB) break; if (ehdr.e_machine != grub_cpu_to_le16_compile_time (EM_SPARCV9) || ehdr.e_type != grub_cpu_to_be16_compile_time (ET_EXEC)) break; ret = 1; break; } case IS_POWERPC_LINUX: { Elf32_Ehdr ehdr; if (grub_file_read (file, &ehdr, sizeof (ehdr)) != sizeof (ehdr)) break; if (ehdr.e_ident[EI_MAG0] != ELFMAG0 || ehdr.e_ident[EI_MAG1] != ELFMAG1 || ehdr.e_ident[EI_MAG2] != ELFMAG2 || ehdr.e_ident[EI_MAG3] != ELFMAG3 || ehdr.e_ident[EI_VERSION] != EV_CURRENT || ehdr.e_version != EV_CURRENT) break; if (ehdr.e_ident[EI_DATA] != ELFDATA2MSB || (ehdr.e_machine != grub_cpu_to_le16_compile_time (EM_PPC) && ehdr.e_machine != grub_cpu_to_le16_compile_time (EM_PPC64))) break; if (ehdr.e_type != grub_cpu_to_be16_compile_time (ET_EXEC) && ehdr.e_type != grub_cpu_to_be16_compile_time (ET_DYN)) break; ret = 1; break; } case IS_MIPS_LINUX: { Elf32_Ehdr ehdr; if (grub_file_read (file, &ehdr, sizeof (ehdr)) != sizeof (ehdr)) break; if (ehdr.e_ident[EI_MAG0] != ELFMAG0 || ehdr.e_ident[EI_MAG1] != ELFMAG1 || ehdr.e_ident[EI_MAG2] != ELFMAG2 || ehdr.e_ident[EI_MAG3] != ELFMAG3 || ehdr.e_ident[EI_VERSION] != EV_CURRENT || ehdr.e_version != EV_CURRENT) break; if (ehdr.e_ident[EI_DATA] != ELFDATA2MSB || ehdr.e_machine != grub_cpu_to_be16_compile_time (EM_MIPS) || ehdr.e_type != grub_cpu_to_be16_compile_time (ET_EXEC)) break; ret = 1; break; } case IS_X86_KNETBSD: case IS_X86_KNETBSD32: case IS_X86_KNETBSD64: { int is32, is64; elf = grub_elf_file (file, file->name); if (elf == NULL) break; if (elf->ehdr.ehdr32.e_type != grub_cpu_to_le16_compile_time (ET_EXEC) || elf->ehdr.ehdr32.e_ident[EI_DATA] != ELFDATA2LSB) break; is32 = grub_elf_is_elf32 (elf); is64 = grub_elf_is_elf64 (elf); if (!is32 && !is64) break; if (!is32 && type == IS_X86_KNETBSD32) break; if (!is64 && type == IS_X86_KNETBSD64) break; if (is64) ret = grub_file_check_netbsd64 (elf); if (is32) ret = grub_file_check_netbsd32 (elf); break; } case IS_X86_KFREEBSD: case IS_X86_KFREEBSD32: case IS_X86_KFREEBSD64: { Elf32_Ehdr ehdr; int is32, is64; if (grub_file_read (file, &ehdr, sizeof (ehdr)) != sizeof (ehdr)) break; if (ehdr.e_ident[EI_MAG0] != ELFMAG0 || ehdr.e_ident[EI_MAG1] != ELFMAG1 || ehdr.e_ident[EI_MAG2] != ELFMAG2 || ehdr.e_ident[EI_MAG3] != ELFMAG3 || ehdr.e_ident[EI_VERSION] != EV_CURRENT || ehdr.e_version != EV_CURRENT) break; if (ehdr.e_type != grub_cpu_to_le16_compile_time (ET_EXEC) || ehdr.e_ident[EI_DATA] != ELFDATA2LSB) break; if (ehdr.e_ident[EI_OSABI] != ELFOSABI_FREEBSD) break; is32 = (ehdr.e_machine == grub_cpu_to_le16_compile_time (EM_386) && ehdr.e_ident[EI_CLASS] == ELFCLASS32); is64 = (ehdr.e_machine == grub_cpu_to_le16_compile_time (EM_X86_64) && ehdr.e_ident[EI_CLASS] == ELFCLASS64); if (!is32 && !is64) break; if (!is32 && (type == IS_X86_KFREEBSD32 || type == IS_X86_KNETBSD32)) break; if (!is64 && (type == IS_X86_KFREEBSD64 || type == IS_X86_KNETBSD64)) break; ret = 1; break; } case IS_MIPSEL_LINUX: { Elf32_Ehdr ehdr; if (grub_file_read (file, &ehdr, sizeof (ehdr)) != sizeof (ehdr)) break; if (ehdr.e_ident[EI_MAG0] != ELFMAG0 || ehdr.e_ident[EI_MAG1] != ELFMAG1 || ehdr.e_ident[EI_MAG2] != ELFMAG2 || ehdr.e_ident[EI_MAG3] != ELFMAG3 || ehdr.e_ident[EI_VERSION] != EV_CURRENT || ehdr.e_version != EV_CURRENT) break; if (ehdr.e_machine != grub_cpu_to_le16_compile_time (EM_MIPS) || ehdr.e_type != grub_cpu_to_le16_compile_time (ET_EXEC)) break; ret = 1; break; } case IS_ARM_LINUX: { struct linux_arch_kernel_header lh; if (grub_file_read (file, &lh, sizeof (lh)) != sizeof (lh)) break; /* Short forward branch in A32 state (for Raspberry pi kernels). */ if (lh.code0 == grub_cpu_to_le32_compile_time (0xea000006)) { ret = 1; break; } if (lh.magic == grub_cpu_to_le32_compile_time (GRUB_LINUX_ARM_MAGIC_SIGNATURE)) { ret = 1; break; } break; } case IS_ARM64_LINUX: { struct linux_arch_kernel_header lh; if (grub_file_read (file, &lh, sizeof (lh)) != sizeof (lh)) break; /* * The PE/COFF header can be anywhere in the file. Load it from the correct * offset if it is not where it is expected. */ if ((grub_uint8_t *) &lh + lh.hdr_offset != (grub_uint8_t *) &lh.pe_image_header) { if (grub_file_seek (file, lh.hdr_offset) == (grub_off_t) -1 || grub_file_read (file, &lh.pe_image_header, sizeof (struct grub_pe_image_header)) != sizeof (struct grub_pe_image_header)) return grub_error (GRUB_ERR_FILE_READ_ERROR, "failed to read COFF image header"); } if (lh.pe_image_header.coff_header.machine == grub_cpu_to_le16_compile_time (GRUB_PE32_MACHINE_ARM64)) { ret = 1; break; } break; } case IS_PAE_DOMU ... IS_DOM0: { struct grub_xen_file_info xen_inf; elf = grub_xen_file (file); if (!elf) break; err = grub_xen_get_info (elf, &xen_inf); if (err) break; /* Unfortuntely no way to check if kernel supports dom0. */ if (type == IS_DOM0) ret = 1; if (type == IS_PAE_DOMU) ret = (xen_inf.arch == GRUB_XEN_FILE_I386_PAE || xen_inf.arch == GRUB_XEN_FILE_I386_PAE_BIMODE); if (type == IS_64_DOMU) ret = (xen_inf.arch == GRUB_XEN_FILE_X86_64); break; } case IS_MULTIBOOT: case IS_MULTIBOOT2: { grub_uint32_t *buffer; grub_ssize_t len; grub_size_t search_size; grub_uint32_t *header; grub_uint32_t magic; grub_size_t step; if (type == IS_MULTIBOOT2) { search_size = 32768; magic = grub_cpu_to_le32_compile_time (0xe85250d6); step = 2; } else { search_size = 8192; magic = grub_cpu_to_le32_compile_time (0x1BADB002); step = 1; } buffer = grub_malloc (search_size); if (!buffer) break; len = grub_file_read (file, buffer, search_size); if (len < 32) { grub_free (buffer); break; } /* Look for the multiboot header in the buffer. The header should be at least 12 bytes and aligned on a 4-byte boundary. */ for (header = buffer; ((char *) header <= (char *) buffer + len - (type == IS_MULTIBOOT2 ? 16 : 12)); header += step) { if (header[0] == magic && !(grub_le_to_cpu32 (header[0]) + grub_le_to_cpu32 (header[1]) + grub_le_to_cpu32 (header[2]) + (type == IS_MULTIBOOT2 ? grub_le_to_cpu32 (header[3]) : 0))) { ret = 1; break; } } grub_free (buffer); break; } case IS_X86_LINUX32: case IS_X86_LINUX: { struct linux_i386_kernel_header lh; if (grub_file_read (file, &lh, sizeof (lh)) != sizeof (lh)) break; if (lh.boot_flag != grub_cpu_to_le16_compile_time (0xaa55)) break; if (lh.setup_sects > GRUB_LINUX_MAX_SETUP_SECTS) break; /* FIXME: some really old kernels (< 1.3.73) will fail this. */ if (lh.header != grub_cpu_to_le32_compile_time (GRUB_LINUX_I386_MAGIC_SIGNATURE) || grub_le_to_cpu16 (lh.version) < 0x0200) break; if (type == IS_X86_LINUX) { ret = 1; break; } /* FIXME: 2.03 is not always good enough (Linux 2.4 can be 2.03 and still not support 32-bit boot. */ if (lh.header != grub_cpu_to_le32_compile_time (GRUB_LINUX_I386_MAGIC_SIGNATURE) || grub_le_to_cpu16 (lh.version) < 0x0203) break; if (!(lh.loadflags & GRUB_LINUX_FLAG_BIG_KERNEL)) break; ret = 1; break; } case IS_HIBERNATED: { grub_uint8_t hibr_file_magic[4]; if (grub_file_read (file, &hibr_file_magic, sizeof (hibr_file_magic)) != sizeof (hibr_file_magic)) break; if (grub_memcmp ("hibr", hibr_file_magic, sizeof (hibr_file_magic)) == 0 || grub_memcmp ("HIBR", hibr_file_magic, sizeof (hibr_file_magic)) == 0) ret = 1; break; } case IS_XNU64: case IS_XNU32: { macho = grub_macho_open (args[0], GRUB_FILE_TYPE_XNU_KERNEL, (type == IS_XNU64)); if (!macho) break; /* FIXME: more checks? */ ret = 1; break; } case IS_XNU_HIBR: { struct grub_xnu_hibernate_header hibhead; if (grub_file_read (file, &hibhead, sizeof (hibhead)) != sizeof (hibhead)) break; if (hibhead.magic != grub_cpu_to_le32_compile_time (GRUB_XNU_HIBERNATE_MAGIC)) break; ret = 1; break; } case IS_32_EFI: case IS_64_EFI: case IS_IA_EFI: case IS_ARM64_EFI: case IS_ARM_EFI: case IS_RISCV32_EFI: case IS_RISCV64_EFI: { char signature[4]; grub_uint32_t pe_offset; struct grub_pe32_coff_header coff_head; if (grub_file_read (file, signature, 2) != 2) break; if (signature[0] != 'M' || signature[1] != 'Z') break; if ((grub_ssize_t) grub_file_seek (file, 0x3c) == -1) break; if (grub_file_read (file, &pe_offset, 4) != 4) break; if ((grub_ssize_t) grub_file_seek (file, grub_le_to_cpu32 (pe_offset)) == -1) break; if (grub_file_read (file, signature, 4) != 4) break; if (signature[0] != 'P' || signature[1] != 'E' || signature[2] != '\0' || signature[3] != '\0') break; if (grub_file_read (file, &coff_head, sizeof (coff_head)) != sizeof (coff_head)) break; if (type == IS_32_EFI && coff_head.machine != grub_cpu_to_le16_compile_time (GRUB_PE32_MACHINE_I386)) break; if (type == IS_64_EFI && coff_head.machine != grub_cpu_to_le16_compile_time (GRUB_PE32_MACHINE_X86_64)) break; if (type == IS_IA_EFI && coff_head.machine != grub_cpu_to_le16_compile_time (GRUB_PE32_MACHINE_IA64)) break; if (type == IS_ARM64_EFI && coff_head.machine != grub_cpu_to_le16_compile_time (GRUB_PE32_MACHINE_ARM64)) break; if (type == IS_ARM_EFI && coff_head.machine != grub_cpu_to_le16_compile_time (GRUB_PE32_MACHINE_ARMTHUMB_MIXED)) break; if ((type == IS_RISCV32_EFI || type == IS_RISCV64_EFI) && coff_head.machine != grub_cpu_to_le16_compile_time (GRUB_PE32_MACHINE_RISCV64)) /* TODO: Determine bitness dynamically */ break; if (type == IS_IA_EFI || type == IS_64_EFI || type == IS_ARM64_EFI || type == IS_RISCV32_EFI || type == IS_RISCV64_EFI) { struct grub_pe64_optional_header o64; if (grub_file_read (file, &o64, sizeof (o64)) != sizeof (o64)) break; if (o64.magic != grub_cpu_to_le16_compile_time (GRUB_PE32_PE64_MAGIC)) break; if (o64.subsystem != grub_cpu_to_le16_compile_time (GRUB_PE32_SUBSYSTEM_EFI_APPLICATION)) break; ret = 1; break; } if (type == IS_32_EFI || type == IS_ARM_EFI) { struct grub_pe32_optional_header o32; if (grub_file_read (file, &o32, sizeof (o32)) != sizeof (o32)) break; if (o32.magic != grub_cpu_to_le16_compile_time (GRUB_PE32_PE32_MAGIC)) break; if (o32.subsystem != grub_cpu_to_le16_compile_time (GRUB_PE32_SUBSYSTEM_EFI_APPLICATION)) break; ret = 1; break; } break; } } if (elf) grub_elf_close (elf); else if (macho) grub_macho_close (macho); else if (file) grub_file_close (file); if (!ret && (grub_errno == GRUB_ERR_BAD_OS || grub_errno == GRUB_ERR_NONE)) /* TRANSLATORS: it's a standalone boolean value, opposite of "true". */ grub_error (GRUB_ERR_TEST_FAILURE, N_("false")); return grub_errno; } static grub_extcmd_t cmd; GRUB_MOD_INIT(file) { cmd = grub_register_extcmd ("file", grub_cmd_file, 0, N_("OPTIONS FILE"), N_("Check if FILE is of specified type."), options); } GRUB_MOD_FINI(file) { grub_unregister_extcmd (cmd); } grub-2.14~git20250718.0e36779/grub-core/commands/boot.c0000644000175000017500000001311415033157230016572 00000000000000/* boot.c - command to boot an operating system */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2002,2003,2004,2005,2007,2009 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); static grub_err_t (*grub_loader_boot_func) (void *context); static grub_err_t (*grub_loader_unload_func) (void *context); static void *grub_loader_context; static int grub_loader_flags; struct grub_simple_loader_hooks { grub_err_t (*boot) (void); grub_err_t (*unload) (void); }; /* Don't heap allocate this to avoid making grub_loader_set() fallible. */ static struct grub_simple_loader_hooks simple_loader_hooks; struct grub_preboot { grub_err_t (*preboot_func) (int); grub_err_t (*preboot_rest_func) (void); grub_loader_preboot_hook_prio_t prio; struct grub_preboot *next; struct grub_preboot *prev; }; static int grub_loader_loaded; static struct grub_preboot *preboots_head = 0, *preboots_tail = 0; static grub_err_t grub_simple_boot_hook (void *context) { struct grub_simple_loader_hooks *hooks; hooks = (struct grub_simple_loader_hooks *) context; return hooks->boot (); } static grub_err_t grub_simple_unload_hook (void *context) { struct grub_simple_loader_hooks *hooks; grub_err_t ret; hooks = (struct grub_simple_loader_hooks *) context; ret = hooks->unload (); grub_memset (hooks, 0, sizeof (*hooks)); return ret; } int grub_loader_is_loaded (void) { return grub_loader_loaded; } /* Register a preboot hook. */ struct grub_preboot * grub_loader_register_preboot_hook (grub_err_t (*preboot_func) (int flags), grub_err_t (*preboot_rest_func) (void), grub_loader_preboot_hook_prio_t prio) { struct grub_preboot *cur, *new_preboot; if (! preboot_func && ! preboot_rest_func) return 0; new_preboot = (struct grub_preboot *) grub_malloc (sizeof (struct grub_preboot)); if (! new_preboot) return 0; new_preboot->preboot_func = preboot_func; new_preboot->preboot_rest_func = preboot_rest_func; new_preboot->prio = prio; for (cur = preboots_head; cur && cur->prio > prio; cur = cur->next); if (cur) { new_preboot->next = cur; new_preboot->prev = cur->prev; cur->prev = new_preboot; } else { new_preboot->next = 0; new_preboot->prev = preboots_tail; preboots_tail = new_preboot; } if (new_preboot->prev) new_preboot->prev->next = new_preboot; else preboots_head = new_preboot; return new_preboot; } void grub_loader_unregister_preboot_hook (struct grub_preboot *hnd) { struct grub_preboot *preb = hnd; if (preb->next) preb->next->prev = preb->prev; else preboots_tail = preb->prev; if (preb->prev) preb->prev->next = preb->next; else preboots_head = preb->next; grub_free (preb); } void grub_loader_set_ex (grub_err_t (*boot) (void *context), grub_err_t (*unload) (void *context), void *context, int flags) { if (grub_loader_loaded && grub_loader_unload_func) grub_loader_unload_func (grub_loader_context); grub_loader_boot_func = boot; grub_loader_unload_func = unload; grub_loader_context = context; grub_loader_flags = flags; grub_loader_loaded = 1; } void grub_loader_set (grub_err_t (*boot) (void), grub_err_t (*unload) (void), int flags) { grub_loader_set_ex (grub_simple_boot_hook, grub_simple_unload_hook, &simple_loader_hooks, flags); simple_loader_hooks.boot = boot; simple_loader_hooks.unload = unload; } void grub_loader_unset(void) { if (grub_loader_loaded && grub_loader_unload_func) grub_loader_unload_func (grub_loader_context); grub_loader_boot_func = 0; grub_loader_unload_func = 0; grub_loader_context = 0; grub_loader_loaded = 0; } grub_err_t grub_loader_boot (void) { grub_err_t err = GRUB_ERR_NONE; struct grub_preboot *cur; if (! grub_loader_loaded) return grub_error (GRUB_ERR_NO_KERNEL, N_("you need to load the kernel first")); grub_machine_fini (grub_loader_flags); for (cur = preboots_head; cur; cur = cur->next) { err = cur->preboot_func (grub_loader_flags); if (err) { for (cur = cur->prev; cur; cur = cur->prev) cur->preboot_rest_func (); return err; } } err = (grub_loader_boot_func) (grub_loader_context); for (cur = preboots_tail; cur; cur = cur->prev) if (! err) err = cur->preboot_rest_func (); else cur->preboot_rest_func (); return err; } /* boot */ static grub_err_t grub_cmd_boot (struct grub_command *cmd __attribute__ ((unused)), int argc __attribute__ ((unused)), char *argv[] __attribute__ ((unused))) { return grub_loader_boot (); } static grub_command_t cmd_boot; GRUB_MOD_INIT(boot) { cmd_boot = grub_register_command ("boot", grub_cmd_boot, 0, N_("Boot an operating system.")); } GRUB_MOD_FINI(boot) { grub_unregister_command (cmd_boot); } grub-2.14~git20250718.0e36779/grub-core/gensyminfo.sh.in0000644000175000017500000000240615002425525017004 00000000000000#! @BUILD_SHEBANG@ set -e # Copyright (C) 2010 Free Software Foundation, Inc. # # This gensymlist.sh is free software; the author # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. # # Example: # # gensyms.sh normal.module # module=$1 modname=`echo $module | sed -e 's@\.module.*$@@'` # Print all symbols defined by module if test x"@TARGET_NMFLAGS_DEFINED_ONLY@" = x && test x"@TARGET_NMFLAGS_MINUS_P@" = x; then @TARGET_NM@ -g -p $module | \ sed -n "s@^\([0-9a-fA-F]*\) *[TBRDS] *\([^ ]*\).*@defined $modname \2@p" elif test x"@TARGET_NMFLAGS_DEFINED_ONLY@" = x; then @TARGET_NM@ -g @TARGET_NMFLAGS_MINUS_P@ -p $module | \ sed -n "s@^\([^ ]*\) *[TBRDS] *\([0-9a-fA-F]*\).*@defined $modname \1@p" else @TARGET_NM@ -g --defined-only @TARGET_NMFLAGS_MINUS_P@ -p $module | \ sed "s@^\([^ ]*\).*@defined $modname \1@g" fi # Print all undefined symbols used by module @TARGET_NM@ -u @TARGET_NMFLAGS_MINUS_P@ -p $module | sed "s@^\([^ ]*\).*@undefined $modname \1@g" grub-2.14~git20250718.0e36779/grub-core/lib/0000755000175000017500000000000015036452576014526 500000000000000grub-2.14~git20250718.0e36779/grub-core/lib/gnulib-patches/0000755000175000017500000000000015036452573017430 500000000000000grub-2.14~git20250718.0e36779/grub-core/lib/gnulib-patches/fix-width.patch0000644000175000017500000001515315033157230022266 00000000000000diff --git a/lib/argp-fmtstream.c b/lib/argp-fmtstream.c index ba6a407f7..d0685b3d4 100644 --- a/lib/argp-fmtstream.c +++ b/lib/argp-fmtstream.c @@ -28,9 +28,11 @@ #include #include #include +#include #include "argp-fmtstream.h" #include "argp-namefrob.h" +#include "mbswidth.h" #ifndef ARGP_FMTSTREAM_USE_LINEWRAP @@ -115,6 +117,51 @@ weak_alias (__argp_fmtstream_free, argp_fmtstream_free) #endif #endif + +/* Return the pointer to the first character that doesn't fit in l columns. */ +static inline const ptrdiff_t +add_width (const char *ptr, const char *end, size_t l) +{ + mbstate_t ps; + const char *ptr0 = ptr; + + memset (&ps, 0, sizeof (ps)); + + while (ptr < end) + { + wchar_t wc; + size_t s, k; + + s = mbrtowc (&wc, ptr, end - ptr, &ps); + if (s == (size_t) -1) + break; + if (s == (size_t) -2) + { + if (1 >= l) + break; + l--; + ptr++; + continue; + } + + if (wc == '\e' && ptr + 3 < end + && ptr[1] == '[' && (ptr[2] == '0' || ptr[2] == '1') + && ptr[3] == 'm') + { + ptr += 4; + continue; + } + + k = wcwidth (wc); + + if (k >= l) + break; + l -= k; + ptr += s; + } + return ptr - ptr0; +} + /* Process FS's buffer so that line wrapping is done from POINT_OFFS to the end of its buffer. This code is mostly from glibc stdio/linewrap.c. */ void @@ -168,13 +215,15 @@ __argp_fmtstream_update (argp_fmtstream_t fs) if (!nl) { /* The buffer ends in a partial line. */ + size_t display_width = mbsnwidth (buf, fs->p - buf, + MBSW_STOP_AT_NUL); - if (fs->point_col + len < fs->rmargin) + if (fs->point_col + display_width < fs->rmargin) { /* The remaining buffer text is a partial line and fits within the maximum line width. Advance point for the characters to be written and stop scanning. */ - fs->point_col += len; + fs->point_col += display_width; break; } else @@ -182,14 +231,18 @@ __argp_fmtstream_update (argp_fmtstream_t fs) the end of the buffer. */ nl = fs->p; } - else if (fs->point_col + (nl - buf) < (ssize_t) fs->rmargin) - { - /* The buffer contains a full line that fits within the maximum - line width. Reset point and scan the next line. */ - fs->point_col = 0; - buf = nl + 1; - continue; - } + else + { + size_t display_width = mbsnwidth (buf, nl - buf, MBSW_STOP_AT_NUL); + if (display_width < (ssize_t) fs->rmargin) + { + /* The buffer contains a full line that fits within the maximum + line width. Reset point and scan the next line. */ + fs->point_col = 0; + buf = nl + 1; + continue; + } + } /* This line is too long. */ r = fs->rmargin - 1; @@ -225,7 +278,7 @@ __argp_fmtstream_update (argp_fmtstream_t fs) char *p, *nextline; int i; - p = buf + (r + 1 - fs->point_col); + p = buf + add_width (buf, fs->p, (r + 1 - fs->point_col)); while (p >= buf && !isblank ((unsigned char) *p)) --p; nextline = p + 1; /* This will begin the next line. */ @@ -243,7 +296,7 @@ __argp_fmtstream_update (argp_fmtstream_t fs) { /* A single word that is greater than the maximum line width. Oh well. Put it on an overlong line by itself. */ - p = buf + (r + 1 - fs->point_col); + p = buf + add_width (buf, fs->p, (r + 1 - fs->point_col)); /* Find the end of the long word. */ if (p < nl) do @@ -277,7 +330,8 @@ __argp_fmtstream_update (argp_fmtstream_t fs) && fs->p > nextline) { /* The margin needs more blanks than we removed. */ - if (fs->end - fs->p > fs->wmargin + 1) + if (mbsnwidth (fs->p, fs->end - fs->p, MBSW_STOP_AT_NUL) + > fs->wmargin + 1) /* Make some space for them. */ { size_t mv = fs->p - nextline; diff --git a/lib/argp-help.c b/lib/argp-help.c index e5375a0f0..5d8f451ec 100644 --- a/lib/argp-help.c +++ b/lib/argp-help.c @@ -52,6 +52,7 @@ #include "argp.h" #include "argp-fmtstream.h" #include "argp-namefrob.h" +#include "mbswidth.h" #ifndef SIZE_MAX # define SIZE_MAX ((size_t) -1) @@ -1547,7 +1548,7 @@ argp_args_usage (const struct argp *argp, const struct argp_state *state, /* Manually do line wrapping so that it (probably) won't get wrapped at any embedded spaces. */ - space (stream, 1 + nl - cp); + space (stream, 1 + mbsnwidth (cp, nl - cp, MBSW_STOP_AT_NUL)); __argp_fmtstream_write (stream, cp, nl - cp); } diff --git a/lib/mbswidth.c b/lib/mbswidth.c index 408a15e34..b3fb7f83a 100644 --- a/lib/mbswidth.c +++ b/lib/mbswidth.c @@ -38,6 +38,14 @@ /* Get INT_MAX. */ #include +#ifndef FALLTHROUGH +# if __GNUC__ < 7 +# define FALLTHROUGH ((void) 0) +# else +# define FALLTHROUGH __attribute__ ((__fallthrough__)) +# endif +#endif + /* Returns the number of columns needed to represent the multibyte character string pointed to by STRING. If a non-printable character occurs, and MBSW_REJECT_UNPRINTABLE is specified, -1 is returned. @@ -90,6 +98,10 @@ mbsnwidth (const char *string, size_t nbytes, int flags) p++; width++; break; + case '\0': + if (flags & MBSW_STOP_AT_NUL) + return width; + FALLTHROUGH; default: /* If we have a multibyte sequence, scan it up to its end. */ { @@ -168,6 +180,9 @@ mbsnwidth (const char *string, size_t nbytes, int flags) { unsigned char c = (unsigned char) *p++; + if (c == 0 && (flags & MBSW_STOP_AT_NUL)) + return width; + if (isprint (c)) { if (width == INT_MAX) diff --git a/lib/mbswidth.h b/lib/mbswidth.h index 2b5c53c37..45a123e63 100644 --- a/lib/mbswidth.h +++ b/lib/mbswidth.h @@ -40,6 +40,10 @@ extern "C" { control characters and 1 otherwise. */ #define MBSW_REJECT_UNPRINTABLE 2 +/* If this bit is set \0 is treated as the end of string. + Otherwise it's treated as a normal one column width character. */ +#define MBSW_STOP_AT_NUL 4 + /* Returns the number of screen columns needed for STRING. */ #define mbswidth gnu_mbswidth /* avoid clash with UnixWare 7.1.1 function */ grub-2.14~git20250718.0e36779/grub-core/lib/gnulib-patches/fix-unused-value.patch0000644000175000017500000000067115036447510023571 00000000000000--- a/lib/regexec.c 2020-10-21 14:25:35.310195912 +0000 +++ b/lib/regexec.c 2020-10-21 14:32:07.961765604 +0000 @@ -828,7 +828,11 @@ break; if (__glibc_unlikely (err != REG_NOMATCH)) goto free_return; +#ifdef DEBUG + /* Only used for assertion below when DEBUG is set, otherwise + it will be over-written when we loop around. */ match_last = -1; +#endif } else break; /* We found a match. */ grub-2.14~git20250718.0e36779/grub-core/lib/gnulib-patches/fix-regexec-resource-leak.patch0000644000175000017500000000075515036447510025340 00000000000000--- a/lib/regexec.c +++ b/lib/regexec.c @@ -2270,7 +2270,7 @@ merge_state_with_log (reg_errcode_t *err, re_match_context_t *mctx, these destinations and the results of the transition table. */ pstate = mctx->state_log[cur_idx]; log_nodes = pstate->entrance_nodes; - if (next_state != NULL) + if (next_state != NULL && next_state->entrance_nodes != NULL) { table_nodes = next_state->entrance_nodes; *err = re_node_set_init_union (&next_nodes, table_nodes, grub-2.14~git20250718.0e36779/grub-core/lib/gnulib-patches/fix-regcomp-resource-leak.patch0000644000175000017500000000666315036447510025356 00000000000000--- a/lib/regcomp.c +++ b/lib/regcomp.c @@ -1001,21 +1001,25 @@ create_initial_state (re_dfa_t *dfa) Idx dest_idx = dfa->edests[node_idx].elems[0]; if (!re_node_set_contains (&init_nodes, dest_idx)) { - reg_errcode_t merge_err + err = re_node_set_merge (&init_nodes, dfa->eclosures + dest_idx); - if (merge_err != REG_NOERROR) - return merge_err; + if (err != REG_NOERROR) + break; i = 0; } } } /* It must be the first time to invoke acquire_state. */ - dfa->init_state = re_acquire_state_context (&err, dfa, &init_nodes, 0); - /* We don't check ERR here, since the initial state must not be NULL. */ + dfa->init_state + = (err == REG_NOERROR + ? re_acquire_state_context (&err, dfa, &init_nodes, 0) + : NULL); if (__glibc_unlikely (dfa->init_state == NULL)) - return err; - if (dfa->init_state->has_constraint) + { + /* Don't check ERR here, as the initial state must not be null. */ + } + else if (dfa->init_state->has_constraint) { dfa->init_state_word = re_acquire_state_context (&err, dfa, &init_nodes, CONTEXT_WORD); @@ -1025,17 +1029,13 @@ create_initial_state (re_dfa_t *dfa) &init_nodes, CONTEXT_NEWLINE | CONTEXT_BEGBUF); - if (__glibc_unlikely (dfa->init_state_word == NULL - || dfa->init_state_nl == NULL - || dfa->init_state_begbuf == NULL)) - return err; } else dfa->init_state_word = dfa->init_state_nl = dfa->init_state_begbuf = dfa->init_state; re_node_set_free (&init_nodes); - return REG_NOERROR; + return err; } /* If it is possible to do searching in single byte encoding instead of UTF-8 @@ -1677,12 +1677,11 @@ calc_eclosure_iter (re_node_set *new_set, re_dfa_t *dfa, Idx node, bool root) { err = duplicate_node_closure (dfa, node, node, node, dfa->nodes[node].constraint); - if (__glibc_unlikely (err != REG_NOERROR)) - return err; } /* Expand each epsilon destination nodes. */ - if (IS_EPSILON_NODE(dfa->nodes[node].type)) + if (__glibc_likely (err == REG_NOERROR) + && IS_EPSILON_NODE (dfa->nodes[node].type)) for (i = 0; i < dfa->edests[node].nelem; ++i) { re_node_set eclosure_elem; @@ -1700,14 +1699,14 @@ calc_eclosure_iter (re_node_set *new_set, re_dfa_t *dfa, Idx node, bool root) { err = calc_eclosure_iter (&eclosure_elem, dfa, edest, false); if (__glibc_unlikely (err != REG_NOERROR)) - return err; + break; } else eclosure_elem = dfa->eclosures[edest]; /* Merge the epsilon closure of 'edest'. */ err = re_node_set_merge (&eclosure, &eclosure_elem); if (__glibc_unlikely (err != REG_NOERROR)) - return err; + break; /* If the epsilon closure of 'edest' is incomplete, the epsilon closure of this node is also incomplete. */ if (dfa->eclosures[edest].nelem == 0) @@ -1717,12 +1716,18 @@ calc_eclosure_iter (re_node_set *new_set, re_dfa_t *dfa, Idx node, bool root) } } - if (incomplete && !root) - dfa->eclosures[node].nelem = 0; + if (err != REG_NOERROR) + re_node_set_free (&eclosure); else - dfa->eclosures[node] = eclosure; - *new_set = eclosure; - return REG_NOERROR; + { + if (incomplete && !root) + dfa->eclosures[node].nelem = 0; + else + dfa->eclosures[node] = eclosure; + *new_set = eclosure; + } + + return err; } /* Functions for token which are used in the parser. */ grub-2.14~git20250718.0e36779/grub-core/lib/gnulib-patches/fix-gcc-15-compile.patch0000644000175000017500000000045115036447510023555 00000000000000--- a/lib/base64.c +++ b/lib/base64.c @@ -61,7 +61,7 @@ return ch; } -static const char b64c[64] = +static const char b64c[64] _GL_ATTRIBUTE_NONSTRING = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; /* Base64 encode IN array of size INLEN into OUT array. OUT needs grub-2.14~git20250718.0e36779/grub-core/lib/i386/0000755000175000017500000000000015036452576015217 500000000000000grub-2.14~git20250718.0e36779/grub-core/lib/i386/relocator_asm.S0000644000175000017500000000333015000202015020060 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (C) 2009 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include .p2align 2 VARIABLE(grub_relocator_backward_start) /* mov imm32, %eax */ .byte 0xb8 VARIABLE(grub_relocator_backward_dest) .long 0 movl %eax, %edi /* mov imm32, %eax */ .byte 0xb8 VARIABLE(grub_relocator_backward_src) .long 0 movl %eax, %esi /* mov imm32, %ecx */ .byte 0xb9 VARIABLE(grub_relocator_backward_chunk_size) .long 0 add %ecx, %esi add %ecx, %edi /* Backward movsb is implicitly off-by-one. compensate that. */ sub $1, %esi sub $1, %edi /* Backward copy. */ std rep movsb VARIABLE(grub_relocator_backward_end) VARIABLE(grub_relocator_forward_start) /* mov imm32, %eax */ .byte 0xb8 VARIABLE(grub_relocator_forward_dest) .long 0 movl %eax, %edi /* mov imm32, %rax */ .byte 0xb8 VARIABLE(grub_relocator_forward_src) .long 0 movl %eax, %esi /* mov imm32, %ecx */ .byte 0xb9 VARIABLE(grub_relocator_forward_chunk_size) .long 0 /* Forward copy. */ cld rep movsb VARIABLE(grub_relocator_forward_end) grub-2.14~git20250718.0e36779/grub-core/lib/i386/setjmp.S0000644000175000017500000000257415000202015016541 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (C) 2003,2007 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include .file "setjmp.S" GRUB_MOD_LICENSE "GPLv3+" .text /* * int grub_setjmp (grub_jmp_buf env) */ FUNCTION(grub_setjmp) movl %ebx, 0(%eax) /* EBX */ movl %esi, 4(%eax) /* ESI */ movl %edi, 8(%eax) /* EDI */ movl %ebp, 12(%eax) /* EBP */ popl %ecx movl %esp, 16(%eax) /* ESP */ movl %ecx, 20(%eax) /* EIP */ xorl %eax, %eax jmp *%ecx /* * int grub_longjmp (grub_jmp_buf env, int val) */ FUNCTION(grub_longjmp) movl 0(%eax), %ebx movl 4(%eax), %esi movl 8(%eax), %edi movl 12(%eax), %ebp movl 16(%eax), %esp movl 20(%eax), %ecx movl %edx, %eax testl %eax, %eax jnz 1f incl %eax 1: jmp *%ecx grub-2.14~git20250718.0e36779/grub-core/lib/i386/relocator16.S0000644000175000017500000001670215002425525017415 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (C) 2009,2010 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ /* The code segment of the protected mode. */ #define CODE_SEGMENT 0x08 /* The data segment of the protected mode. */ #define DATA_SEGMENT 0x10 #define PSEUDO_REAL_CSEG 0x18 #define PSEUDO_REAL_DSEG 0x20 #include #include "relocator_common.S" .p2align 4 /* force 16-byte alignment */ VARIABLE(grub_relocator16_start) PREAMBLE #ifdef __APPLE__ LOCAL(cs_base_bytes12_offset) = LOCAL (cs_base_bytes12) - LOCAL (base) LOCAL(cs_base_byte3_offset) = LOCAL (cs_base_byte3) - LOCAL (base) LOCAL(ds_base_bytes12_offset) = LOCAL (ds_base_bytes12) - LOCAL (base) LOCAL(ds_base_byte3_offset) = LOCAL (ds_base_byte3) - LOCAL (base) movl %esi, %eax movw %ax, (LOCAL(cs_base_bytes12_offset)) (RSI, 1) movw %ax, (LOCAL(ds_base_bytes12_offset)) (RSI, 1) shrl $16, %eax movb %al, (LOCAL (cs_base_byte3_offset)) (RSI, 1) movb %al, (LOCAL (ds_base_byte3_offset)) (RSI, 1) #else movl %esi, %eax movw %ax, (LOCAL (cs_base_bytes12) - LOCAL (base)) (RSI, 1) movw %ax, (LOCAL (ds_base_bytes12) - LOCAL (base)) (RSI, 1) shrl $16, %eax movb %al, (LOCAL (cs_base_byte3) - LOCAL (base)) (RSI, 1) movb %al, (LOCAL (ds_base_byte3) - LOCAL (base)) (RSI, 1) #endif RELOAD_GDT .code32 /* Update other registers. */ movl $DATA_SEGMENT, %eax movl %eax, %ds movl %eax, %es movl %eax, %fs movl %eax, %gs movl %eax, %ss DISABLE_PAGING #ifdef __x86_64__ /* Disable amd64. */ movl $GRUB_MEMORY_CPU_AMD64_MSR, %ecx rdmsr andl $(~GRUB_MEMORY_CPU_AMD64_MSR_ON), %eax wrmsr #endif /* Turn off PAE. */ movl %cr4, %eax andl $(~GRUB_MEMORY_CPU_CR4_PAE_ON), %eax movl %eax, %cr4 /* Update other registers. */ movl $PSEUDO_REAL_DSEG, %eax movl %eax, %ds movl %eax, %es movl %eax, %fs movl %eax, %gs movl %eax, %ss movl %esi, %eax shrl $4, %eax #ifdef __APPLE__ LOCAL(segment_offset) = LOCAL (segment) - LOCAL (base) LOCAL(idt_offset) = LOCAL(relocator16_idt) - LOCAL (base) LOCAL(cont2_offset) = LOCAL (cont2) - LOCAL(base) movw %ax, (LOCAL(segment_offset)) lidt (LOCAL(idt_offset)) /* jump to a 16 bit segment */ ljmp $PSEUDO_REAL_CSEG, $(LOCAL(cont2_offset)) #else movw %ax, (LOCAL (segment) - LOCAL (base)) lidt (EXT_C(grub_relocator16_idt) - LOCAL (base)) /* jump to a 16 bit segment */ ljmp $PSEUDO_REAL_CSEG, $(LOCAL (cont2) - LOCAL(base)) #endif LOCAL(cont2): .code16 /* clear the PE bit of CR0 */ movl %cr0, %eax andl $(~GRUB_MEMORY_CPU_CR0_PE_ON), %eax movl %eax, %cr0 /* flush prefetch queue, reload %cs */ /* ljmp */ .byte 0xea #ifdef __APPLE__ LOCAL(cont3_offset) = LOCAL(cont3) - LOCAL(base) .word LOCAL(cont3_offset) #else .word LOCAL(cont3)-LOCAL(base) #endif LOCAL(segment): .word 0 LOCAL(cont3): /* movw imm16, %ax. */ .byte 0xb8 VARIABLE(grub_relocator16_keep_a20_enabled) .word 0 test %ax, %ax jnz LOCAL(gate_a20_done) movw %cs, %ax movw %ax, %ss #ifdef __APPLE__ LOCAL(relocator16_end_offset) = LOCAL(relocator16_end) - LOCAL(base) leaw LOCAL(relocator16_end_offset), %sp #else leaw LOCAL(relocator16_end) - LOCAL(base), %sp #endif addw $GRUB_RELOCATOR16_STACK_SIZE, %sp /* second, try a BIOS call */ movw $0x2400, %ax int $0x15 call LOCAL(gate_a20_check_state) testb %al, %al jz LOCAL(gate_a20_done) /* * In macbook, the keyboard test would hang the machine, so we move * this forward. */ /* fourth, try the system control port A */ inb $0x92 andb $(~0x03), %al outb $0x92 /* When turning off Gate A20, do not check the state strictly, because a failure is not fatal usually, and Gate A20 is always on some modern machines. */ jmp LOCAL(gate_a20_done) LOCAL(gate_a20_check_state): /* iterate the checking for a while */ movw $100, %cx 1: xorw %ax, %ax movw %ax, %ds decw %ax movw %ax, %es xorw %ax, %ax movw $0x8000, %ax /* compare the byte at ADDR with that at 0x100000 + ADDR */ movw %ax, %si addw $0x10, %ax movw %ax, %di /* save the original byte in DL */ movb %ds:(%si), %dl movb %es:(%di), %al /* try to set one less value at ADDR */ movb %al, %dh decb %dh movb %dh, %ds:(%si) /* serialize */ outb %al, $0x80 outb %al, $0x80 /* obtain the value at 0x100000 + ADDR in CH */ movb %es:(%di), %dh /* this result is 1 if A20 is on or 0 if it is off */ subb %dh, %al xorb $1, %al /* restore the original */ movb %dl, %ds:(%si) testb %al, %al jz LOCAL(gate_a20_done) loop 1b 2: ret LOCAL(gate_a20_done): /* * We are in real mode now. Set up the real mode segment registers and * all the other general purpose registers. cs is updated with ljmp. */ /* movw imm16, %ax. */ .byte 0xb8 VARIABLE(grub_relocator16_ds) .word 0 movw %ax, %ds /* movw imm16, %ax. */ .byte 0xb8 VARIABLE(grub_relocator16_es) .word 0 movw %ax, %es /* movw imm16, %ax. */ .byte 0xb8 VARIABLE(grub_relocator16_fs) .word 0 movw %ax, %fs /* movw imm16, %ax. */ .byte 0xb8 VARIABLE(grub_relocator16_gs) .word 0 movw %ax, %gs /* movw imm16, %ax. */ .byte 0xb8 VARIABLE(grub_relocator16_ss) .word 0 movw %ax, %ss /* movw imm16, %ax. */ .byte 0xb8 VARIABLE(grub_relocator16_sp) .word 0 movzwl %ax, %esp /* movw imm32, %eax. */ .byte 0x66, 0xb8 VARIABLE(grub_relocator16_esi) .long 0 movl %eax, %esi /* movw imm32, %edx. */ .byte 0x66, 0xba VARIABLE(grub_relocator16_edx) .long 0 /* movw imm32, %ebx. */ .byte 0x66, 0xbb VARIABLE(grub_relocator16_ebx) .long 0 /* movl imm32, %ebp. */ .byte 0x66, 0xbd VARIABLE(grub_relocator16_ebp) .long 0 /* Cleared direction flag is of no problem with any current payload and makes this implementation easier. */ cld /* ljmp */ .byte 0xea VARIABLE(grub_relocator16_ip) .word 0 VARIABLE(grub_relocator16_cs) .word 0 .code32 /* GDT. Copied from loader/i386/linux.c. */ .p2align 4 LOCAL(gdt): .word 0, 0 .byte 0, 0, 0, 0 /* -- code segment -- * base = 0x00000000, limit = 0xFFFFF (4 KiB Granularity), present * type = 32bit code execute/read, DPL = 0 */ .word 0xFFFF, 0 .byte 0, 0x9A, 0xCF, 0 /* -- data segment -- * base = 0x00000000, limit 0xFFFFF (4 KiB Granularity), present * type = 32 bit data read/write, DPL = 0 */ .word 0xFFFF, 0 .byte 0, 0x92, 0xCF, 0 /* -- 16 bit real mode CS -- * base = filled by code, limit 0x0FFFF (1 B Granularity), present * type = 16 bit code execute/read only/conforming, DPL = 0 */ .word 0xFFFF LOCAL(cs_base_bytes12): .word 0 LOCAL(cs_base_byte3): .byte 0 .byte 0x9E, 0, 0 /* -- 16 bit real mode DS -- * base = filled by code, limit 0x0FFFF (1 B Granularity), present * type = 16 bit data read/write, DPL = 0 */ .word 0xFFFF LOCAL(ds_base_bytes12): .word 0 LOCAL(ds_base_byte3): .byte 0 .byte 0x92, 0, 0 LOCAL(gdt_end): #ifdef __APPLE__ LOCAL(relocator16_idt): #endif VARIABLE(grub_relocator16_idt) .word 0 .long 0 LOCAL(relocator16_end): VARIABLE(grub_relocator16_end) .byte 0 grub-2.14~git20250718.0e36779/grub-core/lib/i386/pc/0000755000175000017500000000000015036452575015620 500000000000000grub-2.14~git20250718.0e36779/grub-core/lib/i386/pc/biosnum.c0000644000175000017500000000250315000202015017325 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (C) 2009 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include static int grub_get_root_biosnumber_default (void) { const char *biosnum; int ret = -1; grub_device_t dev; biosnum = grub_env_get ("biosnum"); if (biosnum) return grub_strtoul (biosnum, 0, 0); dev = grub_device_open (0); if (dev && dev->disk && dev->disk->dev && dev->disk->dev->id == GRUB_DISK_DEVICE_BIOSDISK_ID) ret = (int) dev->disk->id; if (dev) grub_device_close (dev); return ret; } int (*grub_get_root_biosnumber) (void) = grub_get_root_biosnumber_default; grub-2.14~git20250718.0e36779/grub-core/lib/i386/pc/vesa_modes_table.c0000644000175000017500000000642215000202015021151 00000000000000 #include /* This is the reverse of the table in [linux]/Documentation/fb/vesafb.txt plus a few more modes based on the table in http://en.wikipedia.org/wiki/VESA_BIOS_Extensions */ struct grub_vesa_mode_table_entry grub_vesa_mode_table[GRUB_VESA_MODE_TABLE_END - GRUB_VESA_MODE_TABLE_START + 1] = { { 640, 400, 8 }, /* 0x300 */ { 640, 480, 8 }, /* 0x301 */ { 800, 600, 4 }, /* 0x302 */ { 800, 600, 8 }, /* 0x303 */ { 1024, 768, 4 }, /* 0x304 */ { 1024, 768, 8 }, /* 0x305 */ { 1280, 1024, 4 }, /* 0x306 */ { 1280, 1024, 8 }, /* 0x307 */ { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 320, 200, 15 }, /* 0x30d */ { 320, 200, 16 }, /* 0x30e */ { 320, 200, 24 }, /* 0x30f */ { 640, 480, 15 }, /* 0x310 */ { 640, 480, 16 }, /* 0x311 */ { 640, 480, 24 }, /* 0x312 */ { 800, 600, 15 }, /* 0x313 */ { 800, 600, 16 }, /* 0x314 */ { 800, 600, 24 }, /* 0x315 */ { 1024, 768, 15 }, /* 0x316 */ { 1024, 768, 16 }, /* 0x317 */ { 1024, 768, 24 }, /* 0x318 */ { 1280, 1024, 15 }, /* 0x319 */ { 1280, 1024, 16 }, /* 0x31a */ { 1280, 1024, 24 }, /* 0x31b */ { 1600, 1200, 8 }, /* 0x31c */ { 1600, 1200, 15 }, /* 0x31d */ { 1600, 1200, 16 }, /* 0x31e */ { 1600, 1200, 24 }, /* 0x31f */ { 0, 0, 0 }, { 640, 400, 15 }, /* 0x321 */ { 640, 400, 16 }, /* 0x322 */ { 640, 400, 24 }, /* 0x323 */ { 640, 400, 32 }, /* 0x324 */ { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 640, 480, 32 }, /* 0x329 */ { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 896, 672, 8 }, /* 0x32f */ { 896, 672, 15 }, /* 0x330 */ { 896, 672, 16 }, /* 0x331 */ { 896, 672, 24 }, /* 0x332 */ { 896, 672, 32 }, /* 0x333 */ { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 1600, 1200, 32 }, /* 0x342 */ { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 1440, 900, 8 }, /* 0x360 */ { 1440, 900, 15 }, /* 0x361 */ { 1440, 900, 16 }, /* 0x362 */ { 1440, 900, 24 }, /* 0x363 */ { 1440, 900, 32 }, /* 0x364 */ { 1152, 720, 8 }, /* 0x365 */ { 1152, 720, 15 }, /* 0x366 */ { 1152, 720, 16 }, /* 0x367 */ { 1152, 720, 24 }, /* 0x368 */ { 1152, 720, 32 }, /* 0x369 */ { 1024, 640, 8 }, /* 0x36a */ { 1024, 640, 15 }, /* 0x36b */ { 1024, 640, 16 }, /* 0x36c */ { 1024, 640, 24 }, /* 0x36d */ { 1024, 640, 32 }, /* 0x36e */ { 800, 500, 8 }, /* 0x36f */ { 800, 500, 15 }, /* 0x370 */ { 800, 500, 16 }, /* 0x371 */ { 800, 500, 24 }, /* 0x372 */ { 800, 500, 32 }, /* 0x373 */ }; grub-2.14~git20250718.0e36779/grub-core/lib/i386/relocator_common.S0000644000175000017500000000531615002425525020615 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (C) 2009,2010 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #ifdef __x86_64__ #define RAX %rax #define RSI %rsi #else #define RAX %eax #define RSI %esi #endif .macro DISABLE_PAGING movl %cr0, %eax andl $(~GRUB_MEMORY_CPU_CR0_PAGING_ON), %eax movl %eax, %cr0 .endm .macro PREAMBLE LOCAL(base): /* %rax contains now our new 'base'. */ mov RAX, RSI #if defined (__APPLE__) && defined (__x86_64__) leaq LOCAL(cont0) (%rip), RAX #elif defined (__APPLE__) LOCAL(cont0_offset) = LOCAL(cont0) - LOCAL(base) add $LOCAL(cont0_offset), RAX #else add $(LOCAL(cont0) - LOCAL(base)), RAX #endif jmp *RAX LOCAL(cont0): .endm .macro RELOAD_GDT #ifdef __APPLE__ LOCAL(cont1_offset) = LOCAL(cont1) - LOCAL(base) LOCAL(jump_vector_offset) = LOCAL(jump_vector) - LOCAL(base) LOCAL(gdt_offset) = LOCAL(gdt) - LOCAL(base) LOCAL(gdt_addr_offset) = LOCAL(gdt_addr) - LOCAL(base) LOCAL(gdtdesc_offset) = LOCAL(gdtdesc) - LOCAL(base) lea LOCAL(cont1_offset) (RSI, 1), RAX movl %eax, LOCAL(jump_vector_offset) (RSI, 1) lea LOCAL(gdt_offset) (RSI, 1), RAX mov RAX, (LOCAL(gdt_addr_offset)) (RSI, 1) /* Switch to compatibility mode. */ lgdt (LOCAL(gdtdesc_offset)) (RSI, 1) /* Update %cs. */ ljmp *(LOCAL(jump_vector_offset)) (RSI, 1) .p2align 4 LOCAL(gdtdesc): LOCAL(gdtsize) = LOCAL(gdt_end) - LOCAL(gdt) .word LOCAL(gdtsize) #else lea (LOCAL(cont1) - LOCAL(base)) (RSI, 1), RAX movl %eax, (LOCAL(jump_vector) - LOCAL(base)) (RSI, 1) lea (LOCAL(gdt) - LOCAL(base)) (RSI, 1), RAX mov RAX, (LOCAL(gdt_addr) - LOCAL(base)) (RSI, 1) /* Switch to compatibility mode. */ lgdt (LOCAL(gdtdesc) - LOCAL(base)) (RSI, 1) /* Update %cs. */ ljmp *(LOCAL(jump_vector) - LOCAL(base)) (RSI, 1) .p2align 4 LOCAL(gdtdesc): .word LOCAL(gdt_end) - LOCAL(gdt) #endif LOCAL(gdt_addr): #ifdef __x86_64__ /* Filled by the code. */ .quad 0 #else /* Filled by the code. */ .long 0 #endif .p2align 4 LOCAL(jump_vector): /* Jump location. Is filled by the code */ .long 0 .long CODE_SEGMENT LOCAL(cont1): .endm grub-2.14~git20250718.0e36779/grub-core/lib/i386/relocator64.S0000644000175000017500000001126115033157230017412 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (C) 2009,2010 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #define CODE32_SEGMENT 0x18 #define CODE_SEGMENT 0x08 /* The data segment of the protected mode. */ #define DATA_SEGMENT 0x10 #include "relocator_common.S" .p2align 4 /* force 16-byte alignment */ VARIABLE(grub_relocator64_start) PREAMBLE #ifndef __x86_64__ DISABLE_PAGING /* Turn on PAE. */ movl %cr4, %eax orl $(GRUB_MEMORY_CPU_CR4_PAE_ON | GRUB_MEMORY_CPU_CR4_PSE_ON), %eax movl %eax, %cr4 /* mov imm32, %eax */ .byte 0xb8 VARIABLE(grub_relocator64_cr3) .long 0 movl %eax, %cr3 /* Turn on amd64. */ movl $GRUB_MEMORY_CPU_AMD64_MSR, %ecx rdmsr orl $GRUB_MEMORY_CPU_AMD64_MSR_ON, %eax wrmsr /* Enable paging. */ movl %cr0, %eax orl $GRUB_MEMORY_CPU_CR0_PAGING_ON, %eax movl %eax, %cr0 RELOAD_GDT #else /* mov imm64, %rax */ .byte 0x48 .byte 0xb8 VARIABLE(grub_relocator64_cr3) .quad 0 movq %rax, %cr3 #endif #ifdef __x86_64__ .code64 #endif /* mov imm64, %rax */ .byte 0x48 .byte 0xb8 VARIABLE(grub_relocator64_rsp) .quad 0 #ifdef __x86_64__ movq %rax, %rsp #else /* movq %rax, %rsp */ .byte 0x48 .byte 0x89 .byte 0xc4 #endif #ifdef GRUB_MACHINE_EFI jmp LOCAL(skip_efi_stack_align) /* * Here is grub_relocator64_efi_start() entry point. Most of the * code below is shared between grub_relocator64_efi_start() * and grub_relocator64_start(). * * Think twice before changing anything there!!! */ VARIABLE(grub_relocator64_efi_start) /* Align the stack as UEFI spec requires. */ #ifdef __x86_64__ andq $~15, %rsp #else /* andq $~15, %rsp */ .byte 0x48 .byte 0x83 .byte 0xe4 .byte 0xf0 #endif LOCAL(skip_efi_stack_align): #endif /* mov imm64, %rax */ .byte 0x48 .byte 0xb8 VARIABLE(grub_relocator64_rsi) .quad 0 #ifdef __x86_64__ movq %rax, %rsi #else /* movq %rax, %rsi */ .byte 0x48 .byte 0x89 .byte 0xc6 #endif /* mov imm64, %rax */ .byte 0x48 .byte 0xb8 VARIABLE(grub_relocator64_rax) .quad 0 /* mov imm64, %rbx */ .byte 0x48 .byte 0xbb VARIABLE(grub_relocator64_rbx) .quad 0 /* mov imm64, %rcx */ .byte 0x48 .byte 0xb9 VARIABLE(grub_relocator64_rcx) .quad 0 /* mov imm64, %rdx */ .byte 0x48 .byte 0xba VARIABLE(grub_relocator64_rdx) .quad 0 /* Cleared direction flag is of no problem with any current payload and makes this implementation easier. */ cld #if defined (__APPLE__) || !defined (__x86_64__) .byte 0xff, 0x25 .long 0 #else jmp *LOCAL(jump_addr) (%rip) #endif LOCAL(jump_addr): VARIABLE(grub_relocator64_rip) .quad 0 #ifdef GRUB_MACHINE_EFI /* Here grub_relocator64_efi_start() ends. Ufff... */ VARIABLE(grub_relocator64_efi_end) #endif #ifndef __x86_64__ .p2align 4 LOCAL(gdt): /* NULL. */ .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 /* 64-bit segment. */ .word 0xffff /* Limit xffff. */ .word 0x0000 /* Base xxxx0000. */ .byte 0x00 /* Base xx00xxxx. */ .byte (0x8 /* Type 8. */ | (1 << 4) /* Code. */ \ | (0 << 5) /* Ring 0. */ | (1 << 7) /* Present. */) .byte (0xf /* Limit fxxxx. */ | (0 << 4) /* AVL flag. */ \ | (1 << 5) /* 64-bit. */ | (0 << 6) \ | (1 << 7) /* 4K granular. */) .byte 0x00 /* Base 00xxxxxx. */ /* Data segment*/ .word 0xffff /* Limit xffff. */ .word 0x0000 /* Base xxxx0000. */ .byte 0x00 /* Base xx00xxxx. */ .byte (0x0 /* Type 0. */ | (0 << 4) /* Data. */ \ | (0 << 5) /* Ring 0. */ | (1 << 7) /* Present. */) .byte (0xf /* Limit fxxxx. */ | (0 << 4) /* AVL flag. */ \ | (0 << 5) /* Data. */ | (0 << 6) \ | (1 << 7) /* 4K granular. */) .byte 0x00 /* Base 00xxxxxx. */ /* Compatibility segment. */ .word 0xffff /* Limit xffff. */ .word 0x0000 /* Base xxxx0000. */ .byte 0x00 /* Base xx00xxxx. */ .byte (0x8 /* Type 8. */ | (1 << 4) /* Code. */ \ | (0 << 5) /* Ring 0. */ | (1 << 7) /* Present. */) .byte (0xf /* Limit fxxxx. */ | (0 << 4) /* AVL flag. */ \ | (0 << 5) /* 32-bit. */ | (1 << 6) /* 32-bit. */ \ | (1 << 7) /* 4K granular. */) .byte 0x00 /* Base 00xxxxxx. */ LOCAL(gdt_end): #endif VARIABLE(grub_relocator64_end) grub-2.14~git20250718.0e36779/grub-core/lib/i386/halt.c0000644000175000017500000000430515002425525016220 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (C) 2008 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include const char bochs_shutdown[] = "Shutdown"; /* * This call is special... it never returns... in fact it should simply * hang at this point! */ static inline void __attribute__ ((noreturn)) stop (void) { asm volatile ("cli"); while (1) { asm volatile ("hlt"); } } static int grub_shutdown_pci_iter (grub_pci_device_t dev, grub_pci_id_t pciid, void *data __attribute__ ((unused))) { /* QEMU. */ if (pciid == 0x71138086) { grub_pci_address_t addr; addr = grub_pci_make_address (dev, 0x40); grub_pci_write (addr, 0x7001); addr = grub_pci_make_address (dev, 0x80); grub_pci_write (addr, grub_pci_read (addr) | 1); grub_outw (0x2000, 0x7004); } return 0; } void grub_halt (void) { unsigned int i; #if defined (GRUB_MACHINE_COREBOOT) || defined (GRUB_MACHINE_MULTIBOOT) grub_acpi_halt (); #endif /* Disable interrupts. */ asm volatile ("cli"); /* Bochs, QEMU, etc. Removed in newer QEMU releases. */ for (i = 0; i < sizeof (bochs_shutdown) - 1; i++) grub_outb (bochs_shutdown[i], 0x8900); grub_pci_iterate (grub_shutdown_pci_iter, NULL); grub_puts_ (N_("GRUB doesn't know how to halt this machine yet!")); /* In order to return we'd have to check what the previous status of IF flag was. But user most likely doesn't want to return anyway ... */ stop (); } grub-2.14~git20250718.0e36779/grub-core/lib/i386/relocator.c0000644000175000017500000001450515033157230017264 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (C) 2009 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include #include #include #include extern grub_uint8_t grub_relocator16_start; extern grub_uint8_t grub_relocator16_end; extern grub_uint16_t grub_relocator16_cs; extern grub_uint16_t grub_relocator16_ip; extern grub_uint16_t grub_relocator16_ds; extern grub_uint16_t grub_relocator16_es; extern grub_uint16_t grub_relocator16_fs; extern grub_uint16_t grub_relocator16_gs; extern grub_uint16_t grub_relocator16_ss; extern grub_uint16_t grub_relocator16_sp; extern grub_uint32_t grub_relocator16_edx; extern grub_uint32_t grub_relocator16_ebx; extern grub_uint32_t grub_relocator16_esi; extern grub_uint32_t grub_relocator16_ebp; extern grub_uint16_t grub_relocator16_keep_a20_enabled; extern grub_uint8_t grub_relocator32_start; extern grub_uint8_t grub_relocator32_end; extern grub_uint32_t grub_relocator32_eax; extern grub_uint32_t grub_relocator32_ebx; extern grub_uint32_t grub_relocator32_ecx; extern grub_uint32_t grub_relocator32_edx; extern grub_uint32_t grub_relocator32_eip; extern grub_uint32_t grub_relocator32_esp; extern grub_uint32_t grub_relocator32_ebp; extern grub_uint32_t grub_relocator32_esi; extern grub_uint32_t grub_relocator32_edi; extern grub_uint8_t grub_relocator64_start; extern grub_uint8_t grub_relocator64_end; extern grub_uint64_t grub_relocator64_rax; extern grub_uint64_t grub_relocator64_rbx; extern grub_uint64_t grub_relocator64_rcx; extern grub_uint64_t grub_relocator64_rdx; extern grub_uint64_t grub_relocator64_rip; extern grub_uint64_t grub_relocator64_rsp; extern grub_uint64_t grub_relocator64_rsi; extern grub_addr_t grub_relocator64_cr3; extern struct grub_i386_idt grub_relocator16_idt; #define RELOCATOR_SIZEOF(x) (&grub_relocator##x##_end - &grub_relocator##x##_start) grub_err_t grub_relocator32_boot (struct grub_relocator *rel, struct grub_relocator32_state state, int avoid_efi_bootservices) { grub_err_t err; void *relst; grub_relocator_chunk_t ch; /* Specific memory range due to Global Descriptor Table for use by payload that we will store in returned chunk. The address range and preference are based on "THE LINUX/x86 BOOT PROTOCOL" specification. */ err = grub_relocator_alloc_chunk_align_safe (rel, &ch, 0x1000, 0x9a000, RELOCATOR_SIZEOF (32), 16, GRUB_RELOCATOR_PREFERENCE_LOW, avoid_efi_bootservices); if (err) return err; grub_relocator32_eax = state.eax; grub_relocator32_ebx = state.ebx; grub_relocator32_ecx = state.ecx; grub_relocator32_edx = state.edx; grub_relocator32_eip = state.eip; grub_relocator32_esp = state.esp; grub_relocator32_ebp = state.ebp; grub_relocator32_esi = state.esi; grub_relocator32_edi = state.edi; grub_memmove (get_virtual_current_address (ch), &grub_relocator32_start, RELOCATOR_SIZEOF (32)); err = grub_relocator_prepare_relocs (rel, get_physical_target_address (ch), &relst, NULL); if (err) return err; asm volatile ("cli"); ((void (*) (void)) relst) (); /* Not reached. */ return GRUB_ERR_NONE; } grub_err_t grub_relocator16_boot (struct grub_relocator *rel, struct grub_relocator16_state state) { grub_err_t err; void *relst; grub_relocator_chunk_t ch; /* Put it higher than the byte it checks for A20 check. */ err = grub_relocator_alloc_chunk_align_safe (rel, &ch, 0x8010, 0xa0000, RELOCATOR_SIZEOF (16) + GRUB_RELOCATOR16_STACK_SIZE, 16, GRUB_RELOCATOR_PREFERENCE_NONE, 0); if (err) return err; grub_relocator16_cs = state.cs; grub_relocator16_ip = state.ip; grub_relocator16_ds = state.ds; grub_relocator16_es = state.es; grub_relocator16_fs = state.fs; grub_relocator16_gs = state.gs; grub_relocator16_ss = state.ss; grub_relocator16_sp = state.sp; grub_relocator16_ebp = state.ebp; grub_relocator16_ebx = state.ebx; grub_relocator16_edx = state.edx; grub_relocator16_esi = state.esi; #ifdef GRUB_MACHINE_PCBIOS grub_relocator16_idt = *grub_realidt; #else grub_relocator16_idt.base = 0; grub_relocator16_idt.limit = 0; #endif grub_relocator16_keep_a20_enabled = state.a20; grub_memmove (get_virtual_current_address (ch), &grub_relocator16_start, RELOCATOR_SIZEOF (16)); err = grub_relocator_prepare_relocs (rel, get_physical_target_address (ch), &relst, NULL); if (err) return err; asm volatile ("cli"); ((void (*) (void)) relst) (); /* Not reached. */ return GRUB_ERR_NONE; } grub_err_t grub_relocator64_boot (struct grub_relocator *rel, struct grub_relocator64_state state, grub_addr_t min_addr, grub_addr_t max_addr) { grub_err_t err; void *relst; grub_relocator_chunk_t ch; err = grub_relocator_alloc_chunk_align_safe (rel, &ch, min_addr, max_addr, RELOCATOR_SIZEOF (64), 16, GRUB_RELOCATOR_PREFERENCE_NONE, 0); if (err) return err; grub_relocator64_rax = state.rax; grub_relocator64_rbx = state.rbx; grub_relocator64_rcx = state.rcx; grub_relocator64_rdx = state.rdx; grub_relocator64_rip = state.rip; grub_relocator64_rsp = state.rsp; grub_relocator64_rsi = state.rsi; grub_relocator64_cr3 = state.cr3; grub_memmove (get_virtual_current_address (ch), &grub_relocator64_start, RELOCATOR_SIZEOF (64)); err = grub_relocator_prepare_relocs (rel, get_physical_target_address (ch), &relst, NULL); if (err) return err; asm volatile ("cli"); ((void (*) (void)) relst) (); /* Not reached. */ return GRUB_ERR_NONE; } grub-2.14~git20250718.0e36779/grub-core/lib/i386/relocator32.S0000644000175000017500000000530515000202015017371 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (C) 2009,2010 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ /* The code segment of the protected mode. */ #define CODE_SEGMENT 0x10 /* The data segment of the protected mode. */ #define DATA_SEGMENT 0x18 #include "relocator_common.S" .p2align 4 /* force 16-byte alignment */ VARIABLE(grub_relocator32_start) PREAMBLE RELOAD_GDT .code32 /* Update other registers. */ movl $DATA_SEGMENT, %eax movl %eax, %ds movl %eax, %es movl %eax, %fs movl %eax, %gs movl %eax, %ss DISABLE_PAGING #ifdef __x86_64__ /* Disable amd64. */ movl $GRUB_MEMORY_CPU_AMD64_MSR, %ecx rdmsr andl $(~GRUB_MEMORY_CPU_AMD64_MSR_ON), %eax wrmsr #endif /* Turn off PAE. */ movl %cr4, %eax andl $(~GRUB_MEMORY_CPU_CR4_PAE_ON), %eax movl %eax, %cr4 jmp LOCAL(cont2) LOCAL(cont2): .code32 /* mov imm32, %eax */ .byte 0xb8 VARIABLE(grub_relocator32_esp) .long 0 movl %eax, %esp /* mov imm32, %eax */ .byte 0xb8 VARIABLE(grub_relocator32_ebp) .long 0 movl %eax, %ebp /* mov imm32, %eax */ .byte 0xb8 VARIABLE(grub_relocator32_esi) .long 0 movl %eax, %esi /* mov imm32, %eax */ .byte 0xb8 VARIABLE(grub_relocator32_edi) .long 0 movl %eax, %edi /* mov imm32, %eax */ .byte 0xb8 VARIABLE(grub_relocator32_eax) .long 0 /* mov imm32, %ebx */ .byte 0xbb VARIABLE(grub_relocator32_ebx) .long 0 /* mov imm32, %ecx */ .byte 0xb9 VARIABLE(grub_relocator32_ecx) .long 0 /* mov imm32, %edx */ .byte 0xba VARIABLE(grub_relocator32_edx) .long 0 /* Cleared direction flag is of no problem with any current payload and makes this implementation easier. */ cld .byte 0xea VARIABLE(grub_relocator32_eip) .long 0 .word CODE_SEGMENT /* GDT. Copied from loader/i386/linux.c. */ .p2align 4 LOCAL(gdt): /* NULL. */ .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 /* Reserved. */ .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 /* Code segment. */ .byte 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x9A, 0xCF, 0x00 /* Data segment. */ .byte 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x92, 0xCF, 0x00 LOCAL(gdt_end): VARIABLE(grub_relocator32_end) grub-2.14~git20250718.0e36779/grub-core/lib/i386/reboot.c0000644000175000017500000000345315033157230016564 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (C) 2011 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #ifndef GRUB_MACHINE_EFI #include #include #include #include #include #include void grub_reboot (void) { struct grub_relocator *relocator = NULL; grub_relocator_chunk_t ch; grub_err_t err; void *buf; struct grub_relocator16_state state; grub_uint16_t segment; relocator = grub_relocator_new (); if (!relocator) while (1); err = grub_relocator_alloc_chunk_align (relocator, &ch, 0x1000, 0x1000, grub_reboot_end - grub_reboot_start, 16, GRUB_RELOCATOR_PREFERENCE_NONE, 0); if (err) while (1); buf = get_virtual_current_address (ch); grub_memcpy (buf, grub_reboot_start, grub_reboot_end - grub_reboot_start); segment = ((grub_addr_t) get_physical_target_address (ch)) >> 4; state.gs = state.fs = state.es = state.ds = state.ss = segment; state.sp = 0; state.cs = segment; state.ip = 0; state.a20 = 0; grub_stop_floppy (); err = grub_relocator16_boot (relocator, state); while (1); } #endif /* GRUB_MACHINE_EFI */ grub-2.14~git20250718.0e36779/grub-core/lib/i386/relocator_common_c.c0000644000175000017500000000600015000202015021107 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (C) 2009-2013 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include #include extern grub_uint8_t grub_relocator_forward_start; extern grub_uint8_t grub_relocator_forward_end; extern grub_uint8_t grub_relocator_backward_start; extern grub_uint8_t grub_relocator_backward_end; extern void *grub_relocator_backward_dest; extern void *grub_relocator_backward_src; extern grub_size_t grub_relocator_backward_chunk_size; extern void *grub_relocator_forward_dest; extern void *grub_relocator_forward_src; extern grub_size_t grub_relocator_forward_chunk_size; #define RELOCATOR_SIZEOF(x) (&grub_relocator##x##_end - &grub_relocator##x##_start) grub_size_t grub_relocator_align = 1; grub_size_t grub_relocator_forward_size; grub_size_t grub_relocator_backward_size; #ifdef __x86_64__ grub_size_t grub_relocator_jumper_size = 12; #else grub_size_t grub_relocator_jumper_size = 7; #endif void grub_cpu_relocator_init (void) { grub_relocator_forward_size = RELOCATOR_SIZEOF (_forward); grub_relocator_backward_size = RELOCATOR_SIZEOF (_backward); } void grub_cpu_relocator_jumper (void *rels, grub_addr_t addr) { grub_uint8_t *ptr; ptr = rels; #ifdef __x86_64__ /* movq imm64, %rax (for relocator) */ *(grub_uint8_t *) ptr = 0x48; ptr++; *(grub_uint8_t *) ptr = 0xb8; ptr++; *(grub_uint64_t *) ptr = addr; ptr += sizeof (grub_uint64_t); #else /* movl imm32, %eax (for relocator) */ *(grub_uint8_t *) ptr = 0xb8; ptr++; *(grub_uint32_t *) ptr = addr; ptr += sizeof (grub_uint32_t); #endif /* jmp $eax/$rax */ *(grub_uint8_t *) ptr = 0xff; ptr++; *(grub_uint8_t *) ptr = 0xe0; ptr++; } void grub_cpu_relocator_backward (void *ptr, void *src, void *dest, grub_size_t size) { grub_relocator_backward_dest = dest; grub_relocator_backward_src = src; grub_relocator_backward_chunk_size = size; grub_memmove (ptr, &grub_relocator_backward_start, RELOCATOR_SIZEOF (_backward)); } void grub_cpu_relocator_forward (void *ptr, void *src, void *dest, grub_size_t size) { grub_relocator_forward_dest = dest; grub_relocator_forward_src = src; grub_relocator_forward_chunk_size = size; grub_memmove (ptr, &grub_relocator_forward_start, RELOCATOR_SIZEOF (_forward)); } grub-2.14~git20250718.0e36779/grub-core/lib/i386/random.c0000644000175000017500000000471015002425525016550 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (C) 2016 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include static int have_tsc = -1, have_pmtimer = -1; static grub_port_t pmtimer_port; static int detect_pmtimer (void) { struct grub_acpi_fadt *fadt; fadt = grub_acpi_find_fadt (); if (!fadt) return 0; pmtimer_port = fadt->pmtimer; if (!pmtimer_port) return 0; return 1; } static int pmtimer_tsc_get_random_bit (void) { /* It's hard to come up with figures about pmtimer and tsc jitter but 50 ppm seems to be typical. So we need 10^6/50 tsc cycles to get drift of one tsc cycle. With TSC at least of 800 MHz it means 1/(50*800) = 1/40000 s or about 3579545 / 40000 = 90 pmtimer ticks. This gives us rate of 40000 bit/s or 5 kB/s. */ grub_uint64_t tsc_diff; tsc_diff = grub_pmtimer_wait_count_tsc (pmtimer_port, 90); if (tsc_diff == 0) { have_pmtimer = 0; return -1; } return tsc_diff & 1; } static int pmtimer_tsc_get_random_byte (void) { grub_uint8_t ret = 0; int i, c; for (i = 0; i < 8; i++) { c = pmtimer_tsc_get_random_bit (); if (c < 0) return -1; ret |= c << i; } return ret; } static int pmtimer_fill_buffer (void *buffer, grub_size_t sz) { grub_uint8_t *p = buffer; int c; while (sz) { c = pmtimer_tsc_get_random_byte (); if (c < 0) return 0; *p++ = c; sz--; } return 1; } int grub_crypto_arch_get_random (void *buffer, grub_size_t sz) { if (have_tsc == -1) have_tsc = grub_cpu_is_tsc_supported (); if (!have_tsc) return 0; if (have_pmtimer == -1) have_pmtimer = detect_pmtimer (); if (!have_pmtimer) return 0; return pmtimer_fill_buffer (buffer, sz); } grub-2.14~git20250718.0e36779/grub-core/lib/i386/backtrace.c0000644000175000017500000000332715002425525017212 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (C) 2009 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include #include #define MAX_STACK_FRAME 102400 void grub_backtrace_pointer (void *ebp) { void *ptr, *nptr; unsigned i; ptr = ebp; while (1) { grub_printf ("%p: ", ptr); grub_backtrace_print_address (((void **) ptr)[1]); grub_printf (" ("); for (i = 0; i < 2; i++) grub_printf ("%p,", ((void **)ptr) [i + 2]); grub_printf ("%p)\n", ((void **)ptr) [i + 2]); nptr = *(void **)ptr; if (nptr < ptr || (void **) nptr - (void **) ptr > MAX_STACK_FRAME || nptr == ptr) { grub_printf ("Invalid stack frame at %p (%p)\n", ptr, nptr); break; } ptr = nptr; } } void grub_backtrace (void) { #ifdef __x86_64__ asm volatile ("movq %%rbp, %%rdi\n" "callq *%%rax": :"a"(grub_backtrace_pointer)); #else asm volatile ("movl %%ebp, %%eax\n" "calll *%%ecx": :"c"(grub_backtrace_pointer)); #endif } grub-2.14~git20250718.0e36779/grub-core/lib/i386/xen/0000755000175000017500000000000015036452576016011 500000000000000grub-2.14~git20250718.0e36779/grub-core/lib/i386/xen/relocator.S0000644000175000017500000001010015036447510020027 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (C) 2013 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include .p2align 4 /* force 16-byte alignment */ VARIABLE(grub_relocator_xen_remap_start) LOCAL(base): /* Remap the remapper to it's new address. */ /* mov imm32, %ebx - %ebx: new virtual address of remapper */ .byte 0xbb VARIABLE(grub_relocator_xen_remapper_virt) .long 0 /* mov imm32, %ecx - %ecx: low part of page table entry */ .byte 0xb9 VARIABLE(grub_relocator_xen_remapper_map) .long 0 /* mov imm32, %edx - %edx: high part of page table entry */ .byte 0xba VARIABLE(grub_relocator_xen_remapper_map_high) .long 0 movl %ebx, %ebp /* %ebx is clobbered by hypercall */ movl $UVMF_INVLPG, %esi /* esi: flags (inv. single entry) */ movl $__HYPERVISOR_update_va_mapping, %eax int $0x82 movl %ebp, %ebx addl $(LOCAL(cont) - LOCAL(base)), %ebx jmp *%ebx /* Continue with new virtual address */ LOCAL(cont): /* Modify mappings of new page tables to be read-only. */ /* mov imm32, %eax */ .byte 0xb8 VARIABLE(grub_relocator_xen_paging_areas_addr) .long 0 movl %eax, %ebx 1: movl 0(%ebx), %ebp /* Get start pfn of the current area */ movl GRUB_TARGET_SIZEOF_LONG(%ebx), %ecx /* Get # of pg tables */ testl %ecx, %ecx /* 0 -> last area reached */ jz 3f addl $(2 * GRUB_TARGET_SIZEOF_LONG), %ebx movl %ebx, %esp /* Save current area pointer */ 2: movl %ecx, %edi /* mov imm32, %eax */ .byte 0xb8 VARIABLE(grub_relocator_xen_mfn_list) .long 0 movl 0(%eax, %ebp, 4), %ecx /* mfn */ movl %ebp, %ebx shll $GRUB_PAGE_SHIFT, %ebx /* virtual address (1:1 mapping) */ movl %ecx, %edx shll $GRUB_PAGE_SHIFT, %ecx /* prepare pte low part */ shrl $(32 - GRUB_PAGE_SHIFT), %edx /* pte high part */ orl $(GRUB_PAGE_PRESENT | GRUB_PAGE_USER), %ecx /* pte low */ movl $UVMF_INVLPG, %esi movl $__HYPERVISOR_update_va_mapping, %eax int $0x82 /* parameters: eax, ebx, ecx, edx, esi */ incl %ebp /* next pfn */ movl %edi, %ecx loop 2b mov %esp, %ebx /* restore area poniter */ jmp 1b 3: /* Switch page tables: pin new L3 pt, load cr3, unpin old L3. */ /* mov imm32, %ebx */ .byte 0xbb VARIABLE(grub_relocator_xen_mmu_op_addr) .long 0 movl $3, %ecx /* 3 mmu ops */ movl $0, %edx /* pdone (not used) */ movl $DOMID_SELF, %esi movl $__HYPERVISOR_mmuext_op, %eax int $0x82 /* Continue in virtual kernel mapping. */ /* mov imm32, %eax */ .byte 0xb8 VARIABLE(grub_relocator_xen_remap_continue) .long 0 jmp *%eax VARIABLE(grub_relocator_xen_paging_areas) .long 0, 0, 0, 0, 0, 0, 0, 0 VARIABLE(grub_relocator_xen_mmu_op) .space 256 VARIABLE(grub_relocator_xen_remap_end) VARIABLE(grub_relocator_xen_start) /* Unmap old remapper area. */ /* mov imm32, %eax */ .byte 0xb8 VARIABLE(grub_relocator_xen_remapper_virt2) .long 0 movl %eax, %ebx xorl %ecx, %ecx /* Invalid pte */ xorl %edx, %edx movl $UVMF_INVLPG, %esi movl $__HYPERVISOR_update_va_mapping, %eax int $0x82 /* Prepare registers for starting kernel. */ /* mov imm32, %eax */ .byte 0xb8 VARIABLE(grub_relocator_xen_stack) .long 0 movl %eax, %esp /* mov imm32, %eax */ .byte 0xb8 VARIABLE(grub_relocator_xen_start_info) .long 0 movl %eax, %esi cld /* mov imm32, %eax */ .byte 0xb8 VARIABLE(grub_relocator_xen_entry_point) .long 0 /* Now start the new kernel. */ jmp *%eax VARIABLE(grub_relocator_xen_end) grub-2.14~git20250718.0e36779/grub-core/lib/i386/reboot_trampoline.S0000644000175000017500000000177315000202015020763 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (C) 2011 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include .p2align 4 VARIABLE(grub_reboot_start) .code16 /* set 0x472 to 0x0000 for cold boot (0x1234 for warm boot) */ movw $0x0472, %di xorw %ax, %ax movw %ax, (%di) ljmp $0xf000, $0xfff0 .code32 VARIABLE(grub_reboot_end) grub-2.14~git20250718.0e36779/grub-core/lib/datetime.c0000644000175000017500000000666215036447510016410 00000000000000/* datetime.c - Module for common datetime function. */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2008 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #ifdef GRUB_MACHINE_EMU #include GRUB_MOD_LICENSE ("GPLv3+"); #endif static const char *const grub_weekday_names[] = { N_("Sunday"), N_("Monday"), N_("Tuesday"), N_("Wednesday"), N_("Thursday"), N_("Friday"), N_("Saturday"), }; int grub_get_weekday (struct grub_datetime *datetime) { unsigned a, y, m; if (datetime->month <= 2) a = 1; else a = 0; y = datetime->year - a; m = datetime->month + 12 * a - 2; return (datetime->day + y + y / 4 - y / 100 + y / 400 + (31 * m / 12)) % 7; } const char * grub_get_weekday_name (struct grub_datetime *datetime) { return _ (grub_weekday_names[grub_get_weekday (datetime)]); } #define SECPERMIN 60 #define SECPERHOUR (60*SECPERMIN) #define SECPERDAY (24*SECPERHOUR) #define DAYSPERYEAR 365 #define DAYSPER4YEARS (4*DAYSPERYEAR+1) void grub_unixtime2datetime (grub_int64_t nix, struct grub_datetime *datetime) { int i; grub_uint8_t months[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; /* In the period of validity of unixtime all years divisible by 4 are bissextile*/ /* Convenience: let's have 3 consecutive non-bissextile years at the beginning of the counting date. So count from 1901. */ int days_epoch; /* Number of days since 1st Januar, 1901. */ unsigned days; /* Seconds into current day. */ unsigned secs_in_day; /* Transform C divisions and modulos to mathematical ones */ if (nix < 0) /* * The result of division here shouldn't be larger than GRUB_INT_MAX. * So, it's safe to store the result back in an int. */ days_epoch = -(grub_divmod64 (((grub_int64_t) (SECPERDAY) - nix - 1), SECPERDAY, NULL)); else days_epoch = grub_divmod64 (nix, SECPERDAY, NULL); secs_in_day = nix - days_epoch * SECPERDAY; days = days_epoch + 69 * DAYSPERYEAR + 17; datetime->year = 1901 + 4 * (days / DAYSPER4YEARS); days %= DAYSPER4YEARS; /* On 31st December of bissextile years 365 days from the beginning of the year elapsed but year isn't finished yet */ if (days / DAYSPERYEAR == 4) { datetime->year += 3; days -= 3*DAYSPERYEAR; } else { datetime->year += days / DAYSPERYEAR; days %= DAYSPERYEAR; } for (i = 0; i < 12 && days >= (i==1 && datetime->year % 4 == 0 ? 29 : months[i]); i++) days -= (i==1 && datetime->year % 4 == 0 ? 29 : months[i]); datetime->month = i + 1; datetime->day = 1 + days; datetime->hour = (secs_in_day / SECPERHOUR); secs_in_day %= SECPERHOUR; datetime->minute = secs_in_day / SECPERMIN; datetime->second = secs_in_day % SECPERMIN; } grub-2.14~git20250718.0e36779/grub-core/lib/disk.c0000644000175000017500000001017615033157230015533 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (C) 2002,2003,2004,2006,2007,2008,2009,2010 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); #include "../kern/disk_common.c" static void grub_disk_cache_invalidate (unsigned long dev_id, unsigned long disk_id, grub_disk_addr_t sector) { unsigned cache_index; struct grub_disk_cache *cache; sector &= ~((grub_disk_addr_t) GRUB_DISK_CACHE_SIZE - 1); cache_index = grub_disk_cache_get_index (dev_id, disk_id, sector); cache = grub_disk_cache_table + cache_index; if (cache->dev_id == dev_id && cache->disk_id == disk_id && cache->sector == sector && cache->data) { cache->lock = 1; grub_free (cache->data); cache->data = 0; cache->lock = 0; } } grub_err_t grub_disk_write (grub_disk_t disk, grub_disk_addr_t sector, grub_off_t offset, grub_size_t size, const void *buf) { unsigned real_offset; grub_disk_addr_t aligned_sector; grub_dprintf ("disk", "Writing `%s'...\n", disk->name); if (grub_disk_adjust_range (disk, §or, &offset, size) != GRUB_ERR_NONE) return -1; aligned_sector = (sector & ~((1ULL << (disk->log_sector_size - GRUB_DISK_SECTOR_BITS)) - 1)); real_offset = offset + ((sector - aligned_sector) << GRUB_DISK_SECTOR_BITS); sector = aligned_sector; while (size) { if (real_offset != 0 || (size < (1U << disk->log_sector_size) && size != 0)) { char *tmp_buf; grub_size_t len; grub_partition_t part; tmp_buf = grub_malloc (1U << disk->log_sector_size); if (!tmp_buf) return grub_errno; part = disk->partition; disk->partition = 0; if (grub_disk_read (disk, sector, 0, (1U << disk->log_sector_size), tmp_buf) != GRUB_ERR_NONE) { disk->partition = part; grub_free (tmp_buf); goto finish; } disk->partition = part; len = (1U << disk->log_sector_size) - real_offset; if (len > size) len = size; grub_memcpy (tmp_buf + real_offset, buf, len); grub_disk_cache_invalidate (disk->dev->id, disk->id, sector); if ((disk->dev->disk_write) (disk, grub_disk_to_native_sector (disk, sector), 1, tmp_buf) != GRUB_ERR_NONE) { grub_free (tmp_buf); goto finish; } grub_free (tmp_buf); sector += (1U << (disk->log_sector_size - GRUB_DISK_SECTOR_BITS)); buf = (const char *) buf + len; size -= len; real_offset = 0; } else { grub_size_t len; grub_size_t n; len = size & ~((1ULL << disk->log_sector_size) - 1); n = size >> disk->log_sector_size; if (n > (disk->max_agglomerate << (GRUB_DISK_CACHE_BITS + GRUB_DISK_SECTOR_BITS - disk->log_sector_size))) n = (disk->max_agglomerate << (GRUB_DISK_CACHE_BITS + GRUB_DISK_SECTOR_BITS - disk->log_sector_size)); if ((disk->dev->disk_write) (disk, grub_disk_to_native_sector (disk, sector), n, buf) != GRUB_ERR_NONE) goto finish; while (n--) { grub_disk_cache_invalidate (disk->dev->id, disk->id, sector); sector += (1U << (disk->log_sector_size - GRUB_DISK_SECTOR_BITS)); } buf = (const char *) buf + len; size -= len; } } finish: return grub_errno; } GRUB_MOD_INIT(disk) { grub_disk_write_weak = grub_disk_write; } GRUB_MOD_FINI(disk) { grub_disk_write_weak = NULL; } grub-2.14~git20250718.0e36779/grub-core/lib/progress.c0000644000175000017500000001104515033157230016441 00000000000000/* progress.c - show loading progress */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2013 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); #define UPDATE_INTERVAL 800 static grub_err_t grub_file_progress_hook_real (grub_disk_addr_t sector __attribute__ ((unused)), unsigned offset __attribute__ ((unused)), unsigned length, char *buf __attribute__ ((unused)), void *data) { static int call_depth = 0; grub_uint64_t now; static grub_uint64_t last_progress_update_time; grub_file_t file = data; const char *e; file->progress_offset += length; if (call_depth) return GRUB_ERR_NONE; e = grub_env_get ("enable_progress_indicator"); if (e && e[0] == '0') { return GRUB_ERR_NONE; } call_depth = 1; now = grub_get_time_ms (); if (((now - last_progress_update_time > UPDATE_INTERVAL) && (file->progress_offset - file->offset > 0)) || (file->progress_offset == file->size)) { static char buffer[80]; struct grub_term_output *term; const char *partial_file_name; unsigned long long percent; grub_uint64_t current_speed; if (now - file->last_progress_time < 10) current_speed = 0; else current_speed = grub_divmod64 ((file->progress_offset - file->last_progress_offset) * 100ULL * 1000ULL, now - file->last_progress_time, 0); if (file->size == 0) percent = 100; else percent = grub_divmod64 (100 * file->progress_offset, file->size, 0); /* grub_net_fs_open() saves off partial file structure before name is initialized. It already saves passed file name in net structure so just use it in this case. */ if (file->device->net) partial_file_name = grub_strrchr (file->device->net->name, '/'); else if (file->name) /* grub_file_open() may leave it as NULL */ partial_file_name = grub_strrchr (file->name, '/'); else partial_file_name = NULL; if (partial_file_name) partial_file_name++; else partial_file_name = ""; file->estimated_speed = (file->estimated_speed + current_speed) >> 1; grub_snprintf (buffer, sizeof (buffer), " [ %.20s %s %llu%% ", partial_file_name, grub_get_human_size (file->progress_offset, GRUB_HUMAN_SIZE_NORMAL), (unsigned long long) percent); char *ptr = buffer + grub_strlen (buffer); grub_snprintf (ptr, sizeof (buffer) - (ptr - buffer), "%s ]", grub_get_human_size (file->estimated_speed, GRUB_HUMAN_SIZE_SPEED)); grub_size_t len = grub_strlen (buffer); FOR_ACTIVE_TERM_OUTPUTS (term) { if (term->progress_update_counter++ > term->progress_update_divisor || (file->progress_offset == file->size && term->progress_update_divisor != (unsigned) GRUB_PROGRESS_NO_UPDATE)) { struct grub_term_coordinate old_pos = grub_term_getxy (term); struct grub_term_coordinate new_pos = old_pos; new_pos.x = grub_term_width (term) - len - 1; grub_term_gotoxy (term, new_pos); grub_puts_terminal (buffer, term); grub_term_gotoxy (term, old_pos); term->progress_update_counter = 0; if (term->refresh) term->refresh (term); } } file->last_progress_offset = file->progress_offset; file->last_progress_time = now; last_progress_update_time = now; } call_depth = 0; return GRUB_ERR_NONE; } GRUB_MOD_INIT(progress) { grub_file_progress_hook = grub_file_progress_hook_real; } GRUB_MOD_FINI(progress) { grub_file_progress_hook = 0; } grub-2.14~git20250718.0e36779/grub-core/lib/getline.c0000644000175000017500000000413615000202015016211 00000000000000/* main.c - the normal mode main routine */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2000,2001,2002,2003,2005,2006,2007,2008,2009,2013 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* Read a line from the file FILE. */ char * grub_file_getline (grub_file_t file) { char c; grub_size_t pos = 0; char *cmdline; int have_newline = 0; grub_size_t max_len = 64; /* Initially locate some space. */ cmdline = grub_malloc (max_len); if (! cmdline) return 0; while (1) { if (grub_file_read (file, &c, 1) != 1) break; /* Skip all carriage returns. */ if (c == '\r') continue; if (pos + 1 >= max_len) { char *old_cmdline = cmdline; max_len = max_len * 2; cmdline = grub_realloc (cmdline, max_len); if (! cmdline) { grub_free (old_cmdline); return 0; } } if (c == '\n') { have_newline = 1; break; } cmdline[pos++] = c; } cmdline[pos] = '\0'; /* If the buffer is empty, don't return anything at all. */ if (pos == 0 && !have_newline) { grub_free (cmdline); cmdline = 0; } return cmdline; } grub-2.14~git20250718.0e36779/grub-core/lib/syslinux_parse.c0000644000175000017500000011450115033157230017666 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (C) 2013 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include struct syslinux_say { struct syslinux_say *next; struct syslinux_say *prev; char msg[0]; }; struct initrd_list { struct initrd_list *next; char *file; }; struct syslinux_menuentry { struct syslinux_menuentry *next; struct syslinux_menuentry *prev; char *label; char *extlabel; char *kernel_file; struct initrd_list *initrds; struct initrd_list *initrds_last; char *append; char *argument; char *help; char *comments; grub_size_t commentslen; char hotkey; int make_default; struct syslinux_say *say; enum { KERNEL_NO_KERNEL, KERNEL_LINUX, KERNEL_CHAINLOADER, KERNEL_BIN, KERNEL_PXE, KERNEL_CHAINLOADER_BPB, KERNEL_COM32, KERNEL_COM, KERNEL_IMG, KERNEL_CONFIG, LOCALBOOT } entry_type; }; struct syslinux_menu { struct syslinux_menu *parent; struct syslinux_menuentry *entries; char *def; char *comments; char *background; const char *root_read_directory; const char *root_target_directory; const char *current_read_directory; const char *current_target_directory; const char *filename; grub_size_t commentslen; unsigned long timeout; struct syslinux_say *say; grub_syslinux_flavour_t flavour; }; struct output_buffer { grub_size_t alloc; grub_size_t ptr; char *buf; }; static grub_err_t syslinux_parse_real (struct syslinux_menu *menu); static grub_err_t config_file (struct output_buffer *outbuf, const char *root, const char *target_root, const char *cwd, const char *target_cwd, const char *fname, struct syslinux_menu *parent, grub_syslinux_flavour_t flav); static grub_err_t print_entry (struct output_buffer *outbuf, struct syslinux_menu *menu, const char *str); static grub_err_t ensure_space (struct output_buffer *outbuf, grub_size_t len) { grub_size_t newlen; char *newbuf; if (len < outbuf->alloc - outbuf->ptr) return GRUB_ERR_NONE; newlen = (outbuf->ptr + len + 10) * 2; newbuf = grub_realloc (outbuf->buf, newlen); if (!newbuf) return grub_errno; outbuf->alloc = newlen; outbuf->buf = newbuf; return GRUB_ERR_NONE; } static grub_err_t print (struct output_buffer *outbuf, const char *str, grub_size_t len) { grub_err_t err; err = ensure_space (outbuf, len); if (err) return err; grub_memcpy (&outbuf->buf[outbuf->ptr], str, len); outbuf->ptr += len; return GRUB_ERR_NONE; } static grub_err_t add_comment (struct syslinux_menu *menu, const char *comment, int nl) { if (menu->entries) { if (menu->entries->commentslen == 0 && *comment == 0) return GRUB_ERR_NONE; menu->entries->comments = grub_realloc (menu->entries->comments, menu->entries->commentslen + 2 + grub_strlen (comment)); if (!menu->entries->comments) return grub_errno; menu->entries->commentslen += grub_stpcpy (menu->entries->comments + menu->entries->commentslen, comment) - (menu->entries->comments + menu->entries->commentslen); if (nl) menu->entries->comments[menu->entries->commentslen++] = '\n'; menu->entries->comments[menu->entries->commentslen] = '\0'; } else { if (menu->commentslen == 0 && *comment == 0) return GRUB_ERR_NONE; menu->comments = grub_realloc (menu->comments, menu->commentslen + 2 + grub_strlen (comment)); if (!menu->comments) return grub_errno; menu->commentslen += grub_stpcpy (menu->comments + menu->commentslen, comment) - (menu->comments + menu->commentslen); if (nl) menu->comments[menu->commentslen++] = '\n'; menu->comments[menu->commentslen] = '\0'; } return GRUB_ERR_NONE; } #define print_string(x) do { err = print (outbuf, x, sizeof (x) - 1); if (err) return err; } while (0) static grub_err_t print_num (struct output_buffer *outbuf, int n) { char buf[20]; grub_snprintf (buf, sizeof (buf), "%d", n); return print (outbuf, buf, grub_strlen (buf)); } static grub_err_t label (const char *line, struct syslinux_menu *menu) { struct syslinux_menuentry *entry; entry = grub_malloc (sizeof (*entry)); if (!entry) return grub_errno; grub_memset (entry, 0, sizeof (*entry)); entry->label = grub_strdup (line); if (!entry->label) { grub_free (entry); return grub_errno; } entry->next = menu->entries; entry->prev = NULL; if (menu->entries) menu->entries->prev = entry; menu->entries = entry; return GRUB_ERR_NONE; } static grub_err_t kernel (const char *line, struct syslinux_menu *menu) { const char *end = line + grub_strlen (line); if (!menu->entries) return grub_error (GRUB_ERR_BAD_ARGUMENT, "kernel without label"); menu->entries->kernel_file = grub_strdup (line); if (!menu->entries->kernel_file) return grub_errno; menu->entries->entry_type = KERNEL_LINUX; if (end - line >= 2 && grub_strcmp (end - 2, ".0") == 0) menu->entries->entry_type = KERNEL_PXE; if (end - line >= 4 && grub_strcasecmp (end - 4, ".bin") == 0) menu->entries->entry_type = KERNEL_BIN; if (end - line >= 3 && grub_strcasecmp (end - 3, ".bs") == 0) menu->entries->entry_type = KERNEL_CHAINLOADER; if (end - line >= 4 && grub_strcasecmp (end - 4, ".bss") == 0) menu->entries->entry_type = KERNEL_CHAINLOADER_BPB; if (end - line >= 4 && grub_strcasecmp (end - 4, ".c32") == 0) menu->entries->entry_type = KERNEL_COM32; if (end - line >= 4 && grub_strcasecmp (end - 4, ".cbt") == 0) menu->entries->entry_type = KERNEL_COM; if (end - line >= 4 && grub_strcasecmp (end - 4, ".com") == 0) menu->entries->entry_type = KERNEL_COM; if (end - line >= 4 && grub_strcasecmp (end - 4, ".img") == 0) menu->entries->entry_type = KERNEL_IMG; return GRUB_ERR_NONE; } static grub_err_t cmd_linux (const char *line, struct syslinux_menu *menu) { if (!menu->entries) return grub_error (GRUB_ERR_BAD_ARGUMENT, "kernel without label"); menu->entries->kernel_file = grub_strdup (line); if (!menu->entries->kernel_file) return grub_errno; menu->entries->entry_type = KERNEL_LINUX; return GRUB_ERR_NONE; } static grub_err_t cmd_boot (const char *line, struct syslinux_menu *menu) { if (!menu->entries) return grub_error (GRUB_ERR_BAD_ARGUMENT, "kernel without label"); menu->entries->kernel_file = grub_strdup (line); if (!menu->entries->kernel_file) return grub_errno; menu->entries->entry_type = KERNEL_CHAINLOADER; return GRUB_ERR_NONE; } static grub_err_t cmd_bss (const char *line, struct syslinux_menu *menu) { if (!menu->entries) return grub_error (GRUB_ERR_BAD_ARGUMENT, "kernel without label"); menu->entries->kernel_file = grub_strdup (line); if (!menu->entries->kernel_file) return grub_errno; menu->entries->entry_type = KERNEL_CHAINLOADER_BPB; return GRUB_ERR_NONE; } static grub_err_t cmd_pxe (const char *line, struct syslinux_menu *menu) { if (!menu->entries) return grub_error (GRUB_ERR_BAD_ARGUMENT, "kernel without label"); menu->entries->kernel_file = grub_strdup (line); if (!menu->entries->kernel_file) return grub_errno; menu->entries->entry_type = KERNEL_PXE; return GRUB_ERR_NONE; } static grub_err_t cmd_fdimage (const char *line, struct syslinux_menu *menu) { if (!menu->entries) return grub_error (GRUB_ERR_BAD_ARGUMENT, "kernel without label"); menu->entries->kernel_file = grub_strdup (line); if (!menu->entries->kernel_file) return grub_errno; menu->entries->entry_type = KERNEL_IMG; return GRUB_ERR_NONE; } static grub_err_t cmd_comboot (const char *line, struct syslinux_menu *menu) { if (!menu->entries) return grub_error (GRUB_ERR_BAD_ARGUMENT, "kernel without label"); menu->entries->kernel_file = grub_strdup (line); if (!menu->entries->kernel_file) return grub_errno; menu->entries->entry_type = KERNEL_COM; return GRUB_ERR_NONE; } static grub_err_t cmd_com32 (const char *line, struct syslinux_menu *menu) { if (!menu->entries) return grub_error (GRUB_ERR_BAD_ARGUMENT, "kernel without label"); menu->entries->kernel_file = grub_strdup (line); if (!menu->entries->kernel_file) return grub_errno; menu->entries->entry_type = KERNEL_COM32; return GRUB_ERR_NONE; } static grub_err_t cmd_config (const char *line, struct syslinux_menu *menu) { const char *space; if (!menu->entries) return grub_error (GRUB_ERR_BAD_ARGUMENT, "kernel without label"); for (space = line; *space && !grub_isspace (*space); space++); menu->entries->kernel_file = grub_strndup (line, space - line); if (!menu->entries->kernel_file) return grub_errno; for (; *space && grub_isspace (*space); space++); if (*space) { menu->entries->argument = grub_strdup (space); if (!menu->entries->argument) return grub_errno; } menu->entries->entry_type = KERNEL_CONFIG; return GRUB_ERR_NONE; } static grub_err_t cmd_append (const char *line, struct syslinux_menu *menu) { if (!menu->entries) return grub_error (GRUB_ERR_BAD_ARGUMENT, "kernel without label"); menu->entries->append = grub_strdup (line); if (!menu->entries->append) return grub_errno; return GRUB_ERR_NONE; } static grub_err_t cmd_initrd (const char *line, struct syslinux_menu *menu) { struct initrd_list *ninitrd; const char *comma; if (!menu->entries) return grub_error (GRUB_ERR_BAD_ARGUMENT, "kernel without label"); while (*line) { for (comma = line; *comma && *comma != ','; comma++); ninitrd = grub_malloc (sizeof (*ninitrd)); if (!ninitrd) return grub_errno; ninitrd->file = grub_strndup (line, comma - line); if (!ninitrd->file) { grub_free (ninitrd); return grub_errno; } ninitrd->next = NULL; if (menu->entries->initrds_last) menu->entries->initrds_last->next = ninitrd; else { menu->entries->initrds_last = ninitrd; menu->entries->initrds = ninitrd; } line = comma; while (*line == ',') line++; } return GRUB_ERR_NONE; } static grub_err_t cmd_default (const char *line, struct syslinux_menu *menu) { menu->def = grub_strdup (line); if (!menu->def) return grub_errno; return GRUB_ERR_NONE; } static grub_err_t cmd_timeout (const char *line, struct syslinux_menu *menu) { menu->timeout = grub_strtoul (line, NULL, 0); return GRUB_ERR_NONE; } static grub_err_t cmd_menudefault (const char *line __attribute__ ((unused)), struct syslinux_menu *menu) { if (!menu->entries) return grub_error (GRUB_ERR_BAD_ARGUMENT, "kernel without label"); menu->entries->make_default = 1; return GRUB_ERR_NONE; } static grub_err_t cmd_menubackground (const char *line, struct syslinux_menu *menu) { menu->background = grub_strdup (line); return GRUB_ERR_NONE; } static grub_err_t cmd_localboot (const char *line, struct syslinux_menu *menu) { if (!menu->entries) return grub_error (GRUB_ERR_BAD_ARGUMENT, "kernel without label"); menu->entries->kernel_file = grub_strdup (line); if (!menu->entries->kernel_file) return grub_errno; menu->entries->entry_type = LOCALBOOT; return GRUB_ERR_NONE; } static grub_err_t cmd_extlabel (const char *line, struct syslinux_menu *menu) { const char *in; char *out; if (!menu->entries) return grub_error (GRUB_ERR_BAD_ARGUMENT, "kernel without label"); menu->entries->extlabel = grub_malloc (grub_strlen (line) + 1); if (!menu->entries->extlabel) return grub_errno; in = line; out = menu->entries->extlabel; while (*in) { if (in[0] == '^' && in[1]) { menu->entries->hotkey = grub_tolower (in[1]); in++; } *out++ = *in++; } *out = 0; return GRUB_ERR_NONE; } static grub_err_t cmd_say (const char *line, struct syslinux_menu *menu) { struct syslinux_say *nsay; nsay = grub_malloc (sizeof (*nsay) + grub_strlen (line) + 1); if (!nsay) return grub_errno; nsay->prev = NULL; if (menu->entries) { nsay->next = menu->entries->say; menu->entries->say = nsay; } else { nsay->next = menu->say; menu->say = nsay; } if (nsay->next) nsay->next->prev = nsay; grub_memcpy (nsay->msg, line, grub_strlen (line) + 1); return GRUB_ERR_NONE; } static char * get_read_filename (struct syslinux_menu *menu, const char *filename) { return grub_xasprintf ("%s/%s", filename[0] == '/' ? menu->root_read_directory : menu->current_read_directory, filename); } static char * get_target_filename (struct syslinux_menu *menu, const char *filename) { return grub_xasprintf ("%s/%s", filename[0] == '/' ? menu->root_target_directory : menu->current_target_directory, filename); } static grub_err_t syslinux_parse (const char *filename, struct syslinux_menu *menu) { const char *old_filename = menu->filename; grub_err_t ret; char *nf; nf = get_read_filename (menu, filename); if (!nf) return grub_errno; menu->filename = nf; ret = syslinux_parse_real (menu); if (ret == GRUB_ERR_FILE_NOT_FOUND || ret == GRUB_ERR_BAD_FILENAME) { grub_errno = ret = GRUB_ERR_NONE; add_comment (menu, "# File ", 0); add_comment (menu, nf, 0); add_comment (menu, " not found", 1); } grub_free (nf); menu->filename = old_filename; return ret; } struct { const char *name1; const char *name2; grub_err_t (*parse) (const char *line, struct syslinux_menu *menu); } commands[] = { /* FIXME: support tagname. */ {"include", NULL, syslinux_parse}, {"menu", "include", syslinux_parse}, {"label", NULL, label}, {"kernel", NULL, kernel}, {"linux", NULL, cmd_linux}, {"boot", NULL, cmd_boot}, {"bss", NULL, cmd_bss}, {"pxe", NULL, cmd_pxe}, {"fdimage", NULL, cmd_fdimage}, {"comboot", NULL, cmd_comboot}, {"com32", NULL, cmd_com32}, {"config", NULL, cmd_config}, {"append", NULL, cmd_append}, /* FIXME: ipappend not supported. */ {"localboot", NULL, cmd_localboot}, {"initrd", NULL, cmd_initrd}, {"default", NULL, cmd_default}, {"menu", "label", cmd_extlabel}, /* FIXME: MENU LABEL not supported. */ /* FIXME: MENU HIDDEN not supported. */ /* FIXME: MENU SEPARATOR not supported. */ /* FIXME: MENU INDENT not supported. */ /* FIXME: MENU DISABLE not supported. */ /* FIXME: MENU HIDE not supported. */ {"menu", "default", cmd_menudefault}, /* FIXME: MENU PASSWD not supported. */ /* FIXME: MENU MASTER PASSWD not supported. */ {"menu", "background", cmd_menubackground}, /* FIXME: MENU BEGIN not supported. */ /* FIXME: MENU GOTO not supported. */ /* FIXME: MENU EXIT not supported. */ /* FIXME: MENU QUIT not supported. */ /* FIXME: MENU START not supported. */ /* FIXME: MENU AUTOBOOT not supported. */ /* FIXME: MENU TABMSG not supported. */ /* FIXME: MENU NOTABMSG not supported. */ /* FIXME: MENU PASSPROMPT not supported. */ /* FIXME: MENU COLOR not supported. */ /* FIXME: MENU MSGCOLOR not supported. */ /* FIXME: MENU WIDTH not supported. */ /* FIXME: MENU MARGIN not supported. */ /* FIXME: MENU PASSWORDMARGIN not supported. */ /* FIXME: MENU ROWS not supported. */ /* FIXME: MENU TABMSGROW not supported. */ /* FIXME: MENU CMDLINEROW not supported. */ /* FIXME: MENU ENDROW not supported. */ /* FIXME: MENU PASSWORDROW not supported. */ /* FIXME: MENU TIMEOUTROW not supported. */ /* FIXME: MENU HELPMSGROW not supported. */ /* FIXME: MENU HELPMSGENDROW not supported. */ /* FIXME: MENU HIDDENROW not supported. */ /* FIXME: MENU HSHIFT not supported. */ /* FIXME: MENU VSHIFT not supported. */ {"timeout", NULL, cmd_timeout}, /* FIXME: TOTALTIMEOUT not supported. */ /* FIXME: ONTIMEOUT not supported. */ /* FIXME: ONERROR not supported. */ /* FIXME: SERIAL not supported. */ /* FIXME: CONSOLE not supported. */ /* FIXME: FONT not supported. */ /* FIXME: KBDMAP not supported. */ {"say", NULL, cmd_say}, /* FIXME: DISPLAY not supported. */ /* FIXME: F* not supported. */ /* Commands to control interface behaviour which aren't needed with GRUB. If they are important in your environment please contact GRUB team. */ {"prompt", NULL, NULL}, {"nocomplete", NULL, NULL}, {"noescape", NULL, NULL}, {"implicit", NULL, NULL}, {"allowoptions", NULL, NULL} }; static grub_err_t helptext (const char *line, grub_file_t file, struct syslinux_menu *menu) { char *help; char *buf = NULL; grub_size_t helplen, alloclen = 0; help = grub_strdup (line); if (!help) return grub_errno; helplen = grub_strlen (line); while ((grub_free (buf), buf = grub_file_getline (file))) { char *ptr; grub_size_t needlen; for (ptr = buf; *ptr && grub_isspace (*ptr); ptr++); if (grub_strncasecmp (ptr, "endtext", sizeof ("endtext") - 1) == 0) { ptr += sizeof ("endtext") - 1; for (; *ptr && (grub_isspace (*ptr) || *ptr == '\n' || *ptr == '\r'); ptr++); if (!*ptr) { menu->entries->help = help; grub_free (buf); return GRUB_ERR_NONE; } } needlen = helplen + 1 + grub_strlen (buf); if (alloclen < needlen) { alloclen = 2 * needlen; help = grub_realloc (help, alloclen); if (!help) { grub_free (buf); return grub_errno; } } helplen += grub_stpcpy (help + helplen, buf) - (help + helplen); } grub_free (buf); grub_free (help); return grub_errno; } static grub_err_t syslinux_parse_real (struct syslinux_menu *menu) { grub_file_t file; char *buf = NULL; grub_err_t err = GRUB_ERR_NONE; file = grub_file_open (menu->filename, GRUB_FILE_TYPE_CONFIG); if (!file) return grub_errno; while ((grub_free (buf), buf = grub_file_getline (file))) { const char *ptr1, *ptr2, *ptr3, *ptr4, *ptr5; char *end; unsigned i; end = buf + grub_strlen (buf); while (end > buf && (end[-1] == '\n' || end[-1] == '\r')) end--; *end = 0; for (ptr1 = buf; *ptr1 && grub_isspace (*ptr1); ptr1++); if (*ptr1 == '#' || *ptr1 == 0) { err = add_comment (menu, ptr1, 1); if (err) goto fail; continue; } for (ptr2 = ptr1; !grub_isspace (*ptr2) && *ptr2; ptr2++); for (ptr3 = ptr2; grub_isspace (*ptr3) && *ptr3; ptr3++); for (ptr4 = ptr3; !grub_isspace (*ptr4) && *ptr4; ptr4++); for (ptr5 = ptr4; grub_isspace (*ptr5) && *ptr5; ptr5++); for (i = 0; i < ARRAY_SIZE(commands); i++) if (grub_strlen (commands[i].name1) == (grub_size_t) (ptr2 - ptr1) && grub_strncasecmp (commands[i].name1, ptr1, ptr2 - ptr1) == 0 && (commands[i].name2 == NULL || (grub_strlen (commands[i].name2) == (grub_size_t) (ptr4 - ptr3) && grub_strncasecmp (commands[i].name2, ptr3, ptr4 - ptr3) == 0))) break; if (i == ARRAY_SIZE(commands)) { if (sizeof ("text") - 1 == ptr2 - ptr1 && grub_strncasecmp ("text", ptr1, ptr2 - ptr1) == 0 && (sizeof ("help") - 1 == ptr4 - ptr3 && grub_strncasecmp ("help", ptr3, ptr4 - ptr3) == 0)) { if (helptext (ptr5, file, menu)) { grub_free (buf); return 1; } continue; } add_comment (menu, " # UNSUPPORTED command '", 0); add_comment (menu, ptr1, 0); add_comment (menu, "'", 1); continue; } if (commands[i].parse) { err = commands[i].parse (commands[i].name2 ? ptr5 : ptr3, menu); if (err) goto fail; } } fail: grub_file_close (file); grub_free (buf); return err; } static grub_err_t print_escaped (struct output_buffer *outbuf, const char *from, const char *to) { const char *ptr; grub_err_t err; if (!to) to = from + grub_strlen (from); err = ensure_space (outbuf, (to - from) * 4 + 2); if (err) return err; outbuf->buf[outbuf->ptr++] = '\''; for (ptr = from; *ptr && ptr < to; ptr++) { if (*ptr == '\'') { outbuf->buf[outbuf->ptr++] = '\''; outbuf->buf[outbuf->ptr++] = '\\'; outbuf->buf[outbuf->ptr++] = '\''; outbuf->buf[outbuf->ptr++] = '\''; } else outbuf->buf[outbuf->ptr++] = *ptr; } outbuf->buf[outbuf->ptr++] = '\''; return GRUB_ERR_NONE; } static grub_err_t print_file (struct output_buffer *outbuf, struct syslinux_menu *menu, const char *from, const char *to) { grub_err_t err; if (!to) to = from + grub_strlen (from); err = print_escaped (outbuf, from[0] == '/' ? menu->root_target_directory : menu->current_target_directory, NULL); if (err) return err; err = print (outbuf, "/", 1); if (err) return err; return print_escaped (outbuf, from, to); } /* * Makefile.am mimics this when generating tests/syslinux/ubuntu10.04_grub.cfg, * so changes here may need to be reflected there too. */ static void simplify_filename (char *str) { char *iptr, *optr = str; for (iptr = str; *iptr; iptr++) { if (*iptr == '/' && optr != str && optr[-1] == '/') continue; if (iptr[0] == '/' && iptr[1] == '.' && iptr[2] == '/') { iptr += 2; continue; } if (iptr[0] == '/' && iptr[1] == '.' && iptr[2] == '.' && iptr[3] == '/') { iptr += 3; while (optr >= str && *optr != '/') optr--; if (optr < str) { str[0] = '/'; optr = str; } optr++; continue; } *optr++ = *iptr; } *optr = '\0'; } static grub_err_t print_config (struct output_buffer *outbuf, struct syslinux_menu *menu, const char *filename, const char *basedir) { struct syslinux_menu *menuptr; grub_err_t err = GRUB_ERR_NONE; char *new_cwd = NULL; char *new_target_cwd = NULL; char *newname = NULL; int depth = 0; new_cwd = get_read_filename (menu, basedir); if (!new_cwd) { err = grub_errno; goto out; } new_target_cwd = get_target_filename (menu, basedir); if (!new_target_cwd) { err = grub_errno; goto out; } newname = get_read_filename (menu, filename); if (!newname) { err = grub_errno; goto out; } simplify_filename (newname); print_string ("#"); print_file (outbuf, menu, filename, NULL); print_string (" "); err = print (outbuf, newname, grub_strlen (newname)); if (err) return err; print_string (":\n"); for (menuptr = menu; menuptr; menuptr = menuptr->parent, depth++) if (grub_strcmp (menuptr->filename, newname) == 0 || depth > 20) break; if (menuptr) { print_string (" syslinux_configfile -r "); print_file (outbuf, menu, "/", NULL); print_string (" -c "); print_file (outbuf, menu, basedir, NULL); print_string (" "); print_file (outbuf, menu, filename, NULL); print_string ("\n"); } else { err = config_file (outbuf, menu->root_read_directory, menu->root_target_directory, new_cwd, new_target_cwd, newname, menu, menu->flavour); if (err == GRUB_ERR_FILE_NOT_FOUND || err == GRUB_ERR_BAD_FILENAME) { grub_errno = err = GRUB_ERR_NONE; print_string ("# File "); err = print (outbuf, newname, grub_strlen (newname)); if (err) goto out; print_string (" not found\n"); } } out: grub_free (newname); grub_free (new_cwd); grub_free (new_target_cwd); return err; } static grub_err_t write_entry (struct output_buffer *outbuf, struct syslinux_menu *menu, struct syslinux_menuentry *curentry) { grub_err_t err; if (curentry->comments) { err = print (outbuf, curentry->comments, grub_strlen (curentry->comments)); if (err) return err; } { struct syslinux_say *say; for (say = curentry->say; say && say->next; say = say->next); for (; say && say->prev; say = say->prev) { print_string ("echo "); if (print_escaped (outbuf, say->msg, NULL)) return grub_errno; print_string ("\n"); } } /* FIXME: support help text. */ switch (curentry->entry_type) { case KERNEL_LINUX: { const char *ptr; const char *initrd = NULL, *initrde= NULL; for (ptr = curentry->append; ptr && *ptr; ptr++) if ((ptr == curentry->append || grub_isspace (ptr[-1])) && grub_strncasecmp (ptr, "initrd=", sizeof ("initrd=") - 1) == 0) break; if (ptr && *ptr) { initrd = ptr + sizeof ("initrd=") - 1; for (initrde = initrd; *initrde && !grub_isspace (*initrde); initrde++); } print_string (" if test x$grub_platform = xpc; then " "linux_suffix=16; else linux_suffix= ; fi\n"); print_string (" linux$linux_suffix "); print_file (outbuf, menu, curentry->kernel_file, NULL); print_string (" "); if (curentry->append) { err = print (outbuf, curentry->append, grub_strlen (curentry->append)); if (err) return err; } print_string ("\n"); if (initrd || curentry->initrds) { struct initrd_list *lst; print_string (" initrd$linux_suffix "); if (initrd) { print_file (outbuf, menu, initrd, initrde); print_string (" "); } for (lst = curentry->initrds; lst; lst = lst->next) { print_file (outbuf, menu, lst->file, NULL); print_string (" "); } print_string ("\n"); } } break; case KERNEL_CHAINLOADER: print_string (" chainloader "); print_file (outbuf, menu, curentry->kernel_file, NULL); print_string ("\n"); break; case KERNEL_CHAINLOADER_BPB: print_string (" chainloader --bpb "); print_file (outbuf, menu, curentry->kernel_file, NULL); print_string ("\n"); break; case LOCALBOOT: /* FIXME: support -1. */ /* FIXME: PXELINUX. */ { int n = grub_strtol (curentry->kernel_file, NULL, 0); if (n >= 0 && n <= 0x02) { print_string (" root=fd"); if (print_num (outbuf, n)) return grub_errno; print_string (";\n chainloader +1;\n"); break; } if (n >= 0x80 && n < 0x8a) { print_string (" root=hd"); if (print_num (outbuf, n - 0x80)) return grub_errno; print_string (";\n chainloader +1;\n"); break; } print_string (" # UNSUPPORTED localboot type "); print_string ("\ntrue;\n"); if (print_num (outbuf, n)) return grub_errno; print_string ("\n"); break; } case KERNEL_COM32: case KERNEL_COM: { char *basename = NULL; { char *ptr; for (ptr = curentry->kernel_file; *ptr; ptr++) if (*ptr == '/' || *ptr == '\\') basename = ptr; } if (!basename) basename = curentry->kernel_file; else basename++; if (grub_strcasecmp (basename, "chain.c32") == 0) { char *file = NULL; int is_fd = -1, devn = 0; int part = -1; int swap = 0; char *ptr; for (ptr = curentry->append; *ptr; ) { while (grub_isspace (*ptr)) ptr++; /* FIXME: support mbr: and boot. */ if (ptr[0] == 'h' && ptr[1] == 'd') { is_fd = 0; devn = grub_strtoul (ptr + 2, (const char **)&ptr, 0); continue; } if (grub_strncasecmp (ptr, "file=", 5) == 0) { file = ptr + 5; for (ptr = file; *ptr && !grub_isspace (*ptr); ptr++); if (*ptr) { *ptr = 0; ptr++; } continue; } if (grub_strncasecmp (ptr, "swap", sizeof ("swap") - 1) == 0) { swap = 1; ptr += sizeof ("swap") - 1; continue; } if (ptr[0] == 'f' && ptr[1] == 'd') { is_fd = 1; devn = grub_strtoul (ptr + 2, (const char **)&ptr, 0); continue; } if (grub_isdigit (ptr[0])) { part = grub_strtoul (ptr, (const char **)&ptr, 0); continue; } /* FIXME: isolinux, ntldr, cmldr, *dos, seg, hide FIXME: sethidden. */ print_string (" # UNSUPPORTED option "); if (print (outbuf, ptr, grub_strlen (ptr))) return 0; print_string ("\n"); break; } if (is_fd == -1) { print_string (" # no drive specified\n"); break; } if (!*ptr) { print_string (is_fd ? " root=fd": " root=hd"); if (print_num (outbuf, devn)) return grub_errno; if (part != -1) { print_string (","); if (print_num (outbuf, part + 1)) return grub_errno; } print_string (";\n"); if (file) { print_string (" chainloader "); print_file (outbuf, menu, file, NULL); print_string (";\n"); } else print_string (" chainloader +1;\n"); if (swap) print_string (" drivemap -s hd0 \"root\";\n"); } break; } if (grub_strcasecmp (basename, "mboot.c32") == 0) { char *ptr; int first = 1; int is_kernel = 1; for (ptr = curentry->append; *ptr; ) { char *ptrr = ptr; while (*ptr && !grub_isspace (*ptr)) ptr++; if (ptrr + 2 == ptr && ptrr[0] == '-' && ptrr[1] == '-') { print_string ("\n"); first = 1; continue; } if (first) { if (is_kernel) print_string (" multiboot "); else print_string (" module "); first = 0; is_kernel = 0; if (print_file (outbuf, menu, ptrr, ptr)) return grub_errno; continue; } if (print_escaped (outbuf, ptrr, ptr)) return grub_errno; } break; } if (grub_strcasecmp (basename, "ifcpu64.c32") == 0) { char *lm, *lme, *pae = 0, *paee = 0, *i386s = 0, *i386e = 0; char *ptr; ptr = curentry->append; while (grub_isspace (*ptr)) ptr++; lm = ptr; while (*ptr && !grub_isspace (*ptr)) ptr++; lme = ptr; while (grub_isspace (*ptr)) ptr++; if (ptr[0] == '-' && ptr[1] == '-') { ptr += 2; while (grub_isspace (*ptr)) ptr++; pae = ptr; while (*ptr && !grub_isspace (*ptr)) ptr++; paee = ptr; } while (grub_isspace (*ptr)) ptr++; if (ptr[0] == '-' && ptr[1] == '-') { ptr += 2; while (grub_isspace (*ptr)) ptr++; i386s = ptr; while (*ptr && !grub_isspace (*ptr)) ptr++; i386e = ptr; } *lme = '\0'; if (paee) *paee = '\0'; if (i386e) *i386e = '\0'; if (!i386s) { i386s = pae; pae = 0; } print_string ("if cpuid --long-mode; then true;\n"); if (print_entry (outbuf, menu, lm)) return grub_errno; if (pae) { print_string ("elif cpuid --pae; then true;\n"); if (print_entry (outbuf, menu, pae)) return grub_errno; } print_string ("else\n"); if (print_entry (outbuf, menu, i386s)) return grub_errno; print_string ("fi\n"); break; } if (grub_strcasecmp (basename, "reboot.c32") == 0) { print_string (" reboot\n"); break; } if (grub_strcasecmp (basename, "poweroff.com") == 0) { print_string (" halt\n"); break; } if (grub_strcasecmp (basename, "whichsys.c32") == 0) { grub_syslinux_flavour_t flavour = GRUB_SYSLINUX_ISOLINUX; const char *flav[] = { [GRUB_SYSLINUX_ISOLINUX] = "iso", [GRUB_SYSLINUX_PXELINUX] = "pxe", [GRUB_SYSLINUX_SYSLINUX] = "sys" }; char *ptr; for (ptr = curentry->append; *ptr; ) { char *bptr, c; while (grub_isspace (*ptr)) ptr++; if (grub_strncasecmp (ptr, "-iso-", 5) == 0) { ptr += sizeof ("-iso-") - 1; flavour = GRUB_SYSLINUX_ISOLINUX; continue; } if (grub_strncasecmp (ptr, "-pxe-", 5) == 0) { ptr += sizeof ("-pxe-") - 1; flavour = GRUB_SYSLINUX_PXELINUX; continue; } if (grub_strncasecmp (ptr, "-sys-", 5) == 0) { ptr += sizeof ("-sys-") - 1; flavour = GRUB_SYSLINUX_SYSLINUX; continue; } bptr = ptr; while (*ptr && !grub_isspace (*ptr)) ptr++; c = *ptr; *ptr = '\0'; if (menu->flavour == GRUB_SYSLINUX_UNKNOWN && flavour == GRUB_SYSLINUX_ISOLINUX) { print_string ("if [ x$syslinux_flavour = xiso -o x$syslinux_flavour = x ]; then true;\n"); menu->flavour = GRUB_SYSLINUX_ISOLINUX; print_entry (outbuf, menu, bptr); menu->flavour = GRUB_SYSLINUX_UNKNOWN; print_string ("fi\n"); } else if (menu->flavour == GRUB_SYSLINUX_UNKNOWN) { print_string ("if [ x$syslinux_flavour = x"); err = print (outbuf, flav[flavour], grub_strlen (flav[flavour])); if (err) return err; print_string (" ]; then true;\n"); menu->flavour = flavour; print_entry (outbuf, menu, bptr); menu->flavour = GRUB_SYSLINUX_UNKNOWN; print_string ("fi\n"); } if (menu->flavour != GRUB_SYSLINUX_UNKNOWN && menu->flavour == flavour) print_entry (outbuf, menu, bptr); *ptr = c; } break; } if (grub_strcasecmp (basename, "menu.c32") == 0 || grub_strcasecmp (basename, "vesamenu.c32") == 0) { char *ptr; char *end; ptr = curentry->append; if (!ptr) return grub_errno; while (*ptr) { end = ptr; for (end = ptr; *end && !grub_isspace (*end); end++); if (*end) *end++ = '\0'; /* "~" is supposed to be current file, so let's skip it */ if (grub_strcmp (ptr, "~") != 0) { err = print_config (outbuf, menu, ptr, ""); if (err != GRUB_ERR_NONE) break; } for (ptr = end; *ptr && grub_isspace (*ptr); ptr++); } err = GRUB_ERR_NONE; break; } /* FIXME: gdb, GFXBoot, Hdt, Ifcpu, Ifplop, Kbdmap, FIXME: Linux, Lua, Meminfo, rosh, Sanbboot */ print_string (" # UNSUPPORTED com(32) "); err = print (outbuf, basename, grub_strlen (basename)); if (err) return err; print_string ("\ntrue;\n"); break; } case KERNEL_CONFIG: { const char *ap; ap = curentry->append; if (!ap) ap = curentry->argument; if (!ap) ap = ""; print_config (outbuf, menu, curentry->kernel_file, ap); } break; case KERNEL_NO_KERNEL: /* FIXME: support this. */ case KERNEL_BIN: case KERNEL_PXE: case KERNEL_IMG: print_string (" # UNSUPPORTED entry type "); if (print_num (outbuf, curentry->entry_type)) return grub_errno; print_string ("\ntrue;\n"); break; } return GRUB_ERR_NONE; } static grub_err_t print_entry (struct output_buffer *outbuf, struct syslinux_menu *menu, const char *str) { struct syslinux_menuentry *curentry; for (curentry = menu->entries; curentry; curentry = curentry->next) if (grub_strcasecmp (curentry->label, str) == 0) { grub_err_t err; err = write_entry (outbuf, menu, curentry); if (err) return err; } return GRUB_ERR_NONE; } static void free_menu (struct syslinux_menu *menu) { struct syslinux_say *say, *nsay; struct syslinux_menuentry *entry, *nentry; grub_free (menu->def); grub_free (menu->comments); grub_free (menu->background); for (say = menu->say; say ; say = nsay) { nsay = say->next; grub_free (say); } for (entry = menu->entries; entry ; entry = nentry) { nentry = entry->next; struct initrd_list *initrd, *ninitrd; for (initrd = entry->initrds; initrd ; initrd = ninitrd) { ninitrd = initrd->next; grub_free (initrd->file); grub_free (initrd); } grub_free (entry->comments); grub_free (entry->kernel_file); grub_free (entry->label); grub_free (entry->extlabel); grub_free (entry->append); grub_free (entry->help); grub_free (entry); } } static grub_err_t config_file (struct output_buffer *outbuf, const char *root, const char *target_root, const char *cwd, const char *target_cwd, const char *fname, struct syslinux_menu *parent, grub_syslinux_flavour_t flav) { grub_err_t err; struct syslinux_menu menu; struct syslinux_menuentry *curentry, *lentry; struct syslinux_say *say; grub_memset (&menu, 0, sizeof (menu)); menu.flavour = flav; menu.root_read_directory = root; menu.root_target_directory = target_root; menu.current_read_directory = cwd; menu.current_target_directory = target_cwd; menu.filename = fname; menu.parent = parent; err = syslinux_parse_real (&menu); if (err) return err; for (say = menu.say; say && say->next; say = say->next); for (; say && say->prev; say = say->prev) { print_string ("echo "); err = print_escaped (outbuf, say->msg, NULL); if (err) return err; print_string ("\n"); } if (menu.background) { print_string (" background_image "); err = print_file (outbuf, &menu, menu.background, NULL); if (err) return err; print_string ("\n"); } if (menu.comments) { err = print (outbuf, menu.comments, grub_strlen (menu.comments)); if (err) return err; } if (menu.timeout == 0 && menu.entries && menu.def) { err = print_entry (outbuf, &menu, menu.def); if (err) return err; } else if (menu.entries) { for (curentry = menu.entries; curentry->next; curentry = curentry->next); lentry = curentry; print_string ("set timeout="); err = print_num (outbuf, (menu.timeout + 9) / 10); if (err) return err; print_string ("\n"); if (menu.def) { print_string (" default="); err = print_escaped (outbuf, menu.def, NULL); if (err) return err; print_string ("\n"); } for (curentry = lentry; curentry; curentry = curentry->prev) { print_string ("menuentry "); err = print_escaped (outbuf, curentry->extlabel ? : curentry->label, NULL); if (err) return err; if (curentry->hotkey) { char hk[] = { curentry->hotkey, '\0' }; print_string (" --hotkey '"); print_string (hk); print_string ("'"); } print_string (" --id "); err = print_escaped (outbuf, curentry->label, NULL); if (err) return err; print_string (" {\n"); err = write_entry (outbuf, &menu, curentry); if (err) return err; print_string ("}\n"); } } free_menu (&menu); return GRUB_ERR_NONE; } char * grub_syslinux_config_file (const char *base, const char *target_base, const char *cwd, const char *target_cwd, const char *fname, grub_syslinux_flavour_t flav) { struct output_buffer outbuf = { 0, 0, 0 }; grub_err_t err; err = config_file (&outbuf, base, target_base, cwd, target_cwd, fname, NULL, flav); if (err) return NULL; err = print (&outbuf, "\0", 1); if (err) return NULL; return outbuf.buf; } grub-2.14~git20250718.0e36779/grub-core/lib/fake_module.c0000644000175000017500000000025515000202015017033 00000000000000/* This file is intentionally empty: it's used to generate modules with no code or data. (purely dependency modules) */ #include GRUB_MOD_LICENSE ("GPLv3+"); grub-2.14~git20250718.0e36779/grub-core/lib/tss2/0000755000175000017500000000000015036452576015421 500000000000000grub-2.14~git20250718.0e36779/grub-core/lib/tss2/tss2_mu.c0000644000175000017500000010366015036447510017077 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (C) 2022 Microsoft Corporation * Copyright (C) 2024 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include void grub_Tss2_MU_TPMS_AUTH_COMMAND_Marshal (grub_tpm2_buffer_t buffer, const TPMS_AUTH_COMMAND_t *authCommand) { grub_uint32_t start; grub_uint32_t tmp; grub_tpm2_buffer_pack_u32 (buffer, 0); start = buffer->size; grub_tpm2_buffer_pack_u32 (buffer, authCommand->sessionHandle); grub_tpm2_buffer_pack_u16 (buffer, authCommand->nonce.size); grub_tpm2_buffer_pack (buffer, authCommand->nonce.buffer, authCommand->nonce.size); grub_tpm2_buffer_pack_u8 (buffer, *((const grub_uint8_t *) &authCommand->sessionAttributes)); grub_tpm2_buffer_pack_u16 (buffer, authCommand->hmac.size); grub_tpm2_buffer_pack (buffer, authCommand->hmac.buffer, authCommand->hmac.size); tmp = grub_cpu_to_be32 (buffer->size - start); grub_memcpy (&buffer->data[start - sizeof (grub_uint32_t)], &tmp, sizeof (tmp)); } void grub_Tss2_MU_TPM2B_Marshal (grub_tpm2_buffer_t buffer, const grub_uint16_t size, const grub_uint8_t *b) { grub_uint16_t i; grub_tpm2_buffer_pack_u16 (buffer, size); for (i = 0; i < size; i++) grub_tpm2_buffer_pack_u8 (buffer, b[i]); } void grub_Tss2_MU_TPMU_SYM_KEY_BITS_Marshal (grub_tpm2_buffer_t buffer, const TPMI_ALG_SYM_OBJECT_t algorithm, const TPMU_SYM_KEY_BITS_t *p) { switch (algorithm) { case TPM_ALG_AES: case TPM_ALG_SM4: case TPM_ALG_CAMELLIA: case TPM_ALG_XOR: grub_tpm2_buffer_pack_u16 (buffer, *((const grub_uint16_t *) p)); break; case TPM_ALG_NULL: break; default: buffer->error = 1; break; } } void grub_Tss2_MU_TPMU_SYM_MODE_Marshal (grub_tpm2_buffer_t buffer, const TPMI_ALG_SYM_OBJECT_t algorithm, const TPMU_SYM_MODE_t *p) { switch (algorithm) { case TPM_ALG_AES: case TPM_ALG_SM4: case TPM_ALG_CAMELLIA: grub_tpm2_buffer_pack_u16 (buffer, *((const grub_uint16_t *) p)); break; case TPM_ALG_XOR: case TPM_ALG_NULL: break; default: buffer->error = 1; break; } } void grub_Tss2_MU_TPMT_SYM_DEF_Marshal (grub_tpm2_buffer_t buffer, const TPMT_SYM_DEF_t *p) { grub_tpm2_buffer_pack_u16 (buffer, p->algorithm); grub_Tss2_MU_TPMU_SYM_KEY_BITS_Marshal (buffer, p->algorithm, &p->keyBits); grub_Tss2_MU_TPMU_SYM_MODE_Marshal (buffer, p->algorithm, &p->mode); } void grub_Tss2_MU_TPMS_PCR_SELECTION_Marshal (grub_tpm2_buffer_t buffer, const TPMS_PCR_SELECTION_t *pcrSelection) { grub_uint32_t i; grub_tpm2_buffer_pack_u16 (buffer, pcrSelection->hash); grub_tpm2_buffer_pack_u8 (buffer, pcrSelection->sizeOfSelect); for (i = 0; i < pcrSelection->sizeOfSelect; i++) grub_tpm2_buffer_pack_u8 (buffer, pcrSelection->pcrSelect[i]); } void grub_Tss2_MU_TPML_PCR_SELECTION_Marshal (grub_tpm2_buffer_t buffer, const TPML_PCR_SELECTION_t *pcrSelection) { grub_uint32_t i; grub_tpm2_buffer_pack_u32 (buffer, pcrSelection->count); for (i = 0; i < pcrSelection->count; i++) grub_Tss2_MU_TPMS_PCR_SELECTION_Marshal (buffer, &pcrSelection->pcrSelections[i]); } void grub_Tss2_MU_TPMA_OBJECT_Marshal (grub_tpm2_buffer_t buffer, const TPMA_OBJECT_t *p) { grub_tpm2_buffer_pack_u32 (buffer, *((const grub_uint32_t *) p)); } void grub_Tss2_MU_TPMS_SCHEME_XOR_Marshal (grub_tpm2_buffer_t buffer, const TPMS_SCHEME_XOR_t *p) { grub_tpm2_buffer_pack_u16 (buffer, p->hashAlg); grub_tpm2_buffer_pack_u16 (buffer, p->kdf); } void grub_Tss2_MU_TPMS_SCHEME_HMAC_Marshal (grub_tpm2_buffer_t buffer, const TPMS_SCHEME_HMAC_t *p) { grub_tpm2_buffer_pack_u16 (buffer, p->hashAlg); } void grub_Tss2_MU_TPMU_SCHEME_KEYEDHASH_Marshal (grub_tpm2_buffer_t buffer, const TPMI_ALG_KEYEDHASH_SCHEME_t scheme, const TPMU_SCHEME_KEYEDHASH_t *p) { switch (scheme) { case TPM_ALG_HMAC: grub_Tss2_MU_TPMS_SCHEME_HMAC_Marshal (buffer, &p->hmac); break; case TPM_ALG_XOR: grub_Tss2_MU_TPMS_SCHEME_XOR_Marshal (buffer, &p->exclusiveOr); break; case TPM_ALG_NULL: break; default: buffer->error = 1; break; } } void grub_Tss2_MU_TPMT_KEYEDHASH_SCHEME_Marshal (grub_tpm2_buffer_t buffer, const TPMT_KEYEDHASH_SCHEME_t *p) { grub_tpm2_buffer_pack_u16 (buffer, p->scheme); grub_Tss2_MU_TPMU_SCHEME_KEYEDHASH_Marshal (buffer, p->scheme, &p->details); } void grub_Tss2_MU_TPMS_KEYEDHASH_PARMS_Marshal (grub_tpm2_buffer_t buffer, const TPMS_KEYEDHASH_PARMS_t *p) { grub_Tss2_MU_TPMT_KEYEDHASH_SCHEME_Marshal (buffer, &p->scheme); } void grub_Tss2_MU_TPMT_SYM_DEF_OBJECT_Marshal (grub_tpm2_buffer_t buffer, const TPMT_SYM_DEF_OBJECT_t *p) { grub_tpm2_buffer_pack_u16 (buffer, p->algorithm); grub_Tss2_MU_TPMU_SYM_KEY_BITS_Marshal (buffer, p->algorithm, &p->keyBits); grub_Tss2_MU_TPMU_SYM_MODE_Marshal (buffer, p->algorithm, &p->mode); } void grub_Tss2_MU_TPMU_ASYM_SCHEME_Marshal (grub_tpm2_buffer_t buffer, const TPMI_ALG_RSA_DECRYPT_t scheme, const TPMU_ASYM_SCHEME_t *p __attribute__ ((unused))) { switch (scheme) { case TPM_ALG_NULL: break; default: /* Unsupported */ buffer->error = 1; break; } } void grub_Tss2_MU_TPMT_RSA_SCHEME_Marshal (grub_tpm2_buffer_t buffer, const TPMT_RSA_SCHEME_t *p) { grub_tpm2_buffer_pack_u16 (buffer, p->scheme); grub_Tss2_MU_TPMU_ASYM_SCHEME_Marshal (buffer, p->scheme, &p->details); } void grub_Tss2_MU_TPMS_RSA_PARMS_Marshal (grub_tpm2_buffer_t buffer, const TPMS_RSA_PARMS_t *p) { grub_Tss2_MU_TPMT_SYM_DEF_OBJECT_Marshal (buffer, &p->symmetric); grub_Tss2_MU_TPMT_RSA_SCHEME_Marshal (buffer, &p->scheme); grub_tpm2_buffer_pack_u16 (buffer, p->keyBits); grub_tpm2_buffer_pack_u32 (buffer, p->exponent); } void grub_Tss2_MU_TPMS_SYMCIPHER_PARMS_Marshal (grub_tpm2_buffer_t buffer, const TPMS_SYMCIPHER_PARMS_t *p) { grub_Tss2_MU_TPMT_SYM_DEF_OBJECT_Marshal (buffer, &p->sym); } void grub_Tss2_MU_TPMT_ECC_SCHEME_Marshal (grub_tpm2_buffer_t buffer, const TPMT_ECC_SCHEME_t *p) { grub_tpm2_buffer_pack_u16 (buffer, p->scheme); grub_Tss2_MU_TPMU_ASYM_SCHEME_Marshal (buffer, p->scheme, &p->details); } void grub_Tss2_MU_TPMU_KDF_SCHEME_Marshal (grub_tpm2_buffer_t buffer, const TPMI_ALG_KDF_t scheme, const TPMU_KDF_SCHEME_t *p) { switch (scheme) { case TPM_ALG_MGF1: grub_tpm2_buffer_pack_u16 (buffer, p->mgf1.hashAlg); break; case TPM_ALG_KDF1_SP800_56A: grub_tpm2_buffer_pack_u16 (buffer, p->kdf1_sp800_56a.hashAlg); break; case TPM_ALG_KDF2: grub_tpm2_buffer_pack_u16 (buffer, p->kdf2.hashAlg); break; case TPM_ALG_KDF1_SP800_108: grub_tpm2_buffer_pack_u16 (buffer, p->kdf1_sp800_108.hashAlg); break; case TPM_ALG_NULL: break; default: buffer->error = 1; break; } } void grub_Tss2_MU_TPMT_KDF_SCHEME_Marshal (grub_tpm2_buffer_t buffer, const TPMT_KDF_SCHEME_t *p) { grub_tpm2_buffer_pack_u16 (buffer, p->scheme); grub_Tss2_MU_TPMU_KDF_SCHEME_Marshal (buffer, p->scheme, &p->details); } void grub_Tss2_MU_TPMS_ECC_PARMS_Marshal (grub_tpm2_buffer_t buffer, const TPMS_ECC_PARMS_t *p) { grub_Tss2_MU_TPMT_SYM_DEF_OBJECT_Marshal (buffer, &p->symmetric); grub_Tss2_MU_TPMT_ECC_SCHEME_Marshal (buffer, &p->scheme); grub_tpm2_buffer_pack_u16 (buffer, p->curveID); grub_Tss2_MU_TPMT_KDF_SCHEME_Marshal (buffer, &p->kdf); } void grub_Tss2_MU_TPMU_PUBLIC_PARMS_Marshal (grub_tpm2_buffer_t buffer, const grub_uint32_t type, const TPMU_PUBLIC_PARMS_t *p) { switch (type) { case TPM_ALG_KEYEDHASH: grub_Tss2_MU_TPMS_KEYEDHASH_PARMS_Marshal (buffer, &p->keyedHashDetail); break; case TPM_ALG_SYMCIPHER: grub_Tss2_MU_TPMS_SYMCIPHER_PARMS_Marshal (buffer, &p->symDetail); break; case TPM_ALG_RSA: grub_Tss2_MU_TPMS_RSA_PARMS_Marshal (buffer, &p->rsaDetail); break; case TPM_ALG_ECC: grub_Tss2_MU_TPMS_ECC_PARMS_Marshal (buffer, &p->eccDetail); break; default: buffer->error = 1; break; } } void grub_Tss2_MU_TPMS_ECC_POINT_Marshal (grub_tpm2_buffer_t buffer, const TPMS_ECC_POINT_t *p) { grub_Tss2_MU_TPM2B_Marshal (buffer, p->x.size, p->x.buffer); grub_Tss2_MU_TPM2B_Marshal (buffer, p->y.size, p->y.buffer); } void grub_Tss2_MU_TPMU_PUBLIC_ID_Marshal (grub_tpm2_buffer_t buffer, const TPMI_ALG_PUBLIC_t type, const TPMU_PUBLIC_ID_t *p) { switch(type) { case TPM_ALG_KEYEDHASH: grub_Tss2_MU_TPM2B_Marshal (buffer, p->keyedHash.size, p->keyedHash.buffer); break; case TPM_ALG_SYMCIPHER: grub_Tss2_MU_TPM2B_Marshal (buffer, p->sym.size, p->sym.buffer); break; case TPM_ALG_RSA: grub_Tss2_MU_TPM2B_Marshal (buffer, p->rsa.size, p->rsa.buffer); break; case TPM_ALG_ECC: grub_Tss2_MU_TPMS_ECC_POINT_Marshal (buffer, &p->ecc); break; default: buffer->error = 1; break; } } void grub_Tss2_MU_TPMT_PUBLIC_PARMS_Marshal (grub_tpm2_buffer_t buffer, const TPMT_PUBLIC_PARMS_t *p) { grub_tpm2_buffer_pack_u16 (buffer, p->type); grub_Tss2_MU_TPMU_PUBLIC_PARMS_Marshal (buffer, p->type, &p->parameters); } void grub_Tss2_MU_TPMT_PUBLIC_Marshal (grub_tpm2_buffer_t buffer, const TPMT_PUBLIC_t *p) { grub_tpm2_buffer_pack_u16 (buffer, p->type); grub_tpm2_buffer_pack_u16 (buffer, p->nameAlg); grub_Tss2_MU_TPMA_OBJECT_Marshal (buffer, &p->objectAttributes); grub_Tss2_MU_TPM2B_Marshal (buffer, p->authPolicy.size, p->authPolicy.buffer); grub_Tss2_MU_TPMU_PUBLIC_PARMS_Marshal (buffer, p->type, &p->parameters); grub_Tss2_MU_TPMU_PUBLIC_ID_Marshal (buffer, p->type, &p->unique); } void grub_Tss2_MU_TPM2B_PUBLIC_Marshal (grub_tpm2_buffer_t buffer, const TPM2B_PUBLIC_t *p) { grub_uint32_t start; grub_uint16_t size; if (p) { grub_tpm2_buffer_pack_u16 (buffer, p->size); start = buffer->size; grub_Tss2_MU_TPMT_PUBLIC_Marshal (buffer, &p->publicArea); size = grub_cpu_to_be16 (buffer->size - start); grub_memcpy (&buffer->data[start - sizeof (grub_uint16_t)], &size, sizeof (size)); } else grub_tpm2_buffer_pack_u16 (buffer, 0); } void grub_Tss2_MU_TPMS_SENSITIVE_CREATE_Marshal (grub_tpm2_buffer_t buffer, const TPMS_SENSITIVE_CREATE_t *p) { grub_Tss2_MU_TPM2B_Marshal (buffer, p->userAuth.size, p->userAuth.buffer); grub_Tss2_MU_TPM2B_Marshal (buffer, p->data.size, p->data.buffer); } void grub_Tss2_MU_TPMU_SENSITIVE_COMPOSITE_Marshal (grub_tpm2_buffer_t buffer, const TPMI_ALG_PUBLIC_t type, const TPMU_SENSITIVE_COMPOSITE_t *p) { switch(type) { case TPM_ALG_RSA: grub_Tss2_MU_TPM2B_Marshal (buffer, p->rsa.size, p->rsa.buffer); break; case TPM_ALG_ECC: grub_Tss2_MU_TPM2B_Marshal (buffer, p->ecc.size, p->ecc.buffer); break; case TPM_ALG_KEYEDHASH: grub_Tss2_MU_TPM2B_Marshal (buffer, p->bits.size, p->bits.buffer); break; case TPM_ALG_SYMCIPHER: grub_Tss2_MU_TPM2B_Marshal (buffer, p->sym.size, p->sym.buffer); break; default: buffer->error = 1; } } void grub_Tss2_MU_TPMT_SENSITIVE_Marshal (grub_tpm2_buffer_t buffer, const TPMT_SENSITIVE_t *p) { grub_tpm2_buffer_pack_u16 (buffer, p->sensitiveType); grub_Tss2_MU_TPM2B_Marshal (buffer, p->authValue.size, p->authValue.buffer); grub_Tss2_MU_TPM2B_Marshal (buffer, p->seedValue.size, p->seedValue.buffer); grub_Tss2_MU_TPMU_SENSITIVE_COMPOSITE_Marshal (buffer, p->sensitiveType, &p->sensitive); } void grub_Tss2_MU_TPM2B_SENSITIVE_Marshal (grub_tpm2_buffer_t buffer, const TPM2B_SENSITIVE_t *p) { grub_tpm2_buffer_pack_u16 (buffer, p->size); grub_Tss2_MU_TPMT_SENSITIVE_Marshal (buffer, &p->sensitiveArea); } void grub_Tss2_MU_TPM2B_SENSITIVE_CREATE_Marshal (grub_tpm2_buffer_t buffer, const TPM2B_SENSITIVE_CREATE_t *sensitiveCreate) { grub_uint32_t start; grub_uint16_t size; if (sensitiveCreate) { grub_tpm2_buffer_pack_u16 (buffer, sensitiveCreate->size); start = buffer->size; grub_Tss2_MU_TPMS_SENSITIVE_CREATE_Marshal (buffer, &sensitiveCreate->sensitive); size = grub_cpu_to_be16 (buffer->size - start); grub_memcpy (&buffer->data[start - sizeof (grub_uint16_t)], &size, sizeof (size)); } else grub_tpm2_buffer_pack_u16 (buffer, 0); } void grub_Tss2_MU_TPMS_SIGNATURE_RSA_Marshal (grub_tpm2_buffer_t buffer, const TPMS_SIGNATURE_RSA_t *p) { grub_tpm2_buffer_pack_u16 (buffer, p->hash); grub_Tss2_MU_TPM2B_Marshal (buffer, p->sig.size, p->sig.buffer); } void grub_Tss2_MU_TPMS_SIGNATURE_ECC_Marshal (grub_tpm2_buffer_t buffer, const TPMS_SIGNATURE_ECC_t *p) { grub_tpm2_buffer_pack_u16 (buffer, p->hash); grub_Tss2_MU_TPM2B_Marshal (buffer, p->signatureR.size, p->signatureR.buffer); grub_Tss2_MU_TPM2B_Marshal (buffer, p->signatureS.size, p->signatureS.buffer); } void grub_Tss2_MU_TPMU_HA_Marshal (grub_tpm2_buffer_t buffer, const TPMI_ALG_HASH_t hashAlg, const TPMU_HA_t *p) { grub_uint16_t i; switch (hashAlg) { case TPM_ALG_SHA1: for (i = 0; i < TPM_SHA1_DIGEST_SIZE; i++) grub_tpm2_buffer_pack_u8 (buffer, p->sha1[i]); break; case TPM_ALG_SHA256: for (i = 0; i < TPM_SHA256_DIGEST_SIZE; i++) grub_tpm2_buffer_pack_u8 (buffer, p->sha256[i]); break; case TPM_ALG_SHA384: for (i = 0; i < TPM_SHA384_DIGEST_SIZE; i++) grub_tpm2_buffer_pack_u8 (buffer, p->sha384[i]); break; case TPM_ALG_SHA512: for (i = 0; i < TPM_SHA512_DIGEST_SIZE; i++) grub_tpm2_buffer_pack_u8 (buffer, p->sha512[i]); break; default: buffer->error = 1; break; } } void grub_Tss2_MU_TPMT_HA_Marshal (grub_tpm2_buffer_t buffer, const TPMT_HA_t *p) { grub_tpm2_buffer_pack_u16 (buffer, p->hashAlg); grub_Tss2_MU_TPMU_HA_Marshal (buffer, p->hashAlg, &p->digest); } void grub_Tss2_MU_TPMU_SIGNATURE_Marshal (grub_tpm2_buffer_t buffer, const TPMI_ALG_SIG_SCHEME_t sigAlg, const TPMU_SIGNATURE_t *p) { switch (sigAlg) { case TPM_ALG_RSASSA: grub_Tss2_MU_TPMS_SIGNATURE_RSA_Marshal (buffer, (TPMS_SIGNATURE_RSA_t *) &p->rsassa); break; case TPM_ALG_RSAPSS: grub_Tss2_MU_TPMS_SIGNATURE_RSA_Marshal (buffer, (TPMS_SIGNATURE_RSA_t *) &p->rsapss); break; case TPM_ALG_ECDSA: grub_Tss2_MU_TPMS_SIGNATURE_ECC_Marshal (buffer, (TPMS_SIGNATURE_ECC_t *) &p->ecdsa); break; case TPM_ALG_ECDAA: grub_Tss2_MU_TPMS_SIGNATURE_ECC_Marshal (buffer, (TPMS_SIGNATURE_ECC_t *) &p->ecdaa); break; case TPM_ALG_SM2: grub_Tss2_MU_TPMS_SIGNATURE_ECC_Marshal (buffer, (TPMS_SIGNATURE_ECC_t *) &p->sm2); break; case TPM_ALG_ECSCHNORR: grub_Tss2_MU_TPMS_SIGNATURE_ECC_Marshal (buffer, (TPMS_SIGNATURE_ECC_t *) &p->ecschnorr); break; case TPM_ALG_HMAC: grub_Tss2_MU_TPMT_HA_Marshal (buffer, &p->hmac); break; case TPM_ALG_NULL: break; default: buffer->error = 1; break; } } void grub_Tss2_MU_TPMT_SIGNATURE_Marshal (grub_tpm2_buffer_t buffer, const TPMT_SIGNATURE_t *p) { grub_tpm2_buffer_pack_u16 (buffer, p->sigAlg); grub_Tss2_MU_TPMU_SIGNATURE_Marshal (buffer, p->sigAlg, &p->signature); } void grub_Tss2_MU_TPMT_TK_VERIFIED_Marshal (grub_tpm2_buffer_t buffer, const TPMT_TK_VERIFIED_t *p) { grub_tpm2_buffer_pack_u16 (buffer, p->tag); grub_tpm2_buffer_pack_u32 (buffer, p->hierarchy); grub_Tss2_MU_TPM2B_Marshal (buffer, p->digest.size, p->digest.buffer); } void grub_Tss2_MU_TPMS_NV_PUBLIC_Marshal (grub_tpm2_buffer_t buffer, const TPMS_NV_PUBLIC_t *p) { grub_tpm2_buffer_pack_u32 (buffer, p->nvIndex); grub_tpm2_buffer_pack_u16 (buffer, p->nameAlg); grub_tpm2_buffer_pack_u32 (buffer, p->attributes); grub_Tss2_MU_TPM2B_Marshal (buffer, p->authPolicy.size, p->authPolicy.buffer); grub_tpm2_buffer_pack_u16 (buffer, p->dataSize); } void grub_Tss2_MU_TPM2B_NV_PUBLIC_Marshal (grub_tpm2_buffer_t buffer, const TPM2B_NV_PUBLIC_t *p) { grub_uint32_t start; grub_uint16_t size; if (p != NULL) { grub_tpm2_buffer_pack_u16 (buffer, p->size); start = buffer->size; grub_Tss2_MU_TPMS_NV_PUBLIC_Marshal (buffer, &p->nvPublic); size = grub_cpu_to_be16 (buffer->size - start); grub_memcpy (&buffer->data[start - sizeof (grub_uint16_t)], &size, sizeof (size)); } else grub_tpm2_buffer_pack_u16 (buffer, 0); } static void __Tss2_MU_TPM2B_BUFFER_Unmarshal (grub_tpm2_buffer_t buffer, TPM2B_t *p, grub_uint16_t bound) { grub_tpm2_buffer_unpack_u16 (buffer, &p->size); if (p->size > bound) { buffer->error = 1; return; } grub_tpm2_buffer_unpack (buffer, &p->buffer, p->size); } #define TPM2B_BUFFER_UNMARSHAL(buffer, type, data) \ __Tss2_MU_TPM2B_BUFFER_Unmarshal(buffer, (TPM2B_t *)data, sizeof(type) - sizeof(grub_uint16_t)) void grub_Tss2_MU_TPMS_AUTH_RESPONSE_Unmarshal (grub_tpm2_buffer_t buffer, TPMS_AUTH_RESPONSE_t *p) { grub_uint8_t tmp; grub_uint32_t tmp32; grub_tpm2_buffer_unpack_u16 (buffer, &p->nonce.size); if (p->nonce.size) grub_tpm2_buffer_unpack (buffer, &p->nonce.buffer, p->nonce.size); grub_tpm2_buffer_unpack_u8 (buffer, &tmp); tmp32 = tmp; grub_memcpy (&p->sessionAttributes, &tmp32, sizeof (grub_uint32_t)); grub_tpm2_buffer_unpack_u16 (buffer, &p->hmac.size); if (p->hmac.size) grub_tpm2_buffer_unpack (buffer, &p->hmac.buffer, p->hmac.size); } void grub_Tss2_MU_TPM2B_DIGEST_Unmarshal (grub_tpm2_buffer_t buffer, TPM2B_DIGEST_t *digest) { TPM2B_BUFFER_UNMARSHAL (buffer, TPM2B_DIGEST_t, digest); } void grub_Tss2_MU_TPM2B_NONCE_Unmarshal (grub_tpm2_buffer_t buffer, TPM2B_NONCE_t *nonce) { TPM2B_BUFFER_UNMARSHAL (buffer, TPM2B_NONCE_t, nonce); } void grub_Tss2_MU_TPM2B_DATA_Unmarshal (grub_tpm2_buffer_t buffer, TPM2B_DATA_t *data) { TPM2B_BUFFER_UNMARSHAL (buffer, TPM2B_DATA_t, data); } void grub_Tss2_MU_TPMS_CREATION_DATA_Unmarshal (grub_tpm2_buffer_t buffer, TPMS_CREATION_DATA_t *data) { grub_Tss2_MU_TPML_PCR_SELECTION_Unmarshal (buffer, &data->pcrSelect); grub_Tss2_MU_TPM2B_DIGEST_Unmarshal (buffer, &data->pcrDigest); grub_tpm2_buffer_unpack_u8 (buffer, (grub_uint8_t *)&data->locality); grub_tpm2_buffer_unpack_u16 (buffer, &data->parentNameAlg); grub_Tss2_MU_TPM2B_NAME_Unmarshal (buffer, &data->parentName); grub_Tss2_MU_TPM2B_NAME_Unmarshal (buffer, &data->parentQualifiedName); grub_Tss2_MU_TPM2B_DATA_Unmarshal (buffer, &data->outsideInfo); } void grub_Tss2_MU_TPM2B_CREATION_DATA_Unmarshal (grub_tpm2_buffer_t buffer, TPM2B_CREATION_DATA_t *data) { grub_tpm2_buffer_unpack_u16 (buffer, &data->size); grub_Tss2_MU_TPMS_CREATION_DATA_Unmarshal (buffer, &data->creationData); } void grub_Tss2_MU_TPM2B_PRIVATE_Unmarshal (grub_tpm2_buffer_t buffer, TPM2B_PRIVATE_t *private) { TPM2B_BUFFER_UNMARSHAL (buffer, TPM2B_PRIVATE_t, private); } void grub_Tss2_MU_TPM2B_SENSITIVE_DATA_Unmarshal (grub_tpm2_buffer_t buffer, TPM2B_SENSITIVE_DATA_t *data) { TPM2B_BUFFER_UNMARSHAL (buffer, TPM2B_SENSITIVE_DATA_t, data); } void grub_Tss2_MU_TPM2B_PUBLIC_KEY_RSA_Unmarshal (grub_tpm2_buffer_t buffer, TPM2B_PUBLIC_KEY_RSA_t *rsa) { TPM2B_BUFFER_UNMARSHAL (buffer, TPM2B_PUBLIC_KEY_RSA_t, rsa); } void grub_Tss2_MU_TPM2B_ECC_PARAMETER_Unmarshal (grub_tpm2_buffer_t buffer, TPM2B_ECC_PARAMETER_t *param) { TPM2B_BUFFER_UNMARSHAL (buffer, TPM2B_ECC_PARAMETER_t, param); } void grub_Tss2_MU_TPMA_OBJECT_Unmarshal (grub_tpm2_buffer_t buffer, TPMA_OBJECT_t *p) { grub_tpm2_buffer_unpack_u32 (buffer, (grub_uint32_t *) p); } void grub_Tss2_MU_TPMS_SCHEME_HMAC_Unmarshal (grub_tpm2_buffer_t buffer, TPMS_SCHEME_HMAC_t *p) { grub_tpm2_buffer_unpack_u16 (buffer, &p->hashAlg); } void grub_Tss2_MU_TPMS_SCHEME_XOR_Unmarshal (grub_tpm2_buffer_t buffer, TPMS_SCHEME_XOR_t *p) { grub_tpm2_buffer_unpack_u16 (buffer, &p->hashAlg); grub_tpm2_buffer_unpack_u16 (buffer, &p->kdf); } void grub_Tss2_MU_TPMU_SCHEME_KEYEDHASH_Unmarshal (grub_tpm2_buffer_t buffer, TPMI_ALG_KEYEDHASH_SCHEME_t scheme, TPMU_SCHEME_KEYEDHASH_t *p) { switch (scheme) { case TPM_ALG_HMAC: grub_Tss2_MU_TPMS_SCHEME_HMAC_Unmarshal (buffer, &p->hmac); break; case TPM_ALG_XOR: grub_Tss2_MU_TPMS_SCHEME_XOR_Unmarshal (buffer, &p->exclusiveOr); break; case TPM_ALG_NULL: break; default: buffer->error = 1; break; } } void grub_Tss2_MU_TPMT_KEYEDHASH_SCHEME_Unmarshal (grub_tpm2_buffer_t buffer, TPMT_KEYEDHASH_SCHEME_t *p) { grub_tpm2_buffer_unpack_u16 (buffer, &p->scheme); grub_Tss2_MU_TPMU_SCHEME_KEYEDHASH_Unmarshal (buffer, p->scheme, &p->details); } void grub_Tss2_MU_TPMS_KEYEDHASH_PARMS_Unmarshal (grub_tpm2_buffer_t buffer, TPMS_KEYEDHASH_PARMS_t *p) { grub_Tss2_MU_TPMT_KEYEDHASH_SCHEME_Unmarshal (buffer, &p->scheme); } void grub_Tss2_MU_TPMU_SYM_KEY_BITS_Unmarshal (grub_tpm2_buffer_t buffer, TPMI_ALG_SYM_OBJECT_t algorithm, TPMU_SYM_KEY_BITS_t *p) { switch (algorithm) { case TPM_ALG_AES: case TPM_ALG_SM4: case TPM_ALG_CAMELLIA: case TPM_ALG_XOR: grub_tpm2_buffer_unpack_u16 (buffer, (grub_uint16_t *) p); break; case TPM_ALG_NULL: break; default: buffer->error = 1; break; } } void grub_Tss2_MU_TPMU_SYM_MODE_Unmarshal (grub_tpm2_buffer_t buffer, TPMI_ALG_SYM_OBJECT_t algorithm, TPMU_SYM_MODE_t *p) { switch (algorithm) { case TPM_ALG_AES: case TPM_ALG_SM4: case TPM_ALG_CAMELLIA: grub_tpm2_buffer_unpack_u16 (buffer, (grub_uint16_t *) p); break; case TPM_ALG_XOR: case TPM_ALG_NULL: break; default: buffer->error = 1; break; } } void grub_Tss2_MU_TPMT_SYM_DEF_OBJECT_Unmarshal (grub_tpm2_buffer_t buffer, TPMT_SYM_DEF_OBJECT_t *p) { grub_tpm2_buffer_unpack_u16 (buffer, &p->algorithm); grub_Tss2_MU_TPMU_SYM_KEY_BITS_Unmarshal (buffer, p->algorithm, &p->keyBits); grub_Tss2_MU_TPMU_SYM_MODE_Unmarshal (buffer, p->algorithm, &p->mode); } void grub_Tss2_MU_TPMS_SYMCIPHER_PARMS_Unmarshal (grub_tpm2_buffer_t buffer, TPMS_SYMCIPHER_PARMS_t *p) { grub_Tss2_MU_TPMT_SYM_DEF_OBJECT_Unmarshal (buffer, &p->sym); } void grub_Tss2_MU_TPMU_ASYM_SCHEME_Unmarshal (grub_tpm2_buffer_t buffer, TPMI_ALG_RSA_DECRYPT_t scheme, TPMU_ASYM_SCHEME_t *p __attribute__((unused))) { switch (scheme) { case TPM_ALG_NULL: break; default: /* Unsupported */ buffer->error = 1; break; } } void grub_Tss2_MU_TPMT_RSA_SCHEME_Unmarshal (grub_tpm2_buffer_t buffer, TPMT_RSA_SCHEME_t *p) { grub_tpm2_buffer_unpack_u16 (buffer, &p->scheme); grub_Tss2_MU_TPMU_ASYM_SCHEME_Unmarshal (buffer, p->scheme, &p->details); } void grub_Tss2_MU_TPMS_RSA_PARMS_Unmarshal (grub_tpm2_buffer_t buffer, TPMS_RSA_PARMS_t *p) { grub_Tss2_MU_TPMT_SYM_DEF_OBJECT_Unmarshal (buffer, &p->symmetric); grub_Tss2_MU_TPMT_RSA_SCHEME_Unmarshal (buffer, &p->scheme); grub_tpm2_buffer_unpack_u16 (buffer, &p->keyBits); grub_tpm2_buffer_unpack_u32 (buffer, &p->exponent); } void grub_Tss2_MU_TPMT_ECC_SCHEME_Unmarshal (grub_tpm2_buffer_t buffer, TPMT_ECC_SCHEME_t *p) { grub_tpm2_buffer_unpack_u16 (buffer, &p->scheme); grub_Tss2_MU_TPMU_ASYM_SCHEME_Unmarshal (buffer, p->scheme, &p->details); } void grub_Tss2_MU_TPMU_KDF_SCHEME_Unmarshal (grub_tpm2_buffer_t buffer, TPMI_ALG_KDF_t scheme, TPMU_KDF_SCHEME_t *p) { switch (scheme) { case TPM_ALG_MGF1: grub_tpm2_buffer_unpack_u16 (buffer, &p->mgf1.hashAlg); break; case TPM_ALG_KDF1_SP800_56A: grub_tpm2_buffer_unpack_u16 (buffer, &p->kdf1_sp800_56a.hashAlg); break; case TPM_ALG_KDF2: grub_tpm2_buffer_unpack_u16 (buffer, &p->kdf2.hashAlg); break; case TPM_ALG_KDF1_SP800_108: grub_tpm2_buffer_unpack_u16 (buffer, &p->kdf1_sp800_108.hashAlg); break; case TPM_ALG_NULL: break; default: buffer->error = 1; break; } } void grub_Tss2_MU_TPMT_KDF_SCHEME_Unmarshal (grub_tpm2_buffer_t buffer, TPMT_KDF_SCHEME_t *p) { grub_tpm2_buffer_unpack_u16 (buffer, &p->scheme); grub_Tss2_MU_TPMU_KDF_SCHEME_Unmarshal (buffer, p->scheme, &p->details); } void grub_Tss2_MU_TPMS_ECC_PARMS_Unmarshal (grub_tpm2_buffer_t buffer, TPMS_ECC_PARMS_t *p) { grub_Tss2_MU_TPMT_SYM_DEF_OBJECT_Unmarshal (buffer, &p->symmetric); grub_Tss2_MU_TPMT_ECC_SCHEME_Unmarshal (buffer, &p->scheme ); grub_tpm2_buffer_unpack_u16 (buffer, &p->curveID); grub_Tss2_MU_TPMT_KDF_SCHEME_Unmarshal (buffer, &p->kdf); } void grub_Tss2_MU_TPMU_PUBLIC_PARMS_Unmarshal (grub_tpm2_buffer_t buffer, grub_uint32_t type, TPMU_PUBLIC_PARMS_t *p) { switch (type) { case TPM_ALG_KEYEDHASH: grub_Tss2_MU_TPMS_KEYEDHASH_PARMS_Unmarshal (buffer, &p->keyedHashDetail); break; case TPM_ALG_SYMCIPHER: grub_Tss2_MU_TPMS_SYMCIPHER_PARMS_Unmarshal (buffer, &p->symDetail); break; case TPM_ALG_RSA: grub_Tss2_MU_TPMS_RSA_PARMS_Unmarshal (buffer, &p->rsaDetail); break; case TPM_ALG_ECC: grub_Tss2_MU_TPMS_ECC_PARMS_Unmarshal (buffer, &p->eccDetail); break; default: buffer->error = 1; break; } } void grub_Tss2_MU_TPMS_ECC_POINT_Unmarshal (grub_tpm2_buffer_t buffer, TPMS_ECC_POINT_t *p) { grub_Tss2_MU_TPM2B_ECC_PARAMETER_Unmarshal (buffer, &p->x); grub_Tss2_MU_TPM2B_ECC_PARAMETER_Unmarshal (buffer, &p->y); } void grub_Tss2_MU_TPMU_PUBLIC_ID_Unmarshal (grub_tpm2_buffer_t buffer, TPMI_ALG_PUBLIC_t type, TPMU_PUBLIC_ID_t *p) { switch(type) { case TPM_ALG_KEYEDHASH: grub_Tss2_MU_TPM2B_DIGEST_Unmarshal (buffer, &p->keyedHash); break; case TPM_ALG_SYMCIPHER: grub_Tss2_MU_TPM2B_DIGEST_Unmarshal (buffer, &p->sym); break; case TPM_ALG_RSA: grub_Tss2_MU_TPM2B_PUBLIC_KEY_RSA_Unmarshal (buffer, &p->rsa); break; case TPM_ALG_ECC: grub_Tss2_MU_TPMS_ECC_POINT_Unmarshal (buffer, &p->ecc); break; default: buffer->error = 1; break; } } void grub_Tss2_MU_TPMT_PUBLIC_Unmarshal (grub_tpm2_buffer_t buffer, TPMT_PUBLIC_t *p) { grub_tpm2_buffer_unpack_u16 (buffer, &p->type); grub_tpm2_buffer_unpack_u16 (buffer, &p->nameAlg); grub_Tss2_MU_TPMA_OBJECT_Unmarshal (buffer, &p->objectAttributes); grub_Tss2_MU_TPM2B_DIGEST_Unmarshal (buffer, &p->authPolicy); grub_Tss2_MU_TPMU_PUBLIC_PARMS_Unmarshal (buffer, p->type, &p->parameters); grub_Tss2_MU_TPMU_PUBLIC_ID_Unmarshal (buffer, p->type, &p->unique); } void grub_Tss2_MU_TPM2B_PUBLIC_Unmarshal (grub_tpm2_buffer_t buffer, TPM2B_PUBLIC_t *p) { grub_tpm2_buffer_unpack_u16 (buffer, &p->size); grub_Tss2_MU_TPMT_PUBLIC_Unmarshal (buffer, &p->publicArea); } void grub_Tss2_MU_TPMS_NV_PUBLIC_Unmarshal (grub_tpm2_buffer_t buffer, TPMS_NV_PUBLIC_t *p) { grub_tpm2_buffer_unpack_u32 (buffer, &p->nvIndex); grub_tpm2_buffer_unpack_u16 (buffer, &p->nameAlg); grub_tpm2_buffer_unpack_u32 (buffer, &p->attributes); grub_Tss2_MU_TPM2B_DIGEST_Unmarshal (buffer, &p->authPolicy); grub_tpm2_buffer_unpack_u16 (buffer, &p->dataSize); } void grub_Tss2_MU_TPM2B_NV_PUBLIC_Unmarshal (grub_tpm2_buffer_t buffer, TPM2B_NV_PUBLIC_t *p) { grub_tpm2_buffer_unpack_u16 (buffer, &p->size); grub_Tss2_MU_TPMS_NV_PUBLIC_Unmarshal (buffer, &p->nvPublic); } void grub_Tss2_MU_TPM2B_NAX_NV_BUFFER_Unmarshal (grub_tpm2_buffer_t buffer, TPM2B_MAX_NV_BUFFER_t *p) { TPM2B_BUFFER_UNMARSHAL (buffer, TPM2B_MAX_NV_BUFFER_t, p); } void grub_Tss2_MU_TPM2B_NAME_Unmarshal (grub_tpm2_buffer_t buffer, TPM2B_NAME_t *n) { TPM2B_BUFFER_UNMARSHAL (buffer, TPM2B_NAME_t, n); } void grub_Tss2_MU_TPMS_TAGGED_PROPERTY_Unmarshal (grub_tpm2_buffer_t buffer, TPMS_TAGGED_PROPERTY_t *property) { grub_tpm2_buffer_unpack_u32 (buffer, &property->property); grub_tpm2_buffer_unpack_u32 (buffer, &property->value); } void grub_Tss2_MU_TPMT_TK_CREATION_Unmarshal (grub_tpm2_buffer_t buffer, TPMT_TK_CREATION_t *p) { grub_tpm2_buffer_unpack_u16 (buffer, &p->tag); grub_tpm2_buffer_unpack_u32 (buffer, &p->hierarchy); grub_Tss2_MU_TPM2B_DIGEST_Unmarshal (buffer, &p->digest); } void grub_Tss2_MU_TPMT_TK_HASHCHECK_Unmarshal (grub_tpm2_buffer_t buffer, TPMT_TK_HASHCHECK_t *p) { grub_tpm2_buffer_unpack_u16 (buffer, &p->tag); grub_tpm2_buffer_unpack_u32 (buffer, &p->hierarchy); grub_Tss2_MU_TPM2B_DIGEST_Unmarshal (buffer, &p->digest); } void grub_Tss2_MU_TPMT_TK_VERIFIED_Unmarshal (grub_tpm2_buffer_t buffer, TPMT_TK_VERIFIED_t *p) { grub_tpm2_buffer_unpack_u16 (buffer, &p->tag); grub_tpm2_buffer_unpack_u32 (buffer, &p->hierarchy); grub_Tss2_MU_TPM2B_DIGEST_Unmarshal (buffer, &p->digest); } void grub_Tss2_MU_TPMS_PCR_SELECTION_Unmarshal (grub_tpm2_buffer_t buffer, TPMS_PCR_SELECTION_t *pcrSelection) { grub_uint32_t i; grub_tpm2_buffer_unpack_u16 (buffer, &pcrSelection->hash); grub_tpm2_buffer_unpack_u8 (buffer, &pcrSelection->sizeOfSelect); if (pcrSelection->sizeOfSelect > TPM_PCR_SELECT_MAX) { buffer->error = 1; return; } for (i = 0; i < pcrSelection->sizeOfSelect; i++) grub_tpm2_buffer_unpack_u8 (buffer, &pcrSelection->pcrSelect[i]); } void grub_Tss2_MU_TPML_PCR_SELECTION_Unmarshal (grub_tpm2_buffer_t buffer, TPML_PCR_SELECTION_t *pcrSelection) { grub_uint32_t i; grub_tpm2_buffer_unpack_u32 (buffer, &pcrSelection->count); if (pcrSelection->count > TPM_NUM_PCR_BANKS) { buffer->error = 1; return; } for (i = 0; i < pcrSelection->count; i++) grub_Tss2_MU_TPMS_PCR_SELECTION_Unmarshal (buffer, &pcrSelection->pcrSelections[i]); } void grub_Tss2_MU_TPML_DIGEST_Unmarshal (grub_tpm2_buffer_t buffer, TPML_DIGEST_t *digest) { grub_uint32_t i; grub_tpm2_buffer_unpack_u32 (buffer, &digest->count); if (digest->count > 8) { buffer->error = 1; return; } for (i = 0; i < digest->count; i++) grub_Tss2_MU_TPM2B_DIGEST_Unmarshal (buffer, &digest->digests[i]); } void grub_Tss2_MU_TPMS_SIGNATURE_RSA_Unmarshal (grub_tpm2_buffer_t buffer, TPMS_SIGNATURE_RSA_t *rsa) { grub_tpm2_buffer_unpack_u16 (buffer, &rsa->hash); grub_Tss2_MU_TPM2B_PUBLIC_KEY_RSA_Unmarshal (buffer, &rsa->sig); } void grub_Tss2_MU_TPMS_SIGNATURE_ECC_Unmarshal (grub_tpm2_buffer_t buffer, TPMS_SIGNATURE_ECC_t *ecc) { grub_tpm2_buffer_unpack_u16 (buffer, &ecc->hash); grub_Tss2_MU_TPM2B_ECC_PARAMETER_Unmarshal (buffer, &ecc->signatureR); grub_Tss2_MU_TPM2B_ECC_PARAMETER_Unmarshal (buffer, &ecc->signatureS); } void grub_Tss2_MU_TPMU_HA_Unmarshal (grub_tpm2_buffer_t buffer, TPMI_ALG_HASH_t hashAlg, TPMU_HA_t *p) { switch (hashAlg) { case TPM_ALG_SHA1: grub_tpm2_buffer_unpack (buffer, &p->sha1, TPM_SHA1_DIGEST_SIZE); break; case TPM_ALG_SHA256: grub_tpm2_buffer_unpack (buffer, &p->sha256, TPM_SHA256_DIGEST_SIZE); break; case TPM_ALG_SHA384: grub_tpm2_buffer_unpack (buffer, &p->sha384, TPM_SHA384_DIGEST_SIZE); break; case TPM_ALG_SHA512: grub_tpm2_buffer_unpack (buffer, &p->sha512, TPM_SHA512_DIGEST_SIZE); break; default: buffer->error = 1; break; } } void grub_Tss2_MU_TPMT_HA_Unmarshal (grub_tpm2_buffer_t buffer, TPMT_HA_t *p) { grub_tpm2_buffer_unpack_u16 (buffer, &p->hashAlg); grub_Tss2_MU_TPMU_HA_Unmarshal (buffer, p->hashAlg, &p->digest); } void grub_Tss2_MU_TPMU_SIGNATURE_Unmarshal (grub_tpm2_buffer_t buffer, TPMI_ALG_SIG_SCHEME_t sigAlg, TPMU_SIGNATURE_t *p) { switch (sigAlg) { case TPM_ALG_RSASSA: grub_Tss2_MU_TPMS_SIGNATURE_RSA_Unmarshal (buffer, (TPMS_SIGNATURE_RSA_t *)&p->rsassa); break; case TPM_ALG_RSAPSS: grub_Tss2_MU_TPMS_SIGNATURE_RSA_Unmarshal (buffer, (TPMS_SIGNATURE_RSA_t *)&p->rsapss); break; case TPM_ALG_ECDSA: grub_Tss2_MU_TPMS_SIGNATURE_ECC_Unmarshal (buffer, (TPMS_SIGNATURE_ECC_t *)&p->ecdsa); break; case TPM_ALG_ECDAA: grub_Tss2_MU_TPMS_SIGNATURE_ECC_Unmarshal (buffer, (TPMS_SIGNATURE_ECC_t *)&p->ecdaa); break; case TPM_ALG_SM2: grub_Tss2_MU_TPMS_SIGNATURE_ECC_Unmarshal (buffer, (TPMS_SIGNATURE_ECC_t *)&p->sm2); break; case TPM_ALG_ECSCHNORR: grub_Tss2_MU_TPMS_SIGNATURE_ECC_Unmarshal (buffer, (TPMS_SIGNATURE_ECC_t *)&p->ecschnorr); break; case TPM_ALG_HMAC: grub_Tss2_MU_TPMT_HA_Unmarshal (buffer, &p->hmac); break; case TPM_ALG_NULL: break; default: buffer->error = 1; break; } } void grub_Tss2_MU_TPMT_SIGNATURE_Unmarshal (grub_tpm2_buffer_t buffer, TPMT_SIGNATURE_t *p) { grub_tpm2_buffer_unpack_u16 (buffer, &p->sigAlg); grub_Tss2_MU_TPMU_SIGNATURE_Unmarshal (buffer, p->sigAlg, &p->signature); } grub-2.14~git20250718.0e36779/grub-core/lib/tss2/tss2_mu.h0000644000175000017500000003112615036447510017101 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (C) 2022 Microsoft Corporation * Copyright (C) 2024 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #ifndef GRUB_TPM2_MU_HEADER #define GRUB_TPM2_MU_HEADER 1 #include #include extern void grub_Tss2_MU_TPMS_AUTH_COMMAND_Marshal (grub_tpm2_buffer_t buffer, const TPMS_AUTH_COMMAND_t *authCommand); extern void grub_Tss2_MU_TPM2B_Marshal (grub_tpm2_buffer_t buffer, const grub_uint16_t size, const grub_uint8_t *b); extern void grub_Tss2_MU_TPMU_SYM_KEY_BITS_Marshal (grub_tpm2_buffer_t buffer, const TPMI_ALG_SYM_OBJECT_t algorithm, const TPMU_SYM_KEY_BITS_t *p); extern void grub_Tss2_MU_TPMU_SYM_MODE_Marshal (grub_tpm2_buffer_t buffer, const TPMI_ALG_SYM_OBJECT_t algorithm, const TPMU_SYM_MODE_t *p); extern void grub_Tss2_MU_TPMT_SYM_DEF_Marshal (grub_tpm2_buffer_t buffer, const TPMT_SYM_DEF_t *p); extern void grub_Tss2_MU_TPMS_PCR_SELECTION_Marshal (grub_tpm2_buffer_t buffer, const TPMS_PCR_SELECTION_t *pcrSelection); extern void grub_Tss2_MU_TPML_PCR_SELECTION_Marshal (grub_tpm2_buffer_t buffer, const TPML_PCR_SELECTION_t *pcrSelection); extern void grub_Tss2_MU_TPMA_OBJECT_Marshal (grub_tpm2_buffer_t buffer, const TPMA_OBJECT_t *p); extern void grub_Tss2_MU_TPMS_SCHEME_XOR_Marshal (grub_tpm2_buffer_t buffer, const TPMS_SCHEME_XOR_t *p); extern void grub_Tss2_MU_TPMS_SCHEME_HMAC_Marshal (grub_tpm2_buffer_t buffer, const TPMS_SCHEME_HMAC_t *p); extern void grub_Tss2_MU_TPMU_SCHEME_KEYEDHASH_Marshal (grub_tpm2_buffer_t buffer, const TPMI_ALG_KEYEDHASH_SCHEME_t scheme, const TPMU_SCHEME_KEYEDHASH_t *p); extern void grub_Tss2_MU_TPMT_KEYEDHASH_SCHEME_Marshal (grub_tpm2_buffer_t buffer, const TPMT_KEYEDHASH_SCHEME_t *p); extern void grub_Tss2_MU_TPMS_KEYEDHASH_PARMS_Marshal (grub_tpm2_buffer_t buffer, const TPMS_KEYEDHASH_PARMS_t *p); extern void grub_Tss2_MU_TPMT_SYM_DEF_OBJECT_Marshal (grub_tpm2_buffer_t buffer, const TPMT_SYM_DEF_OBJECT_t *p); extern void grub_Tss2_MU_TPMU_ASYM_SCHEME_Marshal (grub_tpm2_buffer_t buffer, const TPMI_ALG_RSA_DECRYPT_t scheme, const TPMU_ASYM_SCHEME_t *p); extern void grub_Tss2_MU_TPMT_RSA_SCHEME_Marshal (grub_tpm2_buffer_t buffer, const TPMT_RSA_SCHEME_t *p); extern void grub_Tss2_MU_TPMS_RSA_PARMS_Marshal (grub_tpm2_buffer_t buffer, const TPMS_RSA_PARMS_t *p); extern void grub_Tss2_MU_TPMS_SYMCIPHER_PARMS_Marshal (grub_tpm2_buffer_t buffer, const TPMS_SYMCIPHER_PARMS_t *p); extern void grub_Tss2_MU_TPMT_ECC_SCHEME_Marshal (grub_tpm2_buffer_t buffer, const TPMT_ECC_SCHEME_t *p); extern void grub_Tss2_MU_TPMU_KDF_SCHEME_Marshal (grub_tpm2_buffer_t buffer, const TPMI_ALG_KDF_t scheme, const TPMU_KDF_SCHEME_t *p); extern void grub_Tss2_MU_TPMT_KDF_SCHEME_Marshal (grub_tpm2_buffer_t buffer, const TPMT_KDF_SCHEME_t *p); extern void grub_Tss2_MU_TPMS_ECC_PARMS_Marshal (grub_tpm2_buffer_t buffer, const TPMS_ECC_PARMS_t *p); extern void grub_Tss2_MU_TPMU_PUBLIC_PARMS_Marshal (grub_tpm2_buffer_t buffer, const grub_uint32_t type, const TPMU_PUBLIC_PARMS_t *p); extern void grub_Tss2_MU_TPMS_ECC_POINT_Marshal (grub_tpm2_buffer_t buffer, const TPMS_ECC_POINT_t *p); extern void grub_Tss2_MU_TPMU_PUBLIC_ID_Marshal (grub_tpm2_buffer_t buffer, const TPMI_ALG_PUBLIC_t type, const TPMU_PUBLIC_ID_t *p); extern void grub_Tss2_MU_TPMT_PUBLIC_PARMS_Marshal (grub_tpm2_buffer_t buffer, const TPMT_PUBLIC_PARMS_t *p); extern void grub_Tss2_MU_TPMT_PUBLIC_Marshal (grub_tpm2_buffer_t buffer, const TPMT_PUBLIC_t *p); extern void grub_Tss2_MU_TPM2B_PUBLIC_Marshal (grub_tpm2_buffer_t buffer, const TPM2B_PUBLIC_t *p); extern void grub_Tss2_MU_TPMS_SENSITIVE_CREATE_Marshal (grub_tpm2_buffer_t buffer, const TPMS_SENSITIVE_CREATE_t *p); extern void grub_Tss2_MU_TPM2B_SENSITIVE_CREATE_Marshal (grub_tpm2_buffer_t buffer, const TPM2B_SENSITIVE_CREATE_t *sensitiveCreate); extern void grub_Tss2_MU_TPMU_SENSITIVE_COMPOSITE_Marshal (grub_tpm2_buffer_t buffer, const TPMI_ALG_PUBLIC_t type, const TPMU_SENSITIVE_COMPOSITE_t *p); extern void grub_Tss2_MU_TPMT_SENSITIVE_Marshal (grub_tpm2_buffer_t buffer, const TPMT_SENSITIVE_t *p); extern void grub_Tss2_MU_TPM2B_SENSITIVE_Marshal (grub_tpm2_buffer_t buffer, const TPM2B_SENSITIVE_t *p); extern void grub_Tss2_MU_TPMS_SIGNATURE_RSA_Marshal (grub_tpm2_buffer_t buffer, const TPMS_SIGNATURE_RSA_t *p); extern void grub_Tss2_MU_TPMS_SIGNATURE_ECC_Marshal (grub_tpm2_buffer_t buffer, const TPMS_SIGNATURE_ECC_t *p); extern void grub_Tss2_MU_TPMU_HA_Marshal (grub_tpm2_buffer_t buffer, const TPMI_ALG_HASH_t hashAlg, const TPMU_HA_t *p); extern void grub_Tss2_MU_TPMT_HA_Marshal (grub_tpm2_buffer_t buffer, const TPMT_HA_t *p); extern void grub_Tss2_MU_TPMU_SIGNATURE_Marshal (grub_tpm2_buffer_t buffer, const TPMI_ALG_SIG_SCHEME_t sigAlg, const TPMU_SIGNATURE_t *p); extern void grub_Tss2_MU_TPMT_SIGNATURE_Marshal (grub_tpm2_buffer_t buffer, const TPMT_SIGNATURE_t *p); extern void grub_Tss2_MU_TPMT_TK_VERIFIED_Marshal (grub_tpm2_buffer_t buffer, const TPMT_TK_VERIFIED_t *p); extern void grub_Tss2_MU_TPMS_NV_PUBLIC_Marshal (grub_tpm2_buffer_t buffer, const TPMS_NV_PUBLIC_t *p); extern void grub_Tss2_MU_TPM2B_NV_PUBLIC_Marshal (grub_tpm2_buffer_t buffer, const TPM2B_NV_PUBLIC_t *p); extern void grub_Tss2_MU_TPMS_AUTH_RESPONSE_Unmarshal (grub_tpm2_buffer_t buffer, TPMS_AUTH_RESPONSE_t *p); extern void grub_Tss2_MU_TPM2B_DIGEST_Unmarshal (grub_tpm2_buffer_t buffer, TPM2B_DIGEST_t *digest); extern void grub_Tss2_MU_TPM2B_NONCE_Unmarshal (grub_tpm2_buffer_t buffer, TPM2B_NONCE_t *nonce); extern void grub_Tss2_MU_TPM2B_DATA_Unmarshal (grub_tpm2_buffer_t buffer, TPM2B_DATA_t *data); extern void grub_Tss2_MU_TPMS_CREATION_DATA_Unmarshal (grub_tpm2_buffer_t buffer, TPMS_CREATION_DATA_t *data); extern void grub_Tss2_MU_TPM2B_CREATION_DATA_Unmarshal (grub_tpm2_buffer_t buffer, TPM2B_CREATION_DATA_t *data); extern void grub_Tss2_MU_TPM2B_PRIVATE_Unmarshal (grub_tpm2_buffer_t buffer, TPM2B_PRIVATE_t *private); extern void grub_Tss2_MU_TPM2B_SENSITIVE_DATA_Unmarshal (grub_tpm2_buffer_t buffer, TPM2B_SENSITIVE_DATA_t *data); extern void grub_Tss2_MU_TPM2B_PUBLIC_KEY_RSA_Unmarshal (grub_tpm2_buffer_t buffer, TPM2B_PUBLIC_KEY_RSA_t *rsa); extern void grub_Tss2_MU_TPM2B_ECC_PARAMETER_Unmarshal (grub_tpm2_buffer_t buffer, TPM2B_ECC_PARAMETER_t *param); extern void grub_Tss2_MU_TPMA_OBJECT_Unmarshal (grub_tpm2_buffer_t buffer, TPMA_OBJECT_t *p); extern void grub_Tss2_MU_TPMS_SCHEME_HMAC_Unmarshal (grub_tpm2_buffer_t buffer, TPMS_SCHEME_HMAC_t *p); extern void grub_Tss2_MU_TPMS_SCHEME_XOR_Unmarshal (grub_tpm2_buffer_t buffer, TPMS_SCHEME_XOR_t *p); extern void grub_Tss2_MU_TPMU_SCHEME_KEYEDHASH_Unmarshal (grub_tpm2_buffer_t buffer, TPMI_ALG_KEYEDHASH_SCHEME_t scheme, TPMU_SCHEME_KEYEDHASH_t *p); extern void grub_Tss2_MU_TPMT_KEYEDHASH_SCHEME_Unmarshal (grub_tpm2_buffer_t buffer, TPMT_KEYEDHASH_SCHEME_t *p); extern void grub_Tss2_MU_TPMS_KEYEDHASH_PARMS_Unmarshal (grub_tpm2_buffer_t buffer, TPMS_KEYEDHASH_PARMS_t *p); extern void grub_Tss2_MU_TPMU_SYM_KEY_BITS_Unmarshal (grub_tpm2_buffer_t buffer, TPMI_ALG_SYM_OBJECT_t algorithm, TPMU_SYM_KEY_BITS_t *p); extern void grub_Tss2_MU_TPMU_SYM_MODE_Unmarshal (grub_tpm2_buffer_t buffer, TPMI_ALG_SYM_OBJECT_t algorithm, TPMU_SYM_MODE_t *p); extern void grub_Tss2_MU_TPMT_SYM_DEF_OBJECT_Unmarshal (grub_tpm2_buffer_t buffer, TPMT_SYM_DEF_OBJECT_t *p); extern void grub_Tss2_MU_TPMS_SYMCIPHER_PARMS_Unmarshal (grub_tpm2_buffer_t buffer, TPMS_SYMCIPHER_PARMS_t *p); extern void grub_Tss2_MU_TPMU_ASYM_SCHEME_Unmarshal (grub_tpm2_buffer_t buffer, TPMI_ALG_RSA_DECRYPT_t scheme, TPMU_ASYM_SCHEME_t *p); extern void grub_Tss2_MU_TPMT_RSA_SCHEME_Unmarshal (grub_tpm2_buffer_t buffer, TPMT_RSA_SCHEME_t *p); extern void grub_Tss2_MU_TPMS_RSA_PARMS_Unmarshal (grub_tpm2_buffer_t buffer, TPMS_RSA_PARMS_t *p); extern void grub_Tss2_MU_TPMT_ECC_SCHEME_Unmarshal (grub_tpm2_buffer_t buffer, TPMT_ECC_SCHEME_t *p); extern void grub_Tss2_MU_TPMU_KDF_SCHEME_Unmarshal (grub_tpm2_buffer_t buffer, TPMI_ALG_KDF_t scheme, TPMU_KDF_SCHEME_t *p); extern void grub_Tss2_MU_TPMT_KDF_SCHEME_Unmarshal (grub_tpm2_buffer_t buffer, TPMT_KDF_SCHEME_t *p); extern void grub_Tss2_MU_TPMS_ECC_PARMS_Unmarshal (grub_tpm2_buffer_t buffer, TPMS_ECC_PARMS_t *p); extern void grub_Tss2_MU_TPMU_PUBLIC_PARMS_Unmarshal (grub_tpm2_buffer_t buffer, grub_uint32_t type, TPMU_PUBLIC_PARMS_t *p); extern void grub_Tss2_MU_TPMS_ECC_POINT_Unmarshal (grub_tpm2_buffer_t buffer, TPMS_ECC_POINT_t *p); extern void grub_Tss2_MU_TPMU_PUBLIC_ID_Unmarshal (grub_tpm2_buffer_t buffer, TPMI_ALG_PUBLIC_t type, TPMU_PUBLIC_ID_t *p); extern void grub_Tss2_MU_TPMT_PUBLIC_Unmarshal (grub_tpm2_buffer_t buffer, TPMT_PUBLIC_t *p); extern void grub_Tss2_MU_TPM2B_PUBLIC_Unmarshal (grub_tpm2_buffer_t buffer, TPM2B_PUBLIC_t *p); extern void grub_Tss2_MU_TPMS_NV_PUBLIC_Unmarshal (grub_tpm2_buffer_t buffer, TPMS_NV_PUBLIC_t *p); extern void grub_Tss2_MU_TPM2B_NV_PUBLIC_Unmarshal (grub_tpm2_buffer_t buffer, TPM2B_NV_PUBLIC_t *p); extern void grub_Tss2_MU_TPM2B_NAX_NV_BUFFER_Unmarshal (grub_tpm2_buffer_t buffer, TPM2B_MAX_NV_BUFFER_t *p); extern void grub_Tss2_MU_TPM2B_NAME_Unmarshal (grub_tpm2_buffer_t buffer, TPM2B_NAME_t *n); extern void grub_Tss2_MU_TPMS_TAGGED_PROPERTY_Unmarshal (grub_tpm2_buffer_t buffer, TPMS_TAGGED_PROPERTY_t *property); extern void grub_Tss2_MU_TPMT_TK_CREATION_Unmarshal (grub_tpm2_buffer_t buffer, TPMT_TK_CREATION_t *p); extern void grub_Tss2_MU_TPMT_TK_HASHCHECK_Unmarshal (grub_tpm2_buffer_t buffer, TPMT_TK_HASHCHECK_t *p); extern void grub_Tss2_MU_TPMT_TK_VERIFIED_Unmarshal (grub_tpm2_buffer_t buffer, TPMT_TK_VERIFIED_t *p); extern void grub_Tss2_MU_TPMS_PCR_SELECTION_Unmarshal (grub_tpm2_buffer_t buffer, TPMS_PCR_SELECTION_t *pcrSelection); extern void grub_Tss2_MU_TPML_PCR_SELECTION_Unmarshal (grub_tpm2_buffer_t buffer, TPML_PCR_SELECTION_t *pcrSelection); extern void grub_Tss2_MU_TPML_DIGEST_Unmarshal (grub_tpm2_buffer_t buffer, TPML_DIGEST_t *digest); extern void grub_Tss2_MU_TPMS_SIGNATURE_RSA_Unmarshal (grub_tpm2_buffer_t buffer, TPMS_SIGNATURE_RSA_t *p); extern void grub_Tss2_MU_TPMS_SIGNATURE_ECC_Unmarshal (grub_tpm2_buffer_t buffer, TPMS_SIGNATURE_ECC_t *p); extern void grub_Tss2_MU_TPMU_HA_Unmarshal (grub_tpm2_buffer_t buffer, TPMI_ALG_HASH_t hashAlg, TPMU_HA_t *p); extern void grub_Tss2_MU_TPMT_HA_Unmarshal (grub_tpm2_buffer_t buffer, TPMT_HA_t *p); extern void grub_Tss2_MU_TPMU_SIGNATURE_Unmarshal (grub_tpm2_buffer_t buffer, TPMI_ALG_SIG_SCHEME_t sigAlg, TPMU_SIGNATURE_t *p); extern void grub_Tss2_MU_TPMT_SIGNATURE_Unmarshal (grub_tpm2_buffer_t buffer, TPMT_SIGNATURE_t *p); #endif /* ! GRUB_TPM2_MU_HEADER */ grub-2.14~git20250718.0e36779/grub-core/lib/tss2/buffer.c0000644000175000017500000000657315036447510016761 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (C) 2022 Microsoft Corporation * Copyright (C) 2024 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include void grub_tpm2_buffer_init (grub_tpm2_buffer_t buffer) { grub_memset (buffer->data, 0, sizeof (buffer->data)); buffer->size = 0; buffer->offset = 0; buffer->cap = sizeof (buffer->data); buffer->error = 0; } void grub_tpm2_buffer_pack (grub_tpm2_buffer_t buffer, const void *data, grub_size_t size) { grub_uint32_t r = buffer->cap - buffer->size; if (buffer->error) return; if (size > r) { buffer->error = 1; return; } grub_memcpy (&buffer->data[buffer->size], (void *) data, size); buffer->size += size; } void grub_tpm2_buffer_pack_u8 (grub_tpm2_buffer_t buffer, grub_uint8_t value) { grub_tpm2_buffer_pack (buffer, (const void *) &value, sizeof (value)); } void grub_tpm2_buffer_pack_u16 (grub_tpm2_buffer_t buffer, grub_uint16_t value) { grub_uint16_t tmp = grub_cpu_to_be16 (value); grub_tpm2_buffer_pack (buffer, (const void *) &tmp, sizeof (tmp)); } void grub_tpm2_buffer_pack_u32 (grub_tpm2_buffer_t buffer, grub_uint32_t value) { grub_uint32_t tmp = grub_cpu_to_be32 (value); grub_tpm2_buffer_pack (buffer, (const void *) &tmp, sizeof (tmp)); } void grub_tpm2_buffer_unpack (grub_tpm2_buffer_t buffer, void *data, grub_size_t size) { grub_uint32_t r = buffer->size - buffer->offset; if (buffer->error) return; if (size > r) { buffer->error = 1; return; } grub_memcpy (data, &buffer->data[buffer->offset], size); buffer->offset += size; } void grub_tpm2_buffer_unpack_u8 (grub_tpm2_buffer_t buffer, grub_uint8_t *value) { grub_uint32_t r = buffer->size - buffer->offset; if (buffer->error) return; if (sizeof (*value) > r) { buffer->error = 1; return; } grub_memcpy (value, &buffer->data[buffer->offset], sizeof (*value)); buffer->offset += sizeof (*value); } void grub_tpm2_buffer_unpack_u16 (grub_tpm2_buffer_t buffer, grub_uint16_t *value) { grub_uint16_t tmp; grub_uint32_t r = buffer->size - buffer->offset; if (buffer->error) return; if (sizeof (tmp) > r) { buffer->error = 1; return; } grub_memcpy (&tmp, &buffer->data[buffer->offset], sizeof (tmp)); buffer->offset += sizeof (tmp); *value = grub_be_to_cpu16 (tmp); } void grub_tpm2_buffer_unpack_u32 (grub_tpm2_buffer_t buffer, grub_uint32_t *value) { grub_uint32_t tmp; grub_uint32_t r = buffer->size - buffer->offset; if (buffer->error) return; if (sizeof (tmp) > r) { buffer->error = 1; return; } grub_memcpy (&tmp, &buffer->data[buffer->offset], sizeof (tmp)); buffer->offset += sizeof (tmp); *value = grub_be_to_cpu32 (tmp); } grub-2.14~git20250718.0e36779/grub-core/lib/tss2/tss2_structs.h0000644000175000017500000005034015036447510020166 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (C) 2022 Microsoft Corporation * Copyright (C) 2024 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #ifndef GRUB_TPM2_INTERNAL_STRUCTS_HEADER #define GRUB_TPM2_INTERNAL_STRUCTS_HEADER 1 #include /* * TPM response header * This struct is used to calculate the minimum size of the TPM 2.0 response. * The format of the response: * * +----------------------+ * | UINT16 tag | * +----------------------+ * | UINT32 repsonse_size | * +----------------------+ * | UINT32 response_code | * +======================+ * | response_data | (optional) * +======================+ */ struct __attribute__ ((__packed__)) TPM_RESPONSE_HEADER { grub_uint16_t tag; grub_uint32_t response_size; TPM_RC_t response_code; }; typedef struct TPM_RESPONSE_HEADER TPM_RESPONSE_HEADER_t; /* TPMS_TAGGED_PROPERTY Structure */ struct TPMS_TAGGED_PROPERTY { TPM_PT_t property; grub_uint32_t value; }; typedef struct TPMS_TAGGED_PROPERTY TPMS_TAGGED_PROPERTY_t; /* TPML_TAGGED_TPM_PROPERTY Structure */ struct TPML_TAGGED_TPM_PROPERTY { grub_uint32_t count; TPMS_TAGGED_PROPERTY_t tpmProperty[TPM_MAX_TPM_PROPERTIES]; }; typedef struct TPML_TAGGED_TPM_PROPERTY TPML_TAGGED_TPM_PROPERTY_t; /* TPMU_CAPABILITIES Structure */ union TPMU_CAPABILITIES { TPML_TAGGED_TPM_PROPERTY_t tpmProperties; }; typedef union TPMU_CAPABILITIES TPMU_CAPABILITIES_t; /* TPMS_CAPABILITY_DATA Structure */ struct TPMS_CAPABILITY_DATA { TPM_CAP_t capability; TPMU_CAPABILITIES_t data; }; typedef struct TPMS_CAPABILITY_DATA TPMS_CAPABILITY_DATA_t; /* TPMS_PCR_SELECT Structure */ struct TPMS_PCR_SELECT { grub_uint8_t sizeOfSelect; grub_uint8_t pcrSelect[TPM_PCR_SELECT_MAX]; }; typedef struct TPMS_PCR_SELECT TPMS_PCR_SELECT_t; /* TPMS_PCR_SELECTION Structure */ struct TPMS_PCR_SELECTION { TPMI_ALG_HASH_t hash; grub_uint8_t sizeOfSelect; grub_uint8_t pcrSelect[TPM_PCR_SELECT_MAX]; }; typedef struct TPMS_PCR_SELECTION TPMS_PCR_SELECTION_t; static inline void TPMS_PCR_SELECTION_SelectPCR(TPMS_PCR_SELECTION_t *self, grub_uint32_t n) { self->pcrSelect[(n / 8)] |= (1 << (n % 8)); } /* TPML_PCR_SELECTION Structure */ struct TPML_PCR_SELECTION { grub_uint32_t count; TPMS_PCR_SELECTION_t pcrSelections[TPM_NUM_PCR_BANKS]; }; typedef struct TPML_PCR_SELECTION TPML_PCR_SELECTION_t; /* TPMU_HA Structure */ union TPMU_HA { grub_uint8_t sha1[TPM_SHA1_DIGEST_SIZE]; grub_uint8_t sha256[TPM_SHA256_DIGEST_SIZE]; grub_uint8_t sha384[TPM_SHA384_DIGEST_SIZE]; grub_uint8_t sha512[TPM_SHA512_DIGEST_SIZE]; grub_uint8_t sm3_256[TPM_SM3_256_DIGEST_SIZE]; }; typedef union TPMU_HA TPMU_HA_t; /* TPM2B Structure */ struct TPM2B { grub_uint16_t size; grub_uint8_t buffer[1]; }; typedef struct TPM2B TPM2B_t; /* TPM2B_DIGEST Structure */ struct TPM2B_DIGEST { grub_uint16_t size; grub_uint8_t buffer[sizeof(TPMU_HA_t)]; }; typedef struct TPM2B_DIGEST TPM2B_DIGEST_t; /* TPML_DIGEST Structure */ struct TPML_DIGEST { grub_uint32_t count; TPM2B_DIGEST_t digests[8]; }; typedef struct TPML_DIGEST TPML_DIGEST_t; /* TPM2B_NONCE Type */ typedef TPM2B_DIGEST_t TPM2B_NONCE_t; /* TPMA_SESSION Structure */ struct TPMA_SESSION { #ifdef GRUB_TARGET_WORDS_BIGENDIAN grub_uint8_t audit:1; grub_uint8_t encrypt:1; grub_uint8_t decrypt:1; grub_uint8_t reserved:2; grub_uint8_t auditReset:1; grub_uint8_t auditExclusive:1; grub_uint8_t continueSession:1; #else grub_uint8_t continueSession:1; grub_uint8_t auditExclusive:1; grub_uint8_t auditReset:1; grub_uint8_t reserved:2; grub_uint8_t decrypt:1; grub_uint8_t encrypt:1; grub_uint8_t audit:1; #endif }; typedef struct TPMA_SESSION TPMA_SESSION_t; /* TPM2B_AUTH Type */ typedef TPM2B_DIGEST_t TPM2B_AUTH_t; /* TPMS_AUTH_COMMAND Structure */ struct TPMS_AUTH_COMMAND { TPMI_SH_AUTH_SESSION_t sessionHandle; TPM2B_NONCE_t nonce; TPMA_SESSION_t sessionAttributes; TPM2B_AUTH_t hmac; }; typedef struct TPMS_AUTH_COMMAND TPMS_AUTH_COMMAND_t; /* TPMS_AUTH_RESPONSE Structure */ struct TPMS_AUTH_RESPONSE { TPM2B_NONCE_t nonce; TPMA_SESSION_t sessionAttributes; TPM2B_AUTH_t hmac; }; typedef struct TPMS_AUTH_RESPONSE TPMS_AUTH_RESPONSE_t; /* TPM2B_SENSITIVE_DATA Structure */ struct TPM2B_SENSITIVE_DATA { grub_uint16_t size; grub_uint8_t buffer[TPM_MAX_SYM_DATA]; }; typedef struct TPM2B_SENSITIVE_DATA TPM2B_SENSITIVE_DATA_t; /* TPMS_SENSITIVE_CREATE Structure */ struct TPMS_SENSITIVE_CREATE { TPM2B_AUTH_t userAuth; TPM2B_SENSITIVE_DATA_t data; }; typedef struct TPMS_SENSITIVE_CREATE TPMS_SENSITIVE_CREATE_t; /* TPM2B_SENSITIVE_CREATE Structure */ struct TPM2B_SENSITIVE_CREATE { grub_uint16_t size; TPMS_SENSITIVE_CREATE_t sensitive; }; typedef struct TPM2B_SENSITIVE_CREATE TPM2B_SENSITIVE_CREATE_t; /* TPMA_OBJECT Structure */ struct TPMA_OBJECT { #ifdef GRUB_TARGET_WORDS_BIGENDIAN grub_uint32_t reserved5:13; grub_uint32_t sign:1; grub_uint32_t decrypt:1; grub_uint32_t restricted:1; grub_uint32_t reserved4:4; grub_uint32_t encryptedDuplication:1; grub_uint32_t noDA:1; grub_uint32_t reserved3:2; grub_uint32_t adminWithPolicy:1; grub_uint32_t userWithAuth:1; grub_uint32_t sensitiveDataOrigin:1; grub_uint32_t fixedParent:1; grub_uint32_t reserved2:1; grub_uint32_t stClear:1; grub_uint32_t fixedTPM:1; grub_uint32_t reserved1:1; #else grub_uint32_t reserved1:1; grub_uint32_t fixedTPM:1; grub_uint32_t stClear:1; grub_uint32_t reserved2:1; grub_uint32_t fixedParent:1; grub_uint32_t sensitiveDataOrigin:1; grub_uint32_t userWithAuth:1; grub_uint32_t adminWithPolicy:1; grub_uint32_t reserved3:2; grub_uint32_t noDA:1; grub_uint32_t encryptedDuplication:1; grub_uint32_t reserved4:4; grub_uint32_t restricted:1; grub_uint32_t decrypt:1; grub_uint32_t sign:1; grub_uint32_t reserved5:13; #endif }; typedef struct TPMA_OBJECT TPMA_OBJECT_t; /* TPMS_SCHEME_HASH Structure */ struct TPMS_SCHEME_HASH { TPMI_ALG_HASH_t hashAlg; }; typedef struct TPMS_SCHEME_HASH TPMS_SCHEME_HASH_t; /* TPMS_SCHEME_HASH Types */ typedef TPMS_SCHEME_HASH_t TPMS_KEY_SCHEME_ECDH_t; typedef TPMS_SCHEME_HASH_t TPMS_KEY_SCHEME_ECMQV_t; typedef TPMS_SCHEME_HASH_t TPMS_SIG_SCHEME_RSASSA_t; typedef TPMS_SCHEME_HASH_t TPMS_SIG_SCHEME_RSAPSS_t; typedef TPMS_SCHEME_HASH_t TPMS_SIG_SCHEME_ECDSA_t; typedef TPMS_SCHEME_HASH_t TPMS_SIG_SCHEME_ECDAA_t; typedef TPMS_SCHEME_HASH_t TPMS_SIG_SCHEME_SM2_t; typedef TPMS_SCHEME_HASH_t TPMS_SIG_SCHEME_ECSCHNORR_t; typedef TPMS_SCHEME_HASH_t TPMS_ENC_SCHEME_RSAES_t; typedef TPMS_SCHEME_HASH_t TPMS_ENC_SCHEME_OAEP_t; typedef TPMS_SCHEME_HASH_t TPMS_SCHEME_KDF2_t; typedef TPMS_SCHEME_HASH_t TPMS_SCHEME_MGF1_t; typedef TPMS_SCHEME_HASH_t TPMS_SCHEME_KDF1_SP800_56A_t; typedef TPMS_SCHEME_HASH_t TPMS_SCHEME_KDF1_SP800_108_t; /* TPMS_SCHEME_HMAC Type */ typedef TPMS_SCHEME_HASH_t TPMS_SCHEME_HMAC_t; /* TPMS_SCHEME_XOR Structure */ struct TPMS_SCHEME_XOR { TPMI_ALG_HASH_t hashAlg; TPMI_ALG_KDF_t kdf; }; typedef struct TPMS_SCHEME_XOR TPMS_SCHEME_XOR_t; /* TPMU_SCHEME_KEYEDHASH Union */ union TPMU_SCHEME_KEYEDHASH { TPMS_SCHEME_HMAC_t hmac; TPMS_SCHEME_XOR_t exclusiveOr; }; typedef union TPMU_SCHEME_KEYEDHASH TPMU_SCHEME_KEYEDHASH_t; /* TPMT_KEYEDHASH_SCHEME Structure */ struct TPMT_KEYEDHASH_SCHEME { TPMI_ALG_KEYEDHASH_SCHEME_t scheme; TPMU_SCHEME_KEYEDHASH_t details; }; typedef struct TPMT_KEYEDHASH_SCHEME TPMT_KEYEDHASH_SCHEME_t; /* TPMS_KEYEDHASH_PARMS Structure */ struct TPMS_KEYEDHASH_PARMS { TPMT_KEYEDHASH_SCHEME_t scheme; }; typedef struct TPMS_KEYEDHASH_PARMS TPMS_KEYEDHASH_PARMS_t; /* TPMU_SYM_KEY_BITS Union */ union TPMU_SYM_KEY_BITS { TPM_KEY_BITS_t aes; TPM_KEY_BITS_t exclusiveOr; TPM_KEY_BITS_t sm4; TPM_KEY_BITS_t camellia; }; typedef union TPMU_SYM_KEY_BITS TPMU_SYM_KEY_BITS_t; /* TPMU_SYM_MODE Union */ union TPMU_SYM_MODE { TPMI_ALG_SYM_MODE_t aes; TPMI_ALG_SYM_MODE_t sm4; TPMI_ALG_SYM_MODE_t camellia; TPMI_ALG_SYM_MODE_t sym; }; typedef union TPMU_SYM_MODE TPMU_SYM_MODE_t; /* TPMT_SYM_DEF_OBJECT Structure */ struct TPMT_SYM_DEF_OBJECT { TPMI_ALG_SYM_OBJECT_t algorithm; TPMU_SYM_KEY_BITS_t keyBits; TPMU_SYM_MODE_t mode; }; typedef struct TPMT_SYM_DEF_OBJECT TPMT_SYM_DEF_OBJECT_t; /* TPMS_SYMCIPHER_PARMS Structure */ struct TPMS_SYMCIPHER_PARMS { TPMT_SYM_DEF_OBJECT_t sym; }; typedef struct TPMS_SYMCIPHER_PARMS TPMS_SYMCIPHER_PARMS_t; /* TPMU_ASYM_SCHEME Union */ union TPMU_ASYM_SCHEME { TPMS_KEY_SCHEME_ECDH_t ecdh; TPMS_KEY_SCHEME_ECMQV_t ecmqv; TPMS_SIG_SCHEME_RSASSA_t rsassa; TPMS_SIG_SCHEME_RSAPSS_t rsapss; TPMS_SIG_SCHEME_ECDSA_t ecdsa; TPMS_SIG_SCHEME_ECDAA_t ecdaa; TPMS_SIG_SCHEME_SM2_t sm2; TPMS_SIG_SCHEME_ECSCHNORR_t ecschnorr; TPMS_ENC_SCHEME_RSAES_t rsaes; TPMS_ENC_SCHEME_OAEP_t oaep; TPMS_SCHEME_HASH_t anySig; unsigned char padding[4]; }; typedef union TPMU_ASYM_SCHEME TPMU_ASYM_SCHEME_t; /* TPMT_RSA_SCHEME Structure */ struct TPMT_RSA_SCHEME { TPMI_ALG_RSA_SCHEME_t scheme; TPMU_ASYM_SCHEME_t details; }; typedef struct TPMT_RSA_SCHEME TPMT_RSA_SCHEME_t; /* TPMS_RSA_PARMS Structure */ struct TPMS_RSA_PARMS { TPMT_SYM_DEF_OBJECT_t symmetric; TPMT_RSA_SCHEME_t scheme; TPM_KEY_BITS_t keyBits; grub_uint32_t exponent; }; typedef struct TPMS_RSA_PARMS TPMS_RSA_PARMS_t; /* TPMT_ECC_SCHEME Structure */ struct TPMT_ECC_SCHEME { TPMI_ALG_ECC_SCHEME_t scheme; TPMU_ASYM_SCHEME_t details; }; typedef struct TPMT_ECC_SCHEME TPMT_ECC_SCHEME_t; /* TPMU_KDF_SCHEME Union */ union TPMU_KDF_SCHEME { TPMS_SCHEME_MGF1_t mgf1; TPMS_SCHEME_KDF1_SP800_56A_t kdf1_sp800_56a; TPMS_SCHEME_KDF2_t kdf2; TPMS_SCHEME_KDF1_SP800_108_t kdf1_sp800_108; }; typedef union TPMU_KDF_SCHEME TPMU_KDF_SCHEME_t; /* TPMT_KDF_SCHEME Structure */ struct TPMT_KDF_SCHEME { TPMI_ALG_KDF_t scheme; TPMU_KDF_SCHEME_t details; }; typedef struct TPMT_KDF_SCHEME TPMT_KDF_SCHEME_t; /* TPMS_ECC_PARMS Structure */ struct TPMS_ECC_PARMS { TPMT_SYM_DEF_OBJECT_t symmetric; TPMT_ECC_SCHEME_t scheme; TPMI_ECC_CURVE_t curveID; TPMT_KDF_SCHEME_t kdf; }; typedef struct TPMS_ECC_PARMS TPMS_ECC_PARMS_t; /* TPMT_ASYM_SCHEME Structure */ struct TPMT_ASYM_SCHEME { TPMI_ALG_ASYM_SCHEME_t scheme; TPMU_ASYM_SCHEME_t details; }; typedef struct TPMT_ASYM_SCHEME TPMT_ASYM_SCHEME_t; /* TPMS_ASYM_PARMS Structure */ struct TPMS_ASYM_PARMS { TPMT_SYM_DEF_OBJECT_t symmetric; TPMT_ASYM_SCHEME_t scheme; }; typedef struct TPMS_ASYM_PARMS TPMS_ASYM_PARMS_t; /* TPMU_PUBLIC_PARMS Union */ union TPMU_PUBLIC_PARMS { TPMS_KEYEDHASH_PARMS_t keyedHashDetail; TPMS_SYMCIPHER_PARMS_t symDetail; TPMS_RSA_PARMS_t rsaDetail; TPMS_ECC_PARMS_t eccDetail; TPMS_ASYM_PARMS_t asymDetail; }; typedef union TPMU_PUBLIC_PARMS TPMU_PUBLIC_PARMS_t; /* TPMT_PUBLIC_PARMS Structure */ struct TPMT_PUBLIC_PARMS { TPMI_ALG_PUBLIC_t type; TPMU_PUBLIC_PARMS_t parameters; }; typedef struct TPMT_PUBLIC_PARMS TPMT_PUBLIC_PARMS_t; /* TPM2B_PUBLIC_KEY_RSA Structure */ struct TPM2B_PUBLIC_KEY_RSA { grub_uint16_t size; grub_uint8_t buffer[TPM_MAX_RSA_KEY_BYTES]; }; typedef struct TPM2B_PUBLIC_KEY_RSA TPM2B_PUBLIC_KEY_RSA_t; /* TPM2B_ECC_PARAMETER Structure */ struct TPM2B_ECC_PARAMETER { grub_uint16_t size; grub_uint8_t buffer[TPM_MAX_ECC_KEY_BYTES]; }; typedef struct TPM2B_ECC_PARAMETER TPM2B_ECC_PARAMETER_t; /* TPMS_ECC_POINT Structure */ struct TPMS_ECC_POINT { TPM2B_ECC_PARAMETER_t x; TPM2B_ECC_PARAMETER_t y; }; typedef struct TPMS_ECC_POINT TPMS_ECC_POINT_t; /* TPMU_ENCRYPTED_SECRET Union */ union TPMU_ENCRYPTED_SECRET { grub_uint8_t ecc[sizeof(TPMS_ECC_POINT_t)]; grub_uint8_t rsa[TPM_MAX_RSA_KEY_BYTES]; grub_uint8_t symmetric[sizeof(TPM2B_DIGEST_t)]; grub_uint8_t keyedHash[sizeof(TPM2B_DIGEST_t)]; }; typedef union TPMU_ENCRYPTED_SECRET TPMU_ENCRYPTED_SECRET_t; /* TPM2B_ENCRYPTED_SECRET Structure */ struct TPM2B_ENCRYPTED_SECRET { grub_uint16_t size; grub_uint8_t secret[sizeof(TPMU_ENCRYPTED_SECRET_t)]; }; typedef struct TPM2B_ENCRYPTED_SECRET TPM2B_ENCRYPTED_SECRET_t; /* TPMU_PUBLIC_ID Union */ union TPMU_PUBLIC_ID { TPM2B_DIGEST_t keyedHash; TPM2B_DIGEST_t sym; TPM2B_PUBLIC_KEY_RSA_t rsa; TPMS_ECC_POINT_t ecc; }; typedef union TPMU_PUBLIC_ID TPMU_PUBLIC_ID_t; /* TPMT_PUBLIC Structure */ struct TPMT_PUBLIC { TPMI_ALG_PUBLIC_t type; TPMI_ALG_HASH_t nameAlg; TPMA_OBJECT_t objectAttributes; TPM2B_DIGEST_t authPolicy; TPMU_PUBLIC_PARMS_t parameters; TPMU_PUBLIC_ID_t unique; }; typedef struct TPMT_PUBLIC TPMT_PUBLIC_t; /* TPM2B_PUBLIC Structure */ struct TPM2B_PUBLIC { grub_uint16_t size; TPMT_PUBLIC_t publicArea; }; typedef struct TPM2B_PUBLIC TPM2B_PUBLIC_t; /* TPMT_HA Structure */ struct TPMT_HA { TPMI_ALG_HASH_t hashAlg; TPMU_HA_t digest; }; typedef struct TPMT_HA TPMT_HA_t; /* TPM2B_DATA Structure */ struct TPM2B_DATA { grub_uint16_t size; grub_uint8_t buffer[sizeof(TPMT_HA_t)]; }; typedef struct TPM2B_DATA TPM2B_DATA_t; /* TPMA_LOCALITY Structure */ struct TPMA_LOCALITY { #ifdef GRUB_TARGET_WORDS_BIGENDIAN grub_uint8_t Extended:3; grub_uint8_t TPM_LOC_FOUR:1; grub_uint8_t TPM_LOC_THREE:1; grub_uint8_t TPM_LOC_TWO:1; grub_uint8_t TPM_LOC_ONE:1; grub_uint8_t TPM_LOC_ZERO:1; #else grub_uint8_t TPM_LOC_ZERO:1; grub_uint8_t TPM_LOC_ONE:1; grub_uint8_t TPM_LOC_TWO:1; grub_uint8_t TPM_LOC_THREE:1; grub_uint8_t TPM_LOC_FOUR:1; grub_uint8_t Extended:3; #endif }; typedef struct TPMA_LOCALITY TPMA_LOCALITY_t; /* TPMU_NAME Union */ union TPMU_NAME { TPMT_HA_t digest; TPM_HANDLE_t handle; }; typedef union TPMU_NAME TPMU_NAME_t; /* TPM2B_NAME Structure */ struct TPM2B_NAME { grub_uint16_t size; grub_uint8_t name[sizeof(TPMU_NAME_t)]; }; typedef struct TPM2B_NAME TPM2B_NAME_t; /* TPMS_CREATION_DATA Structure */ struct TPMS_CREATION_DATA { TPML_PCR_SELECTION_t pcrSelect; TPM2B_DIGEST_t pcrDigest; TPMA_LOCALITY_t locality; TPM_ALG_ID_t parentNameAlg; TPM2B_NAME_t parentName; TPM2B_NAME_t parentQualifiedName; TPM2B_DATA_t outsideInfo; }; typedef struct TPMS_CREATION_DATA TPMS_CREATION_DATA_t; /* TPM2B_CREATION_DATA Structure */ struct TPM2B_CREATION_DATA { grub_uint16_t size; TPMS_CREATION_DATA_t creationData; }; typedef struct TPM2B_CREATION_DATA TPM2B_CREATION_DATA_t; /* TPMT_SYM_DEF Structure */ struct TPMT_SYM_DEF { TPMI_ALG_SYM_t algorithm; TPMU_SYM_KEY_BITS_t keyBits; TPMU_SYM_MODE_t mode; }; typedef struct TPMT_SYM_DEF TPMT_SYM_DEF_t; /* TPM2B_MAX_BUFFER Structure */ struct TPM2B_MAX_BUFFER { grub_uint16_t size; grub_uint8_t buffer[TPM_MAX_DIGEST_BUFFER]; }; typedef struct TPM2B_MAX_BUFFER TPM2B_MAX_BUFFER_t; /* TPMT_TK_HASHCHECK Structure */ struct TPMT_TK_HASHCHECK { TPM_ST_t tag; TPMI_RH_HIERARCHY_t hierarchy; TPM2B_DIGEST_t digest; }; typedef struct TPMT_TK_HASHCHECK TPMT_TK_HASHCHECK_t; /* TPM2B_SYM_KEY Structure */ struct TPM2B_SYM_KEY { grub_uint16_t size; grub_uint8_t buffer[TPM_MAX_SYM_KEY_BYTES]; }; typedef struct TPM2B_SYM_KEY TPM2B_SYM_KEY_t; /* TPM2B_PRIVATE_KEY_RSA Structure */ struct TPM2B_PRIVATE_KEY_RSA { grub_uint16_t size; grub_uint8_t buffer[TPM_MAX_RSA_KEY_BYTES/2]; }; typedef struct TPM2B_PRIVATE_KEY_RSA TPM2B_PRIVATE_KEY_RSA_t; /* TPM2B_PRIVATE_VENDOR_SPECIFIC Structure */ struct TPM2B_PRIVATE_VENDOR_SPECIFIC { grub_uint16_t size; grub_uint8_t buffer[TPM_PRIVATE_VENDOR_SPECIFIC_BYTES]; }; typedef struct TPM2B_PRIVATE_VENDOR_SPECIFIC TPM2B_PRIVATE_VENDOR_SPECIFIC_t; /* TPM2B_PRIVATE_VENDOR_SPECIFIC Union */ union TPMU_SENSITIVE_COMPOSITE { TPM2B_PRIVATE_KEY_RSA_t rsa; TPM2B_ECC_PARAMETER_t ecc; TPM2B_SENSITIVE_DATA_t bits; TPM2B_SYM_KEY_t sym; TPM2B_PRIVATE_VENDOR_SPECIFIC_t any; }; typedef union TPMU_SENSITIVE_COMPOSITE TPMU_SENSITIVE_COMPOSITE_t; /* TPMT_SENSITIVE Structure */ struct TPMT_SENSITIVE { TPMI_ALG_PUBLIC_t sensitiveType; TPM2B_AUTH_t authValue; TPM2B_DIGEST_t seedValue; TPMU_SENSITIVE_COMPOSITE_t sensitive; }; typedef struct TPMT_SENSITIVE TPMT_SENSITIVE_t; /* TPM2B_SENSITIVE Structure */ struct TPM2B_SENSITIVE { grub_uint16_t size; TPMT_SENSITIVE_t sensitiveArea; }; typedef struct TPM2B_SENSITIVE TPM2B_SENSITIVE_t; /* * _PRIVATE Structure * * Although '_PRIVATE' is the name defined in the TPM2 SPEC, it is too generic, * so here we add the '__TPM2B' prefix to make the struct specific for 'TPM2B_PRIVATE'. */ struct __TPM2B_PRIVATE { TPM2B_DIGEST_t integrityOuter; TPM2B_DIGEST_t integrityInner; TPM2B_SENSITIVE_t sensitive; }; typedef struct __TPM2B_PRIVATE __TPM2B_PRIVATE_t; /* TPM2B_PRIVATE Structure */ struct TPM2B_PRIVATE { grub_uint16_t size; grub_uint8_t buffer[sizeof(__TPM2B_PRIVATE_t)]; }; typedef struct TPM2B_PRIVATE TPM2B_PRIVATE_t; /* TPML_DIGEST_VALUES Structure */ struct TPML_DIGEST_VALUES { grub_uint32_t count; TPMT_HA_t digests[TPM_NUM_PCR_BANKS]; }; typedef struct TPML_DIGEST_VALUES TPML_DIGEST_VALUES_t; /* TPM2B_MAX_NV_BUFFER Structure */ struct TPM2B_MAX_NV_BUFFER { grub_uint16_t size; grub_uint8_t buffer[TPM_MAX_NV_BUFFER_SIZE]; }; typedef struct TPM2B_MAX_NV_BUFFER TPM2B_MAX_NV_BUFFER_t; /* TPMS_NV_PUBLIC Structure */ struct TPMS_NV_PUBLIC { TPMI_RH_NV_INDEX_t nvIndex; TPMI_ALG_HASH_t nameAlg; TPMA_NV_t attributes; TPM2B_DIGEST_t authPolicy; grub_uint16_t dataSize; }; typedef struct TPMS_NV_PUBLIC TPMS_NV_PUBLIC_t; /* TPM2B_NV_PUBLIC Structure */ struct TPM2B_NV_PUBLIC { grub_uint16_t size; TPMS_NV_PUBLIC_t nvPublic; }; typedef struct TPM2B_NV_PUBLIC TPM2B_NV_PUBLIC_t; /* TPMT_TK_CREATION Structure */ struct TPMT_TK_CREATION { TPM_ST_t tag; TPMI_RH_HIERARCHY_t hierarchy; TPM2B_DIGEST_t digest; }; typedef struct TPMT_TK_CREATION TPMT_TK_CREATION_t; /* TPMS_EMPTY Structure */ struct TPMS_EMPTY { grub_uint8_t empty[1]; /* a structure with no member */ }; typedef struct TPMS_EMPTY TPMS_EMPTY_t; /* TPMS_SIGNATURE_RSA Structure */ struct TPMS_SIGNATURE_RSA { TPMI_ALG_HASH_t hash; TPM2B_PUBLIC_KEY_RSA_t sig; }; typedef struct TPMS_SIGNATURE_RSA TPMS_SIGNATURE_RSA_t; /* Definition of Types for RSA Signature */ typedef TPMS_SIGNATURE_RSA_t TPMS_SIGNATURE_RSASSA_t; typedef TPMS_SIGNATURE_RSA_t TPMS_SIGNATURE_RSAPSS_t; /* TPMS_SIGNATURE_ECC Structure */ struct TPMS_SIGNATURE_ECC { TPMI_ALG_HASH_t hash; TPM2B_ECC_PARAMETER_t signatureR; TPM2B_ECC_PARAMETER_t signatureS; }; typedef struct TPMS_SIGNATURE_ECC TPMS_SIGNATURE_ECC_t; /* Definition of Types for ECC TPMS_SIGNATURE_ECC */ typedef TPMS_SIGNATURE_ECC_t TPMS_SIGNATURE_ECDSA_t; typedef TPMS_SIGNATURE_ECC_t TPMS_SIGNATURE_ECDAA_t; typedef TPMS_SIGNATURE_ECC_t TPMS_SIGNATURE_SM2_t; typedef TPMS_SIGNATURE_ECC_t TPMS_SIGNATURE_ECSCHNORR_t; /* TPMU_SIGNATURE Structure */ union TPMU_SIGNATURE { TPMS_SIGNATURE_RSASSA_t rsassa; TPMS_SIGNATURE_RSAPSS_t rsapss; TPMS_SIGNATURE_ECDSA_t ecdsa; TPMS_SIGNATURE_ECDAA_t ecdaa; TPMS_SIGNATURE_SM2_t sm2; TPMS_SIGNATURE_ECSCHNORR_t ecschnorr; TPMT_HA_t hmac; TPMS_SCHEME_HASH_t any; TPMS_EMPTY_t null; }; typedef union TPMU_SIGNATURE TPMU_SIGNATURE_t; /* TPMT_SIGNATURE Structure */ struct TPMT_SIGNATURE { TPMI_ALG_SIG_SCHEME_t sigAlg; TPMU_SIGNATURE_t signature; }; typedef struct TPMT_SIGNATURE TPMT_SIGNATURE_t; static inline TPMI_ALG_HASH_t TPMT_SIGNATURE_get_hash_alg (TPMT_SIGNATURE_t *sig) { switch (sig->sigAlg) { case TPM_ALG_RSASSA: return sig->signature.rsassa.hash; case TPM_ALG_RSAPSS: return sig->signature.rsapss.hash; case TPM_ALG_ECDSA: return sig->signature.ecdsa.hash; case TPM_ALG_ECDAA: return sig->signature.ecdaa.hash; case TPM_ALG_SM2: return sig->signature.sm2.hash; case TPM_ALG_ECSCHNORR: return sig->signature.ecschnorr.hash; case TPM_ALG_HMAC: return sig->signature.hmac.hashAlg; default: break; } return TPM_ALG_NULL; } /* TPMT_TK_VERIFIED Structure */ struct TPMT_TK_VERIFIED { TPM_ST_t tag; TPMI_RH_HIERARCHY_t hierarchy; TPM2B_DIGEST_t digest; }; typedef struct TPMT_TK_VERIFIED TPMT_TK_VERIFIED_t; #endif /* ! GRUB_TPM2_INTERNAL_STRUCTS_HEADER */ grub-2.14~git20250718.0e36779/grub-core/lib/tss2/tss2.c0000644000175000017500000000142315036447510016370 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (C) 2024 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include GRUB_MOD_LICENSE ("GPLv3+"); grub-2.14~git20250718.0e36779/grub-core/lib/tss2/tss2_buffer.h0000644000175000017500000000364515036447510017736 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (C) 2022 Microsoft Corporation * Copyright (C) 2024 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #ifndef GRUB_TPM2_BUFFER_HEADER #define GRUB_TPM2_BUFFER_HEADER 1 #include #define GRUB_TPM2_BUFFER_CAPACITY 4096 struct grub_tpm2_buffer { grub_uint8_t data[GRUB_TPM2_BUFFER_CAPACITY]; grub_size_t size; grub_size_t offset; grub_size_t cap; bool error; }; typedef struct grub_tpm2_buffer *grub_tpm2_buffer_t; extern void grub_tpm2_buffer_init (grub_tpm2_buffer_t buffer); extern void grub_tpm2_buffer_pack (grub_tpm2_buffer_t buffer, const void *data, grub_size_t size); extern void grub_tpm2_buffer_pack_u8 (grub_tpm2_buffer_t buffer, grub_uint8_t value); extern void grub_tpm2_buffer_pack_u16 (grub_tpm2_buffer_t buffer, grub_uint16_t value); extern void grub_tpm2_buffer_pack_u32 (grub_tpm2_buffer_t buffer, grub_uint32_t value); extern void grub_tpm2_buffer_unpack (grub_tpm2_buffer_t buffer, void *data, grub_size_t size); extern void grub_tpm2_buffer_unpack_u8 (grub_tpm2_buffer_t buffer, grub_uint8_t *value); extern void grub_tpm2_buffer_unpack_u16 (grub_tpm2_buffer_t buffer, grub_uint16_t *value); extern void grub_tpm2_buffer_unpack_u32 (grub_tpm2_buffer_t buffer, grub_uint32_t *value); #endif /* ! GRUB_TPM2_BUFFER_HEADER */ grub-2.14~git20250718.0e36779/grub-core/lib/tss2/tcg2.h0000644000175000017500000000217715036447510016350 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (C) 2022 Microsoft Corporation * Copyright (C) 2024 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #ifndef GRUB_TPM2_TCG2_HEADER #define GRUB_TPM2_TCG2_HEADER 1 #include #include extern grub_err_t grub_tcg2_get_max_output_size (grub_size_t *size); extern grub_err_t grub_tcg2_submit_command (grub_size_t input_size, grub_uint8_t *input, grub_size_t output_size, grub_uint8_t *output); #endif /* ! GRUB_TPM2_TCG2_HEADER */ grub-2.14~git20250718.0e36779/grub-core/lib/tss2/tpm2_cmd.h0000644000175000017500000001452215036447510017213 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (C) 2022 Microsoft Corporation * Copyright (C) 2024 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #ifndef GRUB_TPM2_COMMANDS_HEADER #define GRUB_TPM2_COMMANDS_HEADER 1 #include extern TPM_RC_t grub_tpm2_createprimary (const TPMI_RH_HIERARCHY_t primaryHandle, const TPMS_AUTH_COMMAND_t *authCommand, const TPM2B_SENSITIVE_CREATE_t *inSensitive, const TPM2B_PUBLIC_t *inPublic, const TPM2B_DATA_t *outsideInfo, const TPML_PCR_SELECTION_t *creationPCR, TPM_HANDLE_t *objectHandle, TPM2B_PUBLIC_t *outPublic, TPM2B_CREATION_DATA_t *creationData, TPM2B_DIGEST_t *creationHash, TPMT_TK_CREATION_t *creationTicket, TPM2B_NAME_t *name, TPMS_AUTH_RESPONSE_t *authResponse); extern TPM_RC_t grub_tpm2_startauthsession (const TPMI_DH_OBJECT_t tpmKey, const TPMI_DH_ENTITY_t bind, const TPMS_AUTH_COMMAND_t *authCommand, const TPM2B_NONCE_t *nonceCaller, const TPM2B_ENCRYPTED_SECRET_t *encryptedSalt, const TPM_SE_t sessionType, const TPMT_SYM_DEF_t *symmetric, const TPMI_ALG_HASH_t authHash, TPMI_SH_AUTH_SESSION_t *sessionHandle, TPM2B_NONCE_t *nonceTpm, TPMS_AUTH_RESPONSE_t *authResponse); extern TPM_RC_t grub_tpm2_policypcr (const TPMI_SH_POLICY_t policySession, const TPMS_AUTH_COMMAND_t *authCommand, const TPM2B_DIGEST_t *pcrDigest, const TPML_PCR_SELECTION_t *pcrs, TPMS_AUTH_RESPONSE_t *authResponse); extern TPM_RC_t grub_tpm2_readpublic (const TPMI_DH_OBJECT_t objectHandle, const TPMS_AUTH_COMMAND_t *authCommand, TPM2B_PUBLIC_t *outPublic); extern TPM_RC_t grub_tpm2_load (const TPMI_DH_OBJECT_t parent_handle, const TPMS_AUTH_COMMAND_t *authCommand, const TPM2B_PRIVATE_t *inPrivate, const TPM2B_PUBLIC_t *inPublic, TPM_HANDLE_t *objectHandle, TPM2B_NAME_t *name, TPMS_AUTH_RESPONSE_t *authResponse); extern TPM_RC_t grub_tpm2_loadexternal (const TPMS_AUTH_COMMAND_t *authCommand, const TPM2B_SENSITIVE_t *inPrivate, const TPM2B_PUBLIC_t *inPublic, const TPMI_RH_HIERARCHY_t hierarchy, TPM_HANDLE_t *objectHandle, TPM2B_NAME_t *name, TPMS_AUTH_RESPONSE_t *authResponse); extern TPM_RC_t grub_tpm2_unseal (const TPMI_DH_OBJECT_t item_handle, const TPMS_AUTH_COMMAND_t *authCommand, TPM2B_SENSITIVE_DATA_t *outData, TPMS_AUTH_RESPONSE_t *authResponse); extern TPM_RC_t grub_tpm2_flushcontext (const TPMI_DH_CONTEXT_t handle); extern TPM_RC_t grub_tpm2_pcr_read (const TPMS_AUTH_COMMAND_t *authCommand, const TPML_PCR_SELECTION_t *pcrSelectionIn, grub_uint32_t *pcrUpdateCounter, TPML_PCR_SELECTION_t *pcrSelectionOut, TPML_DIGEST_t *pcrValues, TPMS_AUTH_RESPONSE_t *authResponse); extern TPM_RC_t grub_tpm2_policygetdigest (const TPMI_SH_POLICY_t policySession, const TPMS_AUTH_COMMAND_t *authCommand, TPM2B_DIGEST_t *policyDigest, TPMS_AUTH_RESPONSE_t *authResponse); extern TPM_RC_t grub_tpm2_create (const TPMI_DH_OBJECT_t parentHandle, const TPMS_AUTH_COMMAND_t *authCommand, const TPM2B_SENSITIVE_CREATE_t *inSensitive, const TPM2B_PUBLIC_t *inPublic, const TPM2B_DATA_t *outsideInfo, const TPML_PCR_SELECTION_t *creationPCR, TPM2B_PRIVATE_t *outPrivate, TPM2B_PUBLIC_t *outPublic, TPM2B_CREATION_DATA_t *creationData, TPM2B_DIGEST_t *creationHash, TPMT_TK_CREATION_t *creationTicket, TPMS_AUTH_RESPONSE_t *authResponse); extern TPM_RC_t grub_tpm2_evictcontrol (const TPMI_RH_PROVISION_t auth, const TPMI_DH_OBJECT_t objectHandle, const TPMS_AUTH_COMMAND_t *authCommand, const TPMI_DH_PERSISTENT_t persistentHandle, TPMS_AUTH_RESPONSE_t *authResponse); extern TPM_RC_t grub_tpm2_hash (const TPMS_AUTH_COMMAND_t *authCommand, const TPM2B_MAX_BUFFER_t *data, const TPMI_ALG_HASH_t hashAlg, const TPMI_RH_HIERARCHY_t hierarchy, TPM2B_DIGEST_t *outHash, TPMT_TK_HASHCHECK_t *validation, TPMS_AUTH_RESPONSE_t *authResponse); extern TPM_RC_t grub_tpm2_verifysignature (const TPMI_DH_OBJECT_t keyHandle, const TPMS_AUTH_COMMAND_t *authCommand, const TPM2B_DIGEST_t *digest, const TPMT_SIGNATURE_t *signature, TPMT_TK_VERIFIED_t *validation, TPMS_AUTH_RESPONSE_t *authResponse); extern TPM_RC_t grub_tpm2_policyauthorize (const TPMI_SH_POLICY_t policySession, const TPMS_AUTH_COMMAND_t *authCommand, const TPM2B_DIGEST_t *approvedPolicy, const TPM2B_NONCE_t *policyRef, const TPM2B_NAME_t *keySign, const TPMT_TK_VERIFIED_t *checkTicket, TPMS_AUTH_RESPONSE_t *authResponse); extern TPM_RC_t grub_tpm2_testparms (const TPMT_PUBLIC_PARMS_t *parms, const TPMS_AUTH_COMMAND_t *authCommand); extern TPM_RC_t grub_tpm2_nv_definespace (const TPMI_RH_PROVISION_t authHandle, const TPMS_AUTH_COMMAND_t *authCommand, const TPM2B_AUTH_t *auth, const TPM2B_NV_PUBLIC_t *publicInfo); extern TPM_RC_t grub_tpm2_nv_undefinespace (const TPMI_RH_PROVISION_t authHandle, const TPMI_RH_NV_INDEX_t nvIndex, const TPMS_AUTH_COMMAND_t *authCommand); extern TPM_RC_t grub_tpm2_nv_readpublic (const TPMI_RH_NV_INDEX_t nvIndex, const TPMS_AUTH_COMMAND_t *authCommand, TPM2B_NV_PUBLIC_t *nvPublic, TPM2B_NAME_t *nvName); extern TPM_RC_t grub_tpm2_nv_read (const TPMI_RH_NV_AUTH_t authHandle, const TPMI_RH_NV_INDEX_t nvIndex, const TPMS_AUTH_COMMAND_t *authCommand, const grub_uint16_t size, const grub_uint16_t offset, TPM2B_MAX_NV_BUFFER_t *data); extern TPM_RC_t grub_tpm2_nv_write (const TPMI_RH_NV_AUTH_t authHandle, const TPMI_RH_NV_INDEX_t nvIndex, const TPMS_AUTH_COMMAND_t *authCommand, const TPM2B_MAX_NV_BUFFER_t *data, const grub_uint16_t offset); #endif /* ! GRUB_TPM2_COMMANDS_HEADER */ grub-2.14~git20250718.0e36779/grub-core/lib/tss2/tcg2_emu.c0000644000175000017500000000264015036447510017204 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (C) 2024 SUSE LLC * Copyright (C) 2024 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include grub_err_t grub_tcg2_get_max_output_size (grub_size_t *size) { if (size == NULL) return GRUB_ERR_BAD_ARGUMENT; *size = GRUB_TPM2_BUFFER_CAPACITY; return GRUB_ERR_NONE; } grub_err_t grub_tcg2_submit_command (grub_size_t input_size, grub_uint8_t *input, grub_size_t output_size, grub_uint8_t *output) { if (grub_util_tpm_write (input, input_size) != input_size) return GRUB_ERR_BAD_DEVICE; if (grub_util_tpm_read (output, output_size) < sizeof (TPM_RESPONSE_HEADER_t)) return GRUB_ERR_BAD_DEVICE; return GRUB_ERR_NONE; } grub-2.14~git20250718.0e36779/grub-core/lib/tss2/tss2_types.h0000644000175000017500000004347115036447510017632 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (C) 2022 Microsoft Corporation * Copyright (C) 2024 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #ifndef GRUB_TPM2_INTERNAL_TYPES_HEADER #define GRUB_TPM2_INTERNAL_TYPES_HEADER 1 #include /* TPM2_RC Constants */ typedef grub_uint32_t TPM_RC_t; #define TPM_RC_1 ((TPM_RC_t) 0x100) #define TPM_RC_2 ((TPM_RC_t) 0x200) #define TPM_RC_3 ((TPM_RC_t) 0x300) #define TPM_RC_4 ((TPM_RC_t) 0x400) #define TPM_RC_5 ((TPM_RC_t) 0x500) #define TPM_RC_6 ((TPM_RC_t) 0x600) #define TPM_RC_7 ((TPM_RC_t) 0x700) #define TPM_RC_8 ((TPM_RC_t) 0x800) #define TPM_RC_9 ((TPM_RC_t) 0x900) #define TPM_RC_A ((TPM_RC_t) 0xA00) #define TPM_RC_ASYMMETRIC ((TPM_RC_t) 0x081) #define TPM_RC_ATTRIBUTES ((TPM_RC_t) 0x082) #define TPM_RC_AUTH_CONTEXT ((TPM_RC_t) 0x145) #define TPM_RC_AUTH_FAIL ((TPM_RC_t) 0x08E) #define TPM_RC_AUTH_MISSING ((TPM_RC_t) 0x125) #define TPM_RC_AUTHSIZE ((TPM_RC_t) 0x144) #define TPM_RC_AUTH_TYPE ((TPM_RC_t) 0x124) #define TPM_RC_AUTH_UNAVAILABLE ((TPM_RC_t) 0x12F) #define TPM_RC_B ((TPM_RC_t) 0xB00) #define TPM_RC_BAD_AUTH ((TPM_RC_t) 0x0A2) #define TPM_RC_BAD_CONTEXT ((TPM_RC_t) 0x150) #define TPM_RC_BAD_TAG ((TPM_RC_t) 0x01E) #define TPM_RC_BINDING ((TPM_RC_t) 0x0A5) #define TPM_RC_C ((TPM_RC_t) 0xC00) #define TPM_RC_CANCELED ((TPM_RC_t) 0x909) #define TPM_RC_COMMAND_CODE ((TPM_RC_t) 0x143) #define TPM_RC_COMMAND_SIZE ((TPM_RC_t) 0x142) #define TPM_RC_CONTEXT_GAP ((TPM_RC_t) 0x901) #define TPM_RC_CPHASH ((TPM_RC_t) 0x151) #define TPM_RC_CURVE ((TPM_RC_t) 0x0A6) #define TPM_RC_D ((TPM_RC_t) 0xD00) #define TPM_RC_DISABLED ((TPM_RC_t) 0x120) #define TPM_RC_E ((TPM_RC_t) 0xE00) #define TPM_RC_ECC_POINT ((TPM_RC_t) 0x0A7) #define TPM_RC_EXCLUSIVE ((TPM_RC_t) 0x121) #define TPM_RC_EXPIRED ((TPM_RC_t) 0x0A3) #define TPM_RC_F ((TPM_RC_t) 0xF00) #define TPM_RC_FAILURE ((TPM_RC_t) 0x101) #define TPM_RC_H ((TPM_RC_t) 0x000) #define TPM_RC_HANDLE ((TPM_RC_t) 0x08B) #define TPM_RC_HASH ((TPM_RC_t) 0x083) #define TPM_RC_HIERARCHY ((TPM_RC_t) 0x085) #define TPM_RC_HMAC ((TPM_RC_t) 0x119) #define TPM_RC_INITIALIZE ((TPM_RC_t) 0x100) #define TPM_RC_INSUFFICIENT ((TPM_RC_t) 0x09A) #define TPM_RC_INTEGRITY ((TPM_RC_t) 0x09F) #define TPM_RC_KDF ((TPM_RC_t) 0x08C) #define TPM_RC_KEY ((TPM_RC_t) 0x09C) #define TPM_RC_KEY_SIZE ((TPM_RC_t) 0x087) #define TPM_RC_LOCALITY ((TPM_RC_t) 0x907) #define TPM_RC_LOCKOUT ((TPM_RC_t) 0x921) #define TPM_RC_MEMORY ((TPM_RC_t) 0x904) #define TPM_RC_MGF ((TPM_RC_t) 0x088) #define TPM_RC_MODE ((TPM_RC_t) 0x089) #define TPM_RC_NEEDS_TEST ((TPM_RC_t) 0x153) #define TPM_RC_N_MASK ((TPM_RC_t) 0xF00) #define TPM_RC_NONCE ((TPM_RC_t) 0x08F) #define TPM_RC_NO_RESULT ((TPM_RC_t) 0x154) #define TPM_RC_NOT_USED ((TPM_RC_t) 0x97F) #define TPM_RC_NV_AUTHORIZATION ((TPM_RC_t) 0x149) #define TPM_RC_NV_DEFINED ((TPM_RC_t) 0x14C) #define TPM_RC_NV_LOCKED ((TPM_RC_t) 0x148) #define TPM_RC_NV_RANGE ((TPM_RC_t) 0x146) #define TPM_RC_NV_RATE ((TPM_RC_t) 0x920) #define TPM_RC_NV_SIZE ((TPM_RC_t) 0x147) #define TPM_RC_NV_SPACE ((TPM_RC_t) 0x14B) #define TPM_RC_NV_UNAVAILABLE ((TPM_RC_t) 0x923) #define TPM_RC_NV_UNINITIALIZED ((TPM_RC_t) 0x14A) #define TPM_RC_OBJECT_HANDLES ((TPM_RC_t) 0x906) #define TPM_RC_OBJECT_MEMORY ((TPM_RC_t) 0x902) #define TPM_RC_P ((TPM_RC_t) 0x040) #define TPM_RC_PARENT ((TPM_RC_t) 0x152) #define TPM_RC_PCR ((TPM_RC_t) 0x127) #define TPM_RC_PCR_CHANGED ((TPM_RC_t) 0x128) #define TPM_RC_POLICY ((TPM_RC_t) 0x126) #define TPM_RC_POLICY_CC ((TPM_RC_t) 0x0A4) #define TPM_RC_POLICY_FAIL ((TPM_RC_t) 0x09D) #define TPM_RC_PP ((TPM_RC_t) 0x090) #define TPM_RC_PRIVATE ((TPM_RC_t) 0x10B) #define TPM_RC_RANGE ((TPM_RC_t) 0x08D) #define TPM_RC_REBOOT ((TPM_RC_t) 0x130) #define TPM_RC_REFERENCE_H0 ((TPM_RC_t) 0x910) #define TPM_RC_REFERENCE_H1 ((TPM_RC_t) 0x911) #define TPM_RC_REFERENCE_H2 ((TPM_RC_t) 0x912) #define TPM_RC_REFERENCE_H3 ((TPM_RC_t) 0x913) #define TPM_RC_REFERENCE_H4 ((TPM_RC_t) 0x914) #define TPM_RC_REFERENCE_H5 ((TPM_RC_t) 0x915) #define TPM_RC_REFERENCE_H6 ((TPM_RC_t) 0x916) #define TPM_RC_REFERENCE_S0 ((TPM_RC_t) 0x918) #define TPM_RC_REFERENCE_S1 ((TPM_RC_t) 0x919) #define TPM_RC_REFERENCE_S2 ((TPM_RC_t) 0x91A) #define TPM_RC_REFERENCE_S3 ((TPM_RC_t) 0x91B) #define TPM_RC_REFERENCE_S4 ((TPM_RC_t) 0x91C) #define TPM_RC_REFERENCE_S5 ((TPM_RC_t) 0x91D) #define TPM_RC_REFERENCE_S6 ((TPM_RC_t) 0x91E) #define TPM_RC_RESERVED_BITS ((TPM_RC_t) 0x0A1) #define TPM_RC_RETRY ((TPM_RC_t) 0x922) #define TPM_RC_S ((TPM_RC_t) 0x800) #define TPM_RC_SCHEME ((TPM_RC_t) 0x092) #define TPM_RC_SELECTOR ((TPM_RC_t) 0x098) #define TPM_RC_SENSITIVE ((TPM_RC_t) 0x155) #define TPM_RC_SEQUENCE ((TPM_RC_t) 0x103) #define TPM_RC_SESSION_HANDLES ((TPM_RC_t) 0x905) #define TPM_RC_SESSION_MEMORY ((TPM_RC_t) 0x903) #define TPM_RC_SIGNATURE ((TPM_RC_t) 0x09B) #define TPM_RC_SIZE ((TPM_RC_t) 0x095) #define TPM_RC_SUCCESS ((TPM_RC_t) 0x000) #define TPM_RC_SYMMETRIC ((TPM_RC_t) 0x096) #define TPM_RC_TAG ((TPM_RC_t) 0x097) #define TPM_RC_TESTING ((TPM_RC_t) 0x90A) #define TPM_RC_TICKET ((TPM_RC_t) 0x0A0) #define TPM_RC_TOO_MANY_CONTEXTS ((TPM_RC_t) 0x12E) #define TPM_RC_TYPE ((TPM_RC_t) 0x08A) #define TPM_RC_UNBALANCED ((TPM_RC_t) 0x131) #define TPM_RC_UPGRADE ((TPM_RC_t) 0x12D) #define TPM_RC_VALUE ((TPM_RC_t) 0x084) #define TPM_RC_YIELDED ((TPM_RC_t) 0x908) /* TPMA_NV_t Constants */ typedef grub_uint32_t TPMA_NV_t; #define TPMA_NV_PPWRITE ((TPMA_NV_t) 0x00000001) #define TPMA_NV_OWNERWRITE ((TPMA_NV_t) 0x00000002) #define TPMA_NV_AUTHWRITE ((TPMA_NV_t) 0x00000004) #define TPMA_NV_POLICYWRITE ((TPMA_NV_t) 0x00000008) #define TPMA_NV_TPM2_NT_MASK ((TPMA_NV_t) 0x000000F0) #define TPMA_NV_TPM2_NT_SHIFT (4) #define TPMA_NV_RESERVED1_MASK ((TPMA_NV_t) 0x00000300) #define TPMA_NV_POLICY_DELETE ((TPMA_NV_t) 0x00000400) #define TPMA_NV_WRITELOCKED ((TPMA_NV_t) 0x00000800) #define TPMA_NV_WRITEALL ((TPMA_NV_t) 0x00001000) #define TPMA_NV_WRITEDEFINE ((TPMA_NV_t) 0x00002000) #define TPMA_NV_WRITE_STCLEAR ((TPMA_NV_t) 0x00004000) #define TPMA_NV_GLOBALLOCK ((TPMA_NV_t) 0x00008000) #define TPMA_NV_PPREAD ((TPMA_NV_t) 0x00010000) #define TPMA_NV_OWNERREAD ((TPMA_NV_t) 0x00020000) #define TPMA_NV_AUTHREAD ((TPMA_NV_t) 0x00040000) #define TPMA_NV_POLICYREAD ((TPMA_NV_t) 0x00080000) #define TPMA_NV_RESERVED2_MASK ((TPMA_NV_t) 0x01F00000) #define TPMA_NV_NO_DA ((TPMA_NV_t) 0x02000000) #define TPMA_NV_ORDERLY ((TPMA_NV_t) 0x04000000) #define TPMA_NV_CLEAR_STCLEAR ((TPMA_NV_t) 0x08000000) #define TPMA_NV_READLOCKED ((TPMA_NV_t) 0x10000000) #define TPMA_NV_WRITTEN ((TPMA_NV_t) 0x20000000) #define TPMA_NV_PLATFORMCREATE ((TPMA_NV_t) 0x40000000) #define TPMA_NV_READ_STCLEAR ((TPMA_NV_t) 0x80000000) /* TPM_ALG_ID_t Constants */ typedef grub_uint16_t TPM_ALG_ID_t; #define TPM_ALG_ERROR ((TPM_ALG_ID_t) 0x0000) #define TPM_ALG_AES ((TPM_ALG_ID_t) 0x0006) #define TPM_ALG_CAMELLIA ((TPM_ALG_ID_t) 0x0026) #define TPM_ALG_CBC ((TPM_ALG_ID_t) 0x0042) #define TPM_ALG_CFB ((TPM_ALG_ID_t) 0x0043) #define TPM_ALG_ECB ((TPM_ALG_ID_t) 0x0044) #define TPM_ALG_ECC ((TPM_ALG_ID_t) 0x0023) #define TPM_ALG_ECDAA ((TPM_ALG_ID_t) 0x001A) #define TPM_ALG_ECDSA ((TPM_ALG_ID_t) 0x0018) #define TPM_ALG_ECSCHNORR ((TPM_ALG_ID_t) 0x001C) #define TPM_ALG_HMAC ((TPM_ALG_ID_t) 0x0005) #define TPM_ALG_KDF1_SP800_108 ((TPM_ALG_ID_t) 0x0022) #define TPM_ALG_KDF1_SP800_56A ((TPM_ALG_ID_t) 0x0020) #define TPM_ALG_KDF2 ((TPM_ALG_ID_t) 0x0021) #define TPM_ALG_KEYEDHASH ((TPM_ALG_ID_t) 0x0008) #define TPM_ALG_MGF1 ((TPM_ALG_ID_t) 0x0007) #define TPM_ALG_NULL ((TPM_ALG_ID_t) 0x0010) #define TPM_ALG_RSA ((TPM_ALG_ID_t) 0x0001) #define TPM_ALG_RSASSA ((TPM_ALG_ID_t) 0x0014) #define TPM_ALG_RSAPSS ((TPM_ALG_ID_t) 0x0016) #define TPM_ALG_SHA1 ((TPM_ALG_ID_t) 0x0004) #define TPM_ALG_SHA256 ((TPM_ALG_ID_t) 0x000B) #define TPM_ALG_SHA384 ((TPM_ALG_ID_t) 0x000C) #define TPM_ALG_SHA512 ((TPM_ALG_ID_t) 0x000D) #define TPM_ALG_SM2 ((TPM_ALG_ID_t) 0x001B) #define TPM_ALG_SM3_256 ((TPM_ALG_ID_t) 0x0012) #define TPM_ALG_SM4 ((TPM_ALG_ID_t) 0x0013) #define TPM_ALG_SYMCIPHER ((TPM_ALG_ID_t) 0x0025) #define TPM_ALG_XOR ((TPM_ALG_ID_t) 0x000A) /* TPM_CAP_t Constants */ typedef grub_uint32_t TPM_CAP_t; #define TPM_CAP_FIRST ((TPM_CAP_t) 0x00000000) #define TPM_CAP_ALGS ((TPM_CAP_t) 0x00000000) #define TPM_CAP_HANDLES ((TPM_CAP_t) 0x00000001) #define TPM_CAP_COMMANDS ((TPM_CAP_t) 0x00000002) #define TPM_CAP_PP_COMMANDS ((TPM_CAP_t) 0x00000003) #define TPM_CAP_AUDIT_COMMANDS ((TPM_CAP_t) 0x00000004) #define TPM_CAP_PCRS ((TPM_CAP_t) 0x00000005) #define TPM_CAP_TPM_PROPERTIES ((TPM_CAP_t) 0x00000006) #define TPM_CAP_PCR_PROPERTIES ((TPM_CAP_t) 0x00000007) #define TPM_CAP_ECC_CURVES ((TPM_CAP_t) 0x00000008) #define TPM_CAP_LAST ((TPM_CAP_t) 0x00000008) #define TPM_CAP_VENDOR_PROPERTY ((TPM_CAP_t) 0x00000100) /* TPM_PT_t Constants */ typedef grub_uint32_t TPM_PT_t; #define TPM_PT_NONE ((TPM_PT_t) 0x00000000) #define PT_GROUP ((TPM_PT_t) 0x00000100) #define PT_FIXED ((TPM_PT_t) (PT_GROUP * 1)) #define TPM_PT_FAMILY_INDICATOR ((TPM_PT_t) (PT_FIXED + 0)) #define TPM_PT_LEVEL ((TPM_PT_t) (PT_FIXED + 1)) #define TPM_PT_REVISION ((TPM_PT_t) (PT_FIXED + 2)) #define TPM_PT_DAY_OF_YEAR ((TPM_PT_t) (PT_FIXED + 3)) #define TPM_PT_YEAR ((TPM_PT_t) (PT_FIXED + 4)) #define TPM_PT_PCR_COUNT ((TPM_PT_t) (PT_FIXED + 18)) /* TPM_SE_t Constants */ typedef grub_uint8_t TPM_SE_t; #define TPM_SE_HMAC ((TPM_SE_t) 0x00) #define TPM_SE_POLICY ((TPM_SE_t) 0x01) #define TPM_SE_TRIAL ((TPM_SE_t) 0x03) /* TPMI_YES_NO_t Constants */ typedef grub_uint8_t TPMI_YES_NO_t; #define TPM_NO ((TPMI_YES_NO_t)0) #define TPM_YES ((TPMI_YES_NO_t)1) /* TPM_ST_t Constants */ typedef grub_uint16_t TPM_ST_t; typedef TPM_ST_t TPMI_ST_COMMAND_TAG_t; #define TPM_ST_NO_SESSIONS ((TPMI_ST_COMMAND_TAG_t) 0x8001) #define TPM_ST_SESSIONS ((TPMI_ST_COMMAND_TAG_t) 0x8002) /* TPM_HANDLE_t Types */ typedef grub_uint32_t TPM_HANDLE_t; typedef TPM_HANDLE_t TPMI_RH_HIERARCHY_t; typedef TPM_HANDLE_t TPMI_RH_LOCKOUT_t; typedef TPM_HANDLE_t TPMI_SH_AUTH_SESSION_t; typedef TPM_HANDLE_t TPMI_DH_CONTEXT_t; typedef TPM_HANDLE_t TPMI_DH_OBJECT_t; typedef TPM_HANDLE_t TPMI_DH_ENTITY_t; typedef TPM_HANDLE_t TPMI_SH_POLICY_t; typedef TPM_HANDLE_t TPMI_DH_PCR_t; typedef TPM_HANDLE_t TPMI_RH_NV_AUTH_t; typedef TPM_HANDLE_t TPMI_RH_NV_INDEX_t; /* TPM_HT_t Constants */ typedef grub_uint8_t TPM_HT_t; #define TPM_HT_NV_INDEX ((TPM_HT_t) 0x01) #define TPM_HT_PERMANENT ((TPM_HT_t) 0x40) #define TPM_HT_PERSISTENT ((TPM_HT_t) 0x81) /* TPM_RH_t Constants */ typedef TPM_HANDLE_t TPM_RH_t; #define TPM_RH_FIRST ((TPM_RH_t) 0x40000000) #define TPM_RH_SRK ((TPM_RH_t) 0x40000000) #define TPM_RH_OWNER ((TPM_RH_t) 0x40000001) #define TPM_RH_REVOKE ((TPM_RH_t) 0x40000002) #define TPM_RH_TRANSPORT ((TPM_RH_t) 0x40000003) #define TPM_RH_OPERATOR ((TPM_RH_t) 0x40000004) #define TPM_RH_ADMIN ((TPM_RH_t) 0x40000005) #define TPM_RH_EK ((TPM_RH_t) 0x40000006) #define TPM_RH_NULL ((TPM_RH_t) 0x40000007) #define TPM_RH_UNASSIGNED ((TPM_RH_t) 0x40000008) #define TPM_RS_PW ((TPM_RH_t) 0x40000009) #define TPM_RH_LOCKOUT ((TPM_RH_t) 0x4000000A) #define TPM_RH_ENDORSEMENT ((TPM_RH_t) 0x4000000B) #define TPM_RH_PLATFORM ((TPM_RH_t) 0x4000000C) #define TPM_RH_PLATFORM_NV ((TPM_RH_t) 0x4000000D) #define TPM_RH_AUTH_00 ((TPM_RH_t) 0x40000010) #define TPM_RH_AUTH_FF ((TPM_RH_t) 0x4000010F) #define TPM_RH_LAST ((TPM_RH_t) 0x4000010F) /* TPM_HC_t Constants */ typedef TPM_HANDLE_t TPM_HC_t; #define TPM_HR_HANDLE_MASK ((TPM_HC_t) 0x00FFFFFF) #define TPM_HR_RANGE_MASK ((TPM_HC_t) 0xFF000000) #define TPM_HR_SHIFT ((TPM_HC_t) 24) #define TPM_HR_NV_INDEX ((TPM_HC_t) (TPM_HT_NV_INDEX << TPM_HR_SHIFT)) #define TPM_HR_PERSISTENT ((TPM_HC_t) (TPM_HT_PERSISTENT << TPM_HR_SHIFT)) #define TPM_HR_PERMANENT ((TPM_HC_t) (TPM_HT_PERMANENT << TPM_HR_SHIFT)) #define TPM_PERSISTENT_FIRST ((TPM_HC_t) (TPM_HR_PERSISTENT + 0)) #define TPM_PERSISTENT_LAST ((TPM_HC_t) (TPM_PERSISTENT_FIRST + 0x00FFFFFF)) #define TPM_PERMANENT_FIRST ((TPM_HC_t) TPM_RH_FIRST) #define TPM_PERMANENT_LAST ((TPM_HC_t) TPM_RH_LAST) /* TPM Handle Type Checks */ #define TPM_HT_IS_NVINDEX(HANDLE) (((HANDLE) >> TPM_HR_SHIFT) == TPM_HT_NV_INDEX) #define TPM_HT_IS_PERMANENT(HANDLE) (((HANDLE) >> TPM_HR_SHIFT) == TPM_HT_PERMANENT) #define TPM_HT_IS_PERSISTENT(HANDLE) (((HANDLE) >> TPM_HR_SHIFT) == TPM_HT_PERSISTENT) /* TPM_ECC_CURVE_t Constants */ typedef grub_uint16_t TPM_ECC_CURVE_t; #define TPM_ECC_NONE ((TPM_ECC_CURVE_t) 0x0000) #define TPM_ECC_NIST_P192 ((TPM_ECC_CURVE_t) 0x0001) #define TPM_ECC_NIST_P224 ((TPM_ECC_CURVE_t) 0x0002) #define TPM_ECC_NIST_P256 ((TPM_ECC_CURVE_t) 0x0003) #define TPM_ECC_NIST_P384 ((TPM_ECC_CURVE_t) 0x0004) #define TPM_ECC_NIST_P521 ((TPM_ECC_CURVE_t) 0x0005) #define TPM_ECC_BN_P256 ((TPM_ECC_CURVE_t) 0x0010) #define TPM_ECC_BN_P638 ((TPM_ECC_CURVE_t) 0x0011) #define TPM_ECC_SM2_P256 ((TPM_ECC_CURVE_t) 0x0020) /* TPM_CC_t Constants */ typedef grub_uint32_t TPM_CC_t; #define TPM_CC_EvictControl ((TPM_CC_t) 0x00000120) #define TPM_CC_CreatePrimary ((TPM_CC_t) 0x00000131) #define TPM_CC_Create ((TPM_CC_t) 0x00000153) #define TPM_CC_FlushContext ((TPM_CC_t) 0x00000165) #define TPM_CC_ReadPublic ((TPM_CC_t) 0x00000173) #define TPM_CC_StartAuthSession ((TPM_CC_t) 0x00000176) #define TPM_CC_PolicyPCR ((TPM_CC_t) 0x0000017f) #define TPM_CC_NV_DefineSpace ((TPM_CC_t) 0x0000012a) #define TPM_CC_NV_Read ((TPM_CC_t) 0x0000014e) #define TPM_CC_NV_ReadPublic ((TPM_CC_t) 0x00000169) #define TPM_CC_NV_Write ((TPM_CC_t) 0x00000137) #define TPM_CC_NV_UndefineSpace ((TPM_CC_t) 0x00000122) #define TPM_CC_GetCapability ((TPM_CC_t) 0x0000017a) #define TPM_CC_PCR_Read ((TPM_CC_t) 0x0000017e) #define TPM_CC_Load ((TPM_CC_t) 0x00000157) #define TPM_CC_LoadExternal ((TPM_CC_t) 0x00000167) #define TPM_CC_Unseal ((TPM_CC_t) 0x0000015e) #define TPM_CC_PolicyGetDigest ((TPM_CC_t) 0x00000189) #define TPM_CC_Hash ((TPM_CC_t) 0x0000017d) #define TPM_CC_VerifySignature ((TPM_CC_t) 0x00000177) #define TPM_CC_PolicyAuthorize ((TPM_CC_t) 0x0000016a) #define TPM_CC_TestParms ((TPM_CC_t) 0x0000018a) /* Hash algorithm sizes */ #define TPM_SHA1_DIGEST_SIZE 20 #define TPM_SHA256_DIGEST_SIZE 32 #define TPM_SM3_256_DIGEST_SIZE 32 #define TPM_SHA384_DIGEST_SIZE 48 #define TPM_SHA512_DIGEST_SIZE 64 /* Encryption algorithm sizes */ #define TPM_MAX_SYM_BLOCK_SIZE 16 #define TPM_MAX_SYM_DATA 256 #define TPM_MAX_ECC_KEY_BYTES 128 #define TPM_MAX_SYM_KEY_BYTES 32 #define TPM_MAX_RSA_KEY_BYTES 512 /* Buffer Size Constants */ #define TPM_MAX_PCRS 24 #define TPM_NUM_PCR_BANKS 16 #define TPM_PCR_SELECT_MAX ((TPM_MAX_PCRS + 7) / 8) #define TPM_MAX_DIGEST_BUFFER 1024 #define TPM_MAX_TPM_PROPERTIES 8 #define TPM_MAX_NV_BUFFER_SIZE 2048 #define TPM_PRIVATE_VENDOR_SPECIFIC_BYTES 1280 /* TPM_GENERATED_t Constants */ typedef grub_uint32_t TPM_GENERATED_t; #define TPM_GENERATED_VALUE ((TPM_GENERATED_t) 0xff544347) /* TPM_ALG_ID_t Types */ typedef TPM_ALG_ID_t TPMI_ALG_PUBLIC_t; typedef TPM_ALG_ID_t TPMI_ALG_HASH_t; typedef TPM_ALG_ID_t TPMI_ALG_KEYEDHASH_SCHEME_t; typedef TPM_ALG_ID_t TPMI_ALG_KDF_t; typedef TPM_ALG_ID_t TPMI_ALG_SYM_OBJECT_t; typedef TPM_ALG_ID_t TPMI_ALG_SYM_MODE_t; typedef TPM_ALG_ID_t TPMI_ALG_RSA_DECRYPT_t; typedef TPM_ALG_ID_t TPMI_ALG_ECC_SCHEME_t; typedef TPM_ALG_ID_t TPMI_ALG_ASYM_SCHEME_t; typedef TPM_ALG_ID_t TPMI_ALG_RSA_SCHEME_t; typedef TPM_ALG_ID_t TPMI_ALG_SYM_t; typedef TPM_ALG_ID_t TPMI_ALG_SIG_SCHEME_t; /* TPM_KEY_BITS_t Type */ typedef grub_uint16_t TPM_KEY_BITS_t; /* TPMI_ECC_CURVE_t Types */ typedef TPM_ECC_CURVE_t TPMI_ECC_CURVE_t; /* TPMI_RH_PROVISION_t Type */ typedef TPM_HANDLE_t TPMI_RH_PROVISION_t; /* TPMI_RH_PROVISION_t Type */ typedef TPM_HANDLE_t TPMI_DH_PERSISTENT_t; #endif /* ! GRUB_TPM2_INTERNAL_TYPES_HEADER */ grub-2.14~git20250718.0e36779/grub-core/lib/tss2/tpm2_cmd.c0000644000175000017500000011215215036447510017204 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (C) 2022 Microsoft Corporation * Copyright (C) 2024 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include #include #include #include static TPM_RC_t tpm2_submit_command_real (const TPMI_ST_COMMAND_TAG_t tag, const TPM_CC_t commandCode, TPM_RC_t *responseCode, const struct grub_tpm2_buffer *in, struct grub_tpm2_buffer *out) { grub_err_t err; struct grub_tpm2_buffer buf; TPMI_ST_COMMAND_TAG_t tag_out; grub_uint32_t command_size; grub_size_t max_output_size; /* Marshal */ grub_tpm2_buffer_init (&buf); grub_tpm2_buffer_pack_u16 (&buf, tag); grub_tpm2_buffer_pack_u32 (&buf, 0); grub_tpm2_buffer_pack_u32 (&buf, commandCode); grub_tpm2_buffer_pack (&buf, in->data, in->size); if (buf.error != 0) return TPM_RC_FAILURE; /* Convert the command size to big endian to fill the u32 buffer below 'tag' */ command_size = grub_cpu_to_be32 (buf.size); grub_memcpy (&buf.data[sizeof (grub_uint16_t)], &command_size, sizeof (command_size)); /* Stay within output block limits */ err = grub_tcg2_get_max_output_size (&max_output_size); if (err != GRUB_ERR_NONE || max_output_size > out->cap) max_output_size = out->cap - 1; /* Submit */ err = grub_tcg2_submit_command (buf.size, buf.data, max_output_size, out->data); if (err != GRUB_ERR_NONE) return TPM_RC_FAILURE; /* Unmarshal */ out->size = sizeof (grub_uint16_t) + sizeof (grub_uint32_t) + sizeof (grub_uint32_t); grub_tpm2_buffer_unpack_u16 (out, &tag_out); grub_tpm2_buffer_unpack_u32 (out, &command_size); grub_tpm2_buffer_unpack_u32 (out, responseCode); out->size = command_size; if (out->error != 0) return TPM_RC_FAILURE; return TPM_RC_SUCCESS; } static TPM_RC_t tpm2_submit_command (const TPMI_ST_COMMAND_TAG_t tag, const TPM_CC_t commandCode, TPM_RC_t *responseCode, const struct grub_tpm2_buffer *in, struct grub_tpm2_buffer *out) { TPM_RC_t err; int retry_cnt = 0; /* Catch TPM_RC_RETRY and send the command again */ do { err = tpm2_submit_command_real (tag, commandCode, responseCode, in, out); if (*responseCode != TPM_RC_RETRY) break; retry_cnt++; } while (retry_cnt < 3); return err; } TPM_RC_t grub_tpm2_createprimary (const TPMI_RH_HIERARCHY_t primaryHandle, const TPMS_AUTH_COMMAND_t *authCommand, const TPM2B_SENSITIVE_CREATE_t *inSensitive, const TPM2B_PUBLIC_t *inPublic, const TPM2B_DATA_t *outsideInfo, const TPML_PCR_SELECTION_t *creationPCR, TPM_HANDLE_t *objectHandle, TPM2B_PUBLIC_t *outPublic, TPM2B_CREATION_DATA_t *creationData, TPM2B_DIGEST_t *creationHash, TPMT_TK_CREATION_t *creationTicket, TPM2B_NAME_t *name, TPMS_AUTH_RESPONSE_t *authResponse) { TPM_RC_t rc; struct grub_tpm2_buffer in; struct grub_tpm2_buffer out; TPM_HANDLE_t objectHandleTmp; TPM2B_PUBLIC_t outPublicTmp; TPM2B_CREATION_DATA_t creationDataTmp; TPM2B_DIGEST_t creationHashTmp; TPMT_TK_CREATION_t creationTicketTmp; TPM2B_NAME_t nameTmp; TPMS_AUTH_RESPONSE_t authResponseTmp; TPMI_ST_COMMAND_TAG_t tag = authCommand ? TPM_ST_SESSIONS : TPM_ST_NO_SESSIONS; TPM_RC_t responseCode; grub_uint32_t parameterSize; if (inSensitive == NULL || inPublic == NULL || outsideInfo == NULL || creationPCR == NULL) return TPM_RC_VALUE; if (objectHandle == NULL) objectHandle = &objectHandleTmp; if (outPublic == NULL) outPublic = &outPublicTmp; if (creationData == NULL) creationData = &creationDataTmp; if (creationHash == NULL) creationHash = &creationHashTmp; if (creationTicket == NULL) creationTicket = &creationTicketTmp; if (name == NULL) name = &nameTmp; if (authResponse == NULL) authResponse = &authResponseTmp; grub_memset (outPublic, 0, sizeof (*outPublic)); grub_memset (creationData, 0, sizeof (*creationData)); grub_memset (creationHash, 0, sizeof (*creationHash)); grub_memset (creationTicket, 0, sizeof (*creationTicket)); grub_memset (name, 0, sizeof (*name)); grub_memset (authResponse, 0, sizeof (*authResponse)); /* Marshal */ grub_tpm2_buffer_init (&in); grub_tpm2_buffer_pack_u32 (&in, primaryHandle); if (authCommand != NULL) grub_Tss2_MU_TPMS_AUTH_COMMAND_Marshal (&in, authCommand); grub_Tss2_MU_TPM2B_SENSITIVE_CREATE_Marshal (&in, inSensitive); grub_Tss2_MU_TPM2B_PUBLIC_Marshal (&in, inPublic); grub_Tss2_MU_TPM2B_Marshal (&in, outsideInfo->size, outsideInfo->buffer); grub_Tss2_MU_TPML_PCR_SELECTION_Marshal (&in, creationPCR); if (in.error != 0) return TPM_RC_FAILURE; /* Submit */ grub_tpm2_buffer_init (&out); rc = tpm2_submit_command (tag, TPM_CC_CreatePrimary, &responseCode, &in, &out); if (rc != TPM_RC_SUCCESS) return rc; if (responseCode != TPM_RC_SUCCESS) return responseCode; /* Unmarshal */ grub_tpm2_buffer_unpack_u32 (&out, objectHandle); if (tag == TPM_ST_SESSIONS) grub_tpm2_buffer_unpack_u32 (&out, ¶meterSize); grub_Tss2_MU_TPM2B_PUBLIC_Unmarshal (&out, outPublic); grub_Tss2_MU_TPM2B_CREATION_DATA_Unmarshal (&out, creationData); grub_Tss2_MU_TPM2B_DIGEST_Unmarshal (&out, creationHash); grub_Tss2_MU_TPMT_TK_CREATION_Unmarshal (&out, creationTicket); grub_Tss2_MU_TPM2B_NAME_Unmarshal (&out, name); if (tag == TPM_ST_SESSIONS) grub_Tss2_MU_TPMS_AUTH_RESPONSE_Unmarshal (&out, authResponse); if (out.error != 0) return TPM_RC_FAILURE; return TPM_RC_SUCCESS; } TPM_RC_t grub_tpm2_startauthsession (const TPMI_DH_OBJECT_t tpmKey, const TPMI_DH_ENTITY_t bind, const TPMS_AUTH_COMMAND_t *authCommand, const TPM2B_NONCE_t *nonceCaller, const TPM2B_ENCRYPTED_SECRET_t *encryptedSalt, const TPM_SE_t sessionType, const TPMT_SYM_DEF_t *symmetric, const TPMI_ALG_HASH_t authHash, TPMI_SH_AUTH_SESSION_t *sessionHandle, TPM2B_NONCE_t *nonceTpm, TPMS_AUTH_RESPONSE_t *authResponse) { TPM_RC_t rc; struct grub_tpm2_buffer in; struct grub_tpm2_buffer out; TPMI_SH_AUTH_SESSION_t sessionHandleTmp; TPM2B_NONCE_t nonceTpmTmp; TPMS_AUTH_RESPONSE_t authResponseTmp; TPMI_ST_COMMAND_TAG_t tag = authCommand ? TPM_ST_SESSIONS : TPM_ST_NO_SESSIONS; TPM_RC_t responseCode; grub_uint32_t param_size; if (nonceCaller == NULL || symmetric == NULL) return TPM_RC_VALUE; if (tpmKey == TPM_RH_NULL && (encryptedSalt && encryptedSalt->size != 0)) return TPM_RC_VALUE; if (sessionHandle == NULL) sessionHandle = &sessionHandleTmp; if (nonceTpm == NULL) nonceTpm = &nonceTpmTmp; if (authResponse == NULL) authResponse = &authResponseTmp; grub_memset (sessionHandle, 0, sizeof (*sessionHandle)); grub_memset (nonceTpm, 0, sizeof (*nonceTpm)); grub_memset (authResponse, 0, sizeof (*authResponse)); /* Marshal */ grub_tpm2_buffer_init (&in); grub_tpm2_buffer_pack_u32 (&in, tpmKey); grub_tpm2_buffer_pack_u32 (&in, bind); if (tag == TPM_ST_SESSIONS) grub_Tss2_MU_TPMS_AUTH_COMMAND_Marshal (&in, authCommand); grub_Tss2_MU_TPM2B_Marshal (&in, nonceCaller->size, nonceCaller->buffer); if (encryptedSalt != NULL) grub_Tss2_MU_TPM2B_Marshal (&in, encryptedSalt->size, encryptedSalt->secret); else grub_tpm2_buffer_pack_u16 (&in, 0); grub_tpm2_buffer_pack_u8 (&in, sessionType); grub_Tss2_MU_TPMT_SYM_DEF_Marshal (&in, symmetric); grub_tpm2_buffer_pack_u16 (&in, authHash); if (in.error != 0) return TPM_RC_FAILURE; /* Submit */ grub_tpm2_buffer_init (&out); rc = tpm2_submit_command (tag, TPM_CC_StartAuthSession, &responseCode, &in, &out); if (rc != TPM_RC_SUCCESS) return rc; if (responseCode != TPM_RC_SUCCESS) return responseCode; /* Unmarshal */ grub_tpm2_buffer_unpack_u32 (&out, sessionHandle); if (tag == TPM_ST_SESSIONS) grub_tpm2_buffer_unpack_u32 (&out, ¶m_size); grub_Tss2_MU_TPM2B_NONCE_Unmarshal (&out, nonceTpm); if (tag == TPM_ST_SESSIONS) grub_Tss2_MU_TPMS_AUTH_RESPONSE_Unmarshal (&out, authResponse); if (out.error != 0) return TPM_RC_FAILURE; return TPM_RC_SUCCESS; } TPM_RC_t grub_tpm2_policypcr (const TPMI_SH_POLICY_t policySessions, const TPMS_AUTH_COMMAND_t *authCommand, const TPM2B_DIGEST_t *pcrDigest, const TPML_PCR_SELECTION_t *pcrs, TPMS_AUTH_RESPONSE_t *authResponse) { TPM_RC_t rc; struct grub_tpm2_buffer in; struct grub_tpm2_buffer out; TPMS_AUTH_RESPONSE_t authResponseTmp; TPMI_ST_COMMAND_TAG_t tag = authCommand ? TPM_ST_SESSIONS : TPM_ST_NO_SESSIONS; TPM_RC_t responseCode; grub_uint32_t param_size; if (pcrs == NULL) return TPM_RC_VALUE; if (authResponse == NULL) authResponse = &authResponseTmp; grub_memset (authResponse, 0, sizeof (*authResponse)); /* Marshal */ grub_tpm2_buffer_init (&in); grub_tpm2_buffer_pack_u32 (&in, policySessions); if (tag == TPM_ST_SESSIONS) grub_Tss2_MU_TPMS_AUTH_COMMAND_Marshal (&in, authCommand); if (pcrDigest != NULL) grub_Tss2_MU_TPM2B_Marshal (&in, pcrDigest->size, pcrDigest->buffer); else grub_tpm2_buffer_pack_u16 (&in, 0); grub_Tss2_MU_TPML_PCR_SELECTION_Marshal (&in, pcrs); if (in.error != 0) return TPM_RC_FAILURE; /* Submit */ grub_tpm2_buffer_init (&out); rc = tpm2_submit_command (tag, TPM_CC_PolicyPCR, &responseCode, &in, &out); if (rc != TPM_RC_SUCCESS) return rc; if (responseCode != TPM_RC_SUCCESS) return responseCode; /* Unmarshal*/ if (tag == TPM_ST_SESSIONS) grub_tpm2_buffer_unpack_u32 (&out, ¶m_size); if (tag == TPM_ST_SESSIONS) grub_Tss2_MU_TPMS_AUTH_RESPONSE_Unmarshal (&out, authResponse); if (out.error != 0) return TPM_RC_FAILURE; return TPM_RC_SUCCESS; } TPM_RC_t grub_tpm2_readpublic (const TPMI_DH_OBJECT_t objectHandle, const TPMS_AUTH_COMMAND_t *authCommand, TPM2B_PUBLIC_t *outPublic) { TPM_RC_t rc; struct grub_tpm2_buffer in; struct grub_tpm2_buffer out; TPMI_ST_COMMAND_TAG_t tag = authCommand ? TPM_ST_SESSIONS : TPM_ST_NO_SESSIONS; TPM_RC_t responseCode; grub_uint32_t parameterSize; /* Marshal */ grub_tpm2_buffer_init (&in); grub_tpm2_buffer_pack_u32 (&in, objectHandle); if (authCommand != NULL) grub_Tss2_MU_TPMS_AUTH_COMMAND_Marshal (&in, authCommand); if (in.error != 0) return TPM_RC_FAILURE; /* Submit */ grub_tpm2_buffer_init (&out); rc = tpm2_submit_command (tag, TPM_CC_ReadPublic, &responseCode, &in, &out); if (rc != TPM_RC_SUCCESS) return rc; if (responseCode != TPM_RC_SUCCESS) return responseCode; /* Unmarshal */ if (tag == TPM_ST_SESSIONS) grub_tpm2_buffer_unpack_u32 (&out, ¶meterSize); grub_Tss2_MU_TPM2B_PUBLIC_Unmarshal (&out, outPublic); if (out.error != 0) return TPM_RC_FAILURE; return TPM_RC_SUCCESS; } TPM_RC_t grub_tpm2_load (const TPMI_DH_OBJECT_t parent_handle, const TPMS_AUTH_COMMAND_t *authCommand, const TPM2B_PRIVATE_t *inPrivate, const TPM2B_PUBLIC_t *inPublic, TPM_HANDLE_t *objectHandle, TPM2B_NAME_t *name, TPMS_AUTH_RESPONSE_t *authResponse) { TPM_RC_t rc; struct grub_tpm2_buffer in; struct grub_tpm2_buffer out; TPM_HANDLE_t objectHandleTmp; TPM2B_NAME_t nameTmp; TPMS_AUTH_RESPONSE_t authResponseTmp; TPMI_ST_COMMAND_TAG_t tag = authCommand ? TPM_ST_SESSIONS : TPM_ST_NO_SESSIONS; TPM_RC_t responseCode; grub_uint32_t param_size; if (inPrivate == NULL || inPublic == NULL) return TPM_RC_VALUE; if (objectHandle == NULL) objectHandle = &objectHandleTmp; if (name == NULL) name = &nameTmp; if (authResponse == NULL) authResponse = &authResponseTmp; grub_memset (objectHandle, 0, sizeof (*objectHandle)); grub_memset (name, 0, sizeof (*name)); grub_memset (authResponse, 0, sizeof (*authResponse)); /* Marshal */ grub_tpm2_buffer_init (&in); grub_tpm2_buffer_pack_u32 (&in, parent_handle); if (authCommand != NULL) grub_Tss2_MU_TPMS_AUTH_COMMAND_Marshal (&in, authCommand); grub_Tss2_MU_TPM2B_Marshal (&in, inPrivate->size, inPrivate->buffer); grub_Tss2_MU_TPM2B_PUBLIC_Marshal (&in, inPublic); if (in.error != 0) return TPM_RC_FAILURE; /* Submit */ grub_tpm2_buffer_init (&out); rc = tpm2_submit_command (tag, TPM_CC_Load, &responseCode, &in, &out); if (rc != TPM_RC_SUCCESS) return rc; if (responseCode != TPM_RC_SUCCESS) return responseCode; /* Unmarshal */ grub_tpm2_buffer_unpack_u32 (&out, objectHandle); if (tag == TPM_ST_SESSIONS) grub_tpm2_buffer_unpack_u32 (&out, ¶m_size); grub_Tss2_MU_TPM2B_NAME_Unmarshal (&out, name); if (tag == TPM_ST_SESSIONS) grub_Tss2_MU_TPMS_AUTH_RESPONSE_Unmarshal (&out, authResponse); if (out.error != 0) return TPM_RC_FAILURE; return TPM_RC_SUCCESS; } TPM_RC_t grub_tpm2_loadexternal (const TPMS_AUTH_COMMAND_t *authCommand, const TPM2B_SENSITIVE_t *inPrivate, const TPM2B_PUBLIC_t *inPublic, const TPMI_RH_HIERARCHY_t hierarchy, TPM_HANDLE_t *objectHandle, TPM2B_NAME_t *name, TPMS_AUTH_RESPONSE_t *authResponse) { TPM_RC_t rc; struct grub_tpm2_buffer in; struct grub_tpm2_buffer out; TPM_HANDLE_t objectHandleTmp; TPM2B_NAME_t nameTmp; TPMS_AUTH_RESPONSE_t authResponseTmp; TPMI_ST_COMMAND_TAG_t tag = authCommand ? TPM_ST_SESSIONS : TPM_ST_NO_SESSIONS; TPM_RC_t responseCode; grub_uint32_t param_size; if (inPublic == NULL) return TPM_RC_VALUE; if (objectHandle == NULL) objectHandle = &objectHandleTmp; if (name == NULL) name = &nameTmp; if (authResponse == NULL) authResponse = &authResponseTmp; grub_memset (objectHandle, 0, sizeof (*objectHandle)); grub_memset (name, 0, sizeof (*name)); grub_memset (authResponse, 0, sizeof (*authResponse)); /* Marshal */ grub_tpm2_buffer_init (&in); if (authCommand != NULL) grub_Tss2_MU_TPMS_AUTH_COMMAND_Marshal (&in, authCommand); if (inPrivate != NULL) grub_Tss2_MU_TPM2B_SENSITIVE_Marshal (&in, inPrivate); else grub_tpm2_buffer_pack_u16 (&in, 0); grub_Tss2_MU_TPM2B_PUBLIC_Marshal (&in, inPublic); grub_tpm2_buffer_pack_u32 (&in, hierarchy); if (in.error != 0) return TPM_RC_FAILURE; /* Submit */ grub_tpm2_buffer_init (&out); rc = tpm2_submit_command (tag, TPM_CC_LoadExternal, &responseCode, &in, &out); if (rc != TPM_RC_SUCCESS) return rc; if (responseCode != TPM_RC_SUCCESS) return responseCode; /* Unmarshal */ grub_tpm2_buffer_unpack_u32 (&out, objectHandle); if (tag == TPM_ST_SESSIONS) grub_tpm2_buffer_unpack_u32 (&out, ¶m_size); grub_Tss2_MU_TPM2B_NAME_Unmarshal (&out, name); if (tag == TPM_ST_SESSIONS) grub_Tss2_MU_TPMS_AUTH_RESPONSE_Unmarshal (&out, authResponse); if (out.error != 0) return TPM_RC_FAILURE; return TPM_RC_SUCCESS; } TPM_RC_t grub_tpm2_unseal (const TPMI_DH_OBJECT_t itemHandle, const TPMS_AUTH_COMMAND_t *authCommand, TPM2B_SENSITIVE_DATA_t *outData, TPMS_AUTH_RESPONSE_t *authResponse) { TPM_RC_t rc; struct grub_tpm2_buffer in; struct grub_tpm2_buffer out; TPM2B_SENSITIVE_DATA_t outDataTmp; TPMS_AUTH_RESPONSE_t authResponseTmp; TPMI_ST_COMMAND_TAG_t tag = authCommand ? TPM_ST_SESSIONS : TPM_ST_NO_SESSIONS; TPM_RC_t responseCode; grub_uint32_t param_size; if (outData == NULL) outData = &outDataTmp; if (authResponse == NULL) authResponse = &authResponseTmp; grub_memset (outData, 0, sizeof (*outData)); grub_memset (authResponse, 0, sizeof (*authResponse)); /* Marshal */ grub_tpm2_buffer_init (&in); grub_tpm2_buffer_pack_u32 (&in, itemHandle); if (authCommand != NULL) grub_Tss2_MU_TPMS_AUTH_COMMAND_Marshal (&in, authCommand); if (in.error != 0) return TPM_RC_FAILURE; /* Submit */ grub_tpm2_buffer_init (&out); rc = tpm2_submit_command (tag, TPM_CC_Unseal, &responseCode, &in, &out); if (rc != TPM_RC_SUCCESS) return rc; if (responseCode != TPM_RC_SUCCESS) return responseCode; /* Unmarshal */ if (tag == TPM_ST_SESSIONS) grub_tpm2_buffer_unpack_u32 (&out, ¶m_size); grub_Tss2_MU_TPM2B_SENSITIVE_DATA_Unmarshal (&out, outData); if (tag == TPM_ST_SESSIONS) grub_Tss2_MU_TPMS_AUTH_RESPONSE_Unmarshal (&out, authResponse); if (out.error != 0) return TPM_RC_FAILURE; return TPM_RC_SUCCESS; } TPM_RC_t grub_tpm2_flushcontext (const TPMI_DH_CONTEXT_t handle) { TPM_RC_t rc; struct grub_tpm2_buffer in; struct grub_tpm2_buffer out; TPM_RC_t responseCode; /* Marshal */ grub_tpm2_buffer_init (&in); grub_tpm2_buffer_pack_u32 (&in, handle); if (in.error != 0) return TPM_RC_FAILURE; /* Submit */ grub_tpm2_buffer_init (&out); rc = tpm2_submit_command (TPM_ST_NO_SESSIONS, TPM_CC_FlushContext, &responseCode, &in, &out); if (rc != TPM_RC_SUCCESS) return rc; if (responseCode != TPM_RC_SUCCESS) return responseCode; /* Unmarshal */ if (out.error != 0) return TPM_RC_FAILURE; return TPM_RC_SUCCESS; } TPM_RC_t grub_tpm2_pcr_read (const TPMS_AUTH_COMMAND_t *authCommand, const TPML_PCR_SELECTION_t *pcrSelectionIn, grub_uint32_t *pcrUpdateCounter, TPML_PCR_SELECTION_t *pcrSelectionOut, TPML_DIGEST_t *pcrValues, TPMS_AUTH_RESPONSE_t *authResponse) { TPM_RC_t rc; struct grub_tpm2_buffer in; struct grub_tpm2_buffer out; grub_uint32_t pcrUpdateCounterTmp; TPML_PCR_SELECTION_t pcrSelectionOutTmp; TPML_DIGEST_t pcrValuesTmp; TPMS_AUTH_RESPONSE_t authResponseTmp; TPMI_ST_COMMAND_TAG_t tag = authCommand ? TPM_ST_SESSIONS : TPM_ST_NO_SESSIONS; TPM_RC_t responseCode; grub_uint32_t parameterSize; if (pcrSelectionIn == NULL) return TPM_RC_VALUE; if (pcrUpdateCounter == NULL) pcrUpdateCounter = &pcrUpdateCounterTmp; if (pcrSelectionOut == NULL) pcrSelectionOut = &pcrSelectionOutTmp; if (pcrValues == NULL) pcrValues = &pcrValuesTmp; if (authResponse == NULL) authResponse = &authResponseTmp; /* Marshal */ grub_tpm2_buffer_init (&in); if (authCommand != NULL) grub_Tss2_MU_TPMS_AUTH_COMMAND_Marshal (&in, authCommand); grub_Tss2_MU_TPML_PCR_SELECTION_Marshal (&in, pcrSelectionIn); if (in.error != 0) return TPM_RC_FAILURE; /* Submit */ grub_tpm2_buffer_init (&out); rc = tpm2_submit_command (tag, TPM_CC_PCR_Read, &responseCode, &in, &out); if (rc != TPM_RC_SUCCESS) return rc; if (responseCode != TPM_RC_SUCCESS) return responseCode; /* Unmarshal */ if (tag == TPM_ST_SESSIONS) grub_tpm2_buffer_unpack_u32 (&out, ¶meterSize); grub_tpm2_buffer_unpack_u32 (&out, pcrUpdateCounter); grub_Tss2_MU_TPML_PCR_SELECTION_Unmarshal (&out, pcrSelectionOut); grub_Tss2_MU_TPML_DIGEST_Unmarshal (&out, pcrValues); if (tag == TPM_ST_SESSIONS) grub_Tss2_MU_TPMS_AUTH_RESPONSE_Unmarshal (&out, authResponse); if (out.error != 0) return TPM_RC_FAILURE; return TPM_RC_SUCCESS; } TPM_RC_t grub_tpm2_policygetdigest (const TPMI_SH_POLICY_t policySession, const TPMS_AUTH_COMMAND_t *authCommand, TPM2B_DIGEST_t *policyDigest, TPMS_AUTH_RESPONSE_t *authResponse) { TPM_RC_t rc; struct grub_tpm2_buffer in; struct grub_tpm2_buffer out; TPMS_AUTH_RESPONSE_t authResponseTmp; TPM2B_DIGEST_t policyDigestTmp; TPMI_ST_COMMAND_TAG_t tag = authCommand ? TPM_ST_SESSIONS : TPM_ST_NO_SESSIONS; TPM_RC_t responseCode; grub_uint32_t parameterSize; if (authResponse == NULL) authResponse = &authResponseTmp; if (policyDigest == NULL) policyDigest = &policyDigestTmp; grub_memset (authResponse, 0, sizeof (*authResponse)); grub_memset (policyDigest, 0, sizeof (*policyDigest)); /* Submit */ grub_tpm2_buffer_init (&in); grub_tpm2_buffer_pack_u32 (&in, policySession); if (tag == TPM_ST_SESSIONS) grub_Tss2_MU_TPMS_AUTH_COMMAND_Marshal (&in, authCommand); if (in.error != 0) return TPM_RC_FAILURE; /* Submit */ grub_tpm2_buffer_init (&out); rc = tpm2_submit_command (tag, TPM_CC_PolicyGetDigest, &responseCode, &in, &out); if (rc != TPM_RC_SUCCESS) return rc; if (responseCode != TPM_RC_SUCCESS) return responseCode; /* Unmarshal */ if (tag == TPM_ST_SESSIONS) grub_tpm2_buffer_unpack_u32 (&out, ¶meterSize); grub_Tss2_MU_TPM2B_DIGEST_Unmarshal (&out, policyDigest); if (tag == TPM_ST_SESSIONS) grub_Tss2_MU_TPMS_AUTH_RESPONSE_Unmarshal (&out, authResponse); if (out.error != 0) return TPM_RC_FAILURE; return TPM_RC_SUCCESS; } TPM_RC_t grub_tpm2_create (const TPMI_DH_OBJECT_t parentHandle, const TPMS_AUTH_COMMAND_t *authCommand, const TPM2B_SENSITIVE_CREATE_t *inSensitive, const TPM2B_PUBLIC_t *inPublic, const TPM2B_DATA_t *outsideInfo, const TPML_PCR_SELECTION_t *creationPCR, TPM2B_PRIVATE_t *outPrivate, TPM2B_PUBLIC_t *outPublic, TPM2B_CREATION_DATA_t *creationData, TPM2B_DIGEST_t *creationHash, TPMT_TK_CREATION_t *creationTicket, TPMS_AUTH_RESPONSE_t *authResponse) { struct grub_tpm2_buffer in; struct grub_tpm2_buffer out; TPM2B_PUBLIC_t outPublicTmp; TPM2B_PRIVATE_t outPrivateTmp; TPM2B_CREATION_DATA_t creationDataTmp; TPM2B_DIGEST_t creationHashTmp; TPMT_TK_CREATION_t creationTicketTmp; TPMS_AUTH_RESPONSE_t authResponseTmp; TPMI_ST_COMMAND_TAG_t tag = authCommand ? TPM_ST_SESSIONS:TPM_ST_NO_SESSIONS; TPM_RC_t responseCode; TPM_RC_t rc; grub_uint32_t parameterSize; if (inSensitive == NULL || inPublic == NULL || outsideInfo == NULL || creationPCR == NULL) return TPM_RC_VALUE; if (outPrivate == NULL) outPrivate = &outPrivateTmp; if (outPublic == NULL) outPublic = &outPublicTmp; if (creationData == NULL) creationData = &creationDataTmp; if (creationHash == NULL) creationHash = &creationHashTmp; if (creationTicket == NULL) creationTicket = &creationTicketTmp; if (authResponse == NULL) authResponse = &authResponseTmp; grub_memset (outPrivate, 0, sizeof (*outPrivate)); grub_memset (outPublic, 0, sizeof (*outPublic)); grub_memset (creationData, 0, sizeof (*creationData)); grub_memset (creationHash, 0, sizeof (*creationHash)); grub_memset (creationTicket, 0, sizeof (*creationTicket)); grub_memset (authResponse, 0, sizeof (*authResponse)); /* Marshal */ grub_tpm2_buffer_init (&in); grub_tpm2_buffer_pack_u32 (&in, parentHandle); if (authCommand != NULL) grub_Tss2_MU_TPMS_AUTH_COMMAND_Marshal (&in, authCommand); grub_Tss2_MU_TPM2B_SENSITIVE_CREATE_Marshal (&in, inSensitive); grub_Tss2_MU_TPM2B_PUBLIC_Marshal (&in, inPublic); grub_Tss2_MU_TPM2B_Marshal (&in, outsideInfo->size, outsideInfo->buffer); grub_Tss2_MU_TPML_PCR_SELECTION_Marshal (&in, creationPCR); if (in.error != 0) return TPM_RC_FAILURE; /* Submit */ grub_tpm2_buffer_init (&out); rc = tpm2_submit_command (tag, TPM_CC_Create, &responseCode, &in, &out); if (rc != TPM_RC_SUCCESS) return rc; if (responseCode != TPM_RC_SUCCESS) return responseCode; /* Unmarshal */ if (tag == TPM_ST_SESSIONS) grub_tpm2_buffer_unpack_u32 (&out, ¶meterSize); grub_Tss2_MU_TPM2B_PRIVATE_Unmarshal (&out, outPrivate); grub_Tss2_MU_TPM2B_PUBLIC_Unmarshal (&out, outPublic); grub_Tss2_MU_TPM2B_CREATION_DATA_Unmarshal (&out, creationData); grub_Tss2_MU_TPM2B_DIGEST_Unmarshal (&out, creationHash); grub_Tss2_MU_TPMT_TK_CREATION_Unmarshal (&out, creationTicket); if (tag == TPM_ST_SESSIONS) grub_Tss2_MU_TPMS_AUTH_RESPONSE_Unmarshal(&out, authResponse); if (out.error != 0) return TPM_RC_FAILURE; return TPM_RC_SUCCESS; } TPM_RC_t grub_tpm2_evictcontrol (const TPMI_RH_PROVISION_t auth, const TPMI_DH_OBJECT_t objectHandle, const TPMS_AUTH_COMMAND_t *authCommand, const TPMI_DH_PERSISTENT_t persistentHandle, TPMS_AUTH_RESPONSE_t *authResponse) { struct grub_tpm2_buffer in; struct grub_tpm2_buffer out; TPMS_AUTH_RESPONSE_t authResponseTmp; TPMI_ST_COMMAND_TAG_t tag = authCommand ? TPM_ST_SESSIONS : TPM_ST_NO_SESSIONS; TPM_RC_t responseCode; TPM_RC_t rc; grub_uint32_t parameterSize; if (authResponse == NULL) authResponse = &authResponseTmp; grub_memset (authResponse, 0, sizeof (*authResponse)); /* Marshal */ grub_tpm2_buffer_init (&in); grub_tpm2_buffer_pack_u32 (&in, auth); grub_tpm2_buffer_pack_u32 (&in, objectHandle); if (authCommand != NULL) grub_Tss2_MU_TPMS_AUTH_COMMAND_Marshal (&in, authCommand); grub_tpm2_buffer_pack_u32 (&in, persistentHandle); if (in.error != 0) return TPM_RC_FAILURE; /* Submit */ grub_tpm2_buffer_init (&out); rc = tpm2_submit_command (tag, TPM_CC_EvictControl, &responseCode, &in, &out); if (rc != TPM_RC_SUCCESS) return rc; if (responseCode != TPM_RC_SUCCESS) return responseCode; /* Unmarshal */ if (tag == TPM_ST_SESSIONS) { grub_tpm2_buffer_unpack_u32 (&out, ¶meterSize); grub_Tss2_MU_TPMS_AUTH_RESPONSE_Unmarshal(&out, authResponse); } if (out.error != 0) return TPM_RC_FAILURE; return TPM_RC_SUCCESS; } TPM_RC_t grub_tpm2_hash (const TPMS_AUTH_COMMAND_t *authCommand, const TPM2B_MAX_BUFFER_t *data, const TPMI_ALG_HASH_t hashAlg, const TPMI_RH_HIERARCHY_t hierarchy, TPM2B_DIGEST_t *outHash, TPMT_TK_HASHCHECK_t *validation, TPMS_AUTH_RESPONSE_t *authResponse) { TPM_RC_t rc; struct grub_tpm2_buffer in; struct grub_tpm2_buffer out; TPMS_AUTH_RESPONSE_t authResponseTmp; TPM2B_DIGEST_t outHashTmp; TPMT_TK_HASHCHECK_t validationTmp; TPMI_ST_COMMAND_TAG_t tag = authCommand ? TPM_ST_SESSIONS : TPM_ST_NO_SESSIONS; TPM_RC_t responseCode; grub_uint32_t param_size; if (hashAlg == TPM_ALG_NULL) return TPM_RC_VALUE; if (outHash == NULL) outHash = &outHashTmp; if (validation == NULL) validation = &validationTmp; if (authResponse == NULL) authResponse = &authResponseTmp; grub_memset (outHash, 0, sizeof (*outHash)); grub_memset (validation, 0, sizeof (*validation)); grub_memset (authResponse, 0, sizeof (*authResponse)); /* Marshal */ grub_tpm2_buffer_init (&in); if (authCommand != NULL) grub_Tss2_MU_TPMS_AUTH_COMMAND_Marshal (&in, authCommand); if (data != NULL) grub_Tss2_MU_TPM2B_Marshal (&in, data->size, data->buffer); else grub_tpm2_buffer_pack_u16 (&in, 0); grub_tpm2_buffer_pack_u16 (&in, hashAlg); grub_tpm2_buffer_pack_u32 (&in, hierarchy); if (in.error != 0) return TPM_RC_FAILURE; /* Submit */ grub_tpm2_buffer_init (&out); rc = tpm2_submit_command (tag, TPM_CC_Hash, &responseCode, &in, &out); if (rc != TPM_RC_SUCCESS) return rc; if (responseCode != TPM_RC_SUCCESS) return responseCode; /* Unmarshal */ if (tag == TPM_ST_SESSIONS) grub_tpm2_buffer_unpack_u32 (&out, ¶m_size); grub_Tss2_MU_TPM2B_DIGEST_Unmarshal (&out, outHash); grub_Tss2_MU_TPMT_TK_HASHCHECK_Unmarshal (&out, validation); if (tag == TPM_ST_SESSIONS) grub_Tss2_MU_TPMS_AUTH_RESPONSE_Unmarshal (&out, authResponse); if (out.error != 0) return TPM_RC_FAILURE; return TPM_RC_SUCCESS; } TPM_RC_t grub_tpm2_verifysignature (const TPMI_DH_OBJECT_t keyHandle, const TPMS_AUTH_COMMAND_t *authCommand, const TPM2B_DIGEST_t *digest, const TPMT_SIGNATURE_t *signature, TPMT_TK_VERIFIED_t *validation, TPMS_AUTH_RESPONSE_t *authResponse) { TPM_RC_t rc; struct grub_tpm2_buffer in; struct grub_tpm2_buffer out; TPMS_AUTH_RESPONSE_t authResponseTmp; TPMI_ST_COMMAND_TAG_t tag = authCommand ? TPM_ST_SESSIONS : TPM_ST_NO_SESSIONS; TPMT_TK_VERIFIED_t validationTmp; TPM_RC_t responseCode; grub_uint32_t param_size; if (digest == NULL || signature == NULL) return TPM_RC_VALUE; if (validation == NULL) validation = &validationTmp; if (authResponse == NULL) authResponse = &authResponseTmp; grub_memset (validation, 0, sizeof (*validation)); grub_memset (authResponse, 0, sizeof (*authResponse)); /* Marshal */ grub_tpm2_buffer_init (&in); if (authCommand != NULL) grub_Tss2_MU_TPMS_AUTH_COMMAND_Marshal (&in, authCommand); grub_tpm2_buffer_pack_u32 (&in, keyHandle); grub_Tss2_MU_TPM2B_Marshal (&in, digest->size, digest->buffer); grub_Tss2_MU_TPMT_SIGNATURE_Marshal (&in, signature); if (in.error != 0) return TPM_RC_FAILURE; /* Submit */ grub_tpm2_buffer_init (&out); rc = tpm2_submit_command (tag, TPM_CC_VerifySignature, &responseCode, &in, &out); if (rc != TPM_RC_SUCCESS) return rc; if (responseCode != TPM_RC_SUCCESS) return responseCode; /* Unmarshal */ if (tag == TPM_ST_SESSIONS) grub_tpm2_buffer_unpack_u32 (&out, ¶m_size); grub_Tss2_MU_TPMT_TK_VERIFIED_Unmarshal (&out, validation); if (tag == TPM_ST_SESSIONS) grub_Tss2_MU_TPMS_AUTH_RESPONSE_Unmarshal (&out, authResponse); if (out.error != 0) return TPM_RC_FAILURE; return TPM_RC_SUCCESS; } TPM_RC_t grub_tpm2_policyauthorize (const TPMI_SH_POLICY_t policySession, const TPMS_AUTH_COMMAND_t *authCommand, const TPM2B_DIGEST_t *approvedPolicy, const TPM2B_NONCE_t *policyRef, const TPM2B_NAME_t *keySign, const TPMT_TK_VERIFIED_t *checkTicket, TPMS_AUTH_RESPONSE_t *authResponse) { TPM_RC_t rc; struct grub_tpm2_buffer in; struct grub_tpm2_buffer out; TPMS_AUTH_RESPONSE_t authResponseTmp; TPMI_ST_COMMAND_TAG_t tag = authCommand ? TPM_ST_SESSIONS : TPM_ST_NO_SESSIONS; TPM_RC_t responseCode; grub_uint32_t param_size; if (approvedPolicy == NULL || keySign == NULL || checkTicket == NULL) return TPM_RC_VALUE; if (authResponse == NULL) authResponse = &authResponseTmp; grub_memset (authResponse, 0, sizeof (*authResponse)); /* Marshal */ grub_tpm2_buffer_init (&in); grub_tpm2_buffer_pack_u32 (&in, policySession); if (authCommand != NULL) grub_Tss2_MU_TPMS_AUTH_COMMAND_Marshal (&in, authCommand); grub_Tss2_MU_TPM2B_Marshal (&in, approvedPolicy->size, approvedPolicy->buffer); if (policyRef != NULL) grub_Tss2_MU_TPM2B_Marshal (&in, policyRef->size, policyRef->buffer); else grub_tpm2_buffer_pack_u16 (&in, 0); grub_Tss2_MU_TPM2B_Marshal (&in, keySign->size, keySign->name); grub_Tss2_MU_TPMT_TK_VERIFIED_Marshal (&in, checkTicket); if (in.error != 0) return TPM_RC_FAILURE; /* Submit */ grub_tpm2_buffer_init (&out); rc = tpm2_submit_command (tag, TPM_CC_PolicyAuthorize, &responseCode, &in, &out); if (rc != TPM_RC_SUCCESS) return rc; if (responseCode != TPM_RC_SUCCESS) return responseCode; /* Unmarshal */ if (tag == TPM_ST_SESSIONS) { grub_tpm2_buffer_unpack_u32 (&out, ¶m_size); grub_Tss2_MU_TPMS_AUTH_RESPONSE_Unmarshal (&out, authResponse); } if (out.error != 0) return TPM_RC_FAILURE; return TPM_RC_SUCCESS; } TPM_RC_t grub_tpm2_testparms (const TPMT_PUBLIC_PARMS_t *parms, const TPMS_AUTH_COMMAND_t *authCommand) { TPM_RC_t rc; struct grub_tpm2_buffer in; struct grub_tpm2_buffer out; TPMI_ST_COMMAND_TAG_t tag = authCommand ? TPM_ST_SESSIONS : TPM_ST_NO_SESSIONS; TPM_RC_t responseCode; if (parms == NULL) return TPM_RC_VALUE; /* Marshal */ grub_tpm2_buffer_init (&in); grub_Tss2_MU_TPMT_PUBLIC_PARMS_Marshal (&in, parms); if (authCommand != NULL) grub_Tss2_MU_TPMS_AUTH_COMMAND_Marshal (&in, authCommand); if (in.error != 0) return TPM_RC_FAILURE; /* Submit */ grub_tpm2_buffer_init (&out); rc = tpm2_submit_command (tag, TPM_CC_TestParms, &responseCode, &in, &out); if (rc != TPM_RC_SUCCESS) return rc; if (responseCode != TPM_RC_SUCCESS) return responseCode; /* Unmarshal */ if (out.error != 0) return TPM_RC_FAILURE; return TPM_RC_SUCCESS; } TPM_RC_t grub_tpm2_nv_definespace (const TPMI_RH_PROVISION_t authHandle, const TPMS_AUTH_COMMAND_t *authCommand, const TPM2B_AUTH_t *auth, const TPM2B_NV_PUBLIC_t *publicInfo) { TPM_RC_t rc; struct grub_tpm2_buffer in; struct grub_tpm2_buffer out; TPMI_ST_COMMAND_TAG_t tag = authCommand ? TPM_ST_SESSIONS : TPM_ST_NO_SESSIONS; TPM_RC_t responseCode; if (publicInfo == NULL) return TPM_RC_VALUE; /* Marshal */ grub_tpm2_buffer_init (&in); grub_tpm2_buffer_pack_u32 (&in, authHandle); if (authCommand != NULL) grub_Tss2_MU_TPMS_AUTH_COMMAND_Marshal (&in, authCommand); if (auth != NULL) grub_Tss2_MU_TPM2B_Marshal (&in, auth->size, auth->buffer); else grub_tpm2_buffer_pack_u16 (&in, 0); grub_Tss2_MU_TPM2B_NV_PUBLIC_Marshal (&in, publicInfo); if (in.error != 0) return TPM_RC_FAILURE; /* Submit */ grub_tpm2_buffer_init (&out); rc = tpm2_submit_command (tag, TPM_CC_NV_DefineSpace, &responseCode, &in, &out); if (rc != TPM_RC_SUCCESS) return rc; if (responseCode != TPM_RC_SUCCESS) return responseCode; /* Unmarshal */ if (out.error != 0) return TPM_RC_FAILURE; return TPM_RC_SUCCESS; } TPM_RC_t grub_tpm2_nv_undefinespace (const TPMI_RH_PROVISION_t authHandle, const TPMI_RH_NV_INDEX_t nvIndex, const TPMS_AUTH_COMMAND_t *authCommand) { TPM_RC_t rc; struct grub_tpm2_buffer in; struct grub_tpm2_buffer out; TPMI_ST_COMMAND_TAG_t tag = authCommand ? TPM_ST_SESSIONS : TPM_ST_NO_SESSIONS; TPM_RC_t responseCode; /* Marshal */ grub_tpm2_buffer_init (&in); grub_tpm2_buffer_pack_u32 (&in, authHandle); grub_tpm2_buffer_pack_u32 (&in, nvIndex); if (authCommand != NULL) grub_Tss2_MU_TPMS_AUTH_COMMAND_Marshal (&in, authCommand); if (in.error != 0) return TPM_RC_FAILURE; /* Submit */ grub_tpm2_buffer_init (&out); rc = tpm2_submit_command (tag, TPM_CC_NV_UndefineSpace, &responseCode, &in, &out); if (rc != TPM_RC_SUCCESS) return rc; if (responseCode != TPM_RC_SUCCESS) return responseCode; /* Unmarshal */ if (out.error != 0) return TPM_RC_FAILURE; return TPM_RC_SUCCESS; } TPM_RC_t grub_tpm2_nv_readpublic (const TPMI_RH_NV_INDEX_t nvIndex, const TPMS_AUTH_COMMAND_t *authCommand, TPM2B_NV_PUBLIC_t *nvPublic, TPM2B_NAME_t *nvName) { TPM_RC_t rc; struct grub_tpm2_buffer in; struct grub_tpm2_buffer out; TPMI_ST_COMMAND_TAG_t tag = authCommand ? TPM_ST_SESSIONS : TPM_ST_NO_SESSIONS; TPM_RC_t responseCode; grub_uint32_t param_size; /* Marshal */ grub_tpm2_buffer_init (&in); grub_tpm2_buffer_pack_u32 (&in, nvIndex); if (authCommand != NULL) grub_Tss2_MU_TPMS_AUTH_COMMAND_Marshal (&in, authCommand); if (in.error != 0) return TPM_RC_FAILURE; /* Submit */ grub_tpm2_buffer_init (&out); rc = tpm2_submit_command (tag, TPM_CC_NV_ReadPublic, &responseCode, &in, &out); if (rc != TPM_RC_SUCCESS) return rc; if (responseCode != TPM_RC_SUCCESS) return responseCode; /* Unmarshal */ if (tag == TPM_ST_SESSIONS) grub_tpm2_buffer_unpack_u32 (&out, ¶m_size); grub_Tss2_MU_TPM2B_NV_PUBLIC_Unmarshal (&out, nvPublic); grub_Tss2_MU_TPM2B_NAME_Unmarshal (&out, nvName); if (out.error != 0) return TPM_RC_FAILURE; return TPM_RC_SUCCESS; } TPM_RC_t grub_tpm2_nv_read (const TPMI_RH_NV_AUTH_t authHandle, const TPMI_RH_NV_INDEX_t nvIndex, const TPMS_AUTH_COMMAND_t *authCommand, const grub_uint16_t size, const grub_uint16_t offset, TPM2B_MAX_NV_BUFFER_t *data) { TPM_RC_t rc; struct grub_tpm2_buffer in; struct grub_tpm2_buffer out; TPMI_ST_COMMAND_TAG_t tag = authCommand ? TPM_ST_SESSIONS : TPM_ST_NO_SESSIONS; TPM_RC_t responseCode; grub_uint32_t param_size; /* Marshal */ grub_tpm2_buffer_init (&in); grub_tpm2_buffer_pack_u32 (&in, authHandle); grub_tpm2_buffer_pack_u32 (&in, nvIndex); if (authCommand != NULL) grub_Tss2_MU_TPMS_AUTH_COMMAND_Marshal (&in, authCommand); grub_tpm2_buffer_pack_u16 (&in, size); grub_tpm2_buffer_pack_u16 (&in, offset); if (in.error != 0) return TPM_RC_FAILURE; /* Submit */ grub_tpm2_buffer_init (&out); rc = tpm2_submit_command (tag, TPM_CC_NV_Read, &responseCode, &in, &out); if (rc != TPM_RC_SUCCESS) return rc; if (responseCode != TPM_RC_SUCCESS) return responseCode; /* Unmarshal */ if (tag == TPM_ST_SESSIONS) grub_tpm2_buffer_unpack_u32 (&out, ¶m_size); grub_Tss2_MU_TPM2B_NAX_NV_BUFFER_Unmarshal (&out, data); if (out.error != 0) return TPM_RC_FAILURE; return TPM_RC_SUCCESS; } TPM_RC_t grub_tpm2_nv_write (const TPMI_RH_NV_AUTH_t authHandle, const TPMI_RH_NV_INDEX_t nvIndex, const TPMS_AUTH_COMMAND_t *authCommand, const TPM2B_MAX_NV_BUFFER_t *data, const grub_uint16_t offset) { TPM_RC_t rc; struct grub_tpm2_buffer in; struct grub_tpm2_buffer out; TPMI_ST_COMMAND_TAG_t tag = authCommand ? TPM_ST_SESSIONS : TPM_ST_NO_SESSIONS; TPM_RC_t responseCode; /* Marshal */ grub_tpm2_buffer_init (&in); grub_tpm2_buffer_pack_u32 (&in, authHandle); grub_tpm2_buffer_pack_u32 (&in, nvIndex); if (authCommand != NULL) grub_Tss2_MU_TPMS_AUTH_COMMAND_Marshal (&in, authCommand); grub_Tss2_MU_TPM2B_Marshal (&in, data->size, data->buffer); grub_tpm2_buffer_pack_u16 (&in, offset); if (in.error != 0) return TPM_RC_FAILURE; /* Submit */ grub_tpm2_buffer_init (&out); rc = tpm2_submit_command (tag, TPM_CC_NV_Write, &responseCode, &in, &out); if (rc != TPM_RC_SUCCESS) return rc; if (responseCode != TPM_RC_SUCCESS) return responseCode; /* Unmarshal */ if (out.error != 0) return TPM_RC_FAILURE; return TPM_RC_SUCCESS; } grub-2.14~git20250718.0e36779/grub-core/lib/gpgrt-int.h0000644000175000017500000000117415036447510016525 00000000000000#include struct _gpgrt_b64state { int idx; int quad_count; char *title; unsigned char radbuf[4]; unsigned int crc; gpg_err_code_t lasterr; unsigned int flags; unsigned int stop_seen:1; unsigned int invalid_encoding:1; unsigned int using_decoder:1; }; #define _gpgrt_b64dec_start gpgrt_b64dec_start #define xtrystrdup grub_strdup #define xtrycalloc grub_calloc #define xfree grub_free #define _gpgrt_b64dec_finish gpgrt_b64dec_finish #define gpgrt_assert(expr) ((expr)? (void)0 \ : _gcry_assert_failed (#expr, __FILE__, __LINE__, __FUNCTION__)) #define _gpgrt_b64dec_proc gpgrt_b64dec_proc grub-2.14~git20250718.0e36779/grub-core/lib/efi/0000755000175000017500000000000015036452576015271 500000000000000grub-2.14~git20250718.0e36779/grub-core/lib/efi/tcg2.c0000644000175000017500000000675315036447510016217 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (C) 2022 Microsoft Corporation * Copyright (C) 2024 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include static grub_err_t tcg2_get_caps (grub_efi_tpm2_protocol_t *protocol, int *tpm2, grub_size_t *max_output_size) { grub_efi_status_t status; static bool has_caps = 0; static EFI_TCG2_BOOT_SERVICE_CAPABILITY caps = { .Size = (grub_uint8_t) sizeof (caps) }; if (has_caps) goto exit; status = protocol->get_capability (protocol, &caps); if (status != GRUB_EFI_SUCCESS || !caps.TPMPresentFlag) return GRUB_ERR_FILE_NOT_FOUND; has_caps = 1; exit: if (tpm2 != NULL) *tpm2 = caps.TPMPresentFlag; if (max_output_size != NULL) *max_output_size = caps.MaxResponseSize; return GRUB_ERR_NONE; } static grub_err_t tcg2_get_protocol (grub_efi_tpm2_protocol_t **protocol) { static grub_guid_t tpm2_guid = EFI_TPM2_GUID; static grub_efi_tpm2_protocol_t *tpm2_protocol = NULL; int tpm2; grub_efi_handle_t *handles; grub_efi_uintn_t num_handles; grub_efi_handle_t tpm2_handle; grub_err_t err = GRUB_ERR_FILE_NOT_FOUND; if (tpm2_protocol != NULL) { *protocol = tpm2_protocol; return GRUB_ERR_NONE; } handles = grub_efi_locate_handle (GRUB_EFI_BY_PROTOCOL, &tpm2_guid, NULL, &num_handles); if (handles == NULL || num_handles == 0) return err; tpm2_handle = handles[0]; tpm2_protocol = grub_efi_open_protocol (tpm2_handle, &tpm2_guid, GRUB_EFI_OPEN_PROTOCOL_GET_PROTOCOL); if (tpm2_protocol == NULL) goto exit; err = tcg2_get_caps (tpm2_protocol, &tpm2, NULL); if (err != GRUB_ERR_NONE || tpm2 == 0) goto exit; *protocol = tpm2_protocol; err = GRUB_ERR_NONE; exit: grub_free (handles); return err; } grub_err_t grub_tcg2_get_max_output_size (grub_size_t *size) { grub_err_t err; grub_size_t max; grub_efi_tpm2_protocol_t *protocol; if (size == NULL) return GRUB_ERR_BAD_ARGUMENT; err = tcg2_get_protocol (&protocol); if (err != GRUB_ERR_NONE) return err; err = tcg2_get_caps (protocol, NULL, &max); if (err != GRUB_ERR_NONE) return err; *size = max; return GRUB_ERR_NONE; } grub_err_t grub_tcg2_submit_command (grub_size_t input_size, grub_uint8_t *input, grub_size_t output_size, grub_uint8_t *output) { grub_err_t err; grub_efi_status_t status; grub_efi_tpm2_protocol_t *protocol; if (input_size == 0 || input == NULL || output_size == 0 || output == NULL) return GRUB_ERR_BAD_ARGUMENT; err = tcg2_get_protocol (&protocol); if (err != GRUB_ERR_NONE) return err; status = protocol->submit_command (protocol, input_size, input, output_size, output); if (status != GRUB_EFI_SUCCESS) return GRUB_ERR_INVALID_COMMAND; return GRUB_ERR_NONE; } grub-2.14~git20250718.0e36779/grub-core/lib/efi/datetime.c0000644000175000017500000000440415033157230017135 00000000000000/* kern/efi/datetime.c - efi datetime function. * * GRUB -- GRand Unified Bootloader * Copyright (C) 2008 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); grub_err_t grub_get_datetime (struct grub_datetime *datetime) { grub_efi_status_t status; struct grub_efi_time efi_time; status = grub_efi_system_table->runtime_services->get_time (&efi_time, 0); if (status) return grub_error (GRUB_ERR_INVALID_COMMAND, "can\'t get datetime using efi"); else { datetime->year = efi_time.year; datetime->month = efi_time.month; datetime->day = efi_time.day; datetime->hour = efi_time.hour; datetime->minute = efi_time.minute; datetime->second = efi_time.second; } return 0; } grub_err_t grub_set_datetime (struct grub_datetime *datetime) { grub_efi_status_t status; struct grub_efi_time efi_time; status = grub_efi_system_table->runtime_services->get_time (&efi_time, 0); if (status) return grub_error (GRUB_ERR_INVALID_COMMAND, "can\'t get datetime using efi"); efi_time.year = datetime->year; efi_time.month = datetime->month; efi_time.day = datetime->day; efi_time.hour = datetime->hour; efi_time.minute = datetime->minute; efi_time.second = datetime->second; status = grub_efi_system_table->runtime_services->set_time (&efi_time); if (status) return grub_error (GRUB_ERR_INVALID_COMMAND, "can\'t set datetime using efi"); return 0; } grub-2.14~git20250718.0e36779/grub-core/lib/efi/halt.c0000644000175000017500000000253315033157230016272 00000000000000/* efi.c - generic EFI support */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2006,2007,2008,2009,2010 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include #include void grub_halt (void) { grub_machine_fini (GRUB_LOADER_FLAG_NORETURN | GRUB_LOADER_FLAG_EFI_KEEP_ALLOCATED_MEMORY); #if !defined(__ia64__) && !defined(__arm__) && !defined(__aarch64__) && \ !defined(__loongarch__) && !defined(__riscv) grub_acpi_halt (); #endif grub_efi_system_table->runtime_services->reset_system (GRUB_EFI_RESET_SHUTDOWN, GRUB_EFI_SUCCESS, 0, NULL); while (1); } grub-2.14~git20250718.0e36779/grub-core/lib/efi/relocator.c0000644000175000017500000000721115033157230017332 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (C) 2010 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include #define NEXT_MEMORY_DESCRIPTOR(desc, size) \ ((grub_efi_memory_descriptor_t *) ((char *) (desc) + (size))) unsigned grub_relocator_firmware_get_max_events (void) { grub_efi_uintn_t mmapsize = 0, descriptor_size = 0; grub_efi_uint32_t descriptor_version = 0; grub_efi_uintn_t key; grub_efi_get_memory_map (&mmapsize, NULL, &key, &descriptor_size, &descriptor_version); /* Since grub_relocator_firmware_fill_events uses malloc we need some reserve. Hence +10. */ return 2 * (mmapsize / descriptor_size + 10); } unsigned grub_relocator_firmware_fill_events (struct grub_relocator_mmap_event *events) { grub_efi_uintn_t mmapsize = 0, desc_size = 0; grub_efi_uint32_t descriptor_version = 0; grub_efi_memory_descriptor_t *descs = NULL; grub_efi_uintn_t key; int counter = 0; grub_efi_memory_descriptor_t *desc; grub_efi_get_memory_map (&mmapsize, NULL, &key, &desc_size, &descriptor_version); descs = grub_malloc (mmapsize); if (!descs) return 0; grub_efi_get_memory_map (&mmapsize, descs, &key, &desc_size, &descriptor_version); for (desc = descs; (char *) desc < ((char *) descs + mmapsize); desc = NEXT_MEMORY_DESCRIPTOR (desc, desc_size)) { grub_uint64_t start = desc->physical_start; grub_uint64_t end = desc->physical_start + (desc->num_pages << 12); /* post-4G addresses are never supported on 32-bit EFI. Moreover it has been reported that some 64-bit EFI contrary to the spec don't map post-4G pages. So if you enable post-4G allocations, map pages manually or check that they are mapped. */ if (end >= 0x100000000ULL) end = 0x100000000ULL; if (end <= start) continue; if (desc->type != GRUB_EFI_CONVENTIONAL_MEMORY) continue; events[counter].type = REG_FIRMWARE_START; events[counter].pos = start; counter++; events[counter].type = REG_FIRMWARE_END; events[counter].pos = end; counter++; } return counter; } int grub_relocator_firmware_alloc_region (grub_addr_t start, grub_size_t size) { grub_efi_boot_services_t *b; grub_efi_physical_address_t address = start; grub_efi_status_t status; if (grub_efi_is_finished) return 1; #ifdef DEBUG_RELOCATOR_NOMEM_DPRINTF grub_dprintf ("relocator", "EFI alloc: %llx, %llx\n", (unsigned long long) start, (unsigned long long) size); #endif b = grub_efi_system_table->boot_services; status = b->allocate_pages (GRUB_EFI_ALLOCATE_ADDRESS, GRUB_EFI_LOADER_DATA, size >> 12, &address); return (status == GRUB_EFI_SUCCESS); } void grub_relocator_firmware_free_region (grub_addr_t start, grub_size_t size) { grub_efi_boot_services_t *b; if (grub_efi_is_finished) return; b = grub_efi_system_table->boot_services; b->free_pages (start, size >> 12); } grub-2.14~git20250718.0e36779/grub-core/lib/LzmaEnc.c0000644000175000017500000017134115036447510016142 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (c) 1999-2008 Igor Pavlov * Copyright (C) 2008 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ /* * This code was taken from LZMA SDK 4.58 beta, and was slightly modified * to adapt it to GRUB's requirement. * * See , for more information about LZMA. */ #include #include #include #include #include #ifdef COMPRESS_MF_MT #include #endif /* #define SHOW_STAT */ /* #define SHOW_STAT2 */ #ifdef SHOW_STAT static int ttt = 0; #endif #define kBlockSizeMax ((1 << LZMA_NUM_BLOCK_SIZE_BITS) - 1) #define kBlockSize (9 << 10) #define kUnpackBlockSize (1 << 18) #define kMatchArraySize (1 << 21) #define kMatchRecordMaxSize ((LZMA_MATCH_LEN_MAX * 2 + 3) * LZMA_MATCH_LEN_MAX) #define kNumMaxDirectBits (31) #define kNumTopBits 24 #define kTopValue ((UInt32)1 << kNumTopBits) #define kNumBitModelTotalBits 11 #define kBitModelTotal (1 << kNumBitModelTotalBits) #define kNumMoveBits 5 #define kProbInitValue (kBitModelTotal >> 1) #define kNumMoveReducingBits 4 #define kNumBitPriceShiftBits 4 #define kBitPrice (1 << kNumBitPriceShiftBits) void LzmaEncProps_Init(CLzmaEncProps *p) { p->level = 5; p->dictSize = p->mc = 0; p->lc = p->lp = p->pb = p->algo = p->fb = p->btMode = p->numHashBytes = p->numThreads = -1; p->writeEndMark = 0; } void LzmaEncProps_Normalize(CLzmaEncProps *p) { int level = p->level; if (level < 0) level = 5; p->level = level; if (p->dictSize == 0) p->dictSize = (level <= 5 ? (1 << (level * 2 + 14)) : (level == 6 ? (1 << 25) : (1 << 26))); if (p->lc < 0) p->lc = 3; if (p->lp < 0) p->lp = 0; if (p->pb < 0) p->pb = 2; if (p->algo < 0) p->algo = (level < 5 ? 0 : 1); if (p->fb < 0) p->fb = (level < 7 ? 32 : 64); if (p->btMode < 0) p->btMode = (p->algo == 0 ? 0 : 1); if (p->numHashBytes < 0) p->numHashBytes = 4; if (p->mc == 0) p->mc = (16 + (p->fb >> 1)) >> (p->btMode ? 0 : 1); if (p->numThreads < 0) p->numThreads = ((p->btMode && p->algo) ? 2 : 1); } UInt32 LzmaEncProps_GetDictSize(const CLzmaEncProps *props2) { CLzmaEncProps props = *props2; LzmaEncProps_Normalize(&props); return props.dictSize; } /* #define LZMA_LOG_BSR */ /* Define it for Intel's CPU */ #ifdef LZMA_LOG_BSR #define kDicLogSizeMaxCompress 30 #define BSR2_RET(pos, res) { unsigned long i; _BitScanReverse(&i, (pos)); res = (i + i) + ((pos >> (i - 1)) & 1); } UInt32 GetPosSlot1(UInt32 pos) { UInt32 res; BSR2_RET(pos, res); return res; } #define GetPosSlot2(pos, res) { BSR2_RET(pos, res); } #define GetPosSlot(pos, res) { if (pos < 2) res = pos; else BSR2_RET(pos, res); } #else #define kNumLogBits (9 + (int)sizeof(size_t) / 2) #define kDicLogSizeMaxCompress ((kNumLogBits - 1) * 2 + 7) static void LzmaEnc_FastPosInit(Byte *g_FastPos) { int c = 2, slotFast; g_FastPos[0] = 0; g_FastPos[1] = 1; for (slotFast = 2; slotFast < kNumLogBits * 2; slotFast++) { UInt32 k = (1 << ((slotFast >> 1) - 1)); UInt32 j; for (j = 0; j < k; j++, c++) g_FastPos[c] = (Byte)slotFast; } } #define BSR2_RET(pos, res) { UInt32 i = 6 + ((kNumLogBits - 1) & \ (0 - (((((UInt32)1 << (kNumLogBits + 6)) - 1) - pos) >> 31))); \ res = p->g_FastPos[pos >> i] + (i * 2); } /* #define BSR2_RET(pos, res) { res = (pos < (1 << (kNumLogBits + 6))) ? \ p->g_FastPos[pos >> 6] + 12 : \ p->g_FastPos[pos >> (6 + kNumLogBits - 1)] + (6 + (kNumLogBits - 1)) * 2; } */ #define GetPosSlot1(pos) p->g_FastPos[pos] #define GetPosSlot2(pos, res) { BSR2_RET(pos, res); } #define GetPosSlot(pos, res) { if (pos < kNumFullDistances) res = p->g_FastPos[pos]; else BSR2_RET(pos, res); } #endif #define LZMA_NUM_REPS 4 typedef unsigned CState; typedef struct _COptimal { UInt32 price; CState state; int prev1IsChar; int prev2; UInt32 posPrev2; UInt32 backPrev2; UInt32 posPrev; UInt32 backPrev; UInt32 backs[LZMA_NUM_REPS]; } COptimal; #define kNumOpts (1 << 12) #define kNumLenToPosStates 4 #define kNumPosSlotBits 6 #define kDicLogSizeMin 0 #define kDicLogSizeMax 32 #define kDistTableSizeMax (kDicLogSizeMax * 2) #define kNumAlignBits 4 #define kAlignTableSize (1 << kNumAlignBits) #define kAlignMask (kAlignTableSize - 1) #define kStartPosModelIndex 4 #define kEndPosModelIndex 14 #define kNumPosModels (kEndPosModelIndex - kStartPosModelIndex) #define kNumFullDistances (1 << (kEndPosModelIndex / 2)) #ifdef _LZMA_PROB32 #define CLzmaProb UInt32 #else #define CLzmaProb UInt16 #endif #define LZMA_PB_MAX 4 #define LZMA_LC_MAX 8 #define LZMA_LP_MAX 4 #define LZMA_NUM_PB_STATES_MAX (1 << LZMA_PB_MAX) #define kLenNumLowBits 3 #define kLenNumLowSymbols (1 << kLenNumLowBits) #define kLenNumMidBits 3 #define kLenNumMidSymbols (1 << kLenNumMidBits) #define kLenNumHighBits 8 #define kLenNumHighSymbols (1 << kLenNumHighBits) #define kLenNumSymbolsTotal (kLenNumLowSymbols + kLenNumMidSymbols + kLenNumHighSymbols) #define LZMA_MATCH_LEN_MIN 2 #define LZMA_MATCH_LEN_MAX (LZMA_MATCH_LEN_MIN + kLenNumSymbolsTotal - 1) #define kNumStates 12 typedef struct { CLzmaProb choice; CLzmaProb choice2; CLzmaProb low[LZMA_NUM_PB_STATES_MAX << kLenNumLowBits]; CLzmaProb mid[LZMA_NUM_PB_STATES_MAX << kLenNumMidBits]; CLzmaProb high[kLenNumHighSymbols]; } CLenEnc; typedef struct { CLenEnc p; UInt32 prices[LZMA_NUM_PB_STATES_MAX][kLenNumSymbolsTotal]; UInt32 tableSize; UInt32 counters[LZMA_NUM_PB_STATES_MAX]; } CLenPriceEnc; typedef struct _CRangeEnc { UInt32 range; Byte cache; UInt64 low; UInt64 cacheSize; Byte *buf; Byte *bufLim; Byte *bufBase; ISeqOutStream *outStream; UInt64 processed; SRes res; } CRangeEnc; typedef struct _CSeqInStreamBuf { ISeqInStream funcTable; const Byte *data; SizeT rem; } CSeqInStreamBuf; static SRes MyRead(void *pp, void *data, size_t *size) { size_t curSize = *size; CSeqInStreamBuf *p = (CSeqInStreamBuf *)pp; if (p->rem < curSize) curSize = p->rem; memcpy(data, p->data, curSize); p->rem -= curSize; p->data += curSize; *size = curSize; return SZ_OK; } typedef struct { CLzmaProb *litProbs; CLzmaProb isMatch[kNumStates][LZMA_NUM_PB_STATES_MAX]; CLzmaProb isRep[kNumStates]; CLzmaProb isRepG0[kNumStates]; CLzmaProb isRepG1[kNumStates]; CLzmaProb isRepG2[kNumStates]; CLzmaProb isRep0Long[kNumStates][LZMA_NUM_PB_STATES_MAX]; CLzmaProb posSlotEncoder[kNumLenToPosStates][1 << kNumPosSlotBits]; CLzmaProb posEncoders[kNumFullDistances - kEndPosModelIndex]; CLzmaProb posAlignEncoder[1 << kNumAlignBits]; CLenPriceEnc lenEnc; CLenPriceEnc repLenEnc; UInt32 reps[LZMA_NUM_REPS]; UInt32 state; } CSaveState; typedef struct _CLzmaEnc { IMatchFinder matchFinder; void *matchFinderObj; #ifdef COMPRESS_MF_MT Bool mtMode; CMatchFinderMt matchFinderMt; #endif CMatchFinder matchFinderBase; #ifdef COMPRESS_MF_MT Byte pad[128]; #endif UInt32 optimumEndIndex; UInt32 optimumCurrentIndex; Bool longestMatchWasFound; UInt32 longestMatchLength; UInt32 numDistancePairs; COptimal opt[kNumOpts]; #ifndef LZMA_LOG_BSR Byte g_FastPos[1 << kNumLogBits]; #endif UInt32 ProbPrices[kBitModelTotal >> kNumMoveReducingBits]; UInt32 matchDistances[LZMA_MATCH_LEN_MAX * 2 + 2 + 1]; UInt32 numFastBytes; UInt32 additionalOffset; UInt32 reps[LZMA_NUM_REPS]; UInt32 state; UInt32 posSlotPrices[kNumLenToPosStates][kDistTableSizeMax]; UInt32 distancesPrices[kNumLenToPosStates][kNumFullDistances]; UInt32 alignPrices[kAlignTableSize]; UInt32 alignPriceCount; UInt32 distTableSize; unsigned lc, lp, pb; unsigned lpMask, pbMask; CLzmaProb *litProbs; CLzmaProb isMatch[kNumStates][LZMA_NUM_PB_STATES_MAX]; CLzmaProb isRep[kNumStates]; CLzmaProb isRepG0[kNumStates]; CLzmaProb isRepG1[kNumStates]; CLzmaProb isRepG2[kNumStates]; CLzmaProb isRep0Long[kNumStates][LZMA_NUM_PB_STATES_MAX]; CLzmaProb posSlotEncoder[kNumLenToPosStates][1 << kNumPosSlotBits]; CLzmaProb posEncoders[kNumFullDistances - kEndPosModelIndex]; CLzmaProb posAlignEncoder[1 << kNumAlignBits]; CLenPriceEnc lenEnc; CLenPriceEnc repLenEnc; unsigned lclp; Bool fastMode; CRangeEnc rc; Bool writeEndMark; UInt64 nowPos64; UInt32 matchPriceCount; Bool finished; Bool multiThread; SRes result; UInt32 dictSize; UInt32 matchFinderCycles; ISeqInStream *inStream; CSeqInStreamBuf seqBufInStream; CSaveState saveState; } CLzmaEnc; SRes LzmaEnc_SetProps(CLzmaEncHandle pp, const CLzmaEncProps *props2) { CLzmaEnc *p = (CLzmaEnc *)pp; CLzmaEncProps props = *props2; LzmaEncProps_Normalize(&props); if (props.lc > LZMA_LC_MAX || props.lp > LZMA_LP_MAX || props.pb > LZMA_PB_MAX || props.dictSize > (1U << kDicLogSizeMaxCompress) || props.dictSize > (1 << 30)) return SZ_ERROR_PARAM; p->dictSize = props.dictSize; p->matchFinderCycles = props.mc; { unsigned fb = props.fb; if (fb < 5) fb = 5; if (fb > LZMA_MATCH_LEN_MAX) fb = LZMA_MATCH_LEN_MAX; p->numFastBytes = fb; } p->lc = props.lc; p->lp = props.lp; p->pb = props.pb; p->fastMode = (props.algo == 0); p->matchFinderBase.btMode = props.btMode; { UInt32 numHashBytes = 4; if (props.btMode) { if (props.numHashBytes < 2) numHashBytes = 2; else if (props.numHashBytes < 4) numHashBytes = props.numHashBytes; } p->matchFinderBase.numHashBytes = numHashBytes; } p->matchFinderBase.cutValue = props.mc; p->writeEndMark = props.writeEndMark; #ifdef COMPRESS_MF_MT /* if (newMultiThread != _multiThread) { ReleaseMatchFinder(); _multiThread = newMultiThread; } */ p->multiThread = (props.numThreads > 1); #endif return SZ_OK; } static const int kLiteralNextStates[kNumStates] = {0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 4, 5}; static const int kMatchNextStates[kNumStates] = {7, 7, 7, 7, 7, 7, 7, 10, 10, 10, 10, 10}; static const int kRepNextStates[kNumStates] = {8, 8, 8, 8, 8, 8, 8, 11, 11, 11, 11, 11}; static const int kShortRepNextStates[kNumStates]= {9, 9, 9, 9, 9, 9, 9, 11, 11, 11, 11, 11}; /* void UpdateChar() { Index = kLiteralNextStates[Index]; } void UpdateMatch() { Index = kMatchNextStates[Index]; } void UpdateRep() { Index = kRepNextStates[Index]; } void UpdateShortRep() { Index = kShortRepNextStates[Index]; } */ #define IsCharState(s) ((s) < 7) #define GetLenToPosState(len) (((len) < kNumLenToPosStates + 1) ? (len) - 2 : kNumLenToPosStates - 1) #define kInfinityPrice (1 << 30) static void RangeEnc_Construct(CRangeEnc *p) { p->outStream = 0; p->bufBase = 0; } #define RangeEnc_GetProcessed(p) ((p)->processed + ((p)->buf - (p)->bufBase) + (p)->cacheSize) #define RC_BUF_SIZE (1 << 16) static int RangeEnc_Alloc(CRangeEnc *p, ISzAlloc *alloc) { if (p->bufBase == 0) { p->bufBase = (Byte *)alloc->Alloc(alloc, RC_BUF_SIZE); if (p->bufBase == 0) return 0; p->bufLim = p->bufBase + RC_BUF_SIZE; } return 1; } static void RangeEnc_Free(CRangeEnc *p, ISzAlloc *alloc) { alloc->Free(alloc, p->bufBase); p->bufBase = 0; } static void RangeEnc_Init(CRangeEnc *p) { /* Stream.Init(); */ p->low = 0; p->range = 0xFFFFFFFF; p->cacheSize = 1; p->cache = 0; p->buf = p->bufBase; p->processed = 0; p->res = SZ_OK; } static void RangeEnc_FlushStream(CRangeEnc *p) { size_t num; if (p->res != SZ_OK) return; num = p->buf - p->bufBase; if (num != p->outStream->Write(p->outStream, p->bufBase, num)) p->res = SZ_ERROR_WRITE; p->processed += num; p->buf = p->bufBase; } static void MY_FAST_CALL RangeEnc_ShiftLow(CRangeEnc *p) { if ((UInt32)p->low < (UInt32)0xFF000000 || (int)(p->low >> 32) != 0) { Byte temp = p->cache; do { Byte *buf = p->buf; *buf++ = (Byte)(temp + (Byte)(p->low >> 32)); p->buf = buf; if (buf == p->bufLim) RangeEnc_FlushStream(p); temp = 0xFF; } while (--p->cacheSize != 0); p->cache = (Byte)((UInt32)p->low >> 24); } p->cacheSize++; p->low = (UInt32)p->low << 8; } static void RangeEnc_FlushData(CRangeEnc *p) { int i; for (i = 0; i < 5; i++) RangeEnc_ShiftLow(p); } static void RangeEnc_EncodeDirectBits(CRangeEnc *p, UInt32 value, int numBits) { do { p->range >>= 1; p->low += p->range & (0 - ((value >> --numBits) & 1)); if (p->range < kTopValue) { p->range <<= 8; RangeEnc_ShiftLow(p); } } while (numBits != 0); } static void RangeEnc_EncodeBit(CRangeEnc *p, CLzmaProb *prob, UInt32 symbol) { UInt32 ttt = *prob; UInt32 newBound = (p->range >> kNumBitModelTotalBits) * ttt; if (symbol == 0) { p->range = newBound; ttt += (kBitModelTotal - ttt) >> kNumMoveBits; } else { p->low += newBound; p->range -= newBound; ttt -= ttt >> kNumMoveBits; } *prob = (CLzmaProb)ttt; if (p->range < kTopValue) { p->range <<= 8; RangeEnc_ShiftLow(p); } } static void LitEnc_Encode(CRangeEnc *p, CLzmaProb *probs, UInt32 symbol) { symbol |= 0x100; do { RangeEnc_EncodeBit(p, probs + (symbol >> 8), (symbol >> 7) & 1); symbol <<= 1; } while (symbol < 0x10000); } static void LitEnc_EncodeMatched(CRangeEnc *p, CLzmaProb *probs, UInt32 symbol, UInt32 matchByte) { UInt32 offs = 0x100; symbol |= 0x100; do { matchByte <<= 1; RangeEnc_EncodeBit(p, probs + (offs + (matchByte & offs) + (symbol >> 8)), (symbol >> 7) & 1); symbol <<= 1; offs &= ~(matchByte ^ symbol); } while (symbol < 0x10000); } static void LzmaEnc_InitPriceTables(UInt32 *ProbPrices) { UInt32 i; for (i = (1 << kNumMoveReducingBits) / 2; i < kBitModelTotal; i += (1 << kNumMoveReducingBits)) { const int kCyclesBits = kNumBitPriceShiftBits; UInt32 w = i; UInt32 bitCount = 0; int j; for (j = 0; j < kCyclesBits; j++) { w = w * w; bitCount <<= 1; while (w >= ((UInt32)1 << 16)) { w >>= 1; bitCount++; } } ProbPrices[i >> kNumMoveReducingBits] = ((kNumBitModelTotalBits << kCyclesBits) - 15 - bitCount); } } #define GET_PRICE(prob, symbol) \ p->ProbPrices[((prob) ^ (((-(int)(symbol))) & (kBitModelTotal - 1))) >> kNumMoveReducingBits]; #define GET_PRICEa(prob, symbol) \ ProbPrices[((prob) ^ ((-((int)(symbol))) & (kBitModelTotal - 1))) >> kNumMoveReducingBits]; #define GET_PRICE_0(prob) p->ProbPrices[(prob) >> kNumMoveReducingBits] #define GET_PRICE_1(prob) p->ProbPrices[((prob) ^ (kBitModelTotal - 1)) >> kNumMoveReducingBits] #define GET_PRICE_0a(prob) ProbPrices[(prob) >> kNumMoveReducingBits] #define GET_PRICE_1a(prob) ProbPrices[((prob) ^ (kBitModelTotal - 1)) >> kNumMoveReducingBits] static UInt32 LitEnc_GetPrice(const CLzmaProb *probs, UInt32 symbol, UInt32 *ProbPrices) { UInt32 price = 0; symbol |= 0x100; do { price += GET_PRICEa(probs[symbol >> 8], (symbol >> 7) & 1); symbol <<= 1; } while (symbol < 0x10000); return price; }; static UInt32 LitEnc_GetPriceMatched(const CLzmaProb *probs, UInt32 symbol, UInt32 matchByte, UInt32 *ProbPrices) { UInt32 price = 0; UInt32 offs = 0x100; symbol |= 0x100; do { matchByte <<= 1; price += GET_PRICEa(probs[offs + (matchByte & offs) + (symbol >> 8)], (symbol >> 7) & 1); symbol <<= 1; offs &= ~(matchByte ^ symbol); } while (symbol < 0x10000); return price; }; static void RcTree_Encode(CRangeEnc *rc, CLzmaProb *probs, int numBitLevels, UInt32 symbol) { UInt32 m = 1; int i; for (i = numBitLevels; i != 0 ;) { UInt32 bit; i--; bit = (symbol >> i) & 1; RangeEnc_EncodeBit(rc, probs + m, bit); m = (m << 1) | bit; } }; static void RcTree_ReverseEncode(CRangeEnc *rc, CLzmaProb *probs, int numBitLevels, UInt32 symbol) { UInt32 m = 1; int i; for (i = 0; i < numBitLevels; i++) { UInt32 bit = symbol & 1; RangeEnc_EncodeBit(rc, probs + m, bit); m = (m << 1) | bit; symbol >>= 1; } } static UInt32 RcTree_GetPrice(const CLzmaProb *probs, int numBitLevels, UInt32 symbol, UInt32 *ProbPrices) { UInt32 price = 0; symbol |= (1 << numBitLevels); while (symbol != 1) { price += GET_PRICEa(probs[symbol >> 1], symbol & 1); symbol >>= 1; } return price; } static UInt32 RcTree_ReverseGetPrice(const CLzmaProb *probs, int numBitLevels, UInt32 symbol, UInt32 *ProbPrices) { UInt32 price = 0; UInt32 m = 1; int i; for (i = numBitLevels; i != 0; i--) { UInt32 bit = symbol & 1; symbol >>= 1; price += GET_PRICEa(probs[m], bit); m = (m << 1) | bit; } return price; } static void LenEnc_Init(CLenEnc *p) { unsigned i; p->choice = p->choice2 = kProbInitValue; for (i = 0; i < (LZMA_NUM_PB_STATES_MAX << kLenNumLowBits); i++) p->low[i] = kProbInitValue; for (i = 0; i < (LZMA_NUM_PB_STATES_MAX << kLenNumMidBits); i++) p->mid[i] = kProbInitValue; for (i = 0; i < kLenNumHighSymbols; i++) p->high[i] = kProbInitValue; } static void LenEnc_Encode(CLenEnc *p, CRangeEnc *rc, UInt32 symbol, UInt32 posState) { if (symbol < kLenNumLowSymbols) { RangeEnc_EncodeBit(rc, &p->choice, 0); RcTree_Encode(rc, p->low + (posState << kLenNumLowBits), kLenNumLowBits, symbol); } else { RangeEnc_EncodeBit(rc, &p->choice, 1); if (symbol < kLenNumLowSymbols + kLenNumMidSymbols) { RangeEnc_EncodeBit(rc, &p->choice2, 0); RcTree_Encode(rc, p->mid + (posState << kLenNumMidBits), kLenNumMidBits, symbol - kLenNumLowSymbols); } else { RangeEnc_EncodeBit(rc, &p->choice2, 1); RcTree_Encode(rc, p->high, kLenNumHighBits, symbol - kLenNumLowSymbols - kLenNumMidSymbols); } } } static void LenEnc_SetPrices(CLenEnc *p, UInt32 posState, UInt32 numSymbols, UInt32 *prices, UInt32 *ProbPrices) { UInt32 a0 = GET_PRICE_0a(p->choice); UInt32 a1 = GET_PRICE_1a(p->choice); UInt32 b0 = a1 + GET_PRICE_0a(p->choice2); UInt32 b1 = a1 + GET_PRICE_1a(p->choice2); UInt32 i = 0; for (i = 0; i < kLenNumLowSymbols; i++) { if (i >= numSymbols) return; prices[i] = a0 + RcTree_GetPrice(p->low + (posState << kLenNumLowBits), kLenNumLowBits, i, ProbPrices); } for (; i < kLenNumLowSymbols + kLenNumMidSymbols; i++) { if (i >= numSymbols) return; prices[i] = b0 + RcTree_GetPrice(p->mid + (posState << kLenNumMidBits), kLenNumMidBits, i - kLenNumLowSymbols, ProbPrices); } for (; i < numSymbols; i++) prices[i] = b1 + RcTree_GetPrice(p->high, kLenNumHighBits, i - kLenNumLowSymbols - kLenNumMidSymbols, ProbPrices); } static void MY_FAST_CALL LenPriceEnc_UpdateTable(CLenPriceEnc *p, UInt32 posState, UInt32 *ProbPrices) { LenEnc_SetPrices(&p->p, posState, p->tableSize, p->prices[posState], ProbPrices); p->counters[posState] = p->tableSize; } static void LenPriceEnc_UpdateTables(CLenPriceEnc *p, UInt32 numPosStates, UInt32 *ProbPrices) { UInt32 posState; for (posState = 0; posState < numPosStates; posState++) LenPriceEnc_UpdateTable(p, posState, ProbPrices); } static void LenEnc_Encode2(CLenPriceEnc *p, CRangeEnc *rc, UInt32 symbol, UInt32 posState, Bool updatePrice, UInt32 *ProbPrices) { LenEnc_Encode(&p->p, rc, symbol, posState); if (updatePrice) if (--p->counters[posState] == 0) LenPriceEnc_UpdateTable(p, posState, ProbPrices); } static void MovePos(CLzmaEnc *p, UInt32 num) { #ifdef SHOW_STAT ttt += num; printf("\n MovePos %d", num); #endif if (num != 0) { p->additionalOffset += num; p->matchFinder.Skip(p->matchFinderObj, num); } } static UInt32 ReadMatchDistances(CLzmaEnc *p, UInt32 *numDistancePairsRes) { UInt32 lenRes = 0, numDistancePairs; numDistancePairs = p->matchFinder.GetMatches(p->matchFinderObj, p->matchDistances); #ifdef SHOW_STAT printf("\n i = %d numPairs = %d ", ttt, numDistancePairs / 2); if (ttt >= 61994) ttt = ttt; ttt++; { UInt32 i; for (i = 0; i < numDistancePairs; i += 2) printf("%2d %6d | ", p->matchDistances[i], p->matchDistances[i + 1]); } #endif if (numDistancePairs > 0) { lenRes = p->matchDistances[numDistancePairs - 2]; if (lenRes == p->numFastBytes) { UInt32 numAvail = p->matchFinder.GetNumAvailableBytes(p->matchFinderObj) + 1; const Byte *pby = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1; UInt32 distance = p->matchDistances[numDistancePairs - 1] + 1; if (numAvail > LZMA_MATCH_LEN_MAX) numAvail = LZMA_MATCH_LEN_MAX; { const Byte *pby2 = pby - distance; for (; lenRes < numAvail && pby[lenRes] == pby2[lenRes]; lenRes++); } } } p->additionalOffset++; *numDistancePairsRes = numDistancePairs; return lenRes; } #define MakeAsChar(p) (p)->backPrev = (UInt32)(-1); (p)->prev1IsChar = False; #define MakeAsShortRep(p) (p)->backPrev = 0; (p)->prev1IsChar = False; #define IsShortRep(p) ((p)->backPrev == 0) static UInt32 GetRepLen1Price(CLzmaEnc *p, UInt32 state, UInt32 posState) { return GET_PRICE_0(p->isRepG0[state]) + GET_PRICE_0(p->isRep0Long[state][posState]); } static UInt32 GetPureRepPrice(CLzmaEnc *p, UInt32 repIndex, UInt32 state, UInt32 posState) { UInt32 price; if (repIndex == 0) { price = GET_PRICE_0(p->isRepG0[state]); price += GET_PRICE_1(p->isRep0Long[state][posState]); } else { price = GET_PRICE_1(p->isRepG0[state]); if (repIndex == 1) price += GET_PRICE_0(p->isRepG1[state]); else { price += GET_PRICE_1(p->isRepG1[state]); price += GET_PRICE(p->isRepG2[state], repIndex - 2); } } return price; } static UInt32 GetRepPrice(CLzmaEnc *p, UInt32 repIndex, UInt32 len, UInt32 state, UInt32 posState) { return p->repLenEnc.prices[posState][len - LZMA_MATCH_LEN_MIN] + GetPureRepPrice(p, repIndex, state, posState); } static UInt32 Backward(CLzmaEnc *p, UInt32 *backRes, UInt32 cur) { UInt32 posMem = p->opt[cur].posPrev; UInt32 backMem = p->opt[cur].backPrev; p->optimumEndIndex = cur; do { if (p->opt[cur].prev1IsChar) { MakeAsChar(&p->opt[posMem]) p->opt[posMem].posPrev = posMem - 1; if (p->opt[cur].prev2) { p->opt[posMem - 1].prev1IsChar = False; p->opt[posMem - 1].posPrev = p->opt[cur].posPrev2; p->opt[posMem - 1].backPrev = p->opt[cur].backPrev2; } } { UInt32 posPrev = posMem; UInt32 backCur = backMem; backMem = p->opt[posPrev].backPrev; posMem = p->opt[posPrev].posPrev; p->opt[posPrev].backPrev = backCur; p->opt[posPrev].posPrev = cur; cur = posPrev; } } while (cur != 0); *backRes = p->opt[0].backPrev; p->optimumCurrentIndex = p->opt[0].posPrev; return p->optimumCurrentIndex; } #define LIT_PROBS(pos, prevByte) (p->litProbs + ((((pos) & p->lpMask) << p->lc) + ((prevByte) >> (8 - p->lc))) * 0x300) #pragma GCC diagnostic ignored "-Wshadow" static UInt32 GetOptimum(CLzmaEnc *p, UInt32 position, UInt32 *backRes) { UInt32 numAvailableBytes, lenMain, numDistancePairs; const Byte *data; UInt32 reps[LZMA_NUM_REPS]; UInt32 repLens[LZMA_NUM_REPS]; UInt32 repMaxIndex, i; UInt32 *matchDistances; Byte currentByte, matchByte; UInt32 posState; UInt32 matchPrice, repMatchPrice; UInt32 lenEnd; UInt32 len; UInt32 normalMatchPrice; UInt32 cur; if (p->optimumEndIndex != p->optimumCurrentIndex) { const COptimal *opt = &p->opt[p->optimumCurrentIndex]; UInt32 lenRes = opt->posPrev - p->optimumCurrentIndex; *backRes = opt->backPrev; p->optimumCurrentIndex = opt->posPrev; return lenRes; } p->optimumCurrentIndex = p->optimumEndIndex = 0; numAvailableBytes = p->matchFinder.GetNumAvailableBytes(p->matchFinderObj); if (!p->longestMatchWasFound) { lenMain = ReadMatchDistances(p, &numDistancePairs); } else { lenMain = p->longestMatchLength; numDistancePairs = p->numDistancePairs; p->longestMatchWasFound = False; } data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1; if (numAvailableBytes < 2) { *backRes = (UInt32)(-1); return 1; } if (numAvailableBytes > LZMA_MATCH_LEN_MAX) numAvailableBytes = LZMA_MATCH_LEN_MAX; repMaxIndex = 0; for (i = 0; i < LZMA_NUM_REPS; i++) { UInt32 lenTest; const Byte *data2; reps[i] = p->reps[i]; data2 = data - (reps[i] + 1); if (data[0] != data2[0] || data[1] != data2[1]) { repLens[i] = 0; continue; } for (lenTest = 2; lenTest < numAvailableBytes && data[lenTest] == data2[lenTest]; lenTest++); repLens[i] = lenTest; if (lenTest > repLens[repMaxIndex]) repMaxIndex = i; } if (repLens[repMaxIndex] >= p->numFastBytes) { UInt32 lenRes; *backRes = repMaxIndex; lenRes = repLens[repMaxIndex]; MovePos(p, lenRes - 1); return lenRes; } matchDistances = p->matchDistances; if (lenMain >= p->numFastBytes) { *backRes = matchDistances[numDistancePairs - 1] + LZMA_NUM_REPS; MovePos(p, lenMain - 1); return lenMain; } currentByte = *data; matchByte = *(data - (reps[0] + 1)); if (lenMain < 2 && currentByte != matchByte && repLens[repMaxIndex] < 2) { *backRes = (UInt32)-1; return 1; } p->opt[0].state = (CState)p->state; posState = (position & p->pbMask); { const CLzmaProb *probs = LIT_PROBS(position, *(data - 1)); p->opt[1].price = GET_PRICE_0(p->isMatch[p->state][posState]) + (!IsCharState(p->state) ? LitEnc_GetPriceMatched(probs, currentByte, matchByte, p->ProbPrices) : LitEnc_GetPrice(probs, currentByte, p->ProbPrices)); } MakeAsChar(&p->opt[1]); matchPrice = GET_PRICE_1(p->isMatch[p->state][posState]); repMatchPrice = matchPrice + GET_PRICE_1(p->isRep[p->state]); if (matchByte == currentByte) { UInt32 shortRepPrice = repMatchPrice + GetRepLen1Price(p, p->state, posState); if (shortRepPrice < p->opt[1].price) { p->opt[1].price = shortRepPrice; MakeAsShortRep(&p->opt[1]); } } lenEnd = ((lenMain >= repLens[repMaxIndex]) ? lenMain : repLens[repMaxIndex]); if (lenEnd < 2) { *backRes = p->opt[1].backPrev; return 1; } p->opt[1].posPrev = 0; for (i = 0; i < LZMA_NUM_REPS; i++) p->opt[0].backs[i] = reps[i]; len = lenEnd; do p->opt[len--].price = kInfinityPrice; while (len >= 2); for (i = 0; i < LZMA_NUM_REPS; i++) { UInt32 repLen = repLens[i]; UInt32 price; if (repLen < 2) continue; price = repMatchPrice + GetPureRepPrice(p, i, p->state, posState); do { UInt32 curAndLenPrice = price + p->repLenEnc.prices[posState][repLen - 2]; COptimal *opt = &p->opt[repLen]; if (curAndLenPrice < opt->price) { opt->price = curAndLenPrice; opt->posPrev = 0; opt->backPrev = i; opt->prev1IsChar = False; } } while (--repLen >= 2); } normalMatchPrice = matchPrice + GET_PRICE_0(p->isRep[p->state]); len = ((repLens[0] >= 2) ? repLens[0] + 1 : 2); if (len <= lenMain) { UInt32 offs = 0; while (len > matchDistances[offs]) offs += 2; for (; ; len++) { COptimal *opt; UInt32 distance = matchDistances[offs + 1]; UInt32 curAndLenPrice = normalMatchPrice + p->lenEnc.prices[posState][len - LZMA_MATCH_LEN_MIN]; UInt32 lenToPosState = GetLenToPosState(len); if (distance < kNumFullDistances) curAndLenPrice += p->distancesPrices[lenToPosState][distance]; else { UInt32 slot; GetPosSlot2(distance, slot); curAndLenPrice += p->alignPrices[distance & kAlignMask] + p->posSlotPrices[lenToPosState][slot]; } opt = &p->opt[len]; if (curAndLenPrice < opt->price) { opt->price = curAndLenPrice; opt->posPrev = 0; opt->backPrev = distance + LZMA_NUM_REPS; opt->prev1IsChar = False; } if (len == matchDistances[offs]) { offs += 2; if (offs == numDistancePairs) break; } } } cur = 0; #ifdef SHOW_STAT2 if (position >= 0) { unsigned i; printf("\n pos = %4X", position); for (i = cur; i <= lenEnd; i++) printf("\nprice[%4X] = %d", position - cur + i, p->opt[i].price); } #endif for (;;) { UInt32 numAvailableBytesFull, newLen, numDistancePairs; COptimal *curOpt; UInt32 posPrev; UInt32 state; UInt32 curPrice; Bool nextIsChar; const Byte *data; Byte currentByte, matchByte; UInt32 posState; UInt32 curAnd1Price; COptimal *nextOpt; UInt32 matchPrice, repMatchPrice; UInt32 numAvailableBytes; UInt32 startLen; cur++; if (cur == lenEnd) return Backward(p, backRes, cur); numAvailableBytesFull = p->matchFinder.GetNumAvailableBytes(p->matchFinderObj); newLen = ReadMatchDistances(p, &numDistancePairs); if (newLen >= p->numFastBytes) { p->numDistancePairs = numDistancePairs; p->longestMatchLength = newLen; p->longestMatchWasFound = True; return Backward(p, backRes, cur); } position++; curOpt = &p->opt[cur]; posPrev = curOpt->posPrev; if (curOpt->prev1IsChar) { posPrev--; if (curOpt->prev2) { state = p->opt[curOpt->posPrev2].state; if (curOpt->backPrev2 < LZMA_NUM_REPS) state = kRepNextStates[state]; else state = kMatchNextStates[state]; } else state = p->opt[posPrev].state; state = kLiteralNextStates[state]; } else state = p->opt[posPrev].state; if (posPrev == cur - 1) { if (IsShortRep(curOpt)) state = kShortRepNextStates[state]; else state = kLiteralNextStates[state]; } else { UInt32 pos; const COptimal *prevOpt; if (curOpt->prev1IsChar && curOpt->prev2) { posPrev = curOpt->posPrev2; pos = curOpt->backPrev2; state = kRepNextStates[state]; } else { pos = curOpt->backPrev; if (pos < LZMA_NUM_REPS) state = kRepNextStates[state]; else state = kMatchNextStates[state]; } prevOpt = &p->opt[posPrev]; if (pos < LZMA_NUM_REPS) { UInt32 i; reps[0] = prevOpt->backs[pos]; for (i = 1; i < pos + 1; i++) reps[i] = prevOpt->backs[i - 1]; for (; i < LZMA_NUM_REPS; i++) reps[i] = prevOpt->backs[i]; } else { UInt32 i; reps[0] = (pos - LZMA_NUM_REPS); for (i = 1; i < LZMA_NUM_REPS; i++) reps[i] = prevOpt->backs[i - 1]; } } curOpt->state = (CState)state; curOpt->backs[0] = reps[0]; curOpt->backs[1] = reps[1]; curOpt->backs[2] = reps[2]; curOpt->backs[3] = reps[3]; curPrice = curOpt->price; nextIsChar = False; data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1; currentByte = *data; matchByte = *(data - (reps[0] + 1)); posState = (position & p->pbMask); curAnd1Price = curPrice + GET_PRICE_0(p->isMatch[state][posState]); { const CLzmaProb *probs = LIT_PROBS(position, *(data - 1)); curAnd1Price += (!IsCharState(state) ? LitEnc_GetPriceMatched(probs, currentByte, matchByte, p->ProbPrices) : LitEnc_GetPrice(probs, currentByte, p->ProbPrices)); } nextOpt = &p->opt[cur + 1]; if (curAnd1Price < nextOpt->price) { nextOpt->price = curAnd1Price; nextOpt->posPrev = cur; MakeAsChar(nextOpt); nextIsChar = True; } matchPrice = curPrice + GET_PRICE_1(p->isMatch[state][posState]); repMatchPrice = matchPrice + GET_PRICE_1(p->isRep[state]); if (matchByte == currentByte && !(nextOpt->posPrev < cur && nextOpt->backPrev == 0)) { UInt32 shortRepPrice = repMatchPrice + GetRepLen1Price(p, state, posState); if (shortRepPrice <= nextOpt->price) { nextOpt->price = shortRepPrice; nextOpt->posPrev = cur; MakeAsShortRep(nextOpt); nextIsChar = True; } } { UInt32 temp = kNumOpts - 1 - cur; if (temp < numAvailableBytesFull) numAvailableBytesFull = temp; } numAvailableBytes = numAvailableBytesFull; if (numAvailableBytes < 2) continue; if (numAvailableBytes > p->numFastBytes) numAvailableBytes = p->numFastBytes; if (!nextIsChar && matchByte != currentByte) /* speed optimization */ { /* try Literal + rep0 */ UInt32 temp; UInt32 lenTest2; const Byte *data2 = data - (reps[0] + 1); UInt32 limit = p->numFastBytes + 1; if (limit > numAvailableBytesFull) limit = numAvailableBytesFull; for (temp = 1; temp < limit && data[temp] == data2[temp]; temp++); lenTest2 = temp - 1; if (lenTest2 >= 2) { UInt32 state2 = kLiteralNextStates[state]; UInt32 posStateNext = (position + 1) & p->pbMask; UInt32 nextRepMatchPrice = curAnd1Price + GET_PRICE_1(p->isMatch[state2][posStateNext]) + GET_PRICE_1(p->isRep[state2]); /* for (; lenTest2 >= 2; lenTest2--) */ { UInt32 curAndLenPrice; COptimal *opt; UInt32 offset = cur + 1 + lenTest2; while (lenEnd < offset) p->opt[++lenEnd].price = kInfinityPrice; curAndLenPrice = nextRepMatchPrice + GetRepPrice(p, 0, lenTest2, state2, posStateNext); opt = &p->opt[offset]; if (curAndLenPrice < opt->price) { opt->price = curAndLenPrice; opt->posPrev = cur + 1; opt->backPrev = 0; opt->prev1IsChar = True; opt->prev2 = False; } } } } startLen = 2; /* speed optimization */ { UInt32 repIndex; for (repIndex = 0; repIndex < LZMA_NUM_REPS; repIndex++) { UInt32 lenTest; UInt32 lenTestTemp; UInt32 price; const Byte *data2 = data - (reps[repIndex] + 1); if (data[0] != data2[0] || data[1] != data2[1]) continue; for (lenTest = 2; lenTest < numAvailableBytes && data[lenTest] == data2[lenTest]; lenTest++); while (lenEnd < cur + lenTest) p->opt[++lenEnd].price = kInfinityPrice; lenTestTemp = lenTest; price = repMatchPrice + GetPureRepPrice(p, repIndex, state, posState); do { UInt32 curAndLenPrice = price + p->repLenEnc.prices[posState][lenTest - 2]; COptimal *opt = &p->opt[cur + lenTest]; if (curAndLenPrice < opt->price) { opt->price = curAndLenPrice; opt->posPrev = cur; opt->backPrev = repIndex; opt->prev1IsChar = False; } } while (--lenTest >= 2); lenTest = lenTestTemp; if (repIndex == 0) startLen = lenTest + 1; /* if (_maxMode) */ { UInt32 lenTest2 = lenTest + 1; UInt32 limit = lenTest2 + p->numFastBytes; UInt32 nextRepMatchPrice; if (limit > numAvailableBytesFull) limit = numAvailableBytesFull; for (; lenTest2 < limit && data[lenTest2] == data2[lenTest2]; lenTest2++); lenTest2 -= lenTest + 1; if (lenTest2 >= 2) { UInt32 state2 = kRepNextStates[state]; UInt32 posStateNext = (position + lenTest) & p->pbMask; UInt32 curAndLenCharPrice = price + p->repLenEnc.prices[posState][lenTest - 2] + GET_PRICE_0(p->isMatch[state2][posStateNext]) + LitEnc_GetPriceMatched(LIT_PROBS(position + lenTest, data[lenTest - 1]), data[lenTest], data2[lenTest], p->ProbPrices); state2 = kLiteralNextStates[state2]; posStateNext = (position + lenTest + 1) & p->pbMask; nextRepMatchPrice = curAndLenCharPrice + GET_PRICE_1(p->isMatch[state2][posStateNext]) + GET_PRICE_1(p->isRep[state2]); /* for (; lenTest2 >= 2; lenTest2--) */ { UInt32 curAndLenPrice; COptimal *opt; UInt32 offset = cur + lenTest + 1 + lenTest2; while (lenEnd < offset) p->opt[++lenEnd].price = kInfinityPrice; curAndLenPrice = nextRepMatchPrice + GetRepPrice(p, 0, lenTest2, state2, posStateNext); opt = &p->opt[offset]; if (curAndLenPrice < opt->price) { opt->price = curAndLenPrice; opt->posPrev = cur + lenTest + 1; opt->backPrev = 0; opt->prev1IsChar = True; opt->prev2 = True; opt->posPrev2 = cur; opt->backPrev2 = repIndex; } } } } } } /* for (UInt32 lenTest = 2; lenTest <= newLen; lenTest++) */ if (newLen > numAvailableBytes) { newLen = numAvailableBytes; for (numDistancePairs = 0; newLen > matchDistances[numDistancePairs]; numDistancePairs += 2); matchDistances[numDistancePairs] = newLen; numDistancePairs += 2; } if (newLen >= startLen) { UInt32 normalMatchPrice = matchPrice + GET_PRICE_0(p->isRep[state]); UInt32 offs, curBack, posSlot; UInt32 lenTest; while (lenEnd < cur + newLen) p->opt[++lenEnd].price = kInfinityPrice; offs = 0; while (startLen > matchDistances[offs]) offs += 2; curBack = matchDistances[offs + 1]; GetPosSlot2(curBack, posSlot); for (lenTest = /*2*/ startLen; ; lenTest++) { UInt32 curAndLenPrice = normalMatchPrice + p->lenEnc.prices[posState][lenTest - LZMA_MATCH_LEN_MIN]; UInt32 lenToPosState = GetLenToPosState(lenTest); COptimal *opt; if (curBack < kNumFullDistances) curAndLenPrice += p->distancesPrices[lenToPosState][curBack]; else curAndLenPrice += p->posSlotPrices[lenToPosState][posSlot] + p->alignPrices[curBack & kAlignMask]; opt = &p->opt[cur + lenTest]; if (curAndLenPrice < opt->price) { opt->price = curAndLenPrice; opt->posPrev = cur; opt->backPrev = curBack + LZMA_NUM_REPS; opt->prev1IsChar = False; } if (/*_maxMode && */lenTest == matchDistances[offs]) { /* Try Match + Literal + Rep0 */ const Byte *data2 = data - (curBack + 1); UInt32 lenTest2 = lenTest + 1; UInt32 limit = lenTest2 + p->numFastBytes; UInt32 nextRepMatchPrice; if (limit > numAvailableBytesFull) limit = numAvailableBytesFull; for (; lenTest2 < limit && data[lenTest2] == data2[lenTest2]; lenTest2++); lenTest2 -= lenTest + 1; if (lenTest2 >= 2) { UInt32 state2 = kMatchNextStates[state]; UInt32 posStateNext = (position + lenTest) & p->pbMask; UInt32 curAndLenCharPrice = curAndLenPrice + GET_PRICE_0(p->isMatch[state2][posStateNext]) + LitEnc_GetPriceMatched(LIT_PROBS(position + lenTest, data[lenTest - 1]), data[lenTest], data2[lenTest], p->ProbPrices); state2 = kLiteralNextStates[state2]; posStateNext = (posStateNext + 1) & p->pbMask; nextRepMatchPrice = curAndLenCharPrice + GET_PRICE_1(p->isMatch[state2][posStateNext]) + GET_PRICE_1(p->isRep[state2]); /* for (; lenTest2 >= 2; lenTest2--) */ { UInt32 offset = cur + lenTest + 1 + lenTest2; UInt32 curAndLenPrice; COptimal *opt; while (lenEnd < offset) p->opt[++lenEnd].price = kInfinityPrice; curAndLenPrice = nextRepMatchPrice + GetRepPrice(p, 0, lenTest2, state2, posStateNext); opt = &p->opt[offset]; if (curAndLenPrice < opt->price) { opt->price = curAndLenPrice; opt->posPrev = cur + lenTest + 1; opt->backPrev = 0; opt->prev1IsChar = True; opt->prev2 = True; opt->posPrev2 = cur; opt->backPrev2 = curBack + LZMA_NUM_REPS; } } } offs += 2; if (offs == numDistancePairs) break; curBack = matchDistances[offs + 1]; if (curBack >= kNumFullDistances) GetPosSlot2(curBack, posSlot); } } } } } #define ChangePair(smallDist, bigDist) (((bigDist) >> 7) > (smallDist)) static UInt32 GetOptimumFast(CLzmaEnc *p, UInt32 *backRes) { UInt32 numAvailableBytes = p->matchFinder.GetNumAvailableBytes(p->matchFinderObj); UInt32 lenMain, numDistancePairs; const Byte *data; UInt32 repLens[LZMA_NUM_REPS]; UInt32 repMaxIndex, i; UInt32 *matchDistances; UInt32 backMain; if (!p->longestMatchWasFound) { lenMain = ReadMatchDistances(p, &numDistancePairs); } else { lenMain = p->longestMatchLength; numDistancePairs = p->numDistancePairs; p->longestMatchWasFound = False; } data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1; if (numAvailableBytes > LZMA_MATCH_LEN_MAX) numAvailableBytes = LZMA_MATCH_LEN_MAX; if (numAvailableBytes < 2) { *backRes = (UInt32)(-1); return 1; } repMaxIndex = 0; for (i = 0; i < LZMA_NUM_REPS; i++) { const Byte *data2 = data - (p->reps[i] + 1); UInt32 len; if (data[0] != data2[0] || data[1] != data2[1]) { repLens[i] = 0; continue; } for (len = 2; len < numAvailableBytes && data[len] == data2[len]; len++); if (len >= p->numFastBytes) { *backRes = i; MovePos(p, len - 1); return len; } repLens[i] = len; if (len > repLens[repMaxIndex]) repMaxIndex = i; } matchDistances = p->matchDistances; if (lenMain >= p->numFastBytes) { *backRes = matchDistances[numDistancePairs - 1] + LZMA_NUM_REPS; MovePos(p, lenMain - 1); return lenMain; } backMain = 0; /* for GCC */ if (lenMain >= 2) { backMain = matchDistances[numDistancePairs - 1]; while (numDistancePairs > 2 && lenMain == matchDistances[numDistancePairs - 4] + 1) { if (!ChangePair(matchDistances[numDistancePairs - 3], backMain)) break; numDistancePairs -= 2; lenMain = matchDistances[numDistancePairs - 2]; backMain = matchDistances[numDistancePairs - 1]; } if (lenMain == 2 && backMain >= 0x80) lenMain = 1; } if (repLens[repMaxIndex] >= 2) { if (repLens[repMaxIndex] + 1 >= lenMain || (repLens[repMaxIndex] + 2 >= lenMain && (backMain > (1 << 9))) || (repLens[repMaxIndex] + 3 >= lenMain && (backMain > (1 << 15)))) { UInt32 lenRes; *backRes = repMaxIndex; lenRes = repLens[repMaxIndex]; MovePos(p, lenRes - 1); return lenRes; } } if (lenMain >= 2 && numAvailableBytes > 2) { UInt32 i; numAvailableBytes = p->matchFinder.GetNumAvailableBytes(p->matchFinderObj); p->longestMatchLength = ReadMatchDistances(p, &p->numDistancePairs); if (p->longestMatchLength >= 2) { UInt32 newDistance = matchDistances[p->numDistancePairs - 1]; if ((p->longestMatchLength >= lenMain && newDistance < backMain) || (p->longestMatchLength == lenMain + 1 && !ChangePair(backMain, newDistance)) || (p->longestMatchLength > lenMain + 1) || (p->longestMatchLength + 1 >= lenMain && lenMain >= 3 && ChangePair(newDistance, backMain))) { p->longestMatchWasFound = True; *backRes = (UInt32)(-1); return 1; } } data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1; for (i = 0; i < LZMA_NUM_REPS; i++) { UInt32 len; const Byte *data2 = data - (p->reps[i] + 1); if (data[1] != data2[1] || data[2] != data2[2]) { repLens[i] = 0; continue; } for (len = 2; len < numAvailableBytes && data[len] == data2[len]; len++); if (len + 1 >= lenMain) { p->longestMatchWasFound = True; *backRes = (UInt32)(-1); return 1; } } *backRes = backMain + LZMA_NUM_REPS; MovePos(p, lenMain - 2); return lenMain; } *backRes = (UInt32)(-1); return 1; } static void WriteEndMarker(CLzmaEnc *p, UInt32 posState) { UInt32 len; RangeEnc_EncodeBit(&p->rc, &p->isMatch[p->state][posState], 1); RangeEnc_EncodeBit(&p->rc, &p->isRep[p->state], 0); p->state = kMatchNextStates[p->state]; len = LZMA_MATCH_LEN_MIN; LenEnc_Encode2(&p->lenEnc, &p->rc, len - LZMA_MATCH_LEN_MIN, posState, !p->fastMode, p->ProbPrices); RcTree_Encode(&p->rc, p->posSlotEncoder[GetLenToPosState(len)], kNumPosSlotBits, (1 << kNumPosSlotBits) - 1); RangeEnc_EncodeDirectBits(&p->rc, (((UInt32)1 << 30) - 1) >> kNumAlignBits, 30 - kNumAlignBits); RcTree_ReverseEncode(&p->rc, p->posAlignEncoder, kNumAlignBits, kAlignMask); } static SRes CheckErrors(CLzmaEnc *p) { if (p->result != SZ_OK) return p->result; if (p->rc.res != SZ_OK) p->result = SZ_ERROR_WRITE; if (p->matchFinderBase.result != SZ_OK) p->result = SZ_ERROR_READ; if (p->result != SZ_OK) p->finished = True; return p->result; } static SRes Flush(CLzmaEnc *p, UInt32 nowPos) { /* ReleaseMFStream(); */ p->finished = True; if (p->writeEndMark) WriteEndMarker(p, nowPos & p->pbMask); RangeEnc_FlushData(&p->rc); RangeEnc_FlushStream(&p->rc); return CheckErrors(p); } static void FillAlignPrices(CLzmaEnc *p) { UInt32 i; for (i = 0; i < kAlignTableSize; i++) p->alignPrices[i] = RcTree_ReverseGetPrice(p->posAlignEncoder, kNumAlignBits, i, p->ProbPrices); p->alignPriceCount = 0; } static void FillDistancesPrices(CLzmaEnc *p) { UInt32 tempPrices[kNumFullDistances]; UInt32 i, lenToPosState; for (i = kStartPosModelIndex; i < kNumFullDistances; i++) { UInt32 posSlot = GetPosSlot1(i); UInt32 footerBits = ((posSlot >> 1) - 1); UInt32 base = ((2 | (posSlot & 1)) << footerBits); tempPrices[i] = RcTree_ReverseGetPrice(p->posEncoders + base - posSlot - 1, footerBits, i - base, p->ProbPrices); } for (lenToPosState = 0; lenToPosState < kNumLenToPosStates; lenToPosState++) { UInt32 posSlot; const CLzmaProb *encoder = p->posSlotEncoder[lenToPosState]; UInt32 *posSlotPrices = p->posSlotPrices[lenToPosState]; for (posSlot = 0; posSlot < p->distTableSize; posSlot++) posSlotPrices[posSlot] = RcTree_GetPrice(encoder, kNumPosSlotBits, posSlot, p->ProbPrices); for (posSlot = kEndPosModelIndex; posSlot < p->distTableSize; posSlot++) posSlotPrices[posSlot] += ((((posSlot >> 1) - 1) - kNumAlignBits) << kNumBitPriceShiftBits); { UInt32 *distancesPrices = p->distancesPrices[lenToPosState]; UInt32 i; for (i = 0; i < kStartPosModelIndex; i++) distancesPrices[i] = posSlotPrices[i]; for (; i < kNumFullDistances; i++) distancesPrices[i] = posSlotPrices[GetPosSlot1(i)] + tempPrices[i]; } } p->matchPriceCount = 0; } static void LzmaEnc_Construct(CLzmaEnc *p) { RangeEnc_Construct(&p->rc); MatchFinder_Construct(&p->matchFinderBase); #ifdef COMPRESS_MF_MT MatchFinderMt_Construct(&p->matchFinderMt); p->matchFinderMt.MatchFinder = &p->matchFinderBase; #endif { CLzmaEncProps props; LzmaEncProps_Init(&props); LzmaEnc_SetProps(p, &props); } #ifndef LZMA_LOG_BSR LzmaEnc_FastPosInit(p->g_FastPos); #endif LzmaEnc_InitPriceTables(p->ProbPrices); p->litProbs = 0; p->saveState.litProbs = 0; } CLzmaEncHandle LzmaEnc_Create(ISzAlloc *alloc) { void *p; p = alloc->Alloc(alloc, sizeof(CLzmaEnc)); if (p != 0) LzmaEnc_Construct((CLzmaEnc *)p); return p; } static void LzmaEnc_FreeLits(CLzmaEnc *p, ISzAlloc *alloc) { alloc->Free(alloc, p->litProbs); alloc->Free(alloc, p->saveState.litProbs); p->litProbs = 0; p->saveState.litProbs = 0; } static void LzmaEnc_Destruct(CLzmaEnc *p, ISzAlloc *alloc, ISzAlloc *allocBig) { #ifdef COMPRESS_MF_MT MatchFinderMt_Destruct(&p->matchFinderMt, allocBig); #endif MatchFinder_Free(&p->matchFinderBase, allocBig); LzmaEnc_FreeLits(p, alloc); RangeEnc_Free(&p->rc, alloc); } void LzmaEnc_Destroy(CLzmaEncHandle p, ISzAlloc *alloc, ISzAlloc *allocBig) { LzmaEnc_Destruct((CLzmaEnc *)p, alloc, allocBig); alloc->Free(alloc, p); } static SRes LzmaEnc_CodeOneBlock(CLzmaEnc *p, Bool useLimits, UInt32 maxPackSize, UInt32 maxUnpackSize) { UInt32 nowPos32, startPos32; if (p->inStream != 0) { p->matchFinderBase.stream = p->inStream; p->matchFinder.Init(p->matchFinderObj); p->inStream = 0; } if (p->finished) return p->result; RINOK(CheckErrors(p)); nowPos32 = (UInt32)p->nowPos64; startPos32 = nowPos32; if (p->nowPos64 == 0) { UInt32 numDistancePairs; Byte curByte; if (p->matchFinder.GetNumAvailableBytes(p->matchFinderObj) == 0) return Flush(p, nowPos32); ReadMatchDistances(p, &numDistancePairs); RangeEnc_EncodeBit(&p->rc, &p->isMatch[p->state][0], 0); p->state = kLiteralNextStates[p->state]; curByte = p->matchFinder.GetIndexByte(p->matchFinderObj, 0 - p->additionalOffset); LitEnc_Encode(&p->rc, p->litProbs, curByte); p->additionalOffset--; nowPos32++; } if (p->matchFinder.GetNumAvailableBytes(p->matchFinderObj) != 0) for (;;) { UInt32 pos, len, posState; if (p->fastMode) len = GetOptimumFast(p, &pos); else len = GetOptimum(p, nowPos32, &pos); #ifdef SHOW_STAT2 printf("\n pos = %4X, len = %d pos = %d", nowPos32, len, pos); #endif posState = nowPos32 & p->pbMask; if (len == 1 && pos == 0xFFFFFFFF) { Byte curByte; CLzmaProb *probs; const Byte *data; RangeEnc_EncodeBit(&p->rc, &p->isMatch[p->state][posState], 0); data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - p->additionalOffset; curByte = *data; probs = LIT_PROBS(nowPos32, *(data - 1)); if (IsCharState(p->state)) LitEnc_Encode(&p->rc, probs, curByte); else LitEnc_EncodeMatched(&p->rc, probs, curByte, *(data - p->reps[0] - 1)); p->state = kLiteralNextStates[p->state]; } else { RangeEnc_EncodeBit(&p->rc, &p->isMatch[p->state][posState], 1); if (pos < LZMA_NUM_REPS) { RangeEnc_EncodeBit(&p->rc, &p->isRep[p->state], 1); if (pos == 0) { RangeEnc_EncodeBit(&p->rc, &p->isRepG0[p->state], 0); RangeEnc_EncodeBit(&p->rc, &p->isRep0Long[p->state][posState], ((len == 1) ? 0 : 1)); } else { UInt32 distance = p->reps[pos]; RangeEnc_EncodeBit(&p->rc, &p->isRepG0[p->state], 1); if (pos == 1) RangeEnc_EncodeBit(&p->rc, &p->isRepG1[p->state], 0); else { RangeEnc_EncodeBit(&p->rc, &p->isRepG1[p->state], 1); RangeEnc_EncodeBit(&p->rc, &p->isRepG2[p->state], pos - 2); if (pos == 3) p->reps[3] = p->reps[2]; p->reps[2] = p->reps[1]; } p->reps[1] = p->reps[0]; p->reps[0] = distance; } if (len == 1) p->state = kShortRepNextStates[p->state]; else { LenEnc_Encode2(&p->repLenEnc, &p->rc, len - LZMA_MATCH_LEN_MIN, posState, !p->fastMode, p->ProbPrices); p->state = kRepNextStates[p->state]; } } else { UInt32 posSlot; RangeEnc_EncodeBit(&p->rc, &p->isRep[p->state], 0); p->state = kMatchNextStates[p->state]; if (len < LZMA_MATCH_LEN_MIN) { p->result = SZ_ERROR_DATA; return CheckErrors(p); } LenEnc_Encode2(&p->lenEnc, &p->rc, len - LZMA_MATCH_LEN_MIN, posState, !p->fastMode, p->ProbPrices); pos -= LZMA_NUM_REPS; GetPosSlot(pos, posSlot); RcTree_Encode(&p->rc, p->posSlotEncoder[GetLenToPosState(len)], kNumPosSlotBits, posSlot); if (posSlot >= kStartPosModelIndex) { UInt32 footerBits = ((posSlot >> 1) - 1); UInt32 base = ((2 | (posSlot & 1)) << footerBits); UInt32 posReduced = pos - base; if (posSlot < kEndPosModelIndex) RcTree_ReverseEncode(&p->rc, p->posEncoders + base - posSlot - 1, footerBits, posReduced); else { RangeEnc_EncodeDirectBits(&p->rc, posReduced >> kNumAlignBits, footerBits - kNumAlignBits); RcTree_ReverseEncode(&p->rc, p->posAlignEncoder, kNumAlignBits, posReduced & kAlignMask); p->alignPriceCount++; } } p->reps[3] = p->reps[2]; p->reps[2] = p->reps[1]; p->reps[1] = p->reps[0]; p->reps[0] = pos; p->matchPriceCount++; } } p->additionalOffset -= len; nowPos32 += len; if (p->additionalOffset == 0) { UInt32 processed; if (!p->fastMode) { if (p->matchPriceCount >= (1 << 7)) FillDistancesPrices(p); if (p->alignPriceCount >= kAlignTableSize) FillAlignPrices(p); } if (p->matchFinder.GetNumAvailableBytes(p->matchFinderObj) == 0) break; processed = nowPos32 - startPos32; if (useLimits) { if (processed + kNumOpts + 300 >= maxUnpackSize || RangeEnc_GetProcessed(&p->rc) + kNumOpts * 2 >= maxPackSize) break; } else if (processed >= (1 << 15)) { p->nowPos64 += nowPos32 - startPos32; return CheckErrors(p); } } } p->nowPos64 += nowPos32 - startPos32; return Flush(p, nowPos32); } #define kBigHashDicLimit ((UInt32)1 << 24) static SRes LzmaEnc_Alloc(CLzmaEnc *p, UInt32 keepWindowSize, ISzAlloc *alloc, ISzAlloc *allocBig) { UInt32 beforeSize = kNumOpts; #ifdef COMPRESS_MF_MT Bool btMode; #endif if (!RangeEnc_Alloc(&p->rc, alloc)) return SZ_ERROR_MEM; #ifdef COMPRESS_MF_MT btMode = (p->matchFinderBase.btMode != 0); p->mtMode = (p->multiThread && !p->fastMode && btMode); #endif { unsigned lclp = p->lc + p->lp; if (p->litProbs == 0 || p->saveState.litProbs == 0 || p->lclp != lclp) { LzmaEnc_FreeLits(p, alloc); p->litProbs = (CLzmaProb *)alloc->Alloc(alloc, (0x300 << lclp) * sizeof(CLzmaProb)); p->saveState.litProbs = (CLzmaProb *)alloc->Alloc(alloc, (0x300 << lclp) * sizeof(CLzmaProb)); if (p->litProbs == 0 || p->saveState.litProbs == 0) { LzmaEnc_FreeLits(p, alloc); return SZ_ERROR_MEM; } p->lclp = lclp; } } p->matchFinderBase.bigHash = (p->dictSize > kBigHashDicLimit); if (beforeSize + p->dictSize < keepWindowSize) beforeSize = keepWindowSize - p->dictSize; #ifdef COMPRESS_MF_MT if (p->mtMode) { RINOK(MatchFinderMt_Create(&p->matchFinderMt, p->dictSize, beforeSize, p->numFastBytes, LZMA_MATCH_LEN_MAX, allocBig)); p->matchFinderObj = &p->matchFinderMt; MatchFinderMt_CreateVTable(&p->matchFinderMt, &p->matchFinder); } else #endif { if (!MatchFinder_Create(&p->matchFinderBase, p->dictSize, beforeSize, p->numFastBytes, LZMA_MATCH_LEN_MAX, allocBig)) return SZ_ERROR_MEM; p->matchFinderObj = &p->matchFinderBase; MatchFinder_CreateVTable(&p->matchFinderBase, &p->matchFinder); } return SZ_OK; } static void LzmaEnc_Init(CLzmaEnc *p) { UInt32 i; p->state = 0; for(i = 0 ; i < LZMA_NUM_REPS; i++) p->reps[i] = 0; RangeEnc_Init(&p->rc); for (i = 0; i < kNumStates; i++) { UInt32 j; for (j = 0; j < LZMA_NUM_PB_STATES_MAX; j++) { p->isMatch[i][j] = kProbInitValue; p->isRep0Long[i][j] = kProbInitValue; } p->isRep[i] = kProbInitValue; p->isRepG0[i] = kProbInitValue; p->isRepG1[i] = kProbInitValue; p->isRepG2[i] = kProbInitValue; } { UInt32 num = 0x300 << (p->lp + p->lc); for (i = 0; i < num; i++) p->litProbs[i] = kProbInitValue; } { for (i = 0; i < kNumLenToPosStates; i++) { CLzmaProb *probs = p->posSlotEncoder[i]; UInt32 j; for (j = 0; j < (1 << kNumPosSlotBits); j++) probs[j] = kProbInitValue; } } { for(i = 0; i < kNumFullDistances - kEndPosModelIndex; i++) p->posEncoders[i] = kProbInitValue; } LenEnc_Init(&p->lenEnc.p); LenEnc_Init(&p->repLenEnc.p); for (i = 0; i < (1 << kNumAlignBits); i++) p->posAlignEncoder[i] = kProbInitValue; p->longestMatchWasFound = False; p->optimumEndIndex = 0; p->optimumCurrentIndex = 0; p->additionalOffset = 0; p->pbMask = (1 << p->pb) - 1; p->lpMask = (1 << p->lp) - 1; } static void LzmaEnc_InitPrices(CLzmaEnc *p) { if (!p->fastMode) { FillDistancesPrices(p); FillAlignPrices(p); } p->lenEnc.tableSize = p->repLenEnc.tableSize = p->numFastBytes + 1 - LZMA_MATCH_LEN_MIN; LenPriceEnc_UpdateTables(&p->lenEnc, 1 << p->pb, p->ProbPrices); LenPriceEnc_UpdateTables(&p->repLenEnc, 1 << p->pb, p->ProbPrices); } static SRes LzmaEnc_AllocAndInit(CLzmaEnc *p, UInt32 keepWindowSize, ISzAlloc *alloc, ISzAlloc *allocBig) { UInt32 i; for (i = 0; i < (UInt32)kDicLogSizeMaxCompress; i++) if (p->dictSize <= ((UInt32)1 << i)) break; p->distTableSize = i * 2; p->finished = False; p->result = SZ_OK; RINOK(LzmaEnc_Alloc(p, keepWindowSize, alloc, allocBig)); LzmaEnc_Init(p); LzmaEnc_InitPrices(p); p->nowPos64 = 0; return SZ_OK; } static SRes LzmaEnc_Prepare(CLzmaEncHandle pp, ISeqInStream *inStream, ISeqOutStream *outStream, ISzAlloc *alloc, ISzAlloc *allocBig) { CLzmaEnc *p = (CLzmaEnc *)pp; p->inStream = inStream; p->rc.outStream = outStream; return LzmaEnc_AllocAndInit(p, 0, alloc, allocBig); } static void LzmaEnc_SetInputBuf(CLzmaEnc *p, const Byte *src, SizeT srcLen) { p->seqBufInStream.funcTable.Read = MyRead; p->seqBufInStream.data = src; p->seqBufInStream.rem = srcLen; } static void LzmaEnc_Finish(CLzmaEncHandle pp) { #ifdef COMPRESS_MF_MT CLzmaEnc *p = (CLzmaEnc *)pp; if (p->mtMode) MatchFinderMt_ReleaseStream(&p->matchFinderMt); #else (void)pp; #endif } typedef struct _CSeqOutStreamBuf { ISeqOutStream funcTable; Byte *data; SizeT rem; Bool overflow; } CSeqOutStreamBuf; static size_t MyWrite(void *pp, const void *data, size_t size) { CSeqOutStreamBuf *p = (CSeqOutStreamBuf *)pp; if (p->rem < size) { size = p->rem; p->overflow = True; } memcpy(p->data, data, size); p->rem -= size; p->data += size; return size; } SRes LzmaEnc_Encode(CLzmaEncHandle pp, ISeqOutStream *outStream, ISeqInStream *inStream, ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig) { CLzmaEnc *p = (CLzmaEnc *)pp; SRes res = SZ_OK; #ifdef COMPRESS_MF_MT Byte allocaDummy[0x300]; int i = 0; for (i = 0; i < 16; i++) allocaDummy[i] = (Byte)i; #endif RINOK(LzmaEnc_Prepare(pp, inStream, outStream, alloc, allocBig)); for (;;) { res = LzmaEnc_CodeOneBlock(pp, False, 0, 0); if (res != SZ_OK || p->finished != 0) break; if (progress != 0) { res = progress->Progress(progress, p->nowPos64, RangeEnc_GetProcessed(&p->rc)); if (res != SZ_OK) { res = SZ_ERROR_PROGRESS; break; } } } LzmaEnc_Finish(pp); return res; } SRes LzmaEnc_WriteProperties(CLzmaEncHandle pp, Byte *props, SizeT *size) { CLzmaEnc *p = (CLzmaEnc *)pp; int i; UInt32 dictSize = p->dictSize; if (*size < LZMA_PROPS_SIZE) return SZ_ERROR_PARAM; *size = LZMA_PROPS_SIZE; props[0] = (Byte)((p->pb * 5 + p->lp) * 9 + p->lc); for (i = 11; i <= 30; i++) { if (dictSize <= ((UInt32)2 << i)) { dictSize = (2 << i); break; } if (dictSize <= ((UInt32)3 << i)) { dictSize = (3 << i); break; } } for (i = 0; i < 4; i++) props[1 + i] = (Byte)(dictSize >> (8 * i)); return SZ_OK; } SRes LzmaEnc_MemEncode(CLzmaEncHandle pp, Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen, int writeEndMark, ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig) { SRes res; CLzmaEnc *p = (CLzmaEnc *)pp; CSeqOutStreamBuf outStream; LzmaEnc_SetInputBuf(p, src, srcLen); outStream.funcTable.Write = MyWrite; outStream.data = dest; outStream.rem = *destLen; outStream.overflow = False; p->writeEndMark = writeEndMark; res = LzmaEnc_Encode(pp, &outStream.funcTable, &p->seqBufInStream.funcTable, progress, alloc, allocBig); *destLen -= outStream.rem; if (outStream.overflow) return SZ_ERROR_OUTPUT_EOF; return res; } SRes LzmaEncode(Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen, const CLzmaEncProps *props, Byte *propsEncoded, SizeT *propsSize, int writeEndMark, ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig) { CLzmaEnc *p = (CLzmaEnc *)LzmaEnc_Create(alloc); SRes res; if (p == 0) return SZ_ERROR_MEM; res = LzmaEnc_SetProps(p, props); if (res == SZ_OK) { res = LzmaEnc_WriteProperties(p, propsEncoded, propsSize); if (res == SZ_OK) res = LzmaEnc_MemEncode(p, dest, destLen, src, srcLen, writeEndMark, progress, alloc, allocBig); } LzmaEnc_Destroy(p, alloc, allocBig); return res; } grub-2.14~git20250718.0e36779/grub-core/lib/dummy/0000755000175000017500000000000015036452576015661 500000000000000grub-2.14~git20250718.0e36779/grub-core/lib/dummy/datetime.c0000644000175000017500000000243015002425525017523 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (C) 2013 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); /* No simple platform-independent RTC access exists in U-Boot. */ grub_err_t grub_get_datetime (struct grub_datetime *datetime __attribute__ ((unused))) { return grub_error (GRUB_ERR_INVALID_COMMAND, "can\'t get datetime on this machine"); } grub_err_t grub_set_datetime (struct grub_datetime * datetime __attribute__ ((unused))) { return grub_error (GRUB_ERR_INVALID_COMMAND, "can\'t set datetime on this machine"); } grub-2.14~git20250718.0e36779/grub-core/lib/dummy/halt.c0000644000175000017500000000166115002425525016664 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (C) 2013 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include void grub_halt (void) { grub_machine_fini (GRUB_LOADER_FLAG_NORETURN); /* Just stop here */ while (1); } grub-2.14~git20250718.0e36779/grub-core/lib/dummy/reboot.c0000644000175000017500000000166315002425525017230 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (C) 2013 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include void grub_reboot (void) { grub_machine_fini (GRUB_LOADER_FLAG_NORETURN); /* Just stop here */ while (1); } grub-2.14~git20250718.0e36779/grub-core/lib/setjmp.S0000644000175000017500000000142215033157230016055 00000000000000/* An executable stack is not required for these functions. */ #if defined (__linux__) && defined (__ELF__) .section .note.GNU-stack,"",%progbits #endif #if defined(__i386__) #include "./i386/setjmp.S" #elif defined(__x86_64__) #include "./x86_64/setjmp.S" #elif defined(__sparc__) #include "./sparc64/setjmp.S" #elif defined(__mips__) #include "./mips/setjmp.S" #elif defined(__powerpc__) || defined(__PPC__) #include "./powerpc/setjmp.S" #elif defined(__ia64__) #include "./ia64/setjmp.S" #include "./ia64/longjmp.S" #elif defined(__arm__) #include "./arm/setjmp.S" #elif defined(__aarch64__) #include "./arm64/setjmp.S" #elif defined(__loongarch_lp64) #include "./loongarch64/setjmp.S" #elif defined(__riscv) #include "./riscv/setjmp.S" #else #error "Unknown target cpu type" #endif grub-2.14~git20250718.0e36779/grub-core/lib/sparc64/0000755000175000017500000000000015036452575016007 500000000000000grub-2.14~git20250718.0e36779/grub-core/lib/sparc64/setjmp.S0000644000175000017500000000242715000202015017327 00000000000000/* * GRUB -- GRand Unified Bootloader * Copyright (C) 2005,2007,2009 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include .file "setjmp.S" GRUB_MOD_LICENSE "GPLv3+" .text /* * int grub_setjmp (grub_jmp_buf env) */ FUNCTION(grub_setjmp) stx %o7, [%o0 + 0x00] stx %sp, [%o0 + 0x08] stx %fp, [%o0 + 0x10] retl clr %o0 /* * int grub_longjmp (grub_jmp_buf env, int val) */ FUNCTION(grub_longjmp) ldx [%o0 + 0x10], %g1 movrz %o1, 1, %o1 save %sp, -64, %sp flushw restore ldx [%o0 + 0x00], %o7 ldx [%o0 + 0x08], %fp sub %fp, 192, %sp stx %g1, [%sp + 2047 + (14 * 8)] retl restore %o1, 0, %o0 grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/0000755000175000017500000000000015036452572017456 500000000000000grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/mpi/0000755000175000017500000000000015036452575020246 500000000000000grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/mpi/mpicoder.c0000644000175000017500000006601615036452441022135 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ /* mpicoder.c - Coder for the external representation of MPIs * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 * 2008 Free Software Foundation, Inc. * Copyright (C) 2013, 2014 g10 Code GmbH * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . */ #include #include #include #include #include "mpi-internal.h" #include "g10lib.h" #include "../cipher/bufhelp.h" /* The maximum length we support in the functions converting an * external representation to an MPI. This limit is used to catch * programming errors and to avoid DoS due to insane long allocations. * The 16 MiB limit is actually ridiculous large but some of those PQC * algorithms use quite large keys and they might end up using MPIs * for that. */ #define MAX_EXTERN_SCAN_BYTES (16*1024*1024) /* The maximum length (in bits) we support for OpenPGP MPIs. Note * that OpenPGP's MPI format uses only two bytes and thus would be * limited to 64k anyway. Note that this limit matches that used by * GnuPG. */ #define MAX_EXTERN_MPI_BITS 16384 /* Helper used to scan PGP style MPIs. Returns NULL on failure. */ static gcry_mpi_t mpi_read_from_buffer (const unsigned char *buffer, unsigned *ret_nread, int secure) { int i, j; unsigned int nbits, nbytes, nlimbs, nread=0; mpi_limb_t a; gcry_mpi_t val = MPI_NULL; unsigned int max_nread = *ret_nread; if ( max_nread < 2 ) goto leave; nbits = buffer[0] << 8 | buffer[1]; if ( nbits > MAX_EXTERN_MPI_BITS ) { /* log_debug ("mpi too large (%u bits)\n", nbits); */ goto leave; } buffer += 2; nread = 2; nbytes = (nbits+7) / 8; nlimbs = (nbytes+BYTES_PER_MPI_LIMB-1) / BYTES_PER_MPI_LIMB; val = secure? mpi_alloc_secure (nlimbs) : mpi_alloc (nlimbs); i = BYTES_PER_MPI_LIMB - nbytes % BYTES_PER_MPI_LIMB; i %= BYTES_PER_MPI_LIMB; j= val->nlimbs = nlimbs; val->sign = 0; for ( ; j > 0; j-- ) { a = 0; if (i == 0 && nread + BYTES_PER_MPI_LIMB <= max_nread) { #if BYTES_PER_MPI_LIMB == 4 a = buf_get_be32 (buffer); #elif BYTES_PER_MPI_LIMB == 8 a = buf_get_be64 (buffer); #else # error please implement for this limb size. #endif buffer += BYTES_PER_MPI_LIMB; nread += BYTES_PER_MPI_LIMB; i += BYTES_PER_MPI_LIMB; } for (; i < BYTES_PER_MPI_LIMB; i++ ) { if ( ++nread > max_nread ) { /* log_debug ("mpi larger than buffer"); */ mpi_free (val); val = NULL; goto leave; } a <<= 8; a |= *buffer++; } i = 0; val->d[j-1] = a; } leave: *ret_nread = nread; return val; } /**************** * Fill the mpi VAL from the hex string in STR. */ static int mpi_fromstr (gcry_mpi_t val, const char *str, size_t slen) { static const int hex2int[2][256] = { { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80, 0x90, -1, -1, -1, -1, -1, -1, -1, 0xa0, 0xb0, 0xc0, 0xd0, 0xe0, 0xf0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0xa0, 0xb0, 0xc0, 0xd0, 0xe0, 0xf0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, -1, -1, -1, -1, -1, -1, -1, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 } }; int sign = 0; int prepend_zero = 0; int i, j, c, c1, c2; unsigned int nbits, nbytes, nlimbs; mpi_limb_t a; if ( *str == '-' ) { sign = 1; str++; slen--; } /* Skip optional hex prefix. */ if ( *str == '0' && str[1] == 'x' ) { str += 2; slen -= 2; } nbits = slen * 4; if ((nbits % 8)) prepend_zero = 1; nbytes = (nbits+7) / 8; nlimbs = (nbytes+BYTES_PER_MPI_LIMB-1) / BYTES_PER_MPI_LIMB; if ( val->alloced < nlimbs ) mpi_resize (val, nlimbs); i = BYTES_PER_MPI_LIMB - (nbytes % BYTES_PER_MPI_LIMB); i %= BYTES_PER_MPI_LIMB; j = val->nlimbs = nlimbs; val->sign = sign; for (; j > 0; j--) { a = 0; if (prepend_zero == 0 && (i & 31) == 0) { while (slen >= sizeof(u32) * 2) { u32 n, m; u32 x, y; x = buf_get_le32(str); y = buf_get_le32(str + 4); str += 8; slen -= 8; a <<= 31; /* Two step to avoid compiler warning on 32-bit. */ a <<= 1; n = (hex2int[0][(x >> 0) & 0xff] | hex2int[1][(x >> 8) & 0xff]) << 8; m = (hex2int[0][(y >> 0) & 0xff] | hex2int[1][(y >> 8) & 0xff]) << 8; n |= hex2int[0][(x >> 16) & 0xff]; n |= hex2int[1][(x >> 24) & 0xff]; m |= hex2int[0][(y >> 16) & 0xff]; m |= hex2int[1][(y >> 24) & 0xff]; a |= (n << 16) | m; i += 32; if ((int)(n | m) < 0) { /* Invalid character. */ mpi_clear (val); return 1; /* Error. */ } if (i == BITS_PER_MPI_LIMB) break; } } for (; i < BYTES_PER_MPI_LIMB; i++) { if (prepend_zero) { c1 = '0'; prepend_zero = 0; } else { c1 = *str++; slen--; } if (!c1) { mpi_clear (val); return 1; /* Error. */ } c2 = *str++; slen--; if (!c2) { mpi_clear (val); return 1; /* Error. */ } c = hex2int[0][c1 & 0xff]; c |= hex2int[1][c2 & 0xff]; if (c < 0) { mpi_clear(val); return 1; /* Error. */ } a <<= 8; a |= c; } i = 0; val->d[j-1] = a; } return 0; /* Okay. */ } /* Return an allocated buffer with the MPI (msb first). NBYTES receives the length of this buffer. If FILL_LE is not 0, the returned value is stored as little endian and right padded with zeroes so that the returned buffer has at least FILL_LE bytes. If EXTRAALLOC > 0 the returned buffer has these number of bytes extra allocated at the end; if EXTRAALLOC < 0 the returned buffer has the absolute value of EXTRAALLOC allocated at the begin of the buffer (the are not initialized) and the MPI is stored right after this. This feature is useful to allow the caller to prefix the returned value. EXTRAALLOC is _not_ included in the value stored at NBYTES. Caller must free the return string. This function returns an allocated buffer with NBYTES set to zero if the value of A is zero. If sign is not NULL, it will be set to the sign of the A. On error NULL is returned and ERRNO set appropriately. */ static unsigned char * do_get_buffer (gcry_mpi_t a, unsigned int fill_le, int extraalloc, unsigned int *nbytes, int *sign, int force_secure) { unsigned char *p, *buffer, *retbuffer; unsigned int length, tmp; mpi_limb_t alimb; int i; size_t n, n2; if (sign) *sign = a->sign; *nbytes = a->nlimbs * BYTES_PER_MPI_LIMB; n = *nbytes? *nbytes:1; /* Allocate at least one byte. */ if (n < fill_le) n = fill_le; if (extraalloc < 0) n2 = n + -extraalloc; else n2 = n + extraalloc; retbuffer = (force_secure || mpi_is_secure(a))? xtrymalloc_secure (n2) : xtrymalloc (n2); if (!retbuffer) return NULL; if (extraalloc < 0) buffer = retbuffer + -extraalloc; else buffer = retbuffer; p = buffer; for (i=a->nlimbs-1; i >= 0; i--) { alimb = a->d[i]; #if BYTES_PER_MPI_LIMB == 4 buf_put_be32 (p, alimb); p += 4; #elif BYTES_PER_MPI_LIMB == 8 buf_put_be64 (p, alimb); p += 8; #else # error please implement for this limb size. #endif } if (fill_le) { length = *nbytes; /* Reverse buffer and pad with zeroes. */ for (i = 0; i + 8 < length / 2; i += 8) { u64 head = buf_get_be64 (buffer + i); u64 tail = buf_get_be64 (buffer + length - 8 - i); buf_put_le64 (buffer + length - 8 - i, head); buf_put_le64 (buffer + i, tail); } if (i + 4 < length / 2) { u32 head = buf_get_be32 (buffer + i); u32 tail = buf_get_be32 (buffer + length - 4 - i); buf_put_le32 (buffer + length - 4 - i, head); buf_put_le32 (buffer + i, tail); i += 4; } for (; i < length/2; i++) { tmp = buffer[i]; buffer[i] = buffer[length-1-i]; buffer[length-1-i] = tmp; } /* Pad with zeroes. */ for (p = buffer + length; length < fill_le; length++) *p++ = 0; *nbytes = length; return retbuffer; } /* This is sub-optimal but we need to do the shift operation because the caller has to free the returned buffer. */ for (p=buffer; *nbytes && !*p; p++, --*nbytes) ; if (p != buffer) memmove (buffer, p, *nbytes); return retbuffer; } byte * _gcry_mpi_get_buffer (gcry_mpi_t a, unsigned int fill_le, unsigned int *r_nbytes, int *sign) { if (mpi_get_flag (a, GCRYMPI_FLAG_OPAQUE)) { unsigned int nbits; byte *p = _gcry_mpi_get_opaque_copy (a, &nbits); if (r_nbytes) *r_nbytes = (nbits+7)/8; return p; } else return do_get_buffer (a, fill_le, 0, r_nbytes, sign, 0); } byte * _gcry_mpi_get_buffer_extra (gcry_mpi_t a, unsigned int fill_le, int extraalloc, unsigned int *r_nbytes, int *sign) { return do_get_buffer (a, fill_le, extraalloc, r_nbytes, sign, 0); } byte * _gcry_mpi_get_secure_buffer (gcry_mpi_t a, unsigned int fill_le, unsigned int *r_nbytes, int *sign) { return do_get_buffer (a, fill_le, 0, r_nbytes, sign, 1); } /* * Use the NBYTES at BUFFER_ARG to update A. Set the sign of a to * SIGN. */ void _gcry_mpi_set_buffer (gcry_mpi_t a, const void *buffer_arg, unsigned int nbytes, int sign) { const unsigned char *buffer = (const unsigned char*)buffer_arg; const unsigned char *p; mpi_limb_t alimb; int nlimbs; int i; if (mpi_is_immutable (a)) { mpi_immutable_failed (); return; } nlimbs = (nbytes + BYTES_PER_MPI_LIMB - 1) / BYTES_PER_MPI_LIMB; RESIZE_IF_NEEDED(a, nlimbs); a->sign = sign; for (i=0, p = buffer+nbytes-1; p >= buffer+BYTES_PER_MPI_LIMB; ) { #if BYTES_PER_MPI_LIMB == 4 alimb = buf_get_be32(p - 4 + 1); p -= 4; #elif BYTES_PER_MPI_LIMB == 8 alimb = buf_get_be64(p - 8 + 1); p -= 8; #else # error please implement for this limb size. #endif a->d[i++] = alimb; } if ( p >= buffer ) { byte last[BYTES_PER_MPI_LIMB] = { 0 }; unsigned int n = (p - buffer) + 1; n = n > BYTES_PER_MPI_LIMB ? BYTES_PER_MPI_LIMB : n; memcpy (last + BYTES_PER_MPI_LIMB - n, p - n + 1, n); p -= n; #if BYTES_PER_MPI_LIMB == 4 alimb = buf_get_be32(last); #elif BYTES_PER_MPI_LIMB == 8 alimb = buf_get_be64(last); #else # error please implement for this limb size. #endif a->d[i++] = alimb; } a->nlimbs = i; gcry_assert (i == nlimbs); } static void onecompl (gcry_mpi_t a) { mpi_ptr_t ap; mpi_size_t n; unsigned int i; unsigned int nbits; if (!a || mpi_is_immutable (a)) { mpi_immutable_failed (); return; } nbits = mpi_get_nbits (a); mpi_normalize (a); ap = a->d; n = a->nlimbs; for( i = 0; i < n; i++ ) ap[i] ^= (mpi_limb_t)(-1); a->sign = 0; mpi_clear_highbit (a, nbits-1); } /* Perform a two's complement operation on buffer P of size N bytes. */ static void twocompl (unsigned char *p, unsigned int n) { int i; for (i=n-1; i >= 0 && !p[i]; i--) ; if (i >= 0) { unsigned char pi = p[i]; unsigned int ntz = _gcry_ctz (pi); p[i] = ((p[i] ^ (0xfe << ntz)) | (0x01 << ntz)) & (0xff << ntz); for (i--; i >= 7; i -= 8) { buf_put_he64(&p[i-7], ~buf_get_he64(&p[i-7])); } if (i >= 3) { buf_put_he32(&p[i-3], ~buf_get_he32(&p[i-3])); i -= 4; } for (; i >= 0; i--) { p[i] ^= 0xff; } } } /* Convert the external representation of an integer stored in BUFFER * with a length of BUFLEN into a newly create MPI returned in * RET_MPI. If NSCANNED is not NULL, it will receive the number of * bytes actually scanned after a successful operation. */ gcry_err_code_t _gcry_mpi_scan (struct gcry_mpi **ret_mpi, enum gcry_mpi_format format, const void *buffer_arg, size_t buflen, size_t *nscanned) { const unsigned char *buffer = (const unsigned char*)buffer_arg; struct gcry_mpi *a = NULL; unsigned int len; int secure = (buffer && _gcry_is_secure (buffer)); if (buflen > MAX_EXTERN_SCAN_BYTES) { if (nscanned) *nscanned = 0; return GPG_ERR_INV_OBJ; } if (format == GCRYMPI_FMT_SSH) len = 0; else len = buflen; if (format == GCRYMPI_FMT_STD) { const unsigned char *s = buffer; a = secure? mpi_alloc_secure ((len+BYTES_PER_MPI_LIMB-1) /BYTES_PER_MPI_LIMB) : mpi_alloc ((len+BYTES_PER_MPI_LIMB-1)/BYTES_PER_MPI_LIMB); if (len) { _gcry_mpi_set_buffer (a, s, len, 0); a->sign = !!(*s & 0x80); if (a->sign) { onecompl (a); mpi_add_ui (a, a, 1); a->sign = 1; } } if (ret_mpi) { mpi_normalize ( a ); *ret_mpi = a; } else mpi_free(a); if (nscanned) *nscanned = len; return 0; } else if (format == GCRYMPI_FMT_USG) { a = secure? mpi_alloc_secure ((len+BYTES_PER_MPI_LIMB-1) /BYTES_PER_MPI_LIMB) : mpi_alloc ((len+BYTES_PER_MPI_LIMB-1)/BYTES_PER_MPI_LIMB); if (len) _gcry_mpi_set_buffer (a, buffer, len, 0); if (ret_mpi) { mpi_normalize ( a ); *ret_mpi = a; } else mpi_free(a); if (nscanned) *nscanned = len; return 0; } else if (format == GCRYMPI_FMT_PGP) { a = mpi_read_from_buffer (buffer, &len, secure); if (nscanned) *nscanned = len; if (ret_mpi && a) { mpi_normalize (a); *ret_mpi = a; } else if (a) { mpi_free(a); a = NULL; } return a? 0 : GPG_ERR_INV_OBJ; } else if (format == GCRYMPI_FMT_SSH) { const unsigned char *s = buffer; size_t n; /* This test is not strictly necessary and an assert (!len) would be sufficient. We keep this test in case we later allow the BUFLEN argument to act as a sanitiy check. Same below. */ if (len && len < 4) return GPG_ERR_TOO_SHORT; n = buf_get_be32 (s); s += 4; if (len) len -= 4; if (len && n > len) return GPG_ERR_TOO_LARGE; a = secure? mpi_alloc_secure ((n+BYTES_PER_MPI_LIMB-1) /BYTES_PER_MPI_LIMB) : mpi_alloc ((n+BYTES_PER_MPI_LIMB-1)/BYTES_PER_MPI_LIMB); if (n) { _gcry_mpi_set_buffer( a, s, n, 0 ); a->sign = !!(*s & 0x80); if (a->sign) { onecompl (a); mpi_add_ui (a, a, 1); a->sign = 1; } } if (nscanned) *nscanned = n+4; if (ret_mpi) { mpi_normalize ( a ); *ret_mpi = a; } else mpi_free(a); return 0; } else if (format == GCRYMPI_FMT_HEX) { size_t slen; /* We can only handle C strings for now. */ if (buflen) return GPG_ERR_INV_ARG; slen = strlen ((const char *)buffer); if (slen > MAX_EXTERN_SCAN_BYTES) return GPG_ERR_INV_OBJ; a = secure? mpi_alloc_secure ((((slen+1)/2)+BYTES_PER_MPI_LIMB-1) /BYTES_PER_MPI_LIMB) : mpi_alloc((((slen+1)/2)+BYTES_PER_MPI_LIMB-1) /BYTES_PER_MPI_LIMB); if (mpi_fromstr (a, (const char *)buffer, slen)) { mpi_free (a); return GPG_ERR_INV_OBJ; } if (ret_mpi) { mpi_normalize ( a ); *ret_mpi = a; } else mpi_free(a); if (nscanned) *nscanned = strlen ((const char*)buffer); return 0; } else return GPG_ERR_INV_ARG; } /* Convert the big integer A into the external representation described by FORMAT and store it in the provided BUFFER which has been allocated by the user with a size of BUFLEN bytes. NWRITTEN receives the actual length of the external representation unless it has been passed as NULL. BUFFER may be NULL to query the required length. */ gcry_err_code_t _gcry_mpi_print (enum gcry_mpi_format format, unsigned char *buffer, size_t buflen, size_t *nwritten, struct gcry_mpi *a) { unsigned int nbits = mpi_get_nbits (a); size_t len; size_t dummy_nwritten; int negative; if (!nwritten) nwritten = &dummy_nwritten; /* Libgcrypt does no always care to set clear the sign if the value is 0. For printing this is a bit of a surprise, in particular because if some of the formats don't support negative numbers but should be able to print a zero. Thus we need this extra test for a negative number. */ if (a->sign && _gcry_mpi_cmp_ui (a, 0)) negative = 1; else negative = 0; len = buflen; *nwritten = 0; if (format == GCRYMPI_FMT_STD) { unsigned char *tmp; int extra = 0; unsigned int n; tmp = _gcry_mpi_get_buffer (a, 0, &n, NULL); if (!tmp) return gpg_err_code_from_syserror (); if (negative) { twocompl (tmp, n); if (!(*tmp & 0x80)) { /* Need to extend the sign. */ n++; extra = 2; } } else if (n && (*tmp & 0x80)) { /* Positive but the high bit of the returned buffer is set. Thus we need to print an extra leading 0x00 so that the output is interpreted as a positive number. */ n++; extra = 1; } if (buffer && n > len) { /* The provided buffer is too short. */ xfree (tmp); return GPG_ERR_TOO_SHORT; } if (buffer) { unsigned char *s = buffer; if (extra == 1) *s++ = 0; else if (extra) *s++ = 0xff; memcpy (s, tmp, n-!!extra); } xfree (tmp); *nwritten = n; return 0; } else if (format == GCRYMPI_FMT_USG) { unsigned int n = (nbits + 7)/8; /* Note: We ignore the sign for this format. */ /* FIXME: for performance reasons we should put this into mpi_aprint because we can then use the buffer directly. */ if (buffer && n > len) return GPG_ERR_TOO_SHORT; if (buffer) { unsigned char *tmp; tmp = _gcry_mpi_get_buffer (a, 0, &n, NULL); if (!tmp) return gpg_err_code_from_syserror (); memcpy (buffer, tmp, n); xfree (tmp); } *nwritten = n; return 0; } else if (format == GCRYMPI_FMT_PGP) { unsigned int n = (nbits + 7)/8; /* The PGP format can only handle unsigned integers. */ if (negative) return GPG_ERR_INV_ARG; if (buffer && n+2 > len) return GPG_ERR_TOO_SHORT; if (buffer) { unsigned char *tmp; unsigned char *s = buffer; s[0] = nbits >> 8; s[1] = nbits; tmp = _gcry_mpi_get_buffer (a, 0, &n, NULL); if (!tmp) return gpg_err_code_from_syserror (); memcpy (s+2, tmp, n); xfree (tmp); } *nwritten = n+2; return 0; } else if (format == GCRYMPI_FMT_SSH) { unsigned char *tmp; int extra = 0; unsigned int n; tmp = _gcry_mpi_get_buffer (a, 0, &n, NULL); if (!tmp) return gpg_err_code_from_syserror (); if (negative) { twocompl (tmp, n); if (!(*tmp & 0x80)) { /* Need to extend the sign. */ n++; extra = 2; } } else if (n && (*tmp & 0x80)) { n++; extra=1; } if (buffer && n+4 > len) { xfree(tmp); return GPG_ERR_TOO_SHORT; } if (buffer) { unsigned char *s = buffer; buf_put_be32 (s, n); s += 4; if (extra == 1) *s++ = 0; else if (extra) *s++ = 0xff; memcpy (s, tmp, n-!!extra); } xfree (tmp); *nwritten = 4+n; return 0; } else if (format == GCRYMPI_FMT_HEX) { unsigned char *tmp; int i; int extra = 0; unsigned int n = 0; tmp = _gcry_mpi_get_buffer (a, 0, &n, NULL); if (!tmp) return gpg_err_code_from_syserror (); if (!n || (*tmp & 0x80)) extra = 2; if (buffer && 2*n + extra + negative + 1 > len) { xfree(tmp); return GPG_ERR_TOO_SHORT; } if (buffer) { static const u32 nibble2hex[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; unsigned char *s = buffer; if (negative) *s++ = '-'; if (extra) { *s++ = '0'; *s++ = '0'; } for (i = 0; i + 4 < n; i += 4) { u32 c = buf_get_be32(tmp + i); u32 o1, o2; o1 = nibble2hex[(c >> 28) & 0xF]; o1 <<= 8; o1 |= nibble2hex[(c >> 24) & 0xF]; o1 <<= 8; o1 |= nibble2hex[(c >> 20) & 0xF]; o1 <<= 8; o1 |= nibble2hex[(c >> 16) & 0xF]; o2 = nibble2hex[(c >> 12) & 0xF]; o2 <<= 8; o2 |= (u64)nibble2hex[(c >> 8) & 0xF]; o2 <<= 8; o2 |= (u64)nibble2hex[(c >> 4) & 0xF]; o2 <<= 8; o2 |= (u64)nibble2hex[(c >> 0) & 0xF]; buf_put_be32 (s + 0, o1); buf_put_be32 (s + 4, o2); s += 8; } for (; i < n; i++) { unsigned int c = tmp[i]; *s++ = nibble2hex[c >> 4]; *s++ = nibble2hex[c & 0xF]; } *s++ = 0; *nwritten = s - buffer; } else { *nwritten = 2*n + extra + negative + 1; } xfree (tmp); return 0; } else return GPG_ERR_INV_ARG; } /* * Like gcry_mpi_print but this function allocates the buffer itself. * The caller has to supply the address of a pointer. NWRITTEN may be * NULL. */ gcry_err_code_t _gcry_mpi_aprint (enum gcry_mpi_format format, unsigned char **buffer, size_t *nwritten, struct gcry_mpi *a) { size_t n; gcry_err_code_t rc; *buffer = NULL; rc = _gcry_mpi_print (format, NULL, 0, &n, a); if (rc) return rc; *buffer = mpi_is_secure(a) ? xtrymalloc_secure (n?n:1) : xtrymalloc (n?n:1); if (!*buffer) return gpg_err_code_from_syserror (); /* If the returned buffer will have a length of 0, we nevertheless allocated 1 byte (malloc needs it anyway) and store a 0. */ if (!n) **buffer = 0; rc = _gcry_mpi_print( format, *buffer, n, &n, a ); if (rc) { xfree (*buffer); *buffer = NULL; } else if (nwritten) *nwritten = n; return rc; } /* Turn VALUE into an octet string and store it in an allocated buffer at R_FRAME or - if R_RAME is NULL - copy it into the caller provided buffer SPACE; either SPACE or R_FRAME may be used. If SPACE if not NULL, the caller must provide a buffer of at least NBYTES. If the resulting octet string is shorter than NBYTES pad it to the left with zeroes. If VALUE does not fit into NBYTES return an error code. */ gpg_err_code_t _gcry_mpi_to_octet_string (unsigned char **r_frame, void *space, gcry_mpi_t value, size_t nbytes) { gpg_err_code_t rc; size_t nframe, noff, n; unsigned char *frame; if (!r_frame == !space) return GPG_ERR_INV_ARG; /* Only one may be used. */ if (r_frame) *r_frame = NULL; rc = _gcry_mpi_print (GCRYMPI_FMT_USG, NULL, 0, &nframe, value); if (rc) return rc; if (nframe > nbytes) return GPG_ERR_TOO_LARGE; /* Value too long to fit into NBYTES. */ noff = (nframe < nbytes)? nbytes - nframe : 0; n = nframe + noff; if (space) frame = space; else { frame = mpi_is_secure (value)? xtrymalloc_secure (n) : xtrymalloc (n); if (!frame) { rc = gpg_err_code_from_syserror (); return rc; } } if (noff) memset (frame, 0, noff); nframe += noff; rc = _gcry_mpi_print (GCRYMPI_FMT_USG, frame+noff, nframe-noff, NULL, value); if (rc) { xfree (frame); return rc; } if (r_frame) *r_frame = frame; return 0; } grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/mpi/mpih-lshift.c0000644000175000017500000000415215036452441022550 00000000000000/* mpi-lshift.c - MPI helper functions * Copyright (C) 1994, 1996, 1998, 2001, 2002 Free Software Foundation, Inc. * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . * SPDX-License-Identifier: LGPL-2.1-or-later * * Note: This code is heavily based on the GNU MP Library. * Actually it's the same code with only minor changes in the * way the data is stored; this is to support the abstraction * of an optional secure memory allocation which may be used * to avoid revealing of sensitive data due to paging etc. */ #include #include #include #include "mpi-internal.h" /* Shift U (pointed to by UP and USIZE digits long) CNT bits to the left * and store the USIZE least significant digits of the result at WP. * Return the bits shifted out from the most significant digit. * * Argument constraints: * 1. 0 < CNT < BITS_PER_MP_LIMB * 2. If the result is to be written over the input, WP must be >= UP. */ mpi_limb_t _gcry_mpih_lshift( mpi_ptr_t wp, mpi_ptr_t up, mpi_size_t usize, unsigned int cnt) { mpi_limb_t high_limb, low_limb; unsigned sh_1, sh_2; mpi_size_t i; mpi_limb_t retval; sh_1 = cnt; wp += 1; sh_2 = BITS_PER_MPI_LIMB - sh_1; i = usize - 1; low_limb = up[i]; retval = low_limb >> sh_2; high_limb = low_limb; while ( --i >= 0 ) { low_limb = up[i]; wp[i] = (high_limb << sh_1) | (low_limb >> sh_2); high_limb = low_limb; } wp[i] = high_limb << sh_1; return retval; } grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/mpi/mpih-mul1.c0000644000175000017500000000367115036452441022142 00000000000000/* mpihelp-mul_1.c - MPI helper functions * Copyright (C) 1994, 1996, 1997, 1998, 2001, * 2002 Free Software Foundation, Inc. * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . * SPDX-License-Identifier: LGPL-2.1-or-later * * Note: This code is heavily based on the GNU MP Library. * Actually it's the same code with only minor changes in the * way the data is stored; this is to support the abstraction * of an optional secure memory allocation which may be used * to avoid revealing of sensitive data due to paging etc. */ #include #include #include #include "mpi-internal.h" #include "longlong.h" mpi_limb_t _gcry_mpih_mul_1( mpi_ptr_t res_ptr, mpi_ptr_t s1_ptr, mpi_size_t s1_size, mpi_limb_t s2_limb) { mpi_limb_t cy_limb; mpi_size_t j; mpi_limb_t prod_high, prod_low; /* The loop counter and index J goes from -S1_SIZE to -1. This way * the loop becomes faster. */ j = -s1_size; /* Offset the base pointers to compensate for the negative indices. */ s1_ptr -= j; res_ptr -= j; cy_limb = 0; do { umul_ppmm( prod_high, prod_low, s1_ptr[j], s2_limb ); prod_low += cy_limb; cy_limb = (prod_low < cy_limb?1:0) + prod_high; res_ptr[j] = prod_low; } while( ++j ); return cy_limb; } grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/mpi/mpi-div.c0000644000175000017500000002274315036452441021677 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ /* mpi-div.c - MPI functions * Copyright (C) 1994, 1996, 1998, 2001, 2002, * 2003 Free Software Foundation, Inc. * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . * SPDX-License-Identifier: LGPL-2.1-or-later * * Note: This code is heavily based on the GNU MP Library. * Actually it's the same code with only minor changes in the * way the data is stored; this is to support the abstraction * of an optional secure memory allocation which may be used * to avoid revealing of sensitive data due to paging etc. */ #include #include #include #include "mpi-internal.h" #include "longlong.h" #include "g10lib.h" void _gcry_mpi_fdiv_r( gcry_mpi_t rem, gcry_mpi_t dividend, gcry_mpi_t divisor ) { int divisor_sign = divisor->sign; gcry_mpi_t temp_divisor = NULL; /* We need the original value of the divisor after the remainder has been * preliminary calculated. We have to copy it to temporary space if it's * the same variable as REM. */ if( rem == divisor ) { temp_divisor = mpi_copy( divisor ); divisor = temp_divisor; } _gcry_mpi_tdiv_r( rem, dividend, divisor ); if( ((divisor_sign?1:0) ^ (dividend->sign?1:0)) && rem->nlimbs ) mpi_add (rem, rem, divisor); if( temp_divisor ) mpi_free(temp_divisor); } /**************** * Division rounding the quotient towards -infinity. * The remainder gets the same sign as the denominator. * rem is optional */ unsigned long _gcry_mpi_fdiv_r_ui( gcry_mpi_t rem, gcry_mpi_t dividend, unsigned long divisor ) { mpi_limb_t rlimb; rlimb = _gcry_mpih_mod_1( dividend->d, dividend->nlimbs, divisor ); if( rlimb && dividend->sign ) rlimb = divisor - rlimb; if( rem ) { rem->d[0] = rlimb; rem->nlimbs = rlimb? 1:0; } return rlimb; } void _gcry_mpi_fdiv_q( gcry_mpi_t quot, gcry_mpi_t dividend, gcry_mpi_t divisor ) { gcry_mpi_t tmp = mpi_alloc( mpi_get_nlimbs(quot) ); _gcry_mpi_fdiv_qr( quot, tmp, dividend, divisor); mpi_free(tmp); } void _gcry_mpi_fdiv_qr( gcry_mpi_t quot, gcry_mpi_t rem, gcry_mpi_t dividend, gcry_mpi_t divisor ) { int divisor_sign = divisor->sign; gcry_mpi_t temp_divisor = NULL; if( quot == divisor || rem == divisor ) { temp_divisor = mpi_copy( divisor ); divisor = temp_divisor; } _gcry_mpi_tdiv_qr( quot, rem, dividend, divisor ); if( (divisor_sign ^ dividend->sign) && rem->nlimbs ) { mpi_sub_ui( quot, quot, 1 ); mpi_add( rem, rem, divisor); } if( temp_divisor ) mpi_free(temp_divisor); } /* If den == quot, den needs temporary storage. * If den == rem, den needs temporary storage. * If num == quot, num needs temporary storage. * If den has temporary storage, it can be normalized while being copied, * i.e no extra storage should be allocated. */ void _gcry_mpi_tdiv_r( gcry_mpi_t rem, gcry_mpi_t num, gcry_mpi_t den) { _gcry_mpi_tdiv_qr(NULL, rem, num, den ); } void _gcry_mpi_tdiv_qr( gcry_mpi_t quot, gcry_mpi_t rem, gcry_mpi_t num, gcry_mpi_t den) { mpi_ptr_t np, dp; mpi_ptr_t qp, rp; mpi_size_t nsize = num->nlimbs; mpi_size_t dsize = den->nlimbs; mpi_size_t qsize, rsize; mpi_size_t sign_remainder = num->sign; mpi_size_t sign_quotient = num->sign ^ den->sign; unsigned normalization_steps; mpi_limb_t q_limb; mpi_ptr_t marker[5]; unsigned int marker_nlimbs[5]; int markidx=0; /* Ensure space is enough for quotient and remainder. * We need space for an extra limb in the remainder, because it's * up-shifted (normalized) below. */ rsize = nsize + 1; mpi_resize( rem, rsize); qsize = rsize - dsize; /* qsize cannot be bigger than this. */ if( qsize <= 0 ) { if( num != rem ) { rem->nlimbs = num->nlimbs; rem->sign = num->sign; MPN_COPY(rem->d, num->d, nsize); } if( quot ) { /* This needs to follow the assignment to rem, in case the * numerator and quotient are the same. */ quot->nlimbs = 0; quot->sign = 0; } return; } if( quot ) mpi_resize( quot, qsize); if (!dsize) _gcry_divide_by_zero(); /* Read pointers here, when reallocation is finished. */ np = num->d; dp = den->d; rp = rem->d; /* Optimize division by a single-limb divisor. */ if( dsize == 1 ) { mpi_limb_t rlimb; if( quot ) { qp = quot->d; rlimb = _gcry_mpih_divmod_1( qp, np, nsize, dp[0] ); qsize -= qp[qsize - 1] == 0; quot->nlimbs = qsize; quot->sign = sign_quotient; } else rlimb = _gcry_mpih_mod_1( np, nsize, dp[0] ); rp[0] = rlimb; rsize = rlimb != 0?1:0; rem->nlimbs = rsize; rem->sign = sign_remainder; return; } if( quot ) { qp = quot->d; /* Make sure QP and NP point to different objects. Otherwise the * numerator would be gradually overwritten by the quotient limbs. */ if(qp == np) { /* Copy NP object to temporary space. */ marker_nlimbs[markidx] = nsize; np = marker[markidx++] = mpi_alloc_limb_space(nsize, mpi_is_secure(quot)); MPN_COPY(np, qp, nsize); } } else /* Put quotient at top of remainder. */ qp = rp + dsize; count_leading_zeros( normalization_steps, dp[dsize - 1] ); /* Normalize the denominator, i.e. make its most significant bit set by * shifting it NORMALIZATION_STEPS bits to the left. Also shift the * numerator the same number of steps (to keep the quotient the same!). */ if( normalization_steps ) { mpi_ptr_t tp; mpi_limb_t nlimb; /* Shift up the denominator setting the most significant bit of * the most significant word. Use temporary storage not to clobber * the original contents of the denominator. */ marker_nlimbs[markidx] = dsize; tp = marker[markidx++] = mpi_alloc_limb_space(dsize,mpi_is_secure(den)); _gcry_mpih_lshift( tp, dp, dsize, normalization_steps ); dp = tp; /* Shift up the numerator, possibly introducing a new most * significant word. Move the shifted numerator in the remainder * meanwhile. */ nlimb = _gcry_mpih_lshift(rp, np, nsize, normalization_steps); if( nlimb ) { rp[nsize] = nlimb; rsize = nsize + 1; } else rsize = nsize; } else { /* The denominator is already normalized, as required. Copy it to * temporary space if it overlaps with the quotient or remainder. */ if( dp == rp || (quot && (dp == qp))) { mpi_ptr_t tp; marker_nlimbs[markidx] = dsize; tp = marker[markidx++] = mpi_alloc_limb_space(dsize, mpi_is_secure(den)); MPN_COPY( tp, dp, dsize ); dp = tp; } /* Move the numerator to the remainder. */ if( rp != np ) MPN_COPY(rp, np, nsize); rsize = nsize; } q_limb = _gcry_mpih_divrem( qp, 0, rp, rsize, dp, dsize ); if( quot ) { qsize = rsize - dsize; if(q_limb) { qp[qsize] = q_limb; qsize += 1; } quot->nlimbs = qsize; quot->sign = sign_quotient; } rsize = dsize; MPN_NORMALIZE (rp, rsize); if( normalization_steps && rsize ) { _gcry_mpih_rshift(rp, rp, rsize, normalization_steps); rsize -= rp[rsize - 1] == 0?1:0; } rem->nlimbs = rsize; rem->sign = sign_remainder; while( markidx ) { markidx--; _gcry_mpi_free_limb_space (marker[markidx], marker_nlimbs[markidx]); } } void _gcry_mpi_tdiv_q_2exp( gcry_mpi_t w, gcry_mpi_t u, unsigned int count ) { mpi_size_t usize, wsize; mpi_size_t limb_cnt; usize = u->nlimbs; limb_cnt = count / BITS_PER_MPI_LIMB; wsize = usize - limb_cnt; if( limb_cnt >= usize ) w->nlimbs = 0; else { mpi_ptr_t wp; mpi_ptr_t up; RESIZE_IF_NEEDED( w, wsize ); wp = w->d; up = u->d; count %= BITS_PER_MPI_LIMB; if( count ) { _gcry_mpih_rshift( wp, up + limb_cnt, wsize, count ); wsize -= !wp[wsize - 1]; } else { MPN_COPY_INCR( wp, up + limb_cnt, wsize); } w->nlimbs = wsize; } } /**************** * Check whether dividend is divisible by divisor * (note: divisor must fit into a limb) */ int _gcry_mpi_divisible_ui(gcry_mpi_t dividend, unsigned long divisor ) { return !_gcry_mpih_mod_1( dividend->d, dividend->nlimbs, divisor ); } void _gcry_mpi_div (gcry_mpi_t quot, gcry_mpi_t rem, gcry_mpi_t dividend, gcry_mpi_t divisor, int round) { if (!round) { if (!rem) { gcry_mpi_t tmp = mpi_alloc (mpi_get_nlimbs(quot)); _gcry_mpi_tdiv_qr (quot, tmp, dividend, divisor); mpi_free (tmp); } else _gcry_mpi_tdiv_qr (quot, rem, dividend, divisor); } else if (round < 0) { if (!rem) _gcry_mpi_fdiv_q (quot, dividend, divisor); else if (!quot) _gcry_mpi_fdiv_r (rem, dividend, divisor); else _gcry_mpi_fdiv_qr (quot, rem, dividend, divisor); } else log_bug ("mpi rounding to ceiling not yet implemented\n"); } grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/mpi/mpi-gcd.c0000644000175000017500000000307715036452441021651 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ /* mpi-gcd.c - MPI functions * Copyright (C) 1998, 2001, 2002, 2003 Free Software Foundation, Inc. * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . * SPDX-License-Identifier: LGPL-2.1-or-later */ #include #include #include #include "mpi-internal.h" /**************** * Find the greatest common divisor G of A and B. * Return: true if this 1, false in all other cases */ int _gcry_mpi_gcd (gcry_mpi_t g, gcry_mpi_t xa, gcry_mpi_t xb) { gcry_mpi_t a, b; a = mpi_copy(xa); b = mpi_copy(xb); /* TAOCP Vol II, 4.5.2, Algorithm A */ a->sign = 0; b->sign = 0; while (mpi_cmp_ui (b, 0)) { _gcry_mpi_fdiv_r( g, a, b ); /* G is used as temporary variable. */ mpi_set(a,b); mpi_set(b,g); } mpi_set(g, a); mpi_free(a); mpi_free(b); return !mpi_cmp_ui( g, 1); } grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/mpi/mpi-add.c0000644000175000017500000001404415036452441021640 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ /* mpi-add.c - MPI functions * Copyright (C) 1994, 1996, 1998, 2001, 2002, 2003 Free Software Foundation, Inc. * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . * SPDX-License-Identifier: LGPL-2.1-or-later * * Note: This code is heavily based on the GNU MP Library. * Actually it's the same code with only minor changes in the * way the data is stored; this is to support the abstraction * of an optional secure memory allocation which may be used * to avoid revealing of sensitive data due to paging etc. */ #include #include #include #include "mpi-internal.h" /**************** * Add the unsigned integer V to the mpi-integer U and store the * result in W. U and V may be the same. */ void _gcry_mpi_add_ui (gcry_mpi_t w, gcry_mpi_t u, unsigned long v ) { mpi_ptr_t wp, up; mpi_size_t usize, wsize; int usign, wsign; usize = u->nlimbs; usign = u->sign; wsign = 0; /* If not space for W (and possible carry), increase space. */ wsize = usize + 1; if( w->alloced < wsize ) mpi_resize(w, wsize); /* These must be after realloc (U may be the same as W). */ up = u->d; wp = w->d; if( !usize ) { /* simple */ wp[0] = v; wsize = v? 1:0; } else if( !usign ) { /* mpi is not negative */ mpi_limb_t cy; cy = _gcry_mpih_add_1(wp, up, usize, v); wp[usize] = cy; wsize = usize + cy; } else { /* The signs are different. Need exact comparison to determine * which operand to subtract from which. */ if( usize == 1 && up[0] < v ) { wp[0] = v - up[0]; wsize = 1; } else { _gcry_mpih_sub_1(wp, up, usize, v); /* Size can decrease with at most one limb. */ wsize = usize - (wp[usize-1]==0); wsign = 1; } } w->nlimbs = wsize; w->sign = wsign; } static void _gcry_mpi_add_inv_sign(gcry_mpi_t w, gcry_mpi_t u, gcry_mpi_t v, int inv_v_sign) { mpi_ptr_t wp, up, vp; mpi_size_t usize, vsize, wsize; int usign, vsign, wsign; if( u->nlimbs < v->nlimbs ) { /* Swap U and V. */ usize = v->nlimbs; usign = v->sign ^ inv_v_sign; vsize = u->nlimbs; vsign = u->sign; wsize = usize + 1; RESIZE_IF_NEEDED(w, wsize); /* These must be after realloc (u or v may be the same as w). */ up = v->d; vp = u->d; } else { usize = u->nlimbs; usign = u->sign; vsize = v->nlimbs; vsign = v->sign ^ inv_v_sign; wsize = usize + 1; RESIZE_IF_NEEDED(w, wsize); /* These must be after realloc (u or v may be the same as w). */ up = u->d; vp = v->d; } wp = w->d; wsign = 0; if( !vsize ) { /* simple */ MPN_COPY(wp, up, usize ); wsize = usize; wsign = usign; } else if( usign != vsign ) { /* different sign */ /* This test is right since USIZE >= VSIZE */ if( usize != vsize ) { _gcry_mpih_sub(wp, up, usize, vp, vsize); wsize = usize; MPN_NORMALIZE(wp, wsize); wsign = usign; } else if( _gcry_mpih_cmp(up, vp, usize) < 0 ) { _gcry_mpih_sub_n(wp, vp, up, usize); wsize = usize; MPN_NORMALIZE(wp, wsize); if( !usign ) wsign = 1; } else { _gcry_mpih_sub_n(wp, up, vp, usize); wsize = usize; MPN_NORMALIZE(wp, wsize); if( usign ) wsign = 1; } } else { /* U and V have same sign. Add them. */ mpi_limb_t cy = _gcry_mpih_add(wp, up, usize, vp, vsize); wp[usize] = cy; wsize = usize + cy; if( usign ) wsign = 1; } w->nlimbs = wsize; w->sign = wsign; } /**************** * Subtract the unsigned integer V from the mpi-integer U and store the * result in W. */ void _gcry_mpi_sub_ui(gcry_mpi_t w, gcry_mpi_t u, unsigned long v ) { mpi_ptr_t wp, up; mpi_size_t usize, wsize; int usign, wsign; usize = u->nlimbs; usign = u->sign; wsign = 0; /* If not space for W (and possible carry), increase space. */ wsize = usize + 1; if( w->alloced < wsize ) mpi_resize(w, wsize); /* These must be after realloc (U may be the same as W). */ up = u->d; wp = w->d; if( !usize ) { /* simple */ wp[0] = v; wsize = v? 1:0; wsign = 1; } else if( usign ) { /* mpi and v are negative */ mpi_limb_t cy; cy = _gcry_mpih_add_1(wp, up, usize, v); wp[usize] = cy; wsize = usize + cy; wsign = 1; } else { /* The signs are different. Need exact comparison to determine * which operand to subtract from which. */ if( usize == 1 && up[0] < v ) { wp[0] = v - up[0]; wsize = 1; wsign = 1; } else { _gcry_mpih_sub_1(wp, up, usize, v); /* Size can decrease with at most one limb. */ wsize = usize - (wp[usize-1]==0); } } w->nlimbs = wsize; w->sign = wsign; } void _gcry_mpi_add(gcry_mpi_t w, gcry_mpi_t u, gcry_mpi_t v) { _gcry_mpi_add_inv_sign (w, u, v, 0); } void _gcry_mpi_sub(gcry_mpi_t w, gcry_mpi_t u, gcry_mpi_t v) { _gcry_mpi_add_inv_sign (w, u, v, 1); } void _gcry_mpi_addm( gcry_mpi_t w, gcry_mpi_t u, gcry_mpi_t v, gcry_mpi_t m) { gcry_mpi_t temp_m = NULL; if (w == m) { temp_m = mpi_copy (m); m = temp_m; } mpi_add (w, u, v); mpi_mod (w, w, m); if (temp_m) mpi_free(temp_m); } void _gcry_mpi_subm( gcry_mpi_t w, gcry_mpi_t u, gcry_mpi_t v, gcry_mpi_t m) { gcry_mpi_t temp_m = NULL; if (w == m) { temp_m = mpi_copy (m); m = temp_m; } mpi_sub (w, u, v); mpi_mod (w, w, m); if (temp_m) mpi_free(temp_m); } grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/mpi/mpi-internal.h0000644000175000017500000002566315036452441022742 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ /* mpi-internal.h - Internal to the Multi Precision Integers * Copyright (C) 1994, 1996, 1998, 2000, 2002, * 2003 Free Software Foundation, Inc. * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . * SPDX-License-Identifier: LGPL-2.1-or-later * * Note: This code is heavily based on the GNU MP Library. * Actually it's the same code with only minor changes in the * way the data is stored; this is to support the abstraction * of an optional secure memory allocation which may be used * to avoid revealing of sensitive data due to paging etc. */ #ifndef G10_MPI_INTERNAL_H #define G10_MPI_INTERNAL_H #include "mpi-asm-defs.h" #ifndef BITS_PER_MPI_LIMB #if BYTES_PER_MPI_LIMB == SIZEOF_UNSIGNED_INT typedef unsigned int mpi_limb_t; typedef signed int mpi_limb_signed_t; #elif BYTES_PER_MPI_LIMB == SIZEOF_UNSIGNED_LONG typedef unsigned long int mpi_limb_t; typedef signed long int mpi_limb_signed_t; #elif BYTES_PER_MPI_LIMB == SIZEOF_UNSIGNED_LONG_LONG typedef unsigned long long int mpi_limb_t; typedef signed long long int mpi_limb_signed_t; #elif BYTES_PER_MPI_LIMB == SIZEOF_UNSIGNED_SHORT typedef unsigned short int mpi_limb_t; typedef signed short int mpi_limb_signed_t; #else #error BYTES_PER_MPI_LIMB does not match any C type #endif #define BITS_PER_MPI_LIMB (8*BYTES_PER_MPI_LIMB) #endif /*BITS_PER_MPI_LIMB*/ #include "mpi.h" #include "const-time.h" /* If KARATSUBA_THRESHOLD is not already defined, define it to a * value which is good on most machines. */ /* tested 4, 16, 32 and 64, where 16 gave the best performance when * checking a 768 and a 1024 bit ElGamal signature. * (wk 22.12.97) */ #ifndef KARATSUBA_THRESHOLD #define KARATSUBA_THRESHOLD 16 #endif /* The code can't handle KARATSUBA_THRESHOLD smaller than 2. */ #if KARATSUBA_THRESHOLD < 2 #undef KARATSUBA_THRESHOLD #define KARATSUBA_THRESHOLD 2 #endif typedef mpi_limb_t *mpi_ptr_t; /* pointer to a limb */ typedef int mpi_size_t; /* (must be a signed type) */ #define ABS(x) (x >= 0 ? x : -x) #define MIN(l,o) ((l) < (o) ? (l) : (o)) #define MAX(h,i) ((h) > (i) ? (h) : (i)) #define RESIZE_IF_NEEDED(a,b) \ do { \ if( (a)->alloced < (b) ) \ mpi_resize((a), (b)); \ } while(0) #define RESIZE_AND_CLEAR_IF_NEEDED(a,b) \ do { \ if( (a)->nlimbs < (b) ) \ mpi_resize((a), (b)); \ } while(0) /* Copy N limbs from S to D. */ #define MPN_COPY( d, s, n) \ do { \ mpi_size_t _i; \ for( _i = 0; _i < (n); _i++ ) \ (d)[_i] = (s)[_i]; \ } while(0) #define MPN_COPY_INCR( d, s, n) \ do { \ mpi_size_t _i; \ for( _i = 0; _i < (n); _i++ ) \ (d)[_i] = (s)[_i]; \ } while (0) #define MPN_COPY_DECR( d, s, n ) \ do { \ mpi_size_t _i; \ for( _i = (n)-1; _i >= 0; _i--) \ (d)[_i] = (s)[_i]; \ } while(0) /* Zero N limbs at D */ #define MPN_ZERO(d, n) \ do { \ int _i; \ for( _i = 0; _i < (n); _i++ ) \ (d)[_i] = 0; \ } while (0) #define MPN_NORMALIZE(d, n) \ do { \ while( (n) > 0 ) { \ if( (d)[(n)-1] ) \ break; \ (n)--; \ } \ } while(0) #define MPN_NORMALIZE_NOT_ZERO(d, n) \ do { \ for(;;) { \ if( (d)[(n)-1] ) \ break; \ (n)--; \ } \ } while(0) #define MPN_MUL_N_RECURSE(prodp, up, vp, size, tspace) \ do { \ if( (size) < KARATSUBA_THRESHOLD ) \ mul_n_basecase (prodp, up, vp, size); \ else \ mul_n (prodp, up, vp, size, tspace); \ } while (0) /* Divide the two-limb number in (NH,,NL) by D, with DI being the largest * limb not larger than (2**(2*BITS_PER_MP_LIMB))/D - (2**BITS_PER_MP_LIMB). * If this would yield overflow, DI should be the largest possible number * (i.e., only ones). For correct operation, the most significant bit of D * has to be set. Put the quotient in Q and the remainder in R. */ #define UDIV_QRNND_PREINV(q, r, nh, nl, d, di) \ do { \ mpi_limb_t _ql GCC_ATTR_UNUSED; \ mpi_limb_t _q, _r; \ mpi_limb_t _xh, _xl; \ umul_ppmm (_q, _ql, (nh), (di)); \ _q += (nh); /* DI is 2**BITS_PER_MPI_LIMB too small */ \ umul_ppmm (_xh, _xl, _q, (d)); \ sub_ddmmss (_xh, _r, (nh), (nl), _xh, _xl); \ if( _xh ) { \ sub_ddmmss (_xh, _r, _xh, _r, 0, (d)); \ _q++; \ if( _xh) { \ sub_ddmmss (_xh, _r, _xh, _r, 0, (d)); \ _q++; \ } \ } \ if( _r >= (d) ) { \ _r -= (d); \ _q++; \ } \ (r) = _r; \ (q) = _q; \ } while (0) /*-- mpiutil.c --*/ #define mpi_alloc_limb_space(n,f) _gcry_mpi_alloc_limb_space((n),(f)) mpi_ptr_t _gcry_mpi_alloc_limb_space( unsigned nlimbs, int sec ); void _gcry_mpi_free_limb_space( mpi_ptr_t a, unsigned int nlimbs ); void _gcry_mpi_assign_limb_space( gcry_mpi_t a, mpi_ptr_t ap, unsigned nlimbs ); /*-- mpi-bit.c --*/ #define mpi_rshift_limbs(a,n) _gcry_mpi_rshift_limbs ((a), (n)) #define mpi_lshift_limbs(a,n) _gcry_mpi_lshift_limbs ((a), (n)) void _gcry_mpi_rshift_limbs( gcry_mpi_t a, unsigned int count ); void _gcry_mpi_lshift_limbs( gcry_mpi_t a, unsigned int count ); /*-- mpih-add.c --*/ mpi_limb_t _gcry_mpih_add_1(mpi_ptr_t res_ptr, mpi_ptr_t s1_ptr, mpi_size_t s1_size, mpi_limb_t s2_limb ); mpi_limb_t _gcry_mpih_add_n( mpi_ptr_t res_ptr, mpi_ptr_t s1_ptr, mpi_ptr_t s2_ptr, mpi_size_t size); mpi_limb_t _gcry_mpih_add(mpi_ptr_t res_ptr, mpi_ptr_t s1_ptr, mpi_size_t s1_size, mpi_ptr_t s2_ptr, mpi_size_t s2_size); /*-- mpih-sub.c --*/ mpi_limb_t _gcry_mpih_sub_1( mpi_ptr_t res_ptr, mpi_ptr_t s1_ptr, mpi_size_t s1_size, mpi_limb_t s2_limb ); mpi_limb_t _gcry_mpih_sub_n( mpi_ptr_t res_ptr, mpi_ptr_t s1_ptr, mpi_ptr_t s2_ptr, mpi_size_t size); mpi_limb_t _gcry_mpih_sub(mpi_ptr_t res_ptr, mpi_ptr_t s1_ptr, mpi_size_t s1_size, mpi_ptr_t s2_ptr, mpi_size_t s2_size); /*-- mpih-cmp.c --*/ int _gcry_mpih_cmp( mpi_ptr_t op1_ptr, mpi_ptr_t op2_ptr, mpi_size_t size ); /*-- mpih-mul.c --*/ struct karatsuba_ctx { struct karatsuba_ctx *next; mpi_ptr_t tspace; unsigned int tspace_nlimbs; mpi_size_t tspace_size; mpi_ptr_t tp; unsigned int tp_nlimbs; mpi_size_t tp_size; }; void _gcry_mpih_release_karatsuba_ctx( struct karatsuba_ctx *ctx ); mpi_limb_t _gcry_mpih_addmul_1( mpi_ptr_t res_ptr, mpi_ptr_t s1_ptr, mpi_size_t s1_size, mpi_limb_t s2_limb); mpi_limb_t _gcry_mpih_submul_1( mpi_ptr_t res_ptr, mpi_ptr_t s1_ptr, mpi_size_t s1_size, mpi_limb_t s2_limb); void _gcry_mpih_mul_n( mpi_ptr_t prodp, mpi_ptr_t up, mpi_ptr_t vp, mpi_size_t size); mpi_limb_t _gcry_mpih_mul( mpi_ptr_t prodp, mpi_ptr_t up, mpi_size_t usize, mpi_ptr_t vp, mpi_size_t vsize); void _gcry_mpih_sqr_n_basecase( mpi_ptr_t prodp, mpi_ptr_t up, mpi_size_t size ); void _gcry_mpih_sqr_n( mpi_ptr_t prodp, mpi_ptr_t up, mpi_size_t size, mpi_ptr_t tspace); void _gcry_mpih_mul_karatsuba_case( mpi_ptr_t prodp, mpi_ptr_t up, mpi_size_t usize, mpi_ptr_t vp, mpi_size_t vsize, struct karatsuba_ctx *ctx ); /*-- mpih-mul_1.c (or xxx/cpu/ *.S) --*/ mpi_limb_t _gcry_mpih_mul_1( mpi_ptr_t res_ptr, mpi_ptr_t s1_ptr, mpi_size_t s1_size, mpi_limb_t s2_limb); /*-- mpih-div.c --*/ mpi_limb_t _gcry_mpih_mod_1(mpi_ptr_t dividend_ptr, mpi_size_t dividend_size, mpi_limb_t divisor_limb); mpi_limb_t _gcry_mpih_divrem( mpi_ptr_t qp, mpi_size_t qextra_limbs, mpi_ptr_t np, mpi_size_t nsize, mpi_ptr_t dp, mpi_size_t dsize); mpi_limb_t _gcry_mpih_divmod_1( mpi_ptr_t quot_ptr, mpi_ptr_t dividend_ptr, mpi_size_t dividend_size, mpi_limb_t divisor_limb); /*-- mpih-shift.c --*/ mpi_limb_t _gcry_mpih_lshift( mpi_ptr_t wp, mpi_ptr_t up, mpi_size_t usize, unsigned cnt); mpi_limb_t _gcry_mpih_rshift( mpi_ptr_t wp, mpi_ptr_t up, mpi_size_t usize, unsigned cnt); /*-- mpih-const-time.c --*/ #define mpih_set_cond(w,u,s,o) _gcry_mpih_set_cond ((w),(u),(s),(o)) #define mpih_add_n_cond(w,u,v,s,o) _gcry_mpih_add_n_cond ((w),(u),(v),(s),(o)) #define mpih_sub_n_cond(w,u,v,s,o) _gcry_mpih_sub_n_cond ((w),(u),(v),(s),(o)) #define mpih_swap_cond(u,v,s,o) _gcry_mpih_swap_cond ((u),(v),(s),(o)) #define mpih_abs_cond(w,u,s,o) _gcry_mpih_abs_cond ((w),(u),(s),(o)) #define mpih_mod(v,vs,u,us) _gcry_mpih_mod ((v),(vs),(u),(us)) DEFINE_CT_TYPE_GEN_MASK(limb, mpi_limb_t) DEFINE_CT_TYPE_GEN_INV_MASK(limb, mpi_limb_t) static inline int mpih_limb_is_zero (mpi_limb_t a) { /* Sign bit set if A == 0. */ a = ~a & ~(-a); return a >> (BITS_PER_MPI_LIMB - 1); } static inline int mpih_limb_is_not_zero (mpi_limb_t a) { /* Sign bit set if A != 0. */ a = a | (-a); return a >> (BITS_PER_MPI_LIMB - 1); } void _gcry_mpih_set_cond (mpi_ptr_t wp, mpi_ptr_t up, mpi_size_t usize, unsigned long op_enable); mpi_limb_t _gcry_mpih_add_n_cond (mpi_ptr_t wp, mpi_ptr_t up, mpi_ptr_t vp, mpi_size_t usize, unsigned long op_enable); mpi_limb_t _gcry_mpih_sub_n_cond (mpi_ptr_t wp, mpi_ptr_t up, mpi_ptr_t vp, mpi_size_t usize, unsigned long op_enable); void _gcry_mpih_swap_cond (mpi_ptr_t up, mpi_ptr_t vp, mpi_size_t usize, unsigned long op_enable); void _gcry_mpih_abs_cond (mpi_ptr_t wp, mpi_ptr_t up, mpi_size_t usize, unsigned long op_enable); mpi_ptr_t _gcry_mpih_mod (mpi_ptr_t vp, mpi_size_t vsize, mpi_ptr_t up, mpi_size_t usize); int _gcry_mpih_cmp_ui (mpi_ptr_t up, mpi_size_t usize, unsigned long v); /* Define stuff for longlong.h. */ #define W_TYPE_SIZE BITS_PER_MPI_LIMB typedef mpi_limb_t UWtype; typedef unsigned int UHWtype; #if defined (__GNUC__) typedef unsigned int UQItype __attribute__ ((mode (QI))); typedef int SItype __attribute__ ((mode (SI))); typedef unsigned int USItype __attribute__ ((mode (SI))); typedef int DItype __attribute__ ((mode (DI))); typedef unsigned int UDItype __attribute__ ((mode (DI))); #else typedef unsigned char UQItype; typedef long SItype; typedef unsigned long USItype; #endif #ifdef __GNUC__ #include "mpi-inline.h" #endif #endif /*G10_MPI_INTERNAL_H*/ grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/mpi/mpi-inline.c0000644000175000017500000000245415036452441022370 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ /* mpi-inline.c * Copyright (C) 1999, 2002 Free Software Foundation, Inc. * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . * SPDX-License-Identifier: LGPL-2.1-or-later */ #include #include #include /* put the inline functions as real functions into the lib */ #define G10_MPI_INLINE_DECL #include "mpi-internal.h" /* always include the header because it is only * included by mpi-internal if __GCC__ is defined but we * need it here in all cases and the above definition of * of the macro allows us to do so */ #include "mpi-inline.h" grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/mpi/mpi-bit.c0000644000175000017500000001744615036452441021677 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ /* mpi-bit.c - MPI bit level functions * Copyright (C) 1998, 1999, 2001, 2002, 2006 Free Software Foundation, Inc. * Copyright (C) 2013 g10 Code GmbH * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . * SPDX-License-Identifier: LGPL-2.1-or-later */ #include #include #include #include "mpi-internal.h" #include "longlong.h" #ifdef MPI_INTERNAL_NEED_CLZ_TAB #ifdef __STDC__ const #endif unsigned char _gcry_clz_tab[] = { 0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, }; #endif #define A_LIMB_1 ((mpi_limb_t)1) /**************** * Sometimes we have MSL (most significant limbs) which are 0; * this is for some reasons not good, so this function removes them. */ void _gcry_mpi_normalize( gcry_mpi_t a ) { if( mpi_is_opaque(a) ) return; for( ; a->nlimbs && !a->d[a->nlimbs-1]; a->nlimbs-- ) ; } /**************** * Return the number of bits in A. */ unsigned int _gcry_mpi_get_nbits (gcry_mpi_t a) { unsigned n; if( mpi_is_opaque(a) ) { return a->sign; /* which holds the number of bits */ } _gcry_mpi_normalize( a ); if( a->nlimbs ) { mpi_limb_t alimb = a->d[a->nlimbs-1]; if( alimb ) count_leading_zeros( n, alimb ); else n = BITS_PER_MPI_LIMB; n = BITS_PER_MPI_LIMB - n + (a->nlimbs-1) * BITS_PER_MPI_LIMB; } else n = 0; return n; } /**************** * Test whether bit N is set. */ int _gcry_mpi_test_bit( gcry_mpi_t a, unsigned int n ) { unsigned int limbno, bitno; mpi_limb_t limb; limbno = n / BITS_PER_MPI_LIMB; bitno = n % BITS_PER_MPI_LIMB; if( limbno >= a->nlimbs ) return 0; /* too far left: this is a 0 */ limb = a->d[limbno]; return (limb & (A_LIMB_1 << bitno))? 1: 0; } /**************** * Set bit N of A. */ void _gcry_mpi_set_bit( gcry_mpi_t a, unsigned int n ) { unsigned int i, limbno, bitno; if (mpi_is_immutable (a)) { mpi_immutable_failed (); return; } limbno = n / BITS_PER_MPI_LIMB; bitno = n % BITS_PER_MPI_LIMB; if ( limbno >= a->nlimbs ) { for (i=a->nlimbs; i < a->alloced; i++) a->d[i] = 0; mpi_resize (a, limbno+1 ); a->nlimbs = limbno+1; } a->d[limbno] |= (A_LIMB_1<= a->nlimbs ) { for (i=a->nlimbs; i < a->alloced; i++) a->d[i] = 0; mpi_resize (a, limbno+1 ); a->nlimbs = limbno+1; } a->d[limbno] |= (A_LIMB_1<d[limbno] &= ~(A_LIMB_1 << bitno); a->nlimbs = limbno+1; } /**************** * clear bit N of A and all bits above */ void _gcry_mpi_clear_highbit( gcry_mpi_t a, unsigned int n ) { unsigned int limbno, bitno; if (mpi_is_immutable (a)) { mpi_immutable_failed (); return; } limbno = n / BITS_PER_MPI_LIMB; bitno = n % BITS_PER_MPI_LIMB; if( limbno >= a->nlimbs ) return; /* not allocated, therefore no need to clear bits :-) */ for( ; bitno < BITS_PER_MPI_LIMB; bitno++ ) a->d[limbno] &= ~(A_LIMB_1 << bitno); a->nlimbs = limbno+1; } /**************** * Clear bit N of A. */ void _gcry_mpi_clear_bit( gcry_mpi_t a, unsigned int n ) { unsigned int limbno, bitno; if (mpi_is_immutable (a)) { mpi_immutable_failed (); return; } limbno = n / BITS_PER_MPI_LIMB; bitno = n % BITS_PER_MPI_LIMB; if (limbno >= a->nlimbs) return; /* Don't need to clear this bit, it's far too left. */ a->d[limbno] &= ~(A_LIMB_1 << bitno); } /**************** * Shift A by COUNT limbs to the right * This is used only within the MPI library */ void _gcry_mpi_rshift_limbs( gcry_mpi_t a, unsigned int count ) { mpi_ptr_t ap = a->d; mpi_size_t n = a->nlimbs; unsigned int i; if (mpi_is_immutable (a)) { mpi_immutable_failed (); return; } if (count >= n) { a->nlimbs = 0; return; } for( i = 0; i < n - count; i++ ) ap[i] = ap[i+count]; ap[i] = 0; a->nlimbs -= count; } /* * Shift A by N bits to the right. */ void _gcry_mpi_rshift ( gcry_mpi_t x, gcry_mpi_t a, unsigned int n ) { unsigned int nlimbs = (n/BITS_PER_MPI_LIMB); unsigned int nbits = (n%BITS_PER_MPI_LIMB); unsigned int i; mpi_size_t alimbs; mpi_ptr_t xp, ap; if (mpi_is_immutable (x)) { mpi_immutable_failed (); return; } alimbs = a->nlimbs; if (x != a) { RESIZE_IF_NEEDED (x, alimbs); x->nlimbs = alimbs; x->flags = a->flags; x->sign = a->sign; } /* In-place operation. */ if (nlimbs >= alimbs) { x->nlimbs = 0; return; } xp = x->d; ap = a->d; if (alimbs && nbits) { _gcry_mpih_rshift (xp, ap + nlimbs, alimbs - nlimbs, nbits); if (nlimbs) xp[alimbs - nlimbs] = 0; x->nlimbs -= nlimbs; } else if (nlimbs || (x != a)) { for (i = 0; i < alimbs - nlimbs; i++ ) xp[i] = ap[i + nlimbs]; if (nlimbs) xp[i] = 0; x->nlimbs -= nlimbs; } MPN_NORMALIZE (x->d, x->nlimbs); } /**************** * Shift A by COUNT limbs to the left * This is used only within the MPI library */ void _gcry_mpi_lshift_limbs (gcry_mpi_t a, unsigned int count) { mpi_ptr_t ap; int n = a->nlimbs; int i; if (!count || !n) return; RESIZE_IF_NEEDED (a, n+count); ap = a->d; for (i = n-1; i >= 0; i--) ap[i+count] = ap[i]; for (i=0; i < count; i++ ) ap[i] = 0; a->nlimbs += count; } /* * Shift A by N bits to the left. */ void _gcry_mpi_lshift ( gcry_mpi_t x, gcry_mpi_t a, unsigned int n ) { unsigned int nlimbs = (n/BITS_PER_MPI_LIMB); unsigned int nbits = (n%BITS_PER_MPI_LIMB); mpi_size_t alimbs; mpi_ptr_t xp, ap; int i; if (mpi_is_immutable (x)) { mpi_immutable_failed (); return; } if (x == a && !n) return; /* In-place shift with an amount of zero. */ /* Note: might be in-place operation, so a==x or a!=x. */ alimbs = a->nlimbs; RESIZE_IF_NEEDED (x, alimbs + nlimbs + 1); xp = x->d; ap = a->d; if (nbits && alimbs) { x->nlimbs = alimbs + nlimbs + 1; xp[alimbs + nlimbs] = _gcry_mpih_lshift (xp + nlimbs, ap, alimbs, nbits); } else { x->nlimbs = alimbs + nlimbs; for (i = alimbs - 1; i >= 0; i--) xp[i + nlimbs] = ap[i]; } for (i = 0; i < nlimbs; i++) xp[i] = 0; x->flags = a->flags; x->sign = a->sign; MPN_NORMALIZE (x->d, x->nlimbs); } grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/mpi/mpih-mul2.c0000644000175000017500000000372615036452441022144 00000000000000/* mpih-mul2.c - MPI helper functions * Copyright (C) 1994, 1996, 1997, 1998, 2001, * 2002 Free Software Foundation, Inc. * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . * SPDX-License-Identifier: LGPL-2.1-or-later * * Note: This code is heavily based on the GNU MP Library. * Actually it's the same code with only minor changes in the * way the data is stored; this is to support the abstraction * of an optional secure memory allocation which may be used * to avoid revealing of sensitive data due to paging etc. */ #include #include #include #include "mpi-internal.h" #include "longlong.h" mpi_limb_t _gcry_mpih_addmul_1( mpi_ptr_t res_ptr, mpi_ptr_t s1_ptr, mpi_size_t s1_size, mpi_limb_t s2_limb) { mpi_limb_t cy_limb; mpi_size_t j; mpi_limb_t prod_high, prod_low; mpi_limb_t x; /* The loop counter and index J goes from -SIZE to -1. This way * the loop becomes faster. */ j = -s1_size; res_ptr -= j; s1_ptr -= j; cy_limb = 0; do { umul_ppmm( prod_high, prod_low, s1_ptr[j], s2_limb ); prod_low += cy_limb; cy_limb = (prod_low < cy_limb?1:0) + prod_high; x = res_ptr[j]; prod_low = x + prod_low; cy_limb += prod_low < x?1:0; res_ptr[j] = prod_low; } while ( ++j ); return cy_limb; } grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/mpi/mpih-add1.c0000644000175000017500000000401715036452441022070 00000000000000/* mpihelp-add_1.c - MPI helper functions * Copyright (C) 1994, 1996, 1997, 1998, * 2000, 2002 Free Software Foundation, Inc. * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . * SPDX-License-Identifier: LGPL-2.1-or-later * * Note: This code is heavily based on the GNU MP Library. * Actually it's the same code with only minor changes in the * way the data is stored; this is to support the abstraction * of an optional secure memory allocation which may be used * to avoid revealing of sensitive data due to paging etc. */ #include #include #include #include "mpi-internal.h" #include "longlong.h" mpi_limb_t _gcry_mpih_add_n (mpi_ptr_t res_ptr, mpi_ptr_t s1_ptr, mpi_ptr_t s2_ptr, mpi_size_t size) { mpi_limb_t x, y, cy; mpi_size_t j; /* The loop counter and index J goes from -SIZE to -1. This way the loop becomes faster. */ j = -size; /* Offset the base pointers to compensate for the negative indices. */ s1_ptr -= j; s2_ptr -= j; res_ptr -= j; cy = 0; do { y = s2_ptr[j]; x = s1_ptr[j]; y += cy; /* add previous carry to one addend */ cy = y < cy; /* get out carry from that addition */ y += x; /* add other addend */ cy += y < x; /* get out carry from that add, combine */ res_ptr[j] = y; } while ( ++j ); return cy; } grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/mpi/mpih-const-time.c0000644000175000017500000001344115036452441023342 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ /* mpih-const-time.c - Constant-time MPI helper functions * Copyright (C) 2020 g10 Code GmbH * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . */ #include #include #include #include "mpi-internal.h" #include "g10lib.h" #include "const-time.h" #include "longlong.h" #define A_LIMB_1 ((mpi_limb_t)1) /* * Return 1 if X > Y and otherwise return 0. */ static inline mpi_limb_t mpih_ct_limb_greater_than (mpi_limb_t x, mpi_limb_t y) { mpi_limb_t diff_hi, diff_lo; sub_ddmmss (diff_hi, diff_lo, 0, y, 0, x); (void)diff_lo; return diff_hi >> (BITS_PER_MPI_LIMB - 1); } /* * Return 1 if X < Y and otherwise return 0. */ static inline mpi_limb_t mpih_ct_limb_less_than (mpi_limb_t x, mpi_limb_t y) { return mpih_ct_limb_greater_than (y, x); } /* * W = U when OP_ENABLED=1 * otherwise, W keeps old value */ void _gcry_mpih_set_cond (mpi_ptr_t wp, mpi_ptr_t up, mpi_size_t usize, unsigned long op_enable) { /* Note: dual mask with AND/OR used for EM leakage mitigation */ mpi_limb_t mask1 = ct_limb_gen_mask(op_enable); mpi_limb_t mask2 = ct_limb_gen_inv_mask(op_enable); mpi_size_t i; for (i = 0; i < usize; i++) { wp[i] = (wp[i] & mask2) | (up[i] & mask1); } } /* * W = U + V when OP_ENABLED=1 * otherwise, W = U */ mpi_limb_t _gcry_mpih_add_n_cond (mpi_ptr_t wp, mpi_ptr_t up, mpi_ptr_t vp, mpi_size_t usize, unsigned long op_enable) { /* Note: dual mask with AND/OR used for EM leakage mitigation */ mpi_limb_t mask1 = ct_limb_gen_mask(op_enable); mpi_limb_t mask2 = ct_limb_gen_inv_mask(op_enable); mpi_size_t i; mpi_limb_t cy; cy = 0; for (i = 0; i < usize; i++) { mpi_limb_t u = up[i]; mpi_limb_t x = u + vp[i]; mpi_limb_t cy1 = mpih_ct_limb_less_than(x, u); mpi_limb_t cy2; x = x + cy; cy2 = mpih_ct_limb_less_than(x, cy); cy = cy1 | cy2; wp[i] = (u & mask2) | (x & mask1); } return cy & mask1; } /* * W = U - V when OP_ENABLED=1 * otherwise, W = U */ mpi_limb_t _gcry_mpih_sub_n_cond (mpi_ptr_t wp, mpi_ptr_t up, mpi_ptr_t vp, mpi_size_t usize, unsigned long op_enable) { /* Note: dual mask with AND/OR used for EM leakage mitigation */ mpi_limb_t mask1 = ct_limb_gen_mask(op_enable); mpi_limb_t mask2 = ct_limb_gen_inv_mask(op_enable); mpi_size_t i; mpi_limb_t cy; cy = 0; for (i = 0; i < usize; i++) { mpi_limb_t u = up[i]; mpi_limb_t x = u - vp[i]; mpi_limb_t cy1 = mpih_ct_limb_greater_than(x, u); mpi_limb_t cy2; cy2 = mpih_ct_limb_less_than(x, cy); x = x - cy; cy = cy1 | cy2; wp[i] = (u & mask2) | (x & mask1); } return cy & mask1; } /* * Swap value of U and V when OP_ENABLED=1 * otherwise, no change */ void _gcry_mpih_swap_cond (mpi_ptr_t up, mpi_ptr_t vp, mpi_size_t usize, unsigned long op_enable) { /* Note: dual mask with AND/OR used for EM leakage mitigation */ mpi_limb_t mask1 = ct_limb_gen_mask(op_enable); mpi_limb_t mask2 = ct_limb_gen_inv_mask(op_enable); mpi_size_t i; for (i = 0; i < usize; i++) { mpi_limb_t u = up[i]; mpi_limb_t v = vp[i]; up[i] = (u & mask2) | (v & mask1); vp[i] = (u & mask1) | (v & mask2); } } /* * W = -U when OP_ENABLED=1 * otherwise, W = U */ void _gcry_mpih_abs_cond (mpi_ptr_t wp, mpi_ptr_t up, mpi_size_t usize, unsigned long op_enable) { /* Note: dual mask with AND/OR used for EM leakage mitigation */ mpi_limb_t mask1 = ct_limb_gen_mask(op_enable); mpi_limb_t mask2 = ct_limb_gen_inv_mask(op_enable); mpi_limb_t cy = op_enable; mpi_size_t i; for (i = 0; i < usize; i++) { mpi_limb_t u = up[i]; mpi_limb_t x = ~u + cy; cy = mpih_ct_limb_less_than(x, ~u); wp[i] = (u & mask2) | (x & mask1); } } /* * Allocating memory for W, * compute W = V % U, then return W */ mpi_ptr_t _gcry_mpih_mod (mpi_ptr_t vp, mpi_size_t vsize, mpi_ptr_t up, mpi_size_t usize) { int secure; mpi_ptr_t rp; mpi_size_t i; secure = _gcry_is_secure (vp); rp = mpi_alloc_limb_space (usize, secure); MPN_ZERO (rp, usize); for (i = 0; i < vsize * BITS_PER_MPI_LIMB; i++) { unsigned int j = vsize * BITS_PER_MPI_LIMB - 1 - i; unsigned int limbno = j / BITS_PER_MPI_LIMB; unsigned int bitno = j % BITS_PER_MPI_LIMB; mpi_limb_t limb = vp[limbno]; unsigned int the_bit = (limb >> bitno) & 1; mpi_limb_t underflow; mpi_limb_t overflow; overflow = _gcry_mpih_lshift (rp, rp, usize, 1); rp[0] |= the_bit; underflow = _gcry_mpih_sub_n (rp, rp, up, usize); mpih_add_n_cond (rp, rp, up, usize, overflow ^ underflow); } return rp; } int _gcry_mpih_cmp_ui (mpi_ptr_t up, mpi_size_t usize, unsigned long v) { int is_all_zero = 1; mpi_size_t i; for (i = 1; i < usize; i++) is_all_zero &= mpih_limb_is_zero (up[i]); if (is_all_zero) { if (up[0] < v) return -1; else if (up[0] > v) return 1; else return 0; } return 1; } grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/mpi/mpih-sub1.c0000644000175000017500000000401015036452441022122 00000000000000/* mpihelp-add_2.c - MPI helper functions * Copyright (C) 1994, 1996, 1997, 1998, 2001, * 2002 Free Software Foundation, Inc. * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . * SPDX-License-Identifier: LGPL-2.1-or-later * * Note: This code is heavily based on the GNU MP Library. * Actually it's the same code with only minor changes in the * way the data is stored; this is to support the abstraction * of an optional secure memory allocation which may be used * to avoid revealing of sensitive data due to paging etc. */ #include #include #include #include "mpi-internal.h" #include "longlong.h" mpi_limb_t _gcry_mpih_sub_n( mpi_ptr_t res_ptr, mpi_ptr_t s1_ptr, mpi_ptr_t s2_ptr, mpi_size_t size) { mpi_limb_t x, y, cy; mpi_size_t j; /* The loop counter and index J goes from -SIZE to -1. This way the loop becomes faster. */ j = -size; /* Offset the base pointers to compensate for the negative indices. */ s1_ptr -= j; s2_ptr -= j; res_ptr -= j; cy = 0; do { y = s2_ptr[j]; x = s1_ptr[j]; y += cy; /* add previous carry to subtrahend */ cy = y < cy; /* get out carry from that addition */ y = x - y; /* main subtract */ cy += y > x; /* get out carry from the subtract, combine */ res_ptr[j] = y; } while( ++j ); return cy; } grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/mpi/mpi-inv.c0000644000175000017500000003614015036452441021705 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ /* mpi-inv.c - MPI functions * Copyright (C) 1998, 2001, 2002, 2003 Free Software Foundation, Inc. * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . */ #include #include #include #include "mpi-internal.h" #include "g10lib.h" /* * This uses a modular inversion algorithm designed by Niels Möller * which was implemented in Nettle. The same algorithm was later also * adapted to GMP in mpn_sec_invert. * * For the description of the algorithm, see Algorithm 5 in Appendix A * of "Fast Software Polynomial Multiplication on ARM Processors using * the NEON Engine" by Danilo Câmara, Conrado P. L. Gouvêa, Julio * López, and Ricardo Dahab: * https://hal.inria.fr/hal-01506572/document * * Note that in the reference above, at the line 2 of Algorithm 5, * initial value of V was described as V:=1 wrongly. It must be V:=0. */ static mpi_ptr_t mpih_invm_odd (mpi_ptr_t ap, mpi_ptr_t np, mpi_size_t nsize) { int secure; unsigned int iterations; mpi_ptr_t n1hp; mpi_ptr_t bp; mpi_ptr_t up, vp; secure = _gcry_is_secure (ap); up = mpi_alloc_limb_space (nsize, secure); MPN_ZERO (up, nsize); up[0] = 1; vp = mpi_alloc_limb_space (nsize, secure); MPN_ZERO (vp, nsize); secure = _gcry_is_secure (np); bp = mpi_alloc_limb_space (nsize, secure); MPN_COPY (bp, np, nsize); n1hp = mpi_alloc_limb_space (nsize, secure); MPN_COPY (n1hp, np, nsize); _gcry_mpih_rshift (n1hp, n1hp, nsize, 1); _gcry_mpih_add_1 (n1hp, n1hp, nsize, 1); iterations = 2 * nsize * BITS_PER_MPI_LIMB; while (iterations-- > 0) { mpi_limb_t odd_a, odd_u, underflow, borrow; odd_a = ap[0] & 1; underflow = mpih_sub_n_cond (ap, ap, bp, nsize, odd_a); mpih_add_n_cond (bp, bp, ap, nsize, underflow); mpih_abs_cond (ap, ap, nsize, underflow); mpih_swap_cond (up, vp, nsize, underflow); _gcry_mpih_rshift (ap, ap, nsize, 1); borrow = mpih_sub_n_cond (up, up, vp, nsize, odd_a); mpih_add_n_cond (up, up, np, nsize, borrow); odd_u = _gcry_mpih_rshift (up, up, nsize, 1) != 0; mpih_add_n_cond (up, up, n1hp, nsize, odd_u); } _gcry_mpi_free_limb_space (n1hp, nsize); _gcry_mpi_free_limb_space (up, nsize); if (_gcry_mpih_cmp_ui (bp, nsize, 1) == 0) { /* Inverse exists. */ _gcry_mpi_free_limb_space (bp, nsize); return vp; } else { _gcry_mpi_free_limb_space (bp, nsize); _gcry_mpi_free_limb_space (vp, nsize); return NULL; } } /* * Calculate the multiplicative inverse X of A mod 2^K * A must be positive. * * See section 7 in "A New Algorithm for Inversion mod p^k" by Çetin * Kaya Koç: https://eprint.iacr.org/2017/411.pdf */ static mpi_ptr_t mpih_invm_pow2 (mpi_ptr_t ap, mpi_size_t asize, unsigned int k) { int secure = _gcry_is_secure (ap); mpi_size_t i; unsigned int iterations; mpi_ptr_t xp, wp, up, vp; mpi_size_t usize; if (!(ap[0] & 1)) return NULL; iterations = ((k + BITS_PER_MPI_LIMB - 1) / BITS_PER_MPI_LIMB) * BITS_PER_MPI_LIMB; usize = iterations / BITS_PER_MPI_LIMB; up = mpi_alloc_limb_space (usize, secure); MPN_ZERO (up, usize); up[0] = 1; vp = mpi_alloc_limb_space (usize, secure); for (i = 0; i < (usize < asize ? usize : asize); i++) vp[i] = ap[i]; for (; i < usize; i++) vp[i] = 0; if ((k % BITS_PER_MPI_LIMB)) for (i = k % BITS_PER_MPI_LIMB; i < BITS_PER_MPI_LIMB; i++) vp[k/BITS_PER_MPI_LIMB] &= ~(((mpi_limb_t)1) << i); wp = mpi_alloc_limb_space (usize, secure); MPN_COPY (wp, up, usize); xp = mpi_alloc_limb_space (usize, secure); MPN_ZERO (xp, usize); /* * It can be considered that overflow at _gcry_mpih_sub_n results * adding 2^(USIZE*BITS_PER_MPI_LIMB), which is no problem in modulo * 2^K computation. */ for (i = 0; i < iterations; i++) { int b0 = (up[0] & 1); xp[i/BITS_PER_MPI_LIMB] |= ((mpi_limb_t)b0<<(i%BITS_PER_MPI_LIMB)); _gcry_mpih_sub_n (wp, up, vp, usize); mpih_set_cond (up, wp, usize, b0); _gcry_mpih_rshift (up, up, usize, 1); } if ((k % BITS_PER_MPI_LIMB)) for (i = k % BITS_PER_MPI_LIMB; i < BITS_PER_MPI_LIMB; i++) xp[k/BITS_PER_MPI_LIMB] &= ~(((mpi_limb_t)1) << i); _gcry_mpi_free_limb_space (up, usize); _gcry_mpi_free_limb_space (vp, usize); _gcry_mpi_free_limb_space (wp, usize); return xp; } /**************** * Calculate the multiplicative inverse X of A mod N * That is: Find the solution x for * 1 = (a*x) mod n */ static int mpi_invm_generic (gcry_mpi_t x, gcry_mpi_t a, gcry_mpi_t n) { int is_gcd_one; #if 0 /* Extended Euclid's algorithm (See TAOCP Vol II, 4.5.2, Alg X) */ gcry_mpi_t u, v, u1, u2, u3, v1, v2, v3, q, t1, t2, t3; u = mpi_copy(a); v = mpi_copy(n); u1 = mpi_alloc_set_ui(1); u2 = mpi_alloc_set_ui(0); u3 = mpi_copy(u); v1 = mpi_alloc_set_ui(0); v2 = mpi_alloc_set_ui(1); v3 = mpi_copy(v); q = mpi_alloc( mpi_get_nlimbs(u)+1 ); t1 = mpi_alloc( mpi_get_nlimbs(u)+1 ); t2 = mpi_alloc( mpi_get_nlimbs(u)+1 ); t3 = mpi_alloc( mpi_get_nlimbs(u)+1 ); while( mpi_cmp_ui( v3, 0 ) ) { mpi_fdiv_q( q, u3, v3 ); mpi_mul(t1, v1, q); mpi_mul(t2, v2, q); mpi_mul(t3, v3, q); mpi_sub(t1, u1, t1); mpi_sub(t2, u2, t2); mpi_sub(t3, u3, t3); mpi_set(u1, v1); mpi_set(u2, v2); mpi_set(u3, v3); mpi_set(v1, t1); mpi_set(v2, t2); mpi_set(v3, t3); } /* log_debug("result:\n"); log_mpidump("q =", q ); log_mpidump("u1=", u1); log_mpidump("u2=", u2); log_mpidump("u3=", u3); log_mpidump("v1=", v1); log_mpidump("v2=", v2); */ mpi_set(x, u1); is_gcd_one = (mpi_cmp_ui (u3, 1) == 0); mpi_free(u1); mpi_free(u2); mpi_free(u3); mpi_free(v1); mpi_free(v2); mpi_free(v3); mpi_free(q); mpi_free(t1); mpi_free(t2); mpi_free(t3); mpi_free(u); mpi_free(v); #elif 0 /* Extended Euclid's algorithm (See TAOCP Vol II, 4.5.2, Alg X) * modified according to Michael Penk's solution for Exercise 35 * (in the first edition) * In the third edition, it's Exercise 39, and it is described in * page 646 of ANSWERS TO EXERCISES chapter. */ /* FIXME: we can simplify this in most cases (see Knuth) */ gcry_mpi_t u, v, u1, u2, u3, v1, v2, v3, t1, t2, t3; unsigned k; int sign; u = mpi_copy(a); v = mpi_copy(n); for(k=0; !mpi_test_bit(u,0) && !mpi_test_bit(v,0); k++ ) { mpi_rshift(u, u, 1); mpi_rshift(v, v, 1); } u1 = mpi_alloc_set_ui(1); u2 = mpi_alloc_set_ui(0); u3 = mpi_copy(u); v1 = mpi_copy(v); /* !-- used as const 1 */ v2 = mpi_alloc( mpi_get_nlimbs(u) ); mpi_sub( v2, u1, u ); v3 = mpi_copy(v); if( mpi_test_bit(u, 0) ) { /* u is odd */ t1 = mpi_alloc_set_ui(0); t2 = mpi_alloc_set_ui(1); t2->sign = 1; t3 = mpi_copy(v); t3->sign = !t3->sign; goto Y4; } else { t1 = mpi_alloc_set_ui(1); t2 = mpi_alloc_set_ui(0); t3 = mpi_copy(u); } do { do { if( mpi_test_bit(t1, 0) || mpi_test_bit(t2, 0) ) { /* one is odd */ mpi_add(t1, t1, v); mpi_sub(t2, t2, u); } mpi_rshift(t1, t1, 1); mpi_rshift(t2, t2, 1); mpi_rshift(t3, t3, 1); Y4: ; } while( !mpi_test_bit( t3, 0 ) ); /* while t3 is even */ if( !t3->sign ) { mpi_set(u1, t1); mpi_set(u2, t2); mpi_set(u3, t3); } else { mpi_sub(v1, v, t1); sign = u->sign; u->sign = !u->sign; mpi_sub(v2, u, t2); u->sign = sign; sign = t3->sign; t3->sign = !t3->sign; mpi_set(v3, t3); t3->sign = sign; } mpi_sub(t1, u1, v1); mpi_sub(t2, u2, v2); mpi_sub(t3, u3, v3); if( t1->sign ) { mpi_add(t1, t1, v); mpi_sub(t2, t2, u); } } while( mpi_cmp_ui( t3, 0 ) ); /* while t3 != 0 */ /* mpi_lshift( u3, u3, k ); */ is_gcd_one = (k == 0 && mpi_cmp_ui (u3, 1) == 0); mpi_set(x, u1); mpi_free(u1); mpi_free(u2); mpi_free(u3); mpi_free(v1); mpi_free(v2); mpi_free(v3); mpi_free(t1); mpi_free(t2); mpi_free(t3); #else /* Extended Euclid's algorithm (See TAOCP Vol II, 4.5.2, Alg X) * modified according to Michael Penk's solution for Exercise 35 * with further enhancement */ /* The reference in the comment above is for the first edition. * In the third edition, it's Exercise 39, and it is described in * page 646 of ANSWERS TO EXERCISES chapter. */ gcry_mpi_t u, v, u1, u2=NULL, u3, v1, v2=NULL, v3, t1, t2=NULL, t3; unsigned k; int sign; int odd ; u = mpi_copy(a); v = mpi_copy(n); for(k=0; !mpi_test_bit(u,0) && !mpi_test_bit(v,0); k++ ) { mpi_rshift(u, u, 1); mpi_rshift(v, v, 1); } odd = mpi_test_bit(v,0); u1 = mpi_alloc_set_ui(1); if( !odd ) u2 = mpi_alloc_set_ui(0); u3 = mpi_copy(u); v1 = mpi_copy(v); if( !odd ) { v2 = mpi_alloc( mpi_get_nlimbs(u) ); mpi_sub( v2, u1, u ); /* U is used as const 1 */ } v3 = mpi_copy(v); if( mpi_test_bit(u, 0) ) { /* u is odd */ t1 = mpi_alloc_set_ui(0); if( !odd ) { t2 = mpi_alloc_set_ui(1); t2->sign = 1; } t3 = mpi_copy(v); t3->sign = !t3->sign; goto Y4; } else { t1 = mpi_alloc_set_ui(1); if( !odd ) t2 = mpi_alloc_set_ui(0); t3 = mpi_copy(u); } do { do { if( !odd ) { if( mpi_test_bit(t1, 0) || mpi_test_bit(t2, 0) ) { /* one is odd */ mpi_add(t1, t1, v); mpi_sub(t2, t2, u); } mpi_rshift(t1, t1, 1); mpi_rshift(t2, t2, 1); mpi_rshift(t3, t3, 1); } else { if( mpi_test_bit(t1, 0) ) mpi_add(t1, t1, v); mpi_rshift(t1, t1, 1); mpi_rshift(t3, t3, 1); } Y4: ; } while( !mpi_test_bit( t3, 0 ) ); /* while t3 is even */ if( !t3->sign ) { mpi_set(u1, t1); if( !odd ) mpi_set(u2, t2); mpi_set(u3, t3); } else { mpi_sub(v1, v, t1); sign = u->sign; u->sign = !u->sign; if( !odd ) mpi_sub(v2, u, t2); u->sign = sign; sign = t3->sign; t3->sign = !t3->sign; mpi_set(v3, t3); t3->sign = sign; } mpi_sub(t1, u1, v1); if( !odd ) mpi_sub(t2, u2, v2); mpi_sub(t3, u3, v3); if( t1->sign ) { mpi_add(t1, t1, v); if( !odd ) mpi_sub(t2, t2, u); } } while( mpi_cmp_ui( t3, 0 ) ); /* while t3 != 0 */ /* mpi_lshift( u3, u3, k ); */ is_gcd_one = (k == 0 && mpi_cmp_ui (u3, 1) == 0); mpi_set(x, u1); mpi_free(u1); mpi_free(v1); mpi_free(t1); if( !odd ) { mpi_free(u2); mpi_free(v2); mpi_free(t2); } mpi_free(u3); mpi_free(v3); mpi_free(t3); mpi_free(u); mpi_free(v); #endif return is_gcd_one; } /* * Set X to the multiplicative inverse of A mod M. Return true if the * inverse exists. */ int _gcry_mpi_invm (gcry_mpi_t x, gcry_mpi_t a, gcry_mpi_t n) { mpi_ptr_t ap, xp; if (!mpi_cmp_ui (a, 0)) return 0; /* Inverse does not exists. */ if (!mpi_cmp_ui (n, 1)) return 0; /* Inverse does not exists. */ if (mpi_test_bit (n, 0)) { if (a->nlimbs <= n->nlimbs) { ap = mpi_alloc_limb_space (n->nlimbs, _gcry_is_secure (a->d)); MPN_ZERO (ap, n->nlimbs); MPN_COPY (ap, a->d, a->nlimbs); } else ap = _gcry_mpih_mod (a->d, a->nlimbs, n->d, n->nlimbs); xp = mpih_invm_odd (ap, n->d, n->nlimbs); _gcry_mpi_free_limb_space (ap, n->nlimbs); if (xp) { _gcry_mpi_assign_limb_space (x, xp, n->nlimbs); x->nlimbs = n->nlimbs; return 1; } else return 0; /* Inverse does not exists. */ } else if (!a->sign && !n->sign) { unsigned int k = mpi_trailing_zeros (n); mpi_size_t x1size = ((k + BITS_PER_MPI_LIMB - 1) / BITS_PER_MPI_LIMB); mpi_size_t hsize; gcry_mpi_t q; mpi_ptr_t x1p, x2p, q_invp, hp, diffp; mpi_size_t i; if (k == _gcry_mpi_get_nbits (n) - 1) { x1p = mpih_invm_pow2 (a->d, a->nlimbs, k); if (x1p) { _gcry_mpi_assign_limb_space (x, x1p, x1size); x->nlimbs = x1size; return 1; } else return 0; /* Inverse does not exists. */ } /* N can be expressed as P * Q, where P = 2^K. P and Q are coprime. */ /* * Compute X1 = invm (A, P) and X2 = invm (A, Q), and combine * them by Garner's formula, to get X = invm (A, P*Q). * A special case of Chinese Remainder Theorem. */ /* X1 = invm (A, P) */ x1p = mpih_invm_pow2 (a->d, a->nlimbs, k); if (!x1p) return 0; /* Inverse does not exists. */ /* Q = N / P */ q = mpi_new (0); mpi_rshift (q, n, k); /* X2 = invm (A%Q, Q) */ ap = _gcry_mpih_mod (a->d, a->nlimbs, q->d, q->nlimbs); x2p = mpih_invm_odd (ap, q->d, q->nlimbs); _gcry_mpi_free_limb_space (ap, q->nlimbs); if (!x2p) { _gcry_mpi_free_limb_space (x1p, x1size); mpi_free (q); return 0; /* Inverse does not exists. */ } /* Q_inv = Q^(-1) = invm (Q, P) */ q_invp = mpih_invm_pow2 (q->d, q->nlimbs, k); /* H = (X1 - X2) * Q_inv % P */ diffp = mpi_alloc_limb_space (x1size, _gcry_is_secure (a->d)); if (x1size >= q->nlimbs) _gcry_mpih_sub (diffp, x1p, x1size, x2p, q->nlimbs); else _gcry_mpih_sub_n (diffp, x1p, x2p, x1size); _gcry_mpi_free_limb_space (x1p, x1size); if ((k % BITS_PER_MPI_LIMB)) for (i = k % BITS_PER_MPI_LIMB; i < BITS_PER_MPI_LIMB; i++) diffp[k/BITS_PER_MPI_LIMB] &= ~(((mpi_limb_t)1) << i); hsize = x1size * 2; hp = mpi_alloc_limb_space (hsize, _gcry_is_secure (a->d)); _gcry_mpih_mul_n (hp, diffp, q_invp, x1size); _gcry_mpi_free_limb_space (diffp, x1size); _gcry_mpi_free_limb_space (q_invp, x1size); for (i = x1size; i < hsize; i++) hp[i] = 0; if ((k % BITS_PER_MPI_LIMB)) for (i = k % BITS_PER_MPI_LIMB; i < BITS_PER_MPI_LIMB; i++) hp[k/BITS_PER_MPI_LIMB] &= ~(((mpi_limb_t)1) << i); xp = mpi_alloc_limb_space (x1size + q->nlimbs, _gcry_is_secure (a->d)); if (x1size >= q->nlimbs) _gcry_mpih_mul (xp, hp, x1size, q->d, q->nlimbs); else _gcry_mpih_mul (xp, q->d, q->nlimbs, hp, x1size); _gcry_mpi_free_limb_space (hp, hsize); _gcry_mpih_add (xp, xp, x1size + q->nlimbs, x2p, q->nlimbs); _gcry_mpi_free_limb_space (x2p, q->nlimbs); _gcry_mpi_assign_limb_space (x, xp, x1size + q->nlimbs); x->nlimbs = x1size + q->nlimbs; mpi_free (q); return 1; } else return mpi_invm_generic (x, a, n); } grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/mpi/mpi-scan.c0000644000175000017500000000742315036452441022037 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ /* mpi-scan.c - MPI functions * Copyright (C) 1998, 2001, 2002, 2003 Free Software Foundation, Inc. * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . * SPDX-License-Identifier: LGPL-2.1-or-later */ #include #include #include #include "mpi-internal.h" #include "longlong.h" /**************** * Scan through an mpi and return byte for byte. a -1 is returned to indicate * the end of the mpi. Scanning is done from the lsb to the msb, returned * values are in the range of 0 .. 255. * * FIXME: This code is VERY ugly! */ /* int */ /* _gcry_mpi_getbyte( gcry_mpi_t a, unsigned idx ) */ /* { */ /* int i, j; */ /* unsigned n; */ /* mpi_ptr_t ap; */ /* mpi_limb_t limb; */ /* ap = a->d; */ /* for(n=0,i=0; i < a->nlimbs; i++ ) { */ /* limb = ap[i]; */ /* for( j=0; j < BYTES_PER_MPI_LIMB; j++, n++ ) */ /* if( n == idx ) */ /* return (limb >> j*8) & 0xff; */ /* } */ /* return -1; */ /* } */ /**************** * Put a value at position IDX into A. idx counts from lsb to msb */ /* void */ /* _gcry_mpi_putbyte( gcry_mpi_t a, unsigned idx, int xc ) */ /* { */ /* int i, j; */ /* unsigned n; */ /* mpi_ptr_t ap; */ /* mpi_limb_t limb, c; */ /* c = xc & 0xff; */ /* ap = a->d; */ /* for(n=0,i=0; i < a->alloced; i++ ) { */ /* limb = ap[i]; */ /* for( j=0; j < BYTES_PER_MPI_LIMB; j++, n++ ) */ /* if( n == idx ) { */ /* #if BYTES_PER_MPI_LIMB == 4 */ /* if( j == 0 ) */ /* limb = (limb & 0xffffff00) | c; */ /* else if( j == 1 ) */ /* limb = (limb & 0xffff00ff) | (c<<8); */ /* else if( j == 2 ) */ /* limb = (limb & 0xff00ffff) | (c<<16); */ /* else */ /* limb = (limb & 0x00ffffff) | (c<<24); */ /* #elif BYTES_PER_MPI_LIMB == 8 */ /* if( j == 0 ) */ /* limb = (limb & 0xffffffffffffff00) | c; */ /* else if( j == 1 ) */ /* limb = (limb & 0xffffffffffff00ff) | (c<<8); */ /* else if( j == 2 ) */ /* limb = (limb & 0xffffffffff00ffff) | (c<<16); */ /* else if( j == 3 ) */ /* limb = (limb & 0xffffffff00ffffff) | (c<<24); */ /* else if( j == 4 ) */ /* limb = (limb & 0xffffff00ffffffff) | (c<<32); */ /* else if( j == 5 ) */ /* limb = (limb & 0xffff00ffffffffff) | (c<<40); */ /* else if( j == 6 ) */ /* limb = (limb & 0xff00ffffffffffff) | (c<<48); */ /* else */ /* limb = (limb & 0x00ffffffffffffff) | (c<<56); */ /* #else */ /* #error please enhance this function, its ugly - i know. */ /* #endif */ /* if( a->nlimbs <= i ) */ /* a->nlimbs = i+1; */ /* ap[i] = limb; */ /* return; */ /* } */ /* } */ /* abort(); /\* index out of range *\/ */ /* } */ /**************** * Count the number of zerobits at the low end of A */ unsigned _gcry_mpi_trailing_zeros( gcry_mpi_t a ) { unsigned n, count = 0; for(n=0; n < a->nlimbs; n++ ) { if( a->d[n] ) { unsigned nn; mpi_limb_t alimb = a->d[n]; count_trailing_zeros( nn, alimb ); count += nn; break; } count += BITS_PER_MPI_LIMB; } return count; } grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/mpi/mpih-rshift.c0000644000175000017500000000414515036452441022560 00000000000000/* mpih-rshift.c - MPI helper functions * Copyright (C) 1994, 1996, 1998, 1999, * 2000, 2001, 2002 Free Software Foundation, Inc. * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . * SPDX-License-Identifier: LGPL-2.1-or-later * * Note: This code is heavily based on the GNU MP Library. * Actually it's the same code with only minor changes in the * way the data is stored; this is to support the abstraction * of an optional secure memory allocation which may be used * to avoid revealing of sensitive data due to paging etc. */ #include #include #include #include "mpi-internal.h" /* Shift U (pointed to by UP and USIZE limbs long) CNT bits to the right * and store the USIZE least significant limbs of the result at WP. * The bits shifted out to the right are returned. * * Argument constraints: * 1. 0 < CNT < BITS_PER_MP_LIMB * 2. If the result is to be written over the input, WP must be <= UP. */ mpi_limb_t _gcry_mpih_rshift( mpi_ptr_t wp, mpi_ptr_t up, mpi_size_t usize, unsigned cnt) { mpi_limb_t high_limb, low_limb; unsigned sh_1, sh_2; mpi_size_t i; mpi_limb_t retval; sh_1 = cnt; wp -= 1; sh_2 = BITS_PER_MPI_LIMB - sh_1; high_limb = up[0]; retval = high_limb << sh_2; low_limb = high_limb; for (i=1; i < usize; i++) { high_limb = up[i]; wp[i] = (low_limb >> sh_1) | (high_limb << sh_2); low_limb = high_limb; } wp[i] = low_limb >> sh_1; return retval; } grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/mpi/asm-common-aarch64.h0000644000175000017500000000205615036452441023626 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ /* asm-common-aarch64.h - Common macros for AArch64 assembly * * Copyright (C) 2018 Martin Storsjö * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . */ #ifndef MPI_ASM_COMMON_AARCH64_H #define MPI_ASM_COMMON_AARCH64_H #include "../cipher/asm-common-aarch64.h" #endif /* MPI_ASM_COMMON_AARCH64_H */ grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/mpi/mpiutil.c0000644000175000017500000004136315036452441022014 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ /* mpiutil.ac - Utility functions for MPI * Copyright (C) 1998, 2000, 2001, 2002, 2003, * 2007 Free Software Foundation, Inc. * Copyright (C) 2013 g10 Code GmbH * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . */ #include #include #include #include #include "g10lib.h" #include "mpi-internal.h" #include "const-time.h" #if SIZEOF_UNSIGNED_INT == 2 # define MY_UINT_MAX 0xffff /* (visual check: 0123 ) */ #elif SIZEOF_UNSIGNED_INT == 4 # define MY_UINT_MAX 0xffffffff /* (visual check: 01234567 ) */ #elif SIZEOF_UNSIGNED_INT == 8 # define MY_UINT_MAX 0xffffffffffffffff /* (visual check: 0123456789abcdef ) */ #else # error Need MY_UINT_MAX for this limb size #endif /* Constants allocated right away at startup. */ static gcry_mpi_t constants[MPI_NUMBER_OF_CONSTANTS]; /* Initialize the MPI subsystem. This is called early and allows to do some initialization without taking care of threading issues. */ gcry_err_code_t _gcry_mpi_init (void) { int idx; unsigned long value; for (idx=0; idx < MPI_NUMBER_OF_CONSTANTS; idx++) { switch (idx) { case MPI_C_ZERO: value = 0; break; case MPI_C_ONE: value = 1; break; case MPI_C_TWO: value = 2; break; case MPI_C_THREE: value = 3; break; case MPI_C_FOUR: value = 4; break; case MPI_C_EIGHT: value = 8; break; default: log_bug ("invalid mpi_const selector %d\n", idx); } constants[idx] = mpi_alloc_set_ui (value); constants[idx]->flags = (16|32); } return 0; } /**************** * Note: It was a bad idea to use the number of limbs to allocate * because on a alpha the limbs are large but we normally need * integers of n bits - So we should change this to bits (or bytes). * * But mpi_alloc is used in a lot of places :-(. New code * should use mpi_new. */ gcry_mpi_t _gcry_mpi_alloc( unsigned nlimbs ) { gcry_mpi_t a; a = xmalloc( sizeof *a ); a->d = nlimbs? mpi_alloc_limb_space( nlimbs, 0 ) : NULL; a->alloced = nlimbs; a->nlimbs = 0; a->sign = 0; a->flags = 0; return a; } gcry_mpi_t _gcry_mpi_alloc_secure( unsigned nlimbs ) { gcry_mpi_t a; a = xmalloc( sizeof *a ); a->d = nlimbs? mpi_alloc_limb_space( nlimbs, 1 ) : NULL; a->alloced = nlimbs; a->flags = 1; a->nlimbs = 0; a->sign = 0; return a; } mpi_ptr_t _gcry_mpi_alloc_limb_space( unsigned int nlimbs, int secure ) { mpi_ptr_t p; size_t len; len = (nlimbs ? nlimbs : 1) * sizeof (mpi_limb_t); p = secure ? xmalloc_secure (len) : xmalloc (len); if (! nlimbs) *p = 0; return p; } void _gcry_mpi_free_limb_space( mpi_ptr_t a, unsigned int nlimbs) { if (a) { size_t len = nlimbs * sizeof(mpi_limb_t); /* If we have information on the number of allocated limbs, we better wipe that space out. This is a failsafe feature if secure memory has been disabled or was not properly implemented in user provided allocation functions. */ if (len) wipememory (a, len); xfree(a); } } void _gcry_mpi_assign_limb_space( gcry_mpi_t a, mpi_ptr_t ap, unsigned int nlimbs ) { _gcry_mpi_free_limb_space (a->d, a->alloced); a->d = ap; a->alloced = nlimbs; } /**************** * Resize the array of A to NLIMBS. The additional space is cleared * (set to 0). */ void _gcry_mpi_resize (gcry_mpi_t a, unsigned nlimbs) { size_t i; if (nlimbs <= a->alloced) { /* We only need to clear the new space (this is a nop if the limb space is already of the correct size. */ for (i=a->nlimbs; i < a->alloced; i++) a->d[i] = 0; return; } /* Actually resize the limb space. */ if (a->d) { a->d = xrealloc (a->d, nlimbs * sizeof (mpi_limb_t)); for (i=a->nlimbs; i < nlimbs; i++) a->d[i] = 0; } else { if (a->flags & 1) /* Secure memory is wanted. */ a->d = xcalloc_secure (nlimbs , sizeof (mpi_limb_t)); else /* Standard memory. */ a->d = xcalloc (nlimbs , sizeof (mpi_limb_t)); } a->alloced = nlimbs; } void _gcry_mpi_clear( gcry_mpi_t a ) { if (mpi_is_immutable (a)) { mpi_immutable_failed (); return; } a->nlimbs = 0; a->flags = 0; } void _gcry_mpi_free( gcry_mpi_t a ) { if (!a ) return; if ((a->flags & 32)) { #if GPGRT_VERSION_NUMBER >= 0x011600 /* 1.22 */ gpgrt_annotate_leaked_object(a); #endif return; /* Never release a constant. */ } if ((a->flags & 4)) xfree( a->d ); else { _gcry_mpi_free_limb_space(a->d, a->alloced); } /* Check that the flags makes sense. We better allow for bit 1 (value 2) for backward ABI compatibility. */ if ((a->flags & ~(1|2|4|16 |GCRYMPI_FLAG_USER1 |GCRYMPI_FLAG_USER2 |GCRYMPI_FLAG_USER3 |GCRYMPI_FLAG_USER4))) log_bug("invalid flag value in mpi_free\n"); xfree (a); } void _gcry_mpi_immutable_failed (void) { log_info ("Warning: trying to change an immutable MPI\n"); } static void mpi_set_secure( gcry_mpi_t a ) { mpi_ptr_t ap, bp; if ( (a->flags & 1) ) return; a->flags |= 1; ap = a->d; if (!a->nlimbs) { gcry_assert (!ap); return; } bp = mpi_alloc_limb_space (a->alloced, 1); MPN_COPY( bp, ap, a->nlimbs ); a->d = bp; _gcry_mpi_free_limb_space (ap, a->alloced); } gcry_mpi_t _gcry_mpi_set_opaque (gcry_mpi_t a, void *p, unsigned int nbits) { if (!a) a = mpi_alloc(0); if (mpi_is_immutable (a)) { mpi_immutable_failed (); return a; } if( a->flags & 4 ) xfree (a->d); else _gcry_mpi_free_limb_space (a->d, a->alloced); a->d = p; a->alloced = 0; a->nlimbs = 0; a->sign = nbits; a->flags = 4 | (a->flags & (GCRYMPI_FLAG_USER1|GCRYMPI_FLAG_USER2 |GCRYMPI_FLAG_USER3|GCRYMPI_FLAG_USER4)); if (_gcry_is_secure (a->d)) a->flags |= 1; return a; } gcry_mpi_t _gcry_mpi_set_opaque_copy (gcry_mpi_t a, const void *p, unsigned int nbits) { void *d; unsigned int n; n = (nbits+7)/8; d = _gcry_is_secure (p)? xtrymalloc_secure (n) : xtrymalloc (n); if (!d) return NULL; memcpy (d, p, n); return mpi_set_opaque (a, d, nbits); } void * _gcry_mpi_get_opaque (gcry_mpi_t a, unsigned int *nbits) { if( !(a->flags & 4) ) log_bug("mpi_get_opaque on normal mpi\n"); if( nbits ) *nbits = a->sign; return a->d; } void * _gcry_mpi_get_opaque_copy (gcry_mpi_t a, unsigned int *nbits) { const void *s; void *d; unsigned int n; s = mpi_get_opaque (a, nbits); if (!s && nbits) return NULL; n = (*nbits+7)/8; d = _gcry_is_secure (s)? xtrymalloc_secure (n) : xtrymalloc (n); if (d) memcpy (d, s, n); return d; } /**************** * Note: This copy function should not interpret the MPI * but copy it transparently. */ gcry_mpi_t _gcry_mpi_copy (gcry_mpi_t a) { int i; gcry_mpi_t b; if( a && (a->flags & 4) ) { void *p = NULL; if (a->sign) { p = _gcry_is_secure(a->d)? xmalloc_secure ((a->sign+7)/8) : xmalloc ((a->sign+7)/8); if (a->d) memcpy( p, a->d, (a->sign+7)/8 ); } b = mpi_set_opaque( NULL, p, a->sign ); b->flags = a->flags; b->flags &= ~(16|32); /* Reset the immutable and constant flags. */ } else if( a ) { b = mpi_is_secure(a)? mpi_alloc_secure( a->nlimbs ) : mpi_alloc( a->nlimbs ); b->nlimbs = a->nlimbs; b->sign = a->sign; b->flags = a->flags; b->flags &= ~(16|32); /* Reset the immutable and constant flags. */ for(i=0; i < b->nlimbs; i++ ) b->d[i] = a->d[i]; } else b = NULL; return b; } /* Return true if A is negative. */ int _gcry_mpi_is_neg (gcry_mpi_t a) { if (a->sign && _gcry_mpi_cmp_ui (a, 0)) return 1; else return 0; } /* W = - U */ void _gcry_mpi_neg (gcry_mpi_t w, gcry_mpi_t u) { if (w != u) mpi_set (w, u); else if (mpi_is_immutable (w)) { mpi_immutable_failed (); return; } w->sign = !u->sign; } /* W = [W] */ void _gcry_mpi_abs (gcry_mpi_t w) { if (mpi_is_immutable (w)) { mpi_immutable_failed (); return; } w->sign = 0; } /**************** * This function allocates an MPI which is optimized to hold * a value as large as the one given in the argument and allocates it * with the same flags as A. */ gcry_mpi_t _gcry_mpi_alloc_like( gcry_mpi_t a ) { gcry_mpi_t b; if( a && (a->flags & 4) ) { int n = (a->sign+7)/8; void *p = _gcry_is_secure(a->d)? xtrymalloc_secure (n) : xtrymalloc (n); if ( !p ) { _gcry_fatal_error (GPG_ERR_ENOMEM, NULL); } memcpy( p, a->d, n ); b = mpi_set_opaque( NULL, p, a->sign ); } else if( a ) { b = mpi_is_secure(a)? mpi_alloc_secure( a->nlimbs ) : mpi_alloc( a->nlimbs ); b->nlimbs = 0; b->sign = 0; b->flags = a->flags; } else b = NULL; return b; } /* Set U into W and release U. If W is NULL only U will be released. */ void _gcry_mpi_snatch (gcry_mpi_t w, gcry_mpi_t u) { if (w) { if (mpi_is_immutable (w)) { mpi_immutable_failed (); return; } _gcry_mpi_assign_limb_space (w, u->d, u->alloced); w->nlimbs = u->nlimbs; w->sign = u->sign; w->flags = u->flags; u->alloced = 0; u->nlimbs = 0; u->d = NULL; } _gcry_mpi_free (u); } gcry_mpi_t _gcry_mpi_set (gcry_mpi_t w, gcry_mpi_t u) { mpi_ptr_t wp, up; mpi_size_t usize = u->nlimbs; int usign = u->sign; if (!w) w = _gcry_mpi_alloc( mpi_get_nlimbs(u) ); if (mpi_is_immutable (w)) { mpi_immutable_failed (); return w; } RESIZE_IF_NEEDED(w, usize); wp = w->d; up = u->d; MPN_COPY( wp, up, usize ); w->nlimbs = usize; w->flags = u->flags; w->flags &= ~(16|32); /* Reset the immutable and constant flags. */ w->sign = usign; return w; } /**************** * Set the value of W by the one of U, when SET is 1. * Leave the value when SET is 0. * This implementation should be constant-time regardless of SET. */ gcry_mpi_t _gcry_mpi_set_cond (gcry_mpi_t w, const gcry_mpi_t u, unsigned long set) { /* Note: dual mask with AND/OR used for EM leakage mitigation */ mpi_limb_t mask1 = ct_limb_gen_mask(set); mpi_limb_t mask2 = ct_limb_gen_inv_mask(set); mpi_size_t i; mpi_size_t nlimbs = u->alloced; mpi_limb_t xu; mpi_limb_t xw; mpi_limb_t *uu = u->d; mpi_limb_t *uw = w->d; if (w->alloced != u->alloced) log_bug ("mpi_set_cond: different sizes\n"); for (i = 0; i < nlimbs; i++) { xu = uu[i]; xw = uw[i]; uw[i] = (xw & mask2) | (xu & mask1); } xu = u->nlimbs; xw = w->nlimbs; w->nlimbs = (xw & mask2) | (xu & mask1); xu = u->sign; xw = w->sign; w->sign = (xw & mask2) | (xu & mask1); return w; } gcry_mpi_t _gcry_mpi_set_ui (gcry_mpi_t w, unsigned long u) { if (!w) w = _gcry_mpi_alloc (1); /* FIXME: If U is 0 we have no need to resize and thus possible allocating the the limbs. */ if (mpi_is_immutable (w)) { mpi_immutable_failed (); return w; } RESIZE_IF_NEEDED(w, 1); w->d[0] = u; w->nlimbs = u? 1:0; w->sign = 0; w->flags = 0; return w; } /* If U is non-negative and small enough store it as an unsigned int * at W. If the value does not fit into an unsigned int or is * negative return GPG_ERR_ERANGE. Note that we return an unsigned * int so that the value can be used with the bit test functions; in * contrast the other _ui functions take an unsigned long so that on * some platforms they may accept a larger value. On error the value * at W is not changed. */ gcry_err_code_t _gcry_mpi_get_ui (unsigned int *w, gcry_mpi_t u) { mpi_limb_t x; if (u->nlimbs > 1 || u->sign) return GPG_ERR_ERANGE; x = (u->nlimbs == 1) ? u->d[0] : 0; if (sizeof (x) > sizeof (unsigned int) && x > MY_UINT_MAX) return GPG_ERR_ERANGE; *w = x; return 0; } gcry_mpi_t _gcry_mpi_alloc_set_ui( unsigned long u) { gcry_mpi_t w = mpi_alloc(1); w->d[0] = u; w->nlimbs = u? 1:0; w->sign = 0; return w; } void _gcry_mpi_swap (gcry_mpi_t a, gcry_mpi_t b) { struct gcry_mpi tmp; tmp = *a; *a = *b; *b = tmp; } /**************** * Swap the value of A and B, when SWAP is 1. * Leave the value when SWAP is 0. * This implementation should be constant-time regardless of SWAP. */ void _gcry_mpi_swap_cond (gcry_mpi_t a, gcry_mpi_t b, unsigned long swap) { /* Note: dual mask with AND/OR used for EM leakage mitigation */ mpi_limb_t mask1 = ct_limb_gen_mask(swap); mpi_limb_t mask2 = ct_limb_gen_inv_mask(swap); mpi_size_t i; mpi_size_t nlimbs; mpi_limb_t *ua = a->d; mpi_limb_t *ub = b->d; mpi_limb_t xa; mpi_limb_t xb; if (a->alloced > b->alloced) nlimbs = b->alloced; else nlimbs = a->alloced; if (a->nlimbs > nlimbs || b->nlimbs > nlimbs) log_bug ("mpi_swap_cond: different sizes\n"); for (i = 0; i < nlimbs; i++) { xa = ua[i]; xb = ub[i]; ua[i] = (xa & mask2) | (xb & mask1); ub[i] = (xa & mask1) | (xb & mask2); } xa = a->nlimbs; xb = b->nlimbs; a->nlimbs = (xa & mask2) | (xb & mask1); b->nlimbs = (xa & mask1) | (xb & mask2); xa = a->sign; xb = b->sign; a->sign = (xa & mask2) | (xb & mask1); b->sign = (xa & mask1) | (xb & mask2); } /**************** * Set bit N of A, when SET is 1. * This implementation should be constant-time regardless of SET. */ void _gcry_mpi_set_bit_cond (gcry_mpi_t a, unsigned int n, unsigned long set) { unsigned int limbno, bitno; mpi_limb_t set_the_bit = !!set; limbno = n / BITS_PER_MPI_LIMB; bitno = n % BITS_PER_MPI_LIMB; a->d[limbno] |= (set_the_bit<flags |= (16|32); break; case GCRYMPI_FLAG_IMMUTABLE: a->flags |= 16; break; case GCRYMPI_FLAG_USER1: case GCRYMPI_FLAG_USER2: case GCRYMPI_FLAG_USER3: case GCRYMPI_FLAG_USER4: a->flags |= flag; break; case GCRYMPI_FLAG_OPAQUE: default: log_bug("invalid flag value\n"); } } void _gcry_mpi_clear_flag (gcry_mpi_t a, enum gcry_mpi_flag flag) { (void)a; /* Not yet used. */ switch (flag) { case GCRYMPI_FLAG_IMMUTABLE: if (!(a->flags & 32)) a->flags &= ~16; break; case GCRYMPI_FLAG_USER1: case GCRYMPI_FLAG_USER2: case GCRYMPI_FLAG_USER3: case GCRYMPI_FLAG_USER4: a->flags &= ~flag; break; case GCRYMPI_FLAG_CONST: case GCRYMPI_FLAG_SECURE: case GCRYMPI_FLAG_OPAQUE: default: log_bug("invalid flag value\n"); } } int _gcry_mpi_get_flag (gcry_mpi_t a, enum gcry_mpi_flag flag) { switch (flag) { case GCRYMPI_FLAG_SECURE: return !!(a->flags & 1); case GCRYMPI_FLAG_OPAQUE: return !!(a->flags & 4); case GCRYMPI_FLAG_IMMUTABLE: return !!(a->flags & 16); case GCRYMPI_FLAG_CONST: return !!(a->flags & 32); case GCRYMPI_FLAG_USER1: case GCRYMPI_FLAG_USER2: case GCRYMPI_FLAG_USER3: case GCRYMPI_FLAG_USER4: return !!(a->flags & flag); default: log_bug("invalid flag value\n"); } /*NOTREACHED*/ return 0; } /* Return a constant MPI descripbed by NO which is one of the MPI_C_xxx macros. There is no need to copy this returned value; it may be used directly. */ gcry_mpi_t _gcry_mpi_const (enum gcry_mpi_constants no) { if ((int)no < 0 || no > MPI_NUMBER_OF_CONSTANTS) log_bug("invalid mpi_const selector %d\n", no); if (!constants[no]) log_bug("MPI subsystem not initialized\n"); return constants[no]; } grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/mpi/mpi-inline.h0000644000175000017500000001060315036452441022370 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ /* mpi-inline.h - Internal to the Multi Precision Integers * Copyright (C) 1994, 1996, 1998, 1999, * 2001, 2002 Free Software Foundation, Inc. * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . * SPDX-License-Identifier: LGPL-2.1-or-later * * Note: This code is heavily based on the GNU MP Library. * Actually it's the same code with only minor changes in the * way the data is stored; this is to support the abstraction * of an optional secure memory allocation which may be used * to avoid revealing of sensitive data due to paging etc. */ #ifndef G10_MPI_INLINE_H #define G10_MPI_INLINE_H /* Starting with gcc 4.3 "extern inline" conforms in c99 mode to the c99 semantics. To keep the useful old semantics we use an attribute. */ #ifndef G10_MPI_INLINE_DECL # ifdef __GNUC_STDC_INLINE__ # define G10_MPI_INLINE_DECL extern inline __attribute__ ((__gnu_inline__)) # else # define G10_MPI_INLINE_DECL extern __inline__ # endif #endif G10_MPI_INLINE_DECL mpi_limb_t _gcry_mpih_add_1( mpi_ptr_t res_ptr, mpi_ptr_t s1_ptr, mpi_size_t s1_size, mpi_limb_t s2_limb) { mpi_limb_t x; x = *s1_ptr++; s2_limb += x; *res_ptr++ = s2_limb; if( s2_limb < x ) { /* sum is less than the left operand: handle carry */ while( --s1_size ) { x = *s1_ptr++ + 1; /* add carry */ *res_ptr++ = x; /* and store */ if( x ) /* not 0 (no overflow): we can stop */ goto leave; } return 1; /* return carry (size of s1 to small) */ } leave: if( res_ptr != s1_ptr ) { /* not the same variable */ mpi_size_t i; /* copy the rest */ for( i=0; i < s1_size-1; i++ ) res_ptr[i] = s1_ptr[i]; } return 0; /* no carry */ } G10_MPI_INLINE_DECL mpi_limb_t _gcry_mpih_add(mpi_ptr_t res_ptr, mpi_ptr_t s1_ptr, mpi_size_t s1_size, mpi_ptr_t s2_ptr, mpi_size_t s2_size) { mpi_limb_t cy = 0; if( s2_size ) cy = _gcry_mpih_add_n( res_ptr, s1_ptr, s2_ptr, s2_size ); if( s1_size - s2_size ) cy = _gcry_mpih_add_1( res_ptr + s2_size, s1_ptr + s2_size, s1_size - s2_size, cy); return cy; } G10_MPI_INLINE_DECL mpi_limb_t _gcry_mpih_sub_1(mpi_ptr_t res_ptr, mpi_ptr_t s1_ptr, mpi_size_t s1_size, mpi_limb_t s2_limb ) { mpi_limb_t x; x = *s1_ptr++; s2_limb = x - s2_limb; *res_ptr++ = s2_limb; if( s2_limb > x ) { while( --s1_size ) { x = *s1_ptr++; *res_ptr++ = x - 1; if( x ) goto leave; } return 1; } leave: if( res_ptr != s1_ptr ) { mpi_size_t i; for( i=0; i < s1_size-1; i++ ) res_ptr[i] = s1_ptr[i]; } return 0; } G10_MPI_INLINE_DECL mpi_limb_t _gcry_mpih_sub( mpi_ptr_t res_ptr, mpi_ptr_t s1_ptr, mpi_size_t s1_size, mpi_ptr_t s2_ptr, mpi_size_t s2_size) { mpi_limb_t cy = 0; if( s2_size ) cy = _gcry_mpih_sub_n(res_ptr, s1_ptr, s2_ptr, s2_size); if( s1_size - s2_size ) cy = _gcry_mpih_sub_1(res_ptr + s2_size, s1_ptr + s2_size, s1_size - s2_size, cy); return cy; } /**************** * Compare OP1_PTR/OP1_SIZE with OP2_PTR/OP2_SIZE. * There are no restrictions on the relative sizes of * the two arguments. * Return 1 if OP1 > OP2, 0 if they are equal, and -1 if OP1 < OP2. */ G10_MPI_INLINE_DECL int _gcry_mpih_cmp( mpi_ptr_t op1_ptr, mpi_ptr_t op2_ptr, mpi_size_t size ) { mpi_size_t i; mpi_limb_t op1_word, op2_word; for( i = size - 1; i >= 0 ; i--) { op1_word = op1_ptr[i]; op2_word = op2_ptr[i]; if( op1_word != op2_word ) goto diff; } return 0; diff: /* This can *not* be simplified to * op2_word - op2_word * since that expression might give signed overflow. */ return (op1_word > op2_word) ? 1 : -1; } #endif /*G10_MPI_INLINE_H*/ grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/mpi/ec-inline.h0000644000175000017500000011177115036452441022202 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ /* ec-inline.h - EC inline addition/substraction helpers * Copyright (C) 2021 Jussi Kivilinna * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . */ #ifndef GCRY_EC_INLINE_H #define GCRY_EC_INLINE_H #include "mpi-internal.h" #include "longlong.h" #include "ec-context.h" #include "../cipher/bithelp.h" #include "../cipher/bufhelp.h" #if BYTES_PER_MPI_LIMB == 8 /* 64-bit limb definitions for 64-bit architectures. */ #define LIMBS_PER_LIMB64 1 #define LOAD64(x, pos) ((x)[pos]) #define STORE64(x, pos, v) ((x)[pos] = (mpi_limb_t)(v)) #define LIMB_TO64(v) ((mpi_limb_t)(v)) #define LIMB_FROM64(v) ((mpi_limb_t)(v)) #define HIBIT_LIMB64(v) ((mpi_limb_t)(v) >> (BITS_PER_MPI_LIMB - 1)) #define HI32_LIMB64(v) (u32)((mpi_limb_t)(v) >> (BITS_PER_MPI_LIMB - 32)) #define LO32_LIMB64(v) ((u32)(v)) #define LIMB64_C(hi, lo) (((mpi_limb_t)(u32)(hi) << 32) | (u32)(lo)) #define MASK_AND64(mask, val) ((mask) & (val)) #define LIMB_OR64(val1, val2) ((val1) | (val2)) #define STORE64_COND(x, pos, mask1, val1, mask2, val2) \ ((x)[(pos)] = ((mask1) & (val1)) | ((mask2) & (val2))) typedef mpi_limb_t mpi_limb64_t; static inline u32 LOAD32(mpi_ptr_t x, unsigned int pos) { unsigned int shr = (pos % 2) * 32; return (x[pos / 2] >> shr); } static inline mpi_limb64_t LIMB64_HILO(u32 hi, u32 lo) { mpi_limb64_t v = hi; return (v << 32) | lo; } /* x86-64 addition/subtraction helpers. */ #if defined (__x86_64__) && defined(HAVE_CPU_ARCH_X86) && __GNUC__ >= 4 #define ADD3_LIMB64(A2, A1, A0, B2, B1, B0, C2, C1, C0) \ __asm__ ("addq %8, %2\n" \ "adcq %7, %1\n" \ "adcq %6, %0\n" \ : "=r" (A2), \ "=&r" (A1), \ "=&r" (A0) \ : "0" ((mpi_limb_t)(B2)), \ "1" ((mpi_limb_t)(B1)), \ "2" ((mpi_limb_t)(B0)), \ "rme" ((mpi_limb_t)(C2)), \ "rme" ((mpi_limb_t)(C1)), \ "rme" ((mpi_limb_t)(C0)) \ : "cc") #define SUB3_LIMB64(A3, A2, A1, A0, B2, B1, B0, C2, C1, C0) \ __asm__ ("subq %8, %2\n" \ "sbbq %7, %1\n" \ "sbbq %6, %0\n" \ : "=r" (A2), \ "=&r" (A1), \ "=&r" (A0) \ : "0" ((mpi_limb_t)(B2)), \ "1" ((mpi_limb_t)(B1)), \ "2" ((mpi_limb_t)(B0)), \ "rme" ((mpi_limb_t)(C2)), \ "rme" ((mpi_limb_t)(C1)), \ "rme" ((mpi_limb_t)(C0)) \ : "cc") #define ADD4_LIMB64(A3, A2, A1, A0, B3, B2, B1, B0, C3, C2, C1, C0) \ __asm__ ("addq %11, %3\n" \ "adcq %10, %2\n" \ "adcq %9, %1\n" \ "adcq %8, %0\n" \ : "=r" (A3), \ "=&r" (A2), \ "=&r" (A1), \ "=&r" (A0) \ : "0" ((mpi_limb_t)(B3)), \ "1" ((mpi_limb_t)(B2)), \ "2" ((mpi_limb_t)(B1)), \ "3" ((mpi_limb_t)(B0)), \ "rme" ((mpi_limb_t)(C3)), \ "rme" ((mpi_limb_t)(C2)), \ "rme" ((mpi_limb_t)(C1)), \ "rme" ((mpi_limb_t)(C0)) \ : "cc") #define SUB4_LIMB64(A3, A2, A1, A0, B3, B2, B1, B0, C3, C2, C1, C0) \ __asm__ ("subq %11, %3\n" \ "sbbq %10, %2\n" \ "sbbq %9, %1\n" \ "sbbq %8, %0\n" \ : "=r" (A3), \ "=&r" (A2), \ "=&r" (A1), \ "=&r" (A0) \ : "0" ((mpi_limb_t)(B3)), \ "1" ((mpi_limb_t)(B2)), \ "2" ((mpi_limb_t)(B1)), \ "3" ((mpi_limb_t)(B0)), \ "rme" ((mpi_limb_t)(C3)), \ "rme" ((mpi_limb_t)(C2)), \ "rme" ((mpi_limb_t)(C1)), \ "rme" ((mpi_limb_t)(C0)) \ : "cc") #define ADD5_LIMB64(A4, A3, A2, A1, A0, B4, B3, B2, B1, B0, \ C4, C3, C2, C1, C0) \ __asm__ ("addq %14, %4\n" \ "adcq %13, %3\n" \ "adcq %12, %2\n" \ "adcq %11, %1\n" \ "adcq %10, %0\n" \ : "=r" (A4), \ "=&r" (A3), \ "=&r" (A2), \ "=&r" (A1), \ "=&r" (A0) \ : "0" ((mpi_limb_t)(B4)), \ "1" ((mpi_limb_t)(B3)), \ "2" ((mpi_limb_t)(B2)), \ "3" ((mpi_limb_t)(B1)), \ "4" ((mpi_limb_t)(B0)), \ "rme" ((mpi_limb_t)(C4)), \ "rme" ((mpi_limb_t)(C3)), \ "rme" ((mpi_limb_t)(C2)), \ "rme" ((mpi_limb_t)(C1)), \ "rme" ((mpi_limb_t)(C0)) \ : "cc") #define SUB5_LIMB64(A4, A3, A2, A1, A0, B4, B3, B2, B1, B0, \ C4, C3, C2, C1, C0) \ __asm__ ("subq %14, %4\n" \ "sbbq %13, %3\n" \ "sbbq %12, %2\n" \ "sbbq %11, %1\n" \ "sbbq %10, %0\n" \ : "=r" (A4), \ "=&r" (A3), \ "=&r" (A2), \ "=&r" (A1), \ "=&r" (A0) \ : "0" ((mpi_limb_t)(B4)), \ "1" ((mpi_limb_t)(B3)), \ "2" ((mpi_limb_t)(B2)), \ "3" ((mpi_limb_t)(B1)), \ "4" ((mpi_limb_t)(B0)), \ "rme" ((mpi_limb_t)(C4)), \ "rme" ((mpi_limb_t)(C3)), \ "rme" ((mpi_limb_t)(C2)), \ "rme" ((mpi_limb_t)(C1)), \ "rme" ((mpi_limb_t)(C0)) \ : "cc") #endif /* __x86_64__ */ /* ARM AArch64 addition/subtraction helpers. */ #if defined (__aarch64__) && defined(HAVE_CPU_ARCH_ARM) && __GNUC__ >= 4 #define ADD3_LIMB64(A2, A1, A0, B2, B1, B0, C2, C1, C0) \ __asm__ ("adds %2, %5, %8\n" \ "adcs %1, %4, %7\n" \ "adc %0, %3, %6\n" \ : "=r" (A2), \ "=&r" (A1), \ "=&r" (A0) \ : "r" ((mpi_limb_t)(B2)), \ "r" ((mpi_limb_t)(B1)), \ "r" ((mpi_limb_t)(B0)), \ "r" ((mpi_limb_t)(C2)), \ "r" ((mpi_limb_t)(C1)), \ "r" ((mpi_limb_t)(C0)) \ : "cc") #define SUB3_LIMB64(A2, A1, A0, B2, B1, B0, C2, C1, C0) \ __asm__ ("subs %2, %5, %8\n" \ "sbcs %1, %4, %7\n" \ "sbc %0, %3, %6\n" \ : "=r" (A2), \ "=&r" (A1), \ "=&r" (A0) \ : "r" ((mpi_limb_t)(B2)), \ "r" ((mpi_limb_t)(B1)), \ "r" ((mpi_limb_t)(B0)), \ "r" ((mpi_limb_t)(C2)), \ "r" ((mpi_limb_t)(C1)), \ "r" ((mpi_limb_t)(C0)) \ : "cc") #define ADD4_LIMB64(A3, A2, A1, A0, B3, B2, B1, B0, C3, C2, C1, C0) \ __asm__ ("adds %3, %7, %11\n" \ "adcs %2, %6, %10\n" \ "adcs %1, %5, %9\n" \ "adc %0, %4, %8\n" \ : "=r" (A3), \ "=&r" (A2), \ "=&r" (A1), \ "=&r" (A0) \ : "r" ((mpi_limb_t)(B3)), \ "r" ((mpi_limb_t)(B2)), \ "r" ((mpi_limb_t)(B1)), \ "r" ((mpi_limb_t)(B0)), \ "r" ((mpi_limb_t)(C3)), \ "r" ((mpi_limb_t)(C2)), \ "r" ((mpi_limb_t)(C1)), \ "r" ((mpi_limb_t)(C0)) \ : "cc") #define SUB4_LIMB64(A3, A2, A1, A0, B3, B2, B1, B0, C3, C2, C1, C0) \ __asm__ ("subs %3, %7, %11\n" \ "sbcs %2, %6, %10\n" \ "sbcs %1, %5, %9\n" \ "sbc %0, %4, %8\n" \ : "=r" (A3), \ "=&r" (A2), \ "=&r" (A1), \ "=&r" (A0) \ : "r" ((mpi_limb_t)(B3)), \ "r" ((mpi_limb_t)(B2)), \ "r" ((mpi_limb_t)(B1)), \ "r" ((mpi_limb_t)(B0)), \ "r" ((mpi_limb_t)(C3)), \ "r" ((mpi_limb_t)(C2)), \ "r" ((mpi_limb_t)(C1)), \ "r" ((mpi_limb_t)(C0)) \ : "cc") #define ADD5_LIMB64(A4, A3, A2, A1, A0, B4, B3, B2, B1, B0, \ C4, C3, C2, C1, C0) \ __asm__ ("adds %4, %9, %14\n" \ "adcs %3, %8, %13\n" \ "adcs %2, %7, %12\n" \ "adcs %1, %6, %11\n" \ "adc %0, %5, %10\n" \ : "=r" (A4), \ "=&r" (A3), \ "=&r" (A2), \ "=&r" (A1), \ "=&r" (A0) \ : "r" ((mpi_limb_t)(B4)), \ "r" ((mpi_limb_t)(B3)), \ "r" ((mpi_limb_t)(B2)), \ "r" ((mpi_limb_t)(B1)), \ "r" ((mpi_limb_t)(B0)), \ "r" ((mpi_limb_t)(C4)), \ "r" ((mpi_limb_t)(C3)), \ "r" ((mpi_limb_t)(C2)), \ "r" ((mpi_limb_t)(C1)), \ "r" ((mpi_limb_t)(C0)) \ : "cc") #define SUB5_LIMB64(A4, A3, A2, A1, A0, B4, B3, B2, B1, B0, \ C4, C3, C2, C1, C0) \ __asm__ ("subs %4, %9, %14\n" \ "sbcs %3, %8, %13\n" \ "sbcs %2, %7, %12\n" \ "sbcs %1, %6, %11\n" \ "sbc %0, %5, %10\n" \ : "=r" (A4), \ "=&r" (A3), \ "=&r" (A2), \ "=&r" (A1), \ "=&r" (A0) \ : "r" ((mpi_limb_t)(B4)), \ "r" ((mpi_limb_t)(B3)), \ "r" ((mpi_limb_t)(B2)), \ "r" ((mpi_limb_t)(B1)), \ "r" ((mpi_limb_t)(B0)), \ "r" ((mpi_limb_t)(C4)), \ "r" ((mpi_limb_t)(C3)), \ "r" ((mpi_limb_t)(C2)), \ "r" ((mpi_limb_t)(C1)), \ "r" ((mpi_limb_t)(C0)) \ : "cc") #endif /* __aarch64__ */ /* PowerPC64 addition/subtraction helpers. */ #if defined (__powerpc__) && defined(HAVE_CPU_ARCH_PPC) && __GNUC__ >= 4 #define ADD3_LIMB64(A2, A1, A0, B2, B1, B0, C2, C1, C0) \ __asm__ ("addc %2, %8, %5\n" \ "adde %1, %7, %4\n" \ "adde %0, %6, %3\n" \ : "=r" (A2), \ "=&r" (A1), \ "=&r" (A0) \ : "r" ((mpi_limb_t)(B2)), \ "r" ((mpi_limb_t)(B1)), \ "r" ((mpi_limb_t)(B0)), \ "r" ((mpi_limb_t)(C2)), \ "r" ((mpi_limb_t)(C1)), \ "r" ((mpi_limb_t)(C0)) \ : "cc", "r0") #define SUB3_LIMB64(A2, A1, A0, B2, B1, B0, C2, C1, C0) \ __asm__ ("subfc %2, %8, %5\n" \ "subfe %1, %7, %4\n" \ "subfe %0, %6, %3\n" \ : "=r" (A2), \ "=&r" (A1), \ "=&r" (A0) \ : "r" ((mpi_limb_t)(B2)), \ "r" ((mpi_limb_t)(B1)), \ "r" ((mpi_limb_t)(B0)), \ "r" ((mpi_limb_t)(C2)), \ "r" ((mpi_limb_t)(C1)), \ "r" ((mpi_limb_t)(C0)) \ : "cc", "r0") #define ADD4_LIMB64(A3, A2, A1, A0, B3, B2, B1, B0, C3, C2, C1, C0) \ __asm__ ("addc %3, %11, %7\n" \ "adde %2, %10, %6\n" \ "adde %1, %9, %5\n" \ "adde %0, %8, %4\n" \ : "=r" (A3), \ "=&r" (A2), \ "=&r" (A1), \ "=&r" (A0) \ : "r" ((mpi_limb_t)(B3)), \ "r" ((mpi_limb_t)(B2)), \ "r" ((mpi_limb_t)(B1)), \ "r" ((mpi_limb_t)(B0)), \ "r" ((mpi_limb_t)(C3)), \ "r" ((mpi_limb_t)(C2)), \ "r" ((mpi_limb_t)(C1)), \ "r" ((mpi_limb_t)(C0)) \ : "cc") #define SUB4_LIMB64(A3, A2, A1, A0, B3, B2, B1, B0, C3, C2, C1, C0) \ __asm__ ("subfc %3, %11, %7\n" \ "subfe %2, %10, %6\n" \ "subfe %1, %9, %5\n" \ "subfe %0, %8, %4\n" \ : "=r" (A3), \ "=&r" (A2), \ "=&r" (A1), \ "=&r" (A0) \ : "r" ((mpi_limb_t)(B3)), \ "r" ((mpi_limb_t)(B2)), \ "r" ((mpi_limb_t)(B1)), \ "r" ((mpi_limb_t)(B0)), \ "r" ((mpi_limb_t)(C3)), \ "r" ((mpi_limb_t)(C2)), \ "r" ((mpi_limb_t)(C1)), \ "r" ((mpi_limb_t)(C0)) \ : "cc") #define ADD5_LIMB64(A4, A3, A2, A1, A0, B4, B3, B2, B1, B0, \ C4, C3, C2, C1, C0) \ __asm__ ("addc %4, %14, %9\n" \ "adde %3, %13, %8\n" \ "adde %2, %12, %7\n" \ "adde %1, %11, %6\n" \ "adde %0, %10, %5\n" \ : "=r" (A4), \ "=&r" (A3), \ "=&r" (A2), \ "=&r" (A1), \ "=&r" (A0) \ : "r" ((mpi_limb_t)(B4)), \ "r" ((mpi_limb_t)(B3)), \ "r" ((mpi_limb_t)(B2)), \ "r" ((mpi_limb_t)(B1)), \ "r" ((mpi_limb_t)(B0)), \ "r" ((mpi_limb_t)(C4)), \ "r" ((mpi_limb_t)(C3)), \ "r" ((mpi_limb_t)(C2)), \ "r" ((mpi_limb_t)(C1)), \ "r" ((mpi_limb_t)(C0)) \ : "cc") #define SUB5_LIMB64(A4, A3, A2, A1, A0, B4, B3, B2, B1, B0, \ C4, C3, C2, C1, C0) \ __asm__ ("subfc %4, %14, %9\n" \ "subfe %3, %13, %8\n" \ "subfe %2, %12, %7\n" \ "subfe %1, %11, %6\n" \ "subfe %0, %10, %5\n" \ : "=r" (A4), \ "=&r" (A3), \ "=&r" (A2), \ "=&r" (A1), \ "=&r" (A0) \ : "r" ((mpi_limb_t)(B4)), \ "r" ((mpi_limb_t)(B3)), \ "r" ((mpi_limb_t)(B2)), \ "r" ((mpi_limb_t)(B1)), \ "r" ((mpi_limb_t)(B0)), \ "r" ((mpi_limb_t)(C4)), \ "r" ((mpi_limb_t)(C3)), \ "r" ((mpi_limb_t)(C2)), \ "r" ((mpi_limb_t)(C1)), \ "r" ((mpi_limb_t)(C0)) \ : "cc") #endif /* __powerpc__ */ /* s390x/zSeries addition/subtraction helpers. */ #if defined (__s390x__) && defined(HAVE_CPU_ARCH_S390X) && __GNUC__ >= 4 #define ADD3_LIMB64(A2, A1, A0, B2, B1, B0, C2, C1, C0) \ __asm__ ("algr %2, %8\n" \ "alcgr %1, %7\n" \ "alcgr %0, %6\n" \ : "=r" (A2), \ "=&r" (A1), \ "=&r" (A0) \ : "0" ((mpi_limb_t)(B2)), \ "1" ((mpi_limb_t)(B1)), \ "2" ((mpi_limb_t)(B0)), \ "r" ((mpi_limb_t)(C2)), \ "r" ((mpi_limb_t)(C1)), \ "r" ((mpi_limb_t)(C0)) \ : "cc") #define SUB3_LIMB64(A3, A2, A1, A0, B2, B1, B0, C2, C1, C0) \ __asm__ ("slgr %2, %8\n" \ "slbgr %1, %7\n" \ "slbgr %0, %6\n" \ : "=r" (A2), \ "=&r" (A1), \ "=&r" (A0) \ : "0" ((mpi_limb_t)(B2)), \ "1" ((mpi_limb_t)(B1)), \ "2" ((mpi_limb_t)(B0)), \ "r" ((mpi_limb_t)(C2)), \ "r" ((mpi_limb_t)(C1)), \ "r" ((mpi_limb_t)(C0)) \ : "cc") #define ADD4_LIMB64(A3, A2, A1, A0, B3, B2, B1, B0, C3, C2, C1, C0) \ __asm__ ("algr %3, %11\n" \ "alcgr %2, %10\n" \ "alcgr %1, %9\n" \ "alcgr %0, %8\n" \ : "=r" (A3), \ "=&r" (A2), \ "=&r" (A1), \ "=&r" (A0) \ : "0" ((mpi_limb_t)(B3)), \ "1" ((mpi_limb_t)(B2)), \ "2" ((mpi_limb_t)(B1)), \ "3" ((mpi_limb_t)(B0)), \ "r" ((mpi_limb_t)(C3)), \ "r" ((mpi_limb_t)(C2)), \ "r" ((mpi_limb_t)(C1)), \ "r" ((mpi_limb_t)(C0)) \ : "cc") #define SUB4_LIMB64(A3, A2, A1, A0, B3, B2, B1, B0, C3, C2, C1, C0) \ __asm__ ("slgr %3, %11\n" \ "slbgr %2, %10\n" \ "slbgr %1, %9\n" \ "slbgr %0, %8\n" \ : "=r" (A3), \ "=&r" (A2), \ "=&r" (A1), \ "=&r" (A0) \ : "0" ((mpi_limb_t)(B3)), \ "1" ((mpi_limb_t)(B2)), \ "2" ((mpi_limb_t)(B1)), \ "3" ((mpi_limb_t)(B0)), \ "r" ((mpi_limb_t)(C3)), \ "r" ((mpi_limb_t)(C2)), \ "r" ((mpi_limb_t)(C1)), \ "r" ((mpi_limb_t)(C0)) \ : "cc") #define ADD5_LIMB64(A4, A3, A2, A1, A0, B4, B3, B2, B1, B0, \ C4, C3, C2, C1, C0) \ __asm__ ("algr %4, %14\n" \ "alcgr %3, %13\n" \ "alcgr %2, %12\n" \ "alcgr %1, %11\n" \ "alcgr %0, %10\n" \ : "=r" (A4), \ "=&r" (A3), \ "=&r" (A2), \ "=&r" (A1), \ "=&r" (A0) \ : "0" ((mpi_limb_t)(B4)), \ "1" ((mpi_limb_t)(B3)), \ "2" ((mpi_limb_t)(B2)), \ "3" ((mpi_limb_t)(B1)), \ "4" ((mpi_limb_t)(B0)), \ "r" ((mpi_limb_t)(C4)), \ "r" ((mpi_limb_t)(C3)), \ "r" ((mpi_limb_t)(C2)), \ "r" ((mpi_limb_t)(C1)), \ "r" ((mpi_limb_t)(C0)) \ : "cc") #define SUB5_LIMB64(A4, A3, A2, A1, A0, B4, B3, B2, B1, B0, \ C4, C3, C2, C1, C0) \ __asm__ ("slgr %4, %14\n" \ "slbgr %3, %13\n" \ "slbgr %2, %12\n" \ "slbgr %1, %11\n" \ "slbgr %0, %10\n" \ : "=r" (A4), \ "=&r" (A3), \ "=&r" (A2), \ "=&r" (A1), \ "=&r" (A0) \ : "0" ((mpi_limb_t)(B4)), \ "1" ((mpi_limb_t)(B3)), \ "2" ((mpi_limb_t)(B2)), \ "3" ((mpi_limb_t)(B1)), \ "4" ((mpi_limb_t)(B0)), \ "r" ((mpi_limb_t)(C4)), \ "r" ((mpi_limb_t)(C3)), \ "r" ((mpi_limb_t)(C2)), \ "r" ((mpi_limb_t)(C1)), \ "r" ((mpi_limb_t)(C0)) \ : "cc") #endif /* __s390x__ */ /* Common 64-bit arch addition/subtraction macros. */ #define ADD2_LIMB64(A1, A0, B1, B0, C1, C0) \ add_ssaaaa(A1, A0, B1, B0, C1, C0) #define SUB2_LIMB64(A1, A0, B1, B0, C1, C0) \ sub_ddmmss(A1, A0, B1, B0, C1, C0) #endif /* BYTES_PER_MPI_LIMB == 8 */ #if BYTES_PER_MPI_LIMB == 4 /* 64-bit limb definitions for 32-bit architectures. */ #define LIMBS_PER_LIMB64 2 #define LIMB_FROM64(v) ((v).lo) #define HIBIT_LIMB64(v) ((v).hi >> (BITS_PER_MPI_LIMB - 1)) #define HI32_LIMB64(v) ((v).hi) #define LO32_LIMB64(v) ((v).lo) #define LOAD32(x, pos) ((x)[pos]) #define LIMB64_C(hi, lo) { (lo), (hi) } typedef struct { mpi_limb_t lo; mpi_limb_t hi; } mpi_limb64_t; static inline mpi_limb64_t LOAD64(const mpi_ptr_t x, unsigned int pos) { mpi_limb64_t v; v.lo = x[pos * 2 + 0]; v.hi = x[pos * 2 + 1]; return v; } static inline void STORE64(mpi_ptr_t x, unsigned int pos, mpi_limb64_t v) { x[pos * 2 + 0] = v.lo; x[pos * 2 + 1] = v.hi; } static inline mpi_limb64_t MASK_AND64(mpi_limb_t mask, mpi_limb64_t val) { val.lo &= mask; val.hi &= mask; return val; } static inline mpi_limb64_t LIMB_OR64(mpi_limb64_t val1, mpi_limb64_t val2) { val1.lo |= val2.lo; val1.hi |= val2.hi; return val1; } static inline void STORE64_COND(mpi_ptr_t x, unsigned int pos, mpi_limb_t mask1, mpi_limb64_t val1, mpi_limb_t mask2, mpi_limb64_t val2) { x[pos * 2 + 0] = (mask1 & val1.lo) | (mask2 & val2.lo); x[pos * 2 + 1] = (mask1 & val1.hi) | (mask2 & val2.hi); } static inline mpi_limb64_t LIMB_TO64(mpi_limb_t x) { mpi_limb64_t v; v.lo = x; v.hi = 0; return v; } static inline mpi_limb64_t LIMB64_HILO(mpi_limb_t hi, mpi_limb_t lo) { mpi_limb64_t v; v.lo = lo; v.hi = hi; return v; } /* i386 addition/subtraction helpers. */ #if defined (__i386__) && defined(HAVE_CPU_ARCH_X86) && __GNUC__ >= 4 #define ADD2_LIMB32_CARRY_OUT(carry, a1, a0, b1, b0, c1, c0) \ __asm__ ("addl %7, %2\n" \ "adcl %6, %1\n" \ "sbbl %0, %0\n" \ : "=r" (carry), \ "=&r" (a1), \ "=&r" (a0) \ : "0" ((mpi_limb_t)(0)), \ "1" ((mpi_limb_t)(b1)), \ "2" ((mpi_limb_t)(b0)), \ "re" ((mpi_limb_t)(c1)), \ "re" ((mpi_limb_t)(c0)) \ : "cc") #define ADD2_LIMB32_CARRY_IN_OUT(a1, a0, b1, b0, c1, c0, carry) \ __asm__ ("addl $1, %0\n" \ "adcl %7, %2\n" \ "adcl %6, %1\n" \ "sbbl %0, %0\n" \ : "=r" (carry), \ "=&r" (a1), \ "=&r" (a0) \ : "0" ((mpi_limb_t)(carry)), \ "1" ((mpi_limb_t)(b1)), \ "2" ((mpi_limb_t)(b0)), \ "re" ((mpi_limb_t)(c1)), \ "re" ((mpi_limb_t)(c0)) \ : "cc") #define ADD2_LIMB32_CARRY_IN(a1, a0, b1, b0, c1, c0, carry) \ __asm__ ("addl $1, %2\n" \ "adcl %7, %1\n" \ "adcl %6, %0\n" \ : "=r" (a1), \ "=&r" (a0), \ "=&g" (carry) \ : "0" ((mpi_limb_t)(b1)), \ "1" ((mpi_limb_t)(b0)), \ "2" ((mpi_limb_t)(carry)), \ "re" ((mpi_limb_t)(c1)), \ "re" ((mpi_limb_t)(c0)) \ : "cc") #define ADD4_LIMB32(a3, a2, a1, a0, b3, b2, b1, b0, c3, c2, c1, c0) do { \ mpi_limb_t __carry4_32; \ ADD2_LIMB32_CARRY_OUT(__carry4_32, a1, a0, b1, b0, c1, c0); \ ADD2_LIMB32_CARRY_IN(a3, a2, b3, b2, c3, c2, __carry4_32); \ } while (0) #define ADD6_LIMB32(a5, a4, a3, a2, a1, a0, b5, b4, b3, b2, b1, b0, \ c5, c4, c3, c2, c1, c0) do { \ mpi_limb_t __carry6_32; \ ADD2_LIMB32_CARRY_OUT(__carry6_32, a1, a0, b1, b0, c1, c0); \ ADD2_LIMB32_CARRY_IN_OUT(a3, a2, b3, b2, c3, c2, __carry6_32); \ ADD2_LIMB32_CARRY_IN(a5, a4, b5, b4, c5, c4, __carry6_32); \ } while (0) #define ADD8_LIMB32(a7, a6, a5, a4, a3, a2, a1, a0, \ b7, b6, b5, b4, b3, b2, b1, b0, \ c7, c6, c5, c4, c3, c2, c1, c0) do { \ mpi_limb_t __carry8_32; \ ADD2_LIMB32_CARRY_OUT(__carry8_32, a1, a0, b1, b0, c1, c0); \ ADD2_LIMB32_CARRY_IN_OUT(a3, a2, b3, b2, c3, c2, __carry8_32); \ ADD2_LIMB32_CARRY_IN_OUT(a5, a4, b5, b4, c5, c4, __carry8_32); \ ADD2_LIMB32_CARRY_IN(a7, a6, b7, b6, c7, c6, __carry8_32); \ } while (0) #define ADD10_LIMB32(a9, a8, a7, a6, a5, a4, a3, a2, a1, a0, \ b9, b8, b7, b6, b5, b4, b3, b2, b1, b0, \ c9, c8, c7, c6, c5, c4, c3, c2, c1, c0) do { \ mpi_limb_t __carry10_32; \ ADD2_LIMB32_CARRY_OUT(__carry10_32, a1, a0, b1, b0, c1, c0); \ ADD2_LIMB32_CARRY_IN_OUT(a3, a2, b3, b2, c3, c2, __carry10_32); \ ADD2_LIMB32_CARRY_IN_OUT(a5, a4, b5, b4, c5, c4, __carry10_32); \ ADD2_LIMB32_CARRY_IN_OUT(a7, a6, b7, b6, c7, c6, __carry10_32); \ ADD2_LIMB32_CARRY_IN(a9, a8, b9, b8, c9, c8, __carry10_32); \ } while (0) #define ADD14_LIMB32(a13, a12, a11, a10, a9, a8, a7, \ a6, a5, a4, a3, a2, a1, a0, \ b13, b12, b11, b10, b9, b8, b7, \ b6, b5, b4, b3, b2, b1, b0, \ c13, c12, c11, c10, c9, c8, c7, \ c6, c5, c4, c3, c2, c1, c0) do { \ mpi_limb_t __carry14_32; \ ADD2_LIMB32_CARRY_OUT(__carry14_32, a1, a0, b1, b0, c1, c0); \ ADD2_LIMB32_CARRY_IN_OUT(a3, a2, b3, b2, c3, c2, __carry14_32); \ ADD2_LIMB32_CARRY_IN_OUT(a5, a4, b5, b4, c5, c4, __carry14_32); \ ADD2_LIMB32_CARRY_IN_OUT(a7, a6, b7, b6, c7, c6, __carry14_32); \ ADD2_LIMB32_CARRY_IN_OUT(a9, a8, b9, b8, c9, c8, __carry14_32); \ ADD2_LIMB32_CARRY_IN_OUT(a11, a10, b11, b10, c11, c10, __carry14_32); \ ADD2_LIMB32_CARRY_IN(a13, a12, b13, b12, c13, c12, __carry14_32); \ } while (0) #define SUB2_LIMB32_CARRY_OUT(carry, a1, a0, b1, b0, c1, c0) \ __asm__ ("subl %7, %2\n" \ "sbbl %6, %1\n" \ "sbbl %0, %0\n" \ : "=r" (carry), \ "=&r" (a1), \ "=&r" (a0) \ : "0" ((mpi_limb_t)(0)), \ "1" ((mpi_limb_t)(b1)), \ "2" ((mpi_limb_t)(b0)), \ "re" ((mpi_limb_t)(c1)), \ "re" ((mpi_limb_t)(c0)) \ : "cc") #define SUB2_LIMB32_CARRY_IN_OUT(a1, a0, b1, b0, c1, c0, carry) \ __asm__ ("addl $1, %0\n" \ "sbbl %7, %2\n" \ "sbbl %6, %1\n" \ "sbbl %0, %0\n" \ : "=r" (carry), \ "=&r" (a1), \ "=&r" (a0) \ : "0" ((mpi_limb_t)(carry)), \ "1" ((mpi_limb_t)(b1)), \ "2" ((mpi_limb_t)(b0)), \ "re" ((mpi_limb_t)(c1)), \ "re" ((mpi_limb_t)(c0)) \ : "cc") #define SUB2_LIMB32_CARRY_IN(a1, a0, b1, b0, c1, c0, carry) \ __asm__ ("addl $1, %2\n" \ "sbbl %7, %1\n" \ "sbbl %6, %0\n" \ : "=r" (a1), \ "=&r" (a0), \ "=&g" (carry) \ : "0" ((mpi_limb_t)(b1)), \ "1" ((mpi_limb_t)(b0)), \ "2" ((mpi_limb_t)(carry)), \ "re" ((mpi_limb_t)(c1)), \ "re" ((mpi_limb_t)(c0)) \ : "cc") #define SUB4_LIMB32(a3, a2, a1, a0, b3, b2, b1, b0, c3, c2, c1, c0) do { \ mpi_limb_t __carry4_32; \ SUB2_LIMB32_CARRY_OUT(__carry4_32, a1, a0, b1, b0, c1, c0); \ SUB2_LIMB32_CARRY_IN(a3, a2, b3, b2, c3, c2, __carry4_32); \ } while (0) #define SUB6_LIMB32(a5, a4, a3, a2, a1, a0, b5, b4, b3, b2, b1, b0, \ c5, c4, c3, c2, c1, c0) do { \ mpi_limb_t __carry6_32; \ SUB2_LIMB32_CARRY_OUT(__carry6_32, a1, a0, b1, b0, c1, c0); \ SUB2_LIMB32_CARRY_IN_OUT(a3, a2, b3, b2, c3, c2, __carry6_32); \ SUB2_LIMB32_CARRY_IN(a5, a4, b5, b4, c5, c4, __carry6_32); \ } while (0) #define SUB8_LIMB32(a7, a6, a5, a4, a3, a2, a1, a0, \ b7, b6, b5, b4, b3, b2, b1, b0, \ c7, c6, c5, c4, c3, c2, c1, c0) do { \ mpi_limb_t __carry8_32; \ SUB2_LIMB32_CARRY_OUT(__carry8_32, a1, a0, b1, b0, c1, c0); \ SUB2_LIMB32_CARRY_IN_OUT(a3, a2, b3, b2, c3, c2, __carry8_32); \ SUB2_LIMB32_CARRY_IN_OUT(a5, a4, b5, b4, c5, c4, __carry8_32); \ SUB2_LIMB32_CARRY_IN(a7, a6, b7, b6, c7, c6, __carry8_32); \ } while (0) #define SUB10_LIMB32(a9, a8, a7, a6, a5, a4, a3, a2, a1, a0, \ b9, b8, b7, b6, b5, b4, b3, b2, b1, b0, \ c9, c8, c7, c6, c5, c4, c3, c2, c1, c0) do { \ mpi_limb_t __carry10_32; \ SUB2_LIMB32_CARRY_OUT(__carry10_32, a1, a0, b1, b0, c1, c0); \ SUB2_LIMB32_CARRY_IN_OUT(a3, a2, b3, b2, c3, c2, __carry10_32); \ SUB2_LIMB32_CARRY_IN_OUT(a5, a4, b5, b4, c5, c4, __carry10_32); \ SUB2_LIMB32_CARRY_IN_OUT(a7, a6, b7, b6, c7, c6, __carry10_32); \ SUB2_LIMB32_CARRY_IN(a9, a8, b9, b8, c9, c8, __carry10_32); \ } while (0) #define SUB14_LIMB32(a13, a12, a11, a10, a9, a8, a7, \ a6, a5, a4, a3, a2, a1, a0, \ b13, b12, b11, b10, b9, b8, b7, \ b6, b5, b4, b3, b2, b1, b0, \ c13, c12, c11, c10, c9, c8, c7, \ c6, c5, c4, c3, c2, c1, c0) do { \ mpi_limb_t __carry14_32; \ SUB2_LIMB32_CARRY_OUT(__carry14_32, a1, a0, b1, b0, c1, c0); \ SUB2_LIMB32_CARRY_IN_OUT(a3, a2, b3, b2, c3, c2, __carry14_32); \ SUB2_LIMB32_CARRY_IN_OUT(a5, a4, b5, b4, c5, c4, __carry14_32); \ SUB2_LIMB32_CARRY_IN_OUT(a7, a6, b7, b6, c7, c6, __carry14_32); \ SUB2_LIMB32_CARRY_IN_OUT(a9, a8, b9, b8, c9, c8, __carry14_32); \ SUB2_LIMB32_CARRY_IN_OUT(a11, a10, b11, b10, c11, c10, __carry14_32); \ SUB2_LIMB32_CARRY_IN(a13, a12, b13, b12, c13, c12, __carry14_32); \ } while (0) #endif /* __i386__ */ /* ARM addition/subtraction helpers. */ #ifdef HAVE_COMPATIBLE_GCC_ARM_PLATFORM_AS #define ADD4_LIMB32(A3, A2, A1, A0, B3, B2, B1, B0, C3, C2, C1, C0) \ __asm__ ("adds %3, %7, %11\n" \ "adcs %2, %6, %10\n" \ "adcs %1, %5, %9\n" \ "adc %0, %4, %8\n" \ : "=r" (A3), \ "=&r" (A2), \ "=&r" (A1), \ "=&r" (A0) \ : "r" ((mpi_limb_t)(B3)), \ "r" ((mpi_limb_t)(B2)), \ "r" ((mpi_limb_t)(B1)), \ "r" ((mpi_limb_t)(B0)), \ "Ir" ((mpi_limb_t)(C3)), \ "Ir" ((mpi_limb_t)(C2)), \ "Ir" ((mpi_limb_t)(C1)), \ "Ir" ((mpi_limb_t)(C0)) \ : "cc") #define ADD6_LIMB32(A5, A4, A3, A2, A1, A0, B5, B4, B3, B2, B1, B0, \ C5, C4, C3, C2, C1, C0) do { \ mpi_limb_t __carry6_32; \ __asm__ ("adds %3, %7, %10\n" \ "adcs %2, %6, %9\n" \ "adcs %1, %5, %8\n" \ "adc %0, %4, %4\n" \ : "=r" (__carry6_32), \ "=&r" (A2), \ "=&r" (A1), \ "=&r" (A0) \ : "r" ((mpi_limb_t)(0)), \ "r" ((mpi_limb_t)(B2)), \ "r" ((mpi_limb_t)(B1)), \ "r" ((mpi_limb_t)(B0)), \ "Ir" ((mpi_limb_t)(C2)), \ "Ir" ((mpi_limb_t)(C1)), \ "Ir" ((mpi_limb_t)(C0)) \ : "cc"); \ ADD4_LIMB32(A5, A4, A3, __carry6_32, B5, B4, B3, __carry6_32, \ C5, C4, C3, 0xffffffffU); \ } while (0) #define SUB4_LIMB32(A3, A2, A1, A0, B3, B2, B1, B0, C3, C2, C1, C0) \ __asm__ ("subs %3, %7, %11\n" \ "sbcs %2, %6, %10\n" \ "sbcs %1, %5, %9\n" \ "sbc %0, %4, %8\n" \ : "=r" (A3), \ "=&r" (A2), \ "=&r" (A1), \ "=&r" (A0) \ : "r" ((mpi_limb_t)(B3)), \ "r" ((mpi_limb_t)(B2)), \ "r" ((mpi_limb_t)(B1)), \ "r" ((mpi_limb_t)(B0)), \ "Ir" ((mpi_limb_t)(C3)), \ "Ir" ((mpi_limb_t)(C2)), \ "Ir" ((mpi_limb_t)(C1)), \ "Ir" ((mpi_limb_t)(C0)) \ : "cc") #define SUB6_LIMB32(A5, A4, A3, A2, A1, A0, B5, B4, B3, B2, B1, B0, \ C5, C4, C3, C2, C1, C0) do { \ mpi_limb_t __borrow6_32; \ __asm__ ("subs %3, %7, %10\n" \ "sbcs %2, %6, %9\n" \ "sbcs %1, %5, %8\n" \ "sbc %0, %4, %4\n" \ : "=r" (__borrow6_32), \ "=&r" (A2), \ "=&r" (A1), \ "=&r" (A0) \ : "r" ((mpi_limb_t)(0)), \ "r" ((mpi_limb_t)(B2)), \ "r" ((mpi_limb_t)(B1)), \ "r" ((mpi_limb_t)(B0)), \ "Ir" ((mpi_limb_t)(C2)), \ "Ir" ((mpi_limb_t)(C1)), \ "Ir" ((mpi_limb_t)(C0)) \ : "cc"); \ SUB4_LIMB32(A5, A4, A3, __borrow6_32, B5, B4, B3, 0, \ C5, C4, C3, -__borrow6_32); \ } while (0) #endif /* HAVE_COMPATIBLE_GCC_ARM_PLATFORM_AS */ #if defined (__hppa) && __GNUC__ >= 4 #define ADD4_LIMB32(A3, A2, A1, A0, B3, B2, B1, B0, C3, C2, C1, C0) \ __asm__ ("add %7,%11,%3\n\t" \ "addc %6,%10,%2\n\t" \ "addc %5,%9,%1\n\t" \ "addc %4,%8,%0" \ : "=r" (A3), \ "=&r" (A2), \ "=&r" (A1), \ "=&r" (A0) \ : "rM" ((mpi_limb_t)(B3)), \ "rM" ((mpi_limb_t)(B2)), \ "rM" ((mpi_limb_t)(B1)), \ "rM" ((mpi_limb_t)(B0)), \ "rM" ((mpi_limb_t)(C3)), \ "rM" ((mpi_limb_t)(C2)), \ "rM" ((mpi_limb_t)(C1)), \ "rM" ((mpi_limb_t)(C0)) \ : "cc") #define SUB4_LIMB32(A3, A2, A1, A0, B3, B2, B1, B0, C3, C2, C1, C0) \ __asm__ ("sub %7,%11,%3\n\t" \ "subb %6,%10,%2\n\t" \ "subb %5,%9,%1\n\t" \ "subb %4,%8,%0\n\t" \ : "=r" (A3), \ "=&r" (A2), \ "=&r" (A1), \ "=&r" (A0) \ : "rM" ((mpi_limb_t)(B3)), \ "rM" ((mpi_limb_t)(B2)), \ "rM" ((mpi_limb_t)(B1)), \ "rM" ((mpi_limb_t)(B0)), \ "rM" ((mpi_limb_t)(C3)), \ "rM" ((mpi_limb_t)(C2)), \ "rM" ((mpi_limb_t)(C1)), \ "rM" ((mpi_limb_t)(C0)) \ : "cc") #endif /* __hppa */ /* Common 32-bit arch addition/subtraction macros. */ #if defined(ADD4_LIMB32) /* A[0..1] = B[0..1] + C[0..1] */ #define ADD2_LIMB64(A1, A0, B1, B0, C1, C0) \ ADD4_LIMB32(A1.hi, A1.lo, A0.hi, A0.lo, \ B1.hi, B1.lo, B0.hi, B0.lo, \ C1.hi, C1.lo, C0.hi, C0.lo) #else /* A[0..1] = B[0..1] + C[0..1] */ #define ADD2_LIMB64(A1, A0, B1, B0, C1, C0) do { \ mpi_limb_t __carry2_0, __carry2_1; \ add_ssaaaa(__carry2_0, A0.lo, 0, B0.lo, 0, C0.lo); \ add_ssaaaa(__carry2_1, A0.hi, 0, B0.hi, 0, C0.hi); \ add_ssaaaa(__carry2_1, A0.hi, __carry2_1, A0.hi, 0, __carry2_0); \ add_ssaaaa(A1.hi, A1.lo, B1.hi, B1.lo, C1.hi, C1.lo); \ add_ssaaaa(A1.hi, A1.lo, A1.hi, A1.lo, 0, __carry2_1); \ } while (0) #endif #if defined(ADD6_LIMB32) /* A[0..2] = B[0..2] + C[0..2] */ #define ADD3_LIMB64(A2, A1, A0, B2, B1, B0, C2, C1, C0) \ ADD6_LIMB32(A2.hi, A2.lo, A1.hi, A1.lo, A0.hi, A0.lo, \ B2.hi, B2.lo, B1.hi, B1.lo, B0.hi, B0.lo, \ C2.hi, C2.lo, C1.hi, C1.lo, C0.hi, C0.lo) #endif #if defined(ADD8_LIMB32) /* A[0..3] = B[0..3] + C[0..3] */ #define ADD4_LIMB64(A3, A2, A1, A0, B3, B2, B1, B0, C3, C2, C1, C0) \ ADD8_LIMB32(A3.hi, A3.lo, A2.hi, A2.lo, A1.hi, A1.lo, A0.hi, A0.lo, \ B3.hi, B3.lo, B2.hi, B2.lo, B1.hi, B1.lo, B0.hi, B0.lo, \ C3.hi, C3.lo, C2.hi, C2.lo, C1.hi, C1.lo, C0.hi, C0.lo) #elif defined(ADD6_LIMB32) /* A[0..3] = B[0..3] + C[0..3] */ #define ADD4_LIMB64(A3, A2, A1, A0, B3, B2, B1, B0, C3, C2, C1, C0) do { \ mpi_limb_t __carry4; \ ADD6_LIMB32(__carry4, A2.lo, A1.hi, A1.lo, A0.hi, A0.lo, \ 0, B2.lo, B1.hi, B1.lo, B0.hi, B0.lo, \ 0, C2.lo, C1.hi, C1.lo, C0.hi, C0.lo); \ ADD4_LIMB32(A3.hi, A3.lo, A2.hi, __carry4, \ B3.hi, B3.lo, B2.hi, __carry4, \ C3.hi, C3.lo, C2.hi, 0xffffffffU); \ } while (0) #endif #if defined(ADD10_LIMB32) /* A[0..4] = B[0..4] + C[0..4] */ #define ADD5_LIMB64(A4, A3, A2, A1, A0, B4, B3, B2, B1, B0, \ C4, C3, C2, C1, C0) \ ADD10_LIMB32(A4.hi, A4.lo, A3.hi, A3.lo, A2.hi, A2.lo, A1.hi, A1.lo, \ A0.hi, A0.lo, B4.hi, B4.lo, B3.hi, B3.lo, B2.hi, B2.lo, \ B1.hi, B1.lo, B0.hi, B0.lo, C4.hi, C4.lo, C3.hi, C3.lo, \ C2.hi, C2.lo, C1.hi, C1.lo, C0.hi, C0.lo) #endif #if defined(ADD14_LIMB32) /* A[0..6] = B[0..6] + C[0..6] */ #define ADD7_LIMB64(A6, A5, A4, A3, A2, A1, A0, B6, B5, B4, B3, B2, B1, B0, \ C6, C5, C4, C3, C2, C1, C0) \ ADD14_LIMB32(A6.hi, A6.lo, A5.hi, A5.lo, A4.hi, A4.lo, A3.hi, A3.lo, \ A2.hi, A2.lo, A1.hi, A1.lo, A0.hi, A0.lo, B6.hi, B6.lo, \ B5.hi, B5.lo, B4.hi, B4.lo, B3.hi, B3.lo, B2.hi, B2.lo, \ B1.hi, B1.lo, B0.hi, B0.lo, C6.hi, C6.lo, C5.hi, C5.lo, \ C4.hi, C4.lo, C3.hi, C3.lo, C2.hi, C2.lo, C1.hi, C1.lo, \ C0.hi, C0.lo) #endif #if defined(SUB4_LIMB32) /* A[0..1] = B[0..1] - C[0..1] */ #define SUB2_LIMB64(A1, A0, B1, B0, C1, C0) \ SUB4_LIMB32(A1.hi, A1.lo, A0.hi, A0.lo, \ B1.hi, B1.lo, B0.hi, B0.lo, \ C1.hi, C1.lo, C0.hi, C0.lo) #else /* A[0..1] = B[0..1] - C[0..1] */ #define SUB2_LIMB64(A1, A0, B1, B0, C1, C0) do { \ mpi_limb_t __borrow2_0, __borrow2_1; \ sub_ddmmss(__borrow2_0, A0.lo, 0, B0.lo, 0, C0.lo); \ sub_ddmmss(__borrow2_1, A0.hi, 0, B0.hi, 0, C0.hi); \ sub_ddmmss(__borrow2_1, A0.hi, __borrow2_1, A0.hi, 0, -__borrow2_0); \ sub_ddmmss(A1.hi, A1.lo, B1.hi, B1.lo, C1.hi, C1.lo); \ sub_ddmmss(A1.hi, A1.lo, A1.hi, A1.lo, 0, -__borrow2_1); \ } while (0) #endif #if defined(SUB6_LIMB32) /* A[0..2] = B[0..2] - C[0..2] */ #define SUB3_LIMB64(A2, A1, A0, B2, B1, B0, C2, C1, C0) \ SUB6_LIMB32(A2.hi, A2.lo, A1.hi, A1.lo, A0.hi, A0.lo, \ B2.hi, B2.lo, B1.hi, B1.lo, B0.hi, B0.lo, \ C2.hi, C2.lo, C1.hi, C1.lo, C0.hi, C0.lo) #endif #if defined(SUB8_LIMB32) /* A[0..3] = B[0..3] - C[0..3] */ #define SUB4_LIMB64(A3, A2, A1, A0, B3, B2, B1, B0, C3, C2, C1, C0) \ SUB8_LIMB32(A3.hi, A3.lo, A2.hi, A2.lo, A1.hi, A1.lo, A0.hi, A0.lo, \ B3.hi, B3.lo, B2.hi, B2.lo, B1.hi, B1.lo, B0.hi, B0.lo, \ C3.hi, C3.lo, C2.hi, C2.lo, C1.hi, C1.lo, C0.hi, C0.lo) #elif defined(SUB6_LIMB32) /* A[0..3] = B[0..3] - C[0..3] */ #define SUB4_LIMB64(A3, A2, A1, A0, B3, B2, B1, B0, C3, C2, C1, C0) do { \ mpi_limb_t __borrow4; \ SUB6_LIMB32(__borrow4, A2.lo, A1.hi, A1.lo, A0.hi, A0.lo, \ 0, B2.lo, B1.hi, B1.lo, B0.hi, B0.lo, \ 0, C2.lo, C1.hi, C1.lo, C0.hi, C0.lo); \ SUB4_LIMB32(A3.hi, A3.lo, A2.hi, __borrow4, \ B3.hi, B3.lo, B2.hi, 0, \ C3.hi, C3.lo, C2.hi, -__borrow4); \ } while (0) #endif #if defined(SUB10_LIMB32) /* A[0..4] = B[0..4] - C[0..4] */ #define SUB5_LIMB64(A4, A3, A2, A1, A0, B4, B3, B2, B1, B0, \ C4, C3, C2, C1, C0) \ SUB10_LIMB32(A4.hi, A4.lo, A3.hi, A3.lo, A2.hi, A2.lo, A1.hi, A1.lo, \ A0.hi, A0.lo, B4.hi, B4.lo, B3.hi, B3.lo, B2.hi, B2.lo, \ B1.hi, B1.lo, B0.hi, B0.lo, C4.hi, C4.lo, C3.hi, C3.lo, \ C2.hi, C2.lo, C1.hi, C1.lo, C0.hi, C0.lo) #endif #if defined(SUB14_LIMB32) /* A[0..6] = B[0..6] - C[0..6] */ #define SUB7_LIMB64(A6, A5, A4, A3, A2, A1, A0, B6, B5, B4, B3, B2, B1, B0, \ C6, C5, C4, C3, C2, C1, C0) \ SUB14_LIMB32(A6.hi, A6.lo, A5.hi, A5.lo, A4.hi, A4.lo, A3.hi, A3.lo, \ A2.hi, A2.lo, A1.hi, A1.lo, A0.hi, A0.lo, B6.hi, B6.lo, \ B5.hi, B5.lo, B4.hi, B4.lo, B3.hi, B3.lo, B2.hi, B2.lo, \ B1.hi, B1.lo, B0.hi, B0.lo, C6.hi, C6.lo, C5.hi, C5.lo, \ C4.hi, C4.lo, C3.hi, C3.lo, C2.hi, C2.lo, C1.hi, C1.lo, \ C0.hi, C0.lo) #endif #endif /* BYTES_PER_MPI_LIMB == 4 */ /* Common definitions. */ #define BITS_PER_MPI_LIMB64 (BITS_PER_MPI_LIMB * LIMBS_PER_LIMB64) #define BYTES_PER_MPI_LIMB64 (BYTES_PER_MPI_LIMB * LIMBS_PER_LIMB64) /* Common addition/subtraction macros. */ #ifndef ADD3_LIMB64 /* A[0..2] = B[0..2] + C[0..2] */ #define ADD3_LIMB64(A2, A1, A0, B2, B1, B0, C2, C1, C0) do { \ mpi_limb64_t __carry3; \ ADD2_LIMB64(__carry3, A0, zero, B0, zero, C0); \ ADD2_LIMB64(A2, A1, B2, B1, C2, C1); \ ADD2_LIMB64(A2, A1, A2, A1, zero, __carry3); \ } while (0) #endif #ifndef ADD4_LIMB64 /* A[0..3] = B[0..3] + C[0..3] */ #define ADD4_LIMB64(A3, A2, A1, A0, B3, B2, B1, B0, C3, C2, C1, C0) do { \ mpi_limb64_t __carry4; \ ADD3_LIMB64(__carry4, A1, A0, zero, B1, B0, zero, C1, C0); \ ADD2_LIMB64(A3, A2, B3, B2, C3, C2); \ ADD2_LIMB64(A3, A2, A3, A2, zero, __carry4); \ } while (0) #endif #ifndef ADD5_LIMB64 /* A[0..4] = B[0..4] + C[0..4] */ #define ADD5_LIMB64(A4, A3, A2, A1, A0, B4, B3, B2, B1, B0, \ C4, C3, C2, C1, C0) do { \ mpi_limb64_t __carry5; \ ADD4_LIMB64(__carry5, A2, A1, A0, zero, B2, B1, B0, zero, C2, C1, C0); \ ADD2_LIMB64(A4, A3, B4, B3, C4, C3); \ ADD2_LIMB64(A4, A3, A4, A3, zero, __carry5); \ } while (0) #endif #ifndef ADD7_LIMB64 /* A[0..6] = B[0..6] + C[0..6] */ #define ADD7_LIMB64(A6, A5, A4, A3, A2, A1, A0, B6, B5, B4, B3, B2, B1, B0, \ C6, C5, C4, C3, C2, C1, C0) do { \ mpi_limb64_t __carry7; \ ADD4_LIMB64(__carry7, A2, A1, A0, zero, B2, B1, B0, \ zero, C2, C1, C0); \ ADD5_LIMB64(A6, A5, A4, A3, __carry7, B6, B5, B4, B3, \ __carry7, C6, C5, C4, C3, LIMB64_HILO(-1, -1)); \ } while (0) #endif #ifndef SUB3_LIMB64 /* A[0..2] = B[0..2] - C[0..2] */ #define SUB3_LIMB64(A2, A1, A0, B2, B1, B0, C2, C1, C0) do { \ mpi_limb64_t __borrow3; \ SUB2_LIMB64(__borrow3, A0, zero, B0, zero, C0); \ SUB2_LIMB64(A2, A1, B2, B1, C2, C1); \ SUB2_LIMB64(A2, A1, A2, A1, zero, LIMB_TO64(-LIMB_FROM64(__borrow3))); \ } while (0) #endif #ifndef SUB4_LIMB64 /* A[0..3] = B[0..3] - C[0..3] */ #define SUB4_LIMB64(A3, A2, A1, A0, B3, B2, B1, B0, C3, C2, C1, C0) do { \ mpi_limb64_t __borrow4; \ SUB3_LIMB64(__borrow4, A1, A0, zero, B1, B0, zero, C1, C0); \ SUB2_LIMB64(A3, A2, B3, B2, C3, C2); \ SUB2_LIMB64(A3, A2, A3, A2, zero, LIMB_TO64(-LIMB_FROM64(__borrow4))); \ } while (0) #endif #ifndef SUB5_LIMB64 /* A[0..4] = B[0..4] - C[0..4] */ #define SUB5_LIMB64(A4, A3, A2, A1, A0, B4, B3, B2, B1, B0, \ C4, C3, C2, C1, C0) do { \ mpi_limb64_t __borrow5; \ SUB4_LIMB64(__borrow5, A2, A1, A0, zero, B2, B1, B0, zero, C2, C1, C0); \ SUB2_LIMB64(A4, A3, B4, B3, C4, C3); \ SUB2_LIMB64(A4, A3, A4, A3, zero, LIMB_TO64(-LIMB_FROM64(__borrow5))); \ } while (0) #endif #ifndef SUB7_LIMB64 /* A[0..6] = B[0..6] - C[0..6] */ #define SUB7_LIMB64(A6, A5, A4, A3, A2, A1, A0, B6, B5, B4, B3, B2, B1, B0, \ C6, C5, C4, C3, C2, C1, C0) do { \ mpi_limb64_t __borrow7; \ SUB4_LIMB64(__borrow7, A2, A1, A0, zero, B2, B1, B0, \ zero, C2, C1, C0); \ SUB5_LIMB64(A6, A5, A4, A3, __borrow7, B6, B5, B4, B3, zero, \ C6, C5, C4, C3, LIMB_TO64(-LIMB_FROM64(__borrow7))); \ } while (0) #endif #if defined(WORDS_BIGENDIAN) || (BITS_PER_MPI_LIMB64 != BITS_PER_MPI_LIMB) #define LOAD64_UNALIGNED(x, pos) \ LIMB64_HILO(LOAD32(x, 2 * (pos) + 2), LOAD32(x, 2 * (pos) + 1)) #else #define LOAD64_UNALIGNED(x, pos) \ buf_get_le64((const byte *)(&(x)[pos]) + 4) #endif /* Helper functions. */ static inline int mpi_nbits_more_than (gcry_mpi_t w, unsigned int nbits) { unsigned int nbits_nlimbs; mpi_limb_t wlimb; unsigned int n; nbits_nlimbs = (nbits + BITS_PER_MPI_LIMB - 1) / BITS_PER_MPI_LIMB; /* Note: Assumes that 'w' is normalized. */ if (w->nlimbs > nbits_nlimbs) return 1; if (w->nlimbs < nbits_nlimbs) return 0; if ((nbits % BITS_PER_MPI_LIMB) == 0) return 0; wlimb = w->d[nbits_nlimbs - 1]; if (wlimb == 0) log_bug ("mpi_nbits_more_than: input mpi not normalized\n"); count_leading_zeros (n, wlimb); return (BITS_PER_MPI_LIMB - n) > (nbits % BITS_PER_MPI_LIMB); } #endif /* GCRY_EC_INLINE_H */ grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/mpi/generic/0000755000175000017500000000000015036452441021652 500000000000000grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/mpi/generic/mpih-lshift.c0000644000175000017500000000415215036452441024164 00000000000000/* mpi-lshift.c - MPI helper functions * Copyright (C) 1994, 1996, 1998, 2001, 2002 Free Software Foundation, Inc. * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . * SPDX-License-Identifier: LGPL-2.1-or-later * * Note: This code is heavily based on the GNU MP Library. * Actually it's the same code with only minor changes in the * way the data is stored; this is to support the abstraction * of an optional secure memory allocation which may be used * to avoid revealing of sensitive data due to paging etc. */ #include #include #include #include "mpi-internal.h" /* Shift U (pointed to by UP and USIZE digits long) CNT bits to the left * and store the USIZE least significant digits of the result at WP. * Return the bits shifted out from the most significant digit. * * Argument constraints: * 1. 0 < CNT < BITS_PER_MP_LIMB * 2. If the result is to be written over the input, WP must be >= UP. */ mpi_limb_t _gcry_mpih_lshift( mpi_ptr_t wp, mpi_ptr_t up, mpi_size_t usize, unsigned int cnt) { mpi_limb_t high_limb, low_limb; unsigned sh_1, sh_2; mpi_size_t i; mpi_limb_t retval; sh_1 = cnt; wp += 1; sh_2 = BITS_PER_MPI_LIMB - sh_1; i = usize - 1; low_limb = up[i]; retval = low_limb >> sh_2; high_limb = low_limb; while ( --i >= 0 ) { low_limb = up[i]; wp[i] = (high_limb << sh_1) | (low_limb >> sh_2); high_limb = low_limb; } wp[i] = high_limb << sh_1; return retval; } grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/mpi/generic/mpih-mul1.c0000644000175000017500000000367115036452441023556 00000000000000/* mpihelp-mul_1.c - MPI helper functions * Copyright (C) 1994, 1996, 1997, 1998, 2001, * 2002 Free Software Foundation, Inc. * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . * SPDX-License-Identifier: LGPL-2.1-or-later * * Note: This code is heavily based on the GNU MP Library. * Actually it's the same code with only minor changes in the * way the data is stored; this is to support the abstraction * of an optional secure memory allocation which may be used * to avoid revealing of sensitive data due to paging etc. */ #include #include #include #include "mpi-internal.h" #include "longlong.h" mpi_limb_t _gcry_mpih_mul_1( mpi_ptr_t res_ptr, mpi_ptr_t s1_ptr, mpi_size_t s1_size, mpi_limb_t s2_limb) { mpi_limb_t cy_limb; mpi_size_t j; mpi_limb_t prod_high, prod_low; /* The loop counter and index J goes from -S1_SIZE to -1. This way * the loop becomes faster. */ j = -s1_size; /* Offset the base pointers to compensate for the negative indices. */ s1_ptr -= j; res_ptr -= j; cy_limb = 0; do { umul_ppmm( prod_high, prod_low, s1_ptr[j], s2_limb ); prod_low += cy_limb; cy_limb = (prod_low < cy_limb?1:0) + prod_high; res_ptr[j] = prod_low; } while( ++j ); return cy_limb; } grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/mpi/generic/distfiles0000644000175000017500000000016615036452441023506 00000000000000mpih-add1.c mpih-mul1.c mpih-mul2.c mpih-mul3.c mpih-lshift.c mpih-rshift.c mpih-sub1.c udiv-w-sdiv.c mpi-asm-defs.h grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/mpi/generic/mpih-mul2.c0000644000175000017500000000372615036452441023560 00000000000000/* mpih-mul2.c - MPI helper functions * Copyright (C) 1994, 1996, 1997, 1998, 2001, * 2002 Free Software Foundation, Inc. * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . * SPDX-License-Identifier: LGPL-2.1-or-later * * Note: This code is heavily based on the GNU MP Library. * Actually it's the same code with only minor changes in the * way the data is stored; this is to support the abstraction * of an optional secure memory allocation which may be used * to avoid revealing of sensitive data due to paging etc. */ #include #include #include #include "mpi-internal.h" #include "longlong.h" mpi_limb_t _gcry_mpih_addmul_1( mpi_ptr_t res_ptr, mpi_ptr_t s1_ptr, mpi_size_t s1_size, mpi_limb_t s2_limb) { mpi_limb_t cy_limb; mpi_size_t j; mpi_limb_t prod_high, prod_low; mpi_limb_t x; /* The loop counter and index J goes from -SIZE to -1. This way * the loop becomes faster. */ j = -s1_size; res_ptr -= j; s1_ptr -= j; cy_limb = 0; do { umul_ppmm( prod_high, prod_low, s1_ptr[j], s2_limb ); prod_low += cy_limb; cy_limb = (prod_low < cy_limb?1:0) + prod_high; x = res_ptr[j]; prod_low = x + prod_low; cy_limb += prod_low < x?1:0; res_ptr[j] = prod_low; } while ( ++j ); return cy_limb; } grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/mpi/generic/mpih-add1.c0000644000175000017500000000401715036452441023504 00000000000000/* mpihelp-add_1.c - MPI helper functions * Copyright (C) 1994, 1996, 1997, 1998, * 2000, 2002 Free Software Foundation, Inc. * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . * SPDX-License-Identifier: LGPL-2.1-or-later * * Note: This code is heavily based on the GNU MP Library. * Actually it's the same code with only minor changes in the * way the data is stored; this is to support the abstraction * of an optional secure memory allocation which may be used * to avoid revealing of sensitive data due to paging etc. */ #include #include #include #include "mpi-internal.h" #include "longlong.h" mpi_limb_t _gcry_mpih_add_n (mpi_ptr_t res_ptr, mpi_ptr_t s1_ptr, mpi_ptr_t s2_ptr, mpi_size_t size) { mpi_limb_t x, y, cy; mpi_size_t j; /* The loop counter and index J goes from -SIZE to -1. This way the loop becomes faster. */ j = -size; /* Offset the base pointers to compensate for the negative indices. */ s1_ptr -= j; s2_ptr -= j; res_ptr -= j; cy = 0; do { y = s2_ptr[j]; x = s1_ptr[j]; y += cy; /* add previous carry to one addend */ cy = y < cy; /* get out carry from that addition */ y += x; /* add other addend */ cy += y < x; /* get out carry from that add, combine */ res_ptr[j] = y; } while ( ++j ); return cy; } grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/mpi/generic/udiv-w-sdiv.c0000644000175000017500000000562515036452441024124 00000000000000/* mpih-w-sdiv -- implement udiv_qrnnd on machines with only signed * division. * Copyright (C) 1992, 1994, 1996, 1998, 2002 Free Software Foundation, Inc. * Contributed by Peter L. Montgomery. * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . * SPDX-License-Identifier: LGPL-2.1-or-later */ #include #include #include #include "mpi-internal.h" #include "longlong.h" #if 0 /* not yet ported to MPI */ mpi_limb_t mpihelp_udiv_w_sdiv( mpi_limp_t *rp, mpi_limp_t *a1, mpi_limp_t *a0, mpi_limp_t *d ) { mp_limb_t q, r; mp_limb_t c0, c1, b1; if ((mpi_limb_signed_t) d >= 0) { if (a1 < d - a1 - (a0 >> (BITS_PER_MP_LIMB - 1))) { /* dividend, divisor, and quotient are nonnegative */ sdiv_qrnnd (q, r, a1, a0, d); } else { /* Compute c1*2^32 + c0 = a1*2^32 + a0 - 2^31*d */ sub_ddmmss (c1, c0, a1, a0, d >> 1, d << (BITS_PER_MP_LIMB - 1)); /* Divide (c1*2^32 + c0) by d */ sdiv_qrnnd (q, r, c1, c0, d); /* Add 2^31 to quotient */ q += (mp_limb_t) 1 << (BITS_PER_MP_LIMB - 1); } } else { b1 = d >> 1; /* d/2, between 2^30 and 2^31 - 1 */ c1 = a1 >> 1; /* A/2 */ c0 = (a1 << (BITS_PER_MP_LIMB - 1)) + (a0 >> 1); if (a1 < b1) /* A < 2^32*b1, so A/2 < 2^31*b1 */ { sdiv_qrnnd (q, r, c1, c0, b1); /* (A/2) / (d/2) */ r = 2*r + (a0 & 1); /* Remainder from A/(2*b1) */ if ((d & 1) != 0) { if (r >= q) r = r - q; else if (q - r <= d) { r = r - q + d; q--; } else { r = r - q + 2*d; q -= 2; } } } else if (c1 < b1) /* So 2^31 <= (A/2)/b1 < 2^32 */ { c1 = (b1 - 1) - c1; c0 = ~c0; /* logical NOT */ sdiv_qrnnd (q, r, c1, c0, b1); /* (A/2) / (d/2) */ q = ~q; /* (A/2)/b1 */ r = (b1 - 1) - r; r = 2*r + (a0 & 1); /* A/(2*b1) */ if ((d & 1) != 0) { if (r >= q) r = r - q; else if (q - r <= d) { r = r - q + d; q--; } else { r = r - q + 2*d; q -= 2; } } } else /* Implies c1 = b1 */ { /* Hence a1 = d - 1 = 2*b1 - 1 */ if (a0 >= -d) { q = -1; r = a0 + d; } else { q = -2; r = a0 + 2*d; } } } *rp = r; return q; } #endif grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/mpi/generic/mpih-sub1.c0000644000175000017500000000401015036452441023536 00000000000000/* mpihelp-add_2.c - MPI helper functions * Copyright (C) 1994, 1996, 1997, 1998, 2001, * 2002 Free Software Foundation, Inc. * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . * SPDX-License-Identifier: LGPL-2.1-or-later * * Note: This code is heavily based on the GNU MP Library. * Actually it's the same code with only minor changes in the * way the data is stored; this is to support the abstraction * of an optional secure memory allocation which may be used * to avoid revealing of sensitive data due to paging etc. */ #include #include #include #include "mpi-internal.h" #include "longlong.h" mpi_limb_t _gcry_mpih_sub_n( mpi_ptr_t res_ptr, mpi_ptr_t s1_ptr, mpi_ptr_t s2_ptr, mpi_size_t size) { mpi_limb_t x, y, cy; mpi_size_t j; /* The loop counter and index J goes from -SIZE to -1. This way the loop becomes faster. */ j = -size; /* Offset the base pointers to compensate for the negative indices. */ s1_ptr -= j; s2_ptr -= j; res_ptr -= j; cy = 0; do { y = s2_ptr[j]; x = s1_ptr[j]; y += cy; /* add previous carry to subtrahend */ cy = y < cy; /* get out carry from that addition */ y = x - y; /* main subtract */ cy += y > x; /* get out carry from the subtract, combine */ res_ptr[j] = y; } while( ++j ); return cy; } grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/mpi/generic/mpih-rshift.c0000644000175000017500000000414515036452441024174 00000000000000/* mpih-rshift.c - MPI helper functions * Copyright (C) 1994, 1996, 1998, 1999, * 2000, 2001, 2002 Free Software Foundation, Inc. * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . * SPDX-License-Identifier: LGPL-2.1-or-later * * Note: This code is heavily based on the GNU MP Library. * Actually it's the same code with only minor changes in the * way the data is stored; this is to support the abstraction * of an optional secure memory allocation which may be used * to avoid revealing of sensitive data due to paging etc. */ #include #include #include #include "mpi-internal.h" /* Shift U (pointed to by UP and USIZE limbs long) CNT bits to the right * and store the USIZE least significant limbs of the result at WP. * The bits shifted out to the right are returned. * * Argument constraints: * 1. 0 < CNT < BITS_PER_MP_LIMB * 2. If the result is to be written over the input, WP must be <= UP. */ mpi_limb_t _gcry_mpih_rshift( mpi_ptr_t wp, mpi_ptr_t up, mpi_size_t usize, unsigned cnt) { mpi_limb_t high_limb, low_limb; unsigned sh_1, sh_2; mpi_size_t i; mpi_limb_t retval; sh_1 = cnt; wp -= 1; sh_2 = BITS_PER_MPI_LIMB - sh_1; high_limb = up[0]; retval = high_limb << sh_2; low_limb = high_limb; for (i=1; i < usize; i++) { high_limb = up[i]; wp[i] = (low_limb >> sh_1) | (high_limb << sh_2); low_limb = high_limb; } wp[i] = low_limb >> sh_1; return retval; } grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/mpi/generic/mpih-mul3.c0000644000175000017500000000371715036452441023561 00000000000000/* mpih-mul3.c - MPI helper functions * Copyright (C) 1994, 1996, 1997, 1998, 2001, * 2002 Free Software Foundation, Inc. * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . * SPDX-License-Identifier: LGPL-2.1-or-later * * Note: This code is heavily based on the GNU MP Library. * Actually it's the same code with only minor changes in the * way the data is stored; this is to support the abstraction * of an optional secure memory allocation which may be used * to avoid revealing of sensitive data due to paging etc. */ #include #include #include #include "mpi-internal.h" #include "longlong.h" mpi_limb_t _gcry_mpih_submul_1( mpi_ptr_t res_ptr, mpi_ptr_t s1_ptr, mpi_size_t s1_size, mpi_limb_t s2_limb) { mpi_limb_t cy_limb; mpi_size_t j; mpi_limb_t prod_high, prod_low; mpi_limb_t x; /* The loop counter and index J goes from -SIZE to -1. This way * the loop becomes faster. */ j = -s1_size; res_ptr -= j; s1_ptr -= j; cy_limb = 0; do { umul_ppmm( prod_high, prod_low, s1_ptr[j], s2_limb); prod_low += cy_limb; cy_limb = (prod_low < cy_limb?1:0) + prod_high; x = res_ptr[j]; prod_low = x - prod_low; cy_limb += prod_low > x?1:0; res_ptr[j] = prod_low; } while( ++j ); return cy_limb; } grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/mpi/generic/mpi-asm-defs.h0000644000175000017500000000051115036452441024222 00000000000000/* This file defines some basic constants for the MPI machinery. * AMD64 compiled for the x32 ABI is special and thus we can't use the * standard values for this ABI. */ #if __GNUC__ >= 3 && defined(__x86_64__) && defined(__ILP32__) #define BYTES_PER_MPI_LIMB 8 #else #define BYTES_PER_MPI_LIMB (SIZEOF_UNSIGNED_LONG) #endif grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/mpi/asm-common-i386.h0000644000175000017500000000204315036452441023063 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ /* asm-common-i386.h - Common macros for AMD64 assembly * * Copyright (C) 2023 Jussi Kivilinna * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . */ #ifndef MPI_ASM_COMMON_I386_H #define MPI_ASM_COMMON_I386_H #include "../cipher/asm-common-i386.h" #endif /* MPI_ASM_COMMON_I386_H */ grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/mpi/mpih-mul3.c0000644000175000017500000000371715036452441022145 00000000000000/* mpih-mul3.c - MPI helper functions * Copyright (C) 1994, 1996, 1997, 1998, 2001, * 2002 Free Software Foundation, Inc. * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . * SPDX-License-Identifier: LGPL-2.1-or-later * * Note: This code is heavily based on the GNU MP Library. * Actually it's the same code with only minor changes in the * way the data is stored; this is to support the abstraction * of an optional secure memory allocation which may be used * to avoid revealing of sensitive data due to paging etc. */ #include #include #include #include "mpi-internal.h" #include "longlong.h" mpi_limb_t _gcry_mpih_submul_1( mpi_ptr_t res_ptr, mpi_ptr_t s1_ptr, mpi_size_t s1_size, mpi_limb_t s2_limb) { mpi_limb_t cy_limb; mpi_size_t j; mpi_limb_t prod_high, prod_low; mpi_limb_t x; /* The loop counter and index J goes from -SIZE to -1. This way * the loop becomes faster. */ j = -s1_size; res_ptr -= j; s1_ptr -= j; cy_limb = 0; do { umul_ppmm( prod_high, prod_low, s1_ptr[j], s2_limb); prod_low += cy_limb; cy_limb = (prod_low < cy_limb?1:0) + prod_high; x = res_ptr[j]; prod_low = x - prod_low; cy_limb += prod_low > x?1:0; res_ptr[j] = prod_low; } while( ++j ); return cy_limb; } grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/mpi/mpi-mod.c0000644000175000017500000001115115036452441021663 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ /* mpi-mod.c - Modular reduction * Copyright (C) 1998, 1999, 2001, 2002, 2003, * 2007 Free Software Foundation, Inc. * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . * SPDX-License-Identifier: LGPL-2.1-or-later */ #include #include #include #include "mpi-internal.h" #include "longlong.h" #include "g10lib.h" /* Context used with Barrett reduction. */ struct barrett_ctx_s { gcry_mpi_t m; /* The modulus - may not be modified. */ int m_copied; /* If true, M needs to be released. */ int k; gcry_mpi_t y; gcry_mpi_t r1; /* Helper MPI. */ gcry_mpi_t r2; /* Helper MPI. */ gcry_mpi_t r3; /* Helper MPI allocated on demand. */ }; void _gcry_mpi_mod (gcry_mpi_t rem, gcry_mpi_t dividend, gcry_mpi_t divisor) { _gcry_mpi_fdiv_r (rem, dividend, divisor); } /* This function returns a new context for Barrett based operations on the modulus M. This context needs to be released using _gcry_mpi_barrett_free. If COPY is true M will be transferred to the context and the user may change M. If COPY is false, M may not be changed until gcry_mpi_barrett_free has been called. */ mpi_barrett_t _gcry_mpi_barrett_init (gcry_mpi_t m, int copy) { mpi_barrett_t ctx; gcry_mpi_t tmp; mpi_normalize (m); ctx = xcalloc (1, sizeof *ctx); if (copy) { ctx->m = mpi_copy (m); ctx->m_copied = 1; } else ctx->m = m; ctx->k = mpi_get_nlimbs (m); tmp = mpi_alloc (ctx->k + 1); /* Barrett precalculation: y = floor(b^(2k) / m). */ mpi_set_ui (tmp, 1); mpi_lshift_limbs (tmp, 2 * ctx->k); mpi_fdiv_q (tmp, tmp, m); ctx->y = tmp; ctx->r1 = mpi_alloc ( 2 * ctx->k + 1 ); ctx->r2 = mpi_alloc ( 2 * ctx->k + 1 ); return ctx; } void _gcry_mpi_barrett_free (mpi_barrett_t ctx) { if (ctx) { mpi_free (ctx->y); mpi_free (ctx->r1); mpi_free (ctx->r2); if (ctx->r3) mpi_free (ctx->r3); if (ctx->m_copied) mpi_free (ctx->m); xfree (ctx); } } /* R = X mod M Using Barrett reduction. Before using this function _gcry_mpi_barrett_init must have been called to do the precalculations. CTX is the context created by this precalculation and also conveys M. If the Barret reduction could no be done a straightforward reduction method is used. We assume that these conditions are met: Input: x =(x_2k-1 ...x_0)_b m =(m_k-1 ....m_0)_b with m_k-1 != 0 Output: r = x mod m */ void _gcry_mpi_mod_barrett (gcry_mpi_t r, gcry_mpi_t x, mpi_barrett_t ctx) { gcry_mpi_t m = ctx->m; int k = ctx->k; gcry_mpi_t y = ctx->y; gcry_mpi_t r1 = ctx->r1; gcry_mpi_t r2 = ctx->r2; int sign; mpi_normalize (x); if (mpi_get_nlimbs (x) > 2*k ) { mpi_mod (r, x, m); return; } sign = x->sign; x->sign = 0; /* 1. q1 = floor( x / b^k-1) * q2 = q1 * y * q3 = floor( q2 / b^k+1 ) * Actually, we don't need qx, we can work direct on r2 */ mpi_set ( r2, x ); mpi_rshift_limbs ( r2, k-1 ); mpi_mul ( r2, r2, y ); mpi_rshift_limbs ( r2, k+1 ); /* 2. r1 = x mod b^k+1 * r2 = q3 * m mod b^k+1 * r = r1 - r2 * 3. if r < 0 then r = r + b^k+1 */ mpi_set ( r1, x ); if ( r1->nlimbs > k+1 ) /* Quick modulo operation. */ r1->nlimbs = k+1; mpi_mul ( r2, r2, m ); if ( r2->nlimbs > k+1 ) /* Quick modulo operation. */ r2->nlimbs = k+1; mpi_sub ( r, r1, r2 ); if ( mpi_has_sign ( r ) ) { if (!ctx->r3) { ctx->r3 = mpi_alloc ( k + 2 ); mpi_set_ui (ctx->r3, 1); mpi_lshift_limbs (ctx->r3, k + 1 ); } mpi_add ( r, r, ctx->r3 ); } /* 4. while r >= m do r = r - m */ while ( mpi_cmp( r, m ) >= 0 ) mpi_sub ( r, r, m ); x->sign = sign; } void _gcry_mpi_mul_barrett (gcry_mpi_t w, gcry_mpi_t u, gcry_mpi_t v, mpi_barrett_t ctx) { mpi_mul (w, u, v); mpi_mod_barrett (w, w, ctx); } grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/mpi/mpih-mul.c0000644000175000017500000003714115036452441022060 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ /* mpih-mul.c - MPI helper functions * Copyright (C) 1994, 1996, 1998, 1999, 2000, * 2001, 2002 Free Software Foundation, Inc. * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . * SPDX-License-Identifier: LGPL-2.1-or-later * * Note: This code is heavily based on the GNU MP Library. * Actually it's the same code with only minor changes in the * way the data is stored; this is to support the abstraction * of an optional secure memory allocation which may be used * to avoid revealing of sensitive data due to paging etc. */ #include #include #include #include #include "mpi-internal.h" #include "longlong.h" #include "g10lib.h" #define MPN_MUL_N_RECURSE(prodp, up, vp, size, tspace) \ do { \ if( (size) < KARATSUBA_THRESHOLD ) \ mul_n_basecase (prodp, up, vp, size); \ else \ mul_n (prodp, up, vp, size, tspace); \ } while (0) #define MPN_SQR_N_RECURSE(prodp, up, size, tspace) \ do { \ if ((size) < KARATSUBA_THRESHOLD) \ _gcry_mpih_sqr_n_basecase (prodp, up, size); \ else \ _gcry_mpih_sqr_n (prodp, up, size, tspace); \ } while (0) /* Multiply the natural numbers u (pointed to by UP) and v (pointed to by VP), * both with SIZE limbs, and store the result at PRODP. 2 * SIZE limbs are * always stored. Return the most significant limb. * * Argument constraints: * 1. PRODP != UP and PRODP != VP, i.e. the destination * must be distinct from the multiplier and the multiplicand. * * * Handle simple cases with traditional multiplication. * * This is the most critical code of multiplication. All multiplies rely * on this, both small and huge. Small ones arrive here immediately. Huge * ones arrive here as this is the base case for Karatsuba's recursive * algorithm below. */ static mpi_limb_t mul_n_basecase( mpi_ptr_t prodp, mpi_ptr_t up, mpi_ptr_t vp, mpi_size_t size) { mpi_size_t i; mpi_limb_t cy; mpi_limb_t v_limb; /* Multiply by the first limb in V separately, as the result can be * stored (not added) to PROD. We also avoid a loop for zeroing. */ v_limb = vp[0]; if( v_limb <= 1 ) { if( v_limb == 1 ) MPN_COPY( prodp, up, size ); else MPN_ZERO( prodp, size ); cy = 0; } else cy = _gcry_mpih_mul_1( prodp, up, size, v_limb ); prodp[size] = cy; prodp++; /* For each iteration in the outer loop, multiply one limb from * U with one limb from V, and add it to PROD. */ for( i = 1; i < size; i++ ) { v_limb = vp[i]; if( v_limb <= 1 ) { cy = 0; if( v_limb == 1 ) cy = _gcry_mpih_add_n(prodp, prodp, up, size); } else cy = _gcry_mpih_addmul_1(prodp, up, size, v_limb); prodp[size] = cy; prodp++; } return cy; } static void mul_n( mpi_ptr_t prodp, mpi_ptr_t up, mpi_ptr_t vp, mpi_size_t size, mpi_ptr_t tspace ) { if( size & 1 ) { /* The size is odd, and the code below doesn't handle that. * Multiply the least significant (size - 1) limbs with a recursive * call, and handle the most significant limb of S1 and S2 * separately. * A slightly faster way to do this would be to make the Karatsuba * code below behave as if the size were even, and let it check for * odd size in the end. I.e., in essence move this code to the end. * Doing so would save us a recursive call, and potentially make the * stack grow a lot less. */ mpi_size_t esize = size - 1; /* even size */ mpi_limb_t cy_limb; MPN_MUL_N_RECURSE( prodp, up, vp, esize, tspace ); cy_limb = _gcry_mpih_addmul_1( prodp + esize, up, esize, vp[esize] ); prodp[esize + esize] = cy_limb; cy_limb = _gcry_mpih_addmul_1( prodp + esize, vp, size, up[esize] ); prodp[esize + size] = cy_limb; } else { /* Anatolij Alekseevich Karatsuba's divide-and-conquer algorithm. * * Split U in two pieces, U1 and U0, such that * U = U0 + U1*(B**n), * and V in V1 and V0, such that * V = V0 + V1*(B**n). * * UV is then computed recursively using the identity * * 2n n n n * UV = (B + B )U V + B (U -U )(V -V ) + (B + 1)U V * 1 1 1 0 0 1 0 0 * * Where B = 2**BITS_PER_MP_LIMB. */ mpi_size_t hsize = size >> 1; mpi_limb_t cy; int negflg; /* Product H. ________________ ________________ * |_____U1 x V1____||____U0 x V0_____| * Put result in upper part of PROD and pass low part of TSPACE * as new TSPACE. */ MPN_MUL_N_RECURSE(prodp + size, up + hsize, vp + hsize, hsize, tspace); /* Product M. ________________ * |_(U1-U0)(V0-V1)_| */ if( _gcry_mpih_cmp(up + hsize, up, hsize) >= 0 ) { _gcry_mpih_sub_n(prodp, up + hsize, up, hsize); negflg = 0; } else { _gcry_mpih_sub_n(prodp, up, up + hsize, hsize); negflg = 1; } if( _gcry_mpih_cmp(vp + hsize, vp, hsize) >= 0 ) { _gcry_mpih_sub_n(prodp + hsize, vp + hsize, vp, hsize); negflg ^= 1; } else { _gcry_mpih_sub_n(prodp + hsize, vp, vp + hsize, hsize); /* No change of NEGFLG. */ } /* Read temporary operands from low part of PROD. * Put result in low part of TSPACE using upper part of TSPACE * as new TSPACE. */ MPN_MUL_N_RECURSE(tspace, prodp, prodp + hsize, hsize, tspace + size); /* Add/copy product H. */ MPN_COPY (prodp + hsize, prodp + size, hsize); cy = _gcry_mpih_add_n( prodp + size, prodp + size, prodp + size + hsize, hsize); /* Add product M (if NEGFLG M is a negative number) */ if(negflg) cy -= _gcry_mpih_sub_n(prodp + hsize, prodp + hsize, tspace, size); else cy += _gcry_mpih_add_n(prodp + hsize, prodp + hsize, tspace, size); /* Product L. ________________ ________________ * |________________||____U0 x V0_____| * Read temporary operands from low part of PROD. * Put result in low part of TSPACE using upper part of TSPACE * as new TSPACE. */ MPN_MUL_N_RECURSE(tspace, up, vp, hsize, tspace + size); /* Add/copy Product L (twice) */ cy += _gcry_mpih_add_n(prodp + hsize, prodp + hsize, tspace, size); if( cy ) _gcry_mpih_add_1(prodp + hsize + size, prodp + hsize + size, hsize, cy); MPN_COPY(prodp, tspace, hsize); cy = _gcry_mpih_add_n(prodp + hsize, prodp + hsize, tspace + hsize, hsize); if( cy ) _gcry_mpih_add_1(prodp + size, prodp + size, size, 1); } } void _gcry_mpih_sqr_n_basecase( mpi_ptr_t prodp, mpi_ptr_t up, mpi_size_t size ) { mpi_size_t i; mpi_limb_t cy_limb; mpi_limb_t v_limb; /* Multiply by the first limb in V separately, as the result can be * stored (not added) to PROD. We also avoid a loop for zeroing. */ v_limb = up[0]; if( v_limb <= 1 ) { if( v_limb == 1 ) MPN_COPY( prodp, up, size ); else MPN_ZERO(prodp, size); cy_limb = 0; } else cy_limb = _gcry_mpih_mul_1( prodp, up, size, v_limb ); prodp[size] = cy_limb; prodp++; /* For each iteration in the outer loop, multiply one limb from * U with one limb from V, and add it to PROD. */ for( i=1; i < size; i++) { v_limb = up[i]; if( v_limb <= 1 ) { cy_limb = 0; if( v_limb == 1 ) cy_limb = _gcry_mpih_add_n(prodp, prodp, up, size); } else cy_limb = _gcry_mpih_addmul_1(prodp, up, size, v_limb); prodp[size] = cy_limb; prodp++; } } void _gcry_mpih_sqr_n( mpi_ptr_t prodp, mpi_ptr_t up, mpi_size_t size, mpi_ptr_t tspace) { if( size & 1 ) { /* The size is odd, and the code below doesn't handle that. * Multiply the least significant (size - 1) limbs with a recursive * call, and handle the most significant limb of S1 and S2 * separately. * A slightly faster way to do this would be to make the Karatsuba * code below behave as if the size were even, and let it check for * odd size in the end. I.e., in essence move this code to the end. * Doing so would save us a recursive call, and potentially make the * stack grow a lot less. */ mpi_size_t esize = size - 1; /* even size */ mpi_limb_t cy_limb; MPN_SQR_N_RECURSE( prodp, up, esize, tspace ); cy_limb = _gcry_mpih_addmul_1( prodp + esize, up, esize, up[esize] ); prodp[esize + esize] = cy_limb; cy_limb = _gcry_mpih_addmul_1( prodp + esize, up, size, up[esize] ); prodp[esize + size] = cy_limb; } else { mpi_size_t hsize = size >> 1; mpi_limb_t cy; /* Product H. ________________ ________________ * |_____U1 x U1____||____U0 x U0_____| * Put result in upper part of PROD and pass low part of TSPACE * as new TSPACE. */ MPN_SQR_N_RECURSE(prodp + size, up + hsize, hsize, tspace); /* Product M. ________________ * |_(U1-U0)(U0-U1)_| */ if( _gcry_mpih_cmp( up + hsize, up, hsize) >= 0 ) _gcry_mpih_sub_n( prodp, up + hsize, up, hsize); else _gcry_mpih_sub_n (prodp, up, up + hsize, hsize); /* Read temporary operands from low part of PROD. * Put result in low part of TSPACE using upper part of TSPACE * as new TSPACE. */ MPN_SQR_N_RECURSE(tspace, prodp, hsize, tspace + size); /* Add/copy product H */ MPN_COPY(prodp + hsize, prodp + size, hsize); cy = _gcry_mpih_add_n(prodp + size, prodp + size, prodp + size + hsize, hsize); /* Add product M (if NEGFLG M is a negative number). */ cy -= _gcry_mpih_sub_n (prodp + hsize, prodp + hsize, tspace, size); /* Product L. ________________ ________________ * |________________||____U0 x U0_____| * Read temporary operands from low part of PROD. * Put result in low part of TSPACE using upper part of TSPACE * as new TSPACE. */ MPN_SQR_N_RECURSE (tspace, up, hsize, tspace + size); /* Add/copy Product L (twice). */ cy += _gcry_mpih_add_n (prodp + hsize, prodp + hsize, tspace, size); if( cy ) _gcry_mpih_add_1(prodp + hsize + size, prodp + hsize + size, hsize, cy); MPN_COPY(prodp, tspace, hsize); cy = _gcry_mpih_add_n (prodp + hsize, prodp + hsize, tspace + hsize, hsize); if( cy ) _gcry_mpih_add_1 (prodp + size, prodp + size, size, 1); } } /* This should be made into an inline function in gmp.h. */ void _gcry_mpih_mul_n( mpi_ptr_t prodp, mpi_ptr_t up, mpi_ptr_t vp, mpi_size_t size) { int secure; if( up == vp ) { if( size < KARATSUBA_THRESHOLD ) _gcry_mpih_sqr_n_basecase( prodp, up, size ); else { mpi_ptr_t tspace; secure = _gcry_is_secure( up ); tspace = mpi_alloc_limb_space( 2 * size, secure ); _gcry_mpih_sqr_n( prodp, up, size, tspace ); _gcry_mpi_free_limb_space (tspace, 2 * size ); } } else { if( size < KARATSUBA_THRESHOLD ) mul_n_basecase( prodp, up, vp, size ); else { mpi_ptr_t tspace; secure = _gcry_is_secure( up ) || _gcry_is_secure( vp ); tspace = mpi_alloc_limb_space( 2 * size, secure ); mul_n (prodp, up, vp, size, tspace); _gcry_mpi_free_limb_space (tspace, 2 * size ); } } } void _gcry_mpih_mul_karatsuba_case( mpi_ptr_t prodp, mpi_ptr_t up, mpi_size_t usize, mpi_ptr_t vp, mpi_size_t vsize, struct karatsuba_ctx *ctx ) { mpi_limb_t cy; if( !ctx->tspace || ctx->tspace_size < vsize ) { if( ctx->tspace ) _gcry_mpi_free_limb_space( ctx->tspace, ctx->tspace_nlimbs ); ctx->tspace_nlimbs = 2 * vsize; ctx->tspace = mpi_alloc_limb_space (2 * vsize, (_gcry_is_secure (up) || _gcry_is_secure (vp))); ctx->tspace_size = vsize; } MPN_MUL_N_RECURSE( prodp, up, vp, vsize, ctx->tspace ); prodp += vsize; up += vsize; usize -= vsize; if( usize >= vsize ) { if( !ctx->tp || ctx->tp_size < vsize ) { if( ctx->tp ) _gcry_mpi_free_limb_space( ctx->tp, ctx->tp_nlimbs ); ctx->tp_nlimbs = 2 * vsize; ctx->tp = mpi_alloc_limb_space (2 * vsize, (_gcry_is_secure (up) || _gcry_is_secure (vp))); ctx->tp_size = vsize; } do { MPN_MUL_N_RECURSE( ctx->tp, up, vp, vsize, ctx->tspace ); cy = _gcry_mpih_add_n( prodp, prodp, ctx->tp, vsize ); _gcry_mpih_add_1( prodp + vsize, ctx->tp + vsize, vsize, cy ); prodp += vsize; up += vsize; usize -= vsize; } while( usize >= vsize ); } if( usize ) { if( usize < KARATSUBA_THRESHOLD ) { _gcry_mpih_mul( ctx->tspace, vp, vsize, up, usize ); } else { if( !ctx->next ) { ctx->next = xcalloc( 1, sizeof *ctx ); } _gcry_mpih_mul_karatsuba_case( ctx->tspace, vp, vsize, up, usize, ctx->next ); } cy = _gcry_mpih_add_n( prodp, prodp, ctx->tspace, vsize); _gcry_mpih_add_1( prodp + vsize, ctx->tspace + vsize, usize, cy ); } } void _gcry_mpih_release_karatsuba_ctx( struct karatsuba_ctx *ctx ) { struct karatsuba_ctx *ctx2; if( ctx->tp ) _gcry_mpi_free_limb_space( ctx->tp, ctx->tp_nlimbs ); if( ctx->tspace ) _gcry_mpi_free_limb_space( ctx->tspace, ctx->tspace_nlimbs ); for( ctx=ctx->next; ctx; ctx = ctx2 ) { ctx2 = ctx->next; if( ctx->tp ) _gcry_mpi_free_limb_space( ctx->tp, ctx->tp_nlimbs ); if( ctx->tspace ) _gcry_mpi_free_limb_space( ctx->tspace, ctx->tspace_nlimbs ); xfree( ctx ); } } /* Multiply the natural numbers u (pointed to by UP, with USIZE limbs) * and v (pointed to by VP, with VSIZE limbs), and store the result at * PRODP. USIZE + VSIZE limbs are always stored, but if the input * operands are normalized. Return the most significant limb of the * result. * * NOTE: The space pointed to by PRODP is overwritten before finished * with U and V, so overlap is an error. * * Argument constraints: * 1. USIZE >= VSIZE. * 2. PRODP != UP and PRODP != VP, i.e. the destination * must be distinct from the multiplier and the multiplicand. */ mpi_limb_t _gcry_mpih_mul( mpi_ptr_t prodp, mpi_ptr_t up, mpi_size_t usize, mpi_ptr_t vp, mpi_size_t vsize) { mpi_ptr_t prod_endp = prodp + usize + vsize - 1; mpi_limb_t cy; struct karatsuba_ctx ctx; if( vsize < KARATSUBA_THRESHOLD ) { mpi_size_t i; mpi_limb_t v_limb; if( !vsize ) return 0; /* Multiply by the first limb in V separately, as the result can be * stored (not added) to PROD. We also avoid a loop for zeroing. */ v_limb = vp[0]; if( v_limb <= 1 ) { if( v_limb == 1 ) MPN_COPY( prodp, up, usize ); else MPN_ZERO( prodp, usize ); cy = 0; } else cy = _gcry_mpih_mul_1( prodp, up, usize, v_limb ); prodp[usize] = cy; prodp++; /* For each iteration in the outer loop, multiply one limb from * U with one limb from V, and add it to PROD. */ for( i = 1; i < vsize; i++ ) { v_limb = vp[i]; if( v_limb <= 1 ) { cy = 0; if( v_limb == 1 ) cy = _gcry_mpih_add_n(prodp, prodp, up, usize); } else cy = _gcry_mpih_addmul_1(prodp, up, usize, v_limb); prodp[usize] = cy; prodp++; } return cy; } memset( &ctx, 0, sizeof ctx ); _gcry_mpih_mul_karatsuba_case( prodp, up, usize, vp, vsize, &ctx ); _gcry_mpih_release_karatsuba_ctx( &ctx ); return *prod_endp; } grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/mpi/mpi-cmp.c0000644000175000017500000000636715036452441021700 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ /* mpi-cmp.c - MPI functions * Copyright (C) 1998, 1999, 2001, 2002, 2005 Free Software Foundation, Inc. * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . * SPDX-License-Identifier: LGPL-2.1-or-later */ #include #include #include #include "mpi-internal.h" int _gcry_mpi_cmp_ui (gcry_mpi_t u, unsigned long v) { mpi_limb_t limb = v; _gcry_mpi_normalize (u); /* Handle the case that U contains no limb. */ if (u->nlimbs == 0) return -(limb != 0); /* Handle the case that U is negative. */ if (u->sign) return -1; if (u->nlimbs == 1) { /* Handle the case that U contains exactly one limb. */ if (u->d[0] > limb) return 1; if (u->d[0] < limb) return -1; return 0; } else /* Handle the case that U contains more than one limb. */ return 1; } /* Helper for _gcry_mpi_cmp and _gcry_mpi_cmpabs. */ static int do_mpi_cmp (gcry_mpi_t u, gcry_mpi_t v, int absmode) { mpi_size_t usize; mpi_size_t vsize; int usign; int vsign; int cmp; if (mpi_is_opaque (u) || mpi_is_opaque (v)) { /* We have no signan and thus ABSMODE has no efeect here. */ if (mpi_is_opaque (u) && !mpi_is_opaque (v)) return -1; if (!mpi_is_opaque (u) && mpi_is_opaque (v)) return 1; if (!u->sign && !v->sign) return 0; /* Empty buffers are identical. */ if (u->sign < v->sign) return -1; if (u->sign > v->sign) return 1; return memcmp (u->d, v->d, (u->sign+7)/8); } else { _gcry_mpi_normalize (u); _gcry_mpi_normalize (v); usize = u->nlimbs; vsize = v->nlimbs; usign = absmode? 0 : u->sign; vsign = absmode? 0 : v->sign; /* Special treatment for +0 == -0 */ if (!usize && !vsize) return 0; /* Compare sign bits. */ if (!usign && vsign) return 1; if (usign && !vsign) return -1; /* U and V are either both positive or both negative. */ if (usize != vsize && !usign && !vsign) return usize - vsize; if (usize != vsize && usign && vsign) return vsize + usize; if (!usize ) return 0; if (!(cmp = _gcry_mpih_cmp (u->d, v->d, usize))) return 0; if ((cmp < 0?1:0) == (usign?1:0)) return 1; } return -1; } int _gcry_mpi_cmp (gcry_mpi_t u, gcry_mpi_t v) { return do_mpi_cmp (u, v, 0); } /* Compare only the absolute values. */ int _gcry_mpi_cmpabs (gcry_mpi_t u, gcry_mpi_t v) { return do_mpi_cmp (u, v, 1); } grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/mpi/longlong.h0000644000175000017500000024262515036452441022161 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ /* longlong.h -- definitions for mixed size 32/64 bit arithmetic. Note: This is the Libgcrypt version Copyright (C) 1991, 1992, 1993, 1994, 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2011 Free Software Foundation, Inc. This file is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Library General Public License along with this file; see the file COPYING.LIB. If not, see . SPDX-License-Identifier: LGPL-2.1-or-later */ /* On 32-bit, use 64-bit 'unsigned long long' for UDWtype, if available. */ #if !defined (UDWtype) && SIZEOF_UNSIGNED_LONG_LONG * 8 == W_TYPE_SIZE * 2 # define UDWtype unsigned long long #endif /* On 64-bit, use 128-bit 'unsigned __int128' for UDWtype, if available. */ #if !defined (UDWtype) && SIZEOF_UNSIGNED___INT128 * 8 == W_TYPE_SIZE * 2 # define UDWtype unsigned __int128 #endif /* You have to define the following before including this file: UWtype -- An unsigned type, default type for operations (typically a "word"). UHWtype -- An unsigned type, at least half the size of UWtype. UDWtype -- An unsigned type, at least twice as large a UWtype. W_TYPE_SIZE -- size in bits of UWtype. SItype, USItype -- Signed and unsigned 32 bit types. DItype, UDItype -- Signed and unsigned 64 bit types. On a 32 bit machine UWtype should typically be USItype. On a 64 bit machine, UWtype should typically be UDItype. */ #define __BITS4 (W_TYPE_SIZE / 4) #define __ll_B ((UWtype) 1 << (W_TYPE_SIZE / 2)) #define __ll_lowpart(t) ((UWtype) (t) & (__ll_B - 1)) #define __ll_highpart(t) ((UWtype) (t) >> (W_TYPE_SIZE / 2)) /* This is used to make sure no undesirable sharing between different libraries that use this file takes place. */ #ifndef __MPN # define __MPN(x) __##x #endif /* Define auxiliary asm macros. 1) umul_ppmm(high_prod, low_prod, multipler, multiplicand) multiplies two UWtype integers MULTIPLER and MULTIPLICAND, and generates a two UWtype word product in HIGH_PROD and LOW_PROD. 2) __umulsidi3(a,b) multiplies two UWtype integers A and B, and returns a UDWtype product. This is just a variant of umul_ppmm. 3) udiv_qrnnd(quotient, remainder, high_numerator, low_numerator, denominator) divides a UDWtype, composed by the UWtype integers HIGH_NUMERATOR and LOW_NUMERATOR, by DENOMINATOR and places the quotient in QUOTIENT and the remainder in REMAINDER. HIGH_NUMERATOR must be less than DENOMINATOR for correct operation. If, in addition, the most significant bit of DENOMINATOR must be 1, then the pre-processor symbol UDIV_NEEDS_NORMALIZATION is defined to 1. 4) sdiv_qrnnd(quotient, remainder, high_numerator, low_numerator, denominator). Like udiv_qrnnd but the numbers are signed. The quotient is rounded towards 0. 5) count_leading_zeros(count, x) counts the number of zero-bits from the msb to the first non-zero bit in the UWtype X. This is the number of steps X needs to be shifted left to set the msb. Undefined for X == 0, unless the symbol COUNT_LEADING_ZEROS_0 is defined to some value. 6) count_trailing_zeros(count, x) like count_leading_zeros, but counts from the least significant end. 7) add_ssaaaa(high_sum, low_sum, high_addend_1, low_addend_1, high_addend_2, low_addend_2) adds two UWtype integers, composed by HIGH_ADDEND_1 and LOW_ADDEND_1, and HIGH_ADDEND_2 and LOW_ADDEND_2 respectively. The result is placed in HIGH_SUM and LOW_SUM. Overflow (i.e. carry out) is not stored anywhere, and is lost. 8) sub_ddmmss(high_difference, low_difference, high_minuend, low_minuend, high_subtrahend, low_subtrahend) subtracts two two-word UWtype integers, composed by HIGH_MINUEND_1 and LOW_MINUEND_1, and HIGH_SUBTRAHEND_2 and LOW_SUBTRAHEND_2 respectively. The result is placed in HIGH_DIFFERENCE and LOW_DIFFERENCE. Overflow (i.e. carry out) is not stored anywhere, and is lost. If any of these macros are left undefined for a particular CPU, C macros are used. */ /* The CPUs come in alphabetical order below. Please add support for more CPUs here, or improve the current support for the CPUs below! */ #ifdef __riscos__ #pragma continue_after_hash_error #else /* !__riscos__ */ #if defined (__GNUC__) && !defined (NO_ASM) /* We sometimes need to clobber "cc" with gcc2, but that would not be understood by gcc1. Use cpp to avoid major code duplication. */ #if __GNUC__ < 2 # define __CLOBBER_CC # define __AND_CLOBBER_CC #else /* __GNUC__ >= 2 */ # define __CLOBBER_CC : "cc" # define __AND_CLOBBER_CC , "cc" #endif /* __GNUC__ < 2 */ /*************************************** **** Begin CPU Specific Versions **** ***************************************/ /*************************************** ************** A29K ***************** ***************************************/ #if (defined (__a29k__) || defined (_AM29K)) && W_TYPE_SIZE == 32 # define add_ssaaaa(sh, sl, ah, al, bh, bl) \ __asm__ ("add %1,%4,%5\n" \ "addc %0,%2,%3" \ : "=r" ((USItype)(sh)), \ "=&r" ((USItype)(sl)) \ : "%r" ((USItype)(ah)), \ "rI" ((USItype)(bh)), \ "%r" ((USItype)(al)), \ "rI" ((USItype)(bl))) # define sub_ddmmss(sh, sl, ah, al, bh, bl) \ __asm__ ("sub %1,%4,%5\n" \ "subc %0,%2,%3" \ : "=r" ((USItype)(sh)), \ "=&r" ((USItype)(sl)) \ : "r" ((USItype)(ah)), \ "rI" ((USItype)(bh)), \ "r" ((USItype)(al)), \ "rI" ((USItype)(bl))) # define umul_ppmm(xh, xl, m0, m1) \ do { \ USItype __m0 = (m0), __m1 = (m1); \ __asm__ ("multiplu %0,%1,%2" \ : "=r" ((USItype)(xl)) \ : "r" (__m0), \ "r" (__m1)); \ __asm__ ("multmu %0,%1,%2" \ : "=r" ((USItype)(xh)) \ : "r" (__m0), \ "r" (__m1)); \ } while (0) # define udiv_qrnnd(q, r, n1, n0, d) \ __asm__ ("dividu %0,%3,%4" \ : "=r" ((USItype)(q)), \ "=q" ((USItype)(r)) \ : "1" ((USItype)(n1)), \ "r" ((USItype)(n0)), \ "r" ((USItype)(d))) # define count_leading_zeros(count, x) \ __asm__ ("clz %0,%1" \ : "=r" ((USItype)(count)) \ : "r" ((USItype)(x))) # define COUNT_LEADING_ZEROS_0 32 #endif /* __a29k__ */ #if defined (__alpha) && W_TYPE_SIZE == 64 # define umul_ppmm(ph, pl, m0, m1) \ do { \ UDItype __m0 = (m0), __m1 = (m1); \ __asm__ ("umulh %r1,%2,%0" \ : "=r" ((UDItype)(ph)) \ : "%rJ" (__m0), \ "rI" (__m1)); \ (pl) = __m0 * __m1; \ } while (0) # define UMUL_TIME 46 # ifndef LONGLONG_STANDALONE # define udiv_qrnnd(q, r, n1, n0, d) \ do { UDItype __r; \ (q) = __udiv_qrnnd (&__r, (n1), (n0), (d)); \ (r) = __r; \ } while (0) extern UDItype __udiv_qrnnd (); # define UDIV_TIME 220 # endif /* !LONGLONG_STANDALONE */ #endif /* __alpha */ /*************************************** ************** ARM ****************** ***************************************/ #if defined (__arm__) && W_TYPE_SIZE == 32 && \ (!defined (__thumb__) || defined (__thumb2__)) /* The __ARM_ARCH define is provided by gcc 4.8. Construct it otherwise. */ # ifndef __ARM_ARCH # ifdef __ARM_ARCH_2__ # define __ARM_ARCH 2 # elif defined (__ARM_ARCH_3__) || defined (__ARM_ARCH_3M__) # define __ARM_ARCH 3 # elif defined (__ARM_ARCH_4__) || defined (__ARM_ARCH_4T__) # define __ARM_ARCH 4 # elif defined (__ARM_ARCH_5__) || defined (__ARM_ARCH_5E__) \ || defined(__ARM_ARCH_5T__) || defined(__ARM_ARCH_5TE__) \ || defined(__ARM_ARCH_5TEJ__) # define __ARM_ARCH 5 # elif defined (__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) \ || defined (__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6ZK__) \ || defined (__ARM_ARCH_6K__) || defined(__ARM_ARCH_6T2__) # define __ARM_ARCH 6 # elif defined (__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) \ || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) \ || defined(__ARM_ARCH_7EM__) # define __ARM_ARCH 7 # else /* could not detect? */ # endif # endif /* !__ARM_ARCH */ # define add_ssaaaa(sh, sl, ah, al, bh, bl) \ __asm__ ("adds %1, %4, %5\n" \ "adc %0, %2, %3" \ : "=r" ((sh)), \ "=&r" ((sl)) \ : "%r" ((USItype)(ah)), \ "rI" ((USItype)(bh)), \ "%r" ((USItype)(al)), \ "rI" ((USItype)(bl)) __CLOBBER_CC) # define sub_ddmmss(sh, sl, ah, al, bh, bl) \ __asm__ ("subs %1, %4, %5\n" \ "sbc %0, %2, %3" \ : "=r" ((sh)), \ "=&r" ((sl)) \ : "r" ((USItype)(ah)), \ "rI" ((USItype)(bh)), \ "r" ((USItype)(al)), \ "rI" ((USItype)(bl)) __CLOBBER_CC) # if (defined __ARM_ARCH && __ARM_ARCH <= 3) # define umul_ppmm(xh, xl, a, b) \ __asm__ ("@ Inlined umul_ppmm\n" \ "mov %|r0, %2, lsr #16 @ AAAA\n" \ "mov %|r2, %3, lsr #16 @ BBBB\n" \ "bic %|r1, %2, %|r0, lsl #16 @ aaaa\n" \ "bic %0, %3, %|r2, lsl #16 @ bbbb\n" \ "mul %1, %|r1, %|r2 @ aaaa * BBBB\n" \ "mul %|r2, %|r0, %|r2 @ AAAA * BBBB\n" \ "mul %|r1, %0, %|r1 @ aaaa * bbbb\n" \ "mul %0, %|r0, %0 @ AAAA * bbbb\n" \ "adds %|r0, %1, %0 @ central sum\n" \ "addcs %|r2, %|r2, #65536\n" \ "adds %1, %|r1, %|r0, lsl #16\n" \ "adc %0, %|r2, %|r0, lsr #16" \ : "=&r" ((xh)), \ "=r" ((xl)) \ : "r" ((USItype)(a)), \ "r" ((USItype)(b)) \ : "r0", "r1", "r2" __AND_CLOBBER_CC) # else /* __ARM_ARCH >= 4 */ # define umul_ppmm(xh, xl, a, b) \ __asm__ ("@ Inlined umul_ppmm\n" \ "umull %1, %0, %2, %3" \ : "=&r" ((xh)), \ "=r" ((xl)) \ : "r" ((USItype)(a)), \ "r" ((USItype)(b))) # endif /* __ARM_ARCH >= 4 */ # define UMUL_TIME 20 # define UDIV_TIME 100 # if (defined __ARM_ARCH && __ARM_ARCH >= 5) # define count_leading_zeros(count, x) \ __asm__ ("clz %0, %1" \ : "=r" ((count)) \ : "r" ((USItype)(x))) # endif /* __ARM_ARCH >= 5 */ #endif /* __arm__ */ /*************************************** ********** ARM64 / Aarch64 ********** ***************************************/ #if defined(__aarch64__) && W_TYPE_SIZE == 64 # define add_ssaaaa(sh, sl, ah, al, bh, bl) \ __asm__ ("adds %1, %4, %5\n" \ "adc %0, %2, %3\n" \ : "=r" ((sh)), \ "=&r" ((sl)) \ : "r" ((UDItype)(ah)), \ "r" ((UDItype)(bh)), \ "r" ((UDItype)(al)), \ "r" ((UDItype)(bl)) __CLOBBER_CC) # define sub_ddmmss(sh, sl, ah, al, bh, bl) \ __asm__ ("subs %1, %4, %5\n" \ "sbc %0, %2, %3\n" \ : "=r" ((sh)), \ "=&r" ((sl)) \ : "r" ((UDItype)(ah)), \ "r" ((UDItype)(bh)), \ "r" ((UDItype)(al)), \ "r" ((UDItype)(bl)) __CLOBBER_CC) # define umul_ppmm(ph, pl, m0, m1) \ do { \ UDItype __m0 = (m0), __m1 = (m1), __ph; \ (pl) = __m0 * __m1; \ __asm__ ("umulh %0,%1,%2" \ : "=r" (__ph) \ : "r" (__m0), \ "r" (__m1)); \ (ph) = __ph; \ } while (0) # define count_leading_zeros(count, x) \ do { \ UDItype __co; \ __asm__ ("clz %0, %1\n" \ : "=r" (__co) \ : "r" ((UDItype)(x))); \ (count) = __co; \ } while (0) #endif /* __aarch64__ */ /*************************************** ************** CLIPPER ************** ***************************************/ #if defined (__clipper__) && W_TYPE_SIZE == 32 # define umul_ppmm(w1, w0, u, v) \ ({union {UDItype __ll; \ struct {USItype __l, __h;} __i; \ } __xx; \ __asm__ ("mulwux %2,%0" \ : "=r" (__xx.__ll) \ : "%0" ((USItype)(u)), \ "r" ((USItype)(v))); \ (w1) = __xx.__i.__h; (w0) = __xx.__i.__l;}) # define smul_ppmm(w1, w0, u, v) \ ({union {DItype __ll; \ struct {SItype __l, __h;} __i; \ } __xx; \ __asm__ ("mulwx %2,%0" \ : "=r" (__xx.__ll) \ : "%0" ((SItype)(u)), \ "r" ((SItype)(v))); \ (w1) = __xx.__i.__h; (w0) = __xx.__i.__l;}) # define __umulsidi3(u, v) \ ({UDItype __w; \ __asm__ ("mulwux %2,%0" \ : "=r" (__w) \ : "%0" ((USItype)(u)), \ "r" ((USItype)(v))); \ __w; }) #endif /* __clipper__ */ /*************************************** ************** GMICRO *************** ***************************************/ #if defined (__gmicro__) && W_TYPE_SIZE == 32 # define add_ssaaaa(sh, sl, ah, al, bh, bl) \ __asm__ ("add.w %5,%1\n" \ "addx %3,%0" \ : "=g" ((USItype)(sh)), \ "=&g" ((USItype)(sl)) \ : "%0" ((USItype)(ah)), \ "g" ((USItype)(bh)), \ "%1" ((USItype)(al)), \ "g" ((USItype)(bl))) # define sub_ddmmss(sh, sl, ah, al, bh, bl) \ __asm__ ("sub.w %5,%1\n" \ "subx %3,%0" \ : "=g" ((USItype)(sh)), \ "=&g" ((USItype)(sl)) \ : "0" ((USItype)(ah)), \ "g" ((USItype)(bh)), \ "1" ((USItype)(al)), \ "g" ((USItype)(bl))) # define umul_ppmm(ph, pl, m0, m1) \ __asm__ ("mulx %3,%0,%1" \ : "=g" ((USItype)(ph)), \ "=r" ((USItype)(pl)) \ : "%0" ((USItype)(m0)), \ "g" ((USItype)(m1))) # define udiv_qrnnd(q, r, nh, nl, d) \ __asm__ ("divx %4,%0,%1" \ : "=g" ((USItype)(q)), \ "=r" ((USItype)(r)) \ : "1" ((USItype)(nh)), \ "0" ((USItype)(nl)), \ "g" ((USItype)(d))) # define count_leading_zeros(count, x) \ __asm__ ("bsch/1 %1,%0" \ : "=g" (count) \ : "g" ((USItype)(x)), \ "0" ((USItype)0)) #endif /*************************************** ************** HPPA ***************** ***************************************/ #if defined (__hppa) && W_TYPE_SIZE == 32 # define add_ssaaaa(sh, sl, ah, al, bh, bl) \ __asm__ ("add %4,%5,%1\n\t" \ "addc %2,%3,%0" \ : "=r" ((USItype)(sh)), \ "=&r" ((USItype)(sl)) \ : "%rM" ((USItype)(ah)), \ "rM" ((USItype)(bh)), \ "%rM" ((USItype)(al)), \ "rM" ((USItype)(bl)) __CLOBBER_CC) # define sub_ddmmss(sh, sl, ah, al, bh, bl) \ __asm__ ("sub %4,%5,%1\n\t" \ "subb %2,%3,%0" \ : "=r" ((USItype)(sh)), \ "=&r" ((USItype)(sl)) \ : "rM" ((USItype)(ah)), \ "rM" ((USItype)(bh)), \ "rM" ((USItype)(al)), \ "rM" ((USItype)(bl)) __CLOBBER_CC) # if defined (_PA_RISC1_1) # define umul_ppmm(wh, wl, u, v) \ do { \ union {UDItype __ll; \ struct {USItype __h, __l;} __i; \ } __xx; \ __asm__ (" xmpyu %1,%2,%0" \ : "=*f" (__xx.__ll) \ : "*f" ((USItype)(u)), \ "*f" ((USItype)(v))); \ (wh) = __xx.__i.__h; \ (wl) = __xx.__i.__l; \ } while (0) # define UMUL_TIME 8 # define UDIV_TIME 60 # else # define UMUL_TIME 40 # define UDIV_TIME 80 # endif # if !defined(LONGLONG_STANDALONE) && !defined(ASM_DISABLED) # define udiv_qrnnd(q, r, n1, n0, d) \ do { USItype __r; \ (q) = __udiv_qrnnd (&__r, (n1), (n0), (d)); \ (r) = __r; \ } while (0) extern USItype __udiv_qrnnd (); # endif /* !LONGLONG_STANDALONE && !ASM_DISABLED */ # define count_leading_zeros(count, x) \ do { \ USItype __tmp; \ __asm__ ( \ " ldi 1,%0 \n" \ " extru,= %1,15,16,%%r0 ; Bits 31..16 zero? \n" \ " extru,tr %1,15,16,%1 ; No. Shift down, skip add.\n" \ " ldo 16(%0),%0 ; Yes. Perform add. \n" \ " extru,= %1,23,8,%%r0 ; Bits 15..8 zero? \n" \ " extru,tr %1,23,8,%1 ; No. Shift down, skip add.\n" \ " ldo 8(%0),%0 ; Yes. Perform add. \n" \ " extru,= %1,27,4,%%r0 ; Bits 7..4 zero? \n" \ " extru,tr %1,27,4,%1 ; No. Shift down, skip add.\n" \ " ldo 4(%0),%0 ; Yes. Perform add. \n" \ " extru,= %1,29,2,%%r0 ; Bits 3..2 zero? \n" \ " extru,tr %1,29,2,%1 ; No. Shift down, skip add.\n" \ " ldo 2(%0),%0 ; Yes. Perform add. \n" \ " extru %1,30,1,%1 ; Extract bit 1. \n" \ " sub %0,%1,%0 ; Subtract it. " \ : "=r" (count), "=r" (__tmp) : "1" (x)); \ } while (0) #endif /* hppa */ /*************************************** ************** I370 ***************** ***************************************/ #if (defined (__i370__) || defined (__mvs__)) && W_TYPE_SIZE == 32 # define umul_ppmm(xh, xl, m0, m1) \ do { \ union {UDItype __ll; \ struct {USItype __h, __l;} __i; \ } __xx; \ USItype __m0 = (m0), __m1 = (m1); \ __asm__ ("mr %0,%3" \ : "=r" (__xx.__i.__h), \ "=r" (__xx.__i.__l) \ : "%1" (__m0), \ "r" (__m1)); \ (xh) = __xx.__i.__h; (xl) = __xx.__i.__l; \ (xh) += ((((SItype) __m0 >> 31) & __m1) \ + (((SItype) __m1 >> 31) & __m0)); \ } while (0) # define smul_ppmm(xh, xl, m0, m1) \ do { \ union {DItype __ll; \ struct {USItype __h, __l;} __i; \ } __xx; \ __asm__ ("mr %0,%3" \ : "=r" (__xx.__i.__h), \ "=r" (__xx.__i.__l) \ : "%1" (m0), \ "r" (m1)); \ (xh) = __xx.__i.__h; (xl) = __xx.__i.__l; \ } while (0) # define sdiv_qrnnd(q, r, n1, n0, d) \ do { \ union {DItype __ll; \ struct {USItype __h, __l;} __i; \ } __xx; \ __xx.__i.__h = (n1); __xx.__i.__l = (n0); \ __asm__ ("dr %0,%2" \ : "=r" (__xx.__ll) \ : "0" (__xx.__ll), "r" (d)); \ (q) = __xx.__i.__l; (r) = __xx.__i.__h; \ } while (0) #endif /*************************************** ************** I386 ***************** ***************************************/ #if (defined (__i386__) || defined (__i486__)) && W_TYPE_SIZE == 32 # define add_ssaaaa(sh, sl, ah, al, bh, bl) \ __asm__ ("addl %5,%1\n" \ "adcl %3,%0" \ : "=r" ((sh)), \ "=&r" ((sl)) \ : "%0" ((USItype)(ah)), \ "g" ((USItype)(bh)), \ "%1" ((USItype)(al)), \ "g" ((USItype)(bl)) \ __CLOBBER_CC) # define sub_ddmmss(sh, sl, ah, al, bh, bl) \ __asm__ ("subl %5,%1\n" \ "sbbl %3,%0" \ : "=r" ((sh)), \ "=&r" ((sl)) \ : "0" ((USItype)(ah)), \ "g" ((USItype)(bh)), \ "1" ((USItype)(al)), \ "g" ((USItype)(bl)) \ __CLOBBER_CC) # define umul_ppmm(w1, w0, u, v) \ __asm__ ("mull %3" \ : "=a" ((w0)), \ "=d" ((w1)) \ : "%0" ((USItype)(u)), \ "rm" ((USItype)(v)) \ __CLOBBER_CC) # define udiv_qrnnd(q, r, n1, n0, d) \ __asm__ ("divl %4" \ : "=a" ((q)), \ "=d" ((r)) \ : "0" ((USItype)(n0)), \ "1" ((USItype)(n1)), \ "rm" ((USItype)(d)) \ __CLOBBER_CC) # define count_leading_zeros(count, x) \ do { \ USItype __cbtmp; \ __asm__ ("bsrl %1,%0" \ : "=r" (__cbtmp) : "rm" ((USItype)(x)) \ __CLOBBER_CC); \ (count) = __cbtmp ^ 31; \ } while (0) # define count_trailing_zeros(count, x) \ __asm__ ("rep;bsfl %1,%0" : "=r" (count) : "rm" ((USItype)(x)) __CLOBBER_CC) # ifndef UMUL_TIME # define UMUL_TIME 40 # endif # ifndef UDIV_TIME # define UDIV_TIME 40 # endif #endif /* 80x86 */ /*************************************** *********** AMD64 / x86-64 ************ ***************************************/ #if defined(__x86_64) && W_TYPE_SIZE == 64 # define add_ssaaaa(sh, sl, ah, al, bh, bl) \ __asm__ ("addq %5,%1\n" \ "adcq %3,%0" \ : "=r" ((sh)), \ "=&r" ((sl)) \ : "0" ((UDItype)(ah)), \ "g" ((UDItype)(bh)), \ "1" ((UDItype)(al)), \ "g" ((UDItype)(bl)) \ __CLOBBER_CC) # define sub_ddmmss(sh, sl, ah, al, bh, bl) \ __asm__ ("subq %5,%1\n" \ "sbbq %3,%0" \ : "=r" ((sh)), \ "=&r" ((sl)) \ : "0" ((UDItype)(ah)), \ "g" ((UDItype)(bh)), \ "1" ((UDItype)(al)), \ "g" ((UDItype)(bl)) \ __CLOBBER_CC) # define umul_ppmm(w1, w0, u, v) \ __asm__ ("mulq %3" \ : "=a" ((w0)), \ "=d" ((w1)) \ : "0" ((UDItype)(u)), \ "rm" ((UDItype)(v)) \ __CLOBBER_CC) # define udiv_qrnnd(q, r, n1, n0, d) \ __asm__ ("divq %4" \ : "=a" ((q)), \ "=d" ((r)) \ : "0" ((UDItype)(n0)), \ "1" ((UDItype)(n1)), \ "rm" ((UDItype)(d)) \ __CLOBBER_CC) # define count_leading_zeros(count, x) \ do { \ UDItype __cbtmp; \ __asm__ ("bsrq %1,%0" \ : "=r" (__cbtmp) : "rm" ((UDItype)(x)) \ __CLOBBER_CC); \ (count) = __cbtmp ^ 63; \ } while (0) # define count_trailing_zeros(count, x) \ do { \ UDItype __cbtmp; \ __asm__ ("rep;bsfq %1,%0" \ : "=r" (__cbtmp) : "rm" ((UDItype)(x)) \ __CLOBBER_CC); \ (count) = __cbtmp; \ } while (0) # ifndef UMUL_TIME # define UMUL_TIME 40 # endif # ifndef UDIV_TIME # define UDIV_TIME 40 # endif #endif /* __x86_64 */ /*************************************** ************** I860 ***************** ***************************************/ #if defined (__i860__) && W_TYPE_SIZE == 32 # define rshift_rhlc(r,h,l,c) \ __asm__ ("shr %3,r0,r0\n" \ "shrd %1,%2,%0" \ "=r" (r) : "r" (h), "r" (l), "rn" (c)) #endif /* i860 */ /*************************************** ************** I960 ***************** ***************************************/ #if defined (__i960__) && W_TYPE_SIZE == 32 # define add_ssaaaa(sh, sl, ah, al, bh, bl) \ __asm__ ("cmpo 1,0\n" \ "addc %5,%4,%1\n" \ "addc %3,%2,%0" \ : "=r" ((USItype)(sh)), \ "=&r" ((USItype)(sl)) \ : "%dI" ((USItype)(ah)), \ "dI" ((USItype)(bh)), \ "%dI" ((USItype)(al)), \ "dI" ((USItype)(bl))) # define sub_ddmmss(sh, sl, ah, al, bh, bl) \ __asm__ ("cmpo 0,0\n" \ "subc %5,%4,%1\n" \ "subc %3,%2,%0" \ : "=r" ((USItype)(sh)), \ "=&r" ((USItype)(sl)) \ : "dI" ((USItype)(ah)), \ "dI" ((USItype)(bh)), \ "dI" ((USItype)(al)), \ "dI" ((USItype)(bl))) # define umul_ppmm(w1, w0, u, v) \ ({union {UDItype __ll; \ struct {USItype __l, __h;} __i; \ } __xx; \ __asm__ ("emul %2,%1,%0" \ : "=d" (__xx.__ll) \ : "%dI" ((USItype)(u)), \ "dI" ((USItype)(v))); \ (w1) = __xx.__i.__h; (w0) = __xx.__i.__l;}) # define __umulsidi3(u, v) \ ({UDItype __w; \ __asm__ ("emul %2,%1,%0" \ : "=d" (__w) \ : "%dI" ((USItype)(u)), \ "dI" ((USItype)(v))); \ __w; }) # define udiv_qrnnd(q, r, nh, nl, d) \ do { \ union {UDItype __ll; \ struct {USItype __l, __h;} __i; \ } __nn; \ __nn.__i.__h = (nh); __nn.__i.__l = (nl); \ __asm__ ("ediv %d,%n,%0" \ : "=d" (__rq.__ll) \ : "dI" (__nn.__ll), \ "dI" ((USItype)(d))); \ (r) = __rq.__i.__l; (q) = __rq.__i.__h; \ } while (0) # define count_leading_zeros(count, x) \ do { \ USItype __cbtmp; \ __asm__ ("scanbit %1,%0" \ : "=r" (__cbtmp) \ : "r" ((USItype)(x))); \ (count) = __cbtmp ^ 31; \ } while (0) # define COUNT_LEADING_ZEROS_0 (-32) /* sic */ # if defined (__i960mx) /* what is the proper symbol to test??? */ # define rshift_rhlc(r,h,l,c) \ do { \ union {UDItype __ll; \ struct {USItype __l, __h;} __i; \ } __nn; \ __nn.__i.__h = (h); __nn.__i.__l = (l); \ __asm__ ("shre %2,%1,%0" \ : "=d" (r) : "dI" (__nn.__ll), "dI" (c)); \ } # endif /* i960mx */ #endif /* i960 */ /*************************************** ************** 68000 **************** ***************************************/ #if (defined (__mc68000__) || defined (__mc68020__) \ || defined (__NeXT__) || defined(mc68020)) && W_TYPE_SIZE == 32 # define add_ssaaaa(sh, sl, ah, al, bh, bl) \ __asm__ ("add%.l %5,%1\n" \ "addx%.l %3,%0" \ : "=d" ((USItype)(sh)), \ "=&d" ((USItype)(sl)) \ : "%0" ((USItype)(ah)), \ "d" ((USItype)(bh)), \ "%1" ((USItype)(al)), \ "g" ((USItype)(bl))) # define sub_ddmmss(sh, sl, ah, al, bh, bl) \ __asm__ ("sub%.l %5,%1\n" \ "subx%.l %3,%0" \ : "=d" ((USItype)(sh)), \ "=&d" ((USItype)(sl)) \ : "0" ((USItype)(ah)), \ "d" ((USItype)(bh)), \ "1" ((USItype)(al)), \ "g" ((USItype)(bl))) # if (defined (__mc68020__) || defined (__NeXT__) || defined(mc68020)) # define umul_ppmm(w1, w0, u, v) \ __asm__ ("mulu%.l %3,%1:%0" \ : "=d" ((USItype)(w0)), \ "=d" ((USItype)(w1)) \ : "%0" ((USItype)(u)), \ "dmi" ((USItype)(v))) # define UMUL_TIME 45 # define udiv_qrnnd(q, r, n1, n0, d) \ __asm__ ("divu%.l %4,%1:%0" \ : "=d" ((USItype)(q)), \ "=d" ((USItype)(r)) \ : "0" ((USItype)(n0)), \ "1" ((USItype)(n1)), \ "dmi" ((USItype)(d))) # define UDIV_TIME 90 # define sdiv_qrnnd(q, r, n1, n0, d) \ __asm__ ("divs%.l %4,%1:%0" \ : "=d" ((USItype)(q)), \ "=d" ((USItype)(r)) \ : "0" ((USItype)(n0)), \ "1" ((USItype)(n1)), \ "dmi" ((USItype)(d))) # define count_leading_zeros(count, x) \ __asm__ ("bfffo %1{%b2:%b2},%0" \ : "=d" ((USItype)(count)) \ : "od" ((USItype)(x)), "n" (0)) # define COUNT_LEADING_ZEROS_0 32 # else /* not mc68020 */ # define umul_ppmm(xh, xl, a, b) \ do { USItype __umul_tmp1, __umul_tmp2; \ __asm__ ("| Inlined umul_ppmm \n" \ " move%.l %5,%3 \n" \ " move%.l %2,%0 \n" \ " move%.w %3,%1 \n" \ " swap %3 \n" \ " swap %0 \n" \ " mulu %2,%1 \n" \ " mulu %3,%0 \n" \ " mulu %2,%3 \n" \ " swap %2 \n" \ " mulu %5,%2 \n" \ " add%.l %3,%2 \n" \ " jcc 1f \n" \ " add%.l %#0x10000,%0 \n" \ "1: move%.l %2,%3 \n" \ " clr%.w %2 \n" \ " swap %2 \n" \ " swap %3 \n" \ " clr%.w %3 \n" \ " add%.l %3,%1 \n" \ " addx%.l %2,%0 \n" \ " | End inlined umul_ppmm" \ : "=&d" ((USItype)(xh)), "=&d" ((USItype)(xl)), \ "=d" (__umul_tmp1), "=&d" (__umul_tmp2) \ : "%2" ((USItype)(a)), "d" ((USItype)(b))); \ } while (0) # define UMUL_TIME 100 # define UDIV_TIME 400 # endif /* not mc68020 */ #endif /* mc68000 */ /*************************************** ************** 88000 **************** ***************************************/ #if defined (__m88000__) && W_TYPE_SIZE == 32 # define add_ssaaaa(sh, sl, ah, al, bh, bl) \ __asm__ ("addu.co %1,%r4,%r5\n" \ "addu.ci %0,%r2,%r3" \ : "=r" ((USItype)(sh)), \ "=&r" ((USItype)(sl)) \ : "%rJ" ((USItype)(ah)), \ "rJ" ((USItype)(bh)), \ "%rJ" ((USItype)(al)), \ "rJ" ((USItype)(bl))) # define sub_ddmmss(sh, sl, ah, al, bh, bl) \ __asm__ ("subu.co %1,%r4,%r5\n" \ "subu.ci %0,%r2,%r3" \ : "=r" ((USItype)(sh)), \ "=&r" ((USItype)(sl)) \ : "rJ" ((USItype)(ah)), \ "rJ" ((USItype)(bh)), \ "rJ" ((USItype)(al)), \ "rJ" ((USItype)(bl))) # define count_leading_zeros(count, x) \ do { \ USItype __cbtmp; \ __asm__ ("ff1 %0,%1" \ : "=r" (__cbtmp) \ : "r" ((USItype)(x))); \ (count) = __cbtmp ^ 31; \ } while (0) # define COUNT_LEADING_ZEROS_0 63 /* sic */ # if defined (__m88110__) # define umul_ppmm(wh, wl, u, v) \ do { \ union {UDItype __ll; \ struct {USItype __h, __l;} __i; \ } __x; \ __asm__ ("mulu.d %0,%1,%2" : "=r" (__x.__ll) : "r" (u), "r" (v)); \ (wh) = __x.__i.__h; \ (wl) = __x.__i.__l; \ } while (0) # define udiv_qrnnd(q, r, n1, n0, d) \ ({union {UDItype __ll; \ struct {USItype __h, __l;} __i; \ } __x, __q; \ __x.__i.__h = (n1); __x.__i.__l = (n0); \ __asm__ ("divu.d %0,%1,%2" \ : "=r" (__q.__ll) : "r" (__x.__ll), "r" (d)); \ (r) = (n0) - __q.__l * (d); (q) = __q.__l; }) # define UMUL_TIME 5 # define UDIV_TIME 25 # else # define UMUL_TIME 17 # define UDIV_TIME 150 # endif /* __m88110__ */ #endif /* __m88000__ */ /*************************************** ************** MIPS ***************** ***************************************/ #if defined (__mips__) && W_TYPE_SIZE == 32 # if defined (__clang__) || (__GNUC__ >= 5) || (__GNUC__ == 4 && \ __GNUC_MINOR__ >= 4) # define umul_ppmm(w1, w0, u, v) \ do { \ UDItype __r; \ __r = (UDItype)(u) * (v); \ (w1) = __r >> 32; \ (w0) = (USItype) __r; \ } while (0) # elif __GNUC__ > 2 || __GNUC_MINOR__ >= 7 # define umul_ppmm(w1, w0, u, v) \ __asm__ ("multu %2,%3" \ : "=l" ((USItype)(w0)), \ "=h" ((USItype)(w1)) \ : "d" ((USItype)(u)), \ "d" ((USItype)(v))) # else # define umul_ppmm(w1, w0, u, v) \ __asm__ ("multu %2,%3 \n" \ "mflo %0 \n" \ "mfhi %1" \ : "=d" ((USItype)(w0)), \ "=d" ((USItype)(w1)) \ : "d" ((USItype)(u)), \ "d" ((USItype)(v))) # endif # define UMUL_TIME 10 # define UDIV_TIME 100 #endif /* __mips__ */ /*************************************** ************** MIPS/64 ************** ***************************************/ #if (defined (__mips) && __mips >= 3) && W_TYPE_SIZE == 64 # if defined (__clang__) || (__GNUC__ >= 5) || (__GNUC__ == 4 && \ __GNUC_MINOR__ >= 4) typedef unsigned int UTItype __attribute__ ((mode (TI))); # define umul_ppmm(w1, w0, u, v) \ do { \ UTItype __r; \ __r = (UTItype)(u) * (v); \ (w1) = __r >> 64; \ (w0) = (UDItype) __r; \ } while (0) # elif __GNUC__ > 2 || __GNUC_MINOR__ >= 7 # define umul_ppmm(w1, w0, u, v) \ __asm__ ("dmultu %2,%3" \ : "=l" ((UDItype)(w0)), \ "=h" ((UDItype)(w1)) \ : "d" ((UDItype)(u)), \ "d" ((UDItype)(v))) # else # define umul_ppmm(w1, w0, u, v) \ __asm__ ("dmultu %2,%3 \n" \ "mflo %0 \n" \ "mfhi %1" \ : "=d" ((UDItype)(w0)), \ "=d" ((UDItype)(w1)) \ : "d" ((UDItype)(u)), \ "d" ((UDItype)(v))) # endif # define UMUL_TIME 20 # define UDIV_TIME 140 #endif /* __mips__ */ /*************************************** ************** 32000 **************** ***************************************/ #if defined (__ns32000__) && W_TYPE_SIZE == 32 # define umul_ppmm(w1, w0, u, v) \ ({union {UDItype __ll; \ struct {USItype __l, __h;} __i; \ } __xx; \ __asm__ ("meid %2,%0" \ : "=g" (__xx.__ll) \ : "%0" ((USItype)(u)), \ "g" ((USItype)(v))); \ (w1) = __xx.__i.__h; (w0) = __xx.__i.__l;}) # define __umulsidi3(u, v) \ ({UDItype __w; \ __asm__ ("meid %2,%0" \ : "=g" (__w) \ : "%0" ((USItype)(u)), \ "g" ((USItype)(v))); \ __w; }) # define udiv_qrnnd(q, r, n1, n0, d) \ ({union {UDItype __ll; \ struct {USItype __l, __h;} __i; \ } __xx; \ __xx.__i.__h = (n1); __xx.__i.__l = (n0); \ __asm__ ("deid %2,%0" \ : "=g" (__xx.__ll) \ : "0" (__xx.__ll), \ "g" ((USItype)(d))); \ (r) = __xx.__i.__l; (q) = __xx.__i.__h; }) # define count_trailing_zeros(count,x) \ do { __asm__ ("ffsd %2,%0" \ : "=r" ((USItype) (count)) \ : "0" ((USItype) 0), \ "r" ((USItype) (x))); \ } while (0) #endif /* __ns32000__ */ /*************************************** ************** PPC ****************** ***************************************/ /* Powerpc 32 bit support taken from GCC longlong.h. */ #if (defined (_ARCH_PPC) || defined (__powerpc__)) && W_TYPE_SIZE == 32 # define add_ssaaaa(sh, sl, ah, al, bh, bl) \ do { \ if (__builtin_constant_p (bh) && (bh) == 0) \ __asm__ ("add%I4c %1,%3,%4\n\taddze %0,%2" \ : "=r" (sh), "=&r" (sl) : "r" (ah), "%r" (al), "rI" (bl) \ __CLOBBER_CC); \ else if (__builtin_constant_p (bh) && (bh) == ~(USItype) 0) \ __asm__ ("add%I4c %1,%3,%4\n\taddme %0,%2" \ : "=r" (sh), "=&r" (sl) : "r" (ah), "%r" (al), "rI" (bl) \ __CLOBBER_CC); \ else \ __asm__ ("add%I5c %1,%4,%5\n\tadde %0,%2,%3" \ : "=r" (sh), "=&r" (sl) \ : "%r" (ah), "r" (bh), "%r" (al), "rI" (bl) \ __CLOBBER_CC); \ } while (0) # define sub_ddmmss(sh, sl, ah, al, bh, bl) \ do { \ if (__builtin_constant_p (ah) && (ah) == 0) \ __asm__ ("subf%I3c %1,%4,%3\n\tsubfze %0,%2" \ : "=r" (sh), "=&r" (sl) : "r" (bh), "rI" (al), "r" (bl) \ __CLOBBER_CC); \ else if (__builtin_constant_p (ah) && (ah) == ~(USItype) 0) \ __asm__ ("subf%I3c %1,%4,%3\n\tsubfme %0,%2" \ : "=r" (sh), "=&r" (sl) : "r" (bh), "rI" (al), "r" (bl) \ __CLOBBER_CC); \ else if (__builtin_constant_p (bh) && (bh) == 0) \ __asm__ ("subf%I3c %1,%4,%3\n\taddme %0,%2" \ : "=r" (sh), "=&r" (sl) : "r" (ah), "rI" (al), "r" (bl) \ __CLOBBER_CC); \ else if (__builtin_constant_p (bh) && (bh) == ~(USItype) 0) \ __asm__ ("subf%I3c %1,%4,%3\n\taddze %0,%2" \ : "=r" (sh), "=&r" (sl) : "r" (ah), "rI" (al), "r" (bl) \ __CLOBBER_CC); \ else \ __asm__ ("subf%I4c %1,%5,%4\n\tsubfe %0,%3,%2" \ : "=r" (sh), "=&r" (sl) \ : "r" (ah), "r" (bh), "rI" (al), "r" (bl) \ __CLOBBER_CC); \ } while (0) # define count_leading_zeros(count, x) \ __asm__ ("cntlzw %0,%1" : "=r" (count) : "r" (x)) # define COUNT_LEADING_ZEROS_0 32 # define umul_ppmm(ph, pl, m0, m1) \ do { \ USItype __m0 = (m0), __m1 = (m1); \ __asm__ ("mulhwu %0,%1,%2" : "=r" (ph) : "%r" (m0), "r" (m1)); \ (pl) = __m0 * __m1; \ } while (0) # define UMUL_TIME 15 # define smul_ppmm(ph, pl, m0, m1) \ do { \ SItype __m0 = (m0), __m1 = (m1); \ __asm__ ("mulhw %0,%1,%2" : "=r" (ph) : "%r" (m0), "r" (m1)); \ (pl) = __m0 * __m1; \ } while (0) # define SMUL_TIME 14 # define UDIV_TIME 120 #endif /* 32-bit POWER architecture variants. */ /* Powerpc 64 bit support taken from GCC longlong.h. */ /* We should test _IBMR2 here when we add assembly support for the system vendor compilers. */ #if (defined (_ARCH_PPC64) || defined (__powerpc64__)) && W_TYPE_SIZE == 64 # define add_ssaaaa(sh, sl, ah, al, bh, bl) \ do { \ if (__builtin_constant_p (bh) && (bh) == 0) \ __asm__ ("add%I4c %1,%3,%4\n\taddze %0,%2" \ : "=r" (sh), "=&r" (sl) : "r" (ah), "%r" (al), "rI" (bl) \ __CLOBBER_CC); \ else if (__builtin_constant_p (bh) && (bh) == ~(UDItype) 0) \ __asm__ ("add%I4c %1,%3,%4\n\taddme %0,%2" \ : "=r" (sh), "=&r" (sl) : "r" (ah), "%r" (al), "rI" (bl) \ __CLOBBER_CC); \ else \ __asm__ ("add%I5c %1,%4,%5\n\tadde %0,%2,%3" \ : "=r" (sh), "=&r" (sl) \ : "%r" (ah), "r" (bh), "%r" (al), "rI" (bl) \ __CLOBBER_CC); \ } while (0) # define sub_ddmmss(sh, sl, ah, al, bh, bl) \ do { \ if (__builtin_constant_p (ah) && (ah) == 0) \ __asm__ ("subf%I3c %1,%4,%3\n\tsubfze %0,%2" \ : "=r" (sh), "=&r" (sl) : "r" (bh), "rI" (al), "r" (bl) \ __CLOBBER_CC); \ else if (__builtin_constant_p (ah) && (ah) == ~(UDItype) 0) \ __asm__ ("subf%I3c %1,%4,%3\n\tsubfme %0,%2" \ : "=r" (sh), "=&r" (sl) : "r" (bh), "rI" (al), "r" (bl) \ __CLOBBER_CC); \ else if (__builtin_constant_p (bh) && (bh) == 0) \ __asm__ ("subf%I3c %1,%4,%3\n\taddme %0,%2" \ : "=r" (sh), "=&r" (sl) : "r" (ah), "rI" (al), "r" (bl) \ __CLOBBER_CC); \ else if (__builtin_constant_p (bh) && (bh) == ~(UDItype) 0) \ __asm__ ("subf%I3c %1,%4,%3\n\taddze %0,%2" \ : "=r" (sh), "=&r" (sl) : "r" (ah), "rI" (al), "r" (bl) \ __CLOBBER_CC); \ else \ __asm__ ("subf%I4c %1,%5,%4\n\tsubfe %0,%3,%2" \ : "=r" (sh), "=&r" (sl) \ : "r" (ah), "r" (bh), "rI" (al), "r" (bl) \ __CLOBBER_CC); \ } while (0) # define count_leading_zeros(count, x) \ __asm__ ("cntlzd %0,%1" : "=r" (count) : "r" (x)) # define COUNT_LEADING_ZEROS_0 64 # define umul_ppmm(ph, pl, m0, m1) \ do { \ UDItype __m0 = (m0), __m1 = (m1); \ __asm__ ("mulhdu %0,%1,%2" : "=r" (ph) : "%r" (m0), "r" (m1)); \ (pl) = __m0 * __m1; \ } while (0) # define UMUL_TIME 15 # define smul_ppmm(ph, pl, m0, m1) \ do { \ DItype __m0 = (m0), __m1 = (m1); \ __asm__ ("mulhd %0,%1,%2" : "=r" (ph) : "%r" (m0), "r" (m1)); \ (pl) = __m0 * __m1; \ } while (0) # define SMUL_TIME 14 /* ??? */ # define UDIV_TIME 120 /* ??? */ #endif /* 64-bit PowerPC. */ /*************************************** ************** PYR ****************** ***************************************/ #if defined (__pyr__) && W_TYPE_SIZE == 32 # define add_ssaaaa(sh, sl, ah, al, bh, bl) \ __asm__ ("addw %5,%1 \n" \ "addwc %3,%0" \ : "=r" ((USItype)(sh)), \ "=&r" ((USItype)(sl)) \ : "%0" ((USItype)(ah)), \ "g" ((USItype)(bh)), \ "%1" ((USItype)(al)), \ "g" ((USItype)(bl))) # define sub_ddmmss(sh, sl, ah, al, bh, bl) \ __asm__ ("subw %5,%1 \n" \ "subwb %3,%0" \ : "=r" ((USItype)(sh)), \ "=&r" ((USItype)(sl)) \ : "0" ((USItype)(ah)), \ "g" ((USItype)(bh)), \ "1" ((USItype)(al)), \ "g" ((USItype)(bl))) /* This insn works on Pyramids with AP, XP, or MI CPUs, but not with SP. */ # define umul_ppmm(w1, w0, u, v) \ ({union {UDItype __ll; \ struct {USItype __h, __l;} __i; \ } __xx; \ __asm__ ("movw %1,%R0 \n" \ "uemul %2,%0" \ : "=&r" (__xx.__ll) \ : "g" ((USItype) (u)), \ "g" ((USItype)(v))); \ (w1) = __xx.__i.__h; (w0) = __xx.__i.__l;}) #endif /* __pyr__ */ /*************************************** ************** RT/ROMP ************** ***************************************/ #if defined (__ibm032__) /* RT/ROMP */ && W_TYPE_SIZE == 32 # define add_ssaaaa(sh, sl, ah, al, bh, bl) \ __asm__ ("a %1,%5 \n" \ "ae %0,%3" \ : "=r" ((USItype)(sh)), \ "=&r" ((USItype)(sl)) \ : "%0" ((USItype)(ah)), \ "r" ((USItype)(bh)), \ "%1" ((USItype)(al)), \ "r" ((USItype)(bl))) # define sub_ddmmss(sh, sl, ah, al, bh, bl) \ __asm__ ("s %1,%5\n" \ "se %0,%3" \ : "=r" ((USItype)(sh)), \ "=&r" ((USItype)(sl)) \ : "0" ((USItype)(ah)), \ "r" ((USItype)(bh)), \ "1" ((USItype)(al)), \ "r" ((USItype)(bl))) # define umul_ppmm(ph, pl, m0, m1) \ do { \ USItype __m0 = (m0), __m1 = (m1); \ __asm__ ( \ "s r2,r2 \n" \ "mts r10,%2 \n" \ "m r2,%3 \n" \ "m r2,%3 \n" \ "m r2,%3 \n" \ "m r2,%3 \n" \ "m r2,%3 \n" \ "m r2,%3 \n" \ "m r2,%3 \n" \ "m r2,%3 \n" \ "m r2,%3 \n" \ "m r2,%3 \n" \ "m r2,%3 \n" \ "m r2,%3 \n" \ "m r2,%3 \n" \ "m r2,%3 \n" \ "m r2,%3 \n" \ "m r2,%3 \n" \ "cas %0,r2,r0 \n" \ "mfs r10,%1" \ : "=r" ((USItype)(ph)), \ "=r" ((USItype)(pl)) \ : "%r" (__m0), \ "r" (__m1) \ : "r2"); \ (ph) += ((((SItype) __m0 >> 31) & __m1) \ + (((SItype) __m1 >> 31) & __m0)); \ } while (0) # define UMUL_TIME 20 # define UDIV_TIME 200 # define count_leading_zeros(count, x) \ do { \ if ((x) >= 0x10000) \ __asm__ ("clz %0,%1" \ : "=r" ((USItype)(count)) \ : "r" ((USItype)(x) >> 16)); \ else \ { \ __asm__ ("clz %0,%1" \ : "=r" ((USItype)(count)) \ : "r" ((USItype)(x))); \ (count) += 16; \ } \ } while (0) #endif /* RT/ROMP */ /*************************************** ************** SH2 ****************** ***************************************/ #if (defined (__sh2__) || defined(__sh3__) || defined(__SH4__) ) \ && W_TYPE_SIZE == 32 # define umul_ppmm(w1, w0, u, v) \ __asm__ ( \ "dmulu.l %2,%3\n" \ "sts macl,%1\n" \ "sts mach,%0" \ : "=r" ((USItype)(w1)), \ "=r" ((USItype)(w0)) \ : "r" ((USItype)(u)), \ "r" ((USItype)(v)) \ : "macl", "mach") # define UMUL_TIME 5 #endif /*************************************** ************** SPARC **************** ***************************************/ #if defined (__sparc__) && W_TYPE_SIZE == 32 # define add_ssaaaa(sh, sl, ah, al, bh, bl) \ __asm__ ("addcc %r4,%5,%1\n" \ "addx %r2,%3,%0" \ : "=r" ((USItype)(sh)), \ "=&r" ((USItype)(sl)) \ : "%rJ" ((USItype)(ah)), \ "rI" ((USItype)(bh)), \ "%rJ" ((USItype)(al)), \ "rI" ((USItype)(bl)) \ __CLOBBER_CC) # define sub_ddmmss(sh, sl, ah, al, bh, bl) \ __asm__ ("subcc %r4,%5,%1\n" \ "subx %r2,%3,%0" \ : "=r" ((USItype)(sh)), \ "=&r" ((USItype)(sl)) \ : "rJ" ((USItype)(ah)), \ "rI" ((USItype)(bh)), \ "rJ" ((USItype)(al)), \ "rI" ((USItype)(bl)) \ __CLOBBER_CC) # if defined (__sparc_v8__) || defined(__sparcv8) /* Don't match immediate range because, 1) it is not often useful, 2) the 'I' flag thinks of the range as a 13 bit signed interval, while we want to match a 13 bit interval, sign extended to 32 bits, but INTERPRETED AS UNSIGNED. */ # define umul_ppmm(w1, w0, u, v) \ __asm__ ("umul %2,%3,%1;rd %%y,%0" \ : "=r" ((USItype)(w1)), \ "=r" ((USItype)(w0)) \ : "r" ((USItype)(u)), \ "r" ((USItype)(v))) # define UMUL_TIME 5 # ifndef SUPERSPARC /* SuperSPARC's udiv only handles 53 bit dividends */ # define udiv_qrnnd(q, r, n1, n0, d) \ do { \ USItype __q; \ __asm__ ("mov %1,%%y;nop;nop;nop;udiv %2,%3,%0" \ : "=r" ((USItype)(__q)) \ : "r" ((USItype)(n1)), \ "r" ((USItype)(n0)), \ "r" ((USItype)(d))); \ (r) = (n0) - __q * (d); \ (q) = __q; \ } while (0) # define UDIV_TIME 25 # endif /*!SUPERSPARC */ # else /* ! __sparc_v8__ */ # if defined (__sparclite__) /* This has hardware multiply but not divide. It also has two additional instructions scan (ffs from high bit) and divscc. */ # define umul_ppmm(w1, w0, u, v) \ __asm__ ("umul %2,%3,%1;rd %%y,%0" \ : "=r" ((USItype)(w1)), \ "=r" ((USItype)(w0)) \ : "r" ((USItype)(u)), \ "r" ((USItype)(v))) # define UMUL_TIME 5 # define udiv_qrnnd(q, r, n1, n0, d) \ __asm__ ("! Inlined udiv_qrnnd \n" \ " wr %%g0,%2,%%y ! Not a delayed write for sparclite \n" \ " tst %%g0 \n" \ " divscc %3,%4,%%g1 \n" \ " divscc %%g1,%4,%%g1 \n" \ " divscc %%g1,%4,%%g1 \n" \ " divscc %%g1,%4,%%g1 \n" \ " divscc %%g1,%4,%%g1 \n" \ " divscc %%g1,%4,%%g1 \n" \ " divscc %%g1,%4,%%g1 \n" \ " divscc %%g1,%4,%%g1 \n" \ " divscc %%g1,%4,%%g1 \n" \ " divscc %%g1,%4,%%g1 \n" \ " divscc %%g1,%4,%%g1 \n" \ " divscc %%g1,%4,%%g1 \n" \ " divscc %%g1,%4,%%g1 \n" \ " divscc %%g1,%4,%%g1 \n" \ " divscc %%g1,%4,%%g1 \n" \ " divscc %%g1,%4,%%g1 \n" \ " divscc %%g1,%4,%%g1 \n" \ " divscc %%g1,%4,%%g1 \n" \ " divscc %%g1,%4,%%g1 \n" \ " divscc %%g1,%4,%%g1 \n" \ " divscc %%g1,%4,%%g1 \n" \ " divscc %%g1,%4,%%g1 \n" \ " divscc %%g1,%4,%%g1 \n" \ " divscc %%g1,%4,%%g1 \n" \ " divscc %%g1,%4,%%g1 \n" \ " divscc %%g1,%4,%%g1 \n" \ " divscc %%g1,%4,%%g1 \n" \ " divscc %%g1,%4,%%g1 \n" \ " divscc %%g1,%4,%%g1 \n" \ " divscc %%g1,%4,%%g1 \n" \ " divscc %%g1,%4,%%g1 \n" \ " divscc %%g1,%4,%0 \n" \ " rd %%y,%1 \n" \ " bl,a 1f \n" \ " add %1,%4,%1 \n" \ "1: ! End of inline udiv_qrnnd" \ : "=r" ((USItype)(q)), \ "=r" ((USItype)(r)) \ : "r" ((USItype)(n1)), \ "r" ((USItype)(n0)), \ "rI" ((USItype)(d)) \ : "%g1" __AND_CLOBBER_CC) # define UDIV_TIME 37 # define count_leading_zeros(count, x) \ __asm__ ("scan %1,0,%0" \ : "=r" ((USItype)(x)) \ : "r" ((USItype)(count))) /* Early sparclites return 63 for an argument of 0, but they warn that future implementations might change this. Therefore, leave COUNT_LEADING_ZEROS_0 undefined. */ # endif /* !__sparclite__ */ # endif /* !__sparc_v8__ */ /* Default to sparc v7 versions of umul_ppmm and udiv_qrnnd. */ # ifndef umul_ppmm # define umul_ppmm(w1, w0, u, v) \ __asm__ ("! Inlined umul_ppmm \n" \ " wr %%g0,%2,%%y ! SPARC has 0-3 delay insn after a wr \n" \ " sra %3,31,%%g2 ! Don't move this insn \n" \ " and %2,%%g2,%%g2 ! Don't move this insn \n" \ " andcc %%g0,0,%%g1 ! Don't move this insn \n" \ " mulscc %%g1,%3,%%g1 \n" \ " mulscc %%g1,%3,%%g1 \n" \ " mulscc %%g1,%3,%%g1 \n" \ " mulscc %%g1,%3,%%g1 \n" \ " mulscc %%g1,%3,%%g1 \n" \ " mulscc %%g1,%3,%%g1 \n" \ " mulscc %%g1,%3,%%g1 \n" \ " mulscc %%g1,%3,%%g1 \n" \ " mulscc %%g1,%3,%%g1 \n" \ " mulscc %%g1,%3,%%g1 \n" \ " mulscc %%g1,%3,%%g1 \n" \ " mulscc %%g1,%3,%%g1 \n" \ " mulscc %%g1,%3,%%g1 \n" \ " mulscc %%g1,%3,%%g1 \n" \ " mulscc %%g1,%3,%%g1 \n" \ " mulscc %%g1,%3,%%g1 \n" \ " mulscc %%g1,%3,%%g1 \n" \ " mulscc %%g1,%3,%%g1 \n" \ " mulscc %%g1,%3,%%g1 \n" \ " mulscc %%g1,%3,%%g1 \n" \ " mulscc %%g1,%3,%%g1 \n" \ " mulscc %%g1,%3,%%g1 \n" \ " mulscc %%g1,%3,%%g1 \n" \ " mulscc %%g1,%3,%%g1 \n" \ " mulscc %%g1,%3,%%g1 \n" \ " mulscc %%g1,%3,%%g1 \n" \ " mulscc %%g1,%3,%%g1 \n" \ " mulscc %%g1,%3,%%g1 \n" \ " mulscc %%g1,%3,%%g1 \n" \ " mulscc %%g1,%3,%%g1 \n" \ " mulscc %%g1,%3,%%g1 \n" \ " mulscc %%g1,%3,%%g1 \n" \ " mulscc %%g1,0,%%g1 \n" \ " add %%g1,%%g2,%0 \n" \ " rd %%y,%1" \ : "=r" ((USItype)(w1)), \ "=r" ((USItype)(w0)) \ : "%rI" ((USItype)(u)), \ "r" ((USItype)(v)) \ : "%g1", "%g2" __AND_CLOBBER_CC) # define UMUL_TIME 39 /* 39 instructions */ # endif /* umul_ppmm */ # ifndef udiv_qrnnd # ifndef LONGLONG_STANDALONE # define udiv_qrnnd(q, r, n1, n0, d) \ do { USItype __r; \ (q) = __udiv_qrnnd (&__r, (n1), (n0), (d)); \ (r) = __r; \ } while (0) extern USItype __udiv_qrnnd (); # define UDIV_TIME 140 # endif /* LONGLONG_STANDALONE */ # endif /* udiv_qrnnd */ #endif /* __sparc__ */ /*************************************** ************** VAX ****************** ***************************************/ #if defined (__vax__) && W_TYPE_SIZE == 32 # define add_ssaaaa(sh, sl, ah, al, bh, bl) \ __asm__ ("addl2 %5,%1\n" \ "adwc %3,%0" \ : "=g" ((USItype)(sh)), \ "=&g" ((USItype)(sl)) \ : "%0" ((USItype)(ah)), \ "g" ((USItype)(bh)), \ "%1" ((USItype)(al)), \ "g" ((USItype)(bl))) # define sub_ddmmss(sh, sl, ah, al, bh, bl) \ __asm__ ("subl2 %5,%1\n" \ "sbwc %3,%0" \ : "=g" ((USItype)(sh)), \ "=&g" ((USItype)(sl)) \ : "0" ((USItype)(ah)), \ "g" ((USItype)(bh)), \ "1" ((USItype)(al)), \ "g" ((USItype)(bl))) # define umul_ppmm(xh, xl, m0, m1) \ do { \ union {UDItype __ll; \ struct {USItype __l, __h;} __i; \ } __xx; \ USItype __m0 = (m0), __m1 = (m1); \ __asm__ ("emul %1,%2,$0,%0" \ : "=g" (__xx.__ll) \ : "g" (__m0), \ "g" (__m1)); \ (xh) = __xx.__i.__h; (xl) = __xx.__i.__l; \ (xh) += ((((SItype) __m0 >> 31) & __m1) \ + (((SItype) __m1 >> 31) & __m0)); \ } while (0) # define sdiv_qrnnd(q, r, n1, n0, d) \ do { \ union {DItype __ll; \ struct {SItype __l, __h;} __i; \ } __xx; \ __xx.__i.__h = (n1); __xx.__i.__l = (n0); \ __asm__ ("ediv %3,%2,%0,%1" \ : "=g" (q), "=g" (r) \ : "g" (__xx.__ll), "g" (d)); \ } while (0) #endif /* __vax__ */ /*************************************** ************** Z8000 **************** ***************************************/ #if defined (__z8000__) && W_TYPE_SIZE == 16 # define add_ssaaaa(sh, sl, ah, al, bh, bl) \ __asm__ ("add %H1,%H5\n\tadc %H0,%H3" \ : "=r" ((unsigned int)(sh)), \ "=&r" ((unsigned int)(sl)) \ : "%0" ((unsigned int)(ah)), \ "r" ((unsigned int)(bh)), \ "%1" ((unsigned int)(al)), \ "rQR" ((unsigned int)(bl))) # define sub_ddmmss(sh, sl, ah, al, bh, bl) \ __asm__ ("sub %H1,%H5\n\tsbc %H0,%H3" \ : "=r" ((unsigned int)(sh)), \ "=&r" ((unsigned int)(sl)) \ : "0" ((unsigned int)(ah)), \ "r" ((unsigned int)(bh)), \ "1" ((unsigned int)(al)), \ "rQR" ((unsigned int)(bl))) # define umul_ppmm(xh, xl, m0, m1) \ do { \ union {long int __ll; \ struct {unsigned int __h, __l;} __i; \ } __xx; \ unsigned int __m0 = (m0), __m1 = (m1); \ __asm__ ("mult %S0,%H3" \ : "=r" (__xx.__i.__h), \ "=r" (__xx.__i.__l) \ : "%1" (__m0), \ "rQR" (__m1)); \ (xh) = __xx.__i.__h; (xl) = __xx.__i.__l; \ (xh) += ((((signed int) __m0 >> 15) & __m1) \ + (((signed int) __m1 >> 15) & __m0)); \ } while (0) #endif /* __z8000__ */ /*************************************** *********** s390x/zSeries ************ ***************************************/ #if defined (__s390x__) && W_TYPE_SIZE == 64 && __GNUC__ >= 4 # define add_ssaaaa(sh, sl, ah, al, bh, bl) \ __asm__ ("algr %1,%5\n" \ "alcgr %0,%3\n" \ : "=r" ((sh)), \ "=&r" ((sl)) \ : "0" ((UDItype)(ah)), \ "r" ((UDItype)(bh)), \ "1" ((UDItype)(al)), \ "r" ((UDItype)(bl)) \ __CLOBBER_CC) # define sub_ddmmss(sh, sl, ah, al, bh, bl) \ __asm__ ("slgr %1,%5\n" \ "slbgr %0,%3\n" \ : "=r" ((sh)), \ "=&r" ((sl)) \ : "0" ((UDItype)(ah)), \ "r" ((UDItype)(bh)), \ "1" ((UDItype)(al)), \ "r" ((UDItype)(bl)) \ __CLOBBER_CC) typedef unsigned int UTItype __attribute__ ((mode (TI))); # define umul_ppmm(w1, w0, u, v) \ do { \ UTItype ___r; \ __asm__ ("mlgr %0,%2" \ : "=r" (___r) \ : "0" ((UDItype)(u)), \ "r" ((UDItype)(v))); \ (w1) = ___r >> 64; \ (w0) = (UDItype) ___r; \ } while (0) # define udiv_qrnnd(q, r, n1, n0, d) \ do { \ UTItype ___r = ((UTItype)n1 << 64) | n0; \ __asm__ ("dlgr %0,%2" \ : "=r" (___r) \ : "0" (___r), \ "r" ((UDItype)(d))); \ (r) = ___r >> 64; \ (q) = (UDItype) ___r; \ } while (0) #endif /* __s390x__ */ /*************************************** ***** End CPU Specific Versions ***** ***************************************/ #endif /* __GNUC__ */ #endif /* !__riscos__ */ /*************************************** *********** Generic Versions ******** ***************************************/ #if !defined (umul_ppmm) && defined (__umulsidi3) # define umul_ppmm(ph, pl, m0, m1) \ { \ UDWtype __ll = __umulsidi3 (m0, m1); \ ph = (UWtype) (__ll >> W_TYPE_SIZE); \ pl = (UWtype) __ll; \ } #endif #if !defined (__umulsidi3) # define __umulsidi3(u, v) \ ({UWtype __hi, __lo; \ umul_ppmm (__hi, __lo, u, v); \ ((UDWtype) __hi << W_TYPE_SIZE) | __lo; }) #endif /* If this machine has no inline assembler, use C macros. */ #if !defined (add_ssaaaa) && defined (UDWtype) /* Use double word type when available. */ # define add_ssaaaa(sh, sl, ah, al, bh, bl) \ do { \ UDWtype __audw = (ah); \ UDWtype __budw = (bh); \ __audw <<= W_TYPE_SIZE; \ __audw |= (al); \ __budw <<= W_TYPE_SIZE; \ __budw |= (bl); \ __audw += __budw; \ (sh) = (UWtype)(__audw >> W_TYPE_SIZE); \ (sl) = (UWtype)(__audw); \ } while (0) #elif !defined (add_ssaaaa) # define add_ssaaaa(sh, sl, ah, al, bh, bl) \ do { \ UWtype __x; \ __x = (al) + (bl); \ (sh) = (ah) + (bh) + (__x < (al)); \ (sl) = __x; \ } while (0) #endif #if !defined (sub_ddmmss) && defined (UDWtype) /* Use double word type when available. */ # define sub_ddmmss(sh, sl, ah, al, bh, bl) \ do { \ UDWtype __audw = (ah); \ UDWtype __budw = (bh); \ __audw <<= W_TYPE_SIZE; \ __audw |= (al); \ __budw <<= W_TYPE_SIZE; \ __budw |= (bl); \ __audw -= __budw; \ (sh) = (UWtype)(__audw >> W_TYPE_SIZE); \ (sl) = (UWtype)(__audw); \ } while (0) #elif !defined (sub_ddmmss) # define sub_ddmmss(sh, sl, ah, al, bh, bl) \ do { \ UWtype __x; \ __x = (al) - (bl); \ (sh) = (ah) - (bh) - (__x > (al)); \ (sl) = __x; \ } while (0) #endif #if !defined (umul_ppmm) && defined (UDWtype) # define umul_ppmm(w1, w0, u, v) \ do { \ UDWtype __x = (u); \ __x *= (v); \ (w1) = (UWtype)(__x >> W_TYPE_SIZE); \ (w0) = (UWtype)(__x); \ } while (0) #elif !defined (umul_ppmm) # define umul_ppmm(w1, w0, u, v) \ do { \ UWtype __x0, __x1, __x2, __x3; \ UHWtype __ul, __vl, __uh, __vh; \ UWtype __u = (u), __v = (v); \ \ __ul = __ll_lowpart (__u); \ __uh = __ll_highpart (__u); \ __vl = __ll_lowpart (__v); \ __vh = __ll_highpart (__v); \ \ __x0 = (UWtype) __ul * __vl; \ __x1 = (UWtype) __ul * __vh; \ __x2 = (UWtype) __uh * __vl; \ __x3 = (UWtype) __uh * __vh; \ \ __x1 += __ll_highpart (__x0);/* this can't give carry */ \ __x1 += __x2; /* but this indeed can */ \ if (__x1 < __x2) /* did we get it? */ \ __x3 += __ll_B; /* yes, add it in the proper pos. */ \ \ (w1) = __x3 + __ll_highpart (__x1); \ (w0) = (__ll_lowpart (__x1) << W_TYPE_SIZE/2) + __ll_lowpart (__x0);\ } while (0) #endif #if !defined (smul_ppmm) # define smul_ppmm(w1, w0, u, v) \ do { \ UWtype __w1; \ UWtype __m0 = (u), __m1 = (v); \ umul_ppmm (__w1, w0, __m0, __m1); \ (w1) = __w1 - (-(__m0 >> (W_TYPE_SIZE - 1)) & __m1) \ - (-(__m1 >> (W_TYPE_SIZE - 1)) & __m0); \ } while (0) #endif /* Define this unconditionally, so it can be used for debugging. */ #define __udiv_qrnnd_c(q, r, n1, n0, d) \ do { \ UWtype __d1, __d0, __q1, __q0, __r1, __r0, __m; \ __d1 = __ll_highpart (d); \ __d0 = __ll_lowpart (d); \ \ __r1 = (n1) % __d1; \ __q1 = (n1) / __d1; \ __m = (UWtype) __q1 * __d0; \ __r1 = __r1 * __ll_B | __ll_highpart (n0); \ if (__r1 < __m) \ { \ __q1--, __r1 += (d); \ if (__r1 >= (d)) /* i.e. we didn't get carry when adding to __r1 */\ if (__r1 < __m) \ __q1--, __r1 += (d); \ } \ __r1 -= __m; \ \ __r0 = __r1 % __d1; \ __q0 = __r1 / __d1; \ __m = (UWtype) __q0 * __d0; \ __r0 = __r0 * __ll_B | __ll_lowpart (n0); \ if (__r0 < __m) \ { \ __q0--, __r0 += (d); \ if (__r0 >= (d)) \ if (__r0 < __m) \ __q0--, __r0 += (d); \ } \ __r0 -= __m; \ \ (q) = (UWtype) __q1 * __ll_B | __q0; \ (r) = __r0; \ } while (0) /* Use double word type if available. */ #if !defined (udiv_qrnnd) && defined (UDWtype) && !defined(__arm__) && !defined(__mips__) && !defined(__powerpc__) # define udiv_qrnnd(q, r, nh, nl, d) \ do { \ UWtype __d = (d); \ UDWtype __nudw = (nh); \ __nudw <<= W_TYPE_SIZE; \ __nudw |= (nl); \ (q) = (UWtype)(__nudw / __d); \ (r) = (UWtype)(__nudw % __d); \ } while (0) #endif /* If the processor has no udiv_qrnnd but sdiv_qrnnd, go through __udiv_w_sdiv (defined in libgcc or elsewhere). */ #if !defined (udiv_qrnnd) && defined (sdiv_qrnnd) # define udiv_qrnnd(q, r, nh, nl, d) \ do { \ UWtype __r; \ (q) = __MPN(udiv_w_sdiv) (&__r, nh, nl, d); \ (r) = __r; \ } while (0) #endif /* If udiv_qrnnd was not defined for this processor, use __udiv_qrnnd_c. */ #if !defined (udiv_qrnnd) # define UDIV_NEEDS_NORMALIZATION 1 # define udiv_qrnnd __udiv_qrnnd_c #endif #if !defined (count_leading_zeros) # if defined (HAVE_BUILTIN_CLZL) && SIZEOF_UNSIGNED_LONG * 8 == W_TYPE_SIZE # define count_leading_zeros(count, x) (count = __builtin_clzl(x)) # undef COUNT_LEADING_ZEROS_0 /* Input X=0 is undefined for the builtin. */ # elif defined (HAVE_BUILTIN_CLZ) && SIZEOF_UNSIGNED_INT * 8 == W_TYPE_SIZE # define count_leading_zeros(count, x) (count = __builtin_clz(x)) # undef COUNT_LEADING_ZEROS_0 /* Input X=0 is undefined for the builtin. */ # endif #endif #if !defined (count_trailing_zeros) # if defined (HAVE_BUILTIN_CTZL) && SIZEOF_UNSIGNED_LONG * 8 == W_TYPE_SIZE # define count_trailing_zeros(count, x) (count = __builtin_ctzl(x)) # undef COUNT_LEADING_ZEROS_0 /* Input X=0 is undefined for the builtin. */ # elif defined (HAVE_BUILTIN_CTZ) && SIZEOF_UNSIGNED_INT * 8 == W_TYPE_SIZE # define count_trailing_zeros(count, x) (count = __builtin_ctz(x)) # undef COUNT_LEADING_ZEROS_0 /* Input X=0 is undefined for the builtin. */ # endif #endif #if !defined (count_leading_zeros) extern # ifdef __STDC__ const # endif unsigned char _gcry_clz_tab[]; # define MPI_INTERNAL_NEED_CLZ_TAB 1 # define count_leading_zeros(count, x) \ do { \ UWtype __xr = (x); \ UWtype __a; \ \ if (W_TYPE_SIZE <= 32) \ { \ __a = __xr < ((UWtype) 1 << 2*__BITS4) \ ? (__xr < ((UWtype) 1 << __BITS4) ? 0 : __BITS4) \ : (__xr < ((UWtype) 1 << 3*__BITS4) ? 2*__BITS4 : 3*__BITS4);\ } \ else \ { \ for (__a = W_TYPE_SIZE - 8; __a > 0; __a -= 8) \ if (((__xr >> __a) & 0xff) != 0) \ break; \ } \ \ (count) = W_TYPE_SIZE - (_gcry_clz_tab[__xr >> __a] + __a); \ } while (0) /* This version gives a well-defined value for zero. */ # define COUNT_LEADING_ZEROS_0 W_TYPE_SIZE #endif /* !count_leading_zeros */ #if !defined (count_trailing_zeros) /* Define count_trailing_zeros using count_leading_zeros. The latter might be defined in asm, but if it is not, the C version above is good enough. */ # define count_trailing_zeros(count, x) \ do { \ UWtype __ctz_x = (x); \ UWtype __ctz_c; \ count_leading_zeros (__ctz_c, __ctz_x & -__ctz_x); \ (count) = W_TYPE_SIZE - 1 - __ctz_c; \ } while (0) #endif /* !count_trailing_zeros */ #ifndef UDIV_NEEDS_NORMALIZATION # define UDIV_NEEDS_NORMALIZATION 0 #endif /*************************************** ****** longlong.h ends here ********* ***************************************/ grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/mpi/mpi-mul.c0000644000175000017500000001340215036452441021702 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ /* mpi-mul.c - MPI functions * Copyright (C) 1994, 1996, 1998, 2001, 2002, 2003 Free Software Foundation, Inc. * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . * SPDX-License-Identifier: LGPL-2.1-or-later * * Note: This code is heavily based on the GNU MP Library. * Actually it's the same code with only minor changes in the * way the data is stored; this is to support the abstraction * of an optional secure memory allocation which may be used * to avoid revealing of sensitive data due to paging etc. */ #include #include #include #include "mpi-internal.h" void _gcry_mpi_mul_ui (gcry_mpi_t prod, gcry_mpi_t mult, unsigned long small_mult) { mpi_size_t size, prod_size; mpi_ptr_t prod_ptr; mpi_limb_t cy; int sign; size = mult->nlimbs; sign = mult->sign; if( !size || !small_mult ) { prod->nlimbs = 0; prod->sign = 0; return; } prod_size = size + 1; if( prod->alloced < prod_size ) mpi_resize( prod, prod_size ); prod_ptr = prod->d; cy = _gcry_mpih_mul_1( prod_ptr, mult->d, size, (mpi_limb_t)small_mult ); if( cy ) prod_ptr[size++] = cy; prod->nlimbs = size; prod->sign = sign; } void _gcry_mpi_mul_2exp (gcry_mpi_t w, gcry_mpi_t u, unsigned long cnt) { mpi_size_t usize, wsize, limb_cnt; mpi_ptr_t wp; mpi_limb_t wlimb; int usign, wsign; usize = u->nlimbs; usign = u->sign; if( !usize ) { w->nlimbs = 0; w->sign = 0; return; } limb_cnt = cnt / BITS_PER_MPI_LIMB; wsize = usize + limb_cnt + 1; if( w->alloced < wsize ) mpi_resize(w, wsize ); wp = w->d; wsize = usize + limb_cnt; wsign = usign; cnt %= BITS_PER_MPI_LIMB; if( cnt ) { wlimb = _gcry_mpih_lshift( wp + limb_cnt, u->d, usize, cnt ); if( wlimb ) { wp[wsize] = wlimb; wsize++; } } else { MPN_COPY_DECR( wp + limb_cnt, u->d, usize ); } /* Zero all whole limbs at low end. Do it here and not before calling * mpn_lshift, not to lose for U == W. */ MPN_ZERO( wp, limb_cnt ); w->nlimbs = wsize; w->sign = wsign; } void _gcry_mpi_mul (gcry_mpi_t w, gcry_mpi_t u, gcry_mpi_t v) { mpi_size_t usize, vsize, wsize; mpi_ptr_t up, vp, wp; mpi_limb_t cy; int usign, vsign, usecure, vsecure, sign_product; int assign_wp=0; mpi_ptr_t tmp_limb=NULL; unsigned int tmp_limb_nlimbs = 0; if( u->nlimbs < v->nlimbs ) { /* Swap U and V. */ usize = v->nlimbs; usign = v->sign; usecure = mpi_is_secure(v); up = v->d; vsize = u->nlimbs; vsign = u->sign; vsecure = mpi_is_secure(u); vp = u->d; } else { usize = u->nlimbs; usign = u->sign; usecure = mpi_is_secure(u); up = u->d; vsize = v->nlimbs; vsign = v->sign; vsecure = mpi_is_secure(v); vp = v->d; } sign_product = usign ^ vsign; wp = w->d; /* Ensure W has space enough to store the result. */ wsize = usize + vsize; if ( !mpi_is_secure (w) && (mpi_is_secure (u) || mpi_is_secure (v)) ) { /* w is not allocated in secure space but u or v is. To make sure * that no temporray results are stored in w, we temporary use * a newly allocated limb space for w */ wp = mpi_alloc_limb_space( wsize, 1 ); assign_wp = 2; /* mark it as 2 so that we can later copy it back to * mormal memory */ } else if( w->alloced < wsize ) { if( wp == up || wp == vp ) { wp = mpi_alloc_limb_space( wsize, mpi_is_secure(w) ); assign_wp = 1; } else { mpi_resize(w, wsize ); wp = w->d; } } else { /* Make U and V not overlap with W. */ if( wp == up ) { /* W and U are identical. Allocate temporary space for U. */ tmp_limb_nlimbs = usize; up = tmp_limb = mpi_alloc_limb_space( usize, usecure ); /* Is V identical too? Keep it identical with U. */ if( wp == vp ) vp = up; /* Copy to the temporary space. */ MPN_COPY( up, wp, usize ); } else if( wp == vp ) { /* W and V are identical. Allocate temporary space for V. */ tmp_limb_nlimbs = vsize; vp = tmp_limb = mpi_alloc_limb_space( vsize, vsecure ); /* Copy to the temporary space. */ MPN_COPY( vp, wp, vsize ); } } if( !vsize ) wsize = 0; else { cy = _gcry_mpih_mul( wp, up, usize, vp, vsize ); wsize -= cy? 0:1; } if( assign_wp ) { if (assign_wp == 2) { /* copy the temp wp from secure memory back to normal memory */ mpi_ptr_t tmp_wp = mpi_alloc_limb_space (wsize, 0); MPN_COPY (tmp_wp, wp, wsize); _gcry_mpi_free_limb_space (wp, 0); wp = tmp_wp; } _gcry_mpi_assign_limb_space( w, wp, wsize ); } w->nlimbs = wsize; w->sign = sign_product; if( tmp_limb ) _gcry_mpi_free_limb_space (tmp_limb, tmp_limb_nlimbs); } void _gcry_mpi_mulm (gcry_mpi_t w, gcry_mpi_t u, gcry_mpi_t v, gcry_mpi_t m) { gcry_mpi_t temp_m = NULL; if (w == m) { temp_m = mpi_copy (m); m = temp_m; } mpi_mul (w, u, v); _gcry_mpi_tdiv_r (w, w, m); if (temp_m) mpi_free(temp_m); } grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/mpi/ec-internal.h0000644000175000017500000000344215036452441022533 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ /* ec-internal.h - Internal declarations of ec*.c * Copyright (C) 2013 g10 Code GmbH * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . */ #ifndef GCRY_EC_INTERNAL_H #define GCRY_EC_INTERNAL_H #include void _gcry_mpi_ec_ed25519_mod (gcry_mpi_t a); #ifndef ASM_DISABLED void _gcry_mpi_ec_nist192_mod (gcry_mpi_t w, mpi_ec_t ctx); void _gcry_mpi_ec_nist224_mod (gcry_mpi_t w, mpi_ec_t ctx); void _gcry_mpi_ec_nist256_mod (gcry_mpi_t w, mpi_ec_t ctx); void _gcry_mpi_ec_nist384_mod (gcry_mpi_t w, mpi_ec_t ctx); void _gcry_mpi_ec_nist521_mod (gcry_mpi_t w, mpi_ec_t ctx); #else # define _gcry_mpi_ec_nist192_mod NULL # define _gcry_mpi_ec_nist224_mod NULL # define _gcry_mpi_ec_nist256_mod NULL # define _gcry_mpi_ec_nist384_mod NULL # define _gcry_mpi_ec_nist521_mod NULL #endif #ifdef HAVE_GCC_INLINE_ASM_S390X int _gcry_s390x_ec_hw_mul_point (mpi_point_t result, gcry_mpi_t scalar, mpi_point_t point, mpi_ec_t ctx); # define mpi_ec_hw_mul_point _gcry_s390x_ec_hw_mul_point #else # define mpi_ec_hw_mul_point(r,s,p,c) (-1) #endif #endif /*GCRY_EC_INTERNAL_H*/ grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/mpi/asm-common-amd64.h0000644000175000017500000000205015036452441023303 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ /* asm-common-amd64.h - Common macros for AMD64 assembly * * Copyright (C) 2022 Jussi Kivilinna * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . */ #ifndef MPI_ASM_COMMON_AMD64_H #define MPI_ASM_COMMON_AMD64_H #include "../cipher/asm-common-amd64.h" #endif /* MPI_ASM_COMMON_AMD64_H */ grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/mpi/mpi-asm-defs.h0000644000175000017500000000051115036452441022606 00000000000000/* This file defines some basic constants for the MPI machinery. * AMD64 compiled for the x32 ABI is special and thus we can't use the * standard values for this ABI. */ #if __GNUC__ >= 3 && defined(__x86_64__) && defined(__ILP32__) #define BYTES_PER_MPI_LIMB 8 #else #define BYTES_PER_MPI_LIMB (SIZEOF_UNSIGNED_LONG) #endif grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/mpi/mpi-pow.c0000644000175000017500000005351715036452441021725 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ /* mpi-pow.c - MPI functions for exponentiation * Copyright (C) 1994, 1996, 1998, 2000, 2002 * 2003 Free Software Foundation, Inc. * 2013 g10 Code GmbH * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . * * Note: This code is heavily based on the GNU MP Library. * Actually it's the same code with only minor changes in the * way the data is stored; this is to support the abstraction * of an optional secure memory allocation which may be used * to avoid revealing of sensitive data due to paging etc. */ #include #include #include #include #include "mpi-internal.h" #include "longlong.h" /* * When you need old implementation, please add compilation option * -DUSE_ALGORITHM_SIMPLE_EXPONENTIATION * or expose this line: #define USE_ALGORITHM_SIMPLE_EXPONENTIATION 1 */ #if defined(USE_ALGORITHM_SIMPLE_EXPONENTIATION) /**************** * RES = BASE ^ EXPO mod MOD */ void _gcry_mpi_powm (gcry_mpi_t res, gcry_mpi_t base, gcry_mpi_t expo, gcry_mpi_t mod) { /* Pointer to the limbs of the arguments, their size and signs. */ mpi_ptr_t rp, ep, mp, bp; mpi_size_t esize, msize, bsize, rsize; int msign, bsign, rsign; /* Flags telling the secure allocation status of the arguments. */ int esec, msec, bsec; /* Size of the result including space for temporary values. */ mpi_size_t size; /* Helper. */ int mod_shift_cnt; int negative_result; mpi_ptr_t mp_marker = NULL; mpi_ptr_t bp_marker = NULL; mpi_ptr_t ep_marker = NULL; mpi_ptr_t xp_marker = NULL; unsigned int mp_nlimbs = 0; unsigned int bp_nlimbs = 0; unsigned int ep_nlimbs = 0; unsigned int xp_nlimbs = 0; mpi_ptr_t tspace = NULL; mpi_size_t tsize = 0; esize = expo->nlimbs; msize = mod->nlimbs; size = 2 * msize; msign = mod->sign; esec = mpi_is_secure(expo); msec = mpi_is_secure(mod); bsec = mpi_is_secure(base); rp = res->d; ep = expo->d; MPN_NORMALIZE(ep, esize); if (!msize) _gcry_divide_by_zero(); if (!esize) { /* Exponent is zero, result is 1 mod MOD, i.e., 1 or 0 depending on if MOD equals 1. */ res->nlimbs = (msize == 1 && mod->d[0] == 1) ? 0 : 1; if (res->nlimbs) { RESIZE_IF_NEEDED (res, 1); rp = res->d; rp[0] = 1; } res->sign = 0; goto leave; } /* Normalize MOD (i.e. make its most significant bit set) as required by mpn_divrem. This will make the intermediate values in the calculation slightly larger, but the correct result is obtained after a final reduction using the original MOD value. */ mp_nlimbs = msec? msize:0; mp = mp_marker = mpi_alloc_limb_space(msize, msec); count_leading_zeros (mod_shift_cnt, mod->d[msize-1]); if (mod_shift_cnt) _gcry_mpih_lshift (mp, mod->d, msize, mod_shift_cnt); else MPN_COPY( mp, mod->d, msize ); bsize = base->nlimbs; bsign = base->sign; if (bsize > msize) { /* The base is larger than the module. Reduce it. Allocate (BSIZE + 1) with space for remainder and quotient. (The quotient is (bsize - msize + 1) limbs.) */ bp_nlimbs = bsec ? (bsize + 1):0; bp = bp_marker = mpi_alloc_limb_space( bsize + 1, bsec ); MPN_COPY ( bp, base->d, bsize ); /* We don't care about the quotient, store it above the * remainder, at BP + MSIZE. */ _gcry_mpih_divrem( bp + msize, 0, bp, bsize, mp, msize ); bsize = msize; /* Canonicalize the base, since we are going to multiply with it quite a few times. */ MPN_NORMALIZE( bp, bsize ); } else bp = base->d; if (!bsize) { res->nlimbs = 0; res->sign = 0; goto leave; } /* Make BASE, EXPO and MOD not overlap with RES. */ if ( rp == bp ) { /* RES and BASE are identical. Allocate temp. space for BASE. */ gcry_assert (!bp_marker); bp_nlimbs = bsec? bsize:0; bp = bp_marker = mpi_alloc_limb_space( bsize, bsec ); MPN_COPY(bp, rp, bsize); } if ( rp == ep ) { /* RES and EXPO are identical. Allocate temp. space for EXPO. */ ep_nlimbs = esec? esize:0; ep = ep_marker = mpi_alloc_limb_space( esize, esec ); MPN_COPY(ep, rp, esize); } if ( rp == mp ) { /* RES and MOD are identical. Allocate temporary space for MOD.*/ gcry_assert (!mp_marker); mp_nlimbs = msec?msize:0; mp = mp_marker = mpi_alloc_limb_space( msize, msec ); MPN_COPY(mp, rp, msize); } /* Copy base to the result. */ if (res->alloced < size) { mpi_resize (res, size); rp = res->d; } MPN_COPY ( rp, bp, bsize ); rsize = bsize; rsign = 0; /* Main processing. */ { mpi_size_t i; mpi_ptr_t xp; int c; mpi_limb_t e; mpi_limb_t carry_limb; struct karatsuba_ctx karactx; struct gcry_mpi w, u; xp_nlimbs = msec? size:0; xp = xp_marker = mpi_alloc_limb_space( size, msec ); w.sign = u.sign = 0; w.flags = u.flags = 0; w.alloced = w.nlimbs = size; /* RES->alloc may be longer. */ u.alloced = u.nlimbs = size; memset( &karactx, 0, sizeof karactx ); negative_result = (ep[0] & 1) && bsign; i = esize - 1; e = ep[i]; count_leading_zeros (c, e); e = (e << c) << 1; /* Shift the expo bits to the left, lose msb. */ c = BITS_PER_MPI_LIMB - 1 - c; /* Main loop. Make the result be pointed to alternately by XP and RP. This helps us avoid block copying, which would otherwise be necessary with the overlap restrictions of _gcry_mpih_divmod. With 50% probability the result after this loop will be in the area originally pointed by RP (==RES->d), and with 50% probability in the area originally pointed to by XP. */ for (;;) { while (c) { mpi_ptr_t tp; mpi_size_t xsize; /*mpih_mul_n(xp, rp, rp, rsize);*/ if ( rsize < KARATSUBA_THRESHOLD ) _gcry_mpih_sqr_n_basecase( xp, rp, rsize ); else { if ( !tspace ) { tsize = 2 * rsize; tspace = mpi_alloc_limb_space( tsize, 0 ); } else if ( tsize < (2*rsize) ) { _gcry_mpi_free_limb_space (tspace, 0); tsize = 2 * rsize; tspace = mpi_alloc_limb_space (tsize, 0 ); } _gcry_mpih_sqr_n (xp, rp, rsize, tspace); } xsize = 2 * rsize; if ( xsize > msize ) { _gcry_mpih_divrem(xp + msize, 0, xp, xsize, mp, msize); xsize = msize; } tp = rp; rp = xp; xp = tp; rsize = xsize; /* To mitigate the Yarom/Falkner flush+reload cache * side-channel attack on the RSA secret exponent, we do * the multiplication regardless of the value of the * high-bit of E. But to avoid this performance penalty * we do it only if the exponent has been stored in secure * memory and we can thus assume it is a secret exponent. */ if (esec || (mpi_limb_signed_t)e < 0) { /*mpih_mul( xp, rp, rsize, bp, bsize );*/ if( bsize < KARATSUBA_THRESHOLD ) _gcry_mpih_mul ( xp, rp, rsize, bp, bsize ); else _gcry_mpih_mul_karatsuba_case (xp, rp, rsize, bp, bsize, &karactx); xsize = rsize + bsize; if ( xsize > msize ) { _gcry_mpih_divrem(xp + msize, 0, xp, xsize, mp, msize); xsize = msize; } } w.d = rp; u.d = xp; mpi_set_cond (&w, &u, ((mpi_limb_signed_t)e < 0)); e <<= 1; c--; } i--; if ( i < 0 ) break; e = ep[i]; c = BITS_PER_MPI_LIMB; } /* We shifted MOD, the modulo reduction argument, left MOD_SHIFT_CNT steps. Adjust the result by reducing it with the original MOD. Also make sure the result is put in RES->d (where it already might be, see above). */ if ( mod_shift_cnt ) { carry_limb = _gcry_mpih_lshift( res->d, rp, rsize, mod_shift_cnt); rp = res->d; if ( carry_limb ) { rp[rsize] = carry_limb; rsize++; } } else if (res->d != rp) { MPN_COPY (res->d, rp, rsize); rp = res->d; } if ( rsize >= msize ) { _gcry_mpih_divrem(rp + msize, 0, rp, rsize, mp, msize); rsize = msize; } /* Remove any leading zero words from the result. */ if ( mod_shift_cnt ) _gcry_mpih_rshift( rp, rp, rsize, mod_shift_cnt); MPN_NORMALIZE (rp, rsize); _gcry_mpih_release_karatsuba_ctx (&karactx ); } /* Fixup for negative results. */ if ( negative_result && rsize ) { if ( mod_shift_cnt ) _gcry_mpih_rshift( mp, mp, msize, mod_shift_cnt); _gcry_mpih_sub( rp, mp, msize, rp, rsize); rsize = msize; rsign = msign; MPN_NORMALIZE(rp, rsize); } gcry_assert (res->d == rp); res->nlimbs = rsize; res->sign = rsign; leave: if (mp_marker) _gcry_mpi_free_limb_space( mp_marker, mp_nlimbs ); if (bp_marker) _gcry_mpi_free_limb_space( bp_marker, bp_nlimbs ); if (ep_marker) _gcry_mpi_free_limb_space( ep_marker, ep_nlimbs ); if (xp_marker) _gcry_mpi_free_limb_space( xp_marker, xp_nlimbs ); if (tspace) _gcry_mpi_free_limb_space( tspace, 0 ); } #else /** * Internal function to compute * * X = R * S mod M * * and set the size of X at the pointer XSIZE_P. * Use karatsuba structure at KARACTX_P. * * Condition: * RSIZE >= SSIZE * Enough space for X is allocated beforehand. * * For generic cases, we can/should use gcry_mpi_mulm. * This function is use for specific internal case. */ static void mul_mod (mpi_ptr_t xp, mpi_size_t *xsize_p, mpi_ptr_t rp, mpi_size_t rsize, mpi_ptr_t sp, mpi_size_t ssize, mpi_ptr_t mp, mpi_size_t msize, struct karatsuba_ctx *karactx_p) { if( ssize < KARATSUBA_THRESHOLD ) _gcry_mpih_mul ( xp, rp, rsize, sp, ssize ); else _gcry_mpih_mul_karatsuba_case (xp, rp, rsize, sp, ssize, karactx_p); if (rsize + ssize > msize) { _gcry_mpih_divrem (xp + msize, 0, xp, rsize + ssize, mp, msize); *xsize_p = msize; } else *xsize_p = rsize + ssize; } #define SIZE_PRECOMP ((1 << (5 - 1))) /**************** * RES = BASE ^ EXPO mod MOD * * To mitigate the Yarom/Falkner flush+reload cache side-channel * attack on the RSA secret exponent, we don't use the square * routine but multiplication. * * Reference: * Handbook of Applied Cryptography * Algorithm 14.83: Modified left-to-right k-ary exponentiation */ void _gcry_mpi_powm (gcry_mpi_t res, gcry_mpi_t base, gcry_mpi_t expo, gcry_mpi_t mod) { /* Pointer to the limbs of the arguments, their size and signs. */ mpi_ptr_t rp, ep, mp, bp; mpi_size_t esize, msize, bsize, rsize; int msign, bsign, rsign; /* Flags telling the secure allocation status of the arguments. */ int esec, msec, bsec; /* Size of the result including space for temporary values. */ mpi_size_t size; /* Helper. */ int mod_shift_cnt; int negative_result; mpi_ptr_t mp_marker = NULL; mpi_ptr_t bp_marker = NULL; mpi_ptr_t ep_marker = NULL; mpi_ptr_t xp_marker = NULL; unsigned int mp_nlimbs = 0; unsigned int bp_nlimbs = 0; unsigned int ep_nlimbs = 0; unsigned int xp_nlimbs = 0; mpi_ptr_t precomp[SIZE_PRECOMP]; /* Pre-computed array: BASE^1, ^3, ^5, ... */ mpi_size_t precomp_size[SIZE_PRECOMP]; mpi_size_t W; mpi_ptr_t base_u; mpi_size_t base_u_size; mpi_size_t max_u_size; esize = expo->nlimbs; msize = mod->nlimbs; size = 2 * msize; msign = mod->sign; ep = expo->d; MPN_NORMALIZE(ep, esize); if (esize * BITS_PER_MPI_LIMB > 512) W = 5; else if (esize * BITS_PER_MPI_LIMB > 256) W = 4; else if (esize * BITS_PER_MPI_LIMB > 128) W = 3; else if (esize * BITS_PER_MPI_LIMB > 64) W = 2; else W = 1; esec = mpi_is_secure(expo); msec = mpi_is_secure(mod); bsec = mpi_is_secure(base); rp = res->d; if (!msize) _gcry_divide_by_zero(); if (!esize) { /* Exponent is zero, result is 1 mod MOD, i.e., 1 or 0 depending on if MOD equals 1. */ res->nlimbs = (msize == 1 && mod->d[0] == 1) ? 0 : 1; if (res->nlimbs) { RESIZE_IF_NEEDED (res, 1); rp = res->d; rp[0] = 1; } res->sign = 0; goto leave; } /* Normalize MOD (i.e. make its most significant bit set) as required by mpn_divrem. This will make the intermediate values in the calculation slightly larger, but the correct result is obtained after a final reduction using the original MOD value. */ mp_nlimbs = msec? msize:0; mp = mp_marker = mpi_alloc_limb_space(msize, msec); count_leading_zeros (mod_shift_cnt, mod->d[msize-1]); if (mod_shift_cnt) _gcry_mpih_lshift (mp, mod->d, msize, mod_shift_cnt); else MPN_COPY( mp, mod->d, msize ); bsize = base->nlimbs; bsign = base->sign; if (bsize > msize) { /* The base is larger than the module. Reduce it. Allocate (BSIZE + 1) with space for remainder and quotient. (The quotient is (bsize - msize + 1) limbs.) */ bp_nlimbs = bsec ? (bsize + 1):0; bp = bp_marker = mpi_alloc_limb_space( bsize + 1, bsec ); MPN_COPY ( bp, base->d, bsize ); /* We don't care about the quotient, store it above the * remainder, at BP + MSIZE. */ _gcry_mpih_divrem( bp + msize, 0, bp, bsize, mp, msize ); bsize = msize; /* Canonicalize the base, since we are going to multiply with it quite a few times. */ MPN_NORMALIZE( bp, bsize ); } else bp = base->d; if (!bsize) { res->nlimbs = 0; res->sign = 0; goto leave; } /* Make BASE, EXPO not overlap with RES. We don't need to check MOD because that has already been copied to the MP var. */ if ( rp == bp ) { /* RES and BASE are identical. Allocate temp. space for BASE. */ gcry_assert (!bp_marker); bp_nlimbs = bsec? bsize:0; bp = bp_marker = mpi_alloc_limb_space( bsize, bsec ); MPN_COPY(bp, rp, bsize); } if ( rp == ep ) { /* RES and EXPO are identical. Allocate temp. space for EXPO. */ ep_nlimbs = esec? esize:0; ep = ep_marker = mpi_alloc_limb_space( esize, esec ); MPN_COPY(ep, rp, esize); } /* Copy base to the result. */ if (res->alloced < size) { mpi_resize (res, size); rp = res->d; } /* Main processing. */ { mpi_size_t i, j, k; mpi_ptr_t xp; mpi_size_t xsize = 0; int c; mpi_limb_t e; mpi_limb_t carry_limb; struct karatsuba_ctx karactx; mpi_ptr_t tp; xp_nlimbs = msec? size:0; xp = xp_marker = mpi_alloc_limb_space( size, msec ); memset( &karactx, 0, sizeof karactx ); negative_result = (ep[0] & 1) && bsign; /* Precompute PRECOMP[], BASE^(2 * i + 1), BASE^1, ^3, ^5, ... */ if (W > 1) /* X := BASE^2 */ mul_mod (xp, &xsize, bp, bsize, bp, bsize, mp, msize, &karactx); base_u = precomp[0] = mpi_alloc_limb_space (bsize, esec); base_u_size = max_u_size = precomp_size[0] = bsize; MPN_COPY (precomp[0], bp, bsize); for (i = 1; i < (1 << (W - 1)); i++) { /* PRECOMP[i] = BASE^(2 * i + 1) */ if (xsize >= base_u_size) mul_mod (rp, &rsize, xp, xsize, base_u, base_u_size, mp, msize, &karactx); else mul_mod (rp, &rsize, base_u, base_u_size, xp, xsize, mp, msize, &karactx); base_u = precomp[i] = mpi_alloc_limb_space (rsize, esec); base_u_size = precomp_size[i] = rsize; if (max_u_size < base_u_size) max_u_size = base_u_size; MPN_COPY (precomp[i], rp, rsize); } if (msize > max_u_size) max_u_size = msize; base_u = mpi_alloc_limb_space (max_u_size, esec); MPN_ZERO (base_u, max_u_size); i = esize - 1; /* Main loop. Make the result be pointed to alternately by XP and RP. This helps us avoid block copying, which would otherwise be necessary with the overlap restrictions of _gcry_mpih_divmod. With 50% probability the result after this loop will be in the area originally pointed by RP (==RES->d), and with 50% probability in the area originally pointed to by XP. */ rsign = 0; if (W == 1) { rsize = bsize; } else { rsize = msize; MPN_ZERO (rp, rsize); } MPN_COPY ( rp, bp, bsize ); e = ep[i]; count_leading_zeros (c, e); e = (e << c) << 1; c = BITS_PER_MPI_LIMB - 1 - c; j = 0; for (;;) if (e == 0) { j += c; if ( --i < 0 ) break; e = ep[i]; c = BITS_PER_MPI_LIMB; } else { int c0; mpi_limb_t e0; struct gcry_mpi w, u; w.sign = u.sign = 0; w.flags = u.flags = 0; w.d = base_u; count_leading_zeros (c0, e); e = (e << c0); c -= c0; j += c0; e0 = (e >> (BITS_PER_MPI_LIMB - W)); if (c >= W) c0 = 0; else { if ( --i < 0 ) { e0 = (e >> (BITS_PER_MPI_LIMB - c)); j += c - W; goto last_step; } else { c0 = c; e = ep[i]; c = BITS_PER_MPI_LIMB; e0 |= (e >> (BITS_PER_MPI_LIMB - (W - c0))); } } e = e << (W - c0); c -= (W - c0); last_step: count_trailing_zeros (c0, e0); e0 = (e0 >> c0) >> 1; for (j += W - c0; j >= 0; j--) { /* * base_u <= precomp[e0] * base_u_size <= precomp_size[e0] */ base_u_size = 0; for (k = 0; k < (1<< (W - 1)); k++) { w.alloced = w.nlimbs = precomp_size[k]; u.alloced = u.nlimbs = precomp_size[k]; u.d = precomp[k]; mpi_set_cond (&w, &u, k == e0); base_u_size |= ( precomp_size[k] & (0UL - (k == e0)) ); } w.alloced = w.nlimbs = rsize; u.alloced = u.nlimbs = rsize; u.d = rp; mpi_set_cond (&w, &u, j != 0); base_u_size ^= ((base_u_size ^ rsize) & (0UL - (j != 0))); mul_mod (xp, &xsize, rp, rsize, base_u, base_u_size, mp, msize, &karactx); tp = rp; rp = xp; xp = tp; rsize = xsize; } j = c0; if ( i < 0 ) break; } while (j--) { mul_mod (xp, &xsize, rp, rsize, rp, rsize, mp, msize, &karactx); tp = rp; rp = xp; xp = tp; rsize = xsize; } /* We shifted MOD, the modulo reduction argument, left MOD_SHIFT_CNT steps. Adjust the result by reducing it with the original MOD. Also make sure the result is put in RES->d (where it already might be, see above). */ if ( mod_shift_cnt ) { carry_limb = _gcry_mpih_lshift( res->d, rp, rsize, mod_shift_cnt); rp = res->d; if ( carry_limb ) { rp[rsize] = carry_limb; rsize++; } } else if (res->d != rp) { MPN_COPY (res->d, rp, rsize); rp = res->d; } if ( rsize >= msize ) { _gcry_mpih_divrem(rp + msize, 0, rp, rsize, mp, msize); rsize = msize; } /* Remove any leading zero words from the result. */ if ( mod_shift_cnt ) _gcry_mpih_rshift( rp, rp, rsize, mod_shift_cnt); MPN_NORMALIZE (rp, rsize); _gcry_mpih_release_karatsuba_ctx (&karactx ); for (i = 0; i < (1 << (W - 1)); i++) _gcry_mpi_free_limb_space( precomp[i], esec ? precomp_size[i] : 0 ); _gcry_mpi_free_limb_space (base_u, esec ? max_u_size : 0); } /* Fixup for negative results. */ if ( negative_result && rsize ) { if ( mod_shift_cnt ) _gcry_mpih_rshift( mp, mp, msize, mod_shift_cnt); _gcry_mpih_sub( rp, mp, msize, rp, rsize); rsize = msize; rsign = msign; MPN_NORMALIZE(rp, rsize); } gcry_assert (res->d == rp); res->nlimbs = rsize; res->sign = rsign; leave: if (mp_marker) _gcry_mpi_free_limb_space( mp_marker, mp_nlimbs ); if (bp_marker) _gcry_mpi_free_limb_space( bp_marker, bp_nlimbs ); if (ep_marker) _gcry_mpi_free_limb_space( ep_marker, ep_nlimbs ); if (xp_marker) _gcry_mpi_free_limb_space( xp_marker, xp_nlimbs ); } #endif grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/mpi/mpih-div.c0000644000175000017500000003410115036452441022036 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ /* mpih-div.c - MPI helper functions * Copyright (C) 1994, 1996, 1998, 2000, * 2001, 2002 Free Software Foundation, Inc. * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . * SPDX-License-Identifier: LGPL-2.1-or-later * * Note: This code is heavily based on the GNU MP Library. * Actually it's the same code with only minor changes in the * way the data is stored; this is to support the abstraction * of an optional secure memory allocation which may be used * to avoid revealing of sensitive data due to paging etc. */ #include #include #include #include "mpi-internal.h" #include "longlong.h" #ifndef UMUL_TIME #define UMUL_TIME 1 #endif #ifndef UDIV_TIME #define UDIV_TIME UMUL_TIME #endif /* FIXME: We should be using invert_limb (or invert_normalized_limb) * here (not udiv_qrnnd). */ mpi_limb_t _gcry_mpih_mod_1(mpi_ptr_t dividend_ptr, mpi_size_t dividend_size, mpi_limb_t divisor_limb) { mpi_size_t i; mpi_limb_t n1, n0, r; mpi_limb_t dummy GCC_ATTR_UNUSED; /* Botch: Should this be handled at all? Rely on callers? */ if( !dividend_size ) return 0; /* If multiplication is much faster than division, and the * dividend is large, pre-invert the divisor, and use * only multiplications in the inner loop. * * This test should be read: * Does it ever help to use udiv_qrnnd_preinv? * && Does what we save compensate for the inversion overhead? */ if( UDIV_TIME > (2 * UMUL_TIME + 6) && (UDIV_TIME - (2 * UMUL_TIME + 6)) * dividend_size > UDIV_TIME ) { int normalization_steps; count_leading_zeros( normalization_steps, divisor_limb ); if( normalization_steps ) { mpi_limb_t divisor_limb_inverted; divisor_limb <<= normalization_steps; /* Compute (2**2N - 2**N * DIVISOR_LIMB) / DIVISOR_LIMB. The * result is a (N+1)-bit approximation to 1/DIVISOR_LIMB, with the * most significant bit (with weight 2**N) implicit. * * Special case for DIVISOR_LIMB == 100...000. */ if( !(divisor_limb << 1) ) divisor_limb_inverted = ~(mpi_limb_t)0; else udiv_qrnnd(divisor_limb_inverted, dummy, -divisor_limb, 0, divisor_limb); n1 = dividend_ptr[dividend_size - 1]; r = n1 >> (BITS_PER_MPI_LIMB - normalization_steps); /* Possible optimization: * if (r == 0 * && divisor_limb > ((n1 << normalization_steps) * | (dividend_ptr[dividend_size - 2] >> ...))) * ...one division less... */ for( i = dividend_size - 2; i >= 0; i--) { n0 = dividend_ptr[i]; UDIV_QRNND_PREINV(dummy, r, r, ((n1 << normalization_steps) | (n0 >> (BITS_PER_MPI_LIMB - normalization_steps))), divisor_limb, divisor_limb_inverted); n1 = n0; } UDIV_QRNND_PREINV(dummy, r, r, n1 << normalization_steps, divisor_limb, divisor_limb_inverted); return r >> normalization_steps; } else { mpi_limb_t divisor_limb_inverted; /* Compute (2**2N - 2**N * DIVISOR_LIMB) / DIVISOR_LIMB. The * result is a (N+1)-bit approximation to 1/DIVISOR_LIMB, with the * most significant bit (with weight 2**N) implicit. * * Special case for DIVISOR_LIMB == 100...000. */ if( !(divisor_limb << 1) ) divisor_limb_inverted = ~(mpi_limb_t)0; else udiv_qrnnd(divisor_limb_inverted, dummy, -divisor_limb, 0, divisor_limb); i = dividend_size - 1; r = dividend_ptr[i]; if( r >= divisor_limb ) r = 0; else i--; for( ; i >= 0; i--) { n0 = dividend_ptr[i]; UDIV_QRNND_PREINV(dummy, r, r, n0, divisor_limb, divisor_limb_inverted); } return r; } } else { if( UDIV_NEEDS_NORMALIZATION ) { int normalization_steps; count_leading_zeros(normalization_steps, divisor_limb); if( normalization_steps ) { divisor_limb <<= normalization_steps; n1 = dividend_ptr[dividend_size - 1]; r = n1 >> (BITS_PER_MPI_LIMB - normalization_steps); /* Possible optimization: * if (r == 0 * && divisor_limb > ((n1 << normalization_steps) * | (dividend_ptr[dividend_size - 2] >> ...))) * ...one division less... */ for(i = dividend_size - 2; i >= 0; i--) { n0 = dividend_ptr[i]; udiv_qrnnd (dummy, r, r, ((n1 << normalization_steps) | (n0 >> (BITS_PER_MPI_LIMB - normalization_steps))), divisor_limb); n1 = n0; } udiv_qrnnd (dummy, r, r, n1 << normalization_steps, divisor_limb); return r >> normalization_steps; } } /* No normalization needed, either because udiv_qrnnd doesn't require * it, or because DIVISOR_LIMB is already normalized. */ i = dividend_size - 1; r = dividend_ptr[i]; if(r >= divisor_limb) r = 0; else i--; for(; i >= 0; i--) { n0 = dividend_ptr[i]; udiv_qrnnd (dummy, r, r, n0, divisor_limb); } return r; } } /* Divide num (NP/NSIZE) by den (DP/DSIZE) and write * the NSIZE-DSIZE least significant quotient limbs at QP * and the DSIZE long remainder at NP. If QEXTRA_LIMBS is * non-zero, generate that many fraction bits and append them after the * other quotient limbs. * Return the most significant limb of the quotient, this is always 0 or 1. * * Preconditions: * 0. NSIZE >= DSIZE. * 1. The most significant bit of the divisor must be set. * 2. QP must either not overlap with the input operands at all, or * QP + DSIZE >= NP must hold true. (This means that it's * possible to put the quotient in the high part of NUM, right after the * remainder in NUM. * 3. NSIZE >= DSIZE, even if QEXTRA_LIMBS is non-zero. */ mpi_limb_t _gcry_mpih_divrem( mpi_ptr_t qp, mpi_size_t qextra_limbs, mpi_ptr_t np, mpi_size_t nsize, mpi_ptr_t dp, mpi_size_t dsize) { mpi_limb_t most_significant_q_limb = 0; switch(dsize) { case 0: _gcry_divide_by_zero(); break; case 1: { mpi_size_t i; mpi_limb_t n1; mpi_limb_t d; d = dp[0]; n1 = np[nsize - 1]; if( n1 >= d ) { n1 -= d; most_significant_q_limb = 1; } qp += qextra_limbs; for( i = nsize - 2; i >= 0; i--) udiv_qrnnd( qp[i], n1, n1, np[i], d ); qp -= qextra_limbs; for( i = qextra_limbs - 1; i >= 0; i-- ) udiv_qrnnd (qp[i], n1, n1, 0, d); np[0] = n1; } break; case 2: { mpi_size_t i; mpi_limb_t n1, n0, n2; mpi_limb_t d1, d0; np += nsize - 2; d1 = dp[1]; d0 = dp[0]; n1 = np[1]; n0 = np[0]; if( n1 >= d1 && (n1 > d1 || n0 >= d0) ) { sub_ddmmss (n1, n0, n1, n0, d1, d0); most_significant_q_limb = 1; } for( i = qextra_limbs + nsize - 2 - 1; i >= 0; i-- ) { mpi_limb_t q; mpi_limb_t r; if( i >= qextra_limbs ) np--; else np[0] = 0; if( n1 == d1 ) { /* Q should be either 111..111 or 111..110. Need special * treatment of this rare case as normal division would * give overflow. */ q = ~(mpi_limb_t)0; r = n0 + d1; if( r < d1 ) { /* Carry in the addition? */ add_ssaaaa( n1, n0, r - d0, np[0], 0, d0 ); qp[i] = q; continue; } n1 = d0 - (d0 != 0?1:0); n0 = -d0; } else { udiv_qrnnd (q, r, n1, n0, d1); umul_ppmm (n1, n0, d0, q); } n2 = np[0]; q_test: if( n1 > r || (n1 == r && n0 > n2) ) { /* The estimated Q was too large. */ q--; sub_ddmmss (n1, n0, n1, n0, 0, d0); r += d1; if( r >= d1 ) /* If not carry, test Q again. */ goto q_test; } qp[i] = q; sub_ddmmss (n1, n0, r, n2, n1, n0); } np[1] = n1; np[0] = n0; } break; default: { mpi_size_t i; mpi_limb_t dX, d1, n0; np += nsize - dsize; dX = dp[dsize - 1]; d1 = dp[dsize - 2]; n0 = np[dsize - 1]; if( n0 >= dX ) { if(n0 > dX || _gcry_mpih_cmp(np, dp, dsize - 1) >= 0 ) { _gcry_mpih_sub_n(np, np, dp, dsize); n0 = np[dsize - 1]; most_significant_q_limb = 1; } } for( i = qextra_limbs + nsize - dsize - 1; i >= 0; i--) { mpi_limb_t q; mpi_limb_t n1, n2; mpi_limb_t cy_limb; if( i >= qextra_limbs ) { np--; n2 = np[dsize]; } else { n2 = np[dsize - 1]; MPN_COPY_DECR (np + 1, np, dsize - 1); np[0] = 0; } if( n0 == dX ) { /* This might over-estimate q, but it's probably not worth * the extra code here to find out. */ q = ~(mpi_limb_t)0; } else { mpi_limb_t r; udiv_qrnnd(q, r, n0, np[dsize - 1], dX); umul_ppmm(n1, n0, d1, q); while( n1 > r || (n1 == r && n0 > np[dsize - 2])) { q--; r += dX; if( r < dX ) /* I.e. "carry in previous addition?" */ break; n1 -= n0 < d1; n0 -= d1; } } /* Possible optimization: We already have (q * n0) and (1 * n1) * after the calculation of q. Taking advantage of that, we * could make this loop make two iterations less. */ cy_limb = _gcry_mpih_submul_1(np, dp, dsize, q); if( n2 != cy_limb ) { _gcry_mpih_add_n(np, np, dp, dsize); q--; } qp[i] = q; n0 = np[dsize - 1]; } } } return most_significant_q_limb; } /**************** * Divide (DIVIDEND_PTR,,DIVIDEND_SIZE) by DIVISOR_LIMB. * Write DIVIDEND_SIZE limbs of quotient at QUOT_PTR. * Return the single-limb remainder. * There are no constraints on the value of the divisor. * * QUOT_PTR and DIVIDEND_PTR might point to the same limb. */ mpi_limb_t _gcry_mpih_divmod_1( mpi_ptr_t quot_ptr, mpi_ptr_t dividend_ptr, mpi_size_t dividend_size, mpi_limb_t divisor_limb) { mpi_size_t i; mpi_limb_t n1, n0, r; mpi_limb_t dummy GCC_ATTR_UNUSED; if( !dividend_size ) return 0; /* If multiplication is much faster than division, and the * dividend is large, pre-invert the divisor, and use * only multiplications in the inner loop. * * This test should be read: * Does it ever help to use udiv_qrnnd_preinv? * && Does what we save compensate for the inversion overhead? */ if( UDIV_TIME > (2 * UMUL_TIME + 6) && (UDIV_TIME - (2 * UMUL_TIME + 6)) * dividend_size > UDIV_TIME ) { int normalization_steps; count_leading_zeros( normalization_steps, divisor_limb ); if( normalization_steps ) { mpi_limb_t divisor_limb_inverted; divisor_limb <<= normalization_steps; /* Compute (2**2N - 2**N * DIVISOR_LIMB) / DIVISOR_LIMB. The * result is a (N+1)-bit approximation to 1/DIVISOR_LIMB, with the * most significant bit (with weight 2**N) implicit. */ /* Special case for DIVISOR_LIMB == 100...000. */ if( !(divisor_limb << 1) ) divisor_limb_inverted = ~(mpi_limb_t)0; else udiv_qrnnd(divisor_limb_inverted, dummy, -divisor_limb, 0, divisor_limb); n1 = dividend_ptr[dividend_size - 1]; r = n1 >> (BITS_PER_MPI_LIMB - normalization_steps); /* Possible optimization: * if (r == 0 * && divisor_limb > ((n1 << normalization_steps) * | (dividend_ptr[dividend_size - 2] >> ...))) * ...one division less... */ for( i = dividend_size - 2; i >= 0; i--) { n0 = dividend_ptr[i]; UDIV_QRNND_PREINV( quot_ptr[i + 1], r, r, ((n1 << normalization_steps) | (n0 >> (BITS_PER_MPI_LIMB - normalization_steps))), divisor_limb, divisor_limb_inverted); n1 = n0; } UDIV_QRNND_PREINV( quot_ptr[0], r, r, n1 << normalization_steps, divisor_limb, divisor_limb_inverted); return r >> normalization_steps; } else { mpi_limb_t divisor_limb_inverted; /* Compute (2**2N - 2**N * DIVISOR_LIMB) / DIVISOR_LIMB. The * result is a (N+1)-bit approximation to 1/DIVISOR_LIMB, with the * most significant bit (with weight 2**N) implicit. */ /* Special case for DIVISOR_LIMB == 100...000. */ if( !(divisor_limb << 1) ) divisor_limb_inverted = ~(mpi_limb_t) 0; else udiv_qrnnd(divisor_limb_inverted, dummy, -divisor_limb, 0, divisor_limb); i = dividend_size - 1; r = dividend_ptr[i]; if( r >= divisor_limb ) r = 0; else quot_ptr[i--] = 0; for( ; i >= 0; i-- ) { n0 = dividend_ptr[i]; UDIV_QRNND_PREINV( quot_ptr[i], r, r, n0, divisor_limb, divisor_limb_inverted); } return r; } } else { if(UDIV_NEEDS_NORMALIZATION) { int normalization_steps; count_leading_zeros (normalization_steps, divisor_limb); if( normalization_steps ) { divisor_limb <<= normalization_steps; n1 = dividend_ptr[dividend_size - 1]; r = n1 >> (BITS_PER_MPI_LIMB - normalization_steps); /* Possible optimization: * if (r == 0 * && divisor_limb > ((n1 << normalization_steps) * | (dividend_ptr[dividend_size - 2] >> ...))) * ...one division less... */ for( i = dividend_size - 2; i >= 0; i--) { n0 = dividend_ptr[i]; udiv_qrnnd (quot_ptr[i + 1], r, r, ((n1 << normalization_steps) | (n0 >> (BITS_PER_MPI_LIMB - normalization_steps))), divisor_limb); n1 = n0; } udiv_qrnnd (quot_ptr[0], r, r, n1 << normalization_steps, divisor_limb); return r >> normalization_steps; } } /* No normalization needed, either because udiv_qrnnd doesn't require * it, or because DIVISOR_LIMB is already normalized. */ i = dividend_size - 1; r = dividend_ptr[i]; if(r >= divisor_limb) r = 0; else quot_ptr[i--] = 0; for(; i >= 0; i--) { n0 = dividend_ptr[i]; udiv_qrnnd( quot_ptr[i], r, r, n0, divisor_limb ); } return r; } } grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/mpi/mpi-mpow.c0000644000175000017500000001366115036452441022076 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ /* mpi-mpow.c - MPI functions * Copyright (C) 1998, 1999, 2001, 2002, 2003 Free Software Foundation, Inc. * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . * SPDX-License-Identifier: LGPL-2.1-or-later */ #include #include #include #include "mpi-internal.h" #include "longlong.h" #include "g10lib.h" /* Barrett is slower than the classical way. It can be tweaked by * using partial multiplications */ /*#define USE_BARRETT*/ #ifdef USE_BARRETT static void barrett_mulm( gcry_mpi_t w, gcry_mpi_t u, gcry_mpi_t v, gcry_mpi_t m, gcry_mpi_t y, int k, gcry_mpi_t r1, gcry_mpi_t r2 ); static gcry_mpi_t init_barrett( gcry_mpi_t m, int *k, gcry_mpi_t *r1, gcry_mpi_t *r2 ); static int calc_barrett( gcry_mpi_t r, gcry_mpi_t x, gcry_mpi_t m, gcry_mpi_t y, int k, gcry_mpi_t r1, gcry_mpi_t r2 ); #else #define barrett_mulm( w, u, v, m, y, k, r1, r2 ) _gcry_mpi_mulm( (w), (u), (v), (m) ) #endif static int build_index( gcry_mpi_t *exparray, int k, int i, int t ) { int j, bitno; int idx = 0; bitno = t-i; for(j=k-1; j >= 0; j-- ) { idx <<= 1; if( mpi_test_bit( exparray[j], bitno ) ) idx |= 1; } /*log_debug("t=%d i=%d idx=%d\n", t, i, idx );*/ return idx; } /**************** * RES = (BASE[0] ^ EXP[0]) * (BASE[1] ^ EXP[1]) * ... * mod M */ void _gcry_mpi_mulpowm( gcry_mpi_t res, gcry_mpi_t *basearray, gcry_mpi_t *exparray, gcry_mpi_t m) { int k; /* number of elements */ int t; /* bit size of largest exponent */ int i, j, idx; gcry_mpi_t *G; /* table with precomputed values of size 2^k */ gcry_mpi_t tmp; #ifdef USE_BARRETT gcry_mpi_t barrett_y, barrett_r1, barrett_r2; int barrett_k; #endif for(k=0; basearray[k]; k++ ) ; gcry_assert(k); for(t=0, i=0; (tmp=exparray[i]); i++ ) { /*log_mpidump("exp: ", tmp );*/ j = mpi_get_nbits(tmp); if( j > t ) t = j; } /*log_mpidump("mod: ", m );*/ gcry_assert (i==k); gcry_assert (t); gcry_assert (k < 10); G = xcalloc( (1<= 0 && idx < (1< 3 ? k-3:0; mpi_normalize( x ); if( mpi_get_nlimbs(x) > 2*k ) return 1; /* can't do it */ /* 1. q1 = floor( x / b^k-1) * q2 = q1 * y * q3 = floor( q2 / b^k+1 ) * Actually, we don't need qx, we can work direct on r2 */ mpi_set( r2, x ); mpi_rshift_limbs( r2, k-1 ); mpi_mul( r2, r2, y ); mpi_rshift_limbs( r2, k+1 ); /* 2. r1 = x mod b^k+1 * r2 = q3 * m mod b^k+1 * r = r1 - r2 * 3. if r < 0 then r = r + b^k+1 */ mpi_set( r1, x ); if( r1->nlimbs > k+1 ) /* quick modulo operation */ r1->nlimbs = k+1; mpi_mul( r2, r2, m ); if( r2->nlimbs > k+1 ) /* quick modulo operation */ r2->nlimbs = k+1; mpi_sub( r, r1, r2 ); if( mpi_has_sign (r) ) { gcry_mpi_t tmp; tmp = mpi_alloc( k + 2 ); mpi_set_ui( tmp, 1 ); mpi_lshift_limbs( tmp, k+1 ); mpi_add( r, r, tmp ); mpi_free(tmp); } /* 4. while r >= m do r = r - m */ while( mpi_cmp( r, m ) >= 0 ) mpi_sub( r, r, m ); return 0; } #endif /* USE_BARRETT */ grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/cipher/0000755000175000017500000000000015036452576020734 500000000000000grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/cipher/rijndael-ppc-common.h0000644000175000017500000002132415036452441024654 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ /* Rijndael (AES) for GnuPG - PowerPC Vector Crypto AES implementation * Copyright (C) 2019 Shawn Landden * Copyright (C) 2019-2020 Jussi Kivilinna * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . * * Alternatively, this code may be used in OpenSSL from The OpenSSL Project, * and Cryptogams by Andy Polyakov, and if made part of a release of either * or both projects, is thereafter dual-licensed under the license said project * is released under. */ #ifndef G10_RIJNDAEL_PPC_COMMON_H #define G10_RIJNDAEL_PPC_COMMON_H typedef vector unsigned char block; typedef vector unsigned int vec_u32; typedef union { u32 data32[4]; } __attribute__((packed, aligned(1), may_alias)) u128_t; #define ALWAYS_INLINE inline __attribute__((always_inline)) #define NO_INLINE __attribute__((noinline)) #define NO_INSTRUMENT_FUNCTION __attribute__((no_instrument_function)) #define ASM_FUNC_ATTR NO_INSTRUMENT_FUNCTION #define ASM_FUNC_ATTR_INLINE ASM_FUNC_ATTR ALWAYS_INLINE #define ASM_FUNC_ATTR_NOINLINE ASM_FUNC_ATTR NO_INLINE #define ALIGNED_LOAD(in_ptr, offs) \ (asm_aligned_ld ((offs) * 16, (const void *)(in_ptr))) #define ALIGNED_STORE(out_ptr, offs, vec) \ (asm_aligned_st ((vec), (offs) * 16, (void *)(out_ptr))) #define VEC_BE_SWAP(vec, bige_const) (asm_be_swap ((vec), (bige_const))) #define VEC_LOAD_BE(in_ptr, offs, bige_const) \ (asm_be_swap (asm_load_be_noswap ((offs) * 16, (const void *)(in_ptr)), \ bige_const)) #define VEC_LOAD_BE_NOSWAP(in_ptr, offs) \ (asm_load_be_noswap ((offs) * 16, (const unsigned char *)(in_ptr))) #define VEC_STORE_BE(out_ptr, offs, vec, bige_const) \ (asm_store_be_noswap (asm_be_swap ((vec), (bige_const)), (offs) * 16, \ (void *)(out_ptr))) #define VEC_STORE_BE_NOSWAP(out_ptr, offs, vec) \ (asm_store_be_noswap ((vec), (offs) * 16, (void *)(out_ptr))) #define ROUND_KEY_VARIABLES \ block rkey0, rkeylast #define PRELOAD_ROUND_KEYS(nrounds) \ do { \ rkey0 = ALIGNED_LOAD (rk, 0); \ rkeylast = ALIGNED_LOAD (rk, nrounds); \ } while (0) #define AES_ENCRYPT(blk, nrounds) \ do { \ blk ^= rkey0; \ blk = asm_cipher_be (blk, ALIGNED_LOAD (rk, 1)); \ blk = asm_cipher_be (blk, ALIGNED_LOAD (rk, 2)); \ blk = asm_cipher_be (blk, ALIGNED_LOAD (rk, 3)); \ blk = asm_cipher_be (blk, ALIGNED_LOAD (rk, 4)); \ blk = asm_cipher_be (blk, ALIGNED_LOAD (rk, 5)); \ blk = asm_cipher_be (blk, ALIGNED_LOAD (rk, 6)); \ blk = asm_cipher_be (blk, ALIGNED_LOAD (rk, 7)); \ blk = asm_cipher_be (blk, ALIGNED_LOAD (rk, 8)); \ blk = asm_cipher_be (blk, ALIGNED_LOAD (rk, 9)); \ if (nrounds >= 12) \ { \ blk = asm_cipher_be (blk, ALIGNED_LOAD (rk, 10)); \ blk = asm_cipher_be (blk, ALIGNED_LOAD (rk, 11)); \ if (rounds > 12) \ { \ blk = asm_cipher_be (blk, ALIGNED_LOAD (rk, 12)); \ blk = asm_cipher_be (blk, ALIGNED_LOAD (rk, 13)); \ } \ } \ blk = asm_cipherlast_be (blk, rkeylast); \ } while (0) #define AES_DECRYPT(blk, nrounds) \ do { \ blk ^= rkey0; \ blk = asm_ncipher_be (blk, ALIGNED_LOAD (rk, 1)); \ blk = asm_ncipher_be (blk, ALIGNED_LOAD (rk, 2)); \ blk = asm_ncipher_be (blk, ALIGNED_LOAD (rk, 3)); \ blk = asm_ncipher_be (blk, ALIGNED_LOAD (rk, 4)); \ blk = asm_ncipher_be (blk, ALIGNED_LOAD (rk, 5)); \ blk = asm_ncipher_be (blk, ALIGNED_LOAD (rk, 6)); \ blk = asm_ncipher_be (blk, ALIGNED_LOAD (rk, 7)); \ blk = asm_ncipher_be (blk, ALIGNED_LOAD (rk, 8)); \ blk = asm_ncipher_be (blk, ALIGNED_LOAD (rk, 9)); \ if (nrounds >= 12) \ { \ blk = asm_ncipher_be (blk, ALIGNED_LOAD (rk, 10)); \ blk = asm_ncipher_be (blk, ALIGNED_LOAD (rk, 11)); \ if (rounds > 12) \ { \ blk = asm_ncipher_be (blk, ALIGNED_LOAD (rk, 12)); \ blk = asm_ncipher_be (blk, ALIGNED_LOAD (rk, 13)); \ } \ } \ blk = asm_ncipherlast_be (blk, rkeylast); \ } while (0) #define ROUND_KEY_VARIABLES_ALL \ block rkey0, rkey1, rkey2, rkey3, rkey4, rkey5, rkey6, rkey7, rkey8, \ rkey9, rkey10, rkey11, rkey12, rkey13, rkeylast #define PRELOAD_ROUND_KEYS_ALL(nrounds) \ do { \ rkey0 = ALIGNED_LOAD (rk, 0); \ rkey1 = ALIGNED_LOAD (rk, 1); \ rkey2 = ALIGNED_LOAD (rk, 2); \ rkey3 = ALIGNED_LOAD (rk, 3); \ rkey4 = ALIGNED_LOAD (rk, 4); \ rkey5 = ALIGNED_LOAD (rk, 5); \ rkey6 = ALIGNED_LOAD (rk, 6); \ rkey7 = ALIGNED_LOAD (rk, 7); \ rkey8 = ALIGNED_LOAD (rk, 8); \ rkey9 = ALIGNED_LOAD (rk, 9); \ if (nrounds >= 12) \ { \ rkey10 = ALIGNED_LOAD (rk, 10); \ rkey11 = ALIGNED_LOAD (rk, 11); \ if (rounds > 12) \ { \ rkey12 = ALIGNED_LOAD (rk, 12); \ rkey13 = ALIGNED_LOAD (rk, 13); \ } \ } \ rkeylast = ALIGNED_LOAD (rk, nrounds); \ } while (0) static ASM_FUNC_ATTR_INLINE block asm_aligned_ld(unsigned long offset, const void *ptr) { block vec; #if __GNUC__ >= 4 if (__builtin_constant_p (offset) && offset == 0) __asm__ volatile ("lvx %0,0,%1\n\t" : "=v" (vec) : "r" ((uintptr_t)ptr) : "memory"); else #endif __asm__ volatile ("lvx %0,%1,%2\n\t" : "=v" (vec) : "r" (offset), "r" ((uintptr_t)ptr) : "memory", "r0"); return vec; } static ASM_FUNC_ATTR_INLINE void asm_aligned_st(block vec, unsigned long offset, void *ptr) { #if __GNUC__ >= 4 if (__builtin_constant_p (offset) && offset == 0) __asm__ volatile ("stvx %0,0,%1\n\t" : : "v" (vec), "r" ((uintptr_t)ptr) : "memory"); else #endif __asm__ volatile ("stvx %0,%1,%2\n\t" : : "v" (vec), "r" (offset), "r" ((uintptr_t)ptr) : "memory", "r0"); } static ASM_FUNC_ATTR_INLINE block asm_vperm1(block vec, block mask) { block o; __asm__ volatile ("vperm %0,%1,%1,%2\n\t" : "=v" (o) : "v" (vec), "v" (mask)); return o; } static ASM_FUNC_ATTR_INLINE block asm_add_uint128(block a, block b) { block res; __asm__ volatile ("vadduqm %0,%1,%2\n\t" : "=v" (res) : "v" (a), "v" (b)); return res; } static ASM_FUNC_ATTR_INLINE block asm_add_uint64(block a, block b) { block res; __asm__ volatile ("vaddudm %0,%1,%2\n\t" : "=v" (res) : "v" (a), "v" (b)); return res; } static ASM_FUNC_ATTR_INLINE block asm_sra_int64(block a, block b) { block res; __asm__ volatile ("vsrad %0,%1,%2\n\t" : "=v" (res) : "v" (a), "v" (b)); return res; } static block asm_swap_uint64_halfs(block a) { block res; __asm__ volatile ("xxswapd %x0, %x1" : "=wa" (res) : "wa" (a)); return res; } static ASM_FUNC_ATTR_INLINE block asm_xor(block a, block b) { block res; __asm__ volatile ("vxor %0,%1,%2\n\t" : "=v" (res) : "v" (a), "v" (b)); return res; } static ASM_FUNC_ATTR_INLINE block asm_sbox_be(block b) { block o; __asm__ volatile ("vsbox %0, %1\n\t" : "=v" (o) : "v" (b)); return o; } static ASM_FUNC_ATTR_INLINE block asm_cipher_be(block b, block rk) { block o; __asm__ volatile ("vcipher %0, %1, %2\n\t" : "=v" (o) : "v" (b), "v" (rk)); return o; } static ASM_FUNC_ATTR_INLINE block asm_cipherlast_be(block b, block rk) { block o; __asm__ volatile ("vcipherlast %0, %1, %2\n\t" : "=v" (o) : "v" (b), "v" (rk)); return o; } static ASM_FUNC_ATTR_INLINE block asm_ncipher_be(block b, block rk) { block o; __asm__ volatile ("vncipher %0, %1, %2\n\t" : "=v" (o) : "v" (b), "v" (rk)); return o; } static ASM_FUNC_ATTR_INLINE block asm_ncipherlast_be(block b, block rk) { block o; __asm__ volatile ("vncipherlast %0, %1, %2\n\t" : "=v" (o) : "v" (b), "v" (rk)); return o; } /* Make a decryption key from an encryption key. */ static ASM_FUNC_ATTR_INLINE void internal_aes_ppc_prepare_decryption (RIJNDAEL_context *ctx) { u128_t *ekey = (u128_t *)(void *)ctx->keyschenc; u128_t *dkey = (u128_t *)(void *)ctx->keyschdec; int rounds = ctx->rounds; int rr; int r; r = 0; rr = rounds; for (r = 0, rr = rounds; r <= rounds; r++, rr--) { ALIGNED_STORE (dkey, r, ALIGNED_LOAD (ekey, rr)); } } #endif /* G10_RIJNDAEL_PPC_COMMON_H */ grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/cipher/camellia-aesni-avx2-amd64.h0000644000175000017500000017164615036452441025466 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ /* camellia-aesni-avx2-amd64.h - AES-NI/VAES/GFNI/AVX2 implementation of Camellia * * Copyright (C) 2013-2015,2020-2023 Jussi Kivilinna * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . */ #ifndef GCRY_CAMELLIA_AESNI_AVX2_AMD64_H #define GCRY_CAMELLIA_AESNI_AVX2_AMD64_H #include "asm-common-amd64.h" #define CAMELLIA_TABLE_BYTE_LEN 272 /* struct CAMELLIA_context: */ #define key_table 0 #define key_bitlength CAMELLIA_TABLE_BYTE_LEN /* register macros */ #define CTX %rdi #define RIO %r8 /********************************************************************** helper macros **********************************************************************/ #ifndef CAMELLIA_GFNI_BUILD #define filter_8bit(x, lo_t, hi_t, mask4bit, tmp0) \ vpand x, mask4bit, tmp0; \ vpandn x, mask4bit, x; \ vpsrld $4, x, x; \ \ vpshufb tmp0, lo_t, tmp0; \ vpshufb x, hi_t, x; \ vpxor tmp0, x, x; #endif #define ymm0_x xmm0 #define ymm1_x xmm1 #define ymm2_x xmm2 #define ymm3_x xmm3 #define ymm4_x xmm4 #define ymm5_x xmm5 #define ymm6_x xmm6 #define ymm7_x xmm7 #define ymm8_x xmm8 #define ymm9_x xmm9 #define ymm10_x xmm10 #define ymm11_x xmm11 #define ymm12_x xmm12 #define ymm13_x xmm13 #define ymm14_x xmm14 #define ymm15_x xmm15 #ifdef CAMELLIA_VAES_BUILD # define IF_AESNI(...) # define IF_VAES(...) __VA_ARGS__ #else # define IF_AESNI(...) __VA_ARGS__ # define IF_VAES(...) #endif #ifdef CAMELLIA_GFNI_BUILD # define IF_GFNI(...) __VA_ARGS__ # define IF_NOT_GFNI(...) #else # define IF_GFNI(...) # define IF_NOT_GFNI(...) __VA_ARGS__ #endif /********************************************************************** GFNI helper macros and constants **********************************************************************/ #ifdef CAMELLIA_GFNI_BUILD #define BV8(a0,a1,a2,a3,a4,a5,a6,a7) \ ( (((a0) & 1) << 0) | \ (((a1) & 1) << 1) | \ (((a2) & 1) << 2) | \ (((a3) & 1) << 3) | \ (((a4) & 1) << 4) | \ (((a5) & 1) << 5) | \ (((a6) & 1) << 6) | \ (((a7) & 1) << 7) ) #define BM8X8(l0,l1,l2,l3,l4,l5,l6,l7) \ ( ((l7) << (0 * 8)) | \ ((l6) << (1 * 8)) | \ ((l5) << (2 * 8)) | \ ((l4) << (3 * 8)) | \ ((l3) << (4 * 8)) | \ ((l2) << (5 * 8)) | \ ((l1) << (6 * 8)) | \ ((l0) << (7 * 8)) ) /* Pre-filters and post-filters constants for Camellia sboxes s1, s2, s3 and s4. * See http://urn.fi/URN:NBN:fi:oulu-201305311409, pages 43-48. * * Pre-filters are directly from above source, "θ₁"/"θ₄". Post-filters are * combination of function "A" (AES SubBytes affine transformation) and * "ψ₁"/"ψ₂"/"ψ₃". */ /* Constant from "θ₁(x)" and "θ₄(x)" functions. */ #define pre_filter_constant_s1234 BV8(1, 0, 1, 0, 0, 0, 1, 0) /* Constant from "ψ₁(A(x))" function: */ #define post_filter_constant_s14 BV8(0, 1, 1, 1, 0, 1, 1, 0) /* Constant from "ψ₂(A(x))" function: */ #define post_filter_constant_s2 BV8(0, 0, 1, 1, 1, 0, 1, 1) /* Constant from "ψ₃(A(x))" function: */ #define post_filter_constant_s3 BV8(1, 1, 1, 0, 1, 1, 0, 0) #endif /* CAMELLIA_GFNI_BUILD */ /********************************************************************** 32-way camellia **********************************************************************/ #ifdef CAMELLIA_GFNI_BUILD /* roundsm32 (GFNI version) * IN: * x0..x7: byte-sliced AB state * mem_cd: register pointer storing CD state * key: index for key material * OUT: * x0..x7: new byte-sliced CD state */ #define roundsm32(x0, x1, x2, x3, x4, x5, x6, x7, t0, t1, t2, t3, t4, t5, \ t6, t7, mem_cd, key) \ /* \ * S-function with AES subbytes \ */ \ vpbroadcastq .Lpre_filter_bitmatrix_s123 rRIP, t5; \ vpbroadcastq .Lpre_filter_bitmatrix_s4 rRIP, t2; \ vpbroadcastq .Lpost_filter_bitmatrix_s14 rRIP, t4; \ vpbroadcastq .Lpost_filter_bitmatrix_s2 rRIP, t3; \ vpbroadcastq .Lpost_filter_bitmatrix_s3 rRIP, t6; \ \ /* prefilter sboxes */ \ vgf2p8affineqb $(pre_filter_constant_s1234), t5, x0, x0; \ vgf2p8affineqb $(pre_filter_constant_s1234), t5, x7, x7; \ vgf2p8affineqb $(pre_filter_constant_s1234), t2, x3, x3; \ vgf2p8affineqb $(pre_filter_constant_s1234), t2, x6, x6; \ vgf2p8affineqb $(pre_filter_constant_s1234), t5, x2, x2; \ vgf2p8affineqb $(pre_filter_constant_s1234), t5, x5, x5; \ vgf2p8affineqb $(pre_filter_constant_s1234), t5, x1, x1; \ vgf2p8affineqb $(pre_filter_constant_s1234), t5, x4, x4; \ \ /* sbox GF8 inverse + postfilter sboxes 1 and 4 */ \ vgf2p8affineinvqb $(post_filter_constant_s14), t4, x0, x0; \ vgf2p8affineinvqb $(post_filter_constant_s14), t4, x7, x7; \ vgf2p8affineinvqb $(post_filter_constant_s14), t4, x3, x3; \ vgf2p8affineinvqb $(post_filter_constant_s14), t4, x6, x6; \ \ /* sbox GF8 inverse + postfilter sbox 3 */ \ vgf2p8affineinvqb $(post_filter_constant_s3), t6, x2, x2; \ vgf2p8affineinvqb $(post_filter_constant_s3), t6, x5, x5; \ \ /* sbox GF8 inverse + postfilter sbox 2 */ \ vgf2p8affineinvqb $(post_filter_constant_s2), t3, x1, x1; \ vgf2p8affineinvqb $(post_filter_constant_s2), t3, x4, x4; \ \ vpbroadcastb 7+key, t7; \ vpbroadcastb 6+key, t6; \ \ /* P-function */ \ vpxor x5, x0, x0; \ vpxor x6, x1, x1; \ vpxor x7, x2, x2; \ vpxor x4, x3, x3; \ \ vpbroadcastb 5+key, t5; \ vpbroadcastb 4+key, t4; \ \ vpxor x2, x4, x4; \ vpxor x3, x5, x5; \ vpxor x0, x6, x6; \ vpxor x1, x7, x7; \ \ vpbroadcastb 3+key, t3; \ vpbroadcastb 2+key, t2; \ \ vpxor x7, x0, x0; \ vpxor x4, x1, x1; \ vpxor x5, x2, x2; \ vpxor x6, x3, x3; \ \ vpbroadcastb 1+key, t1; \ vpbroadcastb 0+key, t0; \ \ vpxor x3, x4, x4; \ vpxor x0, x5, x5; \ vpxor x1, x6, x6; \ vpxor x2, x7, x7; /* note: high and low parts swapped */ \ \ /* Add key material and result to CD (x becomes new CD) */ \ \ vpxor t7, x0, x0; \ vpxor 4 * 32(mem_cd), x0, x0; \ \ vpxor t6, x1, x1; \ vpxor 5 * 32(mem_cd), x1, x1; \ \ vpxor t5, x2, x2; \ vpxor 6 * 32(mem_cd), x2, x2; \ \ vpxor t4, x3, x3; \ vpxor 7 * 32(mem_cd), x3, x3; \ \ vpxor t3, x4, x4; \ vpxor 0 * 32(mem_cd), x4, x4; \ \ vpxor t2, x5, x5; \ vpxor 1 * 32(mem_cd), x5, x5; \ \ vpxor t1, x6, x6; \ vpxor 2 * 32(mem_cd), x6, x6; \ \ vpxor t0, x7, x7; \ vpxor 3 * 32(mem_cd), x7, x7; #else /* CAMELLIA_GFNI_BUILD */ /* roundsm32 (AES-NI / VAES version) * IN: * x0..x7: byte-sliced AB state * mem_cd: register pointer storing CD state * key: index for key material * OUT: * x0..x7: new byte-sliced CD state */ #define roundsm32(x0, x1, x2, x3, x4, x5, x6, x7, t0, t1, t2, t3, t4, t5, \ t6, t7, mem_cd, key) \ /* \ * S-function with AES subbytes \ */ \ vbroadcasti128 .Linv_shift_row rRIP, t4; \ vpbroadcastd .L0f0f0f0f rRIP, t7; \ vbroadcasti128 .Lpre_tf_lo_s1 rRIP, t5; \ vbroadcasti128 .Lpre_tf_hi_s1 rRIP, t6; \ vbroadcasti128 .Lpre_tf_lo_s4 rRIP, t2; \ vbroadcasti128 .Lpre_tf_hi_s4 rRIP, t3; \ \ /* AES inverse shift rows */ \ vpshufb t4, x0, x0; \ vpshufb t4, x7, x7; \ vpshufb t4, x3, x3; \ vpshufb t4, x6, x6; \ vpshufb t4, x2, x2; \ vpshufb t4, x5, x5; \ vpshufb t4, x1, x1; \ vpshufb t4, x4, x4; \ \ /* prefilter sboxes 1, 2 and 3 */ \ /* prefilter sbox 4 */ \ filter_8bit(x0, t5, t6, t7, t4); \ filter_8bit(x7, t5, t6, t7, t4); \ IF_AESNI(vextracti128 $1, x0, t0##_x); \ IF_AESNI(vextracti128 $1, x7, t1##_x); \ filter_8bit(x3, t2, t3, t7, t4); \ filter_8bit(x6, t2, t3, t7, t4); \ IF_AESNI(vextracti128 $1, x3, t3##_x); \ IF_AESNI(vextracti128 $1, x6, t2##_x); \ filter_8bit(x2, t5, t6, t7, t4); \ filter_8bit(x5, t5, t6, t7, t4); \ filter_8bit(x1, t5, t6, t7, t4); \ filter_8bit(x4, t5, t6, t7, t4); \ \ vpxor t4, t4, t4; \ \ /* AES subbytes + AES shift rows */ \ IF_AESNI(vextracti128 $1, x2, t6##_x; \ vextracti128 $1, x5, t5##_x; \ vaesenclast t4##_x, x0##_x, x0##_x; \ vaesenclast t4##_x, t0##_x, t0##_x; \ vaesenclast t4##_x, x7##_x, x7##_x; \ vaesenclast t4##_x, t1##_x, t1##_x; \ vaesenclast t4##_x, x3##_x, x3##_x; \ vaesenclast t4##_x, t3##_x, t3##_x; \ vaesenclast t4##_x, x6##_x, x6##_x; \ vaesenclast t4##_x, t2##_x, t2##_x; \ vinserti128 $1, t0##_x, x0, x0; \ vinserti128 $1, t1##_x, x7, x7; \ vinserti128 $1, t3##_x, x3, x3; \ vinserti128 $1, t2##_x, x6, x6; \ vextracti128 $1, x1, t3##_x; \ vextracti128 $1, x4, t2##_x); \ vbroadcasti128 .Lpost_tf_lo_s1 rRIP, t0; \ vbroadcasti128 .Lpost_tf_hi_s1 rRIP, t1; \ IF_AESNI(vaesenclast t4##_x, x2##_x, x2##_x; \ vaesenclast t4##_x, t6##_x, t6##_x; \ vaesenclast t4##_x, x5##_x, x5##_x; \ vaesenclast t4##_x, t5##_x, t5##_x; \ vaesenclast t4##_x, x1##_x, x1##_x; \ vaesenclast t4##_x, t3##_x, t3##_x; \ vaesenclast t4##_x, x4##_x, x4##_x; \ vaesenclast t4##_x, t2##_x, t2##_x; \ vinserti128 $1, t6##_x, x2, x2; \ vinserti128 $1, t5##_x, x5, x5; \ vinserti128 $1, t3##_x, x1, x1; \ vinserti128 $1, t2##_x, x4, x4); \ IF_VAES(vaesenclast t4, x0, x0; \ vaesenclast t4, x7, x7; \ vaesenclast t4, x3, x3; \ vaesenclast t4, x6, x6; \ vaesenclast t4, x2, x2; \ vaesenclast t4, x5, x5; \ vaesenclast t4, x1, x1; \ vaesenclast t4, x4, x4); \ \ /* postfilter sboxes 1 and 4 */ \ vbroadcasti128 .Lpost_tf_lo_s3 rRIP, t2; \ vbroadcasti128 .Lpost_tf_hi_s3 rRIP, t3; \ filter_8bit(x0, t0, t1, t7, t4); \ filter_8bit(x7, t0, t1, t7, t4); \ filter_8bit(x3, t0, t1, t7, t6); \ filter_8bit(x6, t0, t1, t7, t6); \ \ /* postfilter sbox 3 */ \ vbroadcasti128 .Lpost_tf_lo_s2 rRIP, t4; \ vbroadcasti128 .Lpost_tf_hi_s2 rRIP, t5; \ filter_8bit(x2, t2, t3, t7, t6); \ filter_8bit(x5, t2, t3, t7, t6); \ \ /* postfilter sbox 2 */ \ filter_8bit(x1, t4, t5, t7, t2); \ filter_8bit(x4, t4, t5, t7, t2); \ \ vpbroadcastb 7+key, t7; \ vpbroadcastb 6+key, t6; \ \ /* P-function */ \ vpxor x5, x0, x0; \ vpxor x6, x1, x1; \ vpxor x7, x2, x2; \ vpxor x4, x3, x3; \ \ vpbroadcastb 5+key, t5; \ vpbroadcastb 4+key, t4; \ \ vpxor x2, x4, x4; \ vpxor x3, x5, x5; \ vpxor x0, x6, x6; \ vpxor x1, x7, x7; \ \ vpbroadcastb 3+key, t3; \ vpbroadcastb 2+key, t2; \ \ vpxor x7, x0, x0; \ vpxor x4, x1, x1; \ vpxor x5, x2, x2; \ vpxor x6, x3, x3; \ \ vpbroadcastb 1+key, t1; \ vpbroadcastb 0+key, t0; \ \ vpxor x3, x4, x4; \ vpxor x0, x5, x5; \ vpxor x1, x6, x6; \ vpxor x2, x7, x7; /* note: high and low parts swapped */ \ \ /* Add key material and result to CD (x becomes new CD) */ \ \ vpxor t7, x0, x0; \ vpxor 4 * 32(mem_cd), x0, x0; \ \ vpxor t6, x1, x1; \ vpxor 5 * 32(mem_cd), x1, x1; \ \ vpxor t5, x2, x2; \ vpxor 6 * 32(mem_cd), x2, x2; \ \ vpxor t4, x3, x3; \ vpxor 7 * 32(mem_cd), x3, x3; \ \ vpxor t3, x4, x4; \ vpxor 0 * 32(mem_cd), x4, x4; \ \ vpxor t2, x5, x5; \ vpxor 1 * 32(mem_cd), x5, x5; \ \ vpxor t1, x6, x6; \ vpxor 2 * 32(mem_cd), x6, x6; \ \ vpxor t0, x7, x7; \ vpxor 3 * 32(mem_cd), x7, x7; #endif /* CAMELLIA_GFNI_BUILD */ /* * IN/OUT: * x0..x7: byte-sliced AB state preloaded * mem_ab: byte-sliced AB state in memory * mem_cb: byte-sliced CD state in memory */ #define two_roundsm32(x0, x1, x2, x3, x4, x5, x6, x7, y0, y1, y2, y3, y4, y5, \ y6, y7, mem_ab, mem_cd, i, dir, store_ab) \ roundsm32(x0, x1, x2, x3, x4, x5, x6, x7, y0, y1, y2, y3, y4, y5, \ y6, y7, mem_cd, (key_table + (i) * 8)(CTX)); \ \ vmovdqu x0, 4 * 32(mem_cd); \ vmovdqu x1, 5 * 32(mem_cd); \ vmovdqu x2, 6 * 32(mem_cd); \ vmovdqu x3, 7 * 32(mem_cd); \ vmovdqu x4, 0 * 32(mem_cd); \ vmovdqu x5, 1 * 32(mem_cd); \ vmovdqu x6, 2 * 32(mem_cd); \ vmovdqu x7, 3 * 32(mem_cd); \ \ roundsm32(x4, x5, x6, x7, x0, x1, x2, x3, y0, y1, y2, y3, y4, y5, \ y6, y7, mem_ab, (key_table + ((i) + (dir)) * 8)(CTX)); \ \ store_ab(x0, x1, x2, x3, x4, x5, x6, x7, mem_ab); #define dummy_store(x0, x1, x2, x3, x4, x5, x6, x7, mem_ab) /* do nothing */ #define store_ab_state(x0, x1, x2, x3, x4, x5, x6, x7, mem_ab) \ /* Store new AB state */ \ vmovdqu x4, 4 * 32(mem_ab); \ vmovdqu x5, 5 * 32(mem_ab); \ vmovdqu x6, 6 * 32(mem_ab); \ vmovdqu x7, 7 * 32(mem_ab); \ vmovdqu x0, 0 * 32(mem_ab); \ vmovdqu x1, 1 * 32(mem_ab); \ vmovdqu x2, 2 * 32(mem_ab); \ vmovdqu x3, 3 * 32(mem_ab); #define enc_rounds32(x0, x1, x2, x3, x4, x5, x6, x7, y0, y1, y2, y3, y4, y5, \ y6, y7, mem_ab, mem_cd, i) \ two_roundsm32(x0, x1, x2, x3, x4, x5, x6, x7, y0, y1, y2, y3, y4, y5, \ y6, y7, mem_ab, mem_cd, (i) + 2, 1, store_ab_state); \ two_roundsm32(x0, x1, x2, x3, x4, x5, x6, x7, y0, y1, y2, y3, y4, y5, \ y6, y7, mem_ab, mem_cd, (i) + 4, 1, store_ab_state); \ two_roundsm32(x0, x1, x2, x3, x4, x5, x6, x7, y0, y1, y2, y3, y4, y5, \ y6, y7, mem_ab, mem_cd, (i) + 6, 1, dummy_store); #define dec_rounds32(x0, x1, x2, x3, x4, x5, x6, x7, y0, y1, y2, y3, y4, y5, \ y6, y7, mem_ab, mem_cd, i) \ two_roundsm32(x0, x1, x2, x3, x4, x5, x6, x7, y0, y1, y2, y3, y4, y5, \ y6, y7, mem_ab, mem_cd, (i) + 7, -1, store_ab_state); \ two_roundsm32(x0, x1, x2, x3, x4, x5, x6, x7, y0, y1, y2, y3, y4, y5, \ y6, y7, mem_ab, mem_cd, (i) + 5, -1, store_ab_state); \ two_roundsm32(x0, x1, x2, x3, x4, x5, x6, x7, y0, y1, y2, y3, y4, y5, \ y6, y7, mem_ab, mem_cd, (i) + 3, -1, dummy_store); /* * IN: * v0..3: byte-sliced 32-bit integers * OUT: * v0..3: (IN <<< 1) */ #ifdef CAMELLIA_GFNI_BUILD #define rol32_1_32(v0, v1, v2, v3, t0, t1, t2, right_shift_by_7) \ vgf2p8affineqb $0, right_shift_by_7, v0, t0; \ vpaddb v0, v0, v0; \ \ vgf2p8affineqb $0, right_shift_by_7, v1, t1; \ vpaddb v1, v1, v1; \ \ vgf2p8affineqb $0, right_shift_by_7, v2, t2; \ vpaddb v2, v2, v2; \ \ vpor t0, v1, v1; \ \ vgf2p8affineqb $0, right_shift_by_7, v3, t0; \ vpaddb v3, v3, v3; \ \ vpor t1, v2, v2; \ vpor t2, v3, v3; \ vpor t0, v0, v0; #else #define rol32_1_32(v0, v1, v2, v3, t0, t1, t2, zero) \ vpcmpgtb v0, zero, t0; \ vpaddb v0, v0, v0; \ vpabsb t0, t0; \ \ vpcmpgtb v1, zero, t1; \ vpaddb v1, v1, v1; \ vpabsb t1, t1; \ \ vpcmpgtb v2, zero, t2; \ vpaddb v2, v2, v2; \ vpabsb t2, t2; \ \ vpor t0, v1, v1; \ \ vpcmpgtb v3, zero, t0; \ vpaddb v3, v3, v3; \ vpabsb t0, t0; \ \ vpor t1, v2, v2; \ vpor t2, v3, v3; \ vpor t0, v0, v0; #endif /* * IN: * r: byte-sliced AB state in memory * l: byte-sliced CD state in memory * OUT: * x0..x7: new byte-sliced CD state */ #define fls32(l, l0, l1, l2, l3, l4, l5, l6, l7, r, t0, t1, t2, t3, tt0, \ tt1, tt2, tt3, kll, klr, krl, krr) \ /* \ * t0 = kll; \ * t0 &= ll; \ * lr ^= rol32(t0, 1); \ */ \ IF_NOT_GFNI(vpxor tt0, tt0, tt0); \ IF_GFNI(vpbroadcastq .Lright_shift_by_7 rRIP, tt0); \ vpbroadcastb 0+kll, t3; \ vpbroadcastb 1+kll, t2; \ vpbroadcastb 2+kll, t1; \ vpbroadcastb 3+kll, t0; \ \ vpand l0, t0, t0; \ vpand l1, t1, t1; \ vpand l2, t2, t2; \ vpand l3, t3, t3; \ \ rol32_1_32(t3, t2, t1, t0, tt1, tt2, tt3, tt0); \ \ vpxor l4, t0, l4; \ vmovdqu l4, 4 * 32(l); \ vpxor l5, t1, l5; \ vmovdqu l5, 5 * 32(l); \ vpxor l6, t2, l6; \ vmovdqu l6, 6 * 32(l); \ vpxor l7, t3, l7; \ vmovdqu l7, 7 * 32(l); \ \ /* \ * t2 = krr; \ * t2 |= rr; \ * rl ^= t2; \ */ \ \ vpbroadcastb 0+krr, t3; \ vpbroadcastb 1+krr, t2; \ vpbroadcastb 2+krr, t1; \ vpbroadcastb 3+krr, t0; \ \ vpor 4 * 32(r), t0, t0; \ vpor 5 * 32(r), t1, t1; \ vpor 6 * 32(r), t2, t2; \ vpor 7 * 32(r), t3, t3; \ \ vpxor 0 * 32(r), t0, t0; \ vpxor 1 * 32(r), t1, t1; \ vpxor 2 * 32(r), t2, t2; \ vpxor 3 * 32(r), t3, t3; \ vmovdqu t0, 0 * 32(r); \ vmovdqu t1, 1 * 32(r); \ vmovdqu t2, 2 * 32(r); \ vmovdqu t3, 3 * 32(r); \ \ /* \ * t2 = krl; \ * t2 &= rl; \ * rr ^= rol32(t2, 1); \ */ \ vpbroadcastb 0+krl, t3; \ vpbroadcastb 1+krl, t2; \ vpbroadcastb 2+krl, t1; \ vpbroadcastb 3+krl, t0; \ \ vpand 0 * 32(r), t0, t0; \ vpand 1 * 32(r), t1, t1; \ vpand 2 * 32(r), t2, t2; \ vpand 3 * 32(r), t3, t3; \ \ rol32_1_32(t3, t2, t1, t0, tt1, tt2, tt3, tt0); \ \ vpxor 4 * 32(r), t0, t0; \ vpxor 5 * 32(r), t1, t1; \ vpxor 6 * 32(r), t2, t2; \ vpxor 7 * 32(r), t3, t3; \ vmovdqu t0, 4 * 32(r); \ vmovdqu t1, 5 * 32(r); \ vmovdqu t2, 6 * 32(r); \ vmovdqu t3, 7 * 32(r); \ \ /* \ * t0 = klr; \ * t0 |= lr; \ * ll ^= t0; \ */ \ \ vpbroadcastb 0+klr, t3; \ vpbroadcastb 1+klr, t2; \ vpbroadcastb 2+klr, t1; \ vpbroadcastb 3+klr, t0; \ \ vpor l4, t0, t0; \ vpor l5, t1, t1; \ vpor l6, t2, t2; \ vpor l7, t3, t3; \ \ vpxor l0, t0, l0; \ vmovdqu l0, 0 * 32(l); \ vpxor l1, t1, l1; \ vmovdqu l1, 1 * 32(l); \ vpxor l2, t2, l2; \ vmovdqu l2, 2 * 32(l); \ vpxor l3, t3, l3; \ vmovdqu l3, 3 * 32(l); #define transpose_4x4(x0, x1, x2, x3, t1, t2) \ vpunpckhdq x1, x0, t2; \ vpunpckldq x1, x0, x0; \ \ vpunpckldq x3, x2, t1; \ vpunpckhdq x3, x2, x2; \ \ vpunpckhqdq t1, x0, x1; \ vpunpcklqdq t1, x0, x0; \ \ vpunpckhqdq x2, t2, x3; \ vpunpcklqdq x2, t2, x2; #define byteslice_16x16b_fast(a0, b0, c0, d0, a1, b1, c1, d1, a2, b2, c2, d2, \ a3, b3, c3, d3, st0, st1) \ vmovdqu d2, st0; \ vmovdqu d3, st1; \ transpose_4x4(a0, a1, a2, a3, d2, d3); \ transpose_4x4(b0, b1, b2, b3, d2, d3); \ vmovdqu st0, d2; \ vmovdqu st1, d3; \ \ vmovdqu a0, st0; \ vmovdqu a1, st1; \ transpose_4x4(c0, c1, c2, c3, a0, a1); \ transpose_4x4(d0, d1, d2, d3, a0, a1); \ \ vbroadcasti128 .Lshufb_16x16b rRIP, a0; \ vmovdqu st1, a1; \ vpshufb a0, a2, a2; \ vpshufb a0, a3, a3; \ vpshufb a0, b0, b0; \ vpshufb a0, b1, b1; \ vpshufb a0, b2, b2; \ vpshufb a0, b3, b3; \ vpshufb a0, a1, a1; \ vpshufb a0, c0, c0; \ vpshufb a0, c1, c1; \ vpshufb a0, c2, c2; \ vpshufb a0, c3, c3; \ vpshufb a0, d0, d0; \ vpshufb a0, d1, d1; \ vpshufb a0, d2, d2; \ vpshufb a0, d3, d3; \ vmovdqu d3, st1; \ vmovdqu st0, d3; \ vpshufb a0, d3, a0; \ vmovdqu d2, st0; \ \ transpose_4x4(a0, b0, c0, d0, d2, d3); \ transpose_4x4(a1, b1, c1, d1, d2, d3); \ vmovdqu st0, d2; \ vmovdqu st1, d3; \ \ vmovdqu b0, st0; \ vmovdqu b1, st1; \ transpose_4x4(a2, b2, c2, d2, b0, b1); \ transpose_4x4(a3, b3, c3, d3, b0, b1); \ vmovdqu st0, b0; \ vmovdqu st1, b1; \ /* does not adjust output bytes inside vectors */ /* load blocks to registers and apply pre-whitening */ #define inpack32_pre(x0, x1, x2, x3, x4, x5, x6, x7, y0, y1, y2, y3, y4, y5, \ y6, y7, rio, key) \ vpbroadcastq key, x0; \ vpshufb .Lpack_bswap rRIP, x0, x0; \ \ vpxor 0 * 32(rio), x0, y7; \ vpxor 1 * 32(rio), x0, y6; \ vpxor 2 * 32(rio), x0, y5; \ vpxor 3 * 32(rio), x0, y4; \ vpxor 4 * 32(rio), x0, y3; \ vpxor 5 * 32(rio), x0, y2; \ vpxor 6 * 32(rio), x0, y1; \ vpxor 7 * 32(rio), x0, y0; \ vpxor 8 * 32(rio), x0, x7; \ vpxor 9 * 32(rio), x0, x6; \ vpxor 10 * 32(rio), x0, x5; \ vpxor 11 * 32(rio), x0, x4; \ vpxor 12 * 32(rio), x0, x3; \ vpxor 13 * 32(rio), x0, x2; \ vpxor 14 * 32(rio), x0, x1; \ vpxor 15 * 32(rio), x0, x0; /* byteslice pre-whitened blocks and store to temporary memory */ #define inpack32_post(x0, x1, x2, x3, x4, x5, x6, x7, y0, y1, y2, y3, y4, y5, \ y6, y7, mem_ab, mem_cd) \ byteslice_16x16b_fast(x0, x1, x2, x3, x4, x5, x6, x7, y0, y1, y2, y3, \ y4, y5, y6, y7, (mem_ab), (mem_cd)); \ \ vmovdqu x0, 0 * 32(mem_ab); \ vmovdqu x1, 1 * 32(mem_ab); \ vmovdqu x2, 2 * 32(mem_ab); \ vmovdqu x3, 3 * 32(mem_ab); \ vmovdqu x4, 4 * 32(mem_ab); \ vmovdqu x5, 5 * 32(mem_ab); \ vmovdqu x6, 6 * 32(mem_ab); \ vmovdqu x7, 7 * 32(mem_ab); \ vmovdqu y0, 0 * 32(mem_cd); \ vmovdqu y1, 1 * 32(mem_cd); \ vmovdqu y2, 2 * 32(mem_cd); \ vmovdqu y3, 3 * 32(mem_cd); \ vmovdqu y4, 4 * 32(mem_cd); \ vmovdqu y5, 5 * 32(mem_cd); \ vmovdqu y6, 6 * 32(mem_cd); \ vmovdqu y7, 7 * 32(mem_cd); /* de-byteslice, apply post-whitening and store blocks */ #define outunpack32(x0, x1, x2, x3, x4, x5, x6, x7, y0, y1, y2, y3, y4, \ y5, y6, y7, key, stack_tmp0, stack_tmp1) \ byteslice_16x16b_fast(y0, y4, x0, x4, y1, y5, x1, x5, y2, y6, x2, x6, \ y3, y7, x3, x7, stack_tmp0, stack_tmp1); \ \ vmovdqu x0, stack_tmp0; \ \ vpbroadcastq key, x0; \ vpshufb .Lpack_bswap rRIP, x0, x0; \ \ vpxor x0, y7, y7; \ vpxor x0, y6, y6; \ vpxor x0, y5, y5; \ vpxor x0, y4, y4; \ vpxor x0, y3, y3; \ vpxor x0, y2, y2; \ vpxor x0, y1, y1; \ vpxor x0, y0, y0; \ vpxor x0, x7, x7; \ vpxor x0, x6, x6; \ vpxor x0, x5, x5; \ vpxor x0, x4, x4; \ vpxor x0, x3, x3; \ vpxor x0, x2, x2; \ vpxor x0, x1, x1; \ vpxor stack_tmp0, x0, x0; #define write_output(x0, x1, x2, x3, x4, x5, x6, x7, y0, y1, y2, y3, y4, y5, \ y6, y7, rio) \ vmovdqu x0, 0 * 32(rio); \ vmovdqu x1, 1 * 32(rio); \ vmovdqu x2, 2 * 32(rio); \ vmovdqu x3, 3 * 32(rio); \ vmovdqu x4, 4 * 32(rio); \ vmovdqu x5, 5 * 32(rio); \ vmovdqu x6, 6 * 32(rio); \ vmovdqu x7, 7 * 32(rio); \ vmovdqu y0, 8 * 32(rio); \ vmovdqu y1, 9 * 32(rio); \ vmovdqu y2, 10 * 32(rio); \ vmovdqu y3, 11 * 32(rio); \ vmovdqu y4, 12 * 32(rio); \ vmovdqu y5, 13 * 32(rio); \ vmovdqu y6, 14 * 32(rio); \ vmovdqu y7, 15 * 32(rio); SECTION_RODATA .align 32 #define SHUFB_BYTES(idx) \ 0 + (idx), 4 + (idx), 8 + (idx), 12 + (idx) FUNC_NAME(_constants): ELF(.type FUNC_NAME(_constants),@object;) .Lpack_bswap: .long 0x00010203, 0x04050607, 0x80808080, 0x80808080 .long 0x00010203, 0x04050607, 0x80808080, 0x80808080 .Lshufb_16x16b: .byte SHUFB_BYTES(0), SHUFB_BYTES(1), SHUFB_BYTES(2), SHUFB_BYTES(3) /* For CTR-mode IV byteswap */ .Lbswap128_mask: .byte 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 /* CTR byte addition constants */ .align 32 .Lbige_addb_0_1: .byte 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 .byte 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 .Lbige_addb_2_3: .byte 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2 .byte 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3 .Lbige_addb_4_5: .byte 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4 .byte 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5 .Lbige_addb_6_7: .byte 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6 .byte 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7 .Lbige_addb_8_9: .byte 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8 .byte 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9 .Lbige_addb_10_11: .byte 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10 .byte 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11 .Lbige_addb_12_13: .byte 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12 .byte 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13 .Lbige_addb_14_15: .byte 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14 .byte 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15 .Lbige_addb_16_16: .byte 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16 .byte 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16 #ifdef CAMELLIA_GFNI_BUILD .align 64 /* Pre-filters and post-filters bit-matrixes for Camellia sboxes s1, s2, s3 * and s4. * See http://urn.fi/URN:NBN:fi:oulu-201305311409, pages 43-48. * * Pre-filters are directly from above source, "θ₁"/"θ₄". Post-filters are * combination of function "A" (AES SubBytes affine transformation) and * "ψ₁"/"ψ₂"/"ψ₃". */ /* Bit-matrix from "θ₁(x)" function: */ .Lpre_filter_bitmatrix_s123: .quad BM8X8(BV8(1, 1, 1, 0, 1, 1, 0, 1), BV8(0, 0, 1, 1, 0, 0, 1, 0), BV8(1, 1, 0, 1, 0, 0, 0, 0), BV8(1, 0, 1, 1, 0, 0, 1, 1), BV8(0, 0, 0, 0, 1, 1, 0, 0), BV8(1, 0, 1, 0, 0, 1, 0, 0), BV8(0, 0, 1, 0, 1, 1, 0, 0), BV8(1, 0, 0, 0, 0, 1, 1, 0)) /* Bit-matrix from "θ₄(x)" function: */ .Lpre_filter_bitmatrix_s4: .quad BM8X8(BV8(1, 1, 0, 1, 1, 0, 1, 1), BV8(0, 1, 1, 0, 0, 1, 0, 0), BV8(1, 0, 1, 0, 0, 0, 0, 1), BV8(0, 1, 1, 0, 0, 1, 1, 1), BV8(0, 0, 0, 1, 1, 0, 0, 0), BV8(0, 1, 0, 0, 1, 0, 0, 1), BV8(0, 1, 0, 1, 1, 0, 0, 0), BV8(0, 0, 0, 0, 1, 1, 0, 1)) /* Bit-matrix from "ψ₁(A(x))" function: */ .Lpost_filter_bitmatrix_s14: .quad BM8X8(BV8(0, 0, 0, 0, 0, 0, 0, 1), BV8(0, 1, 1, 0, 0, 1, 1, 0), BV8(1, 0, 1, 1, 1, 1, 1, 0), BV8(0, 0, 0, 1, 1, 0, 1, 1), BV8(1, 0, 0, 0, 1, 1, 1, 0), BV8(0, 1, 0, 1, 1, 1, 1, 0), BV8(0, 1, 1, 1, 1, 1, 1, 1), BV8(0, 0, 0, 1, 1, 1, 0, 0)) /* Bit-matrix from "ψ₂(A(x))" function: */ .Lpost_filter_bitmatrix_s2: .quad BM8X8(BV8(0, 0, 0, 1, 1, 1, 0, 0), BV8(0, 0, 0, 0, 0, 0, 0, 1), BV8(0, 1, 1, 0, 0, 1, 1, 0), BV8(1, 0, 1, 1, 1, 1, 1, 0), BV8(0, 0, 0, 1, 1, 0, 1, 1), BV8(1, 0, 0, 0, 1, 1, 1, 0), BV8(0, 1, 0, 1, 1, 1, 1, 0), BV8(0, 1, 1, 1, 1, 1, 1, 1)) /* Bit-matrix from "ψ₃(A(x))" function: */ .Lpost_filter_bitmatrix_s3: .quad BM8X8(BV8(0, 1, 1, 0, 0, 1, 1, 0), BV8(1, 0, 1, 1, 1, 1, 1, 0), BV8(0, 0, 0, 1, 1, 0, 1, 1), BV8(1, 0, 0, 0, 1, 1, 1, 0), BV8(0, 1, 0, 1, 1, 1, 1, 0), BV8(0, 1, 1, 1, 1, 1, 1, 1), BV8(0, 0, 0, 1, 1, 1, 0, 0), BV8(0, 0, 0, 0, 0, 0, 0, 1)) /* Bit-matrix for right shifting uint8_t values in vector by 7. */ .Lright_shift_by_7: .quad BM8X8(BV8(0, 0, 0, 0, 0, 0, 0, 1), BV8(0, 0, 0, 0, 0, 0, 0, 0), BV8(0, 0, 0, 0, 0, 0, 0, 0), BV8(0, 0, 0, 0, 0, 0, 0, 0), BV8(0, 0, 0, 0, 0, 0, 0, 0), BV8(0, 0, 0, 0, 0, 0, 0, 0), BV8(0, 0, 0, 0, 0, 0, 0, 0), BV8(0, 0, 0, 0, 0, 0, 0, 0)) #else /* CAMELLIA_GFNI_BUILD */ /* * pre-SubByte transform * * pre-lookup for sbox1, sbox2, sbox3: * swap_bitendianness( * isom_map_camellia_to_aes( * camellia_f( * swap_bitendianess(in) * ) * ) * ) * * (note: '⊕ 0xc5' inside camellia_f()) */ .Lpre_tf_lo_s1: .byte 0x45, 0xe8, 0x40, 0xed, 0x2e, 0x83, 0x2b, 0x86 .byte 0x4b, 0xe6, 0x4e, 0xe3, 0x20, 0x8d, 0x25, 0x88 .Lpre_tf_hi_s1: .byte 0x00, 0x51, 0xf1, 0xa0, 0x8a, 0xdb, 0x7b, 0x2a .byte 0x09, 0x58, 0xf8, 0xa9, 0x83, 0xd2, 0x72, 0x23 /* * pre-SubByte transform * * pre-lookup for sbox4: * swap_bitendianness( * isom_map_camellia_to_aes( * camellia_f( * swap_bitendianess(in <<< 1) * ) * ) * ) * * (note: '⊕ 0xc5' inside camellia_f()) */ .Lpre_tf_lo_s4: .byte 0x45, 0x40, 0x2e, 0x2b, 0x4b, 0x4e, 0x20, 0x25 .byte 0x14, 0x11, 0x7f, 0x7a, 0x1a, 0x1f, 0x71, 0x74 .Lpre_tf_hi_s4: .byte 0x00, 0xf1, 0x8a, 0x7b, 0x09, 0xf8, 0x83, 0x72 .byte 0xad, 0x5c, 0x27, 0xd6, 0xa4, 0x55, 0x2e, 0xdf /* * post-SubByte transform * * post-lookup for sbox1, sbox4: * swap_bitendianness( * camellia_h( * isom_map_aes_to_camellia( * swap_bitendianness( * aes_inverse_affine_transform(in) * ) * ) * ) * ) * * (note: '⊕ 0x6e' inside camellia_h()) */ .Lpost_tf_lo_s1: .byte 0x3c, 0xcc, 0xcf, 0x3f, 0x32, 0xc2, 0xc1, 0x31 .byte 0xdc, 0x2c, 0x2f, 0xdf, 0xd2, 0x22, 0x21, 0xd1 .Lpost_tf_hi_s1: .byte 0x00, 0xf9, 0x86, 0x7f, 0xd7, 0x2e, 0x51, 0xa8 .byte 0xa4, 0x5d, 0x22, 0xdb, 0x73, 0x8a, 0xf5, 0x0c /* * post-SubByte transform * * post-lookup for sbox2: * swap_bitendianness( * camellia_h( * isom_map_aes_to_camellia( * swap_bitendianness( * aes_inverse_affine_transform(in) * ) * ) * ) * ) <<< 1 * * (note: '⊕ 0x6e' inside camellia_h()) */ .Lpost_tf_lo_s2: .byte 0x78, 0x99, 0x9f, 0x7e, 0x64, 0x85, 0x83, 0x62 .byte 0xb9, 0x58, 0x5e, 0xbf, 0xa5, 0x44, 0x42, 0xa3 .Lpost_tf_hi_s2: .byte 0x00, 0xf3, 0x0d, 0xfe, 0xaf, 0x5c, 0xa2, 0x51 .byte 0x49, 0xba, 0x44, 0xb7, 0xe6, 0x15, 0xeb, 0x18 /* * post-SubByte transform * * post-lookup for sbox3: * swap_bitendianness( * camellia_h( * isom_map_aes_to_camellia( * swap_bitendianness( * aes_inverse_affine_transform(in) * ) * ) * ) * ) >>> 1 * * (note: '⊕ 0x6e' inside camellia_h()) */ .Lpost_tf_lo_s3: .byte 0x1e, 0x66, 0xe7, 0x9f, 0x19, 0x61, 0xe0, 0x98 .byte 0x6e, 0x16, 0x97, 0xef, 0x69, 0x11, 0x90, 0xe8 .Lpost_tf_hi_s3: .byte 0x00, 0xfc, 0x43, 0xbf, 0xeb, 0x17, 0xa8, 0x54 .byte 0x52, 0xae, 0x11, 0xed, 0xb9, 0x45, 0xfa, 0x06 /* For isolating SubBytes from AESENCLAST, inverse shift row */ .Linv_shift_row: .byte 0x00, 0x0d, 0x0a, 0x07, 0x04, 0x01, 0x0e, 0x0b .byte 0x08, 0x05, 0x02, 0x0f, 0x0c, 0x09, 0x06, 0x03 .align 4 /* 4-bit mask */ .L0f0f0f0f: .long 0x0f0f0f0f #endif /* CAMELLIA_GFNI_BUILD */ ELF(.size FUNC_NAME(_constants),.-FUNC_NAME(_constants);) .text .align 16 ELF(.type FUNC_NAME(enc_blk32),@function;) FUNC_NAME(enc_blk32): /* input: * %rdi: ctx, CTX * %rax: temporary storage, 512 bytes * %r8d: 24 for 16 byte key, 32 for larger * %ymm0..%ymm15: 32 plaintext blocks * output: * %ymm0..%ymm15: 32 encrypted blocks, order swapped: * 7, 8, 6, 5, 4, 3, 2, 1, 0, 15, 14, 13, 12, 11, 10, 9, 8 */ CFI_STARTPROC(); leaq 8 * 32(%rax), %rcx; leaq (-8 * 8)(CTX, %r8, 8), %r8; inpack32_post(%ymm0, %ymm1, %ymm2, %ymm3, %ymm4, %ymm5, %ymm6, %ymm7, %ymm8, %ymm9, %ymm10, %ymm11, %ymm12, %ymm13, %ymm14, %ymm15, %rax, %rcx); .align 8 .Lenc_loop: enc_rounds32(%ymm0, %ymm1, %ymm2, %ymm3, %ymm4, %ymm5, %ymm6, %ymm7, %ymm8, %ymm9, %ymm10, %ymm11, %ymm12, %ymm13, %ymm14, %ymm15, %rax, %rcx, 0); cmpq %r8, CTX; je .Lenc_done; leaq (8 * 8)(CTX), CTX; fls32(%rax, %ymm0, %ymm1, %ymm2, %ymm3, %ymm4, %ymm5, %ymm6, %ymm7, %rcx, %ymm8, %ymm9, %ymm10, %ymm11, %ymm12, %ymm13, %ymm14, %ymm15, ((key_table) + 0)(CTX), ((key_table) + 4)(CTX), ((key_table) + 8)(CTX), ((key_table) + 12)(CTX)); jmp .Lenc_loop; .align 8 .Lenc_done: /* load CD for output */ vmovdqu 0 * 32(%rcx), %ymm8; vmovdqu 1 * 32(%rcx), %ymm9; vmovdqu 2 * 32(%rcx), %ymm10; vmovdqu 3 * 32(%rcx), %ymm11; vmovdqu 4 * 32(%rcx), %ymm12; vmovdqu 5 * 32(%rcx), %ymm13; vmovdqu 6 * 32(%rcx), %ymm14; vmovdqu 7 * 32(%rcx), %ymm15; outunpack32(%ymm0, %ymm1, %ymm2, %ymm3, %ymm4, %ymm5, %ymm6, %ymm7, %ymm8, %ymm9, %ymm10, %ymm11, %ymm12, %ymm13, %ymm14, %ymm15, ((key_table) + 8 * 8)(%r8), (%rax), 1 * 32(%rax)); ret_spec_stop; CFI_ENDPROC(); ELF(.size FUNC_NAME(enc_blk32),.-FUNC_NAME(enc_blk32);) .align 16 ELF(.type FUNC_NAME(dec_blk32),@function;) FUNC_NAME(dec_blk32): /* input: * %rdi: ctx, CTX * %rax: temporary storage, 512 bytes * %r8d: 24 for 16 byte key, 32 for larger * %ymm0..%ymm15: 32 encrypted blocks * output: * %ymm0..%ymm15: 32 plaintext blocks, order swapped: * 7, 8, 6, 5, 4, 3, 2, 1, 0, 15, 14, 13, 12, 11, 10, 9, 8 */ CFI_STARTPROC(); movq %r8, %rcx; movq CTX, %r8 leaq (-8 * 8)(CTX, %rcx, 8), CTX; leaq 8 * 32(%rax), %rcx; inpack32_post(%ymm0, %ymm1, %ymm2, %ymm3, %ymm4, %ymm5, %ymm6, %ymm7, %ymm8, %ymm9, %ymm10, %ymm11, %ymm12, %ymm13, %ymm14, %ymm15, %rax, %rcx); .align 8 .Ldec_loop: dec_rounds32(%ymm0, %ymm1, %ymm2, %ymm3, %ymm4, %ymm5, %ymm6, %ymm7, %ymm8, %ymm9, %ymm10, %ymm11, %ymm12, %ymm13, %ymm14, %ymm15, %rax, %rcx, 0); cmpq %r8, CTX; je .Ldec_done; fls32(%rax, %ymm0, %ymm1, %ymm2, %ymm3, %ymm4, %ymm5, %ymm6, %ymm7, %rcx, %ymm8, %ymm9, %ymm10, %ymm11, %ymm12, %ymm13, %ymm14, %ymm15, ((key_table) + 8)(CTX), ((key_table) + 12)(CTX), ((key_table) + 0)(CTX), ((key_table) + 4)(CTX)); leaq (-8 * 8)(CTX), CTX; jmp .Ldec_loop; .align 8 .Ldec_done: /* load CD for output */ vmovdqu 0 * 32(%rcx), %ymm8; vmovdqu 1 * 32(%rcx), %ymm9; vmovdqu 2 * 32(%rcx), %ymm10; vmovdqu 3 * 32(%rcx), %ymm11; vmovdqu 4 * 32(%rcx), %ymm12; vmovdqu 5 * 32(%rcx), %ymm13; vmovdqu 6 * 32(%rcx), %ymm14; vmovdqu 7 * 32(%rcx), %ymm15; outunpack32(%ymm0, %ymm1, %ymm2, %ymm3, %ymm4, %ymm5, %ymm6, %ymm7, %ymm8, %ymm9, %ymm10, %ymm11, %ymm12, %ymm13, %ymm14, %ymm15, (key_table)(CTX), (%rax), 1 * 32(%rax)); ret_spec_stop; CFI_ENDPROC(); ELF(.size FUNC_NAME(dec_blk32),.-FUNC_NAME(dec_blk32);) #define inc_le128(x, minus_one, tmp) \ vpcmpeqq minus_one, x, tmp; \ vpsubq minus_one, x, x; \ vpslldq $8, tmp, tmp; \ vpsubq tmp, x, x; .align 16 .globl FUNC_NAME(ctr_enc) ELF(.type FUNC_NAME(ctr_enc),@function;) FUNC_NAME(ctr_enc): /* input: * %rdi: ctx, CTX * %rsi: dst (32 blocks) * %rdx: src (32 blocks) * %rcx: iv (big endian, 128bit) */ CFI_STARTPROC(); pushq %rbp; CFI_PUSH(%rbp); movq %rsp, %rbp; CFI_DEF_CFA_REGISTER(%rbp); cmpl $128, key_bitlength(CTX); movl $32, %r8d; movl $24, %eax; cmovel %eax, %r8d; /* max */ subq $(16 * 32), %rsp; andq $~63, %rsp; movq %rsp, %rax; cmpb $(0x100 - 32), 15(%rcx); jbe .Lctr_byteadd; movq 8(%rcx), %r11; bswapq %r11; vpcmpeqd %ymm15, %ymm15, %ymm15; vpsrldq $8, %ymm15, %ymm15; /* ab: -1:0 ; cd: -1:0 */ /* load IV and byteswap */ vmovdqu (%rcx), %xmm0; vpshufb .Lbswap128_mask rRIP, %xmm0, %xmm0; vmovdqa %xmm0, %xmm1; inc_le128(%xmm0, %xmm15, %xmm14); vbroadcasti128 .Lbswap128_mask rRIP, %ymm14; vinserti128 $1, %xmm0, %ymm1, %ymm0; vpshufb %ymm14, %ymm0, %ymm13; vmovdqu %ymm13, 15 * 32(%rax); /* check need for handling 64-bit overflow and carry */ cmpq $(0xffffffffffffffff - 32), %r11; ja .Lload_ctr_carry; /* construct IVs */ vpaddq %ymm15, %ymm15, %ymm15; /* ab: -2:0 ; cd: -2:0 */ vpsubq %ymm15, %ymm0, %ymm0; vpshufb %ymm14, %ymm0, %ymm13; vmovdqu %ymm13, 14 * 32(%rax); vpsubq %ymm15, %ymm0, %ymm0; vpshufb %ymm14, %ymm0, %ymm13; vmovdqu %ymm13, 13 * 32(%rax); vpsubq %ymm15, %ymm0, %ymm0; vpshufb %ymm14, %ymm0, %ymm12; vpsubq %ymm15, %ymm0, %ymm0; vpshufb %ymm14, %ymm0, %ymm11; vpsubq %ymm15, %ymm0, %ymm0; vpshufb %ymm14, %ymm0, %ymm10; vpsubq %ymm15, %ymm0, %ymm0; vpshufb %ymm14, %ymm0, %ymm9; vpsubq %ymm15, %ymm0, %ymm0; vpshufb %ymm14, %ymm0, %ymm8; vpsubq %ymm15, %ymm0, %ymm0; vpshufb %ymm14, %ymm0, %ymm7; vpsubq %ymm15, %ymm0, %ymm0; vpshufb %ymm14, %ymm0, %ymm6; vpsubq %ymm15, %ymm0, %ymm0; vpshufb %ymm14, %ymm0, %ymm5; vpsubq %ymm15, %ymm0, %ymm0; vpshufb %ymm14, %ymm0, %ymm4; vpsubq %ymm15, %ymm0, %ymm0; vpshufb %ymm14, %ymm0, %ymm3; vpsubq %ymm15, %ymm0, %ymm0; vpshufb %ymm14, %ymm0, %ymm2; vpsubq %ymm15, %ymm0, %ymm0; vpshufb %ymm14, %ymm0, %ymm1; vpsubq %ymm15, %ymm0, %ymm0; /* +30 ; +31 */ vpsubq %xmm15, %xmm0, %xmm13; /* +32 */ vpshufb %ymm14, %ymm0, %ymm0; vpshufb %xmm14, %xmm13, %xmm13; vmovdqu %xmm13, (%rcx); jmp .Lload_ctr_done; .align 4 .Lload_ctr_carry: /* construct IVs */ inc_le128(%ymm0, %ymm15, %ymm13); /* ab: le1 ; cd: le2 */ inc_le128(%ymm0, %ymm15, %ymm13); /* ab: le2 ; cd: le3 */ vpshufb %ymm14, %ymm0, %ymm13; vmovdqu %ymm13, 14 * 32(%rax); inc_le128(%ymm0, %ymm15, %ymm13); inc_le128(%ymm0, %ymm15, %ymm13); vpshufb %ymm14, %ymm0, %ymm13; vmovdqu %ymm13, 13 * 32(%rax); inc_le128(%ymm0, %ymm15, %ymm13); inc_le128(%ymm0, %ymm15, %ymm13); vpshufb %ymm14, %ymm0, %ymm12; inc_le128(%ymm0, %ymm15, %ymm13); inc_le128(%ymm0, %ymm15, %ymm13); vpshufb %ymm14, %ymm0, %ymm11; inc_le128(%ymm0, %ymm15, %ymm13); inc_le128(%ymm0, %ymm15, %ymm13); vpshufb %ymm14, %ymm0, %ymm10; inc_le128(%ymm0, %ymm15, %ymm13); inc_le128(%ymm0, %ymm15, %ymm13); vpshufb %ymm14, %ymm0, %ymm9; inc_le128(%ymm0, %ymm15, %ymm13); inc_le128(%ymm0, %ymm15, %ymm13); vpshufb %ymm14, %ymm0, %ymm8; inc_le128(%ymm0, %ymm15, %ymm13); inc_le128(%ymm0, %ymm15, %ymm13); vpshufb %ymm14, %ymm0, %ymm7; inc_le128(%ymm0, %ymm15, %ymm13); inc_le128(%ymm0, %ymm15, %ymm13); vpshufb %ymm14, %ymm0, %ymm6; inc_le128(%ymm0, %ymm15, %ymm13); inc_le128(%ymm0, %ymm15, %ymm13); vpshufb %ymm14, %ymm0, %ymm5; inc_le128(%ymm0, %ymm15, %ymm13); inc_le128(%ymm0, %ymm15, %ymm13); vpshufb %ymm14, %ymm0, %ymm4; inc_le128(%ymm0, %ymm15, %ymm13); inc_le128(%ymm0, %ymm15, %ymm13); vpshufb %ymm14, %ymm0, %ymm3; inc_le128(%ymm0, %ymm15, %ymm13); inc_le128(%ymm0, %ymm15, %ymm13); vpshufb %ymm14, %ymm0, %ymm2; inc_le128(%ymm0, %ymm15, %ymm13); inc_le128(%ymm0, %ymm15, %ymm13); vpshufb %ymm14, %ymm0, %ymm1; inc_le128(%ymm0, %ymm15, %ymm13); inc_le128(%ymm0, %ymm15, %ymm13); vextracti128 $1, %ymm0, %xmm13; vpshufb %ymm14, %ymm0, %ymm0; inc_le128(%xmm13, %xmm15, %xmm14); vpshufb .Lbswap128_mask rRIP, %xmm13, %xmm13; vmovdqu %xmm13, (%rcx); .align 8 .Lload_ctr_done: /* inpack32_pre: */ vpbroadcastq (key_table)(CTX), %ymm15; vpshufb .Lpack_bswap rRIP, %ymm15, %ymm15; vpxor %ymm0, %ymm15, %ymm0; vpxor %ymm1, %ymm15, %ymm1; vpxor %ymm2, %ymm15, %ymm2; vpxor %ymm3, %ymm15, %ymm3; vpxor %ymm4, %ymm15, %ymm4; vpxor %ymm5, %ymm15, %ymm5; vpxor %ymm6, %ymm15, %ymm6; vpxor %ymm7, %ymm15, %ymm7; vpxor %ymm8, %ymm15, %ymm8; vpxor %ymm9, %ymm15, %ymm9; vpxor %ymm10, %ymm15, %ymm10; vpxor %ymm11, %ymm15, %ymm11; vpxor %ymm12, %ymm15, %ymm12; vpxor 13 * 32(%rax), %ymm15, %ymm13; vpxor 14 * 32(%rax), %ymm15, %ymm14; vpxor 15 * 32(%rax), %ymm15, %ymm15; call FUNC_NAME(enc_blk32); vpxor 0 * 32(%rdx), %ymm7, %ymm7; vpxor 1 * 32(%rdx), %ymm6, %ymm6; vpxor 2 * 32(%rdx), %ymm5, %ymm5; vpxor 3 * 32(%rdx), %ymm4, %ymm4; vpxor 4 * 32(%rdx), %ymm3, %ymm3; vpxor 5 * 32(%rdx), %ymm2, %ymm2; vpxor 6 * 32(%rdx), %ymm1, %ymm1; vpxor 7 * 32(%rdx), %ymm0, %ymm0; vpxor 8 * 32(%rdx), %ymm15, %ymm15; vpxor 9 * 32(%rdx), %ymm14, %ymm14; vpxor 10 * 32(%rdx), %ymm13, %ymm13; vpxor 11 * 32(%rdx), %ymm12, %ymm12; vpxor 12 * 32(%rdx), %ymm11, %ymm11; vpxor 13 * 32(%rdx), %ymm10, %ymm10; vpxor 14 * 32(%rdx), %ymm9, %ymm9; vpxor 15 * 32(%rdx), %ymm8, %ymm8; write_output(%ymm7, %ymm6, %ymm5, %ymm4, %ymm3, %ymm2, %ymm1, %ymm0, %ymm15, %ymm14, %ymm13, %ymm12, %ymm11, %ymm10, %ymm9, %ymm8, %rsi); vzeroall; leave; CFI_LEAVE(); ret_spec_stop; .align 8 .Lctr_byteadd_full_ctr_carry: movq 8(%rcx), %r11; movq (%rcx), %r10; bswapq %r11; bswapq %r10; addq $32, %r11; adcq $0, %r10; bswapq %r11; bswapq %r10; movq %r11, 8(%rcx); movq %r10, (%rcx); jmp .Lctr_byteadd_ymm; .align 8 .Lctr_byteadd: vbroadcasti128 (%rcx), %ymm8; je .Lctr_byteadd_full_ctr_carry; addb $32, 15(%rcx); .Lctr_byteadd_ymm: vpaddb .Lbige_addb_16_16 rRIP, %ymm8, %ymm0; vpaddb .Lbige_addb_0_1 rRIP, %ymm8, %ymm15; vpaddb .Lbige_addb_2_3 rRIP, %ymm8, %ymm14; vmovdqu %ymm15, 15 * 32(%rax); vpaddb .Lbige_addb_4_5 rRIP, %ymm8, %ymm13; vmovdqu %ymm14, 14 * 32(%rax); vpaddb .Lbige_addb_6_7 rRIP, %ymm8, %ymm12; vmovdqu %ymm13, 13 * 32(%rax); vpaddb .Lbige_addb_8_9 rRIP, %ymm8, %ymm11; vpaddb .Lbige_addb_10_11 rRIP, %ymm8, %ymm10; vpaddb .Lbige_addb_12_13 rRIP, %ymm8, %ymm9; vpaddb .Lbige_addb_14_15 rRIP, %ymm8, %ymm8; vpaddb .Lbige_addb_0_1 rRIP, %ymm0, %ymm7; vpaddb .Lbige_addb_2_3 rRIP, %ymm0, %ymm6; vpaddb .Lbige_addb_4_5 rRIP, %ymm0, %ymm5; vpaddb .Lbige_addb_6_7 rRIP, %ymm0, %ymm4; vpaddb .Lbige_addb_8_9 rRIP, %ymm0, %ymm3; vpaddb .Lbige_addb_10_11 rRIP, %ymm0, %ymm2; vpaddb .Lbige_addb_12_13 rRIP, %ymm0, %ymm1; vpaddb .Lbige_addb_14_15 rRIP, %ymm0, %ymm0; jmp .Lload_ctr_done; CFI_ENDPROC(); ELF(.size FUNC_NAME(ctr_enc),.-FUNC_NAME(ctr_enc);) .align 16 .globl FUNC_NAME(cbc_dec) ELF(.type FUNC_NAME(cbc_dec),@function;) FUNC_NAME(cbc_dec): /* input: * %rdi: ctx, CTX * %rsi: dst (32 blocks) * %rdx: src (32 blocks) * %rcx: iv */ CFI_STARTPROC(); pushq %rbp; CFI_PUSH(%rbp); movq %rsp, %rbp; CFI_DEF_CFA_REGISTER(%rbp); movq %rcx, %r9; cmpl $128, key_bitlength(CTX); movl $32, %r8d; movl $24, %eax; cmovel %eax, %r8d; /* max */ subq $(16 * 32), %rsp; andq $~63, %rsp; movq %rsp, %rax; inpack32_pre(%ymm0, %ymm1, %ymm2, %ymm3, %ymm4, %ymm5, %ymm6, %ymm7, %ymm8, %ymm9, %ymm10, %ymm11, %ymm12, %ymm13, %ymm14, %ymm15, %rdx, (key_table)(CTX, %r8, 8)); call FUNC_NAME(dec_blk32); /* XOR output with IV */ vmovdqu %ymm8, (%rax); vmovdqu (%r9), %xmm8; vinserti128 $1, (%rdx), %ymm8, %ymm8; vpxor %ymm8, %ymm7, %ymm7; vmovdqu (%rax), %ymm8; vpxor (0 * 32 + 16)(%rdx), %ymm6, %ymm6; vpxor (1 * 32 + 16)(%rdx), %ymm5, %ymm5; vpxor (2 * 32 + 16)(%rdx), %ymm4, %ymm4; vpxor (3 * 32 + 16)(%rdx), %ymm3, %ymm3; vpxor (4 * 32 + 16)(%rdx), %ymm2, %ymm2; vpxor (5 * 32 + 16)(%rdx), %ymm1, %ymm1; vpxor (6 * 32 + 16)(%rdx), %ymm0, %ymm0; vpxor (7 * 32 + 16)(%rdx), %ymm15, %ymm15; vpxor (8 * 32 + 16)(%rdx), %ymm14, %ymm14; vpxor (9 * 32 + 16)(%rdx), %ymm13, %ymm13; vpxor (10 * 32 + 16)(%rdx), %ymm12, %ymm12; vpxor (11 * 32 + 16)(%rdx), %ymm11, %ymm11; vpxor (12 * 32 + 16)(%rdx), %ymm10, %ymm10; vpxor (13 * 32 + 16)(%rdx), %ymm9, %ymm9; vpxor (14 * 32 + 16)(%rdx), %ymm8, %ymm8; movq (15 * 32 + 16 + 0)(%rdx), %rax; movq (15 * 32 + 16 + 8)(%rdx), %rcx; write_output(%ymm7, %ymm6, %ymm5, %ymm4, %ymm3, %ymm2, %ymm1, %ymm0, %ymm15, %ymm14, %ymm13, %ymm12, %ymm11, %ymm10, %ymm9, %ymm8, %rsi); /* store new IV */ movq %rax, (0)(%r9); movq %rcx, (8)(%r9); vzeroall; leave; CFI_LEAVE(); ret_spec_stop; CFI_ENDPROC(); ELF(.size FUNC_NAME(cbc_dec),.-FUNC_NAME(cbc_dec);) .align 16 .globl FUNC_NAME(cfb_dec) ELF(.type FUNC_NAME(cfb_dec),@function;) FUNC_NAME(cfb_dec): /* input: * %rdi: ctx, CTX * %rsi: dst (32 blocks) * %rdx: src (32 blocks) * %rcx: iv */ CFI_STARTPROC(); pushq %rbp; CFI_PUSH(%rbp); movq %rsp, %rbp; CFI_DEF_CFA_REGISTER(%rbp); cmpl $128, key_bitlength(CTX); movl $32, %r8d; movl $24, %eax; cmovel %eax, %r8d; /* max */ subq $(16 * 32), %rsp; andq $~63, %rsp; movq %rsp, %rax; /* inpack32_pre: */ vpbroadcastq (key_table)(CTX), %ymm0; vpshufb .Lpack_bswap rRIP, %ymm0, %ymm0; vmovdqu (%rcx), %xmm15; vinserti128 $1, (%rdx), %ymm15, %ymm15; vpxor %ymm15, %ymm0, %ymm15; vmovdqu (15 * 32 + 16)(%rdx), %xmm1; vmovdqu %xmm1, (%rcx); /* store new IV */ vpxor (0 * 32 + 16)(%rdx), %ymm0, %ymm14; vpxor (1 * 32 + 16)(%rdx), %ymm0, %ymm13; vpxor (2 * 32 + 16)(%rdx), %ymm0, %ymm12; vpxor (3 * 32 + 16)(%rdx), %ymm0, %ymm11; vpxor (4 * 32 + 16)(%rdx), %ymm0, %ymm10; vpxor (5 * 32 + 16)(%rdx), %ymm0, %ymm9; vpxor (6 * 32 + 16)(%rdx), %ymm0, %ymm8; vpxor (7 * 32 + 16)(%rdx), %ymm0, %ymm7; vpxor (8 * 32 + 16)(%rdx), %ymm0, %ymm6; vpxor (9 * 32 + 16)(%rdx), %ymm0, %ymm5; vpxor (10 * 32 + 16)(%rdx), %ymm0, %ymm4; vpxor (11 * 32 + 16)(%rdx), %ymm0, %ymm3; vpxor (12 * 32 + 16)(%rdx), %ymm0, %ymm2; vpxor (13 * 32 + 16)(%rdx), %ymm0, %ymm1; vpxor (14 * 32 + 16)(%rdx), %ymm0, %ymm0; call FUNC_NAME(enc_blk32); vpxor 0 * 32(%rdx), %ymm7, %ymm7; vpxor 1 * 32(%rdx), %ymm6, %ymm6; vpxor 2 * 32(%rdx), %ymm5, %ymm5; vpxor 3 * 32(%rdx), %ymm4, %ymm4; vpxor 4 * 32(%rdx), %ymm3, %ymm3; vpxor 5 * 32(%rdx), %ymm2, %ymm2; vpxor 6 * 32(%rdx), %ymm1, %ymm1; vpxor 7 * 32(%rdx), %ymm0, %ymm0; vpxor 8 * 32(%rdx), %ymm15, %ymm15; vpxor 9 * 32(%rdx), %ymm14, %ymm14; vpxor 10 * 32(%rdx), %ymm13, %ymm13; vpxor 11 * 32(%rdx), %ymm12, %ymm12; vpxor 12 * 32(%rdx), %ymm11, %ymm11; vpxor 13 * 32(%rdx), %ymm10, %ymm10; vpxor 14 * 32(%rdx), %ymm9, %ymm9; vpxor 15 * 32(%rdx), %ymm8, %ymm8; write_output(%ymm7, %ymm6, %ymm5, %ymm4, %ymm3, %ymm2, %ymm1, %ymm0, %ymm15, %ymm14, %ymm13, %ymm12, %ymm11, %ymm10, %ymm9, %ymm8, %rsi); vzeroall; leave; CFI_LEAVE(); ret_spec_stop; CFI_ENDPROC(); ELF(.size FUNC_NAME(cfb_dec),.-FUNC_NAME(cfb_dec);) .align 16 .globl FUNC_NAME(ocb_enc) ELF(.type FUNC_NAME(ocb_enc),@function;) FUNC_NAME(ocb_enc): /* input: * %rdi: ctx, CTX * %rsi: dst (32 blocks) * %rdx: src (32 blocks) * %rcx: offset * %r8 : checksum * %r9 : L pointers (void *L[32]) */ CFI_STARTPROC(); pushq %rbp; CFI_PUSH(%rbp); movq %rsp, %rbp; CFI_DEF_CFA_REGISTER(%rbp); subq $(16 * 32 + 4 * 8), %rsp; andq $~63, %rsp; movq %rsp, %rax; movq %r10, (16 * 32 + 0 * 8)(%rsp); movq %r11, (16 * 32 + 1 * 8)(%rsp); movq %r12, (16 * 32 + 2 * 8)(%rsp); movq %r13, (16 * 32 + 3 * 8)(%rsp); CFI_REG_ON_STACK(r10, 16 * 32 + 0 * 8); CFI_REG_ON_STACK(r11, 16 * 32 + 1 * 8); CFI_REG_ON_STACK(r12, 16 * 32 + 2 * 8); CFI_REG_ON_STACK(r13, 16 * 32 + 3 * 8); vmovdqu (%rcx), %xmm14; vmovdqu (%r8), %xmm13; /* Offset_i = Offset_{i-1} xor L_{ntz(i)} */ /* Checksum_i = Checksum_{i-1} xor P_i */ /* C_i = Offset_i xor ENCIPHER(K, P_i xor Offset_i) */ #define OCB_INPUT(n, l0reg, l1reg, yreg) \ vmovdqu (n * 32)(%rdx), yreg; \ vpxor (l0reg), %xmm14, %xmm15; \ vpxor (l1reg), %xmm15, %xmm14; \ vinserti128 $1, %xmm14, %ymm15, %ymm15; \ vpxor yreg, %ymm13, %ymm13; \ vpxor yreg, %ymm15, yreg; \ vmovdqu %ymm15, (n * 32)(%rsi); movq (0 * 8)(%r9), %r10; movq (1 * 8)(%r9), %r11; movq (2 * 8)(%r9), %r12; movq (3 * 8)(%r9), %r13; OCB_INPUT(0, %r10, %r11, %ymm0); vmovdqu %ymm0, (15 * 32)(%rax); OCB_INPUT(1, %r12, %r13, %ymm0); vmovdqu %ymm0, (14 * 32)(%rax); movq (4 * 8)(%r9), %r10; movq (5 * 8)(%r9), %r11; movq (6 * 8)(%r9), %r12; movq (7 * 8)(%r9), %r13; OCB_INPUT(2, %r10, %r11, %ymm0); vmovdqu %ymm0, (13 * 32)(%rax); OCB_INPUT(3, %r12, %r13, %ymm12); movq (8 * 8)(%r9), %r10; movq (9 * 8)(%r9), %r11; movq (10 * 8)(%r9), %r12; movq (11 * 8)(%r9), %r13; OCB_INPUT(4, %r10, %r11, %ymm11); OCB_INPUT(5, %r12, %r13, %ymm10); movq (12 * 8)(%r9), %r10; movq (13 * 8)(%r9), %r11; movq (14 * 8)(%r9), %r12; movq (15 * 8)(%r9), %r13; OCB_INPUT(6, %r10, %r11, %ymm9); OCB_INPUT(7, %r12, %r13, %ymm8); movq (16 * 8)(%r9), %r10; movq (17 * 8)(%r9), %r11; movq (18 * 8)(%r9), %r12; movq (19 * 8)(%r9), %r13; OCB_INPUT(8, %r10, %r11, %ymm7); OCB_INPUT(9, %r12, %r13, %ymm6); movq (20 * 8)(%r9), %r10; movq (21 * 8)(%r9), %r11; movq (22 * 8)(%r9), %r12; movq (23 * 8)(%r9), %r13; OCB_INPUT(10, %r10, %r11, %ymm5); OCB_INPUT(11, %r12, %r13, %ymm4); movq (24 * 8)(%r9), %r10; movq (25 * 8)(%r9), %r11; movq (26 * 8)(%r9), %r12; movq (27 * 8)(%r9), %r13; OCB_INPUT(12, %r10, %r11, %ymm3); OCB_INPUT(13, %r12, %r13, %ymm2); movq (28 * 8)(%r9), %r10; movq (29 * 8)(%r9), %r11; movq (30 * 8)(%r9), %r12; movq (31 * 8)(%r9), %r13; OCB_INPUT(14, %r10, %r11, %ymm1); OCB_INPUT(15, %r12, %r13, %ymm0); #undef OCB_INPUT vextracti128 $1, %ymm13, %xmm15; vmovdqu %xmm14, (%rcx); vpxor %xmm13, %xmm15, %xmm15; vmovdqu %xmm15, (%r8); cmpl $128, key_bitlength(CTX); movl $32, %r8d; movl $24, %r10d; cmovel %r10d, %r8d; /* max */ /* inpack32_pre: */ vpbroadcastq (key_table)(CTX), %ymm15; vpshufb .Lpack_bswap rRIP, %ymm15, %ymm15; vpxor %ymm0, %ymm15, %ymm0; vpxor %ymm1, %ymm15, %ymm1; vpxor %ymm2, %ymm15, %ymm2; vpxor %ymm3, %ymm15, %ymm3; vpxor %ymm4, %ymm15, %ymm4; vpxor %ymm5, %ymm15, %ymm5; vpxor %ymm6, %ymm15, %ymm6; vpxor %ymm7, %ymm15, %ymm7; vpxor %ymm8, %ymm15, %ymm8; vpxor %ymm9, %ymm15, %ymm9; vpxor %ymm10, %ymm15, %ymm10; vpxor %ymm11, %ymm15, %ymm11; vpxor %ymm12, %ymm15, %ymm12; vpxor 13 * 32(%rax), %ymm15, %ymm13; vpxor 14 * 32(%rax), %ymm15, %ymm14; vpxor 15 * 32(%rax), %ymm15, %ymm15; call FUNC_NAME(enc_blk32); vpxor 0 * 32(%rsi), %ymm7, %ymm7; vpxor 1 * 32(%rsi), %ymm6, %ymm6; vpxor 2 * 32(%rsi), %ymm5, %ymm5; vpxor 3 * 32(%rsi), %ymm4, %ymm4; vpxor 4 * 32(%rsi), %ymm3, %ymm3; vpxor 5 * 32(%rsi), %ymm2, %ymm2; vpxor 6 * 32(%rsi), %ymm1, %ymm1; vpxor 7 * 32(%rsi), %ymm0, %ymm0; vpxor 8 * 32(%rsi), %ymm15, %ymm15; vpxor 9 * 32(%rsi), %ymm14, %ymm14; vpxor 10 * 32(%rsi), %ymm13, %ymm13; vpxor 11 * 32(%rsi), %ymm12, %ymm12; vpxor 12 * 32(%rsi), %ymm11, %ymm11; vpxor 13 * 32(%rsi), %ymm10, %ymm10; vpxor 14 * 32(%rsi), %ymm9, %ymm9; vpxor 15 * 32(%rsi), %ymm8, %ymm8; write_output(%ymm7, %ymm6, %ymm5, %ymm4, %ymm3, %ymm2, %ymm1, %ymm0, %ymm15, %ymm14, %ymm13, %ymm12, %ymm11, %ymm10, %ymm9, %ymm8, %rsi); vzeroall; movq (16 * 32 + 0 * 8)(%rsp), %r10; movq (16 * 32 + 1 * 8)(%rsp), %r11; movq (16 * 32 + 2 * 8)(%rsp), %r12; movq (16 * 32 + 3 * 8)(%rsp), %r13; CFI_RESTORE(%r10); CFI_RESTORE(%r11); CFI_RESTORE(%r12); CFI_RESTORE(%r13); leave; CFI_LEAVE(); ret_spec_stop; CFI_ENDPROC(); ELF(.size FUNC_NAME(ocb_enc),.-FUNC_NAME(ocb_enc);) .align 16 .globl FUNC_NAME(ocb_dec) ELF(.type FUNC_NAME(ocb_dec),@function;) FUNC_NAME(ocb_dec): /* input: * %rdi: ctx, CTX * %rsi: dst (32 blocks) * %rdx: src (32 blocks) * %rcx: offset * %r8 : checksum * %r9 : L pointers (void *L[32]) */ CFI_STARTPROC(); pushq %rbp; CFI_PUSH(%rbp); movq %rsp, %rbp; CFI_DEF_CFA_REGISTER(%rbp); subq $(16 * 32 + 4 * 8), %rsp; andq $~63, %rsp; movq %rsp, %rax; movq %r10, (16 * 32 + 0 * 8)(%rsp); movq %r11, (16 * 32 + 1 * 8)(%rsp); movq %r12, (16 * 32 + 2 * 8)(%rsp); movq %r13, (16 * 32 + 3 * 8)(%rsp); CFI_REG_ON_STACK(r10, 16 * 32 + 0 * 8); CFI_REG_ON_STACK(r11, 16 * 32 + 1 * 8); CFI_REG_ON_STACK(r12, 16 * 32 + 2 * 8); CFI_REG_ON_STACK(r13, 16 * 32 + 3 * 8); vmovdqu (%rcx), %xmm14; /* Offset_i = Offset_{i-1} xor L_{ntz(i)} */ /* P_i = Offset_i xor DECIPHER(K, C_i xor Offset_i) */ #define OCB_INPUT(n, l0reg, l1reg, yreg) \ vmovdqu (n * 32)(%rdx), yreg; \ vpxor (l0reg), %xmm14, %xmm15; \ vpxor (l1reg), %xmm15, %xmm14; \ vinserti128 $1, %xmm14, %ymm15, %ymm15; \ vpxor yreg, %ymm15, yreg; \ vmovdqu %ymm15, (n * 32)(%rsi); movq (0 * 8)(%r9), %r10; movq (1 * 8)(%r9), %r11; movq (2 * 8)(%r9), %r12; movq (3 * 8)(%r9), %r13; OCB_INPUT(0, %r10, %r11, %ymm0); vmovdqu %ymm0, (15 * 32)(%rax); OCB_INPUT(1, %r12, %r13, %ymm0); vmovdqu %ymm0, (14 * 32)(%rax); movq (4 * 8)(%r9), %r10; movq (5 * 8)(%r9), %r11; movq (6 * 8)(%r9), %r12; movq (7 * 8)(%r9), %r13; OCB_INPUT(2, %r10, %r11, %ymm13); OCB_INPUT(3, %r12, %r13, %ymm12); movq (8 * 8)(%r9), %r10; movq (9 * 8)(%r9), %r11; movq (10 * 8)(%r9), %r12; movq (11 * 8)(%r9), %r13; OCB_INPUT(4, %r10, %r11, %ymm11); OCB_INPUT(5, %r12, %r13, %ymm10); movq (12 * 8)(%r9), %r10; movq (13 * 8)(%r9), %r11; movq (14 * 8)(%r9), %r12; movq (15 * 8)(%r9), %r13; OCB_INPUT(6, %r10, %r11, %ymm9); OCB_INPUT(7, %r12, %r13, %ymm8); movq (16 * 8)(%r9), %r10; movq (17 * 8)(%r9), %r11; movq (18 * 8)(%r9), %r12; movq (19 * 8)(%r9), %r13; OCB_INPUT(8, %r10, %r11, %ymm7); OCB_INPUT(9, %r12, %r13, %ymm6); movq (20 * 8)(%r9), %r10; movq (21 * 8)(%r9), %r11; movq (22 * 8)(%r9), %r12; movq (23 * 8)(%r9), %r13; OCB_INPUT(10, %r10, %r11, %ymm5); OCB_INPUT(11, %r12, %r13, %ymm4); movq (24 * 8)(%r9), %r10; movq (25 * 8)(%r9), %r11; movq (26 * 8)(%r9), %r12; movq (27 * 8)(%r9), %r13; OCB_INPUT(12, %r10, %r11, %ymm3); OCB_INPUT(13, %r12, %r13, %ymm2); movq (28 * 8)(%r9), %r10; movq (29 * 8)(%r9), %r11; movq (30 * 8)(%r9), %r12; movq (31 * 8)(%r9), %r13; OCB_INPUT(14, %r10, %r11, %ymm1); OCB_INPUT(15, %r12, %r13, %ymm0); #undef OCB_INPUT vmovdqu %xmm14, (%rcx); movq %r8, %r10; cmpl $128, key_bitlength(CTX); movl $32, %r8d; movl $24, %r9d; cmovel %r9d, %r8d; /* max */ /* inpack32_pre: */ vpbroadcastq (key_table)(CTX, %r8, 8), %ymm15; vpshufb .Lpack_bswap rRIP, %ymm15, %ymm15; vpxor %ymm0, %ymm15, %ymm0; vpxor %ymm1, %ymm15, %ymm1; vpxor %ymm2, %ymm15, %ymm2; vpxor %ymm3, %ymm15, %ymm3; vpxor %ymm4, %ymm15, %ymm4; vpxor %ymm5, %ymm15, %ymm5; vpxor %ymm6, %ymm15, %ymm6; vpxor %ymm7, %ymm15, %ymm7; vpxor %ymm8, %ymm15, %ymm8; vpxor %ymm9, %ymm15, %ymm9; vpxor %ymm10, %ymm15, %ymm10; vpxor %ymm11, %ymm15, %ymm11; vpxor %ymm12, %ymm15, %ymm12; vpxor %ymm13, %ymm15, %ymm13; vpxor 14 * 32(%rax), %ymm15, %ymm14; vpxor 15 * 32(%rax), %ymm15, %ymm15; call FUNC_NAME(dec_blk32); vpxor 0 * 32(%rsi), %ymm7, %ymm7; vpxor 1 * 32(%rsi), %ymm6, %ymm6; vpxor 2 * 32(%rsi), %ymm5, %ymm5; vpxor 3 * 32(%rsi), %ymm4, %ymm4; vpxor 4 * 32(%rsi), %ymm3, %ymm3; vpxor 5 * 32(%rsi), %ymm2, %ymm2; vpxor 6 * 32(%rsi), %ymm1, %ymm1; vpxor 7 * 32(%rsi), %ymm0, %ymm0; vmovdqu %ymm7, (7 * 32)(%rax); vmovdqu %ymm6, (6 * 32)(%rax); vpxor 8 * 32(%rsi), %ymm15, %ymm15; vpxor 9 * 32(%rsi), %ymm14, %ymm14; vpxor 10 * 32(%rsi), %ymm13, %ymm13; vpxor 11 * 32(%rsi), %ymm12, %ymm12; vpxor 12 * 32(%rsi), %ymm11, %ymm11; vpxor 13 * 32(%rsi), %ymm10, %ymm10; vpxor 14 * 32(%rsi), %ymm9, %ymm9; vpxor 15 * 32(%rsi), %ymm8, %ymm8; /* Checksum_i = Checksum_{i-1} xor P_i */ vpxor %ymm5, %ymm7, %ymm7; vpxor %ymm4, %ymm6, %ymm6; vpxor %ymm3, %ymm7, %ymm7; vpxor %ymm2, %ymm6, %ymm6; vpxor %ymm1, %ymm7, %ymm7; vpxor %ymm0, %ymm6, %ymm6; vpxor %ymm15, %ymm7, %ymm7; vpxor %ymm14, %ymm6, %ymm6; vpxor %ymm13, %ymm7, %ymm7; vpxor %ymm12, %ymm6, %ymm6; vpxor %ymm11, %ymm7, %ymm7; vpxor %ymm10, %ymm6, %ymm6; vpxor %ymm9, %ymm7, %ymm7; vpxor %ymm8, %ymm6, %ymm6; vpxor %ymm7, %ymm6, %ymm7; vextracti128 $1, %ymm7, %xmm6; vpxor %xmm6, %xmm7, %xmm7; vpxor (%r10), %xmm7, %xmm7; vmovdqu %xmm7, (%r10); vmovdqu 7 * 32(%rax), %ymm7; vmovdqu 6 * 32(%rax), %ymm6; write_output(%ymm7, %ymm6, %ymm5, %ymm4, %ymm3, %ymm2, %ymm1, %ymm0, %ymm15, %ymm14, %ymm13, %ymm12, %ymm11, %ymm10, %ymm9, %ymm8, %rsi); vzeroall; movq (16 * 32 + 0 * 8)(%rsp), %r10; movq (16 * 32 + 1 * 8)(%rsp), %r11; movq (16 * 32 + 2 * 8)(%rsp), %r12; movq (16 * 32 + 3 * 8)(%rsp), %r13; CFI_RESTORE(%r10); CFI_RESTORE(%r11); CFI_RESTORE(%r12); CFI_RESTORE(%r13); leave; CFI_LEAVE(); ret_spec_stop; CFI_ENDPROC(); ELF(.size FUNC_NAME(ocb_dec),.-FUNC_NAME(ocb_dec);) .align 16 .globl FUNC_NAME(ocb_auth) ELF(.type FUNC_NAME(ocb_auth),@function;) FUNC_NAME(ocb_auth): /* input: * %rdi: ctx, CTX * %rsi: abuf (16 blocks) * %rdx: offset * %rcx: checksum * %r8 : L pointers (void *L[16]) */ CFI_STARTPROC(); pushq %rbp; CFI_PUSH(%rbp); movq %rsp, %rbp; CFI_DEF_CFA_REGISTER(%rbp); subq $(16 * 32 + 4 * 8), %rsp; andq $~63, %rsp; movq %rsp, %rax; movq %r10, (16 * 32 + 0 * 8)(%rsp); movq %r11, (16 * 32 + 1 * 8)(%rsp); movq %r12, (16 * 32 + 2 * 8)(%rsp); movq %r13, (16 * 32 + 3 * 8)(%rsp); CFI_REG_ON_STACK(r10, 16 * 32 + 0 * 8); CFI_REG_ON_STACK(r11, 16 * 32 + 1 * 8); CFI_REG_ON_STACK(r12, 16 * 32 + 2 * 8); CFI_REG_ON_STACK(r13, 16 * 32 + 3 * 8); vmovdqu (%rdx), %xmm14; /* Offset_i = Offset_{i-1} xor L_{ntz(i)} */ /* Checksum_i = Checksum_{i-1} xor P_i */ /* C_i = Offset_i xor ENCIPHER(K, P_i xor Offset_i) */ #define OCB_INPUT(n, l0reg, l1reg, yreg) \ vmovdqu (n * 32)(%rsi), yreg; \ vpxor (l0reg), %xmm14, %xmm15; \ vpxor (l1reg), %xmm15, %xmm14; \ vinserti128 $1, %xmm14, %ymm15, %ymm15; \ vpxor yreg, %ymm15, yreg; movq (0 * 8)(%r8), %r10; movq (1 * 8)(%r8), %r11; movq (2 * 8)(%r8), %r12; movq (3 * 8)(%r8), %r13; OCB_INPUT(0, %r10, %r11, %ymm0); vmovdqu %ymm0, (15 * 32)(%rax); OCB_INPUT(1, %r12, %r13, %ymm0); vmovdqu %ymm0, (14 * 32)(%rax); movq (4 * 8)(%r8), %r10; movq (5 * 8)(%r8), %r11; movq (6 * 8)(%r8), %r12; movq (7 * 8)(%r8), %r13; OCB_INPUT(2, %r10, %r11, %ymm13); OCB_INPUT(3, %r12, %r13, %ymm12); movq (8 * 8)(%r8), %r10; movq (9 * 8)(%r8), %r11; movq (10 * 8)(%r8), %r12; movq (11 * 8)(%r8), %r13; OCB_INPUT(4, %r10, %r11, %ymm11); OCB_INPUT(5, %r12, %r13, %ymm10); movq (12 * 8)(%r8), %r10; movq (13 * 8)(%r8), %r11; movq (14 * 8)(%r8), %r12; movq (15 * 8)(%r8), %r13; OCB_INPUT(6, %r10, %r11, %ymm9); OCB_INPUT(7, %r12, %r13, %ymm8); movq (16 * 8)(%r8), %r10; movq (17 * 8)(%r8), %r11; movq (18 * 8)(%r8), %r12; movq (19 * 8)(%r8), %r13; OCB_INPUT(8, %r10, %r11, %ymm7); OCB_INPUT(9, %r12, %r13, %ymm6); movq (20 * 8)(%r8), %r10; movq (21 * 8)(%r8), %r11; movq (22 * 8)(%r8), %r12; movq (23 * 8)(%r8), %r13; OCB_INPUT(10, %r10, %r11, %ymm5); OCB_INPUT(11, %r12, %r13, %ymm4); movq (24 * 8)(%r8), %r10; movq (25 * 8)(%r8), %r11; movq (26 * 8)(%r8), %r12; movq (27 * 8)(%r8), %r13; OCB_INPUT(12, %r10, %r11, %ymm3); OCB_INPUT(13, %r12, %r13, %ymm2); movq (28 * 8)(%r8), %r10; movq (29 * 8)(%r8), %r11; movq (30 * 8)(%r8), %r12; movq (31 * 8)(%r8), %r13; OCB_INPUT(14, %r10, %r11, %ymm1); OCB_INPUT(15, %r12, %r13, %ymm0); #undef OCB_INPUT vmovdqu %xmm14, (%rdx); cmpl $128, key_bitlength(CTX); movl $32, %r8d; movl $24, %r10d; cmovel %r10d, %r8d; /* max */ movq %rcx, %r10; /* inpack32_pre: */ vpbroadcastq (key_table)(CTX), %ymm15; vpshufb .Lpack_bswap rRIP, %ymm15, %ymm15; vpxor %ymm0, %ymm15, %ymm0; vpxor %ymm1, %ymm15, %ymm1; vpxor %ymm2, %ymm15, %ymm2; vpxor %ymm3, %ymm15, %ymm3; vpxor %ymm4, %ymm15, %ymm4; vpxor %ymm5, %ymm15, %ymm5; vpxor %ymm6, %ymm15, %ymm6; vpxor %ymm7, %ymm15, %ymm7; vpxor %ymm8, %ymm15, %ymm8; vpxor %ymm9, %ymm15, %ymm9; vpxor %ymm10, %ymm15, %ymm10; vpxor %ymm11, %ymm15, %ymm11; vpxor %ymm12, %ymm15, %ymm12; vpxor %ymm13, %ymm15, %ymm13; vpxor 14 * 32(%rax), %ymm15, %ymm14; vpxor 15 * 32(%rax), %ymm15, %ymm15; call FUNC_NAME(enc_blk32); vpxor %ymm7, %ymm6, %ymm6; vpxor %ymm5, %ymm4, %ymm4; vpxor %ymm3, %ymm2, %ymm2; vpxor %ymm1, %ymm0, %ymm0; vpxor %ymm15, %ymm14, %ymm14; vpxor %ymm13, %ymm12, %ymm12; vpxor %ymm11, %ymm10, %ymm10; vpxor %ymm9, %ymm8, %ymm8; vpxor %ymm6, %ymm4, %ymm4; vpxor %ymm2, %ymm0, %ymm0; vpxor %ymm14, %ymm12, %ymm12; vpxor %ymm10, %ymm8, %ymm8; vpxor %ymm4, %ymm0, %ymm0; vpxor %ymm12, %ymm8, %ymm8; vpxor %ymm0, %ymm8, %ymm0; vextracti128 $1, %ymm0, %xmm1; vpxor (%r10), %xmm0, %xmm0; vpxor %xmm0, %xmm1, %xmm0; vmovdqu %xmm0, (%r10); vzeroall; movq (16 * 32 + 0 * 8)(%rsp), %r10; movq (16 * 32 + 1 * 8)(%rsp), %r11; movq (16 * 32 + 2 * 8)(%rsp), %r12; movq (16 * 32 + 3 * 8)(%rsp), %r13; CFI_RESTORE(%r10); CFI_RESTORE(%r11); CFI_RESTORE(%r12); CFI_RESTORE(%r13); leave; CFI_LEAVE(); ret_spec_stop; CFI_ENDPROC(); ELF(.size FUNC_NAME(ocb_auth),.-FUNC_NAME(ocb_auth);) .align 16 .globl FUNC_NAME(enc_blk1_32) ELF(.type FUNC_NAME(enc_blk1_32),@function;) FUNC_NAME(enc_blk1_32): /* input: * %rdi: ctx, CTX * %rsi: dst (32 blocks) * %rdx: src (32 blocks) * %ecx: nblocks (1 to 32) */ CFI_STARTPROC(); pushq %rbp; CFI_PUSH(%rbp); movq %rsp, %rbp; CFI_DEF_CFA_REGISTER(%rbp); movl %ecx, %r9d; cmpl $128, key_bitlength(CTX); movl $32, %r8d; movl $24, %eax; cmovel %eax, %r8d; /* max */ subq $(16 * 32), %rsp; andq $~63, %rsp; movq %rsp, %rax; cmpl $31, %ecx; vpxor %xmm0, %xmm0, %xmm0; ja .Lenc_blk32; jb 2f; vmovdqu 15 * 32(%rdx), %xmm0; 2: vmovdqu %ymm0, (%rax); vpbroadcastq (key_table)(CTX), %ymm0; vpshufb .Lpack_bswap rRIP, %ymm0, %ymm0; #define LOAD_INPUT(offset, ymm) \ cmpl $(1 + 2 * (offset)), %ecx; \ jb 2f; \ ja 1f; \ vmovdqu (offset) * 32(%rdx), %ymm##_x; \ vpxor %ymm0, %ymm, %ymm; \ jmp 2f; \ 1: \ vpxor (offset) * 32(%rdx), %ymm0, %ymm; LOAD_INPUT(0, ymm15); LOAD_INPUT(1, ymm14); LOAD_INPUT(2, ymm13); LOAD_INPUT(3, ymm12); LOAD_INPUT(4, ymm11); LOAD_INPUT(5, ymm10); LOAD_INPUT(6, ymm9); LOAD_INPUT(7, ymm8); LOAD_INPUT(8, ymm7); LOAD_INPUT(9, ymm6); LOAD_INPUT(10, ymm5); LOAD_INPUT(11, ymm4); LOAD_INPUT(12, ymm3); LOAD_INPUT(13, ymm2); LOAD_INPUT(14, ymm1); vpxor (%rax), %ymm0, %ymm0; 2: call FUNC_NAME(enc_blk32); #define STORE_OUTPUT(ymm, offset) \ cmpl $(1 + 2 * (offset)), %r9d; \ jb 2f; \ ja 1f; \ vmovdqu %ymm##_x, (offset) * 32(%rsi); \ jmp 2f; \ 1: \ vmovdqu %ymm, (offset) * 32(%rsi); STORE_OUTPUT(ymm7, 0); STORE_OUTPUT(ymm6, 1); STORE_OUTPUT(ymm5, 2); STORE_OUTPUT(ymm4, 3); STORE_OUTPUT(ymm3, 4); STORE_OUTPUT(ymm2, 5); STORE_OUTPUT(ymm1, 6); STORE_OUTPUT(ymm0, 7); STORE_OUTPUT(ymm15, 8); STORE_OUTPUT(ymm14, 9); STORE_OUTPUT(ymm13, 10); STORE_OUTPUT(ymm12, 11); STORE_OUTPUT(ymm11, 12); STORE_OUTPUT(ymm10, 13); STORE_OUTPUT(ymm9, 14); STORE_OUTPUT(ymm8, 15); jmp .Lenc_blk32_done; .align 8 .Lenc_blk32: inpack32_pre(%ymm0, %ymm1, %ymm2, %ymm3, %ymm4, %ymm5, %ymm6, %ymm7, %ymm8, %ymm9, %ymm10, %ymm11, %ymm12, %ymm13, %ymm14, %ymm15, %rdx, (key_table)(CTX)); call FUNC_NAME(enc_blk32); write_output(%ymm7, %ymm6, %ymm5, %ymm4, %ymm3, %ymm2, %ymm1, %ymm0, %ymm15, %ymm14, %ymm13, %ymm12, %ymm11, %ymm10, %ymm9, %ymm8, %rsi); .align 8 2: .Lenc_blk32_done: vzeroall; leave; CFI_LEAVE(); ret_spec_stop; CFI_ENDPROC(); ELF(.size FUNC_NAME(enc_blk1_32),.-FUNC_NAME(enc_blk1_32);) .align 16 .globl FUNC_NAME(dec_blk1_32) ELF(.type FUNC_NAME(dec_blk1_32),@function;) FUNC_NAME(dec_blk1_32): /* input: * %rdi: ctx, CTX * %rsi: dst (32 blocks) * %rdx: src (32 blocks) * %ecx: nblocks (1 to 32) */ CFI_STARTPROC(); pushq %rbp; CFI_PUSH(%rbp); movq %rsp, %rbp; CFI_DEF_CFA_REGISTER(%rbp); movl %ecx, %r9d; cmpl $128, key_bitlength(CTX); movl $32, %r8d; movl $24, %eax; cmovel %eax, %r8d; /* max */ subq $(16 * 32), %rsp; andq $~63, %rsp; movq %rsp, %rax; cmpl $31, %ecx; vpxor %xmm0, %xmm0, %xmm0; ja .Ldec_blk32; jb 2f; vmovdqu 15 * 32(%rdx), %xmm0; 2: vmovdqu %ymm0, (%rax); vpbroadcastq (key_table)(CTX, %r8, 8), %ymm0; vpshufb .Lpack_bswap rRIP, %ymm0, %ymm0; LOAD_INPUT(0, ymm15); LOAD_INPUT(1, ymm14); LOAD_INPUT(2, ymm13); LOAD_INPUT(3, ymm12); LOAD_INPUT(4, ymm11); LOAD_INPUT(5, ymm10); LOAD_INPUT(6, ymm9); LOAD_INPUT(7, ymm8); LOAD_INPUT(8, ymm7); LOAD_INPUT(9, ymm6); LOAD_INPUT(10, ymm5); LOAD_INPUT(11, ymm4); LOAD_INPUT(12, ymm3); LOAD_INPUT(13, ymm2); LOAD_INPUT(14, ymm1); vpxor (%rax), %ymm0, %ymm0; 2: call FUNC_NAME(dec_blk32); STORE_OUTPUT(ymm7, 0); STORE_OUTPUT(ymm6, 1); STORE_OUTPUT(ymm5, 2); STORE_OUTPUT(ymm4, 3); STORE_OUTPUT(ymm3, 4); STORE_OUTPUT(ymm2, 5); STORE_OUTPUT(ymm1, 6); STORE_OUTPUT(ymm0, 7); STORE_OUTPUT(ymm15, 8); STORE_OUTPUT(ymm14, 9); STORE_OUTPUT(ymm13, 10); STORE_OUTPUT(ymm12, 11); STORE_OUTPUT(ymm11, 12); STORE_OUTPUT(ymm10, 13); STORE_OUTPUT(ymm9, 14); STORE_OUTPUT(ymm8, 15); .align 8 2: .Ldec_blk32_done: vzeroall; leave; CFI_LEAVE(); ret_spec_stop; .align 8 .Ldec_blk32: inpack32_pre(%ymm0, %ymm1, %ymm2, %ymm3, %ymm4, %ymm5, %ymm6, %ymm7, %ymm8, %ymm9, %ymm10, %ymm11, %ymm12, %ymm13, %ymm14, %ymm15, %rdx, (key_table)(CTX, %r8, 8)); call FUNC_NAME(dec_blk32); write_output(%ymm7, %ymm6, %ymm5, %ymm4, %ymm3, %ymm2, %ymm1, %ymm0, %ymm15, %ymm14, %ymm13, %ymm12, %ymm11, %ymm10, %ymm9, %ymm8, %rsi); jmp .Ldec_blk32_done; CFI_ENDPROC(); ELF(.size FUNC_NAME(dec_blk1_32),.-FUNC_NAME(dec_blk1_32);) #endif /* GCRY_CAMELLIA_AESNI_AVX2_AMD64_H */ grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/cipher/rmd160.c0000644000175000017500000004226315036452441022027 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ #include GRUB_MOD_LICENSE ("GPLv3+"); /* rmd160.c - RIPE-MD160 * Copyright (C) 1998, 2001, 2002, 2003 Free Software Foundation, Inc. * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . * SPDX-License-Identifier: LGPL-2.1-or-later */ #include "g10lib.h" #include "hash-common.h" #include "cipher.h" /* Only used for the rmd160_hash_buffer() prototype. */ #include "bithelp.h" #include "bufhelp.h" /********************************* * RIPEMD-160 is not patented, see (as of 25.10.97) * http://www.esat.kuleuven.ac.be/~bosselae/ripemd160.html * Note that the code uses Little Endian byteorder, which is good for * 386 etc, but we must add some conversion when used on a big endian box. * * * Pseudo-code for RIPEMD-160 * * RIPEMD-160 is an iterative hash function that operates on 32-bit words. * The round function takes as input a 5-word chaining variable and a 16-word * message block and maps this to a new chaining variable. All operations are * defined on 32-bit words. Padding is identical to that of MD4. * * * RIPEMD-160: definitions * * * nonlinear functions at bit level: exor, mux, -, mux, - * * f(j, x, y, z) = x XOR y XOR z (0 <= j <= 15) * f(j, x, y, z) = (x AND y) OR (NOT(x) AND z) (16 <= j <= 31) * f(j, x, y, z) = (x OR NOT(y)) XOR z (32 <= j <= 47) * f(j, x, y, z) = (x AND z) OR (y AND NOT(z)) (48 <= j <= 63) * f(j, x, y, z) = x XOR (y OR NOT(z)) (64 <= j <= 79) * * * added constants (hexadecimal) * * K(j) = 0x00000000 (0 <= j <= 15) * K(j) = 0x5A827999 (16 <= j <= 31) int(2**30 x sqrt(2)) * K(j) = 0x6ED9EBA1 (32 <= j <= 47) int(2**30 x sqrt(3)) * K(j) = 0x8F1BBCDC (48 <= j <= 63) int(2**30 x sqrt(5)) * K(j) = 0xA953FD4E (64 <= j <= 79) int(2**30 x sqrt(7)) * K'(j) = 0x50A28BE6 (0 <= j <= 15) int(2**30 x cbrt(2)) * K'(j) = 0x5C4DD124 (16 <= j <= 31) int(2**30 x cbrt(3)) * K'(j) = 0x6D703EF3 (32 <= j <= 47) int(2**30 x cbrt(5)) * K'(j) = 0x7A6D76E9 (48 <= j <= 63) int(2**30 x cbrt(7)) * K'(j) = 0x00000000 (64 <= j <= 79) * * * selection of message word * * r(j) = j (0 <= j <= 15) * r(16..31) = 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8 * r(32..47) = 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12 * r(48..63) = 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2 * r(64..79) = 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13 * r0(0..15) = 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12 * r0(16..31)= 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2 * r0(32..47)= 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13 * r0(48..63)= 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14 * r0(64..79)= 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11 * * * amount for rotate left (rol) * * s(0..15) = 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8 * s(16..31) = 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12 * s(32..47) = 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5 * s(48..63) = 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12 * s(64..79) = 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6 * s'(0..15) = 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6 * s'(16..31)= 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11 * s'(32..47)= 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5 * s'(48..63)= 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8 * s'(64..79)= 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11 * * * initial value (hexadecimal) * * h0 = 0x67452301; h1 = 0xEFCDAB89; h2 = 0x98BADCFE; h3 = 0x10325476; * h4 = 0xC3D2E1F0; * * * RIPEMD-160: pseudo-code * * It is assumed that the message after padding consists of t 16-word blocks * that will be denoted with X[i][j], with 0 <= i <= t-1 and 0 <= j <= 15. * The symbol [+] denotes addition modulo 2**32 and rol_s denotes cyclic left * shift (rotate) over s positions. * * * for i := 0 to t-1 { * A := h0; B := h1; C := h2; D = h3; E = h4; * A' := h0; B' := h1; C' := h2; D' = h3; E' = h4; * for j := 0 to 79 { * T := rol_s(j)(A [+] f(j, B, C, D) [+] X[i][r(j)] [+] K(j)) [+] E; * A := E; E := D; D := rol_10(C); C := B; B := T; * T := rol_s'(j)(A' [+] f(79-j, B', C', D') [+] X[i][r'(j)] [+] K'(j)) [+] E'; * A' := E'; E' := D'; D' := rol_10(C'); C' := B'; B' := T; * } * T := h1 [+] C [+] D'; h1 := h2 [+] D [+] E'; h2 := h3 [+] E [+] A'; * h3 := h4 [+] A [+] B'; h4 := h0 [+] B [+] C'; h0 := T; * } */ /* Some examples: * "" 9c1185a5c5e9fc54612808977ee8f548b2258d31 * "a" 0bdc9d2d256b3ee9daae347be6f4dc835a467ffe * "abc" 8eb208f7e05d987a9b044a8e98c6b087f15a0bfc * "message digest" 5d0689ef49d2fae572b881b123a85ffa21595f36 * "a...z" f71c27109c692c1b56bbdceb5b9d2865b3708dbc * "abcdbcde...nopq" 12a053384a9c0c88e405a06c27dcf49ada62eb2b * "A...Za...z0...9" b0e20b6e3116640286ed3a87a5713079b21f5189 * 8 times "1234567890" 9b752e45573d4b39f4dbd3323cab82bf63326bfb * 1 million times "a" 52783243c1697bdbe16d37f97f68f08325dc1528 */ typedef struct { gcry_md_block_ctx_t bctx; u32 h0,h1,h2,h3,h4; } RMD160_CONTEXT; static unsigned int transform ( void *ctx, const unsigned char *data, size_t nblks ); static void rmd160_init (void *context, unsigned int flags) { RMD160_CONTEXT *hd = context; (void)flags; hd->h0 = 0x67452301; hd->h1 = 0xEFCDAB89; hd->h2 = 0x98BADCFE; hd->h3 = 0x10325476; hd->h4 = 0xC3D2E1F0; hd->bctx.nblocks = 0; hd->bctx.nblocks_high = 0; hd->bctx.count = 0; hd->bctx.blocksize_shift = _gcry_ctz(64); hd->bctx.bwrite = transform; } /**************** * Transform the message X which consists of 16 32-bit-words */ static unsigned int transform_blk ( void *ctx, const unsigned char *data ) { RMD160_CONTEXT *hd = ctx; register u32 al, ar, bl, br, cl, cr, dl, dr, el, er; u32 x[16]; int i; for ( i = 0; i < 16; i++ ) x[i] = buf_get_le32(data + i * 4); #define K0 0x00000000 #define K1 0x5A827999 #define K2 0x6ED9EBA1 #define K3 0x8F1BBCDC #define K4 0xA953FD4E #define KK0 0x50A28BE6 #define KK1 0x5C4DD124 #define KK2 0x6D703EF3 #define KK3 0x7A6D76E9 #define KK4 0x00000000 #define F0(x,y,z) ( (x) ^ (y) ^ (z) ) #define F1(x,y,z) ( ((x) & (y)) | (~(x) & (z)) ) #define F2(x,y,z) ( ((x) | ~(y)) ^ (z) ) #define F3(x,y,z) ( ((x) & (z)) | ((y) & ~(z)) ) #define F4(x,y,z) ( (x) ^ ((y) | ~(z)) ) #define R(a,b,c,d,e,f,k,r,s) do { a += f(b,c,d) + k + x[r]; \ a = rol(a,s) + e; \ c = rol(c,10); \ } while(0) /* left lane and right lanes interleaved */ al = ar = hd->h0; bl = br = hd->h1; cl = cr = hd->h2; dl = dr = hd->h3; el = er = hd->h4; R( al, bl, cl, dl, el, F0, K0, 0, 11 ); R( ar, br, cr, dr, er, F4, KK0, 5, 8); R( el, al, bl, cl, dl, F0, K0, 1, 14 ); R( er, ar, br, cr, dr, F4, KK0, 14, 9); R( dl, el, al, bl, cl, F0, K0, 2, 15 ); R( dr, er, ar, br, cr, F4, KK0, 7, 9); R( cl, dl, el, al, bl, F0, K0, 3, 12 ); R( cr, dr, er, ar, br, F4, KK0, 0, 11); R( bl, cl, dl, el, al, F0, K0, 4, 5 ); R( br, cr, dr, er, ar, F4, KK0, 9, 13); R( al, bl, cl, dl, el, F0, K0, 5, 8 ); R( ar, br, cr, dr, er, F4, KK0, 2, 15); R( el, al, bl, cl, dl, F0, K0, 6, 7 ); R( er, ar, br, cr, dr, F4, KK0, 11, 15); R( dl, el, al, bl, cl, F0, K0, 7, 9 ); R( dr, er, ar, br, cr, F4, KK0, 4, 5); R( cl, dl, el, al, bl, F0, K0, 8, 11 ); R( cr, dr, er, ar, br, F4, KK0, 13, 7); R( bl, cl, dl, el, al, F0, K0, 9, 13 ); R( br, cr, dr, er, ar, F4, KK0, 6, 7); R( al, bl, cl, dl, el, F0, K0, 10, 14 ); R( ar, br, cr, dr, er, F4, KK0, 15, 8); R( el, al, bl, cl, dl, F0, K0, 11, 15 ); R( er, ar, br, cr, dr, F4, KK0, 8, 11); R( dl, el, al, bl, cl, F0, K0, 12, 6 ); R( dr, er, ar, br, cr, F4, KK0, 1, 14); R( cl, dl, el, al, bl, F0, K0, 13, 7 ); R( cr, dr, er, ar, br, F4, KK0, 10, 14); R( bl, cl, dl, el, al, F0, K0, 14, 9 ); R( br, cr, dr, er, ar, F4, KK0, 3, 12); R( al, bl, cl, dl, el, F0, K0, 15, 8 ); R( ar, br, cr, dr, er, F4, KK0, 12, 6); R( el, al, bl, cl, dl, F1, K1, 7, 7 ); R( er, ar, br, cr, dr, F3, KK1, 6, 9); R( dl, el, al, bl, cl, F1, K1, 4, 6 ); R( dr, er, ar, br, cr, F3, KK1, 11, 13); R( cl, dl, el, al, bl, F1, K1, 13, 8 ); R( cr, dr, er, ar, br, F3, KK1, 3, 15); R( bl, cl, dl, el, al, F1, K1, 1, 13 ); R( br, cr, dr, er, ar, F3, KK1, 7, 7); R( al, bl, cl, dl, el, F1, K1, 10, 11 ); R( ar, br, cr, dr, er, F3, KK1, 0, 12); R( el, al, bl, cl, dl, F1, K1, 6, 9 ); R( er, ar, br, cr, dr, F3, KK1, 13, 8); R( dl, el, al, bl, cl, F1, K1, 15, 7 ); R( dr, er, ar, br, cr, F3, KK1, 5, 9); R( cl, dl, el, al, bl, F1, K1, 3, 15 ); R( cr, dr, er, ar, br, F3, KK1, 10, 11); R( bl, cl, dl, el, al, F1, K1, 12, 7 ); R( br, cr, dr, er, ar, F3, KK1, 14, 7); R( al, bl, cl, dl, el, F1, K1, 0, 12 ); R( ar, br, cr, dr, er, F3, KK1, 15, 7); R( el, al, bl, cl, dl, F1, K1, 9, 15 ); R( er, ar, br, cr, dr, F3, KK1, 8, 12); R( dl, el, al, bl, cl, F1, K1, 5, 9 ); R( dr, er, ar, br, cr, F3, KK1, 12, 7); R( cl, dl, el, al, bl, F1, K1, 2, 11 ); R( cr, dr, er, ar, br, F3, KK1, 4, 6); R( bl, cl, dl, el, al, F1, K1, 14, 7 ); R( br, cr, dr, er, ar, F3, KK1, 9, 15); R( al, bl, cl, dl, el, F1, K1, 11, 13 ); R( ar, br, cr, dr, er, F3, KK1, 1, 13); R( el, al, bl, cl, dl, F1, K1, 8, 12 ); R( er, ar, br, cr, dr, F3, KK1, 2, 11); R( dl, el, al, bl, cl, F2, K2, 3, 11 ); R( dr, er, ar, br, cr, F2, KK2, 15, 9); R( cl, dl, el, al, bl, F2, K2, 10, 13 ); R( cr, dr, er, ar, br, F2, KK2, 5, 7); R( bl, cl, dl, el, al, F2, K2, 14, 6 ); R( br, cr, dr, er, ar, F2, KK2, 1, 15); R( al, bl, cl, dl, el, F2, K2, 4, 7 ); R( ar, br, cr, dr, er, F2, KK2, 3, 11); R( el, al, bl, cl, dl, F2, K2, 9, 14 ); R( er, ar, br, cr, dr, F2, KK2, 7, 8); R( dl, el, al, bl, cl, F2, K2, 15, 9 ); R( dr, er, ar, br, cr, F2, KK2, 14, 6); R( cl, dl, el, al, bl, F2, K2, 8, 13 ); R( cr, dr, er, ar, br, F2, KK2, 6, 6); R( bl, cl, dl, el, al, F2, K2, 1, 15 ); R( br, cr, dr, er, ar, F2, KK2, 9, 14); R( al, bl, cl, dl, el, F2, K2, 2, 14 ); R( ar, br, cr, dr, er, F2, KK2, 11, 12); R( el, al, bl, cl, dl, F2, K2, 7, 8 ); R( er, ar, br, cr, dr, F2, KK2, 8, 13); R( dl, el, al, bl, cl, F2, K2, 0, 13 ); R( dr, er, ar, br, cr, F2, KK2, 12, 5); R( cl, dl, el, al, bl, F2, K2, 6, 6 ); R( cr, dr, er, ar, br, F2, KK2, 2, 14); R( bl, cl, dl, el, al, F2, K2, 13, 5 ); R( br, cr, dr, er, ar, F2, KK2, 10, 13); R( al, bl, cl, dl, el, F2, K2, 11, 12 ); R( ar, br, cr, dr, er, F2, KK2, 0, 13); R( el, al, bl, cl, dl, F2, K2, 5, 7 ); R( er, ar, br, cr, dr, F2, KK2, 4, 7); R( dl, el, al, bl, cl, F2, K2, 12, 5 ); R( dr, er, ar, br, cr, F2, KK2, 13, 5); R( cl, dl, el, al, bl, F3, K3, 1, 11 ); R( cr, dr, er, ar, br, F1, KK3, 8, 15); R( bl, cl, dl, el, al, F3, K3, 9, 12 ); R( br, cr, dr, er, ar, F1, KK3, 6, 5); R( al, bl, cl, dl, el, F3, K3, 11, 14 ); R( ar, br, cr, dr, er, F1, KK3, 4, 8); R( el, al, bl, cl, dl, F3, K3, 10, 15 ); R( er, ar, br, cr, dr, F1, KK3, 1, 11); R( dl, el, al, bl, cl, F3, K3, 0, 14 ); R( dr, er, ar, br, cr, F1, KK3, 3, 14); R( cl, dl, el, al, bl, F3, K3, 8, 15 ); R( cr, dr, er, ar, br, F1, KK3, 11, 14); R( bl, cl, dl, el, al, F3, K3, 12, 9 ); R( br, cr, dr, er, ar, F1, KK3, 15, 6); R( al, bl, cl, dl, el, F3, K3, 4, 8 ); R( ar, br, cr, dr, er, F1, KK3, 0, 14); R( el, al, bl, cl, dl, F3, K3, 13, 9 ); R( er, ar, br, cr, dr, F1, KK3, 5, 6); R( dl, el, al, bl, cl, F3, K3, 3, 14 ); R( dr, er, ar, br, cr, F1, KK3, 12, 9); R( cl, dl, el, al, bl, F3, K3, 7, 5 ); R( cr, dr, er, ar, br, F1, KK3, 2, 12); R( bl, cl, dl, el, al, F3, K3, 15, 6 ); R( br, cr, dr, er, ar, F1, KK3, 13, 9); R( al, bl, cl, dl, el, F3, K3, 14, 8 ); R( ar, br, cr, dr, er, F1, KK3, 9, 12); R( el, al, bl, cl, dl, F3, K3, 5, 6 ); R( er, ar, br, cr, dr, F1, KK3, 7, 5); R( dl, el, al, bl, cl, F3, K3, 6, 5 ); R( dr, er, ar, br, cr, F1, KK3, 10, 15); R( cl, dl, el, al, bl, F3, K3, 2, 12 ); R( cr, dr, er, ar, br, F1, KK3, 14, 8); R( bl, cl, dl, el, al, F4, K4, 4, 9 ); R( br, cr, dr, er, ar, F0, KK4, 12, 8); R( al, bl, cl, dl, el, F4, K4, 0, 15 ); R( ar, br, cr, dr, er, F0, KK4, 15, 5); R( el, al, bl, cl, dl, F4, K4, 5, 5 ); R( er, ar, br, cr, dr, F0, KK4, 10, 12); R( dl, el, al, bl, cl, F4, K4, 9, 11 ); R( dr, er, ar, br, cr, F0, KK4, 4, 9); R( cl, dl, el, al, bl, F4, K4, 7, 6 ); R( cr, dr, er, ar, br, F0, KK4, 1, 12); R( bl, cl, dl, el, al, F4, K4, 12, 8 ); R( br, cr, dr, er, ar, F0, KK4, 5, 5); R( al, bl, cl, dl, el, F4, K4, 2, 13 ); R( ar, br, cr, dr, er, F0, KK4, 8, 14); R( el, al, bl, cl, dl, F4, K4, 10, 12 ); R( er, ar, br, cr, dr, F0, KK4, 7, 6); R( dl, el, al, bl, cl, F4, K4, 14, 5 ); R( dr, er, ar, br, cr, F0, KK4, 6, 8); R( cl, dl, el, al, bl, F4, K4, 1, 12 ); R( cr, dr, er, ar, br, F0, KK4, 2, 13); R( bl, cl, dl, el, al, F4, K4, 3, 13 ); R( br, cr, dr, er, ar, F0, KK4, 13, 6); R( al, bl, cl, dl, el, F4, K4, 8, 14 ); R( ar, br, cr, dr, er, F0, KK4, 14, 5); R( el, al, bl, cl, dl, F4, K4, 11, 11 ); R( er, ar, br, cr, dr, F0, KK4, 0, 15); R( dl, el, al, bl, cl, F4, K4, 6, 8 ); R( dr, er, ar, br, cr, F0, KK4, 3, 13); R( cl, dl, el, al, bl, F4, K4, 15, 5 ); R( cr, dr, er, ar, br, F0, KK4, 9, 11); R( bl, cl, dl, el, al, F4, K4, 13, 6 ); R( br, cr, dr, er, ar, F0, KK4, 11, 11); dr += cl + hd->h1; hd->h1 = hd->h2 + dl + er; hd->h2 = hd->h3 + el + ar; hd->h3 = hd->h4 + al + br; hd->h4 = hd->h0 + bl + cr; hd->h0 = dr; return /*burn_stack*/ 104+5*sizeof(void*); } static unsigned int transform ( void *c, const unsigned char *data, size_t nblks ) { unsigned int burn; do { burn = transform_blk (c, data); data += 64; } while (--nblks); return burn; } /* * The routine terminates the computation */ static void rmd160_final( void *context ) { RMD160_CONTEXT *hd = context; u32 t, th, msb, lsb; byte *p; unsigned int burn; t = hd->bctx.nblocks; if (sizeof t == sizeof hd->bctx.nblocks) th = hd->bctx.nblocks_high; else th = hd->bctx.nblocks >> 32; /* multiply by 64 to make a byte count */ lsb = t << 6; msb = (th << 6) | (t >> 26); /* add the count */ t = lsb; if( (lsb += hd->bctx.count) < t ) msb++; /* multiply by 8 to make a bit count */ t = lsb; lsb <<= 3; msb <<= 3; msb |= t >> 29; if (hd->bctx.count < 56) /* enough room */ { hd->bctx.buf[hd->bctx.count++] = 0x80; /* pad */ if (hd->bctx.count < 56) memset (&hd->bctx.buf[hd->bctx.count], 0, 56 - hd->bctx.count); /* append the 64 bit count */ buf_put_le32(hd->bctx.buf + 56, lsb); buf_put_le32(hd->bctx.buf + 60, msb); burn = transform (hd, hd->bctx.buf, 1); } else /* need one extra block */ { hd->bctx.buf[hd->bctx.count++] = 0x80; /* pad character */ /* fill pad and next block with zeroes */ memset (&hd->bctx.buf[hd->bctx.count], 0, 64 - hd->bctx.count + 56); /* append the 64 bit count */ buf_put_le32(hd->bctx.buf + 64 + 56, lsb); buf_put_le32(hd->bctx.buf + 64 + 60, msb); burn = transform (hd, hd->bctx.buf, 2); } p = hd->bctx.buf; #define X(a) do { buf_put_le32(p, hd->h##a); p += 4; } while(0) X(0); X(1); X(2); X(3); X(4); #undef X hd->bctx.count = 0; _gcry_burn_stack (burn); } static byte * rmd160_read( void *context ) { RMD160_CONTEXT *hd = context; return hd->bctx.buf; } /**************** * Shortcut functions which puts the hash value of the supplied buffer iov * into outbuf which must have a size of 20 bytes. */ #define _gcry_rmd160_hash_buffers 0 static const byte asn[15] = /* Object ID is 1.3.36.3.2.1 */ { 0x30, 0x21, 0x30, 0x09, 0x06, 0x05, 0x2b, 0x24, 0x03, 0x02, 0x01, 0x05, 0x00, 0x04, 0x14 }; static const gcry_md_oid_spec_t oid_spec_rmd160[] = { /* rsaSignatureWithripemd160 */ { "1.3.36.3.3.1.2" }, /* TeleTrust hash algorithm. */ { "1.3.36.3.2.1" }, { NULL } }; gcry_md_spec_t _gcry_digest_spec_rmd160 = { GCRY_MD_RMD160, {0, 0}, "RIPEMD160", asn, DIM (asn), oid_spec_rmd160, 20, rmd160_init, _gcry_md_block_write, rmd160_final, rmd160_read, NULL, _gcry_rmd160_hash_buffers, sizeof (RMD160_CONTEXT) , GRUB_UTIL_MODNAME("gcry_rmd160") .blocksize = 64 }; GRUB_MOD_INIT(gcry_rmd160) { grub_md_register (&_gcry_digest_spec_rmd160); } GRUB_MOD_FINI(gcry_rmd160) { grub_md_unregister (&_gcry_digest_spec_rmd160); } grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/cipher/aria.c0000644000175000017500000015242215036452441021731 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ #include GRUB_MOD_LICENSE ("GPLv3+"); /* aria.c - ARIA Cipher Algorithm * * Copyright (C) 2022-2023 Taehee Yoo * Copyright (C) 2023 Jussi Kivilinna * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . */ #include "types.h" #include "g10lib.h" #include "cipher.h" #include "bufhelp.h" #include "cipher-internal.h" #include "bulkhelp.h" /* Attribute macro to force alignment to 64 bytes. */ #ifdef HAVE_GCC_ATTRIBUTE_ALIGNED # define ATTR_ALIGNED_64 __attribute__ ((aligned (64))) #else # define ATTR_ALIGNED_64 #endif /* Attribute macro to force inlining of function. */ #if __GNUC__ >= 4 # define ALWAYS_INLINE inline __attribute__ ((always_inline)) #else # define ALWAYS_INLINE inline #endif /* Attribute macro to prevent inlining of function. */ #if __GNUC__ >= 4 # define NO_INLINE __attribute__ ((noinline)) #else # define NO_INLINE #endif /* USE_AESNI_AVX inidicates whether to compile with Intel AES-NI/AVX code. */ #undef USE_AESNI_AVX #if defined(ENABLE_AESNI_SUPPORT) && defined(ENABLE_AVX_SUPPORT) # if defined(__x86_64__) && (defined(HAVE_COMPATIBLE_GCC_AMD64_PLATFORM_AS) || \ defined(HAVE_COMPATIBLE_GCC_WIN64_PLATFORM_AS)) # define USE_AESNI_AVX 1 # endif #endif /* USE_GFNI_AVX inidicates whether to compile with Intel GFNI/AVX code. */ #undef USE_GFNI_AVX #if defined(USE_AESNI_AVX) && defined(ENABLE_GFNI_SUPPORT) # define USE_GFNI_AVX 1 #endif /* USE_AESNI_AVX2 inidicates whether to compile with Intel AES-NI/AVX2 code. */ #undef USE_AESNI_AVX2 #if defined(ENABLE_AESNI_SUPPORT) && defined(ENABLE_AVX2_SUPPORT) # if defined(__x86_64__) && (defined(HAVE_COMPATIBLE_GCC_AMD64_PLATFORM_AS) || \ defined(HAVE_COMPATIBLE_GCC_WIN64_PLATFORM_AS)) # define USE_AESNI_AVX2 1 # endif #endif /* USE_VAES_AVX2 inidicates whether to compile with Intel VAES/AVX2 code. */ #undef USE_VAES_AVX2 #if defined(USE_AESNI_AVX2) && defined(HAVE_GCC_INLINE_ASM_VAES_VPCLMUL) # define USE_VAES_AVX2 1 #endif /* USE_GFNI_AVX2 inidicates whether to compile with Intel GFNI/AVX2 code. */ #undef USE_GFNI_AVX2 #if defined(USE_AESNI_AVX2) && defined(ENABLE_GFNI_SUPPORT) # define USE_GFNI_AVX2 1 #endif /* USE_GFNI_AVX512 inidicates whether to compile with Intel GFNI/AVX512 code. */ #undef USE_GFNI_AVX512 #if defined(ENABLE_GFNI_SUPPORT) && defined(ENABLE_AVX512_SUPPORT) # if defined(__x86_64__) && (defined(HAVE_COMPATIBLE_GCC_AMD64_PLATFORM_AS) || \ defined(HAVE_COMPATIBLE_GCC_WIN64_PLATFORM_AS)) # define USE_GFNI_AVX512 1 # endif #endif /* How many parallel blocks to handle in bulk processing functions. */ #if defined(USE_GFNI_AVX512) # define MAX_PARALLEL_BLKS 64 #elif defined(USE_AESNI_AVX2) # define MAX_PARALLEL_BLKS 32 #elif defined(USE_AESNI_AVX) # define MAX_PARALLEL_BLKS 16 #else # define MAX_PARALLEL_BLKS 8 #endif /* Assembly implementations use SystemV ABI, ABI conversion and additional * stack to store XMM6-XMM15 needed on Win64. */ #undef ASM_FUNC_ABI #undef ASM_EXTRA_STACK #if defined(USE_AESNI_AVX) || defined(USE_AESNI_AVX2) || \ defined(USE_GFNI_AVX512) # ifdef HAVE_COMPATIBLE_GCC_WIN64_PLATFORM_AS # define ASM_FUNC_ABI __attribute__((sysv_abi)) # define ASM_EXTRA_STACK (10 * 16) # else # define ASM_FUNC_ABI # define ASM_EXTRA_STACK 0 # endif #endif static const char *aria_selftest (void); #define ARIA_MIN_KEY_SIZE 16 #define ARIA_MAX_KEY_SIZE 32 #define ARIA_BLOCK_SIZE 16 #define ARIA_MAX_RD_KEYS 17 #define ARIA_RD_KEY_WORDS (ARIA_BLOCK_SIZE / sizeof(u32)) typedef struct { u32 enc_key[ARIA_MAX_RD_KEYS][ARIA_RD_KEY_WORDS]; u32 dec_key[ARIA_MAX_RD_KEYS][ARIA_RD_KEY_WORDS]; int rounds; unsigned int decryption_prepared:1; /* The decryption key is set up. */ unsigned int bulk_prefetch_ready:1; /* Look-up table prefetch ready for * current bulk operation. */ #ifdef USE_AESNI_AVX unsigned int use_aesni_avx:1; unsigned int use_gfni_avx:1; #endif #ifdef USE_AESNI_AVX2 unsigned int use_aesni_avx2:1; unsigned int use_vaes_avx2:1; unsigned int use_gfni_avx2:1; #endif #ifdef USE_GFNI_AVX512 unsigned int use_gfni_avx512:1; #endif } ARIA_context; static const u32 key_rc[20] = { 0x517cc1b7, 0x27220a94, 0xfe13abe8, 0xfa9a6ee0, 0x6db14acc, 0x9e21c820, 0xff28b1d5, 0xef5de2b0, 0xdb92371d, 0x2126e970, 0x03249775, 0x04e8c90e, 0x517cc1b7, 0x27220a94, 0xfe13abe8, 0xfa9a6ee0, 0x6db14acc, 0x9e21c820, 0xff28b1d5, 0xef5de2b0 }; static struct { volatile u32 counter_head; u32 cacheline_align[64 / 4 - 1]; u32 s1[256]; u32 s2[256]; u32 x1[256]; u32 x2[256]; volatile u32 counter_tail; } sboxes ATTR_ALIGNED_64 = { 0, { 0, }, { /* s1 */ 0x00636363, 0x007c7c7c, 0x00777777, 0x007b7b7b, 0x00f2f2f2, 0x006b6b6b, 0x006f6f6f, 0x00c5c5c5, 0x00303030, 0x00010101, 0x00676767, 0x002b2b2b, 0x00fefefe, 0x00d7d7d7, 0x00ababab, 0x00767676, 0x00cacaca, 0x00828282, 0x00c9c9c9, 0x007d7d7d, 0x00fafafa, 0x00595959, 0x00474747, 0x00f0f0f0, 0x00adadad, 0x00d4d4d4, 0x00a2a2a2, 0x00afafaf, 0x009c9c9c, 0x00a4a4a4, 0x00727272, 0x00c0c0c0, 0x00b7b7b7, 0x00fdfdfd, 0x00939393, 0x00262626, 0x00363636, 0x003f3f3f, 0x00f7f7f7, 0x00cccccc, 0x00343434, 0x00a5a5a5, 0x00e5e5e5, 0x00f1f1f1, 0x00717171, 0x00d8d8d8, 0x00313131, 0x00151515, 0x00040404, 0x00c7c7c7, 0x00232323, 0x00c3c3c3, 0x00181818, 0x00969696, 0x00050505, 0x009a9a9a, 0x00070707, 0x00121212, 0x00808080, 0x00e2e2e2, 0x00ebebeb, 0x00272727, 0x00b2b2b2, 0x00757575, 0x00090909, 0x00838383, 0x002c2c2c, 0x001a1a1a, 0x001b1b1b, 0x006e6e6e, 0x005a5a5a, 0x00a0a0a0, 0x00525252, 0x003b3b3b, 0x00d6d6d6, 0x00b3b3b3, 0x00292929, 0x00e3e3e3, 0x002f2f2f, 0x00848484, 0x00535353, 0x00d1d1d1, 0x00000000, 0x00ededed, 0x00202020, 0x00fcfcfc, 0x00b1b1b1, 0x005b5b5b, 0x006a6a6a, 0x00cbcbcb, 0x00bebebe, 0x00393939, 0x004a4a4a, 0x004c4c4c, 0x00585858, 0x00cfcfcf, 0x00d0d0d0, 0x00efefef, 0x00aaaaaa, 0x00fbfbfb, 0x00434343, 0x004d4d4d, 0x00333333, 0x00858585, 0x00454545, 0x00f9f9f9, 0x00020202, 0x007f7f7f, 0x00505050, 0x003c3c3c, 0x009f9f9f, 0x00a8a8a8, 0x00515151, 0x00a3a3a3, 0x00404040, 0x008f8f8f, 0x00929292, 0x009d9d9d, 0x00383838, 0x00f5f5f5, 0x00bcbcbc, 0x00b6b6b6, 0x00dadada, 0x00212121, 0x00101010, 0x00ffffff, 0x00f3f3f3, 0x00d2d2d2, 0x00cdcdcd, 0x000c0c0c, 0x00131313, 0x00ececec, 0x005f5f5f, 0x00979797, 0x00444444, 0x00171717, 0x00c4c4c4, 0x00a7a7a7, 0x007e7e7e, 0x003d3d3d, 0x00646464, 0x005d5d5d, 0x00191919, 0x00737373, 0x00606060, 0x00818181, 0x004f4f4f, 0x00dcdcdc, 0x00222222, 0x002a2a2a, 0x00909090, 0x00888888, 0x00464646, 0x00eeeeee, 0x00b8b8b8, 0x00141414, 0x00dedede, 0x005e5e5e, 0x000b0b0b, 0x00dbdbdb, 0x00e0e0e0, 0x00323232, 0x003a3a3a, 0x000a0a0a, 0x00494949, 0x00060606, 0x00242424, 0x005c5c5c, 0x00c2c2c2, 0x00d3d3d3, 0x00acacac, 0x00626262, 0x00919191, 0x00959595, 0x00e4e4e4, 0x00797979, 0x00e7e7e7, 0x00c8c8c8, 0x00373737, 0x006d6d6d, 0x008d8d8d, 0x00d5d5d5, 0x004e4e4e, 0x00a9a9a9, 0x006c6c6c, 0x00565656, 0x00f4f4f4, 0x00eaeaea, 0x00656565, 0x007a7a7a, 0x00aeaeae, 0x00080808, 0x00bababa, 0x00787878, 0x00252525, 0x002e2e2e, 0x001c1c1c, 0x00a6a6a6, 0x00b4b4b4, 0x00c6c6c6, 0x00e8e8e8, 0x00dddddd, 0x00747474, 0x001f1f1f, 0x004b4b4b, 0x00bdbdbd, 0x008b8b8b, 0x008a8a8a, 0x00707070, 0x003e3e3e, 0x00b5b5b5, 0x00666666, 0x00484848, 0x00030303, 0x00f6f6f6, 0x000e0e0e, 0x00616161, 0x00353535, 0x00575757, 0x00b9b9b9, 0x00868686, 0x00c1c1c1, 0x001d1d1d, 0x009e9e9e, 0x00e1e1e1, 0x00f8f8f8, 0x00989898, 0x00111111, 0x00696969, 0x00d9d9d9, 0x008e8e8e, 0x00949494, 0x009b9b9b, 0x001e1e1e, 0x00878787, 0x00e9e9e9, 0x00cecece, 0x00555555, 0x00282828, 0x00dfdfdf, 0x008c8c8c, 0x00a1a1a1, 0x00898989, 0x000d0d0d, 0x00bfbfbf, 0x00e6e6e6, 0x00424242, 0x00686868, 0x00414141, 0x00999999, 0x002d2d2d, 0x000f0f0f, 0x00b0b0b0, 0x00545454, 0x00bbbbbb, 0x00161616 }, { /* s2 */ 0xe200e2e2, 0x4e004e4e, 0x54005454, 0xfc00fcfc, 0x94009494, 0xc200c2c2, 0x4a004a4a, 0xcc00cccc, 0x62006262, 0x0d000d0d, 0x6a006a6a, 0x46004646, 0x3c003c3c, 0x4d004d4d, 0x8b008b8b, 0xd100d1d1, 0x5e005e5e, 0xfa00fafa, 0x64006464, 0xcb00cbcb, 0xb400b4b4, 0x97009797, 0xbe00bebe, 0x2b002b2b, 0xbc00bcbc, 0x77007777, 0x2e002e2e, 0x03000303, 0xd300d3d3, 0x19001919, 0x59005959, 0xc100c1c1, 0x1d001d1d, 0x06000606, 0x41004141, 0x6b006b6b, 0x55005555, 0xf000f0f0, 0x99009999, 0x69006969, 0xea00eaea, 0x9c009c9c, 0x18001818, 0xae00aeae, 0x63006363, 0xdf00dfdf, 0xe700e7e7, 0xbb00bbbb, 0x00000000, 0x73007373, 0x66006666, 0xfb00fbfb, 0x96009696, 0x4c004c4c, 0x85008585, 0xe400e4e4, 0x3a003a3a, 0x09000909, 0x45004545, 0xaa00aaaa, 0x0f000f0f, 0xee00eeee, 0x10001010, 0xeb00ebeb, 0x2d002d2d, 0x7f007f7f, 0xf400f4f4, 0x29002929, 0xac00acac, 0xcf00cfcf, 0xad00adad, 0x91009191, 0x8d008d8d, 0x78007878, 0xc800c8c8, 0x95009595, 0xf900f9f9, 0x2f002f2f, 0xce00cece, 0xcd00cdcd, 0x08000808, 0x7a007a7a, 0x88008888, 0x38003838, 0x5c005c5c, 0x83008383, 0x2a002a2a, 0x28002828, 0x47004747, 0xdb00dbdb, 0xb800b8b8, 0xc700c7c7, 0x93009393, 0xa400a4a4, 0x12001212, 0x53005353, 0xff00ffff, 0x87008787, 0x0e000e0e, 0x31003131, 0x36003636, 0x21002121, 0x58005858, 0x48004848, 0x01000101, 0x8e008e8e, 0x37003737, 0x74007474, 0x32003232, 0xca00caca, 0xe900e9e9, 0xb100b1b1, 0xb700b7b7, 0xab00abab, 0x0c000c0c, 0xd700d7d7, 0xc400c4c4, 0x56005656, 0x42004242, 0x26002626, 0x07000707, 0x98009898, 0x60006060, 0xd900d9d9, 0xb600b6b6, 0xb900b9b9, 0x11001111, 0x40004040, 0xec00ecec, 0x20002020, 0x8c008c8c, 0xbd00bdbd, 0xa000a0a0, 0xc900c9c9, 0x84008484, 0x04000404, 0x49004949, 0x23002323, 0xf100f1f1, 0x4f004f4f, 0x50005050, 0x1f001f1f, 0x13001313, 0xdc00dcdc, 0xd800d8d8, 0xc000c0c0, 0x9e009e9e, 0x57005757, 0xe300e3e3, 0xc300c3c3, 0x7b007b7b, 0x65006565, 0x3b003b3b, 0x02000202, 0x8f008f8f, 0x3e003e3e, 0xe800e8e8, 0x25002525, 0x92009292, 0xe500e5e5, 0x15001515, 0xdd00dddd, 0xfd00fdfd, 0x17001717, 0xa900a9a9, 0xbf00bfbf, 0xd400d4d4, 0x9a009a9a, 0x7e007e7e, 0xc500c5c5, 0x39003939, 0x67006767, 0xfe00fefe, 0x76007676, 0x9d009d9d, 0x43004343, 0xa700a7a7, 0xe100e1e1, 0xd000d0d0, 0xf500f5f5, 0x68006868, 0xf200f2f2, 0x1b001b1b, 0x34003434, 0x70007070, 0x05000505, 0xa300a3a3, 0x8a008a8a, 0xd500d5d5, 0x79007979, 0x86008686, 0xa800a8a8, 0x30003030, 0xc600c6c6, 0x51005151, 0x4b004b4b, 0x1e001e1e, 0xa600a6a6, 0x27002727, 0xf600f6f6, 0x35003535, 0xd200d2d2, 0x6e006e6e, 0x24002424, 0x16001616, 0x82008282, 0x5f005f5f, 0xda00dada, 0xe600e6e6, 0x75007575, 0xa200a2a2, 0xef00efef, 0x2c002c2c, 0xb200b2b2, 0x1c001c1c, 0x9f009f9f, 0x5d005d5d, 0x6f006f6f, 0x80008080, 0x0a000a0a, 0x72007272, 0x44004444, 0x9b009b9b, 0x6c006c6c, 0x90009090, 0x0b000b0b, 0x5b005b5b, 0x33003333, 0x7d007d7d, 0x5a005a5a, 0x52005252, 0xf300f3f3, 0x61006161, 0xa100a1a1, 0xf700f7f7, 0xb000b0b0, 0xd600d6d6, 0x3f003f3f, 0x7c007c7c, 0x6d006d6d, 0xed00eded, 0x14001414, 0xe000e0e0, 0xa500a5a5, 0x3d003d3d, 0x22002222, 0xb300b3b3, 0xf800f8f8, 0x89008989, 0xde00dede, 0x71007171, 0x1a001a1a, 0xaf00afaf, 0xba00baba, 0xb500b5b5, 0x81008181 }, { /* x1 */ 0x52520052, 0x09090009, 0x6a6a006a, 0xd5d500d5, 0x30300030, 0x36360036, 0xa5a500a5, 0x38380038, 0xbfbf00bf, 0x40400040, 0xa3a300a3, 0x9e9e009e, 0x81810081, 0xf3f300f3, 0xd7d700d7, 0xfbfb00fb, 0x7c7c007c, 0xe3e300e3, 0x39390039, 0x82820082, 0x9b9b009b, 0x2f2f002f, 0xffff00ff, 0x87870087, 0x34340034, 0x8e8e008e, 0x43430043, 0x44440044, 0xc4c400c4, 0xdede00de, 0xe9e900e9, 0xcbcb00cb, 0x54540054, 0x7b7b007b, 0x94940094, 0x32320032, 0xa6a600a6, 0xc2c200c2, 0x23230023, 0x3d3d003d, 0xeeee00ee, 0x4c4c004c, 0x95950095, 0x0b0b000b, 0x42420042, 0xfafa00fa, 0xc3c300c3, 0x4e4e004e, 0x08080008, 0x2e2e002e, 0xa1a100a1, 0x66660066, 0x28280028, 0xd9d900d9, 0x24240024, 0xb2b200b2, 0x76760076, 0x5b5b005b, 0xa2a200a2, 0x49490049, 0x6d6d006d, 0x8b8b008b, 0xd1d100d1, 0x25250025, 0x72720072, 0xf8f800f8, 0xf6f600f6, 0x64640064, 0x86860086, 0x68680068, 0x98980098, 0x16160016, 0xd4d400d4, 0xa4a400a4, 0x5c5c005c, 0xcccc00cc, 0x5d5d005d, 0x65650065, 0xb6b600b6, 0x92920092, 0x6c6c006c, 0x70700070, 0x48480048, 0x50500050, 0xfdfd00fd, 0xeded00ed, 0xb9b900b9, 0xdada00da, 0x5e5e005e, 0x15150015, 0x46460046, 0x57570057, 0xa7a700a7, 0x8d8d008d, 0x9d9d009d, 0x84840084, 0x90900090, 0xd8d800d8, 0xabab00ab, 0x00000000, 0x8c8c008c, 0xbcbc00bc, 0xd3d300d3, 0x0a0a000a, 0xf7f700f7, 0xe4e400e4, 0x58580058, 0x05050005, 0xb8b800b8, 0xb3b300b3, 0x45450045, 0x06060006, 0xd0d000d0, 0x2c2c002c, 0x1e1e001e, 0x8f8f008f, 0xcaca00ca, 0x3f3f003f, 0x0f0f000f, 0x02020002, 0xc1c100c1, 0xafaf00af, 0xbdbd00bd, 0x03030003, 0x01010001, 0x13130013, 0x8a8a008a, 0x6b6b006b, 0x3a3a003a, 0x91910091, 0x11110011, 0x41410041, 0x4f4f004f, 0x67670067, 0xdcdc00dc, 0xeaea00ea, 0x97970097, 0xf2f200f2, 0xcfcf00cf, 0xcece00ce, 0xf0f000f0, 0xb4b400b4, 0xe6e600e6, 0x73730073, 0x96960096, 0xacac00ac, 0x74740074, 0x22220022, 0xe7e700e7, 0xadad00ad, 0x35350035, 0x85850085, 0xe2e200e2, 0xf9f900f9, 0x37370037, 0xe8e800e8, 0x1c1c001c, 0x75750075, 0xdfdf00df, 0x6e6e006e, 0x47470047, 0xf1f100f1, 0x1a1a001a, 0x71710071, 0x1d1d001d, 0x29290029, 0xc5c500c5, 0x89890089, 0x6f6f006f, 0xb7b700b7, 0x62620062, 0x0e0e000e, 0xaaaa00aa, 0x18180018, 0xbebe00be, 0x1b1b001b, 0xfcfc00fc, 0x56560056, 0x3e3e003e, 0x4b4b004b, 0xc6c600c6, 0xd2d200d2, 0x79790079, 0x20200020, 0x9a9a009a, 0xdbdb00db, 0xc0c000c0, 0xfefe00fe, 0x78780078, 0xcdcd00cd, 0x5a5a005a, 0xf4f400f4, 0x1f1f001f, 0xdddd00dd, 0xa8a800a8, 0x33330033, 0x88880088, 0x07070007, 0xc7c700c7, 0x31310031, 0xb1b100b1, 0x12120012, 0x10100010, 0x59590059, 0x27270027, 0x80800080, 0xecec00ec, 0x5f5f005f, 0x60600060, 0x51510051, 0x7f7f007f, 0xa9a900a9, 0x19190019, 0xb5b500b5, 0x4a4a004a, 0x0d0d000d, 0x2d2d002d, 0xe5e500e5, 0x7a7a007a, 0x9f9f009f, 0x93930093, 0xc9c900c9, 0x9c9c009c, 0xefef00ef, 0xa0a000a0, 0xe0e000e0, 0x3b3b003b, 0x4d4d004d, 0xaeae00ae, 0x2a2a002a, 0xf5f500f5, 0xb0b000b0, 0xc8c800c8, 0xebeb00eb, 0xbbbb00bb, 0x3c3c003c, 0x83830083, 0x53530053, 0x99990099, 0x61610061, 0x17170017, 0x2b2b002b, 0x04040004, 0x7e7e007e, 0xbaba00ba, 0x77770077, 0xd6d600d6, 0x26260026, 0xe1e100e1, 0x69690069, 0x14140014, 0x63630063, 0x55550055, 0x21210021, 0x0c0c000c, 0x7d7d007d }, { /* x2 */ 0x30303000, 0x68686800, 0x99999900, 0x1b1b1b00, 0x87878700, 0xb9b9b900, 0x21212100, 0x78787800, 0x50505000, 0x39393900, 0xdbdbdb00, 0xe1e1e100, 0x72727200, 0x09090900, 0x62626200, 0x3c3c3c00, 0x3e3e3e00, 0x7e7e7e00, 0x5e5e5e00, 0x8e8e8e00, 0xf1f1f100, 0xa0a0a000, 0xcccccc00, 0xa3a3a300, 0x2a2a2a00, 0x1d1d1d00, 0xfbfbfb00, 0xb6b6b600, 0xd6d6d600, 0x20202000, 0xc4c4c400, 0x8d8d8d00, 0x81818100, 0x65656500, 0xf5f5f500, 0x89898900, 0xcbcbcb00, 0x9d9d9d00, 0x77777700, 0xc6c6c600, 0x57575700, 0x43434300, 0x56565600, 0x17171700, 0xd4d4d400, 0x40404000, 0x1a1a1a00, 0x4d4d4d00, 0xc0c0c000, 0x63636300, 0x6c6c6c00, 0xe3e3e300, 0xb7b7b700, 0xc8c8c800, 0x64646400, 0x6a6a6a00, 0x53535300, 0xaaaaaa00, 0x38383800, 0x98989800, 0x0c0c0c00, 0xf4f4f400, 0x9b9b9b00, 0xededed00, 0x7f7f7f00, 0x22222200, 0x76767600, 0xafafaf00, 0xdddddd00, 0x3a3a3a00, 0x0b0b0b00, 0x58585800, 0x67676700, 0x88888800, 0x06060600, 0xc3c3c300, 0x35353500, 0x0d0d0d00, 0x01010100, 0x8b8b8b00, 0x8c8c8c00, 0xc2c2c200, 0xe6e6e600, 0x5f5f5f00, 0x02020200, 0x24242400, 0x75757500, 0x93939300, 0x66666600, 0x1e1e1e00, 0xe5e5e500, 0xe2e2e200, 0x54545400, 0xd8d8d800, 0x10101000, 0xcecece00, 0x7a7a7a00, 0xe8e8e800, 0x08080800, 0x2c2c2c00, 0x12121200, 0x97979700, 0x32323200, 0xababab00, 0xb4b4b400, 0x27272700, 0x0a0a0a00, 0x23232300, 0xdfdfdf00, 0xefefef00, 0xcacaca00, 0xd9d9d900, 0xb8b8b800, 0xfafafa00, 0xdcdcdc00, 0x31313100, 0x6b6b6b00, 0xd1d1d100, 0xadadad00, 0x19191900, 0x49494900, 0xbdbdbd00, 0x51515100, 0x96969600, 0xeeeeee00, 0xe4e4e400, 0xa8a8a800, 0x41414100, 0xdadada00, 0xffffff00, 0xcdcdcd00, 0x55555500, 0x86868600, 0x36363600, 0xbebebe00, 0x61616100, 0x52525200, 0xf8f8f800, 0xbbbbbb00, 0x0e0e0e00, 0x82828200, 0x48484800, 0x69696900, 0x9a9a9a00, 0xe0e0e000, 0x47474700, 0x9e9e9e00, 0x5c5c5c00, 0x04040400, 0x4b4b4b00, 0x34343400, 0x15151500, 0x79797900, 0x26262600, 0xa7a7a700, 0xdedede00, 0x29292900, 0xaeaeae00, 0x92929200, 0xd7d7d700, 0x84848400, 0xe9e9e900, 0xd2d2d200, 0xbababa00, 0x5d5d5d00, 0xf3f3f300, 0xc5c5c500, 0xb0b0b000, 0xbfbfbf00, 0xa4a4a400, 0x3b3b3b00, 0x71717100, 0x44444400, 0x46464600, 0x2b2b2b00, 0xfcfcfc00, 0xebebeb00, 0x6f6f6f00, 0xd5d5d500, 0xf6f6f600, 0x14141400, 0xfefefe00, 0x7c7c7c00, 0x70707000, 0x5a5a5a00, 0x7d7d7d00, 0xfdfdfd00, 0x2f2f2f00, 0x18181800, 0x83838300, 0x16161600, 0xa5a5a500, 0x91919100, 0x1f1f1f00, 0x05050500, 0x95959500, 0x74747400, 0xa9a9a900, 0xc1c1c100, 0x5b5b5b00, 0x4a4a4a00, 0x85858500, 0x6d6d6d00, 0x13131300, 0x07070700, 0x4f4f4f00, 0x4e4e4e00, 0x45454500, 0xb2b2b200, 0x0f0f0f00, 0xc9c9c900, 0x1c1c1c00, 0xa6a6a600, 0xbcbcbc00, 0xececec00, 0x73737300, 0x90909000, 0x7b7b7b00, 0xcfcfcf00, 0x59595900, 0x8f8f8f00, 0xa1a1a100, 0xf9f9f900, 0x2d2d2d00, 0xf2f2f200, 0xb1b1b100, 0x00000000, 0x94949400, 0x37373700, 0x9f9f9f00, 0xd0d0d000, 0x2e2e2e00, 0x9c9c9c00, 0x6e6e6e00, 0x28282800, 0x3f3f3f00, 0x80808000, 0xf0f0f000, 0x3d3d3d00, 0xd3d3d300, 0x25252500, 0x8a8a8a00, 0xb5b5b500, 0xe7e7e700, 0x42424200, 0xb3b3b300, 0xc7c7c700, 0xeaeaea00, 0xf7f7f700, 0x4c4c4c00, 0x11111100, 0x33333300, 0x03030300, 0xa2a2a200, 0xacacac00, 0x60606000 }, 0 }; #ifdef USE_AESNI_AVX extern unsigned int _gcry_aria_aesni_avx_ecb_crypt_blk1_16(const void *ctx, byte *out, const byte *in, const void *key, u64 nblks) ASM_FUNC_ABI; extern unsigned int _gcry_aria_aesni_avx_ctr_crypt_blk16(const void *ctx, byte *out, const byte *in, byte *iv) ASM_FUNC_ABI; #ifdef USE_GFNI_AVX extern unsigned int _gcry_aria_gfni_avx_ecb_crypt_blk1_16(const void *ctx, byte *out, const byte *in, const void *key, u64 nblks) ASM_FUNC_ABI; extern unsigned int _gcry_aria_gfni_avx_ctr_crypt_blk16(const void *ctx, byte *out, const byte *in, byte *iv) ASM_FUNC_ABI; #endif /* USE_GFNI_AVX */ static inline unsigned int aria_avx_ecb_crypt_blk1_16(const ARIA_context *ctx, byte *out, const byte *in, const u32 key[][ARIA_RD_KEY_WORDS], size_t nblks) { if (0) { } #ifdef USE_GFNI_AVX else if (ctx->use_gfni_avx) return _gcry_aria_gfni_avx_ecb_crypt_blk1_16(ctx, out, in, key, nblks) + ASM_EXTRA_STACK; #endif /* USE_GFNI_AVX */ else return _gcry_aria_aesni_avx_ecb_crypt_blk1_16(ctx, out, in, key, nblks) + ASM_EXTRA_STACK; } static inline unsigned int aria_avx_ctr_crypt_blk16(const ARIA_context *ctx, byte *out, const byte *in, byte *iv) { if (0) { } #ifdef USE_GFNI_AVX else if (ctx->use_gfni_avx) return _gcry_aria_gfni_avx_ctr_crypt_blk16(ctx, out, in, iv) + ASM_EXTRA_STACK; #endif /* USE_GFNI_AVX */ else return _gcry_aria_aesni_avx_ctr_crypt_blk16(ctx, out, in, iv) + ASM_EXTRA_STACK; } #endif /* USE_AESNI_AVX */ #ifdef USE_AESNI_AVX2 extern unsigned int _gcry_aria_aesni_avx2_ecb_crypt_blk32(const void *ctx, byte *out, const byte *in, const void *key) ASM_FUNC_ABI; extern unsigned int _gcry_aria_aesni_avx2_ctr_crypt_blk32(const void *ctx, byte *out, const byte *in, byte *iv) ASM_FUNC_ABI; #ifdef USE_VAES_AVX2 extern unsigned int _gcry_aria_vaes_avx2_ecb_crypt_blk32(const void *ctx, byte *out, const byte *in, const void *key) ASM_FUNC_ABI; extern unsigned int _gcry_aria_vaes_avx2_ctr_crypt_blk32(const void *ctx, byte *out, const byte *in, byte *iv) ASM_FUNC_ABI; #endif /* USE_VAES_AVX2 */ #ifdef USE_GFNI_AVX2 extern unsigned int _gcry_aria_gfni_avx2_ecb_crypt_blk32(const void *ctx, byte *out, const byte *in, const void *key) ASM_FUNC_ABI; extern unsigned int _gcry_aria_gfni_avx2_ctr_crypt_blk32(const void *ctx, byte *out, const byte *in, byte *iv) ASM_FUNC_ABI; #endif /* USE_GFNI_AVX2 */ static inline unsigned int aria_avx2_ecb_crypt_blk32(const ARIA_context *ctx, byte *out, const byte *in, const u32 key[][ARIA_RD_KEY_WORDS]) { if (0) { } #ifdef USE_GFNI_AVX2 else if (ctx->use_gfni_avx2) return _gcry_aria_gfni_avx2_ecb_crypt_blk32(ctx, out, in, key) + ASM_EXTRA_STACK; #endif /* USE_GFNI_AVX2 */ #ifdef USE_VAES_AVX2 else if (ctx->use_vaes_avx2) return _gcry_aria_vaes_avx2_ecb_crypt_blk32(ctx, out, in, key) + ASM_EXTRA_STACK; #endif /* USE_VAES_AVX2 */ else return _gcry_aria_aesni_avx2_ecb_crypt_blk32(ctx, out, in, key) + ASM_EXTRA_STACK; } static inline unsigned int aria_avx2_ctr_crypt_blk32(const ARIA_context *ctx, byte *out, const byte *in, byte *iv) { if (0) { } #ifdef USE_GFNI_AVX2 else if (ctx->use_gfni_avx2) return _gcry_aria_gfni_avx2_ctr_crypt_blk32(ctx, out, in, iv) + ASM_EXTRA_STACK; #endif /* USE_GFNI_AVX2 */ #ifdef USE_VAES_AVX2 else if (ctx->use_vaes_avx2) return _gcry_aria_vaes_avx2_ctr_crypt_blk32(ctx, out, in, iv) + ASM_EXTRA_STACK; #endif /* USE_VAES_AVX2 */ else return _gcry_aria_aesni_avx2_ctr_crypt_blk32(ctx, out, in, iv) + ASM_EXTRA_STACK; } #endif /* USE_AESNI_AVX2 */ #ifdef USE_GFNI_AVX512 extern unsigned int _gcry_aria_gfni_avx512_ecb_crypt_blk64(const void *ctx, byte *out, const byte *in, const void *key) ASM_FUNC_ABI; extern unsigned int _gcry_aria_gfni_avx512_ctr_crypt_blk64(const void *ctx, byte *out, const byte *in, byte *iv) ASM_FUNC_ABI; static inline unsigned int aria_gfni_avx512_ecb_crypt_blk64(const ARIA_context *ctx, byte *out, const byte *in, const u32 key[][ARIA_RD_KEY_WORDS]) { return _gcry_aria_gfni_avx512_ecb_crypt_blk64(ctx, out, in, key) + ASM_EXTRA_STACK; } static inline unsigned int aria_gfni_avx512_ctr_crypt_blk64(const ARIA_context *ctx, byte *out, const byte *in, byte *iv) { return _gcry_aria_gfni_avx512_ctr_crypt_blk64(ctx, out, in, iv) + ASM_EXTRA_STACK; } #endif /* USE_AESNI_AVX2 */ /* Prefetching for sbox tables. */ static inline void prefetch_table(const volatile byte *tab, size_t len) { size_t i; for (i = 0; len - i >= 8 * 32; i += 8 * 32) { (void)tab[i + 0 * 32]; (void)tab[i + 1 * 32]; (void)tab[i + 2 * 32]; (void)tab[i + 3 * 32]; (void)tab[i + 4 * 32]; (void)tab[i + 5 * 32]; (void)tab[i + 6 * 32]; (void)tab[i + 7 * 32]; } for (; i < len; i += 32) { (void)tab[i]; } (void)tab[len - 1]; } static inline void prefetch_sboxes(void) { /* Modify counters to trigger copy-on-write and unsharing if physical pages * of look-up table are shared between processes. Modifying counters also * causes checksums for pages to change and hint same-page merging algorithm * that these pages are frequently changing. */ sboxes.counter_head++; sboxes.counter_tail++; /* Prefetch look-up tables to cache. */ prefetch_table((const void *)&sboxes, sizeof(sboxes)); } static ALWAYS_INLINE u32 rotr32(u32 v, u32 r) { return ror(v, r); } static ALWAYS_INLINE u32 bswap32(u32 v) { return _gcry_bswap32(v); } static ALWAYS_INLINE u32 get_u8(u32 x, u32 y) { return (x >> ((3 - y) * 8)) & 0xFF; } static ALWAYS_INLINE u32 make_u32(byte v0, byte v1, byte v2, byte v3) { return ((u32)v0 << 24) | ((u32)v1 << 16) | ((u32)v2 << 8) | ((u32)v3); } static ALWAYS_INLINE u32 aria_m(u32 t0) { return rotr32(t0, 8) ^ rotr32(t0 ^ rotr32(t0, 8), 16); } /* S-Box Layer 1 + M */ static ALWAYS_INLINE void aria_sbox_layer1_with_pre_diff(u32 *t0, u32 *t1, u32 *t2, u32 *t3) { *t0 = sboxes.s1[get_u8(*t0, 0)] ^ sboxes.s2[get_u8(*t0, 1)] ^ sboxes.x1[get_u8(*t0, 2)] ^ sboxes.x2[get_u8(*t0, 3)]; *t1 = sboxes.s1[get_u8(*t1, 0)] ^ sboxes.s2[get_u8(*t1, 1)] ^ sboxes.x1[get_u8(*t1, 2)] ^ sboxes.x2[get_u8(*t1, 3)]; *t2 = sboxes.s1[get_u8(*t2, 0)] ^ sboxes.s2[get_u8(*t2, 1)] ^ sboxes.x1[get_u8(*t2, 2)] ^ sboxes.x2[get_u8(*t2, 3)]; *t3 = sboxes.s1[get_u8(*t3, 0)] ^ sboxes.s2[get_u8(*t3, 1)] ^ sboxes.x1[get_u8(*t3, 2)] ^ sboxes.x2[get_u8(*t3, 3)]; } /* S-Box Layer 2 + M */ static ALWAYS_INLINE void aria_sbox_layer2_with_pre_diff(u32 *t0, u32 *t1, u32 *t2, u32 *t3) { *t0 = sboxes.x1[get_u8(*t0, 0)] ^ sboxes.x2[get_u8(*t0, 1)] ^ sboxes.s1[get_u8(*t0, 2)] ^ sboxes.s2[get_u8(*t0, 3)]; *t1 = sboxes.x1[get_u8(*t1, 0)] ^ sboxes.x2[get_u8(*t1, 1)] ^ sboxes.s1[get_u8(*t1, 2)] ^ sboxes.s2[get_u8(*t1, 3)]; *t2 = sboxes.x1[get_u8(*t2, 0)] ^ sboxes.x2[get_u8(*t2, 1)] ^ sboxes.s1[get_u8(*t2, 2)] ^ sboxes.s2[get_u8(*t2, 3)]; *t3 = sboxes.x1[get_u8(*t3, 0)] ^ sboxes.x2[get_u8(*t3, 1)] ^ sboxes.s1[get_u8(*t3, 2)] ^ sboxes.s2[get_u8(*t3, 3)]; } /* Word-level diffusion */ static ALWAYS_INLINE void aria_diff_word(u32 *t0, u32 *t1, u32 *t2, u32 *t3) { *t1 ^= *t2; *t2 ^= *t3; *t0 ^= *t1; *t3 ^= *t1; *t2 ^= *t0; *t1 ^= *t2; } /* Byte-level diffusion */ static inline void aria_diff_byte(u32 *t1, u32 *t2, u32 *t3) { *t1 = ((*t1 << 8) & 0xff00ff00) ^ ((*t1 >> 8) & 0x00ff00ff); *t2 = rotr32(*t2, 16); *t3 = bswap32(*t3); } /* Key XOR Layer */ static ALWAYS_INLINE void aria_add_round_key(u32 *rk, u32 *t0, u32 *t1, u32 *t2, u32 *t3) { *t0 ^= rk[0]; *t1 ^= rk[1]; *t2 ^= rk[2]; *t3 ^= rk[3]; } /* Odd round Substitution & Diffusion */ static ALWAYS_INLINE void aria_subst_diff_odd(u32 *t0, u32 *t1, u32 *t2, u32 *t3) { aria_sbox_layer1_with_pre_diff(t0, t1, t2, t3); aria_diff_word(t0, t1, t2, t3); aria_diff_byte(t1, t2, t3); aria_diff_word(t0, t1, t2, t3); } /* Even round Substitution & Diffusion */ static ALWAYS_INLINE void aria_subst_diff_even(u32 *t0, u32 *t1, u32 *t2, u32 *t3) { aria_sbox_layer2_with_pre_diff(t0, t1, t2, t3); aria_diff_word(t0, t1, t2, t3); aria_diff_byte(t3, t0, t1); aria_diff_word(t0, t1, t2, t3); } /* Last round */ static ALWAYS_INLINE void aria_last_round(u32 *t0, u32 *t1, u32 *t2, u32 *t3) { *t0 = make_u32((byte)(sboxes.x1[get_u8(*t0, 0)]), (byte)(sboxes.x2[get_u8(*t0, 1)] >> 24), (byte)(sboxes.s1[get_u8(*t0, 2)]), (byte)(sboxes.s2[get_u8(*t0, 3)])); *t1 = make_u32((byte)(sboxes.x1[get_u8(*t1, 0)]), (byte)(sboxes.x2[get_u8(*t1, 1)] >> 24), (byte)(sboxes.s1[get_u8(*t1, 2)]), (byte)(sboxes.s2[get_u8(*t1, 3)])); *t2 = make_u32((byte)(sboxes.x1[get_u8(*t2, 0)]), (byte)(sboxes.x2[get_u8(*t2, 1)] >> 24), (byte)(sboxes.s1[get_u8(*t2, 2)]), (byte)(sboxes.s2[get_u8(*t2, 3)])); *t3 = make_u32((byte)(sboxes.x1[get_u8(*t3, 0)]), (byte)(sboxes.x2[get_u8(*t3, 1)] >> 24), (byte)(sboxes.s1[get_u8(*t3, 2)]), (byte)(sboxes.s2[get_u8(*t3, 3)])); } /* Q, R Macro expanded ARIA GSRK */ static ALWAYS_INLINE void aria_gsrk(u32 *rk, u32 *x, u32 *y, u32 n) { int q = 4 - (n / 32); int r = n % 32; rk[0] = (x[0]) ^ ((y[q % 4]) >> r) ^ ((y[(q + 3) % 4]) << (32 - r)); rk[1] = (x[1]) ^ ((y[(q + 1) % 4]) >> r) ^ ((y[q % 4]) << (32 - r)); rk[2] = (x[2]) ^ ((y[(q + 2) % 4]) >> r) ^ ((y[(q + 1) % 4]) << (32 - r)); rk[3] = (x[3]) ^ ((y[(q + 3) % 4]) >> r) ^ ((y[(q + 2) % 4]) << (32 - r)); } static NO_INLINE void aria_set_encrypt_key(ARIA_context *ctx, const byte *in_key, u32 key_len) { u32 w0[4], w1[4], w2[4], w3[4]; u32 reg0, reg1, reg2, reg3; const u32 *ck; int rkidx = 0; ctx->rounds = (key_len + 32) / 4; prefetch_sboxes(); ck = &key_rc[(key_len - 16) / 2]; w0[0] = buf_get_be32(in_key + 0); w0[1] = buf_get_be32(in_key + 4); w0[2] = buf_get_be32(in_key + 8); w0[3] = buf_get_be32(in_key + 12); reg0 = w0[0] ^ ck[0]; reg1 = w0[1] ^ ck[1]; reg2 = w0[2] ^ ck[2]; reg3 = w0[3] ^ ck[3]; aria_subst_diff_odd(®0, ®1, ®2, ®3); if (key_len > 16) { w1[0] = buf_get_be32(in_key + 16); w1[1] = buf_get_be32(in_key + 20); if (key_len > 24) { w1[2] = buf_get_be32(in_key + 24); w1[3] = buf_get_be32(in_key + 28); } else { w1[2] = 0; w1[3] = 0; } } else { w1[0] = 0; w1[1] = 0; w1[2] = 0; w1[3] = 0; } w1[0] ^= reg0; w1[1] ^= reg1; w1[2] ^= reg2; w1[3] ^= reg3; reg0 = w1[0]; reg1 = w1[1]; reg2 = w1[2]; reg3 = w1[3]; reg0 ^= ck[4]; reg1 ^= ck[5]; reg2 ^= ck[6]; reg3 ^= ck[7]; aria_subst_diff_even(®0, ®1, ®2, ®3); reg0 ^= w0[0]; reg1 ^= w0[1]; reg2 ^= w0[2]; reg3 ^= w0[3]; w2[0] = reg0; w2[1] = reg1; w2[2] = reg2; w2[3] = reg3; reg0 ^= ck[8]; reg1 ^= ck[9]; reg2 ^= ck[10]; reg3 ^= ck[11]; aria_subst_diff_odd(®0, ®1, ®2, ®3); w3[0] = reg0 ^ w1[0]; w3[1] = reg1 ^ w1[1]; w3[2] = reg2 ^ w1[2]; w3[3] = reg3 ^ w1[3]; aria_gsrk(ctx->enc_key[rkidx], w0, w1, 19); rkidx++; aria_gsrk(ctx->enc_key[rkidx], w1, w2, 19); rkidx++; aria_gsrk(ctx->enc_key[rkidx], w2, w3, 19); rkidx++; aria_gsrk(ctx->enc_key[rkidx], w3, w0, 19); rkidx++; aria_gsrk(ctx->enc_key[rkidx], w0, w1, 31); rkidx++; aria_gsrk(ctx->enc_key[rkidx], w1, w2, 31); rkidx++; aria_gsrk(ctx->enc_key[rkidx], w2, w3, 31); rkidx++; aria_gsrk(ctx->enc_key[rkidx], w3, w0, 31); rkidx++; aria_gsrk(ctx->enc_key[rkidx], w0, w1, 67); rkidx++; aria_gsrk(ctx->enc_key[rkidx], w1, w2, 67); rkidx++; aria_gsrk(ctx->enc_key[rkidx], w2, w3, 67); rkidx++; aria_gsrk(ctx->enc_key[rkidx], w3, w0, 67); rkidx++; aria_gsrk(ctx->enc_key[rkidx], w0, w1, 97); if (key_len > 16) { rkidx++; aria_gsrk(ctx->enc_key[rkidx], w1, w2, 97); rkidx++; aria_gsrk(ctx->enc_key[rkidx], w2, w3, 97); if (key_len > 24) { rkidx++; aria_gsrk(ctx->enc_key[rkidx], w3, w0, 97); rkidx++; aria_gsrk(ctx->enc_key[rkidx], w0, w1, 109); } } wipememory(w0, sizeof(w0)); wipememory(w1, sizeof(w1)); wipememory(w2, sizeof(w2)); wipememory(w3, sizeof(w3)); } static void aria_set_decrypt_key(ARIA_context *ctx) { int i; for (i = 0; i < 4; i++) { ctx->dec_key[0][i] = ctx->enc_key[ctx->rounds][i]; ctx->dec_key[ctx->rounds][i] = ctx->enc_key[0][i]; } for (i = 1; i < ctx->rounds; i++) { ctx->dec_key[i][0] = aria_m(ctx->enc_key[ctx->rounds - i][0]); ctx->dec_key[i][1] = aria_m(ctx->enc_key[ctx->rounds - i][1]); ctx->dec_key[i][2] = aria_m(ctx->enc_key[ctx->rounds - i][2]); ctx->dec_key[i][3] = aria_m(ctx->enc_key[ctx->rounds - i][3]); aria_diff_word(&ctx->dec_key[i][0], &ctx->dec_key[i][1], &ctx->dec_key[i][2], &ctx->dec_key[i][3]); aria_diff_byte(&ctx->dec_key[i][1], &ctx->dec_key[i][2], &ctx->dec_key[i][3]); aria_diff_word(&ctx->dec_key[i][0], &ctx->dec_key[i][1], &ctx->dec_key[i][2], &ctx->dec_key[i][3]); } } static NO_INLINE unsigned int aria_crypt(ARIA_context *ctx, byte *out, const byte *in, u32 key[][ARIA_RD_KEY_WORDS]) { u32 reg0, reg1, reg2, reg3; int rounds = ctx->rounds; int rkidx = 0; reg0 = buf_get_be32(in + 0); reg1 = buf_get_be32(in + 4); reg2 = buf_get_be32(in + 8); reg3 = buf_get_be32(in + 12); aria_add_round_key(key[rkidx], ®0, ®1, ®2, ®3); rkidx++; while (1) { aria_subst_diff_odd(®0, ®1, ®2, ®3); aria_add_round_key(key[rkidx], ®0, ®1, ®2, ®3); rkidx++; if (rkidx >= rounds) break; aria_subst_diff_even(®0, ®1, ®2, ®3); aria_add_round_key(key[rkidx], ®0, ®1, ®2, ®3); rkidx++; } aria_last_round(®0, ®1, ®2, ®3); aria_add_round_key(key[rkidx], ®0, ®1, ®2, ®3); buf_put_be32(out + 0, reg0); buf_put_be32(out + 4, reg1); buf_put_be32(out + 8, reg2); buf_put_be32(out + 12, reg3); return 4 * sizeof(void *) + 4 * sizeof(u32); /* stack burn depth */ } static unsigned int aria_encrypt(void *c, byte *outbuf, const byte *inbuf) { ARIA_context *ctx = (ARIA_context *)c; prefetch_sboxes (); return aria_crypt (ctx, outbuf, inbuf, ctx->enc_key); } static unsigned int aria_decrypt(void *c, byte *outbuf, const byte *inbuf) { ARIA_context *ctx = (ARIA_context *)c; if (!ctx->decryption_prepared) { aria_set_decrypt_key (ctx); ctx->decryption_prepared = 1; } prefetch_sboxes (); return aria_crypt (ctx, outbuf, inbuf, ctx->dec_key); } static unsigned int aria_crypt_2blks(ARIA_context *ctx, byte *out, const byte *in, u32 key[][ARIA_RD_KEY_WORDS]) { u32 ra0, ra1, ra2, ra3; u32 rb0, rb1, rb2, rb3; int rounds = ctx->rounds; int rkidx = 0; ra0 = buf_get_be32(in + 0); ra1 = buf_get_be32(in + 4); ra2 = buf_get_be32(in + 8); ra3 = buf_get_be32(in + 12); rb0 = buf_get_be32(in + 16); rb1 = buf_get_be32(in + 20); rb2 = buf_get_be32(in + 24); rb3 = buf_get_be32(in + 28); while (1) { aria_add_round_key(key[rkidx], &ra0, &ra1, &ra2, &ra3); aria_add_round_key(key[rkidx], &rb0, &rb1, &rb2, &rb3); rkidx++; aria_subst_diff_odd(&ra0, &ra1, &ra2, &ra3); aria_subst_diff_odd(&rb0, &rb1, &rb2, &rb3); aria_add_round_key(key[rkidx], &ra0, &ra1, &ra2, &ra3); aria_add_round_key(key[rkidx], &rb0, &rb1, &rb2, &rb3); rkidx++; if (rkidx >= rounds) break; aria_subst_diff_even(&ra0, &ra1, &ra2, &ra3); aria_subst_diff_even(&rb0, &rb1, &rb2, &rb3); } aria_last_round(&ra0, &ra1, &ra2, &ra3); aria_last_round(&rb0, &rb1, &rb2, &rb3); aria_add_round_key(key[rkidx], &ra0, &ra1, &ra2, &ra3); aria_add_round_key(key[rkidx], &rb0, &rb1, &rb2, &rb3); buf_put_be32(out + 0, ra0); buf_put_be32(out + 4, ra1); buf_put_be32(out + 8, ra2); buf_put_be32(out + 12, ra3); buf_put_be32(out + 16, rb0); buf_put_be32(out + 20, rb1); buf_put_be32(out + 24, rb2); buf_put_be32(out + 28, rb3); return 4 * sizeof(void *) + 8 * sizeof(u32); /* stack burn depth */ } static unsigned int aria_crypt_blocks (ARIA_context *ctx, byte *out, const byte *in, size_t num_blks, u32 key[][ARIA_RD_KEY_WORDS]) { unsigned int burn_depth = 0; #ifdef USE_GFNI_AVX512 if (ctx->use_gfni_avx512) { unsigned int nburn = 0; while (num_blks >= 64) { nburn = aria_gfni_avx512_ecb_crypt_blk64 (ctx, out, in, key); in += 64 * ARIA_BLOCK_SIZE; out += 64 * ARIA_BLOCK_SIZE; num_blks -= 64; } burn_depth = nburn > burn_depth ? nburn : burn_depth; if (num_blks == 0) return burn_depth; } #endif /* USE_AESNI_AVX2 */ #ifdef USE_AESNI_AVX2 if (ctx->use_aesni_avx2 || ctx->use_gfni_avx2) { unsigned int nburn = 0; while (num_blks >= 32) { nburn = aria_avx2_ecb_crypt_blk32 (ctx, out, in, key); in += 32 * ARIA_BLOCK_SIZE; out += 32 * ARIA_BLOCK_SIZE; num_blks -= 32; } burn_depth = nburn > burn_depth ? nburn : burn_depth; if (num_blks == 0) return burn_depth; } #endif /* USE_AESNI_AVX2 */ #ifdef USE_AESNI_AVX if (ctx->use_aesni_avx || ctx->use_gfni_avx) { unsigned int nburn = 0; while (num_blks >= 3) { size_t curr_blks = num_blks < 16 ? num_blks : 16; nburn = aria_avx_ecb_crypt_blk1_16 (ctx, out, in, key, curr_blks); in += curr_blks * ARIA_BLOCK_SIZE; out += curr_blks * ARIA_BLOCK_SIZE; num_blks -= curr_blks; } burn_depth = nburn > burn_depth ? nburn : burn_depth; if (num_blks == 0) return burn_depth; } #endif /* USE_AESNI_AVX */ if (!ctx->bulk_prefetch_ready) { prefetch_sboxes(); ctx->bulk_prefetch_ready = 1; } while (num_blks >= 2) { unsigned int nburn = aria_crypt_2blks (ctx, out, in, key); burn_depth = nburn > burn_depth ? nburn : burn_depth; out += 2 * ARIA_BLOCK_SIZE; in += 2 * ARIA_BLOCK_SIZE; num_blks -= 2; } while (num_blks) { unsigned int nburn = aria_crypt (ctx, out, in, key); burn_depth = nburn > burn_depth ? nburn : burn_depth; out += ARIA_BLOCK_SIZE; in += ARIA_BLOCK_SIZE; num_blks--; } if (burn_depth) burn_depth += sizeof(void *) * 5; return burn_depth; } static unsigned int aria_enc_blocks (void *c, byte *out, const byte *in, size_t num_blks) { ARIA_context *ctx = (ARIA_context *)c; return aria_crypt_blocks (ctx, out, in, num_blks, ctx->enc_key); } static unsigned int aria_dec_blocks (void *c, byte *out, const byte *in, size_t num_blks) { ARIA_context *ctx = (ARIA_context *)c; return aria_crypt_blocks (ctx, out, in, num_blks, ctx->dec_key); } /* Bulk encryption of complete blocks in CTR mode. This function is only intended for the bulk encryption feature of cipher.c. CTR is expected to be of size 16. */ static void _gcry_aria_ctr_enc(void *context, unsigned char *ctr, void *outbuf_arg, const void *inbuf_arg, size_t nblocks) { ARIA_context *ctx = context; byte *outbuf = outbuf_arg; const byte *inbuf = inbuf_arg; int burn_stack_depth = 0; #ifdef USE_GFNI_AVX512 if (ctx->use_gfni_avx512) { size_t nburn = 0; while (nblocks >= 64) { nburn = aria_gfni_avx512_ctr_crypt_blk64 (ctx, outbuf, inbuf, ctr); inbuf += 64 * ARIA_BLOCK_SIZE; outbuf += 64 * ARIA_BLOCK_SIZE; nblocks -= 64; } burn_stack_depth = nburn > burn_stack_depth ? nburn : burn_stack_depth; } #endif /* USE_AESNI_AVX */ #ifdef USE_AESNI_AVX2 if (ctx->use_aesni_avx2 || ctx->use_gfni_avx2) { size_t nburn = 0; while (nblocks >= 32) { nburn = aria_avx2_ctr_crypt_blk32 (ctx, outbuf, inbuf, ctr); inbuf += 32 * ARIA_BLOCK_SIZE; outbuf += 32 * ARIA_BLOCK_SIZE; nblocks -= 32; } burn_stack_depth = nburn > burn_stack_depth ? nburn : burn_stack_depth; } #endif /* USE_AESNI_AVX */ #ifdef USE_AESNI_AVX if (ctx->use_aesni_avx || ctx->use_gfni_avx) { size_t nburn = 0; while (nblocks >= 16) { nburn = aria_avx_ctr_crypt_blk16 (ctx, outbuf, inbuf, ctr); inbuf += 16 * ARIA_BLOCK_SIZE; outbuf += 16 * ARIA_BLOCK_SIZE; nblocks -= 16; } burn_stack_depth = nburn > burn_stack_depth ? nburn : burn_stack_depth; } #endif /* USE_AESNI_AVX */ /* Process remaining blocks. */ if (nblocks) { byte tmpbuf[MAX_PARALLEL_BLKS * ARIA_BLOCK_SIZE]; unsigned int tmp_used = ARIA_BLOCK_SIZE; size_t nburn = 0; ctx->bulk_prefetch_ready = 0; nburn = bulk_ctr_enc_128(ctx, aria_enc_blocks, outbuf, inbuf, nblocks, ctr, tmpbuf, sizeof(tmpbuf) / ARIA_BLOCK_SIZE, &tmp_used); burn_stack_depth = nburn > burn_stack_depth ? nburn : burn_stack_depth; wipememory (tmpbuf, tmp_used); } if (burn_stack_depth) _gcry_burn_stack (burn_stack_depth); } /* Bulk encryption of complete blocks in CBC mode. */ static void _gcry_aria_cbc_enc (void *context, unsigned char *iv, void *outbuf_arg, const void *inbuf_arg, size_t nblocks, int cbc_mac) { ARIA_context *ctx = context; unsigned char *outbuf = outbuf_arg; const unsigned char *inbuf = inbuf_arg; unsigned char *last_iv; unsigned int burn_depth = 0; prefetch_sboxes(); last_iv = iv; for (; nblocks; nblocks--) { cipher_block_xor (outbuf, inbuf, last_iv, ARIA_BLOCK_SIZE); burn_depth = aria_crypt (ctx, outbuf, outbuf, ctx->enc_key); last_iv = outbuf; inbuf += ARIA_BLOCK_SIZE; if (!cbc_mac) outbuf += ARIA_BLOCK_SIZE; } if (last_iv != iv) cipher_block_cpy (iv, last_iv, ARIA_BLOCK_SIZE); if (burn_depth) _gcry_burn_stack (burn_depth + 4 * sizeof(void *)); } /* Bulk decryption of complete blocks in CBC mode. This function is only intended for the bulk encryption feature of cipher.c. */ static void _gcry_aria_cbc_dec(void *context, unsigned char *iv, void *outbuf_arg, const void *inbuf_arg, size_t nblocks) { ARIA_context *ctx = context; unsigned char *outbuf = outbuf_arg; const unsigned char *inbuf = inbuf_arg; int burn_stack_depth = 0; if (!ctx->decryption_prepared) { aria_set_decrypt_key (ctx); ctx->decryption_prepared = 1; } /* Process remaining blocks. */ if (nblocks) { unsigned char tmpbuf[MAX_PARALLEL_BLKS * ARIA_BLOCK_SIZE]; unsigned int tmp_used = ARIA_BLOCK_SIZE; size_t nburn; ctx->bulk_prefetch_ready = 0; nburn = bulk_cbc_dec_128(ctx, aria_dec_blocks, outbuf, inbuf, nblocks, iv, tmpbuf, sizeof(tmpbuf) / ARIA_BLOCK_SIZE, &tmp_used); burn_stack_depth = nburn > burn_stack_depth ? nburn : burn_stack_depth; wipememory (tmpbuf, tmp_used); } if (burn_stack_depth) _gcry_burn_stack (burn_stack_depth); } /* Bulk encryption of complete blocks in CFB mode. */ static void _gcry_aria_cfb_enc (void *context, unsigned char *iv, void *outbuf_arg, const void *inbuf_arg, size_t nblocks) { ARIA_context *ctx = context; unsigned char *outbuf = outbuf_arg; const unsigned char *inbuf = inbuf_arg; unsigned int burn_depth = 0; prefetch_sboxes(); for (; nblocks; nblocks--) { /* Encrypt the IV. */ burn_depth = aria_crypt (ctx, iv, iv, ctx->enc_key); /* XOR the input with the IV and store input into IV. */ cipher_block_xor_2dst(outbuf, iv, inbuf, ARIA_BLOCK_SIZE); outbuf += ARIA_BLOCK_SIZE; inbuf += ARIA_BLOCK_SIZE; } if (burn_depth) _gcry_burn_stack (burn_depth + 4 * sizeof(void *)); } /* Bulk decryption of complete blocks in CFB mode. This function is only intended for the bulk encryption feature of cipher.c. */ static void _gcry_aria_cfb_dec(void *context, unsigned char *iv, void *outbuf_arg, const void *inbuf_arg, size_t nblocks) { ARIA_context *ctx = context; unsigned char *outbuf = outbuf_arg; const unsigned char *inbuf = inbuf_arg; int burn_stack_depth = 0; /* Process remaining blocks. */ if (nblocks) { unsigned char tmpbuf[MAX_PARALLEL_BLKS * ARIA_BLOCK_SIZE]; unsigned int tmp_used = ARIA_BLOCK_SIZE; size_t nburn; ctx->bulk_prefetch_ready = 0; nburn = bulk_cfb_dec_128(ctx, aria_enc_blocks, outbuf, inbuf, nblocks, iv, tmpbuf, sizeof(tmpbuf) / ARIA_BLOCK_SIZE, &tmp_used); burn_stack_depth = nburn > burn_stack_depth ? nburn : burn_stack_depth; wipememory (tmpbuf, tmp_used); } if (burn_stack_depth) _gcry_burn_stack (burn_stack_depth); } /* Bulk encryption/decryption in ECB mode. */ static void _gcry_aria_ecb_crypt (void *context, void *outbuf_arg, const void *inbuf_arg, size_t nblocks, int encrypt) { ARIA_context *ctx = context; unsigned char *outbuf = outbuf_arg; const unsigned char *inbuf = inbuf_arg; int burn_stack_depth = 0; if (!encrypt && !ctx->decryption_prepared) { aria_set_decrypt_key (ctx); ctx->decryption_prepared = 1; } /* Process remaining blocks. */ if (nblocks) { bulk_crypt_fn_t crypt_blk1_n; size_t nburn; ctx->bulk_prefetch_ready = 0; crypt_blk1_n = encrypt ? aria_enc_blocks : aria_dec_blocks; nburn = bulk_ecb_crypt_128(ctx, crypt_blk1_n, outbuf, inbuf, nblocks, MAX_PARALLEL_BLKS); burn_stack_depth = nburn > burn_stack_depth ? nburn : burn_stack_depth; } if (burn_stack_depth) _gcry_burn_stack (burn_stack_depth); } /* Bulk encryption/decryption of complete blocks in XTS mode. */ static void _gcry_aria_xts_crypt (void *context, unsigned char *tweak, void *outbuf_arg, const void *inbuf_arg, size_t nblocks, int encrypt) { ARIA_context *ctx = context; unsigned char *outbuf = outbuf_arg; const unsigned char *inbuf = inbuf_arg; int burn_stack_depth = 0; if (!encrypt && !ctx->decryption_prepared) { aria_set_decrypt_key (ctx); ctx->decryption_prepared = 1; } /* Process remaining blocks. */ if (nblocks) { unsigned char tmpbuf[MAX_PARALLEL_BLKS * ARIA_BLOCK_SIZE]; unsigned int tmp_used = ARIA_BLOCK_SIZE; bulk_crypt_fn_t crypt_blk1_n; size_t nburn; ctx->bulk_prefetch_ready = 0; crypt_blk1_n = encrypt ? aria_enc_blocks : aria_dec_blocks; nburn = bulk_xts_crypt_128(ctx, crypt_blk1_n, outbuf, inbuf, nblocks, tweak, tmpbuf, sizeof(tmpbuf) / ARIA_BLOCK_SIZE, &tmp_used); burn_stack_depth = nburn > burn_stack_depth ? nburn : burn_stack_depth; wipememory (tmpbuf, tmp_used); } if (burn_stack_depth) _gcry_burn_stack (burn_stack_depth); } /* Bulk encryption of complete blocks in CTR32LE mode (for GCM-SIV). */ static void _gcry_aria_ctr32le_enc(void *context, unsigned char *ctr, void *outbuf_arg, const void *inbuf_arg, size_t nblocks) { ARIA_context *ctx = context; byte *outbuf = outbuf_arg; const byte *inbuf = inbuf_arg; int burn_stack_depth = 0; /* Process remaining blocks. */ if (nblocks) { unsigned char tmpbuf[MAX_PARALLEL_BLKS * ARIA_BLOCK_SIZE]; unsigned int tmp_used = ARIA_BLOCK_SIZE; size_t nburn; ctx->bulk_prefetch_ready = 0; nburn = bulk_ctr32le_enc_128 (ctx, aria_enc_blocks, outbuf, inbuf, nblocks, ctr, tmpbuf, sizeof(tmpbuf) / ARIA_BLOCK_SIZE, &tmp_used); burn_stack_depth = nburn > burn_stack_depth ? nburn : burn_stack_depth; wipememory (tmpbuf, tmp_used); } if (burn_stack_depth) _gcry_burn_stack (burn_stack_depth); } /* Bulk encryption/decryption of complete blocks in OCB mode. */ static size_t _gcry_aria_ocb_crypt (gcry_cipher_hd_t c, void *outbuf_arg, const void *inbuf_arg, size_t nblocks, int encrypt) { ARIA_context *ctx = (void *)&c->context.c; unsigned char *outbuf = outbuf_arg; const unsigned char *inbuf = inbuf_arg; u64 blkn = c->u_mode.ocb.data_nblocks; int burn_stack_depth = 0; if (!encrypt && !ctx->decryption_prepared) { aria_set_decrypt_key (ctx); ctx->decryption_prepared = 1; } /* Process remaining blocks. */ if (nblocks) { unsigned char tmpbuf[MAX_PARALLEL_BLKS * ARIA_BLOCK_SIZE]; unsigned int tmp_used = ARIA_BLOCK_SIZE; bulk_crypt_fn_t crypt_blk1_n; size_t nburn; ctx->bulk_prefetch_ready = 0; crypt_blk1_n = encrypt ? aria_enc_blocks : aria_dec_blocks; nburn = bulk_ocb_crypt_128 (c, ctx, crypt_blk1_n, outbuf, inbuf, nblocks, &blkn, encrypt, tmpbuf, sizeof(tmpbuf) / ARIA_BLOCK_SIZE, &tmp_used); burn_stack_depth = nburn > burn_stack_depth ? nburn : burn_stack_depth; wipememory (tmpbuf, tmp_used); } c->u_mode.ocb.data_nblocks = blkn; if (burn_stack_depth) _gcry_burn_stack (burn_stack_depth); return 0; } /* Bulk authentication of complete blocks in OCB mode. */ static size_t _gcry_aria_ocb_auth (gcry_cipher_hd_t c, const void *abuf_arg, size_t nblocks) { ARIA_context *ctx = (void *)&c->context.c; const unsigned char *abuf = abuf_arg; u64 blkn = c->u_mode.ocb.aad_nblocks; int burn_stack_depth = 0; /* Process remaining blocks. */ if (nblocks) { unsigned char tmpbuf[MAX_PARALLEL_BLKS * ARIA_BLOCK_SIZE]; unsigned int tmp_used = ARIA_BLOCK_SIZE; size_t nburn; ctx->bulk_prefetch_ready = 0; nburn = bulk_ocb_auth_128 (c, ctx, aria_enc_blocks, abuf, nblocks, &blkn, tmpbuf, sizeof(tmpbuf) / ARIA_BLOCK_SIZE, &tmp_used); burn_stack_depth = nburn > burn_stack_depth ? nburn : burn_stack_depth; wipememory (tmpbuf, tmp_used); } c->u_mode.ocb.aad_nblocks = blkn; if (burn_stack_depth) _gcry_burn_stack (burn_stack_depth); return 0; } static gcry_err_code_t aria_setkey(void *c, const byte *key, unsigned keylen, cipher_bulk_ops_t *bulk_ops) { ARIA_context *ctx = c; static int initialized = 0; static const char *selftest_failed = NULL; unsigned int hwf = _gcry_get_hw_features (); (void)hwf; if (keylen != 16 && keylen != 24 && keylen != 32) return GPG_ERR_INV_KEYLEN; if (!initialized) { initialized = 1; selftest_failed = aria_selftest (); if (selftest_failed) log_error("%s\n", selftest_failed); } if (selftest_failed) return GPG_ERR_SELFTEST_FAILED; #ifdef USE_GFNI_AVX512 ctx->use_gfni_avx512 = (hwf & HWF_INTEL_GFNI) && (hwf & HWF_INTEL_AVX512); #endif #ifdef USE_AESNI_AVX2 ctx->use_aesni_avx2 = (hwf & HWF_INTEL_AESNI) && (hwf & HWF_INTEL_AVX2); #endif #ifdef USE_GFNI_AVX2 ctx->use_gfni_avx2 = (hwf & HWF_INTEL_GFNI) && (hwf & HWF_INTEL_AVX2); #endif #ifdef USE_VAES_AVX2 ctx->use_vaes_avx2 = (hwf & HWF_INTEL_VAES_VPCLMUL) && (hwf & HWF_INTEL_AVX2); #endif #ifdef USE_AESNI_AVX ctx->use_aesni_avx = (hwf & HWF_INTEL_AESNI) && (hwf & HWF_INTEL_AVX); #endif #ifdef USE_GFNI_AVX ctx->use_gfni_avx = (hwf & HWF_INTEL_GFNI) && (hwf & HWF_INTEL_AVX); #endif /* Setup bulk encryption routines. */ memset (bulk_ops, 0, sizeof(*bulk_ops)); bulk_ops->cbc_enc = _gcry_aria_cbc_enc; bulk_ops->cbc_dec = _gcry_aria_cbc_dec; bulk_ops->cfb_enc = _gcry_aria_cfb_enc; bulk_ops->cfb_dec = _gcry_aria_cfb_dec; bulk_ops->ctr_enc = _gcry_aria_ctr_enc; bulk_ops->ctr32le_enc = _gcry_aria_ctr32le_enc; bulk_ops->ecb_crypt = _gcry_aria_ecb_crypt; bulk_ops->xts_crypt = _gcry_aria_xts_crypt; bulk_ops->ocb_crypt = _gcry_aria_ocb_crypt; bulk_ops->ocb_auth = _gcry_aria_ocb_auth; /* Setup context and encryption key. */ ctx->decryption_prepared = 0; aria_set_encrypt_key (ctx, key, keylen); _gcry_burn_stack (3 * sizeof(void *) + 5 * 4 * sizeof(u32)); return 0; } static const char * aria_selftest (void) { ARIA_context ctx; byte scratch[16]; static const byte key[16] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f }; static const byte plaintext[16] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff, }; static const byte ciphertext[16] = { 0xd7, 0x18, 0xfb, 0xd6, 0xab, 0x64, 0x4c, 0x73, 0x9d, 0xa9, 0x5f, 0x3b, 0xe6, 0x45, 0x17, 0x78 }; memset (&ctx, 0, sizeof(ctx)); aria_set_encrypt_key (&ctx, key, 16); aria_encrypt (&ctx, scratch, plaintext); if (memcmp (scratch, ciphertext, sizeof (ciphertext))) return "ARIA test encryption failed."; aria_decrypt (&ctx, scratch, scratch); if (memcmp (scratch, plaintext, sizeof (plaintext))) return "ARIA test decryption failed."; return NULL; } static const gcry_cipher_oid_spec_t aria128_oids[] = { { "1.2.410.200046.1.1.1", GCRY_CIPHER_MODE_ECB }, { "1.2.410.200046.1.1.2", GCRY_CIPHER_MODE_CBC }, { "1.2.410.200046.1.1.3", GCRY_CIPHER_MODE_CFB }, { "1.2.410.200046.1.1.4", GCRY_CIPHER_MODE_OFB }, { "1.2.410.200046.1.1.5", GCRY_CIPHER_MODE_CTR }, { "1.2.410.200046.1.1.34", GCRY_CIPHER_MODE_GCM }, { "1.2.410.200046.1.1.37", GCRY_CIPHER_MODE_CCM }, { NULL } }; static const gcry_cipher_oid_spec_t aria192_oids[] = { { "1.2.410.200046.1.1.6", GCRY_CIPHER_MODE_ECB }, { "1.2.410.200046.1.1.7", GCRY_CIPHER_MODE_CBC }, { "1.2.410.200046.1.1.8", GCRY_CIPHER_MODE_CFB }, { "1.2.410.200046.1.1.9", GCRY_CIPHER_MODE_OFB }, { "1.2.410.200046.1.1.10", GCRY_CIPHER_MODE_CTR }, { "1.2.410.200046.1.1.35", GCRY_CIPHER_MODE_GCM }, { "1.2.410.200046.1.1.38", GCRY_CIPHER_MODE_CCM }, { NULL } }; static const gcry_cipher_oid_spec_t aria256_oids[] = { { "1.2.410.200046.1.1.11", GCRY_CIPHER_MODE_ECB }, { "1.2.410.200046.1.1.12", GCRY_CIPHER_MODE_CBC }, { "1.2.410.200046.1.1.13", GCRY_CIPHER_MODE_CFB }, { "1.2.410.200046.1.1.14", GCRY_CIPHER_MODE_OFB }, { "1.2.410.200046.1.1.15", GCRY_CIPHER_MODE_CTR }, { "1.2.410.200046.1.1.36", GCRY_CIPHER_MODE_GCM }, { "1.2.410.200046.1.1.39", GCRY_CIPHER_MODE_CCM }, { NULL } }; gcry_cipher_spec_t _gcry_cipher_spec_aria128 = { GCRY_CIPHER_ARIA128, { 0, 0 }, "ARIA128", NULL, aria128_oids, ARIA_BLOCK_SIZE, 128, sizeof(ARIA_context), aria_setkey, aria_encrypt, aria_decrypt , GRUB_UTIL_MODNAME("gcry_aria") }; gcry_cipher_spec_t _gcry_cipher_spec_aria192 = { GCRY_CIPHER_ARIA192, { 0, 0 }, "ARIA192",NULL,aria192_oids, ARIA_BLOCK_SIZE, 192, sizeof(ARIA_context), aria_setkey, aria_encrypt, aria_decrypt , GRUB_UTIL_MODNAME("gcry_aria") }; gcry_cipher_spec_t _gcry_cipher_spec_aria256 = { GCRY_CIPHER_ARIA256, { 0, 0 }, "ARIA256", NULL, aria256_oids, ARIA_BLOCK_SIZE, 256, sizeof(ARIA_context), aria_setkey, aria_encrypt, aria_decrypt , GRUB_UTIL_MODNAME("gcry_aria") }; GRUB_MOD_INIT(gcry_aria) { grub_cipher_register (&_gcry_cipher_spec_aria128); grub_cipher_register (&_gcry_cipher_spec_aria192); grub_cipher_register (&_gcry_cipher_spec_aria256); } GRUB_MOD_FINI(gcry_aria) { grub_cipher_unregister (&_gcry_cipher_spec_aria128); grub_cipher_unregister (&_gcry_cipher_spec_aria192); grub_cipher_unregister (&_gcry_cipher_spec_aria256); } grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/cipher/camellia-simd128.h0000644000175000017500000020324315036452441023754 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ /* camellia-simd128.h - Camellia cipher SIMD128 intrinsics implementation * Copyright (C) 2023 Jussi Kivilinna * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . */ /* * SSE/AVX/NEON implementation of Camellia cipher, using AES-NI/ARMv8-CE/ * PPC-crypto for sbox calculations. This implementation takes 16 input blocks * and process them in parallel. Vectorized key setup is also available at * the end of file. This implementation is from * - https://github.com/jkivilin/camellia-simd-aesni * * This work was originally presented in Master's Thesis, * "Block Ciphers: Fast Implementations on x86-64 Architecture" (pages 42-50) * http://urn.fi/URN:NBN:fi:oulu-201305311409 */ #include "types.h" #define ALWAYS_INLINE inline __attribute__((always_inline)) #define NO_INLINE __attribute__((noinline)) #define NO_INSTRUMENT_FUNCTION __attribute__((no_instrument_function)) #define ASM_FUNC_ATTR NO_INSTRUMENT_FUNCTION #define ASM_FUNC_ATTR_INLINE ASM_FUNC_ATTR ALWAYS_INLINE #define ASM_FUNC_ATTR_NOINLINE ASM_FUNC_ATTR NO_INLINE SIMD128_OPT_ATTR #if defined(HAVE_GCC_INLINE_ASM_PPC_ALTIVEC) && !defined(WORDS_BIGENDIAN) /********************************************************************** AT&T x86 asm to intrinsics conversion macros (PowerPC VSX+crypto) **********************************************************************/ typedef vector signed char int8x16_t; typedef vector unsigned char uint8x16_t; typedef vector unsigned short uint16x8_t; typedef vector unsigned int uint32x4_t; typedef vector unsigned long long uint64x2_t; typedef uint64x2_t __m128i; #ifdef __clang__ /* clang has mismatching prototype for vec_sbox_be. */ static ASM_FUNC_ATTR_INLINE uint8x16_t asm_sbox_be(uint8x16_t b) { uint8x16_t o; __asm__ ("vsbox %0, %1\n\t" : "=v" (o) : "v" (b)); return o; } #undef vec_sbox_be #define vec_sbox_be asm_sbox_be #endif #define vec_bswap(a) ((__m128i)vec_reve((uint8x16_t)a)) #define vpand128(a, b, o) (o = vec_and(b, a)) #define vpandn128(a, b, o) (o = vec_andc(a, b)) #define vpxor128(a, b, o) (o = vec_xor(b, a)) #define vpor128(a, b, o) (o = vec_or(b, a)) #define vpsrlb128(s, a, o) ({ o = (__m128i)((uint8x16_t)a >> s); }) #define vpsllb128(s, a, o) ({ o = (__m128i)((uint8x16_t)a << s); }) #define vpsrlw128(s, a, o) ({ o = (__m128i)((uint16x8_t)a >> s); }) #define vpsllw128(s, a, o) ({ o = (__m128i)((uint16x8_t)a << s); }) #define vpsrld128(s, a, o) ({ o = (__m128i)((uint32x4_t)a >> s); }) #define vpslld128(s, a, o) ({ o = (__m128i)((uint32x4_t)a << s); }) #define vpsrlq128(s, a, o) ({ o = (__m128i)((uint64x2_t)a >> s); }) #define vpsllq128(s, a, o) ({ o = (__m128i)((uint64x2_t)a << s); }) #define vpsrldq128(s, a, o) ({ uint64x2_t __tmp = { 0, 0 }; \ o = (__m128i)vec_sld((uint8x16_t)__tmp, \ (uint8x16_t)a, (16 - (s)) & 15);}) #define vpslldq128(s, a, o) ({ uint64x2_t __tmp = { 0, 0 }; \ o = (__m128i)vec_sld((uint8x16_t)a, \ (uint8x16_t)__tmp, (s) & 15);}) #define if_vpsrlb128(...) __VA_ARGS__ #define if_not_vpsrlb128(...) /*_*/ #define vpsrl_byte_128(s, a, o) vpsrlb128(s, a, o) #define vpsll_byte_128(s, a, o) vpsllb128(s, a, o) #define vpaddb128(a, b, o) (o = (__m128i)vec_add((uint8x16_t)b, (uint8x16_t)a)) #define vpcmpgtb128(a, b, o) (o = (__m128i)vec_cmpgt((int8x16_t)b, (int8x16_t)a)) #define vpabsb128(a, o) (o = (__m128i)vec_abs((int8x16_t)a)) #define vpshufd128_0x4e(a, o) (o = (__m128i)vec_reve((uint64x2_t)a)) #define vpshufd128_0x1b(a, o) (o = (__m128i)vec_reve((uint32x4_t)a)) #define vpshufb128(m, a, o) \ ({ uint64x2_t __tmpz = { 0, 0 }; \ o = (__m128i)vec_perm((uint8x16_t)a, (uint8x16_t)__tmpz, (uint8x16_t)m); }) #define vpunpckhdq128(a, b, o) (o = (__m128i)vec_mergel((uint32x4_t)b, (uint32x4_t)a)) #define vpunpckldq128(a, b, o) (o = (__m128i)vec_mergeh((uint32x4_t)b, (uint32x4_t)a)) #define vpunpckhqdq128(a, b, o) (o = (__m128i)vec_mergel((uint64x2_t)b, (uint64x2_t)a)) #define vpunpcklqdq128(a, b, o) (o = (__m128i)vec_mergeh((uint64x2_t)b, (uint64x2_t)a)) #define vmovdqa128(a, o) (o = a) #define vmovd128(a, o) ({ uint32x4_t __tmp = { (a), 0, 0, 0 }; \ o = (__m128i)(__tmp); }) #define vmovq128(a, o) ({ uint64x2_t __tmp = { (a), 0 }; \ o = (__m128i)(__tmp); }) #define vmovdqa128_memld(a, o) (o = *(const __m128i *)(a)) #define vmovdqa128_memst(a, o) (*(__m128i *)(o) = (a)) #define vpshufb128_amemld(m, a, o) vpshufb128(*(const __m128i *)(m), a, o) /* Following operations may have unaligned memory input */ #define vmovdqu128_memld(a, o) (o = (__m128i)vec_xl(0, (const uint8_t *)(a))) #define vpxor128_memld(a, b, o) vpxor128(b, (__m128i)vec_xl(0, (const uint8_t *)(a)), o) /* Following operations may have unaligned memory output */ #define vmovdqu128_memst(a, o) vec_xst((uint8x16_t)(a), 0, (uint8_t *)(o)) #define vmovq128_memst(a, o) (((uint64_unaligned_t *)(o))[0] = ((__m128i)(a))[0]) /* PowerPC AES encrypt last round => ShiftRows + SubBytes + XOR round key */ static const uint8x16_t shift_row = { 0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, 1, 6, 11 }; #define vaesenclast128(a, b, o) \ ({ uint64x2_t __tmp = (__m128i)vec_sbox_be((uint8x16_t)(b)); \ vpshufb128(shift_row, __tmp, __tmp); \ vpxor128(a, __tmp, o); }) /* Macros for exposing SubBytes from PowerPC crypto instructions. */ #define aes_subbytes(a, o) \ (o = (__m128i)vec_sbox_be((uint8x16_t)(a))) #define aes_subbytes_and_shuf_and_xor(zero, a, o) \ vaesenclast128((zero), (a), (o)) /*#define aes_load_inv_shufmask(shufmask_reg) \ load_frequent_const(inv_shift_row, (shufmask_reg))*/ #define aes_inv_shuf(shufmask_reg, a, o) \ vpshufb128(shufmask_reg, (a), (o)) #define if_aes_subbytes(...) __VA_ARGS__ #define if_not_aes_subbytes(...) /*_*/ #define memory_barrier_with_vec(a) __asm__("" : "+wa"(a) :: "memory") #endif /* __powerpc__ */ #ifdef __ARM_NEON /********************************************************************** AT&T x86 asm to intrinsics conversion macros (ARMv8-CE) **********************************************************************/ #define __m128i uint64x2_t #define vpand128(a, b, o) (o = vandq_u64(b, a)) #define vpandn128(a, b, o) (o = vbicq_u64(a, b)) #define vpxor128(a, b, o) (o = veorq_u64(b, a)) #define vpor128(a, b, o) (o = vorrq_u64(b, a)) #define vpsrlb128(s, a, o) (o = (__m128i)vshrq_n_u8((uint8x16_t)a, s)) #define vpsllb128(s, a, o) (o = (__m128i)vshlq_n_u8((uint8x16_t)a, s)) #define vpsrlw128(s, a, o) (o = (__m128i)vshrq_n_u16((uint16x8_t)a, s)) #define vpsllw128(s, a, o) (o = (__m128i)vshlq_n_u16((uint16x8_t)a, s)) #define vpsrld128(s, a, o) (o = (__m128i)vshrq_n_u32((uint32x4_t)a, s)) #define vpslld128(s, a, o) (o = (__m128i)vshlq_n_u32((uint32x4_t)a, s)) #define vpsrlq128(s, a, o) (o = (__m128i)vshrq_n_u64(a, s)) #define vpsllq128(s, a, o) (o = (__m128i)vshlq_n_u64(a, s)) #define vpsrldq128(s, a, o) ({ uint64x2_t __tmp = { 0, 0 }; \ o = (__m128i)vextq_u8((uint8x16_t)a, \ (uint8x16_t)__tmp, (s) & 15);}) #define vpslldq128(s, a, o) ({ uint64x2_t __tmp = { 0, 0 }; \ o = (__m128i)vextq_u8((uint8x16_t)__tmp, \ (uint8x16_t)a, (16 - (s)) & 15);}) #define if_vpsrlb128(...) __VA_ARGS__ #define if_not_vpsrlb128(...) /*_*/ #define vpsrl_byte_128(s, a, o) vpsrlb128(s, a, o) #define vpsll_byte_128(s, a, o) vpsllb128(s, a, o) #define vpaddb128(a, b, o) (o = (__m128i)vaddq_u8((uint8x16_t)b, (uint8x16_t)a)) #define vpcmpgtb128(a, b, o) (o = (__m128i)vcgtq_s8((int8x16_t)b, (int8x16_t)a)) #define vpabsb128(a, o) (o = (__m128i)vabsq_s8((int8x16_t)a)) #define vpshufd128_0x4e(a, o) (o = (__m128i)vextq_u8((uint8x16_t)a, (uint8x16_t)a, 8)) #define vpshufd128_0x1b(a, o) (o = (__m128i)vrev64q_u32((uint32x4_t)vextq_u8((uint8x16_t)a, (uint8x16_t)a, 8))) #define vpshufb128(m, a, o) (o = (__m128i)vqtbl1q_u8((uint8x16_t)a, (uint8x16_t)m)) #define vpunpckhdq128(a, b, o) (o = (__m128i)vzip2q_u32((uint32x4_t)b, (uint32x4_t)a)) #define vpunpckldq128(a, b, o) (o = (__m128i)vzip1q_u32((uint32x4_t)b, (uint32x4_t)a)) #define vpunpckhqdq128(a, b, o) (o = (__m128i)vzip2q_u64(b, a)) #define vpunpcklqdq128(a, b, o) (o = (__m128i)vzip1q_u64(b, a)) /* CE AES encrypt last round => ShiftRows + SubBytes + XOR round key */ #define vaesenclast128(a, b, o) (o = (__m128i)vaeseq_u8((uint8x16_t)b, (uint8x16_t)a)) #define vmovdqa128(a, o) (o = a) #define vmovd128(a, o) ({ uint32x4_t __tmp = { a, 0, 0, 0 }; o = (__m128i)__tmp; }) #define vmovq128(a, o) ({ uint64x2_t __tmp = { a, 0 }; o = (__m128i)__tmp; }) #define vmovdqa128_memld(a, o) (o = (*(const __m128i *)(a))) #define vmovdqa128_memst(a, o) (*(__m128i *)(o) = (a)) #define vpshufb128_amemld(m, a, o) vpshufb128(*(const __m128i *)(m), a, o) /* Following operations may have unaligned memory input */ #define vmovdqu128_memld(a, o) (o = (__m128i)vld1q_u8((const uint8_t *)(a))) #define vpxor128_memld(a, b, o) vpxor128(b, (__m128i)vld1q_u8((const uint8_t *)(a)), o) /* Following operations may have unaligned memory output */ #define vmovdqu128_memst(a, o) vst1q_u8((uint8_t *)(o), (uint8x16_t)a) #define vmovq128_memst(a, o) (((uint64_unaligned_t *)(o))[0] = (a)[0]) /* Macros for exposing SubBytes from Crypto-Extension instruction set. */ #define aes_subbytes_and_shuf_and_xor(zero, a, o) \ vaesenclast128(zero, a, o) #define aes_load_inv_shufmask(shufmask_reg) \ load_frequent_const(inv_shift_row, shufmask_reg) #define aes_inv_shuf(shufmask_reg, a, o) \ vpshufb128(shufmask_reg, a, o) #define if_aes_subbytes(...) /*_*/ #define if_not_aes_subbytes(...) __VA_ARGS__ #define memory_barrier_with_vec(a) __asm__("" : "+w"(a) :: "memory") #endif /* __ARM_NEON */ #if defined(__x86_64__) || defined(__i386__) /********************************************************************** AT&T x86 asm to intrinsics conversion macros **********************************************************************/ #define vpand128(a, b, o) (o = _mm_and_si128(b, a)) #define vpandn128(a, b, o) (o = _mm_andnot_si128(b, a)) #define vpxor128(a, b, o) (o = _mm_xor_si128(b, a)) #define vpor128(a, b, o) (o = _mm_or_si128(b, a)) #define vpsrlw128(s, a, o) (o = _mm_srli_epi16(a, s)) #define vpsllw128(s, a, o) (o = _mm_slli_epi16(a, s)) #define vpsrld128(s, a, o) (o = _mm_srli_epi32(a, s)) #define vpslld128(s, a, o) (o = _mm_slli_epi32(a, s)) #define vpsrlq128(s, a, o) (o = _mm_srli_epi64(a, s)) #define vpsllq128(s, a, o) (o = _mm_slli_epi64(a, s)) #define vpsrldq128(s, a, o) (o = _mm_srli_si128(a, s)) #define vpslldq128(s, a, o) (o = _mm_slli_si128(a, s)) #define if_vpsrlb128(...) /*_*/ #define if_not_vpsrlb128(...) __VA_ARGS__ #define vpsrl_byte_128(s, a, o) vpsrld128(s, a, o) #define vpsll_byte_128(s, a, o) vpslld128(s, a, o) #define vpaddb128(a, b, o) (o = _mm_add_epi8(b, a)) #define vpcmpgtb128(a, b, o) (o = _mm_cmpgt_epi8(b, a)) #define vpabsb128(a, o) (o = _mm_abs_epi8(a)) #define vpshufd128_0x1b(a, o) (o = _mm_shuffle_epi32(a, 0x1b)) #define vpshufd128_0x4e(a, o) (o = _mm_shuffle_epi32(a, 0x4e)) #define vpshufb128(m, a, o) (o = _mm_shuffle_epi8(a, m)) #define vpunpckhdq128(a, b, o) (o = _mm_unpackhi_epi32(b, a)) #define vpunpckldq128(a, b, o) (o = _mm_unpacklo_epi32(b, a)) #define vpunpckhqdq128(a, b, o) (o = _mm_unpackhi_epi64(b, a)) #define vpunpcklqdq128(a, b, o) (o = _mm_unpacklo_epi64(b, a)) /* AES-NI encrypt last round => ShiftRows + SubBytes + XOR round key */ #define vaesenclast128(a, b, o) (o = _mm_aesenclast_si128(b, a)) #define vmovdqa128(a, o) (o = a) #define vmovd128(a, o) (o = _mm_set_epi32(0, 0, 0, a)) #define vmovq128(a, o) (o = _mm_set_epi64x(0, a)) #define vmovdqa128_memld(a, o) (o = (*(const __m128i *)(a))) #define vmovdqa128_memst(a, o) (*(__m128i *)(o) = (a)) #define vpshufb128_amemld(m, a, o) vpshufb128(*(const __m128i *)(m), a, o) /* Following operations may have unaligned memory input */ #define vmovdqu128_memld(a, o) (o = _mm_loadu_si128((const __m128i *)(a))) #define vpxor128_memld(a, b, o) \ vpxor128(b, _mm_loadu_si128((const __m128i *)(a)), o) /* Following operations may have unaligned memory output */ #define vmovdqu128_memst(a, o) _mm_storeu_si128((__m128i *)(o), a) #define vmovq128_memst(a, o) _mm_storel_epi64((__m128i *)(o), a) /* Macros for exposing SubBytes from AES-NI instruction set. */ #define aes_subbytes_and_shuf_and_xor(zero, a, o) \ vaesenclast128(zero, a, o) #define aes_load_inv_shufmask(shufmask_reg) \ load_frequent_const(inv_shift_row, shufmask_reg) #define aes_inv_shuf(shufmask_reg, a, o) \ vpshufb128(shufmask_reg, a, o) #define if_aes_subbytes(...) /*_*/ #define if_not_aes_subbytes(...) __VA_ARGS__ #define memory_barrier_with_vec(a) __asm__("" : "+x"(a) :: "memory") #endif /* defined(__x86_64__) || defined(__i386__) */ /********************************************************************** helper macros **********************************************************************/ #define filter_8bit(x, lo_t, hi_t, mask4bit, tmp0) \ vpand128(x, mask4bit, tmp0); \ if_vpsrlb128(vpsrlb128(4, x, x)); \ if_not_vpsrlb128(vpandn128(x, mask4bit, x)); \ if_not_vpsrlb128(vpsrld128(4, x, x)); \ \ vpshufb128(tmp0, lo_t, tmp0); \ vpshufb128(x, hi_t, x); \ vpxor128(tmp0, x, x); #define transpose_4x4(x0, x1, x2, x3, t1, t2) \ vpunpckhdq128(x1, x0, t2); \ vpunpckldq128(x1, x0, x0); \ \ vpunpckldq128(x3, x2, t1); \ vpunpckhdq128(x3, x2, x2); \ \ vpunpckhqdq128(t1, x0, x1); \ vpunpcklqdq128(t1, x0, x0); \ \ vpunpckhqdq128(x2, t2, x3); \ vpunpcklqdq128(x2, t2, x2); #define load_zero(o) vmovq128(0, o) #define load_frequent_const(constant, o) vmovdqa128(constant ## _stack, o) #define prepare_frequent_const(constant) \ vmovdqa128_memld(&(constant), constant ## _stack); \ memory_barrier_with_vec(constant ## _stack) #define prepare_frequent_constants() \ prepare_frequent_const(inv_shift_row); \ prepare_frequent_const(pack_bswap); \ prepare_frequent_const(shufb_16x16b); \ prepare_frequent_const(mask_0f); \ prepare_frequent_const(pre_tf_lo_s1); \ prepare_frequent_const(pre_tf_hi_s1); \ prepare_frequent_const(pre_tf_lo_s4); \ prepare_frequent_const(pre_tf_hi_s4); \ prepare_frequent_const(post_tf_lo_s1); \ prepare_frequent_const(post_tf_hi_s1); \ prepare_frequent_const(post_tf_lo_s3); \ prepare_frequent_const(post_tf_hi_s3); \ prepare_frequent_const(post_tf_lo_s2); \ prepare_frequent_const(post_tf_hi_s2) #define frequent_constants_declare \ __m128i inv_shift_row_stack; \ __m128i pack_bswap_stack; \ __m128i shufb_16x16b_stack; \ __m128i mask_0f_stack; \ __m128i pre_tf_lo_s1_stack; \ __m128i pre_tf_hi_s1_stack; \ __m128i pre_tf_lo_s4_stack; \ __m128i pre_tf_hi_s4_stack; \ __m128i post_tf_lo_s1_stack; \ __m128i post_tf_hi_s1_stack; \ __m128i post_tf_lo_s3_stack; \ __m128i post_tf_hi_s3_stack; \ __m128i post_tf_lo_s2_stack; \ __m128i post_tf_hi_s2_stack /********************************************************************** 16-way camellia macros **********************************************************************/ /* * IN: * x0..x7: byte-sliced AB state * mem_cd: register pointer storing CD state * key: index for key material * OUT: * x0..x7: new byte-sliced CD state */ #define roundsm16(x0, x1, x2, x3, x4, x5, x6, x7, t0, t1, t2, t3, t4, t5, t6, \ t7, mem_cd, key) \ /* \ * S-function with AES subbytes \ */ \ if_not_aes_subbytes(aes_load_inv_shufmask(t4);) \ load_frequent_const(mask_0f, t7); \ load_frequent_const(pre_tf_lo_s1, t0); \ load_frequent_const(pre_tf_hi_s1, t1); \ \ /* AES inverse shift rows */ \ if_not_aes_subbytes( \ aes_inv_shuf(t4, x0, x0); \ aes_inv_shuf(t4, x7, x7); \ aes_inv_shuf(t4, x1, x1); \ aes_inv_shuf(t4, x4, x4); \ aes_inv_shuf(t4, x2, x2); \ aes_inv_shuf(t4, x5, x5); \ aes_inv_shuf(t4, x3, x3); \ aes_inv_shuf(t4, x6, x6); \ ) \ \ /* prefilter sboxes 1, 2 and 3 */ \ load_frequent_const(pre_tf_lo_s4, t2); \ load_frequent_const(pre_tf_hi_s4, t3); \ filter_8bit(x0, t0, t1, t7, t6); \ filter_8bit(x7, t0, t1, t7, t6); \ filter_8bit(x1, t0, t1, t7, t6); \ filter_8bit(x4, t0, t1, t7, t6); \ filter_8bit(x2, t0, t1, t7, t6); \ filter_8bit(x5, t0, t1, t7, t6); \ \ /* prefilter sbox 4 */ \ if_not_aes_subbytes(load_zero(t4);) \ filter_8bit(x3, t2, t3, t7, t6); \ filter_8bit(x6, t2, t3, t7, t6); \ \ /* AES subbytes + AES shift rows */ \ load_frequent_const(post_tf_lo_s1, t0); \ load_frequent_const(post_tf_hi_s1, t1); \ if_not_aes_subbytes( \ aes_subbytes_and_shuf_and_xor(t4, x0, x0); \ aes_subbytes_and_shuf_and_xor(t4, x7, x7); \ aes_subbytes_and_shuf_and_xor(t4, x1, x1); \ aes_subbytes_and_shuf_and_xor(t4, x4, x4); \ aes_subbytes_and_shuf_and_xor(t4, x2, x2); \ aes_subbytes_and_shuf_and_xor(t4, x5, x5); \ aes_subbytes_and_shuf_and_xor(t4, x3, x3); \ aes_subbytes_and_shuf_and_xor(t4, x6, x6); \ ) \ if_aes_subbytes( \ aes_subbytes(x0, x0); \ aes_subbytes(x7, x7); \ aes_subbytes(x1, x1); \ aes_subbytes(x4, x4); \ aes_subbytes(x2, x2); \ aes_subbytes(x5, x5); \ aes_subbytes(x3, x3); \ aes_subbytes(x6, x6); \ ) \ \ /* postfilter sboxes 1 and 4 */ \ load_frequent_const(post_tf_lo_s3, t2); \ load_frequent_const(post_tf_hi_s3, t3); \ filter_8bit(x0, t0, t1, t7, t6); \ filter_8bit(x7, t0, t1, t7, t6); \ filter_8bit(x3, t0, t1, t7, t6); \ filter_8bit(x6, t0, t1, t7, t6); \ \ /* postfilter sbox 3 */ \ load_frequent_const(post_tf_lo_s2, t4); \ load_frequent_const(post_tf_hi_s2, t5); \ filter_8bit(x2, t2, t3, t7, t6); \ filter_8bit(x5, t2, t3, t7, t6); \ \ vmovq128((key), t0); \ \ /* postfilter sbox 2 */ \ filter_8bit(x1, t4, t5, t7, t2); \ filter_8bit(x4, t4, t5, t7, t2); \ \ /* P-function */ \ vpxor128(x5, x0, x0); \ vpxor128(x6, x1, x1); \ vpxor128(x7, x2, x2); \ vpxor128(x4, x3, x3); \ \ vpxor128(x2, x4, x4); \ vpxor128(x3, x5, x5); \ vpxor128(x0, x6, x6); \ vpxor128(x1, x7, x7); \ \ vpxor128(x7, x0, x0); \ vpxor128(x4, x1, x1); \ vpxor128(x5, x2, x2); \ vpxor128(x6, x3, x3); \ \ vpxor128(x3, x4, x4); \ vpxor128(x0, x5, x5); \ vpxor128(x1, x6, x6); \ vpxor128(x2, x7, x7); /* note: high and low parts swapped */ \ \ /* Add key material and result to CD (x becomes new CD) */ \ \ vpshufb128(bcast[7], t0, t7); \ vpshufb128(bcast[6], t0, t6); \ vpshufb128(bcast[5], t0, t5); \ vpshufb128(bcast[4], t0, t4); \ vpshufb128(bcast[3], t0, t3); \ vpshufb128(bcast[2], t0, t2); \ vpshufb128(bcast[1], t0, t1); \ \ vpxor128(t3, x4, x4); \ vpxor128(mem_cd[0], x4, x4); \ \ load_zero(t3); \ vpshufb128(t3, t0, t0); \ \ vpxor128(t2, x5, x5); \ vpxor128(mem_cd[1], x5, x5); \ \ vpxor128(t1, x6, x6); \ vpxor128(mem_cd[2], x6, x6); \ \ vpxor128(t0, x7, x7); \ vpxor128(mem_cd[3], x7, x7); \ \ vpxor128(t7, x0, x0); \ vpxor128(mem_cd[4], x0, x0); \ \ vpxor128(t6, x1, x1); \ vpxor128(mem_cd[5], x1, x1); \ \ vpxor128(t5, x2, x2); \ vpxor128(mem_cd[6], x2, x2); \ \ vpxor128(t4, x3, x3); \ vpxor128(mem_cd[7], x3, x3); /* * IN/OUT: * x0..x7: byte-sliced AB state preloaded * mem_ab: byte-sliced AB state in memory * mem_cb: byte-sliced CD state in memory */ #define two_roundsm16(x0, x1, x2, x3, x4, x5, x6, x7, y0, y1, y2, y3, y4, y5, \ y6, y7, mem_ab, mem_cd, i, dir, store_ab) \ roundsm16(x0, x1, x2, x3, x4, x5, x6, x7, y0, y1, y2, y3, y4, y5, \ y6, y7, mem_cd, ctx->key_table[(i)]); \ \ vmovdqa128(x4, mem_cd[0]); \ vmovdqa128(x5, mem_cd[1]); \ vmovdqa128(x6, mem_cd[2]); \ vmovdqa128(x7, mem_cd[3]); \ vmovdqa128(x0, mem_cd[4]); \ vmovdqa128(x1, mem_cd[5]); \ vmovdqa128(x2, mem_cd[6]); \ vmovdqa128(x3, mem_cd[7]); \ \ roundsm16(x4, x5, x6, x7, x0, x1, x2, x3, y0, y1, y2, y3, y4, y5, \ y6, y7, mem_ab, ctx->key_table[(i) + (dir)]); \ \ store_ab(x0, x1, x2, x3, x4, x5, x6, x7, mem_ab); #define dummy_store(x0, x1, x2, x3, x4, x5, x6, x7, mem_ab) /* do nothing */ #define store_ab_state(x0, x1, x2, x3, x4, x5, x6, x7, mem_ab) \ /* Store new AB state */ \ vmovdqa128(x0, mem_ab[0]); \ vmovdqa128(x1, mem_ab[1]); \ vmovdqa128(x2, mem_ab[2]); \ vmovdqa128(x3, mem_ab[3]); \ vmovdqa128(x4, mem_ab[4]); \ vmovdqa128(x5, mem_ab[5]); \ vmovdqa128(x6, mem_ab[6]); \ vmovdqa128(x7, mem_ab[7]); #define enc_rounds16(x0, x1, x2, x3, x4, x5, x6, x7, y0, y1, y2, y3, y4, y5, \ y6, y7, mem_ab, mem_cd, i) \ two_roundsm16(x0, x1, x2, x3, x4, x5, x6, x7, y0, y1, y2, y3, y4, y5, \ y6, y7, mem_ab, mem_cd, (i) + 2, 1, store_ab_state); \ two_roundsm16(x0, x1, x2, x3, x4, x5, x6, x7, y0, y1, y2, y3, y4, y5, \ y6, y7, mem_ab, mem_cd, (i) + 4, 1, store_ab_state); \ two_roundsm16(x0, x1, x2, x3, x4, x5, x6, x7, y0, y1, y2, y3, y4, y5, \ y6, y7, mem_ab, mem_cd, (i) + 6, 1, dummy_store); #define dec_rounds16(x0, x1, x2, x3, x4, x5, x6, x7, y0, y1, y2, y3, y4, y5, \ y6, y7, mem_ab, mem_cd, i) \ two_roundsm16(x0, x1, x2, x3, x4, x5, x6, x7, y0, y1, y2, y3, y4, y5, \ y6, y7, mem_ab, mem_cd, (i) + 7, -1, store_ab_state); \ two_roundsm16(x0, x1, x2, x3, x4, x5, x6, x7, y0, y1, y2, y3, y4, y5, \ y6, y7, mem_ab, mem_cd, (i) + 5, -1, store_ab_state); \ two_roundsm16(x0, x1, x2, x3, x4, x5, x6, x7, y0, y1, y2, y3, y4, y5, \ y6, y7, mem_ab, mem_cd, (i) + 3, -1, dummy_store); #define LE64_LO32(x) ((x) & 0xffffffffU) #define LE64_HI32(x) ((x >> 32) & 0xffffffffU) /* * IN: * v0..3: byte-sliced 32-bit integers * OUT: * v0..3: (IN <<< 1) */ #define rol32_1_16(v0, v1, v2, v3, t0, t1, t2, zero) \ if_vpsrlb128(vpsrlb128(7, v0, t0)); \ if_not_vpsrlb128(vpcmpgtb128(v0, zero, t0)); \ vpaddb128(v0, v0, v0); \ if_not_vpsrlb128(vpabsb128(t0, t0)); \ \ if_vpsrlb128(vpsrlb128(7, v1, t1)); \ if_not_vpsrlb128(vpcmpgtb128(v1, zero, t1)); \ vpaddb128(v1, v1, v1); \ if_not_vpsrlb128(vpabsb128(t1, t1)); \ \ if_vpsrlb128(vpsrlb128(7, v2, t2)); \ if_not_vpsrlb128(vpcmpgtb128(v2, zero, t2)); \ vpaddb128(v2, v2, v2); \ if_not_vpsrlb128(vpabsb128(t2, t2)); \ \ vpor128(t0, v1, v1); \ \ if_vpsrlb128(vpsrlb128(7, v3, t0)); \ if_not_vpsrlb128(vpcmpgtb128(v3, zero, t0)); \ vpaddb128(v3, v3, v3); \ if_not_vpsrlb128(vpabsb128(t0, t0)); \ \ vpor128(t1, v2, v2); \ vpor128(t2, v3, v3); \ vpor128(t0, v0, v0); /* * IN: * r: byte-sliced AB state in memory * l: byte-sliced CD state in memory * OUT: * x0..x7: new byte-sliced CD state */ #define fls16(l, l0, l1, l2, l3, l4, l5, l6, l7, r, t0, t1, t2, t3, tt0, \ tt1, tt2, tt3, kl, kr) \ /* \ * t0 = kll; \ * t0 &= ll; \ * lr ^= rol32(t0, 1); \ */ \ load_zero(tt0); \ vmovd128(LE64_LO32(*(kl)), t0); \ vpshufb128(tt0, t0, t3); \ vpshufb128(bcast[1], t0, t2); \ vpshufb128(bcast[2], t0, t1); \ vpshufb128(bcast[3], t0, t0); \ \ vpand128(l0, t0, t0); \ vpand128(l1, t1, t1); \ vpand128(l2, t2, t2); \ vpand128(l3, t3, t3); \ \ rol32_1_16(t3, t2, t1, t0, tt1, tt2, tt3, tt0); \ \ vpxor128(l4, t0, l4); \ vmovdqa128(l4, l[4]); \ vpxor128(l5, t1, l5); \ vmovdqa128(l5, l[5]); \ vpxor128(l6, t2, l6); \ vmovdqa128(l6, l[6]); \ vpxor128(l7, t3, l7); \ vmovdqa128(l7, l[7]); \ \ /* \ * t2 = krr; \ * t2 |= rr; \ * rl ^= t2; \ */ \ \ vmovd128(LE64_HI32(*(kr)), t0); \ vpshufb128(tt0, t0, t3); \ vpshufb128(bcast[1], t0, t2); \ vpshufb128(bcast[2], t0, t1); \ vpshufb128(bcast[3], t0, t0); \ \ vpor128(r[4], t0, t0); \ vpor128(r[5], t1, t1); \ vpor128(r[6], t2, t2); \ vpor128(r[7], t3, t3); \ \ vpxor128(r[0], t0, t0); \ vpxor128(r[1], t1, t1); \ vpxor128(r[2], t2, t2); \ vpxor128(r[3], t3, t3); \ vmovdqa128(t0, r[0]); \ vmovdqa128(t1, r[1]); \ vmovdqa128(t2, r[2]); \ vmovdqa128(t3, r[3]); \ \ /* \ * t2 = krl; \ * t2 &= rl; \ * rr ^= rol32(t2, 1); \ */ \ vmovd128(LE64_LO32(*(kr)), t0); \ vpshufb128(tt0, t0, t3); \ vpshufb128(bcast[1], t0, t2); \ vpshufb128(bcast[2], t0, t1); \ vpshufb128(bcast[3], t0, t0); \ \ vpand128(r[0], t0, t0); \ vpand128(r[1], t1, t1); \ vpand128(r[2], t2, t2); \ vpand128(r[3], t3, t3); \ \ rol32_1_16(t3, t2, t1, t0, tt1, tt2, tt3, tt0); \ \ vpxor128(r[4], t0, t0); \ vpxor128(r[5], t1, t1); \ vpxor128(r[6], t2, t2); \ vpxor128(r[7], t3, t3); \ vmovdqa128(t0, r[4]); \ vmovdqa128(t1, r[5]); \ vmovdqa128(t2, r[6]); \ vmovdqa128(t3, r[7]); \ \ /* \ * t0 = klr; \ * t0 |= lr; \ * ll ^= t0; \ */ \ \ vmovd128(LE64_HI32(*(kl)), t0); \ vpshufb128(tt0, t0, t3); \ vpshufb128(bcast[1], t0, t2); \ vpshufb128(bcast[2], t0, t1); \ vpshufb128(bcast[3], t0, t0); \ \ vpor128(l4, t0, t0); \ vpor128(l5, t1, t1); \ vpor128(l6, t2, t2); \ vpor128(l7, t3, t3); \ \ vpxor128(l0, t0, l0); \ vmovdqa128(l0, l[0]); \ vpxor128(l1, t1, l1); \ vmovdqa128(l1, l[1]); \ vpxor128(l2, t2, l2); \ vmovdqa128(l2, l[2]); \ vpxor128(l3, t3, l3); \ vmovdqa128(l3, l[3]); #define byteslice_16x16b_fast(a0, b0, c0, d0, a1, b1, c1, d1, a2, b2, c2, d2, \ a3, b3, c3, d3, st0, st1) \ vmovdqa128(d2, st0); \ vmovdqa128(d3, st1); \ transpose_4x4(a0, a1, a2, a3, d2, d3); \ transpose_4x4(b0, b1, b2, b3, d2, d3); \ vmovdqa128(st0, d2); \ vmovdqa128(st1, d3); \ \ vmovdqa128(a0, st0); \ vmovdqa128(a1, st1); \ transpose_4x4(c0, c1, c2, c3, a0, a1); \ transpose_4x4(d0, d1, d2, d3, a0, a1); \ \ vmovdqa128(shufb_16x16b_stack, a0); \ vmovdqa128(st1, a1); \ vpshufb128(a0, a2, a2); \ vpshufb128(a0, a3, a3); \ vpshufb128(a0, b0, b0); \ vpshufb128(a0, b1, b1); \ vpshufb128(a0, b2, b2); \ vpshufb128(a0, b3, b3); \ vpshufb128(a0, a1, a1); \ vpshufb128(a0, c0, c0); \ vpshufb128(a0, c1, c1); \ vpshufb128(a0, c2, c2); \ vpshufb128(a0, c3, c3); \ vpshufb128(a0, d0, d0); \ vpshufb128(a0, d1, d1); \ vpshufb128(a0, d2, d2); \ vpshufb128(a0, d3, d3); \ vmovdqa128(d3, st1); \ vmovdqa128(st0, d3); \ vpshufb128(a0, d3, a0); \ vmovdqa128(d2, st0); \ \ transpose_4x4(a0, b0, c0, d0, d2, d3); \ transpose_4x4(a1, b1, c1, d1, d2, d3); \ vmovdqa128(st0, d2); \ vmovdqa128(st1, d3); \ \ vmovdqa128(b0, st0); \ vmovdqa128(b1, st1); \ transpose_4x4(a2, b2, c2, d2, b0, b1); \ transpose_4x4(a3, b3, c3, d3, b0, b1); \ vmovdqa128(st0, b0); \ vmovdqa128(st1, b1); \ /* does not adjust output bytes inside vectors */ /* load blocks to registers and apply pre-whitening */ #define inpack16_pre(x0, x1, x2, x3, x4, x5, x6, x7, y0, y1, y2, y3, y4, y5, \ y6, y7, rio, key) \ vmovq128((key), x0); \ vpshufb128(pack_bswap_stack, x0, x0); \ \ vpxor128_memld((rio) + 0 * 16, x0, y7); \ vpxor128_memld((rio) + 1 * 16, x0, y6); \ vpxor128_memld((rio) + 2 * 16, x0, y5); \ vpxor128_memld((rio) + 3 * 16, x0, y4); \ vpxor128_memld((rio) + 4 * 16, x0, y3); \ vpxor128_memld((rio) + 5 * 16, x0, y2); \ vpxor128_memld((rio) + 6 * 16, x0, y1); \ vpxor128_memld((rio) + 7 * 16, x0, y0); \ vpxor128_memld((rio) + 8 * 16, x0, x7); \ vpxor128_memld((rio) + 9 * 16, x0, x6); \ vpxor128_memld((rio) + 10 * 16, x0, x5); \ vpxor128_memld((rio) + 11 * 16, x0, x4); \ vpxor128_memld((rio) + 12 * 16, x0, x3); \ vpxor128_memld((rio) + 13 * 16, x0, x2); \ vpxor128_memld((rio) + 14 * 16, x0, x1); \ vpxor128_memld((rio) + 15 * 16, x0, x0); /* byteslice pre-whitened blocks and store to temporary memory */ #define inpack16_post(x0, x1, x2, x3, x4, x5, x6, x7, y0, y1, y2, y3, y4, y5, \ y6, y7, mem_ab, mem_cd) \ byteslice_16x16b_fast(x0, x1, x2, x3, x4, x5, x6, x7, y0, y1, y2, y3, \ y4, y5, y6, y7, mem_ab[0], mem_cd[0]); \ \ vmovdqa128(x0, mem_ab[0]); \ vmovdqa128(x1, mem_ab[1]); \ vmovdqa128(x2, mem_ab[2]); \ vmovdqa128(x3, mem_ab[3]); \ vmovdqa128(x4, mem_ab[4]); \ vmovdqa128(x5, mem_ab[5]); \ vmovdqa128(x6, mem_ab[6]); \ vmovdqa128(x7, mem_ab[7]); \ vmovdqa128(y0, mem_cd[0]); \ vmovdqa128(y1, mem_cd[1]); \ vmovdqa128(y2, mem_cd[2]); \ vmovdqa128(y3, mem_cd[3]); \ vmovdqa128(y4, mem_cd[4]); \ vmovdqa128(y5, mem_cd[5]); \ vmovdqa128(y6, mem_cd[6]); \ vmovdqa128(y7, mem_cd[7]); /* de-byteslice, apply post-whitening and store blocks */ #define outunpack16(x0, x1, x2, x3, x4, x5, x6, x7, y0, y1, y2, y3, y4, \ y5, y6, y7, key, stack_tmp0, stack_tmp1) \ byteslice_16x16b_fast(y0, y4, x0, x4, y1, y5, x1, x5, y2, y6, x2, x6, \ y3, y7, x3, x7, stack_tmp0, stack_tmp1); \ \ vmovdqa128(x0, stack_tmp0); \ \ vmovq128((key), x0); \ vpshufb128(pack_bswap_stack, x0, x0); \ \ vpxor128(x0, y7, y7); \ vpxor128(x0, y6, y6); \ vpxor128(x0, y5, y5); \ vpxor128(x0, y4, y4); \ vpxor128(x0, y3, y3); \ vpxor128(x0, y2, y2); \ vpxor128(x0, y1, y1); \ vpxor128(x0, y0, y0); \ vpxor128(x0, x7, x7); \ vpxor128(x0, x6, x6); \ vpxor128(x0, x5, x5); \ vpxor128(x0, x4, x4); \ vpxor128(x0, x3, x3); \ vpxor128(x0, x2, x2); \ vpxor128(x0, x1, x1); \ vpxor128(stack_tmp0, x0, x0); #define write_output(x0, x1, x2, x3, x4, x5, x6, x7, y0, y1, y2, y3, y4, y5, \ y6, y7, rio) \ vmovdqu128_memst(x0, (rio) + 0 * 16); \ vmovdqu128_memst(x1, (rio) + 1 * 16); \ vmovdqu128_memst(x2, (rio) + 2 * 16); \ vmovdqu128_memst(x3, (rio) + 3 * 16); \ vmovdqu128_memst(x4, (rio) + 4 * 16); \ vmovdqu128_memst(x5, (rio) + 5 * 16); \ vmovdqu128_memst(x6, (rio) + 6 * 16); \ vmovdqu128_memst(x7, (rio) + 7 * 16); \ vmovdqu128_memst(y0, (rio) + 8 * 16); \ vmovdqu128_memst(y1, (rio) + 9 * 16); \ vmovdqu128_memst(y2, (rio) + 10 * 16); \ vmovdqu128_memst(y3, (rio) + 11 * 16); \ vmovdqu128_memst(y4, (rio) + 12 * 16); \ vmovdqu128_memst(y5, (rio) + 13 * 16); \ vmovdqu128_memst(y6, (rio) + 14 * 16); \ vmovdqu128_memst(y7, (rio) + 15 * 16); /********************************************************************** macros for defining constant vectors **********************************************************************/ #define SWAP_LE64(x) (x) #define M128I_BYTE(a0, a1, a2, a3, a4, a5, a6, a7, b0, b1, b2, b3, b4, b5, b6, b7) \ { \ SWAP_LE64((((a0) & 0xffULL) << 0) | \ (((a1) & 0xffULL) << 8) | \ (((a2) & 0xffULL) << 16) | \ (((a3) & 0xffULL) << 24) | \ (((a4) & 0xffULL) << 32) | \ (((a5) & 0xffULL) << 40) | \ (((a6) & 0xffULL) << 48) | \ (((a7) & 0xffULL) << 56)), \ SWAP_LE64((((b0) & 0xffULL) << 0) | \ (((b1) & 0xffULL) << 8) | \ (((b2) & 0xffULL) << 16) | \ (((b3) & 0xffULL) << 24) | \ (((b4) & 0xffULL) << 32) | \ (((b5) & 0xffULL) << 40) | \ (((b6) & 0xffULL) << 48) | \ (((b7) & 0xffULL) << 56)) \ } #define M128I_U32(a0, a1, b0, b1) \ { \ SWAP_LE64((((a0) & 0xffffffffULL) << 0) | \ (((a1) & 0xffffffffULL) << 32)), \ SWAP_LE64((((b0) & 0xffffffffULL) << 0) | \ (((b1) & 0xffffffffULL) << 32)) \ } #define M128I_REP16(x) { (0x0101010101010101ULL * (x)), (0x0101010101010101ULL * (x)) } #define SHUFB_BYTES(idx) \ (((0 + (idx)) << 0) | ((4 + (idx)) << 8) | \ ((8 + (idx)) << 16) | ((12 + (idx)) << 24)) typedef u64 uint64_unaligned_t __attribute__((aligned(1), may_alias)); static const __m128i shufb_16x16b = M128I_U32(SHUFB_BYTES(0), SHUFB_BYTES(1), SHUFB_BYTES(2), SHUFB_BYTES(3)); static const __m128i pack_bswap = M128I_U32(0x00010203, 0x04050607, 0x0f0f0f0f, 0x0f0f0f0f); static const __m128i bcast[8] = { M128I_REP16(0), M128I_REP16(1), M128I_REP16(2), M128I_REP16(3), M128I_REP16(4), M128I_REP16(5), M128I_REP16(6), M128I_REP16(7) }; /* * pre-SubByte transform * * pre-lookup for sbox1, sbox2, sbox3: * swap_bitendianness( * isom_map_camellia_to_aes( * camellia_f( * swap_bitendianess(in) * ) * ) * ) * * (note: '⊕ 0xc5' inside camellia_f()) */ static const __m128i pre_tf_lo_s1 = M128I_BYTE(0x45, 0xe8, 0x40, 0xed, 0x2e, 0x83, 0x2b, 0x86, 0x4b, 0xe6, 0x4e, 0xe3, 0x20, 0x8d, 0x25, 0x88); static const __m128i pre_tf_hi_s1 = M128I_BYTE(0x00, 0x51, 0xf1, 0xa0, 0x8a, 0xdb, 0x7b, 0x2a, 0x09, 0x58, 0xf8, 0xa9, 0x83, 0xd2, 0x72, 0x23); /* * pre-SubByte transform * * pre-lookup for sbox4: * swap_bitendianness( * isom_map_camellia_to_aes( * camellia_f( * swap_bitendianess(in <<< 1) * ) * ) * ) * * (note: '⊕ 0xc5' inside camellia_f()) */ static const __m128i pre_tf_lo_s4 = M128I_BYTE(0x45, 0x40, 0x2e, 0x2b, 0x4b, 0x4e, 0x20, 0x25, 0x14, 0x11, 0x7f, 0x7a, 0x1a, 0x1f, 0x71, 0x74); static const __m128i pre_tf_hi_s4 = M128I_BYTE(0x00, 0xf1, 0x8a, 0x7b, 0x09, 0xf8, 0x83, 0x72, 0xad, 0x5c, 0x27, 0xd6, 0xa4, 0x55, 0x2e, 0xdf); /* * post-SubByte transform * * post-lookup for sbox1, sbox4: * swap_bitendianness( * camellia_h( * isom_map_aes_to_camellia( * swap_bitendianness( * aes_inverse_affine_transform(in) * ) * ) * ) * ) * * (note: '⊕ 0x6e' inside camellia_h()) */ static const __m128i post_tf_lo_s1 = M128I_BYTE(0x3c, 0xcc, 0xcf, 0x3f, 0x32, 0xc2, 0xc1, 0x31, 0xdc, 0x2c, 0x2f, 0xdf, 0xd2, 0x22, 0x21, 0xd1); static const __m128i post_tf_hi_s1 = M128I_BYTE(0x00, 0xf9, 0x86, 0x7f, 0xd7, 0x2e, 0x51, 0xa8, 0xa4, 0x5d, 0x22, 0xdb, 0x73, 0x8a, 0xf5, 0x0c); /* * post-SubByte transform * * post-lookup for sbox2: * swap_bitendianness( * camellia_h( * isom_map_aes_to_camellia( * swap_bitendianness( * aes_inverse_affine_transform(in) * ) * ) * ) * ) <<< 1 * * (note: '⊕ 0x6e' inside camellia_h()) */ static const __m128i post_tf_lo_s2 = M128I_BYTE(0x78, 0x99, 0x9f, 0x7e, 0x64, 0x85, 0x83, 0x62, 0xb9, 0x58, 0x5e, 0xbf, 0xa5, 0x44, 0x42, 0xa3); static const __m128i post_tf_hi_s2 = M128I_BYTE(0x00, 0xf3, 0x0d, 0xfe, 0xaf, 0x5c, 0xa2, 0x51, 0x49, 0xba, 0x44, 0xb7, 0xe6, 0x15, 0xeb, 0x18); /* * post-SubByte transform * * post-lookup for sbox3: * swap_bitendianness( * camellia_h( * isom_map_aes_to_camellia( * swap_bitendianness( * aes_inverse_affine_transform(in) * ) * ) * ) * ) >>> 1 * * (note: '⊕ 0x6e' inside camellia_h()) */ static const __m128i post_tf_lo_s3 = M128I_BYTE(0x1e, 0x66, 0xe7, 0x9f, 0x19, 0x61, 0xe0, 0x98, 0x6e, 0x16, 0x97, 0xef, 0x69, 0x11, 0x90, 0xe8); static const __m128i post_tf_hi_s3 = M128I_BYTE(0x00, 0xfc, 0x43, 0xbf, 0xeb, 0x17, 0xa8, 0x54, 0x52, 0xae, 0x11, 0xed, 0xb9, 0x45, 0xfa, 0x06); /* For isolating SubBytes from AESENCLAST, inverse shift row */ static const __m128i inv_shift_row = M128I_BYTE(0x00, 0x0d, 0x0a, 0x07, 0x04, 0x01, 0x0e, 0x0b, 0x08, 0x05, 0x02, 0x0f, 0x0c, 0x09, 0x06, 0x03); /* 4-bit mask */ static const __m128i mask_0f = M128I_U32(0x0f0f0f0f, 0x0f0f0f0f, 0x0f0f0f0f, 0x0f0f0f0f); /* Encrypts 16 input block from IN and writes result to OUT. IN and OUT may * unaligned pointers. */ void ASM_FUNC_ATTR_NOINLINE FUNC_ENC_BLK16(const void *key_table, void *vout, const void *vin, int key_length) { const struct enc_ctx_s { const u64 *key_table; int key_length; } sctx = { .key_table = (const u64 *)key_table, .key_length = key_length }; const struct enc_ctx_s *ctx = &sctx; char *out = vout; const char *in = vin; __m128i x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15; __m128i ab[8]; __m128i cd[8]; __m128i tmp0, tmp1; unsigned int lastk, k; frequent_constants_declare; prepare_frequent_constants(); if (ctx->key_length > 16) lastk = 32; else lastk = 24; inpack16_pre(x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, in, ctx->key_table[0]); inpack16_post(x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, ab, cd); k = 0; while (1) { enc_rounds16(x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, ab, cd, k); if (k == lastk - 8) break; fls16(ab, x0, x1, x2, x3, x4, x5, x6, x7, cd, x8, x9, x10, x11, x12, x13, x14, x15, &ctx->key_table[k + 8], &ctx->key_table[k + 9]); k += 8; } /* load CD for output */ vmovdqa128(cd[0], x8); vmovdqa128(cd[1], x9); vmovdqa128(cd[2], x10); vmovdqa128(cd[3], x11); vmovdqa128(cd[4], x12); vmovdqa128(cd[5], x13); vmovdqa128(cd[6], x14); vmovdqa128(cd[7], x15); outunpack16(x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, ctx->key_table[lastk], tmp0, tmp1); write_output(x7, x6, x5, x4, x3, x2, x1, x0, x15, x14, x13, x12, x11, x10, x9, x8, out); } /* Decrypts 16 input block from IN and writes result to OUT. IN and OUT may * unaligned pointers. */ void ASM_FUNC_ATTR_NOINLINE FUNC_DEC_BLK16(const void *key_table, void *vout, const void *vin, int key_length) { const struct dec_ctx_s { const u64 *key_table; int key_length; } sctx = { .key_table = (const u64 *)key_table, .key_length = key_length }; const struct dec_ctx_s *ctx = &sctx; char *out = vout; const char *in = vin; __m128i x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15; __m128i ab[8]; __m128i cd[8]; __m128i tmp0, tmp1; unsigned int firstk, k; frequent_constants_declare; prepare_frequent_constants(); if (ctx->key_length > 16) firstk = 32; else firstk = 24; inpack16_pre(x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, in, ctx->key_table[firstk]); inpack16_post(x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, ab, cd); k = firstk - 8; while (1) { dec_rounds16(x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, ab, cd, k); if (k == 0) break; fls16(ab, x0, x1, x2, x3, x4, x5, x6, x7, cd, x8, x9, x10, x11, x12, x13, x14, x15, &ctx->key_table[k + 1], &ctx->key_table[k]); k -= 8; } /* load CD for output */ vmovdqa128(cd[0], x8); vmovdqa128(cd[1], x9); vmovdqa128(cd[2], x10); vmovdqa128(cd[3], x11); vmovdqa128(cd[4], x12); vmovdqa128(cd[5], x13); vmovdqa128(cd[6], x14); vmovdqa128(cd[7], x15); outunpack16(x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, ctx->key_table[0], tmp0, tmp1); write_output(x7, x6, x5, x4, x3, x2, x1, x0, x15, x14, x13, x12, x11, x10, x9, x8, out); } /********* Key setup **********************************************************/ /* * Camellia F-function, 1-way SIMD/AESNI. * * IN: * ab: 64-bit AB state * cd: 64-bit CD state */ #define camellia_f(ab, x, t0, t1, t2, t3, t4, inv_shift_row, sbox4mask, \ _0f0f0f0fmask, pre_s1lo_mask, pre_s1hi_mask, key) \ vmovq128((key), t0); \ load_zero(t3); \ \ vpxor128(ab, t0, x); \ \ /* \ * S-function with AES subbytes \ */ \ \ /* input rotation for sbox4 (<<< 1) */ \ vpand128(x, sbox4mask, t0); \ vpandn128(x, sbox4mask, x); \ vpaddb128(t0, t0, t1); \ vpsrl_byte_128(7, t0, t0); \ vpor128(t0, t1, t0); \ vpand128(sbox4mask, t0, t0); \ vpor128(t0, x, x); \ \ vmovdqa128_memld(&post_tf_lo_s1, t0); \ vmovdqa128_memld(&post_tf_hi_s1, t1); \ \ /* prefilter sboxes */ \ filter_8bit(x, pre_s1lo_mask, pre_s1hi_mask, _0f0f0f0fmask, t2); \ \ /* AES subbytes + AES shift rows + AES inv shift rows */ \ aes_subbytes_and_shuf_and_xor(t3, x, x); \ \ /* postfilter sboxes */ \ filter_8bit(x, t0, t1, _0f0f0f0fmask, t2); \ \ /* output rotation for sbox2 (<<< 1) */ \ /* output rotation for sbox3 (>>> 1) */ \ aes_inv_shuf(inv_shift_row, x, t1); \ vpshufb128_amemld(&sp0044440444044404mask, x, t4); \ vpshufb128_amemld(&sp1110111010011110mask, x, x); \ vpaddb128(t1, t1, t2); \ vpsrl_byte_128(7, t1, t0); \ vpsll_byte_128(7, t1, t3); \ vpor128(t0, t2, t0); \ vpsrl_byte_128(1, t1, t1); \ vpshufb128_amemld(&sp0222022222000222mask, t0, t0); \ vpor128(t1, t3, t1); \ \ vpxor128(x, t4, t4); \ vpshufb128_amemld(&sp3033303303303033mask, t1, t1); \ vpxor128(t4, t0, t0); \ vpxor128(t1, t0, t0); \ vpsrldq128(8, t0, x); \ vpxor128(t0, x, x); \ #define vec_rol128(in, out, nrol, t0) \ vpshufd128_0x4e(in, out); \ vpsllq128((nrol), in, t0); \ vpsrlq128((64-(nrol)), out, out); \ vpaddb128(t0, out, out); #define vec_ror128(in, out, nror, t0) \ vpshufd128_0x4e(in, out); \ vpsrlq128((nror), in, t0); \ vpsllq128((64-(nror)), out, out); \ vpaddb128(t0, out, out); #define U64_BYTE(a0, a1, a2, a3, b0, b1, b2, b3) \ ( \ SWAP_LE64((((a0) & 0xffULL) << 0) | \ (((a1) & 0xffULL) << 8) | \ (((a2) & 0xffULL) << 16) | \ (((a3) & 0xffULL) << 24) | \ (((b0) & 0xffULL) << 32) | \ (((b1) & 0xffULL) << 40) | \ (((b2) & 0xffULL) << 48) | \ (((b3) & 0xffULL) << 56)) \ ) #define U64_U32(a0, b0) \ ( \ SWAP_LE64((((a0) & 0xffffffffULL) << 0) | \ (((b0) & 0xffffffffULL) << 32)) \ ) static const __m128i bswap128_mask = M128I_BYTE(15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0); static const __m128i inv_shift_row_and_unpcklbw = M128I_BYTE(0x00, 0xff, 0x0d, 0xff, 0x0a, 0xff, 0x07, 0xff, 0x04, 0xff, 0x01, 0xff, 0x0e, 0xff, 0x0b, 0xff); static const __m128i sp0044440444044404mask = M128I_U32(0xffff0404, 0x0404ff04, 0x0d0dff0d, 0x0d0dff0d); static const __m128i sp1110111010011110mask = M128I_U32(0x000000ff, 0x000000ff, 0x0bffff0b, 0x0b0b0bff); static const __m128i sp0222022222000222mask = M128I_U32(0xff060606, 0xff060606, 0x0c0cffff, 0xff0c0c0c); static const __m128i sp3033303303303033mask = M128I_U32(0x04ff0404, 0x04ff0404, 0xff0a0aff, 0x0aff0a0a); static const u64 sbox4_input_mask = U64_BYTE(0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00); static const u64 sigma1 = U64_U32(0x3BCC908B, 0xA09E667F); static const u64 sigma2 = U64_U32(0x4CAA73B2, 0xB67AE858); static const u64 sigma3 = U64_U32(0xE94F82BE, 0xC6EF372F); static const u64 sigma4 = U64_U32(0xF1D36F1C, 0x54FF53A5); static const u64 sigma5 = U64_U32(0xDE682D1D, 0x10E527FA); static const u64 sigma6 = U64_U32(0xB3E6C1FD, 0xB05688C2); #define cmll_sub(n, ctx) &ctx->key_table[n] static ASM_FUNC_ATTR_INLINE void camellia_setup128(void *key_table, __m128i x0) { struct setup128_ctx_s { u64 *key_table; } sctx = { .key_table = (u64 *)key_table }; struct setup128_ctx_s *ctx = &sctx; /* input: * ctx: subkey storage at key_table(CTX) * x0: key */ __m128i x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15; __m128i tmp0; #define KL128 x0 #define KA128 x2 vpshufb128_amemld(&bswap128_mask, KL128, KL128); vmovdqa128_memld(&inv_shift_row_and_unpcklbw, x11); vmovq128(sbox4_input_mask, x12); vmovdqa128_memld(&mask_0f, x13); vmovdqa128_memld(&pre_tf_lo_s1, x14); vmovdqa128_memld(&pre_tf_hi_s1, x15); /* * Generate KA */ vpsrldq128(8, KL128, x2); vmovdqa128(KL128, x3); vpslldq128(8, x3, x3); vpsrldq128(8, x3, x3); camellia_f(x2, x4, x1, x5, x6, x7, x8, x11, x12, x13, x14, x15, sigma1); vpxor128(x4, x3, x3); camellia_f(x3, x2, x1, x5, x6, x7, x8, x11, x12, x13, x14, x15, sigma2); camellia_f(x2, x3, x1, x5, x6, x7, x8, x11, x12, x13, x14, x15, sigma3); vpxor128(x4, x3, x3); camellia_f(x3, x4, x1, x5, x6, x7, x8, x11, x12, x13, x14, x15, sigma4); vpslldq128(8, x3, x3); vpxor128(x4, x2, x2); vpsrldq128(8, x3, x3); vpslldq128(8, x2, KA128); vpor128(x3, KA128, KA128); /* * Generate subkeys */ vmovdqu128_memst(KA128, cmll_sub(24, ctx)); vec_rol128(KL128, x3, 15, x15); vec_rol128(KA128, x4, 15, x15); vec_rol128(KA128, x5, 30, x15); vec_rol128(KL128, x6, 45, x15); vec_rol128(KA128, x7, 45, x15); vec_rol128(KL128, x8, 60, x15); vec_rol128(KA128, x9, 60, x15); vec_ror128(KL128, x10, 128-77, x15); /* absorb kw2 to other subkeys */ vpslldq128(8, KL128, x15); vpsrldq128(8, x15, x15); vpxor128(x15, KA128, KA128); vpxor128(x15, x3, x3); vpxor128(x15, x4, x4); /* subl(1) ^= subr(1) & ~subr(9); */ vpandn128(x15, x5, x13); vpslldq128(12, x13, x13); vpsrldq128(8, x13, x13); vpxor128(x13, x15, x15); /* dw = subl(1) & subl(9), subr(1) ^= CAMELLIA_RL1(dw); */ vpand128(x15, x5, x14); vpslld128(1, x14, x11); vpsrld128(31, x14, x14); vpaddb128(x11, x14, x14); vpslldq128(8, x14, x14); vpsrldq128(12, x14, x14); vpxor128(x14, x15, x15); vpxor128(x15, x6, x6); vpxor128(x15, x8, x8); vpxor128(x15, x9, x9); /* subl(1) ^= subr(1) & ~subr(17); */ vpandn128(x15, x10, x13); vpslldq128(12, x13, x13); vpsrldq128(8, x13, x13); vpxor128(x13, x15, x15); /* dw = subl(1) & subl(17), subr(1) ^= CAMELLIA_RL1(dw); */ vpand128(x15, x10, x14); vpslld128(1, x14, x11); vpsrld128(31, x14, x14); vpaddb128(x11, x14, x14); vpslldq128(8, x14, x14); vpsrldq128(12, x14, x14); vpxor128(x14, x15, x15); vpshufd128_0x1b(KL128, KL128); vpshufd128_0x1b(KA128, KA128); vpshufd128_0x1b(x3, x3); vpshufd128_0x1b(x4, x4); vpshufd128_0x1b(x5, x5); vpshufd128_0x1b(x6, x6); vpshufd128_0x1b(x7, x7); vpshufd128_0x1b(x8, x8); vpshufd128_0x1b(x9, x9); vpshufd128_0x1b(x10, x10); vmovdqu128_memst(KL128, cmll_sub(0, ctx)); vpshufd128_0x1b(KL128, KL128); vmovdqu128_memst(KA128, cmll_sub(2, ctx)); vmovdqu128_memst(x3, cmll_sub(4, ctx)); vmovdqu128_memst(x4, cmll_sub(6, ctx)); vmovdqu128_memst(x5, cmll_sub(8, ctx)); vmovdqu128_memst(x6, cmll_sub(10, ctx)); vpsrldq128(8, x8, x8); vmovq128_memst(x7, cmll_sub(12, ctx)); vmovq128_memst(x8, cmll_sub(13, ctx)); vmovdqu128_memst(x9, cmll_sub(14, ctx)); vmovdqu128_memst(x10, cmll_sub(16, ctx)); vmovdqu128_memld(cmll_sub(24, ctx), KA128); vec_ror128(KL128, x3, 128 - 94, x7); vec_ror128(KA128, x4, 128 - 94, x7); vec_ror128(KL128, x5, 128 - 111, x7); vec_ror128(KA128, x6, 128 - 111, x7); vpxor128(x15, x3, x3); vpxor128(x15, x4, x4); vpxor128(x15, x5, x5); vpslldq128(8, x15, x15); vpxor128(x15, x6, x6); /* absorb kw4 to other subkeys */ vpslldq128(8, x6, x15); vpxor128(x15, x5, x5); vpxor128(x15, x4, x4); vpxor128(x15, x3, x3); /* subl(25) ^= subr(25) & ~subr(16); */ vmovdqu128_memld(cmll_sub(16, ctx), tmp0); vpshufd128_0x1b(tmp0, x10); vpandn128(x15, x10, x13); vpslldq128(4, x13, x13); vpxor128(x13, x15, x15); /* dw = subl(25) & subl(16), subr(25) ^= CAMELLIA_RL1(dw); */ vpand128(x15, x10, x14); vpslld128(1, x14, x11); vpsrld128(31, x14, x14); vpaddb128(x11, x14, x14); vpsrldq128(12, x14, x14); vpslldq128(8, x14, x14); vpxor128(x14, x15, x15); vpshufd128_0x1b(x3, x3); vpshufd128_0x1b(x4, x4); vpshufd128_0x1b(x5, x5); vpshufd128_0x1b(x6, x6); vmovdqu128_memst(x3, cmll_sub(18, ctx)); vmovdqu128_memst(x4, cmll_sub(20, ctx)); vmovdqu128_memst(x5, cmll_sub(22, ctx)); vmovdqu128_memst(x6, cmll_sub(24, ctx)); vmovdqu128_memld(cmll_sub(14, ctx), tmp0); vpshufd128_0x1b(tmp0, x3); vmovdqu128_memld(cmll_sub(12, ctx), tmp0); vpshufd128_0x1b(tmp0, x4); vmovdqu128_memld(cmll_sub(10, ctx), tmp0); vpshufd128_0x1b(tmp0, x5); vmovdqu128_memld(cmll_sub(8, ctx), tmp0); vpshufd128_0x1b(tmp0, x6); vpxor128(x15, x3, x3); vpxor128(x15, x4, x4); vpxor128(x15, x5, x5); /* subl(25) ^= subr(25) & ~subr(8); */ vpandn128(x15, x6, x13); vpslldq128(4, x13, x13); vpxor128(x13, x15, x15); /* dw = subl(25) & subl(8), subr(25) ^= CAMELLIA_RL1(dw); */ vpand128(x15, x6, x14); vpslld128(1, x14, x11); vpsrld128(31, x14, x14); vpaddb128(x11, x14, x14); vpsrldq128(12, x14, x14); vpslldq128(8, x14, x14); vpxor128(x14, x15, x15); vpshufd128_0x1b(x3, x3); vpshufd128_0x1b(x4, x4); vpshufd128_0x1b(x5, x5); vmovdqu128_memst(x3, cmll_sub(14, ctx)); vmovdqu128_memst(x4, cmll_sub(12, ctx)); vmovdqu128_memst(x5, cmll_sub(10, ctx)); vmovdqu128_memld(cmll_sub(6, ctx), tmp0); vpshufd128_0x1b(tmp0, x6); vmovdqu128_memld(cmll_sub(4, ctx), tmp0); vpshufd128_0x1b(tmp0, x4); vmovdqu128_memld(cmll_sub(2, ctx), tmp0); vpshufd128_0x1b(tmp0, x2); vmovdqu128_memld(cmll_sub(0, ctx), tmp0); vpshufd128_0x1b(tmp0, x0); vpxor128(x15, x6, x6); vpxor128(x15, x4, x4); vpxor128(x15, x2, x2); vpxor128(x15, x0, x0); vpshufd128_0x1b(x6, x6); vpshufd128_0x1b(x4, x4); vpshufd128_0x1b(x2, x2); vpshufd128_0x1b(x0, x0); vpsrldq128(8, x2, x3); vpsrldq128(8, x4, x5); vpsrldq128(8, x6, x7); /* * key XOR is end of F-function. */ vpxor128(x2, x0, x0); vpxor128(x4, x2, x2); vmovq128_memst(x0, cmll_sub(0, ctx)); vmovq128_memst(x3, cmll_sub(2, ctx)); vpxor128(x5, x3, x3); vpxor128(x6, x4, x4); vpxor128(x7, x5, x5); vmovq128_memst(x2, cmll_sub(3, ctx)); vmovq128_memst(x3, cmll_sub(4, ctx)); vmovq128_memst(x4, cmll_sub(5, ctx)); vmovq128_memst(x5, cmll_sub(6, ctx)); vmovq128(*cmll_sub(7, ctx), x7); vmovq128(*cmll_sub(8, ctx), x8); vmovq128(*cmll_sub(9, ctx), x9); vmovq128(*cmll_sub(10, ctx), x10); /* tl = subl(10) ^ (subr(10) & ~subr(8)); */ vpandn128(x10, x8, x15); vpsrldq128(4, x15, x15); vpxor128(x15, x10, x0); /* dw = tl & subl(8), tr = subr(10) ^ CAMELLIA_RL1(dw); */ vpand128(x8, x0, x15); vpslld128(1, x15, x14); vpsrld128(31, x15, x15); vpaddb128(x14, x15, x15); vpslldq128(12, x15, x15); vpsrldq128(8, x15, x15); vpxor128(x15, x0, x0); vpxor128(x0, x6, x6); vmovq128_memst(x6, cmll_sub(7, ctx)); vmovq128(*cmll_sub(11, ctx), x11); vmovq128(*cmll_sub(12, ctx), x12); vmovq128(*cmll_sub(13, ctx), x13); vmovq128(*cmll_sub(14, ctx), x14); vmovq128(*cmll_sub(15, ctx), x15); /* tl = subl(7) ^ (subr(7) & ~subr(9)); */ vpandn128(x7, x9, x1); vpsrldq128(4, x1, x1); vpxor128(x1, x7, x0); /* dw = tl & subl(9), tr = subr(7) ^ CAMELLIA_RL1(dw); */ vpand128(x9, x0, x1); vpslld128(1, x1, x2); vpsrld128(31, x1, x1); vpaddb128(x2, x1, x1); vpslldq128(12, x1, x1); vpsrldq128(8, x1, x1); vpxor128(x1, x0, x0); vpxor128(x11, x0, x0); vpxor128(x12, x10, x10); vpxor128(x13, x11, x11); vpxor128(x14, x12, x12); vpxor128(x15, x13, x13); vmovq128_memst(x0, cmll_sub(10, ctx)); vmovq128_memst(x10, cmll_sub(11, ctx)); vmovq128_memst(x11, cmll_sub(12, ctx)); vmovq128_memst(x12, cmll_sub(13, ctx)); vmovq128_memst(x13, cmll_sub(14, ctx)); vmovq128(*cmll_sub(16, ctx), x6); vmovq128(*cmll_sub(17, ctx), x7); vmovq128(*cmll_sub(18, ctx), x8); vmovq128(*cmll_sub(19, ctx), x9); vmovq128(*cmll_sub(20, ctx), x10); /* tl = subl(18) ^ (subr(18) & ~subr(16)); */ vpandn128(x8, x6, x1); vpsrldq128(4, x1, x1); vpxor128(x1, x8, x0); /* dw = tl & subl(16), tr = subr(18) ^ CAMELLIA_RL1(dw); */ vpand128(x6, x0, x1); vpslld128(1, x1, x2); vpsrld128(31, x1, x1); vpaddb128(x2, x1, x1); vpslldq128(12, x1, x1); vpsrldq128(8, x1, x1); vpxor128(x1, x0, x0); vpxor128(x14, x0, x0); vmovq128_memst(x0, cmll_sub(15, ctx)); /* tl = subl(15) ^ (subr(15) & ~subr(17)); */ vpandn128(x15, x7, x1); vpsrldq128(4, x1, x1); vpxor128(x1, x15, x0); /* dw = tl & subl(17), tr = subr(15) ^ CAMELLIA_RL1(dw); */ vpand128(x7, x0, x1); vpslld128(1, x1, x2); vpsrld128(31, x1, x1); vpaddb128(x2, x1, x1); vpslldq128(12, x1, x1); vpsrldq128(8, x1, x1); vpxor128(x1, x0, x0); vmovq128(*cmll_sub(21, ctx), x1); vmovq128(*cmll_sub(22, ctx), x2); vmovq128(*cmll_sub(23, ctx), x3); vmovq128(*cmll_sub(24, ctx), x4); vpxor128(x9, x0, x0); vpxor128(x10, x8, x8); vpxor128(x1, x9, x9); vpxor128(x2, x10, x10); vpxor128(x3, x1, x1); vpxor128(x4, x3, x3); vmovq128_memst(x0, cmll_sub(18, ctx)); vmovq128_memst(x8, cmll_sub(19, ctx)); vmovq128_memst(x9, cmll_sub(20, ctx)); vmovq128_memst(x10, cmll_sub(21, ctx)); vmovq128_memst(x1, cmll_sub(22, ctx)); vmovq128_memst(x2, cmll_sub(23, ctx)); vmovq128_memst(x3, cmll_sub(24, ctx)); #undef KL128 #undef KA128 /* kw2 and kw4 are unused now. */ load_zero(tmp0); vmovq128_memst(tmp0, cmll_sub(1, ctx)); vmovq128_memst(tmp0, cmll_sub(25, ctx)); } static ASM_FUNC_ATTR_INLINE void camellia_setup256(void *key_table, __m128i x0, __m128i x1) { struct setup256_ctx_s { u64 *key_table; } sctx = { .key_table = (u64 *)key_table }; struct setup256_ctx_s *ctx = &sctx; /* input: * ctx: subkey storage at key_table(CTX) * x0, x1: key */ __m128i x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15; __m128i tmp0; #define KL128 x0 #define KR128 x1 #define KA128 x2 #define KB128 x3 vpshufb128_amemld(&bswap128_mask, KL128, KL128); vpshufb128_amemld(&bswap128_mask, KR128, KR128); vmovdqa128_memld(&inv_shift_row_and_unpcklbw, x11); vmovq128(*&sbox4_input_mask, x12); vmovdqa128_memld(&mask_0f, x13); vmovdqa128_memld(&pre_tf_lo_s1, x14); vmovdqa128_memld(&pre_tf_hi_s1, x15); /* * Generate KA */ vpxor128(KL128, KR128, x3); vpsrldq128(8, KR128, x6); vpsrldq128(8, x3, x2); vpslldq128(8, x3, x3); vpsrldq128(8, x3, x3); camellia_f(x2, x4, x5, x7, x8, x9, x10, x11, x12, x13, x14, x15, sigma1); vpxor128(x4, x3, x3); camellia_f(x3, x2, x5, x7, x8, x9, x10, x11, x12, x13, x14, x15, sigma2); vpxor128(x6, x2, x2); camellia_f(x2, x3, x5, x7, x8, x9, x10, x11, x12, x13, x14, x15, sigma3); vpxor128(x4, x3, x3); vpxor128(KR128, x3, x3); camellia_f(x3, x4, x5, x7, x8, x9, x10, x11, x12, x13, x14, x15, sigma4); vpslldq128(8, x3, x3); vpxor128(x4, x2, x2); vpsrldq128(8, x3, x3); vpslldq128(8, x2, KA128); vpor128(x3, KA128, KA128); /* * Generate KB */ vpxor128(KA128, KR128, x3); vpsrldq128(8, x3, x4); vpslldq128(8, x3, x3); vpsrldq128(8, x3, x3); camellia_f(x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, sigma5); vpxor128(x5, x3, x3); camellia_f(x3, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, sigma6); vpslldq128(8, x3, x3); vpxor128(x5, x4, x4); vpsrldq128(8, x3, x3); vpslldq128(8, x4, x4); vpor128(x3, x4, KB128); /* * Generate subkeys */ vmovdqu128_memst(KB128, cmll_sub(32, ctx)); vec_rol128(KR128, x4, 15, x15); vec_rol128(KA128, x5, 15, x15); vec_rol128(KR128, x6, 30, x15); vec_rol128(KB128, x7, 30, x15); vec_rol128(KL128, x8, 45, x15); vec_rol128(KA128, x9, 45, x15); vec_rol128(KL128, x10, 60, x15); vec_rol128(KR128, x11, 60, x15); vec_rol128(KB128, x12, 60, x15); /* absorb kw2 to other subkeys */ vpslldq128(8, KL128, x15); vpsrldq128(8, x15, x15); vpxor128(x15, KB128, KB128); vpxor128(x15, x4, x4); vpxor128(x15, x5, x5); /* subl(1) ^= subr(1) & ~subr(9); */ vpandn128(x15, x6, x13); vpslldq128(12, x13, x13); vpsrldq128(8, x13, x13); vpxor128(x13, x15, x15); /* dw = subl(1) & subl(9), subr(1) ^= CAMELLIA_RL1(dw); */ vpand128(x15, x6, x14); vpslld128(1, x14, x13); vpsrld128(31, x14, x14); vpaddb128(x13, x14, x14); vpslldq128(8, x14, x14); vpsrldq128(12, x14, x14); vpxor128(x14, x15, x15); vpxor128(x15, x7, x7); vpxor128(x15, x8, x8); vpxor128(x15, x9, x9); vpshufd128_0x1b(KL128, KL128); vpshufd128_0x1b(KB128, KB128); vpshufd128_0x1b(x4, x4); vpshufd128_0x1b(x5, x5); vpshufd128_0x1b(x6, x6); vpshufd128_0x1b(x7, x7); vpshufd128_0x1b(x8, x8); vpshufd128_0x1b(x9, x9); vmovdqu128_memst(KL128, cmll_sub(0, ctx)); vpshufd128_0x1b(KL128, KL128); vmovdqu128_memst(KB128, cmll_sub(2, ctx)); vmovdqu128_memst(x4, cmll_sub(4, ctx)); vmovdqu128_memst(x5, cmll_sub(6, ctx)); vmovdqu128_memst(x6, cmll_sub(8, ctx)); vmovdqu128_memst(x7, cmll_sub(10, ctx)); vmovdqu128_memst(x8, cmll_sub(12, ctx)); vmovdqu128_memst(x9, cmll_sub(14, ctx)); vmovdqu128_memld(cmll_sub(32, ctx), KB128); /* subl(1) ^= subr(1) & ~subr(17); */ vpandn128(x15, x10, x13); vpslldq128(12, x13, x13); vpsrldq128(8, x13, x13); vpxor128(x13, x15, x15); /* dw = subl(1) & subl(17), subr(1) ^= CAMELLIA_RL1(dw); */ vpand128(x15, x10, x14); vpslld128(1, x14, x13); vpsrld128(31, x14, x14); vpaddb128(x13, x14, x14); vpslldq128(8, x14, x14); vpsrldq128(12, x14, x14); vpxor128(x14, x15, x15); vpxor128(x15, x11, x11); vpxor128(x15, x12, x12); vec_ror128(KL128, x4, 128-77, x14); vec_ror128(KA128, x5, 128-77, x14); vec_ror128(KR128, x6, 128-94, x14); vec_ror128(KA128, x7, 128-94, x14); vec_ror128(KL128, x8, 128-111, x14); vec_ror128(KB128, x9, 128-111, x14); vpxor128(x15, x4, x4); vpshufd128_0x1b(x10, x10); vpshufd128_0x1b(x11, x11); vpshufd128_0x1b(x12, x12); vpshufd128_0x1b(x4, x4); vmovdqu128_memst(x10, cmll_sub(16, ctx)); vmovdqu128_memst(x11, cmll_sub(18, ctx)); vmovdqu128_memst(x12, cmll_sub(20, ctx)); vmovdqu128_memst(x4, cmll_sub(22, ctx)); /* subl(1) ^= subr(1) & ~subr(25); */ vpandn128(x15, x5, x13); vpslldq128(12, x13, x13); vpsrldq128(8, x13, x13); vpxor128(x13, x15, x15); /* dw = subl(1) & subl(25), subr(1) ^= CAMELLIA_RL1(dw); */ vpand128(x15, x5, x14); vpslld128(1, x14, x13); vpsrld128(31, x14, x14); vpaddb128(x13, x14, x14); vpslldq128(8, x14, x14); vpsrldq128(12, x14, x14); vpxor128(x14, x15, x15); vpxor128(x15, x6, x6); vpxor128(x15, x7, x7); vpxor128(x15, x8, x8); vpslldq128(8, x15, x15); vpxor128(x15, x9, x9); /* absorb kw4 to other subkeys */ vpslldq128(8, x9, x15); vpxor128(x15, x8, x8); vpxor128(x15, x7, x7); vpxor128(x15, x6, x6); /* subl(33) ^= subr(33) & ~subr(24); */ vpandn128(x15, x5, x14); vpslldq128(4, x14, x14); vpxor128(x14, x15, x15); /* dw = subl(33) & subl(24), subr(33) ^= CAMELLIA_RL1(dw); */ vpand128(x15, x5, x14); vpslld128(1, x14, x13); vpsrld128(31, x14, x14); vpaddb128(x13, x14, x14); vpsrldq128(12, x14, x14); vpslldq128(8, x14, x14); vpxor128(x14, x15, x15); vpshufd128_0x1b(x5, x5); vpshufd128_0x1b(x6, x6); vpshufd128_0x1b(x7, x7); vpshufd128_0x1b(x8, x8); vpshufd128_0x1b(x9, x9); vmovdqu128_memst(x5, cmll_sub(24, ctx)); vmovdqu128_memst(x6, cmll_sub(26, ctx)); vmovdqu128_memst(x7, cmll_sub(28, ctx)); vmovdqu128_memst(x8, cmll_sub(30, ctx)); vmovdqu128_memst(x9, cmll_sub(32, ctx)); vmovdqu128_memld(cmll_sub(22, ctx), tmp0); vpshufd128_0x1b(tmp0, x0); vmovdqu128_memld(cmll_sub(20, ctx), tmp0); vpshufd128_0x1b(tmp0, x1); vmovdqu128_memld(cmll_sub(18, ctx), tmp0); vpshufd128_0x1b(tmp0, x2); vmovdqu128_memld(cmll_sub(16, ctx), tmp0); vpshufd128_0x1b(tmp0, x3); vmovdqu128_memld(cmll_sub(14, ctx), tmp0); vpshufd128_0x1b(tmp0, x4); vmovdqu128_memld(cmll_sub(12, ctx), tmp0); vpshufd128_0x1b(tmp0, x5); vmovdqu128_memld(cmll_sub(10, ctx), tmp0); vpshufd128_0x1b(tmp0, x6); vmovdqu128_memld(cmll_sub(8, ctx), tmp0); vpshufd128_0x1b(tmp0, x7); vpxor128(x15, x0, x0); vpxor128(x15, x1, x1); vpxor128(x15, x2, x2); /* subl(33) ^= subr(33) & ~subr(24); */ vpandn128(x15, x3, x14); vpslldq128(4, x14, x14); vpxor128(x14, x15, x15); /* dw = subl(33) & subl(24), subr(33) ^= CAMELLIA_RL1(dw); */ vpand128(x15, x3, x14); vpslld128(1, x14, x13); vpsrld128(31, x14, x14); vpaddb128(x13, x14, x14); vpsrldq128(12, x14, x14); vpslldq128(8, x14, x14); vpxor128(x14, x15, x15); vpxor128(x15, x4, x4); vpxor128(x15, x5, x5); vpxor128(x15, x6, x6); vpshufd128_0x1b(x0, x0); vpshufd128_0x1b(x1, x1); vpshufd128_0x1b(x2, x2); vpshufd128_0x1b(x4, x4); vpshufd128_0x1b(x5, x5); vpshufd128_0x1b(x6, x6); vmovdqu128_memst(x0, cmll_sub(22, ctx)); vmovdqu128_memst(x1, cmll_sub(20, ctx)); vmovdqu128_memst(x2, cmll_sub(18, ctx)); vmovdqu128_memst(x4, cmll_sub(14, ctx)); vmovdqu128_memst(x5, cmll_sub(12, ctx)); vmovdqu128_memst(x6, cmll_sub(10, ctx)); vmovdqu128_memld(cmll_sub(6, ctx), tmp0); vpshufd128_0x1b(tmp0, x6); vmovdqu128_memld(cmll_sub(4, ctx), tmp0); vpshufd128_0x1b(tmp0, x4); vmovdqu128_memld(cmll_sub(2, ctx), tmp0); vpshufd128_0x1b(tmp0, x2); vmovdqu128_memld(cmll_sub(0, ctx), tmp0); vpshufd128_0x1b(tmp0, x0); /* subl(33) ^= subr(33) & ~subr(24); */ vpandn128(x15, x7, x14); vpslldq128(4, x14, x14); vpxor128(x14, x15, x15); /* dw = subl(33) & subl(24), subr(33) ^= CAMELLIA_RL1(dw); */ vpand128(x15, x7, x14); vpslld128(1, x14, x13); vpsrld128(31, x14, x14); vpaddb128(x13, x14, x14); vpsrldq128(12, x14, x14); vpslldq128(8, x14, x14); vpxor128(x14, x15, x15); vpxor128(x15, x6, x6); vpxor128(x15, x4, x4); vpxor128(x15, x2, x2); vpxor128(x15, x0, x0); vpshufd128_0x1b(x6, x6); vpshufd128_0x1b(x4, x4); vpshufd128_0x1b(x2, x2); vpshufd128_0x1b(x0, x0); vpsrldq128(8, x2, x3); vpsrldq128(8, x4, x5); vpsrldq128(8, x6, x7); /* * key XOR is end of F-function. */ vpxor128(x2, x0, x0); vpxor128(x4, x2, x2); vmovq128_memst(x0, cmll_sub(0, ctx)); vmovq128_memst(x3, cmll_sub(2, ctx)); vpxor128(x5, x3, x3); vpxor128(x6, x4, x4); vpxor128(x7, x5, x5); vmovq128_memst(x2, cmll_sub(3, ctx)); vmovq128_memst(x3, cmll_sub(4, ctx)); vmovq128_memst(x4, cmll_sub(5, ctx)); vmovq128_memst(x5, cmll_sub(6, ctx)); vmovq128(*cmll_sub(7, ctx), x7); vmovq128(*cmll_sub(8, ctx), x8); vmovq128(*cmll_sub(9, ctx), x9); vmovq128(*cmll_sub(10, ctx), x10); /* tl = subl(10) ^ (subr(10) & ~subr(8)); */ vpandn128(x10, x8, x15); vpsrldq128(4, x15, x15); vpxor128(x15, x10, x0); /* dw = tl & subl(8), tr = subr(10) ^ CAMELLIA_RL1(dw); */ vpand128(x8, x0, x15); vpslld128(1, x15, x14); vpsrld128(31, x15, x15); vpaddb128(x14, x15, x15); vpslldq128(12, x15, x15); vpsrldq128(8, x15, x15); vpxor128(x15, x0, x0); vpxor128(x0, x6, x6); vmovq128_memst(x6, cmll_sub(7, ctx)); vmovq128(*cmll_sub(11, ctx), x11); vmovq128(*cmll_sub(12, ctx), x12); vmovq128(*cmll_sub(13, ctx), x13); vmovq128(*cmll_sub(14, ctx), x14); vmovq128(*cmll_sub(15, ctx), x15); /* tl = subl(7) ^ (subr(7) & ~subr(9)); */ vpandn128(x7, x9, x1); vpsrldq128(4, x1, x1); vpxor128(x1, x7, x0); /* dw = tl & subl(9), tr = subr(7) ^ CAMELLIA_RL1(dw); */ vpand128(x9, x0, x1); vpslld128(1, x1, x2); vpsrld128(31, x1, x1); vpaddb128(x2, x1, x1); vpslldq128(12, x1, x1); vpsrldq128(8, x1, x1); vpxor128(x1, x0, x0); vpxor128(x11, x0, x0); vpxor128(x12, x10, x10); vpxor128(x13, x11, x11); vpxor128(x14, x12, x12); vpxor128(x15, x13, x13); vmovq128_memst(x0, cmll_sub(10, ctx)); vmovq128_memst(x10, cmll_sub(11, ctx)); vmovq128_memst(x11, cmll_sub(12, ctx)); vmovq128_memst(x12, cmll_sub(13, ctx)); vmovq128_memst(x13, cmll_sub(14, ctx)); vmovq128(*cmll_sub(16, ctx), x6); vmovq128(*cmll_sub(17, ctx), x7); vmovq128(*cmll_sub(18, ctx), x8); vmovq128(*cmll_sub(19, ctx), x9); vmovq128(*cmll_sub(20, ctx), x10); /* tl = subl(18) ^ (subr(18) & ~subr(16)); */ vpandn128(x8, x6, x1); vpsrldq128(4, x1, x1); vpxor128(x1, x8, x0); /* dw = tl & subl(16), tr = subr(18) ^ CAMELLIA_RL1(dw); */ vpand128(x6, x0, x1); vpslld128(1, x1, x2); vpsrld128(31, x1, x1); vpaddb128(x2, x1, x1); vpslldq128(12, x1, x1); vpsrldq128(8, x1, x1); vpxor128(x1, x0, x0); vpxor128(x14, x0, x0); vmovq128_memst(x0, cmll_sub(15, ctx)); /* tl = subl(15) ^ (subr(15) & ~subr(17)); */ vpandn128(x15, x7, x1); vpsrldq128(4, x1, x1); vpxor128(x1, x15, x0); /* dw = tl & subl(17), tr = subr(15) ^ CAMELLIA_RL1(dw); */ vpand128(x7, x0, x1); vpslld128(1, x1, x2); vpsrld128(31, x1, x1); vpaddb128(x2, x1, x1); vpslldq128(12, x1, x1); vpsrldq128(8, x1, x1); vpxor128(x1, x0, x0); vmovq128(*cmll_sub(21, ctx), x1); vmovq128(*cmll_sub(22, ctx), x2); vmovq128(*cmll_sub(23, ctx), x3); vmovq128(*cmll_sub(24, ctx), x4); vpxor128(x9, x0, x0); vpxor128(x10, x8, x8); vpxor128(x1, x9, x9); vpxor128(x2, x10, x10); vpxor128(x3, x1, x1); vmovq128_memst(x0, cmll_sub(18, ctx)); vmovq128_memst(x8, cmll_sub(19, ctx)); vmovq128_memst(x9, cmll_sub(20, ctx)); vmovq128_memst(x10, cmll_sub(21, ctx)); vmovq128_memst(x1, cmll_sub(22, ctx)); vmovq128(*cmll_sub(25, ctx), x5); vmovq128(*cmll_sub(26, ctx), x6); vmovq128(*cmll_sub(27, ctx), x7); vmovq128(*cmll_sub(28, ctx), x8); vmovq128(*cmll_sub(29, ctx), x9); vmovq128(*cmll_sub(30, ctx), x10); vmovq128(*cmll_sub(31, ctx), x11); vmovq128(*cmll_sub(32, ctx), x12); /* tl = subl(26) ^ (subr(26) & ~subr(24)); */ vpandn128(x6, x4, x15); vpsrldq128(4, x15, x15); vpxor128(x15, x6, x0); /* dw = tl & subl(26), tr = subr(24) ^ CAMELLIA_RL1(dw); */ vpand128(x4, x0, x15); vpslld128(1, x15, x14); vpsrld128(31, x15, x15); vpaddb128(x14, x15, x15); vpslldq128(12, x15, x15); vpsrldq128(8, x15, x15); vpxor128(x15, x0, x0); vpxor128(x0, x2, x2); vmovq128_memst(x2, cmll_sub(23, ctx)); /* tl = subl(23) ^ (subr(23) & ~subr(25)); */ vpandn128(x3, x5, x15); vpsrldq128(4, x15, x15); vpxor128(x15, x3, x0); /* dw = tl & subl(26), tr = subr(24) ^ CAMELLIA_RL1(dw); */ vpand128(x5, x0, x15); vpslld128(1, x15, x14); vpsrld128(31, x15, x15); vpaddb128(x14, x15, x15); vpslldq128(12, x15, x15); vpsrldq128(8, x15, x15); vpxor128(x15, x0, x0); vpxor128(x7, x0, x0); vpxor128(x8, x6, x6); vpxor128(x9, x7, x7); vpxor128(x10, x8, x8); vpxor128(x11, x9, x9); vpxor128(x12, x11, x11); vmovq128_memst(x0, cmll_sub(26, ctx)); vmovq128_memst(x6, cmll_sub(27, ctx)); vmovq128_memst(x7, cmll_sub(28, ctx)); vmovq128_memst(x8, cmll_sub(29, ctx)); vmovq128_memst(x9, cmll_sub(30, ctx)); vmovq128_memst(x10, cmll_sub(31, ctx)); vmovq128_memst(x11, cmll_sub(32, ctx)); #undef KL128 #undef KR128 #undef KA128 #undef KB128 /* kw2 and kw4 are unused now. */ load_zero(tmp0); vmovq128_memst(tmp0, cmll_sub(1, ctx)); vmovq128_memst(tmp0, cmll_sub(33, ctx)); } void ASM_FUNC_ATTR_NOINLINE FUNC_KEY_SETUP(void *key_table, const void *vkey, unsigned int keylen) { const char *key = vkey; /* input: * key_table: subkey storage at key_table(CTX) * key_length_bits: output key length as number of bits * key: input key buffer * keylen: key length in bytes */ __m128i x0, x1, x2; switch (keylen) { default: return; /* Unsupported key length! */ case 16: vmovdqu128_memld(key, x0); camellia_setup128(key_table, x0); return; case 24: vmovdqu128_memld(key, x0); vmovq128(*(uint64_unaligned_t *)(key + 16), x1); x2[0] = -1; x2[1] = -1; vpxor128(x1, x2, x2); vpslldq128(8, x2, x2); vpor128(x2, x1, x1); break; case 32: vmovdqu128_memld(key, x0); vmovdqu128_memld(key + 16, x1); break; } camellia_setup256(key_table, x0, x1); } grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/cipher/salsa20.c0000644000175000017500000003624015036452441022261 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ #include GRUB_MOD_LICENSE ("GPLv3+"); /* salsa20.c - Bernstein's Salsa20 cipher * Copyright (C) 2012 Simon Josefsson, Niels Möller * Copyright (C) 2013 g10 Code GmbH * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . * * For a description of the algorithm, see: * http://cr.yp.to/snuffle/spec.pdf * http://cr.yp.to/snuffle/design.pdf */ /* The code is based on the code in Nettle (git commit id 9d2d8ddaee35b91a4e1a32ae77cba04bea3480e7) which in turn is based on salsa20-ref.c version 20051118 D. J. Bernstein Public domain. */ #include "types.h" #include "g10lib.h" #include "cipher.h" #include "bufhelp.h" #include "cipher-internal.h" /* USE_AMD64 indicates whether to compile with AMD64 code. */ #undef USE_AMD64 #if defined(__x86_64__) && (defined(HAVE_COMPATIBLE_GCC_AMD64_PLATFORM_AS) || \ defined(HAVE_COMPATIBLE_GCC_WIN64_PLATFORM_AS)) # define USE_AMD64 1 #endif /* USE_ARM_NEON_ASM indicates whether to enable ARM NEON assembly code. */ #undef USE_ARM_NEON_ASM #ifdef ENABLE_NEON_SUPPORT # if defined(HAVE_ARM_ARCH_V6) && defined(__ARMEL__) \ && defined(HAVE_COMPATIBLE_GCC_ARM_PLATFORM_AS) \ && defined(HAVE_GCC_INLINE_ASM_NEON) # define USE_ARM_NEON_ASM 1 # endif #endif /*ENABLE_NEON_SUPPORT*/ #define SALSA20_MIN_KEY_SIZE 16 /* Bytes. */ #define SALSA20_MAX_KEY_SIZE 32 /* Bytes. */ #define SALSA20_BLOCK_SIZE 64 /* Bytes. */ #define SALSA20_IV_SIZE 8 /* Bytes. */ #define SALSA20_INPUT_LENGTH 16 /* Bytes. */ /* Number of rounds. The standard uses 20 rounds. In any case the number of rounds must be even. */ #define SALSA20_ROUNDS 20 #define SALSA20R12_ROUNDS 12 struct SALSA20_context_s; typedef unsigned int (*salsa20_core_t) (u32 *dst, struct SALSA20_context_s *ctx, unsigned int rounds); typedef void (* salsa20_keysetup_t)(struct SALSA20_context_s *ctx, const byte *key, int keylen); typedef void (* salsa20_ivsetup_t)(struct SALSA20_context_s *ctx, const byte *iv); typedef struct SALSA20_context_s { /* Indices 1-4 and 11-14 holds the key (two identical copies for the shorter key size), indices 0, 5, 10, 15 are constant, indices 6, 7 are the IV, and indices 8, 9 are the block counter: C K K K K C I I B B C K K K K C */ u32 input[SALSA20_INPUT_LENGTH]; u32 pad[SALSA20_INPUT_LENGTH]; unsigned int unused; /* bytes in the pad. */ #ifdef USE_ARM_NEON_ASM int use_neon; #endif salsa20_keysetup_t keysetup; salsa20_ivsetup_t ivsetup; salsa20_core_t core; } SALSA20_context_t; /* The masking of the right shift is needed to allow n == 0 (using just 32 - n and 64 - n results in undefined behaviour). Most uses of these macros use a constant and non-zero rotation count. */ #define ROTL32(n,x) (((x)<<(n)) | ((x)>>((-(n)&31)))) #define LE_SWAP32(v) le_bswap32(v) #define LE_READ_UINT32(p) buf_get_le32(p) static void salsa20_setiv (void *context, const byte *iv, size_t ivlen); #ifdef USE_AMD64 /* Assembly implementations use SystemV ABI, ABI conversion and additional * stack to store XMM6-XMM15 needed on Win64. */ #ifdef HAVE_COMPATIBLE_GCC_WIN64_PLATFORM_AS # define ASM_FUNC_ABI __attribute__((sysv_abi)) # define ASM_EXTRA_STACK (10 * 16) #else # define ASM_FUNC_ABI # define ASM_EXTRA_STACK 0 #endif /* AMD64 assembly implementations of Salsa20. */ void _gcry_salsa20_amd64_keysetup(u32 *ctxinput, const void *key, int keybits) ASM_FUNC_ABI; void _gcry_salsa20_amd64_ivsetup(u32 *ctxinput, const void *iv) ASM_FUNC_ABI; unsigned int _gcry_salsa20_amd64_encrypt_blocks(u32 *ctxinput, const void *src, void *dst, size_t len, int rounds) ASM_FUNC_ABI; static void salsa20_keysetup(SALSA20_context_t *ctx, const byte *key, int keylen) { _gcry_salsa20_amd64_keysetup(ctx->input, key, keylen * 8); } static void salsa20_ivsetup(SALSA20_context_t *ctx, const byte *iv) { _gcry_salsa20_amd64_ivsetup(ctx->input, iv); } static unsigned int salsa20_core (u32 *dst, SALSA20_context_t *ctx, unsigned int rounds) { memset(dst, 0, SALSA20_BLOCK_SIZE); return _gcry_salsa20_amd64_encrypt_blocks(ctx->input, dst, dst, 1, rounds) + ASM_EXTRA_STACK; } #else /* USE_AMD64 */ #if 0 # define SALSA20_CORE_DEBUG(i) do { \ unsigned debug_j; \ for (debug_j = 0; debug_j < 16; debug_j++) \ { \ if (debug_j == 0) \ fprintf(stderr, "%2d:", (i)); \ else if (debug_j % 4 == 0) \ fprintf(stderr, "\n "); \ fprintf(stderr, " %8x", pad[debug_j]); \ } \ fprintf(stderr, "\n"); \ } while (0) #else # define SALSA20_CORE_DEBUG(i) #endif #define QROUND(x0, x1, x2, x3) \ do { \ x1 ^= ROTL32 ( 7, x0 + x3); \ x2 ^= ROTL32 ( 9, x1 + x0); \ x3 ^= ROTL32 (13, x2 + x1); \ x0 ^= ROTL32 (18, x3 + x2); \ } while(0) static unsigned int salsa20_core (u32 *dst, SALSA20_context_t *ctx, unsigned rounds) { u32 pad[SALSA20_INPUT_LENGTH], *src = ctx->input; unsigned int i; memcpy (pad, src, sizeof(pad)); for (i = 0; i < rounds; i += 2) { SALSA20_CORE_DEBUG (i); QROUND (pad[0], pad[4], pad[8], pad[12]); QROUND (pad[5], pad[9], pad[13], pad[1] ); QROUND (pad[10], pad[14], pad[2], pad[6] ); QROUND (pad[15], pad[3], pad[7], pad[11]); SALSA20_CORE_DEBUG (i+1); QROUND (pad[0], pad[1], pad[2], pad[3] ); QROUND (pad[5], pad[6], pad[7], pad[4] ); QROUND (pad[10], pad[11], pad[8], pad[9] ); QROUND (pad[15], pad[12], pad[13], pad[14]); } SALSA20_CORE_DEBUG (i); for (i = 0; i < SALSA20_INPUT_LENGTH; i++) { u32 t = pad[i] + src[i]; dst[i] = LE_SWAP32 (t); } /* Update counter. */ if (!++src[8]) src[9]++; /* burn_stack */ return ( 3*sizeof (void*) \ + 2*sizeof (void*) \ + 64 \ + sizeof (unsigned int) \ + sizeof (u32) ); } #undef QROUND #undef SALSA20_CORE_DEBUG static void salsa20_keysetup(SALSA20_context_t *ctx, const byte *key, int keylen) { /* These constants are the little endian encoding of the string "expand 32-byte k". For the 128 bit variant, the "32" in that string will be fixed up to "16". */ ctx->input[0] = 0x61707865; /* "apxe" */ ctx->input[5] = 0x3320646e; /* "3 dn" */ ctx->input[10] = 0x79622d32; /* "yb-2" */ ctx->input[15] = 0x6b206574; /* "k et" */ ctx->input[1] = LE_READ_UINT32(key + 0); ctx->input[2] = LE_READ_UINT32(key + 4); ctx->input[3] = LE_READ_UINT32(key + 8); ctx->input[4] = LE_READ_UINT32(key + 12); if (keylen == SALSA20_MAX_KEY_SIZE) /* 256 bits */ { ctx->input[11] = LE_READ_UINT32(key + 16); ctx->input[12] = LE_READ_UINT32(key + 20); ctx->input[13] = LE_READ_UINT32(key + 24); ctx->input[14] = LE_READ_UINT32(key + 28); } else /* 128 bits */ { ctx->input[11] = ctx->input[1]; ctx->input[12] = ctx->input[2]; ctx->input[13] = ctx->input[3]; ctx->input[14] = ctx->input[4]; ctx->input[5] -= 0x02000000; /* Change to "1 dn". */ ctx->input[10] += 0x00000004; /* Change to "yb-6". */ } } static void salsa20_ivsetup(SALSA20_context_t *ctx, const byte *iv) { ctx->input[6] = LE_READ_UINT32(iv + 0); ctx->input[7] = LE_READ_UINT32(iv + 4); /* Reset the block counter. */ ctx->input[8] = 0; ctx->input[9] = 0; } #endif /*!USE_AMD64*/ #ifdef USE_ARM_NEON_ASM /* ARM NEON implementation of Salsa20. */ unsigned int _gcry_arm_neon_salsa20_encrypt(void *c, const void *m, unsigned int nblks, void *k, unsigned int rounds); static unsigned int salsa20_core_neon (u32 *dst, SALSA20_context_t *ctx, unsigned int rounds) { return _gcry_arm_neon_salsa20_encrypt(dst, NULL, 1, ctx->input, rounds); } static void salsa20_ivsetup_neon(SALSA20_context_t *ctx, const byte *iv) { memcpy(ctx->input + 8, iv, 8); /* Reset the block counter. */ memset(ctx->input + 10, 0, 8); } static void salsa20_keysetup_neon(SALSA20_context_t *ctx, const byte *key, int klen) { static const unsigned char sigma32[16] = "expand 32-byte k"; static const unsigned char sigma16[16] = "expand 16-byte k"; if (klen == 16) { memcpy (ctx->input, key, 16); memcpy (ctx->input + 4, key, 16); /* Duplicate 128-bit key. */ memcpy (ctx->input + 12, sigma16, 16); } else { /* 32-byte key */ memcpy (ctx->input, key, 32); memcpy (ctx->input + 12, sigma32, 16); } } #endif /*USE_ARM_NEON_ASM*/ static gcry_err_code_t salsa20_do_setkey (SALSA20_context_t *ctx, const byte *key, unsigned int keylen) { static int initialized; static const char *selftest_failed; if (!initialized ) { initialized = 1; selftest_failed = selftest (); if (selftest_failed) log_error ("SALSA20 selftest failed (%s)\n", selftest_failed ); } if (selftest_failed) return GPG_ERR_SELFTEST_FAILED; if (keylen != SALSA20_MIN_KEY_SIZE && keylen != SALSA20_MAX_KEY_SIZE) return GPG_ERR_INV_KEYLEN; /* Default ops. */ ctx->keysetup = salsa20_keysetup; ctx->ivsetup = salsa20_ivsetup; ctx->core = salsa20_core; #ifdef USE_ARM_NEON_ASM ctx->use_neon = (_gcry_get_hw_features () & HWF_ARM_NEON) != 0; if (ctx->use_neon) { /* Use ARM NEON ops instead. */ ctx->keysetup = salsa20_keysetup_neon; ctx->ivsetup = salsa20_ivsetup_neon; ctx->core = salsa20_core_neon; } #endif ctx->keysetup (ctx, key, keylen); /* We default to a zero nonce. */ salsa20_setiv (ctx, NULL, 0); return 0; } static gcry_err_code_t salsa20_setkey (void *context, const byte *key, unsigned int keylen, cipher_bulk_ops_t *bulk_ops) { SALSA20_context_t *ctx = (SALSA20_context_t *)context; gcry_err_code_t rc = salsa20_do_setkey (ctx, key, keylen); (void)bulk_ops; _gcry_burn_stack (4 + sizeof (void *) + 4 * sizeof (void *)); return rc; } static void salsa20_setiv (void *context, const byte *iv, size_t ivlen) { SALSA20_context_t *ctx = (SALSA20_context_t *)context; byte tmp[SALSA20_IV_SIZE]; if (iv && ivlen != SALSA20_IV_SIZE) log_info ("WARNING: salsa20_setiv: bad ivlen=%u\n", (u32)ivlen); if (!iv || ivlen != SALSA20_IV_SIZE) memset (tmp, 0, sizeof(tmp)); else memcpy (tmp, iv, SALSA20_IV_SIZE); ctx->ivsetup (ctx, tmp); /* Reset the unused pad bytes counter. */ ctx->unused = 0; wipememory (tmp, sizeof(tmp)); } /* Note: This function requires LENGTH > 0. */ static void salsa20_do_encrypt_stream (SALSA20_context_t *ctx, byte *outbuf, const byte *inbuf, size_t length, unsigned rounds) { unsigned int nburn, burn = 0; if (ctx->unused) { unsigned char *p = (void*)ctx->pad; size_t n; gcry_assert (ctx->unused < SALSA20_BLOCK_SIZE); n = ctx->unused; if (n > length) n = length; buf_xor (outbuf, inbuf, p + SALSA20_BLOCK_SIZE - ctx->unused, n); length -= n; outbuf += n; inbuf += n; ctx->unused -= n; if (!length) return; gcry_assert (!ctx->unused); } #ifdef USE_AMD64 if (length >= SALSA20_BLOCK_SIZE) { size_t nblocks = length / SALSA20_BLOCK_SIZE; burn = _gcry_salsa20_amd64_encrypt_blocks(ctx->input, inbuf, outbuf, nblocks, rounds); burn += ASM_EXTRA_STACK; length -= SALSA20_BLOCK_SIZE * nblocks; outbuf += SALSA20_BLOCK_SIZE * nblocks; inbuf += SALSA20_BLOCK_SIZE * nblocks; } #endif #ifdef USE_ARM_NEON_ASM if (ctx->use_neon && length >= SALSA20_BLOCK_SIZE) { unsigned int nblocks = length / SALSA20_BLOCK_SIZE; _gcry_arm_neon_salsa20_encrypt (outbuf, inbuf, nblocks, ctx->input, rounds); length -= SALSA20_BLOCK_SIZE * nblocks; outbuf += SALSA20_BLOCK_SIZE * nblocks; inbuf += SALSA20_BLOCK_SIZE * nblocks; } #endif while (length > 0) { /* Create the next pad and bump the block counter. Note that it is the user's duty to change to another nonce not later than after 2^70 processed bytes. */ nburn = ctx->core (ctx->pad, ctx, rounds); burn = nburn > burn ? nburn : burn; if (length <= SALSA20_BLOCK_SIZE) { buf_xor (outbuf, inbuf, ctx->pad, length); ctx->unused = SALSA20_BLOCK_SIZE - length; break; } buf_xor (outbuf, inbuf, ctx->pad, SALSA20_BLOCK_SIZE); length -= SALSA20_BLOCK_SIZE; outbuf += SALSA20_BLOCK_SIZE; inbuf += SALSA20_BLOCK_SIZE; } _gcry_burn_stack (burn); } static void salsa20_encrypt_stream (void *context, byte *outbuf, const byte *inbuf, size_t length) { SALSA20_context_t *ctx = (SALSA20_context_t *)context; if (length) salsa20_do_encrypt_stream (ctx, outbuf, inbuf, length, SALSA20_ROUNDS); } static void salsa20r12_encrypt_stream (void *context, byte *outbuf, const byte *inbuf, size_t length) { SALSA20_context_t *ctx = (SALSA20_context_t *)context; if (length) salsa20_do_encrypt_stream (ctx, outbuf, inbuf, length, SALSA20R12_ROUNDS); } gcry_cipher_spec_t _gcry_cipher_spec_salsa20 = { GCRY_CIPHER_SALSA20, {0, 0}, /* flags */ "SALSA20", /* name */ NULL, /* aliases */ NULL, /* oids */ 1, /* blocksize in bytes. */ SALSA20_MAX_KEY_SIZE*8, /* standard key length in bits. */ sizeof (SALSA20_context_t), salsa20_setkey, NULL, NULL, salsa20_encrypt_stream, salsa20_encrypt_stream, NULL, NULL, salsa20_setiv , GRUB_UTIL_MODNAME("gcry_salsa20") }; gcry_cipher_spec_t _gcry_cipher_spec_salsa20r12 = { GCRY_CIPHER_SALSA20R12, {0, 0}, /* flags */ "SALSA20R12", /* name */ NULL, /* aliases */ NULL, /* oids */ 1, /* blocksize in bytes. */ SALSA20_MAX_KEY_SIZE*8, /* standard key length in bits. */ sizeof (SALSA20_context_t), salsa20_setkey, NULL, NULL, salsa20r12_encrypt_stream, salsa20r12_encrypt_stream, NULL, NULL, salsa20_setiv , GRUB_UTIL_MODNAME("gcry_salsa20") }; GRUB_MOD_INIT(gcry_salsa20) { grub_cipher_register (&_gcry_cipher_spec_salsa20); grub_cipher_register (&_gcry_cipher_spec_salsa20r12); } GRUB_MOD_FINI(gcry_salsa20) { grub_cipher_unregister (&_gcry_cipher_spec_salsa20); grub_cipher_unregister (&_gcry_cipher_spec_salsa20r12); } grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/cipher/serpent.c0000644000175000017500000015173615036452441022504 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ #include GRUB_MOD_LICENSE ("GPLv3+"); /* serpent.c - Implementation of the Serpent encryption algorithm. * Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc. * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . * SPDX-License-Identifier: LGPL-2.1-or-later */ #include "types.h" #include "g10lib.h" #include "cipher.h" #include "bithelp.h" #include "bufhelp.h" #include "cipher-internal.h" #include "bulkhelp.h" /* USE_SSE2 indicates whether to compile with x86-64 SSE2 code. */ #undef USE_SSE2 #if defined(__x86_64__) && (defined(HAVE_COMPATIBLE_GCC_AMD64_PLATFORM_AS) || \ defined(HAVE_COMPATIBLE_GCC_WIN64_PLATFORM_AS)) # define USE_SSE2 1 #endif /* USE_AVX2 indicates whether to compile with x86-64 AVX2 code. */ #undef USE_AVX2 #if defined(__x86_64__) && (defined(HAVE_COMPATIBLE_GCC_AMD64_PLATFORM_AS) || \ defined(HAVE_COMPATIBLE_GCC_WIN64_PLATFORM_AS)) # if defined(ENABLE_AVX2_SUPPORT) # define USE_AVX2 1 # endif #endif /* USE_AVX512 indicates whether to compile with x86 AVX512 code. */ #undef USE_AVX512 #if (defined(__x86_64) || defined(__i386)) && \ defined(HAVE_COMPATIBLE_CC_X86_AVX512_INTRINSICS) # if defined(ENABLE_AVX512_SUPPORT) # define USE_AVX512 1 # endif #endif /* USE_NEON indicates whether to enable ARM NEON assembly code. */ #undef USE_NEON #ifdef ENABLE_NEON_SUPPORT # if defined(HAVE_ARM_ARCH_V6) && defined(__ARMEL__) \ && defined(HAVE_COMPATIBLE_GCC_ARM_PLATFORM_AS) \ && defined(HAVE_GCC_INLINE_ASM_NEON) # define USE_NEON 1 # endif #endif /*ENABLE_NEON_SUPPORT*/ /* Number of rounds per Serpent encrypt/decrypt operation. */ #define ROUNDS 32 /* Magic number, used during generating of the subkeys. */ #define PHI 0x9E3779B9 /* Serpent works on 128 bit blocks. */ typedef u32 serpent_block_t[4]; /* Serpent key, provided by the user. If the original key is shorter than 256 bits, it is padded. */ typedef u32 serpent_key_t[8]; /* The key schedule consists of 33 128 bit subkeys. */ typedef u32 serpent_subkeys_t[ROUNDS + 1][4]; /* A Serpent context. */ typedef struct serpent_context { serpent_subkeys_t keys; /* Generated subkeys. */ #ifdef USE_AVX2 int use_avx2; #endif #ifdef USE_AVX512 int use_avx512; #endif #ifdef USE_NEON int use_neon; #endif } serpent_context_t; /* Assembly implementations use SystemV ABI, ABI conversion and additional * stack to store XMM6-XMM15 needed on Win64. */ #undef ASM_FUNC_ABI #if defined(USE_SSE2) || defined(USE_AVX2) # ifdef HAVE_COMPATIBLE_GCC_WIN64_PLATFORM_AS # define ASM_FUNC_ABI __attribute__((sysv_abi)) # else # define ASM_FUNC_ABI # endif #endif #ifdef USE_SSE2 /* Assembler implementations of Serpent using SSE2. Process 8 block in parallel. */ extern void _gcry_serpent_sse2_ctr_enc(serpent_context_t *ctx, unsigned char *out, const unsigned char *in, unsigned char *ctr) ASM_FUNC_ABI; extern void _gcry_serpent_sse2_cbc_dec(serpent_context_t *ctx, unsigned char *out, const unsigned char *in, unsigned char *iv) ASM_FUNC_ABI; extern void _gcry_serpent_sse2_cfb_dec(serpent_context_t *ctx, unsigned char *out, const unsigned char *in, unsigned char *iv) ASM_FUNC_ABI; extern void _gcry_serpent_sse2_ocb_enc(serpent_context_t *ctx, unsigned char *out, const unsigned char *in, unsigned char *offset, unsigned char *checksum, const u64 Ls[8]) ASM_FUNC_ABI; extern void _gcry_serpent_sse2_ocb_dec(serpent_context_t *ctx, unsigned char *out, const unsigned char *in, unsigned char *offset, unsigned char *checksum, const u64 Ls[8]) ASM_FUNC_ABI; extern void _gcry_serpent_sse2_ocb_auth(serpent_context_t *ctx, const unsigned char *abuf, unsigned char *offset, unsigned char *checksum, const u64 Ls[8]) ASM_FUNC_ABI; extern void _gcry_serpent_sse2_blk8(const serpent_context_t *c, byte *out, const byte *in, int encrypt) ASM_FUNC_ABI; #endif #ifdef USE_AVX2 /* Assembler implementations of Serpent using AVX2. Process 16 block in parallel. */ extern void _gcry_serpent_avx2_ctr_enc(serpent_context_t *ctx, unsigned char *out, const unsigned char *in, unsigned char *ctr) ASM_FUNC_ABI; extern void _gcry_serpent_avx2_cbc_dec(serpent_context_t *ctx, unsigned char *out, const unsigned char *in, unsigned char *iv) ASM_FUNC_ABI; extern void _gcry_serpent_avx2_cfb_dec(serpent_context_t *ctx, unsigned char *out, const unsigned char *in, unsigned char *iv) ASM_FUNC_ABI; extern void _gcry_serpent_avx2_ocb_enc(serpent_context_t *ctx, unsigned char *out, const unsigned char *in, unsigned char *offset, unsigned char *checksum, const u64 Ls[16]) ASM_FUNC_ABI; extern void _gcry_serpent_avx2_ocb_dec(serpent_context_t *ctx, unsigned char *out, const unsigned char *in, unsigned char *offset, unsigned char *checksum, const u64 Ls[16]) ASM_FUNC_ABI; extern void _gcry_serpent_avx2_ocb_auth(serpent_context_t *ctx, const unsigned char *abuf, unsigned char *offset, unsigned char *checksum, const u64 Ls[16]) ASM_FUNC_ABI; extern void _gcry_serpent_avx2_blk16(const serpent_context_t *c, byte *out, const byte *in, int encrypt) ASM_FUNC_ABI; #endif #ifdef USE_AVX512 /* Assembler implementations of Serpent using AVX512. Processing 32 blocks in parallel. */ extern void _gcry_serpent_avx512_cbc_dec(const void *ctx, unsigned char *out, const unsigned char *in, unsigned char *iv); extern void _gcry_serpent_avx512_cfb_dec(const void *ctx, unsigned char *out, const unsigned char *in, unsigned char *iv); extern void _gcry_serpent_avx512_ctr_enc(const void *ctx, unsigned char *out, const unsigned char *in, unsigned char *ctr); extern void _gcry_serpent_avx512_ocb_crypt(const void *ctx, unsigned char *out, const unsigned char *in, unsigned char *offset, unsigned char *checksum, const ocb_L_uintptr_t Ls[32], int encrypt); extern void _gcry_serpent_avx512_blk32(const void *c, byte *out, const byte *in, int encrypt); #endif #ifdef USE_NEON /* Assembler implementations of Serpent using ARM NEON. Process 8 block in parallel. */ extern void _gcry_serpent_neon_ctr_enc(serpent_context_t *ctx, unsigned char *out, const unsigned char *in, unsigned char *ctr); extern void _gcry_serpent_neon_cbc_dec(serpent_context_t *ctx, unsigned char *out, const unsigned char *in, unsigned char *iv); extern void _gcry_serpent_neon_cfb_dec(serpent_context_t *ctx, unsigned char *out, const unsigned char *in, unsigned char *iv); extern void _gcry_serpent_neon_ocb_enc(serpent_context_t *ctx, unsigned char *out, const unsigned char *in, unsigned char *offset, unsigned char *checksum, const void *Ls[8]); extern void _gcry_serpent_neon_ocb_dec(serpent_context_t *ctx, unsigned char *out, const unsigned char *in, unsigned char *offset, unsigned char *checksum, const void *Ls[8]); extern void _gcry_serpent_neon_ocb_auth(serpent_context_t *ctx, const unsigned char *abuf, unsigned char *offset, unsigned char *checksum, const void *Ls[8]); extern void _gcry_serpent_neon_blk8(const serpent_context_t *c, byte *out, const byte *in, int encrypt); #endif /* Prototypes. */ static const char *serpent_test (void); static void _gcry_serpent_ctr_enc (void *context, unsigned char *ctr, void *outbuf_arg, const void *inbuf_arg, size_t nblocks); static void _gcry_serpent_cbc_dec (void *context, unsigned char *iv, void *outbuf_arg, const void *inbuf_arg, size_t nblocks); static void _gcry_serpent_cfb_dec (void *context, unsigned char *iv, void *outbuf_arg, const void *inbuf_arg, size_t nblocks); static size_t _gcry_serpent_ocb_crypt (gcry_cipher_hd_t c, void *outbuf_arg, const void *inbuf_arg, size_t nblocks, int encrypt); static size_t _gcry_serpent_ocb_auth (gcry_cipher_hd_t c, const void *abuf_arg, size_t nblocks); static void _gcry_serpent_xts_crypt (void *context, unsigned char *tweak, void *outbuf_arg, const void *inbuf_arg, size_t nblocks, int encrypt); static void _gcry_serpent_ecb_crypt (void *context, void *outbuf_arg, const void *inbuf_arg, size_t nblocks, int encrypt); /* * These are the S-Boxes of Serpent from following research paper. * * D. A. Osvik, “Speeding up Serpent,” in Third AES Candidate Conference, * (New York, New York, USA), p. 317–329, National Institute of Standards and * Technology, 2000. * * Paper is also available at: http://www.ii.uib.no/~osvik/pub/aes3.pdf * */ #define SBOX0(r0, r1, r2, r3, w, x, y, z) \ { \ u32 r4; \ \ r3 ^= r0; r4 = r1; \ r1 &= r3; r4 ^= r2; \ r1 ^= r0; r0 |= r3; \ r0 ^= r4; r4 ^= r3; \ r3 ^= r2; r2 |= r1; \ r2 ^= r4; r4 = ~r4; \ r4 |= r1; r1 ^= r3; \ r1 ^= r4; r3 |= r0; \ r1 ^= r3; r4 ^= r3; \ \ w = r1; x = r4; y = r2; z = r0; \ } #define SBOX0_INVERSE(r0, r1, r2, r3, w, x, y, z) \ { \ u32 r4; \ \ r2 = ~r2; r4 = r1; \ r1 |= r0; r4 = ~r4; \ r1 ^= r2; r2 |= r4; \ r1 ^= r3; r0 ^= r4; \ r2 ^= r0; r0 &= r3; \ r4 ^= r0; r0 |= r1; \ r0 ^= r2; r3 ^= r4; \ r2 ^= r1; r3 ^= r0; \ r3 ^= r1; \ r2 &= r3; \ r4 ^= r2; \ \ w = r0; x = r4; y = r1; z = r3; \ } #define SBOX1(r0, r1, r2, r3, w, x, y, z) \ { \ u32 r4; \ \ r0 = ~r0; r2 = ~r2; \ r4 = r0; r0 &= r1; \ r2 ^= r0; r0 |= r3; \ r3 ^= r2; r1 ^= r0; \ r0 ^= r4; r4 |= r1; \ r1 ^= r3; r2 |= r0; \ r2 &= r4; r0 ^= r1; \ r1 &= r2; \ r1 ^= r0; r0 &= r2; \ r0 ^= r4; \ \ w = r2; x = r0; y = r3; z = r1; \ } #define SBOX1_INVERSE(r0, r1, r2, r3, w, x, y, z) \ { \ u32 r4; \ \ r4 = r1; r1 ^= r3; \ r3 &= r1; r4 ^= r2; \ r3 ^= r0; r0 |= r1; \ r2 ^= r3; r0 ^= r4; \ r0 |= r2; r1 ^= r3; \ r0 ^= r1; r1 |= r3; \ r1 ^= r0; r4 = ~r4; \ r4 ^= r1; r1 |= r0; \ r1 ^= r0; \ r1 |= r4; \ r3 ^= r1; \ \ w = r4; x = r0; y = r3; z = r2; \ } #define SBOX2(r0, r1, r2, r3, w, x, y, z) \ { \ u32 r4; \ \ r4 = r0; r0 &= r2; \ r0 ^= r3; r2 ^= r1; \ r2 ^= r0; r3 |= r4; \ r3 ^= r1; r4 ^= r2; \ r1 = r3; r3 |= r4; \ r3 ^= r0; r0 &= r1; \ r4 ^= r0; r1 ^= r3; \ r1 ^= r4; r4 = ~r4; \ \ w = r2; x = r3; y = r1; z = r4; \ } #define SBOX2_INVERSE(r0, r1, r2, r3, w, x, y, z) \ { \ u32 r4; \ \ r2 ^= r3; r3 ^= r0; \ r4 = r3; r3 &= r2; \ r3 ^= r1; r1 |= r2; \ r1 ^= r4; r4 &= r3; \ r2 ^= r3; r4 &= r0; \ r4 ^= r2; r2 &= r1; \ r2 |= r0; r3 = ~r3; \ r2 ^= r3; r0 ^= r3; \ r0 &= r1; r3 ^= r4; \ r3 ^= r0; \ \ w = r1; x = r4; y = r2; z = r3; \ } #define SBOX3(r0, r1, r2, r3, w, x, y, z) \ { \ u32 r4; \ \ r4 = r0; r0 |= r3; \ r3 ^= r1; r1 &= r4; \ r4 ^= r2; r2 ^= r3; \ r3 &= r0; r4 |= r1; \ r3 ^= r4; r0 ^= r1; \ r4 &= r0; r1 ^= r3; \ r4 ^= r2; r1 |= r0; \ r1 ^= r2; r0 ^= r3; \ r2 = r1; r1 |= r3; \ r1 ^= r0; \ \ w = r1; x = r2; y = r3; z = r4; \ } #define SBOX3_INVERSE(r0, r1, r2, r3, w, x, y, z) \ { \ u32 r4; \ \ r4 = r2; r2 ^= r1; \ r0 ^= r2; r4 &= r2; \ r4 ^= r0; r0 &= r1; \ r1 ^= r3; r3 |= r4; \ r2 ^= r3; r0 ^= r3; \ r1 ^= r4; r3 &= r2; \ r3 ^= r1; r1 ^= r0; \ r1 |= r2; r0 ^= r3; \ r1 ^= r4; \ r0 ^= r1; \ \ w = r2; x = r1; y = r3; z = r0; \ } #define SBOX4(r0, r1, r2, r3, w, x, y, z) \ { \ u32 r4; \ \ r1 ^= r3; r3 = ~r3; \ r2 ^= r3; r3 ^= r0; \ r4 = r1; r1 &= r3; \ r1 ^= r2; r4 ^= r3; \ r0 ^= r4; r2 &= r4; \ r2 ^= r0; r0 &= r1; \ r3 ^= r0; r4 |= r1; \ r4 ^= r0; r0 |= r3; \ r0 ^= r2; r2 &= r3; \ r0 = ~r0; r4 ^= r2; \ \ w = r1; x = r4; y = r0; z = r3; \ } #define SBOX4_INVERSE(r0, r1, r2, r3, w, x, y, z) \ { \ u32 r4; \ \ r4 = r2; r2 &= r3; \ r2 ^= r1; r1 |= r3; \ r1 &= r0; r4 ^= r2; \ r4 ^= r1; r1 &= r2; \ r0 = ~r0; r3 ^= r4; \ r1 ^= r3; r3 &= r0; \ r3 ^= r2; r0 ^= r1; \ r2 &= r0; r3 ^= r0; \ r2 ^= r4; \ r2 |= r3; r3 ^= r0; \ r2 ^= r1; \ \ w = r0; x = r3; y = r2; z = r4; \ } #define SBOX5(r0, r1, r2, r3, w, x, y, z) \ { \ u32 r4; \ \ r0 ^= r1; r1 ^= r3; \ r3 = ~r3; r4 = r1; \ r1 &= r0; r2 ^= r3; \ r1 ^= r2; r2 |= r4; \ r4 ^= r3; r3 &= r1; \ r3 ^= r0; r4 ^= r1; \ r4 ^= r2; r2 ^= r0; \ r0 &= r3; r2 = ~r2; \ r0 ^= r4; r4 |= r3; \ r2 ^= r4; \ \ w = r1; x = r3; y = r0; z = r2; \ } #define SBOX5_INVERSE(r0, r1, r2, r3, w, x, y, z) \ { \ u32 r4; \ \ r1 = ~r1; r4 = r3; \ r2 ^= r1; r3 |= r0; \ r3 ^= r2; r2 |= r1; \ r2 &= r0; r4 ^= r3; \ r2 ^= r4; r4 |= r0; \ r4 ^= r1; r1 &= r2; \ r1 ^= r3; r4 ^= r2; \ r3 &= r4; r4 ^= r1; \ r3 ^= r4; r4 = ~r4; \ r3 ^= r0; \ \ w = r1; x = r4; y = r3; z = r2; \ } #define SBOX6(r0, r1, r2, r3, w, x, y, z) \ { \ u32 r4; \ \ r2 = ~r2; r4 = r3; \ r3 &= r0; r0 ^= r4; \ r3 ^= r2; r2 |= r4; \ r1 ^= r3; r2 ^= r0; \ r0 |= r1; r2 ^= r1; \ r4 ^= r0; r0 |= r3; \ r0 ^= r2; r4 ^= r3; \ r4 ^= r0; r3 = ~r3; \ r2 &= r4; \ r2 ^= r3; \ \ w = r0; x = r1; y = r4; z = r2; \ } #define SBOX6_INVERSE(r0, r1, r2, r3, w, x, y, z) \ { \ u32 r4; \ \ r0 ^= r2; r4 = r2; \ r2 &= r0; r4 ^= r3; \ r2 = ~r2; r3 ^= r1; \ r2 ^= r3; r4 |= r0; \ r0 ^= r2; r3 ^= r4; \ r4 ^= r1; r1 &= r3; \ r1 ^= r0; r0 ^= r3; \ r0 |= r2; r3 ^= r1; \ r4 ^= r0; \ \ w = r1; x = r2; y = r4; z = r3; \ } #define SBOX7(r0, r1, r2, r3, w, x, y, z) \ { \ u32 r4; \ \ r4 = r1; r1 |= r2; \ r1 ^= r3; r4 ^= r2; \ r2 ^= r1; r3 |= r4; \ r3 &= r0; r4 ^= r2; \ r3 ^= r1; r1 |= r4; \ r1 ^= r0; r0 |= r4; \ r0 ^= r2; r1 ^= r4; \ r2 ^= r1; r1 &= r0; \ r1 ^= r4; r2 = ~r2; \ r2 |= r0; \ r4 ^= r2; \ \ w = r4; x = r3; y = r1; z = r0; \ } #define SBOX7_INVERSE(r0, r1, r2, r3, w, x, y, z) \ { \ u32 r4; \ \ r4 = r2; r2 ^= r0; \ r0 &= r3; r4 |= r3; \ r2 = ~r2; r3 ^= r1; \ r1 |= r0; r0 ^= r2; \ r2 &= r4; r3 &= r4; \ r1 ^= r2; r2 ^= r0; \ r0 |= r2; r4 ^= r1; \ r0 ^= r3; r3 ^= r4; \ r4 |= r0; r3 ^= r2; \ r4 ^= r2; \ \ w = r3; x = r0; y = r1; z = r4; \ } /* XOR BLOCK1 into BLOCK0. */ #define BLOCK_XOR(block0, block1) \ { \ block0[0] ^= block1[0]; \ block0[1] ^= block1[1]; \ block0[2] ^= block1[2]; \ block0[3] ^= block1[3]; \ } /* Copy BLOCK_SRC to BLOCK_DST. */ #define BLOCK_COPY(block_dst, block_src) \ { \ block_dst[0] = block_src[0]; \ block_dst[1] = block_src[1]; \ block_dst[2] = block_src[2]; \ block_dst[3] = block_src[3]; \ } /* Apply SBOX number WHICH to to the block found in ARRAY0, writing the output to the block found in ARRAY1. */ #define SBOX(which, array0, array1) \ SBOX##which (array0[0], array0[1], array0[2], array0[3], \ array1[0], array1[1], array1[2], array1[3]); /* Apply inverse SBOX number WHICH to to the block found in ARRAY0, writing the output to the block found in ARRAY1. */ #define SBOX_INVERSE(which, array0, array1) \ SBOX##which##_INVERSE (array0[0], array0[1], array0[2], array0[3], \ array1[0], array1[1], array1[2], array1[3]); /* Apply the linear transformation to BLOCK. */ #define LINEAR_TRANSFORMATION(block) \ { \ block[0] = rol (block[0], 13); \ block[2] = rol (block[2], 3); \ block[1] = block[1] ^ block[0] ^ block[2]; \ block[3] = block[3] ^ block[2] ^ (block[0] << 3); \ block[1] = rol (block[1], 1); \ block[3] = rol (block[3], 7); \ block[0] = block[0] ^ block[1] ^ block[3]; \ block[2] = block[2] ^ block[3] ^ (block[1] << 7); \ block[0] = rol (block[0], 5); \ block[2] = rol (block[2], 22); \ } /* Apply the inverse linear transformation to BLOCK. */ #define LINEAR_TRANSFORMATION_INVERSE(block) \ { \ block[2] = ror (block[2], 22); \ block[0] = ror (block[0] , 5); \ block[2] = block[2] ^ block[3] ^ (block[1] << 7); \ block[0] = block[0] ^ block[1] ^ block[3]; \ block[3] = ror (block[3], 7); \ block[1] = ror (block[1], 1); \ block[3] = block[3] ^ block[2] ^ (block[0] << 3); \ block[1] = block[1] ^ block[0] ^ block[2]; \ block[2] = ror (block[2], 3); \ block[0] = ror (block[0], 13); \ } /* Apply a Serpent round to BLOCK, using the SBOX number WHICH and the subkeys contained in SUBKEYS. Use BLOCK_TMP as temporary storage. This macro increments `round'. */ #define ROUND(which, subkeys, block, block_tmp) \ { \ BLOCK_XOR (block, subkeys[round]); \ round++; \ SBOX (which, block, block_tmp); \ LINEAR_TRANSFORMATION (block_tmp); \ BLOCK_COPY (block, block_tmp); \ } /* Apply the last Serpent round to BLOCK, using the SBOX number WHICH and the subkeys contained in SUBKEYS. Use BLOCK_TMP as temporary storage. The result will be stored in BLOCK_TMP. This macro increments `round'. */ #define ROUND_LAST(which, subkeys, block, block_tmp) \ { \ BLOCK_XOR (block, subkeys[round]); \ round++; \ SBOX (which, block, block_tmp); \ BLOCK_XOR (block_tmp, subkeys[round]); \ round++; \ } /* Apply an inverse Serpent round to BLOCK, using the SBOX number WHICH and the subkeys contained in SUBKEYS. Use BLOCK_TMP as temporary storage. This macro increments `round'. */ #define ROUND_INVERSE(which, subkey, block, block_tmp) \ { \ LINEAR_TRANSFORMATION_INVERSE (block); \ SBOX_INVERSE (which, block, block_tmp); \ BLOCK_XOR (block_tmp, subkey[round]); \ round--; \ BLOCK_COPY (block, block_tmp); \ } /* Apply the first Serpent round to BLOCK, using the SBOX number WHICH and the subkeys contained in SUBKEYS. Use BLOCK_TMP as temporary storage. The result will be stored in BLOCK_TMP. This macro increments `round'. */ #define ROUND_FIRST_INVERSE(which, subkeys, block, block_tmp) \ { \ BLOCK_XOR (block, subkeys[round]); \ round--; \ SBOX_INVERSE (which, block, block_tmp); \ BLOCK_XOR (block_tmp, subkeys[round]); \ round--; \ } /* Convert the user provided key KEY of KEY_LENGTH bytes into the internally used format. */ static void serpent_key_prepare (const byte *key, unsigned int key_length, serpent_key_t key_prepared) { int i; /* Copy key. */ key_length /= 4; for (i = 0; i < key_length; i++) key_prepared[i] = buf_get_le32 (key + i * 4); if (i < 8) { /* Key must be padded according to the Serpent specification. */ key_prepared[i] = 0x00000001; for (i++; i < 8; i++) key_prepared[i] = 0; } } /* Derive the 33 subkeys from KEY and store them in SUBKEYS. */ static void serpent_subkeys_generate (serpent_key_t key, serpent_subkeys_t subkeys) { u32 w[8]; /* The `prekey'. */ u32 ws[4]; u32 wt[4]; /* Initialize with key values. */ w[0] = key[0]; w[1] = key[1]; w[2] = key[2]; w[3] = key[3]; w[4] = key[4]; w[5] = key[5]; w[6] = key[6]; w[7] = key[7]; /* Expand to intermediate key using the affine recurrence. */ #define EXPAND_KEY4(wo, r) \ wo[0] = w[(r+0)%8] = \ rol (w[(r+0)%8] ^ w[(r+3)%8] ^ w[(r+5)%8] ^ w[(r+7)%8] ^ PHI ^ (r+0), 11); \ wo[1] = w[(r+1)%8] = \ rol (w[(r+1)%8] ^ w[(r+4)%8] ^ w[(r+6)%8] ^ w[(r+0)%8] ^ PHI ^ (r+1), 11); \ wo[2] = w[(r+2)%8] = \ rol (w[(r+2)%8] ^ w[(r+5)%8] ^ w[(r+7)%8] ^ w[(r+1)%8] ^ PHI ^ (r+2), 11); \ wo[3] = w[(r+3)%8] = \ rol (w[(r+3)%8] ^ w[(r+6)%8] ^ w[(r+0)%8] ^ w[(r+2)%8] ^ PHI ^ (r+3), 11); #define EXPAND_KEY(r) \ EXPAND_KEY4(ws, (r)); \ EXPAND_KEY4(wt, (r + 4)); /* Calculate subkeys via S-Boxes, in bitslice mode. */ EXPAND_KEY (0); SBOX (3, ws, subkeys[0]); SBOX (2, wt, subkeys[1]); EXPAND_KEY (8); SBOX (1, ws, subkeys[2]); SBOX (0, wt, subkeys[3]); EXPAND_KEY (16); SBOX (7, ws, subkeys[4]); SBOX (6, wt, subkeys[5]); EXPAND_KEY (24); SBOX (5, ws, subkeys[6]); SBOX (4, wt, subkeys[7]); EXPAND_KEY (32); SBOX (3, ws, subkeys[8]); SBOX (2, wt, subkeys[9]); EXPAND_KEY (40); SBOX (1, ws, subkeys[10]); SBOX (0, wt, subkeys[11]); EXPAND_KEY (48); SBOX (7, ws, subkeys[12]); SBOX (6, wt, subkeys[13]); EXPAND_KEY (56); SBOX (5, ws, subkeys[14]); SBOX (4, wt, subkeys[15]); EXPAND_KEY (64); SBOX (3, ws, subkeys[16]); SBOX (2, wt, subkeys[17]); EXPAND_KEY (72); SBOX (1, ws, subkeys[18]); SBOX (0, wt, subkeys[19]); EXPAND_KEY (80); SBOX (7, ws, subkeys[20]); SBOX (6, wt, subkeys[21]); EXPAND_KEY (88); SBOX (5, ws, subkeys[22]); SBOX (4, wt, subkeys[23]); EXPAND_KEY (96); SBOX (3, ws, subkeys[24]); SBOX (2, wt, subkeys[25]); EXPAND_KEY (104); SBOX (1, ws, subkeys[26]); SBOX (0, wt, subkeys[27]); EXPAND_KEY (112); SBOX (7, ws, subkeys[28]); SBOX (6, wt, subkeys[29]); EXPAND_KEY (120); SBOX (5, ws, subkeys[30]); SBOX (4, wt, subkeys[31]); EXPAND_KEY4 (ws, 128); SBOX (3, ws, subkeys[32]); wipememory (ws, sizeof (ws)); wipememory (wt, sizeof (wt)); wipememory (w, sizeof (w)); } /* Initialize CONTEXT with the key KEY of KEY_LENGTH bits. */ static gcry_err_code_t serpent_setkey_internal (serpent_context_t *context, const byte *key, unsigned int key_length) { serpent_key_t key_prepared; if (key_length > 32) return GPG_ERR_INV_KEYLEN; serpent_key_prepare (key, key_length, key_prepared); serpent_subkeys_generate (key_prepared, context->keys); #ifdef USE_AVX512 context->use_avx512 = 0; if ((_gcry_get_hw_features () & HWF_INTEL_AVX512)) { context->use_avx512 = 1; } #endif #ifdef USE_AVX2 context->use_avx2 = 0; if ((_gcry_get_hw_features () & HWF_INTEL_AVX2)) { context->use_avx2 = 1; } #endif #ifdef USE_NEON context->use_neon = 0; if ((_gcry_get_hw_features () & HWF_ARM_NEON)) { context->use_neon = 1; } #endif wipememory (key_prepared, sizeof(key_prepared)); return 0; } /* Initialize CTX with the key KEY of KEY_LENGTH bytes. */ static gcry_err_code_t serpent_setkey (void *ctx, const byte *key, unsigned int key_length, cipher_bulk_ops_t *bulk_ops) { serpent_context_t *context = ctx; static const char *serpent_test_ret; static int serpent_init_done; gcry_err_code_t ret = GPG_ERR_NO_ERROR; if (! serpent_init_done) { /* Execute a self-test the first time, Serpent is used. */ serpent_init_done = 1; serpent_test_ret = serpent_test (); if (serpent_test_ret) log_error ("Serpent test failure: %s\n", serpent_test_ret); } /* Setup bulk encryption routines. */ memset (bulk_ops, 0, sizeof(*bulk_ops)); bulk_ops->cbc_dec = _gcry_serpent_cbc_dec; bulk_ops->cfb_dec = _gcry_serpent_cfb_dec; bulk_ops->ctr_enc = _gcry_serpent_ctr_enc; bulk_ops->ocb_crypt = _gcry_serpent_ocb_crypt; bulk_ops->ocb_auth = _gcry_serpent_ocb_auth; bulk_ops->xts_crypt = _gcry_serpent_xts_crypt; bulk_ops->ecb_crypt = _gcry_serpent_ecb_crypt; if (serpent_test_ret) ret = GPG_ERR_SELFTEST_FAILED; else ret = serpent_setkey_internal (context, key, key_length); return ret; } static void serpent_encrypt_internal (serpent_context_t *context, const byte *input, byte *output) { serpent_block_t b, b_next; int round = 0; b[0] = buf_get_le32 (input + 0); b[1] = buf_get_le32 (input + 4); b[2] = buf_get_le32 (input + 8); b[3] = buf_get_le32 (input + 12); ROUND (0, context->keys, b, b_next); ROUND (1, context->keys, b, b_next); ROUND (2, context->keys, b, b_next); ROUND (3, context->keys, b, b_next); ROUND (4, context->keys, b, b_next); ROUND (5, context->keys, b, b_next); ROUND (6, context->keys, b, b_next); ROUND (7, context->keys, b, b_next); ROUND (0, context->keys, b, b_next); ROUND (1, context->keys, b, b_next); ROUND (2, context->keys, b, b_next); ROUND (3, context->keys, b, b_next); ROUND (4, context->keys, b, b_next); ROUND (5, context->keys, b, b_next); ROUND (6, context->keys, b, b_next); ROUND (7, context->keys, b, b_next); ROUND (0, context->keys, b, b_next); ROUND (1, context->keys, b, b_next); ROUND (2, context->keys, b, b_next); ROUND (3, context->keys, b, b_next); ROUND (4, context->keys, b, b_next); ROUND (5, context->keys, b, b_next); ROUND (6, context->keys, b, b_next); ROUND (7, context->keys, b, b_next); ROUND (0, context->keys, b, b_next); ROUND (1, context->keys, b, b_next); ROUND (2, context->keys, b, b_next); ROUND (3, context->keys, b, b_next); ROUND (4, context->keys, b, b_next); ROUND (5, context->keys, b, b_next); ROUND (6, context->keys, b, b_next); ROUND_LAST (7, context->keys, b, b_next); buf_put_le32 (output + 0, b_next[0]); buf_put_le32 (output + 4, b_next[1]); buf_put_le32 (output + 8, b_next[2]); buf_put_le32 (output + 12, b_next[3]); } static void serpent_decrypt_internal (serpent_context_t *context, const byte *input, byte *output) { serpent_block_t b, b_next; int round = ROUNDS; b_next[0] = buf_get_le32 (input + 0); b_next[1] = buf_get_le32 (input + 4); b_next[2] = buf_get_le32 (input + 8); b_next[3] = buf_get_le32 (input + 12); ROUND_FIRST_INVERSE (7, context->keys, b_next, b); ROUND_INVERSE (6, context->keys, b, b_next); ROUND_INVERSE (5, context->keys, b, b_next); ROUND_INVERSE (4, context->keys, b, b_next); ROUND_INVERSE (3, context->keys, b, b_next); ROUND_INVERSE (2, context->keys, b, b_next); ROUND_INVERSE (1, context->keys, b, b_next); ROUND_INVERSE (0, context->keys, b, b_next); ROUND_INVERSE (7, context->keys, b, b_next); ROUND_INVERSE (6, context->keys, b, b_next); ROUND_INVERSE (5, context->keys, b, b_next); ROUND_INVERSE (4, context->keys, b, b_next); ROUND_INVERSE (3, context->keys, b, b_next); ROUND_INVERSE (2, context->keys, b, b_next); ROUND_INVERSE (1, context->keys, b, b_next); ROUND_INVERSE (0, context->keys, b, b_next); ROUND_INVERSE (7, context->keys, b, b_next); ROUND_INVERSE (6, context->keys, b, b_next); ROUND_INVERSE (5, context->keys, b, b_next); ROUND_INVERSE (4, context->keys, b, b_next); ROUND_INVERSE (3, context->keys, b, b_next); ROUND_INVERSE (2, context->keys, b, b_next); ROUND_INVERSE (1, context->keys, b, b_next); ROUND_INVERSE (0, context->keys, b, b_next); ROUND_INVERSE (7, context->keys, b, b_next); ROUND_INVERSE (6, context->keys, b, b_next); ROUND_INVERSE (5, context->keys, b, b_next); ROUND_INVERSE (4, context->keys, b, b_next); ROUND_INVERSE (3, context->keys, b, b_next); ROUND_INVERSE (2, context->keys, b, b_next); ROUND_INVERSE (1, context->keys, b, b_next); ROUND_INVERSE (0, context->keys, b, b_next); buf_put_le32 (output + 0, b_next[0]); buf_put_le32 (output + 4, b_next[1]); buf_put_le32 (output + 8, b_next[2]); buf_put_le32 (output + 12, b_next[3]); } static unsigned int serpent_encrypt (void *ctx, byte *buffer_out, const byte *buffer_in) { serpent_context_t *context = ctx; serpent_encrypt_internal (context, buffer_in, buffer_out); return /*burn_stack*/ (2 * sizeof (serpent_block_t)); } static unsigned int serpent_decrypt (void *ctx, byte *buffer_out, const byte *buffer_in) { serpent_context_t *context = ctx; serpent_decrypt_internal (context, buffer_in, buffer_out); return /*burn_stack*/ (2 * sizeof (serpent_block_t)); } /* Bulk encryption of complete blocks in CTR mode. This function is only intended for the bulk encryption feature of cipher.c. CTR is expected to be of size sizeof(serpent_block_t). */ static void _gcry_serpent_ctr_enc(void *context, unsigned char *ctr, void *outbuf_arg, const void *inbuf_arg, size_t nblocks) { serpent_context_t *ctx = context; unsigned char *outbuf = outbuf_arg; const unsigned char *inbuf = inbuf_arg; unsigned char tmpbuf[sizeof(serpent_block_t)]; int burn_stack_depth = 2 * sizeof (serpent_block_t); #ifdef USE_AVX512 if (ctx->use_avx512) { int did_use_avx512 = 0; /* Process data in 32 block chunks. */ while (nblocks >= 32) { _gcry_serpent_avx512_ctr_enc(ctx, outbuf, inbuf, ctr); nblocks -= 32; outbuf += 32 * sizeof(serpent_block_t); inbuf += 32 * sizeof(serpent_block_t); did_use_avx512 = 1; } if (did_use_avx512) { /* serpent-avx512 code does not use stack */ if (nblocks == 0) burn_stack_depth = 0; } /* Use generic/avx2/sse2 code to handle smaller chunks... */ /* TODO: use caching instead? */ } #endif #ifdef USE_AVX2 if (ctx->use_avx2) { int did_use_avx2 = 0; /* Process data in 16 block chunks. */ while (nblocks >= 16) { _gcry_serpent_avx2_ctr_enc(ctx, outbuf, inbuf, ctr); nblocks -= 16; outbuf += 16 * sizeof(serpent_block_t); inbuf += 16 * sizeof(serpent_block_t); did_use_avx2 = 1; } if (did_use_avx2) { /* serpent-avx2 assembly code does not use stack */ if (nblocks == 0) burn_stack_depth = 0; } /* Use generic/sse2 code to handle smaller chunks... */ /* TODO: use caching instead? */ } #endif #ifdef USE_SSE2 { int did_use_sse2 = 0; /* Process data in 8 block chunks. */ while (nblocks >= 8) { _gcry_serpent_sse2_ctr_enc(ctx, outbuf, inbuf, ctr); nblocks -= 8; outbuf += 8 * sizeof(serpent_block_t); inbuf += 8 * sizeof(serpent_block_t); did_use_sse2 = 1; } if (did_use_sse2) { /* serpent-sse2 assembly code does not use stack */ if (nblocks == 0) burn_stack_depth = 0; } /* Use generic code to handle smaller chunks... */ /* TODO: use caching instead? */ } #endif #ifdef USE_NEON if (ctx->use_neon) { int did_use_neon = 0; /* Process data in 8 block chunks. */ while (nblocks >= 8) { _gcry_serpent_neon_ctr_enc(ctx, outbuf, inbuf, ctr); nblocks -= 8; outbuf += 8 * sizeof(serpent_block_t); inbuf += 8 * sizeof(serpent_block_t); did_use_neon = 1; } if (did_use_neon) { /* serpent-neon assembly code does not use stack */ if (nblocks == 0) burn_stack_depth = 0; } /* Use generic code to handle smaller chunks... */ /* TODO: use caching instead? */ } #endif for ( ;nblocks; nblocks-- ) { /* Encrypt the counter. */ serpent_encrypt_internal(ctx, ctr, tmpbuf); /* XOR the input with the encrypted counter and store in output. */ cipher_block_xor(outbuf, tmpbuf, inbuf, sizeof(serpent_block_t)); outbuf += sizeof(serpent_block_t); inbuf += sizeof(serpent_block_t); /* Increment the counter. */ cipher_block_add(ctr, 1, sizeof(serpent_block_t)); } wipememory(tmpbuf, sizeof(tmpbuf)); _gcry_burn_stack(burn_stack_depth); } /* Bulk decryption of complete blocks in CBC mode. This function is only intended for the bulk encryption feature of cipher.c. */ static void _gcry_serpent_cbc_dec(void *context, unsigned char *iv, void *outbuf_arg, const void *inbuf_arg, size_t nblocks) { serpent_context_t *ctx = context; unsigned char *outbuf = outbuf_arg; const unsigned char *inbuf = inbuf_arg; unsigned char savebuf[sizeof(serpent_block_t)]; int burn_stack_depth = 2 * sizeof (serpent_block_t); #ifdef USE_AVX512 if (ctx->use_avx512) { int did_use_avx512 = 0; /* Process data in 32 block chunks. */ while (nblocks >= 32) { _gcry_serpent_avx512_cbc_dec(ctx, outbuf, inbuf, iv); nblocks -= 32; outbuf += 32 * sizeof(serpent_block_t); inbuf += 32 * sizeof(serpent_block_t); did_use_avx512 = 1; } if (did_use_avx512) { /* serpent-avx512 code does not use stack */ if (nblocks == 0) burn_stack_depth = 0; } /* Use generic/avx2/sse2 code to handle smaller chunks... */ } #endif #ifdef USE_AVX2 if (ctx->use_avx2) { int did_use_avx2 = 0; /* Process data in 16 block chunks. */ while (nblocks >= 16) { _gcry_serpent_avx2_cbc_dec(ctx, outbuf, inbuf, iv); nblocks -= 16; outbuf += 16 * sizeof(serpent_block_t); inbuf += 16 * sizeof(serpent_block_t); did_use_avx2 = 1; } if (did_use_avx2) { /* serpent-avx2 assembly code does not use stack */ if (nblocks == 0) burn_stack_depth = 0; } /* Use generic/sse2 code to handle smaller chunks... */ } #endif #ifdef USE_SSE2 { int did_use_sse2 = 0; /* Process data in 8 block chunks. */ while (nblocks >= 8) { _gcry_serpent_sse2_cbc_dec(ctx, outbuf, inbuf, iv); nblocks -= 8; outbuf += 8 * sizeof(serpent_block_t); inbuf += 8 * sizeof(serpent_block_t); did_use_sse2 = 1; } if (did_use_sse2) { /* serpent-sse2 assembly code does not use stack */ if (nblocks == 0) burn_stack_depth = 0; } /* Use generic code to handle smaller chunks... */ } #endif #ifdef USE_NEON if (ctx->use_neon) { int did_use_neon = 0; /* Process data in 8 block chunks. */ while (nblocks >= 8) { _gcry_serpent_neon_cbc_dec(ctx, outbuf, inbuf, iv); nblocks -= 8; outbuf += 8 * sizeof(serpent_block_t); inbuf += 8 * sizeof(serpent_block_t); did_use_neon = 1; } if (did_use_neon) { /* serpent-neon assembly code does not use stack */ if (nblocks == 0) burn_stack_depth = 0; } /* Use generic code to handle smaller chunks... */ } #endif for ( ;nblocks; nblocks-- ) { /* INBUF is needed later and it may be identical to OUTBUF, so store the intermediate result to SAVEBUF. */ serpent_decrypt_internal (ctx, inbuf, savebuf); cipher_block_xor_n_copy_2(outbuf, savebuf, iv, inbuf, sizeof(serpent_block_t)); inbuf += sizeof(serpent_block_t); outbuf += sizeof(serpent_block_t); } wipememory(savebuf, sizeof(savebuf)); _gcry_burn_stack(burn_stack_depth); } /* Bulk decryption of complete blocks in CFB mode. This function is only intended for the bulk encryption feature of cipher.c. */ static void _gcry_serpent_cfb_dec(void *context, unsigned char *iv, void *outbuf_arg, const void *inbuf_arg, size_t nblocks) { serpent_context_t *ctx = context; unsigned char *outbuf = outbuf_arg; const unsigned char *inbuf = inbuf_arg; int burn_stack_depth = 2 * sizeof (serpent_block_t); #ifdef USE_AVX512 if (ctx->use_avx512) { int did_use_avx512 = 0; /* Process data in 32 block chunks. */ while (nblocks >= 32) { _gcry_serpent_avx512_cfb_dec(ctx, outbuf, inbuf, iv); nblocks -= 32; outbuf += 32 * sizeof(serpent_block_t); inbuf += 32 * sizeof(serpent_block_t); did_use_avx512 = 1; } if (did_use_avx512) { /* serpent-avx512 code does not use stack */ if (nblocks == 0) burn_stack_depth = 0; } /* Use generic/avx2/sse2 code to handle smaller chunks... */ } #endif #ifdef USE_AVX2 if (ctx->use_avx2) { int did_use_avx2 = 0; /* Process data in 16 block chunks. */ while (nblocks >= 16) { _gcry_serpent_avx2_cfb_dec(ctx, outbuf, inbuf, iv); nblocks -= 16; outbuf += 16 * sizeof(serpent_block_t); inbuf += 16 * sizeof(serpent_block_t); did_use_avx2 = 1; } if (did_use_avx2) { /* serpent-avx2 assembly code does not use stack */ if (nblocks == 0) burn_stack_depth = 0; } /* Use generic/sse2 code to handle smaller chunks... */ } #endif #ifdef USE_SSE2 { int did_use_sse2 = 0; /* Process data in 8 block chunks. */ while (nblocks >= 8) { _gcry_serpent_sse2_cfb_dec(ctx, outbuf, inbuf, iv); nblocks -= 8; outbuf += 8 * sizeof(serpent_block_t); inbuf += 8 * sizeof(serpent_block_t); did_use_sse2 = 1; } if (did_use_sse2) { /* serpent-sse2 assembly code does not use stack */ if (nblocks == 0) burn_stack_depth = 0; } /* Use generic code to handle smaller chunks... */ } #endif #ifdef USE_NEON if (ctx->use_neon) { int did_use_neon = 0; /* Process data in 8 block chunks. */ while (nblocks >= 8) { _gcry_serpent_neon_cfb_dec(ctx, outbuf, inbuf, iv); nblocks -= 8; outbuf += 8 * sizeof(serpent_block_t); inbuf += 8 * sizeof(serpent_block_t); did_use_neon = 1; } if (did_use_neon) { /* serpent-neon assembly code does not use stack */ if (nblocks == 0) burn_stack_depth = 0; } /* Use generic code to handle smaller chunks... */ } #endif for ( ;nblocks; nblocks-- ) { serpent_encrypt_internal(ctx, iv, iv); cipher_block_xor_n_copy(outbuf, iv, inbuf, sizeof(serpent_block_t)); outbuf += sizeof(serpent_block_t); inbuf += sizeof(serpent_block_t); } _gcry_burn_stack(burn_stack_depth); } /* Bulk encryption/decryption of complete blocks in OCB mode. */ static size_t _gcry_serpent_ocb_crypt (gcry_cipher_hd_t c, void *outbuf_arg, const void *inbuf_arg, size_t nblocks, int encrypt) { #if defined(USE_AVX512) || defined(USE_AVX2) || defined(USE_SSE2) \ || defined(USE_NEON) serpent_context_t *ctx = (void *)&c->context.c; unsigned char *outbuf = outbuf_arg; const unsigned char *inbuf = inbuf_arg; int burn_stack_depth = 2 * sizeof (serpent_block_t); u64 blkn = c->u_mode.ocb.data_nblocks; #else (void)c; (void)outbuf_arg; (void)inbuf_arg; (void)encrypt; #endif #ifdef USE_AVX512 if (ctx->use_avx512) { int did_use_avx512 = 0; ocb_L_uintptr_t Ls[32]; ocb_L_uintptr_t *l; if (nblocks >= 32) { l = bulk_ocb_prepare_L_pointers_array_blk32 (c, Ls, blkn); /* Process data in 32 block chunks. */ while (nblocks >= 32) { blkn += 32; *l = (uintptr_t)(void *)ocb_get_l(c, blkn - blkn % 32); _gcry_serpent_avx512_ocb_crypt(ctx, outbuf, inbuf, c->u_iv.iv, c->u_ctr.ctr, Ls, encrypt); nblocks -= 32; outbuf += 32 * sizeof(serpent_block_t); inbuf += 32 * sizeof(serpent_block_t); did_use_avx512 = 1; } } if (did_use_avx512) { /* serpent-avx512 code does not use stack */ if (nblocks == 0) burn_stack_depth = 0; } /* Use generic code to handle smaller chunks... */ } #endif #ifdef USE_AVX2 if (ctx->use_avx2) { int did_use_avx2 = 0; u64 Ls[16]; u64 *l; if (nblocks >= 16) { l = bulk_ocb_prepare_L_pointers_array_blk16 (c, Ls, blkn); /* Process data in 16 block chunks. */ while (nblocks >= 16) { blkn += 16; *l = (uintptr_t)(void *)ocb_get_l(c, blkn - blkn % 16); if (encrypt) _gcry_serpent_avx2_ocb_enc(ctx, outbuf, inbuf, c->u_iv.iv, c->u_ctr.ctr, Ls); else _gcry_serpent_avx2_ocb_dec(ctx, outbuf, inbuf, c->u_iv.iv, c->u_ctr.ctr, Ls); nblocks -= 16; outbuf += 16 * sizeof(serpent_block_t); inbuf += 16 * sizeof(serpent_block_t); did_use_avx2 = 1; } } if (did_use_avx2) { /* serpent-avx2 assembly code does not use stack */ if (nblocks == 0) burn_stack_depth = 0; } /* Use generic code to handle smaller chunks... */ } #endif #ifdef USE_SSE2 { int did_use_sse2 = 0; u64 Ls[8]; u64 *l; if (nblocks >= 8) { l = bulk_ocb_prepare_L_pointers_array_blk8 (c, Ls, blkn); /* Process data in 8 block chunks. */ while (nblocks >= 8) { blkn += 8; *l = (uintptr_t)(void *)ocb_get_l(c, blkn - blkn % 8); if (encrypt) _gcry_serpent_sse2_ocb_enc(ctx, outbuf, inbuf, c->u_iv.iv, c->u_ctr.ctr, Ls); else _gcry_serpent_sse2_ocb_dec(ctx, outbuf, inbuf, c->u_iv.iv, c->u_ctr.ctr, Ls); nblocks -= 8; outbuf += 8 * sizeof(serpent_block_t); inbuf += 8 * sizeof(serpent_block_t); did_use_sse2 = 1; } } if (did_use_sse2) { /* serpent-sse2 assembly code does not use stack */ if (nblocks == 0) burn_stack_depth = 0; } /* Use generic code to handle smaller chunks... */ } #endif #ifdef USE_NEON if (ctx->use_neon) { int did_use_neon = 0; uintptr_t Ls[8]; uintptr_t *l; if (nblocks >= 8) { l = bulk_ocb_prepare_L_pointers_array_blk8 (c, Ls, blkn); /* Process data in 8 block chunks. */ while (nblocks >= 8) { blkn += 8; *l = (uintptr_t)(void *)ocb_get_l(c, blkn - blkn % 8); if (encrypt) _gcry_serpent_neon_ocb_enc(ctx, outbuf, inbuf, c->u_iv.iv, c->u_ctr.ctr, (const void **)Ls); else _gcry_serpent_neon_ocb_dec(ctx, outbuf, inbuf, c->u_iv.iv, c->u_ctr.ctr, (const void **)Ls); nblocks -= 8; outbuf += 8 * sizeof(serpent_block_t); inbuf += 8 * sizeof(serpent_block_t); did_use_neon = 1; } } if (did_use_neon) { /* serpent-neon assembly code does not use stack */ if (nblocks == 0) burn_stack_depth = 0; } /* Use generic code to handle smaller chunks... */ } #endif #if defined(USE_AVX512) || defined(USE_AVX2) || defined(USE_SSE2) \ || defined(USE_NEON) c->u_mode.ocb.data_nblocks = blkn; if (burn_stack_depth) _gcry_burn_stack (burn_stack_depth + 4 * sizeof(void *)); #endif return nblocks; } /* Bulk authentication of complete blocks in OCB mode. */ static size_t _gcry_serpent_ocb_auth (gcry_cipher_hd_t c, const void *abuf_arg, size_t nblocks) { #if defined(USE_AVX2) || defined(USE_SSE2) || defined(USE_NEON) serpent_context_t *ctx = (void *)&c->context.c; const unsigned char *abuf = abuf_arg; int burn_stack_depth = 2 * sizeof(serpent_block_t); u64 blkn = c->u_mode.ocb.aad_nblocks; #else (void)c; (void)abuf_arg; #endif #ifdef USE_AVX2 if (ctx->use_avx2) { int did_use_avx2 = 0; u64 Ls[16]; u64 *l; if (nblocks >= 16) { l = bulk_ocb_prepare_L_pointers_array_blk16 (c, Ls, blkn); /* Process data in 16 block chunks. */ while (nblocks >= 16) { blkn += 16; *l = (uintptr_t)(void *)ocb_get_l(c, blkn - blkn % 16); _gcry_serpent_avx2_ocb_auth(ctx, abuf, c->u_mode.ocb.aad_offset, c->u_mode.ocb.aad_sum, Ls); nblocks -= 16; abuf += 16 * sizeof(serpent_block_t); did_use_avx2 = 1; } } if (did_use_avx2) { /* serpent-avx2 assembly code does not use stack */ if (nblocks == 0) burn_stack_depth = 0; } /* Use generic code to handle smaller chunks... */ } #endif #ifdef USE_SSE2 { int did_use_sse2 = 0; u64 Ls[8]; u64 *l; if (nblocks >= 8) { l = bulk_ocb_prepare_L_pointers_array_blk8 (c, Ls, blkn); /* Process data in 8 block chunks. */ while (nblocks >= 8) { blkn += 8; *l = (uintptr_t)(void *)ocb_get_l(c, blkn - blkn % 8); _gcry_serpent_sse2_ocb_auth(ctx, abuf, c->u_mode.ocb.aad_offset, c->u_mode.ocb.aad_sum, Ls); nblocks -= 8; abuf += 8 * sizeof(serpent_block_t); did_use_sse2 = 1; } } if (did_use_sse2) { /* serpent-avx2 assembly code does not use stack */ if (nblocks == 0) burn_stack_depth = 0; } /* Use generic code to handle smaller chunks... */ } #endif #ifdef USE_NEON if (ctx->use_neon) { int did_use_neon = 0; uintptr_t Ls[8]; uintptr_t *l; if (nblocks >= 8) { l = bulk_ocb_prepare_L_pointers_array_blk8 (c, Ls, blkn); /* Process data in 8 block chunks. */ while (nblocks >= 8) { blkn += 8; *l = (uintptr_t)(void *)ocb_get_l(c, blkn - blkn % 8); _gcry_serpent_neon_ocb_auth(ctx, abuf, c->u_mode.ocb.aad_offset, c->u_mode.ocb.aad_sum, (const void **)Ls); nblocks -= 8; abuf += 8 * sizeof(serpent_block_t); did_use_neon = 1; } } if (did_use_neon) { /* serpent-neon assembly code does not use stack */ if (nblocks == 0) burn_stack_depth = 0; } /* Use generic code to handle smaller chunks... */ } #endif #if defined(USE_AVX2) || defined(USE_SSE2) || defined(USE_NEON) c->u_mode.ocb.aad_nblocks = blkn; if (burn_stack_depth) _gcry_burn_stack (burn_stack_depth + 4 * sizeof(void *)); #endif return nblocks; } static unsigned int serpent_crypt_blk1_32(void *context, byte *out, const byte *in, size_t num_blks, int encrypt) { serpent_context_t *ctx = context; unsigned int burn, burn_stack_depth = 0; #ifdef USE_AVX512 if (num_blks == 32 && ctx->use_avx512) { _gcry_serpent_avx512_blk32 (ctx, out, in, encrypt); return 0; } #endif #ifdef USE_AVX2 while (num_blks == 16 && ctx->use_avx2) { _gcry_serpent_avx2_blk16 (ctx, out, in, encrypt); out += 16 * sizeof(serpent_block_t); in += 16 * sizeof(serpent_block_t); num_blks -= 16; } #endif #ifdef USE_SSE2 while (num_blks >= 8) { _gcry_serpent_sse2_blk8 (ctx, out, in, encrypt); out += 8 * sizeof(serpent_block_t); in += 8 * sizeof(serpent_block_t); num_blks -= 8; } #endif #ifdef USE_NEON if (ctx->use_neon) { while (num_blks >= 8) { _gcry_serpent_neon_blk8 (ctx, out, in, encrypt); out += 8 * sizeof(serpent_block_t); in += 8 * sizeof(serpent_block_t); num_blks -= 8; } } #endif while (num_blks >= 1) { if (encrypt) serpent_encrypt_internal((void *)ctx, in, out); else serpent_decrypt_internal((void *)ctx, in, out); burn = 2 * sizeof(serpent_block_t); burn_stack_depth = (burn > burn_stack_depth) ? burn : burn_stack_depth; out += sizeof(serpent_block_t); in += sizeof(serpent_block_t); num_blks--; } return burn_stack_depth; } static unsigned int serpent_encrypt_blk1_32(void *ctx, byte *out, const byte *in, size_t num_blks) { return serpent_crypt_blk1_32 (ctx, out, in, num_blks, 1); } static unsigned int serpent_decrypt_blk1_32(void *ctx, byte *out, const byte *in, size_t num_blks) { return serpent_crypt_blk1_32 (ctx, out, in, num_blks, 0); } /* Bulk encryption/decryption of complete blocks in XTS mode. */ static void _gcry_serpent_xts_crypt (void *context, unsigned char *tweak, void *outbuf_arg, const void *inbuf_arg, size_t nblocks, int encrypt) { serpent_context_t *ctx = context; unsigned char *outbuf = outbuf_arg; const unsigned char *inbuf = inbuf_arg; int burn_stack_depth = 0; /* Process remaining blocks. */ if (nblocks) { unsigned char tmpbuf[32 * 16]; unsigned int tmp_used = 16; size_t nburn; nburn = bulk_xts_crypt_128(ctx, encrypt ? serpent_encrypt_blk1_32 : serpent_decrypt_blk1_32, outbuf, inbuf, nblocks, tweak, tmpbuf, sizeof(tmpbuf) / 16, &tmp_used); burn_stack_depth = nburn > burn_stack_depth ? nburn : burn_stack_depth; wipememory(tmpbuf, tmp_used); } if (burn_stack_depth) _gcry_burn_stack(burn_stack_depth); } /* Bulk encryption/decryption in ECB mode. */ static void _gcry_serpent_ecb_crypt (void *context, void *outbuf_arg, const void *inbuf_arg, size_t nblocks, int encrypt) { serpent_context_t *ctx = context; unsigned char *outbuf = outbuf_arg; const unsigned char *inbuf = inbuf_arg; int burn_stack_depth = 0; /* Process remaining blocks. */ if (nblocks) { size_t nburn; nburn = bulk_ecb_crypt_128(ctx, encrypt ? serpent_encrypt_blk1_32 : serpent_decrypt_blk1_32, outbuf, inbuf, nblocks, 32); burn_stack_depth = nburn > burn_stack_depth ? nburn : burn_stack_depth; } if (burn_stack_depth) _gcry_burn_stack(burn_stack_depth); } /* Serpent test. */ static const char *serpent_test (void) { return 0; } static const gcry_cipher_oid_spec_t serpent128_oids[] = { {"1.3.6.1.4.1.11591.13.2.1", GCRY_CIPHER_MODE_ECB }, {"1.3.6.1.4.1.11591.13.2.2", GCRY_CIPHER_MODE_CBC }, {"1.3.6.1.4.1.11591.13.2.3", GCRY_CIPHER_MODE_OFB }, {"1.3.6.1.4.1.11591.13.2.4", GCRY_CIPHER_MODE_CFB }, { NULL } }; static const gcry_cipher_oid_spec_t serpent192_oids[] = { {"1.3.6.1.4.1.11591.13.2.21", GCRY_CIPHER_MODE_ECB }, {"1.3.6.1.4.1.11591.13.2.22", GCRY_CIPHER_MODE_CBC }, {"1.3.6.1.4.1.11591.13.2.23", GCRY_CIPHER_MODE_OFB }, {"1.3.6.1.4.1.11591.13.2.24", GCRY_CIPHER_MODE_CFB }, { NULL } }; static const gcry_cipher_oid_spec_t serpent256_oids[] = { {"1.3.6.1.4.1.11591.13.2.41", GCRY_CIPHER_MODE_ECB }, {"1.3.6.1.4.1.11591.13.2.42", GCRY_CIPHER_MODE_CBC }, {"1.3.6.1.4.1.11591.13.2.43", GCRY_CIPHER_MODE_OFB }, {"1.3.6.1.4.1.11591.13.2.44", GCRY_CIPHER_MODE_CFB }, { NULL } }; static const char *serpent128_aliases[] = { "SERPENT", "SERPENT-128", NULL }; static const char *serpent192_aliases[] = { "SERPENT-192", NULL }; static const char *serpent256_aliases[] = { "SERPENT-256", NULL }; gcry_cipher_spec_t _gcry_cipher_spec_serpent128 = { GCRY_CIPHER_SERPENT128, {0, 0}, "SERPENT128", serpent128_aliases, serpent128_oids, 16, 128, sizeof (serpent_context_t), serpent_setkey, serpent_encrypt, serpent_decrypt , GRUB_UTIL_MODNAME("gcry_serpent") }; gcry_cipher_spec_t _gcry_cipher_spec_serpent192 = { GCRY_CIPHER_SERPENT192, {0, 0}, "SERPENT192", serpent192_aliases, serpent192_oids, 16, 192, sizeof (serpent_context_t), serpent_setkey, serpent_encrypt, serpent_decrypt , GRUB_UTIL_MODNAME("gcry_serpent") }; gcry_cipher_spec_t _gcry_cipher_spec_serpent256 = { GCRY_CIPHER_SERPENT256, {0, 0}, "SERPENT256", serpent256_aliases, serpent256_oids, 16, 256, sizeof (serpent_context_t), serpent_setkey, serpent_encrypt, serpent_decrypt , GRUB_UTIL_MODNAME("gcry_serpent") }; GRUB_MOD_INIT(gcry_serpent) { grub_cipher_register (&_gcry_cipher_spec_serpent128); grub_cipher_register (&_gcry_cipher_spec_serpent192); grub_cipher_register (&_gcry_cipher_spec_serpent256); } GRUB_MOD_FINI(gcry_serpent) { grub_cipher_unregister (&_gcry_cipher_spec_serpent128); grub_cipher_unregister (&_gcry_cipher_spec_serpent192); grub_cipher_unregister (&_gcry_cipher_spec_serpent256); } grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/cipher/kdf-internal.h0000644000175000017500000000300215036452441023365 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ /* kdf-internal.h - Internal defs for kdf.c * Copyright (C) 2013 g10 Code GmbH * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . */ #ifndef GCRY_KDF_INTERNAL_H #define GCRY_KDF_INTERNAL_H /*-- kdf.c --*/ gpg_err_code_t _gcry_kdf_pkdf2 (const void *passphrase, size_t passphraselen, int hashalgo, const void *salt, size_t saltlen, unsigned long iterations, size_t keysize, void *keybuffer); /*-- scrypt.c --*/ gcry_err_code_t _gcry_kdf_scrypt (const unsigned char *passwd, size_t passwdlen, int algo, int subalgo, const unsigned char *salt, size_t saltlen, unsigned long iterations, size_t dklen, unsigned char *dk); #endif /*GCRY_KDF_INTERNAL_H*/ grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/cipher/cast5.c0000644000175000017500000015171715036452441022042 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ #include GRUB_MOD_LICENSE ("GPLv3+"); /* cast5.c - CAST5 cipher (RFC2144) * Copyright (C) 1998, 2001, 2002, 2003 Free Software Foundation, Inc. * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . * SPDX-License-Identifier: LGPL-2.1-or-later */ /* Test vectors: * * 128-bit key = 01 23 45 67 12 34 56 78 23 45 67 89 34 56 78 9A * plaintext = 01 23 45 67 89 AB CD EF * ciphertext = 23 8B 4F E5 84 7E 44 B2 * * 80-bit key = 01 23 45 67 12 34 56 78 23 45 * = 01 23 45 67 12 34 56 78 23 45 00 00 00 00 00 00 * plaintext = 01 23 45 67 89 AB CD EF * ciphertext = EB 6A 71 1A 2C 02 27 1B * * 40-bit key = 01 23 45 67 12 * = 01 23 45 67 12 00 00 00 00 00 00 00 00 00 00 00 * plaintext = 01 23 45 67 89 AB CD EF * ciphertext = 7A C8 16 D1 6E 9B 30 2E */ #include "g10lib.h" #include "types.h" #include "cipher.h" #include "bithelp.h" #include "bufhelp.h" #include "cipher-internal.h" /* USE_AMD64_ASM indicates whether to use AMD64 assembly code. */ #undef USE_AMD64_ASM #if defined(__x86_64__) && (defined(HAVE_COMPATIBLE_GCC_AMD64_PLATFORM_AS) || \ defined(HAVE_COMPATIBLE_GCC_WIN64_PLATFORM_AS)) # define USE_AMD64_ASM 1 #endif /* USE_ARM_ASM indicates whether to use ARM assembly code. */ #undef USE_ARM_ASM #if defined(__ARMEL__) # ifdef HAVE_COMPATIBLE_GCC_ARM_PLATFORM_AS # define USE_ARM_ASM 1 # endif #endif #define CAST5_BLOCKSIZE 8 typedef struct { u32 Km[16]; byte Kr[16]; #ifdef USE_ARM_ASM u32 Kr_arm_enc[16 / sizeof(u32)]; u32 Kr_arm_dec[16 / sizeof(u32)]; #endif } CAST5_context; static gcry_err_code_t cast_setkey (void *c, const byte *key, unsigned keylen, cipher_bulk_ops_t *bulk_ops); static unsigned int encrypt_block (void *c, byte *outbuf, const byte *inbuf); static unsigned int decrypt_block (void *c, byte *outbuf, const byte *inbuf); #define s1 _gcry_cast5_s1to4[0] #define s2 _gcry_cast5_s1to4[1] #define s3 _gcry_cast5_s1to4[2] #define s4 _gcry_cast5_s1to4[3] const u32 _gcry_cast5_s1to4[4][256] = { { 0x30fb40d4, 0x9fa0ff0b, 0x6beccd2f, 0x3f258c7a, 0x1e213f2f, 0x9c004dd3, 0x6003e540, 0xcf9fc949, 0xbfd4af27, 0x88bbbdb5, 0xe2034090, 0x98d09675, 0x6e63a0e0, 0x15c361d2, 0xc2e7661d, 0x22d4ff8e, 0x28683b6f, 0xc07fd059, 0xff2379c8, 0x775f50e2, 0x43c340d3, 0xdf2f8656, 0x887ca41a, 0xa2d2bd2d, 0xa1c9e0d6, 0x346c4819, 0x61b76d87, 0x22540f2f, 0x2abe32e1, 0xaa54166b, 0x22568e3a, 0xa2d341d0, 0x66db40c8, 0xa784392f, 0x004dff2f, 0x2db9d2de, 0x97943fac, 0x4a97c1d8, 0x527644b7, 0xb5f437a7, 0xb82cbaef, 0xd751d159, 0x6ff7f0ed, 0x5a097a1f, 0x827b68d0, 0x90ecf52e, 0x22b0c054, 0xbc8e5935, 0x4b6d2f7f, 0x50bb64a2, 0xd2664910, 0xbee5812d, 0xb7332290, 0xe93b159f, 0xb48ee411, 0x4bff345d, 0xfd45c240, 0xad31973f, 0xc4f6d02e, 0x55fc8165, 0xd5b1caad, 0xa1ac2dae, 0xa2d4b76d, 0xc19b0c50, 0x882240f2, 0x0c6e4f38, 0xa4e4bfd7, 0x4f5ba272, 0x564c1d2f, 0xc59c5319, 0xb949e354, 0xb04669fe, 0xb1b6ab8a, 0xc71358dd, 0x6385c545, 0x110f935d, 0x57538ad5, 0x6a390493, 0xe63d37e0, 0x2a54f6b3, 0x3a787d5f, 0x6276a0b5, 0x19a6fcdf, 0x7a42206a, 0x29f9d4d5, 0xf61b1891, 0xbb72275e, 0xaa508167, 0x38901091, 0xc6b505eb, 0x84c7cb8c, 0x2ad75a0f, 0x874a1427, 0xa2d1936b, 0x2ad286af, 0xaa56d291, 0xd7894360, 0x425c750d, 0x93b39e26, 0x187184c9, 0x6c00b32d, 0x73e2bb14, 0xa0bebc3c, 0x54623779, 0x64459eab, 0x3f328b82, 0x7718cf82, 0x59a2cea6, 0x04ee002e, 0x89fe78e6, 0x3fab0950, 0x325ff6c2, 0x81383f05, 0x6963c5c8, 0x76cb5ad6, 0xd49974c9, 0xca180dcf, 0x380782d5, 0xc7fa5cf6, 0x8ac31511, 0x35e79e13, 0x47da91d0, 0xf40f9086, 0xa7e2419e, 0x31366241, 0x051ef495, 0xaa573b04, 0x4a805d8d, 0x548300d0, 0x00322a3c, 0xbf64cddf, 0xba57a68e, 0x75c6372b, 0x50afd341, 0xa7c13275, 0x915a0bf5, 0x6b54bfab, 0x2b0b1426, 0xab4cc9d7, 0x449ccd82, 0xf7fbf265, 0xab85c5f3, 0x1b55db94, 0xaad4e324, 0xcfa4bd3f, 0x2deaa3e2, 0x9e204d02, 0xc8bd25ac, 0xeadf55b3, 0xd5bd9e98, 0xe31231b2, 0x2ad5ad6c, 0x954329de, 0xadbe4528, 0xd8710f69, 0xaa51c90f, 0xaa786bf6, 0x22513f1e, 0xaa51a79b, 0x2ad344cc, 0x7b5a41f0, 0xd37cfbad, 0x1b069505, 0x41ece491, 0xb4c332e6, 0x032268d4, 0xc9600acc, 0xce387e6d, 0xbf6bb16c, 0x6a70fb78, 0x0d03d9c9, 0xd4df39de, 0xe01063da, 0x4736f464, 0x5ad328d8, 0xb347cc96, 0x75bb0fc3, 0x98511bfb, 0x4ffbcc35, 0xb58bcf6a, 0xe11f0abc, 0xbfc5fe4a, 0xa70aec10, 0xac39570a, 0x3f04442f, 0x6188b153, 0xe0397a2e, 0x5727cb79, 0x9ceb418f, 0x1cacd68d, 0x2ad37c96, 0x0175cb9d, 0xc69dff09, 0xc75b65f0, 0xd9db40d8, 0xec0e7779, 0x4744ead4, 0xb11c3274, 0xdd24cb9e, 0x7e1c54bd, 0xf01144f9, 0xd2240eb1, 0x9675b3fd, 0xa3ac3755, 0xd47c27af, 0x51c85f4d, 0x56907596, 0xa5bb15e6, 0x580304f0, 0xca042cf1, 0x011a37ea, 0x8dbfaadb, 0x35ba3e4a, 0x3526ffa0, 0xc37b4d09, 0xbc306ed9, 0x98a52666, 0x5648f725, 0xff5e569d, 0x0ced63d0, 0x7c63b2cf, 0x700b45e1, 0xd5ea50f1, 0x85a92872, 0xaf1fbda7, 0xd4234870, 0xa7870bf3, 0x2d3b4d79, 0x42e04198, 0x0cd0ede7, 0x26470db8, 0xf881814c, 0x474d6ad7, 0x7c0c5e5c, 0xd1231959, 0x381b7298, 0xf5d2f4db, 0xab838653, 0x6e2f1e23, 0x83719c9e, 0xbd91e046, 0x9a56456e, 0xdc39200c, 0x20c8c571, 0x962bda1c, 0xe1e696ff, 0xb141ab08, 0x7cca89b9, 0x1a69e783, 0x02cc4843, 0xa2f7c579, 0x429ef47d, 0x427b169c, 0x5ac9f049, 0xdd8f0f00, 0x5c8165bf }, { 0x1f201094, 0xef0ba75b, 0x69e3cf7e, 0x393f4380, 0xfe61cf7a, 0xeec5207a, 0x55889c94, 0x72fc0651, 0xada7ef79, 0x4e1d7235, 0xd55a63ce, 0xde0436ba, 0x99c430ef, 0x5f0c0794, 0x18dcdb7d, 0xa1d6eff3, 0xa0b52f7b, 0x59e83605, 0xee15b094, 0xe9ffd909, 0xdc440086, 0xef944459, 0xba83ccb3, 0xe0c3cdfb, 0xd1da4181, 0x3b092ab1, 0xf997f1c1, 0xa5e6cf7b, 0x01420ddb, 0xe4e7ef5b, 0x25a1ff41, 0xe180f806, 0x1fc41080, 0x179bee7a, 0xd37ac6a9, 0xfe5830a4, 0x98de8b7f, 0x77e83f4e, 0x79929269, 0x24fa9f7b, 0xe113c85b, 0xacc40083, 0xd7503525, 0xf7ea615f, 0x62143154, 0x0d554b63, 0x5d681121, 0xc866c359, 0x3d63cf73, 0xcee234c0, 0xd4d87e87, 0x5c672b21, 0x071f6181, 0x39f7627f, 0x361e3084, 0xe4eb573b, 0x602f64a4, 0xd63acd9c, 0x1bbc4635, 0x9e81032d, 0x2701f50c, 0x99847ab4, 0xa0e3df79, 0xba6cf38c, 0x10843094, 0x2537a95e, 0xf46f6ffe, 0xa1ff3b1f, 0x208cfb6a, 0x8f458c74, 0xd9e0a227, 0x4ec73a34, 0xfc884f69, 0x3e4de8df, 0xef0e0088, 0x3559648d, 0x8a45388c, 0x1d804366, 0x721d9bfd, 0xa58684bb, 0xe8256333, 0x844e8212, 0x128d8098, 0xfed33fb4, 0xce280ae1, 0x27e19ba5, 0xd5a6c252, 0xe49754bd, 0xc5d655dd, 0xeb667064, 0x77840b4d, 0xa1b6a801, 0x84db26a9, 0xe0b56714, 0x21f043b7, 0xe5d05860, 0x54f03084, 0x066ff472, 0xa31aa153, 0xdadc4755, 0xb5625dbf, 0x68561be6, 0x83ca6b94, 0x2d6ed23b, 0xeccf01db, 0xa6d3d0ba, 0xb6803d5c, 0xaf77a709, 0x33b4a34c, 0x397bc8d6, 0x5ee22b95, 0x5f0e5304, 0x81ed6f61, 0x20e74364, 0xb45e1378, 0xde18639b, 0x881ca122, 0xb96726d1, 0x8049a7e8, 0x22b7da7b, 0x5e552d25, 0x5272d237, 0x79d2951c, 0xc60d894c, 0x488cb402, 0x1ba4fe5b, 0xa4b09f6b, 0x1ca815cf, 0xa20c3005, 0x8871df63, 0xb9de2fcb, 0x0cc6c9e9, 0x0beeff53, 0xe3214517, 0xb4542835, 0x9f63293c, 0xee41e729, 0x6e1d2d7c, 0x50045286, 0x1e6685f3, 0xf33401c6, 0x30a22c95, 0x31a70850, 0x60930f13, 0x73f98417, 0xa1269859, 0xec645c44, 0x52c877a9, 0xcdff33a6, 0xa02b1741, 0x7cbad9a2, 0x2180036f, 0x50d99c08, 0xcb3f4861, 0xc26bd765, 0x64a3f6ab, 0x80342676, 0x25a75e7b, 0xe4e6d1fc, 0x20c710e6, 0xcdf0b680, 0x17844d3b, 0x31eef84d, 0x7e0824e4, 0x2ccb49eb, 0x846a3bae, 0x8ff77888, 0xee5d60f6, 0x7af75673, 0x2fdd5cdb, 0xa11631c1, 0x30f66f43, 0xb3faec54, 0x157fd7fa, 0xef8579cc, 0xd152de58, 0xdb2ffd5e, 0x8f32ce19, 0x306af97a, 0x02f03ef8, 0x99319ad5, 0xc242fa0f, 0xa7e3ebb0, 0xc68e4906, 0xb8da230c, 0x80823028, 0xdcdef3c8, 0xd35fb171, 0x088a1bc8, 0xbec0c560, 0x61a3c9e8, 0xbca8f54d, 0xc72feffa, 0x22822e99, 0x82c570b4, 0xd8d94e89, 0x8b1c34bc, 0x301e16e6, 0x273be979, 0xb0ffeaa6, 0x61d9b8c6, 0x00b24869, 0xb7ffce3f, 0x08dc283b, 0x43daf65a, 0xf7e19798, 0x7619b72f, 0x8f1c9ba4, 0xdc8637a0, 0x16a7d3b1, 0x9fc393b7, 0xa7136eeb, 0xc6bcc63e, 0x1a513742, 0xef6828bc, 0x520365d6, 0x2d6a77ab, 0x3527ed4b, 0x821fd216, 0x095c6e2e, 0xdb92f2fb, 0x5eea29cb, 0x145892f5, 0x91584f7f, 0x5483697b, 0x2667a8cc, 0x85196048, 0x8c4bacea, 0x833860d4, 0x0d23e0f9, 0x6c387e8a, 0x0ae6d249, 0xb284600c, 0xd835731d, 0xdcb1c647, 0xac4c56ea, 0x3ebd81b3, 0x230eabb0, 0x6438bc87, 0xf0b5b1fa, 0x8f5ea2b3, 0xfc184642, 0x0a036b7a, 0x4fb089bd, 0x649da589, 0xa345415e, 0x5c038323, 0x3e5d3bb9, 0x43d79572, 0x7e6dd07c, 0x06dfdf1e, 0x6c6cc4ef, 0x7160a539, 0x73bfbe70, 0x83877605, 0x4523ecf1 }, { 0x8defc240, 0x25fa5d9f, 0xeb903dbf, 0xe810c907, 0x47607fff, 0x369fe44b, 0x8c1fc644, 0xaececa90, 0xbeb1f9bf, 0xeefbcaea, 0xe8cf1950, 0x51df07ae, 0x920e8806, 0xf0ad0548, 0xe13c8d83, 0x927010d5, 0x11107d9f, 0x07647db9, 0xb2e3e4d4, 0x3d4f285e, 0xb9afa820, 0xfade82e0, 0xa067268b, 0x8272792e, 0x553fb2c0, 0x489ae22b, 0xd4ef9794, 0x125e3fbc, 0x21fffcee, 0x825b1bfd, 0x9255c5ed, 0x1257a240, 0x4e1a8302, 0xbae07fff, 0x528246e7, 0x8e57140e, 0x3373f7bf, 0x8c9f8188, 0xa6fc4ee8, 0xc982b5a5, 0xa8c01db7, 0x579fc264, 0x67094f31, 0xf2bd3f5f, 0x40fff7c1, 0x1fb78dfc, 0x8e6bd2c1, 0x437be59b, 0x99b03dbf, 0xb5dbc64b, 0x638dc0e6, 0x55819d99, 0xa197c81c, 0x4a012d6e, 0xc5884a28, 0xccc36f71, 0xb843c213, 0x6c0743f1, 0x8309893c, 0x0feddd5f, 0x2f7fe850, 0xd7c07f7e, 0x02507fbf, 0x5afb9a04, 0xa747d2d0, 0x1651192e, 0xaf70bf3e, 0x58c31380, 0x5f98302e, 0x727cc3c4, 0x0a0fb402, 0x0f7fef82, 0x8c96fdad, 0x5d2c2aae, 0x8ee99a49, 0x50da88b8, 0x8427f4a0, 0x1eac5790, 0x796fb449, 0x8252dc15, 0xefbd7d9b, 0xa672597d, 0xada840d8, 0x45f54504, 0xfa5d7403, 0xe83ec305, 0x4f91751a, 0x925669c2, 0x23efe941, 0xa903f12e, 0x60270df2, 0x0276e4b6, 0x94fd6574, 0x927985b2, 0x8276dbcb, 0x02778176, 0xf8af918d, 0x4e48f79e, 0x8f616ddf, 0xe29d840e, 0x842f7d83, 0x340ce5c8, 0x96bbb682, 0x93b4b148, 0xef303cab, 0x984faf28, 0x779faf9b, 0x92dc560d, 0x224d1e20, 0x8437aa88, 0x7d29dc96, 0x2756d3dc, 0x8b907cee, 0xb51fd240, 0xe7c07ce3, 0xe566b4a1, 0xc3e9615e, 0x3cf8209d, 0x6094d1e3, 0xcd9ca341, 0x5c76460e, 0x00ea983b, 0xd4d67881, 0xfd47572c, 0xf76cedd9, 0xbda8229c, 0x127dadaa, 0x438a074e, 0x1f97c090, 0x081bdb8a, 0x93a07ebe, 0xb938ca15, 0x97b03cff, 0x3dc2c0f8, 0x8d1ab2ec, 0x64380e51, 0x68cc7bfb, 0xd90f2788, 0x12490181, 0x5de5ffd4, 0xdd7ef86a, 0x76a2e214, 0xb9a40368, 0x925d958f, 0x4b39fffa, 0xba39aee9, 0xa4ffd30b, 0xfaf7933b, 0x6d498623, 0x193cbcfa, 0x27627545, 0x825cf47a, 0x61bd8ba0, 0xd11e42d1, 0xcead04f4, 0x127ea392, 0x10428db7, 0x8272a972, 0x9270c4a8, 0x127de50b, 0x285ba1c8, 0x3c62f44f, 0x35c0eaa5, 0xe805d231, 0x428929fb, 0xb4fcdf82, 0x4fb66a53, 0x0e7dc15b, 0x1f081fab, 0x108618ae, 0xfcfd086d, 0xf9ff2889, 0x694bcc11, 0x236a5cae, 0x12deca4d, 0x2c3f8cc5, 0xd2d02dfe, 0xf8ef5896, 0xe4cf52da, 0x95155b67, 0x494a488c, 0xb9b6a80c, 0x5c8f82bc, 0x89d36b45, 0x3a609437, 0xec00c9a9, 0x44715253, 0x0a874b49, 0xd773bc40, 0x7c34671c, 0x02717ef6, 0x4feb5536, 0xa2d02fff, 0xd2bf60c4, 0xd43f03c0, 0x50b4ef6d, 0x07478cd1, 0x006e1888, 0xa2e53f55, 0xb9e6d4bc, 0xa2048016, 0x97573833, 0xd7207d67, 0xde0f8f3d, 0x72f87b33, 0xabcc4f33, 0x7688c55d, 0x7b00a6b0, 0x947b0001, 0x570075d2, 0xf9bb88f8, 0x8942019e, 0x4264a5ff, 0x856302e0, 0x72dbd92b, 0xee971b69, 0x6ea22fde, 0x5f08ae2b, 0xaf7a616d, 0xe5c98767, 0xcf1febd2, 0x61efc8c2, 0xf1ac2571, 0xcc8239c2, 0x67214cb8, 0xb1e583d1, 0xb7dc3e62, 0x7f10bdce, 0xf90a5c38, 0x0ff0443d, 0x606e6dc6, 0x60543a49, 0x5727c148, 0x2be98a1d, 0x8ab41738, 0x20e1be24, 0xaf96da0f, 0x68458425, 0x99833be5, 0x600d457d, 0x282f9350, 0x8334b362, 0xd91d1120, 0x2b6d8da0, 0x642b1e31, 0x9c305a00, 0x52bce688, 0x1b03588a, 0xf7baefd5, 0x4142ed9c, 0xa4315c11, 0x83323ec5, 0xdfef4636, 0xa133c501, 0xe9d3531c, 0xee353783 }, { 0x9db30420, 0x1fb6e9de, 0xa7be7bef, 0xd273a298, 0x4a4f7bdb, 0x64ad8c57, 0x85510443, 0xfa020ed1, 0x7e287aff, 0xe60fb663, 0x095f35a1, 0x79ebf120, 0xfd059d43, 0x6497b7b1, 0xf3641f63, 0x241e4adf, 0x28147f5f, 0x4fa2b8cd, 0xc9430040, 0x0cc32220, 0xfdd30b30, 0xc0a5374f, 0x1d2d00d9, 0x24147b15, 0xee4d111a, 0x0fca5167, 0x71ff904c, 0x2d195ffe, 0x1a05645f, 0x0c13fefe, 0x081b08ca, 0x05170121, 0x80530100, 0xe83e5efe, 0xac9af4f8, 0x7fe72701, 0xd2b8ee5f, 0x06df4261, 0xbb9e9b8a, 0x7293ea25, 0xce84ffdf, 0xf5718801, 0x3dd64b04, 0xa26f263b, 0x7ed48400, 0x547eebe6, 0x446d4ca0, 0x6cf3d6f5, 0x2649abdf, 0xaea0c7f5, 0x36338cc1, 0x503f7e93, 0xd3772061, 0x11b638e1, 0x72500e03, 0xf80eb2bb, 0xabe0502e, 0xec8d77de, 0x57971e81, 0xe14f6746, 0xc9335400, 0x6920318f, 0x081dbb99, 0xffc304a5, 0x4d351805, 0x7f3d5ce3, 0xa6c866c6, 0x5d5bcca9, 0xdaec6fea, 0x9f926f91, 0x9f46222f, 0x3991467d, 0xa5bf6d8e, 0x1143c44f, 0x43958302, 0xd0214eeb, 0x022083b8, 0x3fb6180c, 0x18f8931e, 0x281658e6, 0x26486e3e, 0x8bd78a70, 0x7477e4c1, 0xb506e07c, 0xf32d0a25, 0x79098b02, 0xe4eabb81, 0x28123b23, 0x69dead38, 0x1574ca16, 0xdf871b62, 0x211c40b7, 0xa51a9ef9, 0x0014377b, 0x041e8ac8, 0x09114003, 0xbd59e4d2, 0xe3d156d5, 0x4fe876d5, 0x2f91a340, 0x557be8de, 0x00eae4a7, 0x0ce5c2ec, 0x4db4bba6, 0xe756bdff, 0xdd3369ac, 0xec17b035, 0x06572327, 0x99afc8b0, 0x56c8c391, 0x6b65811c, 0x5e146119, 0x6e85cb75, 0xbe07c002, 0xc2325577, 0x893ff4ec, 0x5bbfc92d, 0xd0ec3b25, 0xb7801ab7, 0x8d6d3b24, 0x20c763ef, 0xc366a5fc, 0x9c382880, 0x0ace3205, 0xaac9548a, 0xeca1d7c7, 0x041afa32, 0x1d16625a, 0x6701902c, 0x9b757a54, 0x31d477f7, 0x9126b031, 0x36cc6fdb, 0xc70b8b46, 0xd9e66a48, 0x56e55a79, 0x026a4ceb, 0x52437eff, 0x2f8f76b4, 0x0df980a5, 0x8674cde3, 0xedda04eb, 0x17a9be04, 0x2c18f4df, 0xb7747f9d, 0xab2af7b4, 0xefc34d20, 0x2e096b7c, 0x1741a254, 0xe5b6a035, 0x213d42f6, 0x2c1c7c26, 0x61c2f50f, 0x6552daf9, 0xd2c231f8, 0x25130f69, 0xd8167fa2, 0x0418f2c8, 0x001a96a6, 0x0d1526ab, 0x63315c21, 0x5e0a72ec, 0x49bafefd, 0x187908d9, 0x8d0dbd86, 0x311170a7, 0x3e9b640c, 0xcc3e10d7, 0xd5cad3b6, 0x0caec388, 0xf73001e1, 0x6c728aff, 0x71eae2a1, 0x1f9af36e, 0xcfcbd12f, 0xc1de8417, 0xac07be6b, 0xcb44a1d8, 0x8b9b0f56, 0x013988c3, 0xb1c52fca, 0xb4be31cd, 0xd8782806, 0x12a3a4e2, 0x6f7de532, 0x58fd7eb6, 0xd01ee900, 0x24adffc2, 0xf4990fc5, 0x9711aac5, 0x001d7b95, 0x82e5e7d2, 0x109873f6, 0x00613096, 0xc32d9521, 0xada121ff, 0x29908415, 0x7fbb977f, 0xaf9eb3db, 0x29c9ed2a, 0x5ce2a465, 0xa730f32c, 0xd0aa3fe8, 0x8a5cc091, 0xd49e2ce7, 0x0ce454a9, 0xd60acd86, 0x015f1919, 0x77079103, 0xdea03af6, 0x78a8565e, 0xdee356df, 0x21f05cbe, 0x8b75e387, 0xb3c50651, 0xb8a5c3ef, 0xd8eeb6d2, 0xe523be77, 0xc2154529, 0x2f69efdf, 0xafe67afb, 0xf470c4b2, 0xf3e0eb5b, 0xd6cc9876, 0x39e4460c, 0x1fda8538, 0x1987832f, 0xca007367, 0xa99144f8, 0x296b299e, 0x492fc295, 0x9266beab, 0xb5676e69, 0x9bd3ddda, 0xdf7e052f, 0xdb25701c, 0x1b5e51ee, 0xf65324e6, 0x6afce36c, 0x0316cc04, 0x8644213e, 0xb7dc59d0, 0x7965291f, 0xccd6fd43, 0x41823979, 0x932bcdf6, 0xb657c34d, 0x4edfd282, 0x7ae5290c, 0x3cb9536b, 0x851e20fe, 0x9833557e, 0x13ecf0b0, 0xd3ffb372, 0x3f85c5c1, 0x0aef7ed2 } }; static const u32 s5[256] = { 0x7ec90c04, 0x2c6e74b9, 0x9b0e66df, 0xa6337911, 0xb86a7fff, 0x1dd358f5, 0x44dd9d44, 0x1731167f, 0x08fbf1fa, 0xe7f511cc, 0xd2051b00, 0x735aba00, 0x2ab722d8, 0x386381cb, 0xacf6243a, 0x69befd7a, 0xe6a2e77f, 0xf0c720cd, 0xc4494816, 0xccf5c180, 0x38851640, 0x15b0a848, 0xe68b18cb, 0x4caadeff, 0x5f480a01, 0x0412b2aa, 0x259814fc, 0x41d0efe2, 0x4e40b48d, 0x248eb6fb, 0x8dba1cfe, 0x41a99b02, 0x1a550a04, 0xba8f65cb, 0x7251f4e7, 0x95a51725, 0xc106ecd7, 0x97a5980a, 0xc539b9aa, 0x4d79fe6a, 0xf2f3f763, 0x68af8040, 0xed0c9e56, 0x11b4958b, 0xe1eb5a88, 0x8709e6b0, 0xd7e07156, 0x4e29fea7, 0x6366e52d, 0x02d1c000, 0xc4ac8e05, 0x9377f571, 0x0c05372a, 0x578535f2, 0x2261be02, 0xd642a0c9, 0xdf13a280, 0x74b55bd2, 0x682199c0, 0xd421e5ec, 0x53fb3ce8, 0xc8adedb3, 0x28a87fc9, 0x3d959981, 0x5c1ff900, 0xfe38d399, 0x0c4eff0b, 0x062407ea, 0xaa2f4fb1, 0x4fb96976, 0x90c79505, 0xb0a8a774, 0xef55a1ff, 0xe59ca2c2, 0xa6b62d27, 0xe66a4263, 0xdf65001f, 0x0ec50966, 0xdfdd55bc, 0x29de0655, 0x911e739a, 0x17af8975, 0x32c7911c, 0x89f89468, 0x0d01e980, 0x524755f4, 0x03b63cc9, 0x0cc844b2, 0xbcf3f0aa, 0x87ac36e9, 0xe53a7426, 0x01b3d82b, 0x1a9e7449, 0x64ee2d7e, 0xcddbb1da, 0x01c94910, 0xb868bf80, 0x0d26f3fd, 0x9342ede7, 0x04a5c284, 0x636737b6, 0x50f5b616, 0xf24766e3, 0x8eca36c1, 0x136e05db, 0xfef18391, 0xfb887a37, 0xd6e7f7d4, 0xc7fb7dc9, 0x3063fcdf, 0xb6f589de, 0xec2941da, 0x26e46695, 0xb7566419, 0xf654efc5, 0xd08d58b7, 0x48925401, 0xc1bacb7f, 0xe5ff550f, 0xb6083049, 0x5bb5d0e8, 0x87d72e5a, 0xab6a6ee1, 0x223a66ce, 0xc62bf3cd, 0x9e0885f9, 0x68cb3e47, 0x086c010f, 0xa21de820, 0xd18b69de, 0xf3f65777, 0xfa02c3f6, 0x407edac3, 0xcbb3d550, 0x1793084d, 0xb0d70eba, 0x0ab378d5, 0xd951fb0c, 0xded7da56, 0x4124bbe4, 0x94ca0b56, 0x0f5755d1, 0xe0e1e56e, 0x6184b5be, 0x580a249f, 0x94f74bc0, 0xe327888e, 0x9f7b5561, 0xc3dc0280, 0x05687715, 0x646c6bd7, 0x44904db3, 0x66b4f0a3, 0xc0f1648a, 0x697ed5af, 0x49e92ff6, 0x309e374f, 0x2cb6356a, 0x85808573, 0x4991f840, 0x76f0ae02, 0x083be84d, 0x28421c9a, 0x44489406, 0x736e4cb8, 0xc1092910, 0x8bc95fc6, 0x7d869cf4, 0x134f616f, 0x2e77118d, 0xb31b2be1, 0xaa90b472, 0x3ca5d717, 0x7d161bba, 0x9cad9010, 0xaf462ba2, 0x9fe459d2, 0x45d34559, 0xd9f2da13, 0xdbc65487, 0xf3e4f94e, 0x176d486f, 0x097c13ea, 0x631da5c7, 0x445f7382, 0x175683f4, 0xcdc66a97, 0x70be0288, 0xb3cdcf72, 0x6e5dd2f3, 0x20936079, 0x459b80a5, 0xbe60e2db, 0xa9c23101, 0xeba5315c, 0x224e42f2, 0x1c5c1572, 0xf6721b2c, 0x1ad2fff3, 0x8c25404e, 0x324ed72f, 0x4067b7fd, 0x0523138e, 0x5ca3bc78, 0xdc0fd66e, 0x75922283, 0x784d6b17, 0x58ebb16e, 0x44094f85, 0x3f481d87, 0xfcfeae7b, 0x77b5ff76, 0x8c2302bf, 0xaaf47556, 0x5f46b02a, 0x2b092801, 0x3d38f5f7, 0x0ca81f36, 0x52af4a8a, 0x66d5e7c0, 0xdf3b0874, 0x95055110, 0x1b5ad7a8, 0xf61ed5ad, 0x6cf6e479, 0x20758184, 0xd0cefa65, 0x88f7be58, 0x4a046826, 0x0ff6f8f3, 0xa09c7f70, 0x5346aba0, 0x5ce96c28, 0xe176eda3, 0x6bac307f, 0x376829d2, 0x85360fa9, 0x17e3fe2a, 0x24b79767, 0xf5a96b20, 0xd6cd2595, 0x68ff1ebf, 0x7555442c, 0xf19f06be, 0xf9e0659a, 0xeeb9491d, 0x34010718, 0xbb30cab8, 0xe822fe15, 0x88570983, 0x750e6249, 0xda627e55, 0x5e76ffa8, 0xb1534546, 0x6d47de08, 0xefe9e7d4 }; static const u32 s6[256] = { 0xf6fa8f9d, 0x2cac6ce1, 0x4ca34867, 0xe2337f7c, 0x95db08e7, 0x016843b4, 0xeced5cbc, 0x325553ac, 0xbf9f0960, 0xdfa1e2ed, 0x83f0579d, 0x63ed86b9, 0x1ab6a6b8, 0xde5ebe39, 0xf38ff732, 0x8989b138, 0x33f14961, 0xc01937bd, 0xf506c6da, 0xe4625e7e, 0xa308ea99, 0x4e23e33c, 0x79cbd7cc, 0x48a14367, 0xa3149619, 0xfec94bd5, 0xa114174a, 0xeaa01866, 0xa084db2d, 0x09a8486f, 0xa888614a, 0x2900af98, 0x01665991, 0xe1992863, 0xc8f30c60, 0x2e78ef3c, 0xd0d51932, 0xcf0fec14, 0xf7ca07d2, 0xd0a82072, 0xfd41197e, 0x9305a6b0, 0xe86be3da, 0x74bed3cd, 0x372da53c, 0x4c7f4448, 0xdab5d440, 0x6dba0ec3, 0x083919a7, 0x9fbaeed9, 0x49dbcfb0, 0x4e670c53, 0x5c3d9c01, 0x64bdb941, 0x2c0e636a, 0xba7dd9cd, 0xea6f7388, 0xe70bc762, 0x35f29adb, 0x5c4cdd8d, 0xf0d48d8c, 0xb88153e2, 0x08a19866, 0x1ae2eac8, 0x284caf89, 0xaa928223, 0x9334be53, 0x3b3a21bf, 0x16434be3, 0x9aea3906, 0xefe8c36e, 0xf890cdd9, 0x80226dae, 0xc340a4a3, 0xdf7e9c09, 0xa694a807, 0x5b7c5ecc, 0x221db3a6, 0x9a69a02f, 0x68818a54, 0xceb2296f, 0x53c0843a, 0xfe893655, 0x25bfe68a, 0xb4628abc, 0xcf222ebf, 0x25ac6f48, 0xa9a99387, 0x53bddb65, 0xe76ffbe7, 0xe967fd78, 0x0ba93563, 0x8e342bc1, 0xe8a11be9, 0x4980740d, 0xc8087dfc, 0x8de4bf99, 0xa11101a0, 0x7fd37975, 0xda5a26c0, 0xe81f994f, 0x9528cd89, 0xfd339fed, 0xb87834bf, 0x5f04456d, 0x22258698, 0xc9c4c83b, 0x2dc156be, 0x4f628daa, 0x57f55ec5, 0xe2220abe, 0xd2916ebf, 0x4ec75b95, 0x24f2c3c0, 0x42d15d99, 0xcd0d7fa0, 0x7b6e27ff, 0xa8dc8af0, 0x7345c106, 0xf41e232f, 0x35162386, 0xe6ea8926, 0x3333b094, 0x157ec6f2, 0x372b74af, 0x692573e4, 0xe9a9d848, 0xf3160289, 0x3a62ef1d, 0xa787e238, 0xf3a5f676, 0x74364853, 0x20951063, 0x4576698d, 0xb6fad407, 0x592af950, 0x36f73523, 0x4cfb6e87, 0x7da4cec0, 0x6c152daa, 0xcb0396a8, 0xc50dfe5d, 0xfcd707ab, 0x0921c42f, 0x89dff0bb, 0x5fe2be78, 0x448f4f33, 0x754613c9, 0x2b05d08d, 0x48b9d585, 0xdc049441, 0xc8098f9b, 0x7dede786, 0xc39a3373, 0x42410005, 0x6a091751, 0x0ef3c8a6, 0x890072d6, 0x28207682, 0xa9a9f7be, 0xbf32679d, 0xd45b5b75, 0xb353fd00, 0xcbb0e358, 0x830f220a, 0x1f8fb214, 0xd372cf08, 0xcc3c4a13, 0x8cf63166, 0x061c87be, 0x88c98f88, 0x6062e397, 0x47cf8e7a, 0xb6c85283, 0x3cc2acfb, 0x3fc06976, 0x4e8f0252, 0x64d8314d, 0xda3870e3, 0x1e665459, 0xc10908f0, 0x513021a5, 0x6c5b68b7, 0x822f8aa0, 0x3007cd3e, 0x74719eef, 0xdc872681, 0x073340d4, 0x7e432fd9, 0x0c5ec241, 0x8809286c, 0xf592d891, 0x08a930f6, 0x957ef305, 0xb7fbffbd, 0xc266e96f, 0x6fe4ac98, 0xb173ecc0, 0xbc60b42a, 0x953498da, 0xfba1ae12, 0x2d4bd736, 0x0f25faab, 0xa4f3fceb, 0xe2969123, 0x257f0c3d, 0x9348af49, 0x361400bc, 0xe8816f4a, 0x3814f200, 0xa3f94043, 0x9c7a54c2, 0xbc704f57, 0xda41e7f9, 0xc25ad33a, 0x54f4a084, 0xb17f5505, 0x59357cbe, 0xedbd15c8, 0x7f97c5ab, 0xba5ac7b5, 0xb6f6deaf, 0x3a479c3a, 0x5302da25, 0x653d7e6a, 0x54268d49, 0x51a477ea, 0x5017d55b, 0xd7d25d88, 0x44136c76, 0x0404a8c8, 0xb8e5a121, 0xb81a928a, 0x60ed5869, 0x97c55b96, 0xeaec991b, 0x29935913, 0x01fdb7f1, 0x088e8dfa, 0x9ab6f6f5, 0x3b4cbf9f, 0x4a5de3ab, 0xe6051d35, 0xa0e1d855, 0xd36b4cf1, 0xf544edeb, 0xb0e93524, 0xbebb8fbd, 0xa2d762cf, 0x49c92f54, 0x38b5f331, 0x7128a454, 0x48392905, 0xa65b1db8, 0x851c97bd, 0xd675cf2f }; static const u32 s7[256] = { 0x85e04019, 0x332bf567, 0x662dbfff, 0xcfc65693, 0x2a8d7f6f, 0xab9bc912, 0xde6008a1, 0x2028da1f, 0x0227bce7, 0x4d642916, 0x18fac300, 0x50f18b82, 0x2cb2cb11, 0xb232e75c, 0x4b3695f2, 0xb28707de, 0xa05fbcf6, 0xcd4181e9, 0xe150210c, 0xe24ef1bd, 0xb168c381, 0xfde4e789, 0x5c79b0d8, 0x1e8bfd43, 0x4d495001, 0x38be4341, 0x913cee1d, 0x92a79c3f, 0x089766be, 0xbaeeadf4, 0x1286becf, 0xb6eacb19, 0x2660c200, 0x7565bde4, 0x64241f7a, 0x8248dca9, 0xc3b3ad66, 0x28136086, 0x0bd8dfa8, 0x356d1cf2, 0x107789be, 0xb3b2e9ce, 0x0502aa8f, 0x0bc0351e, 0x166bf52a, 0xeb12ff82, 0xe3486911, 0xd34d7516, 0x4e7b3aff, 0x5f43671b, 0x9cf6e037, 0x4981ac83, 0x334266ce, 0x8c9341b7, 0xd0d854c0, 0xcb3a6c88, 0x47bc2829, 0x4725ba37, 0xa66ad22b, 0x7ad61f1e, 0x0c5cbafa, 0x4437f107, 0xb6e79962, 0x42d2d816, 0x0a961288, 0xe1a5c06e, 0x13749e67, 0x72fc081a, 0xb1d139f7, 0xf9583745, 0xcf19df58, 0xbec3f756, 0xc06eba30, 0x07211b24, 0x45c28829, 0xc95e317f, 0xbc8ec511, 0x38bc46e9, 0xc6e6fa14, 0xbae8584a, 0xad4ebc46, 0x468f508b, 0x7829435f, 0xf124183b, 0x821dba9f, 0xaff60ff4, 0xea2c4e6d, 0x16e39264, 0x92544a8b, 0x009b4fc3, 0xaba68ced, 0x9ac96f78, 0x06a5b79a, 0xb2856e6e, 0x1aec3ca9, 0xbe838688, 0x0e0804e9, 0x55f1be56, 0xe7e5363b, 0xb3a1f25d, 0xf7debb85, 0x61fe033c, 0x16746233, 0x3c034c28, 0xda6d0c74, 0x79aac56c, 0x3ce4e1ad, 0x51f0c802, 0x98f8f35a, 0x1626a49f, 0xeed82b29, 0x1d382fe3, 0x0c4fb99a, 0xbb325778, 0x3ec6d97b, 0x6e77a6a9, 0xcb658b5c, 0xd45230c7, 0x2bd1408b, 0x60c03eb7, 0xb9068d78, 0xa33754f4, 0xf430c87d, 0xc8a71302, 0xb96d8c32, 0xebd4e7be, 0xbe8b9d2d, 0x7979fb06, 0xe7225308, 0x8b75cf77, 0x11ef8da4, 0xe083c858, 0x8d6b786f, 0x5a6317a6, 0xfa5cf7a0, 0x5dda0033, 0xf28ebfb0, 0xf5b9c310, 0xa0eac280, 0x08b9767a, 0xa3d9d2b0, 0x79d34217, 0x021a718d, 0x9ac6336a, 0x2711fd60, 0x438050e3, 0x069908a8, 0x3d7fedc4, 0x826d2bef, 0x4eeb8476, 0x488dcf25, 0x36c9d566, 0x28e74e41, 0xc2610aca, 0x3d49a9cf, 0xbae3b9df, 0xb65f8de6, 0x92aeaf64, 0x3ac7d5e6, 0x9ea80509, 0xf22b017d, 0xa4173f70, 0xdd1e16c3, 0x15e0d7f9, 0x50b1b887, 0x2b9f4fd5, 0x625aba82, 0x6a017962, 0x2ec01b9c, 0x15488aa9, 0xd716e740, 0x40055a2c, 0x93d29a22, 0xe32dbf9a, 0x058745b9, 0x3453dc1e, 0xd699296e, 0x496cff6f, 0x1c9f4986, 0xdfe2ed07, 0xb87242d1, 0x19de7eae, 0x053e561a, 0x15ad6f8c, 0x66626c1c, 0x7154c24c, 0xea082b2a, 0x93eb2939, 0x17dcb0f0, 0x58d4f2ae, 0x9ea294fb, 0x52cf564c, 0x9883fe66, 0x2ec40581, 0x763953c3, 0x01d6692e, 0xd3a0c108, 0xa1e7160e, 0xe4f2dfa6, 0x693ed285, 0x74904698, 0x4c2b0edd, 0x4f757656, 0x5d393378, 0xa132234f, 0x3d321c5d, 0xc3f5e194, 0x4b269301, 0xc79f022f, 0x3c997e7e, 0x5e4f9504, 0x3ffafbbd, 0x76f7ad0e, 0x296693f4, 0x3d1fce6f, 0xc61e45be, 0xd3b5ab34, 0xf72bf9b7, 0x1b0434c0, 0x4e72b567, 0x5592a33d, 0xb5229301, 0xcfd2a87f, 0x60aeb767, 0x1814386b, 0x30bcc33d, 0x38a0c07d, 0xfd1606f2, 0xc363519b, 0x589dd390, 0x5479f8e6, 0x1cb8d647, 0x97fd61a9, 0xea7759f4, 0x2d57539d, 0x569a58cf, 0xe84e63ad, 0x462e1b78, 0x6580f87e, 0xf3817914, 0x91da55f4, 0x40a230f3, 0xd1988f35, 0xb6e318d2, 0x3ffa50bc, 0x3d40f021, 0xc3c0bdae, 0x4958c24c, 0x518f36b2, 0x84b1d370, 0x0fedce83, 0x878ddada, 0xf2a279c7, 0x94e01be8, 0x90716f4b, 0x954b8aa3 }; static const u32 s8[256] = { 0xe216300d, 0xbbddfffc, 0xa7ebdabd, 0x35648095, 0x7789f8b7, 0xe6c1121b, 0x0e241600, 0x052ce8b5, 0x11a9cfb0, 0xe5952f11, 0xece7990a, 0x9386d174, 0x2a42931c, 0x76e38111, 0xb12def3a, 0x37ddddfc, 0xde9adeb1, 0x0a0cc32c, 0xbe197029, 0x84a00940, 0xbb243a0f, 0xb4d137cf, 0xb44e79f0, 0x049eedfd, 0x0b15a15d, 0x480d3168, 0x8bbbde5a, 0x669ded42, 0xc7ece831, 0x3f8f95e7, 0x72df191b, 0x7580330d, 0x94074251, 0x5c7dcdfa, 0xabbe6d63, 0xaa402164, 0xb301d40a, 0x02e7d1ca, 0x53571dae, 0x7a3182a2, 0x12a8ddec, 0xfdaa335d, 0x176f43e8, 0x71fb46d4, 0x38129022, 0xce949ad4, 0xb84769ad, 0x965bd862, 0x82f3d055, 0x66fb9767, 0x15b80b4e, 0x1d5b47a0, 0x4cfde06f, 0xc28ec4b8, 0x57e8726e, 0x647a78fc, 0x99865d44, 0x608bd593, 0x6c200e03, 0x39dc5ff6, 0x5d0b00a3, 0xae63aff2, 0x7e8bd632, 0x70108c0c, 0xbbd35049, 0x2998df04, 0x980cf42a, 0x9b6df491, 0x9e7edd53, 0x06918548, 0x58cb7e07, 0x3b74ef2e, 0x522fffb1, 0xd24708cc, 0x1c7e27cd, 0xa4eb215b, 0x3cf1d2e2, 0x19b47a38, 0x424f7618, 0x35856039, 0x9d17dee7, 0x27eb35e6, 0xc9aff67b, 0x36baf5b8, 0x09c467cd, 0xc18910b1, 0xe11dbf7b, 0x06cd1af8, 0x7170c608, 0x2d5e3354, 0xd4de495a, 0x64c6d006, 0xbcc0c62c, 0x3dd00db3, 0x708f8f34, 0x77d51b42, 0x264f620f, 0x24b8d2bf, 0x15c1b79e, 0x46a52564, 0xf8d7e54e, 0x3e378160, 0x7895cda5, 0x859c15a5, 0xe6459788, 0xc37bc75f, 0xdb07ba0c, 0x0676a3ab, 0x7f229b1e, 0x31842e7b, 0x24259fd7, 0xf8bef472, 0x835ffcb8, 0x6df4c1f2, 0x96f5b195, 0xfd0af0fc, 0xb0fe134c, 0xe2506d3d, 0x4f9b12ea, 0xf215f225, 0xa223736f, 0x9fb4c428, 0x25d04979, 0x34c713f8, 0xc4618187, 0xea7a6e98, 0x7cd16efc, 0x1436876c, 0xf1544107, 0xbedeee14, 0x56e9af27, 0xa04aa441, 0x3cf7c899, 0x92ecbae6, 0xdd67016d, 0x151682eb, 0xa842eedf, 0xfdba60b4, 0xf1907b75, 0x20e3030f, 0x24d8c29e, 0xe139673b, 0xefa63fb8, 0x71873054, 0xb6f2cf3b, 0x9f326442, 0xcb15a4cc, 0xb01a4504, 0xf1e47d8d, 0x844a1be5, 0xbae7dfdc, 0x42cbda70, 0xcd7dae0a, 0x57e85b7a, 0xd53f5af6, 0x20cf4d8c, 0xcea4d428, 0x79d130a4, 0x3486ebfb, 0x33d3cddc, 0x77853b53, 0x37effcb5, 0xc5068778, 0xe580b3e6, 0x4e68b8f4, 0xc5c8b37e, 0x0d809ea2, 0x398feb7c, 0x132a4f94, 0x43b7950e, 0x2fee7d1c, 0x223613bd, 0xdd06caa2, 0x37df932b, 0xc4248289, 0xacf3ebc3, 0x5715f6b7, 0xef3478dd, 0xf267616f, 0xc148cbe4, 0x9052815e, 0x5e410fab, 0xb48a2465, 0x2eda7fa4, 0xe87b40e4, 0xe98ea084, 0x5889e9e1, 0xefd390fc, 0xdd07d35b, 0xdb485694, 0x38d7e5b2, 0x57720101, 0x730edebc, 0x5b643113, 0x94917e4f, 0x503c2fba, 0x646f1282, 0x7523d24a, 0xe0779695, 0xf9c17a8f, 0x7a5b2121, 0xd187b896, 0x29263a4d, 0xba510cdf, 0x81f47c9f, 0xad1163ed, 0xea7b5965, 0x1a00726e, 0x11403092, 0x00da6d77, 0x4a0cdd61, 0xad1f4603, 0x605bdfb0, 0x9eedc364, 0x22ebe6a8, 0xcee7d28a, 0xa0e736a0, 0x5564a6b9, 0x10853209, 0xc7eb8f37, 0x2de705ca, 0x8951570f, 0xdf09822b, 0xbd691a6c, 0xaa12e4f2, 0x87451c0f, 0xe0f6a27a, 0x3ada4819, 0x4cf1764f, 0x0d771c2b, 0x67cdb156, 0x350d8384, 0x5938fa0f, 0x42399ef3, 0x36997b07, 0x0e84093d, 0x4aa93e61, 0x8360d87b, 0x1fa98b0c, 0x1149382c, 0xe97625a5, 0x0614d1b7, 0x0e25244b, 0x0c768347, 0x589e8d82, 0x0d2059d1, 0xa466bb1e, 0xf8da0a82, 0x04f19130, 0xba6e4ec0, 0x99265164, 0x1ee7230d, 0x50b2ad80, 0xeaee6801, 0x8db2a283, 0xea8bf59e }; #ifdef USE_AMD64_ASM /* Assembly implementations of CAST5. */ extern void _gcry_cast5_amd64_encrypt_block(CAST5_context *c, byte *outbuf, const byte *inbuf); extern void _gcry_cast5_amd64_decrypt_block(CAST5_context *c, byte *outbuf, const byte *inbuf); /* These assembly implementations process four blocks in parallel. */ extern void _gcry_cast5_amd64_ctr_enc(CAST5_context *ctx, byte *out, const byte *in, byte *ctr); extern void _gcry_cast5_amd64_cbc_dec(CAST5_context *ctx, byte *out, const byte *in, byte *iv); extern void _gcry_cast5_amd64_cfb_dec(CAST5_context *ctx, byte *out, const byte *in, byte *iv); static void do_encrypt_block (CAST5_context *context, byte *outbuf, const byte *inbuf) { _gcry_cast5_amd64_encrypt_block (context, outbuf, inbuf); } static void do_decrypt_block (CAST5_context *context, byte *outbuf, const byte *inbuf) { _gcry_cast5_amd64_decrypt_block (context, outbuf, inbuf); } static void cast5_amd64_ctr_enc(CAST5_context *ctx, byte *out, const byte *in, byte *ctr) { _gcry_cast5_amd64_ctr_enc (ctx, out, in, ctr); } static void cast5_amd64_cbc_dec(CAST5_context *ctx, byte *out, const byte *in, byte *iv) { _gcry_cast5_amd64_cbc_dec (ctx, out, in, iv); } static void cast5_amd64_cfb_dec(CAST5_context *ctx, byte *out, const byte *in, byte *iv) { _gcry_cast5_amd64_cfb_dec (ctx, out, in, iv); } static unsigned int encrypt_block (void *context , byte *outbuf, const byte *inbuf) { CAST5_context *c = (CAST5_context *) context; do_encrypt_block (c, outbuf, inbuf); return /*burn_stack*/ (2*8); } static unsigned int decrypt_block (void *context, byte *outbuf, const byte *inbuf) { CAST5_context *c = (CAST5_context *) context; do_decrypt_block (c, outbuf, inbuf); return /*burn_stack*/ (2*8); } #elif defined(USE_ARM_ASM) /* ARM assembly implementations of CAST5. */ extern void _gcry_cast5_arm_encrypt_block(CAST5_context *c, byte *outbuf, const byte *inbuf); extern void _gcry_cast5_arm_decrypt_block(CAST5_context *c, byte *outbuf, const byte *inbuf); /* These assembly implementations process two blocks in parallel. */ extern void _gcry_cast5_arm_ctr_enc(CAST5_context *ctx, byte *out, const byte *in, byte *ctr); extern void _gcry_cast5_arm_cbc_dec(CAST5_context *ctx, byte *out, const byte *in, byte *iv); extern void _gcry_cast5_arm_cfb_dec(CAST5_context *ctx, byte *out, const byte *in, byte *iv); static void do_encrypt_block (CAST5_context *context, byte *outbuf, const byte *inbuf) { _gcry_cast5_arm_encrypt_block (context, outbuf, inbuf); } static void do_decrypt_block (CAST5_context *context, byte *outbuf, const byte *inbuf) { _gcry_cast5_arm_decrypt_block (context, outbuf, inbuf); } static unsigned int encrypt_block (void *context , byte *outbuf, const byte *inbuf) { CAST5_context *c = (CAST5_context *) context; do_encrypt_block (c, outbuf, inbuf); return /*burn_stack*/ (10*4); } static unsigned int decrypt_block (void *context, byte *outbuf, const byte *inbuf) { CAST5_context *c = (CAST5_context *) context; do_decrypt_block (c, outbuf, inbuf); return /*burn_stack*/ (10*4); } #else /*USE_ARM_ASM*/ #define F1(D,m,r) ( (I = ((m) + (D))), (I=rol(I,(r))), \ (((s1[I >> 24] ^ s2[(I>>16)&0xff]) - s3[(I>>8)&0xff]) + s4[I&0xff]) ) #define F2(D,m,r) ( (I = ((m) ^ (D))), (I=rol(I,(r))), \ (((s1[I >> 24] - s2[(I>>16)&0xff]) + s3[(I>>8)&0xff]) ^ s4[I&0xff]) ) #define F3(D,m,r) ( (I = ((m) - (D))), (I=rol(I,(r))), \ (((s1[I >> 24] + s2[(I>>16)&0xff]) ^ s3[(I>>8)&0xff]) - s4[I&0xff]) ) static void do_encrypt_block( CAST5_context *c, byte *outbuf, const byte *inbuf ) { u32 l, r, t; u32 I; /* used by the Fx macros */ u32 *Km; u32 Kr; Km = c->Km; Kr = buf_get_le32(c->Kr + 0); /* (L0,R0) <-- (m1...m64). (Split the plaintext into left and * right 32-bit halves L0 = m1...m32 and R0 = m33...m64.) */ l = buf_get_be32(inbuf + 0); r = buf_get_be32(inbuf + 4); /* (16 rounds) for i from 1 to 16, compute Li and Ri as follows: * Li = Ri-1; * Ri = Li-1 ^ f(Ri-1,Kmi,Kri), where f is defined in Section 2.2 * Rounds 1, 4, 7, 10, 13, and 16 use f function Type 1. * Rounds 2, 5, 8, 11, and 14 use f function Type 2. * Rounds 3, 6, 9, 12, and 15 use f function Type 3. */ t = l; l = r; r = t ^ F1(r, Km[ 0], Kr & 31); Kr >>= 8; t = l; l = r; r = t ^ F2(r, Km[ 1], Kr & 31); Kr >>= 8; t = l; l = r; r = t ^ F3(r, Km[ 2], Kr & 31); Kr >>= 8; t = l; l = r; r = t ^ F1(r, Km[ 3], Kr & 31); Kr = buf_get_le32(c->Kr + 4); t = l; l = r; r = t ^ F2(r, Km[ 4], Kr & 31); Kr >>= 8; t = l; l = r; r = t ^ F3(r, Km[ 5], Kr & 31); Kr >>= 8; t = l; l = r; r = t ^ F1(r, Km[ 6], Kr & 31); Kr >>= 8; t = l; l = r; r = t ^ F2(r, Km[ 7], Kr & 31); Kr = buf_get_le32(c->Kr + 8); t = l; l = r; r = t ^ F3(r, Km[ 8], Kr & 31); Kr >>= 8; t = l; l = r; r = t ^ F1(r, Km[ 9], Kr & 31); Kr >>= 8; t = l; l = r; r = t ^ F2(r, Km[10], Kr & 31); Kr >>= 8; t = l; l = r; r = t ^ F3(r, Km[11], Kr & 31); Kr = buf_get_le32(c->Kr + 12); t = l; l = r; r = t ^ F1(r, Km[12], Kr & 31); Kr >>= 8; t = l; l = r; r = t ^ F2(r, Km[13], Kr & 31); Kr >>= 8; t = l; l = r; r = t ^ F3(r, Km[14], Kr & 31); Kr >>= 8; t = l; l = r; r = t ^ F1(r, Km[15], Kr & 31); /* c1...c64 <-- (R16,L16). (Exchange final blocks L16, R16 and * concatenate to form the ciphertext.) */ buf_put_be32(outbuf + 0, r); buf_put_be32(outbuf + 4, l); } static unsigned int encrypt_block (void *context , byte *outbuf, const byte *inbuf) { CAST5_context *c = (CAST5_context *) context; do_encrypt_block (c, outbuf, inbuf); return /*burn_stack*/ (20+4*sizeof(void*)); } static void do_encrypt_block_3( CAST5_context *c, byte *outbuf, const byte *inbuf ) { u32 l0, r0, t0, l1, r1, t1, l2, r2, t2; u32 I; /* used by the Fx macros */ u32 *Km; u32 Kr; Km = c->Km; Kr = buf_get_le32(c->Kr + 0); l0 = buf_get_be32(inbuf + 0); r0 = buf_get_be32(inbuf + 4); l1 = buf_get_be32(inbuf + 8); r1 = buf_get_be32(inbuf + 12); l2 = buf_get_be32(inbuf + 16); r2 = buf_get_be32(inbuf + 20); t0 = l0; l0 = r0; r0 = t0 ^ F1(r0, Km[ 0], Kr & 31); t1 = l1; l1 = r1; r1 = t1 ^ F1(r1, Km[ 0], Kr & 31); t2 = l2; l2 = r2; r2 = t2 ^ F1(r2, Km[ 0], Kr & 31); Kr >>= 8; t0 = l0; l0 = r0; r0 = t0 ^ F2(r0, Km[ 1], Kr & 31); t1 = l1; l1 = r1; r1 = t1 ^ F2(r1, Km[ 1], Kr & 31); t2 = l2; l2 = r2; r2 = t2 ^ F2(r2, Km[ 1], Kr & 31); Kr >>= 8; t0 = l0; l0 = r0; r0 = t0 ^ F3(r0, Km[ 2], Kr & 31); t1 = l1; l1 = r1; r1 = t1 ^ F3(r1, Km[ 2], Kr & 31); t2 = l2; l2 = r2; r2 = t2 ^ F3(r2, Km[ 2], Kr & 31); Kr >>= 8; t0 = l0; l0 = r0; r0 = t0 ^ F1(r0, Km[ 3], Kr & 31); t1 = l1; l1 = r1; r1 = t1 ^ F1(r1, Km[ 3], Kr & 31); t2 = l2; l2 = r2; r2 = t2 ^ F1(r2, Km[ 3], Kr & 31); Kr = buf_get_le32(c->Kr + 4); t0 = l0; l0 = r0; r0 = t0 ^ F2(r0, Km[ 4], Kr & 31); t1 = l1; l1 = r1; r1 = t1 ^ F2(r1, Km[ 4], Kr & 31); t2 = l2; l2 = r2; r2 = t2 ^ F2(r2, Km[ 4], Kr & 31); Kr >>= 8; t0 = l0; l0 = r0; r0 = t0 ^ F3(r0, Km[ 5], Kr & 31); t1 = l1; l1 = r1; r1 = t1 ^ F3(r1, Km[ 5], Kr & 31); t2 = l2; l2 = r2; r2 = t2 ^ F3(r2, Km[ 5], Kr & 31); Kr >>= 8; t0 = l0; l0 = r0; r0 = t0 ^ F1(r0, Km[ 6], Kr & 31); t1 = l1; l1 = r1; r1 = t1 ^ F1(r1, Km[ 6], Kr & 31); t2 = l2; l2 = r2; r2 = t2 ^ F1(r2, Km[ 6], Kr & 31); Kr >>= 8; t0 = l0; l0 = r0; r0 = t0 ^ F2(r0, Km[ 7], Kr & 31); t1 = l1; l1 = r1; r1 = t1 ^ F2(r1, Km[ 7], Kr & 31); t2 = l2; l2 = r2; r2 = t2 ^ F2(r2, Km[ 7], Kr & 31); Kr = buf_get_le32(c->Kr + 8); t0 = l0; l0 = r0; r0 = t0 ^ F3(r0, Km[ 8], Kr & 31); t1 = l1; l1 = r1; r1 = t1 ^ F3(r1, Km[ 8], Kr & 31); t2 = l2; l2 = r2; r2 = t2 ^ F3(r2, Km[ 8], Kr & 31); Kr >>= 8; t0 = l0; l0 = r0; r0 = t0 ^ F1(r0, Km[ 9], Kr & 31); t1 = l1; l1 = r1; r1 = t1 ^ F1(r1, Km[ 9], Kr & 31); t2 = l2; l2 = r2; r2 = t2 ^ F1(r2, Km[ 9], Kr & 31); Kr >>= 8; t0 = l0; l0 = r0; r0 = t0 ^ F2(r0, Km[10], Kr & 31); t1 = l1; l1 = r1; r1 = t1 ^ F2(r1, Km[10], Kr & 31); t2 = l2; l2 = r2; r2 = t2 ^ F2(r2, Km[10], Kr & 31); Kr >>= 8; t0 = l0; l0 = r0; r0 = t0 ^ F3(r0, Km[11], Kr & 31); t1 = l1; l1 = r1; r1 = t1 ^ F3(r1, Km[11], Kr & 31); t2 = l2; l2 = r2; r2 = t2 ^ F3(r2, Km[11], Kr & 31); Kr = buf_get_le32(c->Kr + 12); t0 = l0; l0 = r0; r0 = t0 ^ F1(r0, Km[12], Kr & 31); t1 = l1; l1 = r1; r1 = t1 ^ F1(r1, Km[12], Kr & 31); t2 = l2; l2 = r2; r2 = t2 ^ F1(r2, Km[12], Kr & 31); Kr >>= 8; t0 = l0; l0 = r0; r0 = t0 ^ F2(r0, Km[13], Kr & 31); t1 = l1; l1 = r1; r1 = t1 ^ F2(r1, Km[13], Kr & 31); t2 = l2; l2 = r2; r2 = t2 ^ F2(r2, Km[13], Kr & 31); Kr >>= 8; t0 = l0; l0 = r0; r0 = t0 ^ F3(r0, Km[14], Kr & 31); t1 = l1; l1 = r1; r1 = t1 ^ F3(r1, Km[14], Kr & 31); t2 = l2; l2 = r2; r2 = t2 ^ F3(r2, Km[14], Kr & 31); Kr >>= 8; t0 = l0; l0 = r0; r0 = t0 ^ F1(r0, Km[15], Kr & 31); t1 = l1; l1 = r1; r1 = t1 ^ F1(r1, Km[15], Kr & 31); t2 = l2; l2 = r2; r2 = t2 ^ F1(r2, Km[15], Kr & 31); buf_put_be32(outbuf + 0, r0); buf_put_be32(outbuf + 4, l0); buf_put_be32(outbuf + 8, r1); buf_put_be32(outbuf + 12, l1); buf_put_be32(outbuf + 16, r2); buf_put_be32(outbuf + 20, l2); } static void do_decrypt_block (CAST5_context *c, byte *outbuf, const byte *inbuf ) { u32 l, r, t; u32 I; u32 *Km; u32 Kr; Km = c->Km; Kr = buf_get_be32(c->Kr + 12); l = buf_get_be32(inbuf + 0); r = buf_get_be32(inbuf + 4); t = l; l = r; r = t ^ F1(r, Km[15], Kr & 31); Kr >>= 8; t = l; l = r; r = t ^ F3(r, Km[14], Kr & 31); Kr >>= 8; t = l; l = r; r = t ^ F2(r, Km[13], Kr & 31); Kr >>= 8; t = l; l = r; r = t ^ F1(r, Km[12], Kr & 31); Kr = buf_get_be32(c->Kr + 8); t = l; l = r; r = t ^ F3(r, Km[11], Kr & 31); Kr >>= 8; t = l; l = r; r = t ^ F2(r, Km[10], Kr & 31); Kr >>= 8; t = l; l = r; r = t ^ F1(r, Km[ 9], Kr & 31); Kr >>= 8; t = l; l = r; r = t ^ F3(r, Km[ 8], Kr & 31); Kr = buf_get_be32(c->Kr + 4); t = l; l = r; r = t ^ F2(r, Km[ 7], Kr & 31); Kr >>= 8; t = l; l = r; r = t ^ F1(r, Km[ 6], Kr & 31); Kr >>= 8; t = l; l = r; r = t ^ F3(r, Km[ 5], Kr & 31); Kr >>= 8; t = l; l = r; r = t ^ F2(r, Km[ 4], Kr & 31); Kr = buf_get_be32(c->Kr + 0); t = l; l = r; r = t ^ F1(r, Km[ 3], Kr & 31); Kr >>= 8; t = l; l = r; r = t ^ F3(r, Km[ 2], Kr & 31); Kr >>= 8; t = l; l = r; r = t ^ F2(r, Km[ 1], Kr & 31); Kr >>= 8; t = l; l = r; r = t ^ F1(r, Km[ 0], Kr & 31); buf_put_be32(outbuf + 0, r); buf_put_be32(outbuf + 4, l); } static unsigned int decrypt_block (void *context, byte *outbuf, const byte *inbuf) { CAST5_context *c = (CAST5_context *) context; do_decrypt_block (c, outbuf, inbuf); return /*burn_stack*/ (20+4*sizeof(void*)); } static void do_decrypt_block_3 (CAST5_context *c, byte *outbuf, const byte *inbuf ) { u32 l0, r0, t0, l1, r1, t1, l2, r2, t2; u32 I; u32 *Km; u32 Kr; Km = c->Km; Kr = buf_get_be32(c->Kr + 12); l0 = buf_get_be32(inbuf + 0); r0 = buf_get_be32(inbuf + 4); l1 = buf_get_be32(inbuf + 8); r1 = buf_get_be32(inbuf + 12); l2 = buf_get_be32(inbuf + 16); r2 = buf_get_be32(inbuf + 20); t0 = l0; l0 = r0; r0 = t0 ^ F1(r0, Km[15], Kr & 31); t1 = l1; l1 = r1; r1 = t1 ^ F1(r1, Km[15], Kr & 31); t2 = l2; l2 = r2; r2 = t2 ^ F1(r2, Km[15], Kr & 31); Kr >>= 8; t0 = l0; l0 = r0; r0 = t0 ^ F3(r0, Km[14], Kr & 31); t1 = l1; l1 = r1; r1 = t1 ^ F3(r1, Km[14], Kr & 31); t2 = l2; l2 = r2; r2 = t2 ^ F3(r2, Km[14], Kr & 31); Kr >>= 8; t0 = l0; l0 = r0; r0 = t0 ^ F2(r0, Km[13], Kr & 31); t1 = l1; l1 = r1; r1 = t1 ^ F2(r1, Km[13], Kr & 31); t2 = l2; l2 = r2; r2 = t2 ^ F2(r2, Km[13], Kr & 31); Kr >>= 8; t0 = l0; l0 = r0; r0 = t0 ^ F1(r0, Km[12], Kr & 31); t1 = l1; l1 = r1; r1 = t1 ^ F1(r1, Km[12], Kr & 31); t2 = l2; l2 = r2; r2 = t2 ^ F1(r2, Km[12], Kr & 31); Kr = buf_get_be32(c->Kr + 8); t0 = l0; l0 = r0; r0 = t0 ^ F3(r0, Km[11], Kr & 31); t1 = l1; l1 = r1; r1 = t1 ^ F3(r1, Km[11], Kr & 31); t2 = l2; l2 = r2; r2 = t2 ^ F3(r2, Km[11], Kr & 31); Kr >>= 8; t0 = l0; l0 = r0; r0 = t0 ^ F2(r0, Km[10], Kr & 31); t1 = l1; l1 = r1; r1 = t1 ^ F2(r1, Km[10], Kr & 31); t2 = l2; l2 = r2; r2 = t2 ^ F2(r2, Km[10], Kr & 31); Kr >>= 8; t0 = l0; l0 = r0; r0 = t0 ^ F1(r0, Km[ 9], Kr & 31); t1 = l1; l1 = r1; r1 = t1 ^ F1(r1, Km[ 9], Kr & 31); t2 = l2; l2 = r2; r2 = t2 ^ F1(r2, Km[ 9], Kr & 31); Kr >>= 8; t0 = l0; l0 = r0; r0 = t0 ^ F3(r0, Km[ 8], Kr & 31); t1 = l1; l1 = r1; r1 = t1 ^ F3(r1, Km[ 8], Kr & 31); t2 = l2; l2 = r2; r2 = t2 ^ F3(r2, Km[ 8], Kr & 31); Kr = buf_get_be32(c->Kr + 4); t0 = l0; l0 = r0; r0 = t0 ^ F2(r0, Km[ 7], Kr & 31); t1 = l1; l1 = r1; r1 = t1 ^ F2(r1, Km[ 7], Kr & 31); t2 = l2; l2 = r2; r2 = t2 ^ F2(r2, Km[ 7], Kr & 31); Kr >>= 8; t0 = l0; l0 = r0; r0 = t0 ^ F1(r0, Km[ 6], Kr & 31); t1 = l1; l1 = r1; r1 = t1 ^ F1(r1, Km[ 6], Kr & 31); t2 = l2; l2 = r2; r2 = t2 ^ F1(r2, Km[ 6], Kr & 31); Kr >>= 8; t0 = l0; l0 = r0; r0 = t0 ^ F3(r0, Km[ 5], Kr & 31); t1 = l1; l1 = r1; r1 = t1 ^ F3(r1, Km[ 5], Kr & 31); t2 = l2; l2 = r2; r2 = t2 ^ F3(r2, Km[ 5], Kr & 31); Kr >>= 8; t0 = l0; l0 = r0; r0 = t0 ^ F2(r0, Km[ 4], Kr & 31); t1 = l1; l1 = r1; r1 = t1 ^ F2(r1, Km[ 4], Kr & 31); t2 = l2; l2 = r2; r2 = t2 ^ F2(r2, Km[ 4], Kr & 31); Kr = buf_get_be32(c->Kr + 0); t0 = l0; l0 = r0; r0 = t0 ^ F1(r0, Km[ 3], Kr & 31); t1 = l1; l1 = r1; r1 = t1 ^ F1(r1, Km[ 3], Kr & 31); t2 = l2; l2 = r2; r2 = t2 ^ F1(r2, Km[ 3], Kr & 31); Kr >>= 8; t0 = l0; l0 = r0; r0 = t0 ^ F3(r0, Km[ 2], Kr & 31); t1 = l1; l1 = r1; r1 = t1 ^ F3(r1, Km[ 2], Kr & 31); t2 = l2; l2 = r2; r2 = t2 ^ F3(r2, Km[ 2], Kr & 31); Kr >>= 8; t0 = l0; l0 = r0; r0 = t0 ^ F2(r0, Km[ 1], Kr & 31); t1 = l1; l1 = r1; r1 = t1 ^ F2(r1, Km[ 1], Kr & 31); t2 = l2; l2 = r2; r2 = t2 ^ F2(r2, Km[ 1], Kr & 31); Kr >>= 8; t0 = l0; l0 = r0; r0 = t0 ^ F1(r0, Km[ 0], Kr & 31); t1 = l1; l1 = r1; r1 = t1 ^ F1(r1, Km[ 0], Kr & 31); t2 = l2; l2 = r2; r2 = t2 ^ F1(r2, Km[ 0], Kr & 31); buf_put_be32(outbuf + 0, r0); buf_put_be32(outbuf + 4, l0); buf_put_be32(outbuf + 8, r1); buf_put_be32(outbuf + 12, l1); buf_put_be32(outbuf + 16, r2); buf_put_be32(outbuf + 20, l2); } #endif /*!USE_ARM_ASM*/ /* Bulk encryption of complete blocks in CTR mode. This function is only intended for the bulk encryption feature of cipher.c. CTR is expected to be of size CAST5_BLOCKSIZE. */ static void _gcry_cast5_ctr_enc(void *context, unsigned char *ctr, void *outbuf_arg, const void *inbuf_arg, size_t nblocks) { CAST5_context *ctx = context; unsigned char *outbuf = outbuf_arg; const unsigned char *inbuf = inbuf_arg; unsigned char tmpbuf[CAST5_BLOCKSIZE * 3]; int burn_stack_depth = (20 + 4 * sizeof(void*)) + 4 * CAST5_BLOCKSIZE; #ifdef USE_AMD64_ASM { if (nblocks >= 4) burn_stack_depth += 8 * sizeof(void*); /* Process data in 4 block chunks. */ while (nblocks >= 4) { cast5_amd64_ctr_enc(ctx, outbuf, inbuf, ctr); nblocks -= 4; outbuf += 4 * CAST5_BLOCKSIZE; inbuf += 4 * CAST5_BLOCKSIZE; } /* Use generic code to handle smaller chunks... */ } #elif defined(USE_ARM_ASM) { /* Process data in 2 block chunks. */ while (nblocks >= 2) { _gcry_cast5_arm_ctr_enc(ctx, outbuf, inbuf, ctr); nblocks -= 2; outbuf += 2 * CAST5_BLOCKSIZE; inbuf += 2 * CAST5_BLOCKSIZE; } /* Use generic code to handle smaller chunks... */ } #endif #if !defined(USE_AMD64_ASM) && !defined(USE_ARM_ASM) for ( ;nblocks >= 3; nblocks -= 3) { /* Prepare the counter blocks. */ cipher_block_cpy (tmpbuf + 0, ctr, CAST5_BLOCKSIZE); cipher_block_cpy (tmpbuf + 8, ctr, CAST5_BLOCKSIZE); cipher_block_cpy (tmpbuf + 16, ctr, CAST5_BLOCKSIZE); cipher_block_add (tmpbuf + 8, 1, CAST5_BLOCKSIZE); cipher_block_add (tmpbuf + 16, 2, CAST5_BLOCKSIZE); cipher_block_add (ctr, 3, CAST5_BLOCKSIZE); /* Encrypt the counter. */ do_encrypt_block_3(ctx, tmpbuf, tmpbuf); /* XOR the input with the encrypted counter and store in output. */ buf_xor(outbuf, tmpbuf, inbuf, CAST5_BLOCKSIZE * 3); outbuf += CAST5_BLOCKSIZE * 3; inbuf += CAST5_BLOCKSIZE * 3; } #endif for ( ;nblocks; nblocks-- ) { /* Encrypt the counter. */ do_encrypt_block(ctx, tmpbuf, ctr); /* XOR the input with the encrypted counter and store in output. */ cipher_block_xor(outbuf, tmpbuf, inbuf, CAST5_BLOCKSIZE); outbuf += CAST5_BLOCKSIZE; inbuf += CAST5_BLOCKSIZE; /* Increment the counter. */ cipher_block_add (ctr, 1, CAST5_BLOCKSIZE); } wipememory(tmpbuf, sizeof(tmpbuf)); _gcry_burn_stack(burn_stack_depth); } /* Bulk decryption of complete blocks in CBC mode. This function is only intended for the bulk encryption feature of cipher.c. */ static void _gcry_cast5_cbc_dec(void *context, unsigned char *iv, void *outbuf_arg, const void *inbuf_arg, size_t nblocks) { CAST5_context *ctx = context; unsigned char *outbuf = outbuf_arg; const unsigned char *inbuf = inbuf_arg; unsigned char savebuf[CAST5_BLOCKSIZE * 3]; int burn_stack_depth = (20 + 4 * sizeof(void*)) + 4 * CAST5_BLOCKSIZE; #ifdef USE_AMD64_ASM { if (nblocks >= 4) burn_stack_depth += 8 * sizeof(void*); /* Process data in 4 block chunks. */ while (nblocks >= 4) { cast5_amd64_cbc_dec(ctx, outbuf, inbuf, iv); nblocks -= 4; outbuf += 4 * CAST5_BLOCKSIZE; inbuf += 4 * CAST5_BLOCKSIZE; } /* Use generic code to handle smaller chunks... */ } #elif defined(USE_ARM_ASM) { /* Process data in 2 block chunks. */ while (nblocks >= 2) { _gcry_cast5_arm_cbc_dec(ctx, outbuf, inbuf, iv); nblocks -= 2; outbuf += 2 * CAST5_BLOCKSIZE; inbuf += 2 * CAST5_BLOCKSIZE; } /* Use generic code to handle smaller chunks... */ } #endif #if !defined(USE_AMD64_ASM) && !defined(USE_ARM_ASM) for ( ;nblocks >= 3; nblocks -= 3) { /* INBUF is needed later and it may be identical to OUTBUF, so store the intermediate result to SAVEBUF. */ do_decrypt_block_3 (ctx, savebuf, inbuf); cipher_block_xor_1 (savebuf + 0, iv, CAST5_BLOCKSIZE); cipher_block_xor_1 (savebuf + 8, inbuf, CAST5_BLOCKSIZE * 2); cipher_block_cpy (iv, inbuf + 16, CAST5_BLOCKSIZE); buf_cpy (outbuf, savebuf, CAST5_BLOCKSIZE * 3); inbuf += CAST5_BLOCKSIZE * 3; outbuf += CAST5_BLOCKSIZE * 3; } #endif for ( ;nblocks; nblocks-- ) { /* INBUF is needed later and it may be identical to OUTBUF, so store the intermediate result to SAVEBUF. */ do_decrypt_block (ctx, savebuf, inbuf); cipher_block_xor_n_copy_2(outbuf, savebuf, iv, inbuf, CAST5_BLOCKSIZE); inbuf += CAST5_BLOCKSIZE; outbuf += CAST5_BLOCKSIZE; } wipememory(savebuf, sizeof(savebuf)); _gcry_burn_stack(burn_stack_depth); } /* Bulk decryption of complete blocks in CFB mode. This function is only intended for the bulk encryption feature of cipher.c. */ static void _gcry_cast5_cfb_dec(void *context, unsigned char *iv, void *outbuf_arg, const void *inbuf_arg, size_t nblocks) { CAST5_context *ctx = context; unsigned char *outbuf = outbuf_arg; const unsigned char *inbuf = inbuf_arg; unsigned char tmpbuf[CAST5_BLOCKSIZE * 3]; int burn_stack_depth = (20 + 4 * sizeof(void*)) + 4 * CAST5_BLOCKSIZE; #ifdef USE_AMD64_ASM { if (nblocks >= 4) burn_stack_depth += 8 * sizeof(void*); /* Process data in 4 block chunks. */ while (nblocks >= 4) { cast5_amd64_cfb_dec(ctx, outbuf, inbuf, iv); nblocks -= 4; outbuf += 4 * CAST5_BLOCKSIZE; inbuf += 4 * CAST5_BLOCKSIZE; } /* Use generic code to handle smaller chunks... */ } #elif defined(USE_ARM_ASM) { /* Process data in 2 block chunks. */ while (nblocks >= 2) { _gcry_cast5_arm_cfb_dec(ctx, outbuf, inbuf, iv); nblocks -= 2; outbuf += 2 * CAST5_BLOCKSIZE; inbuf += 2 * CAST5_BLOCKSIZE; } /* Use generic code to handle smaller chunks... */ } #endif #if !defined(USE_AMD64_ASM) && !defined(USE_ARM_ASM) for ( ;nblocks >= 3; nblocks -= 3 ) { cipher_block_cpy (tmpbuf + 0, iv, CAST5_BLOCKSIZE); cipher_block_cpy (tmpbuf + 8, inbuf + 0, CAST5_BLOCKSIZE * 2); cipher_block_cpy (iv, inbuf + 16, CAST5_BLOCKSIZE); do_encrypt_block_3 (ctx, tmpbuf, tmpbuf); buf_xor (outbuf, inbuf, tmpbuf, CAST5_BLOCKSIZE * 3); outbuf += CAST5_BLOCKSIZE * 3; inbuf += CAST5_BLOCKSIZE * 3; } #endif for ( ;nblocks; nblocks-- ) { do_encrypt_block(ctx, iv, iv); cipher_block_xor_n_copy(outbuf, iv, inbuf, CAST5_BLOCKSIZE); outbuf += CAST5_BLOCKSIZE; inbuf += CAST5_BLOCKSIZE; } wipememory(tmpbuf, sizeof(tmpbuf)); _gcry_burn_stack(burn_stack_depth); } static void key_schedule( u32 *x, u32 *z, u32 *k ) { #define xi(i) ((x[(i)/4] >> (8*(3-((i)%4)))) & 0xff) #define zi(i) ((z[(i)/4] >> (8*(3-((i)%4)))) & 0xff) z[0] = x[0] ^ s5[xi(13)]^s6[xi(15)]^s7[xi(12)]^s8[xi(14)]^s7[xi( 8)]; z[1] = x[2] ^ s5[zi( 0)]^s6[zi( 2)]^s7[zi( 1)]^s8[zi( 3)]^s8[xi(10)]; z[2] = x[3] ^ s5[zi( 7)]^s6[zi( 6)]^s7[zi( 5)]^s8[zi( 4)]^s5[xi( 9)]; z[3] = x[1] ^ s5[zi(10)]^s6[zi( 9)]^s7[zi(11)]^s8[zi( 8)]^s6[xi(11)]; k[0] = s5[zi( 8)]^s6[zi( 9)]^s7[zi( 7)]^s8[zi( 6)]^s5[zi( 2)]; k[1] = s5[zi(10)]^s6[zi(11)]^s7[zi( 5)]^s8[zi( 4)]^s6[zi( 6)]; k[2] = s5[zi(12)]^s6[zi(13)]^s7[zi( 3)]^s8[zi( 2)]^s7[zi( 9)]; k[3] = s5[zi(14)]^s6[zi(15)]^s7[zi( 1)]^s8[zi( 0)]^s8[zi(12)]; x[0] = z[2] ^ s5[zi( 5)]^s6[zi( 7)]^s7[zi( 4)]^s8[zi( 6)]^s7[zi( 0)]; x[1] = z[0] ^ s5[xi( 0)]^s6[xi( 2)]^s7[xi( 1)]^s8[xi( 3)]^s8[zi( 2)]; x[2] = z[1] ^ s5[xi( 7)]^s6[xi( 6)]^s7[xi( 5)]^s8[xi( 4)]^s5[zi( 1)]; x[3] = z[3] ^ s5[xi(10)]^s6[xi( 9)]^s7[xi(11)]^s8[xi( 8)]^s6[zi( 3)]; k[4] = s5[xi( 3)]^s6[xi( 2)]^s7[xi(12)]^s8[xi(13)]^s5[xi( 8)]; k[5] = s5[xi( 1)]^s6[xi( 0)]^s7[xi(14)]^s8[xi(15)]^s6[xi(13)]; k[6] = s5[xi( 7)]^s6[xi( 6)]^s7[xi( 8)]^s8[xi( 9)]^s7[xi( 3)]; k[7] = s5[xi( 5)]^s6[xi( 4)]^s7[xi(10)]^s8[xi(11)]^s8[xi( 7)]; z[0] = x[0] ^ s5[xi(13)]^s6[xi(15)]^s7[xi(12)]^s8[xi(14)]^s7[xi( 8)]; z[1] = x[2] ^ s5[zi( 0)]^s6[zi( 2)]^s7[zi( 1)]^s8[zi( 3)]^s8[xi(10)]; z[2] = x[3] ^ s5[zi( 7)]^s6[zi( 6)]^s7[zi( 5)]^s8[zi( 4)]^s5[xi( 9)]; z[3] = x[1] ^ s5[zi(10)]^s6[zi( 9)]^s7[zi(11)]^s8[zi( 8)]^s6[xi(11)]; k[8] = s5[zi( 3)]^s6[zi( 2)]^s7[zi(12)]^s8[zi(13)]^s5[zi( 9)]; k[9] = s5[zi( 1)]^s6[zi( 0)]^s7[zi(14)]^s8[zi(15)]^s6[zi(12)]; k[10]= s5[zi( 7)]^s6[zi( 6)]^s7[zi( 8)]^s8[zi( 9)]^s7[zi( 2)]; k[11]= s5[zi( 5)]^s6[zi( 4)]^s7[zi(10)]^s8[zi(11)]^s8[zi( 6)]; x[0] = z[2] ^ s5[zi( 5)]^s6[zi( 7)]^s7[zi( 4)]^s8[zi( 6)]^s7[zi( 0)]; x[1] = z[0] ^ s5[xi( 0)]^s6[xi( 2)]^s7[xi( 1)]^s8[xi( 3)]^s8[zi( 2)]; x[2] = z[1] ^ s5[xi( 7)]^s6[xi( 6)]^s7[xi( 5)]^s8[xi( 4)]^s5[zi( 1)]; x[3] = z[3] ^ s5[xi(10)]^s6[xi( 9)]^s7[xi(11)]^s8[xi( 8)]^s6[zi( 3)]; k[12]= s5[xi( 8)]^s6[xi( 9)]^s7[xi( 7)]^s8[xi( 6)]^s5[xi( 3)]; k[13]= s5[xi(10)]^s6[xi(11)]^s7[xi( 5)]^s8[xi( 4)]^s6[xi( 7)]; k[14]= s5[xi(12)]^s6[xi(13)]^s7[xi( 3)]^s8[xi( 2)]^s7[xi( 8)]; k[15]= s5[xi(14)]^s6[xi(15)]^s7[xi( 1)]^s8[xi( 0)]^s8[xi(13)]; #undef xi #undef zi } static gcry_err_code_t do_cast_setkey( CAST5_context *c, const byte *key, unsigned keylen ) { static int initialized; static const char* selftest_failed; int i; u32 x[4]; u32 z[4]; u32 k[16]; if( !initialized ) { initialized = 1; selftest_failed = selftest(); if( selftest_failed ) log_error ("CAST5 selftest failed (%s).\n", selftest_failed ); } if( selftest_failed ) return GPG_ERR_SELFTEST_FAILED; if( keylen != 16 ) return GPG_ERR_INV_KEYLEN; x[0] = buf_get_be32(key + 0); x[1] = buf_get_be32(key + 4); x[2] = buf_get_be32(key + 8); x[3] = buf_get_be32(key + 12); key_schedule( x, z, k ); for(i=0; i < 16; i++ ) c->Km[i] = k[i]; key_schedule( x, z, k ); for(i=0; i < 16; i++ ) c->Kr[i] = k[i] & 0x1f; #ifdef USE_ARM_ASM for (i = 0; i < 4; i++) { byte Kr_arm[4]; /* Convert rotate left to rotate right and add shift left * by 2. */ Kr_arm[0] = ((32 - c->Kr[4 * i + 0]) - 2) & 0x1f; Kr_arm[1] = ((32 - c->Kr[4 * i + 1]) - 2) & 0x1f; Kr_arm[2] = ((32 - c->Kr[4 * i + 2]) - 2) & 0x1f; Kr_arm[3] = ((32 - c->Kr[4 * i + 3]) - 2) & 0x1f; /* Endian friendly store. */ c->Kr_arm_enc[i] = Kr_arm[0] | (Kr_arm[1] << 8) | (Kr_arm[2] << 16) | (Kr_arm[3] << 24); c->Kr_arm_dec[i] = Kr_arm[3] | (Kr_arm[2] << 8) | (Kr_arm[1] << 16) | (Kr_arm[0] << 24); wipememory(Kr_arm, sizeof(Kr_arm)); } #endif wipememory(x, sizeof x); wipememory(z, sizeof z); wipememory(k, sizeof k); #undef xi #undef zi return GPG_ERR_NO_ERROR; } static gcry_err_code_t cast_setkey (void *context, const byte *key, unsigned keylen, cipher_bulk_ops_t *bulk_ops) { CAST5_context *c = (CAST5_context *) context; gcry_err_code_t rc = do_cast_setkey (c, key, keylen); /* Setup bulk encryption routines. */ memset (bulk_ops, 0, sizeof(*bulk_ops)); bulk_ops->cfb_dec = _gcry_cast5_cfb_dec; bulk_ops->cbc_dec = _gcry_cast5_cbc_dec; bulk_ops->ctr_enc = _gcry_cast5_ctr_enc; return rc; } gcry_cipher_spec_t _gcry_cipher_spec_cast5 = { GCRY_CIPHER_CAST5, {0, 0}, "CAST5", NULL, NULL, CAST5_BLOCKSIZE, 128, sizeof (CAST5_context), cast_setkey, encrypt_block, decrypt_block , GRUB_UTIL_MODNAME("gcry_cast5") }; GRUB_MOD_INIT(gcry_cast5) { grub_cipher_register (&_gcry_cipher_spec_cast5); } GRUB_MOD_FINI(gcry_cast5) { grub_cipher_unregister (&_gcry_cipher_spec_cast5); } grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/cipher/blake2.c0000644000175000017500000006216115036452441022155 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ #include GRUB_MOD_LICENSE ("GPLv3+"); /* blake2.c - BLAKE2b and BLAKE2s hash functions (RFC 7693) * Copyright (C) 2017 Jussi Kivilinna * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . */ /* The code is based on public-domain/CC0 BLAKE2 reference implementation * by Samual Neves, at https://github.com/BLAKE2/BLAKE2/tree/master/ref * Copyright 2012, Samuel Neves */ #include "g10lib.h" #include "bithelp.h" #include "bufhelp.h" #include "cipher.h" #include "hash-common.h" /* USE_AVX indicates whether to compile with Intel AVX code. */ #undef USE_AVX #if defined(__x86_64__) && defined(HAVE_GCC_INLINE_ASM_AVX) && \ (defined(HAVE_COMPATIBLE_GCC_AMD64_PLATFORM_AS) || \ defined(HAVE_COMPATIBLE_GCC_WIN64_PLATFORM_AS)) # define USE_AVX 1 #endif /* USE_AVX2 indicates whether to compile with Intel AVX2 code. */ #undef USE_AVX2 #if defined(__x86_64__) && defined(HAVE_GCC_INLINE_ASM_AVX2) && \ (defined(HAVE_COMPATIBLE_GCC_AMD64_PLATFORM_AS) || \ defined(HAVE_COMPATIBLE_GCC_WIN64_PLATFORM_AS)) # define USE_AVX2 1 #endif /* USE_AVX512 indicates whether to compile with Intel AVX512 code. */ #undef USE_AVX512 #if defined(__x86_64__) && defined(HAVE_GCC_INLINE_ASM_AVX512) && \ (defined(HAVE_COMPATIBLE_GCC_AMD64_PLATFORM_AS) || \ defined(HAVE_COMPATIBLE_GCC_WIN64_PLATFORM_AS)) # define USE_AVX512 1 #endif /* AMD64 assembly implementations use SystemV ABI, ABI conversion and additional * stack to store XMM6-XMM15 needed on Win64. */ #undef ASM_FUNC_ABI #undef ASM_EXTRA_STACK #if (defined(USE_AVX) || defined(USE_AVX2) || defined(USE_AVX512)) \ && defined(HAVE_COMPATIBLE_GCC_WIN64_PLATFORM_AS) # define ASM_FUNC_ABI __attribute__((sysv_abi)) # define ASM_EXTRA_STACK (10 * 16) #else # define ASM_FUNC_ABI # define ASM_EXTRA_STACK 0 #endif #define BLAKE2B_BLOCKBYTES 128 #define BLAKE2B_OUTBYTES 64 #define BLAKE2B_KEYBYTES 64 #define BLAKE2S_BLOCKBYTES 64 #define BLAKE2S_OUTBYTES 32 #define BLAKE2S_KEYBYTES 32 typedef struct { u64 h[8]; u64 t[2]; u64 f[2]; } BLAKE2B_STATE; struct blake2b_param_s { byte digest_length; byte key_length; byte fanout; byte depth; byte leaf_length[4]; byte node_offset[4]; byte xof_length[4]; byte node_depth; byte inner_length; byte reserved[14]; byte salt[16]; byte personal[16]; }; typedef struct BLAKE2B_CONTEXT_S { BLAKE2B_STATE state; byte buf[BLAKE2B_BLOCKBYTES]; size_t buflen; size_t outlen; #ifdef USE_AVX2 unsigned int use_avx2:1; #endif #ifdef USE_AVX512 unsigned int use_avx512:1; #endif } BLAKE2B_CONTEXT; typedef struct { u32 h[8]; u32 t[2]; u32 f[2]; } BLAKE2S_STATE; struct blake2s_param_s { byte digest_length; byte key_length; byte fanout; byte depth; byte leaf_length[4]; byte node_offset[4]; byte xof_length[2]; byte node_depth; byte inner_length; /* byte reserved[0]; */ byte salt[8]; byte personal[8]; }; typedef struct BLAKE2S_CONTEXT_S { BLAKE2S_STATE state; byte buf[BLAKE2S_BLOCKBYTES]; size_t buflen; size_t outlen; #ifdef USE_AVX unsigned int use_avx:1; #endif #ifdef USE_AVX512 unsigned int use_avx512:1; #endif } BLAKE2S_CONTEXT; typedef unsigned int (*blake2_transform_t)(void *S, const void *inblk, size_t nblks); static const u64 blake2b_IV[8] = { U64_C(0x6a09e667f3bcc908), U64_C(0xbb67ae8584caa73b), U64_C(0x3c6ef372fe94f82b), U64_C(0xa54ff53a5f1d36f1), U64_C(0x510e527fade682d1), U64_C(0x9b05688c2b3e6c1f), U64_C(0x1f83d9abfb41bd6b), U64_C(0x5be0cd19137e2179) }; static const u32 blake2s_IV[8] = { 0x6A09E667UL, 0xBB67AE85UL, 0x3C6EF372UL, 0xA54FF53AUL, 0x510E527FUL, 0x9B05688CUL, 0x1F83D9ABUL, 0x5BE0CD19UL }; static byte zero_block[BLAKE2B_BLOCKBYTES] = { 0, }; static void blake2_write(void *S, const void *inbuf, size_t inlen, byte *tmpbuf, size_t *tmpbuflen, size_t blkbytes, blake2_transform_t transform_fn) { const byte* in = inbuf; unsigned int burn = 0; if (inlen > 0) { size_t left = *tmpbuflen; size_t fill = blkbytes - left; size_t nblks; if (inlen > fill) { if (fill > 0) buf_cpy (tmpbuf + left, in, fill); /* Fill buffer */ left = 0; burn = transform_fn (S, tmpbuf, 1); /* Increment counter + Compress */ in += fill; inlen -= fill; nblks = inlen / blkbytes - !(inlen % blkbytes); if (nblks) { burn = transform_fn(S, in, nblks); in += blkbytes * nblks; inlen -= blkbytes * nblks; } } gcry_assert (inlen > 0); buf_cpy (tmpbuf + left, in, inlen); *tmpbuflen = left + inlen; } if (burn) _gcry_burn_stack (burn); return; } static inline void blake2b_set_lastblock(BLAKE2B_STATE *S) { S->f[0] = U64_C(0xffffffffffffffff); } static inline int blake2b_is_lastblock(const BLAKE2B_STATE *S) { return S->f[0] != 0; } static inline void blake2b_increment_counter(BLAKE2B_STATE *S, const int inc) { S->t[0] += (u64)inc; S->t[1] += (S->t[0] < (u64)inc) - (inc < 0); } static inline u64 rotr64(u64 x, u64 n) { return ((x >> (n & 63)) | (x << ((64 - n) & 63))); } static unsigned int blake2b_transform_generic(BLAKE2B_STATE *S, const void *inblks, size_t nblks) { static const byte blake2b_sigma[12][16] = { { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }, { 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3 }, { 11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4 }, { 7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8 }, { 9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13 }, { 2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9 }, { 12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11 }, { 13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10 }, { 6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5 }, { 10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13 , 0 }, { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }, { 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3 } }; const byte* in = inblks; u64 m[16]; u64 v[16]; while (nblks--) { /* Increment counter */ blake2b_increment_counter (S, BLAKE2B_BLOCKBYTES); /* Compress */ m[0] = buf_get_le64 (in + 0 * sizeof(m[0])); m[1] = buf_get_le64 (in + 1 * sizeof(m[0])); m[2] = buf_get_le64 (in + 2 * sizeof(m[0])); m[3] = buf_get_le64 (in + 3 * sizeof(m[0])); m[4] = buf_get_le64 (in + 4 * sizeof(m[0])); m[5] = buf_get_le64 (in + 5 * sizeof(m[0])); m[6] = buf_get_le64 (in + 6 * sizeof(m[0])); m[7] = buf_get_le64 (in + 7 * sizeof(m[0])); m[8] = buf_get_le64 (in + 8 * sizeof(m[0])); m[9] = buf_get_le64 (in + 9 * sizeof(m[0])); m[10] = buf_get_le64 (in + 10 * sizeof(m[0])); m[11] = buf_get_le64 (in + 11 * sizeof(m[0])); m[12] = buf_get_le64 (in + 12 * sizeof(m[0])); m[13] = buf_get_le64 (in + 13 * sizeof(m[0])); m[14] = buf_get_le64 (in + 14 * sizeof(m[0])); m[15] = buf_get_le64 (in + 15 * sizeof(m[0])); v[ 0] = S->h[0]; v[ 1] = S->h[1]; v[ 2] = S->h[2]; v[ 3] = S->h[3]; v[ 4] = S->h[4]; v[ 5] = S->h[5]; v[ 6] = S->h[6]; v[ 7] = S->h[7]; v[ 8] = blake2b_IV[0]; v[ 9] = blake2b_IV[1]; v[10] = blake2b_IV[2]; v[11] = blake2b_IV[3]; v[12] = blake2b_IV[4] ^ S->t[0]; v[13] = blake2b_IV[5] ^ S->t[1]; v[14] = blake2b_IV[6] ^ S->f[0]; v[15] = blake2b_IV[7] ^ S->f[1]; #define G(r,i,a,b,c,d) \ do { \ a = a + b + m[blake2b_sigma[r][2*i+0]]; \ d = rotr64(d ^ a, 32); \ c = c + d; \ b = rotr64(b ^ c, 24); \ a = a + b + m[blake2b_sigma[r][2*i+1]]; \ d = rotr64(d ^ a, 16); \ c = c + d; \ b = rotr64(b ^ c, 63); \ } while(0) #define ROUND(r) \ do { \ G(r,0,v[ 0],v[ 4],v[ 8],v[12]); \ G(r,1,v[ 1],v[ 5],v[ 9],v[13]); \ G(r,2,v[ 2],v[ 6],v[10],v[14]); \ G(r,3,v[ 3],v[ 7],v[11],v[15]); \ G(r,4,v[ 0],v[ 5],v[10],v[15]); \ G(r,5,v[ 1],v[ 6],v[11],v[12]); \ G(r,6,v[ 2],v[ 7],v[ 8],v[13]); \ G(r,7,v[ 3],v[ 4],v[ 9],v[14]); \ } while(0) ROUND(0); ROUND(1); ROUND(2); ROUND(3); ROUND(4); ROUND(5); ROUND(6); ROUND(7); ROUND(8); ROUND(9); ROUND(10); ROUND(11); #undef G #undef ROUND S->h[0] = S->h[0] ^ v[0] ^ v[0 + 8]; S->h[1] = S->h[1] ^ v[1] ^ v[1 + 8]; S->h[2] = S->h[2] ^ v[2] ^ v[2 + 8]; S->h[3] = S->h[3] ^ v[3] ^ v[3 + 8]; S->h[4] = S->h[4] ^ v[4] ^ v[4 + 8]; S->h[5] = S->h[5] ^ v[5] ^ v[5 + 8]; S->h[6] = S->h[6] ^ v[6] ^ v[6 + 8]; S->h[7] = S->h[7] ^ v[7] ^ v[7 + 8]; in += BLAKE2B_BLOCKBYTES; } return sizeof(void *) * 4 + sizeof(u64) * 16 * 2; } #ifdef USE_AVX2 unsigned int _gcry_blake2b_transform_amd64_avx2(BLAKE2B_STATE *S, const void *inblks, size_t nblks) ASM_FUNC_ABI; #endif #ifdef USE_AVX512 unsigned int _gcry_blake2b_transform_amd64_avx512(BLAKE2B_STATE *S, const void *inblks, size_t nblks) ASM_FUNC_ABI; #endif static unsigned int blake2b_transform(void *ctx, const void *inblks, size_t nblks) { BLAKE2B_CONTEXT *c = ctx; unsigned int nburn; if (0) {} #ifdef USE_AVX512 else if (c->use_avx512) nburn = _gcry_blake2b_transform_amd64_avx512(&c->state, inblks, nblks); #endif #ifdef USE_AVX2 else if (c->use_avx2) nburn = _gcry_blake2b_transform_amd64_avx2(&c->state, inblks, nblks); #endif else nburn = blake2b_transform_generic(&c->state, inblks, nblks); if (nburn) nburn += ASM_EXTRA_STACK; return nburn; } static void blake2b_final(void *ctx) { BLAKE2B_CONTEXT *c = ctx; BLAKE2B_STATE *S = &c->state; unsigned int burn; size_t i; gcry_assert (sizeof(c->buf) >= c->outlen); if (blake2b_is_lastblock(S)) return; if (c->buflen < BLAKE2B_BLOCKBYTES) memset (c->buf + c->buflen, 0, BLAKE2B_BLOCKBYTES - c->buflen); /* Padding */ blake2b_set_lastblock (S); blake2b_increment_counter (S, (int)c->buflen - BLAKE2B_BLOCKBYTES); burn = blake2b_transform (ctx, c->buf, 1); /* Output full hash to buffer */ for (i = 0; i < 8; ++i) buf_put_le64 (c->buf + sizeof(S->h[i]) * i, S->h[i]); /* Zero out extra buffer bytes. */ if (c->outlen < sizeof(c->buf)) memset (c->buf + c->outlen, 0, sizeof(c->buf) - c->outlen); if (burn) _gcry_burn_stack (burn); } static byte *blake2b_read(void *ctx) { BLAKE2B_CONTEXT *c = ctx; return c->buf; } static void blake2b_write(void *ctx, const void *inbuf, size_t inlen) { BLAKE2B_CONTEXT *c = ctx; BLAKE2B_STATE *S = &c->state; blake2_write(S, inbuf, inlen, c->buf, &c->buflen, BLAKE2B_BLOCKBYTES, blake2b_transform); } static inline void blake2b_init_param(BLAKE2B_STATE *S, const struct blake2b_param_s *P) { const byte *p = (const byte *)P; size_t i; /* init xors IV with input parameter block */ /* IV XOR ParamBlock */ for (i = 0; i < 8; ++i) S->h[i] = blake2b_IV[i] ^ buf_get_le64(p + sizeof(S->h[i]) * i); } static inline gcry_err_code_t blake2b_init(BLAKE2B_CONTEXT *ctx, const byte *key, size_t keylen) { struct blake2b_param_s P[1] = { { 0, } }; BLAKE2B_STATE *S = &ctx->state; if (!ctx->outlen || ctx->outlen > BLAKE2B_OUTBYTES) return GPG_ERR_INV_ARG; if (sizeof(P[0]) != sizeof(u64) * 8) return GPG_ERR_INTERNAL; if (keylen && (!key || keylen > BLAKE2B_KEYBYTES)) return GPG_ERR_INV_KEYLEN; P->digest_length = ctx->outlen; P->key_length = keylen; P->fanout = 1; P->depth = 1; blake2b_init_param (S, P); wipememory (P, sizeof(P)); if (key) { blake2b_write (ctx, key, keylen); blake2b_write (ctx, zero_block, BLAKE2B_BLOCKBYTES - keylen); } return 0; } static gcry_err_code_t blake2b_init_ctx(void *ctx, unsigned int flags, const byte *key, size_t keylen, unsigned int dbits) { BLAKE2B_CONTEXT *c = ctx; unsigned int features = _gcry_get_hw_features (); (void)features; (void)flags; memset (c, 0, sizeof (*c)); #ifdef USE_AVX2 c->use_avx2 = !!(features & HWF_INTEL_AVX2); #endif #ifdef USE_AVX512 c->use_avx512 = !!(features & HWF_INTEL_AVX512); #endif c->outlen = dbits / 8; c->buflen = 0; return blake2b_init(c, key, keylen); } /* Variable-length Hash Function H'. */ gcry_err_code_t blake2b_vl_hash (const void *in, size_t inlen, size_t outputlen, void *output) { gcry_err_code_t ec; BLAKE2B_CONTEXT ctx; unsigned char buf[4]; ec = blake2b_init_ctx (&ctx, 0, NULL, 0, (outputlen < 64 ? outputlen: 64)*8); if (ec) return ec; buf_put_le32 (buf, outputlen); blake2b_write (&ctx, buf, 4); blake2b_write (&ctx, in, inlen); blake2b_final (&ctx); if (outputlen <= 64) memcpy (output, ctx.buf, outputlen); else { int r = (outputlen-1)/32 - 1; unsigned int remained = outputlen - 32*r; int i; unsigned char d[64]; i = 0; while (1) { memcpy (d, ctx.buf, 64); memcpy ((unsigned char *)output+i*32, d, 32); if (++i >= r) break; ec = blake2b_init_ctx (&ctx, 0, NULL, 0, 64*8); if (ec) return ec; blake2b_write (&ctx, d, 64); blake2b_final (&ctx); } ec = blake2b_init_ctx (&ctx, 0, NULL, 0, remained*8); if (ec) return ec; blake2b_write (&ctx, d, 64); blake2b_final (&ctx); memcpy ((unsigned char *)output+r*32, ctx.buf, remained); } wipememory (buf, sizeof (buf)); wipememory (&ctx, sizeof (ctx)); return 0; } static inline void blake2s_set_lastblock(BLAKE2S_STATE *S) { S->f[0] = 0xFFFFFFFFUL; } static inline int blake2s_is_lastblock(BLAKE2S_STATE *S) { return S->f[0] != 0; } static inline void blake2s_increment_counter(BLAKE2S_STATE *S, const int inc) { S->t[0] += (u32)inc; S->t[1] += (S->t[0] < (u32)inc) - (inc < 0); } static unsigned int blake2s_transform_generic(BLAKE2S_STATE *S, const void *inblks, size_t nblks) { static const byte blake2s_sigma[10][16] = { { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }, { 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3 }, { 11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4 }, { 7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8 }, { 9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13 }, { 2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9 }, { 12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11 }, { 13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10 }, { 6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5 }, { 10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13 , 0 }, }; unsigned int burn = 0; const byte* in = inblks; u32 m[16]; u32 v[16]; while (nblks--) { /* Increment counter */ blake2s_increment_counter (S, BLAKE2S_BLOCKBYTES); /* Compress */ m[0] = buf_get_le32 (in + 0 * sizeof(m[0])); m[1] = buf_get_le32 (in + 1 * sizeof(m[0])); m[2] = buf_get_le32 (in + 2 * sizeof(m[0])); m[3] = buf_get_le32 (in + 3 * sizeof(m[0])); m[4] = buf_get_le32 (in + 4 * sizeof(m[0])); m[5] = buf_get_le32 (in + 5 * sizeof(m[0])); m[6] = buf_get_le32 (in + 6 * sizeof(m[0])); m[7] = buf_get_le32 (in + 7 * sizeof(m[0])); m[8] = buf_get_le32 (in + 8 * sizeof(m[0])); m[9] = buf_get_le32 (in + 9 * sizeof(m[0])); m[10] = buf_get_le32 (in + 10 * sizeof(m[0])); m[11] = buf_get_le32 (in + 11 * sizeof(m[0])); m[12] = buf_get_le32 (in + 12 * sizeof(m[0])); m[13] = buf_get_le32 (in + 13 * sizeof(m[0])); m[14] = buf_get_le32 (in + 14 * sizeof(m[0])); m[15] = buf_get_le32 (in + 15 * sizeof(m[0])); v[ 0] = S->h[0]; v[ 1] = S->h[1]; v[ 2] = S->h[2]; v[ 3] = S->h[3]; v[ 4] = S->h[4]; v[ 5] = S->h[5]; v[ 6] = S->h[6]; v[ 7] = S->h[7]; v[ 8] = blake2s_IV[0]; v[ 9] = blake2s_IV[1]; v[10] = blake2s_IV[2]; v[11] = blake2s_IV[3]; v[12] = S->t[0] ^ blake2s_IV[4]; v[13] = S->t[1] ^ blake2s_IV[5]; v[14] = S->f[0] ^ blake2s_IV[6]; v[15] = S->f[1] ^ blake2s_IV[7]; #define G(r,i,a,b,c,d) \ do { \ a = a + b + m[blake2s_sigma[r][2*i+0]]; \ d = ror(d ^ a, 16); \ c = c + d; \ b = ror(b ^ c, 12); \ a = a + b + m[blake2s_sigma[r][2*i+1]]; \ d = ror(d ^ a, 8); \ c = c + d; \ b = ror(b ^ c, 7); \ } while(0) #define ROUND(r) \ do { \ G(r,0,v[ 0],v[ 4],v[ 8],v[12]); \ G(r,1,v[ 1],v[ 5],v[ 9],v[13]); \ G(r,2,v[ 2],v[ 6],v[10],v[14]); \ G(r,3,v[ 3],v[ 7],v[11],v[15]); \ G(r,4,v[ 0],v[ 5],v[10],v[15]); \ G(r,5,v[ 1],v[ 6],v[11],v[12]); \ G(r,6,v[ 2],v[ 7],v[ 8],v[13]); \ G(r,7,v[ 3],v[ 4],v[ 9],v[14]); \ } while(0) ROUND(0); ROUND(1); ROUND(2); ROUND(3); ROUND(4); ROUND(5); ROUND(6); ROUND(7); ROUND(8); ROUND(9); #undef G #undef ROUND S->h[0] = S->h[0] ^ v[0] ^ v[0 + 8]; S->h[1] = S->h[1] ^ v[1] ^ v[1 + 8]; S->h[2] = S->h[2] ^ v[2] ^ v[2 + 8]; S->h[3] = S->h[3] ^ v[3] ^ v[3 + 8]; S->h[4] = S->h[4] ^ v[4] ^ v[4 + 8]; S->h[5] = S->h[5] ^ v[5] ^ v[5 + 8]; S->h[6] = S->h[6] ^ v[6] ^ v[6 + 8]; S->h[7] = S->h[7] ^ v[7] ^ v[7 + 8]; in += BLAKE2S_BLOCKBYTES; } return burn; } #ifdef USE_AVX unsigned int _gcry_blake2s_transform_amd64_avx(BLAKE2S_STATE *S, const void *inblks, size_t nblks) ASM_FUNC_ABI; #endif #ifdef USE_AVX512 unsigned int _gcry_blake2s_transform_amd64_avx512(BLAKE2S_STATE *S, const void *inblks, size_t nblks) ASM_FUNC_ABI; #endif static unsigned int blake2s_transform(void *ctx, const void *inblks, size_t nblks) { BLAKE2S_CONTEXT *c = ctx; unsigned int nburn; if (0) { } #ifdef USE_AVX512 else if (c->use_avx512) nburn = _gcry_blake2s_transform_amd64_avx512(&c->state, inblks, nblks); #endif #ifdef USE_AVX else if (c->use_avx) nburn = _gcry_blake2s_transform_amd64_avx(&c->state, inblks, nblks); #endif else nburn = blake2s_transform_generic(&c->state, inblks, nblks); if (nburn) nburn += ASM_EXTRA_STACK; return nburn; } static void blake2s_final(void *ctx) { BLAKE2S_CONTEXT *c = ctx; BLAKE2S_STATE *S = &c->state; unsigned int burn; size_t i; gcry_assert (sizeof(c->buf) >= c->outlen); if (blake2s_is_lastblock(S)) return; if (c->buflen < BLAKE2S_BLOCKBYTES) memset (c->buf + c->buflen, 0, BLAKE2S_BLOCKBYTES - c->buflen); /* Padding */ blake2s_set_lastblock (S); blake2s_increment_counter (S, (int)c->buflen - BLAKE2S_BLOCKBYTES); burn = blake2s_transform (ctx, c->buf, 1); /* Output full hash to buffer */ for (i = 0; i < 8; ++i) buf_put_le32 (c->buf + sizeof(S->h[i]) * i, S->h[i]); /* Zero out extra buffer bytes. */ if (c->outlen < sizeof(c->buf)) memset (c->buf + c->outlen, 0, sizeof(c->buf) - c->outlen); if (burn) _gcry_burn_stack (burn); } static byte *blake2s_read(void *ctx) { BLAKE2S_CONTEXT *c = ctx; return c->buf; } static void blake2s_write(void *ctx, const void *inbuf, size_t inlen) { BLAKE2S_CONTEXT *c = ctx; BLAKE2S_STATE *S = &c->state; blake2_write(S, inbuf, inlen, c->buf, &c->buflen, BLAKE2S_BLOCKBYTES, blake2s_transform); } static inline void blake2s_init_param(BLAKE2S_STATE *S, const struct blake2s_param_s *P) { const byte *p = (const byte *)P; size_t i; /* init2 xors IV with input parameter block */ /* IV XOR ParamBlock */ for (i = 0; i < 8; ++i) S->h[i] ^= blake2s_IV[i] ^ buf_get_le32(&p[i * 4]); } static inline gcry_err_code_t blake2s_init(BLAKE2S_CONTEXT *ctx, const byte *key, size_t keylen) { struct blake2s_param_s P[1] = { { 0, } }; BLAKE2S_STATE *S = &ctx->state; if (!ctx->outlen || ctx->outlen > BLAKE2S_OUTBYTES) return GPG_ERR_INV_ARG; if (sizeof(P[0]) != sizeof(u32) * 8) return GPG_ERR_INTERNAL; if (keylen && (!key || keylen > BLAKE2S_KEYBYTES)) return GPG_ERR_INV_KEYLEN; P->digest_length = ctx->outlen; P->key_length = keylen; P->fanout = 1; P->depth = 1; blake2s_init_param (S, P); wipememory (P, sizeof(P)); if (key) { blake2s_write (ctx, key, keylen); blake2s_write (ctx, zero_block, BLAKE2S_BLOCKBYTES - keylen); } return 0; } static gcry_err_code_t blake2s_init_ctx(void *ctx, unsigned int flags, const byte *key, size_t keylen, unsigned int dbits) { BLAKE2S_CONTEXT *c = ctx; unsigned int features = _gcry_get_hw_features (); (void)features; (void)flags; memset (c, 0, sizeof (*c)); #ifdef USE_AVX c->use_avx = !!(features & HWF_INTEL_AVX); #endif #ifdef USE_AVX c->use_avx512 = !!(features & HWF_INTEL_AVX512); #endif c->outlen = dbits / 8; c->buflen = 0; return blake2s_init(c, key, keylen); } #define DEFINE_BLAKE2_VARIANT(bs, BS, dbits, oid_branch) \ static void blake2##bs##_##dbits##_init(void *ctx, unsigned int flags) \ { \ int err = blake2##bs##_init_ctx (ctx, flags, NULL, 0, dbits); \ gcry_assert (err == 0); \ } \ static void \ _gcry_blake2##bs##_##dbits##_hash_buffers(void *outbuf, size_t nbytes, \ const gcry_buffer_t *iov, int iovcnt) \ { \ BLAKE2##BS##_CONTEXT hd; \ (void)nbytes; \ blake2##bs##_##dbits##_init (&hd, 0); \ for (;iovcnt > 0; iov++, iovcnt--) \ blake2##bs##_write (&hd, (const char*)iov[0].data + iov[0].off, \ iov[0].len); \ blake2##bs##_final (&hd); \ memcpy (outbuf, blake2##bs##_read (&hd), dbits / 8); \ } \ static const byte blake2##bs##_##dbits##_asn[] = { 0x30 }; \ static const gcry_md_oid_spec_t oid_spec_blake2##bs##_##dbits[] = \ { \ { " 1.3.6.1.4.1.1722.12.2." oid_branch }, \ { NULL } \ }; \ gcry_md_spec_t _gcry_digest_spec_blake2##bs##_##dbits = \ { \ GCRY_MD_BLAKE2##BS##_##dbits, {0, 0}, \ "BLAKE2" #BS "_" #dbits, blake2##bs##_##dbits##_asn, \ DIM (blake2##bs##_##dbits##_asn), oid_spec_blake2##bs##_##dbits, \ dbits / 8, blake2##bs##_##dbits##_init, blake2##bs##_write, \ blake2##bs##_final, blake2##bs##_read, NULL, \ _gcry_blake2##bs##_##dbits##_hash_buffers, \ sizeof (BLAKE2##BS##_CONTEXT) \ , \ GRUB_UTIL_MODNAME("gcry_blake2") \ .blocksize = GRUB_BLAKE2 ## BS ## _BLOCK_SIZE \ }; DEFINE_BLAKE2_VARIANT(b, B, 512, "1.16") DEFINE_BLAKE2_VARIANT(b, B, 384, "1.12") DEFINE_BLAKE2_VARIANT(b, B, 256, "1.8") DEFINE_BLAKE2_VARIANT(b, B, 160, "1.5") DEFINE_BLAKE2_VARIANT(s, S, 256, "2.8") DEFINE_BLAKE2_VARIANT(s, S, 224, "2.7") DEFINE_BLAKE2_VARIANT(s, S, 160, "2.5") DEFINE_BLAKE2_VARIANT(s, S, 128, "2.4") GRUB_MOD_INIT(gcry_blake2) { grub_md_register (&_gcry_digest_spec_blake2b_512); grub_md_register (&_gcry_digest_spec_blake2b_384); grub_md_register (&_gcry_digest_spec_blake2b_256); grub_md_register (&_gcry_digest_spec_blake2b_160); grub_md_register (&_gcry_digest_spec_blake2s_256); grub_md_register (&_gcry_digest_spec_blake2s_224); grub_md_register (&_gcry_digest_spec_blake2s_160); grub_md_register (&_gcry_digest_spec_blake2s_128); } GRUB_MOD_FINI(gcry_blake2) { grub_md_unregister (&_gcry_digest_spec_blake2b_512); grub_md_unregister (&_gcry_digest_spec_blake2b_384); grub_md_unregister (&_gcry_digest_spec_blake2b_256); grub_md_unregister (&_gcry_digest_spec_blake2b_160); grub_md_unregister (&_gcry_digest_spec_blake2s_256); grub_md_unregister (&_gcry_digest_spec_blake2s_224); grub_md_unregister (&_gcry_digest_spec_blake2s_160); grub_md_unregister (&_gcry_digest_spec_blake2s_128); } grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/cipher/gostr3411-94.c0000644000175000017500000002254315036452441022716 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ #include GRUB_MOD_LICENSE ("GPLv3+"); /* gostr3411-94.c - GOST R 34.11-94 hash function * Copyright (C) 2012 Free Software Foundation, Inc. * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . */ #include "g10lib.h" #include "bithelp.h" #include "bufhelp.h" #include "cipher.h" #include "hash-common.h" #include "gost.h" #define max(a, b) (((a) > (b)) ? (a) : (b)) typedef struct { gcry_md_block_ctx_t bctx; union { u32 h[8]; byte result[32]; }; u32 sigma[8]; u32 len; int cryptopro; } GOSTR3411_CONTEXT; static unsigned int transform (void *c, const unsigned char *data, size_t nblks); static void gost3411_init (void *context, unsigned int flags) { GOSTR3411_CONTEXT *hd = context; (void)flags; memset (hd->h, 0, 32); memset (hd->sigma, 0, 32); hd->bctx.nblocks = 0; hd->bctx.count = 0; hd->bctx.blocksize_shift = _gcry_ctz(32); hd->bctx.bwrite = transform; hd->cryptopro = 0; } static void gost3411_cp_init (void *context, unsigned int flags) { GOSTR3411_CONTEXT *hd = context; gost3411_init (context, flags); hd->cryptopro = 1; } static void do_p (u32 *p, u32 *u, u32 *v) { int k; u32 t[8]; for (k = 0; k < 8; k++) t[k] = u[k] ^ v[k]; k = 0; p[k+0] = ((t[0] >> (8*k)) & 0xff) << 0 | ((t[2] >> (8*k)) & 0xff) << 8 | ((t[4] >> (8*k)) & 0xff) << 16 | ((t[6] >> (8*k)) & 0xff) << 24; p[k+4] = ((t[1] >> (8*k)) & 0xff) << 0 | ((t[3] >> (8*k)) & 0xff) << 8 | ((t[5] >> (8*k)) & 0xff) << 16 | ((t[7] >> (8*k)) & 0xff) << 24; k = 1; p[k+0] = ((t[0] >> (8*k)) & 0xff) << 0 | ((t[2] >> (8*k)) & 0xff) << 8 | ((t[4] >> (8*k)) & 0xff) << 16 | ((t[6] >> (8*k)) & 0xff) << 24; p[k+4] = ((t[1] >> (8*k)) & 0xff) << 0 | ((t[3] >> (8*k)) & 0xff) << 8 | ((t[5] >> (8*k)) & 0xff) << 16 | ((t[7] >> (8*k)) & 0xff) << 24; k = 2; p[k+0] = ((t[0] >> (8*k)) & 0xff) << 0 | ((t[2] >> (8*k)) & 0xff) << 8 | ((t[4] >> (8*k)) & 0xff) << 16 | ((t[6] >> (8*k)) & 0xff) << 24; p[k+4] = ((t[1] >> (8*k)) & 0xff) << 0 | ((t[3] >> (8*k)) & 0xff) << 8 | ((t[5] >> (8*k)) & 0xff) << 16 | ((t[7] >> (8*k)) & 0xff) << 24; k = 3; p[k+0] = ((t[0] >> (8*k)) & 0xff) << 0 | ((t[2] >> (8*k)) & 0xff) << 8 | ((t[4] >> (8*k)) & 0xff) << 16 | ((t[6] >> (8*k)) & 0xff) << 24; p[k+4] = ((t[1] >> (8*k)) & 0xff) << 0 | ((t[3] >> (8*k)) & 0xff) << 8 | ((t[5] >> (8*k)) & 0xff) << 16 | ((t[7] >> (8*k)) & 0xff) << 24; } static void do_a (u32 *u) { u32 t[2]; int i; memcpy(t, u, 2*4); for (i = 0; i < 6; i++) u[i] = u[i+2]; u[6] = u[0] ^ t[0]; u[7] = u[1] ^ t[1]; } /* apply do_a twice: 1 2 3 4 -> 3 4 1^2 2^3 */ static void do_a2 (u32 *u) { u32 t[4]; int i; memcpy (t, u, 16); memcpy (u, u + 4, 16); for (i = 0; i < 2; i++) { u[4+i] = t[i] ^ t[i + 2]; u[6+i] = u[i] ^ t[i + 2]; } } static void do_apply_c2 (u32 *u) { u[ 0] ^= 0xff00ff00; u[ 1] ^= 0xff00ff00; u[ 2] ^= 0x00ff00ff; u[ 3] ^= 0x00ff00ff; u[ 4] ^= 0x00ffff00; u[ 5] ^= 0xff0000ff; u[ 6] ^= 0x000000ff; u[ 7] ^= 0xff00ffff; } #define do_chi_step12(e) \ e[6] ^= ((e[6] >> 16) ^ e[7] ^ (e[7] >> 16) ^ e[4] ^ (e[5] >>16)) & 0xffff; #define do_chi_step13(e) \ e[6] ^= ((e[7] ^ (e[7] >> 16) ^ e[0] ^ (e[4] >> 16) ^ e[6]) & 0xffff) << 16; #define do_chi_doublestep(e, i) \ e[i] ^= (e[i] >> 16) ^ (e[(i+1)%8] << 16) ^ e[(i+1)%8] ^ (e[(i+1)%8] >> 16) ^ (e[(i+2)%8] << 16) ^ e[(i+6)%8] ^ (e[(i+7)%8] >> 16); \ e[i] ^= (e[i] << 16); static void do_chi_submix12 (u32 *e, u32 *x) { e[6] ^= x[0]; e[7] ^= x[1]; e[0] ^= x[2]; e[1] ^= x[3]; e[2] ^= x[4]; e[3] ^= x[5]; e[4] ^= x[6]; e[5] ^= x[7]; } static void do_chi_submix13 (u32 *e, u32 *x) { e[6] ^= (x[0] << 16) | (x[7] >> 16); e[7] ^= (x[1] << 16) | (x[0] >> 16); e[0] ^= (x[2] << 16) | (x[1] >> 16); e[1] ^= (x[3] << 16) | (x[2] >> 16); e[2] ^= (x[4] << 16) | (x[3] >> 16); e[3] ^= (x[5] << 16) | (x[4] >> 16); e[4] ^= (x[6] << 16) | (x[5] >> 16); e[5] ^= (x[7] << 16) | (x[6] >> 16); } static void do_add (u32 *s, u32 *a) { u32 carry = 0; int i; for (i = 0; i < 8; i++) { u32 op = carry + a[i]; s[i] += op; carry = (a[i] > op) || (op > s[i]); } } static unsigned int do_hash_step (GOSTR3411_CONTEXT *hd, u32 *h, u32 *m) { u32 u[8], v[8]; u32 s[8]; u32 k[8]; unsigned int burn; int i; memcpy (u, h, 32); memcpy (v, m, 32); for (i = 0; i < 4; i++) { do_p (k, u, v); burn = _gcry_gost_enc_data (k, &s[2*i], &s[2*i+1], h[2*i], h[2*i+1], hd->cryptopro); do_a (u); if (i == 1) do_apply_c2 (u); do_a2 (v); } for (i = 0; i < 5; i++) { do_chi_doublestep (s, 0); do_chi_doublestep (s, 1); do_chi_doublestep (s, 2); do_chi_doublestep (s, 3); do_chi_doublestep (s, 4); /* That is in total 12 + 1 + 61 = 74 = 16 * 4 + 10 rounds */ if (i == 4) break; do_chi_doublestep (s, 5); if (i == 0) do_chi_submix12(s, m); do_chi_step12 (s); if (i == 0) do_chi_submix13(s, h); do_chi_step13 (s); do_chi_doublestep (s, 7); } memcpy (h, s+5, 12); memcpy (h+3, s, 20); return /* burn_stack */ 4 * sizeof(void*) /* func call (ret addr + args) */ + 4 * 32 + 2 * sizeof(int) /* stack */ + max(burn /* _gcry_gost_enc_one */, sizeof(void*) * 2 /* do_a2 call */ + 16 + sizeof(int) /* do_a2 stack */ ); } static unsigned int transform_blk (void *ctx, const unsigned char *data) { GOSTR3411_CONTEXT *hd = ctx; u32 m[8]; unsigned int burn; int i; for (i = 0; i < 8; i++) m[i] = buf_get_le32(data + i*4); burn = do_hash_step (hd, hd->h, m); do_add (hd->sigma, m); return /* burn_stack */ burn + 3 * sizeof(void*) + 32 + 2 * sizeof(void*); } static unsigned int transform ( void *c, const unsigned char *data, size_t nblks ) { unsigned int burn; do { burn = transform_blk (c, data); data += 32; } while (--nblks); return burn; } /* The routine finally terminates the computation and returns the digest. The handle is prepared for a new cycle, but adding bytes to the handle will the destroy the returned buffer. Returns: 32 bytes with the message the digest. */ static void gost3411_final (void *context) { GOSTR3411_CONTEXT *hd = context; size_t padlen = 0; u32 l[8]; int i; MD_NBLOCKS_TYPE nblocks; if (hd->bctx.count > 0) { padlen = 32 - hd->bctx.count; memset (hd->bctx.buf + hd->bctx.count, 0, padlen); hd->bctx.count += padlen; _gcry_md_block_write (hd, NULL, 0); /* flush */; } if (hd->bctx.count != 0) return; /* Something went wrong */ memset (l, 0, 32); nblocks = hd->bctx.nblocks; if (padlen) { nblocks --; l[0] = 256 - padlen * 8; } l[0] |= nblocks << 8; nblocks >>= 24; for (i = 1; i < 8 && nblocks != 0; i++) { l[i] = nblocks; nblocks >>= 24; } do_hash_step (hd, hd->h, l); do_hash_step (hd, hd->h, hd->sigma); for (i = 0; i < 8; i++) hd->h[i] = le_bswap32(hd->h[i]); } static byte * gost3411_read (void *context) { GOSTR3411_CONTEXT *hd = context; return hd->result; } static const unsigned char asn[6] = /* Object ID is 1.2.643.2.2.3 */ { 0x2a, 0x85, 0x03, 0x02, 0x02, 0x03 }; static const gcry_md_oid_spec_t oid_spec_gostr3411[] = { /* iso.member-body.ru.rans.cryptopro.3 (gostR3411-94-with-gostR3410-2001) */ { "1.2.643.2.2.3" }, /* iso.member-body.ru.rans.cryptopro.9 (gostR3411-94) */ { "1.2.643.2.2.9" }, {NULL}, }; gcry_md_spec_t _gcry_digest_spec_gost3411_94 = { GCRY_MD_GOSTR3411_94, {0, 0}, "GOSTR3411_94", NULL, 0, NULL, 32, gost3411_init, _gcry_md_block_write, gost3411_final, gost3411_read, NULL, NULL, sizeof (GOSTR3411_CONTEXT) , GRUB_UTIL_MODNAME("gcry_gostr3411_94") .blocksize = 32 }; gcry_md_spec_t _gcry_digest_spec_gost3411_cp = { GCRY_MD_GOSTR3411_CP, {0, 0}, "GOSTR3411_CP", asn, DIM (asn), oid_spec_gostr3411, 32, gost3411_cp_init, _gcry_md_block_write, gost3411_final, gost3411_read, NULL, NULL, sizeof (GOSTR3411_CONTEXT) , GRUB_UTIL_MODNAME("gcry_gostr3411_94") .blocksize = 32 }; GRUB_MOD_INIT(gcry_gostr3411_94) { grub_md_register (&_gcry_digest_spec_gost3411_94); grub_md_register (&_gcry_digest_spec_gost3411_cp); } GRUB_MOD_FINI(gcry_gostr3411_94) { grub_md_unregister (&_gcry_digest_spec_gost3411_94); grub_md_unregister (&_gcry_digest_spec_gost3411_cp); } grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/cipher/gost.h0000644000175000017500000000233615036452441021774 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ /* gost.h - GOST 28147-89 implementation * Copyright (C) 2012 Free Software Foundation, Inc. * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . */ #ifndef _GCRY_GOST_H #define _GCRY_GOST_H typedef struct { u32 key[8]; const u32 *sbox; unsigned int mesh_counter; unsigned int mesh_limit; } GOST28147_context; /* This is a simple interface that will be used by GOST R 34.11-94 */ unsigned int _gcry_gost_enc_data (const u32 *key, u32 *o1, u32 *o2, u32 n1, u32 n2, int cryptopro); #endif grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/cipher/types.h0000644000175000017500000000006115036452441022155 00000000000000#include #include grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/cipher/camellia-glue.c0000644000175000017500000015472715036452441023530 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ #include GRUB_MOD_LICENSE ("GPLv3+"); /* camellia-glue.c - Glue for the Camellia cipher * Copyright (C) 2007 Free Software Foundation, Inc. * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . * SPDX-License-Identifier: LGPL-2.1-or-later */ /* I put all the libgcrypt-specific stuff in this file to keep the camellia.c/camellia.h files exactly as provided by NTT. If they update their code, this should make it easier to bring the changes in. - dshaw There is one small change which needs to be done: Include the following code at the top of camellia.h: */ #if 0 /* To use Camellia with libraries it is often useful to keep the name * space of the library clean. The following macro is thus useful: * * #define CAMELLIA_EXT_SYM_PREFIX foo_ * * This prefixes all external symbols with "foo_". */ #ifdef HAVE_CONFIG_H #endif #ifdef CAMELLIA_EXT_SYM_PREFIX #define CAMELLIA_PREFIX1(x,y) x ## y #define CAMELLIA_PREFIX2(x,y) CAMELLIA_PREFIX1(x,y) #define CAMELLIA_PREFIX(x) CAMELLIA_PREFIX2(CAMELLIA_EXT_SYM_PREFIX,x) #define Camellia_Ekeygen CAMELLIA_PREFIX(Camellia_Ekeygen) #define Camellia_EncryptBlock CAMELLIA_PREFIX(Camellia_EncryptBlock) #define Camellia_DecryptBlock CAMELLIA_PREFIX(Camellia_DecryptBlock) #define camellia_decrypt128 CAMELLIA_PREFIX(camellia_decrypt128) #define camellia_decrypt256 CAMELLIA_PREFIX(camellia_decrypt256) #define camellia_encrypt128 CAMELLIA_PREFIX(camellia_encrypt128) #define camellia_encrypt256 CAMELLIA_PREFIX(camellia_encrypt256) #define camellia_setup128 CAMELLIA_PREFIX(camellia_setup128) #define camellia_setup192 CAMELLIA_PREFIX(camellia_setup192) #define camellia_setup256 CAMELLIA_PREFIX(camellia_setup256) #endif /*CAMELLIA_EXT_SYM_PREFIX*/ #endif /* Code sample. */ #include "types.h" #include "g10lib.h" #include "cipher.h" #include "camellia.h" #include "bufhelp.h" #include "cipher-internal.h" #include "bulkhelp.h" /* Helper macro to force alignment to 16 bytes. */ #ifdef HAVE_GCC_ATTRIBUTE_ALIGNED # define ATTR_ALIGNED_16 __attribute__ ((aligned (16))) #else # define ATTR_ALIGNED_16 #endif /* USE_AESNI inidicates whether to compile with Intel AES-NI/AVX code. */ #undef USE_AESNI_AVX #if defined(ENABLE_AESNI_SUPPORT) && defined(ENABLE_AVX_SUPPORT) # if defined(__x86_64__) && (defined(HAVE_COMPATIBLE_GCC_AMD64_PLATFORM_AS) || \ defined(HAVE_COMPATIBLE_GCC_WIN64_PLATFORM_AS)) # define USE_AESNI_AVX 1 # endif #endif /* USE_AESNI_AVX2 inidicates whether to compile with Intel AES-NI/AVX2 code. */ #undef USE_AESNI_AVX2 #if defined(ENABLE_AESNI_SUPPORT) && defined(ENABLE_AVX2_SUPPORT) # if defined(__x86_64__) && (defined(HAVE_COMPATIBLE_GCC_AMD64_PLATFORM_AS) || \ defined(HAVE_COMPATIBLE_GCC_WIN64_PLATFORM_AS)) # define USE_AESNI_AVX2 1 # endif #endif /* USE_VAES_AVX2 inidicates whether to compile with Intel VAES/AVX2 code. */ #undef USE_VAES_AVX2 #if defined(USE_AESNI_AVX2) && defined(HAVE_GCC_INLINE_ASM_VAES_VPCLMUL) # define USE_VAES_AVX2 1 #endif /* USE_GFNI_AVX2 inidicates whether to compile with Intel GFNI/AVX2 code. */ #undef USE_GFNI_AVX2 #if defined(USE_AESNI_AVX2) && defined(ENABLE_GFNI_SUPPORT) # define USE_GFNI_AVX2 1 #endif /* USE_GFNI_AVX512 inidicates whether to compile with Intel GFNI/AVX512 code. */ #undef USE_GFNI_AVX512 #if defined(USE_GFNI_AVX2) && defined(ENABLE_AVX512_SUPPORT) # define USE_GFNI_AVX512 1 #endif /* USE_PPC_CRYPTO indicates whether to enable PowerPC vector crypto * accelerated code. */ #undef USE_PPC_CRYPTO #if !defined(WORDS_BIGENDIAN) && defined(ENABLE_PPC_CRYPTO_SUPPORT) && \ defined(HAVE_COMPATIBLE_CC_PPC_ALTIVEC) && \ defined(HAVE_GCC_INLINE_ASM_PPC_ALTIVEC) && \ (SIZEOF_UNSIGNED_LONG == 8) && (__GNUC__ >= 4) # define USE_PPC_CRYPTO 1 #endif /* USE_AARCH64_CE indicates whether to enable ARMv8/CE accelerated code. */ #undef USE_AARCH64_CE #if defined(__AARCH64EL__) && \ defined(HAVE_COMPATIBLE_GCC_AARCH64_PLATFORM_AS) && \ defined(HAVE_GCC_INLINE_ASM_AARCH64_CRYPTO) && \ defined(HAVE_COMPATIBLE_CC_AARCH64_NEON_INTRINSICS) && \ (__GNUC__ >= 4) # define USE_AARCH64_CE 1 #endif typedef struct { KEY_TABLE_TYPE keytable; int keybitlength; #ifdef USE_AESNI_AVX unsigned int use_aesni_avx:1; /* AES-NI/AVX implementation shall be used. */ #endif /*USE_AESNI_AVX*/ #ifdef USE_AESNI_AVX2 unsigned int use_avx2:1; /* If any of AVX2 implementation is enabled. */ unsigned int use_aesni_avx2:1;/* AES-NI/AVX2 implementation shall be used. */ unsigned int use_vaes_avx2:1; /* VAES/AVX2 implementation shall be used. */ unsigned int use_gfni_avx2:1; /* GFNI/AVX2 implementation shall be used. */ unsigned int use_gfni_avx512:1; /* GFNI/AVX512 implementation shall be used. */ #endif /*USE_AESNI_AVX2*/ #ifdef USE_PPC_CRYPTO unsigned int use_ppc:1; unsigned int use_ppc8:1; unsigned int use_ppc9:1; #endif /*USE_PPC_CRYPTO*/ #ifdef USE_AARCH64_CE unsigned int use_aarch64ce:1; #endif /*USE_AARCH64_CE*/ } CAMELLIA_context; /* Assembly implementations use SystemV ABI, ABI conversion and additional * stack to store XMM6-XMM15 needed on Win64. */ #undef ASM_FUNC_ABI #undef ASM_EXTRA_STACK #if defined(USE_AESNI_AVX) || defined(USE_AESNI_AVX2) # ifdef HAVE_COMPATIBLE_GCC_WIN64_PLATFORM_AS # define ASM_FUNC_ABI __attribute__((sysv_abi)) # define ASM_EXTRA_STACK (10 * 16) # else # define ASM_FUNC_ABI # define ASM_EXTRA_STACK 0 # endif #endif #ifdef USE_AESNI_AVX /* Assembler implementations of Camellia using AES-NI and AVX. Process data in 16 blocks same time. */ extern void _gcry_camellia_aesni_avx_ctr_enc(CAMELLIA_context *ctx, unsigned char *out, const unsigned char *in, unsigned char *ctr) ASM_FUNC_ABI; extern void _gcry_camellia_aesni_avx_cbc_dec(CAMELLIA_context *ctx, unsigned char *out, const unsigned char *in, unsigned char *iv) ASM_FUNC_ABI; extern void _gcry_camellia_aesni_avx_cfb_dec(CAMELLIA_context *ctx, unsigned char *out, const unsigned char *in, unsigned char *iv) ASM_FUNC_ABI; extern void _gcry_camellia_aesni_avx_ocb_enc(CAMELLIA_context *ctx, unsigned char *out, const unsigned char *in, unsigned char *offset, unsigned char *checksum, const u64 Ls[16]) ASM_FUNC_ABI; extern void _gcry_camellia_aesni_avx_ocb_dec(CAMELLIA_context *ctx, unsigned char *out, const unsigned char *in, unsigned char *offset, unsigned char *checksum, const u64 Ls[16]) ASM_FUNC_ABI; extern void _gcry_camellia_aesni_avx_ocb_auth(CAMELLIA_context *ctx, const unsigned char *abuf, unsigned char *offset, unsigned char *checksum, const u64 Ls[16]) ASM_FUNC_ABI; extern void _gcry_camellia_aesni_avx_keygen(CAMELLIA_context *ctx, const unsigned char *key, unsigned int keylen) ASM_FUNC_ABI; extern void _gcry_camellia_aesni_avx_ecb_enc(const CAMELLIA_context *ctx, unsigned char *out, const unsigned char *in) ASM_FUNC_ABI; extern void _gcry_camellia_aesni_avx_ecb_dec(const CAMELLIA_context *ctx, unsigned char *out, const unsigned char *in) ASM_FUNC_ABI; static const int avx_burn_stack_depth = 16 * CAMELLIA_BLOCK_SIZE + 16 + 2 * sizeof(void *) + ASM_EXTRA_STACK; #endif #ifdef USE_AESNI_AVX2 /* Assembler implementations of Camellia using AES-NI and AVX2. Process data in 32 blocks same time. */ extern void _gcry_camellia_aesni_avx2_ctr_enc(CAMELLIA_context *ctx, unsigned char *out, const unsigned char *in, unsigned char *ctr) ASM_FUNC_ABI; extern void _gcry_camellia_aesni_avx2_cbc_dec(CAMELLIA_context *ctx, unsigned char *out, const unsigned char *in, unsigned char *iv) ASM_FUNC_ABI; extern void _gcry_camellia_aesni_avx2_cfb_dec(CAMELLIA_context *ctx, unsigned char *out, const unsigned char *in, unsigned char *iv) ASM_FUNC_ABI; extern void _gcry_camellia_aesni_avx2_ocb_enc(CAMELLIA_context *ctx, unsigned char *out, const unsigned char *in, unsigned char *offset, unsigned char *checksum, const u64 Ls[32]) ASM_FUNC_ABI; extern void _gcry_camellia_aesni_avx2_ocb_dec(CAMELLIA_context *ctx, unsigned char *out, const unsigned char *in, unsigned char *offset, unsigned char *checksum, const u64 Ls[32]) ASM_FUNC_ABI; extern void _gcry_camellia_aesni_avx2_ocb_auth(CAMELLIA_context *ctx, const unsigned char *abuf, unsigned char *offset, unsigned char *checksum, const u64 Ls[32]) ASM_FUNC_ABI; extern void _gcry_camellia_aesni_avx2_enc_blk1_32(const CAMELLIA_context *ctx, unsigned char *out, const unsigned char *in, unsigned int nblocks) ASM_FUNC_ABI; extern void _gcry_camellia_aesni_avx2_dec_blk1_32(const CAMELLIA_context *ctx, unsigned char *out, const unsigned char *in, unsigned int nblocks) ASM_FUNC_ABI; static const int avx2_burn_stack_depth = 32 * CAMELLIA_BLOCK_SIZE + 16 + 2 * sizeof(void *) + ASM_EXTRA_STACK; #endif #ifdef USE_VAES_AVX2 /* Assembler implementations of Camellia using VAES and AVX2. Process data in 32 blocks same time. */ extern void _gcry_camellia_vaes_avx2_ctr_enc(CAMELLIA_context *ctx, unsigned char *out, const unsigned char *in, unsigned char *ctr) ASM_FUNC_ABI; extern void _gcry_camellia_vaes_avx2_cbc_dec(CAMELLIA_context *ctx, unsigned char *out, const unsigned char *in, unsigned char *iv) ASM_FUNC_ABI; extern void _gcry_camellia_vaes_avx2_cfb_dec(CAMELLIA_context *ctx, unsigned char *out, const unsigned char *in, unsigned char *iv) ASM_FUNC_ABI; extern void _gcry_camellia_vaes_avx2_ocb_enc(CAMELLIA_context *ctx, unsigned char *out, const unsigned char *in, unsigned char *offset, unsigned char *checksum, const u64 Ls[32]) ASM_FUNC_ABI; extern void _gcry_camellia_vaes_avx2_ocb_dec(CAMELLIA_context *ctx, unsigned char *out, const unsigned char *in, unsigned char *offset, unsigned char *checksum, const u64 Ls[32]) ASM_FUNC_ABI; extern void _gcry_camellia_vaes_avx2_ocb_auth(CAMELLIA_context *ctx, const unsigned char *abuf, unsigned char *offset, unsigned char *checksum, const u64 Ls[32]) ASM_FUNC_ABI; extern void _gcry_camellia_vaes_avx2_enc_blk1_32(const CAMELLIA_context *ctx, unsigned char *out, const unsigned char *in, unsigned int nblocks) ASM_FUNC_ABI; extern void _gcry_camellia_vaes_avx2_dec_blk1_32(const CAMELLIA_context *ctx, unsigned char *out, const unsigned char *in, unsigned int nblocks) ASM_FUNC_ABI; #endif #ifdef USE_GFNI_AVX2 /* Assembler implementations of Camellia using GFNI and AVX2. Process data in 32 blocks same time. */ extern void _gcry_camellia_gfni_avx2_ctr_enc(CAMELLIA_context *ctx, unsigned char *out, const unsigned char *in, unsigned char *ctr) ASM_FUNC_ABI; extern void _gcry_camellia_gfni_avx2_cbc_dec(CAMELLIA_context *ctx, unsigned char *out, const unsigned char *in, unsigned char *iv) ASM_FUNC_ABI; extern void _gcry_camellia_gfni_avx2_cfb_dec(CAMELLIA_context *ctx, unsigned char *out, const unsigned char *in, unsigned char *iv) ASM_FUNC_ABI; extern void _gcry_camellia_gfni_avx2_ocb_enc(CAMELLIA_context *ctx, unsigned char *out, const unsigned char *in, unsigned char *offset, unsigned char *checksum, const u64 Ls[32]) ASM_FUNC_ABI; extern void _gcry_camellia_gfni_avx2_ocb_dec(CAMELLIA_context *ctx, unsigned char *out, const unsigned char *in, unsigned char *offset, unsigned char *checksum, const u64 Ls[32]) ASM_FUNC_ABI; extern void _gcry_camellia_gfni_avx2_ocb_auth(CAMELLIA_context *ctx, const unsigned char *abuf, unsigned char *offset, unsigned char *checksum, const u64 Ls[32]) ASM_FUNC_ABI; extern void _gcry_camellia_gfni_avx2_enc_blk1_32(const CAMELLIA_context *ctx, unsigned char *out, const unsigned char *in, unsigned int nblocks) ASM_FUNC_ABI; extern void _gcry_camellia_gfni_avx2_dec_blk1_32(const CAMELLIA_context *ctx, unsigned char *out, const unsigned char *in, unsigned int nblocks) ASM_FUNC_ABI; #endif #ifdef USE_GFNI_AVX512 /* Assembler implementations of Camellia using GFNI and AVX512. Process data in 64 blocks same time. */ extern void _gcry_camellia_gfni_avx512_ctr_enc(CAMELLIA_context *ctx, unsigned char *out, const unsigned char *in, unsigned char *ctr) ASM_FUNC_ABI; extern void _gcry_camellia_gfni_avx512_cbc_dec(CAMELLIA_context *ctx, unsigned char *out, const unsigned char *in, unsigned char *iv) ASM_FUNC_ABI; extern void _gcry_camellia_gfni_avx512_cfb_dec(CAMELLIA_context *ctx, unsigned char *out, const unsigned char *in, unsigned char *iv) ASM_FUNC_ABI; extern void _gcry_camellia_gfni_avx512_ocb_enc(CAMELLIA_context *ctx, unsigned char *out, const unsigned char *in, unsigned char *offset, unsigned char *checksum, const u64 Ls[32]) ASM_FUNC_ABI; extern void _gcry_camellia_gfni_avx512_ocb_dec(CAMELLIA_context *ctx, unsigned char *out, const unsigned char *in, unsigned char *offset, unsigned char *checksum, const u64 Ls[32]) ASM_FUNC_ABI; extern void _gcry_camellia_gfni_avx512_enc_blk64(const CAMELLIA_context *ctx, unsigned char *out, const unsigned char *in) ASM_FUNC_ABI; extern void _gcry_camellia_gfni_avx512_dec_blk64(const CAMELLIA_context *ctx, unsigned char *out, const unsigned char *in) ASM_FUNC_ABI; /* Stack not used by AVX512 implementation. */ static const int avx512_burn_stack_depth = 0; #endif #ifdef USE_PPC_CRYPTO extern void _gcry_camellia_ppc8_encrypt_blk16(const void *key_table, void *out, const void *in, int key_length); extern void _gcry_camellia_ppc8_decrypt_blk16(const void *key_table, void *out, const void *in, int key_length); extern void _gcry_camellia_ppc9_encrypt_blk16(const void *key_table, void *out, const void *in, int key_length); extern void _gcry_camellia_ppc9_decrypt_blk16(const void *key_table, void *out, const void *in, int key_length); extern void _gcry_camellia_ppc8_keygen(void *key_table, const void *vkey, unsigned int keylen); extern void _gcry_camellia_ppc9_keygen(void *key_table, const void *vkey, unsigned int keylen); void camellia_ppc_enc_blk16(const CAMELLIA_context *ctx, unsigned char *out, const unsigned char *in) { if (ctx->use_ppc9) _gcry_camellia_ppc9_encrypt_blk16 (ctx->keytable, out, in, ctx->keybitlength / 8); else _gcry_camellia_ppc8_encrypt_blk16 (ctx->keytable, out, in, ctx->keybitlength / 8); } void camellia_ppc_dec_blk16(const CAMELLIA_context *ctx, unsigned char *out, const unsigned char *in) { if (ctx->use_ppc9) _gcry_camellia_ppc9_decrypt_blk16 (ctx->keytable, out, in, ctx->keybitlength / 8); else _gcry_camellia_ppc8_decrypt_blk16 (ctx->keytable, out, in, ctx->keybitlength / 8); } static const int ppc_burn_stack_depth = 16 * CAMELLIA_BLOCK_SIZE + 16 + 2 * sizeof(void *); #endif /*USE_PPC_CRYPTO*/ #ifdef USE_AARCH64_CE extern void _gcry_camellia_aarch64ce_encrypt_blk16(const void *key_table, void *out, const void *in, int key_length); extern void _gcry_camellia_aarch64ce_decrypt_blk16(const void *key_table, void *out, const void *in, int key_length); extern void _gcry_camellia_aarch64ce_keygen(void *key_table, const void *vkey, unsigned int keylen); void camellia_aarch64ce_enc_blk16(const CAMELLIA_context *ctx, unsigned char *out, const unsigned char *in) { _gcry_camellia_aarch64ce_encrypt_blk16 (ctx->keytable, out, in, ctx->keybitlength / 8); } void camellia_aarch64ce_dec_blk16(const CAMELLIA_context *ctx, unsigned char *out, const unsigned char *in) { _gcry_camellia_aarch64ce_decrypt_blk16 (ctx->keytable, out, in, ctx->keybitlength / 8); } static const int aarch64ce_burn_stack_depth = 16 * CAMELLIA_BLOCK_SIZE + 16 + 2 * sizeof(void *); #endif /*USE_AARCH64_CE*/ static void _gcry_camellia_ctr_enc (void *context, unsigned char *ctr, void *outbuf_arg, const void *inbuf_arg, size_t nblocks); static void _gcry_camellia_cbc_dec (void *context, unsigned char *iv, void *outbuf_arg, const void *inbuf_arg, size_t nblocks); static void _gcry_camellia_cfb_dec (void *context, unsigned char *iv, void *outbuf_arg, const void *inbuf_arg, size_t nblocks); static void _gcry_camellia_xts_crypt (void *context, unsigned char *tweak, void *outbuf_arg, const void *inbuf_arg, size_t nblocks, int encrypt); static void _gcry_camellia_ecb_crypt (void *context, void *outbuf_arg, const void *inbuf_arg, size_t nblocks, int encrypt); static void _gcry_camellia_ctr32le_enc (void *context, unsigned char *ctr, void *outbuf_arg, const void *inbuf_arg, size_t nblocks); static size_t _gcry_camellia_ocb_crypt (gcry_cipher_hd_t c, void *outbuf_arg, const void *inbuf_arg, size_t nblocks, int encrypt); static size_t _gcry_camellia_ocb_auth (gcry_cipher_hd_t c, const void *abuf_arg, size_t nblocks); static gcry_err_code_t camellia_setkey(void *c, const byte *key, unsigned keylen, cipher_bulk_ops_t *bulk_ops) { CAMELLIA_context *ctx=c; static int initialized=0; static const char *selftest_failed=NULL; unsigned int hwf = _gcry_get_hw_features (); (void)hwf; if(keylen!=16 && keylen!=24 && keylen!=32) return GPG_ERR_INV_KEYLEN; if(!initialized) { initialized=1; selftest_failed=selftest(); if(selftest_failed) log_error("%s\n",selftest_failed); } if(selftest_failed) return GPG_ERR_SELFTEST_FAILED; #ifdef USE_AESNI_AVX ctx->use_aesni_avx = (hwf & HWF_INTEL_AESNI) && (hwf & HWF_INTEL_AVX); #endif #ifdef USE_AESNI_AVX2 ctx->use_aesni_avx2 = (hwf & HWF_INTEL_AESNI) && (hwf & HWF_INTEL_AVX2); ctx->use_vaes_avx2 = 0; ctx->use_gfni_avx2 = 0; ctx->use_gfni_avx512 = 0; ctx->use_avx2 = ctx->use_aesni_avx2; #endif #ifdef USE_VAES_AVX2 ctx->use_vaes_avx2 = (hwf & HWF_INTEL_VAES_VPCLMUL) && (hwf & HWF_INTEL_AVX2); ctx->use_avx2 |= ctx->use_vaes_avx2; #endif #ifdef USE_GFNI_AVX2 ctx->use_gfni_avx2 = (hwf & HWF_INTEL_GFNI) && (hwf & HWF_INTEL_AVX2); ctx->use_avx2 |= ctx->use_gfni_avx2; #endif #ifdef USE_GFNI_AVX512 ctx->use_gfni_avx512 = (hwf & HWF_INTEL_GFNI) && (hwf & HWF_INTEL_AVX512); #endif #ifdef USE_PPC_CRYPTO ctx->use_ppc8 = (hwf & HWF_PPC_VCRYPTO) != 0; ctx->use_ppc9 = (hwf & HWF_PPC_VCRYPTO) && (hwf & HWF_PPC_ARCH_3_00); ctx->use_ppc = ctx->use_ppc8 || ctx->use_ppc9; #endif #ifdef USE_AARCH64_CE ctx->use_aarch64ce = (hwf & HWF_ARM_AES) != 0; #endif ctx->keybitlength=keylen*8; /* Setup bulk encryption routines. */ memset (bulk_ops, 0, sizeof(*bulk_ops)); bulk_ops->cbc_dec = _gcry_camellia_cbc_dec; bulk_ops->cfb_dec = _gcry_camellia_cfb_dec; bulk_ops->ctr_enc = _gcry_camellia_ctr_enc; bulk_ops->ocb_crypt = _gcry_camellia_ocb_crypt; bulk_ops->ocb_auth = _gcry_camellia_ocb_auth; bulk_ops->xts_crypt = _gcry_camellia_xts_crypt; bulk_ops->ecb_crypt = _gcry_camellia_ecb_crypt; bulk_ops->ctr32le_enc = _gcry_camellia_ctr32le_enc; if (0) { } #ifdef USE_AESNI_AVX else if (ctx->use_aesni_avx) _gcry_camellia_aesni_avx_keygen(ctx, key, keylen); #endif #ifdef USE_PPC_CRYPTO else if (ctx->use_ppc9) _gcry_camellia_ppc9_keygen(ctx->keytable, key, keylen); else if (ctx->use_ppc8) _gcry_camellia_ppc8_keygen(ctx->keytable, key, keylen); #endif #ifdef USE_AARCH64_CE else if (ctx->use_aarch64ce) _gcry_camellia_aarch64ce_keygen(ctx->keytable, key, keylen); #endif else { Camellia_Ekeygen(ctx->keybitlength,key,ctx->keytable); _gcry_burn_stack ((19+34+34)*sizeof(u32)+2*sizeof(void*) /* camellia_setup256 */ +(4+32)*sizeof(u32)+2*sizeof(void*) /* camellia_setup192 */ +0+sizeof(int)+2*sizeof(void*) /* Camellia_Ekeygen */ +3*2*sizeof(void*) /* Function calls. */ ); } #ifdef USE_GFNI_AVX2 if (ctx->use_gfni_avx2) { /* Disable AESNI & VAES implementations when GFNI implementation is * enabled. */ #ifdef USE_AESNI_AVX ctx->use_aesni_avx = 0; #endif #ifdef USE_AESNI_AVX2 ctx->use_aesni_avx2 = 0; #endif #ifdef USE_VAES_AVX2 ctx->use_vaes_avx2 = 0; #endif } #endif return 0; } #ifdef USE_ARM_ASM /* Assembly implementations of Camellia. */ extern void _gcry_camellia_arm_encrypt_block(const KEY_TABLE_TYPE keyTable, byte *outbuf, const byte *inbuf, const int keybits); extern void _gcry_camellia_arm_decrypt_block(const KEY_TABLE_TYPE keyTable, byte *outbuf, const byte *inbuf, const int keybits); static void Camellia_EncryptBlock(const int keyBitLength, const unsigned char *plaintext, const KEY_TABLE_TYPE keyTable, unsigned char *cipherText) { _gcry_camellia_arm_encrypt_block(keyTable, cipherText, plaintext, keyBitLength); } static void Camellia_DecryptBlock(const int keyBitLength, const unsigned char *cipherText, const KEY_TABLE_TYPE keyTable, unsigned char *plaintext) { _gcry_camellia_arm_decrypt_block(keyTable, plaintext, cipherText, keyBitLength); } #ifdef __aarch64__ # define CAMELLIA_encrypt_stack_burn_size (0) # define CAMELLIA_decrypt_stack_burn_size (0) #else # define CAMELLIA_encrypt_stack_burn_size (15*4) # define CAMELLIA_decrypt_stack_burn_size (15*4) #endif static unsigned int camellia_encrypt(void *c, byte *outbuf, const byte *inbuf) { CAMELLIA_context *ctx = c; Camellia_EncryptBlock(ctx->keybitlength,inbuf,ctx->keytable,outbuf); return /*burn_stack*/ (CAMELLIA_encrypt_stack_burn_size); } static unsigned int camellia_decrypt(void *c, byte *outbuf, const byte *inbuf) { CAMELLIA_context *ctx=c; Camellia_DecryptBlock(ctx->keybitlength,inbuf,ctx->keytable,outbuf); return /*burn_stack*/ (CAMELLIA_decrypt_stack_burn_size); } #else /*USE_ARM_ASM*/ static unsigned int camellia_encrypt(void *c, byte *outbuf, const byte *inbuf) { CAMELLIA_context *ctx=c; Camellia_EncryptBlock(ctx->keybitlength,inbuf,ctx->keytable,outbuf); #define CAMELLIA_encrypt_stack_burn_size \ (sizeof(int)+2*sizeof(unsigned char *)+sizeof(void*/*KEY_TABLE_TYPE*/) \ +4*sizeof(u32)+4*sizeof(u32) \ +2*sizeof(u32*)+4*sizeof(u32) \ +2*2*sizeof(void*) /* Function calls. */ \ ) return /*burn_stack*/ (CAMELLIA_encrypt_stack_burn_size); } static unsigned int camellia_decrypt(void *c, byte *outbuf, const byte *inbuf) { CAMELLIA_context *ctx=c; Camellia_DecryptBlock(ctx->keybitlength,inbuf,ctx->keytable,outbuf); #define CAMELLIA_decrypt_stack_burn_size \ (sizeof(int)+2*sizeof(unsigned char *)+sizeof(void*/*KEY_TABLE_TYPE*/) \ +4*sizeof(u32)+4*sizeof(u32) \ +2*sizeof(u32*)+4*sizeof(u32) \ +2*2*sizeof(void*) /* Function calls. */ \ ) return /*burn_stack*/ (CAMELLIA_decrypt_stack_burn_size); } #endif /*!USE_ARM_ASM*/ static unsigned int camellia_encrypt_blk1_32 (void *priv, byte *outbuf, const byte *inbuf, size_t num_blks) { const CAMELLIA_context *ctx = priv; unsigned int stack_burn_size = 0; gcry_assert (num_blks <= 32); #ifdef USE_GFNI_AVX2 if (ctx->use_gfni_avx2 && num_blks >= 2) { /* 2 or more parallel block GFNI processing is faster than * generic C implementation. */ _gcry_camellia_gfni_avx2_enc_blk1_32 (ctx, outbuf, inbuf, num_blks); return avx2_burn_stack_depth; } #endif #ifdef USE_VAES_AVX2 if (ctx->use_vaes_avx2 && num_blks >= 4) { /* 4 or more parallel block VAES processing is faster than * generic C implementation. */ _gcry_camellia_vaes_avx2_enc_blk1_32 (ctx, outbuf, inbuf, num_blks); return avx2_burn_stack_depth; } #endif #ifdef USE_AESNI_AVX2 if (ctx->use_aesni_avx2 && num_blks >= 5) { /* 5 or more parallel block AESNI processing is faster than * generic C implementation. */ _gcry_camellia_aesni_avx2_enc_blk1_32 (ctx, outbuf, inbuf, num_blks); return avx2_burn_stack_depth; } #endif #ifdef USE_AESNI_AVX while (ctx->use_aesni_avx && num_blks >= 16) { _gcry_camellia_aesni_avx_ecb_enc (ctx, outbuf, inbuf); stack_burn_size = avx_burn_stack_depth; outbuf += CAMELLIA_BLOCK_SIZE * 16; inbuf += CAMELLIA_BLOCK_SIZE * 16; num_blks -= 16; } #endif #ifdef USE_PPC_CRYPTO while (ctx->use_ppc && num_blks >= 16) { camellia_ppc_enc_blk16 (ctx, outbuf, inbuf); stack_burn_size = ppc_burn_stack_depth; outbuf += CAMELLIA_BLOCK_SIZE * 16; inbuf += CAMELLIA_BLOCK_SIZE * 16; num_blks -= 16; } #endif #ifdef USE_AARCH64_CE while (ctx->use_aarch64ce && num_blks >= 16) { camellia_aarch64ce_enc_blk16 (ctx, outbuf, inbuf); stack_burn_size = aarch64ce_burn_stack_depth; outbuf += CAMELLIA_BLOCK_SIZE * 16; inbuf += CAMELLIA_BLOCK_SIZE * 16; num_blks -= 16; } #endif while (num_blks) { unsigned int nburn = camellia_encrypt((void *)ctx, outbuf, inbuf); stack_burn_size = nburn > stack_burn_size ? nburn : stack_burn_size; outbuf += CAMELLIA_BLOCK_SIZE; inbuf += CAMELLIA_BLOCK_SIZE; num_blks--; } return stack_burn_size; } static unsigned int camellia_encrypt_blk1_64 (void *priv, byte *outbuf, const byte *inbuf, size_t num_blks) { CAMELLIA_context *ctx = priv; unsigned int stack_burn_size = 0; unsigned int nburn; gcry_assert (num_blks <= 64); #ifdef USE_GFNI_AVX512 if (num_blks == 64 && ctx->use_gfni_avx512) { _gcry_camellia_gfni_avx512_enc_blk64 (ctx, outbuf, inbuf); return avx512_burn_stack_depth; } #endif do { unsigned int curr_blks = num_blks > 32 ? 32 : num_blks; nburn = camellia_encrypt_blk1_32 (ctx, outbuf, inbuf, curr_blks); stack_burn_size = nburn > stack_burn_size ? nburn : stack_burn_size; outbuf += curr_blks * 16; inbuf += curr_blks * 16; num_blks -= curr_blks; } while (num_blks > 0); return stack_burn_size; } static unsigned int camellia_decrypt_blk1_32 (void *priv, byte *outbuf, const byte *inbuf, size_t num_blks) { const CAMELLIA_context *ctx = priv; unsigned int stack_burn_size = 0; gcry_assert (num_blks <= 32); #ifdef USE_GFNI_AVX2 if (ctx->use_gfni_avx2 && num_blks >= 2) { /* 2 or more parallel block GFNI processing is faster than * generic C implementation. */ _gcry_camellia_gfni_avx2_dec_blk1_32 (ctx, outbuf, inbuf, num_blks); return avx2_burn_stack_depth; } #endif #ifdef USE_VAES_AVX2 if (ctx->use_vaes_avx2 && num_blks >= 4) { /* 4 or more parallel block VAES processing is faster than * generic C implementation. */ _gcry_camellia_vaes_avx2_dec_blk1_32 (ctx, outbuf, inbuf, num_blks); return avx2_burn_stack_depth; } #endif #ifdef USE_AESNI_AVX2 if (ctx->use_aesni_avx2 && num_blks >= 5) { /* 5 or more parallel block AESNI processing is faster than * generic C implementation. */ _gcry_camellia_aesni_avx2_dec_blk1_32 (ctx, outbuf, inbuf, num_blks); return avx2_burn_stack_depth; } #endif #ifdef USE_AESNI_AVX while (ctx->use_aesni_avx && num_blks >= 16) { _gcry_camellia_aesni_avx_ecb_dec (ctx, outbuf, inbuf); stack_burn_size = avx_burn_stack_depth; outbuf += CAMELLIA_BLOCK_SIZE * 16; inbuf += CAMELLIA_BLOCK_SIZE * 16; num_blks -= 16; } #endif #ifdef USE_PPC_CRYPTO while (ctx->use_ppc && num_blks >= 16) { camellia_ppc_dec_blk16 (ctx, outbuf, inbuf); stack_burn_size = ppc_burn_stack_depth; outbuf += CAMELLIA_BLOCK_SIZE * 16; inbuf += CAMELLIA_BLOCK_SIZE * 16; num_blks -= 16; } #endif #ifdef USE_AARCH64_CE while (ctx->use_aarch64ce && num_blks >= 16) { camellia_aarch64ce_dec_blk16 (ctx, outbuf, inbuf); stack_burn_size = aarch64ce_burn_stack_depth; outbuf += CAMELLIA_BLOCK_SIZE * 16; inbuf += CAMELLIA_BLOCK_SIZE * 16; num_blks -= 16; } #endif while (num_blks) { unsigned int nburn = camellia_decrypt((void *)ctx, outbuf, inbuf); stack_burn_size = nburn > stack_burn_size ? nburn : stack_burn_size; outbuf += CAMELLIA_BLOCK_SIZE; inbuf += CAMELLIA_BLOCK_SIZE; num_blks--; } return stack_burn_size; } static unsigned int camellia_decrypt_blk1_64 (void *priv, byte *outbuf, const byte *inbuf, size_t num_blks) { CAMELLIA_context *ctx = priv; unsigned int stack_burn_size = 0; unsigned int nburn; gcry_assert (num_blks <= 64); #ifdef USE_GFNI_AVX512 if (num_blks == 64 && ctx->use_gfni_avx512) { _gcry_camellia_gfni_avx512_dec_blk64 (ctx, outbuf, inbuf); return avx512_burn_stack_depth; } #endif do { unsigned int curr_blks = num_blks > 32 ? 32 : num_blks; nburn = camellia_decrypt_blk1_32 (ctx, outbuf, inbuf, curr_blks); stack_burn_size = nburn > stack_burn_size ? nburn : stack_burn_size; outbuf += curr_blks * 16; inbuf += curr_blks * 16; num_blks -= curr_blks; } while (num_blks > 0); return stack_burn_size; } /* Bulk encryption of complete blocks in CTR mode. This function is only intended for the bulk encryption feature of cipher.c. CTR is expected to be of size CAMELLIA_BLOCK_SIZE. */ static void _gcry_camellia_ctr_enc(void *context, unsigned char *ctr, void *outbuf_arg, const void *inbuf_arg, size_t nblocks) { CAMELLIA_context *ctx = context; unsigned char *outbuf = outbuf_arg; const unsigned char *inbuf = inbuf_arg; int burn_stack_depth = 0; #ifdef USE_GFNI_AVX512 if (ctx->use_gfni_avx512) { int did_use_gfni_avx512 = 0; /* Process data in 64 block chunks. */ while (nblocks >= 64) { _gcry_camellia_gfni_avx512_ctr_enc (ctx, outbuf, inbuf, ctr); nblocks -= 64; outbuf += 64 * CAMELLIA_BLOCK_SIZE; inbuf += 64 * CAMELLIA_BLOCK_SIZE; did_use_gfni_avx512 = 1; } if (did_use_gfni_avx512) { if (burn_stack_depth < avx512_burn_stack_depth) burn_stack_depth = avx512_burn_stack_depth; } /* Use generic code to handle smaller chunks... */ } #endif #ifdef USE_AESNI_AVX2 if (ctx->use_avx2) { int did_use_aesni_avx2 = 0; typeof (&_gcry_camellia_aesni_avx2_ctr_enc) bulk_ctr_fn = _gcry_camellia_aesni_avx2_ctr_enc; #ifdef USE_VAES_AVX2 if (ctx->use_vaes_avx2) bulk_ctr_fn =_gcry_camellia_vaes_avx2_ctr_enc; #endif #ifdef USE_GFNI_AVX2 if (ctx->use_gfni_avx2) bulk_ctr_fn =_gcry_camellia_gfni_avx2_ctr_enc; #endif /* Process data in 32 block chunks. */ while (nblocks >= 32) { bulk_ctr_fn (ctx, outbuf, inbuf, ctr); nblocks -= 32; outbuf += 32 * CAMELLIA_BLOCK_SIZE; inbuf += 32 * CAMELLIA_BLOCK_SIZE; did_use_aesni_avx2 = 1; } if (did_use_aesni_avx2) { if (burn_stack_depth < avx2_burn_stack_depth) burn_stack_depth = avx2_burn_stack_depth; } /* Use generic code to handle smaller chunks... */ } #endif #ifdef USE_AESNI_AVX if (ctx->use_aesni_avx) { int did_use_aesni_avx = 0; /* Process data in 16 block chunks. */ while (nblocks >= 16) { _gcry_camellia_aesni_avx_ctr_enc(ctx, outbuf, inbuf, ctr); nblocks -= 16; outbuf += 16 * CAMELLIA_BLOCK_SIZE; inbuf += 16 * CAMELLIA_BLOCK_SIZE; did_use_aesni_avx = 1; } if (did_use_aesni_avx) { if (burn_stack_depth < avx_burn_stack_depth) burn_stack_depth = avx_burn_stack_depth; } /* Use generic code to handle smaller chunks... */ } #endif /* Process remaining blocks. */ if (nblocks) { byte tmpbuf[CAMELLIA_BLOCK_SIZE * 32]; unsigned int tmp_used = CAMELLIA_BLOCK_SIZE; size_t nburn; nburn = bulk_ctr_enc_128(ctx, camellia_encrypt_blk1_32, outbuf, inbuf, nblocks, ctr, tmpbuf, sizeof(tmpbuf) / CAMELLIA_BLOCK_SIZE, &tmp_used); burn_stack_depth = nburn > burn_stack_depth ? nburn : burn_stack_depth; wipememory(tmpbuf, tmp_used); } if (burn_stack_depth) _gcry_burn_stack(burn_stack_depth); } /* Bulk decryption of complete blocks in CBC mode. This function is only intended for the bulk encryption feature of cipher.c. */ static void _gcry_camellia_cbc_dec(void *context, unsigned char *iv, void *outbuf_arg, const void *inbuf_arg, size_t nblocks) { CAMELLIA_context *ctx = context; unsigned char *outbuf = outbuf_arg; const unsigned char *inbuf = inbuf_arg; int burn_stack_depth = 0; #ifdef USE_GFNI_AVX512 if (ctx->use_gfni_avx512) { int did_use_gfni_avx512 = 0; /* Process data in 64 block chunks. */ while (nblocks >= 64) { _gcry_camellia_gfni_avx512_cbc_dec (ctx, outbuf, inbuf, iv); nblocks -= 64; outbuf += 64 * CAMELLIA_BLOCK_SIZE; inbuf += 64 * CAMELLIA_BLOCK_SIZE; did_use_gfni_avx512 = 1; } if (did_use_gfni_avx512) { if (burn_stack_depth < avx512_burn_stack_depth) burn_stack_depth = avx512_burn_stack_depth; } /* Use generic code to handle smaller chunks... */ } #endif #ifdef USE_AESNI_AVX2 if (ctx->use_avx2) { int did_use_aesni_avx2 = 0; typeof (&_gcry_camellia_aesni_avx2_cbc_dec) bulk_cbc_fn = _gcry_camellia_aesni_avx2_cbc_dec; #ifdef USE_VAES_AVX2 if (ctx->use_vaes_avx2) bulk_cbc_fn =_gcry_camellia_vaes_avx2_cbc_dec; #endif #ifdef USE_GFNI_AVX2 if (ctx->use_gfni_avx2) bulk_cbc_fn =_gcry_camellia_gfni_avx2_cbc_dec; #endif /* Process data in 32 block chunks. */ while (nblocks >= 32) { bulk_cbc_fn (ctx, outbuf, inbuf, iv); nblocks -= 32; outbuf += 32 * CAMELLIA_BLOCK_SIZE; inbuf += 32 * CAMELLIA_BLOCK_SIZE; did_use_aesni_avx2 = 1; } if (did_use_aesni_avx2) { if (burn_stack_depth < avx2_burn_stack_depth) burn_stack_depth = avx2_burn_stack_depth; } /* Use generic code to handle smaller chunks... */ } #endif #ifdef USE_AESNI_AVX if (ctx->use_aesni_avx) { int did_use_aesni_avx = 0; /* Process data in 16 block chunks. */ while (nblocks >= 16) { _gcry_camellia_aesni_avx_cbc_dec(ctx, outbuf, inbuf, iv); nblocks -= 16; outbuf += 16 * CAMELLIA_BLOCK_SIZE; inbuf += 16 * CAMELLIA_BLOCK_SIZE; did_use_aesni_avx = 1; } if (did_use_aesni_avx) { if (burn_stack_depth < avx_burn_stack_depth) burn_stack_depth = avx_burn_stack_depth; } /* Use generic code to handle smaller chunks... */ } #endif /* Process remaining blocks. */ if (nblocks) { byte tmpbuf[CAMELLIA_BLOCK_SIZE * 32]; unsigned int tmp_used = CAMELLIA_BLOCK_SIZE; size_t nburn; nburn = bulk_cbc_dec_128(ctx, camellia_decrypt_blk1_32, outbuf, inbuf, nblocks, iv, tmpbuf, sizeof(tmpbuf) / CAMELLIA_BLOCK_SIZE, &tmp_used); burn_stack_depth = nburn > burn_stack_depth ? nburn : burn_stack_depth; wipememory(tmpbuf, tmp_used); } if (burn_stack_depth) _gcry_burn_stack(burn_stack_depth); } /* Bulk decryption of complete blocks in CFB mode. This function is only intended for the bulk encryption feature of cipher.c. */ static void _gcry_camellia_cfb_dec(void *context, unsigned char *iv, void *outbuf_arg, const void *inbuf_arg, size_t nblocks) { CAMELLIA_context *ctx = context; unsigned char *outbuf = outbuf_arg; const unsigned char *inbuf = inbuf_arg; int burn_stack_depth = 0; #ifdef USE_GFNI_AVX512 if (ctx->use_gfni_avx512) { int did_use_gfni_avx512 = 0; /* Process data in 64 block chunks. */ while (nblocks >= 64) { _gcry_camellia_gfni_avx512_cfb_dec (ctx, outbuf, inbuf, iv); nblocks -= 64; outbuf += 64 * CAMELLIA_BLOCK_SIZE; inbuf += 64 * CAMELLIA_BLOCK_SIZE; did_use_gfni_avx512 = 1; } if (did_use_gfni_avx512) { if (burn_stack_depth < avx512_burn_stack_depth) burn_stack_depth = avx512_burn_stack_depth; } /* Use generic code to handle smaller chunks... */ } #endif #ifdef USE_AESNI_AVX2 if (ctx->use_avx2) { int did_use_aesni_avx2 = 0; typeof (&_gcry_camellia_aesni_avx2_cfb_dec) bulk_cfb_fn = _gcry_camellia_aesni_avx2_cfb_dec; #ifdef USE_VAES_AVX2 if (ctx->use_vaes_avx2) bulk_cfb_fn =_gcry_camellia_vaes_avx2_cfb_dec; #endif #ifdef USE_GFNI_AVX2 if (ctx->use_gfni_avx2) bulk_cfb_fn =_gcry_camellia_gfni_avx2_cfb_dec; #endif /* Process data in 32 block chunks. */ while (nblocks >= 32) { bulk_cfb_fn (ctx, outbuf, inbuf, iv); nblocks -= 32; outbuf += 32 * CAMELLIA_BLOCK_SIZE; inbuf += 32 * CAMELLIA_BLOCK_SIZE; did_use_aesni_avx2 = 1; } if (did_use_aesni_avx2) { if (burn_stack_depth < avx2_burn_stack_depth) burn_stack_depth = avx2_burn_stack_depth; } /* Use generic code to handle smaller chunks... */ } #endif #ifdef USE_AESNI_AVX if (ctx->use_aesni_avx) { int did_use_aesni_avx = 0; /* Process data in 16 block chunks. */ while (nblocks >= 16) { _gcry_camellia_aesni_avx_cfb_dec(ctx, outbuf, inbuf, iv); nblocks -= 16; outbuf += 16 * CAMELLIA_BLOCK_SIZE; inbuf += 16 * CAMELLIA_BLOCK_SIZE; did_use_aesni_avx = 1; } if (did_use_aesni_avx) { if (burn_stack_depth < avx_burn_stack_depth) burn_stack_depth = avx_burn_stack_depth; } /* Use generic code to handle smaller chunks... */ } #endif /* Process remaining blocks. */ if (nblocks) { byte tmpbuf[CAMELLIA_BLOCK_SIZE * 32]; unsigned int tmp_used = CAMELLIA_BLOCK_SIZE; size_t nburn; nburn = bulk_cfb_dec_128(ctx, camellia_encrypt_blk1_32, outbuf, inbuf, nblocks, iv, tmpbuf, sizeof(tmpbuf) / CAMELLIA_BLOCK_SIZE, &tmp_used); burn_stack_depth = nburn > burn_stack_depth ? nburn : burn_stack_depth; wipememory(tmpbuf, tmp_used); } if (burn_stack_depth) _gcry_burn_stack(burn_stack_depth); } /* Bulk encryption/decryption in ECB mode. */ static void _gcry_camellia_ecb_crypt (void *context, void *outbuf_arg, const void *inbuf_arg, size_t nblocks, int encrypt) { CAMELLIA_context *ctx = context; unsigned char *outbuf = outbuf_arg; const unsigned char *inbuf = inbuf_arg; int burn_stack_depth = 0; /* Process remaining blocks. */ if (nblocks) { size_t nburn; nburn = bulk_ecb_crypt_128(ctx, encrypt ? camellia_encrypt_blk1_64 : camellia_decrypt_blk1_64, outbuf, inbuf, nblocks, 64); burn_stack_depth = nburn > burn_stack_depth ? nburn : burn_stack_depth; } if (burn_stack_depth) _gcry_burn_stack(burn_stack_depth); } /* Bulk encryption/decryption of complete blocks in XTS mode. */ static void _gcry_camellia_xts_crypt (void *context, unsigned char *tweak, void *outbuf_arg, const void *inbuf_arg, size_t nblocks, int encrypt) { CAMELLIA_context *ctx = context; unsigned char *outbuf = outbuf_arg; const unsigned char *inbuf = inbuf_arg; int burn_stack_depth = 0; /* Process remaining blocks. */ if (nblocks) { byte tmpbuf[CAMELLIA_BLOCK_SIZE * 64]; unsigned int tmp_used = CAMELLIA_BLOCK_SIZE; size_t nburn; nburn = bulk_xts_crypt_128(ctx, encrypt ? camellia_encrypt_blk1_64 : camellia_decrypt_blk1_64, outbuf, inbuf, nblocks, tweak, tmpbuf, sizeof(tmpbuf) / CAMELLIA_BLOCK_SIZE, &tmp_used); burn_stack_depth = nburn > burn_stack_depth ? nburn : burn_stack_depth; wipememory(tmpbuf, tmp_used); } if (burn_stack_depth) _gcry_burn_stack(burn_stack_depth); } /* Bulk encryption of complete blocks in CTR32LE mode (for GCM-SIV). */ static void _gcry_camellia_ctr32le_enc(void *context, unsigned char *ctr, void *outbuf_arg, const void *inbuf_arg, size_t nblocks) { CAMELLIA_context *ctx = context; byte *outbuf = outbuf_arg; const byte *inbuf = inbuf_arg; int burn_stack_depth = 0; /* Process remaining blocks. */ if (nblocks) { byte tmpbuf[64 * CAMELLIA_BLOCK_SIZE]; unsigned int tmp_used = CAMELLIA_BLOCK_SIZE; size_t nburn; nburn = bulk_ctr32le_enc_128 (ctx, camellia_encrypt_blk1_64, outbuf, inbuf, nblocks, ctr, tmpbuf, sizeof(tmpbuf) / CAMELLIA_BLOCK_SIZE, &tmp_used); burn_stack_depth = nburn > burn_stack_depth ? nburn : burn_stack_depth; wipememory (tmpbuf, tmp_used); } if (burn_stack_depth) _gcry_burn_stack (burn_stack_depth); } /* Bulk encryption/decryption of complete blocks in OCB mode. */ static size_t _gcry_camellia_ocb_crypt (gcry_cipher_hd_t c, void *outbuf_arg, const void *inbuf_arg, size_t nblocks, int encrypt) { #if defined(USE_PPC_CRYPTO) || defined(USE_AESNI_AVX) || defined(USE_AESNI_AVX2) CAMELLIA_context *ctx = (void *)&c->context.c; unsigned char *outbuf = outbuf_arg; const unsigned char *inbuf = inbuf_arg; int burn_stack_depth = 0; u64 blkn = c->u_mode.ocb.data_nblocks; #else (void)c; (void)outbuf_arg; (void)inbuf_arg; (void)encrypt; #endif #ifdef USE_GFNI_AVX512 if (ctx->use_gfni_avx512) { int did_use_gfni_avx512 = 0; u64 Ls[64]; u64 *l; if (nblocks >= 64) { typeof (&_gcry_camellia_gfni_avx512_ocb_dec) bulk_ocb_fn = encrypt ? _gcry_camellia_gfni_avx512_ocb_enc : _gcry_camellia_gfni_avx512_ocb_dec; l = bulk_ocb_prepare_L_pointers_array_blk64 (c, Ls, blkn); /* Process data in 64 block chunks. */ while (nblocks >= 64) { blkn += 64; *l = (uintptr_t)(void *)ocb_get_l(c, blkn - blkn % 64); bulk_ocb_fn (ctx, outbuf, inbuf, c->u_iv.iv, c->u_ctr.ctr, Ls); nblocks -= 64; outbuf += 64 * CAMELLIA_BLOCK_SIZE; inbuf += 64 * CAMELLIA_BLOCK_SIZE; did_use_gfni_avx512 = 1; } } if (did_use_gfni_avx512) { if (burn_stack_depth < avx2_burn_stack_depth) burn_stack_depth = avx2_burn_stack_depth; } /* Use generic code to handle smaller chunks... */ } #endif #ifdef USE_AESNI_AVX2 if (ctx->use_avx2) { int did_use_aesni_avx2 = 0; u64 Ls[32]; u64 *l; if (nblocks >= 32) { typeof (&_gcry_camellia_aesni_avx2_ocb_dec) bulk_ocb_fn = encrypt ? _gcry_camellia_aesni_avx2_ocb_enc : _gcry_camellia_aesni_avx2_ocb_dec; #ifdef USE_VAES_AVX2 if (ctx->use_vaes_avx2) bulk_ocb_fn = encrypt ? _gcry_camellia_vaes_avx2_ocb_enc : _gcry_camellia_vaes_avx2_ocb_dec; #endif #ifdef USE_GFNI_AVX2 if (ctx->use_gfni_avx2) bulk_ocb_fn = encrypt ? _gcry_camellia_gfni_avx2_ocb_enc : _gcry_camellia_gfni_avx2_ocb_dec; #endif l = bulk_ocb_prepare_L_pointers_array_blk32 (c, Ls, blkn); /* Process data in 32 block chunks. */ while (nblocks >= 32) { blkn += 32; *l = (uintptr_t)(void *)ocb_get_l(c, blkn - blkn % 32); bulk_ocb_fn (ctx, outbuf, inbuf, c->u_iv.iv, c->u_ctr.ctr, Ls); nblocks -= 32; outbuf += 32 * CAMELLIA_BLOCK_SIZE; inbuf += 32 * CAMELLIA_BLOCK_SIZE; did_use_aesni_avx2 = 1; } } if (did_use_aesni_avx2) { if (burn_stack_depth < avx2_burn_stack_depth) burn_stack_depth = avx2_burn_stack_depth; } /* Use generic code to handle smaller chunks... */ } #endif #ifdef USE_AESNI_AVX if (ctx->use_aesni_avx) { int did_use_aesni_avx = 0; u64 Ls[16]; u64 *l; if (nblocks >= 16) { l = bulk_ocb_prepare_L_pointers_array_blk16 (c, Ls, blkn); /* Process data in 16 block chunks. */ while (nblocks >= 16) { blkn += 16; *l = (uintptr_t)(void *)ocb_get_l(c, blkn - blkn % 16); if (encrypt) _gcry_camellia_aesni_avx_ocb_enc(ctx, outbuf, inbuf, c->u_iv.iv, c->u_ctr.ctr, Ls); else _gcry_camellia_aesni_avx_ocb_dec(ctx, outbuf, inbuf, c->u_iv.iv, c->u_ctr.ctr, Ls); nblocks -= 16; outbuf += 16 * CAMELLIA_BLOCK_SIZE; inbuf += 16 * CAMELLIA_BLOCK_SIZE; did_use_aesni_avx = 1; } } if (did_use_aesni_avx) { if (burn_stack_depth < avx_burn_stack_depth) burn_stack_depth = avx_burn_stack_depth; } /* Use generic code to handle smaller chunks... */ } #endif #if defined(USE_PPC_CRYPTO) || defined(USE_AESNI_AVX) || defined(USE_AESNI_AVX2) /* Process remaining blocks. */ if (nblocks) { byte tmpbuf[CAMELLIA_BLOCK_SIZE * 32]; unsigned int tmp_used = CAMELLIA_BLOCK_SIZE; size_t nburn; nburn = bulk_ocb_crypt_128 (c, ctx, encrypt ? camellia_encrypt_blk1_32 : camellia_decrypt_blk1_32, outbuf, inbuf, nblocks, &blkn, encrypt, tmpbuf, sizeof(tmpbuf) / CAMELLIA_BLOCK_SIZE, &tmp_used); burn_stack_depth = nburn > burn_stack_depth ? nburn : burn_stack_depth; wipememory(tmpbuf, tmp_used); nblocks = 0; } c->u_mode.ocb.data_nblocks = blkn; if (burn_stack_depth) _gcry_burn_stack (burn_stack_depth + 4 * sizeof(void *)); #endif return nblocks; } /* Bulk authentication of complete blocks in OCB mode. */ static size_t _gcry_camellia_ocb_auth (gcry_cipher_hd_t c, const void *abuf_arg, size_t nblocks) { #if defined(USE_PPC_CRYPTO) || defined(USE_AESNI_AVX) || defined(USE_AESNI_AVX2) CAMELLIA_context *ctx = (void *)&c->context.c; const unsigned char *abuf = abuf_arg; int burn_stack_depth = 0; u64 blkn = c->u_mode.ocb.aad_nblocks; #else (void)c; (void)abuf_arg; #endif #ifdef USE_AESNI_AVX2 if (ctx->use_avx2) { int did_use_aesni_avx2 = 0; u64 Ls[32]; u64 *l; if (nblocks >= 32) { typeof (&_gcry_camellia_aesni_avx2_ocb_auth) bulk_auth_fn = _gcry_camellia_aesni_avx2_ocb_auth; #ifdef USE_VAES_AVX2 if (ctx->use_vaes_avx2) bulk_auth_fn = _gcry_camellia_vaes_avx2_ocb_auth; #endif #ifdef USE_GFNI_AVX2 if (ctx->use_gfni_avx2) bulk_auth_fn = _gcry_camellia_gfni_avx2_ocb_auth; #endif l = bulk_ocb_prepare_L_pointers_array_blk32 (c, Ls, blkn); /* Process data in 32 block chunks. */ while (nblocks >= 32) { blkn += 32; *l = (uintptr_t)(void *)ocb_get_l(c, blkn - blkn % 32); bulk_auth_fn (ctx, abuf, c->u_mode.ocb.aad_offset, c->u_mode.ocb.aad_sum, Ls); nblocks -= 32; abuf += 32 * CAMELLIA_BLOCK_SIZE; did_use_aesni_avx2 = 1; } } if (did_use_aesni_avx2) { if (burn_stack_depth < avx2_burn_stack_depth) burn_stack_depth = avx2_burn_stack_depth; } /* Use generic code to handle smaller chunks... */ } #endif #ifdef USE_AESNI_AVX if (ctx->use_aesni_avx) { int did_use_aesni_avx = 0; u64 Ls[16]; u64 *l; if (nblocks >= 16) { l = bulk_ocb_prepare_L_pointers_array_blk16 (c, Ls, blkn); /* Process data in 16 block chunks. */ while (nblocks >= 16) { blkn += 16; *l = (uintptr_t)(void *)ocb_get_l(c, blkn - blkn % 16); _gcry_camellia_aesni_avx_ocb_auth(ctx, abuf, c->u_mode.ocb.aad_offset, c->u_mode.ocb.aad_sum, Ls); nblocks -= 16; abuf += 16 * CAMELLIA_BLOCK_SIZE; did_use_aesni_avx = 1; } } if (did_use_aesni_avx) { if (burn_stack_depth < avx_burn_stack_depth) burn_stack_depth = avx_burn_stack_depth; } /* Use generic code to handle smaller chunks... */ } #endif #if defined(USE_PPC_CRYPTO) || defined(USE_AESNI_AVX) || defined(USE_AESNI_AVX2) /* Process remaining blocks. */ if (nblocks) { byte tmpbuf[CAMELLIA_BLOCK_SIZE * 32]; unsigned int tmp_used = CAMELLIA_BLOCK_SIZE; size_t nburn; nburn = bulk_ocb_auth_128 (c, ctx, camellia_encrypt_blk1_32, abuf, nblocks, &blkn, tmpbuf, sizeof(tmpbuf) / CAMELLIA_BLOCK_SIZE, &tmp_used); burn_stack_depth = nburn > burn_stack_depth ? nburn : burn_stack_depth; wipememory(tmpbuf, tmp_used); nblocks = 0; } c->u_mode.ocb.aad_nblocks = blkn; if (burn_stack_depth) _gcry_burn_stack (burn_stack_depth + 4 * sizeof(void *)); #endif return nblocks; } /* These oids are from , retrieved May 1, 2007. */ static const gcry_cipher_oid_spec_t camellia128_oids[] = { {"1.2.392.200011.61.1.1.1.2", GCRY_CIPHER_MODE_CBC}, {"0.3.4401.5.3.1.9.1", GCRY_CIPHER_MODE_ECB}, {"0.3.4401.5.3.1.9.3", GCRY_CIPHER_MODE_OFB}, {"0.3.4401.5.3.1.9.4", GCRY_CIPHER_MODE_CFB}, { NULL } }; static const gcry_cipher_oid_spec_t camellia192_oids[] = { {"1.2.392.200011.61.1.1.1.3", GCRY_CIPHER_MODE_CBC}, {"0.3.4401.5.3.1.9.21", GCRY_CIPHER_MODE_ECB}, {"0.3.4401.5.3.1.9.23", GCRY_CIPHER_MODE_OFB}, {"0.3.4401.5.3.1.9.24", GCRY_CIPHER_MODE_CFB}, { NULL } }; static const gcry_cipher_oid_spec_t camellia256_oids[] = { {"1.2.392.200011.61.1.1.1.4", GCRY_CIPHER_MODE_CBC}, {"0.3.4401.5.3.1.9.41", GCRY_CIPHER_MODE_ECB}, {"0.3.4401.5.3.1.9.43", GCRY_CIPHER_MODE_OFB}, {"0.3.4401.5.3.1.9.44", GCRY_CIPHER_MODE_CFB}, { NULL } }; gcry_cipher_spec_t _gcry_cipher_spec_camellia128 = { GCRY_CIPHER_CAMELLIA128, {0, 0}, "CAMELLIA128",NULL,camellia128_oids,CAMELLIA_BLOCK_SIZE,128, sizeof(CAMELLIA_context),camellia_setkey,camellia_encrypt,camellia_decrypt , GRUB_UTIL_MODNAME("gcry_camellia") }; gcry_cipher_spec_t _gcry_cipher_spec_camellia192 = { GCRY_CIPHER_CAMELLIA192, {0, 0}, "CAMELLIA192",NULL,camellia192_oids,CAMELLIA_BLOCK_SIZE,192, sizeof(CAMELLIA_context),camellia_setkey,camellia_encrypt,camellia_decrypt , GRUB_UTIL_MODNAME("gcry_camellia") }; gcry_cipher_spec_t _gcry_cipher_spec_camellia256 = { GCRY_CIPHER_CAMELLIA256, {0, 0}, "CAMELLIA256",NULL,camellia256_oids,CAMELLIA_BLOCK_SIZE,256, sizeof(CAMELLIA_context),camellia_setkey,camellia_encrypt,camellia_decrypt , GRUB_UTIL_MODNAME("gcry_camellia") }; GRUB_MOD_INIT(gcry_camellia) { grub_cipher_register (&_gcry_cipher_spec_camellia128); grub_cipher_register (&_gcry_cipher_spec_camellia192); grub_cipher_register (&_gcry_cipher_spec_camellia256); } GRUB_MOD_FINI(gcry_camellia) { grub_cipher_unregister (&_gcry_cipher_spec_camellia128); grub_cipher_unregister (&_gcry_cipher_spec_camellia192); grub_cipher_unregister (&_gcry_cipher_spec_camellia256); } grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/cipher/idea.c0000644000175000017500000001563715036452441021725 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ #include GRUB_MOD_LICENSE ("GPLv3+"); /* idea.c - IDEA function * Copyright 1997, 1998, 1999, 2001 Werner Koch (dd9jn) * Copyright 2013 g10 Code GmbH * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * WERNER KOCH BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Except as contained in this notice, the name of Werner Koch shall not be * used in advertising or otherwise to promote the sale, use or other dealings * in this Software without prior written authorization from Werner Koch. * * Patents on IDEA have expired: * Europe: EP0482154 on 2011-05-16, * Japan: JP3225440 on 2011-05-16, * U.S.: 5,214,703 on 2012-01-07. */ /* * Please see http://www.noepatents.org/ to learn why software patents * are bad for society and what you can do to fight them. * * The code herein is based on the one from: * Bruce Schneier: Applied Cryptography. John Wiley & Sons, 1996. * ISBN 0-471-11709-9. */ #include "types.h" /* for byte and u32 typedefs */ #include "g10lib.h" #include "cipher.h" #include "cipher-internal.h" #define IDEA_KEYSIZE 16 #define IDEA_BLOCKSIZE 8 #define IDEA_ROUNDS 8 #define IDEA_KEYLEN (6*IDEA_ROUNDS+4) typedef struct { u16 ek[IDEA_KEYLEN]; u16 dk[IDEA_KEYLEN]; int have_dk; } IDEA_context; static u16 mul_inv( u16 x ) { u16 t0, t1; u16 q, y; if( x < 2 ) return x; t1 = 0x10001UL / x; y = 0x10001UL % x; if( y == 1 ) return (1-t1) & 0xffff; t0 = 1; do { q = x / y; x = x % y; t0 += q * t1; if( x == 1 ) return t0; q = y / x; y = y % x; t1 += q * t0; } while( y != 1 ); return (1-t1) & 0xffff; } static void expand_key( const byte *userkey, u16 *ek ) { int i,j; for(j=0; j < 8; j++ ) { ek[j] = (*userkey << 8) + userkey[1]; userkey += 2; } for(i=0; j < IDEA_KEYLEN; j++ ) { i++; ek[i+7] = ek[i&7] << 9 | ek[(i+1)&7] >> 7; ek += i & 8; i &= 7; } } static void invert_key( u16 *ek, u16 dk[IDEA_KEYLEN] ) { int i; u16 t1, t2, t3; u16 temp[IDEA_KEYLEN]; u16 *p = temp + IDEA_KEYLEN; t1 = mul_inv( *ek++ ); t2 = -*ek++; t3 = -*ek++; *--p = mul_inv( *ek++ ); *--p = t3; *--p = t2; *--p = t1; for(i=0; i < IDEA_ROUNDS-1; i++ ) { t1 = *ek++; *--p = *ek++; *--p = t1; t1 = mul_inv( *ek++ ); t2 = -*ek++; t3 = -*ek++; *--p = mul_inv( *ek++ ); *--p = t2; *--p = t3; *--p = t1; } t1 = *ek++; *--p = *ek++; *--p = t1; t1 = mul_inv( *ek++ ); t2 = -*ek++; t3 = -*ek++; *--p = mul_inv( *ek++ ); *--p = t3; *--p = t2; *--p = t1; memcpy(dk, temp, sizeof(temp) ); wipememory(temp, sizeof(temp)); } static void cipher( byte *outbuf, const byte *inbuf, u16 *key ) { u16 s2, s3; u16 in[4]; int r = IDEA_ROUNDS; #define x1 (in[0]) #define x2 (in[1]) #define x3 (in[2]) #define x4 (in[3]) #define MUL(x,y) \ do {u16 _t16; u32 _t32; \ if( (_t16 = (y)) ) { \ if( (x = (x)&0xffff) ) { \ _t32 = (u32)x * _t16; \ x = _t32 & 0xffff; \ _t16 = _t32 >> 16; \ x = ((x)-_t16) + (x<_t16?1:0); \ } \ else { \ x = 1 - _t16; \ } \ } \ else { \ x = 1 - x; \ } \ } while(0) memcpy (in, inbuf, sizeof in); #ifndef WORDS_BIGENDIAN x1 = (x1>>8) | (x1<<8); x2 = (x2>>8) | (x2<<8); x3 = (x3>>8) | (x3<<8); x4 = (x4>>8) | (x4<<8); #endif do { MUL(x1, *key++); x2 += *key++; x3 += *key++; MUL(x4, *key++ ); s3 = x3; x3 ^= x1; MUL(x3, *key++); s2 = x2; x2 ^=x4; x2 += x3; MUL(x2, *key++); x3 += x2; x1 ^= x2; x4 ^= x3; x2 ^= s3; x3 ^= s2; } while( --r ); MUL(x1, *key++); x3 += *key++; x2 += *key++; MUL(x4, *key); #ifndef WORDS_BIGENDIAN x1 = (x1>>8) | (x1<<8); x2 = (x2>>8) | (x2<<8); x3 = (x3>>8) | (x3<<8); x4 = (x4>>8) | (x4<<8); #endif memcpy (outbuf+0, &x1, 2); memcpy (outbuf+2, &x3, 2); memcpy (outbuf+4, &x2, 2); memcpy (outbuf+6, &x4, 2); #undef MUL #undef x1 #undef x2 #undef x3 #undef x4 } static int do_setkey( IDEA_context *c, const byte *key, unsigned int keylen ) { static int initialized = 0; static const char *selftest_failed = 0; if( !initialized ) { initialized = 1; selftest_failed = selftest(); if( selftest_failed ) log_error( "%s\n", selftest_failed ); } if( selftest_failed ) return GPG_ERR_SELFTEST_FAILED; if (keylen != 16) return GPG_ERR_INV_KEYLEN; c->have_dk = 0; expand_key( key, c->ek ); invert_key( c->ek, c->dk ); return 0; } static gcry_err_code_t idea_setkey (void *context, const byte *key, unsigned int keylen, cipher_bulk_ops_t *bulk_ops) { IDEA_context *ctx = context; int rc = do_setkey (ctx, key, keylen); (void)bulk_ops; _gcry_burn_stack (23+6*sizeof(void*)); return rc; } static void encrypt_block( IDEA_context *c, byte *outbuf, const byte *inbuf ) { cipher( outbuf, inbuf, c->ek ); } static unsigned int idea_encrypt (void *context, byte *out, const byte *in) { IDEA_context *ctx = context; encrypt_block (ctx, out, in); return /*burn_stack*/ (24+3*sizeof (void*)); } static void decrypt_block( IDEA_context *c, byte *outbuf, const byte *inbuf ) { if( !c->have_dk ) { c->have_dk = 1; invert_key( c->ek, c->dk ); } cipher( outbuf, inbuf, c->dk ); } static unsigned int idea_decrypt (void *context, byte *out, const byte *in) { IDEA_context *ctx = context; decrypt_block (ctx, out, in); return /*burn_stack*/ (24+3*sizeof (void*)); } gcry_cipher_spec_t _gcry_cipher_spec_idea = { GCRY_CIPHER_IDEA, {0, 0}, "IDEA", NULL, NULL, IDEA_BLOCKSIZE, 128, sizeof (IDEA_context), idea_setkey, idea_encrypt, idea_decrypt , GRUB_UTIL_MODNAME("gcry_idea") }; GRUB_MOD_INIT(gcry_idea) { grub_cipher_register (&_gcry_cipher_spec_idea); } GRUB_MOD_FINI(gcry_idea) { grub_cipher_unregister (&_gcry_cipher_spec_idea); } grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/cipher/keccak_permute_32.h0000644000175000017500000003521415036452441024307 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ /* keccak_permute_32.h - Keccak permute function (simple 32bit bit-interleaved) * Copyright (C) 2015 Jussi Kivilinna * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . */ /* The code is based on public-domain/CC0 "keccakc1024/simple32bi/ * Keccak-simple32BI.c" implementation by Ronny Van Keer from SUPERCOP toolkit * package. */ /* Function that computes the Keccak-f[1600] permutation on the given state. */ static unsigned int KECCAK_F1600_PERMUTE_FUNC_NAME(KECCAK_STATE *hd) { const u32 *round_consts = round_consts_32bit; const u32 *round_consts_end = round_consts_32bit + 2 * 24; u32 Aba0, Abe0, Abi0, Abo0, Abu0; u32 Aba1, Abe1, Abi1, Abo1, Abu1; u32 Aga0, Age0, Agi0, Ago0, Agu0; u32 Aga1, Age1, Agi1, Ago1, Agu1; u32 Aka0, Ake0, Aki0, Ako0, Aku0; u32 Aka1, Ake1, Aki1, Ako1, Aku1; u32 Ama0, Ame0, Ami0, Amo0, Amu0; u32 Ama1, Ame1, Ami1, Amo1, Amu1; u32 Asa0, Ase0, Asi0, Aso0, Asu0; u32 Asa1, Ase1, Asi1, Aso1, Asu1; u32 BCa0, BCe0, BCi0, BCo0, BCu0; u32 BCa1, BCe1, BCi1, BCo1, BCu1; u32 Da0, De0, Di0, Do0, Du0; u32 Da1, De1, Di1, Do1, Du1; u32 Eba0, Ebe0, Ebi0, Ebo0, Ebu0; u32 Eba1, Ebe1, Ebi1, Ebo1, Ebu1; u32 Ega0, Ege0, Egi0, Ego0, Egu0; u32 Ega1, Ege1, Egi1, Ego1, Egu1; u32 Eka0, Eke0, Eki0, Eko0, Eku0; u32 Eka1, Eke1, Eki1, Eko1, Eku1; u32 Ema0, Eme0, Emi0, Emo0, Emu0; u32 Ema1, Eme1, Emi1, Emo1, Emu1; u32 Esa0, Ese0, Esi0, Eso0, Esu0; u32 Esa1, Ese1, Esi1, Eso1, Esu1; u32 *state = hd->u.state32bi; Aba0 = state[0]; Aba1 = state[1]; Abe0 = state[2]; Abe1 = state[3]; Abi0 = state[4]; Abi1 = state[5]; Abo0 = state[6]; Abo1 = state[7]; Abu0 = state[8]; Abu1 = state[9]; Aga0 = state[10]; Aga1 = state[11]; Age0 = state[12]; Age1 = state[13]; Agi0 = state[14]; Agi1 = state[15]; Ago0 = state[16]; Ago1 = state[17]; Agu0 = state[18]; Agu1 = state[19]; Aka0 = state[20]; Aka1 = state[21]; Ake0 = state[22]; Ake1 = state[23]; Aki0 = state[24]; Aki1 = state[25]; Ako0 = state[26]; Ako1 = state[27]; Aku0 = state[28]; Aku1 = state[29]; Ama0 = state[30]; Ama1 = state[31]; Ame0 = state[32]; Ame1 = state[33]; Ami0 = state[34]; Ami1 = state[35]; Amo0 = state[36]; Amo1 = state[37]; Amu0 = state[38]; Amu1 = state[39]; Asa0 = state[40]; Asa1 = state[41]; Ase0 = state[42]; Ase1 = state[43]; Asi0 = state[44]; Asi1 = state[45]; Aso0 = state[46]; Aso1 = state[47]; Asu0 = state[48]; Asu1 = state[49]; do { /* prepareTheta */ BCa0 = Aba0 ^ Aga0 ^ Aka0 ^ Ama0 ^ Asa0; BCa1 = Aba1 ^ Aga1 ^ Aka1 ^ Ama1 ^ Asa1; BCe0 = Abe0 ^ Age0 ^ Ake0 ^ Ame0 ^ Ase0; BCe1 = Abe1 ^ Age1 ^ Ake1 ^ Ame1 ^ Ase1; BCi0 = Abi0 ^ Agi0 ^ Aki0 ^ Ami0 ^ Asi0; BCi1 = Abi1 ^ Agi1 ^ Aki1 ^ Ami1 ^ Asi1; BCo0 = Abo0 ^ Ago0 ^ Ako0 ^ Amo0 ^ Aso0; BCo1 = Abo1 ^ Ago1 ^ Ako1 ^ Amo1 ^ Aso1; BCu0 = Abu0 ^ Agu0 ^ Aku0 ^ Amu0 ^ Asu0; BCu1 = Abu1 ^ Agu1 ^ Aku1 ^ Amu1 ^ Asu1; /* thetaRhoPiChiIota(round , A, E) */ Da0 = BCu0 ^ ROL32(BCe1, 1); Da1 = BCu1 ^ BCe0; De0 = BCa0 ^ ROL32(BCi1, 1); De1 = BCa1 ^ BCi0; Di0 = BCe0 ^ ROL32(BCo1, 1); Di1 = BCe1 ^ BCo0; Do0 = BCi0 ^ ROL32(BCu1, 1); Do1 = BCi1 ^ BCu0; Du0 = BCo0 ^ ROL32(BCa1, 1); Du1 = BCo1 ^ BCa0; Aba0 ^= Da0; BCa0 = Aba0; Age0 ^= De0; BCe0 = ROL32(Age0, 22); Aki1 ^= Di1; BCi0 = ROL32(Aki1, 22); Amo1 ^= Do1; BCo0 = ROL32(Amo1, 11); Asu0 ^= Du0; BCu0 = ROL32(Asu0, 7); Eba0 = BCa0 ^ ANDN32(BCe0, BCi0); Eba0 ^= *(round_consts++); Ebe0 = BCe0 ^ ANDN32(BCi0, BCo0); Ebi0 = BCi0 ^ ANDN32(BCo0, BCu0); Ebo0 = BCo0 ^ ANDN32(BCu0, BCa0); Ebu0 = BCu0 ^ ANDN32(BCa0, BCe0); Aba1 ^= Da1; BCa1 = Aba1; Age1 ^= De1; BCe1 = ROL32(Age1, 22); Aki0 ^= Di0; BCi1 = ROL32(Aki0, 21); Amo0 ^= Do0; BCo1 = ROL32(Amo0, 10); Asu1 ^= Du1; BCu1 = ROL32(Asu1, 7); Eba1 = BCa1 ^ ANDN32(BCe1, BCi1); Eba1 ^= *(round_consts++); Ebe1 = BCe1 ^ ANDN32(BCi1, BCo1); Ebi1 = BCi1 ^ ANDN32(BCo1, BCu1); Ebo1 = BCo1 ^ ANDN32(BCu1, BCa1); Ebu1 = BCu1 ^ ANDN32(BCa1, BCe1); Abo0 ^= Do0; BCa0 = ROL32(Abo0, 14); Agu0 ^= Du0; BCe0 = ROL32(Agu0, 10); Aka1 ^= Da1; BCi0 = ROL32(Aka1, 2); Ame1 ^= De1; BCo0 = ROL32(Ame1, 23); Asi1 ^= Di1; BCu0 = ROL32(Asi1, 31); Ega0 = BCa0 ^ ANDN32(BCe0, BCi0); Ege0 = BCe0 ^ ANDN32(BCi0, BCo0); Egi0 = BCi0 ^ ANDN32(BCo0, BCu0); Ego0 = BCo0 ^ ANDN32(BCu0, BCa0); Egu0 = BCu0 ^ ANDN32(BCa0, BCe0); Abo1 ^= Do1; BCa1 = ROL32(Abo1, 14); Agu1 ^= Du1; BCe1 = ROL32(Agu1, 10); Aka0 ^= Da0; BCi1 = ROL32(Aka0, 1); Ame0 ^= De0; BCo1 = ROL32(Ame0, 22); Asi0 ^= Di0; BCu1 = ROL32(Asi0, 30); Ega1 = BCa1 ^ ANDN32(BCe1, BCi1); Ege1 = BCe1 ^ ANDN32(BCi1, BCo1); Egi1 = BCi1 ^ ANDN32(BCo1, BCu1); Ego1 = BCo1 ^ ANDN32(BCu1, BCa1); Egu1 = BCu1 ^ ANDN32(BCa1, BCe1); Abe1 ^= De1; BCa0 = ROL32(Abe1, 1); Agi0 ^= Di0; BCe0 = ROL32(Agi0, 3); Ako1 ^= Do1; BCi0 = ROL32(Ako1, 13); Amu0 ^= Du0; BCo0 = ROL32(Amu0, 4); Asa0 ^= Da0; BCu0 = ROL32(Asa0, 9); Eka0 = BCa0 ^ ANDN32(BCe0, BCi0); Eke0 = BCe0 ^ ANDN32(BCi0, BCo0); Eki0 = BCi0 ^ ANDN32(BCo0, BCu0); Eko0 = BCo0 ^ ANDN32(BCu0, BCa0); Eku0 = BCu0 ^ ANDN32(BCa0, BCe0); Abe0 ^= De0; BCa1 = Abe0; Agi1 ^= Di1; BCe1 = ROL32(Agi1, 3); Ako0 ^= Do0; BCi1 = ROL32(Ako0, 12); Amu1 ^= Du1; BCo1 = ROL32(Amu1, 4); Asa1 ^= Da1; BCu1 = ROL32(Asa1, 9); Eka1 = BCa1 ^ ANDN32(BCe1, BCi1); Eke1 = BCe1 ^ ANDN32(BCi1, BCo1); Eki1 = BCi1 ^ ANDN32(BCo1, BCu1); Eko1 = BCo1 ^ ANDN32(BCu1, BCa1); Eku1 = BCu1 ^ ANDN32(BCa1, BCe1); Abu1 ^= Du1; BCa0 = ROL32(Abu1, 14); Aga0 ^= Da0; BCe0 = ROL32(Aga0, 18); Ake0 ^= De0; BCi0 = ROL32(Ake0, 5); Ami1 ^= Di1; BCo0 = ROL32(Ami1, 8); Aso0 ^= Do0; BCu0 = ROL32(Aso0, 28); Ema0 = BCa0 ^ ANDN32(BCe0, BCi0); Eme0 = BCe0 ^ ANDN32(BCi0, BCo0); Emi0 = BCi0 ^ ANDN32(BCo0, BCu0); Emo0 = BCo0 ^ ANDN32(BCu0, BCa0); Emu0 = BCu0 ^ ANDN32(BCa0, BCe0); Abu0 ^= Du0; BCa1 = ROL32(Abu0, 13); Aga1 ^= Da1; BCe1 = ROL32(Aga1, 18); Ake1 ^= De1; BCi1 = ROL32(Ake1, 5); Ami0 ^= Di0; BCo1 = ROL32(Ami0, 7); Aso1 ^= Do1; BCu1 = ROL32(Aso1, 28); Ema1 = BCa1 ^ ANDN32(BCe1, BCi1); Eme1 = BCe1 ^ ANDN32(BCi1, BCo1); Emi1 = BCi1 ^ ANDN32(BCo1, BCu1); Emo1 = BCo1 ^ ANDN32(BCu1, BCa1); Emu1 = BCu1 ^ ANDN32(BCa1, BCe1); Abi0 ^= Di0; BCa0 = ROL32(Abi0, 31); Ago1 ^= Do1; BCe0 = ROL32(Ago1, 28); Aku1 ^= Du1; BCi0 = ROL32(Aku1, 20); Ama1 ^= Da1; BCo0 = ROL32(Ama1, 21); Ase0 ^= De0; BCu0 = ROL32(Ase0, 1); Esa0 = BCa0 ^ ANDN32(BCe0, BCi0); Ese0 = BCe0 ^ ANDN32(BCi0, BCo0); Esi0 = BCi0 ^ ANDN32(BCo0, BCu0); Eso0 = BCo0 ^ ANDN32(BCu0, BCa0); Esu0 = BCu0 ^ ANDN32(BCa0, BCe0); Abi1 ^= Di1; BCa1 = ROL32(Abi1, 31); Ago0 ^= Do0; BCe1 = ROL32(Ago0, 27); Aku0 ^= Du0; BCi1 = ROL32(Aku0, 19); Ama0 ^= Da0; BCo1 = ROL32(Ama0, 20); Ase1 ^= De1; BCu1 = ROL32(Ase1, 1); Esa1 = BCa1 ^ ANDN32(BCe1, BCi1); Ese1 = BCe1 ^ ANDN32(BCi1, BCo1); Esi1 = BCi1 ^ ANDN32(BCo1, BCu1); Eso1 = BCo1 ^ ANDN32(BCu1, BCa1); Esu1 = BCu1 ^ ANDN32(BCa1, BCe1); /* prepareTheta */ BCa0 = Eba0 ^ Ega0 ^ Eka0 ^ Ema0 ^ Esa0; BCa1 = Eba1 ^ Ega1 ^ Eka1 ^ Ema1 ^ Esa1; BCe0 = Ebe0 ^ Ege0 ^ Eke0 ^ Eme0 ^ Ese0; BCe1 = Ebe1 ^ Ege1 ^ Eke1 ^ Eme1 ^ Ese1; BCi0 = Ebi0 ^ Egi0 ^ Eki0 ^ Emi0 ^ Esi0; BCi1 = Ebi1 ^ Egi1 ^ Eki1 ^ Emi1 ^ Esi1; BCo0 = Ebo0 ^ Ego0 ^ Eko0 ^ Emo0 ^ Eso0; BCo1 = Ebo1 ^ Ego1 ^ Eko1 ^ Emo1 ^ Eso1; BCu0 = Ebu0 ^ Egu0 ^ Eku0 ^ Emu0 ^ Esu0; BCu1 = Ebu1 ^ Egu1 ^ Eku1 ^ Emu1 ^ Esu1; /* thetaRhoPiChiIota(round+1, E, A) */ Da0 = BCu0 ^ ROL32(BCe1, 1); Da1 = BCu1 ^ BCe0; De0 = BCa0 ^ ROL32(BCi1, 1); De1 = BCa1 ^ BCi0; Di0 = BCe0 ^ ROL32(BCo1, 1); Di1 = BCe1 ^ BCo0; Do0 = BCi0 ^ ROL32(BCu1, 1); Do1 = BCi1 ^ BCu0; Du0 = BCo0 ^ ROL32(BCa1, 1); Du1 = BCo1 ^ BCa0; Eba0 ^= Da0; BCa0 = Eba0; Ege0 ^= De0; BCe0 = ROL32(Ege0, 22); Eki1 ^= Di1; BCi0 = ROL32(Eki1, 22); Emo1 ^= Do1; BCo0 = ROL32(Emo1, 11); Esu0 ^= Du0; BCu0 = ROL32(Esu0, 7); Aba0 = BCa0 ^ ANDN32(BCe0, BCi0); Aba0 ^= *(round_consts++); Abe0 = BCe0 ^ ANDN32(BCi0, BCo0); Abi0 = BCi0 ^ ANDN32(BCo0, BCu0); Abo0 = BCo0 ^ ANDN32(BCu0, BCa0); Abu0 = BCu0 ^ ANDN32(BCa0, BCe0); Eba1 ^= Da1; BCa1 = Eba1; Ege1 ^= De1; BCe1 = ROL32(Ege1, 22); Eki0 ^= Di0; BCi1 = ROL32(Eki0, 21); Emo0 ^= Do0; BCo1 = ROL32(Emo0, 10); Esu1 ^= Du1; BCu1 = ROL32(Esu1, 7); Aba1 = BCa1 ^ ANDN32(BCe1, BCi1); Aba1 ^= *(round_consts++); Abe1 = BCe1 ^ ANDN32(BCi1, BCo1); Abi1 = BCi1 ^ ANDN32(BCo1, BCu1); Abo1 = BCo1 ^ ANDN32(BCu1, BCa1); Abu1 = BCu1 ^ ANDN32(BCa1, BCe1); Ebo0 ^= Do0; BCa0 = ROL32(Ebo0, 14); Egu0 ^= Du0; BCe0 = ROL32(Egu0, 10); Eka1 ^= Da1; BCi0 = ROL32(Eka1, 2); Eme1 ^= De1; BCo0 = ROL32(Eme1, 23); Esi1 ^= Di1; BCu0 = ROL32(Esi1, 31); Aga0 = BCa0 ^ ANDN32(BCe0, BCi0); Age0 = BCe0 ^ ANDN32(BCi0, BCo0); Agi0 = BCi0 ^ ANDN32(BCo0, BCu0); Ago0 = BCo0 ^ ANDN32(BCu0, BCa0); Agu0 = BCu0 ^ ANDN32(BCa0, BCe0); Ebo1 ^= Do1; BCa1 = ROL32(Ebo1, 14); Egu1 ^= Du1; BCe1 = ROL32(Egu1, 10); Eka0 ^= Da0; BCi1 = ROL32(Eka0, 1); Eme0 ^= De0; BCo1 = ROL32(Eme0, 22); Esi0 ^= Di0; BCu1 = ROL32(Esi0, 30); Aga1 = BCa1 ^ ANDN32(BCe1, BCi1); Age1 = BCe1 ^ ANDN32(BCi1, BCo1); Agi1 = BCi1 ^ ANDN32(BCo1, BCu1); Ago1 = BCo1 ^ ANDN32(BCu1, BCa1); Agu1 = BCu1 ^ ANDN32(BCa1, BCe1); Ebe1 ^= De1; BCa0 = ROL32(Ebe1, 1); Egi0 ^= Di0; BCe0 = ROL32(Egi0, 3); Eko1 ^= Do1; BCi0 = ROL32(Eko1, 13); Emu0 ^= Du0; BCo0 = ROL32(Emu0, 4); Esa0 ^= Da0; BCu0 = ROL32(Esa0, 9); Aka0 = BCa0 ^ ANDN32(BCe0, BCi0); Ake0 = BCe0 ^ ANDN32(BCi0, BCo0); Aki0 = BCi0 ^ ANDN32(BCo0, BCu0); Ako0 = BCo0 ^ ANDN32(BCu0, BCa0); Aku0 = BCu0 ^ ANDN32(BCa0, BCe0); Ebe0 ^= De0; BCa1 = Ebe0; Egi1 ^= Di1; BCe1 = ROL32(Egi1, 3); Eko0 ^= Do0; BCi1 = ROL32(Eko0, 12); Emu1 ^= Du1; BCo1 = ROL32(Emu1, 4); Esa1 ^= Da1; BCu1 = ROL32(Esa1, 9); Aka1 = BCa1 ^ ANDN32(BCe1, BCi1); Ake1 = BCe1 ^ ANDN32(BCi1, BCo1); Aki1 = BCi1 ^ ANDN32(BCo1, BCu1); Ako1 = BCo1 ^ ANDN32(BCu1, BCa1); Aku1 = BCu1 ^ ANDN32(BCa1, BCe1); Ebu1 ^= Du1; BCa0 = ROL32(Ebu1, 14); Ega0 ^= Da0; BCe0 = ROL32(Ega0, 18); Eke0 ^= De0; BCi0 = ROL32(Eke0, 5); Emi1 ^= Di1; BCo0 = ROL32(Emi1, 8); Eso0 ^= Do0; BCu0 = ROL32(Eso0, 28); Ama0 = BCa0 ^ ANDN32(BCe0, BCi0); Ame0 = BCe0 ^ ANDN32(BCi0, BCo0); Ami0 = BCi0 ^ ANDN32(BCo0, BCu0); Amo0 = BCo0 ^ ANDN32(BCu0, BCa0); Amu0 = BCu0 ^ ANDN32(BCa0, BCe0); Ebu0 ^= Du0; BCa1 = ROL32(Ebu0, 13); Ega1 ^= Da1; BCe1 = ROL32(Ega1, 18); Eke1 ^= De1; BCi1 = ROL32(Eke1, 5); Emi0 ^= Di0; BCo1 = ROL32(Emi0, 7); Eso1 ^= Do1; BCu1 = ROL32(Eso1, 28); Ama1 = BCa1 ^ ANDN32(BCe1, BCi1); Ame1 = BCe1 ^ ANDN32(BCi1, BCo1); Ami1 = BCi1 ^ ANDN32(BCo1, BCu1); Amo1 = BCo1 ^ ANDN32(BCu1, BCa1); Amu1 = BCu1 ^ ANDN32(BCa1, BCe1); Ebi0 ^= Di0; BCa0 = ROL32(Ebi0, 31); Ego1 ^= Do1; BCe0 = ROL32(Ego1, 28); Eku1 ^= Du1; BCi0 = ROL32(Eku1, 20); Ema1 ^= Da1; BCo0 = ROL32(Ema1, 21); Ese0 ^= De0; BCu0 = ROL32(Ese0, 1); Asa0 = BCa0 ^ ANDN32(BCe0, BCi0); Ase0 = BCe0 ^ ANDN32(BCi0, BCo0); Asi0 = BCi0 ^ ANDN32(BCo0, BCu0); Aso0 = BCo0 ^ ANDN32(BCu0, BCa0); Asu0 = BCu0 ^ ANDN32(BCa0, BCe0); Ebi1 ^= Di1; BCa1 = ROL32(Ebi1, 31); Ego0 ^= Do0; BCe1 = ROL32(Ego0, 27); Eku0 ^= Du0; BCi1 = ROL32(Eku0, 19); Ema0 ^= Da0; BCo1 = ROL32(Ema0, 20); Ese1 ^= De1; BCu1 = ROL32(Ese1, 1); Asa1 = BCa1 ^ ANDN32(BCe1, BCi1); Ase1 = BCe1 ^ ANDN32(BCi1, BCo1); Asi1 = BCi1 ^ ANDN32(BCo1, BCu1); Aso1 = BCo1 ^ ANDN32(BCu1, BCa1); Asu1 = BCu1 ^ ANDN32(BCa1, BCe1); } while (round_consts < round_consts_end); state[0] = Aba0; state[1] = Aba1; state[2] = Abe0; state[3] = Abe1; state[4] = Abi0; state[5] = Abi1; state[6] = Abo0; state[7] = Abo1; state[8] = Abu0; state[9] = Abu1; state[10] = Aga0; state[11] = Aga1; state[12] = Age0; state[13] = Age1; state[14] = Agi0; state[15] = Agi1; state[16] = Ago0; state[17] = Ago1; state[18] = Agu0; state[19] = Agu1; state[20] = Aka0; state[21] = Aka1; state[22] = Ake0; state[23] = Ake1; state[24] = Aki0; state[25] = Aki1; state[26] = Ako0; state[27] = Ako1; state[28] = Aku0; state[29] = Aku1; state[30] = Ama0; state[31] = Ama1; state[32] = Ame0; state[33] = Ame1; state[34] = Ami0; state[35] = Ami1; state[36] = Amo0; state[37] = Amo1; state[38] = Amu0; state[39] = Amu1; state[40] = Asa0; state[41] = Asa1; state[42] = Ase0; state[43] = Ase1; state[44] = Asi0; state[45] = Asi1; state[46] = Aso0; state[47] = Aso1; state[48] = Asu0; state[49] = Asu1; return sizeof(void *) * 4 + sizeof(u32) * 12 * 5 * 2; } grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/cipher/sha512.c0000644000175000017500000007614615036452441022030 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ #include GRUB_MOD_LICENSE ("GPLv3+"); /* sha512.c - SHA384 and SHA512 hash functions * Copyright (C) 2003, 2008, 2009 Free Software Foundation, Inc. * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . */ /* Test vectors from FIPS-180-2: * * "abc" * 384: * CB00753F 45A35E8B B5A03D69 9AC65007 272C32AB 0EDED163 * 1A8B605A 43FF5BED 8086072B A1E7CC23 58BAECA1 34C825A7 * 512: * DDAF35A1 93617ABA CC417349 AE204131 12E6FA4E 89A97EA2 0A9EEEE6 4B55D39A * 2192992A 274FC1A8 36BA3C23 A3FEEBBD 454D4423 643CE80E 2A9AC94F A54CA49F * * "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu" * 384: * 09330C33 F71147E8 3D192FC7 82CD1B47 53111B17 3B3B05D2 * 2FA08086 E3B0F712 FCC7C71A 557E2DB9 66C3E9FA 91746039 * 512: * 8E959B75 DAE313DA 8CF4F728 14FC143F 8F7779C6 EB9F7FA1 7299AEAD B6889018 * 501D289E 4900F7E4 331B99DE C4B5433A C7D329EE B6DD2654 5E96E55B 874BE909 * * "a" x 1000000 * 384: * 9D0E1809 716474CB 086E834E 310A4A1C ED149E9C 00F24852 * 7972CEC5 704C2A5B 07B8B3DC 38ECC4EB AE97DDD8 7F3D8985 * 512: * E718483D 0CE76964 4E2E42C7 BC15B463 8E1F98B1 3B204428 5632A803 AFA973EB * DE0FF244 877EA60A 4CB0432C E577C31B EB009C5C 2C49AA2E 4EADB217 AD8CC09B */ #include "g10lib.h" #include "bithelp.h" #include "bufhelp.h" #include "cipher.h" #include "hash-common.h" /* Helper macro to force alignment to 64 bytes. */ #ifdef HAVE_GCC_ATTRIBUTE_ALIGNED # define ATTR_ALIGNED_64 __attribute__ ((aligned (64))) #else # define ATTR_ALIGNED_64 #endif /* USE_ARM_NEON_ASM indicates whether to enable ARM NEON assembly code. */ #undef USE_ARM_NEON_ASM #ifdef ENABLE_NEON_SUPPORT # if defined(HAVE_ARM_ARCH_V6) && defined(__ARMEL__) \ && defined(HAVE_COMPATIBLE_GCC_ARM_PLATFORM_AS) \ && defined(HAVE_GCC_INLINE_ASM_NEON) # define USE_ARM_NEON_ASM 1 # endif #endif /*ENABLE_NEON_SUPPORT*/ /* USE_ARM_ASM indicates whether to enable ARM assembly code. */ #undef USE_ARM_ASM #if defined(__ARMEL__) && defined(HAVE_COMPATIBLE_GCC_ARM_PLATFORM_AS) # define USE_ARM_ASM 1 #endif /* USE_ARM64_SHA512 indicates whether to enable ARMv8 SHA512 extension assembly * code. */ #undef USE_ARM64_SHA512 #ifdef ENABLE_ARM_CRYPTO_SUPPORT # if defined(__AARCH64EL__) \ && defined(HAVE_COMPATIBLE_GCC_AARCH64_PLATFORM_AS) \ && defined(HAVE_GCC_INLINE_ASM_AARCH64_SHA3_SHA512_SM3_SM4) # define USE_ARM64_SHA512 1 # endif #endif /* USE_SSSE3 indicates whether to compile with Intel SSSE3 code. */ #undef USE_SSSE3 #if defined(__x86_64__) && defined(HAVE_GCC_INLINE_ASM_SSSE3) && \ defined(HAVE_INTEL_SYNTAX_PLATFORM_AS) && \ (defined(HAVE_COMPATIBLE_GCC_AMD64_PLATFORM_AS) || \ defined(HAVE_COMPATIBLE_GCC_WIN64_PLATFORM_AS)) # define USE_SSSE3 1 #endif /* USE_AVX indicates whether to compile with Intel AVX code. */ #undef USE_AVX #if defined(__x86_64__) && defined(HAVE_GCC_INLINE_ASM_AVX) && \ defined(HAVE_INTEL_SYNTAX_PLATFORM_AS) && \ (defined(HAVE_COMPATIBLE_GCC_AMD64_PLATFORM_AS) || \ defined(HAVE_COMPATIBLE_GCC_WIN64_PLATFORM_AS)) # define USE_AVX 1 #endif /* USE_AVX2 indicates whether to compile with Intel AVX2/rorx code. */ #undef USE_AVX2 #if defined(__x86_64__) && defined(HAVE_GCC_INLINE_ASM_AVX2) && \ defined(HAVE_GCC_INLINE_ASM_BMI2) && \ defined(HAVE_INTEL_SYNTAX_PLATFORM_AS) && \ (defined(HAVE_COMPATIBLE_GCC_AMD64_PLATFORM_AS) || \ defined(HAVE_COMPATIBLE_GCC_WIN64_PLATFORM_AS)) # define USE_AVX2 1 #endif /* USE_AVX512 indicates whether to compile with Intel AVX512 code. */ #undef USE_AVX512 #if defined(__x86_64__) && defined(HAVE_GCC_INLINE_ASM_AVX512) && \ defined(HAVE_INTEL_SYNTAX_PLATFORM_AS) && \ (defined(HAVE_COMPATIBLE_GCC_AMD64_PLATFORM_AS) || \ defined(HAVE_COMPATIBLE_GCC_WIN64_PLATFORM_AS)) # define USE_AVX512 1 #endif /* USE_SSSE3_I386 indicates whether to compile with Intel SSSE3/i386 code. */ #undef USE_SSSE3_I386 #if defined(__i386__) && SIZEOF_UNSIGNED_LONG == 4 && __GNUC__ >= 4 && \ defined(HAVE_GCC_INLINE_ASM_SSSE3) # define USE_SSSE3_I386 1 #endif /* USE_PPC_CRYPTO indicates whether to enable PowerPC vector crypto * accelerated code. */ #undef USE_PPC_CRYPTO #ifdef ENABLE_PPC_CRYPTO_SUPPORT # if defined(HAVE_COMPATIBLE_CC_PPC_ALTIVEC) && \ defined(HAVE_GCC_INLINE_ASM_PPC_ALTIVEC) # if __GNUC__ >= 4 # define USE_PPC_CRYPTO 1 # endif # endif #endif /* USE_S390X_CRYPTO indicates whether to enable zSeries code. */ #undef USE_S390X_CRYPTO #if defined(HAVE_GCC_INLINE_ASM_S390X) # define USE_S390X_CRYPTO 1 #endif /* USE_S390X_CRYPTO */ typedef struct { u64 h[8]; } SHA512_STATE; typedef struct { gcry_md_block_ctx_t bctx; SHA512_STATE state; #ifdef USE_S390X_CRYPTO u64 final_len_msb, final_len_lsb; /* needs to be right after state.h[7]. */ int use_s390x_crypto; #endif } SHA512_CONTEXT; static ATTR_ALIGNED_64 const u64 k[] = { U64_C(0x428a2f98d728ae22), U64_C(0x7137449123ef65cd), U64_C(0xb5c0fbcfec4d3b2f), U64_C(0xe9b5dba58189dbbc), U64_C(0x3956c25bf348b538), U64_C(0x59f111f1b605d019), U64_C(0x923f82a4af194f9b), U64_C(0xab1c5ed5da6d8118), U64_C(0xd807aa98a3030242), U64_C(0x12835b0145706fbe), U64_C(0x243185be4ee4b28c), U64_C(0x550c7dc3d5ffb4e2), U64_C(0x72be5d74f27b896f), U64_C(0x80deb1fe3b1696b1), U64_C(0x9bdc06a725c71235), U64_C(0xc19bf174cf692694), U64_C(0xe49b69c19ef14ad2), U64_C(0xefbe4786384f25e3), U64_C(0x0fc19dc68b8cd5b5), U64_C(0x240ca1cc77ac9c65), U64_C(0x2de92c6f592b0275), U64_C(0x4a7484aa6ea6e483), U64_C(0x5cb0a9dcbd41fbd4), U64_C(0x76f988da831153b5), U64_C(0x983e5152ee66dfab), U64_C(0xa831c66d2db43210), U64_C(0xb00327c898fb213f), U64_C(0xbf597fc7beef0ee4), U64_C(0xc6e00bf33da88fc2), U64_C(0xd5a79147930aa725), U64_C(0x06ca6351e003826f), U64_C(0x142929670a0e6e70), U64_C(0x27b70a8546d22ffc), U64_C(0x2e1b21385c26c926), U64_C(0x4d2c6dfc5ac42aed), U64_C(0x53380d139d95b3df), U64_C(0x650a73548baf63de), U64_C(0x766a0abb3c77b2a8), U64_C(0x81c2c92e47edaee6), U64_C(0x92722c851482353b), U64_C(0xa2bfe8a14cf10364), U64_C(0xa81a664bbc423001), U64_C(0xc24b8b70d0f89791), U64_C(0xc76c51a30654be30), U64_C(0xd192e819d6ef5218), U64_C(0xd69906245565a910), U64_C(0xf40e35855771202a), U64_C(0x106aa07032bbd1b8), U64_C(0x19a4c116b8d2d0c8), U64_C(0x1e376c085141ab53), U64_C(0x2748774cdf8eeb99), U64_C(0x34b0bcb5e19b48a8), U64_C(0x391c0cb3c5c95a63), U64_C(0x4ed8aa4ae3418acb), U64_C(0x5b9cca4f7763e373), U64_C(0x682e6ff3d6b2b8a3), U64_C(0x748f82ee5defb2fc), U64_C(0x78a5636f43172f60), U64_C(0x84c87814a1f0ab72), U64_C(0x8cc702081a6439ec), U64_C(0x90befffa23631e28), U64_C(0xa4506cebde82bde9), U64_C(0xbef9a3f7b2c67915), U64_C(0xc67178f2e372532b), U64_C(0xca273eceea26619c), U64_C(0xd186b8c721c0c207), U64_C(0xeada7dd6cde0eb1e), U64_C(0xf57d4f7fee6ed178), U64_C(0x06f067aa72176fba), U64_C(0x0a637dc5a2c898a6), U64_C(0x113f9804bef90dae), U64_C(0x1b710b35131c471b), U64_C(0x28db77f523047d84), U64_C(0x32caab7b40c72493), U64_C(0x3c9ebe0a15c9bebc), U64_C(0x431d67c49c100d4c), U64_C(0x4cc5d4becb3e42b6), U64_C(0x597f299cfc657e2a), U64_C(0x5fcb6fab3ad6faec), U64_C(0x6c44198c4a475817) }; /* AMD64 assembly implementations use SystemV ABI, ABI conversion and additional * stack to store XMM6-XMM15 needed on Win64. */ #undef ASM_FUNC_ABI #undef ASM_EXTRA_STACK #if defined(USE_SSSE3) || defined(USE_AVX) || defined(USE_AVX2) \ || defined(USE_AVX512) # ifdef HAVE_COMPATIBLE_GCC_WIN64_PLATFORM_AS # define ASM_FUNC_ABI __attribute__((sysv_abi)) # define ASM_EXTRA_STACK (10 * 16 + 4 * sizeof(void *)) # else # define ASM_FUNC_ABI # define ASM_EXTRA_STACK 0 # endif #endif #ifdef USE_ARM64_SHA512 unsigned int _gcry_sha512_transform_armv8_ce (u64 state[8], const unsigned char *data, size_t num_blks, const u64 k[]); static unsigned int do_sha512_transform_armv8_ce(void *ctx, const unsigned char *data, size_t nblks) { SHA512_CONTEXT *hd = ctx; return _gcry_sha512_transform_armv8_ce (hd->state.h, data, nblks, k); } #endif #ifdef USE_ARM_NEON_ASM unsigned int _gcry_sha512_transform_armv7_neon (SHA512_STATE *hd, const unsigned char *data, const u64 k[], size_t num_blks); static unsigned int do_sha512_transform_armv7_neon(void *ctx, const unsigned char *data, size_t nblks) { SHA512_CONTEXT *hd = ctx; return _gcry_sha512_transform_armv7_neon (&hd->state, data, k, nblks); } #endif #ifdef USE_SSSE3 unsigned int _gcry_sha512_transform_amd64_ssse3(const void *input_data, void *state, size_t num_blks) ASM_FUNC_ABI; static unsigned int do_sha512_transform_amd64_ssse3(void *ctx, const unsigned char *data, size_t nblks) { SHA512_CONTEXT *hd = ctx; unsigned int burn; burn = _gcry_sha512_transform_amd64_ssse3 (data, &hd->state, nblks); burn += burn > 0 ? ASM_EXTRA_STACK : 0; return burn; } #endif #ifdef USE_AVX unsigned int _gcry_sha512_transform_amd64_avx(const void *input_data, void *state, size_t num_blks) ASM_FUNC_ABI; static unsigned int do_sha512_transform_amd64_avx(void *ctx, const unsigned char *data, size_t nblks) { SHA512_CONTEXT *hd = ctx; unsigned int burn; burn = _gcry_sha512_transform_amd64_avx (data, &hd->state, nblks); burn += burn > 0 ? ASM_EXTRA_STACK : 0; return burn; } #endif #ifdef USE_AVX2 unsigned int _gcry_sha512_transform_amd64_avx2(const void *input_data, void *state, size_t num_blks) ASM_FUNC_ABI; static unsigned int do_sha512_transform_amd64_avx2(void *ctx, const unsigned char *data, size_t nblks) { SHA512_CONTEXT *hd = ctx; unsigned int burn; burn = _gcry_sha512_transform_amd64_avx2 (data, &hd->state, nblks); burn += burn > 0 ? ASM_EXTRA_STACK : 0; return burn; } #endif #ifdef USE_AVX512 unsigned int _gcry_sha512_transform_amd64_avx512(const void *input_data, void *state, size_t num_blks) ASM_FUNC_ABI; static unsigned int do_sha512_transform_amd64_avx512(void *ctx, const unsigned char *data, size_t nblks) { SHA512_CONTEXT *hd = ctx; unsigned int burn; burn = _gcry_sha512_transform_amd64_avx512 (data, &hd->state, nblks); burn += burn > 0 ? ASM_EXTRA_STACK : 0; return burn; } #endif #ifdef USE_SSSE3_I386 unsigned int _gcry_sha512_transform_i386_ssse3(u64 state[8], const unsigned char *input_data, size_t num_blks); static unsigned int do_sha512_transform_i386_ssse3(void *ctx, const unsigned char *data, size_t nblks) { SHA512_CONTEXT *hd = ctx; return _gcry_sha512_transform_i386_ssse3 (hd->state.h, data, nblks); } #endif #ifdef USE_ARM_ASM unsigned int _gcry_sha512_transform_arm (SHA512_STATE *hd, const unsigned char *data, const u64 k[], size_t num_blks); static unsigned int do_transform_generic (void *context, const unsigned char *data, size_t nblks) { SHA512_CONTEXT *hd = context; return _gcry_sha512_transform_arm (&hd->state, data, k, nblks); } #else static unsigned int do_transform_generic (void *context, const unsigned char *data, size_t nblks); #endif #ifdef USE_PPC_CRYPTO unsigned int _gcry_sha512_transform_ppc8(u64 state[8], const unsigned char *input_data, size_t num_blks); unsigned int _gcry_sha512_transform_ppc9(u64 state[8], const unsigned char *input_data, size_t num_blks); static unsigned int do_sha512_transform_ppc8(void *ctx, const unsigned char *data, size_t nblks) { SHA512_CONTEXT *hd = ctx; return _gcry_sha512_transform_ppc8 (hd->state.h, data, nblks); } static unsigned int do_sha512_transform_ppc9(void *ctx, const unsigned char *data, size_t nblks) { SHA512_CONTEXT *hd = ctx; return _gcry_sha512_transform_ppc9 (hd->state.h, data, nblks); } #endif #ifdef USE_S390X_CRYPTO #include "asm-inline-s390x.h" static unsigned int do_sha512_transform_s390x (void *ctx, const unsigned char *data, size_t nblks) { SHA512_CONTEXT *hd = ctx; kimd_execute (KMID_FUNCTION_SHA512, hd->state.h, data, nblks * 128); return 0; } static unsigned int do_sha512_final_s390x (void *ctx, const unsigned char *data, size_t datalen, u64 len_msb, u64 len_lsb) { SHA512_CONTEXT *hd = ctx; /* Make sure that 'final_len' is positioned at correct offset relative * to 'state.h[0]'. This is because we are passing 'state.h[0]' pointer as * start of parameter block to 'klmd' instruction. */ gcry_assert (offsetof (SHA512_CONTEXT, final_len_msb) - offsetof (SHA512_CONTEXT, state.h[0]) == 8 * sizeof(u64)); gcry_assert (offsetof (SHA512_CONTEXT, final_len_lsb) - offsetof (SHA512_CONTEXT, final_len_msb) == 1 * sizeof(u64)); hd->final_len_msb = len_msb; hd->final_len_lsb = len_lsb; klmd_execute (KMID_FUNCTION_SHA512, hd->state.h, data, datalen); return 0; } #endif static void sha512_init_common (SHA512_CONTEXT *ctx, unsigned int flags) { unsigned int features = _gcry_get_hw_features (); (void)flags; (void)k; ctx->bctx.nblocks = 0; ctx->bctx.nblocks_high = 0; ctx->bctx.count = 0; ctx->bctx.blocksize_shift = _gcry_ctz(128); /* Order of feature checks is important here; last match will be * selected. Keep slower implementations at the top and faster at * the bottom. */ ctx->bctx.bwrite = do_transform_generic; #ifdef USE_ARM_NEON_ASM if ((features & HWF_ARM_NEON) != 0) ctx->bctx.bwrite = do_sha512_transform_armv7_neon; #endif #ifdef USE_ARM64_SHA512 if ((features & HWF_ARM_NEON) && (features & HWF_ARM_SHA512)) ctx->bctx.bwrite = do_sha512_transform_armv8_ce; #endif #ifdef USE_SSSE3 if ((features & HWF_INTEL_SSSE3) != 0) ctx->bctx.bwrite = do_sha512_transform_amd64_ssse3; #endif #ifdef USE_AVX if ((features & HWF_INTEL_AVX) && (features & HWF_INTEL_FAST_SHLD)) ctx->bctx.bwrite = do_sha512_transform_amd64_avx; #endif #ifdef USE_AVX2 if ((features & HWF_INTEL_AVX2) && (features & HWF_INTEL_BMI2)) ctx->bctx.bwrite = do_sha512_transform_amd64_avx2; #endif #ifdef USE_AVX512 if ((features & HWF_INTEL_AVX512) && (features & HWF_INTEL_CPU)) ctx->bctx.bwrite = do_sha512_transform_amd64_avx512; #endif #ifdef USE_PPC_CRYPTO if ((features & HWF_PPC_VCRYPTO) != 0) ctx->bctx.bwrite = do_sha512_transform_ppc8; if ((features & HWF_PPC_VCRYPTO) != 0 && (features & HWF_PPC_ARCH_3_00) != 0) ctx->bctx.bwrite = do_sha512_transform_ppc9; #endif #ifdef USE_SSSE3_I386 if ((features & HWF_INTEL_SSSE3) != 0) ctx->bctx.bwrite = do_sha512_transform_i386_ssse3; #endif #ifdef USE_S390X_CRYPTO ctx->use_s390x_crypto = 0; if ((features & HWF_S390X_MSA) != 0) { if ((kimd_query () & km_function_to_mask (KMID_FUNCTION_SHA512)) && (klmd_query () & km_function_to_mask (KMID_FUNCTION_SHA512))) { ctx->bctx.bwrite = do_sha512_transform_s390x; ctx->use_s390x_crypto = 1; } } #endif (void)features; } static void sha512_init (void *context, unsigned int flags) { SHA512_CONTEXT *ctx = context; SHA512_STATE *hd = &ctx->state; hd->h[0] = U64_C(0x6a09e667f3bcc908); hd->h[1] = U64_C(0xbb67ae8584caa73b); hd->h[2] = U64_C(0x3c6ef372fe94f82b); hd->h[3] = U64_C(0xa54ff53a5f1d36f1); hd->h[4] = U64_C(0x510e527fade682d1); hd->h[5] = U64_C(0x9b05688c2b3e6c1f); hd->h[6] = U64_C(0x1f83d9abfb41bd6b); hd->h[7] = U64_C(0x5be0cd19137e2179); sha512_init_common (ctx, flags); } static void sha384_init (void *context, unsigned int flags) { SHA512_CONTEXT *ctx = context; SHA512_STATE *hd = &ctx->state; hd->h[0] = U64_C(0xcbbb9d5dc1059ed8); hd->h[1] = U64_C(0x629a292a367cd507); hd->h[2] = U64_C(0x9159015a3070dd17); hd->h[3] = U64_C(0x152fecd8f70e5939); hd->h[4] = U64_C(0x67332667ffc00b31); hd->h[5] = U64_C(0x8eb44a8768581511); hd->h[6] = U64_C(0xdb0c2e0d64f98fa7); hd->h[7] = U64_C(0x47b5481dbefa4fa4); sha512_init_common (ctx, flags); } static void sha512_256_init (void *context, unsigned int flags) { SHA512_CONTEXT *ctx = context; SHA512_STATE *hd = &ctx->state; hd->h[0] = U64_C(0x22312194fc2bf72c); hd->h[1] = U64_C(0x9f555fa3c84c64c2); hd->h[2] = U64_C(0x2393b86b6f53b151); hd->h[3] = U64_C(0x963877195940eabd); hd->h[4] = U64_C(0x96283ee2a88effe3); hd->h[5] = U64_C(0xbe5e1e2553863992); hd->h[6] = U64_C(0x2b0199fc2c85b8aa); hd->h[7] = U64_C(0x0eb72ddc81c52ca2); sha512_init_common (ctx, flags); } static void sha512_224_init (void *context, unsigned int flags) { SHA512_CONTEXT *ctx = context; SHA512_STATE *hd = &ctx->state; hd->h[0] = U64_C(0x8c3d37c819544da2); hd->h[1] = U64_C(0x73e1996689dcd4d6); hd->h[2] = U64_C(0x1dfab7ae32ff9c82); hd->h[3] = U64_C(0x679dd514582f9fcf); hd->h[4] = U64_C(0x0f6d2b697bd44da8); hd->h[5] = U64_C(0x77e36f7304c48942); hd->h[6] = U64_C(0x3f9d85a86a1d36c8); hd->h[7] = U64_C(0x1112e6ad91d692a1); sha512_init_common (ctx, flags); } #ifndef USE_ARM_ASM static inline u64 ROTR (u64 x, u64 n) { return ((x >> n) | (x << (64 - n))); } static inline u64 Ch (u64 x, u64 y, u64 z) { return ((x & y) ^ ( ~x & z)); } static inline u64 Maj (u64 x, u64 y, u64 z) { return ((x & y) ^ (x & z) ^ (y & z)); } static inline u64 Sum0 (u64 x) { return (ROTR (x, 28) ^ ROTR (x, 34) ^ ROTR (x, 39)); } static inline u64 Sum1 (u64 x) { return (ROTR (x, 14) ^ ROTR (x, 18) ^ ROTR (x, 41)); } /**************** * Transform the message W which consists of 16 64-bit-words */ static unsigned int do_transform_generic (void *context, const unsigned char *data, size_t nblks) { SHA512_CONTEXT *ctx = context; SHA512_STATE *hd = &ctx->state; do { u64 a, b, c, d, e, f, g, h; u64 w[16]; int t; /* get values from the chaining vars */ a = hd->h[0]; b = hd->h[1]; c = hd->h[2]; d = hd->h[3]; e = hd->h[4]; f = hd->h[5]; g = hd->h[6]; h = hd->h[7]; for ( t = 0; t < 16; t++ ) w[t] = buf_get_be64(data + t * 8); #define S0(x) (ROTR((x),1) ^ ROTR((x),8) ^ ((x)>>7)) #define S1(x) (ROTR((x),19) ^ ROTR((x),61) ^ ((x)>>6)) for (t = 0; t < 80 - 16; ) { u64 t1, t2; t1 = h + Sum1 (e) + Ch (e, f, g) + k[t] + w[0]; w[0] += S1 (w[14]) + w[9] + S0 (w[1]); t2 = Sum0 (a) + Maj (a, b, c); d += t1; h = t1 + t2; t1 = g + Sum1 (d) + Ch (d, e, f) + k[t+1] + w[1]; w[1] += S1 (w[15]) + w[10] + S0 (w[2]); t2 = Sum0 (h) + Maj (h, a, b); c += t1; g = t1 + t2; t1 = f + Sum1 (c) + Ch (c, d, e) + k[t+2] + w[2]; w[2] += S1 (w[0]) + w[11] + S0 (w[3]); t2 = Sum0 (g) + Maj (g, h, a); b += t1; f = t1 + t2; t1 = e + Sum1 (b) + Ch (b, c, d) + k[t+3] + w[3]; w[3] += S1 (w[1]) + w[12] + S0 (w[4]); t2 = Sum0 (f) + Maj (f, g, h); a += t1; e = t1 + t2; t1 = d + Sum1 (a) + Ch (a, b, c) + k[t+4] + w[4]; w[4] += S1 (w[2]) + w[13] + S0 (w[5]); t2 = Sum0 (e) + Maj (e, f, g); h += t1; d = t1 + t2; t1 = c + Sum1 (h) + Ch (h, a, b) + k[t+5] + w[5]; w[5] += S1 (w[3]) + w[14] + S0 (w[6]); t2 = Sum0 (d) + Maj (d, e, f); g += t1; c = t1 + t2; t1 = b + Sum1 (g) + Ch (g, h, a) + k[t+6] + w[6]; w[6] += S1 (w[4]) + w[15] + S0 (w[7]); t2 = Sum0 (c) + Maj (c, d, e); f += t1; b = t1 + t2; t1 = a + Sum1 (f) + Ch (f, g, h) + k[t+7] + w[7]; w[7] += S1 (w[5]) + w[0] + S0 (w[8]); t2 = Sum0 (b) + Maj (b, c, d); e += t1; a = t1 + t2; t1 = h + Sum1 (e) + Ch (e, f, g) + k[t+8] + w[8]; w[8] += S1 (w[6]) + w[1] + S0 (w[9]); t2 = Sum0 (a) + Maj (a, b, c); d += t1; h = t1 + t2; t1 = g + Sum1 (d) + Ch (d, e, f) + k[t+9] + w[9]; w[9] += S1 (w[7]) + w[2] + S0 (w[10]); t2 = Sum0 (h) + Maj (h, a, b); c += t1; g = t1 + t2; t1 = f + Sum1 (c) + Ch (c, d, e) + k[t+10] + w[10]; w[10] += S1 (w[8]) + w[3] + S0 (w[11]); t2 = Sum0 (g) + Maj (g, h, a); b += t1; f = t1 + t2; t1 = e + Sum1 (b) + Ch (b, c, d) + k[t+11] + w[11]; w[11] += S1 (w[9]) + w[4] + S0 (w[12]); t2 = Sum0 (f) + Maj (f, g, h); a += t1; e = t1 + t2; t1 = d + Sum1 (a) + Ch (a, b, c) + k[t+12] + w[12]; w[12] += S1 (w[10]) + w[5] + S0 (w[13]); t2 = Sum0 (e) + Maj (e, f, g); h += t1; d = t1 + t2; t1 = c + Sum1 (h) + Ch (h, a, b) + k[t+13] + w[13]; w[13] += S1 (w[11]) + w[6] + S0 (w[14]); t2 = Sum0 (d) + Maj (d, e, f); g += t1; c = t1 + t2; t1 = b + Sum1 (g) + Ch (g, h, a) + k[t+14] + w[14]; w[14] += S1 (w[12]) + w[7] + S0 (w[15]); t2 = Sum0 (c) + Maj (c, d, e); f += t1; b = t1 + t2; t1 = a + Sum1 (f) + Ch (f, g, h) + k[t+15] + w[15]; w[15] += S1 (w[13]) + w[8] + S0 (w[0]); t2 = Sum0 (b) + Maj (b, c, d); e += t1; a = t1 + t2; t += 16; } for (; t < 80; ) { u64 t1, t2; t1 = h + Sum1 (e) + Ch (e, f, g) + k[t] + w[0]; t2 = Sum0 (a) + Maj (a, b, c); d += t1; h = t1 + t2; t1 = g + Sum1 (d) + Ch (d, e, f) + k[t+1] + w[1]; t2 = Sum0 (h) + Maj (h, a, b); c += t1; g = t1 + t2; t1 = f + Sum1 (c) + Ch (c, d, e) + k[t+2] + w[2]; t2 = Sum0 (g) + Maj (g, h, a); b += t1; f = t1 + t2; t1 = e + Sum1 (b) + Ch (b, c, d) + k[t+3] + w[3]; t2 = Sum0 (f) + Maj (f, g, h); a += t1; e = t1 + t2; t1 = d + Sum1 (a) + Ch (a, b, c) + k[t+4] + w[4]; t2 = Sum0 (e) + Maj (e, f, g); h += t1; d = t1 + t2; t1 = c + Sum1 (h) + Ch (h, a, b) + k[t+5] + w[5]; t2 = Sum0 (d) + Maj (d, e, f); g += t1; c = t1 + t2; t1 = b + Sum1 (g) + Ch (g, h, a) + k[t+6] + w[6]; t2 = Sum0 (c) + Maj (c, d, e); f += t1; b = t1 + t2; t1 = a + Sum1 (f) + Ch (f, g, h) + k[t+7] + w[7]; t2 = Sum0 (b) + Maj (b, c, d); e += t1; a = t1 + t2; t1 = h + Sum1 (e) + Ch (e, f, g) + k[t+8] + w[8]; t2 = Sum0 (a) + Maj (a, b, c); d += t1; h = t1 + t2; t1 = g + Sum1 (d) + Ch (d, e, f) + k[t+9] + w[9]; t2 = Sum0 (h) + Maj (h, a, b); c += t1; g = t1 + t2; t1 = f + Sum1 (c) + Ch (c, d, e) + k[t+10] + w[10]; t2 = Sum0 (g) + Maj (g, h, a); b += t1; f = t1 + t2; t1 = e + Sum1 (b) + Ch (b, c, d) + k[t+11] + w[11]; t2 = Sum0 (f) + Maj (f, g, h); a += t1; e = t1 + t2; t1 = d + Sum1 (a) + Ch (a, b, c) + k[t+12] + w[12]; t2 = Sum0 (e) + Maj (e, f, g); h += t1; d = t1 + t2; t1 = c + Sum1 (h) + Ch (h, a, b) + k[t+13] + w[13]; t2 = Sum0 (d) + Maj (d, e, f); g += t1; c = t1 + t2; t1 = b + Sum1 (g) + Ch (g, h, a) + k[t+14] + w[14]; t2 = Sum0 (c) + Maj (c, d, e); f += t1; b = t1 + t2; t1 = a + Sum1 (f) + Ch (f, g, h) + k[t+15] + w[15]; t2 = Sum0 (b) + Maj (b, c, d); e += t1; a = t1 + t2; t += 16; } /* Update chaining vars. */ hd->h[0] += a; hd->h[1] += b; hd->h[2] += c; hd->h[3] += d; hd->h[4] += e; hd->h[5] += f; hd->h[6] += g; hd->h[7] += h; data += 128; } while (--nblks); return (8 + 16) * sizeof(u64) + sizeof(u32) + 3 * sizeof(void*); } #endif /*!USE_ARM_ASM*/ /* The routine final terminates the computation and * returns the digest. * The handle is prepared for a new cycle, but adding bytes to the * handle will the destroy the returned buffer. * Returns: 64 bytes representing the digest. When used for sha384, * we take the leftmost 48 of those bytes. */ static void sha512_final (void *context) { SHA512_CONTEXT *hd = context; unsigned int burn; u64 t, th, msb, lsb; byte *p; t = hd->bctx.nblocks; /* if (sizeof t == sizeof hd->bctx.nblocks) */ th = hd->bctx.nblocks_high; /* else */ /* th = hd->bctx.nblocks >> 64; In case we ever use u128 */ /* multiply by 128 to make a byte count */ lsb = t << 7; msb = (th << 7) | (t >> 57); /* add the count */ t = lsb; if ((lsb += hd->bctx.count) < t) msb++; /* multiply by 8 to make a bit count */ t = lsb; lsb <<= 3; msb <<= 3; msb |= t >> 61; if (0) { } #ifdef USE_S390X_CRYPTO else if (hd->use_s390x_crypto) { burn = do_sha512_final_s390x (hd, hd->bctx.buf, hd->bctx.count, msb, lsb); } #endif else { if (hd->bctx.count < 112) { /* enough room */ hd->bctx.buf[hd->bctx.count++] = 0x80; /* pad */ if (hd->bctx.count < 112) memset (&hd->bctx.buf[hd->bctx.count], 0, 112 - hd->bctx.count); } else { /* need one extra block */ hd->bctx.buf[hd->bctx.count++] = 0x80; /* pad character */ if (hd->bctx.count < 128) memset (&hd->bctx.buf[hd->bctx.count], 0, 128 - hd->bctx.count); hd->bctx.count = 128; _gcry_md_block_write (context, NULL, 0); /* flush */ memset (hd->bctx.buf, 0, 112); /* fill next block with zeroes */ } /* append the 128 bit count */ buf_put_be64(hd->bctx.buf + 112, msb); buf_put_be64(hd->bctx.buf + 120, lsb); burn = (*hd->bctx.bwrite) (hd, hd->bctx.buf, 1); } p = hd->bctx.buf; #define X(a) do { buf_put_be64(p, hd->state.h[a]); p += 8; } while (0) X (0); X (1); X (2); X (3); X (4); X (5); /* Note that these last two chunks are included even for SHA384. We just ignore them. */ X (6); X (7); #undef X hd->bctx.count = 0; _gcry_burn_stack (burn); } static byte * sha512_read (void *context) { SHA512_CONTEXT *hd = (SHA512_CONTEXT *) context; return hd->bctx.buf; } /* Shortcut functions which puts the hash value of the supplied buffer iov * into outbuf which must have a size of 64 bytes. */ #define _gcry_sha512_hash_buffers 0 /* Shortcut functions which puts the hash value of the supplied buffer iov * into outbuf which must have a size of 48 bytes. */ #define _gcry_sha384_hash_buffers 0 /* Shortcut functions which puts the hash value of the supplied buffer iov * into outbuf which must have a size of 32 bytes. */ #define _gcry_sha512_256_hash_buffers 0 /* Shortcut functions which puts the hash value of the supplied buffer iov * into outbuf which must have a size of 28 bytes. */ #define _gcry_sha512_224_hash_buffers 0 /* Self-test section. */ /* Run a full self-test for ALGO and return 0 on success. */ static const byte sha512_asn[] = /* Object ID is 2.16.840.1.101.3.4.2.3 */ { 0x30, 0x51, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x03, 0x05, 0x00, 0x04, 0x40 }; static const gcry_md_oid_spec_t oid_spec_sha512[] = { { "2.16.840.1.101.3.4.2.3" }, /* PKCS#1 sha512WithRSAEncryption */ { "1.2.840.113549.1.1.13" }, /* ANSI X9.62 ecdsaWithSHA512 */ { "1.2.840.10045.4.3.4" }, { NULL } }; gcry_md_spec_t _gcry_digest_spec_sha512 = { GCRY_MD_SHA512, {0, 1}, "SHA512", sha512_asn, DIM (sha512_asn), oid_spec_sha512, 64, sha512_init, _gcry_md_block_write, sha512_final, sha512_read, NULL, _gcry_sha512_hash_buffers, sizeof (SHA512_CONTEXT), GRUB_UTIL_MODNAME("gcry_sha512") .blocksize = 128 }; static const byte sha384_asn[] = /* Object ID is 2.16.840.1.101.3.4.2.2 */ { 0x30, 0x41, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x02, 0x05, 0x00, 0x04, 0x30 }; static const gcry_md_oid_spec_t oid_spec_sha384[] = { { "2.16.840.1.101.3.4.2.2" }, /* PKCS#1 sha384WithRSAEncryption */ { "1.2.840.113549.1.1.12" }, /* SHA384WithECDSA: RFC 7427 (A.3.3.) */ { "1.2.840.10045.4.3.3" }, /* ANSI X9.62 ecdsaWithSHA384 */ { "1.2.840.10045.4.3.3" }, { NULL }, }; gcry_md_spec_t _gcry_digest_spec_sha384 = { GCRY_MD_SHA384, {0, 1}, "SHA384", sha384_asn, DIM (sha384_asn), oid_spec_sha384, 48, sha384_init, _gcry_md_block_write, sha512_final, sha512_read, NULL, _gcry_sha384_hash_buffers, sizeof (SHA512_CONTEXT), GRUB_UTIL_MODNAME("gcry_sha512") .blocksize = 128 }; static const byte sha512_256_asn[] = { 0x30, 0x31, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x06, 0x05, 0x00, 0x04, 0x20 }; static const gcry_md_oid_spec_t oid_spec_sha512_256[] = { { "2.16.840.1.101.3.4.2.6" }, { NULL }, }; gcry_md_spec_t _gcry_digest_spec_sha512_256 = { GCRY_MD_SHA512_256, {0, 1}, "SHA512_256", sha512_256_asn, DIM (sha512_256_asn), oid_spec_sha512_256, 32, sha512_256_init, _gcry_md_block_write, sha512_final, sha512_read, NULL, _gcry_sha512_256_hash_buffers, sizeof (SHA512_CONTEXT), GRUB_UTIL_MODNAME("gcry_sha512") .blocksize = 128 }; static const byte sha512_224_asn[] = { 0x30, 0x2d, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x05, 0x05, 0x00, 0x04, 0x1c }; static const gcry_md_oid_spec_t oid_spec_sha512_224[] = { { "2.16.840.1.101.3.4.2.5" }, { NULL }, }; gcry_md_spec_t _gcry_digest_spec_sha512_224 = { GCRY_MD_SHA512_224, {0, 1}, "SHA512_224", sha512_224_asn, DIM (sha512_224_asn), oid_spec_sha512_224, 28, sha512_224_init, _gcry_md_block_write, sha512_final, sha512_read, NULL, _gcry_sha512_224_hash_buffers, sizeof (SHA512_CONTEXT), GRUB_UTIL_MODNAME("gcry_sha512") .blocksize = 128 }; GRUB_MOD_INIT(gcry_sha512) { grub_md_register (&_gcry_digest_spec_sha512); grub_md_register (&_gcry_digest_spec_sha384); grub_md_register (&_gcry_digest_spec_sha512_256); grub_md_register (&_gcry_digest_spec_sha512_224); } GRUB_MOD_FINI(gcry_sha512) { grub_md_unregister (&_gcry_digest_spec_sha512); grub_md_unregister (&_gcry_digest_spec_sha384); grub_md_unregister (&_gcry_digest_spec_sha512_256); grub_md_unregister (&_gcry_digest_spec_sha512_224); } grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/cipher/sm3.c0000644000175000017500000003477515036452441021531 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ #include GRUB_MOD_LICENSE ("GPLv3+"); /* sm3.c - SM3 hash function * Copyright (C) 2017 Jia Zhang * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . */ /* Test vectors: "abc" SM3: 66c7f0f4 62eeedd9 d1f2d46b dc10e4e2 4167c487 5cf2f7a2 297da02b 8f4ba8e0 "abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcd" SM3: debe9ff9 2275b8a1 38604889 c18e5a4d 6fdb70e5 387e5765 293dcba3 9c0c5732 "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" SM3: 639b6cc5 e64d9e37 a390b192 df4fa1ea 0720ab74 7ff692b9 f38c4e66 ad7b8c05 "a" one million times SM3: c8aaf894 29554029 e231941a 2acc0ad6 1ff2a5ac d8fadd25 847a3a73 2b3b02c3 */ #include "g10lib.h" #include "bithelp.h" #include "bufhelp.h" #include "cipher.h" #include "hash-common.h" /* USE_AVX_BMI2 indicates whether to compile with Intel AVX/BMI2 code. */ #undef USE_AVX_BMI2 #if defined(__x86_64__) && defined(HAVE_GCC_INLINE_ASM_AVX) && \ defined(HAVE_GCC_INLINE_ASM_BMI2) && \ (defined(HAVE_COMPATIBLE_GCC_AMD64_PLATFORM_AS) || \ defined(HAVE_COMPATIBLE_GCC_WIN64_PLATFORM_AS)) # define USE_AVX_BMI2 1 #endif /* USE_AARCH64_SIMD indicates whether to enable ARMv8 SIMD assembly * code. */ #undef USE_AARCH64_SIMD #ifdef ENABLE_NEON_SUPPORT # if defined(__AARCH64EL__) \ && defined(HAVE_COMPATIBLE_GCC_AARCH64_PLATFORM_AS) \ && defined(HAVE_GCC_INLINE_ASM_AARCH64_NEON) # define USE_AARCH64_SIMD 1 # endif #endif /* USE_ARM_CE indicates whether to enable ARMv8 Crypto Extension code. */ #undef USE_ARM_CE #ifdef ENABLE_ARM_CRYPTO_SUPPORT # if defined(__AARCH64EL__) && \ defined(HAVE_COMPATIBLE_GCC_AARCH64_PLATFORM_AS) && \ defined(HAVE_GCC_INLINE_ASM_AARCH64_CRYPTO) # define USE_ARM_CE 1 # endif #endif typedef struct { gcry_md_block_ctx_t bctx; u32 h[8]; } SM3_CONTEXT; /* AMD64 assembly implementations use SystemV ABI, ABI conversion and additional * stack to store XMM6-XMM15 needed on Win64. */ #undef ASM_FUNC_ABI #undef ASM_EXTRA_STACK #if defined(USE_AVX_BMI2) # ifdef HAVE_COMPATIBLE_GCC_WIN64_PLATFORM_AS # define ASM_FUNC_ABI __attribute__((sysv_abi)) # define ASM_EXTRA_STACK (10 * 16 + 4 * sizeof(void *)) # else # define ASM_FUNC_ABI # define ASM_EXTRA_STACK 0 # endif #endif #ifdef USE_AVX_BMI2 unsigned int _gcry_sm3_transform_amd64_avx_bmi2(void *state, const void *input_data, size_t num_blks) ASM_FUNC_ABI; static unsigned int do_sm3_transform_amd64_avx_bmi2(void *context, const unsigned char *data, size_t nblks) { SM3_CONTEXT *hd = context; unsigned int nburn = _gcry_sm3_transform_amd64_avx_bmi2 (hd->h, data, nblks); nburn += nburn ? ASM_EXTRA_STACK : 0; return nburn; } #endif /* USE_AVX_BMI2 */ #ifdef USE_AARCH64_SIMD unsigned int _gcry_sm3_transform_aarch64(void *state, const void *input_data, size_t num_blks); static unsigned int do_sm3_transform_aarch64(void *context, const unsigned char *data, size_t nblks) { SM3_CONTEXT *hd = context; return _gcry_sm3_transform_aarch64 (hd->h, data, nblks); } #endif /* USE_AARCH64_SIMD */ #ifdef USE_ARM_CE void _gcry_sm3_transform_armv8_ce(void *state, const void *input_data, size_t num_blks); static unsigned int do_sm3_transform_armv8_ce(void *context, const unsigned char *data, size_t nblks) { SM3_CONTEXT *hd = context; _gcry_sm3_transform_armv8_ce (hd->h, data, nblks); return 0; } #endif /* USE_ARM_CE */ static unsigned int transform (void *c, const unsigned char *data, size_t nblks); static void sm3_init (void *context, unsigned int flags) { SM3_CONTEXT *hd = context; unsigned int features = _gcry_get_hw_features (); (void)flags; hd->h[0] = 0x7380166f; hd->h[1] = 0x4914b2b9; hd->h[2] = 0x172442d7; hd->h[3] = 0xda8a0600; hd->h[4] = 0xa96f30bc; hd->h[5] = 0x163138aa; hd->h[6] = 0xe38dee4d; hd->h[7] = 0xb0fb0e4e; hd->bctx.nblocks = 0; hd->bctx.nblocks_high = 0; hd->bctx.count = 0; hd->bctx.blocksize_shift = _gcry_ctz(64); hd->bctx.bwrite = transform; #ifdef USE_AVX_BMI2 if ((features & HWF_INTEL_AVX2) && (features & HWF_INTEL_BMI2)) hd->bctx.bwrite = do_sm3_transform_amd64_avx_bmi2; #endif #ifdef USE_AARCH64_SIMD if (features & HWF_ARM_NEON) hd->bctx.bwrite = do_sm3_transform_aarch64; #endif #ifdef USE_ARM_CE if (features & HWF_ARM_SM3) hd->bctx.bwrite = do_sm3_transform_armv8_ce; #endif (void)features; } /* Transform the message X which consists of 16 32-bit-words. See GM/T 004-2012 for details. */ #define R(i,a,b,c,d,e,f,g,h,t,w1,w2) do \ { \ ss1 = rol ((rol ((a), 12) + (e) + (t)), 7); \ ss2 = ss1 ^ rol ((a), 12); \ d += FF##i(a,b,c) + ss2 + ((w1) ^ (w2)); \ h += GG##i(e,f,g) + ss1 + (w1); \ b = rol ((b), 9); \ f = rol ((f), 19); \ h = P0 ((h)); \ } while (0) #define R1(a,b,c,d,e,f,g,h,t,w1,w2) R(1,a,b,c,d,e,f,g,h,t,w1,w2) #define R2(a,b,c,d,e,f,g,h,t,w1,w2) R(2,a,b,c,d,e,f,g,h,t,w1,w2) #define FF1(x, y, z) (x ^ y ^ z) #define FF2(x, y, z) ((x & y) | (x & z) | (y & z)) #define GG1(x, y, z) (x ^ y ^ z) #define GG2(x, y, z) ((x & y) | ( ~x & z)) /* Message expansion */ #define P0(x) ((x) ^ rol ((x), 9) ^ rol ((x), 17)) #define P1(x) ((x) ^ rol ((x), 15) ^ rol ((x), 23)) #define I(i) ( w[i] = buf_get_be32(data + i * 4) ) #define W1(i) ( w[i&0x0f] ) #define W2(i) ( w[i&0x0f] = P1(w[i &0x0f] \ ^ w[(i-9)&0x0f] \ ^ rol (w[(i-3)&0x0f], 15)) \ ^ rol (w[(i-13)&0x0f], 7) \ ^ w[(i-6)&0x0f] ) static unsigned int transform_blk (void *ctx, const unsigned char *data) { SM3_CONTEXT *hd = ctx; static const u32 K[64] = { 0x79cc4519, 0xf3988a32, 0xe7311465, 0xce6228cb, 0x9cc45197, 0x3988a32f, 0x7311465e, 0xe6228cbc, 0xcc451979, 0x988a32f3, 0x311465e7, 0x6228cbce, 0xc451979c, 0x88a32f39, 0x11465e73, 0x228cbce6, 0x9d8a7a87, 0x3b14f50f, 0x7629ea1e, 0xec53d43c, 0xd8a7a879, 0xb14f50f3, 0x629ea1e7, 0xc53d43ce, 0x8a7a879d, 0x14f50f3b, 0x29ea1e76, 0x53d43cec, 0xa7a879d8, 0x4f50f3b1, 0x9ea1e762, 0x3d43cec5, 0x7a879d8a, 0xf50f3b14, 0xea1e7629, 0xd43cec53, 0xa879d8a7, 0x50f3b14f, 0xa1e7629e, 0x43cec53d, 0x879d8a7a, 0x0f3b14f5, 0x1e7629ea, 0x3cec53d4, 0x79d8a7a8, 0xf3b14f50, 0xe7629ea1, 0xcec53d43, 0x9d8a7a87, 0x3b14f50f, 0x7629ea1e, 0xec53d43c, 0xd8a7a879, 0xb14f50f3, 0x629ea1e7, 0xc53d43ce, 0x8a7a879d, 0x14f50f3b, 0x29ea1e76, 0x53d43cec, 0xa7a879d8, 0x4f50f3b1, 0x9ea1e762, 0x3d43cec5 }; u32 a,b,c,d,e,f,g,h,ss1,ss2; u32 w[16]; a = hd->h[0]; b = hd->h[1]; c = hd->h[2]; d = hd->h[3]; e = hd->h[4]; f = hd->h[5]; g = hd->h[6]; h = hd->h[7]; R1(a, b, c, d, e, f, g, h, K[0], I(0), I(4)); R1(d, a, b, c, h, e, f, g, K[1], I(1), I(5)); R1(c, d, a, b, g, h, e, f, K[2], I(2), I(6)); R1(b, c, d, a, f, g, h, e, K[3], I(3), I(7)); R1(a, b, c, d, e, f, g, h, K[4], W1(4), I(8)); R1(d, a, b, c, h, e, f, g, K[5], W1(5), I(9)); R1(c, d, a, b, g, h, e, f, K[6], W1(6), I(10)); R1(b, c, d, a, f, g, h, e, K[7], W1(7), I(11)); R1(a, b, c, d, e, f, g, h, K[8], W1(8), I(12)); R1(d, a, b, c, h, e, f, g, K[9], W1(9), I(13)); R1(c, d, a, b, g, h, e, f, K[10], W1(10), I(14)); R1(b, c, d, a, f, g, h, e, K[11], W1(11), I(15)); R1(a, b, c, d, e, f, g, h, K[12], W1(12), W2(16)); R1(d, a, b, c, h, e, f, g, K[13], W1(13), W2(17)); R1(c, d, a, b, g, h, e, f, K[14], W1(14), W2(18)); R1(b, c, d, a, f, g, h, e, K[15], W1(15), W2(19)); R2(a, b, c, d, e, f, g, h, K[16], W1(16), W2(20)); R2(d, a, b, c, h, e, f, g, K[17], W1(17), W2(21)); R2(c, d, a, b, g, h, e, f, K[18], W1(18), W2(22)); R2(b, c, d, a, f, g, h, e, K[19], W1(19), W2(23)); R2(a, b, c, d, e, f, g, h, K[20], W1(20), W2(24)); R2(d, a, b, c, h, e, f, g, K[21], W1(21), W2(25)); R2(c, d, a, b, g, h, e, f, K[22], W1(22), W2(26)); R2(b, c, d, a, f, g, h, e, K[23], W1(23), W2(27)); R2(a, b, c, d, e, f, g, h, K[24], W1(24), W2(28)); R2(d, a, b, c, h, e, f, g, K[25], W1(25), W2(29)); R2(c, d, a, b, g, h, e, f, K[26], W1(26), W2(30)); R2(b, c, d, a, f, g, h, e, K[27], W1(27), W2(31)); R2(a, b, c, d, e, f, g, h, K[28], W1(28), W2(32)); R2(d, a, b, c, h, e, f, g, K[29], W1(29), W2(33)); R2(c, d, a, b, g, h, e, f, K[30], W1(30), W2(34)); R2(b, c, d, a, f, g, h, e, K[31], W1(31), W2(35)); R2(a, b, c, d, e, f, g, h, K[32], W1(32), W2(36)); R2(d, a, b, c, h, e, f, g, K[33], W1(33), W2(37)); R2(c, d, a, b, g, h, e, f, K[34], W1(34), W2(38)); R2(b, c, d, a, f, g, h, e, K[35], W1(35), W2(39)); R2(a, b, c, d, e, f, g, h, K[36], W1(36), W2(40)); R2(d, a, b, c, h, e, f, g, K[37], W1(37), W2(41)); R2(c, d, a, b, g, h, e, f, K[38], W1(38), W2(42)); R2(b, c, d, a, f, g, h, e, K[39], W1(39), W2(43)); R2(a, b, c, d, e, f, g, h, K[40], W1(40), W2(44)); R2(d, a, b, c, h, e, f, g, K[41], W1(41), W2(45)); R2(c, d, a, b, g, h, e, f, K[42], W1(42), W2(46)); R2(b, c, d, a, f, g, h, e, K[43], W1(43), W2(47)); R2(a, b, c, d, e, f, g, h, K[44], W1(44), W2(48)); R2(d, a, b, c, h, e, f, g, K[45], W1(45), W2(49)); R2(c, d, a, b, g, h, e, f, K[46], W1(46), W2(50)); R2(b, c, d, a, f, g, h, e, K[47], W1(47), W2(51)); R2(a, b, c, d, e, f, g, h, K[48], W1(48), W2(52)); R2(d, a, b, c, h, e, f, g, K[49], W1(49), W2(53)); R2(c, d, a, b, g, h, e, f, K[50], W1(50), W2(54)); R2(b, c, d, a, f, g, h, e, K[51], W1(51), W2(55)); R2(a, b, c, d, e, f, g, h, K[52], W1(52), W2(56)); R2(d, a, b, c, h, e, f, g, K[53], W1(53), W2(57)); R2(c, d, a, b, g, h, e, f, K[54], W1(54), W2(58)); R2(b, c, d, a, f, g, h, e, K[55], W1(55), W2(59)); R2(a, b, c, d, e, f, g, h, K[56], W1(56), W2(60)); R2(d, a, b, c, h, e, f, g, K[57], W1(57), W2(61)); R2(c, d, a, b, g, h, e, f, K[58], W1(58), W2(62)); R2(b, c, d, a, f, g, h, e, K[59], W1(59), W2(63)); R2(a, b, c, d, e, f, g, h, K[60], W1(60), W2(64)); R2(d, a, b, c, h, e, f, g, K[61], W1(61), W2(65)); R2(c, d, a, b, g, h, e, f, K[62], W1(62), W2(66)); R2(b, c, d, a, f, g, h, e, K[63], W1(63), W2(67)); hd->h[0] ^= a; hd->h[1] ^= b; hd->h[2] ^= c; hd->h[3] ^= d; hd->h[4] ^= e; hd->h[5] ^= f; hd->h[6] ^= g; hd->h[7] ^= h; return /*burn_stack*/ 26*4+32; } #undef P0 #undef P1 #undef R #undef R1 #undef R2 static unsigned int transform (void *ctx, const unsigned char *data, size_t nblks) { SM3_CONTEXT *hd = ctx; unsigned int burn; do { burn = transform_blk (hd, data); data += 64; } while (--nblks); return burn; } /* The routine finally terminates the computation and returns the digest. The handle is prepared for a new cycle, but adding bytes to the handle will the destroy the returned buffer. Returns: 32 bytes with the message the digest. */ static void sm3_final(void *context) { SM3_CONTEXT *hd = context; u32 t, th, msb, lsb; byte *p; unsigned int burn; t = hd->bctx.nblocks; if (sizeof t == sizeof hd->bctx.nblocks) th = hd->bctx.nblocks_high; else th = hd->bctx.nblocks >> 32; /* multiply by 64 to make a byte count */ lsb = t << 6; msb = (th << 6) | (t >> 26); /* add the count */ t = lsb; if ((lsb += hd->bctx.count) < t) msb++; /* multiply by 8 to make a bit count */ t = lsb; lsb <<= 3; msb <<= 3; msb |= t >> 29; if (hd->bctx.count < 56) /* enough room */ { hd->bctx.buf[hd->bctx.count++] = 0x80; /* pad */ if (hd->bctx.count < 56) memset (&hd->bctx.buf[hd->bctx.count], 0, 56 - hd->bctx.count); /* append the 64 bit count */ buf_put_be32(hd->bctx.buf + 56, msb); buf_put_be32(hd->bctx.buf + 60, lsb); burn = (*hd->bctx.bwrite) ( hd, hd->bctx.buf, 1 ); } else /* need one extra block */ { hd->bctx.buf[hd->bctx.count++] = 0x80; /* pad character */ /* fill pad and next block with zeroes */ memset (&hd->bctx.buf[hd->bctx.count], 0, 64 - hd->bctx.count + 56); /* append the 64 bit count */ buf_put_be32(hd->bctx.buf + 64 + 56, msb); buf_put_be32(hd->bctx.buf + 64 + 60, lsb); burn = (*hd->bctx.bwrite) ( hd, hd->bctx.buf, 2 ); } p = hd->bctx.buf; #define X(a) do { buf_put_be32(p, hd->h[a]); p += 4; } while(0) X(0); X(1); X(2); X(3); X(4); X(5); X(6); X(7); #undef X hd->bctx.count = 0; _gcry_burn_stack (burn); } static byte * sm3_read (void *context) { SM3_CONTEXT *hd = context; return hd->bctx.buf; } /* Shortcut functions which puts the hash value of the supplied buffer iov * into outbuf which must have a size of 32 bytes. */ #define _gcry_sm3_hash_buffers 0 /* Self-test section. */ /* Run a full self-test for ALGO and return 0 on success. */ static const byte asn_sm3[] = /* Object ID is 1.2.156.10197.401 */ { 0x30, 0x2F, 0x30, 0x0B, 0x06, 0x07, 0x2A, 0x81, 0x1C, 0xCF, 0x55, 0x83, 0x11, 0x05, 0x00, 0x04, 0x20 }; static const gcry_md_oid_spec_t oid_spec_sm3[] = { /* China Electronics Standardization Instutute, OID White paper (2015), Table 6 */ { "1.2.156.10197.401" }, { NULL }, }; gcry_md_spec_t _gcry_digest_spec_sm3 = { GCRY_MD_SM3, {0, 0}, "SM3", asn_sm3, DIM (asn_sm3), oid_spec_sm3, 32, sm3_init, _gcry_md_block_write, sm3_final, sm3_read, NULL, _gcry_sm3_hash_buffers, sizeof (SM3_CONTEXT), GRUB_UTIL_MODNAME("gcry_sm3") .blocksize = 64 }; GRUB_MOD_INIT(gcry_sm3) { grub_md_register (&_gcry_digest_spec_sm3); } GRUB_MOD_FINI(gcry_sm3) { grub_md_unregister (&_gcry_digest_spec_sm3); } grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/cipher/asm-poly1305-aarch64.h0000644000175000017500000001660115036452441024320 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ /* asm-common-aarch64.h - Poly1305 macros for ARMv8/AArch64 assembly * * Copyright (C) 2019 Jussi Kivilinna * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . */ #ifndef GCRY_ASM_POLY1305_AARCH64_H #define GCRY_ASM_POLY1305_AARCH64_H #include "asm-common-aarch64.h" #ifdef __AARCH64EL__ #define le_to_host(reg) /*_*/ #else #define le_to_host(reg) rev reg, reg; #endif /********************************************************************** poly1305 for stitched chacha20-poly1305 Aarch64 implementations **********************************************************************/ #define POLY_RSTATE x8 #define POLY_RSRC x9 #define POLY_R_H0 x10 #define POLY_R_H1 x11 #define POLY_R_H2 x12 #define POLY_R_H2d w12 #define POLY_R_R0 x13 #define POLY_R_R1 x14 #define POLY_R_R1_MUL5 x15 #define POLY_R_X0_HI x16 #define POLY_R_X0_LO x17 #define POLY_R_X1_HI x19 #define POLY_R_X1_LO x20 #define POLY_R_ONE x21 #define POLY_R_ONEd w21 #define POLY_TMP0 x22 #define POLY_TMP1 x23 #define POLY_TMP2 x24 #define POLY_TMP3 x25 #define POLY_CHACHA_ROUND x26 #define POLY_S_R0 (4 * 4 + 0 * 8) #define POLY_S_R1 (4 * 4 + 1 * 8) #define POLY_S_H0 (4 * 4 + 2 * 8 + 0 * 8) #define POLY_S_H1 (4 * 4 + 2 * 8 + 1 * 8) #define POLY_S_H2d (4 * 4 + 2 * 8 + 2 * 8) #define POLY1305_PUSH_REGS() \ stp x19, x20, [sp, #-16]!; \ CFI_ADJUST_CFA_OFFSET(16); \ CFI_REG_ON_STACK(19, 0); \ CFI_REG_ON_STACK(20, 8); \ stp x21, x22, [sp, #-16]!; \ CFI_ADJUST_CFA_OFFSET(16); \ CFI_REG_ON_STACK(21, 0); \ CFI_REG_ON_STACK(22, 8); \ stp x23, x24, [sp, #-16]!; \ CFI_ADJUST_CFA_OFFSET(16); \ CFI_REG_ON_STACK(23, 0); \ CFI_REG_ON_STACK(24, 8); \ stp x25, x26, [sp, #-16]!; \ CFI_ADJUST_CFA_OFFSET(16); \ CFI_REG_ON_STACK(25, 0); \ CFI_REG_ON_STACK(26, 8); #define POLY1305_POP_REGS() \ ldp x25, x26, [sp], #16; \ CFI_ADJUST_CFA_OFFSET(-16); \ CFI_RESTORE(x25); \ CFI_RESTORE(x26); \ ldp x23, x24, [sp], #16; \ CFI_ADJUST_CFA_OFFSET(-16); \ CFI_RESTORE(x23); \ CFI_RESTORE(x24); \ ldp x21, x22, [sp], #16; \ CFI_ADJUST_CFA_OFFSET(-16); \ CFI_RESTORE(x21); \ CFI_RESTORE(x22); \ ldp x19, x20, [sp], #16; \ CFI_ADJUST_CFA_OFFSET(-16); \ CFI_RESTORE(x19); \ CFI_RESTORE(x20); #define POLY1305_LOAD_STATE() \ ldr POLY_R_R1, [POLY_RSTATE, #(POLY_S_R1)]; \ ldr POLY_R_H0, [POLY_RSTATE, #(POLY_S_H0)]; \ ldr POLY_R_H1, [POLY_RSTATE, #(POLY_S_H1)]; \ ldr POLY_R_H2d, [POLY_RSTATE, #(POLY_S_H2d)]; \ ldr POLY_R_R0, [POLY_RSTATE, #(POLY_S_R0)]; \ add POLY_R_R1_MUL5, POLY_R_R1, POLY_R_R1, lsr #2; \ mov POLY_R_ONE, #1; #define POLY1305_STORE_STATE() \ str POLY_R_H0, [POLY_RSTATE, #(POLY_S_H0)]; \ str POLY_R_H1, [POLY_RSTATE, #(POLY_S_H1)]; \ str POLY_R_H2d, [POLY_RSTATE, #(POLY_S_H2d)]; #define POLY1305_BLOCK_PART1(src_offset) \ /* a = h + m */ \ ldr POLY_TMP0, [POLY_RSRC, #((src_offset) + 0 * 8)]; #define POLY1305_BLOCK_PART2(src_offset) \ ldr POLY_TMP1, [POLY_RSRC, #((src_offset) + 1 * 8)]; #define POLY1305_BLOCK_PART3() \ le_to_host(POLY_TMP0); #define POLY1305_BLOCK_PART4() \ le_to_host(POLY_TMP1); #define POLY1305_BLOCK_PART5() \ adds POLY_R_H0, POLY_R_H0, POLY_TMP0; #define POLY1305_BLOCK_PART6() \ adcs POLY_R_H1, POLY_R_H1, POLY_TMP1; #define POLY1305_BLOCK_PART7() \ adc POLY_R_H2d, POLY_R_H2d, POLY_R_ONEd; #define POLY1305_BLOCK_PART8() \ /* h = a * r (partial mod 2^130-5): */ \ mul POLY_R_X1_LO, POLY_R_H0, POLY_R_R1; /* lo: h0 * r1 */ #define POLY1305_BLOCK_PART9() \ mul POLY_TMP0, POLY_R_H1, POLY_R_R0; /* lo: h1 * r0 */ #define POLY1305_BLOCK_PART10() \ mul POLY_R_X0_LO, POLY_R_H0, POLY_R_R0; /* lo: h0 * r0 */ #define POLY1305_BLOCK_PART11() \ umulh POLY_R_X1_HI, POLY_R_H0, POLY_R_R1; /* hi: h0 * r1 */ #define POLY1305_BLOCK_PART12() \ adds POLY_R_X1_LO, POLY_R_X1_LO, POLY_TMP0; #define POLY1305_BLOCK_PART13() \ umulh POLY_TMP1, POLY_R_H1, POLY_R_R0; /* hi: h1 * r0 */ #define POLY1305_BLOCK_PART14() \ mul POLY_TMP2, POLY_R_H1, POLY_R_R1_MUL5; /* lo: h1 * r1 mod 2^130-5 */ #define POLY1305_BLOCK_PART15() \ umulh POLY_R_X0_HI, POLY_R_H0, POLY_R_R0; /* hi: h0 * r0 */ #define POLY1305_BLOCK_PART16() \ adc POLY_R_X1_HI, POLY_R_X1_HI, POLY_TMP1; #define POLY1305_BLOCK_PART17() \ umulh POLY_TMP3, POLY_R_H1, POLY_R_R1_MUL5; /* hi: h1 * r1 mod 2^130-5 */ #define POLY1305_BLOCK_PART18() \ adds POLY_R_X0_LO, POLY_R_X0_LO, POLY_TMP2; #define POLY1305_BLOCK_PART19() \ mul POLY_R_H1, POLY_R_H2, POLY_R_R1_MUL5; /* h2 * r1 mod 2^130-5 */ #define POLY1305_BLOCK_PART20() \ adc POLY_R_X0_HI, POLY_R_X0_HI, POLY_TMP3; #define POLY1305_BLOCK_PART21() \ mul POLY_R_H2, POLY_R_H2, POLY_R_R0; /* h2 * r0 */ #define POLY1305_BLOCK_PART22() \ adds POLY_R_H1, POLY_R_H1, POLY_R_X1_LO; #define POLY1305_BLOCK_PART23() \ adc POLY_R_H0, POLY_R_H2, POLY_R_X1_HI; #define POLY1305_BLOCK_PART24() \ /* carry propagation */ \ and POLY_R_H2, POLY_R_H0, #3; #define POLY1305_BLOCK_PART25() \ lsr POLY_R_H0, POLY_R_H0, #2; #define POLY1305_BLOCK_PART26() \ add POLY_R_H0, POLY_R_H0, POLY_R_H0, lsl #2; #define POLY1305_BLOCK_PART27() \ adds POLY_R_H0, POLY_R_H0, POLY_R_X0_LO; #define POLY1305_BLOCK_PART28() \ adcs POLY_R_H1, POLY_R_H1, POLY_R_X0_HI; #define POLY1305_BLOCK_PART29() \ adc POLY_R_H2d, POLY_R_H2d, wzr; //#define TESTING_POLY1305_ASM #ifdef TESTING_POLY1305_ASM /* for testing only. */ .align 3 .globl _gcry_poly1305_aarch64_blocks1 ELF(.type _gcry_poly1305_aarch64_blocks1,%function;) _gcry_poly1305_aarch64_blocks1: /* input: * x0: poly1305-state * x1: src * x2: nblks */ CFI_STARTPROC() POLY1305_PUSH_REGS(); mov POLY_RSTATE, x0; mov POLY_RSRC, x1; POLY1305_LOAD_STATE(); .L_gcry_poly1305_aarch64_loop1: POLY1305_BLOCK_PART1(0 * 16); POLY1305_BLOCK_PART2(0 * 16); add POLY_RSRC, POLY_RSRC, #16; POLY1305_BLOCK_PART3(); POLY1305_BLOCK_PART4(); POLY1305_BLOCK_PART5(); POLY1305_BLOCK_PART6(); POLY1305_BLOCK_PART7(); POLY1305_BLOCK_PART8(); POLY1305_BLOCK_PART9(); POLY1305_BLOCK_PART10(); POLY1305_BLOCK_PART11(); POLY1305_BLOCK_PART12(); POLY1305_BLOCK_PART13(); POLY1305_BLOCK_PART14(); POLY1305_BLOCK_PART15(); POLY1305_BLOCK_PART16(); POLY1305_BLOCK_PART17(); POLY1305_BLOCK_PART18(); POLY1305_BLOCK_PART19(); POLY1305_BLOCK_PART20(); POLY1305_BLOCK_PART21(); POLY1305_BLOCK_PART22(); POLY1305_BLOCK_PART23(); POLY1305_BLOCK_PART24(); POLY1305_BLOCK_PART25(); POLY1305_BLOCK_PART26(); POLY1305_BLOCK_PART27(); POLY1305_BLOCK_PART28(); POLY1305_BLOCK_PART29(); subs x2, x2, #1; b.ne .L_gcry_poly1305_aarch64_loop1; POLY1305_STORE_STATE(); mov x0, #0; POLY1305_POP_REGS(); ret_spec_stop; CFI_ENDPROC() ELF(.size _gcry_poly1305_aarch64_blocks1, .-_gcry_poly1305_aarch64_blocks1;) #endif #endif /* GCRY_ASM_POLY1305_AARCH64_H */ grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/cipher/stribog.c0000644000175000017500000020666315036452441022475 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ #include GRUB_MOD_LICENSE ("GPLv3+"); /* stribog.c - GOST R 34.11-2012 (Stribog) hash function * Copyright (C) 2013 Dmitry Eremin-Solenikov * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . */ #include "g10lib.h" #include "bithelp.h" #include "bufhelp.h" #include "cipher.h" #include "hash-common.h" typedef struct { gcry_md_block_ctx_t bctx; union { u64 h[8]; unsigned char result[64]; }; u64 N[8]; u64 Sigma[8]; } STRIBOG_CONTEXT; /* Pre-computed results of multiplication of bytes on A and reordered with Pi[]. */ static const u64 stribog_table[8][256] = { /* 0 */ { U64_C(0xd01f715b5c7ef8e6), U64_C(0x16fa240980778325), U64_C(0xa8a42e857ee049c8), U64_C(0x6ac1068fa186465b), U64_C(0x6e417bd7a2e9320b), U64_C(0x665c8167a437daab), U64_C(0x7666681aa89617f6), U64_C(0x4b959163700bdcf5), U64_C(0xf14be6b78df36248), U64_C(0xc585bd689a625cff), U64_C(0x9557d7fca67d82cb), U64_C(0x89f0b969af6dd366), U64_C(0xb0833d48749f6c35), U64_C(0xa1998c23b1ecbc7c), U64_C(0x8d70c431ac02a736), U64_C(0xd6dfbc2fd0a8b69e), U64_C(0x37aeb3e551fa198b), U64_C(0x0b7d128a40b5cf9c), U64_C(0x5a8f2008b5780cbc), U64_C(0xedec882284e333e5), U64_C(0xd25fc177d3c7c2ce), U64_C(0x5e0f5d50b61778ec), U64_C(0x1d873683c0c24cb9), U64_C(0xad040bcbb45d208c), U64_C(0x2f89a0285b853c76), U64_C(0x5732fff6791b8d58), U64_C(0x3e9311439ef6ec3f), U64_C(0xc9183a809fd3c00f), U64_C(0x83adf3f5260a01ee), U64_C(0xa6791941f4e8ef10), U64_C(0x103ae97d0ca1cd5d), U64_C(0x2ce948121dee1b4a), U64_C(0x39738421dbf2bf53), U64_C(0x093da2a6cf0cf5b4), U64_C(0xcd9847d89cbcb45f), U64_C(0xf9561c078b2d8ae8), U64_C(0x9c6a755a6971777f), U64_C(0xbc1ebaa0712ef0c5), U64_C(0x72e61542abf963a6), U64_C(0x78bb5fde229eb12e), U64_C(0x14ba94250fceb90d), U64_C(0x844d6697630e5282), U64_C(0x98ea08026a1e032f), U64_C(0xf06bbea144217f5c), U64_C(0xdb6263d11ccb377a), U64_C(0x641c314b2b8ee083), U64_C(0x320e96ab9b4770cf), U64_C(0x1ee7deb986a96b85), U64_C(0xe96cf57a878c47b5), U64_C(0xfdd6615f8842feb8), U64_C(0xc83862965601dd1b), U64_C(0x2ea9f83e92572162), U64_C(0xf876441142ff97fc), U64_C(0xeb2c455608357d9d), U64_C(0x5612a7e0b0c9904c), U64_C(0x6c01cbfb2d500823), U64_C(0x4548a6a7fa037a2d), U64_C(0xabc4c6bf388b6ef4), U64_C(0xbade77d4fdf8bebd), U64_C(0x799b07c8eb4cac3a), U64_C(0x0c9d87e805b19cf0), U64_C(0xcb588aac106afa27), U64_C(0xea0c1d40c1e76089), U64_C(0x2869354a1e816f1a), U64_C(0xff96d17307fbc490), U64_C(0x9f0a9d602f1a5043), U64_C(0x96373fc6e016a5f7), U64_C(0x5292dab8b3a6e41c), U64_C(0x9b8ae0382c752413), U64_C(0x4f15ec3b7364a8a5), U64_C(0x3fb349555724f12b), U64_C(0xc7c50d4415db66d7), U64_C(0x92b7429ee379d1a7), U64_C(0xd37f99611a15dfda), U64_C(0x231427c05e34a086), U64_C(0xa439a96d7b51d538), U64_C(0xb403401077f01865), U64_C(0xdda2aea5901d7902), U64_C(0x0a5d4a9c8967d288), U64_C(0xc265280adf660f93), U64_C(0x8bb0094520d4e94e), U64_C(0x2a29856691385532), U64_C(0x42a833c5bf072941), U64_C(0x73c64d54622b7eb2), U64_C(0x07e095624504536c), U64_C(0x8a905153e906f45a), U64_C(0x6f6123c16b3b2f1f), U64_C(0xc6e55552dc097bc3), U64_C(0x4468feb133d16739), U64_C(0xe211e7f0c7398829), U64_C(0xa2f96419f7879b40), U64_C(0x19074bdbc3ad38e9), U64_C(0xf4ebc3f9474e0b0c), U64_C(0x43886bd376d53455), U64_C(0xd8028beb5aa01046), U64_C(0x51f23282f5cdc320), U64_C(0xe7b1c2be0d84e16d), U64_C(0x081dfab006dee8a0), U64_C(0x3b33340d544b857b), U64_C(0x7f5bcabc679ae242), U64_C(0x0edd37c48a08a6d8), U64_C(0x81ed43d9a9b33bc6), U64_C(0xb1a3655ebd4d7121), U64_C(0x69a1eeb5e7ed6167), U64_C(0xf6ab73d5c8f73124), U64_C(0x1a67a3e185c61fd5), U64_C(0x2dc91004d43c065e), U64_C(0x0240b02c8fb93a28), U64_C(0x90f7f2b26cc0eb8f), U64_C(0x3cd3a16f114fd617), U64_C(0xaae49ea9f15973e0), U64_C(0x06c0cd748cd64e78), U64_C(0xda423bc7d5192a6e), U64_C(0xc345701c16b41287), U64_C(0x6d2193ede4821537), U64_C(0xfcf639494190e3ac), U64_C(0x7c3b228621f1c57e), U64_C(0xfb16ac2b0494b0c0), U64_C(0xbf7e529a3745d7f9), U64_C(0x6881b6a32e3f7c73), U64_C(0xca78d2bad9b8e733), U64_C(0xbbfe2fc2342aa3a9), U64_C(0x0dbddffecc6381e4), U64_C(0x70a6a56e2440598e), U64_C(0xe4d12a844befc651), U64_C(0x8c509c2765d0ba22), U64_C(0xee8c6018c28814d9), U64_C(0x17da7c1f49a59e31), U64_C(0x609c4c1328e194d3), U64_C(0xb3e3d57232f44b09), U64_C(0x91d7aaa4a512f69b), U64_C(0x0ffd6fd243dabbcc), U64_C(0x50d26a943c1fde34), U64_C(0x6be15e9968545b4f), U64_C(0x94778fea6faf9fdf), U64_C(0x2b09dd7058ea4826), U64_C(0x677cd9716de5c7bf), U64_C(0x49d5214fffb2e6dd), U64_C(0x0360e83a466b273c), U64_C(0x1fc786af4f7b7691), U64_C(0xa0b9d435783ea168), U64_C(0xd49f0c035f118cb6), U64_C(0x01205816c9d21d14), U64_C(0xac2453dd7d8f3d98), U64_C(0x545217cc3f70aa64), U64_C(0x26b4028e9489c9c2), U64_C(0xdec2469fd6765e3e), U64_C(0x04807d58036f7450), U64_C(0xe5f17292823ddb45), U64_C(0xf30b569b024a5860), U64_C(0x62dcfc3fa758aefb), U64_C(0xe84cad6c4e5e5aa1), U64_C(0xccb81fce556ea94b), U64_C(0x53b282ae7a74f908), U64_C(0x1b47fbf74c1402c1), U64_C(0x368eebf39828049f), U64_C(0x7afbeff2ad278b06), U64_C(0xbe5e0a8cfe97caed), U64_C(0xcfd8f7f413058e77), U64_C(0xf78b2bc301252c30), U64_C(0x4d555c17fcdd928d), U64_C(0x5f2f05467fc565f8), U64_C(0x24f4b2a21b30f3ea), U64_C(0x860dd6bbecb768aa), U64_C(0x4c750401350f8f99), U64_C(0x0000000000000000), U64_C(0xecccd0344d312ef1), U64_C(0xb5231806be220571), U64_C(0xc105c030990d28af), U64_C(0x653c695de25cfd97), U64_C(0x159acc33c61ca419), U64_C(0xb89ec7f872418495), U64_C(0xa9847693b73254dc), U64_C(0x58cf90243ac13694), U64_C(0x59efc832f3132b80), U64_C(0x5c4fed7c39ae42c4), U64_C(0x828dabe3efd81cfa), U64_C(0xd13f294d95ace5f2), U64_C(0x7d1b7a90e823d86a), U64_C(0xb643f03cf849224d), U64_C(0x3df3f979d89dcb03), U64_C(0x7426d836272f2dde), U64_C(0xdfe21e891fa4432a), U64_C(0x3a136c1b9d99986f), U64_C(0xfa36f43dcd46add4), U64_C(0xc025982650df35bb), U64_C(0x856d3e81aadc4f96), U64_C(0xc4a5e57e53b041eb), U64_C(0x4708168b75ba4005), U64_C(0xaf44bbe73be41aa4), U64_C(0x971767d029c4b8e3), U64_C(0xb9be9feebb939981), U64_C(0x215497ecd18d9aae), U64_C(0x316e7e91dd2c57f3), U64_C(0xcef8afe2dad79363), U64_C(0x3853dc371220a247), U64_C(0x35ee03c9de4323a3), U64_C(0xe6919aa8c456fc79), U64_C(0xe05157dc4880b201), U64_C(0x7bdbb7e464f59612), U64_C(0x127a59518318f775), U64_C(0x332ecebd52956ddb), U64_C(0x8f30741d23bb9d1e), U64_C(0xd922d3fd93720d52), U64_C(0x7746300c61440ae2), U64_C(0x25d4eab4d2e2eefe), U64_C(0x75068020eefd30ca), U64_C(0x135a01474acaea61), U64_C(0x304e268714fe4ae7), U64_C(0xa519f17bb283c82c), U64_C(0xdc82f6b359cf6416), U64_C(0x5baf781e7caa11a8), U64_C(0xb2c38d64fb26561d), U64_C(0x34ce5bdf17913eb7), U64_C(0x5d6fb56af07c5fd0), U64_C(0x182713cd0a7f25fd), U64_C(0x9e2ac576e6c84d57), U64_C(0x9aaab82ee5a73907), U64_C(0xa3d93c0f3e558654), U64_C(0x7e7b92aaae48ff56), U64_C(0x872d8ead256575be), U64_C(0x41c8dbfff96c0e7d), U64_C(0x99ca5014a3cc1e3b), U64_C(0x40e883e930be1369), U64_C(0x1ca76e95091051ad), U64_C(0x4e35b42dbab6b5b1), U64_C(0x05a0254ecabd6944), U64_C(0xe1710fca8152af15), U64_C(0xf22b0e8dcb984574), U64_C(0xb763a82a319b3f59), U64_C(0x63fca4296e8ab3ef), U64_C(0x9d4a2d4ca0a36a6b), U64_C(0xe331bfe60eeb953d), U64_C(0xd5bf541596c391a2), U64_C(0xf5cb9bef8e9c1618), U64_C(0x46284e9dbc685d11), U64_C(0x2074cffa185f87ba), U64_C(0xbd3ee2b6b8fcedd1), U64_C(0xae64e3f1f23607b0), U64_C(0xfeb68965ce29d984), U64_C(0x55724fdaf6a2b770), U64_C(0x29496d5cd753720e), U64_C(0xa75941573d3af204), U64_C(0x8e102c0bea69800a), U64_C(0x111ab16bc573d049), U64_C(0xd7ffe439197aab8a), U64_C(0xefac380e0b5a09cd), U64_C(0x48f579593660fbc9), U64_C(0x22347fd697e6bd92), U64_C(0x61bc1405e13389c7), U64_C(0x4ab5c975b9d9c1e1), U64_C(0x80cd1bcf606126d2), U64_C(0x7186fd78ed92449a), U64_C(0x93971a882aabccb3), U64_C(0x88d0e17f66bfce72), U64_C(0x27945a985d5bd4d6) }, /* 1 */ { U64_C(0xde553f8c05a811c8), U64_C(0x1906b59631b4f565), U64_C(0x436e70d6b1964ff7), U64_C(0x36d343cb8b1e9d85), U64_C(0x843dfacc858aab5a), U64_C(0xfdfc95c299bfc7f9), U64_C(0x0f634bdea1d51fa2), U64_C(0x6d458b3b76efb3cd), U64_C(0x85c3f77cf8593f80), U64_C(0x3c91315fbe737cb2), U64_C(0x2148b03366ace398), U64_C(0x18f8b8264c6761bf), U64_C(0xc830c1c495c9fb0f), U64_C(0x981a76102086a0aa), U64_C(0xaa16012142f35760), U64_C(0x35cc54060c763cf6), U64_C(0x42907d66cc45db2d), U64_C(0x8203d44b965af4bc), U64_C(0x3d6f3cefc3a0e868), U64_C(0xbc73ff69d292bda7), U64_C(0x8722ed0102e20a29), U64_C(0x8f8185e8cd34deb7), U64_C(0x9b0561dda7ee01d9), U64_C(0x5335a0193227fad6), U64_C(0xc9cecc74e81a6fd5), U64_C(0x54f5832e5c2431ea), U64_C(0x99e47ba05d553470), U64_C(0xf7bee756acd226ce), U64_C(0x384e05a5571816fd), U64_C(0xd1367452a47d0e6a), U64_C(0xf29fde1c386ad85b), U64_C(0x320c77316275f7ca), U64_C(0xd0c879e2d9ae9ab0), U64_C(0xdb7406c69110ef5d), U64_C(0x45505e51a2461011), U64_C(0xfc029872e46c5323), U64_C(0xfa3cb6f5f7bc0cc5), U64_C(0x031f17cd8768a173), U64_C(0xbd8df2d9af41297d), U64_C(0x9d3b4f5ab43e5e3f), U64_C(0x4071671b36feee84), U64_C(0x716207e7d3e3b83d), U64_C(0x48d20ff2f9283a1a), U64_C(0x27769eb4757cbc7e), U64_C(0x5c56ebc793f2e574), U64_C(0xa48b474f9ef5dc18), U64_C(0x52cbada94ff46e0c), U64_C(0x60c7da982d8199c6), U64_C(0x0e9d466edc068b78), U64_C(0x4eec2175eaf865fc), U64_C(0x550b8e9e21f7a530), U64_C(0x6b7ba5bc653fec2b), U64_C(0x5eb7f1ba6949d0dd), U64_C(0x57ea94e3db4c9099), U64_C(0xf640eae6d101b214), U64_C(0xdd4a284182c0b0bb), U64_C(0xff1d8fbf6304f250), U64_C(0xb8accb933bf9d7e8), U64_C(0xe8867c478eb68c4d), U64_C(0x3f8e2692391bddc1), U64_C(0xcb2fd60912a15a7c), U64_C(0xaec935dbab983d2f), U64_C(0xf55ffd2b56691367), U64_C(0x80e2ce366ce1c115), U64_C(0x179bf3f8edb27e1d), U64_C(0x01fe0db07dd394da), U64_C(0xda8a0b76ecc37b87), U64_C(0x44ae53e1df9584cb), U64_C(0xb310b4b77347a205), U64_C(0xdfab323c787b8512), U64_C(0x3b511268d070b78e), U64_C(0x65e6e3d2b9396753), U64_C(0x6864b271e2574d58), U64_C(0x259784c98fc789d7), U64_C(0x02e11a7dfabb35a9), U64_C(0x8841a6dfa337158b), U64_C(0x7ade78c39b5dcdd0), U64_C(0xb7cf804d9a2cc84a), U64_C(0x20b6bd831b7f7742), U64_C(0x75bd331d3a88d272), U64_C(0x418f6aab4b2d7a5e), U64_C(0xd9951cbb6babdaf4), U64_C(0xb6318dfde7ff5c90), U64_C(0x1f389b112264aa83), U64_C(0x492c024284fbaec0), U64_C(0xe33a0363c608f9a0), U64_C(0x2688930408af28a4), U64_C(0xc7538a1a341ce4ad), U64_C(0x5da8e677ee2171ae), U64_C(0x8c9e92254a5c7fc4), U64_C(0x63d8cd55aae938b5), U64_C(0x29ebd8daa97a3706), U64_C(0x959827b37be88aa1), U64_C(0x1484e4356adadf6e), U64_C(0xa7945082199d7d6b), U64_C(0xbf6ce8a455fa1cd4), U64_C(0x9cc542eac9edcae5), U64_C(0x79c16f0e1c356ca3), U64_C(0x89bfab6fdee48151), U64_C(0xd4174d1830c5f0ff), U64_C(0x9258048415eb419d), U64_C(0x6139d72850520d1c), U64_C(0x6a85a80c18ec78f1), U64_C(0xcd11f88e0171059a), U64_C(0xcceff53e7ca29140), U64_C(0xd229639f2315af19), U64_C(0x90b91ef9ef507434), U64_C(0x5977d28d074a1be1), U64_C(0x311360fce51d56b9), U64_C(0xc093a92d5a1f2f91), U64_C(0x1a19a25bb6dc5416), U64_C(0xeb996b8a09de2d3e), U64_C(0xfee3820f1ed7668a), U64_C(0xd7085ad5b7ad518c), U64_C(0x7fff41890fe53345), U64_C(0xec5948bd67dde602), U64_C(0x2fd5f65dbaaa68e0), U64_C(0xa5754affe32648c2), U64_C(0xf8ddac880d07396c), U64_C(0x6fa491468c548664), U64_C(0x0c7c5c1326bdbed1), U64_C(0x4a33158f03930fb3), U64_C(0x699abfc19f84d982), U64_C(0xe4fa2054a80b329c), U64_C(0x6707f9af438252fa), U64_C(0x08a368e9cfd6d49e), U64_C(0x47b1442c58fd25b8), U64_C(0xbbb3dc5ebc91769b), U64_C(0x1665fe489061eac7), U64_C(0x33f27a811fa66310), U64_C(0x93a609346838d547), U64_C(0x30ed6d4c98cec263), U64_C(0x1dd9816cd8df9f2a), U64_C(0x94662a03063b1e7b), U64_C(0x83fdd9fbeb896066), U64_C(0x7b207573e68e590a), U64_C(0x5f49fc0a149a4407), U64_C(0x343259b671a5a82c), U64_C(0xfbc2bb458a6f981f), U64_C(0xc272b350a0a41a38), U64_C(0x3aaf1fd8ada32354), U64_C(0x6cbb868b0b3c2717), U64_C(0xa2b569c88d2583fe), U64_C(0xf180c9d1bf027928), U64_C(0xaf37386bd64ba9f5), U64_C(0x12bacab2790a8088), U64_C(0x4c0d3b0810435055), U64_C(0xb2eeb9070e9436df), U64_C(0xc5b29067cea7d104), U64_C(0xdcb425f1ff132461), U64_C(0x4f122cc5972bf126), U64_C(0xac282fa651230886), U64_C(0xe7e537992f6393ef), U64_C(0xe61b3a2952b00735), U64_C(0x709c0a57ae302ce7), U64_C(0xe02514ae416058d3), U64_C(0xc44c9dd7b37445de), U64_C(0x5a68c5408022ba92), U64_C(0x1c278cdca50c0bf0), U64_C(0x6e5a9cf6f18712be), U64_C(0x86dce0b17f319ef3), U64_C(0x2d34ec2040115d49), U64_C(0x4bcd183f7e409b69), U64_C(0x2815d56ad4a9a3dc), U64_C(0x24698979f2141d0d), U64_C(0x0000000000000000), U64_C(0x1ec696a15fb73e59), U64_C(0xd86b110b16784e2e), U64_C(0x8e7f8858b0e74a6d), U64_C(0x063e2e8713d05fe6), U64_C(0xe2c40ed3bbdb6d7a), U64_C(0xb1f1aeca89fc97ac), U64_C(0xe1db191e3cb3cc09), U64_C(0x6418ee62c4eaf389), U64_C(0xc6ad87aa49cf7077), U64_C(0xd6f65765ca7ec556), U64_C(0x9afb6c6dda3d9503), U64_C(0x7ce05644888d9236), U64_C(0x8d609f95378feb1e), U64_C(0x23a9aa4e9c17d631), U64_C(0x6226c0e5d73aac6f), U64_C(0x56149953a69f0443), U64_C(0xeeb852c09d66d3ab), U64_C(0x2b0ac2a753c102af), U64_C(0x07c023376e03cb3c), U64_C(0x2ccae1903dc2c993), U64_C(0xd3d76e2f5ec63bc3), U64_C(0x9e2458973356ff4c), U64_C(0xa66a5d32644ee9b1), U64_C(0x0a427294356de137), U64_C(0x783f62be61e6f879), U64_C(0x1344c70204d91452), U64_C(0x5b96c8f0fdf12e48), U64_C(0xa90916ecc59bf613), U64_C(0xbe92e5142829880e), U64_C(0x727d102a548b194e), U64_C(0x1be7afebcb0fc0cc), U64_C(0x3e702b2244c8491b), U64_C(0xd5e940a84d166425), U64_C(0x66f9f41f3e51c620), U64_C(0xabe80c913f20c3ba), U64_C(0xf07ec461c2d1edf2), U64_C(0xf361d3ac45b94c81), U64_C(0x0521394a94b8fe95), U64_C(0xadd622162cf09c5c), U64_C(0xe97871f7f3651897), U64_C(0xf4a1f09b2bba87bd), U64_C(0x095d6559b2054044), U64_C(0x0bbc7f2448be75ed), U64_C(0x2af4cf172e129675), U64_C(0x157ae98517094bb4), U64_C(0x9fda55274e856b96), U64_C(0x914713499283e0ee), U64_C(0xb952c623462a4332), U64_C(0x74433ead475b46a8), U64_C(0x8b5eb112245fb4f8), U64_C(0xa34b6478f0f61724), U64_C(0x11a5dd7ffe6221fb), U64_C(0xc16da49d27ccbb4b), U64_C(0x76a224d0bde07301), U64_C(0x8aa0bca2598c2022), U64_C(0x4df336b86d90c48f), U64_C(0xea67663a740db9e4), U64_C(0xef465f70e0b54771), U64_C(0x39b008152acb8227), U64_C(0x7d1e5bf4f55e06ec), U64_C(0x105bd0cf83b1b521), U64_C(0x775c2960c033e7db), U64_C(0x7e014c397236a79f), U64_C(0x811cc386113255cf), U64_C(0xeda7450d1a0e72d8), U64_C(0x5889df3d7a998f3b), U64_C(0x2e2bfbedc779fc3a), U64_C(0xce0eef438619a4e9), U64_C(0x372d4e7bf6cd095f), U64_C(0x04df34fae96b6a4f), U64_C(0xf923a13870d4adb6), U64_C(0xa1aa7e050a4d228d), U64_C(0xa8f71b5cb84862c9), U64_C(0xb52e9a306097fde3), U64_C(0x0d8251a35b6e2a0b), U64_C(0x2257a7fee1c442eb), U64_C(0x73831d9a29588d94), U64_C(0x51d4ba64c89ccf7f), U64_C(0x502ab7d4b54f5ba5), U64_C(0x97793dce8153bf08), U64_C(0xe5042de4d5d8a646), U64_C(0x9687307efc802bd2), U64_C(0xa05473b5779eb657), U64_C(0xb4d097801d446939), U64_C(0xcff0e2f3fbca3033), U64_C(0xc38cbee0dd778ee2), U64_C(0x464f499c252eb162), U64_C(0xcad1dbb96f72cea6), U64_C(0xba4dd1eec142e241), U64_C(0xb00fa37af42f0376) }, /* 2 */ { U64_C(0xcce4cd3aa968b245), U64_C(0x089d5484e80b7faf), U64_C(0x638246c1b3548304), U64_C(0xd2fe0ec8c2355492), U64_C(0xa7fbdf7ff2374eee), U64_C(0x4df1600c92337a16), U64_C(0x84e503ea523b12fb), U64_C(0x0790bbfd53ab0c4a), U64_C(0x198a780f38f6ea9d), U64_C(0x2ab30c8f55ec48cb), U64_C(0xe0f7fed6b2c49db5), U64_C(0xb6ecf3f422cadbdc), U64_C(0x409c9a541358df11), U64_C(0xd3ce8a56dfde3fe3), U64_C(0xc3e9224312c8c1a0), U64_C(0x0d6dfa58816ba507), U64_C(0xddf3e1b179952777), U64_C(0x04c02a42748bb1d9), U64_C(0x94c2abff9f2decb8), U64_C(0x4f91752da8f8acf4), U64_C(0x78682befb169bf7b), U64_C(0xe1c77a48af2ff6c4), U64_C(0x0c5d7ec69c80ce76), U64_C(0x4cc1e4928fd81167), U64_C(0xfeed3d24d9997b62), U64_C(0x518bb6dfc3a54a23), U64_C(0x6dbf2d26151f9b90), U64_C(0xb5bc624b05ea664f), U64_C(0xe86aaa525acfe21a), U64_C(0x4801ced0fb53a0be), U64_C(0xc91463e6c00868ed), U64_C(0x1027a815cd16fe43), U64_C(0xf67069a0319204cd), U64_C(0xb04ccc976c8abce7), U64_C(0xc0b9b3fc35e87c33), U64_C(0xf380c77c58f2de65), U64_C(0x50bb3241de4e2152), U64_C(0xdf93f490435ef195), U64_C(0xf1e0d25d62390887), U64_C(0xaf668bfb1a3c3141), U64_C(0xbc11b251f00a7291), U64_C(0x73a5eed47e427d47), U64_C(0x25bee3f6ee4c3b2e), U64_C(0x43cc0beb34786282), U64_C(0xc824e778dde3039c), U64_C(0xf97d86d98a327728), U64_C(0xf2b043e24519b514), U64_C(0xe297ebf7880f4b57), U64_C(0x3a94a49a98fab688), U64_C(0x868516cb68f0c419), U64_C(0xeffa11af0964ee50), U64_C(0xa4ab4ec0d517f37d), U64_C(0xa9c6b498547c567a), U64_C(0x8e18424f80fbbbb6), U64_C(0x0bcdc53bcf2bc23c), U64_C(0x137739aaea3643d0), U64_C(0x2c1333ec1bac2ff0), U64_C(0x8d48d3f0a7db0625), U64_C(0x1e1ac3f26b5de6d7), U64_C(0xf520f81f16b2b95e), U64_C(0x9f0f6ec450062e84), U64_C(0x0130849e1deb6b71), U64_C(0xd45e31ab8c7533a9), U64_C(0x652279a2fd14e43f), U64_C(0x3209f01e70f1c927), U64_C(0xbe71a770cac1a473), U64_C(0x0e3d6be7a64b1894), U64_C(0x7ec8148cff29d840), U64_C(0xcb7476c7fac3be0f), U64_C(0x72956a4a63a91636), U64_C(0x37f95ec21991138f), U64_C(0x9e3fea5a4ded45f5), U64_C(0x7b38ba50964902e8), U64_C(0x222e580bbde73764), U64_C(0x61e253e0899f55e6), U64_C(0xfc8d2805e352ad80), U64_C(0x35994be3235ac56d), U64_C(0x09add01af5e014de), U64_C(0x5e8659a6780539c6), U64_C(0xb17c48097161d796), U64_C(0x026015213acbd6e2), U64_C(0xd1ae9f77e515e901), U64_C(0xb7dc776a3f21b0ad), U64_C(0xaba6a1b96eb78098), U64_C(0x9bcf4486248d9f5d), U64_C(0x582666c536455efd), U64_C(0xfdbdac9bfeb9c6f1), U64_C(0xc47999be4163cdea), U64_C(0x765540081722a7ef), U64_C(0x3e548ed8ec710751), U64_C(0x3d041f67cb51bac2), U64_C(0x7958af71ac82d40a), U64_C(0x36c9da5c047a78fe), U64_C(0xed9a048e33af38b2), U64_C(0x26ee7249c96c86bd), U64_C(0x900281bdeba65d61), U64_C(0x11172c8bd0fd9532), U64_C(0xea0abf73600434f8), U64_C(0x42fc8f75299309f3), U64_C(0x34a9cf7d3eb1ae1c), U64_C(0x2b838811480723ba), U64_C(0x5ce64c8742ceef24), U64_C(0x1adae9b01fd6570e), U64_C(0x3c349bf9d6bad1b3), U64_C(0x82453c891c7b75c0), U64_C(0x97923a40b80d512b), U64_C(0x4a61dbf1c198765c), U64_C(0xb48ce6d518010d3e), U64_C(0xcfb45c858e480fd6), U64_C(0xd933cbf30d1e96ae), U64_C(0xd70ea014ab558e3a), U64_C(0xc189376228031742), U64_C(0x9262949cd16d8b83), U64_C(0xeb3a3bed7def5f89), U64_C(0x49314a4ee6b8cbcf), U64_C(0xdcc3652f647e4c06), U64_C(0xda635a4c2a3e2b3d), U64_C(0x470c21a940f3d35b), U64_C(0x315961a157d174b4), U64_C(0x6672e81dda3459ac), U64_C(0x5b76f77a1165e36e), U64_C(0x445cb01667d36ec8), U64_C(0xc5491d205c88a69b), U64_C(0x456c34887a3805b9), U64_C(0xffddb9bac4721013), U64_C(0x99af51a71e4649bf), U64_C(0xa15be01cbc7729d5), U64_C(0x52db2760e485f7b0), U64_C(0x8c78576eba306d54), U64_C(0xae560f6507d75a30), U64_C(0x95f22f6182c687c9), U64_C(0x71c5fbf54489aba5), U64_C(0xca44f259e728d57e), U64_C(0x88b87d2ccebbdc8d), U64_C(0xbab18d32be4a15aa), U64_C(0x8be8ec93e99b611e), U64_C(0x17b713e89ebdf209), U64_C(0xb31c5d284baa0174), U64_C(0xeeca9531148f8521), U64_C(0xb8d198138481c348), U64_C(0x8988f9b2d350b7fc), U64_C(0xb9e11c8d996aa839), U64_C(0x5a4673e40c8e881f), U64_C(0x1687977683569978), U64_C(0xbf4123eed72acf02), U64_C(0x4ea1f1b3b513c785), U64_C(0xe767452be16f91ff), U64_C(0x7505d1b730021a7c), U64_C(0xa59bca5ec8fc980c), U64_C(0xad069eda20f7e7a3), U64_C(0x38f4b1bba231606a), U64_C(0x60d2d77e94743e97), U64_C(0x9affc0183966f42c), U64_C(0x248e6768f3a7505f), U64_C(0xcdd449a4b483d934), U64_C(0x87b59255751baf68), U64_C(0x1bea6d2e023d3c7f), U64_C(0x6b1f12455b5ffcab), U64_C(0x743555292de9710d), U64_C(0xd8034f6d10f5fddf), U64_C(0xc6198c9f7ba81b08), U64_C(0xbb8109aca3a17edb), U64_C(0xfa2d1766ad12cabb), U64_C(0xc729080166437079), U64_C(0x9c5fff7b77269317), U64_C(0x0000000000000000), U64_C(0x15d706c9a47624eb), U64_C(0x6fdf38072fd44d72), U64_C(0x5fb6dd3865ee52b7), U64_C(0xa33bf53d86bcff37), U64_C(0xe657c1b5fc84fa8e), U64_C(0xaa962527735cebe9), U64_C(0x39c43525bfda0b1b), U64_C(0x204e4d2a872ce186), U64_C(0x7a083ece8ba26999), U64_C(0x554b9c9db72efbfa), U64_C(0xb22cd9b656416a05), U64_C(0x96a2bedea5e63a5a), U64_C(0x802529a826b0a322), U64_C(0x8115ad363b5bc853), U64_C(0x8375b81701901eb1), U64_C(0x3069e53f4a3a1fc5), U64_C(0xbd2136cfede119e0), U64_C(0x18bafc91251d81ec), U64_C(0x1d4a524d4c7d5b44), U64_C(0x05f0aedc6960daa8), U64_C(0x29e39d3072ccf558), U64_C(0x70f57f6b5962c0d4), U64_C(0x989fd53903ad22ce), U64_C(0xf84d024797d91c59), U64_C(0x547b1803aac5908b), U64_C(0xf0d056c37fd263f6), U64_C(0xd56eb535919e58d8), U64_C(0x1c7ad6d351963035), U64_C(0x2e7326cd2167f912), U64_C(0xac361a443d1c8cd2), U64_C(0x697f076461942a49), U64_C(0x4b515f6fdc731d2d), U64_C(0x8ad8680df4700a6f), U64_C(0x41ac1eca0eb3b460), U64_C(0x7d988533d80965d3), U64_C(0xa8f6300649973d0b), U64_C(0x7765c4960ac9cc9e), U64_C(0x7ca801adc5e20ea2), U64_C(0xdea3700e5eb59ae4), U64_C(0xa06b6482a19c42a4), U64_C(0x6a2f96db46b497da), U64_C(0x27def6d7d487edcc), U64_C(0x463ca5375d18b82a), U64_C(0xa6cb5be1efdc259f), U64_C(0x53eba3fef96e9cc1), U64_C(0xce84d81b93a364a7), U64_C(0xf4107c810b59d22f), U64_C(0x333974806d1aa256), U64_C(0x0f0def79bba073e5), U64_C(0x231edc95a00c5c15), U64_C(0xe437d494c64f2c6c), U64_C(0x91320523f64d3610), U64_C(0x67426c83c7df32dd), U64_C(0x6eefbc99323f2603), U64_C(0x9d6f7be56acdf866), U64_C(0x5916e25b2bae358c), U64_C(0x7ff89012e2c2b331), U64_C(0x035091bf2720bd93), U64_C(0x561b0d22900e4669), U64_C(0x28d319ae6f279e29), U64_C(0x2f43a2533c8c9263), U64_C(0xd09e1be9f8fe8270), U64_C(0xf740ed3e2c796fbc), U64_C(0xdb53ded237d5404c), U64_C(0x62b2c25faebfe875), U64_C(0x0afd41a5d2c0a94d), U64_C(0x6412fd3ce0ff8f4e), U64_C(0xe3a76f6995e42026), U64_C(0x6c8fa9b808f4f0e1), U64_C(0xc2d9a6dd0f23aad1), U64_C(0x8f28c6d19d10d0c7), U64_C(0x85d587744fd0798a), U64_C(0xa20b71a39b579446), U64_C(0x684f83fa7c7f4138), U64_C(0xe507500adba4471d), U64_C(0x3f640a46f19a6c20), U64_C(0x1247bd34f7dd28a1), U64_C(0x2d23b77206474481), U64_C(0x93521002cc86e0f2), U64_C(0x572b89bc8de52d18), U64_C(0xfb1d93f8b0f9a1ca), U64_C(0xe95a2ecc4724896b), U64_C(0x3ba420048511ddf9), U64_C(0xd63e248ab6bee54b), U64_C(0x5dd6c8195f258455), U64_C(0x06a03f634e40673b), U64_C(0x1f2a476c76b68da6), U64_C(0x217ec9b49ac78af7), U64_C(0xecaa80102e4453c3), U64_C(0x14e78257b99d4f9a) }, /* 3 */ { U64_C(0x20329b2cc87bba05), U64_C(0x4f5eb6f86546a531), U64_C(0xd4f44775f751b6b1), U64_C(0x8266a47b850dfa8b), U64_C(0xbb986aa15a6ca985), U64_C(0xc979eb08f9ae0f99), U64_C(0x2da6f447a2375ea1), U64_C(0x1e74275dcd7d8576), U64_C(0xbc20180a800bc5f8), U64_C(0xb4a2f701b2dc65be), U64_C(0xe726946f981b6d66), U64_C(0x48e6c453bf21c94c), U64_C(0x42cad9930f0a4195), U64_C(0xefa47b64aacccd20), U64_C(0x71180a8960409a42), U64_C(0x8bb3329bf6a44e0c), U64_C(0xd34c35de2d36dacc), U64_C(0xa92f5b7cbc23dc96), U64_C(0xb31a85aa68bb09c3), U64_C(0x13e04836a73161d2), U64_C(0xb24dfc4129c51d02), U64_C(0x8ae44b70b7da5acd), U64_C(0xe671ed84d96579a7), U64_C(0xa4bb3417d66f3832), U64_C(0x4572ab38d56d2de8), U64_C(0xb1b47761ea47215c), U64_C(0xe81c09cf70aba15d), U64_C(0xffbdb872ce7f90ac), U64_C(0xa8782297fd5dc857), U64_C(0x0d946f6b6a4ce4a4), U64_C(0xe4df1f4f5b995138), U64_C(0x9ebc71edca8c5762), U64_C(0x0a2c1dc0b02b88d9), U64_C(0x3b503c115d9d7b91), U64_C(0xc64376a8111ec3a2), U64_C(0xcec199a323c963e4), U64_C(0xdc76a87ec58616f7), U64_C(0x09d596e073a9b487), U64_C(0x14583a9d7d560daf), U64_C(0xf4c6dc593f2a0cb4), U64_C(0xdd21d19584f80236), U64_C(0x4a4836983ddde1d3), U64_C(0xe58866a41ae745f9), U64_C(0xf591a5b27e541875), U64_C(0x891dc05074586693), U64_C(0x5b068c651810a89e), U64_C(0xa30346bc0c08544f), U64_C(0x3dbf3751c684032d), U64_C(0x2a1e86ec785032dc), U64_C(0xf73f5779fca830ea), U64_C(0xb60c05ca30204d21), U64_C(0x0cc316802b32f065), U64_C(0x8770241bdd96be69), U64_C(0xb861e18199ee95db), U64_C(0xf805cad91418fcd1), U64_C(0x29e70dccbbd20e82), U64_C(0xc7140f435060d763), U64_C(0x0f3a9da0e8b0cc3b), U64_C(0xa2543f574d76408e), U64_C(0xbd7761e1c175d139), U64_C(0x4b1f4f737ca3f512), U64_C(0x6dc2df1f2fc137ab), U64_C(0xf1d05c3967b14856), U64_C(0xa742bf3715ed046c), U64_C(0x654030141d1697ed), U64_C(0x07b872abda676c7d), U64_C(0x3ce84eba87fa17ec), U64_C(0xc1fb0403cb79afdf), U64_C(0x3e46bc7105063f73), U64_C(0x278ae987121cd678), U64_C(0xa1adb4778ef47cd0), U64_C(0x26dd906c5362c2b9), U64_C(0x05168060589b44e2), U64_C(0xfbfc41f9d79ac08f), U64_C(0x0e6de44ba9ced8fa), U64_C(0x9feb08068bf243a3), U64_C(0x7b341749d06b129b), U64_C(0x229c69e74a87929a), U64_C(0xe09ee6c4427c011b), U64_C(0x5692e30e725c4c3a), U64_C(0xda99a33e5e9f6e4b), U64_C(0x353dd85af453a36b), U64_C(0x25241b4c90e0fee7), U64_C(0x5de987258309d022), U64_C(0xe230140fc0802984), U64_C(0x93281e86a0c0b3c6), U64_C(0xf229d719a4337408), U64_C(0x6f6c2dd4ad3d1f34), U64_C(0x8ea5b2fbae3f0aee), U64_C(0x8331dd90c473ee4a), U64_C(0x346aa1b1b52db7aa), U64_C(0xdf8f235e06042aa9), U64_C(0xcc6f6b68a1354b7b), U64_C(0x6c95a6f46ebf236a), U64_C(0x52d31a856bb91c19), U64_C(0x1a35ded6d498d555), U64_C(0xf37eaef2e54d60c9), U64_C(0x72e181a9a3c2a61c), U64_C(0x98537aad51952fde), U64_C(0x16f6c856ffaa2530), U64_C(0xd960281e9d1d5215), U64_C(0x3a0745fa1ce36f50), U64_C(0x0b7b642bf1559c18), U64_C(0x59a87eae9aec8001), U64_C(0x5e100c05408bec7c), U64_C(0x0441f98b19e55023), U64_C(0xd70dcc5534d38aef), U64_C(0x927f676de1bea707), U64_C(0x9769e70db925e3e5), U64_C(0x7a636ea29115065a), U64_C(0x468b201816ef11b6), U64_C(0xab81a9b73edff409), U64_C(0xc0ac7de88a07bb1e), U64_C(0x1f235eb68c0391b7), U64_C(0x6056b074458dd30f), U64_C(0xbe8eeac102f7ed67), U64_C(0xcd381283e04b5fba), U64_C(0x5cbefecec277c4e3), U64_C(0xd21b4c356c48ce0d), U64_C(0x1019c31664b35d8c), U64_C(0x247362a7d19eea26), U64_C(0xebe582efb3299d03), U64_C(0x02aef2cb82fc289f), U64_C(0x86275df09ce8aaa8), U64_C(0x28b07427faac1a43), U64_C(0x38a9b7319e1f47cf), U64_C(0xc82e92e3b8d01b58), U64_C(0x06ef0b409b1978bc), U64_C(0x62f842bfc771fb90), U64_C(0x9904034610eb3b1f), U64_C(0xded85ab5477a3e68), U64_C(0x90d195a663428f98), U64_C(0x5384636e2ac708d8), U64_C(0xcbd719c37b522706), U64_C(0xae9729d76644b0eb), U64_C(0x7c8c65e20a0c7ee6), U64_C(0x80c856b007f1d214), U64_C(0x8c0b40302cc32271), U64_C(0xdbcedad51fe17a8a), U64_C(0x740e8ae938dbdea0), U64_C(0xa615c6dc549310ad), U64_C(0x19cc55f6171ae90b), U64_C(0x49b1bdb8fe5fdd8d), U64_C(0xed0a89af2830e5bf), U64_C(0x6a7aadb4f5a65bd6), U64_C(0x7e22972988f05679), U64_C(0xf952b3325566e810), U64_C(0x39fecedadf61530e), U64_C(0x6101c99f04f3c7ce), U64_C(0x2e5f7f6761b562ff), U64_C(0xf08725d226cf5c97), U64_C(0x63af3b54860fef51), U64_C(0x8ff2cb10ef411e2f), U64_C(0x884ab9bb35267252), U64_C(0x4df04433e7ba8dae), U64_C(0x9afd8866d3690741), U64_C(0x66b9bb34de94abb3), U64_C(0x9baaf18d92171380), U64_C(0x543c11c5f0a064a5), U64_C(0x17a1b1bdbed431f1), U64_C(0xb5f58eeaf3a2717f), U64_C(0xc355f6c849858740), U64_C(0xec5df044694ef17e), U64_C(0xd83751f5dc6346d4), U64_C(0xfc4433520dfdacf2), U64_C(0x0000000000000000), U64_C(0x5a51f58e596ebc5f), U64_C(0x3285aaf12e34cf16), U64_C(0x8d5c39db6dbd36b0), U64_C(0x12b731dde64f7513), U64_C(0x94906c2d7aa7dfbb), U64_C(0x302b583aacc8e789), U64_C(0x9d45facd090e6b3c), U64_C(0x2165e2c78905aec4), U64_C(0x68d45f7f775a7349), U64_C(0x189b2c1d5664fdca), U64_C(0xe1c99f2f030215da), U64_C(0x6983269436246788), U64_C(0x8489af3b1e148237), U64_C(0xe94b702431d5b59c), U64_C(0x33d2d31a6f4adbd7), U64_C(0xbfd9932a4389f9a6), U64_C(0xb0e30e8aab39359d), U64_C(0xd1e2c715afcaf253), U64_C(0x150f43763c28196e), U64_C(0xc4ed846393e2eb3d), U64_C(0x03f98b20c3823c5e), U64_C(0xfd134ab94c83b833), U64_C(0x556b682eb1de7064), U64_C(0x36c4537a37d19f35), U64_C(0x7559f30279a5ca61), U64_C(0x799ae58252973a04), U64_C(0x9c12832648707ffd), U64_C(0x78cd9c6913e92ec5), U64_C(0x1d8dac7d0effb928), U64_C(0x439da0784e745554), U64_C(0x413352b3cc887dcb), U64_C(0xbacf134a1b12bd44), U64_C(0x114ebafd25cd494d), U64_C(0x2f08068c20cb763e), U64_C(0x76a07822ba27f63f), U64_C(0xeab2fb04f25789c2), U64_C(0xe3676de481fe3d45), U64_C(0x1b62a73d95e6c194), U64_C(0x641749ff5c68832c), U64_C(0xa5ec4dfc97112cf3), U64_C(0xf6682e92bdd6242b), U64_C(0x3f11c59a44782bb2), U64_C(0x317c21d1edb6f348), U64_C(0xd65ab5be75ad9e2e), U64_C(0x6b2dd45fb4d84f17), U64_C(0xfaab381296e4d44e), U64_C(0xd0b5befeeeb4e692), U64_C(0x0882ef0b32d7a046), U64_C(0x512a91a5a83b2047), U64_C(0x963e9ee6f85bf724), U64_C(0x4e09cf132438b1f0), U64_C(0x77f701c9fb59e2fe), U64_C(0x7ddb1c094b726a27), U64_C(0x5f4775ee01f5f8bd), U64_C(0x9186ec4d223c9b59), U64_C(0xfeeac1998f01846d), U64_C(0xac39db1ce4b89874), U64_C(0xb75b7c21715e59e0), U64_C(0xafc0503c273aa42a), U64_C(0x6e3b543fec430bf5), U64_C(0x704f7362213e8e83), U64_C(0x58ff0745db9294c0), U64_C(0x67eec2df9feabf72), U64_C(0xa0facd9ccf8a6811), U64_C(0xb936986ad890811a), U64_C(0x95c715c63bd9cb7a), U64_C(0xca8060283a2c33c7), U64_C(0x507de84ee9453486), U64_C(0x85ded6d05f6a96f6), U64_C(0x1cdad5964f81ade9), U64_C(0xd5a33e9eb62fa270), U64_C(0x40642b588df6690a), U64_C(0x7f75eec2c98e42b8), U64_C(0x2cf18dace3494a60), U64_C(0x23cb100c0bf9865b), U64_C(0xeef3028febb2d9e1), U64_C(0x4425d2d394133929), U64_C(0xaad6d05c7fa1e0c8), U64_C(0xad6ea2f7a5c68cb5), U64_C(0xc2028f2308fb9381), U64_C(0x819f2f5b468fc6d5), U64_C(0xc5bafd88d29cfffc), U64_C(0x47dc59f357910577), U64_C(0x2b49ff07392e261d), U64_C(0x57c59ae5332258fb), U64_C(0x73b6f842e2bcb2dd), U64_C(0xcf96e04862b77725), U64_C(0x4ca73dd8a6c4996f), U64_C(0x015779eb417e14c1), U64_C(0x37932a9176af8bf4) }, /* 4 */ { U64_C(0x190a2c9b249df23e), U64_C(0x2f62f8b62263e1e9), U64_C(0x7a7f754740993655), U64_C(0x330b7ba4d5564d9f), U64_C(0x4c17a16a46672582), U64_C(0xb22f08eb7d05f5b8), U64_C(0x535f47f40bc148cc), U64_C(0x3aec5d27d4883037), U64_C(0x10ed0a1825438f96), U64_C(0x516101f72c233d17), U64_C(0x13cc6f949fd04eae), U64_C(0x739853c441474bfd), U64_C(0x653793d90d3f5b1b), U64_C(0x5240647b96b0fc2f), U64_C(0x0c84890ad27623e0), U64_C(0xd7189b32703aaea3), U64_C(0x2685de3523bd9c41), U64_C(0x99317c5b11bffefa), U64_C(0x0d9baa854f079703), U64_C(0x70b93648fbd48ac5), U64_C(0xa80441fce30bc6be), U64_C(0x7287704bdc36ff1e), U64_C(0xb65384ed33dc1f13), U64_C(0xd36417343ee34408), U64_C(0x39cd38ab6e1bf10f), U64_C(0x5ab861770a1f3564), U64_C(0x0ebacf09f594563b), U64_C(0xd04572b884708530), U64_C(0x3cae9722bdb3af47), U64_C(0x4a556b6f2f5cbaf2), U64_C(0xe1704f1f76c4bd74), U64_C(0x5ec4ed7144c6dfcf), U64_C(0x16afc01d4c7810e6), U64_C(0x283f113cd629ca7a), U64_C(0xaf59a8761741ed2d), U64_C(0xeed5a3991e215fac), U64_C(0x3bf37ea849f984d4), U64_C(0xe413e096a56ce33c), U64_C(0x2c439d3a98f020d1), U64_C(0x637559dc6404c46b), U64_C(0x9e6c95d1e5f5d569), U64_C(0x24bb9836045fe99a), U64_C(0x44efa466dac8ecc9), U64_C(0xc6eab2a5c80895d6), U64_C(0x803b50c035220cc4), U64_C(0x0321658cba93c138), U64_C(0x8f9ebc465dc7ee1c), U64_C(0xd15a5137190131d3), U64_C(0x0fa5ec8668e5e2d8), U64_C(0x91c979578d1037b1), U64_C(0x0642ca05693b9f70), U64_C(0xefca80168350eb4f), U64_C(0x38d21b24f36a45ec), U64_C(0xbeab81e1af73d658), U64_C(0x8cbfd9cae7542f24), U64_C(0xfd19cc0d81f11102), U64_C(0x0ac6430fbb4dbc90), U64_C(0x1d76a09d6a441895), U64_C(0x2a01573ff1cbbfa1), U64_C(0xb572e161894fde2b), U64_C(0x8124734fa853b827), U64_C(0x614b1fdf43e6b1b0), U64_C(0x68ac395c4238cc18), U64_C(0x21d837bfd7f7b7d2), U64_C(0x20c714304a860331), U64_C(0x5cfaab726324aa14), U64_C(0x74c5ba4eb50d606e), U64_C(0xf3a3030474654739), U64_C(0x23e671bcf015c209), U64_C(0x45f087e947b9582a), U64_C(0xd8bd77b418df4c7b), U64_C(0xe06f6c90ebb50997), U64_C(0x0bd96080263c0873), U64_C(0x7e03f9410e40dcfe), U64_C(0xb8e94be4c6484928), U64_C(0xfb5b0608e8ca8e72), U64_C(0x1a2b49179e0e3306), U64_C(0x4e29e76961855059), U64_C(0x4f36c4e6fcf4e4ba), U64_C(0x49740ee395cf7bca), U64_C(0xc2963ea386d17f7d), U64_C(0x90d65ad810618352), U64_C(0x12d34c1b02a1fa4d), U64_C(0xfa44258775bb3a91), U64_C(0x18150f14b9ec46dd), U64_C(0x1491861e6b9a653d), U64_C(0x9a1019d7ab2c3fc2), U64_C(0x3668d42d06fe13d7), U64_C(0xdcc1fbb25606a6d0), U64_C(0x969490dd795a1c22), U64_C(0x3549b1a1bc6dd2ef), U64_C(0xc94f5e23a0ed770e), U64_C(0xb9f6686b5b39fdcb), U64_C(0xc4d4f4a6efeae00d), U64_C(0xe732851a1fff2204), U64_C(0x94aad6de5eb869f9), U64_C(0x3f8ff2ae07206e7f), U64_C(0xfe38a9813b62d03a), U64_C(0xa7a1ad7a8bee2466), U64_C(0x7b6056c8dde882b6), U64_C(0x302a1e286fc58ca7), U64_C(0x8da0fa457a259bc7), U64_C(0xb3302b64e074415b), U64_C(0x5402ae7eff8b635f), U64_C(0x08f8050c9cafc94b), U64_C(0xae468bf98a3059ce), U64_C(0x88c355cca98dc58f), U64_C(0xb10e6d67c7963480), U64_C(0xbad70de7e1aa3cf3), U64_C(0xbfb4a26e320262bb), U64_C(0xcb711820870f02d5), U64_C(0xce12b7a954a75c9d), U64_C(0x563ce87dd8691684), U64_C(0x9f73b65e7884618a), U64_C(0x2b1e74b06cba0b42), U64_C(0x47cec1ea605b2df1), U64_C(0x1c698312f735ac76), U64_C(0x5fdbcefed9b76b2c), U64_C(0x831a354c8fb1cdfc), U64_C(0x820516c312c0791f), U64_C(0xb74ca762aeadabf0), U64_C(0xfc06ef821c80a5e1), U64_C(0x5723cbf24518a267), U64_C(0x9d4df05d5f661451), U64_C(0x588627742dfd40bf), U64_C(0xda8331b73f3d39a0), U64_C(0x17b0e392d109a405), U64_C(0xf965400bcf28fba9), U64_C(0x7c3dbf4229a2a925), U64_C(0x023e460327e275db), U64_C(0x6cd0b55a0ce126b3), U64_C(0xe62da695828e96e7), U64_C(0x42ad6e63b3f373b9), U64_C(0xe50cc319381d57df), U64_C(0xc5cbd729729b54ee), U64_C(0x46d1e265fd2a9912), U64_C(0x6428b056904eeff8), U64_C(0x8be23040131e04b7), U64_C(0x6709d5da2add2ec0), U64_C(0x075de98af44a2b93), U64_C(0x8447dcc67bfbe66f), U64_C(0x6616f655b7ac9a23), U64_C(0xd607b8bded4b1a40), U64_C(0x0563af89d3a85e48), U64_C(0x3db1b4ad20c21ba4), U64_C(0x11f22997b8323b75), U64_C(0x292032b34b587e99), U64_C(0x7f1cdace9331681d), U64_C(0x8e819fc9c0b65aff), U64_C(0xa1e3677fe2d5bb16), U64_C(0xcd33d225ee349da5), U64_C(0xd9a2543b85aef898), U64_C(0x795e10cbfa0af76d), U64_C(0x25a4bbb9992e5d79), U64_C(0x78413344677b438e), U64_C(0xf0826688cef68601), U64_C(0xd27b34bba392f0eb), U64_C(0x551d8df162fad7bc), U64_C(0x1e57c511d0d7d9ad), U64_C(0xdeffbdb171e4d30b), U64_C(0xf4feea8e802f6caa), U64_C(0xa480c8f6317de55e), U64_C(0xa0fc44f07fa40ff5), U64_C(0x95b5f551c3c9dd1a), U64_C(0x22f952336d6476ea), U64_C(0x0000000000000000), U64_C(0xa6be8ef5169f9085), U64_C(0xcc2cf1aa73452946), U64_C(0x2e7ddb39bf12550a), U64_C(0xd526dd3157d8db78), U64_C(0x486b2d6c08becf29), U64_C(0x9b0f3a58365d8b21), U64_C(0xac78cdfaadd22c15), U64_C(0xbc95c7e28891a383), U64_C(0x6a927f5f65dab9c3), U64_C(0xc3891d2c1ba0cb9e), U64_C(0xeaa92f9f50f8b507), U64_C(0xcf0d9426c9d6e87e), U64_C(0xca6e3baf1a7eb636), U64_C(0xab25247059980786), U64_C(0x69b31ad3df4978fb), U64_C(0xe2512a93cc577c4c), U64_C(0xff278a0ea61364d9), U64_C(0x71a615c766a53e26), U64_C(0x89dc764334fc716c), U64_C(0xf87a638452594f4a), U64_C(0xf2bc208be914f3da), U64_C(0x8766b94ac1682757), U64_C(0xbbc82e687cdb8810), U64_C(0x626a7a53f9757088), U64_C(0xa2c202f358467a2e), U64_C(0x4d0882e5db169161), U64_C(0x09e7268301de7da8), U64_C(0xe897699c771ac0dc), U64_C(0xc8507dac3d9cc3ed), U64_C(0xc0a878a0a1330aa6), U64_C(0x978bb352e42ba8c1), U64_C(0xe9884a13ea6b743f), U64_C(0x279afdbabecc28a2), U64_C(0x047c8c064ed9eaab), U64_C(0x507e2278b15289f4), U64_C(0x599904fbb08cf45c), U64_C(0xbd8ae46d15e01760), U64_C(0x31353da7f2b43844), U64_C(0x8558ff49e68a528c), U64_C(0x76fbfc4d92ef15b5), U64_C(0x3456922e211c660c), U64_C(0x86799ac55c1993b4), U64_C(0x3e90d1219a51da9c), U64_C(0x2d5cbeb505819432), U64_C(0x982e5fd48cce4a19), U64_C(0xdb9c1238a24c8d43), U64_C(0xd439febecaa96f9b), U64_C(0x418c0bef0960b281), U64_C(0x158ea591f6ebd1de), U64_C(0x1f48e69e4da66d4e), U64_C(0x8afd13cf8e6fb054), U64_C(0xf5e1c9011d5ed849), U64_C(0xe34e091c5126c8af), U64_C(0xad67ee7530a398f6), U64_C(0x43b24dec2e82c75a), U64_C(0x75da99c1287cd48d), U64_C(0x92e81cdb3783f689), U64_C(0xa3dd217cc537cecd), U64_C(0x60543c50de970553), U64_C(0x93f73f54aaf2426a), U64_C(0xa91b62737e7a725d), U64_C(0xf19d4507538732e2), U64_C(0x77e4dfc20f9ea156), U64_C(0x7d229ccdb4d31dc6), U64_C(0x1b346a98037f87e5), U64_C(0xedf4c615a4b29e94), U64_C(0x4093286094110662), U64_C(0xb0114ee85ae78063), U64_C(0x6ff1d0d6b672e78b), U64_C(0x6dcf96d591909250), U64_C(0xdfe09e3eec9567e8), U64_C(0x3214582b4827f97c), U64_C(0xb46dc2ee143e6ac8), U64_C(0xf6c0ac8da7cd1971), U64_C(0xebb60c10cd8901e4), U64_C(0xf7df8f023abcad92), U64_C(0x9c52d3d2c217a0b2), U64_C(0x6b8d5cd0f8ab0d20), U64_C(0x3777f7a29b8fa734), U64_C(0x011f238f9d71b4e3), U64_C(0xc1b75b2f3c42be45), U64_C(0x5de588fdfe551ef7), U64_C(0x6eeef3592b035368), U64_C(0xaa3a07ffc4e9b365), U64_C(0xecebe59a39c32a77), U64_C(0x5ba742f8976e8187), U64_C(0x4b4a48e0b22d0e11), U64_C(0xddded83dcb771233), U64_C(0xa59feb79ac0c51bd), U64_C(0xc7f5912a55792135) }, /* 5 */ { U64_C(0x6d6ae04668a9b08a), U64_C(0x3ab3f04b0be8c743), U64_C(0xe51e166b54b3c908), U64_C(0xbe90a9eb35c2f139), U64_C(0xb2c7066637f2bec1), U64_C(0xaa6945613392202c), U64_C(0x9a28c36f3b5201eb), U64_C(0xddce5a93ab536994), U64_C(0x0e34133ef6382827), U64_C(0x52a02ba1ec55048b), U64_C(0xa2f88f97c4b2a177), U64_C(0x8640e513ca2251a5), U64_C(0xcdf1d36258137622), U64_C(0xfe6cb708dedf8ddb), U64_C(0x8a174a9ec8121e5d), U64_C(0x679896036b81560e), U64_C(0x59ed033395795fee), U64_C(0x1dd778ab8b74edaf), U64_C(0xee533ef92d9f926d), U64_C(0x2a8c79baf8a8d8f5), U64_C(0x6bcf398e69b119f6), U64_C(0xe20491742fafdd95), U64_C(0x276488e0809c2aec), U64_C(0xea955b82d88f5cce), U64_C(0x7102c63a99d9e0c4), U64_C(0xf9763017a5c39946), U64_C(0x429fa2501f151b3d), U64_C(0x4659c72bea05d59e), U64_C(0x984b7fdccf5a6634), U64_C(0xf742232953fbb161), U64_C(0x3041860e08c021c7), U64_C(0x747bfd9616cd9386), U64_C(0x4bb1367192312787), U64_C(0x1b72a1638a6c44d3), U64_C(0x4a0e68a6e8359a66), U64_C(0x169a5039f258b6ca), U64_C(0xb98a2ef44edee5a4), U64_C(0xd9083fe85e43a737), U64_C(0x967f6ce239624e13), U64_C(0x8874f62d3c1a7982), U64_C(0x3c1629830af06e3f), U64_C(0x9165ebfd427e5a8e), U64_C(0xb5dd81794ceeaa5c), U64_C(0x0de8f15a7834f219), U64_C(0x70bd98ede3dd5d25), U64_C(0xaccc9ca9328a8950), U64_C(0x56664eda1945ca28), U64_C(0x221db34c0f8859ae), U64_C(0x26dbd637fa98970d), U64_C(0x1acdffb4f068f932), U64_C(0x4585254f64090fa0), U64_C(0x72de245e17d53afa), U64_C(0x1546b25d7c546cf4), U64_C(0x207e0ffffb803e71), U64_C(0xfaaad2732bcf4378), U64_C(0xb462dfae36ea17bd), U64_C(0xcf926fd1ac1b11fd), U64_C(0xe0672dc7dba7ba4a), U64_C(0xd3fa49ad5d6b41b3), U64_C(0x8ba81449b216a3bc), U64_C(0x14f9ec8a0650d115), U64_C(0x40fc1ee3eb1d7ce2), U64_C(0x23a2ed9b758ce44f), U64_C(0x782c521b14fddc7e), U64_C(0x1c68267cf170504e), U64_C(0xbcf31558c1ca96e6), U64_C(0xa781b43b4ba6d235), U64_C(0xf6fd7dfe29ff0c80), U64_C(0xb0a4bad5c3fad91e), U64_C(0xd199f51ea963266c), U64_C(0x414340349119c103), U64_C(0x5405f269ed4dadf7), U64_C(0xabd61bb649969dcd), U64_C(0x6813dbeae7bdc3c8), U64_C(0x65fb2ab09f8931d1), U64_C(0xf1e7fae152e3181d), U64_C(0xc1a67cef5a2339da), U64_C(0x7a4feea8e0f5bba1), U64_C(0x1e0b9acf05783791), U64_C(0x5b8ebf8061713831), U64_C(0x80e53cdbcb3af8d9), U64_C(0x7e898bd315e57502), U64_C(0xc6bcfbf0213f2d47), U64_C(0x95a38e86b76e942d), U64_C(0x092e94218d243cba), U64_C(0x8339debf453622e7), U64_C(0xb11be402b9fe64ff), U64_C(0x57d9100d634177c9), U64_C(0xcc4e8db52217cbc3), U64_C(0x3b0cae9c71ec7aa2), U64_C(0xfb158ca451cbfe99), U64_C(0x2b33276d82ac6514), U64_C(0x01bf5ed77a04bde1), U64_C(0xc5601994af33f779), U64_C(0x75c4a3416cc92e67), U64_C(0xf3844652a6eb7fc2), U64_C(0x3487e375fdd0ef64), U64_C(0x18ae430704609eed), U64_C(0x4d14efb993298efb), U64_C(0x815a620cb13e4538), U64_C(0x125c354207487869), U64_C(0x9eeea614ce42cf48), U64_C(0xce2d3106d61fac1c), U64_C(0xbbe99247bad6827b), U64_C(0x071a871f7b1c149d), U64_C(0x2e4a1cc10db81656), U64_C(0x77a71ff298c149b8), U64_C(0x06a5d9c80118a97c), U64_C(0xad73c27e488e34b1), U64_C(0x443a7b981e0db241), U64_C(0xe3bbcfa355ab6074), U64_C(0x0af276450328e684), U64_C(0x73617a896dd1871b), U64_C(0x58525de4ef7de20f), U64_C(0xb7be3dcab8e6cd83), U64_C(0x19111dd07e64230c), U64_C(0x842359a03e2a367a), U64_C(0x103f89f1f3401fb6), U64_C(0xdc710444d157d475), U64_C(0xb835702334da5845), U64_C(0x4320fc876511a6dc), U64_C(0xd026abc9d3679b8d), U64_C(0x17250eee885c0b2b), U64_C(0x90dab52a387ae76f), U64_C(0x31fed8d972c49c26), U64_C(0x89cba8fa461ec463), U64_C(0x2ff5421677bcabb7), U64_C(0x396f122f85e41d7d), U64_C(0xa09b332430bac6a8), U64_C(0xc888e8ced7070560), U64_C(0xaeaf201ac682ee8f), U64_C(0x1180d7268944a257), U64_C(0xf058a43628e7a5fc), U64_C(0xbd4c4b8fbbce2b07), U64_C(0xa1246df34abe7b49), U64_C(0x7d5569b79be9af3c), U64_C(0xa9b5a705bd9efa12), U64_C(0xdb6b835baa4bc0e8), U64_C(0x05793bac8f147342), U64_C(0x21c1512881848390), U64_C(0xfdb0556c50d357e5), U64_C(0x613d4fcb6a99ff72), U64_C(0x03dce2648e0cda3e), U64_C(0xe949b9e6568386f0), U64_C(0xfc0f0bbb2ad7ea04), U64_C(0x6a70675913b5a417), U64_C(0x7f36d5046fe1c8e3), U64_C(0x0c57af8d02304ff8), U64_C(0x32223abdfcc84618), U64_C(0x0891caf6f720815b), U64_C(0xa63eeaec31a26fd4), U64_C(0x2507345374944d33), U64_C(0x49d28ac266394058), U64_C(0xf5219f9aa7f3d6be), U64_C(0x2d96fea583b4cc68), U64_C(0x5a31e1571b7585d0), U64_C(0x8ed12fe53d02d0fe), U64_C(0xdfade6205f5b0e4b), U64_C(0x4cabb16ee92d331a), U64_C(0x04c6657bf510cea3), U64_C(0xd73c2cd6a87b8f10), U64_C(0xe1d87310a1a307ab), U64_C(0x6cd5be9112ad0d6b), U64_C(0x97c032354366f3f2), U64_C(0xd4e0ceb22677552e), U64_C(0x0000000000000000), U64_C(0x29509bde76a402cb), U64_C(0xc27a9e8bd42fe3e4), U64_C(0x5ef7842cee654b73), U64_C(0xaf107ecdbc86536e), U64_C(0x3fcacbe784fcb401), U64_C(0xd55f90655c73e8cf), U64_C(0xe6c2f40fdabf1336), U64_C(0xe8f6e7312c873b11), U64_C(0xeb2a0555a28be12f), U64_C(0xe4a148bc2eb774e9), U64_C(0x9b979db84156bc0a), U64_C(0x6eb60222e6a56ab4), U64_C(0x87ffbbc4b026ec44), U64_C(0xc703a5275b3b90a6), U64_C(0x47e699fc9001687f), U64_C(0x9c8d1aa73a4aa897), U64_C(0x7cea3760e1ed12dd), U64_C(0x4ec80ddd1d2554c5), U64_C(0x13e36b957d4cc588), U64_C(0x5d2b66486069914d), U64_C(0x92b90999cc7280b0), U64_C(0x517cc9c56259deb5), U64_C(0xc937b619ad03b881), U64_C(0xec30824ad997f5b2), U64_C(0xa45d565fc5aa080b), U64_C(0xd6837201d27f32f1), U64_C(0x635ef3789e9198ad), U64_C(0x531f75769651b96a), U64_C(0x4f77530a6721e924), U64_C(0x486dd4151c3dfdb9), U64_C(0x5f48dafb9461f692), U64_C(0x375b011173dc355a), U64_C(0x3da9775470f4d3de), U64_C(0x8d0dcd81b30e0ac0), U64_C(0x36e45fc609d888bb), U64_C(0x55baacbe97491016), U64_C(0x8cb29356c90ab721), U64_C(0x76184125e2c5f459), U64_C(0x99f4210bb55edbd5), U64_C(0x6f095cf59ca1d755), U64_C(0x9f51f8c3b44672a9), U64_C(0x3538bda287d45285), U64_C(0x50c39712185d6354), U64_C(0xf23b1885dcefc223), U64_C(0x79930ccc6ef9619f), U64_C(0xed8fdc9da3934853), U64_C(0xcb540aaa590bdf5e), U64_C(0x5c94389f1a6d2cac), U64_C(0xe77daad8a0bbaed7), U64_C(0x28efc5090ca0bf2a), U64_C(0xbf2ff73c4fc64cd8), U64_C(0xb37858b14df60320), U64_C(0xf8c96ec0dfc724a7), U64_C(0x828680683f329f06), U64_C(0x941cd051cd6a29cc), U64_C(0xc3c5c05cae2b5e05), U64_C(0xb601631dc2e27062), U64_C(0xc01922382027843b), U64_C(0x24b86a840e90f0d2), U64_C(0xd245177a276ffc52), U64_C(0x0f8b4de98c3c95c6), U64_C(0x3e759530fef809e0), U64_C(0x0b4d2892792c5b65), U64_C(0xc4df4743d5374a98), U64_C(0xa5e20888bfaeb5ea), U64_C(0xba56cc90c0d23f9a), U64_C(0x38d04cf8ffe0a09c), U64_C(0x62e1adafe495254c), U64_C(0x0263bcb3f40867df), U64_C(0xcaeb547d230f62bf), U64_C(0x6082111c109d4293), U64_C(0xdad4dd8cd04f7d09), U64_C(0xefec602e579b2f8c), U64_C(0x1fb4c4187f7c8a70), U64_C(0xffd3e9dfa4db303a), U64_C(0x7bf0b07f9af10640), U64_C(0xf49ec14dddf76b5f), U64_C(0x8f6e713247066d1f), U64_C(0x339d646a86ccfbf9), U64_C(0x64447467e58d8c30), U64_C(0x2c29a072f9b07189), U64_C(0xd8b7613f24471ad6), U64_C(0x6627c8d41185ebef), U64_C(0xa347d140beb61c96), U64_C(0xde12b8f7255fb3aa), U64_C(0x9d324470404e1576), U64_C(0x9306574eb6763d51), U64_C(0xa80af9d2c79a47f3), U64_C(0x859c0777442e8b9b), U64_C(0x69ac853d9db97e29) }, /* 6 */ { U64_C(0xc3407dfc2de6377e), U64_C(0x5b9e93eea4256f77), U64_C(0xadb58fdd50c845e0), U64_C(0x5219ff11a75bed86), U64_C(0x356b61cfd90b1de9), U64_C(0xfb8f406e25abe037), U64_C(0x7a5a0231c0f60796), U64_C(0x9d3cd216e1f5020b), U64_C(0x0c6550fb6b48d8f3), U64_C(0xf57508c427ff1c62), U64_C(0x4ad35ffa71cb407d), U64_C(0x6290a2da1666aa6d), U64_C(0xe284ec2349355f9f), U64_C(0xb3c307c53d7c84ec), U64_C(0x05e23c0468365a02), U64_C(0x190bac4d6c9ebfa8), U64_C(0x94bbbee9e28b80fa), U64_C(0xa34fc777529cb9b5), U64_C(0xcc7b39f095bcd978), U64_C(0x2426addb0ce532e3), U64_C(0x7e79329312ce4fc7), U64_C(0xab09a72eebec2917), U64_C(0xf8d15499f6b9d6c2), U64_C(0x1a55b8babf8c895d), U64_C(0xdb8add17fb769a85), U64_C(0xb57f2f368658e81b), U64_C(0x8acd36f18f3f41f6), U64_C(0x5ce3b7bba50f11d3), U64_C(0x114dcc14d5ee2f0a), U64_C(0xb91a7fcded1030e8), U64_C(0x81d5425fe55de7a1), U64_C(0xb6213bc1554adeee), U64_C(0x80144ef95f53f5f2), U64_C(0x1e7688186db4c10c), U64_C(0x3b912965db5fe1bc), U64_C(0xc281715a97e8252d), U64_C(0x54a5d7e21c7f8171), U64_C(0x4b12535ccbc5522e), U64_C(0x1d289cefbea6f7f9), U64_C(0x6ef5f2217d2e729e), U64_C(0xe6a7dc819b0d17ce), U64_C(0x1b94b41c05829b0e), U64_C(0x33d7493c622f711e), U64_C(0xdcf7f942fa5ce421), U64_C(0x600fba8b7f7a8ecb), U64_C(0x46b60f011a83988e), U64_C(0x235b898e0dcf4c47), U64_C(0x957ab24f588592a9), U64_C(0x4354330572b5c28c), U64_C(0xa5f3ef84e9b8d542), U64_C(0x8c711e02341b2d01), U64_C(0x0b1874ae6a62a657), U64_C(0x1213d8e306fc19ff), U64_C(0xfe6d7c6a4d9dba35), U64_C(0x65ed868f174cd4c9), U64_C(0x88522ea0e6236550), U64_C(0x899322065c2d7703), U64_C(0xc01e690bfef4018b), U64_C(0x915982ed8abddaf8), U64_C(0xbe675b98ec3a4e4c), U64_C(0xa996bf7f82f00db1), U64_C(0xe1daf8d49a27696a), U64_C(0x2effd5d3dc8986e7), U64_C(0xd153a51f2b1a2e81), U64_C(0x18caa0ebd690adfb), U64_C(0x390e3134b243c51a), U64_C(0x2778b92cdff70416), U64_C(0x029f1851691c24a6), U64_C(0x5e7cafeacc133575), U64_C(0xfa4e4cc89fa5f264), U64_C(0x5a5f9f481e2b7d24), U64_C(0x484c47ab18d764db), U64_C(0x400a27f2a1a7f479), U64_C(0xaeeb9b2a83da7315), U64_C(0x721c626879869734), U64_C(0x042330a2d2384851), U64_C(0x85f672fd3765aff0), U64_C(0xba446b3a3e02061d), U64_C(0x73dd6ecec3888567), U64_C(0xffac70ccf793a866), U64_C(0xdfa9edb5294ed2d4), U64_C(0x6c6aea7014325638), U64_C(0x834a5a0e8c41c307), U64_C(0xcdba35562fb2cb2b), U64_C(0x0ad97808d06cb404), U64_C(0x0f3b440cb85aee06), U64_C(0xe5f9c876481f213b), U64_C(0x98deee1289c35809), U64_C(0x59018bbfcd394bd1), U64_C(0xe01bf47220297b39), U64_C(0xde68e1139340c087), U64_C(0x9fa3ca4788e926ad), U64_C(0xbb85679c840c144e), U64_C(0x53d8f3b71d55ffd5), U64_C(0x0da45c5dd146caa0), U64_C(0x6f34fe87c72060cd), U64_C(0x57fbc315cf6db784), U64_C(0xcee421a1fca0fdde), U64_C(0x3d2d0196607b8d4b), U64_C(0x642c8a29ad42c69a), U64_C(0x14aff010bdd87508), U64_C(0xac74837beac657b3), U64_C(0x3216459ad821634d), U64_C(0x3fb219c70967a9ed), U64_C(0x06bc28f3bb246cf7), U64_C(0xf2082c9126d562c6), U64_C(0x66b39278c45ee23c), U64_C(0xbd394f6f3f2878b9), U64_C(0xfd33689d9e8f8cc0), U64_C(0x37f4799eb017394f), U64_C(0x108cc0b26fe03d59), U64_C(0xda4bd1b1417888d6), U64_C(0xb09d1332ee6eb219), U64_C(0x2f3ed975668794b4), U64_C(0x58c0871977375982), U64_C(0x7561463d78ace990), U64_C(0x09876cff037e82f1), U64_C(0x7fb83e35a8c05d94), U64_C(0x26b9b58a65f91645), U64_C(0xef20b07e9873953f), U64_C(0x3148516d0b3355b8), U64_C(0x41cb2b541ba9e62a), U64_C(0x790416c613e43163), U64_C(0xa011d380818e8f40), U64_C(0x3a5025c36151f3ef), U64_C(0xd57095bdf92266d0), U64_C(0x498d4b0da2d97688), U64_C(0x8b0c3a57353153a5), U64_C(0x21c491df64d368e1), U64_C(0x8f2f0af5e7091bf4), U64_C(0x2da1c1240f9bb012), U64_C(0xc43d59a92ccc49da), U64_C(0xbfa6573e56345c1f), U64_C(0x828b56a8364fd154), U64_C(0x9a41f643e0df7caf), U64_C(0xbcf843c985266aea), U64_C(0x2b1de9d7b4bfdce5), U64_C(0x20059d79dedd7ab2), U64_C(0x6dabe6d6ae3c446b), U64_C(0x45e81bf6c991ae7b), U64_C(0x6351ae7cac68b83e), U64_C(0xa432e32253b6c711), U64_C(0xd092a9b991143cd2), U64_C(0xcac711032e98b58f), U64_C(0xd8d4c9e02864ac70), U64_C(0xc5fc550f96c25b89), U64_C(0xd7ef8dec903e4276), U64_C(0x67729ede7e50f06f), U64_C(0xeac28c7af045cf3d), U64_C(0xb15c1f945460a04a), U64_C(0x9cfddeb05bfb1058), U64_C(0x93c69abce3a1fe5e), U64_C(0xeb0380dc4a4bdd6e), U64_C(0xd20db1e8f8081874), U64_C(0x229a8528b7c15e14), U64_C(0x44291750739fbc28), U64_C(0xd3ccbd4e42060a27), U64_C(0xf62b1c33f4ed2a97), U64_C(0x86a8660ae4779905), U64_C(0xd62e814a2a305025), U64_C(0x477703a7a08d8add), U64_C(0x7b9b0e977af815c5), U64_C(0x78c51a60a9ea2330), U64_C(0xa6adfb733aaae3b7), U64_C(0x97e5aa1e3199b60f), U64_C(0x0000000000000000), U64_C(0xf4b404629df10e31), U64_C(0x5564db44a6719322), U64_C(0x9207961a59afec0d), U64_C(0x9624a6b88b97a45c), U64_C(0x363575380a192b1c), U64_C(0x2c60cd82b595a241), U64_C(0x7d272664c1dc7932), U64_C(0x7142769faa94a1c1), U64_C(0xa1d0df263b809d13), U64_C(0x1630e841d4c451ae), U64_C(0xc1df65ad44fa13d8), U64_C(0x13d2d445bcf20bac), U64_C(0xd915c546926abe23), U64_C(0x38cf3d92084dd749), U64_C(0xe766d0272103059d), U64_C(0xc7634d5effde7f2f), U64_C(0x077d2455012a7ea4), U64_C(0xedbfa82ff16fb199), U64_C(0xaf2a978c39d46146), U64_C(0x42953fa3c8bbd0df), U64_C(0xcb061da59496a7dc), U64_C(0x25e7a17db6eb20b0), U64_C(0x34aa6d6963050fba), U64_C(0xa76cf7d580a4f1e4), U64_C(0xf7ea10954ee338c4), U64_C(0xfcf2643b24819e93), U64_C(0xcf252d0746aeef8d), U64_C(0x4ef06f58a3f3082c), U64_C(0x563acfb37563a5d7), U64_C(0x5086e740ce47c920), U64_C(0x2982f186dda3f843), U64_C(0x87696aac5e798b56), U64_C(0x5d22bb1d1f010380), U64_C(0x035e14f7d31236f5), U64_C(0x3cec0d30da759f18), U64_C(0xf3c920379cdb7095), U64_C(0xb8db736b571e22bb), U64_C(0xdd36f5e44052f672), U64_C(0xaac8ab8851e23b44), U64_C(0xa857b3d938fe1fe2), U64_C(0x17f1e4e76eca43fd), U64_C(0xec7ea4894b61a3ca), U64_C(0x9e62c6e132e734fe), U64_C(0xd4b1991b432c7483), U64_C(0x6ad6c283af163acf), U64_C(0x1ce9904904a8e5aa), U64_C(0x5fbda34c761d2726), U64_C(0xf910583f4cb7c491), U64_C(0xc6a241f845d06d7c), U64_C(0x4f3163fe19fd1a7f), U64_C(0xe99c988d2357f9c8), U64_C(0x8eee06535d0709a7), U64_C(0x0efa48aa0254fc55), U64_C(0xb4be23903c56fa48), U64_C(0x763f52caabbedf65), U64_C(0xeee1bcd8227d876c), U64_C(0xe345e085f33b4dcc), U64_C(0x3e731561b369bbbe), U64_C(0x2843fd2067adea10), U64_C(0x2adce5710eb1ceb6), U64_C(0xb7e03767ef44ccbd), U64_C(0x8db012a48e153f52), U64_C(0x61ceb62dc5749c98), U64_C(0xe85d942b9959eb9b), U64_C(0x4c6f7709caef2c8a), U64_C(0x84377e5b8d6bbda3), U64_C(0x30895dcbb13d47eb), U64_C(0x74a04a9bc2a2fbc3), U64_C(0x6b17ce251518289c), U64_C(0xe438c4d0f2113368), U64_C(0x1fb784bed7bad35f), U64_C(0x9b80fae55ad16efc), U64_C(0x77fe5e6c11b0cd36), U64_C(0xc858095247849129), U64_C(0x08466059b97090a2), U64_C(0x01c10ca6ba0e1253), U64_C(0x6988d6747c040c3a), U64_C(0x6849dad2c60a1e69), U64_C(0x5147ebe67449db73), U64_C(0xc99905f4fd8a837a), U64_C(0x991fe2b433cd4a5a), U64_C(0xf09734c04fc94660), U64_C(0xa28ecbd1e892abe6), U64_C(0xf1563866f5c75433), U64_C(0x4dae7baf70e13ed9), U64_C(0x7ce62ac27bd26b61), U64_C(0x70837a39109ab392), U64_C(0x90988e4b30b3c8ab), U64_C(0xb2020b63877296bf), U64_C(0x156efcb607d6675b) }, /* 7 */ { U64_C(0xe63f55ce97c331d0), U64_C(0x25b506b0015bba16), U64_C(0xc8706e29e6ad9ba8), U64_C(0x5b43d3775d521f6a), U64_C(0x0bfa3d577035106e), U64_C(0xab95fc172afb0e66), U64_C(0xf64b63979e7a3276), U64_C(0xf58b4562649dad4b), U64_C(0x48f7c3dbae0c83f1), U64_C(0xff31916642f5c8c5), U64_C(0xcbb048dc1c4a0495), U64_C(0x66b8f83cdf622989), U64_C(0x35c130e908e2b9b0), U64_C(0x7c761a61f0b34fa1), U64_C(0x3601161cf205268d), U64_C(0x9e54ccfe2219b7d6), U64_C(0x8b7d90a538940837), U64_C(0x9cd403588ea35d0b), U64_C(0xbc3c6fea9ccc5b5a), U64_C(0xe5ff733b6d24aeed), U64_C(0xceed22de0f7eb8d2), U64_C(0xec8581cab1ab545e), U64_C(0xb96105e88ff8e71d), U64_C(0x8ca03501871a5ead), U64_C(0x76ccce65d6db2a2f), U64_C(0x5883f582a7b58057), U64_C(0x3f7be4ed2e8adc3e), U64_C(0x0fe7be06355cd9c9), U64_C(0xee054e6c1d11be83), U64_C(0x1074365909b903a6), U64_C(0x5dde9f80b4813c10), U64_C(0x4a770c7d02b6692c), U64_C(0x5379c8d5d7809039), U64_C(0xb4067448161ed409), U64_C(0x5f5e5026183bd6cd), U64_C(0xe898029bf4c29df9), U64_C(0x7fb63c940a54d09c), U64_C(0xc5171f897f4ba8bc), U64_C(0xa6f28db7b31d3d72), U64_C(0x2e4f3be7716eaa78), U64_C(0x0d6771a099e63314), U64_C(0x82076254e41bf284), U64_C(0x2f0fd2b42733df98), U64_C(0x5c9e76d3e2dc49f0), U64_C(0x7aeb569619606cdb), U64_C(0x83478b07b2468764), U64_C(0xcfadcb8d5923cd32), U64_C(0x85dac7f05b95a41e), U64_C(0xb5469d1b4043a1e9), U64_C(0xb821ecbbd9a592fd), U64_C(0x1b8e0b0e798c13c8), U64_C(0x62a57b6d9a0be02e), U64_C(0xfcf1b793b81257f8), U64_C(0x9d94ea0bd8fe28eb), U64_C(0x4cea408aeb654a56), U64_C(0x23284a47e888996c), U64_C(0x2d8f1d128b893545), U64_C(0xf4cbac3132c0d8ab), U64_C(0xbd7c86b9ca912eba), U64_C(0x3a268eef3dbe6079), U64_C(0xf0d62f6077a9110c), U64_C(0x2735c916ade150cb), U64_C(0x89fd5f03942ee2ea), U64_C(0x1acee25d2fd16628), U64_C(0x90f39bab41181bff), U64_C(0x430dfe8cde39939f), U64_C(0xf70b8ac4c8274796), U64_C(0x1c53aeaac6024552), U64_C(0x13b410acf35e9c9b), U64_C(0xa532ab4249faa24f), U64_C(0x2b1251e5625a163f), U64_C(0xd7e3e676da4841c7), U64_C(0xa7b264e4e5404892), U64_C(0xda8497d643ae72d3), U64_C(0x861ae105a1723b23), U64_C(0x38a6414991048aa4), U64_C(0x6578dec92585b6b4), U64_C(0x0280cfa6acbaeadd), U64_C(0x88bdb650c273970a), U64_C(0x9333bd5ebbff84c2), U64_C(0x4e6a8f2c47dfa08b), U64_C(0x321c954db76cef2a), U64_C(0x418d312a72837942), U64_C(0xb29b38bfffcdf773), U64_C(0x6c022c38f90a4c07), U64_C(0x5a033a240b0f6a8a), U64_C(0x1f93885f3ce5da6f), U64_C(0xc38a537e96988bc6), U64_C(0x39e6a81ac759ff44), U64_C(0x29929e43cee0fce2), U64_C(0x40cdd87924de0ca2), U64_C(0xe9d8ebc8a29fe819), U64_C(0x0c2798f3cfbb46f4), U64_C(0x55e484223e53b343), U64_C(0x4650948ecd0d2fd8), U64_C(0x20e86cb2126f0651), U64_C(0x6d42c56baf5739e7), U64_C(0xa06fc1405ace1e08), U64_C(0x7babbfc54f3d193b), U64_C(0x424d17df8864e67f), U64_C(0xd8045870ef14980e), U64_C(0xc6d7397c85ac3781), U64_C(0x21a885e1443273b1), U64_C(0x67f8116f893f5c69), U64_C(0x24f5efe35706cff6), U64_C(0xd56329d076f2ab1a), U64_C(0x5e1eb9754e66a32d), U64_C(0x28d2771098bd8902), U64_C(0x8f6013f47dfdc190), U64_C(0x17a993fdb637553c), U64_C(0xe0a219397e1012aa), U64_C(0x786b9930b5da8606), U64_C(0x6e82e39e55b0a6da), U64_C(0x875a0856f72f4ec3), U64_C(0x3741ff4fa458536d), U64_C(0xac4859b3957558fc), U64_C(0x7ef6d5c75c09a57c), U64_C(0xc04a758b6c7f14fb), U64_C(0xf9acdd91ab26ebbf), U64_C(0x7391a467c5ef9668), U64_C(0x335c7c1ee1319aca), U64_C(0xa91533b18641e4bb), U64_C(0xe4bf9a683b79db0d), U64_C(0x8e20faa72ba0b470), U64_C(0x51f907737b3a7ae4), U64_C(0x2268a314bed5ec8c), U64_C(0xd944b123b949edee), U64_C(0x31dcb3b84d8b7017), U64_C(0xd3fe65279f218860), U64_C(0x097af2f1dc8ffab3), U64_C(0x9b09a6fc312d0b91), U64_C(0xcc6ded78a3c4520f), U64_C(0x3481d9ba5ebfcc50), U64_C(0x4f2a667f1182d56b), U64_C(0xdfd9fdd4509ace94), U64_C(0x26752045fbbc252b), U64_C(0xbffc491f662bc467), U64_C(0xdd593272fc202449), U64_C(0x3cbbc218d46d4303), U64_C(0x91b372f817456e1f), U64_C(0x681faf69bc6385a0), U64_C(0xb686bbeebaa43ed4), U64_C(0x1469b5084cd0ca01), U64_C(0x98c98009cbca94ac), U64_C(0x6438379a73d8c354), U64_C(0xc2caba2dc0c5fe26), U64_C(0x3e3b0dbe78d7a9de), U64_C(0x50b9ee202d670f04), U64_C(0x4590b27b37eab0e5), U64_C(0x6025b4cb36b10af3), U64_C(0xfb2c1237079c0162), U64_C(0xa12f28130c936be8), U64_C(0x4b37e52e54eb1ccc), U64_C(0x083a1ba28ad28f53), U64_C(0xc10a9cd83a22611b), U64_C(0x9f1425ad7444c236), U64_C(0x069d4cf7e9d3237a), U64_C(0xedc56899e7f621be), U64_C(0x778c273680865fcf), U64_C(0x309c5aeb1bd605f7), U64_C(0x8de0dc52d1472b4d), U64_C(0xf8ec34c2fd7b9e5f), U64_C(0xea18cd3d58787724), U64_C(0xaad515447ca67b86), U64_C(0x9989695a9d97e14c), U64_C(0x0000000000000000), U64_C(0xf196c63321f464ec), U64_C(0x71116bc169557cb5), U64_C(0xaf887f466f92c7c1), U64_C(0x972e3e0ffe964d65), U64_C(0x190ec4a8d536f915), U64_C(0x95aef1a9522ca7b8), U64_C(0xdc19db21aa7d51a9), U64_C(0x94ee18fa0471d258), U64_C(0x8087adf248a11859), U64_C(0xc457f6da2916dd5c), U64_C(0xfa6cfb6451c17482), U64_C(0xf256e0c6db13fbd1), U64_C(0x6a9f60cf10d96f7d), U64_C(0x4daaa9d9bd383fb6), U64_C(0x03c026f5fae79f3d), U64_C(0xde99148706c7bb74), U64_C(0x2a52b8b6340763df), U64_C(0x6fc20acd03edd33a), U64_C(0xd423c08320afdefa), U64_C(0xbbe1ca4e23420dc0), U64_C(0x966ed75ca8cb3885), U64_C(0xeb58246e0e2502c4), U64_C(0x055d6a021334bc47), U64_C(0xa47242111fa7d7af), U64_C(0xe3623fcc84f78d97), U64_C(0x81c744a11efc6db9), U64_C(0xaec8961539cfb221), U64_C(0xf31609958d4e8e31), U64_C(0x63e5923ecc5695ce), U64_C(0x47107ddd9b505a38), U64_C(0xa3afe7b5a0298135), U64_C(0x792b7063e387f3e6), U64_C(0x0140e953565d75e0), U64_C(0x12f4f9ffa503e97b), U64_C(0x750ce8902c3cb512), U64_C(0xdbc47e8515f30733), U64_C(0x1ed3610c6ab8af8f), U64_C(0x5239218681dde5d9), U64_C(0xe222d69fd2aaf877), U64_C(0xfe71783514a8bd25), U64_C(0xcaf0a18f4a177175), U64_C(0x61655d9860ec7f13), U64_C(0xe77fbc9dc19e4430), U64_C(0x2ccff441ddd440a5), U64_C(0x16e97aaee06a20dc), U64_C(0xa855dae2d01c915b), U64_C(0x1d1347f9905f30b2), U64_C(0xb7c652bdecf94b34), U64_C(0xd03e43d265c6175d), U64_C(0xfdb15ec0ee4f2218), U64_C(0x57644b8492e9599e), U64_C(0x07dda5a4bf8e569a), U64_C(0x54a46d71680ec6a3), U64_C(0x5624a2d7c4b42c7e), U64_C(0xbebca04c3076b187), U64_C(0x7d36f332a6ee3a41), U64_C(0x3b6667bc6be31599), U64_C(0x695f463aea3ef040), U64_C(0xad08b0e0c3282d1c), U64_C(0xb15b1e4a052a684e), U64_C(0x44d05b2861b7c505), U64_C(0x15295c5b1a8dbfe1), U64_C(0x744c01c37a61c0f2), U64_C(0x59c31cd1f1e8f5b7), U64_C(0xef45a73f4b4ccb63), U64_C(0x6bdf899c46841a9d), U64_C(0x3dfb2b4b823036e3), U64_C(0xa2ef0ee6f674f4d5), U64_C(0x184e2dfb836b8cf5), U64_C(0x1134df0a5fe47646), U64_C(0xbaa1231d751f7820), U64_C(0xd17eaa81339b62bd), U64_C(0xb01bf71953771dae), U64_C(0x849a2ea30dc8d1fe), U64_C(0x705182923f080955), U64_C(0x0ea757556301ac29), U64_C(0x041d83514569c9a7), U64_C(0x0abad4042668658e), U64_C(0x49b72a88f851f611), U64_C(0x8a3d79f66ec97dd7), U64_C(0xcd2d042bf59927ef), U64_C(0xc930877ab0f0ee48), U64_C(0x9273540deda2f122), U64_C(0xc797d02fd3f14261), U64_C(0xe1e2f06a284d674a), U64_C(0xd2be8c74c97cfd80), U64_C(0x9a494faf67707e71), U64_C(0xb3dbd1eca9908293), U64_C(0x72d14d3493b2e388), U64_C(0xd6a30f258c153427) }, }; static const u64 C16[12][8] = { { U64_C(0xdd806559f2a64507), U64_C(0x05767436cc744d23), U64_C(0xa2422a08a460d315), U64_C(0x4b7ce09192676901), U64_C(0x714eb88d7585c4fc), U64_C(0x2f6a76432e45d016), U64_C(0xebcb2f81c0657c1f), U64_C(0xb1085bda1ecadae9) }, { U64_C(0xe679047021b19bb7), U64_C(0x55dda21bd7cbcd56), U64_C(0x5cb561c2db0aa7ca), U64_C(0x9ab5176b12d69958), U64_C(0x61d55e0f16b50131), U64_C(0xf3feea720a232b98), U64_C(0x4fe39d460f70b5d7), U64_C(0x6fa3b58aa99d2f1a) }, { U64_C(0x991e96f50aba0ab2), U64_C(0xc2b6f443867adb31), U64_C(0xc1c93a376062db09), U64_C(0xd3e20fe490359eb1), U64_C(0xf2ea7514b1297b7b), U64_C(0x06f15e5f529c1f8b), U64_C(0x0a39fc286a3d8435), U64_C(0xf574dcac2bce2fc7) }, { U64_C(0x220cbebc84e3d12e), U64_C(0x3453eaa193e837f1), U64_C(0xd8b71333935203be), U64_C(0xa9d72c82ed03d675), U64_C(0x9d721cad685e353f), U64_C(0x488e857e335c3c7d), U64_C(0xf948e1a05d71e4dd), U64_C(0xef1fdfb3e81566d2) }, { U64_C(0x601758fd7c6cfe57), U64_C(0x7a56a27ea9ea63f5), U64_C(0xdfff00b723271a16), U64_C(0xbfcd1747253af5a3), U64_C(0x359e35d7800fffbd), U64_C(0x7f151c1f1686104a), U64_C(0x9a3f410c6ca92363), U64_C(0x4bea6bacad474799) }, { U64_C(0xfa68407a46647d6e), U64_C(0xbf71c57236904f35), U64_C(0x0af21f66c2bec6b6), U64_C(0xcffaa6b71c9ab7b4), U64_C(0x187f9ab49af08ec6), U64_C(0x2d66c4f95142a46c), U64_C(0x6fa4c33b7a3039c0), U64_C(0xae4faeae1d3ad3d9) }, { U64_C(0x8886564d3a14d493), U64_C(0x3517454ca23c4af3), U64_C(0x06476983284a0504), U64_C(0x0992abc52d822c37), U64_C(0xd3473e33197a93c9), U64_C(0x399ec6c7e6bf87c9), U64_C(0x51ac86febf240954), U64_C(0xf4c70e16eeaac5ec) }, { U64_C(0xa47f0dd4bf02e71e), U64_C(0x36acc2355951a8d9), U64_C(0x69d18d2bd1a5c42f), U64_C(0xf4892bcb929b0690), U64_C(0x89b4443b4ddbc49a), U64_C(0x4eb7f8719c36de1e), U64_C(0x03e7aa020c6e4141), U64_C(0x9b1f5b424d93c9a7) }, { U64_C(0x7261445183235adb), U64_C(0x0e38dc92cb1f2a60), U64_C(0x7b2b8a9aa6079c54), U64_C(0x800a440bdbb2ceb1), U64_C(0x3cd955b7e00d0984), U64_C(0x3a7d3a1b25894224), U64_C(0x944c9ad8ec165fde), U64_C(0x378f5a541631229b) }, { U64_C(0x74b4c7fb98459ced), U64_C(0x3698fad1153bb6c3), U64_C(0x7a1e6c303b7652f4), U64_C(0x9fe76702af69334b), U64_C(0x1fffe18a1b336103), U64_C(0x8941e71cff8a78db), U64_C(0x382ae548b2e4f3f3), U64_C(0xabbedea680056f52) }, { U64_C(0x6bcaa4cd81f32d1b), U64_C(0xdea2594ac06fd85d), U64_C(0xefbacd1d7d476e98), U64_C(0x8a1d71efea48b9ca), U64_C(0x2001802114846679), U64_C(0xd8fa6bbbebab0761), U64_C(0x3002c6cd635afe94), U64_C(0x7bcd9ed0efc889fb) }, { U64_C(0x48bc924af11bd720), U64_C(0xfaf417d5d9b21b99), U64_C(0xe71da4aa88e12852), U64_C(0x5d80ef9d1891cc86), U64_C(0xf82012d430219f9b), U64_C(0xcda43c32bcdf1d77), U64_C(0xd21380b00449b17a), U64_C(0x378ee767f11631ba) }, }; #define strido(out, temp, i) do { \ u64 t; \ t = stribog_table[0][(temp[0] >> (i * 8)) & 0xff]; \ t ^= stribog_table[1][(temp[1] >> (i * 8)) & 0xff]; \ t ^= stribog_table[2][(temp[2] >> (i * 8)) & 0xff]; \ t ^= stribog_table[3][(temp[3] >> (i * 8)) & 0xff]; \ t ^= stribog_table[4][(temp[4] >> (i * 8)) & 0xff]; \ t ^= stribog_table[5][(temp[5] >> (i * 8)) & 0xff]; \ t ^= stribog_table[6][(temp[6] >> (i * 8)) & 0xff]; \ t ^= stribog_table[7][(temp[7] >> (i * 8)) & 0xff]; \ out[i] = t; } while(0) static void LPSX (u64 *out, const u64 *a, const u64 *b) { u64 temp[8]; temp[0] = a[0] ^ b[0]; temp[1] = a[1] ^ b[1]; temp[2] = a[2] ^ b[2]; temp[3] = a[3] ^ b[3]; temp[4] = a[4] ^ b[4]; temp[5] = a[5] ^ b[5]; temp[6] = a[6] ^ b[6]; temp[7] = a[7] ^ b[7]; strido (out, temp, 0); strido (out, temp, 1); strido (out, temp, 2); strido (out, temp, 3); strido (out, temp, 4); strido (out, temp, 5); strido (out, temp, 6); strido (out, temp, 7); } static inline void g (u64 *h, u64 *m, u64 *N) { u64 K[8]; u64 T[8]; int i; LPSX (K, h, N); LPSX (T, K, m); LPSX (K, K, C16[0]); for (i = 1; i < 12; i++) { LPSX (T, K, T); LPSX (K, K, C16[i]); } h[0] ^= T[0] ^ K[0] ^ m[0]; h[1] ^= T[1] ^ K[1] ^ m[1]; h[2] ^= T[2] ^ K[2] ^ m[2]; h[3] ^= T[3] ^ K[3] ^ m[3]; h[4] ^= T[4] ^ K[4] ^ m[4]; h[5] ^= T[5] ^ K[5] ^ m[5]; h[6] ^= T[6] ^ K[6] ^ m[6]; h[7] ^= T[7] ^ K[7] ^ m[7]; } static unsigned int transform (void *context, const unsigned char *inbuf_arg, size_t datalen); static void stribog_init_512 (void *context, unsigned int flags) { STRIBOG_CONTEXT *hd = context; (void)flags; memset (hd, 0, sizeof (*hd)); hd->bctx.blocksize_shift = _gcry_ctz(64); hd->bctx.bwrite = transform; } static void stribog_init_256 (void *context, unsigned int flags) { STRIBOG_CONTEXT *hd = context; stribog_init_512 (context, flags); memset (hd->h, 1, 64); } static void transform_bits (STRIBOG_CONTEXT *hd, const unsigned char *data, unsigned count) { u64 M[8]; u64 l, cf; int i; for (i = 0; i < 8; i++) M[i] = buf_get_le64(data + i * 8); g (hd->h, M, hd->N); l = hd->N[0]; hd->N[0] += count; if (hd->N[0] < l) { /* overflow */ for (i = 1; i < 8; i++) { hd->N[i]++; if (hd->N[i] != 0) break; } } hd->Sigma[0] += M[0]; cf = 0; for (i = 1; i < 8; i++) { if (hd->Sigma[i-1] != M[i-1]) cf = (hd->Sigma[i-1] < M[i-1]); hd->Sigma[i] += M[i] + cf; } } static unsigned int transform_blk (void *context, const unsigned char *inbuf_arg) { STRIBOG_CONTEXT *hd = context; transform_bits (hd, inbuf_arg, 64 * 8); return /* burn_stack */ 768; } static unsigned int transform ( void *c, const unsigned char *data, size_t nblks ) { unsigned int burn; do { burn = transform_blk (c, data); data += 64; } while (--nblks); return burn; } /* The routine finally terminates the computation and returns the digest. The handle is prepared for a new cycle, but adding bytes to the handle will the destroy the returned buffer. Returns: 32 bytes with the message the digest. */ static void stribog_final (void *context) { STRIBOG_CONTEXT *hd = context; u64 Z[8] = {}; int i; /* PAD. It does not count towards message length */ i = hd->bctx.count; /* After flush we have at least one byte free) */ hd->bctx.buf[i++] = 1; if (i < 64) memset (&hd->bctx.buf[i], 0, 64 - i); i = 64; transform_bits (hd, hd->bctx.buf, hd->bctx.count * 8); g (hd->h, hd->N, Z); g (hd->h, hd->Sigma, Z); for (i = 0; i < 8; i++) hd->h[i] = le_bswap64(hd->h[i]); hd->bctx.count = 0; _gcry_burn_stack (768); } static byte * stribog_read_512 (void *context) { STRIBOG_CONTEXT *hd = context; return hd->result; } static byte * stribog_read_256 (void *context) { STRIBOG_CONTEXT *hd = context; return hd->result + 32; } static const gcry_md_oid_spec_t oid_spec_stribog256[] = { /* id-tc26-signwithdigest-gost3410-12-256 */ { "1.2.643.7.1.1.3.2" }, /* id-tc26-gost3411-12-256 */ { "1.2.643.7.1.1.2.2" }, { NULL }, }; static const gcry_md_oid_spec_t oid_spec_stribog512[] = { /* id-tc26-signwithdigest-gost3410-12-512 */ { "1.2.643.7.1.1.3.3" }, /* id-tc26-gost3411-12-512 */ { "1.2.643.7.1.1.2.3" }, { NULL }, }; gcry_md_spec_t _gcry_digest_spec_stribog_256 = { GCRY_MD_STRIBOG256, {0, 0}, "STRIBOG256", NULL, 0, oid_spec_stribog256, 32, stribog_init_256, _gcry_md_block_write, stribog_final, stribog_read_256, NULL, NULL, sizeof (STRIBOG_CONTEXT) , GRUB_UTIL_MODNAME("gcry_stribog") .blocksize = 64 }; gcry_md_spec_t _gcry_digest_spec_stribog_512 = { GCRY_MD_STRIBOG512, {0, 0}, "STRIBOG512", NULL, 0, oid_spec_stribog512, 64, stribog_init_512, _gcry_md_block_write, stribog_final, stribog_read_512, NULL, NULL, sizeof (STRIBOG_CONTEXT) , GRUB_UTIL_MODNAME("gcry_stribog") .blocksize = 64 }; GRUB_MOD_INIT(gcry_stribog) { grub_md_register (&_gcry_digest_spec_stribog_256); grub_md_register (&_gcry_digest_spec_stribog_512); } GRUB_MOD_FINI(gcry_stribog) { grub_md_unregister (&_gcry_digest_spec_stribog_256); grub_md_unregister (&_gcry_digest_spec_stribog_512); } grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/cipher/asm-common-s390x.h0000644000175000017500000000575615036452441023763 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ /* asm-common-s390x.h - Common macros for zSeries assembly * * Copyright (C) 2020 Jussi Kivilinna * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . */ #ifndef GCRY_ASM_COMMON_S390X_H #define GCRY_ASM_COMMON_S390X_H #ifdef HAVE_GCC_ASM_ELF_DIRECTIVES # define ELF(...) __VA_ARGS__ #else # define ELF(...) /*_*/ #endif #ifdef HAVE_GCC_ASM_CFI_DIRECTIVES /* CFI directives to emit DWARF stack unwinding information. */ # define CFI_STARTPROC() .cfi_startproc # define CFI_ENDPROC() .cfi_endproc # define CFI_REMEMBER_STATE() .cfi_remember_state # define CFI_RESTORE_STATE() .cfi_restore_state # define CFI_ADJUST_CFA_OFFSET(off) .cfi_adjust_cfa_offset off # define CFI_REL_OFFSET(reg,off) .cfi_rel_offset reg, off # define CFI_DEF_CFA_REGISTER(reg) .cfi_def_cfa_register reg # define CFI_REGISTER(ro,rn) .cfi_register ro, rn # define CFI_RESTORE(reg) .cfi_restore reg /* CFA expressions are used for pointing CFA and registers to * SP relative offsets. */ # define DW_REGNO_SP 15 /* Fixed length encoding used for integers for now. */ # define DW_SLEB128_7BIT(value) \ 0x00|((value) & 0x7f) # define DW_SLEB128_28BIT(value) \ 0x80|((value)&0x7f), \ 0x80|(((value)>>7)&0x7f), \ 0x80|(((value)>>14)&0x7f), \ 0x00|(((value)>>21)&0x7f) # define CFI_CFA_ON_STACK(rsp_offs,cfa_depth) \ .cfi_escape \ 0x0f, /* DW_CFA_def_cfa_expression */ \ DW_SLEB128_7BIT(11), /* length */ \ 0x7f, /* DW_OP_breg15, rsp + constant */ \ DW_SLEB128_28BIT(rsp_offs), \ 0x06, /* DW_OP_deref */ \ 0x23, /* DW_OP_plus_constu */ \ DW_SLEB128_28BIT((cfa_depth)+160) # define CFI_REG_ON_STACK(regno,rsp_offs) \ .cfi_escape \ 0x10, /* DW_CFA_expression */ \ DW_SLEB128_7BIT(regno), \ DW_SLEB128_7BIT(5), /* length */ \ 0x7f, /* DW_OP_breg15, rsp + constant */ \ DW_SLEB128_28BIT(rsp_offs) #else # define CFI_STARTPROC() # define CFI_ENDPROC() # define CFI_REMEMBER_STATE() # define CFI_RESTORE_STATE() # define CFI_ADJUST_CFA_OFFSET(off) # define CFI_REL_OFFSET(reg,off) # define CFI_DEF_CFA_REGISTER(reg) # define CFI_REGISTER(ro,rn) # define CFI_RESTORE(reg) # define CFI_CFA_ON_STACK(rsp_offs,cfa_depth) # define CFI_REG_ON_STACK(reg,rsp_offs) #endif #endif /* GCRY_ASM_COMMON_AMD64_H */ grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/cipher/des.c0000644000175000017500000011564415036452441021575 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ #include GRUB_MOD_LICENSE ("GPLv3+"); /* des.c - DES and Triple-DES encryption/decryption Algorithm * Copyright (C) 1998, 1999, 2001, 2002, 2003, * 2008 Free Software Foundation, Inc. * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . * SPDX-License-Identifier: LGPL-2.1-or-later * * For a description of triple encryption, see: * Bruce Schneier: Applied Cryptography. Second Edition. * John Wiley & Sons, 1996. ISBN 0-471-12845-7. Pages 358 ff. * This implementation is according to the definition of DES in FIPS * PUB 46-2 from December 1993. */ /* * Written by Michael Roth , September 1998 */ /* * U S A G E * =========== * * For DES or Triple-DES encryption/decryption you must initialize a proper * encryption context with a key. * * A DES key is 64bit wide but only 56bits of the key are used. The remaining * bits are parity bits and they will _not_ checked in this implementation, but * simply ignored. * * For Triple-DES you could use either two 64bit keys or three 64bit keys. * The parity bits will _not_ checked, too. * * After initializing a context with a key you could use this context to * encrypt or decrypt data in 64bit blocks in Electronic Codebook Mode. * * (In the examples below the slashes at the beginning and ending of comments * are omitted.) * * DES Example * ----------- * unsigned char key[8]; * unsigned char plaintext[8]; * unsigned char ciphertext[8]; * unsigned char recoverd[8]; * des_ctx context; * * * Fill 'key' and 'plaintext' with some data * * .... * * * Set up the DES encryption context * * des_setkey(context, key); * * * Encrypt the plaintext * * des_ecb_encrypt(context, plaintext, ciphertext); * * * To recover the original plaintext from ciphertext use: * * des_ecb_decrypt(context, ciphertext, recoverd); * * * Triple-DES Example * ------------------ * unsigned char key1[8]; * unsigned char key2[8]; * unsigned char key3[8]; * unsigned char plaintext[8]; * unsigned char ciphertext[8]; * unsigned char recoverd[8]; * tripledes_ctx context; * * * If you would like to use two 64bit keys, fill 'key1' and'key2' * then setup the encryption context: * * tripledes_set2keys(context, key1, key2); * * * To use three 64bit keys with Triple-DES use: * * tripledes_set3keys(context, key1, key2, key3); * * * Encrypting plaintext with Triple-DES * * tripledes_ecb_encrypt(context, plaintext, ciphertext); * * * Decrypting ciphertext to recover the plaintext with Triple-DES * * tripledes_ecb_decrypt(context, ciphertext, recoverd); * * * Selftest * -------- * char *error_msg; * * * To perform a selftest of this DES/Triple-DES implementation use the * function selftest(). It will return an error string if there are * some problems with this library. * * * if ( (error_msg = selftest()) ) * { * fprintf(stderr, "An error in the DES/Triple-DES implementation occurred: %s\n", error_msg); * abort(); * } */ #include "types.h" /* for byte and u32 typedefs */ #include "g10lib.h" #include "cipher.h" #include "bufhelp.h" #include "cipher-internal.h" #define DES_BLOCKSIZE 8 /* USE_AMD64_ASM indicates whether to use AMD64 assembly code. */ #undef USE_AMD64_ASM #if defined(__x86_64__) && (defined(HAVE_COMPATIBLE_GCC_AMD64_PLATFORM_AS) || \ defined(HAVE_COMPATIBLE_GCC_WIN64_PLATFORM_AS)) # define USE_AMD64_ASM 1 #endif /* Helper macro to force alignment to 16 bytes. */ #ifdef HAVE_GCC_ATTRIBUTE_ALIGNED # define ATTR_ALIGNED_16 __attribute__ ((aligned (16))) #else # define ATTR_ALIGNED_16 #endif #if defined(__GNUC__) && defined(__GNU_LIBRARY__) # define working_memcmp memcmp #else /* * According to the SunOS man page, memcmp returns indeterminate sign * depending on whether characters are signed or not. */ static int working_memcmp( const void *_a, const void *_b, size_t n ) { const char *a = _a; const char *b = _b; for( ; n; n--, a++, b++ ) if( *a != *b ) return (int)(*(byte*)a) - (int)(*(byte*)b); return 0; } #endif /* * Encryption/Decryption context of DES */ typedef struct _des_ctx { u32 encrypt_subkeys[32]; u32 decrypt_subkeys[32]; } des_ctx[1]; /* * Encryption/Decryption context of Triple-DES */ typedef struct _tripledes_ctx { u32 encrypt_subkeys[96]; u32 decrypt_subkeys[96]; struct { int no_weak_key; } flags; } tripledes_ctx[1]; static void des_key_schedule (const byte *, u32 *); static int des_setkey (struct _des_ctx *, const byte *); static int des_ecb_crypt (struct _des_ctx *, const byte *, byte *, int); static int tripledes_ecb_crypt (struct _tripledes_ctx *, const byte *, byte *, int); static int is_weak_key ( const byte *key ); static unsigned int do_tripledes_encrypt(void *context, byte *outbuf, const byte *inbuf ); static unsigned int do_tripledes_decrypt(void *context, byte *outbuf, const byte *inbuf ); static gcry_err_code_t do_tripledes_setkey(void *context, const byte *key, unsigned keylen, cipher_bulk_ops_t *bulk_ops); static int initialized; /* * The s-box values are permuted according to the 'primitive function P' * and are rotated one bit to the left. */ static u32 sbox1[64] = { 0x01010400, 0x00000000, 0x00010000, 0x01010404, 0x01010004, 0x00010404, 0x00000004, 0x00010000, 0x00000400, 0x01010400, 0x01010404, 0x00000400, 0x01000404, 0x01010004, 0x01000000, 0x00000004, 0x00000404, 0x01000400, 0x01000400, 0x00010400, 0x00010400, 0x01010000, 0x01010000, 0x01000404, 0x00010004, 0x01000004, 0x01000004, 0x00010004, 0x00000000, 0x00000404, 0x00010404, 0x01000000, 0x00010000, 0x01010404, 0x00000004, 0x01010000, 0x01010400, 0x01000000, 0x01000000, 0x00000400, 0x01010004, 0x00010000, 0x00010400, 0x01000004, 0x00000400, 0x00000004, 0x01000404, 0x00010404, 0x01010404, 0x00010004, 0x01010000, 0x01000404, 0x01000004, 0x00000404, 0x00010404, 0x01010400, 0x00000404, 0x01000400, 0x01000400, 0x00000000, 0x00010004, 0x00010400, 0x00000000, 0x01010004 }; static u32 sbox2[64] = { 0x80108020, 0x80008000, 0x00008000, 0x00108020, 0x00100000, 0x00000020, 0x80100020, 0x80008020, 0x80000020, 0x80108020, 0x80108000, 0x80000000, 0x80008000, 0x00100000, 0x00000020, 0x80100020, 0x00108000, 0x00100020, 0x80008020, 0x00000000, 0x80000000, 0x00008000, 0x00108020, 0x80100000, 0x00100020, 0x80000020, 0x00000000, 0x00108000, 0x00008020, 0x80108000, 0x80100000, 0x00008020, 0x00000000, 0x00108020, 0x80100020, 0x00100000, 0x80008020, 0x80100000, 0x80108000, 0x00008000, 0x80100000, 0x80008000, 0x00000020, 0x80108020, 0x00108020, 0x00000020, 0x00008000, 0x80000000, 0x00008020, 0x80108000, 0x00100000, 0x80000020, 0x00100020, 0x80008020, 0x80000020, 0x00100020, 0x00108000, 0x00000000, 0x80008000, 0x00008020, 0x80000000, 0x80100020, 0x80108020, 0x00108000 }; static u32 sbox3[64] = { 0x00000208, 0x08020200, 0x00000000, 0x08020008, 0x08000200, 0x00000000, 0x00020208, 0x08000200, 0x00020008, 0x08000008, 0x08000008, 0x00020000, 0x08020208, 0x00020008, 0x08020000, 0x00000208, 0x08000000, 0x00000008, 0x08020200, 0x00000200, 0x00020200, 0x08020000, 0x08020008, 0x00020208, 0x08000208, 0x00020200, 0x00020000, 0x08000208, 0x00000008, 0x08020208, 0x00000200, 0x08000000, 0x08020200, 0x08000000, 0x00020008, 0x00000208, 0x00020000, 0x08020200, 0x08000200, 0x00000000, 0x00000200, 0x00020008, 0x08020208, 0x08000200, 0x08000008, 0x00000200, 0x00000000, 0x08020008, 0x08000208, 0x00020000, 0x08000000, 0x08020208, 0x00000008, 0x00020208, 0x00020200, 0x08000008, 0x08020000, 0x08000208, 0x00000208, 0x08020000, 0x00020208, 0x00000008, 0x08020008, 0x00020200 }; static u32 sbox4[64] = { 0x00802001, 0x00002081, 0x00002081, 0x00000080, 0x00802080, 0x00800081, 0x00800001, 0x00002001, 0x00000000, 0x00802000, 0x00802000, 0x00802081, 0x00000081, 0x00000000, 0x00800080, 0x00800001, 0x00000001, 0x00002000, 0x00800000, 0x00802001, 0x00000080, 0x00800000, 0x00002001, 0x00002080, 0x00800081, 0x00000001, 0x00002080, 0x00800080, 0x00002000, 0x00802080, 0x00802081, 0x00000081, 0x00800080, 0x00800001, 0x00802000, 0x00802081, 0x00000081, 0x00000000, 0x00000000, 0x00802000, 0x00002080, 0x00800080, 0x00800081, 0x00000001, 0x00802001, 0x00002081, 0x00002081, 0x00000080, 0x00802081, 0x00000081, 0x00000001, 0x00002000, 0x00800001, 0x00002001, 0x00802080, 0x00800081, 0x00002001, 0x00002080, 0x00800000, 0x00802001, 0x00000080, 0x00800000, 0x00002000, 0x00802080 }; static u32 sbox5[64] = { 0x00000100, 0x02080100, 0x02080000, 0x42000100, 0x00080000, 0x00000100, 0x40000000, 0x02080000, 0x40080100, 0x00080000, 0x02000100, 0x40080100, 0x42000100, 0x42080000, 0x00080100, 0x40000000, 0x02000000, 0x40080000, 0x40080000, 0x00000000, 0x40000100, 0x42080100, 0x42080100, 0x02000100, 0x42080000, 0x40000100, 0x00000000, 0x42000000, 0x02080100, 0x02000000, 0x42000000, 0x00080100, 0x00080000, 0x42000100, 0x00000100, 0x02000000, 0x40000000, 0x02080000, 0x42000100, 0x40080100, 0x02000100, 0x40000000, 0x42080000, 0x02080100, 0x40080100, 0x00000100, 0x02000000, 0x42080000, 0x42080100, 0x00080100, 0x42000000, 0x42080100, 0x02080000, 0x00000000, 0x40080000, 0x42000000, 0x00080100, 0x02000100, 0x40000100, 0x00080000, 0x00000000, 0x40080000, 0x02080100, 0x40000100 }; static u32 sbox6[64] = { 0x20000010, 0x20400000, 0x00004000, 0x20404010, 0x20400000, 0x00000010, 0x20404010, 0x00400000, 0x20004000, 0x00404010, 0x00400000, 0x20000010, 0x00400010, 0x20004000, 0x20000000, 0x00004010, 0x00000000, 0x00400010, 0x20004010, 0x00004000, 0x00404000, 0x20004010, 0x00000010, 0x20400010, 0x20400010, 0x00000000, 0x00404010, 0x20404000, 0x00004010, 0x00404000, 0x20404000, 0x20000000, 0x20004000, 0x00000010, 0x20400010, 0x00404000, 0x20404010, 0x00400000, 0x00004010, 0x20000010, 0x00400000, 0x20004000, 0x20000000, 0x00004010, 0x20000010, 0x20404010, 0x00404000, 0x20400000, 0x00404010, 0x20404000, 0x00000000, 0x20400010, 0x00000010, 0x00004000, 0x20400000, 0x00404010, 0x00004000, 0x00400010, 0x20004010, 0x00000000, 0x20404000, 0x20000000, 0x00400010, 0x20004010 }; static u32 sbox7[64] = { 0x00200000, 0x04200002, 0x04000802, 0x00000000, 0x00000800, 0x04000802, 0x00200802, 0x04200800, 0x04200802, 0x00200000, 0x00000000, 0x04000002, 0x00000002, 0x04000000, 0x04200002, 0x00000802, 0x04000800, 0x00200802, 0x00200002, 0x04000800, 0x04000002, 0x04200000, 0x04200800, 0x00200002, 0x04200000, 0x00000800, 0x00000802, 0x04200802, 0x00200800, 0x00000002, 0x04000000, 0x00200800, 0x04000000, 0x00200800, 0x00200000, 0x04000802, 0x04000802, 0x04200002, 0x04200002, 0x00000002, 0x00200002, 0x04000000, 0x04000800, 0x00200000, 0x04200800, 0x00000802, 0x00200802, 0x04200800, 0x00000802, 0x04000002, 0x04200802, 0x04200000, 0x00200800, 0x00000000, 0x00000002, 0x04200802, 0x00000000, 0x00200802, 0x04200000, 0x00000800, 0x04000002, 0x04000800, 0x00000800, 0x00200002 }; static u32 sbox8[64] = { 0x10001040, 0x00001000, 0x00040000, 0x10041040, 0x10000000, 0x10001040, 0x00000040, 0x10000000, 0x00040040, 0x10040000, 0x10041040, 0x00041000, 0x10041000, 0x00041040, 0x00001000, 0x00000040, 0x10040000, 0x10000040, 0x10001000, 0x00001040, 0x00041000, 0x00040040, 0x10040040, 0x10041000, 0x00001040, 0x00000000, 0x00000000, 0x10040040, 0x10000040, 0x10001000, 0x00041040, 0x00040000, 0x00041040, 0x00040000, 0x10041000, 0x00001000, 0x00000040, 0x10040040, 0x00001000, 0x00041040, 0x10001000, 0x00000040, 0x10000040, 0x10040000, 0x10040040, 0x10000000, 0x00040000, 0x10001040, 0x00000000, 0x10041040, 0x00040040, 0x10000040, 0x10040000, 0x10001000, 0x10001040, 0x00000000, 0x10041040, 0x00041000, 0x00041000, 0x00001040, 0x00001040, 0x00040040, 0x10000000, 0x10041000 }; /* * These two tables are part of the 'permuted choice 1' function. * In this implementation several speed improvements are done. */ static u32 leftkey_swap[16] = { 0x00000000, 0x00000001, 0x00000100, 0x00000101, 0x00010000, 0x00010001, 0x00010100, 0x00010101, 0x01000000, 0x01000001, 0x01000100, 0x01000101, 0x01010000, 0x01010001, 0x01010100, 0x01010101 }; static u32 rightkey_swap[16] = { 0x00000000, 0x01000000, 0x00010000, 0x01010000, 0x00000100, 0x01000100, 0x00010100, 0x01010100, 0x00000001, 0x01000001, 0x00010001, 0x01010001, 0x00000101, 0x01000101, 0x00010101, 0x01010101, }; /* * Numbers of left shifts per round for encryption subkeys. * To calculate the decryption subkeys we just reverse the * ordering of the calculated encryption subkeys. So their * is no need for a decryption rotate tab. */ static byte encrypt_rotate_tab[16] = { 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 }; /* * Table with weak DES keys sorted in ascending order. * In DES their are 64 known keys which are weak. They are weak * because they produce only one, two or four different * subkeys in the subkey scheduling process. * The keys in this table have all their parity bits cleared. */ static byte weak_keys[64][8] = { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, /*w*/ { 0x00, 0x00, 0x1e, 0x1e, 0x00, 0x00, 0x0e, 0x0e }, { 0x00, 0x00, 0xe0, 0xe0, 0x00, 0x00, 0xf0, 0xf0 }, { 0x00, 0x00, 0xfe, 0xfe, 0x00, 0x00, 0xfe, 0xfe }, { 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x0e, 0x00, 0x0e }, /*sw*/ { 0x00, 0x1e, 0x1e, 0x00, 0x00, 0x0e, 0x0e, 0x00 }, { 0x00, 0x1e, 0xe0, 0xfe, 0x00, 0x0e, 0xf0, 0xfe }, { 0x00, 0x1e, 0xfe, 0xe0, 0x00, 0x0e, 0xfe, 0xf0 }, { 0x00, 0xe0, 0x00, 0xe0, 0x00, 0xf0, 0x00, 0xf0 }, /*sw*/ { 0x00, 0xe0, 0x1e, 0xfe, 0x00, 0xf0, 0x0e, 0xfe }, { 0x00, 0xe0, 0xe0, 0x00, 0x00, 0xf0, 0xf0, 0x00 }, { 0x00, 0xe0, 0xfe, 0x1e, 0x00, 0xf0, 0xfe, 0x0e }, { 0x00, 0xfe, 0x00, 0xfe, 0x00, 0xfe, 0x00, 0xfe }, /*sw*/ { 0x00, 0xfe, 0x1e, 0xe0, 0x00, 0xfe, 0x0e, 0xf0 }, { 0x00, 0xfe, 0xe0, 0x1e, 0x00, 0xfe, 0xf0, 0x0e }, { 0x00, 0xfe, 0xfe, 0x00, 0x00, 0xfe, 0xfe, 0x00 }, { 0x1e, 0x00, 0x00, 0x1e, 0x0e, 0x00, 0x00, 0x0e }, { 0x1e, 0x00, 0x1e, 0x00, 0x0e, 0x00, 0x0e, 0x00 }, /*sw*/ { 0x1e, 0x00, 0xe0, 0xfe, 0x0e, 0x00, 0xf0, 0xfe }, { 0x1e, 0x00, 0xfe, 0xe0, 0x0e, 0x00, 0xfe, 0xf0 }, { 0x1e, 0x1e, 0x00, 0x00, 0x0e, 0x0e, 0x00, 0x00 }, { 0x1e, 0x1e, 0x1e, 0x1e, 0x0e, 0x0e, 0x0e, 0x0e }, /*w*/ { 0x1e, 0x1e, 0xe0, 0xe0, 0x0e, 0x0e, 0xf0, 0xf0 }, { 0x1e, 0x1e, 0xfe, 0xfe, 0x0e, 0x0e, 0xfe, 0xfe }, { 0x1e, 0xe0, 0x00, 0xfe, 0x0e, 0xf0, 0x00, 0xfe }, { 0x1e, 0xe0, 0x1e, 0xe0, 0x0e, 0xf0, 0x0e, 0xf0 }, /*sw*/ { 0x1e, 0xe0, 0xe0, 0x1e, 0x0e, 0xf0, 0xf0, 0x0e }, { 0x1e, 0xe0, 0xfe, 0x00, 0x0e, 0xf0, 0xfe, 0x00 }, { 0x1e, 0xfe, 0x00, 0xe0, 0x0e, 0xfe, 0x00, 0xf0 }, { 0x1e, 0xfe, 0x1e, 0xfe, 0x0e, 0xfe, 0x0e, 0xfe }, /*sw*/ { 0x1e, 0xfe, 0xe0, 0x00, 0x0e, 0xfe, 0xf0, 0x00 }, { 0x1e, 0xfe, 0xfe, 0x1e, 0x0e, 0xfe, 0xfe, 0x0e }, { 0xe0, 0x00, 0x00, 0xe0, 0xf0, 0x00, 0x00, 0xf0 }, { 0xe0, 0x00, 0x1e, 0xfe, 0xf0, 0x00, 0x0e, 0xfe }, { 0xe0, 0x00, 0xe0, 0x00, 0xf0, 0x00, 0xf0, 0x00 }, /*sw*/ { 0xe0, 0x00, 0xfe, 0x1e, 0xf0, 0x00, 0xfe, 0x0e }, { 0xe0, 0x1e, 0x00, 0xfe, 0xf0, 0x0e, 0x00, 0xfe }, { 0xe0, 0x1e, 0x1e, 0xe0, 0xf0, 0x0e, 0x0e, 0xf0 }, { 0xe0, 0x1e, 0xe0, 0x1e, 0xf0, 0x0e, 0xf0, 0x0e }, /*sw*/ { 0xe0, 0x1e, 0xfe, 0x00, 0xf0, 0x0e, 0xfe, 0x00 }, { 0xe0, 0xe0, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00 }, { 0xe0, 0xe0, 0x1e, 0x1e, 0xf0, 0xf0, 0x0e, 0x0e }, { 0xe0, 0xe0, 0xe0, 0xe0, 0xf0, 0xf0, 0xf0, 0xf0 }, /*w*/ { 0xe0, 0xe0, 0xfe, 0xfe, 0xf0, 0xf0, 0xfe, 0xfe }, { 0xe0, 0xfe, 0x00, 0x1e, 0xf0, 0xfe, 0x00, 0x0e }, { 0xe0, 0xfe, 0x1e, 0x00, 0xf0, 0xfe, 0x0e, 0x00 }, { 0xe0, 0xfe, 0xe0, 0xfe, 0xf0, 0xfe, 0xf0, 0xfe }, /*sw*/ { 0xe0, 0xfe, 0xfe, 0xe0, 0xf0, 0xfe, 0xfe, 0xf0 }, { 0xfe, 0x00, 0x00, 0xfe, 0xfe, 0x00, 0x00, 0xfe }, { 0xfe, 0x00, 0x1e, 0xe0, 0xfe, 0x00, 0x0e, 0xf0 }, { 0xfe, 0x00, 0xe0, 0x1e, 0xfe, 0x00, 0xf0, 0x0e }, { 0xfe, 0x00, 0xfe, 0x00, 0xfe, 0x00, 0xfe, 0x00 }, /*sw*/ { 0xfe, 0x1e, 0x00, 0xe0, 0xfe, 0x0e, 0x00, 0xf0 }, { 0xfe, 0x1e, 0x1e, 0xfe, 0xfe, 0x0e, 0x0e, 0xfe }, { 0xfe, 0x1e, 0xe0, 0x00, 0xfe, 0x0e, 0xf0, 0x00 }, { 0xfe, 0x1e, 0xfe, 0x1e, 0xfe, 0x0e, 0xfe, 0x0e }, /*sw*/ { 0xfe, 0xe0, 0x00, 0x1e, 0xfe, 0xf0, 0x00, 0x0e }, { 0xfe, 0xe0, 0x1e, 0x00, 0xfe, 0xf0, 0x0e, 0x00 }, { 0xfe, 0xe0, 0xe0, 0xfe, 0xfe, 0xf0, 0xf0, 0xfe }, { 0xfe, 0xe0, 0xfe, 0xe0, 0xfe, 0xf0, 0xfe, 0xf0 }, /*sw*/ { 0xfe, 0xfe, 0x00, 0x00, 0xfe, 0xfe, 0x00, 0x00 }, { 0xfe, 0xfe, 0x1e, 0x1e, 0xfe, 0xfe, 0x0e, 0x0e }, { 0xfe, 0xfe, 0xe0, 0xe0, 0xfe, 0xfe, 0xf0, 0xf0 }, { 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe } /*w*/ }; /* * Macro to swap bits across two words. */ #define DO_PERMUTATION(a, temp, b, offset, mask) \ temp = ((a>>offset) ^ b) & mask; \ b ^= temp; \ a ^= temp<> 31); \ temp = (left ^ right) & 0xaaaaaaaa; \ right ^= temp; \ left ^= temp; \ left = (left << 1) | (left >> 31); /* * The 'inverse initial permutation'. */ #define FINAL_PERMUTATION(left, temp, right) \ left = (left << 31) | (left >> 1); \ temp = (left ^ right) & 0xaaaaaaaa; \ left ^= temp; \ right ^= temp; \ right = (right << 31) | (right >> 1); \ DO_PERMUTATION(right, temp, left, 8, 0x00ff00ff) \ DO_PERMUTATION(right, temp, left, 2, 0x33333333) \ DO_PERMUTATION(left, temp, right, 16, 0x0000ffff) \ DO_PERMUTATION(left, temp, right, 4, 0x0f0f0f0f) /* * A full DES round including 'expansion function', 'sbox substitution' * and 'primitive function P' but without swapping the left and right word. * Please note: The data in 'from' and 'to' is already rotated one bit to * the left, done in the initial permutation. */ #define DES_ROUND(from, to, work, subkey) \ work = from ^ *subkey++; \ to ^= sbox8[ work & 0x3f ]; \ to ^= sbox6[ (work>>8) & 0x3f ]; \ to ^= sbox4[ (work>>16) & 0x3f ]; \ to ^= sbox2[ (work>>24) & 0x3f ]; \ work = ((from << 28) | (from >> 4)) ^ *subkey++; \ to ^= sbox7[ work & 0x3f ]; \ to ^= sbox5[ (work>>8) & 0x3f ]; \ to ^= sbox3[ (work>>16) & 0x3f ]; \ to ^= sbox1[ (work>>24) & 0x3f ]; /* * Macros to convert 8 bytes from/to 32bit words. */ #define READ_64BIT_DATA(data, left, right) \ left = buf_get_be32(data + 0); \ right = buf_get_be32(data + 4); #define WRITE_64BIT_DATA(data, left, right) \ buf_put_be32(data + 0, left); \ buf_put_be32(data + 4, right); /* * Handy macros for encryption and decryption of data */ #define des_ecb_encrypt(ctx, from, to) des_ecb_crypt(ctx, from, to, 0) #define des_ecb_decrypt(ctx, from, to) des_ecb_crypt(ctx, from, to, 1) #define tripledes_ecb_encrypt(ctx, from, to) tripledes_ecb_crypt(ctx,from,to,0) #define tripledes_ecb_decrypt(ctx, from, to) tripledes_ecb_crypt(ctx,from,to,1) /* * des_key_schedule(): Calculate 16 subkeys pairs (even/odd) for * 16 encryption rounds. * To calculate subkeys for decryption the caller * have to reorder the generated subkeys. * * rawkey: 8 Bytes of key data * subkey: Array of at least 32 u32s. Will be filled * with calculated subkeys. * */ static void des_key_schedule (const byte * rawkey, u32 * subkey) { u32 left, right, work; int round; READ_64BIT_DATA (rawkey, left, right) DO_PERMUTATION (right, work, left, 4, 0x0f0f0f0f) DO_PERMUTATION (right, work, left, 0, 0x10101010) left = ((leftkey_swap[(left >> 0) & 0xf] << 3) | (leftkey_swap[(left >> 8) & 0xf] << 2) | (leftkey_swap[(left >> 16) & 0xf] << 1) | (leftkey_swap[(left >> 24) & 0xf]) | (leftkey_swap[(left >> 5) & 0xf] << 7) | (leftkey_swap[(left >> 13) & 0xf] << 6) | (leftkey_swap[(left >> 21) & 0xf] << 5) | (leftkey_swap[(left >> 29) & 0xf] << 4)); left &= 0x0fffffff; right = ((rightkey_swap[(right >> 1) & 0xf] << 3) | (rightkey_swap[(right >> 9) & 0xf] << 2) | (rightkey_swap[(right >> 17) & 0xf] << 1) | (rightkey_swap[(right >> 25) & 0xf]) | (rightkey_swap[(right >> 4) & 0xf] << 7) | (rightkey_swap[(right >> 12) & 0xf] << 6) | (rightkey_swap[(right >> 20) & 0xf] << 5) | (rightkey_swap[(right >> 28) & 0xf] << 4)); right &= 0x0fffffff; for (round = 0; round < 16; ++round) { left = ((left << encrypt_rotate_tab[round]) | (left >> (28 - encrypt_rotate_tab[round]))) & 0x0fffffff; right = ((right << encrypt_rotate_tab[round]) | (right >> (28 - encrypt_rotate_tab[round]))) & 0x0fffffff; *subkey++ = (((left << 4) & 0x24000000) | ((left << 28) & 0x10000000) | ((left << 14) & 0x08000000) | ((left << 18) & 0x02080000) | ((left << 6) & 0x01000000) | ((left << 9) & 0x00200000) | ((left >> 1) & 0x00100000) | ((left << 10) & 0x00040000) | ((left << 2) & 0x00020000) | ((left >> 10) & 0x00010000) | ((right >> 13) & 0x00002000) | ((right >> 4) & 0x00001000) | ((right << 6) & 0x00000800) | ((right >> 1) & 0x00000400) | ((right >> 14) & 0x00000200) | (right & 0x00000100) | ((right >> 5) & 0x00000020) | ((right >> 10) & 0x00000010) | ((right >> 3) & 0x00000008) | ((right >> 18) & 0x00000004) | ((right >> 26) & 0x00000002) | ((right >> 24) & 0x00000001)); *subkey++ = (((left << 15) & 0x20000000) | ((left << 17) & 0x10000000) | ((left << 10) & 0x08000000) | ((left << 22) & 0x04000000) | ((left >> 2) & 0x02000000) | ((left << 1) & 0x01000000) | ((left << 16) & 0x00200000) | ((left << 11) & 0x00100000) | ((left << 3) & 0x00080000) | ((left >> 6) & 0x00040000) | ((left << 15) & 0x00020000) | ((left >> 4) & 0x00010000) | ((right >> 2) & 0x00002000) | ((right << 8) & 0x00001000) | ((right >> 14) & 0x00000808) | ((right >> 9) & 0x00000400) | ((right) & 0x00000200) | ((right << 7) & 0x00000100) | ((right >> 7) & 0x00000020) | ((right >> 3) & 0x00000011) | ((right << 2) & 0x00000004) | ((right >> 21) & 0x00000002)); } } /* * Fill a DES context with subkeys calculated from a 64bit key. * Does not check parity bits, but simply ignore them. * Does not check for weak keys. */ static int des_setkey (struct _des_ctx *ctx, const byte * key) { static const char *selftest_failed; int i; if (!fips_mode () && !initialized) { initialized = 1; selftest_failed = selftest (); if (selftest_failed) log_error ("%s\n", selftest_failed); } if (selftest_failed) return GPG_ERR_SELFTEST_FAILED; des_key_schedule (key, ctx->encrypt_subkeys); _gcry_burn_stack (32); for(i=0; i<32; i+=2) { ctx->decrypt_subkeys[i] = ctx->encrypt_subkeys[30-i]; ctx->decrypt_subkeys[i+1] = ctx->encrypt_subkeys[31-i]; } return 0; } /* * Electronic Codebook Mode DES encryption/decryption of data according * to 'mode'. */ static int des_ecb_crypt (struct _des_ctx *ctx, const byte * from, byte * to, int mode) { u32 left, right, work; u32 *keys; keys = mode ? ctx->decrypt_subkeys : ctx->encrypt_subkeys; READ_64BIT_DATA (from, left, right) INITIAL_PERMUTATION (left, work, right) DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys) FINAL_PERMUTATION (right, work, left) WRITE_64BIT_DATA (to, right, left) return 0; } /* * Fill a Triple-DES context with subkeys calculated from two 64bit keys. * Does not check the parity bits of the keys, but simply ignore them. * Does not check for weak keys. */ /* * Fill a Triple-DES context with subkeys calculated from three 64bit keys. * Does not check the parity bits of the keys, but simply ignore them. * Does not check for weak keys. */ static int tripledes_set3keys (struct _tripledes_ctx *ctx, const byte * key1, const byte * key2, const byte * key3) { static const char *selftest_failed; int i; if (!fips_mode () && !initialized) { initialized = 1; selftest_failed = selftest (); if (selftest_failed) log_error ("%s\n", selftest_failed); } if (selftest_failed) return GPG_ERR_SELFTEST_FAILED; des_key_schedule (key1, ctx->encrypt_subkeys); des_key_schedule (key2, &(ctx->decrypt_subkeys[32])); des_key_schedule (key3, &(ctx->encrypt_subkeys[64])); _gcry_burn_stack (32); for(i=0; i<32; i+=2) { ctx->decrypt_subkeys[i] = ctx->encrypt_subkeys[94-i]; ctx->decrypt_subkeys[i+1] = ctx->encrypt_subkeys[95-i]; ctx->encrypt_subkeys[i+32] = ctx->decrypt_subkeys[62-i]; ctx->encrypt_subkeys[i+33] = ctx->decrypt_subkeys[63-i]; ctx->decrypt_subkeys[i+64] = ctx->encrypt_subkeys[30-i]; ctx->decrypt_subkeys[i+65] = ctx->encrypt_subkeys[31-i]; } return 0; } #ifdef USE_AMD64_ASM /* Assembly implementation of triple-DES. */ extern void _gcry_3des_amd64_crypt_block(const void *keys, byte *out, const byte *in); /* These assembly implementations process three blocks in parallel. */ extern void _gcry_3des_amd64_ctr_enc(const void *keys, byte *out, const byte *in, byte *ctr); extern void _gcry_3des_amd64_cbc_dec(const void *keys, byte *out, const byte *in, byte *iv); extern void _gcry_3des_amd64_cfb_dec(const void *keys, byte *out, const byte *in, byte *iv); #define TRIPLEDES_ECB_BURN_STACK (8 * sizeof(void *)) /* * Electronic Codebook Mode Triple-DES encryption/decryption of data * according to 'mode'. Sometimes this mode is named 'EDE' mode * (Encryption-Decryption-Encryption). */ static inline int tripledes_ecb_crypt (struct _tripledes_ctx *ctx, const byte * from, byte * to, int mode) { u32 *keys; keys = mode ? ctx->decrypt_subkeys : ctx->encrypt_subkeys; _gcry_3des_amd64_crypt_block(keys, to, from); return 0; } static inline void tripledes_amd64_ctr_enc(const void *keys, byte *out, const byte *in, byte *ctr) { _gcry_3des_amd64_ctr_enc(keys, out, in, ctr); } static inline void tripledes_amd64_cbc_dec(const void *keys, byte *out, const byte *in, byte *iv) { _gcry_3des_amd64_cbc_dec(keys, out, in, iv); } static inline void tripledes_amd64_cfb_dec(const void *keys, byte *out, const byte *in, byte *iv) { _gcry_3des_amd64_cfb_dec(keys, out, in, iv); } #else /*USE_AMD64_ASM*/ #define TRIPLEDES_ECB_BURN_STACK 32 /* * Electronic Codebook Mode Triple-DES encryption/decryption of data * according to 'mode'. Sometimes this mode is named 'EDE' mode * (Encryption-Decryption-Encryption). */ static int tripledes_ecb_crypt (struct _tripledes_ctx *ctx, const byte * from, byte * to, int mode) { u32 left, right, work; u32 *keys; keys = mode ? ctx->decrypt_subkeys : ctx->encrypt_subkeys; READ_64BIT_DATA (from, left, right) INITIAL_PERMUTATION (left, work, right) DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys) DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys) DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys) FINAL_PERMUTATION (right, work, left) WRITE_64BIT_DATA (to, right, left) return 0; } #endif /*!USE_AMD64_ASM*/ /* Bulk encryption of complete blocks in CTR mode. This function is only intended for the bulk encryption feature of cipher.c. CTR is expected to be of size DES_BLOCKSIZE. */ static void _gcry_3des_ctr_enc(void *context, unsigned char *ctr, void *outbuf_arg, const void *inbuf_arg, size_t nblocks) { struct _tripledes_ctx *ctx = context; unsigned char *outbuf = outbuf_arg; const unsigned char *inbuf = inbuf_arg; unsigned char tmpbuf[DES_BLOCKSIZE]; int burn_stack_depth = TRIPLEDES_ECB_BURN_STACK; #ifdef USE_AMD64_ASM { int asm_burn_depth = 9 * sizeof(void *); if (nblocks >= 3 && burn_stack_depth < asm_burn_depth) burn_stack_depth = asm_burn_depth; /* Process data in 3 block chunks. */ while (nblocks >= 3) { tripledes_amd64_ctr_enc(ctx->encrypt_subkeys, outbuf, inbuf, ctr); nblocks -= 3; outbuf += 3 * DES_BLOCKSIZE; inbuf += 3 * DES_BLOCKSIZE; } /* Use generic code to handle smaller chunks... */ } #endif for ( ;nblocks; nblocks-- ) { /* Encrypt the counter. */ tripledes_ecb_encrypt (ctx, ctr, tmpbuf); /* XOR the input with the encrypted counter and store in output. */ cipher_block_xor(outbuf, tmpbuf, inbuf, DES_BLOCKSIZE); outbuf += DES_BLOCKSIZE; inbuf += DES_BLOCKSIZE; /* Increment the counter. */ cipher_block_add(ctr, 1, DES_BLOCKSIZE); } wipememory(tmpbuf, sizeof(tmpbuf)); _gcry_burn_stack(burn_stack_depth); } /* Bulk decryption of complete blocks in CBC mode. This function is only intended for the bulk encryption feature of cipher.c. */ static void _gcry_3des_cbc_dec(void *context, unsigned char *iv, void *outbuf_arg, const void *inbuf_arg, size_t nblocks) { struct _tripledes_ctx *ctx = context; unsigned char *outbuf = outbuf_arg; const unsigned char *inbuf = inbuf_arg; unsigned char savebuf[DES_BLOCKSIZE]; int burn_stack_depth = TRIPLEDES_ECB_BURN_STACK; #ifdef USE_AMD64_ASM { int asm_burn_depth = 10 * sizeof(void *); if (nblocks >= 3 && burn_stack_depth < asm_burn_depth) burn_stack_depth = asm_burn_depth; /* Process data in 3 block chunks. */ while (nblocks >= 3) { tripledes_amd64_cbc_dec(ctx->decrypt_subkeys, outbuf, inbuf, iv); nblocks -= 3; outbuf += 3 * DES_BLOCKSIZE; inbuf += 3 * DES_BLOCKSIZE; } /* Use generic code to handle smaller chunks... */ } #endif for ( ;nblocks; nblocks-- ) { /* INBUF is needed later and it may be identical to OUTBUF, so store the intermediate result to SAVEBUF. */ tripledes_ecb_decrypt (ctx, inbuf, savebuf); cipher_block_xor_n_copy_2(outbuf, savebuf, iv, inbuf, DES_BLOCKSIZE); inbuf += DES_BLOCKSIZE; outbuf += DES_BLOCKSIZE; } wipememory(savebuf, sizeof(savebuf)); _gcry_burn_stack(burn_stack_depth); } /* Bulk decryption of complete blocks in CFB mode. This function is only intended for the bulk encryption feature of cipher.c. */ static void _gcry_3des_cfb_dec(void *context, unsigned char *iv, void *outbuf_arg, const void *inbuf_arg, size_t nblocks) { struct _tripledes_ctx *ctx = context; unsigned char *outbuf = outbuf_arg; const unsigned char *inbuf = inbuf_arg; int burn_stack_depth = TRIPLEDES_ECB_BURN_STACK; #ifdef USE_AMD64_ASM { int asm_burn_depth = 9 * sizeof(void *); if (nblocks >= 3 && burn_stack_depth < asm_burn_depth) burn_stack_depth = asm_burn_depth; /* Process data in 3 block chunks. */ while (nblocks >= 3) { tripledes_amd64_cfb_dec(ctx->encrypt_subkeys, outbuf, inbuf, iv); nblocks -= 3; outbuf += 3 * DES_BLOCKSIZE; inbuf += 3 * DES_BLOCKSIZE; } /* Use generic code to handle smaller chunks... */ } #endif for ( ;nblocks; nblocks-- ) { tripledes_ecb_encrypt (ctx, iv, iv); cipher_block_xor_n_copy(outbuf, iv, inbuf, DES_BLOCKSIZE); outbuf += DES_BLOCKSIZE; inbuf += DES_BLOCKSIZE; } _gcry_burn_stack(burn_stack_depth); } /* * Check whether the 8 byte key is weak. * Does not check the parity bits of the key but simple ignore them. */ static int is_weak_key ( const byte *key ) { byte work[8]; int i, left, right, middle, cmp_result; /* clear parity bits */ for(i=0; i<8; ++i) work[i] = key[i] & 0xfe; /* binary search in the weak key table */ left = 0; right = 63; while(left <= right) { middle = (left + right) / 2; if ( !(cmp_result=working_memcmp(work, weak_keys[middle], 8)) ) return -1; if ( cmp_result > 0 ) left = middle + 1; else right = middle - 1; } return 0; } /* * Performs a selftest of this DES/Triple-DES implementation. * Returns an string with the error text on failure. * Returns NULL if all is ok. */ static gcry_err_code_t do_tripledes_setkey ( void *context, const byte *key, unsigned keylen, cipher_bulk_ops_t *bulk_ops ) { struct _tripledes_ctx *ctx = (struct _tripledes_ctx *) context; if( keylen != 24 ) return GPG_ERR_INV_KEYLEN; /* Setup bulk encryption routines. */ memset (bulk_ops, 0, sizeof(*bulk_ops)); bulk_ops->cbc_dec = _gcry_3des_cbc_dec; bulk_ops->cfb_dec = _gcry_3des_cfb_dec; bulk_ops->ctr_enc = _gcry_3des_ctr_enc; tripledes_set3keys ( ctx, key, key+8, key+16); if (ctx->flags.no_weak_key) ; /* Detection has been disabled. */ else if (is_weak_key (key) || is_weak_key (key+8) || is_weak_key (key+16)) { _gcry_burn_stack (64); return GPG_ERR_WEAK_KEY; } _gcry_burn_stack (64); return GPG_ERR_NO_ERROR; } static unsigned int do_tripledes_encrypt( void *context, byte *outbuf, const byte *inbuf ) { struct _tripledes_ctx *ctx = (struct _tripledes_ctx *) context; tripledes_ecb_encrypt ( ctx, inbuf, outbuf ); return /*burn_stack*/ TRIPLEDES_ECB_BURN_STACK; } static unsigned int do_tripledes_decrypt( void *context, byte *outbuf, const byte *inbuf ) { struct _tripledes_ctx *ctx = (struct _tripledes_ctx *) context; tripledes_ecb_decrypt ( ctx, inbuf, outbuf ); return /*burn_stack*/ TRIPLEDES_ECB_BURN_STACK; } static gcry_err_code_t do_des_setkey (void *context, const byte *key, unsigned keylen, cipher_bulk_ops_t *bulk_ops) { struct _des_ctx *ctx = (struct _des_ctx *) context; (void)bulk_ops; if (keylen != 8) return GPG_ERR_INV_KEYLEN; des_setkey (ctx, key); if (is_weak_key (key)) { _gcry_burn_stack (64); return GPG_ERR_WEAK_KEY; } _gcry_burn_stack (64); return GPG_ERR_NO_ERROR; } static unsigned int do_des_encrypt( void *context, byte *outbuf, const byte *inbuf ) { struct _des_ctx *ctx = (struct _des_ctx *) context; des_ecb_encrypt ( ctx, inbuf, outbuf ); return /*burn_stack*/ (32); } static unsigned int do_des_decrypt( void *context, byte *outbuf, const byte *inbuf ) { struct _des_ctx *ctx = (struct _des_ctx *) context; des_ecb_decrypt ( ctx, inbuf, outbuf ); return /*burn_stack*/ (32); } /* Self-test section. */ /* Selftest for TripleDES. */ /* Run a full self-test for ALGO and return 0 on success. */ gcry_cipher_spec_t _gcry_cipher_spec_des = { GCRY_CIPHER_DES, {0, 0}, "DES", NULL, NULL, 8, 64, sizeof (struct _des_ctx), do_des_setkey, do_des_encrypt, do_des_decrypt , GRUB_UTIL_MODNAME("gcry_des") }; static const gcry_cipher_oid_spec_t oids_tripledes[] = { { "1.2.840.113549.3.7", GCRY_CIPHER_MODE_CBC }, /* Teletrust specific OID for 3DES. */ { "1.3.36.3.1.3.2.1", GCRY_CIPHER_MODE_CBC }, /* pbeWithSHAAnd3_KeyTripleDES_CBC */ { "1.2.840.113549.1.12.1.3", GCRY_CIPHER_MODE_CBC }, { NULL } }; gcry_cipher_spec_t _gcry_cipher_spec_tripledes = { GCRY_CIPHER_3DES, {0, 0}, "3DES", NULL, oids_tripledes, 8, 192, sizeof (struct _tripledes_ctx), do_tripledes_setkey, do_tripledes_encrypt, do_tripledes_decrypt, NULL, NULL, GRUB_UTIL_MODNAME("gcry_des") }; GRUB_MOD_INIT(gcry_des) { grub_cipher_register (&_gcry_cipher_spec_des); grub_cipher_register (&_gcry_cipher_spec_tripledes); } GRUB_MOD_FINI(gcry_des) { grub_cipher_unregister (&_gcry_cipher_spec_des); grub_cipher_unregister (&_gcry_cipher_spec_tripledes); } grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/cipher/poly1305-internal.h0000644000175000017500000000510615036452441024124 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ /* poly1305-internal.h - Poly1305 internals * Copyright (C) 2014 Jussi Kivilinna * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . */ #ifndef G10_POLY1305_INTERNAL_H #define G10_POLY1305_INTERNAL_H #include "types.h" #include "g10lib.h" #include "cipher.h" #include "bufhelp.h" #define POLY1305_TAGLEN 16 #define POLY1305_KEYLEN 32 #define POLY1305_BLOCKSIZE 16 /* POLY1305_USE_AVX512 indicates whether to compile with Intel AVX512 code. */ #undef POLY1305_USE_AVX512 #if defined(__x86_64__) && defined(HAVE_GCC_INLINE_ASM_AVX512) && \ defined(HAVE_INTEL_SYNTAX_PLATFORM_AS) && \ (defined(HAVE_COMPATIBLE_GCC_AMD64_PLATFORM_AS) || \ defined(HAVE_COMPATIBLE_GCC_WIN64_PLATFORM_AS)) # define POLY1305_USE_AVX512 1 #endif /* POLY1305_USE_PPC_VEC indicates whether to enable PowerPC vector code. */ #undef POLY1305_USE_PPC_VEC #ifdef ENABLE_PPC_CRYPTO_SUPPORT # if defined(HAVE_COMPATIBLE_CC_PPC_ALTIVEC) && \ defined(HAVE_GCC_INLINE_ASM_PPC_ALTIVEC) && \ !defined(WORDS_BIGENDIAN) # if __GNUC__ >= 4 # define POLY1305_USE_PPC_VEC 1 # endif # endif #endif typedef struct { u32 k[4]; u32 r[4]; u32 h[5]; } POLY1305_STATE; typedef struct poly1305_context_s { POLY1305_STATE state; byte buffer[POLY1305_BLOCKSIZE]; unsigned int leftover; #ifdef POLY1305_USE_AVX512 unsigned int use_avx512:1; #endif #ifdef POLY1305_USE_PPC_VEC unsigned int use_p10:1; #endif } poly1305_context_t; gcry_err_code_t _gcry_poly1305_init (poly1305_context_t *ctx, const byte *key, size_t keylen); void _gcry_poly1305_finish (poly1305_context_t *ctx, byte mac[POLY1305_TAGLEN]); void _gcry_poly1305_update (poly1305_context_t *ctx, const byte *buf, size_t buflen); unsigned int _gcry_poly1305_update_burn (poly1305_context_t *ctx, const byte *m, size_t bytes); #endif /* G10_POLY1305_INTERNAL_H */ grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/cipher/pubkey-internal.h0000644000175000017500000001224415036452441024130 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ /* pubkey-internal.h - Internal defs for pubkey.c * Copyright (C) 2013 g10 code GmbH * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . */ #ifndef GCRY_PUBKEY_INTERNAL_H #define GCRY_PUBKEY_INTERNAL_H /*-- pubkey-util.c --*/ gpg_err_code_t _gcry_pk_util_parse_flaglist (gcry_sexp_t list, int *r_flags, enum pk_encoding *r_encoding); gpg_err_code_t _gcry_pk_util_get_nbits (gcry_sexp_t list, unsigned int *r_nbits); gpg_err_code_t _gcry_pk_util_get_rsa_use_e (gcry_sexp_t list, unsigned long *r_e); gpg_err_code_t _gcry_pk_util_preparse_sigval (gcry_sexp_t s_sig, const char **algo_names, gcry_sexp_t *r_parms, int *r_eccflags); gpg_err_code_t _gcry_pk_util_preparse_encval (gcry_sexp_t sexp, const char **algo_names, gcry_sexp_t *r_parms, struct pk_encoding_ctx *ctx); void _gcry_pk_util_init_encoding_ctx (struct pk_encoding_ctx *ctx, enum pk_operation op, unsigned int nbits); void _gcry_pk_util_free_encoding_ctx (struct pk_encoding_ctx *ctx); gcry_err_code_t _gcry_pk_util_data_to_mpi (gcry_sexp_t input, gcry_mpi_t *ret_mpi, struct pk_encoding_ctx *ctx); /*-- rsa-common.c --*/ gpg_err_code_t _gcry_rsa_pkcs1_encode_for_enc (gcry_mpi_t *r_result, unsigned int nbits, const unsigned char *value, size_t valuelen, const unsigned char *random_override, size_t random_override_len); gpg_err_code_t _gcry_rsa_pkcs1_decode_for_enc (unsigned char **r_result, size_t *r_resultlen, unsigned int nbits, gcry_mpi_t value); gpg_err_code_t _gcry_rsa_pkcs1_encode_raw_for_sig (gcry_mpi_t *r_result, unsigned int nbits, const unsigned char *value, size_t valuelen); gpg_err_code_t _gcry_rsa_pkcs1_encode_for_sig (gcry_mpi_t *r_result, unsigned int nbits, const unsigned char *value, size_t valuelen, int algo); gpg_err_code_t _gcry_rsa_oaep_encode (gcry_mpi_t *r_result, unsigned int nbits, int algo, const unsigned char *value, size_t valuelen, const unsigned char *label, size_t labellen, const void *random_override, size_t random_override_len); gpg_err_code_t _gcry_rsa_oaep_decode (unsigned char **r_result, size_t *r_resultlen, unsigned int nbits, int algo, gcry_mpi_t value, const unsigned char *label, size_t labellen); gpg_err_code_t _gcry_rsa_pss_encode (gcry_mpi_t *r_result, unsigned int nbits, int algo, int hashed_already, int saltlen, const unsigned char *value, size_t valuelen, const void *random_override); gpg_err_code_t _gcry_rsa_pss_verify (gcry_mpi_t value, int hashed_already, gcry_mpi_t encoded, unsigned int nbits, int algo, size_t saltlen); /*-- dsa-common.c --*/ void _gcry_dsa_modify_k (gcry_mpi_t k, gcry_mpi_t q, int qbits); gcry_mpi_t _gcry_dsa_gen_k (gcry_mpi_t q, int security_level); gpg_err_code_t _gcry_dsa_gen_rfc6979_k (gcry_mpi_t *r_k, gcry_mpi_t dsa_q, gcry_mpi_t dsa_x, const unsigned char *h1, unsigned int h1len, int halgo, unsigned int extraloops); gpg_err_code_t _gcry_dsa_compute_hash (gcry_mpi_t *r_hash, gcry_mpi_t input, int hashalgo); gpg_err_code_t _gcry_dsa_normalize_hash (gcry_mpi_t input, gcry_mpi_t *out, unsigned int qbits); /*-- ecc.c --*/ gpg_err_code_t _gcry_pk_ecc_get_sexp (gcry_sexp_t *r_sexp, int mode, mpi_ec_t ec); #endif /*GCRY_PUBKEY_INTERNAL_H*/ grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/cipher/rijndael-tables.h0000644000175000017500000002342115036452441024056 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ /* rijndael-tables.h - Rijndael (AES) for GnuPG, * Copyright (C) 2000, 2001, 2002, 2003, 2007, * 2008 Free Software Foundation, Inc. * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . */ /* To keep the actual implementation at a readable size we use this include file to define the tables. */ static struct { volatile u32 counter_head; u32 cacheline_align[64 / 4 - 1]; u32 T[256]; volatile u32 counter_tail; } enc_tables ATTR_ALIGNED_64 = { 0, { 0, }, { 0xa56363c6, 0x847c7cf8, 0x997777ee, 0x8d7b7bf6, 0x0df2f2ff, 0xbd6b6bd6, 0xb16f6fde, 0x54c5c591, 0x50303060, 0x03010102, 0xa96767ce, 0x7d2b2b56, 0x19fefee7, 0x62d7d7b5, 0xe6abab4d, 0x9a7676ec, 0x45caca8f, 0x9d82821f, 0x40c9c989, 0x877d7dfa, 0x15fafaef, 0xeb5959b2, 0xc947478e, 0x0bf0f0fb, 0xecadad41, 0x67d4d4b3, 0xfda2a25f, 0xeaafaf45, 0xbf9c9c23, 0xf7a4a453, 0x967272e4, 0x5bc0c09b, 0xc2b7b775, 0x1cfdfde1, 0xae93933d, 0x6a26264c, 0x5a36366c, 0x413f3f7e, 0x02f7f7f5, 0x4fcccc83, 0x5c343468, 0xf4a5a551, 0x34e5e5d1, 0x08f1f1f9, 0x937171e2, 0x73d8d8ab, 0x53313162, 0x3f15152a, 0x0c040408, 0x52c7c795, 0x65232346, 0x5ec3c39d, 0x28181830, 0xa1969637, 0x0f05050a, 0xb59a9a2f, 0x0907070e, 0x36121224, 0x9b80801b, 0x3de2e2df, 0x26ebebcd, 0x6927274e, 0xcdb2b27f, 0x9f7575ea, 0x1b090912, 0x9e83831d, 0x742c2c58, 0x2e1a1a34, 0x2d1b1b36, 0xb26e6edc, 0xee5a5ab4, 0xfba0a05b, 0xf65252a4, 0x4d3b3b76, 0x61d6d6b7, 0xceb3b37d, 0x7b292952, 0x3ee3e3dd, 0x712f2f5e, 0x97848413, 0xf55353a6, 0x68d1d1b9, 0x00000000, 0x2cededc1, 0x60202040, 0x1ffcfce3, 0xc8b1b179, 0xed5b5bb6, 0xbe6a6ad4, 0x46cbcb8d, 0xd9bebe67, 0x4b393972, 0xde4a4a94, 0xd44c4c98, 0xe85858b0, 0x4acfcf85, 0x6bd0d0bb, 0x2aefefc5, 0xe5aaaa4f, 0x16fbfbed, 0xc5434386, 0xd74d4d9a, 0x55333366, 0x94858511, 0xcf45458a, 0x10f9f9e9, 0x06020204, 0x817f7ffe, 0xf05050a0, 0x443c3c78, 0xba9f9f25, 0xe3a8a84b, 0xf35151a2, 0xfea3a35d, 0xc0404080, 0x8a8f8f05, 0xad92923f, 0xbc9d9d21, 0x48383870, 0x04f5f5f1, 0xdfbcbc63, 0xc1b6b677, 0x75dadaaf, 0x63212142, 0x30101020, 0x1affffe5, 0x0ef3f3fd, 0x6dd2d2bf, 0x4ccdcd81, 0x140c0c18, 0x35131326, 0x2fececc3, 0xe15f5fbe, 0xa2979735, 0xcc444488, 0x3917172e, 0x57c4c493, 0xf2a7a755, 0x827e7efc, 0x473d3d7a, 0xac6464c8, 0xe75d5dba, 0x2b191932, 0x957373e6, 0xa06060c0, 0x98818119, 0xd14f4f9e, 0x7fdcdca3, 0x66222244, 0x7e2a2a54, 0xab90903b, 0x8388880b, 0xca46468c, 0x29eeeec7, 0xd3b8b86b, 0x3c141428, 0x79dedea7, 0xe25e5ebc, 0x1d0b0b16, 0x76dbdbad, 0x3be0e0db, 0x56323264, 0x4e3a3a74, 0x1e0a0a14, 0xdb494992, 0x0a06060c, 0x6c242448, 0xe45c5cb8, 0x5dc2c29f, 0x6ed3d3bd, 0xefacac43, 0xa66262c4, 0xa8919139, 0xa4959531, 0x37e4e4d3, 0x8b7979f2, 0x32e7e7d5, 0x43c8c88b, 0x5937376e, 0xb76d6dda, 0x8c8d8d01, 0x64d5d5b1, 0xd24e4e9c, 0xe0a9a949, 0xb46c6cd8, 0xfa5656ac, 0x07f4f4f3, 0x25eaeacf, 0xaf6565ca, 0x8e7a7af4, 0xe9aeae47, 0x18080810, 0xd5baba6f, 0x887878f0, 0x6f25254a, 0x722e2e5c, 0x241c1c38, 0xf1a6a657, 0xc7b4b473, 0x51c6c697, 0x23e8e8cb, 0x7cdddda1, 0x9c7474e8, 0x211f1f3e, 0xdd4b4b96, 0xdcbdbd61, 0x868b8b0d, 0x858a8a0f, 0x907070e0, 0x423e3e7c, 0xc4b5b571, 0xaa6666cc, 0xd8484890, 0x05030306, 0x01f6f6f7, 0x120e0e1c, 0xa36161c2, 0x5f35356a, 0xf95757ae, 0xd0b9b969, 0x91868617, 0x58c1c199, 0x271d1d3a, 0xb99e9e27, 0x38e1e1d9, 0x13f8f8eb, 0xb398982b, 0x33111122, 0xbb6969d2, 0x70d9d9a9, 0x898e8e07, 0xa7949433, 0xb69b9b2d, 0x221e1e3c, 0x92878715, 0x20e9e9c9, 0x49cece87, 0xff5555aa, 0x78282850, 0x7adfdfa5, 0x8f8c8c03, 0xf8a1a159, 0x80898909, 0x170d0d1a, 0xdabfbf65, 0x31e6e6d7, 0xc6424284, 0xb86868d0, 0xc3414182, 0xb0999929, 0x772d2d5a, 0x110f0f1e, 0xcbb0b07b, 0xfc5454a8, 0xd6bbbb6d, 0x3a16162c }, 0 }; #define encT enc_tables.T static struct { volatile u32 counter_head; u32 cacheline_align[64 / 4 - 1]; u32 T[256]; byte inv_sbox[256]; volatile u32 counter_tail; } dec_tables ATTR_ALIGNED_64 = { 0, { 0, }, { 0x50a7f451, 0x5365417e, 0xc3a4171a, 0x965e273a, 0xcb6bab3b, 0xf1459d1f, 0xab58faac, 0x9303e34b, 0x55fa3020, 0xf66d76ad, 0x9176cc88, 0x254c02f5, 0xfcd7e54f, 0xd7cb2ac5, 0x80443526, 0x8fa362b5, 0x495ab1de, 0x671bba25, 0x980eea45, 0xe1c0fe5d, 0x02752fc3, 0x12f04c81, 0xa397468d, 0xc6f9d36b, 0xe75f8f03, 0x959c9215, 0xeb7a6dbf, 0xda595295, 0x2d83bed4, 0xd3217458, 0x2969e049, 0x44c8c98e, 0x6a89c275, 0x78798ef4, 0x6b3e5899, 0xdd71b927, 0xb64fe1be, 0x17ad88f0, 0x66ac20c9, 0xb43ace7d, 0x184adf63, 0x82311ae5, 0x60335197, 0x457f5362, 0xe07764b1, 0x84ae6bbb, 0x1ca081fe, 0x942b08f9, 0x58684870, 0x19fd458f, 0x876cde94, 0xb7f87b52, 0x23d373ab, 0xe2024b72, 0x578f1fe3, 0x2aab5566, 0x0728ebb2, 0x03c2b52f, 0x9a7bc586, 0xa50837d3, 0xf2872830, 0xb2a5bf23, 0xba6a0302, 0x5c8216ed, 0x2b1ccf8a, 0x92b479a7, 0xf0f207f3, 0xa1e2694e, 0xcdf4da65, 0xd5be0506, 0x1f6234d1, 0x8afea6c4, 0x9d532e34, 0xa055f3a2, 0x32e18a05, 0x75ebf6a4, 0x39ec830b, 0xaaef6040, 0x069f715e, 0x51106ebd, 0xf98a213e, 0x3d06dd96, 0xae053edd, 0x46bde64d, 0xb58d5491, 0x055dc471, 0x6fd40604, 0xff155060, 0x24fb9819, 0x97e9bdd6, 0xcc434089, 0x779ed967, 0xbd42e8b0, 0x888b8907, 0x385b19e7, 0xdbeec879, 0x470a7ca1, 0xe90f427c, 0xc91e84f8, 0x00000000, 0x83868009, 0x48ed2b32, 0xac70111e, 0x4e725a6c, 0xfbff0efd, 0x5638850f, 0x1ed5ae3d, 0x27392d36, 0x64d90f0a, 0x21a65c68, 0xd1545b9b, 0x3a2e3624, 0xb1670a0c, 0x0fe75793, 0xd296eeb4, 0x9e919b1b, 0x4fc5c080, 0xa220dc61, 0x694b775a, 0x161a121c, 0x0aba93e2, 0xe52aa0c0, 0x43e0223c, 0x1d171b12, 0x0b0d090e, 0xadc78bf2, 0xb9a8b62d, 0xc8a91e14, 0x8519f157, 0x4c0775af, 0xbbdd99ee, 0xfd607fa3, 0x9f2601f7, 0xbcf5725c, 0xc53b6644, 0x347efb5b, 0x7629438b, 0xdcc623cb, 0x68fcedb6, 0x63f1e4b8, 0xcadc31d7, 0x10856342, 0x40229713, 0x2011c684, 0x7d244a85, 0xf83dbbd2, 0x1132f9ae, 0x6da129c7, 0x4b2f9e1d, 0xf330b2dc, 0xec52860d, 0xd0e3c177, 0x6c16b32b, 0x99b970a9, 0xfa489411, 0x2264e947, 0xc48cfca8, 0x1a3ff0a0, 0xd82c7d56, 0xef903322, 0xc74e4987, 0xc1d138d9, 0xfea2ca8c, 0x360bd498, 0xcf81f5a6, 0x28de7aa5, 0x268eb7da, 0xa4bfad3f, 0xe49d3a2c, 0x0d927850, 0x9bcc5f6a, 0x62467e54, 0xc2138df6, 0xe8b8d890, 0x5ef7392e, 0xf5afc382, 0xbe805d9f, 0x7c93d069, 0xa92dd56f, 0xb31225cf, 0x3b99acc8, 0xa77d1810, 0x6e639ce8, 0x7bbb3bdb, 0x097826cd, 0xf418596e, 0x01b79aec, 0xa89a4f83, 0x656e95e6, 0x7ee6ffaa, 0x08cfbc21, 0xe6e815ef, 0xd99be7ba, 0xce366f4a, 0xd4099fea, 0xd67cb029, 0xafb2a431, 0x31233f2a, 0x3094a5c6, 0xc066a235, 0x37bc4e74, 0xa6ca82fc, 0xb0d090e0, 0x15d8a733, 0x4a9804f1, 0xf7daec41, 0x0e50cd7f, 0x2ff69117, 0x8dd64d76, 0x4db0ef43, 0x544daacc, 0xdf0496e4, 0xe3b5d19e, 0x1b886a4c, 0xb81f2cc1, 0x7f516546, 0x04ea5e9d, 0x5d358c01, 0x737487fa, 0x2e410bfb, 0x5a1d67b3, 0x52d2db92, 0x335610e9, 0x1347d66d, 0x8c61d79a, 0x7a0ca137, 0x8e14f859, 0x893c13eb, 0xee27a9ce, 0x35c961b7, 0xede51ce1, 0x3cb1477a, 0x59dfd29c, 0x3f73f255, 0x79ce1418, 0xbf37c773, 0xeacdf753, 0x5baafd5f, 0x146f3ddf, 0x86db4478, 0x81f3afca, 0x3ec468b9, 0x2c342438, 0x5f40a3c2, 0x72c31d16, 0x0c25e2bc, 0x8b493c28, 0x41950dff, 0x7101a839, 0xdeb30c08, 0x9ce4b4d8, 0x90c15664, 0x6184cb7b, 0x70b632d5, 0x745c6c48, 0x4257b8d0 }, { 0x52,0x09,0x6a,0xd5,0x30,0x36,0xa5,0x38, 0xbf,0x40,0xa3,0x9e,0x81,0xf3,0xd7,0xfb, 0x7c,0xe3,0x39,0x82,0x9b,0x2f,0xff,0x87, 0x34,0x8e,0x43,0x44,0xc4,0xde,0xe9,0xcb, 0x54,0x7b,0x94,0x32,0xa6,0xc2,0x23,0x3d, 0xee,0x4c,0x95,0x0b,0x42,0xfa,0xc3,0x4e, 0x08,0x2e,0xa1,0x66,0x28,0xd9,0x24,0xb2, 0x76,0x5b,0xa2,0x49,0x6d,0x8b,0xd1,0x25, 0x72,0xf8,0xf6,0x64,0x86,0x68,0x98,0x16, 0xd4,0xa4,0x5c,0xcc,0x5d,0x65,0xb6,0x92, 0x6c,0x70,0x48,0x50,0xfd,0xed,0xb9,0xda, 0x5e,0x15,0x46,0x57,0xa7,0x8d,0x9d,0x84, 0x90,0xd8,0xab,0x00,0x8c,0xbc,0xd3,0x0a, 0xf7,0xe4,0x58,0x05,0xb8,0xb3,0x45,0x06, 0xd0,0x2c,0x1e,0x8f,0xca,0x3f,0x0f,0x02, 0xc1,0xaf,0xbd,0x03,0x01,0x13,0x8a,0x6b, 0x3a,0x91,0x11,0x41,0x4f,0x67,0xdc,0xea, 0x97,0xf2,0xcf,0xce,0xf0,0xb4,0xe6,0x73, 0x96,0xac,0x74,0x22,0xe7,0xad,0x35,0x85, 0xe2,0xf9,0x37,0xe8,0x1c,0x75,0xdf,0x6e, 0x47,0xf1,0x1a,0x71,0x1d,0x29,0xc5,0x89, 0x6f,0xb7,0x62,0x0e,0xaa,0x18,0xbe,0x1b, 0xfc,0x56,0x3e,0x4b,0xc6,0xd2,0x79,0x20, 0x9a,0xdb,0xc0,0xfe,0x78,0xcd,0x5a,0xf4, 0x1f,0xdd,0xa8,0x33,0x88,0x07,0xc7,0x31, 0xb1,0x12,0x10,0x59,0x27,0x80,0xec,0x5f, 0x60,0x51,0x7f,0xa9,0x19,0xb5,0x4a,0x0d, 0x2d,0xe5,0x7a,0x9f,0x93,0xc9,0x9c,0xef, 0xa0,0xe0,0x3b,0x4d,0xae,0x2a,0xf5,0xb0, 0xc8,0xeb,0xbb,0x3c,0x83,0x53,0x99,0x61, 0x17,0x2b,0x04,0x7e,0xba,0x77,0xd6,0x26, 0xe1,0x69,0x14,0x63,0x55,0x21,0x0c,0x7d }, 0 }; #define decT dec_tables.T #define inv_sbox dec_tables.inv_sbox grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/cipher/whirlpool.c0000644000175000017500000022563715036452441023045 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ #include GRUB_MOD_LICENSE ("GPLv3+"); /* whirlpool.c - Whirlpool hashing algorithm * Copyright (C) 2005 Free Software Foundation, Inc. * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . */ /* This is an implementation of the Whirlpool hashing algorithm, which has been developed by Vincent Rijmen and Paulo S. L. M. Barreto; it's homepage is located at: http://www.larc.usp.br/~pbarreto/WhirlpoolPage.html The S-Boxes and the structure of the main transformation function, which implements an optimized version of the algorithm, is taken from the reference implementation available from http://www.larc.usp.br/~pbarreto/whirlpool.zip */ #include "types.h" #include "g10lib.h" #include "cipher.h" #include "bufhelp.h" #include "hash-common.h" /* USE_AMD64_ASM indicates whether to use AMD64 assembly code. */ #undef USE_AMD64_ASM #if defined(__x86_64__) && (defined(HAVE_COMPATIBLE_GCC_AMD64_PLATFORM_AS) || \ defined(HAVE_COMPATIBLE_GCC_WIN64_PLATFORM_AS)) # define USE_AMD64_ASM 1 #endif /* Size of a whirlpool block (in bytes). */ #define BLOCK_SIZE 64 /* Number of rounds. */ #define R 10 /* Types. */ typedef u64 whirlpool_block_t[BLOCK_SIZE / 8]; typedef struct { gcry_md_block_ctx_t bctx; whirlpool_block_t hash_state; int use_bugemu; struct { size_t count; unsigned char length[32]; } bugemu; } whirlpool_context_t; /* Macros. */ /* Convert the the buffer BUFFER into a block BLOCK, using I as counter. */ #define buffer_to_block(buffer, block, i) \ for (i = 0; i < 8; i++) \ (block)[i] = buf_get_be64((buffer) + i * 8); /* Convert the block BLOCK into a buffer BUFFER, using I as counter. */ #define block_to_buffer(buffer, block, i) \ for (i = 0; i < 8; i++) \ buf_put_be64((buffer) + i * 8, (block)[i]); /* Copy the block BLOCK_SRC to BLOCK_DST, using I as counter. */ #define block_copy(block_dst, block_src, i) \ for (i = 0; i < 8; i++) \ block_dst[i] = block_src[i]; /* XOR the block BLOCK_SRC into BLOCK_DST, using I as counter. */ #define block_xor(block_dst, block_src, i) \ for (i = 0; i < 8; i++) \ block_dst[i] ^= block_src[i]; struct whirlpool_tables_s { u64 RC[R]; u64 C[8][256]; }; static const struct whirlpool_tables_s tab = { /* Round constants. */ { U64_C (0x1823c6e887b8014f), U64_C (0x36a6d2f5796f9152), U64_C (0x60bc9b8ea30c7b35), U64_C (0x1de0d7c22e4bfe57), U64_C (0x157737e59ff04ada), U64_C (0x58c9290ab1a06b85), U64_C (0xbd5d10f4cb3e0567), U64_C (0xe427418ba77d95d8), U64_C (0xfbee7c66dd17479e), U64_C (0xca2dbf07ad5a8333), }, /* Main lookup boxes. */ { { U64_C (0x18186018c07830d8), U64_C (0x23238c2305af4626), U64_C (0xc6c63fc67ef991b8), U64_C (0xe8e887e8136fcdfb), U64_C (0x878726874ca113cb), U64_C (0xb8b8dab8a9626d11), U64_C (0x0101040108050209), U64_C (0x4f4f214f426e9e0d), U64_C (0x3636d836adee6c9b), U64_C (0xa6a6a2a6590451ff), U64_C (0xd2d26fd2debdb90c), U64_C (0xf5f5f3f5fb06f70e), U64_C (0x7979f979ef80f296), U64_C (0x6f6fa16f5fcede30), U64_C (0x91917e91fcef3f6d), U64_C (0x52525552aa07a4f8), U64_C (0x60609d6027fdc047), U64_C (0xbcbccabc89766535), U64_C (0x9b9b569baccd2b37), U64_C (0x8e8e028e048c018a), U64_C (0xa3a3b6a371155bd2), U64_C (0x0c0c300c603c186c), U64_C (0x7b7bf17bff8af684), U64_C (0x3535d435b5e16a80), U64_C (0x1d1d741de8693af5), U64_C (0xe0e0a7e05347ddb3), U64_C (0xd7d77bd7f6acb321), U64_C (0xc2c22fc25eed999c), U64_C (0x2e2eb82e6d965c43), U64_C (0x4b4b314b627a9629), U64_C (0xfefedffea321e15d), U64_C (0x575741578216aed5), U64_C (0x15155415a8412abd), U64_C (0x7777c1779fb6eee8), U64_C (0x3737dc37a5eb6e92), U64_C (0xe5e5b3e57b56d79e), U64_C (0x9f9f469f8cd92313), U64_C (0xf0f0e7f0d317fd23), U64_C (0x4a4a354a6a7f9420), U64_C (0xdada4fda9e95a944), U64_C (0x58587d58fa25b0a2), U64_C (0xc9c903c906ca8fcf), U64_C (0x2929a429558d527c), U64_C (0x0a0a280a5022145a), U64_C (0xb1b1feb1e14f7f50), U64_C (0xa0a0baa0691a5dc9), U64_C (0x6b6bb16b7fdad614), U64_C (0x85852e855cab17d9), U64_C (0xbdbdcebd8173673c), U64_C (0x5d5d695dd234ba8f), U64_C (0x1010401080502090), U64_C (0xf4f4f7f4f303f507), U64_C (0xcbcb0bcb16c08bdd), U64_C (0x3e3ef83eedc67cd3), U64_C (0x0505140528110a2d), U64_C (0x676781671fe6ce78), U64_C (0xe4e4b7e47353d597), U64_C (0x27279c2725bb4e02), U64_C (0x4141194132588273), U64_C (0x8b8b168b2c9d0ba7), U64_C (0xa7a7a6a7510153f6), U64_C (0x7d7de97dcf94fab2), U64_C (0x95956e95dcfb3749), U64_C (0xd8d847d88e9fad56), U64_C (0xfbfbcbfb8b30eb70), U64_C (0xeeee9fee2371c1cd), U64_C (0x7c7ced7cc791f8bb), U64_C (0x6666856617e3cc71), U64_C (0xdddd53dda68ea77b), U64_C (0x17175c17b84b2eaf), U64_C (0x4747014702468e45), U64_C (0x9e9e429e84dc211a), U64_C (0xcaca0fca1ec589d4), U64_C (0x2d2db42d75995a58), U64_C (0xbfbfc6bf9179632e), U64_C (0x07071c07381b0e3f), U64_C (0xadad8ead012347ac), U64_C (0x5a5a755aea2fb4b0), U64_C (0x838336836cb51bef), U64_C (0x3333cc3385ff66b6), U64_C (0x636391633ff2c65c), U64_C (0x02020802100a0412), U64_C (0xaaaa92aa39384993), U64_C (0x7171d971afa8e2de), U64_C (0xc8c807c80ecf8dc6), U64_C (0x19196419c87d32d1), U64_C (0x494939497270923b), U64_C (0xd9d943d9869aaf5f), U64_C (0xf2f2eff2c31df931), U64_C (0xe3e3abe34b48dba8), U64_C (0x5b5b715be22ab6b9), U64_C (0x88881a8834920dbc), U64_C (0x9a9a529aa4c8293e), U64_C (0x262698262dbe4c0b), U64_C (0x3232c8328dfa64bf), U64_C (0xb0b0fab0e94a7d59), U64_C (0xe9e983e91b6acff2), U64_C (0x0f0f3c0f78331e77), U64_C (0xd5d573d5e6a6b733), U64_C (0x80803a8074ba1df4), U64_C (0xbebec2be997c6127), U64_C (0xcdcd13cd26de87eb), U64_C (0x3434d034bde46889), U64_C (0x48483d487a759032), U64_C (0xffffdbffab24e354), U64_C (0x7a7af57af78ff48d), U64_C (0x90907a90f4ea3d64), U64_C (0x5f5f615fc23ebe9d), U64_C (0x202080201da0403d), U64_C (0x6868bd6867d5d00f), U64_C (0x1a1a681ad07234ca), U64_C (0xaeae82ae192c41b7), U64_C (0xb4b4eab4c95e757d), U64_C (0x54544d549a19a8ce), U64_C (0x93937693ece53b7f), U64_C (0x222288220daa442f), U64_C (0x64648d6407e9c863), U64_C (0xf1f1e3f1db12ff2a), U64_C (0x7373d173bfa2e6cc), U64_C (0x12124812905a2482), U64_C (0x40401d403a5d807a), U64_C (0x0808200840281048), U64_C (0xc3c32bc356e89b95), U64_C (0xecec97ec337bc5df), U64_C (0xdbdb4bdb9690ab4d), U64_C (0xa1a1bea1611f5fc0), U64_C (0x8d8d0e8d1c830791), U64_C (0x3d3df43df5c97ac8), U64_C (0x97976697ccf1335b), U64_C (0x0000000000000000), U64_C (0xcfcf1bcf36d483f9), U64_C (0x2b2bac2b4587566e), U64_C (0x7676c57697b3ece1), U64_C (0x8282328264b019e6), U64_C (0xd6d67fd6fea9b128), U64_C (0x1b1b6c1bd87736c3), U64_C (0xb5b5eeb5c15b7774), U64_C (0xafaf86af112943be), U64_C (0x6a6ab56a77dfd41d), U64_C (0x50505d50ba0da0ea), U64_C (0x45450945124c8a57), U64_C (0xf3f3ebf3cb18fb38), U64_C (0x3030c0309df060ad), U64_C (0xefef9bef2b74c3c4), U64_C (0x3f3ffc3fe5c37eda), U64_C (0x55554955921caac7), U64_C (0xa2a2b2a2791059db), U64_C (0xeaea8fea0365c9e9), U64_C (0x656589650fecca6a), U64_C (0xbabad2bab9686903), U64_C (0x2f2fbc2f65935e4a), U64_C (0xc0c027c04ee79d8e), U64_C (0xdede5fdebe81a160), U64_C (0x1c1c701ce06c38fc), U64_C (0xfdfdd3fdbb2ee746), U64_C (0x4d4d294d52649a1f), U64_C (0x92927292e4e03976), U64_C (0x7575c9758fbceafa), U64_C (0x06061806301e0c36), U64_C (0x8a8a128a249809ae), U64_C (0xb2b2f2b2f940794b), U64_C (0xe6e6bfe66359d185), U64_C (0x0e0e380e70361c7e), U64_C (0x1f1f7c1ff8633ee7), U64_C (0x6262956237f7c455), U64_C (0xd4d477d4eea3b53a), U64_C (0xa8a89aa829324d81), U64_C (0x96966296c4f43152), U64_C (0xf9f9c3f99b3aef62), U64_C (0xc5c533c566f697a3), U64_C (0x2525942535b14a10), U64_C (0x59597959f220b2ab), U64_C (0x84842a8454ae15d0), U64_C (0x7272d572b7a7e4c5), U64_C (0x3939e439d5dd72ec), U64_C (0x4c4c2d4c5a619816), U64_C (0x5e5e655eca3bbc94), U64_C (0x7878fd78e785f09f), U64_C (0x3838e038ddd870e5), U64_C (0x8c8c0a8c14860598), U64_C (0xd1d163d1c6b2bf17), U64_C (0xa5a5aea5410b57e4), U64_C (0xe2e2afe2434dd9a1), U64_C (0x616199612ff8c24e), U64_C (0xb3b3f6b3f1457b42), U64_C (0x2121842115a54234), U64_C (0x9c9c4a9c94d62508), U64_C (0x1e1e781ef0663cee), U64_C (0x4343114322528661), U64_C (0xc7c73bc776fc93b1), U64_C (0xfcfcd7fcb32be54f), U64_C (0x0404100420140824), U64_C (0x51515951b208a2e3), U64_C (0x99995e99bcc72f25), U64_C (0x6d6da96d4fc4da22), U64_C (0x0d0d340d68391a65), U64_C (0xfafacffa8335e979), U64_C (0xdfdf5bdfb684a369), U64_C (0x7e7ee57ed79bfca9), U64_C (0x242490243db44819), U64_C (0x3b3bec3bc5d776fe), U64_C (0xabab96ab313d4b9a), U64_C (0xcece1fce3ed181f0), U64_C (0x1111441188552299), U64_C (0x8f8f068f0c890383), U64_C (0x4e4e254e4a6b9c04), U64_C (0xb7b7e6b7d1517366), U64_C (0xebeb8beb0b60cbe0), U64_C (0x3c3cf03cfdcc78c1), U64_C (0x81813e817cbf1ffd), U64_C (0x94946a94d4fe3540), U64_C (0xf7f7fbf7eb0cf31c), U64_C (0xb9b9deb9a1676f18), U64_C (0x13134c13985f268b), U64_C (0x2c2cb02c7d9c5851), U64_C (0xd3d36bd3d6b8bb05), U64_C (0xe7e7bbe76b5cd38c), U64_C (0x6e6ea56e57cbdc39), U64_C (0xc4c437c46ef395aa), U64_C (0x03030c03180f061b), U64_C (0x565645568a13acdc), U64_C (0x44440d441a49885e), U64_C (0x7f7fe17fdf9efea0), U64_C (0xa9a99ea921374f88), U64_C (0x2a2aa82a4d825467), U64_C (0xbbbbd6bbb16d6b0a), U64_C (0xc1c123c146e29f87), U64_C (0x53535153a202a6f1), U64_C (0xdcdc57dcae8ba572), U64_C (0x0b0b2c0b58271653), U64_C (0x9d9d4e9d9cd32701), U64_C (0x6c6cad6c47c1d82b), U64_C (0x3131c43195f562a4), U64_C (0x7474cd7487b9e8f3), U64_C (0xf6f6fff6e309f115), U64_C (0x464605460a438c4c), U64_C (0xacac8aac092645a5), U64_C (0x89891e893c970fb5), U64_C (0x14145014a04428b4), U64_C (0xe1e1a3e15b42dfba), U64_C (0x16165816b04e2ca6), U64_C (0x3a3ae83acdd274f7), U64_C (0x6969b9696fd0d206), U64_C (0x09092409482d1241), U64_C (0x7070dd70a7ade0d7), U64_C (0xb6b6e2b6d954716f), U64_C (0xd0d067d0ceb7bd1e), U64_C (0xeded93ed3b7ec7d6), U64_C (0xcccc17cc2edb85e2), U64_C (0x424215422a578468), U64_C (0x98985a98b4c22d2c), U64_C (0xa4a4aaa4490e55ed), U64_C (0x2828a0285d885075), U64_C (0x5c5c6d5cda31b886), U64_C (0xf8f8c7f8933fed6b), U64_C (0x8686228644a411c2), }, { U64_C (0xd818186018c07830), U64_C (0x2623238c2305af46), U64_C (0xb8c6c63fc67ef991), U64_C (0xfbe8e887e8136fcd), U64_C (0xcb878726874ca113), U64_C (0x11b8b8dab8a9626d), U64_C (0x0901010401080502), U64_C (0x0d4f4f214f426e9e), U64_C (0x9b3636d836adee6c), U64_C (0xffa6a6a2a6590451), U64_C (0x0cd2d26fd2debdb9), U64_C (0x0ef5f5f3f5fb06f7), U64_C (0x967979f979ef80f2), U64_C (0x306f6fa16f5fcede), U64_C (0x6d91917e91fcef3f), U64_C (0xf852525552aa07a4), U64_C (0x4760609d6027fdc0), U64_C (0x35bcbccabc897665), U64_C (0x379b9b569baccd2b), U64_C (0x8a8e8e028e048c01), U64_C (0xd2a3a3b6a371155b), U64_C (0x6c0c0c300c603c18), U64_C (0x847b7bf17bff8af6), U64_C (0x803535d435b5e16a), U64_C (0xf51d1d741de8693a), U64_C (0xb3e0e0a7e05347dd), U64_C (0x21d7d77bd7f6acb3), U64_C (0x9cc2c22fc25eed99), U64_C (0x432e2eb82e6d965c), U64_C (0x294b4b314b627a96), U64_C (0x5dfefedffea321e1), U64_C (0xd5575741578216ae), U64_C (0xbd15155415a8412a), U64_C (0xe87777c1779fb6ee), U64_C (0x923737dc37a5eb6e), U64_C (0x9ee5e5b3e57b56d7), U64_C (0x139f9f469f8cd923), U64_C (0x23f0f0e7f0d317fd), U64_C (0x204a4a354a6a7f94), U64_C (0x44dada4fda9e95a9), U64_C (0xa258587d58fa25b0), U64_C (0xcfc9c903c906ca8f), U64_C (0x7c2929a429558d52), U64_C (0x5a0a0a280a502214), U64_C (0x50b1b1feb1e14f7f), U64_C (0xc9a0a0baa0691a5d), U64_C (0x146b6bb16b7fdad6), U64_C (0xd985852e855cab17), U64_C (0x3cbdbdcebd817367), U64_C (0x8f5d5d695dd234ba), U64_C (0x9010104010805020), U64_C (0x07f4f4f7f4f303f5), U64_C (0xddcbcb0bcb16c08b), U64_C (0xd33e3ef83eedc67c), U64_C (0x2d0505140528110a), U64_C (0x78676781671fe6ce), U64_C (0x97e4e4b7e47353d5), U64_C (0x0227279c2725bb4e), U64_C (0x7341411941325882), U64_C (0xa78b8b168b2c9d0b), U64_C (0xf6a7a7a6a7510153), U64_C (0xb27d7de97dcf94fa), U64_C (0x4995956e95dcfb37), U64_C (0x56d8d847d88e9fad), U64_C (0x70fbfbcbfb8b30eb), U64_C (0xcdeeee9fee2371c1), U64_C (0xbb7c7ced7cc791f8), U64_C (0x716666856617e3cc), U64_C (0x7bdddd53dda68ea7), U64_C (0xaf17175c17b84b2e), U64_C (0x454747014702468e), U64_C (0x1a9e9e429e84dc21), U64_C (0xd4caca0fca1ec589), U64_C (0x582d2db42d75995a), U64_C (0x2ebfbfc6bf917963), U64_C (0x3f07071c07381b0e), U64_C (0xacadad8ead012347), U64_C (0xb05a5a755aea2fb4), U64_C (0xef838336836cb51b), U64_C (0xb63333cc3385ff66), U64_C (0x5c636391633ff2c6), U64_C (0x1202020802100a04), U64_C (0x93aaaa92aa393849), U64_C (0xde7171d971afa8e2), U64_C (0xc6c8c807c80ecf8d), U64_C (0xd119196419c87d32), U64_C (0x3b49493949727092), U64_C (0x5fd9d943d9869aaf), U64_C (0x31f2f2eff2c31df9), U64_C (0xa8e3e3abe34b48db), U64_C (0xb95b5b715be22ab6), U64_C (0xbc88881a8834920d), U64_C (0x3e9a9a529aa4c829), U64_C (0x0b262698262dbe4c), U64_C (0xbf3232c8328dfa64), U64_C (0x59b0b0fab0e94a7d), U64_C (0xf2e9e983e91b6acf), U64_C (0x770f0f3c0f78331e), U64_C (0x33d5d573d5e6a6b7), U64_C (0xf480803a8074ba1d), U64_C (0x27bebec2be997c61), U64_C (0xebcdcd13cd26de87), U64_C (0x893434d034bde468), U64_C (0x3248483d487a7590), U64_C (0x54ffffdbffab24e3), U64_C (0x8d7a7af57af78ff4), U64_C (0x6490907a90f4ea3d), U64_C (0x9d5f5f615fc23ebe), U64_C (0x3d202080201da040), U64_C (0x0f6868bd6867d5d0), U64_C (0xca1a1a681ad07234), U64_C (0xb7aeae82ae192c41), U64_C (0x7db4b4eab4c95e75), U64_C (0xce54544d549a19a8), U64_C (0x7f93937693ece53b), U64_C (0x2f222288220daa44), U64_C (0x6364648d6407e9c8), U64_C (0x2af1f1e3f1db12ff), U64_C (0xcc7373d173bfa2e6), U64_C (0x8212124812905a24), U64_C (0x7a40401d403a5d80), U64_C (0x4808082008402810), U64_C (0x95c3c32bc356e89b), U64_C (0xdfecec97ec337bc5), U64_C (0x4ddbdb4bdb9690ab), U64_C (0xc0a1a1bea1611f5f), U64_C (0x918d8d0e8d1c8307), U64_C (0xc83d3df43df5c97a), U64_C (0x5b97976697ccf133), U64_C (0x0000000000000000), U64_C (0xf9cfcf1bcf36d483), U64_C (0x6e2b2bac2b458756), U64_C (0xe17676c57697b3ec), U64_C (0xe68282328264b019), U64_C (0x28d6d67fd6fea9b1), U64_C (0xc31b1b6c1bd87736), U64_C (0x74b5b5eeb5c15b77), U64_C (0xbeafaf86af112943), U64_C (0x1d6a6ab56a77dfd4), U64_C (0xea50505d50ba0da0), U64_C (0x5745450945124c8a), U64_C (0x38f3f3ebf3cb18fb), U64_C (0xad3030c0309df060), U64_C (0xc4efef9bef2b74c3), U64_C (0xda3f3ffc3fe5c37e), U64_C (0xc755554955921caa), U64_C (0xdba2a2b2a2791059), U64_C (0xe9eaea8fea0365c9), U64_C (0x6a656589650fecca), U64_C (0x03babad2bab96869), U64_C (0x4a2f2fbc2f65935e), U64_C (0x8ec0c027c04ee79d), U64_C (0x60dede5fdebe81a1), U64_C (0xfc1c1c701ce06c38), U64_C (0x46fdfdd3fdbb2ee7), U64_C (0x1f4d4d294d52649a), U64_C (0x7692927292e4e039), U64_C (0xfa7575c9758fbcea), U64_C (0x3606061806301e0c), U64_C (0xae8a8a128a249809), U64_C (0x4bb2b2f2b2f94079), U64_C (0x85e6e6bfe66359d1), U64_C (0x7e0e0e380e70361c), U64_C (0xe71f1f7c1ff8633e), U64_C (0x556262956237f7c4), U64_C (0x3ad4d477d4eea3b5), U64_C (0x81a8a89aa829324d), U64_C (0x5296966296c4f431), U64_C (0x62f9f9c3f99b3aef), U64_C (0xa3c5c533c566f697), U64_C (0x102525942535b14a), U64_C (0xab59597959f220b2), U64_C (0xd084842a8454ae15), U64_C (0xc57272d572b7a7e4), U64_C (0xec3939e439d5dd72), U64_C (0x164c4c2d4c5a6198), U64_C (0x945e5e655eca3bbc), U64_C (0x9f7878fd78e785f0), U64_C (0xe53838e038ddd870), U64_C (0x988c8c0a8c148605), U64_C (0x17d1d163d1c6b2bf), U64_C (0xe4a5a5aea5410b57), U64_C (0xa1e2e2afe2434dd9), U64_C (0x4e616199612ff8c2), U64_C (0x42b3b3f6b3f1457b), U64_C (0x342121842115a542), U64_C (0x089c9c4a9c94d625), U64_C (0xee1e1e781ef0663c), U64_C (0x6143431143225286), U64_C (0xb1c7c73bc776fc93), U64_C (0x4ffcfcd7fcb32be5), U64_C (0x2404041004201408), U64_C (0xe351515951b208a2), U64_C (0x2599995e99bcc72f), U64_C (0x226d6da96d4fc4da), U64_C (0x650d0d340d68391a), U64_C (0x79fafacffa8335e9), U64_C (0x69dfdf5bdfb684a3), U64_C (0xa97e7ee57ed79bfc), U64_C (0x19242490243db448), U64_C (0xfe3b3bec3bc5d776), U64_C (0x9aabab96ab313d4b), U64_C (0xf0cece1fce3ed181), U64_C (0x9911114411885522), U64_C (0x838f8f068f0c8903), U64_C (0x044e4e254e4a6b9c), U64_C (0x66b7b7e6b7d15173), U64_C (0xe0ebeb8beb0b60cb), U64_C (0xc13c3cf03cfdcc78), U64_C (0xfd81813e817cbf1f), U64_C (0x4094946a94d4fe35), U64_C (0x1cf7f7fbf7eb0cf3), U64_C (0x18b9b9deb9a1676f), U64_C (0x8b13134c13985f26), U64_C (0x512c2cb02c7d9c58), U64_C (0x05d3d36bd3d6b8bb), U64_C (0x8ce7e7bbe76b5cd3), U64_C (0x396e6ea56e57cbdc), U64_C (0xaac4c437c46ef395), U64_C (0x1b03030c03180f06), U64_C (0xdc565645568a13ac), U64_C (0x5e44440d441a4988), U64_C (0xa07f7fe17fdf9efe), U64_C (0x88a9a99ea921374f), U64_C (0x672a2aa82a4d8254), U64_C (0x0abbbbd6bbb16d6b), U64_C (0x87c1c123c146e29f), U64_C (0xf153535153a202a6), U64_C (0x72dcdc57dcae8ba5), U64_C (0x530b0b2c0b582716), U64_C (0x019d9d4e9d9cd327), U64_C (0x2b6c6cad6c47c1d8), U64_C (0xa43131c43195f562), U64_C (0xf37474cd7487b9e8), U64_C (0x15f6f6fff6e309f1), U64_C (0x4c464605460a438c), U64_C (0xa5acac8aac092645), U64_C (0xb589891e893c970f), U64_C (0xb414145014a04428), U64_C (0xbae1e1a3e15b42df), U64_C (0xa616165816b04e2c), U64_C (0xf73a3ae83acdd274), U64_C (0x066969b9696fd0d2), U64_C (0x4109092409482d12), U64_C (0xd77070dd70a7ade0), U64_C (0x6fb6b6e2b6d95471), U64_C (0x1ed0d067d0ceb7bd), U64_C (0xd6eded93ed3b7ec7), U64_C (0xe2cccc17cc2edb85), U64_C (0x68424215422a5784), U64_C (0x2c98985a98b4c22d), U64_C (0xeda4a4aaa4490e55), U64_C (0x752828a0285d8850), U64_C (0x865c5c6d5cda31b8), U64_C (0x6bf8f8c7f8933fed), U64_C (0xc28686228644a411), }, { U64_C (0x30d818186018c078), U64_C (0x462623238c2305af), U64_C (0x91b8c6c63fc67ef9), U64_C (0xcdfbe8e887e8136f), U64_C (0x13cb878726874ca1), U64_C (0x6d11b8b8dab8a962), U64_C (0x0209010104010805), U64_C (0x9e0d4f4f214f426e), U64_C (0x6c9b3636d836adee), U64_C (0x51ffa6a6a2a65904), U64_C (0xb90cd2d26fd2debd), U64_C (0xf70ef5f5f3f5fb06), U64_C (0xf2967979f979ef80), U64_C (0xde306f6fa16f5fce), U64_C (0x3f6d91917e91fcef), U64_C (0xa4f852525552aa07), U64_C (0xc04760609d6027fd), U64_C (0x6535bcbccabc8976), U64_C (0x2b379b9b569baccd), U64_C (0x018a8e8e028e048c), U64_C (0x5bd2a3a3b6a37115), U64_C (0x186c0c0c300c603c), U64_C (0xf6847b7bf17bff8a), U64_C (0x6a803535d435b5e1), U64_C (0x3af51d1d741de869), U64_C (0xddb3e0e0a7e05347), U64_C (0xb321d7d77bd7f6ac), U64_C (0x999cc2c22fc25eed), U64_C (0x5c432e2eb82e6d96), U64_C (0x96294b4b314b627a), U64_C (0xe15dfefedffea321), U64_C (0xaed5575741578216), U64_C (0x2abd15155415a841), U64_C (0xeee87777c1779fb6), U64_C (0x6e923737dc37a5eb), U64_C (0xd79ee5e5b3e57b56), U64_C (0x23139f9f469f8cd9), U64_C (0xfd23f0f0e7f0d317), U64_C (0x94204a4a354a6a7f), U64_C (0xa944dada4fda9e95), U64_C (0xb0a258587d58fa25), U64_C (0x8fcfc9c903c906ca), U64_C (0x527c2929a429558d), U64_C (0x145a0a0a280a5022), U64_C (0x7f50b1b1feb1e14f), U64_C (0x5dc9a0a0baa0691a), U64_C (0xd6146b6bb16b7fda), U64_C (0x17d985852e855cab), U64_C (0x673cbdbdcebd8173), U64_C (0xba8f5d5d695dd234), U64_C (0x2090101040108050), U64_C (0xf507f4f4f7f4f303), U64_C (0x8bddcbcb0bcb16c0), U64_C (0x7cd33e3ef83eedc6), U64_C (0x0a2d050514052811), U64_C (0xce78676781671fe6), U64_C (0xd597e4e4b7e47353), U64_C (0x4e0227279c2725bb), U64_C (0x8273414119413258), U64_C (0x0ba78b8b168b2c9d), U64_C (0x53f6a7a7a6a75101), U64_C (0xfab27d7de97dcf94), U64_C (0x374995956e95dcfb), U64_C (0xad56d8d847d88e9f), U64_C (0xeb70fbfbcbfb8b30), U64_C (0xc1cdeeee9fee2371), U64_C (0xf8bb7c7ced7cc791), U64_C (0xcc716666856617e3), U64_C (0xa77bdddd53dda68e), U64_C (0x2eaf17175c17b84b), U64_C (0x8e45474701470246), U64_C (0x211a9e9e429e84dc), U64_C (0x89d4caca0fca1ec5), U64_C (0x5a582d2db42d7599), U64_C (0x632ebfbfc6bf9179), U64_C (0x0e3f07071c07381b), U64_C (0x47acadad8ead0123), U64_C (0xb4b05a5a755aea2f), U64_C (0x1bef838336836cb5), U64_C (0x66b63333cc3385ff), U64_C (0xc65c636391633ff2), U64_C (0x041202020802100a), U64_C (0x4993aaaa92aa3938), U64_C (0xe2de7171d971afa8), U64_C (0x8dc6c8c807c80ecf), U64_C (0x32d119196419c87d), U64_C (0x923b494939497270), U64_C (0xaf5fd9d943d9869a), U64_C (0xf931f2f2eff2c31d), U64_C (0xdba8e3e3abe34b48), U64_C (0xb6b95b5b715be22a), U64_C (0x0dbc88881a883492), U64_C (0x293e9a9a529aa4c8), U64_C (0x4c0b262698262dbe), U64_C (0x64bf3232c8328dfa), U64_C (0x7d59b0b0fab0e94a), U64_C (0xcff2e9e983e91b6a), U64_C (0x1e770f0f3c0f7833), U64_C (0xb733d5d573d5e6a6), U64_C (0x1df480803a8074ba), U64_C (0x6127bebec2be997c), U64_C (0x87ebcdcd13cd26de), U64_C (0x68893434d034bde4), U64_C (0x903248483d487a75), U64_C (0xe354ffffdbffab24), U64_C (0xf48d7a7af57af78f), U64_C (0x3d6490907a90f4ea), U64_C (0xbe9d5f5f615fc23e), U64_C (0x403d202080201da0), U64_C (0xd00f6868bd6867d5), U64_C (0x34ca1a1a681ad072), U64_C (0x41b7aeae82ae192c), U64_C (0x757db4b4eab4c95e), U64_C (0xa8ce54544d549a19), U64_C (0x3b7f93937693ece5), U64_C (0x442f222288220daa), U64_C (0xc86364648d6407e9), U64_C (0xff2af1f1e3f1db12), U64_C (0xe6cc7373d173bfa2), U64_C (0x248212124812905a), U64_C (0x807a40401d403a5d), U64_C (0x1048080820084028), U64_C (0x9b95c3c32bc356e8), U64_C (0xc5dfecec97ec337b), U64_C (0xab4ddbdb4bdb9690), U64_C (0x5fc0a1a1bea1611f), U64_C (0x07918d8d0e8d1c83), U64_C (0x7ac83d3df43df5c9), U64_C (0x335b97976697ccf1), U64_C (0x0000000000000000), U64_C (0x83f9cfcf1bcf36d4), U64_C (0x566e2b2bac2b4587), U64_C (0xece17676c57697b3), U64_C (0x19e68282328264b0), U64_C (0xb128d6d67fd6fea9), U64_C (0x36c31b1b6c1bd877), U64_C (0x7774b5b5eeb5c15b), U64_C (0x43beafaf86af1129), U64_C (0xd41d6a6ab56a77df), U64_C (0xa0ea50505d50ba0d), U64_C (0x8a5745450945124c), U64_C (0xfb38f3f3ebf3cb18), U64_C (0x60ad3030c0309df0), U64_C (0xc3c4efef9bef2b74), U64_C (0x7eda3f3ffc3fe5c3), U64_C (0xaac755554955921c), U64_C (0x59dba2a2b2a27910), U64_C (0xc9e9eaea8fea0365), U64_C (0xca6a656589650fec), U64_C (0x6903babad2bab968), U64_C (0x5e4a2f2fbc2f6593), U64_C (0x9d8ec0c027c04ee7), U64_C (0xa160dede5fdebe81), U64_C (0x38fc1c1c701ce06c), U64_C (0xe746fdfdd3fdbb2e), U64_C (0x9a1f4d4d294d5264), U64_C (0x397692927292e4e0), U64_C (0xeafa7575c9758fbc), U64_C (0x0c3606061806301e), U64_C (0x09ae8a8a128a2498), U64_C (0x794bb2b2f2b2f940), U64_C (0xd185e6e6bfe66359), U64_C (0x1c7e0e0e380e7036), U64_C (0x3ee71f1f7c1ff863), U64_C (0xc4556262956237f7), U64_C (0xb53ad4d477d4eea3), U64_C (0x4d81a8a89aa82932), U64_C (0x315296966296c4f4), U64_C (0xef62f9f9c3f99b3a), U64_C (0x97a3c5c533c566f6), U64_C (0x4a102525942535b1), U64_C (0xb2ab59597959f220), U64_C (0x15d084842a8454ae), U64_C (0xe4c57272d572b7a7), U64_C (0x72ec3939e439d5dd), U64_C (0x98164c4c2d4c5a61), U64_C (0xbc945e5e655eca3b), U64_C (0xf09f7878fd78e785), U64_C (0x70e53838e038ddd8), U64_C (0x05988c8c0a8c1486), U64_C (0xbf17d1d163d1c6b2), U64_C (0x57e4a5a5aea5410b), U64_C (0xd9a1e2e2afe2434d), U64_C (0xc24e616199612ff8), U64_C (0x7b42b3b3f6b3f145), U64_C (0x42342121842115a5), U64_C (0x25089c9c4a9c94d6), U64_C (0x3cee1e1e781ef066), U64_C (0x8661434311432252), U64_C (0x93b1c7c73bc776fc), U64_C (0xe54ffcfcd7fcb32b), U64_C (0x0824040410042014), U64_C (0xa2e351515951b208), U64_C (0x2f2599995e99bcc7), U64_C (0xda226d6da96d4fc4), U64_C (0x1a650d0d340d6839), U64_C (0xe979fafacffa8335), U64_C (0xa369dfdf5bdfb684), U64_C (0xfca97e7ee57ed79b), U64_C (0x4819242490243db4), U64_C (0x76fe3b3bec3bc5d7), U64_C (0x4b9aabab96ab313d), U64_C (0x81f0cece1fce3ed1), U64_C (0x2299111144118855), U64_C (0x03838f8f068f0c89), U64_C (0x9c044e4e254e4a6b), U64_C (0x7366b7b7e6b7d151), U64_C (0xcbe0ebeb8beb0b60), U64_C (0x78c13c3cf03cfdcc), U64_C (0x1ffd81813e817cbf), U64_C (0x354094946a94d4fe), U64_C (0xf31cf7f7fbf7eb0c), U64_C (0x6f18b9b9deb9a167), U64_C (0x268b13134c13985f), U64_C (0x58512c2cb02c7d9c), U64_C (0xbb05d3d36bd3d6b8), U64_C (0xd38ce7e7bbe76b5c), U64_C (0xdc396e6ea56e57cb), U64_C (0x95aac4c437c46ef3), U64_C (0x061b03030c03180f), U64_C (0xacdc565645568a13), U64_C (0x885e44440d441a49), U64_C (0xfea07f7fe17fdf9e), U64_C (0x4f88a9a99ea92137), U64_C (0x54672a2aa82a4d82), U64_C (0x6b0abbbbd6bbb16d), U64_C (0x9f87c1c123c146e2), U64_C (0xa6f153535153a202), U64_C (0xa572dcdc57dcae8b), U64_C (0x16530b0b2c0b5827), U64_C (0x27019d9d4e9d9cd3), U64_C (0xd82b6c6cad6c47c1), U64_C (0x62a43131c43195f5), U64_C (0xe8f37474cd7487b9), U64_C (0xf115f6f6fff6e309), U64_C (0x8c4c464605460a43), U64_C (0x45a5acac8aac0926), U64_C (0x0fb589891e893c97), U64_C (0x28b414145014a044), U64_C (0xdfbae1e1a3e15b42), U64_C (0x2ca616165816b04e), U64_C (0x74f73a3ae83acdd2), U64_C (0xd2066969b9696fd0), U64_C (0x124109092409482d), U64_C (0xe0d77070dd70a7ad), U64_C (0x716fb6b6e2b6d954), U64_C (0xbd1ed0d067d0ceb7), U64_C (0xc7d6eded93ed3b7e), U64_C (0x85e2cccc17cc2edb), U64_C (0x8468424215422a57), U64_C (0x2d2c98985a98b4c2), U64_C (0x55eda4a4aaa4490e), U64_C (0x50752828a0285d88), U64_C (0xb8865c5c6d5cda31), U64_C (0xed6bf8f8c7f8933f), U64_C (0x11c28686228644a4), }, { U64_C (0x7830d818186018c0), U64_C (0xaf462623238c2305), U64_C (0xf991b8c6c63fc67e), U64_C (0x6fcdfbe8e887e813), U64_C (0xa113cb878726874c), U64_C (0x626d11b8b8dab8a9), U64_C (0x0502090101040108), U64_C (0x6e9e0d4f4f214f42), U64_C (0xee6c9b3636d836ad), U64_C (0x0451ffa6a6a2a659), U64_C (0xbdb90cd2d26fd2de), U64_C (0x06f70ef5f5f3f5fb), U64_C (0x80f2967979f979ef), U64_C (0xcede306f6fa16f5f), U64_C (0xef3f6d91917e91fc), U64_C (0x07a4f852525552aa), U64_C (0xfdc04760609d6027), U64_C (0x766535bcbccabc89), U64_C (0xcd2b379b9b569bac), U64_C (0x8c018a8e8e028e04), U64_C (0x155bd2a3a3b6a371), U64_C (0x3c186c0c0c300c60), U64_C (0x8af6847b7bf17bff), U64_C (0xe16a803535d435b5), U64_C (0x693af51d1d741de8), U64_C (0x47ddb3e0e0a7e053), U64_C (0xacb321d7d77bd7f6), U64_C (0xed999cc2c22fc25e), U64_C (0x965c432e2eb82e6d), U64_C (0x7a96294b4b314b62), U64_C (0x21e15dfefedffea3), U64_C (0x16aed55757415782), U64_C (0x412abd15155415a8), U64_C (0xb6eee87777c1779f), U64_C (0xeb6e923737dc37a5), U64_C (0x56d79ee5e5b3e57b), U64_C (0xd923139f9f469f8c), U64_C (0x17fd23f0f0e7f0d3), U64_C (0x7f94204a4a354a6a), U64_C (0x95a944dada4fda9e), U64_C (0x25b0a258587d58fa), U64_C (0xca8fcfc9c903c906), U64_C (0x8d527c2929a42955), U64_C (0x22145a0a0a280a50), U64_C (0x4f7f50b1b1feb1e1), U64_C (0x1a5dc9a0a0baa069), U64_C (0xdad6146b6bb16b7f), U64_C (0xab17d985852e855c), U64_C (0x73673cbdbdcebd81), U64_C (0x34ba8f5d5d695dd2), U64_C (0x5020901010401080), U64_C (0x03f507f4f4f7f4f3), U64_C (0xc08bddcbcb0bcb16), U64_C (0xc67cd33e3ef83eed), U64_C (0x110a2d0505140528), U64_C (0xe6ce78676781671f), U64_C (0x53d597e4e4b7e473), U64_C (0xbb4e0227279c2725), U64_C (0x5882734141194132), U64_C (0x9d0ba78b8b168b2c), U64_C (0x0153f6a7a7a6a751), U64_C (0x94fab27d7de97dcf), U64_C (0xfb374995956e95dc), U64_C (0x9fad56d8d847d88e), U64_C (0x30eb70fbfbcbfb8b), U64_C (0x71c1cdeeee9fee23), U64_C (0x91f8bb7c7ced7cc7), U64_C (0xe3cc716666856617), U64_C (0x8ea77bdddd53dda6), U64_C (0x4b2eaf17175c17b8), U64_C (0x468e454747014702), U64_C (0xdc211a9e9e429e84), U64_C (0xc589d4caca0fca1e), U64_C (0x995a582d2db42d75), U64_C (0x79632ebfbfc6bf91), U64_C (0x1b0e3f07071c0738), U64_C (0x2347acadad8ead01), U64_C (0x2fb4b05a5a755aea), U64_C (0xb51bef838336836c), U64_C (0xff66b63333cc3385), U64_C (0xf2c65c636391633f), U64_C (0x0a04120202080210), U64_C (0x384993aaaa92aa39), U64_C (0xa8e2de7171d971af), U64_C (0xcf8dc6c8c807c80e), U64_C (0x7d32d119196419c8), U64_C (0x70923b4949394972), U64_C (0x9aaf5fd9d943d986), U64_C (0x1df931f2f2eff2c3), U64_C (0x48dba8e3e3abe34b), U64_C (0x2ab6b95b5b715be2), U64_C (0x920dbc88881a8834), U64_C (0xc8293e9a9a529aa4), U64_C (0xbe4c0b262698262d), U64_C (0xfa64bf3232c8328d), U64_C (0x4a7d59b0b0fab0e9), U64_C (0x6acff2e9e983e91b), U64_C (0x331e770f0f3c0f78), U64_C (0xa6b733d5d573d5e6), U64_C (0xba1df480803a8074), U64_C (0x7c6127bebec2be99), U64_C (0xde87ebcdcd13cd26), U64_C (0xe468893434d034bd), U64_C (0x75903248483d487a), U64_C (0x24e354ffffdbffab), U64_C (0x8ff48d7a7af57af7), U64_C (0xea3d6490907a90f4), U64_C (0x3ebe9d5f5f615fc2), U64_C (0xa0403d202080201d), U64_C (0xd5d00f6868bd6867), U64_C (0x7234ca1a1a681ad0), U64_C (0x2c41b7aeae82ae19), U64_C (0x5e757db4b4eab4c9), U64_C (0x19a8ce54544d549a), U64_C (0xe53b7f93937693ec), U64_C (0xaa442f222288220d), U64_C (0xe9c86364648d6407), U64_C (0x12ff2af1f1e3f1db), U64_C (0xa2e6cc7373d173bf), U64_C (0x5a24821212481290), U64_C (0x5d807a40401d403a), U64_C (0x2810480808200840), U64_C (0xe89b95c3c32bc356), U64_C (0x7bc5dfecec97ec33), U64_C (0x90ab4ddbdb4bdb96), U64_C (0x1f5fc0a1a1bea161), U64_C (0x8307918d8d0e8d1c), U64_C (0xc97ac83d3df43df5), U64_C (0xf1335b97976697cc), U64_C (0x0000000000000000), U64_C (0xd483f9cfcf1bcf36), U64_C (0x87566e2b2bac2b45), U64_C (0xb3ece17676c57697), U64_C (0xb019e68282328264), U64_C (0xa9b128d6d67fd6fe), U64_C (0x7736c31b1b6c1bd8), U64_C (0x5b7774b5b5eeb5c1), U64_C (0x2943beafaf86af11), U64_C (0xdfd41d6a6ab56a77), U64_C (0x0da0ea50505d50ba), U64_C (0x4c8a574545094512), U64_C (0x18fb38f3f3ebf3cb), U64_C (0xf060ad3030c0309d), U64_C (0x74c3c4efef9bef2b), U64_C (0xc37eda3f3ffc3fe5), U64_C (0x1caac75555495592), U64_C (0x1059dba2a2b2a279), U64_C (0x65c9e9eaea8fea03), U64_C (0xecca6a656589650f), U64_C (0x686903babad2bab9), U64_C (0x935e4a2f2fbc2f65), U64_C (0xe79d8ec0c027c04e), U64_C (0x81a160dede5fdebe), U64_C (0x6c38fc1c1c701ce0), U64_C (0x2ee746fdfdd3fdbb), U64_C (0x649a1f4d4d294d52), U64_C (0xe0397692927292e4), U64_C (0xbceafa7575c9758f), U64_C (0x1e0c360606180630), U64_C (0x9809ae8a8a128a24), U64_C (0x40794bb2b2f2b2f9), U64_C (0x59d185e6e6bfe663), U64_C (0x361c7e0e0e380e70), U64_C (0x633ee71f1f7c1ff8), U64_C (0xf7c4556262956237), U64_C (0xa3b53ad4d477d4ee), U64_C (0x324d81a8a89aa829), U64_C (0xf4315296966296c4), U64_C (0x3aef62f9f9c3f99b), U64_C (0xf697a3c5c533c566), U64_C (0xb14a102525942535), U64_C (0x20b2ab59597959f2), U64_C (0xae15d084842a8454), U64_C (0xa7e4c57272d572b7), U64_C (0xdd72ec3939e439d5), U64_C (0x6198164c4c2d4c5a), U64_C (0x3bbc945e5e655eca), U64_C (0x85f09f7878fd78e7), U64_C (0xd870e53838e038dd), U64_C (0x8605988c8c0a8c14), U64_C (0xb2bf17d1d163d1c6), U64_C (0x0b57e4a5a5aea541), U64_C (0x4dd9a1e2e2afe243), U64_C (0xf8c24e616199612f), U64_C (0x457b42b3b3f6b3f1), U64_C (0xa542342121842115), U64_C (0xd625089c9c4a9c94), U64_C (0x663cee1e1e781ef0), U64_C (0x5286614343114322), U64_C (0xfc93b1c7c73bc776), U64_C (0x2be54ffcfcd7fcb3), U64_C (0x1408240404100420), U64_C (0x08a2e351515951b2), U64_C (0xc72f2599995e99bc), U64_C (0xc4da226d6da96d4f), U64_C (0x391a650d0d340d68), U64_C (0x35e979fafacffa83), U64_C (0x84a369dfdf5bdfb6), U64_C (0x9bfca97e7ee57ed7), U64_C (0xb44819242490243d), U64_C (0xd776fe3b3bec3bc5), U64_C (0x3d4b9aabab96ab31), U64_C (0xd181f0cece1fce3e), U64_C (0x5522991111441188), U64_C (0x8903838f8f068f0c), U64_C (0x6b9c044e4e254e4a), U64_C (0x517366b7b7e6b7d1), U64_C (0x60cbe0ebeb8beb0b), U64_C (0xcc78c13c3cf03cfd), U64_C (0xbf1ffd81813e817c), U64_C (0xfe354094946a94d4), U64_C (0x0cf31cf7f7fbf7eb), U64_C (0x676f18b9b9deb9a1), U64_C (0x5f268b13134c1398), U64_C (0x9c58512c2cb02c7d), U64_C (0xb8bb05d3d36bd3d6), U64_C (0x5cd38ce7e7bbe76b), U64_C (0xcbdc396e6ea56e57), U64_C (0xf395aac4c437c46e), U64_C (0x0f061b03030c0318), U64_C (0x13acdc565645568a), U64_C (0x49885e44440d441a), U64_C (0x9efea07f7fe17fdf), U64_C (0x374f88a9a99ea921), U64_C (0x8254672a2aa82a4d), U64_C (0x6d6b0abbbbd6bbb1), U64_C (0xe29f87c1c123c146), U64_C (0x02a6f153535153a2), U64_C (0x8ba572dcdc57dcae), U64_C (0x2716530b0b2c0b58), U64_C (0xd327019d9d4e9d9c), U64_C (0xc1d82b6c6cad6c47), U64_C (0xf562a43131c43195), U64_C (0xb9e8f37474cd7487), U64_C (0x09f115f6f6fff6e3), U64_C (0x438c4c464605460a), U64_C (0x2645a5acac8aac09), U64_C (0x970fb589891e893c), U64_C (0x4428b414145014a0), U64_C (0x42dfbae1e1a3e15b), U64_C (0x4e2ca616165816b0), U64_C (0xd274f73a3ae83acd), U64_C (0xd0d2066969b9696f), U64_C (0x2d12410909240948), U64_C (0xade0d77070dd70a7), U64_C (0x54716fb6b6e2b6d9), U64_C (0xb7bd1ed0d067d0ce), U64_C (0x7ec7d6eded93ed3b), U64_C (0xdb85e2cccc17cc2e), U64_C (0x578468424215422a), U64_C (0xc22d2c98985a98b4), U64_C (0x0e55eda4a4aaa449), U64_C (0x8850752828a0285d), U64_C (0x31b8865c5c6d5cda), U64_C (0x3fed6bf8f8c7f893), U64_C (0xa411c28686228644), }, { U64_C (0xc07830d818186018), U64_C (0x05af462623238c23), U64_C (0x7ef991b8c6c63fc6), U64_C (0x136fcdfbe8e887e8), U64_C (0x4ca113cb87872687), U64_C (0xa9626d11b8b8dab8), U64_C (0x0805020901010401), U64_C (0x426e9e0d4f4f214f), U64_C (0xadee6c9b3636d836), U64_C (0x590451ffa6a6a2a6), U64_C (0xdebdb90cd2d26fd2), U64_C (0xfb06f70ef5f5f3f5), U64_C (0xef80f2967979f979), U64_C (0x5fcede306f6fa16f), U64_C (0xfcef3f6d91917e91), U64_C (0xaa07a4f852525552), U64_C (0x27fdc04760609d60), U64_C (0x89766535bcbccabc), U64_C (0xaccd2b379b9b569b), U64_C (0x048c018a8e8e028e), U64_C (0x71155bd2a3a3b6a3), U64_C (0x603c186c0c0c300c), U64_C (0xff8af6847b7bf17b), U64_C (0xb5e16a803535d435), U64_C (0xe8693af51d1d741d), U64_C (0x5347ddb3e0e0a7e0), U64_C (0xf6acb321d7d77bd7), U64_C (0x5eed999cc2c22fc2), U64_C (0x6d965c432e2eb82e), U64_C (0x627a96294b4b314b), U64_C (0xa321e15dfefedffe), U64_C (0x8216aed557574157), U64_C (0xa8412abd15155415), U64_C (0x9fb6eee87777c177), U64_C (0xa5eb6e923737dc37), U64_C (0x7b56d79ee5e5b3e5), U64_C (0x8cd923139f9f469f), U64_C (0xd317fd23f0f0e7f0), U64_C (0x6a7f94204a4a354a), U64_C (0x9e95a944dada4fda), U64_C (0xfa25b0a258587d58), U64_C (0x06ca8fcfc9c903c9), U64_C (0x558d527c2929a429), U64_C (0x5022145a0a0a280a), U64_C (0xe14f7f50b1b1feb1), U64_C (0x691a5dc9a0a0baa0), U64_C (0x7fdad6146b6bb16b), U64_C (0x5cab17d985852e85), U64_C (0x8173673cbdbdcebd), U64_C (0xd234ba8f5d5d695d), U64_C (0x8050209010104010), U64_C (0xf303f507f4f4f7f4), U64_C (0x16c08bddcbcb0bcb), U64_C (0xedc67cd33e3ef83e), U64_C (0x28110a2d05051405), U64_C (0x1fe6ce7867678167), U64_C (0x7353d597e4e4b7e4), U64_C (0x25bb4e0227279c27), U64_C (0x3258827341411941), U64_C (0x2c9d0ba78b8b168b), U64_C (0x510153f6a7a7a6a7), U64_C (0xcf94fab27d7de97d), U64_C (0xdcfb374995956e95), U64_C (0x8e9fad56d8d847d8), U64_C (0x8b30eb70fbfbcbfb), U64_C (0x2371c1cdeeee9fee), U64_C (0xc791f8bb7c7ced7c), U64_C (0x17e3cc7166668566), U64_C (0xa68ea77bdddd53dd), U64_C (0xb84b2eaf17175c17), U64_C (0x02468e4547470147), U64_C (0x84dc211a9e9e429e), U64_C (0x1ec589d4caca0fca), U64_C (0x75995a582d2db42d), U64_C (0x9179632ebfbfc6bf), U64_C (0x381b0e3f07071c07), U64_C (0x012347acadad8ead), U64_C (0xea2fb4b05a5a755a), U64_C (0x6cb51bef83833683), U64_C (0x85ff66b63333cc33), U64_C (0x3ff2c65c63639163), U64_C (0x100a041202020802), U64_C (0x39384993aaaa92aa), U64_C (0xafa8e2de7171d971), U64_C (0x0ecf8dc6c8c807c8), U64_C (0xc87d32d119196419), U64_C (0x7270923b49493949), U64_C (0x869aaf5fd9d943d9), U64_C (0xc31df931f2f2eff2), U64_C (0x4b48dba8e3e3abe3), U64_C (0xe22ab6b95b5b715b), U64_C (0x34920dbc88881a88), U64_C (0xa4c8293e9a9a529a), U64_C (0x2dbe4c0b26269826), U64_C (0x8dfa64bf3232c832), U64_C (0xe94a7d59b0b0fab0), U64_C (0x1b6acff2e9e983e9), U64_C (0x78331e770f0f3c0f), U64_C (0xe6a6b733d5d573d5), U64_C (0x74ba1df480803a80), U64_C (0x997c6127bebec2be), U64_C (0x26de87ebcdcd13cd), U64_C (0xbde468893434d034), U64_C (0x7a75903248483d48), U64_C (0xab24e354ffffdbff), U64_C (0xf78ff48d7a7af57a), U64_C (0xf4ea3d6490907a90), U64_C (0xc23ebe9d5f5f615f), U64_C (0x1da0403d20208020), U64_C (0x67d5d00f6868bd68), U64_C (0xd07234ca1a1a681a), U64_C (0x192c41b7aeae82ae), U64_C (0xc95e757db4b4eab4), U64_C (0x9a19a8ce54544d54), U64_C (0xece53b7f93937693), U64_C (0x0daa442f22228822), U64_C (0x07e9c86364648d64), U64_C (0xdb12ff2af1f1e3f1), U64_C (0xbfa2e6cc7373d173), U64_C (0x905a248212124812), U64_C (0x3a5d807a40401d40), U64_C (0x4028104808082008), U64_C (0x56e89b95c3c32bc3), U64_C (0x337bc5dfecec97ec), U64_C (0x9690ab4ddbdb4bdb), U64_C (0x611f5fc0a1a1bea1), U64_C (0x1c8307918d8d0e8d), U64_C (0xf5c97ac83d3df43d), U64_C (0xccf1335b97976697), U64_C (0x0000000000000000), U64_C (0x36d483f9cfcf1bcf), U64_C (0x4587566e2b2bac2b), U64_C (0x97b3ece17676c576), U64_C (0x64b019e682823282), U64_C (0xfea9b128d6d67fd6), U64_C (0xd87736c31b1b6c1b), U64_C (0xc15b7774b5b5eeb5), U64_C (0x112943beafaf86af), U64_C (0x77dfd41d6a6ab56a), U64_C (0xba0da0ea50505d50), U64_C (0x124c8a5745450945), U64_C (0xcb18fb38f3f3ebf3), U64_C (0x9df060ad3030c030), U64_C (0x2b74c3c4efef9bef), U64_C (0xe5c37eda3f3ffc3f), U64_C (0x921caac755554955), U64_C (0x791059dba2a2b2a2), U64_C (0x0365c9e9eaea8fea), U64_C (0x0fecca6a65658965), U64_C (0xb9686903babad2ba), U64_C (0x65935e4a2f2fbc2f), U64_C (0x4ee79d8ec0c027c0), U64_C (0xbe81a160dede5fde), U64_C (0xe06c38fc1c1c701c), U64_C (0xbb2ee746fdfdd3fd), U64_C (0x52649a1f4d4d294d), U64_C (0xe4e0397692927292), U64_C (0x8fbceafa7575c975), U64_C (0x301e0c3606061806), U64_C (0x249809ae8a8a128a), U64_C (0xf940794bb2b2f2b2), U64_C (0x6359d185e6e6bfe6), U64_C (0x70361c7e0e0e380e), U64_C (0xf8633ee71f1f7c1f), U64_C (0x37f7c45562629562), U64_C (0xeea3b53ad4d477d4), U64_C (0x29324d81a8a89aa8), U64_C (0xc4f4315296966296), U64_C (0x9b3aef62f9f9c3f9), U64_C (0x66f697a3c5c533c5), U64_C (0x35b14a1025259425), U64_C (0xf220b2ab59597959), U64_C (0x54ae15d084842a84), U64_C (0xb7a7e4c57272d572), U64_C (0xd5dd72ec3939e439), U64_C (0x5a6198164c4c2d4c), U64_C (0xca3bbc945e5e655e), U64_C (0xe785f09f7878fd78), U64_C (0xddd870e53838e038), U64_C (0x148605988c8c0a8c), U64_C (0xc6b2bf17d1d163d1), U64_C (0x410b57e4a5a5aea5), U64_C (0x434dd9a1e2e2afe2), U64_C (0x2ff8c24e61619961), U64_C (0xf1457b42b3b3f6b3), U64_C (0x15a5423421218421), U64_C (0x94d625089c9c4a9c), U64_C (0xf0663cee1e1e781e), U64_C (0x2252866143431143), U64_C (0x76fc93b1c7c73bc7), U64_C (0xb32be54ffcfcd7fc), U64_C (0x2014082404041004), U64_C (0xb208a2e351515951), U64_C (0xbcc72f2599995e99), U64_C (0x4fc4da226d6da96d), U64_C (0x68391a650d0d340d), U64_C (0x8335e979fafacffa), U64_C (0xb684a369dfdf5bdf), U64_C (0xd79bfca97e7ee57e), U64_C (0x3db4481924249024), U64_C (0xc5d776fe3b3bec3b), U64_C (0x313d4b9aabab96ab), U64_C (0x3ed181f0cece1fce), U64_C (0x8855229911114411), U64_C (0x0c8903838f8f068f), U64_C (0x4a6b9c044e4e254e), U64_C (0xd1517366b7b7e6b7), U64_C (0x0b60cbe0ebeb8beb), U64_C (0xfdcc78c13c3cf03c), U64_C (0x7cbf1ffd81813e81), U64_C (0xd4fe354094946a94), U64_C (0xeb0cf31cf7f7fbf7), U64_C (0xa1676f18b9b9deb9), U64_C (0x985f268b13134c13), U64_C (0x7d9c58512c2cb02c), U64_C (0xd6b8bb05d3d36bd3), U64_C (0x6b5cd38ce7e7bbe7), U64_C (0x57cbdc396e6ea56e), U64_C (0x6ef395aac4c437c4), U64_C (0x180f061b03030c03), U64_C (0x8a13acdc56564556), U64_C (0x1a49885e44440d44), U64_C (0xdf9efea07f7fe17f), U64_C (0x21374f88a9a99ea9), U64_C (0x4d8254672a2aa82a), U64_C (0xb16d6b0abbbbd6bb), U64_C (0x46e29f87c1c123c1), U64_C (0xa202a6f153535153), U64_C (0xae8ba572dcdc57dc), U64_C (0x582716530b0b2c0b), U64_C (0x9cd327019d9d4e9d), U64_C (0x47c1d82b6c6cad6c), U64_C (0x95f562a43131c431), U64_C (0x87b9e8f37474cd74), U64_C (0xe309f115f6f6fff6), U64_C (0x0a438c4c46460546), U64_C (0x092645a5acac8aac), U64_C (0x3c970fb589891e89), U64_C (0xa04428b414145014), U64_C (0x5b42dfbae1e1a3e1), U64_C (0xb04e2ca616165816), U64_C (0xcdd274f73a3ae83a), U64_C (0x6fd0d2066969b969), U64_C (0x482d124109092409), U64_C (0xa7ade0d77070dd70), U64_C (0xd954716fb6b6e2b6), U64_C (0xceb7bd1ed0d067d0), U64_C (0x3b7ec7d6eded93ed), U64_C (0x2edb85e2cccc17cc), U64_C (0x2a57846842421542), U64_C (0xb4c22d2c98985a98), U64_C (0x490e55eda4a4aaa4), U64_C (0x5d8850752828a028), U64_C (0xda31b8865c5c6d5c), U64_C (0x933fed6bf8f8c7f8), U64_C (0x44a411c286862286), }, { U64_C (0x18c07830d8181860), U64_C (0x2305af462623238c), U64_C (0xc67ef991b8c6c63f), U64_C (0xe8136fcdfbe8e887), U64_C (0x874ca113cb878726), U64_C (0xb8a9626d11b8b8da), U64_C (0x0108050209010104), U64_C (0x4f426e9e0d4f4f21), U64_C (0x36adee6c9b3636d8), U64_C (0xa6590451ffa6a6a2), U64_C (0xd2debdb90cd2d26f), U64_C (0xf5fb06f70ef5f5f3), U64_C (0x79ef80f2967979f9), U64_C (0x6f5fcede306f6fa1), U64_C (0x91fcef3f6d91917e), U64_C (0x52aa07a4f8525255), U64_C (0x6027fdc04760609d), U64_C (0xbc89766535bcbcca), U64_C (0x9baccd2b379b9b56), U64_C (0x8e048c018a8e8e02), U64_C (0xa371155bd2a3a3b6), U64_C (0x0c603c186c0c0c30), U64_C (0x7bff8af6847b7bf1), U64_C (0x35b5e16a803535d4), U64_C (0x1de8693af51d1d74), U64_C (0xe05347ddb3e0e0a7), U64_C (0xd7f6acb321d7d77b), U64_C (0xc25eed999cc2c22f), U64_C (0x2e6d965c432e2eb8), U64_C (0x4b627a96294b4b31), U64_C (0xfea321e15dfefedf), U64_C (0x578216aed5575741), U64_C (0x15a8412abd151554), U64_C (0x779fb6eee87777c1), U64_C (0x37a5eb6e923737dc), U64_C (0xe57b56d79ee5e5b3), U64_C (0x9f8cd923139f9f46), U64_C (0xf0d317fd23f0f0e7), U64_C (0x4a6a7f94204a4a35), U64_C (0xda9e95a944dada4f), U64_C (0x58fa25b0a258587d), U64_C (0xc906ca8fcfc9c903), U64_C (0x29558d527c2929a4), U64_C (0x0a5022145a0a0a28), U64_C (0xb1e14f7f50b1b1fe), U64_C (0xa0691a5dc9a0a0ba), U64_C (0x6b7fdad6146b6bb1), U64_C (0x855cab17d985852e), U64_C (0xbd8173673cbdbdce), U64_C (0x5dd234ba8f5d5d69), U64_C (0x1080502090101040), U64_C (0xf4f303f507f4f4f7), U64_C (0xcb16c08bddcbcb0b), U64_C (0x3eedc67cd33e3ef8), U64_C (0x0528110a2d050514), U64_C (0x671fe6ce78676781), U64_C (0xe47353d597e4e4b7), U64_C (0x2725bb4e0227279c), U64_C (0x4132588273414119), U64_C (0x8b2c9d0ba78b8b16), U64_C (0xa7510153f6a7a7a6), U64_C (0x7dcf94fab27d7de9), U64_C (0x95dcfb374995956e), U64_C (0xd88e9fad56d8d847), U64_C (0xfb8b30eb70fbfbcb), U64_C (0xee2371c1cdeeee9f), U64_C (0x7cc791f8bb7c7ced), U64_C (0x6617e3cc71666685), U64_C (0xdda68ea77bdddd53), U64_C (0x17b84b2eaf17175c), U64_C (0x4702468e45474701), U64_C (0x9e84dc211a9e9e42), U64_C (0xca1ec589d4caca0f), U64_C (0x2d75995a582d2db4), U64_C (0xbf9179632ebfbfc6), U64_C (0x07381b0e3f07071c), U64_C (0xad012347acadad8e), U64_C (0x5aea2fb4b05a5a75), U64_C (0x836cb51bef838336), U64_C (0x3385ff66b63333cc), U64_C (0x633ff2c65c636391), U64_C (0x02100a0412020208), U64_C (0xaa39384993aaaa92), U64_C (0x71afa8e2de7171d9), U64_C (0xc80ecf8dc6c8c807), U64_C (0x19c87d32d1191964), U64_C (0x497270923b494939), U64_C (0xd9869aaf5fd9d943), U64_C (0xf2c31df931f2f2ef), U64_C (0xe34b48dba8e3e3ab), U64_C (0x5be22ab6b95b5b71), U64_C (0x8834920dbc88881a), U64_C (0x9aa4c8293e9a9a52), U64_C (0x262dbe4c0b262698), U64_C (0x328dfa64bf3232c8), U64_C (0xb0e94a7d59b0b0fa), U64_C (0xe91b6acff2e9e983), U64_C (0x0f78331e770f0f3c), U64_C (0xd5e6a6b733d5d573), U64_C (0x8074ba1df480803a), U64_C (0xbe997c6127bebec2), U64_C (0xcd26de87ebcdcd13), U64_C (0x34bde468893434d0), U64_C (0x487a75903248483d), U64_C (0xffab24e354ffffdb), U64_C (0x7af78ff48d7a7af5), U64_C (0x90f4ea3d6490907a), U64_C (0x5fc23ebe9d5f5f61), U64_C (0x201da0403d202080), U64_C (0x6867d5d00f6868bd), U64_C (0x1ad07234ca1a1a68), U64_C (0xae192c41b7aeae82), U64_C (0xb4c95e757db4b4ea), U64_C (0x549a19a8ce54544d), U64_C (0x93ece53b7f939376), U64_C (0x220daa442f222288), U64_C (0x6407e9c86364648d), U64_C (0xf1db12ff2af1f1e3), U64_C (0x73bfa2e6cc7373d1), U64_C (0x12905a2482121248), U64_C (0x403a5d807a40401d), U64_C (0x0840281048080820), U64_C (0xc356e89b95c3c32b), U64_C (0xec337bc5dfecec97), U64_C (0xdb9690ab4ddbdb4b), U64_C (0xa1611f5fc0a1a1be), U64_C (0x8d1c8307918d8d0e), U64_C (0x3df5c97ac83d3df4), U64_C (0x97ccf1335b979766), U64_C (0x0000000000000000), U64_C (0xcf36d483f9cfcf1b), U64_C (0x2b4587566e2b2bac), U64_C (0x7697b3ece17676c5), U64_C (0x8264b019e6828232), U64_C (0xd6fea9b128d6d67f), U64_C (0x1bd87736c31b1b6c), U64_C (0xb5c15b7774b5b5ee), U64_C (0xaf112943beafaf86), U64_C (0x6a77dfd41d6a6ab5), U64_C (0x50ba0da0ea50505d), U64_C (0x45124c8a57454509), U64_C (0xf3cb18fb38f3f3eb), U64_C (0x309df060ad3030c0), U64_C (0xef2b74c3c4efef9b), U64_C (0x3fe5c37eda3f3ffc), U64_C (0x55921caac7555549), U64_C (0xa2791059dba2a2b2), U64_C (0xea0365c9e9eaea8f), U64_C (0x650fecca6a656589), U64_C (0xbab9686903babad2), U64_C (0x2f65935e4a2f2fbc), U64_C (0xc04ee79d8ec0c027), U64_C (0xdebe81a160dede5f), U64_C (0x1ce06c38fc1c1c70), U64_C (0xfdbb2ee746fdfdd3), U64_C (0x4d52649a1f4d4d29), U64_C (0x92e4e03976929272), U64_C (0x758fbceafa7575c9), U64_C (0x06301e0c36060618), U64_C (0x8a249809ae8a8a12), U64_C (0xb2f940794bb2b2f2), U64_C (0xe66359d185e6e6bf), U64_C (0x0e70361c7e0e0e38), U64_C (0x1ff8633ee71f1f7c), U64_C (0x6237f7c455626295), U64_C (0xd4eea3b53ad4d477), U64_C (0xa829324d81a8a89a), U64_C (0x96c4f43152969662), U64_C (0xf99b3aef62f9f9c3), U64_C (0xc566f697a3c5c533), U64_C (0x2535b14a10252594), U64_C (0x59f220b2ab595979), U64_C (0x8454ae15d084842a), U64_C (0x72b7a7e4c57272d5), U64_C (0x39d5dd72ec3939e4), U64_C (0x4c5a6198164c4c2d), U64_C (0x5eca3bbc945e5e65), U64_C (0x78e785f09f7878fd), U64_C (0x38ddd870e53838e0), U64_C (0x8c148605988c8c0a), U64_C (0xd1c6b2bf17d1d163), U64_C (0xa5410b57e4a5a5ae), U64_C (0xe2434dd9a1e2e2af), U64_C (0x612ff8c24e616199), U64_C (0xb3f1457b42b3b3f6), U64_C (0x2115a54234212184), U64_C (0x9c94d625089c9c4a), U64_C (0x1ef0663cee1e1e78), U64_C (0x4322528661434311), U64_C (0xc776fc93b1c7c73b), U64_C (0xfcb32be54ffcfcd7), U64_C (0x0420140824040410), U64_C (0x51b208a2e3515159), U64_C (0x99bcc72f2599995e), U64_C (0x6d4fc4da226d6da9), U64_C (0x0d68391a650d0d34), U64_C (0xfa8335e979fafacf), U64_C (0xdfb684a369dfdf5b), U64_C (0x7ed79bfca97e7ee5), U64_C (0x243db44819242490), U64_C (0x3bc5d776fe3b3bec), U64_C (0xab313d4b9aabab96), U64_C (0xce3ed181f0cece1f), U64_C (0x1188552299111144), U64_C (0x8f0c8903838f8f06), U64_C (0x4e4a6b9c044e4e25), U64_C (0xb7d1517366b7b7e6), U64_C (0xeb0b60cbe0ebeb8b), U64_C (0x3cfdcc78c13c3cf0), U64_C (0x817cbf1ffd81813e), U64_C (0x94d4fe354094946a), U64_C (0xf7eb0cf31cf7f7fb), U64_C (0xb9a1676f18b9b9de), U64_C (0x13985f268b13134c), U64_C (0x2c7d9c58512c2cb0), U64_C (0xd3d6b8bb05d3d36b), U64_C (0xe76b5cd38ce7e7bb), U64_C (0x6e57cbdc396e6ea5), U64_C (0xc46ef395aac4c437), U64_C (0x03180f061b03030c), U64_C (0x568a13acdc565645), U64_C (0x441a49885e44440d), U64_C (0x7fdf9efea07f7fe1), U64_C (0xa921374f88a9a99e), U64_C (0x2a4d8254672a2aa8), U64_C (0xbbb16d6b0abbbbd6), U64_C (0xc146e29f87c1c123), U64_C (0x53a202a6f1535351), U64_C (0xdcae8ba572dcdc57), U64_C (0x0b582716530b0b2c), U64_C (0x9d9cd327019d9d4e), U64_C (0x6c47c1d82b6c6cad), U64_C (0x3195f562a43131c4), U64_C (0x7487b9e8f37474cd), U64_C (0xf6e309f115f6f6ff), U64_C (0x460a438c4c464605), U64_C (0xac092645a5acac8a), U64_C (0x893c970fb589891e), U64_C (0x14a04428b4141450), U64_C (0xe15b42dfbae1e1a3), U64_C (0x16b04e2ca6161658), U64_C (0x3acdd274f73a3ae8), U64_C (0x696fd0d2066969b9), U64_C (0x09482d1241090924), U64_C (0x70a7ade0d77070dd), U64_C (0xb6d954716fb6b6e2), U64_C (0xd0ceb7bd1ed0d067), U64_C (0xed3b7ec7d6eded93), U64_C (0xcc2edb85e2cccc17), U64_C (0x422a578468424215), U64_C (0x98b4c22d2c98985a), U64_C (0xa4490e55eda4a4aa), U64_C (0x285d8850752828a0), U64_C (0x5cda31b8865c5c6d), U64_C (0xf8933fed6bf8f8c7), U64_C (0x8644a411c2868622), }, { U64_C (0x6018c07830d81818), U64_C (0x8c2305af46262323), U64_C (0x3fc67ef991b8c6c6), U64_C (0x87e8136fcdfbe8e8), U64_C (0x26874ca113cb8787), U64_C (0xdab8a9626d11b8b8), U64_C (0x0401080502090101), U64_C (0x214f426e9e0d4f4f), U64_C (0xd836adee6c9b3636), U64_C (0xa2a6590451ffa6a6), U64_C (0x6fd2debdb90cd2d2), U64_C (0xf3f5fb06f70ef5f5), U64_C (0xf979ef80f2967979), U64_C (0xa16f5fcede306f6f), U64_C (0x7e91fcef3f6d9191), U64_C (0x5552aa07a4f85252), U64_C (0x9d6027fdc0476060), U64_C (0xcabc89766535bcbc), U64_C (0x569baccd2b379b9b), U64_C (0x028e048c018a8e8e), U64_C (0xb6a371155bd2a3a3), U64_C (0x300c603c186c0c0c), U64_C (0xf17bff8af6847b7b), U64_C (0xd435b5e16a803535), U64_C (0x741de8693af51d1d), U64_C (0xa7e05347ddb3e0e0), U64_C (0x7bd7f6acb321d7d7), U64_C (0x2fc25eed999cc2c2), U64_C (0xb82e6d965c432e2e), U64_C (0x314b627a96294b4b), U64_C (0xdffea321e15dfefe), U64_C (0x41578216aed55757), U64_C (0x5415a8412abd1515), U64_C (0xc1779fb6eee87777), U64_C (0xdc37a5eb6e923737), U64_C (0xb3e57b56d79ee5e5), U64_C (0x469f8cd923139f9f), U64_C (0xe7f0d317fd23f0f0), U64_C (0x354a6a7f94204a4a), U64_C (0x4fda9e95a944dada), U64_C (0x7d58fa25b0a25858), U64_C (0x03c906ca8fcfc9c9), U64_C (0xa429558d527c2929), U64_C (0x280a5022145a0a0a), U64_C (0xfeb1e14f7f50b1b1), U64_C (0xbaa0691a5dc9a0a0), U64_C (0xb16b7fdad6146b6b), U64_C (0x2e855cab17d98585), U64_C (0xcebd8173673cbdbd), U64_C (0x695dd234ba8f5d5d), U64_C (0x4010805020901010), U64_C (0xf7f4f303f507f4f4), U64_C (0x0bcb16c08bddcbcb), U64_C (0xf83eedc67cd33e3e), U64_C (0x140528110a2d0505), U64_C (0x81671fe6ce786767), U64_C (0xb7e47353d597e4e4), U64_C (0x9c2725bb4e022727), U64_C (0x1941325882734141), U64_C (0x168b2c9d0ba78b8b), U64_C (0xa6a7510153f6a7a7), U64_C (0xe97dcf94fab27d7d), U64_C (0x6e95dcfb37499595), U64_C (0x47d88e9fad56d8d8), U64_C (0xcbfb8b30eb70fbfb), U64_C (0x9fee2371c1cdeeee), U64_C (0xed7cc791f8bb7c7c), U64_C (0x856617e3cc716666), U64_C (0x53dda68ea77bdddd), U64_C (0x5c17b84b2eaf1717), U64_C (0x014702468e454747), U64_C (0x429e84dc211a9e9e), U64_C (0x0fca1ec589d4caca), U64_C (0xb42d75995a582d2d), U64_C (0xc6bf9179632ebfbf), U64_C (0x1c07381b0e3f0707), U64_C (0x8ead012347acadad), U64_C (0x755aea2fb4b05a5a), U64_C (0x36836cb51bef8383), U64_C (0xcc3385ff66b63333), U64_C (0x91633ff2c65c6363), U64_C (0x0802100a04120202), U64_C (0x92aa39384993aaaa), U64_C (0xd971afa8e2de7171), U64_C (0x07c80ecf8dc6c8c8), U64_C (0x6419c87d32d11919), U64_C (0x39497270923b4949), U64_C (0x43d9869aaf5fd9d9), U64_C (0xeff2c31df931f2f2), U64_C (0xabe34b48dba8e3e3), U64_C (0x715be22ab6b95b5b), U64_C (0x1a8834920dbc8888), U64_C (0x529aa4c8293e9a9a), U64_C (0x98262dbe4c0b2626), U64_C (0xc8328dfa64bf3232), U64_C (0xfab0e94a7d59b0b0), U64_C (0x83e91b6acff2e9e9), U64_C (0x3c0f78331e770f0f), U64_C (0x73d5e6a6b733d5d5), U64_C (0x3a8074ba1df48080), U64_C (0xc2be997c6127bebe), U64_C (0x13cd26de87ebcdcd), U64_C (0xd034bde468893434), U64_C (0x3d487a7590324848), U64_C (0xdbffab24e354ffff), U64_C (0xf57af78ff48d7a7a), U64_C (0x7a90f4ea3d649090), U64_C (0x615fc23ebe9d5f5f), U64_C (0x80201da0403d2020), U64_C (0xbd6867d5d00f6868), U64_C (0x681ad07234ca1a1a), U64_C (0x82ae192c41b7aeae), U64_C (0xeab4c95e757db4b4), U64_C (0x4d549a19a8ce5454), U64_C (0x7693ece53b7f9393), U64_C (0x88220daa442f2222), U64_C (0x8d6407e9c8636464), U64_C (0xe3f1db12ff2af1f1), U64_C (0xd173bfa2e6cc7373), U64_C (0x4812905a24821212), U64_C (0x1d403a5d807a4040), U64_C (0x2008402810480808), U64_C (0x2bc356e89b95c3c3), U64_C (0x97ec337bc5dfecec), U64_C (0x4bdb9690ab4ddbdb), U64_C (0xbea1611f5fc0a1a1), U64_C (0x0e8d1c8307918d8d), U64_C (0xf43df5c97ac83d3d), U64_C (0x6697ccf1335b9797), U64_C (0x0000000000000000), U64_C (0x1bcf36d483f9cfcf), U64_C (0xac2b4587566e2b2b), U64_C (0xc57697b3ece17676), U64_C (0x328264b019e68282), U64_C (0x7fd6fea9b128d6d6), U64_C (0x6c1bd87736c31b1b), U64_C (0xeeb5c15b7774b5b5), U64_C (0x86af112943beafaf), U64_C (0xb56a77dfd41d6a6a), U64_C (0x5d50ba0da0ea5050), U64_C (0x0945124c8a574545), U64_C (0xebf3cb18fb38f3f3), U64_C (0xc0309df060ad3030), U64_C (0x9bef2b74c3c4efef), U64_C (0xfc3fe5c37eda3f3f), U64_C (0x4955921caac75555), U64_C (0xb2a2791059dba2a2), U64_C (0x8fea0365c9e9eaea), U64_C (0x89650fecca6a6565), U64_C (0xd2bab9686903baba), U64_C (0xbc2f65935e4a2f2f), U64_C (0x27c04ee79d8ec0c0), U64_C (0x5fdebe81a160dede), U64_C (0x701ce06c38fc1c1c), U64_C (0xd3fdbb2ee746fdfd), U64_C (0x294d52649a1f4d4d), U64_C (0x7292e4e039769292), U64_C (0xc9758fbceafa7575), U64_C (0x1806301e0c360606), U64_C (0x128a249809ae8a8a), U64_C (0xf2b2f940794bb2b2), U64_C (0xbfe66359d185e6e6), U64_C (0x380e70361c7e0e0e), U64_C (0x7c1ff8633ee71f1f), U64_C (0x956237f7c4556262), U64_C (0x77d4eea3b53ad4d4), U64_C (0x9aa829324d81a8a8), U64_C (0x6296c4f431529696), U64_C (0xc3f99b3aef62f9f9), U64_C (0x33c566f697a3c5c5), U64_C (0x942535b14a102525), U64_C (0x7959f220b2ab5959), U64_C (0x2a8454ae15d08484), U64_C (0xd572b7a7e4c57272), U64_C (0xe439d5dd72ec3939), U64_C (0x2d4c5a6198164c4c), U64_C (0x655eca3bbc945e5e), U64_C (0xfd78e785f09f7878), U64_C (0xe038ddd870e53838), U64_C (0x0a8c148605988c8c), U64_C (0x63d1c6b2bf17d1d1), U64_C (0xaea5410b57e4a5a5), U64_C (0xafe2434dd9a1e2e2), U64_C (0x99612ff8c24e6161), U64_C (0xf6b3f1457b42b3b3), U64_C (0x842115a542342121), U64_C (0x4a9c94d625089c9c), U64_C (0x781ef0663cee1e1e), U64_C (0x1143225286614343), U64_C (0x3bc776fc93b1c7c7), U64_C (0xd7fcb32be54ffcfc), U64_C (0x1004201408240404), U64_C (0x5951b208a2e35151), U64_C (0x5e99bcc72f259999), U64_C (0xa96d4fc4da226d6d), U64_C (0x340d68391a650d0d), U64_C (0xcffa8335e979fafa), U64_C (0x5bdfb684a369dfdf), U64_C (0xe57ed79bfca97e7e), U64_C (0x90243db448192424), U64_C (0xec3bc5d776fe3b3b), U64_C (0x96ab313d4b9aabab), U64_C (0x1fce3ed181f0cece), U64_C (0x4411885522991111), U64_C (0x068f0c8903838f8f), U64_C (0x254e4a6b9c044e4e), U64_C (0xe6b7d1517366b7b7), U64_C (0x8beb0b60cbe0ebeb), U64_C (0xf03cfdcc78c13c3c), U64_C (0x3e817cbf1ffd8181), U64_C (0x6a94d4fe35409494), U64_C (0xfbf7eb0cf31cf7f7), U64_C (0xdeb9a1676f18b9b9), U64_C (0x4c13985f268b1313), U64_C (0xb02c7d9c58512c2c), U64_C (0x6bd3d6b8bb05d3d3), U64_C (0xbbe76b5cd38ce7e7), U64_C (0xa56e57cbdc396e6e), U64_C (0x37c46ef395aac4c4), U64_C (0x0c03180f061b0303), U64_C (0x45568a13acdc5656), U64_C (0x0d441a49885e4444), U64_C (0xe17fdf9efea07f7f), U64_C (0x9ea921374f88a9a9), U64_C (0xa82a4d8254672a2a), U64_C (0xd6bbb16d6b0abbbb), U64_C (0x23c146e29f87c1c1), U64_C (0x5153a202a6f15353), U64_C (0x57dcae8ba572dcdc), U64_C (0x2c0b582716530b0b), U64_C (0x4e9d9cd327019d9d), U64_C (0xad6c47c1d82b6c6c), U64_C (0xc43195f562a43131), U64_C (0xcd7487b9e8f37474), U64_C (0xfff6e309f115f6f6), U64_C (0x05460a438c4c4646), U64_C (0x8aac092645a5acac), U64_C (0x1e893c970fb58989), U64_C (0x5014a04428b41414), U64_C (0xa3e15b42dfbae1e1), U64_C (0x5816b04e2ca61616), U64_C (0xe83acdd274f73a3a), U64_C (0xb9696fd0d2066969), U64_C (0x2409482d12410909), U64_C (0xdd70a7ade0d77070), U64_C (0xe2b6d954716fb6b6), U64_C (0x67d0ceb7bd1ed0d0), U64_C (0x93ed3b7ec7d6eded), U64_C (0x17cc2edb85e2cccc), U64_C (0x15422a5784684242), U64_C (0x5a98b4c22d2c9898), U64_C (0xaaa4490e55eda4a4), U64_C (0xa0285d8850752828), U64_C (0x6d5cda31b8865c5c), U64_C (0xc7f8933fed6bf8f8), U64_C (0x228644a411c28686), }, { U64_C (0x186018c07830d818), U64_C (0x238c2305af462623), U64_C (0xc63fc67ef991b8c6), U64_C (0xe887e8136fcdfbe8), U64_C (0x8726874ca113cb87), U64_C (0xb8dab8a9626d11b8), U64_C (0x0104010805020901), U64_C (0x4f214f426e9e0d4f), U64_C (0x36d836adee6c9b36), U64_C (0xa6a2a6590451ffa6), U64_C (0xd26fd2debdb90cd2), U64_C (0xf5f3f5fb06f70ef5), U64_C (0x79f979ef80f29679), U64_C (0x6fa16f5fcede306f), U64_C (0x917e91fcef3f6d91), U64_C (0x525552aa07a4f852), U64_C (0x609d6027fdc04760), U64_C (0xbccabc89766535bc), U64_C (0x9b569baccd2b379b), U64_C (0x8e028e048c018a8e), U64_C (0xa3b6a371155bd2a3), U64_C (0x0c300c603c186c0c), U64_C (0x7bf17bff8af6847b), U64_C (0x35d435b5e16a8035), U64_C (0x1d741de8693af51d), U64_C (0xe0a7e05347ddb3e0), U64_C (0xd77bd7f6acb321d7), U64_C (0xc22fc25eed999cc2), U64_C (0x2eb82e6d965c432e), U64_C (0x4b314b627a96294b), U64_C (0xfedffea321e15dfe), U64_C (0x5741578216aed557), U64_C (0x155415a8412abd15), U64_C (0x77c1779fb6eee877), U64_C (0x37dc37a5eb6e9237), U64_C (0xe5b3e57b56d79ee5), U64_C (0x9f469f8cd923139f), U64_C (0xf0e7f0d317fd23f0), U64_C (0x4a354a6a7f94204a), U64_C (0xda4fda9e95a944da), U64_C (0x587d58fa25b0a258), U64_C (0xc903c906ca8fcfc9), U64_C (0x29a429558d527c29), U64_C (0x0a280a5022145a0a), U64_C (0xb1feb1e14f7f50b1), U64_C (0xa0baa0691a5dc9a0), U64_C (0x6bb16b7fdad6146b), U64_C (0x852e855cab17d985), U64_C (0xbdcebd8173673cbd), U64_C (0x5d695dd234ba8f5d), U64_C (0x1040108050209010), U64_C (0xf4f7f4f303f507f4), U64_C (0xcb0bcb16c08bddcb), U64_C (0x3ef83eedc67cd33e), U64_C (0x05140528110a2d05), U64_C (0x6781671fe6ce7867), U64_C (0xe4b7e47353d597e4), U64_C (0x279c2725bb4e0227), U64_C (0x4119413258827341), U64_C (0x8b168b2c9d0ba78b), U64_C (0xa7a6a7510153f6a7), U64_C (0x7de97dcf94fab27d), U64_C (0x956e95dcfb374995), U64_C (0xd847d88e9fad56d8), U64_C (0xfbcbfb8b30eb70fb), U64_C (0xee9fee2371c1cdee), U64_C (0x7ced7cc791f8bb7c), U64_C (0x66856617e3cc7166), U64_C (0xdd53dda68ea77bdd), U64_C (0x175c17b84b2eaf17), U64_C (0x47014702468e4547), U64_C (0x9e429e84dc211a9e), U64_C (0xca0fca1ec589d4ca), U64_C (0x2db42d75995a582d), U64_C (0xbfc6bf9179632ebf), U64_C (0x071c07381b0e3f07), U64_C (0xad8ead012347acad), U64_C (0x5a755aea2fb4b05a), U64_C (0x8336836cb51bef83), U64_C (0x33cc3385ff66b633), U64_C (0x6391633ff2c65c63), U64_C (0x020802100a041202), U64_C (0xaa92aa39384993aa), U64_C (0x71d971afa8e2de71), U64_C (0xc807c80ecf8dc6c8), U64_C (0x196419c87d32d119), U64_C (0x4939497270923b49), U64_C (0xd943d9869aaf5fd9), U64_C (0xf2eff2c31df931f2), U64_C (0xe3abe34b48dba8e3), U64_C (0x5b715be22ab6b95b), U64_C (0x881a8834920dbc88), U64_C (0x9a529aa4c8293e9a), U64_C (0x2698262dbe4c0b26), U64_C (0x32c8328dfa64bf32), U64_C (0xb0fab0e94a7d59b0), U64_C (0xe983e91b6acff2e9), U64_C (0x0f3c0f78331e770f), U64_C (0xd573d5e6a6b733d5), U64_C (0x803a8074ba1df480), U64_C (0xbec2be997c6127be), U64_C (0xcd13cd26de87ebcd), U64_C (0x34d034bde4688934), U64_C (0x483d487a75903248), U64_C (0xffdbffab24e354ff), U64_C (0x7af57af78ff48d7a), U64_C (0x907a90f4ea3d6490), U64_C (0x5f615fc23ebe9d5f), U64_C (0x2080201da0403d20), U64_C (0x68bd6867d5d00f68), U64_C (0x1a681ad07234ca1a), U64_C (0xae82ae192c41b7ae), U64_C (0xb4eab4c95e757db4), U64_C (0x544d549a19a8ce54), U64_C (0x937693ece53b7f93), U64_C (0x2288220daa442f22), U64_C (0x648d6407e9c86364), U64_C (0xf1e3f1db12ff2af1), U64_C (0x73d173bfa2e6cc73), U64_C (0x124812905a248212), U64_C (0x401d403a5d807a40), U64_C (0x0820084028104808), U64_C (0xc32bc356e89b95c3), U64_C (0xec97ec337bc5dfec), U64_C (0xdb4bdb9690ab4ddb), U64_C (0xa1bea1611f5fc0a1), U64_C (0x8d0e8d1c8307918d), U64_C (0x3df43df5c97ac83d), U64_C (0x976697ccf1335b97), U64_C (0x0000000000000000), U64_C (0xcf1bcf36d483f9cf), U64_C (0x2bac2b4587566e2b), U64_C (0x76c57697b3ece176), U64_C (0x82328264b019e682), U64_C (0xd67fd6fea9b128d6), U64_C (0x1b6c1bd87736c31b), U64_C (0xb5eeb5c15b7774b5), U64_C (0xaf86af112943beaf), U64_C (0x6ab56a77dfd41d6a), U64_C (0x505d50ba0da0ea50), U64_C (0x450945124c8a5745), U64_C (0xf3ebf3cb18fb38f3), U64_C (0x30c0309df060ad30), U64_C (0xef9bef2b74c3c4ef), U64_C (0x3ffc3fe5c37eda3f), U64_C (0x554955921caac755), U64_C (0xa2b2a2791059dba2), U64_C (0xea8fea0365c9e9ea), U64_C (0x6589650fecca6a65), U64_C (0xbad2bab9686903ba), U64_C (0x2fbc2f65935e4a2f), U64_C (0xc027c04ee79d8ec0), U64_C (0xde5fdebe81a160de), U64_C (0x1c701ce06c38fc1c), U64_C (0xfdd3fdbb2ee746fd), U64_C (0x4d294d52649a1f4d), U64_C (0x927292e4e0397692), U64_C (0x75c9758fbceafa75), U64_C (0x061806301e0c3606), U64_C (0x8a128a249809ae8a), U64_C (0xb2f2b2f940794bb2), U64_C (0xe6bfe66359d185e6), U64_C (0x0e380e70361c7e0e), U64_C (0x1f7c1ff8633ee71f), U64_C (0x62956237f7c45562), U64_C (0xd477d4eea3b53ad4), U64_C (0xa89aa829324d81a8), U64_C (0x966296c4f4315296), U64_C (0xf9c3f99b3aef62f9), U64_C (0xc533c566f697a3c5), U64_C (0x25942535b14a1025), U64_C (0x597959f220b2ab59), U64_C (0x842a8454ae15d084), U64_C (0x72d572b7a7e4c572), U64_C (0x39e439d5dd72ec39), U64_C (0x4c2d4c5a6198164c), U64_C (0x5e655eca3bbc945e), U64_C (0x78fd78e785f09f78), U64_C (0x38e038ddd870e538), U64_C (0x8c0a8c148605988c), U64_C (0xd163d1c6b2bf17d1), U64_C (0xa5aea5410b57e4a5), U64_C (0xe2afe2434dd9a1e2), U64_C (0x6199612ff8c24e61), U64_C (0xb3f6b3f1457b42b3), U64_C (0x21842115a5423421), U64_C (0x9c4a9c94d625089c), U64_C (0x1e781ef0663cee1e), U64_C (0x4311432252866143), U64_C (0xc73bc776fc93b1c7), U64_C (0xfcd7fcb32be54ffc), U64_C (0x0410042014082404), U64_C (0x515951b208a2e351), U64_C (0x995e99bcc72f2599), U64_C (0x6da96d4fc4da226d), U64_C (0x0d340d68391a650d), U64_C (0xfacffa8335e979fa), U64_C (0xdf5bdfb684a369df), U64_C (0x7ee57ed79bfca97e), U64_C (0x2490243db4481924), U64_C (0x3bec3bc5d776fe3b), U64_C (0xab96ab313d4b9aab), U64_C (0xce1fce3ed181f0ce), U64_C (0x1144118855229911), U64_C (0x8f068f0c8903838f), U64_C (0x4e254e4a6b9c044e), U64_C (0xb7e6b7d1517366b7), U64_C (0xeb8beb0b60cbe0eb), U64_C (0x3cf03cfdcc78c13c), U64_C (0x813e817cbf1ffd81), U64_C (0x946a94d4fe354094), U64_C (0xf7fbf7eb0cf31cf7), U64_C (0xb9deb9a1676f18b9), U64_C (0x134c13985f268b13), U64_C (0x2cb02c7d9c58512c), U64_C (0xd36bd3d6b8bb05d3), U64_C (0xe7bbe76b5cd38ce7), U64_C (0x6ea56e57cbdc396e), U64_C (0xc437c46ef395aac4), U64_C (0x030c03180f061b03), U64_C (0x5645568a13acdc56), U64_C (0x440d441a49885e44), U64_C (0x7fe17fdf9efea07f), U64_C (0xa99ea921374f88a9), U64_C (0x2aa82a4d8254672a), U64_C (0xbbd6bbb16d6b0abb), U64_C (0xc123c146e29f87c1), U64_C (0x535153a202a6f153), U64_C (0xdc57dcae8ba572dc), U64_C (0x0b2c0b582716530b), U64_C (0x9d4e9d9cd327019d), U64_C (0x6cad6c47c1d82b6c), U64_C (0x31c43195f562a431), U64_C (0x74cd7487b9e8f374), U64_C (0xf6fff6e309f115f6), U64_C (0x4605460a438c4c46), U64_C (0xac8aac092645a5ac), U64_C (0x891e893c970fb589), U64_C (0x145014a04428b414), U64_C (0xe1a3e15b42dfbae1), U64_C (0x165816b04e2ca616), U64_C (0x3ae83acdd274f73a), U64_C (0x69b9696fd0d20669), U64_C (0x092409482d124109), U64_C (0x70dd70a7ade0d770), U64_C (0xb6e2b6d954716fb6), U64_C (0xd067d0ceb7bd1ed0), U64_C (0xed93ed3b7ec7d6ed), U64_C (0xcc17cc2edb85e2cc), U64_C (0x4215422a57846842), U64_C (0x985a98b4c22d2c98), U64_C (0xa4aaa4490e55eda4), U64_C (0x28a0285d88507528), U64_C (0x5c6d5cda31b8865c), U64_C (0xf8c7f8933fed6bf8), U64_C (0x86228644a411c286), } } }; #define C tab.C #define C0 C[0] #define C1 C[1] #define C2 C[2] #define C3 C[3] #define C4 C[4] #define C5 C[5] #define C6 C[6] #define C7 C[7] #define rc tab.RC static unsigned int whirlpool_transform (void *ctx, const unsigned char *data, size_t nblks); static void whirlpool_init (void *ctx, unsigned int flags) { whirlpool_context_t *context = ctx; memset (context, 0, sizeof (*context)); context->bctx.blocksize_shift = _gcry_ctz(BLOCK_SIZE); context->bctx.bwrite = whirlpool_transform; if ((flags & GCRY_MD_FLAG_BUGEMU1)) { memset (&context->bugemu, 0, sizeof context->bugemu); context->use_bugemu = 1; } else context->use_bugemu = 0; } #ifdef USE_AMD64_ASM #ifdef HAVE_COMPATIBLE_GCC_WIN64_PLATFORM_AS # define ASM_FUNC_ABI __attribute__((sysv_abi)) # define ASM_EXTRA_STACK (10 * 16) #else # define ASM_FUNC_ABI # define ASM_EXTRA_STACK 0 #endif extern unsigned int _gcry_whirlpool_transform_amd64(u64 *state, const unsigned char *data, size_t nblks, const struct whirlpool_tables_s *tables) ASM_FUNC_ABI; static unsigned int whirlpool_transform (void *ctx, const unsigned char *data, size_t nblks) { whirlpool_context_t *context = ctx; return _gcry_whirlpool_transform_amd64( context->hash_state, data, nblks, &tab) + ASM_EXTRA_STACK; } #else /* USE_AMD64_ASM */ /* * Transform block. */ static unsigned int whirlpool_transform_blk (void *ctx, const unsigned char *data) { whirlpool_context_t *context = ctx; whirlpool_block_t data_block; whirlpool_block_t key; whirlpool_block_t state; whirlpool_block_t block; unsigned int r; unsigned int i; buffer_to_block (data, data_block, i); block_copy (key, context->hash_state, i); block_copy (state, context->hash_state, i); block_xor (state, data_block, i); for (r = 0; r < R; r++) { /* Compute round key K^r. */ block[0] = (C0[(key[0] >> 56) & 0xFF] ^ C1[(key[7] >> 48) & 0xFF] ^ C2[(key[6] >> 40) & 0xFF] ^ C3[(key[5] >> 32) & 0xFF] ^ C4[(key[4] >> 24) & 0xFF] ^ C5[(key[3] >> 16) & 0xFF] ^ C6[(key[2] >> 8) & 0xFF] ^ C7[(key[1] >> 0) & 0xFF] ^ rc[r]); block[1] = (C0[(key[1] >> 56) & 0xFF] ^ C1[(key[0] >> 48) & 0xFF] ^ C2[(key[7] >> 40) & 0xFF] ^ C3[(key[6] >> 32) & 0xFF] ^ C4[(key[5] >> 24) & 0xFF] ^ C5[(key[4] >> 16) & 0xFF] ^ C6[(key[3] >> 8) & 0xFF] ^ C7[(key[2] >> 0) & 0xFF]); block[2] = (C0[(key[2] >> 56) & 0xFF] ^ C1[(key[1] >> 48) & 0xFF] ^ C2[(key[0] >> 40) & 0xFF] ^ C3[(key[7] >> 32) & 0xFF] ^ C4[(key[6] >> 24) & 0xFF] ^ C5[(key[5] >> 16) & 0xFF] ^ C6[(key[4] >> 8) & 0xFF] ^ C7[(key[3] >> 0) & 0xFF]); block[3] = (C0[(key[3] >> 56) & 0xFF] ^ C1[(key[2] >> 48) & 0xFF] ^ C2[(key[1] >> 40) & 0xFF] ^ C3[(key[0] >> 32) & 0xFF] ^ C4[(key[7] >> 24) & 0xFF] ^ C5[(key[6] >> 16) & 0xFF] ^ C6[(key[5] >> 8) & 0xFF] ^ C7[(key[4] >> 0) & 0xFF]); block[4] = (C0[(key[4] >> 56) & 0xFF] ^ C1[(key[3] >> 48) & 0xFF] ^ C2[(key[2] >> 40) & 0xFF] ^ C3[(key[1] >> 32) & 0xFF] ^ C4[(key[0] >> 24) & 0xFF] ^ C5[(key[7] >> 16) & 0xFF] ^ C6[(key[6] >> 8) & 0xFF] ^ C7[(key[5] >> 0) & 0xFF]); block[5] = (C0[(key[5] >> 56) & 0xFF] ^ C1[(key[4] >> 48) & 0xFF] ^ C2[(key[3] >> 40) & 0xFF] ^ C3[(key[2] >> 32) & 0xFF] ^ C4[(key[1] >> 24) & 0xFF] ^ C5[(key[0] >> 16) & 0xFF] ^ C6[(key[7] >> 8) & 0xFF] ^ C7[(key[6] >> 0) & 0xFF]); block[6] = (C0[(key[6] >> 56) & 0xFF] ^ C1[(key[5] >> 48) & 0xFF] ^ C2[(key[4] >> 40) & 0xFF] ^ C3[(key[3] >> 32) & 0xFF] ^ C4[(key[2] >> 24) & 0xFF] ^ C5[(key[1] >> 16) & 0xFF] ^ C6[(key[0] >> 8) & 0xFF] ^ C7[(key[7] >> 0) & 0xFF]); block[7] = (C0[(key[7] >> 56) & 0xFF] ^ C1[(key[6] >> 48) & 0xFF] ^ C2[(key[5] >> 40) & 0xFF] ^ C3[(key[4] >> 32) & 0xFF] ^ C4[(key[3] >> 24) & 0xFF] ^ C5[(key[2] >> 16) & 0xFF] ^ C6[(key[1] >> 8) & 0xFF] ^ C7[(key[0] >> 0) & 0xFF]); block_copy (key, block, i); /* Apply r-th round transformation. */ block[0] = (C0[(state[0] >> 56) & 0xFF] ^ C1[(state[7] >> 48) & 0xFF] ^ C2[(state[6] >> 40) & 0xFF] ^ C3[(state[5] >> 32) & 0xFF] ^ C4[(state[4] >> 24) & 0xFF] ^ C5[(state[3] >> 16) & 0xFF] ^ C6[(state[2] >> 8) & 0xFF] ^ C7[(state[1] >> 0) & 0xFF] ^ key[0]); block[1] = (C0[(state[1] >> 56) & 0xFF] ^ C1[(state[0] >> 48) & 0xFF] ^ C2[(state[7] >> 40) & 0xFF] ^ C3[(state[6] >> 32) & 0xFF] ^ C4[(state[5] >> 24) & 0xFF] ^ C5[(state[4] >> 16) & 0xFF] ^ C6[(state[3] >> 8) & 0xFF] ^ C7[(state[2] >> 0) & 0xFF] ^ key[1]); block[2] = (C0[(state[2] >> 56) & 0xFF] ^ C1[(state[1] >> 48) & 0xFF] ^ C2[(state[0] >> 40) & 0xFF] ^ C3[(state[7] >> 32) & 0xFF] ^ C4[(state[6] >> 24) & 0xFF] ^ C5[(state[5] >> 16) & 0xFF] ^ C6[(state[4] >> 8) & 0xFF] ^ C7[(state[3] >> 0) & 0xFF] ^ key[2]); block[3] = (C0[(state[3] >> 56) & 0xFF] ^ C1[(state[2] >> 48) & 0xFF] ^ C2[(state[1] >> 40) & 0xFF] ^ C3[(state[0] >> 32) & 0xFF] ^ C4[(state[7] >> 24) & 0xFF] ^ C5[(state[6] >> 16) & 0xFF] ^ C6[(state[5] >> 8) & 0xFF] ^ C7[(state[4] >> 0) & 0xFF] ^ key[3]); block[4] = (C0[(state[4] >> 56) & 0xFF] ^ C1[(state[3] >> 48) & 0xFF] ^ C2[(state[2] >> 40) & 0xFF] ^ C3[(state[1] >> 32) & 0xFF] ^ C4[(state[0] >> 24) & 0xFF] ^ C5[(state[7] >> 16) & 0xFF] ^ C6[(state[6] >> 8) & 0xFF] ^ C7[(state[5] >> 0) & 0xFF] ^ key[4]); block[5] = (C0[(state[5] >> 56) & 0xFF] ^ C1[(state[4] >> 48) & 0xFF] ^ C2[(state[3] >> 40) & 0xFF] ^ C3[(state[2] >> 32) & 0xFF] ^ C4[(state[1] >> 24) & 0xFF] ^ C5[(state[0] >> 16) & 0xFF] ^ C6[(state[7] >> 8) & 0xFF] ^ C7[(state[6] >> 0) & 0xFF] ^ key[5]); block[6] = (C0[(state[6] >> 56) & 0xFF] ^ C1[(state[5] >> 48) & 0xFF] ^ C2[(state[4] >> 40) & 0xFF] ^ C3[(state[3] >> 32) & 0xFF] ^ C4[(state[2] >> 24) & 0xFF] ^ C5[(state[1] >> 16) & 0xFF] ^ C6[(state[0] >> 8) & 0xFF] ^ C7[(state[7] >> 0) & 0xFF] ^ key[6]); block[7] = (C0[(state[7] >> 56) & 0xFF] ^ C1[(state[6] >> 48) & 0xFF] ^ C2[(state[5] >> 40) & 0xFF] ^ C3[(state[4] >> 32) & 0xFF] ^ C4[(state[3] >> 24) & 0xFF] ^ C5[(state[2] >> 16) & 0xFF] ^ C6[(state[1] >> 8) & 0xFF] ^ C7[(state[0] >> 0) & 0xFF] ^ key[7]); block_copy (state, block, i); } /* Compression. */ block_xor (context->hash_state, data_block, i); block_xor (context->hash_state, state, i); return /*burn_stack*/ 4 * sizeof(whirlpool_block_t) + 2 * sizeof(int) + 4 * sizeof(void*); } static unsigned int whirlpool_transform ( void *c, const unsigned char *data, size_t nblks ) { unsigned int burn; do { burn = whirlpool_transform_blk (c, data); data += BLOCK_SIZE; } while (--nblks); return burn; } #endif /* !USE_AMD64_ASM */ /* Bug compatibility Whirlpool version. */ static void whirlpool_add_bugemu (whirlpool_context_t *context, const void *buffer_arg, size_t buffer_n) { const unsigned char *buffer = buffer_arg; u64 buffer_size; unsigned int carry; unsigned int i; buffer_size = buffer_n; if (context->bugemu.count == BLOCK_SIZE) { /* Flush the buffer. */ whirlpool_transform (context, context->bctx.buf, 1); context->bugemu.count = 0; } if (! buffer) return; /* Nothing to add. */ if (context->bugemu.count) { while (buffer_n && (context->bugemu.count < BLOCK_SIZE)) { context->bctx.buf[context->bugemu.count++] = *buffer++; buffer_n--; } whirlpool_add_bugemu (context, NULL, 0); if (!buffer_n) return; /* Done. This is the bug we emulate. */ } while (buffer_n >= BLOCK_SIZE) { whirlpool_transform (context, buffer, 1); context->bugemu.count = 0; buffer_n -= BLOCK_SIZE; buffer += BLOCK_SIZE; } while (buffer_n && (context->bugemu.count < BLOCK_SIZE)) { context->bctx.buf[context->bugemu.count++] = *buffer++; buffer_n--; } /* Update bit counter. */ carry = 0; buffer_size <<= 3; for (i = 1; i <= 32; i++) { if (! (buffer_size || carry)) break; carry += context->bugemu.length[32 - i] + (buffer_size & 0xFF); context->bugemu.length[32 - i] = carry; buffer_size >>= 8; carry >>= 8; } gcry_assert (! (buffer_size || carry)); } /* Bug compatibility Whirlpool version. */ static void whirlpool_final_bugemu (void *ctx) { whirlpool_context_t *context = ctx; unsigned int i; /* Flush. */ whirlpool_add_bugemu (context, NULL, 0); /* Pad. */ context->bctx.buf[context->bugemu.count++] = 0x80; if (context->bugemu.count > 32) { /* An extra block is necessary. */ while (context->bugemu.count < 64) context->bctx.buf[context->bugemu.count++] = 0; whirlpool_add_bugemu (context, NULL, 0); } while (context->bugemu.count < 32) context->bctx.buf[context->bugemu.count++] = 0; /* Add length of message. */ memcpy (context->bctx.buf + context->bugemu.count, context->bugemu.length, 32); context->bugemu.count += 32; whirlpool_add_bugemu (context, NULL, 0); block_to_buffer (context->bctx.buf, context->hash_state, i); } static void whirlpool_write (void *ctx, const void *buffer, size_t buffer_n) { whirlpool_context_t *context = ctx; if (context->use_bugemu) { whirlpool_add_bugemu (context, buffer, buffer_n); } else { u64 old_nblocks = context->bctx.nblocks; _gcry_md_block_write (context, buffer, buffer_n); gcry_assert (old_nblocks <= context->bctx.nblocks); } } static void whirlpool_final (void *ctx) { whirlpool_context_t *context = ctx; unsigned int i; u64 t, th, lsb, msb; unsigned char *length; if (context->use_bugemu) { whirlpool_final_bugemu (ctx); return; } t = context->bctx.nblocks; /* if (sizeof t == sizeof context->bctx.nblocks) */ th = context->bctx.nblocks_high; /* else */ /* th = context->bctx.nblocks >> 64; In case we ever use u128 */ /* multiply by 64 to make a byte count */ lsb = t << 6; msb = (th << 6) | (t >> 58); /* add the count */ t = lsb; if ((lsb += context->bctx.count) < t) msb++; /* multiply by 8 to make a bit count */ t = lsb; lsb <<= 3; msb <<= 3; msb |= t >> 61; /* Flush. */ whirlpool_write (context, NULL, 0); /* Pad. */ context->bctx.buf[context->bctx.count++] = 0x80; if (context->bctx.count > 32) { /* An extra block is necessary. */ if (context->bctx.count < 64) memset (&context->bctx.buf[context->bctx.count], 0, 64 - context->bctx.count); context->bctx.count = 64; whirlpool_write (context, NULL, 0); } if (context->bctx.count < 32) memset (&context->bctx.buf[context->bctx.count], 0, 32 - context->bctx.count); context->bctx.count = 32; /* Add length of message. */ length = context->bctx.buf + context->bctx.count; buf_put_be64(&length[0 * 8], 0); buf_put_be64(&length[1 * 8], 0); buf_put_be64(&length[2 * 8], msb); buf_put_be64(&length[3 * 8], lsb); context->bctx.count += 32; whirlpool_write (context, NULL, 0); block_to_buffer (context->bctx.buf, context->hash_state, i); } static byte * whirlpool_read (void *ctx) { whirlpool_context_t *context = ctx; return context->bctx.buf; } gcry_md_spec_t _gcry_digest_spec_whirlpool = { GCRY_MD_WHIRLPOOL, {0, 0}, "WHIRLPOOL", NULL, 0, NULL, 64, whirlpool_init, whirlpool_write, whirlpool_final, whirlpool_read, NULL, NULL, sizeof (whirlpool_context_t) , GRUB_UTIL_MODNAME("gcry_whirlpool") .blocksize = 64 }; GRUB_MOD_INIT(gcry_whirlpool) { grub_md_register (&_gcry_digest_spec_whirlpool); } GRUB_MOD_FINI(gcry_whirlpool) { grub_md_unregister (&_gcry_digest_spec_whirlpool); } grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/cipher/ecc-common.h0000644000175000017500000001442215036452441023037 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ /* ecc-common.h - Declarations of common ECC code * Copyright (C) 2013 g10 Code GmbH * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . */ #ifndef GCRY_ECC_COMMON_H #define GCRY_ECC_COMMON_H /* Definition of a curve. */ typedef struct { enum gcry_mpi_ec_models model;/* The model descrinbing this curve. */ enum ecc_dialects dialect; /* The dialect used with the curve. */ gcry_mpi_t p; /* Prime specifying the field GF(p). */ gcry_mpi_t a; /* First coefficient of the Weierstrass equation. */ gcry_mpi_t b; /* Second coefficient of the Weierstrass equation. or d as used by Twisted Edwards curves. */ mpi_point_struct G; /* Base point (generator). */ gcry_mpi_t n; /* Order of G. */ unsigned int h; /* Cofactor. */ const char *name; /* Name of the curve or NULL. */ } elliptic_curve_t; /* Set the value from S into D. */ static inline void point_set (mpi_point_t d, mpi_point_t s) { mpi_set (d->x, s->x); mpi_set (d->y, s->y); mpi_set (d->z, s->z); } #define point_init(a) _gcry_mpi_point_init ((a)) #define point_free(a) _gcry_mpi_point_free_parts ((a)) /*-- ecc-curves.c --*/ gpg_err_code_t _gcry_ecc_fill_in_curve (unsigned int nbits, const char *name, elliptic_curve_t *curve, unsigned int *r_nbits); gpg_err_code_t _gcry_ecc_update_curve_param (const char *name, enum gcry_mpi_ec_models *model, enum ecc_dialects *dialect, gcry_mpi_t *p, gcry_mpi_t *a, gcry_mpi_t *b, gcry_mpi_t *g, gcry_mpi_t *n); const char *_gcry_ecc_get_curve (gcry_sexp_t keyparms, int iterator, unsigned int *r_nbits); gcry_sexp_t _gcry_ecc_get_param_sexp (const char *name); /*-- ecc-misc.c --*/ void _gcry_ecc_curve_free (elliptic_curve_t *E); elliptic_curve_t _gcry_ecc_curve_copy (elliptic_curve_t E); const char *_gcry_ecc_model2str (enum gcry_mpi_ec_models model); const char *_gcry_ecc_dialect2str (enum ecc_dialects dialect); unsigned char *_gcry_ecc_ec2os_buf (gcry_mpi_t x, gcry_mpi_t y, gcry_mpi_t p, unsigned int *r_length); gcry_mpi_t _gcry_ecc_ec2os (gcry_mpi_t x, gcry_mpi_t y, gcry_mpi_t p); mpi_point_t _gcry_ecc_compute_public (mpi_point_t Q, mpi_ec_t ec); gpg_err_code_t _gcry_ecc_mont_encodepoint (gcry_mpi_t x, unsigned int nbits, int with_prefix, unsigned char **r_buffer, unsigned int *r_buflen); /*-- ecc.c --*/ /*-- ecc-ecdsa.c --*/ gpg_err_code_t _gcry_ecc_ecdsa_sign (gcry_mpi_t input, gcry_mpi_t k, mpi_ec_t ec, gcry_mpi_t r, gcry_mpi_t s, int flags, int hashalgo); gpg_err_code_t _gcry_ecc_ecdsa_verify (gcry_mpi_t input, mpi_ec_t ec, gcry_mpi_t r, gcry_mpi_t s, int flags, int hashalgo); /*-- ecc-eddsa.c --*/ gpg_err_code_t _gcry_ecc_eddsa_recover_x (gcry_mpi_t x, gcry_mpi_t y, int sign, mpi_ec_t ec); gpg_err_code_t _gcry_ecc_eddsa_encodepoint (mpi_point_t point, mpi_ec_t ctx, gcry_mpi_t x, gcry_mpi_t y, int with_prefix, unsigned char **r_buffer, unsigned int *r_buflen); gpg_err_code_t _gcry_ecc_eddsa_ensure_compact (gcry_mpi_t value, unsigned int nbits); gpg_err_code_t _gcry_ecc_eddsa_compute_h_d (unsigned char **r_digest, mpi_ec_t ec); gpg_err_code_t _gcry_ecc_eddsa_genkey (mpi_ec_t ec, int flags); gpg_err_code_t _gcry_ecc_eddsa_sign (gcry_mpi_t input, mpi_ec_t ec, gcry_mpi_t r_r, gcry_mpi_t s, struct pk_encoding_ctx *ctx); gpg_err_code_t _gcry_ecc_eddsa_verify (gcry_mpi_t input, mpi_ec_t ec, gcry_mpi_t r, gcry_mpi_t s, struct pk_encoding_ctx *ctx); void reverse_buffer (unsigned char *buffer, unsigned int length); /*-- ecc-gost.c --*/ gpg_err_code_t _gcry_ecc_gost_sign (gcry_mpi_t input, mpi_ec_t ec, gcry_mpi_t r, gcry_mpi_t s); gpg_err_code_t _gcry_ecc_gost_verify (gcry_mpi_t input, mpi_ec_t ec, gcry_mpi_t r, gcry_mpi_t s); /*-- ecc-sm2.c --*/ gpg_err_code_t _gcry_ecc_sm2_encrypt (gcry_sexp_t *r_ciph, gcry_mpi_t input, mpi_ec_t ec); gpg_err_code_t _gcry_ecc_sm2_decrypt (gcry_sexp_t *r_plain, gcry_sexp_t data_list, mpi_ec_t ec); gpg_err_code_t _gcry_ecc_sm2_sign (gcry_mpi_t input, mpi_ec_t ec, gcry_mpi_t r, gcry_mpi_t s, int flags, int hashalgo); gpg_err_code_t _gcry_ecc_sm2_verify (gcry_mpi_t input, mpi_ec_t ec, gcry_mpi_t r, gcry_mpi_t s); #endif /*GCRY_ECC_COMMON_H*/ grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/cipher/rsa-common.c0000644000175000017500000010347515036452441023074 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ /* rsa-common.c - Supporting functions for RSA * Copyright (C) 2011 Free Software Foundation, Inc. * Copyright (C) 2013 g10 Code GmbH * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . */ #include "g10lib.h" #include "mpi.h" #include "cipher.h" #include "pubkey-internal.h" #include "const-time.h" /* Turn VALUE into an octet string and store it in an allocated buffer at R_FRAME or - if R_RAME is NULL - copy it into the caller provided buffer SPACE; either SPACE or R_FRAME may be used. If SPACE if not NULL, the caller must provide a buffer of at least NBYTES. If the resulting octet string is shorter than NBYTES pad it to the left with zeroes. If VALUE does not fit into NBYTES return an error code. */ static gpg_err_code_t octet_string_from_mpi (unsigned char **r_frame, void *space, gcry_mpi_t value, size_t nbytes) { return _gcry_mpi_to_octet_string (r_frame, space, value, nbytes); } /* Encode {VALUE,VALUELEN} for an NBITS keys using the pkcs#1 block type 2 padding. On success the result is stored as a new MPI at R_RESULT. On error the value at R_RESULT is undefined. If {RANDOM_OVERRIDE, RANDOM_OVERRIDE_LEN} is given it is used as the seed instead of using a random string for it. This feature is only useful for regression tests. Note that this value may not contain zero bytes. We encode the value in this way: 0 2 RND(n bytes) 0 VALUE 0 is a marker we unfortunately can't encode because we return an MPI which strips all leading zeroes. 2 is the block type. RND are non-zero random bytes. (Note that OpenPGP includes the cipher algorithm and a checksum in VALUE; the caller needs to prepare the value accordingly.) */ gpg_err_code_t _gcry_rsa_pkcs1_encode_for_enc (gcry_mpi_t *r_result, unsigned int nbits, const unsigned char *value, size_t valuelen, const unsigned char *random_override, size_t random_override_len) { gcry_err_code_t rc = 0; unsigned char *frame = NULL; size_t nframe = (nbits+7) / 8; int i; size_t n; unsigned char *p; if (valuelen + 7 > nframe || !nframe) { /* Can't encode a VALUELEN value in a NFRAME bytes frame. */ return GPG_ERR_TOO_SHORT; /* The key is too short. */ } if ( !(frame = xtrymalloc_secure (nframe))) return gpg_err_code_from_syserror (); n = 0; frame[n++] = 0; frame[n++] = 2; /* block type */ i = nframe - 3 - valuelen; gcry_assert (i > 0); if (random_override) { int j; if (random_override_len != i) { xfree (frame); return GPG_ERR_INV_ARG; } /* Check that random does not include a zero byte. */ for (j=0; j < random_override_len; j++) if (!random_override[j]) { xfree (frame); return GPG_ERR_INV_ARG; } memcpy (frame + n, random_override, random_override_len); n += random_override_len; } else { p = _gcry_random_bytes_secure (i, GCRY_STRONG_RANDOM); /* Replace zero bytes by new values. */ for (;;) { int j, k; unsigned char *pp; /* Count the zero bytes. */ for (j=k=0; j < i; j++) { if (!p[j]) k++; } if (!k) break; /* Okay: no (more) zero bytes. */ k += k/128 + 3; /* Better get some more. */ pp = _gcry_random_bytes_secure (k, GCRY_STRONG_RANDOM); for (j=0; j < i && k; ) { if (!p[j]) p[j] = pp[--k]; if (p[j]) j++; } xfree (pp); } memcpy (frame+n, p, i); n += i; xfree (p); } frame[n++] = 0; memcpy (frame+n, value, valuelen); n += valuelen; gcry_assert (n == nframe); rc = _gcry_mpi_scan (r_result, GCRYMPI_FMT_USG, frame, n, &nframe); if (!rc &&DBG_CIPHER) log_mpidump ("PKCS#1 block type 2 encoded data", *r_result); xfree (frame); return rc; } /* * <--len--> * DST-------v v-------------SRC * [.................] * <---- buflen ---> * * Copy the memory area SRC with LEN into another memory area DST. * Conditions met: * the address SRC > DST * DST + BUFLEN == SRC + LEN. * * Memory access doesn't depends on LEN, but always done independently, * sliding memory area by 1, 2, 4 ... until done. */ static void memmov_independently (void *dst, const void *src, size_t len, size_t buflen) { size_t offset = (size_t)((char *)src - (char *)dst); size_t shift; (void)len; /* No dependency. */ for (shift = 1; shift < buflen; shift <<= 1) { ct_memmov_cond (dst, (char *)dst + shift, buflen - shift, (offset&1)); offset >>= 1; } } /* Decode a plaintext in VALUE assuming pkcs#1 block type 2 padding. NBITS is the size of the secret key. On success the result is stored as a newly allocated buffer at R_RESULT and its valid length at R_RESULTLEN. On error NULL is stored at R_RESULT. */ gpg_err_code_t _gcry_rsa_pkcs1_decode_for_enc (unsigned char **r_result, size_t *r_resultlen, unsigned int nbits, gcry_mpi_t value) { gcry_error_t err; unsigned char *frame = NULL; size_t nframe = (nbits+7) / 8; size_t n, n0; unsigned int failed = 0; unsigned int not_found = 1; *r_result = NULL; if ( !(frame = xtrymalloc_secure (nframe))) return gpg_err_code_from_syserror (); err = _gcry_mpi_print (GCRYMPI_FMT_USG, frame, nframe, &n, value); if (err) { xfree (frame); return gcry_err_code (err); } nframe = n; /* Set NFRAME to the actual length. */ /* FRAME = 0x00 || 0x02 || PS || 0x00 || M pkcs#1 requires that the first byte is zero. Our MPIs usually strip leading zero bytes; thus we are not able to detect them. However due to the way gcry_mpi_print is implemented we may see leading zero bytes nevertheless. We handle this by making the first zero byte optional. */ if (nframe < 4) { xfree (frame); return GPG_ERR_ENCODING_PROBLEM; /* Too short. */ } n = 0; if (!frame[0]) n++; failed |= ct_not_equal_byte (frame[n++], 0x02); /* Find the terminating zero byte. */ n0 = n; for (; n < nframe; n++) { not_found &= ct_not_equal_byte (frame[n], 0x00); n0 += not_found; } failed |= not_found; n0 += ct_is_zero (not_found); /* Skip the zero byte. */ /* To avoid an extra allocation we reuse the frame buffer. The only caller of this function will anyway free the result soon. */ memmov_independently (frame, frame + n0, nframe - n0, nframe); *r_result = frame; *r_resultlen = nframe - n0; if (DBG_CIPHER) log_printhex ("value extracted from PKCS#1 block type 2 encoded data", *r_result, *r_resultlen); return (0U - failed) & GPG_ERR_ENCODING_PROBLEM; } /* Encode {VALUE,VALUELEN} for an NBITS keys and hash algorithm ALGO using the pkcs#1 block type 1 padding. On success the result is stored as a new MPI at R_RESULT. On error the value at R_RESULT is undefined. We encode the value in this way: 0 1 PAD(n bytes) 0 ASN(asnlen bytes) VALUE(valuelen bytes) 0 is a marker we unfortunately can't encode because we return an MPI which strips all leading zeroes. 1 is the block type. PAD consists of 0xff bytes. 0 marks the end of the padding. ASN is the DER encoding of the hash algorithm; along with the VALUE it yields a valid DER encoding. (Note that PGP prior to version 2.3 encoded the message digest as: 0 1 MD(16 bytes) 0 PAD(n bytes) 1 The MD is always 16 bytes here because it's always MD5. GnuPG does not not support pre-v2.3 signatures, but I'm including this comment so the information is easily found if needed.) */ gpg_err_code_t _gcry_rsa_pkcs1_encode_for_sig (gcry_mpi_t *r_result, unsigned int nbits, const unsigned char *value, size_t valuelen, int algo) { gcry_err_code_t rc = 0; byte asn[100]; byte *frame = NULL; size_t nframe = (nbits+7) / 8; int i; size_t n; size_t asnlen, dlen; asnlen = DIM(asn); dlen = _gcry_md_get_algo_dlen (algo); if (_gcry_md_algo_info (algo, GCRYCTL_GET_ASNOID, asn, &asnlen)) { /* We don't have yet all of the above algorithms. */ return GPG_ERR_NOT_IMPLEMENTED; } if ( valuelen != dlen ) { /* Hash value does not match the length of digest for the given algorithm. */ return GPG_ERR_CONFLICT; } if ( !dlen || dlen + asnlen + 4 > nframe) { /* Can't encode an DLEN byte digest MD into an NFRAME byte frame. */ return GPG_ERR_TOO_SHORT; } if ( !(frame = xtrymalloc (nframe)) ) return gpg_err_code_from_syserror (); /* Assemble the pkcs#1 block type 1. */ n = 0; frame[n++] = 0; frame[n++] = 1; /* block type */ i = nframe - valuelen - asnlen - 3 ; gcry_assert (i > 1); memset (frame+n, 0xff, i ); n += i; frame[n++] = 0; memcpy (frame+n, asn, asnlen); n += asnlen; memcpy (frame+n, value, valuelen ); n += valuelen; gcry_assert (n == nframe); /* Convert it into an MPI. */ rc = _gcry_mpi_scan (r_result, GCRYMPI_FMT_USG, frame, n, &nframe); if (!rc && DBG_CIPHER) log_mpidump ("PKCS#1 block type 1 encoded data", *r_result); xfree (frame); return rc; } /* Encode {VALUE,VALUELEN} for an NBITS keys using the pkcs#1 block type 1 padding. On success the result is stored as a new MPI at R_RESULT. On error the value at R_RESULT is undefined. We encode the value in this way: 0 1 PAD(n bytes) 0 VALUE(valuelen bytes) 0 is a marker we unfortunately can't encode because we return an MPI which strips all leading zeroes. 1 is the block type. PAD consists of 0xff bytes. 0 marks the end of the padding. (Note that PGP prior to version 2.3 encoded the message digest as: 0 1 MD(16 bytes) 0 PAD(n bytes) 1 The MD is always 16 bytes here because it's always MD5. GnuPG does not not support pre-v2.3 signatures, but I'm including this comment so the information is easily found if needed.) */ gpg_err_code_t _gcry_rsa_pkcs1_encode_raw_for_sig (gcry_mpi_t *r_result, unsigned int nbits, const unsigned char *value, size_t valuelen) { gcry_err_code_t rc = 0; gcry_error_t err; byte *frame = NULL; size_t nframe = (nbits+7) / 8; int i; size_t n; if ( !valuelen || valuelen + 4 > nframe) { /* Can't encode an DLEN byte digest MD into an NFRAME byte frame. */ return GPG_ERR_TOO_SHORT; } if ( !(frame = xtrymalloc (nframe)) ) return gpg_err_code_from_syserror (); /* Assemble the pkcs#1 block type 1. */ n = 0; frame[n++] = 0; frame[n++] = 1; /* block type */ i = nframe - valuelen - 3 ; gcry_assert (i > 1); memset (frame+n, 0xff, i ); n += i; frame[n++] = 0; memcpy (frame+n, value, valuelen ); n += valuelen; gcry_assert (n == nframe); /* Convert it into an MPI. */ err = _gcry_mpi_scan (r_result, GCRYMPI_FMT_USG, frame, n, &nframe); if (err) rc = gcry_err_code (err); else if (DBG_CIPHER) log_mpidump ("PKCS#1 block type 1 encoded data", *r_result); xfree (frame); return rc; } /* Mask generation function for OAEP. See RFC-3447 B.2.1. */ static gcry_err_code_t mgf1 (unsigned char *output, size_t outlen, unsigned char *seed, size_t seedlen, int algo) { size_t dlen, nbytes, n; int idx; gcry_md_hd_t hd; gcry_err_code_t err; err = _gcry_md_open (&hd, algo, 0); if (err) return err; dlen = _gcry_md_get_algo_dlen (algo); /* We skip step 1 which would be assert(OUTLEN <= 2^32). The loop in step 3 is merged with step 4 by concatenating no more octets than what would fit into OUTPUT. The ceiling for the counter IDX is implemented indirectly. */ nbytes = 0; /* Step 2. */ idx = 0; while ( nbytes < outlen ) { unsigned char c[4], *digest; if (idx) _gcry_md_reset (hd); c[0] = (idx >> 24) & 0xFF; c[1] = (idx >> 16) & 0xFF; c[2] = (idx >> 8) & 0xFF; c[3] = idx & 0xFF; idx++; _gcry_md_write (hd, seed, seedlen); _gcry_md_write (hd, c, 4); digest = _gcry_md_read (hd, 0); n = (outlen - nbytes < dlen)? (outlen - nbytes) : dlen; memcpy (output+nbytes, digest, n); nbytes += n; } _gcry_md_close (hd); return GPG_ERR_NO_ERROR; } /* RFC-3447 (pkcs#1 v2.1) OAEP encoding. NBITS is the length of the key measured in bits. ALGO is the hash function; it must be a valid and usable algorithm. {VALUE,VALUELEN} is the message to encrypt. {LABEL,LABELLEN} is the optional label to be associated with the message, if LABEL is NULL the default is to use the empty string as label. On success the encoded ciphertext is returned at R_RESULT. If {RANDOM_OVERRIDE, RANDOM_OVERRIDE_LEN} is given it is used as the seed instead of using a random string for it. This feature is only useful for regression tests. Here is figure 1 from the RFC depicting the process: +----------+---------+-------+ DB = | lHash | PS | M | +----------+---------+-------+ | +----------+ V | seed |--> MGF ---> xor +----------+ | | | +--+ V | |00| xor <----- MGF <-----| +--+ | | | | | V V V +--+----------+----------------------------+ EM = |00|maskedSeed| maskedDB | +--+----------+----------------------------+ */ gpg_err_code_t _gcry_rsa_oaep_encode (gcry_mpi_t *r_result, unsigned int nbits, int algo, const unsigned char *value, size_t valuelen, const unsigned char *label, size_t labellen, const void *random_override, size_t random_override_len) { gcry_err_code_t rc = 0; unsigned char *frame = NULL; size_t nframe = (nbits+7) / 8; unsigned char *p; size_t hlen; size_t n; *r_result = NULL; /* Set defaults for LABEL. */ if (!label || !labellen) { label = (const unsigned char*)""; labellen = 0; } hlen = _gcry_md_get_algo_dlen (algo); /* We skip step 1a which would be to check that LABELLEN is not greater than 2^61-1. See rfc-3447 7.1.1. */ /* Step 1b. Note that the obsolete rfc-2437 uses the check: valuelen > nframe - 2 * hlen - 1 . */ if (valuelen > nframe - 2 * hlen - 2 || !nframe) { /* Can't encode a VALUELEN value in a NFRAME bytes frame. */ return GPG_ERR_TOO_SHORT; /* The key is too short. */ } /* Allocate the frame. */ frame = xtrycalloc_secure (1, nframe); if (!frame) return gpg_err_code_from_syserror (); /* Step 2a: Compute the hash of the label. We store it in the frame where later the maskedDB will commence. */ _gcry_md_hash_buffer (algo, frame + 1 + hlen, label, labellen); /* Step 2b: Set octet string to zero. */ /* This has already been done while allocating FRAME. */ /* Step 2c: Create DB by concatenating lHash, PS, 0x01 and M. */ n = nframe - valuelen - 1; frame[n] = 0x01; memcpy (frame + n + 1, value, valuelen); /* Step 3d: Generate seed. We store it where the maskedSeed will go later. */ if (random_override) { if (random_override_len != hlen) { xfree (frame); return GPG_ERR_INV_ARG; } memcpy (frame + 1, random_override, hlen); } else _gcry_randomize (frame + 1, hlen, GCRY_STRONG_RANDOM); /* Step 2e and 2f: Create maskedDB. */ { unsigned char *dmask; dmask = xtrymalloc_secure (nframe - hlen - 1); if (!dmask) { rc = gpg_err_code_from_syserror (); xfree (frame); return rc; } rc = mgf1 (dmask, nframe - hlen - 1, frame+1, hlen, algo); if (rc) { xfree (dmask); xfree (frame); return rc; } for (n = 1 + hlen, p = dmask; n < nframe; n++) frame[n] ^= *p++; xfree (dmask); } /* Step 2g and 2h: Create maskedSeed. */ { unsigned char *smask; smask = xtrymalloc_secure (hlen); if (!smask) { rc = gpg_err_code_from_syserror (); xfree (frame); return rc; } rc = mgf1 (smask, hlen, frame + 1 + hlen, nframe - hlen - 1, algo); if (rc) { xfree (smask); xfree (frame); return rc; } for (n = 1, p = smask; n < 1 + hlen; n++) frame[n] ^= *p++; xfree (smask); } /* Step 2i: Concatenate 0x00, maskedSeed and maskedDB. */ /* This has already been done by using in-place operations. */ /* Convert the stuff into an MPI as expected by the caller. */ rc = _gcry_mpi_scan (r_result, GCRYMPI_FMT_USG, frame, nframe, NULL); if (!rc && DBG_CIPHER) log_mpidump ("OAEP encoded data", *r_result); xfree (frame); return rc; } /* RFC-3447 (pkcs#1 v2.1) OAEP decoding. NBITS is the length of the key measured in bits. ALGO is the hash function; it must be a valid and usable algorithm. VALUE is the raw decrypted message {LABEL,LABELLEN} is the optional label to be associated with the message, if LABEL is NULL the default is to use the empty string as label. On success the plaintext is returned as a newly allocated buffer at R_RESULT; its valid length is stored at R_RESULTLEN. On error NULL is stored at R_RESULT. */ gpg_err_code_t _gcry_rsa_oaep_decode (unsigned char **r_result, size_t *r_resultlen, unsigned int nbits, int algo, gcry_mpi_t value, const unsigned char *label, size_t labellen) { gcry_err_code_t rc; unsigned char *frame = NULL; /* Encoded messages (EM). */ unsigned char *masked_seed; /* Points into FRAME. */ unsigned char *masked_db; /* Points into FRAME. */ unsigned char *seed = NULL; /* Allocated space for the seed and DB. */ unsigned char *db; /* Points into SEED. */ unsigned char *lhash = NULL; /* Hash of the label. */ size_t nframe; /* Length of the ciphertext (EM). */ size_t hlen; /* Length of the hash digest. */ size_t db_len; /* Length of DB and masked_db. */ size_t nkey = (nbits+7)/8; /* Length of the key in bytes. */ int failed = 0; /* Error indicator. */ size_t n, n1; unsigned int not_found = 1; *r_result = NULL; /* This code is implemented as described by rfc-3447 7.1.2. */ /* Set defaults for LABEL. */ if (!label || !labellen) { label = (const unsigned char*)""; labellen = 0; } /* Get the length of the digest. */ hlen = _gcry_md_get_algo_dlen (algo); /* Hash the label right away. */ lhash = xtrymalloc (hlen); if (!lhash) return gpg_err_code_from_syserror (); _gcry_md_hash_buffer (algo, lhash, label, labellen); /* Turn the MPI into an octet string. If the octet string is shorter than the key we pad it to the left with zeroes. This may happen due to the leading zero in OAEP frames and due to the following random octets (seed^mask) which may have leading zero bytes. This all is needed to cope with our leading zeroes suppressing MPI implementation. The code implictly implements Step 1b (bail out if NFRAME != N). */ rc = octet_string_from_mpi (&frame, NULL, value, nkey); if (rc) { xfree (lhash); return GPG_ERR_ENCODING_PROBLEM; } nframe = nkey; /* Step 1c: Check that the key is long enough. */ if ( nframe < 2 * hlen + 2 ) { xfree (frame); xfree (lhash); return GPG_ERR_ENCODING_PROBLEM; } /* Step 2 has already been done by the caller and the gcry_mpi_aprint above. */ /* Allocate space for SEED and DB. */ seed = xtrymalloc_secure (nframe - 1); if (!seed) { rc = gpg_err_code_from_syserror (); xfree (frame); xfree (lhash); return rc; } db = seed + hlen; /* To avoid chosen ciphertext attacks from now on we make sure to run all code even in the error case; this avoids possible timing attacks as described by Manger. */ /* Step 3a: Hash the label. */ /* This has already been done. */ /* Step 3b: Separate the encoded message. */ masked_seed = frame + 1; masked_db = frame + 1 + hlen; db_len = nframe - 1 - hlen; /* Step 3c and 3d: seed = maskedSeed ^ mgf(maskedDB, hlen). */ failed |= (mgf1 (seed, hlen, masked_db, db_len, algo) != 0); for (n = 0; n < hlen; n++) seed[n] ^= masked_seed[n]; /* Step 3e and 3f: db = maskedDB ^ mgf(seed, db_len). */ failed |= (mgf1 (db, db_len, seed, hlen, algo) != 0); for (n = 0; n < db_len; n++) db[n] ^= masked_db[n]; /* Step 3g: Check lhash, an possible empty padding string terminated by 0x01 and the first byte of EM being 0. */ failed |= ct_not_memequal (lhash, db, hlen); for (n = n1 = hlen; n < db_len; n++) { not_found &= ct_not_equal_byte (db[n], 0x01); n1 += not_found; } failed |= not_found; failed |= ct_not_equal_byte (frame[0], 0x00); xfree (lhash); xfree (frame); /* Step 4: Output M. */ /* To avoid an extra allocation we reuse the seed buffer. The only caller of this function will anyway free the result soon. */ n1 += !not_found; memmov_independently (seed, db + n1, db_len - n1, nframe - 1); *r_result = seed; *r_resultlen = db_len - n1; seed = NULL; if (DBG_CIPHER) log_printhex ("value extracted from OAEP encoded data", *r_result, *r_resultlen); return (0U - failed) & GPG_ERR_ENCODING_PROBLEM; } /* RFC-3447 (pkcs#1 v2.1) PSS encoding. Encode {VALUE,VALUELEN} for an NBITS key. ALGO is a valid hash algorithm and SALTLEN is the length of salt to be used. When HASHED_ALREADY is set, VALUE is already the mHash from the picture below. Otherwise, VALUE is M. On success the result is stored as a new MPI at R_RESULT. On error the value at R_RESULT is undefined. If RANDOM_OVERRIDE is given it is used as the salt instead of using a random string for the salt. This feature is only useful for regression tests. Here is figure 2 from the RFC (errata 595 applied) depicting the process: +-----------+ | M | +-----------+ | V Hash | V +--------+----------+----------+ M' = |Padding1| mHash | salt | +--------+----------+----------+ | +--------+----------+ V DB = |Padding2| salt | Hash +--------+----------+ | | | V | +----+ xor <--- MGF <---| |0xbc| | | +----+ | | | V V V +-------------------+----------+----+ EM = | maskedDB | H |0xbc| +-------------------+----------+----+ */ gpg_err_code_t _gcry_rsa_pss_encode (gcry_mpi_t *r_result, unsigned int nbits, int algo, int saltlen, int hashed_already, const unsigned char *value, size_t valuelen, const void *random_override) { gcry_err_code_t rc = 0; gcry_md_hd_t hd = NULL; unsigned char *digest; size_t hlen; /* Length of the hash digest. */ unsigned char *em = NULL; /* Encoded message. */ size_t emlen = (nbits+7)/8; /* Length in bytes of EM. */ unsigned char *h; /* Points into EM. */ unsigned char *buf = NULL; /* Help buffer. */ size_t buflen; /* Length of BUF. */ unsigned char *mhash; /* Points into BUF. */ unsigned char *salt; /* Points into BUF. */ unsigned char *dbmask; /* Points into BUF. */ unsigned char *p; size_t n; /* This code is implemented as described by rfc-3447 9.1.1. */ rc = _gcry_md_open (&hd, algo, 0); if (rc) return rc; /* Get the length of the digest. */ if (algo == GCRY_MD_SHAKE128) hlen = 32; else if (algo == GCRY_MD_SHAKE256) hlen = 64; else hlen = _gcry_md_get_algo_dlen (algo); gcry_assert (hlen); /* We expect a valid ALGO here. */ /* The FIPS 186-4 Section 5.5 allows only 0 <= sLen <= hLen */ if (fips_mode () && saltlen > hlen) { rc = GPG_ERR_INV_ARG; goto leave; } /* Allocate a help buffer and setup some pointers. */ buflen = 8 + hlen + saltlen + (emlen - hlen - 1); buf = xtrymalloc (buflen); if (!buf) { rc = gpg_err_code_from_syserror (); goto leave; } mhash = buf + 8; salt = mhash + hlen; dbmask= salt + saltlen; /* Step 2: mHash = Hash(M) (or copy input to mHash, if already hashed). */ if (!hashed_already) { _gcry_md_write (hd, value, valuelen); digest = _gcry_md_read (hd, 0); memcpy (mhash, digest, hlen); _gcry_md_reset (hd); } else { if (valuelen != hlen) { rc = GPG_ERR_INV_LENGTH; goto leave; } memcpy (mhash, value, hlen); } /* Step 3: Check length constraints. */ if (emlen < hlen + saltlen + 2) { rc = GPG_ERR_TOO_SHORT; goto leave; } /* Allocate space for EM. */ em = xtrymalloc (emlen); if (!em) { rc = gpg_err_code_from_syserror (); goto leave; } h = em + emlen - 1 - hlen; /* Step 4: Create a salt. */ if (saltlen) { if (random_override) memcpy (salt, random_override, saltlen); else _gcry_randomize (salt, saltlen, GCRY_STRONG_RANDOM); } /* Step 5 and 6: M' = Hash(Padding1 || mHash || salt). */ memset (buf, 0, 8); /* Padding. */ _gcry_md_write (hd, buf, 8 + hlen + saltlen); digest = _gcry_md_read (hd, 0); memcpy (h, digest, hlen); /* Step 7 and 8: DB = PS || 0x01 || salt. */ /* Note that we use EM to store DB and later Xor in-place. */ p = em + emlen - 1 - hlen - saltlen - 1; memset (em, 0, p - em); *p++ = 0x01; memcpy (p, salt, saltlen); /* Step 9: dbmask = MGF(H, emlen - hlen - 1). */ #if 0 if (algo == GCRY_MD_SHAKE128 || algo == GCRY_MD_SHAKE256) { gcry_buffer_t iov; iov.size = 0; iov.data = (void *)h; iov.off = 0; iov.len = hlen; _gcry_md_hash_buffers_extract (algo, 0, dbmask, emlen - hlen - 1, &iov, 1); } else #endif mgf1 (dbmask, emlen - hlen - 1, h, hlen, algo); /* Step 10: maskedDB = DB ^ dbMask */ for (n = 0, p = dbmask; n < emlen - hlen - 1; n++, p++) em[n] ^= *p; /* Step 11: Set the leftmost bits to zero. */ em[0] &= 0xFF >> (8 * emlen - nbits); /* Step 12: EM = maskedDB || H || 0xbc. */ em[emlen-1] = 0xbc; /* Convert EM into an MPI. */ rc = _gcry_mpi_scan (r_result, GCRYMPI_FMT_USG, em, emlen, NULL); if (!rc && DBG_CIPHER) log_mpidump ("PSS encoded data", *r_result); leave: _gcry_md_close (hd); if (em) { wipememory (em, emlen); xfree (em); } if (buf) { wipememory (buf, buflen); xfree (buf); } return rc; } /* Verify a signature assuming PSS padding. When HASHED_ALREADY is set, VALUE is the hash of the message (mHash); its length must match the digest length of ALGO. Otherwise, its M (before mHash). VALUE is an opaque MPI. ENCODED is the output of the RSA public key function (EM). NBITS is the size of the public key. ALGO is the hash algorithm and SALTLEN is the length of the used salt. The function returns 0 on success or on error code. */ gpg_err_code_t _gcry_rsa_pss_verify (gcry_mpi_t value, int hashed_already, gcry_mpi_t encoded, unsigned int nbits, int algo, size_t saltlen) { gcry_err_code_t rc = 0; gcry_md_hd_t hd = NULL; unsigned char *digest; size_t hlen; /* Length of the hash digest. */ unsigned char *em = NULL; /* Encoded message. */ size_t emlen = (nbits+7)/8; /* Length in bytes of EM. */ unsigned char *salt; /* Points into EM. */ unsigned char *h; /* Points into EM. */ unsigned char *buf = NULL; /* Help buffer. */ size_t buflen; /* Length of BUF. */ unsigned char *dbmask; /* Points into BUF. */ unsigned char *mhash; /* Points into BUF. */ unsigned char *p; size_t n; unsigned int input_nbits; /* This code is implemented as described by rfc-3447 9.1.2. */ rc = _gcry_md_open (&hd, algo, 0); if (rc) return rc; /* Get the length of the digest. */ if (algo == GCRY_MD_SHAKE128) hlen = 32; else if (algo == GCRY_MD_SHAKE256) hlen = 64; else hlen = _gcry_md_get_algo_dlen (algo); gcry_assert (hlen); /* We expect a valid ALGO here. */ /* The FIPS 186-4 Section 5.5 allows only 0 <= sLen <= hLen */ if (fips_mode () && saltlen > hlen) { rc = GPG_ERR_INV_ARG; goto leave; } /* Allocate a help buffer and setup some pointers. This buffer is used for two purposes: +------------------------------+-------+ 1. | dbmask | mHash | +------------------------------+-------+ emlen - hlen - 1 hlen +----------+-------+---------+-+-------+ 2. | padding1 | mHash | salt | | mHash | +----------+-------+---------+-+-------+ 8 hlen saltlen hlen */ buflen = 8 + hlen + saltlen; if (buflen < emlen - hlen - 1) buflen = emlen - hlen - 1; buflen += hlen; buf = xtrymalloc (buflen); if (!buf) { rc = gpg_err_code_from_syserror (); goto leave; } dbmask = buf; mhash = buf + buflen - hlen; /* Step 2: mHash = Hash(M) (or copy input to mHash, if already hashed). */ p = mpi_get_opaque (value, &input_nbits); if (!p) { rc = GPG_ERR_INV_ARG; goto leave; } if (!hashed_already) { _gcry_md_write (hd, p, (input_nbits+7)/8); digest = _gcry_md_read (hd, 0); memcpy (mhash, digest, hlen); _gcry_md_reset (hd); } else memcpy (mhash, p, hlen); /* Convert the signature into an octet string. */ rc = octet_string_from_mpi (&em, NULL, encoded, emlen); if (rc) goto leave; /* Step 3: Check length of EM. Because we internally use MPI functions we can't do this properly; EMLEN is always the length of the key because octet_string_from_mpi needs to left pad the result with zero to cope with the fact that our MPIs suppress all leading zeroes. Thus what we test here are merely the digest and salt lengths to the key. */ if (emlen < hlen + saltlen + 2) { rc = GPG_ERR_TOO_SHORT; /* For the hash and saltlen. */ goto leave; } /* Step 4: Check last octet. */ if (em[emlen - 1] != 0xbc) { rc = GPG_ERR_BAD_SIGNATURE; goto leave; } /* Step 5: Split EM. */ h = em + emlen - 1 - hlen; /* Step 6: Check the leftmost bits. */ if ((em[0] & ~(0xFF >> (8 * emlen - nbits)))) { rc = GPG_ERR_BAD_SIGNATURE; goto leave; } /* Step 7: dbmask = MGF(H, emlen - hlen - 1). */ #if 0 if (algo == GCRY_MD_SHAKE128 || algo == GCRY_MD_SHAKE256) { gcry_buffer_t iov; iov.size = 0; iov.data = (void *)h; iov.off = 0; iov.len = hlen; _gcry_md_hash_buffers_extract (algo, 0, dbmask, emlen - hlen - 1, &iov, 1); } else #endif mgf1 (dbmask, emlen - hlen - 1, h, hlen, algo); /* Step 8: maskedDB = DB ^ dbMask. */ for (n = 0, p = dbmask; n < emlen - hlen - 1; n++, p++) em[n] ^= *p; /* Step 9: Set leftmost bits in DB to zero. */ em[0] &= 0xFF >> (8 * emlen - nbits); /* Step 10: Check the padding of DB. */ for (n = 0; n < emlen - hlen - saltlen - 2 && !em[n]; n++) ; if (n != emlen - hlen - saltlen - 2 || em[n++] != 1) { rc = GPG_ERR_BAD_SIGNATURE; goto leave; } /* Step 11: Extract salt from DB. */ salt = em + n; /* Step 12: M' = (0x)00 00 00 00 00 00 00 00 || mHash || salt */ memset (buf, 0, 8); memcpy (buf+8, mhash, hlen); memcpy (buf+8+hlen, salt, saltlen); /* Step 13: H' = Hash(M'). */ _gcry_md_write (hd, buf, 8 + hlen + saltlen); digest = _gcry_md_read (hd, 0); memcpy (buf, digest, hlen); /* Step 14: Check H == H'. */ rc = memcmp (h, buf, hlen) ? GPG_ERR_BAD_SIGNATURE : GPG_ERR_NO_ERROR; leave: _gcry_md_close (hd); if (em) { wipememory (em, emlen); xfree (em); } if (buf) { wipememory (buf, buflen); xfree (buf); } return rc; } grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/cipher/tiger.c0000644000175000017500000014016515036452441022130 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ #include GRUB_MOD_LICENSE ("GPLv3+"); /* tiger.c - The TIGER hash function * Copyright (C) 1998, 2001, 2002, 2003, 2010 Free Software Foundation, Inc. * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . * SPDX-License-Identifier: LGPL-2.1-or-later */ /* See http://www.cs.technion.ac.il/~biham/Reports/Tiger/ */ #include "g10lib.h" #include "cipher.h" #include "hash-common.h" #include "bithelp.h" #include "bufhelp.h" typedef struct { gcry_md_block_ctx_t bctx; u64 a, b, c; int variant; /* 0 = old code, 1 = fixed code, 2 - TIGER2. */ } TIGER_CONTEXT; /********************************* * Okay, okay, this is not the fastest code - improvements are welcome. * */ /* Some test vectors: * "" 24F0130C63AC9332 16166E76B1BB925F F373DE2D49584E7A * "abc" F258C1E88414AB2A 527AB541FFC5B8BF 935F7B951C132951 * "Tiger" 9F00F599072300DD 276ABB38C8EB6DEC 37790C116F9D2BDF * "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-" * 87FB2A9083851CF7 470D2CF810E6DF9E B586445034A5A386 * "ABCDEFGHIJKLMNOPQRSTUVWXYZ=abcdefghijklmnopqrstuvwxyz+0123456789" * 467DB80863EBCE48 8DF1CD1261655DE9 57896565975F9197 * "Tiger - A Fast New Hash Function, by Ross Anderson and Eli Biham" * 0C410A042968868A 1671DA5A3FD29A72 5EC1E457D3CDB303 * "Tiger - A Fast New Hash Function, by Ross Anderson and Eli Biham, proc" * "eedings of Fast Software Encryption 3, Cambridge." * EBF591D5AFA655CE 7F22894FF87F54AC 89C811B6B0DA3193 * "Tiger - A Fast New Hash Function, by Ross Anderson and Eli Biham, proc" * "eedings of Fast Software Encryption 3, Cambridge, 1996." * 3D9AEB03D1BD1A63 57B2774DFD6D5B24 DD68151D503974FC * "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-ABCDEF" * "GHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-" * 00B83EB4E53440C5 76AC6AAEE0A74858 25FD15E70A59FFE4 */ static u64 sbox1[256] = { U64_C(0x02aab17cf7e90c5e) /* 0 */, U64_C(0xac424b03e243a8ec) /* 1 */, U64_C(0x72cd5be30dd5fcd3) /* 2 */, U64_C(0x6d019b93f6f97f3a) /* 3 */, U64_C(0xcd9978ffd21f9193) /* 4 */, U64_C(0x7573a1c9708029e2) /* 5 */, U64_C(0xb164326b922a83c3) /* 6 */, U64_C(0x46883eee04915870) /* 7 */, U64_C(0xeaace3057103ece6) /* 8 */, U64_C(0xc54169b808a3535c) /* 9 */, U64_C(0x4ce754918ddec47c) /* 10 */, U64_C(0x0aa2f4dfdc0df40c) /* 11 */, U64_C(0x10b76f18a74dbefa) /* 12 */, U64_C(0xc6ccb6235ad1ab6a) /* 13 */, U64_C(0x13726121572fe2ff) /* 14 */, U64_C(0x1a488c6f199d921e) /* 15 */, U64_C(0x4bc9f9f4da0007ca) /* 16 */, U64_C(0x26f5e6f6e85241c7) /* 17 */, U64_C(0x859079dbea5947b6) /* 18 */, U64_C(0x4f1885c5c99e8c92) /* 19 */, U64_C(0xd78e761ea96f864b) /* 20 */, U64_C(0x8e36428c52b5c17d) /* 21 */, U64_C(0x69cf6827373063c1) /* 22 */, U64_C(0xb607c93d9bb4c56e) /* 23 */, U64_C(0x7d820e760e76b5ea) /* 24 */, U64_C(0x645c9cc6f07fdc42) /* 25 */, U64_C(0xbf38a078243342e0) /* 26 */, U64_C(0x5f6b343c9d2e7d04) /* 27 */, U64_C(0xf2c28aeb600b0ec6) /* 28 */, U64_C(0x6c0ed85f7254bcac) /* 29 */, U64_C(0x71592281a4db4fe5) /* 30 */, U64_C(0x1967fa69ce0fed9f) /* 31 */, U64_C(0xfd5293f8b96545db) /* 32 */, U64_C(0xc879e9d7f2a7600b) /* 33 */, U64_C(0x860248920193194e) /* 34 */, U64_C(0xa4f9533b2d9cc0b3) /* 35 */, U64_C(0x9053836c15957613) /* 36 */, U64_C(0xdb6dcf8afc357bf1) /* 37 */, U64_C(0x18beea7a7a370f57) /* 38 */, U64_C(0x037117ca50b99066) /* 39 */, U64_C(0x6ab30a9774424a35) /* 40 */, U64_C(0xf4e92f02e325249b) /* 41 */, U64_C(0x7739db07061ccae1) /* 42 */, U64_C(0xd8f3b49ceca42a05) /* 43 */, U64_C(0xbd56be3f51382f73) /* 44 */, U64_C(0x45faed5843b0bb28) /* 45 */, U64_C(0x1c813d5c11bf1f83) /* 46 */, U64_C(0x8af0e4b6d75fa169) /* 47 */, U64_C(0x33ee18a487ad9999) /* 48 */, U64_C(0x3c26e8eab1c94410) /* 49 */, U64_C(0xb510102bc0a822f9) /* 50 */, U64_C(0x141eef310ce6123b) /* 51 */, U64_C(0xfc65b90059ddb154) /* 52 */, U64_C(0xe0158640c5e0e607) /* 53 */, U64_C(0x884e079826c3a3cf) /* 54 */, U64_C(0x930d0d9523c535fd) /* 55 */, U64_C(0x35638d754e9a2b00) /* 56 */, U64_C(0x4085fccf40469dd5) /* 57 */, U64_C(0xc4b17ad28be23a4c) /* 58 */, U64_C(0xcab2f0fc6a3e6a2e) /* 59 */, U64_C(0x2860971a6b943fcd) /* 60 */, U64_C(0x3dde6ee212e30446) /* 61 */, U64_C(0x6222f32ae01765ae) /* 62 */, U64_C(0x5d550bb5478308fe) /* 63 */, U64_C(0xa9efa98da0eda22a) /* 64 */, U64_C(0xc351a71686c40da7) /* 65 */, U64_C(0x1105586d9c867c84) /* 66 */, U64_C(0xdcffee85fda22853) /* 67 */, U64_C(0xccfbd0262c5eef76) /* 68 */, U64_C(0xbaf294cb8990d201) /* 69 */, U64_C(0xe69464f52afad975) /* 70 */, U64_C(0x94b013afdf133e14) /* 71 */, U64_C(0x06a7d1a32823c958) /* 72 */, U64_C(0x6f95fe5130f61119) /* 73 */, U64_C(0xd92ab34e462c06c0) /* 74 */, U64_C(0xed7bde33887c71d2) /* 75 */, U64_C(0x79746d6e6518393e) /* 76 */, U64_C(0x5ba419385d713329) /* 77 */, U64_C(0x7c1ba6b948a97564) /* 78 */, U64_C(0x31987c197bfdac67) /* 79 */, U64_C(0xde6c23c44b053d02) /* 80 */, U64_C(0x581c49fed002d64d) /* 81 */, U64_C(0xdd474d6338261571) /* 82 */, U64_C(0xaa4546c3e473d062) /* 83 */, U64_C(0x928fce349455f860) /* 84 */, U64_C(0x48161bbacaab94d9) /* 85 */, U64_C(0x63912430770e6f68) /* 86 */, U64_C(0x6ec8a5e602c6641c) /* 87 */, U64_C(0x87282515337ddd2b) /* 88 */, U64_C(0x2cda6b42034b701b) /* 89 */, U64_C(0xb03d37c181cb096d) /* 90 */, U64_C(0xe108438266c71c6f) /* 91 */, U64_C(0x2b3180c7eb51b255) /* 92 */, U64_C(0xdf92b82f96c08bbc) /* 93 */, U64_C(0x5c68c8c0a632f3ba) /* 94 */, U64_C(0x5504cc861c3d0556) /* 95 */, U64_C(0xabbfa4e55fb26b8f) /* 96 */, U64_C(0x41848b0ab3baceb4) /* 97 */, U64_C(0xb334a273aa445d32) /* 98 */, U64_C(0xbca696f0a85ad881) /* 99 */, U64_C(0x24f6ec65b528d56c) /* 100 */, U64_C(0x0ce1512e90f4524a) /* 101 */, U64_C(0x4e9dd79d5506d35a) /* 102 */, U64_C(0x258905fac6ce9779) /* 103 */, U64_C(0x2019295b3e109b33) /* 104 */, U64_C(0xf8a9478b73a054cc) /* 105 */, U64_C(0x2924f2f934417eb0) /* 106 */, U64_C(0x3993357d536d1bc4) /* 107 */, U64_C(0x38a81ac21db6ff8b) /* 108 */, U64_C(0x47c4fbf17d6016bf) /* 109 */, U64_C(0x1e0faadd7667e3f5) /* 110 */, U64_C(0x7abcff62938beb96) /* 111 */, U64_C(0xa78dad948fc179c9) /* 112 */, U64_C(0x8f1f98b72911e50d) /* 113 */, U64_C(0x61e48eae27121a91) /* 114 */, U64_C(0x4d62f7ad31859808) /* 115 */, U64_C(0xeceba345ef5ceaeb) /* 116 */, U64_C(0xf5ceb25ebc9684ce) /* 117 */, U64_C(0xf633e20cb7f76221) /* 118 */, U64_C(0xa32cdf06ab8293e4) /* 119 */, U64_C(0x985a202ca5ee2ca4) /* 120 */, U64_C(0xcf0b8447cc8a8fb1) /* 121 */, U64_C(0x9f765244979859a3) /* 122 */, U64_C(0xa8d516b1a1240017) /* 123 */, U64_C(0x0bd7ba3ebb5dc726) /* 124 */, U64_C(0xe54bca55b86adb39) /* 125 */, U64_C(0x1d7a3afd6c478063) /* 126 */, U64_C(0x519ec608e7669edd) /* 127 */, U64_C(0x0e5715a2d149aa23) /* 128 */, U64_C(0x177d4571848ff194) /* 129 */, U64_C(0xeeb55f3241014c22) /* 130 */, U64_C(0x0f5e5ca13a6e2ec2) /* 131 */, U64_C(0x8029927b75f5c361) /* 132 */, U64_C(0xad139fabc3d6e436) /* 133 */, U64_C(0x0d5df1a94ccf402f) /* 134 */, U64_C(0x3e8bd948bea5dfc8) /* 135 */, U64_C(0xa5a0d357bd3ff77e) /* 136 */, U64_C(0xa2d12e251f74f645) /* 137 */, U64_C(0x66fd9e525e81a082) /* 138 */, U64_C(0x2e0c90ce7f687a49) /* 139 */, U64_C(0xc2e8bcbeba973bc5) /* 140 */, U64_C(0x000001bce509745f) /* 141 */, U64_C(0x423777bbe6dab3d6) /* 142 */, U64_C(0xd1661c7eaef06eb5) /* 143 */, U64_C(0xa1781f354daacfd8) /* 144 */, U64_C(0x2d11284a2b16affc) /* 145 */, U64_C(0xf1fc4f67fa891d1f) /* 146 */, U64_C(0x73ecc25dcb920ada) /* 147 */, U64_C(0xae610c22c2a12651) /* 148 */, U64_C(0x96e0a810d356b78a) /* 149 */, U64_C(0x5a9a381f2fe7870f) /* 150 */, U64_C(0xd5ad62ede94e5530) /* 151 */, U64_C(0xd225e5e8368d1427) /* 152 */, U64_C(0x65977b70c7af4631) /* 153 */, U64_C(0x99f889b2de39d74f) /* 154 */, U64_C(0x233f30bf54e1d143) /* 155 */, U64_C(0x9a9675d3d9a63c97) /* 156 */, U64_C(0x5470554ff334f9a8) /* 157 */, U64_C(0x166acb744a4f5688) /* 158 */, U64_C(0x70c74caab2e4aead) /* 159 */, U64_C(0xf0d091646f294d12) /* 160 */, U64_C(0x57b82a89684031d1) /* 161 */, U64_C(0xefd95a5a61be0b6b) /* 162 */, U64_C(0x2fbd12e969f2f29a) /* 163 */, U64_C(0x9bd37013feff9fe8) /* 164 */, U64_C(0x3f9b0404d6085a06) /* 165 */, U64_C(0x4940c1f3166cfe15) /* 166 */, U64_C(0x09542c4dcdf3defb) /* 167 */, U64_C(0xb4c5218385cd5ce3) /* 168 */, U64_C(0xc935b7dc4462a641) /* 169 */, U64_C(0x3417f8a68ed3b63f) /* 170 */, U64_C(0xb80959295b215b40) /* 171 */, U64_C(0xf99cdaef3b8c8572) /* 172 */, U64_C(0x018c0614f8fcb95d) /* 173 */, U64_C(0x1b14accd1a3acdf3) /* 174 */, U64_C(0x84d471f200bb732d) /* 175 */, U64_C(0xc1a3110e95e8da16) /* 176 */, U64_C(0x430a7220bf1a82b8) /* 177 */, U64_C(0xb77e090d39df210e) /* 178 */, U64_C(0x5ef4bd9f3cd05e9d) /* 179 */, U64_C(0x9d4ff6da7e57a444) /* 180 */, U64_C(0xda1d60e183d4a5f8) /* 181 */, U64_C(0xb287c38417998e47) /* 182 */, U64_C(0xfe3edc121bb31886) /* 183 */, U64_C(0xc7fe3ccc980ccbef) /* 184 */, U64_C(0xe46fb590189bfd03) /* 185 */, U64_C(0x3732fd469a4c57dc) /* 186 */, U64_C(0x7ef700a07cf1ad65) /* 187 */, U64_C(0x59c64468a31d8859) /* 188 */, U64_C(0x762fb0b4d45b61f6) /* 189 */, U64_C(0x155baed099047718) /* 190 */, U64_C(0x68755e4c3d50baa6) /* 191 */, U64_C(0xe9214e7f22d8b4df) /* 192 */, U64_C(0x2addbf532eac95f4) /* 193 */, U64_C(0x32ae3909b4bd0109) /* 194 */, U64_C(0x834df537b08e3450) /* 195 */, U64_C(0xfa209da84220728d) /* 196 */, U64_C(0x9e691d9b9efe23f7) /* 197 */, U64_C(0x0446d288c4ae8d7f) /* 198 */, U64_C(0x7b4cc524e169785b) /* 199 */, U64_C(0x21d87f0135ca1385) /* 200 */, U64_C(0xcebb400f137b8aa5) /* 201 */, U64_C(0x272e2b66580796be) /* 202 */, U64_C(0x3612264125c2b0de) /* 203 */, U64_C(0x057702bdad1efbb2) /* 204 */, U64_C(0xd4babb8eacf84be9) /* 205 */, U64_C(0x91583139641bc67b) /* 206 */, U64_C(0x8bdc2de08036e024) /* 207 */, U64_C(0x603c8156f49f68ed) /* 208 */, U64_C(0xf7d236f7dbef5111) /* 209 */, U64_C(0x9727c4598ad21e80) /* 210 */, U64_C(0xa08a0896670a5fd7) /* 211 */, U64_C(0xcb4a8f4309eba9cb) /* 212 */, U64_C(0x81af564b0f7036a1) /* 213 */, U64_C(0xc0b99aa778199abd) /* 214 */, U64_C(0x959f1ec83fc8e952) /* 215 */, U64_C(0x8c505077794a81b9) /* 216 */, U64_C(0x3acaaf8f056338f0) /* 217 */, U64_C(0x07b43f50627a6778) /* 218 */, U64_C(0x4a44ab49f5eccc77) /* 219 */, U64_C(0x3bc3d6e4b679ee98) /* 220 */, U64_C(0x9cc0d4d1cf14108c) /* 221 */, U64_C(0x4406c00b206bc8a0) /* 222 */, U64_C(0x82a18854c8d72d89) /* 223 */, U64_C(0x67e366b35c3c432c) /* 224 */, U64_C(0xb923dd61102b37f2) /* 225 */, U64_C(0x56ab2779d884271d) /* 226 */, U64_C(0xbe83e1b0ff1525af) /* 227 */, U64_C(0xfb7c65d4217e49a9) /* 228 */, U64_C(0x6bdbe0e76d48e7d4) /* 229 */, U64_C(0x08df828745d9179e) /* 230 */, U64_C(0x22ea6a9add53bd34) /* 231 */, U64_C(0xe36e141c5622200a) /* 232 */, U64_C(0x7f805d1b8cb750ee) /* 233 */, U64_C(0xafe5c7a59f58e837) /* 234 */, U64_C(0xe27f996a4fb1c23c) /* 235 */, U64_C(0xd3867dfb0775f0d0) /* 236 */, U64_C(0xd0e673de6e88891a) /* 237 */, U64_C(0x123aeb9eafb86c25) /* 238 */, U64_C(0x30f1d5d5c145b895) /* 239 */, U64_C(0xbb434a2dee7269e7) /* 240 */, U64_C(0x78cb67ecf931fa38) /* 241 */, U64_C(0xf33b0372323bbf9c) /* 242 */, U64_C(0x52d66336fb279c74) /* 243 */, U64_C(0x505f33ac0afb4eaa) /* 244 */, U64_C(0xe8a5cd99a2cce187) /* 245 */, U64_C(0x534974801e2d30bb) /* 246 */, U64_C(0x8d2d5711d5876d90) /* 247 */, U64_C(0x1f1a412891bc038e) /* 248 */, U64_C(0xd6e2e71d82e56648) /* 249 */, U64_C(0x74036c3a497732b7) /* 250 */, U64_C(0x89b67ed96361f5ab) /* 251 */, U64_C(0xffed95d8f1ea02a2) /* 252 */, U64_C(0xe72b3bd61464d43d) /* 253 */, U64_C(0xa6300f170bdc4820) /* 254 */, U64_C(0xebc18760ed78a77a) /* 255 */ }; static u64 sbox2[256] = { U64_C(0xe6a6be5a05a12138) /* 256 */, U64_C(0xb5a122a5b4f87c98) /* 257 */, U64_C(0x563c6089140b6990) /* 258 */, U64_C(0x4c46cb2e391f5dd5) /* 259 */, U64_C(0xd932addbc9b79434) /* 260 */, U64_C(0x08ea70e42015aff5) /* 261 */, U64_C(0xd765a6673e478cf1) /* 262 */, U64_C(0xc4fb757eab278d99) /* 263 */, U64_C(0xdf11c6862d6e0692) /* 264 */, U64_C(0xddeb84f10d7f3b16) /* 265 */, U64_C(0x6f2ef604a665ea04) /* 266 */, U64_C(0x4a8e0f0ff0e0dfb3) /* 267 */, U64_C(0xa5edeef83dbcba51) /* 268 */, U64_C(0xfc4f0a2a0ea4371e) /* 269 */, U64_C(0xe83e1da85cb38429) /* 270 */, U64_C(0xdc8ff882ba1b1ce2) /* 271 */, U64_C(0xcd45505e8353e80d) /* 272 */, U64_C(0x18d19a00d4db0717) /* 273 */, U64_C(0x34a0cfeda5f38101) /* 274 */, U64_C(0x0be77e518887caf2) /* 275 */, U64_C(0x1e341438b3c45136) /* 276 */, U64_C(0xe05797f49089ccf9) /* 277 */, U64_C(0xffd23f9df2591d14) /* 278 */, U64_C(0x543dda228595c5cd) /* 279 */, U64_C(0x661f81fd99052a33) /* 280 */, U64_C(0x8736e641db0f7b76) /* 281 */, U64_C(0x15227725418e5307) /* 282 */, U64_C(0xe25f7f46162eb2fa) /* 283 */, U64_C(0x48a8b2126c13d9fe) /* 284 */, U64_C(0xafdc541792e76eea) /* 285 */, U64_C(0x03d912bfc6d1898f) /* 286 */, U64_C(0x31b1aafa1b83f51b) /* 287 */, U64_C(0xf1ac2796e42ab7d9) /* 288 */, U64_C(0x40a3a7d7fcd2ebac) /* 289 */, U64_C(0x1056136d0afbbcc5) /* 290 */, U64_C(0x7889e1dd9a6d0c85) /* 291 */, U64_C(0xd33525782a7974aa) /* 292 */, U64_C(0xa7e25d09078ac09b) /* 293 */, U64_C(0xbd4138b3eac6edd0) /* 294 */, U64_C(0x920abfbe71eb9e70) /* 295 */, U64_C(0xa2a5d0f54fc2625c) /* 296 */, U64_C(0xc054e36b0b1290a3) /* 297 */, U64_C(0xf6dd59ff62fe932b) /* 298 */, U64_C(0x3537354511a8ac7d) /* 299 */, U64_C(0xca845e9172fadcd4) /* 300 */, U64_C(0x84f82b60329d20dc) /* 301 */, U64_C(0x79c62ce1cd672f18) /* 302 */, U64_C(0x8b09a2add124642c) /* 303 */, U64_C(0xd0c1e96a19d9e726) /* 304 */, U64_C(0x5a786a9b4ba9500c) /* 305 */, U64_C(0x0e020336634c43f3) /* 306 */, U64_C(0xc17b474aeb66d822) /* 307 */, U64_C(0x6a731ae3ec9baac2) /* 308 */, U64_C(0x8226667ae0840258) /* 309 */, U64_C(0x67d4567691caeca5) /* 310 */, U64_C(0x1d94155c4875adb5) /* 311 */, U64_C(0x6d00fd985b813fdf) /* 312 */, U64_C(0x51286efcb774cd06) /* 313 */, U64_C(0x5e8834471fa744af) /* 314 */, U64_C(0xf72ca0aee761ae2e) /* 315 */, U64_C(0xbe40e4cdaee8e09a) /* 316 */, U64_C(0xe9970bbb5118f665) /* 317 */, U64_C(0x726e4beb33df1964) /* 318 */, U64_C(0x703b000729199762) /* 319 */, U64_C(0x4631d816f5ef30a7) /* 320 */, U64_C(0xb880b5b51504a6be) /* 321 */, U64_C(0x641793c37ed84b6c) /* 322 */, U64_C(0x7b21ed77f6e97d96) /* 323 */, U64_C(0x776306312ef96b73) /* 324 */, U64_C(0xae528948e86ff3f4) /* 325 */, U64_C(0x53dbd7f286a3f8f8) /* 326 */, U64_C(0x16cadce74cfc1063) /* 327 */, U64_C(0x005c19bdfa52c6dd) /* 328 */, U64_C(0x68868f5d64d46ad3) /* 329 */, U64_C(0x3a9d512ccf1e186a) /* 330 */, U64_C(0x367e62c2385660ae) /* 331 */, U64_C(0xe359e7ea77dcb1d7) /* 332 */, U64_C(0x526c0773749abe6e) /* 333 */, U64_C(0x735ae5f9d09f734b) /* 334 */, U64_C(0x493fc7cc8a558ba8) /* 335 */, U64_C(0xb0b9c1533041ab45) /* 336 */, U64_C(0x321958ba470a59bd) /* 337 */, U64_C(0x852db00b5f46c393) /* 338 */, U64_C(0x91209b2bd336b0e5) /* 339 */, U64_C(0x6e604f7d659ef19f) /* 340 */, U64_C(0xb99a8ae2782ccb24) /* 341 */, U64_C(0xccf52ab6c814c4c7) /* 342 */, U64_C(0x4727d9afbe11727b) /* 343 */, U64_C(0x7e950d0c0121b34d) /* 344 */, U64_C(0x756f435670ad471f) /* 345 */, U64_C(0xf5add442615a6849) /* 346 */, U64_C(0x4e87e09980b9957a) /* 347 */, U64_C(0x2acfa1df50aee355) /* 348 */, U64_C(0xd898263afd2fd556) /* 349 */, U64_C(0xc8f4924dd80c8fd6) /* 350 */, U64_C(0xcf99ca3d754a173a) /* 351 */, U64_C(0xfe477bacaf91bf3c) /* 352 */, U64_C(0xed5371f6d690c12d) /* 353 */, U64_C(0x831a5c285e687094) /* 354 */, U64_C(0xc5d3c90a3708a0a4) /* 355 */, U64_C(0x0f7f903717d06580) /* 356 */, U64_C(0x19f9bb13b8fdf27f) /* 357 */, U64_C(0xb1bd6f1b4d502843) /* 358 */, U64_C(0x1c761ba38fff4012) /* 359 */, U64_C(0x0d1530c4e2e21f3b) /* 360 */, U64_C(0x8943ce69a7372c8a) /* 361 */, U64_C(0xe5184e11feb5ce66) /* 362 */, U64_C(0x618bdb80bd736621) /* 363 */, U64_C(0x7d29bad68b574d0b) /* 364 */, U64_C(0x81bb613e25e6fe5b) /* 365 */, U64_C(0x071c9c10bc07913f) /* 366 */, U64_C(0xc7beeb7909ac2d97) /* 367 */, U64_C(0xc3e58d353bc5d757) /* 368 */, U64_C(0xeb017892f38f61e8) /* 369 */, U64_C(0xd4effb9c9b1cc21a) /* 370 */, U64_C(0x99727d26f494f7ab) /* 371 */, U64_C(0xa3e063a2956b3e03) /* 372 */, U64_C(0x9d4a8b9a4aa09c30) /* 373 */, U64_C(0x3f6ab7d500090fb4) /* 374 */, U64_C(0x9cc0f2a057268ac0) /* 375 */, U64_C(0x3dee9d2dedbf42d1) /* 376 */, U64_C(0x330f49c87960a972) /* 377 */, U64_C(0xc6b2720287421b41) /* 378 */, U64_C(0x0ac59ec07c00369c) /* 379 */, U64_C(0xef4eac49cb353425) /* 380 */, U64_C(0xf450244eef0129d8) /* 381 */, U64_C(0x8acc46e5caf4deb6) /* 382 */, U64_C(0x2ffeab63989263f7) /* 383 */, U64_C(0x8f7cb9fe5d7a4578) /* 384 */, U64_C(0x5bd8f7644e634635) /* 385 */, U64_C(0x427a7315bf2dc900) /* 386 */, U64_C(0x17d0c4aa2125261c) /* 387 */, U64_C(0x3992486c93518e50) /* 388 */, U64_C(0xb4cbfee0a2d7d4c3) /* 389 */, U64_C(0x7c75d6202c5ddd8d) /* 390 */, U64_C(0xdbc295d8e35b6c61) /* 391 */, U64_C(0x60b369d302032b19) /* 392 */, U64_C(0xce42685fdce44132) /* 393 */, U64_C(0x06f3ddb9ddf65610) /* 394 */, U64_C(0x8ea4d21db5e148f0) /* 395 */, U64_C(0x20b0fce62fcd496f) /* 396 */, U64_C(0x2c1b912358b0ee31) /* 397 */, U64_C(0xb28317b818f5a308) /* 398 */, U64_C(0xa89c1e189ca6d2cf) /* 399 */, U64_C(0x0c6b18576aaadbc8) /* 400 */, U64_C(0xb65deaa91299fae3) /* 401 */, U64_C(0xfb2b794b7f1027e7) /* 402 */, U64_C(0x04e4317f443b5beb) /* 403 */, U64_C(0x4b852d325939d0a6) /* 404 */, U64_C(0xd5ae6beefb207ffc) /* 405 */, U64_C(0x309682b281c7d374) /* 406 */, U64_C(0xbae309a194c3b475) /* 407 */, U64_C(0x8cc3f97b13b49f05) /* 408 */, U64_C(0x98a9422ff8293967) /* 409 */, U64_C(0x244b16b01076ff7c) /* 410 */, U64_C(0xf8bf571c663d67ee) /* 411 */, U64_C(0x1f0d6758eee30da1) /* 412 */, U64_C(0xc9b611d97adeb9b7) /* 413 */, U64_C(0xb7afd5887b6c57a2) /* 414 */, U64_C(0x6290ae846b984fe1) /* 415 */, U64_C(0x94df4cdeacc1a5fd) /* 416 */, U64_C(0x058a5bd1c5483aff) /* 417 */, U64_C(0x63166cc142ba3c37) /* 418 */, U64_C(0x8db8526eb2f76f40) /* 419 */, U64_C(0xe10880036f0d6d4e) /* 420 */, U64_C(0x9e0523c9971d311d) /* 421 */, U64_C(0x45ec2824cc7cd691) /* 422 */, U64_C(0x575b8359e62382c9) /* 423 */, U64_C(0xfa9e400dc4889995) /* 424 */, U64_C(0xd1823ecb45721568) /* 425 */, U64_C(0xdafd983b8206082f) /* 426 */, U64_C(0xaa7d29082386a8cb) /* 427 */, U64_C(0x269fcd4403b87588) /* 428 */, U64_C(0x1b91f5f728bdd1e0) /* 429 */, U64_C(0xe4669f39040201f6) /* 430 */, U64_C(0x7a1d7c218cf04ade) /* 431 */, U64_C(0x65623c29d79ce5ce) /* 432 */, U64_C(0x2368449096c00bb1) /* 433 */, U64_C(0xab9bf1879da503ba) /* 434 */, U64_C(0xbc23ecb1a458058e) /* 435 */, U64_C(0x9a58df01bb401ecc) /* 436 */, U64_C(0xa070e868a85f143d) /* 437 */, U64_C(0x4ff188307df2239e) /* 438 */, U64_C(0x14d565b41a641183) /* 439 */, U64_C(0xee13337452701602) /* 440 */, U64_C(0x950e3dcf3f285e09) /* 441 */, U64_C(0x59930254b9c80953) /* 442 */, U64_C(0x3bf299408930da6d) /* 443 */, U64_C(0xa955943f53691387) /* 444 */, U64_C(0xa15edecaa9cb8784) /* 445 */, U64_C(0x29142127352be9a0) /* 446 */, U64_C(0x76f0371fff4e7afb) /* 447 */, U64_C(0x0239f450274f2228) /* 448 */, U64_C(0xbb073af01d5e868b) /* 449 */, U64_C(0xbfc80571c10e96c1) /* 450 */, U64_C(0xd267088568222e23) /* 451 */, U64_C(0x9671a3d48e80b5b0) /* 452 */, U64_C(0x55b5d38ae193bb81) /* 453 */, U64_C(0x693ae2d0a18b04b8) /* 454 */, U64_C(0x5c48b4ecadd5335f) /* 455 */, U64_C(0xfd743b194916a1ca) /* 456 */, U64_C(0x2577018134be98c4) /* 457 */, U64_C(0xe77987e83c54a4ad) /* 458 */, U64_C(0x28e11014da33e1b9) /* 459 */, U64_C(0x270cc59e226aa213) /* 460 */, U64_C(0x71495f756d1a5f60) /* 461 */, U64_C(0x9be853fb60afef77) /* 462 */, U64_C(0xadc786a7f7443dbf) /* 463 */, U64_C(0x0904456173b29a82) /* 464 */, U64_C(0x58bc7a66c232bd5e) /* 465 */, U64_C(0xf306558c673ac8b2) /* 466 */, U64_C(0x41f639c6b6c9772a) /* 467 */, U64_C(0x216defe99fda35da) /* 468 */, U64_C(0x11640cc71c7be615) /* 469 */, U64_C(0x93c43694565c5527) /* 470 */, U64_C(0xea038e6246777839) /* 471 */, U64_C(0xf9abf3ce5a3e2469) /* 472 */, U64_C(0x741e768d0fd312d2) /* 473 */, U64_C(0x0144b883ced652c6) /* 474 */, U64_C(0xc20b5a5ba33f8552) /* 475 */, U64_C(0x1ae69633c3435a9d) /* 476 */, U64_C(0x97a28ca4088cfdec) /* 477 */, U64_C(0x8824a43c1e96f420) /* 478 */, U64_C(0x37612fa66eeea746) /* 479 */, U64_C(0x6b4cb165f9cf0e5a) /* 480 */, U64_C(0x43aa1c06a0abfb4a) /* 481 */, U64_C(0x7f4dc26ff162796b) /* 482 */, U64_C(0x6cbacc8e54ed9b0f) /* 483 */, U64_C(0xa6b7ffefd2bb253e) /* 484 */, U64_C(0x2e25bc95b0a29d4f) /* 485 */, U64_C(0x86d6a58bdef1388c) /* 486 */, U64_C(0xded74ac576b6f054) /* 487 */, U64_C(0x8030bdbc2b45805d) /* 488 */, U64_C(0x3c81af70e94d9289) /* 489 */, U64_C(0x3eff6dda9e3100db) /* 490 */, U64_C(0xb38dc39fdfcc8847) /* 491 */, U64_C(0x123885528d17b87e) /* 492 */, U64_C(0xf2da0ed240b1b642) /* 493 */, U64_C(0x44cefadcd54bf9a9) /* 494 */, U64_C(0x1312200e433c7ee6) /* 495 */, U64_C(0x9ffcc84f3a78c748) /* 496 */, U64_C(0xf0cd1f72248576bb) /* 497 */, U64_C(0xec6974053638cfe4) /* 498 */, U64_C(0x2ba7b67c0cec4e4c) /* 499 */, U64_C(0xac2f4df3e5ce32ed) /* 500 */, U64_C(0xcb33d14326ea4c11) /* 501 */, U64_C(0xa4e9044cc77e58bc) /* 502 */, U64_C(0x5f513293d934fcef) /* 503 */, U64_C(0x5dc9645506e55444) /* 504 */, U64_C(0x50de418f317de40a) /* 505 */, U64_C(0x388cb31a69dde259) /* 506 */, U64_C(0x2db4a83455820a86) /* 507 */, U64_C(0x9010a91e84711ae9) /* 508 */, U64_C(0x4df7f0b7b1498371) /* 509 */, U64_C(0xd62a2eabc0977179) /* 510 */, U64_C(0x22fac097aa8d5c0e) /* 511 */ }; static u64 sbox3[256] = { U64_C(0xf49fcc2ff1daf39b) /* 512 */, U64_C(0x487fd5c66ff29281) /* 513 */, U64_C(0xe8a30667fcdca83f) /* 514 */, U64_C(0x2c9b4be3d2fcce63) /* 515 */, U64_C(0xda3ff74b93fbbbc2) /* 516 */, U64_C(0x2fa165d2fe70ba66) /* 517 */, U64_C(0xa103e279970e93d4) /* 518 */, U64_C(0xbecdec77b0e45e71) /* 519 */, U64_C(0xcfb41e723985e497) /* 520 */, U64_C(0xb70aaa025ef75017) /* 521 */, U64_C(0xd42309f03840b8e0) /* 522 */, U64_C(0x8efc1ad035898579) /* 523 */, U64_C(0x96c6920be2b2abc5) /* 524 */, U64_C(0x66af4163375a9172) /* 525 */, U64_C(0x2174abdcca7127fb) /* 526 */, U64_C(0xb33ccea64a72ff41) /* 527 */, U64_C(0xf04a4933083066a5) /* 528 */, U64_C(0x8d970acdd7289af5) /* 529 */, U64_C(0x8f96e8e031c8c25e) /* 530 */, U64_C(0xf3fec02276875d47) /* 531 */, U64_C(0xec7bf310056190dd) /* 532 */, U64_C(0xf5adb0aebb0f1491) /* 533 */, U64_C(0x9b50f8850fd58892) /* 534 */, U64_C(0x4975488358b74de8) /* 535 */, U64_C(0xa3354ff691531c61) /* 536 */, U64_C(0x0702bbe481d2c6ee) /* 537 */, U64_C(0x89fb24057deded98) /* 538 */, U64_C(0xac3075138596e902) /* 539 */, U64_C(0x1d2d3580172772ed) /* 540 */, U64_C(0xeb738fc28e6bc30d) /* 541 */, U64_C(0x5854ef8f63044326) /* 542 */, U64_C(0x9e5c52325add3bbe) /* 543 */, U64_C(0x90aa53cf325c4623) /* 544 */, U64_C(0xc1d24d51349dd067) /* 545 */, U64_C(0x2051cfeea69ea624) /* 546 */, U64_C(0x13220f0a862e7e4f) /* 547 */, U64_C(0xce39399404e04864) /* 548 */, U64_C(0xd9c42ca47086fcb7) /* 549 */, U64_C(0x685ad2238a03e7cc) /* 550 */, U64_C(0x066484b2ab2ff1db) /* 551 */, U64_C(0xfe9d5d70efbf79ec) /* 552 */, U64_C(0x5b13b9dd9c481854) /* 553 */, U64_C(0x15f0d475ed1509ad) /* 554 */, U64_C(0x0bebcd060ec79851) /* 555 */, U64_C(0xd58c6791183ab7f8) /* 556 */, U64_C(0xd1187c5052f3eee4) /* 557 */, U64_C(0xc95d1192e54e82ff) /* 558 */, U64_C(0x86eea14cb9ac6ca2) /* 559 */, U64_C(0x3485beb153677d5d) /* 560 */, U64_C(0xdd191d781f8c492a) /* 561 */, U64_C(0xf60866baa784ebf9) /* 562 */, U64_C(0x518f643ba2d08c74) /* 563 */, U64_C(0x8852e956e1087c22) /* 564 */, U64_C(0xa768cb8dc410ae8d) /* 565 */, U64_C(0x38047726bfec8e1a) /* 566 */, U64_C(0xa67738b4cd3b45aa) /* 567 */, U64_C(0xad16691cec0dde19) /* 568 */, U64_C(0xc6d4319380462e07) /* 569 */, U64_C(0xc5a5876d0ba61938) /* 570 */, U64_C(0x16b9fa1fa58fd840) /* 571 */, U64_C(0x188ab1173ca74f18) /* 572 */, U64_C(0xabda2f98c99c021f) /* 573 */, U64_C(0x3e0580ab134ae816) /* 574 */, U64_C(0x5f3b05b773645abb) /* 575 */, U64_C(0x2501a2be5575f2f6) /* 576 */, U64_C(0x1b2f74004e7e8ba9) /* 577 */, U64_C(0x1cd7580371e8d953) /* 578 */, U64_C(0x7f6ed89562764e30) /* 579 */, U64_C(0xb15926ff596f003d) /* 580 */, U64_C(0x9f65293da8c5d6b9) /* 581 */, U64_C(0x6ecef04dd690f84c) /* 582 */, U64_C(0x4782275fff33af88) /* 583 */, U64_C(0xe41433083f820801) /* 584 */, U64_C(0xfd0dfe409a1af9b5) /* 585 */, U64_C(0x4325a3342cdb396b) /* 586 */, U64_C(0x8ae77e62b301b252) /* 587 */, U64_C(0xc36f9e9f6655615a) /* 588 */, U64_C(0x85455a2d92d32c09) /* 589 */, U64_C(0xf2c7dea949477485) /* 590 */, U64_C(0x63cfb4c133a39eba) /* 591 */, U64_C(0x83b040cc6ebc5462) /* 592 */, U64_C(0x3b9454c8fdb326b0) /* 593 */, U64_C(0x56f56a9e87ffd78c) /* 594 */, U64_C(0x2dc2940d99f42bc6) /* 595 */, U64_C(0x98f7df096b096e2d) /* 596 */, U64_C(0x19a6e01e3ad852bf) /* 597 */, U64_C(0x42a99ccbdbd4b40b) /* 598 */, U64_C(0xa59998af45e9c559) /* 599 */, U64_C(0x366295e807d93186) /* 600 */, U64_C(0x6b48181bfaa1f773) /* 601 */, U64_C(0x1fec57e2157a0a1d) /* 602 */, U64_C(0x4667446af6201ad5) /* 603 */, U64_C(0xe615ebcacfb0f075) /* 604 */, U64_C(0xb8f31f4f68290778) /* 605 */, U64_C(0x22713ed6ce22d11e) /* 606 */, U64_C(0x3057c1a72ec3c93b) /* 607 */, U64_C(0xcb46acc37c3f1f2f) /* 608 */, U64_C(0xdbb893fd02aaf50e) /* 609 */, U64_C(0x331fd92e600b9fcf) /* 610 */, U64_C(0xa498f96148ea3ad6) /* 611 */, U64_C(0xa8d8426e8b6a83ea) /* 612 */, U64_C(0xa089b274b7735cdc) /* 613 */, U64_C(0x87f6b3731e524a11) /* 614 */, U64_C(0x118808e5cbc96749) /* 615 */, U64_C(0x9906e4c7b19bd394) /* 616 */, U64_C(0xafed7f7e9b24a20c) /* 617 */, U64_C(0x6509eadeeb3644a7) /* 618 */, U64_C(0x6c1ef1d3e8ef0ede) /* 619 */, U64_C(0xb9c97d43e9798fb4) /* 620 */, U64_C(0xa2f2d784740c28a3) /* 621 */, U64_C(0x7b8496476197566f) /* 622 */, U64_C(0x7a5be3e6b65f069d) /* 623 */, U64_C(0xf96330ed78be6f10) /* 624 */, U64_C(0xeee60de77a076a15) /* 625 */, U64_C(0x2b4bee4aa08b9bd0) /* 626 */, U64_C(0x6a56a63ec7b8894e) /* 627 */, U64_C(0x02121359ba34fef4) /* 628 */, U64_C(0x4cbf99f8283703fc) /* 629 */, U64_C(0x398071350caf30c8) /* 630 */, U64_C(0xd0a77a89f017687a) /* 631 */, U64_C(0xf1c1a9eb9e423569) /* 632 */, U64_C(0x8c7976282dee8199) /* 633 */, U64_C(0x5d1737a5dd1f7abd) /* 634 */, U64_C(0x4f53433c09a9fa80) /* 635 */, U64_C(0xfa8b0c53df7ca1d9) /* 636 */, U64_C(0x3fd9dcbc886ccb77) /* 637 */, U64_C(0xc040917ca91b4720) /* 638 */, U64_C(0x7dd00142f9d1dcdf) /* 639 */, U64_C(0x8476fc1d4f387b58) /* 640 */, U64_C(0x23f8e7c5f3316503) /* 641 */, U64_C(0x032a2244e7e37339) /* 642 */, U64_C(0x5c87a5d750f5a74b) /* 643 */, U64_C(0x082b4cc43698992e) /* 644 */, U64_C(0xdf917becb858f63c) /* 645 */, U64_C(0x3270b8fc5bf86dda) /* 646 */, U64_C(0x10ae72bb29b5dd76) /* 647 */, U64_C(0x576ac94e7700362b) /* 648 */, U64_C(0x1ad112dac61efb8f) /* 649 */, U64_C(0x691bc30ec5faa427) /* 650 */, U64_C(0xff246311cc327143) /* 651 */, U64_C(0x3142368e30e53206) /* 652 */, U64_C(0x71380e31e02ca396) /* 653 */, U64_C(0x958d5c960aad76f1) /* 654 */, U64_C(0xf8d6f430c16da536) /* 655 */, U64_C(0xc8ffd13f1be7e1d2) /* 656 */, U64_C(0x7578ae66004ddbe1) /* 657 */, U64_C(0x05833f01067be646) /* 658 */, U64_C(0xbb34b5ad3bfe586d) /* 659 */, U64_C(0x095f34c9a12b97f0) /* 660 */, U64_C(0x247ab64525d60ca8) /* 661 */, U64_C(0xdcdbc6f3017477d1) /* 662 */, U64_C(0x4a2e14d4decad24d) /* 663 */, U64_C(0xbdb5e6d9be0a1eeb) /* 664 */, U64_C(0x2a7e70f7794301ab) /* 665 */, U64_C(0xdef42d8a270540fd) /* 666 */, U64_C(0x01078ec0a34c22c1) /* 667 */, U64_C(0xe5de511af4c16387) /* 668 */, U64_C(0x7ebb3a52bd9a330a) /* 669 */, U64_C(0x77697857aa7d6435) /* 670 */, U64_C(0x004e831603ae4c32) /* 671 */, U64_C(0xe7a21020ad78e312) /* 672 */, U64_C(0x9d41a70c6ab420f2) /* 673 */, U64_C(0x28e06c18ea1141e6) /* 674 */, U64_C(0xd2b28cbd984f6b28) /* 675 */, U64_C(0x26b75f6c446e9d83) /* 676 */, U64_C(0xba47568c4d418d7f) /* 677 */, U64_C(0xd80badbfe6183d8e) /* 678 */, U64_C(0x0e206d7f5f166044) /* 679 */, U64_C(0xe258a43911cbca3e) /* 680 */, U64_C(0x723a1746b21dc0bc) /* 681 */, U64_C(0xc7caa854f5d7cdd3) /* 682 */, U64_C(0x7cac32883d261d9c) /* 683 */, U64_C(0x7690c26423ba942c) /* 684 */, U64_C(0x17e55524478042b8) /* 685 */, U64_C(0xe0be477656a2389f) /* 686 */, U64_C(0x4d289b5e67ab2da0) /* 687 */, U64_C(0x44862b9c8fbbfd31) /* 688 */, U64_C(0xb47cc8049d141365) /* 689 */, U64_C(0x822c1b362b91c793) /* 690 */, U64_C(0x4eb14655fb13dfd8) /* 691 */, U64_C(0x1ecbba0714e2a97b) /* 692 */, U64_C(0x6143459d5cde5f14) /* 693 */, U64_C(0x53a8fbf1d5f0ac89) /* 694 */, U64_C(0x97ea04d81c5e5b00) /* 695 */, U64_C(0x622181a8d4fdb3f3) /* 696 */, U64_C(0xe9bcd341572a1208) /* 697 */, U64_C(0x1411258643cce58a) /* 698 */, U64_C(0x9144c5fea4c6e0a4) /* 699 */, U64_C(0x0d33d06565cf620f) /* 700 */, U64_C(0x54a48d489f219ca1) /* 701 */, U64_C(0xc43e5eac6d63c821) /* 702 */, U64_C(0xa9728b3a72770daf) /* 703 */, U64_C(0xd7934e7b20df87ef) /* 704 */, U64_C(0xe35503b61a3e86e5) /* 705 */, U64_C(0xcae321fbc819d504) /* 706 */, U64_C(0x129a50b3ac60bfa6) /* 707 */, U64_C(0xcd5e68ea7e9fb6c3) /* 708 */, U64_C(0xb01c90199483b1c7) /* 709 */, U64_C(0x3de93cd5c295376c) /* 710 */, U64_C(0xaed52edf2ab9ad13) /* 711 */, U64_C(0x2e60f512c0a07884) /* 712 */, U64_C(0xbc3d86a3e36210c9) /* 713 */, U64_C(0x35269d9b163951ce) /* 714 */, U64_C(0x0c7d6e2ad0cdb5fa) /* 715 */, U64_C(0x59e86297d87f5733) /* 716 */, U64_C(0x298ef221898db0e7) /* 717 */, U64_C(0x55000029d1a5aa7e) /* 718 */, U64_C(0x8bc08ae1b5061b45) /* 719 */, U64_C(0xc2c31c2b6c92703a) /* 720 */, U64_C(0x94cc596baf25ef42) /* 721 */, U64_C(0x0a1d73db22540456) /* 722 */, U64_C(0x04b6a0f9d9c4179a) /* 723 */, U64_C(0xeffdafa2ae3d3c60) /* 724 */, U64_C(0xf7c8075bb49496c4) /* 725 */, U64_C(0x9cc5c7141d1cd4e3) /* 726 */, U64_C(0x78bd1638218e5534) /* 727 */, U64_C(0xb2f11568f850246a) /* 728 */, U64_C(0xedfabcfa9502bc29) /* 729 */, U64_C(0x796ce5f2da23051b) /* 730 */, U64_C(0xaae128b0dc93537c) /* 731 */, U64_C(0x3a493da0ee4b29ae) /* 732 */, U64_C(0xb5df6b2c416895d7) /* 733 */, U64_C(0xfcabbd25122d7f37) /* 734 */, U64_C(0x70810b58105dc4b1) /* 735 */, U64_C(0xe10fdd37f7882a90) /* 736 */, U64_C(0x524dcab5518a3f5c) /* 737 */, U64_C(0x3c9e85878451255b) /* 738 */, U64_C(0x4029828119bd34e2) /* 739 */, U64_C(0x74a05b6f5d3ceccb) /* 740 */, U64_C(0xb610021542e13eca) /* 741 */, U64_C(0x0ff979d12f59e2ac) /* 742 */, U64_C(0x6037da27e4f9cc50) /* 743 */, U64_C(0x5e92975a0df1847d) /* 744 */, U64_C(0xd66de190d3e623fe) /* 745 */, U64_C(0x5032d6b87b568048) /* 746 */, U64_C(0x9a36b7ce8235216e) /* 747 */, U64_C(0x80272a7a24f64b4a) /* 748 */, U64_C(0x93efed8b8c6916f7) /* 749 */, U64_C(0x37ddbff44cce1555) /* 750 */, U64_C(0x4b95db5d4b99bd25) /* 751 */, U64_C(0x92d3fda169812fc0) /* 752 */, U64_C(0xfb1a4a9a90660bb6) /* 753 */, U64_C(0x730c196946a4b9b2) /* 754 */, U64_C(0x81e289aa7f49da68) /* 755 */, U64_C(0x64669a0f83b1a05f) /* 756 */, U64_C(0x27b3ff7d9644f48b) /* 757 */, U64_C(0xcc6b615c8db675b3) /* 758 */, U64_C(0x674f20b9bcebbe95) /* 759 */, U64_C(0x6f31238275655982) /* 760 */, U64_C(0x5ae488713e45cf05) /* 761 */, U64_C(0xbf619f9954c21157) /* 762 */, U64_C(0xeabac46040a8eae9) /* 763 */, U64_C(0x454c6fe9f2c0c1cd) /* 764 */, U64_C(0x419cf6496412691c) /* 765 */, U64_C(0xd3dc3bef265b0f70) /* 766 */, U64_C(0x6d0e60f5c3578a9e) /* 767 */ }; static u64 sbox4[256] = { U64_C(0x5b0e608526323c55) /* 768 */, U64_C(0x1a46c1a9fa1b59f5) /* 769 */, U64_C(0xa9e245a17c4c8ffa) /* 770 */, U64_C(0x65ca5159db2955d7) /* 771 */, U64_C(0x05db0a76ce35afc2) /* 772 */, U64_C(0x81eac77ea9113d45) /* 773 */, U64_C(0x528ef88ab6ac0a0d) /* 774 */, U64_C(0xa09ea253597be3ff) /* 775 */, U64_C(0x430ddfb3ac48cd56) /* 776 */, U64_C(0xc4b3a67af45ce46f) /* 777 */, U64_C(0x4ececfd8fbe2d05e) /* 778 */, U64_C(0x3ef56f10b39935f0) /* 779 */, U64_C(0x0b22d6829cd619c6) /* 780 */, U64_C(0x17fd460a74df2069) /* 781 */, U64_C(0x6cf8cc8e8510ed40) /* 782 */, U64_C(0xd6c824bf3a6ecaa7) /* 783 */, U64_C(0x61243d581a817049) /* 784 */, U64_C(0x048bacb6bbc163a2) /* 785 */, U64_C(0xd9a38ac27d44cc32) /* 786 */, U64_C(0x7fddff5baaf410ab) /* 787 */, U64_C(0xad6d495aa804824b) /* 788 */, U64_C(0xe1a6a74f2d8c9f94) /* 789 */, U64_C(0xd4f7851235dee8e3) /* 790 */, U64_C(0xfd4b7f886540d893) /* 791 */, U64_C(0x247c20042aa4bfda) /* 792 */, U64_C(0x096ea1c517d1327c) /* 793 */, U64_C(0xd56966b4361a6685) /* 794 */, U64_C(0x277da5c31221057d) /* 795 */, U64_C(0x94d59893a43acff7) /* 796 */, U64_C(0x64f0c51ccdc02281) /* 797 */, U64_C(0x3d33bcc4ff6189db) /* 798 */, U64_C(0xe005cb184ce66af1) /* 799 */, U64_C(0xff5ccd1d1db99bea) /* 800 */, U64_C(0xb0b854a7fe42980f) /* 801 */, U64_C(0x7bd46a6a718d4b9f) /* 802 */, U64_C(0xd10fa8cc22a5fd8c) /* 803 */, U64_C(0xd31484952be4bd31) /* 804 */, U64_C(0xc7fa975fcb243847) /* 805 */, U64_C(0x4886ed1e5846c407) /* 806 */, U64_C(0x28cddb791eb70b04) /* 807 */, U64_C(0xc2b00be2f573417f) /* 808 */, U64_C(0x5c9590452180f877) /* 809 */, U64_C(0x7a6bddfff370eb00) /* 810 */, U64_C(0xce509e38d6d9d6a4) /* 811 */, U64_C(0xebeb0f00647fa702) /* 812 */, U64_C(0x1dcc06cf76606f06) /* 813 */, U64_C(0xe4d9f28ba286ff0a) /* 814 */, U64_C(0xd85a305dc918c262) /* 815 */, U64_C(0x475b1d8732225f54) /* 816 */, U64_C(0x2d4fb51668ccb5fe) /* 817 */, U64_C(0xa679b9d9d72bba20) /* 818 */, U64_C(0x53841c0d912d43a5) /* 819 */, U64_C(0x3b7eaa48bf12a4e8) /* 820 */, U64_C(0x781e0e47f22f1ddf) /* 821 */, U64_C(0xeff20ce60ab50973) /* 822 */, U64_C(0x20d261d19dffb742) /* 823 */, U64_C(0x16a12b03062a2e39) /* 824 */, U64_C(0x1960eb2239650495) /* 825 */, U64_C(0x251c16fed50eb8b8) /* 826 */, U64_C(0x9ac0c330f826016e) /* 827 */, U64_C(0xed152665953e7671) /* 828 */, U64_C(0x02d63194a6369570) /* 829 */, U64_C(0x5074f08394b1c987) /* 830 */, U64_C(0x70ba598c90b25ce1) /* 831 */, U64_C(0x794a15810b9742f6) /* 832 */, U64_C(0x0d5925e9fcaf8c6c) /* 833 */, U64_C(0x3067716cd868744e) /* 834 */, U64_C(0x910ab077e8d7731b) /* 835 */, U64_C(0x6a61bbdb5ac42f61) /* 836 */, U64_C(0x93513efbf0851567) /* 837 */, U64_C(0xf494724b9e83e9d5) /* 838 */, U64_C(0xe887e1985c09648d) /* 839 */, U64_C(0x34b1d3c675370cfd) /* 840 */, U64_C(0xdc35e433bc0d255d) /* 841 */, U64_C(0xd0aab84234131be0) /* 842 */, U64_C(0x08042a50b48b7eaf) /* 843 */, U64_C(0x9997c4ee44a3ab35) /* 844 */, U64_C(0x829a7b49201799d0) /* 845 */, U64_C(0x263b8307b7c54441) /* 846 */, U64_C(0x752f95f4fd6a6ca6) /* 847 */, U64_C(0x927217402c08c6e5) /* 848 */, U64_C(0x2a8ab754a795d9ee) /* 849 */, U64_C(0xa442f7552f72943d) /* 850 */, U64_C(0x2c31334e19781208) /* 851 */, U64_C(0x4fa98d7ceaee6291) /* 852 */, U64_C(0x55c3862f665db309) /* 853 */, U64_C(0xbd0610175d53b1f3) /* 854 */, U64_C(0x46fe6cb840413f27) /* 855 */, U64_C(0x3fe03792df0cfa59) /* 856 */, U64_C(0xcfe700372eb85e8f) /* 857 */, U64_C(0xa7be29e7adbce118) /* 858 */, U64_C(0xe544ee5cde8431dd) /* 859 */, U64_C(0x8a781b1b41f1873e) /* 860 */, U64_C(0xa5c94c78a0d2f0e7) /* 861 */, U64_C(0x39412e2877b60728) /* 862 */, U64_C(0xa1265ef3afc9a62c) /* 863 */, U64_C(0xbcc2770c6a2506c5) /* 864 */, U64_C(0x3ab66dd5dce1ce12) /* 865 */, U64_C(0xe65499d04a675b37) /* 866 */, U64_C(0x7d8f523481bfd216) /* 867 */, U64_C(0x0f6f64fcec15f389) /* 868 */, U64_C(0x74efbe618b5b13c8) /* 869 */, U64_C(0xacdc82b714273e1d) /* 870 */, U64_C(0xdd40bfe003199d17) /* 871 */, U64_C(0x37e99257e7e061f8) /* 872 */, U64_C(0xfa52626904775aaa) /* 873 */, U64_C(0x8bbbf63a463d56f9) /* 874 */, U64_C(0xf0013f1543a26e64) /* 875 */, U64_C(0xa8307e9f879ec898) /* 876 */, U64_C(0xcc4c27a4150177cc) /* 877 */, U64_C(0x1b432f2cca1d3348) /* 878 */, U64_C(0xde1d1f8f9f6fa013) /* 879 */, U64_C(0x606602a047a7ddd6) /* 880 */, U64_C(0xd237ab64cc1cb2c7) /* 881 */, U64_C(0x9b938e7225fcd1d3) /* 882 */, U64_C(0xec4e03708e0ff476) /* 883 */, U64_C(0xfeb2fbda3d03c12d) /* 884 */, U64_C(0xae0bced2ee43889a) /* 885 */, U64_C(0x22cb8923ebfb4f43) /* 886 */, U64_C(0x69360d013cf7396d) /* 887 */, U64_C(0x855e3602d2d4e022) /* 888 */, U64_C(0x073805bad01f784c) /* 889 */, U64_C(0x33e17a133852f546) /* 890 */, U64_C(0xdf4874058ac7b638) /* 891 */, U64_C(0xba92b29c678aa14a) /* 892 */, U64_C(0x0ce89fc76cfaadcd) /* 893 */, U64_C(0x5f9d4e0908339e34) /* 894 */, U64_C(0xf1afe9291f5923b9) /* 895 */, U64_C(0x6e3480f60f4a265f) /* 896 */, U64_C(0xeebf3a2ab29b841c) /* 897 */, U64_C(0xe21938a88f91b4ad) /* 898 */, U64_C(0x57dfeff845c6d3c3) /* 899 */, U64_C(0x2f006b0bf62caaf2) /* 900 */, U64_C(0x62f479ef6f75ee78) /* 901 */, U64_C(0x11a55ad41c8916a9) /* 902 */, U64_C(0xf229d29084fed453) /* 903 */, U64_C(0x42f1c27b16b000e6) /* 904 */, U64_C(0x2b1f76749823c074) /* 905 */, U64_C(0x4b76eca3c2745360) /* 906 */, U64_C(0x8c98f463b91691bd) /* 907 */, U64_C(0x14bcc93cf1ade66a) /* 908 */, U64_C(0x8885213e6d458397) /* 909 */, U64_C(0x8e177df0274d4711) /* 910 */, U64_C(0xb49b73b5503f2951) /* 911 */, U64_C(0x10168168c3f96b6b) /* 912 */, U64_C(0x0e3d963b63cab0ae) /* 913 */, U64_C(0x8dfc4b5655a1db14) /* 914 */, U64_C(0xf789f1356e14de5c) /* 915 */, U64_C(0x683e68af4e51dac1) /* 916 */, U64_C(0xc9a84f9d8d4b0fd9) /* 917 */, U64_C(0x3691e03f52a0f9d1) /* 918 */, U64_C(0x5ed86e46e1878e80) /* 919 */, U64_C(0x3c711a0e99d07150) /* 920 */, U64_C(0x5a0865b20c4e9310) /* 921 */, U64_C(0x56fbfc1fe4f0682e) /* 922 */, U64_C(0xea8d5de3105edf9b) /* 923 */, U64_C(0x71abfdb12379187a) /* 924 */, U64_C(0x2eb99de1bee77b9c) /* 925 */, U64_C(0x21ecc0ea33cf4523) /* 926 */, U64_C(0x59a4d7521805c7a1) /* 927 */, U64_C(0x3896f5eb56ae7c72) /* 928 */, U64_C(0xaa638f3db18f75dc) /* 929 */, U64_C(0x9f39358dabe9808e) /* 930 */, U64_C(0xb7defa91c00b72ac) /* 931 */, U64_C(0x6b5541fd62492d92) /* 932 */, U64_C(0x6dc6dee8f92e4d5b) /* 933 */, U64_C(0x353f57abc4beea7e) /* 934 */, U64_C(0x735769d6da5690ce) /* 935 */, U64_C(0x0a234aa642391484) /* 936 */, U64_C(0xf6f9508028f80d9d) /* 937 */, U64_C(0xb8e319a27ab3f215) /* 938 */, U64_C(0x31ad9c1151341a4d) /* 939 */, U64_C(0x773c22a57bef5805) /* 940 */, U64_C(0x45c7561a07968633) /* 941 */, U64_C(0xf913da9e249dbe36) /* 942 */, U64_C(0xda652d9b78a64c68) /* 943 */, U64_C(0x4c27a97f3bc334ef) /* 944 */, U64_C(0x76621220e66b17f4) /* 945 */, U64_C(0x967743899acd7d0b) /* 946 */, U64_C(0xf3ee5bcae0ed6782) /* 947 */, U64_C(0x409f753600c879fc) /* 948 */, U64_C(0x06d09a39b5926db6) /* 949 */, U64_C(0x6f83aeb0317ac588) /* 950 */, U64_C(0x01e6ca4a86381f21) /* 951 */, U64_C(0x66ff3462d19f3025) /* 952 */, U64_C(0x72207c24ddfd3bfb) /* 953 */, U64_C(0x4af6b6d3e2ece2eb) /* 954 */, U64_C(0x9c994dbec7ea08de) /* 955 */, U64_C(0x49ace597b09a8bc4) /* 956 */, U64_C(0xb38c4766cf0797ba) /* 957 */, U64_C(0x131b9373c57c2a75) /* 958 */, U64_C(0xb1822cce61931e58) /* 959 */, U64_C(0x9d7555b909ba1c0c) /* 960 */, U64_C(0x127fafdd937d11d2) /* 961 */, U64_C(0x29da3badc66d92e4) /* 962 */, U64_C(0xa2c1d57154c2ecbc) /* 963 */, U64_C(0x58c5134d82f6fe24) /* 964 */, U64_C(0x1c3ae3515b62274f) /* 965 */, U64_C(0xe907c82e01cb8126) /* 966 */, U64_C(0xf8ed091913e37fcb) /* 967 */, U64_C(0x3249d8f9c80046c9) /* 968 */, U64_C(0x80cf9bede388fb63) /* 969 */, U64_C(0x1881539a116cf19e) /* 970 */, U64_C(0x5103f3f76bd52457) /* 971 */, U64_C(0x15b7e6f5ae47f7a8) /* 972 */, U64_C(0xdbd7c6ded47e9ccf) /* 973 */, U64_C(0x44e55c410228bb1a) /* 974 */, U64_C(0xb647d4255edb4e99) /* 975 */, U64_C(0x5d11882bb8aafc30) /* 976 */, U64_C(0xf5098bbb29d3212a) /* 977 */, U64_C(0x8fb5ea14e90296b3) /* 978 */, U64_C(0x677b942157dd025a) /* 979 */, U64_C(0xfb58e7c0a390acb5) /* 980 */, U64_C(0x89d3674c83bd4a01) /* 981 */, U64_C(0x9e2da4df4bf3b93b) /* 982 */, U64_C(0xfcc41e328cab4829) /* 983 */, U64_C(0x03f38c96ba582c52) /* 984 */, U64_C(0xcad1bdbd7fd85db2) /* 985 */, U64_C(0xbbb442c16082ae83) /* 986 */, U64_C(0xb95fe86ba5da9ab0) /* 987 */, U64_C(0xb22e04673771a93f) /* 988 */, U64_C(0x845358c9493152d8) /* 989 */, U64_C(0xbe2a488697b4541e) /* 990 */, U64_C(0x95a2dc2dd38e6966) /* 991 */, U64_C(0xc02c11ac923c852b) /* 992 */, U64_C(0x2388b1990df2a87b) /* 993 */, U64_C(0x7c8008fa1b4f37be) /* 994 */, U64_C(0x1f70d0c84d54e503) /* 995 */, U64_C(0x5490adec7ece57d4) /* 996 */, U64_C(0x002b3c27d9063a3a) /* 997 */, U64_C(0x7eaea3848030a2bf) /* 998 */, U64_C(0xc602326ded2003c0) /* 999 */, U64_C(0x83a7287d69a94086) /* 1000 */, U64_C(0xc57a5fcb30f57a8a) /* 1001 */, U64_C(0xb56844e479ebe779) /* 1002 */, U64_C(0xa373b40f05dcbce9) /* 1003 */, U64_C(0xd71a786e88570ee2) /* 1004 */, U64_C(0x879cbacdbde8f6a0) /* 1005 */, U64_C(0x976ad1bcc164a32f) /* 1006 */, U64_C(0xab21e25e9666d78b) /* 1007 */, U64_C(0x901063aae5e5c33c) /* 1008 */, U64_C(0x9818b34448698d90) /* 1009 */, U64_C(0xe36487ae3e1e8abb) /* 1010 */, U64_C(0xafbdf931893bdcb4) /* 1011 */, U64_C(0x6345a0dc5fbbd519) /* 1012 */, U64_C(0x8628fe269b9465ca) /* 1013 */, U64_C(0x1e5d01603f9c51ec) /* 1014 */, U64_C(0x4de44006a15049b7) /* 1015 */, U64_C(0xbf6c70e5f776cbb1) /* 1016 */, U64_C(0x411218f2ef552bed) /* 1017 */, U64_C(0xcb0c0708705a36a3) /* 1018 */, U64_C(0xe74d14754f986044) /* 1019 */, U64_C(0xcd56d9430ea8280e) /* 1020 */, U64_C(0xc12591d7535f5065) /* 1021 */, U64_C(0xc83223f1720aef96) /* 1022 */, U64_C(0xc3a0396f7363a51f) /* 1023 */ }; static unsigned int transform ( void *ctx, const unsigned char *data, size_t nblks ); static void do_init (void *context, int variant) { TIGER_CONTEXT *hd = context; hd->a = 0x0123456789abcdefLL; hd->b = 0xfedcba9876543210LL; hd->c = 0xf096a5b4c3b2e187LL; hd->bctx.nblocks = 0; hd->bctx.nblocks_high = 0; hd->bctx.count = 0; hd->bctx.blocksize_shift = _gcry_ctz(64); hd->bctx.bwrite = transform; hd->variant = variant; } static void tiger_init (void *context, unsigned int flags) { (void)flags; do_init (context, 0); } static void tiger1_init (void *context, unsigned int flags) { (void)flags; do_init (context, 1); } static void tiger2_init (void *context, unsigned int flags) { (void)flags; do_init (context, 2); } #define tiger_round(xa, xb, xc, xx, xmul) { \ xc ^= xx; \ xa -= ( sbox1[ (xc) & 0xff ] ^ sbox2[ ((xc) >> 16) & 0xff ] \ ^ sbox3[ ((xc) >> 32) & 0xff ] ^ sbox4[ ((xc) >> 48) & 0xff ]); \ xb += ( sbox4[ ((xc) >> 8) & 0xff ] ^ sbox3[ ((xc) >> 24) & 0xff ] \ ^ sbox2[ ((xc) >> 40) & 0xff ] ^ sbox1[ ((xc) >> 56) & 0xff ]); \ xb *= xmul; } #define pass(ya, yb, yc, yx, ymul) { \ tiger_round( ya, yb, yc, yx[0], ymul ); \ tiger_round( yb, yc, ya, yx[1], ymul ); \ tiger_round( yc, ya, yb, yx[2], ymul ); \ tiger_round( ya, yb, yc, yx[3], ymul ); \ tiger_round( yb, yc, ya, yx[4], ymul ); \ tiger_round( yc, ya, yb, yx[5], ymul ); \ tiger_round( ya, yb, yc, yx[6], ymul ); \ tiger_round( yb, yc, ya, yx[7], ymul ); } #define key_schedule(x) { \ x[0] -= x[7] ^ 0xa5a5a5a5a5a5a5a5LL; \ x[1] ^= x[0]; \ x[2] += x[1]; \ x[3] -= x[2] ^ ((~x[1]) << 19 ); \ x[4] ^= x[3]; \ x[5] += x[4]; \ x[6] -= x[5] ^ ((~x[4]) >> 23 ); \ x[7] ^= x[6]; \ x[0] += x[7]; \ x[1] -= x[0] ^ ((~x[7]) << 19 ); \ x[2] ^= x[1]; \ x[3] += x[2]; \ x[4] -= x[3] ^ ((~x[2]) >> 23 ); \ x[5] ^= x[4]; \ x[6] += x[5]; \ x[7] -= x[6] ^ 0x0123456789abcdefLL; } /**************** * Transform the message DATA which consists of 512 bytes (8 words) */ static unsigned int transform_blk ( void *ctx, const unsigned char *data ) { TIGER_CONTEXT *hd = ctx; u64 a,b,c,aa,bb,cc; u64 x[8]; int i; for ( i = 0; i < 8; i++ ) x[i] = buf_get_le64(data + i * 8); /* save */ a = aa = hd->a; b = bb = hd->b; c = cc = hd->c; pass( a, b, c, x, 5); key_schedule( x ); pass( c, a, b, x, 7); key_schedule( x ); pass( b, c, a, x, 9); /* feedforward */ a ^= aa; b -= bb; c += cc; /* store */ hd->a = a; hd->b = b; hd->c = c; return /*burn_stack*/ 21*8+11*sizeof(void*); } static unsigned int transform ( void *c, const unsigned char *data, size_t nblks ) { unsigned int burn; do { burn = transform_blk (c, data); data += 64; } while (--nblks); return burn; } /* The routine terminates the computation */ static void tiger_final( void *context ) { TIGER_CONTEXT *hd = context; u32 t, th, msb, lsb; byte *p; unsigned int burn; byte pad = hd->variant == 2? 0x80 : 0x01; t = hd->bctx.nblocks; if (sizeof t == sizeof hd->bctx.nblocks) th = hd->bctx.nblocks_high; else th = hd->bctx.nblocks >> 32; /* multiply by 64 to make a byte count */ lsb = t << 6; msb = (th << 6) | (t >> 26); /* add the count */ t = lsb; if( (lsb += hd->bctx.count) < t ) msb++; /* multiply by 8 to make a bit count */ t = lsb; lsb <<= 3; msb <<= 3; msb |= t >> 29; if( hd->bctx.count < 56 ) /* enough room */ { hd->bctx.buf[hd->bctx.count++] = pad; if (hd->bctx.count < 56) memset (&hd->bctx.buf[hd->bctx.count], 0, 56 - hd->bctx.count); /* append the 64 bit count */ buf_put_le32(hd->bctx.buf + 56, lsb); buf_put_le32(hd->bctx.buf + 60, msb); burn = transform( hd, hd->bctx.buf, 1 ); } else /* need one extra block */ { hd->bctx.buf[hd->bctx.count++] = pad; /* pad character */ /* fill pad and next block with zeroes */ memset (&hd->bctx.buf[hd->bctx.count], 0, 64 - hd->bctx.count + 56); /* append the 64 bit count */ buf_put_le32(hd->bctx.buf + 64 + 56, lsb); buf_put_le32(hd->bctx.buf + 64 + 60, msb); burn = transform( hd, hd->bctx.buf, 2 ); } p = hd->bctx.buf; #define X(a) do { buf_put_be64(p, hd->a); p += 8; } while(0) #define Y(a) do { buf_put_le64(p, hd->a); p += 8; } while(0) if (hd->variant == 0) { X(a); X(b); X(c); } else { Y(a); Y(b); Y(c); } #undef X #undef Y hd->bctx.count = 0; _gcry_burn_stack (burn); } static byte * tiger_read( void *context ) { TIGER_CONTEXT *hd = context; return hd->bctx.buf; } /* This is the old TIGER variant based on the unfixed reference implementation. IT was used in GnupG up to 1.3.2. We don't provide an OID anymore because that would not be correct. */ gcry_md_spec_t _gcry_digest_spec_tiger = { GCRY_MD_TIGER, {0, 0}, "TIGER192", NULL, 0, NULL, 24, tiger_init, _gcry_md_block_write, tiger_final, tiger_read, NULL, NULL, sizeof (TIGER_CONTEXT) , GRUB_UTIL_MODNAME("gcry_tiger") .blocksize = 64 }; /* This is the fixed TIGER implementation. */ static const byte asn1[19] = /* Object ID is 1.3.6.1.4.1.11591.12.2 */ { 0x30, 0x29, 0x30, 0x0d, 0x06, 0x09, 0x2b, 0x06, 0x01, 0x04, 0x01, 0xda, 0x47, 0x0c, 0x02, 0x05, 0x00, 0x04, 0x18 }; static const gcry_md_oid_spec_t oid_spec_tiger1[] = { /* GNU.digestAlgorithm TIGER */ { "1.3.6.1.4.1.11591.12.2" }, { NULL } }; gcry_md_spec_t _gcry_digest_spec_tiger1 = { GCRY_MD_TIGER1, {0, 0}, "TIGER", asn1, DIM (asn1), oid_spec_tiger1, 24, tiger1_init, _gcry_md_block_write, tiger_final, tiger_read, NULL, NULL, sizeof (TIGER_CONTEXT) , GRUB_UTIL_MODNAME("gcry_tiger") .blocksize = 64 }; /* This is TIGER2 which usues a changed padding algorithm. */ gcry_md_spec_t _gcry_digest_spec_tiger2 = { GCRY_MD_TIGER2, {0, 0}, "TIGER2", NULL, 0, NULL, 24, tiger2_init, _gcry_md_block_write, tiger_final, tiger_read, NULL, NULL, sizeof (TIGER_CONTEXT) , GRUB_UTIL_MODNAME("gcry_tiger") .blocksize = 64 }; GRUB_MOD_INIT(gcry_tiger) { grub_md_register (&_gcry_digest_spec_tiger); grub_md_register (&_gcry_digest_spec_tiger1); grub_md_register (&_gcry_digest_spec_tiger2); } GRUB_MOD_FINI(gcry_tiger) { grub_md_unregister (&_gcry_digest_spec_tiger); grub_md_unregister (&_gcry_digest_spec_tiger1); grub_md_unregister (&_gcry_digest_spec_tiger2); } grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/cipher/init.c0000644000175000017500000001005515036452441021753 00000000000000#include extern void grub_gcry_arcfour_init (void); extern void grub_gcry_arcfour_fini (void); extern void grub_gcry_aria_init (void); extern void grub_gcry_aria_fini (void); extern void grub_gcry_blake2_init (void); extern void grub_gcry_blake2_fini (void); extern void grub_gcry_blowfish_init (void); extern void grub_gcry_blowfish_fini (void); extern void grub_gcry_camellia_init (void); extern void grub_gcry_camellia_fini (void); extern void grub_gcry_cast5_init (void); extern void grub_gcry_cast5_fini (void); extern void grub_gcry_crc_init (void); extern void grub_gcry_crc_fini (void); extern void grub_gcry_des_init (void); extern void grub_gcry_des_fini (void); extern void grub_gcry_gost28147_init (void); extern void grub_gcry_gost28147_fini (void); extern void grub_gcry_gostr3411_94_init (void); extern void grub_gcry_gostr3411_94_fini (void); extern void grub_gcry_idea_init (void); extern void grub_gcry_idea_fini (void); extern void grub_gcry_keccak_init (void); extern void grub_gcry_keccak_fini (void); extern void grub_gcry_md4_init (void); extern void grub_gcry_md4_fini (void); extern void grub_gcry_md5_init (void); extern void grub_gcry_md5_fini (void); extern void grub_gcry_rfc2268_init (void); extern void grub_gcry_rfc2268_fini (void); extern void grub_gcry_rijndael_init (void); extern void grub_gcry_rijndael_fini (void); extern void grub_gcry_rmd160_init (void); extern void grub_gcry_rmd160_fini (void); extern void grub_gcry_salsa20_init (void); extern void grub_gcry_salsa20_fini (void); extern void grub_gcry_seed_init (void); extern void grub_gcry_seed_fini (void); extern void grub_gcry_serpent_init (void); extern void grub_gcry_serpent_fini (void); extern void grub_gcry_sha1_init (void); extern void grub_gcry_sha1_fini (void); extern void grub_gcry_sha256_init (void); extern void grub_gcry_sha256_fini (void); extern void grub_gcry_sha512_init (void); extern void grub_gcry_sha512_fini (void); extern void grub_gcry_sm3_init (void); extern void grub_gcry_sm3_fini (void); extern void grub_gcry_sm4_init (void); extern void grub_gcry_sm4_fini (void); extern void grub_gcry_stribog_init (void); extern void grub_gcry_stribog_fini (void); extern void grub_gcry_tiger_init (void); extern void grub_gcry_tiger_fini (void); extern void grub_gcry_twofish_init (void); extern void grub_gcry_twofish_fini (void); extern void grub_gcry_whirlpool_init (void); extern void grub_gcry_whirlpool_fini (void); void grub_gcry_init_all (void) { grub_gcry_arcfour_init (); grub_gcry_aria_init (); grub_gcry_blake2_init (); grub_gcry_blowfish_init (); grub_gcry_camellia_init (); grub_gcry_cast5_init (); grub_gcry_crc_init (); grub_gcry_des_init (); grub_gcry_gost28147_init (); grub_gcry_gostr3411_94_init (); grub_gcry_idea_init (); grub_gcry_keccak_init (); grub_gcry_md4_init (); grub_gcry_md5_init (); grub_gcry_rfc2268_init (); grub_gcry_rijndael_init (); grub_gcry_rmd160_init (); grub_gcry_salsa20_init (); grub_gcry_seed_init (); grub_gcry_serpent_init (); grub_gcry_sha1_init (); grub_gcry_sha256_init (); grub_gcry_sha512_init (); grub_gcry_sm3_init (); grub_gcry_sm4_init (); grub_gcry_stribog_init (); grub_gcry_tiger_init (); grub_gcry_twofish_init (); grub_gcry_whirlpool_init (); } void grub_gcry_fini_all (void) { grub_gcry_arcfour_fini (); grub_gcry_aria_fini (); grub_gcry_blake2_fini (); grub_gcry_blowfish_fini (); grub_gcry_camellia_fini (); grub_gcry_cast5_fini (); grub_gcry_crc_fini (); grub_gcry_des_fini (); grub_gcry_gost28147_fini (); grub_gcry_gostr3411_94_fini (); grub_gcry_idea_fini (); grub_gcry_keccak_fini (); grub_gcry_md4_fini (); grub_gcry_md5_fini (); grub_gcry_rfc2268_fini (); grub_gcry_rijndael_fini (); grub_gcry_rmd160_fini (); grub_gcry_salsa20_fini (); grub_gcry_seed_fini (); grub_gcry_serpent_fini (); grub_gcry_sha1_fini (); grub_gcry_sha256_fini (); grub_gcry_sha512_fini (); grub_gcry_sm3_fini (); grub_gcry_sm4_fini (); grub_gcry_stribog_fini (); grub_gcry_tiger_fini (); grub_gcry_twofish_fini (); grub_gcry_whirlpool_fini (); } grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/cipher/rijndael-internal.h0000644000175000017500000001670415036452441024426 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ /* Rijndael (AES) for GnuPG * Copyright (C) 2000, 2001, 2002, 2003, 2007, * 2008, 2011, 2012 Free Software Foundation, Inc. * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . */ #ifndef G10_RIJNDAEL_INTERNAL_H #define G10_RIJNDAEL_INTERNAL_H #include "types.h" /* for byte and u32 typedefs */ #define MAXKC (256/32) #define MAXROUNDS 14 #define BLOCKSIZE (128/8) /* Helper macro to force alignment to 16 or 64 bytes. */ #ifdef HAVE_GCC_ATTRIBUTE_ALIGNED # define ATTR_ALIGNED_16 __attribute__ ((aligned (16))) # define ATTR_ALIGNED_64 __attribute__ ((aligned (64))) #else # define ATTR_ALIGNED_16 # define ATTR_ALIGNED_64 #endif /* USE_AMD64_ASM indicates whether to use AMD64 assembly code. */ #undef USE_AMD64_ASM #if defined(__x86_64__) && (defined(HAVE_COMPATIBLE_GCC_AMD64_PLATFORM_AS) || \ defined(HAVE_COMPATIBLE_GCC_WIN64_PLATFORM_AS)) # define USE_AMD64_ASM 1 #endif /* USE_SSSE3 indicates whether to use SSSE3 code. */ #if defined(__x86_64__) && defined(HAVE_GCC_INLINE_ASM_SSSE3) && \ (defined(HAVE_COMPATIBLE_GCC_AMD64_PLATFORM_AS) || \ defined(HAVE_COMPATIBLE_GCC_WIN64_PLATFORM_AS)) # define USE_SSSE3 1 #endif /* USE_ARM_ASM indicates whether to use ARM assembly code. */ #undef USE_ARM_ASM #if defined(__ARMEL__) # ifdef HAVE_COMPATIBLE_GCC_ARM_PLATFORM_AS # define USE_ARM_ASM 1 # endif #endif #if defined(__AARCH64EL__) # ifdef HAVE_COMPATIBLE_GCC_AARCH64_PLATFORM_AS # define USE_ARM_ASM 1 # endif #endif /* USE_PADLOCK indicates whether to compile the padlock specific code. */ #undef USE_PADLOCK #ifdef ENABLE_PADLOCK_SUPPORT # ifdef HAVE_GCC_ATTRIBUTE_ALIGNED # if (defined (__i386__) && SIZEOF_UNSIGNED_LONG == 4) || defined(__x86_64__) # define USE_PADLOCK 1 # endif # endif #endif /* ENABLE_PADLOCK_SUPPORT */ /* USE_AESNI inidicates whether to compile with Intel AES-NI code. We need the vector-size attribute which seems to be available since gcc 3. However, to be on the safe side we require at least gcc 4. */ #undef USE_AESNI #ifdef ENABLE_AESNI_SUPPORT # if ((defined (__i386__) && SIZEOF_UNSIGNED_LONG == 4) || defined(__x86_64__)) # if __GNUC__ >= 4 # define USE_AESNI 1 # endif # endif #endif /* ENABLE_AESNI_SUPPORT */ /* USE_VAES inidicates whether to compile with AMD64 VAES code. */ #undef USE_VAES #if (defined(HAVE_COMPATIBLE_GCC_AMD64_PLATFORM_AS) || \ defined(HAVE_COMPATIBLE_GCC_WIN64_PLATFORM_AS)) && \ defined(__x86_64__) && defined(ENABLE_AVX2_SUPPORT) && \ defined(HAVE_GCC_INLINE_ASM_VAES_VPCLMUL) && \ defined(USE_AESNI) # define USE_VAES 1 #endif /* USE_VAES_I386 inidicates whether to compile with i386 VAES code. */ #undef USE_VAES_I386 #if (defined(HAVE_COMPATIBLE_GCC_I386_PLATFORM_AS) || \ defined(HAVE_COMPATIBLE_GCC_WIN32_PLATFORM_AS)) && \ defined(__i386__) && defined(ENABLE_AVX2_SUPPORT) && \ defined(HAVE_GCC_INLINE_ASM_VAES_VPCLMUL) && \ defined(USE_AESNI) # define USE_VAES_I386 1 #endif /* USE_ARM_CE indicates whether to enable ARMv8 Crypto Extension assembly * code. */ #undef USE_ARM_CE #ifdef ENABLE_ARM_CRYPTO_SUPPORT # if defined(HAVE_ARM_ARCH_V6) && defined(__ARMEL__) \ && defined(HAVE_COMPATIBLE_GCC_ARM_PLATFORM_AS) \ && defined(HAVE_GCC_INLINE_ASM_AARCH32_CRYPTO) # define USE_ARM_CE 1 # elif defined(__AARCH64EL__) \ && defined(HAVE_COMPATIBLE_GCC_AARCH64_PLATFORM_AS) \ && defined(HAVE_GCC_INLINE_ASM_AARCH64_CRYPTO) # define USE_ARM_CE 1 # endif #endif /* ENABLE_ARM_CRYPTO_SUPPORT */ /* USE_PPC_CRYPTO indicates whether to enable PowerPC vector crypto * accelerated code. USE_PPC_CRYPTO_WITH_PPC9LE indicates whether to * enable POWER9 optimized variant. */ #undef USE_PPC_CRYPTO #undef USE_PPC_CRYPTO_WITH_PPC9LE #ifdef ENABLE_PPC_CRYPTO_SUPPORT # if defined(HAVE_COMPATIBLE_CC_PPC_ALTIVEC) && \ defined(HAVE_GCC_INLINE_ASM_PPC_ALTIVEC) # if __GNUC__ >= 4 # define USE_PPC_CRYPTO 1 # if !defined(WORDS_BIGENDIAN) && defined(HAVE_GCC_INLINE_ASM_PPC_ARCH_3_00) # define USE_PPC_CRYPTO_WITH_PPC9LE 1 # endif # endif # endif #endif /* ENABLE_PPC_CRYPTO_SUPPORT */ /* USE_S390X_CRYPTO indicates whether to enable zSeries code. */ #undef USE_S390X_CRYPTO #if defined(HAVE_GCC_INLINE_ASM_S390X) # define USE_S390X_CRYPTO 1 #endif /* USE_S390X_CRYPTO */ struct RIJNDAEL_context_s; typedef unsigned int (*rijndael_cryptfn_t)(const struct RIJNDAEL_context_s *ctx, unsigned char *bx, const unsigned char *ax); typedef void (*rijndael_prefetchfn_t)(void); typedef void (*rijndael_prepare_decfn_t)(struct RIJNDAEL_context_s *ctx); /* Our context object. */ typedef struct RIJNDAEL_context_s { /* The first fields are the keyschedule arrays. This is so that they are aligned on a 16 byte boundary if using gcc. This alignment is required for the AES-NI code and a good idea in any case. The alignment is guaranteed due to the way cipher.c allocates the space for the context. The PROPERLY_ALIGNED_TYPE hack is used to force a minimal alignment if not using gcc of if the alignment requirement is higher that 16 bytes. */ union { PROPERLY_ALIGNED_TYPE dummy; byte keyschedule[MAXROUNDS+1][4][4]; u32 keyschedule32[MAXROUNDS+1][4]; u32 keyschedule32b[(MAXROUNDS+1)*4]; #ifdef USE_PADLOCK /* The key as passed to the padlock engine. It is only used if the padlock engine is used (USE_PADLOCK, below). */ unsigned char padlock_key[16] __attribute__ ((aligned (16))); #endif /*USE_PADLOCK*/ } u1; union { PROPERLY_ALIGNED_TYPE dummy; byte keyschedule[MAXROUNDS+1][4][4]; u32 keyschedule32[MAXROUNDS+1][4]; } u2; int rounds; /* Key-length-dependent number of rounds. */ unsigned int decryption_prepared:1; /* The decryption key schedule is available. */ #ifdef USE_AESNI unsigned int use_avx:1; /* AVX shall be used by AES-NI implementation. */ unsigned int use_avx2:1; /* AVX2 shall be used by AES-NI implementation. */ #endif /*USE_AESNI*/ #ifdef USE_S390X_CRYPTO byte km_func; byte km_func_xts; byte kmc_func; byte kmac_func; byte kmf_func; byte kmo_func; byte kma_func; #endif /*USE_S390X_CRYPTO*/ rijndael_cryptfn_t encrypt_fn; rijndael_cryptfn_t decrypt_fn; rijndael_prefetchfn_t prefetch_enc_fn; rijndael_prefetchfn_t prefetch_dec_fn; rijndael_prepare_decfn_t prepare_decryption; } RIJNDAEL_context ATTR_ALIGNED_16; /* Macros defining alias for the keyschedules. */ #define keyschenc u1.keyschedule #define keyschenc32 u1.keyschedule32 #define keyschenc32b u1.keyschedule32b #define keyschdec u2.keyschedule #define keyschdec32 u2.keyschedule32 #define padlockkey u1.padlock_key #endif /* G10_RIJNDAEL_INTERNAL_H */ grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/cipher/asm-inline-s390x.h0000644000175000017500000001251515036452441023740 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ /* asm-inline-s390x.h - Common macros for zSeries inline assembly * * Copyright (C) 2020 Jussi Kivilinna * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . */ #ifndef GCRY_ASM_INLINE_S390X_H #define GCRY_ASM_INLINE_S390X_H #define ALWAYS_INLINE inline __attribute__((always_inline)) typedef unsigned int u128_t __attribute__ ((mode (TI))); enum kmxx_functions_e { KM_FUNCTION_AES_128 = 18, KM_FUNCTION_AES_192 = 19, KM_FUNCTION_AES_256 = 20, KM_FUNCTION_XTS_AES_128 = 50, KM_FUNCTION_XTS_AES_256 = 52, KMID_FUNCTION_SHA1 = 1, KMID_FUNCTION_SHA256 = 2, KMID_FUNCTION_SHA512 = 3, KMID_FUNCTION_SHA3_224 = 32, KMID_FUNCTION_SHA3_256 = 33, KMID_FUNCTION_SHA3_384 = 34, KMID_FUNCTION_SHA3_512 = 35, KMID_FUNCTION_SHAKE128 = 36, KMID_FUNCTION_SHAKE256 = 37, KMID_FUNCTION_GHASH = 65, PCC_FUNCTION_NIST_P256 = 64, PCC_FUNCTION_NIST_P384 = 65, PCC_FUNCTION_NIST_P521 = 66, PCC_FUNCTION_ED25519 = 72, PCC_FUNCTION_ED448 = 73, PCC_FUNCTION_X25519 = 80, PCC_FUNCTION_X448 = 81 }; enum kmxx_function_flags_e { KM_ENCRYPT = 0 << 7, KM_DECRYPT = 1 << 7, KMF_LCFB_16 = 16 << 24, KMA_LPC = 1 << 8, KMA_LAAD = 1 << 9, KMA_HS = 1 << 10, KLMD_PADDING_STATE = 1 << 8, }; static ALWAYS_INLINE u128_t km_function_to_mask(enum kmxx_functions_e func) { return (u128_t)1 << (127 - func); } static inline u128_t kimd_query(void) { static u128_t function_codes = 0; static int initialized = 0; register unsigned long reg0 asm("0") = 0; register void *reg1 asm("1") = &function_codes; u128_t r1; if (initialized) return function_codes; asm volatile ("0: .insn rre,0xb93e << 16, 0, %[r1]\n\t" " brc 1,0b\n\t" : [r1] "=a" (r1) : [reg0] "r" (reg0), [reg1] "r" (reg1) : "cc", "memory"); initialized = 1; return function_codes; } static inline u128_t klmd_query(void) { static u128_t function_codes = 0; static int initialized = 0; register unsigned long reg0 asm("0") = 0; register void *reg1 asm("1") = &function_codes; u128_t r1; if (initialized) return function_codes; asm volatile ("0: .insn rre,0xb93f << 16, 0, %[r1]\n\t" " brc 1,0b\n\t" : [r1] "=a" (r1) : [reg0] "r" (reg0), [reg1] "r" (reg1) : "cc", "memory"); initialized = 1; return function_codes; } static inline u128_t pcc_query(void) { static u128_t function_codes = 0; static int initialized = 0; register unsigned long reg0 asm("0") = 0; register void *reg1 asm("1") = &function_codes; if (initialized) return function_codes; asm volatile ("0: .insn rre,0xb92c << 16, 0, 0\n\t" " brc 1,0b\n\t" : : [reg0] "r" (reg0), [reg1] "r" (reg1) : "cc", "memory"); initialized = 1; return function_codes; } static ALWAYS_INLINE void kimd_execute(unsigned int func, void *param_block, const void *src, size_t src_len) { register unsigned long reg0 asm("0") = func; register byte *reg1 asm("1") = param_block; u128_t r1 = ((u128_t)(uintptr_t)src << 64) | (u64)src_len; asm volatile ("0: .insn rre,0xb93e << 16, 0, %[r1]\n\t" " brc 1,0b\n\t" : [r1] "+a" (r1) : [func] "r" (reg0), [param_ptr] "r" (reg1) : "cc", "memory"); } static ALWAYS_INLINE void klmd_execute(unsigned int func, void *param_block, const void *src, size_t src_len) { register unsigned long reg0 asm("0") = func; register byte *reg1 asm("1") = param_block; u128_t r1 = ((u128_t)(uintptr_t)src << 64) | (u64)src_len; asm volatile ("0: .insn rre,0xb93f << 16, 0, %[r1]\n\t" " brc 1,0b\n\t" : [func] "+r" (reg0), [r1] "+a" (r1) : [param_ptr] "r" (reg1) : "cc", "memory"); } static ALWAYS_INLINE void klmd_shake_execute(unsigned int func, void *param_block, void *dst, size_t dst_len, const void *src, size_t src_len) { register unsigned long reg0 asm("0") = func; register byte *reg1 asm("1") = param_block; u128_t r1 = ((u128_t)(uintptr_t)dst << 64) | (u64)dst_len; u128_t r2 = ((u128_t)(uintptr_t)src << 64) | (u64)src_len; asm volatile ("0: .insn rre,0xb93f << 16, %[r1], %[r2]\n\t" " brc 1,0b\n\t" : [func] "+r" (reg0), [r1] "+a" (r1), [r2] "+a" (r2) : [param_ptr] "r" (reg1) : "cc", "memory"); } static ALWAYS_INLINE unsigned int pcc_scalar_multiply(unsigned int func, void *param_block) { register unsigned long reg0 asm("0") = func; register byte *reg1 asm("1") = param_block; register unsigned long error = 0; asm volatile ("0: .insn rre,0xb92c << 16, 0, 0\n\t" " brc 1,0b\n\t" " brc 7,1f\n\t" " j 2f\n\t" "1: lhi %[error], 1\n\t" "2:\n\t" : [func] "+r" (reg0), [error] "+r" (error) : [param_ptr] "r" (reg1) : "cc", "memory"); return error; } #endif /* GCRY_ASM_INLINE_S390X_H */ grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/cipher/md4.c0000644000175000017500000001724515036452441021504 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ #include GRUB_MOD_LICENSE ("GPLv3+"); /* md4.c - MD4 Message-Digest Algorithm * Copyright (C) 2002, 2003 Free Software Foundation, Inc. * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . * SPDX-License-Identifier: LGPL-2.1-or-later * * Based on md5.c in libgcrypt, but rewritten to compute md4 checksums * using a public domain md4 implementation with the following comments: * * Modified by Wei Dai from Andrew M. Kuchling's md4.c * The original code and all modifications are in the public domain. * * This is the original introductory comment: * * md4.c : MD4 hash algorithm. * * Part of the Python Cryptography Toolkit, version 1.1 * * Distribute and use freely; there are no restrictions on further * dissemination and usage except those imposed by the laws of your * country of residence. * */ /* MD4 test suite: * MD4 ("") = 31d6cfe0d16ae931b73c59d7e0c089c0 * MD4 ("a") = bde52cb31de33e46245e05fbdbd6fb24 * MD4 ("abc") = a448017aaf21d8525fc10ae87aa6729d * MD4 ("message digest") = d9130a8164549fe818874806e1c7014b * MD4 ("abcdefghijklmnopqrstuvwxyz") = d79e1c308aa5bbcdeea8ed63df412da9 * MD4 ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") = * 043f8582f241db351ce627e153e7f0e4 * MD4 ("123456789012345678901234567890123456789012345678901234567890123456 * 78901234567890") = e33b4ddc9c38f2199c3e7b164fcc0536 */ #include "g10lib.h" #include "cipher.h" #include "bithelp.h" #include "bufhelp.h" #include "hash-common.h" typedef struct { gcry_md_block_ctx_t bctx; u32 A,B,C,D; /* chaining variables */ } MD4_CONTEXT; static unsigned int transform ( void *c, const unsigned char *data, size_t nblks ); static void md4_init (void *context, unsigned int flags) { MD4_CONTEXT *ctx = context; (void)flags; ctx->A = 0x67452301; ctx->B = 0xefcdab89; ctx->C = 0x98badcfe; ctx->D = 0x10325476; ctx->bctx.nblocks = 0; ctx->bctx.nblocks_high = 0; ctx->bctx.count = 0; ctx->bctx.blocksize_shift = _gcry_ctz(64); ctx->bctx.bwrite = transform; } #define F(x, y, z) ((z) ^ ((x) & ((y) ^ (z)))) #define G(x, y, z) (((x) & (y)) | ((x) & (z)) | ((y) & (z))) #define H(x, y, z) ((x) ^ (y) ^ (z)) /**************** * transform 64 bytes */ static unsigned int transform_blk ( void *c, const unsigned char *data ) { MD4_CONTEXT *ctx = c; u32 in[16]; register u32 A = ctx->A; register u32 B = ctx->B; register u32 C = ctx->C; register u32 D = ctx->D; int i; for ( i = 0; i < 16; i++ ) in[i] = buf_get_le32(data + i * 4); /* Round 1. */ #define function(a,b,c,d,k,s) a=rol(a+F(b,c,d)+in[k],s); function(A,B,C,D, 0, 3); function(D,A,B,C, 1, 7); function(C,D,A,B, 2,11); function(B,C,D,A, 3,19); function(A,B,C,D, 4, 3); function(D,A,B,C, 5, 7); function(C,D,A,B, 6,11); function(B,C,D,A, 7,19); function(A,B,C,D, 8, 3); function(D,A,B,C, 9, 7); function(C,D,A,B,10,11); function(B,C,D,A,11,19); function(A,B,C,D,12, 3); function(D,A,B,C,13, 7); function(C,D,A,B,14,11); function(B,C,D,A,15,19); #undef function /* Round 2. */ #define function(a,b,c,d,k,s) a=rol(a+G(b,c,d)+in[k]+0x5a827999,s); function(A,B,C,D, 0, 3); function(D,A,B,C, 4, 5); function(C,D,A,B, 8, 9); function(B,C,D,A,12,13); function(A,B,C,D, 1, 3); function(D,A,B,C, 5, 5); function(C,D,A,B, 9, 9); function(B,C,D,A,13,13); function(A,B,C,D, 2, 3); function(D,A,B,C, 6, 5); function(C,D,A,B,10, 9); function(B,C,D,A,14,13); function(A,B,C,D, 3, 3); function(D,A,B,C, 7, 5); function(C,D,A,B,11, 9); function(B,C,D,A,15,13); #undef function /* Round 3. */ #define function(a,b,c,d,k,s) a=rol(a+H(b,c,d)+in[k]+0x6ed9eba1,s); function(A,B,C,D, 0, 3); function(D,A,B,C, 8, 9); function(C,D,A,B, 4,11); function(B,C,D,A,12,15); function(A,B,C,D, 2, 3); function(D,A,B,C,10, 9); function(C,D,A,B, 6,11); function(B,C,D,A,14,15); function(A,B,C,D, 1, 3); function(D,A,B,C, 9, 9); function(C,D,A,B, 5,11); function(B,C,D,A,13,15); function(A,B,C,D, 3, 3); function(D,A,B,C,11, 9); function(C,D,A,B, 7,11); function(B,C,D,A,15,15); /* Put checksum in context given as argument. */ ctx->A += A; ctx->B += B; ctx->C += C; ctx->D += D; return /*burn_stack*/ 80+6*sizeof(void*); } static unsigned int transform ( void *c, const unsigned char *data, size_t nblks ) { unsigned int burn; do { burn = transform_blk (c, data); data += 64; } while (--nblks); return burn; } /* The routine final terminates the message-digest computation and * ends with the desired message digest in mdContext->digest[0...15]. * The handle is prepared for a new MD4 cycle. * Returns 16 bytes representing the digest. */ static void md4_final( void *context ) { MD4_CONTEXT *hd = context; u32 t, th, msb, lsb; byte *p; unsigned int burn; t = hd->bctx.nblocks; if (sizeof t == sizeof hd->bctx.nblocks) th = hd->bctx.nblocks_high; else th = hd->bctx.nblocks >> 32; /* multiply by 64 to make a byte count */ lsb = t << 6; msb = (th << 6) | (t >> 26); /* add the count */ t = lsb; if( (lsb += hd->bctx.count) < t ) msb++; /* multiply by 8 to make a bit count */ t = lsb; lsb <<= 3; msb <<= 3; msb |= t >> 29; if (hd->bctx.count < 56) /* enough room */ { hd->bctx.buf[hd->bctx.count++] = 0x80; /* pad */ if (hd->bctx.count < 56) memset (&hd->bctx.buf[hd->bctx.count], 0, 56 - hd->bctx.count); /* append the 64 bit count */ buf_put_le32(hd->bctx.buf + 56, lsb); buf_put_le32(hd->bctx.buf + 60, msb); burn = transform (hd, hd->bctx.buf, 1); } else /* need one extra block */ { hd->bctx.buf[hd->bctx.count++] = 0x80; /* pad character */ /* fill pad and next block with zeroes */ memset (&hd->bctx.buf[hd->bctx.count], 0, 64 - hd->bctx.count + 56); /* append the 64 bit count */ buf_put_le32(hd->bctx.buf + 64 + 56, lsb); buf_put_le32(hd->bctx.buf + 64 + 60, msb); burn = transform (hd, hd->bctx.buf, 2); } p = hd->bctx.buf; #define X(a) do { buf_put_le32(p, hd->a); p += 4; } while(0) X(A); X(B); X(C); X(D); #undef X hd->bctx.count = 0; _gcry_burn_stack (burn); } static byte * md4_read (void *context) { MD4_CONTEXT *hd = context; return hd->bctx.buf; } static const byte asn[18] = /* Object ID is 1.2.840.113549.2.4 */ { 0x30, 0x20, 0x30, 0x0c, 0x06, 0x08, 0x2a, 0x86,0x48, 0x86, 0xf7, 0x0d, 0x02, 0x04, 0x05, 0x00, 0x04, 0x10 }; static const gcry_md_oid_spec_t oid_spec_md4[] = { /* iso.member-body.us.rsadsi.digestAlgorithm.md4 */ { "1.2.840.113549.2.4" }, { NULL }, }; gcry_md_spec_t _gcry_digest_spec_md4 = { GCRY_MD_MD4, {0, 0}, "MD4", asn, DIM (asn), oid_spec_md4,16, md4_init, _gcry_md_block_write, md4_final, md4_read, NULL, NULL, sizeof (MD4_CONTEXT) , GRUB_UTIL_MODNAME("gcry_md4") .blocksize = 64 }; GRUB_MOD_INIT(gcry_md4) { grub_md_register (&_gcry_digest_spec_md4); } GRUB_MOD_FINI(gcry_md4) { grub_md_unregister (&_gcry_digest_spec_md4); } grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/cipher/mceliece6688128f.h0000644000175000017500000000403515036452441023521 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ /* mceliece6688128f.h - Classic McEliece for libgcrypt * Copyright (C) 2023-2024 Simon Josefsson * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . * SPDX-License-Identifier: LGPL-2.1-or-later * */ #ifndef MCELIECE6688128F_H #define MCELIECE6688128F_H #ifdef _GCRYPT_IN_LIBGCRYPT /**** Start of the glue code to libgcrypt ****/ #include "g10lib.h" /* for GCC_ATTR_UNUSED */ #include "gcrypt-int.h" #define mceliece6688128f_keypair _gcry_mceliece6688128f_keypair #define mceliece6688128f_enc _gcry_mceliece6688128f_enc #define mceliece6688128f_dec _gcry_mceliece6688128f_dec /**** End of the glue code ****/ #else #if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 5 ) #define GCC_ATTR_UNUSED __attribute__ ((unused)) #else #define GCC_ATTR_UNUSED #endif #define MCELIECE6688128F_SECRETKEY_SIZE 13932 #define MCELIECE6688128F_PUBLICKEY_SIZE 1044992 #define MCELIECE6688128F_CIPHERTEXT_SIZE 208 #define MCELIECE6688128F_SIZE 32 #endif typedef void mceliece6688128f_random_func (void *ctx, size_t length, uint8_t *dst); void mceliece6688128f_keypair (uint8_t *pk, uint8_t *sk); void mceliece6688128f_enc (uint8_t *c, uint8_t *k, const uint8_t *pk); void mceliece6688128f_dec (uint8_t *k, const uint8_t *c, const uint8_t *sk); #endif /* MCELIECE6688128F_H */ grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/cipher/dsa.c0000644000175000017500000002360315036452441021562 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ #include GRUB_MOD_LICENSE ("GPLv3+"); /* dsa.c - DSA signature algorithm * Copyright (C) 1998, 2000, 2001, 2002, 2003, * 2006, 2008 Free Software Foundation, Inc. * Copyright (C) 2013 g10 Code GmbH. * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . */ #include "g10lib.h" #include "mpi.h" #include "cipher.h" #include "pubkey-internal.h" typedef struct { gcry_mpi_t p; /* prime */ gcry_mpi_t q; /* group order */ gcry_mpi_t g; /* group generator */ gcry_mpi_t y; /* g^x mod p */ } DSA_public_key; typedef struct { gcry_mpi_t p; /* prime */ gcry_mpi_t q; /* group order */ gcry_mpi_t g; /* group generator */ gcry_mpi_t y; /* g^x mod p */ gcry_mpi_t x; /* secret exponent */ } DSA_secret_key; /* A structure used to hold domain parameters. */ typedef struct { gcry_mpi_t p; /* prime */ gcry_mpi_t q; /* group order */ gcry_mpi_t g; /* group generator */ } dsa_domain_t; static const char *dsa_names[] = { "dsa", "openpgp-dsa", NULL, }; /* A sample 1024 bit DSA key used for the selftests. Not anymore * used, kept only for reference. */ #if 0 /* A sample 1024 bit DSA key used for the selftests (public only). */ #endif /*0*/ /* 2048 DSA key from RFC 6979 A.2.2 */ static int check_secret_key (DSA_secret_key *sk); static gpg_err_code_t verify (gcry_mpi_t r, gcry_mpi_t s, gcry_mpi_t input, DSA_public_key *pkey, int flags, int hashalgo); static unsigned int dsa_get_nbits (gcry_sexp_t parms); /* Check the DSA key length is acceptable for key generation or usage */ static gpg_err_code_t dsa_check_keysize (unsigned int nbits) { if (fips_mode () && nbits < 2048) return GPG_ERR_INV_VALUE; return 0; } /* Check that a freshly generated key actually works. Returns 0 on success. */ /* Generate a DSA key pair with a key of size NBITS. If transient_key is true the key is generated using the standard RNG and not the very secure one. Returns: 2 structures filled with all needed values and an array with the n-1 factors of (p-1) */ /* Generate a DSA key pair with a key of size NBITS using the algorithm given in FIPS-186-3. If USE_FIPS186_2 is true, FIPS-186-2 is used and thus the length is restricted to 1024/160. If DERIVEPARMS is not NULL it may contain a seed value. If domain parameters are specified in DOMAIN, DERIVEPARMS may not be given and NBITS and QBITS must match the specified domain parameters. */ /* Test whether the secret key is valid. Returns: if this is a valid key. */ static int check_secret_key( DSA_secret_key *sk ) { int rc; gcry_mpi_t y = mpi_alloc( mpi_get_nlimbs(sk->y) ); mpi_powm( y, sk->g, sk->x, sk->p ); rc = !mpi_cmp( y, sk->y ); mpi_free( y ); return rc; } /* Make a DSA signature from INPUT and put it into r and s. INPUT may either be a plain MPI or an opaque MPI which is then internally converted to a plain MPI. FLAGS and HASHALGO may both be 0 for standard operation mode. The random value, K_SUPPLIED, may be supplied externally. If not, it is generated internally. The return value is 0 on success or an error code. Note that for backward compatibility the function will not return any error if FLAGS and HASHALGO are both 0 and INPUT is a plain MPI. */ /* Returns true if the signature composed from R and S is valid. */ static gpg_err_code_t verify (gcry_mpi_t r, gcry_mpi_t s, gcry_mpi_t input, DSA_public_key *pkey, int flags, int hashalgo) { gpg_err_code_t rc = 0; gcry_mpi_t w, u1, u2, v; gcry_mpi_t base[3]; gcry_mpi_t ex[3]; gcry_mpi_t hash; unsigned int nbits; gcry_mpi_t hash_computed_internally = NULL; if( !(mpi_cmp_ui( r, 0 ) > 0 && mpi_cmp( r, pkey->q ) < 0) ) return GPG_ERR_BAD_SIGNATURE; /* Assertion 0 < r < n failed. */ if( !(mpi_cmp_ui( s, 0 ) > 0 && mpi_cmp( s, pkey->q ) < 0) ) return GPG_ERR_BAD_SIGNATURE; /* Assertion 0 < s < n failed. */ nbits = mpi_get_nbits (pkey->q); if ((flags & PUBKEY_FLAG_PREHASH)) { rc = _gcry_dsa_compute_hash (&hash_computed_internally, input, hashalgo); if (rc) return rc; input = hash_computed_internally; } rc = _gcry_dsa_normalize_hash (input, &hash, nbits); if (rc) { mpi_free (hash_computed_internally); return rc; } w = mpi_alloc( mpi_get_nlimbs(pkey->q) ); u1 = mpi_alloc( mpi_get_nlimbs(pkey->q) ); u2 = mpi_alloc( mpi_get_nlimbs(pkey->q) ); v = mpi_alloc( mpi_get_nlimbs(pkey->p) ); /* w = s^(-1) mod q */ mpi_invm( w, s, pkey->q ); /* u1 = (hash * w) mod q */ mpi_mulm( u1, hash, w, pkey->q ); /* u2 = r * w mod q */ mpi_mulm( u2, r, w, pkey->q ); /* v = g^u1 * y^u2 mod p mod q */ base[0] = pkey->g; ex[0] = u1; base[1] = pkey->y; ex[1] = u2; base[2] = NULL; ex[2] = NULL; mpi_mulpowm( v, base, ex, pkey->p ); mpi_fdiv_r( v, v, pkey->q ); if (mpi_cmp( v, r )) { if (DBG_CIPHER) { log_mpidump (" i", input); log_mpidump (" h", hash); log_mpidump (" v", v); log_mpidump (" r", r); log_mpidump (" s", s); } rc = GPG_ERR_BAD_SIGNATURE; } mpi_free(w); mpi_free(u1); mpi_free(u2); mpi_free(v); if (hash != input) mpi_free (hash); mpi_free (hash_computed_internally); return rc; } /********************************************* ************** interface ****************** *********************************************/ #define dsa_generate 0 static gcry_err_code_t dsa_check_secret_key (gcry_sexp_t keyparms) { gcry_err_code_t rc; DSA_secret_key sk = {NULL, NULL, NULL, NULL, NULL}; rc = _gcry_sexp_extract_param (keyparms, NULL, "pqgyx", &sk.p, &sk.q, &sk.g, &sk.y, &sk.x, NULL); if (rc) goto leave; if (!check_secret_key (&sk)) rc = GPG_ERR_BAD_SECKEY; leave: _gcry_mpi_release (sk.p); _gcry_mpi_release (sk.q); _gcry_mpi_release (sk.g); _gcry_mpi_release (sk.y); _gcry_mpi_release (sk.x); if (DBG_CIPHER) log_debug ("dsa_testkey => %s\n", gpg_strerror (rc)); return rc; } #define dsa_sign 0 static gcry_err_code_t dsa_verify (gcry_sexp_t s_sig, gcry_sexp_t s_data, gcry_sexp_t s_keyparms) { gcry_err_code_t rc; struct pk_encoding_ctx ctx; gcry_sexp_t l1 = NULL; gcry_mpi_t sig_r = NULL; gcry_mpi_t sig_s = NULL; gcry_mpi_t data = NULL; DSA_public_key pk = { NULL, NULL, NULL, NULL }; unsigned int nbits = dsa_get_nbits (s_keyparms); rc = dsa_check_keysize (nbits); if (rc) return rc; _gcry_pk_util_init_encoding_ctx (&ctx, PUBKEY_OP_VERIFY, nbits); /* Extract the data. */ rc = _gcry_pk_util_data_to_mpi (s_data, &data, &ctx); if (rc) goto leave; if (DBG_CIPHER) log_mpidump ("dsa_verify data", data); /* Extract the signature value. */ rc = _gcry_pk_util_preparse_sigval (s_sig, dsa_names, &l1, NULL); if (rc) goto leave; rc = _gcry_sexp_extract_param (l1, NULL, "rs", &sig_r, &sig_s, NULL); if (rc) goto leave; if (DBG_CIPHER) { log_mpidump ("dsa_verify s_r", sig_r); log_mpidump ("dsa_verify s_s", sig_s); } /* Extract the key. */ rc = _gcry_sexp_extract_param (s_keyparms, NULL, "pqgy", &pk.p, &pk.q, &pk.g, &pk.y, NULL); if (rc) goto leave; if (DBG_CIPHER) { log_mpidump ("dsa_verify p", pk.p); log_mpidump ("dsa_verify q", pk.q); log_mpidump ("dsa_verify g", pk.g); log_mpidump ("dsa_verify y", pk.y); } /* Verify the signature. */ rc = verify (sig_r, sig_s, data, &pk, ctx.flags, ctx.hash_algo); leave: _gcry_mpi_release (pk.p); _gcry_mpi_release (pk.q); _gcry_mpi_release (pk.g); _gcry_mpi_release (pk.y); _gcry_mpi_release (data); _gcry_mpi_release (sig_r); _gcry_mpi_release (sig_s); sexp_release (l1); _gcry_pk_util_free_encoding_ctx (&ctx); if (DBG_CIPHER) log_debug ("dsa_verify => %s\n", rc?gpg_strerror (rc):"Good"); return rc; } /* Return the number of bits for the key described by PARMS. On error * 0 is returned. The format of PARMS starts with the algorithm name; * for example: * * (dsa * (p ) * (q ) * (g ) * (y )) * * More parameters may be given but we only need P here. */ static unsigned int dsa_get_nbits (gcry_sexp_t parms) { gcry_sexp_t l1; gcry_mpi_t p; unsigned int nbits; l1 = sexp_find_token (parms, "p", 1); if (!l1) return 0; /* Parameter P not found. */ p = sexp_nth_mpi (l1, 1, GCRYMPI_FMT_USG); sexp_release (l1); nbits = p? mpi_get_nbits (p) : 0; _gcry_mpi_release (p); return nbits; } /* Self-test section. */ /* Run a full self-test for ALGO and return 0 on success. */ gcry_pk_spec_t _gcry_pubkey_spec_dsa = { GCRY_PK_DSA, { 0, 0 }, GCRY_PK_USAGE_SIGN, "DSA", dsa_names, "pqgy", "pqgyx", "", "rs", "pqgy", dsa_generate, dsa_check_secret_key, NULL, NULL, dsa_sign, dsa_verify, dsa_get_nbits, GRUB_UTIL_MODNAME("gcry_dsa") }; GRUB_MOD_INIT(gcry_dsa) { grub_crypto_pk_dsa = &_gcry_pubkey_spec_dsa; } GRUB_MOD_FINI(gcry_dsa) { grub_crypto_pk_dsa = 0; } grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/cipher/bufhelp.h0000644000175000017500000002155215036452441022446 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ /* bufhelp.h - Some buffer manipulation helpers * Copyright (C) 2012-2017 Jussi Kivilinna * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . */ #ifndef GCRYPT_BUFHELP_H #define GCRYPT_BUFHELP_H #include "g10lib.h" #include "bithelp.h" #include "const-time.h" #undef BUFHELP_UNALIGNED_ACCESS #if defined(HAVE_GCC_ATTRIBUTE_PACKED) && \ defined(HAVE_GCC_ATTRIBUTE_ALIGNED) && \ defined(HAVE_GCC_ATTRIBUTE_MAY_ALIAS) /* Compiler is supports attributes needed for automatically issuing unaligned memory access instructions. */ # define BUFHELP_UNALIGNED_ACCESS 1 #endif #ifndef BUFHELP_UNALIGNED_ACCESS /* Functions for loading and storing unaligned u32 values of different endianness. */ static inline u32 buf_get_be32(const void *_buf) { const byte *in = _buf; return ((u32)in[0] << 24) | ((u32)in[1] << 16) | \ ((u32)in[2] << 8) | (u32)in[3]; } static inline u32 buf_get_le32(const void *_buf) { const byte *in = _buf; return ((u32)in[3] << 24) | ((u32)in[2] << 16) | \ ((u32)in[1] << 8) | (u32)in[0]; } static inline void buf_put_be32(void *_buf, u32 val) { byte *out = _buf; out[0] = val >> 24; out[1] = val >> 16; out[2] = val >> 8; out[3] = val; } static inline void buf_put_le32(void *_buf, u32 val) { byte *out = _buf; out[3] = val >> 24; out[2] = val >> 16; out[1] = val >> 8; out[0] = val; } /* Functions for loading and storing unaligned u64 values of different endianness. */ static inline u64 buf_get_be64(const void *_buf) { const byte *in = _buf; return ((u64)in[0] << 56) | ((u64)in[1] << 48) | \ ((u64)in[2] << 40) | ((u64)in[3] << 32) | \ ((u64)in[4] << 24) | ((u64)in[5] << 16) | \ ((u64)in[6] << 8) | (u64)in[7]; } static inline u64 buf_get_le64(const void *_buf) { const byte *in = _buf; return ((u64)in[7] << 56) | ((u64)in[6] << 48) | \ ((u64)in[5] << 40) | ((u64)in[4] << 32) | \ ((u64)in[3] << 24) | ((u64)in[2] << 16) | \ ((u64)in[1] << 8) | (u64)in[0]; } static inline void buf_put_be64(void *_buf, u64 val) { byte *out = _buf; out[0] = val >> 56; out[1] = val >> 48; out[2] = val >> 40; out[3] = val >> 32; out[4] = val >> 24; out[5] = val >> 16; out[6] = val >> 8; out[7] = val; } static inline void buf_put_le64(void *_buf, u64 val) { byte *out = _buf; out[7] = val >> 56; out[6] = val >> 48; out[5] = val >> 40; out[4] = val >> 32; out[3] = val >> 24; out[2] = val >> 16; out[1] = val >> 8; out[0] = val; } #else /*BUFHELP_UNALIGNED_ACCESS*/ typedef struct bufhelp_u32_s { u32 a; } __attribute__((packed, aligned(1), may_alias)) bufhelp_u32_t; /* Functions for loading and storing unaligned u32 values of different endianness. */ static inline u32 buf_get_be32(const void *_buf) { return be_bswap32(((const bufhelp_u32_t *)_buf)->a); } static inline u32 buf_get_le32(const void *_buf) { return le_bswap32(((const bufhelp_u32_t *)_buf)->a); } static inline void buf_put_be32(void *_buf, u32 val) { bufhelp_u32_t *out = _buf; out->a = be_bswap32(val); } static inline void buf_put_le32(void *_buf, u32 val) { bufhelp_u32_t *out = _buf; out->a = le_bswap32(val); } typedef struct bufhelp_u64_s { u64 a; } __attribute__((packed, aligned(1), may_alias)) bufhelp_u64_t; /* Functions for loading and storing unaligned u64 values of different endianness. */ static inline u64 buf_get_be64(const void *_buf) { return be_bswap64(((const bufhelp_u64_t *)_buf)->a); } static inline u64 buf_get_le64(const void *_buf) { return le_bswap64(((const bufhelp_u64_t *)_buf)->a); } static inline void buf_put_be64(void *_buf, u64 val) { bufhelp_u64_t *out = _buf; out->a = be_bswap64(val); } static inline void buf_put_le64(void *_buf, u64 val) { bufhelp_u64_t *out = _buf; out->a = le_bswap64(val); } #endif /*BUFHELP_UNALIGNED_ACCESS*/ /* Host-endian get/put macros */ #ifdef WORDS_BIGENDIAN # define buf_get_he32 buf_get_be32 # define buf_put_he32 buf_put_be32 # define buf_get_he64 buf_get_be64 # define buf_put_he64 buf_put_be64 #else # define buf_get_he32 buf_get_le32 # define buf_put_he32 buf_put_le32 # define buf_get_he64 buf_get_le64 # define buf_put_he64 buf_put_le64 #endif /* Optimized function for small buffer copying */ static inline void buf_cpy(void *_dst, const void *_src, size_t len) { byte *dst = _dst; const byte *src = _src; #if __GNUC__ >= 4 if (!__builtin_constant_p (len)) { if (UNLIKELY(len == 0)) return; memcpy(_dst, _src, len); return; } #endif while (len >= sizeof(u64)) { buf_put_he64(dst, buf_get_he64(src)); dst += sizeof(u64); src += sizeof(u64); len -= sizeof(u64); } if (len >= sizeof(u32)) { buf_put_he32(dst, buf_get_he32(src)); dst += sizeof(u32); src += sizeof(u32); len -= sizeof(u32); } /* Handle tail. */ for (; len; len--) *dst++ = *src++; } /* Optimized function for buffer xoring */ static inline void buf_xor(void *_dst, const void *_src1, const void *_src2, size_t len) { byte *dst = _dst; const byte *src1 = _src1; const byte *src2 = _src2; while (len >= sizeof(u64)) { buf_put_he64(dst, buf_get_he64(src1) ^ buf_get_he64(src2)); dst += sizeof(u64); src1 += sizeof(u64); src2 += sizeof(u64); len -= sizeof(u64); } if (len > sizeof(u32)) { buf_put_he32(dst, buf_get_he32(src1) ^ buf_get_he32(src2)); dst += sizeof(u32); src1 += sizeof(u32); src2 += sizeof(u32); len -= sizeof(u32); } /* Handle tail. */ for (; len; len--) *dst++ = *src1++ ^ *src2++; } /* Optimized function for buffer xoring with two destination buffers. Used mainly by CFB mode encryption. */ static inline void buf_xor_2dst(void *_dst1, void *_dst2, const void *_src, size_t len) { byte *dst1 = _dst1; byte *dst2 = _dst2; const byte *src = _src; while (len >= sizeof(u64)) { u64 temp = buf_get_he64(dst2) ^ buf_get_he64(src); buf_put_he64(dst2, temp); buf_put_he64(dst1, temp); dst2 += sizeof(u64); dst1 += sizeof(u64); src += sizeof(u64); len -= sizeof(u64); } if (len >= sizeof(u32)) { u32 temp = buf_get_he32(dst2) ^ buf_get_he32(src); buf_put_he32(dst2, temp); buf_put_he32(dst1, temp); dst2 += sizeof(u32); dst1 += sizeof(u32); src += sizeof(u32); len -= sizeof(u32); } /* Handle tail. */ for (; len; len--) *dst1++ = (*dst2++ ^= *src++); } /* Optimized function for combined buffer xoring and copying. Used by mainly CBC mode decryption. */ static inline void buf_xor_n_copy_2(void *_dst_xor, const void *_src_xor, void *_srcdst_cpy, const void *_src_cpy, size_t len) { byte *dst_xor = _dst_xor; byte *srcdst_cpy = _srcdst_cpy; const byte *src_xor = _src_xor; const byte *src_cpy = _src_cpy; while (len >= sizeof(u64)) { u64 temp = buf_get_he64(src_cpy); buf_put_he64(dst_xor, buf_get_he64(srcdst_cpy) ^ buf_get_he64(src_xor)); buf_put_he64(srcdst_cpy, temp); dst_xor += sizeof(u64); srcdst_cpy += sizeof(u64); src_xor += sizeof(u64); src_cpy += sizeof(u64); len -= sizeof(u64); } if (len >= sizeof(u32)) { u32 temp = buf_get_he32(src_cpy); buf_put_he32(dst_xor, buf_get_he32(srcdst_cpy) ^ buf_get_he32(src_xor)); buf_put_he32(srcdst_cpy, temp); dst_xor += sizeof(u32); srcdst_cpy += sizeof(u32); src_xor += sizeof(u32); src_cpy += sizeof(u32); len -= sizeof(u32); } /* Handle tail. */ for (; len; len--) { byte temp = *src_cpy++; *dst_xor++ = *srcdst_cpy ^ *src_xor++; *srcdst_cpy++ = temp; } } /* Optimized function for combined buffer xoring and copying. Used by mainly CFB mode decryption. */ static inline void buf_xor_n_copy(void *_dst_xor, void *_srcdst_cpy, const void *_src, size_t len) { buf_xor_n_copy_2(_dst_xor, _src, _srcdst_cpy, _src, len); } /* Constant-time compare of two buffers. Returns 1 if buffers are equal, and 0 if buffers differ. */ static inline int buf_eq_const(const void *a, const void *b, size_t len) { return ct_memequal (a, b, len); } #endif /*GCRYPT_BUFHELP_H*/ grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/cipher/seed.c0000644000175000017500000004621515036452441021737 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ #include GRUB_MOD_LICENSE ("GPLv3+"); /* SEED for libgcrypt * Copyright (C) 2006 Free Software Foundation, Inc. * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . * SPDX-License-Identifier: LGPL-2.1-or-later * * -- * This implementation was provided for libgcrypt in public domain * by Hye-Shik Chang , July 2006. */ #include "types.h" /* for byte and u32 typedefs */ #include "g10lib.h" #include "cipher.h" #include "bufhelp.h" #include "cipher-internal.h" #define NUMKC 16 #define GETU32(pt) buf_get_be32(pt) #define PUTU32(ct, st) buf_put_be32(ct, st) union wordbuf { u32 w; byte b[4]; }; #ifdef WORDS_BIGENDIAN #define b0 b[3] #define b1 b[2] #define b2 b[1] #define b3 b[0] #else #define b0 b[0] #define b1 b[1] #define b2 b[2] #define b3 b[3] #endif typedef struct { u32 keyschedule[32]; } SEED_context; static const u32 SS0[256] = { 0x2989a1a8, 0x05858184, 0x16c6d2d4, 0x13c3d3d0, 0x14445054, 0x1d0d111c, 0x2c8ca0ac, 0x25052124, 0x1d4d515c, 0x03434340, 0x18081018, 0x1e0e121c, 0x11415150, 0x3cccf0fc, 0x0acac2c8, 0x23436360, 0x28082028, 0x04444044, 0x20002020, 0x1d8d919c, 0x20c0e0e0, 0x22c2e2e0, 0x08c8c0c8, 0x17071314, 0x2585a1a4, 0x0f8f838c, 0x03030300, 0x3b4b7378, 0x3b8bb3b8, 0x13031310, 0x12c2d2d0, 0x2ecee2ec, 0x30407070, 0x0c8c808c, 0x3f0f333c, 0x2888a0a8, 0x32023230, 0x1dcdd1dc, 0x36c6f2f4, 0x34447074, 0x2ccce0ec, 0x15859194, 0x0b0b0308, 0x17475354, 0x1c4c505c, 0x1b4b5358, 0x3d8db1bc, 0x01010100, 0x24042024, 0x1c0c101c, 0x33437370, 0x18889098, 0x10001010, 0x0cccc0cc, 0x32c2f2f0, 0x19c9d1d8, 0x2c0c202c, 0x27c7e3e4, 0x32427270, 0x03838380, 0x1b8b9398, 0x11c1d1d0, 0x06868284, 0x09c9c1c8, 0x20406060, 0x10405050, 0x2383a3a0, 0x2bcbe3e8, 0x0d0d010c, 0x3686b2b4, 0x1e8e929c, 0x0f4f434c, 0x3787b3b4, 0x1a4a5258, 0x06c6c2c4, 0x38487078, 0x2686a2a4, 0x12021210, 0x2f8fa3ac, 0x15c5d1d4, 0x21416160, 0x03c3c3c0, 0x3484b0b4, 0x01414140, 0x12425250, 0x3d4d717c, 0x0d8d818c, 0x08080008, 0x1f0f131c, 0x19899198, 0x00000000, 0x19091118, 0x04040004, 0x13435350, 0x37c7f3f4, 0x21c1e1e0, 0x3dcdf1fc, 0x36467274, 0x2f0f232c, 0x27072324, 0x3080b0b0, 0x0b8b8388, 0x0e0e020c, 0x2b8ba3a8, 0x2282a2a0, 0x2e4e626c, 0x13839390, 0x0d4d414c, 0x29496168, 0x3c4c707c, 0x09090108, 0x0a0a0208, 0x3f8fb3bc, 0x2fcfe3ec, 0x33c3f3f0, 0x05c5c1c4, 0x07878384, 0x14041014, 0x3ecef2fc, 0x24446064, 0x1eced2dc, 0x2e0e222c, 0x0b4b4348, 0x1a0a1218, 0x06060204, 0x21012120, 0x2b4b6368, 0x26466264, 0x02020200, 0x35c5f1f4, 0x12829290, 0x0a8a8288, 0x0c0c000c, 0x3383b3b0, 0x3e4e727c, 0x10c0d0d0, 0x3a4a7278, 0x07474344, 0x16869294, 0x25c5e1e4, 0x26062224, 0x00808080, 0x2d8da1ac, 0x1fcfd3dc, 0x2181a1a0, 0x30003030, 0x37073334, 0x2e8ea2ac, 0x36063234, 0x15051114, 0x22022220, 0x38083038, 0x34c4f0f4, 0x2787a3a4, 0x05454144, 0x0c4c404c, 0x01818180, 0x29c9e1e8, 0x04848084, 0x17879394, 0x35053134, 0x0bcbc3c8, 0x0ecec2cc, 0x3c0c303c, 0x31417170, 0x11011110, 0x07c7c3c4, 0x09898188, 0x35457174, 0x3bcbf3f8, 0x1acad2d8, 0x38c8f0f8, 0x14849094, 0x19495158, 0x02828280, 0x04c4c0c4, 0x3fcff3fc, 0x09494148, 0x39093138, 0x27476364, 0x00c0c0c0, 0x0fcfc3cc, 0x17c7d3d4, 0x3888b0b8, 0x0f0f030c, 0x0e8e828c, 0x02424240, 0x23032320, 0x11819190, 0x2c4c606c, 0x1bcbd3d8, 0x2484a0a4, 0x34043034, 0x31c1f1f0, 0x08484048, 0x02c2c2c0, 0x2f4f636c, 0x3d0d313c, 0x2d0d212c, 0x00404040, 0x3e8eb2bc, 0x3e0e323c, 0x3c8cb0bc, 0x01c1c1c0, 0x2a8aa2a8, 0x3a8ab2b8, 0x0e4e424c, 0x15455154, 0x3b0b3338, 0x1cccd0dc, 0x28486068, 0x3f4f737c, 0x1c8c909c, 0x18c8d0d8, 0x0a4a4248, 0x16465254, 0x37477374, 0x2080a0a0, 0x2dcde1ec, 0x06464244, 0x3585b1b4, 0x2b0b2328, 0x25456164, 0x3acaf2f8, 0x23c3e3e0, 0x3989b1b8, 0x3181b1b0, 0x1f8f939c, 0x1e4e525c, 0x39c9f1f8, 0x26c6e2e4, 0x3282b2b0, 0x31013130, 0x2acae2e8, 0x2d4d616c, 0x1f4f535c, 0x24c4e0e4, 0x30c0f0f0, 0x0dcdc1cc, 0x08888088, 0x16061214, 0x3a0a3238, 0x18485058, 0x14c4d0d4, 0x22426260, 0x29092128, 0x07070304, 0x33033330, 0x28c8e0e8, 0x1b0b1318, 0x05050104, 0x39497178, 0x10809090, 0x2a4a6268, 0x2a0a2228, 0x1a8a9298, }; static const u32 SS1[256] = { 0x38380830, 0xe828c8e0, 0x2c2d0d21, 0xa42686a2, 0xcc0fcfc3, 0xdc1eced2, 0xb03383b3, 0xb83888b0, 0xac2f8fa3, 0x60204060, 0x54154551, 0xc407c7c3, 0x44044440, 0x6c2f4f63, 0x682b4b63, 0x581b4b53, 0xc003c3c3, 0x60224262, 0x30330333, 0xb43585b1, 0x28290921, 0xa02080a0, 0xe022c2e2, 0xa42787a3, 0xd013c3d3, 0x90118191, 0x10110111, 0x04060602, 0x1c1c0c10, 0xbc3c8cb0, 0x34360632, 0x480b4b43, 0xec2fcfe3, 0x88088880, 0x6c2c4c60, 0xa82888a0, 0x14170713, 0xc404c4c0, 0x14160612, 0xf434c4f0, 0xc002c2c2, 0x44054541, 0xe021c1e1, 0xd416c6d2, 0x3c3f0f33, 0x3c3d0d31, 0x8c0e8e82, 0x98188890, 0x28280820, 0x4c0e4e42, 0xf436c6f2, 0x3c3e0e32, 0xa42585a1, 0xf839c9f1, 0x0c0d0d01, 0xdc1fcfd3, 0xd818c8d0, 0x282b0b23, 0x64264662, 0x783a4a72, 0x24270723, 0x2c2f0f23, 0xf031c1f1, 0x70324272, 0x40024242, 0xd414c4d0, 0x40014141, 0xc000c0c0, 0x70334373, 0x64274763, 0xac2c8ca0, 0x880b8b83, 0xf437c7f3, 0xac2d8da1, 0x80008080, 0x1c1f0f13, 0xc80acac2, 0x2c2c0c20, 0xa82a8aa2, 0x34340430, 0xd012c2d2, 0x080b0b03, 0xec2ecee2, 0xe829c9e1, 0x5c1d4d51, 0x94148490, 0x18180810, 0xf838c8f0, 0x54174753, 0xac2e8ea2, 0x08080800, 0xc405c5c1, 0x10130313, 0xcc0dcdc1, 0x84068682, 0xb83989b1, 0xfc3fcff3, 0x7c3d4d71, 0xc001c1c1, 0x30310131, 0xf435c5f1, 0x880a8a82, 0x682a4a62, 0xb03181b1, 0xd011c1d1, 0x20200020, 0xd417c7d3, 0x00020202, 0x20220222, 0x04040400, 0x68284860, 0x70314171, 0x04070703, 0xd81bcbd3, 0x9c1d8d91, 0x98198991, 0x60214161, 0xbc3e8eb2, 0xe426c6e2, 0x58194951, 0xdc1dcdd1, 0x50114151, 0x90108090, 0xdc1cccd0, 0x981a8a92, 0xa02383a3, 0xa82b8ba3, 0xd010c0d0, 0x80018181, 0x0c0f0f03, 0x44074743, 0x181a0a12, 0xe023c3e3, 0xec2ccce0, 0x8c0d8d81, 0xbc3f8fb3, 0x94168692, 0x783b4b73, 0x5c1c4c50, 0xa02282a2, 0xa02181a1, 0x60234363, 0x20230323, 0x4c0d4d41, 0xc808c8c0, 0x9c1e8e92, 0x9c1c8c90, 0x383a0a32, 0x0c0c0c00, 0x2c2e0e22, 0xb83a8ab2, 0x6c2e4e62, 0x9c1f8f93, 0x581a4a52, 0xf032c2f2, 0x90128292, 0xf033c3f3, 0x48094941, 0x78384870, 0xcc0cccc0, 0x14150511, 0xf83bcbf3, 0x70304070, 0x74354571, 0x7c3f4f73, 0x34350531, 0x10100010, 0x00030303, 0x64244460, 0x6c2d4d61, 0xc406c6c2, 0x74344470, 0xd415c5d1, 0xb43484b0, 0xe82acae2, 0x08090901, 0x74364672, 0x18190911, 0xfc3ecef2, 0x40004040, 0x10120212, 0xe020c0e0, 0xbc3d8db1, 0x04050501, 0xf83acaf2, 0x00010101, 0xf030c0f0, 0x282a0a22, 0x5c1e4e52, 0xa82989a1, 0x54164652, 0x40034343, 0x84058581, 0x14140410, 0x88098981, 0x981b8b93, 0xb03080b0, 0xe425c5e1, 0x48084840, 0x78394971, 0x94178793, 0xfc3cccf0, 0x1c1e0e12, 0x80028282, 0x20210121, 0x8c0c8c80, 0x181b0b13, 0x5c1f4f53, 0x74374773, 0x54144450, 0xb03282b2, 0x1c1d0d11, 0x24250521, 0x4c0f4f43, 0x00000000, 0x44064642, 0xec2dcde1, 0x58184850, 0x50124252, 0xe82bcbe3, 0x7c3e4e72, 0xd81acad2, 0xc809c9c1, 0xfc3dcdf1, 0x30300030, 0x94158591, 0x64254561, 0x3c3c0c30, 0xb43686b2, 0xe424c4e0, 0xb83b8bb3, 0x7c3c4c70, 0x0c0e0e02, 0x50104050, 0x38390931, 0x24260622, 0x30320232, 0x84048480, 0x68294961, 0x90138393, 0x34370733, 0xe427c7e3, 0x24240420, 0xa42484a0, 0xc80bcbc3, 0x50134353, 0x080a0a02, 0x84078783, 0xd819c9d1, 0x4c0c4c40, 0x80038383, 0x8c0f8f83, 0xcc0ecec2, 0x383b0b33, 0x480a4a42, 0xb43787b3, }; static const u32 SS2[256] = { 0xa1a82989, 0x81840585, 0xd2d416c6, 0xd3d013c3, 0x50541444, 0x111c1d0d, 0xa0ac2c8c, 0x21242505, 0x515c1d4d, 0x43400343, 0x10181808, 0x121c1e0e, 0x51501141, 0xf0fc3ccc, 0xc2c80aca, 0x63602343, 0x20282808, 0x40440444, 0x20202000, 0x919c1d8d, 0xe0e020c0, 0xe2e022c2, 0xc0c808c8, 0x13141707, 0xa1a42585, 0x838c0f8f, 0x03000303, 0x73783b4b, 0xb3b83b8b, 0x13101303, 0xd2d012c2, 0xe2ec2ece, 0x70703040, 0x808c0c8c, 0x333c3f0f, 0xa0a82888, 0x32303202, 0xd1dc1dcd, 0xf2f436c6, 0x70743444, 0xe0ec2ccc, 0x91941585, 0x03080b0b, 0x53541747, 0x505c1c4c, 0x53581b4b, 0xb1bc3d8d, 0x01000101, 0x20242404, 0x101c1c0c, 0x73703343, 0x90981888, 0x10101000, 0xc0cc0ccc, 0xf2f032c2, 0xd1d819c9, 0x202c2c0c, 0xe3e427c7, 0x72703242, 0x83800383, 0x93981b8b, 0xd1d011c1, 0x82840686, 0xc1c809c9, 0x60602040, 0x50501040, 0xa3a02383, 0xe3e82bcb, 0x010c0d0d, 0xb2b43686, 0x929c1e8e, 0x434c0f4f, 0xb3b43787, 0x52581a4a, 0xc2c406c6, 0x70783848, 0xa2a42686, 0x12101202, 0xa3ac2f8f, 0xd1d415c5, 0x61602141, 0xc3c003c3, 0xb0b43484, 0x41400141, 0x52501242, 0x717c3d4d, 0x818c0d8d, 0x00080808, 0x131c1f0f, 0x91981989, 0x00000000, 0x11181909, 0x00040404, 0x53501343, 0xf3f437c7, 0xe1e021c1, 0xf1fc3dcd, 0x72743646, 0x232c2f0f, 0x23242707, 0xb0b03080, 0x83880b8b, 0x020c0e0e, 0xa3a82b8b, 0xa2a02282, 0x626c2e4e, 0x93901383, 0x414c0d4d, 0x61682949, 0x707c3c4c, 0x01080909, 0x02080a0a, 0xb3bc3f8f, 0xe3ec2fcf, 0xf3f033c3, 0xc1c405c5, 0x83840787, 0x10141404, 0xf2fc3ece, 0x60642444, 0xd2dc1ece, 0x222c2e0e, 0x43480b4b, 0x12181a0a, 0x02040606, 0x21202101, 0x63682b4b, 0x62642646, 0x02000202, 0xf1f435c5, 0x92901282, 0x82880a8a, 0x000c0c0c, 0xb3b03383, 0x727c3e4e, 0xd0d010c0, 0x72783a4a, 0x43440747, 0x92941686, 0xe1e425c5, 0x22242606, 0x80800080, 0xa1ac2d8d, 0xd3dc1fcf, 0xa1a02181, 0x30303000, 0x33343707, 0xa2ac2e8e, 0x32343606, 0x11141505, 0x22202202, 0x30383808, 0xf0f434c4, 0xa3a42787, 0x41440545, 0x404c0c4c, 0x81800181, 0xe1e829c9, 0x80840484, 0x93941787, 0x31343505, 0xc3c80bcb, 0xc2cc0ece, 0x303c3c0c, 0x71703141, 0x11101101, 0xc3c407c7, 0x81880989, 0x71743545, 0xf3f83bcb, 0xd2d81aca, 0xf0f838c8, 0x90941484, 0x51581949, 0x82800282, 0xc0c404c4, 0xf3fc3fcf, 0x41480949, 0x31383909, 0x63642747, 0xc0c000c0, 0xc3cc0fcf, 0xd3d417c7, 0xb0b83888, 0x030c0f0f, 0x828c0e8e, 0x42400242, 0x23202303, 0x91901181, 0x606c2c4c, 0xd3d81bcb, 0xa0a42484, 0x30343404, 0xf1f031c1, 0x40480848, 0xc2c002c2, 0x636c2f4f, 0x313c3d0d, 0x212c2d0d, 0x40400040, 0xb2bc3e8e, 0x323c3e0e, 0xb0bc3c8c, 0xc1c001c1, 0xa2a82a8a, 0xb2b83a8a, 0x424c0e4e, 0x51541545, 0x33383b0b, 0xd0dc1ccc, 0x60682848, 0x737c3f4f, 0x909c1c8c, 0xd0d818c8, 0x42480a4a, 0x52541646, 0x73743747, 0xa0a02080, 0xe1ec2dcd, 0x42440646, 0xb1b43585, 0x23282b0b, 0x61642545, 0xf2f83aca, 0xe3e023c3, 0xb1b83989, 0xb1b03181, 0x939c1f8f, 0x525c1e4e, 0xf1f839c9, 0xe2e426c6, 0xb2b03282, 0x31303101, 0xe2e82aca, 0x616c2d4d, 0x535c1f4f, 0xe0e424c4, 0xf0f030c0, 0xc1cc0dcd, 0x80880888, 0x12141606, 0x32383a0a, 0x50581848, 0xd0d414c4, 0x62602242, 0x21282909, 0x03040707, 0x33303303, 0xe0e828c8, 0x13181b0b, 0x01040505, 0x71783949, 0x90901080, 0x62682a4a, 0x22282a0a, 0x92981a8a, }; static const u32 SS3[256] = { 0x08303838, 0xc8e0e828, 0x0d212c2d, 0x86a2a426, 0xcfc3cc0f, 0xced2dc1e, 0x83b3b033, 0x88b0b838, 0x8fa3ac2f, 0x40606020, 0x45515415, 0xc7c3c407, 0x44404404, 0x4f636c2f, 0x4b63682b, 0x4b53581b, 0xc3c3c003, 0x42626022, 0x03333033, 0x85b1b435, 0x09212829, 0x80a0a020, 0xc2e2e022, 0x87a3a427, 0xc3d3d013, 0x81919011, 0x01111011, 0x06020406, 0x0c101c1c, 0x8cb0bc3c, 0x06323436, 0x4b43480b, 0xcfe3ec2f, 0x88808808, 0x4c606c2c, 0x88a0a828, 0x07131417, 0xc4c0c404, 0x06121416, 0xc4f0f434, 0xc2c2c002, 0x45414405, 0xc1e1e021, 0xc6d2d416, 0x0f333c3f, 0x0d313c3d, 0x8e828c0e, 0x88909818, 0x08202828, 0x4e424c0e, 0xc6f2f436, 0x0e323c3e, 0x85a1a425, 0xc9f1f839, 0x0d010c0d, 0xcfd3dc1f, 0xc8d0d818, 0x0b23282b, 0x46626426, 0x4a72783a, 0x07232427, 0x0f232c2f, 0xc1f1f031, 0x42727032, 0x42424002, 0xc4d0d414, 0x41414001, 0xc0c0c000, 0x43737033, 0x47636427, 0x8ca0ac2c, 0x8b83880b, 0xc7f3f437, 0x8da1ac2d, 0x80808000, 0x0f131c1f, 0xcac2c80a, 0x0c202c2c, 0x8aa2a82a, 0x04303434, 0xc2d2d012, 0x0b03080b, 0xcee2ec2e, 0xc9e1e829, 0x4d515c1d, 0x84909414, 0x08101818, 0xc8f0f838, 0x47535417, 0x8ea2ac2e, 0x08000808, 0xc5c1c405, 0x03131013, 0xcdc1cc0d, 0x86828406, 0x89b1b839, 0xcff3fc3f, 0x4d717c3d, 0xc1c1c001, 0x01313031, 0xc5f1f435, 0x8a82880a, 0x4a62682a, 0x81b1b031, 0xc1d1d011, 0x00202020, 0xc7d3d417, 0x02020002, 0x02222022, 0x04000404, 0x48606828, 0x41717031, 0x07030407, 0xcbd3d81b, 0x8d919c1d, 0x89919819, 0x41616021, 0x8eb2bc3e, 0xc6e2e426, 0x49515819, 0xcdd1dc1d, 0x41515011, 0x80909010, 0xccd0dc1c, 0x8a92981a, 0x83a3a023, 0x8ba3a82b, 0xc0d0d010, 0x81818001, 0x0f030c0f, 0x47434407, 0x0a12181a, 0xc3e3e023, 0xcce0ec2c, 0x8d818c0d, 0x8fb3bc3f, 0x86929416, 0x4b73783b, 0x4c505c1c, 0x82a2a022, 0x81a1a021, 0x43636023, 0x03232023, 0x4d414c0d, 0xc8c0c808, 0x8e929c1e, 0x8c909c1c, 0x0a32383a, 0x0c000c0c, 0x0e222c2e, 0x8ab2b83a, 0x4e626c2e, 0x8f939c1f, 0x4a52581a, 0xc2f2f032, 0x82929012, 0xc3f3f033, 0x49414809, 0x48707838, 0xccc0cc0c, 0x05111415, 0xcbf3f83b, 0x40707030, 0x45717435, 0x4f737c3f, 0x05313435, 0x00101010, 0x03030003, 0x44606424, 0x4d616c2d, 0xc6c2c406, 0x44707434, 0xc5d1d415, 0x84b0b434, 0xcae2e82a, 0x09010809, 0x46727436, 0x09111819, 0xcef2fc3e, 0x40404000, 0x02121012, 0xc0e0e020, 0x8db1bc3d, 0x05010405, 0xcaf2f83a, 0x01010001, 0xc0f0f030, 0x0a22282a, 0x4e525c1e, 0x89a1a829, 0x46525416, 0x43434003, 0x85818405, 0x04101414, 0x89818809, 0x8b93981b, 0x80b0b030, 0xc5e1e425, 0x48404808, 0x49717839, 0x87939417, 0xccf0fc3c, 0x0e121c1e, 0x82828002, 0x01212021, 0x8c808c0c, 0x0b13181b, 0x4f535c1f, 0x47737437, 0x44505414, 0x82b2b032, 0x0d111c1d, 0x05212425, 0x4f434c0f, 0x00000000, 0x46424406, 0xcde1ec2d, 0x48505818, 0x42525012, 0xcbe3e82b, 0x4e727c3e, 0xcad2d81a, 0xc9c1c809, 0xcdf1fc3d, 0x00303030, 0x85919415, 0x45616425, 0x0c303c3c, 0x86b2b436, 0xc4e0e424, 0x8bb3b83b, 0x4c707c3c, 0x0e020c0e, 0x40505010, 0x09313839, 0x06222426, 0x02323032, 0x84808404, 0x49616829, 0x83939013, 0x07333437, 0xc7e3e427, 0x04202424, 0x84a0a424, 0xcbc3c80b, 0x43535013, 0x0a02080a, 0x87838407, 0xc9d1d819, 0x4c404c0c, 0x83838003, 0x8f838c0f, 0xcec2cc0e, 0x0b33383b, 0x4a42480a, 0x87b3b437, }; static const u32 KC[NUMKC] = { 0x9e3779b9, 0x3c6ef373, 0x78dde6e6, 0xf1bbcdcc, 0xe3779b99, 0xc6ef3733, 0x8dde6e67, 0x1bbcdccf, 0x3779b99e, 0x6ef3733c, 0xdde6e678, 0xbbcdccf1, 0x779b99e3, 0xef3733c6, 0xde6e678d, 0xbcdccf1b, }; /* Perform the key setup. */ static gcry_err_code_t do_setkey (SEED_context *ctx, const byte *key, const unsigned keylen) { static int initialized = 0; static const char *selftest_failed=0; u32 x1, x2, x3, x4; union wordbuf t0, t1; u32 *keyout = ctx->keyschedule; int i; if (!initialized) { initialized = 1; selftest_failed = selftest (); if( selftest_failed ) log_error ("%s\n", selftest_failed ); } if (selftest_failed) return GPG_ERR_SELFTEST_FAILED; if (keylen != 16) return GPG_ERR_INV_KEYLEN; x1 = GETU32 (key); x2 = GETU32 (key+4); x3 = GETU32 (key+8); x4 = GETU32 (key+12); for (i = 0; i < NUMKC; i++) { t0.w = x1 + x3 - KC[i]; t1.w = x2 + KC[i] - x4; *(keyout++) = SS0[t0.b0] ^ SS1[t0.b1] ^ SS2[t0.b2] ^ SS3[t0.b3]; *(keyout++) = SS0[t1.b0] ^ SS1[t1.b1] ^ SS2[t1.b2] ^ SS3[t1.b3]; if (i % 2 == 0) { t0.w = x1; x1 = (x1>>8) ^ (x2<<24); x2 = (x2>>8) ^ (t0.w<<24); } else { t0.w = x3; x3 = (x3<<8) ^ (x4>>24); x4 = (x4<<8) ^ (t0.w>>24); } } return 0; } static gcry_err_code_t seed_setkey (void *context, const byte *key, const unsigned keylen, cipher_bulk_ops_t *bulk_ops) { SEED_context *ctx = context; int rc = do_setkey (ctx, key, keylen); (void)bulk_ops; _gcry_burn_stack (4*6 + sizeof(void*)*2 + sizeof(int)*2); return rc; } #define OP(X1, X2, X3, X4, rbase) \ t0.w = X3 ^ ctx->keyschedule[rbase]; \ t1.w = X4 ^ ctx->keyschedule[rbase+1]; \ t1.w ^= t0.w; \ t1.w = SS0[t1.b0] ^ SS1[t1.b1] ^ SS2[t1.b2] ^ SS3[t1.b3]; \ t0.w += t1.w; \ t0.w = SS0[t0.b0] ^ SS1[t0.b1] ^ SS2[t0.b2] ^ SS3[t0.b3]; \ t1.w += t0.w; \ t1.w = SS0[t1.b0] ^ SS1[t1.b1] ^ SS2[t1.b2] ^ SS3[t1.b3]; \ t0.w += t1.w; \ X1 ^= t0.w; \ X2 ^= t1.w; /* Encrypt one block. inbuf and outbuf may be the same. */ static void do_encrypt (const SEED_context *ctx, byte *outbuf, const byte *inbuf) { u32 x1, x2, x3, x4; union wordbuf t0, t1; x1 = GETU32 (inbuf); x2 = GETU32 (inbuf+4); x3 = GETU32 (inbuf+8); x4 = GETU32 (inbuf+12); OP (x1, x2, x3, x4, 0); OP (x3, x4, x1, x2, 2); OP (x1, x2, x3, x4, 4); OP (x3, x4, x1, x2, 6); OP (x1, x2, x3, x4, 8); OP (x3, x4, x1, x2, 10); OP (x1, x2, x3, x4, 12); OP (x3, x4, x1, x2, 14); OP (x1, x2, x3, x4, 16); OP (x3, x4, x1, x2, 18); OP (x1, x2, x3, x4, 20); OP (x3, x4, x1, x2, 22); OP (x1, x2, x3, x4, 24); OP (x3, x4, x1, x2, 26); OP (x1, x2, x3, x4, 28); OP (x3, x4, x1, x2, 30); PUTU32 (outbuf, x3); PUTU32 (outbuf+4, x4); PUTU32 (outbuf+8, x1); PUTU32 (outbuf+12, x2); } static unsigned int seed_encrypt (void *context, byte *outbuf, const byte *inbuf) { SEED_context *ctx = context; do_encrypt (ctx, outbuf, inbuf); return /*burn_stack*/ (4*6); } /* Decrypt one block. inbuf and outbuf may be the same. */ static void do_decrypt (SEED_context *ctx, byte *outbuf, const byte *inbuf) { u32 x1, x2, x3, x4; union wordbuf t0, t1; x1 = GETU32 (inbuf); x2 = GETU32 (inbuf+4); x3 = GETU32 (inbuf+8); x4 = GETU32 (inbuf+12); OP (x1, x2, x3, x4, 30); OP (x3, x4, x1, x2, 28); OP (x1, x2, x3, x4, 26); OP (x3, x4, x1, x2, 24); OP (x1, x2, x3, x4, 22); OP (x3, x4, x1, x2, 20); OP (x1, x2, x3, x4, 18); OP (x3, x4, x1, x2, 16); OP (x1, x2, x3, x4, 14); OP (x3, x4, x1, x2, 12); OP (x1, x2, x3, x4, 10); OP (x3, x4, x1, x2, 8); OP (x1, x2, x3, x4, 6); OP (x3, x4, x1, x2, 4); OP (x1, x2, x3, x4, 2); OP (x3, x4, x1, x2, 0); PUTU32 (outbuf, x3); PUTU32 (outbuf+4, x4); PUTU32 (outbuf+8, x1); PUTU32 (outbuf+12, x2); } static unsigned int seed_decrypt (void *context, byte *outbuf, const byte *inbuf) { SEED_context *ctx = context; do_decrypt (ctx, outbuf, inbuf); return /*burn_stack*/ (4*6); } /* Test a single encryption and decryption with each key size. */ static const gcry_cipher_oid_spec_t seed_oids[] = { { "1.2.410.200004.1.3", GCRY_CIPHER_MODE_ECB }, { "1.2.410.200004.1.4", GCRY_CIPHER_MODE_CBC }, { "1.2.410.200004.1.5", GCRY_CIPHER_MODE_CFB }, { "1.2.410.200004.1.6", GCRY_CIPHER_MODE_OFB }, { NULL } }; gcry_cipher_spec_t _gcry_cipher_spec_seed = { GCRY_CIPHER_SEED, {0, 0}, "SEED", NULL, seed_oids, 16, 128, sizeof (SEED_context), seed_setkey, seed_encrypt, seed_decrypt, GRUB_UTIL_MODNAME("gcry_seed") }; GRUB_MOD_INIT(gcry_seed) { grub_cipher_register (&_gcry_cipher_spec_seed); } GRUB_MOD_FINI(gcry_seed) { grub_cipher_unregister (&_gcry_cipher_spec_seed); } grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/cipher/keccak.c0000644000175000017500000012145315036452441022236 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ #include GRUB_MOD_LICENSE ("GPLv3+"); /* keccak.c - SHA3 hash functions * Copyright (C) 2015 g10 Code GmbH * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . */ #include "g10lib.h" #include "bithelp.h" #include "bufhelp.h" #include "cipher.h" #include "hash-common.h" /* USE_64BIT indicates whether to use 64-bit generic implementation. * USE_32BIT indicates whether to use 32-bit generic implementation. */ #undef USE_64BIT #if defined(__x86_64__) || SIZEOF_UNSIGNED_LONG == 8 # define USE_64BIT 1 #else # define USE_32BIT 1 #endif /* USE_64BIT_BMI2 indicates whether to compile with 64-bit Intel BMI2 code. */ #undef USE_64BIT_BMI2 #if defined(USE_64BIT) && defined(HAVE_GCC_INLINE_ASM_BMI2) && \ defined(HAVE_CPU_ARCH_X86) # define USE_64BIT_BMI2 1 #endif /* USE_64BIT_SHLD indicates whether to compile with 64-bit Intel SHLD code. */ #undef USE_64BIT_SHLD #if defined(USE_64BIT) && defined (__GNUC__) && defined(__x86_64__) && \ defined(HAVE_CPU_ARCH_X86) # define USE_64BIT_SHLD 1 #endif /* USE_32BIT_BMI2 indicates whether to compile with 32-bit Intel BMI2 code. */ #undef USE_32BIT_BMI2 #if defined(USE_32BIT) && defined(HAVE_GCC_INLINE_ASM_BMI2) && \ defined(HAVE_CPU_ARCH_X86) # define USE_32BIT_BMI2 1 #endif /* USE_64BIT_AVX512 indicates whether to compile with Intel AVX512 code. */ #undef USE_64BIT_AVX512 #if defined(USE_64BIT) && defined(__x86_64__) && \ defined(HAVE_GCC_INLINE_ASM_AVX512) && \ (defined(HAVE_COMPATIBLE_GCC_AMD64_PLATFORM_AS) || \ defined(HAVE_COMPATIBLE_GCC_WIN64_PLATFORM_AS)) # define USE_64BIT_AVX512 1 #endif /* USE_64BIT_ARM_NEON indicates whether to enable 64-bit ARM/NEON assembly * code. */ #undef USE_64BIT_ARM_NEON #ifdef ENABLE_NEON_SUPPORT # if defined(HAVE_ARM_ARCH_V6) && defined(__ARMEL__) \ && defined(HAVE_COMPATIBLE_GCC_ARM_PLATFORM_AS) \ && defined(HAVE_GCC_INLINE_ASM_NEON) # define USE_64BIT_ARM_NEON 1 # endif #endif /*ENABLE_NEON_SUPPORT*/ /* USE_S390X_CRYPTO indicates whether to enable zSeries code. */ #undef USE_S390X_CRYPTO #if defined(HAVE_GCC_INLINE_ASM_S390X) # define USE_S390X_CRYPTO 1 #endif /* USE_S390X_CRYPTO */ /* x86-64 vector register assembly implementations use SystemV ABI, ABI * conversion needed on Win64 through function attribute. */ #undef ASM_FUNC_ABI #if defined(USE_64BIT_AVX512) && defined(HAVE_COMPATIBLE_GCC_WIN64_PLATFORM_AS) # define ASM_FUNC_ABI __attribute__((sysv_abi)) #else # define ASM_FUNC_ABI #endif #if defined(USE_64BIT) || defined(USE_64BIT_ARM_NEON) # define NEED_COMMON64 1 #endif #ifdef USE_32BIT # define NEED_COMMON32BI 1 #endif #define SHA3_DELIMITED_SUFFIX 0x06 #define SHAKE_DELIMITED_SUFFIX 0x1F #define CSHAKE_DELIMITED_SUFFIX 0x04 typedef struct { union { #ifdef NEED_COMMON64 u64 state64[25]; #endif #ifdef NEED_COMMON32BI u32 state32bi[50]; #endif } u; } KECCAK_STATE; typedef struct { unsigned int (*permute)(KECCAK_STATE *hd); unsigned int (*absorb)(KECCAK_STATE *hd, int pos, const byte *lanes, size_t nlanes, int blocklanes); unsigned int (*extract) (KECCAK_STATE *hd, unsigned int pos, byte *outbuf, unsigned int outlen); } keccak_ops_t; typedef struct KECCAK_CONTEXT_S { KECCAK_STATE state; unsigned int outlen; unsigned int blocksize; unsigned int count; unsigned int suffix:8; unsigned int shake_in_extract_mode:1; unsigned int shake_in_read_mode:1; const keccak_ops_t *ops; #ifdef USE_S390X_CRYPTO unsigned int kimd_func; unsigned int buf_pos; byte buf[1344 / 8]; /* SHAKE128 requires biggest buffer, 1344 bits. */ #endif } KECCAK_CONTEXT; #ifdef NEED_COMMON64 const u64 _gcry_keccak_round_consts_64bit[24 + 1] = { U64_C(0x0000000000000001), U64_C(0x0000000000008082), U64_C(0x800000000000808A), U64_C(0x8000000080008000), U64_C(0x000000000000808B), U64_C(0x0000000080000001), U64_C(0x8000000080008081), U64_C(0x8000000000008009), U64_C(0x000000000000008A), U64_C(0x0000000000000088), U64_C(0x0000000080008009), U64_C(0x000000008000000A), U64_C(0x000000008000808B), U64_C(0x800000000000008B), U64_C(0x8000000000008089), U64_C(0x8000000000008003), U64_C(0x8000000000008002), U64_C(0x8000000000000080), U64_C(0x000000000000800A), U64_C(0x800000008000000A), U64_C(0x8000000080008081), U64_C(0x8000000000008080), U64_C(0x0000000080000001), U64_C(0x8000000080008008), U64_C(0xFFFFFFFFFFFFFFFF) }; static unsigned int keccak_extract64(KECCAK_STATE *hd, unsigned int pos, byte *outbuf, unsigned int outlen) { unsigned int i; /* NOTE: when pos == 0, hd and outbuf may point to same memory (SHA-3). */ for (i = pos; i < pos + outlen / 8 + !!(outlen % 8); i++) { u64 tmp = hd->u.state64[i]; buf_put_le64(outbuf, tmp); outbuf += 8; } return 0; } #endif /* NEED_COMMON64 */ #ifdef NEED_COMMON32BI static const u32 round_consts_32bit[2 * 24] = { 0x00000001UL, 0x00000000UL, 0x00000000UL, 0x00000089UL, 0x00000000UL, 0x8000008bUL, 0x00000000UL, 0x80008080UL, 0x00000001UL, 0x0000008bUL, 0x00000001UL, 0x00008000UL, 0x00000001UL, 0x80008088UL, 0x00000001UL, 0x80000082UL, 0x00000000UL, 0x0000000bUL, 0x00000000UL, 0x0000000aUL, 0x00000001UL, 0x00008082UL, 0x00000000UL, 0x00008003UL, 0x00000001UL, 0x0000808bUL, 0x00000001UL, 0x8000000bUL, 0x00000001UL, 0x8000008aUL, 0x00000001UL, 0x80000081UL, 0x00000000UL, 0x80000081UL, 0x00000000UL, 0x80000008UL, 0x00000000UL, 0x00000083UL, 0x00000000UL, 0x80008003UL, 0x00000001UL, 0x80008088UL, 0x00000000UL, 0x80000088UL, 0x00000001UL, 0x00008000UL, 0x00000000UL, 0x80008082UL }; static unsigned int keccak_extract32bi(KECCAK_STATE *hd, unsigned int pos, byte *outbuf, unsigned int outlen) { unsigned int i; u32 x0; u32 x1; u32 t; /* NOTE: when pos == 0, hd and outbuf may point to same memory (SHA-3). */ for (i = pos; i < pos + outlen / 8 + !!(outlen % 8); i++) { x0 = hd->u.state32bi[i * 2 + 0]; x1 = hd->u.state32bi[i * 2 + 1]; t = (x0 & 0x0000FFFFUL) + (x1 << 16); x1 = (x0 >> 16) + (x1 & 0xFFFF0000UL); x0 = t; t = (x0 ^ (x0 >> 8)) & 0x0000FF00UL; x0 = x0 ^ t ^ (t << 8); t = (x0 ^ (x0 >> 4)) & 0x00F000F0UL; x0 = x0 ^ t ^ (t << 4); t = (x0 ^ (x0 >> 2)) & 0x0C0C0C0CUL; x0 = x0 ^ t ^ (t << 2); t = (x0 ^ (x0 >> 1)) & 0x22222222UL; x0 = x0 ^ t ^ (t << 1); t = (x1 ^ (x1 >> 8)) & 0x0000FF00UL; x1 = x1 ^ t ^ (t << 8); t = (x1 ^ (x1 >> 4)) & 0x00F000F0UL; x1 = x1 ^ t ^ (t << 4); t = (x1 ^ (x1 >> 2)) & 0x0C0C0C0CUL; x1 = x1 ^ t ^ (t << 2); t = (x1 ^ (x1 >> 1)) & 0x22222222UL; x1 = x1 ^ t ^ (t << 1); buf_put_le32(&outbuf[0], x0); buf_put_le32(&outbuf[4], x1); outbuf += 8; } return 0; } static inline void keccak_absorb_lane32bi(u32 *lane, u32 x0, u32 x1) { u32 t; t = (x0 ^ (x0 >> 1)) & 0x22222222UL; x0 = x0 ^ t ^ (t << 1); t = (x0 ^ (x0 >> 2)) & 0x0C0C0C0CUL; x0 = x0 ^ t ^ (t << 2); t = (x0 ^ (x0 >> 4)) & 0x00F000F0UL; x0 = x0 ^ t ^ (t << 4); t = (x0 ^ (x0 >> 8)) & 0x0000FF00UL; x0 = x0 ^ t ^ (t << 8); t = (x1 ^ (x1 >> 1)) & 0x22222222UL; x1 = x1 ^ t ^ (t << 1); t = (x1 ^ (x1 >> 2)) & 0x0C0C0C0CUL; x1 = x1 ^ t ^ (t << 2); t = (x1 ^ (x1 >> 4)) & 0x00F000F0UL; x1 = x1 ^ t ^ (t << 4); t = (x1 ^ (x1 >> 8)) & 0x0000FF00UL; x1 = x1 ^ t ^ (t << 8); lane[0] ^= (x0 & 0x0000FFFFUL) + (x1 << 16); lane[1] ^= (x0 >> 16) + (x1 & 0xFFFF0000UL); } #endif /* NEED_COMMON32BI */ /* Construct generic 64-bit implementation. */ #ifdef USE_64BIT #if __GNUC__ >= 4 && defined(__x86_64__) && 0 static inline void absorb_lanes64_8(u64 *dst, const byte *in) { asm ("movdqu 0*16(%[dst]), %%xmm0\n\t" "movdqu 0*16(%[in]), %%xmm4\n\t" "movdqu 1*16(%[dst]), %%xmm1\n\t" "movdqu 1*16(%[in]), %%xmm5\n\t" "movdqu 2*16(%[dst]), %%xmm2\n\t" "movdqu 3*16(%[dst]), %%xmm3\n\t" "pxor %%xmm4, %%xmm0\n\t" "pxor %%xmm5, %%xmm1\n\t" "movdqu 2*16(%[in]), %%xmm4\n\t" "movdqu 3*16(%[in]), %%xmm5\n\t" "movdqu %%xmm0, 0*16(%[dst])\n\t" "pxor %%xmm4, %%xmm2\n\t" "movdqu %%xmm1, 1*16(%[dst])\n\t" "pxor %%xmm5, %%xmm3\n\t" "movdqu %%xmm2, 2*16(%[dst])\n\t" "movdqu %%xmm3, 3*16(%[dst])\n\t" : : [dst] "r" (dst), [in] "r" (in) : "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "memory"); } static inline void absorb_lanes64_4(u64 *dst, const byte *in) { asm ("movdqu 0*16(%[dst]), %%xmm0\n\t" "movdqu 0*16(%[in]), %%xmm4\n\t" "movdqu 1*16(%[dst]), %%xmm1\n\t" "movdqu 1*16(%[in]), %%xmm5\n\t" "pxor %%xmm4, %%xmm0\n\t" "pxor %%xmm5, %%xmm1\n\t" "movdqu %%xmm0, 0*16(%[dst])\n\t" "movdqu %%xmm1, 1*16(%[dst])\n\t" : : [dst] "r" (dst), [in] "r" (in) : "xmm0", "xmm1", "xmm4", "xmm5", "memory"); } static inline void absorb_lanes64_2(u64 *dst, const byte *in) { asm ("movdqu 0*16(%[dst]), %%xmm0\n\t" "movdqu 0*16(%[in]), %%xmm4\n\t" "pxor %%xmm4, %%xmm0\n\t" "movdqu %%xmm0, 0*16(%[dst])\n\t" : : [dst] "r" (dst), [in] "r" (in) : "xmm0", "xmm4", "memory"); } #else /* __x86_64__ */ static inline void absorb_lanes64_8(u64 *dst, const byte *in) { dst[0] ^= buf_get_le64(in + 8 * 0); dst[1] ^= buf_get_le64(in + 8 * 1); dst[2] ^= buf_get_le64(in + 8 * 2); dst[3] ^= buf_get_le64(in + 8 * 3); dst[4] ^= buf_get_le64(in + 8 * 4); dst[5] ^= buf_get_le64(in + 8 * 5); dst[6] ^= buf_get_le64(in + 8 * 6); dst[7] ^= buf_get_le64(in + 8 * 7); } static inline void absorb_lanes64_4(u64 *dst, const byte *in) { dst[0] ^= buf_get_le64(in + 8 * 0); dst[1] ^= buf_get_le64(in + 8 * 1); dst[2] ^= buf_get_le64(in + 8 * 2); dst[3] ^= buf_get_le64(in + 8 * 3); } static inline void absorb_lanes64_2(u64 *dst, const byte *in) { dst[0] ^= buf_get_le64(in + 8 * 0); dst[1] ^= buf_get_le64(in + 8 * 1); } #endif /* !__x86_64__ */ static inline void absorb_lanes64_1(u64 *dst, const byte *in) { dst[0] ^= buf_get_le64(in + 8 * 0); } # define ANDN64(x, y) (~(x) & (y)) # define ROL64(x, n) (((x) << ((unsigned int)n & 63)) | \ ((x) >> ((64 - (unsigned int)(n)) & 63))) # define KECCAK_F1600_PERMUTE_FUNC_NAME keccak_f1600_state_permute64 # define KECCAK_F1600_ABSORB_FUNC_NAME keccak_absorb_lanes64 # include "keccak_permute_64.h" # undef ANDN64 # undef ROL64 # undef KECCAK_F1600_PERMUTE_FUNC_NAME # undef KECCAK_F1600_ABSORB_FUNC_NAME static const keccak_ops_t keccak_generic64_ops = { .permute = keccak_f1600_state_permute64, .absorb = keccak_absorb_lanes64, .extract = keccak_extract64, }; #endif /* USE_64BIT */ /* Construct 64-bit Intel SHLD implementation. */ #ifdef USE_64BIT_SHLD # define ANDN64(x, y) (~(x) & (y)) # define ROL64(x, n) ({ \ u64 tmp = (x); \ asm ("shldq %1, %0, %0" \ : "+r" (tmp) \ : "J" ((n) & 63) \ : "cc"); \ tmp; }) # define KECCAK_F1600_PERMUTE_FUNC_NAME keccak_f1600_state_permute64_shld # define KECCAK_F1600_ABSORB_FUNC_NAME keccak_absorb_lanes64_shld # include "keccak_permute_64.h" # undef ANDN64 # undef ROL64 # undef KECCAK_F1600_PERMUTE_FUNC_NAME # undef KECCAK_F1600_ABSORB_FUNC_NAME static const keccak_ops_t keccak_shld_64_ops = { .permute = keccak_f1600_state_permute64_shld, .absorb = keccak_absorb_lanes64_shld, .extract = keccak_extract64, }; #endif /* USE_64BIT_SHLD */ /* Construct 64-bit Intel BMI2 implementation. */ #ifdef USE_64BIT_BMI2 # define ANDN64(x, y) ({ \ u64 tmp; \ asm ("andnq %2, %1, %0" \ : "=r" (tmp) \ : "r0" (x), "rm" (y)); \ tmp; }) # define ROL64(x, n) ({ \ u64 tmp; \ asm ("rorxq %2, %1, %0" \ : "=r" (tmp) \ : "rm0" (x), "J" (64 - ((n) & 63))); \ tmp; }) # define KECCAK_F1600_PERMUTE_FUNC_NAME keccak_f1600_state_permute64_bmi2 # define KECCAK_F1600_ABSORB_FUNC_NAME keccak_absorb_lanes64_bmi2 # include "keccak_permute_64.h" # undef ANDN64 # undef ROL64 # undef KECCAK_F1600_PERMUTE_FUNC_NAME # undef KECCAK_F1600_ABSORB_FUNC_NAME static const keccak_ops_t keccak_bmi2_64_ops = { .permute = keccak_f1600_state_permute64_bmi2, .absorb = keccak_absorb_lanes64_bmi2, .extract = keccak_extract64, }; #endif /* USE_64BIT_BMI2 */ /* 64-bit Intel AVX512 implementation. */ #ifdef USE_64BIT_AVX512 extern ASM_FUNC_ABI unsigned int _gcry_keccak_f1600_state_permute64_avx512(u64 *state, const u64 *rconst); extern ASM_FUNC_ABI unsigned int _gcry_keccak_absorb_blocks_avx512(u64 *state, const u64 *rconst, const byte *lanes, u64 nlanes, u64 blocklanes, u64 *new_lanes); static unsigned int keccak_f1600_state_permute64_avx512(KECCAK_STATE *hd) { return _gcry_keccak_f1600_state_permute64_avx512 ( hd->u.state64, _gcry_keccak_round_consts_64bit); } static unsigned int keccak_absorb_lanes64_avx512(KECCAK_STATE *hd, int pos, const byte *lanes, size_t nlanes, int blocklanes) { while (nlanes) { if (pos == 0 && blocklanes > 0 && nlanes >= (size_t)blocklanes) { /* Get new pointer through u64 variable for "x32" compatibility. */ u64 new_lanes; nlanes = _gcry_keccak_absorb_blocks_avx512 ( hd->u.state64, _gcry_keccak_round_consts_64bit, lanes, nlanes, blocklanes, &new_lanes); lanes = (const byte *)(uintptr_t)new_lanes; } while (nlanes) { hd->u.state64[pos] ^= buf_get_le64 (lanes); lanes += 8; nlanes--; if (++pos == blocklanes) { keccak_f1600_state_permute64_avx512 (hd); pos = 0; break; } } } return 0; } static const keccak_ops_t keccak_avx512_64_ops = { .permute = keccak_f1600_state_permute64_avx512, .absorb = keccak_absorb_lanes64_avx512, .extract = keccak_extract64, }; #endif /* USE_64BIT_AVX512 */ /* 64-bit ARMv7/NEON implementation. */ #ifdef USE_64BIT_ARM_NEON unsigned int _gcry_keccak_permute_armv7_neon(u64 *state); unsigned int _gcry_keccak_absorb_lanes64_armv7_neon(u64 *state, int pos, const byte *lanes, size_t nlanes, int blocklanes); static unsigned int keccak_permute64_armv7_neon(KECCAK_STATE *hd) { return _gcry_keccak_permute_armv7_neon(hd->u.state64); } static unsigned int keccak_absorb_lanes64_armv7_neon(KECCAK_STATE *hd, int pos, const byte *lanes, size_t nlanes, int blocklanes) { if (blocklanes < 0) { /* blocklanes == -1, permutationless absorb from keccak_final. */ while (nlanes) { hd->u.state64[pos] ^= buf_get_le64(lanes); lanes += 8; nlanes--; } return 0; } else { return _gcry_keccak_absorb_lanes64_armv7_neon(hd->u.state64, pos, lanes, nlanes, blocklanes); } } static const keccak_ops_t keccak_armv7_neon_64_ops = { .permute = keccak_permute64_armv7_neon, .absorb = keccak_absorb_lanes64_armv7_neon, .extract = keccak_extract64, }; #endif /* USE_64BIT_ARM_NEON */ /* Construct generic 32-bit implementation. */ #ifdef USE_32BIT # define ANDN32(x, y) (~(x) & (y)) # define ROL32(x, n) (((x) << ((unsigned int)n & 31)) | \ ((x) >> ((32 - (unsigned int)(n)) & 31))) # define KECCAK_F1600_PERMUTE_FUNC_NAME keccak_f1600_state_permute32bi # include "keccak_permute_32.h" # undef ANDN32 # undef ROL32 # undef KECCAK_F1600_PERMUTE_FUNC_NAME static unsigned int keccak_absorb_lanes32bi(KECCAK_STATE *hd, int pos, const byte *lanes, size_t nlanes, int blocklanes) { unsigned int burn = 0; while (nlanes) { keccak_absorb_lane32bi(&hd->u.state32bi[pos * 2], buf_get_le32(lanes + 0), buf_get_le32(lanes + 4)); lanes += 8; nlanes--; if (++pos == blocklanes) { burn = keccak_f1600_state_permute32bi(hd); pos = 0; } } return burn; } static const keccak_ops_t keccak_generic32bi_ops = { .permute = keccak_f1600_state_permute32bi, .absorb = keccak_absorb_lanes32bi, .extract = keccak_extract32bi, }; #endif /* USE_32BIT */ /* Construct 32-bit Intel BMI2 implementation. */ #ifdef USE_32BIT_BMI2 # define ANDN32(x, y) ({ \ u32 tmp; \ asm ("andnl %2, %1, %0" \ : "=r" (tmp) \ : "r0" (x), "rm" (y)); \ tmp; }) # define ROL32(x, n) ({ \ u32 tmp; \ asm ("rorxl %2, %1, %0" \ : "=r" (tmp) \ : "rm0" (x), "J" (32 - ((n) & 31))); \ tmp; }) # define KECCAK_F1600_PERMUTE_FUNC_NAME keccak_f1600_state_permute32bi_bmi2 # include "keccak_permute_32.h" # undef ANDN32 # undef ROL32 # undef KECCAK_F1600_PERMUTE_FUNC_NAME static inline u32 pext(u32 x, u32 mask) { u32 tmp; asm ("pextl %2, %1, %0" : "=r" (tmp) : "r0" (x), "rm" (mask)); return tmp; } static inline u32 pdep(u32 x, u32 mask) { u32 tmp; asm ("pdepl %2, %1, %0" : "=r" (tmp) : "r0" (x), "rm" (mask)); return tmp; } static inline void keccak_absorb_lane32bi_bmi2(u32 *lane, u32 x0, u32 x1) { x0 = pdep(pext(x0, 0x55555555), 0x0000ffff) | (pext(x0, 0xaaaaaaaa) << 16); x1 = pdep(pext(x1, 0x55555555), 0x0000ffff) | (pext(x1, 0xaaaaaaaa) << 16); lane[0] ^= (x0 & 0x0000FFFFUL) + (x1 << 16); lane[1] ^= (x0 >> 16) + (x1 & 0xFFFF0000UL); } static unsigned int keccak_absorb_lanes32bi_bmi2(KECCAK_STATE *hd, int pos, const byte *lanes, size_t nlanes, int blocklanes) { unsigned int burn = 0; while (nlanes) { keccak_absorb_lane32bi_bmi2(&hd->u.state32bi[pos * 2], buf_get_le32(lanes + 0), buf_get_le32(lanes + 4)); lanes += 8; nlanes--; if (++pos == blocklanes) { burn = keccak_f1600_state_permute32bi_bmi2(hd); pos = 0; } } return burn; } static unsigned int keccak_extract32bi_bmi2(KECCAK_STATE *hd, unsigned int pos, byte *outbuf, unsigned int outlen) { unsigned int i; u32 x0; u32 x1; u32 t; /* NOTE: when pos == 0, hd and outbuf may point to same memory (SHA-3). */ for (i = pos; i < pos + outlen / 8 + !!(outlen % 8); i++) { x0 = hd->u.state32bi[i * 2 + 0]; x1 = hd->u.state32bi[i * 2 + 1]; t = (x0 & 0x0000FFFFUL) + (x1 << 16); x1 = (x0 >> 16) + (x1 & 0xFFFF0000UL); x0 = t; x0 = pdep(pext(x0, 0xffff0001), 0xaaaaaaab) | pdep(x0 >> 1, 0x55555554); x1 = pdep(pext(x1, 0xffff0001), 0xaaaaaaab) | pdep(x1 >> 1, 0x55555554); buf_put_le32(&outbuf[0], x0); buf_put_le32(&outbuf[4], x1); outbuf += 8; } return 0; } static const keccak_ops_t keccak_bmi2_32bi_ops = { .permute = keccak_f1600_state_permute32bi_bmi2, .absorb = keccak_absorb_lanes32bi_bmi2, .extract = keccak_extract32bi_bmi2, }; #endif /* USE_32BIT_BMI2 */ #ifdef USE_S390X_CRYPTO #include "asm-inline-s390x.h" static inline void keccak_bwrite_s390x (void *context, const byte *in, size_t inlen) { KECCAK_CONTEXT *ctx = context; /* Write full-blocks. */ kimd_execute (ctx->kimd_func, &ctx->state, in, inlen); return; } static inline void keccak_final_s390x (void *context) { KECCAK_CONTEXT *ctx = context; if (ctx->suffix == SHA3_DELIMITED_SUFFIX) { klmd_execute (ctx->kimd_func, &ctx->state, ctx->buf, ctx->count); } else { klmd_shake_execute (ctx->kimd_func, &ctx->state, NULL, 0, ctx->buf, ctx->count); ctx->count = 0; ctx->buf_pos = 0; } return; } static inline void keccak_bextract_s390x (void *context, byte *out, size_t outlen) { KECCAK_CONTEXT *ctx = context; /* Extract full-blocks. */ klmd_shake_execute (ctx->kimd_func | KLMD_PADDING_STATE, &ctx->state, out, outlen, NULL, 0); return; } static void keccak_write_s390x (void *context, const byte *inbuf, size_t inlen) { KECCAK_CONTEXT *hd = context; const size_t blocksize = hd->blocksize; size_t inblocks; size_t copylen; while (hd->count) { if (hd->count == blocksize) /* Flush the buffer. */ { keccak_bwrite_s390x (hd, hd->buf, blocksize); hd->count = 0; } else { copylen = inlen; if (copylen > blocksize - hd->count) copylen = blocksize - hd->count; if (copylen == 0) break; buf_cpy (&hd->buf[hd->count], inbuf, copylen); hd->count += copylen; inbuf += copylen; inlen -= copylen; } } if (inlen == 0) return; if (inlen >= blocksize) { inblocks = inlen / blocksize; keccak_bwrite_s390x (hd, inbuf, inblocks * blocksize); hd->count = 0; inlen -= inblocks * blocksize; inbuf += inblocks * blocksize; } if (inlen) { buf_cpy (hd->buf, inbuf, inlen); hd->count = inlen; } } static void keccak_extract_s390x (void *context, void *outbuf_arg, size_t outlen) { KECCAK_CONTEXT *hd = context; const size_t blocksize = hd->blocksize; byte *outbuf = outbuf_arg; while (outlen) { gcry_assert(hd->count == 0 || hd->buf_pos < hd->count); if (hd->buf_pos < hd->count && outlen) { size_t copylen = hd->count - hd->buf_pos; if (copylen > outlen) copylen = outlen; buf_cpy (outbuf, &hd->buf[hd->buf_pos], copylen); outbuf += copylen; outlen -= copylen; hd->buf_pos += copylen; } if (hd->buf_pos == hd->count) { hd->buf_pos = 0; hd->count = 0; } if (outlen == 0) return; if (outlen >= blocksize) { size_t outblocks = outlen / blocksize; keccak_bextract_s390x (context, outbuf, outblocks * blocksize); outlen -= outblocks * blocksize; outbuf += outblocks * blocksize; if (outlen == 0) return; } keccak_bextract_s390x (context, hd->buf, blocksize); hd->count = blocksize; } } #endif /* USE_S390X_CRYPTO */ static void keccak_write (void *context, const void *inbuf_arg, size_t inlen) { KECCAK_CONTEXT *ctx = context; const size_t bsize = ctx->blocksize; const size_t blocklanes = bsize / 8; const byte *inbuf = inbuf_arg; unsigned int nburn, burn = 0; unsigned int count, i; unsigned int pos; size_t nlanes; #ifdef USE_S390X_CRYPTO if (ctx->kimd_func) { keccak_write_s390x (context, inbuf, inlen); return; } #endif count = ctx->count; if (inlen && (count % 8)) { byte lane[8] = { 0, }; /* Complete absorbing partial input lane. */ pos = count / 8; for (i = count % 8; inlen && i < 8; i++) { lane[i] = *inbuf++; inlen--; count++; } if (count == bsize) count = 0; nburn = ctx->ops->absorb(&ctx->state, pos, lane, 1, (count % 8) ? -1 : blocklanes); burn = nburn > burn ? nburn : burn; } /* Absorb full input lanes. */ pos = count / 8; nlanes = inlen / 8; if (nlanes > 0) { nburn = ctx->ops->absorb(&ctx->state, pos, inbuf, nlanes, blocklanes); burn = nburn > burn ? nburn : burn; inlen -= nlanes * 8; inbuf += nlanes * 8; count = ((size_t) count + nlanes * 8) % bsize; } if (inlen) { byte lane[8] = { 0, }; /* Absorb remaining partial input lane. */ pos = count / 8; for (i = count % 8; inlen && i < 8; i++) { lane[i] = *inbuf++; inlen--; count++; } nburn = ctx->ops->absorb(&ctx->state, pos, lane, 1, -1); burn = nburn > burn ? nburn : burn; gcry_assert(count < bsize); } ctx->count = count; if (burn) _gcry_burn_stack (burn); } static void keccak_init (int algo, void *context, unsigned int flags) { KECCAK_CONTEXT *ctx = context; KECCAK_STATE *hd = &ctx->state; unsigned int features = _gcry_get_hw_features (); (void)flags; (void)features; memset (hd, 0, sizeof *hd); ctx->count = 0; ctx->shake_in_extract_mode = 0; ctx->shake_in_read_mode = 0; /* Select generic implementation. */ #ifdef USE_64BIT ctx->ops = &keccak_generic64_ops; #elif defined USE_32BIT ctx->ops = &keccak_generic32bi_ops; #endif /* Select optimized implementation based in hw features. */ if (0) {} #ifdef USE_64BIT_AVX512 else if (features & HWF_INTEL_AVX512) ctx->ops = &keccak_avx512_64_ops; #endif #ifdef USE_64BIT_ARM_NEON else if (features & HWF_ARM_NEON) ctx->ops = &keccak_armv7_neon_64_ops; #endif #ifdef USE_64BIT_BMI2 else if (features & HWF_INTEL_BMI2) ctx->ops = &keccak_bmi2_64_ops; #endif #ifdef USE_32BIT_BMI2 else if (features & HWF_INTEL_BMI2) ctx->ops = &keccak_bmi2_32bi_ops; #endif #ifdef USE_64BIT_SHLD else if (features & HWF_INTEL_FAST_SHLD) ctx->ops = &keccak_shld_64_ops; #endif /* Set input block size, in Keccak terms this is called 'rate'. */ switch (algo) { case GCRY_MD_SHA3_224: ctx->suffix = SHA3_DELIMITED_SUFFIX; ctx->blocksize = 1152 / 8; ctx->outlen = 224 / 8; break; case GCRY_MD_SHA3_256: ctx->suffix = SHA3_DELIMITED_SUFFIX; ctx->blocksize = 1088 / 8; ctx->outlen = 256 / 8; break; case GCRY_MD_SHA3_384: ctx->suffix = SHA3_DELIMITED_SUFFIX; ctx->blocksize = 832 / 8; ctx->outlen = 384 / 8; break; case GCRY_MD_SHA3_512: ctx->suffix = SHA3_DELIMITED_SUFFIX; ctx->blocksize = 576 / 8; ctx->outlen = 512 / 8; break; case GCRY_MD_CSHAKE128: case GCRY_MD_SHAKE128: ctx->suffix = SHAKE_DELIMITED_SUFFIX; ctx->blocksize = 1344 / 8; ctx->outlen = 256 / 8; break; case GCRY_MD_CSHAKE256: case GCRY_MD_SHAKE256: ctx->suffix = SHAKE_DELIMITED_SUFFIX; ctx->blocksize = 1088 / 8; ctx->outlen = 512 / 8; break; default: BUG(); } #ifdef USE_S390X_CRYPTO ctx->kimd_func = 0; if ((features & HWF_S390X_MSA) != 0) { unsigned int kimd_func = 0; switch (algo) { case GCRY_MD_SHA3_224: kimd_func = KMID_FUNCTION_SHA3_224; break; case GCRY_MD_SHA3_256: kimd_func = KMID_FUNCTION_SHA3_256; break; case GCRY_MD_SHA3_384: kimd_func = KMID_FUNCTION_SHA3_384; break; case GCRY_MD_SHA3_512: kimd_func = KMID_FUNCTION_SHA3_512; break; case GCRY_MD_CSHAKE128: case GCRY_MD_SHAKE128: kimd_func = KMID_FUNCTION_SHAKE128; break; case GCRY_MD_CSHAKE256: case GCRY_MD_SHAKE256: kimd_func = KMID_FUNCTION_SHAKE256; break; } if ((kimd_query () & km_function_to_mask (kimd_func)) && (klmd_query () & km_function_to_mask (kimd_func))) { ctx->kimd_func = kimd_func; } } #endif } static void sha3_224_init (void *context, unsigned int flags) { keccak_init (GCRY_MD_SHA3_224, context, flags); } static void sha3_256_init (void *context, unsigned int flags) { keccak_init (GCRY_MD_SHA3_256, context, flags); } static void sha3_384_init (void *context, unsigned int flags) { keccak_init (GCRY_MD_SHA3_384, context, flags); } static void sha3_512_init (void *context, unsigned int flags) { keccak_init (GCRY_MD_SHA3_512, context, flags); } static void shake128_init (void *context, unsigned int flags) { keccak_init (GCRY_MD_SHAKE128, context, flags); } static void shake256_init (void *context, unsigned int flags) { keccak_init (GCRY_MD_SHAKE256, context, flags); } /* The routine final terminates the computation and * returns the digest. * The handle is prepared for a new cycle, but adding bytes to the * handle will the destroy the returned buffer. * Returns: 64 bytes representing the digest. When used for sha384, * we take the leftmost 48 of those bytes. */ static void keccak_final (void *context) { KECCAK_CONTEXT *ctx = context; KECCAK_STATE *hd = &ctx->state; const size_t bsize = ctx->blocksize; const byte suffix = ctx->suffix; unsigned int nburn, burn = 0; unsigned int lastbytes; byte lane[8]; #ifdef USE_S390X_CRYPTO if (ctx->kimd_func) { keccak_final_s390x (context); return; } #endif lastbytes = ctx->count; /* Do the padding and switch to the squeezing phase */ /* Absorb the last few bits and add the first bit of padding (which coincides with the delimiter in delimited suffix) */ buf_put_le64(lane, (u64)suffix << ((lastbytes % 8) * 8)); nburn = ctx->ops->absorb(&ctx->state, lastbytes / 8, lane, 1, -1); burn = nburn > burn ? nburn : burn; /* Add the second bit of padding. */ buf_put_le64(lane, (u64)0x80 << (((bsize - 1) % 8) * 8)); nburn = ctx->ops->absorb(&ctx->state, (bsize - 1) / 8, lane, 1, -1); burn = nburn > burn ? nburn : burn; if (suffix == SHA3_DELIMITED_SUFFIX) { /* Switch to the squeezing phase. */ nburn = ctx->ops->permute(hd); burn = nburn > burn ? nburn : burn; /* Squeeze out the SHA3 digest. */ nburn = ctx->ops->extract(hd, 0, (void *)hd, ctx->outlen); burn = nburn > burn ? nburn : burn; } else { /* Output for SHAKE can now be read with md_extract(). */ ctx->count = 0; } wipememory(lane, sizeof(lane)); if (burn) _gcry_burn_stack (burn); } static byte * keccak_read (void *context) { KECCAK_CONTEXT *ctx = (KECCAK_CONTEXT *) context; KECCAK_STATE *hd = &ctx->state; return (byte *)&hd->u; } static gcry_err_code_t do_keccak_extract (void *context, void *out, size_t outlen) { KECCAK_CONTEXT *ctx = context; KECCAK_STATE *hd = &ctx->state; const size_t bsize = ctx->blocksize; unsigned int nburn, burn = 0; byte *outbuf = out; unsigned int nlanes; unsigned int nleft; unsigned int count; unsigned int i; byte lane[8]; #ifdef USE_S390X_CRYPTO if (ctx->kimd_func) { keccak_extract_s390x (context, out, outlen); return 0; } #endif count = ctx->count; while (count && outlen && (outlen < 8 || count % 8)) { /* Extract partial lane. */ nburn = ctx->ops->extract(hd, count / 8, lane, 8); burn = nburn > burn ? nburn : burn; for (i = count % 8; outlen && i < 8; i++) { *outbuf++ = lane[i]; outlen--; count++; } gcry_assert(count <= bsize); if (count == bsize) count = 0; } if (outlen >= 8 && count) { /* Extract tail of partial block. */ nlanes = outlen / 8; nleft = (bsize - count) / 8; nlanes = nlanes < nleft ? nlanes : nleft; nburn = ctx->ops->extract(hd, count / 8, outbuf, nlanes * 8); burn = nburn > burn ? nburn : burn; outlen -= nlanes * 8; outbuf += nlanes * 8; count += nlanes * 8; gcry_assert(count <= bsize); if (count == bsize) count = 0; } while (outlen >= bsize) { gcry_assert(count == 0); /* Squeeze more. */ nburn = ctx->ops->permute(hd); burn = nburn > burn ? nburn : burn; /* Extract full block. */ nburn = ctx->ops->extract(hd, 0, outbuf, bsize); burn = nburn > burn ? nburn : burn; outlen -= bsize; outbuf += bsize; } if (outlen) { gcry_assert(outlen < bsize); if (count == 0) { /* Squeeze more. */ nburn = ctx->ops->permute(hd); burn = nburn > burn ? nburn : burn; } if (outlen >= 8) { /* Extract head of partial block. */ nlanes = outlen / 8; nburn = ctx->ops->extract(hd, count / 8, outbuf, nlanes * 8); burn = nburn > burn ? nburn : burn; outlen -= nlanes * 8; outbuf += nlanes * 8; count += nlanes * 8; gcry_assert(count < bsize); } if (outlen) { /* Extract head of partial lane. */ nburn = ctx->ops->extract(hd, count / 8, lane, 8); burn = nburn > burn ? nburn : burn; for (i = count % 8; outlen && i < 8; i++) { *outbuf++ = lane[i]; outlen--; count++; } gcry_assert(count < bsize); } } ctx->count = count; if (burn) _gcry_burn_stack (burn); return 0; } static gcry_err_code_t keccak_extract (void *context, void *out, size_t outlen) { KECCAK_CONTEXT *ctx = context; if (ctx->shake_in_read_mode) return GPG_ERR_INV_STATE; if (!ctx->shake_in_extract_mode) ctx->shake_in_extract_mode = 1; return do_keccak_extract (context, out, outlen); } static byte * keccak_shake_read (void *context) { KECCAK_CONTEXT *ctx = (KECCAK_CONTEXT *) context; KECCAK_STATE *hd = &ctx->state; if (ctx->shake_in_extract_mode) { /* Already in extract mode. */ return NULL; } if (!ctx->shake_in_read_mode) { byte tmpbuf[64]; gcry_assert(sizeof(tmpbuf) >= ctx->outlen); ctx->shake_in_read_mode = 1; do_keccak_extract (context, tmpbuf, ctx->outlen); buf_cpy (&hd->u, tmpbuf, ctx->outlen); wipememory(tmpbuf, sizeof(tmpbuf)); } return (byte *)&hd->u; } /* Variant of the above shortcut function using multiple buffers. */ #define _gcry_sha3_hash_buffers 0 #define _gcry_sha3_224_hash_buffers 0 #define _gcry_sha3_256_hash_buffers 0 #define _gcry_sha3_384_hash_buffers 0 #define _gcry_sha3_512_hash_buffers 0 #define _gcry_shake128_hash_buffers 0 #define _gcry_shake256_hash_buffers 0 static unsigned int cshake_input_n (KECCAK_CONTEXT *ctx, const void *n, unsigned int n_len) { unsigned char buf[3]; buf[0] = 1; buf[1] = ctx->blocksize; keccak_write (ctx, buf, 2); /* Here, N_LEN must be less than 255 */ if (n_len < 32) { buf[0] = 1; buf[1] = n_len * 8; } else { buf[0] = 2; buf[1] = (n_len * 8) >> 8; buf[2] = (n_len * 8) & 0xff; } keccak_write (ctx, buf, buf[0] + 1); keccak_write (ctx, n, n_len); return 2 + buf[0] + 1 + n_len; } static void cshake_input_s (KECCAK_CONTEXT *ctx, const void *s, unsigned int s_len, unsigned int len_written) { unsigned char buf[168]; unsigned int padlen; /* Here, S_LEN must be less than 255 */ if (s_len < 32) { buf[0] = 1; buf[1] = s_len * 8; } else { buf[0] = 2; buf[1] = (s_len * 8) >> 8; buf[2] = (s_len * 8) & 0xff; } keccak_write (ctx, buf, buf[0] + 1); keccak_write (ctx, s, s_len); len_written += buf[0] + 1 + s_len; padlen = ctx->blocksize - (len_written % ctx->blocksize); memset (buf, 0, padlen); keccak_write (ctx, buf, padlen); } gpg_err_code_t _gcry_cshake_customize (void *context, struct gcry_cshake_customization *p) { KECCAK_CONTEXT *ctx = (KECCAK_CONTEXT *) context; unsigned int len_written; if (p->n_len >= 255 || p->s_len >= 255) return GPG_ERR_TOO_LARGE; if (p->n_len == 0 && p->s_len == 0) /* No customization */ return 0; len_written = cshake_input_n (ctx, p->n, p->n_len); cshake_input_s (ctx, p->s, p->s_len, len_written); ctx->suffix = CSHAKE_DELIMITED_SUFFIX; return 0; } static void cshake128_init (void *context, unsigned int flags) { keccak_init (GCRY_MD_CSHAKE128, context, flags); } static void cshake256_init (void *context, unsigned int flags) { keccak_init (GCRY_MD_CSHAKE256, context, flags); } #define _gcry_cshake128_hash_buffers 0 #define _gcry_cshake256_hash_buffers 0 /* Self-test section. */ /* Run a full self-test for ALGO and return 0 on success. */ /* Object IDs obtained from * https://csrc.nist.gov/projects/computer-security-objects-register/algorithm-registration#Hash */ static const byte sha3_224_asn[] = { 0x30, 0x2d, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x07, 0x05, 0x00, 0x04, 0x1c }; static const gcry_md_oid_spec_t oid_spec_sha3_224[] = { { "2.16.840.1.101.3.4.2.7" }, /* id-rsassa-pkcs1-v1-5-with-sha3-224 */ { "2.16.840.1.101.3.4.3.13" }, /* id-ecdsa-with-sha3-224 */ { "2.16.840.1.101.3.4.3.9" }, { NULL } }; static const byte sha3_256_asn[] = { 0x30, 0x31, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x08, 0x05, 0x00, 0x04, 0x20 }; static const gcry_md_oid_spec_t oid_spec_sha3_256[] = { { "2.16.840.1.101.3.4.2.8" }, /* id-rsassa-pkcs1-v1-5-with-sha3-256 */ { "2.16.840.1.101.3.4.3.14" }, /* id-ecdsa-with-sha3-256 */ { "2.16.840.1.101.3.4.3.10" }, { NULL } }; static const byte sha3_384_asn[] = { 0x30, 0x41, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x09, 0x05, 0x00, 0x04, 0x30 }; static const gcry_md_oid_spec_t oid_spec_sha3_384[] = { { "2.16.840.1.101.3.4.2.9" }, /* id-rsassa-pkcs1-v1-5-with-sha3-384 */ { "2.16.840.1.101.3.4.3.15" }, /* id-ecdsa-with-sha3-384 */ { "2.16.840.1.101.3.4.3.11" }, { NULL } }; static const byte sha3_512_asn[] = { 0x30, 0x51, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x0a, 0x05, 0x00, 0x04, 0x40 }; static const gcry_md_oid_spec_t oid_spec_sha3_512[] = { { "2.16.840.1.101.3.4.2.10" }, /* id-rsassa-pkcs1-v1-5-with-sha3-512 */ { "2.16.840.1.101.3.4.3.16" }, /* id-ecdsa-with-sha3-512 */ { "2.16.840.1.101.3.4.3.12" }, { NULL } }; static const byte shake128_asn[] = { 0x30, 0x31, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x0b, 0x05, 0x00, 0x04, 0x20 }; static const gcry_md_oid_spec_t oid_spec_shake128[] = { { "2.16.840.1.101.3.4.2.11" }, /* RFC 8692 id-RSASSA-PSS-SHAKE128 */ { "1.3.6.1.5.5.7.6.30" }, /* RFC 8692 id-ecdsa-with-shake128 */ { "1.3.6.1.5.5.7.6.32" }, { NULL } }; static const byte shake256_asn[] = { 0x30, 0x51, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x0c, 0x05, 0x00, 0x04, 0x40 }; static const gcry_md_oid_spec_t oid_spec_shake256[] = { { "2.16.840.1.101.3.4.2.12" }, /* RFC 8692 id-RSASSA-PSS-SHAKE256 */ { "1.3.6.1.5.5.7.6.31" }, /* RFC 8692 id-ecdsa-with-shake256 */ { "1.3.6.1.5.5.7.6.33" }, { NULL } }; gcry_md_spec_t _gcry_digest_spec_sha3_224 = { GCRY_MD_SHA3_224, {0, 1}, "SHA3-224", sha3_224_asn, DIM (sha3_224_asn), oid_spec_sha3_224, 28, sha3_224_init, keccak_write, keccak_final, keccak_read, NULL, _gcry_sha3_224_hash_buffers, sizeof (KECCAK_CONTEXT), GRUB_UTIL_MODNAME("gcry_keccak") .blocksize = 144.0 }; gcry_md_spec_t _gcry_digest_spec_sha3_256 = { GCRY_MD_SHA3_256, {0, 1}, "SHA3-256", sha3_256_asn, DIM (sha3_256_asn), oid_spec_sha3_256, 32, sha3_256_init, keccak_write, keccak_final, keccak_read, NULL, _gcry_sha3_256_hash_buffers, sizeof (KECCAK_CONTEXT), GRUB_UTIL_MODNAME("gcry_keccak") .blocksize = 136.0 }; gcry_md_spec_t _gcry_digest_spec_sha3_384 = { GCRY_MD_SHA3_384, {0, 1}, "SHA3-384", sha3_384_asn, DIM (sha3_384_asn), oid_spec_sha3_384, 48, sha3_384_init, keccak_write, keccak_final, keccak_read, NULL, _gcry_sha3_384_hash_buffers, sizeof (KECCAK_CONTEXT), GRUB_UTIL_MODNAME("gcry_keccak") .blocksize = 104.0 }; gcry_md_spec_t _gcry_digest_spec_sha3_512 = { GCRY_MD_SHA3_512, {0, 1}, "SHA3-512", sha3_512_asn, DIM (sha3_512_asn), oid_spec_sha3_512, 64, sha3_512_init, keccak_write, keccak_final, keccak_read, NULL, _gcry_sha3_512_hash_buffers, sizeof (KECCAK_CONTEXT), GRUB_UTIL_MODNAME("gcry_keccak") .blocksize = 72.0 }; gcry_md_spec_t _gcry_digest_spec_shake128 = { GCRY_MD_SHAKE128, {0, 1}, "SHAKE128", shake128_asn, DIM (shake128_asn), oid_spec_shake128, 32, shake128_init, keccak_write, keccak_final, keccak_shake_read, keccak_extract, _gcry_shake128_hash_buffers, sizeof (KECCAK_CONTEXT), GRUB_UTIL_MODNAME("gcry_keccak") .blocksize = 64 }; gcry_md_spec_t _gcry_digest_spec_shake256 = { GCRY_MD_SHAKE256, {0, 1}, "SHAKE256", shake256_asn, DIM (shake256_asn), oid_spec_shake256, 64, shake256_init, keccak_write, keccak_final, keccak_shake_read, keccak_extract, _gcry_shake256_hash_buffers, sizeof (KECCAK_CONTEXT), GRUB_UTIL_MODNAME("gcry_keccak") .blocksize = 64 }; gcry_md_spec_t _gcry_digest_spec_cshake128 = { GCRY_MD_CSHAKE128, {0, 1}, "CSHAKE128", NULL, 0, NULL, 32, cshake128_init, keccak_write, keccak_final, keccak_shake_read, keccak_extract, _gcry_cshake128_hash_buffers, sizeof (KECCAK_CONTEXT), GRUB_UTIL_MODNAME("gcry_keccak") .blocksize = 64 }; gcry_md_spec_t _gcry_digest_spec_cshake256 = { GCRY_MD_CSHAKE256, {0, 1}, "CSHAKE256", NULL, 0, NULL, 64, cshake256_init, keccak_write, keccak_final, keccak_shake_read, keccak_extract, _gcry_cshake256_hash_buffers, sizeof (KECCAK_CONTEXT), GRUB_UTIL_MODNAME("gcry_keccak") .blocksize = 64 }; GRUB_MOD_INIT(gcry_keccak) { grub_md_register (&_gcry_digest_spec_sha3_224); grub_md_register (&_gcry_digest_spec_sha3_256); grub_md_register (&_gcry_digest_spec_sha3_384); grub_md_register (&_gcry_digest_spec_sha3_512); grub_md_register (&_gcry_digest_spec_shake128); grub_md_register (&_gcry_digest_spec_shake256); grub_md_register (&_gcry_digest_spec_cshake128); grub_md_register (&_gcry_digest_spec_cshake256); } GRUB_MOD_FINI(gcry_keccak) { grub_md_unregister (&_gcry_digest_spec_sha3_224); grub_md_unregister (&_gcry_digest_spec_sha3_256); grub_md_unregister (&_gcry_digest_spec_sha3_384); grub_md_unregister (&_gcry_digest_spec_sha3_512); grub_md_unregister (&_gcry_digest_spec_shake128); grub_md_unregister (&_gcry_digest_spec_shake256); grub_md_unregister (&_gcry_digest_spec_cshake128); grub_md_unregister (&_gcry_digest_spec_cshake256); } grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/cipher/gost28147.c0000644000175000017500000003565115036452441022403 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ #include GRUB_MOD_LICENSE ("GPLv3+"); /* gost28147.c - GOST 28147-89 implementation for Libgcrypt * Copyright (C) 2012 Free Software Foundation, Inc. * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . */ /* GOST 28147-89 defines several modes of encryption: * - ECB which should be used only for key transfer * - CFB mode * - OFB-like mode with additional transformation on keystream * RFC 5830 names this 'counter encryption' mode * Original GOST text uses the term 'gammirovanie' * - MAC mode ('imitovstavka') * * This implementation handles ECB and CFB modes via usual libgcrypt handling. * OFB-like modes are unsupported. */ #include "types.h" #include "g10lib.h" #include "cipher.h" #include "mac-internal.h" #include "bufhelp.h" #include "cipher-internal.h" #include "gost.h" #include "gost-sb.h" static void gost_do_set_sbox (GOST28147_context *ctx, unsigned int index) { ctx->sbox = gost_oid_map[index].sbox; ctx->mesh_limit = gost_oid_map[index].keymeshing ? 1024 : 0; } static gcry_err_code_t gost_setkey (void *c, const byte *key, unsigned keylen, cipher_bulk_ops_t *bulk_ops) { int i; GOST28147_context *ctx = c; (void)bulk_ops; if (keylen != 256 / 8) return GPG_ERR_INV_KEYLEN; if (!ctx->sbox) gost_do_set_sbox (ctx, 0); for (i = 0; i < 8; i++) { ctx->key[i] = buf_get_le32(&key[4*i]); } ctx->mesh_counter = 0; return GPG_ERR_NO_ERROR; } static inline u32 gost_val (u32 subkey, u32 cm1, const u32 *sbox) { cm1 += subkey; cm1 = sbox[0*256 + ((cm1 >> 0) & 0xff)] | sbox[1*256 + ((cm1 >> 8) & 0xff)] | sbox[2*256 + ((cm1 >> 16) & 0xff)] | sbox[3*256 + ((cm1 >> 24) & 0xff)]; return cm1; } static unsigned int _gost_encrypt_data (const u32 *sbox, const u32 *key, u32 *o1, u32 *o2, u32 n1, u32 n2) { n2 ^= gost_val (key[0], n1, sbox); n1 ^= gost_val (key[1], n2, sbox); n2 ^= gost_val (key[2], n1, sbox); n1 ^= gost_val (key[3], n2, sbox); n2 ^= gost_val (key[4], n1, sbox); n1 ^= gost_val (key[5], n2, sbox); n2 ^= gost_val (key[6], n1, sbox); n1 ^= gost_val (key[7], n2, sbox); n2 ^= gost_val (key[0], n1, sbox); n1 ^= gost_val (key[1], n2, sbox); n2 ^= gost_val (key[2], n1, sbox); n1 ^= gost_val (key[3], n2, sbox); n2 ^= gost_val (key[4], n1, sbox); n1 ^= gost_val (key[5], n2, sbox); n2 ^= gost_val (key[6], n1, sbox); n1 ^= gost_val (key[7], n2, sbox); n2 ^= gost_val (key[0], n1, sbox); n1 ^= gost_val (key[1], n2, sbox); n2 ^= gost_val (key[2], n1, sbox); n1 ^= gost_val (key[3], n2, sbox); n2 ^= gost_val (key[4], n1, sbox); n1 ^= gost_val (key[5], n2, sbox); n2 ^= gost_val (key[6], n1, sbox); n1 ^= gost_val (key[7], n2, sbox); n2 ^= gost_val (key[7], n1, sbox); n1 ^= gost_val (key[6], n2, sbox); n2 ^= gost_val (key[5], n1, sbox); n1 ^= gost_val (key[4], n2, sbox); n2 ^= gost_val (key[3], n1, sbox); n1 ^= gost_val (key[2], n2, sbox); n2 ^= gost_val (key[1], n1, sbox); n1 ^= gost_val (key[0], n2, sbox); *o1 = n2; *o2 = n1; return /* burn_stack */ 4*sizeof(void*) /* func call */ + 3*sizeof(void*) /* stack */ + 4*sizeof(void*) /* gost_val call */; } static unsigned int gost_encrypt_block (void *c, byte *outbuf, const byte *inbuf) { GOST28147_context *ctx = c; u32 n1, n2; unsigned int burn; n1 = buf_get_le32 (inbuf); n2 = buf_get_le32 (inbuf+4); burn = _gost_encrypt_data(ctx->sbox, ctx->key, &n1, &n2, n1, n2); buf_put_le32 (outbuf+0, n1); buf_put_le32 (outbuf+4, n2); return /* burn_stack */ burn + 6*sizeof(void*) /* func call */; } unsigned int _gcry_gost_enc_data (const u32 *key, u32 *o1, u32 *o2, u32 n1, u32 n2, int cryptopro) { const u32 *sbox; if (cryptopro) sbox = sbox_CryptoPro_3411; else sbox = sbox_test_3411; return _gost_encrypt_data (sbox, key, o1, o2, n1, n2) + 7 * sizeof(void *); } static unsigned int gost_decrypt_block (void *c, byte *outbuf, const byte *inbuf) { GOST28147_context *ctx = c; u32 n1, n2; const u32 *sbox = ctx->sbox; n1 = buf_get_le32 (inbuf); n2 = buf_get_le32 (inbuf+4); n2 ^= gost_val (ctx->key[0], n1, sbox); n1 ^= gost_val (ctx->key[1], n2, sbox); n2 ^= gost_val (ctx->key[2], n1, sbox); n1 ^= gost_val (ctx->key[3], n2, sbox); n2 ^= gost_val (ctx->key[4], n1, sbox); n1 ^= gost_val (ctx->key[5], n2, sbox); n2 ^= gost_val (ctx->key[6], n1, sbox); n1 ^= gost_val (ctx->key[7], n2, sbox); n2 ^= gost_val (ctx->key[7], n1, sbox); n1 ^= gost_val (ctx->key[6], n2, sbox); n2 ^= gost_val (ctx->key[5], n1, sbox); n1 ^= gost_val (ctx->key[4], n2, sbox); n2 ^= gost_val (ctx->key[3], n1, sbox); n1 ^= gost_val (ctx->key[2], n2, sbox); n2 ^= gost_val (ctx->key[1], n1, sbox); n1 ^= gost_val (ctx->key[0], n2, sbox); n2 ^= gost_val (ctx->key[7], n1, sbox); n1 ^= gost_val (ctx->key[6], n2, sbox); n2 ^= gost_val (ctx->key[5], n1, sbox); n1 ^= gost_val (ctx->key[4], n2, sbox); n2 ^= gost_val (ctx->key[3], n1, sbox); n1 ^= gost_val (ctx->key[2], n2, sbox); n2 ^= gost_val (ctx->key[1], n1, sbox); n1 ^= gost_val (ctx->key[0], n2, sbox); n2 ^= gost_val (ctx->key[7], n1, sbox); n1 ^= gost_val (ctx->key[6], n2, sbox); n2 ^= gost_val (ctx->key[5], n1, sbox); n1 ^= gost_val (ctx->key[4], n2, sbox); n2 ^= gost_val (ctx->key[3], n1, sbox); n1 ^= gost_val (ctx->key[2], n2, sbox); n2 ^= gost_val (ctx->key[1], n1, sbox); n1 ^= gost_val (ctx->key[0], n2, sbox); buf_put_le32 (outbuf+0, n2); buf_put_le32 (outbuf+4, n1); return /* burn_stack */ 4*sizeof(void*) /* func call */ + 3*sizeof(void*) /* stack */ + 4*sizeof(void*) /* gost_val call */; } static gpg_err_code_t gost_set_sbox (GOST28147_context *ctx, const char *oid) { int i; for (i = 0; gost_oid_map[i].oid; i++) { if (!strcmp(gost_oid_map[i].oid, oid)) { gost_do_set_sbox (ctx, i); return 0; } } return GPG_ERR_VALUE_NOT_FOUND; } static gpg_err_code_t gost_set_extra_info (void *c, int what, const void *buffer, size_t buflen) { GOST28147_context *ctx = c; gpg_err_code_t ec = 0; (void)buffer; (void)buflen; switch (what) { case GCRYCTL_SET_SBOX: ec = gost_set_sbox (ctx, buffer); break; default: ec = GPG_ERR_INV_OP; break; } return ec; } static const byte CryptoProKeyMeshingKey[] = { 0x69, 0x00, 0x72, 0x22, 0x64, 0xC9, 0x04, 0x23, 0x8D, 0x3A, 0xDB, 0x96, 0x46, 0xE9, 0x2A, 0xC4, 0x18, 0xFE, 0xAC, 0x94, 0x00, 0xED, 0x07, 0x12, 0xC0, 0x86, 0xDC, 0xC2, 0xEF, 0x4C, 0xA9, 0x2B }; /* Implements key meshing algorithm by modifing ctx and returning new IV. Thanks to Dmitry Belyavskiy. */ static void cryptopro_key_meshing (GOST28147_context *ctx) { unsigned char newkey[32]; unsigned int i; /* "Decrypt" the static keymeshing key */ for (i = 0; i < 4; i++) { gost_decrypt_block (ctx, newkey + i*8, CryptoProKeyMeshingKey + i*8); } /* Set new key */ for (i = 0; i < 8; i++) { ctx->key[i] = buf_get_le32(&newkey[4*i]); } ctx->mesh_counter = 0; } static unsigned int gost_encrypt_block_mesh (void *c, byte *outbuf, const byte *inbuf) { GOST28147_context *ctx = c; u32 n1, n2; unsigned int burn; n1 = buf_get_le32 (inbuf); n2 = buf_get_le32 (inbuf+4); if (ctx->mesh_limit && (ctx->mesh_counter == ctx->mesh_limit)) { cryptopro_key_meshing (ctx); /* Yes, encrypt twice: once for KeyMeshing procedure per RFC 4357, * once for block encryption */ _gost_encrypt_data(ctx->sbox, ctx->key, &n1, &n2, n1, n2); } burn = _gost_encrypt_data(ctx->sbox, ctx->key, &n1, &n2, n1, n2); ctx->mesh_counter += 8; buf_put_le32 (outbuf+0, n1); buf_put_le32 (outbuf+4, n2); return /* burn_stack */ burn + 6*sizeof(void*) /* func call */; } static const gcry_cipher_oid_spec_t oids_gost28147_mesh[] = { { "1.2.643.2.2.21", GCRY_CIPHER_MODE_CFB }, /* { "1.2.643.2.2.31.0", GCRY_CIPHER_MODE_CNTGOST }, */ { "1.2.643.2.2.31.1", GCRY_CIPHER_MODE_CFB }, { "1.2.643.2.2.31.2", GCRY_CIPHER_MODE_CFB }, { "1.2.643.2.2.31.3", GCRY_CIPHER_MODE_CFB }, { "1.2.643.2.2.31.4", GCRY_CIPHER_MODE_CFB }, { NULL } }; gcry_cipher_spec_t _gcry_cipher_spec_gost28147 = { GCRY_CIPHER_GOST28147, {0, 0}, "GOST28147", NULL, NULL, 8, 256, sizeof (GOST28147_context), gost_setkey, gost_encrypt_block, gost_decrypt_block, NULL, NULL, NULL, gost_set_extra_info, GRUB_UTIL_MODNAME("gcry_gost28147") }; /* Meshing is used only for CFB, so no need to have separate * gost_decrypt_block_mesh. * Moreover key meshing is specified as encrypting the block (IV). Decrypting * it afterwards would be meaningless. */ gcry_cipher_spec_t _gcry_cipher_spec_gost28147_mesh = { GCRY_CIPHER_GOST28147_MESH, {0, 0}, "GOST28147_MESH", NULL, oids_gost28147_mesh, 8, 256, sizeof (GOST28147_context), gost_setkey, gost_encrypt_block_mesh, gost_decrypt_block, NULL, NULL, NULL, gost_set_extra_info, GRUB_UTIL_MODNAME("gcry_gost28147") }; static gcry_err_code_t gost_imit_open (gcry_mac_hd_t h) { memset(&h->u.imit, 0, sizeof(h->u.imit)); return 0; } static void gost_imit_close (gcry_mac_hd_t h) { (void) h; } static gcry_err_code_t gost_imit_setkey (gcry_mac_hd_t h, const unsigned char *key, size_t keylen) { int i; if (keylen != 256 / 8) return GPG_ERR_INV_KEYLEN; if (!h->u.imit.ctx.sbox) h->u.imit.ctx.sbox = sbox_CryptoPro_A; for (i = 0; i < 8; i++) { h->u.imit.ctx.key[i] = buf_get_le32(&key[4*i]); } return 0; } static gcry_err_code_t gost_imit_setiv (gcry_mac_hd_t h, const unsigned char *iv, size_t ivlen) { if (ivlen != 8) return GPG_ERR_INV_LENGTH; h->u.imit.n1 = buf_get_le32 (iv + 0); h->u.imit.n2 = buf_get_le32 (iv + 4); return 0; } static gcry_err_code_t gost_imit_reset (gcry_mac_hd_t h) { h->u.imit.n1 = h->u.imit.n2 = 0; h->u.imit.unused = 0; return 0; } static unsigned int _gost_imit_block (const u32 *sbox, const u32 *key, u32 *o1, u32 *o2, u32 n1, u32 n2) { n1 ^= *o1; n2 ^= *o2; n2 ^= gost_val (key[0], n1, sbox); n1 ^= gost_val (key[1], n2, sbox); n2 ^= gost_val (key[2], n1, sbox); n1 ^= gost_val (key[3], n2, sbox); n2 ^= gost_val (key[4], n1, sbox); n1 ^= gost_val (key[5], n2, sbox); n2 ^= gost_val (key[6], n1, sbox); n1 ^= gost_val (key[7], n2, sbox); n2 ^= gost_val (key[0], n1, sbox); n1 ^= gost_val (key[1], n2, sbox); n2 ^= gost_val (key[2], n1, sbox); n1 ^= gost_val (key[3], n2, sbox); n2 ^= gost_val (key[4], n1, sbox); n1 ^= gost_val (key[5], n2, sbox); n2 ^= gost_val (key[6], n1, sbox); n1 ^= gost_val (key[7], n2, sbox); *o1 = n1; *o2 = n2; return /* burn_stack */ 4*sizeof(void*) /* func call */ + 3*sizeof(void*) /* stack */ + 4*sizeof(void*) /* gost_val call */; } static inline unsigned int gost_imit_block (GOST28147_context *ctx, u32 *n1, u32 *n2, const unsigned char *buf) { if (ctx->mesh_limit && (ctx->mesh_counter == ctx->mesh_limit)) cryptopro_key_meshing (ctx); return _gost_imit_block (ctx->sbox, ctx->key, n1, n2, buf_get_le32 (buf+0), buf_get_le32 (buf+4)); } static gcry_err_code_t gost_imit_write (gcry_mac_hd_t h, const unsigned char *buf, size_t buflen) { const int blocksize = 8; unsigned int burn = 0; if (!buflen || !buf) return GPG_ERR_NO_ERROR; if (h->u.imit.unused) { for (; buflen && h->u.imit.unused < blocksize; buflen --) h->u.imit.lastiv[h->u.imit.unused++] = *buf++; if (h->u.imit.unused < blocksize) return GPG_ERR_NO_ERROR; h->u.imit.count ++; burn = gost_imit_block (&h->u.imit.ctx, &h->u.imit.n1, &h->u.imit.n2, h->u.imit.lastiv); h->u.imit.unused = 0; } while (buflen >= blocksize) { h->u.imit.count ++; burn = gost_imit_block (&h->u.imit.ctx, &h->u.imit.n1, &h->u.imit.n2, buf); buf += blocksize; buflen -= blocksize; } for (; buflen; buflen--) h->u.imit.lastiv[h->u.imit.unused++] = *buf++; _gcry_burn_stack (burn); return GPG_ERR_NO_ERROR; } static void gost_imit_finish (gcry_mac_hd_t h) { static const unsigned char zero[8] = {0}; /* Fill till full block */ if (h->u.imit.unused) gost_imit_write(h, zero, 8 - h->u.imit.unused); if (h->u.imit.count == 1) gost_imit_write(h, zero, 8); } static gcry_err_code_t gost_imit_read (gcry_mac_hd_t h, unsigned char *outbuf, size_t * outlen) { unsigned int dlen = 8; unsigned char digest[8]; gost_imit_finish (h); buf_put_le32 (digest+0, h->u.imit.n1); buf_put_le32 (digest+4, h->u.imit.n2); if (*outlen <= dlen) buf_cpy (outbuf, digest, *outlen); else { buf_cpy (outbuf, digest, dlen); *outlen = dlen; } return 0; } static gcry_err_code_t gost_imit_verify (gcry_mac_hd_t h, const unsigned char *buf, size_t buflen) { unsigned char tbuf[8]; gost_imit_finish (h); buf_put_le32 (tbuf+0, h->u.imit.n1); buf_put_le32 (tbuf+4, h->u.imit.n2); return buf_eq_const(tbuf, buf, buflen) ? GPG_ERR_NO_ERROR : GPG_ERR_CHECKSUM; } static unsigned int gost_imit_get_maclen (int algo) { (void) algo; return 4; /* or 8 */ } static unsigned int gost_imit_get_keylen (int algo) { (void) algo; return 256 / 8; } static gpg_err_code_t gost_imit_set_extra_info (gcry_mac_hd_t hd, int what, const void *buffer, size_t buflen) { gpg_err_code_t ec = 0; (void)buffer; (void)buflen; switch (what) { case GCRYCTL_SET_SBOX: ec = gost_set_sbox (&hd->u.imit.ctx, buffer); break; default: ec = GPG_ERR_INV_OP; break; } return ec; } static gcry_mac_spec_ops_t gost_imit_ops = { gost_imit_open, gost_imit_close, gost_imit_setkey, gost_imit_setiv, gost_imit_reset, gost_imit_write, gost_imit_read, gost_imit_verify, gost_imit_get_maclen, gost_imit_get_keylen, gost_imit_set_extra_info, NULL }; const gcry_mac_spec_t _gcry_mac_type_spec_gost28147_imit = { GCRY_MAC_GOST28147_IMIT, {0, 0}, "GOST28147_IMIT", &gost_imit_ops }; GRUB_MOD_INIT(gcry_gost28147) { grub_cipher_register (&_gcry_cipher_spec_gost28147); grub_cipher_register (&_gcry_cipher_spec_gost28147_mesh); } GRUB_MOD_FINI(gcry_gost28147) { grub_cipher_unregister (&_gcry_cipher_spec_gost28147); grub_cipher_unregister (&_gcry_cipher_spec_gost28147_mesh); } grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/cipher/sha1.c0000644000175000017500000004731715036452441021657 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ #include GRUB_MOD_LICENSE ("GPLv3+"); /* sha1.c - SHA1 hash function * Copyright (C) 1998, 2001, 2002, 2003, 2008 Free Software Foundation, Inc. * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . */ /* Test vectors: * * "abc" * A999 3E36 4706 816A BA3E 2571 7850 C26C 9CD0 D89D * * "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" * 8498 3E44 1C3B D26E BAAE 4AA1 F951 29E5 E546 70F1 */ #ifdef HAVE_STDINT_H #endif #include "g10lib.h" #include "bithelp.h" #include "bufhelp.h" #include "cipher.h" #include "sha1.h" /* USE_SSSE3 indicates whether to compile with Intel SSSE3 code. */ #undef USE_SSSE3 #if defined(__x86_64__) && defined(HAVE_GCC_INLINE_ASM_SSSE3) && \ (defined(HAVE_COMPATIBLE_GCC_AMD64_PLATFORM_AS) || \ defined(HAVE_COMPATIBLE_GCC_WIN64_PLATFORM_AS)) # define USE_SSSE3 1 #endif /* USE_AVX indicates whether to compile with Intel AVX code. */ #undef USE_AVX #if defined(__x86_64__) && defined(HAVE_GCC_INLINE_ASM_AVX) && \ (defined(HAVE_COMPATIBLE_GCC_AMD64_PLATFORM_AS) || \ defined(HAVE_COMPATIBLE_GCC_WIN64_PLATFORM_AS)) # define USE_AVX 1 #endif /* USE_BMI2 indicates whether to compile with Intel AVX/BMI2 code. */ #undef USE_BMI2 #if defined(__x86_64__) && defined(HAVE_GCC_INLINE_ASM_AVX) && \ defined(HAVE_GCC_INLINE_ASM_BMI2) && \ (defined(HAVE_COMPATIBLE_GCC_AMD64_PLATFORM_AS) || \ defined(HAVE_COMPATIBLE_GCC_WIN64_PLATFORM_AS)) # define USE_BMI2 1 #endif /* USE_AVX2 indicates whether to compile with Intel AVX2/BMI2 code. */ #undef USE_AVX2 #if defined(USE_BMI2) && defined(HAVE_GCC_INLINE_ASM_AVX2) # define USE_AVX2 1 #endif /* USE_SHAEXT indicates whether to compile with Intel SHA Extension code. */ #undef USE_SHAEXT #if defined(HAVE_GCC_INLINE_ASM_SHAEXT) && \ defined(HAVE_GCC_INLINE_ASM_SSE41) && \ defined(ENABLE_SHAEXT_SUPPORT) # define USE_SHAEXT 1 #endif /* USE_NEON indicates whether to enable ARM NEON assembly code. */ #undef USE_NEON #ifdef ENABLE_NEON_SUPPORT # if defined(HAVE_ARM_ARCH_V6) && defined(__ARMEL__) \ && defined(HAVE_COMPATIBLE_GCC_ARM_PLATFORM_AS) \ && defined(HAVE_GCC_INLINE_ASM_NEON) # define USE_NEON 1 # endif #endif /* USE_ARM_CE indicates whether to enable ARMv8 Crypto Extension assembly * code. */ #undef USE_ARM_CE #ifdef ENABLE_ARM_CRYPTO_SUPPORT # if defined(HAVE_ARM_ARCH_V6) && defined(__ARMEL__) \ && defined(HAVE_COMPATIBLE_GCC_ARM_PLATFORM_AS) \ && defined(HAVE_GCC_INLINE_ASM_AARCH32_CRYPTO) # define USE_ARM_CE 1 # elif defined(__AARCH64EL__) \ && defined(HAVE_COMPATIBLE_GCC_AARCH64_PLATFORM_AS) \ && defined(HAVE_GCC_INLINE_ASM_AARCH64_CRYPTO) # define USE_ARM_CE 1 # endif #endif /* A macro to test whether P is properly aligned for an u32 type. Note that config.h provides a suitable replacement for uintptr_t if it does not exist in stdint.h. */ /* #if __GNUC__ >= 2 */ /* # define U32_ALIGNED_P(p) (!(((uintptr_t)p) % __alignof__ (u32))) */ /* #else */ /* # define U32_ALIGNED_P(p) (!(((uintptr_t)p) % sizeof (u32))) */ /* #endif */ /* Assembly implementations use SystemV ABI, ABI conversion and additional * stack to store XMM6-XMM15 needed on Win64. */ #undef ASM_FUNC_ABI #undef ASM_EXTRA_STACK #if defined(USE_SSSE3) || defined(USE_AVX) || defined(USE_BMI2) || \ defined(USE_SHAEXT) # ifdef HAVE_COMPATIBLE_GCC_WIN64_PLATFORM_AS # define ASM_FUNC_ABI __attribute__((sysv_abi)) # define ASM_EXTRA_STACK (10 * 16 + sizeof(void *) * 4) # else # define ASM_FUNC_ABI # define ASM_EXTRA_STACK 0 # endif #endif #ifdef USE_SSSE3 unsigned int _gcry_sha1_transform_amd64_ssse3 (void *state, const unsigned char *data, size_t nblks) ASM_FUNC_ABI; static unsigned int do_sha1_transform_amd64_ssse3 (void *ctx, const unsigned char *data, size_t nblks) { SHA1_CONTEXT *hd = ctx; return _gcry_sha1_transform_amd64_ssse3 (&hd->h0, data, nblks) + ASM_EXTRA_STACK; } #endif #ifdef USE_AVX unsigned int _gcry_sha1_transform_amd64_avx (void *state, const unsigned char *data, size_t nblks) ASM_FUNC_ABI; static unsigned int do_sha1_transform_amd64_avx (void *ctx, const unsigned char *data, size_t nblks) { SHA1_CONTEXT *hd = ctx; return _gcry_sha1_transform_amd64_avx (&hd->h0, data, nblks) + ASM_EXTRA_STACK; } #endif #ifdef USE_BMI2 unsigned int _gcry_sha1_transform_amd64_avx_bmi2 (void *state, const unsigned char *data, size_t nblks) ASM_FUNC_ABI; static unsigned int do_sha1_transform_amd64_avx_bmi2 (void *ctx, const unsigned char *data, size_t nblks) { SHA1_CONTEXT *hd = ctx; return _gcry_sha1_transform_amd64_avx_bmi2 (&hd->h0, data, nblks) + ASM_EXTRA_STACK; } #ifdef USE_AVX2 unsigned int _gcry_sha1_transform_amd64_avx2_bmi2 (void *state, const unsigned char *data, size_t nblks) ASM_FUNC_ABI; static unsigned int do_sha1_transform_amd64_avx2_bmi2 (void *ctx, const unsigned char *data, size_t nblks) { SHA1_CONTEXT *hd = ctx; /* AVX2/BMI2 function only handles pair of blocks so nblks needs to be * multiple of 2 and function does not handle zero nblks. Use AVX/BMI2 * code to handle these cases. */ if (nblks <= 1) return do_sha1_transform_amd64_avx_bmi2 (ctx, data, nblks); if (nblks & 1) { (void)_gcry_sha1_transform_amd64_avx_bmi2 (&hd->h0, data, 1); nblks--; data += 64; } return _gcry_sha1_transform_amd64_avx2_bmi2 (&hd->h0, data, nblks) + ASM_EXTRA_STACK; } #endif /* USE_AVX2 */ #endif /* USE_BMI2 */ #ifdef USE_SHAEXT /* Does not need ASM_FUNC_ABI */ unsigned int _gcry_sha1_transform_intel_shaext (void *state, const unsigned char *data, size_t nblks); static unsigned int do_sha1_transform_intel_shaext (void *ctx, const unsigned char *data, size_t nblks) { SHA1_CONTEXT *hd = ctx; return _gcry_sha1_transform_intel_shaext (&hd->h0, data, nblks); } #endif #ifdef USE_NEON unsigned int _gcry_sha1_transform_armv7_neon (void *state, const unsigned char *data, size_t nblks); static unsigned int do_sha1_transform_armv7_neon (void *ctx, const unsigned char *data, size_t nblks) { SHA1_CONTEXT *hd = ctx; return _gcry_sha1_transform_armv7_neon (&hd->h0, data, nblks); } #endif #ifdef USE_ARM_CE unsigned int _gcry_sha1_transform_armv8_ce (void *state, const unsigned char *data, size_t nblks); static unsigned int do_sha1_transform_armv8_ce (void *ctx, const unsigned char *data, size_t nblks) { SHA1_CONTEXT *hd = ctx; return _gcry_sha1_transform_armv8_ce (&hd->h0, data, nblks); } #endif #ifdef SHA1_USE_S390X_CRYPTO #include "asm-inline-s390x.h" static unsigned int do_sha1_transform_s390x (void *ctx, const unsigned char *data, size_t nblks) { SHA1_CONTEXT *hd = ctx; kimd_execute (KMID_FUNCTION_SHA1, &hd->h0, data, nblks * 64); return 0; } static unsigned int do_sha1_final_s390x (void *ctx, const unsigned char *data, size_t datalen, u32 len_msb, u32 len_lsb) { SHA1_CONTEXT *hd = ctx; /* Make sure that 'final_len' is positioned at correct offset relative * to 'h0'. This is because we are passing 'h0' pointer as start of * parameter block to 'klmd' instruction. */ gcry_assert (offsetof (SHA1_CONTEXT, final_len_msb) - offsetof (SHA1_CONTEXT, h0) == 5 * sizeof(u32)); gcry_assert (offsetof (SHA1_CONTEXT, final_len_lsb) - offsetof (SHA1_CONTEXT, final_len_msb) == 1 * sizeof(u32)); hd->final_len_msb = len_msb; hd->final_len_lsb = len_lsb; klmd_execute (KMID_FUNCTION_SHA1, &hd->h0, data, datalen); return 0; } #endif static unsigned int do_transform_generic (void *c, const unsigned char *data, size_t nblks); static void sha1_init (void *context, unsigned int flags) { SHA1_CONTEXT *hd = context; unsigned int features = _gcry_get_hw_features (); (void)flags; hd->h0 = 0x67452301; hd->h1 = 0xefcdab89; hd->h2 = 0x98badcfe; hd->h3 = 0x10325476; hd->h4 = 0xc3d2e1f0; hd->bctx.nblocks = 0; hd->bctx.nblocks_high = 0; hd->bctx.count = 0; hd->bctx.blocksize_shift = _gcry_ctz(64); /* Order of feature checks is important here; last match will be * selected. Keep slower implementations at the top and faster at * the bottom. */ hd->bctx.bwrite = do_transform_generic; #ifdef USE_SSSE3 if ((features & HWF_INTEL_SSSE3) != 0) hd->bctx.bwrite = do_sha1_transform_amd64_ssse3; #endif #ifdef USE_AVX /* AVX implementation uses SHLD which is known to be slow on non-Intel CPUs. * Therefore use this implementation on Intel CPUs only. */ if ((features & HWF_INTEL_AVX) && (features & HWF_INTEL_FAST_SHLD)) hd->bctx.bwrite = do_sha1_transform_amd64_avx; #endif #ifdef USE_BMI2 if ((features & HWF_INTEL_AVX) && (features & HWF_INTEL_BMI2)) hd->bctx.bwrite = do_sha1_transform_amd64_avx_bmi2; #endif #ifdef USE_AVX2 if ((features & HWF_INTEL_AVX2) && (features & HWF_INTEL_AVX) && (features & HWF_INTEL_BMI2)) hd->bctx.bwrite = do_sha1_transform_amd64_avx2_bmi2; #endif #ifdef USE_SHAEXT if ((features & HWF_INTEL_SHAEXT) && (features & HWF_INTEL_SSE4_1)) hd->bctx.bwrite = do_sha1_transform_intel_shaext; #endif #ifdef USE_NEON if ((features & HWF_ARM_NEON) != 0) hd->bctx.bwrite = do_sha1_transform_armv7_neon; #endif #ifdef USE_ARM_CE if ((features & HWF_ARM_SHA1) != 0) hd->bctx.bwrite = do_sha1_transform_armv8_ce; #endif #ifdef SHA1_USE_S390X_CRYPTO hd->use_s390x_crypto = 0; if ((features & HWF_S390X_MSA) != 0) { if ((kimd_query () & km_function_to_mask (KMID_FUNCTION_SHA1)) && (klmd_query () & km_function_to_mask (KMID_FUNCTION_SHA1))) { hd->bctx.bwrite = do_sha1_transform_s390x; hd->use_s390x_crypto = 1; } } #endif (void)features; } /* * Initialize the context HD. This is used to prepare the use of * _gcry_sha1_mixblock. WARNING: This is a special purpose function * for exclusive use by random-csprng.c. */ void _gcry_sha1_mixblock_init (SHA1_CONTEXT *hd) { sha1_init (hd, 0); } /* Round function macros. */ #define K1 0x5A827999L #define K2 0x6ED9EBA1L #define K3 0x8F1BBCDCL #define K4 0xCA62C1D6L #define F1(x,y,z) ( z ^ ( x & ( y ^ z ) ) ) #define F2(x,y,z) ( x ^ y ^ z ) #define F3(x,y,z) ( ( x & y ) | ( z & ( x | y ) ) ) #define F4(x,y,z) ( x ^ y ^ z ) #define M(i) ( tm = x[ i &0x0f] \ ^ x[(i-14)&0x0f] \ ^ x[(i-8) &0x0f] \ ^ x[(i-3) &0x0f], \ (x[i&0x0f] = rol(tm, 1))) #define R(a,b,c,d,e,f,k,m) do { e += rol( a, 5 ) \ + f( b, c, d ) \ + k \ + m; \ b = rol( b, 30 ); \ } while(0) /* * Transform NBLOCKS of each 64 bytes (16 32-bit words) at DATA. */ static unsigned int do_transform_generic (void *ctx, const unsigned char *data, size_t nblks) { SHA1_CONTEXT *hd = ctx; do { const u32 *idata = (const void *)data; u32 a, b, c, d, e; /* Local copies of the chaining variables. */ u32 tm; /* Helper. */ u32 x[16]; /* The array we work on. */ #define I(i) (x[i] = buf_get_be32(idata + i)) /* Get the values of the chaining variables. */ a = hd->h0; b = hd->h1; c = hd->h2; d = hd->h3; e = hd->h4; /* Transform. */ R( a, b, c, d, e, F1, K1, I( 0) ); R( e, a, b, c, d, F1, K1, I( 1) ); R( d, e, a, b, c, F1, K1, I( 2) ); R( c, d, e, a, b, F1, K1, I( 3) ); R( b, c, d, e, a, F1, K1, I( 4) ); R( a, b, c, d, e, F1, K1, I( 5) ); R( e, a, b, c, d, F1, K1, I( 6) ); R( d, e, a, b, c, F1, K1, I( 7) ); R( c, d, e, a, b, F1, K1, I( 8) ); R( b, c, d, e, a, F1, K1, I( 9) ); R( a, b, c, d, e, F1, K1, I(10) ); R( e, a, b, c, d, F1, K1, I(11) ); R( d, e, a, b, c, F1, K1, I(12) ); R( c, d, e, a, b, F1, K1, I(13) ); R( b, c, d, e, a, F1, K1, I(14) ); R( a, b, c, d, e, F1, K1, I(15) ); R( e, a, b, c, d, F1, K1, M(16) ); R( d, e, a, b, c, F1, K1, M(17) ); R( c, d, e, a, b, F1, K1, M(18) ); R( b, c, d, e, a, F1, K1, M(19) ); R( a, b, c, d, e, F2, K2, M(20) ); R( e, a, b, c, d, F2, K2, M(21) ); R( d, e, a, b, c, F2, K2, M(22) ); R( c, d, e, a, b, F2, K2, M(23) ); R( b, c, d, e, a, F2, K2, M(24) ); R( a, b, c, d, e, F2, K2, M(25) ); R( e, a, b, c, d, F2, K2, M(26) ); R( d, e, a, b, c, F2, K2, M(27) ); R( c, d, e, a, b, F2, K2, M(28) ); R( b, c, d, e, a, F2, K2, M(29) ); R( a, b, c, d, e, F2, K2, M(30) ); R( e, a, b, c, d, F2, K2, M(31) ); R( d, e, a, b, c, F2, K2, M(32) ); R( c, d, e, a, b, F2, K2, M(33) ); R( b, c, d, e, a, F2, K2, M(34) ); R( a, b, c, d, e, F2, K2, M(35) ); R( e, a, b, c, d, F2, K2, M(36) ); R( d, e, a, b, c, F2, K2, M(37) ); R( c, d, e, a, b, F2, K2, M(38) ); R( b, c, d, e, a, F2, K2, M(39) ); R( a, b, c, d, e, F3, K3, M(40) ); R( e, a, b, c, d, F3, K3, M(41) ); R( d, e, a, b, c, F3, K3, M(42) ); R( c, d, e, a, b, F3, K3, M(43) ); R( b, c, d, e, a, F3, K3, M(44) ); R( a, b, c, d, e, F3, K3, M(45) ); R( e, a, b, c, d, F3, K3, M(46) ); R( d, e, a, b, c, F3, K3, M(47) ); R( c, d, e, a, b, F3, K3, M(48) ); R( b, c, d, e, a, F3, K3, M(49) ); R( a, b, c, d, e, F3, K3, M(50) ); R( e, a, b, c, d, F3, K3, M(51) ); R( d, e, a, b, c, F3, K3, M(52) ); R( c, d, e, a, b, F3, K3, M(53) ); R( b, c, d, e, a, F3, K3, M(54) ); R( a, b, c, d, e, F3, K3, M(55) ); R( e, a, b, c, d, F3, K3, M(56) ); R( d, e, a, b, c, F3, K3, M(57) ); R( c, d, e, a, b, F3, K3, M(58) ); R( b, c, d, e, a, F3, K3, M(59) ); R( a, b, c, d, e, F4, K4, M(60) ); R( e, a, b, c, d, F4, K4, M(61) ); R( d, e, a, b, c, F4, K4, M(62) ); R( c, d, e, a, b, F4, K4, M(63) ); R( b, c, d, e, a, F4, K4, M(64) ); R( a, b, c, d, e, F4, K4, M(65) ); R( e, a, b, c, d, F4, K4, M(66) ); R( d, e, a, b, c, F4, K4, M(67) ); R( c, d, e, a, b, F4, K4, M(68) ); R( b, c, d, e, a, F4, K4, M(69) ); R( a, b, c, d, e, F4, K4, M(70) ); R( e, a, b, c, d, F4, K4, M(71) ); R( d, e, a, b, c, F4, K4, M(72) ); R( c, d, e, a, b, F4, K4, M(73) ); R( b, c, d, e, a, F4, K4, M(74) ); R( a, b, c, d, e, F4, K4, M(75) ); R( e, a, b, c, d, F4, K4, M(76) ); R( d, e, a, b, c, F4, K4, M(77) ); R( c, d, e, a, b, F4, K4, M(78) ); R( b, c, d, e, a, F4, K4, M(79) ); /* Update the chaining variables. */ hd->h0 += a; hd->h1 += b; hd->h2 += c; hd->h3 += d; hd->h4 += e; data += 64; } while (--nblks); return 88+4*sizeof(void*); } /* * Apply the SHA-1 transform function on the buffer BLOCKOF64BYTE * which must have a length 64 bytes. BLOCKOF64BYTE must be 32-bit * aligned. Updates the 20 bytes in BLOCKOF64BYTE with its mixed * content. Returns the number of bytes which should be burned on the * stack. You need to use _gcry_sha1_mixblock_init to initialize the * context. * WARNING: This is a special purpose function for exclusive use by * random-csprng.c. */ unsigned int _gcry_sha1_mixblock (SHA1_CONTEXT *hd, void *blockof64byte) { u32 *p = blockof64byte; unsigned int nburn; nburn = (*hd->bctx.bwrite) (hd, blockof64byte, 1); p[0] = hd->h0; p[1] = hd->h1; p[2] = hd->h2; p[3] = hd->h3; p[4] = hd->h4; return nburn; } /* The routine final terminates the computation and * returns the digest. * The handle is prepared for a new cycle, but adding bytes to the * handle will the destroy the returned buffer. * Returns: 20 bytes representing the digest. */ static void sha1_final(void *context) { SHA1_CONTEXT *hd = context; u32 t, th, msb, lsb; unsigned char *p; unsigned int burn; t = hd->bctx.nblocks; if (sizeof t == sizeof hd->bctx.nblocks) th = hd->bctx.nblocks_high; else th = hd->bctx.nblocks >> 32; /* multiply by 64 to make a byte count */ lsb = t << 6; msb = (th << 6) | (t >> 26); /* add the count */ t = lsb; if( (lsb += hd->bctx.count) < t ) msb++; /* multiply by 8 to make a bit count */ t = lsb; lsb <<= 3; msb <<= 3; msb |= t >> 29; if (0) { } #ifdef SHA1_USE_S390X_CRYPTO else if (hd->use_s390x_crypto) { burn = do_sha1_final_s390x (hd, hd->bctx.buf, hd->bctx.count, msb, lsb); } #endif else if (hd->bctx.count < 56) /* enough room */ { hd->bctx.buf[hd->bctx.count++] = 0x80; /* pad */ if (hd->bctx.count < 56) memset (&hd->bctx.buf[hd->bctx.count], 0, 56 - hd->bctx.count); /* append the 64 bit count */ buf_put_be32(hd->bctx.buf + 56, msb); buf_put_be32(hd->bctx.buf + 60, lsb); burn = (*hd->bctx.bwrite) ( hd, hd->bctx.buf, 1 ); } else /* need one extra block */ { hd->bctx.buf[hd->bctx.count++] = 0x80; /* pad character */ /* fill pad and next block with zeroes */ memset (&hd->bctx.buf[hd->bctx.count], 0, 64 - hd->bctx.count + 56); /* append the 64 bit count */ buf_put_be32(hd->bctx.buf + 64 + 56, msb); buf_put_be32(hd->bctx.buf + 64 + 60, lsb); burn = (*hd->bctx.bwrite) ( hd, hd->bctx.buf, 2 ); } p = hd->bctx.buf; #define X(a) do { buf_put_be32(p, hd->h##a); p += 4; } while(0) X(0); X(1); X(2); X(3); X(4); #undef X hd->bctx.count = 0; _gcry_burn_stack (burn); } static unsigned char * sha1_read( void *context ) { SHA1_CONTEXT *hd = context; return hd->bctx.buf; } /**************** * Shortcut functions which puts the hash value of the supplied buffer iov * into outbuf which must have a size of 20 bytes. */ #define _gcry_sha1_hash_buffers 0 /* Variant of the above shortcut function using a single buffer. */ /* Self-test section. */ /* Run a full self-test for ALGO and return 0 on success. */ static const unsigned char asn[15] = /* Object ID is 1.3.14.3.2.26 */ { 0x30, 0x21, 0x30, 0x09, 0x06, 0x05, 0x2b, 0x0e, 0x03, 0x02, 0x1a, 0x05, 0x00, 0x04, 0x14 }; static const gcry_md_oid_spec_t oid_spec_sha1[] = { /* iso.member-body.us.rsadsi.pkcs.pkcs-1.5 (sha1WithRSAEncryption) */ { "1.2.840.113549.1.1.5" }, /* iso.member-body.us.x9-57.x9cm.3 (dsaWithSha1)*/ { "1.2.840.10040.4.3" }, /* from NIST's OIW (sha1) */ { "1.3.14.3.2.26" }, /* from NIST OIW (sha-1WithRSAEncryption) */ { "1.3.14.3.2.29" }, /* iso.member-body.us.ansi-x9-62.signatures.ecdsa-with-sha1 */ { "1.2.840.10045.4.1" }, { NULL }, }; gcry_md_spec_t _gcry_digest_spec_sha1 = { GCRY_MD_SHA1, {0, 1}, "SHA1", asn, DIM (asn), oid_spec_sha1, 20, sha1_init, _gcry_md_block_write, sha1_final, sha1_read, NULL, _gcry_sha1_hash_buffers, sizeof (SHA1_CONTEXT), GRUB_UTIL_MODNAME("gcry_sha1") .blocksize = 64 }; GRUB_MOD_INIT(gcry_sha1) { grub_md_register (&_gcry_digest_spec_sha1); } GRUB_MOD_FINI(gcry_sha1) { grub_md_unregister (&_gcry_digest_spec_sha1); } grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/cipher/rijndael-ppc-functions.h0000644000175000017500000020103315036452441025371 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ /* Rijndael (AES) for GnuPG - PowerPC Vector Crypto AES implementation * Copyright (C) 2019 Shawn Landden * Copyright (C) 2019-2020, 2022-2023 Jussi Kivilinna * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . * * Alternatively, this code may be used in OpenSSL from The OpenSSL Project, * and Cryptogams by Andy Polyakov, and if made part of a release of either * or both projects, is thereafter dual-licensed under the license said project * is released under. */ unsigned int PPC_OPT_ATTR ENCRYPT_BLOCK_FUNC (const RIJNDAEL_context *ctx, unsigned char *out, const unsigned char *in) { const block bige_const = asm_load_be_const(); const u128_t *rk = (u128_t *)&ctx->keyschenc; int rounds = ctx->rounds; ROUND_KEY_VARIABLES; block b; b = VEC_LOAD_BE (in, 0, bige_const); PRELOAD_ROUND_KEYS (rounds); AES_ENCRYPT (b, rounds); VEC_STORE_BE (out, 0, b, bige_const); return 0; /* does not use stack */ } unsigned int PPC_OPT_ATTR DECRYPT_BLOCK_FUNC (const RIJNDAEL_context *ctx, unsigned char *out, const unsigned char *in) { const block bige_const = asm_load_be_const(); const u128_t *rk = (u128_t *)&ctx->keyschdec; int rounds = ctx->rounds; ROUND_KEY_VARIABLES; block b; b = VEC_LOAD_BE (in, 0, bige_const); PRELOAD_ROUND_KEYS (rounds); AES_DECRYPT (b, rounds); VEC_STORE_BE (out, 0, b, bige_const); return 0; /* does not use stack */ } void PPC_OPT_ATTR CFB_ENC_FUNC (void *context, unsigned char *iv_arg, void *outbuf_arg, const void *inbuf_arg, size_t nblocks) { const block bige_const = asm_load_be_const(); RIJNDAEL_context *ctx = context; const u128_t *rk = (u128_t *)&ctx->keyschenc; const u128_t *in = (const u128_t *)inbuf_arg; u128_t *out = (u128_t *)outbuf_arg; int rounds = ctx->rounds; ROUND_KEY_VARIABLES_ALL; block key0_xor_keylast; block iv, outiv; iv = VEC_LOAD_BE (iv_arg, 0, bige_const); outiv = iv; PRELOAD_ROUND_KEYS_ALL (rounds); key0_xor_keylast = rkey0 ^ rkeylast; iv ^= rkey0; for (; nblocks; nblocks--) { rkeylast = key0_xor_keylast ^ VEC_LOAD_BE (in++, 0, bige_const); iv = asm_cipher_be (iv, rkey1); iv = asm_cipher_be (iv, rkey2); iv = asm_cipher_be (iv, rkey3); iv = asm_cipher_be (iv, rkey4); iv = asm_cipher_be (iv, rkey5); iv = asm_cipher_be (iv, rkey6); iv = asm_cipher_be (iv, rkey7); iv = asm_cipher_be (iv, rkey8); iv = asm_cipher_be (iv, rkey9); if (rounds >= 12) { iv = asm_cipher_be (iv, rkey10); iv = asm_cipher_be (iv, rkey11); if (rounds > 12) { iv = asm_cipher_be (iv, rkey12); iv = asm_cipher_be (iv, rkey13); } } iv = asm_cipherlast_be (iv, rkeylast); outiv = rkey0 ^ iv; VEC_STORE_BE (out++, 0, outiv, bige_const); } VEC_STORE_BE (iv_arg, 0, outiv, bige_const); } void PPC_OPT_ATTR ECB_CRYPT_FUNC (void *context, void *outbuf_arg, const void *inbuf_arg, size_t nblocks, int encrypt) { const block bige_const = asm_load_be_const(); RIJNDAEL_context *ctx = context; const u128_t *rk = encrypt ? (u128_t *)&ctx->keyschenc : (u128_t *)&ctx->keyschdec; const u128_t *in = (const u128_t *)inbuf_arg; u128_t *out = (u128_t *)outbuf_arg; int rounds = ctx->rounds; ROUND_KEY_VARIABLES; block b0, b1, b2, b3, b4, b5, b6, b7; block rkey; if (!encrypt && !ctx->decryption_prepared) { internal_aes_ppc_prepare_decryption (ctx); ctx->decryption_prepared = 1; } PRELOAD_ROUND_KEYS (rounds); for (; nblocks >= 8; nblocks -= 8) { b0 = VEC_LOAD_BE (in, 0, bige_const); b1 = VEC_LOAD_BE (in, 1, bige_const); b2 = VEC_LOAD_BE (in, 2, bige_const); b3 = VEC_LOAD_BE (in, 3, bige_const); b0 = asm_xor (rkey0, b0); b1 = asm_xor (rkey0, b1); b4 = VEC_LOAD_BE (in, 4, bige_const); b5 = VEC_LOAD_BE (in, 5, bige_const); b2 = asm_xor (rkey0, b2); b3 = asm_xor (rkey0, b3); b6 = VEC_LOAD_BE (in, 6, bige_const); b7 = VEC_LOAD_BE (in, 7, bige_const); in += 8; b4 = asm_xor (rkey0, b4); b5 = asm_xor (rkey0, b5); b6 = asm_xor (rkey0, b6); b7 = asm_xor (rkey0, b7); if (encrypt) { #define DO_ROUND(r) \ rkey = ALIGNED_LOAD (rk, r); \ b0 = asm_cipher_be (b0, rkey); \ b1 = asm_cipher_be (b1, rkey); \ b2 = asm_cipher_be (b2, rkey); \ b3 = asm_cipher_be (b3, rkey); \ b4 = asm_cipher_be (b4, rkey); \ b5 = asm_cipher_be (b5, rkey); \ b6 = asm_cipher_be (b6, rkey); \ b7 = asm_cipher_be (b7, rkey); DO_ROUND(1); DO_ROUND(2); DO_ROUND(3); DO_ROUND(4); DO_ROUND(5); DO_ROUND(6); DO_ROUND(7); DO_ROUND(8); DO_ROUND(9); if (rounds >= 12) { DO_ROUND(10); DO_ROUND(11); if (rounds > 12) { DO_ROUND(12); DO_ROUND(13); } } #undef DO_ROUND b0 = asm_cipherlast_be (b0, rkeylast); b1 = asm_cipherlast_be (b1, rkeylast); b2 = asm_cipherlast_be (b2, rkeylast); b3 = asm_cipherlast_be (b3, rkeylast); b4 = asm_cipherlast_be (b4, rkeylast); b5 = asm_cipherlast_be (b5, rkeylast); b6 = asm_cipherlast_be (b6, rkeylast); b7 = asm_cipherlast_be (b7, rkeylast); } else { #define DO_ROUND(r) \ rkey = ALIGNED_LOAD (rk, r); \ b0 = asm_ncipher_be (b0, rkey); \ b1 = asm_ncipher_be (b1, rkey); \ b2 = asm_ncipher_be (b2, rkey); \ b3 = asm_ncipher_be (b3, rkey); \ b4 = asm_ncipher_be (b4, rkey); \ b5 = asm_ncipher_be (b5, rkey); \ b6 = asm_ncipher_be (b6, rkey); \ b7 = asm_ncipher_be (b7, rkey); DO_ROUND(1); DO_ROUND(2); DO_ROUND(3); DO_ROUND(4); DO_ROUND(5); DO_ROUND(6); DO_ROUND(7); DO_ROUND(8); DO_ROUND(9); if (rounds >= 12) { DO_ROUND(10); DO_ROUND(11); if (rounds > 12) { DO_ROUND(12); DO_ROUND(13); } } #undef DO_ROUND b0 = asm_ncipherlast_be (b0, rkeylast); b1 = asm_ncipherlast_be (b1, rkeylast); b2 = asm_ncipherlast_be (b2, rkeylast); b3 = asm_ncipherlast_be (b3, rkeylast); b4 = asm_ncipherlast_be (b4, rkeylast); b5 = asm_ncipherlast_be (b5, rkeylast); b6 = asm_ncipherlast_be (b6, rkeylast); b7 = asm_ncipherlast_be (b7, rkeylast); } VEC_STORE_BE (out, 0, b0, bige_const); VEC_STORE_BE (out, 1, b1, bige_const); VEC_STORE_BE (out, 2, b2, bige_const); VEC_STORE_BE (out, 3, b3, bige_const); VEC_STORE_BE (out, 4, b4, bige_const); VEC_STORE_BE (out, 5, b5, bige_const); VEC_STORE_BE (out, 6, b6, bige_const); VEC_STORE_BE (out, 7, b7, bige_const); out += 8; } if (nblocks >= 4) { b0 = VEC_LOAD_BE (in, 0, bige_const); b1 = VEC_LOAD_BE (in, 1, bige_const); b2 = VEC_LOAD_BE (in, 2, bige_const); b3 = VEC_LOAD_BE (in, 3, bige_const); b0 = asm_xor (rkey0, b0); b1 = asm_xor (rkey0, b1); b2 = asm_xor (rkey0, b2); b3 = asm_xor (rkey0, b3); if (encrypt) { #define DO_ROUND(r) \ rkey = ALIGNED_LOAD (rk, r); \ b0 = asm_cipher_be (b0, rkey); \ b1 = asm_cipher_be (b1, rkey); \ b2 = asm_cipher_be (b2, rkey); \ b3 = asm_cipher_be (b3, rkey); DO_ROUND(1); DO_ROUND(2); DO_ROUND(3); DO_ROUND(4); DO_ROUND(5); DO_ROUND(6); DO_ROUND(7); DO_ROUND(8); DO_ROUND(9); if (rounds >= 12) { DO_ROUND(10); DO_ROUND(11); if (rounds > 12) { DO_ROUND(12); DO_ROUND(13); } } #undef DO_ROUND b0 = asm_cipherlast_be (b0, rkeylast); b1 = asm_cipherlast_be (b1, rkeylast); b2 = asm_cipherlast_be (b2, rkeylast); b3 = asm_cipherlast_be (b3, rkeylast); } else { #define DO_ROUND(r) \ rkey = ALIGNED_LOAD (rk, r); \ b0 = asm_ncipher_be (b0, rkey); \ b1 = asm_ncipher_be (b1, rkey); \ b2 = asm_ncipher_be (b2, rkey); \ b3 = asm_ncipher_be (b3, rkey); DO_ROUND(1); DO_ROUND(2); DO_ROUND(3); DO_ROUND(4); DO_ROUND(5); DO_ROUND(6); DO_ROUND(7); DO_ROUND(8); DO_ROUND(9); if (rounds >= 12) { DO_ROUND(10); DO_ROUND(11); if (rounds > 12) { DO_ROUND(12); DO_ROUND(13); } } #undef DO_ROUND b0 = asm_ncipherlast_be (b0, rkeylast); b1 = asm_ncipherlast_be (b1, rkeylast); b2 = asm_ncipherlast_be (b2, rkeylast); b3 = asm_ncipherlast_be (b3, rkeylast); } VEC_STORE_BE (out, 0, b0, bige_const); VEC_STORE_BE (out, 1, b1, bige_const); VEC_STORE_BE (out, 2, b2, bige_const); VEC_STORE_BE (out, 3, b3, bige_const); in += 4; out += 4; nblocks -= 4; } for (; nblocks; nblocks--) { b0 = VEC_LOAD_BE (in, 0, bige_const); if (encrypt) { AES_ENCRYPT (b0, rounds); } else { AES_DECRYPT (b0, rounds); } VEC_STORE_BE (out, 0, b0, bige_const); out++; in++; } } void PPC_OPT_ATTR CFB_DEC_FUNC (void *context, unsigned char *iv_arg, void *outbuf_arg, const void *inbuf_arg, size_t nblocks) { const block bige_const = asm_load_be_const(); RIJNDAEL_context *ctx = context; const u128_t *rk = (u128_t *)&ctx->keyschenc; const u128_t *in = (const u128_t *)inbuf_arg; u128_t *out = (u128_t *)outbuf_arg; int rounds = ctx->rounds; ROUND_KEY_VARIABLES; block rkeylast_orig; block iv, b, bin; block in0, in1, in2, in3, in4, in5, in6, in7; block b0, b1, b2, b3, b4, b5, b6, b7; block rkey; iv = VEC_LOAD_BE (iv_arg, 0, bige_const); PRELOAD_ROUND_KEYS (rounds); rkeylast_orig = rkeylast; for (; nblocks >= 8; nblocks -= 8) { in0 = iv; in1 = VEC_LOAD_BE_NOSWAP (in, 0); in2 = VEC_LOAD_BE_NOSWAP (in, 1); in3 = VEC_LOAD_BE_NOSWAP (in, 2); in4 = VEC_LOAD_BE_NOSWAP (in, 3); in1 = VEC_BE_SWAP (in1, bige_const); in2 = VEC_BE_SWAP (in2, bige_const); in5 = VEC_LOAD_BE_NOSWAP (in, 4); in6 = VEC_LOAD_BE_NOSWAP (in, 5); in3 = VEC_BE_SWAP (in3, bige_const); in4 = VEC_BE_SWAP (in4, bige_const); in7 = VEC_LOAD_BE_NOSWAP (in, 6); iv = VEC_LOAD_BE_NOSWAP (in, 7); in += 8; in5 = VEC_BE_SWAP (in5, bige_const); in6 = VEC_BE_SWAP (in6, bige_const); b0 = asm_xor (rkey0, in0); b1 = asm_xor (rkey0, in1); in7 = VEC_BE_SWAP (in7, bige_const); iv = VEC_BE_SWAP (iv, bige_const); b2 = asm_xor (rkey0, in2); b3 = asm_xor (rkey0, in3); b4 = asm_xor (rkey0, in4); b5 = asm_xor (rkey0, in5); b6 = asm_xor (rkey0, in6); b7 = asm_xor (rkey0, in7); #define DO_ROUND(r) \ rkey = ALIGNED_LOAD (rk, r); \ b0 = asm_cipher_be (b0, rkey); \ b1 = asm_cipher_be (b1, rkey); \ b2 = asm_cipher_be (b2, rkey); \ b3 = asm_cipher_be (b3, rkey); \ b4 = asm_cipher_be (b4, rkey); \ b5 = asm_cipher_be (b5, rkey); \ b6 = asm_cipher_be (b6, rkey); \ b7 = asm_cipher_be (b7, rkey); DO_ROUND(1); DO_ROUND(2); DO_ROUND(3); DO_ROUND(4); DO_ROUND(5); DO_ROUND(6); DO_ROUND(7); DO_ROUND(8); DO_ROUND(9); if (rounds >= 12) { DO_ROUND(10); DO_ROUND(11); if (rounds > 12) { DO_ROUND(12); DO_ROUND(13); } } #undef DO_ROUND in1 = asm_xor (rkeylast, in1); in2 = asm_xor (rkeylast, in2); in3 = asm_xor (rkeylast, in3); in4 = asm_xor (rkeylast, in4); b0 = asm_cipherlast_be (b0, in1); b1 = asm_cipherlast_be (b1, in2); in5 = asm_xor (rkeylast, in5); in6 = asm_xor (rkeylast, in6); b2 = asm_cipherlast_be (b2, in3); b3 = asm_cipherlast_be (b3, in4); in7 = asm_xor (rkeylast, in7); in0 = asm_xor (rkeylast, iv); b0 = VEC_BE_SWAP (b0, bige_const); b1 = VEC_BE_SWAP (b1, bige_const); b4 = asm_cipherlast_be (b4, in5); b5 = asm_cipherlast_be (b5, in6); b2 = VEC_BE_SWAP (b2, bige_const); b3 = VEC_BE_SWAP (b3, bige_const); b6 = asm_cipherlast_be (b6, in7); b7 = asm_cipherlast_be (b7, in0); b4 = VEC_BE_SWAP (b4, bige_const); b5 = VEC_BE_SWAP (b5, bige_const); b6 = VEC_BE_SWAP (b6, bige_const); b7 = VEC_BE_SWAP (b7, bige_const); VEC_STORE_BE_NOSWAP (out, 0, b0); VEC_STORE_BE_NOSWAP (out, 1, b1); VEC_STORE_BE_NOSWAP (out, 2, b2); VEC_STORE_BE_NOSWAP (out, 3, b3); VEC_STORE_BE_NOSWAP (out, 4, b4); VEC_STORE_BE_NOSWAP (out, 5, b5); VEC_STORE_BE_NOSWAP (out, 6, b6); VEC_STORE_BE_NOSWAP (out, 7, b7); out += 8; } if (nblocks >= 4) { in0 = iv; in1 = VEC_LOAD_BE (in, 0, bige_const); in2 = VEC_LOAD_BE (in, 1, bige_const); in3 = VEC_LOAD_BE (in, 2, bige_const); iv = VEC_LOAD_BE (in, 3, bige_const); b0 = asm_xor (rkey0, in0); b1 = asm_xor (rkey0, in1); b2 = asm_xor (rkey0, in2); b3 = asm_xor (rkey0, in3); #define DO_ROUND(r) \ rkey = ALIGNED_LOAD (rk, r); \ b0 = asm_cipher_be (b0, rkey); \ b1 = asm_cipher_be (b1, rkey); \ b2 = asm_cipher_be (b2, rkey); \ b3 = asm_cipher_be (b3, rkey); DO_ROUND(1); DO_ROUND(2); DO_ROUND(3); DO_ROUND(4); DO_ROUND(5); DO_ROUND(6); DO_ROUND(7); DO_ROUND(8); DO_ROUND(9); if (rounds >= 12) { DO_ROUND(10); DO_ROUND(11); if (rounds > 12) { DO_ROUND(12); DO_ROUND(13); } } #undef DO_ROUND in1 = asm_xor (rkeylast, in1); in2 = asm_xor (rkeylast, in2); in3 = asm_xor (rkeylast, in3); in0 = asm_xor (rkeylast, iv); b0 = asm_cipherlast_be (b0, in1); b1 = asm_cipherlast_be (b1, in2); b2 = asm_cipherlast_be (b2, in3); b3 = asm_cipherlast_be (b3, in0); VEC_STORE_BE (out, 0, b0, bige_const); VEC_STORE_BE (out, 1, b1, bige_const); VEC_STORE_BE (out, 2, b2, bige_const); VEC_STORE_BE (out, 3, b3, bige_const); in += 4; out += 4; nblocks -= 4; } for (; nblocks; nblocks--) { bin = VEC_LOAD_BE (in, 0, bige_const); rkeylast = rkeylast_orig ^ bin; b = iv; iv = bin; AES_ENCRYPT (b, rounds); VEC_STORE_BE (out, 0, b, bige_const); out++; in++; } VEC_STORE_BE (iv_arg, 0, iv, bige_const); } void PPC_OPT_ATTR CBC_ENC_FUNC (void *context, unsigned char *iv_arg, void *outbuf_arg, const void *inbuf_arg, size_t nblocks, int cbc_mac) { const block bige_const = asm_load_be_const(); RIJNDAEL_context *ctx = context; const u128_t *rk = (u128_t *)&ctx->keyschenc; const u128_t *in = (const u128_t *)inbuf_arg; byte *out = (byte *)outbuf_arg; int rounds = ctx->rounds; ROUND_KEY_VARIABLES_ALL; block iv, key0_xor_keylast, nextiv, outiv; unsigned int outadd = -(!cbc_mac) & 16; if (nblocks == 0) /* CMAC may call with nblocks 0. */ return; iv = VEC_LOAD_BE (iv_arg, 0, bige_const); PRELOAD_ROUND_KEYS_ALL (rounds); key0_xor_keylast = rkey0 ^ rkeylast; nextiv = VEC_LOAD_BE (in++, 0, bige_const); iv ^= rkey0 ^ nextiv; do { if (--nblocks) { nextiv = key0_xor_keylast ^ VEC_LOAD_BE (in++, 0, bige_const); } iv = asm_cipher_be (iv, rkey1); iv = asm_cipher_be (iv, rkey2); iv = asm_cipher_be (iv, rkey3); iv = asm_cipher_be (iv, rkey4); iv = asm_cipher_be (iv, rkey5); iv = asm_cipher_be (iv, rkey6); iv = asm_cipher_be (iv, rkey7); iv = asm_cipher_be (iv, rkey8); iv = asm_cipher_be (iv, rkey9); if (rounds >= 12) { iv = asm_cipher_be (iv, rkey10); iv = asm_cipher_be (iv, rkey11); if (rounds > 12) { iv = asm_cipher_be (iv, rkey12); iv = asm_cipher_be (iv, rkey13); } } outiv = iv; /* Proper order for following instructions is important for best * performance on POWER8: the output path vcipherlast needs to be * last one. */ __asm__ volatile ("vcipherlast %0, %0, %2\n\t" "vcipherlast %1, %1, %3\n\t" : "+v" (iv), "+v" (outiv) : "v" (nextiv), "v" (rkeylast)); VEC_STORE_BE ((u128_t *)out, 0, outiv, bige_const); out += outadd; } while (nblocks); VEC_STORE_BE (iv_arg, 0, outiv, bige_const); } void PPC_OPT_ATTR CBC_DEC_FUNC (void *context, unsigned char *iv_arg, void *outbuf_arg, const void *inbuf_arg, size_t nblocks) { const block bige_const = asm_load_be_const(); RIJNDAEL_context *ctx = context; const u128_t *rk = (u128_t *)&ctx->keyschdec; const u128_t *in = (const u128_t *)inbuf_arg; u128_t *out = (u128_t *)outbuf_arg; int rounds = ctx->rounds; ROUND_KEY_VARIABLES; block rkeylast_orig; block in0, in1, in2, in3, in4, in5, in6, in7; block b0, b1, b2, b3, b4, b5, b6, b7; block rkey; block iv, b; if (!ctx->decryption_prepared) { internal_aes_ppc_prepare_decryption (ctx); ctx->decryption_prepared = 1; } iv = VEC_LOAD_BE (iv_arg, 0, bige_const); PRELOAD_ROUND_KEYS (rounds); rkeylast_orig = rkeylast; for (; nblocks >= 8; nblocks -= 8) { in0 = VEC_LOAD_BE_NOSWAP (in, 0); in1 = VEC_LOAD_BE_NOSWAP (in, 1); in2 = VEC_LOAD_BE_NOSWAP (in, 2); in3 = VEC_LOAD_BE_NOSWAP (in, 3); in0 = VEC_BE_SWAP (in0, bige_const); in1 = VEC_BE_SWAP (in1, bige_const); in4 = VEC_LOAD_BE_NOSWAP (in, 4); in5 = VEC_LOAD_BE_NOSWAP (in, 5); in2 = VEC_BE_SWAP (in2, bige_const); in3 = VEC_BE_SWAP (in3, bige_const); in6 = VEC_LOAD_BE_NOSWAP (in, 6); in7 = VEC_LOAD_BE_NOSWAP (in, 7); in += 8; b0 = asm_xor (rkey0, in0); b1 = asm_xor (rkey0, in1); in4 = VEC_BE_SWAP (in4, bige_const); in5 = VEC_BE_SWAP (in5, bige_const); b2 = asm_xor (rkey0, in2); b3 = asm_xor (rkey0, in3); in6 = VEC_BE_SWAP (in6, bige_const); in7 = VEC_BE_SWAP (in7, bige_const); b4 = asm_xor (rkey0, in4); b5 = asm_xor (rkey0, in5); b6 = asm_xor (rkey0, in6); b7 = asm_xor (rkey0, in7); #define DO_ROUND(r) \ rkey = ALIGNED_LOAD (rk, r); \ b0 = asm_ncipher_be (b0, rkey); \ b1 = asm_ncipher_be (b1, rkey); \ b2 = asm_ncipher_be (b2, rkey); \ b3 = asm_ncipher_be (b3, rkey); \ b4 = asm_ncipher_be (b4, rkey); \ b5 = asm_ncipher_be (b5, rkey); \ b6 = asm_ncipher_be (b6, rkey); \ b7 = asm_ncipher_be (b7, rkey); DO_ROUND(1); DO_ROUND(2); DO_ROUND(3); DO_ROUND(4); DO_ROUND(5); DO_ROUND(6); DO_ROUND(7); DO_ROUND(8); DO_ROUND(9); if (rounds >= 12) { DO_ROUND(10); DO_ROUND(11); if (rounds > 12) { DO_ROUND(12); DO_ROUND(13); } } #undef DO_ROUND iv = asm_xor (rkeylast, iv); in0 = asm_xor (rkeylast, in0); in1 = asm_xor (rkeylast, in1); in2 = asm_xor (rkeylast, in2); b0 = asm_ncipherlast_be (b0, iv); iv = in7; b1 = asm_ncipherlast_be (b1, in0); in3 = asm_xor (rkeylast, in3); in4 = asm_xor (rkeylast, in4); b2 = asm_ncipherlast_be (b2, in1); b3 = asm_ncipherlast_be (b3, in2); in5 = asm_xor (rkeylast, in5); in6 = asm_xor (rkeylast, in6); b0 = VEC_BE_SWAP (b0, bige_const); b1 = VEC_BE_SWAP (b1, bige_const); b4 = asm_ncipherlast_be (b4, in3); b5 = asm_ncipherlast_be (b5, in4); b2 = VEC_BE_SWAP (b2, bige_const); b3 = VEC_BE_SWAP (b3, bige_const); b6 = asm_ncipherlast_be (b6, in5); b7 = asm_ncipherlast_be (b7, in6); b4 = VEC_BE_SWAP (b4, bige_const); b5 = VEC_BE_SWAP (b5, bige_const); b6 = VEC_BE_SWAP (b6, bige_const); b7 = VEC_BE_SWAP (b7, bige_const); VEC_STORE_BE_NOSWAP (out, 0, b0); VEC_STORE_BE_NOSWAP (out, 1, b1); VEC_STORE_BE_NOSWAP (out, 2, b2); VEC_STORE_BE_NOSWAP (out, 3, b3); VEC_STORE_BE_NOSWAP (out, 4, b4); VEC_STORE_BE_NOSWAP (out, 5, b5); VEC_STORE_BE_NOSWAP (out, 6, b6); VEC_STORE_BE_NOSWAP (out, 7, b7); out += 8; } if (nblocks >= 4) { in0 = VEC_LOAD_BE (in, 0, bige_const); in1 = VEC_LOAD_BE (in, 1, bige_const); in2 = VEC_LOAD_BE (in, 2, bige_const); in3 = VEC_LOAD_BE (in, 3, bige_const); b0 = asm_xor (rkey0, in0); b1 = asm_xor (rkey0, in1); b2 = asm_xor (rkey0, in2); b3 = asm_xor (rkey0, in3); #define DO_ROUND(r) \ rkey = ALIGNED_LOAD (rk, r); \ b0 = asm_ncipher_be (b0, rkey); \ b1 = asm_ncipher_be (b1, rkey); \ b2 = asm_ncipher_be (b2, rkey); \ b3 = asm_ncipher_be (b3, rkey); DO_ROUND(1); DO_ROUND(2); DO_ROUND(3); DO_ROUND(4); DO_ROUND(5); DO_ROUND(6); DO_ROUND(7); DO_ROUND(8); DO_ROUND(9); if (rounds >= 12) { DO_ROUND(10); DO_ROUND(11); if (rounds > 12) { DO_ROUND(12); DO_ROUND(13); } } #undef DO_ROUND iv = asm_xor (rkeylast, iv); in0 = asm_xor (rkeylast, in0); in1 = asm_xor (rkeylast, in1); in2 = asm_xor (rkeylast, in2); b0 = asm_ncipherlast_be (b0, iv); iv = in3; b1 = asm_ncipherlast_be (b1, in0); b2 = asm_ncipherlast_be (b2, in1); b3 = asm_ncipherlast_be (b3, in2); VEC_STORE_BE (out, 0, b0, bige_const); VEC_STORE_BE (out, 1, b1, bige_const); VEC_STORE_BE (out, 2, b2, bige_const); VEC_STORE_BE (out, 3, b3, bige_const); in += 4; out += 4; nblocks -= 4; } for (; nblocks; nblocks--) { rkeylast = rkeylast_orig ^ iv; iv = VEC_LOAD_BE (in, 0, bige_const); b = iv; AES_DECRYPT (b, rounds); VEC_STORE_BE (out, 0, b, bige_const); in++; out++; } VEC_STORE_BE (iv_arg, 0, iv, bige_const); } void PPC_OPT_ATTR CTR_ENC_FUNC (void *context, unsigned char *ctr_arg, void *outbuf_arg, const void *inbuf_arg, size_t nblocks) { static const unsigned char vec_one_const[16] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 }; const block bige_const = asm_load_be_const(); RIJNDAEL_context *ctx = context; const u128_t *rk = (u128_t *)&ctx->keyschenc; const u128_t *in = (const u128_t *)inbuf_arg; u128_t *out = (u128_t *)outbuf_arg; int rounds = ctx->rounds; ROUND_KEY_VARIABLES; block rkeylast_orig; block ctr, b, one; ctr = VEC_LOAD_BE (ctr_arg, 0, bige_const); one = VEC_LOAD_BE (&vec_one_const, 0, bige_const); PRELOAD_ROUND_KEYS (rounds); rkeylast_orig = rkeylast; if (nblocks >= 4) { block in0, in1, in2, in3, in4, in5, in6, in7; block b0, b1, b2, b3, b4, b5, b6, b7; block two, three, four; block rkey; two = asm_add_uint128 (one, one); three = asm_add_uint128 (two, one); four = asm_add_uint128 (two, two); for (; nblocks >= 8; nblocks -= 8) { b1 = asm_add_uint128 (ctr, one); b2 = asm_add_uint128 (ctr, two); b3 = asm_add_uint128 (ctr, three); b4 = asm_add_uint128 (ctr, four); b5 = asm_add_uint128 (b1, four); b6 = asm_add_uint128 (b2, four); b7 = asm_add_uint128 (b3, four); b0 = asm_xor (rkey0, ctr); rkey = ALIGNED_LOAD (rk, 1); ctr = asm_add_uint128 (b4, four); b1 = asm_xor (rkey0, b1); b2 = asm_xor (rkey0, b2); b3 = asm_xor (rkey0, b3); b0 = asm_cipher_be (b0, rkey); b1 = asm_cipher_be (b1, rkey); b2 = asm_cipher_be (b2, rkey); b3 = asm_cipher_be (b3, rkey); b4 = asm_xor (rkey0, b4); b5 = asm_xor (rkey0, b5); b6 = asm_xor (rkey0, b6); b7 = asm_xor (rkey0, b7); b4 = asm_cipher_be (b4, rkey); b5 = asm_cipher_be (b5, rkey); b6 = asm_cipher_be (b6, rkey); b7 = asm_cipher_be (b7, rkey); #define DO_ROUND(r) \ rkey = ALIGNED_LOAD (rk, r); \ b0 = asm_cipher_be (b0, rkey); \ b1 = asm_cipher_be (b1, rkey); \ b2 = asm_cipher_be (b2, rkey); \ b3 = asm_cipher_be (b3, rkey); \ b4 = asm_cipher_be (b4, rkey); \ b5 = asm_cipher_be (b5, rkey); \ b6 = asm_cipher_be (b6, rkey); \ b7 = asm_cipher_be (b7, rkey); in0 = VEC_LOAD_BE_NOSWAP (in, 0); DO_ROUND(2); in1 = VEC_LOAD_BE_NOSWAP (in, 1); DO_ROUND(3); in2 = VEC_LOAD_BE_NOSWAP (in, 2); DO_ROUND(4); in3 = VEC_LOAD_BE_NOSWAP (in, 3); DO_ROUND(5); in4 = VEC_LOAD_BE_NOSWAP (in, 4); DO_ROUND(6); in5 = VEC_LOAD_BE_NOSWAP (in, 5); DO_ROUND(7); in6 = VEC_LOAD_BE_NOSWAP (in, 6); DO_ROUND(8); in7 = VEC_LOAD_BE_NOSWAP (in, 7); in += 8; DO_ROUND(9); if (rounds >= 12) { DO_ROUND(10); DO_ROUND(11); if (rounds > 12) { DO_ROUND(12); DO_ROUND(13); } } #undef DO_ROUND in0 = VEC_BE_SWAP (in0, bige_const); in1 = VEC_BE_SWAP (in1, bige_const); in2 = VEC_BE_SWAP (in2, bige_const); in3 = VEC_BE_SWAP (in3, bige_const); in4 = VEC_BE_SWAP (in4, bige_const); in5 = VEC_BE_SWAP (in5, bige_const); in6 = VEC_BE_SWAP (in6, bige_const); in7 = VEC_BE_SWAP (in7, bige_const); in0 = asm_xor (rkeylast, in0); in1 = asm_xor (rkeylast, in1); in2 = asm_xor (rkeylast, in2); in3 = asm_xor (rkeylast, in3); b0 = asm_cipherlast_be (b0, in0); b1 = asm_cipherlast_be (b1, in1); in4 = asm_xor (rkeylast, in4); in5 = asm_xor (rkeylast, in5); b2 = asm_cipherlast_be (b2, in2); b3 = asm_cipherlast_be (b3, in3); in6 = asm_xor (rkeylast, in6); in7 = asm_xor (rkeylast, in7); b4 = asm_cipherlast_be (b4, in4); b5 = asm_cipherlast_be (b5, in5); b6 = asm_cipherlast_be (b6, in6); b7 = asm_cipherlast_be (b7, in7); b0 = VEC_BE_SWAP (b0, bige_const); b1 = VEC_BE_SWAP (b1, bige_const); b2 = VEC_BE_SWAP (b2, bige_const); b3 = VEC_BE_SWAP (b3, bige_const); b4 = VEC_BE_SWAP (b4, bige_const); b5 = VEC_BE_SWAP (b5, bige_const); b6 = VEC_BE_SWAP (b6, bige_const); b7 = VEC_BE_SWAP (b7, bige_const); VEC_STORE_BE_NOSWAP (out, 0, b0); VEC_STORE_BE_NOSWAP (out, 1, b1); VEC_STORE_BE_NOSWAP (out, 2, b2); VEC_STORE_BE_NOSWAP (out, 3, b3); VEC_STORE_BE_NOSWAP (out, 4, b4); VEC_STORE_BE_NOSWAP (out, 5, b5); VEC_STORE_BE_NOSWAP (out, 6, b6); VEC_STORE_BE_NOSWAP (out, 7, b7); out += 8; } if (nblocks >= 4) { b1 = asm_add_uint128 (ctr, one); b2 = asm_add_uint128 (ctr, two); b3 = asm_add_uint128 (ctr, three); b0 = asm_xor (rkey0, ctr); ctr = asm_add_uint128 (ctr, four); b1 = asm_xor (rkey0, b1); b2 = asm_xor (rkey0, b2); b3 = asm_xor (rkey0, b3); #define DO_ROUND(r) \ rkey = ALIGNED_LOAD (rk, r); \ b0 = asm_cipher_be (b0, rkey); \ b1 = asm_cipher_be (b1, rkey); \ b2 = asm_cipher_be (b2, rkey); \ b3 = asm_cipher_be (b3, rkey); DO_ROUND(1); DO_ROUND(2); DO_ROUND(3); DO_ROUND(4); DO_ROUND(5); DO_ROUND(6); DO_ROUND(7); DO_ROUND(8); in0 = VEC_LOAD_BE (in, 0, bige_const); in1 = VEC_LOAD_BE (in, 1, bige_const); in2 = VEC_LOAD_BE (in, 2, bige_const); in3 = VEC_LOAD_BE (in, 3, bige_const); DO_ROUND(9); if (rounds >= 12) { DO_ROUND(10); DO_ROUND(11); if (rounds > 12) { DO_ROUND(12); DO_ROUND(13); } } #undef DO_ROUND in0 = asm_xor (rkeylast, in0); in1 = asm_xor (rkeylast, in1); in2 = asm_xor (rkeylast, in2); in3 = asm_xor (rkeylast, in3); b0 = asm_cipherlast_be (b0, in0); b1 = asm_cipherlast_be (b1, in1); b2 = asm_cipherlast_be (b2, in2); b3 = asm_cipherlast_be (b3, in3); VEC_STORE_BE (out, 0, b0, bige_const); VEC_STORE_BE (out, 1, b1, bige_const); VEC_STORE_BE (out, 2, b2, bige_const); VEC_STORE_BE (out, 3, b3, bige_const); in += 4; out += 4; nblocks -= 4; } } for (; nblocks; nblocks--) { b = ctr; ctr = asm_add_uint128 (ctr, one); rkeylast = rkeylast_orig ^ VEC_LOAD_BE (in, 0, bige_const); AES_ENCRYPT (b, rounds); VEC_STORE_BE (out, 0, b, bige_const); out++; in++; } VEC_STORE_BE (ctr_arg, 0, ctr, bige_const); } size_t PPC_OPT_ATTR OCB_CRYPT_FUNC (gcry_cipher_hd_t c, void *outbuf_arg, const void *inbuf_arg, size_t nblocks, int encrypt) { const block bige_const = asm_load_be_const(); RIJNDAEL_context *ctx = (void *)&c->context.c; const u128_t *in = (const u128_t *)inbuf_arg; u128_t *out = (u128_t *)outbuf_arg; int rounds = ctx->rounds; u64 data_nblocks = c->u_mode.ocb.data_nblocks; block l0, l1, l2, l; block b0, b1, b2, b3, b4, b5, b6, b7, b; block iv0, iv1, iv2, iv3, iv4, iv5, iv6, iv7; block rkey, rkeylf; block ctr, iv; ROUND_KEY_VARIABLES; iv = VEC_LOAD_BE (c->u_iv.iv, 0, bige_const); ctr = VEC_LOAD_BE (c->u_ctr.ctr, 0, bige_const); l0 = VEC_LOAD_BE (c->u_mode.ocb.L[0], 0, bige_const); l1 = VEC_LOAD_BE (c->u_mode.ocb.L[1], 0, bige_const); l2 = VEC_LOAD_BE (c->u_mode.ocb.L[2], 0, bige_const); if (encrypt) { const u128_t *rk = (u128_t *)&ctx->keyschenc; PRELOAD_ROUND_KEYS (rounds); for (; nblocks >= 8 && data_nblocks % 8; nblocks--) { l = VEC_LOAD_BE (ocb_get_l (c, ++data_nblocks), 0, bige_const); b = VEC_LOAD_BE (in, 0, bige_const); /* Offset_i = Offset_{i-1} xor L_{ntz(i)} */ iv ^= l; /* Checksum_i = Checksum_{i-1} xor P_i */ ctr ^= b; /* C_i = Offset_i xor ENCIPHER(K, P_i xor Offset_i) */ b ^= iv; AES_ENCRYPT (b, rounds); b ^= iv; VEC_STORE_BE (out, 0, b, bige_const); in += 1; out += 1; } for (; nblocks >= 8; nblocks -= 8) { b0 = VEC_LOAD_BE_NOSWAP (in, 0); b1 = VEC_LOAD_BE_NOSWAP (in, 1); b2 = VEC_LOAD_BE_NOSWAP (in, 2); b3 = VEC_LOAD_BE_NOSWAP (in, 3); b4 = VEC_LOAD_BE_NOSWAP (in, 4); b5 = VEC_LOAD_BE_NOSWAP (in, 5); b6 = VEC_LOAD_BE_NOSWAP (in, 6); b7 = VEC_LOAD_BE_NOSWAP (in, 7); in += 8; l = VEC_LOAD_BE_NOSWAP (ocb_get_l (c, data_nblocks += 8), 0); b0 = VEC_BE_SWAP(b0, bige_const); b1 = VEC_BE_SWAP(b1, bige_const); b2 = VEC_BE_SWAP(b2, bige_const); b3 = VEC_BE_SWAP(b3, bige_const); b4 = VEC_BE_SWAP(b4, bige_const); b5 = VEC_BE_SWAP(b5, bige_const); b6 = VEC_BE_SWAP(b6, bige_const); b7 = VEC_BE_SWAP(b7, bige_const); l = VEC_BE_SWAP(l, bige_const); ctr ^= b0 ^ b1 ^ b2 ^ b3 ^ b4 ^ b5 ^ b6 ^ b7; iv ^= rkey0; iv0 = iv ^ l0; iv1 = iv ^ l0 ^ l1; iv2 = iv ^ l1; iv3 = iv ^ l1 ^ l2; iv4 = iv ^ l1 ^ l2 ^ l0; iv5 = iv ^ l2 ^ l0; iv6 = iv ^ l2; iv7 = iv ^ l2 ^ l; b0 ^= iv0; b1 ^= iv1; b2 ^= iv2; b3 ^= iv3; b4 ^= iv4; b5 ^= iv5; b6 ^= iv6; b7 ^= iv7; iv = iv7 ^ rkey0; #define DO_ROUND(r) \ rkey = ALIGNED_LOAD (rk, r); \ b0 = asm_cipher_be (b0, rkey); \ b1 = asm_cipher_be (b1, rkey); \ b2 = asm_cipher_be (b2, rkey); \ b3 = asm_cipher_be (b3, rkey); \ b4 = asm_cipher_be (b4, rkey); \ b5 = asm_cipher_be (b5, rkey); \ b6 = asm_cipher_be (b6, rkey); \ b7 = asm_cipher_be (b7, rkey); DO_ROUND(1); DO_ROUND(2); DO_ROUND(3); DO_ROUND(4); DO_ROUND(5); DO_ROUND(6); DO_ROUND(7); rkeylf = asm_xor (rkeylast, rkey0); DO_ROUND(8); iv0 = asm_xor (rkeylf, iv0); iv1 = asm_xor (rkeylf, iv1); iv2 = asm_xor (rkeylf, iv2); iv3 = asm_xor (rkeylf, iv3); iv4 = asm_xor (rkeylf, iv4); iv5 = asm_xor (rkeylf, iv5); iv6 = asm_xor (rkeylf, iv6); iv7 = asm_xor (rkeylf, iv7); DO_ROUND(9); if (rounds >= 12) { DO_ROUND(10); DO_ROUND(11); if (rounds > 12) { DO_ROUND(12); DO_ROUND(13); } } #undef DO_ROUND b0 = asm_cipherlast_be (b0, iv0); b1 = asm_cipherlast_be (b1, iv1); b2 = asm_cipherlast_be (b2, iv2); b3 = asm_cipherlast_be (b3, iv3); b4 = asm_cipherlast_be (b4, iv4); b5 = asm_cipherlast_be (b5, iv5); b6 = asm_cipherlast_be (b6, iv6); b7 = asm_cipherlast_be (b7, iv7); b0 = VEC_BE_SWAP (b0, bige_const); b1 = VEC_BE_SWAP (b1, bige_const); b2 = VEC_BE_SWAP (b2, bige_const); b3 = VEC_BE_SWAP (b3, bige_const); b4 = VEC_BE_SWAP (b4, bige_const); b5 = VEC_BE_SWAP (b5, bige_const); b6 = VEC_BE_SWAP (b6, bige_const); b7 = VEC_BE_SWAP (b7, bige_const); VEC_STORE_BE_NOSWAP (out, 0, b0); VEC_STORE_BE_NOSWAP (out, 1, b1); VEC_STORE_BE_NOSWAP (out, 2, b2); VEC_STORE_BE_NOSWAP (out, 3, b3); VEC_STORE_BE_NOSWAP (out, 4, b4); VEC_STORE_BE_NOSWAP (out, 5, b5); VEC_STORE_BE_NOSWAP (out, 6, b6); VEC_STORE_BE_NOSWAP (out, 7, b7); out += 8; } if (nblocks >= 4 && (data_nblocks % 4) == 0) { b0 = VEC_LOAD_BE (in, 0, bige_const); b1 = VEC_LOAD_BE (in, 1, bige_const); b2 = VEC_LOAD_BE (in, 2, bige_const); b3 = VEC_LOAD_BE (in, 3, bige_const); l = VEC_LOAD_BE (ocb_get_l (c, data_nblocks += 4), 0, bige_const); ctr ^= b0 ^ b1 ^ b2 ^ b3; iv ^= rkey0; iv0 = iv ^ l0; iv1 = iv ^ l0 ^ l1; iv2 = iv ^ l1; iv3 = iv ^ l1 ^ l; b0 ^= iv0; b1 ^= iv1; b2 ^= iv2; b3 ^= iv3; iv = iv3 ^ rkey0; #define DO_ROUND(r) \ rkey = ALIGNED_LOAD (rk, r); \ b0 = asm_cipher_be (b0, rkey); \ b1 = asm_cipher_be (b1, rkey); \ b2 = asm_cipher_be (b2, rkey); \ b3 = asm_cipher_be (b3, rkey); DO_ROUND(1); DO_ROUND(2); DO_ROUND(3); DO_ROUND(4); DO_ROUND(5); DO_ROUND(6); DO_ROUND(7); DO_ROUND(8); DO_ROUND(9); if (rounds >= 12) { DO_ROUND(10); DO_ROUND(11); if (rounds > 12) { DO_ROUND(12); DO_ROUND(13); } } #undef DO_ROUND rkey = rkeylast ^ rkey0; b0 = asm_cipherlast_be (b0, rkey ^ iv0); b1 = asm_cipherlast_be (b1, rkey ^ iv1); b2 = asm_cipherlast_be (b2, rkey ^ iv2); b3 = asm_cipherlast_be (b3, rkey ^ iv3); VEC_STORE_BE (out, 0, b0, bige_const); VEC_STORE_BE (out, 1, b1, bige_const); VEC_STORE_BE (out, 2, b2, bige_const); VEC_STORE_BE (out, 3, b3, bige_const); in += 4; out += 4; nblocks -= 4; } for (; nblocks; nblocks--) { l = VEC_LOAD_BE (ocb_get_l (c, ++data_nblocks), 0, bige_const); b = VEC_LOAD_BE (in, 0, bige_const); /* Offset_i = Offset_{i-1} xor L_{ntz(i)} */ iv ^= l; /* Checksum_i = Checksum_{i-1} xor P_i */ ctr ^= b; /* C_i = Offset_i xor ENCIPHER(K, P_i xor Offset_i) */ b ^= iv; AES_ENCRYPT (b, rounds); b ^= iv; VEC_STORE_BE (out, 0, b, bige_const); in += 1; out += 1; } } else { const u128_t *rk = (u128_t *)&ctx->keyschdec; if (!ctx->decryption_prepared) { internal_aes_ppc_prepare_decryption (ctx); ctx->decryption_prepared = 1; } PRELOAD_ROUND_KEYS (rounds); for (; nblocks >= 8 && data_nblocks % 8; nblocks--) { l = VEC_LOAD_BE (ocb_get_l (c, ++data_nblocks), 0, bige_const); b = VEC_LOAD_BE (in, 0, bige_const); /* Offset_i = Offset_{i-1} xor L_{ntz(i)} */ iv ^= l; /* P_i = Offset_i xor DECIPHER(K, C_i xor Offset_i) */ b ^= iv; AES_DECRYPT (b, rounds); b ^= iv; /* Checksum_i = Checksum_{i-1} xor P_i */ ctr ^= b; VEC_STORE_BE (out, 0, b, bige_const); in += 1; out += 1; } for (; nblocks >= 8; nblocks -= 8) { b0 = VEC_LOAD_BE_NOSWAP (in, 0); b1 = VEC_LOAD_BE_NOSWAP (in, 1); b2 = VEC_LOAD_BE_NOSWAP (in, 2); b3 = VEC_LOAD_BE_NOSWAP (in, 3); b4 = VEC_LOAD_BE_NOSWAP (in, 4); b5 = VEC_LOAD_BE_NOSWAP (in, 5); b6 = VEC_LOAD_BE_NOSWAP (in, 6); b7 = VEC_LOAD_BE_NOSWAP (in, 7); in += 8; l = VEC_LOAD_BE_NOSWAP (ocb_get_l (c, data_nblocks += 8), 0); b0 = VEC_BE_SWAP(b0, bige_const); b1 = VEC_BE_SWAP(b1, bige_const); b2 = VEC_BE_SWAP(b2, bige_const); b3 = VEC_BE_SWAP(b3, bige_const); b4 = VEC_BE_SWAP(b4, bige_const); b5 = VEC_BE_SWAP(b5, bige_const); b6 = VEC_BE_SWAP(b6, bige_const); b7 = VEC_BE_SWAP(b7, bige_const); l = VEC_BE_SWAP(l, bige_const); iv ^= rkey0; iv0 = iv ^ l0; iv1 = iv ^ l0 ^ l1; iv2 = iv ^ l1; iv3 = iv ^ l1 ^ l2; iv4 = iv ^ l1 ^ l2 ^ l0; iv5 = iv ^ l2 ^ l0; iv6 = iv ^ l2; iv7 = iv ^ l2 ^ l; b0 ^= iv0; b1 ^= iv1; b2 ^= iv2; b3 ^= iv3; b4 ^= iv4; b5 ^= iv5; b6 ^= iv6; b7 ^= iv7; iv = iv7 ^ rkey0; #define DO_ROUND(r) \ rkey = ALIGNED_LOAD (rk, r); \ b0 = asm_ncipher_be (b0, rkey); \ b1 = asm_ncipher_be (b1, rkey); \ b2 = asm_ncipher_be (b2, rkey); \ b3 = asm_ncipher_be (b3, rkey); \ b4 = asm_ncipher_be (b4, rkey); \ b5 = asm_ncipher_be (b5, rkey); \ b6 = asm_ncipher_be (b6, rkey); \ b7 = asm_ncipher_be (b7, rkey); DO_ROUND(1); DO_ROUND(2); DO_ROUND(3); DO_ROUND(4); DO_ROUND(5); DO_ROUND(6); DO_ROUND(7); rkeylf = asm_xor (rkeylast, rkey0); DO_ROUND(8); iv0 = asm_xor (rkeylf, iv0); iv1 = asm_xor (rkeylf, iv1); iv2 = asm_xor (rkeylf, iv2); iv3 = asm_xor (rkeylf, iv3); iv4 = asm_xor (rkeylf, iv4); iv5 = asm_xor (rkeylf, iv5); iv6 = asm_xor (rkeylf, iv6); iv7 = asm_xor (rkeylf, iv7); DO_ROUND(9); if (rounds >= 12) { DO_ROUND(10); DO_ROUND(11); if (rounds > 12) { DO_ROUND(12); DO_ROUND(13); } } #undef DO_ROUND b0 = asm_ncipherlast_be (b0, iv0); b1 = asm_ncipherlast_be (b1, iv1); b2 = asm_ncipherlast_be (b2, iv2); b3 = asm_ncipherlast_be (b3, iv3); b4 = asm_ncipherlast_be (b4, iv4); b5 = asm_ncipherlast_be (b5, iv5); b6 = asm_ncipherlast_be (b6, iv6); b7 = asm_ncipherlast_be (b7, iv7); ctr ^= b0 ^ b1 ^ b2 ^ b3 ^ b4 ^ b5 ^ b6 ^ b7; b0 = VEC_BE_SWAP (b0, bige_const); b1 = VEC_BE_SWAP (b1, bige_const); b2 = VEC_BE_SWAP (b2, bige_const); b3 = VEC_BE_SWAP (b3, bige_const); b4 = VEC_BE_SWAP (b4, bige_const); b5 = VEC_BE_SWAP (b5, bige_const); b6 = VEC_BE_SWAP (b6, bige_const); b7 = VEC_BE_SWAP (b7, bige_const); VEC_STORE_BE_NOSWAP (out, 0, b0); VEC_STORE_BE_NOSWAP (out, 1, b1); VEC_STORE_BE_NOSWAP (out, 2, b2); VEC_STORE_BE_NOSWAP (out, 3, b3); VEC_STORE_BE_NOSWAP (out, 4, b4); VEC_STORE_BE_NOSWAP (out, 5, b5); VEC_STORE_BE_NOSWAP (out, 6, b6); VEC_STORE_BE_NOSWAP (out, 7, b7); out += 8; } if (nblocks >= 4 && (data_nblocks % 4) == 0) { b0 = VEC_LOAD_BE (in, 0, bige_const); b1 = VEC_LOAD_BE (in, 1, bige_const); b2 = VEC_LOAD_BE (in, 2, bige_const); b3 = VEC_LOAD_BE (in, 3, bige_const); l = VEC_LOAD_BE (ocb_get_l (c, data_nblocks += 4), 0, bige_const); iv ^= rkey0; iv0 = iv ^ l0; iv1 = iv ^ l0 ^ l1; iv2 = iv ^ l1; iv3 = iv ^ l1 ^ l; b0 ^= iv0; b1 ^= iv1; b2 ^= iv2; b3 ^= iv3; iv = iv3 ^ rkey0; #define DO_ROUND(r) \ rkey = ALIGNED_LOAD (rk, r); \ b0 = asm_ncipher_be (b0, rkey); \ b1 = asm_ncipher_be (b1, rkey); \ b2 = asm_ncipher_be (b2, rkey); \ b3 = asm_ncipher_be (b3, rkey); DO_ROUND(1); DO_ROUND(2); DO_ROUND(3); DO_ROUND(4); DO_ROUND(5); DO_ROUND(6); DO_ROUND(7); DO_ROUND(8); DO_ROUND(9); if (rounds >= 12) { DO_ROUND(10); DO_ROUND(11); if (rounds > 12) { DO_ROUND(12); DO_ROUND(13); } } #undef DO_ROUND rkey = rkeylast ^ rkey0; b0 = asm_ncipherlast_be (b0, rkey ^ iv0); b1 = asm_ncipherlast_be (b1, rkey ^ iv1); b2 = asm_ncipherlast_be (b2, rkey ^ iv2); b3 = asm_ncipherlast_be (b3, rkey ^ iv3); VEC_STORE_BE (out, 0, b0, bige_const); VEC_STORE_BE (out, 1, b1, bige_const); VEC_STORE_BE (out, 2, b2, bige_const); VEC_STORE_BE (out, 3, b3, bige_const); ctr ^= b0 ^ b1 ^ b2 ^ b3; in += 4; out += 4; nblocks -= 4; } for (; nblocks; nblocks--) { l = VEC_LOAD_BE (ocb_get_l (c, ++data_nblocks), 0, bige_const); b = VEC_LOAD_BE (in, 0, bige_const); /* Offset_i = Offset_{i-1} xor L_{ntz(i)} */ iv ^= l; /* P_i = Offset_i xor DECIPHER(K, C_i xor Offset_i) */ b ^= iv; AES_DECRYPT (b, rounds); b ^= iv; /* Checksum_i = Checksum_{i-1} xor P_i */ ctr ^= b; VEC_STORE_BE (out, 0, b, bige_const); in += 1; out += 1; } } VEC_STORE_BE (c->u_iv.iv, 0, iv, bige_const); VEC_STORE_BE (c->u_ctr.ctr, 0, ctr, bige_const); c->u_mode.ocb.data_nblocks = data_nblocks; return 0; } size_t PPC_OPT_ATTR OCB_AUTH_FUNC (gcry_cipher_hd_t c, void *abuf_arg, size_t nblocks) { const block bige_const = asm_load_be_const(); RIJNDAEL_context *ctx = (void *)&c->context.c; const u128_t *rk = (u128_t *)&ctx->keyschenc; const u128_t *abuf = (const u128_t *)abuf_arg; int rounds = ctx->rounds; u64 data_nblocks = c->u_mode.ocb.aad_nblocks; block l0, l1, l2, l; block b0, b1, b2, b3, b4, b5, b6, b7, b; block iv0, iv1, iv2, iv3, iv4, iv5, iv6, iv7; block rkey, frkey; block ctr, iv; ROUND_KEY_VARIABLES; iv = VEC_LOAD_BE (c->u_mode.ocb.aad_offset, 0, bige_const); ctr = VEC_LOAD_BE (c->u_mode.ocb.aad_sum, 0, bige_const); l0 = VEC_LOAD_BE (c->u_mode.ocb.L[0], 0, bige_const); l1 = VEC_LOAD_BE (c->u_mode.ocb.L[1], 0, bige_const); l2 = VEC_LOAD_BE (c->u_mode.ocb.L[2], 0, bige_const); PRELOAD_ROUND_KEYS (rounds); for (; nblocks >= 8 && data_nblocks % 8; nblocks--) { l = VEC_LOAD_BE (ocb_get_l (c, ++data_nblocks), 0, bige_const); b = VEC_LOAD_BE (abuf, 0, bige_const); /* Offset_i = Offset_{i-1} xor L_{ntz(i)} */ iv ^= l; /* Sum_i = Sum_{i-1} xor ENCIPHER(K, A_i xor Offset_i) */ b ^= iv; AES_ENCRYPT (b, rounds); ctr ^= b; abuf += 1; } for (; nblocks >= 8; nblocks -= 8) { b0 = VEC_LOAD_BE (abuf, 0, bige_const); b1 = VEC_LOAD_BE (abuf, 1, bige_const); b2 = VEC_LOAD_BE (abuf, 2, bige_const); b3 = VEC_LOAD_BE (abuf, 3, bige_const); b4 = VEC_LOAD_BE (abuf, 4, bige_const); b5 = VEC_LOAD_BE (abuf, 5, bige_const); b6 = VEC_LOAD_BE (abuf, 6, bige_const); b7 = VEC_LOAD_BE (abuf, 7, bige_const); l = VEC_LOAD_BE (ocb_get_l (c, data_nblocks += 8), 0, bige_const); frkey = rkey0; iv ^= frkey; iv0 = iv ^ l0; iv1 = iv ^ l0 ^ l1; iv2 = iv ^ l1; iv3 = iv ^ l1 ^ l2; iv4 = iv ^ l1 ^ l2 ^ l0; iv5 = iv ^ l2 ^ l0; iv6 = iv ^ l2; iv7 = iv ^ l2 ^ l; b0 ^= iv0; b1 ^= iv1; b2 ^= iv2; b3 ^= iv3; b4 ^= iv4; b5 ^= iv5; b6 ^= iv6; b7 ^= iv7; iv = iv7 ^ frkey; #define DO_ROUND(r) \ rkey = ALIGNED_LOAD (rk, r); \ b0 = asm_cipher_be (b0, rkey); \ b1 = asm_cipher_be (b1, rkey); \ b2 = asm_cipher_be (b2, rkey); \ b3 = asm_cipher_be (b3, rkey); \ b4 = asm_cipher_be (b4, rkey); \ b5 = asm_cipher_be (b5, rkey); \ b6 = asm_cipher_be (b6, rkey); \ b7 = asm_cipher_be (b7, rkey); DO_ROUND(1); DO_ROUND(2); DO_ROUND(3); DO_ROUND(4); DO_ROUND(5); DO_ROUND(6); DO_ROUND(7); DO_ROUND(8); DO_ROUND(9); if (rounds >= 12) { DO_ROUND(10); DO_ROUND(11); if (rounds > 12) { DO_ROUND(12); DO_ROUND(13); } } #undef DO_ROUND rkey = rkeylast; b0 = asm_cipherlast_be (b0, rkey); b1 = asm_cipherlast_be (b1, rkey); b2 = asm_cipherlast_be (b2, rkey); b3 = asm_cipherlast_be (b3, rkey); b4 = asm_cipherlast_be (b4, rkey); b5 = asm_cipherlast_be (b5, rkey); b6 = asm_cipherlast_be (b6, rkey); b7 = asm_cipherlast_be (b7, rkey); ctr ^= b0 ^ b1 ^ b2 ^ b3 ^ b4 ^ b5 ^ b6 ^ b7; abuf += 8; } if (nblocks >= 4 && (data_nblocks % 4) == 0) { b0 = VEC_LOAD_BE (abuf, 0, bige_const); b1 = VEC_LOAD_BE (abuf, 1, bige_const); b2 = VEC_LOAD_BE (abuf, 2, bige_const); b3 = VEC_LOAD_BE (abuf, 3, bige_const); l = VEC_LOAD_BE (ocb_get_l (c, data_nblocks += 4), 0, bige_const); frkey = rkey0; iv ^= frkey; iv0 = iv ^ l0; iv1 = iv ^ l0 ^ l1; iv2 = iv ^ l1; iv3 = iv ^ l1 ^ l; b0 ^= iv0; b1 ^= iv1; b2 ^= iv2; b3 ^= iv3; iv = iv3 ^ frkey; #define DO_ROUND(r) \ rkey = ALIGNED_LOAD (rk, r); \ b0 = asm_cipher_be (b0, rkey); \ b1 = asm_cipher_be (b1, rkey); \ b2 = asm_cipher_be (b2, rkey); \ b3 = asm_cipher_be (b3, rkey); DO_ROUND(1); DO_ROUND(2); DO_ROUND(3); DO_ROUND(4); DO_ROUND(5); DO_ROUND(6); DO_ROUND(7); DO_ROUND(8); DO_ROUND(9); if (rounds >= 12) { DO_ROUND(10); DO_ROUND(11); if (rounds > 12) { DO_ROUND(12); DO_ROUND(13); } } #undef DO_ROUND rkey = rkeylast; b0 = asm_cipherlast_be (b0, rkey); b1 = asm_cipherlast_be (b1, rkey); b2 = asm_cipherlast_be (b2, rkey); b3 = asm_cipherlast_be (b3, rkey); ctr ^= b0 ^ b1 ^ b2 ^ b3; abuf += 4; nblocks -= 4; } for (; nblocks; nblocks--) { l = VEC_LOAD_BE (ocb_get_l (c, ++data_nblocks), 0, bige_const); b = VEC_LOAD_BE (abuf, 0, bige_const); /* Offset_i = Offset_{i-1} xor L_{ntz(i)} */ iv ^= l; /* Sum_i = Sum_{i-1} xor ENCIPHER(K, A_i xor Offset_i) */ b ^= iv; AES_ENCRYPT (b, rounds); ctr ^= b; abuf += 1; } VEC_STORE_BE (c->u_mode.ocb.aad_offset, 0, iv, bige_const); VEC_STORE_BE (c->u_mode.ocb.aad_sum, 0, ctr, bige_const); c->u_mode.ocb.aad_nblocks = data_nblocks; return 0; } void PPC_OPT_ATTR XTS_CRYPT_FUNC (void *context, unsigned char *tweak_arg, void *outbuf_arg, const void *inbuf_arg, size_t nblocks, int encrypt) { #ifdef WORDS_BIGENDIAN static const block vec_bswap128_const = { 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 }; #else static const block vec_bswap128_const = { ~15, ~14, ~13, ~12, ~11, ~10, ~9, ~8, ~7, ~6, ~5, ~4, ~3, ~2, ~1, ~0 }; #endif static const unsigned char vec_tweak_const[16] = { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0x87 }; static const vector unsigned long long vec_shift63_const = { 63, 63 }; const block bige_const = asm_load_be_const(); RIJNDAEL_context *ctx = context; const u128_t *in = (const u128_t *)inbuf_arg; u128_t *out = (u128_t *)outbuf_arg; int rounds = ctx->rounds; block tweak; block b0, b1, b2, b3, b4, b5, b6, b7, b, rkey, rkeylf; block tweak0, tweak1, tweak2, tweak3, tweak4, tweak5, tweak6, tweak7; block tweak_const, bswap128_const, shift63_const; ROUND_KEY_VARIABLES; tweak_const = VEC_LOAD_BE (&vec_tweak_const, 0, bige_const); bswap128_const = ALIGNED_LOAD (&vec_bswap128_const, 0); shift63_const = ALIGNED_LOAD (&vec_shift63_const, 0); tweak = VEC_LOAD_BE (tweak_arg, 0, bige_const); tweak = asm_vperm1 (tweak, bswap128_const); #define GEN_TWEAK(tout, tin) /* Generate next tweak. */ \ do { \ block tmp1, tmp2; \ tmp1 = asm_swap_uint64_halfs(tin); \ tmp2 = asm_add_uint64(tin, tin); \ tmp1 = asm_sra_int64(tmp1, shift63_const) & tweak_const; \ tout = asm_xor(tmp1, tmp2); \ } while (0) if (encrypt) { const u128_t *rk = (u128_t *)&ctx->keyschenc; PRELOAD_ROUND_KEYS (rounds); for (; nblocks >= 8; nblocks -= 8) { b0 = VEC_LOAD_BE_NOSWAP (in, 0); b1 = VEC_LOAD_BE_NOSWAP (in, 1); b2 = VEC_LOAD_BE_NOSWAP (in, 2); b3 = VEC_LOAD_BE_NOSWAP (in, 3); tweak0 = tweak; GEN_TWEAK (tweak1, tweak0); tweak0 = asm_vperm1 (tweak0, bswap128_const); b4 = VEC_LOAD_BE_NOSWAP (in, 4); b5 = VEC_LOAD_BE_NOSWAP (in, 5); GEN_TWEAK (tweak2, tweak1); tweak1 = asm_vperm1 (tweak1, bswap128_const); b6 = VEC_LOAD_BE_NOSWAP (in, 6); b7 = VEC_LOAD_BE_NOSWAP (in, 7); in += 8; b0 = VEC_BE_SWAP(b0, bige_const); b1 = VEC_BE_SWAP(b1, bige_const); GEN_TWEAK (tweak3, tweak2); tweak2 = asm_vperm1 (tweak2, bswap128_const); GEN_TWEAK (tweak4, tweak3); tweak3 = asm_vperm1 (tweak3, bswap128_const); b2 = VEC_BE_SWAP(b2, bige_const); b3 = VEC_BE_SWAP(b3, bige_const); GEN_TWEAK (tweak5, tweak4); tweak4 = asm_vperm1 (tweak4, bswap128_const); GEN_TWEAK (tweak6, tweak5); tweak5 = asm_vperm1 (tweak5, bswap128_const); b4 = VEC_BE_SWAP(b4, bige_const); b5 = VEC_BE_SWAP(b5, bige_const); GEN_TWEAK (tweak7, tweak6); tweak6 = asm_vperm1 (tweak6, bswap128_const); GEN_TWEAK (tweak, tweak7); tweak7 = asm_vperm1 (tweak7, bswap128_const); b6 = VEC_BE_SWAP(b6, bige_const); b7 = VEC_BE_SWAP(b7, bige_const); tweak0 = asm_xor (tweak0, rkey0); tweak1 = asm_xor (tweak1, rkey0); tweak2 = asm_xor (tweak2, rkey0); tweak3 = asm_xor (tweak3, rkey0); tweak4 = asm_xor (tweak4, rkey0); tweak5 = asm_xor (tweak5, rkey0); tweak6 = asm_xor (tweak6, rkey0); tweak7 = asm_xor (tweak7, rkey0); b0 = asm_xor (b0, tweak0); b1 = asm_xor (b1, tweak1); b2 = asm_xor (b2, tweak2); b3 = asm_xor (b3, tweak3); b4 = asm_xor (b4, tweak4); b5 = asm_xor (b5, tweak5); b6 = asm_xor (b6, tweak6); b7 = asm_xor (b7, tweak7); #define DO_ROUND(r) \ rkey = ALIGNED_LOAD (rk, r); \ b0 = asm_cipher_be (b0, rkey); \ b1 = asm_cipher_be (b1, rkey); \ b2 = asm_cipher_be (b2, rkey); \ b3 = asm_cipher_be (b3, rkey); \ b4 = asm_cipher_be (b4, rkey); \ b5 = asm_cipher_be (b5, rkey); \ b6 = asm_cipher_be (b6, rkey); \ b7 = asm_cipher_be (b7, rkey); DO_ROUND(1); DO_ROUND(2); DO_ROUND(3); DO_ROUND(4); DO_ROUND(5); DO_ROUND(6); DO_ROUND(7); rkeylf = asm_xor (rkeylast, rkey0); DO_ROUND(8); tweak0 = asm_xor (tweak0, rkeylf); tweak1 = asm_xor (tweak1, rkeylf); tweak2 = asm_xor (tweak2, rkeylf); tweak3 = asm_xor (tweak3, rkeylf); tweak4 = asm_xor (tweak4, rkeylf); tweak5 = asm_xor (tweak5, rkeylf); tweak6 = asm_xor (tweak6, rkeylf); tweak7 = asm_xor (tweak7, rkeylf); DO_ROUND(9); if (rounds >= 12) { DO_ROUND(10); DO_ROUND(11); if (rounds > 12) { DO_ROUND(12); DO_ROUND(13); } } #undef DO_ROUND b0 = asm_cipherlast_be (b0, tweak0); b1 = asm_cipherlast_be (b1, tweak1); b2 = asm_cipherlast_be (b2, tweak2); b3 = asm_cipherlast_be (b3, tweak3); b0 = VEC_BE_SWAP (b0, bige_const); b1 = VEC_BE_SWAP (b1, bige_const); b4 = asm_cipherlast_be (b4, tweak4); b5 = asm_cipherlast_be (b5, tweak5); b2 = VEC_BE_SWAP (b2, bige_const); b3 = VEC_BE_SWAP (b3, bige_const); b6 = asm_cipherlast_be (b6, tweak6); b7 = asm_cipherlast_be (b7, tweak7); VEC_STORE_BE_NOSWAP (out, 0, b0); VEC_STORE_BE_NOSWAP (out, 1, b1); b4 = VEC_BE_SWAP (b4, bige_const); b5 = VEC_BE_SWAP (b5, bige_const); VEC_STORE_BE_NOSWAP (out, 2, b2); VEC_STORE_BE_NOSWAP (out, 3, b3); b6 = VEC_BE_SWAP (b6, bige_const); b7 = VEC_BE_SWAP (b7, bige_const); VEC_STORE_BE_NOSWAP (out, 4, b4); VEC_STORE_BE_NOSWAP (out, 5, b5); VEC_STORE_BE_NOSWAP (out, 6, b6); VEC_STORE_BE_NOSWAP (out, 7, b7); out += 8; } if (nblocks >= 4) { tweak0 = tweak; GEN_TWEAK (tweak1, tweak0); GEN_TWEAK (tweak2, tweak1); GEN_TWEAK (tweak3, tweak2); GEN_TWEAK (tweak, tweak3); b0 = VEC_LOAD_BE (in, 0, bige_const); b1 = VEC_LOAD_BE (in, 1, bige_const); b2 = VEC_LOAD_BE (in, 2, bige_const); b3 = VEC_LOAD_BE (in, 3, bige_const); tweak0 = asm_vperm1 (tweak0, bswap128_const); tweak1 = asm_vperm1 (tweak1, bswap128_const); tweak2 = asm_vperm1 (tweak2, bswap128_const); tweak3 = asm_vperm1 (tweak3, bswap128_const); b0 ^= tweak0 ^ rkey0; b1 ^= tweak1 ^ rkey0; b2 ^= tweak2 ^ rkey0; b3 ^= tweak3 ^ rkey0; #define DO_ROUND(r) \ rkey = ALIGNED_LOAD (rk, r); \ b0 = asm_cipher_be (b0, rkey); \ b1 = asm_cipher_be (b1, rkey); \ b2 = asm_cipher_be (b2, rkey); \ b3 = asm_cipher_be (b3, rkey); DO_ROUND(1); DO_ROUND(2); DO_ROUND(3); DO_ROUND(4); DO_ROUND(5); DO_ROUND(6); DO_ROUND(7); DO_ROUND(8); DO_ROUND(9); if (rounds >= 12) { DO_ROUND(10); DO_ROUND(11); if (rounds > 12) { DO_ROUND(12); DO_ROUND(13); } } #undef DO_ROUND rkey = rkeylast; b0 = asm_cipherlast_be (b0, rkey ^ tweak0); b1 = asm_cipherlast_be (b1, rkey ^ tweak1); b2 = asm_cipherlast_be (b2, rkey ^ tweak2); b3 = asm_cipherlast_be (b3, rkey ^ tweak3); VEC_STORE_BE (out, 0, b0, bige_const); VEC_STORE_BE (out, 1, b1, bige_const); VEC_STORE_BE (out, 2, b2, bige_const); VEC_STORE_BE (out, 3, b3, bige_const); in += 4; out += 4; nblocks -= 4; } for (; nblocks; nblocks--) { tweak0 = asm_vperm1 (tweak, bswap128_const); /* Xor-Encrypt/Decrypt-Xor block. */ b = VEC_LOAD_BE (in, 0, bige_const) ^ tweak0; /* Generate next tweak. */ GEN_TWEAK (tweak, tweak); AES_ENCRYPT (b, rounds); b ^= tweak0; VEC_STORE_BE (out, 0, b, bige_const); in++; out++; } } else { const u128_t *rk = (u128_t *)&ctx->keyschdec; if (!ctx->decryption_prepared) { internal_aes_ppc_prepare_decryption (ctx); ctx->decryption_prepared = 1; } PRELOAD_ROUND_KEYS (rounds); for (; nblocks >= 8; nblocks -= 8) { b0 = VEC_LOAD_BE_NOSWAP (in, 0); b1 = VEC_LOAD_BE_NOSWAP (in, 1); b2 = VEC_LOAD_BE_NOSWAP (in, 2); b3 = VEC_LOAD_BE_NOSWAP (in, 3); tweak0 = tweak; GEN_TWEAK (tweak1, tweak0); tweak0 = asm_vperm1 (tweak0, bswap128_const); b4 = VEC_LOAD_BE_NOSWAP (in, 4); b5 = VEC_LOAD_BE_NOSWAP (in, 5); GEN_TWEAK (tweak2, tweak1); tweak1 = asm_vperm1 (tweak1, bswap128_const); b6 = VEC_LOAD_BE_NOSWAP (in, 6); b7 = VEC_LOAD_BE_NOSWAP (in, 7); in += 8; b0 = VEC_BE_SWAP(b0, bige_const); b1 = VEC_BE_SWAP(b1, bige_const); GEN_TWEAK (tweak3, tweak2); tweak2 = asm_vperm1 (tweak2, bswap128_const); GEN_TWEAK (tweak4, tweak3); tweak3 = asm_vperm1 (tweak3, bswap128_const); b2 = VEC_BE_SWAP(b2, bige_const); b3 = VEC_BE_SWAP(b3, bige_const); GEN_TWEAK (tweak5, tweak4); tweak4 = asm_vperm1 (tweak4, bswap128_const); GEN_TWEAK (tweak6, tweak5); tweak5 = asm_vperm1 (tweak5, bswap128_const); b4 = VEC_BE_SWAP(b4, bige_const); b5 = VEC_BE_SWAP(b5, bige_const); GEN_TWEAK (tweak7, tweak6); tweak6 = asm_vperm1 (tweak6, bswap128_const); GEN_TWEAK (tweak, tweak7); tweak7 = asm_vperm1 (tweak7, bswap128_const); b6 = VEC_BE_SWAP(b6, bige_const); b7 = VEC_BE_SWAP(b7, bige_const); tweak0 = asm_xor (tweak0, rkey0); tweak1 = asm_xor (tweak1, rkey0); tweak2 = asm_xor (tweak2, rkey0); tweak3 = asm_xor (tweak3, rkey0); tweak4 = asm_xor (tweak4, rkey0); tweak5 = asm_xor (tweak5, rkey0); tweak6 = asm_xor (tweak6, rkey0); tweak7 = asm_xor (tweak7, rkey0); b0 = asm_xor (b0, tweak0); b1 = asm_xor (b1, tweak1); b2 = asm_xor (b2, tweak2); b3 = asm_xor (b3, tweak3); b4 = asm_xor (b4, tweak4); b5 = asm_xor (b5, tweak5); b6 = asm_xor (b6, tweak6); b7 = asm_xor (b7, tweak7); #define DO_ROUND(r) \ rkey = ALIGNED_LOAD (rk, r); \ b0 = asm_ncipher_be (b0, rkey); \ b1 = asm_ncipher_be (b1, rkey); \ b2 = asm_ncipher_be (b2, rkey); \ b3 = asm_ncipher_be (b3, rkey); \ b4 = asm_ncipher_be (b4, rkey); \ b5 = asm_ncipher_be (b5, rkey); \ b6 = asm_ncipher_be (b6, rkey); \ b7 = asm_ncipher_be (b7, rkey); DO_ROUND(1); DO_ROUND(2); DO_ROUND(3); DO_ROUND(4); DO_ROUND(5); DO_ROUND(6); DO_ROUND(7); rkeylf = asm_xor (rkeylast, rkey0); DO_ROUND(8); tweak0 = asm_xor (tweak0, rkeylf); tweak1 = asm_xor (tweak1, rkeylf); tweak2 = asm_xor (tweak2, rkeylf); tweak3 = asm_xor (tweak3, rkeylf); tweak4 = asm_xor (tweak4, rkeylf); tweak5 = asm_xor (tweak5, rkeylf); tweak6 = asm_xor (tweak6, rkeylf); tweak7 = asm_xor (tweak7, rkeylf); DO_ROUND(9); if (rounds >= 12) { DO_ROUND(10); DO_ROUND(11); if (rounds > 12) { DO_ROUND(12); DO_ROUND(13); } } #undef DO_ROUND b0 = asm_ncipherlast_be (b0, tweak0); b1 = asm_ncipherlast_be (b1, tweak1); b2 = asm_ncipherlast_be (b2, tweak2); b3 = asm_ncipherlast_be (b3, tweak3); b0 = VEC_BE_SWAP (b0, bige_const); b1 = VEC_BE_SWAP (b1, bige_const); b4 = asm_ncipherlast_be (b4, tweak4); b5 = asm_ncipherlast_be (b5, tweak5); b2 = VEC_BE_SWAP (b2, bige_const); b3 = VEC_BE_SWAP (b3, bige_const); b6 = asm_ncipherlast_be (b6, tweak6); b7 = asm_ncipherlast_be (b7, tweak7); VEC_STORE_BE_NOSWAP (out, 0, b0); VEC_STORE_BE_NOSWAP (out, 1, b1); b4 = VEC_BE_SWAP (b4, bige_const); b5 = VEC_BE_SWAP (b5, bige_const); VEC_STORE_BE_NOSWAP (out, 2, b2); VEC_STORE_BE_NOSWAP (out, 3, b3); b6 = VEC_BE_SWAP (b6, bige_const); b7 = VEC_BE_SWAP (b7, bige_const); VEC_STORE_BE_NOSWAP (out, 4, b4); VEC_STORE_BE_NOSWAP (out, 5, b5); VEC_STORE_BE_NOSWAP (out, 6, b6); VEC_STORE_BE_NOSWAP (out, 7, b7); out += 8; } if (nblocks >= 4) { tweak0 = tweak; GEN_TWEAK (tweak1, tweak0); GEN_TWEAK (tweak2, tweak1); GEN_TWEAK (tweak3, tweak2); GEN_TWEAK (tweak, tweak3); b0 = VEC_LOAD_BE (in, 0, bige_const); b1 = VEC_LOAD_BE (in, 1, bige_const); b2 = VEC_LOAD_BE (in, 2, bige_const); b3 = VEC_LOAD_BE (in, 3, bige_const); tweak0 = asm_vperm1 (tweak0, bswap128_const); tweak1 = asm_vperm1 (tweak1, bswap128_const); tweak2 = asm_vperm1 (tweak2, bswap128_const); tweak3 = asm_vperm1 (tweak3, bswap128_const); b0 ^= tweak0 ^ rkey0; b1 ^= tweak1 ^ rkey0; b2 ^= tweak2 ^ rkey0; b3 ^= tweak3 ^ rkey0; #define DO_ROUND(r) \ rkey = ALIGNED_LOAD (rk, r); \ b0 = asm_ncipher_be (b0, rkey); \ b1 = asm_ncipher_be (b1, rkey); \ b2 = asm_ncipher_be (b2, rkey); \ b3 = asm_ncipher_be (b3, rkey); DO_ROUND(1); DO_ROUND(2); DO_ROUND(3); DO_ROUND(4); DO_ROUND(5); DO_ROUND(6); DO_ROUND(7); DO_ROUND(8); DO_ROUND(9); if (rounds >= 12) { DO_ROUND(10); DO_ROUND(11); if (rounds > 12) { DO_ROUND(12); DO_ROUND(13); } } #undef DO_ROUND rkey = rkeylast; b0 = asm_ncipherlast_be (b0, rkey ^ tweak0); b1 = asm_ncipherlast_be (b1, rkey ^ tweak1); b2 = asm_ncipherlast_be (b2, rkey ^ tweak2); b3 = asm_ncipherlast_be (b3, rkey ^ tweak3); VEC_STORE_BE (out, 0, b0, bige_const); VEC_STORE_BE (out, 1, b1, bige_const); VEC_STORE_BE (out, 2, b2, bige_const); VEC_STORE_BE (out, 3, b3, bige_const); in += 4; out += 4; nblocks -= 4; } for (; nblocks; nblocks--) { tweak0 = asm_vperm1 (tweak, bswap128_const); /* Xor-Encrypt/Decrypt-Xor block. */ b = VEC_LOAD_BE (in, 0, bige_const) ^ tweak0; /* Generate next tweak. */ GEN_TWEAK (tweak, tweak); AES_DECRYPT (b, rounds); b ^= tweak0; VEC_STORE_BE (out, 0, b, bige_const); in++; out++; } } tweak = asm_vperm1 (tweak, bswap128_const); VEC_STORE_BE (tweak_arg, 0, tweak, bige_const); #undef GEN_TWEAK } void PPC_OPT_ATTR CTR32LE_ENC_FUNC(void *context, unsigned char *ctr_arg, void *outbuf_arg, const void *inbuf_arg, size_t nblocks) { #ifndef WORDS_BIGENDIAN static const vec_u32 vec_u32_one = { 1, 0, 0, 0 }; #else static const vec_u32 vec_u32_one = { 0, 0, 0, 1 }; #endif const block bige_const = asm_load_be_const(); RIJNDAEL_context *ctx = context; const u128_t *rk = (u128_t *)&ctx->keyschenc; const u128_t *in = (const u128_t *)inbuf_arg; u128_t *out = (u128_t *)outbuf_arg; int rounds = ctx->rounds; ROUND_KEY_VARIABLES; block rkeylast_orig; block b; vec_u32 ctr, one; ctr = (vec_u32)vec_reve (VEC_LOAD_BE (ctr_arg, 0, bige_const)); one = vec_u32_one; PRELOAD_ROUND_KEYS (rounds); rkeylast_orig = rkeylast; #define VEC_ADD_CTRLE32(ctrv_u32, addv_u32) \ vec_reve((block)((ctrv_u32) + (addv_u32))) if (nblocks >= 4) { block in0, in1, in2, in3, in4, in5, in6, in7; block b0, b1, b2, b3, b4, b5, b6, b7; vec_u32 two, three, four, five, six, seven, eight; block rkey; two = one + one; three = two + one; four = two + two; five = three + two; six = three + three; seven = four + three; eight = four + four; for (; nblocks >= 8; nblocks -= 8) { b1 = VEC_ADD_CTRLE32 (ctr, one); b2 = VEC_ADD_CTRLE32 (ctr, two); b3 = VEC_ADD_CTRLE32 (ctr, three); b4 = VEC_ADD_CTRLE32 (ctr, four); b5 = VEC_ADD_CTRLE32 (ctr, five); b6 = VEC_ADD_CTRLE32 (ctr, six); b7 = VEC_ADD_CTRLE32 (ctr, seven); b0 = asm_xor (rkey0, vec_reve((block)ctr)); rkey = ALIGNED_LOAD (rk, 1); ctr = ctr + eight; b1 = asm_xor (rkey0, b1); b2 = asm_xor (rkey0, b2); b3 = asm_xor (rkey0, b3); b0 = asm_cipher_be (b0, rkey); b1 = asm_cipher_be (b1, rkey); b2 = asm_cipher_be (b2, rkey); b3 = asm_cipher_be (b3, rkey); b4 = asm_xor (rkey0, b4); b5 = asm_xor (rkey0, b5); b6 = asm_xor (rkey0, b6); b7 = asm_xor (rkey0, b7); b4 = asm_cipher_be (b4, rkey); b5 = asm_cipher_be (b5, rkey); b6 = asm_cipher_be (b6, rkey); b7 = asm_cipher_be (b7, rkey); #define DO_ROUND(r) \ rkey = ALIGNED_LOAD (rk, r); \ b0 = asm_cipher_be (b0, rkey); \ b1 = asm_cipher_be (b1, rkey); \ b2 = asm_cipher_be (b2, rkey); \ b3 = asm_cipher_be (b3, rkey); \ b4 = asm_cipher_be (b4, rkey); \ b5 = asm_cipher_be (b5, rkey); \ b6 = asm_cipher_be (b6, rkey); \ b7 = asm_cipher_be (b7, rkey); in0 = VEC_LOAD_BE_NOSWAP (in, 0); DO_ROUND(2); in1 = VEC_LOAD_BE_NOSWAP (in, 1); DO_ROUND(3); in2 = VEC_LOAD_BE_NOSWAP (in, 2); DO_ROUND(4); in3 = VEC_LOAD_BE_NOSWAP (in, 3); DO_ROUND(5); in4 = VEC_LOAD_BE_NOSWAP (in, 4); DO_ROUND(6); in5 = VEC_LOAD_BE_NOSWAP (in, 5); DO_ROUND(7); in6 = VEC_LOAD_BE_NOSWAP (in, 6); DO_ROUND(8); in7 = VEC_LOAD_BE_NOSWAP (in, 7); in += 8; DO_ROUND(9); if (rounds >= 12) { DO_ROUND(10); DO_ROUND(11); if (rounds > 12) { DO_ROUND(12); DO_ROUND(13); } } #undef DO_ROUND in0 = VEC_BE_SWAP (in0, bige_const); in1 = VEC_BE_SWAP (in1, bige_const); in2 = VEC_BE_SWAP (in2, bige_const); in3 = VEC_BE_SWAP (in3, bige_const); in4 = VEC_BE_SWAP (in4, bige_const); in5 = VEC_BE_SWAP (in5, bige_const); in6 = VEC_BE_SWAP (in6, bige_const); in7 = VEC_BE_SWAP (in7, bige_const); in0 = asm_xor (rkeylast, in0); in1 = asm_xor (rkeylast, in1); in2 = asm_xor (rkeylast, in2); in3 = asm_xor (rkeylast, in3); b0 = asm_cipherlast_be (b0, in0); b1 = asm_cipherlast_be (b1, in1); in4 = asm_xor (rkeylast, in4); in5 = asm_xor (rkeylast, in5); b2 = asm_cipherlast_be (b2, in2); b3 = asm_cipherlast_be (b3, in3); in6 = asm_xor (rkeylast, in6); in7 = asm_xor (rkeylast, in7); b4 = asm_cipherlast_be (b4, in4); b5 = asm_cipherlast_be (b5, in5); b6 = asm_cipherlast_be (b6, in6); b7 = asm_cipherlast_be (b7, in7); b0 = VEC_BE_SWAP (b0, bige_const); b1 = VEC_BE_SWAP (b1, bige_const); b2 = VEC_BE_SWAP (b2, bige_const); b3 = VEC_BE_SWAP (b3, bige_const); b4 = VEC_BE_SWAP (b4, bige_const); b5 = VEC_BE_SWAP (b5, bige_const); b6 = VEC_BE_SWAP (b6, bige_const); b7 = VEC_BE_SWAP (b7, bige_const); VEC_STORE_BE_NOSWAP (out, 0, b0); VEC_STORE_BE_NOSWAP (out, 1, b1); VEC_STORE_BE_NOSWAP (out, 2, b2); VEC_STORE_BE_NOSWAP (out, 3, b3); VEC_STORE_BE_NOSWAP (out, 4, b4); VEC_STORE_BE_NOSWAP (out, 5, b5); VEC_STORE_BE_NOSWAP (out, 6, b6); VEC_STORE_BE_NOSWAP (out, 7, b7); out += 8; } if (nblocks >= 4) { b1 = VEC_ADD_CTRLE32 (ctr, one); b2 = VEC_ADD_CTRLE32 (ctr, two); b3 = VEC_ADD_CTRLE32 (ctr, three); b0 = asm_xor (rkey0, vec_reve((block)ctr)); ctr = ctr + four; b1 = asm_xor (rkey0, b1); b2 = asm_xor (rkey0, b2); b3 = asm_xor (rkey0, b3); #define DO_ROUND(r) \ rkey = ALIGNED_LOAD (rk, r); \ b0 = asm_cipher_be (b0, rkey); \ b1 = asm_cipher_be (b1, rkey); \ b2 = asm_cipher_be (b2, rkey); \ b3 = asm_cipher_be (b3, rkey); DO_ROUND(1); DO_ROUND(2); DO_ROUND(3); DO_ROUND(4); DO_ROUND(5); DO_ROUND(6); DO_ROUND(7); DO_ROUND(8); in0 = VEC_LOAD_BE (in, 0, bige_const); in1 = VEC_LOAD_BE (in, 1, bige_const); in2 = VEC_LOAD_BE (in, 2, bige_const); in3 = VEC_LOAD_BE (in, 3, bige_const); DO_ROUND(9); if (rounds >= 12) { DO_ROUND(10); DO_ROUND(11); if (rounds > 12) { DO_ROUND(12); DO_ROUND(13); } } #undef DO_ROUND in0 = asm_xor (rkeylast, in0); in1 = asm_xor (rkeylast, in1); in2 = asm_xor (rkeylast, in2); in3 = asm_xor (rkeylast, in3); b0 = asm_cipherlast_be (b0, in0); b1 = asm_cipherlast_be (b1, in1); b2 = asm_cipherlast_be (b2, in2); b3 = asm_cipherlast_be (b3, in3); VEC_STORE_BE (out, 0, b0, bige_const); VEC_STORE_BE (out, 1, b1, bige_const); VEC_STORE_BE (out, 2, b2, bige_const); VEC_STORE_BE (out, 3, b3, bige_const); in += 4; out += 4; nblocks -= 4; } } for (; nblocks; nblocks--) { b = vec_reve((block)ctr); ctr = ctr + one; rkeylast = rkeylast_orig ^ VEC_LOAD_BE (in, 0, bige_const); AES_ENCRYPT (b, rounds); VEC_STORE_BE (out, 0, b, bige_const); out++; in++; } #undef VEC_ADD_CTRLE32 VEC_STORE_BE (ctr_arg, 0, vec_reve((block)ctr), bige_const); } grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/cipher/kem-ecc.h0000644000175000017500000000405115036452441022320 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ /* kem-ecc.h - Key Encapsulation Mechanism with ECC * Copyright (C) 2024 g10 Code GmbH * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser general Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . * SPDX-License-Identifier: LGPL-2.1-or-later * */ gpg_err_code_t _gcry_ecc_raw_keypair (int algo, void *pubkey, size_t pubkey_len, void *seckey, size_t seckey_len); gpg_err_code_t _gcry_ecc_raw_encap (int algo, const void *pubkey, size_t pubkey_len, void *ciphertext, size_t ciphertext_len, void *shared, size_t shared_len); gpg_err_code_t _gcry_ecc_raw_decap (int algo, const void *seckey, size_t seckey_len, const void *ciphertext, size_t ciphertext_len, void *shared, size_t shared_len); gpg_err_code_t _gcry_ecc_dhkem_encap (int algo, const void *pubkey, void *ciphertext, void *shared); gpg_err_code_t _gcry_ecc_dhkem_decap (int algo, const void *seckey, const void *ciphertext, void *shared, const void *optional); grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/cipher/asm-common-aarch64.h0000644000175000017500000000774215036452441024322 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ /* asm-common-aarch64.h - Common macros for AArch64 assembly * * Copyright (C) 2018 Martin Storsjö * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . */ #ifndef GCRY_ASM_COMMON_AARCH64_H #define GCRY_ASM_COMMON_AARCH64_H #ifdef HAVE_GCC_ASM_ELF_DIRECTIVES # define ELF(...) __VA_ARGS__ #else # define ELF(...) /*_*/ #endif #ifdef _WIN32 # define SECTION_RODATA .section .rdata #else # define SECTION_RODATA .section .rodata #endif #ifdef __APPLE__ #define GET_DATA_POINTER(reg, name) \ adrp reg, name@GOTPAGE ; \ add reg, reg, name@GOTPAGEOFF ; #else #define GET_DATA_POINTER(reg, name) \ adrp reg, name ; \ add reg, reg, #:lo12:name ; #endif #ifdef HAVE_GCC_ASM_CFI_DIRECTIVES /* CFI directives to emit DWARF stack unwinding information. */ # define CFI_STARTPROC() .cfi_startproc # define CFI_ENDPROC() .cfi_endproc # define CFI_REMEMBER_STATE() .cfi_remember_state # define CFI_RESTORE_STATE() .cfi_restore_state # define CFI_ADJUST_CFA_OFFSET(off) .cfi_adjust_cfa_offset off # define CFI_REL_OFFSET(reg,off) .cfi_rel_offset reg, off # define CFI_DEF_CFA_REGISTER(reg) .cfi_def_cfa_register reg # define CFI_REGISTER(ro,rn) .cfi_register ro, rn # define CFI_RESTORE(reg) .cfi_restore reg /* CFA expressions are used for pointing CFA and registers to * SP relative offsets. */ # define DW_REGNO_SP 31 /* Fixed length encoding used for integers for now. */ # define DW_SLEB128_7BIT(value) \ 0x00|((value) & 0x7f) # define DW_SLEB128_28BIT(value) \ 0x80|((value)&0x7f), \ 0x80|(((value)>>7)&0x7f), \ 0x80|(((value)>>14)&0x7f), \ 0x00|(((value)>>21)&0x7f) # define CFI_CFA_ON_STACK(rsp_offs,cfa_depth) \ .cfi_escape \ 0x0f, /* DW_CFA_def_cfa_expression */ \ DW_SLEB128_7BIT(11), /* length */ \ 0x8f, /* DW_OP_breg31, rsp + constant */ \ DW_SLEB128_28BIT(rsp_offs), \ 0x06, /* DW_OP_deref */ \ 0x23, /* DW_OP_plus_constu */ \ DW_SLEB128_28BIT((cfa_depth)+8) # define CFI_REG_ON_STACK(regno,rsp_offs) \ .cfi_escape \ 0x10, /* DW_CFA_expression */ \ DW_SLEB128_7BIT(regno), \ DW_SLEB128_7BIT(5), /* length */ \ 0x8f, /* DW_OP_breg31, rsp + constant */ \ DW_SLEB128_28BIT(rsp_offs) #else # define CFI_STARTPROC() # define CFI_ENDPROC() # define CFI_REMEMBER_STATE() # define CFI_RESTORE_STATE() # define CFI_ADJUST_CFA_OFFSET(off) # define CFI_REL_OFFSET(reg,off) # define CFI_DEF_CFA_REGISTER(reg) # define CFI_REGISTER(ro,rn) # define CFI_RESTORE(reg) # define CFI_CFA_ON_STACK(rsp_offs,cfa_depth) # define CFI_REG_ON_STACK(reg,rsp_offs) #endif /* 'ret' instruction replacement for straight-line speculation mitigation */ #define ret_spec_stop \ ret; dsb sy; isb; #define CLEAR_REG(reg) movi reg.16b, #0; #define VPUSH_ABI \ stp d8, d9, [sp, #-16]!; \ CFI_ADJUST_CFA_OFFSET(16); \ stp d10, d11, [sp, #-16]!; \ CFI_ADJUST_CFA_OFFSET(16); \ stp d12, d13, [sp, #-16]!; \ CFI_ADJUST_CFA_OFFSET(16); \ stp d14, d15, [sp, #-16]!; \ CFI_ADJUST_CFA_OFFSET(16); #define VPOP_ABI \ ldp d14, d15, [sp], #16; \ CFI_ADJUST_CFA_OFFSET(-16); \ ldp d12, d13, [sp], #16; \ CFI_ADJUST_CFA_OFFSET(-16); \ ldp d10, d11, [sp], #16; \ CFI_ADJUST_CFA_OFFSET(-16); \ ldp d8, d9, [sp], #16; \ CFI_ADJUST_CFA_OFFSET(-16); #endif /* GCRY_ASM_COMMON_AARCH64_H */ grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/cipher/bithelp.h0000644000175000017500000000660315036452441022450 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ /* bithelp.h - Some bit manipulation helpers * Copyright (C) 1999, 2002 Free Software Foundation, Inc. * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . */ #ifndef GCRYPT_BITHELP_H #define GCRYPT_BITHELP_H #include "types.h" /**************** * Rotate the 32 bit unsigned integer X by N bits left/right */ static inline u32 rol(u32 x, int n) { return ( (x << (n&(32-1))) | (x >> ((32-n)&(32-1))) ); } static inline u32 ror(u32 x, int n) { return ( (x >> (n&(32-1))) | (x << ((32-n)&(32-1))) ); } static inline u64 rol64(u64 x, int n) { return ( (x << (n&(64-1))) | (x >> ((64-n)&(64-1))) ); } /* Byte swap for 32-bit and 64-bit integers. If available, use compiler provided helpers. */ #ifdef HAVE_BUILTIN_BSWAP32 # define _gcry_bswap32 __builtin_bswap32 #else static inline u32 _gcry_bswap32(u32 x) { return ((rol(x, 8) & 0x00ff00ffL) | (ror(x, 8) & 0xff00ff00L)); } #endif #ifdef HAVE_BUILTIN_BSWAP64 # define _gcry_bswap64 __builtin_bswap64 #else static inline u64 _gcry_bswap64(u64 x) { return ((u64)_gcry_bswap32(x) << 32) | (_gcry_bswap32(x >> 32)); } #endif /* Endian dependent byte swap operations. */ #ifdef WORDS_BIGENDIAN # define le_bswap32(x) _gcry_bswap32(x) # define be_bswap32(x) ((u32)(x)) # define le_bswap64(x) _gcry_bswap64(x) # define be_bswap64(x) ((u64)(x)) #else # define le_bswap32(x) ((u32)(x)) # define be_bswap32(x) _gcry_bswap32(x) # define le_bswap64(x) ((u64)(x)) # define be_bswap64(x) _gcry_bswap64(x) #endif /* Count trailing zero bits in an unsigend int. We return an int because that is what gcc's builtin does. Returns the number of bits in X if X is 0. */ static inline int _gcry_ctz (unsigned int x) { #if defined (HAVE_BUILTIN_CTZ) return x ? __builtin_ctz (x) : 8 * sizeof (x); #else /* See * http://graphics.stanford.edu/~seander/bithacks.html#ZerosOnRightModLookup */ static const unsigned char mod37[] = { sizeof (unsigned int)*8, 0, 1, 26, 2, 23, 27, 0, 3, 16, 24, 30, 28, 11, 0, 13, 4, 7, 17, 0, 25, 22, 31, 15, 29, 10, 12, 6, 0, 21, 14, 9, 5, 20, 8, 19, 18 }; return (int)mod37[(-x & x) % 37]; #endif } /* Count trailing zero bits in an u64. We return an int because that is what gcc's builtin does. Returns the number of bits in X if X is 0. */ static inline int _gcry_ctz64(u64 x) { #if defined (HAVE_BUILTIN_CTZL) && SIZEOF_UNSIGNED_LONG >= 8 return x ? __builtin_ctzl (x) : 8 * sizeof (x); #elif defined (HAVE_BUILTIN_CTZ) && SIZEOF_UNSIGNED_INT >= 8 #warning hello return x ? __builtin_ctz (x) : 8 * sizeof (x); #else if ((x & 0xffffffff)) return _gcry_ctz (x); else return 32 + _gcry_ctz (x >> 32); #endif } #endif /*GCRYPT_BITHELP_H*/ grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/cipher/sntrup761.h0000644000175000017500000000436215036452441022612 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ /* sntrup761.h - Streamlined NTRU Prime sntrup761 key-encapsulation method * Copyright (C) 2023 Simon Josefsson * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . * SPDX-License-Identifier: LGPL-2.1-or-later * * For a description of the algorithm, see: * https://ntruprime.cr.yp.to/ */ /* * Derived from public domain source, written by (in alphabetical order): * - Daniel J. Bernstein * - Chitchanok Chuengsatiansup * - Tanja Lange * - Christine van Vredendaal */ #ifndef SNTRUP761_H #define SNTRUP761_H #ifdef _GCRYPT_IN_LIBGCRYPT /**** Start of the glue code to libgcrypt ****/ #include "gcrypt-int.h" static inline void crypto_hash_sha512 (unsigned char *out, const unsigned char *in, size_t inlen) { _gcry_md_hash_buffer (GCRY_MD_SHA512, out, in, inlen); } #define sntrup761_keypair _gcry_sntrup761_keypair #define sntrup761_enc _gcry_sntrup761_enc #define sntrup761_dec _gcry_sntrup761_dec /**** End of the glue code ****/ #else #define SNTRUP761_SECRETKEY_SIZE 1763 #define SNTRUP761_PUBLICKEY_SIZE 1158 #define SNTRUP761_CIPHERTEXT_SIZE 1039 #define SNTRUP761_SIZE 32 #endif typedef void sntrup761_random_func (void *ctx, size_t length, uint8_t *dst); void sntrup761_keypair (uint8_t *pk, uint8_t *sk, void *random_ctx, sntrup761_random_func *random); void sntrup761_enc (uint8_t *c, uint8_t *k, const uint8_t *pk, void *random_ctx, sntrup761_random_func *random); void sntrup761_dec (uint8_t *k, const uint8_t *c, const uint8_t *sk); #endif /* SNTRUP761_H */ grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/cipher/asm-poly1305-amd64.h0000644000175000017500000001102515036452441023776 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ /* asm-common-amd64.h - Poly1305 macros for AMD64 assembly * * Copyright (C) 2019 Jussi Kivilinna * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . */ #ifndef GCRY_ASM_POLY1305_AMD64_H #define GCRY_ASM_POLY1305_AMD64_H #include "asm-common-amd64.h" /********************************************************************** poly1305 for stitched chacha20-poly1305 AMD64 implementations **********************************************************************/ #define POLY_RSTATE %r8 #define POLY_RSRC %r9 #define POLY_R_H0 %rbx #define POLY_R_H1 %rcx #define POLY_R_H2 %r10 #define POLY_R_H2d %r10d #define POLY_R_R0 %r11 #define POLY_R_R1_MUL5 %r12 #define POLY_R_X0_HI %r13 #define POLY_R_X0_LO %r14 #define POLY_R_X1_HI %r15 #define POLY_R_X1_LO %rsi #define POLY_S_R0 (4 * 4 + 0 * 8)(POLY_RSTATE) #define POLY_S_R1 (4 * 4 + 1 * 8)(POLY_RSTATE) #define POLY_S_H0 (4 * 4 + 2 * 8 + 0 * 8)(POLY_RSTATE) #define POLY_S_H1 (4 * 4 + 2 * 8 + 1 * 8)(POLY_RSTATE) #define POLY_S_H2d (4 * 4 + 2 * 8 + 2 * 8)(POLY_RSTATE) #define POLY1305_LOAD_STATE() \ movq POLY_S_H0, POLY_R_H0; \ movq POLY_S_H1, POLY_R_H1; \ movl POLY_S_H2d, POLY_R_H2d; \ movq POLY_S_R0, POLY_R_R0; \ movq POLY_S_R1, POLY_R_R1_MUL5; \ shrq $2, POLY_R_R1_MUL5; \ addq POLY_S_R1, POLY_R_R1_MUL5; #define POLY1305_STORE_STATE() \ movq POLY_R_H0, POLY_S_H0; \ movq POLY_R_H1, POLY_S_H1; \ movl POLY_R_H2d, POLY_S_H2d; /* a = h + m */ #define POLY1305_BLOCK_PART1(src_offset) \ addq ((src_offset) + 0 * 8)(POLY_RSRC), POLY_R_H0; \ adcq ((src_offset) + 1 * 8)(POLY_RSRC), POLY_R_H1; \ adcl $1, POLY_R_H2d; \ \ /* h = a * r (partial mod 2^130-5): */ \ \ /* h0 * r1 */ \ movq POLY_R_H0, %rax; \ mulq POLY_S_R1; \ movq %rax, POLY_R_X1_LO; \ movq %rdx, POLY_R_X1_HI; #define POLY1305_BLOCK_PART2() \ \ /* h0 * r0 */ \ movq POLY_R_H0, %rax; \ mulq POLY_R_R0; \ movq %rax, POLY_R_X0_LO; \ movq %rdx, POLY_R_X0_HI; #define POLY1305_BLOCK_PART3() \ \ /* h1 * r0 */ \ movq POLY_R_H1, %rax; \ mulq POLY_R_R0; \ addq %rax, POLY_R_X1_LO; \ adcq %rdx, POLY_R_X1_HI; \ \ /* h1 * r1 mod 2^130-5 */ \ movq POLY_R_R1_MUL5, %rax; \ mulq POLY_R_H1; #define POLY1305_BLOCK_PART4() \ movq POLY_R_H2, POLY_R_H1; \ imulq POLY_R_R1_MUL5, POLY_R_H1; /* h2 * r1 mod 2^130-5 */ \ addq %rax, POLY_R_X0_LO; \ adcq %rdx, POLY_R_X0_HI; \ imulq POLY_R_R0, POLY_R_H2; /* h2 * r0 */ \ addq POLY_R_X1_LO, POLY_R_H1; \ adcq POLY_R_X1_HI, POLY_R_H2; #define POLY1305_BLOCK_PART5() \ \ /* carry propagation */ \ movq POLY_R_H2, POLY_R_H0; \ andl $3, POLY_R_H2d; \ shrq $2, POLY_R_H0; \ leaq (POLY_R_H0, POLY_R_H0, 4), POLY_R_H0; \ addq POLY_R_X0_LO, POLY_R_H0; \ adcq POLY_R_X0_HI, POLY_R_H1; \ adcl $0, POLY_R_H2d; #ifdef TESTING_POLY1305_ASM /* for testing only, mixed C/asm poly1305.c is marginally faster (~2%). */ .align 8 .globl _gcry_poly1305_amd64_ssse3_blocks1 ELF(.type _gcry_poly1305_amd64_ssse3_blocks1,@function;) _gcry_poly1305_amd64_ssse3_blocks1: /* input: * %rdi: poly1305-state * %rsi: src * %rdx: nblks */ pushq %rbp; movq %rsp, %rbp; subq $(10 * 8), %rsp; movq %rbx, (1 * 8)(%rsp); movq %r12, (2 * 8)(%rsp); movq %r13, (3 * 8)(%rsp); movq %r14, (4 * 8)(%rsp); movq %r15, (5 * 8)(%rsp); movq %rdx, (8 * 8)(%rsp); # NBLKS movq %rdi, POLY_RSTATE; movq %rsi, POLY_RSRC; POLY1305_LOAD_STATE(); .L_poly1: POLY1305_BLOCK_PART1(0 * 16); POLY1305_BLOCK_PART2(); POLY1305_BLOCK_PART3(); POLY1305_BLOCK_PART4(); POLY1305_BLOCK_PART5(); subq $1, (8 * 8)(%rsp); # NBLKS leaq (16)(POLY_RSRC), POLY_RSRC; jnz .L_poly1; POLY1305_STORE_STATE(); movq (1 * 8)(%rsp), %rbx; movq (2 * 8)(%rsp), %r12; movq (3 * 8)(%rsp), %r13; movq (4 * 8)(%rsp), %r14; movq (5 * 8)(%rsp), %r15; xorl %eax, %eax; leave ret; #endif #endif /* GCRY_ASM_POLY1305_AMD64_H */ grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/cipher/keccak_permute_64.h0000644000175000017500000002354415036452441024317 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ /* keccak_permute_64.h - Keccak permute function (simple 64bit) * Copyright (C) 2015 Jussi Kivilinna * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . */ /* The code is based on public-domain/CC0 "keccakc1024/simple/Keccak-simple.c" * implementation by Ronny Van Keer from SUPERCOP toolkit package. */ /* Function that computes the Keccak-f[1600] permutation on the given state. */ static unsigned int KECCAK_F1600_PERMUTE_FUNC_NAME(KECCAK_STATE *hd) { const u64 *round_consts = _gcry_keccak_round_consts_64bit; const u64 *round_consts_end = _gcry_keccak_round_consts_64bit + 24; u64 Aba, Abe, Abi, Abo, Abu; u64 Aga, Age, Agi, Ago, Agu; u64 Aka, Ake, Aki, Ako, Aku; u64 Ama, Ame, Ami, Amo, Amu; u64 Asa, Ase, Asi, Aso, Asu; u64 BCa, BCe, BCi, BCo, BCu; u64 Da, De, Di, Do, Du; u64 Eba, Ebe, Ebi, Ebo, Ebu; u64 Ega, Ege, Egi, Ego, Egu; u64 Eka, Eke, Eki, Eko, Eku; u64 Ema, Eme, Emi, Emo, Emu; u64 Esa, Ese, Esi, Eso, Esu; u64 *state = hd->u.state64; Aba = state[0]; Abe = state[1]; Abi = state[2]; Abo = state[3]; Abu = state[4]; Aga = state[5]; Age = state[6]; Agi = state[7]; Ago = state[8]; Agu = state[9]; Aka = state[10]; Ake = state[11]; Aki = state[12]; Ako = state[13]; Aku = state[14]; Ama = state[15]; Ame = state[16]; Ami = state[17]; Amo = state[18]; Amu = state[19]; Asa = state[20]; Ase = state[21]; Asi = state[22]; Aso = state[23]; Asu = state[24]; do { /* prepareTheta */ BCa = Aba ^ Aga ^ Aka ^ Ama ^ Asa; BCe = Abe ^ Age ^ Ake ^ Ame ^ Ase; BCi = Abi ^ Agi ^ Aki ^ Ami ^ Asi; BCo = Abo ^ Ago ^ Ako ^ Amo ^ Aso; BCu = Abu ^ Agu ^ Aku ^ Amu ^ Asu; /* thetaRhoPiChiIotaPrepareTheta(round , A, E) */ Da = BCu ^ ROL64(BCe, 1); De = BCa ^ ROL64(BCi, 1); Di = BCe ^ ROL64(BCo, 1); Do = BCi ^ ROL64(BCu, 1); Du = BCo ^ ROL64(BCa, 1); Aba ^= Da; BCa = Aba; Age ^= De; BCe = ROL64(Age, 44); Aki ^= Di; BCi = ROL64(Aki, 43); Amo ^= Do; BCo = ROL64(Amo, 21); Asu ^= Du; BCu = ROL64(Asu, 14); Eba = BCa ^ ANDN64(BCe, BCi); Eba ^= *(round_consts++); Ebe = BCe ^ ANDN64(BCi, BCo); Ebi = BCi ^ ANDN64(BCo, BCu); Ebo = BCo ^ ANDN64(BCu, BCa); Ebu = BCu ^ ANDN64(BCa, BCe); Abo ^= Do; BCa = ROL64(Abo, 28); Agu ^= Du; BCe = ROL64(Agu, 20); Aka ^= Da; BCi = ROL64(Aka, 3); Ame ^= De; BCo = ROL64(Ame, 45); Asi ^= Di; BCu = ROL64(Asi, 61); Ega = BCa ^ ANDN64(BCe, BCi); Ege = BCe ^ ANDN64(BCi, BCo); Egi = BCi ^ ANDN64(BCo, BCu); Ego = BCo ^ ANDN64(BCu, BCa); Egu = BCu ^ ANDN64(BCa, BCe); Abe ^= De; BCa = ROL64(Abe, 1); Agi ^= Di; BCe = ROL64(Agi, 6); Ako ^= Do; BCi = ROL64(Ako, 25); Amu ^= Du; BCo = ROL64(Amu, 8); Asa ^= Da; BCu = ROL64(Asa, 18); Eka = BCa ^ ANDN64(BCe, BCi); Eke = BCe ^ ANDN64(BCi, BCo); Eki = BCi ^ ANDN64(BCo, BCu); Eko = BCo ^ ANDN64(BCu, BCa); Eku = BCu ^ ANDN64(BCa, BCe); Abu ^= Du; BCa = ROL64(Abu, 27); Aga ^= Da; BCe = ROL64(Aga, 36); Ake ^= De; BCi = ROL64(Ake, 10); Ami ^= Di; BCo = ROL64(Ami, 15); Aso ^= Do; BCu = ROL64(Aso, 56); Ema = BCa ^ ANDN64(BCe, BCi); Eme = BCe ^ ANDN64(BCi, BCo); Emi = BCi ^ ANDN64(BCo, BCu); Emo = BCo ^ ANDN64(BCu, BCa); Emu = BCu ^ ANDN64(BCa, BCe); Abi ^= Di; BCa = ROL64(Abi, 62); Ago ^= Do; BCe = ROL64(Ago, 55); Aku ^= Du; BCi = ROL64(Aku, 39); Ama ^= Da; BCo = ROL64(Ama, 41); Ase ^= De; BCu = ROL64(Ase, 2); Esa = BCa ^ ANDN64(BCe, BCi); Ese = BCe ^ ANDN64(BCi, BCo); Esi = BCi ^ ANDN64(BCo, BCu); Eso = BCo ^ ANDN64(BCu, BCa); Esu = BCu ^ ANDN64(BCa, BCe); /* prepareTheta */ BCa = Eba ^ Ega ^ Eka ^ Ema ^ Esa; BCe = Ebe ^ Ege ^ Eke ^ Eme ^ Ese; BCi = Ebi ^ Egi ^ Eki ^ Emi ^ Esi; BCo = Ebo ^ Ego ^ Eko ^ Emo ^ Eso; BCu = Ebu ^ Egu ^ Eku ^ Emu ^ Esu; /* thetaRhoPiChiIotaPrepareTheta(round+1, E, A) */ Da = BCu ^ ROL64(BCe, 1); De = BCa ^ ROL64(BCi, 1); Di = BCe ^ ROL64(BCo, 1); Do = BCi ^ ROL64(BCu, 1); Du = BCo ^ ROL64(BCa, 1); Eba ^= Da; BCa = Eba; Ege ^= De; BCe = ROL64(Ege, 44); Eki ^= Di; BCi = ROL64(Eki, 43); Emo ^= Do; BCo = ROL64(Emo, 21); Esu ^= Du; BCu = ROL64(Esu, 14); Aba = BCa ^ ANDN64(BCe, BCi); Aba ^= *(round_consts++); Abe = BCe ^ ANDN64(BCi, BCo); Abi = BCi ^ ANDN64(BCo, BCu); Abo = BCo ^ ANDN64(BCu, BCa); Abu = BCu ^ ANDN64(BCa, BCe); Ebo ^= Do; BCa = ROL64(Ebo, 28); Egu ^= Du; BCe = ROL64(Egu, 20); Eka ^= Da; BCi = ROL64(Eka, 3); Eme ^= De; BCo = ROL64(Eme, 45); Esi ^= Di; BCu = ROL64(Esi, 61); Aga = BCa ^ ANDN64(BCe, BCi); Age = BCe ^ ANDN64(BCi, BCo); Agi = BCi ^ ANDN64(BCo, BCu); Ago = BCo ^ ANDN64(BCu, BCa); Agu = BCu ^ ANDN64(BCa, BCe); Ebe ^= De; BCa = ROL64(Ebe, 1); Egi ^= Di; BCe = ROL64(Egi, 6); Eko ^= Do; BCi = ROL64(Eko, 25); Emu ^= Du; BCo = ROL64(Emu, 8); Esa ^= Da; BCu = ROL64(Esa, 18); Aka = BCa ^ ANDN64(BCe, BCi); Ake = BCe ^ ANDN64(BCi, BCo); Aki = BCi ^ ANDN64(BCo, BCu); Ako = BCo ^ ANDN64(BCu, BCa); Aku = BCu ^ ANDN64(BCa, BCe); Ebu ^= Du; BCa = ROL64(Ebu, 27); Ega ^= Da; BCe = ROL64(Ega, 36); Eke ^= De; BCi = ROL64(Eke, 10); Emi ^= Di; BCo = ROL64(Emi, 15); Eso ^= Do; BCu = ROL64(Eso, 56); Ama = BCa ^ ANDN64(BCe, BCi); Ame = BCe ^ ANDN64(BCi, BCo); Ami = BCi ^ ANDN64(BCo, BCu); Amo = BCo ^ ANDN64(BCu, BCa); Amu = BCu ^ ANDN64(BCa, BCe); Ebi ^= Di; BCa = ROL64(Ebi, 62); Ego ^= Do; BCe = ROL64(Ego, 55); Eku ^= Du; BCi = ROL64(Eku, 39); Ema ^= Da; BCo = ROL64(Ema, 41); Ese ^= De; BCu = ROL64(Ese, 2); Asa = BCa ^ ANDN64(BCe, BCi); Ase = BCe ^ ANDN64(BCi, BCo); Asi = BCi ^ ANDN64(BCo, BCu); Aso = BCo ^ ANDN64(BCu, BCa); Asu = BCu ^ ANDN64(BCa, BCe); } while (round_consts < round_consts_end); state[0] = Aba; state[1] = Abe; state[2] = Abi; state[3] = Abo; state[4] = Abu; state[5] = Aga; state[6] = Age; state[7] = Agi; state[8] = Ago; state[9] = Agu; state[10] = Aka; state[11] = Ake; state[12] = Aki; state[13] = Ako; state[14] = Aku; state[15] = Ama; state[16] = Ame; state[17] = Ami; state[18] = Amo; state[19] = Amu; state[20] = Asa; state[21] = Ase; state[22] = Asi; state[23] = Aso; state[24] = Asu; return sizeof(void *) * 4 + sizeof(u64) * 12 * 5; } static unsigned int KECCAK_F1600_ABSORB_FUNC_NAME(KECCAK_STATE *hd, int pos, const byte *lanes, size_t nlanes, int blocklanes) { unsigned int burn = 0; while (nlanes) { switch (blocklanes) { case 21: /* SHAKE128 */ while (pos == 0 && nlanes >= 21) { nlanes -= 21; absorb_lanes64_8(&hd->u.state64[0], lanes); lanes += 8 * 8; absorb_lanes64_8(&hd->u.state64[8], lanes); lanes += 8 * 8; absorb_lanes64_4(&hd->u.state64[16], lanes); lanes += 8 * 4; absorb_lanes64_1(&hd->u.state64[20], lanes); lanes += 8 * 1; burn = KECCAK_F1600_PERMUTE_FUNC_NAME(hd); } break; case 18: /* SHA3-224 */ while (pos == 0 && nlanes >= 18) { nlanes -= 18; absorb_lanes64_8(&hd->u.state64[0], lanes); lanes += 8 * 8; absorb_lanes64_8(&hd->u.state64[8], lanes); lanes += 8 * 8; absorb_lanes64_2(&hd->u.state64[16], lanes); lanes += 8 * 2; burn = KECCAK_F1600_PERMUTE_FUNC_NAME(hd); } break; case 17: /* SHA3-256 & SHAKE256 */ while (pos == 0 && nlanes >= 17) { nlanes -= 17; absorb_lanes64_8(&hd->u.state64[0], lanes); lanes += 8 * 8; absorb_lanes64_8(&hd->u.state64[8], lanes); lanes += 8 * 8; absorb_lanes64_1(&hd->u.state64[16], lanes); lanes += 8 * 1; burn = KECCAK_F1600_PERMUTE_FUNC_NAME(hd); } break; case 13: /* SHA3-384 */ while (pos == 0 && nlanes >= 13) { nlanes -= 13; absorb_lanes64_8(&hd->u.state64[0], lanes); lanes += 8 * 8; absorb_lanes64_4(&hd->u.state64[8], lanes); lanes += 8 * 4; absorb_lanes64_1(&hd->u.state64[12], lanes); lanes += 8 * 1; burn = KECCAK_F1600_PERMUTE_FUNC_NAME(hd); } break; case 9: /* SHA3-512 */ while (pos == 0 && nlanes >= 9) { nlanes -= 9; absorb_lanes64_8(&hd->u.state64[0], lanes); lanes += 8 * 8; absorb_lanes64_1(&hd->u.state64[8], lanes); lanes += 8 * 1; burn = KECCAK_F1600_PERMUTE_FUNC_NAME(hd); } break; } while (nlanes) { hd->u.state64[pos] ^= buf_get_le64(lanes); lanes += 8; nlanes--; if (++pos == blocklanes) { burn = KECCAK_F1600_PERMUTE_FUNC_NAME(hd); pos = 0; break; } } } return burn; } grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/cipher/asm-common-i386.h0000644000175000017500000001175215036452441023557 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ /* asm-common-i386.h - Common macros for i386 assembly * * Copyright (C) 2023 Jussi Kivilinna * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . */ #ifndef GCRY_ASM_COMMON_I386_H #define GCRY_ASM_COMMON_I386_H #ifdef HAVE_COMPATIBLE_GCC_I386_PLATFORM_AS # define ELF(...) __VA_ARGS__ #else # define ELF(...) /*_*/ #endif #ifdef HAVE_COMPATIBLE_GCC_WIN32_PLATFORM_AS # define SECTION_RODATA .section .rdata #else # define SECTION_RODATA .section .rodata #endif #ifdef HAVE_COMPATIBLE_GCC_WIN32_PLATFORM_AS # define SYM_NAME(name) _##name #else # define SYM_NAME(name) name #endif #ifdef HAVE_COMPATIBLE_GCC_WIN32_PLATFORM_AS # define DECL_GET_PC_THUNK(reg) # define GET_DATA_POINTER(name, reg) leal name, %reg #else # define DECL_GET_PC_THUNK(reg) \ .type __gcry_get_pc_thunk_##reg, @function; \ .align 16; \ __gcry_get_pc_thunk_##reg:; \ CFI_STARTPROC(); \ movl (%esp), %reg; \ ret_spec_stop; \ CFI_ENDPROC() # define GET_DATA_POINTER(name, reg) \ call __gcry_get_pc_thunk_##reg; \ addl $_GLOBAL_OFFSET_TABLE_, %reg; \ movl name##@GOT(%reg), %reg; #endif #ifdef HAVE_GCC_ASM_CFI_DIRECTIVES /* CFI directives to emit DWARF stack unwinding information. */ # define CFI_STARTPROC() .cfi_startproc # define CFI_ENDPROC() .cfi_endproc # define CFI_REMEMBER_STATE() .cfi_remember_state # define CFI_RESTORE_STATE() .cfi_restore_state # define CFI_ADJUST_CFA_OFFSET(off) .cfi_adjust_cfa_offset off # define CFI_REL_OFFSET(reg,off) .cfi_rel_offset reg, off # define CFI_DEF_CFA_REGISTER(reg) .cfi_def_cfa_register reg # define CFI_REGISTER(ro,rn) .cfi_register ro, rn # define CFI_RESTORE(reg) .cfi_restore reg # define CFI_PUSH(reg) \ CFI_ADJUST_CFA_OFFSET(4); CFI_REL_OFFSET(reg, 0) # define CFI_POP(reg) \ CFI_ADJUST_CFA_OFFSET(-4); CFI_RESTORE(reg) # define CFI_POP_TMP_REG() \ CFI_ADJUST_CFA_OFFSET(-4); # define CFI_LEAVE() \ CFI_ADJUST_CFA_OFFSET(-4); CFI_DEF_CFA_REGISTER(%esp) /* CFA expressions are used for pointing CFA and registers to * %rsp relative offsets. */ # define DW_REGNO_eax 0 # define DW_REGNO_edx 1 # define DW_REGNO_ecx 2 # define DW_REGNO_ebx 3 # define DW_REGNO_esi 4 # define DW_REGNO_edi 5 # define DW_REGNO_ebp 6 # define DW_REGNO_esp 7 # define DW_REGNO(reg) DW_REGNO_ ## reg /* Fixed length encoding used for integers for now. */ # define DW_SLEB128_7BIT(value) \ 0x00|((value) & 0x7f) # define DW_SLEB128_28BIT(value) \ 0x80|((value)&0x7f), \ 0x80|(((value)>>7)&0x7f), \ 0x80|(((value)>>14)&0x7f), \ 0x00|(((value)>>21)&0x7f) # define CFI_CFA_ON_STACK(esp_offs,cfa_depth) \ .cfi_escape \ 0x0f, /* DW_CFA_def_cfa_expression */ \ DW_SLEB128_7BIT(11), /* length */ \ 0x77, /* DW_OP_breg7, rsp + constant */ \ DW_SLEB128_28BIT(esp_offs), \ 0x06, /* DW_OP_deref */ \ 0x23, /* DW_OP_plus_constu */ \ DW_SLEB128_28BIT((cfa_depth)+4) # define CFI_REG_ON_STACK(reg,esp_offs) \ .cfi_escape \ 0x10, /* DW_CFA_expression */ \ DW_SLEB128_7BIT(DW_REGNO(reg)), \ DW_SLEB128_7BIT(5), /* length */ \ 0x77, /* DW_OP_breg7, rsp + constant */ \ DW_SLEB128_28BIT(esp_offs) #else # define CFI_STARTPROC() # define CFI_ENDPROC() # define CFI_REMEMBER_STATE() # define CFI_RESTORE_STATE() # define CFI_ADJUST_CFA_OFFSET(off) # define CFI_REL_OFFSET(reg,off) # define CFI_DEF_CFA_REGISTER(reg) # define CFI_REGISTER(ro,rn) # define CFI_RESTORE(reg) # define CFI_PUSH(reg) # define CFI_POP(reg) # define CFI_POP_TMP_REG() # define CFI_LEAVE() # define CFI_CFA_ON_STACK(rsp_offs,cfa_depth) # define CFI_REG_ON_STACK(reg,rsp_offs) #endif /* 'ret' instruction replacement for straight-line speculation mitigation. */ #define ret_spec_stop \ ret; int3; /* This prevents speculative execution on old AVX512 CPUs, to prevent * speculative execution to AVX512 code. The vpopcntb instruction is * available on newer CPUs that do not suffer from significant frequency * drop when 512-bit vectors are utilized. */ #define spec_stop_avx512 \ vpxord %ymm7, %ymm7, %ymm7; \ vpopcntb %xmm7, %xmm7; /* Supported only by newer AVX512 CPUs. */ \ vpxord %ymm7, %ymm7, %ymm7; #define spec_stop_avx512_intel_syntax \ vpxord ymm7, ymm7, ymm7; \ vpopcntb xmm7, xmm7; /* Supported only by newer AVX512 CPUs. */ \ vpxord ymm7, ymm7, ymm7; #endif /* GCRY_ASM_COMMON_AMD64_H */ grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/cipher/cipher.h0000644000175000017500000000006215036452441022264 00000000000000#include #include grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/cipher/dsa-common.c0000644000175000017500000001501115036452441023042 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ /* dsa-common.c - Common code for DSA * Copyright (C) 1998, 1999 Free Software Foundation, Inc. * Copyright (C) 2013 g10 Code GmbH * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . */ #include "g10lib.h" #include "mpi.h" #include "cipher.h" #include "pubkey-internal.h" /* * Modify K, so that computation time difference can be small, * by making K large enough. * * Originally, (EC)DSA computation requires k where 0 < k < q. Here, * we add q (the order), to keep k in a range: q < k < 2*q (or, * addming more q, to keep k in a range: 2*q < k < 3*q), so that * timing difference of the EC multiply (or exponentiation) operation * can be small. The result of (EC)DSA computation is same. */ void _gcry_dsa_modify_k (gcry_mpi_t k, gcry_mpi_t q, int qbits) { gcry_mpi_t k1 = mpi_new (qbits+2); mpi_resize (k, (qbits+2+BITS_PER_MPI_LIMB-1) / BITS_PER_MPI_LIMB); k->nlimbs = k->alloced; mpi_add (k, k, q); mpi_add (k1, k, q); mpi_set_cond (k, k1, !mpi_test_bit (k, qbits)); mpi_free (k1); } /* * Generate a random secret exponent K less than Q. * Note that ECDSA uses this code also to generate D. */ gcry_mpi_t _gcry_dsa_gen_k (gcry_mpi_t q, int security_level) { gcry_mpi_t k = mpi_alloc_secure (mpi_get_nlimbs (q)); unsigned int nbits = mpi_get_nbits (q); unsigned int nbytes = (nbits+7)/8; char *rndbuf = NULL; /* To learn why we don't use mpi_mod to get the requested bit size, read the paper: "The Insecurity of the Digital Signature Algorithm with Partially Known Nonces" by Nguyen and Shparlinski. Journal of Cryptology, New York. Vol 15, nr 3 (2003) */ if (DBG_CIPHER) log_debug ("choosing a random k of %u bits at seclevel %d\n", nbits, security_level); for (;;) { if ( !rndbuf || nbits < 32 ) { xfree (rndbuf); rndbuf = _gcry_random_bytes_secure (nbytes, security_level); } else { /* Change only some of the higher bits. We could improve this by directly requesting more memory at the first call to get_random_bytes() and use these extra bytes here. However the required management code is more complex and thus we better use this simple method. */ char *pp = _gcry_random_bytes_secure (4, security_level); memcpy (rndbuf, pp, 4); xfree (pp); } _gcry_mpi_set_buffer (k, rndbuf, nbytes, 0); /* Make sure we have the requested number of bits. This code looks a bit funny but it is easy to understand if you consider that mpi_set_highbit clears all higher bits. We don't have a clear_highbit, thus we first set the high bit and then clear it again. */ if (mpi_test_bit (k, nbits-1)) mpi_set_highbit (k, nbits-1); else { mpi_set_highbit (k, nbits-1); mpi_clear_bit (k, nbits-1); } if (!(mpi_cmp (k, q) < 0)) /* check: k < q */ { if (DBG_CIPHER) log_debug ("\tk too large - again\n"); continue; /* no */ } if (!(mpi_cmp_ui (k, 0) > 0)) /* check: k > 0 */ { if (DBG_CIPHER) log_debug ("\tk is zero - again\n"); continue; /* no */ } break; /* okay */ } xfree (rndbuf); return k; } /* Turn VALUE into an octet string and store it in an allocated buffer at R_FRAME. If the resulting octet string is shorter than NBYTES the result will be left padded with zeroes. If VALUE does not fit into NBYTES an error code is returned. */ /* Connert the bit string BITS of length NBITS into an octet string with a length of (QBITS+7)/8 bytes. On success store the result at R_FRAME. */ /* * Generate a deterministic secret exponent K less than DSA_Q. H1 is * the to be signed digest with a length of HLEN bytes. HALGO is the * algorithm used to create the hash. On success the value for K is * stored at R_K. */ /* * For DSA/ECDSA, as prehash function, compute hash with HASHALGO for * INPUT. Result hash value is returned in R_HASH as an opaque MPI. * Returns error code. */ gpg_err_code_t _gcry_dsa_compute_hash (gcry_mpi_t *r_hash, gcry_mpi_t input, int hashalgo) { gpg_err_code_t rc = 0; size_t hlen; void *hashbuf; void *abuf; unsigned int abits; unsigned int n; hlen = _gcry_md_get_algo_dlen (hashalgo); hashbuf = xtrymalloc (hlen); if (!hashbuf) { rc = gpg_err_code_from_syserror (); return rc; } if (mpi_is_opaque (input)) { abuf = mpi_get_opaque (input, &abits); n = (abits+7)/8; _gcry_md_hash_buffer (hashalgo, hashbuf, abuf, n); } else { abits = mpi_get_nbits (input); n = (abits+7)/8; abuf = xtrymalloc (n); if (!abuf) { rc = gpg_err_code_from_syserror (); xfree (hashbuf); return rc; } _gcry_mpi_to_octet_string (NULL, abuf, input, n); _gcry_md_hash_buffer (hashalgo, hashbuf, abuf, n); xfree (abuf); } *r_hash = mpi_set_opaque (NULL, hashbuf, hlen*8); if (!*r_hash) rc = GPG_ERR_INV_OBJ; return rc; } /* * Truncate opaque hash value to qbits for DSA. * Non-opaque input is not truncated, in hope that user * knows what is passed. It is not possible to correctly * trucate non-opaque inputs. */ gpg_err_code_t _gcry_dsa_normalize_hash (gcry_mpi_t input, gcry_mpi_t *out, unsigned int qbits) { gpg_err_code_t rc = 0; const void *abuf; unsigned int abits; gcry_mpi_t hash; if (mpi_is_opaque (input)) { abuf = mpi_get_opaque (input, &abits); rc = _gcry_mpi_scan (&hash, GCRYMPI_FMT_USG, abuf, (abits+7)/8, NULL); if (rc) return rc; if (abits > qbits) mpi_rshift (hash, hash, abits - qbits); } else hash = input; *out = hash; return rc; } grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/cipher/sha1.h0000644000175000017500000000314515036452441021653 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ /* sha1.h - SHA-1 context definition * Copyright (C) 1998, 2001, 2002, 2003, 2008 Free Software Foundation, Inc. * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . */ #ifndef GCRY_SHA1_H #define GCRY_SHA1_H #include "hash-common.h" /* SHA1_USE_S390X_CRYPTO indicates whether to enable zSeries code. */ #undef SHA1_USE_S390X_CRYPTO #if defined(HAVE_GCC_INLINE_ASM_S390X) # define SHA1_USE_S390X_CRYPTO 1 #endif /* SHA1_USE_S390X_CRYPTO */ /* We need this here for direct use by random-csprng.c. */ typedef struct { gcry_md_block_ctx_t bctx; u32 h0,h1,h2,h3,h4; #ifdef SHA1_USE_S390X_CRYPTO u32 final_len_msb, final_len_lsb; /* needs to be right after h4. */ int use_s390x_crypto; #endif } SHA1_CONTEXT; void _gcry_sha1_mixblock_init (SHA1_CONTEXT *hd); unsigned int _gcry_sha1_mixblock (SHA1_CONTEXT *hd, void *blockof64byte); #endif /*GCRY_SHA1_H*/ grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/cipher/asm-poly1305-s390x.h0000644000175000017500000001054015036452441023752 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ /* asm-common-amd64.h - Poly1305 macros for zSeries assembly * * Copyright (C) 2020 Jussi Kivilinna * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . */ #ifndef GCRY_ASM_POLY1305_S390X_H #define GCRY_ASM_POLY1305_S390X_H #include "asm-common-s390x.h" /********************************************************************** poly1305 for stitched chacha20-poly1305 **********************************************************************/ #define POLY_RSTATE %r1 #define POLY_RSRC %r14 #define POLY_R_H0_TMP_HI %r6 // even- #define POLY_R_H0 %r7 // odd pair #define POLY_R_H1_TMP_HI %r8 // even- #define POLY_R_H1 %r9 // odd pair #define POLY_R_H2 %r10 #define POLY_R_R0 %r11 #define POLY_R_R1 %r12 #define POLY_R_R1_MUL5 %r13 #define POLY_R_X0_HI %r2 // even- #define POLY_R_X0_LO %r3 // odd pair #define POLY_R_X1_HI %r4 // even- #define POLY_R_X1_LO %r5 // odd pair #define POLY_S_R0 (4 * 4 + 0 * 8)(POLY_RSTATE) #define POLY_S_R1 (4 * 4 + 1 * 8)(POLY_RSTATE) #define POLY_S_H0 (4 * 4 + 2 * 8 + 0 * 8)(POLY_RSTATE) #define POLY_S_H1 (4 * 4 + 2 * 8 + 1 * 8)(POLY_RSTATE) #define POLY_S_H2d (4 * 4 + 2 * 8 + 2 * 8)(POLY_RSTATE) #define INC_POLY1305_SRC(a) \ aghi POLY_RSRC, (a); #define POLY1305_LOAD_STATE() \ lg POLY_R_H0, POLY_S_H0; \ lg POLY_R_H1, POLY_S_H1; \ llgf POLY_R_H2, POLY_S_H2d; \ rllg POLY_R_H0, POLY_R_H0, 32; \ rllg POLY_R_H1, POLY_R_H1, 32; \ lg POLY_R_R0, POLY_S_R0; \ lg POLY_R_R1, POLY_S_R1; \ rllg POLY_R_R0, POLY_R_R0, 32; \ rllg POLY_R_R1, POLY_R_R1, 32; \ srlg POLY_R_R1_MUL5, POLY_R_R1, 2; \ algr POLY_R_R1_MUL5, POLY_R_R1; #define POLY1305_STORE_STATE() \ rllg POLY_R_H0, POLY_R_H0, 32; \ rllg POLY_R_H1, POLY_R_H1, 32; \ stg POLY_R_H0, POLY_S_H0; \ stg POLY_R_H1, POLY_S_H1; \ st POLY_R_H2, POLY_S_H2d; /* a = h + m */ #define POLY1305_BLOCK_PART1_HB(src_offset, high_pad) \ lrvg POLY_R_X0_HI, ((src_offset) + 1 * 8)(POLY_RSRC); \ lrvg POLY_R_X0_LO, ((src_offset) + 0 * 8)(POLY_RSRC); \ lghi POLY_R_H1_TMP_HI, (high_pad); #define POLY1305_BLOCK_PART1(src_offset) \ POLY1305_BLOCK_PART1_HB(src_offset, 1); #define POLY1305_BLOCK_PART2() \ algr POLY_R_H0, POLY_R_X0_LO; \ alcgr POLY_R_H1, POLY_R_X0_HI; \ alcgr POLY_R_H2, POLY_R_H1_TMP_HI; \ lgr POLY_R_X1_LO, POLY_R_H0; \ lgr POLY_R_X0_LO, POLY_R_H0; #define POLY1305_BLOCK_PART3() \ /* h = a * r (partial mod 2^130-5): */ \ \ /* h0 * r1 */ \ mlgr POLY_R_X1_HI, POLY_R_R1; \ \ /* h1 * r0 */ \ lgr POLY_R_H0, POLY_R_H1; \ mlgr POLY_R_H0_TMP_HI, POLY_R_R0; \ \ /* h1 * r1 mod 2^130-5 */ \ mlgr POLY_R_H1_TMP_HI, POLY_R_R1_MUL5; #define POLY1305_BLOCK_PART4() \ \ /* h0 * r0 */ \ mlgr POLY_R_X0_HI, POLY_R_R0; \ \ algr POLY_R_X1_LO, POLY_R_H0; \ alcgr POLY_R_X1_HI, POLY_R_H0_TMP_HI; \ \ lgr POLY_R_H0_TMP_HI, POLY_R_H2; \ msgr POLY_R_H0_TMP_HI, POLY_R_R1_MUL5; /* h2 * r1 mod 2^130-5 */ \ msgr POLY_R_H2, POLY_R_R0; /* h2 * r0 */ #define POLY1305_BLOCK_PART5() \ \ algr POLY_R_X0_LO, POLY_R_H1; \ alcgr POLY_R_X0_HI, POLY_R_H1_TMP_HI; #define POLY1305_BLOCK_PART6() \ \ algrk POLY_R_H1, POLY_R_H0_TMP_HI, POLY_R_X1_LO; \ alcgr POLY_R_H2, POLY_R_X1_HI; #define POLY1305_BLOCK_PART7() \ \ /* carry propagation */ \ srlg POLY_R_H0, POLY_R_H2, 2; \ risbgn POLY_R_X1_LO, POLY_R_H2, 0, 0x80 | 61, 0; \ lghi POLY_R_H1_TMP_HI, 0; \ agr POLY_R_H0, POLY_R_X1_LO; \ risbgn POLY_R_H2, POLY_R_H2, 62, 0x80 | 63, 0; #define POLY1305_BLOCK_PART8() \ algr POLY_R_H0, POLY_R_X0_LO; \ alcgr POLY_R_H1, POLY_R_X0_HI; \ alcgr POLY_R_H2, POLY_R_H1_TMP_HI; #endif /* GCRY_ASM_POLY1305_AMD64_H */ grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/cipher/rfc2268.c0000644000175000017500000002210115036452441022077 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ #include GRUB_MOD_LICENSE ("GPLv3+"); /* rfc2268.c - The cipher described in rfc2268; aka Ron's Cipher 2. * Copyright (C) 2003 Nikos Mavroyanopoulos * Copyright (C) 2004 Free Software Foundation, Inc. * * This file is part of Libgcrypt * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . * SPDX-License-Identifier: LGPL-2.1-or-later */ /* This implementation was written by Nikos Mavroyanopoulos for GNUTLS * as a Libgcrypt module (gnutls/lib/x509/rc2.c) and later adapted for * direct use by Libgcrypt by Werner Koch. This implementation is * only useful for pkcs#12 decryption. * * The implementation here is based on Peter Gutmann's RRC.2 paper. */ #include "g10lib.h" #include "types.h" #include "cipher.h" #include "cipher-internal.h" #define RFC2268_BLOCKSIZE 8 typedef struct { u16 S[64]; } RFC2268_context; static const unsigned char rfc2268_sbox[] = { 217, 120, 249, 196, 25, 221, 181, 237, 40, 233, 253, 121, 74, 160, 216, 157, 198, 126, 55, 131, 43, 118, 83, 142, 98, 76, 100, 136, 68, 139, 251, 162, 23, 154, 89, 245, 135, 179, 79, 19, 97, 69, 109, 141, 9, 129, 125, 50, 189, 143, 64, 235, 134, 183, 123, 11, 240, 149, 33, 34, 92, 107, 78, 130, 84, 214, 101, 147, 206, 96, 178, 28, 115, 86, 192, 20, 167, 140, 241, 220, 18, 117, 202, 31, 59, 190, 228, 209, 66, 61, 212, 48, 163, 60, 182, 38, 111, 191, 14, 218, 70, 105, 7, 87, 39, 242, 29, 155, 188, 148, 67, 3, 248, 17, 199, 246, 144, 239, 62, 231, 6, 195, 213, 47, 200, 102, 30, 215, 8, 232, 234, 222, 128, 82, 238, 247, 132, 170, 114, 172, 53, 77, 106, 42, 150, 26, 210, 113, 90, 21, 73, 116, 75, 159, 208, 94, 4, 24, 164, 236, 194, 224, 65, 110, 15, 81, 203, 204, 36, 145, 175, 80, 161, 244, 112, 57, 153, 124, 58, 133, 35, 184, 180, 122, 252, 2, 54, 91, 37, 85, 151, 49, 45, 93, 250, 152, 227, 138, 146, 174, 5, 223, 41, 16, 103, 108, 186, 201, 211, 0, 230, 207, 225, 158, 168, 44, 99, 22, 1, 63, 88, 226, 137, 169, 13, 56, 52, 27, 171, 51, 255, 176, 187, 72, 12, 95, 185, 177, 205, 46, 197, 243, 219, 71, 229, 165, 156, 119, 10, 166, 32, 104, 254, 127, 193, 173 }; #define rotl16(x,n) (((x) << ((u16)(n))) | ((x) >> (16 - (u16)(n)))) #define rotr16(x,n) (((x) >> ((u16)(n))) | ((x) << (16 - (u16)(n)))) static void do_encrypt (void *context, unsigned char *outbuf, const unsigned char *inbuf) { RFC2268_context *ctx = context; register int i, j; u16 word0 = 0, word1 = 0, word2 = 0, word3 = 0; word0 = (word0 << 8) | inbuf[1]; word0 = (word0 << 8) | inbuf[0]; word1 = (word1 << 8) | inbuf[3]; word1 = (word1 << 8) | inbuf[2]; word2 = (word2 << 8) | inbuf[5]; word2 = (word2 << 8) | inbuf[4]; word3 = (word3 << 8) | inbuf[7]; word3 = (word3 << 8) | inbuf[6]; for (i = 0; i < 16; i++) { j = i * 4; /* For some reason I cannot combine those steps. */ word0 += (word1 & ~word3) + (word2 & word3) + ctx->S[j]; word0 = rotl16(word0, 1); word1 += (word2 & ~word0) + (word3 & word0) + ctx->S[j + 1]; word1 = rotl16(word1, 2); word2 += (word3 & ~word1) + (word0 & word1) + ctx->S[j + 2]; word2 = rotl16(word2, 3); word3 += (word0 & ~word2) + (word1 & word2) + ctx->S[j + 3]; word3 = rotl16(word3, 5); if (i == 4 || i == 10) { word0 += ctx->S[word3 & 63]; word1 += ctx->S[word0 & 63]; word2 += ctx->S[word1 & 63]; word3 += ctx->S[word2 & 63]; } } outbuf[0] = word0 & 255; outbuf[1] = word0 >> 8; outbuf[2] = word1 & 255; outbuf[3] = word1 >> 8; outbuf[4] = word2 & 255; outbuf[5] = word2 >> 8; outbuf[6] = word3 & 255; outbuf[7] = word3 >> 8; } static unsigned int encrypt_block (void *context, unsigned char *outbuf, const unsigned char *inbuf) { do_encrypt (context, outbuf, inbuf); return /*burn_stack*/ (4 * sizeof(void *) + sizeof(void *) + sizeof(u32) * 4); } static void do_decrypt (void *context, unsigned char *outbuf, const unsigned char *inbuf) { RFC2268_context *ctx = context; register int i, j; u16 word0 = 0, word1 = 0, word2 = 0, word3 = 0; word0 = (word0 << 8) | inbuf[1]; word0 = (word0 << 8) | inbuf[0]; word1 = (word1 << 8) | inbuf[3]; word1 = (word1 << 8) | inbuf[2]; word2 = (word2 << 8) | inbuf[5]; word2 = (word2 << 8) | inbuf[4]; word3 = (word3 << 8) | inbuf[7]; word3 = (word3 << 8) | inbuf[6]; for (i = 15; i >= 0; i--) { j = i * 4; word3 = rotr16(word3, 5); word3 -= (word0 & ~word2) + (word1 & word2) + ctx->S[j + 3]; word2 = rotr16(word2, 3); word2 -= (word3 & ~word1) + (word0 & word1) + ctx->S[j + 2]; word1 = rotr16(word1, 2); word1 -= (word2 & ~word0) + (word3 & word0) + ctx->S[j + 1]; word0 = rotr16(word0, 1); word0 -= (word1 & ~word3) + (word2 & word3) + ctx->S[j]; if (i == 5 || i == 11) { word3 = word3 - ctx->S[word2 & 63]; word2 = word2 - ctx->S[word1 & 63]; word1 = word1 - ctx->S[word0 & 63]; word0 = word0 - ctx->S[word3 & 63]; } } outbuf[0] = word0 & 255; outbuf[1] = word0 >> 8; outbuf[2] = word1 & 255; outbuf[3] = word1 >> 8; outbuf[4] = word2 & 255; outbuf[5] = word2 >> 8; outbuf[6] = word3 & 255; outbuf[7] = word3 >> 8; } static unsigned int decrypt_block (void *context, unsigned char *outbuf, const unsigned char *inbuf) { do_decrypt (context, outbuf, inbuf); return /*burn_stack*/ (4 * sizeof(void *) + sizeof(void *) + sizeof(u32) * 4); } static gpg_err_code_t setkey_core (void *context, const unsigned char *key, unsigned int keylen, int with_phase2) { static int initialized; static const char *selftest_failed; RFC2268_context *ctx = context; unsigned int i; unsigned char *S, x; int len; int bits = keylen * 8; if (!initialized) { initialized = 1; selftest_failed = selftest (); if (selftest_failed) log_error ("RFC2268 selftest failed (%s).\n", selftest_failed); } if (selftest_failed) return GPG_ERR_SELFTEST_FAILED; if (keylen < 40 / 8) /* We want at least 40 bits. */ return GPG_ERR_INV_KEYLEN; if (keylen > 128) return GPG_ERR_INV_KEYLEN; S = (unsigned char *) ctx->S; for (i = 0; i < keylen; i++) S[i] = key[i]; for (i = keylen; i < 128; i++) S[i] = rfc2268_sbox[(S[i - keylen] + S[i - 1]) & 255]; S[0] = rfc2268_sbox[S[0]]; /* Phase 2 - reduce effective key size to "bits". This was not * discussed in Gutmann's paper. I've copied that from the public * domain code posted in sci.crypt. */ if (with_phase2) { len = (bits + 7) >> 3; i = 128 - len; x = rfc2268_sbox[S[i] & (255 >> (7 & -bits))]; S[i] = x; while (i--) { x = rfc2268_sbox[x ^ S[i + len]]; S[i] = x; } } /* Make the expanded key, endian independent. */ for (i = 0; i < 64; i++) ctx->S[i] = ( (u16) S[i * 2] | (((u16) S[i * 2 + 1]) << 8)); return 0; } static gpg_err_code_t do_setkey (void *context, const unsigned char *key, unsigned int keylen, cipher_bulk_ops_t *bulk_ops) { (void)bulk_ops; return setkey_core (context, key, keylen, 1); } static const gcry_cipher_oid_spec_t oids_rfc2268_40[] = { /*{ "1.2.840.113549.3.2", GCRY_CIPHER_MODE_CBC },*/ /* pbeWithSHAAnd40BitRC2_CBC */ { "1.2.840.113549.1.12.1.6", GCRY_CIPHER_MODE_CBC }, { NULL } }; static const gcry_cipher_oid_spec_t oids_rfc2268_128[] = { /* pbeWithSHAAnd128BitRC2_CBC */ { "1.2.840.113549.1.12.1.5", GCRY_CIPHER_MODE_CBC }, { NULL } }; gcry_cipher_spec_t _gcry_cipher_spec_rfc2268_40 = { GCRY_CIPHER_RFC2268_40, {0, 0}, "RFC2268_40", NULL, oids_rfc2268_40, RFC2268_BLOCKSIZE, 40, sizeof(RFC2268_context), do_setkey, encrypt_block, decrypt_block , GRUB_UTIL_MODNAME("gcry_rfc2268") }; gcry_cipher_spec_t _gcry_cipher_spec_rfc2268_128 = { GCRY_CIPHER_RFC2268_128, {0, 0}, "RFC2268_128", NULL, oids_rfc2268_128, RFC2268_BLOCKSIZE, 128, sizeof(RFC2268_context), do_setkey, encrypt_block, decrypt_block , GRUB_UTIL_MODNAME("gcry_rfc2268") }; GRUB_MOD_INIT(gcry_rfc2268) { grub_cipher_register (&_gcry_cipher_spec_rfc2268_40); grub_cipher_register (&_gcry_cipher_spec_rfc2268_128); } GRUB_MOD_FINI(gcry_rfc2268) { grub_cipher_unregister (&_gcry_cipher_spec_rfc2268_40); grub_cipher_unregister (&_gcry_cipher_spec_rfc2268_128); } grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/cipher/cipher-internal.h0000644000175000017500000010306515036452441024105 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ /* cipher-internal.h - Internal defs for cipher.c * Copyright (C) 2011 Free Software Foundation, Inc. * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . */ #ifndef G10_CIPHER_INTERNAL_H #define G10_CIPHER_INTERNAL_H #include "./poly1305-internal.h" /* The maximum supported size of a block in bytes. */ #define MAX_BLOCKSIZE 16 /* The length for an OCB block. Although OCB supports any block length it does not make sense to use a 64 bit blocklen (and cipher) because this reduces the security margin to an unacceptable state. Thus we require a cipher with 128 bit blocklength. */ #define OCB_BLOCK_LEN (128/8) /* The size of the pre-computed L table for OCB. This takes the same size as the table used for GCM and thus we don't save anything by not using such a table. */ #define OCB_L_TABLE_SIZE 16 /* Check the above constants. */ #if OCB_BLOCK_LEN > MAX_BLOCKSIZE # error OCB_BLOCKLEN > MAX_BLOCKSIZE #endif /* Magic values for the context structure. */ #define CTX_MAGIC_NORMAL 0x24091964 #define CTX_MAGIC_SECURE 0x46919042 /* Try to use 16 byte aligned cipher context for better performance. We use the aligned attribute, thus it is only possible to implement this with gcc. */ #undef NEED_16BYTE_ALIGNED_CONTEXT #ifdef HAVE_GCC_ATTRIBUTE_ALIGNED # define NEED_16BYTE_ALIGNED_CONTEXT 1 #endif /* Undef this symbol to trade GCM speed for 256 bytes of memory per context */ #define GCM_USE_TABLES 1 /* GCM_USE_INTEL_PCLMUL indicates whether to compile GCM with Intel PCLMUL code. */ #undef GCM_USE_INTEL_PCLMUL #if defined(ENABLE_PCLMUL_SUPPORT) && defined(GCM_USE_TABLES) # if ((defined(__i386__) && SIZEOF_UNSIGNED_LONG == 4) || defined(__x86_64__)) # if __GNUC__ >= 4 # define GCM_USE_INTEL_PCLMUL 1 # endif # endif #endif /* GCM_USE_INTEL_PCLMUL */ /* GCM_USE_INTEL_VPCLMUL_AVX2 indicates whether to compile GCM with Intel VPCLMUL/AVX2 code. */ #undef GCM_USE_INTEL_VPCLMUL_AVX2 #if defined(__x86_64__) && defined(GCM_USE_INTEL_PCLMUL) && \ defined(ENABLE_AVX2_SUPPORT) && defined(HAVE_GCC_INLINE_ASM_VAES_VPCLMUL) # define GCM_USE_INTEL_VPCLMUL_AVX2 1 #endif /* GCM_USE_INTEL_VPCLMUL_AVX2 */ /* GCM_USE_INTEL_VPCLMUL_AVX512 indicates whether to compile GCM with Intel VPCLMUL/AVX512 code. */ #undef GCM_USE_INTEL_VPCLMUL_AVX512 #if defined(__x86_64__) && defined(GCM_USE_INTEL_VPCLMUL_AVX2) && \ defined(ENABLE_AVX512_SUPPORT) && defined(HAVE_GCC_INLINE_ASM_AVX512) # define GCM_USE_INTEL_VPCLMUL_AVX512 1 #endif /* GCM_USE_INTEL_VPCLMUL_AVX512 */ /* GCM_USE_ARM_PMULL indicates whether to compile GCM with ARMv8 PMULL code. */ #undef GCM_USE_ARM_PMULL #if defined(ENABLE_ARM_CRYPTO_SUPPORT) && defined(GCM_USE_TABLES) # if defined(HAVE_ARM_ARCH_V6) && defined(__ARMEL__) \ && defined(HAVE_COMPATIBLE_GCC_ARM_PLATFORM_AS) \ && defined(HAVE_GCC_INLINE_ASM_AARCH32_CRYPTO) # define GCM_USE_ARM_PMULL 1 # elif defined(__AARCH64EL__) && \ defined(HAVE_COMPATIBLE_GCC_AARCH64_PLATFORM_AS) && \ defined(HAVE_GCC_INLINE_ASM_AARCH64_CRYPTO) # define GCM_USE_ARM_PMULL 1 # endif #endif /* GCM_USE_ARM_PMULL */ /* GCM_USE_ARM_NEON indicates whether to compile GCM with ARMv7 NEON code. */ #undef GCM_USE_ARM_NEON #if defined(GCM_USE_TABLES) #if defined(HAVE_ARM_ARCH_V6) && defined(__ARMEL__) && \ defined(HAVE_COMPATIBLE_GCC_ARM_PLATFORM_AS) && \ defined(HAVE_GCC_INLINE_ASM_NEON) # define GCM_USE_ARM_NEON 1 #endif #endif /* GCM_USE_ARM_NEON */ /* GCM_USE_S390X_CRYPTO indicates whether to enable zSeries code. */ #undef GCM_USE_S390X_CRYPTO #if defined(HAVE_GCC_INLINE_ASM_S390X) # define GCM_USE_S390X_CRYPTO 1 #endif /* GCM_USE_S390X_CRYPTO */ /* GCM_USE_PPC_VPMSUM indicates whether to compile GCM with PPC Power 8 * polynomial multiplication instruction. */ #undef GCM_USE_PPC_VPMSUM #if defined(GCM_USE_TABLES) #if defined(ENABLE_PPC_CRYPTO_SUPPORT) && defined(__powerpc64__) && \ defined(HAVE_COMPATIBLE_CC_PPC_ALTIVEC) && \ defined(HAVE_GCC_INLINE_ASM_PPC_ALTIVEC) && __GNUC__ >= 4 # define GCM_USE_PPC_VPMSUM 1 # define NEED_16BYTE_ALIGNED_CONTEXT 1 /* this also aligns gcm_table */ #endif #endif /* GCM_USE_PPC_VPMSUM */ typedef unsigned int (*ghash_fn_t) (gcry_cipher_hd_t c, byte *result, const byte *buf, size_t nblocks); /* A structure with function pointers for mode operations. */ typedef struct cipher_mode_ops { gcry_err_code_t (*encrypt)(gcry_cipher_hd_t c, unsigned char *outbuf, size_t outbuflen, const unsigned char *inbuf, size_t inbuflen); gcry_err_code_t (*decrypt)(gcry_cipher_hd_t c, unsigned char *outbuf, size_t outbuflen, const unsigned char *inbuf, size_t inbuflen); gcry_err_code_t (*setiv)(gcry_cipher_hd_t c, const unsigned char *iv, size_t ivlen); gcry_err_code_t (*authenticate)(gcry_cipher_hd_t c, const unsigned char *abuf, size_t abuflen); gcry_err_code_t (*get_tag)(gcry_cipher_hd_t c, unsigned char *outtag, size_t taglen); gcry_err_code_t (*check_tag)(gcry_cipher_hd_t c, const unsigned char *intag, size_t taglen); } cipher_mode_ops_t; /* A structure with function pointers for bulk operations. The cipher algorithm setkey function initializes them when bulk operations are available and the actual encryption routines use them if they are not NULL. */ typedef struct cipher_bulk_ops { void (*ecb_crypt)(void *context, void *outbuf_arg, const void *inbuf_arg, size_t nblocks, int encrypt); void (*cfb_enc)(void *context, unsigned char *iv, void *outbuf_arg, const void *inbuf_arg, size_t nblocks); void (*cfb_dec)(void *context, unsigned char *iv, void *outbuf_arg, const void *inbuf_arg, size_t nblocks); void (*cbc_enc)(void *context, unsigned char *iv, void *outbuf_arg, const void *inbuf_arg, size_t nblocks, int cbc_mac); void (*cbc_dec)(void *context, unsigned char *iv, void *outbuf_arg, const void *inbuf_arg, size_t nblocks); void (*ofb_enc)(void *context, unsigned char *iv, void *outbuf_arg, const void *inbuf_arg, size_t nblocks); void (*ctr_enc)(void *context, unsigned char *iv, void *outbuf_arg, const void *inbuf_arg, size_t nblocks); void (*ctr32le_enc)(void *context, unsigned char *iv, void *outbuf_arg, const void *inbuf_arg, size_t nblocks); size_t (*ocb_crypt)(gcry_cipher_hd_t c, void *outbuf_arg, const void *inbuf_arg, size_t nblocks, int encrypt); size_t (*ocb_auth)(gcry_cipher_hd_t c, const void *abuf_arg, size_t nblocks); void (*xts_crypt)(void *context, unsigned char *tweak, void *outbuf_arg, const void *inbuf_arg, size_t nblocks, int encrypt); size_t (*gcm_crypt)(gcry_cipher_hd_t c, void *outbuf_arg, const void *inbuf_arg, size_t nblocks, int encrypt); } cipher_bulk_ops_t; /* A VIA processor with the Padlock engine as well as the Intel AES_NI instructions require an alignment of most data on a 16 byte boundary. Because we trick out the compiler while allocating the context, the align attribute as used in rijndael.c does not work on its own. Thus we need to make sure that the entire context structure is a aligned on that boundary. We achieve this by defining a new type and use that instead of our usual alignment type. */ typedef union { PROPERLY_ALIGNED_TYPE foo; #ifdef NEED_16BYTE_ALIGNED_CONTEXT char bar[16] __attribute__ ((aligned (16))); #endif char c[1]; } cipher_context_alignment_t; /* Storage structure for CMAC, for CMAC and EAX modes. */ typedef struct { /* The initialization vector. Also contains tag after finalization. */ union { cipher_context_alignment_t iv_align; unsigned char iv[MAX_BLOCKSIZE]; } u_iv; /* Subkeys for tag creation, not cleared by gcry_cipher_reset. */ unsigned char subkeys[2][MAX_BLOCKSIZE]; /* Space to save partial input lengths for MAC. */ unsigned char macbuf[MAX_BLOCKSIZE]; int mac_unused; /* Number of unprocessed bytes in MACBUF. */ unsigned int tag:1; /* Set to 1 if tag has been finalized. */ } gcry_cmac_context_t; /* The handle structure. */ struct gcry_cipher_handle { int magic; size_t actual_handle_size; /* Allocated size of this handle. */ size_t handle_offset; /* Offset to the malloced block. */ gcry_cipher_spec_t *spec; /* The algorithm id. This is a hack required because the module interface does not easily allow to retrieve this value. */ int algo; /* A structure with function pointers for mode operations. */ cipher_mode_ops_t mode_ops; /* A structure with function pointers for bulk operations. Due to limitations of the module system (we don't want to change the API) we need to keep these function pointers here. */ cipher_bulk_ops_t bulk; int mode; unsigned int flags; struct { int geniv_method; unsigned char fixed[MAX_BLOCKSIZE]; unsigned char dynamic[MAX_BLOCKSIZE]; size_t fixed_iv_len; size_t dynamic_iv_len; } aead; struct { unsigned int key:1; /* Set to 1 if a key has been set. */ unsigned int iv:1; /* Set to 1 if a IV has been set. */ unsigned int tag:1; /* Set to 1 if a tag is finalized. */ unsigned int finalize:1; /* Next encrypt/decrypt has the final data. */ unsigned int allow_weak_key:1; /* Set to 1 if weak keys are allowed. */ } marks; /* The initialization vector. For best performance we make sure that it is properly aligned. In particular some implementations of bulk operations expect an 16 byte aligned IV. IV is also used to store CBC-MAC in CCM mode; counter IV is stored in U_CTR. For OCB mode it is used for the offset value. */ union { cipher_context_alignment_t iv_align; unsigned char iv[MAX_BLOCKSIZE]; } u_iv; /* The counter for CTR mode. This field is also used by AESWRAP and thus we can't use the U_IV union. For OCB mode it is used for the checksum. */ union { cipher_context_alignment_t iv_align; unsigned char ctr[MAX_BLOCKSIZE]; } u_ctr; /* Space to save an IV or CTR for chaining operations. */ unsigned char lastiv[MAX_BLOCKSIZE]; int unused; /* Number of unused bytes in LASTIV. */ union { /* Mode specific storage for CCM mode. */ struct { u64 encryptlen; u64 aadlen; unsigned int authlen; /* Space to save partial input lengths for MAC. */ unsigned char macbuf[GCRY_CCM_BLOCK_LEN]; int mac_unused; /* Number of unprocessed bytes in MACBUF. */ unsigned char s0[GCRY_CCM_BLOCK_LEN]; unsigned int nonce:1; /* Set to 1 if nonce has been set. */ unsigned int lengths:1; /* Set to 1 if CCM length parameters has been processed. */ } ccm; /* Mode specific storage for Poly1305 mode. */ struct { /* byte counter for AAD. */ u32 aadcount[2]; /* byte counter for data. */ u32 datacount[2]; unsigned int aad_finalized:1; unsigned int bytecount_over_limits:1; poly1305_context_t ctx; } poly1305; /* Mode specific storage for CMAC mode. */ gcry_cmac_context_t cmac; /* Mode specific storage for EAX mode. */ struct { /* CMAC for header (AAD). */ gcry_cmac_context_t cmac_header; /* CMAC for ciphertext. */ gcry_cmac_context_t cmac_ciphertext; } eax; /* Mode specific storage for GCM mode and GCM-SIV mode. */ struct { /* The interim tag for GCM mode. */ union { cipher_context_alignment_t iv_align; unsigned char tag[MAX_BLOCKSIZE]; } u_tag; /* Space to save partial input lengths for MAC. */ unsigned char macbuf[GCRY_CCM_BLOCK_LEN]; int mac_unused; /* Number of unprocessed bytes in MACBUF. */ /* byte counters for GCM */ u32 aadlen[2]; u32 datalen[2]; /* encrypted tag counter */ unsigned char tagiv[MAX_BLOCKSIZE]; unsigned int ghash_data_finalized:1; unsigned int ghash_aad_finalized:1; unsigned int datalen_over_limits:1; unsigned int disallow_encryption_because_of_setiv_in_fips_mode:1; /* --- Following members are not cleared in gcry_cipher_reset --- */ /* GHASH multiplier from key. */ union { cipher_context_alignment_t iv_align; unsigned char key[MAX_BLOCKSIZE]; } u_ghash_key; /* Pre-calculated table for GCM. */ #ifdef GCM_USE_TABLES #if (SIZEOF_UNSIGNED_LONG == 8 || defined(__x86_64__)) #define GCM_TABLES_USE_U64 1 u64 gcm_table[4 * 16]; #else #undef GCM_TABLES_USE_U64 u32 gcm_table[8 * 16]; #endif #endif /* GHASH implementation in use. */ ghash_fn_t ghash_fn; /* POLYVAL implementation in use (GCM-SIV). */ ghash_fn_t polyval_fn; /* Key length used for GCM-SIV key generating key. */ unsigned int siv_keylen; /* Flags for accelerated implementations. */ unsigned int hw_impl_flags; } gcm; /* Mode specific storage for OCB mode. */ struct { /* --- Following members are not cleared in gcry_cipher_reset --- */ /* Helper variables and pre-computed table of L values. */ unsigned char L_star[OCB_BLOCK_LEN]; unsigned char L_dollar[OCB_BLOCK_LEN]; unsigned char L0L1[OCB_BLOCK_LEN]; unsigned char L[OCB_L_TABLE_SIZE][OCB_BLOCK_LEN]; /* --- Following members are cleared in gcry_cipher_reset --- */ /* The tag is valid if marks.tag has been set. */ unsigned char tag[OCB_BLOCK_LEN]; /* A buffer to hold the offset for the AAD processing. */ unsigned char aad_offset[OCB_BLOCK_LEN]; /* A buffer to hold the current sum of AAD processing. We can't use tag here because tag may already hold the preprocessed checksum of the data. */ unsigned char aad_sum[OCB_BLOCK_LEN]; /* A buffer to store AAD data not yet processed. */ unsigned char aad_leftover[OCB_BLOCK_LEN]; /* Number of data/aad blocks processed so far. */ u64 data_nblocks; u64 aad_nblocks; /* Number of valid bytes in AAD_LEFTOVER. */ unsigned char aad_nleftover; /* Length of the tag. Fixed for now but may eventually be specified using a set of gcry_cipher_flags. */ unsigned char taglen; /* Flags indicating that the final data/aad block has been processed. */ unsigned int data_finalized:1; unsigned int aad_finalized:1; } ocb; /* Mode specific storage for XTS mode. */ struct { /* Pointer to tweak cipher context, allocated after actual * cipher context. */ char *tweak_context; } xts; /* Mode specific storage for SIV mode. */ struct { /* Tag used for decryption. */ unsigned char dec_tag[GCRY_SIV_BLOCK_LEN]; /* S2V state. */ unsigned char s2v_d[GCRY_SIV_BLOCK_LEN]; /* Number of AAD elements processed. */ unsigned int aad_count:8; /* Flags for SIV state. */ unsigned int dec_tag_set:1; /* --- Following members are not cleared in gcry_cipher_reset --- */ /* S2V CMAC state. */ gcry_cmac_context_t s2v_cmac; unsigned char s2v_zero_block[GCRY_SIV_BLOCK_LEN]; /* Pointer to CTR cipher context, allocated after actual * cipher context. */ char *ctr_context; } siv; /* Mode specific storage for WRAP mode. */ struct { unsigned char plen[4]; } wrap; } u_mode; /* What follows are two contexts of the cipher in use. The first one needs to be aligned well enough for the cipher operation whereas the second one is a copy created by cipher_setkey and used by cipher_reset. That second copy has no need for proper aligment because it is only accessed by memcpy. */ cipher_context_alignment_t context; }; /*-- cipher-cbc.c --*/ gcry_err_code_t _gcry_cipher_cbc_encrypt /* */ (gcry_cipher_hd_t c, unsigned char *outbuf, size_t outbuflen, const unsigned char *inbuf, size_t inbuflen); gcry_err_code_t _gcry_cipher_cbc_decrypt /* */ (gcry_cipher_hd_t c, unsigned char *outbuf, size_t outbuflen, const unsigned char *inbuf, size_t inbuflen); gcry_err_code_t _gcry_cipher_cbc_cts_encrypt /* */ (gcry_cipher_hd_t c, unsigned char *outbuf, size_t outbuflen, const unsigned char *inbuf, size_t inbuflen); gcry_err_code_t _gcry_cipher_cbc_cts_decrypt /* */ (gcry_cipher_hd_t c, unsigned char *outbuf, size_t outbuflen, const unsigned char *inbuf, size_t inbuflen); /*-- cipher-cfb.c --*/ gcry_err_code_t _gcry_cipher_cfb_encrypt /* */ (gcry_cipher_hd_t c, unsigned char *outbuf, size_t outbuflen, const unsigned char *inbuf, size_t inbuflen); gcry_err_code_t _gcry_cipher_cfb_decrypt /* */ (gcry_cipher_hd_t c, unsigned char *outbuf, size_t outbuflen, const unsigned char *inbuf, size_t inbuflen); gcry_err_code_t _gcry_cipher_cfb8_encrypt /* */ (gcry_cipher_hd_t c, unsigned char *outbuf, size_t outbuflen, const unsigned char *inbuf, size_t inbuflen); gcry_err_code_t _gcry_cipher_cfb8_decrypt /* */ (gcry_cipher_hd_t c, unsigned char *outbuf, size_t outbuflen, const unsigned char *inbuf, size_t inbuflen); /*-- cipher-ofb.c --*/ gcry_err_code_t _gcry_cipher_ofb_encrypt /* */ (gcry_cipher_hd_t c, unsigned char *outbuf, size_t outbuflen, const unsigned char *inbuf, size_t inbuflen); /*-- cipher-ctr.c --*/ gcry_err_code_t _gcry_cipher_ctr_encrypt_ctx /* */ (gcry_cipher_hd_t c, unsigned char *outbuf, size_t outbuflen, const unsigned char *inbuf, size_t inbuflen, void *algo_context); gcry_err_code_t _gcry_cipher_ctr_encrypt /* */ (gcry_cipher_hd_t c, unsigned char *outbuf, size_t outbuflen, const unsigned char *inbuf, size_t inbuflen); /*-- cipher-aeswrap.c --*/ gcry_err_code_t _gcry_cipher_keywrap_encrypt /* */ (gcry_cipher_hd_t c, byte *outbuf, size_t outbuflen, const byte *inbuf, size_t inbuflen); gcry_err_code_t _gcry_cipher_keywrap_encrypt_padding /* */ (gcry_cipher_hd_t c, byte *outbuf, size_t outbuflen, const byte *inbuf, size_t inbuflen); gcry_err_code_t _gcry_cipher_keywrap_decrypt_auto /* */ (gcry_cipher_hd_t c, byte *outbuf, size_t outbuflen, const byte *inbuf, size_t inbuflen); /*-- cipher-ccm.c --*/ gcry_err_code_t _gcry_cipher_ccm_encrypt /* */ (gcry_cipher_hd_t c, unsigned char *outbuf, size_t outbuflen, const unsigned char *inbuf, size_t inbuflen); gcry_err_code_t _gcry_cipher_ccm_decrypt /* */ (gcry_cipher_hd_t c, unsigned char *outbuf, size_t outbuflen, const unsigned char *inbuf, size_t inbuflen); gcry_err_code_t _gcry_cipher_ccm_set_nonce /* */ (gcry_cipher_hd_t c, const unsigned char *nonce, size_t noncelen); gcry_err_code_t _gcry_cipher_ccm_authenticate /* */ (gcry_cipher_hd_t c, const unsigned char *abuf, size_t abuflen); gcry_err_code_t _gcry_cipher_ccm_set_lengths /* */ (gcry_cipher_hd_t c, u64 encryptedlen, u64 aadlen, u64 taglen); gcry_err_code_t _gcry_cipher_ccm_get_tag /* */ (gcry_cipher_hd_t c, unsigned char *outtag, size_t taglen); gcry_err_code_t _gcry_cipher_ccm_check_tag /* */ (gcry_cipher_hd_t c, const unsigned char *intag, size_t taglen); /*-- cipher-cmac.c --*/ gcry_err_code_t _gcry_cmac_generate_subkeys /* */ (gcry_cipher_hd_t c, gcry_cmac_context_t *ctx); gcry_err_code_t _gcry_cmac_write /* */ (gcry_cipher_hd_t c, gcry_cmac_context_t *ctx, const byte * inbuf, size_t inlen); gcry_err_code_t _gcry_cmac_final /* */ (gcry_cipher_hd_t c, gcry_cmac_context_t *ctx); void _gcry_cmac_reset (gcry_cmac_context_t *ctx); /*-- cipher-eax.c --*/ gcry_err_code_t _gcry_cipher_eax_encrypt /* */ (gcry_cipher_hd_t c, unsigned char *outbuf, size_t outbuflen, const unsigned char *inbuf, size_t inbuflen); gcry_err_code_t _gcry_cipher_eax_decrypt /* */ (gcry_cipher_hd_t c, unsigned char *outbuf, size_t outbuflen, const unsigned char *inbuf, size_t inbuflen); gcry_err_code_t _gcry_cipher_eax_set_nonce /* */ (gcry_cipher_hd_t c, const unsigned char *nonce, size_t noncelen); gcry_err_code_t _gcry_cipher_eax_authenticate /* */ (gcry_cipher_hd_t c, const unsigned char *aadbuf, size_t aadbuflen); gcry_err_code_t _gcry_cipher_eax_get_tag /* */ (gcry_cipher_hd_t c, unsigned char *outtag, size_t taglen); gcry_err_code_t _gcry_cipher_eax_check_tag /* */ (gcry_cipher_hd_t c, const unsigned char *intag, size_t taglen); gcry_err_code_t _gcry_cipher_eax_setkey /* */ (gcry_cipher_hd_t c); /*-- cipher-gcm.c --*/ gcry_err_code_t _gcry_cipher_gcm_encrypt /* */ (gcry_cipher_hd_t c, unsigned char *outbuf, size_t outbuflen, const unsigned char *inbuf, size_t inbuflen); gcry_err_code_t _gcry_cipher_gcm_decrypt /* */ (gcry_cipher_hd_t c, unsigned char *outbuf, size_t outbuflen, const unsigned char *inbuf, size_t inbuflen); gcry_err_code_t _gcry_cipher_gcm_setiv /* */ (gcry_cipher_hd_t c, const unsigned char *iv, size_t ivlen); gcry_err_code_t _gcry_cipher_gcm_authenticate /* */ (gcry_cipher_hd_t c, const unsigned char *aadbuf, size_t aadbuflen); gcry_err_code_t _gcry_cipher_gcm_get_tag /* */ (gcry_cipher_hd_t c, unsigned char *outtag, size_t taglen); gcry_err_code_t _gcry_cipher_gcm_check_tag /* */ (gcry_cipher_hd_t c, const unsigned char *intag, size_t taglen); void _gcry_cipher_gcm_setkey /* */ (gcry_cipher_hd_t c); void _gcry_cipher_gcm_setupM /* */ (gcry_cipher_hd_t c); /*-- cipher-poly1305.c --*/ gcry_err_code_t _gcry_cipher_poly1305_encrypt /* */ (gcry_cipher_hd_t c, unsigned char *outbuf, size_t outbuflen, const unsigned char *inbuf, size_t inbuflen); gcry_err_code_t _gcry_cipher_poly1305_decrypt /* */ (gcry_cipher_hd_t c, unsigned char *outbuf, size_t outbuflen, const unsigned char *inbuf, size_t inbuflen); gcry_err_code_t _gcry_cipher_poly1305_setiv /* */ (gcry_cipher_hd_t c, const unsigned char *iv, size_t ivlen); gcry_err_code_t _gcry_cipher_poly1305_authenticate /* */ (gcry_cipher_hd_t c, const unsigned char *aadbuf, size_t aadbuflen); gcry_err_code_t _gcry_cipher_poly1305_get_tag /* */ (gcry_cipher_hd_t c, unsigned char *outtag, size_t taglen); gcry_err_code_t _gcry_cipher_poly1305_check_tag /* */ (gcry_cipher_hd_t c, const unsigned char *intag, size_t taglen); void _gcry_cipher_poly1305_setkey /* */ (gcry_cipher_hd_t c); /*-- chacha20.c --*/ gcry_err_code_t _gcry_chacha20_poly1305_encrypt /* */ (gcry_cipher_hd_t c, byte *outbuf, const byte *inbuf, size_t length); gcry_err_code_t _gcry_chacha20_poly1305_decrypt /* */ (gcry_cipher_hd_t c, byte *outbuf, const byte *inbuf, size_t length); /*-- cipher-ocb.c --*/ gcry_err_code_t _gcry_cipher_ocb_encrypt /* */ (gcry_cipher_hd_t c, unsigned char *outbuf, size_t outbuflen, const unsigned char *inbuf, size_t inbuflen); gcry_err_code_t _gcry_cipher_ocb_decrypt /* */ (gcry_cipher_hd_t c, unsigned char *outbuf, size_t outbuflen, const unsigned char *inbuf, size_t inbuflen); gcry_err_code_t _gcry_cipher_ocb_set_nonce /* */ (gcry_cipher_hd_t c, const unsigned char *nonce, size_t noncelen); gcry_err_code_t _gcry_cipher_ocb_authenticate /* */ (gcry_cipher_hd_t c, const unsigned char *abuf, size_t abuflen); gcry_err_code_t _gcry_cipher_ocb_get_tag /* */ (gcry_cipher_hd_t c, unsigned char *outtag, size_t taglen); gcry_err_code_t _gcry_cipher_ocb_check_tag /* */ (gcry_cipher_hd_t c, const unsigned char *intag, size_t taglen); void _gcry_cipher_ocb_setkey /* */ (gcry_cipher_hd_t c); /*-- cipher-xts.c --*/ gcry_err_code_t _gcry_cipher_xts_encrypt /* */ (gcry_cipher_hd_t c, unsigned char *outbuf, size_t outbuflen, const unsigned char *inbuf, size_t inbuflen); gcry_err_code_t _gcry_cipher_xts_decrypt /* */ (gcry_cipher_hd_t c, unsigned char *outbuf, size_t outbuflen, const unsigned char *inbuf, size_t inbuflen); /*-- cipher-siv.c --*/ gcry_err_code_t _gcry_cipher_siv_encrypt /* */ (gcry_cipher_hd_t c, unsigned char *outbuf, size_t outbuflen, const unsigned char *inbuf, size_t inbuflen); gcry_err_code_t _gcry_cipher_siv_decrypt /* */ (gcry_cipher_hd_t c, unsigned char *outbuf, size_t outbuflen, const unsigned char *inbuf, size_t inbuflen); gcry_err_code_t _gcry_cipher_siv_set_nonce /* */ (gcry_cipher_hd_t c, const unsigned char *nonce, size_t noncelen); gcry_err_code_t _gcry_cipher_siv_authenticate /* */ (gcry_cipher_hd_t c, const unsigned char *abuf, size_t abuflen); gcry_err_code_t _gcry_cipher_siv_set_decryption_tag /* */ (gcry_cipher_hd_t c, const byte *tag, size_t taglen); gcry_err_code_t _gcry_cipher_siv_get_tag /* */ (gcry_cipher_hd_t c, unsigned char *outtag, size_t taglen); gcry_err_code_t _gcry_cipher_siv_check_tag /* */ (gcry_cipher_hd_t c, const unsigned char *intag, size_t taglen); gcry_err_code_t _gcry_cipher_siv_setkey /* */ (gcry_cipher_hd_t c, const unsigned char *ctrkey, size_t ctrkeylen); /*-- cipher-gcm-siv.c --*/ gcry_err_code_t _gcry_cipher_gcm_siv_encrypt /* */ (gcry_cipher_hd_t c, unsigned char *outbuf, size_t outbuflen, const unsigned char *inbuf, size_t inbuflen); gcry_err_code_t _gcry_cipher_gcm_siv_decrypt /* */ (gcry_cipher_hd_t c, unsigned char *outbuf, size_t outbuflen, const unsigned char *inbuf, size_t inbuflen); gcry_err_code_t _gcry_cipher_gcm_siv_set_nonce /* */ (gcry_cipher_hd_t c, const unsigned char *nonce, size_t noncelen); gcry_err_code_t _gcry_cipher_gcm_siv_authenticate /* */ (gcry_cipher_hd_t c, const unsigned char *abuf, size_t abuflen); gcry_err_code_t _gcry_cipher_gcm_siv_set_decryption_tag /* */ (gcry_cipher_hd_t c, const byte *tag, size_t taglen); gcry_err_code_t _gcry_cipher_gcm_siv_get_tag /* */ (gcry_cipher_hd_t c, unsigned char *outtag, size_t taglen); gcry_err_code_t _gcry_cipher_gcm_siv_check_tag /* */ (gcry_cipher_hd_t c, const unsigned char *intag, size_t taglen); gcry_err_code_t _gcry_cipher_gcm_siv_setkey /* */ (gcry_cipher_hd_t c, unsigned int keylen); /* Return the L-value for block N. Note: 'cipher_ocb.c' ensures that N * will never be multiple of 65536 (1 << OCB_L_TABLE_SIZE), thus N can * be directly passed to _gcry_ctz() function and resulting index will * never overflow the table. */ static inline const unsigned char * ocb_get_l (gcry_cipher_hd_t c, u64 n) { unsigned long ntz; #if ((defined(__i386__) || defined(__x86_64__)) && __GNUC__ >= 4) /* Assumes that N != 0. */ asm ("rep;bsfl %k[low], %k[ntz]\n\t" : [ntz] "=r" (ntz) : [low] "r" ((unsigned long)n) : "cc"); #else ntz = _gcry_ctz (n); #endif return c->u_mode.ocb.L[ntz]; } /* Return bit-shift of blocksize. */ static inline unsigned int _gcry_blocksize_shift(gcry_cipher_hd_t c) { /* Only blocksizes 8 and 16 are used. Return value in such way * that compiler can optimize calling functions based on this. */ return c->spec->blocksize == 8 ? 3 : 4; } /* Optimized function for adding value to cipher block. */ static inline void cipher_block_add(void *_dstsrc, unsigned int add, size_t blocksize) { byte *dstsrc = _dstsrc; u64 s[2]; if (blocksize == 8) { buf_put_be64(dstsrc + 0, buf_get_be64(dstsrc + 0) + add); } else /* blocksize == 16 */ { s[0] = buf_get_be64(dstsrc + 8); s[1] = buf_get_be64(dstsrc + 0); s[0] += add; s[1] += (s[0] < add); buf_put_be64(dstsrc + 8, s[0]); buf_put_be64(dstsrc + 0, s[1]); } } /* Optimized function for cipher block copying */ static inline void cipher_block_cpy(void *_dst, const void *_src, size_t blocksize) { byte *dst = _dst; const byte *src = _src; u64 s[2]; if (blocksize == 8) { buf_put_he64(dst + 0, buf_get_he64(src + 0)); } else /* blocksize == 16 */ { s[0] = buf_get_he64(src + 0); s[1] = buf_get_he64(src + 8); buf_put_he64(dst + 0, s[0]); buf_put_he64(dst + 8, s[1]); } } /* Optimized function for cipher block xoring */ static inline void cipher_block_xor(void *_dst, const void *_src1, const void *_src2, size_t blocksize) { byte *dst = _dst; const byte *src1 = _src1; const byte *src2 = _src2; u64 s1[2]; u64 s2[2]; if (blocksize == 8) { buf_put_he64(dst + 0, buf_get_he64(src1 + 0) ^ buf_get_he64(src2 + 0)); } else /* blocksize == 16 */ { s1[0] = buf_get_he64(src1 + 0); s1[1] = buf_get_he64(src1 + 8); s2[0] = buf_get_he64(src2 + 0); s2[1] = buf_get_he64(src2 + 8); buf_put_he64(dst + 0, s1[0] ^ s2[0]); buf_put_he64(dst + 8, s1[1] ^ s2[1]); } } /* Optimized function for in-place cipher block xoring */ static inline void cipher_block_xor_1(void *_dst, const void *_src, size_t blocksize) { cipher_block_xor (_dst, _dst, _src, blocksize); } /* Optimized function for cipher block xoring with two destination cipher blocks. Used mainly by CFB mode encryption. */ static inline void cipher_block_xor_2dst(void *_dst1, void *_dst2, const void *_src, size_t blocksize) { byte *dst1 = _dst1; byte *dst2 = _dst2; const byte *src = _src; u64 d2[2]; u64 s[2]; if (blocksize == 8) { d2[0] = buf_get_he64(dst2 + 0) ^ buf_get_he64(src + 0); buf_put_he64(dst2 + 0, d2[0]); buf_put_he64(dst1 + 0, d2[0]); } else /* blocksize == 16 */ { s[0] = buf_get_he64(src + 0); s[1] = buf_get_he64(src + 8); d2[0] = buf_get_he64(dst2 + 0); d2[1] = buf_get_he64(dst2 + 8); d2[0] = d2[0] ^ s[0]; d2[1] = d2[1] ^ s[1]; buf_put_he64(dst2 + 0, d2[0]); buf_put_he64(dst2 + 8, d2[1]); buf_put_he64(dst1 + 0, d2[0]); buf_put_he64(dst1 + 8, d2[1]); } } /* Optimized function for combined cipher block xoring and copying. Used by mainly CBC mode decryption. */ static inline void cipher_block_xor_n_copy_2(void *_dst_xor, const void *_src_xor, void *_srcdst_cpy, const void *_src_cpy, size_t blocksize) { byte *dst_xor = _dst_xor; byte *srcdst_cpy = _srcdst_cpy; const byte *src_xor = _src_xor; const byte *src_cpy = _src_cpy; u64 sc[2]; u64 sx[2]; u64 sdc[2]; if (blocksize == 8) { sc[0] = buf_get_he64(src_cpy + 0); buf_put_he64(dst_xor + 0, buf_get_he64(srcdst_cpy + 0) ^ buf_get_he64(src_xor + 0)); buf_put_he64(srcdst_cpy + 0, sc[0]); } else /* blocksize == 16 */ { sc[0] = buf_get_he64(src_cpy + 0); sc[1] = buf_get_he64(src_cpy + 8); sx[0] = buf_get_he64(src_xor + 0); sx[1] = buf_get_he64(src_xor + 8); sdc[0] = buf_get_he64(srcdst_cpy + 0); sdc[1] = buf_get_he64(srcdst_cpy + 8); sx[0] ^= sdc[0]; sx[1] ^= sdc[1]; buf_put_he64(dst_xor + 0, sx[0]); buf_put_he64(dst_xor + 8, sx[1]); buf_put_he64(srcdst_cpy + 0, sc[0]); buf_put_he64(srcdst_cpy + 8, sc[1]); } } /* Optimized function for combined cipher block byte-swapping. */ static inline void cipher_block_bswap (void *_dst_bswap, const void *_src_bswap, size_t blocksize) { byte *dst_bswap = _dst_bswap; const byte *src_bswap = _src_bswap; u64 t[2]; if (blocksize == 8) { buf_put_le64(dst_bswap, buf_get_be64(src_bswap)); } else { t[0] = buf_get_be64(src_bswap + 0); t[1] = buf_get_be64(src_bswap + 8); buf_put_le64(dst_bswap + 8, t[0]); buf_put_le64(dst_bswap + 0, t[1]); } } /* Optimized function for combined cipher block xoring and copying. Used by mainly CFB mode decryption. */ static inline void cipher_block_xor_n_copy(void *_dst_xor, void *_srcdst_cpy, const void *_src, size_t blocksize) { cipher_block_xor_n_copy_2(_dst_xor, _src, _srcdst_cpy, _src, blocksize); } #endif /*G10_CIPHER_INTERNAL_H*/ grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/cipher/rsa.c0000644000175000017500000003440015036452441021575 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ #include GRUB_MOD_LICENSE ("GPLv3+"); /* rsa.c - RSA implementation * Copyright (C) 1997, 1998, 1999 by Werner Koch (dd9jn) * Copyright (C) 2000, 2001, 2002, 2003, 2008 Free Software Foundation, Inc. * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . */ /* This code uses an algorithm protected by U.S. Patent #4,405,829 which expired on September 20, 2000. The patent holder placed that patent into the public domain on Sep 6th, 2000. */ #include "g10lib.h" #include "mpi.h" #include "cipher.h" #include "pubkey-internal.h" #include "const-time.h" typedef struct { gcry_mpi_t n; /* modulus */ gcry_mpi_t e; /* exponent */ } RSA_public_key; typedef struct { gcry_mpi_t n; /* public modulus */ gcry_mpi_t e; /* public exponent */ gcry_mpi_t d; /* exponent */ gcry_mpi_t p; /* prime p. */ gcry_mpi_t q; /* prime q. */ gcry_mpi_t u; /* inverse of p mod q. */ } RSA_secret_key; static const char *rsa_names[] = { "rsa", "openpgp-rsa", "oid.1.2.840.113549.1.1.1", NULL, }; /* A sample 2048 bit RSA key used for the selftests. */ /* A sample 2048 bit RSA key used for the selftests (public only). */ static int check_secret_key (RSA_secret_key *sk); static void public (gcry_mpi_t output, gcry_mpi_t input, RSA_public_key *skey); static unsigned int rsa_get_nbits (gcry_sexp_t parms); /* Check that a freshly generated key actually works. Returns 0 on success. */ /* Callback used by the prime generation to test whether the exponent is suitable. Returns 0 if the test has been passed. */ /**************** * Generate a key pair with a key of size NBITS. * USE_E = 0 let Libcgrypt decide what exponent to use. * = 1 request the use of a "secure" exponent; this is required by some * specification to be 65537. * > 2 Use this public exponent. If the given exponent * is not odd one is internally added to it. * TRANSIENT_KEY: If true, generate the primes using the standard RNG. * Returns: 2 structures filled with all needed values */ /* Check the RSA key length is acceptable for key generation or usage */ static gpg_err_code_t rsa_check_keysize (unsigned int nbits) { if (fips_mode () && nbits < 2048) return GPG_ERR_INV_VALUE; return GPG_ERR_NO_ERROR; } /* Check the RSA key length is acceptable for signature verification * * FIPS allows signature verification with RSA keys of size * 1024, 1280, 1536 and 1792 in legacy mode, but this is up to the * calling application to decide if the signature is legacy and * should be accepted. */ static gpg_err_code_t rsa_check_verify_keysize (unsigned int nbits) { if (fips_mode ()) { if ((nbits >= 1024 && (nbits % 256) == 0) || nbits >= 2048) return GPG_ERR_NO_ERROR; return GPG_ERR_INV_VALUE; } return GPG_ERR_NO_ERROR; } /**************** * Generate a key pair with a key of size NBITS. * USE_E = 0 let Libcgrypt decide what exponent to use. * = 1 request the use of a "secure" exponent; this is required by some * specification to be 65537. * > 2 Use this public exponent. If the given exponent * is not odd one is internally added to it. * TESTPARMS: If set, do not generate but test whether the p,q is probably prime * Returns key with zeroes to not break code calling this function. * TRANSIENT_KEY: If true, generate the primes using the standard RNG. * Returns: 2 structures filled with all needed values */ /* Helper for generate_x931. */ /* Helper for generate_x931. */ /* Variant of the standard key generation code using the algorithm from X9.31. Using this algorithm has the advantage that the generation can be made deterministic which is required for CAVS testing. */ /**************** * Test whether the secret key is valid. * Returns: true if this is a valid key. */ static int check_secret_key( RSA_secret_key *sk ) { int rc; gcry_mpi_t temp = mpi_alloc( mpi_get_nlimbs(sk->p)*2 ); mpi_mul(temp, sk->p, sk->q ); rc = mpi_cmp( temp, sk->n ); mpi_free(temp); return !rc; } /**************** * Public key operation. Encrypt INPUT with PKEY and put result into OUTPUT. * * c = m^e mod n * * Where c is OUTPUT, m is INPUT and e,n are elements of PKEY. */ static void public(gcry_mpi_t output, gcry_mpi_t input, RSA_public_key *pkey ) { if( output == input ) /* powm doesn't like output and input the same */ { gcry_mpi_t x = mpi_alloc( mpi_get_nlimbs(input)*2 ); mpi_powm( x, input, pkey->e, pkey->n ); mpi_set(output, x); mpi_free(x); } else mpi_powm( output, input, pkey->e, pkey->n ); } #if 0 static void stronger_key_check ( RSA_secret_key *skey ) { gcry_mpi_t t = mpi_alloc_secure ( 0 ); gcry_mpi_t t1 = mpi_alloc_secure ( 0 ); gcry_mpi_t t2 = mpi_alloc_secure ( 0 ); gcry_mpi_t phi = mpi_alloc_secure ( 0 ); /* check that n == p * q */ mpi_mul( t, skey->p, skey->q); if (mpi_cmp( t, skey->n) ) log_info ( "RSA Oops: n != p * q\n" ); /* check that p is less than q */ if( mpi_cmp( skey->p, skey->q ) > 0 ) { log_info ("RSA Oops: p >= q - fixed\n"); _gcry_mpi_swap ( skey->p, skey->q); } /* check that e divides neither p-1 nor q-1 */ mpi_sub_ui(t, skey->p, 1 ); mpi_fdiv_r(t, t, skey->e ); if ( !mpi_cmp_ui( t, 0) ) log_info ( "RSA Oops: e divides p-1\n" ); mpi_sub_ui(t, skey->q, 1 ); mpi_fdiv_r(t, t, skey->e ); if ( !mpi_cmp_ui( t, 0) ) log_info ( "RSA Oops: e divides q-1\n" ); /* check that d is correct */ mpi_sub_ui( t1, skey->p, 1 ); mpi_sub_ui( t2, skey->q, 1 ); mpi_mul( phi, t1, t2 ); gcry_mpi_gcd(t, t1, t2); mpi_fdiv_q(t, phi, t); mpi_invm(t, skey->e, t ); if ( mpi_cmp(t, skey->d ) ) { log_info ( "RSA Oops: d is wrong - fixed\n"); mpi_set (skey->d, t); log_printmpi (" fixed d", skey->d); } /* check for correctness of u */ mpi_invm(t, skey->p, skey->q ); if ( mpi_cmp(t, skey->u ) ) { log_info ( "RSA Oops: u is wrong - fixed\n"); mpi_set (skey->u, t); log_printmpi (" fixed u", skey->u); } log_info ( "RSA secret key check finished\n"); mpi_free (t); mpi_free (t1); mpi_free (t2); mpi_free (phi); } #endif /* Secret key operation - standard version. * * m = c^d mod n */ /* Secret key operation - using the CRT. * * m1 = c ^ (d mod (p-1)) mod p * m2 = c ^ (d mod (q-1)) mod q * h = u * (m2 - m1) mod q * m = m1 + h * p */ /* Secret key operation. * Encrypt INPUT with SKEY and put result into * OUTPUT. SKEY has the secret key parameters. */ /********************************************* ************** interface ****************** *********************************************/ #define rsa_generate 0 static gcry_err_code_t rsa_check_secret_key (gcry_sexp_t keyparms) { gcry_err_code_t rc; RSA_secret_key sk = {NULL, NULL, NULL, NULL, NULL, NULL}; /* To check the key we need the optional parameters. */ rc = sexp_extract_param (keyparms, NULL, "nedpqu", &sk.n, &sk.e, &sk.d, &sk.p, &sk.q, &sk.u, NULL); if (rc) goto leave; if (!check_secret_key (&sk)) rc = GPG_ERR_BAD_SECKEY; leave: _gcry_mpi_release (sk.n); _gcry_mpi_release (sk.e); _gcry_mpi_release (sk.d); _gcry_mpi_release (sk.p); _gcry_mpi_release (sk.q); _gcry_mpi_release (sk.u); if (DBG_CIPHER) log_debug ("rsa_testkey => %s\n", gpg_strerror (rc)); return rc; } static gcry_err_code_t rsa_encrypt (gcry_sexp_t *r_ciph, gcry_sexp_t s_data, gcry_sexp_t keyparms) { gcry_err_code_t rc; struct pk_encoding_ctx ctx; gcry_mpi_t data = NULL; RSA_public_key pk = {NULL, NULL}; gcry_mpi_t ciph = NULL; unsigned int nbits = rsa_get_nbits (keyparms); rc = rsa_check_keysize (nbits); if (rc) return rc; _gcry_pk_util_init_encoding_ctx (&ctx, PUBKEY_OP_ENCRYPT, nbits); /* Extract the data. */ rc = _gcry_pk_util_data_to_mpi (s_data, &data, &ctx); if (rc) goto leave; if (DBG_CIPHER) log_mpidump ("rsa_encrypt data", data); if (!data || mpi_is_opaque (data)) { rc = GPG_ERR_INV_DATA; goto leave; } /* Extract the key. */ rc = sexp_extract_param (keyparms, NULL, "ne", &pk.n, &pk.e, NULL); if (rc) goto leave; if (DBG_CIPHER) { log_mpidump ("rsa_encrypt n", pk.n); log_mpidump ("rsa_encrypt e", pk.e); } /* Do RSA computation and build result. */ ciph = mpi_new (0); public (ciph, data, &pk); if (DBG_CIPHER) log_mpidump ("rsa_encrypt res", ciph); if ((ctx.flags & PUBKEY_FLAG_FIXEDLEN)) { /* We need to make sure to return the correct length to avoid problems with missing leading zeroes. */ unsigned char *em; size_t emlen = (mpi_get_nbits (pk.n)+7)/8; rc = _gcry_mpi_to_octet_string (&em, NULL, ciph, emlen); if (!rc) { rc = sexp_build (r_ciph, NULL, "(enc-val(rsa(a%b)))", (int)emlen, em); xfree (em); } } else rc = sexp_build (r_ciph, NULL, "(enc-val(rsa(a%m)))", ciph); leave: _gcry_mpi_release (ciph); _gcry_mpi_release (pk.n); _gcry_mpi_release (pk.e); _gcry_mpi_release (data); _gcry_pk_util_free_encoding_ctx (&ctx); if (DBG_CIPHER) log_debug ("rsa_encrypt => %s\n", gpg_strerror (rc)); return rc; } #define rsa_decrypt 0 #define rsa_sign 0 static gcry_err_code_t rsa_verify (gcry_sexp_t s_sig, gcry_sexp_t s_data, gcry_sexp_t keyparms) { gcry_err_code_t rc; struct pk_encoding_ctx ctx; gcry_sexp_t l1 = NULL; gcry_mpi_t sig = NULL; gcry_mpi_t data = NULL; RSA_public_key pk = { NULL, NULL }; gcry_mpi_t result = NULL; unsigned int nbits = rsa_get_nbits (keyparms); rc = rsa_check_verify_keysize (nbits); if (rc) return rc; _gcry_pk_util_init_encoding_ctx (&ctx, PUBKEY_OP_VERIFY, nbits); /* Extract the data. */ rc = _gcry_pk_util_data_to_mpi (s_data, &data, &ctx); if (rc) goto leave; if (DBG_CIPHER) log_printmpi ("rsa_verify data", data); if (ctx.encoding != PUBKEY_ENC_PSS && mpi_is_opaque (data)) { rc = GPG_ERR_INV_DATA; goto leave; } /* Extract the signature value. */ rc = _gcry_pk_util_preparse_sigval (s_sig, rsa_names, &l1, NULL); if (rc) goto leave; rc = sexp_extract_param (l1, NULL, "s", &sig, NULL); if (rc) goto leave; if (DBG_CIPHER) log_printmpi ("rsa_verify sig", sig); /* Extract the key. */ rc = sexp_extract_param (keyparms, NULL, "ne", &pk.n, &pk.e, NULL); if (rc) goto leave; if (DBG_CIPHER) { log_printmpi ("rsa_verify n", pk.n); log_printmpi ("rsa_verify e", pk.e); } /* Do RSA computation and compare. */ result = mpi_new (0); public (result, sig, &pk); if (DBG_CIPHER) log_printmpi ("rsa_verify cmp", result); if (ctx.verify_cmp) rc = ctx.verify_cmp (&ctx, result); else rc = mpi_cmp (result, data) ? GPG_ERR_BAD_SIGNATURE : 0; leave: _gcry_mpi_release (result); _gcry_mpi_release (pk.n); _gcry_mpi_release (pk.e); _gcry_mpi_release (data); _gcry_mpi_release (sig); sexp_release (l1); _gcry_pk_util_free_encoding_ctx (&ctx); if (DBG_CIPHER) log_debug ("rsa_verify => %s\n", rc?gpg_strerror (rc):"Good"); return rc; } /* Return the number of bits for the key described by PARMS. On error * 0 is returned. The format of PARMS starts with the algorithm name; * for example: * * (rsa * (n ) * (e )) * * More parameters may be given but we only need N here. */ static unsigned int rsa_get_nbits (gcry_sexp_t parms) { gcry_sexp_t l1; gcry_mpi_t n; unsigned int nbits; l1 = sexp_find_token (parms, "n", 1); if (!l1) return 0; /* Parameter N not found. */ n = sexp_nth_mpi (l1, 1, GCRYMPI_FMT_USG); sexp_release (l1); nbits = n? mpi_get_nbits (n) : 0; _gcry_mpi_release (n); return nbits; } /* Compute a keygrip. MD is the hash context which we are going to update. KEYPARAM is an S-expression with the key parameters, this is usually a public key but may also be a secret key. An example of such an S-expression is: (rsa (n #00B...#) (e #010001#)) PKCS-15 says that for RSA only the modulus should be hashed - however, it is not clear whether this is meant to use the raw bytes (assuming this is an unsigned integer) or whether the DER required 0 should be prefixed. We hash the raw bytes. */ static gpg_err_code_t compute_keygrip (gcry_md_hd_t md, gcry_sexp_t keyparam) { gcry_sexp_t l1; const char *data; size_t datalen; l1 = sexp_find_token (keyparam, "n", 1); if (!l1) return GPG_ERR_NO_OBJ; data = sexp_nth_data (l1, 1, &datalen); if (!data) { sexp_release (l1); return GPG_ERR_NO_OBJ; } _gcry_md_write (md, data, datalen); sexp_release (l1); return 0; } /* Self-test section. */ /* Given an S-expression ENCR_DATA of the form: (enc-val (rsa (a a-value))) as returned by gcry_pk_decrypt, return the the A-VALUE. On error, return NULL. */ /* Run a full self-test for ALGO and return 0 on success. */ gcry_pk_spec_t _gcry_pubkey_spec_rsa = { GCRY_PK_RSA, { 0, 1 }, (GCRY_PK_USAGE_SIGN | GCRY_PK_USAGE_ENCR), "RSA", rsa_names, "ne", "nedpqu", "a", "s", "n", rsa_generate, rsa_check_secret_key, rsa_encrypt, rsa_decrypt, rsa_sign, rsa_verify, rsa_get_nbits, compute_keygrip , GRUB_UTIL_MODNAME("gcry_rsa") }; GRUB_MOD_INIT(gcry_rsa) { grub_crypto_pk_rsa = &_gcry_pubkey_spec_rsa; } GRUB_MOD_FINI(gcry_rsa) { grub_crypto_pk_rsa = 0; } grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/cipher/mac-internal.h0000644000175000017500000002101715036452441023367 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ /* mac-internal.h - Internal defs for mac.c * Copyright (C) 2013 Jussi Kivilinna * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . */ #include "g10lib.h" #include "cipher-proto.h" #include "gost.h" /* The data object used to hold a handle to an encryption object. */ struct gcry_mac_handle; /* The data object used to hold poly1305-mac context. */ struct poly1305mac_context_s; /* * * Message authentication code related definitions. * */ /* Magic values for the context structure. */ #define CTX_MAC_MAGIC_NORMAL 0x59d9b8af #define CTX_MAC_MAGIC_SECURE 0x12c27cd0 /* MAC module functions. */ typedef gcry_err_code_t (*gcry_mac_open_func_t)(gcry_mac_hd_t h); typedef void (*gcry_mac_close_func_t)(gcry_mac_hd_t h); typedef gcry_err_code_t (*gcry_mac_setkey_func_t)(gcry_mac_hd_t h, const unsigned char *key, size_t keylen); typedef gcry_err_code_t (*gcry_mac_setiv_func_t)(gcry_mac_hd_t h, const unsigned char *iv, size_t ivlen); typedef gcry_err_code_t (*gcry_mac_reset_func_t)(gcry_mac_hd_t h); typedef gcry_err_code_t (*gcry_mac_write_func_t)(gcry_mac_hd_t h, const unsigned char *inbuf, size_t inlen); typedef gcry_err_code_t (*gcry_mac_read_func_t)(gcry_mac_hd_t h, unsigned char *outbuf, size_t *outlen); typedef gcry_err_code_t (*gcry_mac_verify_func_t)(gcry_mac_hd_t h, const unsigned char *inbuf, size_t inlen); typedef unsigned int (*gcry_mac_get_maclen_func_t)(int algo); typedef unsigned int (*gcry_mac_get_keylen_func_t)(int algo); /* The type used to convey additional information to a MAC. */ typedef gpg_err_code_t (*gcry_mac_set_extra_info_t) (gcry_mac_hd_t h, int what, const void *buffer, size_t buflen); typedef struct gcry_mac_spec_ops { gcry_mac_open_func_t open; gcry_mac_close_func_t close; gcry_mac_setkey_func_t setkey; gcry_mac_setiv_func_t setiv; gcry_mac_reset_func_t reset; gcry_mac_write_func_t write; gcry_mac_read_func_t read; gcry_mac_verify_func_t verify; gcry_mac_get_maclen_func_t get_maclen; gcry_mac_get_keylen_func_t get_keylen; gcry_mac_set_extra_info_t set_extra_info; selftest_func_t selftest; } gcry_mac_spec_ops_t; /* Module specification structure for message authentication codes. */ typedef struct gcry_mac_spec { int algo; struct { unsigned int disabled:1; unsigned int fips:1; } flags; const char *name; const gcry_mac_spec_ops_t *ops; } gcry_mac_spec_t; /* The handle structure. */ struct gcry_mac_handle { int magic; int algo; const gcry_mac_spec_t *spec; gcry_ctx_t gcry_ctx; union { struct { gcry_md_hd_t md_ctx; int md_algo; } hmac; struct { gcry_cipher_hd_t ctx; int cipher_algo; unsigned int blklen; } cmac; struct { gcry_cipher_hd_t ctx; int cipher_algo; } gmac; struct { struct poly1305mac_context_s *ctx; } poly1305mac; struct { GOST28147_context ctx; u32 n1, n2; unsigned int unused; unsigned int count; unsigned char lastiv[8]; /* IMIT blocksize */ } imit; } u; }; /* * The HMAC algorithm specifications (mac-hmac.c). */ #if USE_SHA1 extern const gcry_mac_spec_t _gcry_mac_type_spec_hmac_sha1; #endif #if USE_SHA256 extern const gcry_mac_spec_t _gcry_mac_type_spec_hmac_sha256; extern const gcry_mac_spec_t _gcry_mac_type_spec_hmac_sha224; #endif #if USE_SHA512 extern const gcry_mac_spec_t _gcry_mac_type_spec_hmac_sha512; extern const gcry_mac_spec_t _gcry_mac_type_spec_hmac_sha384; extern const gcry_mac_spec_t _gcry_mac_type_spec_hmac_sha512_224; extern const gcry_mac_spec_t _gcry_mac_type_spec_hmac_sha512_256; #endif #if USE_SHA3 extern const gcry_mac_spec_t _gcry_mac_type_spec_hmac_sha3_224; extern const gcry_mac_spec_t _gcry_mac_type_spec_hmac_sha3_256; extern const gcry_mac_spec_t _gcry_mac_type_spec_hmac_sha3_384; extern const gcry_mac_spec_t _gcry_mac_type_spec_hmac_sha3_512; #endif #if USE_GOST_R_3411_94 extern const gcry_mac_spec_t _gcry_mac_type_spec_hmac_gost3411_94; extern const gcry_mac_spec_t _gcry_mac_type_spec_hmac_gost3411_cp; #endif #if USE_GOST_R_3411_12 extern const gcry_mac_spec_t _gcry_mac_type_spec_hmac_stribog256; extern const gcry_mac_spec_t _gcry_mac_type_spec_hmac_stribog512; #endif #if USE_WHIRLPOOL extern const gcry_mac_spec_t _gcry_mac_type_spec_hmac_whirlpool; #endif #if USE_RMD160 extern const gcry_mac_spec_t _gcry_mac_type_spec_hmac_rmd160; #endif #if USE_TIGER extern const gcry_mac_spec_t _gcry_mac_type_spec_hmac_tiger1; #endif #if USE_MD5 extern const gcry_mac_spec_t _gcry_mac_type_spec_hmac_md5; #endif #if USE_MD4 extern const gcry_mac_spec_t _gcry_mac_type_spec_hmac_md4; #endif #if USE_BLAKE2 extern const gcry_mac_spec_t _gcry_mac_type_spec_hmac_blake2b_512; extern const gcry_mac_spec_t _gcry_mac_type_spec_hmac_blake2b_384; extern const gcry_mac_spec_t _gcry_mac_type_spec_hmac_blake2b_256; extern const gcry_mac_spec_t _gcry_mac_type_spec_hmac_blake2b_160; extern const gcry_mac_spec_t _gcry_mac_type_spec_hmac_blake2s_256; extern const gcry_mac_spec_t _gcry_mac_type_spec_hmac_blake2s_224; extern const gcry_mac_spec_t _gcry_mac_type_spec_hmac_blake2s_160; extern const gcry_mac_spec_t _gcry_mac_type_spec_hmac_blake2s_128; #endif #if USE_SM3 extern const gcry_mac_spec_t _gcry_mac_type_spec_hmac_sm3; #endif /* * The CMAC algorithm specifications (mac-cmac.c). */ #if USE_BLOWFISH extern const gcry_mac_spec_t _gcry_mac_type_spec_cmac_blowfish; #endif #if USE_DES extern const gcry_mac_spec_t _gcry_mac_type_spec_cmac_tripledes; #endif #if USE_CAST5 extern const gcry_mac_spec_t _gcry_mac_type_spec_cmac_cast5; #endif #if USE_AES extern const gcry_mac_spec_t _gcry_mac_type_spec_cmac_aes; #endif #if USE_TWOFISH extern const gcry_mac_spec_t _gcry_mac_type_spec_cmac_twofish; #endif #if USE_SERPENT extern const gcry_mac_spec_t _gcry_mac_type_spec_cmac_serpent; #endif #if USE_RFC2268 extern const gcry_mac_spec_t _gcry_mac_type_spec_cmac_rfc2268; #endif #if USE_SEED extern const gcry_mac_spec_t _gcry_mac_type_spec_cmac_seed; #endif #if USE_CAMELLIA extern const gcry_mac_spec_t _gcry_mac_type_spec_cmac_camellia; #endif #if USE_IDEA extern const gcry_mac_spec_t _gcry_mac_type_spec_cmac_idea; #endif #if USE_GOST28147 extern const gcry_mac_spec_t _gcry_mac_type_spec_cmac_gost28147; #endif #if USE_GOST28147 extern const gcry_mac_spec_t _gcry_mac_type_spec_gost28147_imit; #endif #if USE_SM4 extern const gcry_mac_spec_t _gcry_mac_type_spec_cmac_sm4; #endif #if USE_ARIA extern const gcry_mac_spec_t _gcry_mac_type_spec_cmac_aria; #endif /* * The GMAC algorithm specifications (mac-gmac.c). */ #if USE_AES extern const gcry_mac_spec_t _gcry_mac_type_spec_gmac_aes; #endif #if USE_TWOFISH extern const gcry_mac_spec_t _gcry_mac_type_spec_gmac_twofish; #endif #if USE_SERPENT extern const gcry_mac_spec_t _gcry_mac_type_spec_gmac_serpent; #endif #if USE_SEED extern const gcry_mac_spec_t _gcry_mac_type_spec_gmac_seed; #endif #if USE_CAMELLIA extern const gcry_mac_spec_t _gcry_mac_type_spec_gmac_camellia; #endif #if USE_SM4 extern const gcry_mac_spec_t _gcry_mac_type_spec_gmac_sm4; #endif #if USE_ARIA extern const gcry_mac_spec_t _gcry_mac_type_spec_gmac_aria; #endif /* * The Poly1305 MAC algorithm specifications (mac-poly1305.c). */ extern const gcry_mac_spec_t _gcry_mac_type_spec_poly1305mac; #if USE_AES extern const gcry_mac_spec_t _gcry_mac_type_spec_poly1305mac_aes; #endif #if USE_CAMELLIA extern const gcry_mac_spec_t _gcry_mac_type_spec_poly1305mac_camellia; #endif #if USE_TWOFISH extern const gcry_mac_spec_t _gcry_mac_type_spec_poly1305mac_twofish; #endif #if USE_SERPENT extern const gcry_mac_spec_t _gcry_mac_type_spec_poly1305mac_serpent; #endif #if USE_SEED extern const gcry_mac_spec_t _gcry_mac_type_spec_poly1305mac_seed; #endif #if USE_SM4 extern const gcry_mac_spec_t _gcry_mac_type_spec_poly1305mac_sm4; #endif #if USE_ARIA extern const gcry_mac_spec_t _gcry_mac_type_spec_poly1305mac_aria; #endif grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/cipher/hash-common.c0000644000175000017500000000673215036452441023230 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ /* hash-common.c - Common code for hash algorithms * Copyright (C) 2008 Free Software Foundation, Inc. * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . */ #ifdef HAVE_STDINT_H #endif #include "g10lib.h" #include "bufhelp.h" #include "hash-common.h" /* Run a selftest for hash algorithm ALGO. If the resulting digest matches EXPECT/EXPECTLEN and everything else is fine as well, return NULL. If an error occurs, return a static text string describing the error. DATAMODE controls what will be hashed according to this table: 0 - Hash the supplied DATA of DATALEN. 1 - Hash one million times a 'a'. DATA and DATALEN are ignored. */ /* Common function to write a chunk of data to the transform function of a hash algorithm. Note that the use of the term "block" does not imply a fixed size block. Note that we explicitly allow to use this function after the context has been finalized; the result does not have any meaning but writing after finalize is sometimes helpful to mitigate timing attacks. */ void _gcry_md_block_write (void *context, const void *inbuf_arg, size_t inlen) { const unsigned char *inbuf = inbuf_arg; gcry_md_block_ctx_t *hd = context; unsigned int stack_burn = 0; unsigned int nburn; const unsigned int blocksize_shift = hd->blocksize_shift; const unsigned int blocksize = 1 << blocksize_shift; size_t inblocks; size_t copylen; if (sizeof(hd->buf) < blocksize) BUG(); if (!hd->bwrite) return; if (hd->count > blocksize) { /* This happens only when gcry_md_write is called after final. * Writing after final is used for mitigating timing attacks. */ hd->count = 0; } while (hd->count) { if (hd->count == blocksize) /* Flush the buffer. */ { nburn = hd->bwrite (hd, hd->buf, 1); stack_burn = nburn > stack_burn ? nburn : stack_burn; hd->count = 0; if (!++hd->nblocks) hd->nblocks_high++; } else { copylen = inlen; if (copylen > blocksize - hd->count) copylen = blocksize - hd->count; if (copylen == 0) break; buf_cpy (&hd->buf[hd->count], inbuf, copylen); hd->count += copylen; inbuf += copylen; inlen -= copylen; } } if (inlen == 0) return; if (inlen >= blocksize) { inblocks = inlen >> blocksize_shift; nburn = hd->bwrite (hd, inbuf, inblocks); stack_burn = nburn > stack_burn ? nburn : stack_burn; hd->count = 0; hd->nblocks_high += (hd->nblocks + inblocks < inblocks); hd->nblocks += inblocks; inlen -= inblocks << blocksize_shift; inbuf += inblocks << blocksize_shift; } if (inlen) { buf_cpy (hd->buf, inbuf, inlen); hd->count = inlen; } if (stack_burn > 0) _gcry_burn_stack (stack_burn); } grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/cipher/memory.h0000644000175000017500000000003115036452441022316 00000000000000#include grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/cipher/md5.c0000644000175000017500000002234215036452441021477 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ #include GRUB_MOD_LICENSE ("GPLv3+"); /* md5.c - MD5 Message-Digest Algorithm * Copyright (C) 1995,1996,1998,1999,2001,2002, * 2003 Free Software Foundation, Inc. * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . * SPDX-License-Identifier: LGPL-2.1-or-later * * According to the definition of MD5 in RFC 1321 from April 1992. * NOTE: This is *not* the same file as the one from glibc. * Written by Ulrich Drepper , 1995. * heavily modified for GnuPG by Werner Koch */ /* Test values: * "" D4 1D 8C D9 8F 00 B2 04 E9 80 09 98 EC F8 42 7E * "a" 0C C1 75 B9 C0 F1 B6 A8 31 C3 99 E2 69 77 26 61 * "abc 90 01 50 98 3C D2 4F B0 D6 96 3F 7D 28 E1 7F 72 * "message digest" F9 6B 69 7D 7C B7 93 8D 52 5A 2F 31 AA F1 61 D0 */ #include "g10lib.h" #include "cipher.h" #include "bithelp.h" #include "bufhelp.h" #include "hash-common.h" typedef struct { gcry_md_block_ctx_t bctx; u32 A,B,C,D; /* chaining variables */ } MD5_CONTEXT; static unsigned int transform ( void *ctx, const unsigned char *data, size_t datalen ); static void md5_init( void *context, unsigned int flags) { MD5_CONTEXT *ctx = context; (void)flags; ctx->A = 0x67452301; ctx->B = 0xefcdab89; ctx->C = 0x98badcfe; ctx->D = 0x10325476; ctx->bctx.nblocks = 0; ctx->bctx.nblocks_high = 0; ctx->bctx.count = 0; ctx->bctx.blocksize_shift = _gcry_ctz(64); ctx->bctx.bwrite = transform; } /* These are the four functions used in the four steps of the MD5 algorithm and defined in the RFC 1321. The first function is a little bit optimized (as found in Colin Plumbs public domain implementation). */ /* #define FF(b, c, d) ((b & c) | (~b & d)) */ #define FF(b, c, d) (d ^ (b & (c ^ d))) #define FG(b, c, d) FF (d, b, c) #define FH(b, c, d) (b ^ c ^ d) #define FI(b, c, d) (c ^ (b | ~d)) /**************** * transform 64 bytes */ static unsigned int transform_blk ( void *c, const unsigned char *data ) { MD5_CONTEXT *ctx = c; u32 correct_words[16]; register u32 A = ctx->A; register u32 B = ctx->B; register u32 C = ctx->C; register u32 D = ctx->D; u32 *cwp = correct_words; int i; for ( i = 0; i < 16; i++ ) correct_words[i] = buf_get_le32(data + i * 4); #define OP(a, b, c, d, s, T) \ do \ { \ a += FF (b, c, d) + (*cwp++) + T; \ a = rol(a, s); \ a += b; \ } \ while (0) /* Before we start, one word about the strange constants. They are defined in RFC 1321 as T[i] = (int) (4294967296.0 * fabs (sin (i))), i=1..64 */ /* Round 1. */ OP (A, B, C, D, 7, 0xd76aa478); OP (D, A, B, C, 12, 0xe8c7b756); OP (C, D, A, B, 17, 0x242070db); OP (B, C, D, A, 22, 0xc1bdceee); OP (A, B, C, D, 7, 0xf57c0faf); OP (D, A, B, C, 12, 0x4787c62a); OP (C, D, A, B, 17, 0xa8304613); OP (B, C, D, A, 22, 0xfd469501); OP (A, B, C, D, 7, 0x698098d8); OP (D, A, B, C, 12, 0x8b44f7af); OP (C, D, A, B, 17, 0xffff5bb1); OP (B, C, D, A, 22, 0x895cd7be); OP (A, B, C, D, 7, 0x6b901122); OP (D, A, B, C, 12, 0xfd987193); OP (C, D, A, B, 17, 0xa679438e); OP (B, C, D, A, 22, 0x49b40821); #undef OP #define OP(f, a, b, c, d, k, s, T) \ do \ { \ a += f (b, c, d) + correct_words[k] + T; \ a = rol(a, s); \ a += b; \ } \ while (0) /* Round 2. */ OP (FG, A, B, C, D, 1, 5, 0xf61e2562); OP (FG, D, A, B, C, 6, 9, 0xc040b340); OP (FG, C, D, A, B, 11, 14, 0x265e5a51); OP (FG, B, C, D, A, 0, 20, 0xe9b6c7aa); OP (FG, A, B, C, D, 5, 5, 0xd62f105d); OP (FG, D, A, B, C, 10, 9, 0x02441453); OP (FG, C, D, A, B, 15, 14, 0xd8a1e681); OP (FG, B, C, D, A, 4, 20, 0xe7d3fbc8); OP (FG, A, B, C, D, 9, 5, 0x21e1cde6); OP (FG, D, A, B, C, 14, 9, 0xc33707d6); OP (FG, C, D, A, B, 3, 14, 0xf4d50d87); OP (FG, B, C, D, A, 8, 20, 0x455a14ed); OP (FG, A, B, C, D, 13, 5, 0xa9e3e905); OP (FG, D, A, B, C, 2, 9, 0xfcefa3f8); OP (FG, C, D, A, B, 7, 14, 0x676f02d9); OP (FG, B, C, D, A, 12, 20, 0x8d2a4c8a); /* Round 3. */ OP (FH, A, B, C, D, 5, 4, 0xfffa3942); OP (FH, D, A, B, C, 8, 11, 0x8771f681); OP (FH, C, D, A, B, 11, 16, 0x6d9d6122); OP (FH, B, C, D, A, 14, 23, 0xfde5380c); OP (FH, A, B, C, D, 1, 4, 0xa4beea44); OP (FH, D, A, B, C, 4, 11, 0x4bdecfa9); OP (FH, C, D, A, B, 7, 16, 0xf6bb4b60); OP (FH, B, C, D, A, 10, 23, 0xbebfbc70); OP (FH, A, B, C, D, 13, 4, 0x289b7ec6); OP (FH, D, A, B, C, 0, 11, 0xeaa127fa); OP (FH, C, D, A, B, 3, 16, 0xd4ef3085); OP (FH, B, C, D, A, 6, 23, 0x04881d05); OP (FH, A, B, C, D, 9, 4, 0xd9d4d039); OP (FH, D, A, B, C, 12, 11, 0xe6db99e5); OP (FH, C, D, A, B, 15, 16, 0x1fa27cf8); OP (FH, B, C, D, A, 2, 23, 0xc4ac5665); /* Round 4. */ OP (FI, A, B, C, D, 0, 6, 0xf4292244); OP (FI, D, A, B, C, 7, 10, 0x432aff97); OP (FI, C, D, A, B, 14, 15, 0xab9423a7); OP (FI, B, C, D, A, 5, 21, 0xfc93a039); OP (FI, A, B, C, D, 12, 6, 0x655b59c3); OP (FI, D, A, B, C, 3, 10, 0x8f0ccc92); OP (FI, C, D, A, B, 10, 15, 0xffeff47d); OP (FI, B, C, D, A, 1, 21, 0x85845dd1); OP (FI, A, B, C, D, 8, 6, 0x6fa87e4f); OP (FI, D, A, B, C, 15, 10, 0xfe2ce6e0); OP (FI, C, D, A, B, 6, 15, 0xa3014314); OP (FI, B, C, D, A, 13, 21, 0x4e0811a1); OP (FI, A, B, C, D, 4, 6, 0xf7537e82); OP (FI, D, A, B, C, 11, 10, 0xbd3af235); OP (FI, C, D, A, B, 2, 15, 0x2ad7d2bb); OP (FI, B, C, D, A, 9, 21, 0xeb86d391); /* Put checksum in context given as argument. */ ctx->A += A; ctx->B += B; ctx->C += C; ctx->D += D; return /*burn_stack*/ 80+6*sizeof(void*); } static unsigned int transform ( void *c, const unsigned char *data, size_t nblks ) { unsigned int burn; do { burn = transform_blk (c, data); data += 64; } while (--nblks); return burn; } /* The routine final terminates the message-digest computation and * ends with the desired message digest in mdContext->digest[0...15]. * The handle is prepared for a new MD5 cycle. * Returns 16 bytes representing the digest. */ static void md5_final( void *context) { MD5_CONTEXT *hd = context; u32 t, th, msb, lsb; byte *p; unsigned int burn; t = hd->bctx.nblocks; if (sizeof t == sizeof hd->bctx.nblocks) th = hd->bctx.nblocks_high; else th = hd->bctx.nblocks >> 32; /* multiply by 64 to make a byte count */ lsb = t << 6; msb = (th << 6) | (t >> 26); /* add the count */ t = lsb; if( (lsb += hd->bctx.count) < t ) msb++; /* multiply by 8 to make a bit count */ t = lsb; lsb <<= 3; msb <<= 3; msb |= t >> 29; if (hd->bctx.count < 56) /* enough room */ { hd->bctx.buf[hd->bctx.count++] = 0x80; /* pad */ if (hd->bctx.count < 56) memset (&hd->bctx.buf[hd->bctx.count], 0, 56 - hd->bctx.count); /* append the 64 bit count */ buf_put_le32(hd->bctx.buf + 56, lsb); buf_put_le32(hd->bctx.buf + 60, msb); burn = transform (hd, hd->bctx.buf, 1); } else /* need one extra block */ { hd->bctx.buf[hd->bctx.count++] = 0x80; /* pad character */ /* fill pad and next block with zeroes */ memset (&hd->bctx.buf[hd->bctx.count], 0, 64 - hd->bctx.count + 56); /* append the 64 bit count */ buf_put_le32(hd->bctx.buf + 64 + 56, lsb); buf_put_le32(hd->bctx.buf + 64 + 60, msb); burn = transform (hd, hd->bctx.buf, 2); } p = hd->bctx.buf; #define X(a) do { buf_put_le32(p, hd->a); p += 4; } while(0) X(A); X(B); X(C); X(D); #undef X hd->bctx.count = 0; _gcry_burn_stack (burn); } static byte * md5_read( void *context ) { MD5_CONTEXT *hd = (MD5_CONTEXT *) context; return hd->bctx.buf; } static const byte asn[18] = /* Object ID is 1.2.840.113549.2.5 */ { 0x30, 0x20, 0x30, 0x0c, 0x06, 0x08, 0x2a, 0x86,0x48, 0x86, 0xf7, 0x0d, 0x02, 0x05, 0x05, 0x00, 0x04, 0x10 }; static const gcry_md_oid_spec_t oid_spec_md5[] = { /* iso.member-body.us.rsadsi.pkcs.pkcs-1.4 (md5WithRSAEncryption) */ { "1.2.840.113549.1.1.4" }, /* RSADSI digestAlgorithm MD5 */ { "1.2.840.113549.2.5" }, { NULL }, }; gcry_md_spec_t _gcry_digest_spec_md5 = { GCRY_MD_MD5, {0, 1}, "MD5", asn, DIM (asn), oid_spec_md5, 16, md5_init, _gcry_md_block_write, md5_final, md5_read, NULL, NULL, sizeof (MD5_CONTEXT) , GRUB_UTIL_MODNAME("gcry_md5") .blocksize = 64 }; GRUB_MOD_INIT(gcry_md5) { grub_md_register (&_gcry_digest_spec_md5); } GRUB_MOD_FINI(gcry_md5) { grub_md_unregister (&_gcry_digest_spec_md5); } grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/cipher/md.c0000644000175000017500000005437715036452441021427 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ /* md.c - message digest dispatcher * Copyright (C) 1998, 1999, 2002, 2003, 2006, * 2008 Free Software Foundation, Inc. * Copyright (C) 2013, 2014 g10 Code GmbH * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . */ #include #include #include #include #include #include "g10lib.h" #include "cipher.h" #define _gcry_md_selftest(a,b,c) 0 typedef struct gcry_md_list { const gcry_md_spec_t *spec; struct gcry_md_list *next; size_t actual_struct_size; /* Allocated size of this structure. */ PROPERLY_ALIGNED_TYPE context[1]; } GcryDigestEntry; /* This is the list of the digest implementations included in libgcrypt. */ /* This structure is put right after the gcry_md_hd_t buffer, so that * only one memory block is needed. */ struct gcry_md_context { int magic; struct { unsigned int secure:1; unsigned int finalized:1; unsigned int bugemu1:1; unsigned int hmac:1; } flags; size_t actual_handle_size; /* Allocated size of this handle. */ FILE *debug; GcryDigestEntry *list; }; #define CTX_MAGIC_NORMAL 0x11071961 #define CTX_MAGIC_SECURE 0x16917011 static gcry_err_code_t md_enable (gcry_md_hd_t hd, int algo); static void md_close (gcry_md_hd_t a); static void md_write (gcry_md_hd_t a, const void *inbuf, size_t inlen); static byte *md_read( gcry_md_hd_t a, int algo ); static int md_digest_length( int algo ); static void md_start_debug ( gcry_md_hd_t a, const char *suffix ); static void md_stop_debug ( gcry_md_hd_t a ); /* Return the spec structure for the hash algorithm ALGO. For an unknown algorithm NULL is returned. */ /* Lookup a hash's spec by its name. */ #define spec_from_name grub_crypto_lookup_md_by_name /* Lookup a hash's spec by its OID. */ #define search_oid(a,b) grub_crypto_lookup_md_by_oid(a) /**************** * Map a string to the digest algo */ int _gcry_md_map_name (const char *string) { const gcry_md_spec_t *spec; if (!string) return 0; /* If the string starts with a digit (optionally prefixed with either "OID." or "oid."), we first look into our table of ASN.1 object identifiers to figure out the algorithm */ spec = search_oid (string, NULL); if (spec) return spec->algo; /* Not found, search a matching digest name. */ spec = spec_from_name (string); if (spec) return spec->algo; return 0; } /**************** * This function simply returns the name of the algorithm or some constant * string when there is no algo. It will never return NULL. * Use the macro gcry_md_test_algo() to check whether the algorithm * is valid. */ static gcry_err_code_t check_digest_algo (int algorithm) { const gcry_md_spec_t *spec; spec = spec_from_algo (algorithm); if (spec && !spec->flags.disabled && (spec->flags.fips || !fips_mode ())) return 0; return GPG_ERR_DIGEST_ALGO; } /**************** * Open a message digest handle for use with algorithm ALGO. * More algorithms may be added by md_enable(). The initial algorithm * may be 0. */ static gcry_err_code_t md_open (gcry_md_hd_t *h, int algo, unsigned int flags) { gcry_err_code_t err = 0; int secure = !!(flags & GCRY_MD_FLAG_SECURE); int hmac = !!(flags & GCRY_MD_FLAG_HMAC); int bufsize = secure ? 512 : 1024; gcry_md_hd_t hd; size_t n; /* Allocate a memory area to hold the caller visible buffer with it's * control information and the data required by this module. Set the * context pointer at the beginning to this area. * We have to use this strange scheme because we want to hide the * internal data but have a variable sized buffer. * * +---+------+---........------+-------------+ * !ctx! bctl ! buffer ! private ! * +---+------+---........------+-------------+ * ! ^ * !---------------------------! * * We have to make sure that private is well aligned. */ n = offsetof (struct gcry_md_handle, buf) + bufsize; n = ((n + sizeof (PROPERLY_ALIGNED_TYPE) - 1) / sizeof (PROPERLY_ALIGNED_TYPE)) * sizeof (PROPERLY_ALIGNED_TYPE); /* Allocate and set the Context pointer to the private data */ if (secure) hd = xtrymalloc_secure (n + sizeof (struct gcry_md_context)); else hd = xtrymalloc (n + sizeof (struct gcry_md_context)); if (! hd) err = gpg_err_code_from_errno (errno); if (! err) { struct gcry_md_context *ctx; ctx = (void *) (hd->buf - offsetof (struct gcry_md_handle, buf) + n); /* Setup the globally visible data (bctl in the diagram).*/ hd->ctx = ctx; hd->bufsize = n - offsetof (struct gcry_md_handle, buf); hd->bufpos = 0; /* Initialize the private data. */ wipememory2 (ctx, 0, sizeof *ctx); ctx->magic = secure ? CTX_MAGIC_SECURE : CTX_MAGIC_NORMAL; ctx->actual_handle_size = n + sizeof (struct gcry_md_context); ctx->flags.secure = secure; ctx->flags.hmac = hmac; ctx->flags.bugemu1 = !!(flags & GCRY_MD_FLAG_BUGEMU1); } if (! err) { if (algo) { err = md_enable (hd, algo); if (err) md_close (hd); } } if (! err) *h = hd; return err; } /* Create a message digest object for algorithm ALGO. FLAGS may be given as an bitwise OR of the gcry_md_flags values. ALGO may be given as 0 if the algorithms to be used are later set using gcry_md_enable. H is guaranteed to be a valid handle or NULL on error. */ gcry_err_code_t _gcry_md_open (gcry_md_hd_t *h, int algo, unsigned int flags) { gcry_err_code_t rc; gcry_md_hd_t hd; if ((flags & ~(GCRY_MD_FLAG_SECURE | GCRY_MD_FLAG_HMAC | GCRY_MD_FLAG_BUGEMU1))) rc = GPG_ERR_INV_ARG; else rc = md_open (&hd, algo, flags); *h = rc? NULL : hd; return rc; } static gcry_err_code_t md_enable (gcry_md_hd_t hd, int algorithm) { struct gcry_md_context *h = hd->ctx; const gcry_md_spec_t *spec; GcryDigestEntry *entry; gcry_err_code_t err = 0; for (entry = h->list; entry; entry = entry->next) if (entry->spec->algo == algorithm) return 0; /* Already enabled */ spec = spec_from_algo (algorithm); if (!spec) { log_debug ("md_enable: algorithm %d not available\n", algorithm); err = GPG_ERR_DIGEST_ALGO; } if (!err && spec->flags.disabled) err = GPG_ERR_DIGEST_ALGO; /* Any non-FIPS algorithm should go this way */ if (!err && !spec->flags.fips && fips_mode ()) err = GPG_ERR_DIGEST_ALGO; if (!err && h->flags.hmac && spec->read == NULL) { /* Expandable output function cannot act as part of HMAC. */ err = GPG_ERR_DIGEST_ALGO; } if (!err) { size_t size = (sizeof (*entry) + spec->contextsize * (h->flags.hmac? 3 : 1) - sizeof (entry->context)); /* And allocate a new list entry. */ if (h->flags.secure) entry = xtrymalloc_secure (size); else entry = xtrymalloc (size); if (! entry) err = gpg_err_code_from_errno (errno); else { entry->spec = spec; entry->next = h->list; entry->actual_struct_size = size; h->list = entry; /* And init this instance. */ entry->spec->init (entry->context, h->flags.bugemu1? GCRY_MD_FLAG_BUGEMU1:0); } } return err; } gcry_err_code_t _gcry_md_enable (gcry_md_hd_t hd, int algorithm) { return md_enable (hd, algorithm); } static gcry_err_code_t md_copy (gcry_md_hd_t ahd, gcry_md_hd_t *b_hd) { gcry_err_code_t err = 0; struct gcry_md_context *a = ahd->ctx; struct gcry_md_context *b; GcryDigestEntry *ar, *br; gcry_md_hd_t bhd; size_t n; if (ahd->bufpos) md_write (ahd, NULL, 0); n = (char *) ahd->ctx - (char *) ahd; if (a->flags.secure) bhd = xtrymalloc_secure (n + sizeof (struct gcry_md_context)); else bhd = xtrymalloc (n + sizeof (struct gcry_md_context)); if (!bhd) { err = gpg_err_code_from_syserror (); goto leave; } bhd->ctx = b = (void *) ((char *) bhd + n); /* No need to copy the buffer due to the write above. */ gcry_assert (ahd->bufsize == (n - offsetof (struct gcry_md_handle, buf))); bhd->bufsize = ahd->bufsize; bhd->bufpos = 0; gcry_assert (! ahd->bufpos); memcpy (b, a, sizeof *a); b->list = NULL; b->debug = NULL; /* Copy the complete list of algorithms. The copied list is reversed, but that doesn't matter. */ for (ar = a->list; ar; ar = ar->next) { if (a->flags.secure) br = xtrymalloc_secure (ar->actual_struct_size); else br = xtrymalloc (ar->actual_struct_size); if (!br) { err = gpg_err_code_from_syserror (); md_close (bhd); goto leave; } memcpy (br, ar, ar->actual_struct_size); br->next = b->list; b->list = br; } if (a->debug) md_start_debug (bhd, "unknown"); *b_hd = bhd; leave: return err; } gcry_err_code_t _gcry_md_copy (gcry_md_hd_t *handle, gcry_md_hd_t hd) { gcry_err_code_t rc; rc = md_copy (hd, handle); if (rc) *handle = NULL; return rc; } /* * Reset all contexts and discard any buffered stuff. This may be used * instead of a md_close(); md_open(). */ void _gcry_md_reset (gcry_md_hd_t a) { GcryDigestEntry *r; /* Note: We allow this even in fips non operational mode. */ a->bufpos = a->ctx->flags.finalized = 0; if (a->ctx->flags.hmac) for (r = a->ctx->list; r; r = r->next) { memcpy (r->context, (char *)r->context + r->spec->contextsize, r->spec->contextsize); } else for (r = a->ctx->list; r; r = r->next) { memset (r->context, 0, r->spec->contextsize); (*r->spec->init) (r->context, a->ctx->flags.bugemu1? GCRY_MD_FLAG_BUGEMU1:0); } } static void md_close (gcry_md_hd_t a) { GcryDigestEntry *r, *r2; if (! a) return; if (a->ctx->debug) md_stop_debug (a); for (r = a->ctx->list; r; r = r2) { r2 = r->next; wipememory (r, r->actual_struct_size); xfree (r); } wipememory (a, a->ctx->actual_handle_size); xfree(a); } void _gcry_md_close (gcry_md_hd_t hd) { /* Note: We allow this even in fips non operational mode. */ md_close (hd); } static void md_write (gcry_md_hd_t a, const void *inbuf, size_t inlen) { GcryDigestEntry *r; for (r = a->ctx->list; r; r = r->next) { if (a->bufpos) (*r->spec->write) (r->context, a->buf, a->bufpos); (*r->spec->write) (r->context, inbuf, inlen); } a->bufpos = 0; } /* Note that this function may be used after finalize and read to keep on writing to the transform function so to mitigate timing attacks. */ void _gcry_md_write (gcry_md_hd_t hd, const void *inbuf, size_t inlen) { md_write (hd, inbuf, inlen); } static void md_final (gcry_md_hd_t a) { GcryDigestEntry *r; if (a->ctx->flags.finalized) return; if (a->bufpos) md_write (a, NULL, 0); for (r = a->ctx->list; r; r = r->next) (*r->spec->final) (r->context); a->ctx->flags.finalized = 1; if (!a->ctx->flags.hmac) return; for (r = a->ctx->list; r; r = r->next) { byte *p; size_t dlen = r->spec->mdlen; byte *hash; gcry_err_code_t err; if (r->spec->read == NULL) continue; p = r->spec->read (r->context); if (a->ctx->flags.secure) hash = xtrymalloc_secure (dlen); else hash = xtrymalloc (dlen); if (!hash) { err = gpg_err_code_from_errno (errno); _gcry_fatal_error (err, NULL); } memcpy (hash, p, dlen); memcpy (r->context, (char *)r->context + r->spec->contextsize * 2, r->spec->contextsize); (*r->spec->write) (r->context, hash, dlen); (*r->spec->final) (r->context); xfree (hash); } } static gcry_err_code_t md_customize (gcry_md_hd_t h, void *buffer, size_t buflen) { gcry_err_code_t rc = 0; GcryDigestEntry *r; int algo_had_customize = 0; if (!h->ctx->list) return GPG_ERR_DIGEST_ALGO; /* Might happen if no algo is enabled. */ for (r = h->ctx->list; r; r = r->next) { switch (r->spec->algo) { case GCRY_MD_CSHAKE128: case GCRY_MD_CSHAKE256: algo_had_customize = 1; if (buflen != sizeof (struct gcry_cshake_customization)) rc = GPG_ERR_INV_ARG; else rc = _gcry_cshake_customize (r->context, buffer); break; default: rc = GPG_ERR_DIGEST_ALGO; break; } if (rc) break; } if (rc && !algo_had_customize) { /* None of algorithms had customize implementation, so contexts were not * modified. Just return error. */ return rc; } else if (rc && algo_had_customize) { /* Some of the contexts have been modified, but got error. Reset * all contexts. */ _gcry_md_reset (h); return rc; } return 0; } gcry_err_code_t _gcry_md_ctl (gcry_md_hd_t hd, int cmd, void *buffer, size_t buflen) { gcry_err_code_t rc = 0; (void)buflen; /* Currently not used. */ switch (cmd) { case GCRYCTL_FINALIZE: md_final (hd); break; case GCRYCTL_START_DUMP: md_start_debug (hd, buffer); break; case GCRYCTL_STOP_DUMP: md_stop_debug ( hd ); break; case GCRYCTL_MD_CUSTOMIZE: rc = md_customize (hd, buffer, buflen); break; default: rc = GPG_ERR_INV_OP; } return rc; } /* The new debug interface. If SUFFIX is a string it creates an debug file for the context HD. IF suffix is NULL, the file is closed and debugging is stopped. */ /**************** * If ALGO is null get the digest for the used algo (which should be * only one) */ static byte * md_read( gcry_md_hd_t a, int algo ) { GcryDigestEntry *r = a->ctx->list; if (! algo) { /* Return the first algorithm */ if (r) { if (r->next) log_debug ("more than one algorithm in md_read(0)\n"); if (r->spec->read) return r->spec->read (r->context); } } else { for (r = a->ctx->list; r; r = r->next) if (r->spec->algo == algo) { if (r->spec->read) return r->spec->read (r->context); break; } } if (r && !r->spec->read) _gcry_fatal_error (GPG_ERR_DIGEST_ALGO, "requested algo has no fixed digest length"); else _gcry_fatal_error (GPG_ERR_DIGEST_ALGO, "requested algo not in md context"); return NULL; } /* * Read out the complete digest, this function implictly finalizes * the hash. */ byte * _gcry_md_read (gcry_md_hd_t hd, int algo) { /* This function is expected to always return a digest, thus we can't return an error which we actually should do in non-operational state. */ _gcry_md_ctl (hd, GCRYCTL_FINALIZE, NULL, 0); return md_read (hd, algo); } /**************** * If ALGO is null get the digest for the used algo (which should be * only one) */ /* * Expand the output from XOF class digest, this function implictly finalizes * the hash. */ /* * Read out an intermediate digest. Not yet functional. */ /* * Shortcut function to hash a buffer with a given algo. The only * guaranteed supported algorithms are RIPE-MD160 and SHA-1. The * supplied digest buffer must be large enough to store the resulting * hash. No error is returned, the function will abort on an invalid * algo. DISABLED_ALGOS are ignored here. */ void _gcry_md_hash_buffer (int algo, void *digest, const void *buffer, size_t length) { const gcry_md_spec_t *spec; spec = spec_from_algo (algo); if (!spec) { log_debug ("md_hash_buffer: algorithm %d not available\n", algo); return; } #if 0 if (spec->hash_buffers != NULL) { gcry_buffer_t iov; iov.size = 0; iov.data = (void *)buffer; iov.off = 0; iov.len = length; if (spec->flags.disabled || (!spec->flags.fips && fips_mode ())) log_bug ("gcry_md_hash_buffer failed for algo %d: %s", algo, gpg_strerror (gcry_error (GPG_ERR_DIGEST_ALGO))); spec->hash_buffers (digest, spec->mdlen, &iov, 1); } else #endif { /* For the others we do not have a fast function, so we use the normal functions. */ gcry_md_hd_t h; gpg_err_code_t err; err = md_open (&h, algo, 0); if (err) log_bug ("gcry_md_open failed for algo %d: %s", algo, gpg_strerror (gcry_error(err))); md_write (h, (byte *) buffer, length); md_final (h); memcpy (digest, md_read (h, algo), md_digest_length (algo)); md_close (h); } } /* Shortcut function to hash multiple buffers with a given algo. In contrast to gcry_md_hash_buffer, this function returns an error on invalid arguments or on other problems; disabled algorithms are _not_ ignored but flagged as an error. The data to sign is taken from the array IOV which has IOVCNT items. The only supported flag in FLAGS is GCRY_MD_FLAG_HMAC which turns this function into a HMAC function; the first item in IOV is then used as the key. On success 0 is returned and resulting hash or HMAC is stored at DIGEST. DIGESTLEN may be given as -1, in which case DIGEST must have been provided by the caller with an appropriate length. DIGESTLEN may also be the appropriate length or, in case of XOF algorithms, DIGESTLEN indicates number bytes to extract from XOF to DIGEST. */ #define _gcry_md_hash_buffers 0 /* Shortcut function to hash multiple buffers with a given algo. In contrast to gcry_md_hash_buffer, this function returns an error on invalid arguments or on other problems; disabled algorithms are _not_ ignored but flagged as an error. The data to sign is taken from the array IOV which has IOVCNT items. The only supported flag in FLAGS is GCRY_MD_FLAG_HMAC which turns this function into a HMAC function; the first item in IOV is then used as the key. On success 0 is returned and resulting hash or HMAC is stored at DIGEST which must have been provided by the caller with an appropriate length. */ #define _gcry_md_hash_buffers 0 /**************** * Return the length of the digest */ static int md_digest_length (int algorithm) { const gcry_md_spec_t *spec; spec = spec_from_algo (algorithm); return spec? spec->mdlen : 0; } /**************** * Return the length of the digest in bytes. * This function will return 0 in case of errors. */ unsigned int _gcry_md_get_algo_dlen (int algorithm) { return md_digest_length (algorithm); } /* Hmmm: add a mode to enumerate the OIDs * to make g10/sig-check.c more portable */ static const byte * md_asn_oid (int algorithm, size_t *asnlen, size_t *mdlen) { const gcry_md_spec_t *spec; const byte *asnoid = NULL; spec = spec_from_algo (algorithm); if (spec) { if (asnlen) *asnlen = spec->asnlen; if (mdlen) *mdlen = spec->mdlen; asnoid = spec->asnoid; } else log_bug ("no ASN.1 OID for md algo %d\n", algorithm); return asnoid; } /**************** * Return information about the given cipher algorithm * WHAT select the kind of information returned: * GCRYCTL_TEST_ALGO: * Returns 0 when the specified algorithm is available for use. * buffer and nbytes must be zero. * GCRYCTL_GET_ASNOID: * Return the ASNOID of the algorithm in buffer. if buffer is NULL, only * the required length is returned. * GCRYCTL_SELFTEST * Helper for the regression tests - shall not be used by applications. * * Note: Because this function is in most cases used to return an * integer value, we can make it easier for the caller to just look at * the return value. The caller will in all cases consult the value * and thereby detecting whether a error occurred or not (i.e. while checking * the block size) */ gcry_err_code_t _gcry_md_algo_info (int algo, int what, void *buffer, size_t *nbytes) { gcry_err_code_t rc; switch (what) { case GCRYCTL_TEST_ALGO: if (buffer || nbytes) rc = GPG_ERR_INV_ARG; else rc = check_digest_algo (algo); break; case GCRYCTL_GET_ASNOID: /* We need to check that the algo is available because md_asn_oid would otherwise raise an assertion. */ rc = check_digest_algo (algo); if (!rc) { const char unsigned *asn; size_t asnlen; asn = md_asn_oid (algo, &asnlen, NULL); if (buffer && (*nbytes >= asnlen)) { memcpy (buffer, asn, asnlen); *nbytes = asnlen; } else if (!buffer && nbytes) *nbytes = asnlen; else { if (buffer) rc = GPG_ERR_TOO_SHORT; else rc = GPG_ERR_INV_ARG; } } break; case GCRYCTL_SELFTEST: /* Helper function for the regression tests. */ rc = gpg_err_code (_gcry_md_selftest (algo, nbytes? (int)*nbytes : 0, NULL)); break; default: rc = GPG_ERR_INV_OP; break; } return rc; } static void md_start_debug ( gcry_md_hd_t md, const char *suffix ) { (void) md; (void) suffix; } static void md_stop_debug( gcry_md_hd_t md ) { (void) md; } /* * Return information about the digest handle. * GCRYCTL_IS_SECURE: * Returns 1 when the handle works on secured memory * otherwise 0 is returned. There is no error return. * GCRYCTL_IS_ALGO_ENABLED: * Returns 1 if the algo is enabled for that handle. * The algo must be passed as the address of an int. */ /* Explicitly initialize this module. */ /* Run the selftests for digest algorithm ALGO with optional reporting function REPORT. */ grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/cipher/hash-common.h0000644000175000017500000000400515036452441023224 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ /* hash-common.h - Declarations of common code for hash algorithms. * Copyright (C) 2008 Free Software Foundation, Inc. * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . */ #ifndef GCRY_HASH_COMMON_H #define GCRY_HASH_COMMON_H #include "types.h" const char * _gcry_hash_selftest_check_one /**/ (int algo, int datamode, const void *data, size_t datalen, const void *expect, size_t expectlen); /* Type for the md_write helper function. */ typedef unsigned int (*_gcry_md_block_write_t) (void *c, const unsigned char *blks, size_t nblks); #if (defined(USE_SHA512) || defined(USE_WHIRLPOOL)) /* SHA-512 and Whirlpool needs u64. SHA-512 needs larger buffer. */ # define MD_BLOCK_MAX_BLOCKSIZE 128 # define MD_NBLOCKS_TYPE u64 #else # define MD_BLOCK_MAX_BLOCKSIZE 64 # define MD_NBLOCKS_TYPE u32 #endif /* SHA1 needs 2x64 bytes and SHA-512 needs 128 bytes. */ #define MD_BLOCK_CTX_BUFFER_SIZE 128 typedef struct gcry_md_block_ctx { byte buf[MD_BLOCK_CTX_BUFFER_SIZE]; MD_NBLOCKS_TYPE nblocks; MD_NBLOCKS_TYPE nblocks_high; int count; unsigned int blocksize_shift; _gcry_md_block_write_t bwrite; } gcry_md_block_ctx_t; void _gcry_md_block_write( void *context, const void *inbuf_arg, size_t inlen); #endif /*GCRY_HASH_COMMON_H*/ grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/cipher/sha256.c0000644000175000017500000005177615036452441022037 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ #include GRUB_MOD_LICENSE ("GPLv3+"); /* sha256.c - SHA256 hash function * Copyright (C) 2003, 2006, 2008, 2009 Free Software Foundation, Inc. * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . */ /* Test vectors: "abc" SHA224: 23097d22 3405d822 8642a477 bda255b3 2aadbce4 bda0b3f7 e36c9da7 SHA256: ba7816bf 8f01cfea 414140de 5dae2223 b00361a3 96177a9c b410ff61 f20015ad "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" SHA224: 75388b16 512776cc 5dba5da1 fd890150 b0c6455c b4f58b19 52522525 SHA256: 248d6a61 d20638b8 e5c02693 0c3e6039 a33ce459 64ff2167 f6ecedd4 19db06c1 "a" one million times SHA224: 20794655 980c91d8 bbb4c1ea 97618a4b f03f4258 1948b2ee 4ee7ad67 SHA256: cdc76e5c 9914fb92 81a1c7e2 84d73e67 f1809a48 a497200e 046d39cc c7112cd0 */ #include "g10lib.h" #include "bithelp.h" #include "bufhelp.h" #include "cipher.h" #include "hash-common.h" /* USE_SSSE3 indicates whether to compile with Intel SSSE3 code. */ #undef USE_SSSE3 #if defined(__x86_64__) && defined(HAVE_GCC_INLINE_ASM_SSSE3) && \ defined(HAVE_INTEL_SYNTAX_PLATFORM_AS) && \ (defined(HAVE_COMPATIBLE_GCC_AMD64_PLATFORM_AS) || \ defined(HAVE_COMPATIBLE_GCC_WIN64_PLATFORM_AS)) # define USE_SSSE3 1 #endif /* USE_AVX indicates whether to compile with Intel AVX code. */ #undef USE_AVX #if defined(__x86_64__) && defined(HAVE_GCC_INLINE_ASM_AVX) && \ defined(HAVE_INTEL_SYNTAX_PLATFORM_AS) && \ (defined(HAVE_COMPATIBLE_GCC_AMD64_PLATFORM_AS) || \ defined(HAVE_COMPATIBLE_GCC_WIN64_PLATFORM_AS)) # define USE_AVX 1 #endif /* USE_AVX2 indicates whether to compile with Intel AVX2/BMI2 code. */ #undef USE_AVX2 #if defined(__x86_64__) && defined(HAVE_GCC_INLINE_ASM_AVX2) && \ defined(HAVE_GCC_INLINE_ASM_BMI2) && \ defined(HAVE_INTEL_SYNTAX_PLATFORM_AS) && \ (defined(HAVE_COMPATIBLE_GCC_AMD64_PLATFORM_AS) || \ defined(HAVE_COMPATIBLE_GCC_WIN64_PLATFORM_AS)) # define USE_AVX2 1 #endif /* USE_SHAEXT indicates whether to compile with Intel SHA Extension code. */ #undef USE_SHAEXT #if defined(HAVE_GCC_INLINE_ASM_SHAEXT) && \ defined(HAVE_GCC_INLINE_ASM_SSE41) && \ defined(ENABLE_SHAEXT_SUPPORT) # define USE_SHAEXT 1 #endif /* USE_ARM_CE indicates whether to enable ARMv8 Crypto Extension assembly * code. */ #undef USE_ARM_CE #ifdef ENABLE_ARM_CRYPTO_SUPPORT # if defined(HAVE_ARM_ARCH_V6) && defined(__ARMEL__) \ && defined(HAVE_COMPATIBLE_GCC_ARM_PLATFORM_AS) \ && defined(HAVE_GCC_INLINE_ASM_AARCH32_CRYPTO) # define USE_ARM_CE 1 # elif defined(__AARCH64EL__) \ && defined(HAVE_COMPATIBLE_GCC_AARCH64_PLATFORM_AS) \ && defined(HAVE_GCC_INLINE_ASM_AARCH64_CRYPTO) # define USE_ARM_CE 1 # endif #endif /* USE_PPC_CRYPTO indicates whether to enable PowerPC vector crypto * accelerated code. */ #undef USE_PPC_CRYPTO #ifdef ENABLE_PPC_CRYPTO_SUPPORT # if defined(HAVE_COMPATIBLE_CC_PPC_ALTIVEC) && \ defined(HAVE_GCC_INLINE_ASM_PPC_ALTIVEC) # if __GNUC__ >= 4 # define USE_PPC_CRYPTO 1 # endif # endif #endif /* USE_S390X_CRYPTO indicates whether to enable zSeries code. */ #undef USE_S390X_CRYPTO #if defined(HAVE_GCC_INLINE_ASM_S390X) # define USE_S390X_CRYPTO 1 #endif /* USE_S390X_CRYPTO */ typedef struct { gcry_md_block_ctx_t bctx; u32 h[8]; #ifdef USE_S390X_CRYPTO u32 final_len_msb, final_len_lsb; /* needs to be right after h[7]. */ int use_s390x_crypto; #endif } SHA256_CONTEXT; /* Assembly implementations use SystemV ABI, ABI conversion and additional * stack to store XMM6-XMM15 needed on Win64. */ #undef ASM_FUNC_ABI #undef ASM_EXTRA_STACK #if defined(USE_SSSE3) || defined(USE_AVX) || defined(USE_AVX2) || \ defined(USE_SHAEXT) # ifdef HAVE_COMPATIBLE_GCC_WIN64_PLATFORM_AS # define ASM_FUNC_ABI __attribute__((sysv_abi)) # define ASM_EXTRA_STACK (10 * 16 + sizeof(void *) * 4) # else # define ASM_FUNC_ABI # define ASM_EXTRA_STACK 0 # endif #endif #ifdef USE_SSSE3 unsigned int _gcry_sha256_transform_amd64_ssse3(const void *input_data, u32 state[8], size_t num_blks) ASM_FUNC_ABI; static unsigned int do_sha256_transform_amd64_ssse3(void *ctx, const unsigned char *data, size_t nblks) { SHA256_CONTEXT *hd = ctx; return _gcry_sha256_transform_amd64_ssse3 (data, hd->h, nblks) + ASM_EXTRA_STACK; } #endif #ifdef USE_AVX unsigned int _gcry_sha256_transform_amd64_avx(const void *input_data, u32 state[8], size_t num_blks) ASM_FUNC_ABI; static unsigned int do_sha256_transform_amd64_avx(void *ctx, const unsigned char *data, size_t nblks) { SHA256_CONTEXT *hd = ctx; return _gcry_sha256_transform_amd64_avx (data, hd->h, nblks) + ASM_EXTRA_STACK; } #endif #ifdef USE_AVX2 unsigned int _gcry_sha256_transform_amd64_avx2(const void *input_data, u32 state[8], size_t num_blks) ASM_FUNC_ABI; static unsigned int do_sha256_transform_amd64_avx2(void *ctx, const unsigned char *data, size_t nblks) { SHA256_CONTEXT *hd = ctx; return _gcry_sha256_transform_amd64_avx2 (data, hd->h, nblks) + ASM_EXTRA_STACK; } #endif #ifdef USE_SHAEXT /* Does not need ASM_FUNC_ABI */ unsigned int _gcry_sha256_transform_intel_shaext(u32 state[8], const unsigned char *input_data, size_t num_blks); static unsigned int do_sha256_transform_intel_shaext(void *ctx, const unsigned char *data, size_t nblks) { SHA256_CONTEXT *hd = ctx; return _gcry_sha256_transform_intel_shaext (hd->h, data, nblks); } #endif #ifdef USE_ARM_CE unsigned int _gcry_sha256_transform_armv8_ce(u32 state[8], const void *input_data, size_t num_blks); static unsigned int do_sha256_transform_armv8_ce(void *ctx, const unsigned char *data, size_t nblks) { SHA256_CONTEXT *hd = ctx; return _gcry_sha256_transform_armv8_ce (hd->h, data, nblks); } #endif #ifdef USE_PPC_CRYPTO unsigned int _gcry_sha256_transform_ppc8(u32 state[8], const unsigned char *input_data, size_t num_blks); unsigned int _gcry_sha256_transform_ppc9(u32 state[8], const unsigned char *input_data, size_t num_blks); static unsigned int do_sha256_transform_ppc8(void *ctx, const unsigned char *data, size_t nblks) { SHA256_CONTEXT *hd = ctx; return _gcry_sha256_transform_ppc8 (hd->h, data, nblks); } static unsigned int do_sha256_transform_ppc9(void *ctx, const unsigned char *data, size_t nblks) { SHA256_CONTEXT *hd = ctx; return _gcry_sha256_transform_ppc9 (hd->h, data, nblks); } #endif #ifdef USE_S390X_CRYPTO #include "asm-inline-s390x.h" static unsigned int do_sha256_transform_s390x (void *ctx, const unsigned char *data, size_t nblks) { SHA256_CONTEXT *hd = ctx; kimd_execute (KMID_FUNCTION_SHA256, hd->h, data, nblks * 64); return 0; } static unsigned int do_sha256_final_s390x (void *ctx, const unsigned char *data, size_t datalen, u32 len_msb, u32 len_lsb) { SHA256_CONTEXT *hd = ctx; /* Make sure that 'final_len' is positioned at correct offset relative * to 'h[0]'. This is because we are passing 'h[0]' pointer as start of * parameter block to 'klmd' instruction. */ gcry_assert (offsetof (SHA256_CONTEXT, final_len_msb) - offsetof (SHA256_CONTEXT, h[0]) == 8 * sizeof(u32)); gcry_assert (offsetof (SHA256_CONTEXT, final_len_lsb) - offsetof (SHA256_CONTEXT, final_len_msb) == 1 * sizeof(u32)); hd->final_len_msb = len_msb; hd->final_len_lsb = len_lsb; klmd_execute (KMID_FUNCTION_SHA256, hd->h, data, datalen); return 0; } #endif static unsigned int do_transform_generic (void *ctx, const unsigned char *data, size_t nblks); static void sha256_common_init (SHA256_CONTEXT *hd) { unsigned int features = _gcry_get_hw_features (); hd->bctx.nblocks = 0; hd->bctx.nblocks_high = 0; hd->bctx.count = 0; hd->bctx.blocksize_shift = _gcry_ctz(64); /* Order of feature checks is important here; last match will be * selected. Keep slower implementations at the top and faster at * the bottom. */ hd->bctx.bwrite = do_transform_generic; #ifdef USE_SSSE3 if ((features & HWF_INTEL_SSSE3) != 0) hd->bctx.bwrite = do_sha256_transform_amd64_ssse3; #endif #ifdef USE_AVX /* AVX implementation uses SHLD which is known to be slow on non-Intel CPUs. * Therefore use this implementation on Intel CPUs only. */ if ((features & HWF_INTEL_AVX) && (features & HWF_INTEL_FAST_SHLD)) hd->bctx.bwrite = do_sha256_transform_amd64_avx; #endif #ifdef USE_AVX2 if ((features & HWF_INTEL_AVX2) && (features & HWF_INTEL_BMI2)) hd->bctx.bwrite = do_sha256_transform_amd64_avx2; #endif #ifdef USE_SHAEXT if ((features & HWF_INTEL_SHAEXT) && (features & HWF_INTEL_SSE4_1)) hd->bctx.bwrite = do_sha256_transform_intel_shaext; #endif #ifdef USE_ARM_CE if ((features & HWF_ARM_SHA2) != 0) hd->bctx.bwrite = do_sha256_transform_armv8_ce; #endif #ifdef USE_PPC_CRYPTO if ((features & HWF_PPC_VCRYPTO) != 0) hd->bctx.bwrite = do_sha256_transform_ppc8; if ((features & HWF_PPC_VCRYPTO) != 0 && (features & HWF_PPC_ARCH_3_00) != 0) hd->bctx.bwrite = do_sha256_transform_ppc9; #endif #ifdef USE_S390X_CRYPTO hd->use_s390x_crypto = 0; if ((features & HWF_S390X_MSA) != 0) { if ((kimd_query () & km_function_to_mask (KMID_FUNCTION_SHA256)) && (klmd_query () & km_function_to_mask (KMID_FUNCTION_SHA256))) { hd->bctx.bwrite = do_sha256_transform_s390x; hd->use_s390x_crypto = 1; } } #endif (void)features; } static void sha256_init (void *context, unsigned int flags) { SHA256_CONTEXT *hd = context; (void)flags; hd->h[0] = 0x6a09e667; hd->h[1] = 0xbb67ae85; hd->h[2] = 0x3c6ef372; hd->h[3] = 0xa54ff53a; hd->h[4] = 0x510e527f; hd->h[5] = 0x9b05688c; hd->h[6] = 0x1f83d9ab; hd->h[7] = 0x5be0cd19; sha256_common_init (hd); } static void sha224_init (void *context, unsigned int flags) { SHA256_CONTEXT *hd = context; (void)flags; hd->h[0] = 0xc1059ed8; hd->h[1] = 0x367cd507; hd->h[2] = 0x3070dd17; hd->h[3] = 0xf70e5939; hd->h[4] = 0xffc00b31; hd->h[5] = 0x68581511; hd->h[6] = 0x64f98fa7; hd->h[7] = 0xbefa4fa4; sha256_common_init (hd); } /* Transform the message X which consists of 16 32-bit-words. See FIPS 180-2 for details. */ #define R(a,b,c,d,e,f,g,h,k,w) do \ { \ t1 = (h) + Sum1((e)) + Cho((e),(f),(g)) + (k) + (w); \ t2 = Sum0((a)) + Maj((a),(b),(c)); \ d += t1; \ h = t1 + t2; \ } while (0) /* (4.2) same as SHA-1's F1. */ #define Cho(x, y, z) (z ^ (x & (y ^ z))) /* (4.3) same as SHA-1's F3 */ #define Maj(x, y, z) ((x & y) + (z & (x ^ y))) /* (4.4) */ #define Sum0(x) (ror (x, 2) ^ ror (x, 13) ^ ror (x, 22)) /* (4.5) */ #define Sum1(x) (ror (x, 6) ^ ror (x, 11) ^ ror (x, 25)) /* Message expansion */ #define S0(x) (ror ((x), 7) ^ ror ((x), 18) ^ ((x) >> 3)) /* (4.6) */ #define S1(x) (ror ((x), 17) ^ ror ((x), 19) ^ ((x) >> 10)) /* (4.7) */ #define I(i) ( w[i] = buf_get_be32(data + i * 4) ) #define W(i) ( w[i&0x0f] = S1(w[(i-2) &0x0f]) \ + w[(i-7) &0x0f] \ + S0(w[(i-15)&0x0f]) \ + w[(i-16)&0x0f] ) static unsigned int do_transform_generic (void *ctx, const unsigned char *data, size_t nblks) { SHA256_CONTEXT *hd = ctx; static const u32 K[64] = { 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 }; do { u32 a,b,c,d,e,f,g,h,t1,t2; u32 w[16]; a = hd->h[0]; b = hd->h[1]; c = hd->h[2]; d = hd->h[3]; e = hd->h[4]; f = hd->h[5]; g = hd->h[6]; h = hd->h[7]; R(a, b, c, d, e, f, g, h, K[0], I(0)); R(h, a, b, c, d, e, f, g, K[1], I(1)); R(g, h, a, b, c, d, e, f, K[2], I(2)); R(f, g, h, a, b, c, d, e, K[3], I(3)); R(e, f, g, h, a, b, c, d, K[4], I(4)); R(d, e, f, g, h, a, b, c, K[5], I(5)); R(c, d, e, f, g, h, a, b, K[6], I(6)); R(b, c, d, e, f, g, h, a, K[7], I(7)); R(a, b, c, d, e, f, g, h, K[8], I(8)); R(h, a, b, c, d, e, f, g, K[9], I(9)); R(g, h, a, b, c, d, e, f, K[10], I(10)); R(f, g, h, a, b, c, d, e, K[11], I(11)); R(e, f, g, h, a, b, c, d, K[12], I(12)); R(d, e, f, g, h, a, b, c, K[13], I(13)); R(c, d, e, f, g, h, a, b, K[14], I(14)); R(b, c, d, e, f, g, h, a, K[15], I(15)); R(a, b, c, d, e, f, g, h, K[16], W(16)); R(h, a, b, c, d, e, f, g, K[17], W(17)); R(g, h, a, b, c, d, e, f, K[18], W(18)); R(f, g, h, a, b, c, d, e, K[19], W(19)); R(e, f, g, h, a, b, c, d, K[20], W(20)); R(d, e, f, g, h, a, b, c, K[21], W(21)); R(c, d, e, f, g, h, a, b, K[22], W(22)); R(b, c, d, e, f, g, h, a, K[23], W(23)); R(a, b, c, d, e, f, g, h, K[24], W(24)); R(h, a, b, c, d, e, f, g, K[25], W(25)); R(g, h, a, b, c, d, e, f, K[26], W(26)); R(f, g, h, a, b, c, d, e, K[27], W(27)); R(e, f, g, h, a, b, c, d, K[28], W(28)); R(d, e, f, g, h, a, b, c, K[29], W(29)); R(c, d, e, f, g, h, a, b, K[30], W(30)); R(b, c, d, e, f, g, h, a, K[31], W(31)); R(a, b, c, d, e, f, g, h, K[32], W(32)); R(h, a, b, c, d, e, f, g, K[33], W(33)); R(g, h, a, b, c, d, e, f, K[34], W(34)); R(f, g, h, a, b, c, d, e, K[35], W(35)); R(e, f, g, h, a, b, c, d, K[36], W(36)); R(d, e, f, g, h, a, b, c, K[37], W(37)); R(c, d, e, f, g, h, a, b, K[38], W(38)); R(b, c, d, e, f, g, h, a, K[39], W(39)); R(a, b, c, d, e, f, g, h, K[40], W(40)); R(h, a, b, c, d, e, f, g, K[41], W(41)); R(g, h, a, b, c, d, e, f, K[42], W(42)); R(f, g, h, a, b, c, d, e, K[43], W(43)); R(e, f, g, h, a, b, c, d, K[44], W(44)); R(d, e, f, g, h, a, b, c, K[45], W(45)); R(c, d, e, f, g, h, a, b, K[46], W(46)); R(b, c, d, e, f, g, h, a, K[47], W(47)); R(a, b, c, d, e, f, g, h, K[48], W(48)); R(h, a, b, c, d, e, f, g, K[49], W(49)); R(g, h, a, b, c, d, e, f, K[50], W(50)); R(f, g, h, a, b, c, d, e, K[51], W(51)); R(e, f, g, h, a, b, c, d, K[52], W(52)); R(d, e, f, g, h, a, b, c, K[53], W(53)); R(c, d, e, f, g, h, a, b, K[54], W(54)); R(b, c, d, e, f, g, h, a, K[55], W(55)); R(a, b, c, d, e, f, g, h, K[56], W(56)); R(h, a, b, c, d, e, f, g, K[57], W(57)); R(g, h, a, b, c, d, e, f, K[58], W(58)); R(f, g, h, a, b, c, d, e, K[59], W(59)); R(e, f, g, h, a, b, c, d, K[60], W(60)); R(d, e, f, g, h, a, b, c, K[61], W(61)); R(c, d, e, f, g, h, a, b, K[62], W(62)); R(b, c, d, e, f, g, h, a, K[63], W(63)); hd->h[0] += a; hd->h[1] += b; hd->h[2] += c; hd->h[3] += d; hd->h[4] += e; hd->h[5] += f; hd->h[6] += g; hd->h[7] += h; data += 64; } while (--nblks); return 26*4 + 32 + 3 * sizeof(void*); } #undef S0 #undef S1 #undef R /* The routine finally terminates the computation and returns the digest. The handle is prepared for a new cycle, but adding bytes to the handle will the destroy the returned buffer. Returns: 32 bytes with the message the digest. */ static void sha256_final(void *context) { SHA256_CONTEXT *hd = context; u32 t, th, msb, lsb; byte *p; unsigned int burn; t = hd->bctx.nblocks; if (sizeof t == sizeof hd->bctx.nblocks) th = hd->bctx.nblocks_high; else th = hd->bctx.nblocks >> 32; /* multiply by 64 to make a byte count */ lsb = t << 6; msb = (th << 6) | (t >> 26); /* add the count */ t = lsb; if ((lsb += hd->bctx.count) < t) msb++; /* multiply by 8 to make a bit count */ t = lsb; lsb <<= 3; msb <<= 3; msb |= t >> 29; if (0) { } #ifdef USE_S390X_CRYPTO else if (hd->use_s390x_crypto) { burn = do_sha256_final_s390x (hd, hd->bctx.buf, hd->bctx.count, msb, lsb); } #endif else if (hd->bctx.count < 56) /* enough room */ { hd->bctx.buf[hd->bctx.count++] = 0x80; /* pad */ if (hd->bctx.count < 56) memset (&hd->bctx.buf[hd->bctx.count], 0, 56 - hd->bctx.count); /* append the 64 bit count */ buf_put_be32(hd->bctx.buf + 56, msb); buf_put_be32(hd->bctx.buf + 60, lsb); burn = (*hd->bctx.bwrite) (hd, hd->bctx.buf, 1); } else /* need one extra block */ { hd->bctx.buf[hd->bctx.count++] = 0x80; /* pad character */ /* fill pad and next block with zeroes */ memset (&hd->bctx.buf[hd->bctx.count], 0, 64 - hd->bctx.count + 56); /* append the 64 bit count */ buf_put_be32(hd->bctx.buf + 64 + 56, msb); buf_put_be32(hd->bctx.buf + 64 + 60, lsb); burn = (*hd->bctx.bwrite) (hd, hd->bctx.buf, 2); } p = hd->bctx.buf; #define X(a) do { buf_put_be32(p, hd->h[a]); p += 4; } while(0) X(0); X(1); X(2); X(3); X(4); X(5); X(6); X(7); #undef X hd->bctx.count = 0; _gcry_burn_stack (burn); } static byte * sha256_read (void *context) { SHA256_CONTEXT *hd = context; return hd->bctx.buf; } /* Shortcut functions which puts the hash value of the supplied buffer iov * into outbuf which must have a size of 32 bytes. */ #define _gcry_sha256_hash_buffers 0 /* Shortcut functions which puts the hash value of the supplied buffer iov * into outbuf which must have a size of 28 bytes. */ #define _gcry_sha224_hash_buffers 0 /* Self-test section. */ /* Run a full self-test for ALGO and return 0 on success. */ static const byte asn224[19] = /* Object ID is 2.16.840.1.101.3.4.2.4 */ { 0x30, 0x2D, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x04, 0x05, 0x00, 0x04, 0x1C }; static const gcry_md_oid_spec_t oid_spec_sha224[] = { /* From RFC3874, Section 4 */ { "2.16.840.1.101.3.4.2.4" }, /* ANSI X9.62 ecdsaWithSHA224 */ { "1.2.840.10045.4.3.1" }, { NULL }, }; static const byte asn256[19] = /* Object ID is 2.16.840.1.101.3.4.2.1 */ { 0x30, 0x31, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05, 0x00, 0x04, 0x20 }; static const gcry_md_oid_spec_t oid_spec_sha256[] = { /* According to the OpenPGP draft rfc2440-bis06 */ { "2.16.840.1.101.3.4.2.1" }, /* PKCS#1 sha256WithRSAEncryption */ { "1.2.840.113549.1.1.11" }, /* ANSI X9.62 ecdsaWithSHA256 */ { "1.2.840.10045.4.3.2" }, { NULL }, }; gcry_md_spec_t _gcry_digest_spec_sha224 = { GCRY_MD_SHA224, {0, 1}, "SHA224", asn224, DIM (asn224), oid_spec_sha224, 28, sha224_init, _gcry_md_block_write, sha256_final, sha256_read, NULL, _gcry_sha224_hash_buffers, sizeof (SHA256_CONTEXT), GRUB_UTIL_MODNAME("gcry_sha256") .blocksize = 64 }; gcry_md_spec_t _gcry_digest_spec_sha256 = { GCRY_MD_SHA256, {0, 1}, "SHA256", asn256, DIM (asn256), oid_spec_sha256, 32, sha256_init, _gcry_md_block_write, sha256_final, sha256_read, NULL, _gcry_sha256_hash_buffers, sizeof (SHA256_CONTEXT), GRUB_UTIL_MODNAME("gcry_sha256") .blocksize = 64 }; GRUB_MOD_INIT(gcry_sha256) { grub_md_register (&_gcry_digest_spec_sha224); grub_md_register (&_gcry_digest_spec_sha256); } GRUB_MOD_FINI(gcry_sha256) { grub_md_unregister (&_gcry_digest_spec_sha224); grub_md_unregister (&_gcry_digest_spec_sha256); } grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/cipher/bulkhelp.h0000644000175000017500000003660115036452441022630 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ /* bulkhelp.h - Some bulk processing helpers * Copyright (C) 2022 Jussi Kivilinna * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . */ #ifndef GCRYPT_BULKHELP_H #define GCRYPT_BULKHELP_H #include "g10lib.h" #include "cipher-internal.h" #ifdef __x86_64__ /* Use u64 to store pointers for x32 support (assembly function assumes * 64-bit pointers). */ typedef u64 ocb_L_uintptr_t; #else typedef uintptr_t ocb_L_uintptr_t; #endif typedef unsigned int (*bulk_crypt_fn_t) (void *ctx, byte *out, const byte *in, size_t num_blks); static inline ocb_L_uintptr_t * bulk_ocb_prepare_L_pointers_array_blk64 (gcry_cipher_hd_t c, ocb_L_uintptr_t Ls[64], u64 blkn) { unsigned int n = 64 - (blkn % 64); unsigned int i; for (i = 0; i < 64; i += 8) { Ls[(i + 0 + n) % 64] = (uintptr_t)(void *)c->u_mode.ocb.L[0]; Ls[(i + 1 + n) % 64] = (uintptr_t)(void *)c->u_mode.ocb.L[1]; Ls[(i + 2 + n) % 64] = (uintptr_t)(void *)c->u_mode.ocb.L[0]; Ls[(i + 3 + n) % 64] = (uintptr_t)(void *)c->u_mode.ocb.L[2]; Ls[(i + 4 + n) % 64] = (uintptr_t)(void *)c->u_mode.ocb.L[0]; Ls[(i + 5 + n) % 64] = (uintptr_t)(void *)c->u_mode.ocb.L[1]; Ls[(i + 6 + n) % 64] = (uintptr_t)(void *)c->u_mode.ocb.L[0]; } Ls[(7 + n) % 64] = (uintptr_t)(void *)c->u_mode.ocb.L[3]; Ls[(15 + n) % 64] = (uintptr_t)(void *)c->u_mode.ocb.L[4]; Ls[(23 + n) % 64] = (uintptr_t)(void *)c->u_mode.ocb.L[3]; Ls[(31 + n) % 64] = (uintptr_t)(void *)c->u_mode.ocb.L[5]; Ls[(39 + n) % 64] = (uintptr_t)(void *)c->u_mode.ocb.L[3]; Ls[(47 + n) % 64] = (uintptr_t)(void *)c->u_mode.ocb.L[4]; Ls[(55 + n) % 64] = (uintptr_t)(void *)c->u_mode.ocb.L[3]; return &Ls[(63 + n) % 64]; } static inline ocb_L_uintptr_t * bulk_ocb_prepare_L_pointers_array_blk32 (gcry_cipher_hd_t c, ocb_L_uintptr_t Ls[32], u64 blkn) { unsigned int n = 32 - (blkn % 32); unsigned int i; for (i = 0; i < 32; i += 8) { Ls[(i + 0 + n) % 32] = (uintptr_t)(void *)c->u_mode.ocb.L[0]; Ls[(i + 1 + n) % 32] = (uintptr_t)(void *)c->u_mode.ocb.L[1]; Ls[(i + 2 + n) % 32] = (uintptr_t)(void *)c->u_mode.ocb.L[0]; Ls[(i + 3 + n) % 32] = (uintptr_t)(void *)c->u_mode.ocb.L[2]; Ls[(i + 4 + n) % 32] = (uintptr_t)(void *)c->u_mode.ocb.L[0]; Ls[(i + 5 + n) % 32] = (uintptr_t)(void *)c->u_mode.ocb.L[1]; Ls[(i + 6 + n) % 32] = (uintptr_t)(void *)c->u_mode.ocb.L[0]; } Ls[(7 + n) % 32] = (uintptr_t)(void *)c->u_mode.ocb.L[3]; Ls[(15 + n) % 32] = (uintptr_t)(void *)c->u_mode.ocb.L[4]; Ls[(23 + n) % 32] = (uintptr_t)(void *)c->u_mode.ocb.L[3]; return &Ls[(31 + n) % 32]; } static inline ocb_L_uintptr_t * bulk_ocb_prepare_L_pointers_array_blk16 (gcry_cipher_hd_t c, ocb_L_uintptr_t Ls[16], u64 blkn) { unsigned int n = 16 - (blkn % 16); unsigned int i; for (i = 0; i < 16; i += 8) { Ls[(i + 0 + n) % 16] = (uintptr_t)(void *)c->u_mode.ocb.L[0]; Ls[(i + 1 + n) % 16] = (uintptr_t)(void *)c->u_mode.ocb.L[1]; Ls[(i + 2 + n) % 16] = (uintptr_t)(void *)c->u_mode.ocb.L[0]; Ls[(i + 3 + n) % 16] = (uintptr_t)(void *)c->u_mode.ocb.L[2]; Ls[(i + 4 + n) % 16] = (uintptr_t)(void *)c->u_mode.ocb.L[0]; Ls[(i + 5 + n) % 16] = (uintptr_t)(void *)c->u_mode.ocb.L[1]; Ls[(i + 6 + n) % 16] = (uintptr_t)(void *)c->u_mode.ocb.L[0]; } Ls[(7 + n) % 16] = (uintptr_t)(void *)c->u_mode.ocb.L[3]; return &Ls[(15 + n) % 16]; } static inline ocb_L_uintptr_t * bulk_ocb_prepare_L_pointers_array_blk8 (gcry_cipher_hd_t c, ocb_L_uintptr_t Ls[8], u64 blkn) { unsigned int n = 8 - (blkn % 8); Ls[(0 + n) % 8] = (uintptr_t)(void *)c->u_mode.ocb.L[0]; Ls[(1 + n) % 8] = (uintptr_t)(void *)c->u_mode.ocb.L[1]; Ls[(2 + n) % 8] = (uintptr_t)(void *)c->u_mode.ocb.L[0]; Ls[(3 + n) % 8] = (uintptr_t)(void *)c->u_mode.ocb.L[2]; Ls[(4 + n) % 8] = (uintptr_t)(void *)c->u_mode.ocb.L[0]; Ls[(5 + n) % 8] = (uintptr_t)(void *)c->u_mode.ocb.L[1]; Ls[(6 + n) % 8] = (uintptr_t)(void *)c->u_mode.ocb.L[0]; Ls[(7 + n) % 8] = (uintptr_t)(void *)c->u_mode.ocb.L[3]; return &Ls[(7 + n) % 8]; } static inline unsigned int bulk_ctr_enc_128 (void *priv, bulk_crypt_fn_t crypt_fn, byte *outbuf, const byte *inbuf, size_t nblocks, byte *ctr, byte *tmpbuf, size_t tmpbuf_nblocks, unsigned int *num_used_tmpblocks) { unsigned int tmp_used = 16; unsigned int burn_depth = 0; unsigned int nburn; while (nblocks >= 1) { size_t curr_blks = nblocks > tmpbuf_nblocks ? tmpbuf_nblocks : nblocks; size_t i; if (curr_blks * 16 > tmp_used) tmp_used = curr_blks * 16; cipher_block_cpy (tmpbuf + 0 * 16, ctr, 16); for (i = 1; i < curr_blks; i++) { cipher_block_cpy (&tmpbuf[i * 16], ctr, 16); cipher_block_add (&tmpbuf[i * 16], i, 16); } cipher_block_add (ctr, curr_blks, 16); nburn = crypt_fn (priv, tmpbuf, tmpbuf, curr_blks); burn_depth = nburn > burn_depth ? nburn : burn_depth; for (i = 0; i < curr_blks; i++) { cipher_block_xor (outbuf, &tmpbuf[i * 16], inbuf, 16); outbuf += 16; inbuf += 16; } nblocks -= curr_blks; } *num_used_tmpblocks = tmp_used; return burn_depth; } static inline unsigned int bulk_ctr32le_enc_128 (void *priv, bulk_crypt_fn_t crypt_fn, byte *outbuf, const byte *inbuf, size_t nblocks, byte *ctr, byte *tmpbuf, size_t tmpbuf_nblocks, unsigned int *num_used_tmpblocks) { unsigned int tmp_used = 16; unsigned int burn_depth = 0; unsigned int nburn; while (nblocks >= 1) { size_t curr_blks = nblocks > tmpbuf_nblocks ? tmpbuf_nblocks : nblocks; u64 ctr_lo = buf_get_le64(ctr + 0 * 8); u64 ctr_hi = buf_get_he64(ctr + 1 * 8); size_t i; if (curr_blks * 16 > tmp_used) tmp_used = curr_blks * 16; cipher_block_cpy (tmpbuf + 0 * 16, ctr, 16); for (i = 1; i < curr_blks; i++) { u32 lo_u32 = (u32)ctr_lo + i; u64 lo_u64 = ctr_lo & ~(u64)(u32)-1; lo_u64 += lo_u32; buf_put_le64(&tmpbuf[0 * 8 + i * 16], lo_u64); buf_put_he64(&tmpbuf[1 * 8 + i * 16], ctr_hi); } buf_put_le32(ctr, (u32)ctr_lo + curr_blks); nburn = crypt_fn (priv, tmpbuf, tmpbuf, curr_blks); burn_depth = nburn > burn_depth ? nburn : burn_depth; for (i = 0; i < curr_blks; i++) { cipher_block_xor (outbuf, &tmpbuf[i * 16], inbuf, 16); outbuf += 16; inbuf += 16; } nblocks -= curr_blks; } *num_used_tmpblocks = tmp_used; return burn_depth; } static inline unsigned int bulk_cbc_dec_128 (void *priv, bulk_crypt_fn_t crypt_fn, byte *outbuf, const byte *inbuf, size_t nblocks, byte *iv, byte *tmpbuf, size_t tmpbuf_nblocks, unsigned int *num_used_tmpblocks) { unsigned int tmp_used = 16; unsigned int burn_depth = 0; unsigned int nburn; while (nblocks >= 1) { size_t curr_blks = nblocks > tmpbuf_nblocks ? tmpbuf_nblocks : nblocks; size_t i; if (curr_blks * 16 > tmp_used) tmp_used = curr_blks * 16; nburn = crypt_fn (priv, tmpbuf, inbuf, curr_blks); burn_depth = nburn > burn_depth ? nburn : burn_depth; for (i = 0; i < curr_blks; i++) { cipher_block_xor_n_copy_2(outbuf, &tmpbuf[i * 16], iv, inbuf, 16); outbuf += 16; inbuf += 16; } nblocks -= curr_blks; } *num_used_tmpblocks = tmp_used; return burn_depth; } static inline unsigned int bulk_cfb_dec_128 (void *priv, bulk_crypt_fn_t crypt_fn, byte *outbuf, const byte *inbuf, size_t nblocks, byte *iv, byte *tmpbuf, size_t tmpbuf_nblocks, unsigned int *num_used_tmpblocks) { unsigned int tmp_used = 16; unsigned int burn_depth = 0; unsigned int nburn; while (nblocks >= 1) { size_t curr_blks = nblocks > tmpbuf_nblocks ? tmpbuf_nblocks : nblocks; size_t i; if (curr_blks * 16 > tmp_used) tmp_used = curr_blks * 16; cipher_block_cpy (&tmpbuf[0 * 16], iv, 16); if (curr_blks > 1) memcpy (&tmpbuf[1 * 16], &inbuf[(1 - 1) * 16], 16 * curr_blks - 16); cipher_block_cpy (iv, &inbuf[(curr_blks - 1) * 16], 16); nburn = crypt_fn (priv, tmpbuf, tmpbuf, curr_blks); burn_depth = nburn > burn_depth ? nburn : burn_depth; for (i = 0; i < curr_blks; i++) { cipher_block_xor (outbuf, inbuf, &tmpbuf[i * 16], 16); outbuf += 16; inbuf += 16; } nblocks -= curr_blks; } *num_used_tmpblocks = tmp_used; return burn_depth; } static inline unsigned int bulk_ocb_crypt_128 (gcry_cipher_hd_t c, void *priv, bulk_crypt_fn_t crypt_fn, byte *outbuf, const byte *inbuf, size_t nblocks, u64 *blkn, int encrypt, byte *tmpbuf, size_t tmpbuf_nblocks, unsigned int *num_used_tmpblocks) { unsigned int tmp_used = 16; unsigned int burn_depth = 0; unsigned int nburn; while (nblocks >= 1) { size_t curr_blks = nblocks > tmpbuf_nblocks ? tmpbuf_nblocks : nblocks; size_t i; if (curr_blks * 16 > tmp_used) tmp_used = curr_blks * 16; for (i = 0; i < curr_blks; i++) { const unsigned char *l = ocb_get_l(c, ++*blkn); /* Checksum_i = Checksum_{i-1} xor P_i */ if (encrypt) cipher_block_xor_1(c->u_ctr.ctr, &inbuf[i * 16], 16); /* Offset_i = Offset_{i-1} xor L_{ntz(i)} */ cipher_block_xor_2dst (&tmpbuf[i * 16], c->u_iv.iv, l, 16); cipher_block_xor (&outbuf[i * 16], &inbuf[i * 16], c->u_iv.iv, 16); } /* C_i = Offset_i xor ENCIPHER(K, P_i xor Offset_i) */ nburn = crypt_fn (priv, outbuf, outbuf, curr_blks); burn_depth = nburn > burn_depth ? nburn : burn_depth; for (i = 0; i < curr_blks; i++) { cipher_block_xor_1 (&outbuf[i * 16], &tmpbuf[i * 16], 16); /* Checksum_i = Checksum_{i-1} xor P_i */ if (!encrypt) cipher_block_xor_1(c->u_ctr.ctr, &outbuf[i * 16], 16); } outbuf += curr_blks * 16; inbuf += curr_blks * 16; nblocks -= curr_blks; } *num_used_tmpblocks = tmp_used; return burn_depth; } static inline unsigned int bulk_ocb_auth_128 (gcry_cipher_hd_t c, void *priv, bulk_crypt_fn_t crypt_fn, const byte *abuf, size_t nblocks, u64 *blkn, byte *tmpbuf, size_t tmpbuf_nblocks, unsigned int *num_used_tmpblocks) { unsigned int tmp_used = 16; unsigned int burn_depth = 0; unsigned int nburn; while (nblocks >= 1) { size_t curr_blks = nblocks > tmpbuf_nblocks ? tmpbuf_nblocks : nblocks; size_t i; if (curr_blks * 16 > tmp_used) tmp_used = curr_blks * 16; for (i = 0; i < curr_blks; i++) { const unsigned char *l = ocb_get_l(c, ++*blkn); /* Offset_i = Offset_{i-1} xor L_{ntz(i)} */ cipher_block_xor_2dst (&tmpbuf[i * 16], c->u_mode.ocb.aad_offset, l, 16); cipher_block_xor_1 (&tmpbuf[i * 16], &abuf[i * 16], 16); } /* C_i = Offset_i xor ENCIPHER(K, P_i xor Offset_i) */ nburn = crypt_fn (priv, tmpbuf, tmpbuf, curr_blks); burn_depth = nburn > burn_depth ? nburn : burn_depth; for (i = 0; i < curr_blks; i++) { cipher_block_xor_1 (c->u_mode.ocb.aad_sum, &tmpbuf[i * 16], 16); } abuf += curr_blks * 16; nblocks -= curr_blks; } *num_used_tmpblocks = tmp_used; return burn_depth; } static inline unsigned int bulk_xts_crypt_128 (void *priv, bulk_crypt_fn_t crypt_fn, byte *outbuf, const byte *inbuf, size_t nblocks, byte *tweak, byte *tmpbuf, size_t tmpbuf_nblocks, unsigned int *num_used_tmpblocks) { u64 tweak_lo, tweak_hi, tweak_next_lo, tweak_next_hi, tmp_lo, tmp_hi, carry; unsigned int tmp_used = 16; unsigned int burn_depth = 0; unsigned int nburn; tweak_next_lo = buf_get_le64 (tweak + 0); tweak_next_hi = buf_get_le64 (tweak + 8); while (nblocks >= 1) { size_t curr_blks = nblocks > tmpbuf_nblocks ? tmpbuf_nblocks : nblocks; size_t i; if (curr_blks * 16 > tmp_used) tmp_used = curr_blks * 16; for (i = 0; i < curr_blks; i++) { tweak_lo = tweak_next_lo; tweak_hi = tweak_next_hi; /* Generate next tweak. */ carry = -(tweak_next_hi >> 63) & 0x87; tweak_next_hi = (tweak_next_hi << 1) + (tweak_next_lo >> 63); tweak_next_lo = (tweak_next_lo << 1) ^ carry; /* Xor-Encrypt/Decrypt-Xor block. */ tmp_lo = buf_get_le64 (inbuf + i * 16 + 0) ^ tweak_lo; tmp_hi = buf_get_le64 (inbuf + i * 16 + 8) ^ tweak_hi; buf_put_he64 (&tmpbuf[i * 16 + 0], tweak_lo); buf_put_he64 (&tmpbuf[i * 16 + 8], tweak_hi); buf_put_le64 (outbuf + i * 16 + 0, tmp_lo); buf_put_le64 (outbuf + i * 16 + 8, tmp_hi); } nburn = crypt_fn (priv, outbuf, outbuf, curr_blks); burn_depth = nburn > burn_depth ? nburn : burn_depth; for (i = 0; i < curr_blks; i++) { /* Xor-Encrypt/Decrypt-Xor block. */ tweak_lo = buf_get_he64 (&tmpbuf[i * 16 + 0]); tweak_hi = buf_get_he64 (&tmpbuf[i * 16 + 8]); tmp_lo = buf_get_le64 (outbuf + i * 16 + 0) ^ tweak_lo; tmp_hi = buf_get_le64 (outbuf + i * 16 + 8) ^ tweak_hi; buf_put_le64 (outbuf + i * 16 + 0, tmp_lo); buf_put_le64 (outbuf + i * 16 + 8, tmp_hi); } inbuf += curr_blks * 16; outbuf += curr_blks * 16; nblocks -= curr_blks; } buf_put_le64 (tweak + 0, tweak_next_lo); buf_put_le64 (tweak + 8, tweak_next_hi); *num_used_tmpblocks = tmp_used; return burn_depth; } static inline unsigned int bulk_ecb_crypt_128 (void *priv, bulk_crypt_fn_t crypt_fn, byte *outbuf, const byte *inbuf, size_t nblocks, size_t fn_max_nblocks) { unsigned int burn_depth = 0; unsigned int nburn; while (nblocks >= 1) { size_t curr_blks = nblocks > fn_max_nblocks ? fn_max_nblocks : nblocks; nburn = crypt_fn (priv, outbuf, inbuf, curr_blks); burn_depth = nburn > burn_depth ? nburn : burn_depth; inbuf += curr_blks * 16; outbuf += curr_blks * 16; nblocks -= curr_blks; } return burn_depth; } #endif /*GCRYPT_BULKHELP_H*/ grub-2.14~git20250718.0e36779/grub-core/lib/libgcrypt-grub/cipher/pubkey-util.c0000644000175000017500000011176415036452441023273 00000000000000/* This file was automatically imported with import_gcry.py. Please don't modify it */ #include GRUB_MOD_LICENSE ("GPLv3+"); /* pubkey-util.c - Supporting functions for all pubkey modules. * Copyright (C) 1998, 1999, 2000, 2002, 2003, 2005, * 2007, 2008, 2011 Free Software Foundation, Inc. * Copyright (C) 2013, 2015 g10 Code GmbH * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, see . */ #include "g10lib.h" #include "mpi.h" #include "cipher.h" #include "pubkey-internal.h" /* Callback for the pubkey algorithm code to verify PSS signatures. OPAQUE is the data provided by the actual caller. The meaning of TMP depends on the actual algorithm (but there is only RSA); now for RSA it is the output of running the public key function on the input. */ static int pss_verify_cmp (void *opaque, gcry_mpi_t tmp) { struct pk_encoding_ctx *ctx = opaque; gcry_mpi_t value = ctx->verify_arg; return _gcry_rsa_pss_verify (value, !(ctx->flags & PUBKEY_FLAG_PREHASH), tmp, ctx->nbits - 1, ctx->hash_algo, ctx->saltlen); } /* Parser for a flag list. On return the encoding is stored at R_ENCODING and the flags are stored at R_FLAGS. If any of them is not needed, NULL may be passed. The function returns 0 on success or an error code. */ gpg_err_code_t _gcry_pk_util_parse_flaglist (gcry_sexp_t list, int *r_flags, enum pk_encoding *r_encoding) { gpg_err_code_t rc = 0; const char *s; size_t n; int i; int encoding = PUBKEY_ENC_UNKNOWN; int flags = 0; int igninvflag = 0; for (i = list ? sexp_length (list)-1 : 0; i > 0; i--) { s = sexp_nth_data (list, i, &n); if (!s) continue; /* Not a data element. */ switch (n) { case 3: if (!memcmp (s, "pss", 3) && encoding == PUBKEY_ENC_UNKNOWN) { encoding = PUBKEY_ENC_PSS; flags |= PUBKEY_FLAG_FIXEDLEN; } else if (!memcmp (s, "raw", 3) && encoding == PUBKEY_ENC_UNKNOWN) { encoding = PUBKEY_ENC_RAW; flags |= PUBKEY_FLAG_RAW_FLAG; /* Explicitly given. */ } else if (!memcmp (s, "sm2", 3)) { encoding = PUBKEY_ENC_RAW; flags |= PUBKEY_FLAG_SM2 | PUBKEY_FLAG_RAW_FLAG; } else if (!igninvflag) rc = GPG_ERR_INV_FLAG; break; case 4: if (!memcmp (s, "comp", 4)) flags |= PUBKEY_FLAG_COMP; else if (!memcmp (s, "oaep", 4) && encoding == PUBKEY_ENC_UNKNOWN) { encoding = PUBKEY_ENC_OAEP; flags |= PUBKEY_FLAG_FIXEDLEN; } else if (!memcmp (s, "gost", 4)) { encoding = PUBKEY_ENC_RAW; flags |= PUBKEY_FLAG_GOST; } else if (!igninvflag) rc = GPG_ERR_INV_FLAG; break; case 5: if (!memcmp (s, "eddsa", 5)) { encoding = PUBKEY_ENC_RAW; flags |= PUBKEY_FLAG_EDDSA; flags |= PUBKEY_FLAG_DJB_TWEAK; } else if (!memcmp (s, "pkcs1", 5) && encoding == PUBKEY_ENC_UNKNOWN) { encoding = PUBKEY_ENC_PKCS1; flags |= PUBKEY_FLAG_FIXEDLEN; } else if (!memcmp (s, "param", 5)) flags |= PUBKEY_FLAG_PARAM; else if (!igninvflag) rc = GPG_ERR_INV_FLAG; break; case 6: if (!memcmp (s, "nocomp", 6)) flags |= PUBKEY_FLAG_NOCOMP; else if (!igninvflag) rc = GPG_ERR_INV_FLAG; break; case 7: if (!memcmp (s, "rfc6979", 7)) flags |= PUBKEY_FLAG_RFC6979; else if (!memcmp (s, "noparam", 7)) ; /* Ignore - it is the default. */ else if (!memcmp (s, "prehash", 7)) flags |= PUBKEY_FLAG_PREHASH; else if (!igninvflag) rc = GPG_ERR_INV_FLAG; break; case 8: if (!memcmp (s, "use-x931", 8)) flags |= PUBKEY_FLAG_USE_X931; else if (!igninvflag) rc = GPG_ERR_INV_FLAG; break; case 9: if (!memcmp (s, "pkcs1-raw", 9) && encoding == PUBKEY_ENC_UNKNOWN) { encoding = PUBKEY_ENC_PKCS1_RAW; flags |= PUBKEY_FLAG_FIXEDLEN; } else if (!memcmp (s, "djb-tweak", 9)) { encoding = PUBKEY_ENC_RAW; flags |= PUBKEY_FLAG_DJB_TWEAK; } else if (!igninvflag) rc = GPG_ERR_INV_FLAG; break; case 10: if (!memcmp (s, "igninvflag", 10)) igninvflag = 1; else if (!memcmp (s, "no-keytest", 10)) flags |= PUBKEY_FLAG_NO_KEYTEST; else if (!igninvflag) rc = GPG_ERR_INV_FLAG; break; case 11: if (!memcmp (s, "no-blinding", 11)) flags |= PUBKEY_FLAG_NO_BLINDING; else if (!memcmp (s, "use-fips186", 11)) flags |= PUBKEY_FLAG_USE_FIPS186; else if (!igninvflag) rc = GPG_ERR_INV_FLAG; break; case 13: if (!memcmp (s, "use-fips186-2", 13)) flags |= PUBKEY_FLAG_USE_FIPS186_2; else if (!memcmp (s, "transient-key", 13)) flags |= PUBKEY_FLAG_TRANSIENT_KEY; else if (!igninvflag) rc = GPG_ERR_INV_FLAG; break; default: if (!igninvflag) rc = GPG_ERR_INV_FLAG; break; } } if (r_flags) *r_flags = flags; if (r_encoding) *r_encoding = encoding; return rc; } static int get_hash_algo (const char *s, size_t n) { static const struct { const char *name; int algo; } hashnames[] = { { "sha1", GCRY_MD_SHA1 }, { "md5", GCRY_MD_MD5 }, { "sha256", GCRY_MD_SHA256 }, { "ripemd160", GCRY_MD_RMD160 }, { "rmd160", GCRY_MD_RMD160 }, { "sha384", GCRY_MD_SHA384 }, { "sha512", GCRY_MD_SHA512 }, { "sha224", GCRY_MD_SHA224 }, { "md2", GCRY_MD_MD2 }, { "md4", GCRY_MD_MD4 }, { "tiger", GCRY_MD_TIGER }, { "haval", GCRY_MD_HAVAL }, { "sha3-224", GCRY_MD_SHA3_224 }, { "sha3-256", GCRY_MD_SHA3_256 }, { "sha3-384", GCRY_MD_SHA3_384 }, { "sha3-512", GCRY_MD_SHA3_512 }, { "sm3", GCRY_MD_SM3 }, { "shake128", GCRY_MD_SHAKE128 }, { "shake256", GCRY_MD_SHAKE256 }, { "sha512-224", GCRY_MD_SHA512_224 }, { "sha512-256", GCRY_MD_SHA512_256 }, { NULL, 0 } }; int algo; int i; for (i=0; hashnames[i].name; i++) { if ( strlen (hashnames[i].name) == n && !memcmp (hashnames[i].name, s, n)) break; } if (hashnames[i].name) algo = hashnames[i].algo; else { /* In case of not listed or dynamically allocated hash algorithm we fall back to this somewhat slower method. Further, it also allows to use OIDs as algorithm names. */ char *tmpname; tmpname = xtrymalloc (n+1); if (!tmpname) algo = 0; /* Out of core - silently give up. */ else { memcpy (tmpname, s, n); tmpname[n] = 0; algo = _gcry_md_map_name (tmpname); xfree (tmpname); } } return algo; } /* Get the "nbits" parameter from an s-expression of the format: * * (algo * (parameter_name_1 ....) * .... * (parameter_name_n ....)) * * Example: * * (rsa * (nbits 4:2048)) * * On success the value for nbits is stored at R_NBITS. If no nbits * parameter is found, the function returns success and stores 0 at * R_NBITS. For parsing errors the function returns an error code and * stores 0 at R_NBITS. */ gpg_err_code_t _gcry_pk_util_get_nbits (gcry_sexp_t list, unsigned int *r_nbits) { char buf[50]; const char *s; size_t n; *r_nbits = 0; list = sexp_find_token (list, "nbits", 0); if (!list) return 0; /* No NBITS found. */ s = sexp_nth_data (list, 1, &n); if (!s || n >= DIM (buf) - 1 ) { /* NBITS given without a cdr. */ sexp_release (list); return GPG_ERR_INV_OBJ; } memcpy (buf, s, n); buf[n] = 0; *r_nbits = (unsigned int)strtoul (buf, NULL, 0); sexp_release (list); return 0; } /* Get the optional "rsa-use-e" parameter from an s-expression of the * format: * * (algo * (parameter_name_1 ....) * .... * (parameter_name_n ....)) * * Example: * * (rsa * (nbits 4:2048) * (rsa-use-e 2:41)) * * On success the value for nbits is stored at R_E. If no rsa-use-e * parameter is found, the function returns success and stores 65537 at * R_E. For parsing errors the function returns an error code and * stores 0 at R_E. */ gpg_err_code_t _gcry_pk_util_get_rsa_use_e (gcry_sexp_t list, unsigned long *r_e) { char buf[50]; const char *s; size_t n; *r_e = 0; list = sexp_find_token (list, "rsa-use-e", 0); if (!list) { *r_e = 65537; /* Not given, use the value generated by old versions. */ return 0; } s = sexp_nth_data (list, 1, &n); if (!s || n >= DIM (buf) - 1 ) { /* No value or value too large. */ sexp_release (list); return GPG_ERR_INV_OBJ; } memcpy (buf, s, n); buf[n] = 0; *r_e = strtoul (buf, NULL, 0); sexp_release (list); return 0; } /* Parse a "sig-val" s-expression and store the inner parameter list at R_PARMS. ALGO_NAMES is used to verify that the algorithm in "sig-val" is valid. Returns 0 on success and stores a new list at R_PARMS which must be freed by the caller. On error R_PARMS is set to NULL and an error code returned. If R_ECCFLAGS is not NULL flag values are set into it; as of now they are only used with ecc algorithms. */ gpg_err_code_t _gcry_pk_util_preparse_sigval (gcry_sexp_t s_sig, const char **algo_names, gcry_sexp_t *r_parms, int *r_eccflags) { gpg_err_code_t rc; gcry_sexp_t l1 = NULL; gcry_sexp_t l2 = NULL; char *name = NULL; int i; *r_parms = NULL; if (r_eccflags) *r_eccflags = 0; /* Extract the signature value. */ l1 = sexp_find_token (s_sig, "sig-val", 0); if (!l1) { rc = GPG_ERR_INV_OBJ; /* Does not contain a signature value object. */ goto leave; } l2 = sexp_nth (l1, 1); if (!l2) { rc = GPG_ERR_NO_OBJ; /* No cadr for the sig object. */ goto leave; } name = sexp_nth_string (l2, 0); if (!name) { rc = GPG_ERR_INV_OBJ; /* Invalid structure of object. */ goto leave; } else if (!strcmp (name, "flags")) { /* Skip a "flags" parameter and look again for the algorithm name. This is not used but here just for the sake of consistent S-expressions we need to handle it. */ sexp_release (l2); l2 = sexp_nth (l1, 2); if (!l2) { rc = GPG_ERR_INV_OBJ; goto leave; } xfree (name); name = sexp_nth_string (l2, 0); if (!name) { rc = GPG_ERR_INV_OBJ; /* Invalid structure of object. */ goto leave; } } for (i=0; algo_names[i]; i++) if (!stricmp (name, algo_names[i])) break; if (!algo_names[i]) { rc = GPG_ERR_CONFLICT; /* "sig-val" uses an unexpected algo. */ goto leave; } if (r_eccflags) { if (!strcmp (name, "eddsa")) *r_eccflags = PUBKEY_FLAG_EDDSA; if (!strcmp (name, "gost")) *r_eccflags = PUBKEY_FLAG_GOST; if (!strcmp (name, "sm2")) *r_eccflags = PUBKEY_FLAG_SM2; } *r_parms = l2; l2 = NULL; rc = 0; leave: xfree (name); sexp_release (l2); sexp_release (l1); return rc; } /* Parse a "enc-val" s-expression and store the inner parameter list at R_PARMS. ALGO_NAMES is used to verify that the algorithm in "enc-val" is valid. Returns 0 on success and stores a new list at R_PARMS which must be freed by the caller. On error R_PARMS is set to NULL and an error code returned. If R_ECCFLAGS is not NULL flag values are set into it; as of now they are only used with ecc algorithms. (enc-val [(flags [raw, pkcs1, oaep, no-blinding])] [(hash-algo )] [(label

-6o|kܛ_I(<ܗX]]iرx>ҊcDN-NYFKxZAc1f" ցf ~m>}֣,`wah>B)t68.xK%{9["H; lfz7./Z7: El~gtÊq߿H/`O?MAӶѶt388(]QeMLveiQ>0s`ཌ svaZכdZW,ua^0Wai"ph, )E K_Ij%YAܐ- Cap^P[ ЗP,W *HՌnFS̤1*E2VŬW15C6 &r؆.*3V_y0h>@&J`8 ,хc#B"288H8,dll4IJEJMòLLFuH4J8acgJ`zrYFES'(UMNC:+=qӳ'_^G\כ_} IY\^Ceju4\>W^`woO.F(K|GY^[;@* }ZQIgN%1 4G7tA"K\r5:dh$B^g|l~ 2];{TX,%c.W_~?\RtD_yy>u\̛/cO&J3 <_ҕJ)}=w{GXŕ_tqEYn}q>}B`_=\t? eLѕso>p^g4[;K%B [;(eUV"`/7|B$P*rȲc0 pVZJ&nl&'߼0mmm_c~a/<NQ;mŨyv{!i8F|yxߓ{:,ů##B۹'Nzƾksguu͋-;t;~V淟q00i"M繸K ;oYb w. I2tt&}ҹ30~-$cW|4K+;܆"a~ S(n .ӲJD"eYt @e,g=6!W(284DZcw/ltdIJQBa-arפ?wl[i26,7叏ireQ[5$lyrVv i)V?7ii$9zLaÓI~]CO=KV-ݿO8"|wvMOژ<9X޾ŪjY}Ft0<3wr9φxApʼn qyM1۲^ĉztz'٩POcLtsb2euH2(Jp<8lG<<ߛYawwu@KcZ o5"I~7X2;w@yY@E0B^쵶~d|Wk>s .6ߩuݍ,4cx]WQɭ]>L-/ q4ZJMur曔G)w<$ֿI?Mf:=7bi ln`\xjiA ,5 Z:brqܟúV)n;$Hrte'n##dsCOh<~v(Jᚠ6^JOOL?C\l`sllp8ܸ g ;ݻf4wf|י?*J Yb}}DBҭ-ï:jZ}m` $7M6mۗLGM|"k~䙝#XFG Żz+2 { WYC-0UZ^2;2 _2d}uwgTRt ;FTJ]:nM|z@7$7ȴH5qCqQdP8BIU5LbppK3<%D2c~i]z K*eu}U ;go/MV# I$"Z aslr\.O$F$P+vww BT*Lq]]I83ǧ83wJN<$eY Ʃ'Ϣ:sN{|'o,c9f}Ȳ;7n3w8^X![,s D}GdqmLKO/X^8W/ysy&!EEܹ7@|L&KEU=ZlFH&xET+D!'('ySu3mzݑ9Y㛷x8_{V֙_XlWVX䭚wOs)%ON:%cO+v:ݱP4x1R!ѵ6FXֶezxʾj5:,$Ss+޻ FEp${_kv|l N _._d{7~E@ZE ?#+23=A_/CK*|xSd>;XZ^% ѕL: M~lzrYEUg2e !I/T=MӨTk7I#Q,FeR{0\3T?(Ǽu491i F]..|IftTxM\8L6C._ PD b6iSV+^b[2F@"IF|#Kes9`}  ř9~L6eYNmnFq[EE&I=3GR䉓_^inhW֙=Ր=cS BJtz9?vrkW<s"I.u G&ϿIû94MaqX]ܬ')QJ X%/hϜjhNltyL*hp%wt = %L&[ ^S[|sr C< Clnmzܹsx]t^ NV<Ib)qseGug}1~ÿgZô,.^~C̜8𳟾E6癧%AAspy0IMa$sq>$N^V, #gO!Zv$$$,]èU a dh7-qwe kw)!zGYM-ױtlzKbuadnXF4"@jKׄmy`\e '-ӓmv}@,œ"p/%vl9!wa ɊS#C111A:cp_{MaJN:C@<`td}\KΰL'r^VvfxpW \9{p8V:GT+`y+MoWx&e+?|URض6sH6|YYif&G뎆:>űq$lzX[3ȢSWu {˥"M  w ! ( {Bw_t7V 0LpF Tѭlwdqz{)dC!8Lj1=}zL ra(7h9{l,J]zI?PDb($@3Xwq``+W.^1EGy_YnK{gϜf_e]ńToպƿ?wk2=w W@E:->yD<0B0 1>: YYǯ݅^P,uC}ydLM׉Ǣ"mz{ aXAs{^0Z>jSo엮\Βf 91KCV*&F$^U&^zlDR,FFzQkK% )cm}ɉ ~ϩR$kR!7d,ޞk~%70-ޞn!E0M(Kd2zz!ϵ`TxϳLMNPU=ý0/ =XI ; zky/ 72Vn|iYO<([;,]gii3V14WE<<(;1龖&E |@?Պ _6nϱ%lMO%dUT{3?0$i:=0| x 1005G-vZ4?g٘/?l_YZZyN5`noԩS;M~}7KPw# gϞg}sݽ4SǦ'+G7xH$lls9i&)KLNOSO?[k:(dS'OK_zՕέ[H]{!5DZ_!$:}cI&d*9$x92JFɍ1C+wۿ d5sڞUA`h{ 4yE -;;坯æc7"K{۶;v÷.JDDoNM){TE9s0$ѧܺtCG? Wj۸LPWh,W69ˑH$X_ue-*`4]?qq0 R|_͹ K&٪}|fzz]u=+aX?13-a53sj_TWi2o2뒽.wn7ֻ~a$TPSP h< Ŝn?h#5כCnYV)d[(RCdt HLW 9Խ5zryzSa[ Cئ^5|=Er7?Sj gKZ.y|xgx<8xx"FI+`jl$h,̍[H&bgsJW2"K3h [i{irQ ȒȒ!m8bR"Wu7L/i0,%DoOjT2nyCVIW50aldmԪ(U~෿$-kuEIv)hwָ~a;eWDCad XP\㓣 F #7B!TUM__{Q[zx3g.]>JTf4>o>y%n$Ȓac1>6SN$#=ۻl챟a0>2Gwy'bx,B.WPصܽ(l ^w+@Q$fOgk{YX,xG'[48u$ r9qRݻQבiol6]sX)XMQMH$`In1oFGF ݰPk#C؆F"Tbq岊k8X ŽI 8,DcQJa^5* L֓,^,$ȵ,/8{bH2UTTTMOH&TU,%a%׶8s𐽼jʅ ~O\{E朒$q92 h KKǦӧ)-UܛrY3Zaom͜Ŗ}-;yɸ]7VD0h|~Tw(\Z,xk4t]GUU ITk54ͻj%pCY.MxPd'gcs i>P҃Bx\t)hޏZM "Z}=q|@q~(dܢ]!rka(ͲY-kwAmmaie y7>w^iIgN&H&D Db1޹)'Mi14W.W6O^=Ϲ1~]\ay}Ǧ+XJ31:ğ?ȥ|/a۰' \xD7_|7^xo}KZ\#[(')U޽y4Y^dw50xE@8"_믽ȝ{ Eb):mVTMRXI_/٬,^+K "N"K<a: gzRms/0u %Dz2Zg(xCX;x8{@| rL,/Ł\a$I^=77GőduόRS~uýx<ΪV`r+/̒v9^Yj`&JB&@B!5P* kkkBѻ;{LNLPttMHylA{[4lG6'O\AWݸ;Ti_˴#9(Wz$`䔟s-46z@_nS̝W^䡄yyWw7ja>x=kD"su\t|o06>gre? ﳱ2W]eg{sgV+|/m^z%/ֶ՗_*!<R9g~`/@/0Pn89!ZV~o .+hW|Z4[?E&w7uM=ChE;ln)m#͉'Oqqݙ&ޭ/&~sˑAٮT*m{-ZeY"o1| `o0:_ԇTԲ,xݺA1B:R<FFG|6>C%F*("rDġyN9!G/QuKLxvϼ/0E$zz{$5M#(\P9dl$Q)d=мK6z]c:/^`wgۡ¬au:ZAh;Fr$9_vs5GK (s^c;DB c#JuQ,eJ(D(F7-&(UF !Mw4$+tXFVd~g[/I lpoy۶Ӆmms [;iԊJZŶ,EaEPdeJL>_8eϋ{<A  0xGyÏ}6ntGV5G²pp-8[ Ib{7M($rjs;=˽"1 E{4_w&+Lq{a'_dyc;,mrvEcn0126' JOWR,I&y99Z4%s?k9ycLѭOUt'KerTdR,Q+ "D2jO]]jD"{ĽϫkkH W^~ť%`d|GmxW._Lz8c˲4h Xhrr3tJ\.|(՛>tPm]} vnz qG&d)4x}]#.se7;L@H2=8̞>#f5x\t>$%LOqe!5J%dj3sE}J2OsqyY~7`aqeN8KXY^έa55%[hx{{}75kxGb"1|R8O Vq} 3Z<pÿ===>u`,5[;_lGx<ph?vٖd/]Ʈvh%ݥEfhhHNGgD>u(IT,T%P9h;ww_AS!|||RHiyUn߾%}ޫWs(0칳mm9cj!>raz`Gl 00G=:2_beexDXlO`d͑yrY\=yiw-kI:ڊ&ﭲU3Oohz=x0cٟZ#YvFmWö )!$ET-0zY` kBԱ:;k9"m 0 <\Mƪ2:t#-׽׭fVSQvc)+5CйuD"!(XZ]'HbrXa7'g "etwH%KSTU%/f7[  Qut`{|''$bQaQ#bKK%LCgh J"}C!,(2Zp8*nq"nDzhs39ODu4ddhm^xI$Iν%l P~sEպSdsL)e`i} dBJ2o s ֶl3'Ward|I+N:˅S;& ƗZ̕J,}zh$F$Lݠ+~&K4X*i5dY`Vòm,ӤZ0:2BT<7_&$ѕJ%TUa`:v$1{$#ׯ{OǏMsORC믽ђԉz0 l=1iTLSY|wZe@;~](0 >G栳uAB;u>T<˳gΰ49rM2=5Ȳ;qŒrǺMMVSSLXt5]ΞAia70M^|Iom_|7?RO=r?ﲗ~S||SLG#/plrl6ag`{rY%Ȝ=sovsoGHEuav)Dc\I4<^(B3Ȓn 6D($ M3lEXN,"<$2}YB-._-ֺjZoAeΟ9p9Cb¯4~ [; E ; Qvǧ' *R:Z!:DZMFԙ:Sw7=6DŢc+T|=F&7Vt=z Se#цo_{ϱ(YmiL&|@"ɣ\gkk%1xk<<y3!IsyvEj+>Q{$191au}iR)vX}>4rɹ?a+ t Z΂:-Mࣛwן;ViYmd!lzj?O? k쭟smݻ˹ghȮ;ܙ3g'we橧;{luVVVƇ`|㛿'7]7}{w[!wZIga}m e[Ѩȅ% ¶z ϷG<xaԊ:]7|~{FX]<㗇t4%Am76'v`Gۍ蟠)[9[BMno=0hx"7m,;䵶Q$\ 7lGP`gYۋ.PZ|t~(22:BwO7eUmzFHG// #ݻ(A`T hWƃb}HKQaG:<a\CP"uVCt׼yZmϯo|[< kϋbض7->l0&G"h7=*(˲WL GvabH, CPZ-qrz4{q,[ E**3$1:<@!_p&!E")JؖHm VA4T;IN,a`J^3NqHC(K*{abX6ϞEp/ʅ3|x{ǹBW*^&O_o h\v:K_w ӴxF\=sBB\eݛe e8GY@/먕*^8EY2cìo(tTTЉE8J_O7ZA Y0K,Ӥ3%gYHEU}SV:b]ّ dZyumiw/' ILslhwwv{4ˇ=ZaFT~G}֘۸l )J3nlgYVo$J& O5Ch~ K e{zp{fQEӲ?)LERW^}Kk|ɇ!8 8eܼ~ @ݩ@Ӵ|OוA$4^0K>~{Ӑm)^10pZ!~||?S*[oVgmvWǃ\JZBqa,9nt5vS4y4Y+y&=km,kgPX"}_|}5$llvHg5뛜DPt]%)@4XG__bhi'A9؅`PiL ץI8"ц9Rosķ78#c̕#Qnp1@?d:ĕMcY:*Q ^P;` 40Uazp: hd twuA%o0+ovVX %fRj: K$~hZ"CQ5O'poq"&LVWde0V08Џ!!ĂM!n`YJao_xq<_AZ&-,cbw!5 ZLpTEz]BRF@ J&qt;r ޛe"L8r3Js-FP(]7 UӡjtÀhA?WQT`Z-gx'qkŹGpo) Yס=D^`RN@@RG$@-|Gr庌o߀"Va6%/eEpG ryDsMT*Bc䫫PUHAd_D0*XY4 XKAS<dW +eatO'jA,-]4&"VӜ~Ϯ^mu:t]wRts[~NDb5Xe===NUbf2ϫT*4 jT tG" 0\=s, B-,Fk4 /?/|v=ݐ!=Ā ^(P9RIV!u M,,`"Lg,LfʕE>| J#ܘ O;+0 q|z3XxᇰT"ѕLLd Ţ1K1 bp`|^ǧ^0 p@_l\A_MB\ƮQD"a6X^βXb%i5ťPcنkk f`k31,V6*e<|1i2co:͘zJ0(" 9@Tsg0t͉7oN8>ͅ]?LP,9`# "dYiZO5o~K4VO[~* 0- L8794]$Iܹsaj읚D>v4 $ j~L (ΜS,M{ZG?z12UD"0\=o\~IR*b1ϵF]Ǘya \ ߃kbzxssgCrXX\`0+˸;;KJݽ r t݀e0-5ܙaT*Uģq>}J,+/j1W@|1ݹyWTl1_I3Oczzu\ELDe.^pb4][b41odà15eZgGU&7ߧcħVysz x:v2L^[gcTF.{BB-}FAXэI }!$McUK t0ܭnQK0>N`0H6F055h?z]75\~>b[Pmd":T/(t𻊾\6@i3윷L6͇Ŷ}l7)@ ]aeAHG o.aZX۰={wo&oQ[0& t49 m{,bmFbNW-P51_,@% X&ʅ:jBW[$,mCSXʮVAVXL:e #  X,\4 h1@U NqJ&Pp~(r r'Ϥk4 qka חA.al&miH9I]FPTIY‚3[K^UU#O֎Yb遁&-f8E'ߘ ܃RM܂ $IB,FMt,GVp2}}F;YbMy'H&P\8|66rsMq8XZZvƯ~cf0-X,.>y K+GZGOO=R6 Ew@drp(o"-,A7Le?ůF09>T"5|z&L˿5@,|H8D"RI%ȲDסM`FC5K. FRJJ]G9^pXiaBS5{!409L&a)&]])G+C8w!봘JİC2+!H$*M̻zN{)L i+*$IBP 0LGòLLJ-#Wi:f7{dX4J2eby%묡J%<9[$c!.ɞ# ceA\ƱGΝ2$DQD\\~i)KHUUz0cHrG?>G|y4=5D&xaleh||>|33ro]>==ݬI5>F }/nJ&Ӌ|ťe& !Wj$|`2mV`{]o/(v߿7n<@G?dSÌG}\,ױBAG=O.]SP(q [s(Kr:\񢋍q `wkEPѝJ_Ancˋ%^|}<:F IDATu @9WAٰׯ:khG8>rЉ-zf@iJ\unJ ևSj$~5@MQmi<u70yݪn[hj a7?X#Уy|_@MTk]4M3Aؘ/Jy(Qsn,ph)X֌۝ ڝwg?OvMosٶ7X|ATDeM\]z5ٹg?c-ozvaޭJo8t H;T>}l(nf@3sqpuy&YӘH˸;l(YQ_h+rXOʳg=l}Vĕmi@r:8^M@W U+4a?11fE,*L$ RTV J4dH `S=]>ߴot\5HI/)1BL=ꒂP8~*5>31ôPPufpm\sH *QPK0}ob>H8o>{? MSITkuJU:(`yuDZ*xq\" "6syn踻U' @p7B^s]iqݻQV]? ~,N0Ap%ttawx,Dq^J 0Q(X,l']x?b!ԟФc4  P' . "CDx,JEWW j׵ZavaT;z%aHRiso1b 8 [{cb% N-g>1i0(5)BwmK{ٟgVHkh^kx1/,xٽʲH4 C}}0zvsO]h%{ؒvȵɳ}M}XGܨ=m]bv^y7ۃpg ݐs-TNBe,,,ahxo`>=w33uu,.Cj+etuQ&A__kkYnܸ8~0tNDvegՋ>yfPp}V6Cʫ/9LA@Ԑ;ㅆy1y gv7o_ߏmNH^YZ_#7[֍Z;t_$a8Od`yIT@4o' ~y;!tI\Tڒwᚋ^3d߾ ^*di{ݝx&[]p/Rmv6=X皻kXd ^D^wp-A3:z`) ŎggA|PϞtX@55iۓ#h(Loti9' BAlDOk*R)yݰc|[![6e{8`;'7B/9RN/@cXLbh+4 P,bbR),0ctE@ThawHYN! ,5ڧh#zlFGQXaE+J FG I FFLYR2xɇWٓ2($覅'>6.Hţ5EPՠ:^y @SUxh+e" 44hytXKBE&G;Ew8Aaqxg1{_/ % 0:$qU7p>9cF/ gQ Gq"MM@QU.,T"z=LZ-ZpwqA1e&IxA՛A* #Ñq,CQX\^rNHUn"|}|b@@"f>4!Kuƞ7i: յ5!}"TU)B`cbal<~cLުMp wxpbΥ%ƛu`ʷaQíB'?ǿPHiwW' DĒ_y^===.JU;`jj\\> s ۇ^fZco$uSՀIܹ6P5 k.+xI\5JzC(H8 M!+ O.`?:~\ s0VCKPdJg ݕĽE˂*FTF,A8B"$IE+tG 80!AHwSm5{$(8!&&]‘t(+|$a%u$Yvߊ:"6h5?@NњY8h3KbeN5ueGz~xwFㅠ/ӋZ'qsX\juIi8i,..zX?w0sÏ s^Bwwŭ)\ҾSTp\קE & yd,;nҳ}dY@9coBy/ِvX4(X]]A6Eo…G10Ҳ3| o4ޗ-}<)1<Ξ{+,po _|y %C 1l97BRn`@M3rxx#s΁dVrhwXa;{vC/{z}!vLj0)[Ojjt0)Zp%(rԩgz|&{uGW 4ޮ7\k)@Ҷ6 I?`f/Q,l Ν' q6fS:z.;a A ۨٴܾHKm!ƚ\=XX`ee{߷R:H׷otaxl7%n#LBsIP檋l3+<8AZ@, {&PUU:g{*+ 6$&ǩ.iTBL/@INy-Nn!4 :tQD&! H$i0lJdbt`:›_F$F0(BtLϯP'D0botTUCXTC8(2JĠ2u `ԳV5'NZ]V&ѕ  allPu5|pw\~{] C v4ǨwOT.Ae$I`5|=s4Ms-y%9@% Ģ>mM"o߳f'G" B53AT5d2i̗xG MqΞ>۳wQdl拨J&FGp~/.AQTLRC4$qs=Auՙ7AUUh`#IQa:؞mG}}E(G"PUO$ɈaZ52RC50LE_o(HPa/hdc_4p<bY{(ƭiDBAw>50#Ytd24V8ǯB !ZꪷH8+])o`ҡ6(*SeQa)RI:x^`s;#L6@+髄FauR+BVCɖZ^[__5/JҊm? -xܦ+DsڝYH€;h- vjQl;p4?K^M}{=晤cM?WǗ p״liy1? ?wȎgؗ"/# ΩSN|#9P݃6"\y,egxR,psې5=r[zBl{0- 3(Ų z09B~lus ]\+Nڽ-*#P hwXQd=4eQ+u6s`AUGN2u'ZZXp]i-4l! wӐdm H.1CTuY8ʕrA;J*4Td6+o џF`i}n"A e~B5nG1ڟWnbkEl+/ޕxM,eר},.pT)CCWQۃd" X9IZ/<|KKaqq"ò,dN,bY]in\oSq-p{6^ULߞAoo:αcq9ٟ_0M x Kˋ7kPḃdmܙ_~{pu 6=ssw\.W^w׷t{8pju KXXjk,B 7}f۪'VjCF\F4t<\7111Q!%ֶe}Ǘ{ܠom#yȵ[Ip9eoNm\ST-8{ro\h.voq _$, D:tX;DҜ~@k$L uu5};LT~" }~Oi 222ٸ|'X9<< W.p5N8EeF2l$! dzГ|}2G&M(N8ASg[<; n?.h'"nf;ـs_shybM|~+W_,h-t}cǦl` ]9Ewj CCvs{&P(ہɧD<@DʨTkian/-+JD(Loi"#Jan.fv]K:t(,fǐ(E*zf 6L rCPwPmjuXݩ鲗/q" l5:4r̰: aum (B4D"aN\P.3y Ү{C־SVcqyXl5r 4ogiy>ޝu^ʊ𶩸7 ܆͛wX\Zoj,ĩau- D"Q*[qX[_+/G(͛7Q*&n07wJ%(KŤ;QƯ7<2|fn] /Ib>)#S;^?3M<iOik4ǨT nQDJR*Ƀ~Ăǃ ]}oynglh֞vwk:Hez{{!k䁠{:`[~S:l#LJYA[ ib's]655R'E]tKl#P;wsEsAmaoۥPՉq0::QeGA:39[T*ϝZ>GU3Ba|@3%X]]MEp= #] :|݉lK"h{CAXnk5oYqϳZO;Պwԝg˘ 9s/ <ڀIȚ܃< X9ϊ㝮z! RGƀtyYK2QgݴP.z4똻7H$|Ġ.QW5gBօ byys+ q3Ku67&'8]$v,gEJO.強/hPK?7~Ne]?݈B&:旖aZ#X[@8EX8v52Uՠi:RVHtcie=eػK+"$Yn8{8Fx,BB> mnmlx躆4ʕ 36aZ‘0UC(BRC0(H8ёETkTxX,8y( mXgZ(7݃Ayg|P4a i:mXŢH%S@`[0|ٽ,b{i&$ z!#[_-zhpjřdy$2`|3AX˪F!+-6Tg- BF#cp<6{uZoY.gZd]!qw7n8( 8'crx_tjj[i5=\ ?ٹ99|aܴw2vIb6ik_I O퍎} ݽ{(6diyyT$v=OT._._`(tO"0 lnpX]: qaq|)|8=ʘ[8u‘.^cGok9w˟]L=ךQTpk_[)I2,7[=F xm k3SL--wܷ7<2.q% b in'~ d7 |~zl=Il}c[qwTMs[{  t[zP=f8IX @˂gzy@ QZn'dru7K@AM9׉J;+E1Evzg\GͣgN+rsiJ"gn ,;J ^\] x|]ka{hͅ8[alls-F1=' À*B;@Hy-@eL@w*D&q̷ k r9絁@,7;1(-Qt\;u 9Q3~ #>Qux~~+ān `]yث@;A `žX\tWq4~ҕ[T`:{ dY狎gn3籴E ZB;(Qא0AhH  L62LKQUXшcBm 4TMOwTU(X>_.68zup< rj:ryE$թ4i4 v8g=%%X,0Mӄ,˘ڳ+YW!83$q QeE}$u㱰h7+,= 6ocuӧ]YO~°c`zGI!X;4 f{mOCZi3q"蓣 QNx#y5Y/e;{bdwfga&&ǽ~[nFO2͖" V w|plW*x`ez8$1q ffn;Ώ>(z2i\)E ,="&هqMTU_TbnnA8fFVVQ*pCw>Mq<\z?x17;W^~ <, /<;os`nv /Aݻ[4M-p`zYѨLlIQdٽO\| CBR4Xle Ic 9 "ݝ@&|>Tuhrp(>]X$+xrPT<ؽk'd gSG8H5||:2glD*A^, Ǡ* 5WdX4`%-q8x`?ł;ٯ,{Ϊgzw7Ie,>Bۘ^[&ǷuLL/*McB4 ٳ >ԣbٿCkH޲,g_jދڲ$:"cr(# lXh>b@@iYJo2pa||*$I7PKP  3SNIQїIceuLu&p84.,Rbnl04vZ:rVD`dp?AVA8iZN~$a02LVetdR18b X,Ia&9}mA.Ke;յu$1DX{PǨju3*c^ёODoo/V+NLM!*HhrAH!I2x]`I{0žvw{_& H8>6FL7 ڭἷ"LkoVQ|)AQ5 /AMʟ4iE$Ir /_,wØ:۬ǎҖalO.8Kmnz/{7Z NzqKq?*o1Һ~?,2lpE}{)gݹ6(Rgs=GR? c7yH< UtuW ^|UܸvbPkq~ܞ>\v ><;i4fnOCQd=po^ /fgi,<$b1lnpaY8` (Ҹ&Դ, `zz.\j_#ϦA_jYV[d#BobܗgN}oy5~P N}ȟgq'*~y9_v};ӕeY6&r?KZ Vkl:k4;y=vbwm%l*˨ESS 0 : ~ G8F^Nj/Y~ׁII{mxD΂fA\ٕykƒԒ6P(4 $"eCGRs$٘m~4fC&>f31m*u7Bګ2+%3"cݟ>{GddgB,w߽{N`w9t?Ss+Yc/X0` lx:ۂ^x= nO>^G 0:t5D,K@RPydHCLJ- ## h`dpb t{ R 4FqZsmc\'ZgRX:?^` F\w%K|bbtb(B֡t"$h:Ag7n,ǃxȊ7<;^4VrHA \<߸J é8~?@[cu} tܺbt& bh40u \.C%( J h-% 9¼,5ﭪo\r'@V:mvA ͛o|0KxFa/X]V.;l6;m˖ـGbm5u1UkQѽuvkQi3%nnn<z.a{]69>Qb`0x.{:66Q`ٛ Tw|l.++L1 PZ1*j! :63)5Di:BTUqt >'+C%YUÃ)cckN!<$YXrKH%Lxv mkgv}XiydY0{>ָ|*2MP)g`jb'!N4D1 6l-{@Mӡ)i*)v5o' j_Vh6[U` Fó69E# B5LOMZ"@P @QT/LJ0A8FT\Tn%ȶ9_}ܻy*Dїbחf>~E[/ {96u%E鈕܀!Bv%oXΟwFGG]oԶR.]Ut'.1K|ʊg=-..=%mmN5 XuWrxͷ00e# M7p|w~7n|o?e Mիq]cxdw14Eíyͯ~\{.CQG4eZ IDAT nbd* Xxeݾ-YPL&l6۪tD|{;a 8o?'H^- 3V%xvcwZ(~6#~h;y,is\.l?7nz]ּkTM89>>l>:oW'`UX[p177b.J}\/WrYG[Φ"\K3ΔKRh:kmZ D\5t!I.v iu~p*@GΏlq}pq@iWk ! Z~6 :Ajd&FєVEǵO!`Th#XȠڐTUԚ2(j_S͏Tm`vbAQķO# (>yo?,8nTF$"BUdP7yԪ59<~tS(ʨjLâ=uUڪ\X%ndz  brb##v0?DbrVMdMх9 %[<:2 o [JRwx J1@6"[V:@@5 onTk5,C+#,SgOb7YCd )Ngi*8P节$2b04UϱcQh`~v0n$#-?S[<|8vH$'/C:'rS/Gm{Rݩ(EJnv.~{c?a)u=22bB<o[wi]k8;ѻZ~9Y1/gNv0VL/<j(W*u( "л?\bմD;fP,J%@lZMC,az~Ek h4ֳfkg}c(B b(+eSH.2]eTZ1EgvdJCbp8a,ۿG^w7c٥R:E5MeVQ(]H& LID"a4MTN;j:ym(V{lll0]<uMd`lW4H8Z.Ň^911˿VQ}+bTヒvԩ۶. q gE7e/$A|o'M;C(/zI'!r 3㰺M+6>yD!KGF!>C,?Goǵ>4U|ױW .^x \5<j`A^XW>xcvpSS7 LMz^x}Q?ޭA[(BU: GZKpNgA׺;jF} z4IۏAp`oDݏb C@ۋ= zjn>N:.{Qx g{hzjwPu IFb1 PQd>q }GVG\(.xbGf}]o`m+ZKkPT O?R,@M$bp9cvnJN>rwPlv[sF+{i(3#q"3`0!9ZdLd_!om/iNT}~#5͖f[%LZNg@^ѯNsgkߙֺpWcw/~0u5w'/TiEآiRI;۩FKܩ,mZt3@ӟXUNՊ,jV<1Y.8D(XєaaqGM$2 DSQ151 -4Μ_`6 "FSPrn[ナF&c!f€kLZzE$ABS ܾsǵeR"ׄѣn[B4(2޻vyK\*(gHÎ)Уg@TҖ{Oi35 J)%svi`0 g/'|מ:8rd$8'5<|ĝ__Gj -蚎JůH/Y0?7GdI¹)S)Ȫ \(i6Wҹa_1 YӰh|GKN(`c.`(إPp3# ;Ǖ$ #?xv>h{ϟMs:=܈gI;\$~AcߤcDD~?H|X# H$pjNMMkZD=ǡ=7.}{>~h[F{΁*B+CKm-"{ggm9v}+OsaW7ѵzdj%%7A0Fg-~׌]){8{pG͑# ̑;Xkۃkϧ|~'tUv#qfWNn9vif¦`S7삫.ӞlzM 9.e,7צ;>dEa42Rdz%^!`lt\k)K^{*JFQqrj \ | x>ΞDހ 'NNbNݕ B3X!:TUCTʵL%U?_Zcs;鏿?G! lnoAUbJ6`Rbz)gNt\ؚh"bb|iB4_әi\q-vV;{#1K 3 ;  54ME,.=4'0~>?yZ|x\ ~g,{=x_10M`chGUH ̞Sܫ7cۘvqFá ?ࢗz%4w]8M34k$b   :n@L<GP@<EQTK :A٤Μ๦rn4iqSCPZY}>um|}]S+sss04͗vnk?H:<##N2 oY䘫ۭBE% p!&R\8L5[i Dqr| ; L@~phFσ D(x @E$)HI*5ҩ4 BVu앫M pD"21:$>r)&GRxq*UJ`e{2**0¢aNC&MU,^pm$W5@n1fgf j&A 40J2σ7l4,m!Wݥ Ïo#A@(q+`2HP@@4hPU[ܹO8lnZ@Udirh6j5a(8Bq-HFK2!V2tzcO62l"o-.q X\]޵%u7}i8}#jHҩs.nS= ୀ}!ڶk(u%f&Ӻ췷~ΝN[HRz65]g 갆=2ҟw~?:X?x |Mv<(౟t{= x?nPˉp'Ez_e'G-~Z IȻ^` jIW5ڎ`>ϓ<`뺇#n_[@'7]߱ xWց˦⪔.z tw{:u`8볿[69!h6f}vuk,IjzKEɮ:Mp'ܨl.jB<]-J`l"̰yXmiW5MBp<8J 04MG4HRP4D%YECRpr{hJ2FGGQ7P5088z٩ KU|pgi r ٽ= .+!L3dvvQєd;.TMH D1J@dĉ_ǖf$\ɷ/2׽6EMD5G D{i'''5ջv cIw ;A:ww&q0(8~bP5vo;m u[i$+ŢLДdk$YF2@PsW[(@5]dsV+x r:;(ryk3p ҙ,014AJ2CFTi,-X4YQ`*eYdBAM P$slh0ZJu5iVV0)v-1?7t6 )TZ>"& ӄ#N)Jι5˭ҙ!$L@,Ȉ(J&'&<1fu[NC:N''&>,ꍺGlW bQ($IPU9H8 `k g=u>g#9s4|<A4c)xZO:.9)|I:a%ޕ-x=:(8H^ggN@g)ۘ@b.1f6o8fUvBmt)d2Yvmqu(#{Vp[o~sIkl9VsmaƁ:iX:O/?/!|ijuBZc;n޺n[[l89.ih|s> 677PVqpK߃@pjrG7GXբ≷l#%dEIˠVav'}Ä2A1PHĄMLM{˨7$DbaLPE^^ ثJb+ϝć7^G((ry1?խ- D TU(" L@`M mIerޔ,p7Qpn>dNֺǠ0tJa%Rh^Y2YQd/`kkRĢc"@QFD8YBVעb;@p8P0EQ q0yy/?GxBB8zAٳg19=tQXCC&n~z GO~Pr µ%MSoX2 ~P'WE(j7֠k4b4Gz:_LU _t&|UK(1Vr_=0'lEO!צ,QV`wk|8VپU?gy|8B FDcVeT.N|RD"j$()|vbs@DPks_t9ێil`#.v~~}%Mȝ&n Q{A"IR'cXƴ:Y5fKֳjJ U 5<|>P v V{t: E[T*c;^A]bnB?@&G\%fkp'O@e\pi onl8@E {E)P,Z5%˞.)d8\R4YI F+1;;j^qq2/>lr,R@UU BǢ0t #,j KP6L ,=b"LR| I;4?q8y ݷ+[,xR}[L$2Nϫ寺al>@՘X}iTUF»i8Ϧx핗o>c: ap,rW42 .,8 j{jfk6t\FnuZƇQ,!K-"E0L($|ádkGg148 j:Պ%#ơlZkӢbzWF,cvf;,]Xm+{Hj<΅ճ <,ϪJ~>g:;:wX47fs{Nn 'R2<`njBULNNv| NE`OGޏrCW `w:x8;0Ku3<R$m.su CCPP,# 4),D IDAT8٩03=EQt,>t!+P7UTD1[!ARld01>|cSHv:_>]µU<B\~h᠈4BR1{4\~$IF4W.#෾%A9ӌ~zbA1j ͆A+YH&FTĸuJZuP$ $PKh&V3@8D!#a+  Ll1ųH$p{ [_ǿR\@|6h} 9HgvPJg`&t]3\:nݹqTUMiHl11:PzP Ģh6lqQ`%@!o[T<*&ےY=W5822KO=5_>=~S'?E",IF;Od%`ZӭDQ* Ki9vb=>?- a[k)9l\a"11"!H._ rCZu:dYD) n{5IYbEh-2RgUfVfi]%0 wwfv\7Ili|f4 0.]:32t{k|=#<"# h`mYZwp~wsŐܼu߷H YV&35{ 24dD"KLgKhH.`|e bLs96X[w`6 2"&ەj &6"a$a~~6-B Ig:l_D"ap8 `ZS"4M /6,ƵpxXFhE0l IHnN]o=UU!̓P(NS @pX.CebvvF÷fG #B7P,܂q֍D"SKKj>!ƳϠyLel@_?BG:H\)ǟQqχ5+n{M.b~:_޿モݽ=|ӟ~)>}u{bݮ Ya&,B!Jg^>:߿W.}mkk8vYy^׮;ï{[ǧ|`)\*6>l͢\`*汻䴜ذ?80;3˲D"Ǥ~_0o6),13=wr8 Sгegɐ$9Dl;++Ο ϥI%N%zU%s*D6|D5'MDЙ$i;{rѳܟ[5d(~y$B#B<JNHs>o.hJ%uLOO, aO3MQt+)0bM9OИ2TV 9~vZ6Y ^g*< @(||czz!IR= qh48f*nM II88x`Q?a6Ӣ}iZ6l!@QUit xX *ԛHRz*4,#lK ** T{_y `G%amef sX˸u*榧БF#ǟ\m J"CQUsl2Zh$|6M v!.r( Nm,Na ˲q +uO>H$f I?GdS Tkut.^yBaaΝEB׃$LwGix{ }9p8 nZ-T^[qI! no<hK#NHP5 t: EQ|q?w;kozva-rCqNv,C3fs+T:xbNuރm0"Sls1H@~T,qHx8#mxޫ| \y3)بiO-u* llNUt(S:ewMܼM1 }a 0z TV;!!QǠC(BH!wXaԈsӈŢ B&iLj6%1dYmY!wM|M|?5ɦgg\ gK]'=qG6F׃reޣaj^WeX]YEZ.}lBPo4܄w~vk3)} !(ؿd|e4Gފ7^ ;hۮLz3Ärץaq8wv5f\w{gayrϰl30kw];s2͈=fyP":lʛoPٶVPN^FyΡCUɚ;8DexT.% '1A|d_q-H PQw$I0FY/9񛋿kT}… ֪yY0/ `8] ܺu\ {&nZ'&b("LU j:2,8Dc1(l6hgo"6vv17;([-GE:*&g*6;gS(d85m 9$bQq\Z_G!C=2i 94dRITj-Da Rz@gJt Ä\;2mC9-,΢Vo"`s{`<3/$! #Oh´,Jܳo}>.t`GW_A@'u'_I#Jl@{w^Q+ljn.r4jڒ}Uw $ (2?qxgpTIl4M][FƹUpA#4t&e¶ 2[5$tm7H` qY%g<{vL͵k?8byssv^0Np 27BګuB"AWG=E177K ynw(#@56'7<뽯w0ӣe@~XkO AF 8z=$IF8((]WRy|}.|j聫^ U=#u(l !w9m48}Z12/bw:7:p֑)+\{#Hk~?zC?E!pOt>I4uviP 6k};O@=feF4t( I-3~݊s3/WorS( 8<<*xwh!@lZr{r$ZDTQA.E6lBCUTYx,&Ο;(baӴ`Xn8Ek pKy2i<ރcUSqԛtzTM\=2f+7P7!1[Qqvyˋ=8B>FL kH8b۰Ldi@ A2A !Ȥ3t펌RˢRlh w7HpXciaҩ$LF6B>VTvAlh8Lz 2$ 9|ȊNWZTsh$㣷^w`Pm92ߺ #afFFd"2M$1VF5E| J&h592pjiMx.-."z<F$fPodC d29xB VW*ATT CxƤ^m|jjrG",y(}陠x%-|x1gsu5ݰGJ_Y^Fvc("b;;=˴&v(r[ij sss5 0 G/8e s(!  A\3tjm1`pޘmQƜ$xq{A4!* `~;4Qb%ͩH8LX,,̢l9a 9~/:rl4.pnϨłxϲ}s&gY{LX Ce6"0>&8.Ky 6ٌ3$t]C$A"pedm(ϝPq˦aѮ,CڭOZ J;y}̼k1cK ._ EQ(;ǩePȻLL&t\%|/=xX&mcfIuMMU]u}W_~ {bbcqa,H^#' F Lq?I%vZ^:;(^r^xyﳸu-Zu,n.?jmq[GƃN/??$usi?7^OCp 4M}P,EٶExb ;Mzy7Q| + n~q 8<J\& Yl  .9 bN͖nّqpTC2C($"@ $aZx=I("sk*DTéYt=251B2G:dTnVy چ(ԛ-sYنeD]Lf LDGQ0/ ""Mփ-躎܃SI& +*0V`{eD#a4ZRtE|~!n=Eřyss85?=4<>XB-]YB<AiNAX}>G;;;8ΕyV kgV!$IFpFp5uL8idAAu C˨X=T\^"=جb{PzƉ伷²,qVmb%;В?abg51v*=ώ`~~ =8_m.pUPT 3fHr"*w^:oak{}nNJcRiC.!F"h;n0 D+˨7,\. 8beރ $q(qhY E:MCИeXGZ\ es?8D$A20M=  a3V e)X]9mH<x{l5/1<.}76Xf fk{kgA`J s?vD"w?|P8?+<?F#|iU8[ᅦX^^a&οoǤ_yBd"r3V^Ol*H)*Ehp8V **Mfyd /A7 q8xxŋ֬ӼI<yνPnnw =#~+18 C?V*h x8+Td^j$cs7|4yBH2{g}sTկ$0Qܽo Ƣt0 H3 Ut$fS D1=LO-^@K079L\m@tTCa(poޏ:rm# CuY=ͽ{ EUPow)xq ,./ccgC$c1TMdqܺHBS,{8räɷS󸸶R펄8[᳛w8nރe[Gcݯ dqt$<8˄m[PUbhZ+x m .U'Q*!C~+(/pPkRR(eK+W__LjB GF"XaYyEVG3h{VNi4 ̖ 8Ԑύ+v%^0Mlv TжTmQ0ĩv2o/]d>Kԏ&3PU 6**GOv:@8::I mK/REt]&ؽzq#!,4[0\ky-l[ۂ$I""0Aް"Kf:BUx套f(bvff eYDcVșJ&QTa&8vvvd5=Jnlh41?7d"%K hw:aB>Qh4&ŃqrKpJƑIxݷpc7{L˲\7 3!Qh[\/BL15ciz_̶mqͼ1i xqz2K{^~E* )ʓ$,rqp5ۗr AM~-..dp;.y;2\DvV)Sۋ/<M 2\h,_v{2 "w3ׯSYgXr#ׯ_C|Dk~7&q_ )#͎͍760??牿> x\z7oQ'O?'NZi'Þ&񴥱Nrx8ax7|wqx;=k54SJ#aff᳙TTn$#c8l9JqW筰D 菡wmÉG+@xДwJ 7 ( ^}k#U1BlWߝٙYMM^Gh&Dܦr42ά,~1LaxZm,.RGOՑNA;z*O-nZxULa&8b(wJ^:vpy}l°L\<7@lnOAB.T^y2n>xۃaX`4v+gp#_=Ul_~q! A(H>l|6ji 1-.,3HDT&$B G($B7h5ti Vh i!{ 䞊w7`ųkq*jSu,-6G;/W4MC!F` t_yY膁bήBêAm#!MCJ= E(MMElw./Ϣ&vJy%;xt{s9W`Ծ.?^e<~Mjz?{wm,98Zd{{?}h{묙<8x-9^_n"]Eü+1Vӯt #3kt$2޻|>EQ~AEpj 2PJAⰍtlBQNJg]ç?l1 Gehp8JbP(Օd2*D/#ګ@u'<嬅^d4iAoo o:#t/gg#NR;qL{ng_]G{W?ͣgo^\&i4nge&mqxïჷQ _Oݟ+P4 }5 pP,L r&)VP,@U:F0h4PW)xxd K 46-fT2VZJUa}}n&O۲`@ih;-s [`~zD=~1_S{]{Ϗ XYYqJg 4\f'bm/~;5露&Z| _2Uw0XT9Wt|<'c6 uf3 $ H\qClbРUSUZ?@1ߐ u{@Ĺ Լ[^r;B!ZFplh&$xheٮѺIQ|z%ɘ)M(W*f][6hu8'TcQ Wx1,L! 1"Zm& "LJ9;xn&,_N"RBG~蕗^n"sx yuB$X-_7i}X|. E8ld* \2B"nXHRh4[H&?8D,=Dm#uaPp vDQDWAyՕeOJYW1 0(zjiG*B{YljkB,bMl&j|d0 JtNIj8s8<,)'1j5\x{xuLaѨZeR)JE\a8"|YXGVs /`t3 OÝ)4ܿ&IDQK;H1S]*5N+Ұjblv;<~i t ?+י/\qv?.:r^|KB:M}ƃ;;~x\ի(xI'd&A=ؗ LqOWJ177qxpd>̤3T gVl4Iu\bu@p8 E<GFP;BxmC 'HP*McowΝ;i*Jlbni!h9:VdHS%eRBf03]B&-*WE,{%DcsF~A86;BVXcx T"kh;^Ʋ ahQ&DjʙCAǨxP|!C|ި56}s14nl A*'LVy x0?r^ё{  E'Вu k;PMLPFHOӠh,BͤQ>?|668Sf8z ]D,rFJ?{9,\\EMlKx˸`D 8%Bl>x٨i ^|El<|Ft3sS.#z8N1wL<艿6HǮӔEPhߧ{΀DᅢsĶug']ӿ<)׆'|xG2'Bg>V*`:lPu$ IX 2IIIڨʣ>NTO30I@uQ D"z4c$'` ۰)7o:?stxO6 "2{&=Ԯ4cG@pέ`. x0yH8LOO3l/C)ܹs~lmdit{=(*k{MW ciy/]rRAQƠi:( °lD< B.CϣX(FHR8 b^luD60;=j\6 YUPoKt\nC6B%>87\Ȧ;(7w8| };z E0_*6+U;s  `Y&>˸yw=d,/̠Zo*~]pБH&b HFC7 ZH00fpq}x( nskt$(JIqc!K IDATLEaR?RvG=|A@A p.l\<[{ m!aia/=snCV52sSU𕗞!J(S;8arvG]8/41"!$bQt]˂I1rt#C ο]CXYYF"# aXW,Ngh,*S$tàRUGOYMJ)r9ԚmR(Nh,l覅NH4 U5j~w6q:6@>8*4UiȦFӅ,ӫhqb; A{ATh s?,c~v i[￉?1]ci~ᐈ{Hct nS L G5b(Pz @8V+ l*Vg7u_}y|\bVܼso~o߅nDE$P8X4FP(E4;8TݠrLL>c` )UTlO.~;.pvyVVx=.aui:tD%8Ds~83ph b[S*$uu X" uƺgs=Fs^ M]Z-Ca_ gynRP5;2.\.7pE,bWʳ^FP0xYb$I7;c:[սH!y hNbk=v@"WB*JQqq1{qLDk`D{zLv<($1a]=3Txkqr!G[ΤqfeSSEt%mcQa1h4L: EQ@qX*D($B9&3DNR$͖ _zJ6$V뺎V ˲ɤRs0Tݤlaht6nDuG WșSS]6uM;?ۃcue97ڒ>WMu2VgLSСP @e)DjfE8$BUU,>ݗ$6G^!X, 1nBb(гrkŻy?s^ؙ3? a2G.7H<lg>Wu]Ǖ˗QV`[Ӝi;7vf%FwPio;cGZO4M\[;8\x a@(kS׍!G!ۜ>y5n6mNINA1x_Bn`,jJ&MxtVӵ㋙% ď8<8~#f%TeqNcTͯX]?f ˶{'Ro?'OqYsaww.qn_8LxנFI!r421X+2OWD0M%OayXB&̙'8y\_,˓z_<.9FQiP3l\&8VAHg4&z~-D ƨv@#?k973dJwsy֨6kj6*}b1lJc Oq #ڠn$3L߆q}9sq xx?ƍgqpp8 2']|SH$ԃנv321=X=1Öc+xWpΝc+o-F=9qmÙO19==GrẂH,2!5ƛz$cG= T̕ `4 t:M:;zvj'1l pNRT)nO I??{#Ieg͵p!2TJYY"KttbfGgf$H$~C\6twuԑ=\ xff"XBRxw}{C4t]IFSl#Bvp,(4v~@ӕC8£EXDƥ3먷8jFNt2^dvMJš&u,T2]אp\.CyXYB'au1G+1xGc `*@$$ )vѽGoOAtά)v;`ps6?J**:.:$S2lgV'5|tr;DQ/NɵlfJ a@)5;oT]G8qEd"fz" %(D,1r3qzeF_&m=ETA +hm4Z"6N-b:'0>BWϟ"| m-d}b0Rq,cŶ/" ] Zx@@L& h.}4ű\ˋc~ƲΘdvmBdkG;Ck>,fƹ r;e2ԘNo8bb z>RkCqfx<ՌyXd'|Fc}m jhy,Z7v B8<<٭CLWuF]\hrō8:u]3 k*FMhDr94u-NCl5oasq1%cc}mHQO\dhCF熡~%mZ:A`0HtqK/XrI^uV LMh(e1 RF=ϜA]I \^!d"^t ˛;ݣ A^N@ E\r+ۃ! DiZ]{Ke)vb;.rܻ j:4zeN$cFNm܌y]MVb8B^NuY6idѱ]Vx5 N}b&תth9+<bxu_Ug8dZ]#+*À0,$Yn:H$Suj8N@4AO1jU Zdj˜ARG:B') BA./X™%gQo8,+W!x"!;Clw0b UR0td)hD4j,"5w.7E#|GLjE 7_/ϯ\_xOwQT@pNGtMU(ǐ 0T7)ᕗaJfh;硨:.;h,l힄|=UC\v mӓt Е$lZr?(+hD,A4l=7Ma91Wh-WGh6E|zoGc2$TEcӻu4Mt:LtkjˮXEwLvv5t/%˗YUN08JҎgptt3O\.s|/ak{VnpԐaϘKxҪ9tʶ84u`Oc]0P4mZ-M]oܸaFF2wֆ6N8Ԏ{7==Np8`0YLn ^$ Xiݓ[7_ŝwL&!ɲ3>[VwGHlOt/h(699%~'sTV0 " BVUqU<;-L X4?wQ ͠Ph" ckї0FZ>ySr9d2ȲldZ~/+wŢEN+qjxNe|IX yO{ x06;j=Hd4/={ ?~@ 06mPsv D"_i,%"5agXlfRw`Z]Ϣ {*Ty~ntf.sĢ*ē}@6٦!3G&Eiӈ3ܗsmʱ;·+_~{{\$K,cY^Osgqpx$/\8o859Seuuvy Zz3V18JXtS WW9099L|q2?#E딸kR7?4["v4 %7QU;dYRm8 ,0zd1=*6>\ Ԍ_ d &P.ՠ:=F(Dy>w`Mwœnߛg^X, qk_ m>_a_Y4b@p֒=>4y Gy787F}REc?LSƯv8F2Z%CƽfM]SvY L‘59 ljzEälcy ^ލhv`t8I:?a=oKښ<ϙ̸\5&huV~ _px(A9s+ 0n#"~I+C:&'-I_( qCUǔy$ O/ f'PxhR'Ne0O\Cxk:m ݀ y}7y<#Alw055Etu YQ`X͖077K|Fbzhm,5@RHL'/"\oam)T w6@,ePh6,#c҉vU!!CQNp0iTj l,  X*7;ά£'{<8MpJ`HK5\| }5} {]x "dYF:EIoYVN&p? Tr" TUvv&;rpb8o"*h6QV]Bu07;\n{6Y&} ]w7X%qyL-:EQ|׃Wv۷ezz >i"&g7d++C X5 !jϦ),hE% tږ䲆-3HtO8rE9b A}/#߷%y1 SYwxkƶyJMgm(ms}OpnsِxFd3b̽AU)*"Ke,-.:ko}xpƭNJ~p-,8x*Ñ(TUuÆeRKČjf0VRDg4aM25r5\ϑjt{ DjH$b=I5.k:A=IAEQ5lwDLıs!(8KeH_ 1}>҃ܕB{z=H ,nju# }sj;# 0pyT B8C6B@,]-君bt2RT, AP,_<~[7a:6`._>;LVUB$d"ajD"d2°hwXӃ<B7}9(ShI2Mt%Pۻʫhps8(F޻o\k) v[qve F i|u|t>"0D UQ1I _ ΃M8(uxn??,`bjxH)4~ Ӈ(U3تu\`P\{aD%!ĵX{u UUg Xj8}zUm)}KI7^ݥͲ,.wW2 xpN@4dz sP*Z\rB,ed孜WhԖ=ruBVA@E]{8a9M9Hy!54eh4(˨T.@.~=|'y\ /P$ b5Lan2!UM[>La"?i*+7Q_AL><R'uM[jdHAMf~w&8J7߸Sq r}8M|yLRߺ{}~7sX!~n26:zrŅ!ؒ#oq1~k~F?gko!@qm"^9ӛ$9a0=Bjz+˧ GQ*0 $@7]'SIS h~٢LMg@A ԩe Hrϔ '8}oPT+`um͇x:&}S{>G#!o,xIs[nyx~'屧n"1Ki{r}^>_0I$gXԼ]4΂L&j IG{< s}&\Wڵkv¸1 0~:x`*9'`<|s?7n@XzOGLtW,R=yt!S]Dݓqm<( ^G?mGoj~l׳[3i;xEf Uk P(vLBxX'>JL~בfqȾI6_ǟ<|񮭓'~_2?^H9O?;FV\?Xf  r\ʊIft:d p(W;hOfJ!;PTD !hw`|d:z.TU$IX^ȡ!ǕҩR(Bt<\GH z= - avQo5@ ѓ=l>AقPŒ]+^~|!Hc8B yFN JhaYd0VT2P8J3B#LӕLGXNw⥳No~K#D#!o_?{?,e!VSqyTk$(b6;';{  E!flZ_K$Z^DRϱ/@F wgǰF89:Lt(FӨ٬s|]A*- !wF&3FR"*4ČsOTv<& IdyJKK"ɺ%X3,Z@S4B)}F  PY@ Jmy,CV4.AS5\v=5 0p驴ݵZn ?x7n ?#=$4/'!XYY܁X@?sU ̕I~.O@aGc涽f !Xc1 ϗOx=/f1==mx0g VuYXUfTqL")36lwd:<DL|!x3skps&naI b~Bl-c23%;x+Cm>mwPI R9M! $5Ky$-DHݠ`]IF<^@ ٙ B0vpvcJ _⛐ hj/^b z,b>?`*ċ^ή!;=/| w7XZo >:~Ocf:14vJd !fE,)v0~mS D!?Ly?֔** \'XEÔtH"dE1("8ha |rgVs&R hR M*N#LΗhd!)TMC2ׯ.w22BJUxJd=IA<顧(Ȳt T3iS (C`cuaCp~<޸~ݾ%(+/c WAT7wQs &5 eZM)ci1Zj3ͪ* FˊVk(5,[Zb0r 6mzA65 T7iɪđ7h$TU |Ä1+ݲ&@2F_|ѧ P SbpX0&Ҷ1{/f߭0īY[ͣH(WkX9>>F8o܂(pT2v[ ]zoJf{I?Ix8ͮ/p%.W$ .R$ %t%,ǁxCAB@QTLMmN@aO$l$ASa@QTfgEQ @QT<ps?BH׏>FӬ6F{"^EUƭur)gbt,4kww﷪~U[2oRaq ҝExD_\6IqyQ(]P0h,1mk83(~wVwg,Ex>`KNrccHa2wv:=zLG+IͩAl.`z_[1qw8PF}+%dz =kڤ/2]ؼRgRwDbQZ5يk[!S:״5 P:.c*+Mՠ $VWN`r 9NymF _/O <K/!wŌ'O_Cb8Upŗ}( .aX$VT?ax7=gc(qp C^K\ 52v*X…(y*ɆmV0\hۮ>cEoY э%Y^Zs}} (u(BYg^woc3|O:P}5G''!G:AI1Gy=CJ}ؾò}P儤`R3<'N*Fm2}t钽qə{;[\1N"VVN0̘lwf0!fjTK9Ǭu KYF$xA4"K0tWP.D `ر\$G7 @Xʲ,MԺxB5UZC#d(Cd% Hl̨JQ[KEA\vuS8}|Xfu_f`}!؀8˻w7M@ׇa~`σpJdYvn`=q/ﯦQ;=R/jҩ4?} :z0tz=R S^Š]ܽ7ps8 Wc\rG"!xsoO0 cB4]GO< =IMܹ,TbD$T dJV,j:' I$Y1d/PP@BKĊtr5D]v=C r : *dVWD=e7ɁA@55 D"@MٳgPR*_|^vw7?MdG4MT+Z>BA Mo H7^uFA._B,J9+/'? 4E[o_X\OqeA0aa7_{ ޚ_Ng M'.櫯agqoü8P"ۦ纡ɟa=0}E_3yb|(iX2)Lpݏ H8w J*0 ]Vt=Ȧ:<)L g*w#_|rb$s8dxD(h2Vk1Y :%zo2  BCM&tf0< w}~[)1,0 A8lyNgR't] C|n0aV4T8FIX}Exxƨ2,8<[ˏps˱ S}hEyæUt& 3|o\K ۃ)b+s2\r'(h°P=I˰#h4ZND*y0v%hX,E!AdxϬS^UQ,07AG P0jwt/N,zMӐN%QՑBXlwtz$/ckg\4" z4X_Q>bn 0BqT "h8,y0 ؁鈄X]^@M/C)"7E)Ro`u)KאN&)* M3?BT0L0E*xH&XGReyAF4EF+ՑJqokV]# [UxޔFJ⨪ꪠu|;@ A|.rSb\.ϸxv5>X[8^ߗpQa3#."d=? > 7L󅁦ȨXfCg[G?Av볩;/B` cisvk{o`(dNr c9/  bobvPYJw3wO,Xï=~HM_H0BGJm򾱈^([,~[y/"6Wӟ s8H|=<&<.]b c`EhgSvUtܺ:wk;"+f|ob#I~sǥZ@Fd Tw [&ppuuZm"a9خ:BZP)?I$8ܤhk֝>Ƶ(v]W7%+}? 19釵" Vd1&L~&fɼOegϷ^&!1qyTUH|JN8\ k{k<}{a8t?`:s^|nd~^tP7zXY6Ʋ Ùύj'ya\lX&s&A .]bχݗɿ%1Kq/?oLeAAǁ$l#Ҽ1pvn+3Ga?Po AZPTj$I 3BF mX"#]?Q4p7(% `qiV;/[fiv?cINYu<~k5F{u{ k'aqqѕcs b ֧C4hӧBIxBlt"h SHņk&>hu Ї}<.^|K ۃ$IDg1?7kw3Iu-LHqTO׼vN\]KhDh Yr{4H8<cfl0N#L@U5 Tju,Z/!` AiF$YFpJ,A4LӴj* dY1M= P,q,Cc˲gӮN* C;"io'n{蚦 bgV!d~Rla),-.x|܏xLKKr :ƤRby{ hտK|G#IfdұfO^i8 HW_vgP(dwOijE7d0XZ\@tL7j=(rr6 Ik5A4 2- ~Y }d<XvCDF%~Ï 6yO7.PKƽ^~'C͖n%^cQhŶ}tx種nfLLۓV;Dz=Z\S3߭Ց? 1fxcd~wWWWpZ9*.^8J xcy!M7F8vhR xG%4[ܺq {cTM,-CvDl!(kxa7_agVq]ؠDTbo?UQxq\*#`63';`S,I gps5C!:6ghZ 9f @]yV%0t=άsZ 12@AE4 Wܰ9 ,žhД^qV=z¹9\E@ Bqpp`0h4$mRΰ6;77;st: `ij;kl?7= n|yWFUϒX$RHB8f52LϦP(R0M KCI'\Ω=ZڄaɈD`tssX# eYBtX5  @7 X on#nޠ>gO#;ƃ`g_ C\x"4tg~ܹ  oQk5?d2%?IsfnK@Sh8$AU5Ed2Ӑ{b@uO?X$ 8<,0 z ?؇n{xGv&j=} kEr hW`"<{ٺ_nƒ)Fx #B}ƩS%IZ?Gd5~hn6[Xyq8~\ka '~%N Arj'h,Pƒ.Y8)3~E?X,ec%򉌅N3 dc 6rQ0#aaSB@EWPW(H`vv:BzCq0D]Nwʛakoc##:f1`jjyGf\ؚWϟ-&/_U*1F!*2j3ta4QjjNc> d=IF X? ~6"¡ 2 Zo j^h8x(Yf2T|n".Yƴ<=- V6VѓH ޾u{GET 躁lf n,ft% HO%@hq<)15b3cL f[\xۚ赾f8aJ%|hpmt ,uځcG]?J( Bi:5vZrgw{ly fqxƩѶWרO6 dZ]"ٗlgEInGg`5z[kY<So|XZZ(jp%\z=,j:Kz3a64|/c}u| E /<> ׮]!66PWMԑ  rNmy燪Spiz 语pIeϡX}}>B0ы M?w?0::Y-BAܿwsXZ\2lGtm\ã#  Di]9Kn֋sA:Έxz.dmSzp ]S[Ū4)L{wX+cxk阝u:&=͛O_lA$u]tZD\M7 @7:kp~t ;7Nh6=1k co?]On#ǝ,˺xZkmAlʠT"( v;kxu=gmN k-(5'SѴ9Oxap#~vv=MJ1'~VV]i=5?H4f\<^TM_R__HM^aXp$ɈbKDt (AUULN,z _DRCTF"\]!e h69 ETjJE0Hρe(OV(8BKkwބ(xWB 8? ` z~obÃHģD"҉4k5T $q@RE(ę!xx<0}fsSg`yH>ScC87=jQ0uffD7.//!$Y(GT ` 6v1>6x, C5$q凟b,8* lgzN%{d`>X x>b rXkuD4 /@UQMh6@hA o BE 3?QWME0Nauux jbK&ͽoDF!bJu-8X1M8 !7yF"P<l61::B"H00ygPVh4uAxK%lmipqKp^$׺ƴ >S@ښY2cNOY|A:rN:Z%x<-Az eDׇrbe0L+Thg:݇{E_66lZ4M&'P*W(HRmo-}cP5g ~?ŏ.?ZBD,A\FXB\C:?`&F)]/X*cvf l^뛴Pb9lnm h$fBH8 I'$4h Z{JSjFͩ&yޜR*@k|>s3 c{ժ XFυ@OV{iPy}>3f#H%S:%ɭ:[$I:E1u&&'3sL Ay$S G]'Mj IDAT+ 6>}Dd?szwvvP\p:{vB> :tOTP5nmɱ; dPhkg7˾8zvh G"mq r[v딟MUO?k9`XqJ(a|^Ձj:ԓl [543xE1:>RQ$XY[Çm iL [h,籾e}MlmmcxxE\kWqpp3QCu14Zn @uS; 'p{6O~I$RYhF\2cp{28^~%ܹ}4yG?_ϰ Mk θ׶w08z-OdSprqw*2&aJhQv$ PU?ݻwafR{,[tlweCl6z "߶?MaJŘ7HlU>88l.c``/Vsjx Ar.bwmPRcrlo?$Y ffE2 ^ 1`{Z P[Q*A@pyMS(`YO_^pa~:IQW^A*p| ǣ TdPopEzgF01687=bKxZ˰8?3!~]]\ihd,r+gpq0zX4MLk6Qՠ* :AD"(H%cjPd TFA4Mzlփ{SVUm6V"zw  cL깩ED:u_m#:-n2*LA*:}jBF$ܩmf\62~LcZDZFfʴ zՌ"mL&흯]@oIl~\O[/L@VAJeHp(*2Q$)% ?M:WoxeXvRzniu_zNϝQ9R'(T؛礛bJq20U3 cR1G:]j>ۮ^BD^zhrnfh{{Y1@Dt|n{:F[ɦ-w/􌌌@E| =iaII$(p{O:}>iħ.y7|t(ֵ5^F"4R>ޘL2|eMn}p }ڗ``e'|3%oz<=49`tr4j.^,%/߯$kguwub-:EQ7159 $(h<ѠW^£eP|,̏ṗǣLġ*DEoϛxVE>88<\K ?Dfh&g޻+׮g6G ժyrx^ЀP=#BRâ{T*<2x -P s?@4ܾ@lRLqֳaBB^ ʕv>7pf *ڛXYY^So~/R)#R辳'A/ac}=.]#T.}'f]N9~GG4sQEg1c5nԩ&lhon@g)/'q'p|xt/$ZT 0-V8֍_qGs8p_ȶP =R '{Yz EDv۽<~(k{kGڲ=3F=:ꎣT*A4ܹ{fC;~M,].@^:N|[pݞ;p F1p.\| GGG&aH tg_gI m>a}}}h6tDY,0ϙ37S,L]} }vt:a=HD#x<%{sjBaq(Kʁ6wEq/ò| %LF2ԙQTjTz/Ez!+Tܖ4dY XB x"R AZE(AW0\F X\A/)xkX\ۂz(UDSy<6@h4 A҇"YY\MZo@D e5y Sh- @@N%zqfdB4^/r2ibQe H02\ gzX@} #lnc0Wn^'"#/ 8CP<" 7٭{%,Qo`nv !CUh17 ٠-y^BHEs]58 TU3DmE-mrv8DŽy:gCbLSHKL9aO;%2vɔa7&b(Mwߪ"#LT*юԯU8eOfWUՎ>T*[>e%IB: /Bq 3$'^fY֤kx& $PUw>6n~ΠC8ޤ@ηãvu L}6aϝyf Iq~n|zu>''pdTPUc˕Ye ?  ~c#`^ qftggf0Zʹ%; /ڌib(R}޲ڙVٚnEi'ߏSx=b*59)b~elkCe[󘙦42Υmh69x<LAt\χ͍ S[mLy3hXihjŰ򊎓L{rE5Oȵ7/Xك,q#kbVAER-{f;:nn>9(KmD Ӟ1o N:;e[.M] lc͠*TƠUrް'#fZ~Xι[G=i?n19 ,| xp|ڢ:@xX04?(ށx03; ?b>/#=0=5I'e("ƍto}L3:ϣ!aZ, gZ !C׺^!CA6tE\~kڕȗʨժժwo&,F:;֖biyײS "W,[F4ŗeܹ}+cmeiX^ZuPنFDMkK[-{z(Å&5)SO%Ɏ}u㏣Iw'xbEIq~wkexq7ƍ&Jh8z&'@zQKOHa]<Ξ=k: nyz'7>TW7;}QۚP=u0 Ru?Ukn m/dǷ3iq&H*߸8گ&mVs؍_mw9ڕ/+d=h33(-Lz; x8mhG qp1 vas z>7>$ dE1!Cހ׫M *&G"GqdEEa6A*tM4M48^Z# Tm@64e16:\((% ǣRc(ʕXE٠|ܚP0q,f&ϠVohyCA %I/ s<-$J&ƐI#Rm`e{7.n=Zs/W0314DI`vȊlI{BYv W) ex˸h0G0@:RRDR-e%B) aHhQm40xJ:TAb(X9D$ vX9 9[Gȗ*< EB ap+eo 21 s+fhy DI%yQyAޣ% S$*<*2YB@R2ժ $Q*D{h0O4l`Y VH& ksR6ヒ;Ğj8{,f'd"@_2Z+/iw 6cR}k.ø%Cʕ8<< Z( NR5aWǁQx4,`i9)%IRyƋFi)2G` `R;gfi._ðb$>(+8039ϋy=`)?~Ȋaz*` y6pflFـ HfFfgP*Qpo?%v159DeY(x<ޢF#熆QTQ(&8YyzhEA&Zޱݵ$I^=8e[^ɓM=~jZ75X̬XjHR6 -UUD,:\C\^@'k+uZ8=k>'I.\nhDDf=UL2z viT_ӓQ,UFXذM>C\=Tƃ]ť% xkcm}A>G!(FQ[S(e*ԝNO{_dhgP)L%sTU[N(ۃvPT{oݻp.^D<>FGFP140zh<=z}:]% x|_ƭ۷iEARAZŝ;Tq`mu]axɲhpft{GIrIAj41Zg+YOstkoQ")c[7:/Vd`:/)3wW_yn"/M0c<+[Wa#<9ql^LMMQ?9u1{=N'] ?)zi+rX7#zTS퉀1N2)vQ 9Urlge-SPՐH$000Jbp4MGDCCCBuo׮_CP©hZ#=\jvv#fq-Гex}KɦM(ȭh_,j; ׯx{=z9hKmWu\qiEn^bN0{$S)*ZHG &W1=0 *՚+EcC4 xd" @MAKeh x^cd _`$c(F2Cހ/xgq2b^{9 VvПNa vO~̠/89 o"LB%hpB%W@!@`j_zg&ПN:DIF<A>R^x s㈄eX KUJzMW_x ͯQ1:A4DT/|}v;t[1;9a<\^Eބ̤h$?>MN@<E8aN𢌕]D!h<4 waY,:'aX?R( YQ/㗿z"Tl% ҩ(D^@Xs7.ۯ1B%h NO\.P,!" e>4u"aHEQGibtBÖ+@idm2X:uoo@0M8ut(~&}cN}XNJ< ;eCLqɅUݤ&!(ZeoA  _IvnT<57htpYH$шƴfTNzS4 5sg~ls\!8r7!sy<^,K5Ѹ*N6wccMczS[}bJ"Y "z=`#Ã(+Pd@,ADx}>DBAHˢVQZD C})eyey5u 4JR xA@>o/`zjNBoplmpOX)j&Q*W~Vllm"&VVB+`s{*nݹ g3âX.(b~C@iתxTQ1;3KL^y[l!z+CD|br#͸q:vww<:A KT48F~^8+ . ȟ^äs IDATSBk'8 Ʃn`Ű챻Wà1O4wm+Bk=qé1ѻZyMppq3nf\Ǭrsyb,Ed8]@`['Ϭ|pphO2L:rbcUMnA76t{D);=?yBtr?ua^}Ulnm Ϣ=|810KU#ŠG/z9ô7;K'XZk/kXBME"DKju0 ЫjƊNkWxПGRÅYg %) v0#ȗ*UUQo4T"`l6 ClMSqDQŸxPk4Qop8?;JApu6wQTPn4ND5h` lx /@V5l"`i},o֤]g'ǰwzDžS(xŧ; *ΠѤ.^|2syZyE "**n_,FQajb  +q rh494t Rhhr:¡jMX{KX˰=o|Y~C,:.Nӻ0:!vv<PױI|:e(zK Ɗo`<ϡh4Ud[1 f#^/TMu@pQ5(%Y4s0&͎zJSЯNuJ^~k߰oh5P:S7jvzP(:!KVMHx ۻ{t@BE }C%R)+U$qJ0TWHUqa666 ҴI@,4 U Pb?wn|  `03P]T qE.v.Rb~1җ)xXȲ4 :mOʷ%{|O˱X1~4^vL* CfAgppuKn{tŵWppxH,ahs0 4Efgh66[dAEQ (NmQ4͞ħ"ճhSk.Cu5g}V/TZj0ys<@źzT*LYTYE=?*/҅XY[cՍnO?A, ~)|٧fm_+@,&|h Yl/_$Ac 0qSпK`)X0?935 nN:<p8>nE맚kgi'W(R.gg];+CwEs7rZ۟pnLķG3%,]=12}m+X;0JR aLYOv9cgfQ(AtQXkz`snR p+MMX`qi ?{:W|,}׼WeuG/]atK(ùs/'ܜ3ݩꂡt:Z|~KTh!JϧOtD"D=O]x>49*^dQ(MP0zD"1ȠX`4" W@km$Q$IQPQ(W[_~ Z j ,ˠR@QdhX4Miۯ;щf7Kqnz}.bPGx%dEԛ~/Najl(!ԛ<:(ܼ|{yXlg+G#>Ȣ?\akg**RַpxˢRR,a iSaTj5pd2~kg,ぢ8{yK|m}|rK{xy\GkxK|5/(8u hM XzabJw8cchwHZ֠MH5}Uܨu1l5/V*Z/qWkksI]uNG$6ŴORq 6h!w*uqg߉enSbMҼ)넡qT](i7 k;[ f\%:Z1AE\rPȵg,fˍz4:hqLZɲ^hP"hh`O={*i`چ;`bl׏=2{tp(i{"awwC_ciq >G#A o٧EQǝ;<pixJq2'=fhP[Κe% ;o\.{idd&g|Z̝;Gz u5S8PX 띟ǣG:ѓd+t q<~?Ww_`=:]P&RX4Rx,bb LMbe} H agw2ҩ$sx}^<7B%]\W/հ _"aLO!%*Gg~ }DEK Gy 42i9,#Wb?t2FK7xylg{|wBӀ#58MxleX_9&kA|r^ <O K/?|^/80v!+0~?/fpfuNRobukޛL' J22&Oc(_z6?&#!.6 xpxC2?W) ZɑPZPc#x dvyi`0@DM]xqjݒwһψF .鿭6%Z|?D7~x˲{Nt0L@U}t[7;N!/`  |N[} 顐*2&`DZqmaڴ_J؞*BmcsoYz<wjdiČ] a0=5\>j _kDX,rtI%I2X0 )^*k6[M 'W_ X j,=&2._\!J2.^8{vGGu*o'zgFm{_rn4ׯ\{`yѵ@|5:@cssz9i2zm:Na0<:8h`ЦG@ۀt[SmMFQ $b1IZgzhӎKv]ׁ/H&(JSCZ"W ɦ~u~9_|0p8ܕjm=m{yw9">]։Ɲ )h2~xП3 [Itn%L?'1uvDž ~WS0U,ׁLtr=M@U8'*= ˤ?{wP(PMUi{^Vok˶:6UjmkB0,&&/u.޽}}{ǟ}u.7aZ_{ Sk7nO?O?%r9zdKH58}odI{崍Or\E{t?lu\wOl."NݦslgIVn8t"tdO~<lOh=Xq׿Ў1C!K$ K5u&Nn5hw3Q .dE[Q&wzzCcwn(t=A7Y^:ZnHRThru6WZk1{w{ՓRO潍KرIYA-qvf&''ۓsBl'$1eb<9Lm ]3 ;wi=H8&#/B?k5:РT`GTeM|m({XF0,S}Tk5~euQy Zbj|Ljx 03yc#k sqcc/|w6 P " #/)<  X;Cpz.@NAZG(5P_=>jUJ#cfj\6]sftJf/:VjgaL 5k QMxN,`0hKO@µ>8S\0 <xw/o/ݎ&i##WI[:A!I.HFp$1[k96Nq?o1~Et ^k.qZ6߰nū.+&odZDŽ,F,W+9qOۦe&x^p"ք7^ǧomBf5 0r )zwep X,zёȊJ]|^,.@d4k]CQd()ITes 6q`c|>(zqYpe Ų9ad)!P͎O-CS @x(O>yrYsm_zElmmjLj*%Z?{酗d9# lR\qk^ήk-e~~0 Jxcgᩛ/;_`>1::CQ _Џ/sR>h˯|Y +:+:vT{Oq<|fڟ=7U.jfn3ApqaUyi꧂ >~u9X+ߟ.~"WDZ:5 L-؎" Z]6*/pvѩVRtOGȹ (2=ܳ}BBnKɂFP {4i:G7ö75Hk'#M&=; ʵNo{Fc- I^3$]{H;qw[39-)Dw O+ގ@ oՙqNxpqa)=f_f9!7p;ZB+[e-vs^98(ܻ ?ZV MU10LN:J%h&j@_33DiR) RkW.as{Ǥz$ПNSs^MC$#@Q4̟.8 )BE"; Qj4qfd#(yxe(JC(Kr B >$ah (8^+(U)EWXAzm"hr<SyX~g(V9\<;!5TM3XoVoP,P ߺHMM 6p~vRW.CTA,Ņs3$nvI`[OvJh/՘:a VU`b.jgETE8QmɹXL+ѩ., X,"K<ӅcrP ǎ"҆6Br'@Q,gS./===BVqS{8Hs(-cPZiKu{(Gsm˲ܺ A%xZ{^"7 -v_ 6v 5C j]2$IB42ST5 B% Μ^U1>Po)k"0 AE@vQpYTgN=4 1@%q-hB9V@0 "IFBD !4h}jO4E{Mt7,xuPHZ*M{Gŏ.Am޻oJ%LOP,FȒ#'Et8vnI4J>(MtC E}p8]~k[ۮ#˲ZfۉW1:L^8B4ugQۏ `Ƙݯ}e1>> Q 5ڔb|!xpR)'5Hg@&ivSX1(J48C_@DRWۅy)uF$ mP6Qıa{kqI>x<>r9,[@&vW@ڎa:cbjɃcNc~~{{ yST cb| \0A|wŃqu|pw<_CVǧ Uhc ;xװO<>pp~!0x+ox Μ9 g?jҘ -EgУ+S~3(|𢡄 r458?n\6ɪѺ1N # Jͮ\B*0+j8+OX;2W9o mUuұ~8IܘnIPX(PȫJh%U8BT큪%<_G?'NXF8ðCHgs$xkXYB]!J2j|SXzQVjFqYsXƛ/=>RŹilc}{#HTA02ԏQk88[W/#x=[Y?gP xF7n#@TVVU !H}MA*[|ʕ*bTzesp Sc cic}(*5R="ddhvamsJgyQp"/!bdh 0ߏ]5{P (˘?׸i/pIUDA|,>X$8{cQP=Fè8>3t.!!"cxl,P,AV$zp!*fI}>llmZy`EQ U5gZm^`sI`,m.~pcc(`y&5Eu 'ʥ[v~S;ZF0٬dڰ˗.b?i=ujB=k7?;wA1+ӮXYA.@F0EA#]ɧvLdUUbI8YK OY@=Ϲ,&@[;CEm Vߦ`:G;]˭ip8l Ez{}~c~ * J%,Gu2::bP֛X^]JTxq"e=VUχ eo~;ȲdtA$R6t#dt|bA4<JQ.A y$Q݇h$>c#(ioo˱PHYU7 ZW'Rjk```뀬f[zGXWe#ƞkTv=@P0 x\sOσCCf3 40<4d$(\bSkkX?H(eB(?ck _K`me >>y{XY[:ǹܻ{wqP.Wٗd9:si~8i(\G®OStC;etz8~o~cpG>P[Rgc fpرy;!O;]'>FN,Zm̷vvmw8dLM5;wb{ܶ`wy߭ZEѐv00MUp=*1sٜH6'=AE'Q]ڽ,4A^m  ӆCxoBD*87 + 096sW޴' Nblfێ[;@گsg X8HTQ ac$Ú*Y4hUhRq.,^o@UU,,#_(RGU%Ͼ׃o~+k 2< B.Qqe e*qN$ H2p(" q#_(art{{ ~eu"a E^BT,m@%7 Z1oS`[ [^CZGPA$R13>/Q|j_A?x 򣯰H?ALy{3W5%171]x8hb{$#W('FZE(PE!q?@XD8_ovHLǃH(JXO;rz= &G$ֶ19:/AdL viܺt+_??0N(2]SQG. M@XDO8DP@+hbq{gO^XAoaՁmYB["Hkq\{:߷a V`@w''ɷz|.^@:?q82a*GG"aAHAϭ'x5tlehDȄr@#ݞ0dYBISzܳ &MciwPN#8h;~~`Y3f(xoZ͑-A;*J{i_ù,,(vY|!Hm84rVWWA9ӳs(h:f~jZrLFukbvC%*ʥA|7nޤE ` Aqyx.qZbR%V*4Ɛkkk`~ , ڋ9s/b):^x\G̔)suݝas…BݵCSR_3<Bҩij4I:188hɁB]e3oXe&t=؎ਕ(8P'ͱXk>C׿K[nZt{zzW{Bȩ}bffJ]²,ޡbcv if#yt0LNNb}}{G6fpPl˦Ӗ;QX9Pv%.-qXc;kP`kUucdTk5_CV7t>hz&e;Ln($EɹIl% 1?9}^J̎XBe:LpsAidE*  >h8b W(B+ZFCPT!+.Kp31=1/[ۤ K/FRC:_ηpo=Bx4?Gk`>63l'p DZ҅U'2X}|מG덣Za/@4,K MZקWY폮SU\.:'8TXzO `xhP\N,!h"J28Cⵗ_xqFbe98պGhUt Ǚ'hioR qzy&b7ssZ UQ IrS{WU$83^-˥}XBj N)bgU8 QT fg8{ے /E,Ȓjr3C__PE0> ^aƈq5GY^S][{``dw Yp݇&(֎69s Pы4+MLc;N!2ba1gZ8u( oeg1Xxa1DOOO5Lw )п $|6B.I g/8T7HE4=. çlsKA Js H$i"lj5ǣ5RҺ 4 DUp dR)nȒkO>Օf^烢Spj1W>= ꚶ5o Pz(X]ZAX :;txs03Vpfrz\S(y5mtJՕDA%H4G 1 VVG?w˟ LJxE\q+++u}\x DW_s籸0{Oz 3|M,/=@05=m_Ik6N [˟P asyOakVobus Qi*gpBEpp(_$h\a<7\YQuYCc m\>{pB UeH*խNM"/SWuEUp ,LP*W>z{?@>_@'j!4 CAȒ HYVQ173D.% ./ܺG[eJPkp{ {cKe paesb}(dEŇ_-+g1GoO_rǥSǐɗ6w{x>n⋻1ߋ*_MO`{/ADAȢBP,Qp;PdIݚƕ!H$!jZ݇ԝ Z!FQq.9иt(@@w)EQPׄ Q`t0TAd8=/^(6efX<ޤ̈=E IDAT^u:հx<~X]ԃy~5~ LMNX*^2<4R E-11+iv&:3 0=h'Q)^+np3:rnۺXrRhB:3?|8ҭu0ZGYe~_{[XY}dSgΜ륱P(׋h58XA:E8(F._$5uzU,W,J29yj+uܹwZM a2@Z2T\DU1׏FY " \| t"Z6D+{TkI/b/QU_\Y&AXD!4*gjj)^artt&SZs\B(DŴ "!m[5~AEqiRҔ\h##K:J^Wz'X0*Axh4k a5Jͽen}O s\vb~~~^v3L4Mv[Bk[WqΚ#[ΤAWW=sfCcȲ[t%3wmt;~9cT@rqI]OSڞ0,8Κ'bh5ɓr=cZy,Vq%DLOO`;!N:,`>SM] uT(@QdȒP$u@DmߍDL*&{5 >|f[˥"._ݝ;^|E?j}[ ڑP XEoHpq. b'`?B# "NFZ062!S(!3}$39>DKu E\=G;;1 r/SAW!K27Fdj8.@ ~{O?h T1j4z``oς XfגX&h4,gwWם&###d|0mWݎ-., ypE fv FLX*Hb.8*y[;Eu@!fNQKҵ%Agw 'hO匕" OWgq7 P⪮Khyبu/:#IwF9J6sW+H3M\(JE JM?QNt4uΝ>/ +]w sSKP(EQ0=5T]9ѓF x|q&'&Z,C.DZ믾'O롺XR)#\fjft5MON HPZ u/,uZh̾7b,N~ACf-C(}꠲eh/Q,yxxl+I!NYB֑$PU<^pѰP< BDu%I$Ƹx^ tLu*2.9&h~*qW'joL  iik1ÒP33V 4 YJD߂p`$ant:7i`y^x(:% ҚܶQX>tM#CF3F"MߋpSwla<T:j)xn1{}0?L6,7obiyomd3YvdYP8[Qfa Ek. DIVVVLC/kw`}ck}jj E}ojìNuVFi\2@ L]ў(-մQΞ="酢`.͞‘UE- q`LivvPڡ ~rv9nr7IyqtihYuXkn]WCԭ/i^;k8Ȕ ]l?dv Vdžv*8q={m!qV6-0)`>*hDy 0jB0<<mj ׂNwu#CF;R\hx גi`e(*10UU P1&knm]i]psxک50x<EawޥK]lnםd{@/ֵbuiɓ'[cVF&=V/Gm.S͸PכZU.r2.7¡j|T2DQ8[nUM[UYFVF!h!`9$K'AT7bs'H8 /<[O^_Ǚc|~?~KR-BQo40ߏMu 6r"B 8}A: e-xPR:lzǍF=뉠!A:qZ:1:d&E MB*jJ)4Dx>l%0?5}|^,Lc{/kOwށAPDTA,BP*ATCT},ˡVo `im rcan B Kx B S(*((Tjh"KRG:_6Ɔzu],яKnX.֥S|F;1@ h 3 }H> pz=0r<8A($6p AELMV(2zz¨Vp8\$ qg~`V onv WP. .M@?L/9: lZZmzE)q{X][ӊTҀV)&F-9v#UU){`hWޞfHY'&x޶F2Fb鼋zm~NC|_ VcbT077|Tt `vfccK$`҅es0A2ga j&Є;qF$ɨxH@ wvD vuMcYB}}}X[g_TÏ> :JU*#em4A>3nohPPKL&K+RK%Kg^T!M7W}FH1: e=i|> yh̉,4m)0ad9˱V̴1urYŽ^/X?R$j,g>O&/Y=E[:(-,0l Fn/f[TU5jddx9MqK[ݸ `&-6V9m4d{us̠ HMaLKH̩qvEc@P)sg`אk͛"D ^Wŏ9F`s=;ҥK`1Fo؞1wyobai~06n7W⅟KTm`pHGmɡNUllnu>tkus7bbN͡I\8@=VVjk:#$Bֺ)(Zr]UD%595eDt8<^/d?Җ^DQHހFCT"SRP$,{PpA p" 2~?=1 SǑ+08Bht?pm/V( rwAd'.]<Nr`KB\ 7`e}  bK .N@KN!1:4ޞ(IrPTQyL RA$|}D"/?/q$ χjC;>~zøo^?WỌ!Jh8O [\81˧a;B2F AX u 0<؋x$ACHgh *Fcà yB ׃D"p0׍t&E01>!">m]?ҩVMa߆QhWa.l:wCN[QfaE=dHbZ kyC'YMO|B~v) vM:e0*Z"$ap`*q=1uK'~^7 6A,5-lhW>|x~t3*Ԉq$1}~AzH} |]d9C!{KVc_Kjp Q1?;l6i)ZǨJS lmlhA:k\dE$N<,Ӧah(a2W=W܅s8/X/{V+`jjnf7{ׅ"K{hxv|*n1=CXi= ZX!x2FE K2=jk-)O?M[y$xFt.76Ox>t <:W\1rE.-lWy5MNiCL:)t~4?Y C-i{h:&~n҇&Hˤuе^{s _ ++4pd 1l+:mq;6f[e ;mGuv N;N΋ruiswZhZ7/UDvNA`MWqqTEEAE; ZĠ^[$IG tN'>γ'ځyr IϿwnd!m:hR,?xh8nYyn\{ 8xѴmeM^+ !Afj#T ᶵsm!{ʰ`XPyȊ Eۃ QFp\(ʐe 0>6RN(Q(>$!5xeY&Jj:&GQ(12
I CQUpqԉVy9Lbym={" GOg15:H0Y% A@_o  dYƉ\pCHQYq"Ipq?F@07=Gpݘ~:o=s [Id 9~;6,F)s\& eSDZ녢%x<؛\4u+Uvp7 ɲ&-w㡳 IDATc0;o/2֐P}!c~ŗݖ,˚ƃ(a(RD5ADXB(ZlIT/RJP(HAZi`Ԉ">DxSDDtsxw;H&=hm aZ <7rGtcnђtg RnHƲhtBmI8|'utq5˗."491v{)dMnY,-d kk}k{[y 1Z^;rm?vm҈D37އuP A$¿p\y䋨jȗ~ oUn&qqo⻯//#_,eXT5du\<}/ܺJ;*:1ll!Ae%,M!D^/Қ>Jn [,QFA*I|LX$&F ,ַw>}<##lCE*cnjwK`so@|/C(7_A2W hH22"rxT/irtrX~zn B ùYrHsӷ^_l%Rxq ۅ >F{4Fz7o|kO#/"©T}vb|jˢX,@h4d~tnh$b!|N$bV_|5Bu<ԓ~DJ BBvLLNT]!`ܺu ;;yn }>f^Q3&(JՋ\ Z਋S붡=S,) U2c)~;hSؘwDW3,Gkb|z򃏍:k 0 G?#_+Y\Gi-GlMXu<S71Ze> <G KfuL@K}>Gv,kthRpBiƴ)vYQLS!wB{" @hˆ*3Y e~OYV y1>6J AnۍZV]D#8u8vv 4 NXj|>Z |wbU˿  X*#nU%F aп@!?$iC$X3|P"; b&VK) A(-kLNL oeY7 !EfF<5meAV\.(R-PU;Aq-W~5o0ߏ\.h4hINb=ݬh&ӧL&MgɎvbR{qW;du6[D7SS: a-8{X9o+aһp@u`쎢5ߢ '~KoFT =l?K.3blrI˷RTh76W_ " 8yV066B>>ry0 GQ0Jv( މtbX__7u0hp)d2Ǐ/"Nì5at Q)W\f@h,=ZKo:/}e{zqiBVq`(jL)BhzdϽ<߿kỸ{:ۃ!Z 0wP$u[c'ݺ#Ut>}tf:|z{zV83~Jyߝ睷¯"j A.esE|~VvW}*,+&''2Sբ(mk 4-}:>3j7mFFF -INs'eY6>z- tGF"WϘ)*ՠ<(6DAriؓ|UWU{ t A94C3$uڽ[i+/Յn:ݺY nG*~|YYY GhtwU>>OtDʲܹ:x-ȱzHUysOGḶy'hB>o{lp:DžypJ#эD. nIF{m@P0U7RB*x"ҍQ.  'sG^cC9<^]EӠs笁|JL: 4Mprqrr4E>r3Gxs>GTsp,^PT7_?!fL`uc4MclxZ?凐eK3HgEy1?=+N<{wah"!dEJE$a7u EL!W,mp :B~/ҹDQ~eJp*^rCMas7RrI(#wy=J .)216l_|^~n 3G pX::\.oŅd24M!˙ka @ ĺ?X #3JK/Zh 4M0,˚q UӇ(ğָ=<677L?cr}zXbS pt{j_aqA)qI0ƌ; bX{ɤX++{1A0k~%@SնbfIi 2a|#QuĸwK! wu=G$jXy~h( bNE7.Aiwz!>'G:',F%wHӥ;ߜޮpk.-zWbxQv4p;zǾ gHshxpRI u94B K[I=yOdA7z=6ѻ$Dz.@7'|baXE?he$L#CUje J" c*‘0)>%{WWVmF5,?z\.P@&698Cbb4 IZkaq͐ߑtQ%Eg0,VֱxphOM!\*C ֊( ᝱EaiiU"Co~wox9$voWW\V$#G $jurPXot|vw(>,qX_OÒL&_nunbDThK(Nz Ծ +`u1>:bkiӼϩW£c!F8jCvoh^qLzͅ@#UQGBq\t4 pONEڬ4 o=7EQAicjOÿz.F~2n6YneOLuER,Y3X .sZ)B˫苄14Mch >FLg1>{ `i ^e)*F<^4ck{ @Dllln"sX;e z/ gl=ƺթe\g h`(p8zJb&<#J`֘"dl)}`rr4M1Uc{{Gh@w_3ޯo[W[fzluҋٻdlttZ艦Pd |켁U X5b)K{Ҩrټ6 =t0[-)hg4\t[[ZAP\ |jfGCK,.D Wk$mļ""ÇxsK&tµkW2(œQ-Sd.\{iCX$vԻFFFۃ,'Ѩ\5+`:Gq^t._:ܤG y012e(knX"zchk$ՎB2F@Z{13;S0>1;? .^tBA'4%h2O[*&Eei!tl(<{w=έ[iFZ`^Ghzc=keCJ"Jq{ ^]NXG Gx.]oTjŐu`wйs`y2B@:b; G(:*v_Y!1P5< .l.A$>(ѷ,R}@X nG.s߸;,2S)<8@߹}@j\\b_g*#FPUI9 X;cN aMxݻZ2>>]jөkȺlZuA1N|rSX:ylnnWPجT6Økm. 9/;hM@4AS7=5qKo u,c>}ꔩz2ױZ"o-j*A/1wXky:EP8T:CjY*\^E {}TUm %2 BXסF6O7s%,灢*ƶ#W(A4}KxP0Lϋ` kÐ$UTrhti}Hxrb J26w IΟ9R>dY 78sbV{x&pJX ` ^*#TFD$(`?Q?P0h$\ YU@UȊ$1[/Ey ~샛M)*} PTb?_@D%JEQ!HD_y~~m~EG)KxS,oczbI &ٽeL&ŵsO?ѱ!hpdt}{HòW(Xn2L#BX4E^ADe04*2EE$DR&DTo2&c'("sYD1FQQ7lVVv:t8kR*L!gNFҲYѬյ3mdžl{z% BcLjgUVVqvxRnZLSIDrouq) ĹY4Mn}m im`[[8Y>pғœ#0@Ǚk5U'TFU*y5|)bm}$Ut~#ajdYEf1994 =M0 kz*g^2a QV{8 3p,^/Fb|l d-)y H%BPZ7՛h4 h4J%>9u |@3+"((䛜ɵTWB&M \Q108hIk:rVAA0c(hV" IDAT%,0v9Kdq"KiDX{ ˃eYۺjzNx1YT]@{n]==ű_%b8xԶ}0NNH0 М?ۉN $\wjn!EQͳtvϔ;j7[@QOO~CLi".(`ҫ%/_`DX٢zN\ڈ%v^.f☱tkuQd۪B&M;EQA'$ik7VCV8s$R f"/hRQo4 +#@n%Ks>Ydr %Ȋq) $bX%R ܩHD#IAd0cxH/#ch(LZ˚X^2\ Q(TEJg2 `kg^UU04G\$I`PC(*(Kp$,"ΣZcL>H; 8 g@i I!_(+~\~h r>HRQ'%4 cÃN*EcbtZ"r*^m?އ.?۟"aaz{3}4X, /hg <,IB^pPZFlMUAS@4D,F>h6zШבE! &F/!T,|xh+0??7^SXd80.AǛU5eYGΙj5BkbIRx<8ݵWBd5gM,r=P,I&u,r"xST0?l6`o8@A%W0Ѹ;{]mw1\r`P SM=}.ctvtÅ CPh%v_J84RjwjSnѢebd"n (=WkQ&9?j=h]'ܛ:c8xVᶧp.k& @EkYA_AZ:L"gy,3<#G=:ۼ U9|gΜF2wvʈ 76:=>!?ژ< 7}^adg9]ωKf;ވ7wݽ8Xv{]7ݪi̊/X299c\ä*ѭ`xdL&Y0L6lȐ 1qmvnZnwaa~>g,g&yᩓ'M348m9_+ O>T ڲw#QumXߣ*3ҵ4˗m (ʥCpG/ caalֵ2H򆦩[E9hwNt( sh ÓJёu:0܇jzլ$ٌ~ȊtG)@N@R^FTsMfpA cmk8*h6v p|vZ,J2ADT©x$Μ6hQU<ǢRh04QLAZϋJ7^Hk;dx?DC:CJF YQ0GZ#] :@E4y7Ol$QP(p*B?FDZKVD))\8s}UB04T&YUh HØF)flRXFP$UgUP `AVP74l"artw7092}/čqj~~r1eZu$bȊϋp.:oCE$S 4>CjBTh"A2( XME0$چt%PX_F4EJu6ajrT+q4M,>vPi5K1bSUU ߰_Ɩϔ4%6@65$q}a|R)v~ޯ amB Ųu˜~,F!$aPO3 ʕ ~G+sIkY{1? *d#`ƞNΣ=q6 psXTUESm㯭޺R> "h ^% I2սBMS&#IMSx!/8+euZ` SVtY3>hA4AQY!"h&/ke[¡ A0ƈHsC.3?UvDX4Aꅅy.UU16:BjaH5*zGֶ6C!p ILƒ㸶 s9` Q{ 9gK[cS[ zH8Sc'!/ܺP waj cGx@s$_V}n weN\::d',rv;qP>V$eً۳bPmn}_v7MCR: ,c+)ʀ`hpպ>(T+eB "+"}o}9@٧IDQT U&@ʸ͚wj$4\3=,Nˏxy04"l:ĩ75:'U[Lj+l??@=ޙή< Aa i. ?s|zs\v#qd2<9<~(T'Naqq _&T 8"v(S#P $c?IlC%uG+84Y ^*Ex &ؼǃ(} 01:DX4R`ǎL`s/lO! 㓻˘ARi897SNc/n:7_ z׮?{7n" #+`i(v苐*d&Ahh@%-|On& |>!on_Tq3XBLKq CW2`h !( $ɓlk4Z. IAxpFQ$ɱX̔ R`\ pU PxIк箭cV,ś^oAD?JBƎx 2CC&`ihP\ k~k" yp`5 Lӌ*@*ɋmiǿ&$|񲾇?#S-ƽ4Bh6-~_ Mիl'=\ne$U~E4 y뵁aCX;<|~?dC`͈aA3,ǰatUku B넺e!\8C(MSh4BE"MC00KUU MdM8A$Q@8һ5໿2ap?80Z3#h*8 Zn1t,c+5}~.CQhRTUځzqTKg2`r.M(!nݾ %ݤE~[&g?C(| V{16>>`$akgi,X A}=^ cxxbLO>M"ɧ)!Xpcmz-3~m‘+ S(+gO?iR7ZdOb$bPsb2N{',ޞNK/+NY =x4wdj ɔ5m4,oxjgn0=pwV`Х"WG:ӀSQed9n6f=NO}!"i:'ҫO)AV3;6Q(,QD fT4}$"Zk Tbp yy~+Tu'yQV!Ixrl>?g Jx4 dYSy{xLO׷n# BӀpt8R4|^/AЃbhǎq((KHE "vv 4]vV#cCRE"~`Zx A!$SY|]DADAg(kx /щ1 w?*L$P7 QiԱ0sR/+h 9e y_:OPSPT j+[{x3XÙY׿pd|w0=>XJeYjop _FDIF<M񍗯TMÕu  K2vSixyOǑa|Ss(L㛷R@l6@Qc@ACQfCUI6cX51 /H$@ ` ld.0î'qD\>b73[ÃCOƁX;O,-Eڀ@DZ y aP(LcrbrFxqԕKHҭ"r0xAS7Tz큀o=xhg) #PUCCz'f';n&jexL䝒-.7CQ3h"X$IZX!a.I'1(!rY*%YA$Beb1Lb5 ,!- # P7l6NM'94Umx,LV4UsTK D:V#f>N(JD'ΠVCHng<g O`|lHtdLZ"]џ#ϙbfr Duȋz) (k8UD*a ˢVoD4YGGQ(kaHjh4͖ , QhM'?ty#^B<7F~oݱW 3/Cz}~Ȋ_| (Je'!}炗ǫO@Ύ`:M+gCQdR."Qͱ02:T"@(H5(ʈc=B IDATۿo?:4"4,ꂀ6066 #/@$CXh|[ێ5|_/.),-!]%y9u[@>oRJLY2槷nu.,@p.N0a1m-,JmQ4(k۾8~ $H3Zu!8:'p %I9 #f߯ .n컕0S,Vs}ewcK++/{1i]G-k `I5Q].,5Hs~hwFaՎv7n A24R8??VcilF@|FRdlg/ys_}ˏ>Yd``D.my\ʨ9r~sRIGƵWC.97?s.rKF4m867z2#qUBw%L !?tra۰S7a )׉ U5wYM{}y~hLQ"~ <ݙi,+:AdE4@2C{j@/EUIeE\b|tBL4}Qdryp,lRh *ʕ*D YQp^ރ3H3$Iǯ> EQ*156UQ.WQ!K2>/>rL!(E#Cz<7 14@ Da0 r2Ncg17=Hg7n*¡ hLYUjʵ:N0'_~Q( * * *x684x&:g0tlAQ6ħWp?6O? (WР`?[Pkxpt&FBAQKѸ11Ri苄d  Z " { M0 h8@ل7COVeY]Z MSA $Us$Ij1DU DX#ΒNq NVAR}#>VD{TkuhԠt%D%[CHg~:d2A[f[UIlXIvB$=c}L5tqxG\[j+ʊY<CTzwx"E NeH$X +o 4IBFkW12<=B숢.q 0 my$c1Ц( yl% )请m@潪ȇ*2% 9k{95 #:m8}e/ܑ%Ft>,xEYr$*54M]Y&eS]zN+{nc0O.AMҥŀx0b`ilηq=hk!wש2v{[X;x XG.ꫯBEkU`p`l?5?b~~Y$EY)'S@@/tj3iLLL ҿ? ‚YT [[(:&TTͺҞ vxƹs`o/ySzx HgҘ9r;u6N>q|q O.av~ OƇ7?@1(J(8/)*huO\)˒IWqPG&GRУGP();xtž:}8s v{8I{0pIv)u%';I^`B6^Hfy!'6/΄0޳\0PSm@ޓ n!LLyfX^?M2[*ѫ)0cHb`B &s_8,R}_+ցnAC4T*iD'lAx\8;;;Iq6IX'\NGWu+X$[lki$mhu|xx/>8qYhe BLidqTu04 US16< X*?އ$( ꏣX/F4AXARE\E\UðP5DY,`/F_$| `|d\C821͝=E CEPo42*:4UyP,E|P( "TEEфP? b04qOȗz7YQ0;}>tH(F e:NMA@* ,`?x ^/Ɔ0>Lac/@ ˢ?CP J84|$p\{)JhM ۯcvj%Ȫ ~ ׶Qq Q7q2N W,Vo&DI@E"%GQ*WE hJ(b~fbX,SMAU9^,N/-`yen>hU%,#ϑ_~.K$@%CP3;EdJ8 G K,'^kk}4D0:2q!7B@oO釱Ofג2,1 cW%o<4GLpxZ38W~?\,r BcT* 2pɶ赭M3 vPEU$@ UuP4m\Uw,q, mA . Q'I1HcnW5yS4^TUbP@4DQdr|kX^YG\ERA@<$KCZCR!YNa?A(D$j)5M:̟EIVЋ$=Q2:dTs.|43wׇ,8옱ޓĨ\t2%#YYs* RV8h= Xޝ 2+AwRU կBb_jZ,"Ƭ^Xjann錥BTlϕ:AĐYřH Ðy,Z\z\uf+Bxas˹XNysqr\Ia [מNմ,`k8Lá\w٬'!3tHpn;h.XǸ eޭ[.g8t?;cpp5z_FkE0nElfҋ/ae1f#Sjc}6'GGյud\zk{.g̵^[&[, h48@z h[H =\vkPe/\;?1dY"2}* Q%%gf.^kŻ[oW/ns?6ǟc)[B(*'&P.Wt>80yW2غw[G{y?;ayVEKՌ_ha\~11d#y,$v U>8>{YޅBH>W>ڒÂK *bI/[L<{= DQ0bLߵjmqp[븦(ʝ12_ĚAxt4;(p<]缸` ՝Iju|[n+p,q= էZzpg'Ùӧ; 3p\˲n]Wjm(TU_օՓ!e +/<5iuFxp#G\a2%Ƀ[ 6MzcٳH %ĸCSA TU,**TMC(( Csq h2hdE*U"/!JhUC$NrKB$A.$^j O?uB@#x6wPTjͽ^߃$I 8ams b >/rQo`}c B>Oo#>R xHFۻI40D!xyB @|["ևD_3yuE,;ñX=l# `Zoyo "QBV0y8x81LZobrt{iLO)ܑqz;wQ$3ynFP"Jj_zG,¿{=X$i,LOVoOm|C4MAqp8^~usx8C(+ˠ)|E|~x&dI:bOg,$gN7o/T,A%ԪU~ȲzʋBA6(F%1<<|>Jx966f!j4^(Bz~pBb HaI:W,sZcR (յ-"~@Q89ӈRKkf֭2Zn/"VVWmfD )Z{㰱I[(#<ƜFx2>ĹkyE'uibnHQ*{ i<0Y!xz36Pu,×l E QArm C8 3쬴HڸݸIw{gl:iu{PC @m}Ww*_fVfUi#eD2i>R191L6I+r<﯀cn0R, 0SʔKCD;EfMكT Qq1 cA~4תU:}^Gw=^;rđ_B]|>OOtsZg9~~jtϧ` N5h]I횮`ռ>MmGX#F&k(1~/_+֬P-?9la}i02 xm [6b=WRInW3hX˭|8hG{?G'Kt۳3{}I KW2iO6'lsq-y70=3ys9|(J8w~:`N+Qխg{"NZ7ܙa L NTv0SBe^P,!bİx8r8VVV` Ngclooc;/w|{X_߀Vu:(x·?`zzx,m#Q^z7(B_3wdwc Up3C0B&W8rPbxdV~*(ErݘO%]]U-KÔLݽR5a!;YG[a}3dveorlnn$?YCq(Ts88u,Iz|v9 fsVB:==MsΝVm[.$gϞq͘-u펖 `凩놰l]8lźk z떉rfޞ|},RUۘwv,45lܴMOL^d"/V]P-9ut Ƥ_ Iqa'<֣C*hYEZ{YlmmĚGC`Ȗ"]]#\3x`6+SnbggCTv PTJ z(WDT5lFw"(b(䪆csmҪ?ӅlH\;)H QV1׋h8R͝=EǏ`ay\;{tc` 3'?å'!"N)151 ׋p0EU `{ǐ/baihR ,C%y,awo>}VW~JI)_CӨDfoBf.~D!-\}c p*M`qm{dE`?խ$A*[@W,e7v䩣192n*O籺wQeuEL c9vO>/H(u&OAtoԑ)m@%Ket¸~xAW4'Ϝ*b!?M'1׃x,ށxHbPz{_sO5%PX#>1Vƪ`xܶ1,|>ÞLA q 1 "0#q ]8VVp XK7'&cbMtc:lz wL]qN]!̑R=62LX[WUR/Q`|| B$0;ϘeٚHԙ; Y3km]>XtCZfpʰj:.ll, 2<z{z J"^?AOW c#(*f`nܸ*3m'>Fָj38h g9PVa18ЏR1 ‰vsg]+s)cQH$Q{FS#|(ћI^>Zm;Z%"!S'.w uG$nߛն[KnN.~,4H؟ZaRO]x6|ptd?ot1nWѻgp2,tT$ZZg"͂8#+`c#bxZͯp% ΉKN)C[ PM¶W1\tc7}}H%ZGな=T f]_>;{id;Ueث섇%c0Mfc ,ä:p}{{@4di8u$vw\fn ->L'v~)sZLM}aiC_/4,T uRS_܀tVUIػ0@,INM@t   Q!,;_*Bz{6¡ V /yx=|IE+[CMG_O7 i T YQOC x#OC8T* "DQϳBY[G#(ʘ;<(W*86;h$q]ZRa$6vz{ ^O !i4cǣT5 >H{)LOa7>/ROo-8JN;QTL / *UģXCwr_,& b/Wŏ$3y戀I" ^V6{`')c,>RYoaztǠ+^2_[wRYϋ5Ģ!T* YFX@UdTU"ӮEID,,+58.H$-~vwb}}(V5Y*Ek.-rC ԔL*G0D%/Ϝ>ͭ 9:Nb&o&nSi3HӘõ?NJx%Mcddb }}Pb嚺ݠv2S*@ O>m*<:B>$"NjJRz1P(YV0 Ţw ˁi|~/uutp)K?Q>GlKmq9;>J\*U6̝6ćI>AѥrlRQ~st&Q,<#p#G86;~_tI/?g8)d)ܿ^#\XW$EL3GP󻿃$>v APB>@Pgcem"\ /W' 0(ǓO^zEZ)hd;h`VTgڞDšh,T֦hRiϺvtfLsjOt/p!?6І*6fGŋ H<hͮ3ycwV$>@5z=q*vEx3ٛ!-ƣ.nwwWκy0;2 ei f099>p~` `q>~]fU*ȱB7Hn1% hpWlwiݤ|"M^ mo֭/Iu- \.p4MԔ30T*969UUt71ds9kiwVɘE8aQjzOQ ;ka@$S#sEP,!@p,(B TuJL<̓XA >5fY=*;E" *cnY:dEE,Vױp(ptA0"2?6w BPUDbcN^>Cyp, `"$I*598CC: #_(!!P,e92VNr$cmc D%? *G[wQ-DZP5~<"W(+PPY||]xb,! aekBx<&ѭ<2^W6!*'n [{)チןÏ;_¯`?ɻ#ˡR114Pȇ'?VU+Oaqe ;e 4^$ YDC$D\B,sP"&@t0,D~X^@EȲd7HljUan1CG`!- e Pa7׉yTURxe7-؊BMusF#Z^2o ǘ)0٬P#4wm9ipp\ΒE$ #7$"5Mz21k7}7ǢI|V$WEDXFa{HAUz!H&0e#08^SDcirFgb drLM`-ߏGcy-X4ѡAhlX4E P2` B#9"ָ4;f~ڕdv+}^T oZk<Ú{N"[Pozy?rV*1H㧃Q_݅({ȰC&{o[y} `>ߪgXvd ]7AR $676yyZ $pX\\@?%p4of$ DՊ:%+k[_r<Y՚!pGTB$/~Kw A<wP T: <^+O!k46:jϮ^ksnfʩiuܜ#on"/iE@>oWswx nlO+,[p kU$ikWӀ5lj#^K] 4r[[9P]u\3w%/ǰ˺{CV DۋHGQ(r<O~:AD_ʋ `` XCPA$B(@P} P>݂(WD A$l;C$L=^4"ۖwTV!2<8!#3J^bY]"󢷧 X,@*dT6ʥ28A$G_wubժh8x4x4Rx>TE6NeDkJ0>As&1uq]VM{$@FF;VZ\1yA@ PKꪶA\Af8F01 P*7nn߹`0,iF4dzV־lvq?]pcZd$#YD.ÉDZVƣ]w\!ñ,A c G"Z rVK-pt*Jw<_(T:tzj i ,ǣϞFr? EUxU!CyT*"R4Maqi R`r| L==5 48r=Fj$! X(#O9^0m! JkxD7n5AooC˵ࢩ|k pϒs5[ "Ro͛ +ޅ~3ZJ`D EE_e}I%D"aT*'Ʋm&^`c?F+Q 0bL-_2Zxfa3zbdG=a_rmjW{ڹZ@p+~L!<yݗAz<ݰ]p“/ƍ\>S7%d&_x Kzb|m2 g fb~6 .8ū{6B>dC)~kr_.H2 I1q j8jm #_( ]ó3H'S0XY&5}oEpoa~3ApPoNR'Ex;sD6]Li/VUX]4_ ӓvS,[&aY( h\UYF1n`fap|m4I1,3bχ>elb`p}0[Eh75Hz(XyGfgKCs^+lm͔ul?tz=ߗ!pm6ܱA;<>Ƀf;;;Aݸ\r U.Jvm`? qPnkkQR P(?W?-xى~uސ6u8q8gMժn`)6^q=N-">_8kJvP(dU'QbalYp;;<^_PF?O1y6Mľq5p֛w' #^ 8q8m`Ig=Hg2r岈ǣ͓;csi0s!&Lno@M<6J9hԭRtqwXLͼ\ @(E ,rA,Zՠ^ * 0 }#aeQU(Vzp#8{׷ӃuFp,>v <)"~!TR F._@4U <ǁ  ("TPudrT,JCyKCUU xs EEO;bEQS񢯷˕ X(K7!2¡ "t]{P*FLgA*"vx dr^ 21b9b$~׷<Ɔ 0ۅ߅:&06؇|!\ 㰴 ]'86=Td&A ı YQH c'2o凐$ P,ayuCER+T:A$qtzۻDWVQUU|7nނ{sfEiBU,I5h"g5xtt|V94,ARiZm$+ ` ! ӰZ躎GMNZ!e|~r99byz$A'@wWrL,~3YLA$:~?$YN>EQ.W.jUs CG.gzvP(@U4q#N0B sɢ( ]t!yլwJcJ#GP5e𚌕h4 !:BB8XK,'XkL, n'(4 eus^X`e.K9bΞ;V)eiP" ϲL;%3,~?*/>a3{kˉWz<҄]nS=ZJv4Ǜ:RƲlC~vyo|gr!ϱX=(% Q\G ax/F09:PΊ" I!8< J2T8jWz + Fq(X3R   e{Q( UhnE$D@ !H$!L\+/<{WPU_Ðd,R/qTjeݔ-ۍ^s|>mAAYI 1e0ߋ b28R҅"ɹi|>H889z,&f&F0753w!*zQ/㕧q\_B"b(c t+$E.zbaȲP~B$_g xP6kYF(C\F\?{#"C+q <7"!#M*Pd @yˬĨ>fP0`u댢(+pb9牻Y)D X|D@[a088bd<P)\L0miUأ: z{{ s_3Ι,~?(@9{xtƺb;b\.^$zYlnmYrCr7j.8ImU@c5Yuc5ϥ9`0>99QhVI8Ma P,x o%ݒ7dltԌ5Ó<4e'&Ƒ/ˁy0OI@ )& Td*JEk_y.⑹YK%p,>Ax EpsO!h$ eU0&8 PӘgJL;*\Gað"H&N|ʔD3竪`jnEKn ~*RiZ;˚u0[ҵa9<Ç#ZdG\/TR HzOg },A@.J0|DfeiQ.S_MS4{x)fǿgH{A] yvukK֬Yk'qa'`<$ Ą+Sꇴi ]ǗALtzLɬ2.@ lZ)UqOZF`xxE3o5!fbSvSC|!Oۍ+/!ass;^|,߿W_ҽ{z₇fYgEptRLLN e @T5cN0]O 6sU#݁"ruqE۟ cۻToL)*G, SvX6wud9,jF + P*U=ZV/CS3dRX[YEE{S.,"kkֵY{E3Lc`wp[\t-40Pb!`w_[Zt7?,Olg_L*Vj "t]]A9_xfؒ` ]exR2Aj $ۃ .PcЯ;DQtT;a 8Ɗahَ8q5<|Ȯu뮋(zwݝ:Qxvx0 c*GLrƮemKF֖0݂}K։Qu(f~rb52 ZOܮkUb~Ï>jx>㣨T*ARq%¡(Ѣ~K-KuyOxqlnnR_SӬ,37£]qg\[7K#;ƈy?SvBͥ:[;cW,C'?<>E2FJ%jUC( V5 ZOOCxA!I t%QB0D"B' ~ğcnfg~ llajlQ%U cx;{5YW<&@$tCQ%ePժ~?r""UETF0Kz8,5ԎFPUUx{I:̪pGcJPy,,!3Sevc? bp|,CRNy$,J˂yhJͯ>bEDXFWW -<#6ܹ@TNdrE|r>/7p(7 -@Q_{p LQj:;I<2=;+]SN9HЇ } t!ܽ.]P$}L @+u X^+w};A1MB8Μ:TU=]q3Ҫ*B.kt~%6b_uKYPjL}FZU9R㺻QTPEjش;wGlqcc mj>ZUaH[|b[ a[LǮxClY.lY=={+k 幅B!b/Jfᄕ4۾+N!āw蚤e˲O@ȌH4[,ZUǡЉn POjjtx<Ԅ0,kU70<ǐDpiEh@d&S(FQ(P*T5Sbck^JBjUE_o7f& Iq $I6"04rbH2AlhZՒ  eqq{2.&ɲlpٖGY\ж@B.I8 IaBJ sGxT.X^Iq}ժA1( Iq ku;\ȑYR_׿~m@ &C.X`?1ykXЫԫ5ŗ_G|ٹ#1ω,%^ry6b3311Je26Djk'ӰON []/Ӂ! dx ŠSe.{԰_GU^y5Ҡ+WZzՉ1XtŻh~YbIlm3iâ:*tc4 --Ed3e>::A=s$6!ll _UܻKr h2͸H$ x#O%HyS .24wV{\ʚ U|HxhcD4 HZii;3;֛6%xT*vSl's,v)y| IGy׾X*Ncjl?Շ((897|>T:i0R.Qeh8t*͐;JR`@D(ILqcܽ{E]th7=Դ CMN;/y+%!:AȲܖ0_, Q-6Dz4,* 3jUC,CBA B0:: J%YQI" ACaNP," 0ŢE6""-  ~>JEDb}B"1MiEÆP el1%+wEP0b*!(W*CXi te8Fz3W%5c[.@ks`Id#~EP{g8IlҬRB_1:+L"1vϞ~o )IM0ߏ6TU~oo3,ۍL&#q`XfNkrNӎ\LZko],$"fggmltÞ؁n:q67#e# ӌC>:[ @Z6v@1*}֭֍pOu%&'Gcc/;!v#xÿ:!Hs}.?v2>94{y=49wwy䩣xg^,QVOoox$ɑY_3<}=:d:E=q?Bt>Et"CPaV ӮY9 c-LEvݿK 5,aP`Y$nWFx0M&5]qAcu5]}1[5)[dZ;u BVTC㘞.jbZJED2F8@EQUdY>_^k?LI vݙ{ |Jc6^`f9gkte% g}T! 3ߠd?(adHWDs]ηAx=^P'< v.W]ñG 9fa1=F_#0usPÈ&XZZrJ%ȹ3g(BAq -rc?i{\FWWQc,mu9 oM,ֿ汌 H;_Ms)6 bS1iC E2KKErLD66YI("+Gt5-ܻױSk?fX0j9i9JsB3=aL<fYa-C8L*ZC`knppuix׀6k;wZpisCh`Nsph\| G?v3"\NxtrduP[@NMC\Xk !;6܂Yv3$gl,!5}& :N: RIjt.9ɋGE6*^2496cu]oe y4HBuWotz|m8eK%AK/XVu^'X%sy۸yVM8RbǏG҅jUUŸSr,>mrbuodu}|RUվ¾ B%J$6ԋuv113c燣#<;ac=QDP* oo2_q3e[7,TUf{!Bscqiٹ.E{xeYh<6\!B4 E#Idixf@$P Jb YI- lej:%\0 IDAT+D ;9Ģ4.=QmՋz]sEyf& dE(K&PVE"Qc1g,,*FCeh$bJFRP.aKX^]hWEp$rWG["L EQ19> ^12@?f 2*UR0,XA @tpAYT$+IW(ap Ѐf9(^_7Dh*@*nPTǦư}."a?_A\C 3c(VɠPA46wА$ R)_z}(|le I2'o܉i\?wXz].RRBU a'p),./C tM%B*2X 0t N>&Pv"rsYoݞD|ҩTY^p'>@k?ww9Ju:CVk-Udl'5%m؝; rS_y] G+Ιu9fZ> j2ҥ`}snꚦ<> mwquw֏c{?be&(ql:M0Lr:GJ(B҂h$;qdq uD¿Ix}YY5L WdD|uAt@}\pK7wR~6/ /.ëVk`4E8yW@ ձF HX~Ipf~J,#BAGܴ8E_JZBZt3_r;;;Nw;VENEtV-GD8cBRID|YRiRdPn ;(+-Kw7&U2MO\P&pf~VVIguBg׮4 ,ezozG_5}UV-_U2Q?=_ݨq5A'gu#oތ6vզZٙMʕˎNٓ Ǘ];DE*J;l4 )/uf] o{b}H$SMaQ$@zPn7?o6, 8sVӑ &xk$o8(WLP~u骺9 gN[@7}Yb{UDb1J|\(BT> Ed066l> /_~>^sOwbPur ;r'm^/=Zb]6W2 PϷ=G;k' ¹gd䷾>8n/G~kwΓȽi^bvvS%t%.? ahN N H$ir]M)%ۻ.waf:b6ހsbKk>&= 7Xl1n!ՃVt(d:;wԟNwP(D{hk#ݕDs:{kϿCsADLi:w$p/]+AȰD5 At4x,hEPB(/4n@t(^1:2p8?"n]P&\x<0Hq#.GPN6 ( KrV15>z]($(4 `&9$EE2@.fhh:"gAf`J $q/A 0 to|au} `_|%~A2go8E2PH@l4kp* Tk5<"hE(BΣ#W("AV;}#CyȊ $pt Ysa}~I/ +5AnRxiTyRaW($Q.fƆ **>w,vE,6M-ܼz{8rJ/^EavfRzMM13=Pk#7>(bcsoq,&'&tK=<6M]'_<<н'kTUXm*8{ rz.94AIH!  uFzB(7X=~zq>swq[}ҿKslK_wlmmu& -d4pꤥ{?s|FWn꫾T/J 0=9ebIH%QL5 4Ӓ|g{[_%TŃm_r>Žc(,!sPq9g֚xױɩ)-hh}]xa\"6Sc5 ,AU.`-fDjX PPS:"FGpy?SOم Ppd[spxK7n`ksv(l[d 9z YM];\𐳰EQΕVX扣V2wU9d믽Fi3<\j7&&QV;>GvjIyW_yZߡ66ܜh"j%#tUhW3q\/],ڶsE9Cja7^/5Fa ۡn}|۟G4n%:4MkAwN`CdP*z%ֻ>NCc{VW;6:2:/uM(G׽vl " 3=h@CV9[kD4* euҧ{a?o;<#^uvrE N\#@RG6@35+D| Gh^DY,tӀhPt~Enl&hH2V7w `EcPT à.HHcuYHP8!d%  `׾DyģaR QR0 b(ʕuHH%Wopq|z .ŃGkP5>=>B# ߂b%WsStLS[D<Ň(+8{80YBl,c 0>eB +qbn(Xh hul}1<@gQ֐+W!:RCP4b{y$1UndΝie搌plj  8~:zC b0V|ec Ir2~ N'pm Ѐ"Iy\;~z *8ARA LKe"! P(dYk8$667(FO%Py c|tB!.l.ӭe%,ω:bi$A4Aeu\RUbPTqeǑ?,YJ9~AIlY6HELtn,i<#EAh4D\| CVk-*'GP0 =5u+/Onytdb CC mW侮lUEtLPCAdH0+Az%rΐv5+h9/i)l$p 4EuE  At!Ch pAaϬ&@,0a 3%P`{Q(WH&D$BP@"MSx }>K[0] ˒%\NCUUB`h0^01>jt4c1d"._uPT*h&}G' +Jbwt8Ub {5;%xy?Pе36>%~4 Ar={",=0 ew;:4ȲtӼkXsuϓ۬R.W*uD bC)dϚA,T.̥]$Œxy1: [{'M}O=ۍP8rHmy7P?ݓj{{ {~7|/!;tu<(@}ԡ2=/?\mK׃P[蠨EQ8wrvN4quf󀮢X,4cBss9R~n667IoX^[MRvQ)0);:ΝG"ǧA:=*T d qoaj ] Y@\ G m,z]ˇ&)hfmy|'@䦎e[:\v]c;_gRphm[inP qhȥ'E; J@ Z>4,]100\0aJ P4`0~d , 6(o8 W@4 Q8 "0 *RɸS!esP(UEQ!"ַwJ%D0>2x, \BC/{Kq|vc#Cd BC(Ha/ǹuo a`zbf&I(,>zn\:6pYdsynl 2Ćh(A$1|v}zPXzPBheCx:$Yf%D7 HtyTU|r>$0 Hfh{t r%蠐J$P Lc;[DpP.Jp&GgKo;k[*`7[' 0 .G@ *u M[շAe M!%PxL Q8}|q,F$YP: QhE7j(@I7l0!JTUCRHcGf28f r_l㸫EU=k>@^y5݅\Ӯ3+\l;ߧ۞aNW@VƱc<ݣ\8`E>3:a,6,o G'ZߗaqV>eք Ι xXgv|j@6l~e6тrt(CXF/MO e?; ?480Pp6  K!FGQVO*a6Va ӿ ?kM W|Z= (l!`78YU~ ?[(]#i888NU,(([waN@-W;mE{k޼"vv9 I=v. 0Mc#(AUUU(:pbT!) ?uARJ&P05> /9@V5 2i P,Wj}8(Cth dU/XG2GXMӸooa*DEESB^͝]BA gXPw/C4ԱdP(U ! Աml\uP\l.- : aP0$q<ɠR"@t[{ヘ-4%Юvq簴F@hVq,YA!3ɗ6KX9@<spi~pkH%ea'^MhSxjSX#dQ(@y E04~ Ƈ2L"Ɔ0xmoC%>6L $13܆P`ϜB^ =c8B' IDAT3J@"Ç.&j:hJt[N-,qɸ wwz PFF162B\YawW} 6*#_!4&# Yf;J~Itܹ6e.|l6>g>IQ@VT (87%\wy5R 8qll{]IqݖY.}-ˣ|1c]#VaɯCAx"MQv5js4P 񫢄!zF r{ol@޶{VWzzꦻCYggfZ?(Êp꤭Wڔ!`}P84󕷱!!24Q͊k5|f ^#΀V❼-^ÁX0]#pz_+By677<Z(h:)f0 ynL+AE2hM[6~f(AZE<sGD:F4X6|U<"6py 芌X4B2Crj׮=Ѧavx‘rgd2I/]h鰴~k^#HxAl _CuV-( /eDSW8 )9,CԖPh[>mE$U<#vC=x_7 /<ܔ]jxId0 4:.Z^ vk=ݽ=\v bD1w.PIIFCAT'ɓ(thuukߵi/{^8}#akZ`Wᣞ׌}?r,, a. RU~j^\E(^ aXI3(xœ3+03> 'gP XZA_2kgwE[{81=\jц P(אEʵ XƇ036O0MW!"* f&%DXF,~6T"dJPd,M™qCe04T"}.BE$bQ >"'&n;A0=5RB5yŢ;) RsQyĕ[ "Vhω}f2GrRM%0qpEI'a`YlZ\0PD @C8B War <Ξ>|iw@HX4l'bie +7Kӻ iY  x2`q`NE( Cm7)RTUp v<$I76!IR8*0624ܛA[1P4z)v8r`~;؞jȤӞòw.lttBl;`uP4 `c>c2,˂iBh:)pw9^{eܺu,@zj_l/|\lOZ%C=}k8ўy>'H(v'/6u^%t !gt (eCzrfq'<:_cMNђ gggxtgyQ.MS]Iz sWwP4h(/eCMML|a/㿳(\yvڝ"Ѩ/..5#^Ny>g[Tqu? s(h `W^/.</XbZ "V@h ]SaX!*`86wC%ZZ1÷͎y^r3cgwk>f%oC7ߓy*I2iGlͶy~9;q]rO$NQe @}wjjJ(a-%>44au z=Ϸvh_FӴĞh.<~ 5j.3UnΪȗJ#.F)xX#t8a<@<.j?l$t<&[LS Ed8{ rG6eڣ;IvP,"qGg[dzmc+dY P1;*jz@w_ Hchh$i#O(j Y!EejfUt?69=KaXb,设oTku(:r;ݵkװ&\[B\JCB$\N˄T7U d\6{_  " [l&B $It OF|g/$"W97{9mczj (ia;;&{YOh Iajw! `, tu "ZdxQ8V0,ETku\?+0 4ME3RUpwpChn>})f&P**Ο>(E#Pl d}ɤM"ȨTkPUX7^%"nQV4 0!_o}M>~leSS(Wִ9x5}G;̰y$BNOt Z|VsP8x,42 wP󘞚$< ZbH~R-GDKgj Ih'eЗJY4( 4 r&jZ}?U\K5#ZBJ =?/T;!wz<d =AѻO-#g/.h_Osѷ ~kݵǿ>rٹ}ۂ14M;E-iBhsKۏA|{;9fv+g?;PVYvoNVp 4Q4ڴ#ʞC>xA7-raEK7嶿~_tQ\&DApL4 ^|:Sk04_x&VWVz0ht ǏY1ۤޫ~;;is yc=_?}*fW^~FRm x0 c@{& Eɢ]ˀ=$1)rr‘H׉:G޽.?Qݛ=pvCVcEvѶUsn xBd.zn2q;hI/]z8ғz%ADk}簓Z^Z$u ΅"0?|GaW?q&ui u|ĄM/F9gmC=Uw~&<ܰOZS/юEp%Ϝn%l˰[VƠPZ\KN%{*?ɧwj0$q$pq#!ׇ(/D2B*D$E122 aQxe/"=64b39(`}Wpk4@Qo4>/aecꂈʕh"*lja?tES81;b!c(Uk6R|{U 7_F._ģ-"r t_EЛ:tMC4CS%( 8(kb8$YF(FCQHR"%Č _ěD$½ŇPXʅsѐT  ‹E}EUa&j:>hid_9gN[Q uS)8uWkHZ~;Iزgӽ7] QWbrr%`GMi"yBeۑ>M^}q+/syev?\#1dknjr{6W~3E3N6ZnI9}dQ޽{I9‡8 PCDG1Rsss$;¨x_ƣ#mx<|lowM89hvGrpSpS !:hvs,0IȹAy/8#<:g6N\}'j`0ش'm-.sMsew]uݷng2$~K]a퀑X,mws{@_˲Dxں$Dhc_;n* ]x<D"$PhЀ$E# #/ NC0 Iѐ/H%ɤ񍯼>[ĕg*|_9n;xMO`d#1 7/WhdUM3 @4D_*bX,(=vsX˰F"8J:UG2`[{9 !4$9>lo|5e #T&.@=^"+,'FPTa$IB"ACQ`LC`&:[&A(xejR$~+_£867\p(R%vN24ˆBV;v۱lZ _q7D"Ο1n}zTR4uY‘(}"`#˒\~CO)ֿKܜCYeSuJH ]#F݉ 9q8J6Rݰ]4KP4xh#Ę&BQ,1abXbǶqW,FM{nhD3 4p}0W ,J+J x#eD4K*dExa$E#i4FC`&`Y\d'`txcO035R 00;=/b(3D!4cfrr "[ dngEQTҿ0f7:TTD i:Nj5YL8,\[]=q8 7)צcfl5YT333T*OM}6s<]l+3 Ӭ=pm }>wv9L ]'<}{ys\~݋nwr-`suCt<:Yۃǚk@.W[m<ϟjОpu8/vYuϻcXH{ֱ6v S9Imu{+uP}+Dǡ롺C[ ?$(-Pn=$@DDŖu~ݠi _kttbٶ5fz*. (˘޳v4@13j'ځ"g#jD"$-eY ҕb(8*t@$E]h  @Ru|r^~$M[,b6w = \ CBnp(0W^+0 @%LO"ZB7wif'GQoH$A/p޺/hU,noHȗH(kϿ+khx,EC=}(3`)Bc 0 P"C` A0 0l`BC@ `0A[|ӓ(+?y+7&"0x Ad' g籲խ}NM!#Wb'WħKkOɃU7?oo> EV/qv] J2?~*œ3tqWn_FCsE$bQ;9~' n?0za|8j:[ AuG8ҹy:>յ 2 P"'~ QCSΙ<:)!Y6Ap@Hǁ:&ǝ [{l86$ZD"d A`&TjGgIPs$@/]jCeǾ<% x[mMD@aXl"QVi6Ma6;p8Q,@[E,fPT aBd86Q~_cp]( E(ȤӐ:) `(|s8nvPk,K 8-LCJ`qȒT L$`10=5ZtU6 24t]€r'}@]| w-`-kT*s5<쳟*I]oD:6|iE xR4^|ɭ_c$$YBZ%^`4F=,+8= xlm"C GP$ :>:BXi{D_K7nt |)2fgga6[[ VcT=#a T?m<z?.߄nwFQpD{}O苴ۛ #'#@C$~6N'5yBUn R@n\rcݯ&fh@S]s 'j5 d-Ȣ5 tY&x7JeS^Eܽgdu&gیH2g.vf7thW"e( 4hf] 0 ,c hV҈HQ4l_g}EFVUs@*#üs99g;t|k.WU=vh9]=BȓTe}j4cɩ}cBd"@Çm&SWzԩ͈G Eb5%٬:4[V`(q*=&ߍ(x; {HxP;?l6199jty\9ѣ f xKO$|{ry%TsxU6SI4MJ%$bTUdpp^ SU PR_Q d'C\6AU0 &&QVh4l6 ^ّgt(8ρa}c@@(vgn:}2;fd@UO"A+ qel.ӯƤҩnq?-XZZ~lt&FG;](1ÞI9߰jrViG#V};8q3[&lR-#`ffkkkL yt  QCj!=L-f|@Po,DqDI6<R] llPְl{fqi'TBQpT2zYLEqADQ&"Z$I}sw!WVX@$I|mxf_g w|znj) `ADE>LNSClPV;DA+QZɓBSP۝Ffa3үR/~|tP<|ծ",Mj(Eh͌ "y;eWC&S/ ˡWW?f@_6636;CC$sYEDZawuOz{x<~UݙnR ExXL9yުR_`p4 ^Z:qv*dY'v;b\(w.!bݱKĕޥ(i}?n,gNpzF;W6AyUũS'9: 1'.C/d`Hp4]⋟|^2pZz>42<7k點Q=s;t~T]@F 'MCfsӁ=bQu |rZEQwGW4>~緿>^h4=\NY L X,P/S]z)d(ow/#q|ZǏw ?ÅMPTUG|GZ6ei̻zzJ+".hjWw H[c& = d bͫb43ĘS~;>@hХp;9]뻇9r0DAp#ev]ņnA,(aH&Hh{J NR(ؿorXL}^(mE*SNbiea(} a!+ ڂW>,*DId%|뫟Ǐ޽Y#|j-*$b1\ M#;=Qp`7QmO=w /bjbo]P(dKowD+ xSt.~ 096.]Ǖw19:6$>|-|>TbnvP_<71@@ "?h6~{&g!BHx4-gJ= QSRCda(|D)j@wfb-Jh @:(Ӗa$bq0,ZKj&{Dh*29=փU|qu*5H`ARwߺYw3 ]UP(W168Xŝ+XZ` Aހ(h4`X DidIH`MVmmeNm S#z&mģT*e0 I*266Fg 'qZMJww;Yoc͊eV LOӪtУ~j^grG@^ۨ Pț@aϽ@9*T!lfm`0hsp Fғpt}_{ wvs(Yd`-,0@̮7aꎜjLd"|6 iL lB$q\5FB.yʲޘz0䂓r#LgXDFNBeY>?EDz(iei% (Ң4M;!Ce>?US)4[m[8x,EQW_{AӁv)*`em8>t4:L(9`@ _5aYNZȚdnW;C&X;݅TZŘO`!xicU zvvVڭFOm^1b?cs=wxuV ^|nÇu% /̙ L>=Cy#g0]ò1 Ih%y;~DzN:._~L8(?E`^MD"8x~w=7V*x܆n9v3lupFc DK뼞/~ ]U$ r>N ( |鋟Ǜ?{}9:>Lf IX֜y 9AJ u#x=4&ilgsDds9*1&& !rյ5wCw!ش H Qˑ 7cG)GDI HG"h<'}059UUYhZ64M6dY!@0D4c\Kf&}t] Q )*FGFPmA% ae+ a3WƷ~3xED1}MDøP(| FMƆq= I A4FXŗ^~{CL _ÅG12BT(xI|t>؋Lap j8vsyE $a+Wa!) |>?`nf Ã? xaQ,od1>™]11O/~ulM&GS883,$Yx]d h4[Ggr/#_` s847kp(>b,# 4:dIϱh6#C)eJSTUjjV: gp'}IWIxU°P5 @"hF4I /|z Yd3p ^sx;Ο3To:@B`rjuBg>{-(@V%/t;PX|/qO<6=iVn=޾q'5J!3GDvzk0:tknnlt;f&)!Uڴv6V|V4&w D2@D GU6gǙ5( XKaS>?؇ f&'vX#156 AQђ,o氼@,06E$1Aldximof nZ&W}{2"~W[Vq:408~`f +8/.ݼ08z`ܸLx _K(U먷D(!brl${(+B@(@PCʗ>JB!BT2l6h$ I`CiSiKe0ԡQ53$j= IDAT8y|K+kQ HA0 xSHs?Dބ(@\jȕ(Hܙ۟F}ĩ7 ~z&B~b<0n/!{hZX`KKU(twVqܼԑ}lg7?x NF\3gN`=lIp`nFPj*E$ 8u|ZX7:M17k8~?u*i ut;0N}\*c {ﳨ Za@4A7sJhK1T8?T*?k} j Vꪃ]-A4[bm?}-0;9ÂxbSQTpo~A"cػw/2QD:$+PT B%P80h4Zx$CDZY(4$E0  W(afz [x:Ο9/χBx4gΟA2CTϱ8 f"'#/],=CAܽx JvXT`@AhԐ;,lZ&/P{XCźwG:`:RԵb<_O8wAa_J-C3*~[Wd2[I!ɲ ~Ϭ5s Fhg?nc|lv[׏Q ɒ.*:fll:6G?[\S˲Λ[e뗶q=X,p? _o1|+aL_Wh5c}}]Hm8du ѡ&166BZvgB9 ;,ab\׌ à$>WUOM}'Ô3ako@$ܹ_Wax),-/lem-Y{ IqK/ M{;~ ` w1 *T׆@GN_끍93ϷknŖ{uq譑'qlV+@LNMuit6w2}y$1;11j9ɡPz%3v,+o7_.`um:gՕ=>k]TB 쪽pjO ~L@ooI@^Bvz *sl3x8z( `lt>އzn Nc."W,bV}9;*Zab&t܋rb٥M7ɉqK5LfK{ {Sw$Y[&>i*X,UyfpyJkrP,W" IL\h::P,"_(մ*bYhz%DBP4#水 AR1>6U#|{ P=wCimph~w7D056 YְU,#j#`#WB<E:Mlxi\Cz!b؋m AQ(W'-dMOݏngbyc180t1H'汱B! ?+T*CUh(ӵO4fh2xTk5px"T F<CZ@*I!2'DZ/CVT0g/`*6m T&ے`0Am\PJD#hKݫ8o!?EU/U](yy,olw3O! aic!I" Z6džJAD~7 j9"!   ^}<^G8ܾ{7n-BHѡ4<4( QlC$hCq->J%cQ]p&Z>(R0 ڭ|>|)T-,S:S^=q8Z% @2JaldkT@e j*)阩 gt`1 B1촦(عfr:AB4!~<|!VwW`m>>LP,bfz rˇD4$!Z xIlD+H&JUg r @,cwtQ^ٴ^$Pd"2tsF[tHn:Tc0}^ðûbopgï6l;6&l9[ Ӟ̣^~93/SK+7{wПztq+ct+:ޟ}AʫqvOw[c6 zn, ?*~K_PjP0Hbua]òȕԛ80;l`ۥ GPq!$1TM8{ dYfj2"XG&WFJE"כ Aɢ\.㷾KzƇ S LObccCj5 F=6}>\ K"(&GGps>T ~ ]ZdF[o`yc fQ,S꯱a4[} mYF(388? X؂HZ\ 㰕+`fl !x[3>;pgi /~J .`ts'/-j w?~>ǃ5,TTa$_FWQ( LM`z|[YZMDBhgf<"(%{fgIYz2- P*f^# WyY3at0Р|7*@cЊ+9[^Ų/5p^CJYko,[(䴞zP{p޽vа#V!zYV'+={x@qMt;OQuy466ֻց\ݧ>nI'a 6w<:v(5Tdaq9KmͻfG+@r#kN;a ՓӨp>8~-VjwϠ1YU cfbnjwU[+!/B0ZE^dF S`y׳`$Ve쟝- E0Nb|hGwW~Ⱦ=X#BVb|5|k}}[-)1[PoIϝ;R=՜%h<.]7> .]*~_»\ JN AЅ6xiLj[@&q֛D"x5DcQη.MC8&r_ĽuMcQ*uLM\~Kv!Lbxp%\<} NF&WD\E*pXé <\E3FGҍ{ ;(UjJ/cusC08GT1h4[JƑF0 &,W𣟽sX "~]E,Khh8R#%JEOJExV +42 Cjj6-zҷH X8 Z7c%Z"0xtw_̌Lً>T=fdXj1SNQ~>ʪXeY1C:<{-ғ ūգ{#N1 9h;:хrIRLvB!`]ǃa0,6U0xGV~jf q~zj<ңP@0D<ߏztB FAE},jQJ>#93aeu V vdF3ѻ j:$\ B=\[khV*4]NH5BtrT*(U;x$:+ >B# _7X5C+@RU=,VVWi^x9,-@2VM6Θ]U$ѵƳ6bITU왥`:M}V `jRRgY)]c?5tWj*MS14^'ݻqXs7nss<*Sz =SXXXZ5j.w'Aͭ5J'؞0+pxgؘIOeLMMuk"bN93El)OV$ xb`z}֣t:eDy$[i5F=HSdX,jXN-'SS: Dǁrq>45D"ap,J Mp SӠbY ڂZ5Ͱ8sb?x]D4E,# clxV6El[ŧ+7 s8EP!`Y#$1UU-1drE<KkA^j&cs.]{`,s,DII$Q|tFPҪSe+kTt6D@VȢ]xx!^IEajb +vap ]xS.cv&tuL'o瑑a:~<_JUn~fϰD.]E8ӓ!4Ay<ǂe(ع3{^7~b[OAXJ{ |xWC Ǟ7Ýg0*, %MfWBNcemݴK>? FGɀx:x' T=0 ?cEQN4H 6]60tk#\aK|3}$}vӌ*7ցCϣO=8qW\=AH6OpB /nX7433 x/)@F#R IDAT0 T/yy{uۈ'<9|s>ګ'uh O ˀ{q'{=='nyt+q ?꾳?rd`=:p"/=oFۇ<9*P8L[!JoKpAy>tA?;\@)P~]ئjP}ܭ`&ة#ŕbZ!Upy,nbr=!#/tx=˲cvNՇjZoKcGPl+=Jl^_RsOv'ìrpt[tn~[+왝"=.-ᇷR7MD!f]Fնfu^W.GUZjwFb+!aֹM$*qbM0.r:.rgPY1zÄ `9mAͲdE : X3 +tYG9e}~(Yuh ~m~h4YzK`:[L lҝeܻB)\?JAQPb NěW`3[F?beI Hh X\D"GSR0><}|xY ŁA=rȠTX|0P5 X @r{gQԱp* A"é<7!*ID"a SiCX!{v64pHţX^@y< pz T){8P-ᅳ'囋xi,_ơi=~ۅ<2[(>eLP,d"?!ap IШu T5,cvzl`HTU`jZ AGt, ap^m%0711Faa @Yvxw+TBH\?-3=5e;w~Null< 5? ш9mA]ʊ 1~T潡 X2]"@%6}fN5̇(H$.1SST9ep?kuvT籕ͣjS E*5r A$j j[nݹd2ZX]D<(IHS%XjBA(<%DgI1::d"wEg^ƃ4m$Q$bQlmg|>!ePT>qoP*m1OQǏv6M8v[[ $(K '7WMX,Bugh7 \-{;RQX7]aAyZS֘M|CVUOmITzWuh6i-l]9n9[4J'_xrŴ懦i$Eܠ 4c(`p0m֠iPY h1Sjr eVh mģ6ۅ5{i񆇛mI)X{:eXYlɟ񱮮6۹Wo*5Ӌ*Ύ|ɣ+:  b .UZdqKƁd; u8|PNDx`γSs^]@ mu#v0&!M8oYQ ʊN N/sg0;=uzhET*RBȲ'h l@(%$+8~tBZ}\ɉQl*V062ARqx^ÛX˕ВU $⨵d Ґ0 V8ux>}4޼h"Z"cA[j*8fl `9(Zϼp7BU5;h cpm-p,u}F 燬pJElhqӘvh "F_n{zG!C0605EaXģQ|>-Uh=34@$|簴 a,ŃMEp~ dZP "_(  &vh|>vb T*Ulgi`rb[[*`ߨwXL!$͡PU/#}qo[kׯw =>49~-Ø6(})F.!T -@UU 4s'piTLN@$B`~=S@g^}wݧloqes͇jez_3mRy5S(ʦ}ѓwL nfٱi^ڪ{5&ՉO׺KwIJ[È5 J;ij`=r߫/`Sa(u4Ah@zAz YQO$pATk Ǐ.`u}~Fl ϼ>dC!׊a)#I^`zjϦUO_o=Ǿ+ʐd Ш3Ϙ7ftQ?f^KQ:ra+&E:e*q <1<2Lz^ǎ(=q~pm%w>n^a=-e<m4Q7eX,C4[m|ۋPCCd0,ih>f9А ,  EU+axh +J AT Dx,F)x3/PoX@#À 2]C%%*GPT4n>\ǭ #x]|6V xdUԚm\8[r<ʵns/>v@y"h6h m@S!ڈF" hZ`ue!c5Ө7Tc% Ɲ{ :Z&\簺aX|!_C߃bÃ)\>-c3ȕ*xB{q !KV=w]A,.c?XF0c80;V\g=,ɮ_f>7] `f0.a"7HK+!*T苤J)DRIf11=}wz=U]]2sy 2_# M'`?sP:I$X,K$DUvh4G947n( Tp0@x,»}1EZ> K",m.`qU9W t:it/mu6\Uf mI8BSՎM9/o\ݪ<8w< @ʺy>9Ν9ZsҠ/ sp}OqyT*Iîhtԉ%P(ǩV=A&.K/ޝN~D6W~6##I>$ڌ|󏰳O4啗^`yuE90fMQ(tP0cckMm$IQ07' S*-9][p/ *xD" PL.ctdq t@ml0 A^C Ν>,06:ҖdM$|>fgf~`#x{T,x'iz8kw| [^] w1QG8n0kuz tܪc{tltCJO?WVIHT,&R^,nWɥܴ) 1 LNN{wΜ:kCޱ 䵓1uݻdپv_eَ["<ϻM Nt̎^@}] bңAV-~-|V\q;E'Q"H !(K/Y'GOX'x@v"ccc]+t[qۼS3:\G138W֋C6˵;5mar8 Y".g0&Yau[ :4d 4J (B&#ӐwvGVj"aB 09s>jzH []ˉk<35s5$ZZ޽Gֻ1&I~ϛKmTF>:Pѵ\D3VM7hq^] {^`=8Ӈ^xض`!Z'O"[׺|S\C8l+J&mWhEӹ 5**h UU% Otb/k_YGu^~2B #W(-Ub!v%N,̱y5޺lH!/>y}g{{|㋟"pPęe ?=$."_13;> ;W9ynmbukͽ E֐PqcLL_fQu0 POVE@`zbLdUm F D#Q4]' 8?K̩mnapbq'q!$R$պ4bLj#׈W2^&!:c#^C$n.cb`߇#_pjq"a&Gyobjm7plI 3㣨O33d d _95w ]ۧRP*U54PřI6p9TUX,`wp0AReth$PjF04&="-jCv*EQ+΢ߡhfd [of$wY׭8D䥗>*$꫟MTM|OSTl[[{{VxGEh$Ԙf[rehhZΙӧ9d/, ⬳*{nznK wptb;8 C~DQb|l̢0AtLEjN0AFUhDQ$Ӑe>?N,-+I ۖET,Nq~?H6B E"J!7|HFPTMӉF# E>?&&|gN戄4d`G.'ϻߵZMNRu$}玝J{e-$u`("l:zX iڑ>s[;kڳ1iaU{jX,jD&]P(H8b}cp:w%I"Kju,qzϰ=:2B&%!K mEcmٟbf|-#(o{yզ֋I_u6{nn0z'(-|4doylcUi~DGFܸbqq㳺q `|`uuխe//M}-jm:%ŔG0t; :0y"+~8_j3/-9O%򑀇YYYmOuF"-7Wd}d}6Yp 8u3L9p__݇&GUڦg=s n3ǐeǏ###}Zfŏ|X{sJҷ;-^NGC΁V&ZT wqg߸L_ 7nY/Eѭpxɫ\|~>ԓ feoe|>U)~Z N ^=H$BCZw&q>m/^tn~I'SP U:3 R&xN"$HR7 %/}0;=EXdxd{˫B6-n \tJ(g Q1 CȊB$EPLZCF|[```YQ XXbmX86PT~_g.!ps)k~?&?~' B±QPEi0NHDQdt"ƃ]DQʥ sR$;{`xp|DPDVTBBELQ*.f07;~`|bVJ@yYm|>J4fd0٥9qn[c. +G$t2>Bd,s|f+ אSq3` $x/94U##՚U-vl|p(_En_G0=>@l6OCyr*<(sS}SӠZF0Mp(pH1b g._=b(JBPxkCegwCu@8eeeϼitLwI~ 6X`&w=]N $p>9o?[Ņ:'k{׭*nٖ'O< n0UMK7_ϱMFcM ZHlu%4M MtD@`ѭ $2@Uu"( ?{bdxZjV!)+fwdhT5iL$vTU!+T5~?Zj@**Ȳi<ṧ(Faֳʲ(xy{O 6UA\$bꢳX4rؕS=8Ǘs-8Dm7? At|ȩ|{cĉ'tV-On޴߉EV.%wvx6Je~.gcs@8BO?y*Kv@$0Ztz7oJT۶i6=Ygg^nݶ8C}iצ4-[C觸 9hFp5n:{*j;T -`YL?<$ѷeDS8_._5cOO.Ucvi'ς  ChT-L4eqa]ؔ$]e]7_{|3p=ÛwZ Alh4Xf%F#4d+V1BɆ,sr8l++cX̥D6{M)ZsuYy{_?nckE\>Lזmcdپ0:h]J?D uM+1H|?|-n޾kqᶽ|O7pĶ^gkkP[@, áQju%>Lh,JvZANG8潪#<1eBc;c:";U͆NhˠN.#H؇6i0!I#k=;ZDg 244Ul)yOsbTʾ}w{Tk5GGT*͙֜Qr(>uPhۤۄtzјzXV8%Oxh7j.U* >xw(R.HTuC$0DdUVސd?ýUt@7 UR ADbe0勬o8A6G4[ΰ9iW@*j4&'8ȗEDQERd_\_fav1 { g(5ʊI FP O |{I'\:}QEMq4wbAӏ,&~/+eA$ 1=:›FHTb պLT"O&gX'YZPOV79y|wH&cmHc4dLfN? -ڐ19wb QXy((UѡAmEkC!>Q&{_{?{=& N156^a~⳼mFSgd %&G(W*d %Pm'91;ŵ)**|Ӌlmos)>F2A6HD"CHS-àP(~6wZ4}`a>+i$T]O`ػ!itD!ٹc9z]"]4Mki9z`FjwsKK}j:v#vQV%2٬MopM痷4Y_[`v'_{N:6I,s)t]wxk53lxZ)Q: r<`[#DcQTM@ R&S)2&&LP$ (*`  "2<T5T5 ]i2O_*HF~Tjc.,+$ TUADX.H&xIJ 7ܳ '{l6,7h$:cs20;3MXT,2NS. Czy]X,ם|}짍͇88\BLIk69~x] 5͔֚=AdhpjF巿U>(*k똆UU(΀hFA*dsk A׿{|H&&&7E9:h-hqղqC͈V[7wݹsc"6^x>GgT:1u<g=laFn9V;`صGU ~1;7W_%",t_uT3HaCf&OLz)ѱo7\;nNǕ+[oz3Л!Ξ=4ts.?F :JjI:|ٻ׮%;ڪ#]dnGwbi-X |Q} [ Sw'5>qOG5A0` H25|d*RL Wwc;|9b {y|}9ϝZd/Wbxp)w0yutMtt]V"/7G3 2bA^oFJ%Q@3jt~Un-Px<+dɗ<{"2sg//W#hhD#!N/k7qӋkgU jc16p'/[N'y+|oq"v2^e{MU9{b[wW|PLQwvHP,Y{׉ipjiMS1<&mC !쩉qj`AqXa)-Q=ZŁEa@mt?BVkn煪j/o:lG;x c;`׷џ 4j?Tz:@hMzI0kn}:::FVkPUH$lveaA"(!h48H6_P,!ˊU(*BZ(D,J~]78(Ir]FӄtʢlXW0M+ءK]%STol:Uu'2 պE076\Ͽ RgO-dYn|"aLɉ xUa{Z1:2TN%ہڢ$bfZ(Zڕܙ69׭I6r$a%,]/|ǔq<}fa]W-EQ;թ;QI3\{d;vQ1DdwԢ t w dhhAr<ujU|p|YUEllE._@Dʕ*~o gLcVRK% $PT$ Ul5Jo js)$I4Mk|cQviŠ[{ B-ߩHԏT_G[ogθaWv!ivmteȦ>|?%;;bt<|ݠ^l<niNAׇ<ß9dƷ[o\.α&XB9fDq[k׾[MNX^SO]8{ ]+\yG f_~sE=BTvbFGۺRfmdp<.ݕm2-nA,M߯i}u}tNmvj2gbNpTd[i gP&[ˊNȲLXjOQց`mnr ޮI9A xx,_dwxd~naӓ/v^GH*u(vkulD&0,^ X! 'Jgo(ς( EEVTt]Y.J\LXA"-͑L3NSI%Dg)@\! DZCڝMT*tӢ0D D̉de0PTKgN$vMbgSq cc 1=ywWz Gy=J5܉y޾~cfyZɱ>yR@8@5DLƆ\<$1=5.#Ã1!v!=PwN-*BAF|Kr $qke,Ϝnsnil;?,0N:8JqB@.sUUqtMu;7,e^֘Z9m 6gZ NիWwu ;5MmzR'hN׏<&&&)W*.+33346;M8?ܳ m^+C]oqtdE0̦$x/й +VHԣJMUŨ uͰT2e |ӄjf5DUK%¡F>ᰥk$ "@ZӪ8\HZcvz+k$ZbBT2aUvJ"?͢t4+mV%(KqeF8|N X, -[Qd CGUdDtNAHģd2>Y" C d]Vy>IðmC߂KөR~MRIL6cJ}tu<3D"U,s;^'XYpARWgk{Ap武gE$I"ZCSy[ume%;˷q&vjJڒH$noFQm9z0p^?l^Ne=U<4FCN ]]^DgMG'*xb ai^1v3K,,{(+2n/Ǎ"|ĄY_+Fm=o>im+_oh>uL$-tsgNͽ g%{0t<ÃmlYԨj\p Sno7BD2SDa>A,A] C!4,#˲gNiI 9EH$a$VD#nGCyO$*tM"( s3Tju@$t{~/S|p>pZ]afzʢZAD VMUQ ?ȅsgC]˿͕MƆ{Pu`$ ɔ+NSW %28%琂Q.jD91dv1N=8v%A].2/Ro4x :y"fqfn +疸yH8Νb}sL6K\bt0ET'Y)WHu|6 EfUGo}wF7 _, H IDAT>ƇGASx*j}E^0j\X |El)>Սm&JPT0 J,+ABA?sU|*Te᠟`O\bnzrB.Cap ɷMEI8 :d2 S-fV9:;<6mYT*5j[[[[M_~]}3Oo#`^@J$5bn,܄kgp\h8Uj<|> -EH=0QVDA<:Lx YQD#bq̐!_("J>|x{$R A-mDPvzj?廯4huK[̴+v넂Veh2T*#IR[3}2U-;+ncSd,=Sq r㼳^TmR&W^F.c}}hItt/rZ4b`rTU {\~[Nh|$qaPmsno4u^j׽{E7t͝744յas?00ph+{R.wJu ʺStr)l(r(vbG<Ҕ鱏(ؑr/m_GCr^MƎ^n "QP_!ҟq.v}At<&ӚXm;P[Y% dAJ*<PaF+y-[O4d-Ns в &&nLnVk5D@tTMu\~wDcTku,Ḍa󻴯aP*T]ux7wxsM(eo;?nׇ(:_}NSQl鴷<n9nk[Z/P#[{ᇥT|\iIu/<̗1G'&_0v4ʶ/Y,-3<<]hZf||eD^y%@L4bc}7ы0,Fzpzu'Dѻ>uIX\X`}cBi}^"8;]žznJZ*뚓Nɣn>~oYNPuܹ.a;:M-իvwWK+F=>pݾc^ʵ@ @ Ԕ%mvY\]u4UA4 ðyM?˩q 0{Eis~yg:TA2N?$C.a겂(?X9l9"C|6 9vbl"ˊϐJ5 e6X>^`b|DQ\qFG˄#!}!dMI" Fr C/wnTLC+s&ce'ghcy/=wMSy.O?_ސy{.w*̍J5/\_Cgx??cdreVw(Ujl` "Dc nswe˚K4$_ `K|+,o4M/>O$"u@D{Y~ -$< ]g(=d0x\[Dca?HrͪL͗0t3KeUa0O_:6N5> A0 H8DP3)?qgNkrll$QU)ʈ~Je7?*)*劻~bU{$bQ&Fr^{ID Н9F>#gض;`:J`0@V|{[A <잍ㇶ6H^qò1-t)^S'OR׭$mG$v>oĕ| `gD*;~S`Ś|s"9 ]> s9t]cnvB x<@zd2N"XԎ}wQլHQ!J>fgg?DPT x #DQv07D|`hV׆HD"a\d"AXh* $IS4 jJp8L2R""PT'4YY]erbPO!2DL`? 4MuO%N`:dE(ʼӟșHRtMӦp;XM뻷ucK8,J(I\^ᣣV2K԰BoXsSC,[>U!<*3Lrbi] l "ϻ#a>It)J\ .x 7+ /CA&0,HTLe ``N\e]سC P]ml`K%)6\Sn0-Y8Gĥ퀇ضܸItIzMӓakFo)  kjŅv0o۫*ypPvplT\Mu vL$HԢ)ch4J2dppLP(LRu5S@+dll=ѐ7dRI0Bᡴձ) ?? w`w:$1L\AtnH$PT]\Y tp&?g`h8Ln%s3<ضY(}ܺu1{mv`.b i=az$xR#T,uT-4X?'?Ej4rкGICw9M^W:pW>A:=~ϳÛ#j<㗱?P^m^!8>"2M-$nީgeumC:2λriy)iv6|}w~Հ-}og Ν;g zU1r8P[֤kpN|#"ފu<:9Mܪ}܃I,t9xuW\ gućDRKu5@[9!)IR[GO7y! @- Ԩי:)ՎN/gXFK_<%%&}mZ#,3:4M_m :6>R O@3 ̹';6:^β(!uq>³W.H$L1dmkGN` haUg(291ɱc˘iw!";APjSN ; *B7_lh(B2@*|Yӹ4ܭ?;]Xo7_}wﭲ" ޻(|Yoi:ZP5JUclehN,RT4۟g?PW4m"aܻϙ~v3MB|oXt/l?? K dMOQW4j7w_4[{Y^:C$f g/W|'2޼O\!Gys\>{Oט?6ֶE%b=QK"$1 ]GXC-;`kI@j" $e+tMes>IDUd2Ǧd-la&ԎmkcTs[i .jN-͵ {L&%Hox xX|\>oͫ3v@86F\K_QQdL@.Gt|Q3ZkUĠ:i0;}ݽ=K3q跊X[ri~"0|A_{,iu*aQ`gwK蚆ic% ;!)b:==##TU¡|ST,%x~LO-u|K1KOXTz'ƑߓA^rֵMvQ,fxs9jiP L177#TUK5H 0?7DsW>4M4 y'0ܮ#v98e7%ztZ@ p֫%vEcկr2MI598-T'Fx NERd<]M-𞇝^ø+tiޟo4l`]|ŽMts= 7Wǿ öMKQ޽䳴4 @CQn088$qJ ӄAL)W*|&4 3Y6 GwON `ў?qQ=#>Rb73#,^nu9iEhykV(*na|lJ>ڱyξ_mW@ˏc?so#GsQPk7NGO?$Obmm-8kL:,L\~v)5:k"䑎ZϚBnciq-2 ZZVwÓ wA{eLbQT&j;j Ś@RDM'Oh: Yرc+5DFF*uE!Qگ͝}DYKHZ#KDQ2Y,`?kuN͐+W$?j'.cc瀡Ux=jȰE LDQtBAb'[&J UseSd$h݂L<G|4˻&#&s>P?~g{FL7I86`u'gJXcc{Li!ʵj6ws~4Mek/?{0ھO156&%ZTEE D<{T NgvzBR䗨,mKMnL)pP(so߸>LA`0Mo_PuHr FqotU%8rNa­{erȲi .sOT5*F UU:#F>_5BUI" wn;I蚵)50u^5-`U!FIS'qtxSF׳/]u7W}+g҃nZ49*(Aiz/3˛{ ,]`ݭ=gxGxwbЊT!"O($Bŭ˛{ G]FtW}}.%>Nz=kpC"MFIRTՎ{rbgwonm :.mZEѕ'4>){inW(N:aaR>̫A&@3e&( TjzGhT33ӔU4SP(||єe EfBUURH(e&I L`ܖ%Hnl&hS(uEj`&P~*or=60 L4MCLE4Y[[uL 5k -J"VJ\y}t]hsϲE˞fskɉ wvﶧ 4MAEI[*XtP;n8k'dkkpSK]靈wIuKcl|̝pN8lO$V=B.'Dd'2;3ͱ?In\o޽zbbf5yoWf/--or2ɇ_lNpNhww>)c[2P@գE!~VVV;Ox#{q[*S֦%LwoR'Wi~li{,>[# .׌qZDWwnxֶ?~AK߫#z }9rz+w:0XEіp^{쬇EQ:6(odBOLrpH$$IhA&Q+Mu h-,, -ZP$L!c Y$¹slJN^QleM`҈H Ն$|$J\8s#s, IFX\Q01X0xŧq1JjF茏P6@ Pm*d2&)T٫4ƣ* f&0EL'禈"?6Dž]#9޾N-s{We#ÖFaw+K "b\v/ے~cPUT*Mȑ9DXatdFiog?DZ#ldQZ &pYvdwsƑvD!}&/.-)p)67Qlcsm,Fh6e#CTe {J&M* [Ù@4R12CxWe=x`2  ccsn c&07‘HT*͞az>ivIx>9vIJv:HXG]m8H +f0;i~ > ;'{#5:$A8Ej>@'w#T>G_)G!<3Xm^*<cxxӉѼ2݁5!=~aBgȖڋQT4g駕 x:N,,<&U(@XS%4;6S.Ʒ_a^Pwt~ӥ^ڝ%'xSc7? Eyq* UHŢ&\N|,whRZI$`R,04% [6h>à Inq ^;:$WcQ3jeL&h>8{\}-E#J5^{Kƃeejd3nn/eX(H"\$4UC0abdZA*?Fnx)Slng1PZ- $ťUwfA~γnuH0t MuM!`! V׸aF\& HHv#65jph]NAwǰC|xɎ6m"M6r?a'Ӗ~Hl9GܽM\/#UU$ThPKx=v>HJFFF0xo~tx{MےTb$ܲ@II=.4ChR5E,Exole HN߸F(\N%-[RQE`˫kD"!dY&3=5A2^o^ ܤ\.sW$335|I76E-[ۑ|r|iܮ{Oc xj鈢@^'l|+_`ooC/ܦ L@Rtkk;cc@No9 X"Z>y,R1|f 8S aqoO8`a.c&.qywvh6nܓmOp8 lZAh}r{f} ?{1#욀N.w7}>m]Yl"BE|^C|8D("~" .~M)#5}O~w?|Cn4^oAeW%@оR"ιz0gYOLbܠT!膁 J D"KO P5h4J<c{'G^g~v H4d@ ‘9dIZT"l `KGrhrwsy7 LMܾ3QTg<&{r,7QUo~Kml杔gfeu͚3MKKeskt*E.g7mI_UNNܜ9lպ y;d n _YoqmL.e1Ljth) HgsΣ_D"\N37:]pnSv}Y_20wއkĊ,3O?cjIB7}oL>kF 011 h#?~ͭg}I>#Mao쌫MYǒ$Yh݅ :Č=!J L@-0Ǭd0yU1P5 1 4*a'h:H)Ro 1 A Ґ f&fPXcP"C܉c i3i8{E A. 7׉R0ȗkY^W?£M =gfQl?~<=MfwbpwdWÓ2'djtʓV?ɟ{fԚfPb+/}8XVeg'( hN+Kr0 KKu2rOl{_Tru8-E|vw,i+Y !ߗ.cg'K  LtMӧh4D!װ3MӒJR$do }yfK6fu{nwnׂ-iI l4D<*SRo;b(B,Dq5ɵjw"Wêfխ> lZVS(Tu~嗾N._ W WdwsģQ6-$)T50 nmIQ Z{5lP*Wq6\ލR iibϾ-E%psǷdY' ZafCmoϟc Eg|i" mP>|' _Cͯs^29[o{( ${Hf[_^}x84w&\u>O~GĻ݆bs_c? |#U.Q5l;azCʕ+Xa@Xoqh;97)0;GY~F0QgQa{LQI[Ցy*LW=7,ί]}EVWV30pλ=}Q݉ϳp^T㻀_aL39|IVkOìhp'R HS[@nvܹ},n9jZ!z{I.ީ2s~;& ڂ@2IVC4 Ţ=!N.?G6 WS]+UFp6815?xE&3 atweޗ&?Z?_xW[]:;rL{Ü?6{Wh~NRD*#͑,*]j/2qm!Mp0@`jbfKax0޹j e AJ^ݥU- Xwo'2;1{K(^P_g7+U;7"R5(VjLR,oƍ921JV' jF瘛cj|-DHL2!2r$ L “pyT"^fS'.Q,ժlnn!&e>,R(_L.E  r #005&Pkm^RiɀI0|$2C5MkG8~A._D\tͰ ~Eݽ̸EI? u&ry16_L-:S!O%24ͦL h[ t$bI{j-i)Nє[ f24M`LfzSA29> {"{+E뺛{TUğa-/<4h=-:DRhjɘi$1 h5(-iHȤ躎jY~Vl0l$q KKTZϙTl6kF4lRHd~"O{d we+ p7HStM~rJxcdwwna{eLWl6I3_9kOm Ns[]Fz:!VjhZu `vvc GYdDjյU' vO4o,$Jbg{jժp,YAJ%;]q6OJ[.]YgnEQmmm(U:|&omVN+2zzӧ]΁>ZS#5[?91AVC,3㵵5666|0n=rB Gvx8ĉM{ !4@ L7l1?B h*$S)M`8fJQ4SQ.?K(cm+@vD<TiIq!t'.__~^M)tA@$r:"h 23[9GÃi e%dq{e A p jg/c D.$ï ߺ>$ qlj2$'Gw'&ɗ+lK\\å kkeRa|I婣)*:kW߿h^3ukǦLscÝ<9v4Hg/罛/~Q!nc| Pul )|jB{lX2p2rwGƨVM/U\~(XS GHYZ]]\`kkUQ|.N6G4\ &Xťe&F>aQ IDAT&sQ,{_aCjJ&fw7kc'vBzb &~j{TKBMĉNtp9gN&gXߙѽWyOEsGw^8 20De8(킽04dO/ϓ}pcUD&1$JLO:nSW0.Z{jq&nRTQbOpE"VQTbD<Ξݡ86:L$Aח4MVWinkH~IiPn4:yRaj'qTU!-Hղ(-fIѰPVKfjrZJ@gZxo[[ԲLr:odw slPQXOa=q=O.$,x"awS:S/N,h j,9ccTk5*Ք⹇߸Dr,aXC6cO%z$T]?zhq'|UJV?1?{C)#eF դcڇAtM7'u]̙3'=} Os֑G܃|}FnRt}%?qv_0(Xx G~M3q)dN**j)LOM;٬=a{yVX{.H ZLMP(k(.?GaD"aJ D(" ( @{DH&T*U& |k_sgO=qn$T7v ۿ[>ý|Op>蕽ca;XDT|`{kQqg~Uqߘ4d2u7k6NÒٕ˝89^&ɾi ]g? / Q.p'@} MR ?R[;F+RީAfdY&/Po4$NmB $ JHBA 1;;G&c#4[Md~( *ϞPɗ+U8wR@sO H BALAy9SbQdD yv8W.4cq#G $!H*&fPɴth, oz0-2rWŭM~wgB_Xg<8ޯ.Q;Ww{C<k42 o -|J;gvH0y6 >~0mCJ㯏cOvy9VV\A9uҒE M(+92&035$y[`كaT.]dǣr nK{[0:u_CӰ0|B,9~r[_f7>)熺Ot.oO69>\Υ]~~7nt$z`wT huPuus<~X[e5Kx/>V}aU?¢{~ff{@V2LZsϽE)j4M˔.b4Mg>`aVAw<~kO vBu#}o JxWid=}%vvv|y~sgrbPrI^~Ӈ\|I'ۣlv޳ʝ2^HK~ΈZfXܲ$;R)պNk&3hD.\@!#B(F͐8qYN>83dBU\kQm6%4d2n'/#P[!^|"7א!b0PTyG<312! e([G(bggYQzOoCu}G]}'0XBnh4鈢.?{|ަ نdɳޝz?1;#M|'FGG}מEB9 o_{#K?';4gfVol0H5\>?7zˊ9.6|#JXDwEMt*}+I>ѹO=L}Ǜݿ_ZH1o$ep0*h$a J 0̤Idvff(c4M3Tkuv DvbgHO{}/0?#WZÙp<ݍg8A_%@Jx}~}GGSҥloheG\/ؽt%0Z7iII_cml)L7?! 9 sLڤA Y`nn xߓI>ǹg]Bori]=׹NgӒm  !2@n)d-x)nHա)A R(U5[ RXr]&@J&b0A AN[ ɐ61GfYEQuZSID ȕjL ɕeR^ݦ&+ g Dlpr"CCiVeU0{U){+,mV,̎HRE])7o}I R5FAh(>SCZƷ^.+wֳD"Z-3ӔeJU΍R(X?l~cJ^Nay;v||p@Rw?FS5RJ,%DdvBGhdNN(@SZ``RT1d41 EiQ.-w2TJåeܴ [>MӴ^בgI1l8'=;y'"hh4Jeu;1A<77o9ǭEA:'|_ahhu׏FRk|뭞M|?'_ק]p3-DtZ8{ 9;oϾJ_Ğf({ݻi!D#ߧvo7_4hUΟ=^HVw=f hwm<\^Zq1i| rbaޒjl_E{N[ W`tdؒ]x7mm︹Aɳ5 4j63LJ)+n3i{7޵QC8%I"HX,;=E]plvݘլ{&݇3 |^y%VVV} nQ}issK#:}\7?[K죊s0ޯv뜦pC<ǃN~4~G!<Oz8yG7gp"~K_dww$ թ>ȈP⧒= Y iDJjMz֟E4!&%2Cn  &au@JS!Hi(%cγ+399KY`S p) C"U<g79>7Ej n h\INbqk˧g-׉F/?  qw#G2g(=`C*TPMx|e6*Qv+ MrqatG&٫y*ΎhHFC^"W*[(01LR%[(} ]+O5fS'ii*n/=A&IZݵ~ϰJE\A`84${};H&I$@ |/JY|H:ۻD"N-H?wM8(t Mi4e-EU)-R*5^\AVvYZ&J/ Oyǹy_ܺO V'X ;;Z- rQU923*"PVEMUF(B8$0-b" Q˓ Qa:(HAs(H$"#7-3p(HnŎHZGDc<ZӇ鄱IM}cc*r!sjo}wGׯw6PwSw}_ ++>Yxꊧp$1|^ixח `:|aVzj:W>˲fG&qUbmqphNʯ|+Afh|j)C9yB+h[7=h&]x\@F.۾ 5hlfy*,FGjAR߼mk].,1hw7؅kc|c0ѢGҙ 8:w%tH| 1ҥK&'٦7x> [nW9ܾ{?s7P5Qk"Z7hT(Jj?|$wl+/W P|;OQ01>KZǯask ).`=  4d2W0i5Վ[E4g|Ӭ.X_qxtkxM},:l88H9 {v:.%@Epk PrٖKyVnMJº:G؃~ />9S^ytc zģE5 KrI돚CsڜWe'cSO4^'{8 J!pmIX'lxG.^[)~] TX/:@ŏťic\3q\[X.m/1qq ;ϮS^X:9* |t^iX6'Ys٫Ĭ:d,_%$A@sgϡ?EQ Ɋ5M42"< 1=5LNA|/De ua|lBFƅQ a3y2.~Ye\9J^/h,B F`{&Fp{m.n!a?SD$/J`~z"Pi"L/DL%)1a/ܼ^Q~(<7 aj(\ x.j*1.Ya3È=6h*wIbj0k(Wxb7Gk;s:ʡ/ŷ̓,\L|C]}40|nr bAf^PX8zŢ(ת} eD>d9|'ޝ%x].ࣥxU|pG1c}{F{FF/{71åsX^Ƌ7.c0aRxQ@{*`(=(*agp{ye&GEA4,C*G.fp[KgNgrqT*@DS\ө8v F,45D5*8*4h#mz~TLlR艹. `ikLܵ%]{YW3*o3.ˬ2xLOMoIB|=^okSblǯuܻ˗.&Q ϛ-33ش.O0NnRB3A*: pj?¡ xGNI-nҙBDl+8:JeE8x 6X|]cIGR`-x~a}lAG䥵{ SXY]=>Y; Z]N ˿A&Td8yLcд\68-;ƅ5Nb9#NSxIVj000F$ϨMh9rXAJS7zqlgA&e￵JfjI144[u~$Yj5ߣI!ϰ\S\(*h"YP5 pJk[{(U\( 2^?._J_ /d2ITW02\nrF2jAzY K2sczlC}8*U i{2$J r5Q0 QBL %ѐ, zF,t_^__{޸I _kʂT7OO!B. )ͱX=D2(޼B,`3FpocwwP԰)ah yslY,P៼Z ,C 0>] O W(B}h0Z?o>!L\.QCS\, \ hB| uo>G% .r3 fQeNuG[߇ ѻ'}<tю49m3c {ᴏ8@wZ`aɷkza9T/[V 8vA;*tKvӫo\{{4 ^n !/ThDJ8:eab,Pq.^mj ]Lj]:!dj'1,Se ]b]ߚ=.s\MZt–yi=M χJb> CaQeY9gNcskۜ7צ2>lNHt`xM-%̿kx4ѴH˝8M;]k,,SC0j1`]=?+}[$it*p\rzGj*zfqtv9b ,k:U .~{?}b_? }1ATku\xli\|B < ΝY`ǡX*] ҽڠNWuk\*Q,!""0( f7f(+'i*}>ēO^w.l6شO?u,Lc&0I XKN _x G5xܺddEcN!˘~_í];5q0X RPT@4\\a:ӳE>;{)|Xy7`sgk뛨j8<`d0 Q Mr,$Q@4)E>2y}A PM,. ~4x z2R;^h#I} MSĄm?prFVo<(" ?#vvpp;F;a 2P p3@sK vqx鐐 UҲc@]5;00m=O&Qk /xAqǛS kK"jE{`vv|B%x@H(z|4e]KCVds9RBtR--<@8di"IQ*PU2dI$I&1:Z|Y/F091nw+֙@Xoh84h~OeS ĨE#&=ML|>y].4t(.4@ Ft;V4MùgSsfEa?bξž(ʶ6tZncϜA&om-qh2av[ R H$zU^/z9fCCC857},̟B&E:ή eS(J| eZb-,V: }eR)?Zw,5Rj4\p¦ -3LoqCjv4C~-.4O<۷iwWG- >jV#MLgb.|8]Q 1qx|jHѹs rp>c d0D___O݅;/!v\+_m;_Isg{MVIRϑa|3,ϛ"֮bhV(\. hr٬55N 㘘᡽ i]BVT}0,X(Qa:h d WڕK9HΜ^D\°`dxW/]rEUQ@27nbppK[èK FџH]HxL amn~$C@4DB~71>)4dNe<.l4$\/EP Xp"Ӹrj o>؃2Exo=$>wy?d4kWn^#}a< 5,>\?gue<=@ZXSx4R<E W G9<67 >2 YƗcu+hЋ}scXZ`"D !8=3Q(*˘Łc SO _,xQ޻ǍjJ ~k_ß!Bd]xAă~qfn[=Hc/{rwVQ7qTEA&Ws Rn^ŻA8CRF:BEVC@!@,BV!$a:f'2:u_U$/BSU$qFH_wG:;P6Z'C"IRC4adF==3M(M1ie { PZIF==񴋿{#\+EAGϾ 4uϟ .5 } ҋDS+@U5=@g Μ^FR1]$}>/!r`R ,y$  E504'ZcbXrF)@L?IPV*vQ2!\.AU(#ѩ 44 x\| D0eKQcGx:޻GQ,ZKyZ8ev4j x<pY048rH&~eY6$αK[e>^\^ZPo\?R׵w  J;͂eY(:VI #?ЏFKzRG$d0ߏnߦ6Js8JgJVthv/Wd6 (`fNz >3'6nLEX4c+NE\u`RHptt=[*$[hO !Yk簓/hUd}wOi7/_ֵm *|ueL7#H8v1IÐ{@2ѕ@é8MPLNu IDATt 0v_Ύ_v 6ݺ/"nzs33(UBg,atd|ZpZ/>6v "f&dv)qNM6]>Nc{7ecn}x#KQ=+:mQBFQ >_3έT'QiG%Jt ?nwbk{#-\ SBs.H}T[v4󮺟q*Rn%ݮuC}iӎZ]l猽vo3NkW&vǵ&봉˫**zh4 Qj૷mδY'b>3@:|8薃T[i,?uqr ,$YKv0>;\'FQx=`''>>jHDX;㳗氛-ARU9*`a47pX(CQTp0*u?d |<=(ߋ#n%c((TjHD% BX:@TAր́h < M !#vaukPGY9G2ҹ"F ރ s;Lqǐ:"Actx=8~}0QNhg&% &( bvpjj ,*:.O\XZEVP(Qqaqb [/!q2:ozX$DsMAD"h"A@&) ]n =4jYtQY|tֽͪN3I&4lbF$0Ձo-vJeG"b؂hfV"->QiZO:x-ןx{{a(煶ɥqq2h;uzFøeoO&i0&F[)Mݩ/ h 瀬( ds(KmlԄ=@4,@Z$8VVaQnɒwPgǢ<O\ѨS*HէȒgP :80$ǀ|ucye(b%6id\.Ut;QvYD$FZ,rBfUh3,M݇mv)Q:Pz gOuJ%`9N7?--kKIdBh>YV?(& BAr(ΰOV_Y&Ev9T "gN/"Ro}qglF%m4;ziGZ avlPJ-Ҫ{KQBbM qBwEd!ifHA_ϛSDBizMdž8? 㰻eM(K((KX~Y0L~D?2Y](:ΞE:n6hKԫ*?--SR%[|[h,i7 M W= wgTUIgKC!9 >Eq~B} SQ~Tɚtz:-[ !Lɠ0 u|SPlN/` yɩ~@ @ q۸Q(kΝ5ֹj mIs8:_#FPvQDC~l0!WCRTxJ菆0=c1ûPkH>R#! *߿^>/E B~/l@Se$!ɲa}^s>꼀rT:ǍP0JbA4L㑁ֶS(Uk(Uje O\<<&K1=6w>ׅ3fh禰pE1D!_(B{=p\EZ h4hO"^59xU7U{&=!4٫w(jCw9^ז_#/N?'8X* n}} @ܽG)::%h8s467,{!|L}CSh3Mz^OR~y@QUj a=N @81jLγx"ϫ횣H0zgaPV- /A4'~$rz'\.4ZUmSsL pvۀC3DLuP`tZ}R 3SzmF5q-I֚TFt(,~;7xҩA׬RT]TUZ tYv8959Xdմ`*1(9a <ϛZ n4EW0!`_k-9%'6hۼG7u$JP^]'pt?Vw9JLQ.[慿Wo9G"7[LtF%7Jcz'*0;̓ ^$IF_(lR'bmvp,QBPƩA=G6Ʒ^dKǰ{$Η(2`+z " V6vq n/?z2lX @Jbqaq;)r&8Ž`O]?_.dRyџC48j?leXnlc za~`ck,~yַvJRR67hQVMӨH.y)nBAs,C~ݨVU !:8ᑞ*M6 f0:kDFGG 0IkPD=ǰX~AظٙY[RjxhY=B|k?^|'-"X*`L~Eol}k'A\gy[ېd_p}~=fٞV:91N0 ͭjF,CVG.ODYQP7 B+4M:@k24 ?=PH8FS0IR;aoiw`@m2Y$t7M2 @%fv?4ҵ~˲~P3xEQ/d$JU]hRU8'Ӓ X}%'>#m/b;AqPf9)uC^( Z^8P{^f$qŇhN|\v T ^. `{N xL5={IF:1/=Rd>0q8=._1%79StnĢQb} Pzd!_(bgwϝ~ _oY1h4S<(*~chp,b ÍMh4O" C%O ۅ}mӧrY(  |8JgLJ#7ګ_p\Iryw]\uR.HcyƛyIlllfA_hP@4Tׯ?6*.rgoiۉ6RBX5;MLLc( zŅE@0deYZ"rFn|x_j_-=bLV&#N#'=0rB6+/ xTFaصkXZ^^,;o|`zBD:<4Le@.vspB;8woƿh 6ٺ-Nu"@9s'ܬED<O:n3ZѫQ)}SiBEu8q4|嗱mZߩ3ͪ]ҭ+縀 BmG>LfϹ\FfBU(\np 0,xArC" sh :1H*A.o`br"$*5< CR4Lֽ5E ᭻OpY,m181xirfw4#}J (T ƋUPƹa||^<;^^Uqfr&(s(7$, I*>b>N'PTŭ#bTxLGOWvk8*V17G% B`DwԐ)VHxFxX;ssPUܣ͡X.dJ# a?[4X=DPמ{ l`j({k oY|>ZF_(jD~ll# czt?u/ރuģ!sL`lhbh zDžs8{jENY2"f'02_|'.# `um 8/,ʕ88RGYHEe|bk7Q|on2n>~[;DѨX*aR޸\,,U}^рM\S3@1vEB憣nݳD#AyeYtNɞ8.Qeǩ9LMMt y;e\Ĺ3wiy TpcwoPqڧf۹f,tFG5!767m~%a CPVp""&Z}i*~ƚ4PjI5[G<GTS ; DfP Z@/` G<GRn(AuE(=!WVQ(0&˔6B&KDYi6i"=^GQlQ_m]ۭ5G}DZ ߤ2l$KmȈYc U!RTX≉qNJ~6!Gd!*˲IMө=4AuGk R) P(AuB۶7:i+ hx8ejtj ԩB誻*@Ii,9GQ<"Y,t]YГ;~r _V◕oi04T.{eY֤D"nϬ6^"MNL#`J3r044BjzPZASMz㓀 f>-DNb-{0|c?azOevoG7У;`=6Ķ'`DOk2:HGgS( U3]BkFt8lj.&~߽pY5 Q./!؎ؐNۥ4G>OrNY{x"}8J4._D^:[`C xthkK"ƦD:v.Rid`PZ49MI1 IDATg& rA%h@j*!(EZ6SGEc +ùp-anS ,h tYճ P庈~p Na*d_GKibx04*`m -`l0D] x GbB ;d6w1?5BEUqyF"Ƈv#dܼz\ Z H]z%e-<}.8YOJg[n~ӫ=#00AVMtGtҐ:}bd |w:m|"{=$t:91ѤB솏L$[Me<}- G]nb{gpLOb{wAEonAaYp,Kkyc>-̰C`)d915 fQo191|F C&C(M=.ZG|>/DQ$ɐd P`k7hl!^_-gš*Mʋ\.R I(nW{жwβ TMӓ wn n {{p\EiP,VAS\z&r.T5 Bը0 8$# AӨj8exj`CACڪI27;dl 43dPvk,Fǐ?⇯ppnҨZSW_NX]( 6sofLiz0 c޿i6Zrtt%LavHIaYO>yvxk啕>Sٵݧ{vS1;iO趆6[{\9^mkutxr]ƃF} v.ANޥsѻݵ.]7}>.. wkm vX_LǙ ]``!T lKDžsgm4XD Rh;{)͛6X, W=4z/{Hg8p /OIiw5KqbPGwhF>_k׺?dM~p,@ |R@#|| ogl Sr'S`^[nt_QM PUNasc5Flho=f3@SZ G/N?DcÌD0==l6k_`'+ b0o@9)A }t? YƋ/ ߵԽҝ}4 xt[--Q!mcX?]}if~.dTfV+X,mÔ֡ZCdp.@84o (T'B*[B8F*x_d8??E#  ^x/'/7/Ad*V3pq."^}aq c17\`0~E1=@4T(hHK03>e.:.0dx"P_^R~TA#pǘo_xYz{Lct&믾M$󝺀x=Yp[;C4u=~ʵgnhfIO,F.g'=(tkkUALvUU+ zk9_fnD 's,3*۷?,[.P3gɔI(}EQKu(W\ p<.V5zNP$QT(lgٍ#jJ,bu}`GPP.Ӂ,s~EٌEa{[LzMQXc#JczOaIRfÇeeuͭm|!8nLc\pfTCP׉EmӢ{fƒ-+474Q7Mt-;uNS!0:<'q} L:=Sۺ #EQ$N#jr]_*bٙiVQ<bZJ\6;欉`N'|%IrQf[Ѕ@>`AZ*lU x7Vͽ)ٲrH6[SqS*E 54a׸^ X,!F!_(OLLHuzZP(@.Ho P(p8STIRbUx{(0MP\.gAj[5~̰s~ AC >D24!cgB$NJp(ժTMkߘ&P'[5Щd?bq0uTsEVIE^ɘ(JZ#ZJצ8 !4cccGʻF M! M27םn0';k+wѾ#iq`6HAo[w='l.S/wp`PزRh4`d*㳯;Eܢ'9hmEh$DX+vQV`{݆wCU8btdL6} ..t8VY][kkmmȴ6&|{o6̰/FlfD2f&'y/r]9~Ot5M"pdvgFsj(r55~YMC A|ԎСNdVoh:wc VN~(`3u&oUC1o::w4Qj >^][u6@kMOn#8<~Lm\饟ٟ1DZΫ6 Fn8P۩#8Gۤ#xt ޭ5P>TDZvKR ckȬձ}FDtad?^G 84>6F:|^; CCC\~f.fgr|:} 2g<>8).RGfTdb dKUclel%y޹+MK.{\:1ʍ-`i3M; M:_0}Qj;qE>fόbh9KE6kD"VLepp8D^~헾ʻ\f?&QKeuBRD"'Q%HD0\.391%~Q;>`04ʫjJ(bdxе" 3wb>v(udYfkO>ª&p8z}TU\.spdCn7rm6 A*fӼ;]T[k@{rM{=oUP(H&(dO/<\JUn$}?OTU+ `́v‰)v' ;=@d*\R;FLT6Ahҭh~=1!H(jSBfawq:d9z i76M`,`HL7 F^#&2:fs y{MUपio⦭YkBqIE) k썦|`qQ:OG'o<,,Axf.g3D|m<4k] K*_W~fOT9)kC='#5ፎ5}J[?\N٢ ] j ۄG68<x,U6Mbw8tYD,nQTcbL] Uh${\mF,nX+*E{ R6- luf9vW YX\Am5MXR,%͚;7{Bk^|9VVW&bl9xI-SAӯ|nհj[8ŢIK>_h<h*0Y%׋T*QkJeoΞ9n<6! hт(Ұ1]Q2~@cKA8R=?G0>(%_??A﷮LQk|ըlѼbh8H8L\}3w[ DY77? |k_ڍM/ݱ [qAhK?h ,K/ZR x N<5(ZARt sۢ6Ø>i7]j|6ivRxs48/u <;^2b[ebhI?f14m\C 877 9ZtaML4arUZKkMݣN)&"6uu\W4QBl66LJyv%Y s{i~A" Wp  z} e$a N:W?;L -"W*pg ^:5̍'7 yxoX|Ɵ\[(pfp V Te'Atqc#__"Ypo+DOL^^.α_)6o7$G{t;XϰuXI=]J*sýœuO֍vRV,N IDAT"\7]igg؎'苆)Ȋouk*?~jJ>_*\X,aD\v;-(u-,#P笠YBgfpJ_Ojrl3/?uLGR+KZ1 +Lfbg7jZjd*\Q Ng#Y۵^4QڦuHiw5[f$6?X,;Mjixir5wWhM O ERU;\vsy-,4(@mXNogn[7K-FS,#J% 6 }_Wv&drQ ÄA4 x`]_%Sis"0_(062 +r뜜ů^AZm(Q.kفU?@("WȓJgr^ EMpvѺk-ؘDrbfݽ}*M(PTp8+e &QiV+ӸaNY(b r(@MnA}DQ/`utiMRIĖ5?gp`p8ܘZ0_\^X,EuQA!rYuowhAB .S Њl|n'_( }bfTZ AłbUOEt6wə Qɩ^SVe69M!j^y%Lsagw 3VX kM+Jƨ S&z<^kx챳buL1*ɤZ.㗾\~CU5Զ(=}yTڨfܺ< kkkN|t͝p  Чiv)j(}_o~Q>h=6:hE|s͙X믽CA#v0zXiI+A6>AZMnX,LQѩTs6!~RQyKiL.WՃ5sIj֩M+ma6.mnJM,$I|>v&kCiy';Gn 8"8;I_Owl'=JM 5( a .oYl'ffHvV@+\裶748H.m}^꼧 h6NBt隬  QGh/njVx3;A  h:(J=n$ / HT:XFE C!"=,n%lHvr"+I7ws_7fԩi[ Ddq?'ϟ`yg0ID%[kil$T {87c+#-"+ ,"#=aeUj{yo2oΝUNRy~vxG_í$iꊊn㩙u["q>\;zݡZy{=a?W`as+<ަ7޻NӓYZT,wo`N;d$rwiEHnc7i8==V<5|.'\cC=1݇+<).kbb0{4z' ?x#>\%VveeczaU%BE;{KeOqwq|HZ3:\uh8Ǝę9C={6.˥ /q>[%/olkO <vS֜2=cj5 8 zdFʰf'CՏ100@>ow==Td[t:j1m8OƵ:?7ouALʧh4BX4m8_/6%V.V!ޮƧ_7(+_Ù3./un:\躙 Ƨ<<4DBӠTkɗxرd+eYS,$ݸ/Rh·VͯΓ U\P( #ds9s/?_,.P˔e]GXSTLFQ5q%PhB& {j t^שT*VY}rXQI+X @Ztr)ET>]slc/ ,b`y2:(Ш+C{p`@VNLH&u-b٘gO/hPը === ^E3=9я P@ccnNCM(BogN&4aoE|ݼAc΅C!jDO<47,.-sr~TѼ/M@tɉ (ϯEQu: cO$I(zWj5lag}6H- Oׯ0K!H/…'w~#O8di(w>@@?v@=~CA~+_͛6퀇[SNv֗-42k&6 ]+-,<ԡNIީ$If^U~_E]3O_8dMo#I8GU* `Zf/aɤ635ͯa{Z$I?^sրD":fԮJ!<% r9aiN:=է@qnIiZ3ӫ6Z@{`aTծ G㳟 -|x)r7Q;"ѧk<4 .8,^Md8SG?e^xizz!Y׮>w6aП^ $WN0 G"#sPΞhUo @T,'ګ`)h=jo;qd9`z[{C)I=} MSfG.^.W%5GX!HefG;%)py 6^w duzcUDϝ\|ӏͳ@ODȕ33<,u9l86fGzK* S('fxz:SrhaUIJyv~?w<{f{>zB3n͵] (}kɛq9K;~$uqz0|9[ܤ?aa'IePʗIeTe"=.J*b _5Zwoql"Avx\N|.'tdL.^IrL:g}'sܸ]:ѐpǃuJ3c]X/bnj{荄Px>ַ~RB\esgloC :~:KWw)&dž1!jhx~UUh<5K:ҚuxH&LS$\![S G45)i- BcG)$q.w6B \*RkSb\7Zf7 H\W$z]axp507 i**+>zbolq8v* ]D2ٜFe&'ﱸB_/yw]\NN;\7ciAbMLt8ĢѶzAm<^zbQrg_~P{Zf6} A\*6M_^2& SSi^d  `(KQ24A$Si٨jN.[m,]br4y"'*.dhZr#TXՏ3II(5nX⋭QAB{.5BsdW s}88CkQZ5Ο?G"x[ըVHt,zn'&&&ĴivH4JQ8 8n͟a[W{[Ac>a֣\.tui,` t>ʄb̙ß_SgEgZ|$=A<2B>;{bK' (ghp]Zǃu S(Wj8Np@vvt6;hg/[ FElN279P35cu?a\:xrj; N}Amf$7.i[|[/"(uw< Eak/p'Ff7uȬmyK23>6ĩA|n'zw )JTH@O$ H33#H^"M&c7v<*~hQ ˨Jo3SiA?J!^| n_&I"!V6KHe(W* PTT&yEO\%IT%bV7y>$InݽO.kqJo,J2"_($Pv;$ޱntnZ UUF#y8 + LRjsB-8].MKG5!prB(FhnPBnMi״mg6]0 @Cd2$IB zSyjTCϝ}/ ,) 322G>N֊ KS3SA82 킈n'5MAyOq}e6؍/=uc<}rT:CZcdxLKrf3 U,7U=Џ Pen>B@4V2>6HRxFYؠ(0C!ZX$NKQ@UUX]ߠ'AUX,hz<QhM`^7uN]v 7 N9SPX,jZ_ uzKb||6'Z-Ej 9-VWl6)RnٴHJr8σ j5fgO$5\FjUU/QUm'P(Jg0h N?'ѯQ4=}&IQ;sƽFf!AEɉ s> 68MyA]Q~kSh~JB$fai|}k{\.oAY\\4#~V|&u5`<wh ;QJT> 6_R2ֵ|TcxX;݀G.o}?q/r/p` 5~?ÿ?j/du<@m"2O344dRuK#[Ss[3y՘n<~ OZr>YrIէ tFQk|~|a:?#EU\ΕJLjUIQJL-hgOLezH 4)74*JK1\K '_b|ld*O2v17{e@'-5E| FkͪZr?|[q&M lm'1jNB{4n[>2 bm5PYڠڔet:UCZs-l6f+)n5YM 0buCi=Ǚ/8|HcJqLvFϟ?#XOQCà h>C8ë1ol޺W^}?j̭EYXUULYQq82[Jσ` qU:yl`VvyrLf9?>NLdxnvtIT#1BloBF ǹ ۸]N$;<55D,渹`3]VYK1_r]Fx`o$߹n,Sב >xƛ7W>?b4:\d&O2%Β/x l%rΜ@E6v%b!?D[ ~pO.BU$Sv8mۻ{ Fywh(ʺFSB&#WȓHOql196ȽU P׃\󳯼;{|t!}16v= IDATs3]\OfQnO02o;{D~PT2,L͝]f'xTuT~G"3N('JQTLj$|,r8vBNY_{U jb|]x_!hwZfBҢ{Ҡ%2UM_5=wYL[d>"n'O#7^7n8sOWNgm}?y"[O?Ś%z ɲ ؙSnz{b/TND2ɥ Y[@"0kC!s\f1p ID67E|^BOPTPи:CIE#:Y I)KMs7~>_hjmlfb6oM~?r|I`FdjrD2mNoקB69É  PT#0>6J\E%|>/^Án\.X,iBi, $ꀂV0:]T*iP.h:&.G_ZȈֹ+h;{-l61#A ! }2IUh%wZͮi#&E/vkNTF'xs|>l,.-Jg|ߏiR*q:K%MoPW]jS=g\oZuQm}j@C7n6}K R)ԟGmqqm[F}v,ګbQJ"(20O6msN˼7(2Y٨R6F-x;` 0c@n?"^4QerSVёfJUS'/Z>d~bfG 2^ Ç_Wѻ5g4<<8NB%h|gMa˦M}Xh Bg yt:597"7ʳ|}nl qx,+{3|pgMbl鋆xKz ,mDQ D,˜CUM"u,Gl܅3,mL@Q8ϝx\3=>BR颹07=5>q\9kwR(׾ۿ>OxA +0=>6.7W(RVT* ^cae=>3ona։EBN~σn#Nkz04*n\# tޡ^359APRI3z,Ԕ9߼o3u@mNT*F B,mɉ,D<=qbXlSFc|W3)E,]x͉&f\kAtZtffӫ:P ֤r4󬭯Nτ}%N 291A"0?/d5MADQUV6n޾K? bQ.7Amv;("Ic!I6D,P,hZiXsnTV <((IUT(˨agk{[z<\88<^=ސ$` M@`Ubd*/|s\qK7n[̝fcs av˫J2Qdp(`$ӨYmӺoiV>g(0<UEUuV U߯> s6tH9{j-*''Oq jNW.e.B-򍂊.(Ap8(FGGdeae?[D#34d)NqtoOt&kn QQÖE Ca66u\.NNLyDZ:G madCUԄZx=gT6h4sslmo桽mvM333|\cN)ם{(mVkL}WWv.[._(v޴Z6xTo_7}sOP? Zâq{uAE58cBKzZetxl6K2zH:Pe}c ӉT>ݩZu,jp(H\B Ee~k56 LV`\&rxЈhm7h 5o/LO1(ծOcooYM j:ZT*kqd72T^,Oa3v;=JFT0l@ku3s'̜q]g.àRT̘8_m¡P@m,#~ Mİ b:AGkZ?8J}Qh[:]&EF׎jr3aj%Xn SL?_ޣT*56ܗ.]dssHwqk>m;x-a623I>O>EɎ#MY}ЁbI=80=<;:fKLt:e~K_l 71y Ŏk kv35 E1e^{U[פv;gWC >Uн!!Qef韮9qQҜ@QAQUVrUBk Ξ"_q{}wxY޾/px<hg~lDUAD&^S NSc'bw9;ϿG|ɓ7I'g;̍ 0ais$dmgIT\:}md{/0K[86!NNRx}ypo]Ua/TPTr&&J'z=<6 NrrFZcs'P?k[~~,W7/Q9يSTY߉#.gkw&1Zy{K}s:70Nޙٙ X@$$. vQ-ˤ-䒪\eU.YeZ.D+ؔHD wι$stgv*UfN}<<7 %c'I^RSds9 MP(212P"ƭ;dT*"Jshn\.GXVںH7b JpkJ\CCK`VH]"]Z h)e<$)r\Krp: ٹR:jb,%Q%L?T7mx݊t$$W0@Q{6#TV}I RR,xt&@roϖr_JNl`nWU MPF`\.OTF0⴮kp5:gL$ ˋ?˝{ Cj5nϏbv?vэbJLOM M–F*(iŘ`m}dPO&vv!Y(%\0R([eY;8lppReQyDZ|DCV* ښ\K IM4x\eS'Ok,X,F$ <^8Cb24] Eek'#qx~Uf&Kddxݔy񘕭&!kay!=Imqu>`1WkY0ի I]c@y\F#u zO^dm}p8hz<~dbԤ ] U^h[\6 i<#be|P5qjO}ea"K}V!P+1ѭ9%>zCޯDkA$l6Cv-n~RtܣB>F7^(T2,撈D+)uPng{':6:$Ib02޵|'uM@0g}c@_v\f|tĖPRR("_((nvR)f'X°W^~iZn > 2d;}ɋOJwVwM4}pkh*$1q/f{($"!>駞b}c\w L][ú.zݞNH,j'sK6QEH$PULsҰq12"$GGG( ҃vhbm_ݖ@6Zgxglt>KN>H?5apm- nϋowHx8!ϵY] GOQUssGI^U;qwvT*4M駟jJk<󬮮Emω>$aHcqyq 62Ggcm~\~<>ϜvxhtVeD1@^+R;`%}w}d}}:L?ɘD2@(DzSw; *E)yFD*U $/nP(U)kxAdAܔ:F=~&[`vb=.8sgs7Y$UV٭h MG/6pGߢXUƋwphfU^ A3V1(keB0y+7lL0߫S͑>$ZP֊"@+k=pv9׭^z}=(u~s?T*|>Yj*>,pЂ-zp\x\.TM.Y ʸh$㋬mlF& 8,*ノEx5$ U#jnzI ~~ÇOYmoC 1Ni( ;餄xn677 D!ѵ \!o&F4 ϘJP<P.AhWj1n\lW TF̓D"N>_Ϥa5]rwI ZujٵH4/wc$8pZN(V1P";xe¡Ir#uUUdYQ< .[@7%9adiV*jM7,1b-YVFcà Nb$>Gau_Wq>k#;N\0XyAp8a~ m]*f4ap8b >6?MgX}LZav}8zL񘝙Pȣi"0x)h{nx,Ɨ>9~[T\HLOM.䠊fI <`KfG;F A}vG;2f~doeO)9/d)6cb){gn z9A& i˭ $ݱY?Rp\;<<Ύٰu(>)=<xRGC=rt6Z KWY*y @תUv-}&zOqF:^~3ɥ Hg"vIn?K{9Nw߾㥳CQjN4/̰vyl2,ʧ.M]nBAoO21#WUG|<:F" ˓׹.0"ŚB+jutY?^VLF]Qԩ9*E68$.k9?].RT1rsn*]BZ批acׯ-+/eWJex?&W,s#IR'S(h(%S \D\#x\.>9n.zV7|S"Kp}Ϝ?I*'>18X.3?1zx|HZvS*W/|IxyoFaN/^crl-ܺ`llPR?;e7mp ~HTKO_TJvgm|^/Wn% phn6b'ϝbemb*l좩*pSYZ^afrKpc#xnUˣYk*jMf,H%Raڃl>4k릴dWd#7@8qt >EQ;`7@ IDATݭ͢:&'0j{##Ô+U'|ky^/jV_?ϦmlM}+|C7s6 j.pL OB:(Uky:r [H~z/wzMJU[%9iI*(7ZCCCTk:Lh1SVKLg] ݢ[]F(n4 e?]04ݠT*Q, n|>?JzNRr11>J*e|tp8dWI EJP  RT41k_onbH$¨vD MߕJXV^o^][s|/?9ܽcfzw,uZ^Im$rɱn7Rk]JLB]2ta~^'|g-Ifލ}dP'}7_})Gύ[:H}\>7[O`E*ƙ[t%<3044$c8࠽5j>rs!m屟ǽ{Quy1ʢ-aNdy5_o Wt/*dZEaaqcpђ0H#=z}w<žluJ?5g|&>TvMN~ʄep޶u+ao^{\(] qj(sjƻ, MZm fRlOg{T~=[-^ْyzi( 4xxC$ ;sβ[#Q.{VCj}ZdpSҪߋV_$"/LF=r э|k/}m 8k6t00ױbVx<^tah^k ͐*._'œgNr}m?M!L r< \DA.L18  y$Rnoܥc4tL*(UB#DCγG'K/_ŧ9?=̏Vv)|v's*y$IhO.1 qҥ*+Y~clM6($>ouj&<\uUR)UQwv04cU2 zݸ%M zYK3lf863w)k?:˟|pKT{|{.W790{̍K_x}V7 6o`Bj'}rA$T:K<N~:+k< nܺHJT⩋YY]G  ` PA2bV|>;+]{v-dg;% QT>00vWK/9A~!Ll?DtZKJcR1ڝIt+x%z쎙7J["z_xsܹ{ZX>-˅F]dV9v["h <7"n+^3UUff%0Jh8L\j50TER%sY\n7Yd2|K_d-A )J&efy6РrjֿUS vQVI&jUWz횝@1ghxc NOySfIY<\:|^fum]MneKYON=$+U.qfc_U!S~c8R+aRm##ÔKkCHYCxG uc&?"+AXH(bISFI|>an0O6^ ᕫ&(AS$ ^j$[&'1 x9apiv[-ic|N£b f߰ϱ-}Uv]3gN7;z$QJROAzIhyU\9G7CC?k3oYB9Y8_E"iSҠ.ZH3O(n>9}d,fI2̊Tύh %zNo.$\.nt\v)%PZXh~M@P@B`ddCv #Dbq\^?X <>f'X #b1 Mmh]&_ב]n[SÃţ %F^ q63E"!J5 ?cvt;9.,)iV%$~wej @Z\HyFyb~< o-3+L߹CRiru/ev8N InbA1(u͌s #e~ .񇯿C!s";Ģ!;iN<1-PHsDA2|/^x4"PTC&#W,^ ~ |ydnn~R K2ѻP*?{nzHDfvr NSVGÔ+ebL&GR#`]DV04JKnRǃ#\6k ms$It6ZR,+g|_]zNȔ҃ ]eI2\.80g9{助,4U_W80;am}JҖ\2=ܹqܚMiL 27;C]Qgs{XlM3u2)d_OYP,LFTr3FQF($ucݢ#GZAi4tqwvH36hl fki׃VFA H5Md MSst[)@4dӀĿ0jUt9H>)x=BR S«mS~s\ij$3LJ~T4/slu X&VՕ RTG C75]7ciJ, 3$ N<΍[wl\.O LM2Po(HH ]' l%] vF8&0^E[¡YRXQb\:L&'(%r*VYF`(JmrӤ噑:/kYV`?Z1&w =ԓm:TzW m{ExXs >9r^U&"vc{+˓vier7no9  _3g隓g>)/=C H&/:D$w2FOr_ȐT?g}񙝃Zk!P FgDTj׋jv%"|@0ZZ /|\ybhpZx0I&ygxǏλ8?TU^zy,l4IdҴ"sgϘ?iR?W}v˞auZcttEQ _(044H&ett͞$|9:c"3vqh"<Ν=vWYuv F1MQ{CVUyvv)F8Ins{,x&ut:[2.{pй> d?;kʺTj#]"WcXly!ڃ. ND"A,=rŔRYB3 ꊎ!']()5FF)5T0wCan'TœBu D~a`,cH2Ju`v,Z̻k)>s0twh,n2qu+pG pk'`-3xe,r{҅*˻YŹqb<K4/'湱kv /Ipsu;G5`*~)~k ?}d\\O6XJ!AYzxb[+ [>sw׶+y;̏˳-;o~K8<=Sgy->9vRfƇW"Av` kCHQv,e߇(so TUEQ7dCEI4d UU $ ܹS8br~dsǡCf-M+|czjRʛ?ւ*MUh-yLuָ>'DqPhY6-~b-wU>¹.D\;In3Cx;:>n"wJ]1Vk\nbز DL8=c/"v9k bUU%2%Z1?7^T*,=X6um?Gccg0SمSX][Gu::`au1Z] VG #14<)\u>/.Yn0 ƥ .-\k?ۗ z]BwJZs{jc%ww R֨jMupVl`gqy(#u?(5j#Cy1k(%YrOclU*hcsx63תoZD0l5j'<.]dsc!Ɓ8m@`xqbK֯ψ옘h2\T$rFXO߯mh&dΟsxt]GG{co"׮]hVR"p<_qΝ8HXD۷[mddûw-!mϧfu'NPojTj5ڬP75]H=aTnx}~A6 ^gH.tCBv{%<^?ۃ .V9x ^ '2/e`DAoq{mEQXMd#3PV5 4h0 sf|/0OLqyaTs n7?76S<65ķ,R!2A/"zOk04t>W3lmVWɩ zs^ +s\[s^0W6H~(yrx8@:gabo|){ V g }/BP|T&㧏s}XDU\,3=5IPϗ2BBջ%$aRP$ɔ,xDd"^+zM]9cbM**-Y[2F&YqU;("2^S}E\iLmV=V}ÇqTv' .]|Btֶؒc0Z^Y NP('x+a}cF%1ARX,d2xBM6duM11>F>_  j C8s$I^/"/aHjEakkg/? O̽X$fqcu$K>@$&g ҡ)ԝܷP(ԡlNJ! iq!Jr8 dY&|B@ > IDATD \Hn]ndYx434DT5hDٲLYfk'I ৡ!ADǹ}r]2&{{54 :#CmzXP(R(M a9B6MfnfZȆJ۾6F"y A CktfgQUվϚ"O<~ͭ-t]T.y* A9'0h4p\ux-k`S6ziA0|XU6kBa޲_:Z̝pE7?+? aב|p,t$B/£=?ɎכH?~d#m锻2f܋p h{U>O\hrx-ltt%=rp;;%0} :++6~{Ud۽XrSCC9]LFWի?X-V}ds!scU:-m5۩@jnkݯ"zzz3tSJ{lKL6=~YQTQ Dfr.Z !191N$:@V'S)cT5SKnO筻DC![K212 i6 U~3˷x'GU I6pI2>VV.I喹|z?,#~ qo72Ӊ(/yM.˰*09$qO*#svzwwEj t[8>>A_Q {o^屙A-mP(d;_kbدQ/b(919 C!?zXn=`,FWUnfy=W_KBA scXZP<XޠTrgyr2FW:GXRQk4867E$o0>[p{b~H\EQU4 aV6Y!  )||zG)U5>PϹGL&PU$`'B4߾+IӬon1xx5.>B\B!c0V GsEE ߁hخ6t`0( tUh 쵷E*'# BY255EXbcc&UUh̊ԾAaguXǚJ)LOMP(Zt&2׭`3 `RUUU[Ǐc Ϻ+r/} ܾsE'Su#*uw^L6w`l;?7˵׻BNS 2xBLXbldǏQ4}Hf'ޱ}>.:cǶBjʯʏz۬N6e}2rz v7~\߄~@wG{aH?a0שO~ATzZǾ|"X6%::B$ƜۚH-H x%Iy}L7U#[ =F5#ii/!Z`9*I߇gٖdzh'7AÐ 31^ɠ#Q?Z2?zL\[v ӃUS9"~R2w$+npw#ET叮,qc=IM:7\Ԫ5DBAʕ*Ξų> 8qx|@>W\*vʝD,6`J(TQ\.x.^ !z{=1&I2ss#\~6Ng#a׮돦:HDc#G0 s$wwZX ka6S7ݳy ZHY&J3;3c*^iZrΝM<4vr@TT>}E)mv4:$nZmJ]ddEQg~nw29>/\[}{0=9A"P( ˢb i /Bv:JB$!b*Pba~jFZ1OKkGz¬TVX.I,1TU3?:;~ t ъṲE:U̮W2,8(w Cxa9em BJ@* Hz!OdHBF*ݡ$ݜlm0;=x&$ ^ ٔ`|^Fx+6ȟ tIuO]ڍ[%|>04 i]|cr&0:n h4BZ#YzL6VQ#Ô+dId 2(J.?#ѝ)?(R  w%\dw|n4EiyftK֭kaA.1bTZx3mny%Y:јߺVݺ*zqT R[yӧ; ƻD"=wAxg8:̧m`*nyV<Ǻϳ/q@ `z)g?"`e= ?^j#AVVkߓn7.k[sc]!f^7&T>2Ra*>nRvDBT*ת'L"ݶ*cu/&ȲD*28%&.vϖp&C s3:yy:u$jn!=ml:猰 hԬotwt]糟tTUhP"vQQk=ݜXJbǐ- ؚ's( 8кH~ssTEܯ,>̺Ҿ2>V[+n.po3'ཥm^/ga| ~mpe#+'gnlfet$ҥ*rsHqg'@$=5=6+DBuǃq;]cqlA\,u.&[}0-#st,0 tOy\>1K:'⓸ÓXW69>>[2Qn.٣ڗ^:R/=8o߸,|ss\ O,LƇO`+~pϫ^`#"R(U ezA,"6&ScC$SYAa* 11ropHS`K$0$BWncyc]7 ӔJeV78<76dGGR?lN$Fpѡ|xw0 pRi&x%WWE}q1ш*sI#x\ju7"q+b'\X$k"gzZX/-,=k ڻ /ufSzm}fRiuf 8Zc80d"]-ylPC3NxssRԲ9c1JrW>}ʾv"#/ăesk󹳏'^UUd &Ǹz}(~ںjsEM˰E2$%FMo+N-Ւj53 ÇYY] 8Z͖P^csY 5g دr wLߣ}_na~͂=앟_̋/I;&=ꄇ,fͪr_&Gh갎wB 9aKW*IVsz +.eȪS:! P*2~dY&ꝶf*f$\FT9>kdk`}.[3\sx"B@T(P}dd ӰnUK 4y{n04}_V˄5i]l̮we ?m\MwܨdD"2|fX*WU^8+;]Z:"BL{x£ a񳱱QR" φ7P G8`6{dVt٦umԍDR4.n*;[X*$10߯kZ1+ [uijzC!{OOOH$ 0 |yclmoաoK>dE=Jm X5j5 ijq8Ap\lv T GEݜ>ʪ @WWjd p=$jS==e>:u5ťr,eY^=ϿӇ'y&SX8;9{6&$ y=NEAd\ kqoՃW˧D\yEf3Uvɜ+vTjyn.1!*UZf-&)pLў4 plO?d'TP(Xގ1Vvz~H/5Jύ! HR{ϼgg#?6Ņ[D\!O27rkaZMbnbh/s]ԡ)>v_:Vŕ-܍cFz"t0#?>=t.vdPڎrq<_| :8uhzhL6f餡zYY]w "rc0GhҢl&tskk hg3XXZ4)RóNs{V^ V$C7{Ś IDAT64A?m}:hgQ?nݙ222B*-Pzt.%[jw)>6ssͱZ(lgLMMڦaoZ{~(Hkr_#W"' R|i~"]%(ݫ" XZҙ4v{=߬V*Ĥj>Lu$jOuuJEQ)&XYYQ1ZE,//2ηe9bAxwWv$ϖc| r\ƹa`^X~ gN?~oOS2r,E\_奃Xݡ)"UktwT$DW^<ɧ[\_f7 r"b(b}A6c Te;b(z|.]v쓛]v>\K":}!ns9=Ӽy>zс^׷yq6vdsy׷ds9`rdJ`_/Zt6O(3\bjh#J.N`_Q2<βw~-6Ld<$.` q}ʥn'ٍAf'ɰ./Jd2ET$Op=G.<`n P:{XP*Nj0?`tdd*E,oJX,h]`0@\koɻȓΰi*43kk8nHށb$)* XH/>^16F[P "O=$kkˆ>}cEߧw07<$H].Ad|b*ݩIT˅n' RѺب{h0NY:bw1Bg_T|$IxX.HC8zTk~JtAacǎzhmڟZMtڋEfef;c}^|{Ri4jn֑U}Vw26% {m-QVu0ߖ'׊/ͺo߾1Mq;ޱ̴܏Nxs9]V;7 P$1iX0'uXT*bZnw8(sd;$eIJ,8@T-VWkLQlT H0 YLIb7z*>ĐjQHވ1sG˝m3%^) Sy||7%xfG3n1~l"ULExl66Y"˻Ijv#EBm6֢Ib~œZ` 5O-17GZXBm5DaT*ozU%zA< LS,k;?uT*MXapDz¸N66I$x.R ^JD(X#J˩;6jtFrM\y)2L} u//[;Q©$pV'W9AV&IƠ"@@pi\ODٗJ;Ο;ǚ)arQh-l* ZEvxW{+sf*:MxO?d{?0=E:Q+?<$Ͱl6 P;uDR;1148nTtdJ*eEvp(Z&-yEvlnnkج 7kv٠uF",Dn5L*`JdewgW]j2VbɄ5p/9L߹GwGk9O3T%EC1o$νYMS\l6\n7rE1,mv"^zzIe J#$h139w$SiLO'8y,O$.!AYdqyp(wr\@7PWST:&; f98s_W\CDN8Rp!)5$t:Ngtw#V:u{,:4P @2/fd#Ѻ0Ihk&SePpAׇ N9rX%bH<GJN4J6v&pܨnel#0y"Y NFcw~;Y$Y~}}{N ӖćdTc`ƽJ&i.݃?v &*Uʓj~w_MnԺ>4;18؏,װ; :߯\NV;4SK:f$2tR0,:», X[e3iFR(ӕ JQZvj(;7Iկݽ$[[[-ς^#ƒQ׉?J?W*`,A7lssM{{cs9`%ڟor;eECFfbsU<~ÚwMzNeZ'-rGdbgiLB ]%ZCC zC /r"! iz-wc^`[k311n&|ڌ1H UIͦ6\ T݁ ejDJׇHOo/Ϝ;Å98=AX GP+Ϟ1kwΖ(#GEBdL͓|R, `gfF+t9Xei;F}lD`H`07|J;D~p@\bi's,&d5v.޽Ld&\L>_& FRerd lx] "=q%EeTpG]~/nb'Oxbn +6xI lYm,rMkb; HHytzR~oٜbv|tsV7wXY"0<RsZٞ}YVVVD7>G>:[{U, vwv;PqB~>EI-1<(6vV\8?wAedصe s)j`04~wٔNz-T$[fsy=yF"=s9tT*6^|e|,Y&̲cFh:GOw75Ni\HvKajkS/:ARV:ժ}Vq.=6n9o(ֈ?=%*c$>~>5O%=?`6Mv3iZuIxNFn4b6{@3a{PEjt1 &m7{$M껰J:glFxWiIk~` q PLxX Pju VAY3`=4;<[F£Q\TYE:,+Dd*Sz[Ʌ ON8ζ9~أYG1$NQ՘;@ j"& |~*R  *̡ٝ`s8K?ɍ rUd,Te&Ñn9:DKK\ ߿;pg3Χ*O.;~\C)K|)y2#ueuNcq{^7C~;4Rxt@48G\r ^a1;/>prw=J,qzz?K̍#x$VɗʸvR<۱$OZyXMr*dA^|(o={SOSzܜ_A OKrwyV#Ha۹'o+tH(H_7Jo3`0:W_~O[fus]T*eJ bo ^EP?b0g396֮"lG,mrr9N ժ7OGvt E_x+|vs @x"&NQR4\NkR)c#FcH }P) .~ Ԯ4Ri;kÙlEWzXd i3OF$K2i^{~y8tbh嚁m kpFϠp8\nmN))bq\B1iL]Y岉f)յ52 Jbapp@r$IE"f FR˯6U>4oZMZQ0X Tkٳ׈Ͳf)$DQsfc\7cILj`;P(l] (d2~˅{&R \*37c uz=X|UbE!m,x~vqEIV()UȲdjd:W*mXS=PA8~K+k< H$Sͦv)MRaiyjJ&v+^P vgݥK*f~aA pM};jrDF M3z<+AVctD=LRoU@l~fwc$=[&P_{ćRdSϥjԕNJ nC|l`yOZRjkL޴jxF£qڪC'<{Fߪv]155lG鋐79w,ul|\aH3 =aZTFm ' zn5nE5zuĉ*.Fcoww˥ˏ)Xv׻[^լެ՗:v)h9O4<ulZ7Z9(]"K~M.Hm-+݅&`ŀI5[| ZFYί}˟}PLr`XA~1WkRT,;]6;h"Ix<]!lN'.O6ō%RM@Nn/,oDc Ƀ-S|]{\-3V4?{b'Lej@) ˼'EfXZYPv9I&ty=DbIpE;|cs,,-#q8X,rH$`m}n:ݐ|jfzn:WVW Q2e9,,2X..iU20喤i|A#<` 1t 6Pɉ (6MC.@<80wVgiF^J_XߙQ6jl<4{P]gdEF}rD.;DB~:J"Ǫ.4CPе\.N"mvUTQV,M\FyzdtVƘ;jJk_˅z{zmV'N`wwWD"dGjF0Mhܐ B׊Aݢi+#RQUfgfz C&RL"bfb VE[w|j2(KEzs e#H39>B<$_)EzrgyK]QɏG4ٚ dYT*33=n4`X-U+&Mn_zek|v*&1n0 <ͧvJmmo#I++H$l2m6sI6j 4q_+ ;ɉgϰQ'INJuðɴָvl6k60G(G]ClVUl^Thx&zdókwrh"?Yŋ'O7y귾ſk&}43czzJ׸uvڪV5v8ںņl@Rt*XX.oU@B\ "b ݎX,R9<7b(7*wGKO}D_NcGGg5 _^K6yj\NJmD!H5nx1f@nzM :PZ;ܺu[{[0 }/|_MV )Y_w ^Zt^{=yDKHcۂ׃nјaAu_k\ӡE7H'@(TE:ߢIGtt£c{UC8~V&gQxjVK $'b\<.R Aaw8m6&''.R I.dD>5Ρi󱰹KχdD'x}Ɔ869'˻}v;il Qp~$ ;I /Upt+ wG&έmz5-n.,nO!Ke +Er4].nD$$%oF*| ?͍Ifj ̅;ˤs%<;BK<57,剦E'O1M,e/pŭ]NrCtpoe8h-<.UַcĒi6S9nG7ܑl?SsS>yIgr 6oK/^ jёf_q/R*D<>*]_ե_N?qM}3"_[ M._7L5YkELbY1bnǖ.O_SKȧ͍[w(W*?zD2i㳲 lDM@|{kk7k]j:lЋ6W+f£ņfvs!$Ivy)+za@}*LhYy'ܬ?_YhDьR7bVFόolazڧik7(;;;4k:"i`>Ql3UxCPs7;&R +$)H2Ԏx"I__T I'|@Y%q\ml'xWI&SH5 * \ :)LEQCxKԜfB˵n ƦǤu{u,%zAίp?P3"qt8<\) igeZ~gcRvx$׵7$?rSv%=43T}><, Ja&6|e["xG4@nV"f4]| 7vj~絳|opK|̜"RyEB.N@Fi1=Ã~'elOo?å uIy޻vō]^?wR&lLmrvn711n"V,3<1;͕;l(P+Q& /`vl R|HIR%bsg0L"fy}A?_ꗸx3#\z[8v2;8/>u(UIbjl/|W^y]&G_Zc0@RU.ڈtf}sXZ.:a"nN'D"usq"H-`&)IRKV>sXfp8}|^ srӚ,6r!m.BH8P*vv6]]~-͟JU?+6'R`QU4#T$D*ff.>$Q*W(J eumC7?q~?RJ'X]['fCg4]5 %Μ9%P3::JPhcBǞE\|.f/_<*jTQz vS*847G4cjrRG\iK_=սaYtԘd.[G+£lq'G;h#iS£S- ҆U4Mi1@k1KzͱYk&sS! ϩѠ Ԛ>Roo|t:tb8p`x<ūO8o#4}zrBn_[_oɌ+u 䇦O[qT*l6'؏r9rh:r9̮;~H|?%ᱏ1J$ }ك-Z3MaѰ!MwHɲܠ &޴h$< $) .6dADmx<> J IGt8r'J&Ǚa0ҍ`sM N" 6Y^:1M4W3g!cXrqiB̿ߊS,|qotXv6q$f,A,a+?7DA湙xz$i +3y޻zr\=.ޠ7CD7#˳Hq2>uN(+.x|<?I*sO߼{pnet.-R;8d\yǭUဏgN;X*sdf"O:΃>UIbmsMPP F-1mcccM)#p(iM֙233c-a% Xi<* rM6nw٩Ec,H)E.=zᡁy@p`)o<^_hRxy+rL:t@t*_m/jJo{uw> i}S"RNr?ϸ"X7qȵn]fEAm C*KkEXCYVRP,AЊ%]ŵMdKxF'6p388diFs&nNe"ONo{6c(~J (rbqQ>4 PTjWY9m>5hje–{鄜R&C|8j%}Ok!`pp1`|xxL6R Yfjj:[TY^^Yg #jwp +++քGk"<%8O$>ܻS+ǰ3ȇ4gϜacs$VQAb!oZ1b$<\mfbwUp&N/yE}N6/]p艶\j}o-.^#crr矷 n i'vuutt[)Kj }dt(˱$ӣ|>l6P$#|*!wVy L'qm|zn6viN HS(UIJ߼O*!Oﭐgy [c+;tt?xLWNO>} | Oeq7s86ϝ8zxrf [qwT%~ϲ`,f+"ɱb?soXَ#Ĺ>2;7OfXZ.BJwqMd#)>KDîT5K5TB\fk{(TUȨZ% ӭ@9v;;渡Fz#zwqM7ƭj|KޞN'ǏZjbt'_"7ImVLQP:4իԊ}?bɈȈ̬BSּsDW߽ך+e\r8] *a~ry"{Ъ/ ^bx@¡-sN5yx:<зVh͐Ƈ~hp絤gx [1ʆ3OĭR׾5:4^xmSNWYqcMzC{>+ Qu<ƭ#yXV\.W;vϭ)O*խ 5~O(U $ /ID =XZ8 hV@@TA:0{h \ C}Vꨰ'FL+ƣzw TC(*r ΢;d:]N  $pg}({?|z2 \.ra{gCjp:g9iAw J$j" +,AjbbI2VmZY X*YM=jQaT+lnMoYP8صs+@ˍdS7j'gt8zD2QlnngTX"(t6r f}=H%;]ZWLK_w:yT/ܬ!ʍa˥.B%`mg%h&Ǒ/ۃ\Owi 9mP8rp8)@9@89‚ C,S)Y0\]wM%A"-C0+v^jjp8 t(yd(3p UEQFF HO$,=n *Uݕ} H/grgCQ;!Wb~\ .# %0?7rH(d ^E$HEYp\\ɺJ_ID$,*4 ǥʶWvߴ.N'DA wU*D"-(imի Ey]LrA4S\Ng-ABn .qi[Ո0TW_OVҒWIcD|X%E[08Glo9FlWjEEL"ul$ :Vz}.ˎIl4'aUQՎG;MvyXV3 ejk{ts8Φh܁]i#yL&xmI$ּ$6 }^aY44YϑTx^0؉)yt:50$$ pp_\jGZ$I,QQZ(Q 4U={q}~<$c[T$Q(Zt YA%uwh[5%}urC'O`eeax \ OM-Bs z7oc/Isxxn|n2NLAGAJ ~|QqiC=A mv B><4;|t$f{ bm/[)\b5#XO1AT~LF00CpS\ۊ#scaQwvS B{.zp}#! uQxpq87޽vK_?<~e4J^yAF/F`9]c4#C& L Q2ַb*&q*%(T8zxo}xd/%KB\EJ#b dEtG#(zݘ^{.a%%dr`qc!ܵ!p:HT*CJ%xNt:-C>VQ4g  Q( ]MvxhRQ'D)Y&5fQ? ;ҧ_nO.m>-ѥE$IAZUsϽnZ@sP,ivfJ4{FvBA)Bi\fO @r*h"X,8j a"QT5=g6EE%p8r24/~~$wv+vѣhlB^o+e-EPe===+UٜeRp*i8 "!J땻hA?XVA8LNѪpB%\~ >|JK/|bpellmrh!20n^O *qtidJy!q[!%hؿQ4 PzII b$ДP1ݵm-cۃ"D{rwx$)^_Z\sheɟ si)RS"9J2A[N\驮Μ9][:s 64Z?ffeN61b[M'Cƾmeu@3YLux}VV;UV)7u;NپCmS52rY˶B+|ezgP(FE'4RdCvV?mnv٬ܙLg N7tCTky^A 8^1f-:ѣ֎i=ao<<(:"n нi1/իk4' l*:?m:9h; IlktB <'q6NK:u҂@1ΫM_)a 4'v~=-wK.kZZKk;J܂o|X'sUGCȐhڏu:tN8]2}ARG+VEXA9PgDA,A*WBTKO>՝ҁNEZ޸z|BB΍r`5ů?ra C]9Hl NOֱۗp;D o Wa(f*Hn< e-Qq7+."ɠVtbF1=ԇ3q33簑."_q=F0܋_]G"S$%?ԏ'LXυ* X'@PFZp?xM|ٳT3#wg븼|N-n࣫kx𭗟;ş-xN96X%1wh2bcg|>R"-O>7o೟x?}(,c+&'OM A0H,bj| lmmkǟL#*4b$C-\kzv k:vC'Zj2?٥RSi[IsLץrym0@ٰyKo"B!+wZCR}`Xgg@9(Kqdiq_$Ix,/ p-,!͡ZOo/cF(Wy=pp:(:MArAQ(u4V+ $I)"5~I" B +.PCK%./uK4{]c"VD" /[ =XOˣ}Ь]ȿ>X`Pi>;ѵ̚(J͟ms(CQyXR^@dâCktRhICBU+o~pbGNy͉k< y4,jk93!ISOZv)KtQx< '7wttU\( /=v UN Vw3 Iz#rcǰ`v 'c'|Nх[ xq'1؊ac/&(Kx"Jx=Hf xyU5/`b| -?x0~EC_ Fka>cXJS|s8LG,Xrtf4Iy^Uݵ8?H4*$ m-EQ&lI38ݨVre{a,\N³̡ZJ`~W洹RL<Zrz*ǎyߪF<|xNoJ=b-"V X vc ! !r7:ݕs(~۱\>tv?%_}vsE8$ #ÃE! Zi)p.zBi7T8VꏤA1>6ۥ<+99;x$auܹPNn'vqߏZz4_*ޗ[뮝-,zFXK*h xr3W/ (I2PΙY+ ; z; ̋@7MZjfmQFְHIP(J$y"33rH$*Q9)ط2QOݏXLnWZdZ#zvîG1Tuxou>{=f7̀#?h@\6߂UԺ d<$*Մ t| %PZo%yB* BU8.YXWxL#@ +Te07 "z{06Tx:stWno$D8Eͻȗ* bqrcx MSG5-eP,T"/}%ܸJ I(--ao/!<>p Zq$Q! ([}n3d2&]N SIQx<ֱ!W692)QjI:aw-@y,|}g}yɜj&3!ajj\NjF[vD>o{Av\(@6rSm)Jc?ua^\\@:/=ZҮk-VgG=uhۖ&դqxm< _ޔ3h5|>^o8oٟ ;e66k#%mQ͕ZgΜn,.^f4 d^5Mٰ볙toH",Y0_χ޾^REg4N041GCD56Ep8 H$5iϮvs&'? P iBNc|Z_@0JT`drƄYOgzu`ET(^UOOͮuVvFGKУR4UY%̀^ bj<_ixkˇy4Ъ}B]mmEmNdlljO=յ5Di~%yyx6@1ڌ ϬYܺ"qht8$bm}ݑ0<7ʥ2*2B~Uе*f&@hƭ8(P,cT5xN0,V pj E/[Z% 0 P(-|> k:QzY)$(R"]T*Uɺ8`~E9$DA@"BW8 @ ]$ 4:z*;:BMҚB;NPahIу/\1-~l@Ako lzЌ5ׇ"3iRuzn` H>;}V<_d#t =v C."Z}Je2 c^Zi!㴴R)n1i,U\*kݰ?X[[,'1dž8IAQ \CBMKM;vtmW[<>"8CbտUs5v4-%E.㼚b#sԘt5N&K[vcphrLkxww[0> r"r&Ü#|5ZMڙC(_he0::| W2pvkk/}'uYR R?}WvMyӔ3ڭhf=66f+N}gƣ>"no.\D+փ}PJSh.ǻ:Pa\x^ qtek P$Qwz?o{["u>زVo;'(Ѣãa60Ǜ: .ɬg5!sSDKj,.,Mο}§5kk:jƜȠVKX*cdxHK"lo`ZaDzݚr΀Pu3/[++xxVUGFfm NXKhS.( h_[oaG À!;\F(`XI$8Nx<>pۃD:Z(J `yO?6b p"ETϿ8,&LJrwB÷@@XꍢP,ak7zA:Cྣ uP$'rg}=í( X aePۅ]`c+A+x·HJ:hW@^ | ($ b$)xǖ!"4-'U$QQ$0 ˅>*ak㔎=@PFuW.@=|~?@6`]5ڶO<;wu@GL124hׂkiqU[ņ066nLn=覀x$Lg{#qa(jc#8-I>ԀS԰T9x"x^LŔߍ Dz]N^$rUy0uNմ&% N _鬪tFU}N;3X5}@0sаK>īzk($As doT`XD \nL5x󸹲*w1 CL|l ݄ko.P׷@Q씼u6\E#똟D*+7q$Q*CAB\(~/\,ws%)<_o53=PIC^M8UH[I6is|:VEcYQ$0N YtPzXIU5o֓d1zvεƂVVraϫLa=r!#P^\Y(MHxX{JWĻm_wj0fAPbG[ WJXL-i|:`oEK\TKXRsM\տ۝oH #_I|^[=OŻfy  Rz hXIuMȔih@Tj/p.kt˲h-6KT?Jƽ& `M. Z #òl5k}tvdSx+螕%nO񨿮vǽ%P5b`(c  ((2*F9r(j:J(;"TGj{a=}=7f8޶wDu x;03MfTw] 6]Uu 3 x133T:tBIJe]Z ds.}~<$AYk;Up{|XO~DBf,F H$Q󸾹>>uj;<P.?>Zŕm, b=F4"IJHdQ3Uj(Vi0,W_FDZ?GwNo_$|빇p}+?z2rN ۹ZV?:7o07܍W=?evi$!ͫwXV< I`;ű,a'Ca `}/T^;wFzn2ӉR>Leqw^ obdN#x^C"Ag||絷u9 DO4|Q$Op\1׋XwcB|>z7l"+rPx`\qkKq*<. DA((`9 3Uk(] R4"!?^zˀU! l? XA"F\ xstT.)ZMc8ewvfZ lƿx`Ǥ-]Ts҃ L3}Q$I{|$K<RmbhT{jy=Rbd𪀇oƎV9%h~b 3Oa7k Vl*#fhPYoĆ,yAڜC(iHhl`ZBFhN~_o/ZU ܚSI"낰Xz$b|0X77j̥J;lAݳT*Mzq8@nkIPayD ZMp8kd/BXB._( iͯ Ad aX_|Sr&$%)r:H%P$Sǰ߃( -Ѵ Bp,"͆A 4Wҗ=]Z'qM{ (Fpvֹk_];HZz`= \!Hprrbdg$gJ  R5tͭfUmJΆއ_mUe`%H辡y =#IMe(n xXPȶ=\,-:Wj2u?55El|9vt0|V]Sv W1$AvXg/QV[,;&LNNR^#C۬rNV202VhkzB㾒:ZQvR՞Ab 7S)N"4qm-0>6nTl'GwwD=J۲l|x8Pmwt4L8s5܉q5geYiB]9p7bYȯ1SA JY^Н4p8-`ё9 Q.Wnߗo?dCWkX ӓƊVE%S:< ='O6V榽h[Mo"l{;|$Ignv_+Új*;6: oJnlc'~sƆQ~jP=M-mZ{s#HR͟_D i6E$r[.Xq9Th8(I )plN#)Y#A*E__X.\.75Zn5Tr$ ITu16< N޼t ){k; ڎcyrW7<9G޾[[q\YY]cv|(͏ lƒr909mpdEy{:^z,.(LA\F4HXM6" juV .<ހ y[qde ֝-ٓǰNP$a@ 3CHYGZ ]_(+l.sIv{ P(Kƍ7[=lCFh' &k8QD2 Ǎ>. ux yF' rn2XVUU9-}:Y' Pjϋl6_x+kg1 #K2zRA Ѐ1m4~phX}>QE)j@VNVAQHBދ:R$W[:TG/N IDAT. @ҒG,i~ب.ypT ezʶhWy4E 11qb /\ IA"eݍ٩I%Se+gwKA^g040(DP{]EҀˉ (UNAQ$wv1׃J "qFK# <(Bp8@@ġqy֏%Vjժ(DTb @KbV_EBkuD]j P$!ocBcɟnwu3P0d׿V - @(`_Qj>M8 }bVo-Oe"ЇfTX]LDy2.Porx;0`0Ǧ9hn2αP7ro1Z3 | }q@NB9'lT[vc]@>ݲÔ$qNOG;@ӊ].e0C(yj/=ՠ=n VtÊv!w ;8::1N$AF%8kF7ǣl' It7Z5lH$VO.PKU10vZ v}aXiz9m;--U&NFuLn1m3¦<\J p 0b@0xGZqVJK(KaסRk]ɠQ^~^$B-qrcXG_wVDF@^vF35yytl:ٙ(|CS/l5;x䒹ZDmt?0S}koq r6) dsmv:eZ߷^}RϯU2JXː+)P'H |`X==Hpp8זr"DPјBZC_o/R" eUV@0$\n/]!A^* EoW} 2 XI @8=7k[x0,ίn\w;8HU"@#x:^~(.#G&ΣTc]£XOpc; Ȕil89;h#FN/Or] \ 82>Kw)屺CRA4FX+O܏E?#̏z JZBVGw~wvx,6c <Ϟۛzܨ* 菆cx5̎#u჋70?9z|\ Qbaf|b .b˟yuE2 uUp${N.]GT>/?&w Jg$=0L$C|/016D" IT*$% Vɕ>D#x(hN&0ߏJ#NIq-8~L錐tgё*4mF]麒ݭ3nl"/`r&}5O=^{M.Pk4 'Znik_Τ2i*ܩr[jF4*D²6PKz=׺ s_m'EPPu.U~d."&'L&ZCrЃHTL2trH 6ngAA`0@6jϱDJ$ énjc\+8q( `y'|Gcvj=t^mIZÙʕ*-!'/=4l'>$l4M#Π;څl> LON"t`e =7ˉޞnY<ݘFYCQr2$bdDLMNףq{Ryz IRK&2߯Q%6@50-/P<ؘH2 mo$Ed 0R❤ֽ"l~S "gY5P]>'AP>EjHƮ |-i:Nam[T $Ql`ghV4Nhҧq-@zD-.k*X* zu1==cX^-zt:._b ,܋:#r-h0u~\t:pIojtttXj!to{|wuOH?{T_7pEA HX>q{dYc? W+\.LMMi < /t] K$kSn0,V}n6zW@G?칂a8q̜ʍLRp8]r5EA($J8{c{3,dR$HnDCTAH!,?:O`+U@_w7YL"U,%:2,vRY,Ʃ`XJ274ͽ ;6/`v[4|*5*~GWh%$  uy";ߜ_AR+H fZh ql,xZR C#dY~c.l s;X8 Tj5tNQְM>x, pdb{yietG`h:rr>:aw/7oAQpS$uOa;@R3ޏx2'I"a+Indr w!\$I )!w?z}ēY?/b};X\\N|n/!Ow>IX,! t NC \.h{ ɲ<ϥ,mﻧtOw03 +D R )6+q#`P!qi  .޻^43=Uss5MZUχBχ`tdQSgaYpi2h"⢮DR #W)TPAc_03=2-CBi~~46tRXiS@kI:' ^7 L \fP5{@dkEm_\TkmglCM {kx>,/!S:=$ cRB,7|jblllS6 4ni>)f-TcjrnۚĴϹ[ڊK}SўLZX!}n%@~D74,zitY;qu"Hl&χɉq3Y(aHl.A~Ke|[ߡP<|=Ȋ'/_^1=nB`J[^PUq l4wFQ =qbۻaVӥDQKX^C*E2BxoOK(8s$Qc>K%J5($ꦎb \XFn[`uqvM ('5qo81 [ f$%EZOBi Xud{4'8H6]u |4˔CիkN]/ŴM; @m逌>Ou3'=ִMqvmnmlhöWl &'i#uc$ qN HrzHd ?ͭ-?vNŐ:<T:˗.`/UiaTA|$2ci>xeӽ?=|7NmS K̉6k锴~.˲LYרx1AJ3UR\aldϜ£x  /D\UQ/ER쉣ýB n]8,Nr nYDPćaFPD8~J| #}KdPp8L !#I+"zqbzF-G`W͓ fK;<$E:u7O."S͹56xQdS0'ar|#Ł >|}nVF7O/bak\?׍wlJ'fI`zC=`sr'Rn~=.|` ]9nqva'rEQq"mA%p׍GX~O?.ƆP*WQW$DN$'X`^JW/Ƈk7+؉`~zO]DI<څWųPT*X NS!Z j<ϡZ)#JuđZ(/~VVP18Џ`0T*I;y#x P,iU޴C1 8^8XtRIfo(s?޻ot#<(xׯ]n8 UUp)$9ipƓ8zdvi?mL.ÓWh-<]^BR k[Mvׯʛ//>0p\$4DUDixbeY:cf(tw큪cb|bA,Uӊ-~6amԺHTX48ZX^^F*1ٗ @'t ;Gf/zpC壯u!c't4?GUkxgEI[7vI'NEm T=hl@ZXӦk{2ITSG+)MRl5餯ѮCќxx<Vm;n|6`>۷ {{@B]ODُ5:?em5y4ۡ/ءB-B8  à\.C$n=ԏ(Jitu}Ü?wXA+-{g"HSGKǎ23<ܳlZ/^~G:^z6~M;ӓ\|]#M՞މyw\L!Lc`X0,rapp#`Xv*dcHsXAM (U*er#C#eécGP%de_ x7r d3؊Qh'^J.VD>8ORҕ893?80GgE`.E]Q,"l pn~+{ TE߼Aa(V"_qrf .AWo"$U~'CȔq?>7ًDЋ/{bD2~?z}yϜ?}CTE˓i:^{oKC$Q$7GZCV7wUVդbmk^XC._(?DXg0 wvqd~Bן8PЏaU[@2簽XA˟~CA$G,X$4I:\G$,aP241;=Q^V*QŒck{j~H5 FQ,b V x'GP0q]5'L 9|rǼ1 (}_ȝ-iu=t:^|g vaBH2A DQz2vww&owvm}}D~_Qe#Yft-ʎB022lIdYCaE4K7ux$ p l)˲{4C.dN~\BU4xV<v"k:~Nɷ5.UVթZ(ɤ`Sh(KU*)lЁz 'Lk BAx<T5< *WjSdyYG*e_*ҙG073X> GyBmʙi~`8bhRӏU 0ߺ-isX__sN5x&u`(h{m666> u0;;h08 Z9m^\RFTٳ8PϹ0AF%DqR=~dry(*T*U6wChs՚YV059D:GpI8dwMrR%C'>~ʕ ..z|n Iqo3D&X:\#3`rX9¹)~ )w޿bX"DždvwL #2T C%T Y2Ie,ר7 ?*,b:n*E$CЄ6%5ȲdG2^y%zm& ?9e=5{":>{QUN&S`Yb+*׃rlPuSIf411>NixX.A~TL /CIm}+81g%*՚-i$E,Zp;FyKխT RP(d2|USnN1#;0~F!-}Ǐ#n20MG+_`}v[1o@ۊɦ\6K"1P~(ӄ5Bpɫxgn^N ajb d j[)-|\ 7MP*|^HT@U$SKjvj㣨VxAql젿.mn~gPN`Z .7( IH5VeEv; MIG$TŤzy7\JJj'+:|һ4_h_@Z&" JMKP0Z ִ,I0 }ZRp{h83ԁFN=|IAѮStZnZ)%& u[L%ILCC<>j#vH,‰VIzG=#ZֶCOOh~Ҿ{w;T׊i(U-@ p7{"TG x9֮)ngk_i5t5s~"'o']:(ڝ&a|Ӭ׌͟ghI6oS S9pPüџ6u68(>Je`o 0߻]Kѽ8/iOn9|[n󅇤Pk5 ;G}NФHӨkٺv8CZ+T]}ȲB CE a(*gK>L(bWJd<0E`Y?`|ph=A+) ff7Vfp5<5Shuj^(xhp`peS5U\6T8-f+倾1ۋXDºrcp2*1 64PIRWR<.?CB1bx[:'*Q"x;W YXR9TyX }}MBr 6j-=@\6"ߋjjvѝ;F#_.Xlg G2‘E(ܤya<`vfQFAIP.QZYdYӝ7_~v87?i^ à^-421jgw׶wр}_O|EL1YϜMPgNF$3QIoZ D?sҴc(!lu&Cx82LjA i?`)1'(n>guBQ,B]jCZTp3uL-әI{N wLLz ı`k/{\FM4f=JQ.S0Dvqi$uIB._CL!_("x;u sQ,P,0>6r(q!Hbkg${CA>x- ^"#R)DnMaK>0 tArsktv6c"D >.x(Uk1sʧkZsV&\n(Sq ZA||˅|ϫj4S6Zm0,UQ[38 0 (PZt | $? LKMMZTbIvuCiߛrr\si"NxݳisXS_=33Ӕ ՅM}]L3\ZA3@=Q-Y|>}hh(Z+5Wm}ECtbPXٟ. {=0a:풓N-5il{ёFam`=lsKi w@q}BF2Y]zqB!Ȳ(!n[SQKu@X*xj͠$D6e!5N@6t?1g z^¯7z>vlW+û,r[iOk://;O3LwF~hT* 87-:uà""8Ϝ>L6h4jJ4_^իD*A[njEQ4 /~ >0?;uW#CFxj's{=1NT]\W!P4jCM]Oܾ݆ppRfWdL}> P*+O\B8< gg S sCx.0,Q5 (TjPU=}=HKȖj84h:|P(`QJ3:Haqj}XՓKcscS@T\_}=چ,qX pß.겂!̏koǯx b/kG{yW&~K?=}  x nn2"TՍ?ϟw^( 0*BAyQwށӺN h]y{@jk?!ƴHj&P,P(qQqΝ=Agn[c E2 =Gf}Z&ĜXSUQKLOM̩݋'@ZCT,}dB4T@azrlviq3%A˕ ]?i$)?ݽ=*A,~YOEj' \6cFF{dµ9tΓU˲TMkTfu`f_'F9)iŇ:zͶ[?o;C_UU',:N_gP(ڨ>u*n?u(*}nݢ7|6v(pИ$h a7X@A_?zN1ݷǫexuIa>cc \CVl*dYB  `$>U+3w~11} "!3x;Fv3@yG iuCvqKlI"Vm=k\c%&S:b'ڍVN0M \tt G~^ TרZ9[C;yeժ\TMG뒥Z0,G[A4 r<b?&V x*cKJꊂ$c;ƣ(:XC\F2S 'PӃT Ye <7$sEo|,1D$S/a7#afЇX܆-Dp3;+ކb|k{؏p27EF1R,,zk_~ r{}(QdsxV<=᫯<?@o qepA, He{<ƒ88|^7ϿǗM$+Tow>Ļ+QPUr48CC<9 %G*2xQi6R qdrY( Uu{P(40u{{P#C|d'BsZeWA & N!˲AɆv`O5xC0\36: χbD-U*2 V 9xG8EQpyD݅?t٬|>G6*9k1ZPT, jDKU }-xecPdٚ"'O?\ELUIY-HPlᝆBI #ڲjK`15*!=FPW'IO8i]zu!".PmsW$+TUE\1]$I,$$$B DI2ů"^~拯kDQĩGyR  E f& 8#Cv"(]B&C \SU"F^X':At{(,!{QDK^Y(ܲ@9D|wXV"̥nqt7u *Rz,,cppdǎln" P,㕗^ģM"Jꢈ1HF#jImt{:b74a51pD81]n m%m= JKЀ>]UjVl5h[StEQ@@ Ŷ X# ..u+А[ھBP [ޑ5@CڎN۴v2=MJVB߁bCܬDtO t > p.seE3.z{,bOM0ۜ%yo^(b#!l"dIuxVC?n7* <(:apex O߾m͡u j?wZ:!耐++k[b'5"nΞEUЕmGk]ck@ȦB.aBU^/:e$MJDq .q|ҍVms %ͪboӴlf 5~O4A&TQ% L[XC]!.QK8Hz016JP*Z'GO(t6` #K8H bzj ׃>$sE !)VjX SХ,ʸzz^ki,B E#p7+g.@,GW^?H{Xkd cjG' L PKϞ^!n˱/\~* e IDATF4_}<(/}n{" / =G&:n=(:r|n.P*ʥ*~x,~ (W G屽_y~9?L"L#_*7.ᛯB| lGOf~s؋p~ Wϝ7#SiB071Bi#8h~A?>g7ށKp!W(cr|n`ucCCOOm|Ock8^',b h# J%<| ǟ&dmzj-FBA,Ҋb0c^G:(&N@>\L./-ڨ%Uz:޺%bѠ3;v{p зFARudGrYp*A𘚜ɓ'(ߪ5iio51lƆ UB [%''\AI, {Nq}uVdjH, BYߟ xggMt m*E"gg[0ڑFMcxTT:EQ4:.^V\X {߳q8ԦdE,~yR3 P,itej^zME3Y#CR,+(+(ia~ÏJh._@$z$^qGphd* B|^ F$}>H ׋d*qr9ȲrbhE22< ZMN6t{9q Ţ̠12'h(*7%3*x?UmbvjC 3lzm@`Q(j;\gOdYO~X\G. f2ZG _qu$POZO#YܼNL &aot6VxbS7'rLJtNJ]G3: R߇XX^v\|AVk@;ّ::}Q_YmnhMJ -XJe$ɪ!Df&#iu3їܻwEϫS4ɻ2tsTAhŠ_Q>u ad_u< U* RD1 B:LkRWlĖ߇]{ә&;0 TB088`.4D.N~ cߣуk~yhl֬3[,F-W*jU>t?O%㈢+uIF 0|XBpgPqPQTHO#R^rPTr Uܾ}[ۭ[6V`'EǖޏW0z[6x" C3Cm?&<R!2Mɡ !l ` Тc~GatEѥLo~[W ;tĉZ9x\ɑugnbk!Tm,_\nޤԡ dPEOo/\ 2PTuE(!e(Je`frD䊂D:BY!(u]v4q @d\QH eȲy; )P8:B8Z$ձ4և,m _,!/br]:R_/yFQ(PT[ۻ@,D\Ʊ#؋XE,/C%ܺq 66!A<(šN_X4hnSSXãueܺq ;` ੩"UJKg2^hs7D1tZ N2%+bݿ~\J!dz}0}x7~ɜ, ku A,Fi C0?;XԵ?23MA8icMa~ {|fty>.ݧ1n>t t{;Šk%l>k9Kqk?OΎ㹆nv˃c1BiIo{Al(J7,BQQJbkmD Nokׅ .v> c5CbƠyθf[CUGJ+W\oz=zmkW՝@ۨj>6rbhN1wf- aXT"VQd$Ѽ$CUC o4:3YV@=棪pi"B-nbn@ Pa-rLUʘ:?Cۇ=n>u-/pBP|\gA;j5!Lh蛮[_:ڬA ` E;i_ N7Gqus&j&P@U;@ǏC"7~n<Μ>X 'ѺoIJ%:Fnj-S@C%c)*Íe-źucG[AN^SxD*jd[ZAϽh#@K% 'N8`z3ɠrۋ^%5:3?aTDfGEc8Q.(I{&zzB8u$"(`H<:Ȉw>ԌDM(W/_6 !#? j';ADWK.~Κ? X"VL{Fþx?q,{Ȋ/^| {Z֬iV׭ޡ]):6;n:{C'~JDOk®mũ>Ÿ|h=PrOMxThNod~1:K]h;_,Vrm  ' źݬ$ `" DZw#`/r Ǎ]TdY60H$`YFx<߇7Nǧw}SNt*zBT*N'maE{V5m!Z7];%ܡeDlNA1t`XF3²dN14"u X vv!T*dƹ5ZT0P"Մ$,5' [D %?j[H8̉[k[,Fc}}}-=t?ZZXX0ǎ1@V yxםpy7^wZ\LWW î.OEJLU%w4n<:C{S9j9W4oNS@(6[]`ϡT@Qiq @Pbrbe#cl>eJ2xyHRݠ6u M/& *63bz&,wUXG;S2nN<ѽ`BJ{g۷/}?șz666رqsbss#G>ڂ.nbIɘYZe#\>?zJS2zpp*^Ok79~h ;48蠭0VprFо󙞞x>\.`eey;esn)um\xֶ鿴r'*J11Q@T뀑YN>aX֪!Zpv M~{G&8T$>J1<8O{E G&y~dkTFV sz '1R)!/"HczC}A8(&G0 (<A&FzF_!,nad+[;zb?/19 |)!  f24zz4N;v=>|g# c?z򃝷vEn2ѱ{k߾G~9@O}7~WqBQK :>D&us66?}@0xz::6ا+E,u ,î ,:[[ZuKo9F4>/@JҎ';wSfM5A;ɛo,-[ 3;cX_j]$I2AכJCn:,Z ɉ "шIvwaCĞ~3M3_?ȠǡLA4Z 9[ºWwSST *o' >r@0>uM3hwz"|`@Ev6}Gw0MWtX(Ǒ|~&''e L]P*TRcݧk2f0<?y&NSo*(N"'">rFXGgavjS!!SQUv NMh̎?[/TYQnup2ݽ2Efj2O;hrNTA$9>Y%(7l-r7 t&y"Zrl|*'I"˛=4MVdcI7}~XDjl*k5"~9?ݍ?T2{#q\+K{E?M^'፟}, Ez˂`jW ]<V@˲oydrx<#pl~ƔoˤE+TkASs\Kޡ9p2oFΣW/eDz(Pg{M0('FÔ+;[O )OV{ 8~n'f":{`RkvSm_ xt>EQZl}$xx^H&]ABnnY˗<<>zi=cH$asܠGPxxOVE,CU6K#SRJ7 ȪuT VG(,;:Ǐ/dɉqV? ruQ Gbsk^c{70xZp2 -_#W.єju&Fd2 FG|i QplnEyݛ86~gzr}&}>>4ݠXSit8ylP,hǧ93?xC~kEZD!n[%35:­{̌r|fŹ)~QSc#HH!/}ҙːNgxeַwj(}>*ͯIPbr| s+UR)޽yA((aQ`,bk/ǽm:rD,NK9w LQxֶHnZMt@D%n//ڜѲlz,ΰtwL$P,""HjEQ֪=_wA[TRuj %] H{mډֶ)v:O:t.=l)ӹ@ttCؿz)B$8'ŇJʥ}/t}V.Yp$I"h˗8Xgk;WM13=F?WJdp`<12Gxq{X42Ž}mb||r-SoC;<(vϡCfQlwZux/ 9EVezuXkVt'ISe|u&!MO!RPTՑN%t:Y'H ɓr djjl.l!s{nڔ%-jXRJ6>aYoi2CIKVQJF{+tW$£׮I.cvf)fa"gx(|YcͦM4 AX<~LDZ.}Rvw~xBAA:R8W!^ >\x˗/qRM,J9:If|wKP,BǰLkFsͅB !թ졡!lۮ"64rHvJBmr(&Spb [6 K#!jN{ӻ#Zm"g ST4uݑ94E6v< {:yK9rrbh!|u It$rꚮ;y DH$>hJNf㪦311Aev: %5O>Fjdq r0 f򖕘ϒu/έgPS-݊l|$KJWp'ߑI v/Ǒ}8l& |?866Q@"p]*?=N>um8Ⱥz=Ang޾s{۽{ gﯼyxۈyfu -E\ C^?9<%} }j9f@EQv3|̷^ɦpfܣS% Zw=mUQ$l)A!0::$I!ΞZ>䖊D1b8xq--ۣhQ22>LL\#-Vx|f@XFiTF$4qVw2|k{Qn43y_~?y..~Q0R{;(/?\k8K.33>BUVIƹ`U3̕4_\X~=^߼wXHݝ,Ev>93G*[O-g.Sϗ895‡w7995^ mkOԅ,0p '?zbJL s04n1 0˰5ɺNz'W( +0=nlsge^jBD8tlD_«Y^˔5fAlzbϽˡP,pk|"{t+:Fniaȵllw?omx>۞ovn'prT D0" Ӕm&Wzj lV Q \k_wW;YKgϐM`՗_bk{yovaRc1TUqX`N41EmM8ͦ̇}F K%NCwKSE"-W=w;n@ey;zDBaܐ|~ǫ##>IbnvL$5EV'3H߇a *А4MΟ;w{ ,=>z]zʮ7g}>V! sf Egpx (JV$ʚ\㨒ȃ37@8Biۅ1Aw5>#:.I=T'( ZyOzJWYqy9qaKJNMHƢlfjT2h[\xTj ~GT2YT >sZ~7_p,XcsǏ-sQ>c4[M3(B0p:HS&bg떙be,s~Paا<둱P-`ux؀LLLcnnp8T(VS# %8Jt[>4˰3#˲ejt0;vf|G2EpU@CT9$(*A VM~2P_BO訲? jʞg>0ߑp}&o~?9#~5Țc=F&9K8y=ees}8{{"TL;#v x)w%fda=ZgM7,C[D$=StGǁǼ|t !7]vrr1>~It:o ^8.Ѽ2ۏsKpr7?0 |> M3cc٣_(Bb(u zu 8wCA\K/qފyb T:&B' qni]:`NișywKEH4DGTA DrE(ʱy2_y=Xchh1QX*3>6F$AuðB&Y:sڴ\pyL#˲bIaE.lᖴ[D層;R(,w'|) :@A{333H|/1/e@c`@G<'8Q E=:Tz1<|reG8~I%7?EKW+sw|wS:jo9r?!遙?7`1@xߟM:MCOm[=Q$i4eb) R#HٽѐLLKiX湿0Hbz:GSѸznPlP2WdztƇ_y ʕENyu8K|s\\nH|B:_$ ƍeNLxP8ՇX[[:oK'@sSSm$4ɇN,4xy1qj ^y%DKhzGF"9*q\yoG^[~l)4 -~Z2X~A@GsO uzx#C;ǥy =TU7Ԭұc zvʪcs%KVgP`e280 "CH5tǽ.` a0]*$(wa5ݙwB!Vp<8${2z֝Tpήso1`Q)8fFT*UG.5MRs,>yviGb,H$P}vh)Y#~i F{_civ_JN0H$0=a594Mgnv3={+~Б`(Jϓ G(Wk:H<!~DPrF0X6BjAXbjr-Q$+/y(4;NuhhfSh0Jl,b [[DfGK,u:Iy..E"3F6Oc@У߆PT \nS"8Jg#t. k,/&T~AA^nώc]g{{:yzd'tL!ï|akܵl?Hg{~2=?xXY>A4nEWf1FShRT.]8O&WRY(R(W%/ E!Hrjr C)7L68:BTS||$GCQij:CC vsE|㣼p"ܣ/VH&b(n~N"cI~*{ykOW7ﳲez$Z:K,gr8F!.cRX$HUnh+u~ .'ygyXa;WTx5 ~|=>癳gf8N/T50t޸y&/죴Zd %Oq#ұ)׶$!39>m~+/'Iplj,WIg\>sM|'2?5ACJz?K^Gn8s|fEX+妥139J<AQGr4V^N/S.{ TE!+Z}ΞZOr y$ 7\9` `M\UQ%b~Ri)*FnLO͐+ש܂4p@U5J<JG\?1z.|h4)< Q5wɉI󳳔*eL駞Vh=ȰYD-%wl6N?׏[:1Kl6] &ӓf0;3֦75v7Kgr`x,FS6%M}1c؀stgO=$[[νzϰ6PzsWZ}X]]33+v CJXqKZ0vdrZ"Y<4116j ~Fh*EZu$ : RS:1My晧=Fg! [RBzL֙/fsJJ/|U'aFS)hrBjdZP>TB$K%fjzg|s:Hd<FSkFz2p*GotG %uLP{ibG i Yqà@G'u 1Qyw̒$8`u;z̍/d<$35<5UPGa<창s} vbpZv-`%ϝ0]*}~Eg}¾ג$ =ARD+=)kվOmsmQ4=ICN)0w*l yNa+ f]æ̢1Q [56BurȁsXWj>_h]a|({+9f#=eŹ pbqbB29D1t҅ ܻP]~)j`y@A$Ir/|evvIS,WMnpl~zA\ |q;{~ R7ݳDY+֭W34gϜaoo0N )h̴['H|(ccD*V׎}_[$X#7^ =)?Smc><p'cc;`t|uP ?'055AGG)j59f @J_['r%wx0o"I> R4STr O^ƭ{L111F(F7 W˄"a?x=FQ4_bcϔ B+ %>"P[U16%.-duX+pzf x5"As^L|{<~focb8N"* %uJy_~ӗIFÌ%c~{\86i5wm#NN D~N3^ߡX9=;hN&A\?oqcy< Yft(^I4i6[`(Tpq>uo~yorIw lD!2Zc+(cdySg\P.Wi5[M35b/2?3%VՍ-$+ Ӕ[$-]<$fK&o^Ganfl>ϓ\e}sP0HK՘c?[@>TGːb6 ןx| S6e&R.O̔G44Dt@'P1tӌ. R,֯wɘ@6a7~;; 667i4dкp;&n3;5i~w KuutGg]1GǾwv*Z  ;nDtǒsP,if0~kn}-,Ix|agX< sϴ.q] / +<ӎ:r&;]:sGh"j9R Kh39n BN2{k ɾוa !rP4f^Lz/IDo%0L"74ays0JP8LC6YRY=3Ӕ+fgYUUNJ8ת 144 ш%ewd2ܵ7Cs|&hpfMuEU4 It. 6%Ԟ#O@nf 31>s ._P,A-Of8]QZ-p!.Gv頴dp iKxa]q#5b릷MtE:]V#j:'N`w?KZAʥ󌍦FH1:2L.T*!If"DQ@ill@FW7 ̺oSSS;B&$Y;"reխ񹓧{099ٻ0.x c!(8Zd_`yE^jrA*7bopu\ +ku>5`_s 2>d᠄ߥ%lGl˥ܝ ɧQ殺ٱ:ȎJkzC=n{k8Ծ?Qdz:=`qP9w)9_k;} džn=h8](+,:5 ~Y=~+(Haȵ$uX̉ .XVqh)<::jQ^e1Yvv[X`x(n:fpT|FRTUDI\'(e'X,h,<>EfbfjD"ѐ}U{:yUU([CI$Qr\{~cw37dJvNU*y27H )˔J%sM!VtNl88dׁիebwMӜ?'oU J0OTBQnXwA h=飀>kHU6q3d2{R6Opp"F>|{,hd|WY<'Y؉ч/1["R@$0E/Ht:o 8 DbX,νLOPk4Q5J]fbbJ]&L/c~n-^|Q8f<_!xq^_Mg³g63c %/EOaPat$ H>?>vKIxۅ =vM7GM7wyI޾Ӝ'GX/ ӼEMgftP4ͿB*]JZ[{(H<›w95be7霚Jqllb;k ¼sg±)6Z?|FR' R(WGI3F@' LEL.O:T{ G/?yf}+||zX4LV'W( YsܺBZGi)\%_,#`0=1.|x,BCn*hbp"FZ׸yB@TsOѭeTEcg/C_|>L^4VɱQF|HjdZαY* ZK'a|bbtfȩ+}l8&ԫ~7" |Ͼ<7?E(Q(J&u}𞍊xsw̠G\`C-hnLa}8fAF LGg4F#-S(6]\r>`J3IfG{C".gsX:{4b:gwGs~Dܽ{B=Wq%fgMAfKs?v1HWl9Uϕ˗MM#pZ=E(z޾7u7ded4+% QU| JR% Iraժ3O<ҺF`EP(HrIIX.' *`SN" 8@}6VDKJ-)UbJg)j{暑Hd[[jdH$L>gnvruQ11>n:h''Mj[3$?WlfwoKx6?,]czڦҥyXG%D_P8̩SX^YC:~^ΔL |ģDI"/ryՔ7C3n1#?AkQTCp Ozɐ&;vskc 4 ,VL6hTtKfONNxl6 6ܑܻdw%/Lƶ`u2(RLcF-P3;iQDpϞNPǎ{Y5/dYvmTM73hhD0Klm"I͖D U՝yckjƽLNLZEQ=sđg"T5ZQrӔT'?%_(·39>F@t (2=5S'X]ߤR  s3T5w1`Џ@*5B\q4Z,y,EJ*'O,ȍg˫ ZA}8p}k}j]FqʕCNxApŸ7\?y-89Zc 4fF/soq4CdttWx?n@mvaf|A]C7Ů"|>vѹ޳H1n;8}tBѫ3ck?[o݅ y뭷=yD.)d4zĂdq=oktAEC~/*zBh*T u4C@ ZKOCjxȪFRgvjt dKuɕBA4໼y>8p.BDJ&;Ig,Ls?'WyT`b8%W?GCxsjCF%fGW,oe&yW@`r$ ԛ ^<ɟ{8Fm '+y?y(apvf EUYg'_&#YŚK ѨIwCƓQ>s$#0ܾ\YGnedrl392^O8@l@" S(%/ XܡR#^)66wi6[\Y:fl>Ib/'p"bpYO !AR0;BG/?zd:(RXg閞5bQcѭeb(rSFQ5298Zx4n:_zkdseDtVg||LģW%4ug_N%laFD@Gni֫hjZL)%CCi)(aOnvت }6X[r/Kܾ+fqG~"-e_:n/sI} ,?`zjJj&u(KNK{IrO{?=3[$hIqwuJZ)* IDAT E쏻 E.tXV ݭ6Kji$77muU~|YzKDz|}yg`Km6p%cDSG/ zsezjKj|'cB!G^|o㨔˞syܼy2>7-{M;w !$:20-IH{XVd~aRTqX칊CX_'f6a&dYh)+E9ϯVw|\a1 `0x>emϞ^i`vfY2ܻܧ'jyQ,j u R<_,+-x>Q@#CI91OjeJ) pV$~pk 1f,*dϱ3h i@|C_:l.`0rd2E$,CΞTb6l6^j,Db35=TrIޑ4utt QBpVϰ|7v3Dbk| ,QD:- i!.,;x rih뗜G/Rjq[=}#@6@Q8vq|"z oi#8s#ܵ@ : e2γqvlfsIJC( T :)ܠ..p2T8¾kqH@0Mp"gB0099rBrƹYe+&o xPnmmYUqA4tD<sz4݀} |E#4cy%y8 HnsL@$Y0J*b(t|[;{~.O?ZȲYQ/>R~t 4C;0 LON ;@(@; qIUt6 .:vPK_z w⢣ PbOfG=-R-nBIKf.tn(>u }g?J!$ib9B/Bo]4g1Mz̀Q._V[keV! _'q}gfq6gyl$ޖx8G3qғ sp'>C,t:pA?`p }uYS$OC 2 h[Ip{tx ,qU,|8PyE pP CV5$qT"I`[fF-~59'?g`v|lRgB(1eepqdyEt hJIpu0?=A_]pAa VCEPdkOX4EAQT8TE4J $t ]u}꼄d*IVQ 2xQ RUfR0eQJf (~" ޠqB1WTTІ?GAUD|WH6<V@_ LU)i($@QxacsӚj2uD"N~6G\ywQ,(*ɍ-ŰZt) _kx)ഥOz׵+;{{Ml,O.6^oOuA#8$WVewN9—-w ܱLȡ1Vsjޖ{<Ͻ_w_$Ӟf(qVѶ0 n}n͉A4*9xP INӱb,Y&'tC!^xۻc1>LD,bR9Xnǹϑuݾn~ߑ4 t P @SUR)WvFdY(LYYy4X<f( $YF0@)npёa04<3[&. O:[At1luI" xf} ZIiv1vyt: ڳElMwil`p1khxvIZa֬ߥiLd'd`s33 "v9w񋏮#{PCRETAZEq|~B?MUk*x,@4z8N8זD$a8k&ՔðG@k8hb~jdfgf;u.Y4PViEU:MC)|X?|{ta~SsY#?X꺳-pi1ENǤqx0c,t^`0/uuD\l[K4M(٧Mf/q/G8vO.l%Kګ4L,xϽY]rG xw<) FFG=Qv ~dm[#մfN܆߇kva'OD);b-_F%loo7u`ylю,.uXUӝn#_ ~$RZ R 4ML HSE EӠPE|@f?P@|] l4Mcg/H$`P4ؗ'<=9lPTP.W_A ykZR4ꒊ%#2ZBcHRH$yOG/ܵZ 7?V^`u"P<8w,R$۰AlEM=Z>cgg[[h :p^A#ʪtD 庈!$cQT 'ǐ+x@thM,*S)覉Dۅ &b3il &Ad4Ѿ4]~ndŚ @}AY7?)JUOD" /T/]w_ǍmxggFѽuÈ}0 Wﮠ/h9wtMp:QЗΣu[݄(I ._=XJ(Fi \ C 0 >jdj~Í;`e}[LcmsO;bUQ q2;Ē[5u]( 4J2TMC0@ ;O> UUQ~?11l)eSH'xSI11>\ <MA"AN!ʵUp0@a*4tԪ4@S&a:u~?RbWY _-l%2$AxyD"aܼ}篶{d%6m|ױQEbaR>tbidxl(/4*A MD>G8"mn1lnm# Z=itlj2n$ncp~Sg=Vk{\w7 X[o]o]{(x㸆_ӧN5H Ea{P$q%4Yóv&5nW琒r:t)[508###T*85wb* vbjѼu$f+V4]fP:~=&/@ӌOfX Z H8L\?bͽnIYUUN#%98aAD4DQ$Ɖ}DB|=d[j4B"RsWEf07=@ -Rܦ:#ڮi=xzP`7a{8<.zow}ʤz;kK ho6 `:4kY얔QGx|8|>hMq_{nkkk(X\\j":h~JzWv5./NljKXq 0-ݝH+> k̹d:޺ **q w\i?q(śOnMN7/Dv<F޹yh,Ccy7L_8?,CX?^:;ng^8??{;Ϝ= g+/]V# ڽG(WkaYL CP0QU CSU,L8%t"dY/@ct60B i%'ޣ&**w3CTB4Dw80u >N+2MDZ #`gwPHi:~?Z \AQ4**ַv;; EVch)6jr+)%h|}t]^" !ki"F-k>?w^:x~:~_xl/:E~ԡjΞ9}N>*E d+ksY^;V`fE+r[ӧ&Go_ x=:>IV0lMk^d1 K\Q"$i$ySXsuu)~?)6[̓FQHi 9TU^V+ą[SPy(=EP80Z{,% Àn2ERMӘk.[ɋKCp褚d`(׼E,;X,jA1G8KQģ!UTW*&  F2@Xt];C;JBe .D]Cu@q^B!p,z\x4 "a*ZT[Nb: GvƣnϳPKNtCz1qˬ"1a|T'] `@Ecanßq(Wk4>q EA%HS,> ({7G$clyB^wh C~.G.Ą㤳rb||a@P`)Jx Ԏ0W X뿎zqx{Zg+5hO}K<>u>tInmf""8yr,өKȔR&{֑I_ [k!X5 y_#>^ֿ $,樂Ž pǭ8]414<;gX}N\ҋ/XfcΙ^wÖYjz)B̜d?AR(IHbf+_zꢢ07GVT"^w$ F;5vkkOiW>:wA"IMPW$o''%Z?o_ؾ6:F,?6(n c]QYyme<|O?wvZ~w(4꫎A};4a_xVQox "/4qΞ=||ϩi4ċnP# c|O! `TC"AE(0 IDATEJf^9=>|h EG7Wpzb*;Ϟ^ZC<p2+T`ir w6sEA^K* ~zseG:FX>[ϞV}QNN±)<8?{}T5T:V6w@fs(KĠ*vv셓Hǣ݇"INas7WއבGęIWɛ>gD4IkvRe248EK?X$IeQ֗_ 2LCMSEH DQ@,F?>2QN%@4VVQUq/"a<2V@]q1lXqxʓKo1(4 JTMe0ЗDUrvq F 5 4U,-ð=dQȒE :7)OĪKoƧ7̕$޽2oܼ噃&L{RU!. Je ҩ1JB^noN]l)V%:˄yVFumm驩fOr-뫛Ns9d= 1w` P`YmJhT{NXTW`9at_OѺVelUE`Nیv }cccΘRJ:,Lt:Rdf9 %˖S/ck{ǹ&G<+ɥuLO~6NP.]5F3f 6i:~76[Ѿxぺ@g׍="8dxDQP(h"Db)Ɛ$ X-9 .)Lql=s,TU(l8m8cbiīV-?<ݳVRmRŧa1\F5H'$SiD,=mߏd* I!aR  ^!J YٓKb nޅ (U*0 ,C!{P'C4Gop]N)n .0M` #2u tΙ}X*ݻt5L0A]p˴-.e8H8 E{·;G<-tzQwa^WM}xx 6s)ST}#.#ۼ}X\0A- eZjn)f Y6mY21YP~j6u4!'w"4AO찯G2D$w$5˄P &* GZ{<)VP]80:+;ss4M;|O\eǛ~Χytcd_ig>4M 1wcfjBHw!-(+ޑ/Sa{7AK@%LO!_(?ӗ.X*kiVadx,A\vuO]z[ۄ^_C1 {?>@k*Hvbv-此Zk,Yj,iA7`dqZηA?xԘ?򼞟o+MgJG>zPtY{SP`k~}"8̀aݟA =s xtG'M2-oȭT9:k}R2VWSP4#2U.Fh5#;uϭ};(aG%6tcK-iC (M'm>j fxgp*4XDYF2C+UDffWF"'71;:d4\ ~A = ȖsXH?.=A3LFRQL'qfr[qnH71`0/m_8t443 Q8>>:>obv(rgF J b $EiR/?wnq>^k+`YyjudU|h#Wǿ`j0BKC$ule󈇃x9MXV7w >rnppxϝO~!¡ dQ W_2<>X8/܉cC:0t|g8mn._GGXD<A$iD,pȏR]S nݽ!8>O4::j>&!JeY1g>_p0矽-4[k7>uf,K`Y[;X%p~߾ax̩bj;gIP ?+L^g- uyr'Z|rAQH|M8?js;BaGچ?>~NK $ <!#\g%x^;;;ݮ9WqF:&ݤ]>17@ p @/=N>cǀ(J-˒KAP87\@dhё!\Z_#L@,*Ǒ.As'i•:XC]їN.(U.TE!anz\: ' [cPpv9]8vf8t:yGd (FUCq˗-?C<+\{Wf!C{pSoANc@ۀs:a' iŶbH^&5wD$ '9kZ(a?8ڶBӏ}E~rr|`(ǡʖbp+daRl5f -}e pl])K[ 6 `=^#xdl6 b,V, LDOY7Fqsy>_OYB.\E(~ ӣ(V$=u?~ϜY} QE$aM&HH/U&/O} 5A4xĹ1|h +܉i*| t77UlJLy#}X0!Wqav 뫻`h'SwװyPfOLaï>XAMT03܇l _r }I\_Kg-'Ps,>|G/KO O>>#8o$*5a|B Cn^hHYH JB>aAZZD. nΟZWocYPX<},~_c&.; 8w\bw/m34UU12؏1B?Mm67PXT AϚEI.FdXDg-X㎬ӍМ[&v߷vn#APG 9o~ C *'}cʕ;GH#-MDwC,^gBU5  @DTk5 !X,A,``h|70Yi)J%fƤ7+{z߇Ǚk896u=]X,fi ð@ E044AR `BrG D0cL$0;A eHG`skއi867mu+, ME$F:DZEsb8hŨ&9v]/Ƨ7i91D8 |Ӡ*3 ](rut# f%ZʝV} -[^%cv<122C I{MYyˑ2PQp^G ={I; ym^ɜ(skHI٤[b׳ꥃʕ+mZqq2::^344H ao<Q"HXWղ?`pdIH"@2l-tQ'}w?'^088RVn=1::j7\,k` xع,i5Cwjn4A,贮=#~vgwx4p,񝂷8ּFw !C!ZtUA!+*t9jKǰX,IV`:V7 I25".I8x&!!s 7f`5O|,K:UĴ1tg=:(±8sQ'2 pHu7 _[LwQE mO&'tksd((SQHw t]?ZE~ffR1lֳX&eD.\ı7n|^@cc(+7I}|i8E'o`xPÌt e>11u\igiW1?vLj-vڑjn9 ityX l}?h A(sBP]`A>(F(a~8u 4hb48` \7?@8 (@1ne ** :x>l4U!2nnG=uk;֛/(!Ѹrf{ 4ME\9w\\y<3(KT f& Cڈ)*U}_$|6wji% MG4"i !Z 9t0'ß}(n0U蚆ŅYE<\&!4~˫kX$ack Y&BDAK:20 `t,͎Xȃ4кE# @*> lٙ)9`# W gg}%KO8X63M/gڮ{#0~r\Sځ-F0?\.vwI}:.?]$q[8~][6,k[{z*kXml\|σݒPu4%:P&&}gE7* Nmyt Br$=-4D2hC]LBg3(B2t;zͦi:RKut@9I Qqytt uA$Z2+vuD1W(B<C<Te3SLj~h*UeЍ6RwbRVe2L4Jb"Hc]:imhAtVxxyVʽ.DA3,*: D D4&v!L'c7MQxF(_ $IM4EdLp,9<@YLHZrbM,XsXgN{|~٣X#]-U-uh&4]ktkRmF~Kw(04MX`hWLyrE]>/C$Aa9Eu<t=^Θlb0f%̾ydnn-C鳀G甫`}Gځk)heh%lYRX$9cLzu,tRNZb-{{e-B7Ѽ1e(6 Q1tqNBw{nr^՟!ڒT4 #`B0 D0LT 46w`&F%dsy gNakk Rё5M [DAQP`:b(2HgF$"xAi9 &:hggpȲRD,#`|FoIV B<~?qО>X@v[H=A_Q=FGFPUqIrSHj;g(_p!0;o];[h֜Jeiܹs@'5/=esx{?^qý=IS b4-ei5K9Ϫ~`j hbo&Ţ{bI^h][KYhQ48AHʹF7m|a9ۀmXRWpdwz D1):LX](`9h2t44E17;bC IDATx<0166bQO2,8B3 P~E44X8 :^8FɵL%P$|poˀc9e4M!~E|p5Iůzbecpy >:R~zg˻8;= EUqlZ;2>3CIs{ ᧏e'Ζkx&qk#H0 c7/D&`5SO?@$f Pld x |,$<>KSty3ǷH{dNM:A112VC9AZ070=>H(QDAll/?Ӌ OcT kRTF>_p8;{[݉EOӗ/a{g*VP7ݝ]_wp˒"ZIs:E 9[[m n}vX$Yo$)a݌}}+ou?Ys;-/{Mp79/)h/YK݊aA{#2b{l\Sq'Iip>teEA1YvRf9EѮSRe=eش %GQbFѝJ Z2;ᰟ!;x g ~?j<27 (`~n|C 0L|C#i8hu_A>H%\rN$(6€e9]F,ebYt*evo_K/xx`ll}ܝ]-I7 4~?8zۘs&ٿMw+|`X# CQID:dEHH$bTj8:035l6Z,K19>rqı~Ľg$y&|i˛~xfvbA, I4$ANw *!QҝPIJ   ==ӾߗYUY= 27*LVgyy$\[G¯2nB,meID`X&;}źԱW¡ILsλ7RC2oa0E_y01t?bn LZfzjymA^owiV>cq 0k27; ut!c'8:{˹FSSSx553 ˡyh{۠ڋf0AMO EN)xi͵#L,+=XY),R,8ôhWe#C5Z-C2dIv?C^s1VK3?*˲LhX؄( !9i8}jz%k;} Ci}?0vkt1y'=3e&''P-WvvdΦ*ށN(GKM4Nv/s6}:}v"cvvj' x}5ꪇ]l g~vxȡ[:~gRڹ!ΰPvj׼K|DDPDE6zn8x~mzlx4M$Si @ѤG>/ ô`-b 4^MUEւ,8qtKp,*t˦Fںt"O=LnNᐌfXk"_m`y;4_z;ȍa=WP*"GCpk=\N΢Pk"\_8:޸㰞-cajJ[9膉G7.k'fgop" ( SP5 bz(rD$0((T먷4LfҸ` &3 \9>XHƻw!c~+5HC4FRxhJ4 2x P*ZAye1?=\!(J8Ew^hKWF Ig8jXko.>@Ve[84;5ؖ3 hmf( ByC2TVl6\uUQ Ih4۲E^{ȃMMwYZtC*.j L]E<EGlb !P[(L &,`nBl\p;=L(I:Wo43O፷~amj(JB0ta elh(ƳLOpoE SdW ukn13)_Eܾs^3>>d8R\U9d=M:]qKk:Kt%"^E%<9\/60 z}}ZOxأ8N0Fpḛ'!LCBTUcJaDB8,K> E$ZD"T2j=RD2 T+(+4!tfM}}<, (~"FVTxL$;cNn棓10ʣuJeUq홧&A(Ѩ3MfF`{ZIZU*17;t:-8~ \@D"!(:mi>kǛ^akGC^ <>̀΃`Ν%&p>rh#6&Tuh).ҩ:5Uu P50B\F._n6˴ C<\-ٙITkULR)(yfhR8gLXwp g`;l e8(J, w񀤖f{t@={cN|`"L8ҹ}s!-rz6~鳾DXgәlbcsΚ qn^OG`bb{{Y8q|= !3li_S]);GFPYo`kV߂~@&1~ 2 }IP{^Nz\ǫW= lTk5(Ag AQ,0 $q3t{Qw![G3.dg;g 5795G>އE]v=iQ󬽗yH6=aZ+5RTY4-cQ PRvR"DGVVVڝi2ZUkT>dsڶU+i:\<]$ "4M!@Xrs8 k:uTlˢ6-ת,|į\ ٶ$3IoΤA#`n>LJL$: MKL+X^]…EzNH+0;'۷*G>ժ]p%jvt\A53tsxW5!Kx8^£o6~}ݙk/^n!x(GJN$JzD3$#=đ-hD vxZ 1-d ehbzj J NDfhh B7 -؄iR(y "/j! (U0m(5vgby{CX '092?%,me¹c#0- WOo?^V Ef84AS5NLnjaYÓWW? ͍be|ϝ9Xp BV7nsGET-D% o[7_R aI|h?hjU?([Ľ\96nb+_76reX#Lİ/! 3~G&lSXұYX\D&XHD*Fo`o0@R+ j'̂*²|6B?g-PU^Í[wJđcH&[T\x;{CP5"Obk$$Va{g<#݃(8dRShgkhS ]*n%#J h4 ]S(-T+p(P)-4`$kZ*xb65"KtF$ 7>v}WH;h&&QYAsװpՉꨤR{ӧ؞ $QJֹ!STx ,HΝM~z͔m^iL0\ho䬽-Eq |EQsho0=гmD=vz\\wsk+`j~~򅂫 2t]kX#PbU DA0X a0Lȡ4]bjZeVK0- #lhxDcQ)1`&3DFX9B@7LXM+Uh{4FX̝{ccH$(ޡaPC8h<#(0tIP.ˤmSt&<ıt#a rwÉm7w 2&t]G2/쾚\|FT.KK-VT5XIZ j* p5orx~B]^/U\Ŷ|`V ^0 Bg;wg.v;xޠ|9!d<B%ö|ѹG:. Oڷ Mb(@>4* N8A{@@l?j'_{^TX?{]O~}{^vzq5M{~b3=~#<i9kk/4ͷFU4=p%)ct{'$GAaεt: &2lSK.=^}RbٿI[,TE&3E]qe9rͦ_oUP.d.'mx:~8zd{EbXA\' /\6B g(nl@D]݆(JPMJ'&M얪XܤZ sN%Pu=4AW?\b@5M#!bq+nCll*K" XΣPS!, 87;yf/c-[NSx۷9qk.m+0?w??›`XVZSIFIEa@CkgwXa*HiL #Xnpf~ <@:ŵ x]u5 !LBT% j Ydsy7 Ə~0!3.", V!ѨR@xK% gh4`:4U\ţu_wa:^zt&dYBRup(/)滯6y/o:M-: V-0-x4aJ%VaQc2`@ b[M)шjHECi2 Jw沽;(Q4 /<<j%\c%3t[ K~]ɟ>NCQ@kqGg߭>pR7̶ /,Hr,lA8@WQP,q<j >+Ir^W :qj8ȡjs/Awq(V/X6Ο=w* ؖt:3'OC.ewpwvwiŮ@zVO t3(N9i&iYTf &= %%XLUA;dIBXD*DRpfpؕO#O$PUZ)ױh;dYƽ}i*It j|&~`_$tK16ۙ=NBĶ"ÌCB<,H%x凨9@<ǣ VE6_ \B C8$VxV@{2u AE<Ӵۑ@EN9ځTI&leu(jm}PCLzv<BQZzvXнh)-I܊t-ZaV"܉p|O{vyy:8=)mK^y"^Ms>w!t~A~/,OXA=ܿ\n6[X\z@y|UOq:CUk:s]@W`{֧0bp_K~̶ Knv|[! FcH,\Azـޤ*tKoNkKh%19dnw[!:(AptSW.Ra6JL eQ7135jIA `u X c#Xŧ/bmQM0l]4u MFpe:ƭmK汲[jXXcvl\_l c`iՖL;o{>\E7ƽ5-⳧qb2|i nnca*"6̏  2NN\oVpj5>2N[wVCwo0Bt<簶[p*<.n\zwmcvx#Q]ewV7 I865 4qhb;^<}a &9C_"w031vWt)އ0- 843|Y|x&lB,eTHxXzPHB2Gf(\Q` gc]'HtU=Xx-Z-:m+uj:7Mo[jǎ T*0t,AUA_{hnxb`;pCSؿilԡ-122J۲9ġy~,/x_:#J>;{$չ|SQT*~{jbz=0!yJ IR_ך/R/K}+X#מmKxxT*oگ?^62SWq}4-`nvRӡ!3m0bzj v]k|MUסKc>0,IHgtm U7ۙɈLiوPuchpnBC8u(rJ@Of0>6|4hm<#BQT$bܹ{pi@NXsbA$@*=*j3!dE cjjcnK場&%XfMѸmc," ?>S2CK|p) 2!R`ad D֪@' CR]w䔬 c_&]7ztDNx< E籉}z &=lxR£볟.(x0?z݀)/9x_G5Jazz smwW"b~XI=B,{D^_8^=|h1+/au:s;s]zlC\,ʕ2&@ڄ ]%O{rm8WP7Q7!"Jb(vw K.TE(%a+RBh! Cup@Dᙫ<;mh0 bzjBX&ae! ^o@9J%HcfzR=[hs$Z<N}:?Oy$:>Gx77n;8JMUg_j7Ih3yX@Ûv<ɩj}̾>'}o_[c;o0j' @߉#穪_ ܽ;pՒۧ\[ȕWǎ+ 0X n]t7BgFLފbsbcVJZL`89ZsQqem"Ļ!{Wni%0r"t#1,<`+G(Bf_(סƇx"R\p$T"$q?q-H& %|K̎O^{CP .ѩQ %(Tp?@<V0Lq.o/a-WƱaXp,[o.Cx<)KgH"fwoc$k8hepT CG$^6lc#T{UQUؖ-C27 #! #34JVh;&ˣQ QT]i <fۖ\uv #EiѨ2M˲13=T*%u4mY` NP_6,[9||' miAV/.=UC0V_.|޵{rbZ JÙ LMm jA۷}UƊ5{k9t&+< kמ}8q+$cc$Ñy/׿ڸr2> <5=zOW<|Oalm:s~)9ԏ9Bٙi(0)#Javf $HӨT*8Wa83 MPg<]]c#UP-VLS3rWܻ+ K/\>Mq1lEⶶN++r؏4ĢJ%Z9w^| j.Иh5Tja{Ƣ$Inh'V8$ӎ`6ѱ t}7pa&G;, #݄XmۈiIW!)ߡq5ŧG`M'8z݄:dΝ@EOUgs=4 귲O䌇Bc?s/ۓgv}MIS_2޽˗/>1A8Hɩ)=깑$wHAB8ajR. DҰlGtðH8AS?://pl b 0A%f1HHij6aYp 3(oxAǣ(j(T%C h,\ [w>^optn pwV6 xp-aPµ7# qo}ࣇ8wt)-T &>i㋗O⇷4Óx-ar0BB]A]Q/^k?@4$)"w'?cz gOA7  p-Tr>wʵw xC,̌ƿ_f#^.{1IF [*&&~|{p6x(UL²Lf3N@hAVGRPcpUUq/.#V! BBX(XyT2NeaCp@AuD"!$qTU<}"ʥ_ǷLOW DQ4[M\xhb $BU ᑶEW./٠9%qӧg]mTe8@o4u [m pWد:9 ` m{5ɉI EOLiYnZpT?CQhEJ|`!`cnvoͦKx] ug[3$IP{_q4|~mۈE@LPTtSp*I; S޻# d 6ѣ ѩv?޶m?D yׁǭ$URA4E4s`Ŕ$ALӂ(ʨiAuZDD8B\ +^`&R$*,b 3>6jӢ@xW ,EcQ\²)jk6[ fgf`&8h6T(z?X~J\Tkk4$Z] 6&SlJxx N9sQDImۮ/(P$Ē$q?;w0;3 hl=]\t+h68vRN*-LNL>k<$mh6i&dww=$$P!Hf ly~K]dG&;c ^#aY8q ۻ9LMP*#%T5LM`mc{]8@4|t&X,&DRxgsJP6H~U`@\q} eY:3@FG`۽(㴣laff 4x{,4uHLA : 4U빮~zu㣝.@-F-!! T8w W3(+8|2 ˇ^8~ˉ8>= kgcg+ 5obb>(!{ف#e0I1\Cԇ{p8pV1űNJ ˶Q( tnߗ6jP"/鱟G%1f#IK냒?9HBtǑH |#$rxPs3S(JG#Ge8wvvv4<&Xቡ뾽?$˨+# APVP,@@X,lhz '(CR(zDO\KAo>."%vtajm^A}ow~C9=(Qkn=J|-;`==|lG Y+SpfGp<! ģx2C4gϞŇw{?sg_zwV0 7w1@lleX\H og1aie[PxCWב1aeuѐD7`ۆ, P-,=xTJFsO]bD< 0efR)FTӪff 0󯾂cBpi|x&IIԀSl&"ܻVR?U,?\, rl˄an}w;G/&E#L>;nnf{,zBy`B5?簹E%<`1Xw D#aZAH3!Ϛc  %zcc \{%J~^ۿ s~ !JtVz?v͇2~S4Z-kd=bg=:bٙJ$ݎ>^ԛ؉kFW\飣#7TwipҪ>2>PߌB4w.yDŽ[Qy@gf=eWYA;1^<+1;;ˢpY P5#9XVJY{-9s Bp@e"?wy!-EA8D/HR7ljt("8w RLA*pHD=BjEnP rP|lFB:d2PUƝτ*$r*Us}7tq$@uZ[*k,Kxh Q&B%b(V^G7o@N:mL!AXޘ-J8juRI$so@Α?wO^kі"G˃pf\"J3(U*eF%ݒ8fpwq-vT+֚@LlXN`k{CP&e&$&h`&^܋xh12GKia|l0M "3pnwMӑNwC@._`x-TkUwVcl|ć.uɪ'|a.>i}伝|gg %zp^>"ɠ\.?>@{dϮCw Fs/pe-A-K.B*Bُ8(!v}k ާ7~:JxdoO2zO~xi}\@>{GASz3(ejvQZf ?rS={488waf% 9`ч>m~@TyhZfZ l;;h6MW `(tfÕ\+DVv{pC(m M]c##ժAj)H$ܢ2z"²,$q>7&%r{nזi|* e%=Hxp',lve Z֤'PE\U]vν*Ryt ZiQMo@ӌ8wdtZΞ'"N:E:+=/L&qe?>L]I4_7xT҄0 OZ?aBڷ굣}(WlafxVW~bs;@qm,T>3sM8;oqDa hb ",@3mDcqu44 j 4Z (LcI$ D#Q D8=C2r%HEqtvA*Vwr0 A2G:E2$?L _CRGR`iի'0`y;˶Qk*LF$TZ*얪 Gseu( iKϜ"~pG|[{61Io~Gwq w!󯽂=D9-D$CI %|lyҋ829wVE,ol6 ]:N!qw"`}sF6x1eLZCy_ ] : "5@0tChIi;oW`mBc:EA"m۳ 3`(F2Cf!I".!=hpjE{?%='< m" 0 זc;19ŌS:pKx9ncBHg)6l |7e~/ A&r &P(仒^+9$:䚽^H±\L[-jnoc{ t]4ʕ ;VEu9}Mv`q*޳ [4N5 C6?7w'{]g,֭eL>h8G9hwNq4b H:@CFl.YAp[0 js3DZh6EmCDy\D,ʣuj+Йq mDQ4[*B!Y >1!{4Bͥy^0/OlPssڻI96MaӁ̮N@6Kt8idw>AD1躎D"4l6!JR}%_e4MȡF`p Ä* "Ë/\#hg^F._sT]FtWhlDxq8:+zZ<}KUU㴲}<*H:B#ٯ G9CH_OWI_~#I'&3:~0W1/Eё#Gz܈g ,9 |S7\vyZ'+ l:zAupG$6֡L;dsTE\"p W!}>[,4~܅kQVt"ųnBߑ,JWi\.S?SmO%k54uF,TUC8r{uDHfd;)e=||Jϻė0MZ&:{lȸ}6{` s3(Kn혳;n+@Lx8!ú0y6׉S&;Y`g:zM oj L^pI;[&TuPiEohhez%yVёJJ>?AzՐ2wf6I`Kx\p;k\ֺoٗxgϞpKKkdjַ: Z'<7>o/|n"'i HL`qmٽ|mVq (JP+z!=l(k1,0Ep@A`i 9H CC㘝D4fC\40U"ǣ=TMԚ*"068ut"v%hG簺 pky cCXc8ux /]Z]k_ ͏CxWD,nvj2seG8:EL &q{uɰ qsmE/~. %"x{߅m[-VptbJU4!CB2x2UeILb0vgM#;+sL[(,*YlKl[kKjjyFH,&3a' ;x3VI6wTar3~_x{̛";$2.ss˳>!㫈H"$õATX ?z޽rW{a_?QG"H#(W8{8Bͅ(q:)D!XLC1v J7C0 \ux,L[%It$8b~v$9l9@QUXCZű !;pچo޾U  h˪#y⷟q絩$8z׌1-D"(kύH2:[u{i@4]]jY#<;zN \A5o4@q9@̖zac >=CMOOy< MtwuXtw- Uo'uø&?7zJeQSq_!ILN,zU3Ȳ4Q0(ʘ8:EEH%pLrC4 ""6άk! "άU̦2`rc/<Dox睄t⢗d=C=sbKyBGڊ~oǟl~EQAJz IL&wx!$hH$,D/ڍ[Ȍ&;$<;' L-HI$FQ6zz(sxn7>Lpqd2kJ)`|T*46rťą=>!<{ud$e"Ïop} D?~79>f1$ "S lCSU&me8sXXfG<*<#7R$8LMN"^ASU(t;Є0 7b{BmnA6{ ? kW!ss{.u?/g4!=~ۿ׮}&+WP,yeIO4PS(` a:;3 H&Nw n5֛xlwyNrD\ NG>[8D%y_{ ;;;}Y h'Ov*k};IO?vb!ޤ]w]]x AA'brhK` A}b0Y:`*}L#<ZxnKlHg :8A( T˄aqȖ*/biqS0,@$MDQ+u&m&2i|7?R z_e,d5JxE7ԑEP7ѐ55 %j8oo#_k֒aXGD~  c~q|vtu*-tuwqNNvׇ5-bz_ :~q\ԏxÐ󰄇!r_^s>0~.?@;W6;7z~_wXwn.(:l # +>._*WE\%gojwA ˆAėpEKKK=qD&(t9vw!Z;$uÇ0;x ^vs10;3}g}D"=u}EK1:~x$qu~#|B p~O#\/³χ80|\R60?Yn#nCn,CxHCr2,~w[%;+Y^qx^q;gpppbYh4E)ibT*ẸK͹wU_pk'~6~^|w|$Ign"/P£ 0װ7~چ?,5yv'{ IDATAI!OL. bc 4MeD-'tby+61Z3?zMF9MlYkL~ݺ-G^Ae?u~N&Cvp$I{LG"LLL ԃKnF%>*=׿ e& ,PVTVm:>  $9EpE^ p<@h(08^jn]_X&\)M<9 D#HPo)xKy* ga`qfgWNo~zP$$ e<># %kP 7_z"S#8,V+{6G1azt3XHH+gÛ80R #["=:;[HEC8*W/Xh,__Gwpw{QhjGt]qcIL$HD8E0Nb,CXeX d e+5x~ G"i۷)mA۲'?Llm# "BD 5j, ! 8 BdUs< &U-#+dEE:=T2BT*<35b? pHR7u Pa^KppSj6iuK fgA/ܻ(yo2wv1|Vܾ@SO`{1v c*]=yXݝx sV+ϤW4v`0-5YfFt4+jHe-}տ[9 .@gp !Wx_& 91yxZ͑< Qm.99_pD333@4鬰B$h2|іj>N?ų?8eR" 0LG~Z4i:Q PүPB%,.݇E f >yNϡ\!b~;20!TM믾]< Ne H8'ב p!P~(n?oŃAf*P_u]ww+V;iOHEQ,4,vO/͔2'N"OnCXg](;*>P-žWyYjyb%'1OS1f<>e_|3Lndquu###VT+ct]Qwl\Iۃ>t!EY:%/6 +0X&`!x0 y ''qd h:$"L¡hA _(h8ȕ-KϢ\o!`<8'@AuSI-dU<n*~k>S3v1GxXi@7 $4U -Eé1\trwGCXϟ_~p զ ~tk aOnb4r ޸r ,OnOu'wa3PT ?LJ95KhLp o zB X-5?Z338Pk42r~wv"28.`L̎8Wă=Xϭ>6wpx9B8"ϡ\ u ܆(y/>~S-0 Gǎɛ ~-b :!\bvm MOqC(r@6 8Ee'$IܺuSS{>5R%&nl=r 88}׼Jp<5"V'ȩ98#iHpɉI^G#ЂHRP "4JJRSTh˪c&#i*DAq. >>S 4-] KϡR0- ,G0s(*8?¡0F1eKWP,VUY[>80r=cajröw091yAURIFxX# ]k!z@K|E<骣A8꒻Vxw:Kd|3m>w>Kx^| I+t6YS\/r⼮νΧӧQ.W I ܉kA"1h9qk5~2=^~%9%O ѷ{c7=C2>`7htD]r?RN@ uݧBGz<5;Ht =J:JeN?x7j$3dv:3IJl~KN;y˪ iKe_ A @@è[AaT-LOP"+UA^Zq$_U#(FʌҳJ;?~27\z`oTME3 xx'wQmx"޿rhC m| >vr%'bK!FTEIb7(O_{4Z#DĐ-Uj˨7[x{ G9<_ +`YU;/<އAHQo41IJU*57FģC3<>={ǹ",`Y;<Ɲat]?D.egj0u蚆R Ӵ Xp}Ik&CLo\N lWPKEQѝ93?;5tkPs8PJ˲PV| >tz\e(I֩:884LǏY0@-WUUn*,xF"ٞSSh6Nմ*(E"Y_w@HX>|CŽ~ff?fmVfj_owg`aLztH2Eu3W#8Z8xKop?f]qYTIs_؇jHRPX?!&:r>r[}SǠꂒ$G kF%amrj9TWY0\0-RH$~ VO/X:5T*O24**0?PCnID\<l=ƹuӣ`w]~GGCRU!xǮzkH&M&>* c P5 o{F"yLS Yp]#0vw(h4uTpЉ( 1>h8nn69k1-e[Q{UP3_woq[3hzUhƪPE0/[7zL0ӡ%]iB%bbbF x&'іe3A(2:N7I@TH ӓ8p9ga8w [LڑDd2 1Xl0L T~8iW AQU ֫h6[z" ڲl;D[x"Nt0,MhQ\P0/6߸$`:y rx1!NLyYrvu`xt!3*DiQ>?l+US] >OMMl>5&v.% $Ǡaa~<-//Ӯ÷=iK.?k;]qgN0_A%cf,t"ZK<~|s n4nnCx+ lV4B#DCbaKȖkXLci*!a&nRkPcn\r2..1 7Z@UTj TkuĂ|/`f,Ahĵ;[0y(`*B6_eIέ,"8\>b/\[w4?Jё8fwxg !(Ic*m*':)xazt )exױ.1 8fCרi@2&@H$M r_DJD Ɍ1yn R=~Fll#Zqx`~BJP#3Z1\ŝ$HGQ70& Cg~)D2޽7KOb$R$&Z‘3fh6L&{V~H(Xߵj5z<6A%/9??!}|Ԓюy7ǣ;Ͼx|ٷ/iѣGp$Ix|R * )}c>Ft0Libjjor3wG Cb`:{x H`&43VVf恂@W8v@]&ف`5xp݋" ά`.on" h(qaޠV\Gǎ-!|}||LDހ(xؑdL_xoCu\8wb e憇Z[]Rl2rBǀ& }p34 ,3o(!17z%ĝƒwqL:zIO-j4-Z-(¿h8zd$0} VwitVO>Ojq\yH(Z`stt^ß촻,6A8%:AGiDFf x WEB 5\yGGD[Ӳzz B Xu9!5`&xA@@ L¥+@x,J<-Px݂a0\&s4n޽ChLVilP2<آoC]4J^޻#pŖH&sL|,αv2-d~ADzcԖk4'SSSp]:=b˲WJ${⌃ᓰaɋ'}~O/1>KDLΐ8{dќ4\!jժe=22\m]Uutk>dc5%nwE k콑U:% gZN8Dž<#-k'[&?Z[]anxpgC3mU:l4'hC홄f~r IDATzr}۷t'baz鮘qb7hss/J !s`:`]"h<瀗\f+5!!8&j :?, TŠB0X|mE(P60;;h Hc8w qh:ⳘȤp.&Ҹs\I膉tmYEDD@0 -+֛0 $ޔ1XCDm4e)hRbj4չ "~H_~'S! =%a Wj!$ }HJe(|:n=>" _eO7w\{lq.^hf a4L"!8TUA`j,L o8w~G7#Ԥzpn}^OljdNE|% 9n X!(:{Jwl  <y+ ͎/ 9[sj1撈E OG?s}nEJ ߵsmiX,2qr+55E͡t]?9M-nh2l`UbZt Urw:¡U՜8ۿ G9rjSĸ0Zn?h)N\uVw蘦Xԑs󎢇74pK,r;6wsuA~VO$FXh,曌8666~Or(t p7A SϽ"71ET}YCgڏ9v?^(6!fI;2!OYamfZ"BN_Mx!xA " HF qxanf+Kȕ똟F$h*gVހ\YbOaG ]F( 3dM:[t6hw=z9jP(JO2mڝn\FQ4pvPc3ZOwk>Rt ޖIb  AjEB Ha ؕ@E+aǹ<&lpC^\$8;0 (8(!@фjBE}EHAZ@=w%<"*vva3%]V,ģ01518f&Pb k)Q*G'Whf}0id2 E@,Ynqyt)G=8,!y7~ RTcIw:8yC}BVEͿL;wվ jOwAJ =쵬lh\>Lϸׅ ;Ej'"u"Z?SAq ꊢ]s 6=tSЉu8jr1,C 1V=lu71j?Yڝ^Rg;#=X|e^iWC4G w][βJBU'?BtkI:~ڃq5Jw})~y$^nsQc%mEE "T(oxoroOW}5OFD5!ƙY瑈EW߅( Q(*^|•(U+_}xpFڇUM8O;xfuF5)$>ANa6~x$B[-%G8=56EPV>7,J~r.TM~`yvwXav|X8<. [(w- ٖOnS<3 4hGQp|r f'p#\>z\z3 ejZShXYZ@b$,#LjCn< IX{/dNЮCBq3Ūx`c}z m | UNZ\ݻJJX V _íwX$^Y $LH"{fI&''tuΤd̩vGGGQ.!}1T6VK0 oXCLtn8W^A>'Ĉ@ 03===D̀n0t LwH;TM|VrA f]v%|«[O fIWt mϝ?ZQ=-LPAjgW!:5d8LӤ`>U!J{;n\q6fggQ7011VvtC!ͣP,QGflW ,t@b$f 0 EܽTr TkLb ch4H@QdBA*k<"**k YQ Za 3c' 2MZ'`4MC<sdAoW[nCQ E+|>r h~OcRI\u]VUX||:v٤$ ,d*w ^sH颰)8q?^ H84OB7#ETB\FՂ2H2Mh 5EU(26FF(ːba L`rbz]4:otcvf1Iwpux|xR*Yy&';v|@AܜKM?G #DX'Ξ*x Y'-wB틡pI$[:t>)Bn ?Ie,w/ɳx<ރM0isa< @ނn 6=niO\H^{d281ܝKx_ZZD)m>=EuO4Fh|wiwbo)؉~O3G{< =x,[;zÎp]x;  yx`;G  $4|W9!๎y@w*3,@%>< `C,$N^{o\wb=L;v yHOiޏ0$3G=̧$`ܒI6ᱶzbLJ_p5 3ߗwL\ KKfO:<X~#ܸqč)׭Y73~N A+"Ήss7 Be, {h@V^\/AX1:FK QkcbbmUf84>cQTH##qMDQw\C&4R8̕/Ib(W@TF@aJj16!@(qfV0=6b4naa*x8B/=w?XAPQo(՚U J'cws3WjN'_]H'ȕjuKo;pEL8̗qoJ|$B8$-ˈH"9` EѐI`︀^&$I@\E<K61NBlgcB h9P__qf i"Pqph"IqM; bRX8 CG\qFt*֫_Ĺ3(h6[)j:i98D;\hbc}BsT*=fwp}K0 j͹ǡX.39X#*&)a͍ yҩpFh4cJQdn+O#_(PI ,^@@7ajrHzmYa@%;D%0Cx0L,N8K=>R8&(3S0t E {e2ȤG HN $֝(W*tMS1mn7czrZ0=%VnbUUc$ax%E+ң)΢Z9_f];~ hN> _+U\p{)*(JFXB.G*ք DIF0/x)yǐz1<<\L/=w?YP*W\[\FNbj|$QYB6W@W<>e,݋LHU^{H ?u kJڑ lo@ɮEQ6Udc ꤫,A>;! @MLJsׇNT+nw9e <}#m!uORCTks :QTG>C'*RF=q~F$sx%~s88 :bLcxЮ8'B갠qMepHhgOx0c7 FN%S-6ʦwv6鈨*9˱\,:V< !beh=6nS?Gc!GyV#@ Rm _< /!]ٻF1vIR'8֭}nԚԳKfhپ%%~-lcar2ĉiFL8~$i4ͯK?p\{o35ID>׸Ч/Xf\0nF[Y+H XM۟0C*uh`ю8<^?I0*<^xI׾:.o}]Me `9k[H E112 ǃO.q8lCq#A;>]l9+Un\=;[JdqDY^:N$v01a p/b3X8 7rB>9R^YZvr ˛I|`,aY [#W_Έh>:+D IDAT3GgK>ĩla}s?sXK$!":aOCD>^,'AIHl{E6/ wH&0@:* 22t28 I">V611:bt&Q~UQ0:<DZsO_*0`0l=ܛ. ([0{,Ғiި C%lA]^Y\'!b pxh`b񍫙\.AwV(}bMw*ٌ!ը@ByK_ă [`I*rǣ8@ԓ(TUd\{o(2=3&95lll`wwVhUfd$3Ocum;ɤfk#HXV9Fɒ hH`X,*VrQ΃y<EQqY$wE4A(?66$ ;5yv]ioh63DZGV%DjҸ6. B_cX+/ܸO>[[͉min[#kØFF^hcAӀ_5٭vY.(9~o/fd: FEU~m]k5.OrZ={ibTmQG]fw5c-&zGR=H^="(Kc^uJ.5i]rԄԞXH\{@hȭh4Z(fjau#tCs簝r)s488IB|}}v:A竭Cv?'> !-AҎ?H3XPWs͞ kJ [|C*HOۤK133wr26m hls67 !`EI*z| ?Ucګ^|bhqnWva;81G1 5ipbi8aT<6sx^kkt&#o=@׏sgZ/]'ann޸qjt~Cu{Љhu}1U}kf ~1'2wd BΛHp,7 $==d _UJ \.(* +*b8xQDXF Ʊ#M062 AV!2292KXXK`? I|>gsz<8ytJ˛;XCP6 72ňyDADRA&W>wk"|^~z;JȕijN?|B| )TyEb/L.A*Wc[E .Nˉ$ bq} x*|R Uɣ~_{?>Uj,ayc1_2-+:V*`kм#7 uX9>=ť%{y-8vgHmxgWDbea J'6Y'e,{òިZٙYmIO`k{JrP*ۊeڟn|lqC̀~(ID ^|א kkkP ÙP9VOqJ%#aBthrD.C8Bʣ%MP,"Cm)`Y tu6%N5}UUqSٮrBTc t%,%OJ" 1G﫪`~aH^@ Фu" Iǒ$F+e6ȗ/]D"U,$!gT`Y*GGU(ST099tO^L&u6@T X,$]~.Vث6ƅҒA@9<3jl0@"KeGc1T\IkTX+m eA#0vjyXZ][ plDFxh˴0Yϱj@4[`O F6ͭr 1 ok ԐUk.jnF13sCP%Jt2̞Pe=ђbZ٪R+sv{ B5:fP( {156d: ϋT6LA$PT`ukg"_@%L cbߙG$|po'!xpA@oV6QVyQ ȗܥX5D0E1ŋPE̯mCp~k<;BTgFQy,lX.uCdT*/~=JeD^d% |J _ZÏ>K8{;SH"+σTV^o?DwG3PU߸~ ̅ds82>dAB&C!_@2J>ad]p,J_xs `**  "^<5e͘FxҢ5"z駰ni'fM6RebɈ1fvZUSժĬ<4hCiOVU"888@f 1)d! 8j*Zu{./ I=*δ3 RA #Z;#G_{A {i=iT_Xν(x3XY]5*e$wt1 kqqN,ǡX,QTL"EQ Zq Q2PT>e~(8c#CH3(+t ~ AUU\x{{GC-,CPyJhJPUݝx#`b|kYとFUD~ջ^TpiDYq.zaV5} s۟]]S{8*ښ~|z(px]*~[.y:M?.n'u-fl_w=1|$ò_KlFR_oVj.84fk=i9r >ۘ =&t=n^(ҊX=9a.h `ܪ1>>Aᐣўy|t2L#G`K`>1\.WSBZZ;nǏOh>n~=rĒ َ4]?zbrKKm/h]ιsg'~fsÏ:oK:P=6v_Vź<>(*D" BTsC1,m!c\O=q̭l*HE n/afrVzܘwC$|,DA n >BXƵ gpyB u@*\W1A,&{Le'O'sA&_~l$  +2nί" !aD#}]`w LeS旾"?sq}ꉣ#LJ?xB%RanefփȲW<)X3X?&N B2O_VnAtuDX$Ojz <^&5TD(0x A׃ATՖcG`n}=ٵB:1OoQsޞn$I<`,3GJR|ր]UOo_Ask~X`WG&xlPgkzxj68Ӛp/zHSFuX2>l79y/s8zz縇G9SoOϚEݘ۷>0Fq ܹwߨ*eշц. -H$\h x761:2Ն ֒aqA@ B P*|aM;J9i0'f|\>; ((+ N$w)+*FLBe-|+c} /.:$BQtw FCXܺsx=ԻFã#xE* BE#) >n*Ӥ*`8@&`[TXֽ6`Ĺ)C7!_Г}>ɉܽwj:k91әTFkvO4~Fgz52Q$5F1R$Pb. /<4[%kDe eIt. a9x^p/< Q8ݦNw?2XK vX*cr| +kdn (7^ƟwAXgOⓛwWz<}F(Ȳbs@g4NLνu86[PU#X*Ɵ U.`rR\a5W,76#2hX>q+,@) L!v9Yu|:i0͍Cwqc+NS>U[Djg#xCms8/iX3@v5{*4!~(JB~Pw<Ǽ=%.RQ_97m]il8i!YٶqZwrnfuvtt E-ǖ>UӡyXR{ UNa!J<>?DYaX"`97{ H2z:qlb (+wD@(r;{zvk[{ >2,DA%((`TDQ@w
6ɉ1,,8}bZ5E028NJ3Z6>TEiRgk}Pe w쩣MjpiϓJq 'ĺi/W*9k[__/5?; IDATpJ!kY: P*1;s^ ё}|/UU5bȠ3IVy.[e6]'9ڸmTCd9q EȊP'a\^ n8>}z_%|MM~P,Aeds9C8$2,&' hr?@@&'z^>w<ÀtuwYLu D' $YrJ18b94 {{{Ez{W+V/"Vh,ɋ/x ! Ryb,*MG?yO3̦~ ˢ@nBYMJR LPL"rW=Sԃxx,Ύ !ewi]bErqy!<5e{y/@Uc!IFby]]UmM6qi8!(jcv?b;m{LJY枼iuhRW.3>+}nWJ@9BզB;: K2=i2=7PvB$<{A+Fq^`4uN󼛁ҤFkC/cU^w]u$g]u0+M.ܹ,OnrIWWEA<7b{kalr*JcM.Y/GxMeLRhеy^?=[9[f*,qʟZ}!efcj;k~ů~X$(e _}sX\\[pbReAqҼD 7{"Il|[K 9#}XJBQF:_ĝT<$J=Ƞ3HwV(2wP*W1\>;p1 EFE:eTx wq짳X^B*Zb}]8d,|*FՁ$; __}Ke('# <`FT2<'G$Q ,,-Cx?s-TC^7nL86[]ݟᵗEc>\X$IP~f(FH fdT!~DEG,W!u6yxlllTemsE OO#;'{]X4:yb{{xs/[$^U,,B&U>&V?fY':],,^R:mpx N*c'Rgs:"܎^|~ p-=Ŭo/RCAxy}A;(DCa*U,g~P}}dsQ,N ez " > T!JeH9 ӛD>O0Q碉N>X|H3Pa r _\˸s*531Q)n<x<^%uU>d!;{***($PT<Q±SGb{BQ"ƃy:`|ldX3[Uu { sZi^r xB a ɑ  Z9@_' ! |]uiKTms56}ͭkOݻMcH\7Bד.3s&w HJ3n;;\lF7ᜱd+tl:FXCI<0u29S:@[T\v\BUM f&P(y{)jz IDHlRJj`Xd:?hw.k JdM⌑;iOO7ʕ*wv1ߏBDs$Y$.ͭD#!$vvqg`a3G'!*D< Ke?yH$r"{b?ׯ!b =p, Uq{|>cT&La Kp 2:h8*UpP!@ 6l!ʀ4/)dҚ<ʦTC椞>iY{ć54>Fpz`c'{={;]˽l* -ٻ}F'c2T(K09̡EaK4bZ0d룑ܕ9WhG9Y_\[?SWVU(RDuouQaeiY?3$7}F 0EXTVS/(TWύBPW%:ZΫvf]sppPh G#2’<" I$@q GGC{ 1m -ڀl% ȕ&{\[xZ^ĸ\d(*=!Τ"W'kWP^yp00ӶaMFlH[?M4ikI}-SSH,-6$5hKpmuܼu,O-íXp{š|e3'}PZ{7̊TÒC:unooF_| xU vPwpp\0'm׳j/,5"t Vs@V(h/uQ ~ ܺ?b\BaP(U"aSe$+(UyuwbukW̠R CEnncgoBUdQ "NMOX*va7'ΧQEDU16ЋxGGpsnjbrW616R/%PT1Ӊ\|wW15ԇh|lן&bb 7vXx\,no>@*nMoaՉX_} X\^'/T.`U:CNX?*ժfO"2UG9EѪiL]tڜHRPAwOOޡ`x=s;]XX\T/.-kС)m`rkq㾙t voRb &c>:::PT%|Mک$[Z{$XqX]\'ua j>@,G+&'Q‘I( ~|HJ2EýVAǼh6D#SF})53 x_bǡR3uu:ah^,˂8C;R冬`Y6jbo;}I)j23FL@R=Chr/$Yc;H#gau} T3 b?ETEFOd24v?e0 ߇jH$ťetb(9_~PTD;("Z]|<TCQk`:F6M$*b( v\8hK9@3Il(.Rlu zECCs7ˑ!xpwul3L𘋠|^ytƦ-u;hm]`oo| %U0XͿ05HHU#d;J+i>ڙYT*P0H;TyD0Ս(vvQ(r8lls?щ1tu?~p[=+"_MM\:w  xGgG vhCrmvRRPTj\|B@Zv0,*UfK;5n@Rd~Ȓd-2(,$j+N"*PR3Qj1:k?nMQLJp8Akh^۬B0 :(ͿC:P,NAxv0 🙬U搠^gKiD"^n(Xmru}߫;43o|<,̟cEQ PYQbf8c~0y]6 >vVHb6e7-B OCFԔnB83h'aݳ 8N)~ml'Fx]uWFEg!xrAZ!5*>(ko8"f)s&ˑyג8lvZ:(ҩ;ñ7{kpu*[?謉|zi۰s4stTuٟ:n7׎?_==I&8h=NAʹ:Zٙy8A<|H^tU; ,˂o͕bEI="ùj,b7b 6%ЀF$V> PƢGсa`ʚC :"ad %HM*U~D#!dr:6ŵ^y"{!- ` K+KpDAYZD$@o77wCG$ ]XEPĩ#ceY\OӇ8:ڏ\.!;6sx WG`+!(WV+822$A'Õull#xAGwӯ\LJB$<\Zsbec _(b{,+U#_*P)W; XDR(KCǰwx,P0k8{ 05>-p,}Hlm3ށEo&p,÷߁$qry-+*~0*T*elm'DPy|p<7ӛj"zeޡduP B뙜G*uPY /,ㆢ sՂ^x9[֭gzkIMyFPV 8ﳖnD4d2*pT=,VW Z$r ZI.:mS^c$'ןyN{|tt}>zHI0!-L%.D*>zzz@@d)Q ZMeEA,E\րJ rWYD9B;>שF>S}= a4Y}q!iR5p_y ds9EX*rC$ ҮBr8 66u?$ !t_cYƐғz(vP,c}cG&'wBPGD*ǹNLbJjIv_O72qA:ֺ?T(<{|;;;T*QRlԫ$gyzIchLWZb[FAjy2d섇̉8-Ư RZbxx#F'ʥ O`k{,ZB86Vqhi=ڬv,k^Rk׮beeWjr266ЌM69otz=n%Mx<K ow ɲᕡI'ۍ^|% CCla9|(A@OwUj`׾:>UG:ÇX,C%d %dyLP,P,+ ^.NvMJ;Z\w\x=vcQ,-"FG(2ʕ*X:]ŕ5*(F#pqnTxˊ{+뛐eP~U!,A?V,hjman:ݸ0,]BW\  tJԤ)W@1-@_} "ر__â չz:\BP"!5g`g'ْvN& SEivXF9~\YvSRԷ2J+ɄiJ4h,J%Oߗ!X 83dPuؘ#A}@Q|zi H mп$IwhRT*efc_xdڇS6X,=R퍞aᠹŬNi& Q-h5z:υ%<0ks1Ҝ =N:j D+n?Y}L gz2DI2U3HtᶀyGfQM9M6־IKm:d!)Zv #oϺ}}xx+uM|3 ɘ7+KOq'{:-湨W _*a!) DY/p= ,g^ĝ%m<6F@@ɂDx.HA0׍@x |0$ )"F1NfYx.m$v"JT6l=խ$D*h?.>}S01؃ߋO/#>/**^{<# ,To}x?qg~l'2?yǿ1Y3FXFW,4R:ca29,o!`;{{c-X(0Ző!'p f&pCtvDPJ Y !Ivcaq]~#-.c T +kX*/永 EQb#$M^%(ly<>4** ?ݺL6Ip%K_~Ǐ5I0yYCKUUY`\atdlV@CU~,/X+nARz %c jV$kAx8zPvumߛYkץw 2 )-S`/$RNg<\,IexB0::B!lQ,;_v=/BIz L\ϽuȒD9Re/Z[qWW.^" ?kS(Qlln0 nVqy$w cGpRtNX2ٜAdJDbKkiMVr@髗/! Eisbn۸(Ț%S IDAT]E ,髗q8T:NG2(R RDP!"&zT$Q&@ǧWG"x@>TJ3{EV&p8w \ZgTUEoO/~O iHlm%F!Tirm}|pkvU;$ȶF %g=^;,062B%N̠3ށ-N`?ACdsȲ ^"zwFgL$c] D&|^^/QEXr\>b ߏRNS  5ҟ@yݍ4p݀,C ReNƢ.sH[, 6w>C6rg_Oy Ɯ]ΩIEQ4k]]]l_ӛÃ($V"S\Fx4 QhDmFٜouyLzɤ0miHsCKu(ѱ9Em#Ǘ.eLۄq+dYT*џNxZ{l޿:pY--/[ .X4jjbt0gÔtRrGc}QFKex<zP7mE.gk?s9;ՂmrFbeu5Gƒ芢/} v؜8 b-\֊f×|0l4j*EZNrd4F[m j{G0vo_Mײ3o >83vy}qm=fD4Do~|b!@يx|ګL}el$ުMJ屉0NԴ*9-v(5u~p.*a%Jhx\ "TB Yd с;AR N-+8\X(6( X33Fzqp8nޛPo'r{:j[* Ux8O^* ,ַ`y} ܛ(b ۻx[^CP0׮squb#_ -ܺ?UQ@0íU}Ǎ~]s$>#\cr1oHﴓ^]",I0M˗]&þK^~|S~ٿ>qҥ:=BБ/pa79NĦP(!˲Ax\oA ]e2I䝻wAx,=ET"CܽIaq@E` FpdP-F&0wPq)fA?G $BL3cH$Z*P`&TUc:噬)JVCe|ͯ>D=6:f1~_F:=́ΜU!OElnmtyWzHۦu͕LzT J6pty7oE"j(h6U Ek݇iȤXCm=̻YNH^9R_X12VYZnc RXݶf˝$,Nh+9\Khx <[9zOAhg=+J(D8Yo3iuILN!" uڶ QH΂d2 CCCE"!ln(! B躉ZߗBP2o:2í`u,jc}kwPuܸbZCGqˣ 2(H C7Z;8]I*^ 7`F=O<7¦"0;=r ò!K2 2CIP.ժl.ٶj]E<cM͊| ! D+hUVxKY6Y AtDc1qg۰lH$;H4l8`0!"ѨOV!jSBv; #XwY[_wɁ`7d .$n @@t&[ ]Z]DO`A6|yy9|ğ6* &#}t~$? ×?yb7(LZEBaXx"Rwzd2^9pb7)4* (\ΚRH$ϫ=gܠxs .>\y]t˲*B[G7oeARh(Ttx P4ml{0{: j=p?w )  x$붗u֏^bA+/w]t=mC |֭[/CN@io{kȭE俊w6|wcǎ&PS,hnV> +;ٷw qllzl#?j|F]4MG?p)G;NFlF L~P 3즡8P0VJy"X^ZfcZ@qJ(00t(X պD*U7 ‘4.ۏ0IݏoC5 PMyEd lE 4ARC2G[%M %p/>r˳ym0"öL=ZRu 躁X4E !_ ²,lP"V 2CI 84<ij?9~r,!a?e%F$@(EHp:~kst,r"0N~6YG1>ƭ0MgV[.f_LA.JX4Zb PkOGXB\SǑp;q[[HƢ]Xcٿᵗǭ@mbqUEm h4aY6&Qh4ӗl6OށgX:}ܺs~p\P |/7N~LƿQ7?xUD0!2Vue$i[.hLf%mVV7}?ǠӬ¾[^Pe_$|SSS>˝cx'oƹl6S:нke{n|Ϝ QJl ##7mx"ӲEYGǯ}z@&3Z(b1bwofm+wOµ#osW.cum3Sd?pͭkɯ+xH$jJ)n޾y # yJ~ӟVpjf:Vq ~ѭbgՙ3c81FIh40aQĉ+܂VV! >$}>4M@Xn!V y Sgl-˕0M[nӾpb_0?ET42Mq>[LT4nZ#簵xUw&.u9bgi˻pV %:S)&Y/\煓ӡ__c>k3P'醳݄_Ao£KUn_b'"̙8<< O$;*A۱@"?`^i䌷AWPC*jyy0k £WK/^@>_V]M> =hLuFޟ' 0Uɏn?jA{.F'%<^w?j ;?XKX؄a|K3,D#l0-P΢X#R DYnQLN _‘9d elg!I"HXA,A$ZC7LL`{?pmdI   Rc(9qa40t K(*P.-NR ) UąB2bSI(Q(WQ,Wz$**wP7P*WkMWO߹4<\ev,6saV7PבE%>(*aPًp+,AC7qae~{Y 6JTU?a.[[8w8봠hy8=ڰLhc^9Sh6V6Z]S'Y(Wp=hv{l"LRCoKv[kF3.h%ĢQ@m {FRH& d2in@:DMpX8Zy_EuԚw|&lz %$ cWRB-b̂sf{ƎPALMM"54Vm[oE?p꧉3nXl zؿ&S*xô J+GJ%Qo4Q(wUptiӓ$q̪%Iix^#O857oömllmca~a%b(?y<\ۀ܍o4,˨Vk8wKZ IJfMMNbK,-.T.̩88̺2-eallkK E$º(&b(} Xir733rl.phpr 4t h40Jsvf:n+4t7ĢLNLgz'cG u|>[}:䲹>$@3vHZ&г &}e8m⪪_"?xamR]d@Oö1݅ '?ޮѽIܵS^cYxUgFuxb1N^.E νD"H$h `ddMU(+aAn) 2 U76gڋϡPwG\$FϜ?խ]L"$I7F"G#8,!HXAZ$ ȤP5 dž'wj4t EIU+eBqAI&e[ $7pdiZpci膅T,d {9 9"x F"0"tM0>>B+JDA||籵w(^T+m=ַP7 2*:m㽏YXEфnj[eO~W#)"ad ?/Pxb*GX KL͆k"W*UP( Y`Y J0ʕ*.-4MׇRɉ1.p&_{u8OX=J"ˡ\L^DV1.W*z]7ܸ=16 A5=~X`/u,]-HsyPOH&3_} 7? V} MM~ݟ9nJr?Y^W$0&olJ=ƈ1nQ~ʼnDZ Y,dz-5(+YMA)$ab|l%W5 [;;3ۇmY.h;NGkn*<ջn7:kWqJ%Ho}(Ki[o;uU&q4Y;į9LOaiakHن&3 W0WӗB6_P_Dhiض)TMw G2ʶ)FGF@ѵesJ% LlReS^~ fӕ l6Vk5K @앧 Bp[ cFN ۝p7ܘH ϯ?m)c[]!DFQB&bD^»1zIPH){ETa4-$Yl6:U}R$E<&SnWR_{>O^zYA8_2 ꍺ+Yos k IDATNp*C"iLT0::|Mә.,5ЙYCB2BPVqdihrD#0tݍߔR4Us\p >}Vk>س?Uv}xj7}'%  pz%ɘz|MqQ@xLg nh4dF"h4fFâ,BH2 䐂XYZ~.'15>Ӳ(2sQ5p|yh]R|L]8ڵIg1ZZ\2G,op  K|>p8^π=5+0Sŭֹ3ܹp.h6UVfMU$3,J;PWHl CC./Vt!{lVt#* mqE H饸e7(-Nd3aKT8s.# a|bD̵ .CbϼyO$afG,D%HTU娨龘Τ~T,ϵ cc E.?:lljpT17;R@M!JrIHLB\R!Hhē3ttxq3(`$ރ ]@.R1Y@Dxx_c@+o{i]%n?<ϡFP)^nI5NX|`="t8/#Lw+(s5(̙8N «9!2CiϡRhB G8D)*\+0, DEqP,!cuk,N]a"&28ZC|r gEBu膁BTE2a",L0,S, eBjö).6۶m"J*P_xfƱ.Ο8LU"©7FTe0 RzebcocLpuow߂eZJDd %cp iju$Y9\{<JX$D4h8D,S+x[xKt Vcw!Ylbq^t?xÏ0804&Amt Rٍљ4DUMB!RF;Hģ?Wk**Ν9MvtwxOXQcX*cjb iBT4M L3j08vjKXN1h$܊NhiqlpszL^a R%P$-0h|>A72`Mt8U3ΝEX8tf5&mOV O*׿o]μoʟ^DpɖA6g$aqi6xM8!Oa*(840ܻJ-ҖbD4f6 s666)I ms@Gp!@%|k_A6seϟ;u,-.pBr; "X0t`]Jp>B/语%ü qtDf ppbHrA@(Z,ssee|=AB e!Xb$iY,毳0;BĤL_x%llnP,!QX/,&SgD"xK[c^i9!tߛj OOJHޠN195LxͲ7p}v^,t0BfaQL k OD•luO {L6E볏a#('%y2wz?}|SZćj?#GQ.%nOu^reb9oO^xX/л_@'_@Uq%QzAE/>oL{Szޗ\ J;1K"@) (s/LRO{=폛kɧ…c?ÉOz{bIϞ=-bdĄ߻CXDG;5@/pjo۠L<5[Cx:هTQdXAYu)mdCX`Xakm#`6~c&R5IT*wl4Y$beG3 ,*HsScS+0,;{C D˲HfwQ to#H%jJ~Gx1d Eܼ}Զ ׆wZEZ8u!'W dYr2ߢ\T.!_(2rjH j:4]P[AP*-Ԇ$0 `]e٘FQQ(t(66%^y66073Jj./J)E>jUF#T Q@=NW {r Z+D"~W^76*q26fgν?EyM{y'ֵJApsqއUWxiVMHmLIT5Y\&$QBP$GG01>ZQimd#KxUlln*pv}Ϟ**TJ) TqۥOgWDHfW1 =f_$jlQry `nTM(2oVܫCU`gQ073\C!fl[0 Z5W'Ͻ"aϟ>N[9|t$Q Ib2jR"BX($nx7^v`&䐌xFATF\eFSP YPObhVs#UEXuzHQ`hSs~ #;+g?pa,.tg "$FZT?}GSt")&L 4 _A>O!N% zwed?u. yR|8yO|o:wo|T*y7l-礍P sqWϓvx́twظ `rjU/y鹎'-?=>vI !C֟Ox; g\\\&r vvv؄HѣXzOB\([8u&vvg\t- xMrRyzg2?mZ~e?h|X[ Ub w(ۏ|vIU N'%WWuܸys߉qA J%W%{""s\ LB7L#QۦHaXF2d!膉X,%a@eea hj^|2fh}VBH%ȗxIܼhh;(r$Fj %MM\cb$,j2)ȂϝtxkC׹&135y@$栫“שQ Tp ]c#Ӝ+! %ȒjX4T"JTYg28soX!1 ,;(ǰ %B(N,oz3SPu-! cj|~˸}i@ s'" C(C4ܺ?b8Vdlnq{ hbnf/cd"drh3ӓ(ʌ8u ?(:=]`MPRVa:Q*L$hmUMMNP,bfj[;iޱ$U[eɧuIQ*j<,}ܺ} /\Æ3ۿ-Ns9zHwY:bWO"=99Z:Zm{nN`RWEWqףZ>g/ߛSJ;RU||nv>Ldzrܾ YXn mۨ$s4aUR:^0R ) Bx>BW? m@m6Amir_ vo E{EICՐAA`W{"T"e|$s U, r `|lᰂRe( {d" gUW>VY V.9^g _7P(AATrDŽϥ]@oo'1 Hlt ,Ox8cV4R "bpm3 {;WyqIŀ`h: Wsab0cGVudmۆ@lr mIgxòmAk XAdDat DX z%BZ>4Ä$߸zS,J$X IDATY[}ŞjK$Tuaq~*x7Q@Jchj:4y4T qno|i0_(p:[pggS HcJ)Po4`6UU(!hBH$ JLhj-FIDT(tEh:DIVn$K胰nZRؘY1)@gz4E8 KV%#[XQyZO@}1ZG=yώ1l!Nxxf'qIh\$"Z__X8zC\{nyp(R01IC$**6w0Iajla`}k i!Sx411aJTku|o|ÿgBT:pf.Z_-y6N8흎i:F2je8y|{bK#$qWJ$nKiIHfSESUQ(HĐݵ'J"VEx6ZE#nJ*ryV8## \k 7o~zX'(qyj=עALuiM r.j=r30$N<8qlڟyOnںT/Y*WR$yŞ,E{2&7bloXmJ111'֝{i&`Oc$I{|?sVd,/-bskb2!R4d SL&⠠ aEV۶\f-Ԇ3C%ZA P`Zqty B\F\iYF#7&?rX+ykh pZ`,tMC8tg,P,j[\V%pb7׽qoTMNLwqHvoY"ҥ܋gkUu\"BGDaZ:F=3=Cqҧ8!TJY>q!"!E^a66A`/y|21qfzڕdnl^mr K;wMӠ-^̜y. 88̺((At!wNq)P*M7Ӵl\q pϜD._Kq=:=$ $ j5S)Oh%kbGXD lFF"Fl{%Ga@duMh&j]ERwܼA7L|% S;œ+=ȣP)+q*M ӈŢ~6,sמO26v`Srƀ09xuEdNc}k<\P JwCT{!! %Ǩ7U<؁80lPHk8~tkL0,(!a`blɿӈb#ɦAZE(B8HST8y8**,,TUM),-r(۲&EƑe<t 6Wi@2RAei.űc+rwȲxAB'!G xhi3fڤ%S˲|WƊ"$YDRmCAEl6vP,WP,159 gP7073 æHh6  c~fHMױ16S19/h{مx\4UIp G\õMd>͝=hYG@Dn`?õ/G;!J W`W.!YBT @Taj|=8A$bQHMS;F$HU|vvwaY.~0q)ڭtv~u sݽ}4Mi>ߍ97tdmh8z(¢D"J'[4ybLGwJ?2h65,q\g:_*wΏE#Z-'')8D"a ]wCIG2UhTVy͆V{F֟XVnف~s쮵a]^LFgI{,huiY(V0>6i Ѩ299[ŝ t]Aon:;(mvRwkx<gX[ C:n®8X.9"#'(d$D">VrI/*DIVH%ԛl3S qB}fTLL4Y3ŏF$wYED^'Z-4MؓS6u[-eNt~*ecFL~ /=8KkC&J'/#CۡXM7F6[y&M'ôl*:_~IVh4tt H0:4W#K-7Q|LVr 'g- oI2;sž_^0t K 2{0N8"ɡ)V6d2iַ#JBWqW 0-erqߺx'-(W מP(@¡#MtM'_( K7Iql3GgMr8!u4{Eu;J|ѷ^<&&&&= W*" >ͺIW|0QฟOP8Y>(V_nƅ4mm)hD9rĭfz`] z*=ev}RqOxt]k^.OH/ʠS'~tIPdȲܞ$Ʉal 6Ձ8=geQTܵP]..&io`>N0=5E$O`2xנK`5qAmlG4MQ-z̳㽟؋,3̯Ҿyp^}DWWE^)@id^ n>uI ؕ%彝A]$a ;%o6Уh͹003s-v߰A %z;>5R8bO-\Ɓ ,sϕu m>=أ{?+++XtKoٝu!`|K/źODI^׹sN /BR+;.dxxlT ''hA<@o=}RE82QT!Wa*& ]ggޕo2)6QL*vP/=yZA4aayOVoi:?x+5SJ~UT TEh*;& O*8/$-LTl,nOq[U"SEVFEp/o%!C%݀h4*lMr MM6%_,35& 2$R[wx⑇umΟ%NGy+ϲ2 C[hR*_cu} OS9>#,(^| /cߗR&UVVW9ܻ[\!M q\.lO^P,k֩T!_(#,bj:C̑J%}`{4f_4olO.)uW}Хxw7C:[| 1 8vιs~{,z$I H$R@ӻq%|>.V95Fd2ÇO+HTGԳ . _]`a0==hu- P0hvRFE(ⱋB h4Ey4ZI.Sp'q-^ʋ-,^ wWD@2*7:2,ɡ\T2C| X,0"S(U8:32#,,$l 3MGpH8nxKSTHHŭhj:msI19>FPdm} DZ )4e3IK ;Ţ#RI% Z7v-J1mksO^t}WõvmzСwEH'''sܶ3l.V(7ޠhܳYV1-vkVKGUU~Ifg}`1Ma0vt>hfZdijvѝqthhz/|Kb)k/^:.NL3.@mpQWZ.m65BpD e-nޝ\ӏ'WyIV7uD"S)*ag.·W8soxch˲!k1`L6; 1PضIQlw+/?}7^~"JޤTb;FMlfx`m$I)6E$Y!_,r) 3 ]  #I }YLˢP(Qh4p:#"j%xZ?jmזP!n#md_7YZZBQCdt4-q`Wϫrg/njZo;a Ywi_3Yk]\. d$p'p/n&Em:v%S,..}-|_0x|f0 :@@9TB9A{}zs~;W#̪m~a!~Fpٶ A=Yo8HH4F(%Rձ Y aFx*c91Sllm3<8H^h2ĨFQl:[xbI4EyI,O?˿vce/`:ИLl\ͻ}vmFO\+ t9>{ozʒL:ĸ\XXt:M\FU DC2[>CvAu8Y w &'';4z"Zs;cLNLp֭]F:E&aEr/=,.{ {mմb$]x@}E57^r*tMl\(159NPDU/cc;OV'L26:J\YfͰ4-7daiG/|k_wpq66ʗ^X 챣B#I|?7v>O.ׇ44T6Z&Gg\HREd>E6as l -,rǛ{s ~Xc*ӓ8H*5bDMA~pxf.pQ #ÃSIOOϣiMdYAeԐJ(aQֈxy"X\(r-Rj \b΍KH4SG[u.=|7?L,PK'y'D^G@.CPFeܼC_˴+ k[9fL:'o +m7mP"2DJ΅D'!_*!I*3;,P$fDBQ¡kA$E<^oRA!UWՅ, /.c&FDu{*K8G +e&7pX<_R2-cYB8 +*rm( haҁfxDO7B>^6>q3iܹ?;@pdX_NS֏PUzm:4M)ԥP:N Ej#>5&Qޛm;{]G?hNQDS9{]J̌ *Z#u_ҋnͰJXϳ/DQx񸿿RC0_䧀vYWVIģ"m iRInp_{Amccc|W~Wrvw9ɳUP'ڟw|B!՗wJ\"äVi++^*!SR-ԧv_6D&X-..CmA;~ɽ;s]4:2"^v z>˕ >$N27W?ehpMqEK+k,. K+DHzS1tBD".~{g$b.XrŢMlaʉ$pBǑjAΟ9ɽElۡɤ*0{144s +뾯|5uf(J5j1'Pnj՝}< >j}vqt]sQP_0V `<ڹw굚׮18$űQ{|3$N z==<]TXmjht_gY, @?7|}׮ 2]^,NhͽFW;o=&81R%߿<$144H??ɒXB4 k׹v M 6lno344{]FQC9up8JViL"C]ְ,Z ɄhG!*Zr(v&3GRqUTYIJJE lh̵ fgg55eUd FeӏpǦ'_Y'h$Q:FEV5,KL2:fqM!ˬon3{S#"ǣVv.*ggP?Ì wxI>3X64R֐BJrLM0=>,$EАdNH7_;-TssˤI6E,!IeZA M Lb47òmI0th$nh*r9YM'(WžUxYZj,ILSTlDh ׽YqB!A8j(LUyAeF(1YAVdYA qi4CdUX0"WU;,KS.w΃cH333Bm+9{5w;"NGA7wG޽ڿDVA=&dYv{C;G( a4h@QE]IQEoܮpz6=$u+ tz*~ܚO͉eS$5dQJcsb{)IW^ tt6뛝z`}nzB]zmPt}Kę3߲ Gg֑'o6fg $WtitB!%YXy5{ƱEfirib=8~O[\w|;{mVȲXh78 l6>$oN^ :(vdo!]$f|(\66wUo] =e L1sj<Ϭ`=?AanyՕ`#JBDj8޲dp$$+hE:0mZ.FF7꺎rhA_r!]X0Z4C5ַ<|jj ʕ2H[q\Fx7Wj Qd ˴H%b dV%:-v`.C_> mY2jba.,.244( Cg&J%ʕ*m3Op}t]GUb$`ϬכF#S,h4ǢȒĥ /1V'?wv!Ua~i|hCOǸ7) Ţm4rdjU,5Nm/_16<{~( Kju?s 2z7πvX \k{/"@<ݝP  lKH㱘oSEVj1{?8b1{zSen~lPG/^`MaY]6 $wߓ(P| [?Ѧ&ضV#L{gho8pz1m:oݛ`H W|Sܟ_ 2>6*fEj_UP/B`}*;uV5MEٹoАזexI{ds bi+/Bqͼ&5@E_ö3;/<.¢>E06: |+~׾kv-.6; P7`Β, fgpM7XYYP,";lsh XL0ec3GJܼs]78rh~nݽO\!LfH&JeEfbls 94E6fqyE\aUT9{\J"wBZ׉bM"@ij)T<|4C,m]%r}N; hAr$ܺP_HT"?~#LdBBUMMg|dӳ3_5W"ja‘0kyF=0JH2[y]+-,[d َ@?Նƥgi-*Ua;N' ,̺A8&}4.{ KB&I pwabJ:\@?ǏaayhLi:~j:a5DXB3Z~s6N/eQXhjr$Ih"IEc45 M\@|h,F0tT2j$old~[O@s놊5yP(aZB!ш, ë́#Ql!c٢8)PFSS'#K "f$c;pϝ$R,+N?A@X*$0dx"s;&t%TjH"ôr㈼ϴ6~7x|qV4_H?@dڞߛ+#@]e7J`^ò,Pff.ԆXV\{uG<9q8=fN׺Az, ًHj`ᾟ8^d~ڤԄ6؛ K{~2%YRvS=s,Ϸmkk˥^4dzuXgou_UJk{~kL'cLKY}m߽_x:&|woss\,l6D‚hzEѶsk=G48NWpw[4e```oY_[nNp$rotYr@+|xM_=@^ wrd.dע@P+ZE6ׇfHeFGGLP4 lXqÝEaVHo@s{ϟcÕp*،/d<.<]38W{Y{P <\ӥn5BhxD,II>EQTdIbhps af!\;zx;}7.>ok{^wjT*[SEw.P.zU2D&BC0eeXX^hrчMΜ:F*Zop VQT*L.S4Z!2}Y6,`um]؏ڶ"cTL9=s/k{[*D4.jqkufusڔ?Nְ-/&uUme(]f7x?βL<o{\6' ;]G.u݋^=s 8`Z掍$l~ߞwcnW]ghhvl@W$6Z‘y$/P$ߴ-{w8MJva߼ So4EN:bj| ݷgJ&h65&p|nY,T&F1Z+kؖFJ@?bx,FRc`\.v0z\.8k[]E]?[8+_T841 ~e2,o㰼I^K+F굺z3Mf'xuM2mų'?i):5R |x"RG:fVgbؑCuҙ7hH )޲qwa g75%p bF(_y7MMۯ,@t7\6JjT tW%0>2r#.LON`6.|ȩf24M''El ZȱPTm@ethkFFsǝ"`scu$dwqy丯1-DZQCatÑT Mo!+B 5(hP8L"X \`Y "{ }}&%!(WvSD՛.#7^vw w~$w3!:&B0T#c n?#u_ /ec*6o<`'%IkVe3bllZ1xLO=4KKKm,n;o˳cKsqGZotz--_lm˰nuv]*]<}/f*>WBp@߭!]۽vU0ZH$ʽw$\}A 4^0Fk婨FoGc1 d.sI9 Dݳ둢Ye$|>"]_t#awVGP/x9;_A?{ަ`}; NjMvms ?r#=`8mmw@vU;.ٖǾA]ddheER CdUrjsgN'*q1,%"1446ccd4WIgqGΟX($ F7ZP)XE: 1ПP,^|"+kH<9V76UDu$sTUK8h4К 6p ]ٞ[yEeY~S޶?wZ_y\zrqZ-@Vn.nQ'ţo+S'Ol.3c}7$UW IDATn*YD^6g«1 5Sny [h.IrqU&'&D" %>@$k`pr(Sܛ[dzr ˲}wlDo|{G6Oh4g#TO$Bn}s<ŝ{s;y)j[(WTux"p4~ ᰊiZM,ZcY,Eq]);MJxowFFwOVm@@א݌mk z&E!?J{Oq:VidNi?]ht֔kYiMS*8|Pmc`<%KUE$v^zq޸GRǶTVD:@WchGX^ۢ|5tj -V6 7_^lY;yP8Zj *&xIR(U(n+ta9A B&FrLѠhPfҴLլJ,傲Ύ{ǜ等uLd‘H@Zh]r<$"& G˴p5AJBaL!H2>>$+X C.E[L,}b8MM#251K{y8Cxh4J[;WZC``mD ŏ#),!IN P0+U]wC31Q}@ N * fOnSӯ7#\!nFUEK~ ѓDLX,i~n&. 䘫8=닮8N۶}{6{َ˲ִ{;)A%\_lZ..^O=j3i|s|;/[t]:ZղV󬬬ߗ{Ԑ݀nɩSg@Q'+oϻuaw&VaC;wt,$ۙ=m_$,׿ d ~aYtZ~v98X6r5ٽk)viq\;At6L-Eo&r(*$JE+IbDڂs?'O~׸ <1KiduƾEA/8z.۰,RU-ڨwat LmMϦ٫~hKn Ņ~F(L$DSCY^YAq! _yYl޺{m4\r1ZuV\CQ|k~:uᅇγ(ebY6%w.F'hF[wf?G?{6,bT5Ǧ2mIreL$cBA48b1plE8HķB8)8pL צտi\)<"Mwؖ4abbJ]0?m_}%޻'4/~{ΫyPuAgkUԭ wXywɲ_3R,.cj{:/<}Ps Ui6>; ){!,'~JkVR'ֲl̰ozd!kqycq<,Q!U+nelmm & T. ӤԐ$(8j19>v^D\U96s\6M,%ljlnmf?@8&a*Ҿ~Zn8Ѣi.RT31:@R)k$1Vy/ӟw?FQ$R?wˤ}/?yki}ER8Wh45$qz'.-h4B_.C!j7q*5膨N;LQurp{I6 |R$kx񋆧+Lj>ed3HO=‚ G1IVDhmJ9E $J0m Iv5Mo-ИZkPkQ9~ޢT.ʼnD"=Ǘ %&;WE'IV+pJں1$&NQT,n2dEq'p wZSXds+l$!t@|g8Xd[K9!^g?I9r@ݨoI(r@]czv= vORkvyQopͮ/iRۿ?@z<ګp]MoMhٻrh,ƍ@@$qʎ.௷J(r Ra466[zdC 򙂾yfzEя<}:#6l8;&ugٙv]gw!}mgg&T$dD"'Y{A|x A2w@O>|X\\|E}/[N2p=r-N o3ϰh3+ ;Cuϰ fxt;>53HROOjo{;vY666wMVeU=J(#e1VRJ*hFhRm蘎J* v(f=@ZCضMS775ɸˬL("S*W) gɤM;ģ0wG%ʕ2imqi>| @s[w \ϱmk0eȲ$OYs!FɢP $b1t]2ww?}ZN٤R:8d"εqEu$sIE6 < VUk,l5'o86﷿{|iX3۞3UcY][' 17$? n/Y|{3Ο9ɳO^|AŇϳMZ+/>_~9 h47|uQ# W":Lj>0} ,.-s)]АS/dz|o;_x7n壏>@aTy Gg6T*3"׸Fb Rf#t^CvZJ MMYsᇹq&3G֌Pw2$/+H`-6Ķ%MMa 8u8*r^yEnܾJdBӪ-wE8s\FVX*R(KT5m424D|h #NQ7.gj|uMO/RTDԚMX@_~CLӢX.fehMB|la0: mnI'Pbĥ gYԄ-,lK2iU˪B\!I'f V77-Roh2)&뜞lB0[o ɍ;q0O?r["jORk6=@_x?˟ưmuA7|&sOpw~#g?*# ;<(o|uy졳DdY'OS8 K+ 941^yFZ ISԪ5Lbhpjcۤ)67pfƻ+>v};S #+;XDȤ3+ #BA*)n}]U%jlhDiB!ARp7 N~YUYwUW9 9.ӿBtŁ >bGO{0+ΎŸdBЉ:ﺛV8F"{Uv쐂qV= u'1qIqGVEǵvx:A(#tΒ;J8)ګr8p8~!Q_3o~_赇BtfltzrbFJP*D'\¶-S|'Z-*v%3iQw@ &W/c{{Map +w}[X*863S|OoB޺C(a5(X^ePek{[Sqlg' ILڿp8å ],,ÕUpl]aC4= `qaV8zMUU4}Y$]BBgػ6%+-x;IpoPvW>{Hi*qyr/"kkk"JmmZ {+reyΘd RY%L$M"@!I]~$N |v /;%K`gv'6M웬'svJCx)ɲ*̶@>$ m$3>yLNLPuyb@ H~ogxN ne~K86:mۘweuI¼ӱLMM8@V8  h133C.@HuA5 E =$Q[䠐LM#ô50Y%.?(dNOE`q~fťgy΋ן\FH7T+dB]$$Y\GB qgQ0ewtsH#BuPamEu v\Xrsdvl2AA%]&v%J<-]o?s g2N\ˑΏE:K_a'-ueJ2X.ɠIBWv{O?9P RTU tɯ uN89ԕwu!קyH-+{k;y%?ÿw~]\XT*/<\Y%3}B㒮\n_}~WKL͍#e{_;2Xdex,`R8u}wi&<  }=.hqzKIcO2`ltCcW8'hc0d,h4eYboKO^*:]@ֻR"E"{i_pxXY=fvGt(OK_#c*WēaKo-k\z#@7n 2xL JMIc?sl۶hbYXrn 0;=IEwF¼4 VVܱ燡L$hkmt̴,SKlng I2@ Mf0:2^,+uRk @0TsX^`jl?M._fazaV_Y}c!9n f5j375pmm3in^F6vsu w~rnqEQ+U ]痾f(UܸuòEe*+(_~aLҘVopcѡ JQ MIĢ4Z-wm6wr,n aZ S5Dqwcfj>I  Q"/l6EŒ mZ&Ր`kFr=b$ӷ] *%$*ǁLJ/FY~"䝐Dc¤\Qw hAA2 zT2MJ( >vg&'@{+kSI${r]!O^Wg1-o|etMn h{HU:\GtHLLST Tq;Xo^_pj.v"aD<+UT5fN(d8\IC ]iFϋrP΋ۥ폪ׇ%yIwftv z\gn):ǭ%*aIt=""mAP[Ξ%0FA!`讌ޣwO<1>>vzUwѺ,;j}SsR\k9H:d<;$~~nR.W=9?M~O_ETD+:jF!s8 Lfh?xǴB_WA>sg;&umG]qɉ03;a'gHjk#aL&NpupXHŢHJ 7ocB\|  CG IddxbI05ue1l! iW\%H08aq~wGFdxN6Rv-$AF Rh\׿e(BR9p흝c@_q~!H}ͭ-.?qPjU$3 2PIxVj5דC"u<ZТб=[{2q t޳蔁9*>dY2bT3-i,~۶{ %e&`r`0D<婫O0?3DQ;Q qr ˲88jH?&FI&be/~o}]dR~z6XL]#NO_UC.D/`X$" eJȲL*ݾg2. H CCn F[өT$I66}hDt |YH뎌 jk40r;-G0$x|7,Mv,s@EQ yA^2ES0`xhZa7/0RGD<Ñ0Œ p_R4VKx3&n2LYQbg7K*Zqfi1ZCY'%`(,+BG7,!l.O:=@HUP}obo+E=!gæ#uUrP(iY"fr",R'*, G7vw*r]+uGJ'uX]0M###buq b8!QwQYV]bV%JVLpV.^W~rc? /"rukVv}b2qv{cSͿW"?aSf0glxqOX::3*ࡪ*cccG[t{;CnH&5[㥙J%{GbI2/^bY+XuͩO Ys/-y@(/=1 (|xb.+Pd>ϱs6r f ٲ%"(r0f:k ښ(w 6 Ś-0s|M^YN ფ$(tHKl]Vrٿh4J0tMFG΅Yfgz} EO?$nG0^}i&13=x>P{ydnvVw@ ! M(B~n3w! arez|ܦlRU¡\J?,>fcZ:aWZҲ,wsDMd_ҨnJh[0;-1ߪ$c##J Y^@UU *[T,qvarJ>_g+P.WysMj:[;9f'tL:8i `mÕ=up(VBKQ$g^䏾_z:;=Ɔ,"P55,LVC1,WrOq{ynncZ&Z5R$~S f OeT5DPTE)k\x lhkf=&=H^gnzkMOE$pmW?,I0 4 |tzAaYcądyDT>ٜ-x@ @5>ka{BI$-0!5? JXA'.xV[~!!M4=5.oV $:j(nZfXJ`HE @0@V@*0ma;B, 3 B jXBƴlΞ^hb;R Ɋ+plXhdBZʹ;֥ YyR0Jd~Fze%q :̞nU=x]!G"ht4 Qa;[k%N:&.\p,r H;>K~;Ͻ\O xxΣziZd( k_cddJcXssl犠(6C:XiFxz@2e&F.fX~g^{XťYl033>L2,b3<ÏﲻW׿V6*1IѰJbjl{+ #V7(J`:A@ YT".-rݦP(/9CE8 {K`|ox-QRjiN8R#NI݂?4[mnnq0L\?AVv9ԕKo lf 4?X,:}ziA jq|z_3 p,ϳ}/5~*xel9ױBg_z?ih]k(|b&Tb.JĹg9159I<V[ t˶=g޽ߑtw ~!^v~kqӪXO0{]G*v] $S)js3p/6Je$+hR38hiwq"[;S ߕB/m;M_>e_cMW=䵫f}Br=f}n_m']+_^>$^iۮox?s|zvd׋1 vA.~hG:}HV0ySTR)qc`0HV;h x(`;KoO>gNS;Q:wV9} Mĸ/5VYTUU>ǝl$O$P\F 9K8;õWI$~06:F$V[pAmy  n#IJ$#@jǶ9^@82JR06162LR' #)m&hC[#iۨJ N%QdB‹ןfec2bp}26Ok[£i[dTku"j,J 4,a*?u{W Tju_jy}nܾ/|0*~xbw^wEQ o1?51vrT IDATFȤd ?5TMjg|>\(_`vr|bʩ9!'TID#U_l"I2ggl6 9v vY.-JąBPۯ/7_z\8 ipfiBLZ' QTXb<MB [<$`{t!U}قj]_B0đDH8j똦)|eaɧD!E~(J!ܽ{j9Ȩa&Jh4JRZk'Hh4[(L`(n\B*tn + JgOq J:4-&aPքGaM8\iaPdRiigڎX#322L[3Q,GKضC,an*k, $!)eY6jX%_(21>F\v{iJfK# Ԩ58ccTj !Y3>6J4lqoȷlG\\uyk#}ٮNͫ@wnJضۡvp"]9V2z@*$ I+ @Jz`M. Ih\9Dop{LiNtCv%0krx)ѭBQ.I:\o׉を fȝFΩTJߵ=>Sgwp|29swayjiog?漑 xכN`x DaD"{gGa(]nΡa/\ɞu7OզhvR/tw:bʃ̽`Éz̾d}I\.MTw縷y,K]#եf//<޼yI%4D#kIr׀ ;x<Fx_qΤъV'TU=~vMva<]cΓ<=H$-c ow- ȰotFoζohlM ^U!b8F9@ bjrgO5.-)7[lJDc'H%b[06|to1l28D,Nq}]LjETvJizN qxftwA ܿ/'cw/N׵]tlvWu0z,׿*;;N.muR{W]G%|~fCX^G?cvv;M;ûNd{rrfGB_43ݱ )JD]3Ij:LrʓW/AG#-,t 0>6J._`h0C\a|Tx4ZmdEH9HPVo`Z66P5&_(aӓT@9,?dp Ͻ&k^Z`X$4ڮoU& #pa{9j{/^R1HlH}Mw3wȊ%I7Ȣt'ql!iYگ7?ULŢ]k RIQ³,"E EaEĝ4\MZ-,$ 4us3dYlB4t]#LG,%R0!bӧB %#XJ C XS]E(2$,i:eJĹxvm4GT5Lak'p&ͯ}+|?lFh4BʴXF榧XiZ[ZPU ѝeƆAQdGH&b16wH}k$1 Cgec,aOYdy} r3o ;9+s_|?BAmt"7yTlAr{Ԡ$JTPVU 3ܺN.O6N "o3>2:hյMB=٥oB_YY[Vo8Scl &i"0r]jY (2Ӕ+U,ڛsװlp0-#C5 q8}4kny4- E G@y4qW@]4Zm * #Jd%@TŴ,2,ϒ+024NC֠Rcc&@jjf` nhq!RDq!eU5Qa‘2 P7HHr0I&=lZA.P,ǨTKّdD"n$R1-= HgI$4mff(ADP%o(G1Mar ؎`8z; @"X\2۲nLh43B]`ujIvuvdFӍ՟ nֿ{ 7[ ju/;}jkL܁^/{ {c{ ${xFzȼl255I]: ;Wm?Μ9@;8vݼ0g׻ƄiG2c{{?I- eG>ּ3dO0-:(X>J*4:sȁiv ڦEsnikpkm dj[6-֘B J'hyvXg3Wd~r]>]٤Ropqq|tp0 Wp+˝M^~"{-yKERcus+gyƧ fp7uvryJ*2RA<uYbs3$iP}f@[? X[7$YBuқf1- 6i^댏(0^dltj npYZm 08.+0<ϝeB~t7&ݠcgwHߋ\.ƫ/Qh6[]ih_en|m[|c=@Xb032lE4A7 6!MϟsΝs]~?oq=b(kwt_4Oeᰘ.so<}i:CG]_}=Deksw~gy5/ƺG9\'#گ:sktqYj`|lzzZx6/t$S)Ó*TkB<j- cÜ>8Yj%تBŤz^ZմVH]ʥ o&?$-Mck'nZX&CCCc#Cܺ@@)4T/y>O>uM5f&(*(2 Ohi:F˶PC!4]4M!b$ ܹٳE*Bx7i6=С|&y76;ƣtۗsS2;e^K{{ԓWqzaǯv -1DQ/D["/33^b]' wΕOoƲq'.?~:ch4{cy;^LIѨz+x砻@Dtwv$sXVD6R1L[!=CXBU|," HcUI^oP7̀k(q-.]8'W~,t ɽ-`ް-Kx6gϜbmm5j"Kat^`N<j1 ӓmMc03 K `(&W\+h4D*KgxeY`uf&P;l6946,F,F 9Α+E o7_![(&/=s?L|pRJ&RqI|[I:#, #ݻ>c'׺[ɿ<쓬Ų/~<篳ާPzdPzrr)ұ>j5??QZa(rv~ѻ]=fţ:#≣޽.9xMJ\$q/mL`M jP0$-`(D,#26:JTfnfRz@H$B@ L&Ff`Ks}jT2(O]Ƿ̵'*ۻ9,N?!i&FGgi~|tDLҩ$_xy7)KcQRɸ`f&xVS׮Dso+x]Mmŏ]߈X,*< a'^~]w;κE<M%1]Ww b?q$I2jo;;3n4A @ :"@*Tb0HR pgέ=m)o*>YU=={*#&b*+3'd1D;>R''ۑsҌom?v㫧'EŞk[6%YeZ6uA4ʽ;] 5skN8V;=/=d[a%?~(R ]׉F"" P(Q<"[L& L$Z~8\"ˊo~fGFr9z=,.-쬵\ܼXmm^iFEg$!+@ #;z->v{S3a Eϟ4J\d'G[Ep12E" _, 80>֑% M7z5RT~$I"8ܢcJ&lf \8wanޛЁ *5aPa(r [}~qA"cmcCoQd69Gf|xi s "cZ F D$G7M.]|T[2'eniOMmp٫!8Gana`lth4mK44D"NraLσC5k';n8LoYXpN=Vay5C(y!׶m.lɊB".DCTԚ݂0LT‚Odq'3vε7$Q?===L$ ]E@6ף0>6FZR\>b;_sIm+-,rw6Wn :B;/k1 St/5sV aS@ z {P0_I.^(ɂDR<5iyFZo\cFGFC~pL;6͛mkwR[N'I0(pg"'N׿Uܽ-r袬>ypP.#ں.1==^]2:I!vOv{L=#۸b'^ҋ׸sv{f~q=Ih%vtύIm{t^l>g9Ƕap)۷m_ܲweY^ڹ]b%='֤6ncQ-: gf=r,Ywk}]7333;vL IDATd2A.'9mi_ Qs TBx4^d|@$`$3>6CyɊx#Ȳ@ڶMTc"lhAàP,z]mSv;yi8 K sǙ[pZ?w0%lY_~Һl/{۞_7oSGIm,,.R1/ K?jQ+w)6:g:vVg{fNA.timю\r[aع=nn;ȚO[DJxwS?ONZj]JV* h]m۱@/<Ģ1"ݐoQ)|ŽB1-P0H(–$Jx><^/Xa%rpbxŕ5&F9zpl@::,s r"+ܙƴLl˦P,sA<oݥ?á1h(岫ROsԶ_dSXl`YlHZZ^q:'%V6,  R* {l ţtXx~* I5"ĽqY!62DΑs~h@jKn`0ЖԕK,--ken|r.?z.$l(@Oq#ukk[AWܹOigNfiysP޾sm Fo.k5$I.i7"2 11>N. ɩkpPA MwպJ(nL.,2$ժ+"*%rvZJʕkGERE$y)ݟS'T+d+(2[[[Y_o\."Ȳiؖel||!/$a+e[LPh4J"#"鵯 QU_d:=4¡ Tk5FϿi%FYZT.scOӟN=S|t>\GalX$Ƿ'I$b$̙\qȾWRQq[jiѼK܏O*ovں$B8p#Wi,=$Hhwv_N.I*v۶ܽK?uJztp{Y`< (n?h%ESgx|c00% Z9¹sgw]FOoۡ4_z bm㳚Cs!fkhСC͉a9֜C|£ ~n.Ǖ˗X^^v`Q0I$Et'Bt{*IS|~0n/Ud>: -U^^To/ D#W: `m+_‘0x44 ˲E+e!|>B_۲<cc,,.Zͭd"v3n!M7ݠXV6b?|}<$272C"'{D_7xKܹ/Ǐ߇G6=Zu$渝wJUuU?y@`s78y[[ܟcm5M(&.0>:BX1>U=sMRI zcpcc%cv[#[n_|*TwX55ϩi%xaUuޭ8Z7{g-ʩmoG4HFk):c6ݎO\]v V!@0£ƨ{Qy&k~jsX.n\0ӧNaZ"IBuG(cSsr0r3BeKĢ6EX=<e9N:VN8piJN@o3Pֶay-C/PքOx(Gi44~/r#W3>zz} ryb(_x0;0JQ'%@` @*Ѷmc*J-?/w߼Ȳe/Yg~aQdDԝܨywxvnw p~_TvGKm_'ѹoؾN\n8 R8iٛbkLJXe]lk[6|ae֥ܵ"7on-2xFC𡃬ol8(BƎKG͖C1EQCm4n\\b-ع5Z֢s->KfE"mi4(,mc}Bc[&>Z ;ܙ$ Kӄm\\[RTk*x98!ۡPZk.?qyJ ÃxZMЅh*ܽ?N2ZY8zZ(BEH(ܺ{MӐH(D\HolRo]N9'whhh#"h}3i>  |0dS6 XQTK1 X\ߓ$_* |x>R>ƇK }=~-1<~/`Ã<zǎAY>_diy霉&}iFjA<w:y/Bnhh(mx< ,'e~dZZSZoةe2B** {Rl£x(JwlN8#r0a Gʵ:cI/C#CL?s8[6a,tk:n-P78vN162=8}\{;s)>qt  MGm4K(מ}7~eňEc|X^3P&}"r" K4\]m3G]kzQuǦJ`uya<9g}PUU ӢE$S# qC<g}c EYXZ0MzE KKEQTkNv^4M;>O8i:rau$ kFiZ,˘}|m+[_{ӍӴl|?-`]B[r D Jn-ډ4#鰬y8ֵщ;6 :# vXh[|+_{R7qs6 ˷m%?:2Kv%җ ܼ3Ha.&BcllL8ڴܛVL% I'EZ/ 6!]7ôGH-(BMQVVm_ 뺻VP,ۻmkU{#b(c1.~g/!yyV27A,uGh$::#d`Hi }iaAQ<_V]`7T*Z"m]z5P?}z]=:.g:kZJ^`~x*$QDff$ PjfFXb||0܎qAX. y-޴B K-9}%=r-PZ;ǢҶƒP۲h5Wu:g !*hp&,Nf}iŨT+|>>ܛrRSx0t5>3M^5 YY$!ixdޞ$rUU]*w/,i5M, h1 ,FBC,fP<;=q-/Q*2<_Xpgjtp(@\/7x[=v ?@`jz˲Xˬ#B%&O=yɩib0bp(0 مE(k""ːJ C7 BPRĹQ%g׿;DZnZºVx9rZGM(WU85URx}H#(2^tC;MTvmN‾X4Q44 /0+kͩ=r aЗN18 ɓ(,7{W?EQaXllmT(=$ms8Z ͰEe|l54dtxX >o|aNgMBXF$rэ[|kwC|^/dB(qc6#CCJe,Vp1, 062_^c|d,y5z|| 3xd"0B˲I$%2D,>EH Cf69r+ >^˖lCM2ĚK0˲H{(6\} Djj_dhx<4Mts4׀c ai:4bD$q^%v݌mۛV6džaqy|"b3T+UP߷fz^a\- [_ٺ-~9}}5UѬ `hpr{Z>]ɚnfCd7d#p΍Orm;Vqw lDm06GŔ#HsAmYVW@>6:&l.~a@m6)/nj*nO> 8wK-͟u#<{}5%whh^.+ "s&"J5@0ȩcG3-ܛ[M_ܛcjyׯ>N2>XQIDCf W/?O|Ә/}u>%<^zn*Oƭ;$1<K+lllQ*W{?.^8U'W_~97gErd"7x-톄5%wGb.@]7;;,j#~?}}@?k<#я-bC3 n߾0onS%󬭮mjSu n+\vޥxxoAwܻ̺o6={ :_e>nvSHW^dwQu<',a$gna+RV׺Sܳ/,k|tFKU~ IDATn }g_q*Zw--&AΝeyewm]KpX웯9r0B(r}[7R'aׯ$Z*Ֆn]/m=0=;̉5dtd]]?y^;$%ߎc |M"H]7A*щy;ZHk^;5Ӳ`ހ3-cOO+g?obm1buj% ve쮰ݪŏ{Kre v^_I׾Vܦ>g/c{Rej?7Wv68ZDZuSB=j!BYl^Fadn7n\n}ʣzX{||jeC%RY5ɢf+)}eSJ{L./$+H<~<̫ܸuݰ0mu>5NI*̬Qk98nلC!6 % #l*|Oy4fW5FRD.?@&Wdu+O$Vk xQu#磻$irANhԑ$88Ofc>wfuw Qc~a 4&azMţĢam*FGthAQnJ1 uZ˲ks@W_z&bp _s:'`ie ôxs-/*P^x `o_cR,x.8'( kʕ*JP0Z~v_k|-66X*qaEL= dBje8hݟc:kx?e?jw{-ejjˢKZ=9W~ܼys048HPh+P+*/t`0҉(7&ѵh-uwv%; `EnsvQ)IBt[ #yo?j&I{v.ɭ#_swbnphJN A*9om-GHoִi^ʦDP<2|>&ڕ5r$ĢQb(1G  " O?Iroz ~Y9iǦ0 42M QD7ّdu lPO_:EP$ J&)LӤR-;6u'x0=4umzPOZu^YPO +:|bMڶcgsD<ònbZ"Z'7;O?Q Usu1}ڤsHH$D!}|!g?e[7ĶW#˹Vj#M R]ds9Bxk44._z奶9ZQպn &iR$ fZK/23;ճǎ!b~^Dz̶ta6rmO< ,sUL n]7$zyGcq</'HAw!EJ&%l.d4\s,ec+_y5#zӔ+FYXZQְLH8Ĺ'P,{ Rɇ4˫k` DK'~KXmYd6Da* Mgqy0IeuϿ<xd4ƒyf/;yf2/.Qd)2j5.?<}=I 3ԗ²,7 !MBO*EPdltz,AdfnZ`C0e6^?TCC9~x`P|^:$/bK3Tj*pbVaWQ(U-a'dڠ5ԆA0ZQt  %j Yk=T.{Se¡ G]^I0LY AVXY;S%6sE=ȱ 11>*B}^[  :]!b F&:Zw ]]?;BǦղam!˲#Tͭ3OI=k}@P8uר昳 %}}"۩ߥykI4?{[ x@ҕڊY%ɶ\njkf9._CEFefXͣI{:L"ν{ AdJe>mb0 Af'CTllnѴHcBݶm688RŻ[n{v;'?Ͽ7fyKlw;IJu2鞶|;JbPB]6/{ K/ISG6 S'Orrҭ Xr}gf#bkcyee?lnmB5fsH  P֐Dd|_z?9EfcH8"5|*W*x}>"2s躁G,˦ZD"Q9HB$ܙǘ_\2Mg+.8l6-D"5A"\`}}YV\  w^߇CQjS'Yˬׄp$t],&x„f9|`g^)j*K˫Xw.(/r٧mW_XSePa6>2D6CatX$ɘ!̀mT*b>Qds=8j riDg+I\a31tdə9d ʕ*`Ez19Դ݉# +Xϐl{x4B\ȁ1>e2ҟRqqz[XD L77y03K(_~Q $ ]#SSk׫ǨV$bQ~o!H麮#20LdYdYTriܺ(/~57f68uW"ڳ}~8C&[/$YIfva 8)jZSI$HB!旖x<0VVx)+U SJe EV(+bc9:l"`.ID#~w,M7x񳬬A sc= ]x^ Eʕ k c#C%^t@RL/|"ͥ6\ӓsy[wSm= W[p ǞrbV% Z1]Y"Vp!rmhs8c~yK_| biyY(w&J,KGwQ4 >r.Ѵ4|ε ڇfu!ŵ";Tw;cxxxjl?࿵ 󽈏^0;bvL]> ?`oݍ9kܶmⱘJpjcf6HHK7B[*J&˄B!W}YxjVkW4$qh|C4/,ĹlllѓLPo4X@{4Yoڷ {<,~tUzR JT"iXZsN4*,_O̬57ڶņG$օR,lxu[E)X,evDkץx97$n;gn~M$jwn:i/T ˲;ƳQ:ԕ."9lnmuUuηJ=8]TB# 0x,\J膉mKտmrkDvBfM(rg\r%'XK6$9 ݵR뢻-*%Fd"A:(quh4(?y:0hh:+ض%K<ɪUnߝ]WɒL|E>!:H9O?}W⹫?,8<{9} *KuVl6IEdK))H$j$b_}e_:+5a;},eU8Еi m`H>y[G!Mr7pNEZvϚ,ݹu^:玬u yRHk]>_}ҋ=ݩI*SӒ{QC}W›KbmeSswW|!c?eQ䑑$If h8dkخj\~|IX;@P/M\y388II~ޱ=h4DGYC$ΟvPR:uQ9QtEwSڿw6yZPUhau?Q-UEH$;twzGjXt/p=ZG'bzxt6;?&y#õ Ȗ癥>nu#I{#UtSO~tBPuQj-4BCl"Hp~izKgy~\RfZ*5|~'|z-( V±>nmHUxy[ sSk4)UH( L(LON`K/FEFGr|tZ4d*:'DW$Rw3kN on316B&O3ĢaWbɡVE]9}@,N?g4(1 Aair]Gd] f%̒:kTk5Q6 򅢷mnmwOxT+W^v +bIޤ(G'3Ct@ @T.CC{^S33O(vX ɟ+Z=_޽{ {g8>>RXGw@uy &]Zc@ǀG&;0=M\ò)}zijd*%|p}ϝt^"1:2k]1i?S>#NԑuŁL4 ۀo] (~=V;?zgWv{NUwM)|׼h{m˥.l~( ]RLRo4ggw}/AZllmܹ%V6 _{zNRX1>,0l@ E"q#!?94|H%b<{,;{{ĢߥިW.۲G.3SDaEfq$k"tT$&$\f+ }}ip/\g%+ y%CQd}b\ģQ%nVSՈœYZdk7K8 RkhC$hj6>GBXõMB~?`P(K Q$T2qzE{0LQ*dp8B"|~i~%>{B2/L??W_~?J2hfS:hzAZse/-:K sdr O6H&S45?dms[w 3jaY&CV8X,FCޗsLo4҅(W)}5膉qFPTA΂%Jg>;6l=.C߷ϓ6Qod 0::8KAPHr9Yfu$\ݵP(ؼ|ˡ]s}&=(/ɍy(Z^}2LD?G=Q=cer sH^`~'O>oEؠQud2ΝVy|d>؋w3T*ntw~\pkZMyOm0|#>UcY;QP h=BުfgOx"ҋlnn}_~ 9}h4%D/ޅű߷ B<>._;(d]_ ;8Y"ؑ]v*+cB[R|UlIB5,4FPU4BGleK5J}U8jx s]慥 ͎cY6,\ ,OY?as7C"4?~# Mܼs=A?Z _?B?>±C?y}}h탧N{YX=  QֈEcmlipP(GkLR5Db+lfgp2{z]_es>ao\~H8ef4u! )ry&h1 "i04`A$qZ&gggw/IB "{r{k&ƩTʼ~UשV+ࣿ! ˗9Jry0>6;:9Ο;+ --d?sѡ׃ipϓz|緹yVwBVRK~V x3{β,7~P8iT'ff(m-31\fesrvKol:<6j-U|lLHD>VVDt;&t&="h;`02dÀ[mz%=xiKmle+k_"^ crNjAϟ9 O`+OtqI%&jCGkha^M C[J(7nf?&eg_RT0Mdj(>O0-Z`zjͽs'Iz(4Mi ds1U!N&@fUo4tK+f[&5Ic|z.Ѱ4Z-~7A >l܉in}0ײXPI%³m0wbؖC3ɭA667QU ]0tM7})reG0qшȿAܲm[#/ϳqBӲI$T*UΝ=ÙKBn)TUŲYkrt@@87ݸ`Z_{\v\TXx& F{A<\_duu;y"eui/~x*/'!sXZu=߬ԣjz̛wɉ`6`M`ȱZٺΟ pyRa@s`)9:;@z^oṢ(۶;_EGaii|.׳@8D0:{ށvXsbI'N3!E>/מ*X,n$It"J6dlL(E3lzUJŇj PudEK"5)3|~NUQzblLs_# ?W?^4LS,UVklec$_ SȒ |"!rB "&,O>mģB#a7If2|7813gkgkO-MAݺHr ll L=\`rb\vFB;-Њ"uhPm[\y2?O$ˏw"a^ l90IjHTkuvl,-W?96! ݀7#" BWq.A&'DvqB:WauqD@k75767͈Ju2౼|l69@xD1 vt |@ ൷>۝_br~5,d|5cL5@Hƌٲk=jSPGI''Ul)$+X.+\100H,MMM˗T&T4r0 6P(DTxTjuqӬoh ~'' M$>pY]\?~j;6$QH'jy¡pRD_4 'Ph$BZeȲgy7DB׾-!bV${Rȕ^jlv0n gy񔐎rzD(|_xo]ͱzP=ۑ<ccl8qn߹3>3E|7d$I]%[A}Tb}c&qhg/x+̶g; wmg=tzBfFun##o7 "CT5ff7X@,bemt#L N͝ZVYY]:'N0<4/qEiqEΧSo-w&sn4;{.xiK ,̟VgO/Fmk_qxF(Xڋ'˿Q[ǶPUܽpڂܼ5E ,Οd"a[6~TuO^w;~ ]GQdnȒD_:I9spAEQ\cT""n6O+s[ۻضMRmnݹG _(plp(ă_Qhmc 8ܺsnw~=x? hZȒѶm1JȮO1 T2{]m!)'61>7Ӵ0ݽ8J%T*j~ZHlln{+4[*})TE2T(BFQh4ZnD,FPbbt" ͗0-_evyl0KD5tƆ iolF#eNL# TRN4ibl92/H0j&N᧷eGk}~D8RLh6ܾ{fAY4 1!i h$*Hub8-U# sz~Iq\9KM7895NRŴlѩf&(+4[|N64[cێ/DN5HL*Oj:}.* 'OLߗZa,|hZN\ƱmF(KD]장p$jCx }}iZ-A 7˳5?xHRAn$fll+zD0I" їNtx,±Ò2SSܽi/^n3nyvTޙ{2M*u!4lEVA3\ ؘnI'ʲ{2Hݝׇ䲎)){zi@0y:gw׺NQ(eD:y!'!$+>Ap۵^)CI_?qCTU.?KLӮ v$ rppНrgյIopݮuov`0cX\<]s;GZyox$LG]&w(4?o$6zA'|o ?7u,t:>@=='b'ѾOB:F> $LBE9Tn>R|ds>ӕwcd/:u]16ebXkXx`D"AP@wpfld"AD3,4%ƇluAܨ7[|﫯QTYIrC[8A&_?zRDDZԪ5NNQ5!36G(2} R,!KB-FqdlBT|j^$ XC IDATbms @ G388i9)*Tl(LMΝY"W(?9HlrDerm0Пfdx|3α˗'/`|M8 p}w8|u/q#'Ϝ_( p-*};⣫ J}/\Aʲ̉)=&Pf'> ?7;r|.+_eY+3-\G' Ç&(K]k>4==jgu|#Ǔ ʏ<}- $7_~%676 zcet^[^e ÞD.owD"&<'KI9.tG.7_?Dсsg0$x|C-]e6P3jTk5 WhR5`{7$+LGR#˗aRm4%h$ a`uJN&_ cۖ|n6[w >JDBAȕ/GV# Ǽ9&Ll4GDhK$}n'( uUg:@?S OOű}ËC1-hQGXowwqpg4Mt5v?c>b CNNZ>13#$4Qg&$r9VVװlۻ׶# w\ -dWbTz>{[`k{p(3S<\Yȁ>Q58SIypg"wl!8>dGH(޻3%v,&'Fyfh$L^'_(N&ig,f-3<Ԗ+%&ecۖ'f6/>,?pum,fbTx$B._4 Rժ YOaZ&"f;Li&d8jee ˲Ipܖc#KBeXBZdlGxBH \y2k~dE\vy]<5OfF|d,|?b|t1nRi4y/WKoN0bu}tٙ)M0HS GcX6 `ÒPuհhՖ Wҩ2&i24؇.' "ehz(>r Dz@9uw,j[VW-ǏSqE|i*u݉/FT|^j_ogږԱ Œ#:5Mw[ɭ]Ф^ֶ{w.˲L4MBm:_plw71N`8Ž:>X\{}>10u х{D}G/?V=<?Ÿx"{{{ -:>$ τнi299مI]8%ڟ)<Ǔ ?B,h26䖎?޻OXz"qԦw\Գ>u^=^pc u쳫1wkVG##^*=_9I>oqMNt]oJ/(~ ͠TDH)כQO,Pih@L]f+W>͇H>Z~UzBuw3?1 8X%/0JXڡZs~P!cX*Ulϳ \.%۫c GCdѠR=f[0u?lM㋯.JSôDq$zIR]K,/G?V78yb? Fo7MrPm$6w1Mnb 9}hpo/;.rC|v4 KCM˧F"J%f&(WLMST騮+jf&yWyÏ)K' SږmU{Xw p<Çgfׯt{KvOqȏk6Ecԫckb!lGs}~nVϟ#{nP1mҽ b0Y7O u{WA9{Lŋ~w:ϥs7<]@y8n4 L2ɕ,+bP(RL&)~f&$htjre;,/-[\z-U/n6O:`]70 T"F$bc{jP?c ~6|ޓ-4 5T&e )KH@?xpTZF((˫k ܨ<Yre3,B>O[:A$ iw$i@zUضػ,IrcތwCU'6{ku^A6:$Bp٢Z*ܯu]绿mn޼ݫo][bK|w~VWl{,F4M6nupOo~!+&fp—'@Pbs{Rm\<[;{,sxXY2|k| 1%>ZEe #So4x_Glή@ET\1ǶBþH_ш0t롪:;PL&QUx"NTƲLOq+4'gE,e!MDwc#KeN/ΓP,mLB˗?{˲"c&'t$MHI&H.SlmmiZiȲD&atdZuq).}Klm1qZ}$c#J%LW"KU[9+̲:er<x EK $)-Z-99;+/^hj5"rh$B4fcg[l"[;@0X*%; H%lRtlKxx*X "vhn)Itt?%L n2:<ȥgO?`/I*A`fr4rkw./^<_f PNRW[9"=d'ǰl [{MH248H\D.IAe?CC$}d eR>&&(2j 4XRjiض,9X'pgXDQ<\ayC ʵ:iqz-E,{L K\{]f"dӲ9z͝]fgiӟNQk4PuLPk[ضԪu; $,K}B gh/=,{,|xFGG7^y^A__JTА$箮K2Gt} 8+~^칳gd(>_W7_%FGF$KKUUOyu]gjrjjK̃9+/V\e|{85?uos.zTH]?{?V*ד>DVU#lnnG|Ο;G&ldGDZXyD<+6S;̣5BZ'u܎35tu{hz|'IdL~=>qPy;YcSO^LvѢgׄc㨺i.D8LOC_c{2v!?s `RjeE$CD?l6‹_৮E/4v[& Dd[TuBaO2D(H±_KH\/`\glK#RXDir,x<ϵ{+DCneuChg.,΢:fAJn8| HM>e_4ms7D1ZJ&w!T2IX{le C ,{"i1;,ȒfsG5ηkԛ-V6H$q dh~_Oo0\>^xrM7 칝xD>ޭ+IO >ȏ}}Bнŏy{gwu^C!?ᬸsDe,C +sט8}4ez Hm>-*؎`a‘PD"I"de}Ir0vT +>t@tʵ0VUJ`NTV761-Ed+/pCB70H%`k{!"aF: {_F2#aY VzO g<KMZ:-U8"^k?GJ:DzpQ ,>MP-ΞY" ЗN,| Z YpЏH ytCg_;.0hՕ. car<Ãdsy,Ӣ/EZEӄo9ٜWP|jU 4+k E͆ xy69 {,/n 'U% ȗU҉XPXLɗF[}&: ?(&QP$;J L]5(V 5Zpdziy[Ȓ0}9vR3Y DbQTda~YQ~!e2;5N&_@ r%ìn266DX% eV6wd;˶Q5S$q4J*T'LH$D!KX4i4[EahL&G$_[^^:c zB]x]S .`,=vP5h,j4MuIfxxZu~A?"Fu._ "E @q:{Mӽ};bl}>CCX[nwwrrziL$A A<4M~mp{{]5NFPTW2"O4ze˲>ɖ9CV6c:M^= ]AYw9YW"Uzddצx 䱞![OxL[7If'[@cq\9 sH۲Scmmmw;"p$Ňf覍M8N4 t2?6 eS6%c-12d>~̵+#/r#Y4LF^oGR5F_9n?Xauc|DVv,Bc4 }$;{hC8-Yh&1l!ع=~MSϜe>Xef򳏮TUf|3hm; 㰶 ğ~>ÿq e;1=IT惏qg-$(o;^F0d&Ɔ 4-:t*E(^oxsq@ی-~7qK|-\iL[ɱ={~n RVZπ :|.^81p0: I;8>( zk<'8N=#|"qc̾tinÏC:YDvwÐH$*>8a'O]9vvv}TP|~dBB(,i+H&f7^yQF_"w߻HaE$B+|7=[oH8QV9urͭpldY! AtMSq,/d(B6&8[/w$>1>Gxh/%n ]7p\?#cD|D_z>O" U;.47 хBMpW%wgtSneĉ.dﳻcly 9Q[~n? v쉙}+/釞‚>poL0)qϻ|zl.2w,zA4ek{GxmpyeHmf&'4[0!89;åg/vCƆдoMz0Es۟/%=0$JP0DFeܸrڕ_u;t̓kcskSs 5RxGtxVD"Aͦ+%_E!{Z. IDAT8$ ͦo^14Uer\H=JnWj:uRTE#TU!d"a&Xl.G42 >\vki ` [ ӗN}z\>O4uy[-vT*5}$|>w9$$If ǝcuOȶmĨUkBU7LlGxʍFh[ HE<188h"a~Ii՘B |DqY:c*=w݀8!pVVWGmIӧOL`KseqfK/^lߵ#?f3hƝV xKK;=xz坿xc')%)=uCyύ^|!3gugXpv:d*,헄4:Ѳkc蜐;N8hyΎ} +{lg)x0 BϢ\[ajj=c^`^_xHxHA6vFtSg4 t?o!*96>O1gQ$zvO!}i:ߺvd,eE1MS,W7DC!BĻ>G>_qlN?s\85%ªV8}8[ؖM8F lMEfhȤMK+ 4 \.O?d? ll9<1چЧo4%TS3X^`X (LZ %eF(Ӱx|1'*t pgHv\wq,eYdtݠ\H<4$ڟs!**%0%ݝ?{vF9}i188HREeyufHD<tރ8VlLGh뺎eپug._\m=bldR)!/a=vج.߹p$"L-#Q(EH?<1\;˗l0G8_zY e=<3ORL5Rx@bE.fp OXǎT.Ắ^`Ώ|9+ȡC,..N'aL JїP ZH$y`c>öM:Q &FϦ_\el(}M&Kk[G7BHUE"ku8TDb){pN[6qDe^z F\$<<бϜC{ǩ'u{'?=e{*ʯ:rl #ʥgtsu>F]SEtsi{'= sݽץLH?t`=Vc7 _gf~aA0Q/$7i8άIc_Rdun F.@5Pa bR=ƣ O*?)s<{[i{vNunϟ9`6x uY6ށDOϼuo 6xiNs]F E"YyUn=x')uOMQ Qa9Tc&ji]ib8.:/?uO/o<*7G}N2xIW6(k$2I5*QU?2Hhۮn=3:mgAJB?Ic-M h7ItdӲQCab8h,xsϲJ<'R,W(Wg(MMP(,c&!YEe e#a[:cȠZ$qM:i+O_fyy]|iaJNPnL:"F}}`ᄡQ1:2ҵ?SVwUnnMS;5'{g(KsR|]_ >Ş|G?Iy$2SxYx.^B\1Ya굪9Ew?GMBB&Jߏi|kfiZ;İM۶HӨJT$< >FVZog㸢hD|!>~0tiiĢ;m]qIg7C{ 2?9cj7a&JVKSl]5gO Y]h;ϱg1޷|"@`D"~3VVW#S,xluwt|w˿{W]gBO^5Hx)w.@.I\~×]Du]DGNϝ;fe'ݝo2`zzzT|p=G%QZc>ko>wK뿣qx?5(laYցa;v"e*5va$-KnqGPu@=(`h36ۣ CmQkv?UZ0z~G/MkaG9{uI,:ВBRB؎fXuR4i191IeI20:4DeՋ*_@lN' {o͵e~y{ۜ=:%t]gzrRp6.P&b,3ԟ!`~M9?:͖*Z o4B4ǩ7B&ina&Fy ݙiBM,a}+끬F\y"w IU(Hۯͻ9 FZAV|j0h45v\ŷ??ַ T|ҷ_{?̱Á D3y,wxe)ScX\<NHvy; >=:~q[{8v3 xʛo3]AQ^=`M(V+xn =q_v;8#j^@_#DyVE+gqqgB`ޕ$WFc1FGGzfd2 x-.]8ǃE#-sj6[Daҙ4Oa6cllmO]8dfI<E#RiC*hơ1!HsO=\ͭ-0t ǵ} }h4 cEEhu=oXL}=pj1~so*GvҋAߟE #â[vSL&ig^  }Rv}L,ufggyי_`uMHHXCݝ-#c{Ֆwzuo6xbf2;v|{C{z-\ shfeQVIV(ʁi6JI@$X㴽-1jTMpH$I!v1](Ķ6zD!t]CokliNQpl!Y4Z`-@"p]$4_juַ윅Ǫ/9 "e#,N2f2b, lm7Kɩ& .Slnn⺎g#퓴ɤ8#B!V'_yx,K`)d2ZmRFG#09>n35>(hCTM~Ο8aP7٧ ӇD`8b|8ǽ%\ǥPRʕ_xV7qq_&ҳ rnX[:xmҩ$jKˬolŐuFZ ,0&epIV\۶H& S.RxE4!DArd(Gd}krvAtqhFScecpXAV$E\O6Lr}6l p2y4Mgk@8B7LBHXpxrFEVñD2aE&NDsFKZ Z4&gY^]%㹂> NLg|lR(~ <]w~7oܼuKtW*[!n3u=*'^;vٹ1gjy wN_޽X IDAT>ۋ73.У'k['lzz VE,%l#IS,Ţ1_41>mp;6 >cVK HEc^mmm=Wfs LO |oܳWf?O~O]gH]T` (t<+++>_޽_¶?$wI&xc2Пe+_ >;rX!U%JrWa¶x3?^kTK~ddDCAKc{$I<{iV7ux\w&wT_>8ܛ[x/?%JRo4y%0 k-I%%o}->H8|kO)_~e%ѕtlDRQEQM),oԶiR/n"ח"{ee3Yj~ZNT̩|rz3<9Ly($SCt]<׏-<'E?דeysݑ$uRTW(pӗ7]k&CޙL&AΏkn{U=r&GRG7=vB!︫AͯO0 wsA3:T*ExLOC%c?nN{? f;1i#xcOJ7hs=דb~~x 3ncA2H}t^;'ԣ=-ݣ8`œ܇!O6Oޏk~8z]ᰯ1y@#8P=Ξ9n^nǣm(h%#+"Qd%F q\|du,ǣ=u-lf5_bPf(869z•Gxq>yD&cbccClp4#Y"!Mkpiz!r|f: dum\䗟\T75>&/^`:RX4B^'J2:2$9MRNF4MDžND]ZCHL lm-7}~}($Gߦ vZW]Pߛv&[(%X3$Ei4__[S'/50 &'xP4 cG&jq)|>,. I")K=rߝu;_f3(떖;@HnZ߮ryտqF /pMϥXmБ";oɿ3/I144խXGf =esmY*Μ9ihko/Xj3NRTwfE d 7 -`zv w;{V[_X-kpv^hߏ}Lj=QmC @CUU"(`Yx˗.f!ar!V7N9YQ)kT Μa3_I *U< 䥖W(ʨLVC H6hV) Ν:(N&Z $"NaZ_6I0H$bTk54M_dRA-Na:c]Ny U*0x>4H8 ;pJ{z;vrҝPw˗. f>E.]k$F˧׮I u~n&_񕎮^cii=NkW?ORW_o|kJs3L$y<ܹܳwotʌu6rrGaiyH8چ>"f,-/ C /<<Mu^ 3<3aҋ1ȊoZ@,uLSqɈ/e1j*Tz؂u:IXj/ڞ86$ }m$D2jlF!G2G?}_YNMi6[>9EvЙ(ƭur/MѨQC[x iXC,U=_~/iYTvq\UyضI<&kk|lf(x*ГD0$A G"I:KREVeER%LfEX&͐L'NG[Z#cZC9o092HRC>qbL8rxbc;zK1~u 2_{V7929FZ&012?L c(xXlX&VA:es[o`W7IDoе,UYVP@6C@7OaPb,.[졍fm񞃹~Ο=X"paqL:e 4L<$ag>eYRs+SY^Yu]"/>w0(A.-MRVE6AxЎCVt뚆iA^fz{.-`6TUԲ#pr( ++gHlv_Gmbi{LՀG}ͭ')v ]Z6yo gXwl-ZzzjrX[|MwYp>;| $ _/*J4c#iKR8el4beu~qPٶ0$K݌݉1ڎ9_ Ah>_`iy98sn.< $r@G)a5>>mczxWkxb,|+|`1}=, tOrFڗi f$'Z}ft&aILz$l6+$H=tZ…BdOxGgwe I ==m^=NTU;PT!(2'uL >.;84Z-F ɩ X\YCe\:O@U~__~L&C4̼LFE:)ei-NLCk89s7oR"Z ױii*(RTXZZnױb^ۄ48<4N/oAhk4 xm>;^j澹jtnd2RIMG{{g3 >ё Y]ߏ?># C.9b;d Ғ$n >?dY+Mb}9rpС:;|#@kjQ 'N`;Wyʶ@ =åeͦ:1v(s1Men3ZH83Ul!Iy2Zg._d}s3̑ͤj,<\l0s8}>{# wz{S$tEVG44?bv`.k]{>9MP]蓮\W^d/բloccY.Vcr#>Gnz_R-Jxg(A7zA7H(" S.q=T2cTqe>nHıLq^G__{Mk {}dEqd2=un5`Zv`ǎ?\s\8w5!#w]&$FGi4x:>I\g˶qlh$K%1ֱLT2EdrrĞ˝HH8 XqyHnH`n0Q 667Hw\sOL)+i409>Ƌ%LIiG'DZ 9fOp3'XYb?̑I>~GH/e,"P(7>ʽyL q:BX1}"rjםҞt9<#`zoʜ7|b.\zK+{ӧh4[Ȋ(jXW/GU>u19:ĹS3ܸs]׹q.Y 2+k 0L ] oSS/_hP7DbmY]I^'B_;Y޽¡0z}'-{u(oۻ%Oz!/ǽ{ܫ{qv|  "hK-vQ.=$Q*8w,}Y Xh1 Ǝ}{eH0ndEEMo%Ibeuu@ u]GQvOLL&zϱX+<<{̠mvwgGcdd3gN$i2w뺁(XI&dYL$:rv9}r5"[L=Ipp$~zt*džoLtq)4MR)E)xK^G$8 IDATO%g!1I q˦ZGeڝI8mN;q,+(`#wj+xE$x_˲wuD;ߥi,SxT\W.]O?uRH,4/Fm?^ǻuGG5-((Y<4V[>7t|3q??sw #"k*`cD%{_🿹;e:rD"\I\ϥVL<. [op}&D!6I$lЗ6+kk>ctDvo.;C__k)"a>G6?gR,}˴-K,ͤ`) |iO$q aHlX09srrʛĵ[w0-7^y3fdX[[cSVu`q>kN5xum-o-=/^:m!@E(b!+5͗mFG1 W%Oy2MS^jdRx9'kYQTY#lll j[[s '7;i٤S)~~QWڹ4>ɤisgN1M${ #1gxJՋg.hj~C"i ?/Wk %M&(D10r T&#:&ql `;~F/ڜhRTX][C%>D<hu|V3O]"LϓIy eY|]|%PT2)D0\*nǠۗ}ݹwfj˲DxЀx=g:\{cFI4E#a{ INggwt= 03 CEIJ+k#pa:CwױZ-!wgwUޙYY== Έ]WV{(p2 hP_N׬sDZ…Ff[:y=fnG2g`=XN=s)+p7‘FAKss$\%ty6a{wCvUw_ zWM{dN8|.\`6~ql㣂{Y)6wF; <T^C(p: zv+/Kj)H%^s?11μYp6|{`: b]Tk |w8s8ݼA#/`ieۙmضӑZ,5BC©'`Y掞}IS,G'.]D0@P"x}q,t\xd(" 0tݻ܁_u 4p2= م&"8H bpZ=iܹۙ B Lv= qXX\,][SI1ĢQ|W^*^|YT> Vo a+:tFtnFM@q{ yzHJ, U܁j!FNZt DS"I4L #" CT Z˲R5խ,o|?z|s\}p=Qh6+4("LWeAi(7Zxfqp1ܹYqMEȒ\.fɬm@eV <}8n'RZ\:"ᐗ+dסY~^'"lWCIZՓTUF]8\;\k[ݰnmIaPFp7mF8,Ͳh:f@5TJsmA*:@W%'?Q_]7Н֬K?\Ūky[6>>zșG`v{ @儶I)$Hx^$x<]mzX;pph4}G N q@X/a(VH#~{f5%8>z՚cѴד.g/3^C3@xm{.s~9{wV\BOb#8PҐ,O{ނ8 s~7~t=}3Y[uzEQ$V9xo![`phզ YP 2D@"0ЗF<8ҳW.SxqTjM蚎d+(U8>3ES0=ݠA2,9$Πhh4[HSu߻&x뿂+xz"//@2GVg^z׿Tx3#` ;y|Rleb s3(J]qL ~|p\[[g/cp6^zIcO8\>O%ZJ5O:ln'+?wx^N?饋nyCu"X3}CWUz_;qh&DzLm6j3LgNE&_DPBx͋jF`&Z&4M805MD<a蚷dž$4S)1WVصMR4HW^ze@td='2l  ]Y$j,K4Tku "C7LS)pl=i² ߡ*rLL6P(fE!"TM`?P*ܳhxAthL d8aq|1*膁h4T2LWOv{̞=wL.zgN 3YC<} <\\sT1)!"R>7n" QԱq籾:cF#lmoSF`)(%"lֶKh8p;(˳X/jxfJ$ҩL,h\oQe(BEp̆jgU,E lر#d1?w.R)SAZS5V[Qv+eåU,R *{,K4>v$aj:,F" ` G0 TMaR@iR5pYp8968qwmAp18Ey391UU12<|>ES J"^+`#hZ A8Dٙ)d\4"U(,DBƆ:@-ؐDhBcae ġ1<ƆY^ z[L"Bx x  86DCQql;} 7n-CFB8B!| ƭ{dYgMX|`[5oDZw􀭖:YKpx<>~iO$= zoу:uK3<70Biqc1,]~j_$u'<;5<<< M7h._:C,n"azy33(C\k`im Eha vIāIi;X" c;_IJ[gN$ai1u\Gka]޻ﱚv̌XO+~b|rbb9^;zC(/P>v~.L뮢> sD- v O2f=ysAȐLB`kx%P+I\y=[=|n]0C׾\ғ U0d Z` p ;^t$ֽ4Z ' p1,bnv'>{[daf&f A큣ANOU# SJiHc-_j5z mCCT.=>6⭯n999)>DQęӧFP^5yϵU膁zQg4m{(/ۃ{<Gwm޽w'Lv7|ޗݱ li@Ucʈ&.<&'0 |_ƭw ͦ$GI=o _wx}n x@ٿLOMvdb>xԫTF @Xc_7oR,vju (0 }}PUCPT i6Pmؐ8RY$"B&{;lX,X %FP,Uz jl}p!ٙi(K F6 X˫0mh8 p-Z&U>u]֭յ5d9~X,]7k;|RzV;a&Y2۾ ]cmB~CٶY>[B P(`3-)mZN:MӠ:O?ĿIA:t?c|to]yAUUܸu8>ͷqt~a!?Im؎C2n9ڡ醆z äJ#sfsh ˴`ۖp$xM@8޳D dsP5 Hi# KyJXCkP8f T1<40a&f&DZ?o_0>;3u 8y * Ο9"mrlBZ, 4cCX\@'ȕq0 IDATGBdH"C3h(0`:) aY2m2cg:RT@<G 2b(tvx(xau} mЁi<\ZA"g}Mשʞ.~[Atpp][ L pa<Ν>JP0TzPZe4[ vKp}Pk&,a>wdSJVk0 :0 p0N<k!eH@kS[s^ȱmģ-Rbk722z:1Fh^GW.yض+JK,qf<Ѯ)\% i>U)2 Bun3/Ǘ&׿ܾs2a!ߺILhk2lā$^MoqPvWG,qL_IE;EQv-u[g5:݆A+06{#H];5Huߩ\|x!~yĭ{du8s$v|g7q(s{t"l€Z JQ+kpzƔUJXՙAvENtW:G!z='T۾5z{OG i(xlM;Xnn(s3tp!\tY/4䚴[wQڢſ(J jL008R/0;;jS ET-qdeԚ "ƇlK80> Y\CfL S(cjWP*%,mAq8.,߾MmAxlmn!,SK4];Y@>@BRE8@6_4 A0l ,0mpO *DFKi[ e, CTX!&#ömK Zo&~as;mvY՛XDX֮x,FG2MܸsaHch4@Bj M|?:Μ:Lm2e,*m[&¡tMNq4BIs!JX(t9C^]bVR+N~qɳPmAt8tګ]IƷ港2bP۩`˃M  uNs=/#0wc.@~P(fݚ^kedFiZ[[oX[m6eW=WEs[pR ljא`;G`jj  uzoҢ B<E l88mIy GU5 m#AQXT2S'la.;xjb r4MDQ%C!,R7;(A`V'c{{6D5_hҵ%S'q 0;3:ceZ6M(>\zܽ&GaFО2;zNS|KKxqBXa(ـ((rr9t">;F`U iXJ82h%Zkffr4SihUƢl3k*E{0;*6pHơO>~  "_(a}@#ρ67ǃ%pYm lBE$q+p8A[0@4ja{L a$۶ "]Y Džgòlu( &ҩ O@t) Tj5 o" #W*! \_"z*逻j62<L[B]0<Џb ǶQ*17;lX4 2샦h0 AiV@ t K%L{ `0O`+Ϝ5_D`Y6V֡8^@:`MP5O:rapP7qwh^i!W*ck;G끰 !<PְP)bh#Ch4<.>wh蚎@@F\aPbUm80=mhb,SG"aFypa4Ma` A4`&})lln!@iFIuj|t#:w(ٝ' w{;   XC??[τHGnF{ -5S%+Bh~U)0M$sӯ0k'pS .i%Êno呌{8z+J8cV5-X{!I?jc?~oH.IHdwvU;u6/8yk_cy`` =8;r-ԳSÃ% ejp( Ѕ۰lBAUpab| X+x$cfz1Qi6cY\qp"+xYGK)ό hxi@ptz rC8V638q`?y~3w#ǿ5kh6d FQT тT`:6N JhRP P#lh"gB4_{]ó K151u RL&aYD?{kF }w Ҕĺ(;1Z!"ɥ>hX-X9 =S"xr$$t(*?@}yUcO}|#~Z\ZTm x,!7mƃP8Mki $TM$`o/W+FGg?A\sX SΟTMs(TÀ(D FR pGc ׾w4 !T.#L^!UTkn/[S=8>4͎zDUU 8;e!N' >6I$޷$o:y޾=Ç2pVfS<v_.,xͅױU*+r778 ]NL#u\#3uyo?jab| zÓ 05=>q[t%6LOdu RTEXJ2, V#JylfP,WߗB%;2>F&Q}P] $404Dh$afatd#C(+(l1#s4յc>|_ŇWw; NS+דe yKe\*=# @@|N?Mj}(JhAH$L`}KwkFX\\( ei#R8T*ev}qNR_r'ЅLv[]LlT rtAL&4/BXi(UUq y+UB^9p<CcQ5p]g6xzWqS drp+B?:i{ԩ:AjLP1w E4Cye\=O5l/ >s<Zpg I&L/7QV 7~ʷ\aX0LIģXߤ1ӓxԪu jLbFS!(KTIL@bEm@8pq udۙ,f')lc3x4F_2 D"E^m #PUϡh'pC0=5BZ7>e;Ǎ;*LT8@8P-D[ler2cC_Q7aZDQ՛4pq f&8ϞE8[q<>sdC4An_0-"L೯+\OF._,h4(@qgt*Ӵ@ihDxzۿ,afPt0q^ztXtx TV`0HʊݻN`^a[fuL;4Hw=AC@i~kpO4M7<2cb|fM2B7 \q@fȲâI$4 LLCf4Bq_GX*rs"m "AbeMgG:#^ﻳ8zL‘(._Ĕ\ϝMvgι5KԉF=C0 X!;~5 ِH֞;In[T)I;]5R/r[k"\pftd*I'U!ύq7ozIeNH Te*:/zY̹dG)R4˒ G٣G4@9TU^m |ohٶ˘CCYnyLNM lضsܓkw^JD">@m?®÷_eY\}lynF7$pvhl0OuE.͏9yZi7-T !h"To~3!H89i\X8DA4 +8{dGf&+'{8\Ǵ*Zyt,t/EiBU,X,"ajm\.c/IDeBu q4<O@\!fgY lT`}+u;}ciua|tW> Lac;|E|x6LӄäƼ lڭ{CH']N n{@jJe8xJ I*U蚆p0Ӡ|?_,-LR p`( W(¶\uqLIz;^9o?2wW?'?xg?o~DBmJ&("_<a.F??[oǎbm}÷Nm%{TG*@ճ -X`owa:63 }#'@&#X:YD(@/|%݃]?`e```_s! \>jx|_;D`wn$I; bLHq_ͻqAd%hY%q,&q(()I"DA"8ڦ9~\(bbdHjpB Hp2DYaPuiGo>D#+ýE ZP!"V7SgQ0:<M7!>X$ JsL,-/#LBxmA~384s1ll;o;j#(k,{p{&]}:_OG$zk3?ѨDs~(0Pց)T*/{w۽gcchjպNLDĺkmK2jϔMc=kVͲok ro47LhY( lF\:r^y=>%QrGz[<!:_<ܽ`0BA5ey3Gev~2(ggKDxA 2/6n<,^XJ}Cmc3yGه u>Tbov]wC}2/NDpY<]S$x^n&hpl(BPD@D\|Y,ؑ9$ kup(a IDATp8xڧ<@ nhCh쒃@Xm>vŞ(+ .xwNy8z}>:MA pX6-I8 j"2lB LBQ5ABd,ۂaZ `*w3-@[$Sy՗J%߰wڣ' bq/_&ud?SSjs8s<‘(xH lߏzmZWmf AQ D"M L'Jxs|FSe|=ƽeTkuedk6k`XE54p(wz:=ů0Mc#èmHc /lr|+]6mP]M`CAƂso?~{5\/)}K=l.uRF_3O?ͭ5}Zm{֢FCږ_B_TwxX2Gˀ'`rbZٗXh{adQ鞫B攸S`)hOF&O92j&FQ,051 K"166w!u"LCI"10yr;pzݦݟ]w SUU;{)_17mBXnu;МZ7}a8q= FlPC׋d2L6FYj ܓA5hBeu8ay_:H(fO)1U7 dž* (Cmdz`s: HRjќ+ A>* })p@Y %^GGh0as{f$K"RI_XD0 CY !V5i5ɒ4sԪLOQoPqpa#d,EQaY&brΜ<- %LcdhblT ?y ~K?} x `s;˲Š:Ν9BCX۠H8)*UGޠv汕N&s +!4L%e' ?8 A@$@Fs$G4@F0 S(Wk5c‘CP֠j D l6h6x{-EATuh}k- eS RŒih) c<ZJ wI {Y}֭@t6{ ~*7ٖW0k&L[,Ñ۳Ij[CTB,uzvD^Q׌6hs`rdycnd'swq N-ѺN;jĝٝ/]Uu3G"=9C%B kp8ԩrz;9_.0!ɲ԰BQTfK>NI! $ 8J,ąg&ugn(²\. Chj;:Z.vWE3l;$IS9ۡ~yGcgE*J][Kv6Su^כus7=z{z2 UF;r<-h˨~l<N:.W<((;%C4v?Oo>?XFBDCp e "DIaKA3 8uW`tV6 "(Ν9+Pu $B-Lx$q?:q,\mSXZ7Ywp͏j宁rKW>V76=bd Bo|ullgPT/AlHh8ޠL埿xǵiB3 !5cW:̹XZY HcxYu9C5l}_õ7۬( 8y2mK%P+k$vc>'DΣG;$c<^wfgJQ?.YY~P#` }_{mtMx8BY14P hstȬR4eܛHgbc_3"#2^l&%RH--jƚcf`˶  ~3Gc2@,J3ܚުܷ{7"#9 $*32.mvXŅEMpO,@buD,c!ϞX4I vmUXtQx X ~?eY“oG?,B:ױ˔DtF %&ytiI(50MR( jnvKP匇˗.a?Le3]ȣK-Qs6wl~Ӆ }IX؜UAO$#t`=:9דh$2N̍0Ov*8`eeZ3zPU2UC%t:ȊTR뺎vG4PU u2c0uqyTuhA7Ծgu:ˁGar%RIU e\LOxKv:.Py֑g<Qo{.' (y,CDpǮkrYpZ`[i;܁1 嗮^El8A<LkDdቢ$6_pdom4tb?," Ces=6ppT£'x cgd,:D,x"Fl< .fdkT uI$݃#cQ$QhHޣm80~˲qau<&"6f DOvHfB(b Nhgj:26,DZGK]F&EtN#!B7x {{{- AD:U{l}I2Yg7e-u's!r`x 콉DT;[b]@^ PVlqF $3*j ?$u=RՈ}i)g2Pd5I*9K8caߧ'Ɓ:ˊ΃s-ןs^,bccc(BvwvO<R C}b~>AwI"y ȳ|H㬮} %`JsnvL2ka Ƿ헞Ula 3KSq z0E⋪"5\g9"c˦FzDŽy}}}l}G޼yc4 )=?,|T [z~ ,x`Ɖ ܟ׼JB$ô!)!sDIF0,Dj [(*M/߼rL&PkܛdpM ">SdR v[/co7_F<|6vv^C<18aɟ0 |WJwC`--cgo*D@_KHtXBa2$KeS)2Fcۃ)X_wx89Ӌၦ#}6E~0kߛ&2?g {,η~ًyRL6C'A?j%ubvfݞ ˶q<4cT7m ^q!:\C<G,IEaZp 쬐WogAҬF"ȤS;+x`>* 0fC_7tcƯlQ[x"A88PTa;.&;1$ 5Y$eS/J}ĝ۷+uyLTkאIÞPkRdԛ-j^ZnIpt\oG8vx;xxe5娗{t0 Y2<@"GB2`-?$\۶ E!C"^EX)FQ6/FuSkg\A#Aׯ<5fgHQdS{IF7ཾ/assֽczkަ 32MZI:>< #kr8cMM,z;''K//'cH+>Iq8unMG"ka$in>Mj:8^et=SD < p8Օe-$IT5Vfclo~jesmgAlx Ы*E8 D0-3x^65 cpd2'y|+ùU +DbEŸ/<˛l6Vŧw?ckxD"6 {YQ:T5@s>q@e9fqtodTcӬ<8H$ p`E(jybsM "4MxWl&U`&tCy\.ϭ׉͕HnOtap8vWe`' A馅n U8 8?%ى.өpC桛\g!H6'!#JqjxAj8B^::>&=C!aY6&iXoeb$eY8>&@}0]ۂ( C$uh u  6 A Ejp,TDQ0;rxu].Y Q\cfzmɾi:H "ð-'&I4&5Z B*&s0MwP5 <eOe8  \axM(钮k/.,h N`-4z$IAXp4DXueTL^F^d#2w~|=WT.ڠn#N c 6㌴8Sb-~7? ;yJFX|eOH^NX"9{iz]3uDQض"9>&HF~ID6òS-ŷ(3DJq .C}7C D<y}aVh>8 E8x|5@ҫB!d3Lsl&xQ! hT8.qq25Ld[E'xVWCbfroh+米)ZOPȡRCUUsx G\FHa&Vfh4P5Rt:ؖ 0]qIH@#$K>å:8奥E<2As?Xjjjht޻7}SJ(X`k0@xt7/TDG/^.RhH&q[8,CEŽCK78Hd2P5j c݁Lh- ։n\ZE{!2*2TT./!z u*&ˏX[ZQ7^6~?«7nq}4MHgHdxI,˄A͋agwnj|'&9 0Q"f)s3 A l݌E^ZzֿC}qgTa1:X=szD7#~U ֯G ޡck%S!L-ϰ:1>Qo<#uj}@F#p, ^|nZtx#6'fɼ*<˿qT`QL&JƬ}k%IL$v!P[D hCHPqi%=9l?c,ku%jmf[:Yu}"j$ G&YRx[7^VϠlضBf Y)ihPdvMt݀_Z\dolPuDZl6!"iv1+S*o,1ԟu)h LwOW83xlJRT}xPDu8U7\__g,g\aS=܃QlM_u1zn7+u#LuIOkH dʴhuÈ#@k0L/w{c; Z2ffj^ ~އ 㕗.nwK%P֡=zͺ\w _<"$Ku;-ɴm˄m;1Y I(*]]X?OP7z@.Aƿ?'|}dAx04󕛸1˦x!E8.Wi}\pNF$2~!?H_fl;{n [rme \qq,K%]]F e!JBU5Lsƈ03U@\48vQ(QV ϟ Q{VN͒ͤ!+_`qz>eMp =s':={z{qt oUU7`yzbqx8ƏMӯj0lQC^:vE7fyp.x|3"AH@. p$R/zzݽ=(B}] BY0@Ts"jH&h4ۘ$"%Tk,Ie3ؼ =x1hQXS`s, I2Lˆ(J<tGx 4NO|p*%a &2ì(IE (Wj% r  T!?HD*`R(څs6{1?3t2Y*dIoAC6sԂc]a[풐Wz7M(-87MTk5nڶ=h]2\,0 1fdlA}/0yzG"lu)VWjnUըG`֛_ސsjF=.]O66wP),Qg՛l}ygjK/>fn4 #'?cIv!I"_m31r;8K x1^`9rTD"!ؖ|j\g"ez.S41c@0{EdGY#R+<is,_T14808F]'5 ub{g@a,$Lài46,6!"tR5,-Σb~v{EFI,tÄOL@$:= D jsE> }JמA)nLX2tĭ/E_x Y~x1._GZYR'FZ(I%p}t!v va}tp9HX;B m`x( pmi"7eHeӌ, ,2{N]|=x+Ko*~Guz*QLO[=IqEX`&2NWD:jd,sx Ƕ0@SWj63?FiBx5 ,ͅQp<_˲07;Gvvh0N8hJؾ ٵ5TU\rzal- $TzPq .I(2U $ 9 @󨚖XMQM\DQ+Ȳ<56ecthQE8n2}ӣW`y"#.4dH-BIaHJ(^Qout9>MTmb 'k똛NE 97nb\nhOE7"Zvqy;],,̣h\֪(UeI$%'Ky$̦O$OT5 44PJDM=p,; J$&aSU`Y6f2 MH$>U37iޣU?i L@Ȟvޜ* YWv<CE8fs$ v?mi]"9ʸ68:<|\g4"2&< XT~XB/xPmQ BSTż s@u9qo2.4YCnM-$P%vhp9}㱸@/5n@f.  c~nN B<'s68>~H8YP7&DQDA&E:p*rnPk4o w?"ayv [{\V 2蒱˄@}w +PU"$KpaRLݦ ]?ĉ }]R`ēǡX,cb" Ӳ07fK؞U7871"0Xۯ]lQk4q%K,4˦{dϟ?$G=L!N˼{౺fPy:~_1˲mh}Zo3az7GJE<k dHՠf"v8z/ < }lBv?x2\'ҏ:x,#ۿ-ܽ{ŀ% 2>9Xi̊l:pW(LA$YYFR ytÂh .m<,ہ$+gWϠhBQ]r9b'qnPI ɐשdvs]pfٵyKb/ Y-H`kZ1:!JA7L2x\zJ @Qdzv{XY^t8%ET#kR"*Aۃm;xW`Z^sG[:>ل$H&dgϡ0g>ϒ<MD6l&}dYwc NUQAE8D!J&$ǣlNKKݲl\|{ <JRI] ~ɢNgL mב_;D EO)fU _39쥽g#`ޠ૥=piQ3w,R rB8Jp$VT"qAOh6[д>0F~Q%B*BarUay,uzX\o1@2~MC>Gsku{][C O%@ ǥ2 SuWeGyrd aɤtUܹ} G4̅kШ˷pEc( lB""-8 L1UDCق|+L}Mckf,lifjܵ6U6 zzu]}ܼJ?8Tv{p|.c;]W͝=dΞA4¥skvv:8=UEN2~ˤdk4g3P{*:.t-(D,VQ\8w %LNd g"C_Ӱ !ۢݽE&C e38Xgqp5t{]Ta=Ue5IA!Z( ]C]8z8j%C "Ea9z#W&(k߶,APd;۶%ؿkWs>p4{X]=~F #j9_/xBoA{( +#NCtdD-eE}`?Kj(bY4MvF8ftxţ#`|{%z.!H cDY555R IQְ0?V̳fgQ*W0|!Lq<?,؎3do5==q: fPP^ǝW^DA@RE"GV>gYuh\n&_X ٝ)&Yx9|"@mD=gC~0`Y6Ν=U}HU`6Q7 H%h4e1t3Pz'M( ($&lb$KߡzvhZ~qb̬etvy5"3A,J!AJwF#D>=3gҘqᨥ/s^[n,N9oCAK8<:b2-\`)T lx,o+74_ ӻCLAnG8)`-: =(C}v?x! IֵW`6c# Y<.`T6]8&xAaZl"cEQd2JnOnxiCQBEd~> (ʰlw?dVbwGp<+/߄j 93=˲_ w IDAT GtpH#mZD^/>Bۃn,hͷ#,ژCH q\LNscAxr:@|5l쌰8O]wMS5b1D  ;<ꩂ>mwRdHhYYt{|eXB;@8 pY&dN(xnFyxv<ɑ Ld{_bw  ö$bQKpmNDZ <"a&Bm3sI· vTyd3m&Y>@XD"AG7Lqyێjp8u H"ecz)s[8.NR̯)SzA)JO#;5*}KYF_Kg,ͩ K + z$ Q y9h;4 cR$CD8fdY |*~FoPwcHP8BRcQ:Tuٽկ'O7a6;33(fܑԞ+h4̊)80'D:' v\bqqL ` 4[ ٢/"J{ړY,-.ѓ#u uѢK2,Xpr/$Cl,`7n}c\9ɣc,Ҷ_z<ߝs~0S!(ڋ*x6S! c΢>\Hqݴa6{xQB2DW`XdDatB{ @ @h4J}'`X#ov{ᔇΣR)FjЄoll?ʗł^ 6nHٳgȘNz 2O!rȠA$YV$c{wH㰠9Q`ZĿ> 4 IdQm5u@MjD,L˂x 8rH GôJDQBJh1eף~?#FjweU$loPa[4콈Z\/`#E_EQ]Ho yca/@%>Lb*vRוjNjY^"@0TMc} t:C XϭakP>=|uqpTs?,"0Aт纘.xgQ* &Z6Pա:ILZF`MVkx H@s Bi"V, A6PĘP0L ^E+xHđU5Bp8s9Tj }b{m$#8z%hZ2]Tfy|zxi;% xo~| 4Mt{=va $? [7?,Ih4[t;x 8r쓵)!xTp3x"K~(;,YոۣlVF]KU) p(+ e2D"ð:4 D<c;J J.Q5i>4j<\(+r(H%xP8"YB.AÛwn.%AERi ۲a֠(!4[x% 6W$ X pjGMq xdLPGC2?E# =x>7a&'suv{yϮ byifڐLU}]'*JEOLѽ09nGq\_| BDf 2W@$ańc8taf84}7\q(֛0L_|6AjJJl& EQ07=#ģ!|  ӂ8Hţ-d#I"0;EE]:@x67_Žn\{ E}-):a,o2 Ţ0 v38. "J"a_HΑ )HRC`q.coYԂkd-C`T#Cj<σ"`uu(8pGm\nãkTOK8pMqcɡsl"NwsSU"xZs,..4ӕ"~=t;=hv!(^}-#] btÀȌ lt~~obs{ӓxdZxE{.aŕ<dbblE*0)DC7[=A8.@]G9~$7ׇYF@vF x|Ž>9ba@BM$ODdDY]}L=;;3]rH MJ2eJdY W?_ؒ!HH];;=}}Wew_~uu YVʮ̌x~|/8PToWxAnl.ǫwPo4a"? ]fhx8VZ0._feM\8c#G8^M+յfwo8`}cV92?# 4[m"g "DQ$f 7Dk_xUR]*,KE>n\.wl(pxhHdN̅X[ߐ9Oq PU[7M$-N'E 9_>$G!7o\gG^mG xN}N[2_9Qv$ ESSwMkE)c :gt ҢK.Xo:.aۢ&'2Kd$Dֳtנg2(j y[|C"g9XX6aY6rQn( _U.2D1'?O̢**9 :jjaΟgk{O0⸞X,KNid;>~6U,"VtqiĊB.gyM8fwWdeL]y>8jEQUlmm:[̰_Oa]]zjwbG|@09(* K+舘I CĿe.Tľfr|F KÕrգT,0=5Pۯj\1~/xxt|d~vfR>Uvy w0ݱX[trݽR-1 *eO|YHS8fhp&$U֍/B̔hSf|e Lb&s*2GLGמq9C>Q7?/nzѿs?ض}gCvGQ(5+-X;&`_PTA.̥ @3mTfNkWٕV:~q3zjjNŋ˞e/A xCIOZ1:§’fbLˣC"RQL2z;Ks&< <UR{E_JTR]k?X,bY=b*V+6`Jod1t78 Eaȕ˗鳓XDTddxXm'UeB:2 uDPBFF&`\Mˠ(*|#7\r\6 ^Qiu%]3so ʉq7ceYײ(((K%>a+k| lHx7?OťBT%\rJq8GɺSoJ몃3bP,'Eazj' ;`ggɉqq޻_qхmTpҒDhĐ.eQzcY]+pf^MֵkWn$SjEJ16_L06:Bfw iA@Zva(X֚* ӓ,kϱGv}_zCDz0LqZtm:]K l{\rݔ%T@@G.~31>J!j; V340aTe,"ˋIޗodm}0y(g8a@T¶-|ߧX,Wef1I3JO_Uy+j<Q"|jZc~}j7آX( r G?Kvh;xsN8iGן{_T,MCʏ7ba#͊0 (Xآy>R_eqyeL[34MX㖊MR|TUWFp\WdO !=q/wQ%`Di=ť%fgfxis}_Z )vV*#^GI(U (2CQƐ гEdMqU,1 EQp E_o*CCCmг&''h4l)ydA좫UV ڝ.i1(owk&'ۣj穪 ynݼ= KɈR8%sX]{E=t8iK5*8y>>Wv{0*/?|ھ`g2R_/ 2@rt 2LH 8}j&nұzLMMhu1 ?ӿfo-qe6vir>j #P2*+ܽu?Z$\HA7L*L?=zK\G L [b>6YkX@MRoCS5\WXYݾv5 u?| wGyT5Qxջ,,-͚nz2HqxpPT1*볼(*,N#l|&x"@VO\:( ֵK|~`%n( |uwxXZ^0 gqo{ރt}˫k}H6`ʻZjDz'$Z{嗄 iP.q`%B>˟CYCfe&Q8|+ ٬Ik͚rnKGth+XWH#1KZɤ&^7D8,&S@u0n.bl5$/a ?* _x(J,]ˢR.xa'\r]brI& KFGJ9y$K8+j58>ʡ܍BTd[M֗yvRirDv/S;UUgE՘!QDo~>+kq ٯ7#191Nst?͙i?+<\X4BTR.teT*dɆ8'׶ssQLeumiZh=ef$BhJٖy q(Kw}u`m{PrS%P4 8+qLVQ O0 ̕8SՈ9P9&CE~AAS}J20:2 (؎ܺy=~ga( $k{N(FXgۨȇm[Z)Da红R1Y6c#C// 31XPۯ3?;Mfh@YC#Ct:]r," T,h3:.gVgZYbݣic"'Q[Vi4b.g-'X%L 180"'O.i/]]VoY=fg׹Pj+atOθT\.%4Daάyy?Gb<_, n'rEHϓcxxTɹs"/?Kw(a`"lk Ӕ`G$}|! Pd9 +wnٽworC8d ClM Bv 937KvR؞mc:A _Wei( Ξhi#Up9l!lqTE E܀PET`l" n^O y`b0##CLON{_P*PT V'mb<<=9.JK(nĦq]FGVobiyEp9Gߺq{Uq\{۴m:sɉqȋJs*TR)>y\`AFd{HT| ]gjjR|_Ե޹|]KNz?EhzTGQK7=<>0<2"S& UU_>+˯w~>;cY~'LLXZ??O'gf7ӟ2_@QyXX\bNf)Y FճC|b1!k?4L667˩d0tN?7^d}c\^8wfV.EkK6ITu拇vEƇh/^g!,T%utxNC{5c||Or6zFzgG'XA 1cY~|9L9%^@r4m]n9P4LIʤG):\t@H+W. Ca|:2 #RC,w<>,lv F ]O Ka_H|Pa=l6 ry<ӧ)hr5ٳ*bms\6iC/&V[{u&&}߫xn͝ǟ?$!bT:]\<t{.33ol)**~KCs\XQeR5Mz3sPUYvk{#ݹQeX"{UAQ2R "\`3-D"0ke !)<_onŶ%@\.j2FQEثp]S7yR* mS*O~rB%rY(dkgB.+@ͭm rO.ad2|EFeocJVFd2 V UllnQ*pi2>:aI"k꘺AX;8ԌxȚ)fz..`:Ϻ76GP{P!>M9~y2o)Xs!?wtoHKGMӘJs* \p^r\1rOET*:ߒ AݯST- jy3N)ۣȜ$1bds]wX@dRLߗΥ AQiwKX[ߤXɂs¶ &K¢IOi`I+!Z6ݮf2pn ++rY4Mñm 30h">LTA:c;.z&C4hZR0 {!"D_J8E8gi^d(!mF۞%l h]2$L =ic( ﲰcs34[-8fsk71d&Zaatt-|?`zjUQٯ7׳1 ?|ډkXX=$%]VQ1#ayU3gM my&T*h8t#'|af=7yu]F9/>k={2y<v<AGȣgW< H8sf{85wDazB>ō6_MuF:y&ˠ$CQoX7 U*qEyXRp V(XaS,yٹ"KkT%j6=9ʥ[Z~X6~xZv}Vjt]E( q2ku}ҵllǥ.:̌rYV7Yfdh-.c|t831&UQ1 r 2,-׵:x 5\#!\?I\/kޓ. OWee{ fxD{>aws4)% Kхs)$c>H=(q̏ѡE4/~,#J۵*O(jx=|ث)t=OY|*=#1>t*Ϯ7/tR*9=9x$T3S2 XLťlfhpu.%\~ V6vfzJ;z2L0D'(rd۪wh6e/ 췦&'ii8372lfi۵1)xU3xҟ}Y,"zLzyDuMn 0H;50C[߆a@|$9UE%BL%[LJd P3+%X!(ݷ_#c(& dbٶl \8/±=8v~ { fD1S؎z㕻,my>qx`bQ.Mla||51 ݯœKd41BYt,/a)8$: BTvwkZE2#Gt"fjB)!J gi)B^([IxV(Q ]tT>iǝjU7"ؑ }wT(jw-Q^MF(UJj4==M!7^{ Ea!l7ahhݽ'd͝5M\b\*P IDAT^gmcS>\1R8.2vhpN/wO1M|R2o*Ki=d4&'su&L8Q$J0$aHfq=(bltړ5MLCOXxٻR Eb/JL_[.} :‘wB56b2=}MV_!O.daAyX2JkǮɃ`6K.UMH"ǃCTU\'5epfh;| (VxWG7 y2E~S,"E!"oܽIGщPVxE.Op']ձ7.K٦Zʳo|v1糸Fbj|m~> eaeC9.SImi(Kg<48e``(qePT|yU2bv!]Ad[,nX4[L*ׯ\9W/tq%7TW/' 2Y=tFlTZxx R0C4u2N)zFK2 Om4ѴiwBv4=Ԝx*'f|('Pjr'+>jR"=IKPyNtc mѐCCΡsYKדQn7U@RtT]399A= 9zMC>A*㸇ՊPR`,Ҧhu4H ,[0L~hQ,h|W"VݵdtZ.?g_%Rnj X\\bpr(A|+ r&D FQ\% eСs4%a{ {.YX&N' y#;i Y4cVWΟYS@ApO֑TGf? ɩI:ݎ;B޾p1Hx$a6'lT-[`jQsfnNVq\̊:cv-]ȃO0tb!OTl!vvw1MCgMa ۵>Ro4i<|m|J3Whpg˲(J$%!ב=MBdz^~' /wezz iԳgϒdBeOc q,>?Z|wET_UrPgy(ZnK%\Ϯet\? FCXӳ]rn7_}?Oiw{خNqE:jt{6 ]bus\g}g%anzRȃ &Fr~B>.6W͟|r?xur@^gϟMó6wHqDQ̝[ױz6Ewﰾ0Y]BQUưm|KO>Mpn~f͙),b G?emsn\aqy0?E\8K0'1<4eYZK0iKثdՉ_w˟~,).󜛟wJ>/\e*V&|=FY^YRPK 9ePŁi}盿 `K`'6&spS5i/b_X?_Ooǜ:+<}pGPY#hsZֻw8{t_<|@+mjr(y ^y'K+9-j&]XKR0 z燂ToR*(K|HoO~v0a7YffjF 837_|9?idb}{[W/ۿ=_|ճ_`}s R@ujvfxғ{pJ;;\876eמ;{z.O7a&J j YtxfvFj$B9zP֨JzC(,˒ B}>ln PYrY~qQp(JHԤh(࡜c'I*t Cʗʥcoa洌'}fffN{!V_fv=Jv쬌niԺh2;3Ek17=eh6[X^&NѤ^S.p]'i]KXK4MzlNvZf 4I0ͤgȞL#rYWu|O `fzUZa"nϕzf⬢\zE$(#l5-CdhpXڼ&^O֛8 X\^Ma2fw~'3+>Pэg{!5\aiWC*$7$[vHCdY-k7.%9GߍFP]Y*!Ų2уit*} &X? I h %i?JͫQh;}dSfK}틟\(\cɕ+L+r"X?sW/ >]^_+rseR|ӗPXgc7(anulX$LG)Uj8W/skiRo.\Po24-&P}*VRi`Ս-8i/6zs",b;Y|wɟܰsZ1ﮬy6@]D:͍wt:ضT)J<5{*7nE57uw)2 _zEVVɲnv;{mj.bzr5~5_?~KSx.w.;Tku]yviZfC*|=j赸:@,Zn=vQVj{+?F&_{#AǑR=E󳸸"\o. E ô9}zȊ­Un]!_ F,+LMM8O{2hi&χf-&FWk_ i۴5NǠh ͕H 6tV7*՚ki)jp(Წﭬ~AVDZiw4DF#/8piMJ̓ FGY:nVHɉq*ˤG4h b&0Q<˿v(l&=lq96Q}  atK/#GypUYqֳ58z,}v](PS΁^R1{^QzG(mlW#:Q}-c;Ы?@VT|H$J#\~ŧܼ]&p{6,K͠K39>i\sMUdryFSn~Fŧi:/= [,ϟ%C4SKe4M'=2L²m[!n_y)ʋ/PשkD\G/al0|U㨪%,˳ݿ7 ɫ/nP'Ndn07@V[Zk. /~^",V4L0:JY8RCA> Vͳ#DRZe_>z}ջ8um{Ӯi^.P=){ NoyKEfȊH#G+,./qcyGE(w*ǷSViw4IQ-xV\5~d2~ t] ~?\g[׸s{9`M4t}k:~FP"A"Fc5f& fwX״X+}J0@RFRI_| |')KDRMO1۵Cyyڍ ddW[H[. ɡ!|>#kFazjBثW/vU$Pkzɫ|>A, IDAT>:-k__, {N&e/_t%ݣ!X*tjJJfnvFdZ,%ɳzzQ|y5l}\ Pvk9? J90"󉫊φ`{q<>$xͯQT:tBeFg0kէjm'':\ VI\њb <Madc?e؎P-Ye;hɹgӛ`, qML~Y>ysV 槧*ler\|'هy;HHK'XFܩ>F"< +.k&>%筍$QemX6ܺ{ߕ X6_*E?XMVG.]*Z9Q,0mf躁S 'D1|ͰW 6r\pM98LJ7>Sif&+G?)X]>t]ݏ(+SIUy,B7t:G2)!L0d|lP0(ښA82pMV2Œ`,M,azjJiYԛ-FGQ:~M$>$>d|ꆌ>yBXֹςͨeYDcQw*Y@CK* bzZ\-vK|^MUT$L˵ePЏ!<] Ƕrh-ˢQK*2=E~'nc'r. )sq,/x Z__c &&&K>ykP׼krWb9@y$%V`ԕ$A2#Ѩ'Ć0 e$qraY6#j G6Wdzz[>_ߦh7~SضC-@eYTi:pY2{"4 xF#h?lIj;3>&³O˭;(JrWuZS(C:>]Ӹ|E)}lP\۵h65:|'%I\xheP\מS5CƆaxln! R>ݷ#:L+s\Ӵc_2D{T$=@3t 8_ù@@?v\[+W+kȓ]{+GT5NS7X%{EnN,can\.˕X*26ԡЬRPAv/9 "o6QU?c{c8kͽV)[HA8h5/j h3Ea(vns%N:IP@ \nlZNfP(ȿ?ömjdrkbyeF'Xu]oziLOMeW^%n޾CRa{{VmYTkUZM|lnnS$Zͦcds9! l=sϲ%{vMg^cyߓ')| ~$IDQam$lo+kAg>b5xUI]$9Ħ{\8m,a} KH=ڋL̏L=. O1%{nnRW H}h,U~.o>j[Ź3Kʂ0 ` @PK@dBȉyvwwl댦t4 ˶U[KGd\KvبICKxu4="rK6y ׋ k[w{iOss"Բp,BD"4{w~z__Gt4r*.x#FOG)FS;~Ug+lwUj,S!v2 _zܻ+,) (J|BtPU>9?X=X:MD%Fжm33=MԎ38V,eY>;AQ[g\q䦃be'&^Zͭ[ݓkr`8x2 ?aH8E۽ЉDh 8!G8ju% =,DАLt2{ylAVT"'晞g}ĉ9 ciͶmikO1L>_|x~s|3L'%\VvaSC"-Wk,ZkMZa&{y(c#ènn$w>Ra;pUE/> e,=l=r_@M,|ۿ7Oػ,+llnSOR< O+;sU~ 'J:@e7 Y~)!Gsº4< T$F=3O?F@!ʵWd<@p-<ϜdE0a\4SlE 4#5XޟfPIbTU   D#1j&éiqI>%WW$[,Sԑ%c2F'Xɰ-p,7vseyd{EP x>rcZqT[`>2æy4㯠x+@xVyCbi锗q6·GSهAǠQH D{ 7$^o+q%D݂ތ*IjA> "`Zpôsɉ vrM&llp@w>I,e;g,=v&GG+m $IF)?}{)*iѧ7Q|>mIv2|^0M6ΞF {9N\Yn ֎m7~W @d6tϟmL&B\k`0, x01IL24Mmnݾ<;bMr/7$|/c(I/;ݯEgHQzl}gZ`O2d\6ccH u$/8;A>=?ـA`ѶՇUqҋ/˶k+>WıŻaӬh$^fPZgs7GZcΩY@P(TUM.^ĴLdIşab[06lH>juaY,믲+1=10i>}n%0Jq r9R!ʕ#!i"a7k5cἎi%"YK,,T/ +B1tj^˗.XqΜ>E!GQOzkw02,eEAQTzP0D19>NB7 LS8"KTG@7 N &$hB=h4f+<t6Οf,=nfO/aϯ(Gip)Boܽg|6b Kb -7|8)2LCgfjzɓ'rq`!}~˭Dm[y&ǮuT2FAD&fz絿\Zs3kJ+7`O9dy6놉wBYQfnuz$ag5YP{}i"@Z7Lv) lq0MReض4m #Ļ {DQz\4TBR+؎lZĢa&펰TZ;O ˂()A88 ,Kql6[4)5s%`8TZtF6eYX+091ӆa幍HnOwl4ͅgrz%NGcvf }$ K-0h6^F  jYJY4 ښ+/nt a C<i   bT*Ug([}uy˵bk:V5/|LG϶tZC# Ap_(|||Xs(;a@8NX\SNQ*xk\~]X?Eǻ;xxh,]oHo xmVH$B"u|ԉ9bB$fqaY:vqAaW>~O^D\tY Vַ<`bl ˲$ԸȬx llW_`70MfOIchC &U(lNHۮװ)7 fk_7(*z<tA T{uw!_(86/ej)$1OJx,P M'~Rto{Ҿ9(/C9R6,zm~t:-XIGlV*i8D:1OAֱC޽DӴ=JHDQ߶IX퀤X`aaaxbivsfg S;CC 9tCfI jmpד8Po/GN pYַ28L,%Wayux,i٘-'pw?Aӡ֨ ID#4mK'!86z=FݡZb"{jX4a‹d}{0-瞺JW(i:NFS֚?Grt[YA§hb f[s*Rvr<>yx0`+ΓP}>ry^~9_톗 V E|>U(Mf W ljEô;b(i4[$^tplN8h051F^2MSIo p'S,+M]6iPgpHo $U^eyXc_2j$JuX:0=u^: "\}yQe۶ , n,{*$ՙ߲-Ta S@QT:{^re 0LT\aڄCAFGR_yY:Zf0:<7. VbGW:?cav,,!+23U*:XY髏Ps髏Kѧ\|I(+UW!Įr{?t`0聛CZ-|>Qo\2:poZe\8?EdVV׼k216JlY,]AS Rڱ{G[8zГ3),g3;]+7GDկ9` Q@G?z3/ /~VO 3}#;C!$Y´ij'DW^'~?[C g&H %I"o Niwf8Dh40[<:]cymjɯ%޻~x, _4ZmX~ ۡDaFDBEK}KQ+O¹XEJ.I Œ;D HoP}*V ǶL]Xӡlb[Vkyoy̒g{9h7556X %D\P]=B"eYƱ,lڟIR,L5g`8Kj}cs~-QĎRpE67 vȈg#$I=zdhP7iQBR!rgϜf(#cdY" ?QU| TDfYHp(HU[Yi ;{-a bɲYj(`j:C<.zghFN8¶,L 94^P~xtX,꽟A0 lrhĻ\03=mA ʛ_EM78K6G29a(_.I@$Rd2IzdXأK#uvG];H8B)z^Ÿn\} Oq2zj dJ]҆{Tr;J`0@Pnj5QH$n$ _.x.,,fuk];^QaҾWke3l豴Dͼ8x,--qh)zPU/+T5R'跪zqƍ}痵80,]uD9R;k~05(t$k؍! <QKBVlI!  4dnc13YMӶAikK TmB ҉9Z/21Nz[Ab|tlR8x{ `ftg.. k[ؖMTfj4Ed;VoiJZE"enrD,e;{ϳH"܏e}>U=Fq{2e191c1J׾կx׸`bx!ICj!]TzIڻ׫Xe6e,.n6GVvfBB%((>y V=)AyWa\t;˫> Jh8N&C$VW}oIl6Pݢq yjZopNb'OOwvyku-,4Mi37;MPxM(DZm"fSd岰rOanvRxI83mx 0?\Wzt_g ~%a[3=|~k_>pm;gZ Kp8 [maut$EkWdsI:`'u[mdEA y˯pweښl:LYl񃟽K,!2:278?ie/?ͯ(K|ϱFV'0=9_'S5h#2e ՗eT:*o%I4twPb_a c5Ꚙ=nI9^{\ƺ7pV4mS)vۻ67Kgmcv%~>8H( AhEqþDq%{$X㳓%٭nEoOek% Q?uϋ|"ק*"W. jmH5Msӓ-%B0,ßOj(Pn4MmUSTI Řb}7G8' (WXF$PxjL=۹nA 'Ftm_E81;nvChڴM:VrJ0dzjF-9 $YQ{Q77`/Ǵ-6k_fmS03{y X̳*+aդu4|~?P/L⸪UE؎o_hR,UEޞ bX:}7x;[^qkn18b~ABUZkҀ^p-}ѯ:z_J g99ҡ.~l6"_(+LM:pI?B:>q^e2nY6)4inf8D\){T,e|#75[-AZ~,"~ۏys5MӵVDO TU%5<,7;A 5-o.,}7_( ;i6wdsmF)6667"KKt4P`lt3Kd\r }~ ӲKOUc4MAh 'S ۶1-E8?;EzdJCDmYϝN[d>86m{l'rplU\+(SCQdy"8\ɭ}3C6鑀GupAǭ333B3lZczz1W8Px}{VMse.SUY:DRp $h`7+> G[Y^vg-WeP64V_ӿϿӟ -h8>ʥK %YYǴl*x|J(Ӝ|B2;o|{[$CM&c#ce3|xϝҢ`ݬ*pX:sSLyT,Ld9FGR m|e2=db(NOyR.C3 qiR!mݕLMJ&)W*\:] OMSU)~#"0O>#$~Uh˓Xֽu~[_?leQK"i*_t1Z\I*B&zec;pyvvJN ¡ e84}!Ҥn TU#͐eK7I3v16.c0o{*˙KטսǯIuZxrr2mT6=]^xzwk( mtD"=A0::0[Gy`wx.IkjbB!%q`76P0 @NO373$+LN'7DL׿O_~J4fTr Y(MMP(W_Go(_]ï VhX3:N'o5{qV7XZ\ ss :t5g:JJߏe,_azjl6,ˤRIr l`}H$.(S~U}-1tz]HRlЃ:Ǫ; & 8;<P;9N^H}|ξ]a_H$HRLM#^W^xZN ?bEMQ5ˌt K lǢXMPF3MFCԛm.Ydm;K/01ҩ$ciַwIĢY^fBD4DV|$9޾;L!؄"QooPʊk\ry VqU*%pvfjj6=  n)<66e~v"[0oέA 9bqaN\Uw&z\g&$h4-dE?z {WMӨ7%Ij_l6L -G>M,Y8^ jAZ&Sd1tk. 7;.rp=sH}"qgYUؗE\[8HtQ_#=r\5Mgk{UU9w4B@ p*W`m $Ya-\e4"i$j` :,SyJ2JQo4)ġDP0H Jrߜr-LbjbZN._!;%b(5W9/qiZg^uZN:gwue a8:׉s$3S1h`|H$hv4bYϟ;^6H%u8"Hǣ]FT*G-6}gd xJ4TrrTjK Cހ"-Mǰwx'`0?HjIҩ(& w! Aßvksb*NNR,WP|*ߏect4M"tDf[òk\X yXzݲ bO>N&_$//UhgH 1;=ɉYnlTׅ  .?MldPG+PmN_|ts-*#IG1m\ۻܼLTfeu4OVh$b6a0JPUUPT4 ?(\5`d8EROo2J Yfiq 0M Ӳ9fh/I%J,Ͱ矺F\PYkyݏ  91?CR% To|[wfj|FuOW"RȨĞTT]bE$drkA:="$<{UD)Ta) p ϑ/z[vZ !eޠٿN9UBaaSG[ zyiր>-G34 76A+{ I嫺l{;=3=ݝۻݻ3 'h%* %B(~EB%"Hsۻ;;L6]VV:}x3{fdbFLLwuuU֛o>wN>~kj8.㬃-j[¢;}>au6{kynVL! $Zv)FmSXPׄ7yr2_[5wLPb/mv~?[";Ixh>Zr6?`N:STh'D8ddGK[?3.9&M:^i4e ŧ06 ]G¦Rs7XZ^ES0˕*F].lZ-o>ۦbhXK eZ֮ihZ j7`$YԯFRep@FGFYx7[sz-e(ցVzj·wl׾YN̮bȎmKF莯JxWjd  ۹9%j0 [Zs[;,jY5zqE!_(0  *pKh->sGͿwp/jۖ<ՠRd3G :`DZS@k62# Q)={)1MW1MͫSw7Mh:CUŹǸy{P2ngW%k1-p7o')ѿ(D"0v2Dgx>۷^ɮ]emy0hmٶ<}¹D"z̒&ysI˳&t_OQZU"FO3\z[$%Iͷ~)4M{35'GFiiܸvZN_&MRޭXmvcOKF֤(B!TU\g:T .R*QcGɤ;J(IS.jstjo}{ȲPH@(`iC$ν'rvjEs󌏍Z\<;wH'$q**JX4[[;PURɄgm4fOsjSG ^ax}[ }/EkzbuWVi6i4TOw eYI{mm_uC=5;!<{1q`pWCA,)':lBT@۔,Fv 7zś,//|4 V]׻''';ǽh^ ?$dp\J+H,.2Y*ht,uU%W$s|f6T]>VHo2׿2< jA&Ylu[9˦n$Qw935FO4D25v eFzlK+7XZaE!W,ty~^_-V;MfO#9l!t CAO+ҲMbN&T*+|mppH$.۵KY* IDATcblR;q(w NcϟsT.߿ۏχ$[V6w>}A/~3yJmķ:\C5iϛvwEpT*E LQԑ+nM)ѥja'! pvHD $0[P?zϾp5TMGaRV #CM$ŏ  ] [Z'ӗIPkYb~yfK܉>Wׅ^zGD6eq aSQX  :$J1slO'Z8@a+c[&c y,$ =1VW|m[uvcYi 0˼ܥжLc'`IAjXO\HdhT;=axE~uČrvJ xGQsBw 95cED:Cmkeهԭmo mPNT?i;a%ISGPB../Ͼ@V[mqWQ* ϐ/ +LE9yzW9ulfM=CQŢ&deR)kY,{qTdWux>Ukrӻ~**hY3ѝ*VצMoo/mlE=pѶ۵Ũ;G8$;9TØ,*$ ϚqDZcG)s:!9kv/PagHRdׂ9ݯt9_ۧx̵~ ˎva%he2]YQfI{2'<vӴ7 lbY,sbzP4q2gO3ؗXҗI3> tv/|ݶ965VHK7)5ܺ7G0'P9}tŵ,7^$1ؗ{L0mUtA8Dl.]8OT"#O=k=FqHu~h4DsQ4EK7ͤdMzbQ>Y]J!Gݞ ;y2-זm; \L*zvjns&i!KªR$ q+W$,hrʉ"/pcdu>reUX:z>ZO1 !VVׄ_NG$==IP;{m)==mp? /4M*Zϳ Zm WU: U c[> PSf77 EL$3Ǐ/0 >76:2!Xo2ihc?W:!Td˫k ,.-sdbRs$T2AVHC[^i#u m1JuPgxD6{anNAO8D:CYCјqt ϼp).רcdhtōM *OP7[^ӹ%lIⵛ7xg*h:}i{\>ubEا;,ﳼ/;Ya)CЧ+,f `LU Nb&=~=F Y [ePatU¡>QTvlq >0 ί,N wf345^?9B/\N̍g 9a[; ,(dkgY8*+$=:qiP*+MIVrVL:EO41sS>1ϟq/ך FX4+m3t,Z`1>ukuqٹׯmaY&pCIw.ɲ,.^8ƞeu.o}L h~6::J&e&~{?ե˸zf  `AE~gW~۷ 8Y7wΕL8I$m>7Iqw+ |zIH2t7tO!Y"H/VQ|"~jSǴl,& 3:4HK7DCHTz3+x2JZEkĶ%N4&_E_:E$qֲ9tI/\UUbqre>ut3YYϒEY^{ YY[j: +!/-x,a?< 9IeEG&YY[d7ZaY6CҝKضw̡ZjSd[ MNeemJuBQpHM0#J/QdC\[2< stzxtY%a^rU𹗹w+~JUE$\)65$ǖOr,Qрcea=&ł'6MP01ݵkVqj7Dx_ #IO^JE~խjNau]EO^ku9CCCԪ㟯slN8suQ={ƱFteע|~.X!P9_΁  PwvڠvsN^5 $ TS rE~YVhU.Z9ǭ{U*K 2BSk QdUFyu eť")ɘeT¡ H(HKkb&yKK˨.kzz| RU sNl6T*pf;dԹSn9y4 2<4$5Fc|~}y,\ϏiĢQʕ*f!g#\=G :|-Ͻ}r7c$IRg/u<"v@v;O vݑiA$IvYEFck^Gk>c[n3 xNh TKo(>[9ʑa.>&uUz4&/]zȇwRX&_(QԹv4+DaNP裻e%L+C\ek{;Ʒ|JӱfUf9jL۶rkCmȲ XA g:zZNXt]` A@2^;Iκk߻ܜk""fޣ^FIxȟd/˫1vrU~T3I:n6׋bǴ9t|/yAz\`h,JSU0vEfYLzٙmiM[^.Ix;[CH$$2L:-T3pBVЅm7FU*v~α1u뽪l20ŞM!rl\; segJD!b#edxu>s6o| J rCH ܟ¡zB@J4VN&ij">HFCry*׮\fskjF\1'4M|>^2jOd'C$WW`pWΈPvd={S,fI"/G<9f֘at?kCkX*c"[; Y°L%.9~$gfM|jva76W_i|P/WΝ. 3'>bqy<{b %2gmcXLQTCX2ÃLO okw3m"ضmF(Kʋ/pW^rB|mLBUU/|?_cK_ ZMP@פTq#-ǻҕ~ b6%Ir2ICHooO麗0ًV*6q3N| /տz]jiO xJg<w3$zEh}}| 1h۔r j(s{b_`"' RohdziI 4M'  Q1ML&h4[ %GFxe|c^8Mp5hų'[:rTZeg3slRe¡07?i Xv*s dse"E&H P(䉄|?² R(No"ASUF`_/B2M|RO& "P(4 vrPPP`=`SGGLS3 7bD7y~#,BUpƳX]r a1x՗[x_Qh6Uvr9tE,q]Ih][۶Da|ܻb:cT$zIwvh juh45$qN\C$Ο=4vglU7缝g?665Aͪ$ f!Zn֭tVqZDޣ}rL__cKY C`F<6Feϖ+(IDQgs2c,CPٯlxϞ6itZeA\u'r xjEr`U) ,>E&_,11:ě?y,A0 Mk/P("aQ.Y]]szX$D]Zկ'KKW/0vĝT AXϙDs Tku3)J__jNZld7E99sm' lnfsCصeRI9urrB,c;W J&YsdsK(KM]'vJtKϳ E - jjM%|(K|틟G/mٜ<6M(;wE膎߯"ƴ,dE?@_&ͭOSY]sWy0D?MkКe:bIT*5~zPט_Xdm}ݫM{H# Zf2a&t whT':k}b# GӴCf8R2xy(ϭ@[%u ] k/svyI:hf ;&c]z!~XcO0tlǒ\ptTBO'㐕DN nNz-4,a&Z!o>qɊؖ.P@]g]׽9A"ؗA>~$#wtcszZPɒD4uBMḆֲ-:d|oКMnzb䭭~p>ތ/ "kCWo4Bln0s(}Ȳ9\&}J, זi/xY8$Wq JeN?F"'I;XSG0 smZX.61 D#5uߞjȹG' 7JPɊ1Όnn'AZ ޓA wTq(z ;We>#N $l)0<g +{v>E~Epz:n'}i $YFRLJCe6͖G Rp٢8}8F j&`+xX$L8bPĴlW/B7L^xLps|>3L [vo[</E^% 9b MMl2IYPrF4ěfzbrFO4jv0MJeM$8jI*޺KRcrlgΝ~_0m *$sWXYdict"щQ'CZ|g_MWh6llnc[u[.m1;75ёa?ks`6ydR;{Gk#O#޳S TU%NljNSnr"baU-]vʑ VWWy'?x}(ٺfieYVwj<@ƣ|n j[v ^Z矿V hvaH$+\ H__?J&$S@Q|h-S3GڦHp6I$!,|Y񱶕7}GBNc(J S(EJΝoJ&x{or g"ow[΅3'Q( |%FAZRB0(ͦ&>Wv# K`8l,ۑ]efA  I2$IF IDATeܽj 0 _<~ eE_/۞^$굪my~P,F`uqw$wTIcoխp`VܵgYY]?z {aLOMQ,mYc)YHFQI n\gumJ_v}=Ʈnd&ccce􈃃^~is*Ȧr{>qѱUȊϫSwsUу X؏skv+j7g?7>:`}O+ ,;8˅qUBJI{3iU S@[^_X{>sT*yn{| N+U{OrsD"4 ~?Su*r\{lfEP,لB!l"8J0G"'K"'2lqE{p8H*Yl bp8H0@ӚNc;| ]$D,ATmɓmlLhjs$Xt@S'fX__4 L m36:ґ 4yd7=ϓN%yp٭ B8X[[z&fT~G Bw3!t]i(g]kِ^'t[y]k˟>*A/cS[A'|,=.]zp֓8= Cc^G,ʱp| 6baY`:eF GJi4592izzbU6,giZ}>bR(DOŵ,Hbƻ7?|I)V`XEwWyfۂ<5˿0қd?ZLcȲH"_PTH(*ȲVċW/R˼&F)iML&6ww?&13=k7}j:3S+UZ ˲Gk V[HLVֽY^y Kܝ[?f)2eya0I?e"+k֯< 45x,`U&4*|>zbQJǀ àP,:gXH&Qd[..4ɩY[PBJVRgn>£.m033C._^w4nxP=mJZʼnx^p4=Fg^)e}"iYN@qɓ'"\-D}IOO`(vIR),ӧN+ bxj '&G+KlI&SS56N]~Ϟ;Ž%|u3itӤô,R < 7fecv_Kg"32f JvbT*e77Uܗ^#!6uΟ:+Y^܋ܹTQlFab0pmUVVK7R& jQK%FȒDZ<>6t6=٭?/=wEĐ~Tkul(˫LMbjb-4"KϿùy~&PjJKkbBs=~4 fܧ^uلЙNԽwk$I}_dO[y= > @0DooKhRݗш?̢tꮽP8;p G966N(DEMY_`JJD0-VDCBa +=Bmjonbmc<~Å%mr|`JzvS,|E~^<Å%[;'es{GK+d7)+\:{ֶW/(h jͤ#9d ۲ض% bge2=fk޵11>NZٳ:9H)Be'6(]:\£%"a$ɳ$MR4&'&T+Ԥ[N%mwrP 9"~U#I ~jW(ll/[o7CSd.IQMuWx@pnMUUےāaE'rwnF,~u98nY!8ma9x`0@o3NDk6ѴI3slZ+ SN&SI%SBh1/|1& GMo/eG5+4D""+Ni;9s\`@sIȱ%`vHH~-7n\'{v.0|P aϦ3]C07n9vG66 m΋&q:ȳ}_`nnGEGVvr ,;C˽õס x?xQ*r[}{ w?55s ѷ dO:P,7%#bx0f _ (;NPw_oǧYZ21:v0KkHP/k[9jWn<:/_DRec@<avy_z%Ga9'TW93=qrZѾ ,35GL L%L ,w疸t8uUXpj B [ / Hc4&jSVW+PJej&b?}@P7-&h3S _b=ɣG[rqַ_\A/%n]NJeY "ZO=Zqlj|>OP'% z6ZrOQH%fҜ:1*h]羣F;EE =P(Xr}37Y\\c ϽL?98beu퀛M֖mά.,nG)H،Q*w,-/bka7 ? 1mQj>[*<<)/2.x>#+mv+$| ̤ln0-R$>uB0& J`p8B<ރ$+Եfp 4|@j]\mpn?|ϧtz3I2PU?6C.ї7 ֓ Lc+A cC,bskEDU` \*OiM (K4 î%#?~d7+@}'İcs{2pZR[8M$I-X Zmc6n/|5/ߤƺDŽ#/c:*3Iں12} Tgx_/kaKh 椦i}ts j!kʲ,vmAĮc?e=AIjNV:MkWcnoT&ǏX,b>8֮V$r) `C&cWa3Fe"(@>nR7ep3pGP$Q /Q6x&Lgp5I8cs !W 0 TbB2!oݾcsy6[}2So9HRC%9lg/|CA # tZV$p(L86+z c;Wlqiu>czrzΥXf C4TGnn:N,'C(7Ӌie[(>?700; ^,PsMm"8ͤWOO; 2~ƒy&W!·52%B֛n]ǶAa~bfZ>ϳ$mZ7ʝwk,;aq}zbAAD3#?7 y9a'Bw֍Q.WLs;: Pwi?3}4ti߽~x\ث*{Aܹf֖bJ%J.heg.(2[6kN7Ynйƞ<{ ˲w&s===뢛ek$;|@ ZH{ bͦ.qϭ9DB=}ui*SGVx=6=6 8;y*F|>vm2T5"%5k:'gSVF(崆AyA;;;;j&i/:# XY]P,CU.ּ\ٯ;wRIcmN%u(mH8o.0p6s'jut&C  q4-R$["}Af 9utR`?- !J`ZB|>EPr1&G;8^n29Oo2۷gM^|}޹v7^ &ܝP.S(UHLh,oq82ȝ{G;?'Nv_5 Cƨp,[T(躁,..zGo&IFG4̩'}ݻ/zDFPTĆ#i F3$"*Z-,ˤZi-8}#o.H u;c=Y > uԆۚ&A}}SNR{{D]G"$z{]^ ;_F]XHl=$^/ D4r}{/:MI`Oӟaކ€ xYqda`PFC۰amkB_{`76+^ɋ|?OI'lDBAvBPu?J.\ݫ$βyF&Pſf͵j FQ lNa6͖6N4W?]j;:{&o}g,LOkx#Oߣ[\"=~.p ?zH&3ܽwgϰMQwmˍb&d—_z?Οfeoޟ>ul.'&StȀ_"`?uCWw ËIgϜ&~2{Ы7 ݻ|=YtC#A=zִ$"I=撬`ZnB+H*0o8$LrǑ"bJr(8膍e;E<TSo &nMˏ=nw/7[Lf r'ih:N`cg+LOK~iZJef2\[p;hN* /Qo4)UdsEZ\Sc>Z] DeSSfwo;3}H(@(R*i_2*&PN1Yi\4 ChF,ҰLS'Op ,W? (K*?«öT{ŷ`YuFi6~cePq("]<@bhrzwHm=`G+']cJdŨFNIՇ&U,IsWUU,qtBPT!@A1"oG]/Ď}wFE"?j 򋪪Ȋ(B˕ Hae.|AU`]>z[!R8gqlRՉ"esT N.( 4VKcqn=*O\eA8s)+Z#\<=dZ4[-FGGNR5EUT&F8؛_O{L|N%Ǣ躆eYXfg ?ϻ|@sq'GEQ8ybɝ|f XnD"Ps uP(az=k<kԳô3 t۫N"@To:3TkukS+R*@IuÑ|C=q b o|8Œ>ږk58F2;;J/MחBq5M@=왛wLӨ/#Q (ʁܪF1]@樾`8vͬ{kB"4<ИVU=H&Z&f$,n̰#ȲLbhJBp,L"x"0Z2|>m[bnOH@ӝǣH]VQb1FGGvIh6\Jڻv]Q'frb0H J<'rn/JRJy(> po> sX,F\;7Kz\F2RyŮnz<8 +2en$_*7oDE|Ge}v]syߘx\m}~%Y&#ضz1$qeYART$E@Rab8`Ih4-M$|p}n_gs/\f[+\~ p,h.P(2HP]7HŘLos 7V556 ]oWnAQdECqR!r2f7\e81n k[|p6O?ō#!:祧 Gb(p07?h_/~ r4J[98%P[+5\.8@['/sW$f3TbhW_~uw/>]3әcc:z.zl~˲4M_fƻFGGh6;?ƮMy#D%„M:77mopƍC;َF~"FIq)9g1W3D?φh! czĜ~˿C5>%I,MTYFed%3%ٕ766Nv$`O 1L!E0-% ڤT J @4EQU0i͗ƲR(Vk?yG|V[gaf ItvbFS/P5x O=I0L Ey97`Z&st  1>fP1M3llYC0ܡ,/Ʊ1DZM"A/YG~63NP,Qdu50a:`ݦRZN4>FP.--4U|AHWsb'r֎Ff昚`i8p5X>|ezN@UF#5͏7e5t]X4]7K2N4X*ұ-bBpD!ӧOu$h~Ps,L&st+*&]0/fyMX'RR.++&:NqH_kgmo3ʲB$4La-h6H1< @B&|>#i)+yqqi8GUd4Cg~fJ.XƲmB$ slGHe2 E)JITerbZN$,&qﮬ bev&$P(uɆ\q˟Dp JMVKXK"3;Tr)vv c"7n>cd&'}w$\^H uK(K4-~ZZLgbmm]^>$noN|W0I-~M $ ~\:R0C.tSo֗A%fLLLtл9Gzq HIg3DuIBWO,JK]Q ̠i78>uG[#/7AcccC$滘3ҹ7Un ^˪k{Mw> <"ԟ]f;>jƾU0hXB( _I&pcaXԥsZ\`zbکTl%b2r:;SŻ/3>hM90i ώ* $b!^y_é W6勬nﱽ%/>ז8JX$o5ֶvy)ܼ[_|kɥ3KD!¡ ӓw&︌+rǣQ~ﭯa'EUe\ãN/F,˦\2Pdѐ{Wqcۜ(Po4\TU>ڧau}K zڗ30J?H$wCP(d 9fohn9}B\C|+3LG[oqG^zEqX py>``㡭{8J:/Xv'I~[xtU?a# iGBQȊ$>5,G"lic1a0Yo`Z "Z%Y! Soi277^@"4b(Ng/W"1c|lZřS2SFeG 72{"K 3+U޿~1};2a2=9U&_*DxGXJXUZ-ڦnndwox/ß˿am-:wWVuJM@QLR YX,"ƑU\>28 ^}`;B?z&3EX$ڄA_oZ Jp8UuB躉Დ!*<(zJUu7Enܼ%מkv;i06:JtBŶmY9?1T}]E8zrc( \on.I t0a/= 3 o>9GŘÚ gЯpw P9<zA`12I=[Bs'xE0υg@]N2CCC4u@P0a(j` @&pwevMRanz 3?;Fo EFiimR %¡ U!/ӏq /7yU^}76QdlY$#Pi(J,R.c)BvJ䒕JUHb1Ë =2I"<86b?ww{ rU_wbmcch,,+D#2[IV%bon.C?GL%Yv[K.&)W8%Ird3!JsR/8x be{'I=)R'NRH~ILݕ+GI{g}cge*j'T+LOgY>`;L"ntJ"˘am -ML[@BB%.]"+r יfk'H*e֗?Ͽ|''_? qY616P%ئ--m()&9F7A f8BuM YVH&SJefj:q2L B'K<қ.z6+`Sѯaa؂|9Ka[Ѥ&f}_3l3N07CѤhQdhT߼##iX]Cq5Ʉ0?v:ca^1 m8v gk{Q Do~~ ]yǍ]A_VE.UbRI(Oil'L;].aN7]o ٕ0NjWu0ɫ!B`$n$e/\ {*O?ž# ;v'Ev$?ٶ/_וӛ*.yòm/.EoEӑ^c&䉡!6=߻Tth(|/|r~w$$/wt0՚- Ym]Ų,x1!n`{"ZضXV v{]'/259"4MVW8wnzuu%iLf?t鑂c(mnk®qZ IDATD4 _{݆YK+GWuK[u?껧m/[˃UlVCe&&& xtIjL%{y7MVb_<~{oN&A݄ۈO]~6m`r9 a&'Ooor:;D?@v3:dc<~v"u F"BMa\>3M4Cl.?vsdYEk5!!K,dHHb,-2?=|/n6w~( ˗ҩE.TQIbLG7`]ȏfKsS毽w~Ij:75hmg.6}t'_^# roc۶[_zT"F,/.*:H$nȩܾȕ4hHp}.Yj8O.W> V|3넃AdE?`MNp Ƕ,FdXi$ 2W?Ab(N"1%S ++.poer"bzgC|i∵лxs0<:'T*l17;GZs%N,ӹD3U?!H~_lb?/<?=2Q@R: +s=S<wTU/yw Ţ`BK4kVJYM`НN6(pۻKLO7`Y&{H,>wQ~B 6wx)4sgȌs !šP,Q拯|o *F$nI%LtrMkQ,WL!u|tǁX4B@Q$_ T1>mYLev:#ؕəKY8DatM(&i4[RE:f ,oYg"3OkF0t:D(zJ2?4k)>3XttIB]B*d8=L6p/f+157h##:HKҀ$NܩüϼD0:9>(A!G/Ɣp%=t8|$)7Ms$mhۇBGq*ty7 vknv̓\_:b?,kWIxĕxdrJ!rt˲7EFS> VoCb63j 0 588?şqsHJ <ƧnIc4\i> aǶHQt[ף8g_z"{{)]l v@EdlYaVgOѥJ `&o[ oQY1QӴpp?٠:JQᱽg0z0$ 56XRNQ|fG¶z:nfwT>tωԮ;=eٴZ;;Xj!Z|`,Jƹ3ˊ&R0 h:bjbb8,N Yߙ ͖mLa&wVI"T[Mb 욿A29D!_$eBT5{Q80KX*$%%Ybz:ý5/g}cH4tjt3(jPn4hi-}{+DCaTEa}kv ϻ`pmDB!$Ξ=~[jAKӹx<{C!ҘvYϜ^ormTɉ jK(ULpuK p~x,FPU(*4 ֦P(2JT·d8'm $Hl5 CSIFGovz0FEUESĎ'(HK/pT=Bf^$z/XdY/Db]?聒H a[_y9Z,_t@"㋋ ԯ ( 6&Et^3qYq=oh毗3!*N޷ JO!љD իG9J h~F3 (gV{2=Mkgass #5/1,<J7>:84$}Dc4ulcZrrΰ_(1?30-0x'w[+kpQ&pBB"\rza ˘ŷ?O?rSTu"ݺN}׶X̌Qo4X%_pz>aUH==s~@7_?~ZI8gkXL P o /1VlH֠I1>fP1-" {y{f&Yf63>X'/151ͻ+ >~KbM>`vm_{X:~+߬r~vͭm[\jO ;Xw:.$Ct:{{>!^Nj6dڶh>u|>Ǟ|]{R ƭ+P,`w 4kA\G4*i8PGGG; CȦjs|"b۶}#N lvOztA0pòDQ KS#8x4ƅsg74ld- ôHRβa؎ Be Μbg/GѢh\_0mݤQU@@0`{Q2wd/~Yq~z:#ij&ǦXCڼ[46_~y-w_~D r*Zù &ƆY$A*c#q9jl 4-P*KXEu "/(LTbl4 HEl !8?6O.# 0Cm$|/|eQ,UDk[ĢBRb:HӴu''L`63ETwﭬ6jgFZ-))ShF$,<@6LM eأ\3 {+?M@o ٧p$D8X* QT8w$BBYQf)Uk#ʕZI>7f+k$S)6P˶)U`;]fc;؎;kH4-Ͱ(JHp:6c *պ+UZ4 f2ܽF h w[IlnZ*W˲Fڐ/CA5!>g?lf-MCpCWNRIV58v8d|B(T*$I/zϾ=ޚnEEj c+?8ql.P"z?'HD^Q ۬jG֠Ύ^2β;L&irIqU]zk_͟򅗞f89ċO> ]gvrP@R:pp0`\OBL lV6 |X;LMQ֘"I /r!PC7$Mu"a#ln )ݽ}.?dlP6曜Bf_gc~"y|qtʗ& A=G7!B?1)WFߣ=8Nt^yaQQ́`zu&>l}6wU⎦vt)X; BnM@U R7i fgfzT)h~pZ')DcIF um+oJ/"PP0@V'H2?3ݍ-b_xS2>wZwV6ݵ-Ƈ$Cu7{n޵e>'#0#$F]4O'++hj@h$^ی'l"e$f}c'2xO o-s|a/Za7eYh1;6c#`M[K%* j _ EUn[E<jbZB6S 27!Li @wYA*DkRRq^8CVǽw99CKJǝ=b],H? xHz/$kuرUϋWYo%ˇh( Χz$w?إY%Y*\!p9i̕r&ˊ?c6m_]m! _c$B0`Z6{Y#E*2npͻOXd?.cq#y1n,%a5@g]??}Xzus@o"aS+'Ji-?IC.h4J\L"7ʥbO= Ћ/mkri,gbQa86ip'wfxlll Fht7Ng"^vҕvt}%WZϜ9CXI7^ tA'|ݝ@ 'R?I {MC-Kx$8+]vzrL&C\>7ķn-Į㋋9߀_ZI%B 4ޛe|AZe,r b˶1tUUˑ0M496W}v|ܼ{Y p wTlCL@2LOc6zM^g(#P80eZTj f||Y *[{YlaijbL"\ b;M8Ǐ-:FSK2?7C4R!!S89yP ($;p(,+.FtElK4†iPH836wt,Νfkgj(XCKәƲu!- K,߽O4'`"cy @0roeT~LZ TWe80-Zp_|0!|yQ6q\yʕ*ә)-+]^ 첃anvD"AZPGhttowDcc]5]NӇqϋR>PR^yƆ{ӂm2Ӣ/&Ӽu4 "w#UU:rxL()qdua;6XWcddZƅ 6~Qb}Ћmj3dReVe_].g?+Ώ#><Ţw׽z7q |/Sã#ܩ:59ٙ`u;6g&5TFƢsH4ߥIkC>tNt?x+H(uJ#c#K&ݳN&F#7s)= 7rA{`r0yU|8۲@)riizt[1>j~}Iv}λ\+{G|xO2~ӯi^^F>57)<e,Ņ\(n C`0-U+jˑ@ *oe2͖F0MZYV6ݧjc| 7ﭐdu63F8D:|5m# ro_^E]osvqVɋ_ʍ;ST*oEk",WؖI^,ۻ6c)x޽z Ew18k[|gyPWɌq<1>u|,t=FI%n[% 4n[Zo M%O|_1Z?o_~e\:{l0N+/|> ё4~|ɰ,a:4ڲLwbl% "j?}W? g,/|56x_UOR359|agWXq7lvlκ{8znٰLpffIbhr0w{|t:EX~WxÚ\}{鷿W NZ;Ȇ IDAT6w,"13}Xb5IiZ0TI4ôl$YuQچmæXɴW_z>N$ :'/+YQ 8441juGΟ֩7Z Sih"JaZC87rz#i0Nq{e/?>`el9ul˗~bc,;9X9wuUWH6napNXvǻZ%ֲ!ZC$؆ea6 @d{ ^y]9'sϽu8Z/< RJ2#W((2ptJ@?;{Cat& SK&|'PՑX,~PU>Gw 0@Vh־m"T"ad"(& >ѶL,ˢZt$J(XM$mĊҒ5&R r{)V֘grb 0\b!G}Ρ(2 >ї -@2j5pG+mt$o9=:݃}9\.{';=-Ѽs,ˮl4L v&C>^qq$Hj^ͦYRD<>8[w=իDEC Xݞr"e`($0M;lI 6Z#W.QԋϱN.O*׸{˲#I _ TL&D"aYv/2l]38{z,+X^۠/fc{յM"Rew/iLONJ8z$1i(5 m2h 0p(Yj3ǏͶ%յ5GPHĺRg =ٖ SzA&'')DBa,dؤK:,x<Ɲ;w,ZN&Btb.(*{@UT\! hi틡̚w%9Ԍ Lɲҡ嵲IbO[A8 ]SSmm۾U|JuX4hZ',5]Ǯ^e% z>vm 4R ♮{#"AZ.b~xQ.w.//s_k۝"JϽF(Jv9'@nb潽=_jf߭ggg(˜9sUdsڵ4| cwܛtuz?z3߷Z-B ILMMRTt&E"l$q&Vk~LsgbfG~M J;yvɲ,'1b[XlgPZWx{.lF|O>NBsJu;Y]}%T*qM$r=ZKis9jd<<2G `"VWs2/ȾץdYYW*(؇ua<=$eddD|LMNPuzs'f9s LL!/|_-rÃЎVsf/-r4}z8FFDr{8"z?Q?"ɫ^rVOH,Op$*gE%ag6DG8%c#Qָr<ןxM&vlFxOpqբ MeExz=?&r|_ZT7J%4]#(eRTkuZ-zI]U?&j͝`e,#I{"\@,nND14\3'xBKӈGB(kӄR3dI6wr14]ޮa7T]IX\]DZ, }Jei6/ 7-O<)X8dRIV7[;9GwO= 0ok|WYX^Ʋl~鋟C4/LH8ao4՟'ݥd5;-!S\C,teUhZRJd^R`h\+E)KҸ?ybN0%3O e̝8wyR*!6;]-7vqZ9Bx|W~}/q$񣱰nBŋ!?h~HrAI$Zuݢ\8,d"$!2dFB8&΢?{-FFG%PojDb1Zn@LB/T5F5T"eX1YZs{~sKlFx9&Ɔ+pI*&jKw>$N4_B2$;"<_<Ý28'ON@mȒ(Kk躁eeRؖ7> ~އuܺ#Y8bPsrfR>Ԅ=2پ}̣.$ze@Tf{htCkwE ##yL^W=LlnEI 0>dbD7L6v0->Jn/I2˫EVgr|MTkd3i4]]^sI%TjuF]R!_(K-{]BXbzra9>5谈\64EazyD(FtZtI|0% a(jJt;; P:e澢AJ{C IQU!EdY^FBfES4MGE"p]}"3}}kFFqA) U8b1ɴQw\ (5\tWSSS:ӝzlp($/IJ $$_du0 E!bֆPd}6W.]²-jE}qDa]|fgwbPTUmQ(r,Jt*E6 JϑN$"o|MNbwk~~nM'ѵ962L^ J+%Sk4lr%fO{8aaqO\em}r0Lr">$hpzARkI$ӗO!2w,OTjqw~0#71Ͳ7'wOKӘ$LW?;٧0ϜZoDH\|nk_&&&|<͊\]"x?A7vw/>ytM_- Yy_\ąB['0qXǩRTd#tc G؎c,jZ7>:7o Dz+lq ^-uhh}V<g{gǏ=@m{}@ lBJGch6N n׎iZǹu@ oJ $e ~~?RL0_e.dmx)X[j6>X^mT*ٮg{ /Sگ4۷1zck\SM8> U$%@?`aSUbRR-A7oqjDU.^|啮H4|p x||t:} /wq>N/Q K9lh5]MzgJ,ՆzssedE!BD1{"pYV7I 'a ltHj ECehM( f3MOW D67LP±EbkYj'.sU,w旸3jqrzBnF#ܛ_b/TiZLɍG/3bZɍΏ©Yj:WT~J,np|r|Q'gQ̵G;0Xd"cPt7l}U dk7Gb6nPykܾnln+i4fR(p$h.2/>{[ws)V6xOq=^zx7XY]cxH  txltwۛw 0MNem}4i3ˈukqV/;FvjH -ZÂsgN12:BX!NBBb8'gnm/TIĢ3~BʹD7Lj׿ ]:}i.җN26c08hrss8XlxiΝc#ƺcl7= d-c%!"_xӕf;?٭^ i\o1 Ovv0 ޺ /sRjL6CPp$|`% _jGA/z0c^~:$L{C@k{oqM BGzK | y ~/-Mw$E;Csd$IfhpE;r. pSU}@?rՕlL"M'ZiYgUNR,1M3'OPV4j:h+H@6CR12eab,Ͻʱ1,,Iv6\UUm O0tpؕt|jpOT+Tk5=,'o< RG,322L$L` oq.Zv+XH%k[}$A$%v{x1GQu%3l;iF~6< ho( |MUjH4aJ/AwPw!Q*훟yInC+$'Þj/d2(F$@DSztr|op(eXkW|EH !ؤI`?ͤqvI qvvH%n4'XY[qPUm162D>W`|x2Qdʕ*՛dId (G'$Q,TH`MU2-Y^ A, N&unݹKT±&i22:/~5=X@Qz4h4nG NMӅynL:ރ%6t,KGB}It*AHx6 %ƚoΝ>I* RXZ]w4=&Vk\ /024ȹs|;o2Ǐ~Sj l!ibQ&e"pbFH5 cX6=4;|tFAq Zݒt |Pc;`[+Go*CCw3Sp4!uS\ 0}ؾ% 5 o_v tqPT]V,pq{1qwCݓ}-d x!|2>dG|>N\'/mBt)/ s wnQ_bܲ,FGGH&uJ?n;z#%8Da7n$PH¨j h4ϕK>²D{n}IӨ7dh&:zw5DOY$ JԱ8uhM# yo2 ?BRpHjG BϜE1s],'ʿ,K<_d[]#%U}7Ambд2x&b/wȠ8΍mtt, ~<$z_!{xIVWV>^,..133Ö {g/.cPxJ.XL̕1-aL3wӲi:X3,mLH%Su&[Dq,GFQB(Jݲ(UkHrH4NSqfK\zgO8[(nͣOco>X%p|b޻iaXE&`ucLZֻY]1ZkhaE&335F]ocSTqlFA2s oȮV> ڤxE5EQ}}w*K.S5K|x;f]s?EFub0̋!Ͷ[ڱt[q\8&cLVwqw;+`{dZ־E7R@ߴǹ1^:f1~0-ҩ$}Ynpqj FSFyi-*:} Wwg>(*! apo~ p(/ 2_XvʕKpEi\x]@BTUW"0B۷βH&N$$j՗%PXhɉ Q$vi4%s{ض)1w?H~4M`,/dqRA`. xӧOS(P?mnUatCf&cqER;o8utCxH 0|i)@;qbUmuҽdZnjPz*LZ1|IbgnꮉF"{klz^D$!19'yP(4qggg댍iu[%jN2]^{$6Wp}y:vnԻ_ݠ;m3<4j !w_rx tKuI𚮹S^T}Pf[IH8!#ys;HEWCi畇ݣ <1q58֋;䭂'ߓv9_|W!7g8^yΖWl'p1< K}hdz 1we, ʻ;C6БfX6 %B^7|3S'7ZtJeҩbzS%Rd&F81szIZ'W(B\_~南37|-[,[;{q Hǘccg"R*W$KLqo~n<έ?zſoa:RfS0 Ia㗹 kLO2sl\pHah@XOOrrv=Mc㔫uvvY]D$.sl; V,O=4[tAw~BMřT5~Mf&y~xl&ŹS'7ܼsx4,Kngʋpͧ7mN_a|5 E&'/[;nفwccDϱ>ʧXX\l츒 7v?$>h)0;nwamT }=g?\3< ^c]Ѕ7mյ#N9w<̙K"3 Sd'gi 9d2D hōO/-k9H2i?!H Zx2AĴan{^lCa16wI:;y*ZsӓTj PrX^b|daַ-'hV$MdIk8R19{7~`fI'G dƆ_27I'unݟڥsmC[<},3@-ŠS'XY[ceuEX$,< (+B ֝7+87^˲t-W*R`vViô\>8BrY3msr9$XP œ0 ?i7#P30/ cgg=,>i|#X͏z܉NúłΑ*~\Oz˫x=N}<<<bN/?}^OnqyCPQc$3,-~ǝrNǺm;*#hHımϢMdJ&mn\zEH199n8>C:P,Q,993MOwcc#edI0)}#xu褎BƆ_ ;]ӧRB Y崁9XkϽ`L&C*DIJ ˗.8-Au\KvM,Ͳ,%Hh4ǣ %(˗8zJUYbOG"4M0b 4PBJZihN*R"!XFC6oۭ,# (+4*̓MT* ?(KK-r`ߕj膸w% b.">,!͗dQ3),.344H!fUmZR ,"Jh,.)WkT*U[dhf H?/Y)Jض}diU@ ~mFz>5(ҸZ GFG:ăxFr>پ hjCɱ,Lƶm㥻&8<sq;G9@pz@ş |vt=㈅C }&v`O0Ĝ}$Oğ}[s ހGLAש:7>x65_Gn_$sc6##²F}q)*d2)ɾ^D8">޿yT"FTaw/>ȼ5_2M2)V֙fs{go| .:[;\9*]>GKȇwJEdYBrD0_VWr$[{ dDB2zǶ85s ]׹|4?|=(ME*l x9dV׷8>9p޼K<0M&i>8{ KL Sk4Yo6N%)؎Y?W.abdǶy]6z[;]XlZiuX!ecYAVñ-y޼/|3ܽwd2!LYc 4]k\}r|rfgH<wFi4b96##~R_^ץ`Sl_aaaf @8FFw?k6 ~橹Y?9A Kz~YneSu?A+Kg 8g%Yy o ޛZ:e321FRcssx,O>oprfMid?!s'hI1-}:>Cjk-@τ<=M>_#E$UFVGb1jǦЗrq]`4-n}@KP[:c  ^H´D^oP(~(bR[HSI 7cΝF5l$S*xxeƖ?-Ӡ\ 2&'(Jb1 ǮpУ qz#B[0 1vNwqF:`FtssqmE1M×yZ">s5J 'Wyk3!%i?CmU]Ft]u]$_o"y~e>66&$YO"uwT|P#L^&>tla"H FDwmkȒ_hKg0m7 Bht ˲1LX$JZ% 2퐈chI˲y3'V+cQ2iF,DDŹp4jI22M8{_r[~l1tP0T>ݹ/0,M'tg~;4]➦F^% 'fˣslru H|i*ۻ\xFTvӵs,-q<m"*{dyut2NTsoc݂+*$I3Y][2bp(D_ا. қa4M y;"v[;'\af]*./ Ypph4({:qXΞ=K`k{Ǐ R]`vzk7';栻 _XWyLx< Nw[$$^ 9,XlZ%/_qד}]]Vv xv8!W Om^I7Vͭ-LaH#>㢿g "pB)6oAk}K=ZAwCCC(G\?k& M?dmMkx,CR-Xı;_EwG8:} PA}`?B|x|G;Y%Ge=Hsav}{tKK\8S/Ŷ__?_xScI7K MrC^/ˤiM%eb(F:eի{0ƦH[cDQQB==T'BRG.EjHЦcyul:iR, ~V7E,poa\RЏ7UwsD!=zMYY΃E^y)K`~qz^R,$@T$_(mq9ʕ*$Cabl }1~'_(R ӏ/pf!4_xE?@u4w|W/wɎ`f0H&wY6wTXfs'GTq&F`X46TrlRo|揄cS,\;c ]pH!{>5/X^^&˓L&|cKm imt_-滁Ǟ XGzɽG(({rV_"{ fYjqr>= kGU;{\cv J/0o_}ip("J+_*BUՎh C>4d7"^h{Rb[bAԕvIm[H'R4&%h4'VCa "c348@VhP ShUU1L( +Z4u ˢR`Fce}gN!9_X4"_xu[Š$D%y#+IIʞW$q)60+wK- [(#s)vr8寿+b-) NmB2DB%w/0<2 ) CeҤqnߛ'I+5&PU%$~34" s㬬25>FVgmmǎQ*W:m6Z xAР/;#I_0EWh4NR*b芸}n{L^1RG, Q*}S\}VV}olvhKD8&JDbxPBEJ xS%I?_-ҥKPͦ8l𴥶:`$.{`oc͑elsguAU(Ɠm ~~0g`S1% vzơAψθxX\{|2G8Fm)z.9.tǂkZދh4ޕ .Iց%.w~1o<o̱]K+ ؈g$&:&tگ#wwVfGMC:R_ IDATM{ /gAQ"O<;shz;n>tAd[Hvw fJVd9*w-yG/i:>PT%lq8ZIA" 2Xd*n JH4FZ# B K<gsk0k/};DaWYY@UU2.2MX]ߤ֨cY&z`i\a-!H0{l=2/?{ǁǶ1-2/M' + CNc{7mll!3a `hjJ,C}~8jK\ zNVG OST >V $ 06u\p=?B@# T7(;[.3kȨtIxIWV0jr ݣ9gvVWqLÂwO';3$ IVxoOv$!bYJёjDDX`hpsqUӑ0a^˒r©YL[S>>W=8,V8A,3DnRmEx=GXFmH'㜚9}lHƢc7_,mb"{HHN$012l[ܾsDJM׸{JvǏ,pzFk#QdVcZm*0x,j|@$ f僤6\H) qdr%/OZ#(eR$1Ų2AF=FXFV"cEɤ1[-bZ\EQϦ)ʴU*erSeq/eK\B>nXh o[t4MdY5 CG'_.,$Ib1fhpo8NZ3BN/0U:$!?l_v+384a>(vmXa-@I5 nKc4M)V$a=wbVtI2p˲ʗY-Lun߾ݵֶ8O ztJ ^q ޽hB s!^Ǿ9IRUF× sEAP".IJJJmFN$lkFHܽg$i~j3{Ǔ;f閧ȃ; >8@p2tk8~zfztwy>G܇Ȭ%yX4fT0?L.mTRy GC#Ĝq9+amǶl>>jp/6Fzƶ_xpZ_n|O{w i4#~i?;Ng2"3&LFHdP E`5c.P7"nX|'}wQjtD<-–#s3ӼpI^{ z[GU{4Mf&Ee* e{+o}F~z)e[K_WI%⨪Jywť&'s|fye5TFe^|2Ks9>3/W8u:<)4Gw yѧP0MsgP)HU)ØXHkN^ufA?_`};zHYZZ*`۷1==LDBgX:Ei7z'D ҭm* zUi[b([WV8'BQ<USq8z0iS,Wo| LE?òDy٦I%S|틟{,ôm8bX q(Wjư]ZC~x˃rvb|jڗ.rgchzUMRfm>sV[\gWvJeN/fXaT&PvlJɣ6n6OSk}sy.Ο%(hqfNiR >e^{}1x-Ldjr"&KR<#S7lgbiykz3wBIko)[܁p2| c䈒*8j&fi+]ʟ$,/*ed/>{|'YBiLMOd:A8TJ6ז{Tkh`%~VVaC|#<MSE=zK@0NۡjRwlll {Y˻ؖz+}iSf9u$myvJe42 e3>6N\6#mSǏq]a*zt& K6k59rm,sdDXBIcusI?D<NT* u"tC@02;AXGz JU:j}=6pi~6ʮjDuT6> IzԤ8O!s*=`LfHxD׀r fMsдdtUZv'g$GI J?3zTPvV_pv+=&ɁH@Ht'q꺰wR=b822Ǐ;2Y>{ ]vWbkkoef31>sIb}n bGT"!'ńK6,l]y'Y][d<1 6KMMS"aK˫LON8OTjaP;"y#M:Ecܐ"dկ{?S'-s{jZW=PW4k@wj8 j:0?%۶Dض)}I?Ӻ&>xS𙽓sG&;j=%<~BZZZzo!<|y ~gXG 3H%<48vv] 3'`IM2Wp~~>{Vdc>Dd2aLLj岼&Ж8.'I%exǙǹ#Cyʕ*ϝfckgbcKbkku9{8J7y|6e;=3Ӹc4|bemC*l9wM\!~Ro)rY:Ξdey uI'u*\Y]DZmFIbxG"R1;=c;UV7JF& gqz-CORCU#Ϧ`566,Ͼ,?x-,7MU.c{vJe_+\~[zVss#QݺsW(*TVŝ;bz}cG B؀Z)?r ɋb1|2 eO:VOV-ȳ7J`>L;riŷn|? ~^#Q"~GA@@ңckU*Exn4p]G*]TMCŅm LV40Eҩ4N7z,-24CCCLΤQc1V7f3mDz] le~vX,N$σ@Lvq`TcP֫<}BafU+,,IH%⸶G)VPj uŧhblKTMI$pܾL6b(q\V7yK s_^0tTR7n],R(\Fw:tͭmI(1 ,##TU1MD{!{./<)VVVO1v}VHX{W?ngq# r4J3ϰA&^~yWRʠVnY^YEAQ"!<q @ЌTi{~dd_[oq)A do=HC*FeuM%/ϱ-ԠJ7C;>ƃFCNA43YBBM ҷZSGFD~eЩWv*?/}pd%R20cDx=z{E*ͣ_$\WiY:V 㘖'R5zNIX\8wl6ܽr:<\!q,[;rY6Te|gbl-<*5M˟|8>DgY ![ iY;Myn4]fW]tGa{b?&%CE߹Ԙ`}mCN~ؖM,166Jyw csk uuD"!k59ں$lf[9bmۤ)4Ec|tn(O&hnPT.>\fYؐS: m.r}_<&f$󳇨(n3/=\Glu22_7s>ӓt gOڛ"CbM.]8G!4 q~o|[b:E@B>l9u| *.RcY6V1:2Z26:*qΤ[;EvJ;_fL\WkAtMӛ#3;;S73CC4MhV_ta+S/(<{iV$6y:PŸܽwSkDĉX)oI.7H䇢B:;'rضUZD<ϣlv3S8~<Փ bp ]WUhNGEBwnM NtNtM.LȪ: cXu?bfxXW~G#z=XDG>=Q{Xc]E{.E{TNc,Xy̎ NBxtћBKY/O ]GGVI?Kxݏyr8u$`` )L{) Zn@aE,(|TMlrM=ʎ?¿?#p7nݡn3=9aZ-)aoqa7\[;Eaml{ޗ a*s:m d$ 2qG\~?Z 2{u|} o%JRޭ0:2aSI,"NS,{·Zoi:."˲]*335ݥUTESO<ˡqJ].]8ǭ#7竇L[:_ ܹ4[[Z҅s?>mS歏/<g? pM-3T4L1\cY|uqm6}O;(K}S'ORTHcX2pSb?po 0*=D)}7ouc!v/|\vm O]co".8EF/^U; CSdFי_zlH몸,5W؎ضÉ ̰0k2ahhJ0Mr.qϧhhP͖aYڦŅK27sMZ#uo5@7,&F 8*$S)fR6L;$>f\|6Ko?~٩)ҧxчx FgTWI'MϿ)>u0fҌ q-ݾcnlZ6ZR3=1FT"c&S$1\?>+ a=@9w aa IDATP4{VFBP?TӧOUۭVYg#rSSSܸq#x#>om:*tHRa"sԛ"SeZ/^{ͭ-h** i##b'(ҙ&QNkn_ȹ ..q"]넊wB#\RɄPצϚ~v:\u{;\bU=xL(R5 ׵lJ0:X MvlX 4kxP.qRN} ;|\6MRŰ v[-rGUTq$|vJ%m`6cK{3|)>CC wx+BL_GeT$LaL+WdZL+Wʀjʗ_y3sGzTYS(Ĺ06tfESN2iL"8,;idX]L.;MVgnfnj±#lln4A,E)1wյ7“v-إG،[0eݷ[;< ۛQ9;fw`iW|k)]> 8s4Rka-޹r ,c҃@=ǷM߸џMY\Mv)̓#N,w "7JLlS'O051!r:6I-VVPUx˼5(LFab\. c"L2Aڗ.X,J%dsn3=9ʺDjm(TU yt,>D."ia=:$Ɗ*4b_ɷ9ݼÛ'纔K 7wCga@B]oSI&d) Cj'Og\O?D\Ii5̲n^mrILE~]Mj/e%ߧj!aFs)ϽkQϳ9>2?/Cxv4>-Qg(/q#쓼nlq)FW^y]׾e6dJ'Y*jl,x$)e8[ZJha&zw6m]䲪rhr+70?3{K^_?_w3z#gmsV[gz|1wTk5\q=g/x vZƷ cAs/=˿z5 ns{>Vz ױQq[X®>BΓ?Fb#&\#NN1L#i62TxzxJqu@-l`˺І#,l&=G>u|?4*rNjh@x d2G_Vmۃm>qXZ9j^U=Đ~ܹs! &G|`i޿1Mgϰf z'|͐>#T]Cg?J137R(*RT(}T* #/Ȍ`?R89ŝhlhZLm4[mrmݠ7JE*Զm1U3\ȳSvÞt:O1$rH|[4 M`P(aC&{jliƻɏK^c<U#֥]n7UUcGHac! Wo4z!l6,+B`} DZiɌRlsõt~[[[Ku%zB{'[@HܹeP4ҙLhҫu>P{^*-A_碠h6P5MZ-٤IL$$mS"о\el|L:-i(&'Yҩv\:M:Őr3-R [ru(sx{x+mQk"A`7~|>aB0 pLTvvv'XC>erbJ̡i3xi-/?GwS7H|Go B6=c$lcxRiܭ(ђ6…)t|+9!  SDx~DNN*I D2!ꎢL{T^Œ{T-ϕw 5H&E>X,eLT\ɐui(ɠ_!cchha:a}`o&'}@H-+{L_x\ݞNQAU%r25';HP~מ<{,fHGާZl~{OG5WQ#?*{Xgm=JQ ] OsQرKW̭۷!!T-&E#|l6,cڮU4jeUհ]BkoO&945IR2nX*Jc;lCSsYz%alt7|@:dy} ϵDmy [qf Gn[BS<OضA Juxnɉݾ7?G\{ɕo·حyXfecS ymTU܉LMƕrY^~)&ihx+|vi,cZ]L68v+U gFuj >Cr\VƆi3{b? cv,+kt+,Ŵ,fggX]ߐS e/ ;;;Piܳ,-jJ?vEL{XX,FNI`xpD01Ϡ7Ob:(u\u>!E*; R=hl}\8ag4C wb+'FxtwR^  { !B~bs(w-!MXnPgi7yЪU%GST2{hI6F7DCoiK4Vŕ?\*턙|UOS,'eӬ.puA41ɕˤ q;U4b>wFekk+BxOᇹD:띀 )e?1MTѱQABABd2iQo4Tr/ dWD|㣻h6<#!( ϲ'#呇/%;V`I;60ILٝ9!1S*vWZ$V |?˝;uptrBZQܱ l!桩x6QH$ <Ųl)*r)2\(j ǎjLd"8sGd2bqqږ%ϧ"d*Ш7tn.miqic[6$$%qX\9UWq&i xrKw<|,ۡT_E]4m'SbKPh4bU&j,bumD<$eֶ{SVțeq=O?ɕRk4s4- CLM1yB\L&,A Gx^H|Zʓ[ڝeilۑt1.+sslɼ>]׻V0QQHӸߕ1+g?*Jg{mUS.|FG=TwU# S.ו"l.P@;(jDH @|"DĤ@*PSQUCD<čr d{᡾V}AxW"i0~GUZl[ ?PP!>l럃I9Dzr흈4D"! -Z< L ɔqAϠDe'A!Α #t2^/*f^ b/D( =5 DK_qՃ_ 8P?4a$;I0Z ^c_s+_oCxu+ ayPuްE=㩁_c  / TDa059N<*z]Np! u{1lE Gyߞf8s82×eLBeW.EUҩ$t'.=o6J V[gX]aZF^saj~T*iY|x6*̋. hD.ӏ?cuc Xئlc]<6g*2NOW>i_Ԫ5R%TJ̎ё`D<$0f?5CgꐇZ3 0XokjqglJ~߹YANF?\WyRhK-s~ $ba~&Nŗ?kWjvJ"{vzojp!_{ͤqǶȤ4u*xCLUfRܽwsul|\j*QiCM\Wt% \g43Yؑ#[n,υz[^YJ~63J8R] |D"PQC??`Rw15ӁW=?bZyؑ躾Oe/~3sod ~dGd Ąb'M(J`|+!%{ #G䓩!)?&xEeRLR¦D NRayeWx|Ov־j8!z9JzbeumD" 4H$⌍ Sڭ06:L L ktG/>Ik:\6i[ӹCTUlۢjO S'*|TE3c6 fCٔltht =놸>|dӟpaMEFB)@yq` { ٠luH0mf˲hDk4̿q) V7;<7'tsq޽Qzk{[L락AN4~|d n¸gz# {ϕ/$*:3фEw> ͕UYܓfۮ\j:S{>C맄I+x"q? &mBZvmj뺌Q,44EayeUUH%mYQ= ѧ8 1MZ,F*SIp$,B8Eq=- __EGDŽ(Z|3gN:)VK%aF7 adZb9}| 1aZaZm4YZYc~nJC3 {jэvx>esj5b1 )HFUT`ّvH0km ܕJ.Ò鲸:DFEE2,-;EL]Ts]Wb?|0FSXZ)6iJ&ϓH !`Cg|lc)(InL&!3=ًeGlc?pZ}hX={ KKRRI01D82z4 a%o}> kZ!:FzIk4;9xi=&UU9 ?p:O{^tzyx&M)>ЏxA} 'cϰ٪? q'w E7S;~'+i@ovkeIXϐvXDu|@?oF8Mgt{6bDT5_P>,.de3 #T\~q|tӴKxMST,Ӥj*l&ͽ%}Ο;My$qJ<24bZ&xwyCTULJԪR)LӤR3Qoe X^] o IDAT<+kcBffXtO܎~i|KIۇZ!vd2 ':\q.;T*u8d;c\}B>z<}"pZadi,K40D#=p=5p?Dd>F*:AAIaװ;Sj-sط<ov\4C!b8'64icZ6i16:(y6LG agsnnz+-PH$씪,n٭5[qggl7oX&*#9vsǦ? ׵ikqV$Tk ۢT j:ΞtrN"@7LRT;0&'bBl6iY]?,Py/s}^|2 K+{6#tajcϠ߱UKK!AKx|zG<ۖe裏b>_#}{>i*‘G?`ހ`b̙3`8S8HS°,Px峟 aך@ev@{o~sȚf~W̏|SF.*h$JA jD/D_VgldD#PfR< b.>/}~ ,\M($qb8D\N*Psy— OdRuDoQk4rQ,\l&6z˲16O,{jE#onl.(#S֩7ZryLatdX)b±I""b?~|b χDMӴ}a4~!z%i{%d".넿#~ڙ䈢(I UwO U!x#7^OSSSR).]z+ [LMOsxS ց|fL}%OdI١!A׆.3;sKTku y&'Tk_r"a&9͖+=/鳙4j5&"Z˲p]ryDBc,u%y>X^@j̎r Vo0>:Dy¥N Ncxvʻf)Id)ܺH* mCL_YǴl<9vducȏ޸Ʌyv+51߹Jyi_R˲EPƴ,RfI"#?s `z۶*&ӏsGp]kc[VRVl.-$`NZ(^#][`"[]j\xEQ5Z9q͝dfM:8xHbncdRqZ-.z6N7V+XhEx<;;>Z_/خǵ;1&F"941ʍJşlvͧFr:}1MB1mmTEaXbjbRy\&ŹӧXZ^$c[f{n @G"%XF7LIzgqy޻!d_oO9}ggyuG1M2e hZGl5`۶C#ω宜4~bX̍>JFC˃Fs ]ȑ0}f7ڈ=쳬tCo4cP= { a&Fغu@Q|Fk=02S(^:+Ժ7zs\_Y\ ~&;i& ǨVD-2;;U^gKcr}6*SSOL_iɈlBWt!Z(kZ4zGyw}W_1aiH"A NLZ-P5] #bi!`lVh,p;s^xs ^{ IYW{?=zo [t .Dt;}P" I'H N8a.֍3MUwuyV7{zPw1=UY><88BzEzn$8ry$jII-EHԥ|4!\V` Lt:[|ǶYsuhT5@ ,Kduo2NjРͫ 44B$q9T)Q3Onhi"aW廗X4IInY\ZlΜͻ0 ښAd0eX0-11<<$뤉(nɤ1L1Ma@`HRm8 juťE lQ!d sAڋ9pfY]Yڵ6g*үBv,bQbgbxxϾ"NR+']P:,VzE&l*m uJ"bbbbBJ"d\AU-|ffT*vvȟmwNOnŤa`bBRUaFW (2u_Ws/e6Mdtd]ש׻T]SGJ(J4@_fye׏S[՝oBٳڿ!xFO_/#ݧ(ˆ<!M{PvH)TH$H&$q**##y;N[|R͔1䫳-{FUSGR15;{C_?tFq{Azr 0Iό_j.g%ZT?: xCL=zMMhb߅G YDm>?O^;CyLsVѠju$uO#yLbۼݕ cn`|`PCUEBUD`D!ٌ0uUUmFD ;dkj iL*E* TZF*!|3(i E@n4m391.uJULQCb*3>y6 Ei cː˘A~ xezi>⳼wȆMns#f*L$him/؎C<gY\^(*&үW_~EQnsOP,{foX]789wXxHɯ'yU_SMUU+kD#a^ͷ/bmzɱ+k^Rj5}ZX4" @cJ2no E7Rxߤ۩(R=EqG\ pxcssl5 U$on?!|f<أ,.-uoz=xܾ_gfw ^n"I< E  iBlrrzSvnd\ɤJ"Ķ, ZEQiYh!STΞ:x;¥o+@0lJ|Kgck`8T5S* RT2@:zc,S7 fTFRjUʕ \P@!1牄|.iĹomiLQIu2)>{Ogs߹L88y)y<yga(rk4:{H8#O ++J*HLĹ; 'A lELl 4:BT4 ޸%עat]g}c4ɤSܺ{ab;6_#AO4ٵ" @7Ỹv?#U_>c#JD_ca( ]b߃?z֢)xL L+xH>FQoo` K;Gn廙I{*}$ԛ x~VEűrӝzT\"NÂ*( =xAz8>Q,ő$(b1"ј1EU}—kuTXȳ( (RK_^UQ0 5 uTaii4P:)+r#!L15 PIr^"71MѪ D,i=|b,:fhTL4$XO`]7<ёABr H&Sbǁ&&FI$ 2[mBa21>J J*@W/1ebbB+bj@RP803ͅαKN].^9|ry'K{}hjjGfcُ~Ϲ9DMSouM" IiLOb肥 P̛J֘Rxesp)SB[^QFÄadB0o"RILdyuC$Ej1YA4Th8Dfvfq Qc.slrӴ0MjN 쀧Mm`=)n,+k(U~W^Y2 v[05t1m[BUhVdp)s f:cʏǢA m2i1+Moߝg#A4 =,_sHsG2ؘũ:FuG6RxY[_ttACo066*>:n]3Q5G"v1݈ cssܺ}fiu !oN IMv]L=bJ>'{SL-ޞQT/fچx75??dayZ.R;lB-@7Mb8pё!,fAn/14e` fM ݴ Qn/2356msxvʋLMp9{.Ja.^oEf&ǸqgXi4;X0oR3>2Xk5҉( 6[$b!ښFnsPHe O^#G#\9P(+d):w/8=w/|I~%*:fӬpgatJL4fj|7oVaے&=/<oޒ>A dҴ 5QE)5Ex8ҏ3Օϱ<]xv۠i oO]ضLm͓5q??T|jn?;/`t/b[T= olQeOY޴`ccc4UYb>& 9{܅~rRXUI7?qVnF_̙3lnn 7 JDR Axk88rrr_ ׮JJ8!Ljib 23=MR fTMk39>Ά4ִlPܱ-MxmLSThu幑$ N%-oI <0+B),@Ց!Ţ͕?0_|swE#z#u cۻSHޟ~ď*NۙH]"5+wY$M(/"؞mjWN1(CBȑݹWӟ> N*>;N6aݖQ{&Q5o};{CP ] ߋA۔ pE}FUm,amm]bJ%u;"d,f|tjUN   `dfE0b` +5 dfzV+/@N8uyN89}wmD".%AMnI0s*pP z Ӳ"D$I@L؝86Va{xeT*:GT;yChmMXBB֝y~틯r]JlqUߧʕI!]YƴlfgfZs\qP(H*)tUj@@|e; _+\:ZӴG+5%Jjqp),aV_L0(noŅ0D rr&I L4,T)<㬬*ig/j5 .|qt#u](]1"J %yU$`6x::I>czف4MLr=U5 %;e `H^BeDϾDRρqoDk(q%<ࣟw{$@>]{M|154OJ>/=~_q4i|/u(kxBo/a17wOǑÇɾ4BmBlE[p@ (p.+K%ںA2ZĨ"!wiI 6r9B P* P(bhh4vķe>~n47 J@; M8m]\.U F=#'QըTu}Q^̳\@__P7$M"+kɳ?HsQ[h6O>|˜;LBۄBA7y ?KVflR:h`:>kؖœ>F.G0`txJE'bQmM&n߱jUo7N=;vW)O xǨ"9I7u^\d0|2\=4_yg;){lbJQ 7+![w޻$tM1v.! ۖR+(ʹ7[ ݰPTG#qWBFr?&ֵ8LM[qĄf?Ss?ͭi}gB;+*PH4{$T*Unܾ+"-G<݅E`oA Egf%l t:ET"B&+@VaPL&ժ0DuӟeXe,,xy@641:0&ZL~ebaؖ27>9}]Jw]q|HaMQ= s. =b^SQۂ 8ksA!wrNeK@wE)80(a3!b:BhV@kw'*`OHȤR" )OPHR"b"߱C!lZ8ʑCoZCCbx C%pX_.zGΥIcd2in dXÇ#(Ck&[6#$ZL< K8,]( Aw?_|y旖]z=T9s]1`#ekųZSAΝ=E48َqYVք?J4,  doBL3<^1FFF,w՛Y\YTbZB*Z)):;i Pq[Pʱy** o'ҕwo<|9 =9NW}h4wMۺyȰ$ }eJ?OQ$$;~\={@%cdJd[N&SIFDŽb~S<;\Z^/s UG~^fK Tu3[+ܥVwn0w[t3]zb>-wSiɍَ^=5vc}LvO'}ߔG=pgPe]?Ө du1о/X,ٗ^b~~S6KT5puQG߆Y0uC"E34`F4D\ʑÇjXI2MFG҈tn&i@" Œ8v(rZN0ƭ[dYR$JA LӢ$r0>01w(,,ql9v-M\muɂEC"@M83O<̵[w l[w^Ooc[b 0x^A [H7=-VB 0T7YyRj@@hؖ4R,4ս13/<"K8%>^G"U0-wT:$5vSzիWc9wͥe^/:H\c]Ze=E ̉cTMLt Il6zj#hAKyH,bdx'߿c6m0Mʵs‹{W@p X#]\,( aJ=,FǶEB,cccdZw-kk]-P޹{F;;t&> g(ۼj51a,H4k hE P^iΜb}# w d /;{nHfUχ96wJuRZQU R֦ZsIrbVx!M7f2^ζ-wo M"> bmJ/I'i4"& FB!kO/we4k%*s}peeL},gogޑ{2qVV׈D¨j5zݛ!ZIRh-C :?H,ޤj#撽\?]׻I.,#G(Tkuo[5ۿ\>= K˄BalbhpJq[jwO *A%biuk{ލ>@3΄̔RH%h"PM6 Ui, $-1"&FtO/k)(s"kqEQ八eoΞ=C<ᰵMRVl6q,۫)QSD,iḣ?/}0ScJ*͖F\AUUJ CKMQn]@$ ۶YYh$I&C"Wj.tCLA|3yozgdhx,MAzP0MC=sہU᭷ߓຈՎC2L ȜN^x` 8,SԈD"leΰ]C itn r3ܸ}B6Y\YgtxWdFYy5 %&4/HD">r%td, âNpRi蟴ZrZqgsz#&uot%61쳹q ٽ-K%~7.Q ˢ:f2/2lvD"I2D^J 9k冶v%",ۺji,dwvgLV# k}/;Ksm]ޏtAOfdgzMu tz?>>,է5Y@kBބ[fXG9!ߢB`};_7.ޗAnGcٖmTNW/6BҠWT:E)&&Rj5uMӘL`hp|~3F)l@O  SigWضDhs nޙǶm9r]ƓAQ'H01>o_`b|m!ӥB*mVc_P( pg~64n V 26:+W|p&v.^VIچ<ҩZA:dumg(80txA8s[jx9rZ> iug2iZ'L;F;,Yqo{,vۻ>@Ʊ}wifI$^0/|k_;'x}{<ٺ%aoz;@ߺ"LZɑÇX$ 2F0UŴl:zp$B^)~E.=I"%q[441X+?{ޤX񝯼;lDaYd(A7L>ɣ_YgTRR6x J*#ÃYܚ_bXd i228ذvHl6kL *2a#3gPDk5:w\%VM^za~eJBaecV uNb{{_C,)簺mul]=P<.$DO<:]r5Y: \m q4ޤ pq#$P]9nǏ{; =*JTٝe\w=zA6ADp]Hlڍp%k}?Ҵ#]q}JUO=8Y 3,6|Wƶ&&ƨTjضEkJ67[D;{@ZF{X]FI߷ud~Gz躁a#Q,1ِ,~e :IkÐtG\S_}Ks ЮP0:Ñσlť,B,%J{dmfZtM$hR Ӵ|/  r!Jwq"n- SFǑρ⏩7UUJS4ZM*E Gض_x< PHյU"(Fc#^6R  (L[mLNƛo UUEUÉc (JΜ;h#'`lf|tēOϿ@\& Qod)lPE!L29&ޣ҉F#4M!sؖE8$)~œ94;`w\fF!= +k8C,% imR(".hzS C(bn, T5޸Sפ\s~k7nalm(l)>H\%H],h/f{țj4sttuXMFGFd/@ԸH0(h4"\"|Wj@;Uzz~ceuƑ9 cqiɛn-(]?9-Ҵِݾwԝ2 乊nuI?ɪ<B4OM&'X*c˞QR!P7(J74E-N:&XÑ$մYQ$8gܕۄIF]m;&az|l7 |Ls HRXBsoEQI###}]ٶ}S&4c? Z%FݟqfW3JW%vo{&8A4 ٿx_~޻طg?<۸t~͋57wD2Iđj$&#80MMM@''.R*;;e&'mrzqHc6ȤS5 ۲! 7obrbdx |X&ޙLk)t}TUU6.~cd:yY/~3,,,xEr/{M1PSElg$ڵ{Ks|_}h4VCTw.K=_G&軿]jRH+5B0M3ŚI4BmN;Jn7qPh:N1cx ˑi?gbtrN*O\8C N17;ZM7F:y 2HiEq>9[%1i4+8=c&WUhfۏYvH4ȯ!rM)`@v[d󓟿A0BALup`z¶( y.몕W?w\>_L=߳7o7]/|=PX4:ƹ ֽӕ^ә۲% ]5aۙqP/}d6ARzv-7$\{$".ΘGn)1&|1Dv4C7t,Sh,&'g! C'r; Xha`u5hT4TJ ej mTF4[M ( hPfܥbQ0,R"iozĝpSb8?련<a||ӶVj:}%`KI9R159ARetdVS#+J6>re..a&-M$PVԷ[[m~UnYS6p:ȃX_bTdtTEl0LΞ>FGP%η^cX6ZM166JVӦ#4[х0#CrF9~k@|!~ xG jǏb $qVָp gṈrlյ agZ3::B M"LPTldX(i$+-Q0ddxFI,caag튾ؾ5{ Vz~^#l{Lk'R𚔁!pଐ&Tɤkz-ťe)붍+{ܦxMQW=@\&L`VwtdW>2ndćqO8NZ&8䰊  l5{-d:MC(s:AOٳ}EUlUOT|==.}7<(hW𱗿Z]c%~~\P{\( e݊_y+{4{J<,--~`>/حQz~z%={!٧ x_8n"CXFԐ&"ږ~^8:xz5U%m"mD>t6x4yGXXZ #l6F#;eY<"l]4&_}.`Z8-VQo#@c3=1A\!P*=[.c f7b;qx { )?s`jUUhLMS)<XE"Ni-^zYf0t!ؖ TK. (Z[[~Ư'[]dRNd,(w5K}p_8ֈ얠mZ=СC˥= utzt/^ܑ7 c\%JX v<ٕgzp$zc_`e#7 WARoPԱΝʍRIFPW6J&FIYdTEUln.W aU039SyL?(WO$],MP8n6^`e=O//޽\"s!nY`frMZmhm˲8<;xql= +$bQN;̍J7/~eZN$r7޹@\~ ]k ECؖI,X*{2V4/w4Va REQT$q5jw]S-3olWZ!TRKmes<Y*&ǻYIk6H?NZ5fp|; xҧ'Oر9E>䛚=r>qk(d0;vSN%徺u5EM]xG* IO4ۣo1y؂xG<),,imN#d Y~4-,[5MgeuIdЅِ o7Uқ- ~s}=@Zeemi3486hmqz߻I0)dv]ѕ_xn0;&Y#栰]* GiZoE0$H]ް  ْ. Zo%}jd/W*B_gg31>C>\u,'0DCXZ^qlj^eloo(O ;cC4-**lQZjqlVKx7bWFG)J~^0MꍆIy.‘iDy衇X][GQ`kkkG>ʖ\O$a$ޤ;=zs!g&Ⱦ蒸.CNJGu': +(>u 0iZܾ3O8rJ劔>uBSh i"q< e=&Z''&Q0 KJ $ zղl?-HN嘊=ձź.p=Hwk;j}~DNL6IH\o$8u[}`;fffFq_S[T.c/˃&e>Q=I@7oɕd2)l1\Jf>|.ឞOhYT}hG +{Q^ x/{x?^~?8ⷋ"RRUXF/ od|lr-xibGxfzK\.{ AtFh[ȃ.J0`e}Crn1L׾*7d;/6n޺#MΝ>I4L.^o0518X^`6CKkß8}'K=y֝yo9nb '9w$^̉cGYXX(uN^,csmP\۱YY]<%=vѽ&dQum jhhL&s_ڐ`=#LkVw{bGv%g?2:q7nGiAu*n&:&'&5D b[aCMV66l{n]rN>zX,FTPRֱl8qdVHX& D#XVg6Z<2f;`&-6h4[ܜ_bh(K(RPB!Q d5mY\5i|kۗx)ݺC,evzLF!}'SRUU&F6Wd5IbjTLQTZu3Owr[൯~Gr|`U:Q{LzA:-pu}}]<[l NeT0eG"/v'~Öl]ᅢ  BKɵl:9z`rjRvÙ.1?%}p  xS.` I$IYg*ބZ5{'9:  JP*hT( &Q bŴ MM/LZ8·ddxR9V#f)AQ"0435>X߶ O?:kBɠT(*C gN'U`r\plٸAQU%~a旗  TUAk=upFE4"l6-.jSP(PU6luÓ;t N[׉:{Iwb7Lx; .XAătA1DAI!E>(!)Bq.DI BGX5X3wfzz&y^feUW]SSݕ\K+Ǣh*mh,Fe#1JA14Xda8+:lBل뺈EHRt J)_}G(s+UJQְ7^yYP"ahSON%2ҥmE4@fzpə)DQoy@CF|4=]Cp}?g>(Fh?"/4M;`Y=(& _7qOc 8+'N0D"`~ ̿3ySF'%4{AS@Qހ<=/Bo2X[b\ A3LIaBXαmb1x+ka#Š&l^3?'lzǣ/)u]T mmaߏ>L L@$DEoINLaX{ XZ]u[XD<jNSn<}[e 6p/? NA\A4jBфB=-$qX [0Û"xm,S~AZokaXOxt7q}5xG=,ӣ]^X^YŃYulȰ8=8 X^ _{)l)+`,/Vp*5 ݴlYy8 ]g* APiϤ`Z6M\>3ۿ%ȲT LzͶ|6 ǥ,Iu4*]8/,ml&޽R{ ی"*u8.k@.$6Zo#J}۶pzv+뛈C% "`blVݿ!@ 歷Rc{g @ },:\£GKL}!j5F813-3aYM|G] 2%8"EEk>Û/ߞw80zBp 1V۱ )N-k5K.!^ $i&'sss<c;w>ql~~$0ɡNNzjeȲ Mu _#{6S"Wk1_4Z,,cdx@ׯaemO)G~nD(>hu$"c̪cB!ChLbVh:L:L^b(-eͰT*ͭmHUS!K"&^InKD06e(\>6}^OvH1JO"GD H{Ao:/q#RMCW@2d Q@Zu]-c18j qmQ8ٹYlv 181=R[xb] # Iòm$bQ?XiZ(UkiYe3PU ɈǢG877MPpǐ$fh;"#Z-FƖ<"O\B4Ӵ'*FFQ "4@ej:(ahpnV A~[UN{HEdy!< s/>GKP5 'OL{@9I01>Ss'1AgRIܼ3,>ZA"GR^DZ c[(E:(( mXi(,-\ fWq46~; 0}G& Bp];2glleJ# IDAT LO/O`YVqژ=56O{κhbSuKbd@ct_/ {>} Hu] I7Uqbz+kwva6 ήB!h724r, 8 Q `$@)<R@( Fp].G*dY(J3 "zG08-OdGu#]1,`E$$1I= ; G2< kX:>)PUVCRIf~aZʏjZi 8$01(Qrf,'Ws w?#CX_C!|?1 !+p&''x('[TȽs9kU !=AP*-a6eQq155z"X][BocyF#=ťUfPVqXĕgÝyI%.tM,KǢ ءd{n$**~񃇠E6wP$ Tk5o1;/Yf[c;x+h8 ԑ'}2=1d V0Lh?\&jq^G6½86ڪ McAe(IaTKah,E$beI];ncsk cXZ^E4x՗?oƯ.~>xP."gܿ|/ Xdô,w\dY>KbjbJş}+~#wi[PU T*:|xXi, 2&?O>˾@&` KS^zs3?@I<)4@i^h "  b;6$Yf(z/__C0P(B!wk[hYNb@[QeqbE8B"nB.*tCG!lF:0:q\ ]6\{QeQQ֡ilǂiZ~h( ȟJ(q>q*?0M(lAa6FjDQ3(Wk(" ۿX\Y[ iM`U,@Ա4[ jmm# H  VFUݞ8BR$rZ"hN͡\dQT5\v/<E4..26:_FGQՐɤھ$N!͢ncppJya8F\K]/#XӧPTx#& ,--z2vvvwͪNڝ|}}Σ$KbPmCEH{l1T̩YJOl=5D.A4*`qӲM+5LOM0tp)Ņsg $`?otӄ,3"J⹳岨ՙ-@Q\3gˡhXh42)$ ##h48s vJS˟iY轟c_t)Q@99=H۷3~;0^}J%"8T3 |~n4Ojo@#px|GD/ҕcbbWz|ttF{?s~Фlv!c_b<8 j ]>lJEjǧҥz2T;Mr%L ~lm],0-&e灳KaZ|ExW>p] >w Kl:A뚏~ ]1P3PD!Gނiٸu.@Got@.g0ΩqTUPţUWftxvɕ"בLġiE(+ݍ20P9bm}w+L&h|]+,cI R)),ɡ=;m}ø ;.\Y<[? 9?46: >{ f=Ə@O_{BPO\(8=*4[06TğP jhU4 ˁnZp b> I!"JUܸrKxK "ncp`н||7 r՞$ժz%Ngj F=&[pfVtCljTk5lo3uKD,Jgef[JRc{w# `kw `td{2NΠ! h"Oc`r.WST@<G[UFW_D[{̎!b #YSqQo6A` QS1?᷐YX˲Ur``dpX=&G9bh3EPT Rw?`(J*mX4MG2 Hn$ "1&q!¥lMlx j |zicyuiW^}":FG01>R>H0tNT.sh0 Cu3 ‰c#w@}2M˲%  f_\V+ٳX^Y\+>y u$zR?+AE"t6F3 W-Ƃ\62RR|Ŏ%Z6|‧>vL]wPh?m6[?n<яzKGϚץ8|bL|Go'M=APz&x3Ղ <{qFj@Q("kϗsx'0H~21=fdNϝ^:JH8]ױX4\h ,c2aYf P  ]gal))~15@Rw_ !~,G_V(Fp8Bp,k^}\D|qf}쾺>h"@U.@:ط=pEsSwvvn<R!jۡrd3h)‘(,װ ˥nXx 6ELAS՘V5$bQ[pxf[7p~v3#|\:M `\:j9\;?A 7,NQ7;yģ{N X$rI0;5J- $.T" ʹ98Eiܹ`}s s3Sxh" ۶02Xĥ+#LncGBހ*h+ .ý o XNu7@]QJKX ,~06$FL7 T`{{1 y;}s`ff zݟp1Gas Æٜu@l_z +\iuJj77}?]v(IsaC;<\\,M/' lluDnF;s?(u l6H&PWVdqDK}iVWyR>yq\D 8f|.zΘ F5Eԩ!p-qguN\ B7L8.a~=ͯ>.>xzFTk58q8uj`4N6H޹st:dz94ɏ督3959xc*>׻, Y/&&=5gOYjGu+8 e*  >9t}_A ޴ etVGe?X{Jzp~ΉP}k>xp]PJ Il6 Bi}%>D4C8C<N(2~nlhq`{;JP\J|+qD$ɰm_GU56x<(k@ B7 HA@$8{j)rkuLMu\4[-ԛmDB\<J+[W^L_:69πmnu?,CQU\tJr L >}!! V8*!ʒ ]WA>50 Gt cms۷F84n]P53l560(,Onp1;3rCEzŢl <.b8lۂj(Xȼ $D,~M |;(%IgS*b:[; p\t L.S>9\Ĕ&y%t !2mgի;?ߵzļ~uʾahe}/www/ 3B+7KK5AZx|jrv BD'"\"0-xi,a,O*jpO  ih9bQ"FՆnڌǻmE8:\bldLSXY@*čyDf.|wB:/"l<=wH0\Jq%v""eST,cttF@`WWgYWr'?P,•"^쬉^0alwB÷=8H ұx$G?o1?q-zOx;eo'lq6z^A6l(=v @h$۲:Y6s'~.FGlل.!ba  "I&BՍ-\o*66qc*;o:c>}26@@9D3r:fP1yX=c`GK!E0:xqkpS7`{h@$ 2g] ߨLĠk, ,J 2gzg-f}¼$# |Χ xtkk]Nׯ_쬠x"y< $6jRZIP~GkEck_ vym3u<>@mGyzVs|""4-\xrgNagv[A:BV5Qfki0uLV WpJe>GQ*!" "U;v)FGhJ^d7qi|x{V dLl9,n`h f8>5ÛPUxir;NNL^g~ 7%IG򸿝 IDAT(L{Enڿ#]C: ;j<3K)ҙs `{k ׵m.K)e tƼ Jrm& gk%{}k`yV{` _Fi^-) q_c.P0KNV}\_v~ DN`f`n'~`Һa F!~gA@}Ϝƒ%3,9+.`ec ׾Um4[MrdT2 0aYrUFn H5Ofv[2m#\"$plX TǚqAh|X$ Mב尽X4Fp( ;s\nA&b|]v +kuQ|kO] QfQT0"KZE9f߼F 1FJf*H_+~7k>95D7L\z/*UlCCDXU^- L ȡKݰ!Q@"p\氱v3`6w`.jmc\`Cuܼ}!Y hl:wYٵ ҙ63E\JQ*WN'}8S22 *Щ!O6#xnU՘Ukש}C^D6Z>Ѓgv^bQ?0qðwe5R*ܗлjiCEAWUܻ1rשR|סiڡ T*L2ẓ Mƾz"eDo ; r3?+-"ʕ*)E-F$gB |+0:᳔pfo6&$d^{>d0fǨoJt _w:V$Q@$e4f/%r~ǯ}~3(,?~]sY<3Ʀ`PT?w)lln9HDZa6dO㗫?b2߬>F`Y&.]<ͭm6&$I,'I®c^y02\Hw; ~ɓ'YӾ `{{S9^簼xvoϢI&'p'`5a|?O<&D@"@*mSX1Xd:H4#K@*޻yX16vX\݄f+^m݀,Kr$*h5cPJ0\'^Ϝ[ȥS68{r ~ \9siE {vJȢKO◿ ~-)TM,˻pl u FF{?}=PJ1[N3ϛ= vR5K@?D"Z ЄRz`Lm( nź { nl7* G4"^~fiT*?q~B!`J,5ZqYV~|ۮh4x(y*YfR%B@)^EAD.C,i rmemn3[.bfjj_j&dYͭ\>^XD@|wdm)jϴ:cu]abwo@p_ݻ{#nawlE*Dbr|; *&'P*it@1krjё!-hT*H49$#LAe|Wptī/>C22$Fp;d5[kPlXWt9}Qi$IB4i safeQ(b'Ex@U059;Bb(t |^Z7I a;Qdp5?8M߂#< t=0yV@tG$eR~/bx1"\E*:֦cxG8GKpl/CЁwA=::ʚ}r*>Y~qgGn۟R;pDBC~6D*Ŵ,\rZ/<~؁P8Ӳ!_$a ( =YL^#d2Y1Cg=x,D<]7P !|oŅh4|_‹C@y㲣ȡ3kDB1쉙iض+B ,<|fD"f+:BeglR02 ױ;T` a  #/pnww+K<89-=Y ߏ x<ip N 6.= -߹;Uv,N>}j6m=ʯ !@ Q!2fO΢hGONToh!"B  pu/cbt%L+l6;G:W_ o7>_@"n$h*:y8=3d"n!L@D UQ )gùkZ<u DϽ8=p}׾ܼut!I ]d~A["ɒdL06Y9YߎƳϲmOqHxڼsxa,<D qܽ;\z8l^}\"Zjz@kk Cln:f}?R)dH;s9f;jc37ض_yz_ښo1!h0Cpʭ>vm׌nSbQDQ޸4kg~# Fp]|r5V.}) ptd;p]sw`x@$RI$qڪ=3wP`aq aq 9XM@`0pz**_<Pҳpi0v< _Ro?= Ok]{r~0܅Dr(Kt#;F UQx A-v\^ i4zECO~ Z-A=rJ)fQջЋ"LNnzXo Pڭ?::ڷ1;"" mY#kAvp^3+p8 ǿ:Ht]z]U>Pa P " %R b@OG*mٝ1e[|C`vXB V*12Omكvag9Vyap T]p؀ˆsB/V6 !&˓Fc}'P5!"8w@QTM$ laldz!XA!.\8ju,,.1 !"7aa0Ll_C!2G`k>h"2gIjj<ʷ@^_⏱r7o<,v?BCgJ%z>Zb9s^h9`%SLT&-*O;0D̙+g x6%D 3ls{ 47ٔ;"jBr!8f "LBPËd*M7phHT B7 0-\pkxj_^]vJhUd3ٶ P6Acv:sY[ >xd Eo&ݾ= J%؎D2T:m bkp8gNGxgnXA*B$\:{Ͷòq,,UoةY#uUvrK( Ex7_L2a sWbae8\,1 Mß}(Uy8=6 *k_xp mCt/,\<3fR.bMVoh4lL $bTFX!??~(h`+8sNҲo[JuuAݎ5_7DX h[16:>/!Ba2 yJ.q]Y9SZ]r%|!m<̀xq^?x]c9a{{KQIǃr(ƻ'RsrG٢`“k^ h6&@4wg?$},H467@ ~PǪ2pzl'簺]2*uyЫc(L{\c] XƏk (VuPD8NHU zU8 6x&R4E8FZ7Or6:^6BeD}PNzT XӞSzЎ ! NxkR3E~_ܩWHpYEјmjpbJ2d2iXl&0k($hQL&5 `dhre4-X uԥ p[2b)=mD#!e l$=h8 а UiZ!,Kp- `Iwv:!`&(Wb1JU3f J"$x2MDQ?L9JaaiTj s9  lv]$ C!0j6vJ5k/Vh $ԉ)4 TMC:DV$D,`*m{6IA ذ\edFJ`pZD,JTE*Ţ0MTj|^DN\1JYiu²\6S=y&ZY]_/Չ9x.;X u@9@rHKv=1szz f I4H4;{{fe־`oހFt!gHj!4)J2eR%P8CG8!Ga1A2is3Pj_r_wo*zz@UVU͛=9=*/s4 ۨJ2Bu**2ͰS(Iϵ9f~=`6Cv]V6H%D"NemcjF&-XFsV fT*Ln(糵\L&-D!;h4$q?|H6 ]1007GM}7{aMaHT(UjꍎrJմ'UHj@k nPolH ;O.&Xb}gNu7H&&$ Ebua;)*#CAҴ,b(՚|?[yXTDZ-2֢:ϔf4㺔T딛`'Gy٧5j+X+ɷ~E7 äjvMaiű#D[l766(DW 8He{, OϟUygZOHMi^ IDATKT'F`ztyҮ>ᆞI:0#Q\O4H ӲI$eTږ&hӘXCfltb(Wn.O?&ZB Ɔ8vtRUYW^}&FX^ߦl?paRZA`sgJN&`(ggi} ӴE4"׾).m\K$1NRoW%;1LJ72d\-hh2MVL*Ӫ&#dĔN~?7xg?<~sp͐#Ś{ؿi0<&1d{wx?cʸn܏y}88 CƳ{Ჵ`my{/sG{Ny e0WݠT GLĘ9rDHJ6'͉5 Ol&C*)&ݐf kzD"4U{QzYNޠܝMp[wu:)5ϝ8*kD avI{@ O 5`!M.I:<,{]Sʽ=1xbCE K|_g_mt]Цɯ#ȷ)ޯoj\ nS^>193RF1ỉiᅮ4d WZDNspK{}ܹs`J /<,X\>OHL>:뢿b2{ߘWB/$ek6 jB%-G:FrC I[DTİl.**^|rH4rSlU~KԚ->Sz+\Zc0e}{UOaj|_ ?x_|Iv *6m0- 'f&iڌ )D<Ǐ߹\^\C?AVZoS~@mP,Wi|ꩋ{mffzb|̝u/{oMTAU'F\1hDt@݂Jum ױNp_) WVATgN (&IM%!Է ޿<ͅ[o X\泟y[]c4{xrbzg eBҋܾu-5ï'bQ*cvvϽuVBroXv=ǿ~~eLl&>Fq9<]ƆHZRUU+ WX__h$*19x8岲Q$ݑϳ_)β.ׅࡦi!cKUU)22gNfww)v Šyl&5W&4-w\ymftD>&ٱE)1x<ԓY\{j 4-9G؎Ȕwf Ӥ\qdj \Uӏ_ Ke _gMTEjrq9~lMl4 )O-hJw ]_vB/`OIme^6]sȮ_ͺ;h5db8S ddQOG>&(kGO"+ rKtpT9;22BZOLj^?>DQ,ûCD3%k2jLW05 uB6ppȤ'-P*N2_kM ׿>"Gg)tcl1{(i 9Vױ:xdR(,@cx0eҨ7p, S:f¶LT TECZͦmqnYBP,b]zf1MDZfr߳h((8l_xƶ,N[cI&9mYl!sy95UJl⯳'N@ >C<.Bߠ|KX_1ݮ#T@R&cX"щ1y^g_?kb {{t-A5lWE޻!01>Jmblp\\nZC ֶ X,댌 nEQw|*PfVo*;<Sr9J QPk4g+d$}wuPM/ܢX/㸌j y3'TI 1gB&<"QF_˶uIeBDDQ0jG|?ࣵ|֞3$g@ޯ"òJz4_^_8 '$Ɓ\ MW\^tc?#\lWYG,Ccӽ\ŲF҇p2EkLwS ],B5MÑL f;HF}}^ulK*뉉[ԛ[B:fdj* 8zHJ՛{~/ x(]cM@57'񧎿/pƍO ,`g'w/оh{xwP t;ҡk{_8"Vw#fd2?vյ>H0%T%N][euo+WO'cU("|_07hZ|@64;'aO Sj!6)/g; hZkFdh&Iy MxfMmHҖk ]UU7ߧlbu]TEekk_*v@ƕ'uDAy{`8ߧ@ Mϕ=8amGOs dpm#uJoo΃#08\ƽ1aclt+w@ ThLOO oDH,cxxXܫ ^z( *o\AG{aaPHRXlXRdި(j,R:>#CQiKb_خ)R< V; (Dt(4!]&EU\啵`0Mt"$ S(D":]2 dtd+~ ɥJ8<$I x ER*?4**gؐi+xi8ؖI:jYBJ[TRJud@!Am}ؗHCƥ~ٱ!٩TJH[[ ]i ^}_ u|W Qq/,; {iWVQ5R~[Ȉ0;/qm2f[q&LjdiV6YX\6yKMnYfk'O4DlVvضIv`MUc# %)5u(W}%IH3s3o`6c#T5󴍶,0bFGɉ gjF2Q~|*c#~*h ׃H4J$%'¿׶4]'wVF#1Ŕܘkjhq\!K.ia]:Dx"iVKF4 ֪Zh4@#& Q\ wV0 f}lmm37smQ|onnIoDhbxL:am"֝lHS@_Ga W*j5\G ykn8qw:~x0=t~iǽv<s{ݍ~rJ/!h'U@z&m'hP~:xZ(O VT2iYLOS`qm"~/ލ%,Of~|& K㡳pW\/i^|aVַp_4W963Z@*n?//:$r[lbSorge͝O5>HqhE{ō̟~u ;+ss+@߶Pn27{ '/8`u] /.4zo@:4-70L-1 #S rpm@YZSc!j.'o߹`VE,ܠ811AR!lTgvvBBu !c1bY6Tgx BOUz ]4-yP˲d2eL$ vi quY^ƪi2á@=n5@Ǯ O>oT-z _{{shtNNW|,R/Fο;MFNq? J,4zhͮNTMLLPo4z> +&?4<"^ ҈9<K;nJ' ja}?\5M_kJeѲSצ 18(hfFSW?gMxRL/->"%Ԡn@W4TER-6cFKHYy*P;;h/5"$mfn(ZT*+<hDsTq:2۸X`.eĢplS=j:x MS-hulf0 )cQSU&'I$x[;r d Nt_KQ%K2^Y\|\c?=swK\'aQ^f_ߦ|M;xWxX\\kK/tûNJcBӴ=7'SmDz_;X=hBRP4: W&*|Cfhz`ltl&КmUUy'C\nrJm8s$;lJi~2KKC:ZmhzaFōF˗.zyL9[ ;} D, 59E ݎi\A<Ŷ.h<{"{XjaB`<"@}OdG/n(GWi4UCoJ S aXv~{ϟek@2\kPPI5j6yl+*|(ҩsG&FZ[2G޾ol z~nFN#.IVcdh® [.! D1Q=<м7}JXby{S>zRz^󇧔>]zgV(ZlyA}(4]J"r Ó u ( vJ,V=Ǣ8juRxԭwC0ݵeR2Mr!Ɲfvfjc[ ՚`[f0&YP0CUQUp(zq=Fo@H& z:H4)ˌ Gq=Q Pթ%F-9&Xuy#VDQV6~bU2$h٩qTD4JVq>3,ܾ`qa`Z 4MTEŕAT1*^ZceOhhk4[-@4MCˎ-=,h${c`@.]Ɍe өam<440﹎`Z&ILӐ)ׯߕΞ\.O;*;S2\:q'ɐewuP0&y鵵rUU^o!t Ų=Uq=Eu,rEnѭEڦEZ X\]'LϿW>"JJ)x;+(LO4`csQ"C4uJOk7P訔lRPo4Zf0L)TQbzC*VyNbbBXX!]{d ݎ~& lY%C,ϓ@`ho~s?FU}k6M'! :T*Tb^ K.JK x|WYZ^S4toaV|GoU oUZUxFD"PE* vd"Lrߙlȧ҈bqo|w@ E4sLNX)1??O\Σjpuf}-Zc*xw ?*]ϗ+Ҟd1>>?䍟CmbInGQp\T:CrmayO?8W?2:wV7yԛ-<{f q-q\V`tdr(Tw8^lKg*Wci- gLw>0?VbSsΟeim sm6ӷ'5821Vy rd||ċO< "΋O\*DӲ$_o.JϝlGx0-mGXؔ c# j! Vק|sawHpi L&967ïگ&>9aI:mv~>Ѓlmm@%{޾?:`݇zȑ#H羽ۿC'y3y;@zϹYJ'If!=RQe$d~.'|ccV=@ S'Oh6"_꡵9z(S<ʕנ)5Dh?5q/zᦩfB4ŴlސvOJ|PyL~x8#EGācǎS(% HZmGz 9! !8m~7:_LڎC,0 ʕȹbH|)|^F5ɐJEzgbYTyiVVVez Qɤ#:%r)vdyA5:qmw)JPӵC226Jݒ90l#Ԫh"'<]k6d6DCQ;ePEQS*WQX\ZAo,+J{ Xq/ ]yM#IcH֩\d0m$zυz(`5m[B4QqQ_JEHJ{SJ*"4B^HEj0\\v@ʘz4jZ{R5-l s±N8F\LWEjӦeSo4T uO @.nbΟe;__uu)s ͷ# sky v'q{ZIXoy?e87z fyʇD#&.=KD: r |۶x{\en([;yA4xJB,| UD"ض`մ \.ޜ2;3s_]C Շ|v;'(j ,XH|L&C2R4tM2;'S2`~߰m۴0L|~Xs~,\iWIҁrUƢ6{4-"(X [;ylE4bmq]Nh7f3_ܩc vcQ:"1[(bXV!o674:J+=B$4M*Z˶%csqҩ;%[3r,Ra!W##$I2j&CC,0,>0LzE&ưjSSXC:h, )چ 3r(J4a||U(+YZ6H$ǎS,Q ? fuJebZV[xRgcߛjb1ؒ!bfgx"1ɽE]~f4Dom}~A_H;m{>n-Q? vX>~wbk:pV[/x(ic2lqmҋ/P*WBhl,+<@(>piwS)& IKy%wh)8dlR*P]TU6%hN&RV+/qc67o/I1i!;|`%nP8tPٙfk_^(nOl`z{ǻkM{5{r>'xtW#t_?p㰀a\Ս5C\`sTY&N31:ND"w?IJmq4C9/Qk,ogcqF"d|0I\7sGJT'/r޿~3ǎo|86ǏNux VַPxscQ6i4UR63ndu=HaEGUT8.w1>q0{^Lp~kh߮',--+Oe/Wbw$_t1 Ab|+YO<~xǩmfgf(>ҵFDGGGi5={ጪUGu窨d*]MX,4 &Y][ AiA lw)Ɂɱ***HT*er:~흼lٹ쓏q-ӬoHJx(!XWnQ-qk0?7r)4/p^ǒ' |(3U;;le_?]Ӧ R&H>4UT4GUZ:F!X<:A5M NJP.W8ztJ k<Ƥ/ȘB*Hb[&NdWW'A2B~~ Ch4mnjV~&Gj0j}$kI'S4?v#ߠۥ=qH= cD^F۶yXjض<. lxxյ@:,S锜f(W(rz48(fTa~ dG;s;˫ Ν9ŦbvV7 `v(D`@$Q'wyRm$q\҄uVֺA463MSׅ@S8C0X][ÑF4MfN~^XZZvDzBcUޣTٽ5?<~L&d9PЧ:&''BWcz՗6?7K\&jP'X,.*'ipzŝa?zp<>x?1l ׿i9lnD/ >k"x.kcmk48lYa$mĢ IDžO߹ iP7^䍷* K cV7ExFt%J/y ,oi} ޺ro-r 6ϼȵ[K,nt- ZEh+^Z4}]BAL)k*sGx+Qnݹe\~7D4t]CQ9Lݿok sz$i+qzzR`.Ǹum IDATNh:26<򞉗[_ݨ rG$Kܳ^HF$礨ZpSt<0[[죧"d~ &w,>1^>9c~dɿ ,kDvNRTHLv=2@P,v] =|EF^8_@C}>~_x(Z˪F2nSO?{D ,4[Y]뺗DJUL]L\6K۴mZ$ Z)fYbjbd2sXhlۋ˔Μβ&"fY[ϞE6"1BUUt]~=ǀz=F' |)*P `s i"H a!8(  Id d2U@郸PP82sjz[#I?L_2}LfMA 4^]{Vᄏ?}YYV@eefs"cXI f Q XZX~SD|LHSim V* EϠP,zus"C$+/>4 :[~F^}`8J ˂cYy&dT&. PU$AxWc\5/33Ð吧<Ǚd\DP<8@4eC2 D*1nO"#RihQ_<@$L TKd"vs >6w !ؔ2i+˂C`5b;&ǡhSÞݞA\@Q'nA)E6E:F" ӧP,2f N8#lX&aRxT!>rǔ:p%z/\R=iYy?N<#MF>Bh1 erT8N~o4aбr5X}b;PU7J ͽ~m#,řӧ һp,Lӄi OQTȲp8:GSts\R$z}<3t0PYXd"[ۘD6Fׯp+z\Ɓɻu791^F"?$xo{O]?jEJT_oKF7(VPW_-m&( I)KDa1" %ѧ7jo6捜 Mq>3sFM`ha> sceY|PEgggUx$dOz<=s cv  " hqO(~j7o߃ H2 ([huz/bP34;]ܸ"h{ېd Rw?D.TM(ήRkU2ila0zak3KeҠ^kpgclb$ GeQt]MX* /?Aik_#b٤~ 6<x75oomccPBNI:iLso}k蜋b"u2\qn 'l1;7NJzuuܓx&n{t[:5$ =aý#C\ܧGK0 =ݑq<ϖN.\b` ^#a,G.hZh4>s`xiTա{xm^K7oԁjHR¼3dIIWğ;;Q@q7]$0'J)`;r<2? d&h(p}:9TkX_YƃM&Dqlܻpmo3ST2JB3I=Acl%0xrE0m{$0@.5/nbV}(:x$ۃ_P~>sC27{H$p8`zS⼑.p=MF֍inpAXkN`a6f Dn+dF氬F2zd&g@#0u>{p'i/SGztc,z'.]rʄ`j-4 ETU/FXfSp/\ ƌqdBf$!LJ.@.G$^Y*JσQC~Jst 8qVe ң(q}8Qǯ|q#XE5&AຍGAsqJP(H4vI@򥋸w~_~Eeh%Jg,fɚxkSe躎kO_.7Du丁!a~n膉L&e%-4-ŷ& z v@A|:ORr4si[[eZK$$1a:" cf/\}tܺ<~XFZÕ˸pa &BVWHƢ/#X`r\_?~<~+_[r!9AE)8|p6 na BF#;x@)cs%zUM@rTG`G@l\ﺟA_Bp+( d(eaq$t@PȤ0 Ho A1Rzz LJ7n"AQU|t1;{JLOMUp]||.;A4s0- p =EEViu NԱQ7L=Tab| bw_U` \ڕZ9 ! k-ǐ8 L_~*˲(vH$ F]%5ϥOՀ5g#p<ʕr$XL6I$>%Sӯˊ0fZZZDAV]DnN BE똄CS4 B4]Dt:\f][۲98i3LUAr`;cdyݢÐf'/S7piksYh, ˴j{CufxCepeCa M0`ZTy&it{]||.2 %ĢQȲ](x)m<ů~pw!]p?1_qv}ܼYuϝ+/3d3yqޭQ ؖſo \|%0Y@~q lazrF n@Q5Ȳq4[(/Q/wyyq>f_Ν.3r҇ՇG k1*q},KDkuX[[C-Ў9w=L&4#{Nlr諸 6YoѣYosɣU8Xd2yS<8.ŃKy]Z\O>W.35$IϓgN{z/X@=:>7x)"~Rf,nr=_} م8(upk:6n޾l:Bҩ/H+{lout!9MӱdWx"鴱ʚ'p/-`ؕIй_Jqa(o^cѥ3?L)p >W{F~rz̏Q.}>fQΏ; P:>K[n?R3h6Y4|^aJD 0mP)0s17EQaZ6qtÄe%C1?;B QO151[\o׾wg_Bބ( X½4Nw ms3xW(*a{/;(RfP,WQpzq;e؎6 cDdW=nm.q́k nۇ,I8Ph$ [@DA! X'DX®Oʕcl|pqt"xP(Yl4v`TrR>AG0>_ ]g$Q3nw`ΞZ~DVǭ;!VQP8(1SlBL;(Wԫx|w{D!IF@<UU>\{;;Tkkevpj} aP8Ig -ֳ+e뫫r贻#k5H頷\#k_^^Zb,b^ }~~QdkԺ58\>^l?40Uq뾱Oh|$@=$|wX~0!|{nM}e,bDQBkӐ.z{̛oB!WT.cxMƝic.]8rB/.J% " ed3)| {7n4-JUȢMӱ 8bk)qŹY:޿y2!Pw7w0agI".Yŏ~r}* .]mt=T f` "N'w\o"N+?Y|xkާ頫hژDr za }oibofOr:-0tĢQ+_'@U5_Ǐ~c۰- w~ "8 oO32!9G"Q|~Ҡ |7ܦ"Q>Ly{2Vz=Żk+wi 4M6I3?xӽ$# CQ?wa1b:Ǣ(Buyo8 d*|.P(t*"0yr|"gO[@9b@P1~q$N㣛whuLIR9q@30 L ͠T*y{S^Vprrj/Aā <x6äTE1 Dz┎Q} E#)z\v+`n;GxˌǩjQ NzTy /ѱro>l?1y?`9pC}^5e J9 UUyɌbeIf #< (>p]D"( QlZ-V հ9!z4p K/MoBX$@0?@ݞ | sfq(U<\/Cov=ZAȐOg#GF7=g:8F'Gg9ؐ BR~lp%^)џ?I{>W>=lOSOT.{̃嘮a%=>>NP(I 8J>>kV.-DR L{8!h4ԇYף$d #aHpkP*W099^OX>EWxr'gg[u_&@|󷿁w{d|1~r,˄litݔ:E6C> t9~Y:9|-7g(Pghѓ:?70Y#ƯSy3ܑk}]ceyy )gS ?_V2fN̢U8C1@XDrt i#@D"b~nf N7ndzW/ÏoA3LBQkؤ@tvBjpCLO86 *tSX8wo_ڀiڰlvd(mn4-#!3)Tk 誊JJN]٩ ܸ}eg>6w:]!Y8N,5~/3:BNPבI%( ]<;Xulhiby$.nݹEQV5D܁,I( !OJXYY 6@\ W\F멃sgϠ\@qxA z䊎xfڝ_+w31x8,$b3$q-9ŧ{h<q &IQ;aǘmOoKK`ui<B2gf!7*淃1(´~}Je.C\040=>>6]1y`rtס\xk )b񸗟57_oZ(6ل% J)fgghL&Q8(yF2DF6C)ZVQk4_*~! :(LAecc5Zp `CNcsk5[@AMUJ&1=9R+k\JTM  0fy+k0>6V?C؀և<_o 6E)ϗ#2׫m(韩}>[`t ~>k—!|}atZLjpAGm||d ]Ѽo؅^bjfƓnEDaCU&xsnVe%v]1*Ɛ!,ck%NBdȾ&6PB8m$KzP^=8t\c;9Ri; ěnW Q؎r(x 1VZ͎ Ad*ӲF!t! _ @_M t!=OF(0fׇH$Q@ @I(ٶL JSUnl{kA$mu(8` @6|?P9@Ͻ[w#$ˈcfRh6[DBLRW'D<UUDI'2^;?~V =,m²l| Uc[$^ (]R\r''| Iڗ笇\. ]7 k}?3vV@%}ePUc0SsiTpSS.?ڗ?MG ׸_'aԻM${Veܺ;A2k,A"N"Bt`6.;L2V{U|AEt;8,wvsc[ad 2A@0!"x~P(ļ$|lh48=5婎8XyjH)d)hl.HyU粨7(4*0-LOM  'P6@,24&(J*-/"@QuTku-r;af涅E~O4MapJSe(Wkxb*08Jҩs>rD"wO߮0 Xf L..N{GF"㲴 1r\뵵5Uuq*9uqOۃz|iBFN<`Nөfɷt[|0IӧPu6-H2ڇ5R @aSS@(ʠw1Mi {(J?yAYϜ^g "  W?x)|ThAdST T+ /`6VpP*{ͭͅ-ܹͭ-{<ʟ&~4@lkjY|:&.X կ3|tc_'/؟v$HJQt`@3%~On߃$`6BaFWr$ J $avvaswM:1glg)pl 0JA5<݇k5Blx /\n@qwc#"N;hwg(%h9Hx(jD$^WA.dr|B`kgQ(Ua6VPb?yK0LN&.ڝp2 "! x H{LP,Up:!3v_:bj/2߾>t33O=,/.z>`̝7ZT5gX +eQV}&t{M6bx_-!I}y!@6X>N%7m|7~ gЕZ`v$I֚0 pPo4v%hsdH\X ^}zK˫yw "A¡vvܵ+/jayqyxX&tMCRE<dtxi*''"w m!YʍA˲E>$I wdpعa c<΀ FK c{u7gf⣙)de|`!1y@ _h4b/XEG !`n_〜 Pct{],hx ?" /cXmwIy?,x嗰G(B((fPWrBY%qCNz1x`I2h^O = \FLclׯ?BD׎q "L.8VVШ7aS )!p{B du=B(wnAXܞ}>6+(#yafzssȏ<&ih\(C!d=)g ]c1Ģ1X609=VIPwٵTMT*|.P(̛U(-8 s;6TEt]G^gTMz]Ȓit{]/S-Eb>R:(u`[PBmy cPS}Ђ9} ;1Bv8_{oTuA&&Ƙ\r9a۶A'&Ƈ_=yrcK>u js'nwx4 "rd.f+?̤ܞylnn 1DIf@υlہ(DGNqCP׮\"|t]iv*cΝ'wC%ܾ8(A˻m^6BC.&K,*-l7LE^}L&rhEX!@:B,E2@\SR1+K5mpq brrJ 2u2L$ڝe&(oҗu>38r=u4v nT2DZM7p$bQMLQkjw$S4ګ`s'Po4UT͞@Z$3 !@,G`X{ΙeVP5 7won߹I3/?J]p8D"Z14>KeP>rvQVAʺ:2PgM5]D7omIqw?fF FLQucJC&$9Į=!e;j*}uy{Gw{iR'l}ӷgTQ,U`񩑃R'簲x7ܵ+x1Vzݎu k1IX,R~Is,-.Qox٨fuTjwh:lv`C'5x8-SX+wX"2}K$DqT|;X]YMccy2?>o>MQ%o~@d3́v@~Md2 ôqY**M2Z.&Vp7}:?!Y<;]ed,vh(8RH8Bd|~ :?vc8ό! h!$ ϧqfeXRO9 VO5[,c+x4>7^z5Z~ w uX|&TUiaE$cf2i̴N ^CZiL*O-M71<(U MSYӉ7s܉\/ >z=.}1'̕z3>2NkV 

͢j*I $Ik60Qi^av f32$ge:T_q$K0Cb7|3=<<‘HJ9qs::7u|m{Ӟh tmȻ ,?{sX8V1ڛH"^;;\ 0.!)F^ 0%/ yBW] 2M D$'Dx*[ Oa Icey,B ìMDAX.ʮJ2)@Ɉ!N\c;T/D;{*Պ>ဏ0Yzyq=7~`%P%5K۱lr8 C7eD< 4>32 T\u$ J@tuv{&,! a~~`6E{=tIt*{)W!cO; UUlE /|߼ ]\ǟlċ==$1fn3KWjSOY%ń0i]בG1=9W4P˅Cr t:ݡ% (> `޽^oxcÙЮ;㏽\.Z܈Rƚ@LO?}ہaJ|R %I.SUCp8Ӵ055P8LQC|9$SiD18e(x,JT@@2Bǡr vhZ4 $SgQTp -ntjR1}ZU7XPTaB TU\& ]ieYP{6Aׯayi},Y2T +8(!RNW󯾌7oòm.Y&@4$4(0M /*nݽ ES11ýf< z:.ϞG7Ԇ,KEGބX[^6VQ*3Jgr/186$YR0z=k7?T+>k5Ba7>59V^OؼGp `{굫(p0\d@}v_N<?q&͇Md;j04/3=# SXJ ~+T| ÿD"NYf=) &tIAup{#t}m՛$p]&FOQw؂wU4Z]~!H *]er8B=ECr"ҩMdW \>pgV_xg)P5M 7[% TcTm98wj~'LXH'OLÏbJ]հ0;n vo,;ujn;pVkxILMM'?23$A [F'f">sEb6'kv 'Ml0| ܽw˻%I ^qDnO!Fa:,B$jguEk;lFQYys{ۻP5]8(l5mLMLPs+8tNFf*0n@^e;xUU{5OCTaҭf͞5kAǑN%q]/D#ah*L^^2~0\H0_Q`Ġ iˋG"+ H30L$P $biY'l8^DDQ@^cוrc!bqC`wA$D ;?(q_<&1F9ĶyhB Vn{o##H@ƃM,>7^U]ĞH\K. "ڕd l˰قɰlcXaȖl@+K*P2 9ᤞՕ?ιUu5+x}}ɠj1wlJچ wf3xd)ߗpJ%m[A,.048HReb|cSA|>B8l22<@!nt)7H*AxLWt*m;mPop] u]!hju,.Q+ D@mCs3+x(J|?~O>gޏҩ$PrR i#₩в -57 $?v+=khYH+gI_zEVzqcvvV'GM;!G=eOM?o7 ㏲]C{yM{>#5+d7@Ȑmhn)̇9~gtx$ȯorrZi8 o _y@k:LYRZ-1 r_~ FLxc;!DD"MjgΜ_O淸uM!mje+/R.SV"`r|w~^V ]#D >@wгSb9B[4M(uv (fq.R~ 9dO" xv;ϝenvͭv %Q"SmbabbJA+5$l/}#CCdz.dzW/r#Nܵs6R]ƝS 6|fFi\>w{K;eOsm>ܺsWg\V׉^VC'7oDɽ@Gx:usllnFs>ѡХUNQ ~83췾A^ޒB0?>yG[sx\vͭHz<3o<Xr{zw#wZ(*ӮqٶغR8x|}!P^͝ ?xaxK&U!:߹{ YlBY>/s԰:RC"m2 %.~d-eQ4L Ǖk'݀+G 3 3 &JdjbJ,-Hᷭ&d2BPt+]K/8.=mm;j,\6M^Rz#jF]Mex8L4` yz,e:w̸y~r0@E״=@w YcHS`Ryѹx<;;]kkkh"]Icd)*3Z"NnDǦ&)rObumI6 ^:1k+Uڶ OZ`c}T*AVWU:,*4RdtwHpMAv;֦t:i]xsZw֏rмZgϞeO;}x8+Ja7Aq6 &}hAMDUpB[4Ž@Yߡņ_>A bQɪa !"c\zmL+lUaHX4M&#{')J.JwQ--8Na6ss\!Q\d`(|>/U1g_ O]̣|?VST22y! ːo7@8 xB>bD M%OkÀ;U @3?Ic_Cq@1}OxWlc9UƵ+7>+f?yD'%蝒7 0W0<ܾF?&ɑLe(UhF?)4]gRm4T8VMΝ:J6M6ƭA\g:98P`dxRL\&pw(+qYK+|k_W%~λ P%6xXY]X :*KKˤ3(̛ۗoPVf!x9hHf,,r~S}Nص0vcIsv2bG\>TלyG_ xWm=ᘙ9Fk/^ mlas"K~L;3G6@PvMYcG~Diy mm8>yp$j-WAҋG^'|&''i> Z+L L1pMxcR`btzʵKgަY$Kw]9 %\s2h\*^uIf T恤]z'{o&uWGRs0::o [>#R$Tz)-jA@K3Z}0O;LDC̎Kg͌[l-8,ێ=WTr*HBhV).]dskЙ|w \5q\V:X\\RCZ4h}箺9T CJMHECGt]eydr t¡Q):A7$,4E)Ch -jz4 ?fk y~B0T:Ri耩tMOfKt N:adtǑJD*fʮNՒ8|>z2:'Sfsr (K@(4c)v̱B"R aU638_Ds0f;d)~_>dzrBͭmRѡ9< 8lY:CiMf8rX $suK/ʊr"vM&&&$T^O'4o?/ArWk f"P6QA ,T4zlޞ Uc:~inzUtʥ ~@]͹&_y3Yfgh,Y&r9k_oC#Cl_&nq\.;aHu[lr/"w4M~ۿ;vtH& F.?H1N%DTzUa%U*պ$M2ןƽG#HP,)rRolRqչ6NK>}*t;}eQC.g_diΝ:&Eҭd)6Bș:xm)H&hLMMF$T*E۶|d"<+={&<}d2ܼu uer@UIJ#zT)O~GQ C ;UL=~Zր6˲'xKSעM_ F#gvߍH/DVBRdD&S3 IDAT8BV7$KUѹCö/q]lj*=PǩSHfFҭ7f o 'cnvgϰ~J$, q]^{EJ2v+}\6>0oGnZAYg^;vxtgr#:7[G=~8ȣbVGwc,sp`xdVM"d<f <>5+zX΄M\/tZ,\Db1!-@JTXcphq# r`026s&p4cS*h6[i2T' &Vk*$/AZ$Ͳk.On kb ?;cY|Cf|KN$\xb,c15ܕLT9:drcz= e b=L.jGk0KGfxQH`wO !ɉIJUJ&+*MJNvi7Vнl256H*aҨIV%jL&|Zr@D`FyҦ5#4M#=yMIb&gy!~ iJbM^׸O@v("a{K뭗zl[*W:4vڹuCp"Y˝=G*/&n;+j !@Hi7|ds2߲R2ql@Igy 4Rжmɤ:阦HE"{MejJ%pZH.4%M=!;`||jye%}V4ry9|lJu=e159E  Y2FG3,4]gtl"R+躁fD6t ]:4Y xk;$ab%xRF2Ri\F:0L Pආ}BkvbLhR})j*!J^g!v; GC띍S'NW,Rg)7r>&O_8,"D‰9Dn5mii-- )|d3iߏ,(;حRiy?ϭwxX_ߌ[=/?kkJS3XD fh4:NTbww!o*zl`ۺC6ިi넌YהYUMpH4]c.lV71{-pb~^* tjp>@B%`hi\DVf tq=Rn;k[\e&; ͑f}|.죶q|9w |D"L:vӔo|›L7'r/p(i%s\\걀zK@ٿR%PPYMzn#h69ur '{!qiv{I,d`@`{E)LOM[,Zd͖eY]ߤZkӓp,rB!^=g051073ͣ>|r뎚a6>ө$JLF~.V+=ODhlY;; @bQ}?9$du37;3MTJah~mOt WV=ٌ ?Tɠ>QeiDMaa!pUГ4qd(ˋiFW囱8v.kNVVVh}V5"nȰV?MՔ ̀I??uqwmZ?ÀmME]BZ2AF8f~d k8 o{tu]Je~7~G MO1<4K+Zmѫ2M^$H&Yr Pي>ua밸:@I <\Tt ߻5M> 0Thw Sr>9ν! z﷣.؇ɅftQ=ǂ(!aiHӍ/5O]af$ߗP:Y~v}0,f22>A2!dz8{El7ʥ$&[+tT o^;8M^'aYgpiB.˿]!%WVO$Ͽ?]~ Ʉm:f7[=r!ڏEx嗹ͮsQ8kNYs:7̿x %CTLV#YBhRcE̓0 ɄƋן dff"m%bZ)7vptZP&cCYI|i~3˰Ӗ6W zS']f*wppf"ZZ_H+(n5 */GE{%6l$OvXx!V<_E]@ AC9!$&ޔiw6} sFGi(T6Q6(u.T  RU#MnTz] ]/!vH*K $}|_0::z8-]r|?100J,5LSR硡O'nۊ V$>4[jcB);,a%,duU_`Ȭ"'\B7@zs} vD1hmt_S&]vB//_aד0 ]Zc#ZzP9"B⺂(# N@S9*X5vh๾*:l:B&zSZ +Qr,k|8>7ÇW H&,4`umcSRI4M'K{0Xҥj)ƽJ5bɇ=$zaRfS.\QuƺSk?\Mc}}basϲhI=fT4 p|vNwNX,F{z-v_<>D:Ex.I.R)(2tBKp5$ކjD1 @ H3x^R< $ )G&')6ap9|!p1&yʟ&V粔5OcL21:BRKˤ Enm > Y_Lť%ۦ^oȐr1 \?,Ro( 1LJ.a^IK2Aْf+?;R.Nggf+ܛp334 %IIXc18P`ggW94rLOc6[;{,Q7JJhi3S$,F@RTsYIlTd*}ӓ,q|PHdIedh,T^lzl Cά kFTC$ يo>'a!oyTr~K~oQs.7.{ {׮x0W#qԡ _[" ̍~z{!Q],>4̎r&ap% HS]Q^M'ͪHb>sۈLOM1:6ma"fyU)4]zu. RI6l&kSOZw*:u]rlgNJClULsgNs}+Mʕ*\O8.vQe%~ns76):B^Cטɼ_W}B Yxu_t흨{Uēz'=|<8͝lbQ{thÏfO]i$D C"Z]CC؎@+ݟ*4 O4u3jH;ʆJHg ]zp0c:[M"?y6{ 861BvXq]|˔md0E-h4q^^Mj8)˒o_|pfͻ\Q5wߦZ_H^gqyE{Ͻgg{! s31< pZm9&/%N/h gr{A_oSt. FGiޏ3dGC͈zN2VKܾsq@ciy'qM7q@@,FDJTn?&'mnK;@2p PE2E}mVT"RKQφL0.~mx{xo'>K%x<qPy.9ю0 Yf2V{ɓЪ7<F=fMUoُBFm4T띝FZwވz<<657f狼l )@WV 86=EV'P1wz~Ad ]yOMNI՛&WZHȨDMS`a iKLB!-,l6QhyVQoj۸8 8)5Z-T&+J4)t /a! +9pq3@,^tt3R"n65CHXa11> cXVMS0 L6iX)+a`̴I4U( 0<7Z{ύy@˺m! "AΐV&ā$ė^΍ 0-mJ*&"g#E^HTnh5p/|3ol(ftﻝl &'Qj ֯}"Rro}ߑ̖ >"+P2tmm=ʌ [iH$0 b('e?N0(E;ljfmA@RٷNMlP]J&\7Z^~յ}}mPq˪pLeɶmAZSݎH*xK+d3zM|u-H;V 4efllD*S t:M\!}N:IR%$pTVoL&eNRޕ A`jrb4/"ӓ{Hgm}q"`ggVVc2<Μbm}͝p)z=R\!D _?RNB;9/pͭ [ PQ-J&;Vt}F=vD}9avb[1+ӧNS,:hG*qo0u `9 8lJΟ;'SAhBO~W]2g4rx t&5h:jյt7ol ZnO-080 s4-j.@-*i4-RɤM2:2(.FG @R|4c S[G)tSTZLMsljHya7ɘ~LZ{qΝøR!"#Z4zY&֋?{W{gϺ8I9IiZV8  s]7RwXi +v$v$K+QO 0h;nuM7dgH\Ҕ {{%w,f ,o869J*a07=iXN veڶ\xcSm^x 7o\V7}--\!vϾ1=96 @ ,s, m6 ;lllsd~nU [[|GbY&`w.gN31>xWz|x eBA$r0hq ⹎*HS?{?|;b!F՗_ 7^gҾ{C y[kkk]uAF̕)=jy =^`umU Ct1~ >k*r2zu>77GZ#ط---b: l6CR*8l2ձR!.Uc\+rtLMNu"LMNR7p\{<cO컿ao*}tdDi211vD`jd |oq+/@n0.Rհ$d l'3lזaÅ 6>lM7e& ]qR!&zS(i˲j\tZ&v?!HZapA m|qغjց֧pɱsP>J< 4,9B0 40N_=j吏޵/ʥ@ZAo*TvFtl,($T{Dߍka]D=pᙙj:+뽑4(30 älqEZ6. Ie}O*1·bht`ltjOW v;zGy%RtrJI@;A2$tld233rW,i&e" 0 -gΞg(o0Jdiv\tİNJ31LKY Ѕ`x`bxY4248x: iۊ.d~ $ҲOl> SoHbI-Ӛ֝,k:{Ķ[HZMbD*d IDAT2iջHR|NZ !h8Rq] GL2JZx7>AbT+6܇gNRJ:_zyVV׺V[*~'7ouHF"$|}i,ˢRt}i(U ´L|SI {Q-E1*ogeE@р?MOOE*ը>fKXYʆ0lj)&;]皆hZ׺rD:f0<4DFM ڎHraU" ee$[/GA06:D*aquG+M.AfH=-ftdyJs1 BKW.#XnG߈YiXaWWҥKA9ń\=յӯ{?G 80jx2`' }UX, 7uvf]gVob2cjr2b6/ij;߮;PP ^ TPxOVk*Uӣ´Ly)V7${4->Yib7^5 !xX^YUEIŒH. vwse<׉p6;pr |]1#{pax: 2 :>h߻ڸ6a!-zwT@y8q~:ɀZФ5"p2R:YJȪWgY @(=dh@cjjFn)!ft&ν5Ώ`bg/rCVѵ^x||&/sL۬oLLC׾%YYl[w"V@Ra0ZhxvfMRA5Jen_l {8v[ >eӴZmɸlIZw,C.ܩ$ 2 s|rm8?{ Cb_/ӏoR,`kwVcm}FE2A.0 jzt s3x/TIёbUA̴ mwwߣjFEǶݵVQx& Z#@5}$"뇯O}r=9E^yeWV"OՕ}{pqRjllLcO>cIoGP{֒xѫuݨf XJe_Xm۝}P'9_]e~~?۟UӺ؈; d4o~]٠\׾ʭwptZXzlxiVޏ9 /q}G"#LdtdDzKγ`4ϳKvp\ݐ! 'Orep|g"pDZq'e ,E VEcdtJzثsydbxzJ&FZ!Ä8{ǿ|2ۊia[i>A>QV/1bLj}z H-)6;չA`z"/31:tq#SEcD5gz!=xs33ן{ $vTmnPo4!2,l@L"8.EـeYT(;VMEw]YY \>OiceZ6Wzi4Ҳm2r[Vk$)BCxn@Pv]ҙ cZ LD3BT}C *@' iY$ vM:!vlΞ=K٤l~:84HH t&n3{u24we/yKWФG%L9"hT*ӹ'DBF*R5kuBGh4~Z!b6gN/P)#a>#t;;~V{{EIKW344@Taykk˲(=&'e&x!Ǧܢj(U5t:͝}4<wBXحVN6W._&=ϗ J%"$l$ o#kvu&#tO: %4])X$9"|X]ߐ"Nt3=`G.Jxr8 َ$Iv 9Tv=2,x>B;O(*LMއ7X|"3(J 8pG+LN135ܾ4- tb(מ@d=Rheepbf8LZmb/E2dwo=<_Dap|vK؎ y&VŠ֎]7ԶtYwv,4 |_*m0iblߗ}l~헿{84ft:8KLҶ\:ϭI% *G7A:M>?~ z aTfyeVVy3lp{{$ ]rUs"?&JE[mvh;:ccʒ7^rّƋ/\7:n.{2Kx#g;챶 q#};lF\IasKig-~*MbAt}8IxaGyAXQբ <\\_FzNV8*Cogs<_K|cctvӲhz,"੫W@!c2341f `Ilm蘒37 h4fbl{0:2i-  )Twtн(hϠB'焞`3a5Qz'ɹ88z $okřs*ίgeyhzrضHb%, r Lzd9|vfq}hlj 'OP,L"ȹ 2sq?1OﯱStiZ<{agY^^♓$LKw=n޺Ã% uS*i| Dqko]\֛ܾ{(Wj>yM3l_g(m@#M) Cy3lmIfh4rYZ&[ JRԸ|%*RK7s|vv$rn޾ՋgޡaT*iZ *X.u\jpk#乧F!BλBgOw~" ġt]U Rh96s3]C+/_/r޽Gx#=:;;KZS v_ bOx :d+4B{9>~Аþle0<4$ٕ#0 \4` leppF\_kﺤR&ӓcQ.Zo{|~~d?0}3G_:B?wvXmYǹp e!uZ>zn*Uܟҕ_׵uU׃aZ'h WbyF4h(fcs0՛K$ UW`&B] 2}xdq=R膲$ ˟  ]=ϕMޯR/(!"'0HQ!, i[+34Z6&Z0 t~LfL6A7v}2 Jk',ikeXfȡk 䲸a؎K*m4m24/"e)C4,N<}{2tӒ`xh\)N×DikWViT`=<>kϥm;9s=D>7ɤ38K"a({4h2>*,٬ڗ0t?("{RElldռW_aie@qo Tl]meYk(ISv*۶W^;$ZhVhzsy[ @B *looG{ =**N@TG ovd[E9zBla` 9!.Y/9$ܾw?$Z0Zyi6YB=gsœE؎O dȺe%hLOO[*+/R7os Nq"ET5D G?yוr8{W56RӔ@A}FϳXY[ߠRn1 2yi9SyO&N ϓ6}!` V {"ןUNgr|u& ACJ+ $7Y^Y0t6$oXbn;{ҞJte*e3llP,ڕloFzAPeN!hd3粸ǹ3 @y_x[ok"Ah q+W*UVVW96ET&I8.qbtQuTWy]֤q+=;sfh*zÏ>{* n.G'\dWykoYU*.MdlnMkfz6,K2$Y 2, C Y4ha7͝Wf}/"HȈ==w`>7l/uDmyܚKR2\ U/_R#D=>O"9wMPn\㮥?2QW~ߌ:c+zc@+W8(WXZZbk{;YirP.ДZ>uoHK.2=5Ԕ2j/@Bzlln'_}y@ fg&pXT4[mvwweL&MSf|b$Cxyy|>>JUd2i%m%A2\d+&M>PDLSu,M;8w x":܃FiG\z״ER)1#piϺ}b`' QE& Ðk'^OG& fjLM[|+_ؖDHӑ:ʚ$7٧j ,ړ>bpc':yy}0~q9PYα}_u#q11Wyǎ9VV txָ9v z;byix[XI҅Tu*fR!d2i z;;A$jDqbANWٞYYfo( Tka4iZRk1>B~w`YVr^Ysf2d3W0i{A`wwWڷ ܽέ;$bY,.h6}faHnbC8nFЙ{w/M)LNɤ3di&'L7R(x5vv) =}JF{E y\G:-h.]8tzn=|?T2s)ۦV'xxײLΟ;Q7EѠnAW7R{_|,,nwv*5\^os18_ zʓ*c1Gfz1x\!um${jh'O&CMq43ԪCn{8gHوo o YAcv3|i:rjAZ%_(u28ə+G?{'f{SК Ԁ9LZR4Ma)ON)+9g~ר |ZZB\/w~pXк_cMɭsYfURCnǁV&Puwt@XN O%|V'>\:zSQUͮQBY)tc}GŦqŸ!#~P#(I؜0)We,m)L0 R gWW8x~JdSi.]ۻLMMzTˆri=ms BtM&ASzbn%Mzmn}t:GdênM\ץZbުk(2x;w'Ɖe!zC'gO"?펔"T2M<2)^diB+:yrzSmY`vjNG){Z M6P IDATPDs<}ͭ243S~^~ŶM-)O?^}EܹtJiqxq!{5![$R>w4V+ Ï>zd/|c=F0id24M;<U xkB'\}[v{='Fipsv,(~R[nLy?P9qfY'pzSȏ@_yf%!X\<< 1ke^CgT ={kÎsD3t]OMk2v00Pkv_ηOj6)y/<.?AB$D:+H90Lda&h{=j:@ßۿk6Q˦ILh5!{.ADH>E $t$I>n> eAQ$׮]4MZְd :~P8#>SrBm,ЏO* J->`Ɇ6uT@IibzI-HD膍fN6M@JGi"ss t sjKC"t!RJ2H |P(lw8T+5άwPg瞥\)STu˧88t ]ö-yhaXx6!i*FMsUm)vi;J:(5'|)r0$ b˧7ZZu|CDQdx᫜w7Ż"PQGP!}FևI,m^*ִ۝DR* S.vT^{Qę+D*<6 9|WN8Dvo\w(7~ה&K躸h&eZv"3w ^e}}]0+Y46 Feiwz|.O:2=5MGyNMNIœ 8B˵ A+/}fF'.]`iaf_e6vGappPݿ5&s-E?[FLCSWz&e0yBD_$y¯|;|r{?|Eɹ&XY>E:@[u"NGJU O.h&gVNIQUgyv¤E,8t6/Nz+y7C sӸS7Qiw:v !W*4ޥVotJA34kʖrrNO S;*J"+/Kt(RR;jsW^~w~$jj|r&e&mۀd% R~h<]5@tARi#^I4ٶd/y8;&{35-٣Lzh9 qҩ6,GfILIj&N'i~+c~t/"<Ӓ&?nr^û8 FNNN#e49sn*]F`~vFjīrmt:EZ6=4`RDY>};<ধmo| >y^IP֍ )A iab1/7`KH*kT*U5HfS/EZPlWp<ݻףg5p]~]6>EC+J+6QG5FIG>@ﱱn5 B߯g *^i)e)p] Tkujvt:ׯ{PJLL\@{}n]U~ﯱ@VC5ҩ A)L}B 4zauX|}Ν^wcT2ff6MCM6h"ӷ"">VtӡS}O//ju,!gNa8{zhڜ=}2B OH27oݦhJIRViuHs\|2v*E1_drbjPpjiv͵'.a:粽Gf;{Lܾ{nxmooT\6>43D%pT( ?)U_oJ5?g|3<Ϗ_1 :kk0?YA.Q`nnfڭIr_ܿ>3fX&}?n9,ǝW\H"iJr/lmȩbw}4 %**ss8ǫĻ}$ή"udҤ %j,/MЄ ywjJ`T^)}mv X;aNLr9e{t6#Y)tk}/s|@;<0}NL3gh4Oh0g ӫAh@SI}=sb<6GRsTseh, C 4cbij!AaRqzu H`l6A̷󸎋Q0@ӵPqhr?A2 aS DmAXe"Q5- y%ݻ4[Mi\4՚zU|ݡnJ&aX\N^P]ƽ~s5dF*NI9Կq:R7Wo4f2T*yKkɡt`@%a3O"Ih8G}ccW99 0ڝNgy/qmtCI4iK] ah:LHh)ʫ|r.nO1@Me7Ly/P=4yyݑZyvt&@veTr4yLMPo4,8=,?jc:)K?{}Rc2 CLCKW>aa~fK/>O.G>'e&r?\8VME?L|\bfR,C:?7e8oƹa((;{GT*U:ݮ8XR@>_  \d %iq;+lF2v&KT <ϗZ]s$j _)5Da=dq~Z78"dlˠ!ZCJ&cWX=L!\ɤBEBZU_*ޓk ~1$,P~J{</k=m 믽:bns>Cņs4]6V3 (y-uTXcqԣ%4g_PC ٙ}t:MV} !x5z Fc/obH,{{CsFz1;=EN4"7uY% ͪKĔMT}/<[JFAj+ y,bgw[w"F@~|N =#ejFaad bzjbHav|~WPp}ܔ~8;x ϳNҙ0рd3 jU$Ώbu||xuR} sSRߡKDNI/T ô\@66 BF`{i8z]+B.LJtۼ Ɨk7(v̾ޤBʄAO Vy[(̀ǹAߵK>^/7zsX>3Vs17"^R*̕ n_ΛܾsL&͇}|t"vʦn/#^]=76f$R9hԓAs8r\n^B93x٭qĒnȦ1m[MJdC;F3iiɦzuzd29 K?ÍM*U.!']BRvW_y[LMNazL>VϰºnJYx~a贻=tsy4Nl:KLNL{BDd0 4MK \R-ðW`jbF"$Po4uHgt4B ݮ#%4 ð,--b)G7lH`Y6d T+t"0 j.YZla:\HtyK4iؖԛ f&ʧMz xK>ۖ9X*JmN0MF| D!W ÐKqVi}oB>/E$J'=0!-L6KS}/Nx Dlm3R&'t:DQHZM}N[i㸪6J&UpD^ Y[['b 6q5=ݽ=\Kދ뒱Iֆt-1k)Nvvv 2q$B-+eF׃+o~!L-4fÃuqZ_lp6YMP:z˃ Rqs>iΤ}Rk?r㸊9*4]7dOq dnvrLZheij.er}uoIv:|2iw:ƆLLFEDQHZW^$:[G*)ضŻI?i9~|-n8ضSW\.'T Dyɿj8P,)gnOLJdTz=\K|1ήlbݞ#$ągATT,l 0)5Iz|/;sܙevvSs8#9CkSI/{" H|NՈI% R1a͍(#W ?φ:J2ނ$W) cu˟DnpIK|@^}ˬe@d Gsnc,7r"AN;XwN|4׸y$i^c!PDS} LQSh=܉A0t.[e@&HjhΕ'/_NTKKKܺoQGŅy}4;H*w\,Ȧi&f3l6+uc}\.o& ƙI/iɇqӥXZYL`: Sm/y2.hG|i g?i~"{"17GX"T$R&P!94]giqFK($drrr|Hq8Ԩ6wd{D\y"etmr lw?ɉ"pS 459 %dBoh9]t;Z&Qh[0(UO>o\(DJ:tЙ%v[oszy ]HR8FLפRK$Plsc^z',t5'p}G7P80x/[;>iKv.l9t]/I0MuzIr􍯽uf$xH̎ Hی9ZZK󏯷~SXܣm33߀GA#W*e'`y?N=Mc$hBGO.//l;*9*@6|2>=|xɄZ+y%8i u;ֱQIxͤR)ﭚy?~{h $j\.KӑL$M7U[ӔՃrv|ٙ\۶$xvOQX<_~776IgҴwMOyh;Y bffNC^(jpc( 8JZ!B4EEHJ Xj3W(DlZ*%V7 8ꊩ.{=wIo@/(IhIIM+q1nre3!hg)`DO 0L^;e'M0"N>MRecsRdEik7ocfv-eLL1tBȽDl/D!|vG۶E6Np]4c),QX*""-jN7 5AoP(6v 7d:tl;#Қ s] B ,;nht Ԙ[Nexq|<'+ n<}{e@gn^*Q))aheJaK}Nj_x LVC\XSՕk$~!sstC'B|O>'ϣ:vaxeꌲIe2]r@*pBt̥!I4趻loتVvpz>_|y5̣qzyYI=(9-%QMK"bpz=Daiw0>dZ2_4DaDLC> KgnnN;`dIYq( tڔJ ,lquM6!s+˴[$n~4zR7VO2Dg2H.ޤ3335܈4`|?L!/<'#!xuLS AHP qia]s\V{s d2Y>y"_{'opczCaR*dٕ4?}xɌ W;p; IDATE(T9K>X[O_Q>d3VVV(QQGʶ`HMuVϜS0?;w:@@DBml6CE4ҩQ29Q^c:gb<9]b=sFfj zmX{Acj2+xmj&LQ$SKt]VWNt%C+d2i^0 9(WHTl È gcqqQ$Tbő@Dexo:G'aG1S4aՠHƔFQK:Hu$!QʓNPTc9PgXx2,;>YV|jsܹ{=-mƛm5-8wv-or!).!D"Ejv% '21s\ 4r,tJ6"ISo~hGgWOST(ܺs79b=&J%i\ w~ > vvvb8O>qj:l>0y'KƚN6fBҨ;.krrc$?ƿމ5س![%hD=Y = jZ"irjOR]qOhSE&'dM&EhRwsiq6RɉBi6vx!_nQ5k/q}^xSxdb>: (("L6 ,/ 8= x_)}hYi3&f(ZJe鯮cia.B%)oMBF[u=wvpl~`0 )KrYˠ8K|;lZ-%H>8=ȧ^oN;sY IjOSz"h+#sMDi)3xCNTjV(3QoܸNӣP,JeY\Ne8^#BgZaj\;.B`u{MO:.lA22m!lrK_|wﳲHޢs,iN?# CέR8n((Mpx~n|YٖiYxؓHq$bOh4XHHH EAfgk:J\j-Q`s\NYGa/F_.. Ā"^/؃t0aEpzK#"έAOMkI="vwvv&J4MY7%iFrY-r!plQw@Se$sc >6Po4ޟ+NMNl:kUh:bRD|IA)/]HlӤ73ׯqiԮkl suG\V]y{ε+O?‚K? Hۈ)_oz1sW(f@_uC%&7PDx5>u oD\ xI)bq^֜>@ʶX[_hXo0 |__On2=5I# NiYضĈ8V͕'`gw77Uݿ?8XcTPF$4LTJk9m|Zjā:$V\_`kkQ[xzW|:cxh!/ 5%㦏i,zzCI?~Lڵk hzZc}-~5L131?7`ȐR4'JJZ< xM/<|^k|}g=ʤ3R5brrwF~RW9sn~, K\tA;IIq)ܽ72|Y7 d Q!i?|Mܹ{8c4ы"v=: <էמÇ\'h422TF)&Oỡ%}&yܞd&%t9Xk)Wj($Tǃв8_er(pi6hn\ЯCG|{${uc?$>O$ ՘]M|ƑpdzwDB8EjtWΎ,GhzN_{l& (f!Dw\3Ǭ?RᩫOp}lۦhbeaQToG]oG \LMիtbӲg*5)x?7S㸵W**s֓M#Z L%#`(1 X?[epƲYCOߏskkͅc!e`=?etDžaf<| Er*l0M'4]kJ?\ޣ\6P59Bݽ=XQI۶̗(JLOMP1 3Liw:d)J" ܺiq]l a177CVd "M%:=GM"'BNgrxAH6#Yl s< \>T1ǰLta&v:M4u\ f0yҩ%F|iaRNc0$װ SDX$"pR!MMa62U>lAe*\pkWCvjJȽxK4 \Gu\B!: PaZZW;FiF "eƒ5sKA!˱FضIj5>۲f>"ci|.Gӡh"@ _,͑6tlk|M۲k>I=m-4?N< H9Cz=%+Kf cmXj VKSaƯ!YaZ|q} e2xuef3 lmoc3%Xx'k4M_cvz 9T*:=u"RlR,X{^7?&r=Z{{{2HwFMc<.^~ùg8lu}n`-fnj ep8Vj07vJ°則yD_CϩD^a:x7_O))h |ӶmTzFQ+4~N@G9}*>iQoH+O\?૯½t:=._^e}}H#-9&|\QgX"~}w'ડ *DȡO?Hr`@CKꔸT`})4%n"X=}faz|HR{J˅ `Xk~yߣJvd۔R[<}zIZv"l֙{8e%"1v'Ɂ};+.fNJקkSSJG.72y$I}2RgUtQU h0hg>H4I.EtOwWUN!zpw)ߧj`Fg8VfJWֹRX0PX-.G?yMf*5EVNRzjZ ܾP@ U1kF{=~ch󜴡Nj4ѢP(H@Ž4R~ cۂN<ޱtuf$C1G xLz4#gR,ç^o`eyyȷ,klV9El &t^ \^ldbJ1$ArG.Khh۰YYd ڝNAhIJo5[u lKRBEc/:d&[>TV#,3v*f\rH?a4>*O2O}H_4A%2 .t]PMmg Slz5̀07z r A&:q.#cX'?{TװZZG&J,j:. ,8R Vsh6q]΢Y ^؄iY`qS$ _+Gar&|QP,#"P> IDAT\j]@ta!a ,6wA U\<ݽCDv圃h"2&TqDq! f vbqelnn" #;#ծ}P4" "ER P.t0B1wpp=ͭ-x-lnnJ>%}!''#+2DZ(!!Bs,Ski4AKlֆ;c0tLA!v'xP:>ٴ7 P{Lk"}6dZ2Z7 A`Zb:RXZ\@RB  +ηX]YS7aRBޑOvkUԚ-gqpTō5hh"}ؖ%}ɬ`pjNJ6j\\F,]9n`~(Th^H\t{=ܸv5uŰYUn^U Rjs!KG1|+l&N*|aj7yϻcO>~b-..s=ޏIa[Py  Cdc}h4yj vR=DžBE`\뫫x vP.s\YYACHEއ f& DQN Llᬜ3a)8?/C%gz>US(QH`Z?k~TUi#v|_}h-Hi3RVOe7: ]vE/^[oRBsxިzɹ?6A)@5xȹvcc1s V&ɼDRSקSշtMQ%;ʠ+>DTX&jT i.8cX^Z!4"cp]sUt=d, A!Ccc :t]C6E`ya{{x'pWgnpoXw]ȅX[YIaTcs}1 h`c:sgϪ&r̉$%:Q*u8:!"ض-X ˆ17 d0 !1 gB}1sspvia~a|  AShUK3:.(4a0c[Ӑ:nj._FY&Rt;:ByEp]i](F۽\*̎l@kznMJ8¹$>CU :X U\(J)L#~H[ۤ'!֥n|OHI9 A2Hɺs%ՎMRܗA ز7ȡw⚜{x2=hnMĆ\q܃f@aH\;fLXX+DNX7d>S)MY]]UN ՄL$YA몐tB8(K`1C@8X7YĽber ƽX2نl\N[n I}cٙ "z^}It]tWgnT/59 Tgnk[x-9gM5/ꗌP P~˺D`_8~#C餬 / zjnj3^{m pOx@[Y8Lfu] BAXR%EIF^CI$SJ<'<$oĦnĂWG&2:1)CCy|>+%ί}?}M &!0]ǃMh|l2!〩C| uj" DX,`} j60QAᩛQou =ׇx}WsXC.k_x6w[;ίvv0[)Mܫ/GDG`L"4t#k(V'M LJl.abn՟?1檳}ZY^B&BDX( {}qۃEiAŦI16 c _«{~JJ_F_Zj:8B>4M(uC˟wn(!?#տ%r";T0a F~=,//|0&f]ǁ鈢 u{9' Dq4-X\1(J"K[$ºU"/q]XM=Q'~oÇٰD gc]RJ5yy>K3\xA>\PGGagTu9xKG<6c>iY"HhT9x`tqe vʉMt ac$,o~xw''l=v=J9fcz (r؟L8ǿ#dRyhBuM7cRP\pk8KIX[AKϢuX^G[X__m@00mW^[ ?Õ  hZށF;XY^T;dp`"ά,+Ԙ y1l&|-EƲu3`|oAŨ7r |Qsz3XdQ<?<ŸݏJ5&aHK/α0k ]$5|\*zCTϡld26F6cc~ZM*AMQ(e&F3++v*ksW^z;{ Hj?y_sne/V8%4xW~O~*3v,P@#cOƙPIpih;8W$/@NQ0J6cu}c]{ V= Y잺ח>nMO$L9{Vf }Z1\wdznx5 N)VN1rxhNˏ^ vLI$ö}،|ʳZ&]|:Y@=1@=0Z g.JyOe *])ϝ;F1~L IDAT= p`'+)h+++dK|s|ēO``Bɏ}?XCȷ٘-F1YT-!DdtPBE!.Qd_2\8{FϞ-a$Z0̎ ,8EE*S5lpƙbBGPe333{}h:<@8y-L v.-V:T3C @D$ShEI ʕK*JN>W.80\1P]p\ JR[G040a Y>5FدMruHĚS] \!}ZھO\]B4("#!l&k2K fg(X^W* 72Pi*B̑OcqlЅC8,KnNGƌ 8" n/ߢ8t ^e*Ն>?cܹ'a$wr R6c p}V`a}u{2'Z\J$23 X&6cV qT(;c({#n $jKWC2ރMvf,as 9gJ <P(Oe}4kRst^Dx`lj>f/d2xLAI9PvPX,N "$z'Ջqg> 4DFmXTĿ ްv7Yd[ j?c&,؄t}8µW\Zm:X*sBw]=aҖllqE( h4{{d,(X BR A'"VoT*j B`&\fěs @2P(,{BV8;"6˿(|>/dsZ!HMdcLX_}V O 0T3v vP IIqp"(Ϝ9ZR!csYQ70;SS7uPkdEî b ;5698<[wΰ!9vvf ,p cJA`fB0v}BKKh;xc5Z}AF=4^-+iD_#k|?~ Čh cnw~2yw@uvװ0ÚWqokG @t|=E͚':3w{gOIŜ$|Sͬ$_"߿]!5BobH w,c}3Ƽr#eYv8;iݹ\yIQm'L_siw5>rcsz1JV'~jl}}R0MI3_{I*8ͤU٨9= LU[-t'`7& f<"C؁k+/+ $}kgpT!V;I\ٵ,NOX"B4MGi*;:y*rTBq{ wbzܾR;9J$@H} sspQ(`hI"|^.M|p=s(OPӕmA5/ّ>Fc2w,*q;g?%λxZi౶1@C9_yɶN<ҟN5tGG[2|qmyS41I1&5NRv M4th]b|.+@ l Иf`q vK jhL3:AՂF)4J`g,^R8ฎ`cS8@8+"3u]4[Mpu@2 [C3&!Ec#aBuPA3,Xn5 Fh\zR=vrng#, fЌ XD@+P"nC΁j4BQ)_GFG.a6z#5JxwUO[{?]%s4]۷&׮^D^}♧dww}wbmvb_li!2 (W^i6CP=1Y@G-+V4D ~/yӛ .UR~?  9YHOĤiz`q(ƜP|b#p(T*z8,:(T>C kB^t>tJe6NC\~|m"qs7YdgVPr?q^8d"{0|OXz͖#m\sEDb)}| L<xhԀXE@uLϟGفF4h مnP=We(8E|?"2 X (VtdTΨS,/.i 5sQi&!u| Br"_bɌ+E@2<%cpƠwp ʲhc[b@b asdlql˹0vZMfySQ$Ĝ}w!#__ƒ[ BhJ3@(&3H\9ݾ2d l - D&N k2':K!BlzÆ%t]j>ka,@q plL[ ӴEfggp~ v#,V_oC@#!k(+AxBRFu³288cvvlnz=sU77zW*[D**}9wvVKŵ҄eggx)$%*O]u]f7$Ѡ.UcǮcoo,NT!|^IUF)y^~j 8KfVٙ]GS5glNtu] áZ>qIqR9CQ}|bH@Țxzq2(O$Ǥi 7bNm̌x7xCJEx&ቀkKIl0T<0%g|^LP{>tKQ ~_wJ_>gC"q81o&,D\5" ٬DteU^0Xx3VE*$ZUi"!\.+n:ran${@{r,C&, {{͖LGq)SAk RAf,' ýV\ D|6DD(fq,@Xaqn>A v U<{*oup(`kq;{( ) f䶀 h\L 64]Gە*Mӱ(1W\*P(s (@d1t<1[)\.`ipgw,嗺!6Hdl4-5@ ˶z!85Atv}j(g \Gt6.x睷U:뻎ڄ$Mѯ}qݔcx#ԀxڌIQIUD`'AjJᑮ&YY͏oS׃GPEƖG@4$=Mݏs<`+% Kʲ?5#umb[^|IYMzϟn^˦ϗ~6;Bh\.&L }(TfGMܼ _4Sgp0CڒT.ꘟ_@tÄ biq}޾XϨPd83aok+968a$*6bue\^ֶ+ˋUoǿF.EqxJN-uqp>Sxp>.z]F08 Ge7IEd@1_-yr#0mmה45sg7l]J=N(ZOx}`2M!트WugKHrxu'+mGQ 2C Ps@ԾIF)4]W!>Q,SDh62V ]P.Wy}P*2q窢 ,CGu1;WEbq~^4u0$9=ǁaY&*0D!ip{`2 Yez @@GXR q1f"h*ҤFg14qcqdy8'6,PMGXDƴVJKVqC8"aLYL@C3y1@b 3!5 y},d?=A7 \ +93O?ݽ>aBfKj!lK\Ζ0S=L=;;׬sh6Cn.{jX%n=y <09G2^-TIާ I '&cjƛo" i9dE׾2CzxF$1y }Rl?>hMa%.ƟR,5(R~8.<שTʸw*'m),% 8 gdg /Vsgqv{peoRk,dGpdJG"@P`%)]=3L&Jeen|O=:yz#~ףM:>ʷ[n!a$)#z5RLi9)iv>崀8QQuNXT5 Rآ1Mciql]y=|}GFf*ez Q*4WEŏ|gpX_߽6{'3!ým`{s6`qY0"!7u]Exgl6^aZ f?;{,>i Gٙ ,:!"4-4Z-K%Dw]}y(r7ְzFS&L40TJX\_~|FVlF&W2h9pfuNO̧rÞeEQ-:-.dInWΝ;j,̝ gX\/Z⡴9'mQ|ɎiMiR%p%OR>QV֌O3?מ)[:xtI Ƨbv$Lv$ËbkLXcl}7D/|޺}b<ˡJ'W_y[[[y*/J蹒P|_8`skh"J[{ -I؈tP Y=Ec8\8y[蚨3(G"@@5 0.yO{ZB>΄' / 'a̓pr~0K,  "(o`_6I&C'8y}iMɜGȀ`DRZ#&J$mߙߴLa!.5.dfkd* =(aJݑE!TPJ{HbMYvwwwvwfrIJ[GG > @G'@~ AreM>~&#"#zzI 0Ui\}9Lٌ kc i*3~=i2P$'$ cKR#)‡6Aq\s9P@-[/?,Fb9l Qo4P*| 3ˢ/aoo1 ,K6;]?XىJ]'P^z>}+#\C݆e(Jm _5X\zM˄a5 a,(^y{%$@4lTUAkRsX3@eh4%cn1Ӣ o'7SkrNs|pC4!l417R$Rk{7~]>xMzS.az. v$e_:T5 dz31kwXhuS ^y?{}iVȦR% 0]e+ff4aEa#惃u:oHݻwEa8 6HlE1mP,!%zƸ'8O2,RafsX\Y> /\x%Nr>oxc~wم 3 gKp ˿kuUա:2]݂Ξ> #cҹ</8ۂ-W@}:J 5NkhցQ 0LZWQDB왚7xk0 ,lb 4*{Qo1DO1CtG,۶Zo$S # GZ.NØ`A47 qVELR?Uޏd^pr/aJTԠ|?f}kI庮Pr'bIi\0 :Iěl%3EmdyH!/3Ur5\.+Y'b߸.=X~ 6Su=y7®L/ eA 3+zfװh AԩS4 vΟ;+0Lm-ޑ\l7P>q_np06TMÉ9T5 d766vdU-KECeTEj"iHPMy\u_2륋sMxDԻŚxW_O2YO $@/N6Zaat,%l6e  DǴFqg(133V-'3G( Nk?q4R^D2\Ҩ PW(IY<$ci$zo[&K+}b133ӯo,FZ&L48uףkG֣ƸǿHY%L2EYLSդ~ V=KEW(*uaut|?Ei΃_Z(ַvP.?z Q@෿5_@;oOnHV Z#1x`37)sW_!& l,O{k^f&''5cjr;{Ș&t85_e lq:/ ۶p9G?Kr4>u"j2 wv64/m9FFGlw!X>b`d* lPh(uT O ll!T*uI$$$,G|[{~ڤ:|gg:@ 8KΎx׿MSqܽcHn51Ш<9?ɂ&&>/P-d s^T:8qQzw8$b8bcWܹ{ozE$I655V}S ~_3 |>/c[I'BՆ2|.= rY# ) ux ǥ ٝ{(  *f'o+88 BSs?@R$66Po4k J"f@p Iqj5&g8 _Ɏ1 "RGQYܡ uI6uS響xͰ=( n) ;b8QI[O&|]ښc lCcLe5k4e~BLAåB#(BA`>oʘ&P9< C B\|âBpeQ\fSv?*as0kfwBN)]b2B` b/{A@8 Tyu]Eƅ 籵lۃBTP?DQ4 9ĄiJt54i<07@8]`\8T8c+kp=7p 6v] p*#"2zVѵ,6>\ǟBS 1?7f dh@a _(y, `@[.{Bܣgz XKCQU"JAF;ujr cQ* $ʥ<.->Y^.]ÔI<v:J$N2 "MY#k'sMbRT#/Aϟ IQM7|&7^GӖ L4%b B06>n:ɡ,ɢigh$c vJ@fn^&"i$ Glc @94 -\|v;0}&yLd2X4ڑr"yh4=;_.%DE(YMA$Q4~P+nD~!@2|R?xߓ,ZXf@Q a,al.z2,ۅ(i.?0 ѵ,řs5[85?vu1?=(E\BF!Gks 6TEA~Sp8XN.o݁8L,&3ւRvvpIlm0LLNNfyp mn~ DATB>vvP*>yM<\Z怇 vxE<\\!& o\jq]"ͣkYCm; nwax/W_^E`$P9[q(z8>N_!AQ܏K%s`aDx},AG $VIFKD_Ƙlܧ餏 ^\b? 5M@QTnt ,bё lLEUUƯ}ݽpaeuCLdlr%@E i˸K( - SنlwmV*hw@KN >_î]-&l8ˍ5Ȩ* X`Q20{N\JE! }V7?*P2ˢݐ5"\)bv/`R[s&''1ӌ3z[:%Gż4{Qͨz42jd7Ng߶mQ9.^zojvBz}<_8Wɮ#B!a{k]iu"ia`Banf`/IPOVJurYdU}L*?sn~ɧRI²8zZ-fsRHYQ}GP\4n{]`6&'ưٌ\>1la6~5X3Q>Μ>fJ&!le]>DQ%X>r#;gl3~̈bn׊|2Eɑ!cud̞g/+ Caؼ4 $ir}+xȿ(E~fz++onH33|3T{ dSq- {r^<:! 4# 0n(*lAvPVo( j ,vB>CF6cv\,1i|#"0Z)89;L~/_rG Phu+7pnDk X ؼNvg30<MC ֭ yAL9BT  *DQl5qOtӐ1&auMLn IDATL&rcv&&`u-ԵA\AfEequ.E'̠94L 0'jmwk:.|@2.r"*%2@. 1,LN9 g54-4حVBdq~_~gcggs3SX_c h5묁&AC@)]RhXP,YDkc=JOII tiu-dsBϙO6w4ρyL:-%.^@=a[[O Ť"J$ 4&JTUɌHƎJb& ޺AiUUV=ߗ`kY^|yll)k}?3.& 'ѭGHV`fLS6 (*X/ւqt:ؖWg3F帯T# B 0 &j( h4zM{ZӴ\س׮0@BǟH˶1?;N- rɭcT~Xf'N۲ib~.-qXQ; {^s{h1`@F|iCQUuqy¼;4Ka4f7LLnK`, Ÿ+ V}V'(#(@p7 _rq>Ľxl,pQR8&LHy.Gk:W_y%&vR9y510wÇ)={ 7lh':!pl{{8ϻ]]]Ae) q`Yv_260}u<1j"ຄRwYJ v|  B,ca .*E0OS%9'Le2Z,A];nEIʰŸoLEQQ_:0Yy~<4(Z/#B\arfjL'^,Qo47_ӗΣT*cٰmzӓ8{jYRTcim5\v~f'f'oX]{|v*!0tIm R0=5\\ZA804]ؖwX={V ~$ɂsBsB4Рj;;Ҳ+[i `A! TATd0gLN݃:j&vw#L3.E._f`\r;{q#R*Ƨ`@A&c&NSLy(3LsBkKst͈5+IS!N766N%H:Ko]U5 رX2Pώ!|A.b$BicKVAN ]5jܸ~[[2&ilJ!b(aOF"&Ok>l)\5K.`ߺ}IQw6*2_DG@Ȇ^F kYfX\YEDXĽX89]?=1vׂix0;=+bmc!y.t`z|v>ʅZ,Fv-t- /x\QQd9ET P(𣟾/ë:]X8RC1{p{ΡG_5HCI ״DO3?ޗfc lǕ/p=? T,j̊`:yUu\v6+#>+^t?D>+/> @UGGPq&n|¹`& |0 %nW4 t>t$ZR3!R‘ubQ9B. ctttDkXVB c6A(!!>j(cfzy1~x,k?{猅)zDiɸ棏?Da$gNFZ7:`r?܌nq? .(%qb:(iBzWHOL}q 3lrbWy7Vxg_̼hrd[tm1H(k/cyu 'ODײ~ΤȈ aR/f+>pwjh ڂv-|k_g>@4d¡M #MoszSXd}QcQ46[N-_AcMggt@#I5yǒJC G bl(Jq }(J0lǀ@#8$bţY$1hsAkQw1Ax|O1},2z^/AwwiVo:ϥ9wu "'N@D38Ώ0QL<h iz32-a#:Q6 !$!}!:c㚳W],$"* !0(r} n:cs03{@e%  l/Et t@ !} Z}4l:I`OsC4e6ovQY@t@nEp Jhp<3:V23q.#iyٌp%d@QoD\H W<ݽ+6 āF4 "GTn;KZ( Y틡u)Y,k2h76'j?$7ݧ~hCPHmGR!zxޜ&q!(c!!]Dn^QO_{){G 11ʈau9+_MDĚMyQհ.]ʣU͡P(H߱Y'żX5؎ iM=c*b?],)\B4M.}j0L+/c}c 0t\p;\S@Qڪ*sfB 'ǹOdw!!|}\x;(lc z݉yT*躆v'gO DaWs0~wqO޴=h5 Fߍ0e4ZY>+1fLWi0'r9Kr~x9RW8NCsAi̼*'\Yi2qPJJ۲f9}0`\ #3t#Ln*4i"EQ\aC; аӧOj%{7(Ek8 8V=.PxX:9P?MVO,P`*SS7̘VC6c4 i$B՘so UK;PMq\AO_Ս-LON7?AWǷZokY(vvprn ?1j:Fuܽk(0 L\˥" dzWN(B,}X)\Q|/VoH$ڝ.02R민Kԉylm3:~E^Ǘ~+>76SkW.wǷ?x\6vK$daL#(u]TuTu& <<민Gkx*T) m>c%=.n!@AW\|%a3TLJ]B\67nčjҗdWp{"`SMgŚ[)$਀G}paFOΝR^  R=~}2VK9ReyM@X?C|"瞼ϩ?tF`Fe d^n#KKy$.ݔq%e-@\Lq8*2Yf>62rٶ M! ChDR>m7-PJe>\Ebr,Rsk (ACŦD̜1M؍KL%[ @(Ly#1tf)+G7ǯ*HmQCY׿ҋq[oGq0Q\.4 ۴5T ;숱{"$b#7)IS f_" =I$BHn˵ ItvXVrRlp}9@7t_#Bi1QP~ (hGXN EUA@`& |dt{5|x텋 $0(Q3O=Zj@f:6X6N.LXΣެJ|VRHY$Kp yX7L@|@hlOf:1M.Kc|;}%l6+HLHGqBpsޖb wM$R9sZ3[xPZH(FljƮK ƒF\(RCt] >mhiZ$ Z"s 05u!Ml=;>""94Yu$7%!=BؿXQ;`Bx#d_;_zvOT,Vpšb{{[2O/\‹Rf็ 4rY|v( vS$pyTf!&bA0DՎyUL8q~ xo>czɹ3Gr lɂHZLH.$T9Z*fe4MdFUUt8޶m8# A6AN: mǕ4Irx%@X2if0 E̎^x̰۩NDrtcXPKD7q0`串XwB=59׮V IDATa Y bm}Y8\iBeXȃrtUհ[wX`k/\,jn?@t|WRLcw^~[;xY_Z8h6IT]չAMЈP$0B C d(pB1Z 쿊3Ƞު٬$Da#X'u&xr=f! }^fsҥh6\W>ESXa2cA(B2H9(l|333( Vk+X8s%bn4x( *@ƖP?` -$ļO~4D=z @<ﳀHSG5N LAy.g#\.I41~9vL^ܟ1ؖu!f289?}ÏP(ׁ} vB~oG(J"|ήy籱rԉq9``9ӵ u.kw/\1Ŝty-R6io{w,0 4 l1x~zK>~2@kWYe1?<(O!q _WCAF[Xz|~)WjXjq<zK0cfxtuRP#:ihcCܒLr`Q@I-m,LD7$*u Gyf0>š؂L6AЦLы ,<VϡZ@<4Dr̙!}Gyh|,ztd٬h`ڬcڪ(lA\ wb!NLD4l8nN\s姱Brl`0=5 ,Bn~+`xF*n&izfd|$ONLn6_4a^y o:>*2lہnUFV>݃F\Vl pB&'Xs$8N9HbdchnwȰ;ljSY?d߇5*?Tq8lp:z7?CBUܻ}? "\ϓ4 x~n4TUeݮvRjB6N#`iyu=:q[bvfK+7FT( v-Tuxû)ߓ:z3Q .!~zJXMW!/v(&?FBH41_tKhw:\zFktto1 a;'zdCEM.F)I:8p{qlCc؀ȭr_t#N(= t1,ϗdDQ0>>*7>E4Mi-ŇPU-0tEX\ޖOR!>ũ'o~$Ż_"nݾ0 1;3V_7q}\r;{kv0=5N Ch6[r!cLOM0B A(%Ο;j 3(Aلa|'O`Gd a 4B5躞(bDbgg*VW' &8;{}oUY;kbwoRs]y(@4,_WvQ*Ѩ7pvw`h* <4M_mLO`r| k/LU}S"VuY"e$יw?@\@"8ׯ]ed2Lry! )Jq[Ų8ApIYH "E=7\*R mcm}}rr|?ogd]a8-9<, 16Z(HnYo{ ɲ3;^򶻫tt,0p\rX\rEQ#$"P"  J"pX 03옞LVeܽqͻˬ ELuUe3|ws,39'{X}'z?M[#<̂o܄?C#q1J?x7kgXRvw񊊎~:_{+tJ5'>r&pAg?=<м><ˑR)Vp JbpRH5}Sbssw+w<{( Pô,4$*#yT)^ `Y@^)v%}eI`P)QEA 4V6,X>lؖ DˡP,!ͣ0ZG&SHyb1ƀp0 {JF~a1 `@'$(1R.amkA!>#>M]0" ~qB0pPBR9瘞B&E( Je<:ȉbH@"P&t~Icg*8$ODƏ444+'kFD0n \hvfXC1^Ӽosy⽆0OG_,MH›rآтkfWjKG<h6SO Xcoóg=ܐ9w-^ xf,y$cZJPɂ*d>N ssg^}=_k8s<]jUrYA7!&߼M,-.wD;z*:nNHiǯ~<76zrXNyX|1^jwe|+CO,DP*5)ed0Az"-;, FOHmhն^mqzQ.vX,CKRפ!𬎡Kgc[v_ a>k-0S7yPJFd`+ ~_<>5,!155!g8aۖ.0Y  Z`LB<@!XZfo#qx30;3Wo d!{a\YfH lFl\ <O] L*{bloP *vLkhkΝ; _۫B $»'&ƥz2n낭9MF]T\JQ~g><+?4NHȧ"1cgiO<4.Hyfzn6[? x?3mlV4N5t]AܧFGad3(˟™o}ϞG.rA%9ǁDi1i{%y"Ĉߢѣ=Ѥ\ichE1Mb4fJHwz&g~M=Բ>nyYqװd- gIPkFGGvݧrJfdFgD$,Ƙ\ <*7!˥r830ҭC4&g(P dbml6 5V(bFllynդ|V w (47$j!\TDf3Bek`RPjaۢp.&r6ҫ! f&pMXTUQ"«;렒.:JnC'O`}`YB&LLj9 [Ut]>}x>91;iTG.1^tFSwg22)311A%$T!Nsl,Uj]WdmXBpH($`Q.hsaR¿p=yIcNeC.W+4cڍyHOGU/gis2 =v 4}=K%vnqTzsLܨd^Gt]8P ]3$@mkcsxRC?&/ ɠ>,`Zϥwxطfggj;X,PƗcp{ --I6q*w%PbAˢީI !ۨDSsۊ% KS:B)jB]6Eqv6ElaNdPqTfsA TG6-Pd@|9ʁ~_#dj}*wZ ' ]x= B" L0J/@Q+Iq!TeDnp<3 董ƣ=XY,! iη `s+e)U(^@Im&-n!84Nzؚშj"V@Z8nƾ$eّ4O5lyɮV|͍$Li16!ВQxrO׬>5# i "3}KKcbJ1OBB IDAT۫kp=_79{F|IxIQ@wܫ}vfZ* c}\qp\lNJr}B !:=;3VǑ (E2t]z_gqwP,P(mD>Ȕu\_xNJfo7q37qϫ*<~k_sSk2M'Q7ȩc{{1P 9ЃbzWRA Hk_* .4 ?T5Oy|sW43+Wf( ʲW{/Z]I鏑MT?vcll abdt B^'2 X-˲^EM,--"ž"eYp׿" ܻ=2O]fXPIAFjsm4[-0zط0l&E>ŕ7a[:˨n8h6v]LQo4D sǰU0^.cElVDuóNam}C\ LIsڎ]_7F Z&Yi67ޗ&e7 f:dlJe53 "cgmѨa \rȢ J`CO(4=4VVn'D03Dgl׿ />ŨM>x :&&&`YV,HOcq5p` !f% =JmnSJ4v1G0r{U9)802R aJ)l"Am[2G!fDەRx_g#lWw0=5 j۷Xڧb"Ň!BcEt=aɮ@j} I+b]O.]>^(kk٥MNJbw$=GI Ф/L/ࡿOt:+Cq('Bt]!DC&GER5pẑԕ=Qoe]S;;u٩RkIZ8ƺ.`~y ,Xq:ss)*l6V۶e|2Nr G"ˉtM5 &&&ә501GZ&j;)c5-T\'2:H Mb4M/PSc's$f-Fޟl.9l`l1#mL cc=Mp .ggbzLlۿ:s| gn5./UH *J%k$ﳨ[1 ? / >,FGt:"̀zܸy sJy\EY!EIU9lvw.8y \YLch;h"(x?Oކz)jpkeGçNR = .!÷u4M=ʗ(9=XʣaϜ#GJ+J%bzp.Hmln9[;Ęi=Cf?.2awx$J>?Q Ba)j"ɀR|>ͳDLt7d6EA& 666A)ECPDƤzQUF3IߦLkZj d2M{q=Mp3xȂdPȠ`lH2y-*z套pڵNg}FSF8'#Z%-v7AGɹ9f1G<^1FWF vBʴ nqt[B#|Nv=66Zi+&'IM7(u=d=W_>FJX|6Qaanf#"; x~b>iJm`&Lfgfr{s4Пy wt!ʓAhĸ;rY8NWˤ܅k xLO#Twvt2*cFCWVyiaa#/Zu Esj;XC@1=3-t9Xo$yܘ@ NxX\Gو; #E,/\Or8yn [&v=q^qJ*Ak݀i]M}X;6vEؾ>NĦs}KG8H055fY)pw^͹O[nܜK~;FI7,N|W]*<;G&!8ZCgqyNR,-Σhji28@aQ8qAwKLM$]'c&H4r6_db,|6<k0f+>ɼfvp3o )R}S7G|~<  ث)O<}W+e$?[~DRgcBHI0n>/䈾os hH%w 2N' rV$ώ fq뤐Հ;@'ŵd쌸*εKnp6("K"&l`~BJx ^ W?\Bۭ6xxA:Y d@߂WRP`Xx߾}w07;P<# <|ɞ>u6*we2AfcJ$!8Q!ME,uu|bc11*еUP^oĥ[IaiG5 =gȀFĺ\?3+B(0O|b2ꈌ-ߣm٪% 1h0Q+J,$p:,c{'10C lT#ݳ<۷WJСxG0:: ՏB6ǡja۶f>JVFEylg_|nj\jx#&X,i'V#->IiJWq*qK]qR?o9aԲ`KMP8{51*U V?r0677b4>G1aHɀ_Imlx)<>QǝuQ<Ae,,߇h4X87PFфu!:pl mc҇{l!l>?Ͼ2ٻzw(__bdųO=KWoA[Ǚ)t:\OyGwr &8EB y:&W&X\0xhƁ{%4UW "pCN3!䬚F`'QLwfSyD,YxGZbvCGSs_S T/{? Z{ ãuEӂ]9 ոLkkdJatbb"*ܧvkkؠ:<̱QK59?~f|G*!m=q[IJŒ'SGx]C>ljams-:v7nh&V]!_#0?BVieJ-X>vG3]׃nwdX[<[v [Jp)K"1ef1>sa5tMDM- a[q?NbQv2G[9D6$rii1b"ߚb"qHY50<"Hdܯ,' B <% tLy3}NR-$8J{A$5`E3UѮǤ8 z$-<ٳ 0LC;wWyH*vO Q ۲̕!ERzp"%U K "dl˂ b&,F,`" @>6ч"A&Hܮm 9@@m w)pAlm\ʥO/A/&e:j[/*Rj5pp4\)\" AY;2~>XID!X{BQ622\㏜¡xgcy89RԾnjGMsUrzU֘=5n79Om'_[r*>˸r VVV# YI!mD0Gek+}_Ǚ3g|C30x= xE<3Z˼l=TYǡ w.8&hf =>>.P!F;2%*_z΋E nXQ\H۞'/14qI/ѻq+Y{VgkJ.l?pR=;\r? Cn[ww$a:?udriϨm/v Ig*dTg(1bj*7y"Qvd2 <\CylfRǏ llfՂE)76173*Ut]Բ035cއg8?@(š(c{ W_[#BF+06O GBu8]^R(r0~7eѐB_T:\Жm! Eh yDѪBqP(Eh@u)i\/ϟIG"zҐ)Ot4zmC^oD}FZ֝|7# xKikS%]bK'X~{>_{n?~l[?Z (ţ=*YI*+++wlfwauTƒC'1xӟƕk׆Ǩb)s-_( JyT*,ajv|)|Wp54M`aĄVB? Q17;JE7 Po4(FGJBq 6h6ؔ*m\o$lě@WcgBsC5(}LȔ[̩iӔHg^Dqo!L&#gbb=쎘d}4taffZjDo6;;?Lw %3| xXsG^o?P< Дhj11IMi`ITqMc> $!rHfȌ!PX}&'J6H,Na$&NMMxz|˯˲J}"&|]ŋ?7-~1Y=ƈ64-K e"BX' ۸r|i\q~q\rM_?{G㢩ŲY.yDԠTyO^/~]ױZ/sx'oyxsݸ\}|_8K(0׎$ 6Ny VHII$FP<55T*:kfl[ *SHeY"p nZ⋺N;%z9:U7YD =.^@_oQЧ[)i6ykwĺv/ w5*vџ7HXv {]KrO׎CX!@cƧ\!rTa2W@.j@)A- d.B,08z&'i c#pfSSSp]%<0'FG>ϜGytTҪC8.ݼRzlFNZY~MoT0=9F0 zT¼(xQW> v&8Cu& xchZrs&_7R%4Q7Lވ0j%"W3g x9\y|ǎAek; B+#GTiϸ=X ߇8@iEs1m PxfXadS=ׯk_i€^ɽrX֯@pҁwA(1~n2dyOe< xtW#yjI~kX gH63 z" cTt!=߁gZqzOמ !F5UDfbte 3GDmѾQL]pAܺy3ZJe\,lq_6d!x}}8!܄9T)(R2XepdlVLYbf P.se `A_/@ ]U @թ' :]t.# .<0a`AnAVB낇\uY _ 1.2Mp7z[Đ RԒs>+\\=[IO2Sgi} \j 5A˲Kcr#W& D1,zl1̑G%xM"P/D̙IxլPJ sIxTLOMaG6=s$ll ^ 4uLFLơKZLF{} ?أ=FAh.!?8\N{Mqk;< d% ĸoZL2!y}+%9i"6r_Tv]\qK3S;< ,{e Ȩ8l4ɂm4䘩c/%c͛7{ W]h}O^/|gΞX3/c;; \j`}{_k9[XXprfC%oSQJkMjٳgLϋq~nUv:J##X\\2F2TŌ\.bFCt*,02J\[HO_R -ݲQ̖V9{5b82s3F"|~难R%wSK;LFyi Df d>b2(HwH4Hdy&4߇ꖲm[UwˡxRiX6uƌmP\.mضl;`aZ m;=t]f AIlnUeaYWoܒ ,(7xGqseUbDZY_djb;~簱ժ~x[ZD$s(̫/cff:8;,OښPRLM+crr(ȥOV2M܆c]]}~{$mP<.ט@탋=^S 27]:NWՎ x:K,KgtB}ǎfZ.A6+r^iPSSS=ʼn~@c3V=>} [6FAp$ej(Q!vj LOfL&Ce"͕pj꾥EnQ70^.c۶b:FJ%lmUP*QC]CՌcٚLBzR)a2I B>(@'y(T3-諄GƸҀs>|/ "s͌nє8RXHJM܇t4#LSJ~1djQ F16}b!bgXאkRK 4j3e ǢH"eLUͷ?i6[h0?7V=WnqpP3ɦa*! Bk\%d2>c`"?L5GY łK@H0ߜ> " uD5aj|!Ѩ'Ayۈ0L6zej;kyAZue DP jU(s!ȍ(bzJ܏>DM>b}cC?kk1y > N`@U>BPa4?;kR ydP*0;ksGxyXIx@-K=ftt m_/gDҲqe|O'?kh,-cV{g#,\wq_*j:fgfՆ{ql}_4,+1 ~?m=KC|wcH~[Z9իW88s6j7tΡ83ˈ}[U1n3a6<#|XX[ %|a졮w@~ď%~Y=ePщJ|C& 6T5yߩWaLbiiߢ,(ͽʯՐcP{{;um|GA@&AÜJ᫼{5A صk>o+\$zݮ("W( dYrCbZjse<ϋ{J)&'d )!( xSąP*u=E0agl=FFJ՝/vu-b((y{ 8?nq}GeK xp%)Qp-fR czjAS#ʖ(ONqxG9C:{!Y[ׅyvj51j5Q7٩J JBb8 t  `)yܬ.n޼%[Ӹ!U"+ CJ&ϟ7rM1d47nP]_*?rP]{?E&ShuP]qj2{z8555ؕ&>E~cߺG K1jga5G F]q]q~)cQd2YۿlV*f)nDbZ,P7 gAvuZ/qPҬ@jY(J<R/#K>{eYh;36RC)UCljSJ0ԀK$=땞!Tc՘c^z wQP n!C-Pt.\ ((3l ,pp{ hYRf_.}lZ '䀆S[?:60_ k! X Yn hp1yĊ9 8 phh-/(cYvBLzM>v.|̹KzN bVlT!r{.A@v+ 6ض1cNDJ_ضəgz$Q$l%k L!H#R=;3;#:^@0/!̱2٬6"3\xIIC6!ʂ_ oqe0Q52΁Vy(۵^x |xFFƛ?g _gqE=|aY[f%q9%X@O~oY~|2)}9%h`8L_'dML~=c=~ug箤&&#}n̏; c0)c݀{@,jYX[_vc('BqpԠtQ0Υ#[+TkuinKp!mlȎE! `Dq\r|ak{V\NωqTnC^o ˠr>H nDv t:蘭VaQj_v;c}c2<σB &= ˾FVb\ʟ0ƇUkf= 1́>E9KF[/RFQycρ#a BϚB))rbc{gnL/O(b%+ z)k "UXeæ8.JEP(K(`V*Usht2m-i4 ;Fi!`.<ޅx<~ vG Xc}c! Q(:`!8f}9m!mءl6J)ڝ"`\K#?E";gȥ0ObxrW)]Y[,.lAL&l6V:&2!j5cZxl2ZTpRqxtirqtKmxԉd=wmH)⸮fضhq8e':t :l쬜s0$ˣIBس [+v=Ч1C1m y!s]_~O@ž}hREodE*4p"q9b kԱ57s1v|O>$sY1lIiemxKUc,?VÇUҀcum?' 1mTIWo߇CއQ5 a ~.䵞y1\v-xr2Z6%p噌-8K^Dp·GL{Gu}bW^~|x$cV3D.co~\_~d ֭7c*a oØc/iR YQot4i^ ?ͦگba9g"aB Cs1:: Z]3ru_xd3YG<+nze: Se,ϢVoB+kcXDZu)OMQmژȈ^&s/aZ߱>x-TKV+״Y9c҈9eegWlV#59_ߏj Op^I553(&VR[=~K7=zX@bl؞SOjsAǞ5&|XƍCƌj.>pXګk=2{&}vBlj#ݳXDw}..,I&`b04;E77;W7-_z|o~gEML#!ρqF42L0CNbcI2{쑇q!TܬhԈ-uQ,yrc@lD5l%I?QגVa||yC_ Ycp0.$Yic)" ɼHT|xP[QI̼RrGb]+`{cm:'Wt6h6>Q$KC=+M_4Q'-G ytݶ >,"&e\5ZZh6` f2cZ #|:H=4VVV\RiZY{q{v xӟʎob?h4,F;:Dag=?g\wRccc<( hwک!G҃T-jM$D-qGxD+UnjlI4AM7 I:Nؽlƾج ra9QnO{L& 4MIcB1d2x۶ x7n/}X}7wR,+s33{04 إHЀvWTl "RPb0(ZI`,ƵiSW=ݫɛnpDU~9?FGQ.te==,2c=S,/`kkGR k~g2! Əx*"2g_`#ǰ =RB!OS/;(bdd _p"2~[_oǁaSӿk1U 0s76D_\G(ŀJ*9|?caI$S)ҋ/Μ?Juϕz`79`9>AYJ8$]Tbb-y8 j2ߌwu#H`bbG=?vYYH/)^`\!>@bO ( GIRB@$ IDATf 1btv;C):%zwjpĎD"M{F7&[1Z7q̎n(ѳGPhk OQb.:Nzc k,DB$笀\. ߧx3/f^q(g3Z][C>mۜ)d6l 1H b;-|^Xx ߬Rcjj rT*d"/~e{ol7߅eY2h p$J|;ubJ +cs]Rl&,FCh}Y1*?GÏo`hm3p;l?~FH f=4gRIun Z@;Q,DZuA41?uT1ajzFǭ۷ߺuKCQnKzyknSs]gE2 9r\WpA[ί^y^6 "UҪ<+&4 a48~\@dl4( yP,6%/ 6;w Pl3;TۃFdQP,ij߮Fui!C0b2pDJo w=x qy p#`.h:.=p&|چoz  F]ÝۄAk6<]x+dLU!gE9R ד{ |)țt9e y/KVה]=c%&ΈaJ'u0o%e նPkuccc[\ M!@0"#6ؠgxxi*!,SjYm޼b*Sb|S9xzsNHtȜx {R%N;D|ƳsX_@B*©'P*s@bSϔDv\ F²P(PhLׁ`}sK<|mۅa0Műr <_ݿG0 mu:U6 `>:apy+/aeuUV֣Ɵ&&QՅ__o/y>BFA`jj2醉" z8ꕋX t#X~]kO\O>'JB4I>;}7uvz f -ϽpS(/ {ʬrY\6DI4`-lZ?fgQk4K/VVW7w/7*~]'|t8Vʼn=H}RRIy/pdoa&'&6i¹ MLOlyoZkV0!SW.֧059";uhtLvFu=eD ҫeu| $ʕ ~7+㛸pqmNcw83|ggD2\.=$=3X][S#*VHPxgN\瀨q4|>ߺy+`z 6(0!iE;. ןGG:ǎSܹۏ-_| w \!AE|bŁC}c4v0)OR]M#y#R2@H_a>Wy ]}\cruBc!x<$7$DI_Z i {gr27ׅ֯VǁaS5L§LNhZJcX ׮^[ )c ,7S(chZ8~lpqe SVk`LV^'ja{Xȳ0x[cfo`XQBet k8hs?l7pJG:75Јa{ u-6KDbDA1EQY]d:B#︆XSL1ÔJ'SG"%[(8L0T! F IT{F ?"7D(]!0baX0L Y!>k=xaF@L4V w,vknPmlLشEQkEQ4zm8^o'\12fh-eV3GA\PF()~#r`A1qMNc 'OAq_p]J~0S'O`XK((#AWsVe0:(r2 Q2ܢUl6RxsB' CI<ZN+$+ $ HD  dIU\(JAxTp `THYp=PDBFGp=PJQ*!e30b C4 Ǐߜ-L&a,T,KFGA L u &fp1<2|R^X .]Vȹg{_Z<J% ,4Lғ$SrqJ%l6ǶC5H}R鴺&rfq³qdn{Eo*Gf016؎ _7~+x`ScV+ϹLZy03ܳH$(ʘTg3O?"UϪ$bD_M`q(\5_YYU XrzçFQ\=cv6Q; ef1#] ?»H h֭Y˅D/Zo[mAXN@e:QqeKF +(i"I{gxB1XSvm*=dBz~t&Sh ,z] >][QM LRinO /(I+p.f?;=Xfq6jYR4+bECD"'\>"\ϝ2lx%4MdsT `Qb|lgϜ?GfP`Z&$w@pl`}?2+Hz%QqRL\ 6)]؎|.|.1>r) aG$eW3dnnN٢,[zxgPnX\<߃f\& b|lTxOP*W6ڶF\6.Q)pK`3-"ΨO\tO_b+Bۆ:b1"*Vk6&1_1F_t14;R<|Hy:!+$ע@tJB_ ؋;15HN J\V\dp: $ɘ49LF0HMe-knʂfb8sPoUa-ش-x m# Fn֬gܰKqVG\(Vϸip=BA1ǹׇ`yQ,Cۃ_ Qͱҥ ky`0yѬy `{{S#k`LDE"cXTͤrl٢PLE7z(Egb۶q\YdOkyb,iMi):rq$S\ u=ha?L: uL8L,{:nܺBp/,DH'@OCPWwZS~<.iX(3ױ"1Do[O""pF+-<:; ȂG`QSځih:66jQqӻ<{8(sxG6o \'w`ʯftd{{{#_d'yE|? r76 cQm0 $Oط`{gG5Ď:W?{Ĕ#0B^,BvZTN @hUz9,Y ;7z;z]dP1P:b?r;DQLT ܃HKA$1С6㊷v\{ٗYc}+_wyyVEtYt>q~HƱ8]eAȡKRI_TI$ȵJ#KYLP"D3X+\>H<  $d ".Wjr,ʕ2!>KK*)t::Ld(}o7̕ q&tl}Ue,-1g-LMNRlb{or lin#L3PO㽏nݶA)EV3o⹧oadͭmj5X&AE.¾} WP\V&ѹYܽ{⃈P r3M[ΑLX ^yfu1H#~{{ A';ѕ ;47ܣaO:lFؠ ak$x% I0'&&BY'ginLĢ~GH'rzDŽ${}ݔ!?Ҥ~c{w7h+7Թxt^j^VuI5s{?- Iqq^}WW._y gN¥ t0닫>4.r3qr\LF8&ƛdz9{^e0nx}:cat쫣b쑰ďrwq,u!sE` JzH*@2U`Et"R >'Axᕈ54^Lr;:ۭDRB,cDp} 5"`8:(Poa6< iJ>u@Axp ۫p6|P(qtJ}P  (|FpV`xx Bh B1SSr"ao޸-u28Ob `4 (0@(4okv'A86#J}92Zb` zlnnY811@0*[WlChlP@zM\1cplnmu5́\|>lnmablLgΜMTϔ9Jçcc(Wx.|؎J&0MbcsZL\RRMPZiS_k מ>mPfq{p]oZ#W^V־dypv)g%c$Ζq][rhڜ'.\64[m8&d۶ J}ضvl&0lmmlbvz海UP!L*/-n^-/\]|ǸxἐGq=-[G\aod0X{|iM86;33fթ~~ ${-ŠN;_<ݻ:oxr ͷ/###h޼ Zv<Ԛo m3! a懆 wdsyv5}Bqf?nK&0DQ9D])P{ݣ!\p>^ª!띐H?!u^]nG z2 E\M j~~kѦ0/ϵ{'>xv#33SSuYcbbfK1g BƱqqeii9Tx駟FGq/,s$,FJ<$_XupW$nt&啕r<"pX⌳h!4I:I`m97۶^]jiMѕ1)66 {c }=220v4CQC3gN󘘿 zѣ^[w( +/v(QL6fDfמz V\ߜSU2m<5/-SOÏoz''ԉEottܬ\xb.c2S'Os=lm`zjS~, #3vJ1?A@_jsS/2@iHu" ,9^l/;}+q|;Ҍ[T9,j͌$i$DT 1#k$n&O9@ Y=1@hDn*  D:J07Ye)+ B bB:Qঔq03SXVGJuD IDAT!e& 0[M` E:|߷a(h5P (c-xszG*em7Qy|eOAJ<'V"?3 m͋jE\iTNA`2K.bkk% wTQqkhhHe >ĆJ 2Y4;Yd >¸|aQu20 1֙{c>GsH>'6,䡚FXTt)AO.A<haBWˁbJJ >i0~d3^&ABLQJQo401>Q):d^9(x+ ao Q4 {hZ\H$|r:ӧN`$r`\ 9 cj}dɸkC _ʨoA4 ܸyK5åROBՃ{*1%hM D./CVG2#|>³`csS>v ` f {ᙩIm0Fl yLOM9m=vh۸y8&yrZ!%GRɉWQռ%h ö۪]7b>^8q86774ٸHca *M,gʉٽ{%rѺB>1$سYH= y~7U< GQMiy 2 8tq"h:RNFkmiߏzZ:ĿUl6>#9<~|dRm{uu~WCtϥn]l6Cܽ_^l+ o<~ S;ء~"bH sۓRJ@Dа~nB~7~]@VkT.I4M Nq,XJqP,<r,r,~ >),ΡѲɤz>$l,:l#Ω':\QI# -퉂6R$10;3KqjAp# ǎͣRbieW0ݽ}| 0ƸV#OU11el02\i#YrTx133zH6766ul6̀CpFWs, 'ᅎNFWL.i>'=XEŘ>?֩}`MbHof^k$H$( =4,v… ̛Ta ٯ |i2G7nDZc aˀ^C;;,w<[2*H=G3 2Fj\o];och+FgwB>?nLש *U0JX(nzzt+ G8!8sb0mNɜJu uqP,Fز= v!Jq]<:e1,r92n6R7{/XࠇDϡ7;K95 uYY^ lCBE6IB:fYν y(=4 'f`hN o7Ҡ\Ȏx 41`0\|>; ɖJ8@bt15(((#p]ضbAai' V2^><9] ku^4=8 J\8 dz8.ۡTu0;@{1 _Hk y4[ i0+(DyRN?濣q9D2 w9(*FXҸ꩖JSt* r'pB 0|iz6Ȥ;󾛴J-$/J-ba IPCDqz9IIy~\NɅ<CCضaz% KX9{[HC8:Qض!00syj,؎ Ĺ|ǿ]TkU!EqqLMNggәetV|d\"' #V0L*EY&DSFGCq//-kw 3ˢݶQTxm2y yJb5 F)fpP,R¶m|~/T.<ܼ b{Ü\\@fL&;駮bs{;U&YR[8*X\kcwh(/j+JYW{%ַ9ƏB9M{~Ά=(qĉͫ4)wٓ .Lp)7]>7Uc J|=ͦBUD,{m;˲b w"/z^T38p B(ҩd_/ N \d؉Do~PU(hu^^F^Ź^ffp1 xh5j=ke~=瓓KE#cPJ1;; JL&- 2 ">ѣj!{#{8\kRrLCC'~k|"6w?Q7pq+CV䄐 Gж֯K_,|ܹ7U4[->y'umjullll7 KKxI&&G1Q6 w{eY<&[&JhRB,-foobc= 1H Ľ.JUS'˗/Ah4_G6UK-d &x:T]sgտ%299۷?>#9aQo5c{鰱rFT:6v`19z5Dbdcwѱ1Tks00>>-'3Okˍ[o7C妪-i&dQݽ=I'q'fR(_cNyuYg3)wl3Su,I *.kul~W^a`cs ibdx޹?&Ȱz0055(ُHB/^<$Dٌ`bj`\}xd2*&4 ~?Y/ECab}hlk_{<ώ[ؓ׫:ƙd֖~i8@ Xdo]1YL,{؃%o(:?}n[<''N4/2xcӈȅN.Ik!ص`YMCbiK&BfJ}Վc1>uz6<φy]Rx."5`cG)lǁ\ 6U\mE݄l7th]QX90,nql8 WQP0:`*2,}"6R |+v Ps@1 ydcY0E>5p4zI 0$)ny*Vrb9U\øD2n$IuݡHtq=N&ya´|مaZH&I3./ !,XjC1>,0ò,B01>TdMQzj)bZF1s^gb} !ibzr*&fRd.666y>$=#shbq{D]!VeBtab8~,`?N}vOU::;=ڵC;r(vtou;$!V3qpP5a4 ck{ahZZR$CZpI˲h`FFRryPJq/O\v\0\aby}ܺcG_'.biu3ӓ&L*Gހ:01kosQ.Q,qSlNm\cO~/^is ~3円 g$帑(=we=AOHAgz۪O0_Nm +R,C<;F\Db=^XXP #L٠#M ip#qu8c%{TŢFa%:s9~o}ߋ2rcјĉ(Jgy݁ _xUNjZsvvvQRFrd33>IHGuWSZ31=qJ!&-'p4 @0Mq]"LRbjjt-%GfHijU  8u8}cLcc}_qpy%B--#>N_T1`Z&ͦ!Qm"qas(GAR ũL&q›j-wEZQJ#F0ffa&DBMue,eB1dZ7 "rgN\pEy: J(Yt(pninYIϽfiJPݘ.W2`@X&PlMykB1BʙB%XWH} 0ƐnaQYuΉex 04n{ݔX|&cB! iUD|*R? H&H00 $ JmP߁46iq]x g{\߅0Ens]g+@aZ&<ׅ/ > @8@}.2TiVrE=8R !#h&\^N,V$67C!fgp%II722#_e`Dtۡ\[A$#:5 mSLu+V`]Y}*JwazH L⚘@V1UJ^b18=D&0&&ncP!P>ѱ`i%W@s%  HS1P<8842H0.< ;= !ɡ7 yͼq(J΃G@:苲ACSi(2{ٹ90&1uYgf1#)gΜQQt[cY(^H.k*j9B]F#$|X?^A8 2ȇXDϗTm;7eTJ`|ڎ3P(!|>#F鋦($D\CBLP.WBIڶRc ?O a&KB)ͥ76.AU|Gr2J),pڶa6J2 xmmMHePER#GPp'ӧNaiio(u>7hs(6&P*ZD"#:|?- x r%"Ƕp[XX`9rzRX;d'<豤[^2ݱr?!,~p |_y H&S-Ԧ`BP'݁EKz{ ,C\0MD%8Į(I&*9" #h[—CgF Ȅq&$c Yl^rWf$b /F!Pm!Ø  A&$Ʉu(u<߅ WsΦy\)dA"; &/< hA| Ҵ4 Ps 3 QPgL.(BV&6i,Cj4/I B _ǍA}FյULNN!r`GHSWa]$ڶD"y^L T+pc ƈ6# (S `((hvKA@xvQ̓/ƤO> &`_˂t&# 2ʃ LLNLҊ4y*\.m HX9J uaYX8z$MNryo02qB)СVxj7DTՖWV3fH]1ΠZt=U b*I~;G+<DmC IDAT㋤dH#?twpm8T*/.bk{'d 0҅ "@`?A< -cum sq H&LG͙8S!!խ/~7n]p}3vs ">,H0ףGCu\')X\< xb`Ϙ 31+\ <>2G? \ :K 2 AZ C#ܤ8}2Kli>?{{w=PQH9yW]cTSWΝ ]٭$XS=Ԕ`qB]Rׯ= `}cS8LNlbck;t/Or dFm//ciiE輞ib}ʕ yXֻjW;맞RJ;$2l4z4v~A\/2qRtaYby^q],ۯ M5u$&o&(z/EAh}KDoUfBޑvv=v+SoBbD:40;UL"j;Tuר)CC:H:  ! DRxyGFs$$$>!"ʴH)12"#!k#a6$Ja3x (ca/*L`d :}Hy>RI^]v `@vlx q@VsPPFp/ܧ>Y*0`|bLw  pfFS  *Bj10ܿLąT"U hh'jG=JZ(;jћ\6y3+Mױ!8TϣZ/A2۶h>܍jxq0xr @&>$AX Àa{b* --u$IZ-\<b} }yV!54T@s tha&FQaZtp]7?z23GoXŋ|6 ۶5g)\v 1e4 <ƣ%{Q0We|rŢ&7䭼˳ Gzj^bͼ~)llnb}#t;0f 1FTVEsg6\-\ 藟`ܷ4s`yeB. 簺&%3!fkkor=d2o'{HXH0M~B9Y̶QtG Q1K W՞.zBHdqL r6Xj!C^5nJ=ͷy|!J"<Z[4@2GV8><EA|R14}!fHhO<ҩ$C k$Z 40=5J*6^~ol Tth(DRc^ Ð3Lioo(kUA* IIiؐנvr<::v3^YRGr>F\g{YյhD<LA҉y`?FpC,@Qc:@u[> sp/5hy }DgY'e QSCH?(&i:1\$p#ΉDH86,!kK@B&ɪHei lmS HR?Dq*84 0Et& w8˃ OQ)Ό1|/ciy`>KE}<?zueMo2>#8ЎeWjznn4<̡˒^p!=ЀK;Э>T`!4ccc]>7~QXO(c"]_6 m|Br_BtbTaLLLt5Kib<>>+իxwGvDi1q<ljdelFf%y \;J(ByV07_e\ W.޲cA>i﫤Ѳ,3!x=>/Ò?Ss؈DZ1ѵ5brr [)C2^33x[Qx>L^ 0151;sw{["g"qxDbs\kK&5!tОS?{i,?"9<|>?4ƒ:nD}}-w6{ov$EHQ9Z61Æa!flPHԐxRܺ{Uגob?7{2Й/ߋqs996':񟇚 lllr{J`!jKFy}\h4Ŷ">'b`|l[Μ:r>o%$ X\{˲^7"(/#JՒ|.Ec~$aT'/5Gx:xMS K0>ԾݒIm<֟w#UP Q}2fgg]buv1:821^ێ`?s^qh Aq(u}Qr~&q5 .yDFbRb덾Y~!'|PT$weU%AxGDPBVU>]3}T}k Q1ĺb#crS qn3ZLÂa`,fV,I0ӂI &`B 0dPJvl @]3-ղ,Zwqg~ }neߨ9Qt:Vx#vw9e~'GF{|0 P _gG= %sV [9ǹ<B>=~ZOu15=zn0q$={9ͱCuyt%*>FGG{6˲TՌGz^ӏpM$8tPpA2EM=pk,OB9租C(<1\1|waGLf_L&C7N@\9EВ<}lZsuoö!kXC&'(F(p=Ix!L 08%NeC lnm^7x<peI_)^CF(hȈpMű߿ʀjcGPo4QqomNvH j 7n u˫qqEQNx!|3S=8#>{GF<؈ 5RQ({Di:vB^O%ژ^t1:;?1jQ12RRoOe~ƛ( +E_F9"ebb\|::VoWŀ= ~p9C#7-, xhv=RJ}̈1s x>{46\A2nqrb|b `ԅ9q`;]qr h5.KhxCCqӂb<*,*" xQ`}m͏Y {`r IK.?>K<%!^Z}Ik;)8q|Q]u:] LElp&qe6 #tDO[:ͦ)8FJp҅ssMfٙӾo}Ya_Ҟ{U]psk +YNIfwA@J%J%m!sOr:-=ex0) 񘅒v?/}+(r:J±Nοo9C"z9k#&tߎz.^~>#w=(wa8q<2-*S(7 8k+:N ߱>G7(hG'Z bc|bV眞GR>r$"[َ~j5N#:6Ad{hu]GԤ,KmZ9zrL ïL;zhs>ٳg{DdD=74#Z\}l@&MhlSҪ:nT*̩.*xGp]aRNssTjd \xtlzC}&)9C~h? UH7M533Hg2\1<#{nh}ĖU(fԞ?h@}=T :Acн;6r;naʕ Nz9q2 yH쏎l5Z)+q%-i$U"*|O.zb#5uNcđCTkx+e&QeQTg^s7#Mt{% IDAT~GA8ZTi@9\nd*?gJ)J:"lrcyl33bDB%RI_[W B D;ؓ!#Zko1O2}svzn_}O~X K>d ZXLcuI)2}9n뱱10::ʵDNN~}Z-*v.fΪJڧBT.8#ɨd*7T:""0,7a0^[wSx]?cX:p©7a;| _~saEwp }%1~ :x~NMMZ!E ܓ獜`tn;zpa&'q} +뺈y~XWo,A c>7Μ>׮#I2 \ytBxL0vѾϛoZmLkIwßۄWpCV,\6d*t:H3'L3uLб\:?|R :c=_s1>ZT&0|y|1ˀ纘­;w3{_Ù0 \B"4}NҐ3 BVKl1M;t>Plw۽=/? j_\\͉ T*ӡI9(5hnb%B>hl=L>f<_lXTְ{$Oá/1p9~ Aڳ"^O|=j4WDA➔-/<;Ul||*zq`m}/- FG[F:¡94\XǾ|SbjqzyϞNe5nkL{_X PjOiRreYj`m n d,b!&uJJv`ʃ01gOq PwT|Fo wKfsY4- u0z)TljNcͧ"~HbE&fHZ)05=|*,듀4XEV3EEwlGЮ[c)z.'MCR6Ϙ &ו3L30`YDPGRO#N-虸V ,Y2cawm h4NC<i;dWTJBz TR<@AVG*}*56:z! RIn^feY/~gD. ZDQ\01> jJ"vww˦Q7xcQi/ \+E Ɇz)/Eh*ǐV5T*x9s$\KMOcm}C͇DlB?/_>ܗF(pOxŋX(ZV i3ꗀw̠^ ܊#GDvj<]Qpǚf9HHGby8;TDvj`>1D1E"6е]D,G! IndRW`1ܿϝNn ۶8]`54Zm"=''l&)c=[nڵZ]8t`7^&8iw;0 .F 70>60?7x vj wo HోgL$qt]\(^ycvL: ڍ,bh.4{G[~Oͷ7R fc1})8^*s*$>?|JFu\b)iq8u0UyԓQ"LQ4x_Ǐ/bwgljz3%F}6[0>>>؎Fy~{?y\vRt^>qܿ'xB1y~@UweAI8ʓɢ~sf}<@X,&0B7{ lDQ W뢣{?lNA?,O@i_HF?5_"z?z = nk)Q\>ϻqΐ1opaRN'p*,D</.bss nt xO |fBkzjK7Q` =  9NO!N!(CB&Q.WBrTpci/s0E؇sC{NT iݮNC}`bbrErmeYu:>;zdߝ"ځퟺfQmP=ȁ¦{"'AJ!uGB0 M ㏀D)tFd BwxÇ^q-ĹѨQOt|p-)K=v,  JLN:<yk HgڢkS. stm0;".<XoX?P @D[S,_ΎMDpes( pLi0ȸRt*xD̲l6yQpv;D=nWuq{N6E:S'rS3"a||u"E/?J(ʨ{h4%&fgPF]Q.S~vl&;E:]m<@Q璬 ǡ9TU\x!w uvDڏ0~AؤR)ضX,FGl6t&Μ:rX Nm\vԣȤShZJcMFC6rǶՊaTjbmm]?WDdN)2MSr/j6[eH!vO_hH5^_G{#US=Śse^O,ۻ`x2ٳh4* \+YS 6 ?=3T+Gt'Q K :j0NĶ0"+Wz>&4M0E&\-\ڤPƟ/Ɂz?ϫM^ Q) ƒ^(dP,8FWCZD'ĴBFLII^߇$GX?@X S4#>=RiT5]D<eˊgFm@6Fh}Ru=%It]J8v͆t!.w Al6tWyOLNK3snxKl0ѱt.*ڝ.j&iZm$]:o}\8;ح_xW̓o~+?Ӌ{,XfmwP+Zj|]=Ilj]/"nHIQ=sF a=I(h1@<4!4tf3=yGիSOSx'bҶm `XTBGP%` t T v/ N JX[ 2J|>=JJR*zrbf G簴r;;TA^WpDž|n3Sav;H|C< ->'OήDrbc#)@ QL*"SA .4|I8a!"N'~^PD;8Y&'#RYDV|MPH(4'iu7ȏEAA0̛-K"' C1ޝJ4db}#6]p0|tB0aFdbT4jDu!Du,&PEIJv{TVPl`B=0lJ+ : b&VخDiS 1JFt` Z~Y0\.y.2^lUhr }1 ±mJ%ܹ{AtQ,q]P08G)b1 V ngΜc*VCulGJ.:.:.Y^Q.jd\.wT[=r;IM6S'Ž`4p͆oIk˲yFYǁK K1:d'WԪ:()2 l4sb K=LiL+FU FBF8 8anfG;;H$f2(s>` Bn#bW= $e:PKNi#l¶md2Ŵ[]S i.CWuGt* ,..q\r=:%c 4.T*X,Ηb!-8i/2_+}m=z.2nmm ?2)Gì{FJ)=cn4&Iy| W^ns3j8j\L'f7Wo)acp֭@ǟpp=FK{\ց J 0+&])?H>c/mu=H듀O[<"xW#jYd`R-ؕC>mO>{Gڭ(m$ϣX8v,R6` pZA㶯|Y;(o+.g\,xk{;xMQ-N*Csq܎|Qp&nhZvHJ|xX@޽ 'Wc)Wz.,:8c,NԂ T5ضO<]xϞ5=}vVa๧?X(zJE%|QyjQ+^0!c0xhgg7jJET*U T(A׋q:5ղ,VRy_g]8T*it@S˱}qse\ۮ{:S]?tJ#>exU;jLFåG<:n.,HP &G c.OO4- 25~cD,,Qd ?s[mI:V>.; +jioQY!Y_Wq~WE<<)*AE1(24n߾qola\hz ˋn0vJ!a1,3\nd׮Et}:fQw* tLB("g5Q7TŸ1=BAPVYĤп0M;HPUj5q9lll Y+*ahTBQ D<.:5 o#ul6n_$EMu9qB$Z-lO:@4 rE޽c͙ӢlCzblR$ڭѺL`?xٯ.=< / " ?#}|؃=ccctJX\\R `9.}?}Mӈ㨔waÌc }꜠a2r@pGW~35ziD$f.E&FFFf11>z[e3h4xh*!N&Pp `[ۼC$9 /űGrs(ơx ҒV"4&[L$xx \!> =a1?ze / H&3`xY|t#m Kpo}wD(󘛚D!-~&87nݾ ǰzN_G573v]5V"*ժFG}dF_f* #mjd@ ¿gfOz5"GzkU6?Q-S'Ok}wZ د}c|4 {"0 =44ZA~~AKSD2'ciyV /ĸOͪ殱_ǩx!nDoyx#:~`Eu0 UΞ IDAT!|nwONtCv&@)t;[D2'EBI\"?gLDa` ނI,1j6!MA10',=ׅI\ۆr 4 ]2`X,m0OR]Dg/t"kҙ?𩬸XY ZfN-FuZ&K.BM><>i033éx/Y`-S%h4L *ym_\P ɽW5,rk򜌲_$ k\|NKT:Vnt!΅{r?Њ#~, O=${HtNg@Z-Nu)|p ^{eͷȅ|b}c3PLONpPT+GF~'?4iSy{D4?BX\Lm%Ǐ TL![+I$'[r3l>ra;)gGGGP8(u]J)E*_$Yd@Ӥ_+n?yg}~?b13ω[Fq}֏Oo 019XA( i.dd-gBኼ ҨX,*a*aFŐH&1&''Q#ăi$/?>XҥK~iMK1>VBF@Ez"n*x:ymww֝tvzw[.#N6d2f9~? mLuݎz'OS'rSmcc<B!V )A|.YJ1?7Y+d1ܞ;^~W^Ğ-(hTqj IWx#}Ƒ75(}t 6 ";`aC%AeړE_ݲJvDq Î>̢~s<^iwzG^~J& 'kF]pu9H=ܞ?w}kBL@68`?Kc}cV 7Wo)z-?l q\xm$I wvDwf h h[*pU~uivYo~L$U_|7Woabb"sǟlBDLIX,\ PBJ}z)T5a4m4 "y?\+…z;ӔmlR$u)P=> Q1gX$Y."DJGy:k L4 &T7yovvvF%`jjo, *4 w]GGrc|$RT}pn/__9+=3PV3-'&4>fC<9@8S{11jTGz&NWd]=@CtIQAWlW*??8#R):u[#\(7>,OԱ׃+.jAI\l\CPɸO|w:km.8fff{ZK"2mx=H~1`w;%z\Rǟ' xV}'N i_[$%l=|I=0]ap@K0NNM5Dc簱 ӲPT199Vr 5$I4u|x:NX8#:Qa`b\@up(vv+zv GQo4jw㏂RQnCY(ʦ94]u1?zsss(+xWpcy^< tmv3حT.&ǰ]0?;\6ZfېD$D‘9w[?븊>!ٺ.wɄrzoC 8J۵mt:5SɸJ*=A5_?z쑄 D< ő`vW糟4߸cf]e؞"=swn0j,˟c6 za>Ig8\In= "Vݷ#rER>uq|qab$߾V,B4<||>pci)'s@>+3a۶z:^gp 5bgϜ tLOOh,>=E.R22_KX?Z^W:Naʼp|>|n7@y92;3-Ͽ|>ۖen(LN]W4GZԻC$XGx τF]tmKRNTz+(:*?'6+t{hjinP!oa-(ηHda fRusY[-POܝss33)U lwG*r?b//-R Ѐt=~WrdL i`mm]G͋$=ãq,5 wL&p]Gmf7klx<Ņ}J@I p@| j %:yL# mYkr24Vn (l;%5 \MWKK\amcTy±ZVZ'\8-xajb+7o`vj2._y{~-u|+\6vo}o>FKEY4M|/r>u[yT*auaCnld=X,-ND\Q\{]itcweG am cxgpmD"W4bTׯxQ޹PLԨ%Aa&&\ǐU0Z>!  63 .=^|Q;4PWwwv6~cjz/NʇW{;uHNWAF 㾭`7o*_@F}FВZ)9G xi N5OQܼkB AwK0N-8 &G8ɮ UI.x2q X({PHR2!B@V1&}sr;-H}InELJcth@x1{:Au &.1 Wk'!_+PTqM*af^<c>Օ'rT0nH3i<ʠvp$-{PAقmRuQ,9K8q|;LMM$>#xKXu@"Ą!xp_16]v`0^a:v@DRZYZN9dCK=7ɦ g拪Ejr]0d1..R4fgQ.W6 9LwјqHJTeG33qn S2sS~rZYX!pzx \]haQ:"46rlZ~RqAHKh]XXA8vr @Š1(yt ] !k( %r]_k=;cO@;ȡ6x9snw R"≱ՕxDc&TWֆOEEG GvD%c8tn 4j;xǗ.<ʟVy.=.%Ec<-19}d fT '07WnH&K++@oR,vbqH&NhёTkul!Ij1>6x4㉄px۶>6Nw@vskKLݛ#6'Iz28]ܷ=,VWWEè؄[wS"ؿ)kn;I?pQ"3yS9GT$iYRT%xa:>袷`WC:H $kOC( tN2Eyw=σ~璩\Q$ff2it:]$IXzj3_7If"ۃhpw!&ʬj| i8N؎R4b2EqŻ74! "&AԴH?*Z.~3̣H|94Mz"T2 sBs&(s_܎3fhX^Ls,zdgNhm>zzJR0AE@z(#JX,R gA @,nqCc#})4#LRwpD)ؠj-((UTHi!!Iql;|=9D2fͻ/Ļ/LNVox<TrU\8wZ wC*铦&T|cJgId3PCV7$|T=c#%4[-OL`Z"ڝ.1`k_}s|QGx/a7S0ˡn ϫV '+WLc|hX IAƻkl4Mx~w9YTUtDa5x.?0ƻ$lfB=s@.={\[|Q][t!Bt]WYU(DP3jwqq=,4Ayp{#}w mӲzHe|w&N-AIX;8}f c-~2T [lM4= C"_us!UpHw>F tk̠&Zҏ0ĹX:5Ju|1M-(oZJ͕| ;Y:];1 LTgbjvU 0rx\U$ nksRc#JX,`̟cFZ\8B X1 s3$FFDUK+fn_[4vvwq9ܹg~[p]2qqm3XUޕkʵ%[wzϜğ}/1>Z&~㗾(D܂zDžp ywGKE\<t;\}|f J<xSG݂a1 rzS)po~Js223$<ѣ >iFimm]ȕj yHStAllnKb8*vva?XxajrKԶqlnnߢ p?j4T(t (0λ<ٛGޛZ]a>^zn6ݜII-REA(JVJ!@#@` 1@H' щ(ĉm(N=UWwUo2b^7t|p1M'8Lѓ&%166bvE8 9y1~ϨXeTDO㗾Eٷ\.|[ *cL&{ƍj@XL9x?ܾ#}cqd2.Nò,0M%L2YƳ0?m.-ar4 ?c\Q]oۘ>簳_zDs \e>'<1G4j2"8J²/3@w0DD*Ū> &ggP7гCfɤpttw Qqq||96Օe? !dBRq\l/T6[Q%*xs_>ki{ 1:#3pUC6掫#~0pOf ?FH` }Թ=jyn޾jGvq6 N `ww0hٕRFLFv֩urbGG(CZ_gvrBc:;3=Te)D)ƹ)W ݿG\o޷XR z-x?>>c' ]Y^Ff`VY̼QkLDۓ>({Vf#krqs mQN{ψ6*n?5B/l vw)8a1M 5֟>V~ήOb w?k I]">1WoCWlD\DzMHЦ1 dP7`S[)m& .e) 4|"4mD~u>H"PU|333?"61P,QAh (o_ xP2E=ݴh a*L5*](e@b`zjrP'RgJр݈K8ef)l6ӺO"[i~ZaI!G%}L}Bjʯ+c7ޥwcc?CJN#gpC-u0HB*"ҩgs<:\Rt(ER_|Wh{Zk93r&|YOٶm?w@3kk)_P*l6K73?8DŽ w"l8g}yiyrk41 &/^nECXD݆NξYSו/<~Q2`_T~w96 hO -SuN**v 666σ}kkĹL67c=04_:;T*}tCskEo'q -q϶q6Bnϙu#穌1b=_xJ'E,౲m }[XիWBS&Ϯ\yf۶=0xxb)̙Ai/Ð/6|sL&[;2>D6A2D7,柫vvEŃ`Y>z b0M z)q eM2b r^◾9:!X[Ye@X[]^\DTN3k+vlNOʌsqyxPq0c<3SR!r$E=zL&-+t@=\x^ғ] _kz,q411J(nciqS`3nH~QBi`ʋ}2 ŷQ " %!=91 q=*G>cPON8gP{PR$W+nNxH T$2tОg>PvrrD̙˗.?+o^ 1>ٳX,lnms輥`?WO=I?iS%׾<^㒆ʶm,!hZO( =PK~R\>R^GluzFQbw=$I%\tϬ4M7?=>>qF٧wm8>> 4KL&Ri?a%;''ibnnM9_$ŹŜs' ZUC:DfffBXegpͅ>YPc z'nSl1>̦{Q6O(yQI$9>zekƠ=<zbaVn@Y=TK#rOuvu]ض c(4zhR$^ {M&6>V|Mcֵl~֞#% J]dYw*Olp-$xp0X O J(v7r1ą R v Ɔ3Cf9B,S}5BEU鵼hcCT8CtP/`uxt90H( E`6+xvg2{1>";r|Y_m>0t޻4|RJiI{nQE.P\ ~Ah4¨v$J(:Hy9Ȝ;?O ks A ^+C$@Xdr)c z`p'N囌-Նa&h?j+=41;NJŴCcwC8 %'1K a`!!_G \ߌ7,'C"PZ`k"ƂatKOD(|Rv% idp%)]BV þɤenCހmV_(@|ZH`b#ڛ_yRDbtz9D;zF|<PYE\bNv3h5( PYAӣ}%7n\ֶy}pCp{xt|;9퐺VO9&?O#mpp{'LȂ'* 4ZPU$AG)*9ݻe4:In jm y9IaCaۆ9(޾P\yw Νz'|,//66B'}__QmWq3P/\Nl6˨9,ϣv,%Y,`Y6UmyDq*+]u<59viC"Lu-b:.2 2ʥfgp}F u24vvv1>6bz},.̣^oSgpbIk+jL R\6w ҙF+L&155)ZQC$ A!_@^빒jqFE ߳L4q{>6bZ_?Qf9nXRJ}7xM9d9SSPq*aN\դ}}@х-~ McG/BD!05*+I}8BA:%S\D{x=ecwCqۡG>Nڄaqũ/`{{!hAq 2b֐3'pH~$xJxa… 8p<"pxxɠ*`"4Ԫ~O;w1L<{b< $,+FU=8氳3ȠڼInM󏍍롩qn//1>>וZ]"Wog?{kd@H&W+L|hmh9rlGLJttoiu=l.v`$e߲X%I>'Q%rq&@ǜ19j.߱⿔!ÚHꪣ[-* :˶%&VWppx y2y0=6Oto;!7kxx V[ڛj t ,Dv=sg.>ބ88 :<H*!0pen?8 tbh"'8UUg4G(>C8WVVPUJ3``?g {>=iݻk+˗.AΈnT] OF@HatO"(J̨ꨨ=H1ߏ_Y]bήOq83wDU轫t+gk\* 75077#}{ss$F/וR ~qS"p\tݰj/mmM1:2:H&C^wSd2q<ܒe1Mnue>M d2 Fບ8دy |zyL&|nWvx& ڥimLwm Ʉ  =ͭH'@>8T9S`܈I"I1IiaZgPVgp{RQ}eue9ʲі<Ɏn/ .Rr(|#MڜD)\` Tl7+ JL$d$ 0DЃsK]"h|D ?Li0PυL|h0%cB)^S)4NpD5̥;'9Jq99?߻p?Y?j/ZH(UMF7=m;Tg̶P9/^ajۑ][QԼ5JaJI%އ#ŋ>j(8d>]i i JC<'-}}~zAvIr/lu676& ESKf/u]Y!:33#"CxCAd?$&P !2 7qC$X!ШL$՝U2)e|Օ sOCA@AYЁQ 2;#|w@t&Յ,rʇs=)`%pb*g|De&*?|Fs1aW, nG:sKX,7) syX-+S=C*Fkx4֦[ds6RR ׮\ƇwW^{7oB5* Ð]IE3*gb~9N8.6RT6iCG4aۖd 6:QUϓ¡2HR%JilB5>; Z e3&2T$1_u\EM o/o˟}7puT<_\ZkJn`D]VuEnRUυ]vۏ ,̧@J 3z Hzi@tppxNqz'v~$As t{V8sd!@W !4p("-fp,GqyUp/M#s xu ؿM$-@ʽ f3m"""Hz AyqNjOL+DmcvfN7uLg.wP*@ BJYd ӄc[x@R_֖b7\˃YjѡƐ|~ {(IׯEs|ΠJ__$_qmMrgΠz|EJ6zwwWv\H3iplssh0 C^&XriYLNW%~]#*#Ѝ+ p%(t_I#܋18th1Fo A_ O6LK~;)=BoXܹ zQF3fĉD1';pst㆟ L"yF&v9s挮#1 {#,cRp$&tvqEYuW):dB;< chWT_Pb?gA;>ܽw/>`S6p…8T(>.\8:N؝]"^#ʡ: /t[H3p9D&AXi²,$Si|c/s(BGǜ/;I²-T5$ %Q|x\wccp]ӟ|> 7+ Q"mލB DbZ(X[]AՂip]]j 2JP*x=q,/ݻpzٳĸbZWe},/yCqؼ@135m:X4s:E5uP0GUKxYV н*gm9خ8 ~xd2ittg(ڪV{ {qܿw/N )ԢϋdzXDՊL0:d)_4 m`oQdU#DaEy뭷A bK1ǰ=׋et%~r9}FC 5 ~+p:veJ%dYudjggӌÓ=s\.ccrY̠V#HnA˲Q,-Apw]+W( #V"Gu7KE R)F9?7'dd*t]\tGXZ\DL& E;J0)^8f-şth 28]\힝 8Ђh]XUG$-F@˩7pvđDui4;4:ݞD[[H&S?8` ѓPt|-W{l)S0MĎ.hfUQ)@+z >`AyW& ˡhH?D2AxeIUׁ@PtPwEa,KR0gϰBvww@ +*h6ULhw| 4:O"z]W;' 1AB4Ri༢S=gTB7xF "~.pNFdcP}Vdd2VA"AxfgP7Yp\N\.*{*&&&DZ8?bWʴqҩ$&0a.mnnr 7ӵZ@@](4zJ8'U.L$t]X~/FwP-ܿ_CV5VUtľ*yIO%:)X) |vCPՋ85"mn8)!>L90\0TÛ"`0 }0NJC}Z$jMkz LQ05^=?1?˗ N8Nt8Kz}H/Flr&8~FP0pF-:4qP͏!Gܦ-*8!(ӣO{$I| b ! lB@ 8͵уK7nh[oAw`cyi gb,1R*eŐm8077jt&~KpGϡjnoYr34u11>ߒ,T.qWfm,I5!>7j߲=&]}?[pS0M[;XZl=(ʱd2vB \8ww߇yxy8 u8H2&Icq~5h& s9x/<[[?` R͵Z-L1=@úAl+Kժ#b=Cǻ9l, U2 /Q-'/~A)!s@tpJ 'Uc-I>"% &#&!9elV4NGs{RgnZIvR2{Obzjߺ:ϙUTk5IR x^|;LOǢX,l6=OW qGB]waʕ+LITJJ@3c8iJD9o|w݇mYmgoit>ccor9z=t=4\pTI _ ,v)Eu9TeLOJc]qkT9fXrZ9v0=5_!{mvReJuIJ} Oqo!ʮF1_TѿE;zdꜟGcADG:kA(;3zAZ[5"Jr(jo  $0=1l4QFgNVAS(\\\.@!ց,idY *C.jHxw}؄WDoA 20jHH'5S|ciA2)h;e{(\ϓBd" *.;1 8RtHʻyG):АPc0GE HNLLp<8 Œt 4<"2;U֯򄿚E"z>R6t {on"Lɽ`RBD>ETBP8h688&0guK۶/*n}AK ğfS!c2Gt*%zr} ̓@^#.F:{v]4yP!ZˎpW1iJ'SLGGGVg199RVo&5'0M\鵫Wldd]TFlY^96P(sz*p!"_Vzbsmm?dr(/ˣ%ѣOI4psqPsq.Jz41iԪW?"cW,#RErD=#x^,`fc(ʅU&''Y"+fBM&xc Zg"HW^ՏxDž|Wן424r 1$R0UQ4hwzHR0x㵏__۱11>O~c?7Yec?oד1zN\. qQ.aY.ْ:>VbNwsx[0M]' `vf{sjrGGeR*ƭP(l)pMr>9/+Hm\n$P!֌z({rZHzii)\Q٠muuou]|ǟN|`_|Wڈ݋Թ0!EplGw;qL&^k1(Ln|w=nrpEw}}^ gϮkEsss؉9lgױg  Z3vh6zFfHJAQUP077}Rq}}w#W^(j믭ހ`&n6پIb5ʥj:RKPkUtJ07;IlZObrjMm7a;E˩x^=L&QTb<3zdĮ߸cuu<]VA)bd,TNV*4(l yX%uhv\63z@k QusYy(gh<;MRD;'d!񹩩I^eHzǶ/D|@Tw:"b3l*6Q4WPFd2'MS=|3 3$H]<`U'cߑA=d2 w1jQA] 33P,..>mr?F-CP+cc,E)RRqM(b2*[ժ:!s8<Јc8H$( 2Va%AQO@60$~a.Gģ<v= ;wi\]gRuSv-s t_"Ǹr/ds.R S6B.Jyy ={A׃ /_޻bV#ڧ#9ɻPT*qw;PxGb8qrgqmE?7#+ʓGWOV*؊~U9689Ok3Z4ҠX6R)ȓƚ>gG Q2gϮGUF=a ܽ݃n&,  d";t<>s+K8:$HVdI)jǛ[8qHX_[ct9qʉ).sG6KTP2I?2\Oqqwea`\*!ɀR. !#^}egգSh4H&S=VWE];\[[]B'^}lmz.St^IXloZBGG'%{s6G6t>DEZHw laQl^:6p<#߄&\Q>9UVwܹ}* 7d4j4BD(G_#g<؃Tn| FP/~ s ~W?NuW\;RC]7! _~ ~WZ1Zzjwc|vj՟N,] G݆eY0MC'\N jT:O|Uܹwf#۝^zEll?zKxu rR)Tk56@uf;EQWwNE'WKsq}>$U`>=u^N^ JtBz0nT*ϣcEtDC%/*ʕ2zD>a2|Gƈ=P$*ģFtBdSJ)x7?B/B bC2uz& 7~Dڕ/,.QG;<DO*!"bXq  xP_B]n1!dsCUq"gU['J5?!TvnĄh#J"} ΟCӁiҝ@n1U\pܦǶ`r{KtW; NKᗿEܾ}d7T*iJ<: rq^`(T_2;%\t1YQ{ Ð ⳹\o@V6 0{ۻD*nBUAzo-|@ ai֢3Cyb# H$58{'=Tq__Ƈo>!; V‰a wvvÉ cADIQ.袆q(\o1!xc(}Kh4553H&=RGDu ~T/n+_p֭(ga a"b|RAEVzvxKX&'ƐhXa7å y.jfxq] xL۷LӨjX^Z@:-x SY5 ֊mnK6;t~SX|-ф… *Yܿ_qz D=,/."ϣh`jr'Km"0Λ{:I>=1Q2.q4-W~ bȊ1B*HcY^yFR ńC Ӱ4{76VA$ffflmYƇN bT,$Ap9 H$H&p]2X<5oʤxX@XLBT+b!2ƍvAE;I0Zò{2ٌ׬P.sTh́V;%Q*W:פ-[5%}OO $[  3l IDATBcµ]O憾` 5lpJ*SLb'Li:p L&t<O&X[I3Vp{8^t| [n'J ZnG:4/YfT9E:}w)% !^s 2b)׵c.h" 휈5CӼ#th7yF `Yމa(8NMRyz^}?OS`|,cY4on"Nc@6mY k:oTr0 \:67 T0 |9LCSL@^׋C2|x^rB=j6ywwG ?6TEmۂJY%Vױa[ cNG/s~_^=.&!x\hkDmgs o:j573]4Lie$~z8Z_w !({F'=b${;;چ xx<䷤nYڝ.NiZ0oL$S0L388m WT רޭ6y/!^D&vb5kTjT <Z1BGC*$zh +LS[HNIT>0Xœ%I i@4P#Z7j (E|XDQBq"LqlNű5 |"rP>zݞL6u1*4[ PsyvmB8CCPP!iuKpaJh~k]XР<NgsyV_tA$Єx:@2ajOy>l$D#$ PDѪvȨ^@d `KԶmǞ;pBN[2-,0njj N fDLFBX4*J>:Qur,24Ҩ=1w>bo_ҁbU:@[-N>O{GeL.ϣhhzG&9233fp]s6WmJJ<# yÔѰx 9磩#Vg:`~N@R2ffqW}` ͍础 n#êG<**<=e\KhI;7HXZuN`mTͭm%IZXrēS3^ɹrDVP,*yulmmG"+xx+I3gB-q~7;z[-pzu_tSt~9A MS&yBTD zv&@ t0nVAHfX?t*C64)Jkێ. A"=K X[AYUk$4ZIr sRWy.2]nc5N=$ 8L.tx(w{} [۸EP@G'±m PLM`skc_F<(EJ~#xVWQyhH]^@#r͆@D"J"k9BՈptNlnn!4a5c$"{ ~΄;a 0#N(vԽ\$]̄imu9~zOŋv_# %1譾Eu Tb4OkVnbV4Z#V;gb~"[=U>eK{H(dNnt t |GXY^o_ocfzZ1 0%5/< l6aX%;Tq\s191>GL*GM$2,\1i/w{=T*e;]ach("iéS{fN59(@N4!Qqݙt:ECH./|<쳰>&.۱yT oelL'@F}D5P((K w? UBP,[މaYZ)!8̧r=n#~u.ƉU"MkBP="IYɶmSQKTmw H P 0#^K$j +uGTsZ^Y͛P(oY|h$!lhw;CQy)U|uDnP FOB:&q4/6Rk WA}?D<=;oYcmz@L`}}Zߏaj)?NϤS,+ 8>NdmcqaFVFL:keP/JJt/( vuffZj_!t⋯&8%md2}iưr }NG|^Pk#W4.$gFT*u$)M3fSQ~:_WcIuJE-k9[1AUGE?6HU+PCĸR4ec|D%KKKv*p waw๻ݮO$#-Q*} T?1U /X0(… L 4`N:vӟ߿>*2u>cڊ?fS&S=>@ge5|0i$|WHTX'nX5|MqED;㼽7n`) C2pP*pV2sHS-٪L&[|Cx>bsNvq˲177cvc|o0[? Ài V MC*<\WV_}8%ˠl*@.{?D߲fYrX\X@F:J")X?V)w*vV=\M0 @b/GIV!^K?,kv#x "g'9FQw"VmԒϰw+iO<8grxF˃r>!:Ι5Tqd j᭷a,D/n ZNuA7J`Ο$Q/} cZpDЊDR =2>~7jt@ aS"{k"BXr\SiĞ8'^ÃUPa0?*+虛ǫ?0nBE߲K.VWtQo4Q.pD2Թ;Vao4 |:on2.jlk0ɉ nqw>66E~ո(xׂ[^Ȉm= kHx]4- # cT,!s te"bmQtS$U >_sbbBɈ!x+]MNN"N#bt[ʒm{gcK Jv3P=C۶A =U8 ˗xw :-qڢk30sy"A ,6Ea@BF h9X};eJO>FʁAE N!NBt9PL``h͍ckk3IPS!Ud7ʋ 9Ht Hj@`J411võ\cGׅ VJ|OMG0WFRBET9"si4qTRfv.7GL!ZySã#/vq011hۨf r9xr0 Թ|ȴ6?~l |Sĭ>{$.V)\ "%=ǡEi~z?{% zUTE$JqpV`Z0>lר64t{R o }M8r-J#Q+M{׃;[<77=1 #ǧr\G.i"+_Ua6AN\ r&uIMDs6pt+(3gvP-/3Dd2H\l9P4_v{{{Z'IL:(.想H tP5 HH;Y/+4H:{/UU[:4fF 8A/ Ѷ~HÂl˻p8la;lI A 3L6]U]{UfV޻qw[2_V(LuVz2(O>I]y~d?s}p, #J=u^mΝN|˵ܼq#t_J+ ƳfS6'nܸR$6X܊b8<,atdD>@t/zo2w022n=eS_4?gWVhRx·:i@{X/3cokk We҅~2R87qU.&9jf=MNLep  [N5 Kx"9ɿG[=W jBfO8O{-}Z\~gi@♙w5vE,' 9hHׄv=[|'+D}폾t8hsfS (K\ovw8>~ SH&t:2 NmbA 9PO~#d3)$̸+t##tq059 Pwv02_قmg7`Ф `llT߿dX><q|//~uvHޫ7{d^9r=Ey LbhhH苹Ne0Rwh B{2 UI i;f}M 4I qO`A5)؎łs6W۔p,V*gA{ط:u((]Jl`~~ǖ" TT_׭P 6J2-i DcQEҀ+=pFGR+ +Q MG QءJ+yk]2\jGQ~.Z71} vNo?c8p,K4Jrz Vz ZUuF<0G,Õ˗tdq\zm%&p'mr2a٬k+w=#ζ~({i4X]]Z4"SRǃyzчoyf#Q0MERq|>/'bu_ IDATB鴼 ^j'@bltGr`lV\kiwǶ4%Rpd0T, RqfFecPOj"Ȗt9AnCCCR-w<=SW3K/o:>|KR7ɱxOȮyɬ ;&ҟ@nܸ}eu=U œHR~$ \Wa!+B&Gq9lnmctr{lȬVE9.ӄH2PQm lmЭj1 lt,\\>kLQeqլU=HX]]C0f)N,̣T>rŐy@>cCf@ t,D\G: h:*pToaw+162GkE6Fސܶ͞5ɌDN Rsm1SV21](HR}USP333b)gA/ 49uU9iۉϽ*{ s<#p`hhF6Q"wcw5lw0 ^$P)Lq% ?7@X0lJ'tLb!+>G\<3Q]>:B<`j58XRv @DFXT`mXvGyvJXPq%PڇmP`n t:RE)2e!|(*qJ} v4` ԍ}y Towc9>gu|GVuYa @:wB&xj@gS}J=K PRUH(u+4vF' Gf~?wuŢR虺{6(u9\/˞(?;h@J'8=Y sMՎھ^ED݊'uTWc'(1E{;FGGC?t- o4QrSsV Kڅhy@{¼ЫoĽ 1ЮVa'zMӃ7!JC9 ƌ8]7p~ƭh:+2q7~;k{qjsI D`3,b4pc{*X:ԵGpyzxݽ0ۗ^zfL/8bԇ:@sP:"e<+Q(Ç!=*AT< ^zM\-UV./|VW3iOtJK&xR7 3⓶Kk_TJ퓁C PLMMሗtGaq.okDG5TPb/DsJih֠6Q-&''QS84$8l,)FZ*ouͭl3`uxu8t [[0M#øO:0}}̢h K簻w[ajanv{~|.*H(!5\+(]TCo{Wt$gP26V(kLҼbli <ɋW:,ʕ#8)ܿ# CWQ5WNYnVhϞ=}^Z XG!l 3j{3JghϜqGtހl#T)Yb|Z/JqEyfJ0I Ul44dE80k`e!@ܽwϵ?=4SB/`wgGR9 ~R7?2S_CEׯ 蝽 Ѓ'0@H_- (~w =LnTuoֵkɊcFz *BpeK/bmq7?Pi6  .IP)\v~n@n޼'rPDMiTͭm&8J} ss^*nwW_ƇAZYvi²m$qtd֗~ w=aGwqSIT*G $s(rrz'O`{\\jSqbœ&^i'(24\< EVt:&. C/aGvDf;JujL)o:>zqjD\Tǥ TXD^a{4?u0;h;js>yR3>??r1t>VXKAW㌛Eښ,քeųE!(ʪ&^+&&+%;_48axhrXu$ F*=Nd) h4?/B:6@ۡ?Cl&f +pE4-J%jp \,09J&}J悖R dYY291 4`1I&H&Rl5gRAĜT&3A.²:j#DV}:V $8mjql{畢S(YP첐sǿԪ{VE0@a2I&͸ՠjF|MՀfV!ܑcfqc'FMAX]сB {XgNpC!3 "WDן!9Rf4 }u|C^;f*22nzC,IŢ2c-n[硈!t_c[A8>ZͶQ{Tʐ0ݿe10UHv.|%"{ mg:]̀&H@"fȁH@i \mp\ȆAsAu|F /bU㋊+yJ%nlꯍM,-.b+++K"Pvxx˶4 5\,%=}f :TK \@P tQ6L59٧َbOo6߿+3W$j5 NJO VǒvSTWda^wZS?=>;'~󅯪H~ 8Z LS3@?yV^^m xǓz=E<\.Hcfkk~G>k$' P `'5jo3];33,ӧ}o<^Oպey<@}TT*%W˜z!Zah4CmOhg~W?>׃N Zmh;n8o=Vה+vPNZ=6NXޢ<ꍆ"|Okocڳ-׾ ZP(qlLNR9]P9y ,8H$:mJeQ>21S>[A}/ː`a̜L"7G~|˲a./޻GhX>;;[o浽q=X+P֌FV "1X`1BV}n( ]lOx!AU`os/2(JPĀZ}V0 ȊQֲlnΧ/̗pp}8PvrK&ӈui|p!Aqrb XO۲, *%<>aE5=okq0\,bjrSxBEH`}ř*A3 BAPD2B2[-NXǓm>@,Hv(0?;]8J2FP7qxx1ժH%Vѝ8{z {{h( qpxf<73RIRrgmQ}ժ888ȀD.c3{<Ait!hlI𭯯Z CN:t@y_(pV>@%y*O$L!F*~WuLP֞--8E_ [=Ã$ 8VAN7#|LwիshȠKՀғ^ۻyLT{ڙD^Be T NJ44&tdvI(ϦE\Bnճy|V#Ü LYcB@p5lraq|.Gj@1 8܏V} Q*UwQ>d2)}տf8}zIj1Fa`SSZL^>]fGz?%Q* xK/G}NpLS Q%4Ǔ$?)GkNvz?7BB0 k=sw<m<7P7t=3=/o}Ǚ=QϧFNn=[X[Z:iLZU T?+:88xF}m.^oMuFȺL&C*S ~.,U}۷?)N66p}9}wΟg38yKf놬 go?ïK_=,O,w{t"~ޣ>RXtRkP|pj+qbhgk0R!`zj Dwvéœx25@^R#fA+JxV|B>C?7(;ix酛o1 lZa8J)1 Ndz:6OcNoq j5Fna7@f".{JI虣OATmT_{o|3x[{] Lδr_Or9TU_?XVG+AcZcP|5{hH$pziGi JYڟP(X/Dt"=1TJ;Ha2TO-CW0( #;X@>qiml%Zh;y=A ˔RӄmYtNBCK$uu6/-/["ui3LHsS\0 K4z(Yq]ɢ}w%w s VW<|O!dA\aK;,-YƟ\~ѮL$!2yoA<ZgT-n&-BǙڎRv855 [or۸q&D3f2B*T{.~0bwwO**}Yqos 7_Mfv5(Ъ KeZfqj|>SdFRzMJ˗wE&D].AZ/}-{Ka*'es#EDžH,uضt:[^Mks,+?>-B T]] IDAT P`T d?U=oo* 8@,KjUk%!2@xpl6[0Mz\(( ȭDBBP،S^0oX' Z6,8166m؎˲W"4-%'k?tFil`~v9nru@@qpx9f&G2D24:dViI\(gNPUel^[[P) gWLztdZ LOpqg*3oߎUy& M5RKБ'> }P9'R}mr=&0tqZE,5=G(l095rmXF\/ު\H}R߯Wzx\1{.܆*+ t;utN1WmR>z Hj0  "^u=Pg)ll56 +xWt8 UA!@Cs,[uBQF8== Q]&on10gWsꐐ{;1~oҗSy4d611<{X(L͌s8S#Ì4Mtx0Njej"@̤4aHg{?SBzB)o`` 400I|T&&&U2Ibgɳ00pmNd"B}Yb"h+ ר0CTm{ìn} tCo3U$OO0e#bbF=pb$5Ř>XtѨT YBԤ.;Dm]:HPYWP)Wm9nOOwbqv20xm 0sx!plyv ZeUU7{@B}8q++pECVcr/d+S\ C|'t=huL144QM}!^lw{bV< P}G{G iSN!n> E مUxcGw8TBw) iPj<:>khxGmbbFr9)M3|JF iMoƈq ^Lʉ"뎋D6ۼBYpFL=momiwF* $Zd%0h:0ZF[]x߹%`m;8+GC7p!e-_|Y _}]W̚zF2=:Ξ!v0:2h08(9S4 e3CU]?E$!:fyvH$jpY`|l cn/U(,ۖYxihxru^fxEbb|Lxgh5"C DR eQ.W` Ȧ>  R<46lE|TFCCC( ?ϟ尵ёa  ,͠T.#f|TP2v/ vGKAf-#IzTEs"}<?s;w~UGQ2`uAH tОBh":kTeoxׇd?3MwvkVÉ (ҋ/bv*bPZ; 6 [gΜ{k)N/-1(侽qga: [۲ ŋjq7͟UT v:LF:v9Ȋ #v&6bɄ|9TWݎT*%ndy%1JXdy9lcnVaݱɅy4[mܖ9V116RBcʗq.>Ξ^ƒ?F*_Z@T|dPnwe?ZZ2Cj{ȬuYىuMBp2Hjy֛◩ T3۲:robT۲Haj]3T= A<:7AS[ض͚e!` `~~Z؜P_(]C){'Z=U*j.yD{ ۸a߲ٜb+mec\(µ9@xДX+`.t}"BCЫ<0sGf̄m1=1Yb1o* %eLN}ơhԛ gBR8:;gSv+B<(?4p0LS'汹ŒdK%|7-m.5 |4q`+LVa|]=T#ƘY1]WK OL+ y$dq' pjw-]t[;c٧/T՞8t wBu>22̅ҕyjzW}d @%ƲV -TzMHY>Gy&׬VGB}Q0fu  ;^at`^0}Ϗ=D^7od/>h4u/e<>;AYA)5C6aiiTO#,X/zmM;zh`g-,,"D"h ! 腭sgCUӍds {{ ÌƵpt,xxLV s,E|oCƛ0˗qX*x ۶qir \^Z?,,ãj6ͦx6Dпjl0JwL ?;zEҙiȤSLb$H0 ǭ @B04T uTkut:r,\|7602<3OɓM@R|xE\(HmV{kVB C0 .BaA<@ E*3_8{AXFܟ(\:Qu7zaK{r Bؙw <:vP,@qY֤6wV@gf 1X,@Ǚ?w; pşzOxW:g08QRiF ML;2<?($FGhX 1Z6ArÈ`hhv l3SXBPlF0>:,+ށmY<H@a,Sx;q8`$'6+]q`a /M`!o.QV"Z/o A)y66'85>5nl]:|z'{ mm,--)30T;<ȁ{a/ΨTM_Ŀ[lE g2-f# A*d 3[YNۻ +-'ZLTA̯A 'Q=;w9l^g.I&BV{Fa!j8D"J._.4[-NE%Q\Fct@%s+8jX$b$lVjz0fZSa\i&h@dPuM*ϙϺnE|J)xiGx׬@U&hŔ*_5` ?F¶ ER_<9-R\zOШY=bH"$ "X,cuSPPpGGGmmk, X+~%Xvl] B2XD<tI Q+ܵ&x n."*G ҊDz1Z4Wjs~Ba}Jwwa;; DNѱmNdzI!*'pX.jE* ( 넰05Ae VzU)ᇷeeZŎBOϣ\*˳J0QPhZz{CR$u8hG@u~L 1?0ȓvY`!T#()-jv?3;SՏf>)٨{:`rOg@~DU B`x7:Y}{yOojˆ}5r; 8<: dY!/y#yCZW<x+,ǟgl)W*4XI+r`NH0 I[ p7^%Am~~\ BɩZ=Z~~…\3~`%=lrk^"t/@>kxbrK12<*?&=X17EW_#Eo{wOLj%ˢjKǹpwkR d&1>>C (W8<,<&$+f lxKn)Uڭobv.\Xή+])C,Vz(V/Tg @,米͠/~]qNEys~L(*=X/~?^}~w ulOQPlz΀vMF-_bϝN*A/3qRg``@e STn'8% 캁N^m!nbb88{xaYLcfj#ܺ*GG()f+\tS9R-۾=[|{h@^P9&A \b#p(MÚj*|'yQɳ7BAJJhqEElŞ,^kA`t?f'OL$}!0$ F]hyZ 4tDEw5 h[{MϾtsO$ÄTwx葛P@ 蟃ܽW+::"DEʕ˒P; Q Ԙ&n88S<рO``plEpT.B8@pí{ "Pԭ L^U/%X*=MLNhsފ%z\T SF2 Av̪ӕK.$kƓН'hNy?Mn9{\^~o|6X\Sn\zIYonlGeOjQ *F?++*SD3K:C4c}yT]XF9DA ұQb!H]|1ITr]OKll>F6&10+=:^Ưe' _TGN=pfJgh}_ƿ񫿂Cm )ͪ=Q=]z`\iRfNOawwcc, YV0&tGVǩE2C.Ғ|o!cjP2ntZ'uJ7nj Ƒޘ=v)'y@x`;LݪAsfW]ẘ~~Z/0^ VOQ\y l֏-:0|~8:"lJtj `Mg`o~] ÂێÜMz'l۶d|d4ں᠇8H ,iH///y/֭]«=WDu !b:\e b-;#i`a~W \] N# ^7}Mj~\.\.}36{t:hwP[+!GBб,-%0ʲVL;Cn`6,˂8'yv;}BB#gXRD0(РؓbEA{\chh eδmDD2^*+(#]@:\9=" ~w€B &$y& z,-)!͂Df/!n6?!fgaYϟ+R=78+b{gG w?: Zyk{wҋX]{̳YS>M>aI:]T LރQQհx>Z><ҧd2!LUXTISx.df_DbpP]΍3nUΜ~3.>ݖidz^<{ ύ uꍆV! :`žvu|[>&rYef3}>*\ h6dVA uKω ןXX""7uiHcΟ;ݽ= ެkO*B&F"@AWÀP&dnH3007;x"Bxx@c)l>:EKV%.K0??R7xoQllnJad=BTzؼ̌ '(ܐC >s{g? Q8ZʼnINB"RRTV[穔ʁGJzAKK淾mЀ!t`:r26wp~yY(.q0 oQ0v{we}TC:tOr119ORˑTqr6s$29VϘz7!(z `m17E3?GRE<֟H{1㈳~5?fv z^{ ^tzj NX5h | /NXp5:"~w?Ϛ厝;44O`63Ï0==(a|x-43i`CCCK Vf ,q=A{?Gн+V?^.24 A `U*G8<qFe,c%͢伥opkZ"B+|>*L633Uc{k>E^wCl6=쥑ί>k|:?{Zg˖;s4*w?\?NP#ͺuL{ak&;dsbZ N-.buue }-:;3'X>?ϱf\ss;`͉bq s}i$)WOO QӋ 88,#b}s #AlnbfjV[M;{0 Nex޲Lv&:6Yh4TmۡzAi/2P `^s͛pIl?yF::wSP0k:)qtt(:0b:011TL#缰@ Ph`vXp…eӴ.7I@$zlSs}<{ ޽G 080#7ow]U|CdB6~凜 +>"FJ]0 K"r9\q ֣$&@T(~Kkk® zQn)5tYL F"jEΝ;>UPG;; PR _r/HPe9+oT}>? n {o_"ri5f{;(%`zzZODnp>pY=JzEj'07C rKdG4!#!;JC؃OWx'l{-([4CrqQ qZU1tC?:9=FpB8>OZpNӨUW膨*/~ >WCtɾUK#D]F $`Ac<ԲZ\\f_P9;^GB¹=Zc2:AsXo`CGf z 뽇'զT.ö$ol\0.[J1:2Z͹\_8lA&e3с:}sa/k*`^ƞE+I^qd? v.j3#䚢"E5Yiy~ x1 a\$G[Pf{M i+*>>^Y vK@P!Xj֖3dە˕ހNA!knn9 EωLO|J2ffab:M.!88ؖ%w˲+Y(vzcXLKժ3R ^ 8aG&S04fsgVAbZ كi~r^ɠ f#hbZatnT18êAߓ5|:!ZQyx0XH`Tob1jBPx)(Dx,Py4u fT2E(vw>4 "*ϵo/LVџg]O֭Ё ^[^ Nd*0#]^]))ͧ x6.PPWS|DhUꎯO~ڽEW4O'* ~x,}lA*Dt{N=Zo3騪?h_ ' uC5AљV+$sGqzi)TмUͷx R9 uxg%Gv%xR.eo>?Bx뱂091!666zVKɴoqf \C$7F6~οg /}s9t=z=JPJl1173[wVpaZmLMT1=5w?s-LM񣘙*\.+l9dZBKO.J@R"X`LX'ڟӈ$tm K@ꖁض3VǭϼȢ<>IRo4N\wC;Ԅ3RPAgX. ;T@1:($3j׀GYϮ5)EY$~իM-U bq)ߥW;y)s&&d 5X"G߽5M yFg/.,XpXjF\%=V U:=l;(Ï~i5<\@>E{8}8,߃:xv{-20V.jImp+, Z b?=nq0\f.BYW4NY NjIVCAT(7Zꯐ$(]$mZb\*s]y;y$9햞T: WCeea= ?Z\S@ʨD1!Rl\w^^!MV0-^rb+G6XAUҠR82Ch(e; oSwRi.U1ң90LSR~"4bjN&yh _`RAǠWZq=Xh4 Ǣ\< x~Pd>𘞞jfa%<ժ&|7KЈ#*@%Z9jhr*"o.l]|cxlz gŻ2:}i;;ê';V.0:n|֛ۿx*>WV|Gb~'Efg95 e2V{\RIi^e8N#ɂR$ioM:.V?+po=]w}B!/Ņy4 ZMz}NPvPCuX/w#m$qH`H:)͖8j%_Wb;!=ZOqgP3<dث8p'}6 IDATe;BQH^z57 F|^B&UR)g*—'͆sue };xf$Vs$*U ɒsr( Ê2 k8taڭ[^9,.^LIAR-le3ݕ08ڝ.r4fB¦ L:ulnm)bӞèר>/, ~cce͡ikvVtH^R=ļ e=u`(tv{p;NINXW1qZ֪|;|.Mv=Aiם8&.ÇSS飉$h A<|7?:l 0MU۝ۮ J{ȿ9}ZZ332)&*v뾼*Tc yj:\(!6U$ltZ @QџNaE#0(#&bu.2 P(h dpM )Mñ]P$v>Y p] Ip!_roye[gdHZС%* ǎ6Lk_E~wp_@ 𘜜D7Ag9;G]__Vp||\RyGm2dps݈'@%AX_gljK2Gvsfk$C4Uy7 @BiG% &>z0x0ɖe/!ݻ?BƈC%bH>גwz̍ ,N|1:dA߷~LivXS*BXÇ"SSSfItz}Ԙ>[wt8,C4v1_>`z=,C>CE$+LLUcRFK2s0DJ=۶QTd#ce00LxE,Z6ͯa}cnib~ju|>~!f`&:.:ͭ-d2k5E{;ZBWޕ?8uKfG,J7>D']>TyO=%V9'0"hEX,Čj㻏 {21j@H1jh:Zܧ1+f xo~?|x-~*CC8߫e'N_hm d#@ܾRJju;z/ja]u%M:.f aqqQ#3Vbfv+`&r<ַkXx;:Μ<|.R;|^pLAS!ɀRrz q`:> 4[-dt|_7Z*e\*rbW '()7>Lܨa 2]l{IR $\Ed8۝ ۵R)4ޙ B\eD)!\îi #zCj?u-tMa#*(* {:bR^w˸˵:v{|*\V` W^ݻw+ A+&.5rA8t7BB]IeKuv;i4^BʁDZې rj@%lm{`TK'쓀Bj"Me LMO@f Ɠz?~[[$`r thjMC*JEXy ZbMLOi񑠇ՆӰ}'p֊`k/x]E]T \n7@(JZ)JuB@v=ÖeybϞ<ջ4C:Y=:ވ0=W;Tou]]p|}o=:\N&:=1)Ŧ BbqlD~?9ܺ{74 DlƁqʕ]oT@'|k88ࡃ8*+^3g4`[Xh0_~8y+}2IFPEaÇ^m*5z"m8}4Z7c5IMD')uyspN:*6ڒIav)FkBR4ڝ.T f*y8..6\ajV7A]X0M~t IP*px,F!|W_zwWpwyqg:cVKzNwe:gϠ.߄Q#sw9ʎ sQ4;QӇvZRIK}\3d@ w11& ~eo߾p- xwa9z)(+,ˣޒ =vMBcz*,N=ͳA~?o-umI >ԮBXYY Mxq 8ŗ7 8h},OT qk&'&C~С%7iBTxGxy%DIE}&ޮT*RgH׻Dh][Y\\Dt?^3 EzTkא˩ [Rd𳗟߄А:ءZŸI#'TV3 ~QPc pB)b|'U~TM%')thgfta7޻g> zضm0x=%gQ”!c{g' :_1(<ɓ'4Z/78ϢK$n^ĨY_[cm^x9,+\ҪQ.1=5gI4!j~(W,8Q*rwx"$L# 0yuW%?19n 3\$XxA@HP(ի" 8VWWj&H_K?Ы2Lha?o P5H62>.%@ f ,&hY1?oBr (p~tib0PUyNMR`VG^Ge^YϜt$Q*133^˲5ϣG#+>:'f-TX4wvN1V|ςT,#!ꅗpLTvl6q:;y6@]G_2\44`vB k˛GцvQ0H J%q !)]ӏaccc٩Ş=r^U_>aȄp_7q{y~s_^/tݫK,_=!Q~U{Gl |t*͖wj.Z&RaS4lA6A Œj?û]"1 aHtZ3SD !'Pz $*ov'Oĭ[Cǰú8!|t:-xrlbbuVD;ҁT,1lY.TT iXnTJ߼uhkҥu/) LOታgpwlTpWV )XRǎnC4v`Y( H vDꑸ:`a6FEFPi(KHR΁'|Ļ."ulN®Q_v o~kx2 \Bm@Tx$2T{MTǨ,$u#uDGMO\t}6]7r?DFߏJRgfIE P,!#;l?$}FL訽׺I^׮:eZiwpUQ:SG_>|( ȼ[B|a3>qgFBYJ"@)Fe*}:1O:~ `LϜ0ms@Ϻ3} r vM,؏N\6?sW@2Zx3k0@2- z0еeY0cXPod1<\]C?^8waRz k\.auu SS( h4H(t:e٪_%ac 4pQ;_ݗ\U- InX|,Iy0j`T3uelnn'ϲhL3pv!J_u=KT%}V`Y!a/*'DF9+g{m=GƎdi0_:XY&JbVv6(1t4BgHf޳(]7s ppa~s>ͳ\tpQsW(aN|yϏa93z]$kXtS-IMdQFۓ=)(v{ q̈́z~o|LM6wF)Xؐ/:4FN??o# *5^??Bu)uqov{,a^jqqыy7XIE&T"9.]*m(r7@w7ߣk#]?S^'*AA:oVFbCXw?G#n+#ʺV> QC\%-q ]Q1:qQFؐ !ע0=J̏J5lE|6o< $4Q<@U=<ۨ?C^~9%>:+BTRO0 J{N*!I]\܇z\./U1nV|Jph y5yY b;r]x^g!W^7p TJAX^fMR&JRۖk26nqt8?9dȄ)gT14CfGAѐtagqu_=aU-qJ@@YS^OvY=2ƅB`7KpF/ ~M_wIϟKfRX 8j%h@H k!χ;7Mo6*ZN0-#*QG.gNeT*VGuFSco˰5J]JN?664CL&οQg"Bd?6=0h- jcFS&O цHz-@y*k^XX`I 9.- Ð%k[ͦә \C|v#RVݳl. ,L&r NVW?i⥗cyy HSHBvf{}Ֆ `Ze}W( K(˟Yܿ_t:l(J5)ϋ t]{.i\$5Z8}:6 Jb2Xjzb.9A[G&mU;1բ JIKϣ;5gh:Щh@ 8=4gy.{S+ R)r{_1NѠH9Tys7*!ƱcB}6T.B㛩gJ(B`smߨ~s#8  Ǣ}QbM>-!A(J$Aw7B2 عU6r4>Dwo^plӀ???aR[3]a &W&[&| Axd,帾<6?&5SNbscK^RΡɉIsosMz}&GR Lywq%΢IVlLC{xbhx4Mܹ{wy?i9<~!YTȋqڄăj*FE}R IS F|"oµ[[[%y5MKn&jgz~c/#ću[% 9ْ Uw"nϰ (=k=T*ױ%t7ԘհE VagBSAA0?|ͭmbEsͭ-1q1\| r,~߆aX[NqC8v7Id)LcE7 DU\׮6<ؐs@"H>tDZA]W*IDJ[ة,_al Z: uy6Lihq,J"B5p$>L  ~_If3Cd <|bn"ο! /<{XEx7n9FFtq#>;5o@Z-P$w"9.ܹ'>+Ÿi:<ݮhİK)lAP,೯^^1FZb;:2*r j:vvoa+vuLVQ>V*IZPf?t^ɉ\Gz?s7n]mO +_?[3X][ W x#l* _"%lT\;DžhwԹ)qRg($,)NIfa&qꋧN:)ih_{jl6؋h%nRjzlst3zxOvsRK;'bbb"b.Q-D_S;ըV[6Iຎ&HN$/0JJqNeť怌4=TQt˲]_<(bq RTN&p;A 渶=FYjw 0umx]XXP:%!` #=i7)07?v5L? ݛ`{:mfggfOϑ[Qq+݀~A.kd0?~ [J1HA\x11TpH,v(6K-DT鴦E3HR5QUDeF:~X0&\f(oC&;uRvh`~vZgOµ7L& :( DdIt' IXt*UžbjD=1 T'tY;;7뉖+@pfffټ*'''ӿ}oqfKڅr޽mкh:n(KuB#-@>́V(R}_`>>C/vJdU(Pcؐ/v$/ḭsշ‚BdLX4ϟ=#ݞt1)M) ~ZPl$Ԅ(!2)3 ""ȁ7퍶vLy׶& Ԅԓb,733ݻv{YAfgvA \嫰l3S7V10|>L: k`1v\*I%z} }8‹ocLOM,GsO?mJb1}kpq:R_d._0܍ M\Y=?t! mwSfF}Hgub- hGT*ؘ;jd+KNhop]actjjJTzTRhD'UQt nC|zGfEkW1:@)*cch6(;CyA"\E3{@<{+r}BĺZ\TQ|G*oJ԰=$3%(v{8z0wv@+E::.&府N-d5QW;y<\ExBf}t"-<9<r׵ȮTfxUţ9^/xIbI8t%y:*i(NQ%g=_0CCݧ4(I[>!O8{3mp}чf3J&{'p7{N !`4"IFkɨݻTJ%Ğ6jgto\uDǖϾR@*e|qEMhNk E?-ގ?Mض꺘 @u| ԥ7f\〭˲q\&LUB/$&eh6[LױQ洝L^O@*8/_Bڭy º\*b{{1NUF)r\ב bX I/ݻ0$T.@4m&לk]E:Iҋ5vos:ڙE9"i(N1O~?Vk ɠxVי3JŢ,H1m^]:p`?굚칻&w{]F] .^Շǰ8>1@}won=a^e0dVwDkZNr`7ԑdsѐ6u38vR,nSUyۿ]/x}%HXF[b:%R%QGA6uygMK0qGX0?seLYОSY8rIr^f@h W%:K$gSʫ 'F"A?  |r0.GطBt|;oҥP(:>7y{>JGPZkv0WUP 4xo+k8u$wxhvFsr9PxGbϴ{h$x^G}n t|G8 xJN 4jun-ԓ'eENQl)YaI{~O׍>1MFW&'W5b -٨ 2z4}#m DK!'OxwuGIgy,-;F:^Tj_ۥh;8rh +#Nˮ` 0133~\*tq1͡nu)0^bVCTv+WoHHJ)T[8x`v]obq~;@ X6Z.,ީst:m =t-~!`M* 4AqYE_XO?{8|06673خBܳ;Rܳط+OHgs/5,n~F⧵"fCo=!OI(#}C._-HNڡ{`3xt>У0v|\q 7&%_ X#$ j^F§ 2chh^2TB$UT7,;|-?creBK-˲R}0T{TF $Ll6QP8Y= t]PJq (Vbԟq BP,˲PCŝedsY84Jڍط0 Xu4Ms3^a ue7a[6^1" >;=rTq^RUpYA,\`6.FsCF=426_SOU*m^( YXF7D߃1mZa8E2+fXG699*>33L&.ׄSm!Dn$AR @y $_=+X[]!VRoyyE׮nP ;ӂ2P,?^=trPI}|RLH8e|58@??(8'JWuBY.hTw`# 1 BcgjO@Je:dݑ`+~ğ((KR ;mM0$ЩIXH^L|>x!<bi%NI܂xLK\i5B}I)6669GJ)> /B]61s-y2[/ J(?#+vN6<~ xTfS&*1NAq \z5vGqBVהG802EЉDZp BduЅ /h 8G`[Y6fggÅ=CFTҴ0]ɫw yb_+}tYAok@т\?{ .ÒeTU{H.=x@@N3mb0N8' Kw z]t{=fl`uusZffqgybw8v0:/v]ޮT,r\ bfz7@ql5a6./:8}Gu«3ՀʶmS:+`U; !.Lql)B!pqnWv5:;;vvIt{=ܾs7YwY|t2ڝ_sO2E y_k4\F7hݽ\ C辒h'Z'B!. j>Mz;uJ ?~n+)gf1a۶|Xq\Ηel'?ҁL'GahT5a~~lV&Fd*%;k'>NO;'Ap[a8 gggd_nvv)#"i0xD_v7ZH!vWKsB$ "nܸR=l vdxio_\@тجx,k(~uR-4Mybvc2rv`6fgy4ӧߢ>kk0 ϼz[[[u٠B % 3;uHn{21&b۶C;DlC^bM_Mc]dYQ+tQ%'j]DW#, IDATМc~~kkk^%|L%!.)ARd2YXw)yep_?D՛Q<0Q5 ?%5]E*+@Ya?s_Yi[eך"NQtސ/Y xpp#Msgp DIydr6-jj"wBBD aЖ]uJ).~a̾Q[ *ut T(,&]$`HRJV@ {+n<3>GzRV<h%)J &G($1El A0<ʤ<>x=]燎ǯw0Y T75As6o˱077[n@HA?&JV ?/Ktt@AIzp:21VQ Qc'ʫ(^}?SFw݂5GILOo-;˘"Jå.&hp`~llPo2NZSShwzu`sc#譒v|}%=CdyLv1.>tYן{DuAA*Ԗ[XC[׬'SN Iɣ޷_8hٷ/= o̓B )-XF>u|1O9xrja [ƁRHapFx"V` ؑg&MhHd0LpBX?# 1 $~DxFCs֠=Fo꫸+hud&hN aR؏t:~> 3BUA+{%zQ^τ F!NxE_~xujQ%Qȳv˨BPo`NW֢rKKQh g nqT,`y垬ul >;oݺl&XIx2S(! ^ =Ċ'x$rݫ^SaO',# ІߟzAVomtck.6V[O\G)v$  "\J(Y1='GqjpC,$G5?;kTb3/nV-?To@E/K3#*zcccx7e7v$%C|Y]Z(18A}]ãrCiH`(~xߖ.^s ӻ,7KN;v=y//C$]#R#ɭyc~zm?@C8 RUӵr#58 fGO`<>ico`ǯ)hb_qo}fVD{uAz/zt#'6BT?.@M0 0"M@j(݌6?ri KR& "<ٞ=i1:ԀUzyX3Cة:zwj8u66t ^N˶SN 3r =} Eр8Do` o| \vg8 59Ka6:Fbc'*=X``aaVQ*Pk0nӧN\*n%:B7*A0@ ssR*U5qR p]u$Q`a'½9'Pa S>bQj߉iڮ ZT&4.3\Wbμ"OO޵.9(;T0^y̯ܽH_,adEN:*qvۃQ/vpi AA}{=Wzx=;ՉOdA(8p]f. 27T;ƫ'\Dٙl.ϵfZ>J2r~Aׯ_̈́XXXP4iok;w{J<@esb) pAdsϘXP@Z;wW9'и#4Mήs< LO@z=G/_b˾kUЅBA3vO;_j[\Ol*>sgT#~+cA`|R$ WU w&G>;;$Ӄ>SW͞ϣ&xfP}T`>>ښ=fff8fq]{>>&U\r R\¾yb=d2i 9Fl&2j't:-/q!;j'R ._ķegG{H3tq1f &.^4;׶V-!i:=r\Թ'v<F LޛHgbߋ3諭{f8G𖸒)R%d-]iecג6 lmv:(pHstLU]]#^Dȣz4C232}X]1X岐smd]tR ?:ygn\˹?q7'|y&w@fkαm8vz leMGcҸrhN;Ox/ϻT:#~fvdݡvS:աO9Znloyr42)aΓ_~_wju1403[ 쨜J*N)\]9w+咼GwAoOԻ3S^MH&LOMIĴXiYb0gD"t&~H&TXD*޺y F1.r0T7s8{\驖{::pT*}*򂍉D3MSڃ(B:#;[v0 <~qn&!t&u;z#jI+l\-QVJ`D zLg`4yh,vҊyp ԶQZȶG% 577O Jیk)6_}U‹/pEkX.|yfڞeT*lnn*SE122 Mbmlv{.?ē'>!s;=.]ĜI _rkkkVW3~VMPRyZJ-rda#FUK?mU[ ^+9aZa(uVub ~1NgbY5 U VQbN"ZQ(Q|W#=#e%Ro/]l̪PJ{BXq+eq<\\eY͛x CYhynL לD"q'&N5GH6' \7b x$8<s4 \Ww"㸞 sǣ RsFGGQT*1 K[uD:;/ALF!,*E/[eJ螕i5)0kuJ { 2Re[; Ƶ+Yl*qq4;/|6lFܲd،{ZU/xg$<"u=Y.wTU}= !Uc!=KGpFl?w-|G:$L]bp4ҡ(ʾk ].*v<ȡ 0blddroX( !W'&'+IM\7B 髫kMxF?rȴ !CP'cggPr\Kn &[FpYO~(BKt\}ܝy$< '?!H7Mi"ˡh*RavDْ?JKAfۧf v!+ G"6fg sDŸDh3t$O{}kmXYejs8Q E)4.!`gos)Leɡ%r¡{{{0MjTu_k~?lmm0M S[˯~ .~7kARed>$ F>2"bOON?OᅫcG sJ2жr4!X?t&ߣsO<|q L:cLͭ- ΅x=nE~{$N  4M={2(;?;0![d5q8vTMvO 0hug@? 'Mx9)Sq1F_ H@ȄTlomGڹx\BRVi%t7^q{v/¦wrl6Qq9d' BRT/(!A:ATaaa~w޿l6-p]gOƦ8Q(ͤeQ~AR30]5PCs) =q{ضs.4OR@]gF|"-D93B"ؘ/)XV1 JeN-J+p{t<=Z Y&\3ԩSXYY ] U D&_ ?cD$t|f(j5sQszl& A@"}Vڦ5,7;{oM83qԄQ1@\-79$[T*;hK><|va%:%շ~8d2wFIHVlnnZ0c(c\_w |˿۷ok/-Ȫcmmp+!# ΍a6/^hKO|M!geu#Fvh9j-C2Lk۶a&(eR`W^~yfA`pLUqMV%I6XРZi;0޼yKBIض+7/eE_o/j: @*DPD믢X,cgwS؄epʥ"J0OB\ٲ,$IQ?Li岨b̴ϸ }ad  ?6B7ߖzU~zjt[^%Hxxot fШu5gIr hZ5y5eʰ P!ƍx!sZp#`woI]\#x7C ccc_<_HE_WV̍k$ՔRڻ΢h 6/J:ڻ*U8A>#[@s5&<"Qkb3A\:BVF=Nfb1XȌ#-%=ԡvs_+(` @KasU[G1-D2B6׋r!6/ ( "҆KPt"88K*2nvDCׅ rIr3Š"k |DPz%DZ sBߏzBR'eɭ@sy2K#}]-DͤVEϜBԳl;RR"BɎ`pbpۜ왩)PB+ehwz*R| ʽ-tw&1p5]h-/&=C7?7^O~@>prrKN=GQx jck][HE66FqFFPEz[<,&e!܅ ,@ kidsa`fvpgyG[ؑC#><Dzӡ ^k#6Aq(5P[z $\L+ UT 6rHxG*!덆"'໯8~wp [!Lvfrh*NQid87h4x{tJ}*`o/z]"PTQ148Fl|dYBV2FthbpGBr\T);{ V~8-P1QOQawln\Jq,]"2HL /<%Ďq]O5k:^uy)PYX8V4dh4i3,bq3YSW/>$l'FQoذb:h4/R`vz eRp1fIXDQP׈T4W@i6{g. qlS9.\^H32#ܜ"$%J)Eo__K#*(¡3dPRMd뺸Pwӧzmվs]'R4mAr6rD@ {w~;tmuzX=rGK]'Taj%2AeC._s yKe#ތx ? o= u]ݨ)Q;Oji&kyv.WL>,Al.%;tg@Hp]ܸ>,ֲ"Lg:?iG\,W~o}'9BG7 վ2 $g\PsVα3L5Ɏ/vG?:w&U>Aٜk >Nxd';IhYƐt=䭸 N:L2ka^wI37}/1qㆶ%8I ˲0>>f1+GqUh'1.ҁ I>;xpSM$<2}sb_Fi;>\Vcmcibq1敖"^cb|  2% .O>)Lv\4 ض .%Tk5d{i1镗_ Πh,Tk5q|cqL&1;==`gNacc3S4،˃ZD$.j}cSB"`{{G~ :D$.&}jƳ73Ip)#L`jrK:#._sgN!cuuc#Ø|J2sxT,Kxtrn3CZ=zǎb@?d2sgAZLObqqJSq66 WG*B*b$bѭmj&S$ccr>=CTnb̂\p]CCCH$)?i}9\`hTp$`+$ h=9VΓ ]h:ZV)5>:caaq۴.1 mj5m0Hl.uO(\fψGOh7RTWl֓e:Dh&ͺ䊥*ƦDo_?\Jp)-,I)xqL C*FRERAX+/ǡx{},8h6j&&Q(G簳;:^M$^":(Eɧ ;[ oSl6$\npA´,kkؓL #$ZF uII MWVWZOqT}"٥ :L}"]tRyip\8I+K뭧!:ЩTZ'ȢLq#nz# <8j5(Ya%CT#I( uUzUTƅSE~^ F)vݵ|.AR @d,c%b L@^a8L{ët>ϝbf\7]E~j X 'H&X][(޺y+sV@ /ioqq3F-"> 0I 2bjjBfKHLu+毴fOf+`ީ7Mu Μ6R.CgߗP EhDӆǗץJȻL"`v'$;:҃KT!KZ[S%:dW_d3i"6WaeR'pERiq$twI8 (H)1 ,yddHQ!7orhex-@d !<={ a^I}|sŷ^vKXQĮ 3gX_//ܹp/1 ʂ%&{|tngOT|t`W ;LvD`fzu@chpeaW]xkkK*vU|q_qD#Lh MNN} uFfZ誠s\$>Ƴ_Y6p][ƛoΝHZYG&a_(nT!+6$͢^kkڄȈ@kWoݟ!Ʉ xKƵXY]{ۿo*s 1l~{y97=OjxSY>9/9 aɇcqG) Yaʹ%[Usx/l$WkCN=L&f?``²,6q9S0]eްa1PbSSSHӀa"H=xm\ r,6ӃJZIlKҹ3󯽊\c##c/G<Dž 22JѨ0L\8w0HuRߟB$D苀  :mI]"z9$z ۠nzL_GJS8EB]7 [:G gi6=+(jpffvFL4' o!]b;_5C<KTNٚtGrH#:qۃc [CYKMĕ+W>,?pbs'z{rvӻw/Ef"a:) j2FÃ\|`x,yLÒIC? z'Nm\w_G|ˏ[ގ>F^5bsoW~睖1PƒP&*:j-I:<d v0 zÓf5q~%j]ЃosܖoddmeYU<}}}zֽp j6 U$TY1| 1??}J^ut(h$\&ƶ,  W, t }p;===9 E$ @~~>qo˲Ie$=^Th1E059Uu1?7cq jip\7Znyd2iXz"jCsdDϷ2>O/ud8,,.ZM[rI~oXwK$gUYx'8[b_ s?N7Z+Pڵ+x׵0 dYo~g9{N:w޽Oo:tse&t>>hY%P˩i,-=~.ęs'ZsPt8OM:nPahۣv`gr(lRVpޠ_5M3pcq'uIYAYC$cccv&~빦nwrυ~&pu)e%)%LrÃLrĚ}/Q• gt:NV#YV\.3C|-jez+ 0?Ϫ Q!ȓ*(cTbix U~:usfVΪZ]}u^U,~ZN;P>}}}D"r/B|gkK6tQ 4m/8kL<&8F޸ `UfΜabnv{x[d*`@?hڨV8 **8.?.FGGٴdҘGXÃHm1sg ˲lѨ*6N%,Fz4eQ,2^4uvwضI0>>Rɉ ɋVJe+ߦ6 Dj++0-_d 3Z(?,viV?膈8"&BA̓$yx})hAQ ZwlJJRYX[B=;3}Ya xz2z&N<G8}vGnBHq7>*s~޽Vg'd2#RҒ; {4ˡlv(H$76Vy*D.QlZ y^3o7X=v{D@\ti[9I2NPF5'^`Ňznݳa )k|bCh+ 0LIVK13=D:x"x2  I)6f&x} ,WK] hbrlk0 Z d܅e8uV% ẓRqN0?_# Rw8!ZL}~Ltvи͈}w(s{u2 ^A׈axsj#lb10 j<gxj+F jB%n\y~ bn1K%Pemb$  nʮ^u~dR!;Y;¯X?C9Hٺq<'3*@!BZ+ĨTtz3.66P*W綛C}QJ]J>Pʼڎˮ筝e6l kFRK"Cfs\ ėPc:Z,!q֡W O-NY!BxL HgF(Y;M G! WQFz{{YOxyYPU>#'''9h%pu'B*}88`WǓݷ'Oh〝!Z4DEm{aa? x *0]H*]0OddY o<> ˲08hL^'.xuFr6:P===^ 633766*ٜ:_|SB$QoxsXϢ  ;3|ݽH]$h&1h_ѩwNNa O\|(U:غH&z>~Ftz8(۾g?'tފ6CAk IDAT꾈Wez"m[sZ6Yv]FfVWB6m;"aXcGh:xΞ8Alm\C Ξ8>|k'(H&fx\ 1c*&ee PqƍhàuujӰ_\n`_}N41D{﮹s ¾ΣnX,+hehXbhϪ_bǡo"ҮҒ#Ϧ Ν\yp۫[4M`Jbb`ff#Bhn{LaǏ:ǎ  +{gg{~. 2@#s&ԑ?q`88\ܶ X_54 k#s])J ӁG)ꪼV,Uw^0$P3I3Lc||L~:;] brr C~YJ07m#6V/HY[bhhH;qɋC~ߧ=wmn2Ӹ&$ُeåOvzVUv-k[dP\hlÇ~~몤cAg%RT:͂]noQD:x" uSDZYD<Ia04|8vvA lޡQ]VӶh!sa@lO&I ȑۀ x>;|Ҁty++iH&S8zdw>2(p\=A\FOOba~w9nę uaO SX^YYvb`sk YVp*2E|o@&a\]cpn}OڠW7>>[O Bw;jn3z7D.7L3ݨt||LM}7R/O+9m%8j%G+uEGSɓX[_dz ޽L&u)zF.|Fs*a 2^0?HQifݭxR'l>i'ABk g>iܻw/$N:/Li#!sIu]|Iv2-,YM QSBAFT E*dJz&:)ϳ ؿUYG)t*j0cq LeL@?,o`tlDJ k;{C2@uЗbX7#\>}j uhy3#fQT1߇RT2Z>1 s3(Lި+rD;W-=w5?zR;h v{BtHtuPɉ{ ps;:{*idSkDq,O& ~dp<CJ5 JGZccB{穷q%ƖVr..]u7FK]W^ 7r7+G$}w\{\x5TS'pD9ZC9՚HO tJ=2un64H$((,/U%O_>q.:lD\=†>hgu}Z.WP,\{|4}ېJTv /P ]Crj/\,K ,G&( U &H{eLcq$ BHnl~<d-lIk(Z1u8Hx{":ZvqJxknvqq4ZW]y.ԔYɝ;{FBCwJ2TOA'M66:1L6!LMğkzz@$D:°s)#. bqX aqiEXF" nMFPYTa6熠!~/T*h*URlD ,J8cG`w/p\\|ݽn SV9I =848$emۖP8w.ۜ}!eUTY/ ޹>-!L޽&<`ltr{j'[9jh1,${1?7y!=U$"i1n޼] ?K?0D[-8!_viY֓whGSW{n8~옯@U?^ @ LMM&rat?^^ӧ=bP,b(7lE+7^ÕJaYQ8j¹A,ƸD?|R*mT2T*L:mcgwWqaa\x{76 A(cnooRa%^x\>,Z5Fl4 fij!޾y S7x vurdltd2]RzJ#GNҞ`~qQ7:J*"U+`mHR-eI+Q`70gtZE;9.oov 2-}Q3Ӿ/~SA]8"PpSf,d2tR) =tI"<94mۑpvQV{ЃUP<*$n;mOY֭۾lmmbmOc}۪ZݝVyo:s$tgׁ1qNDFA^GOO/ ӂm; cc{ͦt6+kxk`?zO4pln Ͽmض7OГq S/[^!H`vf[0,| N|%)~ƛ̆-1p==V ηG:AO=:5gf]'!=@bzko*OL+u]$I9¾Úa<$V}rVcӭVbh421B#7Tӹ5B}=zD>;;o-:{I \n"__=$$fe >y'OF*}{@$(t D:Dtw(yWnJ)sWEヹ HBBn~;ʾc$.kx޾bk7_ƛ؉FDnj&`_KsECĺ%'NnrA[XfRkKuxj_EG?Og2U bQmC<94 (a_:9j)1{g8kX 3mRՅ ar9Ɂ׺O`▟3PP47b2obaw:뺃a9+YIyaH JjHvyb\"c/iCTj|lmo J1$b`tdU{KRh4m `6>H,on+̀LRd2x`m69DiWA ^Y"O`/\\JGf1== 0<G"R.z{{hg^1eYf{]g*mJIt *Jmoˊ˗.buuÍ&ׯ] T.tG.Eфm;ʗ~xB|4MPʠ~o|629  ÃY LҶF!~Xg}*iNw2ɷAkLKxoccx)QAm 1Ϥ&o޽^@c 1_(oP_/;xk9:kNq_}GbjFez{&6Q$nvimEKR)ZFM]|=ҍxM>s:있5z=Lp S Uz^I*F= ·]%4'X7BH޾~$In$&8Eq&v7Ms>r$ ޻Z N\*c %8t*F1 츮!^Jq=3׮^e/C !P72 67Z]LJ*B _T(va&\^u'erkAjU_ ¬TA‚<J]eZsǶm/y",*$2Vט(HH@i7GOqfYqaY1Ԫu.+fb5D&|D{h7/;l 9X9>@+7Vb.#@~f3~7ZmoDZ>vhVhbIk-ҀhH؜x-\D؇)EB]1zI7w#U{:Qo ͺL@KT(Jr=r9y7S/"q=GRԏ_pmPlm1?Hw WD%ݤ(Ibr6._$AX㛓P|8JR>35jm(~]'<:CIOx|*U 8qsA1$1w>28jLӂiM4u/#ipRiWbb18.j& ?|BUܽ;;F6AX~olbkk r|efBl6`Rb)6/*4ömd2T$:6 nΕA'8oaJXgVWVЀk4=pI|k_1L&P7ސgβ,vS:agfɄ6. C1>1!q Od4gX0賟4 A϶˄GϯWp3Puח原'ܙAL@OOMb{g/e`{IhP'\]YYEZNYH_chxU@AEtӲtс:~ es(vsDʇ!1A@ЬJwyG/jBEM0 p/_3H=ɾ4P!H'C`'iTn"G^]WvCB%x'Rzz `4#$Cvpt~i nş `BupI x j* EfxE}rh6 x]jU0# p[g sYo Lq+w{<~, BX{!ՑR"$]T׮R;}`("`oG҆/, v Ra,\.T") o)E,X #C!^p#HT*UJl6M؈눤ks@uYt,f!fYhpWv[_ɉ#{;y8wP3<`7vK$:q5 En7-3e*U$ p)K jBF8cHoqlJ חPIF,+2FR _# Qq. !MyǷn{z*u>o?g|UvIt݋$_]4"X;+P퐠G"ns ' }Xh@~'<~GnkBRQ!=gbb ^Gt?!ÄnsZA!}Lر&VHhU-,.ш X(G]Q#_oߌ4 Μ9MF&\+%  o#1Wɣ@7Lѐ(cTE/>| S\E)t2D2DV8MN210<؏mVY͙3Ӳ+i{pc*>H"Nö]\pK j;ZPh6ޛIvea}Kge-]U 0p$qe*Xi9B`8,miK!E0pe[C&-1\4`;z%++-?2讬̗w|S iD 2YTZ oƱGvg j¶,JcttTVlDU Qx5݀aXVVR(&'&Po4a 3Oab| WV=GI*.\hKV R~_s8H5w}P^v.~ k"O32:q<tJ *Jpy)`6,,`F>QȠea<+8~Rtgvlksr+.ZZ^֊XE!i B>lIg-m;Za%7zyqGb%/eQJ 40[l3!(199#2rOgt{ʻ~c0G?=4Q?wMpZ"(b]:Dtf4 ZnZokKuqgc S#H% 8Dzj1>ڝuI[- :HvZ]tvYЇi6lZ+#l#NW _MO<ܸqekp 3X8-2QJ+!+NU8=Hg"(Z?p#4cD,$Hױ[pJh6tڟT,d\ <ך333u Jt:[YbqԠt8 U54% t6u6LŝokpMxSSX.ww'ϞH}c3ڱǟxKK? Gϫ+xqQp^EW 4jn7 oш8K+2OdX_(n+"hZ^t퉸9 Ծ+PӄG8|]wHv| _cAQ?j -JbqJrmF_Ңa䳪f\0O0>>ؿo]caMO4_W 'LPU07x7T1!ȶgSm%<ٵɒz!ՙ#w]];Hn$:] dR+hJq ejcckV%yTM;]t:]uQ8\0&FQT84\¥%<N8hDJ?p?Z0HSYln@]FPp",u<qչ㎽mH$A*Z9 Ox(6{MB(YY"BpP3f 4Ν=յ5xŨ|d[>$F%koʪ\}sz@]&'% 30=Fjt3l9<]|:cN$ l* %<|j5% "DTX£XM&9:rͭ-|㧣#665W%[v\3$]9.V@y~ {:tSRqA8MB022 u41kNx U:wz} !;;"J¹YQc>Uxqv]IaDS(j~k_- ?&VwM*uã,WlǏFƙGkx:.gpSXBBaҩ*;;fH:::&N@]+&Ɔ}VNWUt]ҲL$03]>w>?V/ PcnBG&L `iyźH=lΝO/z wz&cT*[;j!+e6~B'`HR>L̯t&%{'6TS4'd۶s=|BXB)hR1Uv]gSAuۄ8$^^{>R{رc,uP%CHL4&R  ؛덺f7jh?_*9[ MSlz2=]&/n5y DR})l 't4AFƦ49B15U@Q!aXZZ="LxX]]+?2v0q]|劯`Ưf;&npcx =3`0e]w | A?gi㓗Lz+أQXd2`0' WkS՗ {d!A*bn2 p|s%-M[re0 ((xWյ=(m"}❾ pF4S07k~4m. 8.R4 MñGPե:~vLwl#NKe3Fut(eٖ`rb w`wе,tur|ήZk H3(TU7i:n.] ]7u^J#JLhbskzt DLFϻh:ޜ4A1D"f v$ qյ5qXL$j=<1>f)Fhx`\o#ji(4ХjȠH6,'ić~ g,BщXC_??J (E{?vw||U*>*)yoe422"Ş;.#p¦۶m-=y0BV]a>G/^[|a`+gqI"{h=;R>vG`ngӟ^)PݮOt٠>c,wT獢v>W:KQ1%H_)"xʼnreJ!9#H4<[[hhC7LhD06t]C&˯V[+l0>7i51?;w@\.nZw8 h4=dXyQq6MZS qMS|SzdB(9HV&jѵ [{u4a&Ǖ].1&b}=!d2h2ɒa9\ݕqNv`^)Wx'5E&Aڭvu¶#No3L:ꉢ 8P5OUOo)"qKM◆K̉HE|׸Nğ)© Ph &|.7(4N=q tv9$>4dLVzq@\L%}ɫCC]<ԓX\^ ~E.gC$_xz^W5= >;I@cy+N,J tK&<]tt|410<3ʃz]q&t@;r#`D"a]}>v屲iM*Vd~M<447>z? 8u8@5m0s53+F6X,yw '/kN'JpVc\F2f1<K=*7`cff{ǎtt6{L$pA|DÛ^& ǥermѷ~24L2Tُ"5b cuuvZK,VGVC.C8Ł/j;U0 P0jaggj-0b6}ųMO_8|e!`!R2Hȹk7SI|~(>?[?zS'O!T*4 /_eAf4 333YB({qqixi{߯?s?'m~[FCajn{9yͥRѥ(522"=zhsD P34//ߟ~q翌H듓/=E{\f8?췹=Eݗ^z 33Ǐ^8 0Z,"n`w;aÁ;5mcrr2v|LAec"+{{y_'C'#.zL/IVLlL2=#J TP(g*<Q&:)vJt¶, 2x 596:-$ vYGkaͮ>. ]sQVƅK>|Xtگ2{x^oHz!g{gϜ֐mnbiiY[};ۃ~rPZD"!8;dvH; .&I$1~ oT'A4hyOjV0Qm ҈8'w'XI Nv*;G1Dul R7or? XbNj/}/u=Q.O!YQ*}v4dxVxS2wHZS5Y&&>:t< jS;.~@*"z.D9ڻq/ٟ4%y8t{wS;wD^}:iOٮ@hXYY 41U,uBv-|[OHxp?|qW8ҪN)?_~e8"o|u曟A4<Ѓxx@K/:Cx%d2сN3J~E#3'ɤ-{#v *"kuK^0],bm}Ld4m$ ft:l69ŋ2J$NL&xms3E,.Fײj5qh~V3x-v߮i` RqƒM"z$IvJa&LRId)ܹ 8rxt2AxuxH0Ʋ,>I t@AՃj^L&PּJ]uWQ|;~Qٍ^0g sg Gzͅժ@|]Gn q?h4"itt4ۄĄW`F S%qԄ\X[[xNc03d$֎ :[Q6YB<&r!4;4Än$a&\[i0tFNUkA4`8ty'ú6˫i\;bi&A"n"I`p>2t]>?wvq}_u.C~F}O4$ to>F _NwFՒc J8Y*]$n9ɎZoAᱱ4T7 I;ѱ<*G&wifmi7힚8 |Qo_Og128լ2SSSXƚo>z#=cD], 28 a (XE]Cxe !kha&`[,UE[ܖ% h;Ft ?<< &Px^;#}req+E=Ѓxd")4xMܠNb1MSvMMMI&ND%!? G>Mx V{z^{clKk*!RgFsF¶,9mC+T[9N81x)H666bM#GP]}{nߎ|rQz;}VVVc;LVd3-'X5?ЃS! >Nsno>뼝]t{6&7::¸A^o\. JY RZ#a e;H&Sxpu,>_!\ >uZT tm˂CNa`ucSdi,.Nv۲i0S>-L\0LcY\8Rn$U <ڝ\džpVB^4[O)mizx]cCZ&FGF8=,q%-VXͩ'*N `~T*Udrp#nǎacctnmKi 9R+!u 0]& 㰮}'{0 zG,lyt"UF@&zM :+ Fģj\|9Y= .=x޿{|ߣ9# (qjeu-rpG>tS/2B~}D> UUKҁwS?(S&@^s/^[!xqj)όr0:ޅ-0F5fz]Z-AKMLL5 ݫ~"=9쌦iLQwUT*ەkƩ#)DzZDe;0 s8.&(Ryc#C,mV#J89vXݵt@)f=\<^ӐHD^6 Fg 9kׯ333z.c^6A3t/R ]G!}w$Ǐc£WD4b=~ƪLȬeʡvKwnE'޿tycYH`ի <lT)"褔Y1U>Jd 1Q5K Cb1}OLP(jaZ-؉3u>|D"%jMR!MLL zǥH&HRp]ǏxhRн%$S)HDCSyL#͠VvvF8L$IF ::{@3%C d F vB@cu]{Qu199]ʖ)@2#(8P6ПªT`=VH$!΢B(Tˮ*'+kdQWR%ֈ8XZ)i*j _zG P޼yٔbދTL&3!RS&&#oԊP|PީG;]PR7`l̞z~ {p}>TjVIԅF<*^~N aQ%q}A\pNK% ntC˲,X-)De4M-)|R˲ 0auZ]ԫ5ih% (Njl\tM~:ёL2R7 $& 3BR g$tÔeY0 ǭh1M/3K00M[m<\kvʔ4Kcc*LySO4([3K7o}Y?xȁ(.9G&"VpNkAyW?>/ by9}7⩍3 rX:'% ,fca\ʟn\.{uߥAA] C#T>;44o7r'`x3\J? |Tﳟ?}z>_w@KA;~kkPLG˶mLN=VW=m'"!27x^zQ#jWN=x|HK? I[iw'ªg2PGa(1ȸZu\d̵ +~P^Veޙ QFC} ~zAu۔Tqykrw ʝD"˲BYJ*!FFzp!F['##(BW#LZkV .w*huiM؎L& vNgбXtH`;.lbjr=opaNOa~vZS֪HhK2^7L躁K k0lMאl4Y]ܾױr |>]8F(Rq}Ø(}d(MЁ>tU&l8fEFKjW:lbbz'Hpl 85ŁxaġfSL^n&olxUBX?0"_0l#hD"!VB&l>39FF' cAJߘQ+!J Rz]@6 &J#{6^JJ_K/L& G/>jŞW2ז{$jZũ) XY]Eь>uW]+frL l")&RRMK3޵ {)wHޢHeg"H(p]wSQ sN|KK=cvv5>/q kX:?8L54{ OWnnw!*qas"r^$ ΤAAL ׁH&X6\JQ*`duǺV!H`vz V V04ضś`NcYt]gTWec-)LSt.bZhE*FVGB.Eфa%x:!@FZe4._ٙ x,߼ݣQ ՕZ@166_C0w븷;A^/뺲+ftt7b2q]WRJh4:LDVuiA^#(΢h #Uh8Y05UŦ:xPve[8rdAwzmllln9]|g/@ߝ*LOOOs{H m_H)G;>ҙ,[(:(=%O{T̺T^pw!הw}D_Ru9k\cs`6kIR]AZ.jh"9@',%BK5A qu7}u =5!7PRC))T9ǎ K}WߵM:Gr|^ql"Ă\%Eb}O=~k:3ۄX|Wn@tCAe v(f@W*wjsss{'hGnѾ;O}?zK_9}pcU)uO=Fr@ [ALY6X[qBD'PTR`|bRlmv8gťet- ^Ѽ|kxvO~14[-a ^]FwF4TM8.Et yRit,t%V/?֥xw_D*0J3Hk,09Y`4tl $S)PJA`tY 4w~;~`7(euT:"v@k4a(mKH4M9?0+;bV>ݏa77]S,uCqq!J(<Uڞ;@SSS{>MT*޽+(nj=u) "Z#c]FblW ={&1 s_1.i6~<@]:x~"m?+F., Jt>ؽaq=Tk3Śпҿ &}Ƿс1 <ý}.>ƪI{4ّm@4!(??ӄ'9q|,å?2ѧ#6 JcΥ&|2&&&vtF>z7oalo}UVU!ޠsgNfl$,uH@yw #΁L*6A-^1 _uTa F]G W=?k9 Aϊ?šSy7詗S=;hd b([ez/\xu g AVĦ"m]?k/f|#ѕu^츮 + ÇcRaR,%hw՛,,dRn( 4[m$SI؎L6L6ev]^:FJ \ <=X^]ip(t7o¥ID׶yGH cYh;eLm;rYhv}s.åj yT t- ]N}uCYܼ˶1;SbEp!ʛǏ6Q }iܸ+teI`\Fv{ώ#sO/hDB nʎ)I aGtBXu]wS֐ǯLR+\yT7 3{ffwF,-!NF:R>[g_t^SDG,E_%\ 8{'S(ܗvep77j^666@Mdwvv-Ai4T|:%-ߩCYrX\#3 M4,AAiIuO^hq# ;iN/TL?/i ~J;}߳%N~d |hR `:NQ#?ch QV]ZܾRb=~4hnƒ~2OqG'1@chKΧiY[5z`u] ѯX]|;uw~=g0@z%s33"0 IA6'C4焣O4?o6ё4wvP*FGFt!IcnvBZ Zcx{pm&2 6Je쟟fid 5-lʰ=,榋xth4qa,ݼҩ$L]ǩ z}\C"ac9F݁T]F2TutPo@)7XEcq\ 岨jAe h:/ h6}SEò$X /zDWVg&awljӿt]euٵp'tddv'ݫ apf"F$B1L: 4xBv2*6 U6,.T=zģz~ӧC֙?Jm'VE%EC Մmv|KZԳ̌/c]A,4?;ᆱ$2cem=4FS (G/*_ljcGq׉kj2b'sso}+KK"w;p:v(J q2'sH]J3tbQ{eYi=5^۷կW%lٯ/^S>&̂>ߙ3}T"r< ~۲a펻o 5&{>@l ZD}S2_KӠ4MmVJ>_w$PrXB(ZN{hSo5= xG<bQ3&^ũ"67' $J$"UA:v.Eܹs,&IRԤt{eՐΞsXY]}ѣ (^ީ)A%%?ת> 7z{OI*Q{C 9cfc]DyˇPTj5ZW}f4M뻗Y+xW v0UrȦ~t'Tk  IDATM$}h D}V`I"+91] D9|1=N ":$I jwp!C0LvuQ} 70MFR &..-STJs0; hqix8Ik77Y׋u344$rXWvXg/Qz]FeZ3b SJ14<̀W;vu^*!$9udj: JxR2/qI %B:f ( (xMxzHDJgsɤ}sõA=h?UŹ}>?;eGضm=vOH, 2)|QS$*(o>L0Pwd#h9.!O|0r猟n/>zbB D=C/ P3g`ccÉ$hHc."闽<^XCj+E4y(!~#'ʐY~Rg~7}T ߼fb?`}W~dGq+KxД1Iz]T?~Je2oax099J[W'xK7{1tG`42!j 4DLEI36Rq1+!(vK1 ׮5_Ý7^-Q\b&\D\YO0"yRFސ4j:Wx -]UuT:+lXs)^[n :lWo`XTaGJ;5$I,ե,G7Ń­5X8Cv} Fjgqg}ZMj]N&R>3=N ԉxU8xUX"^y(LLjhw4 NVKBvBazq* it1`ƶ|jmaoLrpzv:hUq"(u# )>qT*1 [6=];;Z-Hp *䶢y!m IT7~ oӳ3m@Ha;TTΣfZ$M<Ѓ1X[|o`߾9Ycs ]85})\~S&tecǰ L$`1sćEtEnk{ !kY#ˍF/D(1H9ѝ4pV@Ia#(eТX8,,ۑ48Rx t7j&OT5P D߶`|l c*NcqmP7`;%"Y (DRR >t( ֛xGq}66h]pϡZck;58ylKVXa(E*?Y*nòoeCu;] t,֭:91`RN[+kB=Ov4% "0 XV7w|\fԢ`GřΨ P%q"zB066NagwJhhOք&׳F0|=K5c# gp] 1?xu###j؆R*ţ! wDݶ^qQj^adt V;b}s(\O/͠nA⻇|>:O"q6uj6BBӪ#dU/C@m ((h4j|+\@#8` -zP;A PCom4>_#1JjEӧ O^G?]I^ mmm!`̰;HңjRh߇J%Lmn8Gw7Dv1(h/WLz|/+j#XXXl Wj[VDn.2qĮFZ0MTyEkAuu yEGV3 r98. ] :.2LLLnCיxv8.9{ k%ضO(0>6vNkh훅exu|ޕkxwnI%auةT@] Sg%L$l[ 'Ouonla8w޿ZP2r, SG4J%$ X HoM%: hT^]㺑|f*b#EwҾ[ŒAR4fn  PY.zTTwW_#: MpIlnm#@_W^ &$GVCPTBƲ,/)\JA 41ˢ0PI}ʨ,b^$%.VARퟟgn*uW}[qX*4-PE!FH?Q|&<>MxD&:~ JC~o7j6ȣ(GI %LMׂ[?x7K}oaM۸|3 CBvOv5iK`ֶG05 |;/ 7/W~,n"JVo4&{,ömt]<I(sjNy;Sh GbxSJ1*'h >G&A]c& ~hfqԓډR*+Ÿ}.8]=}L˲ 9z tvbU`!@hJ1v#T(D$%MGӅ-iuP;tR(JۀqX\u)4ġp{ XYۀfs BM 凰S0)v.kJ*@4>~o,!T T묣ӵn!T lm`nRy>x?n\c;Bk!qke t6&VVxxulJFj:(HR, >n,-3A)t]GLp.vE:1X7xaxsOY__yykYp*)7`^wij<o`3:.$'Of-!fڑv5j?F%1CעËHı&H?/8*=@ askK>L:+"j:&'l4.:\.=A*6d?@ Q- \A(@0 0IG޺'( q8/( {.$(U:<<: ZE|:ÃzQ]MR$ 5Q`F1Ϸ,?Mb]';@t$]ura2r:C"" F>DxqNv|4 A4ҠˉHFǏEvE[o~AM[Mi뾠`Wo`@-7 %;T BE3f 7?~c#ٽڕA4yh:4MG8Z q$>cs<U6\ݱx|!RIY\z8y4Ȓ:nf}WO=33AA3,%R)-ٖ G(vtP!SHb@>={Uҵrq3ޫ΍讪7o{{PUɉqMLNC*!8c#H%xk1;1F~@Qd%h64vEV9j^|Y^Zx) f&ffR~>+U$q4uBK/`ieU]abΝn{9Fɶ)۲C{AI)4jÑ0DQdIM̜9q X284nݾcYkk h;]yxxH㭎hx̖)]ia42'%BtwKvNO7PϜ87?(tsr`sWm?!O ^_~:=:ndYƹ`kkb4NyZm^u⠚eQ ]B/qs @p/|]k胏=_kmg׊fot4zATcBAG)dY2 įBEx9)$IytC}?m2ˊN2,#Lْ˪3ul];K+H% q .|T2`0Z(anf|4P>կkq63Y 4E J GbfɃy c/W@$(7E @@$APD½MDbvj|iڽuD#! ZBUڻD<IDZ֡lK ;F, \=r02,"ikG5INsBImj9uO7J+{ |hd>@;=$b{|{.m`zJuF-6n>.D v)t{pPo>=燩K~(~x|qG-!agffX%fZ+7c+8SFɱP;yS%)f `K.sht5<ڼwEgP6檛`yC|FBh PX͖h,rI E|>|>;M>t+Ll;H%5ZxKXY0,EE2p"&3'+&SIk 9,LO /_{w6O=Ql!X][G*ýux,IǢ?D<ݽ uV9G 2BFY"@lp]o^U!JRi,/`g/ (11>r NI8ԩS1{UJ5jBNQ TE5%d =AH86XjQ!E(kŗ.]Ɔ՜ Főn߽*", vڬ=8p紧wvpp-V}saii@ز.fʬxnc'n{kkkt[U]gг'WXUrj`cxx">(Tpn>IqIl[f{ZbK>~G'hUh𜖬FD<@XFR$+ 06> B850zBuR< D;{9Ȋr66A)Ǻ]DIFZ0b6v ВeMǓ_-P!H`rl{k(H%xcEFɣ/@X*5PU C褦Gqsq,3B I2|>DID)/2͏t"ᐱCAD\c#l-S f_-ch</Z.K'bjrlo&z||=z)9c=ɯ5qH؇m@N1~QVa| =,Jqlh^wjd…\2 '^Y4@P0d2  K+@3t?(J ۧ IDATS'DtyB!9N8n2ݜDSq 0I߫ջ%op˶0pvmMRRiRŒ#nf;hΛι8k&.Dv.Q.qFo tϯNI5]lAV3' _ks*]FړA\T !'={b ^]͇'yhLJk|`G]zDQK~L./+M#'8ݸ E5& J2N;,B &)<.Y(JC0&^I+?@0|FB+@QT]b{\;;pabڙ9bVE\OAxgHd'$dYvMt&l0VApO̕0nɺޜPE*JnX_Uѹ9Z(kkGm/[CR6ŅU ,{K4,pxV :-;)I߸k4s] aEFTdak7%^& ^>wMޱi~Ǐs3߻9cT;ۇ(X{>̩ 3i4hǏޮaUUuY+NM,+TXnjjʓ+!D́u/ٳꑇ5MzKΡh(Ё,͛@P+2Cv7넸㓟ܹd4㨚$\N;NkE8Nۃ|^H/T{Q8\X@6_,rF]Jba'4B:Q΀ھ4\'4PG<*<ϭwLv3ϼbC<$z;ڽyN#>X1!= @Ki>\C,#o1QWC=g<AocӍ K%nT=tj8֔2Z f5tIPɠ r@^֍ r/.ߙʜܴ\k<;h>8v(,.9s>w Z~yxthYmOm% k|zR8T %J8~(dEJ) S,+*$IsO?U8iHP(RߏZ3'cmc GmIV㹏?7^$v(hZ(i@KkE#HK/?;>J]ϴh'z;?TP6 UGt w": ߧt2 yAia%^UU[=x<8o7~/7޵jhD ڨ7A 8̾[ _g޵ٗ_ۋhP~1/g!S"$Ig0S⩇Oaye񜶶UGqo}Nx)da}~EEjc~Iok2( tNi/1^2Z= Qo-=e3]-Aok_kۈ^ 3cDIbWD׭(g9zu qAA E[[`6x>LMN\fEPJ07-SFcF<`lhTx$q燢|~##èHx-Q` =4o,!W`tdWqjMBj 3G2Z- K2(e@-.hbfr\TLbs;Q hB >A{o l)e%D-=(*;bϝ7nZm7-"6* racTh66zvtȆCaȰ'djqL_PP;هmt/=la2y OVct:mőL&YwRu,\.Zνvxx1fv7ZZsvi6KBoym:f|ܼOOOk @ x0U+A K|.KL]eD #z9ةjӌt_qi0yQ6PqaOw>K?LJz]FG*;v'htt&#;=jNL[('t Ȣ׷Ё1/uARO׼HXJUcLw\8>u ;;;H&O~%ܹq 'jڶꀇ^c3'`N?WG\pOǮ XT[33(jIWJ)ZuD$*hhp!e@)eZ(+&)tRI4Z(db{7!*yLOclxB +sX^7oUY^CXFV@H(t*|>&TE pHRx:EZbSӭZMb D,CD,( Ԭ٬* P pcgwWKRiTaok/6U}kCP5Dq<{DӾ0%IRiVJ6%rp@G$sg.EQ9S(}(+EA;^{yoվnI I5EuO5p?.^8+d˟n,@HIz?jyFcthjץV9߿qW.3E/޹C]~}/`T" `x{&b;]ߓuU#tFà~d"hߛ{0=ҞE.!!fc疔x@u-f_:&騅>  5|(H?_8$^T S]4zZ%(J@ 4-^ҳ"~?~QKx\?{7nmR\..e ZJ @b  *ER(Z- χJP8_ LD"O~5ʘGQm4Q116 IRp!\qK Q*WP,ȉTaltuܪ*Zn"8@J>ּL6jiLO2@Pc14M j6^eBaֿa(R0'h|w5.>48D,C?$UF"Q"ah5yu"8ut X޳j;*Ag}9rn?q8{/oO:`0v9n_W~CGΔ5v;=Fgcm sڳɏ=?q=?F8Í7smWx i566MZOo]㘟}%-"a6 N%x,GN^y㔦RIG&u/Nv,%A|>KRP]|z{ uw_ۜk'O{*rG.k\~y׺]t~|.pZI7ھG㍹3=4 0GD<3h eyfxp}$nhz>uND@0ВdD$H(+}Eݵul` =q 7zR>H|iTUu $Ic}{Ajѡ_`d=Fc#T*O Gq!GULM!ˣRjTUЗ\a? -{#o4VVWmh&ɉ [_w_k.?kv`3$F0w2,]/ccc(piU}0?񀁶8z_91iW,]133Cui|:6 ,{w8y$j@4Wkg9s`p{{{:HI*@P0Qvk}uOYIѰƞ.v=^T.`)>B޸Guz1J'f +hdw9qV&;}0KˊпrMZ{_K/?ktd-iZSSSZ}z: Ӵ>? v\yt}Gmz+"+YNKIqxٳP?Cףҡ38\6mz_N턶9}!vΪy"6A^.`zGjllnTh|! @@\fA,D@$1Jack,?BRE @VGрD*PM`7(eeo"/ʹSD<[KOn6W@<FW7pta}>KP* ~ۈF#@Tn%yG:FQ.07;|})  arlۻ{8|pLҪ B(dY±@K.ʥ|;IKVAj|ͺT& lcjkhrr%ck@sWUUk]n'XռXx 0*hD"xݻ߽l.oT}Ea[5;<~? N ctVWڛo[D 'Ů]۳:κnQ!:u<ϳ}}aA.9wm/kkG6J\wS@ `cǎ:].ϥDd ]8q9y-ٗzA0HCـ$)x$kz|NE"Edry DYVA9pH Wj y?&#LX& > !e`db2F02xіx?]NAÇ{u?vj&M#|$Y?I+?q"! 0/1Mԝ7 /`P@ppZЗCB:ݏJ/Zft_ JYNQoP5L1П(EshdˈF(TU;p??""W, 8ʙTB)A@K 0IQЗcecG![(l.zRK%PjeȨ Ql7A a{l*J)N;]b \[gǟ* W416ƺgZ rD+$f/oSI_s]xA4ő#5IGz[1S86xv9: Q= t^Į1v@$:=gip:O2ti;Tɺ<99Z-@\V4!Cz/=if\z4dY֪BK;:A;8Ba\}Y=t5z׌ v<:fZ/j:Z q/uh!OԈI>u$wv]U> [!_(8by{)<= ӻsO:(-l먼ל ]@cgw/,_?9-crZwN8n6V299R`/]̯ àRUՕzO>{oՉ^ҵ*<jI&-IdO{b$D֠=(0%[rh[)œsM h4ވ/`1qM0=,&,e<ȴo9ӻ9!g6jumqf %Sא% <}9MZx,|;{s34@[Q3!1lK/<7n8GBY\>^&>$Zz=_ʗvofS<({2oXDǟI,-5\e2L4ɪt_d2al  9 Ξ})l̓9nܼٞqJ%{@zzj bAKp4,~ ?}2ݳRtߊ`0xiVLnS(4dY ʶ߃p8lT'3(oOuIޟ:HhC7l.~뮯Ppx)%~YVCDQ,pwxhR В /xD#ApYo@Ue\ַ3+4GT KU [80=;7Hx0@ZE"E @_ 84;-p IQԘܚNYt~ܯy,nܸz_quR$GgsѫwY O:!<>:zA^0uǨSMwfZ `eefsYU8k`T6-82,׊ܗouu9E<#TrzttC8zku9(3O?e1&"E^i~ǡ`F]F_w0A#_( l~_pkJ1:2YfC}(l)Ryp\ cqG jb2a'`9&[- ?+F_ h`gV7HF|=[Ad23̀5ߏ3gN[f1}iy ȫ Qpx%yۜw ˻øx6܎qeמJ0?7gsgbww/]2UԚaBH$LHcG =^{ 8(m {HP0*{X47K2ْVL~ȩxwu).:`1WY-)j64!V;x㭷 6Qօ#aMo/P@p_UM^Ytmmt󗨺=dZJvrlDW󠂠lBf@ʼ5M^&jџN# # 8W/~\}B3zZk}b-QᘖYDD @4C^ W7Fp*N;߽am{Dp*xY :>~P)!)Xp Cs3@^~ ohar|Ϟx#XZYG2C%bpZ>jL6CE*`BJVF#h68~0߸kO؉)va.^QY041wZl!~,kґ]yԡ Tb/_MOM2W˱tdG@ ]}΃-YtR)I?O$}*rnTI\Hln:t: I almmu03;w D0Zx4sOGzd"UdeȒx,Z)G(D"6Bt:AP.1Z-C}XZ^A|߇D4r]%a?g0EQf:U<tcxNDZ }}}N1nz|t._W_ѾJW!~h:oPy:͉R =!BL8oj]}oG8 Bhh b(*Ն<߼AD R xcyk F%ȔȒB8!pJCC ${L! *!J"jM$!cf:T I ](֯_?DZG籾QDAQs(?k l.d<qsir $c/iܼ'/koIQ7HOU%ժ[>JEv3uUw%#[Ǩjᵿ}uUMc3m#]+xc ʮY^g~w{}ݻ`>YێrةSo;k Bh&O(˖}F'XT`^tΜ. o8w;|7n gQ ~=kɲm`8g;ϛVHCxW>A >a=Esh4=nT*Pd) 9}vvjv}CI;}TJֹ?}um `}Gu[̵'u@ [OLAU_n#_Rv~i%~F z$T?~{T>?y 1-#vnZu ;0f#J""_.ԦdNW|RTQ뱄Ӫ׬,&Jak{ C#;:2x<ݽ=Hh$r|A(_(`gw<τ0&GC_^@ ~1=62Q + =rO]90<ЏRj!b $YƭŻ\@Pxj5\|$2nYB_*$ӷ(0?? ^\@Q>yJ"vv)(K"~DeǏb߄qyTk EJ K2~@n(Xݫ#_@mE8S'^B@8b7 1A~ c=tcDLծ\ӠZݖwB-[Qk_W`wwV ,tf0 گG:u@8e]O='3Ṕ~/ h1 4cp`[}cG\Y|ђ,g'"=Œ@*VWAU X*P3QV 7o/RqPi#/ hI5Z? JhCC !K`vzd K*sO b˟hP:LP8)V ֍%|gzBTdp-NsQd2i(Hq' 6[czNxϙ[gc W;q8wLmI<n~Mn_-Q|*B0(TPP SdעTya}3]#s=+ix.mg>i`wb8sS"8PZ Rj뀇9~<x鋲ij|Y NT3k|>ۂ(}IR]~MU%PJ07ݽ @?t`2anf{+U}~|~, Zǎ:"0-VIkUwKg>?H9a/S^6*.=-84٩qlbuA?**vw I"*2$~{5A6vj V,hb/E__Ϣh?zMp[-TG8d3@H-PEEbRڬhlfzqU;iVL4j5t)J13=RYQP-Ǭݻa$ 5*lrF3xΥCSmX!RD1UlngPU&jn-![(# g Rޯ}?z s#Xk /!arts/<[ '! b/gIe7AU  0*OC8\ʹ3xJİG$!ablZdV J~͖BsEz@*@р(w]AUUK챺fEu:QAk36 &j`ppHm2}hQ`u vM}A;koH_xRlnu IDATmu>gf} _k\AC[{VZ$I2(:dYB(P~M޽uaȲ5֓ф-|潳jahpБWLbe=z{{{{"G<·Febnζ}5z]1WY쀇ۖN5t גYYm3=`YI#3u).{^kZ}TU5^hԪ]d)&NXLSjkz醕$)Ảw>Ȳ'[gD.mݏr.@=|Z#\ҥx[ 06m ydÐV֫w`ͺ&h\WԳ4.\p7NH]wW ov:v3º8lmmψH^"{ڵj5X[ css1@a;UJLps$-!:x;{YH `ttHRK,]$YmلqiO'!RYsJ Ilp ^\F*DTB F FPhoZFX[7F*n^ $b,>@Z`.c$c"GW_{?{,u~'3n7$Ap8p8w8BZEblF˾(B!>(F̐ @hJw:6\q-y?sgNag{2?C7P0L6 L- z ^z9ܼ}hɒ6Ca:$bP PA,jpr/yJ% ܞL{vvos޾^\vtj{h'6#\|-(J2=}l;w{ w4` !]{-ƄA+ӝc^ru}~F{vvvۂ_pPR$hlkF/9ƕa}c1^yEYaikC|l~n[[q sx핗pGnk7`@|=x,騡y \7`YV8 NAu|[+B?v;dńcWKoP {>jFQxmI 0 wVV\T`'Zɴk",<$)K1=Yij̯?fwam!%m5>{ <!\jk@Lr9:StC0j-01 q`zz x aZ&=t Z (|@l6B<dIdXŹhX{$Rb8M LOM!Wͦ$#,GLA CGE4Gch'.bmkǣhҩ$&A(Ubykͦ\g.Pk0 " NA7 Qg* sCK |096juG\ ajbVkP9JqCfxpwa(ǿr@õDQA 0 ^266x+ʲX]]*ޱņpL ٫N-T ʈ a8AIuE>Cp1ds9G"1'DힶVA~EٿW-b%u|xagCs!?!x|;A֊e#P\U}~dL6bFEa&R4prs-i"?09#fXqcݫWB|mͭVpGviuc煆'->J~l_th$  FaZ& d+~? OI =:n\}A(r~bOpO,ѻIT AA .*ȑCƃo/DMjlw9'Z97~vu쌏Y,-.yC 󫿂]=/9rEzl^EƒB὆jr΍GF'yU*Bb! }YQm5!vwv}%CdDMpxK=D{rly[R$ı:F}m >+ 2yp\Ad@HR4%d98cWk|,Fc0MXEA$,,c}}Բ`q/`cid*t:; ע@D I:G(+hj$CQ"xIu?>}Z }=i_7Wɡj8:7fSG,į4.~xi6RI W([N&zRB7D2kWX%g'2:A<I5:P x!5hsFu7ClOq^0wll qjX,Is-݌ aa*&D`NV!$1hz/vv@080jd" EQ!I1>6AVGZ#*# (LzSuf7A6r˲PV1;9x4rPT"]k""*JFyiT5Tk5bq45d cc#h6uD(nܺ 2Y-qDZ{INX&  Hl#NP5! r/lֽ ڣ9*OcpkSm3ExY^nUXVy|^]?鷫scŇWZ|nfA2{ :ן"tW"R(˭CY.cLcB#CC$7jkMͽ]W5MDadN۱nx k[G_s}¸X*bss Dc1^ylH2$IF,J ݠ'&Xa!r$ôPWuP ɈǓ~I,/.b?0vrAiZk Q6NⓏb Um(ֶpbyaTa~r; H't j$8{^vg|aT_/P*W0>2oelnb|twgY"J#jՙ#CN軻Cm:*ܴX`o"H$0j)bkr9@mwz!JT`PKtzj emU,\R#Jk344WMyct>`_Owwǧ8VdHzؕ[ƙӧZ蓮%jVȳYwoⰷ}u An"x9z|s9YGG`c r0믾I[:^?&o~7W93O?>6kzTUeL ;]o̻Hcyi VޅbEP5uդI7TQ^_cϞ9{CvM 'X^ZD^ǛB"@4V詓'!N ~&TdtxuB-f^(K5zǕ.b*۫, `.v"HwX㐙~,qދcbbA*q)HDrpNrGZ99Й 2ږ $H=.<\$ya0ڞ!D30̘B ‹,Ձum[]‰7& Gt| D\ݢ.Eڵ:qum C!,˰(uMPl ¯hHx=SQdAj'Ou9FK'Lc'=~ɎO^DCh W~X|v[xR \[el?.˲;ٝZZV6ģwy3~9BRgl7z Amqq`Iޒgcm‹@J2()AA&099ECK6*N:ݽ}&At:*Md?@3LB˲pQ;DO&/o9\v d{,RI20cs{HĢh4T EȒ{,G9ћN!ZGR%r 2P&t2X4ir9RIry<ܳx%h1I @MLMN _c4SiW(]le%×\QP)(IcF|c1T+ry*ٺH&N#+.HgC{g 3i#_(+Wsk$"A{awo9sOx_*nRH'fru5 wuli>;N_{&AV,cIkmvݎ1N;k3l{Ps_ta= "sđo뛮kmW_yw8EU>OEŻ =G8%?op[|4:9 !XZ^BwF0t]zPW@!i8H1%+ F]fR/afT*lnҜ֫>7f ,Mȑ,ƙTB$%)h&A xd UҽC&_sgIFP/^zq| WnTa Wn`qfVדBR@JA %$b*޹rjfC= <K%\8s}? d ?Cm X,#0 WiY+_] XY$q>yۃkAT9ߝ|SNb@g}9 C^v0 1qD 6[1#><$ssp1%S\]R)&Զʏ^$$KK]"0r͖&ۄMxLO\a`V2y2@,2,ʕ&''0==l.YXwi\Xb{w?JKdryPjcXi:zx뻮 l"_(8T \1\|23 c hR*ts'VCtLO!"CUT*Pd J}izeh@"4U z H>SiD1ܽwek_y~sgNaooDr |':]7GTUu@UY!K<3 8>Tu9!8}ꔯMO>8667p\k׺O2CHVW6CB 5oͿ_׿Hx >]_?ƱrkwC#maVKKl{E02<|T*X/]'`> }5ܼ}*JknQ+MFGQD lMST©'˃ :߸ܟ-zjMOxr:2uE)+{C'< .FgfmgAEqMoMo|~F!m7RbSkvl-̟֔$M4<<HLD<n 0$TeNtH ݾ==iZ 8btxC^3چX5R4((逮F$-Qk:XŚhtKB(14d\-PS}w rEB@"AR3՛2J*hj:-̠ZSGG131,ƆP,WQo4075^gr( $h6T$cqDdfZjӋB7 D50>:L_{yMhKtg'&jϝ=}TUA$ /<%[ ?-&&&D6dϷ xR9]'ՁS_x066Z4LPޭ%z66122]Hh4D" ӲP7011jδjy3jQG6A LMNRDznD"41?3k -˂,ITx'a&FjbfmK22 (`:TUGVEXBeՉe!4Tj]@IP >@Mlnm0MVE ϘUmB"#5Z- DAVb{{{lS*$"D(=B$ VRTx7ѢUcz]jA4l=6I[GRzչ"t{O.<흝ƒ=%fZ<6>XE-Bz |Pdh\o+@̀fxɏ.v_R-xҥX,/}G?~& 4X밒$t:#&q3&3`SGVÉLrT.4; q=wkk ùo9F.sBеT2ؽp?X۹ jKPJx䑇-qM'U\f￸0_{{z_zK !]PN[<sy155ܓ 8ĕ~\Ma߃ Ust<GfFR0$,LFS) ,i # {q ,Ms玡T"CQdn󧰲tD7Vױ05002Ї7W0Г,*=sַL$0߃,f'Adsyh&L$vw\^(}=)4*:ܽt,~GvPPQT 2ωIv:ĂYG*u{=zQD˷PEةiz@y`#Ȓc%GjKx;[?_gnK'#EkR\ +˾ka緥R v̢N>vw =RA$WU|*D"5/H8 alu&@3u^0I@a@4Y_Q 7<_ =>boK)022F޶N=އ"( P6ݺ >hk8rp3*x0ʊEQ`CY@L(߃e_v4MM9e $%I'=D&>loﴌH}]vL \IZ 7?TqI ~n^7T4̗mI@?똈Fdfr]DmZ#(KX AOO/>,W \ΞKvդ(H&>,N;'Ox$ ."q{z+D"_7[4m'jm;lR 1/!B=T]nCb&Jc>φ W ?hKxnn3p#ںCxZN4o5=s vj)MH kjMPV2;᳦&'܄K9 B bsIt0Mn ȊFzPrʕMz} OE\u'.cgwh4xpmR E P{r:Yi8w4D2 xIA^D'fi8r9E\ 1SPi!ΰro;lÊZ $xh:L;l{Eoq }>4qѮ:$!;?O A?#<>5e푐tGGGPVexyUv3t'OG/"V:ȎM+$];1-,,஠ngv-:DIvG;Cv Jղ ƈ 5ef~BMx6IPj3"RCCdP,Z(bjj(+!8rd B=43D4@\ _|kX*'jL6!Y4sȞ'4nYQ,DSP;o;hǎ2ʪFdYB&P?nܺt*ɽ&?ȠT*"bQ˩LŀL@A<\SR0LXV+(ijS @ &k TUeV! $ S5Mw\bJ[c$ ², gSi8䕅 "6mZMh[HY]IR,\qA0oؽ4hof@=v33<,xG+fP?QzcMxtYqÆ=1==r:#Ɋ @g^&[[X|;;Bʋ_2W-*P c#.G?G-RC;/h65j X: ֳ1ɾ;}VsڋrS^mjb|8[[tQ.^\ '~uH"[]`ٳg$JGTr{eq(ǐ1;aiZbhhj Hahpސ$SNNb?CCh6h4T躎Allnr MYߢ(,Jy?$"A;o?n,ߕX c0, X4CT3gJ/MNN: Yn>9ۈ?? H}|om  $c2naSOm :xȑ%AQ5ĹH$ϺĽD j5*.p\E|Aq^0TTJl6}ć]k.}**$Ic.`ww8ÀF"85ɵ#vYiߏ__Ji8F쵝=<8; `6.ZP7cXj( s\u4 θI"s2~sSAN:}Fx|z;#=+[oF=JƫDcyiA$<湡89'[!:B%KFd^`[£NKxw߿3,,,X(D'h xᇑ/v)̼( u{%&J)@$ I'wpGQ*{acltE|Uh%چKVo"X*p @)>wa\7uc#2ygpg&Q,U0=5.f_R/KlO` '?(%FѨ6ϼ%W%IPOO%t%N]D 0) Z M 2o'x'Uma%(ށk[׆ۮ#?L˖Zs\.ƑNv1u8?u=,+l0#bafpud6{l 28ګIx2 ⭷='*6a!"юx'ɉ <ԓ~<+O`pY"@, sboőA_2.Cft%q |`בě7~pk䁛O? \.>2W &5 t Mᑶ%8$chh*lj{( 4Uk65'v5Zgqdy;PUȳno&JCjQ$$=$JP Ir,jT }ӘY7H0${<^CReH?(5qomBtZ8|]^_]T DѓJf&Fp=X/ SG\AR0׃LU15> dy  V0t#J&a򎚣K R$"~E6wlbyqDsOBbr駞 `R/ |YkmgS%"5w ckA$FH8ĥQ""o >q2+ޑ_?x%i֖?P?&p+qk&[$K;E 1,-->dF@,^>_4"e^UE/H<1oӢ4aZyb=xr #D:ю$!b ,dIv!B0:gFY;L x sE4V/N ?73Jvgǧ!-# ?6\f3|c%Kzd2Y?w{6":n6xqlZ!22AAo%,zY\a#&Kz1*k_ qGVJaY<!KUU/H2T Ӣ8w,2 Bv|96wX;`Li;jlt k8s$J\H2FF:N8zT2D_o$ â(JtWYx27<Xa&CȞk~P,b|lCUGF s880%˄"K`aY&'ܼy (zz(@D47G`z=L,//!_7a;VDy IDAT]<G$A___T3gW:vE)#P dXG-e[t}"gNܺ}kkbHqYv@#%<}^\K&\0 )(Anm7E/,LEq==^*uiddQ3enf9ZYs667O$P(pAy'eBA6Z51G:l ^I!\vJile0=6IlCTMESm"Am6Na:(y4u E AXFV?+ -5|Ks(K8dQ׹wޞAB_Wqu ck{e-̱x,FJ)+zh6ế,;/ X{7/GG[D7tu Ο;ݽ=W\b eS)Otn_p.\;[F T*4!2d%%$l5"\D"?? >rTb M\{MHdYqV1,SB%ond7vgy" m ^{"UXNi JQJT&>>LHL| :IaQ֥c:)HIQ+#||I{ң[#~fV'<O-IΝ=__{vBcx˞tOT*X,t:JʶnnGc{G JQ% ;cJ޶_כnq9;Nuqd@PRLlpS@oo1+!"a|l2^ɒs^{E֑!amDB2aR)ln0L$L`L\Fͦx,B䜿&./w$$Ihj:tp"'coos3XӲptyW\!H`jbӔzRI躆\.d-> ւң [dvfƙ?ZjZc:nK6`y?eѮu|tz`jo}ׯ_w;z63Ӑu?A\#vf]oil=~06 6ǣ>HLyݱ]oYtO޽f)pxs2!ץbllq|||f_KY12Ғz c8,``5VV9',#,|>C$9 wWq>2McK8i"aB #AUgN2W|x_K.ݵ_"A9@KZqU$Bbf?\fնM4~9b,*PY[sH-+ 2L z׮_dz<5.L`lKՊ |^uX v'>B,{5VGY""slx['J!iGщh2% nNY7ӓv|kNyA_7?"u)wt&=;hKNx3Ozx^rJ=X}a хl6M:K m0$FY^)u4Xۂ1"lX{k2Ǯnz套p׊yn_/11T-yv&LoNhIV!*b8=Yƭ da:um>9GΟݵ GL$u^#1rbjr}}8T .=A08:?L&`rbc#dsan܂BTaZ`Dܺdq^ )1>##(30ұ%|"l\Fc_?xkM1# Ÿ֎`l-H$ɼa.OӒtcY#TDcJskYXAs\0$pd1u 4u{4£3J7Ockɓ'%NAc-6 77n:$nr)Gg+^Uܾ} DgUL[ϟ#i7$;|D"׾7oGH["d$'!h65 0BxNR|jYs{y||tA(~.2HA-u!<5>xS{A+' ?Ox30f>uuR焊>u}fF.^8N/\Àjx<*CʴU)UXIsvdEq`@܃ͦ4aZ" @&C"GP(aigN$ vq`/8dAMEFD$ 4uG[D2 081s).Pj"Ԅ5Zz"ͽ$$$AVK*F5ee$ch llmC4= S7`:>qB*!@TBXBPDbrt|t,Ͼ]PU |AQd4u4juXx4Mס6(Wr5 8~t bj,r<08Џ|A:EviI9]ιøzϹZD{e33( ε8}攳N o|ϕeSM||DHҪ!;YC5BZ>L]9W_}wr)ze<]Fs qmMޯT* aׁp(f܅}>3@*f{WsR)8۲p]Ydҥk|3OѨ#R173z20DT.\7vUt:P wHb#&1gI` WE 07{=h!4!(t˲@#+Gx]x q+qJ Mͼ%_hXK^ձ̸$ 9|w20L0tV6" Hн1slU8Vt\4@ߙIXka.x,TUct~+. ^T%.sCkkH">!?$@yi%^+Ag'NJ,؜R*︓$It|L~r4Moɐ#,1H>$<~Ɏǯ ؐUnbwD|羽pp!t ȕPf k׮b}}={Wߟ3m䉓$L&VGd>/m3%%@Q5_p%o௿/hs`X,g0xrR@cX]]vKɲ.:y{h{LJ&v ?6AcӺ֒*X(PkҲ hbffzd] #]SC$&!h(4Cv:hw:dh;0 4vPLwTyp@|ksACJ:h-Džm]&4B x1^)Ѩj㑋g`=ܺs#<rG(2&VǮ`aqSc#38(6&\Bހ4TU'pۨgLfeZh5~*l}t,..r&ǏZ6p {;uJ5?Ry"3x:#Ƣ!ޘu=B&uD~K7P/K_Sz$I|~2 lFZ̈́;Ñrȑ@ų~ql'_aKo???8;.Ks%Q}>flLVYH%Gl\l&<ˤ<#/P!b(0<+*d2\}?|r`6H qTEg(_𞃟Ja<"e S42>8P(nqB'%$07X}DxI11)"Ie^PQ{5iڧ~K]7p$/4O $<xHxN<ݽ%N_,۶qiObjpv- iA8]07UrꎔK@_bX($v7KZ0lU=+_1ymI-TTUUk8}s[Q)dM䈂;wLNL`5=z* pm;ļk ӲpY>y7}`pޒV7099;V:J"*t=%L!N!`Zemn&V :I@G+&knJ0>l6ds *?~u@h5HlCL]GJ )A:C)Efgfl6A{ w4}OD hqv LDۅ0-P4ML*ה2J`X&TB`Y=ih.%>BB}W0;=8V 8J|Fufm-ӄWI6 ҍoc@^weue9 !A

<8x8~(ySoNIqv?~̓B"VS >Ä5ضm~_Kl,DEN09 \ҥx#DRןʮA9Z=u63g< R0{9?wϱyo'%% 2aPɻPQǿ/+"nǑ ɰ) iΰmV<«<8.Ls*Oaie lum(.iPJY45( 4P(`{k gtq,6w:\^]eYHi.=| ^M%C8V6ѭ2)蚂jq2\F@1c$IcZCY IDATFXDHv9.VVפ/8tx>iz l;;)qEolBU4uIh(ɁXp&E1grj"~ˈ Ax@"߇b 3 $Nx,..01wpceu?xgK:pkb(ϖexkbO/ɫOׂ: } ,&C$AaY='u MLNѣI&+XC'着l5O/Ǒw">[ ( ۑ{`fơy\^b0>TT!}WrNPFbRyb2G?mcSK/pxlEQ`xzPgs QG; "ҠP?a7^/)`'xHx'Oq޽1ܵWӺR"1uFp0'5,k-*&4 ~ta\L2q,~۸nd+EI&~R*ǑeYڒ xehzUNg@U՛Vk( B*c\TM[?K)f/dsk[&a||{brb4Ο-hZkjv\R:TU6(/ ۲C^H$by==Z^"&a5AU u+/}~2ku91BNjRR J|l6dUa()0@w62V=#ʅHhG&S:!gCJv)fpcǎR:8&'' 3)ҕ)=ǡy\or_xoN$=^v$ _$to$2Yё ]122nBuBB!$! (DǷXPɻ;mE`l]hdd8Aӑ]P33\q#7:: fZFiC*"MʆχcG$Mr$uo龧j;{1A IEGy ușrhHRC:I__Bほ;vݻ}W}MdՏUnyurLy$~f#p)EMMMy@Gs_zq |rOR`mc Nw*N<7ou][^A!.fģװ, ,piϢjCSLGh;_zסM%`=(Y(nܼnv^˯\X[[ñGP嚽;ܤVt iѫ&hE!8|hLKh렮 44 8)0-;\p[;c jar|NB$DBuXlKeAAXxb:{6 > {ll4^!obAćz I}c ">nƭI^BDzpE.I=BW.Kg>4--aFS'N9կ7|+@hZpWvFF}+#ejw3K"ZV,QIP,`z{$/ﻈO<8VV'i5.c4x ۬dqG~G?ވMv\#0OxN&lUxl sS .Ho9F"d\N)i$FՆiZp]`tv- Sѕ(*]A W wכ7ʅNqveԥb eH),uAƁqm H1M%ȦSՙO_~BiQgg~n 8GmFMQ6Nim`,vE.AV3':^O8.4@!HZygfmeF7>>7;bk[^|9ܺz)fiwh&eu]G*BTly%j5X\|&{xPDR{ѐߙBO^Hؖ &>(?/_]†G T uLdJsaң\.h0ϰoZݾsO*%i?yʄ .E ?5N'vL>%HDi G|;蓕'W"{s',y cCˠETFFdX\FNc~58$Hً=gRipw|$cqd'(>ڐctp?`- `fG$_y) A)He:o t&<9rH-wڂ}>,޽/CRT.^v6FC|>Ps9lmm˄4+x~W,NYVQͺ5=s0F=Z[6..R/}9|t.* Wi1ϣ2R3ma6Cmb} dSmt lb[-9f)3vtKK J3p`n{{{ڒ~fd+v z=JE4HbjwP,p-olv f8:63@UX uA] )En pNx[Fx$(ۓG4m\ qĦEetȩ2,פͻoG&sfM p \w>mϣO `&~+y$Ao_yE 9$o}x[5B!ēϊfVMڔ-Jy$u.Nr$1y)loo/;xϾx76$'|:u$9dYT5S:v$ucrס*Y|@u]i܅^I3}.!2~x1Q17;'2۶gW~F7F*xkҒ||}Ȕ$-@y'<:v",KxkBHl*֚Z&8f1994V[seA]h'cgw L޵:򼃚R=HR*d#bt*i]it@mk,(ā@EQJ٩ UJtn/܅(x@(EwWJ(榧b>-l¶L#:p]j \+kh=Uk0{=TF(注P0  ۲ `}c^?._G2˙Tle!M#I,0::\.F=ABQ:gk%Ab7W|$ 6 Y q +!19376j5[Ԑ_Vk^dpյhy XJX/,D@4lIOd; F \Ç:ѢdBeҗp^ܛ5Ɗ8(o'^Nĸ$5a~{qO qYY_#Qb /abb'::FUY,S)IjJɋtAA>" ;IA|.C_i)H'BZag{:}C8LX:߼!U}>! C|J KBx|ldCכoJyQk_l^>< BRd?0RUC R.YEV~td <C<"$N~WUK|OJpֶLH`G&'&gs҅p7L ܙXBen׀m{wEo²,:q{:&'&[G`Z6wvJa6Wq,,.bk{z J]8x`j [[۲kW? e^JפfyosI K7pgRX@k>t`n%x1^sxJ&cc7gksC$4,1).PGBuwԥ0-i2ñhώ$z`cctv]t?LK^ <%mռMy G 6KR`Μ9s ]HL(1G\lnb׵kWOA<D"s#U$+}k]sM&]I4ҋx}=PB<'|gtQFW JC|+‡$:Dž 籵K/`ss ,-+/} @n^pw|tWm+xIF/c!cb|,0ʢ{IyCR.'r^G6~7}.0GՂ:VILA{We4--%d3|Oa}ceEI>ETt8^YXyF 【pgqWUUPl(V9Ulbia]u>tPeF<|y Ӧ7A>CJOq=O`oo\USJ8ulhe Ѡu,.,##uuucu4 ?NNNۨV5bZ er? c&S86tJ6]hb܂(tNVjw:(o?BB!Ǔ_Ï~\)LbSh4- ]N8I4MVL& @>/f,"8?~h6%I&H4 4o ac%C?(u9OL}Gy~nnT7H PoV=ckHu1O AIm,>l) Z*%[u=/!G)yv O ^Eӕ3Ey=fi_T̹\j5|>~Cx%|/Fe>2,8i ]:JoK`p'C @vq9!2r>N"M!}~GwHOxHx|dC!F߬/Pjj*jLIjǃg? !03C6P Z+@.*⯫kVVVJtloswy3>cyu_z9ܸykI:`n6[?tNTJV̖K%)aiu%Qmlcjrųkoa|P77Ma @6AB6ÒoƋ~3hfz=7KXuJ#ChruV4Vh2RF2f꺬2cӧp! rZ-gϜ½e/ G?F@Yh* |駰;7gcJƒU;4J\cܖ _J<8<Ϙh4 'OŇACzB>(Cj@헸/ٔNsxmȈG 8](}Gx% È<[Nq..Zu]Ǐk#5M,Z\<!r{ l6cѠ\9\$BKxf|TnG] kN<31~R[z ժi'U0r3Ơ:#][=6tI\I5ٖ E! @Pf)]m(X^^XeV!khZŕgpmhPZхmp]R5v(BQs3X^Ym۸t jm=|mjxRv=}'4wdaK.A*enݮTJqbnvzvLiBUU8= TB<\,80 ~ 'mrd_>-w!s/r `d?0sorŀookפA'n'O},xQ$֓l &=N0-B{ _5j4 NYU$13yD΀#>,˂K]{lۓqx&2AzQ¶p:u\A.c#2\Cq-yRa$h$>kr NG| ATd*# ;BIكDTGvs$C>*ep/oCWxHxړUx̏ivT%l8z$I? 񷱱1ds9߆-H 4 R1*uQ[ab˗ƾ駞 {I Z62lQ܇P?XץIk`rbij& $vy##%m>uwEvhΉsMOMkWxo Ν֖4cH仃zI333t:2q’*9wA$-s4 yJ(3f8̋ Ð>qr{#d׾Uܸq#v}q]xNͿ떀+s!7x? <A0}0_"#,n/rnեbmQ9=hŪa f*cFUUZ-bէSS c0O|G]F0җzt*T]o"V֊~II##K}ڤǯ:X?x'=6sÝXO0&\tq8| یdMa FO/0Dx VlA˻B⪠Äx&@G6L+kxQq,!H"OtI=̧ѭ;HRDXIAA@ &ӧsxo?kP2Lb H&VZ硪*6wQ.@k,o~>&r V7f i887 gZp qa&ԅ2[HUi*IJqm&w( xܹ{7Xa*ȳ:{[( &4ċ$`O]aHxLqLat9I`wJ)Pڋ!GuBfϐDAo< Ǿס3 ȧgF27 U(8K o:%K&<>&⣏EO~jit@&V)Yxxp.PUV01VAőCtc7Ǯbiy\|KnO.%`7nFkg/t:bb!'X۲pLMbeu Gt:! $FӲP:\D]N1Fm~_.BK3s50Xz!Ʈ^F: yE? J%sŗӐLy#E^Gr? r۶]qDA\5Js Ctiwe7Hg8O$(f`>y$UUE6E~[B#Xc^Lﳆ%;7Oj($&JZ,Ť;/*OCB87MX~Iwg4[HO['lf+ (ŝ;w"&ַRXXaTmBT{$z eb1-* TU"ge>8T9~ H4㞅Ht]#?hBal7z*wRӖxfT ,z Q`z`λgO^n$w!ԛ-i.zz3SSCۃp)z=Tkh4[m)?}gLX=S]>n Mevuh4(݃(ᦠzHܷL&#B&q. QFY!! pyVl4|{6Sh۲rkਪI x݂ wD!ad: hinl[Co8?(J3 Yfo t4ڏ~Q)\'ǰ$9Qblw Np=b[A?<Kx)gB^#T J%>o̹x ! wk) 0{=h_GYgEp`nFJmۖ1^ww-֥>i{\.Kcɉ >8Hn^@XEFd*{$3_O@*HOabb,<6g?|u{@:FOWu eI£Rab_J( L!L(#nv_$HY#>fV( t^4)FoIcNdϛ}}|!q@%;bŒRK/z2)} £ߢj f\I-qqW5-֐x)Jh\sٜQ@O#\zcIӎ%<H#>0wXǎE{e1dbB" wɉ|o~|a+58n$OP*f1/>XZZ'}O Z P-Hf2$J'B5G=ganMd㜁.Vv;!f>.Έq{ZdG]&ߛxN " 1^,DHT©|#<ŸfXjZ5 z)_C8w,L.Fs䉢(Չy?7q=_^r[Hy8QHhغaW`&'l uQ(aL(17/g eˮ(EՐdùXY]mYfs˲!\(/w 4U@qimXJ:6tUBXl9 FNIbY&Y rkw:r ɥv;:bmZ,V3 šP7xٙi4ggg dL=M|E"A|hLBb*zq@:Nܿ nBqĉַ> gN9&B ÑdHy+v5[ )4M^B}΃KPJQ*ڔLNN4-.W\:߀u*s"{:8ƭ[c/O"ܟ}DK7CIUy&CC Hv@}BJo$GD2zqxmW_gxJ0!^#A{*'Pt -Idz q p>A?IRa?DqJsD}N?&; eU3Oz=!:]7  tbX)0@1÷rA.?rl~*l?&''9xBZ 3UOq0>6L6nאsXZ^FT)(̧Xb&EnݺB MW !o~ ]nR I` (8s86.3%t[?}f鴎n cW.*'p{.'XkY%u^_)¶1&vg0GG+azb< rǏaiyRAj.ܹ6Y!7ʄ0 ~O7qT5mlSeIY<2W&'D7߲,D|5ѪRnb_ܡq)83< #M*{ZQq/6 EEbeN33L.La1*ZޏuG]N5V܁O&xwCqy)ThZŋ. |O]LL&bssh48s|~p[wͺ\W\W򩩩6mk4yď}~^`QX#U"kMgQt.pwP>Gl<l/ݼ)LJi(?qQ9x9ݟ "}Џ<,srMcrjM@&3żL bjbVK~_bCV ۬#ρ(*$ N:j llll6 vw8Lj.Kt΢n8B49m3 y.P5 +++|`7151qQxo J0R.^oVBQ4 EubgwOv#[|6ZC m0z&Lӂi%pl (0LV 1`[&ߢy@Qd3,.-</0~7 3ӠjcەP;Hn@DWWNdФ y+ WIZ fgg%=z'h/~u^$ /oC.]Vxs]*sJɁ9ҩ㍕Gx$6ϥz^'sKq&:Nrw{o B(7あ [Uס: :?v0_4gV˗.p[c؉t] ]]@6A*4suyΕ%";xFK4M |q0/Ԟto$.KVStz _4xx$1J;Μ9-8af?GJE: /env>H1G?/ 177B|S!o8wll ۶]yS4#e={!ZT*pE@s~0۶qlrMY,ö4\YcQqbh!@! l帨x veGǯE1C:e-uʥ"66N3xg.35]Bf9F>f`brBReGE_, Z ׮\ffZ U&DxvuQ,èת(J:X\.{]11k 'Aҭ\V%uG*L 躎aaa!u3sHA1:6 B:DI@?LQ UK`?]166tQp]׮^M0|?IdBG";IvvvN@]Wy7#V/]b|3"gi>g游x卫tJܑ݇A|GQ9$UxuE|@ P݉e=SO? ?ys_[ 6.DO?_,;~@Zv_&āz.2 Ke2i29٬Q=;1Mf h4[pXQQ,۶JQ3 @UΠh`jbk'_ޫV ^Dccv+ @6\(:TiA5v2+ vdj]Tߠ U]J2"Ȥu(u.u]UOlRt:r ZMJ8nŧbzj=Ӏ{S9RFI 6(r8|vHgRJaz,ǒoD/r GaMa?[Iك@i"ʉyol6Y}Ps)Y ˟O%<jSS O#Gh=(@~x׹<3XyZP ceuU*J)$9o%.GLM.807' GXظu#[QO7⊢\ET 667#ly\zh4v,7Fz خH̥^! ױs`&>h⃺B։D FZɈ{k'd~AbA#rt |Pʐc?w21̫ILɈ_>rH Ȏ#!/8x TU j19J0|U:!r\Dn&xN}1`ب+OJ z4HK/[MZ#<|*lFk?H/^( кR ] &M IDAToqǪ Ed9,-i& WKJ%:=<ģX^]@4z#󇰺 ˲гl ˢha\BêjV7³OcVcۗ_a@y:vH^iv9ܼu t LFVoλx쑫|ӟI`YVJTv>LmJ}c+\+L@&_cb}cU U:0zBpܘ+xj5)c] Dǘ@>AsY@ξW^C@س+ }2YKns?Lx\ C7u55P|;o1n7Ƨ!8JO^wy(簱,ʼn0뺬]߈i4@ס2>>ӧNa}c#vwEFO<AuSyX[_S:)Jz,9ͤ9YJ(DwK"<΂m A 967716\,;u_Wrx>u2(yx?yi8N 'ǻd8Zb}#q`iZ@WSeݒ\>SH9(" ,@:O.駞Ҳ4?yvv( ڪ${f~uBJaEw i*{MU*=ǎ2/VC^P@<!*rLeYPZ @t؎dp)xk(0:]7~r I\<wgdYv&»>Weyޛpfv ,%5XJZZVV!Hh3${j[]UYUMdfxՏk>Uݳ $22{ל{eؖgNmHF"8ffV iVo`tdzTc4-^8F XaݓNZ0m(e<+lPEG:3\0QcB8[P3GEx]$ / "w>>nfGnO/޽% bt].MPQY,wlIIEVW(#-+[0Y&UUֽ>ZL:yŝ"@SJssX]])*O$axS6::(I4cW+ဂt| ڡ" %w y:ēdrA_wキOgGǣ~Yc@#Hhtߡ: \8M y's GE[BП=kĻ]iq?w=?]óhӑP3fmF*GArQWp7];|h^[J{H84b}c { ">B?[1t: Xk}{r_2241|G[}Q>G7o82?G`{M  _ˤ﹄Ai,-/#N!ƛɸ)jhhHV^,_RDGGGpgG>uQAߑ#G!,u?498e388u޻wO>^aee`4:AցdP}'N .w_DH ]z$G#NI[HPl–;qP&5CAEiZn||KsnZe=a`0߭?]%O$]>j$L1hAGrfNʮ}qܻw]! amm p,diR8]`[̇266@utn^oR>u! wAg h_66cbQY葈 뺆uNYPJQّ@'4 sds99ONv l[okp4k(&Sg[$ ut97/733QNϳp> '0Qnމk=rL["X3A38'DTJwoKȑx Dot {}w D8q?U _!>*k?ytkx*PvZ .Π*>]>J?H̗H$Bءuh1a< &fzG}u"GN8p.\8kL4gOdW+Aۙgea9&ach4@)`R20j\WضX<g$SA4vv(&ǰWF0_ òaY Ј1 x #CC'XX,g0 LMo,j5YՊe"eшdS]a[&Ο=Rƻ>Y:)oy@~XEbwwhq?q*+VmccgN/͏x ?4MOJuNLuAA<uϘͤ}tܹ\U/j *M=^— S?Cp Ѡϒ|h6Mi}s?n @p ]䥋o߇:}|y8T^a A0f/7ȷf苒Mvh9\qJ0~@Jh0 VڬR2h<f3дbh岨VkVSXhM㉄>sW#H$zZqWKsS5 oh<)9J*I#mhf 0%-FQX~hx0L(Ha`dxbq6?$n||<>&&GK?BRЯ8E2sxnw!!a0 cI95Uo\x;2͠Q3lk=a:Ix<޾ lʾeuAA(5M_G:AL4KDqY߰ #볳R|t~~Ηf^ѯyo~S5.\yPV6uh_ $蟍^Ϳ ;FFs}hԠ'=$ $qkR+w^ `b\}.Ѓ66;jqX,֡%v -^_BNB\ ?n5*KUyА}~AhLYSQʟ= !Wz*=IPh};>AGA4cfT9}zuk lU3==-_ !8Z`h" (A䰌rނnٝs(يG;KJVȨTyfgf]""wsyR4M98t:+͵LU;tR8xgi_ap /,ty2B&{ˠؑ_*`T7Uمh6pa D!E"<{H2^71=@\ yrJZ77\1rY pA9:(|(S0j+1vbN`Zu!RCGg4M`Ex\> %q}3+qnl3'=jcccoͰLʞA}{5U9~JF@},Gwݹ޹g 8;{MRJ.c&a!M6N79z-|`*>?׿H9(1::W5Kqu\Njٔ >O:&lW5MC4 eP#GJPTa&(MVfص9UGH$1=5d*-C h&˪H&_79*&'QF=A4).|C!ds)]7L̡uQ)! `FYjj@#@Q۱B&c[/6͆eh0646 8))FFX* _G#a}c \x3 de.FomXZ]a0-#rض̈́wpι.*W\~r6?\" Pgc.b?D0>>S!>QQڃUׯa5JtY8h?络a߿/cHд(3==xɓ'Cq"z/q@\4y=sFl6+>.F4WՀ:_bo~+*DCmTR&5X<ѩr  |5 p Ϟiums' a0нXПXhH54Yh<{UyGb1WuH2]A4xg :uo+`04}gN'{miBIQ~͆Q-7T=yf ӧp77ĉͩ hȒp;u]uy *ǑTeAD4!X[i{fEa+4Ot&uRJ)$Lb"drGvǎ 0- Zw0s}HqYBuDء x{_E=. H`\.n>Z ԫ͹U \z7xEWCSOPba4-"goO6n=.X f kS1,=4 uѺRmkǝۋ|C`!] )nai(8OT z)}wpjM6ڂ3nUJa?g%f (!9ܺugt pUɑ4p%N)(0E0"PH1<T%B^> @Oj>~(g<`;?PvP)ţǯY7T7?Ǒa{K$C{H% <~h4зa$AEA37bdx{{{CZPc G6Z)lS چ ۡ#cQZ=aXse#_})b: 9wW035-4[m 4]7o݁elZl$:ygAM2=a>^ð {mu5p x^lt P _Wټ xα/H688V2J{tGmiCUTY9_d?@[[nRxmbO`d2i)Cn#:l9{xO@@Q4 l~nzzv',`s}XTCcVe}嗰w [Ξ=#kx u<wyF21hBV,ܴl˕N`a )**,"nݾǶ09>θ9}իL7t.B0;3FΨ@~Ւ\Ao)Lf?3紦*2 !-wDqZ5MG,E&AՆPV2o(W*lE~rյ *~m+.B0zZtFl'ؘGß\C.IJ(u0m[|,d2)?v ŢϞ9ͭ@n*ȹ8%(|w:UӔ5!~b(y+aϼ~Yij0 e /<~cO23g`aᔛs FӴNg0=9?+D)V쓏ؑÈpr0L&048Iܹ &8tN0F 5"w}D Z6(WP~# TYYgSr7s+m^#H࣏>:y5W$ݻ]^״t*&ʂ֦L&-&Jdy.A{l IDATv*LՒv-Ãʘ=T~lZȲ+OEJwAjmt^|}pSZmmW VM>B^|y * 4ԛM)O{ c;z׻GO?sr$qpO'y]ZixTs(hz $9𙕕W??H{=A~:Ω*@477|"pS&]Ϧmf{<۶/d^A*!ôFX[_g! X䢺 I58X@0zV W._66Ii2 tF]+VEr@67 ,'vO$% j;Ef^6 ##C807TVPؖ XuJ)._!j6Q.E86J1gɤϳ1<47+K#l9u3r^y{? r,̶Rhh  !X܆atrh4uX reɾkM|MX1;{5}[Ⱦ3>>k]%Ѵh$4CA+C-~ >):<]証mnn###}#^ #' f<3)CSO>;wv&2sc+}8b}g撰X or_y?U :NOzqT%<3j <ӧz#4|C,X.(>%+_<<h3 'Y@5!C XQtFؽr9׳JT4 Ff*moQ2}9 ~ O?d֡9YZ-D" F@<@‡CC4 .kMӐJdqmZ\ᙑ,+Z#ɢjøy{S|X^].ZH%ŏzm#Na~vŝ5 䲘pA籵]6.;T".wh̄,HI@!F2&;|ʀA鳷dq3Af@EX>U?٧{=^ξN@*0 Q/0']uY쫯EaﱫWcꘜ@4ê9>o!r677]r쩐X03OWxohMЋm[9 Yo4c@!9!yR23ϸyE͒ٵ]vPE׿'qOY(+}heED>GG"N4yѐJHP7VG,8J%ISh61>>RDe]>@4E.E2t]G<CV!\dYHꢞ mh, 0pB0<{\_@7q!T+UZ-I-69>BPP,* W_~ w:6ttzs>SJR[pp ԕI8 u<jB`k]}!aGFF|@E\ pzDZǠ_pM>tLZVlv(= (Z&0X(kDQ$ 7VI191z1T*oOt sD<\.^(Q~32e" #ESNRUP6`[3eY\.,S'*5}oSObyeE (*hm!@)(5&Wx3@]Ƶ=|$szDwb݋O=_ jNubj j ʃ_aHםA连O=_/|o&v&`7J윞U}/2rDIC& BOj~WSP Jq1~O<G$KBuTULOM|QJ5MR)RIZm`62,Z6@mV9CQvrC|ѺA>?V`O4JUD2P.(ñ# C+UΜ:=ԛ-+OW.xtMt2b[wǐJ%`[&ZbrYbwwG:T?:W*e(xsr-`"g7 k?dԢ 0M)$5F3 g2i8(#m; ߼:r,˖!3SRRLOT*0-bQa0?˶LƱ/|eܼ&'P5N&@4MT*^ n!vKgENэki(uV}##Þ?!L;E݋H>>=qU'* uOexxۍ7bڟ;>nީ=JG~AI >8gskavvrDm -{%5ZRu6^,t]m5ÛlMguPJtwNpUBSOXc c}cSJl,[Ε݆nݺ-矺J_2L tVNSOayuսe.cvnTvw2t$J hʟKB _ڦz޿Pw!W`:9NfY\NJHf@=Ծ;+Smw z!oQ? <;D",HOal4LB04MGD"866f`6R$&3S(83(0T(R)f+bnT*ڢѨX kh8G"Q)8}2N4 !+Ug&"&dlo~}wdPDpN:5 x5jЈVQol:6rHģ0p'c{vfZAmEK ڊ/QR)6lC/Y.CGCt@0iG<'Txt.`hTl=.o[VBz : p@ }n/X_ﮅxkTv䤿\&Q EcH"H_A V[67O B|ud LO\`yy7n~ 4ɤq& J{8|dF"kΞ^:4BjW)*ڗ R_DE?*<>&sRؓsh^IP脨c=}i< '|0˧"X.$x?zRQm=51>>ޕ',(8tY 2C4)6G˲d0170(zЬ+ܹ/sn>=lRLܬԩ 0I΍pDeC@m ryHH̳f%b#%D|^mG:1`k{e⿖Ǐ`kdߕRp@æ*0ﮪ#(p@u[PlllߕTϹumMs/pED^# Z`Oes=|Iaܩ.Ԫ$HFcqv+d/Q\=-B0:Ξ"(q РW}{Qڶe5\JQ:gynhs="M"?*x699TkeD?zJk>O=١po C/62~V V}<͑HXlԕERQ&2 4˲1?7'+<6Y wuk gOEۖ(n{ia'$D܀BRA6bqV9Q3% D N/!H$5jtti@px -bQFD`ZMVIז唀7{h4 f:ri8¨Zy4+oc&Z6Z6$LӂtA~W';HHbeDRʼnpoyi`jj7o-_ :Bmި~瑈G],= XY]I; ls o@4JmPLM`euQJG"F#0MfbbO=8WVl6c>g0GG9L P--9]OD᪘QE%m NF2f@lxAeVz)x4 ΗLJiڂm8~0vwwҋ/Ws- : i6&U't*u~ge`[{N4 ]撿J [S}V"'kz+ k%(esΐ^O_2 t&V?c ض#Ϛ.~اb'4(Q~A(thOwG`#Qo%T vqB߄uѨXdh77݂=7քĉO1cc\f(Ǜ*Blk{g>u[6,!pH$eەeB4dbQq8hQ]8F&{N6If'[`{*FTBqgej :l˂;r586V+LCR5uq46:6SE5 @@px~ŝ]4 )ضZUajF#,MX,ʽQPj5 m#OѩԁePL&+}t:%Rę@)؎t:2,uP5gq 5hxjH*Ž6\҅s(GoimOagaxx@ǎ`skx nܺbo^{.`cs TcVFs!T*zS61ݔɉ 8#]c jO+:{o}fd32=or. F'sD"AT>Е&'&H}[ih@|\= T\LJݦx<&[6n%r<`>e6#( :E؏( 0ǎhs&to#|?}Fe}X $'T, |ʪ9~SkHIV@4M_S˼rA$(GR2A3=Q{8}=p-y)`ާ#-9\ pAʓ7S|Y:]5:vvd`˲0>>bqG=UQ zVY`B qho޺ J)yI,-@D]YLDd4-gh*C)&,DBm4-.I|\fh,p>U @bTu3ކiC,351X4bqa24|`ooKe؈v LqZ>?Ayk#*[]+k!H$8tRSXͱqQ^x8qh5&VsYB04< *"Ph<5@ D@]d* 2ah{ K~s${: *\?P^fp |rJ岿=s?瑱1&hСl&Js]-oS+<?{:A>gmjo4^GHAOi:kvh jǹWBiv$'t kǭ[qh~c6 096w̙]ۃosQk9skh&׶c~J,iZhJ$esH$h m[8u$VV˸V.N8{K0 Vxva"¡"J^obPYTU \ (l2MĹy$BkY6 e>xJŵk:v֡L-ɠ0X@ZI b\t4S7hZ8,66H$iFFFjap0 `|t;;+fB>W֐fqaLOMbB}4poic'2&Gqk.@uD# VKй3۶ _*޺vww\ܒ@Zͳ/SuŽvkɁ@򄪨nH}}%(D.nspgU~ږA!6&cL xNfR~RI<4+i=v9Ӱ, 67.;HӨd(h,IRi,- I՛xyT5[ZOA$F4nR8LDلiQ1 Z*=u]GD^!5=x? d*ӴP8=˼8j1bll JG0߄RC)'@.(p>4Y‹VJlưX67~+vsX][VRlnoJb(f&y*z@ӌ otAXL |R+cST*2q)p$d$kn"[_襊dgI+}6NXSOeREx<4<*m=w>Ds 8.V9gX1dzvڎC#?%@#Qd@=/Bi q,˨>D!J?eͿ0%O^ںKCBN; 4M>4I`ͭmDQ39iHT!kF@e6 @cBrx lNVR'aum[hjHh5 8Jd" ʅ vl N]s\%iZmHxJ2]%0;$Q(dyzYp6FVdh*qʀݽb8})&:{!N_TpM;;hH^p09es@>bwN&f=T/t]~7I5˲ܙiɜ݇Rh>BAW:| )|駱舼SJCDh;6ϼy.~/0ҟ>^moB@V3`hʶ_{}s?O=eݣbnuqgy奦i,D0<4j MhH$0?? B*F\ɉq4[- Sd1|/VHDGa0zZD<]P.ѨdA<ė<,ڶ|. /e2D7Jo6H&b4<ZL~N-ƅQ,qNV7(=2PcR~X _;0LczrSu.Ξ:  v uλT*F~`miBqqlnm1v fF:ak z p l6bqG[;!`xdXD}f.ɲ~)xQz?jK! fR [ xΐN)BJ~Qonmmϩ>1fw~ o]l x,,Ÿ]5 p)I6jX<qO4ә8ĪL0;3jT*ȩpU gOuMRxg[!=Cthyƫ]o/w{o_;A߾֩`O27J| 9p'P g'] /bcs cf>[͛ЂmxDmu3N_)C=bxW]zo}-'40b"  $7}wH pF{ ] TUsd{V lb@+ϡp*b"v6r+cnXZ^Aʪ  .'BX˗.X܁똙n 01ϣmpx2>03=ǰ[ cY1S(WH=ÙS'P:eձXVe9c#Ll;Hvq10C)Z6λv( WE\1@,޹hlgl6%"] Ӕ"t$!ZaCc{n~k_B3t44,_ sXs##xk =OBŪm4@h_XS3D>90PJ-:=EA0}h `uGF{}K6CfŢ>`B1Δ+\}Z(Cj`g>ٵj3/ҙ /YƢ)lއhhۯf% ~FgyT(STy7Lq?G Zٌ?xg.8ce$Iw{zG]sYYDZX W\Aqg]'-_~ n I$'(ߩi R|>z=d9D^->^:&%8f뛛ć7>e>4JJM&.ESD`ˬ5pI]Neirn5:@i&{LޛX]gbߍxZY^]U]U]MF5Ii$R(i$kdidg l00`x~c0`ð<9dvڷ̪ܗ/^K܈񖬪j.̷DܸswJEX-&t$}a4,77v)8Ӵ@4 vwH$p]kkp]L6˩DÒ*\&Z)x']\~oܺϣZ杻`&R)ӌx>5~6vvv3X^^(Ȣ3Vh>VkT`Y+ '4Z*d2pb xBztcDZ/%c1SQ4VW=3O!LIMǎСJ?=AQx~0 omm( KWP,cR$olu}tC"hΩ9\Ӳa6(vv!ؿ׮q˲|G2n'q9vapnӝ8~[! .ܾb.%~-}.HHajއD+z.:R0C5$ZPR}5wprD M`[ t|Z>? <>װSxL3xs(KJn܀iZhwsR*jap)_~w-òl)po>\"LVoȹω4x[0n_{77rBvѬ4VeLp`q^a((K,ȕGԕxb ~+oA#4K7@A@7Bp0M^R=Ðfã+4<2:l+77B>/O<ǎ2,V:.(9sFvTCS ӧdm uݣ^Rڅ* 2Qy{- T4#v{LR$hw逌l n$} á]Oװ<&A>/8y76׿{wh;C?._~O?a:Y90_Q$ޑz@ ]g.TRN{.lۂ)Tj%.3C(?1{\j=Ssfyf8Uڠ7 Y6 P~.d2 !R5깨{+PV[Pa rّ4@N qQL6ח/]DXă5Fp-LOM2;XZ!Lb}}e!kH%0 ã g~>!B%#q`K[$0eQ\.+;hzx;rVVV.> V|}xgF,8]DC:Fc)J⋯"n]B<;-_ϿCCRԥS;4L!fQoO'tTS藨u0Mg T߫h9B`G~^ϐ2msʱs=5|\94d\a6@EeDŽ X*yYV<@<@> a8' d!ϜǘM)EzO#щz{BЩF+}E,@ ʧOB}7*/#G&iL1|8y CG)(emE2StH;sC gW c~~ާ0l|_Í[BW) ƯKFsQB0YlP,#0 T=i F%VE]Kq웛C @5'OnBV7:BGa&9}\rr4,ۂee2tڠ ]կ/aA]J)`UxW9WDmSוt?￐ -rY||*24f8.Xg ͠-M 8 ue*v IDAT,$F/]~iQ ,m)_+б|a]B9 |7M;$<D`& z\t{ŽeP X\KoZ6flqQXzٙItm uy2\BO]d2iiht=8!  k+<=_d\ǽغ߇]_ D(a+Ʃrbt]G&u)eA?BODvB Β! ~PA)P3픥vәJ"]&'4tuSP_wt&; lB*Tv!Bj50?Br& qIq^i]@P2 l&Wa~H$H ,$%SEVu~Mp?i7~ &%t=rY$qt9V)ck~fKҎpVVW8tXo߹&nĉ+e LdY;ogwWVL""B%; ؎nx<8* UEt: 08a'4'rۣāR\|W0tt€g; $un_ ᔇ"k!vE^)6ZbR|UkuaY\_avQKx=Q'~W1D`{˦u7jQt a|꫼{ϱGu ;^Dz p Hlq׮y(1`DkS?)ˁHuӥJbn@*fյ)5Xqt 7oE2D>uضKϟ.r=G₳.aL/L&=LJaNYo4i:)766kʥ2W]7M SL7BW5MC.V4-\p[ HF=(3\8,z:J6661ST*ɨm>i(sXY]e=FO:󏿍9`cs3ShLXXg@WFaH]D".k˲|4./]jJB)̔%$x 3{FniO.opOT*۲m4[^XQHv*g8 z8ug6"+k3da )v*bClhd{=gΜ&㞶~ï/EU]m6ss3/Źbeupouܽwc6\+;|`:7;3Z tZtҟ!D$BK&.1 (9}8CVx#L;3Q}U=?H/!r"V b/_f`qcp͎=NMZxbBhFŧxܠ^jN%%/s#~aᇅ}܀XQG;6ڂ,'8v(vvwA8:i*X,H*+۶YU|.xU} 668}7iVc\FӁeyV}J+A4؎^~öDZvテnD e!I䝝T%z]'ZTܹ^4+/Fհ*I) < +`ZkmyO\W?;o}Lp7¥q6%l|_{glmeyRajrnL:-Ȳ,, !ߚ K et=8UȊEדGXrԨcpFǥ =W<|6ޓ3<.!瞓}AiHョQ]#>ĝQIA9MzAPSگAA <nPPIuU]e 8^EIOSG$e [n H IF%[}Iz¾!{e^O'@)K`ZmLNV`٬1v3n{ӴtQ,p  ʵXjVCL`em!M.N^$H}ĕJ]dZmRD2Ǐᣏ?!RLoޔߟL&Qױ8x tnT a0`abnöd2EA4bgIPaZp]B3ޏ$uL`H&hۈ;G?#\{m$uFut0Q*1j0qڡ'c]+{ђQ*\APi袈Ui5r:4+Qp]9B L6Wj̩v)GCG:Ih'( Ϟ=~F8ܿTifph>5jUzGϖDm @.6^|"VVW15YAFw^~ gNb1 neܾ}x|3sΕ k,0_: #|MhDq%a@d2雿 ՕmBT9-[4x[hJ]_. pQI;lSl0 K(㝷h_1e[R7~>?zG=У/hQwoS]ht =J%}A !i"Xdl^A߮B?$ٗ^|QQpV%ϟCZ㢔LwakkdɪyWJPa{{m!$as{%TeحVaLl[Vkòy>%3$ 庮SrDukn޸3លA+V|Us 4-; yF98es0Ъp0ǟ mǕWA)*&e$ hZ?aɞ|N&g.={'yez@=NW^ƽ2p/[HD<ץ֯\8t Àm2AEJ$dui= tΩPMP3R)<3o4a]x]p k ~߹}'T=A{G-DD2]u$ɀ(y8=A_q`V5zC{ Ash* ם}Gpu:Q!˲y%Z[NceeU9rjM60lmD2BCB3BLlqyn"D..irh D";8}( yDL#m%ei/.QLu֍RΎФ2 !R!6j Vk斬fT-Lhpm;o~H$v{Ŗ/~~43;],ϡhb{g;qVmN]|鵗Qxg][v6[|SLV&xҏrs˳U{x+$4iΈ|>竼ؿ]133\E2@&aHS>Eɵ(ia콖5Oݪ?|6ijRGl~-+H&:P?j'5}xu_\<=swqQ㘤$,D&F.v_%Jarf"f_G .J@"ɰn2z zϟ{R)5Oz[n, kkgkeuVrBuɘEC=}V|3&/\xwA^UXzIloot(ۉC}TğxbqE¥Kr ݾsG `_Ϗ:žw$_>(^O9=m 6Ѽg5B. <ݑ=ֆ_SR`g\.]hMm\l1ʬ8OtDG:c3&+躎 ^a"C.G+B%Ju)L77N7%̓[CﺡֿRpl- rx`~,2r3`QF ~~2vU7f N8+WYoo/{حVdOu,.,*9sr%55zwb1VSUoK, K> Aqۧ{755%+4>򗾄}al0\.ǫGzc(^r*rv]yra$ 51A>y,g<<ַƊb(K"+C8M'vwxBUS9pKP}gM9=߿HAszIӘe1A4hEӕ"篾"n߽x,&" Wױ6Q.bwJeFs.$Yɞ/? !#6oz0Ddj棲/" D- xx<]:UŐɤlhR$XSO9?٥Ǐr^չLL0M{؏{BJ}ψԀO-#cVw.E,VVW/oArl:ͨ^W9~*s3N{oq2Ȏ=L&gE QF2t.RF᷍!g|l=QXXSYm3+*^qi\1xvhdo2Qg i7==ogmtmNHy >c%}!I564+2Z&Shb=OW`woCYݕs;H Z4ԗ=}\ :SIg%it{yD 9XO?1>ա c`~!KQ[=1==?<_|2^z )/@HL&ٙP(CTyeZmu8[XCcgguʾI4x%3:@&6爞CSM|. 4p)lnn_ݻwa6uz 9Llom!ͻ?4⹨Ks0?!p_ϺjIOsr|>z 2kٌӧ05Ya>!>nB>*\Յb Ј4dWG2ey2h4p]nhA Qe=ύbyh\Fێt3<=/<,ґg. @Ӊ'Y* h4ؚUlw~*GWB[Wquz& p?Hoz\)44 xA(oP#حV=]C:A9zDs|nkЕ?\~ßP=o#}u ?u(ݮ Lv\sUST&Y 9+2=B◨皯ÒU;.|~D<> SO"v=^^2͒kJlUqJ%J%hOjDp=0JNFt1E*}F2nOF <5с;_~<|ϺO>OI<Awao;JԈ\poH8ivϑDx`Eٌ1ƥK;Fǎg;gCpQJګ⣏?͑Hf`8+.%[ɂJHđΤa&ɔw$+<emxL&&T-.ò,T*ݭǓ ^SHRH$xq 9u\nnmbwa ՁRIi ,0z>#r꺎d29H:KI.GL\# gy}rFϜ>mP:}ΊmۘF|iܺ}=Ð&|O y?v\SWxaZaS2K=mYwqMXՄ\ >ibU U'Hxa}'2㩩)b1>6 v~x <'&j; 귾0 x#<|Z9QԇkV "Ӵ:;88_h>y^d>H$>~~hU -^x2VVX*m=B8UZSuQo*l5Q"@Ӊ>FzD'K4\d DiHSdc:KR+lṳgPՙFfP.4=t]vv-9FߖHeъ>Vª$@X P{?t Z,lql}c'ܑ1BavpW2Dgq)4]Ǿ94-8rn`.PRώ̫H&L$:N%u0J-}sy-|wSIq%\.Z݁bG IDATBVK-˶e[3q ]J).?5nmF5Ip˲l z<8pR}mQIIl"_(n!N鼓D{pz a]aO(){(cAރ'׼M ^s9b9;uu⃟5Z|IgQU.0׮]֚9:y, AS,azV҇ڶӧNZh(+x"B0M|r|i8rpRGG}si/)JfL3 *zy%0:]xm~7x l^s`2cp9Ť(Su]8 ~L+:|m !Ĝ}Dsz%F}az~w!^ >xJmWSxо;j((4hۏ*x }mŊFy}gΜƝ;w|RcGgW@?vAދ/baa'|AgaB<3HIq9 20:L& 4dg`eRTet]vVH°&%1.9d7L&La=uVW:l42xSR\hTؘi,fgg[`w^u SSXZ^Rgcsϟ{;ƃHG$NXȣV⅋ceu yNz )x+UsR0@wj(/2C.nܸjWϪP( P19G^8i({pj :0$T*,KWNOOcjjZ5%`<s/鿶SOc{{g` 8;L(t!|`a:,Q )OHԣGc7":BNScI! v{{t9rǷVFa~V,H]WXYYgΜ7w @sjj:P <8AP}Q(dL(.$$\ DaHRt]ߺsi^cr;w9vV 2%:`zMLHJQ"_z#ͅ`jjj& _n*yLTvXgZC[k># :ѕ/U0ڢ.߷|Ut{= yt;$\fqi@ y |1 CvZ2]`ypؗtx7nܒg34vqGy:![\ڠO78:&4$ MHB}#I{_PÇ$!FhwMH$up!qNj&+t;PŝwQUa[fz]luT ubCܽX,k{1?J.(u(+U_iȻu=6!߶,ll;T.^gDCkKA9:|9_[e ţ/OEc~'<|:(b;yRkS=vw<O2? H%Oq̡~\Ì 8RWdP$d#:3Od8jX5L!E *A]Mq<(PԋLjJ=m4 ^D A$Z6} ב0=5nz.+ MS'q 24fyLLOѨf3fR贙vQ(n5GrLڭ xǑvHN&8+}LgtOAaauQ8;%Cé -Mv]t{ÇPpsH&^q9(Q鲨 Uܯ!*>xS7C=Ycnq/$\h@'R(l=[#WK4?<1zc&,2st:?+˲viN$HRzȤSB6ÇŅyhӍ *:4MFѐl&~Ӕ@4M&d?H{Bh1ȊR@RvJU51e3XIX,r)/Y,t<,ޅ(>R q8O` y7P*5T '-X\U:/<|_5?IF|"hHDE:F9)vF@7pTwD#nSs<|J+y x<!jBQU{ Z +jgb Y*>7 OJ!w]zgN{\ZM"SV!fū,┳sCǐJjw$ 6 FiN}:JT}}.i]HZ\ 8rPk١WQGx<>{h͠$Wp-O4unn* 4x.;z'9!4-%(+W*x˸{nDbm-ARضͪz g \&j0' aD\. q8˅UԤHcBY%imx|Br rI-Rv'f]>2ϡg`5ѿ4MtLNL`aa;;ץ|<>{?@,yB0;3m8p3B4$ X MӐͤa\Ǒ4UPoug{{7wסLT$dyYtNTk LV*hw{\FpoezH&γϜRٕfj+қ=*}Oc#ةj{PG6/%P d9ts ۆ*v؅[[PŹC]y0w S^|cGuxBKc?t}1]_1S3 x<O*9#\NGzš- 4S5QG>gU]ց9LQ駈$3gEь( {&Z8)kgU#)t x3"@*łp 圬T鴹``B5So [$tp[}6ͦ U2QUlaطofK }V*P3.N]_5oc+!cwwCt(eO@Qʟ~EnG}^iJ#%.w]X*ammr:ci$x|n/.,r@?,1_t:ڗ ub^I\5j`G?~ANTtlD]ȸh2zގoblY:"@@+|qpQդxohh5[}+׿ \(Ebʾ9t":(u"ľ4=}] FC⢯XT-z8y℧ B q( C[Dvyr+j\'\OzIH=S `um?c/-@@)A"P{߱x׍Dϟ(~+3Og vD1!GRjw` )5h88.s,5SL `OcDup @Lk3Vò`U%E32 B#mv|7$o"jqڕNøy0gQ%PJw ?c$ 9|NɪQVVWh6nOVhjQ=={khj;,^($666P(A4L⓫טoM35@"6v)D^QlI^pA.sJ=[M|B\ŰҥX][÷8y>ronݾ*MNicLڣqol⹳kOA< fQ米{Khw:2n5 ~Wq[;x_G\AhyZ7 b r^'pl ;#׉h1󊺎9 ID]٭aE-Aζg1yDv^IJdIO3|? e&~J|4d v}uQds9?R~cD$sE:bXJAح[86&?x `G .;p~u:77f>4:(R1tQh4ٹxnR NN 9ypVVVF[o֝x[ȥYZ.>jD| zJբ氾!xl& s:=5ͭ-%T5웛vLt:41iF*Bcwz9?,O:WTPa ۣܸL{p㣜#<87C@Q ǏÍ?oMgGHaȞu hBxɀSΕ.'?o? CX?zg}p~TգLg<%` IDAT/8䫎gGb0-HW“DQNBYb2Q6&'+e .d8qׯ_x_7V1B&cqS^zAőeQP.Po- 8~w ^keF)Je[=04MR)4y%v2Q'#MӐ` L{µPT*JG&fgQ W.]> d=d>h4]dĿ:p9\q 74٨`jrkg'k R5Bxgh'[6vXEF4ρ)|33u{*X,L*|$ =mpB#^fu*`a~8}mT8>|9Cvn$^} 6Gghw=hgE=z(g8◫#4?{vvk,;(4N~-!s?|hK}o/B炆q})JCnrr;A|󝑚kZR ksxu~gF"P.72QL#ԹlVSNSX,b>>;afL)t<{4,ʒK|Ï5p.SNxGMPoh17 \z*/_~դ耠A"TYV[/!Ϲ/tu^rv`l,PbwvFN-)T &Jݾ 2xHu)d2%iR=0^W1G4Iu39 띴;]nir(q-U!R j:=B41[[ؿ$ hW^eb:4BP*12|[ǎ^GӀ11Q!.v:$l敬ݱ Nt5t^}.aKasl?Հ*;,x-8v쨿pL)vvn{} BʞP)u"){)kkgz А '3a ST8CӹcֶG#"VOLwT3ݿz-<@qOBTX!)tC;/ZXJ\.8X%8#N?;8J`qq/Z>`\xTx/G$ gq MFaǎdžY ׹t|J64M(KRWV)Y4Y:hZ8vt^ݱΝ1ﺖQ,<eP.TΨX?zc3g#xN6A,277'9ITSPBX'_TRLOsa޺޷Ϸ7\A~e2[`eEV-߿/ m4MjuN3Â~WSI$ \v ?ad_j߽NNV:poM"ǑZ rUp_j60q\aypJ$S201J򰆝b PLF?Nz iB>sTQWעu0E&Hc0z]P[MLMVo)|\._s[<u9i9X 4ēɾX\\Vր+_z}kQv]i޿xK_;w0Q*J1o4zo|Cl;%n+}UHtlnӴ$qy8{?a%} ?J%*Jv{O߇G#V^!;K.bk{&) a>oђJg‹=d D{J?1Z.O/p,ҙ v \ ?!)I5FG[Ө"ӣ}\a_JPmqϚ`'+1߇^zq\g9hR:ةߢGfC[e]?obq!uQ,Ywo;L$y9"B}?>ZXX7~(*|aJ155%FL %KsF`4{# Ѱޏ\0wD3^gh=S{lG?5}^c0I(?Q|ޛugb߹KUo FAT7ťI^$ܒfLX=1G?MmMH=2#R[ݤH6IA$ZPr=~8=w˼Y(KDTUys&I*)?f\0Qݾ:0b8?}pu>IVczj?"")N!Ǡ#EŞX#MFlFF8/!=zD>wXgy#,PR=7~N?WCNS[oytaڭ DM3zxz灵OKZ!v$_ Th4[(8~(Ke8k7>޽ ]ס&,›oЩT'8FkuDڏ]Gq-yt:{uR繽u+(~bۖ2_#&5y]8Kwr8W>/=߿.ʗ BCh^DZ7,sh4Ewvy㏟믿vD0O=y ~{_s߇wBp{RΦV't쏂D 2<ŋꉚsgoJ,Ψ$Z(X{V8'_["ҁ(@i}c[[mi[M,.-epM.RHf 6cgzp^6 IZlJYXĉ},nSkk똿ȫ]Ƭgf^8t,:,_~勸v::Ij6qQ,*06lϬDC] ݶl<&p'Ȥ3h[m$;ҹv@ fkkFSx:P-J&y$u}oI$p}U:s|: )5Z949*|b}kQݻw;oڶi3ͅ+W+kJ0IrgϞkF8bOTG#D;GSņCQ]\tmccs B.:HٳcWlEtiK9 #_4I?ИO %ZWo: ÄX6?kBHCF>ay4;K&'(XS^M_ս[uK .cM4 Ie}gVTJ~W\8J >u%P=BVUz\ib6Z@)3̹&RiZ-.oIUƕ+3F́Oҗa[%&毷^tgXPMxxu8L1$vcK_d*B'1Yv=%tˤ/|0M략9vG9{ŗ^7bѣGMx,:I$2WMRi&O\@/<< TR m){{Ξ@Ixh: tӓ qHkJQwP.W$}7+Kx4Bd2$H L"aH&SV sX$ X\l6’FVus~ 4aYVh ,YAyLNL(md \.8(3GGl2E+~IVG`m}=$u!vT*O<_Bⷾw/_AVzHuhDG&F6AǦ<_!ollno% 666eNq{h6&Pn[,H24rNt,Sa3rYhV SOp-<{૨-0h24ڲK#Nė ]4QS4JG}Ip*8y8V$ƂN$$@n^Q:#l6v+-yUwGd%t.gX3u!HdCCS'@`qq(Φ}Mj#IB4W‡L$`Gv4MO"E{}ImIJ&a;(019rʊAQ#G+EW&~)ޙLΆC6ɖ](?&"8t  ^_ ?}x8>A ȘHz+h%INK4VJ'm;Ia V#;![5laԱ" B%9j&S)ÌdAu3f:xWԩSGFR9bϢP`0Q㾵d3TYq-qc>yu,Mtx\2eajV 4wa?oK%vUq9X@&e1SI2:2RgfRmTU9tH*N:~of *7P<*4" A5SPx<0:MLd'4 [f]a5Z)ܘNp1anM c.B;œ?0ךR %ƪiwgkh#^[[G"a$BbrD}GC^DW=w'&&P=Ʊmܙ 沘_C4MXIGLOMIеS_sXXX4pdCʑ%":-ڭVw+n_GFD"l6+H9m%1qCNHI0H976{Py"cƝk,Ә|y?׹2=#,=Nq֭\.G s BUҎsq?qyJ灵 W3yHvn3#9 (p>7X@) v /rr9f벋Acqhqlh=T*,$Q"pt8sT2oM tJ`"-ƮSOaVse{qH&ȉ_Gcss\[[hh J%h V]m.Хe/4 ( zmW&4 B!SNbyeu5^H_\J!p lQ.W`ds(Pob@ U8z0֙\( H\ݾ3vt:#> fgP ߟGSPuhDEs&dN&TANBthDu@0<gm].W¢? Nc~~P><PW?Y$<46i%ZMªÏP~TȝbA Q^_ nHi ܓ1tPz֎vU_ԽcGn:C†2 AP`rTukNO[ߋrnROګwE%`sk pع'Vi"JSlw.SnK$,EDAiwyy ӏ /FtݤJ7N'5A'-K>wp1~w\(0UbT~E4cǠiJD32TT\E\`jJYv|\p.X#Nu> Q,H^VLӔAF^wq9 Sa\Fbha6.䬪O4ml0p&nλ!k_@3o3~޵Q*װԑ$d2hZe3DTTwq>u >$ISKkDB#'$?'>=000&54 iv@t}L ݄q!cC7ՑJɎ{5::*@AhEk/ o!$}=v:q~&5i& C$E Ѷ@̔uw 1.G&Ed=N1LľiC7P*n?`F6tlJBaz]vkض ׋R]3a{{>e%pOm B"a+*5~r4u`kkk( XX1-hƸq/Qo"N£Z4 G``|" 9tDЈPc"rwqd-"n%!yޭ&xk݃M pNr{|6cɍ o]?!ä)Iv܋/Iztl%S'pX䎛ߩS8Niqڶٍc۷o˿z qQB`BCg8 Cӳ{$QA_؁Vfݏ5'T<յ5TUނڨVٷ[[^3X\\DxbUVQ02[hu\a\ѐxGR[T95]!6ݳgw̲˃طq!Tޣ8úQX`:LnT*f8VVW%w%i0O_K.{ctǣł2ؿ}_T/".{qp~ÅCuԥmm Y-^IKt 9ys 8t`?76]{VPqۥiyqt ZK^a6unvE.@tO;A۲J`zhD=τ5P ^CR4V FHīJFi`t҃Hm@{x&~AfHĽ('K'С3Uݣk-+“¢ο</DÁ :_^^ s 2VZ1m(Z*AaddJ'_88qRE\G 7|5 /nܼ};v`:v/]h!  %w& 1]בL&e潌 0&=Ż ,h d2) wk!o +*}z)4 gS@Р](7;]=fۨ;:JFh3X\Z 5:r9# H dpJ[[[{XJiJ(*48yRo砱Q|&F㜈/$:kJU89Zڭ*$* &'Q*}[[`.pAonɄj|o5%=|aIH&+{8I\}3j:f2,TXR)86#=YɹaAϻ"<'0er??q$~gUu(ľ \GߚXa{iI:D}6&C'P^IkRh8 'q t;DAV 謨npg؄ixsÇ>.( *T,YtHaGc W*;&Qx>`fXCOt'BLv-ŃV6Op<L "H/݆(ժ,A%ꃲ4 v;xP aSl̹O@jĻrú DdžË ]߽] C]rabHx7ĺT4y~O]MxGJ£nvhC_X&Y&`ddw\K^f3,j!Iakk&#w=l.〮=ԟϣF^Á,0Ɲ9 e;t eC7 +~D=T8QP C78/םPX=MsN=J#NnnP}4*g=_F.g[O 9h4H&sS1cQ)ʽR86w XId2u$I^O.NG&&Q*g!8+&2&kѫg鯐ɤp҉Z !vpэ id+sl6qq/c3=-+˿Zo]|κ8Vs,..:>ץR`2`L`$6(.E؎_HNSe!O6$%=}hrI[#$~ \I(؁;n/:%lJ#|KB$ O{3x NJ;&^^Z1'F#@ jwGwT |)Ic2pq7$X!ery NEanYAUy(rdQ*BpoV WeBUvHF`7oEW!C9yFօXǎAz?z]qF4,.-1(G^c$umlb .RT*P@d$ؚ& (R$)dvlNrxض:!? jW\u+<-]ZA2@>C._E"@piHe"uN%4Fĩ&n >V#Gq*_y\z5rvT*8l䭷Ce_޻>3q :(\CsT8⢂W#Uν8 4١vO=d0^f7تn/lsë I\(Ad2 ;<s(:?O/A0Aكj qBă wܪNaiX_[m[u-S5? =:;!.O@),8f'Y5{e)qI| Xܶ`@ p8f#^VgjTW0 j5h<8vRim3h [8"x$\Z"m+Bz zeY'Cj8#K6bttRaqiIʻe]jHr?)ʏm;:u#p=t_xzzZD(:&>$Jٝ-4<<M&Hg=uY8Su]ihGbGVVW]kzxv1(E6 lP#}Tf^sdx€IDV$zvkk]ɡP]g]۶e׸?߽hB542;rrR4Kz.֢s Q /igq fu'?d=@aa7k"K5r:ѣ#SUI$cT+ɀYy߿9(;xW=7ovK={F#tT##ñoMoUm(  fl~tnz|5hB(;t`?W+\jD\8`e2-Q%#c.t*Kx\N? eΗ_~o_Mn MܺdԉRLMf)QJب{v¾{ep?-D#at:)њT&eLOOIX!U.{F sI4$SCM+w3u7x㏰F/NS4̣~Ѩ!4@Tʉѩ#0vrlll@3axxŘ &E7@΅o^2~zR_><qo*S# Ξ("(HI:.,2#f~0 3&Dnvj |?4#j10i2iM0nB7؏f$`h:ږ-DDs wa )jMEgeR[:'PO` ylb? n3t/<~]oRy1;$r(SVCF>:'v3D;ƽ<2"d*6;,WW=AwK"灮Y0o8fASLu&nCn9. -B"`4o؋>zؖqx'>PtB %<6U7?J@O8#峓8attv!PU㭷ޒUj +Y\\Jqk dph÷COT?UwN: x*EjsJi nnn?ayVhy:x`AuXVU VYu>Yz3I\>= rTxwP,.Vd+/ shxsˉ/n *¡d2Z*\/M#C㏝oGcn~.]~Y]ZFR$ Mնx@(j :1A(0 gϞPd>h1 a1X6LnM3MA9z"8 :Kd0v!ϪKv=MgPYDnזOrӑP?tAĩzt:בH$<=wj/K8P.L&]Gu7a4+MӘwJqhYnT b1EսnrT*ATyJpK{[,>700-FrI0A)]$i F]hqllp|O%9{d|G6C׈B݁x'/^~jlYs[ɻixcxߏm>tkk?K:=˅,kUߩ)y`*B^n庬n{4q4 9ob  GcEc'`alllwtK133[nu=;>o,c/K]D&4w;稤/b|aP(y( ,T*յ+V6~zw4|zHn~;.q91؏n h ,,huheYRvP+)윉p;uhPB=WNx(󪍩K{ǿ_w'8dalllsuǏիWo>-bG/X,Ҏuq׎pQ\}Z |J*&'ƱȊi&'ƃ|%-I$8H@[ f۶PT[H%445X!0i9B4KWfۂahmX#֝H'h4,Yn#N±-8E2@*v|_6a:4΃mvh% !plMbpnpT ^]-8"u\CB-:22$NQuϪ{k¾}p޹%'&&6gy?'P>tU4#88- ކa__ļJ~L6۶e}ވ>;A_]gs~u_v F)EB7{( !N1'/^ď~fo.CϽ:HƎ_{UQ9.NOmb~(uhw,UA LpԪ޿ǏvnҬb[ݶCXyWm~Xk`S52a:-N@)~r}}JXwjH=N)ۖDuX6qK2e>r,Zf$)U#DS!'4.6|\F0^4Lf\ 0ᡡAضvۂiϽE\rU4Z '_qTTᆣ_d(qvmlMvmͅ~VDC!Qm߁TGhWE޹rE8dƪoiiy6tt`(c,&jmf>%8`/|[X]] D jEgQ$A'Ȗ(üFmWU$,xBy36OM X,X,FVΡ52֙? \rO]7nooupRf߽KeXȤxGqA@8 s>|б)1f݃ 44e _U~ ݒ/p4uCdBZQX?P*QV Nv.Ӣpٮ,ַV31sriVm=dyTU J4ه-uMCm0LvlH0YO_$CHL|xE:$=t>55Ri Ȏ DR)X0:(az ` n i ~/U7x"'&'Y8~׎!hu XO<.+&P]7LjQ)WB /&MlV^O-_PηY_ʗ޵k ۞)*ػg 9XVm9OFSR!loNJJ}0ĄHWMH[7kFs}ϡ_t]x懞'Ac+ERY%;Bc}s *xL? vB!{u`mU;!0.-;3fceDZ{D*.Ou8(ZHRht]8S +q3А7;lbcs>l|g!N^o@,aYy"`_Ք5PeAmW|@lbh?S#}pgv8ٻHH:.vv"8܁:r}|ǽgy? I?zDX'9 虝طo/n߾; /-O~ad\yJq\l4pO::} 8؁N өilۖr#lmKL!WGGUBnym$DSO^ȅgXGC>v/KS_iu ~"+ ~,Vט^ˡvHx AϣTbl|K+dsʗKT>G\8\YMLً:THhԶ; dL ݩ#a[*4#!091[oc C*abccTFa8LFS v ! ʶD4MOma/W{%ot©t]n|00lZ][EL߉Ө0>ܺ}$e>$>$C6{gPJ~0hאGCŃMd2xF VX&ly8>2kgjxqOD҅߅7, f _Gc~hȩ죏>QSR0*fb\p"*ʋ>Y[۲2?D;dXFQ cy!FRqOiԑo XZ\dU攭zRi ,yB7Q( &5TO=ٹym7ue\.$!\.{}}r~.nC}B:ݼ:1nN{o_oQ_cvvV؊wsŭ[cgerzs,nݾϨFN\:r8eY0 cc(+AYTtm8¾S49oZ(W|(,7J%yT;]?lT5fw/_@xWdVtJ41R o<3(!V0؏U|ۗ02O^{QpA7xyqҷ8In;0.%BM=ra޽|TA\K*BV@auMB\ S ڀ7-09 V'pI'+vT{ bIx*cJȓdXƂ ׍ }?E\z];qx5AB?r7<< Mv! EDž|@N8J#HA<n#0ƾX UOv -QcgL__7\$?A\Ț'ɓ>Mߟ`` !o|x+ ?rcqi V8zOrT<9q 4<TӔ0GZF$La¢A81ܹ!O c҇e45\y,6n@D"D7޾>tCg46K0:BaQo4Q74]G2DZa,f 412GtÀm3L$XR0B Lv#| {HF;\~ÝׂrJ9{ Gno_ٍssVPIa/ kqA6C[ES u7g/ C:AH<^"`zem|/=v)X+$1Hj;s,֋r4'9Êmږah4J02*v(!x䑓XYYA2DXpB ړZgQ*L>8 IDATUޣ̯Z][cLWO끂ul+*_`ȄG8zH #V L*o xp}C>Ɏ9|Ǹq܂o߾bI}n#tMԺ:huZ8q C_}?0}\.} s8qzR1722d2x{J`l"IA>:Oea;TXF$LEb}{12 >7{~O&8rG7vgLP>0L }YW[\&U &T.b(e\_:tĀ0>Đ}D:M}ge?łHCy=^9,}:7~=*~Ż;Ǐwu<[ʊwTg'TwT h}c`b7^ɪ$-{`P\mDrȪdBpVF ng],av|O$ŗ&LӀeQ|_Bw-)m3FB:_cIeMdRГȍM2(Nc8 1`P_|4VKOE} Ea,:&/c V7Y+kfsh"ô( X ZSSv:M((2{Lj㮽+ʫy#M\=4r*-oWhT=辎 lz)SNImFpq>p<"۹EΎMfHlQ'{ׯ_?NpYZYn1==>E3u;ת7gO5Q$L>׏]Ϩ)xPx|LOmCԇQ~a:{EG־k'1Q4-WÇQTBX5!8uΝ=㪤v*2bW/,q$.GqȑX^^q}csp L@<Cܮ̧?w:%cj( Tv3C;=@_{4ugQ02: rZ*niv42t]n B:ƞ֍b!jꒁ14(DՌV OPiX9d XjNGcD5v[0e/ڊP'Tk`CHh& zyGE`].aVVqX0|'W?`C$йRV,)Gl4xwoo8X7n|(l1ʽ4gktXڈaĆYn0ޝů>RN8!@t}Eod0[',{^iSc ԍ·RX&t+?X^^v!R{P ~ oS_2{})wR'ǓO\ݻq3F}-$grr`&\ߓ??[$ у{t:-Sz hu~%x.묭z $ϛ&2ٜ]Y )@l@ɉ}R E"-\vH;N,:]kbW8 Du:npz^aq? ^lJcw3 Y$Zoʊs/,.lGŻa) b1Qvpb,jÁj۝u(YW\GFч5OāUgw.^3ɼs=[[|-Z gIQU<q7xtx/҄G:LeY;NJƼLr6q_HG&aJt(RݾmZ6WOXmFH?Ily]хȚniO]lwLn\JvC^c] EQ`=+1.BGJ ȊOCaxw\LP<](sݮ},k=N#qD$>'=':~Bɽ$=E7J `EuE A bZ9 /^t SNIOq= d2*q* 677aY/Oq< OR(!2/0Cwun뺿K}"t>'G6!(TEAF_.QtI3"a-OXV7p(BlLɉqllnD&8tMcՊ3P˴߿uap_7pɓH$P*6ё`գLa,=sƁt5_y>ODK #Ѱb2ˍ,i+τ⺋Z3FiR{ICtΆt=PqLL;0a F>l>9zt*49/!9xrB_` vxq!qw悟%c0~M~~6={(ۋ6JRP%rLMq;|66X3O?uz%;:8SE.ʲXIj1w?I䤷*;ͷފ>›ok=H%6_}7m;ŢTJ3ݍ-r -󇰻[iE~& 'm뮳g;\[uAhf󧉶0ȪvJ)]z{uT5m|鋯]+4}}̶ƕK R09}5thͶ|.l*mST?w3E:&tSC2dZ!`bl/>s?z=\pFa NxtJ|Ve`aƊhE,`jrFB&AXŪ7w::ȝc1 dd̪{@UePTp5$ZPZ>c}I|Vs9v?ZԢ˰kS Lxtܗ%R@3Ro_UnG m^7]i΢$uG!pVUwIt3'Mxۆ[% d`euŎWnk¾%!., ۞G jp&"ho'6>F!$ -⤖}DP%-G]}cjR LCCh6i0[p?0lbH 9qk Q3){}Ok?5#JiCTB>C*B,Cve1{FI@J73L1ڳ3-9&e8ptLQ-$|>zF+[@uΝ;%^E  ΐadMڽI#G4Y9}w"|H+k3w/3 /y5rIX,*eRy;+w*uH& e&ʕ2Z3; LGX(d2Y|2=gΜcCR5xĤ^b[8&QՄN_{~9p*ZR㶍N}Ugv(lZ,seܳv8X|Mg/7ndc?;(v7 AbIT4(œ*^rnoW**j2N L#A>E"xw_BoqiKk_~{( g"Jbyud[PTaBuGk@dhP.WX ӓbdTH&]ox2 SIP20Vrf˾%%={D:s 6 lҾ` ,h6hR$,6{9i@C5 J9{DeV‹ Àiۻ|R- Eյ5&p9 psxpɆŢHNq[XlRJ"EDl?wJrIl6*^ qRxtAvN:m,9 {z! =0{>}Xmңn{<'; ѧz&Po&<t)aE r9Qj/];M_Wh=\ALqtVU߁NAWʪs% ֽFiZ( S@-d֝"Si1koK&3vu='VfH$*w0çЭS^sӁiYܞ=s駮bye]'+Ӕہ&..S~=K^T:z^Ax<Ύ3!P5ūp-kv__;l7䜥*OsMEQ\{T fi,HpۻzТ"0<BߍȺں#!`J֯׽~d@)QNh?f3ZI¡3PBS{ֆaJX%!*-g ;V=0>ۣ_T&;ɔL ]ÇCuV vx|ncrq%} .+ nݾ*ui:tΟG\BRE<.vP'yxB^\d깿m議!ΜfAybէK`iHJsIv||Y++?߲ȓEa%[W7ƛoajrW8kĺV3Wjs]!*%`Yd jȕ Gaym&t|y.r DZc A*B0:]7059z$"ө$6WH:n,n'hAg :u=r5x+Gg#!鲠?P{<w}DS?F@gurrE.&ۣs"e%ncvvjH757;8*;b <:&''ݩil;9K@1Nz m%?q8ժll#ϣl2kOtlX4}GFF022j[- h fӫecttH‘XݫIkGї}#H2+q$<WcǎJb؞_^ x峟k>ׯ*5* =[Y?000^ ~pt:ydw66zFÝ ) {k] %L&yz/5 ׫/3[wɘ{<#$< A ~ *J IDATg_{XgͱGCQ>rGjD L-˲z=%Qw:Ya|KT}5 0-ftd|N/H߈:̙3"t~ΫnCQTs',KAGR|/ c"rn߹JRJ]:u``lن]Q@[/z^{>̔Zb1:"^h6}+#wl820xU9kIuhl~t~ Qş||1`D]8wg75+.:)pzpN\,F Y&2$e ax VDt*D"*#WmS t c#C6硁jRojn#bctwWp*(tCs-agXLŃH&S-#JP( J!/P(`pp[&E@FAF<QT,1" 4[mnQJ,ƠTqH;zK6z"ؠQGW"$ { ZO:UG?RxLu/+|+6l*ʡCrQ.H!LLLl؅rkΘV%'ǻ@]/}EGD.RƇ:|%ƛq.leCq%j6^ʥxxt~l" {gh:%e1Q; PY;w}ݮE-$I;|pØfC:N8j??UW5_Wg|8|˾"C7\<tƽL,ctC3'!s!n-k:C Ry`` 0a{Q(vww}s{Be2?NܝH ͆C)V&~/?|0M~|kOOcyyiO2\A sQ{޽nwС9,.>t PesLOOIY1<< P!Ncww1CPhA>_#/0NT*v9qxoPpW1g2Qsz>G{2?~k_ą x7T_G$ UUɓ'{v=rW+sǻq|m~'5>Wt0d2=66Lmb bcL㌷AQNh4 'Bbq[[vёܼu|5V"}3? :ʠŚsU~gz\~L?zy 2?*{\g~ &O |/oaT_싫/?yBTE&%ta(1K06w~ɉ1XBLUP*Z:4\.R|qdSIh\wbnj,!*70 #躆]ԣuNO{H岰, FR akgx3ӓu> @j D qUEޱ9eҥx'?9#_ko\Gb)xV۠?)Gj{Gd(<c Fx> 4h/M587h׆^B^f|=^!^!-'P==Ɗh6[ο=ą"T޳nffiʻs]A, e;\#\Hd"Û\2::x u^[<3>'(=k:R(8It7 Bo(?x˲0=5j!$ G翈UlnnPpRB.wyłwH:Nb"(v5~t"VV]sNJ\=6VDC);]!.'O D!w…s簱3~3>rX[[ {i=mG࿸~LV#t?z{;Dܗ!IMӂa0ω -LJ;bQ,<vOoB#c,w\Tu!4 Xat:p>u]b^!΃`nUNv fӕdA. UJafO$:X bA833q9{籸|5,`g,A  ^g-+7^ZF|o9F{ B &o"j7]]>\s:t˗Xץ_]sp$F4{)yY2%upK+G")bG6gbod2ߘ~,fZ* L;^T?mޕRL60\`:(sZ:n79t ]RK9${ǭ۷áV@(jw}6As& w¯O Gm 0E~6}6s(rrPd{Kx(KFG6)4A8MP $3 mE ?ݻ:CyBAU!NHO CֻGrm0hf@u;[{|ccv##hہg?zΜ?uuN͞dYH[\Y_0?[C~w_ΟpK!ת@_\vlٙiju)ƒ6&å%TU >?\7md3ihZ O;y &U6 4:&LMcsgcEܾ Ã2X^]GNb^J[124 Ǐ0 6Amfd" ôPATjT s3SֻUQQVA- !_S$L;ث1V0D :vmw|tyxu?Fn.O|DKxN|9߰hx:Gm*aiv0u]gET*D"Z3ٹatMwmmPoa*Yvmv5B\G$v-uxKz*H`ddFn8N?gE9qvvIx"!!,gm:0LLnkjCr&ߩ( N:>q/;x>{Yڣ%Q&{chɎhC9?+~_KjHXTvp6Z}pYG.Ǐ՝vhnomR̨Iq$S)ׂw<5w9I!ĄahYkyqJH@ljx<.[9TUeD!8###h 9Ama?e>ɯNKKKg$4McVgk.x q,g 3SSS>yʃ0]]]yep*le$rXYE:0hp;_+SV0cJ+EQpA Ijn;AIϧ_޻4ِ%<86 aLrȗ//xgCpJrKENã#_\*111)<g i ֭[/OW\agab+̌B6uN%g@1jR$R (#<<ҳr&ti'J!)` <GPсm2eddA|#jGoO9q)f ( b$,JhN "|ZDNj9 v{K6_{od2 EQBUGh@INR#-gG6"?gpmHT^#fYb1#CeN*iRjP +_E\e@tnZB!1k94M%ZmL Hbk{k8}0T`mc/+( aTJ*ŝ, JZo8~wx%MV|b-覉c &$vvKxE_\B"iZch6[]*eYH$P]בH$@XE,(bL&$zPz8E]'"=0Xyg&EdO>g̹lZGXqz34AC#8 Xk SI|/OMMVttg;\y :XcuJ_0c6d9 !vbat&}Gp ,-/Iu'?cU,Ymp"$ޔ+$3o۰_ه G`fzz`RڣネK/juc2^c z%Jb1wh`Lomc}Ɏ7BtwOx(Ԝ+ᡪPF3$2KDRQ ( `+d00>1JF\9*J) 5hn:u+@7 [D!r=LB H!=T$tV8"@.b1f?Z`s! tMs7O NyYf?vL0:@a8lNP_# +_2^A)6ٳgX5yлI o .oϰ9 (U\ nzkW׾u&ˆSj;&᭠ &7/YZ̸A)'#t+eoׯ]C^o8{5s9=D<݅ 9WWWqIF8+ pn63q雭b8tI)9!,{sH dy땘,.p~檗TH rClJ$UYeϣWtJmyn?|߃dP<|՟[D;w\ց ?py8Dg>2޻?[%2@*\떳ߟ~),\H~>} [[*C(a}O<'޳^2.w`DZT͵^ݢx<X[^Fd>-(كުհ9c93 oRV\m%;'Oflq J1whdQOdd]plysh0^.U"{?@OΙꁻa<<&AM)nxx+ ׼1t-yA,a~~xS“K^+j lmm͝tx6eu Eqr/:>} '=':~$<_콃)R$TUAvRJvtS> Z IDATo4!U{%E<d/JpgVgeodīǹǤiGӺUvUO~ d;H*m#ݑ#F&O˲\ b7 T u& Zt,CN9<*TrYp,v!tj5@Ntz (JH$8u|kx4 ,`em+k,N'Qhރ%} akT"RB/"ˡaIcGQ5P֡$2 6w|-$'qoq vWUY@C8}8wvQ&Q*f\B Zmhay=Ms'Ԗ>^iOxB²4( Pt磻8IUQDZC\@dQ$q6*9v}<ξ#va{aێ;$ bjrfR|"Q`Q[>mbe' pl?Wk=GVcŖNw ]!Ncmm5祖L6%41776g۽|Es"إ!O=uJe"_ >8rJ{.h!N0~#}TIq?dߋGTU)m 4} Q\ڗ`}]+zG?Rh!{BaK3tGzn9⭙<ױp i \!SλeI+\uHq;GEuꪪrSpݓͻ+ ;H ͢Vu[{ QaEC8+m)ɸ:3"UP;C6a_P"@UȂ<LDrJULpd8{ 6X5v9pilmoGR芢8&VϺ)/n8sssnc%O{zP&4v!aË))b?Ûo۷ABNfϜwg%<jRH*#s{zMP88̽]0r>}uz~D1 7.{Uq: $p FгHsCzE?\ӕS òlۖnADڧ*aaNB~ {F/]C+m2MptaE%TiL&O}%ܹs׵׃9S#o޼%opЙ!՜)ommrO%O^m}\`b|u.ӢѱG#LSX;,n lzv1B> ZhkB:PUFx [,7nA&6N.aTF,0,Tj5bck CD"GلH@Xq[; y9diuTjut:R$^| ~h &#Tk/|N*Bt: 2Y JbUBG !$>z8/uLJs'N`gg'b#R?EQ4Xム',( gp;|!OB$1=nܾWw`<0تڤLi"_('X['UU]>" pZXZZ֚]n?Ѐ5]хNX,\L&wv8&Buu{"QUՙOnO!񀕕'N;$B$D|#Jr",\mQD!X?/fA8⢱Ε-*_{JxpC|27!3(׮=uX":tb̓'Qg?~ u;ヒ|>/&7TPl)b~pײ[ Kx m1>~NG9:Cfz{Qa\#lґ{;NOui{ /<"&r Ko/tnlj5rZ Cbhxسds͍˗.beeU7JI] CYLLjufkk+Rk @u?gd4ЭVw~3Xŗ%Vo0Iv>Bpu<\^|XZ$1D=W CjΞ9mYtx% tv#h;L L&"JBu te$q4L&p1NOj0 TkuLL`sk lC)huvDQ0=9ŕ Ӣ(R6^m|x>3'a.9 ۿ{V p+sbKOGVG*ąsgP@fs00P`(wzPJ"?^=>H|p2+R055j5,m03 ` :sM'`I= q4.Y*±:v+P~IDa 8XV$-U;*)4]~y1MthH!ƛEYǓ͑dw4W>[Y(n:dxNpEi9R |]xўg>;w;P#;xpN&Zv\ fyH< yI$揓{sክ~g҃Jy! t_Y%.&s~z}%/Agݓd z !՚cl*hðXɜmmmBQ1nAo& ܉8.0ۘŢMf!@!T')h1ŸQ4Z\s'[u||܁>S|,@? q ֶߣWopl6׿Osow "5=#] םJX?enkk~95r;N:% \r+|6bq]A*y1prt6d`RژkۘFV&˺Xa-\mzR<\\tUYwHdIV8v&L pEbJ۰odaw7:dnn6\bϱ3$<{CaA\/~p!*ʽ)g >X[[+: "%X ❏^謨$=Q5|υ-|Η~ms1!^j8wv"TA,y ?o~kk+!q.zhh~ދ {ɟDHt߯tY.Vȏ:eY'^n|d2j)TUqm~rO>WVݠ]t',QUOOO1s$&&&.vVX87]JgN\҄ewUtNCC5;EUqC $SihZ7p:<QT4Mtt X][G(f&ǰx< ܾlZ~9M|p>(iy@.X"^z 7)h4XLol^#I#SpdnEZ%  jHRh.v'k{?`/ݤ@uzo=P*Lvzm|°#jJ$M&`pxDZ4$>h|n mIOsI%tQKns@33XuK%PJ}~P@ą xxEѩrhJlk722)}{?_& ~:O3r]l[@7YNoQ_]l>s=l}_\.3dٺZn$K\`-ܙFV z{X&y <3 r%BZMT.qT( 9R;A9'j a;!n8:ZA4 ;m?wkkxX^^Aw jw5M/^f_]K+, eSCX=Cr 2A"@$o/1,౽ xqܼue18fgYu!({>uumˌӖ]6䆈e_/ƍ`kԡ% Bu>8ߗ1nɫs[y U\29',j|| fStlEݏodzfA {F!M~ |v`[йp /tEऩ2ąaMI{~Ped, H=jsvp]{mװ I%CL`ۍ&>oI7, um\(i,j'D.JaxxUCTvv ڗ L{Gtoe?fk0/?Rɗ>"[=KV+ED9`Jts&ua:N>-thW$IzEDJUYZZNvvX1 , .ف0#ގvpHh4 X`wGkٺtuiZD߃{zDxDFV.f5ӕ5#˃|ov%{]Q>5f.r"! CVфjH%(KP@"b(* 0Ey5(PA94MCZCg&\LNkp$LD]7Ձ5qYgɎO&!ӏ.Ŷ< ~^:j'6٬KQ #FD$jU얳0'3\lm-+*5`|l?PP+MD*PT$Si Eqh0T-N VJ% EŠ~&,W0<4SVG]fQo+9L\qk`ı+8; 4  xы_jK1  ɤ2s̙@2Ňܲ~AX|>vߗ> z'ɵOܔ29Wmc)`̞2wgz2.TEE8m$.E).s@, hC_o7=~Nd Em:4Q)×/^ibdd؅(JC?5 to5>X>?~9~ᇯ6}FZ 'R)oͿޙ-g#36;`pwxx&>chT* ܶwۙ`++ v3і( i:;Q)Q.aDZ1 bwweuY IDAT G_@hT:J=đ.P,P,ᵷ/qVFAVҩnܙm"ʕ*244{,N0 ܛu47i4\VQV?ϮkPH ^vV|x6]?ZISߏi{11yg^7Y(000_sgLF^+ pq8L˂o"ߏ?h^;LD""!;QNLkMۙ bQ\W_a.?tQHC'DžNˤ{AxcH&>Vy/^]݈;4s>%ʮO' %hrЪu- 'gNR,XD;ELؓOc(Nc_R \j$ _Wi c,.O¬C$(jss PhP:uZI$tDPDOw¡P >Ker9D"Tk::;;I ,(d^dUFuϛp2l6J&} k\LOVЅ wapΑ*Z])V:..?yT+b1b11m9~$s*^RD{axo1qXu6H\2*Rz,Nn'IiTZo.ƣN}ZY栴tUO!&İ3?H}q{k_m^Qx'044d@P@́Ϣ YÔҟM>/s23D J}7Hĕ嶿fդLcۡar0Iy*,~uO*@Z_ү\mo^})ܺ} B%Pp1z)_5UARdLA&ٰIX] &DZNJ冝GLXA( V뛛jz,㛷Q(ml"+f%dJ1 D"!;s ssǢ% {AMF9ޖ>i %H36t{)w1HMvr&QDdаJHZuS}b֐sR)쬭CUUg]Xٹ9$  `Va2vccE FfmEWf(»-!8}$fBӃB eDӨ,M rcCwȓ rg>}ܛrKl/ɏ$6[x;-\|Jt|mJ|(aA@a7ɉ̉4xpyGS`~é(qqO"5F'!_9J/ɹKt3'Iʕ0&P*Wit8Z7Ld m `;öDzo@: - J0;GΟ"ФݍS0cնD- A4)g!T*"QAʳ,GZ/~裏mAYgfζDۻ< {a9]_ʗ{Aϣ *->c1T5V'ui:N1[L@ lZ.94 G&5 Wk6>?s"REعVRY[Jiw|~Β#ĝwP.Waq%&̰ ]$k!c+PeiOҚ#%>ܰ!w5ckU{Pccc?ͮDf>u+ `=x<| WVՍR1lnmsǾZYG[=0r9 $ٺ5X`hp\޷b^7>PRCCáKLx{h]" VkkY^{ܲD)@`QTRT<#-31@gF \Yϕ4 nӦ;ߺ}P׾bU,-.5<^lmn r& /l|Y~(A*DZmlQEA8BRbye l{; "J"s9 7rf?p$ַr(hϤgl *m1cms On ]ixi\q!U@_nܺzpHAow "Px,! ZK_@/1ۧ^ClH4 0vCW+1R)۷ޖԉ[>^H1x!65 (7p#j_3u*nd4 巣UU\A )'=~ y SQA]h z&EC Me iBb0ZlR B|2%VJ<0<۪=wE6 p:n" *'J\,H$PՑL&` X*X*Zt+kԈx- Cop UHa4 x%4MhBx~~CC! |U ixutṾڭ$|uD<}'&|\6 tЬAG{W5ONcZyi1`al7 ($=sQe==H5ltu3ЄąwLac \.RbCww7֭gso}(_X #/pbYWp႔@<f\co} wTQc4(GAGG{셮mx񳓓Fc ^ YeڱGAzdXAt) ivN"yחHsgX#RlhsoƷ<_o^, cMO_w4 V>Cv=!WFU}7l; 㶶6Z;dO~ ׮]8>uWJQְёlrưx PetwcaqTH[sJy (Sur0kDsG(B,㝿N^\Bi| \q]K.^\tqݳv"";@QI;mieo@D" tU3dl{VD5g-. ࣏93 ـ!vV.Wl&;U!o֞3 0aQ5 MUGQ,z"&P5Kd3id3iJeJ P⟅_O_B(au} (z:03x O=|>LDG{ P{3s^~-(M@AV6"!i0:zT61>#X\c(~XL+ iKQ"Q*Ѣ.1]zbׅ3qD)BSÓȲ)S-JxA {5!^wRީ&a#kΞ9[o[|I ,^}5#*J9"X|A1 w,D|iii t2rR%ϳ!d+KȲX,R@0AKrk]~R OS)"L&;^eӧNٸ;876PdŖloo>֘m144dC `IjZ[O1Yң, g"wļ^)"y X{MgrwroXݏ9r&z{{̟9oa<''q-do~sOR[E,t5 a~aB: 0P'(3338nܸ * VQcߩj,с-Kqvcm}c#XXzmmmJu)i<${SkO5;6>g^i^v45F{C Ύ,6$3 !G&wgchaLMOKull3-HV>Agzb?K{&&݅xˁǏp8, %IDoخ);Í. kl\K/ǎ>n|e2m2ώ۟mrgg=-e(-8x9v6qmiڃcKZ4E,sEE8nDbGp{ez__/EEoOבJ%PQD8L`]7N**(OF"ڭjJX"&ň]$Ie cw4MXfÄB!$Md7lggs!thT$""W?+/g?Y`;cxvgy:z>裖Vl$:4  YPwB!܇]wT2Cl%^cb|"7T4 uNE(I(SB! ml^݉P +H' RLm6+Us#k|TUA(F._D:NϢZ&(h$EFB4C*mq,.# \*Qˈ)6]Qۃ(Ez*rټAHK*twt{3LҮDh3𛻖|F$Prf0r}#hܰ]TUm$HZtP{{;r|.9upp 69K*~}>޻wabSTbAᰒKQס<` md@__/FGFmZ$MתlșӧoW񓟽8Gt0s^2aG2ǧw=0_{WZ7#\(*)%SgUD!?8q 'yr^oHqYH86@U944~ ˗/50]] 7o5 _hjz?hoo]IUu(*L9} [KH3Rq6‘(T-V(H&'c.xG1=3{&lJRNЀRm'C { ㆉli@UW> BU&ݭ%i~`s}Esg&7ؚ{1icGA>SOK_vzSWUUܛB6.ﭭ-Z*w Eub.PHP ҐIQ>XtJ1tV,đBHՑO^y?B_wm2 ry누C4`:2ȤP'>ţX][C:نl&ؑ!X]]"o]1C<:=33822̋84M ,0,8^Ƈ۫b;yW?6$;wb`{s7~v{;ݙ,qd2߄G6=V:TULW%P(nל7Lm`긿&VVN&Dg{;;mXt5*J4 wܵoJMXv!҄G[[[ϖOK?BJ$`+D_`iiY`:0 o; $e r%|'T,b;Nj_| zulm.{ `& |eIV7i){`{;ߧ:番j (5뜉ҪrQwsl]ժ|mmqb?^a_IVR?R~yLOO itYcrr6W֎%77\2GQe#aR4\NQTx 4 JSU"}Ws' ((ы Jf IDAT왘~- CQ(7iյu }('>x q'xw޽{$m7-˯O@ qY糄 O%}C/puE'=Z=tb ox@|3!"N"p84]l0))'wm>^̌UYVr흘>[+ or떲ER;@2ʚR`nq :Pam}x`F, JڈkEFUUnts۞ɠVYD0LNBR@޽{[BeKȈH$p),,,;Ƴccu \++|ݳxgy87%mBQܵp$fww7:::9t`fg8=#CB(cO+%L$u%uc#4&!秣J'O2s9atdT匈A}8g8z~UE JVmyvh<<{,/~ rBqsJf9Q5K>?׋qP gwF5ԼT*`zqXyZ=tm|뺎p8}{`jV\G9H0 w# Hյ RI_ZF,Ǟ oXN2wj*Q1YOD%i1s&" |6.8((J2\v~Y}q,//chh6M :B o; ||)s`yC^ym w~6EO_7n3xRy9xeJ $+tk8}.$,ۓXz/JD$H:2rć e;o#L*Xvi"Kv"3X^t+$(d~<iGae~/4K;lFu{HlFRnSjͦ\A0'q+_׮TEͫeH2޷<_Hu($?(ekV<wI܇[n3/,s2H#va|-cG⃏>ƹ3[ocb| q)[.T*aTǥn _I̦2;=JhT* u߇յ@7kvvd{z~uwuC,OJ0jw+ͩ9h㉖!‘h|_ _gL"j'dXmLVa`zfHdVR щG??uJ s9T.^cbیxJ@+AEQ@008DE߹Q3]ӖQ[jO{qM|1fg9ƾOZ׍{Q*M cqiB Tu Jǡqmtvvbskp{q4TUEFam9k@+/G{H%XZYC_OVZ v &:U0 ab(>Ay54UAZAX1m8SRgS0DjZUċ{UN|F.]'6[:(+Ѫa6 IRpx[CeBjĵ" 9YĞQ9WlҚىDI@|h)S.JbuЮ(Gkq\w=δֳBf3*ѣx79 d綕ΨM'(js_ȱ.Qy{H{IN&n1ژX|T` ~<$;;Ϲ3A-\*f8bYq89EZ%|E ɝ#cbUK]Y׋L:OdX,9J%js-CA*D^ՑX][~;ry[w"vqP&0ROxdY ^asWuO77*t:Jxu?.xB %<H###} VӖig~oGEtpT*5BLQ&r @UU:ڪm k4'Uԗ)bxpd {{[E< @LܸyIT T,/-F\VQ.{N6(OX]4z`KuJ1b,}OO7Bju!od L $4?$f4cuܘ>I8uG#nE|V!P\ è퉴nvϭ~>H@AXLx&EAP@*UZ=۹1 ib;CT6NMcb| K˫ `qibgO/`(677О`zfj4a:bV;k"l@VU*+KN[ө^4Pg6qmb5Ch b}f~~ d2bQ#*v ǦUu:0Џ|aN+3$'mk[PO4m)M[?&ssspqw#62٬ݳG ʇB(ptP2N]q DQ\|=(l==K[!@ H9׆KdlT/<D"AVpCw'.=tssnSQ,]bkoTu$ Laum6P[ZC}_µkEKAEժ9_B`%#$4֜rH= rg\Fwwk= nݾ-I"qȀ'&Ό<kp]M-V9iGuF<_K%( @7Ţg0ޢ]+tSkh$] PUkVg  P(G"ȶo}׮_u]rM'l͚3Ư;Ddr٥EA^wi[s#%,l4CyɃ PsA vYPӷd7u|2y&RTUlظOzmee_W* az &<%BЌc:1=ՃLN c MB!P(l%q.LBUEmmX^]GRAPܹ7Ee\p||݂1b Ӥ0wB!;;D<ɽcǍ[iP`4t Hg(󶯯N$666F!JfU 7mT*"b%UHS9ڠZ5gV0llh4J,}DwlJGBEbr m]38/"*HI "0?P4 z݂k.s}b0W{ibx<|R.ikkC4EV`W8iuPeYy ))$f +I;e'ptdĦמ}i E.? ԴF h3m}}wNkEQM+` ?l{{۶qƁ& lϮϡÒh%nb~Mbt^hXtŽIv`:1as=bJs!xf=SQ  S4-EOݻM7- iC8 EQQ LP(P,q(iдRD^i蜜PSU-"O^u!J%L&ׇM^mTSPUig4RUH*="!dXٲ}4#)qq@XB#civ,;XEzF_$H ?G!0msJ(Oc\8m\kO:\_Z( `JWa?VӀmBAF;~cOrmx%%^:Nx'!A=W` #1ADWRY;yH©iE/ITMW5'5HKvO>!M6[, `bbe s2 Ncׁwѐ0 v6>qU+.%AHQ^$I.܋$<;Q<EK-QtB/కnݺeCW` všUUa<ąBa+%ǦKF2I9EC%`!B1:yD'Ss(fUt!{|= E[){9y}xmv{~(L[Ut^mm X@XB$q>8T* "F#V, BZF3Ʃ"+cUZ-j1bS: %ݝCLI5t J3!h&L/Li  @.1 >#O*sy1H$ CNhnY];$<{et SF~ Dc1DQWSs .y(z7=n[Uv[ͨR ̊Anb@?֐Oš=s 3%)e`AL:%+R*±Uy$>nolp<3ADpLN:r!q%ڙs_X(OPzpK74~jܸ- o*)+<ρI\TFhfR ?.`?9A'&xb"{g]d%![0 %6'>}EꞯTؿo fH q_,Vm0bSXX `C.TiRV3tLXArw}aUj7b yhjsgPa8t M$"$H$ àIWhiqbK 6a#,u%pД$T9??& >B:ϖ;_ 9udr"a/?}ٟ{%ɜ%k<#"lj5LjأA_Z,@ ZǷ3v+JÿWycP,+4|sr>Ձ=ģREYkhhп9z IDATp(.oP(x7܍FFo\x.BokiihϤ17h,i 3W5F,{K߸!J-ndFN崬; 悶9=nM js % ` p{oi:0EC(h H;ccif'Oe!* H' 8?{9ǚ..ާ@gwvtQ 7=kR$eO$m KQUx:$9)Ys&Lj[*HrAۧ|wXXQ4S'O`fpH|BǂGΩ+X^DTW'L&+B]F${&dv]nKxcnMgqmIx]:;n~G05=F5/?>{S ^/b1<7F$xl>vnۻ˃/UUˀ&~Fw.&<`ɒK[K||EIx5 c41 _{S~qK kgϜF,sUO ?SKvt{Á{}@Qyʍ7:rʓxǥʥe], Pr/4reqK)[B :;(@$l&>u`~L&?w֭7}|M\b{(p>ٴ, ~(S;{+n<!gnH0htZ+ieN'ɽumJ}ќ(>01{\qpD%ymn$ݬ6#p@S+Y~fzixRD&i8t QG*i8z{@LD!  #34l;uD+m|bNAxbyb6(_{z5^رD"uYxNfŋu9K-r{r9'-T߳'ϫ;_߶ɯO9e FDNkt2ghh-ƛoar^mW^!hX BTu-[w፷A$R)= Q(qa#FX lmmT*R)CS666xF-x,d;lܰ /Dbbmm͝p$K:ޖ)9S. MӰH v.lo8F(&Jg{Ql (R[i=}O0 $Rl6\;kӇbj#eY[$J5]w^k-wSu`9ډmbe.#A'6z *0/,JjR=܋\RՐNͶciy 7?1pL#GCz?hs}*_HfP7{Л;tkډ lrO{4MxHuyo?|gqMjh83aoAVv̉q Kz4~K9*p xk+t:RäXF3YZ{6|dxKKKj" vufFQV*wl:z{{x(jT͟Dq.L&Nz}Gα佑H`{FFFl?(*v{0AB!|xͶgy"Ji{&6z]]]a'palybJ6y)|{Y~WW'[0 ++g|,dTY=g>( 7č Ӄ\QqEWExl&M, T> l][ =]p}r>;?Y࿫d6A+lU`֥L=ݜύpo >qc1HX,z"rM:肭C!pػeJQ&7k^0 _޽|o$Si tvv`}}?}sof72aښ GDd2t2рsTjdg')CnD" Wtt@gƲyv`={o֮%nWu6MOoϞ ܽ{'g=s4zϪm'ɵ^}"쮏 ؏ ,u$8ϲ=JUXD^G__u9tCBXAQ<XX\BWg7x`94*6(MfX_h\St:af r)OUwxIm@kW _[/:tOÜ<:Zw!BʕyťE466 Y[˂(B>뉓cljL$ŢLB  &.OT*ߊ-TK&A>r3TUh>caV`_oP(p߽QU{^P[[(hݏT}aRe(<-< :^BV0CH$"Tq}םIܽ*7:,!J`yi -M hmn b`?.]@}]-B[7!tRQjYi(shkiB8D9̄4IJ#BF!*d MӐduFFm&xmMJUHa ՎQ;dh!Juכ҄2!;[i Ǟ=mO &}挞𐌝;v$ЄG:dY io4#-M/?dN鉵&<ǜ]A j~j7ߪyK౥Sץ6k\. <|5rYwuD"DXZZ6ٺ.qڊ˗'Y!DhN4F"9G W\A\FKKo@dq͛JVFGGY(عcN87[ث- 3[w9<~dH&C)ֵٟ8݌ .8/z 2!BNg}\F"@KK Μ=gy=.<55֋){X+7To?~3o~;hnj P P,E?*W;㞷ޅ?UќOswvvD%kN%Iq?zTW髚L,[FG/@3E7YuH%l{Vwvz?:EY&}k9TiQ' g%ҥ'!Rv2>\Q(CHZ1Mr_yJ:Q[Wb( >nܰ@@U3q 0mUz iP;Egݟ,{;MFLNMSndao"/k͢D/[Ϗ_}zv:uBX:!hlI %BAdBYDXB4aWlB~m؃| -֋PS@.G>Η7[u='L"8~=]71wsǼM9 ır ՌB*uM<GMM fggSy'Kh߇3gV}{tzu-U]=6E;axYc>hP I'v)$`08l6p>o-2v^}?ҟwB(͢ ?(]]pcx< x}#G#~_'vG!F=޸ dN*&'!zh|I YXѨPLȼG%xtkIPrH{}~+%cd#>*''re0?||ބ褙ӌ7s[Y`uu$`YUŠ*Y1NjV(2LX+{Ks3ԔnaeePr ZF8TSM(lpR 0V\jZt2X0H]eRGe֍#8=s0qUt‹,ڊL&cyVM\wݼU`^{'_(K EG6.`Sk2NOM!P_ -Dѭ܌t,2xwK477K6 [DBXۮn! 4::*#=y햛mI zbIv2F}}\޹W'.55541留Ob~a&tsJ̿wm2\.N,-W~;  $Y"7߅B%$[f/< %#MZd]<#y7Q'} je֌vcp``7??͛6ΰqS"ؓ\B뼏/Np=:\ݾ+pY4H`eN|N>=C!wĄ /.__(l'9" )"i 4CAw~a@4|SO? hr-KPDQi*f4i&9`iGWK5w.cIuֶ[p9_]]$4 MCag(O?Δ8ćRP&]555IמDLW>3iff֛݁]|v2PiWٷgY 矩\.悲T~H!09\B QVUjmXf P.ۋRJ58ʥ2 P*> ɠ mU(I2;;P(/Q.P(VZhjIȌb]0qwayk.G>|?E6wz NBuѨeŽ?A9Չ%F,} o!!"k>I\(Lg Ӟ^ZZy*d2g"s[(Y@4߫r/T.J-[G1eweKA0|.oSϟGoo+܋Hd2V,./Jhnn2wRҳ.ŖSh\rG''1Oe?{@, CCr/Zܾj˛zws$ڹ:7'CG{;ގB t cffKĹa| x\3kj2>[RM7G5vmyjDhb Ig9jJlB$SyZe+!Ip.[ (rϿU`(֪ѱ@/fs˜ p P, g"Z.IdW3ϡ\*"+d,rPK%q3|Eup٬@xNFccLW,^?yK]'t KBg]o'WsIKe042@ ˴HR!N<)qȝ>s#\[ߗB).KL& 5M0z"/ U' ٽwwD\NW\і}Ijyh IDATw=ETuuu 0HBTF^ⵎa{`ͼp^{zzc% 4`H4.ϙlN{}}oZ[ZץnMR?(SeՊiO~7 BHj[obrReu,#`eybZ2+˘x,|.Qi*A3ge]]EmmruZ hkmhmia~`.u ٬0 xOXB)i*>mzC;hucc#tO_w~SWI^ډ³0)rjD"T*%/U[\[aq=& NϥK}rZ Tڰf"Ӌ, 1Y^+F-Nb=(0~IsyAtrT(lH,^.xc|Q|kIiYm?Do^ᵓcckXXXdv)Pp7{x`}Yswz{zXAۥ | ҘrDk[_&tuM\yk$6zHL(2m&S)5i}Cvh7=cv< v'w{7@TB2ʊ,|t)+Sv?Ɩ |b,irVXSSZ,--6e=X :LLN"qD,H`5Hl$I<._Xh&E^hM#x%;)% B]NB.QֆIؾUWVsHrcT7WD  r OrQSScPEIgv['VL嚿__}oǾGWg'.ɬu"\}{v:嶖&=yvw 9!E ]w;r|߁=͛ʱWsO/>1:)Q__/$tr'/,:t~$&3DU9M^NOH #Q#|9žD|av=3Wc`G#a9=,jEMbX>2*VOvOn Mުc` 8q%]Iw⟿~j.Bxv_С?|I(ֵ܌9ֽ@9) 1%hk#PQv]("ˡP(`m83:wƃ=@hP( ]2.%ϤiۿO}O8"xݡX@CCCfgg͹Pm;tZ Pmm-c~ rcPz_ppHr/pX7x?яr,ͧ]c=\̺ZiGrgg'. p`aps}uѭZO_n4W̧? wׯpRE1su8/ > ,V"'OZ3o$+O Z{B߼0 gH4|>|&h^$G'S}[ír+A(E˯ Fc׮u*KzHrY5"̡Q̠ M"(JFyXD @k p---XưͲ2 j*nF&B>T\\$̣ƣT*If A,fMTj;]Xp)O*1X{ߚ[@07wr/MvEoO.OO&\2d2[JT:pz ;R.@٫Wbm]Bᐐm]6ލ GR_ݻvcٲrPP<)^>!(&&?}<tNԄ9kKKKFB#`7X e&,`tQ䛈F#(hGSSF6 ԙBsgG3l̛˄H$H&kfu8@ǟ%cNpy` -ak, wrߗUG/B}/{׵lgWWcUrݻ)A׃P,}544(PٵkaeUYR [cu|OR6>))v^9B|a^+[lؑ!p!hEƸw8h Kp4U3`m]:vScAqWmi HcPA\.3Yɧ`#2b. P ?S?Y{ '+à8s?m0$]>^3BpkvX|=  IxVhBT_ضMz6kr~-7xZcI BI M9#Ϝdu4} T,T*u ( (PeQ؀lVKZ6Bt] *Q048 :U@!fسcc'M){AއπH$ןm|a Ee=Hı` 2׭ ݡ{ʁ'< 9_ܙl$ 9KkJ"l1:wHh4wm7%[$կ.XhB|-RBjfo4ȝquJ0SP8!xh)I1c1h6oބ9׼%|Μ9 r9-lhgŢwZ&~jcS&==Xt͛Mwx 1rO%I7IB7x^wU X[@;\׷Icfgddz|nuնNoG% Bu-:+C,0V&@v `PEwaBaQ 긖eAc8 J]P.uABtdo. CpX 4\.h4U-83 ηa&u|[ vRUUR)fuyu (;r@H޲Ր˂}}t,;cDkV?AVUӰid Uv?FЮۿ$Ԧ$Ϗ& ϰxy'] π$W2P_F6jC6]@oE!,{=hwR<YqN^X,jopݾ=43O}(<,X0?'< C=麵A;(>2zۃS( fs,("[KILJjk5(Klnwp$nI}X0K/%: 6ݡ_{%</𬾻$M"y pX֮<[U, IvH[7]( =U,䮮QEp6oV֭(Y]`Ą5? POz466Dul2*ȂDzA>8Huqa!Iԏ48 $ ȩjU>Xd޴12$C5` o]zCt钰ne'Obzfsx@&]UƿϞ=@ ۃySIps@Nk$J5Ǣƚjؽk._*u>.F0jRQ?Oi*۷QSyB &'/#c(,J&^,,," X+i7 U*1:Q{DY;5_sŢ|r_ngI~455aii x pPViJ;ុkɓ9~33p%>,=ߋqe#qiQ>"*vVbB[=i(J3a߃XV2bN<g,&B}D>NR4t[ny# =8{E?֑&<5[CP\b%[izĚ JT*Y#"սU[ Vkx+'!%Vؼy$4oa-lܰR Ϝq qC3ڬwpA56US-R9pޏħguFsaa[ػ,uux',o7nD8˯9 '%/#qql0'l42W%q7c~=w~X Wǽ ei ^N8h9KMHC7${[?>-4tRŷ^"_SOw܎z‡g.}2Yj߽[qث%tQ*3^޶9Q"g@~K$b&,,,^`x+?wX3+h;KjX+P^7/73mi= Y D`bsKPY''a5\x'ݎ:tmxq&o($ ,T-U3h-quA ---m+A[Wh?G5h+='~8}s- ?441}#[ I7.qjhYEaƝ&@x^)-6  Z[Z0;7V\4t$C_/Ξ;~=8@OwxvS),\*  AwUAFH$f zPOߠknF!".z;LNnADCBmm-Z~d"fRX,͛7g07Atrx ϶_|n- AQAi! ʸ]Ύ:ܾiin+HJ~\:tmVىtn'cN ٻg7z9| #M7hdqyjm-xQc1~i-MhTW PU&q_/~{&9$=Ejcsopǫ@tNJ⡋:|vu dXT|ne:*ɉ_07_e\=o>朮m?uc:[rh [nw}+!>ͺ`8r)Ayg< &=hu]w3gUMMMoذa/Z z΄*>;={ڹ>zȠ`k<Λo č(ޗDqͦFԥ0v`*}n?8rqBX.2P'<ϟc>j]] }2{@ rXQl  "cyyY|p/^#Ouߴʗ{!Zb_խj p޽8S㯽KELYڷg7}J/Dvar%DӳB {ꍝvx C?3UݍG?-˟_4y6V'kTwXaVUyyAI\Kz\}coDwGEbbo֚18_CQĤE%ʟW~N @YF .i`J4`J rl ppyj R /Mف'Ɛ0v,2U.c}8E:T6ATBXD(C/,,B!cbT(Gjh:N.4Ux2{ٳ;i;|9%<tVLpbjkk̓d{5AGWWgƒY#0 JamS^]]`#9nQwW=QY--{$fjzNwDe]o(:DQlϞCfU4-|$ 7ڢY8PS)lټm}pgprs7h- DuwZ)ib=H{Sx(F~Я7uT٫R[eߋW0-kMvG}n曤Cr--- \dُfu8)Fm,# fTtu˯`zvF Q;+UydYwk}&N>(8r)!̧?anد9ޛKVOx466Jؚ{&_T\2+E$z6q:G1ft2e˨0ʥp ?T*aiID,hnj2}Ʉ gj}Jxb۶UDMU vsnJswG}y|SLuܑHsssF}XȐX,ývorrS/x'G =$C(bܖQA?XO!nг@m#QDm6:8M L ]V{T^?OX,"N{ }-ڸ6xf+%OszxțL>::%2 ( åScKRݞq3O 5HTU[:SDs6tuvp7*%UUsVL^e|/`њį*d2PQBf:ZfvQbM,~E\ 20ap$ڗ xQcYqYpB--8t޵Sgm(zrXXa ޲2>rF %CpކeJla XNtww;62FnC TǮ>ͪw'bwvtP,IM}x䘔f1@B hHƽ}{}_wYv܎Sh}?>Ys81v 7bƸ; ÆL!ds4mqf2u " <@~,/Ob\OMfDBM_OZܫN$s)˿3<g 9SB#Y#?6hZnX+N.!0qݿ۪;:oXbߣz'˹ʘ{L3 X03;^~٦;k;p1P IDAT&  !L˯F1Aɒ A*Cy۳{QϢ˗JeeU' H8*}%a6HS9,kT$n~uv_|`7M>,T@ܺRޓӍ'I:kۿ㗘s;֧ķJ8x&~v~~g5^Er`'~Ge.BTBXD>_jjt_WB.gbwt3?@ x,*(!:\^!LKK8vZZ]]Ŏt8DqntEgELMMR(֢P,reV 70L LbzYM}rl+8L,Czfг‚ /;Z ֿ+{xN{߽8꫎nVs{|׿Svܱc;.^ւR">*W˰$'Mw$cE Pk!QgZ!@^H&qoB!A:y3gf8`PkEfWW"?v8:::G1ZyC8@q?};k? t,I!{~GȘO~S᭩ G|MLwȆ d>I[(2g< $3H  B㳿9a)[(ؘtPe .@5E t}}c޵/2jjj<ۤYE+$124N>dېAOH}6j'&&*iz -|\P*V3+zK#lߺE (YKjk4"!9BV_`l\,@ |CMӰ5|ah|P_KNp2f[Sc##P;uqZ}X %hCm^\ݡPAQ}@b1A?/Ο& ^MrIc蘙)6LE{B:^y%ؼyJxQ:.]ERfcݮץM_}hprپUlP(oBa{_?ǟlg.{KfZd2L^_xTJbu3T^41a7?[_XNzY`R6lpkR(@Z(N_a㯝ϽDl6  gɝ>a3>F;k×OS_rQ/8fivm-6'd9ԿN7tblSbb եC۷cex ĬFG{;C8\u_/fYU456b]81v + r L_Ï=wfG8lI+ٹ%S'9؞'_Ï<"Dq6ᢃŢ"iT1G , 9G+|+`d:;;}w:oC!!Pi%nĿڹْFd9=]vnjl*ڵs&''ډyt?s-lCD1e477!Y,>SOtX.Q:\8K#/#͡X,믩Fwߊ[L˂$2__.M8訪j<F"Uo p~\[Ew7/O1e<pqA383Y xrTUro"r 8c*RᝇSmc+T2?CZ@MMD \, m/ Ы"4Mc: !]~Ţm.x2u*K%}l64aT˼MUQ*mr8F{ + kǦl9x?rmSe͘y7휓T^mOmg0&LoXsybQ̰)|5I:W5N{ R ΝpOz_xA:>v"9R۠{̈́3}>:ǩT'}?/t%y]VY ]PARēGQ_;J:d$tn۶SSmj8E<0aFQ0tB:uGFʺ>ȑziT:4CCCBżAN0IÉ!Kx96UG&˞(b1dEޅyֿ>\ރ۶ ɒfdljI~?z]qmbI`ff:-H$!E!~dNu*H>+`#M$3uر *M]jtt3^1d~Z$!D \D{.||]GZ$qoC?/h.ѐSEg쏗st#Evi5 dYӮ+~"HRzD'>1|TÑ#Gy5zz@@ =^YcxxXKЖNdk h F 9cMRm+$}.FF_g&f=8͍byYOl ga}E2Bqa %[o۶mNj/d纻YU^:$&}:s67HլZnzmG^o~<~EYR#sodlbURIh\oU$A0gxjVpIW_xѮZǺM+E4uz8wf,٪r+W C4Vс;F"QB$vH? kId2H&k P,0;;#ھu .sX[6cjjhze_@ < XS+MFyYXǂ: #xF7ШTB0fUNo ȞžԐ p8,%T*Jhm2MMMp`|wn+S,x~Nº4oۊyݻO/j%S^~_ws廵X*4f\^'Dwmv2De&\4?ό.D`g:6*75ק\XH\۶n}^x{v[W8M :hoo¢TxKT uuXWt#Ipa++n{/ 1r1+0}474 H$P9>Fft޺eKE.BWJ6LBU}2V"OOLLrՅrۭB)CF]+H+ Ȭ`ҸJT^;;:e]cР#];}U.lunb2sUbtXm{_Pt~ѮR^-eсX;DLpqXw3ᩧr3M%` !bBSv{eVRsῳvR0}}(KlW:;;s{& CûN?n&nF3Ãö 0ۿ WKx)xq 3D67֚ìc։LJpƴ"`$Vd!I 9Cx߇i0=m[H4*ȢEO6'̛iD׺C8wMv8+I*cѧ 8ZMnS9\,it%?Y ܴU* _ZSuuNVT \a4)+uzT)qUV *pUUMM t"Vۋy)M>L&x<`0`V!YL`yy]2l6v44KyhpPD̄E,c|5|:ouCu˅W ;`@Ԍ9q>>nf<!5Db[[[pyr#JXWSDK VxOz9fīxbGkە8MPł =pܾϽW}0,/-÷3w'̊2*gzPSahezO :'.o 7Ȱp(2 mU5.JƖ-xʞWZZvٰacc6V\a8tBsӼ[+XQrUs}=8ӃJ7>3ZS k'N6 Sӂ6LLN}}8*d kZ6*JuԹ뱶}}":1!g$n?/=}xE0~n I!r' eT>_ҟ೟kgG{H5G R`0D"k%H}nM777 2:ZZbkԲ}uvvP~(vٔg(B̷uNimnvOH΅nk:Oɒ~A6\`=jwUt{ӫ\`k [VYx";D DP(t"u˺Ѯ#vΈ" T$LSwJu*'kq;^oZ|}zW뤫VPy_߹[Ւ`|#DAMM 7X嚴CXtZyH$ Gire^> GPE(AYդDk(X^^@^7ε󩪊t]-Ð8>MBg{KK8qNil%ɬڥR D"cU4 X Ay=ʯ7q[ɼ fggCSm<UU@2d̽߄`HR9H4mZnj8LivK ϵwn,!s}{ bb@o{"}?~@sSNIu$SIs.^dT!uw|_wI;^ 84h{撚X^^o3nrǘ5Z~&NrghNY8?,ƿOj< 5a/deH6N9#2UbAYh5ɓcR_ $?!8&<'} ; idt `jY IDATs籵z ĘB]bUw6S}Iq0tٺe6o j?swj ظq jlWU,fa/?NFH$N?*{~:G ={v‹\ط焇?5tut$Nk_Vԃ {ff9>߄ײַ㥪hk3q,j9xͺT-F6n zzmF:622yU -A5iM!WOݣkooc6Y-E+Z5#ۃ&al4 _)Z9v45G}JWHx466`8s^'xJuu:u}*DQr(Fn?md܆o7uR'k9֥2UGoܳN m'jYHD=ESS}ϻ @/DzESTSorGN"׈̯52U|Ʀ*SWWlqJXגU:!( P%P  b| q |3RǣT*NPH.Q08Hn( fMS+Ng:¼gҦ=FDcqh RK|`v!:i_LH 0(.. 8;ˈyemo Tv|5Tx @_߯|#vG{;-ߛl=yiwn 81vJܽPÏ;'jˍ[nB,q ~-wwuYΝo|_3??p͛}ҬBpr{۞!k.!8.^>(!U)hkx3 ޺ yq n9qHT* pqgϝޓ)~[G7oó,:;:@qy02gP)B-[ ̄dy9_c1B<W2Hg8kzg(>w<%R}w&qVBunLT 7A>O?^{G2o'N|wè,԰$8l]n I===Xxe?NM~y$5yi}? u]JA-etu_r_{6cV.+:Y^e]>h Һu2Ku#| &&ZڹӞֺ=LvW9sҿSSSWS;w333( 5'fikH] ^O΃?J,lÇ0b]]]eos0qDS 9s"! /ˈD":''n{n,XQUUB!^۵^Cg:,دwx=Զ4Q^H=!6x<_G} r؀m=6"=w N#1b ^ HSTl*^十i6^JrƂġ%VRu\сl~nǚt"% ##XDA,+ [;]] Y(Jb41>et8f==ݘdҺ3p5 ɚ`m;uРi.( ʆb-h}ePV͚8|@l%C;#n| >aWYu;]4d9y@kֲF’_; s0;Y]Y288+WלH#vrSTtsWUԄ 90~Ba>+] `݂4d 0 U׫㾫jU[bjzRj_XI,jN}9Tobea3|lummmƳjI31h5 p)m[0taVm%晳goSww@4=bQHiR9sn'ǣ= CCt_a;iSӮ^2wy5XApԾߴar>f},(BjMMM:.|jHXnCt^?mllyߏ+i "8 ܩӧ12u81HBzם;e#QU_;a* Ad<շ\.P(/JNIʫ- N GahONNg&~0=йnC+xּ8W|+Og>|Qr0X}o.'_AKKҲ D 4(#{- Ye[PMI8<#>Ez޺^P|izZ"D2ρM+UUE{|aqQxA,E8qfo^|%x$HMzy0Y]ɷs7N{ׇhzi+ ܪ]w9Vmw#$ .%3@c+.zJ z#N~zE֠VKKKgN 0v055_б Ee}}M밸_Ks3q8r)f'A^aPWoP㈳FdO߂~-/CUޮ={31A!q$RTE===8|EsYy&@@Sk.x"9CA@(`ۨip&|ZyH[1BBb0^'c;K̶g϶y_'vM,s`+=}C}]3޳m97!yNidi̙3>?aR{HxmmmׯU~š}]8vN8 X7 N +Uի lZ٥A2hh0sfYP Y댖҇1H'Uyi,iװo^<쳒tm?1>__`ߏSNjаԠ4pybʗ&$zǃ~?l#SmC5Q}:܎ \޶z^no{W%zu:F~9z+ZGȅc0³쀔P:*퉤#bV "*BT q52 ",*\-V Eˠp2ff0bY8ÚW<1 j+, RJ;Zc1@i9s;ae9\mq˂]*(duQ49D3'lz[a~~&V8l6 '{wȍ` Accpx$nuLT%t*a! M؈|~YC On%CUsq! ƆǸBH#|-ܟlMǨbN搐tIw5[>C ^8NBڙi/G9DV"Ĝ[aQXYATWvxC0G(ゐӃ!475bmJXf!pqvހqp"vxܴ 8h6)pu;p9~fNѺuk111&qVV n6PqηP_sB0P(x>=D7U~inw: 3_#=sc׮1::Gg2v:ΤO!-2=T 6kXaΰp"D}x\Zk7Be߷333.?vG獁K8yK/kח Qne_G>VR)SUO9Xv-N9yr4w=fR --X r3Μ=?;;WWvvvzT !BFޛjry,OY:@KٸOLRú&=kҜ̺o߆055ųE=^' LUo |)gXӤ(0?w6,,.yO#=W0d\89wo)r>HS r]U~L&ڂy~vʕk8h@}gOU5t9@0<8(UR caa^#fվ"jRD@3Wm.WGx۷G_u%az GV=)*Vcŗ^rȪ?>c Ag=D\`=H&*Lv3 Fe?sfŝ͛6<4qiWS!qz/_ _;=_O^LX\\BCC<֌ crr>;n ǎA/.˾:6NJK6NO{+NJ%A,wQ<$J *O]y|H$CU8t p.3ɵG%gbYRveYHΏ444r:c~~55Ytw+DLJ cT[7oD>uSNa6tdv-dm8b!F !E@hҮx<^n9b{A0@A#Jڶ;R; Ӱm;djxSX3N\'|Y:qEc;hLb=`f9@EbܗkX͹޽{8 ]rnp62{Qf!Df׊tݍٙ؊ҌUЕmpC+ʄ`eeE "P5:QpRF8"tX&OgggdpY"Aޏc?=%DunD333\0^._vkk :'&&P*%Q&X*7pP fӧ?œ.D[ {<<4X Su 5Or:"ܳ-BnrO1 ,bh3m]L&%f=ބ 'QI.YƁ;:0A4^\\¿ocqq gDHEJZ9x_gP4cTO!Qi <N,"9\-$S)l"L x JQ~΢r:š@?D{fw4Xo|soEF.uaWr+?ݻ.d;e9}Mr crr5##NDۆE%0#NceeKsirS),{~!}F5 ?rZ4`vvVbjz@K `{sN{l|m&EHӎ-F@,!e2Tpxӎdgy D_z)y3, Zp rlդ`jMs$AQJ%}t-˲"qۡ!a|Յ=nT(vϜ*N9{ܳL3nqE6)!;_NNN:ЩŐ!ܺS. I&?<tJ\T8IAׂ`vAUID_@rVY |εy=BnV7ВSmfSG/X;9bP(bbbL\Rq~[SSӸ86ۈI h,jcqqUPإh0ERřrL&S1zKqg~Dl]e'u@O#49ȋ3~i---q;, -|;X\\0uNP[e\ 0i֟Bt0>\ VhIAhll%"jĻP(x ^q\rDX{[pb֌ O|s{K?Nt'Q959), o9Z)nwf3pU>͢P,cd8F_/2,zzn:< ٦N&T۶qŌ@vF\<d㘷ZRpT|J10ЯG4 ^QZ*X[(<<6oڄp](*T 3v$ twua~~?~I^>K|`ΛENHPA}*j0g#@AXK<s˙1$LOOKES8PMc y祥El> O{.'I U>vrWQ :m2;ݞNNN:RJ1911oiF4wSȲ#@w_x{qaZaȳ2 w هҒGnx_z:}YūlUd2/t3>,@Ũݣ^Ш_N6~VϾeY:k`52ԭf\GKJ ⃓W泅rЩ ~6J?.)W\)/NJbr0c86<ݳG IrSB`}?g{8ᢓX* Y,T:c<ƍ )۶ms/jzE}P(|U;-ؓ.i$($_ z xq[1U9𴮑.0'cEu3Eg3gxs6۶y#{K/rnqjlNs42̵K.adx@mBDRlm,-,pT>]*%eʛXrVS 6˹ʴRa:Gat8˺=xF"]wq2hdxXR`^7F'|yc'L^kJ:^yUcR7\~\'3 M/;a3ȑkt`vAiܙ)///ceeCb/}ϓdؾQL IDATWm7@8L̠Wq/yJuoٴy}]N܏gPWö[4+ NćW[㎆&ߔkx{]U-_h}>55E.CKK \5Omnnv@cݺuhu466ꄮN`[ߘv4779έwe ,1 \TuLUGӟ:̌[C.4_)O???yՠ@&K Bu"fQ &* =a0KgSSc2/jZN;?=ݝf.C&Qh3NwYgP!T5zS?˿ff6`vD/sk@;C[P@VǗ+QJ2Q=55YCiËYjeeF_0&TWΝ'NIx~y%Tr2#(Yp[lѨ/DƠe *1&uQOƢN:u$Qh+hLXWWY&MIhNބd T&R),</Ě,74G&aW5T2f[*լq]]s༜aݓXkG}'tabr Uz>*?c=xgajh^FU7p=GqvwA|oaeek3d}=N"q{gWI4SyQs>e%Rs8; ,XHg6C6 w}|LQF% PZR?N;c0쳟496㣏k;2F;6n3ߞrM=Uoo/::sKkjI@Ilět+cבގAAw^ɩK%X#yd; u-1KӸ<Ժ0礳OG3l˕[V;Wwھm^$,,}gOSIchSWM'bJ6"]U<\UFj"Ĩ(!ӡ4rAٵDD5/`ii XZZBXff019Hq8y8}92z[Ja\|4.mK> 缷G!A@ kefIT>X,`8Mp]a '&"o&%}f{gbIK+CfODOB0y:wڡck؍;o) x #\.'9̜~{HF0!?y2pN&ez?DXnCXF&@ 0gٳrPX4Z >ǞnsX,T*E\D&J<:::yr =e KңX9_s*kxv({ǩ{5;;J"Owؾ}Os+gkFF, gB8@~{{ cJ9H>=X`RJxeYLY5@3'>9˾ϕ?e-:%ju X/;ߡoN;}F='VDgA577;I,yIR>L/M?9j^y P%~5|MPpITZb1!"(W+(nr  uȤ386?SX}]-fff*ea~~R ?okTo Yc26l~~Qh1[EQ|ޭx`9PƝ7!f:׾{=297b§W䤣OM~/ۊw]t{iOuwvϓn wzeGj|[+>Xxtkjj9Xq755RCO:}CB,Hd-!d3>$I=vٺJ%-&vWcnWp-dpp ulr9]?i?g+$X `5"6; 倇JҼAGP_ rjr0OoG_x~+jiq44ԣlHRͤ9~7DRM}}*ν=ݜ|_;/ʶpGlPcrE|0{xh+ӈ7ywN x x  ywЈbujcMNC8C--J%Ov)ࡕa`e [߰m֐wV*.Ti.|/|[Y+1ynnNOL5S(Jhv{m"/e[[  xƷՀG[6oHX F] "mĆly*?wZVC 4/n\v ?SC#f[' o2sl 2M7VYÑAGc7n< ~k~ nJ֧T,?"}|jQW<'5;O&϶qi|,:8} MYtZp xxD{cݺ|IGd2nL`?료x?~'w1߿7ŀVhBUeVm8P^ƇTp*\~_*8}Ꮜ4\aA% '`,9t>\+ïys9O)&/;.{HC)aryњ5#u>xiFQdmV_vከϝ;gK>;~ ;GC q- +sssh=_5@d ЙF4C H&}dضשc t94{ImHsRMfu=ՔshSJ%;߉CyhD':rj8ai\P,e4EGtt^ya-Mxo gϞӮqB27~X\t~o5"QBG:ZJ{Znr9ges+AjۡI˧7lp3]szxQJQX)`RRA CsquRgcvG[[ TyT6Į 𫵭mˁ3 0#|& $ )a^ z( J)eahp#țY 8Ֆų֊|~ j3[] ^^%R\vuk`uH'R|YޛC?zǮ#q#2uB2Ŗe'5_r&9 -xijt+7>/c޻qq'?_y R /2R^? :x>x~tnuaԕfvvvR@eHdAy$΀ULklh:#܏t:{~p^S,zx ŃZe!|Ҵ\&8!+p]:22b$D3TX LFѩ$lJ}(L<7% r,@*3Fݯn.?߰a#xC$XZWԘu˩ShaAbI(>:lY $H]~4>E,JON_~{{ރ_y{6eЀES{ޱ5gy6 BgOg}Wʼn]݋O z_q K.Q$)SHCXUjDIO/uWWb;BH9]9 $Kg:In_ zyPdL+"$wXboddkP,J/}D^pIA&SԐnT|??R\ J%]'yHYm4,3LΙJ:q+1#ϥ Q~A1fz{xͭ\%Av}Fơ@\y!ƀ_v&AwW'~3ѣGaY/\,;bhpSSnb766 1^+9@ɏ <-qp:0 55(z5a O,2K/a׍;1zΝEOw7fڊE4wPr%<ٸw NKWƋ:Q6^({z+hݳkVΩJt-&q$M%q!?;;&Z|nf<7sVnv\pv; \EΆJ+1b$deY[O!rX nإd찀5T ˖A*04,{1-z$? P1+{G{{/|x^8 Ru69r#]WwٚZҘu~Bp!ɪ'%_h䡷ܴgϜ .2V3ê yۊ|ᕻzx>IB ƦJҮ.71`rr +뛣3^eɷym:77'U;^ԿP< ZZZL|J}`^0j}uˡظ|-h8Z[[ugsig9.Gԁg6GLDeyleyJm_tfff0tʟ IDAT2_q<4 Wo};Up|Rǎkkö)jkj AG*9XKRYo^9s6UZУ*+v7`KEdaS*U.l#JbKضN˜'b M%[8bea׋(O,o6Godt8߶ki y_ u?}R -e>۷m˯&}iYm{Z=<ܞhmh?80K /~Ss/Vqz#~*ߺph*JczZYߡz*:\SfLLLy{0z[M6uM4LP(xxjUd^EN02C|#MszC;kdϣ$1M7;ׁ <3vw+=AtyݺeKKxBu g\>C> Su(N882 nf|wli{J,/?27\g{.VgbCr:Uc{j8sq̙5޲,cW"@&ܼgdY"n%+SlllDccN8x\.Rq8p0S3_ZֹYVViT(w9]#ͽE=OaA]|3<&Ԫ|?iF~::t-JNd5fXyT*!O8U.]63wҲ !hmm8kZd˺Wt5GA|$U ]i5*4a.1W38ɓ';3\5Fsk(A}{O>ر}^ !@e٪N{联3CP7R|yJ7m4su=woQ6z{zp9tؘ;4ZrHA|Dh)>F| ix5[b'G2tK"^0P`gb$,aa7F :5<=Vkz@^Dѝ4؁/XZZ`\Kj@h)ęhjjY{W\:vn1"ot3TC9>st\hhظo]3dӻ}/,WM>XaG)sxp>I,iXߍ6kɲp"-ٮتeL~N(f#C8{3CCRqtZA_2ɋ2VyJ_2m17BVV(Lj̸eZ emp+gmJ&x,$Қε\׮Y#G6U.~WibnYyVk?O>+ݫtVS"}E|\?WoqְUH17Fr*uP[.UCRʳV, *r˗'PSS ."NL&ÉKlj@saKU珼ۯ{Ea,[Gn%a |"SeZC 4Z YZUpXBb9'>? w:]<ࡃ{Ctwu9a<1u9UEݥY]Rc!Sco0wұKcfAY7aKF;BVeUA0GjӓX( dmXYYQ l%}×J%_AkhM l,ʯsY|7kGc-?(oʧ1APke7uD"aS.tm\}g#W\f`ՃFdt~FVb,&q߾u+WzDB[1eW-7d22YѨ &_]]8Ϣ#ضaQ#!IWŶ*ՋKQ7 ų?Mx8uA )ذa=Q~!/Y3'ԏx"brpUD8188#,_E]#h/#w5љLXrѮBna5ewag5{f?FܼJ#]13}-ofxGöm[񳟽R5[nS?ItYw?FT̴Uɚ^.=qا@',B}}m{r`_13['P k l˜wim?G9ަɼ:D{zzpny,!AJ]B˲`d0/$1lVPn52_JzZw$[^5-"1g)ϝEGG;RO*M*Gssk[CMs?JӨoh"̰ߙ2j#U\\QĨ@g 5ÄHD4)GFFp^CALRg|fCc ϙׇ3niSzHӨu UK\2.Uw 7!<êNΈ[7c8T^.Wkh犷ȃFq ߸i~7JS RESj;7Ν79AIZ_=[ѻp2,7 K뱘Sd zFʖ-=_{S,'j}L:a_N9ÿ;ĹQnd%-Ɲ7thpצWwF4D{^7y䫮 UߒV&+=3gd2)D?gsL&A2._JDG=wb#R]ggH%F;ƿ#JkkU5LeĢF>7RV0PXn[F,sՀG%hQ~u;| p o+3Y50=3mǎ-\u!`hnn[뱱صz,ߎV`9]б${gEsFC?Q֤ qy|\ x ]Rf h0)aef[ zX,ct:-͙Us<ؚO9y~~kbTA*PX={n1IP ,Hn۶|a0Jg-qŽ x=9~G c7PuUF4{zBBZ|T {I&_?twil,#+4ѭp ]Η/0w s\i죥 D x䬮jFao!2]϶Am'6A yЊRn~Ds*}ŋ τ Mr>Zn&÷%VS3x"Z!<ͤl.I'd}Ɨsqczb?B^UAt۷ =ӂfMUca Ỻ6;h c=jGbfY9vk`kb۷ѱil1|ݦR czf X\\mP*Q*A0? 8Q[[E?~eߏyF*_@͘mhh|=qʩpMq9lܸA(,㈲&(AXk|QFQiS>kW)#TUn(H&(JajHR(ȸ ocfQ(Jx3U5=E&s9fj+CҭoMM 444 H [\\0<4}gԳ7qVpNKٲe3Ɣ w>"X@Jq?55 5ӆ.33Ѯ;k$~#Gk%'8FGK~5 c S Sd5qy5r7.ȃv݈L&'osnu-7$lrjxxX 0a#CtׄRPDMU=Qyx(C?A(ѝ (]*9,zXn-mpN+bK-z;ĉ'$'F,+%C)mѻ\Tʣs8k(uh|#sHa+Ś H /hۙ3g'OԘ؈|~9'믿.\p߅ t]:!CgOgQW(tZrh^{-ޛ#t缑>+Ys꼺;P=_X4w4nI΍7)*sa-M}GG׳, yd2)eV D]?ᱝrb~nΨ?KяvyL5IXT{_5waJ K<#r-8{}F}^v tu8oMOO˴jmG,+LbUݗpWzX9ڍ arzY2\p#dd:_ukAd~0_r#֜٨r>G˲abvvk֬qdcUo1x+~BnpC57܉rŏ/zu"tntwhUEB"]cohp'ND__7%>6{ Yj̫;{V)UE0 M7 H;Q?g}rpx9efkoJ*db1PNv+(ESc#KKX4(1:ń'u]8wn2!p9,-9fqqmmXX0+T wu'8}!ƣ忩ZPJݵzA07^% 7U~T-LtUsըp{{;<>1fDYh3 .!sqR0669!64Я79>e{1xسL9GYrLЌ92Bz=f9kyNRLB Fxٴqq;ן* //ݻ4YsNrkx8wꄍ:|xm8t(@Jb#2Ef8ƌ &Н`ƓG2K555aI(rċmr~_|>(Zd3 K8tXp_:on~R,!egIkYTjv+w,[?ǙJ xlVS:^fÉ"e( UtttRDd^ڠe8׬ {綶6wMMMBx d FgKR97~]t,XK-yʚŅ;ݺNI9 ,cʖ:!|w¹Q>rmDž cf'|lr{dYwT>J|m7N1YQo޻W|YZCJ3jdu ϩK/3:8t) EӉD<Mɟu ,wu2TT:TePI~,R}$5hjjܜ@!$%ۓ"Sl[rb:J}q^'q,fX( {`U?LЪIJT*رؽQE'w< k.Ǎ&'{qqQzD1U79&) iA`/uNJ:łѡ/Er25PT:'weF9,:JLJTHafu!ۻhxFaY+~P>_===N@僺Pf ɠ:5EZ*J!C7{ ǎΧC ߺeڸ\g Fs<G}}T''a;>!U8lJ=NG'xÛ˲Rv]mذaJ%z6XytGGG$}^vr>QxD"0gk PJ1! JM6ԩS{3uC>!ʷh%#ˆd,V ;-_v.o P!?wj[l.C s9:`C{/^}?TzI`38( ]+WY9,s&2Timm}a8XN\+UJUOnETg+Uh(Nu_{1oH |& s WSaǏ0d ~vK|P.Ldz8 !=,h]{SllleY9WA>(~kuˉAIDdn 5l&nkkk|T֫WYrVd>FɲnvNCC'U%]#:huMMMP*|TJz!V#ͯ edR`gb7u:;;끟;W"2AX,Z˻0p|Ţ'n/kjj];㥗^F__Ct钴'DFhkЕ6n믿^3BEE:/U\b{ y 4:u('^"e cY'ږMH%1'p]ǏhfQ*|2 iOO/5kFp Ys++W( 4\eWK~zRXۛgg03/޽{Oamx埙(V$D9`Ss]k׮AQD_85:/fzǃWZw /΀YQT77 ?['xî/܄apzԵqFH_}*L]GUtGj9oJW9^d*m~bPҒ'&6hBܰRdTBoPJ颜Up*bP{(ҙ4m ܭ[ T(8co;|!Z[q |x!g{}xH\97gY2x kZ;qZT{ ц즣MBR&ɞ"YwR6ʙn.)Tuqq3x(enາgei9eme|ujYkfxrSeQVlI=HQouժs.*,|)/KyH&SXHF0ۣzu=N QIhjȫT*Vl&T%MoppRG`b T*x9lLg j) #BŋSb$_gk°Bd^W  %ΉwZ9v|F:sy4Ln[F䚮ܹP=p Y{8+`f+[~Ѐ|X.CeM}.-$w!?`''O2MXY]ŴߣiӦ  `ff7uXヌ/^]|bm4ɭX{x,Va_5u~{~x'lݲ sn:~A;> ?ĉ`O}xKs=`ǎ) }+QϬL/Q*u5QXjzKBF2%Q=ݶmLLL.^L褐DmV+p]1:֨ }- ʥzz[Je 6`9U(DY;T1xxJAH&&̱ ͛7ᢘTr&)Mu$,uѿib\WbLVIu_-AdYiYU06l|H\f@¹$A3w)B24N Q+Y*e2(lw䵺JG>AjpM{9bKa4uQdsYg]rmdQ_aÝ:BG1L XVM" в%8A}u*s]Kn05֭Tkֿ\R9ڴsرeժt+ QgS<$I)h+-eq,R.$#G²0< WM#dd;4ىbdJ~.]M>q_5 *І XI ap\Gq|XRQ/tJ`{+W{?۶JᖖQw0<K*:xg>n,/ ߙ@Z<୓'k8smq=&&>ܴ䬮ߙV~kks3| g.e ͨמ"4[Kjz%= oPeh$0C"._\it]w(7!{I,..bxx8FyM*:`DnkhJus&Rt%Gr(&耣fJ(XX6:x^=͓}!|;Os}YM%Aǫؿ/=j (rD"uRљPydYUwEU`z}94wB;7_#T)7u8٪MFdfBfp2]p1#=[oi.]G`vvVkXz'z` bqr6òKAÄ{#B[[OA !ʗǺ ak]w ]_}RѫedNvzF^!'ɤspߙ%0QBE{cuz]6SokEr\w:qt,9?òW U1C &^vؑF+)u-Zͣca^ÏEV kՉ9}vvO|7_U2,a!C輸 1b,x6` p |k[~f֏Vdh&L_3C7mk1~ӥ5˼H9~";\/9Le%ђ+8߱e}==8pUEl8 uo:)F?9UǑfe-Ѣߗ=s¼RhD"M-$Nd&cdd{5$Cm[O~ A>uc˖^Qn0xQ,.."x'G ܹ;:K+ҀgZpWL&1}\W=?d2ZlԬO~)z^|e˿ xϿX6?ZI0P['f|(}`p}3hdՕe%_'rYzQ 6ftˆeh#Lje͛;" 0+5gm\ % xh䁑X!St:V a99yuT*oKDjh&WREdwY7Ж0D|0]ӈ\.D&HF0ԙDGnSSM xtw{6Z acV*z&ƾD]V%;sk;jJk{{%A6zlt0].=s=;t \lqWWgxU.glZlyy}?eK!ܺ_`y 8{Wؖ.C\Jqdd)#CAN%V,H˦ $). Foox͐Ulطo_P}\?X3LG$5WQiɶg͗Jc¤.Oify?Ѹ1?Pv 2lkmκA0D١ xP4 xy-ݞKpǡ$^ZZ=• qfTBg2f7dO$Sp%5ͪ iu]ܾ}GAJxO!|9B7Oҳ^:l6kM*>LxAY>f>d2v@\sLߦqܺ=OwqqR=_2DRAI}k~7ozRpܘtHo݃+WbffVZ.^$hIxswsS93|o@ɿ?>dKW?e7gY 4#Txי~:-#߀{Ay:###gfxxKj8 -p*HͪB~.nݺ%9W3GL ]pB`+ 1 b?Y@zŴQ3>THw IDAT> ,@t#DBR4N%̶mf->w5h^?!Pav,ɳڵ˃%q߯0?, d.uWW32^,E]7r7nx%wǯcPf[P.h#á}j}kJ04W\>eqRh7fb{N[Iߎs/*Uڱ-f^-e~7bߏ~}   r^v+W<LJ+z{zZ7gjD@Ts׼Uz> @55=(+pQ(Jfc䲊PP~JVbwAhSU-R=0n5 'kLRFta,3ᤱ.Yuǩ6ly2ֈ388X'ټHoElr5IPq];k$! ~ƒ:J:RB*TzNDzKc9&x^MnxA"*6\ #ͽky㜬߅,g[EsSuRY8p`0K5QFOg.Ld[Db1՞dPT[4 j!6pfۣ!{˵bXk1%S T xq { /]5dlٲsnajj;wvyy߲ad{oY+WҳR |XJ*&'W(J\ N}6YJda`6uD[kk׿N#FwF52XZ^<[4::5TGaLa+D(y2C5L!F]ds55Ab {JY)9~jǔ{y% W~:6x#s=sZ.--qիJސfgCmjxyxo?y_7 Z#Ey"TPFC8\Ø!r}] G!X)-YwcV"`ɓ8/:v*:XZZFG>O,`7~l#;  hA\ݥ˗w길p2ݷ||/^@g_/+u*HLj#̏CJM٘ 9RyT95oď6>>.7>dXwrŗ>PlP$kXdYZ[[>!KQ͝8:9[3r(elΨYh#G*I4#t{pHCҜwt.<䒂R,kh:fYz`E ~|32t tQtttWaĸ {_zz{q*>*kܚk-s<߁ڿo/$c4c0@g.DG722K.b(fXy%OlzQN5uokɴb|A$\x饗ÆUeaӃ-KwjxO\zW@;/ҖLש9NtmܙZr;pml߾ o/mҥxO~'W~V;͗xbgggmm;w믿n̯Bmn.Aw&A*! CpU`cK4Јu&ϻcx$*Y[FŶ9t*KO7oق3811Uuzv\mskq|sş_b$ P5d_Hс۷iёZ2WH#z D {M&_6#U}Ů;Gǟ(MJ`|l j,"G3 >'gx:`=Ǘv oPTzܹ#XQSWՅb)Hu ;?Uֻ h~K}l61:\wii9 zrXZfG_ǟqjoěo 'ghTg_+7nܐsJt=uw0.~i d!(&Kd4ⷕ[;tx$H?bFxXfNqx{mRk6,3lzpT%sw.(UզM~fW4@p + kZ>Ja 8 =V.֦ xm7RExBD>tRX)B~%. ݺ5 AgJ΁|>nĞ"p@,-e k$B,\{G촀40q}}PZzҲcZ:/R_4,TO7#͛7sAYډI+++\\|l,7K˫vHNN@?} x`\Y& x<أZXJ_"f]eӚ@h7sW&6T_}ǴF# bDJJzև~#s-֚*6ⴸrJ Kk+0oJ&QTv iI3SpMǡ8~֪UWS$r]e&헎4r!=dDeªT*u'4*63Ġ 1ECxS9 "6kp---E6 kN WzQ5,+ eVQv8qk$-D"TAvEc|rr+ffʹdMuT**m8M1::Y|#GRڨɵkӘAs 7(mo(^g3XbsU<‹Df[O| '| ]X\ZƱ<4TO~?z\pZ rR~ x'}ڧK>?Iz7ٳׯ(J|VOpLV9ϲ5VhāAYeynE Sd %ͫUcΝ\O &^i9qDHR\e7@st{b/VN4][[svIUŅyԲ=}@EC2[ s2q[5i<>o7537o4loI\չKYȵ$|':ޜ]bf?)`1礥Nol4!.+EoYm[03ìE~/E>wɟKKrv]!сAGt&ly*(ꛐR,h&-,N<4w.1==|ep~,//chh ==mĵi,U!Lg^'q9gbίW,˪-Nax;8F3x<āk~cG1;; LCtݍQ}]&Lŗ^F5|%od D^Z6Nc ضa8}&:(Ϣ¬u⍩<2]]]( xJ'&&6:42x% IR(7Y'n*Ie{] /\===~+K'l kkkRF~RP'ߥʋ1d=rHU9y"8XȽY嵴rH5C vב 0n*2\)Mю<要0O^kqBs} rޥg۲N0~Q .-r)…blFܜ ;Gif,.qqD"ᕣ 2S./\t*rRS|z!Jɭ[1;7DX ,/ PҔͶP(`)\x),8[TfiFG.VWW\/<^:YYfkq zx'ZD"ZThi0 IӨhCIj-7op< 02e/D>(Mgxf1pZ:b'q㹲SWDg,N6'nhpEuD"Atqܼydw?Ό^,/p)Gk:/D?Y9luMes@t={v-BPͿ͢J/zIpDןԎj={Vΰs wttPX FFK;FoLs*&ZuCt2JhdQlZQ/scp*Y`45>j\.{Ni31188% dfg= 3=UD[GՁ29*~ֆZ)9U;A2@zk! rI1Еk<? *Md=sömJ/ض kmK8P7~Lu^+ q~L&Qu\SD<(ݰaT]ؿצ$I.]̽^-GGWg'N==*JXX\TT:ݺ}~wPWٍxCH*{fkA~{/_]:d5XAc[OLSC3NO`PY1I"k2@sF@鬼skL To>1;8} {ފ]XbxDa2r)[VGJlYypÕ34Nyj Ӑ\;L65"X8FMKB+J`~,#2=a6 M;*fEY $5!54g1E>~!Be:0q47i,Ô(O## =Fɽ46o$~=[Y&rJE 'hG=7hGKK ^di K>M`G=̎0[7OH X{عcxv) pƚჇ1GٶSFDe ytp'Cxː(J !/bbb\*e|_#5zD&|GYye2ζmb1-/K9XT#UN2[^\\+f},5V fLp"?~vM,\k ,$ɭ[{iGC WL5<.%c nC,uk32xz箣ʫa\{2X'j2/#9"t4g^C΅L5`D^׮]S\,蓞^ʃOzÏ[Sҩ$vW,q=,;Fk@Ҁx /uމz U#c׿'{gD;rfD\j@m@1-TAqn}z0/S =3Z{mۀmcsgo! )phpEaD?;Ȳ"U6A̞0vV?3-kXy'6M׾ *{odȸemVޑWfr9ΉxyS4a@ȆLs'+\!2 IDATӱkExVl8jNvknkL&gY#kI) l/"FvuMz3MPY%RQV41xnLGjY3<{lcPwwO/|gg^ [1F2>'կ}Ch39ڎoв^&-NJ[ lݳ32 m ;ɠ3p~554Kjzkdpi8CZl.755'Np &tQXhlM~FPjuW C&5,țKi¯Ֆ-qKKRbGR@I3mjQuS R#[$ho3+g!ф GFqoCldNu Tjm߾o')x0+\Cdì%4/hyN~s:o3N4W6X}PiQ@xCT"j0nY\FN;' -hʿg.G+CrӍՕεz[l+KK\[V>:2 g8OmnMhhh(ط?{E;NNn#:F{Z @eׂMvOw\oƮ t[pi}kؽk'>{+KL&B h>x0~7Ύ*"zȿ+Նfϖ u(se6Fj^LgU#FLU6ڸj%te+BT bJk QRB&$Q"߲5YuDHgŀ0D\'eF$W^pY;?rvdqUm)Lδ8_]9%Ql(olee4c <ܘdC+j2L"߼u,ŵdyGgh-Ϝ)BG&m۔c0yЬC^ xoRlFupkn{d"^<,m^yx0kkWʫq}Y_`~ vQZs1==MD,ZEX,#W[ "+PoNWt f "U O$= .~cqcfG2g+JC~@x6.|o,a .񃙀Z[[FW6kST022BόI&Lu++N0Чְ,=0wCy^_1nZԲZ!; =t%f2RvdץB#dR) Y>b,t7.Lh"3# 0Y=*oε|4p]w/aUJ{W^' T ˑ$Yvuwcnnw^10;{-4VWW۷mÛo)+r=r]~~_ouzӨ,[[cj o8= b/+-Boo/Jfܫ &3]C,"H99eKj9E8t]]]hooǹs`Yr*U=z ۶o['O*hׯ~e{Azb)VO~GA%yJvE/OR.j$2+JXtc2CgSGw«^ڲۋ 'K 3?l:W}o+ M f[riD zl['O/ܖi6z=7(}Z5ѻdad7O/5}ݻwypRw|=<.irXk`N٧Z.lC"TR}qjd{MV*xR5ʉ^&a LIsԨMMWզU)ʳ&EK1ljLwlC0Dtv׋Z6:y}g RVDyMJk YEtuvIΝ;5[&al\q~%eaQLr C{fggZ+X =\޻Fh0eʘ݋0W]d'A+X]FΝ; `>\tIPT30gF# slQ(hkkX[[*Eh6 ^*O\YYi#2uy/u"Y^'M R86.o|G?^e!S\u9,a"dȓ78R211t~:.BBzBO|&}o=,.-P,FLy te25L>܈L&.R4m:,>FgIѱøp\`u=\,wn,>@իWe iU&&hYALJxetQl`p[s`>^%۶=3٘] 6K 0w/2>UqXF ȁ^qP,R8?5&:=uyyLg{<>6۷< ܲ,bPG'Je[[Q:d*qܺ}6N$p\rX<߳9= ˶( \%4A]}|foXVMW~㗏F`,B iY!骸ɦJT+eoo3_T?#5/ 4>}*uͰ}©tF+c sƍ7)>gww4L#+& j)m x$k\.{uC :gPF|* c]]]r=f*翜x܆ QedF:aqY |kdȴx$t6N.1Qfpaϱap@hz~LxRB?b}bAܧ^t)hw*Ȏ}'0/&aʣıy&\6m-sxÏo.ZZ2Cvvn/^*X+CǤ<}p`K}dx+LRhiɠ8:-z3T[kS۷[{δ&B`P%<{zPzT.3:w@(D~:ci(BBײ*GW3(>QY{tJE/RV0VCx}uK2{b2y899ـZ {c\hgE8 [;=L*7`lnqF&Q[ͻw?8l'gOO{6NOem> uy|`ttR +𒭼{GRST8}¼M"\p,ˋ&W&)(lvL)"O"ZPLNgXPBTT+8Pc΅u|<Q077g%cԐʪM1Y=24™'g0s\hfO8@KI}q:cFtufyOsgNpĻ:Xp7Ž&jCVZ66282{q.Ba% dxsRC T*ɭ[Lc63kqq2ؾ-Bi~(Qja>;w,s)PD+rr``S ^Wqh*"fGOm7n4W{/^|sAD"B1<073*?`9uQV)(/ש0%\9i:'ӊK.+Q=~_ٔh&J)3 5"aF{(AT2rJw5oggTx!WyMXg3η`ؼio?V5#ԩSϬȀ}(3]{zzhi(4:/  /3L ? ~j8)|/':ѧϮ@C4ʫDMDsss$@kFm{|¶uT;/G!kP)r9aTqLSM`F Nmæ9u  ݳ'^K7iRзܮgwDfwBEAU. R%KaBb ˆiS?H =wcjvB5@+ :~E|L~+2XE| U333y M_5cedZv^!㗎FdΉ^g?S^[_~gTkt hRn߾9c~ԩ4ؕ>]V)ЩkN 6QPwtxoΫα*;P&g}L`8j‹Hoj$2[Er}qqѣUǡp+uJ9ra:`|@OCd:8'rƚ Z7)x=?ݞ.))%mJ2zXC[5~п?:q^'O5g|glJIOaF{FP֊jj5+=,PQ6@2WྞqpJрZG"*GX0Qo>]]]u]ܾ}[*gduOAX6N& >9SJ WdvLM7oX6^;U.Jhmr4=禍Z[[dɤ q L'8gοO$wK90S x[=<ۯ=F'0{~[~ҳ|N"w%L A-#@93 _տ~6?/

O0gӎ%b1F7량_GՈWۖ$PᙖW8dqUr=vt~PMSνk.v;~g:D<MqrjpyJqF\p!ϙL&Q. zY7nWp^Xݴ}n$Ilצ}#mVNx4E/f]i2I6{vƫ=;{R\2H$<6"kS!Jammͣ+פw=w_tnz :o?m(ֱ#_kͶ`eeU,MZ6z{qCxuNyP A5`(м}t,CƁ,ϵ 03V4xt]=Uô'ĕ|?ò9='8HM>lTZ2iiiA"@X:SO{yggq҃冎YSY'|gӦ Y];0;;'.nnD]J>C}KmlniL7]-i|XmmmX\2%=oE6 fV\ ܛl:9s8s挄.(9PJuU`:ϭOer{j cz:D IDATzqMO Wz8:%71T>߁۷J¢hZŶɭip`ׯõʷөZJu>"_0x!uB’Ėmtzq,Xhoo㠰6 k+~cjk\m^8Ξ;G{G,ÿW??/c(-A\^[C؝D{?BMoʳg2!EDFtwwЯA/pe iœE} ޽Ǐ'l۶ o1 h!fsD<'*xYZ"@TBkɲJ/\BpFp-2Β]hMVwh3t}υ%p:Qc' +OJ9{d'J_{D {ȿp!2Š<(ckCkyI] R.ukt\THje/+Ҡ>i/a*  xX o~ r9ZC~%xЇرc] 1Ax0~-7ƓnܼIy:;83xŲ"[)"L׬3?x gX?5ً`S`] (T*4Y,*#:TT߉X5^mLPm [iJ7wVv*A#L!%%땩I,d+Gq'ItmX]]Ů];9t 4(>YC@|pdqʍ;1Tzq !T]~a8U_ZZB*O} 75Vqнϧ}m7b1dg xsÔUnhupDɎh0q(`\Xe{{;TÄ藪6 zΏ9I!Epb18T`s+kh( Jͼݲk7iiZB__/]˗(+m8J%hޯ6|Xv H3DT+WՅjov\Xwv\.##DA,4XOUF>#)T/a\U0hбx2y><Ϟo_35?`rzgX>i=nmCCC8wNcV@߳wҨίSW1[߰cu[~kk+EdHvm+[O:2|%~F,e%EBnȡ֓8p]M5Ѩ826ar9vk'|&D%י܊9Ήi*+e][[S:dCETgV0lxi|f#aZp=ϓL&iS֮lqrז#3g;Lༀ;;;8/,cmmmݵkӁst)+,qT%'5v&1X wm==ݘ_@WWUg.\qj@-ø-ߐgGVUy~ڈěopqt bdYa:OI.k%gYƮ; J/\[[`+ vڅYtwwڀ%4Yr~9/Z xZgggH9%zj;<] K%u}dEkk+FFF"RLdJdccc.˰mŹ3s(֪ 5Ò`!=F]yE`XX JQoYp%zzYY_vl4[nRX&t:k˦Rl==, kMn\<ׇc^#/+s`yB󨪘Jk;kk7(uaxB n|D"6M xXJX,v#CD5hu,V5UJK. Yu۸1P):6ML\lGxd2Eo߶ o=!LIF:)-geL&"/-q8.`Hxܣd TJe8r .b1;ZgUtamR'g祪%k4gRqQe\Gހݩ#2듿-'p+" lL&Ӑ9ߐybW7T-iME-jF-R(O5;?|`T֘T}g=pġZKAx<4PEo7{m aҤgif4>k4Fq9t'[#ەbC6q!ĩ:5<-[iвatk|e?Tkbb_U'B I{y ?,G&RN"T Vʎ #Jq5;wTCeb-A~쀾&MS~ ݻTimذ!z/ېo<[+5.P+N6vy D"ی"l65Ѥͷ֧ KKKOfвw&}O$hmj|5Cqmm** ߸V߮, 1+>q{~D2[-OGlaoHmr9zVCᏞs}Sɭ[Nv\63M6FBvUMCPB&{(!6@'2T؇ODh+H0˃-RkanyW2N!\ALSq2H CKE-8uV &%9;5foH$`v(L[pk%zwW`C6ato^:jk&Qerr,ċ?~I'&w^?~ yFj ffgkJLlf}7}p _v-y:-Y4۸3]8SN}SOk>1Zr,/ Җ4<@ t<22KYTyP0hO:45?6A7֭[qԩ>0_Ѩ,6{ zFݶmrsssR};Z)'SYW~C6[~NX6mBhQ;E`L&(%~:Ad|IRhw⊛x? ĕ 8y/)gF!ϥE 2.2 f  ֛hCZ+f>L>¾R===<.ىbq͇ q,];q13755V޴ڰJiu] "3H&hkkL&TZر}],BKK}gTƥS^`dl[85zH&hkan\x+6ra5xExC?J2Ogl=d˦P{cczAq*hRSZP4_;JerbavA$#z;COR;%Nģ C`X;kg{vT7GfdEDF ޛ73U_|}ʺd:пu;WQ{[e9)Z dt4P[I4 cOx7& *2"dCw,ڷo/nߺo]|ЫA9Ҋ%OQdo 9-t݀q0פtI:vh5Ӳt&|$^pz\q.晷SVՂY6slp'rg?teޛ/Հ+2KW*@Q)%DzlGqiWB7*Uc(Kx… 2F==m?ݖӋ|98`cNZG v lMM4L?566e*RoW9ȝK׀XYf_-GT jQA7zg@oVq:בu1{!^=.bfvV4bdžIܼuS( ::Ҝ@&:銥EۤH*XpV$cD4 rcxx:E@Qar w088 *ڀ`(l&oVP4dsyTnȜrhB%Vy?þ]D2%.+q V:kkiK١4񺲯 "zz`DKK3v؁b5bh?1$qU<1C; {q pUr=o/#?Y G{Nc؅<Ӧ. 2yn6l}2^_c IyrfxI"d aр rcF5ɬl)]s9n<֑H$P(LYO.!֣ϵa"a8t]՘]&;=c* Jʲs"Y1=ٲe3N:j}t}6s򤍎С00Џ[nS\ϭhӦM8CA`ZUx=oamF濡y/ޣ7ZH&(78#Uwp٪X*M/03ubG]x_6MO# ˦󫫫t&d;&d0eը<0APdZoCU!4c~aO}lǹ ~_A hokCT0J(>|pj{NǑh 9)}hMfhB iOdҎGGOw7(]i8twLs!HX=E^o^ډtOU^xz~{|T䒮^xiԸ4]kUz6#][(xyFd~y/s+ï v;/0!4KI+07'Y(D"-[ZMMmNy.y?'r'<ȼEW ilrIҦ܏s+x ' LzBy€:93p #ǏGs}5_Mz7h۷14@;I SS_S!tcgG s ];w0<Ѓ_3._1u~C/o~;4L媟' @אf ]UL&}!S]&&p<!I#fg$z^zxmɸr劅رSNze?IGΎKP+N*Sōߞz~r9۷1ᦟ$]EV~]mvbflݗZ_ CKzO j/M !No};aeec2n޺Ç|_\cA!|&k s2nܼYZBP(h#*hD @M¡EŻϡ)qA|\E `yeRkki47@ 2=ՀJ4Vjcu:FW <<z+ꃺy&Nf_W=w΢EʈEh4<<~&b5|άwQo0UCUmY] IDATjYc׮Yc}$&#Y/ZX*KEe3kuq@׼%=ߵNOOפxJX >2i%.fMkwtձ1l۶ 'ITWbֶ$sZQyɦ3*{ ^ .oG2 2|fGG27兾BG]X3d4 dxϒS|G4E0Қ,lbbγ09` íäy~"`ZE$c|ߌZ#>3byш |p͢ۦAb UUqmq?;/w[/ݬװlA_ fLvL?Ue`d eƣC+_Ξ߽MhК4bm-#϶&EeCoo/fWn0 0woal:'՚㹌bȦŶjHٙwЧ<48EQI7afn^OR:{݋N0n̠Rѡ0/YdJ,E._ 7ElD>7iUp`5V)w0ߋ@ ;dhnN k`:8=[4ڋZld ,PU1447nZ{ETyߡx񥗫Tt'*EG\lCahjniW~{=纸򄱽;z?x9K1zzz(~'K{[zQ"\\lvu^BBh2z*pb립׷'jUL1Y ;مE M97>@@}Q񸡓銵O-5eٝ;v`vn$:VVW: VVV >xw%bv "T4'+q#{3:2|`>OAbۃtc:t(jT3+UX,1=8u]7zU*(J8| ҙ "q * BX''RR plHk4]G\Tթ"H^2FsGQS*{Z}tDQ,Ym ͛=,~M{ :A۶nee; J0:2"Z[-( E}{,^%NɻE×X,x۷SH#z4ivwwt[̣YA1ߛSYw vfeҔe͛vi rҤ@-F$33s9lЃ!zZ7({qJB'~8|fhȄ ]QKn-K00O&h5scnFyWW| Y̙3L^!Ɲ3^-,ES^ltChrz0_YH$?(.^$pZ򲩩jZ; e,䖪 Á`Pex6Lzʪ=z<}wGqp R5\zҩPwa}76^jMoFn]b 2p$$% H1:ؖw=)T*˒dMVDQ9"d2f% {e)Y"K``H$w4E9xKO8F6a6yZݺoYҞN_w<#﬈YfCRA/g𩈔$F\9,W1_/G~Rּ @,[>!Gze:97Zʂ[YY|v;:ڑ3׮_7y8Ӯ*ݞ`L6kTjPѝyq KFfN5 s R^4=(W*k[A cU 9K\N( /uokBр%j ,GD7o/e3PL}yn~Hʥ$Չ+d9cQatu%f顆h.J(JډdpU\}Td?}|{6yjVhZن {|l֭w+* ưjfɜL&c錢>Rdbe5e=FV=. \tB +6@L&R/s=aUfk488EsrEs{:9I5+=27&4@qVݪgG4׀IتeXgR|izDЃ/Y-ivf)qfˬ䈻@ix) v/Q4>'>n%*K\}}HVм2R_V*iX,f &>ǭ_7Dںu,4LUh00ljj2BtHRj8} Q;v׮]xfbšW]D= _ap9ptFcjܹdUb Mo`YّOOM ETGT*f:vډV!{a\t ͆cx2Kt/]i)Kt&͉8qA EQ y 2˸5U{غP.0P5###z xg"7ۋ7oah`uyaau^  ?㎍5#l |@$g@/^f`c۶meߒ5#:&U:k=hL l .=Ix5  ։|ejS%Rkkꙃڵk3ʺvd9J} @nX* &O[5ebʭ!R)#)IQʏ\.d9\y-1D܇U>{%gt';Q*Q(13;]7Ƥ>/,`qq⍅B|kkkf@yrgk+RUWW^}p~sx-匀 ^Z\Pn7Y88]'`0U1UPK4@G=yiUDLF'K|fzzJmˣIte `}n~aV9-)tMSΜ9}[QLg9;a:77wY⛽==,6ԏ,Ӈ[o`cqՊ . }:2b;A"`l Åt2d2]@QNg1#QKǹsz`/\M;AFS/(~,șA/@"lF$0+!1ƹ*.C^Ss@Y3%kǯK*eB։ӯOLjjm}`>WyS^ N]{PRIaäK{4B[l11mg9Qu+aȳ"8~ WV囚–\ +{U54 )NOmD6E\h'X,9&F]]fPFEjfcu#*fnZeT<rTZ(gJ<+AauZ\1(GS F"FpCQp֌ CTB\AkkkhI`|| ,# VA6EPD6X^^6Ͻ[/--$c BLaƬ}NA f%L'xwP*M, u `=+0.mSEA5̞=$Ν?;X~5| M _2^yjēMD-ѹ;g+3Џ.}nFhȨ ]SޘX,fvZN3U;[¶.a].wd% +01h朴JZ{fM )Gb{ttoݺehd>8 {[cLq6|¤&Yuf$$0]'t6x0~2rǯ$._`lt֧8cBG?{Q!  y)A`06AcOq'q\S_;:&'&{g`5g'[__/rN WHy:8&ƫPs=w@[6oj hJck IDATcm=p7߲ (*5`+{Q۽gHWfJSؿoClJ}}arw>fgg N7TU/^W/瞷]o^GMh%&''OMmr{В!ĖmooCcޑ!z5yߞĭ3h 7{gfHŋ(KA*e@W%qtu% ȼҙ _ĝ;KL0viyŲ)ef+*ې堪*wkK/c{CD/)7B޷񇞞nFy`>o}˳Oo5j\2ΘX)"x$|3I#MxZdATY'O!"}яD𺜗OgǩJL$@dJ`>)DP"jAz)nFa~䧈O~@zoXdhɿSycߐ^O|EJQT$z^uMڠo0ݗc4{cu w/y\(2.r>:3Kc֭Js?Hr \Z͛79'8N6j/&'&lzFF |ZƼjlj( hM.C2d-ΞUUonCOnmř硘I]m4vun5N5gaT {>g,CŐ sܜާX, \W4MeCWi亖C|`yybl8 W=9X5ͼ[4w׿Ew^Ҝhvv /fg8#ֿAp]=X/I erҵd/ix¦o4m{_|<젺}j)8W0ZT\ɓ !KKKgI>'z_nwڂIy睓.FD|Ophh8%dU 8cx̄7F8g<" h{ x*ۑX,l&§]D~'ZKUUm~ \wg2ݚ r?^X*a".)O t]ʪLܫ; +$*$&oؔoKJ#=w7[ݓ'/3سgnj|Co~>j:Z΍xoU;FQؠd---ld҂iH,xG|\L`nLgCL* " 2{ڊՕe}knnZ*-U4ٸQ7TUT@.]lz>q$ YZt7EQE!N[Zx|l7oXλEQ( Q*jMhmiE!j*U ax09eAQ#`:Q 4y0x*9ef2|Z.%Ma蜜UUUF(:aDo!a-fkU.O?w4Av3oCzPO\:::GMt[gܻ˪ŦX |w/~ZhfȜSz 8) ,.-MGqY:f>X0[6w\@LWBpDxVTn 4͡ɘ!xCLTvۋTߑÇ1;7~]EBҜsOIxFQ'L~D0w1i Иϐ9NU''sZ* DY_DXy PR^ vg:~&4pmj5 焏ưG&dz.hwMUCgg>cC8ؼy3T{j( *;_c hjjװ (t WCx?Ν@YNҏl"K+ֻaټkq2&:haE{q>Fh|^M4QR)ܺ}[(^%A#rY|uRX|m~s ܥ^SNc.b;Op]d=pBޅ6Lڲ#ek)x޸7A&F8Ԅy[. utr2|?00BYQSFҲ\'v 5}-tNP(l6['_Ⱥ)}WV)B n蠨Bhqk4?FxEq q>g]؋#;'Oz٫ l}xfT9yQMo=v{S$X,f 08C3ߵD$?24>]yOoٲL%~0[e<_Sl;V"#9=C:{ۻ׆Mt^gNKfDBP!c0NX,ut%kzԂ抆PϿ]xM}]uLP ?Cq~i p`t:p N9f2PTQ߯k?7 F>@ANڹļأ3Հx}ZYwWB|.3?/$ݭT.>ڵK2/!"Oyn[f.ć]cxݢv~FwByilLFbldNnz$ ZZZ[Csswkg_UKF#xŗi(Br  b&G^4ʪ߄G@x~~zWl*nN9.'3s3{ \v>iܩ*-g`O__/6n OzMtI.!|6O}3"x"za)EEPpad^};]IFי^$D fԼ7qN}W]SR܆ X8[?c;DT-{oE2h&ؼ[slDD1&AnΤ `!ȵuqP8A}9cG=wjYY;ŏPH"yYCSX$rttt`IqߡCxyD74pkva< et>b1Jb5&Kqm'EE f; `ۖMo~]sxyr?ϣ\*JaTBX>iff7n0$ޫE77M5GC* /b-_MMM( ·^Q)*4͡p9~ϩ +مl6{v SKƾ{L.0ePl߶su݀Dd=48{aDu喰:Lh[ӬX^^ƝE.=H4m *XI}/%O?*59gr9ozoݺeDS?IsM!!!EfX>oz1Gtv}qㆫqTx15p}lvn.k҂t:n{LykS=b!]QJ _Ggd*Y߲-Hj4V8c VVVpr>n[.bѪm@>UXUuԧذa?~Ŏ it$nzzu?ikkvڡ7kxu+J}fTQ.F:g_NW",DbFF qku8[T*[򯯷 7%:L<@.BQh2 tȡ[4MñGpE N)ՅL&H$|EA8FOwt?p? "VWSf2sZ[Q((@_o¡0J{@ T\2WbRzDOw7֐'0Sƙ^*٤i (JT*DLPTi$bG(PLZf>VxW,;LKd0q#ܹl!v/c8* '^DK_sgw"=bAߺcccQktov;8J!N\.b/e!"˕ZNr9?K*_a{{cRxU^5</id׋W>kܖ#Ć4OI..p˺9@]@9fQZCYB$=d<Ѓ~ϓ&TÉ_^;ݻSѨ F~=QĴg㽼dJ'x=9*Kg]LvЖTٽI\|R8l uq;<`zjΞ`ʢ(ٜxR8G瞯~&wEdm4pYSwL@ `r!ȏ$ ]!:]Ά4@}}ÕWqokh|(Vӽ5Ϳ^^Tyx|x{FvXGkۋ9gwQ .G$.^a88]=9W聑W+G((]P(H c##8"أ8}[z?]cD"(JUEA"Z*%Ğ$>d֕Uaɞ67'$֠Ąӥ) +6Z8yZ(:ھC|_?6|:{vĉv>)8{L2߳4`Zhd9G}==.^dƍq)F~Rʕ+bg/h7+􉆂? M4EҨuݼμ>CH-&bn`qB, 3'>TlVDxND)"|5bѽl\)s/[[Yu[6x}I;5w59;1M4#W0x*}j`|J6~HٕǷ]ɤn濟}E{@DgL_ ss¥̽oj][`Ps7sğ{\(Ryᇙoٲ%Iio U}TƶV xś3G@/~[TUlڸMMM8t萼w 5}uuDn߾'n9A>MMMLeuE8ծSux^;8Џ>OK3Aۇ:qQ`}xȄjhk x/~=<<}K׼,陸8e$2~}z{{l555ahd'=+.L1 8\.K+cȳlJr xfh$l@oT*PTpUffWss 5D#a!# 9a ٹ9#kP6E b-(JD"ؼib3骷XfT?j{X,P(М(H֘~YhKB.+D(`V4!3} m9]izZj·,A߮;PB$ xLeC k|K!C>pH\|5 _.^Z+G,v2G+gQ ƀܫZ+WDtᄎ''aP|h̭P,Zb==kkkRT[K!T,NȪd2)o^sE<'pY@__!graiFU8сP(YL`sз~QH",RژW\2eڽ}VCGRF{[+.jb|<zzpTT+33;k r?0o#3[dޝes%J[{W$[:>>eRJAAQE0.g{atvtJT*/⍷ުq!%0sxН1[bh+78*ԅ]|ُEȟHt1ܸqJkwҳ#]ou7YzR)St3^x}5SdYg*ybuwp86)x #u-?_;A8ѐpء'D"F-(˖>޺qvωDJz0{~hWko񣯈ZZ[H(+} ^/uCmjjr0ӻπ’]GӰtNL|ȀC"=/L7RTz['Omv=ϻV{ a_ѱQ UlrmRB`z8:ܜnZgۈ= MUMI èhcRVWSfPU:K U?47#jRwޅ3f2kϿ93'CuҔurrmӰ b,܃Ƨ%G088xEl<@VR@Rbo~翂W^}}X[c( x;ɟ`0 o0_1q|8Ģ(}\x4#5aU3<G:sAC+?C|Ϣ\;\4Y.ǫ}ŗE8,FG="W q),,ʊJ}HP"#_(?Y z+u{+`zw~s8̹J;ww;Xh#~O~ oMxcs'|P,>oDCYdXIyNѽvY.ǧ?IIݡA.+ jO3x8=B715l\'?._bVYk|ufWqyeb:3 T?J/ɝsetˌ|ضu+Ӥ;N}%hQ*$A^OA@B?ߓKB[@5iwxŪ=ԗ%1*N[~x??t:xgT0q^+Ξ \Ç@UU?ڱoNi+뿂G @4DR%IX,l&ʣ6JzCq,沾(4Vry9_75mV|]!M]<|5 T~iz0]p}#7X ̌o\1ԩ玌͛9PLOLy}RU^@6>`;X,B5|Mg9g5KMX8yA NcY(rp2CsJb1ds`mmmG> VrA\YGZ(;~wcN:瞟;K=2l>[AZ O`4nim|v>JUUE0h+6AϡMAW7'X[[cdGWw~z>0j駪B*5P h0919t'XX\=(Pg5|_6IHEzqB!j+EZ,犢j'ؽkxy_н?~Y_lk΋Y/MlH$UU=#J&F^߈ƨgz뺥LMMܹsBXs;亄OZ6P ~ᓥgO{za/#݃vK xgDRƱ$8 4ӳ0¯%*0>s˾7)) a?=>"5! H@an¬. jl?hNsޥ#۶O<{I@ᄎ/`rr= o1n4|!韡`O}C=phcjvvk'E</ {XK L|hmmo(*z{z,۶|DQuF1>?!N=NoP,\.#߇Ύjmf |@ #*] 7?/EaTULMm88#"yݗKG//tc_ \.W\l(Y;sSwDՓ6漋" 9Lb&%1JTl˲eY}tJg9|t:|eeY%)bN"HD 2 GwTWWUW,(W|P#::=*?wj,w#v^.0wmm%=4ML&ܿmyg/:s '&&`c4M[f/ܹ++Yf˗2Zqo]0X&._d2Ύ[&֖dY\lʅLGw^w[R!'3:M:LpQ*ÃH*Ty1zwzz)JT X╬ÃZAPJhhlsw${6ve3=$dQVpvJ%BT/־naܹK/ڡđkv MM8p tpL]5m7Gwߋ ?rť˗r2ܽLdO2s{ϻ:;PUUtlF9d c∰lmv\\Dq޽f>% c]m|nO)7@Di~>/*nw/ `BޞsJ|UVV"͠ '|l+ FO ~Z,?o|;">яaG>Kgȍ֯ /!55k嗥rUÊ#В*fYI, % Dsur%9 .kZ{τfD^5W^y-[LN(`0wIv$o8KvP.q2%eQ>ZLpN 0"IX$P椰N1NY8/C{d^] PWͱjkkΝ?sǑLڽ6|jqil̃3 sq|SzÛ'OنqEi6Ӳ v9*ncΥK#nLkK ISfgg } (کTʝgSS#.0 TWWatt)eŸ wسYbͅkK::q *ݸa@# _q' 're>{e_6ϟCի/MŒK#HD|L(WZ>9'N`vm:@|H觮+L ϵ]\~V NvuuSvyӍ7Gѣa& Ag!R|{w`G!,uCnSO?#],W^ȍw[6mObrr _''Tɉ t‰7O6 P padm8F}1dYٽw6xɞs)g@FGGNDlԓ !tl2 [1;DSB*wr{߃>G~_ַHF9^GzF2bJJAUZD [lEUz5O<~5ɧ*Zָ },S0 7JnZMM zz{w>=ڞJyU\)zAa09}[謙9t@yhhrAꊆU(,=d2L6W5'u\'D bj_BJvJ'pKCT:29NKig|+qNz]r[|_˗{8q9\J a Havf}>LKuz\wvtXdyvr wa齇FD(#Y*9Eˢ5ONRnR>D/jعsMCaT52,Kb פ% SeSYY$,ɑmHmĎ&LOO{RP(E_X{3l B`|\xN.4n+D2FOiSnO95̒*ܶ۠m~N$zԤgvf}Trv\vޭCrHi{^e7cֆn^J;J˗fzuE{Lm:&(mU6!Xb9N]n9<}BR)!8~p:XV;օ% >rW2 -~jxXY) o\>inOKʹ`ѢnL&. Si3\6}c1lE(cXT.j@,|-bYvimKܹR]NBt!kgp__/.3|M8tpg?e,r,=(kvi}lر۲Eï;C74MwYz@uluZi);}ᙖG9B!~iTTT`vv,TTTJ ؆ax~3 Gmm,Π{eòˍK"U5kx IDAT adLn>Na%Dow7FG/bvve_y\n˺ԌuBd#ܵliAkK3;wf7ig~ ,##[p`tt7p6/^tiɮL&scffG#e|ջ(M,VXgϢ333 LRQL/# ϣx z!3CC <|HYڸa' mАEφMDSS piU([1]йs9!ڍjiiرsa<tSWW ;===hiiv.C ]✒3Aun_180QJA ^"vuuֱu߂Uز*l>jgQ$5r4e3 r<sb og>!?`9^ۦ sOND[2q~\j+;XX&m,<Omy;nM\^mʖO0CEB_zIV W=U41cO{]20%;,0(=y|I&&&Mկ}=}4SS}tEcǫ+\nP|w,zzz _{u<2---nmuuC 333n)OƣUCG\a{ xDVW\X3ꋖ#u뜻hdӒ>5|x|fkM*:ysb^\z_,*WHkKtA{V>}:a%_h :,HQEhU)^/E O̴O:<-\9)&.^i{zR)gYUOy333D>G"sI4ˁtuZ[5󪮮^dr.ƹsw3vY2珍]7\o؀##r gBe Q^r !ĵԠe:d!@h.[Zf{8g9;;f] 6Pc}w yµxi,Zijjʆds+V,W$Jǿ{e2/Ɏ?.lj.RДM16z1T|>/2/,AvL/ ?yPމA:NkuͯTO iooǙ39/ {_WL9!`1W)1SSSSh{wajoӄ43B0:!-GTWs{ *Yi9L/sK-s=2De|J8 36}vK0鶴e ZQʼn>k&jӸt2싦Fp|ϗ"^q/Zn~rr vV=^zKw)L$ יG` { B2 dܞkk'D*,|}eȲ 4A,ˣbI -#lG,vm,u5p<,Ӗ6mX쌿 &dr|ťK 4]Ʋ,O.J&brpuolt:,"*T DaBW2X͑y&k qV>&ji7nޟJ$PWSXG'sxLEm2{2<žj9<.zJ, H*( (DG^UA&ǘj*W&#tYŋ@z6LEԔ iBd*BG1u `!XP;(Wúu⥗;3eK+[)s85kh^6Ko<G+mݺOKkMcDљyWTƎdZLMMI]QQM7_R;qv`tLdǎ(ae SS޵ZG?RXYKn#D[&z{65#Jԩz@?>f?oÀ(S"B]5;vpN}x쁡j?=?UzU 󆆱]FGggGp5f;L&~`n?1w=]{ _*2i,|se07Xn[dٟ9B+Y"^YjAK)OGOK )J(9,f5AY$#eys.#!ҝ;1x Гl/Cq #FD2A*EI%E5z"#D/<y&=(tW_0 -\]VuxLfF,cRCmmm$f(JR=ۤ-ůՠ7R?ZTg))R 3?b4z9w=Z2"=z2gPUYX{wkpxOer.ϋ03_tYe>}ʽahнpx n/3.y$b 21x9Y FF?DJצtin4x͚qHdDb1o<9*Xۗ8<*++=}yQ'h3i.Dqlgp1H$gԸ.~^*|. 357mܠ;uP˖eEd꫸8: >YՕ[T+ y.ķYD}}ByěXV tDpFo޼ <,ZZZ|2(Gu^Q zZbX(F10 \)*{n&{mfҟ0\}@ѣ)~1>;?񤆆daf$'hbZQSYY|j妜5mA>q"VulsmeUݛNfB@񮳮^فu 8_ysU= ðRGRKv]؈,q{-xSUUl6#aa֋cc :TTd7VYkkT+V :q"No 茔(0R\‚S ^]]]JßfY2wn(J៫O/H˂e,PsP_Wٙ- -ۍ?" ρ0xa`rbx YpJ?qdr94mz/xo>ah Cͷ,yr90p)dlyġ2mƶ]sAq0;_{= &7˲ *pX2<͠oWAMNuk`Mز< ¼LFQ)leNkQ]u陿O$p!֭ /m.{oQ:]1}o'gO>O[6m3>+cy<_d # \Ӗ͛i;'ݏoחx(h˖xtm'YU׭ŋ4[1g}%67jQQwN<0 ε o-myFHe_qy$IwnXLZv#lYR\\Mxho%o [^12'*7UtIJ7,%ZL*d|:d('Nr1^[[x:S1geiHV`nϗ(Wl|BD2ҹy t`cuu5{6ߏcǏ#cGxqpi8Kuᩣ###e.xnx YPzN:,3Ov;̀@>fG KjE ŋ@;O'dcwtt˫W+4ȍO7o^aUf;[X榦^Uv|ʪY֤ L yMN4%%t,@'B(V UtM},e()BãtH*N^FIoG h=dSNw fxo~(;ppCidl] &%GK vpHGUVʆtNHh<ye˖yfPdcv֎:L uƌwadO˓3c]ݵv>!?8إ˾h:r9[jjjv:% 9z# {maM8~8^ܾ]!-]s/`Ew+|n:]TЕ8GmM3 |. +F ðKPIexKK>z'Nt"]G.T?chįjR^>zV)t2+`=HaLIG3#(p +H|} +#'A<]UѺt~Cxj4 EsJP^༗/_s Gn!wשg!l .LUT #H>yptluNSo}ѩޑNqE!joYŋX f{!6"9XN27\G݆^/l IODMMXhN9>`ǫ;]YB&Ǻgby)wb s66nʨ>X@.;l`>՛";-[sΣ,^mWEr˒.\ V < EwwᡲcbmT[ѩ0lh9>۫SBleY^`<#2zzv IDATdZM9 Ւjj0vxUx4@b o|9=C)0Na.O 4)}+d@T"WpR/=1"E-FyhhUcB+[NzUlҴػoVGh8PH`CyUUݏL#6ɞfN&:t &''iʵĝb7RedÕ5>v]]8)^u+vލK.)_ns{VaO_:R٬6.0t}}80LF2*^+ _aiŋ~ B-V~ 5k/RV̅i]OSs=:X$;?OvJ y8p0#sSwȄ"CI%0r\ozv= Qfpr3"&ty|<vb}yt0 hLkK/ O@3=oB\Nz0NO֗ƻ9x&D|4JGǘ(cUVA7M38Z\GZ#\aS ]>hSxc\sV=f Ο;>#(NmmN8]_oF!;|oznjn ^xq? /*%3+414CГe8r>V: >kNZ0͇Wę%H1l<gబZ>^#w^ ϜՈs.WI|xyv_( Q066ci<`xQs744`jjLĵlSˆT7gݺ >|?/ٳdY:e2GTPTX0^vAf;, YgY,?hmm NEs ͼyYl6x|4 COck2czz:'ZBC;52y=7KG[[[@uӁ`ң{w>Iw"}@H'yV~JtӃYH$ҙfiYip| Q~w =JauVphB.rϜC2Uʪj?q|x"}!W(0ɒ2d2  c͕A8(3.̝ph:;vІC·( y7tShkkky៧z~$.qKQ5k-.^k|}'ơz{}fu,X@L`#cӷƒUŇe|pffF_[ZQm;.O_-@V܋æO(D(uo(×Ar6x+^߰a=^ErK@0ua'A })s'?B;zyF{{{=C5z3CW8*s%J'4 XLjXH&sU@[ZZqٳy!h(u.i@?yw䲄#d?%,]{mZRV555 ;6 Yꄙ{o䆇S>mꌈqӍoÏ<oҍ(mElƎ.|) -ZpτM e 3mm8{|/L3Kvطֹtu79bJ+iMͥoȲl|o KQe ȍ%pj|^j$LDA2(o+W?4}g[v%\Ffuo02|:4ſHxwhݯT\2zLMMo;\xe N2Ym] ۑ\6 !SJD̀1MҥKZMAEX6%$n`Ӭt .]GKK3.\A*B,C:]㑕'> =Wgzڙ1rq/pUZr'ߙG>ẍD禮9B,K9CGi&Ĝ.);),\B3bo0 C.+xJ hFZSkkbzLF"X"v1 糖#KE1BiB ъwxvhF}!2BvtW,# Ypx F(E^Xot_<\ʄ]V WC7K7MS(Ã͞? )D-r]FА7R"x7m,KD%ux5FE|wmQ/}tZ p(qIש&q>׆ϸvJVÃҳX,aȉms޴q|Sѽdfc{uu(3Tv@(}jsp?LpZ1G>}MYǧ?gktK. =n-f;#Xj/՗}!L}7{A#xZ>R(ʮA& K!+ `TWW{Yp F{^.Q'd2Z٠a}J:%?ßg8;ċZ[lezwt宗H(KWWikʳlsdZZL y ˲199ښ9N?|EsÃq,˅VϬ5!C CG2Qt*+E0{|0|=rQ`aYJttt聄.| gϞ-8 O2U( l&[Y$ Y&LͪC|6j.^6WV\]hs~: k'r`l==|tp qu2U7ZB)S5 fD|5O|ىze=7v!eƍӦ  Թ Zgϝw&oʍ7 {NZZ[15=8OU=>5M xB+AlԞHVoqz0eY6̇׋2kK9w ~$vip;dk0^ BmLF 7Òcohhp*@\i!ޛ7OBWgY?==I)j*:s)L0rq /rg֮F0hEՇvyoQ؛^]쁥 İ8qsz7˿?{O_P*T*<]{³)7_> ~H~)O/+"d+]%A};Xca/Q1R7Lc ~_6f˞I뢧 sN t4Mao&{xUSK#(oҺҥq&PER='Cx;J/k,K鰗*/JUT,%   d"YܖLMN ;nMƱg.\am6.G)Q' m:?x^^3gN"\.9 La>ِzLOOBKK.}m\uBb1FixKSl# T?&!U$]C'p˺ZP# z(egA29!Dȳf 0r /+͕Πe f~{7$ Jiit,[՛jkk={]]]]wò,qRX8aYr***W_M)PeeevxÅI7(ggg]Cp! СrzHx!,p,p#'6mCn=>[ہv Y˹F&Ftڳt:-429x_';HXF9̷pCI?g/nw>(r>f.̮.wXMMM [Bd9cL&RC Q|4 >zS AyEZR|{}䂲qMʎR٭ČlQNL/_]UeGQ;nzj ,w{ ᑟpF33=j;s,QfGس{%&FtYSC$8J7&\i#ъD+=hiiFꌚZݍ^wpvcݲE ӍKNŋqF,)>*&KO)g(ؠt9Uk=c*lJ)}#z֣\$*Z0/B|Yx1N9)b{}}fffxu#;<8yl6BWdyxe+O(QBXYƁ+)c/ XV64V āqwa߾}Zs)i_Ja,,>;vd099B Swf ctl̑-!$YyDJ 9cXM-HUa6 ֙3i-d, Ι:tLηϊ/q9*e/8&nf:ta" (mըHaddvjd3XQd2qeKV/v8A ŸHN⋐XZt'v^kvDn=?0@cٸ.Os\G OJP9Q-L~nۄFuaxKY2pV !zSi7_tWTc=]{q;CFI)U\ۈV8S^F\ʻU|;D >---H|y\MBRc? zkRƣ&a`ص{7; ᨄFw=Eyր$q\O<4$zqa1 ;uܓɤ}e]j<X5"`ZvVt_`h p};]FR)d2p0c!Օb6_g{Nkxܫ9s{B@O5mذ^_5sdl=7ccS60!ZYn8λގL&#J?9e(|lO v3-s[E-Œ)qy+WT)3WnmC- t~|%gϞ1-7k!:.FlhFB%۠HCQ)0QkDV {2LQQnd IDATBN}}Džid{yICᛖ. ,o=ꖝ ͛zJ #al) 4]P [jRÃaiϏ[lQukMu9Ahp{[xirK,ܿ\{zgY-_LO>;rYRboBgH&B`*j>"KWT"vxx["/w/ux|?~JȇWovx8#C \zz-~!kr˗1::*qZKϛ4 CfTv)eIQ+VQ.YtpxPٓbNf e='Ոb^E qnn>":_Yг=txębpT8v&UUUȖWP*;w.RĴKdiWyJ?Ses! |;f4|^]7DܚtKqJ|И5J& g¢eYA+0gdiyz!ZG<0[&?xB".^?1m*Ãe6˷qb>sk?X|yvKɂd ۓЮAT@g֞ѮN%6nL})b(B4Xj*GČhkjj099AjY1j{p`:eގ3|Ȱs v~mɃޣ 4Ec."ыa ԸVִ2 =eJJA`zz:Xǟx*,M0׾xo&Nޝc~dzqG`MG{?=_2U2gu٦BSaŎv_鶒 WzmDC9.AQ(ћn|~YLS]] 7ϫ*2? CE1_yJdr +)vA|g|D+E\mxI%  -LGCC.]3`R /k+| omm [8ON,"am{bi(vl[[<4WrUDYaIlt'ꝍK$¬9y].`,4Q~%0 F<^g A)Uae\_y.R^D?T}9 ,thF*G A6LR(k u*U[u"%͙HgJkgFL󨯯ۀСrQ12F[oQxE lZ9qsxx,b% 1ы#+Wv+ l0CʻXZ*+ut`rx$ZN\93_{Ђ8p2:O:g~Ne˰{Ϟ™sW2, $Lz ~OaoF=͟$IDsԒ eMW Փ ,Q2R$ KTJOdbK.Z;mnEYRT^؁ lM՜FoѬ*r΁!8s振nVttza|zdkkߓ@nۖxgAE_Zi!Wv-D]/Jj(!xN,]arHmֵpBkaӳL2Ϩ#^<=N:ut ,n@_A33fQ}'L$?ceْGBcQ$)10EDDRQ,e 1") B9.G36AEE`ںe3?'!~طQ -9ka/mg%Zc͚pHWZ5sط:)_~NxYdzmwv٣MD"tyU*4}ӍTӅu6 GL cо֙#'&[6oq?,TWW M&@kjj4 ӝYAd,G1~֢ qq /[CF(nqd٢-@<$Y%_/Q___)/Z###X8@+<'(QCa> 龔遐&L;B{N0&ܹJ%k14)25eKxrKalX sKrB EgggJzV:dXW6Ruq37"{,0n0s际E=3otWj#GSS#;6=8(n$vn 44 6K+P;I$⨮F&)6KkuAC> r*lHr\ =̎L_tG ؿv=~6n a3=ɜ>sd" 29I_Χ$| غe ~X6)L?>y_R߳lRitFJLOMڗ&W)!`oq \O`i Q__#\xUVh: q tE`i~ bqAهRq:{1MS,C4=8%l9ۛG{p_Mٙ(ek%.]s{4z _paQX1l.sݛ29(y7sF_w-{1t`lxb=J s Z*/#?5`Dd&( c+CHXaiŊصkw-K\:T |#|/-:$]LRt:/,oǃ=k7oVqG9y)}6fP[n^|2yg<?~\pLzNN 9[{K1[SS? W>Չ'O :%5>Ҏƽ/VDE𥫫 'O\С䠐F2ds, hJ vWL߳uaT 31]wZ_W2?O#:ӹ4^9_Elaʆ* xY]rq]wyR (2ȬK7fN49Ry8 KRhH};l# ;ۼN"%@6uw[ c b.ҏCEW}Q(6$rbT*nB3Z*9CD iW /Z5ŎHAq.HtHb-_yic G6 7YGX~ sccHhkkEcc \SlDD&2Q >U)t*XpW lP:<4K\fH? Y:Yomm/B€U|MLkY=޵ka9TYH$=^B_)tx8<`}}äʋ"BUP񊞞itٜCָ0>^HeLdfgd0Qc>OuE2)Ti;>:<@ 9<|J)zSSԲPl>d*lA vUO|Cz)KDglR5g#WA2󘚜rla Ydvv֓+߄j̥(I&Q՜7᚟+KwaVsD\(|6=/JF᡻}M*]uxl<6‚ `FosgG_ *H ፍ3f׸px(ux8QI? @6dB-KL$ejdM|(-ҥK\33gDCYzM)=kbbG ZZZ2xHThtwwKl99tZ&6mX_LJR]][o"t_A -SE("w==/~1iq)Ba߸at( ,+,E&*u ˆ{SF%+qzPz|_-[|vS4̄% {=>L)X888ò)ij*rR#CH~}˖.Ş}}Khc!:tK cM ky/7|wQ'4bi+ ***+W =4Z<TӴ7tɯhpgCl=>iT >-Jy]E(o#{YHX9jU|W2ә7}}~\8a\As(J4HsWt!.H.yiETg*iMUYI6" 1K3RaxZh\RE5Iwq\;^{QaEQ5.,˲ۿ$$ljk8:r\dY-KT{I ;{S*| ٙ7o^>:jƮ؈[:KHMMc;1d B5iUmk3O+ r'O1!|W 4bj8[gm}qiu?YBdo=f\Ii$D4JJ5\]DǴ=0T{Q,]?8ʉPgkyyyMQC֩~:xͥKۧe~mӟLJ8CΝ=k [b_]]gXLrfzQlOQ jO`r n9>XsssY,DӀf8|%oX𤋮ZstNTqEgGZ#=CӅ'R{[=k Y{[ݷ9"tؾ=v|Xte݌ {!ØW\HTxq~p~Tf:5a_G \F{a4Z{NU  &10"AؕA[x8{Lԕʜ$lVُHa J7uRnfdQ3999pO-z]~/MmCl&DzJk%TPۙ^P jI6x48<&R///0 XtY___BҒb!}+u[gã,A<W#;;s/w?Y<R\:幨\}N5]%Ϟ5H٧~ 'xF6LDUUR]ـp x033^ߠORU yzmү!lf:=wE}g gXrZ d۵Ӝ2ON*,9jJrwAz*Ata)((p?හ3\"xR\QQ.7؞qY  hox x 0BNv$Yg75yg2mӃo`ʁ*ػU.+l[d1ihΝ3ހe$YƂR2^,8ÀL[-6vـ:F tyDU^:aўqhVC:[q9Ub ",AДD} ƍ3Ay~ǃ1?BL*'!1H#Q0šUyM9Dɦ&nn offf:<,:P+e+V,0jl̳g7 xB9gk.X6C{{)X[q(LeC^_56Ի5m0(xh+*aE0fr iB~~~s&Qd EŮQg`WRzM IDAT[>pܺ:dAO[eff~lu%Bۇ2xJ|A'%%ؕظA+,!  iD} z]@+F`#x^A! QYY;gΜq=ghXQKJ{%EMhs#|y# N9N|?}ו.v7mdWWD"̢Z 2)QƅGnܰ󧑑%eV,_olJ`m^{;\™w 'ﴷcۿ/Gccc E~'>d Z;2Hcg,tᮅB+Vgqtͱ18d$BznAj:;I\ǹ|2G(! n <.ɼaNks{L%C? iɿ$hA E"mD~CQ r,%̴mtSR޹E gMq3d*~++z*>xbm}Q)K@-((p'אX<yx JVVgyG7$H9R[kٱG^/_5Vr|~ !S }nOE?NrQe,UjYvi#'75ʂ+kȆLӂe+j_d{Si$čw(ųq$4btӟ,ٟ@z~\`;C57φÇd %abbް8LYXp]kƿ.f^70g_am:=+t>_@TPP#=vxW/+((BlRxPVV/^o_psKu%y@"t 7my,&OYuWy!$&fUV+b8rwnmmuGcu+YRR Wr9 cpujL-Z;ӄufe˖9Xy_h!9s&0J$SpI~82HϡP(&5EA\deeANN#!k4k8JKK]RʬoffK8omQؓ9{ 92ErgLGAA#'\|Qvy&4&#g@ BNHOK LD c~|0|mze6޲;d+Ku mrs@n+?z)90&!^~whr!ᘢ^_W1:--hlt46~[4}r&Jl>G?;wqO B ˉpQooiiip *o@?}C',迫W`ݍ7Sm2E&\gqY.!g?55t au<䊦i(JS=&bM_{> ST]`[l0M3^~ދޅtʏC]]TT癚^4;=vuSS#V⻈ 4TޫN/h/\AjjD+b@;-PdU[DG?:2ٞ#96Mv]8]!RDjj'DԷIU<|iBQQGG!;yyy0::%q";0-&''GL/z.iHDŭMQI <$455rss 0.\1ⶊ@+=ȍӡ(IX TyyEE?ޛ@<1w"> p>*ac0׭ OU \ƍ矧gMC*-6tAh=glV!"`*sP[SNn(V^P}Cb/++"T,uڵV?ؕ8sjhL AݿU';2賊Qh^H˖Tcee\{}? ux=4ɓأo~c2)+|KGOcyK r3 怵&>W)U;A"c 7A|(c o rrr}?X/␗~fuuL6.CNnbK0 ~4Rí^VV`c板pjuuͨij.CJ8wJ8&' g97al#^$]qq} J#uW^;=^/B =s%e^,x6``TTt3k@iii.LAMcq:ei q\05N3k*((fxQEEXkk<[ 7mE(}Myg!mCgWs_xɷJ x,]D>o]ěU Ƅ>1r[zO*?gxDkhNcpeaЛnSG_L ׬* @Ψw4A8|ȗbӐe"eeeM~͛PO@'ސp8&)TTT?Q͞ݤ<]]]j6v6r}K nNF<7P}id3RѨSI!k15M*;z4~ xF)))ك*\Jy- )W*AM/ѫ9q-Zqˡ~.qMh4*ΆG8{˗-r9[ƒ6 Zw w'/pxz*'JpUǜhƆ 4ٽ{PWBTcaA[ŝϟܜlT ޡ-Pw(PUJ_J^?sZRt3jp5Y-z7d:5Mx*.yI3NbI$k#? >7N ƹg$ N1?>> 8tQ'UI %]r)wXq6V M76:SnnKKn $+h0A$#&zq}%}Ƌ>߷#oX\\L]jٶ 0/**f}iIncccnV|pW!0,]A3Ifj F`AQrrrBTe)jDhZʑ aHhwΙ"]f#gdxqmC'IIIPPPp1ACqs `'>1;gp(8SMݚիsno'#/Fk $G*M|_!yO"8x0A[\*8:LaddoEYYY€1\аLi{#"L՝8)q-PkJ+Pڼu=w[)+θ._3mmmq a7Y)zfvRD\///L`F4mݵ{QIiՍ7\OH$]bis8j;/1֬y%G͵%a{7m}}|x{lcT9:wtuu}}}NaVdcXOLL@cCU2\!R'^cr %{}Lӂ{֮vLݣښjz&ڝxqN>pU'}}Ě9{u]zRWSb'l%jDi&D"{oqra@Y0p2iBuuGY2\|EV4{ǣѨǡNՑar2j)Sw)]3 x_)bXo&iyl=%~7Z$)ǣi}} pز[x` a/Y.\}Q/rlA)]W~+?7.ES\#!oM)55Uj=JN|(|=<99 +/=2G{h}Aرߗ鴴4>Z\u2euUO7S2o!CX-ڙ1LHO*4 ;5qr%"fpX1ƞ!v>ŃݯD¾}瀁BK,oA.KUާS"LEJuSe8 A g7>qT=AϟwqǽljIx$\d{[E(L qzxH5kX˝,5sPLnZ,v/)Ko ?u֮߾ϳV[Ks3TT /LY&hؘ߾}# =(..7᳟͗B0<ŞMPV~V~֯^|1PyHr&kKDK64'\ɘI^s3h{5V ow0c!/Dpǂe8}uu +5@:hargP+V,w.*,6HN$ {w_{0 }A %|h/ý?4)`'{О? Μ9.WCW Ðjt_!1[jq@&⽦:fF 3xgUI'Cܼy3W1ںr CסE~ܹsBħ>t0K7owaC^CƭÖ7K)*]a \`G`Q)D,uuԯ{)YxK𐠦ٍ:@qi>2]QÄ,nRұAXGc|2s%XB)--{b2ad BSA)GM'>lj`h"LxQ&O0d̙-'"!+N/Gj/Xxj@|RggO}}=8,_htgdxvf^^T8y`X{ځd< `L Afl]z@ӡ@!W}l|bGF]m rMN be "NCHXkLl|8eV2E'K4!== Ra8&Q=MQ7-*?|ӂr7 mfْP\P<ǎeN'..X%c䜚|s$վw4 kin.g#Г3믃X.qcJKRNN P4aEuThWy%)))C!km {tYvH9Xh eoo/֬YYSR `ek 9] :1 YZfY>p??p**ʕA3$84/YH^q!@x{RuH&0!l*((daJӭreb@Ak1=p!bh22I9eQL-ݗ&~G59e\a9pAGi,2EEޠ`B-1-/9ëWmy/%#W*`/^EN}PVV(jj[Bp$-[>`΁,|. Up j0e$~or,2#i:6};~\{4]w?~I;n ?i~ͩ`% 8ਂxaƵD&[&5@%BM\{kqŋȈ L{dAMg7Y gFz&&~|/tWc8*ktB) \WW 'O Ҋѥ\>)H B55pg~}_{'@xL/@~?Yl}=LIcp5sd0"e']׭w^܍`P~ /ԣP~|̙TbƷfjqƧĻ=|$''D4 ˖.o~ōpaa:xUx0;b+++ҥK01>&'ߴi<_QOBV;?QAV%Rqn'NĽZ[ [F9R¨Y G0{rXT{)d0M\ژqẵ_N!iop;j= |:x'Kh(6nϿ%o32 Ɨ6ng~KGg5! ullMdp2s{[ݑZiL 2LkH |8i& `%!K>zpg FQu$sjk$(8ѣ/J2"ce%,^" +; QI{V \HKMMZ6ͻs̉l%IIIRSQHUoC=DHϷED@Ton7@.ȯit8EB!r("Na -L$zq\4Q`\5kVzXD" 4l"9gO xLCqi2!Z'!o`e1zw +&&& z|]@8' qBX5D;HrlFYA*e9T$aP0IŋCYi ig`|lT(G>9K!}q}qzf&_ѷycqX|sSQV&쳟O< x0_x-N!fM>ueH.AOvْgj{[kqG0 }VX|N<6_g)Iu"RLj|F x*g%9<3CrTxzdm=x}젠^We+Ahqk}E%ֹ:בUN %@@:mXKF=zǖxê}Ƅ}0=ձ> <oDtW3*DK`Ƙm/^p]E>zYD_ `!䙄#*-5i}}~2{###^ɱzY À1'c$#rz} Ǘz'ԋA$J#{)))rUk>(9J=m4}[񢗬,r.بD" ‚t.޽|;TsQaTD!^w/ܹ#\21~RC*ϋ *'xkfܗ S[QQ z73|VUDgc D`rdd&q :uY{~[Z5\jj*H4?N {RAuMΔ62L!0DQCIjJk:c5V!&`dxط |뚚jV45 ps` \)2CVO=.j${9G{h4jP6k,1cc ;x='HYõk`*`go=wa7u?}}}tb'AXl̝]Ϣ[;J9996dƐ#&^>3//2_`^{;\š'JǑwq;>|Dr % e9ِi:X#*c`:GQ>7c~ Lz{٠_dM.Ϊ鐙bxww***|x#q&4Yln&Y^^r>}Ks:,VdgqɓB`%##j8 2 5Zh4 q%!{0J9<ʱx4|zӐ؉bBaHMM%(dG"=De5n~i:4,[a]]KA5{3D("4%)77/Cb6ߴ } QNEUe%=V3N#Y*E5^+5p .) >*|d:v… aΝ Ao~~> F2G֦ZP>}o9MXhcGJ=5֬^n{-G$/#R U"`=J WWv|W?RE5aTzޑcظcnU\Pmu"Y弾UEŐ/z! S`Lt$>fhAS]周rU& hFF4;*O]'S\62C-Y~\UYSgpg,5%XTTI Mޑ(kׁ%>8*N:1V #^h=N> %N:W!99٩rJd.I벍90Ӣ'g5k@EMEd1 \f9%K`osƣ@p`g梢8sW^1˪APP? W^5^ kwp.Z;wb`Nb! ԊAޅ,&;>>p Y-[^El RvL:>ee(Hŋ;;vHh)+3CO"8GTä44gGƆX?(8Y\\˒7 Z\89j9̓Gx~2 5A ;] *!7áEBvݔTi? ߘp.//4$4Zt lمcg7#G 8S쪒Gթf/ H@8 +ǖWX]*OIvͳ"1BwL=%,!'^ RS&G2lt?\L7׈xRHKKor-pM 9f׿;… Ƣ.Hm$ʯ7jkmuR&4 9)n:EB!ņz-P37++3>r/ma`͎9P At0+3; ȇ?_7eҎ'|cUtӐ4HnPɛ(:&'' 1vqr,AJB)dԌ_ڳ)cɟ=|t=wN }K8U+WkQg^?1#s ï_~u/_՗=/;~Cs{ |Z ,|O;եs+=< 3Y缼\w . 洴C"7qBeepE!z}d#f5nN ̛J5{cSuArzi7î%>,#x s5A)+ V[jU%&U XY'!55\ЫMIpr]40(wO j^: eLxe?pE/}+q>dJUUW&233aP#C8 KDDEd[[+#Oa"D"0Jf] ytRؾ}/i$%%d^e"|PVey]칚AcC=v JKK`tte%)п&]JIx@E B`Bjj*I^ϯ7ya5zu_gqmhVVU 1:::c?oU%(jʫ< 4jB ]ripej lR_Wg5 Xgٮ̻U9f$3zprI4b`/;IJM_pY4^!&Y2MuBwyf8~qa~_u7\o `耮nxs49C&щYٍԣ`5s/8}2V68|(ש?}ܗ 4 b #3p8ڋlǃ3•>U>v-{BU|]lHNNm =ΑQN\Al=MWoqqe?'ȠUuU\{41rO( Xn}}s\37[OM(uu)3g\Y00 Qx"Æ5c>bwc&B `M u(/[}Rl.4>?p.\`V756ZVq xȬǛ,WsVQCX %84MtɁaGnM7'4ξE II!yoȱ0>Mm(b&1ChNc_eQn^ze:TWھGfUZFGGẵk,H³|Μ`jntHaCT-!/HIIqt?w{odSkk.LNN浵uTry-irid됞cWvve/ٻ|Y~ݍ`kիWi?:2Ӗ0eK~*x:_ш1%K9FxPƊJY*`(2G~ҦK{G5{J)(AW{y?W^mU@쒹*U`k t]|Vzͧ<i܏ .pp2M) V_ؙ8*[ /@-7o_Yu'7[ɟOfx W9IBInVhBaCx555`e IDAT ԴW4jiiCX5 [s΁~\`ܵK}(Ig9O@Th:TUVsa>?غ;/̝R߻kwjUk|28rkC#J{*??"ZȆb /,G򡷷3f'k@x Vh猗U8$4ĩP<ט2qk*O})U afO˵˥鞌|O3d-7ogMAK\c.Pa/u(C=p2ץσߗ9@I;y?YsJ B7Cff0@]rrr~mm :sVMo <{6>rD mLM\.XA^^wy@gHM#s_ܻ2MWO Qw]>uuu\̀TAoNl9E8|[0?dAcClXw#|Y|C~i>Vmmw>kD Mï޿ި3*{~?!Sr֭ϟY^ݶMZf z{zr&ݭs`1nj۸]x:BWW|bu$2רYlF}iץ蘔~ECh{Mӡ 23ٳ:w./(c{|F³5nY8}u33^rGzu^7M|o(ϔoGiHU+[NyQ:E/|'?Ɋvi=_ܾ_Sqq1tڶ>uͱBO}]e}*%,N̄+}ڳ|J~tkG~6S:T[-O#i5bݬH$H rHp`V52ppe|9}JZC&+** 9piOVvmm ,^{x͞|4c~'яJ xln˖/n(<=Gkk+Ue?l *4Y`gu/˖.*R4'cf%wT9f)ME6!>1~3E)%B׽ky߽PvV\@`4,KꦍL 1 e<3K(|&Y/uw+ÞKRiF~`Hǎ<{ =eMP껥%c·٪']'~<<'by_(<.Y x0$ˆ `jo7mN i~Ji[~X ҩ(UQIK6,uEz8a$SߑPn!G,a/pKJJr49COO/s:Րq;F8vlANSe:hcfڥuCakŋ=l7+0}goH,ꕗds_ʶC+*bY-tUۨ[gk2Am42ls{+4FAZx<-yltӐ>5c`٧a8IHU6zW2W0}Z[RR`0fۉ0<ަ  _/,,|6>1I%"+|AsODVۅzn$97ICyÒ%8ysPNQ>_e,8wNA26U\땎:Aa_O͓9?޽:̇;n|uMMM5Ӽvؽwl+ɺ`rs֭?폿MZ΅ a 0:$Uq5+BqQ TP{gUU 6x'?fl}-[ o]]LN,[֤m|bϕ$mxx< %|O:O4!TVc05Mޓmޞ9t*^ PZR*}-]J \g? "Pff R֭[V x0#@Xļ#hZm*E}4p`ѢE(<EHlIKKvdFM@]=jkjl\ [볛*&Te{^XbB[K:p ߽R1[$30}=;D/T8dCYݺnU麰:Oɟ^QPaŁ4p{t#7RRbG@o۶7fM7Pt>79 %r50Ou7  ;Q8xN^/M<p<0]ott4KM4jwb:TzK? fhft(0qI x_4TkLRɮsg@xNyZ ;Gcc\moks5߄@;+OH99+с9@gUrryFFFbc9}{ܹs@2JC4W=.KwھD".]k֬Y1۷o3.9i7XK:Vb ݶv~*ȣĞ(/50-[fZ%e/yH"iLA'.-/c&[^q0 ;ɧ~=K_W dl î]nzo^~Ϊ$It}st+$O'5'(E [Kμi,sD"0jM_=Up+WF}Pt].WYW5v_HKB҉6CVvSxLy#K&KdDP2y̟Ohk$>&<,/? u"ZZ:)`,#p=6y܎ON7 ޹0de9ۘ$Qq\1Zp!sG!S@]X^E6m[ktt# ðfhfȭ~.0<"!===a_%j?^zyĄ+Q]9%Ϲ=pF]0?&O86yNn.P*ȌqQ"Qsb_wkttFO/h4tuF-O\1(ރz`_GEy3frb] +BC${pp xX}+;r$ FN][B,B. |֪h6=lG(Z@^!kzUdG~={_r cޱsr(/+0w1Lcƪiw~l x G~ٱ#~LmYS6ŽWBj=Y{u]zҘls'==|NC@lC(H%v/]{ayaX&M6SbuLT=} Q H$}PP5p}OwvhdU$̲|rr247 h{5τ0 \p7SVJJ3/('ꡏh(x3gub4:g~dGffcx#<9d^9bR`[wӔDO{[s&܁;;.Ң򓮻ʎҒnẵp ]q/. \qӰfj8{, `D ߙGp(]0͘!b|t>Lt_ 0P&#qwV]PPj5~? sݓ95ް?OMsiA04"t!khgA?ͱĐ311NMP(άUګkk8qHX|9 X0';g"Y՜QÐsT]] QpÇH]i!|9ުjT͛o~Wp/_M7@ZZ fmҟSZZ WŹ#;ߧu4H)CX9}F ݺ wäгLӄ ^g>ށijA~>  9@k11 r44 }jpO1gލ'R|;St9FA^Ģt]ÔpܐMmr:Zh!رSU5VV\ nƐ$VX}sר[j?_ArFI48'ޑ4^ '،Rg {2@YZZСtHס:;9Rc$̕Od扸_`5,[oTgxKᰕ#+0LӀm* >tҥKMTͥoz _8gy0U s---pnS.9gvuuupi>Wz|sރsV-uʲ{TWUGTE92p[vmU;.H'AKKQFbT==??z,C|p)x%|x #}䃔a}|(,IQ|p8lUtl~QyxܒgQ]+l˸1BD(55FF-'cMu5>sƂܻ;eH܇uf34aPȁqbIE'ӇieIo,}h8\1@>̽ Q6'%ex9ך=D6W%8(##Cnz8!Q"C&p;ɻɐy^[%h .ؾȀCþQhjLoyⅾFt.IUzhq*ިx&''!L) 1A7cBy6ejC W5spU"35v`<|2:b9[[ҫ(saUujRU IDATsauFΘh:NNN;6'AUfi,a<{hSaQ*kf$@0tSN9;;fj8qï^^|zwuz/LDgLNN*N Yl}c0ݗkz7eSyJZu'"H֯)#6PeNu]իVAWa02: =\&ҡ^? K߫ha` ƪ=.ETTso}!Pyj kEYAIItAͺ[h!U(3ǰtT,]:?'5=XPPsdt8v$]%$hx\lw=8^٘p[ ^GJcPX6ﳢBǡG r8PQ^==,}C$5JN?$DXfu`eYskݺmr:<q^8}Г,z?7',]<>#u-y/|Z|U]U_7_y~4Z՟~鏥`T*#}S^^e(@ݴ z%XgnAid9ֹsW=[QU nR9{[e)ۋLaU^e}5 ?+|k?}7js_`wB8,r [-Z:±lAP/gʙWwtD]399 z(Ihkh N2_a#UUw)))vVTeUWgW]BBm{؎S8)Λ&NĉĎ4TQ#! !~ܝ333{ :sн[9w.Q?G?U. j^ [R:sn+AegrYL\h1<ٺ,^lk(VOR84ƚ,99@g!:/Ie@Mu]cڌt@diBX^DuuuqVhY&#},0 Ep123- KDUWU@;/@~ΝXڽJKJ⎛{\׉E]5|BѫQQQ~p8Xj>JeQs((,q"5i#G*k]ɘ_\\$4ʦ23Hw*"F<[FӤgϲMخOeg>naj7@{aÆ ªիo|rAqCfZh9r6l'=c ipJ1^`2u%dZ7>t@`fu&“aҌhӄu+6m0jƉUIӧOFdV lSw˖~l\,q6Z~P`Ϗ)6"y%}p ǫiQ(}jaE^iA V)4aE0|y&c``-J+Jur ي4" fWQ`ӑ=ֺgCk >+PĹ{W^Ѵ\̌Æ!>rm3k&lٺ Ó&NdMKyI\&W`=x'y#ZǏVLL8wFFFdz|f`B'rj"ӆVT3YoHkouΰU`d@} fPt@0#%zBRJ}a~'W}Q捭mb^VV&y Udԗg1&^IS7k9Ranʔ)r㹸qqq$f'+ KvꟆa8l n6V?:9L% ***+bz^qqq, 2IJ/Ru_S H(/+eʣmmmcNt]!8gN)'>T„6DEE 7ɦ 4 S^/xQlR(/wÇ[(Ʃu`rNձ575k h #PgUSB98Q4 i V뮹4q4C灜>ຍ~$A8 ܠ1Ƹ":qY?2}K[Ob@ tFfnû/=C%P\\\`{%'_0 e`=!R: lh3 V^<7Y,xh?>3{Hum U2l|.wç[Up\\+MuHII.u*{>y5)) N8aۃh9.l0`gQß Z #9,",{%ÉysZAHLjjmpUVV0sA7v,'$+^AtL ̘> h"Bg8<8EO$x`V >B4uAc8NŴ #i׺[n1kMLGz8ujs6s@ == 嵏^ l 1x!MpA,ݭM0MЬQB͎=ax6swa 7u7aɇK-EbZAX+Wt???/04~XسP]xYfV í;>SCyֆ#Ur.~Txiȑee{H:P>ZAQ8Nuuw^̕,ۼo;֬]+la `H~ '9gAa\TVWYs_QV>;D*SC 5- :O"%<"ȩVJ-H0r|VHUcCܠ\˗WcSiۋp=GGGCBBBkZTOC2lFF~CSWW``hat,j륳g,cP12kf]GUI}92^8'S2fG)`ApwM 4pE9gLɆ6*릵ݿA (m-c][|ޣ0 A@|Wɐ:P$~""^fd,4Mp]~`'ט#t?0MA'N|0r䈀K 쓑 vfN;k1MKr|i;#,mL0Q4`ႴXz+u/Y"K]jÍ3Z0uxONNV3&R]G(W?jk`)S#^ yŽ d!|_<O;;G[pHԓ}j:ȯ5M,+*Ү]QYYA6[L^xEӀGnV먨($"2ʿ5ǩ㣟ז IښAyˊ#H(t{yqb̖-ŗ^&?xp׮[a\Z⧤$Ǽ#c0ngHHHhU|97ޗBb̥hhh'!!K 5`v=" X|_{yS ȍOƨ\8y@XФ߫3Y| m{uzvh:,fi 7 ի~7s{H61ϨZS]M*C*b۷Ϸ )fjغ@Inp|?n,!<#&Qd$ MMbDꪠ;YxiOMl365U"rO^~ٕ nB.y( QNuVӥDD{oԽnP &,,}7x'*Eh`\b.CAo o7JOK{]# )2jظxHJN!#?<,'Ƥ \{#K-^z|P类,qFӀ~;-tY㻧@!~xO8 k0\}UPomG}40vri`gq0z(BfKMMu}HRU"##ÄcB0M۶md4ݰqÙA`XIfA1o㣟ܚ2UI[\*.TVT8$`Ez*W9.e^CϘbͥ|1udw1夎+ =53,X4ګt# i&BNwd6R=L`:ʾB=ϏF5L{â;onZ_,GU(xwuum1{W!66Ppø}t1ƂH1Cg(1=t]]ו@Q5)ªp^8IA;..&_pkj N5Ѿxm?>zqllxŗ 7#dC)Q~jr@mDs!33ZD(Y|Oﱽ8#lfʫ뙖uuu6(3N999\0[U] @n<)%LyP6i.KL`sFS"c$yZ߽[Tj~"sqɃ}뮅~ZnE:cCM5C3oē7CDS.;uƌ .]*x?7[u\3,dP]A-ݳg΄^yȺόvνxoO-d`0zHXle4 tF|bSSS3ڈU\\L0x-i9;>}8֮]سz`g{<i0^ىSW%TyiN T"#PmpDK>+##Z[[ᔕ8kPI0yD2]J)..Nd!jDedCrr/ARm Sw}4X9lmcرcHDi57(<<,4~TsMT4MJ3$w+MH,zzfbww7l۶ۗK.o` ּz2?`"SG05½* WT[ fבRSS4yoT}wjmk bzkt> 99*ĨG+:ǒdܦc1Ib5"gmEu,;::cA{tܸ@'Y ʗuZAGYkU 55 8%QҮWjGGZغPnhÇ[ 77623@V8Ǐ'pL%=h.4 +^'^ɝV _E>S'15s2#ԩ~؉q,e<ߍ1橪 J:2c1@2QMoMR^yv]q ܨnz] YKMCoZ8'HRرsg ;Wi[NNNv:=Dg{;u;l ÓO=:_ibR2iwyGll,)0]BEeλ^<PWCC=ACI!n^.Iu5̈́`}gh쳪Jغm7.XV*ǏdK.^>^^ j4?pP9D}jV/(a}9hpYi)[yĞ;u?To>779}% V銶A%z@'MT_DJNÈo):lR햛-~:l79H9^~Lw0lXxIb@/..<d 2!yej{^acf :9?gM <ﳭV,G" +Eoɒ IDAT"h2k9+ou:<<h:z(gvx`庆zs/iL=cPUYI*MPXHy@,AgUnn.ttt@LLxߚ2~ :[9Y%\TUt~јCA8!c>Þ#1|!0nINN@DWd=#nT GϽ*˕Q rkO|A=ю>5U~ri@ Mr DRʋDK~hMQ`-4'&t(zNGG<Ǟw!q ˑ֘Tb秌s+.T~z?Ǝi`1Ά|lhp?WxG[q7;: RD\}5= B44))Ɏ񏉉(R;ms(| '|'i$_2"qk4/5Bj4m2k,Q4|8Ȅ~G?ԷWuwKڔS߲e-cx2p㊸*S4ֹ;]]qc RXXȴA92=sjv;7YoEF  ERSLGcgneEE0L͒QЙZ+*ȇ1G pؖ1i|3񑘼sٳF LV/!4m-ׁwe`X_OhU: sJR^eg16O4 =5aF() ڇ[ZBpֺxEwHgger&CLLS"SԌ`Z_sJPr{YY)!'q-iYQegH(YANV:.*`˺9kK/cǍ͎sK$ڇcrnڴ 222g&^7e21joo'E ` g ??_&A8C@7eKOU;1f} ߴ--'O$ڄ%CEۀq`r{!#oM̱i-.U *{pzh ⅁"r%B/>h4(Ihӌ3V i2L6#s ]g6gA !MUX.0 .O}ACk r J@a9<,^!ӧL0Jc{ Qe8 ܍hr==iPS[p8L8Q x~,իCD]rŰ}v~ae$1A@"3޺Akk 6fpF0tMu5=zD񊨩q"##˖Stn8 K)!#ц}HLL nƖ,{^ǼwtpNɓUS] wNEԫGutTM)"""Qn묠~Ep.!''>31110 lgQBB"$-9AӋQ+xMzzYK^Ƀ?w86AA${ op Giii Va rĝrҸ#m0M39&@N\JJJr))) :O@P2Btt4񈎉k Ѝy'.."""CQŤΎ%Bv 4ԩS59VYY3a$mؼ.:v1 O1署6Rn  Akξ64q3pb :$EgWVV΢X>k1 /7K?\jժՎ[(m-!]DF_mƕ vI^:!9990x~Y/v"ajqF膀]2{a_>*-$ȼȑ#3; c̙=^F |X_4 @#<{Ee$6o٢Lkο?^tEy9?E7m"_`JKǠ+\u:;f;Gg{IIޞ={ !.Nz333.;)L{u*O cwe V(}p(O11,Ox.d]kYU3H={>bvqXPPK'Nx3Yzy6 \Vauuu: `({% bEOlLw4 ~UL]OO 尖ÇBytDr˹Ȉ[0Y3P/|?unzo` ]\{E...k6ƨ]v [?KAtҠWTn blAff5!`DeggqKwd3h 'N;/(**J'99Y*B~毨}vdd$[t#8*QIq1=v Z[[aQt2wa<鎲cʫg=C\\\@8Ş_VZ*?./wN|k ְCH_LePSi\EY3f˯y:x?"i;yj=fxQy9), mǻ+Z{Ȑ&,c0iL_mOqdaav}[[[@t;g2rxw4UJq;s1Bd;`uz `.Yv&˖xrx,UA1vux0<΃2txpPYNCr$ҽ:$ ք=ޛ6;]L|!Q"z`8FNYcǎ%K>d*[QkEmĈb ߌ7νkv21CaSόѦ]H btR?v[&\ۚuҲhĉd<{N`Zn<_i`C2z;u={vC1:vTMVCQ[>d=G(j5\ύqgtZ[[tx`dȑ{ x[~m`C}kB~[QZZU6)_zE5E֚:5 0f~Y#w{HعS\/%/'G8(qÑx,wRν@\3. L8>d @2'9@퉌$DCYU(Xk+IWg""" -iii!Q"$뱜1=[1Sf.\`(Z?3^3P[ڵB>LYD 0v,m% 5!'`օS~  }:R;oS^c,a1GqeYOW]y_f6g,x񥗕ƩCWw[jnݶM 7ٗn s% :xOQjZ3"믃y 5]WRPYJJI.́4$%$&sy}+//O?!V,=RTT >WOtt4tV4ڼY r*(_>* ~ioq >FK+*,\tiŋ/ _B.6 ^ ׳1Sؾ^Ʊ6̛ =$qmrrkıh-BWW~ZIF4!,ٱ+_<#E`PBiRgkQ,WLH:>xdI1c`ɇ9`/t*rC8'u|~8HC";B|BH00 N~:W|pxb0 z]=gؘhqWWW=NwӺ<X0cVOuc5W] 䁀퀨.,b9zsE 4>W &M$Rse=_md JL U2/YsK)]nd8=YY~R%ǧ(-53,^,})N<@ɯRرs'a`LOw7^CFBD|x~8:ƌ .]j=k xW'švZ|E7α77srzSs|HPXʹ$*Y\nCSݺrN8׌~f-().] (T%N_v?p=LCzl4*z#{P>ܞz?T4 ~`gopS]][lu|_VVbF{!,>IFu P& P}R}ũq0('#u\m?!2bp|0<ѵR.eӂD8c<|>"N999Pp1kOFFwFq;<@u{TDZ@ߠ|TwiSq*0Kp1aҏ0>C8<$Ȑ|;֪4^/{wx)9*(M 8Gc)Q*oaqR#''[Nn?̞5 j!cAa6$A~BƎgU#77'LEB6,**hބƍUZ6un?rErx HI~9ݩS9r*Ȥ6Ě̌&sM"@9RVλLǾ& cuG쟿^?shL6Ƌy,""9< d y^c;<$ڷ~RFtqȲJs c0*OdCD{l pxމ'IWq0stac* FR<ٌV#۪*2:283fL'4=Gu€3_QQQr̘a,v;cbb( HlPZ^}?90mp͡ 6YC]{ ر!EFFBgg'9z]8X)Ɏ/ȷ222.UW3y)m. ;v../v3gLgcB(9kB-wVNl#G}\y(͖ڂ꤇kDVbb'sH>;TCѲttT~~gL?֌=W[$jy=k9r!O=\=˕o`155:;;%O\7űDPqv6#4,ᤑ"?rbxMN@\xgCrTF$σ-0a͟b>U6C;wG}qeZ91_ }s(; 7 4iرca*gl Yt`y [k,=+ gW ǣ,[CI쒒b8u+]K=S4{Q:@*%llxŗOFi06 q( o ߶Tz]!YBBtttR1BիV)fڰ-5󤘞 #8 )9N8a;,`sk^{̳`/WJ9nkDB[0yTh e6 n>^"c bcc^hgLS ѣG+ZdcGg?~\^ŸUK{&(KǏE#y :"9:e ;OuA==WUYigi ul}Lʄp$Os0Qt/d~*Bk, М9o1b8X>Xdado1T2 ?x6~HLR0Ґ1/7GjNfߋo;u^X||pB0s +;NєpyMRRp,oPSΏ'G`"MV*ţZL1TJJJgpyyyE[0Ly룰 7{689KqK/"eSR*URʂY> dIVV|qݻn?ē_4g|_RݫҔ?ֳ+?δ|FzYoF}/).]h-rSOq#B ò+2S |E[+o/ʿ;?wx"2|a!/AY }C}OMM5l޼;or8YuwJk%''}D:QAvky%n^y ~a. +?XjjX9w+RF)3Fڹџ:gyPof;>'Ne-W.称L@g[ rؾ=P233ZZZ\[YYifrL#l-bPrKÒLToFՌ3{gW{L>NtworxyȠKG.!C{,rFĮ~ys"ߦL?7b#S 6yjj;׈MkLdIII0lPEEEGf^ܢ:ekp*Q0n܋I; e($9L;I`=G@=dDTWU[^}e¿_jQslg̈́^~EzGĞկCU}f]UU5lݶ !5o2UP6 :>x-Z;JU(cbb &&.y%&X:nQ.0I{ p0udx 9h$"2BI2p=O~ `'7H`S&܈PpFSciiмqP_iᚫkoe+R# = GGPgGđ:?n,Zص)G}h95q~If{2R ^_dBسgf/pܞuTػ XA=,\gKeVFmYi)عۯb~!(ፙ㙧#:4**P2ZyV{~Cg}( Tg#7 u="HS8T ]n-krt 3F:ظq#[khCQQ٣|nHO5,^!*-YOḧ́\~E|zb&3fP/gzxuxHyD=/".pHKK?v8<&NU`O>HvQ5 W^mwmǤ6^/Y8YG5F_E5[1wERR{. XS -[Hʼn홉:uJ(aC0T՜tMx& ![o[v?0 HMI1,.7\~ݰ{|+Ҩ- JK_=0Okq ;wO~sBE~~P<ԙ82 HLHQUYnܶKe1zpx{M®g.%~Te_wgPII1ڵ߹ޭ38?U]"`څS x[oZx}mj(9eL0s6g7k׭3+6ȕ"x[A~>477K(*{ɡqMvvAC<0}ԉPgl -Gg1IY4x ~F?ӫ`d@ހ, +OuSlY~:6(WY[Y݌ 8r䈧yǝ(w N<`l EP_/<6  /7)_.icŽ]7!שS&CTTƛƩ^R4822?.N`C'wm_3DqGD+sfx:JQN.Ͽ3ICD]{ g@#Xs²r}!c`yc)b' :\ųСDzaMHim,σ};n}߇w!Àc@DD|"aM Ǟ _:ټ:?=|!$BFf&l۾]jo  @~SmiDfM. o[S}#D =&>:Rdgf+8āC f:h;9 8{ܟӃ[LW}'Zl u>dPoAD;ϛ ζ:ذa#">|8\4fggá-rtN̓S>~ouxCX<8BgКvg0\ ~WlZrX{.or#|&@AC0?o.<aу$77M;VQQQkAptYA ""z p~uiT">X76šk==i`'0ld0KeJ^je~dX o:yR>gy@w IDATi8Q~iV?0o ` eBXc^xSO<7[>Y < ߊߗϙ=Y67>[o~1(Nv]d9G{FXfژޜJ%Ű#DPs_wcFÒBtL,"u~ o&Z{PLL 4  ˖/뎯ofuk".+2r;>ZwpS򜒵deeAKKKxm}Gd^PB8t!UW\׿e7Yزg(wLU|X|9ed!SqO/nr6C_Bke3z)ˣC {F^bblu08<(kwJoVBә2X4l ES&}K_6ί|Y|knL,qUVJCd&n8^BVO ה>}4:m_+z===uBNwiff9+F ='vx`۳srpxH qqWT .: FK.cy`˅L8|ʊ`Ow,gۙ mWNgoR5U}D r%{rZQQ۷ 2{ysɿ=E p |TI]55e". _bG:(ckօslO>Y/^߳1pC3+g^dѤ o;隲xđuhQ#a~[ѣ4oW\vi G815 6&iP-qgW l"cnj]a%߾%v !!MAuU 7y<ݡJ9 L#͸rសJ~_u#ÏA>Nt"#q@EEl߾]cƎ.eƞ ھ$$@Iqخc:g3=m *sOpfErwnYT\\ll‘#G̰g{F<=NWξwl#lGY+~ɿvC}iA!V1JMMq}^vv#Z=z RSSϜ8Q\HÀ={c}7KyMqS'Om۶:>ʥsfs2 Ew{4ye)11Qz׵"0 vx.deelD}dvsx\4B5TQC*O;<1˜c!dFGPo޼ \4 4( eeCÃeJR.y5wɶcQDyP7^oc].W)/`oC duu9,,,`=\psxC48@FW0b07͟k]Khq!=PvwvvB||<,ς0x.VTT.X9=&G/99 wx *(ȷ-ׅg`5k׌_HATYO]; 7ݲ g 31aBF:fx4`8#N*DvppxH҇KBCS/XBܼpR{++*`f] YE)^Z>-MB۳CY{g[=fg#ܑ }pGBB} 5{AG)BCBlh 5Ѯ:]?5f]]-lܸrrr0W^ZiPcJAf>q 87F2q%('M` eV[ƏPi3!ܯݦEEEgϯ30TĤ0em%HD1a435Ewooi:PDdIxzֺ3=|F@TU͡ ]x9(8rC55bͷ_El(c[>y$\wpHK"79 /[W߂ll8x{ns;k1ꐜ;~{?l}߃=C~G=.3K1!DZo4ǞxBmj:ܼp )ߎ iM,a@8Q(],$S.33SqC4 t]ﲯлm^o8@I8.}&kqkE1=s&+qw=yo÷9@*4vXC`O '8&)/eJI%jIT}^xiȏ&j*+ambD&0o\ǧ&5gLxW+V,lr gϛ ?w~3%;e'2Mne4 m?y)exoO=%-EDD@Oi%|8cEkd@K@/1z,K1Щ.)) Nʵjmރi*c(sp|(#/c̘;<$)^qie} 1P3[_C D1G >`@ M`c ir I`js}eeLW^{`i<:*Rl$@BRJNB HH6QQZqNL}liFfQ@@F6pصY$!AȂᄏWAΩJU}p!cۧwo֭gFVi)Hrx(brpqz[WFz:\ƲxBcF >qj={z2$''##XG ==rTIII8Q1~}\\\3h6(**f\{BUWk}QͅNO75lIdX)r ۂY+:Ԟo -]ӻvﶂP F[ t㽹?~ض])ttt@g]$$$XUOE58G6\c-`}MM<ڱ/^kbb09nX8vzͨkBN>OP G ́ ڭgk_7m&a5St>rN0 ss֊P533)}*?/ڜu(Ikk+ͅvD1{f[5$AAs[Yx#Si|d&~ :Cx@o;+h\&o˩A{X풒L9qe&/zm Ӯ1yjjD\#EF3E(Qbt={>q }g:c:ݝߝ }BJtǻs#z"4߁9#F /vx˯gN?yB78O4:59aKE2B!:s|Lu-6lz]M8z#xfs:s)v|4`b* ;w14Fqc ǎ)!aL`D+ƢB&z 2;rrr¨R2yt%!a+eggtLtOcFs^?G\h$b! AX[`a|#mݶXX@x鿑^/g(} //LlOY\- ѦX=CؼdIȰPs7x hp/QO2ֽG󸩖5h8dA9x}Ims (,(??/6,ƻoϛB}%ObЂeI|g>…kĪWB6ewsfcA֯o_jq0:ҷthimCԜZPr)VV][?~?zN떎(8bլ5J/)MX.+m ׯ[0;2,\^26llu4+s[KG1j0]>lym.D(,=( hvIV_e=3`z^;?QFyd Dz=bKss(}^[c/ %[oeŃ~]i+>͔7yCx!c~^rKO$0d!tXt1@8 PYLhkEmL՛f9r)HK@e8K.d *a溋& 3r$lG==<'F0=b[#}: ^D׈hg()@e#!D:$ZL[sxɓ47Q zL6־Xg8EvxwsBAS^'SU:e {=fD <.7YA+Ѻ .T7*rSVɝ5Vկ}ֻ 8 x0sסHsw'q=G ,cSwA8)9%Ts̘>w-Z-*,E"˜l8-z S|pT A%OAHrصkCߤOwd6IM]_[lr *++xACx@ĀFx :g( ~]͘1oCbB4 3M> A8TWUV"aFqL-<D{@AAS̈G,'52L 4AAr`̡'x#;aB}MB᠁v%$?+)-#׭]GǾnpaAVq4E lO7~߅>`vX3{ c o\C xcGלl}FFW)PRRݸKdט{Q͂J`Zb 0E=&߿S48N 5PCWS~d>s\Ez3fϚ|ւd>*Hh xtKϠBo͜QgnF,n:LϛǵKL`PL}_ۤavm7Q)(6 C'F*77b<sv(VM#ﲀS(={t(248,<FY2ڡ[S@)lvL8Fz iIZuHs󳘌1xJ61>|o%hҟQN9]2`w65F$iVۺq!ז)#@Sܗz A~U\bxR"7vӤڝ>33ˆ ՝8uv:HBM7C2 0P 0JX[ 6gqII'lq:Ƀx_LȲ [! r%#Iɐfщ&'O:޲{Yp!wLLy|s/ac}pMzbo B@/;zIl/= ^zU7lZo1gO g~44{@Ua@bXdqE T.觨~$bc`JK葇h}!sp?s/~ף?zD!)@Du?_LVkԯ]'^7yḰd~VƂF7}raDG ̵Frٳӧ쾚vDk1NbkM,*seٱDo7Z3 #\pf͂ !z/jI%)*[cte^pՍ!/-4Afpe21!XIr)iS|8νop *$ ̖Zw=#7Nyи5a&1kͯݵ[?iZ&)PS]6ۃ/^_ %tž_Y9 n&?V>Eǘ_Kq00j7 /d̒Kjh_{Νg +4o!++ "LYÇWN6q6"IDAT$SX+ I'ѣ -2^zzq-%%EwvAp4re c<%==]<"@eC}σ'>w'll222 99Q̄MMed{Ks璔Fc>ʲ}Ek{믿v3t?Fog׭s-Rx\D! `^$5$,)L7IF(&V}@'z:S|wlxgJc겒t{Ie3@C"| ]紴4hGA@MIVyKyEQwf_j5G+Q]]-(Sl}ODŋ|0m*mؿϬ"[UxDZm#*,^#a#፿_sĄ1a<&Ԏ2hvHTΞ=pՋ/Ӗݻw_|@-UԺvbz x!R x-أ͠Ēǘ9|yߪ*L2%*jhGr6@UkW,꣬G8KX*6>I-z!شy=OS/,6G+[Y((_ZoB"P&N2{!I{A߻@XϷ8;aUԓ?^---ĀG(g'OF&!q߽)Rc x0>.wAq5tĀ[ɁZ_+,]ޓ0=w);?++r>etz7(vRw-{cȳك;Us晐mSDJ Bu읕+2ISn4r]KʹRv 2w^7;ol'+xO^!y ;lxUb?̞="AF8T,Ҏ7Iy&4hiL'T䚬,:Hyhr,b1N=47It/p]זi1Ǹ'ZUoեm8aNaI s+Rj?DbcJR\Du,㹖-Bcka\WZRл<_ǿUɊAVP'9Jf]B>b\td`IENDB`grub-2.14~git20250718.0e36779/themes/starfield/boot_menu_se.png0000644000175000017500000000030615000202015020404 00000000000000PNG  IHDR;0sBIT|d}IDATH 0 0AߋBBJ=>J+$w䤝X$ԝ j6Yp.iՙ~m\|3en3`lzQ aw5h@ .M ePfIENDB`grub-2.14~git20250718.0e36779/themes/starfield/src/0000755000175000017500000000000015036452574016122 500000000000000grub-2.14~git20250718.0e36779/themes/starfield/src/slider_s.xcf0000644000175000017500000000153715000202015020324 00000000000000gimp xcf fileBBG gimp-commentCreated with GIMPgimp-image-grid(style solid) (fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000)) (bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000)) (xspacing 10.000000) (yspacing 10.000000) (spacing-unit inches) (xoffset 0.000000) (yoffset 0.000000) (offset-unit inches)  Background     ]q            LLLNLL LNL LLgrub-2.14~git20250718.0e36779/themes/starfield/src/slider_n.xcf0000644000175000017500000000151515000202015020313 00000000000000gimp xcf fileBBG gimp-commentCreated with GIMPgimp-image-grid(style solid) (fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000)) (bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000)) (xspacing 10.000000) (yspacing 10.000000) (spacing-unit inches) (xoffset 0.000000) (yoffset 0.000000) (offset-unit inches)  Background     ]q          W iLLgrub-2.14~git20250718.0e36779/themes/starfield/src/bootmenu/0000755000175000017500000000000015036452574017752 500000000000000grub-2.14~git20250718.0e36779/themes/starfield/src/bootmenu/side.xcf0000644000175000017500000000122315000202015021264 00000000000000gimp xcf fileBBG gimp-commentCreated with GIMPgimp-image-grid(style solid) (fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000)) (bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000)) (xspacing 10.000000) (yspacing 10.000000) (spacing-unit inches) (xoffset 0.000000) (yoffset 0.000000) (offset-unit inches)  Background     ]q   3 grub-2.14~git20250718.0e36779/themes/starfield/src/bootmenu/corner.xcf0000644000175000017500000000141715000202015021635 00000000000000gimp xcf fileBBG gimp-commentCreated with GIMPgimp-image-grid(style solid) (fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000)) (bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000)) (xspacing 10.000000) (yspacing 10.000000) (spacing-unit inches) (xoffset 0.000000) (yoffset 0.000000) (offset-unit inches)  Background     ]q3 3 3 3 3 3 3 3 3B3 3B3 3B3 3 3 3 3 3 3 3  <grub-2.14~git20250718.0e36779/themes/starfield/src/bootmenu/center.xcf0000644000175000017500000000121115000202015021615 00000000000000gimp xcf fileBBG gimp-commentCreated with GIMPgimp-image-grid(style solid) (fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000)) (bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000)) (xspacing 10.000000) (yspacing 10.000000) (spacing-unit inches) (xoffset 0.000000) (yoffset 0.000000) (offset-unit inches)  Background     ]q2grub-2.14~git20250718.0e36779/themes/starfield/src/slider_c.xcf0000644000175000017500000000126515000202015020302 00000000000000gimp xcf fileBBG gimp-commentCreated with GIMPgimp-image-grid(style solid) (fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000)) (bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000)) (xspacing 10.000000) (yspacing 10.000000) (spacing-unit inches) (xoffset 0.000000) (yoffset 0.000000) (offset-unit inches)  Background     ]qLgrub-2.14~git20250718.0e36779/themes/starfield/src/blob_nw.xcf0000644000175000017500000000515215000202015020137 00000000000000gimp xcf fileBBG gimp-commentCreated with GIMPgimp-image-grid(style solid) (fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000)) (bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000)) (xspacing 10.000000) (yspacing 10.000000) (spacing-unit inches) (xoffset 0.000000) (yoffset 0.000000) (offset-unit inches)  Drop Shadow     bv8а w͝ڲ΍V8u{N:qٜ:#OWr ݕr _ӯq#78а w͝ڲ΍V8u{N:qٜ:#OWr ݕr _ӯq#78а w͝ڲ΍V8u{N:qٜ:#OWr ݕr _ӯq#7 /JQN; :ܫ\ M 4r A u% /2-Ki! lԌCjȌO  ?ynD  &6??5%Background copy      p  qqqR$Ƃ$     $$$$     $Ƃ$Qgrub-2.14~git20250718.0e36779/themes/starfield/src/terminalbox/0000755000175000017500000000000015036452574020446 500000000000000grub-2.14~git20250718.0e36779/themes/starfield/src/terminalbox/side.xcf0000644000175000017500000000147015000202015021764 00000000000000gimp xcf fileBBG gimp-commentCreated with GIMPgimp-image-grid(style solid) (fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000)) (bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000)) (xspacing 10.000000) (yspacing 10.000000) (spacing-unit inches) (xoffset 0.000000) (yoffset 0.000000) (offset-unit inches)  Background     au&Selection Mask $4grub-2.14~git20250718.0e36779/themes/starfield/src/terminalbox/corner.xcf0000644000175000017500000000132515000202015022327 00000000000000gimp xcf fileBBG gimp-commentCreated with GIMPgimp-image-grid(style solid) (fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000)) (bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000)) (xspacing 10.000000) (yspacing 10.000000) (spacing-unit inches) (xoffset 0.000000) (yoffset 0.000000) (offset-unit inches)  Background     ]q&&&&&grub-2.14~git20250718.0e36779/themes/starfield/src/terminalbox/center.xcf0000644000175000017500000000121115000202015022311 00000000000000gimp xcf fileBBG gimp-commentCreated with GIMPgimp-image-grid(style solid) (fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000)) (bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000)) (xspacing 10.000000) (yspacing 10.000000) (spacing-unit inches) (xoffset 0.000000) (yoffset 0.000000) (offset-unit inches)  Background     ]qgrub-2.14~git20250718.0e36779/themes/starfield/boot_menu_w.png0000644000175000017500000000014015000202015020237 00000000000000PNG  IHDRɰsBIT|dIDATcd ?iB|G2 YIENDB`grub-2.14~git20250718.0e36779/themes/starfield/slider_c.png0000644000175000017500000000030515000202015017511 00000000000000PNG  IHDRޒ%sRGBbKGD pHYs  tIME  .ktEXtCommentCreated with GIMPW IDATc?2p]/3(@xIENDB`grub-2.14~git20250718.0e36779/themes/starfield/blob_w.png0000644000175000017500000000150415000202015017173 00000000000000PNG  IHDRcsRGBbKGD pHYs  tIME  ;(%tEXtCommentCreated with GIMPWIDATHKTQǿskl~(S *"hE[ F qNP7ԅ.YadЙgtt޻?S.|{_ZY4;;꺯Dĵ[*~l 99!"k펪~jvhXĽd2"qW"r=f0+" I(Htzczz288LDEBE$ny^m}}}P(6B!^<+"oC"`f03c(˫\|> tvvdpDfq)U [k9S2sJDqSg UƘb~_ !"bfϒT f}|cLSD"q̜GGG~\auv.\{D} WZ,VVVv4ZTT_jR9\XXPmߌEoA૪&A`+J}bbk6dˏq||ӳL&(Qkoj#W&''FGGgr5i}ݝ ]], [[int result = 0; struct stat st; if (!stat ("conftest.tmp/", &st)) result |= 1; #if HAVE_LSTAT if (!stat ("conftest.lnk/", &st)) result |= 2; #endif return result; ]])], [gl_cv_func_stat_file_slash=yes], [gl_cv_func_stat_file_slash=no], [case "$host_os" in # Guess yes on Linux systems. linux-* | linux) gl_cv_func_stat_file_slash="guessing yes" ;; # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_stat_file_slash="guessing yes" ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_stat_file_slash="$gl_cross_guess_normal" ;; esac ]) rm -f conftest.tmp conftest.lnk]) case $gl_cv_func_stat_file_slash in *no) REPLACE_STAT=1 AC_DEFINE([REPLACE_FUNC_STAT_FILE], [1], [Define to 1 if stat needs help when passed a file name with a trailing slash]);; esac case $host_os in dnl Solaris stat can return a negative tv_nsec. solaris*) REPLACE_FSTAT=1 ;; esac ;; esac ]) # Prerequisites of lib/stat.c and lib/stat-w32.c. AC_DEFUN([gl_PREREQ_STAT], [ AC_REQUIRE([gl_SYS_STAT_H]) AC_REQUIRE([gl_PREREQ_STAT_W32]) : ]) # Prerequisites of lib/stat-w32.c. AC_DEFUN([gl_PREREQ_STAT_W32], [ AC_REQUIRE([AC_CANONICAL_HOST]) case "$host_os" in mingw*) AC_CHECK_HEADERS([sdkddkver.h]) ;; esac ]) grub-2.14~git20250718.0e36779/m4/open-cloexec.m40000644000175000017500000000132315036447602015147 00000000000000# Test whether O_CLOEXEC is defined. dnl Copyright 2017-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_PREPROC_O_CLOEXEC], [ AC_CACHE_CHECK([for O_CLOEXEC], [gl_cv_macro_O_CLOEXEC], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM([[#include #ifndef O_CLOEXEC choke me; #endif ]], [[return O_CLOEXEC;]])], [gl_cv_macro_O_CLOEXEC=yes], [gl_cv_macro_O_CLOEXEC=no])]) ]) grub-2.14~git20250718.0e36779/m4/stdlib_h.m40000644000175000017500000002332215036447602014361 00000000000000# stdlib_h.m4 serial 66 dnl Copyright (C) 2007-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN_ONCE([gl_STDLIB_H], [ AC_REQUIRE([gl_STDLIB_H_DEFAULTS]) gl_NEXT_HEADERS([stdlib.h]) dnl Check for declarations of anything we want to poison if the dnl corresponding gnulib module is not in use, and which is not dnl guaranteed by C89. gl_WARN_ON_USE_PREPARE([[#include #if HAVE_SYS_LOADAVG_H /* OpenIndiana has a bug: must be included before . */ # include # include #endif #if HAVE_RANDOM_H # include #endif ]], [_Exit aligned_alloc atoll canonicalize_file_name free getloadavg getsubopt grantpt initstate initstate_r mbtowc mkdtemp mkostemp mkostemps mkstemp mkstemps posix_memalign posix_openpt ptsname ptsname_r qsort_r random random_r reallocarray realpath rpmatch secure_getenv setenv setstate setstate_r srandom srandom_r strtod strtol strtold strtoll strtoul strtoull unlockpt unsetenv]) AC_REQUIRE([AC_C_RESTRICT]) AC_CHECK_DECLS_ONCE([ecvt]) if test $ac_cv_have_decl_ecvt = no; then HAVE_DECL_ECVT=0 fi AC_CHECK_DECLS_ONCE([fcvt]) if test $ac_cv_have_decl_fcvt = no; then HAVE_DECL_FCVT=0 fi AC_CHECK_DECLS_ONCE([gcvt]) if test $ac_cv_have_decl_gcvt = no; then HAVE_DECL_GCVT=0 fi ]) # gl_STDLIB_MODULE_INDICATOR([modulename]) # sets the shell variable that indicates the presence of the given module # to a C preprocessor expression that will evaluate to 1. # This macro invocation must not occur in macros that are AC_REQUIREd. AC_DEFUN([gl_STDLIB_MODULE_INDICATOR], [ dnl Ensure to expand the default settings once only. gl_STDLIB_H_REQUIRE_DEFAULTS gl_MODULE_INDICATOR_SET_VARIABLE([$1]) dnl Define it also as a C macro, for the benefit of the unit tests. gl_MODULE_INDICATOR_FOR_TESTS([$1]) ]) # Initializes the default values for AC_SUBSTed shell variables. # This macro must not be AC_REQUIREd. It must only be invoked, and only # outside of macros or in macros that are not AC_REQUIREd. AC_DEFUN([gl_STDLIB_H_REQUIRE_DEFAULTS], [ m4_defun(GL_MODULE_INDICATOR_PREFIX[_STDLIB_H_MODULE_INDICATOR_DEFAULTS], [ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB__EXIT]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ALIGNED_ALLOC]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ATOLL]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_CALLOC_GNU]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_CALLOC_POSIX]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_CANONICALIZE_FILE_NAME]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FREE_POSIX]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GETLOADAVG]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GETSUBOPT]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GRANTPT]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MALLOC_GNU]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MALLOC_POSIX]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MBTOWC]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MKDTEMP]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MKOSTEMP]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MKOSTEMPS]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MKSTEMP]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MKSTEMPS]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_POSIX_MEMALIGN]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_POSIX_OPENPT]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_PTSNAME]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_PTSNAME_R]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_PUTENV]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_QSORT_R]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_RANDOM]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_RANDOM_R]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_REALLOCARRAY]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_REALLOC_GNU]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_REALLOC_POSIX]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_REALPATH]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_RPMATCH]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SECURE_GETENV]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SETENV]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRTOD]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRTOL]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRTOLD]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRTOLL]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRTOUL]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRTOULL]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SYSTEM_POSIX]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_UNLOCKPT]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_UNSETENV]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCTOMB]) dnl Support Microsoft deprecated alias function names by default. gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_ECVT], [1]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_FCVT], [1]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_GCVT], [1]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_MKTEMP], [1]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_PUTENV], [1]) ]) m4_require(GL_MODULE_INDICATOR_PREFIX[_STDLIB_H_MODULE_INDICATOR_DEFAULTS]) AC_REQUIRE([gl_STDLIB_H_DEFAULTS]) ]) AC_DEFUN([gl_STDLIB_H_DEFAULTS], [ dnl Assume proper GNU behavior unless another module says otherwise. HAVE__EXIT=1; AC_SUBST([HAVE__EXIT]) HAVE_ALIGNED_ALLOC=1; AC_SUBST([HAVE_ALIGNED_ALLOC]) HAVE_ATOLL=1; AC_SUBST([HAVE_ATOLL]) HAVE_CANONICALIZE_FILE_NAME=1; AC_SUBST([HAVE_CANONICALIZE_FILE_NAME]) HAVE_DECL_ECVT=1; AC_SUBST([HAVE_DECL_ECVT]) HAVE_DECL_FCVT=1; AC_SUBST([HAVE_DECL_FCVT]) HAVE_DECL_GCVT=1; AC_SUBST([HAVE_DECL_GCVT]) HAVE_DECL_GETLOADAVG=1; AC_SUBST([HAVE_DECL_GETLOADAVG]) HAVE_GETSUBOPT=1; AC_SUBST([HAVE_GETSUBOPT]) HAVE_GRANTPT=1; AC_SUBST([HAVE_GRANTPT]) HAVE_INITSTATE=1; AC_SUBST([HAVE_INITSTATE]) HAVE_DECL_INITSTATE=1; AC_SUBST([HAVE_DECL_INITSTATE]) HAVE_MBTOWC=1; AC_SUBST([HAVE_MBTOWC]) HAVE_MKDTEMP=1; AC_SUBST([HAVE_MKDTEMP]) HAVE_MKOSTEMP=1; AC_SUBST([HAVE_MKOSTEMP]) HAVE_MKOSTEMPS=1; AC_SUBST([HAVE_MKOSTEMPS]) HAVE_MKSTEMP=1; AC_SUBST([HAVE_MKSTEMP]) HAVE_MKSTEMPS=1; AC_SUBST([HAVE_MKSTEMPS]) HAVE_POSIX_MEMALIGN=1; AC_SUBST([HAVE_POSIX_MEMALIGN]) HAVE_POSIX_OPENPT=1; AC_SUBST([HAVE_POSIX_OPENPT]) HAVE_PTSNAME=1; AC_SUBST([HAVE_PTSNAME]) HAVE_PTSNAME_R=1; AC_SUBST([HAVE_PTSNAME_R]) HAVE_QSORT_R=1; AC_SUBST([HAVE_QSORT_R]) HAVE_RANDOM=1; AC_SUBST([HAVE_RANDOM]) HAVE_RANDOM_H=1; AC_SUBST([HAVE_RANDOM_H]) HAVE_RANDOM_R=1; AC_SUBST([HAVE_RANDOM_R]) HAVE_REALLOCARRAY=1; AC_SUBST([HAVE_REALLOCARRAY]) HAVE_REALPATH=1; AC_SUBST([HAVE_REALPATH]) HAVE_RPMATCH=1; AC_SUBST([HAVE_RPMATCH]) HAVE_SECURE_GETENV=1; AC_SUBST([HAVE_SECURE_GETENV]) HAVE_SETENV=1; AC_SUBST([HAVE_SETENV]) HAVE_DECL_SETENV=1; AC_SUBST([HAVE_DECL_SETENV]) HAVE_SETSTATE=1; AC_SUBST([HAVE_SETSTATE]) HAVE_DECL_SETSTATE=1; AC_SUBST([HAVE_DECL_SETSTATE]) HAVE_STRTOD=1; AC_SUBST([HAVE_STRTOD]) HAVE_STRTOL=1; AC_SUBST([HAVE_STRTOL]) HAVE_STRTOLD=1; AC_SUBST([HAVE_STRTOLD]) HAVE_STRTOLL=1; AC_SUBST([HAVE_STRTOLL]) HAVE_STRTOUL=1; AC_SUBST([HAVE_STRTOUL]) HAVE_STRTOULL=1; AC_SUBST([HAVE_STRTOULL]) HAVE_STRUCT_RANDOM_DATA=1; AC_SUBST([HAVE_STRUCT_RANDOM_DATA]) HAVE_SYS_LOADAVG_H=0; AC_SUBST([HAVE_SYS_LOADAVG_H]) HAVE_UNLOCKPT=1; AC_SUBST([HAVE_UNLOCKPT]) HAVE_DECL_UNSETENV=1; AC_SUBST([HAVE_DECL_UNSETENV]) REPLACE_ALIGNED_ALLOC=0; AC_SUBST([REPLACE_ALIGNED_ALLOC]) REPLACE_CALLOC_FOR_CALLOC_GNU=0; AC_SUBST([REPLACE_CALLOC_FOR_CALLOC_GNU]) REPLACE_CALLOC_FOR_CALLOC_POSIX=0; AC_SUBST([REPLACE_CALLOC_FOR_CALLOC_POSIX]) REPLACE_CANONICALIZE_FILE_NAME=0; AC_SUBST([REPLACE_CANONICALIZE_FILE_NAME]) REPLACE_FREE=0; AC_SUBST([REPLACE_FREE]) REPLACE_INITSTATE=0; AC_SUBST([REPLACE_INITSTATE]) REPLACE_MALLOC_FOR_MALLOC_GNU=0; AC_SUBST([REPLACE_MALLOC_FOR_MALLOC_GNU]) REPLACE_MALLOC_FOR_MALLOC_POSIX=0; AC_SUBST([REPLACE_MALLOC_FOR_MALLOC_POSIX]) REPLACE_MBTOWC=0; AC_SUBST([REPLACE_MBTOWC]) REPLACE_MKSTEMP=0; AC_SUBST([REPLACE_MKSTEMP]) REPLACE_POSIX_MEMALIGN=0; AC_SUBST([REPLACE_POSIX_MEMALIGN]) REPLACE_PTSNAME=0; AC_SUBST([REPLACE_PTSNAME]) REPLACE_PTSNAME_R=0; AC_SUBST([REPLACE_PTSNAME_R]) REPLACE_PUTENV=0; AC_SUBST([REPLACE_PUTENV]) REPLACE_QSORT_R=0; AC_SUBST([REPLACE_QSORT_R]) REPLACE_RANDOM=0; AC_SUBST([REPLACE_RANDOM]) REPLACE_RANDOM_R=0; AC_SUBST([REPLACE_RANDOM_R]) REPLACE_REALLOC_FOR_REALLOC_GNU=0; AC_SUBST([REPLACE_REALLOC_FOR_REALLOC_GNU]) REPLACE_REALLOC_FOR_REALLOC_POSIX=0; AC_SUBST([REPLACE_REALLOC_FOR_REALLOC_POSIX]) REPLACE_REALLOCARRAY=0; AC_SUBST([REPLACE_REALLOCARRAY]) REPLACE_REALPATH=0; AC_SUBST([REPLACE_REALPATH]) REPLACE_SETENV=0; AC_SUBST([REPLACE_SETENV]) REPLACE_SETSTATE=0; AC_SUBST([REPLACE_SETSTATE]) REPLACE_STRTOD=0; AC_SUBST([REPLACE_STRTOD]) REPLACE_STRTOL=0; AC_SUBST([REPLACE_STRTOL]) REPLACE_STRTOLD=0; AC_SUBST([REPLACE_STRTOLD]) REPLACE_STRTOLL=0; AC_SUBST([REPLACE_STRTOLL]) REPLACE_STRTOUL=0; AC_SUBST([REPLACE_STRTOUL]) REPLACE_STRTOULL=0; AC_SUBST([REPLACE_STRTOULL]) REPLACE_UNSETENV=0; AC_SUBST([REPLACE_UNSETENV]) REPLACE_WCTOMB=0; AC_SUBST([REPLACE_WCTOMB]) ]) grub-2.14~git20250718.0e36779/m4/vsnprintf.m40000644000175000017500000000362115036447602014622 00000000000000# vsnprintf.m4 serial 7 dnl Copyright (C) 2002-2004, 2007-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl Libintl 0.17 will replace vsnprintf only if it does not support %1$s, dnl but defers to any gnulib vsnprintf replacements. Therefore, gnulib dnl must guarantee that the decision for replacing vsnprintf is a superset dnl of the reasons checked by libintl. AC_DEFUN([gl_FUNC_VSNPRINTF], [ AC_REQUIRE([gl_STDIO_H_DEFAULTS]) gl_cv_func_vsnprintf_usable=no AC_CHECK_FUNCS([vsnprintf]) if test $ac_cv_func_vsnprintf = yes; then gl_SNPRINTF_SIZE1 case "$gl_cv_func_snprintf_size1" in *yes) gl_SNPRINTF_RETVAL_C99 case "$gl_cv_func_snprintf_retval_c99" in *yes) gl_PRINTF_POSITIONS case "$gl_cv_func_printf_positions" in *yes) gl_cv_func_vsnprintf_usable=yes ;; esac ;; esac ;; esac fi if test $gl_cv_func_vsnprintf_usable = no; then gl_REPLACE_VSNPRINTF fi AC_CHECK_DECLS_ONCE([vsnprintf]) if test $ac_cv_have_decl_vsnprintf = no; then HAVE_DECL_VSNPRINTF=0 fi ]) AC_DEFUN([gl_REPLACE_VSNPRINTF], [ AC_REQUIRE([gl_STDIO_H_DEFAULTS]) AC_LIBOBJ([vsnprintf]) if test $ac_cv_func_vsnprintf = yes; then REPLACE_VSNPRINTF=1 else AC_CHECK_DECLS_ONCE([vsnprintf]) if test $ac_cv_have_decl_vsnprintf = yes; then dnl If the function is declared but does not appear to exist, it may be dnl defined as an inline function. In order to avoid a conflict, we have dnl to define rpl_vsnprintf, not vsnprintf. REPLACE_VSNPRINTF=1 fi fi gl_PREREQ_VSNPRINTF ]) # Prerequisites of lib/vsnprintf.c. AC_DEFUN([gl_PREREQ_VSNPRINTF], [:]) grub-2.14~git20250718.0e36779/m4/intlmacosx.m40000644000175000017500000000475315036447570014765 00000000000000# intlmacosx.m4 serial 5 (gettext-0.18.2) dnl Copyright (C) 2004-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Checks for special options needed on Mac OS X. dnl Defines INTL_MACOSX_LIBS. AC_DEFUN([gt_INTL_MACOSX], [ dnl Check for API introduced in Mac OS X 10.2. AC_CACHE_CHECK([for CFPreferencesCopyAppValue], [gt_cv_func_CFPreferencesCopyAppValue], [gt_save_LIBS="$LIBS" LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[#include ]], [[CFPreferencesCopyAppValue(NULL, NULL)]])], [gt_cv_func_CFPreferencesCopyAppValue=yes], [gt_cv_func_CFPreferencesCopyAppValue=no]) LIBS="$gt_save_LIBS"]) if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then AC_DEFINE([HAVE_CFPREFERENCESCOPYAPPVALUE], [1], [Define to 1 if you have the Mac OS X function CFPreferencesCopyAppValue in the CoreFoundation framework.]) fi dnl Check for API introduced in Mac OS X 10.3. AC_CACHE_CHECK([for CFLocaleCopyCurrent], [gt_cv_func_CFLocaleCopyCurrent], [gt_save_LIBS="$LIBS" LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[#include ]], [[CFLocaleCopyCurrent();]])], [gt_cv_func_CFLocaleCopyCurrent=yes], [gt_cv_func_CFLocaleCopyCurrent=no]) LIBS="$gt_save_LIBS"]) if test $gt_cv_func_CFLocaleCopyCurrent = yes; then AC_DEFINE([HAVE_CFLOCALECOPYCURRENT], [1], [Define to 1 if you have the Mac OS X function CFLocaleCopyCurrent in the CoreFoundation framework.]) fi INTL_MACOSX_LIBS= if test $gt_cv_func_CFPreferencesCopyAppValue = yes || test $gt_cv_func_CFLocaleCopyCurrent = yes; then INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation" fi AC_SUBST([INTL_MACOSX_LIBS]) ]) grub-2.14~git20250718.0e36779/m4/nocrash.m40000644000175000017500000001055515036447602014232 00000000000000# nocrash.m4 serial 5 dnl Copyright (C) 2005, 2009-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl Based on libsigsegv, from Bruno Haible and Paolo Bonzini. AC_PREREQ([2.13]) dnl Expands to some code for use in .c programs that will cause the configure dnl test to exit instead of crashing. This is useful to avoid triggering dnl action from a background debugger and to avoid core dumps. dnl Usage: ... dnl ]GL_NOCRASH[ dnl ... dnl int main() { nocrash_init(); ... } AC_DEFUN([GL_NOCRASH],[[ #include #if defined __MACH__ && defined __APPLE__ /* Avoid a crash on Mac OS X. */ #include #include #include #include #include #include /* The exception port on which our thread listens. */ static mach_port_t our_exception_port; /* The main function of the thread listening for exceptions of type EXC_BAD_ACCESS. */ static void * mach_exception_thread (void *arg) { /* Buffer for a message to be received. */ struct { mach_msg_header_t head; mach_msg_body_t msgh_body; char data[1024]; } msg; mach_msg_return_t retval; /* Wait for a message on the exception port. */ retval = mach_msg (&msg.head, MACH_RCV_MSG | MACH_RCV_LARGE, 0, sizeof (msg), our_exception_port, MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL); if (retval != MACH_MSG_SUCCESS) abort (); exit (1); } static void nocrash_init (void) { mach_port_t self = mach_task_self (); /* Allocate a port on which the thread shall listen for exceptions. */ if (mach_port_allocate (self, MACH_PORT_RIGHT_RECEIVE, &our_exception_port) == KERN_SUCCESS) { /* See https://web.mit.edu/darwin/src/modules/xnu/osfmk/man/mach_port_insert_right.html. */ if (mach_port_insert_right (self, our_exception_port, our_exception_port, MACH_MSG_TYPE_MAKE_SEND) == KERN_SUCCESS) { /* The exceptions we want to catch. Only EXC_BAD_ACCESS is interesting for us. */ exception_mask_t mask = EXC_MASK_BAD_ACCESS; /* Create the thread listening on the exception port. */ pthread_attr_t attr; pthread_t thread; if (pthread_attr_init (&attr) == 0 && pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED) == 0 && pthread_create (&thread, &attr, mach_exception_thread, NULL) == 0) { pthread_attr_destroy (&attr); /* Replace the exception port info for these exceptions with our own. Note that we replace the exception port for the entire task, not only for a particular thread. This has the effect that when our exception port gets the message, the thread specific exception port has already been asked, and we don't need to bother about it. See https://web.mit.edu/darwin/src/modules/xnu/osfmk/man/task_set_exception_ports.html. */ task_set_exception_ports (self, mask, our_exception_port, EXCEPTION_DEFAULT, MACHINE_THREAD_STATE); } } } } #elif defined _WIN32 && ! defined __CYGWIN__ /* Avoid a crash on native Windows. */ #define WIN32_LEAN_AND_MEAN #include #include static LONG WINAPI exception_filter (EXCEPTION_POINTERS *ExceptionInfo) { switch (ExceptionInfo->ExceptionRecord->ExceptionCode) { case EXCEPTION_ACCESS_VIOLATION: case EXCEPTION_IN_PAGE_ERROR: case EXCEPTION_STACK_OVERFLOW: case EXCEPTION_GUARD_PAGE: case EXCEPTION_PRIV_INSTRUCTION: case EXCEPTION_ILLEGAL_INSTRUCTION: case EXCEPTION_DATATYPE_MISALIGNMENT: case EXCEPTION_ARRAY_BOUNDS_EXCEEDED: case EXCEPTION_NONCONTINUABLE_EXCEPTION: exit (1); } return EXCEPTION_CONTINUE_SEARCH; } static void nocrash_init (void) { SetUnhandledExceptionFilter ((LPTOP_LEVEL_EXCEPTION_FILTER) exception_filter); } #else /* Avoid a crash on POSIX systems. */ #include #include /* A POSIX signal handler. */ static void exception_handler (int sig) { _exit (1); } static void nocrash_init (void) { #ifdef SIGSEGV signal (SIGSEGV, exception_handler); #endif #ifdef SIGBUS signal (SIGBUS, exception_handler); #endif } #endif ]]) grub-2.14~git20250718.0e36779/m4/warn-on-use.m40000644000175000017500000000423015036447602014741 00000000000000# warn-on-use.m4 serial 9 dnl Copyright (C) 2010-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. # gl_WARN_ON_USE_PREPARE(INCLUDES, NAMES) # --------------------------------------- # If the module 'posixcheck' is in use: # # For each whitespace-separated element in the list of NAMES, define # HAVE_RAW_DECL_name if the function has a declaration among INCLUDES # even after being undefined as a macro. # # See warn-on-use.h for some hints on how to poison function names, as # well as ideas on poisoning global variables and macros. NAMES may # include global variables, but remember that only functions work with # _GL_WARN_ON_USE. Typically, INCLUDES only needs to list a single # header, but if the replacement header pulls in other headers because # some systems declare functions in the wrong header, then INCLUDES # should do likewise. # # It is generally safe to assume declarations for functions declared # in the intersection of C89 and C11 (such as printf) without # needing gl_WARN_ON_USE_PREPARE. AC_DEFUN([gl_WARN_ON_USE_PREPARE], [ m4_ifdef([gl_POSIXCHECK], [m4_foreach_w([gl_decl], [$2], [AH_TEMPLATE([HAVE_RAW_DECL_]AS_TR_CPP(m4_defn([gl_decl])), [Define to 1 if ]m4_defn([gl_decl])[ is declared even after undefining macros.])])dnl for gl_func in m4_flatten([$2]); do AS_VAR_PUSHDEF([gl_Symbol], [gl_cv_have_raw_decl_$gl_func])dnl AC_CACHE_CHECK([whether $gl_func is declared without a macro], [gl_Symbol], [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([$1], [[#undef $gl_func (void) $gl_func;]])], [AS_VAR_SET([gl_Symbol], [yes])], [AS_VAR_SET([gl_Symbol], [no])])]) AS_VAR_IF([gl_Symbol], [yes], [AC_DEFINE_UNQUOTED(AS_TR_CPP([HAVE_RAW_DECL_$gl_func]), [1]) dnl shortcut - if the raw declaration exists, then set a cache dnl variable to allow skipping any later AC_CHECK_DECL efforts eval ac_cv_have_decl_$gl_func=yes]) AS_VAR_POPDEF([gl_Symbol])dnl done ]) ]) grub-2.14~git20250718.0e36779/m4/intmax_t.m40000644000175000017500000000354415036447602014420 00000000000000# intmax_t.m4 serial 9 dnl Copyright (C) 1997-2004, 2006-2007, 2009-2022 Free Software Foundation, dnl Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Paul Eggert. AC_PREREQ([2.53]) # Define intmax_t to 'long' or 'long long' # if it is not already defined in or . AC_DEFUN([gl_AC_TYPE_INTMAX_T], [ dnl For simplicity, we assume that a header file defines 'intmax_t' if and dnl only if it defines 'uintmax_t'. AC_REQUIRE([gl_AC_HEADER_INTTYPES_H]) AC_REQUIRE([gl_AC_HEADER_STDINT_H]) if test $gl_cv_header_inttypes_h = no && test $gl_cv_header_stdint_h = no; then AC_DEFINE_UNQUOTED([intmax_t], [long long], [Define to long or long long if and don't define.]) else AC_DEFINE([HAVE_INTMAX_T], [1], [Define if you have the 'intmax_t' type in or .]) fi ]) dnl An alternative would be to explicitly test for 'intmax_t'. AC_DEFUN([gt_AC_TYPE_INTMAX_T], [ AC_REQUIRE([gl_AC_HEADER_INTTYPES_H]) AC_REQUIRE([gl_AC_HEADER_STDINT_H]) AC_CACHE_CHECK([for intmax_t], [gt_cv_c_intmax_t], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[ #include #include #if HAVE_STDINT_H_WITH_UINTMAX #include #endif #if HAVE_INTTYPES_H_WITH_UINTMAX #include #endif ]], [[intmax_t x = -1; return !x;]])], [gt_cv_c_intmax_t=yes], [gt_cv_c_intmax_t=no])]) if test $gt_cv_c_intmax_t = yes; then AC_DEFINE([HAVE_INTMAX_T], [1], [Define if you have the 'intmax_t' type in or .]) else AC_DEFINE_UNQUOTED([intmax_t], [long long], [Define to long or long long if and don't define.]) fi ]) grub-2.14~git20250718.0e36779/m4/lock.m40000644000175000017500000000303715036447602013522 00000000000000# lock.m4 serial 14 dnl Copyright (C) 2005-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. AC_DEFUN([gl_LOCK], [ AC_REQUIRE([gl_THREADLIB]) if test "$gl_threads_api" = posix; then # OSF/1 4.0 and Mac OS X 10.1 lack the pthread_rwlock_t type and the # pthread_rwlock_* functions. has_rwlock=false AC_CHECK_TYPE([pthread_rwlock_t], [has_rwlock=true AC_DEFINE([HAVE_PTHREAD_RWLOCK], [1], [Define if the POSIX multithreading library has read/write locks.])], [], [#include ]) if $has_rwlock; then gl_PTHREAD_RWLOCK_RDLOCK_PREFER_WRITER fi # glibc defines PTHREAD_MUTEX_RECURSIVE as enum, not as a macro. AC_COMPILE_IFELSE([ AC_LANG_PROGRAM( [[#include ]], [[ #if __FreeBSD__ == 4 error "No, in FreeBSD 4.0 recursive mutexes actually don't work." #elif (defined __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ \ && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1070) error "No, in Mac OS X < 10.7 recursive mutexes actually don't work." #else int x = (int)PTHREAD_MUTEX_RECURSIVE; return !x; #endif ]])], [AC_DEFINE([HAVE_PTHREAD_MUTEX_RECURSIVE], [1], [Define if the defines PTHREAD_MUTEX_RECURSIVE.])]) fi gl_PREREQ_LOCK ]) # Prerequisites of lib/glthread/lock.c. AC_DEFUN([gl_PREREQ_LOCK], [:]) grub-2.14~git20250718.0e36779/m4/mbswidth.m40000644000175000017500000000224715036447602014415 00000000000000# mbswidth.m4 serial 19 dnl Copyright (C) 2000-2002, 2004, 2006-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl autoconf tests required for use of mbswidth.c dnl From Bruno Haible. AC_DEFUN([gl_MBSWIDTH], [ AC_CHECK_HEADERS_ONCE([wchar.h]) AC_CHECK_FUNCS_ONCE([isascii mbsinit]) dnl UnixWare 7.1.1 has a declaration of a function mbswidth() dnl that clashes with ours. AC_CACHE_CHECK([whether mbswidth is declared in ], [ac_cv_have_decl_mbswidth], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#include ]], [[char *p = (char *) mbswidth; return !p; ]])], [ac_cv_have_decl_mbswidth=yes], [ac_cv_have_decl_mbswidth=no])]) if test $ac_cv_have_decl_mbswidth = yes; then ac_val=1 else ac_val=0 fi AC_DEFINE_UNQUOTED([HAVE_DECL_MBSWIDTH_IN_WCHAR_H], [$ac_val], [Define to 1 if you have a declaration of mbswidth() in , and to 0 otherwise.]) AC_TYPE_MBSTATE_T ]) grub-2.14~git20250718.0e36779/m4/glibc2.m40000644000175000017500000000147615036447570013745 00000000000000# glibc2.m4 serial 3 dnl Copyright (C) 2000-2002, 2004, 2008, 2010-2013 Free Software Foundation, dnl Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. # Test for the GNU C Library, version 2.0 or newer. # From Bruno Haible. AC_DEFUN([gt_GLIBC2], [ AC_CACHE_CHECK([whether we are using the GNU C Library 2 or newer], [ac_cv_gnu_library_2], [AC_EGREP_CPP([Lucky GNU user], [ #include #ifdef __GNU_LIBRARY__ #if (__GLIBC__ >= 2) && !defined __UCLIBC__ Lucky GNU user #endif #endif ], [ac_cv_gnu_library_2=yes], [ac_cv_gnu_library_2=no]) ] ) AC_SUBST([GLIBC2]) GLIBC2="$ac_cv_gnu_library_2" ] ) grub-2.14~git20250718.0e36779/m4/mode_t.m40000644000175000017500000000234215036447602014037 00000000000000# mode_t.m4 serial 2 dnl Copyright (C) 2009-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. # For using mode_t, it's sufficient to use AC_TYPE_MODE_T and # include . # Define PROMOTED_MODE_T to the type that is the result of "default argument # promotion" (ISO C 6.5.2.2.(6)) of the type mode_t. AC_DEFUN([gl_PROMOTED_TYPE_MODE_T], [ AC_REQUIRE([AC_TYPE_MODE_T]) AC_CACHE_CHECK([for promoted mode_t type], [gl_cv_promoted_mode_t], [ dnl Assume mode_t promotes to 'int' if and only if it is smaller than 'int', dnl and to itself otherwise. This assumption is not guaranteed by the ISO C dnl standard, but we don't know of any real-world counterexamples. AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], [[typedef int array[2 * (sizeof (mode_t) < sizeof (int)) - 1];]])], [gl_cv_promoted_mode_t='int'], [gl_cv_promoted_mode_t='mode_t']) ]) AC_DEFINE_UNQUOTED([PROMOTED_MODE_T], [$gl_cv_promoted_mode_t], [Define to the type that is the result of default argument promotions of type mode_t.]) ]) grub-2.14~git20250718.0e36779/m4/gnulib-tool.m40000644000175000017500000000307715036447602015031 00000000000000# gnulib-tool.m4 serial 4 dnl Copyright (C) 2004-2005, 2009-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl The following macros need not be invoked explicitly. dnl Invoking them does nothing except to declare default arguments dnl for "gnulib-tool --import". dnl Usage: gl_LOCAL_DIR([DIR]) AC_DEFUN([gl_LOCAL_DIR], []) dnl Usage: gl_MODULES([module1 module2 ...]) AC_DEFUN([gl_MODULES], []) dnl Usage: gl_AVOID([module1 module2 ...]) AC_DEFUN([gl_AVOID], []) dnl Usage: gl_SOURCE_BASE([DIR]) AC_DEFUN([gl_SOURCE_BASE], []) dnl Usage: gl_M4_BASE([DIR]) AC_DEFUN([gl_M4_BASE], []) dnl Usage: gl_PO_BASE([DIR]) AC_DEFUN([gl_PO_BASE], []) dnl Usage: gl_DOC_BASE([DIR]) AC_DEFUN([gl_DOC_BASE], []) dnl Usage: gl_TESTS_BASE([DIR]) AC_DEFUN([gl_TESTS_BASE], []) dnl Usage: gl_WITH_TESTS AC_DEFUN([gl_WITH_TESTS], []) dnl Usage: gl_LIB([LIBNAME]) AC_DEFUN([gl_LIB], []) dnl Usage: gl_LGPL or gl_LGPL([VERSION]) AC_DEFUN([gl_LGPL], []) dnl Usage: gl_MAKEFILE_NAME([FILENAME]) AC_DEFUN([gl_MAKEFILE_NAME], []) dnl Usage: gl_TESTS_MAKEFILE_NAME([FILENAME]) AC_DEFUN([gl_TESTS_MAKEFILE_NAME], []) dnl Usage: gl_AUTOMAKE_SUBDIR AC_DEFUN([gl_AUTOMAKE_SUBDIR], []) dnl Usage: gl_LIBTOOL AC_DEFUN([gl_LIBTOOL], []) dnl Usage: gl_MACRO_PREFIX([PREFIX]) AC_DEFUN([gl_MACRO_PREFIX], []) dnl Usage: gl_PO_DOMAIN([DOMAIN]) AC_DEFUN([gl_PO_DOMAIN], []) dnl Usage: gl_VC_FILES([BOOLEAN]) AC_DEFUN([gl_VC_FILES], []) grub-2.14~git20250718.0e36779/m4/msvc-nothrow.m40000644000175000017500000000053015036447602015233 00000000000000# msvc-nothrow.m4 serial 1 dnl Copyright (C) 2011-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_MSVC_NOTHROW], [ AC_REQUIRE([gl_MSVC_INVAL]) ]) grub-2.14~git20250718.0e36779/m4/fnmatch.m40000644000175000017500000001317415036447602014215 00000000000000# Check for fnmatch - serial 15. -*- coding: utf-8 -*- # Copyright (C) 2000-2007, 2009-2022 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # Autoconf defines AC_FUNC_FNMATCH, but that is obsolescent. # New applications should use the macros below instead. # Request a POSIX compliant fnmatch function. AC_DEFUN([gl_FUNC_FNMATCH_POSIX], [ m4_divert_text([DEFAULTS], [gl_fnmatch_required=POSIX]) AC_REQUIRE([gl_FNMATCH_H]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles gl_fnmatch_required_lowercase=` echo $gl_fnmatch_required | LC_ALL=C tr '[[A-Z]]' '[[a-z]]' ` AC_CHECK_FUNCS_ONCE([fnmatch]) if test $ac_cv_func_fnmatch = no; then HAVE_FNMATCH=0 else gl_fnmatch_cache_var="gl_cv_func_fnmatch_${gl_fnmatch_required_lowercase}" AC_CACHE_CHECK([for working $gl_fnmatch_required fnmatch], [$gl_fnmatch_cache_var], [dnl Some versions of Solaris, SCO, and the GNU C Library dnl have a broken or incompatible fnmatch. dnl So we run a test program. If we are cross-compiling, take no chance. dnl Thanks to John Oleynick, François Pinard, and Paul Eggert for this dnl test. if test $gl_fnmatch_required = GNU; then gl_fnmatch_gnu_start= gl_fnmatch_gnu_end= else gl_fnmatch_gnu_start='#if 0' gl_fnmatch_gnu_end='#endif' fi AC_RUN_IFELSE( [AC_LANG_PROGRAM( [[#include static int y (char const *pattern, char const *string, int flags) { return fnmatch (pattern, string, flags) == 0; } static int n (char const *pattern, char const *string, int flags) { return fnmatch (pattern, string, flags) == FNM_NOMATCH; } ]], [[char const *Apat = 'A' < '\\\\' ? "[A-\\\\\\\\]" : "[\\\\\\\\-A]"; char const *apat = 'a' < '\\\\' ? "[a-\\\\\\\\]" : "[\\\\\\\\-a]"; static char const A_1[] = { 'A' - 1, 0 }; static char const A01[] = { 'A' + 1, 0 }; static char const a_1[] = { 'a' - 1, 0 }; static char const a01[] = { 'a' + 1, 0 }; static char const bs_1[] = { '\\\\' - 1, 0 }; static char const bs01[] = { '\\\\' + 1, 0 }; int result = 0; if (!n ("a*", "", 0)) return 1; if (!y ("a*", "abc", 0)) return 1; if (!y ("[/b", "[/b", 0)) /*"]]"*/ /* glibc Bugzilla bug 12378 */ return 1; if (!n ("d*/*1", "d/s/1", FNM_PATHNAME)) return 2; if (!y ("a\\\\bc", "abc", 0)) return 3; if (!n ("a\\\\bc", "abc", FNM_NOESCAPE)) return 3; if (!y ("*x", ".x", 0)) return 4; if (!n ("*x", ".x", FNM_PERIOD)) return 4; if (!y (Apat, "\\\\", 0)) return 5; if (!y (Apat, "A", 0)) return 5; if (!y (apat, "\\\\", 0)) return 5; if (!y (apat, "a", 0)) return 5; if (!(n (Apat, A_1, 0) == ('A' < '\\\\'))) return 5; if (!(n (apat, a_1, 0) == ('a' < '\\\\'))) return 5; if (!(y (Apat, A01, 0) == ('A' < '\\\\'))) return 5; if (!(y (apat, a01, 0) == ('a' < '\\\\'))) return 5; if (!(y (Apat, bs_1, 0) == ('A' < '\\\\'))) return 5; if (!(y (apat, bs_1, 0) == ('a' < '\\\\'))) return 5; if (!(n (Apat, bs01, 0) == ('A' < '\\\\'))) return 5; if (!(n (apat, bs01, 0) == ('a' < '\\\\'))) return 5; $gl_fnmatch_gnu_start if (!y ("xxXX", "xXxX", FNM_CASEFOLD)) result |= 8; if (!y ("a++(x|yy)b", "a+xyyyyxb", FNM_EXTMATCH)) result |= 16; if (!n ("d*/*1", "d/s/1", FNM_FILE_NAME)) result |= 32; if (!y ("*", "x", FNM_FILE_NAME | FNM_LEADING_DIR)) result |= 64; if (!y ("x*", "x/y/z", FNM_FILE_NAME | FNM_LEADING_DIR)) result |= 64; if (!y ("*c*", "c/x", FNM_FILE_NAME | FNM_LEADING_DIR)) result |= 64; $gl_fnmatch_gnu_end return result; ]])], [eval "$gl_fnmatch_cache_var=yes"], [eval "$gl_fnmatch_cache_var=no"], [case "$host_os" in # Guess yes on musl systems. *-musl*) eval "$gl_fnmatch_cache_var=\"guessing yes\"" ;; # Guess no otherwise, even on glibc systems. *) eval "$gl_fnmatch_cache_var=\"guessing no\"" ;; esac ]) ]) eval "gl_fnmatch_result=\"\$$gl_fnmatch_cache_var\"" case "$gl_fnmatch_result" in *yes) ;; *) REPLACE_FNMATCH=1 ;; esac fi if test $HAVE_FNMATCH = 0 || test $REPLACE_FNMATCH = 1; then gl_REPLACE_FNMATCH_H fi ]) # Request a POSIX compliant fnmatch function with GNU extensions. AC_DEFUN([gl_FUNC_FNMATCH_GNU], [ m4_divert_text([INIT_PREPARE], [gl_fnmatch_required=GNU]) AC_REQUIRE([gl_FUNC_FNMATCH_POSIX]) ]) AC_DEFUN([gl_PREREQ_FNMATCH], [ dnl Prerequisites of lib/fnmatch.c. AC_REQUIRE([AC_TYPE_MBSTATE_T]) AC_CHECK_FUNCS_ONCE([mbsrtowcs]) ]) grub-2.14~git20250718.0e36779/m4/save-cwd.m40000644000175000017500000000057015036447602014302 00000000000000# serial 10 dnl Copyright (C) 2002-2006, 2009-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl Prerequisites for lib/save-cwd.c. AC_DEFUN([gl_SAVE_CWD], [ AC_CHECK_FUNCS_ONCE([fchdir]) ]) grub-2.14~git20250718.0e36779/m4/gnulib-cache.m40000644000175000017500000000434515036447607015123 00000000000000# Copyright (C) 2002-2022 Free Software Foundation, Inc. # # This file is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This file is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this file. If not, see . # # As a special exception to the GNU General Public License, # this file may be distributed as part of a program that # contains a configuration script generated by Autoconf, under # the same distribution terms as the rest of that program. # # Generated by gnulib-tool. # # This file represents the specification of how gnulib-tool is used. # It acts as a cache: It is written and read by gnulib-tool. # In projects that use version control, this file is meant to be put under # version control, like the configure.ac and various Makefile.am files. # Specification in the form of a command-line invocation: # gnulib-tool --import --local-dir=gl \ # --lib=libgnu \ # --source-base=grub-core/lib/gnulib \ # --m4-base=m4 \ # --doc-base=doc \ # --tests-base=tests \ # --aux-dir=build-aux \ # --no-conditional-dependencies \ # --no-libtool \ # --macro-prefix=gl \ # --no-vc-files \ # argp \ # base64 \ # error \ # fnmatch \ # getdelim \ # getline \ # gettext-h \ # gitlog-to-changelog \ # mbswidth \ # progname \ # realloc-gnu \ # regex \ # save-cwd \ # stdbool # Specification in the form of a few gnulib-tool.m4 macro invocations: gl_LOCAL_DIR([gl]) gl_MODULES([ argp base64 error fnmatch getdelim getline gettext-h gitlog-to-changelog mbswidth progname realloc-gnu regex save-cwd stdbool ]) gl_AVOID([]) gl_SOURCE_BASE([grub-core/lib/gnulib]) gl_M4_BASE([m4]) gl_PO_BASE([]) gl_DOC_BASE([doc]) gl_TESTS_BASE([tests]) gl_LIB([libgnu]) gl_MAKEFILE_NAME([]) gl_MACRO_PREFIX([gl]) gl_PO_DOMAIN([]) gl_WITNESS_C_MACRO([]) gl_VC_FILES([false]) grub-2.14~git20250718.0e36779/m4/malloca.m40000644000175000017500000000103315036447602014174 00000000000000# malloca.m4 serial 2 dnl Copyright (C) 2003-2004, 2006-2007, 2009-2022 Free Software Foundation, dnl Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_MALLOCA], [ dnl Use the autoconf tests for alloca(), but not the AC_SUBSTed variables dnl @ALLOCA@ and @LTALLOCA@. dnl gl_FUNC_ALLOCA dnl Already brought in by the module dependencies. AC_REQUIRE([gl_EEMALLOC]) ]) grub-2.14~git20250718.0e36779/m4/wmemchr.m40000644000175000017500000000151515036447602014233 00000000000000# wmemchr.m4 serial 5 dnl Copyright (C) 2011-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_WMEMCHR], [ AC_REQUIRE([gl_WCHAR_H_DEFAULTS]) dnl We cannot use AC_CHECK_FUNCS here, because the MSVC 9 header files dnl provide this function as an inline function definition. AC_CACHE_CHECK([for wmemchr], [gl_cv_func_wmemchr], [AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[#include ]], [[return ! wmemchr ((const wchar_t *) 0, (wchar_t) ' ', 0);]]) ], [gl_cv_func_wmemchr=yes], [gl_cv_func_wmemchr=no]) ]) if test $gl_cv_func_wmemchr = no; then HAVE_WMEMCHR=0 fi ]) grub-2.14~git20250718.0e36779/m4/mbstate_t.m40000644000175000017500000000221015036447602014544 00000000000000# mbstate_t.m4 serial 14 dnl Copyright (C) 2000-2002, 2008-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. # From Paul Eggert. # BeOS 5 has but does not define mbstate_t, # so you can't declare an object of that type. # Check for this incompatibility with Standard C. # AC_TYPE_MBSTATE_T # ----------------- AC_DEFUN([AC_TYPE_MBSTATE_T], [ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) dnl for HP-UX 11.11 AC_CACHE_CHECK([for mbstate_t], [ac_cv_type_mbstate_t], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [AC_INCLUDES_DEFAULT[ #include ]], [[mbstate_t x; return sizeof x;]])], [ac_cv_type_mbstate_t=yes], [ac_cv_type_mbstate_t=no])]) if test $ac_cv_type_mbstate_t = yes; then AC_DEFINE([HAVE_MBSTATE_T], [1], [Define to 1 if declares mbstate_t.]) else AC_DEFINE([mbstate_t], [int], [Define to a type if does not define.]) fi ]) grub-2.14~git20250718.0e36779/m4/time_h.m40000644000175000017500000001623615036447602014044 00000000000000# Configure a more-standard replacement for . # Copyright (C) 2000-2001, 2003-2007, 2009-2022 Free Software Foundation, Inc. # serial 19 # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # Written by Paul Eggert and Jim Meyering. AC_DEFUN_ONCE([gl_TIME_H], [ dnl Ensure to expand the default settings once only, before all statements dnl that occur in other macros. AC_REQUIRE([gl_TIME_H_DEFAULTS]) gl_NEXT_HEADERS([time.h]) AC_REQUIRE([gl_CHECK_TYPE_STRUCT_TIMESPEC]) AC_REQUIRE([AC_C_RESTRICT]) AC_CACHE_CHECK([for TIME_UTC in ], [gl_cv_time_h_has_TIME_UTC], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#include ]], [[static int x = TIME_UTC; x++;]])], [gl_cv_time_h_has_TIME_UTC=yes], [gl_cv_time_h_has_TIME_UTC=no])]) if test $gl_cv_time_h_has_TIME_UTC = yes; then TIME_H_DEFINES_TIME_UTC=1 else TIME_H_DEFINES_TIME_UTC=0 fi AC_SUBST([TIME_H_DEFINES_TIME_UTC]) ]) dnl Check whether 'struct timespec' is declared dnl in time.h, sys/time.h, pthread.h, or unistd.h. AC_DEFUN([gl_CHECK_TYPE_STRUCT_TIMESPEC], [ AC_CHECK_HEADERS_ONCE([sys/time.h]) AC_CACHE_CHECK([for struct timespec in ], [gl_cv_sys_struct_timespec_in_time_h], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#include ]], [[static struct timespec x; x.tv_sec = x.tv_nsec;]])], [gl_cv_sys_struct_timespec_in_time_h=yes], [gl_cv_sys_struct_timespec_in_time_h=no])]) TIME_H_DEFINES_STRUCT_TIMESPEC=0 SYS_TIME_H_DEFINES_STRUCT_TIMESPEC=0 PTHREAD_H_DEFINES_STRUCT_TIMESPEC=0 UNISTD_H_DEFINES_STRUCT_TIMESPEC=0 if test $gl_cv_sys_struct_timespec_in_time_h = yes; then TIME_H_DEFINES_STRUCT_TIMESPEC=1 else AC_CACHE_CHECK([for struct timespec in ], [gl_cv_sys_struct_timespec_in_sys_time_h], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#include ]], [[static struct timespec x; x.tv_sec = x.tv_nsec;]])], [gl_cv_sys_struct_timespec_in_sys_time_h=yes], [gl_cv_sys_struct_timespec_in_sys_time_h=no])]) if test $gl_cv_sys_struct_timespec_in_sys_time_h = yes; then SYS_TIME_H_DEFINES_STRUCT_TIMESPEC=1 else AC_CACHE_CHECK([for struct timespec in ], [gl_cv_sys_struct_timespec_in_pthread_h], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#include ]], [[static struct timespec x; x.tv_sec = x.tv_nsec;]])], [gl_cv_sys_struct_timespec_in_pthread_h=yes], [gl_cv_sys_struct_timespec_in_pthread_h=no])]) if test $gl_cv_sys_struct_timespec_in_pthread_h = yes; then PTHREAD_H_DEFINES_STRUCT_TIMESPEC=1 else AC_CACHE_CHECK([for struct timespec in ], [gl_cv_sys_struct_timespec_in_unistd_h], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#include ]], [[static struct timespec x; x.tv_sec = x.tv_nsec;]])], [gl_cv_sys_struct_timespec_in_unistd_h=yes], [gl_cv_sys_struct_timespec_in_unistd_h=no])]) if test $gl_cv_sys_struct_timespec_in_unistd_h = yes; then UNISTD_H_DEFINES_STRUCT_TIMESPEC=1 fi fi fi fi AC_SUBST([TIME_H_DEFINES_STRUCT_TIMESPEC]) AC_SUBST([SYS_TIME_H_DEFINES_STRUCT_TIMESPEC]) AC_SUBST([PTHREAD_H_DEFINES_STRUCT_TIMESPEC]) AC_SUBST([UNISTD_H_DEFINES_STRUCT_TIMESPEC]) ]) # gl_TIME_MODULE_INDICATOR([modulename]) # sets the shell variable that indicates the presence of the given module # to a C preprocessor expression that will evaluate to 1. # This macro invocation must not occur in macros that are AC_REQUIREd. AC_DEFUN([gl_TIME_MODULE_INDICATOR], [ dnl Ensure to expand the default settings once only. gl_TIME_H_REQUIRE_DEFAULTS gl_MODULE_INDICATOR_SET_VARIABLE([$1]) dnl Define it also as a C macro, for the benefit of the unit tests. gl_MODULE_INDICATOR_FOR_TESTS([$1]) ]) # Initializes the default values for AC_SUBSTed shell variables. # This macro must not be AC_REQUIREd. It must only be invoked, and only # outside of macros or in macros that are not AC_REQUIREd. AC_DEFUN([gl_TIME_H_REQUIRE_DEFAULTS], [ m4_defun(GL_MODULE_INDICATOR_PREFIX[_TIME_H_MODULE_INDICATOR_DEFAULTS], [ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_CTIME]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MKTIME]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LOCALTIME]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_NANOSLEEP]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRFTIME]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRPTIME]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_TIMEGM]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_TIMESPEC_GET]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_TIMESPEC_GETRES]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_TIME_R]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_TIME_RZ]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_TZSET]) dnl Support Microsoft deprecated alias function names by default. gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_TZSET], [1]) ]) m4_require(GL_MODULE_INDICATOR_PREFIX[_TIME_H_MODULE_INDICATOR_DEFAULTS]) AC_REQUIRE([gl_TIME_H_DEFAULTS]) ]) AC_DEFUN([gl_TIME_H_DEFAULTS], [ dnl Assume proper GNU behavior unless another module says otherwise. HAVE_DECL_LOCALTIME_R=1; AC_SUBST([HAVE_DECL_LOCALTIME_R]) HAVE_NANOSLEEP=1; AC_SUBST([HAVE_NANOSLEEP]) HAVE_STRPTIME=1; AC_SUBST([HAVE_STRPTIME]) HAVE_TIMEGM=1; AC_SUBST([HAVE_TIMEGM]) HAVE_TIMESPEC_GET=1; AC_SUBST([HAVE_TIMESPEC_GET]) HAVE_TIMESPEC_GETRES=1; AC_SUBST([HAVE_TIMESPEC_GETRES]) dnl Even GNU libc does not have timezone_t yet. HAVE_TIMEZONE_T=0; AC_SUBST([HAVE_TIMEZONE_T]) dnl If another module says to replace or to not replace, do that. dnl Otherwise, replace only if someone compiles with -DGNULIB_PORTCHECK; dnl this lets maintainers check for portability. REPLACE_CTIME=GNULIB_PORTCHECK; AC_SUBST([REPLACE_CTIME]) REPLACE_LOCALTIME_R=GNULIB_PORTCHECK; AC_SUBST([REPLACE_LOCALTIME_R]) REPLACE_MKTIME=GNULIB_PORTCHECK; AC_SUBST([REPLACE_MKTIME]) REPLACE_NANOSLEEP=GNULIB_PORTCHECK; AC_SUBST([REPLACE_NANOSLEEP]) REPLACE_STRFTIME=GNULIB_PORTCHECK; AC_SUBST([REPLACE_STRFTIME]) REPLACE_TIMEGM=GNULIB_PORTCHECK; AC_SUBST([REPLACE_TIMEGM]) REPLACE_TZSET=GNULIB_PORTCHECK; AC_SUBST([REPLACE_TZSET]) dnl Hack so that the time module doesn't depend on the sys_time module. dnl First, default GNULIB_GETTIMEOFDAY to 0 if sys_time is absent. : ${GNULIB_GETTIMEOFDAY=0}; AC_SUBST([GNULIB_GETTIMEOFDAY]) dnl Second, it's OK to not use GNULIB_PORTCHECK for REPLACE_GMTIME dnl and REPLACE_LOCALTIME, as portability to Solaris 2.6 and earlier dnl is no longer a big deal. REPLACE_GMTIME=0; AC_SUBST([REPLACE_GMTIME]) REPLACE_LOCALTIME=0; AC_SUBST([REPLACE_LOCALTIME]) ]) grub-2.14~git20250718.0e36779/m4/unistd_h.m40000644000175000017500000003362415036447602014414 00000000000000# unistd_h.m4 serial 90 dnl Copyright (C) 2006-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl Written by Simon Josefsson, Bruno Haible. AC_DEFUN_ONCE([gl_UNISTD_H], [ dnl Ensure to expand the default settings once only, before all statements dnl that occur in other macros. AC_REQUIRE([gl_UNISTD_H_DEFAULTS]) gl_CHECK_NEXT_HEADERS([unistd.h]) if test $ac_cv_header_unistd_h = yes; then HAVE_UNISTD_H=1 else HAVE_UNISTD_H=0 fi AC_SUBST([HAVE_UNISTD_H]) dnl Ensure the type pid_t gets defined. AC_REQUIRE([AC_TYPE_PID_T]) dnl Determine WINDOWS_64_BIT_OFF_T. AC_REQUIRE([gl_TYPE_OFF_T]) dnl Check for declarations of anything we want to poison if the dnl corresponding gnulib module is not in use. gl_WARN_ON_USE_PREPARE([[ #if HAVE_UNISTD_H # include #endif /* Some systems declare various items in the wrong headers. */ #if !(defined __GLIBC__ && !defined __UCLIBC__) # include # include # include # if defined _WIN32 && ! defined __CYGWIN__ # include # endif #endif ]], [access chdir chown copy_file_range dup dup2 dup3 environ euidaccess execl execle execlp execv execve execvp execvpe faccessat fchdir fchownat fdatasync fsync ftruncate getcwd getdomainname getdtablesize getentropy getgroups gethostname getlogin getlogin_r getpagesize getpass getusershell setusershell endusershell group_member isatty lchown link linkat lseek pipe pipe2 pread pwrite readlink readlinkat rmdir sethostname sleep symlink symlinkat truncate ttyname_r unlink unlinkat usleep]) AC_REQUIRE([AC_C_RESTRICT]) AC_CHECK_DECLS_ONCE([execvpe]) if test $ac_cv_have_decl_execvpe = no; then HAVE_DECL_EXECVPE=0 fi ]) # gl_UNISTD_MODULE_INDICATOR([modulename]) # sets the shell variable that indicates the presence of the given module # to a C preprocessor expression that will evaluate to 1. # This macro invocation must not occur in macros that are AC_REQUIREd. AC_DEFUN([gl_UNISTD_MODULE_INDICATOR], [ dnl Ensure to expand the default settings once only. gl_UNISTD_H_REQUIRE_DEFAULTS gl_MODULE_INDICATOR_SET_VARIABLE([$1]) dnl Define it also as a C macro, for the benefit of the unit tests. gl_MODULE_INDICATOR_FOR_TESTS([$1]) ]) # Initializes the default values for AC_SUBSTed shell variables. # This macro must not be AC_REQUIREd. It must only be invoked, and only # outside of macros or in macros that are not AC_REQUIREd. AC_DEFUN([gl_UNISTD_H_REQUIRE_DEFAULTS], [ m4_defun(GL_MODULE_INDICATOR_PREFIX[_UNISTD_H_MODULE_INDICATOR_DEFAULTS], [ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ACCESS]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_CHDIR]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_CHOWN]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_CLOSE]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_COPY_FILE_RANGE]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_DUP]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_DUP2]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_DUP3]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ENVIRON]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_EUIDACCESS]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_EXECL]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_EXECLE]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_EXECLP]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_EXECV]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_EXECVE]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_EXECVP]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_EXECVPE]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FACCESSAT]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FCHDIR]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FCHOWNAT]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FDATASYNC]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FSYNC]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FTRUNCATE]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GETCWD]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GETDOMAINNAME]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GETDTABLESIZE]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GETENTROPY]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GETGROUPS]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GETHOSTNAME]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GETLOGIN]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GETLOGIN_R]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GETOPT_POSIX]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GETPAGESIZE]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GETPASS]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GETPASS_GNU]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GETUSERSHELL]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GROUP_MEMBER]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ISATTY]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LCHOWN]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LINK]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LINKAT]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LSEEK]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_PIPE]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_PIPE2]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_PREAD]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_PWRITE]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_READ]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_READLINK]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_READLINKAT]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_RMDIR]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SETHOSTNAME]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SLEEP]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SYMLINK]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SYMLINKAT]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_TRUNCATE]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_TTYNAME_R]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_UNISTD_H_GETOPT]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_UNISTD_H_NONBLOCKING]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_UNISTD_H_SIGPIPE]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_UNLINK]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_UNLINKAT]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_USLEEP]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WRITE]) dnl Support Microsoft deprecated alias function names by default. gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_ACCESS], [1]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_CHDIR], [1]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_CLOSE], [1]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_DUP], [1]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_DUP2], [1]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_EXECL], [1]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_EXECLE], [1]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_EXECLP], [1]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_EXECV], [1]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_EXECVE], [1]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_EXECVP], [1]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_EXECVPE], [1]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_GETCWD], [1]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_GETPID], [1]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_ISATTY], [1]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_LSEEK], [1]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_READ], [1]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_RMDIR], [1]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_SWAB], [1]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_UNLINK], [1]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_WRITE], [1]) ]) m4_require(GL_MODULE_INDICATOR_PREFIX[_UNISTD_H_MODULE_INDICATOR_DEFAULTS]) AC_REQUIRE([gl_UNISTD_H_DEFAULTS]) ]) AC_DEFUN([gl_UNISTD_H_DEFAULTS], [ dnl Assume proper GNU behavior unless another module says otherwise. HAVE_CHOWN=1; AC_SUBST([HAVE_CHOWN]) HAVE_COPY_FILE_RANGE=1; AC_SUBST([HAVE_COPY_FILE_RANGE]) HAVE_DUP3=1; AC_SUBST([HAVE_DUP3]) HAVE_EUIDACCESS=1; AC_SUBST([HAVE_EUIDACCESS]) HAVE_EXECVPE=1; AC_SUBST([HAVE_EXECVPE]) HAVE_FACCESSAT=1; AC_SUBST([HAVE_FACCESSAT]) HAVE_FCHDIR=1; AC_SUBST([HAVE_FCHDIR]) HAVE_FCHOWNAT=1; AC_SUBST([HAVE_FCHOWNAT]) HAVE_FDATASYNC=1; AC_SUBST([HAVE_FDATASYNC]) HAVE_FSYNC=1; AC_SUBST([HAVE_FSYNC]) HAVE_FTRUNCATE=1; AC_SUBST([HAVE_FTRUNCATE]) HAVE_GETDTABLESIZE=1; AC_SUBST([HAVE_GETDTABLESIZE]) HAVE_GETENTROPY=1; AC_SUBST([HAVE_GETENTROPY]) HAVE_GETGROUPS=1; AC_SUBST([HAVE_GETGROUPS]) HAVE_GETHOSTNAME=1; AC_SUBST([HAVE_GETHOSTNAME]) HAVE_GETLOGIN=1; AC_SUBST([HAVE_GETLOGIN]) HAVE_GETPAGESIZE=1; AC_SUBST([HAVE_GETPAGESIZE]) HAVE_GETPASS=1; AC_SUBST([HAVE_GETPASS]) HAVE_GROUP_MEMBER=1; AC_SUBST([HAVE_GROUP_MEMBER]) HAVE_LCHOWN=1; AC_SUBST([HAVE_LCHOWN]) HAVE_LINK=1; AC_SUBST([HAVE_LINK]) HAVE_LINKAT=1; AC_SUBST([HAVE_LINKAT]) HAVE_PIPE=1; AC_SUBST([HAVE_PIPE]) HAVE_PIPE2=1; AC_SUBST([HAVE_PIPE2]) HAVE_PREAD=1; AC_SUBST([HAVE_PREAD]) HAVE_PWRITE=1; AC_SUBST([HAVE_PWRITE]) HAVE_READLINK=1; AC_SUBST([HAVE_READLINK]) HAVE_READLINKAT=1; AC_SUBST([HAVE_READLINKAT]) HAVE_SETHOSTNAME=1; AC_SUBST([HAVE_SETHOSTNAME]) HAVE_SLEEP=1; AC_SUBST([HAVE_SLEEP]) HAVE_SYMLINK=1; AC_SUBST([HAVE_SYMLINK]) HAVE_SYMLINKAT=1; AC_SUBST([HAVE_SYMLINKAT]) HAVE_UNLINKAT=1; AC_SUBST([HAVE_UNLINKAT]) HAVE_USLEEP=1; AC_SUBST([HAVE_USLEEP]) HAVE_DECL_ENVIRON=1; AC_SUBST([HAVE_DECL_ENVIRON]) HAVE_DECL_EXECVPE=1; AC_SUBST([HAVE_DECL_EXECVPE]) HAVE_DECL_FCHDIR=1; AC_SUBST([HAVE_DECL_FCHDIR]) HAVE_DECL_FDATASYNC=1; AC_SUBST([HAVE_DECL_FDATASYNC]) HAVE_DECL_GETDOMAINNAME=1; AC_SUBST([HAVE_DECL_GETDOMAINNAME]) HAVE_DECL_GETLOGIN=1; AC_SUBST([HAVE_DECL_GETLOGIN]) HAVE_DECL_GETLOGIN_R=1; AC_SUBST([HAVE_DECL_GETLOGIN_R]) HAVE_DECL_GETPAGESIZE=1; AC_SUBST([HAVE_DECL_GETPAGESIZE]) HAVE_DECL_GETUSERSHELL=1; AC_SUBST([HAVE_DECL_GETUSERSHELL]) HAVE_DECL_SETHOSTNAME=1; AC_SUBST([HAVE_DECL_SETHOSTNAME]) HAVE_DECL_TRUNCATE=1; AC_SUBST([HAVE_DECL_TRUNCATE]) HAVE_DECL_TTYNAME_R=1; AC_SUBST([HAVE_DECL_TTYNAME_R]) HAVE_OS_H=0; AC_SUBST([HAVE_OS_H]) HAVE_SYS_PARAM_H=0; AC_SUBST([HAVE_SYS_PARAM_H]) REPLACE_ACCESS=0; AC_SUBST([REPLACE_ACCESS]) REPLACE_CHOWN=0; AC_SUBST([REPLACE_CHOWN]) REPLACE_CLOSE=0; AC_SUBST([REPLACE_CLOSE]) REPLACE_COPY_FILE_RANGE=0; AC_SUBST([REPLACE_COPY_FILE_RANGE]) REPLACE_DUP=0; AC_SUBST([REPLACE_DUP]) REPLACE_DUP2=0; AC_SUBST([REPLACE_DUP2]) REPLACE_EXECL=0; AC_SUBST([REPLACE_EXECL]) REPLACE_EXECLE=0; AC_SUBST([REPLACE_EXECLE]) REPLACE_EXECLP=0; AC_SUBST([REPLACE_EXECLP]) REPLACE_EXECV=0; AC_SUBST([REPLACE_EXECV]) REPLACE_EXECVE=0; AC_SUBST([REPLACE_EXECVE]) REPLACE_EXECVP=0; AC_SUBST([REPLACE_EXECVP]) REPLACE_EXECVPE=0; AC_SUBST([REPLACE_EXECVPE]) REPLACE_FACCESSAT=0; AC_SUBST([REPLACE_FACCESSAT]) REPLACE_FCHOWNAT=0; AC_SUBST([REPLACE_FCHOWNAT]) REPLACE_FTRUNCATE=0; AC_SUBST([REPLACE_FTRUNCATE]) REPLACE_GETCWD=0; AC_SUBST([REPLACE_GETCWD]) REPLACE_GETDOMAINNAME=0; AC_SUBST([REPLACE_GETDOMAINNAME]) REPLACE_GETDTABLESIZE=0; AC_SUBST([REPLACE_GETDTABLESIZE]) REPLACE_GETLOGIN_R=0; AC_SUBST([REPLACE_GETLOGIN_R]) REPLACE_GETGROUPS=0; AC_SUBST([REPLACE_GETGROUPS]) REPLACE_GETPAGESIZE=0; AC_SUBST([REPLACE_GETPAGESIZE]) REPLACE_GETPASS=0; AC_SUBST([REPLACE_GETPASS]) REPLACE_GETPASS_FOR_GETPASS_GNU=0; AC_SUBST([REPLACE_GETPASS_FOR_GETPASS_GNU]) REPLACE_ISATTY=0; AC_SUBST([REPLACE_ISATTY]) REPLACE_LCHOWN=0; AC_SUBST([REPLACE_LCHOWN]) REPLACE_LINK=0; AC_SUBST([REPLACE_LINK]) REPLACE_LINKAT=0; AC_SUBST([REPLACE_LINKAT]) REPLACE_LSEEK=0; AC_SUBST([REPLACE_LSEEK]) REPLACE_PREAD=0; AC_SUBST([REPLACE_PREAD]) REPLACE_PWRITE=0; AC_SUBST([REPLACE_PWRITE]) REPLACE_READ=0; AC_SUBST([REPLACE_READ]) REPLACE_READLINK=0; AC_SUBST([REPLACE_READLINK]) REPLACE_READLINKAT=0; AC_SUBST([REPLACE_READLINKAT]) REPLACE_RMDIR=0; AC_SUBST([REPLACE_RMDIR]) REPLACE_SLEEP=0; AC_SUBST([REPLACE_SLEEP]) REPLACE_SYMLINK=0; AC_SUBST([REPLACE_SYMLINK]) REPLACE_SYMLINKAT=0; AC_SUBST([REPLACE_SYMLINKAT]) REPLACE_TRUNCATE=0; AC_SUBST([REPLACE_TRUNCATE]) REPLACE_TTYNAME_R=0; AC_SUBST([REPLACE_TTYNAME_R]) REPLACE_UNLINK=0; AC_SUBST([REPLACE_UNLINK]) REPLACE_UNLINKAT=0; AC_SUBST([REPLACE_UNLINKAT]) REPLACE_USLEEP=0; AC_SUBST([REPLACE_USLEEP]) REPLACE_WRITE=0; AC_SUBST([REPLACE_WRITE]) UNISTD_H_HAVE_SYS_RANDOM_H=0; AC_SUBST([UNISTD_H_HAVE_SYS_RANDOM_H]) UNISTD_H_HAVE_WINSOCK2_H=0; AC_SUBST([UNISTD_H_HAVE_WINSOCK2_H]) UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS=0; AC_SUBST([UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS]) ]) grub-2.14~git20250718.0e36779/m4/filenamecat.m40000644000175000017500000000075515036447602015046 00000000000000# filenamecat.m4 serial 11 dnl Copyright (C) 2002-2006, 2009-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FILE_NAME_CONCAT], [ AC_REQUIRE([gl_FILE_NAME_CONCAT_LGPL]) ]) AC_DEFUN([gl_FILE_NAME_CONCAT_LGPL], [ dnl Prerequisites of lib/filenamecat-lgpl.c. AC_CHECK_FUNCS_ONCE([mempcpy]) ]) grub-2.14~git20250718.0e36779/m4/po.m40000644000175000017500000004504115036447570013215 00000000000000# po.m4 serial 21 (gettext-0.18.3) dnl Copyright (C) 1995-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1995-2000. dnl Bruno Haible , 2000-2003. AC_PREREQ([2.60]) dnl Checks for all prerequisites of the po subdirectory. AC_DEFUN([AM_PO_SUBDIRS], [ AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl AC_REQUIRE([AC_PROG_SED])dnl AC_REQUIRE([AM_NLS])dnl dnl Release version of the gettext macros. This is used to ensure that dnl the gettext macros and po/Makefile.in.in are in sync. AC_SUBST([GETTEXT_MACRO_VERSION], [0.18]) dnl Perform the following tests also if --disable-nls has been given, dnl because they are needed for "make dist" to work. dnl Search for GNU msgfmt in the PATH. dnl The first test excludes Solaris msgfmt and early GNU msgfmt versions. dnl The second test excludes FreeBSD msgfmt. AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, [$ac_dir/$ac_word --statistics /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1 && (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], :) AC_PATH_PROG([GMSGFMT], [gmsgfmt], [$MSGFMT]) dnl Test whether it is GNU msgfmt >= 0.15. changequote(,)dnl case `$MSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) MSGFMT_015=: ;; *) MSGFMT_015=$MSGFMT ;; esac changequote([,])dnl AC_SUBST([MSGFMT_015]) changequote(,)dnl case `$GMSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) GMSGFMT_015=: ;; *) GMSGFMT_015=$GMSGFMT ;; esac changequote([,])dnl AC_SUBST([GMSGFMT_015]) dnl Search for GNU xgettext 0.12 or newer in the PATH. dnl The first test excludes Solaris xgettext and early GNU xgettext versions. dnl The second test excludes FreeBSD xgettext. AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, [$ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1 && (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], :) dnl Remove leftover from FreeBSD xgettext call. rm -f messages.po dnl Test whether it is GNU xgettext >= 0.15. changequote(,)dnl case `$XGETTEXT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) XGETTEXT_015=: ;; *) XGETTEXT_015=$XGETTEXT ;; esac changequote([,])dnl AC_SUBST([XGETTEXT_015]) dnl Search for GNU msgmerge 0.11 or newer in the PATH. AM_PATH_PROG_WITH_TEST(MSGMERGE, msgmerge, [$ac_dir/$ac_word --update -q /dev/null /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1], :) dnl Installation directories. dnl Autoconf >= 2.60 defines localedir. For older versions of autoconf, we dnl have to define it here, so that it can be used in po/Makefile. test -n "$localedir" || localedir='${datadir}/locale' AC_SUBST([localedir]) dnl Support for AM_XGETTEXT_OPTION. test -n "${XGETTEXT_EXTRA_OPTIONS+set}" || XGETTEXT_EXTRA_OPTIONS= AC_SUBST([XGETTEXT_EXTRA_OPTIONS]) AC_CONFIG_COMMANDS([po-directories], [[ for ac_file in $CONFIG_FILES; do # Support "outfile[:infile[:infile...]]" case "$ac_file" in *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; esac # PO directories have a Makefile.in generated from Makefile.in.in. case "$ac_file" in */Makefile.in) # Adjust a relative srcdir. ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` ac_dir_suffix=/`echo "$ac_dir"|sed 's%^\./%%'` ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` # In autoconf-2.13 it is called $ac_given_srcdir. # In autoconf-2.50 it is called $srcdir. test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" case "$ac_given_srcdir" in .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; /*) top_srcdir="$ac_given_srcdir" ;; *) top_srcdir="$ac_dots$ac_given_srcdir" ;; esac # Treat a directory as a PO directory if and only if it has a # POTFILES.in file. This allows packages to have multiple PO # directories under different names or in different locations. if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then rm -f "$ac_dir/POTFILES" test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES" gt_tab=`printf '\t'` cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ${gt_tab}]*\$/d" -e "s,.*, $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES" POMAKEFILEDEPS="POTFILES.in" # ALL_LINGUAS, POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES depend # on $ac_dir but don't depend on user-specified configuration # parameters. if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then # The LINGUAS file contains the set of available languages. if test -n "$OBSOLETE_ALL_LINGUAS"; then test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete" fi ALL_LINGUAS_=`sed -e "/^#/d" -e "s/#.*//" "$ac_given_srcdir/$ac_dir/LINGUAS"` # Hide the ALL_LINGUAS assignment from automake < 1.5. eval 'ALL_LINGUAS''=$ALL_LINGUAS_' POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS" else # The set of available languages was given in configure.in. # Hide the ALL_LINGUAS assignment from automake < 1.5. eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS' fi # Compute POFILES # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po) # Compute UPDATEPOFILES # as $(foreach lang, $(ALL_LINGUAS), $(lang).po-update) # Compute DUMMYPOFILES # as $(foreach lang, $(ALL_LINGUAS), $(lang).nop) # Compute GMOFILES # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo) case "$ac_given_srcdir" in .) srcdirpre= ;; *) srcdirpre='$(srcdir)/' ;; esac POFILES= UPDATEPOFILES= DUMMYPOFILES= GMOFILES= for lang in $ALL_LINGUAS; do POFILES="$POFILES $srcdirpre$lang.po" UPDATEPOFILES="$UPDATEPOFILES $lang.po-update" DUMMYPOFILES="$DUMMYPOFILES $lang.nop" GMOFILES="$GMOFILES $srcdirpre$lang.gmo" done # CATALOGS depends on both $ac_dir and the user's LINGUAS # environment variable. INST_LINGUAS= if test -n "$ALL_LINGUAS"; then for presentlang in $ALL_LINGUAS; do useit=no if test "%UNSET%" != "$LINGUAS"; then desiredlanguages="$LINGUAS" else desiredlanguages="$ALL_LINGUAS" fi for desiredlang in $desiredlanguages; do # Use the presentlang catalog if desiredlang is # a. equal to presentlang, or # b. a variant of presentlang (because in this case, # presentlang can be used as a fallback for messages # which are not translated in the desiredlang catalog). case "$desiredlang" in "$presentlang"*) useit=yes;; esac done if test $useit = yes; then INST_LINGUAS="$INST_LINGUAS $presentlang" fi done fi CATALOGS= if test -n "$INST_LINGUAS"; then for lang in $INST_LINGUAS; do CATALOGS="$CATALOGS $lang.gmo" done fi test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile" sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile" for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do if test -f "$f"; then case "$f" in *.orig | *.bak | *~) ;; *) cat "$f" >> "$ac_dir/Makefile" ;; esac fi done fi ;; esac done]], [# Capture the value of obsolete ALL_LINGUAS because we need it to compute # POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES, CATALOGS. But hide it # from automake < 1.5. eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"' # Capture the value of LINGUAS because we need it to compute CATALOGS. LINGUAS="${LINGUAS-%UNSET%}" ]) ]) dnl Postprocesses a Makefile in a directory containing PO files. AC_DEFUN([AM_POSTPROCESS_PO_MAKEFILE], [ # When this code is run, in config.status, two variables have already been # set: # - OBSOLETE_ALL_LINGUAS is the value of LINGUAS set in configure.in, # - LINGUAS is the value of the environment variable LINGUAS at configure # time. changequote(,)dnl # Adjust a relative srcdir. ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` ac_dir_suffix=/`echo "$ac_dir"|sed 's%^\./%%'` ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` # In autoconf-2.13 it is called $ac_given_srcdir. # In autoconf-2.50 it is called $srcdir. test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" case "$ac_given_srcdir" in .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; /*) top_srcdir="$ac_given_srcdir" ;; *) top_srcdir="$ac_dots$ac_given_srcdir" ;; esac # Find a way to echo strings without interpreting backslash. if test "X`(echo '\t') 2>/dev/null`" = 'X\t'; then gt_echo='echo' else if test "X`(printf '%s\n' '\t') 2>/dev/null`" = 'X\t'; then gt_echo='printf %s\n' else echo_func () { cat < "$ac_file.tmp" tab=`printf '\t'` if grep -l '@TCLCATALOGS@' "$ac_file" > /dev/null; then # Add dependencies that cannot be formulated as a simple suffix rule. for lang in $ALL_LINGUAS; do frobbedlang=`echo $lang | sed -e 's/\..*$//' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'` cat >> "$ac_file.tmp" < /dev/null; then # Add dependencies that cannot be formulated as a simple suffix rule. for lang in $ALL_LINGUAS; do frobbedlang=`echo $lang | sed -e 's/_/-/g' -e 's/^sr-CS/sr-SP/' -e 's/@latin$/-Latn/' -e 's/@cyrillic$/-Cyrl/' -e 's/^sr-SP$/sr-SP-Latn/' -e 's/^uz-UZ$/uz-UZ-Latn/'` cat >> "$ac_file.tmp" <> "$ac_file.tmp" < getopt-posix. ]) # Determine whether to replace the entire getopt facility. AC_DEFUN([gl_GETOPT_CHECK_HEADERS], [ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_REQUIRE([AC_PROG_AWK]) dnl for awk that supports ENVIRON dnl Persuade Solaris to declare optarg, optind, opterr, optopt. AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) gl_CHECK_NEXT_HEADERS([getopt.h]) if test $ac_cv_header_getopt_h = yes; then HAVE_GETOPT_H=1 else HAVE_GETOPT_H=0 fi AC_SUBST([HAVE_GETOPT_H]) gl_replace_getopt= dnl Test whether is available. if test -z "$gl_replace_getopt" && test $gl_getopt_required = GNU; then AC_CHECK_HEADERS([getopt.h], [], [gl_replace_getopt=yes]) fi dnl Test whether the function getopt_long is available. if test -z "$gl_replace_getopt" && test $gl_getopt_required = GNU; then AC_CHECK_FUNCS([getopt_long_only], [], [gl_replace_getopt=yes]) fi dnl POSIX 2008 does not specify leading '+' behavior, but see dnl http://austingroupbugs.net/view.php?id=191 for a recommendation on dnl the next version of POSIX. For now, we only guarantee leading '+' dnl behavior with getopt-gnu. if test -z "$gl_replace_getopt"; then AC_CACHE_CHECK([whether getopt is POSIX compatible], [gl_cv_func_getopt_posix], [ dnl Merging these three different test programs into a single one dnl would require a reset mechanism. On BSD systems, it can be done dnl through 'optreset'; on some others (glibc), it can be done by dnl setting 'optind' to 0; on others again (HP-UX, IRIX, OSF/1, dnl Solaris 9, musl libc), there is no such mechanism. if test $cross_compiling = no; then dnl Sanity check. Succeeds everywhere (except on MSVC, dnl which lacks and getopt() entirely). AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include #include int main () { static char program[] = "program"; static char a[] = "-a"; static char foo[] = "foo"; static char bar[] = "bar"; char *argv[] = { program, a, foo, bar, NULL }; int c; c = getopt (4, argv, "ab"); if (!(c == 'a')) return 1; c = getopt (4, argv, "ab"); if (!(c == -1)) return 2; if (!(optind == 2)) return 3; return 0; } ]])], [gl_cv_func_getopt_posix=maybe], [gl_cv_func_getopt_posix=no]) if test $gl_cv_func_getopt_posix = maybe; then dnl Sanity check with '+'. Succeeds everywhere (except on MSVC, dnl which lacks and getopt() entirely). AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include #include int main () { static char program[] = "program"; static char donald[] = "donald"; static char p[] = "-p"; static char billy[] = "billy"; static char duck[] = "duck"; static char a[] = "-a"; static char bar[] = "bar"; char *argv[] = { program, donald, p, billy, duck, a, bar, NULL }; int c; c = getopt (7, argv, "+abp:q:"); if (!(c == -1)) return 4; if (!(strcmp (argv[0], "program") == 0)) return 5; if (!(strcmp (argv[1], "donald") == 0)) return 6; if (!(strcmp (argv[2], "-p") == 0)) return 7; if (!(strcmp (argv[3], "billy") == 0)) return 8; if (!(strcmp (argv[4], "duck") == 0)) return 9; if (!(strcmp (argv[5], "-a") == 0)) return 10; if (!(strcmp (argv[6], "bar") == 0)) return 11; if (!(optind == 1)) return 12; return 0; } ]])], [gl_cv_func_getopt_posix=maybe], [gl_cv_func_getopt_posix=no]) fi if test $gl_cv_func_getopt_posix = maybe; then dnl Detect Mac OS X 10.5, AIX 7.1, mingw bug. AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include #include int main () { static char program[] = "program"; static char ab[] = "-ab"; char *argv[3] = { program, ab, NULL }; if (getopt (2, argv, "ab:") != 'a') return 13; if (getopt (2, argv, "ab:") != '?') return 14; if (optopt != 'b') return 15; if (optind != 2) return 16; return 0; } ]])], [gl_cv_func_getopt_posix=yes], [gl_cv_func_getopt_posix=no]) fi else case "$host_os" in darwin* | aix* | mingw*) gl_cv_func_getopt_posix="guessing no";; *) gl_cv_func_getopt_posix="guessing yes";; esac fi ]) case "$gl_cv_func_getopt_posix" in *no) gl_replace_getopt=yes ;; esac fi if test -z "$gl_replace_getopt" && test $gl_getopt_required = GNU; then AC_CACHE_CHECK([for working GNU getopt function], [gl_cv_func_getopt_gnu], [# Even with POSIXLY_CORRECT, the GNU extension of leading '-' in the # optstring is necessary for programs like m4 that have POSIX-mandated # semantics for supporting options interspersed with files. # Also, since getopt_long is a GNU extension, we require optind=0. # Bash ties 'set -o posix' to a non-exported POSIXLY_CORRECT; # so take care to revert to the correct (non-)export state. dnl GNU Coding Standards currently allow awk but not env; besides, env dnl is ambiguous with environment values that contain newlines. gl_awk_probe='BEGIN { if ("POSIXLY_CORRECT" in ENVIRON) print "x" }' case ${POSIXLY_CORRECT+x}`$AWK "$gl_awk_probe" #include #include ]GL_NOCRASH[ ]], [[ int result = 0; nocrash_init(); /* This code succeeds on glibc 2.8, OpenBSD 4.0, Cygwin, mingw, and fails on Mac OS X 10.5, AIX 5.2, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10. */ { static char conftest[] = "conftest"; static char plus[] = "-+"; char *argv[3] = { conftest, plus, NULL }; opterr = 0; if (getopt (2, argv, "+a") != '?') result |= 1; } /* This code succeeds on glibc 2.8, mingw, and fails on Mac OS X 10.5, OpenBSD 4.0, AIX 5.2, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x. */ { static char program[] = "program"; static char p[] = "-p"; static char foo[] = "foo"; static char bar[] = "bar"; char *argv[] = { program, p, foo, bar, NULL }; optind = 1; if (getopt (4, argv, "p::") != 'p') result |= 2; else if (optarg != NULL) result |= 4; else if (getopt (4, argv, "p::") != -1) result |= 6; else if (optind != 2) result |= 8; } /* This code succeeds on glibc 2.8 and fails on Cygwin 1.7.0. */ { static char program[] = "program"; static char foo[] = "foo"; static char p[] = "-p"; char *argv[] = { program, foo, p, NULL }; optind = 0; if (getopt (3, argv, "-p") != 1) result |= 16; else if (getopt (3, argv, "-p") != 'p') result |= 16; } /* This code fails on glibc 2.11. */ { static char program[] = "program"; static char b[] = "-b"; static char a[] = "-a"; char *argv[] = { program, b, a, NULL }; optind = opterr = 0; if (getopt (3, argv, "+:a:b") != 'b') result |= 32; else if (getopt (3, argv, "+:a:b") != ':') result |= 32; } /* This code dumps core on glibc 2.14. */ { static char program[] = "program"; static char w[] = "-W"; static char dummy[] = "dummy"; char *argv[] = { program, w, dummy, NULL }; optind = opterr = 1; if (getopt (3, argv, "W;") != 'W') result |= 64; } return result; ]])], [gl_cv_func_getopt_gnu=yes], [gl_cv_func_getopt_gnu=no], [dnl Cross compiling. dnl Assume the worst, even on glibc platforms. dnl But obey --enable-cross-guesses. gl_cv_func_getopt_gnu="$gl_cross_guess_normal" ]) case $gl_had_POSIXLY_CORRECT in exported) ;; yes) AS_UNSET([POSIXLY_CORRECT]); POSIXLY_CORRECT=1 ;; *) AS_UNSET([POSIXLY_CORRECT]) ;; esac ]) if test "$gl_cv_func_getopt_gnu" != yes; then gl_replace_getopt=yes else AC_CACHE_CHECK([for working GNU getopt_long function], [gl_cv_func_getopt_long_gnu], [AC_RUN_IFELSE( [AC_LANG_PROGRAM( [[#include #include #include ]], [[static const struct option long_options[] = { { "xtremely-",no_argument, NULL, 1003 }, { "xtra", no_argument, NULL, 1001 }, { "xtreme", no_argument, NULL, 1002 }, { "xtremely", no_argument, NULL, 1003 }, { NULL, 0, NULL, 0 } }; /* This code fails on OpenBSD 5.0. */ { static char program[] = "program"; static char xtremel[] = "--xtremel"; char *argv[] = { program, xtremel, NULL }; int option_index; optind = 1; opterr = 0; if (getopt_long (2, argv, "", long_options, &option_index) != 1003) return 1; } return 0; ]])], [gl_cv_func_getopt_long_gnu=yes], [gl_cv_func_getopt_long_gnu=no], [dnl Cross compiling. Guess no on OpenBSD, yes otherwise. case "$host_os" in openbsd*) gl_cv_func_getopt_long_gnu="guessing no";; *) gl_cv_func_getopt_long_gnu="guessing yes";; esac ]) ]) case "$gl_cv_func_getopt_long_gnu" in *yes) ;; *) gl_replace_getopt=yes ;; esac fi fi ]) AC_DEFUN([gl_GETOPT_SUBSTITUTE_HEADER], [ AC_CHECK_HEADERS_ONCE([sys/cdefs.h]) if test $ac_cv_header_sys_cdefs_h = yes; then HAVE_SYS_CDEFS_H=1 else HAVE_SYS_CDEFS_H=0 fi AC_SUBST([HAVE_SYS_CDEFS_H]) AC_DEFINE([__GETOPT_PREFIX], [[rpl_]], [Define to rpl_ if the getopt replacement functions and variables should be used.]) GL_GENERATE_GETOPT_H=true GL_GENERATE_GETOPT_CDEFS_H=true ]) grub-2.14~git20250718.0e36779/m4/stat-time.m40000644000175000017500000000605715036447602014506 00000000000000# Checks for stat-related time functions. # Copyright (C) 1998-1999, 2001, 2003, 2005-2007, 2009-2022 Free Software # Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. dnl From Paul Eggert. # st_atim.tv_nsec - Linux, Solaris, Cygwin # st_atimespec.tv_nsec - FreeBSD, NetBSD, if ! defined _POSIX_SOURCE # st_atimensec - FreeBSD, NetBSD, if defined _POSIX_SOURCE # st_atim.st__tim.tv_nsec - UnixWare (at least 2.1.2 through 7.1) # st_birthtimespec - FreeBSD, NetBSD (hidden on OpenBSD 3.9, anyway) # st_birthtim - Cygwin 1.7.0+ AC_DEFUN([gl_STAT_TIME], [ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) AC_CHECK_HEADERS_ONCE([sys/time.h]) AC_CHECK_MEMBERS([struct stat.st_atim.tv_nsec], [AC_CACHE_CHECK([whether struct stat.st_atim is of type struct timespec], [ac_cv_typeof_struct_stat_st_atim_is_struct_timespec], [AC_COMPILE_IFELSE([AC_LANG_PROGRAM( [[ #include #include #if HAVE_SYS_TIME_H # include #endif #include struct timespec ts; struct stat st; ]], [[ st.st_atim = ts; ]])], [ac_cv_typeof_struct_stat_st_atim_is_struct_timespec=yes], [ac_cv_typeof_struct_stat_st_atim_is_struct_timespec=no])]) if test $ac_cv_typeof_struct_stat_st_atim_is_struct_timespec = yes; then AC_DEFINE([TYPEOF_STRUCT_STAT_ST_ATIM_IS_STRUCT_TIMESPEC], [1], [Define to 1 if the type of the st_atim member of a struct stat is struct timespec.]) fi], [AC_CHECK_MEMBERS([struct stat.st_atimespec.tv_nsec], [], [AC_CHECK_MEMBERS([struct stat.st_atimensec], [], [AC_CHECK_MEMBERS([struct stat.st_atim.st__tim.tv_nsec], [], [], [#include #include ])], [#include #include ])], [#include #include ])], [#include #include ]) ]) # Check for st_birthtime, a feature from UFS2 (FreeBSD, NetBSD, OpenBSD, etc.) # and NTFS (Cygwin). # There was a time when this field was named st_createtime (21 June # 2002 to 16 July 2002) But that window is very small and applied only # to development code, so systems still using that configuration are # not supported. See revisions 1.10 and 1.11 of FreeBSD's # src/sys/ufs/ufs/dinode.h. # AC_DEFUN([gl_STAT_BIRTHTIME], [ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) AC_CHECK_HEADERS_ONCE([sys/time.h]) AC_CHECK_MEMBERS([struct stat.st_birthtimespec.tv_nsec], [], [AC_CHECK_MEMBERS([struct stat.st_birthtimensec], [], [AC_CHECK_MEMBERS([struct stat.st_birthtim.tv_nsec], [], [], [#include #include ])], [#include #include ])], [#include #include ]) ]) grub-2.14~git20250718.0e36779/m4/inttypes.m40000644000175000017500000001377415036447602014462 00000000000000# inttypes.m4 serial 36 dnl Copyright (C) 2006-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Derek Price, Bruno Haible. dnl Test whether is supported or must be substituted. AC_DEFUN_ONCE([gl_INTTYPES_H], [ AC_REQUIRE([gl_INTTYPES_INCOMPLETE]) gl_INTTYPES_PRI_SCN ]) AC_DEFUN_ONCE([gl_INTTYPES_INCOMPLETE], [ AC_REQUIRE([gl_STDINT_H]) AC_CHECK_HEADERS_ONCE([inttypes.h]) dnl Override always, so that the portability warnings work. AC_REQUIRE([gl_INTTYPES_H_DEFAULTS]) gl_CHECK_NEXT_HEADERS([inttypes.h]) AC_REQUIRE([gl_MULTIARCH]) dnl Check for declarations of anything we want to poison if the dnl corresponding gnulib module is not in use. gl_WARN_ON_USE_PREPARE([[#include ]], [imaxabs imaxdiv strtoimax strtoumax]) AC_REQUIRE([AC_C_RESTRICT]) ]) # Ensure that the PRI* and SCN* macros are defined appropriately. AC_DEFUN([gl_INTTYPES_PRI_SCN], [ PRIPTR_PREFIX= if $GL_GENERATE_STDINT_H; then dnl Using the gnulib . It defines intptr_t to 'long' or dnl 'long long', depending on _WIN64. AC_COMPILE_IFELSE( [AC_LANG_PROGRAM([[ #ifdef _WIN64 LLP64 #endif ]]) ], [PRIPTR_PREFIX='"l"'], [PRIPTR_PREFIX='"ll"']) else dnl Using the system's . for glpfx in '' l ll I64; do case $glpfx in '') gltype1='int';; l) gltype1='long int';; ll) gltype1='long long int';; I64) gltype1='__int64';; esac AC_COMPILE_IFELSE( [AC_LANG_PROGRAM([[#include extern intptr_t foo; extern $gltype1 foo;]])], [PRIPTR_PREFIX='"'$glpfx'"']) test -n "$PRIPTR_PREFIX" && break done fi AC_SUBST([PRIPTR_PREFIX]) gl_INTTYPES_CHECK_LONG_LONG_INT_CONDITION( [INT32_MAX_LT_INTMAX_MAX], [defined INT32_MAX && defined INTMAX_MAX], [INT32_MAX < INTMAX_MAX], [sizeof (int) < sizeof (long long int)]) if test $APPLE_UNIVERSAL_BUILD = 0; then gl_INTTYPES_CHECK_LONG_LONG_INT_CONDITION( [INT64_MAX_EQ_LONG_MAX], [defined INT64_MAX], [INT64_MAX == LONG_MAX], [sizeof (long long int) == sizeof (long int)]) else INT64_MAX_EQ_LONG_MAX=-1 fi gl_INTTYPES_CHECK_LONG_LONG_INT_CONDITION( [UINT32_MAX_LT_UINTMAX_MAX], [defined UINT32_MAX && defined UINTMAX_MAX], [UINT32_MAX < UINTMAX_MAX], [sizeof (unsigned int) < sizeof (unsigned long long int)]) if test $APPLE_UNIVERSAL_BUILD = 0; then gl_INTTYPES_CHECK_LONG_LONG_INT_CONDITION( [UINT64_MAX_EQ_ULONG_MAX], [defined UINT64_MAX], [UINT64_MAX == ULONG_MAX], [sizeof (unsigned long long int) == sizeof (unsigned long int)]) else UINT64_MAX_EQ_ULONG_MAX=-1 fi ]) # Define the symbol $1 to be 1 if the condition is true, 0 otherwise. # If $2 is true, the condition is $3; otherwise if long long int is supported # approximate the condition with $4; otherwise, assume the condition is false. # The condition should work on all C99 platforms; the approximations should be # good enough to work on all practical pre-C99 platforms. # $2 is evaluated by the C preprocessor, $3 and $4 as compile-time constants. AC_DEFUN([gl_INTTYPES_CHECK_LONG_LONG_INT_CONDITION], [ AC_CACHE_CHECK([whether $3], [gl_cv_test_$1], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[/* Work also in C++ mode. */ #define __STDC_LIMIT_MACROS 1 /* Work if build is not clean. */ #define _GL_JUST_INCLUDE_SYSTEM_STDINT_H #include #if HAVE_STDINT_H #include #endif #if $2 #define CONDITION ($3) #else #define CONDITION ($4) #endif int test[CONDITION ? 1 : -1];]])], [gl_cv_test_$1=yes], [gl_cv_test_$1=no])]) if test $gl_cv_test_$1 = yes; then $1=1; else $1=0; fi AC_SUBST([$1]) ]) # gl_INTTYPES_MODULE_INDICATOR([modulename]) # sets the shell variable that indicates the presence of the given module # to a C preprocessor expression that will evaluate to 1. # This macro invocation must not occur in macros that are AC_REQUIREd. AC_DEFUN([gl_INTTYPES_MODULE_INDICATOR], [ dnl Ensure to expand the default settings once only. gl_INTTYPES_H_REQUIRE_DEFAULTS gl_MODULE_INDICATOR_SET_VARIABLE([$1]) ]) # Initializes the default values for AC_SUBSTed shell variables. # This macro must not be AC_REQUIREd. It must only be invoked, and only # outside of macros or in macros that are not AC_REQUIREd. AC_DEFUN([gl_INTTYPES_H_REQUIRE_DEFAULTS], [ m4_defun(GL_MODULE_INDICATOR_PREFIX[_INTTYPES_H_MODULE_INDICATOR_DEFAULTS], [ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_IMAXABS]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_IMAXDIV]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRTOIMAX]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRTOUMAX]) ]) m4_require(GL_MODULE_INDICATOR_PREFIX[_INTTYPES_H_MODULE_INDICATOR_DEFAULTS]) AC_REQUIRE([gl_INTTYPES_H_DEFAULTS]) ]) AC_DEFUN([gl_INTTYPES_H_DEFAULTS], [ dnl Assume proper GNU behavior unless another module says otherwise. HAVE_DECL_IMAXABS=1; AC_SUBST([HAVE_DECL_IMAXABS]) HAVE_DECL_IMAXDIV=1; AC_SUBST([HAVE_DECL_IMAXDIV]) HAVE_DECL_STRTOIMAX=1; AC_SUBST([HAVE_DECL_STRTOIMAX]) HAVE_DECL_STRTOUMAX=1; AC_SUBST([HAVE_DECL_STRTOUMAX]) HAVE_IMAXDIV_T=1; AC_SUBST([HAVE_IMAXDIV_T]) REPLACE_STRTOIMAX=0; AC_SUBST([REPLACE_STRTOIMAX]) REPLACE_STRTOUMAX=0; AC_SUBST([REPLACE_STRTOUMAX]) INT32_MAX_LT_INTMAX_MAX=1; AC_SUBST([INT32_MAX_LT_INTMAX_MAX]) INT64_MAX_EQ_LONG_MAX='defined _LP64'; AC_SUBST([INT64_MAX_EQ_LONG_MAX]) PRIPTR_PREFIX=__PRIPTR_PREFIX; AC_SUBST([PRIPTR_PREFIX]) UINT32_MAX_LT_UINTMAX_MAX=1; AC_SUBST([UINT32_MAX_LT_UINTMAX_MAX]) UINT64_MAX_EQ_ULONG_MAX='defined _LP64'; AC_SUBST([UINT64_MAX_EQ_ULONG_MAX]) ]) grub-2.14~git20250718.0e36779/m4/ctype_h.m40000644000175000017500000000322715036447602014226 00000000000000# ctype_h.m4 serial 9 dnl Copyright (C) 2009-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN_ONCE([gl_CTYPE_H], [ AC_REQUIRE([gl_CTYPE_H_DEFAULTS]) dnl is always overridden, because of GNULIB_POSIXCHECK. gl_NEXT_HEADERS([ctype.h]) dnl Check for declarations of anything we want to poison if the dnl corresponding gnulib module is not in use. gl_WARN_ON_USE_PREPARE([[#include ]], [isblank]) ]) # gl_CTYPE_MODULE_INDICATOR([modulename]) # sets the shell variable that indicates the presence of the given module # to a C preprocessor expression that will evaluate to 1. # This macro invocation must not occur in macros that are AC_REQUIREd. AC_DEFUN([gl_CTYPE_MODULE_INDICATOR], [ dnl Ensure to expand the default settings once only. gl_CTYPE_H_REQUIRE_DEFAULTS gl_MODULE_INDICATOR_SET_VARIABLE([$1]) ]) # Initializes the default values for AC_SUBSTed shell variables. # This macro must not be AC_REQUIREd. It must only be invoked, and only # outside of macros or in macros that are not AC_REQUIREd. AC_DEFUN([gl_CTYPE_H_REQUIRE_DEFAULTS], [ m4_defun(GL_MODULE_INDICATOR_PREFIX[_CTYPE_H_MODULE_INDICATOR_DEFAULTS], [ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ISBLANK]) ]) m4_require(GL_MODULE_INDICATOR_PREFIX[_CTYPE_H_MODULE_INDICATOR_DEFAULTS]) AC_REQUIRE([gl_CTYPE_H_DEFAULTS]) ]) AC_DEFUN([gl_CTYPE_H_DEFAULTS], [ dnl Assume proper GNU behavior unless another module says otherwise. HAVE_ISBLANK=1; AC_SUBST([HAVE_ISBLANK]) ]) grub-2.14~git20250718.0e36779/m4/double-slash-root.m40000644000175000017500000000312515036447602016133 00000000000000# double-slash-root.m4 serial 4 -*- Autoconf -*- dnl Copyright (C) 2006, 2008-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_DOUBLE_SLASH_ROOT], [ AC_REQUIRE([AC_CANONICAL_HOST]) AC_CACHE_CHECK([whether // is distinct from /], [gl_cv_double_slash_root], [ if test x"$cross_compiling" = xyes ; then # When cross-compiling, there is no way to tell whether // is special # short of a list of hosts. However, the only known hosts to date # that have a distinct // are Apollo DomainOS (too old to port to), # Cygwin, and z/OS. If anyone knows of another system for which // has # special semantics and is distinct from /, please report it to # . case $host in *-cygwin | i370-ibm-openedition) gl_cv_double_slash_root=yes ;; *) # Be optimistic and assume that / and // are the same when we # don't know. gl_cv_double_slash_root='unknown, assuming no' ;; esac else set x `ls -di / // 2>/dev/null` if test "$[2]" = "$[4]" && wc //dev/null >/dev/null 2>&1; then gl_cv_double_slash_root=no else gl_cv_double_slash_root=yes fi fi]) if test "$gl_cv_double_slash_root" = yes; then AC_DEFINE([DOUBLE_SLASH_IS_DISTINCT_ROOT], [1], [Define to 1 if // is a file system root distinct from /.]) fi ]) grub-2.14~git20250718.0e36779/m4/errno_h.m40000644000175000017500000000564215036447602014232 00000000000000# errno_h.m4 serial 14 dnl Copyright (C) 2004, 2006, 2008-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_PREREQ([2.61]) AC_DEFUN_ONCE([gl_HEADER_ERRNO_H], [ AC_REQUIRE([AC_PROG_CC]) AC_CACHE_CHECK([for complete errno.h], [gl_cv_header_errno_h_complete], [ AC_EGREP_CPP([booboo],[ #include #if !defined ETXTBSY booboo #endif #if !defined ENOMSG booboo #endif #if !defined EIDRM booboo #endif #if !defined ENOLINK booboo #endif #if !defined EPROTO booboo #endif #if !defined EMULTIHOP booboo #endif #if !defined EBADMSG booboo #endif #if !defined EOVERFLOW booboo #endif #if !defined ENOTSUP booboo #endif #if !defined ENETRESET booboo #endif #if !defined ECONNABORTED booboo #endif #if !defined ESTALE booboo #endif #if !defined EDQUOT booboo #endif #if !defined ECANCELED booboo #endif #if !defined EOWNERDEAD booboo #endif #if !defined ENOTRECOVERABLE booboo #endif #if !defined EILSEQ booboo #endif ], [gl_cv_header_errno_h_complete=no], [gl_cv_header_errno_h_complete=yes]) ]) if test $gl_cv_header_errno_h_complete = yes; then GL_GENERATE_ERRNO_H=false else gl_NEXT_HEADERS([errno.h]) GL_GENERATE_ERRNO_H=true fi gl_REPLACE_ERRNO_VALUE([EMULTIHOP]) gl_REPLACE_ERRNO_VALUE([ENOLINK]) gl_REPLACE_ERRNO_VALUE([EOVERFLOW]) ]) # Assuming $1 = EOVERFLOW. # The EOVERFLOW errno value ought to be defined in , according to # POSIX. But some systems (like OpenBSD 4.0 or AIX 3) don't define it, and # some systems (like OSF/1) define it when _XOPEN_SOURCE_EXTENDED is defined. # Check for the value of EOVERFLOW. # Set the variables EOVERFLOW_HIDDEN and EOVERFLOW_VALUE. AC_DEFUN([gl_REPLACE_ERRNO_VALUE], [ if $GL_GENERATE_ERRNO_H; then AC_CACHE_CHECK([for ]$1[ value], [gl_cv_header_errno_h_]$1, [ AC_EGREP_CPP([yes],[ #include #ifdef ]$1[ yes #endif ], [gl_cv_header_errno_h_]$1[=yes], [gl_cv_header_errno_h_]$1[=no]) if test $gl_cv_header_errno_h_]$1[ = no; then AC_EGREP_CPP([yes],[ #define _XOPEN_SOURCE_EXTENDED 1 #include #ifdef ]$1[ yes #endif ], [gl_cv_header_errno_h_]$1[=hidden]) if test $gl_cv_header_errno_h_]$1[ = hidden; then dnl The macro exists but is hidden. dnl Define it to the same value. AC_COMPUTE_INT([gl_cv_header_errno_h_]$1, $1, [ #define _XOPEN_SOURCE_EXTENDED 1 #include /* The following two lines are a workaround against an autoconf-2.52 bug. */ #include #include ]) fi fi ]) case $gl_cv_header_errno_h_]$1[ in yes | no) ]$1[_HIDDEN=0; ]$1[_VALUE= ;; *) ]$1[_HIDDEN=1; ]$1[_VALUE="$gl_cv_header_errno_h_]$1[" ;; esac AC_SUBST($1[_HIDDEN]) AC_SUBST($1[_VALUE]) fi ]) grub-2.14~git20250718.0e36779/m4/progtest.m40000644000175000017500000000604015036447570014442 00000000000000# progtest.m4 serial 7 (gettext-0.18.2) dnl Copyright (C) 1996-2003, 2005, 2008-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1996. AC_PREREQ([2.50]) # Search path for a program which passes the given test. dnl AM_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR, dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]]) AC_DEFUN([AM_PATH_PROG_WITH_TEST], [ # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which # contains only /bin. Note that ksh looks also at the FPATH variable, # so we have to set that as well for the test. PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \ && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \ || PATH_SEPARATOR=';' } fi # Find out how to test for executable files. Don't use a zero-byte file, # as systems may use methods other than mode bits to determine executability. cat >conf$$.file <<_ASEOF #! /bin/sh exit 0 _ASEOF chmod +x conf$$.file if test -x conf$$.file >/dev/null 2>&1; then ac_executable_p="test -x" else ac_executable_p="test -f" fi rm -f conf$$.file # Extract the first word of "$2", so it can be a program name with args. set dummy $2; ac_word=[$]2 AC_MSG_CHECKING([for $ac_word]) AC_CACHE_VAL([ac_cv_path_$1], [case "[$]$1" in [[\\/]]* | ?:[[\\/]]*) ac_cv_path_$1="[$]$1" # Let the user override the test with a path. ;; *) ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in ifelse([$5], , $PATH, [$5]); do IFS="$ac_save_IFS" test -z "$ac_dir" && ac_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then echo "$as_me: trying $ac_dir/$ac_word..." >&AS_MESSAGE_LOG_FD if [$3]; then ac_cv_path_$1="$ac_dir/$ac_word$ac_exec_ext" break 2 fi fi done done IFS="$ac_save_IFS" dnl If no 4th arg is given, leave the cache variable unset, dnl so AC_PATH_PROGS will keep looking. ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4" ])dnl ;; esac])dnl $1="$ac_cv_path_$1" if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then AC_MSG_RESULT([$][$1]) else AC_MSG_RESULT([no]) fi AC_SUBST([$1])dnl ]) grub-2.14~git20250718.0e36779/m4/realloc.m40000644000175000017500000000433515036447602014215 00000000000000# realloc.m4 serial 26 dnl Copyright (C) 2007, 2009-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. # This is adapted with modifications from upstream Autoconf here: # https://git.savannah.gnu.org/cgit/autoconf.git/tree/lib/autoconf/functions.m4?id=v2.70#n1455 AC_DEFUN([_AC_FUNC_REALLOC_IF], [ AC_REQUIRE([AC_CANONICAL_HOST])dnl for cross-compiles AC_CACHE_CHECK([whether realloc (0, 0) returns nonnull], [ac_cv_func_realloc_0_nonnull], [AC_RUN_IFELSE( [AC_LANG_PROGRAM( [[#include ]], [[void *p = realloc (0, 0); int result = !p; free (p); return result;]]) ], [ac_cv_func_realloc_0_nonnull=yes], [ac_cv_func_realloc_0_nonnull=no], [case "$host_os" in # Guess yes on platforms where we know the result. *-gnu* | freebsd* | netbsd* | openbsd* | bitrig* \ | gnu* | *-musl* | midnightbsd* \ | hpux* | solaris* | cygwin* | mingw* | msys* ) ac_cv_func_realloc_0_nonnull="guessing yes" ;; # If we don't know, obey --enable-cross-guesses. *) ac_cv_func_realloc_0_nonnull="$gl_cross_guess_normal" ;; esac ]) ]) AS_CASE([$ac_cv_func_realloc_0_nonnull], [*yes], [$1], [$2]) ])# AC_FUNC_REALLOC # gl_FUNC_REALLOC_GNU # ------------------- # Replace realloc if it is not compatible with GNU libc. AC_DEFUN([gl_FUNC_REALLOC_GNU], [ AC_REQUIRE([gl_STDLIB_H_DEFAULTS]) AC_REQUIRE([gl_FUNC_REALLOC_POSIX]) if test $REPLACE_REALLOC_FOR_REALLOC_GNU = 0; then _AC_FUNC_REALLOC_IF([], [REPLACE_REALLOC_FOR_REALLOC_GNU=1]) fi ])# gl_FUNC_REALLOC_GNU # gl_FUNC_REALLOC_POSIX # --------------------- # Test whether 'realloc' is POSIX compliant (sets errno to ENOMEM when it # fails, and doesn't mess up with ptrdiff_t overflow), # and replace realloc if it is not. AC_DEFUN([gl_FUNC_REALLOC_POSIX], [ AC_REQUIRE([gl_STDLIB_H_DEFAULTS]) AC_REQUIRE([gl_FUNC_MALLOC_POSIX]) if test $REPLACE_MALLOC_FOR_MALLOC_POSIX = 1; then REPLACE_REALLOC_FOR_REALLOC_POSIX=1 fi ]) grub-2.14~git20250718.0e36779/m4/strerror.m40000644000175000017500000000720315036447602014453 00000000000000# strerror.m4 serial 23 dnl Copyright (C) 2002, 2007-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_STRERROR], [ AC_REQUIRE([gl_STRING_H_DEFAULTS]) AC_REQUIRE([gl_HEADER_ERRNO_H]) AC_REQUIRE([gl_FUNC_STRERROR_0]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles m4_ifdef([gl_FUNC_STRERROR_R_WORKS], [ AC_REQUIRE([gl_FUNC_STRERROR_R_WORKS]) ]) if test "$GL_GENERATE_ERRNO_H:$REPLACE_STRERROR_0" = false:0; then AC_CACHE_CHECK([for working strerror function], [gl_cv_func_working_strerror], [AC_RUN_IFELSE( [AC_LANG_PROGRAM( [[#include ]], [[if (!*strerror (-2)) return 1;]])], [gl_cv_func_working_strerror=yes], [gl_cv_func_working_strerror=no], [case "$host_os" in # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_working_strerror="guessing yes" ;; # Guess yes on musl systems. *-musl*) gl_cv_func_working_strerror="guessing yes" ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_working_strerror="$gl_cross_guess_normal" ;; esac ]) ]) case "$gl_cv_func_working_strerror" in *yes) ;; *) dnl The system's strerror() fails to return a string for out-of-range dnl integers. Replace it. REPLACE_STRERROR=1 ;; esac m4_ifdef([gl_FUNC_STRERROR_R_WORKS], [ dnl If the system's strerror_r or __xpg_strerror_r clobbers strerror's dnl buffer, we must replace strerror. case "$gl_cv_func_strerror_r_works" in *no) REPLACE_STRERROR=1 ;; esac ]) else dnl The system's strerror() cannot know about the new errno values we add dnl to , or any fix for strerror(0). Replace it. REPLACE_STRERROR=1 fi ]) dnl Detect if strerror(0) passes (that is, does not set errno, and does not dnl return a string that matches strerror(-1)). AC_DEFUN([gl_FUNC_STRERROR_0], [ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles REPLACE_STRERROR_0=0 AC_CACHE_CHECK([whether strerror(0) succeeds], [gl_cv_func_strerror_0_works], [AC_RUN_IFELSE( [AC_LANG_PROGRAM( [[#include #include ]], [[int result = 0; char *str; errno = 0; str = strerror (0); if (!*str) result |= 1; if (errno) result |= 2; if (strstr (str, "nknown") || strstr (str, "ndefined")) result |= 4; return result;]])], [gl_cv_func_strerror_0_works=yes], [gl_cv_func_strerror_0_works=no], [case "$host_os" in # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_strerror_0_works="guessing yes" ;; # Guess yes on musl systems. *-musl*) gl_cv_func_strerror_0_works="guessing yes" ;; # Guess yes on native Windows. mingw*) gl_cv_func_strerror_0_works="guessing yes" ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_strerror_0_works="$gl_cross_guess_normal" ;; esac ]) ]) case "$gl_cv_func_strerror_0_works" in *yes) ;; *) REPLACE_STRERROR_0=1 AC_DEFINE([REPLACE_STRERROR_0], [1], [Define to 1 if strerror(0) does not return a message implying success.]) ;; esac ]) grub-2.14~git20250718.0e36779/m4/wctype_h.m40000644000175000017500000001444415036447602014420 00000000000000# wctype_h.m4 serial 30 dnl A placeholder for ISO C99 , for platforms that lack it. dnl Copyright (C) 2006-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl Written by Paul Eggert. AC_DEFUN_ONCE([gl_WCTYPE_H], [ AC_REQUIRE([gl_WCTYPE_H_DEFAULTS]) AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) AC_CHECK_FUNCS_ONCE([iswcntrl]) if test $ac_cv_func_iswcntrl = yes; then HAVE_ISWCNTRL=1 else HAVE_ISWCNTRL=0 fi AC_SUBST([HAVE_ISWCNTRL]) AC_REQUIRE([gt_TYPE_WINT_T]) if test $gt_cv_c_wint_t = yes; then HAVE_WINT_T=1 else HAVE_WINT_T=0 fi AC_SUBST([HAVE_WINT_T]) AC_REQUIRE([gl_TYPE_WINT_T_PREREQ]) gl_CHECK_NEXT_HEADERS([wctype.h]) if test $ac_cv_header_wctype_h = yes; then if test $ac_cv_func_iswcntrl = yes; then dnl Linux libc5 has an iswprint function that returns 0 for all arguments. dnl The other functions are likely broken in the same way. AC_CACHE_CHECK([whether iswcntrl works], [gl_cv_func_iswcntrl_works], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include int main () { return iswprint ('x') == 0; } ]])], [gl_cv_func_iswcntrl_works=yes], [gl_cv_func_iswcntrl_works=no], [dnl Guess no on Linux libc5, yes otherwise. AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include #if __GNU_LIBRARY__ == 1 Linux libc5 i18n is broken. #endif]], [[]])], [gl_cv_func_iswcntrl_works="guessing yes"], [gl_cv_func_iswcntrl_works="guessing no"]) ]) ]) fi HAVE_WCTYPE_H=1 else HAVE_WCTYPE_H=0 fi AC_SUBST([HAVE_WCTYPE_H]) if test $GNULIBHEADERS_OVERRIDE_WINT_T = 1; then REPLACE_ISWCNTRL=1 else case "$gl_cv_func_iswcntrl_works" in *yes) REPLACE_ISWCNTRL=0 ;; *) REPLACE_ISWCNTRL=1 ;; esac fi AC_SUBST([REPLACE_ISWCNTRL]) if test $HAVE_ISWCNTRL = 0 || test $REPLACE_ISWCNTRL = 1; then dnl Redefine all of iswcntrl, ..., iswxdigit in . : fi if test $REPLACE_ISWCNTRL = 1; then REPLACE_TOWLOWER=1 else AC_CHECK_FUNCS([towlower]) if test $ac_cv_func_towlower = yes; then REPLACE_TOWLOWER=0 else AC_CHECK_DECLS([towlower],,, [[#include #if HAVE_WCTYPE_H # include #endif ]]) if test $ac_cv_have_decl_towlower = yes; then dnl On Minix 3.1.8, the system's declares towlower() and dnl towupper() although it does not have the functions. Avoid a dnl collision with gnulib's replacement. REPLACE_TOWLOWER=1 else REPLACE_TOWLOWER=0 fi fi fi AC_SUBST([REPLACE_TOWLOWER]) if test $HAVE_ISWCNTRL = 0 || test $REPLACE_TOWLOWER = 1; then dnl Redefine towlower, towupper in . : fi dnl We assume that the wctype() and iswctype() functions exist if and only dnl if the type wctype_t is defined in or in if that dnl exists. dnl HP-UX 11.00 declares all these in and lacks . AC_CACHE_CHECK([for wctype_t], [gl_cv_type_wctype_t], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#include #if HAVE_WCTYPE_H # include #endif wctype_t a; ]], [[]])], [gl_cv_type_wctype_t=yes], [gl_cv_type_wctype_t=no]) ]) if test $gl_cv_type_wctype_t = no; then HAVE_WCTYPE_T=0 fi dnl We assume that the wctrans() and towctrans() functions exist if and only dnl if the type wctrans_t is defined in . AC_CACHE_CHECK([for wctrans_t], [gl_cv_type_wctrans_t], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#include #include wctrans_t a; ]], [[]])], [gl_cv_type_wctrans_t=yes], [gl_cv_type_wctrans_t=no]) ]) if test $gl_cv_type_wctrans_t = no; then HAVE_WCTRANS_T=0 fi dnl Check for declarations of anything we want to poison if the dnl corresponding gnulib module is not in use. gl_WARN_ON_USE_PREPARE([[ #if !(defined __GLIBC__ && !defined __UCLIBC__) # include #endif #include ]], [wctype iswctype wctrans towctrans ]) ]) # gl_WCTYPE_MODULE_INDICATOR([modulename]) # sets the shell variable that indicates the presence of the given module # to a C preprocessor expression that will evaluate to 1. # This macro invocation must not occur in macros that are AC_REQUIREd. AC_DEFUN([gl_WCTYPE_MODULE_INDICATOR], [ dnl Ensure to expand the default settings once only. gl_WCTYPE_H_REQUIRE_DEFAULTS gl_MODULE_INDICATOR_SET_VARIABLE([$1]) dnl Define it also as a C macro, for the benefit of the unit tests. gl_MODULE_INDICATOR_FOR_TESTS([$1]) ]) # Initializes the default values for AC_SUBSTed shell variables. # This macro must not be AC_REQUIREd. It must only be invoked, and only # outside of macros or in macros that are not AC_REQUIREd. AC_DEFUN([gl_WCTYPE_H_REQUIRE_DEFAULTS], [ m4_defun(GL_MODULE_INDICATOR_PREFIX[_WCTYPE_H_MODULE_INDICATOR_DEFAULTS], [ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ISWBLANK]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ISWDIGIT]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ISWXDIGIT]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCTYPE]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ISWCTYPE]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCTRANS]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_TOWCTRANS]) ]) m4_require(GL_MODULE_INDICATOR_PREFIX[_WCTYPE_H_MODULE_INDICATOR_DEFAULTS]) AC_REQUIRE([gl_WCTYPE_H_DEFAULTS]) ]) AC_DEFUN([gl_WCTYPE_H_DEFAULTS], [ dnl Assume proper GNU behavior unless another module says otherwise. HAVE_ISWBLANK=1; AC_SUBST([HAVE_ISWBLANK]) HAVE_WCTYPE_T=1; AC_SUBST([HAVE_WCTYPE_T]) HAVE_WCTRANS_T=1; AC_SUBST([HAVE_WCTRANS_T]) REPLACE_ISWBLANK=0; AC_SUBST([REPLACE_ISWBLANK]) REPLACE_ISWDIGIT=0; AC_SUBST([REPLACE_ISWDIGIT]) REPLACE_ISWXDIGIT=0; AC_SUBST([REPLACE_ISWXDIGIT]) ]) grub-2.14~git20250718.0e36779/m4/btowc.m40000644000175000017500000000545715036447602013720 00000000000000# btowc.m4 serial 12 dnl Copyright (C) 2008-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_BTOWC], [ AC_REQUIRE([gl_WCHAR_H_DEFAULTS]) dnl Check whether is usable at all, first. Otherwise the test dnl program below may lead to an endless loop. See dnl . AC_REQUIRE([gl_WCHAR_H_INLINE_OK]) AC_CHECK_FUNCS_ONCE([btowc]) if test $ac_cv_func_btowc = no; then HAVE_BTOWC=0 else AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([gt_LOCALE_FR]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles dnl Cygwin 1.7.2 btowc('\0') is WEOF, not 0. AC_CACHE_CHECK([whether btowc(0) is correct], [gl_cv_func_btowc_nul], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include int main () { if (btowc ('\0') != 0) return 1; return 0; }]])], [gl_cv_func_btowc_nul=yes], [gl_cv_func_btowc_nul=no], [ changequote(,)dnl case "$host_os" in # Guess no on Cygwin. cygwin*) gl_cv_func_btowc_nul="guessing no" ;; # Guess yes on native Windows. mingw*) gl_cv_func_btowc_nul="guessing yes" ;; # Guess yes otherwise. *) gl_cv_func_btowc_nul="guessing yes" ;; esac changequote([,])dnl ]) ]) dnl IRIX 6.5 btowc(EOF) is 0xFF, not WEOF. AC_CACHE_CHECK([whether btowc(EOF) is correct], [gl_cv_func_btowc_eof], [ dnl Initial guess, used when cross-compiling or when no suitable locale dnl is present. changequote(,)dnl case "$host_os" in # Guess no on IRIX. irix*) gl_cv_func_btowc_eof="guessing no" ;; # Guess yes on native Windows. mingw*) gl_cv_func_btowc_eof="guessing yes" ;; # Guess yes otherwise. *) gl_cv_func_btowc_eof="guessing yes" ;; esac changequote([,])dnl if test $LOCALE_FR != none; then AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include #include int main () { if (setlocale (LC_ALL, "$LOCALE_FR") != NULL) { if (btowc (EOF) != WEOF) return 1; } return 0; }]])], [gl_cv_func_btowc_eof=yes], [gl_cv_func_btowc_eof=no], [:]) fi ]) case "$gl_cv_func_btowc_nul" in *yes) ;; *) REPLACE_BTOWC=1 ;; esac case "$gl_cv_func_btowc_eof" in *yes) ;; *) REPLACE_BTOWC=1 ;; esac fi ]) # Prerequisites of lib/btowc.c. AC_DEFUN([gl_PREREQ_BTOWC], [ : ]) grub-2.14~git20250718.0e36779/m4/sys_types_h.m40000644000175000017500000000436115036447602015144 00000000000000# sys_types_h.m4 serial 13 dnl Copyright (C) 2011-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN_ONCE([gl_SYS_TYPES_H], [ AC_REQUIRE([gl_SYS_TYPES_H_DEFAULTS]) dnl Use sane struct stat types in OpenVMS 8.2 and later. AC_DEFINE([_USE_STD_STAT], 1, [For standard stat data types on VMS.]) gl_NEXT_HEADERS([sys/types.h]) dnl Ensure the type pid_t gets defined. AC_REQUIRE([AC_TYPE_PID_T]) dnl Ensure the type mode_t gets defined. AC_REQUIRE([AC_TYPE_MODE_T]) dnl Whether to override the 'off_t' type. AC_REQUIRE([gl_TYPE_OFF_T]) dnl Whether to override the 'dev_t' and 'ino_t' types. m4_ifdef([gl_WINDOWS_STAT_INODES], [ AC_REQUIRE([gl_WINDOWS_STAT_INODES]) ], [ WINDOWS_STAT_INODES=0 ]) AC_SUBST([WINDOWS_STAT_INODES]) ]) # Initializes the default values for AC_SUBSTed shell variables. # This macro must not be AC_REQUIREd. It must only be invoked, and only # outside of macros or in macros that are not AC_REQUIREd. AC_DEFUN([gl_SYS_TYPES_H_REQUIRE_DEFAULTS], [ m4_defun(GL_MODULE_INDICATOR_PREFIX[_SYS_TYPE_H_MODULE_INDICATOR_DEFAULTS], [ ]) m4_require(GL_MODULE_INDICATOR_PREFIX[_SYS_TYPE_H_MODULE_INDICATOR_DEFAULTS]) AC_REQUIRE([gl_SYS_TYPES_H_DEFAULTS]) ]) AC_DEFUN([gl_SYS_TYPES_H_DEFAULTS], [ ]) # This works around a buggy version in autoconf <= 2.69. # See # The 2.70 version isn't quoted properly, so override it too. m4_version_prereq([2.70.1], [], [ m4_undefine([AC_HEADER_MAJOR]) AC_DEFUN([AC_HEADER_MAJOR], [AC_CHECK_HEADERS_ONCE([sys/types.h]) AC_CHECK_HEADER([sys/mkdev.h], [AC_DEFINE([MAJOR_IN_MKDEV], [1], [Define to 1 if `major', `minor', and `makedev' are declared in .])]) if test $ac_cv_header_sys_mkdev_h = no; then AC_CHECK_HEADER([sys/sysmacros.h], [AC_DEFINE([MAJOR_IN_SYSMACROS], [1], [Define to 1 if `major', `minor', and `makedev' are declared in .])]) fi ])# AC_HEADER_MAJOR ]) grub-2.14~git20250718.0e36779/m4/printf-posix.m40000644000175000017500000000305315036447570015236 00000000000000# printf-posix.m4 serial 6 (gettext-0.18.2) dnl Copyright (C) 2003, 2007, 2009-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. dnl Test whether the printf() function supports POSIX/XSI format strings with dnl positions. AC_DEFUN([gt_PRINTF_POSIX], [ AC_REQUIRE([AC_PROG_CC]) AC_CACHE_CHECK([whether printf() supports POSIX/XSI format strings], gt_cv_func_printf_posix, [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include /* The string "%2$d %1$d", with dollar characters protected from the shell's dollar expansion (possibly an autoconf bug). */ static char format[] = { '%', '2', '$', 'd', ' ', '%', '1', '$', 'd', '\0' }; static char buf[100]; int main () { sprintf (buf, format, 33, 55); return (strcmp (buf, "55 33") != 0); }]])], [gt_cv_func_printf_posix=yes], [gt_cv_func_printf_posix=no], [ AC_EGREP_CPP([notposix], [ #if defined __NetBSD__ || defined __BEOS__ || defined _MSC_VER || defined __MINGW32__ || defined __CYGWIN__ notposix #endif ], [gt_cv_func_printf_posix="guessing no"], [gt_cv_func_printf_posix="guessing yes"]) ]) ]) case $gt_cv_func_printf_posix in *yes) AC_DEFINE([HAVE_POSIX_PRINTF], [1], [Define if your printf() function supports format strings with positions.]) ;; esac ]) grub-2.14~git20250718.0e36779/m4/threadlib.m40000644000175000017500000006025315036447602014533 00000000000000# threadlib.m4 serial 32 dnl Copyright (C) 2005-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. AC_PREREQ([2.60]) dnl The general structure of the multithreading modules in gnulib is that we dnl have three set of modules: dnl dnl * POSIX API: dnl pthread, which combines dnl pthread-h dnl pthread-thread dnl pthread-once dnl pthread-mutex dnl pthread-rwlock dnl pthread-cond dnl pthread-tss dnl pthread-spin dnl sched_yield dnl dnl * ISO C API: dnl threads, which combines dnl threads-h dnl thrd dnl mtx dnl cnd dnl tss dnl dnl * Gnulib API, with an implementation that can be chosen at configure dnl time through the option --enable-threads=... dnl thread dnl lock dnl cond dnl tls dnl yield dnl dnl They are independent, except for the fact that dnl - the implementation of the ISO C API may use the POSIX (or some other dnl platform dependent) API, dnl - the implementation of the Gnulib API may use the POSIX or ISO C or dnl some other platform dependent API, depending on the --enable-threads dnl option. dnl dnl This file contains macros for all of these APIs! dnl ============================================================================ dnl Macros for all thread APIs AC_DEFUN([gl_ANYTHREADLIB_EARLY], [ AC_REQUIRE([AC_CANONICAL_HOST]) if test -z "$gl_anythreadlib_early_done"; then case "$host_os" in osf*) # On OSF/1, the compiler needs the flag -D_REENTRANT so that it # groks . cc also understands the flag -pthread, but # we don't use it because 1. gcc-2.95 doesn't understand -pthread, # 2. putting a flag into CPPFLAGS that has an effect on the linker # causes the AC_LINK_IFELSE test below to succeed unexpectedly, # leading to wrong values of LIBTHREAD and LTLIBTHREAD. CPPFLAGS="$CPPFLAGS -D_REENTRANT" ;; esac # Some systems optimize for single-threaded programs by default, and # need special flags to disable these optimizations. For example, the # definition of 'errno' in . case "$host_os" in aix* | freebsd*) CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE" ;; solaris*) CPPFLAGS="$CPPFLAGS -D_REENTRANT" ;; esac gl_anythreadlib_early_done=done fi ]) dnl Checks whether the compiler and linker support weak declarations of symbols. AC_DEFUN([gl_WEAK_SYMBOLS], [ AC_REQUIRE([AC_CANONICAL_HOST]) AC_CACHE_CHECK([whether imported symbols can be declared weak], [gl_cv_have_weak], [case "$host_os" in cygwin*) dnl On Cygwin 3.2.0 with gcc 10.2, the test below would succeed, but dnl programs that use pthread_in_use() with weak symbol references dnl crash miserably at runtime. gl_cv_have_weak="guessing no" ;; *) gl_cv_have_weak=no dnl First, test whether the compiler accepts it syntactically. AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[extern void xyzzy (); #pragma weak xyzzy]], [[xyzzy();]])], [gl_cv_have_weak=maybe]) if test $gl_cv_have_weak = maybe; then dnl Second, test whether it actually works. On Cygwin 1.7.2, with dnl gcc 4.3, symbols declared weak always evaluate to the address 0. AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #pragma weak fputs int main () { return (fputs == NULL); }]])], [gl_cv_have_weak=yes], [gl_cv_have_weak=no], [dnl When cross-compiling, assume that only ELF platforms support dnl weak symbols. AC_EGREP_CPP([Extensible Linking Format], [#ifdef __ELF__ Extensible Linking Format #endif ], [gl_cv_have_weak="guessing yes"], [gl_cv_have_weak="guessing no"]) ]) fi ;; esac dnl But when linking statically, weak symbols don't work. case " $LDFLAGS " in *" -static "*) gl_cv_have_weak=no ;; esac dnl Test for a bug in FreeBSD 11: A link error occurs when using a weak dnl symbol and linking against a shared library that has a dependency on dnl the shared library that defines the symbol. case "$gl_cv_have_weak" in *yes) case "$host_os" in freebsd* | dragonfly* | midnightbsd*) : > conftest1.c $CC $CPPFLAGS $CFLAGS $LDFLAGS -fPIC -shared -o libempty.so conftest1.c -lpthread >&AS_MESSAGE_LOG_FD 2>&1 cat < conftest2.c #include #pragma weak pthread_mutexattr_gettype int main () { return (pthread_mutexattr_gettype != NULL); } EOF $CC $CPPFLAGS $CFLAGS $LDFLAGS -o conftest conftest2.c libempty.so >&AS_MESSAGE_LOG_FD 2>&1 \ || gl_cv_have_weak=no rm -f conftest1.c libempty.so conftest2.c conftest ;; esac ;; esac ]) case "$gl_cv_have_weak" in *yes) AC_DEFINE([HAVE_WEAK_SYMBOLS], [1], [Define to 1 if the compiler and linker support weak declarations of symbols.]) ;; esac ]) dnl ============================================================================ dnl Macros for the POSIX API dnl gl_PTHREADLIB dnl ------------- dnl Tests for the libraries needs for using the POSIX threads API. dnl Sets the variable LIBPTHREAD to the linker options for use in a Makefile. dnl Sets the variable LIBPMULTITHREAD, for programs that really need dnl multithread functionality. The difference between LIBPTHREAD and dnl LIBPMULTITHREAD is that on platforms supporting weak symbols, typically dnl LIBPTHREAD is empty whereas LIBPMULTITHREAD is not. dnl Sets the variable LIB_SCHED_YIELD to the linker options needed to use the dnl sched_yield() function. dnl Adds to CPPFLAGS the flag -D_REENTRANT or -D_THREAD_SAFE if needed for dnl multithread-safe programs. dnl Defines the C macro HAVE_PTHREAD_API if (at least parts of) the POSIX dnl threads API is available. dnl The guts of gl_PTHREADLIB. Needs to be expanded only once. AC_DEFUN([gl_PTHREADLIB_BODY], [ AC_REQUIRE([gl_ANYTHREADLIB_EARLY]) if test -z "$gl_pthreadlib_body_done"; then gl_pthread_api=no LIBPTHREAD= LIBPMULTITHREAD= # On OSF/1, the compiler needs the flag -pthread or -D_REENTRANT so that # it groks . It's added above, in gl_ANYTHREADLIB_EARLY. AC_CHECK_HEADER([pthread.h], [gl_have_pthread_h=yes], [gl_have_pthread_h=no]) if test "$gl_have_pthread_h" = yes; then # Other possible tests: # -lpthreads (FSU threads, PCthreads) # -lgthreads # Test whether both pthread_mutex_lock and pthread_mutexattr_init exist # in libc. IRIX 6.5 has the first one in both libc and libpthread, but # the second one only in libpthread, and lock.c needs it. # # If -pthread works, prefer it to -lpthread, since Ubuntu 14.04 # needs -pthread for some reason. See: # https://lists.gnu.org/r/bug-gnulib/2014-09/msg00023.html save_LIBS=$LIBS for gl_pthread in '' '-pthread'; do LIBS="$LIBS $gl_pthread" AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[#include pthread_mutex_t m; pthread_mutexattr_t ma; ]], [[pthread_mutex_lock (&m); pthread_mutexattr_init (&ma);]])], [gl_pthread_api=yes LIBPTHREAD=$gl_pthread LIBPMULTITHREAD=$gl_pthread]) LIBS=$save_LIBS test $gl_pthread_api = yes && break done echo "$as_me:__oline__: gl_pthread_api=$gl_pthread_api" >&AS_MESSAGE_LOG_FD echo "$as_me:__oline__: LIBPTHREAD=$LIBPTHREAD" >&AS_MESSAGE_LOG_FD gl_pthread_in_glibc=no # On Linux with glibc >= 2.34, libc contains the fully functional # pthread functions. case "$host_os" in linux*) AC_EGREP_CPP([Lucky user], [#include #ifdef __GNU_LIBRARY__ #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 34) || (__GLIBC__ > 2) Lucky user #endif #endif ], [gl_pthread_in_glibc=yes], []) ;; esac echo "$as_me:__oline__: gl_pthread_in_glibc=$gl_pthread_in_glibc" >&AS_MESSAGE_LOG_FD # Test for libpthread by looking for pthread_kill. (Not pthread_self, # since it is defined as a macro on OSF/1.) if test $gl_pthread_api = yes && test -z "$LIBPTHREAD"; then # The program links fine without libpthread. But it may actually # need to link with libpthread in order to create multiple threads. AC_CHECK_LIB([pthread], [pthread_kill], [if test $gl_pthread_in_glibc = yes; then LIBPMULTITHREAD= else LIBPMULTITHREAD=-lpthread # On Solaris and HP-UX, most pthread functions exist also in libc. # Therefore pthread_in_use() needs to actually try to create a # thread: pthread_create from libc will fail, whereas # pthread_create will actually create a thread. # On Solaris 10 or newer, this test is no longer needed, because # libc contains the fully functional pthread functions. case "$host_os" in solaris | solaris2.[1-9] | solaris2.[1-9].* | hpux*) AC_DEFINE([PTHREAD_IN_USE_DETECTION_HARD], [1], [Define if the pthread_in_use() detection is hard.]) esac fi ]) elif test $gl_pthread_api != yes; then # Some library is needed. Try libpthread and libc_r. AC_CHECK_LIB([pthread], [pthread_kill], [gl_pthread_api=yes LIBPTHREAD=-lpthread LIBPMULTITHREAD=-lpthread]) if test $gl_pthread_api != yes; then # For FreeBSD 4. AC_CHECK_LIB([c_r], [pthread_kill], [gl_pthread_api=yes LIBPTHREAD=-lc_r LIBPMULTITHREAD=-lc_r]) fi fi echo "$as_me:__oline__: LIBPMULTITHREAD=$LIBPMULTITHREAD" >&AS_MESSAGE_LOG_FD fi AC_MSG_CHECKING([whether POSIX threads API is available]) AC_MSG_RESULT([$gl_pthread_api]) AC_SUBST([LIBPTHREAD]) AC_SUBST([LIBPMULTITHREAD]) if test $gl_pthread_api = yes; then AC_DEFINE([HAVE_PTHREAD_API], [1], [Define if you have the header and the POSIX threads API.]) fi dnl On some systems, sched_yield is in librt, rather than in libpthread. AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[#include ]], [[sched_yield ();]])], [LIB_SCHED_YIELD= ], [dnl Solaris 7...10 has sched_yield in librt, not in libpthread or libc. AC_CHECK_LIB([rt], [sched_yield], [LIB_SCHED_YIELD=-lrt], [dnl Solaris 2.5.1, 2.6 has sched_yield in libposix4, not librt. AC_CHECK_LIB([posix4], [sched_yield], [LIB_SCHED_YIELD=-lposix4])]) ]) AC_SUBST([LIB_SCHED_YIELD]) gl_pthreadlib_body_done=done fi ]) AC_DEFUN([gl_PTHREADLIB], [ AC_REQUIRE([gl_ANYTHREADLIB_EARLY]) gl_PTHREADLIB_BODY ]) dnl ============================================================================ dnl Macros for the ISO C API dnl gl_STDTHREADLIB dnl --------------- dnl Tests for the libraries needs for using the ISO C threads API. dnl Sets the variable LIBSTDTHREAD to the linker options for use in a Makefile. dnl Adds to CPPFLAGS the flag -D_REENTRANT or -D_THREAD_SAFE if needed for dnl multithread-safe programs. dnl Defines the C macro HAVE_THREADS_H if (at least parts of) the ISO C threads dnl API is available. dnl The guts of gl_STDTHREADLIB. Needs to be expanded only once. AC_DEFUN([gl_STDTHREADLIB_BODY], [ AC_REQUIRE([gl_ANYTHREADLIB_EARLY]) AC_REQUIRE([AC_CANONICAL_HOST]) if test -z "$gl_stdthreadlib_body_done"; then AC_CHECK_HEADERS_ONCE([threads.h]) case "$host_os" in mingw*) LIBSTDTHREAD= ;; *) gl_PTHREADLIB_BODY if test $ac_cv_header_threads_h = yes; then dnl glibc >= 2.29 has thrd_create in libpthread. dnl FreeBSD >= 10 has thrd_create in libstdthreads; this library depends dnl on libpthread (for the symbol 'pthread_mutexattr_gettype'). dnl glibc >= 2.34, AIX >= 7.1, and Solaris >= 11.4 have thrd_create in dnl libc. AC_CHECK_FUNCS([thrd_create]) if test $ac_cv_func_thrd_create = yes; then LIBSTDTHREAD= else AC_CHECK_LIB([stdthreads], [thrd_create], [ LIBSTDTHREAD='-lstdthreads -lpthread' ], [ dnl Guess that thrd_create is in libpthread. LIBSTDTHREAD="$LIBPMULTITHREAD" ]) fi else dnl Libraries needed by thrd.c, mtx.c, cnd.c, tss.c. LIBSTDTHREAD="$LIBPMULTITHREAD $LIB_SCHED_YIELD" fi ;; esac AC_SUBST([LIBSTDTHREAD]) AC_MSG_CHECKING([whether ISO C threads API is available]) AC_MSG_RESULT([$ac_cv_header_threads_h]) gl_stdthreadlib_body_done=done fi ]) AC_DEFUN([gl_STDTHREADLIB], [ AC_REQUIRE([gl_ANYTHREADLIB_EARLY]) gl_STDTHREADLIB_BODY ]) dnl ============================================================================ dnl Macros for the Gnulib API dnl gl_THREADLIB dnl ------------ dnl Tests for a multithreading library to be used. dnl If the configure.ac contains a definition of the gl_THREADLIB_DEFAULT_NO dnl (it must be placed before the invocation of gl_THREADLIB_EARLY!), then the dnl default is 'no', otherwise it is system dependent. In both cases, the user dnl can change the choice through the options --enable-threads=choice or dnl --disable-threads. dnl Defines at most one of the macros USE_ISOC_THREADS, USE_POSIX_THREADS, dnl USE_ISOC_AND_POSIX_THREADS, USE_WINDOWS_THREADS. dnl The choice --enable-threads=isoc+posix is available only on platforms that dnl have both the ISO C and the POSIX threads APIs. It has the effect of using dnl the ISO C API for most things and the POSIX API only for creating and dnl controlling threads (because there is no equivalent to pthread_atfork in dnl the ISO C API). dnl Sets the variables LIBTHREAD and LTLIBTHREAD to the linker options for use dnl in a Makefile (LIBTHREAD for use without libtool, LTLIBTHREAD for use with dnl libtool). dnl Sets the variables LIBMULTITHREAD and LTLIBMULTITHREAD similarly, for dnl programs that really need multithread functionality. The difference dnl between LIBTHREAD and LIBMULTITHREAD is that on platforms supporting weak dnl symbols, typically LIBTHREAD is empty whereas LIBMULTITHREAD is not. dnl Adds to CPPFLAGS the flag -D_REENTRANT or -D_THREAD_SAFE if needed for dnl multithread-safe programs. dnl Since support for GNU pth was removed, $LTLIBTHREAD and $LIBTHREAD have the dnl same value, and similarly $LTLIBMULTITHREAD and $LIBMULTITHREAD have the dnl same value. Only system libraries are needed. AC_DEFUN([gl_THREADLIB_EARLY], [ AC_REQUIRE([gl_THREADLIB_EARLY_BODY]) ]) dnl The guts of gl_THREADLIB_EARLY. Needs to be expanded only once. AC_DEFUN([gl_THREADLIB_EARLY_BODY], [ dnl Ordering constraints: This macro modifies CPPFLAGS in a way that dnl influences the result of the autoconf tests that test for *_unlocked dnl declarations, on AIX 5 at least. Therefore it must come early. AC_BEFORE([$0], [gl_FUNC_GLIBC_UNLOCKED_IO])dnl AC_BEFORE([$0], [gl_ARGP])dnl AC_REQUIRE([AC_CANONICAL_HOST]) dnl _GNU_SOURCE is needed for pthread_rwlock_t on glibc systems. AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) dnl Check for multithreading. m4_ifdef([gl_THREADLIB_DEFAULT_NO], [m4_divert_text([DEFAULTS], [gl_use_threads_default=no])], [m4_divert_text([DEFAULTS], [gl_use_threads_default=])]) m4_divert_text([DEFAULTS], [gl_use_winpthreads_default=]) AC_ARG_ENABLE([threads], AS_HELP_STRING([--enable-threads={isoc|posix|isoc+posix|windows}], [specify multithreading API])m4_ifdef([gl_THREADLIB_DEFAULT_NO], [], [ AS_HELP_STRING([--disable-threads], [build without multithread safety])]), [gl_use_threads=$enableval], [if test -n "$gl_use_threads_default"; then gl_use_threads="$gl_use_threads_default" else changequote(,)dnl case "$host_os" in dnl Disable multithreading by default on OSF/1, because it interferes dnl with fork()/exec(): When msgexec is linked with -lpthread, its dnl child process gets an endless segmentation fault inside execvp(). osf*) gl_use_threads=no ;; dnl Disable multithreading by default on Cygwin 1.5.x, because it has dnl bugs that lead to endless loops or crashes. See dnl . cygwin*) case `uname -r` in 1.[0-5].*) gl_use_threads=no ;; *) gl_use_threads=yes ;; esac ;; dnl Obey gl_AVOID_WINPTHREAD on mingw. mingw*) case "$gl_use_winpthreads_default" in yes) gl_use_threads=posix ;; no) gl_use_threads=windows ;; *) gl_use_threads=yes ;; esac ;; *) gl_use_threads=yes ;; esac changequote([,])dnl fi ]) if test "$gl_use_threads" = yes \ || test "$gl_use_threads" = isoc \ || test "$gl_use_threads" = posix \ || test "$gl_use_threads" = isoc+posix; then # For using or : gl_ANYTHREADLIB_EARLY fi ]) dnl The guts of gl_THREADLIB. Needs to be expanded only once. AC_DEFUN([gl_THREADLIB_BODY], [ AC_REQUIRE([gl_THREADLIB_EARLY_BODY]) gl_threads_api=none LIBTHREAD= LTLIBTHREAD= LIBMULTITHREAD= LTLIBMULTITHREAD= if test "$gl_use_threads" != no; then dnl Check whether the compiler and linker support weak declarations. gl_WEAK_SYMBOLS if case "$gl_cv_have_weak" in *yes) true;; *) false;; esac; then dnl If we use weak symbols to implement pthread_in_use / pth_in_use / dnl thread_in_use, we also need to test whether the ISO C 11 thrd_create dnl facility is in use. AC_CHECK_HEADERS_ONCE([threads.h]) : fi if test "$gl_use_threads" = isoc || test "$gl_use_threads" = isoc+posix; then AC_CHECK_HEADERS_ONCE([threads.h]) gl_have_isoc_threads="$ac_cv_header_threads_h" fi if test "$gl_use_threads" = yes \ || test "$gl_use_threads" = posix \ || test "$gl_use_threads" = isoc+posix; then gl_PTHREADLIB_BODY LIBTHREAD=$LIBPTHREAD LTLIBTHREAD=$LIBPTHREAD LIBMULTITHREAD=$LIBPMULTITHREAD LTLIBMULTITHREAD=$LIBPMULTITHREAD if test $gl_pthread_api = yes; then if test "$gl_use_threads" = isoc+posix && test "$gl_have_isoc_threads" = yes; then gl_threads_api='isoc+posix' AC_DEFINE([USE_ISOC_AND_POSIX_THREADS], [1], [Define if the combination of the ISO C and POSIX multithreading APIs can be used.]) LIBTHREAD= LTLIBTHREAD= else gl_threads_api=posix AC_DEFINE([USE_POSIX_THREADS], [1], [Define if the POSIX multithreading library can be used.]) if test -z "$LIBMULTITHREAD" && test -z "$LTLIBMULTITHREAD"; then AC_DEFINE([USE_POSIX_THREADS_FROM_LIBC], [1], [Define if references to the POSIX multithreading library are satisfied by libc.]) else if case "$gl_cv_have_weak" in *yes) true;; *) false;; esac; then AC_DEFINE([USE_POSIX_THREADS_WEAK], [1], [Define if references to the POSIX multithreading library should be made weak.]) LIBTHREAD= LTLIBTHREAD= else case "$host_os" in freebsd* | dragonfly* | midnightbsd*) if test "x$LIBTHREAD" != "x$LIBMULTITHREAD"; then dnl If weak symbols can't tell whether pthread_create(), pthread_key_create() dnl etc. will succeed, we need a runtime test. AC_DEFINE([PTHREAD_IN_USE_DETECTION_HARD], [1], [Define if the pthread_in_use() detection is hard.]) fi ;; esac fi fi fi fi fi if test $gl_threads_api = none; then if test "$gl_use_threads" = isoc && test "$gl_have_isoc_threads" = yes; then gl_STDTHREADLIB_BODY LIBTHREAD=$LIBSTDTHREAD LTLIBTHREAD=$LIBSTDTHREAD LIBMULTITHREAD=$LIBSTDTHREAD LTLIBMULTITHREAD=$LIBSTDTHREAD gl_threads_api=isoc AC_DEFINE([USE_ISOC_THREADS], [1], [Define if the ISO C multithreading library can be used.]) fi fi if test $gl_threads_api = none; then case "$gl_use_threads" in yes | windows | win32) # The 'win32' is for backward compatibility. if { case "$host_os" in mingw*) true;; *) false;; esac }; then gl_threads_api=windows AC_DEFINE([USE_WINDOWS_THREADS], [1], [Define if the native Windows multithreading API can be used.]) fi ;; esac fi fi AC_MSG_CHECKING([for multithread API to use]) AC_MSG_RESULT([$gl_threads_api]) AC_SUBST([LIBTHREAD]) AC_SUBST([LTLIBTHREAD]) AC_SUBST([LIBMULTITHREAD]) AC_SUBST([LTLIBMULTITHREAD]) ]) AC_DEFUN([gl_THREADLIB], [ AC_REQUIRE([gl_THREADLIB_EARLY]) AC_REQUIRE([gl_THREADLIB_BODY]) ]) dnl gl_DISABLE_THREADS dnl ------------------ dnl Sets the gl_THREADLIB default so that threads are not used by default. dnl The user can still override it at installation time, by using the dnl configure option '--enable-threads'. AC_DEFUN([gl_DISABLE_THREADS], [ m4_divert_text([INIT_PREPARE], [gl_use_threads_default=no]) ]) dnl gl_AVOID_WINPTHREAD dnl ------------------- dnl Sets the gl_THREADLIB default so that on mingw, a dependency to the dnl libwinpthread DLL (mingw-w64 winpthreads library) is avoided. dnl The user can still override it at installation time, by using the dnl configure option '--enable-threads'. AC_DEFUN([gl_AVOID_WINPTHREAD], [ m4_divert_text([INIT_PREPARE], [gl_use_winpthreads_default=no]) ]) dnl ============================================================================ dnl Survey of platforms: dnl dnl Platform Available Compiler Supports test-lock dnl flavours option weak result dnl --------------- --------- --------- -------- --------- dnl Linux 2.4/glibc posix -lpthread Y OK dnl dnl Linux/glibc 2.34 posix Y OK dnl dnl GNU Hurd/glibc posix -lpthread Y OK dnl dnl Ubuntu 14.04 posix -pthread Y OK dnl dnl FreeBSD 5.3 posix -lc_r Y dnl posix -lkse ? Y dnl posix -lpthread ? Y dnl posix -lthr Y dnl dnl FreeBSD 5.2 posix -lc_r Y dnl posix -lkse Y dnl posix -lthr Y dnl dnl FreeBSD 4.0,4.10 posix -lc_r Y OK dnl dnl NetBSD 1.6 -- dnl dnl OpenBSD 3.4 posix -lpthread Y OK dnl dnl Mac OS X 10.[123] posix -lpthread Y OK dnl dnl Solaris 7,8,9 posix -lpthread Y Sol 7,8: 0.0; Sol 9: OK dnl dnl HP-UX 11 posix -lpthread N (cc) OK dnl Y (gcc) dnl dnl IRIX 6.5 posix -lpthread Y 0.5 dnl dnl AIX 4.3,5.1 posix -lpthread N AIX 4: 0.5; AIX 5: OK dnl dnl OSF/1 4.0,5.1 posix -pthread (cc) N OK dnl -lpthread (gcc) Y dnl dnl Cygwin posix -lpthread Y OK dnl dnl Mingw windows N OK dnl dnl BeOS 5 -- dnl dnl The test-lock result shows what happens if in test-lock.c EXPLICIT_YIELD is dnl turned off: dnl OK if all three tests terminate OK, dnl 0.5 if the first test terminates OK but the second one loops endlessly, dnl 0.0 if the first test already loops endlessly. grub-2.14~git20250718.0e36779/m4/math_h.m40000644000175000017500000005066515036447602014043 00000000000000# math_h.m4 serial 125 dnl Copyright (C) 2007-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN_ONCE([gl_MATH_H], [ AC_REQUIRE([gl_MATH_H_DEFAULTS]) gl_CHECK_NEXT_HEADERS([math.h]) AC_CACHE_CHECK([whether NAN macro works], [gl_cv_header_math_nan_works], [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], [[/* Solaris 10 has a broken definition of NAN. Other platforms fail to provide NAN, or provide it only in C99 mode; this test only needs to fail when NAN is provided but wrong. */ float f = 1.0f; #ifdef NAN f = NAN; #endif return f == 0;]])], [gl_cv_header_math_nan_works=yes], [gl_cv_header_math_nan_works=no])]) if test $gl_cv_header_math_nan_works = no; then REPLACE_NAN=1 fi AC_CACHE_CHECK([whether HUGE_VAL works], [gl_cv_header_math_huge_val_works], [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], [[/* Solaris 10 has a broken definition of HUGE_VAL. */ double d = HUGE_VAL; return d == 0;]])], [gl_cv_header_math_huge_val_works=yes], [gl_cv_header_math_huge_val_works=no])]) if test $gl_cv_header_math_huge_val_works = no; then REPLACE_HUGE_VAL=1 fi dnl Check for declarations of anything we want to poison if the dnl corresponding gnulib module is not in use. gl_WARN_ON_USE_PREPARE([[#include ]], [acosf acosl asinf asinl atanf atanl cbrt cbrtf cbrtl ceilf ceill copysign copysignf copysignl cosf cosl coshf expf expl exp2 exp2f exp2l expm1 expm1f expm1l fabsf fabsl floorf floorl fma fmaf fmal fmod fmodf fmodl frexpf frexpl hypotf hypotl ilogb ilogbf ilogbl ldexpf ldexpl log logf logl log10 log10f log10l log1p log1pf log1pl log2 log2f log2l logb logbf logbl modf modff modfl powf remainder remainderf remainderl rint rintf rintl round roundf roundl sinf sinl sinhf sqrtf sqrtl tanf tanl tanhf trunc truncf truncl]) ]) # gl_MATH_MODULE_INDICATOR([modulename]) # sets the shell variable that indicates the presence of the given module # to a C preprocessor expression that will evaluate to 1. # This macro invocation must not occur in macros that are AC_REQUIREd. AC_DEFUN([gl_MATH_MODULE_INDICATOR], [ dnl Ensure to expand the default settings once only. gl_MATH_H_REQUIRE_DEFAULTS gl_MODULE_INDICATOR_SET_VARIABLE([$1]) dnl Define it also as a C macro, for the benefit of the unit tests. gl_MODULE_INDICATOR_FOR_TESTS([$1]) ]) # Initializes the default values for AC_SUBSTed shell variables. # This macro must not be AC_REQUIREd. It must only be invoked, and only # outside of macros or in macros that are not AC_REQUIREd. AC_DEFUN([gl_MATH_H_REQUIRE_DEFAULTS], [ m4_defun(GL_MODULE_INDICATOR_PREFIX[_MATH_H_MODULE_INDICATOR_DEFAULTS], [ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ACOSF]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ACOSL]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ASINF]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ASINL]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ATANF]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ATANL]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ATAN2F]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_CBRT]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_CBRTF]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_CBRTL]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_CEIL]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_CEILF]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_CEILL]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_COPYSIGN]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_COPYSIGNF]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_COPYSIGNL]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_COSF]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_COSL]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_COSHF]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_EXPF]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_EXPL]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_EXP2]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_EXP2F]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_EXP2L]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_EXPM1]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_EXPM1F]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_EXPM1L]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FABSF]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FABSL]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FLOOR]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FLOORF]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FLOORL]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FMA]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FMAF]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FMAL]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FMOD]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FMODF]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FMODL]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FREXPF]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FREXP]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FREXPL]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_HYPOT]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_HYPOTF]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_HYPOTL]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ILOGB]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ILOGBF]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ILOGBL]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ISFINITE]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ISINF]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ISNAN]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ISNANF]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ISNAND]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ISNANL]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LDEXPF]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LDEXPL]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LOG]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LOGF]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LOGL]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LOG10]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LOG10F]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LOG10L]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LOG1P]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LOG1PF]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LOG1PL]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LOG2]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LOG2F]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LOG2L]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LOGB]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LOGBF]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LOGBL]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MODF]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MODFF]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MODFL]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_POWF]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_REMAINDER]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_REMAINDERF]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_REMAINDERL]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_RINT]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_RINTF]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_RINTL]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ROUND]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ROUNDF]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ROUNDL]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SIGNBIT]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SINF]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SINL]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SINHF]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SQRTF]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SQRTL]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_TANF]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_TANL]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_TANHF]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_TRUNC]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_TRUNCF]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_TRUNCL]) dnl Support Microsoft deprecated alias function names by default. gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_J0], [1]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_J1], [1]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_JN], [1]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_Y0], [1]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_Y1], [1]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_YN], [1]) ]) m4_require(GL_MODULE_INDICATOR_PREFIX[_MATH_H_MODULE_INDICATOR_DEFAULTS]) AC_REQUIRE([gl_MATH_H_DEFAULTS]) ]) AC_DEFUN([gl_MATH_H_DEFAULTS], [ dnl Assume proper GNU behavior unless another module says otherwise. HAVE_ACOSF=1; AC_SUBST([HAVE_ACOSF]) HAVE_ACOSL=1; AC_SUBST([HAVE_ACOSL]) HAVE_ASINF=1; AC_SUBST([HAVE_ASINF]) HAVE_ASINL=1; AC_SUBST([HAVE_ASINL]) HAVE_ATANF=1; AC_SUBST([HAVE_ATANF]) HAVE_ATANL=1; AC_SUBST([HAVE_ATANL]) HAVE_ATAN2F=1; AC_SUBST([HAVE_ATAN2F]) HAVE_CBRT=1; AC_SUBST([HAVE_CBRT]) HAVE_CBRTF=1; AC_SUBST([HAVE_CBRTF]) HAVE_CBRTL=1; AC_SUBST([HAVE_CBRTL]) HAVE_COPYSIGN=1; AC_SUBST([HAVE_COPYSIGN]) HAVE_COPYSIGNL=1; AC_SUBST([HAVE_COPYSIGNL]) HAVE_COSF=1; AC_SUBST([HAVE_COSF]) HAVE_COSL=1; AC_SUBST([HAVE_COSL]) HAVE_COSHF=1; AC_SUBST([HAVE_COSHF]) HAVE_EXPF=1; AC_SUBST([HAVE_EXPF]) HAVE_EXPL=1; AC_SUBST([HAVE_EXPL]) HAVE_EXPM1=1; AC_SUBST([HAVE_EXPM1]) HAVE_EXPM1F=1; AC_SUBST([HAVE_EXPM1F]) HAVE_FABSF=1; AC_SUBST([HAVE_FABSF]) HAVE_FABSL=1; AC_SUBST([HAVE_FABSL]) HAVE_FMA=1; AC_SUBST([HAVE_FMA]) HAVE_FMAF=1; AC_SUBST([HAVE_FMAF]) HAVE_FMAL=1; AC_SUBST([HAVE_FMAL]) HAVE_FMODF=1; AC_SUBST([HAVE_FMODF]) HAVE_FMODL=1; AC_SUBST([HAVE_FMODL]) HAVE_FREXPF=1; AC_SUBST([HAVE_FREXPF]) HAVE_HYPOTF=1; AC_SUBST([HAVE_HYPOTF]) HAVE_HYPOTL=1; AC_SUBST([HAVE_HYPOTL]) HAVE_ILOGB=1; AC_SUBST([HAVE_ILOGB]) HAVE_ILOGBF=1; AC_SUBST([HAVE_ILOGBF]) HAVE_ILOGBL=1; AC_SUBST([HAVE_ILOGBL]) HAVE_ISNANF=1; AC_SUBST([HAVE_ISNANF]) HAVE_ISNAND=1; AC_SUBST([HAVE_ISNAND]) HAVE_ISNANL=1; AC_SUBST([HAVE_ISNANL]) HAVE_LDEXPF=1; AC_SUBST([HAVE_LDEXPF]) HAVE_LOGF=1; AC_SUBST([HAVE_LOGF]) HAVE_LOGL=1; AC_SUBST([HAVE_LOGL]) HAVE_LOG10F=1; AC_SUBST([HAVE_LOG10F]) HAVE_LOG10L=1; AC_SUBST([HAVE_LOG10L]) HAVE_LOG1P=1; AC_SUBST([HAVE_LOG1P]) HAVE_LOG1PF=1; AC_SUBST([HAVE_LOG1PF]) HAVE_LOG1PL=1; AC_SUBST([HAVE_LOG1PL]) HAVE_LOGBF=1; AC_SUBST([HAVE_LOGBF]) HAVE_LOGBL=1; AC_SUBST([HAVE_LOGBL]) HAVE_MODFF=1; AC_SUBST([HAVE_MODFF]) HAVE_MODFL=1; AC_SUBST([HAVE_MODFL]) HAVE_POWF=1; AC_SUBST([HAVE_POWF]) HAVE_REMAINDER=1; AC_SUBST([HAVE_REMAINDER]) HAVE_REMAINDERF=1; AC_SUBST([HAVE_REMAINDERF]) HAVE_RINT=1; AC_SUBST([HAVE_RINT]) HAVE_RINTL=1; AC_SUBST([HAVE_RINTL]) HAVE_SINF=1; AC_SUBST([HAVE_SINF]) HAVE_SINL=1; AC_SUBST([HAVE_SINL]) HAVE_SINHF=1; AC_SUBST([HAVE_SINHF]) HAVE_SQRTF=1; AC_SUBST([HAVE_SQRTF]) HAVE_SQRTL=1; AC_SUBST([HAVE_SQRTL]) HAVE_TANF=1; AC_SUBST([HAVE_TANF]) HAVE_TANL=1; AC_SUBST([HAVE_TANL]) HAVE_TANHF=1; AC_SUBST([HAVE_TANHF]) HAVE_DECL_ACOSL=1; AC_SUBST([HAVE_DECL_ACOSL]) HAVE_DECL_ASINL=1; AC_SUBST([HAVE_DECL_ASINL]) HAVE_DECL_ATANL=1; AC_SUBST([HAVE_DECL_ATANL]) HAVE_DECL_CBRTF=1; AC_SUBST([HAVE_DECL_CBRTF]) HAVE_DECL_CBRTL=1; AC_SUBST([HAVE_DECL_CBRTL]) HAVE_DECL_CEILF=1; AC_SUBST([HAVE_DECL_CEILF]) HAVE_DECL_CEILL=1; AC_SUBST([HAVE_DECL_CEILL]) HAVE_DECL_COPYSIGNF=1; AC_SUBST([HAVE_DECL_COPYSIGNF]) HAVE_DECL_COSL=1; AC_SUBST([HAVE_DECL_COSL]) HAVE_DECL_EXPL=1; AC_SUBST([HAVE_DECL_EXPL]) HAVE_DECL_EXP2=1; AC_SUBST([HAVE_DECL_EXP2]) HAVE_DECL_EXP2F=1; AC_SUBST([HAVE_DECL_EXP2F]) HAVE_DECL_EXP2L=1; AC_SUBST([HAVE_DECL_EXP2L]) HAVE_DECL_EXPM1L=1; AC_SUBST([HAVE_DECL_EXPM1L]) HAVE_DECL_FLOORF=1; AC_SUBST([HAVE_DECL_FLOORF]) HAVE_DECL_FLOORL=1; AC_SUBST([HAVE_DECL_FLOORL]) HAVE_DECL_FREXPL=1; AC_SUBST([HAVE_DECL_FREXPL]) HAVE_DECL_LDEXPL=1; AC_SUBST([HAVE_DECL_LDEXPL]) HAVE_DECL_LOGL=1; AC_SUBST([HAVE_DECL_LOGL]) HAVE_DECL_LOG10L=1; AC_SUBST([HAVE_DECL_LOG10L]) HAVE_DECL_LOG2=1; AC_SUBST([HAVE_DECL_LOG2]) HAVE_DECL_LOG2F=1; AC_SUBST([HAVE_DECL_LOG2F]) HAVE_DECL_LOG2L=1; AC_SUBST([HAVE_DECL_LOG2L]) HAVE_DECL_LOGB=1; AC_SUBST([HAVE_DECL_LOGB]) HAVE_DECL_REMAINDER=1; AC_SUBST([HAVE_DECL_REMAINDER]) HAVE_DECL_REMAINDERL=1; AC_SUBST([HAVE_DECL_REMAINDERL]) HAVE_DECL_RINTF=1; AC_SUBST([HAVE_DECL_RINTF]) HAVE_DECL_ROUND=1; AC_SUBST([HAVE_DECL_ROUND]) HAVE_DECL_ROUNDF=1; AC_SUBST([HAVE_DECL_ROUNDF]) HAVE_DECL_ROUNDL=1; AC_SUBST([HAVE_DECL_ROUNDL]) HAVE_DECL_SINL=1; AC_SUBST([HAVE_DECL_SINL]) HAVE_DECL_SQRTL=1; AC_SUBST([HAVE_DECL_SQRTL]) HAVE_DECL_TANL=1; AC_SUBST([HAVE_DECL_TANL]) HAVE_DECL_TRUNC=1; AC_SUBST([HAVE_DECL_TRUNC]) HAVE_DECL_TRUNCF=1; AC_SUBST([HAVE_DECL_TRUNCF]) HAVE_DECL_TRUNCL=1; AC_SUBST([HAVE_DECL_TRUNCL]) REPLACE_ACOSF=0; AC_SUBST([REPLACE_ACOSF]) REPLACE_ASINF=0; AC_SUBST([REPLACE_ASINF]) REPLACE_ATANF=0; AC_SUBST([REPLACE_ATANF]) REPLACE_ATAN2F=0; AC_SUBST([REPLACE_ATAN2F]) REPLACE_CBRTF=0; AC_SUBST([REPLACE_CBRTF]) REPLACE_CBRTL=0; AC_SUBST([REPLACE_CBRTL]) REPLACE_CEIL=0; AC_SUBST([REPLACE_CEIL]) REPLACE_CEILF=0; AC_SUBST([REPLACE_CEILF]) REPLACE_CEILL=0; AC_SUBST([REPLACE_CEILL]) REPLACE_COSF=0; AC_SUBST([REPLACE_COSF]) REPLACE_COSHF=0; AC_SUBST([REPLACE_COSHF]) REPLACE_EXPF=0; AC_SUBST([REPLACE_EXPF]) REPLACE_EXPL=0; AC_SUBST([REPLACE_EXPL]) REPLACE_EXPM1=0; AC_SUBST([REPLACE_EXPM1]) REPLACE_EXPM1F=0; AC_SUBST([REPLACE_EXPM1F]) REPLACE_EXPM1L=0; AC_SUBST([REPLACE_EXPM1L]) REPLACE_EXP2=0; AC_SUBST([REPLACE_EXP2]) REPLACE_EXP2L=0; AC_SUBST([REPLACE_EXP2L]) REPLACE_FABSL=0; AC_SUBST([REPLACE_FABSL]) REPLACE_FLOOR=0; AC_SUBST([REPLACE_FLOOR]) REPLACE_FLOORF=0; AC_SUBST([REPLACE_FLOORF]) REPLACE_FLOORL=0; AC_SUBST([REPLACE_FLOORL]) REPLACE_FMA=0; AC_SUBST([REPLACE_FMA]) REPLACE_FMAF=0; AC_SUBST([REPLACE_FMAF]) REPLACE_FMAL=0; AC_SUBST([REPLACE_FMAL]) REPLACE_FMOD=0; AC_SUBST([REPLACE_FMOD]) REPLACE_FMODF=0; AC_SUBST([REPLACE_FMODF]) REPLACE_FMODL=0; AC_SUBST([REPLACE_FMODL]) REPLACE_FREXPF=0; AC_SUBST([REPLACE_FREXPF]) REPLACE_FREXP=0; AC_SUBST([REPLACE_FREXP]) REPLACE_FREXPL=0; AC_SUBST([REPLACE_FREXPL]) REPLACE_HUGE_VAL=0; AC_SUBST([REPLACE_HUGE_VAL]) REPLACE_HYPOT=0; AC_SUBST([REPLACE_HYPOT]) REPLACE_HYPOTF=0; AC_SUBST([REPLACE_HYPOTF]) REPLACE_HYPOTL=0; AC_SUBST([REPLACE_HYPOTL]) REPLACE_ILOGB=0; AC_SUBST([REPLACE_ILOGB]) REPLACE_ILOGBF=0; AC_SUBST([REPLACE_ILOGBF]) REPLACE_ILOGBL=0; AC_SUBST([REPLACE_ILOGBL]) REPLACE_ISFINITE=0; AC_SUBST([REPLACE_ISFINITE]) REPLACE_ISINF=0; AC_SUBST([REPLACE_ISINF]) REPLACE_ISNAN=0; AC_SUBST([REPLACE_ISNAN]) REPLACE_LDEXPL=0; AC_SUBST([REPLACE_LDEXPL]) REPLACE_LOG=0; AC_SUBST([REPLACE_LOG]) REPLACE_LOGF=0; AC_SUBST([REPLACE_LOGF]) REPLACE_LOGL=0; AC_SUBST([REPLACE_LOGL]) REPLACE_LOG10=0; AC_SUBST([REPLACE_LOG10]) REPLACE_LOG10F=0; AC_SUBST([REPLACE_LOG10F]) REPLACE_LOG10L=0; AC_SUBST([REPLACE_LOG10L]) REPLACE_LOG1P=0; AC_SUBST([REPLACE_LOG1P]) REPLACE_LOG1PF=0; AC_SUBST([REPLACE_LOG1PF]) REPLACE_LOG1PL=0; AC_SUBST([REPLACE_LOG1PL]) REPLACE_LOG2=0; AC_SUBST([REPLACE_LOG2]) REPLACE_LOG2F=0; AC_SUBST([REPLACE_LOG2F]) REPLACE_LOG2L=0; AC_SUBST([REPLACE_LOG2L]) REPLACE_LOGB=0; AC_SUBST([REPLACE_LOGB]) REPLACE_LOGBF=0; AC_SUBST([REPLACE_LOGBF]) REPLACE_LOGBL=0; AC_SUBST([REPLACE_LOGBL]) REPLACE_MODF=0; AC_SUBST([REPLACE_MODF]) REPLACE_MODFF=0; AC_SUBST([REPLACE_MODFF]) REPLACE_MODFL=0; AC_SUBST([REPLACE_MODFL]) REPLACE_NAN=0; AC_SUBST([REPLACE_NAN]) REPLACE_REMAINDER=0; AC_SUBST([REPLACE_REMAINDER]) REPLACE_REMAINDERF=0; AC_SUBST([REPLACE_REMAINDERF]) REPLACE_REMAINDERL=0; AC_SUBST([REPLACE_REMAINDERL]) REPLACE_RINTL=0; AC_SUBST([REPLACE_RINTL]) REPLACE_ROUND=0; AC_SUBST([REPLACE_ROUND]) REPLACE_ROUNDF=0; AC_SUBST([REPLACE_ROUNDF]) REPLACE_ROUNDL=0; AC_SUBST([REPLACE_ROUNDL]) REPLACE_SIGNBIT=0; AC_SUBST([REPLACE_SIGNBIT]) REPLACE_SIGNBIT_USING_BUILTINS=0; AC_SUBST([REPLACE_SIGNBIT_USING_BUILTINS]) REPLACE_SINF=0; AC_SUBST([REPLACE_SINF]) REPLACE_SINHF=0; AC_SUBST([REPLACE_SINHF]) REPLACE_SQRTF=0; AC_SUBST([REPLACE_SQRTF]) REPLACE_SQRTL=0; AC_SUBST([REPLACE_SQRTL]) REPLACE_TANF=0; AC_SUBST([REPLACE_TANF]) REPLACE_TANHF=0; AC_SUBST([REPLACE_TANHF]) REPLACE_TRUNC=0; AC_SUBST([REPLACE_TRUNC]) REPLACE_TRUNCF=0; AC_SUBST([REPLACE_TRUNCF]) REPLACE_TRUNCL=0; AC_SUBST([REPLACE_TRUNCL]) ]) # gl_LONG_DOUBLE_VS_DOUBLE # determines whether 'long double' and 'double' have the same representation. # Sets variable HAVE_SAME_LONG_DOUBLE_AS_DOUBLE to 0 or 1, and defines # HAVE_SAME_LONG_DOUBLE_AS_DOUBLE accordingly. # The currently known platforms where this is the case are: # Linux/HPPA, Minix 3.1.8, AIX 5, AIX 6 and 7 with xlc, MSVC 9. AC_DEFUN([gl_LONG_DOUBLE_VS_DOUBLE], [ AC_CACHE_CHECK([whether long double and double are the same], [gl_cv_long_double_equals_double], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM([[#include ]], [[typedef int check[sizeof (long double) == sizeof (double) && LDBL_MANT_DIG == DBL_MANT_DIG && LDBL_MAX_EXP == DBL_MAX_EXP && LDBL_MIN_EXP == DBL_MIN_EXP ? 1 : -1]; ]])], [gl_cv_long_double_equals_double=yes], [gl_cv_long_double_equals_double=no]) ]) if test $gl_cv_long_double_equals_double = yes; then AC_DEFINE([HAVE_SAME_LONG_DOUBLE_AS_DOUBLE], [1], [Define to 1 if 'long double' and 'double' have the same representation.]) HAVE_SAME_LONG_DOUBLE_AS_DOUBLE=1 else HAVE_SAME_LONG_DOUBLE_AS_DOUBLE=0 fi AC_SUBST([HAVE_SAME_LONG_DOUBLE_AS_DOUBLE]) ]) grub-2.14~git20250718.0e36779/m4/argp.m40000644000175000017500000000514415036447602013524 00000000000000# argp.m4 serial 16 dnl Copyright (C) 2003-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_ARGP], [ AC_REQUIRE([AC_C_INLINE]) AC_REQUIRE([AC_C_RESTRICT]) AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) AC_CHECK_DECLS([program_invocation_name], [], [AC_DEFINE([GNULIB_PROGRAM_INVOCATION_NAME], [1], [Define to 1 to add extern declaration of program_invocation_name to argp.h])], [[#include ]]) AC_CHECK_DECLS([program_invocation_short_name], [], [AC_DEFINE([GNULIB_PROGRAM_INVOCATION_SHORT_NAME], [1], [Define to 1 to add extern declaration of program_invocation_short_name to argp.h])], [[#include ]]) # Check if program_invocation_name and program_invocation_short_name # are defined elsewhere. It is improbable that only one of them will # be defined and other not, I prefer to stay on the safe side and to # test each one separately. AC_MSG_CHECKING([whether program_invocation_name is defined]) AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[extern char *program_invocation_name;]], [[program_invocation_name = "test";]])], [AC_DEFINE([HAVE_PROGRAM_INVOCATION_NAME], [1], [Define if program_invocation_name is defined]) AC_MSG_RESULT([yes]) ], [AC_MSG_RESULT([no])]) AC_MSG_CHECKING([whether program_invocation_short_name is defined]) AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[extern char *program_invocation_short_name;]], [[program_invocation_short_name = "test";]])], [AC_DEFINE([HAVE_PROGRAM_INVOCATION_SHORT_NAME], [1], [Define if program_invocation_short_name is defined]) AC_MSG_RESULT([yes]) ], [AC_MSG_RESULT([no])]) AC_CHECK_DECLS_ONCE([clearerr_unlocked]) AC_CHECK_DECLS_ONCE([feof_unlocked]) AC_CHECK_DECLS_ONCE([ferror_unlocked]) AC_CHECK_DECLS_ONCE([fflush_unlocked]) AC_CHECK_DECLS_ONCE([fgets_unlocked]) AC_CHECK_DECLS_ONCE([fputc_unlocked]) AC_CHECK_DECLS_ONCE([fputs_unlocked]) AC_CHECK_DECLS_ONCE([fread_unlocked]) AC_CHECK_DECLS_ONCE([fwrite_unlocked]) AC_CHECK_DECLS_ONCE([getc_unlocked]) AC_CHECK_DECLS_ONCE([getchar_unlocked]) AC_CHECK_DECLS_ONCE([putc_unlocked]) AC_CHECK_DECLS_ONCE([putchar_unlocked]) AC_CHECK_FUNCS_ONCE([flockfile funlockfile]) AC_CHECK_HEADERS_ONCE([features.h linewrap.h]) AC_REQUIRE([AC_FUNC_STRERROR_R]) ]) dnl argp-parse.c depends on GNU getopt internals, therefore use GNU getopt dnl always. AC_DEFUN([gl_REPLACE_GETOPT_ALWAYS], []) grub-2.14~git20250718.0e36779/m4/close.m40000644000175000017500000000222115036447602013671 00000000000000# close.m4 serial 9 dnl Copyright (C) 2008-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_CLOSE], [ AC_REQUIRE([gl_UNISTD_H_DEFAULTS]) m4_ifdef([gl_MSVC_INVAL], [ AC_REQUIRE([gl_MSVC_INVAL]) if test $HAVE_MSVC_INVALID_PARAMETER_HANDLER = 1; then REPLACE_CLOSE=1 fi ]) m4_ifdef([gl_PREREQ_SYS_H_WINSOCK2], [ gl_PREREQ_SYS_H_WINSOCK2 if test $UNISTD_H_HAVE_WINSOCK2_H = 1; then dnl Even if the 'socket' module is not used here, another part of the dnl application may use it and pass file descriptors that refer to dnl sockets to the close() function. So enable the support for sockets. REPLACE_CLOSE=1 fi ]) dnl Replace close() for supporting the gnulib-defined fchdir() function, dnl to keep fchdir's bookkeeping up-to-date. m4_ifdef([gl_FUNC_FCHDIR], [ if test $REPLACE_CLOSE = 0; then gl_TEST_FCHDIR if test $HAVE_FCHDIR = 0; then REPLACE_CLOSE=1 fi fi ]) ]) grub-2.14~git20250718.0e36779/m4/localcharset.m40000644000175000017500000000063315036447602015235 00000000000000# localcharset.m4 serial 8 dnl Copyright (C) 2002, 2004, 2006, 2009-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_LOCALCHARSET], [ dnl Prerequisites of lib/localcharset.c. AC_REQUIRE([AM_LANGINFO_CODESET]) ]) grub-2.14~git20250718.0e36779/m4/flexmember.m40000644000175000017500000000325415036447602014721 00000000000000# serial 5 # Check for flexible array member support. # Copyright (C) 2006, 2009-2022 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # Written by Paul Eggert. AC_DEFUN([AC_C_FLEXIBLE_ARRAY_MEMBER], [ AC_CACHE_CHECK([for flexible array member], ac_cv_c_flexmember, [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#include #include #include struct m { struct m *next, **list; char name[]; }; struct s { struct s *p; struct m *m; int n; double d[]; };]], [[int m = getchar (); size_t nbytes = offsetof (struct s, d) + m * sizeof (double); nbytes += sizeof (struct s) - 1; nbytes -= nbytes % sizeof (struct s); struct s *p = malloc (nbytes); p->p = p; p->m = NULL; p->d[0] = 0.0; return p->d != (double *) NULL;]])], [ac_cv_c_flexmember=yes], [ac_cv_c_flexmember=no])]) if test $ac_cv_c_flexmember = yes; then AC_DEFINE([FLEXIBLE_ARRAY_MEMBER], [], [Define to nothing if C supports flexible array members, and to 1 if it does not. That way, with a declaration like 'struct s { int n; short d@<:@FLEXIBLE_ARRAY_MEMBER@:>@; };', the struct hack can be used with pre-C99 compilers. Use 'FLEXSIZEOF (struct s, d, N * sizeof (short))' to calculate the size in bytes of such a struct containing an N-element array.]) else AC_DEFINE([FLEXIBLE_ARRAY_MEMBER], [1]) fi ]) grub-2.14~git20250718.0e36779/m4/getdtablesize.m40000644000175000017500000000504515036447602015421 00000000000000# getdtablesize.m4 serial 8 dnl Copyright (C) 2008-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_GETDTABLESIZE], [ AC_REQUIRE([gl_UNISTD_H_DEFAULTS]) AC_REQUIRE([AC_CANONICAL_HOST]) AC_CHECK_FUNCS_ONCE([getdtablesize]) AC_CHECK_DECLS_ONCE([getdtablesize]) if test $ac_cv_func_getdtablesize = yes && test $ac_cv_have_decl_getdtablesize = yes; then AC_CACHE_CHECK([whether getdtablesize works], [gl_cv_func_getdtablesize_works], [dnl There are two concepts: the "maximum possible file descriptor value + 1" dnl and the "maximum number of open file descriptors in a process". dnl Per SUSv2 and POSIX, getdtablesize() should return the first one. dnl On most platforms, the first and the second concept are the same. dnl On OpenVMS, however, they are different and getdtablesize() returns dnl the second one; thus the test below fails. But we don't care dnl because there's no good way to write a replacement getdtablesize(). case "$host_os" in vms*) gl_cv_func_getdtablesize_works="no (limitation)" ;; *) dnl Cygwin 1.7.25 automatically increases the RLIMIT_NOFILE soft dnl limit up to an unchangeable hard limit; all other platforms dnl correctly require setrlimit before getdtablesize() can report dnl a larger value. AC_RUN_IFELSE([ AC_LANG_PROGRAM( [[#include ] GL_MDA_DEFINES ], [[int size = getdtablesize(); if (dup2 (0, getdtablesize()) != -1) return 1; if (size != getdtablesize()) return 2; ]])], [gl_cv_func_getdtablesize_works=yes], [gl_cv_func_getdtablesize_works=no], [case "$host_os" in cygwin*) # on cygwin 1.5.25, getdtablesize() automatically grows gl_cv_func_getdtablesize_works="guessing no" ;; *) gl_cv_func_getdtablesize_works="guessing yes" ;; esac ]) ;; esac ]) case "$gl_cv_func_getdtablesize_works" in *yes | "no (limitation)") ;; *) REPLACE_GETDTABLESIZE=1 ;; esac else HAVE_GETDTABLESIZE=0 fi ]) # Prerequisites of lib/getdtablesize.c. AC_DEFUN([gl_PREREQ_GETDTABLESIZE], [:]) grub-2.14~git20250718.0e36779/m4/getline.m40000644000175000017500000000637415036447602014230 00000000000000# getline.m4 serial 30 dnl Copyright (C) 1998-2003, 2005-2007, 2009-2022 Free Software Foundation, dnl Inc. dnl dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_PREREQ([2.59]) dnl See if there's a working, system-supplied version of the getline function. dnl We can't just do AC_REPLACE_FUNCS([getline]) because some systems dnl have a function by that name in -linet that doesn't have anything dnl to do with the function we need. AC_DEFUN([gl_FUNC_GETLINE], [ AC_REQUIRE([gl_STDIO_H_DEFAULTS]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles dnl Persuade glibc to declare getline(). AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) AC_CHECK_DECLS_ONCE([getline]) gl_getline_needs_run_time_check=no AC_CHECK_FUNC([getline], [dnl Found it in some library. Verify that it works. gl_getline_needs_run_time_check=yes], [am_cv_func_working_getline=no]) if test $gl_getline_needs_run_time_check = yes; then AC_CACHE_CHECK([for working getline function], [am_cv_func_working_getline], [echo fooNbarN | tr -d '\012' | tr N '\012' > conftest.data AC_RUN_IFELSE([AC_LANG_SOURCE([[ # include # include # include int main () { FILE *in = fopen ("./conftest.data", "r"); if (!in) return 1; { /* Test result for a NULL buffer and a zero size. Based on a test program from Karl Heuer. */ char *line = NULL; size_t siz = 0; int len = getline (&line, &siz, in); if (!(len == 4 && line && strcmp (line, "foo\n") == 0)) { free (line); fclose (in); return 2; } free (line); } { /* Test result for a NULL buffer and a non-zero size. This crashes on FreeBSD 8.0. */ char *line = NULL; size_t siz = (size_t)(~0) / 4; if (getline (&line, &siz, in) == -1) { fclose (in); return 3; } free (line); } fclose (in); return 0; } ]])], [am_cv_func_working_getline=yes], [am_cv_func_working_getline=no], [dnl We're cross compiling. dnl Guess it works on glibc2 systems and musl systems. AC_EGREP_CPP([Lucky GNU user], [ #include #ifdef __GNU_LIBRARY__ #if (__GLIBC__ >= 2) && !defined __UCLIBC__ Lucky GNU user #endif #endif ], [am_cv_func_working_getline="guessing yes"], [case "$host_os" in *-musl*) am_cv_func_working_getline="guessing yes" ;; *) am_cv_func_working_getline="$gl_cross_guess_normal" ;; esac ]) ]) ]) fi if test $ac_cv_have_decl_getline = no; then HAVE_DECL_GETLINE=0 fi case "$am_cv_func_working_getline" in *yes) ;; *) dnl Set REPLACE_GETLINE always: Even if we have not found the broken dnl getline function among $LIBS, it may exist in libinet and the dnl executable may be linked with -linet. REPLACE_GETLINE=1 ;; esac ]) # Prerequisites of lib/getline.c. AC_DEFUN([gl_PREREQ_GETLINE], [ : ]) grub-2.14~git20250718.0e36779/m4/wchar_h.m40000644000175000017500000002571215036447602014211 00000000000000dnl A placeholder for ISO C99 , for platforms that have issues. dnl Copyright (C) 2007-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl Written by Eric Blake. # wchar_h.m4 serial 55 AC_DEFUN_ONCE([gl_WCHAR_H], [ AC_REQUIRE([gl_WCHAR_H_DEFAULTS]) AC_REQUIRE([gl_WCHAR_H_INLINE_OK]) dnl Prepare for creating substitute . dnl Check for (missing in Linux uClibc when built without wide dnl character support). dnl is always overridden, because of GNULIB_POSIXCHECK. gl_CHECK_NEXT_HEADERS([wchar.h]) if test $ac_cv_header_wchar_h = yes; then HAVE_WCHAR_H=1 else HAVE_WCHAR_H=0 fi AC_SUBST([HAVE_WCHAR_H]) AC_REQUIRE([gl_FEATURES_H]) AC_REQUIRE([gt_TYPE_WINT_T]) if test $gt_cv_c_wint_t = yes; then HAVE_WINT_T=1 else HAVE_WINT_T=0 fi AC_SUBST([HAVE_WINT_T]) AC_REQUIRE([gl_TYPE_WINT_T_PREREQ]) dnl Check for declarations of anything we want to poison if the dnl corresponding gnulib module is not in use. gl_WARN_ON_USE_PREPARE([[ #include ]], [btowc wctob mbsinit mbrtowc mbrlen mbsrtowcs mbsnrtowcs wcrtomb wcsrtombs wcsnrtombs wcwidth wmemchr wmemcmp wmemcpy wmemmove wmempcpy wmemset wcslen wcsnlen wcscpy wcpcpy wcsncpy wcpncpy wcscat wcsncat wcscmp wcsncmp wcscasecmp wcsncasecmp wcscoll wcsxfrm wcsdup wcschr wcsrchr wcscspn wcsspn wcspbrk wcsstr wcstok wcswidth wcsftime ]) AC_REQUIRE([AC_C_RESTRICT]) AC_CHECK_DECLS([wcsdup], [], [], [[ #include ]]) if test $ac_cv_have_decl_wcsdup = no; then HAVE_DECL_WCSDUP=0 fi ]) dnl Check whether is usable at all. AC_DEFUN([gl_WCHAR_H_INLINE_OK], [ dnl Test whether suffers due to the transition from '__inline' to dnl 'gnu_inline'. See dnl and . In summary, dnl glibc version 2.5 or older, together with gcc version 4.3 or newer and dnl the option -std=c99 or -std=gnu99, leads to a broken . AC_REQUIRE([AC_CANONICAL_HOST]) AC_CACHE_CHECK([whether uses 'inline' correctly], [gl_cv_header_wchar_h_correct_inline], [gl_cv_header_wchar_h_correct_inline=yes case "$host_os" in *-gnu* | gnu*) AC_LANG_CONFTEST([ AC_LANG_SOURCE([[ #define wcstod renamed_wcstod #include extern int zero (void); int main () { return zero(); } ]])]) dnl Do not rename the object file from conftest.$ac_objext to dnl conftest1.$ac_objext, as this will cause the link to fail on dnl z/OS when using the XPLINK object format (due to duplicate dnl CSECT names). Instead, temporarily redefine $ac_compile so dnl that the object file has the latter name from the start. save_ac_compile="$ac_compile" ac_compile=`echo "$save_ac_compile" | sed s/conftest/conftest1/` if echo '#include "conftest.c"' >conftest1.c \ && AC_TRY_EVAL([ac_compile]); then AC_LANG_CONFTEST([ AC_LANG_SOURCE([[ #define wcstod renamed_wcstod #include int zero (void) { return 0; } ]])]) dnl See note above about renaming object files. ac_compile=`echo "$save_ac_compile" | sed s/conftest/conftest2/` if echo '#include "conftest.c"' >conftest2.c \ && AC_TRY_EVAL([ac_compile]); then if $CC -o conftest$ac_exeext $CFLAGS $LDFLAGS conftest1.$ac_objext conftest2.$ac_objext $LIBS >&AS_MESSAGE_LOG_FD 2>&1; then : else gl_cv_header_wchar_h_correct_inline=no fi fi fi ac_compile="$save_ac_compile" rm -f conftest[12].c conftest[12].$ac_objext conftest$ac_exeext ;; esac ]) if test $gl_cv_header_wchar_h_correct_inline = no; then AC_MSG_ERROR([ cannot be used with this compiler ($CC $CFLAGS $CPPFLAGS). This is a known interoperability problem of glibc <= 2.5 with gcc >= 4.3 in C99 mode. You have four options: - Add the flag -fgnu89-inline to CC and reconfigure, or - Fix your include files, using parts of , or - Use a gcc version older than 4.3, or - Don't use the flags -std=c99 or -std=gnu99. Configuration aborted.]) fi ]) # gl_WCHAR_MODULE_INDICATOR([modulename]) # sets the shell variable that indicates the presence of the given module # to a C preprocessor expression that will evaluate to 1. # This macro invocation must not occur in macros that are AC_REQUIREd. AC_DEFUN([gl_WCHAR_MODULE_INDICATOR], [ dnl Ensure to expand the default settings once only. gl_WCHAR_H_REQUIRE_DEFAULTS gl_MODULE_INDICATOR_SET_VARIABLE([$1]) dnl Define it also as a C macro, for the benefit of the unit tests. gl_MODULE_INDICATOR_FOR_TESTS([$1]) ]) # Initializes the default values for AC_SUBSTed shell variables. # This macro must not be AC_REQUIREd. It must only be invoked, and only # outside of macros or in macros that are not AC_REQUIREd. AC_DEFUN([gl_WCHAR_H_REQUIRE_DEFAULTS], [ m4_defun(GL_MODULE_INDICATOR_PREFIX[_WCHAR_H_MODULE_INDICATOR_DEFAULTS], [ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_BTOWC]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCTOB]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MBSINIT]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MBRTOWC]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MBRLEN]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MBSRTOWCS]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MBSNRTOWCS]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCRTOMB]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSRTOMBS]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSNRTOMBS]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCWIDTH]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WMEMCHR]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WMEMCMP]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WMEMCPY]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WMEMMOVE]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WMEMPCPY]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WMEMSET]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSLEN]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSNLEN]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSCPY]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCPCPY]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSNCPY]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCPNCPY]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSCAT]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSNCAT]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSCMP]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSNCMP]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSCASECMP]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSNCASECMP]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSCOLL]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSXFRM]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSDUP]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSCHR]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSRCHR]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSCSPN]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSSPN]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSPBRK]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSSTR]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSTOK]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSWIDTH]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_WCSFTIME]) dnl Support Microsoft deprecated alias function names by default. gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_WCSDUP], [1]) ]) m4_require(GL_MODULE_INDICATOR_PREFIX[_WCHAR_H_MODULE_INDICATOR_DEFAULTS]) dnl Make sure the shell variable for GNULIB_FREE_POSIX is initialized. gl_STDLIB_H_REQUIRE_DEFAULTS AC_REQUIRE([gl_WCHAR_H_DEFAULTS]) ]) AC_DEFUN([gl_WCHAR_H_DEFAULTS], [ dnl Assume proper GNU behavior unless another module says otherwise. HAVE_BTOWC=1; AC_SUBST([HAVE_BTOWC]) HAVE_MBSINIT=1; AC_SUBST([HAVE_MBSINIT]) HAVE_MBRTOWC=1; AC_SUBST([HAVE_MBRTOWC]) HAVE_MBRLEN=1; AC_SUBST([HAVE_MBRLEN]) HAVE_MBSRTOWCS=1; AC_SUBST([HAVE_MBSRTOWCS]) HAVE_MBSNRTOWCS=1; AC_SUBST([HAVE_MBSNRTOWCS]) HAVE_WCRTOMB=1; AC_SUBST([HAVE_WCRTOMB]) HAVE_WCSRTOMBS=1; AC_SUBST([HAVE_WCSRTOMBS]) HAVE_WCSNRTOMBS=1; AC_SUBST([HAVE_WCSNRTOMBS]) HAVE_WMEMCHR=1; AC_SUBST([HAVE_WMEMCHR]) HAVE_WMEMCMP=1; AC_SUBST([HAVE_WMEMCMP]) HAVE_WMEMCPY=1; AC_SUBST([HAVE_WMEMCPY]) HAVE_WMEMMOVE=1; AC_SUBST([HAVE_WMEMMOVE]) HAVE_WMEMPCPY=1; AC_SUBST([HAVE_WMEMPCPY]) HAVE_WMEMSET=1; AC_SUBST([HAVE_WMEMSET]) HAVE_WCSLEN=1; AC_SUBST([HAVE_WCSLEN]) HAVE_WCSNLEN=1; AC_SUBST([HAVE_WCSNLEN]) HAVE_WCSCPY=1; AC_SUBST([HAVE_WCSCPY]) HAVE_WCPCPY=1; AC_SUBST([HAVE_WCPCPY]) HAVE_WCSNCPY=1; AC_SUBST([HAVE_WCSNCPY]) HAVE_WCPNCPY=1; AC_SUBST([HAVE_WCPNCPY]) HAVE_WCSCAT=1; AC_SUBST([HAVE_WCSCAT]) HAVE_WCSNCAT=1; AC_SUBST([HAVE_WCSNCAT]) HAVE_WCSCMP=1; AC_SUBST([HAVE_WCSCMP]) HAVE_WCSNCMP=1; AC_SUBST([HAVE_WCSNCMP]) HAVE_WCSCASECMP=1; AC_SUBST([HAVE_WCSCASECMP]) HAVE_WCSNCASECMP=1; AC_SUBST([HAVE_WCSNCASECMP]) HAVE_WCSCOLL=1; AC_SUBST([HAVE_WCSCOLL]) HAVE_WCSXFRM=1; AC_SUBST([HAVE_WCSXFRM]) HAVE_WCSDUP=1; AC_SUBST([HAVE_WCSDUP]) HAVE_WCSCHR=1; AC_SUBST([HAVE_WCSCHR]) HAVE_WCSRCHR=1; AC_SUBST([HAVE_WCSRCHR]) HAVE_WCSCSPN=1; AC_SUBST([HAVE_WCSCSPN]) HAVE_WCSSPN=1; AC_SUBST([HAVE_WCSSPN]) HAVE_WCSPBRK=1; AC_SUBST([HAVE_WCSPBRK]) HAVE_WCSSTR=1; AC_SUBST([HAVE_WCSSTR]) HAVE_WCSTOK=1; AC_SUBST([HAVE_WCSTOK]) HAVE_WCSWIDTH=1; AC_SUBST([HAVE_WCSWIDTH]) HAVE_WCSFTIME=1; AC_SUBST([HAVE_WCSFTIME]) HAVE_DECL_WCTOB=1; AC_SUBST([HAVE_DECL_WCTOB]) HAVE_DECL_WCSDUP=1; AC_SUBST([HAVE_DECL_WCSDUP]) HAVE_DECL_WCWIDTH=1; AC_SUBST([HAVE_DECL_WCWIDTH]) REPLACE_MBSTATE_T=0; AC_SUBST([REPLACE_MBSTATE_T]) REPLACE_BTOWC=0; AC_SUBST([REPLACE_BTOWC]) REPLACE_WCTOB=0; AC_SUBST([REPLACE_WCTOB]) REPLACE_MBSINIT=0; AC_SUBST([REPLACE_MBSINIT]) REPLACE_MBRTOWC=0; AC_SUBST([REPLACE_MBRTOWC]) REPLACE_MBRLEN=0; AC_SUBST([REPLACE_MBRLEN]) REPLACE_MBSRTOWCS=0; AC_SUBST([REPLACE_MBSRTOWCS]) REPLACE_MBSNRTOWCS=0; AC_SUBST([REPLACE_MBSNRTOWCS]) REPLACE_WCRTOMB=0; AC_SUBST([REPLACE_WCRTOMB]) REPLACE_WCSRTOMBS=0; AC_SUBST([REPLACE_WCSRTOMBS]) REPLACE_WCSNRTOMBS=0; AC_SUBST([REPLACE_WCSNRTOMBS]) REPLACE_WCWIDTH=0; AC_SUBST([REPLACE_WCWIDTH]) REPLACE_WCSWIDTH=0; AC_SUBST([REPLACE_WCSWIDTH]) REPLACE_WCSFTIME=0; AC_SUBST([REPLACE_WCSFTIME]) REPLACE_WCSTOK=0; AC_SUBST([REPLACE_WCSTOK]) ]) grub-2.14~git20250718.0e36779/m4/eealloc.m40000644000175000017500000000166715036447602014205 00000000000000# eealloc.m4 serial 3 dnl Copyright (C) 2003, 2009-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_EEALLOC], [ AC_REQUIRE([gl_EEMALLOC]) AC_REQUIRE([gl_EEREALLOC]) ]) AC_DEFUN([gl_EEMALLOC], [ _AC_FUNC_MALLOC_IF( [gl_cv_func_malloc_0_nonnull=1], [gl_cv_func_malloc_0_nonnull=0]) AC_DEFINE_UNQUOTED([MALLOC_0_IS_NONNULL], [$gl_cv_func_malloc_0_nonnull], [If malloc(0) is != NULL, define this to 1. Otherwise define this to 0.]) ]) AC_DEFUN([gl_EEREALLOC], [ _AC_FUNC_REALLOC_IF( [gl_cv_func_realloc_0_nonnull=1], [gl_cv_func_realloc_0_nonnull=0]) AC_DEFINE_UNQUOTED([REALLOC_0_IS_NONNULL], [$gl_cv_func_realloc_0_nonnull], [If realloc(NULL,0) is != NULL, define this to 1. Otherwise define this to 0.]) ]) grub-2.14~git20250718.0e36779/m4/openat.m40000644000175000017500000000202315036447602014052 00000000000000# serial 46 # See if we need to use our replacement for Solaris' openat et al functions. dnl Copyright (C) 2004-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. # Written by Jim Meyering. AC_DEFUN([gl_FUNC_OPENAT], [ AC_REQUIRE([gl_FCNTL_H_DEFAULTS]) AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) AC_CHECK_FUNCS_ONCE([openat]) AC_REQUIRE([gl_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK]) AC_REQUIRE([gl_PREPROC_O_CLOEXEC]) case $ac_cv_func_openat+$gl_cv_func_lstat_dereferences_slashed_symlink+$gl_cv_macro_O_CLOEXEC in yes+*yes+yes) ;; yes+*) # Solaris 10 lacks O_CLOEXEC. # Solaris 9 has *at functions, but uniformly mishandles trailing # slash in all of them. REPLACE_OPENAT=1 ;; *) HAVE_OPENAT=0 ;; esac ]) # Prerequisites of lib/openat.c. AC_DEFUN([gl_PREREQ_OPENAT], [ AC_REQUIRE([gl_PROMOTED_TYPE_MODE_T]) : ]) grub-2.14~git20250718.0e36779/m4/mmap-anon.m40000644000175000017500000000374715036447602014465 00000000000000# mmap-anon.m4 serial 12 dnl Copyright (C) 2005, 2007, 2009-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. # Detect how mmap can be used to create anonymous (not file-backed) memory # mappings. # - On Linux, AIX, OSF/1, Solaris, Cygwin, Interix, Haiku, both MAP_ANONYMOUS # and MAP_ANON exist and have the same value. # - On HP-UX, only MAP_ANONYMOUS exists. # - On Mac OS X, FreeBSD, NetBSD, OpenBSD, Minix, only MAP_ANON exists. # - On IRIX, neither exists, and a file descriptor opened to /dev/zero must be # used. AC_DEFUN_ONCE([gl_FUNC_MMAP_ANON], [ dnl Persuade glibc to define MAP_ANONYMOUS. AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) # Check for mmap(). Don't use AC_FUNC_MMAP, because it checks too much: it # fails on HP-UX 11, because MAP_FIXED mappings do not work. But this is # irrelevant for anonymous mappings. AC_CHECK_FUNC([mmap], [gl_have_mmap=yes], [gl_have_mmap=no]) # Try to allow MAP_ANONYMOUS. gl_have_mmap_anonymous=no if test $gl_have_mmap = yes; then AC_MSG_CHECKING([for MAP_ANONYMOUS]) AC_EGREP_CPP([I cannot identify this map], [ #include #ifdef MAP_ANONYMOUS I cannot identify this map #endif ], [gl_have_mmap_anonymous=yes]) if test $gl_have_mmap_anonymous != yes; then AC_EGREP_CPP([I cannot identify this map], [ #include #ifdef MAP_ANON I cannot identify this map #endif ], [AC_DEFINE([MAP_ANONYMOUS], [MAP_ANON], [Define to a substitute value for mmap()'s MAP_ANONYMOUS flag.]) gl_have_mmap_anonymous=yes]) fi AC_MSG_RESULT([$gl_have_mmap_anonymous]) if test $gl_have_mmap_anonymous = yes; then AC_DEFINE([HAVE_MAP_ANONYMOUS], [1], [Define to 1 if mmap()'s MAP_ANONYMOUS flag is available after including config.h and .]) fi fi ]) grub-2.14~git20250718.0e36779/m4/strnlen.m40000644000175000017500000000155215036447602014257 00000000000000# strnlen.m4 serial 14 dnl Copyright (C) 2002-2003, 2005-2007, 2009-2022 Free Software Foundation, dnl Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_STRNLEN], [ AC_REQUIRE([gl_STRING_H_DEFAULTS]) dnl Persuade glibc to declare strnlen(). AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) AC_CHECK_DECLS_ONCE([strnlen]) if test $ac_cv_have_decl_strnlen = no; then HAVE_DECL_STRNLEN=0 else m4_pushdef([AC_LIBOBJ], [:]) dnl Note: AC_FUNC_STRNLEN does AC_LIBOBJ([strnlen]). AC_FUNC_STRNLEN m4_popdef([AC_LIBOBJ]) if test $ac_cv_func_strnlen_working = no; then REPLACE_STRNLEN=1 fi fi ]) # Prerequisites of lib/strnlen.c. AC_DEFUN([gl_PREREQ_STRNLEN], [:]) grub-2.14~git20250718.0e36779/m4/unistd-safer.m40000644000175000017500000000053015036447602015171 00000000000000#serial 9 dnl Copyright (C) 2002, 2005-2006, 2009-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_UNISTD_SAFER], [ AC_CHECK_FUNCS_ONCE([pipe]) ]) grub-2.14~git20250718.0e36779/m4/open.m40000644000175000017500000000276515036447602013542 00000000000000# open.m4 serial 15 dnl Copyright (C) 2007-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_OPEN], [ AC_REQUIRE([AC_CANONICAL_HOST]) AC_REQUIRE([gl_PREPROC_O_CLOEXEC]) case "$host_os" in mingw* | pw*) REPLACE_OPEN=1 ;; *) dnl open("foo/") should not create a file when the file name has a dnl trailing slash. FreeBSD only has the problem on symlinks. AC_CHECK_FUNCS_ONCE([lstat]) if test "$gl_cv_macro_O_CLOEXEC" != yes; then REPLACE_OPEN=1 fi gl_OPEN_TRAILING_SLASH_BUG case "$gl_cv_func_open_slash" in *no) REPLACE_OPEN=1 ;; esac ;; esac dnl Replace open() for supporting the gnulib-defined fchdir() function, dnl to keep fchdir's bookkeeping up-to-date. m4_ifdef([gl_FUNC_FCHDIR], [ if test $REPLACE_OPEN = 0; then gl_TEST_FCHDIR if test $HAVE_FCHDIR = 0; then REPLACE_OPEN=1 fi fi ]) dnl Replace open() for supporting the gnulib-defined O_NONBLOCK flag. m4_ifdef([gl_NONBLOCKING_IO], [ if test $REPLACE_OPEN = 0; then gl_NONBLOCKING_IO if test $gl_cv_have_open_O_NONBLOCK != yes; then REPLACE_OPEN=1 fi fi ]) ]) # Prerequisites of lib/open.c. AC_DEFUN([gl_PREREQ_OPEN], [ AC_REQUIRE([gl_PROMOTED_TYPE_MODE_T]) : ]) grub-2.14~git20250718.0e36779/m4/free.m40000644000175000017500000000371015036447602013511 00000000000000# free.m4 serial 6 # Copyright (C) 2003-2005, 2009-2022 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # Written by Paul Eggert and Bruno Haible. AC_DEFUN([gl_FUNC_FREE], [ AC_REQUIRE([gl_STDLIB_H_DEFAULTS]) dnl In the next release of POSIX, free must preserve errno. dnl https://www.austingroupbugs.net/view.php?id=385 dnl https://sourceware.org/bugzilla/show_bug.cgi?id=17924 dnl So far, we know of three platforms that do this: dnl * glibc >= 2.33, thanks to the fix for this bug: dnl dnl * OpenBSD >= 4.5, thanks to this commit: dnl dnl * Solaris, because its malloc() implementation is based on brk(), dnl not mmap(); hence its free() implementation makes no system calls. dnl For other platforms, you can only be sure if they state it in their dnl documentation, or by code inspection of the free() implementation in libc. AC_CACHE_CHECK([whether free is known to preserve errno], [gl_cv_func_free_preserves_errno], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#include ]], [[#if 2 < __GLIBC__ + (33 <= __GLIBC_MINOR__) #elif defined __OpenBSD__ #elif defined __sun #else #error "'free' is not known to preserve errno" #endif ]])], [gl_cv_func_free_preserves_errno=yes], [gl_cv_func_free_preserves_errno=no]) ]) case $gl_cv_func_free_preserves_errno in *yes) AC_DEFINE([HAVE_FREE_POSIX], [1], [Define if the 'free' function is guaranteed to preserve errno.]) ;; *) REPLACE_FREE=1 ;; esac ]) # Prerequisites of lib/free.c. AC_DEFUN([gl_PREREQ_FREE], [:]) grub-2.14~git20250718.0e36779/m4/fstat.m40000644000175000017500000000211715036447602013711 00000000000000# fstat.m4 serial 8 dnl Copyright (C) 2011-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_FSTAT], [ AC_REQUIRE([AC_CANONICAL_HOST]) AC_REQUIRE([gl_SYS_STAT_H_DEFAULTS]) case "$host_os" in mingw* | solaris*) dnl On MinGW, the original stat() returns st_atime, st_mtime, dnl st_ctime values that are affected by the time zone. dnl Solaris stat can return a negative tv_nsec. REPLACE_FSTAT=1 ;; esac dnl Replace fstat() for supporting the gnulib-defined open() on directories. m4_ifdef([gl_FUNC_FCHDIR], [ gl_TEST_FCHDIR if test $HAVE_FCHDIR = 0; then case "$gl_cv_func_open_directory_works" in *yes) ;; *) REPLACE_FSTAT=1 ;; esac fi ]) ]) # Prerequisites of lib/fstat.c and lib/stat-w32.c. AC_DEFUN([gl_PREREQ_FSTAT], [ AC_REQUIRE([gl_SYS_STAT_H]) AC_REQUIRE([gl_PREREQ_STAT_W32]) : ]) grub-2.14~git20250718.0e36779/m4/vasnprintf.m40000644000175000017500000002160415036447602014764 00000000000000# vasnprintf.m4 serial 38 dnl Copyright (C) 2002-2004, 2006-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_VASNPRINTF], [ AC_CHECK_FUNCS_ONCE([vasnprintf]) if test $ac_cv_func_vasnprintf = no; then gl_REPLACE_VASNPRINTF fi ]) AC_DEFUN([gl_REPLACE_VASNPRINTF], [ AC_CHECK_FUNCS_ONCE([vasnprintf]) AC_LIBOBJ([vasnprintf]) AC_LIBOBJ([printf-args]) AC_LIBOBJ([printf-parse]) AC_LIBOBJ([asnprintf]) if test $ac_cv_func_vasnprintf = yes; then AC_DEFINE([REPLACE_VASNPRINTF], [1], [Define if vasnprintf exists but is overridden by gnulib.]) fi gl_PREREQ_PRINTF_ARGS gl_PREREQ_PRINTF_PARSE gl_PREREQ_VASNPRINTF gl_PREREQ_ASNPRINTF ]) # Prerequisites of lib/printf-args.h, lib/printf-args.c. AC_DEFUN([gl_PREREQ_PRINTF_ARGS], [ AC_REQUIRE([gt_TYPE_WCHAR_T]) AC_REQUIRE([gt_TYPE_WINT_T]) ]) # Prerequisites of lib/printf-parse.h, lib/printf-parse.c. AC_DEFUN([gl_PREREQ_PRINTF_PARSE], [ AC_REQUIRE([gl_FEATURES_H]) AC_REQUIRE([gt_TYPE_WCHAR_T]) AC_REQUIRE([gt_TYPE_WINT_T]) AC_REQUIRE([AC_TYPE_SIZE_T]) AC_CHECK_TYPE([ptrdiff_t], , [AC_DEFINE([ptrdiff_t], [long], [Define as the type of the result of subtracting two pointers, if the system doesn't define it.]) ]) AC_REQUIRE([gt_AC_TYPE_INTMAX_T]) ]) # Prerequisites of lib/vasnprintf.c. AC_DEFUN_ONCE([gl_PREREQ_VASNPRINTF], [ AC_REQUIRE([AC_FUNC_ALLOCA]) AC_REQUIRE([gt_TYPE_WCHAR_T]) AC_REQUIRE([gt_TYPE_WINT_T]) AC_CHECK_FUNCS([snprintf strnlen wcslen wcsnlen mbrtowc wcrtomb]) dnl Use the _snprintf function only if it is declared (because on NetBSD it dnl is defined as a weak alias of snprintf; we prefer to use the latter). AC_CHECK_DECLS([_snprintf], , , [[#include ]]) dnl Knowing DBL_EXPBIT0_WORD and DBL_EXPBIT0_BIT enables an optimization dnl in the code for NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_DOUBLE. AC_REQUIRE([gl_DOUBLE_EXPONENT_LOCATION]) dnl We can avoid a lot of code by assuming that snprintf's return value dnl conforms to ISO C99. So check that. AC_REQUIRE([gl_SNPRINTF_RETVAL_C99]) case "$gl_cv_func_snprintf_retval_c99" in *yes) AC_DEFINE([HAVE_SNPRINTF_RETVAL_C99], [1], [Define if the return value of the snprintf function is the number of of bytes (excluding the terminating NUL) that would have been produced if the buffer had been large enough.]) ;; esac dnl Additionally, the use of %n can be eliminated by assuming that snprintf dnl always produces NUL-terminated strings (no truncation). AC_REQUIRE([gl_SNPRINTF_TRUNCATION_C99]) case "$gl_cv_func_snprintf_truncation_c99" in *yes) AC_DEFINE([HAVE_SNPRINTF_TRUNCATION_C99], [1], [Define if the string produced by the snprintf function is always NUL terminated.]) ;; esac ]) # Extra prerequisites of lib/vasnprintf.c for supporting 'long double' # arguments. AC_DEFUN_ONCE([gl_PREREQ_VASNPRINTF_LONG_DOUBLE], [ AC_REQUIRE([gl_PRINTF_LONG_DOUBLE]) case "$gl_cv_func_printf_long_double" in *yes) ;; *) AC_DEFINE([NEED_PRINTF_LONG_DOUBLE], [1], [Define if the vasnprintf implementation needs special code for 'long double' arguments.]) ;; esac ]) # Extra prerequisites of lib/vasnprintf.c for supporting infinite 'double' # arguments. AC_DEFUN([gl_PREREQ_VASNPRINTF_INFINITE_DOUBLE], [ AC_REQUIRE([gl_PRINTF_INFINITE]) case "$gl_cv_func_printf_infinite" in *yes) ;; *) AC_DEFINE([NEED_PRINTF_INFINITE_DOUBLE], [1], [Define if the vasnprintf implementation needs special code for infinite 'double' arguments.]) ;; esac ]) # Extra prerequisites of lib/vasnprintf.c for supporting infinite 'long double' # arguments. AC_DEFUN([gl_PREREQ_VASNPRINTF_INFINITE_LONG_DOUBLE], [ AC_REQUIRE([gl_PRINTF_INFINITE_LONG_DOUBLE]) dnl There is no need to set NEED_PRINTF_INFINITE_LONG_DOUBLE if dnl NEED_PRINTF_LONG_DOUBLE is already set. AC_REQUIRE([gl_PREREQ_VASNPRINTF_LONG_DOUBLE]) case "$gl_cv_func_printf_long_double" in *yes) case "$gl_cv_func_printf_infinite_long_double" in *yes) ;; *) AC_DEFINE([NEED_PRINTF_INFINITE_LONG_DOUBLE], [1], [Define if the vasnprintf implementation needs special code for infinite 'long double' arguments.]) ;; esac ;; esac ]) # Extra prerequisites of lib/vasnprintf.c for supporting the 'a' directive. AC_DEFUN([gl_PREREQ_VASNPRINTF_DIRECTIVE_A], [ AC_REQUIRE([gl_PRINTF_DIRECTIVE_A]) case "$gl_cv_func_printf_directive_a" in *yes) ;; *) AC_DEFINE([NEED_PRINTF_DIRECTIVE_A], [1], [Define if the vasnprintf implementation needs special code for the 'a' and 'A' directives.]) AC_CHECK_FUNCS([nl_langinfo]) ;; esac ]) # Extra prerequisites of lib/vasnprintf.c for supporting the 'F' directive. AC_DEFUN([gl_PREREQ_VASNPRINTF_DIRECTIVE_F], [ AC_REQUIRE([gl_PRINTF_DIRECTIVE_F]) case "$gl_cv_func_printf_directive_f" in *yes) ;; *) AC_DEFINE([NEED_PRINTF_DIRECTIVE_F], [1], [Define if the vasnprintf implementation needs special code for the 'F' directive.]) ;; esac ]) # Extra prerequisites of lib/vasnprintf.c for supporting the 'ls' directive. AC_DEFUN([gl_PREREQ_VASNPRINTF_DIRECTIVE_LS], [ AC_REQUIRE([gl_PRINTF_DIRECTIVE_LS]) case "$gl_cv_func_printf_directive_ls" in *yes) ;; *) AC_DEFINE([NEED_PRINTF_DIRECTIVE_LS], [1], [Define if the vasnprintf implementation needs special code for the 'ls' directive.]) ;; esac ]) # Extra prerequisites of lib/vasnprintf.c for supporting the ' flag. AC_DEFUN([gl_PREREQ_VASNPRINTF_FLAG_GROUPING], [ AC_REQUIRE([gl_PRINTF_FLAG_GROUPING]) case "$gl_cv_func_printf_flag_grouping" in *yes) ;; *) AC_DEFINE([NEED_PRINTF_FLAG_GROUPING], [1], [Define if the vasnprintf implementation needs special code for the ' flag.]) ;; esac ]) # Extra prerequisites of lib/vasnprintf.c for supporting the '-' flag. AC_DEFUN([gl_PREREQ_VASNPRINTF_FLAG_LEFTADJUST], [ AC_REQUIRE([gl_PRINTF_FLAG_LEFTADJUST]) case "$gl_cv_func_printf_flag_leftadjust" in *yes) ;; *) AC_DEFINE([NEED_PRINTF_FLAG_LEFTADJUST], [1], [Define if the vasnprintf implementation needs special code for the '-' flag.]) ;; esac ]) # Extra prerequisites of lib/vasnprintf.c for supporting the 0 flag. AC_DEFUN([gl_PREREQ_VASNPRINTF_FLAG_ZERO], [ AC_REQUIRE([gl_PRINTF_FLAG_ZERO]) case "$gl_cv_func_printf_flag_zero" in *yes) ;; *) AC_DEFINE([NEED_PRINTF_FLAG_ZERO], [1], [Define if the vasnprintf implementation needs special code for the 0 flag.]) ;; esac ]) # Extra prerequisites of lib/vasnprintf.c for supporting large precisions. AC_DEFUN([gl_PREREQ_VASNPRINTF_PRECISION], [ AC_REQUIRE([gl_PRINTF_PRECISION]) case "$gl_cv_func_printf_precision" in *yes) ;; *) AC_DEFINE([NEED_PRINTF_UNBOUNDED_PRECISION], [1], [Define if the vasnprintf implementation needs special code for supporting large precisions without arbitrary bounds.]) AC_DEFINE([NEED_PRINTF_DOUBLE], [1], [Define if the vasnprintf implementation needs special code for 'double' arguments.]) AC_DEFINE([NEED_PRINTF_LONG_DOUBLE], [1], [Define if the vasnprintf implementation needs special code for 'long double' arguments.]) ;; esac ]) # Extra prerequisites of lib/vasnprintf.c for surviving out-of-memory # conditions. AC_DEFUN([gl_PREREQ_VASNPRINTF_ENOMEM], [ AC_REQUIRE([gl_PRINTF_ENOMEM]) case "$gl_cv_func_printf_enomem" in *yes) ;; *) AC_DEFINE([NEED_PRINTF_ENOMEM], [1], [Define if the vasnprintf implementation needs special code for surviving out-of-memory conditions.]) AC_DEFINE([NEED_PRINTF_DOUBLE], [1], [Define if the vasnprintf implementation needs special code for 'double' arguments.]) AC_DEFINE([NEED_PRINTF_LONG_DOUBLE], [1], [Define if the vasnprintf implementation needs special code for 'long double' arguments.]) ;; esac ]) # Prerequisites of lib/vasnprintf.c including all extras for POSIX compliance. AC_DEFUN([gl_PREREQ_VASNPRINTF_WITH_EXTRAS], [ AC_REQUIRE([gl_PREREQ_VASNPRINTF]) gl_PREREQ_VASNPRINTF_LONG_DOUBLE gl_PREREQ_VASNPRINTF_INFINITE_DOUBLE gl_PREREQ_VASNPRINTF_INFINITE_LONG_DOUBLE gl_PREREQ_VASNPRINTF_DIRECTIVE_A gl_PREREQ_VASNPRINTF_DIRECTIVE_F gl_PREREQ_VASNPRINTF_DIRECTIVE_LS gl_PREREQ_VASNPRINTF_FLAG_GROUPING gl_PREREQ_VASNPRINTF_FLAG_LEFTADJUST gl_PREREQ_VASNPRINTF_FLAG_ZERO gl_PREREQ_VASNPRINTF_PRECISION gl_PREREQ_VASNPRINTF_ENOMEM ]) # Prerequisites of lib/asnprintf.c. AC_DEFUN([gl_PREREQ_ASNPRINTF], [ ]) grub-2.14~git20250718.0e36779/m4/strdup.m40000644000175000017500000000145515036447602014115 00000000000000# strdup.m4 serial 15 dnl Copyright (C) 2002-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_STRDUP], [ AC_REQUIRE([gl_STRING_H_DEFAULTS]) AC_CHECK_DECLS_ONCE([strdup]) if test $ac_cv_have_decl_strdup = no; then HAVE_DECL_STRDUP=0 fi ]) AC_DEFUN([gl_FUNC_STRDUP_POSIX], [ AC_REQUIRE([gl_STRING_H_DEFAULTS]) AC_REQUIRE([gl_CHECK_MALLOC_POSIX]) if test $gl_cv_func_malloc_posix != yes; then REPLACE_STRDUP=1 fi AC_CHECK_DECLS_ONCE([strdup]) if test $ac_cv_have_decl_strdup = no; then HAVE_DECL_STRDUP=0 fi ]) # Prerequisites of lib/strdup.c. AC_DEFUN([gl_PREREQ_STRDUP], [:]) grub-2.14~git20250718.0e36779/m4/strings_h.m40000644000175000017500000000420215036447602014565 00000000000000# Configure a replacement for . # serial 9 # Copyright (C) 2007, 2009-2022 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. AC_DEFUN_ONCE([gl_STRINGS_H], [ dnl Ensure to expand the default settings once only, before all statements dnl that occur in other macros. AC_REQUIRE([gl_STRINGS_H_DEFAULTS]) gl_CHECK_NEXT_HEADERS([strings.h]) if test $ac_cv_header_strings_h = yes; then HAVE_STRINGS_H=1 else HAVE_STRINGS_H=0 fi AC_SUBST([HAVE_STRINGS_H]) dnl Check for declarations of anything we want to poison if the dnl corresponding gnulib module is not in use. gl_WARN_ON_USE_PREPARE([[ /* Minix 3.1.8 has a bug: must be included before . */ #include #include ]], [ffs strcasecmp strncasecmp]) ]) # gl_STRINGS_MODULE_INDICATOR([modulename]) # sets the shell variable that indicates the presence of the given module # to a C preprocessor expression that will evaluate to 1. # This macro invocation must not occur in macros that are AC_REQUIREd. AC_DEFUN([gl_STRINGS_MODULE_INDICATOR], [ dnl Ensure to expand the default settings once only. gl_STRINGS_H_REQUIRE_DEFAULTS gl_MODULE_INDICATOR_SET_VARIABLE([$1]) ]) # Initializes the default values for AC_SUBSTed shell variables. # This macro must not be AC_REQUIREd. It must only be invoked, and only # outside of macros or in macros that are not AC_REQUIREd. AC_DEFUN([gl_STRINGS_H_REQUIRE_DEFAULTS], [ m4_defun(GL_MODULE_INDICATOR_PREFIX[_STRINGS_H_MODULE_INDICATOR_DEFAULTS], [ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FFS]) ]) m4_require(GL_MODULE_INDICATOR_PREFIX[_STRINGS_H_MODULE_INDICATOR_DEFAULTS]) AC_REQUIRE([gl_STRINGS_H_DEFAULTS]) ]) AC_DEFUN([gl_STRINGS_H_DEFAULTS], [ dnl Assume proper GNU behavior unless another module says otherwise. HAVE_FFS=1; AC_SUBST([HAVE_FFS]) HAVE_STRCASECMP=1; AC_SUBST([HAVE_STRCASECMP]) HAVE_DECL_STRNCASECMP=1; AC_SUBST([HAVE_DECL_STRNCASECMP]) ]) grub-2.14~git20250718.0e36779/m4/stdbool.m40000644000175000017500000000740315036447602014241 00000000000000# Check for stdbool.h that conforms to C99. dnl Copyright (C) 2002-2006, 2009-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. #serial 9 # Prepare for substituting if it is not supported. AC_DEFUN([gl_STDBOOL_H], [ AC_REQUIRE([AC_CHECK_HEADER_STDBOOL]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl On some platforms, does not exist or does not conform to C99. dnl On Solaris 10 with CC=cc CXX=CC, exists but is not usable dnl in C++ mode (and no exists). In this case, we use our dnl replacement, also in C mode (for binary compatibility between C and C++). if test "$ac_cv_header_stdbool_h" = yes; then case "$host_os" in solaris*) if test -z "$GCC"; then GL_GENERATE_STDBOOL_H=true else GL_GENERATE_STDBOOL_H=false fi ;; *) GL_GENERATE_STDBOOL_H=false ;; esac else GL_GENERATE_STDBOOL_H=true fi if test "$ac_cv_type__Bool" = yes; then HAVE__BOOL=1 else HAVE__BOOL=0 fi AC_SUBST([HAVE__BOOL]) ]) # This version of the macro is needed in autoconf <= 2.68. AC_DEFUN([AC_CHECK_HEADER_STDBOOL], [AC_CACHE_CHECK([for stdbool.h that conforms to C99], [ac_cv_header_stdbool_h], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[ #include #ifdef __cplusplus typedef bool Bool; #else typedef _Bool Bool; #ifndef bool "error: bool is not defined" #endif #ifndef false "error: false is not defined" #endif #if false "error: false is not 0" #endif #ifndef true "error: true is not defined" #endif #if true != 1 "error: true is not 1" #endif #endif #ifndef __bool_true_false_are_defined "error: __bool_true_false_are_defined is not defined" #endif struct s { Bool s: 1; Bool t; bool u: 1; bool v; } s; char a[true == 1 ? 1 : -1]; char b[false == 0 ? 1 : -1]; char c[__bool_true_false_are_defined == 1 ? 1 : -1]; char d[(bool) 0.5 == true ? 1 : -1]; /* See body of main program for 'e'. */ char f[(Bool) 0.0 == false ? 1 : -1]; char g[true]; char h[sizeof (Bool)]; char i[sizeof s.t]; enum { j = false, k = true, l = false * true, m = true * 256 }; /* The following fails for HP aC++/ANSI C B3910B A.05.55 [Dec 04 2003]. */ Bool n[m]; char o[sizeof n == m * sizeof n[0] ? 1 : -1]; char p[-1 - (Bool) 0 < 0 && -1 - (bool) 0 < 0 ? 1 : -1]; /* Catch a bug in an HP-UX C compiler. See https://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html https://lists.gnu.org/r/bug-coreutils/2005-11/msg00161.html */ Bool q = true; Bool *pq = &q; bool *qq = &q; ]], [[ bool e = &s; *pq |= q; *pq |= ! q; *qq |= q; *qq |= ! q; /* Refer to every declared value, to avoid compiler optimizations. */ return (!a + !b + !c + !d + !e + !f + !g + !h + !i + !!j + !k + !!l + !m + !n + !o + !p + !q + !pq + !qq); ]])], [ac_cv_header_stdbool_h=yes], [ac_cv_header_stdbool_h=no])]) AC_CHECK_TYPES([_Bool]) ]) grub-2.14~git20250718.0e36779/m4/getcwd.m40000644000175000017500000001224715036447602014052 00000000000000# getcwd.m4 - check for working getcwd that is compatible with glibc # Copyright (C) 2001, 2003-2007, 2009-2022 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # Written by Paul Eggert. # serial 19 AC_DEFUN([gl_FUNC_GETCWD_NULL], [ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CHECK_HEADERS_ONCE([unistd.h]) AC_CACHE_CHECK([whether getcwd (NULL, 0) allocates memory for result], [gl_cv_func_getcwd_null], [AC_RUN_IFELSE([AC_LANG_PROGRAM([[ # include # if HAVE_UNISTD_H # include # else /* on Windows with MSVC */ # include # endif ]GL_MDA_DEFINES[ # ifndef getcwd char *getcwd (); # endif ]], [[ #if defined _WIN32 && ! defined __CYGWIN__ /* mingw cwd does not start with '/', but _getcwd does allocate. However, mingw fails to honor non-zero size. */ #else if (chdir ("/") != 0) return 1; else { char *f = getcwd (NULL, 0); if (! f) return 2; if (f[0] != '/') { free (f); return 3; } if (f[1] != '\0') { free (f); return 4; } free (f); return 0; } #endif ]])], [gl_cv_func_getcwd_null=yes], [gl_cv_func_getcwd_null=no], [[case "$host_os" in # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_getcwd_null="guessing yes";; # Guess yes on musl systems. *-musl*) gl_cv_func_getcwd_null="guessing yes";; # Guess yes on Cygwin. cygwin*) gl_cv_func_getcwd_null="guessing yes";; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_getcwd_null="$gl_cross_guess_normal";; esac ]])]) ]) AC_DEFUN([gl_FUNC_GETCWD_SIGNATURE], [ AC_CACHE_CHECK([for getcwd with POSIX signature], [gl_cv_func_getcwd_posix_signature], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#include ]GL_MDA_DEFINES], [[extern #ifdef __cplusplus "C" #endif char *getcwd (char *, size_t); ]]) ], [gl_cv_func_getcwd_posix_signature=yes], [gl_cv_func_getcwd_posix_signature=no]) ]) ]) dnl Guarantee that getcwd will malloc with a NULL first argument. Assumes dnl that either the system getcwd is robust, or that calling code is okay dnl with spurious failures when run from a directory with an absolute name dnl larger than 4k bytes. dnl dnl Assumes that getcwd exists; if you are worried about obsolete dnl platforms that lacked getcwd(), then you need to use the GPL module. AC_DEFUN([gl_FUNC_GETCWD_LGPL], [ AC_REQUIRE([gl_UNISTD_H_DEFAULTS]) AC_REQUIRE([gl_FUNC_GETCWD_NULL]) AC_REQUIRE([gl_FUNC_GETCWD_SIGNATURE]) case $gl_cv_func_getcwd_null,$gl_cv_func_getcwd_posix_signature in *yes,yes) ;; *) dnl Minimal replacement lib/getcwd-lgpl.c. REPLACE_GETCWD=1 ;; esac ]) dnl Check for all known getcwd bugs; useful for a program likely to be dnl executed from an arbitrary location. AC_DEFUN([gl_FUNC_GETCWD], [ AC_REQUIRE([gl_UNISTD_H_DEFAULTS]) AC_REQUIRE([gl_FUNC_GETCWD_NULL]) AC_REQUIRE([gl_FUNC_GETCWD_SIGNATURE]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles gl_abort_bug=no case "$host_os" in mingw*) gl_cv_func_getcwd_path_max=yes ;; *) gl_FUNC_GETCWD_PATH_MAX case "$gl_cv_func_getcwd_null" in *yes) gl_FUNC_GETCWD_ABORT_BUG([gl_abort_bug=yes]) ;; esac ;; esac dnl Define HAVE_MINIMALLY_WORKING_GETCWD and HAVE_PARTLY_WORKING_GETCWD dnl if appropriate. case "$gl_cv_func_getcwd_path_max" in *"no" | *"no, it has the AIX bug") ;; *) AC_DEFINE([HAVE_MINIMALLY_WORKING_GETCWD], [1], [Define to 1 if getcwd minimally works, that is, its result can be trusted when it succeeds.]) ;; esac case "$gl_cv_func_getcwd_path_max" in *"no, but it is partly working") AC_DEFINE([HAVE_PARTLY_WORKING_GETCWD], [1], [Define to 1 if getcwd works, except it sometimes fails when it shouldn't, setting errno to ERANGE, ENAMETOOLONG, or ENOENT.]) ;; *"yes, but with shorter paths") AC_DEFINE([HAVE_GETCWD_SHORTER], [1], [Define to 1 if getcwd works, but with shorter paths than is generally tested with the replacement.]) ;; esac if { case "$gl_cv_func_getcwd_null" in *yes) false;; *) true;; esac; } \ || test $gl_cv_func_getcwd_posix_signature != yes \ || { case "$gl_cv_func_getcwd_path_max" in *yes*) false;; *) true;; esac; } \ || test $gl_abort_bug = yes; then REPLACE_GETCWD=1 fi ]) # Prerequisites of lib/getcwd.c, when full replacement is in effect. AC_DEFUN([gl_PREREQ_GETCWD], [ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) AC_REQUIRE([gl_CHECK_TYPE_STRUCT_DIRENT_D_INO]) : ]) grub-2.14~git20250718.0e36779/m4/stddef_h.m40000644000175000017500000000710315036447602014350 00000000000000# stddef_h.m4 serial 12 dnl Copyright (C) 2009-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl A placeholder for , for platforms that have issues. AC_DEFUN_ONCE([gl_STDDEF_H], [ AC_REQUIRE([gl_STDDEF_H_DEFAULTS]) AC_REQUIRE([gt_TYPE_WCHAR_T]) dnl Persuade OpenBSD to declare max_align_t. AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) GL_GENERATE_STDDEF_H=false dnl Test whether the type max_align_t exists and whether its alignment dnl "is as great as is supported by the implementation in all contexts". AC_CACHE_CHECK([for good max_align_t], [gl_cv_type_max_align_t], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#include unsigned int s = sizeof (max_align_t); #if defined __GNUC__ || defined __clang__ || defined __IBM__ALIGNOF__ int check1[2 * (__alignof__ (double) <= __alignof__ (max_align_t)) - 1]; int check2[2 * (__alignof__ (long double) <= __alignof__ (max_align_t)) - 1]; #endif typedef struct { char a; max_align_t b; } max_helper; typedef struct { char a; long b; } long_helper; typedef struct { char a; double b; } double_helper; typedef struct { char a; long double b; } long_double_helper; int check3[2 * (offsetof (long_helper, b) <= offsetof (max_helper, b)) - 1]; int check4[2 * (offsetof (double_helper, b) <= offsetof (max_helper, b)) - 1]; int check5[2 * (offsetof (long_double_helper, b) <= offsetof (max_helper, b)) - 1]; ]])], [gl_cv_type_max_align_t=yes], [gl_cv_type_max_align_t=no]) ]) if test $gl_cv_type_max_align_t = no; then HAVE_MAX_ALIGN_T=0 GL_GENERATE_STDDEF_H=true fi if test $gt_cv_c_wchar_t = no; then HAVE_WCHAR_T=0 GL_GENERATE_STDDEF_H=true fi AC_CACHE_CHECK([whether NULL can be used in arbitrary expressions], [gl_cv_decl_null_works], [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include int test[2 * (sizeof NULL == sizeof (void *)) -1]; ]])], [gl_cv_decl_null_works=yes], [gl_cv_decl_null_works=no])]) if test $gl_cv_decl_null_works = no; then REPLACE_NULL=1 GL_GENERATE_STDDEF_H=true fi if $GL_GENERATE_STDDEF_H; then gl_NEXT_HEADERS([stddef.h]) fi ]) # gl_STDDEF_MODULE_INDICATOR([modulename]) # sets the shell variable that indicates the presence of the given module # to a C preprocessor expression that will evaluate to 1. # This macro invocation must not occur in macros that are AC_REQUIREd. AC_DEFUN([gl_STDDEF_MODULE_INDICATOR], [ dnl Ensure to expand the default settings once only. gl_STDDEF_H_REQUIRE_DEFAULTS gl_MODULE_INDICATOR_SET_VARIABLE([$1]) ]) # Initializes the default values for AC_SUBSTed shell variables. # This macro must not be AC_REQUIREd. It must only be invoked, and only # outside of macros or in macros that are not AC_REQUIREd. AC_DEFUN([gl_STDDEF_H_REQUIRE_DEFAULTS], [ m4_defun(GL_MODULE_INDICATOR_PREFIX[_STDDEF_H_MODULE_INDICATOR_DEFAULTS], [ ]) m4_require(GL_MODULE_INDICATOR_PREFIX[_STDDEF_H_MODULE_INDICATOR_DEFAULTS]) AC_REQUIRE([gl_STDDEF_H_DEFAULTS]) ]) AC_DEFUN([gl_STDDEF_H_DEFAULTS], [ dnl Assume proper GNU behavior unless another module says otherwise. REPLACE_NULL=0; AC_SUBST([REPLACE_NULL]) HAVE_MAX_ALIGN_T=1; AC_SUBST([HAVE_MAX_ALIGN_T]) HAVE_WCHAR_T=1; AC_SUBST([HAVE_WCHAR_T]) ]) grub-2.14~git20250718.0e36779/m4/__inline.m40000644000175000017500000000142315036447602014343 00000000000000# Test for __inline keyword dnl Copyright 2017-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl___INLINE], [ AC_CACHE_CHECK([whether the compiler supports the __inline keyword], [gl_cv_c___inline], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[typedef int foo_t; static __inline foo_t foo (void) { return 0; }]], [[return foo ();]])], [gl_cv_c___inline=yes], [gl_cv_c___inline=no])]) if test $gl_cv_c___inline = yes; then AC_DEFINE([HAVE___INLINE], [1], [Define to 1 if the compiler supports the keyword '__inline'.]) fi ]) grub-2.14~git20250718.0e36779/m4/builtin-expect.m40000644000175000017500000000302315036447602015521 00000000000000dnl Check for __builtin_expect. dnl Copyright 2016-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl Written by Paul Eggert. AC_DEFUN([gl___BUILTIN_EXPECT], [ AC_CACHE_CHECK([for __builtin_expect], [gl_cv___builtin_expect], [AC_LINK_IFELSE( [AC_LANG_SOURCE([[ int main (int argc, char **argv) { argc = __builtin_expect (argc, 100); return argv[argc != 100][0]; }]])], [gl_cv___builtin_expect=yes], [AC_LINK_IFELSE( [AC_LANG_SOURCE([[ #include int main (int argc, char **argv) { argc = __builtin_expect (argc, 100); return argv[argc != 100][0]; }]])], [gl_cv___builtin_expect="in "], [gl_cv___builtin_expect=no])])]) if test "$gl_cv___builtin_expect" = yes; then AC_DEFINE([HAVE___BUILTIN_EXPECT], [1]) elif test "$gl_cv___builtin_expect" = "in "; then AC_DEFINE([HAVE___BUILTIN_EXPECT], [2]) fi AH_VERBATIM([HAVE___BUILTIN_EXPECT], [/* Define to 1 if the compiler supports __builtin_expect, and to 2 if does. */ #undef HAVE___BUILTIN_EXPECT #ifndef HAVE___BUILTIN_EXPECT # define __builtin_expect(e, c) (e) #elif HAVE___BUILTIN_EXPECT == 2 # include #endif ]) ]) grub-2.14~git20250718.0e36779/m4/fcntl-o.m40000644000175000017500000001123615036447602014134 00000000000000# fcntl-o.m4 serial 7 dnl Copyright (C) 2006, 2009-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl Written by Paul Eggert. AC_PREREQ([2.60]) # Test whether the flags O_NOATIME and O_NOFOLLOW actually work. # Define HAVE_WORKING_O_NOATIME to 1 if O_NOATIME works, or to 0 otherwise. # Define HAVE_WORKING_O_NOFOLLOW to 1 if O_NOFOLLOW works, or to 0 otherwise. AC_DEFUN([gl_FCNTL_O_FLAGS], [ dnl Persuade glibc to define O_NOATIME and O_NOFOLLOW. AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CHECK_HEADERS_ONCE([unistd.h]) AC_CHECK_FUNCS_ONCE([symlink]) AC_CACHE_CHECK([for working fcntl.h], [gl_cv_header_working_fcntl_h], [AC_RUN_IFELSE( [AC_LANG_PROGRAM( [[#include #include #if HAVE_UNISTD_H # include #else /* on Windows with MSVC */ # include # include # defined sleep(n) _sleep ((n) * 1000) #endif #include ]GL_MDA_DEFINES[ #ifndef O_NOATIME #define O_NOATIME 0 #endif #ifndef O_NOFOLLOW #define O_NOFOLLOW 0 #endif static int const constants[] = { O_CREAT, O_EXCL, O_NOCTTY, O_TRUNC, O_APPEND, O_NONBLOCK, O_SYNC, O_ACCMODE, O_RDONLY, O_RDWR, O_WRONLY }; ]], [[ int result = !constants; #if HAVE_SYMLINK { static char const sym[] = "conftest.sym"; if (symlink ("/dev/null", sym) != 0) result |= 2; else { int fd = open (sym, O_WRONLY | O_NOFOLLOW | O_CREAT, 0); if (fd >= 0) { close (fd); result |= 4; } } if (unlink (sym) != 0 || symlink (".", sym) != 0) result |= 2; else { int fd = open (sym, O_RDONLY | O_NOFOLLOW); if (fd >= 0) { close (fd); result |= 4; } } unlink (sym); } #endif { static char const file[] = "confdefs.h"; int fd = open (file, O_RDONLY | O_NOATIME); if (fd < 0) result |= 8; else { struct stat st0; if (fstat (fd, &st0) != 0) result |= 16; else { char c; sleep (1); if (read (fd, &c, 1) != 1) result |= 24; else { if (close (fd) != 0) result |= 32; else { struct stat st1; if (stat (file, &st1) != 0) result |= 40; else if (st0.st_atime != st1.st_atime) result |= 64; } } } } } return result;]])], [gl_cv_header_working_fcntl_h=yes], [case $? in #( 4) gl_cv_header_working_fcntl_h='no (bad O_NOFOLLOW)';; #( 64) gl_cv_header_working_fcntl_h='no (bad O_NOATIME)';; #( 68) gl_cv_header_working_fcntl_h='no (bad O_NOATIME, O_NOFOLLOW)';; #( *) gl_cv_header_working_fcntl_h='no';; esac], [case "$host_os" in # Guess 'no' on native Windows. mingw*) gl_cv_header_working_fcntl_h='no' ;; *) gl_cv_header_working_fcntl_h=cross-compiling ;; esac ]) ]) case $gl_cv_header_working_fcntl_h in #( *O_NOATIME* | no | cross-compiling) ac_val=0;; #( *) ac_val=1;; esac AC_DEFINE_UNQUOTED([HAVE_WORKING_O_NOATIME], [$ac_val], [Define to 1 if O_NOATIME works.]) case $gl_cv_header_working_fcntl_h in #( *O_NOFOLLOW* | no | cross-compiling) ac_val=0;; #( *) ac_val=1;; esac AC_DEFINE_UNQUOTED([HAVE_WORKING_O_NOFOLLOW], [$ac_val], [Define to 1 if O_NOFOLLOW works.]) ]) grub-2.14~git20250718.0e36779/m4/inttypes_h.m40000644000175000017500000000177415036447602014766 00000000000000# inttypes_h.m4 serial 10 dnl Copyright (C) 1997-2004, 2006, 2008-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Paul Eggert. # Define HAVE_INTTYPES_H_WITH_UINTMAX if exists, # doesn't clash with , and declares uintmax_t. AC_DEFUN([gl_AC_HEADER_INTTYPES_H], [ AC_CACHE_CHECK([for inttypes.h], [gl_cv_header_inttypes_h], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[ #include #include ]], [[uintmax_t i = (uintmax_t) -1; return !i;]])], [gl_cv_header_inttypes_h=yes], [gl_cv_header_inttypes_h=no])]) if test $gl_cv_header_inttypes_h = yes; then AC_DEFINE_UNQUOTED([HAVE_INTTYPES_H_WITH_UINTMAX], [1], [Define if exists, doesn't clash with , and declares uintmax_t. ]) fi ]) grub-2.14~git20250718.0e36779/m4/isblank.m40000644000175000017500000000103215036447602014206 00000000000000# isblank.m4 serial 3 dnl Copyright (C) 2009-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_ISBLANK], [ dnl Persuade glibc to declare isblank(). AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) AC_REQUIRE([gl_CTYPE_H_DEFAULTS]) AC_CHECK_FUNCS_ONCE([isblank]) if test $ac_cv_func_isblank = no; then HAVE_ISBLANK=0 fi ]) grub-2.14~git20250718.0e36779/m4/sysexits.m40000644000175000017500000000227315036447602014466 00000000000000# sysexits.m4 serial 7 dnl Copyright (C) 2003, 2005, 2007, 2009-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_SYSEXITS], [ AC_CHECK_HEADERS_ONCE([sysexits.h]) if test $ac_cv_header_sysexits_h = yes; then HAVE_SYSEXITS_H=1 gl_CHECK_NEXT_HEADERS([sysexits.h]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], [[switch (0) { case EX_OK: case EX_USAGE: case EX_DATAERR: case EX_NOINPUT: case EX_NOUSER: case EX_NOHOST: case EX_UNAVAILABLE: case EX_SOFTWARE: case EX_OSERR: case EX_OSFILE: case EX_CANTCREAT: case EX_IOERR: case EX_TEMPFAIL: case EX_PROTOCOL: case EX_NOPERM: case EX_CONFIG: break; } ]])], [GL_GENERATE_SYSEXITS_H=false], [GL_GENERATE_SYSEXITS_H=true]) else HAVE_SYSEXITS_H=0 GL_GENERATE_SYSEXITS_H=true fi AC_SUBST([HAVE_SYSEXITS_H]) ]) grub-2.14~git20250718.0e36779/m4/limits-h.m40000644000175000017500000000227615036447602014324 00000000000000dnl Check whether limits.h has needed features. dnl Copyright 2016-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Paul Eggert. AC_DEFUN_ONCE([gl_LIMITS_H], [ gl_CHECK_NEXT_HEADERS([limits.h]) AC_CACHE_CHECK([whether limits.h has WORD_BIT, BOOL_WIDTH etc.], [gl_cv_header_limits_width], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#ifndef __STDC_WANT_IEC_60559_BFP_EXT__ #define __STDC_WANT_IEC_60559_BFP_EXT__ 1 #endif #include long long llm = LLONG_MAX; int wb = WORD_BIT; int ullw = ULLONG_WIDTH; int bw = BOOL_WIDTH; ]])], [gl_cv_header_limits_width=yes], [gl_cv_header_limits_width=no])]) if test "$gl_cv_header_limits_width" = yes; then GL_GENERATE_LIMITS_H=false else GL_GENERATE_LIMITS_H=true fi ]) dnl Unconditionally enables the replacement of . AC_DEFUN([gl_REPLACE_LIMITS_H], [ AC_REQUIRE([gl_LIMITS_H]) GL_GENERATE_LIMITS_H=true ]) grub-2.14~git20250718.0e36779/m4/malloc.m40000644000175000017500000001352015036447602014037 00000000000000# malloc.m4 serial 28 dnl Copyright (C) 2007, 2009-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. # This is adapted with modifications from upstream Autoconf here: # https://git.savannah.gnu.org/cgit/autoconf.git/tree/lib/autoconf/functions.m4?id=v2.70#n949 AC_DEFUN([_AC_FUNC_MALLOC_IF], [ AC_REQUIRE([AC_CANONICAL_HOST])dnl for cross-compiles AC_CACHE_CHECK([whether malloc (0) returns nonnull], [ac_cv_func_malloc_0_nonnull], [AC_RUN_IFELSE( [AC_LANG_PROGRAM( [[#include ]], [[void *p = malloc (0); int result = !p; free (p); return result;]]) ], [ac_cv_func_malloc_0_nonnull=yes], [ac_cv_func_malloc_0_nonnull=no], [case "$host_os" in # Guess yes on platforms where we know the result. *-gnu* | freebsd* | netbsd* | openbsd* | bitrig* \ | gnu* | *-musl* | midnightbsd* \ | hpux* | solaris* | cygwin* | mingw* | msys* ) ac_cv_func_malloc_0_nonnull="guessing yes" ;; # If we don't know, obey --enable-cross-guesses. *) ac_cv_func_malloc_0_nonnull="$gl_cross_guess_normal" ;; esac ]) ]) AS_CASE([$ac_cv_func_malloc_0_nonnull], [*yes], [$1], [$2]) ])# _AC_FUNC_MALLOC_IF # gl_FUNC_MALLOC_GNU # ------------------ # Replace malloc if it is not compatible with GNU libc. AC_DEFUN([gl_FUNC_MALLOC_GNU], [ AC_REQUIRE([gl_STDLIB_H_DEFAULTS]) AC_REQUIRE([gl_FUNC_MALLOC_POSIX]) REPLACE_MALLOC_FOR_MALLOC_GNU="$REPLACE_MALLOC_FOR_MALLOC_POSIX" if test $REPLACE_MALLOC_FOR_MALLOC_GNU = 0; then _AC_FUNC_MALLOC_IF([], [REPLACE_MALLOC_FOR_MALLOC_GNU=1]) fi ]) # gl_FUNC_MALLOC_PTRDIFF # ---------------------- # Test whether malloc (N) reliably fails when N exceeds PTRDIFF_MAX, # and replace malloc otherwise. AC_DEFUN([gl_FUNC_MALLOC_PTRDIFF], [ AC_REQUIRE([gl_STDLIB_H_DEFAULTS]) AC_REQUIRE([gl_CHECK_MALLOC_PTRDIFF]) test "$gl_cv_malloc_ptrdiff" = yes || REPLACE_MALLOC_FOR_MALLOC_POSIX=1 ]) # Test whether malloc, realloc, calloc refuse to create objects # larger than what can be expressed in ptrdiff_t. # Set gl_cv_func_malloc_gnu to yes or no accordingly. AC_DEFUN([gl_CHECK_MALLOC_PTRDIFF], [ AC_CACHE_CHECK([whether malloc is ptrdiff_t safe], [gl_cv_malloc_ptrdiff], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#include ]], [[/* 64-bit ptrdiff_t is so wide that no practical platform can exceed it. */ #define WIDE_PTRDIFF (PTRDIFF_MAX >> 31 >> 31 != 0) /* On rare machines where size_t fits in ptrdiff_t there is no problem. */ #define NARROW_SIZE (SIZE_MAX <= PTRDIFF_MAX) /* glibc 2.30 and later malloc refuses to exceed ptrdiff_t bounds even on 32-bit platforms. We don't know which non-glibc systems are safe. */ #define KNOWN_SAFE (2 < __GLIBC__ + (30 <= __GLIBC_MINOR__)) #if WIDE_PTRDIFF || NARROW_SIZE || KNOWN_SAFE return 0; #else #error "malloc might not be ptrdiff_t safe" syntax error #endif ]])], [gl_cv_malloc_ptrdiff=yes], [gl_cv_malloc_ptrdiff=no]) ]) ]) # gl_FUNC_MALLOC_POSIX # -------------------- # Test whether 'malloc' is POSIX compliant (sets errno to ENOMEM when it # fails, and doesn't mess up with ptrdiff_t overflow), and replace # malloc if it is not. AC_DEFUN([gl_FUNC_MALLOC_POSIX], [ AC_REQUIRE([gl_STDLIB_H_DEFAULTS]) AC_REQUIRE([gl_FUNC_MALLOC_PTRDIFF]) AC_REQUIRE([gl_CHECK_MALLOC_POSIX]) if test "$gl_cv_func_malloc_posix" = yes; then AC_DEFINE([HAVE_MALLOC_POSIX], [1], [Define if malloc, realloc, and calloc set errno on allocation failure.]) else REPLACE_MALLOC_FOR_MALLOC_POSIX=1 fi ]) # Test whether malloc, realloc, calloc set errno to ENOMEM on failure. # Set gl_cv_func_malloc_posix to yes or no accordingly. AC_DEFUN([gl_CHECK_MALLOC_POSIX], [ AC_REQUIRE([AC_CANONICAL_HOST]) AC_CACHE_CHECK([whether malloc, realloc, calloc set errno on failure], [gl_cv_func_malloc_posix], [ dnl It is too dangerous to try to allocate a large amount of memory: dnl some systems go to their knees when you do that. So assume that dnl all Unix implementations of the function set errno on failure, dnl except on those platforms where we have seen 'test-malloc-gnu', dnl 'test-realloc-gnu', 'test-calloc-gnu' fail. case "$host_os" in mingw*) gl_cv_func_malloc_posix=no ;; irix* | solaris*) dnl On IRIX 6.5, the three functions return NULL with errno unset dnl when the argument is larger than PTRDIFF_MAX. dnl On Solaris 11.3, the three functions return NULL with errno set dnl to EAGAIN, not ENOMEM, when the argument is larger than dnl PTRDIFF_MAX. dnl Here is a test program: m4_divert_push([KILL]) #include #include #include #define ptrdiff_t long #ifndef PTRDIFF_MAX # define PTRDIFF_MAX ((ptrdiff_t) ((1UL << (8 * sizeof (ptrdiff_t) - 1)) - 1)) #endif int main () { void *p; fprintf (stderr, "PTRDIFF_MAX = %lu\n", (unsigned long) PTRDIFF_MAX); errno = 0; p = malloc ((unsigned long) PTRDIFF_MAX + 1); fprintf (stderr, "p=%p errno=%d\n", p, errno); errno = 0; p = calloc (PTRDIFF_MAX / 2 + 1, 2); fprintf (stderr, "p=%p errno=%d\n", p, errno); errno = 0; p = realloc (NULL, (unsigned long) PTRDIFF_MAX + 1); fprintf (stderr, "p=%p errno=%d\n", p, errno); return 0; } m4_divert_pop([KILL]) gl_cv_func_malloc_posix=no ;; *) gl_cv_func_malloc_posix=yes ;; esac ]) ]) grub-2.14~git20250718.0e36779/m4/getdelim.m40000644000175000017500000000543415036447602014367 00000000000000# getdelim.m4 serial 15 dnl Copyright (C) 2005-2007, 2009-2022 Free Software Foundation, Inc. dnl dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_PREREQ([2.59]) AC_DEFUN([gl_FUNC_GETDELIM], [ AC_REQUIRE([gl_STDIO_H_DEFAULTS]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles dnl Persuade glibc to declare getdelim(). AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) AC_CHECK_DECLS_ONCE([getdelim]) AC_CHECK_FUNCS_ONCE([getdelim]) if test $ac_cv_func_getdelim = yes; then HAVE_GETDELIM=1 dnl Found it in some library. Verify that it works. AC_CACHE_CHECK([for working getdelim function], [gl_cv_func_working_getdelim], [echo fooNbarN | tr -d '\012' | tr N '\012' > conftest.data AC_RUN_IFELSE([AC_LANG_SOURCE([[ # include # include # include int main () { FILE *in = fopen ("./conftest.data", "r"); if (!in) return 1; { /* Test result for a NULL buffer and a zero size. Based on a test program from Karl Heuer. */ char *line = NULL; size_t siz = 0; int len = getdelim (&line, &siz, '\n', in); if (!(len == 4 && line && strcmp (line, "foo\n") == 0)) { free (line); fclose (in); return 2; } free (line); } { /* Test result for a NULL buffer and a non-zero size. This crashes on FreeBSD 8.0. */ char *line = NULL; size_t siz = (size_t)(~0) / 4; if (getdelim (&line, &siz, '\n', in) == -1) { fclose (in); return 3; } free (line); } fclose (in); return 0; } ]])], [gl_cv_func_working_getdelim=yes], [gl_cv_func_working_getdelim=no], [dnl We're cross compiling. dnl Guess it works on glibc2 systems and musl systems. AC_EGREP_CPP([Lucky GNU user], [ #include #ifdef __GNU_LIBRARY__ #if (__GLIBC__ >= 2) && !defined __UCLIBC__ Lucky GNU user #endif #endif ], [gl_cv_func_working_getdelim="guessing yes"], [case "$host_os" in *-musl*) gl_cv_func_working_getdelim="guessing yes" ;; *) gl_cv_func_working_getdelim="$gl_cross_guess_normal" ;; esac ]) ]) ]) case "$gl_cv_func_working_getdelim" in *yes) ;; *) REPLACE_GETDELIM=1 ;; esac else HAVE_GETDELIM=0 fi if test $ac_cv_have_decl_getdelim = no; then HAVE_DECL_GETDELIM=0 fi ]) # Prerequisites of lib/getdelim.c. AC_DEFUN([gl_PREREQ_GETDELIM], [ AC_CHECK_FUNCS([flockfile funlockfile]) AC_CHECK_DECLS([getc_unlocked]) ]) grub-2.14~git20250718.0e36779/m4/alloca.m40000644000175000017500000000731215036447602014025 00000000000000# alloca.m4 serial 21 dnl Copyright (C) 2002-2004, 2006-2007, 2009-2022 Free Software Foundation, dnl Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_ALLOCA], [ AC_REQUIRE([AC_FUNC_ALLOCA]) if test $ac_cv_func_alloca_works = no; then gl_PREREQ_ALLOCA fi # Define an additional variable used in the Makefile substitution. if test $ac_cv_working_alloca_h = yes; then AC_CACHE_CHECK([for alloca as a compiler built-in], [gl_cv_rpl_alloca], [ AC_EGREP_CPP([Need own alloca], [ #if defined __GNUC__ || defined _AIX || defined _MSC_VER Need own alloca #endif ], [gl_cv_rpl_alloca=yes], [gl_cv_rpl_alloca=no]) ]) if test $gl_cv_rpl_alloca = yes; then dnl OK, alloca can be implemented through a compiler built-in. AC_DEFINE([HAVE_ALLOCA], [1], [Define to 1 if you have 'alloca' after including , a header that may be supplied by this distribution.]) GL_GENERATE_ALLOCA_H=true else dnl alloca exists as a library function, i.e. it is slow and probably dnl a memory leak. Don't define HAVE_ALLOCA in this case. GL_GENERATE_ALLOCA_H=false fi else GL_GENERATE_ALLOCA_H=true fi if test $ac_cv_working_alloca_h = yes; then HAVE_ALLOCA_H=1 else HAVE_ALLOCA_H=0 fi AC_SUBST([HAVE_ALLOCA_H]) ]) # Prerequisites of lib/alloca.c. # STACK_DIRECTION is already handled by AC_FUNC_ALLOCA. AC_DEFUN([gl_PREREQ_ALLOCA], [:]) m4_version_prereq([2.70], [], [ # This works around a bug in autoconf <= 2.68 and has simplifications # from 2.70. See: # https://lists.gnu.org/r/bug-gnulib/2011-06/msg00277.html # https://git.savannah.gnu.org/cgit/autoconf.git/commit/?id=6cd9f12520b0d6f76d3230d7565feba1ecf29497 # https://git.savannah.gnu.org/cgit/autoconf.git/commit/?id=15edf7fd8094fd14a89d9891dd72a9624762597a # _AC_LIBOBJ_ALLOCA # ----------------- # Set up the LIBOBJ replacement of 'alloca'. Well, not exactly # AC_LIBOBJ since we actually set the output variable 'ALLOCA'. # Nevertheless, for Automake, AC_LIBSOURCES it. m4_define([_AC_LIBOBJ_ALLOCA], [# The SVR3 libPW and SVR4 libucb both contain incompatible functions # that cause trouble. Some versions do not even contain alloca or # contain a buggy version. If you still want to use their alloca, # use ar to extract alloca.o from them instead of compiling alloca.c. AC_LIBSOURCES(alloca.c) AC_SUBST([ALLOCA], [\${LIBOBJDIR}alloca.$ac_objext])dnl AC_DEFINE(C_ALLOCA, 1, [Define to 1 if using 'alloca.c'.]) AC_CACHE_CHECK([stack direction for C alloca], [ac_cv_c_stack_direction], [AC_RUN_IFELSE([AC_LANG_SOURCE( [AC_INCLUDES_DEFAULT int find_stack_direction (int *addr, int depth) { int dir, dummy = 0; if (! addr) addr = &dummy; *addr = addr < &dummy ? 1 : addr == &dummy ? 0 : -1; dir = depth ? find_stack_direction (addr, depth - 1) : 0; return dir + dummy; } int main (int argc, char **argv) { return find_stack_direction (0, argc + !argv + 20) < 0; }])], [ac_cv_c_stack_direction=1], [ac_cv_c_stack_direction=-1], [ac_cv_c_stack_direction=0])]) AH_VERBATIM([STACK_DIRECTION], [/* If using the C implementation of alloca, define if you know the direction of stack growth for your system; otherwise it will be automatically deduced at runtime. STACK_DIRECTION > 0 => grows toward higher addresses STACK_DIRECTION < 0 => grows toward lower addresses STACK_DIRECTION = 0 => direction of growth unknown */ #undef STACK_DIRECTION])dnl AC_DEFINE_UNQUOTED(STACK_DIRECTION, $ac_cv_c_stack_direction) ])# _AC_LIBOBJ_ALLOCA ]) grub-2.14~git20250718.0e36779/m4/reallocarray.m40000644000175000017500000000136715036447602015256 00000000000000# reallocarray.m4 serial 3 dnl Copyright (C) 2017-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_REALLOCARRAY], [ dnl Persuade glibc to declare reallocarray. AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) AC_REQUIRE([gl_STDLIB_H_DEFAULTS]) AC_REQUIRE([gl_CHECK_MALLOC_PTRDIFF]) AC_CHECK_FUNCS([reallocarray]) if test "$ac_cv_func_reallocarray" = no; then HAVE_REALLOCARRAY=0 elif test "$gl_cv_malloc_ptrdiff" = no; then REPLACE_REALLOCARRAY=1 fi ]) # Prerequisites of lib/reallocarray.c. AC_DEFUN([gl_PREREQ_REALLOCARRAY], [:]) grub-2.14~git20250718.0e36779/m4/intldir.m40000644000175000017500000000163315036447570014243 00000000000000# intldir.m4 serial 2 (gettext-0.18) dnl Copyright (C) 2006, 2009-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. AC_PREREQ([2.52]) dnl Tells the AM_GNU_GETTEXT macro to consider an intl/ directory. AC_DEFUN([AM_GNU_GETTEXT_INTL_SUBDIR], []) grub-2.14~git20250718.0e36779/m4/langinfo_h.m40000644000175000017500000001123415036447602014674 00000000000000# langinfo_h.m4 serial 12 dnl Copyright (C) 2009-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN_ONCE([gl_LANGINFO_H], [ AC_REQUIRE([gl_LANGINFO_H_DEFAULTS]) dnl Persuade glibc-2.0.6 to define CODESET. AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) dnl is always overridden, because of GNULIB_POSIXCHECK. gl_CHECK_NEXT_HEADERS([langinfo.h]) dnl Determine whether exists. It is missing on mingw and BeOS. HAVE_LANGINFO_CODESET=0 HAVE_LANGINFO_T_FMT_AMPM=0 HAVE_LANGINFO_ALTMON=0 HAVE_LANGINFO_ERA=0 HAVE_LANGINFO_YESEXPR=0 AC_CHECK_HEADERS_ONCE([langinfo.h]) if test $ac_cv_header_langinfo_h = yes; then HAVE_LANGINFO_H=1 dnl Determine what defines. dnl CODESET is missing on OpenBSD 3.8. dnl ERA etc. are missing on OpenBSD 6.7. dnl T_FMT_AMPM and YESEXPR, NOEXPR are missing on IRIX 5.3. dnl ALTMON_* are missing on glibc 2.26 and many other systems. AC_CACHE_CHECK([whether langinfo.h defines CODESET], [gl_cv_header_langinfo_codeset], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM([[#include int a = CODESET; ]])], [gl_cv_header_langinfo_codeset=yes], [gl_cv_header_langinfo_codeset=no]) ]) if test $gl_cv_header_langinfo_codeset = yes; then HAVE_LANGINFO_CODESET=1 fi AC_CACHE_CHECK([whether langinfo.h defines T_FMT_AMPM], [gl_cv_header_langinfo_t_fmt_ampm], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM([[#include int a = T_FMT_AMPM; ]])], [gl_cv_header_langinfo_t_fmt_ampm=yes], [gl_cv_header_langinfo_t_fmt_ampm=no]) ]) if test $gl_cv_header_langinfo_t_fmt_ampm = yes; then HAVE_LANGINFO_T_FMT_AMPM=1 fi AC_CACHE_CHECK([whether langinfo.h defines ALTMON_1], [gl_cv_header_langinfo_altmon], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM([[#include int a = ALTMON_1; ]])], [gl_cv_header_langinfo_altmon=yes], [gl_cv_header_langinfo_altmon=no]) ]) if test $gl_cv_header_langinfo_altmon = yes; then HAVE_LANGINFO_ALTMON=1 fi AC_CACHE_CHECK([whether langinfo.h defines ERA], [gl_cv_header_langinfo_era], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM([[#include int a = ERA; ]])], [gl_cv_header_langinfo_era=yes], [gl_cv_header_langinfo_era=no]) ]) if test $gl_cv_header_langinfo_era = yes; then HAVE_LANGINFO_ERA=1 fi AC_CACHE_CHECK([whether langinfo.h defines YESEXPR], [gl_cv_header_langinfo_yesexpr], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM([[#include int a = YESEXPR; ]])], [gl_cv_header_langinfo_yesexpr=yes], [gl_cv_header_langinfo_yesexpr=no]) ]) if test $gl_cv_header_langinfo_yesexpr = yes; then HAVE_LANGINFO_YESEXPR=1 fi else HAVE_LANGINFO_H=0 fi AC_SUBST([HAVE_LANGINFO_H]) AC_SUBST([HAVE_LANGINFO_CODESET]) AC_SUBST([HAVE_LANGINFO_T_FMT_AMPM]) AC_SUBST([HAVE_LANGINFO_ALTMON]) AC_SUBST([HAVE_LANGINFO_ERA]) AC_SUBST([HAVE_LANGINFO_YESEXPR]) dnl Check for declarations of anything we want to poison if the dnl corresponding gnulib module is not in use. gl_WARN_ON_USE_PREPARE([[#include ]], [nl_langinfo]) ]) # gl_LANGINFO_MODULE_INDICATOR([modulename]) # sets the shell variable that indicates the presence of the given module # to a C preprocessor expression that will evaluate to 1. # This macro invocation must not occur in macros that are AC_REQUIREd. AC_DEFUN([gl_LANGINFO_MODULE_INDICATOR], [ dnl Ensure to expand the default settings once only. gl_LANGINFO_H_REQUIRE_DEFAULTS gl_MODULE_INDICATOR_SET_VARIABLE([$1]) dnl Define it also as a C macro, for the benefit of the unit tests. gl_MODULE_INDICATOR_FOR_TESTS([$1]) ]) # Initializes the default values for AC_SUBSTed shell variables. # This macro must not be AC_REQUIREd. It must only be invoked, and only # outside of macros or in macros that are not AC_REQUIREd. AC_DEFUN([gl_LANGINFO_H_REQUIRE_DEFAULTS], [ m4_defun(GL_MODULE_INDICATOR_PREFIX[_LANGINFO_H_MODULE_INDICATOR_DEFAULTS], [ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_NL_LANGINFO]) ]) m4_require(GL_MODULE_INDICATOR_PREFIX[_LANGINFO_H_MODULE_INDICATOR_DEFAULTS]) AC_REQUIRE([gl_LANGINFO_H_DEFAULTS]) ]) AC_DEFUN([gl_LANGINFO_H_DEFAULTS], [ dnl Assume proper GNU behavior unless another module says otherwise. HAVE_NL_LANGINFO=1; AC_SUBST([HAVE_NL_LANGINFO]) REPLACE_NL_LANGINFO=0; AC_SUBST([REPLACE_NL_LANGINFO]) ]) grub-2.14~git20250718.0e36779/m4/fcntl.m40000644000175000017500000001217215036447602013700 00000000000000# fcntl.m4 serial 11 dnl Copyright (C) 2009-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. # For now, this module ensures that fcntl() # - supports F_DUPFD correctly # - supports or emulates F_DUPFD_CLOEXEC # - supports F_GETFD # Still to be ported to mingw: # - F_SETFD # - F_GETFL, F_SETFL # - F_GETOWN, F_SETOWN # - F_GETLK, F_SETLK, F_SETLKW AC_DEFUN([gl_FUNC_FCNTL], [ dnl Persuade glibc to expose F_DUPFD_CLOEXEC. AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) AC_REQUIRE([gl_FCNTL_H_DEFAULTS]) AC_REQUIRE([AC_CANONICAL_HOST]) AC_CHECK_FUNCS_ONCE([fcntl]) if test $ac_cv_func_fcntl = no; then gl_REPLACE_FCNTL else dnl cygwin 1.5.x F_DUPFD has wrong errno, and allows negative target dnl haiku alpha 2 F_DUPFD has wrong errno AC_CACHE_CHECK([whether fcntl handles F_DUPFD correctly], [gl_cv_func_fcntl_f_dupfd_works], [AC_RUN_IFELSE( [AC_LANG_PROGRAM( [[#include #include #include #include #include ]GL_MDA_DEFINES[ #ifndef RLIM_SAVED_CUR # define RLIM_SAVED_CUR RLIM_INFINITY #endif #ifndef RLIM_SAVED_MAX # define RLIM_SAVED_MAX RLIM_INFINITY #endif ]], [[int result = 0; int bad_fd = INT_MAX; struct rlimit rlim; if (getrlimit (RLIMIT_NOFILE, &rlim) == 0 && 0 <= rlim.rlim_cur && rlim.rlim_cur <= INT_MAX && rlim.rlim_cur != RLIM_INFINITY && rlim.rlim_cur != RLIM_SAVED_MAX && rlim.rlim_cur != RLIM_SAVED_CUR) bad_fd = rlim.rlim_cur; if (fcntl (0, F_DUPFD, -1) != -1) result |= 1; if (errno != EINVAL) result |= 2; if (fcntl (0, F_DUPFD, bad_fd) != -1) result |= 4; if (errno != EINVAL) result |= 8; /* On OS/2 kLIBC, F_DUPFD does not work on a directory fd */ { int fd; fd = open (".", O_RDONLY); if (fd == -1) result |= 16; else if (fcntl (fd, F_DUPFD, STDERR_FILENO + 1) == -1) result |= 32; close (fd); } return result;]])], [gl_cv_func_fcntl_f_dupfd_works=yes], [gl_cv_func_fcntl_f_dupfd_works=no], [case $host_os in aix* | cygwin* | haiku*) gl_cv_func_fcntl_f_dupfd_works="guessing no" ;; *) gl_cv_func_fcntl_f_dupfd_works="guessing yes" ;; esac])]) case $gl_cv_func_fcntl_f_dupfd_works in *yes) ;; *) gl_REPLACE_FCNTL AC_DEFINE([FCNTL_DUPFD_BUGGY], [1], [Define this to 1 if F_DUPFD behavior does not match POSIX]) ;; esac dnl Many systems lack F_DUPFD_CLOEXEC. dnl NetBSD 9.0 declares F_DUPFD_CLOEXEC but it works only like F_DUPFD. AC_CACHE_CHECK([whether fcntl understands F_DUPFD_CLOEXEC], [gl_cv_func_fcntl_f_dupfd_cloexec], [AC_RUN_IFELSE( [AC_LANG_SOURCE( [[#include #include int main (int argc, char *argv[]) { if (argc == 1) /* parent process */ { if (fcntl (1, F_DUPFD_CLOEXEC, 10) < 0) return 1; return execl ("./conftest", "./conftest", "child", NULL); } else /* child process */ return (fcntl (10, F_GETFL) < 0 ? 0 : 42); } ]]) ], [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #ifdef __linux__ /* The Linux kernel only added F_DUPFD_CLOEXEC in 2.6.24, so we always replace it to support the semantics on older kernels that failed with EINVAL. */ choke me #endif ]])], [gl_cv_func_fcntl_f_dupfd_cloexec=yes], [gl_cv_func_fcntl_f_dupfd_cloexec="needs runtime check"]) ], [gl_cv_func_fcntl_f_dupfd_cloexec=no], [case "$host_os" in # Guess no on NetBSD. netbsd*) gl_cv_func_fcntl_f_dupfd_cloexec="guessing no" ;; *) gl_cv_func_fcntl_f_dupfd_cloexec="$gl_cross_guess_normal" ;; esac ]) ]) case "$gl_cv_func_fcntl_f_dupfd_cloexec" in *yes) ;; *) gl_REPLACE_FCNTL dnl No witness macro needed for this bug. ;; esac fi dnl Replace fcntl() for supporting the gnulib-defined fchdir() function, dnl to keep fchdir's bookkeeping up-to-date. m4_ifdef([gl_FUNC_FCHDIR], [ gl_TEST_FCHDIR if test $HAVE_FCHDIR = 0; then gl_REPLACE_FCNTL fi ]) ]) AC_DEFUN([gl_REPLACE_FCNTL], [ AC_REQUIRE([gl_FCNTL_H_DEFAULTS]) AC_CHECK_FUNCS_ONCE([fcntl]) if test $ac_cv_func_fcntl = no; then HAVE_FCNTL=0 else REPLACE_FCNTL=1 fi ]) grub-2.14~git20250718.0e36779/m4/year2038.m40000644000175000017500000001143715036447602014052 00000000000000# year2038.m4 serial 7 dnl Copyright (C) 2017-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl Attempt to ensure that 'time_t' can go past the year 2038 and that dnl the functions 'time', 'stat', etc. work with post-2038 timestamps. AC_DEFUN([gl_YEAR2038_EARLY], [ AC_REQUIRE([AC_CANONICAL_HOST]) case "$host_os" in mingw*) AC_DEFINE([__MINGW_USE_VC2005_COMPAT], [1], [For 64-bit time_t on 32-bit mingw.]) ;; esac ]) # gl_YEAR2038_TEST_INCLUDES # ------------------------- AC_DEFUN([gl_YEAR2038_TEST_INCLUDES], [[ #include /* Check that time_t can represent 2**32 - 1 correctly. */ #define LARGE_TIME_T \\ ((time_t) (((time_t) 1 << 30) - 1 + 3 * ((time_t) 1 << 30))) int verify_time_t_range[(LARGE_TIME_T / 65537 == 65535 && LARGE_TIME_T % 65537 == 0) ? 1 : -1]; ]]) # gl_YEAR2038_BODY(REQUIRE-YEAR2038-SAFE) ----------------------------------------- AC_DEFUN([gl_YEAR2038_BODY], [ AC_ARG_ENABLE([year2038], [ --disable-year2038 omit support for timestamps past the year 2038]) AS_IF([test "$enable_year2038" != no], [ dnl On many systems, time_t is already a 64-bit type. dnl On those systems where time_t is still 32-bit, it requires kernel dnl and libc support to make it 64-bit. For glibc 2.34 and later on Linux, dnl defining _TIME_BITS=64 and _FILE_OFFSET_BITS=64 is needed on x86 and ARM. dnl dnl On native Windows, the system include files define types __time32_t dnl and __time64_t. By default, time_t is an alias of dnl - __time32_t on 32-bit mingw, dnl - __time64_t on 64-bit mingw and on MSVC (since MSVC 8). dnl But when compiling with -D__MINGW_USE_VC2005_COMPAT, time_t is an dnl alias of __time64_t. dnl And when compiling with -D_USE_32BIT_TIME_T, time_t is an alias of dnl __time32_t. AC_CACHE_CHECK([for time_t past the year 2038], [gl_cv_type_time_t_y2038], [AC_COMPILE_IFELSE( [AC_LANG_SOURCE([gl_YEAR2038_TEST_INCLUDES])], [gl_cv_type_time_t_y2038=yes], [gl_cv_type_time_t_y2038=no]) ]) if test "$gl_cv_type_time_t_y2038" = no; then AC_CACHE_CHECK([for 64-bit time_t with _TIME_BITS=64], [gl_cv_type_time_t_bits_macro], [AC_COMPILE_IFELSE( [AC_LANG_SOURCE([[#define _TIME_BITS 64 #define _FILE_OFFSET_BITS 64 ]gl_YEAR2038_TEST_INCLUDES])], [gl_cv_type_time_t_bits_macro=yes], [gl_cv_type_time_t_bits_macro=no]) ]) if test "$gl_cv_type_time_t_bits_macro" = yes; then AC_DEFINE([_TIME_BITS], [64], [Number of bits in a timestamp, on hosts where this is settable.]) dnl AC_SYS_LARGFILE also defines this; it's OK if we do too. AC_DEFINE([_FILE_OFFSET_BITS], [64], [Number of bits in a file offset, on hosts where this is settable.]) gl_cv_type_time_t_y2038=yes fi fi if test $gl_cv_type_time_t_y2038 = no; then AC_COMPILE_IFELSE( [AC_LANG_SOURCE( [[#ifdef _USE_32BIT_TIME_T int ok; #else error fail #endif ]])], [AC_MSG_FAILURE( [The 'time_t' type stops working after January 2038. Remove _USE_32BIT_TIME_T from the compiler flags.])], [# If not cross-compiling and $1 says we should check, # and 'touch' works with a large timestamp, then evidently wider time_t # is desired and supported, so fail and ask the builder to fix the # problem. Otherwise, just warn the builder. m4_ifval([$1], [if test $cross_compiling = no \ && TZ=UTC0 touch -t 210602070628.15 conftest.time 2>/dev/null; then case `TZ=UTC0 LC_ALL=C ls -l conftest.time 2>/dev/null` in *'Feb 7 2106'* | *'Feb 7 17:10'*) AC_MSG_FAILURE( [The 'time_t' type stops working after January 2038, and your system appears to support a wider 'time_t'. Try configuring with 'CC="${CC} -m64"'. To build with a 32-bit time_t anyway (not recommended), configure with '--disable-year2038'.]);; esac rm -f conftest.time fi]) if test "$gl_warned_about_y2038" != yes; then AC_MSG_WARN( [The 'time_t' type stops working after January 2038, and this package needs a wider 'time_t' type if there is any way to access timestamps after that. Configure with 'CC="${CC} -m64"' perhaps?]) gl_warned_about_y2038=yes fi ]) fi]) ]) AC_DEFUN([gl_YEAR2038], [ gl_YEAR2038_BODY([require-year2038-safe]) ]) grub-2.14~git20250718.0e36779/m4/sys_socket_h.m40000644000175000017500000001633315036447602015272 00000000000000# sys_socket_h.m4 serial 29 dnl Copyright (C) 2005-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Simon Josefsson. AC_DEFUN_ONCE([gl_SYS_SOCKET_H], [ AC_REQUIRE([gl_SYS_SOCKET_H_DEFAULTS]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl On OSF/1, the functions recv(), send(), recvfrom(), sendto() have dnl old-style declarations (with return type 'int' instead of 'ssize_t') dnl unless _POSIX_PII_SOCKET is defined. case "$host_os" in osf*) AC_DEFINE([_POSIX_PII_SOCKET], [1], [Define to 1 in order to get the POSIX compatible declarations of socket functions.]) ;; esac GL_GENERATE_SYS_SOCKET_H=false AC_CACHE_CHECK([whether is self-contained], [gl_cv_header_sys_socket_h_selfcontained], [ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], [[]])], [gl_cv_header_sys_socket_h_selfcontained=yes], [gl_cv_header_sys_socket_h_selfcontained=no]) ]) if test $gl_cv_header_sys_socket_h_selfcontained = yes; then dnl If the shutdown function exists, should define dnl SHUT_RD, SHUT_WR, SHUT_RDWR. AC_CHECK_FUNCS([shutdown]) if test $ac_cv_func_shutdown = yes; then AC_CACHE_CHECK([whether defines the SHUT_* macros], [gl_cv_header_sys_socket_h_shut], [ AC_COMPILE_IFELSE( [AC_LANG_PROGRAM([[#include ]], [[int a[] = { SHUT_RD, SHUT_WR, SHUT_RDWR };]])], [gl_cv_header_sys_socket_h_shut=yes], [gl_cv_header_sys_socket_h_shut=no]) ]) if test $gl_cv_header_sys_socket_h_shut = no; then GL_GENERATE_SYS_SOCKET_H=true fi fi fi # We need to check for ws2tcpip.h now. gl_PREREQ_SYS_H_SOCKET AC_CHECK_TYPES([struct sockaddr_storage, sa_family_t],,,[ /* sys/types.h is not needed according to POSIX, but the sys/socket.h in i386-unknown-freebsd4.10 and powerpc-apple-darwin5.5 required it. */ #include #ifdef HAVE_SYS_SOCKET_H #include #endif #ifdef HAVE_WS2TCPIP_H #include #endif ]) if test $ac_cv_type_struct_sockaddr_storage = no; then HAVE_STRUCT_SOCKADDR_STORAGE=0 fi if test $ac_cv_type_sa_family_t = no; then HAVE_SA_FAMILY_T=0 fi if test $ac_cv_type_struct_sockaddr_storage != no; then AC_CHECK_MEMBERS([struct sockaddr_storage.ss_family], [], [HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY=0], [#include #ifdef HAVE_SYS_SOCKET_H #include #endif #ifdef HAVE_WS2TCPIP_H #include #endif ]) fi if test $HAVE_STRUCT_SOCKADDR_STORAGE = 0 || test $HAVE_SA_FAMILY_T = 0 \ || test $HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY = 0; then GL_GENERATE_SYS_SOCKET_H=true fi gl_PREREQ_SYS_H_WINSOCK2 dnl Check for declarations of anything we want to poison if the dnl corresponding gnulib module is not in use. gl_WARN_ON_USE_PREPARE([[ /* Some systems require prerequisite headers. */ #include #include ]], [socket connect accept bind getpeername getsockname getsockopt listen recv send recvfrom sendto setsockopt shutdown accept4]) AC_REQUIRE([AC_C_RESTRICT]) ]) AC_DEFUN([gl_PREREQ_SYS_H_SOCKET], [ dnl Check prerequisites of the replacement. AC_REQUIRE([gl_CHECK_SOCKET_HEADERS]) gl_CHECK_NEXT_HEADERS([sys/socket.h]) if test $ac_cv_header_sys_socket_h = yes; then HAVE_SYS_SOCKET_H=1 else HAVE_SYS_SOCKET_H=0 fi AC_SUBST([HAVE_SYS_SOCKET_H]) gl_PREREQ_SYS_H_WS2TCPIP ]) # Common prerequisites of the replacement and of the # replacement. # Sets and substitutes HAVE_WINSOCK2_H. AC_DEFUN([gl_PREREQ_SYS_H_WINSOCK2], [ m4_ifdef([gl_UNISTD_H_DEFAULTS], [AC_REQUIRE([gl_UNISTD_H_DEFAULTS])]) m4_ifdef([gl_SYS_IOCTL_H_DEFAULTS], [AC_REQUIRE([gl_SYS_IOCTL_H_DEFAULTS])]) AC_CHECK_HEADERS_ONCE([sys/socket.h]) if test $ac_cv_header_sys_socket_h != yes; then dnl We cannot use AC_CHECK_HEADERS_ONCE here, because that would make dnl the check for those headers unconditional; yet cygwin reports dnl that the headers are present but cannot be compiled (since on dnl cygwin, all socket information should come from sys/socket.h). AC_CHECK_HEADERS([winsock2.h]) fi if test "$ac_cv_header_winsock2_h" = yes; then HAVE_WINSOCK2_H=1 UNISTD_H_HAVE_WINSOCK2_H=1 SYS_IOCTL_H_HAVE_WINSOCK2_H=1 else HAVE_WINSOCK2_H=0 fi AC_SUBST([HAVE_WINSOCK2_H]) ]) # Common prerequisites of the replacement and of the # replacement. # Sets and substitutes HAVE_WS2TCPIP_H. AC_DEFUN([gl_PREREQ_SYS_H_WS2TCPIP], [ AC_REQUIRE([gl_CHECK_SOCKET_HEADERS]) if test $ac_cv_header_sys_socket_h = yes; then HAVE_WS2TCPIP_H=0 else if test $ac_cv_header_ws2tcpip_h = yes; then HAVE_WS2TCPIP_H=1 else HAVE_WS2TCPIP_H=0 fi fi AC_SUBST([HAVE_WS2TCPIP_H]) ]) # gl_SYS_SOCKET_MODULE_INDICATOR([modulename]) # sets the shell variable that indicates the presence of the given module # to a C preprocessor expression that will evaluate to 1. # This macro invocation must not occur in macros that are AC_REQUIREd. AC_DEFUN([gl_SYS_SOCKET_MODULE_INDICATOR], [ dnl Ensure to expand the default settings once only. gl_SYS_SOCKET_H_REQUIRE_DEFAULTS gl_MODULE_INDICATOR_SET_VARIABLE([$1]) dnl Define it also as a C macro, for the benefit of the unit tests. gl_MODULE_INDICATOR_FOR_TESTS([$1]) ]) # Initializes the default values for AC_SUBSTed shell variables. # This macro must not be AC_REQUIREd. It must only be invoked, and only # outside of macros or in macros that are not AC_REQUIREd. AC_DEFUN([gl_SYS_SOCKET_H_REQUIRE_DEFAULTS], [ m4_defun(GL_MODULE_INDICATOR_PREFIX[_SYS_SOCKET_H_MODULE_INDICATOR_DEFAULTS], [ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SOCKET]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_CONNECT]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ACCEPT]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_BIND]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GETPEERNAME]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GETSOCKNAME]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GETSOCKOPT]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LISTEN]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_RECV]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SEND]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_RECVFROM]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SENDTO]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SETSOCKOPT]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SHUTDOWN]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ACCEPT4]) ]) m4_require(GL_MODULE_INDICATOR_PREFIX[_SYS_SOCKET_H_MODULE_INDICATOR_DEFAULTS]) AC_REQUIRE([gl_SYS_SOCKET_H_DEFAULTS]) ]) AC_DEFUN([gl_SYS_SOCKET_H_DEFAULTS], [ HAVE_STRUCT_SOCKADDR_STORAGE=1; AC_SUBST([HAVE_STRUCT_SOCKADDR_STORAGE]) HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY=1; AC_SUBST([HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY]) HAVE_SA_FAMILY_T=1; AC_SUBST([HAVE_SA_FAMILY_T]) HAVE_ACCEPT4=1; AC_SUBST([HAVE_ACCEPT4]) ]) grub-2.14~git20250718.0e36779/m4/locale-fr.m40000644000175000017500000002447415036447602014446 00000000000000# locale-fr.m4 serial 20 dnl Copyright (C) 2003, 2005-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. dnl Determine the name of a french locale with traditional encoding. AC_DEFUN([gt_LOCALE_FR], [ AC_REQUIRE([AC_CANONICAL_HOST]) AC_REQUIRE([AM_LANGINFO_CODESET]) AC_CACHE_CHECK([for a traditional french locale], [gt_cv_locale_fr], [ AC_LANG_CONFTEST([AC_LANG_SOURCE([[ #include #include #if HAVE_LANGINFO_CODESET # include #endif #include #include struct tm t; char buf[16]; int main () { /* On BeOS and Haiku, locales are not implemented in libc. Rather, libintl imitates locale dependent behaviour by looking at the environment variables, and all locales use the UTF-8 encoding. */ #if defined __BEOS__ || defined __HAIKU__ return 1; #else /* Check whether the given locale name is recognized by the system. */ # if defined _WIN32 && !defined __CYGWIN__ /* On native Windows, setlocale(category, "") looks at the system settings, not at the environment variables. Also, when an encoding suffix such as ".65001" or ".54936" is specified, it succeeds but sets the LC_CTYPE category of the locale to "C". */ if (setlocale (LC_ALL, getenv ("LC_ALL")) == NULL || strcmp (setlocale (LC_CTYPE, NULL), "C") == 0) return 1; # else if (setlocale (LC_ALL, "") == NULL) return 1; # endif /* Check whether nl_langinfo(CODESET) is nonempty and not "ASCII" or "646". On Mac OS X 10.3.5 (Darwin 7.5) in the fr_FR locale, nl_langinfo(CODESET) is empty, and the behaviour of Tcl 8.4 in this locale is not useful. On OpenBSD 4.0, when an unsupported locale is specified, setlocale() succeeds but then nl_langinfo(CODESET) is "646". In this situation, some unit tests fail. On MirBSD 10, when an unsupported locale is specified, setlocale() succeeds but then nl_langinfo(CODESET) is "UTF-8". */ # if HAVE_LANGINFO_CODESET { const char *cs = nl_langinfo (CODESET); if (cs[0] == '\0' || strcmp (cs, "ASCII") == 0 || strcmp (cs, "646") == 0 || strcmp (cs, "UTF-8") == 0) return 1; } # endif # ifdef __CYGWIN__ /* On Cygwin, avoid locale names without encoding suffix, because the locale_charset() function relies on the encoding suffix. Note that LC_ALL is set on the command line. */ if (strchr (getenv ("LC_ALL"), '.') == NULL) return 1; # endif /* Check whether in the abbreviation of the second month, the second character (should be U+00E9: LATIN SMALL LETTER E WITH ACUTE) is only one byte long. This excludes the UTF-8 encoding. */ t.tm_year = 1975 - 1900; t.tm_mon = 2 - 1; t.tm_mday = 4; if (strftime (buf, sizeof (buf), "%b", &t) < 3 || buf[2] != 'v') return 1; # if !defined __BIONIC__ /* Bionic libc's 'struct lconv' is just a dummy. */ /* Check whether the decimal separator is a comma. On NetBSD 3.0 in the fr_FR.ISO8859-1 locale, localeconv()->decimal_point are nl_langinfo(RADIXCHAR) are both ".". */ if (localeconv () ->decimal_point[0] != ',') return 1; # endif return 0; #endif } ]])]) if AC_TRY_EVAL([ac_link]) && test -s conftest$ac_exeext; then case "$host_os" in # Handle native Windows specially, because there setlocale() interprets # "ar" as "Arabic" or "Arabic_Saudi Arabia.1256", # "fr" or "fra" as "French" or "French_France.1252", # "ge"(!) or "deu"(!) as "German" or "German_Germany.1252", # "ja" as "Japanese" or "Japanese_Japan.932", # and similar. mingw*) # Test for the native Windows locale name. if (LC_ALL=French_France.1252 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then gt_cv_locale_fr=French_France.1252 else # None found. gt_cv_locale_fr=none fi ;; *) # Setting LC_ALL is not enough. Need to set LC_TIME to empty, because # otherwise on Mac OS X 10.3.5 the LC_TIME=C from the beginning of the # configure script would override the LC_ALL setting. Likewise for # LC_CTYPE, which is also set at the beginning of the configure script. # Test for the usual locale name. if (LC_ALL=fr_FR LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then gt_cv_locale_fr=fr_FR else # Test for the locale name with explicit encoding suffix. if (LC_ALL=fr_FR.ISO-8859-1 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then gt_cv_locale_fr=fr_FR.ISO-8859-1 else # Test for the AIX, OSF/1, FreeBSD, NetBSD, OpenBSD locale name. if (LC_ALL=fr_FR.ISO8859-1 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then gt_cv_locale_fr=fr_FR.ISO8859-1 else # Test for the HP-UX locale name. if (LC_ALL=fr_FR.iso88591 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then gt_cv_locale_fr=fr_FR.iso88591 else # Test for the Solaris 7 locale name. if (LC_ALL=fr LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then gt_cv_locale_fr=fr else # None found. gt_cv_locale_fr=none fi fi fi fi fi ;; esac fi rm -fr conftest* ]) LOCALE_FR=$gt_cv_locale_fr AC_SUBST([LOCALE_FR]) ]) dnl Determine the name of a french locale with UTF-8 encoding. AC_DEFUN([gt_LOCALE_FR_UTF8], [ AC_REQUIRE([AM_LANGINFO_CODESET]) AC_CACHE_CHECK([for a french Unicode locale], [gt_cv_locale_fr_utf8], [ AC_LANG_CONFTEST([AC_LANG_SOURCE([[ #include #include #if HAVE_LANGINFO_CODESET # include #endif #include #include struct tm t; char buf[16]; int main () { /* On BeOS and Haiku, locales are not implemented in libc. Rather, libintl imitates locale dependent behaviour by looking at the environment variables, and all locales use the UTF-8 encoding. */ #if !(defined __BEOS__ || defined __HAIKU__) /* Check whether the given locale name is recognized by the system. */ # if defined _WIN32 && !defined __CYGWIN__ /* On native Windows, setlocale(category, "") looks at the system settings, not at the environment variables. Also, when an encoding suffix such as ".65001" or ".54936" is specified, it succeeds but sets the LC_CTYPE category of the locale to "C". */ if (setlocale (LC_ALL, getenv ("LC_ALL")) == NULL || strcmp (setlocale (LC_CTYPE, NULL), "C") == 0) return 1; # else if (setlocale (LC_ALL, "") == NULL) return 1; # endif /* Check whether nl_langinfo(CODESET) is nonempty and not "ASCII" or "646". On Mac OS X 10.3.5 (Darwin 7.5) in the fr_FR locale, nl_langinfo(CODESET) is empty, and the behaviour of Tcl 8.4 in this locale is not useful. On OpenBSD 4.0, when an unsupported locale is specified, setlocale() succeeds but then nl_langinfo(CODESET) is "646". In this situation, some unit tests fail. */ # if HAVE_LANGINFO_CODESET { const char *cs = nl_langinfo (CODESET); if (cs[0] == '\0' || strcmp (cs, "ASCII") == 0 || strcmp (cs, "646") == 0) return 1; } # endif # ifdef __CYGWIN__ /* On Cygwin, avoid locale names without encoding suffix, because the locale_charset() function relies on the encoding suffix. Note that LC_ALL is set on the command line. */ if (strchr (getenv ("LC_ALL"), '.') == NULL) return 1; # endif /* Check whether in the abbreviation of the second month, the second character (should be U+00E9: LATIN SMALL LETTER E WITH ACUTE) is two bytes long, with UTF-8 encoding. */ t.tm_year = 1975 - 1900; t.tm_mon = 2 - 1; t.tm_mday = 4; if (strftime (buf, sizeof (buf), "%b", &t) < 4 || buf[1] != (char) 0xc3 || buf[2] != (char) 0xa9 || buf[3] != 'v') return 1; #endif #if !defined __BIONIC__ /* Bionic libc's 'struct lconv' is just a dummy. */ /* Check whether the decimal separator is a comma. On NetBSD 3.0 in the fr_FR.ISO8859-1 locale, localeconv()->decimal_point are nl_langinfo(RADIXCHAR) are both ".". */ if (localeconv () ->decimal_point[0] != ',') return 1; #endif return 0; } ]])]) if AC_TRY_EVAL([ac_link]) && test -s conftest$ac_exeext; then case "$host_os" in # Handle native Windows specially, because there setlocale() interprets # "ar" as "Arabic" or "Arabic_Saudi Arabia.1256", # "fr" or "fra" as "French" or "French_France.1252", # "ge"(!) or "deu"(!) as "German" or "German_Germany.1252", # "ja" as "Japanese" or "Japanese_Japan.932", # and similar. mingw*) # Test for the hypothetical native Windows locale name. if (LC_ALL=French_France.65001 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then gt_cv_locale_fr_utf8=French_France.65001 else # None found. gt_cv_locale_fr_utf8=none fi ;; *) # Setting LC_ALL is not enough. Need to set LC_TIME to empty, because # otherwise on Mac OS X 10.3.5 the LC_TIME=C from the beginning of the # configure script would override the LC_ALL setting. Likewise for # LC_CTYPE, which is also set at the beginning of the configure script. # Test for the usual locale name. if (LC_ALL=fr_FR LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then gt_cv_locale_fr_utf8=fr_FR else # Test for the locale name with explicit encoding suffix. if (LC_ALL=fr_FR.UTF-8 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then gt_cv_locale_fr_utf8=fr_FR.UTF-8 else # Test for the Solaris 7 locale name. if (LC_ALL=fr.UTF-8 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then gt_cv_locale_fr_utf8=fr.UTF-8 else # None found. gt_cv_locale_fr_utf8=none fi fi fi ;; esac fi rm -fr conftest* ]) LOCALE_FR_UTF8=$gt_cv_locale_fr_utf8 AC_SUBST([LOCALE_FR_UTF8]) ]) grub-2.14~git20250718.0e36779/m4/gnulib-comp.m40000644000175000017500000011314315036447610015005 00000000000000# DO NOT EDIT! GENERATED AUTOMATICALLY! # Copyright (C) 2002-2022 Free Software Foundation, Inc. # # This file is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This file is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this file. If not, see . # # As a special exception to the GNU General Public License, # this file may be distributed as part of a program that # contains a configuration script generated by Autoconf, under # the same distribution terms as the rest of that program. # # Generated by gnulib-tool. # # This file represents the compiled summary of the specification in # gnulib-cache.m4. It lists the computed macro invocations that need # to be invoked from configure.ac. # In projects that use version control, this file can be treated like # other built files. # This macro should be invoked from ./configure.ac, in the section # "Checks for programs", right after AC_PROG_CC, and certainly before # any checks for libraries, header files, types and library functions. AC_DEFUN([gl_EARLY], [ m4_pattern_forbid([^gl_[A-Z]])dnl the gnulib macro namespace m4_pattern_allow([^gl_ES$])dnl a valid locale name m4_pattern_allow([^gl_LIBOBJS$])dnl a variable m4_pattern_allow([^gl_LTLIBOBJS$])dnl a variable # Pre-early section. AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) AC_REQUIRE([gl_PROG_AR_RANLIB]) AC_REQUIRE([AM_PROG_CC_C_O]) # Code from module absolute-header: # Code from module alloca: # Code from module alloca-opt: # Code from module argp: # Code from module assure: # Code from module at-internal: # Code from module attribute: # Code from module base64: # Code from module basename-lgpl: # Code from module btowc: # Code from module builtin-expect: # Code from module c99: # Code from module calloc-gnu: # Code from module calloc-posix: # Code from module chdir: # Code from module chdir-long: # Code from module cloexec: # Code from module close: # Code from module ctype: # Code from module dirent: # Code from module dirfd: # Code from module double-slash-root: # Code from module dup2: # Code from module dynarray: # Code from module errno: # Code from module error: # Code from module exitfail: # Code from module extensions: # Code from module extern-inline: # Code from module fchdir: # Code from module fcntl: # Code from module fcntl-h: # Code from module fd-hook: # Code from module fd-safer-flag: # Code from module filename: # Code from module filenamecat-lgpl: # Code from module flexmember: # Code from module float: # Code from module fnmatch: # Code from module fnmatch-h: # Code from module free-posix: # Code from module fstat: # Code from module gen-header: # Code from module getcwd-lgpl: # Code from module getdelim: # Code from module getdtablesize: # Code from module getline: # Code from module getopt-gnu: # Code from module getopt-posix: # Code from module getprogname: # Code from module gettext-h: # Code from module gitlog-to-changelog: # Code from module hard-locale: # Code from module ialloc: # Code from module idx: # Code from module include_next: # Code from module intprops: # Code from module inttypes-incomplete: # Code from module isblank: # Code from module langinfo: # Code from module largefile: AC_REQUIRE([AC_SYS_LARGEFILE]) AC_REQUIRE([gl_YEAR2038_EARLY]) # Code from module libc-config: # Code from module limits-h: # Code from module localcharset: # Code from module locale: # Code from module localeconv: # Code from module lock: # Code from module malloc-gnu: # Code from module malloc-posix: # Code from module malloca: # Code from module mbrtowc: # Code from module mbsinit: # Code from module mbsrtowcs: # Code from module mbswidth: # Code from module mbtowc: # Code from module memchr: # Code from module mempcpy: # Code from module memrchr: # Code from module msvc-inval: # Code from module msvc-nothrow: # Code from module multiarch: # Code from module nl_langinfo: # Code from module nocrash: # Code from module open: # Code from module openat: # Code from module openat-die: # Code from module openat-h: # Code from module pathmax: # Code from module pipe-posix: # Code from module progname: # Code from module rawmemchr: # Code from module realloc-gnu: # Code from module realloc-posix: # Code from module reallocarray: # Code from module regex: # Code from module save-cwd: # Code from module setlocale-null: # Code from module size_max: # Code from module sleep: # Code from module snippet/_Noreturn: # Code from module snippet/arg-nonnull: # Code from module snippet/c++defs: # Code from module snippet/warn-on-use: # Code from module ssize_t: # Code from module stat: # Code from module stat-time: # Code from module std-gnu11: # Code from module stdalign: # Code from module stdbool: # Code from module stddef: # Code from module stdint: # Code from module stdio: # Code from module stdlib: # Code from module strcase: # Code from module strchrnul: # Code from module strdup-posix: # Code from module streq: # Code from module strerror: # Code from module strerror-override: # Code from module string: # Code from module strings: # Code from module strndup: # Code from module strnlen: # Code from module strnlen1: # Code from module sys_stat: # Code from module sys_types: # Code from module sysexits: # Code from module threadlib: gl_THREADLIB_EARLY # Code from module time: # Code from module unistd: # Code from module unistd-safer: # Code from module unitypes: # Code from module uniwidth/base: # Code from module uniwidth/width: # Code from module vararrays: # Code from module vasnprintf: # Code from module verify: # Code from module vsnprintf: # Code from module wchar: # Code from module wcrtomb: # Code from module wctype-h: # Code from module wcwidth: # Code from module windows-mutex: # Code from module windows-once: # Code from module windows-recmutex: # Code from module windows-rwlock: # Code from module wmemchr: # Code from module wmempcpy: # Code from module xalloc-oversized: # Code from module xsize: ]) # This macro should be invoked from ./configure.ac, in the section # "Check for header files, types and library functions". AC_DEFUN([gl_INIT], [ AC_CONFIG_LIBOBJ_DIR([grub-core/lib/gnulib]) AM_CONDITIONAL([GL_COND_LIBTOOL], [false]) gl_cond_libtool=false gl_libdeps= gl_ltlibdeps= gl_m4_base='m4' m4_pushdef([AC_LIBOBJ], m4_defn([gl_LIBOBJ])) m4_pushdef([AC_REPLACE_FUNCS], m4_defn([gl_REPLACE_FUNCS])) m4_pushdef([AC_LIBSOURCES], m4_defn([gl_LIBSOURCES])) m4_pushdef([gl_LIBSOURCES_LIST], []) m4_pushdef([gl_LIBSOURCES_DIR], []) m4_pushdef([GL_MACRO_PREFIX], [gl]) m4_pushdef([GL_MODULE_INDICATOR_PREFIX], [GL]) gl_COMMON gl_source_base='grub-core/lib/gnulib' gl_source_base_prefix= gl_FUNC_ALLOCA gl_CONDITIONAL_HEADER([alloca.h]) AC_PROG_MKDIR_P gl_ARGP m4_ifdef([AM_XGETTEXT_OPTION], [AM_][XGETTEXT_OPTION([--flag=argp_error:2:c-format]) AM_][XGETTEXT_OPTION([--flag=argp_failure:4:c-format])]) AC_REQUIRE([AC_CANONICAL_HOST]) gl_FUNC_BASE64 gl_FUNC_BTOWC gl_CONDITIONAL([GL_COND_OBJ_BTOWC], [test $HAVE_BTOWC = 0 || test $REPLACE_BTOWC = 1]) AM_COND_IF([GL_COND_OBJ_BTOWC], [ gl_PREREQ_BTOWC ]) gl_WCHAR_MODULE_INDICATOR([btowc]) gl___BUILTIN_EXPECT gl_FUNC_CALLOC_GNU if test $REPLACE_CALLOC_FOR_CALLOC_GNU = 1; then AC_LIBOBJ([calloc]) fi gl_STDLIB_MODULE_INDICATOR([calloc-gnu]) gl_FUNC_CALLOC_POSIX if test $REPLACE_CALLOC_FOR_CALLOC_POSIX = 1; then AC_LIBOBJ([calloc]) fi gl_STDLIB_MODULE_INDICATOR([calloc-posix]) gl_UNISTD_MODULE_INDICATOR([chdir]) gl_FUNC_CHDIR_LONG gl_CONDITIONAL([GL_COND_OBJ_CHDIR_LONG], [test $gl_cv_have_unlimited_file_name_length = no]) AM_COND_IF([GL_COND_OBJ_CHDIR_LONG], [ gl_PREREQ_CHDIR_LONG ]) gl_MODULE_INDICATOR_FOR_TESTS([cloexec]) gl_FUNC_CLOSE gl_CONDITIONAL([GL_COND_OBJ_CLOSE], [test $REPLACE_CLOSE = 1]) gl_UNISTD_MODULE_INDICATOR([close]) gl_CTYPE_H gl_CTYPE_H_REQUIRE_DEFAULTS AC_PROG_MKDIR_P gl_DIRENT_H gl_DIRENT_H_REQUIRE_DEFAULTS AC_PROG_MKDIR_P gl_FUNC_DIRFD gl_CONDITIONAL([GL_COND_OBJ_DIRFD], [test $ac_cv_func_dirfd = no && test $gl_cv_func_dirfd_macro = no || test $REPLACE_DIRFD = 1]) AM_COND_IF([GL_COND_OBJ_DIRFD], [ gl_PREREQ_DIRFD ]) gl_DIRENT_MODULE_INDICATOR([dirfd]) gl_DOUBLE_SLASH_ROOT gl_FUNC_DUP2 gl_CONDITIONAL([GL_COND_OBJ_DUP2], [test $REPLACE_DUP2 = 1]) AM_COND_IF([GL_COND_OBJ_DUP2], [ gl_PREREQ_DUP2 ]) gl_UNISTD_MODULE_INDICATOR([dup2]) AC_PROG_MKDIR_P gl_HEADER_ERRNO_H gl_CONDITIONAL_HEADER([errno.h]) AC_PROG_MKDIR_P gl_ERROR gl_CONDITIONAL([GL_COND_OBJ_ERROR], [test "$ac_cv_lib_error_at_line" = no]) AM_COND_IF([GL_COND_OBJ_ERROR], [ gl_PREREQ_ERROR ]) m4_ifdef([AM_XGETTEXT_OPTION], [AM_][XGETTEXT_OPTION([--flag=error:3:c-format]) AM_][XGETTEXT_OPTION([--flag=error_at_line:5:c-format])]) AC_REQUIRE([gl_EXTERN_INLINE]) gl_FUNC_FCHDIR gl_CONDITIONAL([GL_COND_OBJ_FCHDIR], [test $HAVE_FCHDIR = 0]) AM_COND_IF([GL_COND_OBJ_FCHDIR], [ gl_PREREQ_FCHDIR ]) gl_UNISTD_MODULE_INDICATOR([fchdir]) gl_FUNC_FCNTL gl_CONDITIONAL([GL_COND_OBJ_FCNTL], [test $HAVE_FCNTL = 0 || test $REPLACE_FCNTL = 1]) gl_FCNTL_MODULE_INDICATOR([fcntl]) gl_FCNTL_H gl_FCNTL_H_REQUIRE_DEFAULTS AC_PROG_MKDIR_P gl_MODULE_INDICATOR([fd-safer-flag]) gl_FILE_NAME_CONCAT_LGPL AC_C_FLEXIBLE_ARRAY_MEMBER gl_FLOAT_H gl_CONDITIONAL_HEADER([float.h]) AC_PROG_MKDIR_P gl_CONDITIONAL([GL_COND_OBJ_FLOAT], [test $REPLACE_FLOAT_LDBL = 1]) gl_CONDITIONAL([GL_COND_OBJ_ITOLD], [test $REPLACE_ITOLD = 1]) gl_FUNC_FNMATCH_POSIX dnl Because of gl_REPLACE_FNMATCH_H: gl_CONDITIONAL_HEADER([fnmatch.h]) if test $HAVE_FNMATCH = 0 || test $REPLACE_FNMATCH = 1; then AC_LIBOBJ([fnmatch]) gl_PREREQ_FNMATCH fi gl_FNMATCH_MODULE_INDICATOR([fnmatch]) gl_FNMATCH_H gl_FNMATCH_H_REQUIRE_DEFAULTS gl_CONDITIONAL_HEADER([fnmatch.h]) AC_PROG_MKDIR_P gl_FUNC_FREE gl_CONDITIONAL([GL_COND_OBJ_FREE], [test $REPLACE_FREE = 1]) AM_COND_IF([GL_COND_OBJ_FREE], [ gl_PREREQ_FREE ]) gl_STDLIB_MODULE_INDICATOR([free-posix]) gl_FUNC_FSTAT gl_CONDITIONAL([GL_COND_OBJ_FSTAT], [test $REPLACE_FSTAT = 1]) AM_COND_IF([GL_COND_OBJ_FSTAT], [ case "$host_os" in mingw*) AC_LIBOBJ([stat-w32]) ;; esac gl_PREREQ_FSTAT ]) gl_SYS_STAT_MODULE_INDICATOR([fstat]) gl_FUNC_GETCWD_LGPL gl_CONDITIONAL([GL_COND_OBJ_GETCWD_LGPL], [test $REPLACE_GETCWD = 1]) gl_UNISTD_MODULE_INDICATOR([getcwd]) gl_FUNC_GETDELIM gl_CONDITIONAL([GL_COND_OBJ_GETDELIM], [test $HAVE_GETDELIM = 0 || test $REPLACE_GETDELIM = 1]) AM_COND_IF([GL_COND_OBJ_GETDELIM], [ gl_PREREQ_GETDELIM ]) gl_STDIO_MODULE_INDICATOR([getdelim]) gl_FUNC_GETDTABLESIZE gl_CONDITIONAL([GL_COND_OBJ_GETDTABLESIZE], [test $HAVE_GETDTABLESIZE = 0 || test $REPLACE_GETDTABLESIZE = 1]) AM_COND_IF([GL_COND_OBJ_GETDTABLESIZE], [ gl_PREREQ_GETDTABLESIZE ]) gl_UNISTD_MODULE_INDICATOR([getdtablesize]) gl_FUNC_GETLINE gl_CONDITIONAL([GL_COND_OBJ_GETLINE], [test $REPLACE_GETLINE = 1]) AM_COND_IF([GL_COND_OBJ_GETLINE], [ gl_PREREQ_GETLINE ]) gl_STDIO_MODULE_INDICATOR([getline]) gl_FUNC_GETOPT_GNU dnl Because of the way gl_FUNC_GETOPT_GNU is implemented (the gl_getopt_required dnl mechanism), there is no need to do any AC_LIBOBJ or AC_SUBST here; they are dnl done in the getopt-posix module. gl_FUNC_GETOPT_POSIX gl_CONDITIONAL_HEADER([getopt.h]) gl_CONDITIONAL_HEADER([getopt-cdefs.h]) AC_PROG_MKDIR_P gl_CONDITIONAL([GL_COND_OBJ_GETOPT], [test $REPLACE_GETOPT = 1]) AM_COND_IF([GL_COND_OBJ_GETOPT], [ dnl Define the substituted variable GNULIB_UNISTD_H_GETOPT to 1. gl_UNISTD_H_REQUIRE_DEFAULTS gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_UNISTD_H_GETOPT], [1]) ]) gl_UNISTD_MODULE_INDICATOR([getopt-posix]) gl_FUNC_GETPROGNAME AC_SUBST([LIBINTL]) AC_SUBST([LTLIBINTL]) AC_REQUIRE([gl_FUNC_SETLOCALE_NULL]) LIB_HARD_LOCALE="$LIB_SETLOCALE_NULL" AC_SUBST([LIB_HARD_LOCALE]) gl_INTTYPES_INCOMPLETE gl_INTTYPES_H_REQUIRE_DEFAULTS AC_PROG_MKDIR_P gl_FUNC_ISBLANK gl_CONDITIONAL([GL_COND_OBJ_ISBLANK], [test $HAVE_ISBLANK = 0]) gl_MODULE_INDICATOR([isblank]) gl_CTYPE_MODULE_INDICATOR([isblank]) gl_LANGINFO_H gl_LANGINFO_H_REQUIRE_DEFAULTS AC_PROG_MKDIR_P AC_REQUIRE([gl_LARGEFILE]) gl___INLINE gl_LIMITS_H gl_CONDITIONAL_HEADER([limits.h]) AC_PROG_MKDIR_P gl_LOCALCHARSET dnl For backward compatibility. Some packages still use this. LOCALCHARSET_TESTS_ENVIRONMENT= AC_SUBST([LOCALCHARSET_TESTS_ENVIRONMENT]) gl_LOCALE_H gl_LOCALE_H_REQUIRE_DEFAULTS AC_PROG_MKDIR_P gl_FUNC_LOCALECONV gl_CONDITIONAL([GL_COND_OBJ_LOCALECONV], [test $REPLACE_LOCALECONV = 1]) AM_COND_IF([GL_COND_OBJ_LOCALECONV], [ gl_PREREQ_LOCALECONV ]) gl_LOCALE_MODULE_INDICATOR([localeconv]) gl_LOCK gl_MODULE_INDICATOR([lock]) gl_FUNC_MALLOC_GNU if test $REPLACE_MALLOC_FOR_MALLOC_GNU = 1; then AC_LIBOBJ([malloc]) fi gl_STDLIB_MODULE_INDICATOR([malloc-gnu]) AC_REQUIRE([gl_FUNC_MALLOC_POSIX]) if test $REPLACE_MALLOC_FOR_MALLOC_POSIX = 1; then AC_LIBOBJ([malloc]) fi gl_STDLIB_MODULE_INDICATOR([malloc-posix]) gl_MALLOCA gl_FUNC_MBRTOWC gl_CONDITIONAL([GL_COND_OBJ_MBRTOWC], [test $HAVE_MBRTOWC = 0 || test $REPLACE_MBRTOWC = 1]) AM_COND_IF([GL_COND_OBJ_MBRTOWC], [ if test $REPLACE_MBSTATE_T = 1; then AC_LIBOBJ([lc-charset-dispatch]) AC_LIBOBJ([mbtowc-lock]) gl_PREREQ_MBTOWC_LOCK fi gl_PREREQ_MBRTOWC ]) gl_WCHAR_MODULE_INDICATOR([mbrtowc]) gl_FUNC_MBSINIT gl_CONDITIONAL([GL_COND_OBJ_MBSINIT], [test $HAVE_MBSINIT = 0 || test $REPLACE_MBSINIT = 1]) AM_COND_IF([GL_COND_OBJ_MBSINIT], [ gl_PREREQ_MBSINIT ]) gl_WCHAR_MODULE_INDICATOR([mbsinit]) gl_FUNC_MBSRTOWCS gl_CONDITIONAL([GL_COND_OBJ_MBSRTOWCS], [test $HAVE_MBSRTOWCS = 0 || test $REPLACE_MBSRTOWCS = 1]) AM_COND_IF([GL_COND_OBJ_MBSRTOWCS], [ AC_LIBOBJ([mbsrtowcs-state]) gl_PREREQ_MBSRTOWCS ]) gl_WCHAR_MODULE_INDICATOR([mbsrtowcs]) gl_MBSWIDTH gl_FUNC_MBTOWC gl_CONDITIONAL([GL_COND_OBJ_MBTOWC], [test $HAVE_MBTOWC = 0 || test $REPLACE_MBTOWC = 1]) AM_COND_IF([GL_COND_OBJ_MBTOWC], [ gl_PREREQ_MBTOWC ]) gl_STDLIB_MODULE_INDICATOR([mbtowc]) gl_FUNC_MEMCHR gl_CONDITIONAL([GL_COND_OBJ_MEMCHR], [test $REPLACE_MEMCHR = 1]) AM_COND_IF([GL_COND_OBJ_MEMCHR], [ gl_PREREQ_MEMCHR ]) gl_STRING_MODULE_INDICATOR([memchr]) gl_FUNC_MEMPCPY gl_CONDITIONAL([GL_COND_OBJ_MEMPCPY], [test $HAVE_MEMPCPY = 0]) AM_COND_IF([GL_COND_OBJ_MEMPCPY], [ gl_PREREQ_MEMPCPY ]) gl_STRING_MODULE_INDICATOR([mempcpy]) gl_FUNC_MEMRCHR gl_CONDITIONAL([GL_COND_OBJ_MEMRCHR], [test $ac_cv_func_memrchr = no]) AM_COND_IF([GL_COND_OBJ_MEMRCHR], [ gl_PREREQ_MEMRCHR ]) gl_STRING_MODULE_INDICATOR([memrchr]) AC_REQUIRE([gl_MSVC_INVAL]) gl_CONDITIONAL([GL_COND_OBJ_MSVC_INVAL], [test $HAVE_MSVC_INVALID_PARAMETER_HANDLER = 1]) AC_REQUIRE([gl_MSVC_NOTHROW]) gl_CONDITIONAL([GL_COND_OBJ_MSVC_NOTHROW], [test $HAVE_MSVC_INVALID_PARAMETER_HANDLER = 1]) gl_MODULE_INDICATOR([msvc-nothrow]) gl_MULTIARCH gl_FUNC_NL_LANGINFO gl_CONDITIONAL([GL_COND_OBJ_NL_LANGINFO], [test $HAVE_NL_LANGINFO = 0 || test $REPLACE_NL_LANGINFO = 1]) gl_CONDITIONAL([GL_COND_OBJ_NL_LANGINFO_LOCK], [test $REPLACE_NL_LANGINFO = 1 && test $NL_LANGINFO_MTSAFE = 0]) if test $REPLACE_NL_LANGINFO = 1 && test $NL_LANGINFO_MTSAFE = 0; then gl_PREREQ_NL_LANGINFO_LOCK fi gl_LANGINFO_MODULE_INDICATOR([nl_langinfo]) gl_FUNC_OPEN gl_CONDITIONAL([GL_COND_OBJ_OPEN], [test $REPLACE_OPEN = 1]) AM_COND_IF([GL_COND_OBJ_OPEN], [ gl_PREREQ_OPEN ]) gl_FCNTL_MODULE_INDICATOR([open]) gl_FUNC_OPENAT gl_CONDITIONAL([GL_COND_OBJ_OPENAT], [test $HAVE_OPENAT = 0 || test $REPLACE_OPENAT = 1]) AM_COND_IF([GL_COND_OBJ_OPENAT], [ gl_PREREQ_OPENAT ]) gl_MODULE_INDICATOR([openat]) dnl for lib/getcwd.c gl_FCNTL_MODULE_INDICATOR([openat]) gl_PATHMAX gl_FUNC_PIPE gl_CONDITIONAL([GL_COND_OBJ_PIPE], [test $HAVE_PIPE = 0]) gl_UNISTD_MODULE_INDICATOR([pipe]) AC_CHECK_DECLS([program_invocation_name], [], [], [#include ]) AC_CHECK_DECLS([program_invocation_short_name], [], [], [#include ]) gl_FUNC_RAWMEMCHR gl_CONDITIONAL([GL_COND_OBJ_RAWMEMCHR], [test $HAVE_RAWMEMCHR = 0]) AM_COND_IF([GL_COND_OBJ_RAWMEMCHR], [ gl_PREREQ_RAWMEMCHR ]) gl_STRING_MODULE_INDICATOR([rawmemchr]) gl_FUNC_REALLOC_GNU if test $REPLACE_REALLOC_FOR_REALLOC_GNU = 1; then AC_LIBOBJ([realloc]) fi gl_STDLIB_MODULE_INDICATOR([realloc-gnu]) gl_FUNC_REALLOC_POSIX if test $REPLACE_REALLOC_FOR_REALLOC_POSIX = 1; then AC_LIBOBJ([realloc]) fi gl_STDLIB_MODULE_INDICATOR([realloc-posix]) gl_FUNC_REALLOCARRAY gl_CONDITIONAL([GL_COND_OBJ_REALLOCARRAY], [test $HAVE_REALLOCARRAY = 0 || test $REPLACE_REALLOCARRAY = 1]) AM_COND_IF([GL_COND_OBJ_REALLOCARRAY], [ gl_PREREQ_REALLOCARRAY ]) gl_MODULE_INDICATOR([reallocarray]) gl_STDLIB_MODULE_INDICATOR([reallocarray]) gl_REGEX gl_CONDITIONAL([GL_COND_OBJ_REGEX], [test $ac_use_included_regex = yes]) AM_COND_IF([GL_COND_OBJ_REGEX], [ gl_PREREQ_REGEX ]) gl_SAVE_CWD gl_FUNC_SETLOCALE_NULL gl_CONDITIONAL([GL_COND_OBJ_SETLOCALE_LOCK], [test $SETLOCALE_NULL_ALL_MTSAFE = 0 || test $SETLOCALE_NULL_ONE_MTSAFE = 0]) AM_COND_IF([GL_COND_OBJ_SETLOCALE_LOCK], [ gl_PREREQ_SETLOCALE_LOCK ]) gl_LOCALE_MODULE_INDICATOR([setlocale_null]) gl_SIZE_MAX gl_FUNC_SLEEP gl_CONDITIONAL([GL_COND_OBJ_SLEEP], [test $HAVE_SLEEP = 0 || test $REPLACE_SLEEP = 1]) gl_UNISTD_MODULE_INDICATOR([sleep]) gt_TYPE_SSIZE_T gl_FUNC_STAT gl_CONDITIONAL([GL_COND_OBJ_STAT], [test $REPLACE_STAT = 1]) AM_COND_IF([GL_COND_OBJ_STAT], [ case "$host_os" in mingw*) AC_LIBOBJ([stat-w32]) ;; esac gl_PREREQ_STAT ]) gl_SYS_STAT_MODULE_INDICATOR([stat]) gl_STAT_TIME gl_STAT_BIRTHTIME gl_STDALIGN_H gl_CONDITIONAL_HEADER([stdalign.h]) AC_PROG_MKDIR_P gl_STDBOOL_H gl_CONDITIONAL_HEADER([stdbool.h]) AC_PROG_MKDIR_P gl_STDDEF_H gl_STDDEF_H_REQUIRE_DEFAULTS gl_CONDITIONAL_HEADER([stddef.h]) AC_PROG_MKDIR_P gl_STDINT_H gl_CONDITIONAL_HEADER([stdint.h]) dnl Because of gl_REPLACE_LIMITS_H: gl_CONDITIONAL_HEADER([limits.h]) AC_PROG_MKDIR_P gl_STDIO_H gl_STDIO_H_REQUIRE_DEFAULTS AC_PROG_MKDIR_P gl_CONDITIONAL([GL_COND_OBJ_STDIO_READ], [test $REPLACE_STDIO_READ_FUNCS = 1]) gl_CONDITIONAL([GL_COND_OBJ_STDIO_WRITE], [test $REPLACE_STDIO_WRITE_FUNCS = 1]) dnl No need to create extra modules for these functions. Everyone who uses dnl likely needs them. gl_STDIO_MODULE_INDICATOR([fscanf]) gl_MODULE_INDICATOR([fscanf]) gl_STDIO_MODULE_INDICATOR([scanf]) gl_MODULE_INDICATOR([scanf]) gl_STDIO_MODULE_INDICATOR([fgetc]) gl_STDIO_MODULE_INDICATOR([getc]) gl_STDIO_MODULE_INDICATOR([getchar]) gl_STDIO_MODULE_INDICATOR([fgets]) gl_STDIO_MODULE_INDICATOR([fread]) dnl No need to create extra modules for these functions. Everyone who uses dnl likely needs them. gl_STDIO_MODULE_INDICATOR([fprintf]) gl_STDIO_MODULE_INDICATOR([printf]) gl_STDIO_MODULE_INDICATOR([vfprintf]) gl_STDIO_MODULE_INDICATOR([vprintf]) gl_STDIO_MODULE_INDICATOR([fputc]) gl_STDIO_MODULE_INDICATOR([putc]) gl_STDIO_MODULE_INDICATOR([putchar]) gl_STDIO_MODULE_INDICATOR([fputs]) gl_STDIO_MODULE_INDICATOR([puts]) gl_STDIO_MODULE_INDICATOR([fwrite]) gl_STDLIB_H gl_STDLIB_H_REQUIRE_DEFAULTS AC_PROG_MKDIR_P gl_STRCASE gl_CONDITIONAL([GL_COND_OBJ_STRCASECMP], [test $HAVE_STRCASECMP = 0]) AM_COND_IF([GL_COND_OBJ_STRCASECMP], [ gl_PREREQ_STRCASECMP ]) gl_CONDITIONAL([GL_COND_OBJ_STRNCASECMP], [test $HAVE_STRNCASECMP = 0]) AM_COND_IF([GL_COND_OBJ_STRNCASECMP], [ gl_PREREQ_STRNCASECMP ]) gl_FUNC_STRCHRNUL gl_CONDITIONAL([GL_COND_OBJ_STRCHRNUL], [test $HAVE_STRCHRNUL = 0 || test $REPLACE_STRCHRNUL = 1]) AM_COND_IF([GL_COND_OBJ_STRCHRNUL], [ gl_PREREQ_STRCHRNUL ]) gl_STRING_MODULE_INDICATOR([strchrnul]) gl_FUNC_STRDUP_POSIX gl_CONDITIONAL([GL_COND_OBJ_STRDUP], [test $REPLACE_STRDUP = 1]) AM_COND_IF([GL_COND_OBJ_STRDUP], [ gl_PREREQ_STRDUP ]) gl_STRING_MODULE_INDICATOR([strdup]) gl_FUNC_STRERROR gl_CONDITIONAL([GL_COND_OBJ_STRERROR], [test $REPLACE_STRERROR = 1]) gl_MODULE_INDICATOR([strerror]) gl_STRING_MODULE_INDICATOR([strerror]) AC_REQUIRE([gl_HEADER_ERRNO_H]) AC_REQUIRE([gl_FUNC_STRERROR_0]) gl_CONDITIONAL([GL_COND_OBJ_STRERROR_OVERRIDE], [test -n "$ERRNO_H" || test $REPLACE_STRERROR_0 = 1]) AM_COND_IF([GL_COND_OBJ_STRERROR_OVERRIDE], [ gl_PREREQ_SYS_H_WINSOCK2 ]) gl_STRING_H gl_STRING_H_REQUIRE_DEFAULTS AC_PROG_MKDIR_P gl_STRINGS_H gl_STRINGS_H_REQUIRE_DEFAULTS AC_PROG_MKDIR_P gl_FUNC_STRNDUP gl_CONDITIONAL([GL_COND_OBJ_STRNDUP], [test $HAVE_STRNDUP = 0 || test $REPLACE_STRNDUP = 1]) gl_STRING_MODULE_INDICATOR([strndup]) gl_FUNC_STRNLEN gl_CONDITIONAL([GL_COND_OBJ_STRNLEN], [test $HAVE_DECL_STRNLEN = 0 || test $REPLACE_STRNLEN = 1]) AM_COND_IF([GL_COND_OBJ_STRNLEN], [ gl_PREREQ_STRNLEN ]) gl_STRING_MODULE_INDICATOR([strnlen]) gl_SYS_STAT_H gl_SYS_STAT_H_REQUIRE_DEFAULTS AC_PROG_MKDIR_P gl_SYS_TYPES_H gl_SYS_TYPES_H_REQUIRE_DEFAULTS AC_PROG_MKDIR_P gl_SYSEXITS gl_CONDITIONAL_HEADER([sysexits.h]) AC_PROG_MKDIR_P AC_REQUIRE([gl_THREADLIB]) gl_TIME_H gl_TIME_H_REQUIRE_DEFAULTS AC_PROG_MKDIR_P gl_UNISTD_H gl_UNISTD_H_REQUIRE_DEFAULTS AC_PROG_MKDIR_P gl_UNISTD_SAFER gl_LIBUNISTRING_LIBHEADER([0.9.11], [unitypes.h]) AC_PROG_MKDIR_P AH_VERBATIM([unitypes_restrict], [ /* This definition is a duplicate of the one in unitypes.h. It is here so that we can cope with an older version of unitypes.h that does not contain this definition and that is pre-installed among the public header files. */ # if defined __restrict \ || 2 < __GNUC__ + (95 <= __GNUC_MINOR__) \ || __clang_major__ >= 3 # define _UC_RESTRICT __restrict # elif 199901L <= __STDC_VERSION__ || defined restrict # define _UC_RESTRICT restrict # else # define _UC_RESTRICT # endif ]) gl_LIBUNISTRING_LIBHEADER([0.9.11], [uniwidth.h]) AC_PROG_MKDIR_P gl_LIBUNISTRING_MODULE([0.9.11], [uniwidth/width]) AC_C_VARARRAYS AC_REQUIRE([AC_C_RESTRICT]) gl_FUNC_VASNPRINTF gl_FUNC_VSNPRINTF gl_STDIO_MODULE_INDICATOR([vsnprintf]) gl_WCHAR_H gl_WCHAR_H_REQUIRE_DEFAULTS AC_PROG_MKDIR_P gl_FUNC_WCRTOMB gl_CONDITIONAL([GL_COND_OBJ_WCRTOMB], [test $HAVE_WCRTOMB = 0 || test $REPLACE_WCRTOMB = 1]) AM_COND_IF([GL_COND_OBJ_WCRTOMB], [ gl_PREREQ_WCRTOMB ]) gl_WCHAR_MODULE_INDICATOR([wcrtomb]) gl_WCTYPE_H gl_WCTYPE_H_REQUIRE_DEFAULTS AC_PROG_MKDIR_P gl_FUNC_WCWIDTH gl_CONDITIONAL([GL_COND_OBJ_WCWIDTH], [test $HAVE_WCWIDTH = 0 || test $REPLACE_WCWIDTH = 1]) AM_COND_IF([GL_COND_OBJ_WCWIDTH], [ gl_PREREQ_WCWIDTH ]) gl_WCHAR_MODULE_INDICATOR([wcwidth]) AC_REQUIRE([AC_CANONICAL_HOST]) gl_CONDITIONAL([GL_COND_OBJ_WINDOWS_MUTEX], [case "$host_os" in mingw*) true;; *) false;; esac]) AC_REQUIRE([AC_CANONICAL_HOST]) gl_CONDITIONAL([GL_COND_OBJ_WINDOWS_ONCE], [case "$host_os" in mingw*) true;; *) false;; esac]) AC_REQUIRE([AC_CANONICAL_HOST]) gl_CONDITIONAL([GL_COND_OBJ_WINDOWS_RECMUTEX], [case "$host_os" in mingw*) true;; *) false;; esac]) AC_REQUIRE([AC_CANONICAL_HOST]) gl_CONDITIONAL([GL_COND_OBJ_WINDOWS_RWLOCK], [case "$host_os" in mingw*) true;; *) false;; esac]) gl_FUNC_WMEMCHR gl_CONDITIONAL([GL_COND_OBJ_WMEMCHR], [test $HAVE_WMEMCHR = 0]) gl_WCHAR_MODULE_INDICATOR([wmemchr]) gl_FUNC_WMEMPCPY gl_CONDITIONAL([GL_COND_OBJ_WMEMPCPY], [test $HAVE_WMEMPCPY = 0]) gl_WCHAR_MODULE_INDICATOR([wmempcpy]) gl_XSIZE # End of code from modules m4_ifval(gl_LIBSOURCES_LIST, [ m4_syscmd([test ! -d ]m4_defn([gl_LIBSOURCES_DIR])[ || for gl_file in ]gl_LIBSOURCES_LIST[ ; do if test ! -r ]m4_defn([gl_LIBSOURCES_DIR])[/$gl_file ; then echo "missing file ]m4_defn([gl_LIBSOURCES_DIR])[/$gl_file" >&2 exit 1 fi done])dnl m4_if(m4_sysval, [0], [], [AC_FATAL([expected source file, required through AC_LIBSOURCES, not found])]) ]) m4_popdef([GL_MODULE_INDICATOR_PREFIX]) m4_popdef([GL_MACRO_PREFIX]) m4_popdef([gl_LIBSOURCES_DIR]) m4_popdef([gl_LIBSOURCES_LIST]) m4_popdef([AC_LIBSOURCES]) m4_popdef([AC_REPLACE_FUNCS]) m4_popdef([AC_LIBOBJ]) AC_CONFIG_COMMANDS_PRE([ gl_libobjs= gl_ltlibobjs= gl_libobjdeps= if test -n "$gl_LIBOBJS"; then # Remove the extension. changequote(,)dnl sed_drop_objext='s/\.o$//;s/\.obj$//' sed_dirname1='s,//*,/,g' sed_dirname2='s,\(.\)/$,\1,' sed_dirname3='s,^[^/]*$,.,' sed_dirname4='s,\(.\)/[^/]*$,\1,' sed_basename1='s,.*/,,' changequote([, ])dnl for i in `for i in $gl_LIBOBJS; do echo "$i"; done | sed -e "$sed_drop_objext" | sort | uniq`; do gl_libobjs="$gl_libobjs $i.$ac_objext" gl_ltlibobjs="$gl_ltlibobjs $i.lo" i_dir=`echo "$i" | sed -e "$sed_dirname1" -e "$sed_dirname2" -e "$sed_dirname3" -e "$sed_dirname4"` i_base=`echo "$i" | sed -e "$sed_basename1"` gl_libobjdeps="$gl_libobjdeps $i_dir/\$(DEPDIR)/$i_base.Po" done fi AC_SUBST([gl_LIBOBJS], [$gl_libobjs]) AC_SUBST([gl_LTLIBOBJS], [$gl_ltlibobjs]) AC_SUBST([gl_LIBOBJDEPS], [$gl_libobjdeps]) ]) gltests_libdeps= gltests_ltlibdeps= m4_pushdef([AC_LIBOBJ], m4_defn([gltests_LIBOBJ])) m4_pushdef([AC_REPLACE_FUNCS], m4_defn([gltests_REPLACE_FUNCS])) m4_pushdef([AC_LIBSOURCES], m4_defn([gltests_LIBSOURCES])) m4_pushdef([gltests_LIBSOURCES_LIST], []) m4_pushdef([gltests_LIBSOURCES_DIR], []) m4_pushdef([GL_MACRO_PREFIX], [gltests]) m4_pushdef([GL_MODULE_INDICATOR_PREFIX], [GL]) gl_COMMON gl_source_base='tests' gl_source_base_prefix= changequote(,)dnl gltests_WITNESS=IN_`echo "${PACKAGE-$PACKAGE_TARNAME}" | LC_ALL=C tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ | LC_ALL=C sed -e 's/[^A-Z0-9_]/_/g'`_GNULIB_TESTS changequote([, ])dnl AC_SUBST([gltests_WITNESS]) gl_module_indicator_condition=$gltests_WITNESS m4_pushdef([gl_MODULE_INDICATOR_CONDITION], [$gl_module_indicator_condition]) m4_popdef([gl_MODULE_INDICATOR_CONDITION]) m4_ifval(gltests_LIBSOURCES_LIST, [ m4_syscmd([test ! -d ]m4_defn([gltests_LIBSOURCES_DIR])[ || for gl_file in ]gltests_LIBSOURCES_LIST[ ; do if test ! -r ]m4_defn([gltests_LIBSOURCES_DIR])[/$gl_file ; then echo "missing file ]m4_defn([gltests_LIBSOURCES_DIR])[/$gl_file" >&2 exit 1 fi done])dnl m4_if(m4_sysval, [0], [], [AC_FATAL([expected source file, required through AC_LIBSOURCES, not found])]) ]) m4_popdef([GL_MODULE_INDICATOR_PREFIX]) m4_popdef([GL_MACRO_PREFIX]) m4_popdef([gltests_LIBSOURCES_DIR]) m4_popdef([gltests_LIBSOURCES_LIST]) m4_popdef([AC_LIBSOURCES]) m4_popdef([AC_REPLACE_FUNCS]) m4_popdef([AC_LIBOBJ]) AC_CONFIG_COMMANDS_PRE([ gltests_libobjs= gltests_ltlibobjs= gltests_libobjdeps= if test -n "$gltests_LIBOBJS"; then # Remove the extension. changequote(,)dnl sed_drop_objext='s/\.o$//;s/\.obj$//' sed_dirname1='s,//*,/,g' sed_dirname2='s,\(.\)/$,\1,' sed_dirname3='s,^[^/]*$,.,' sed_dirname4='s,\(.\)/[^/]*$,\1,' sed_basename1='s,.*/,,' changequote([, ])dnl for i in `for i in $gltests_LIBOBJS; do echo "$i"; done | sed -e "$sed_drop_objext" | sort | uniq`; do gltests_libobjs="$gltests_libobjs $i.$ac_objext" gltests_ltlibobjs="$gltests_ltlibobjs $i.lo" i_dir=`echo "$i" | sed -e "$sed_dirname1" -e "$sed_dirname2" -e "$sed_dirname3" -e "$sed_dirname4"` i_base=`echo "$i" | sed -e "$sed_basename1"` gltests_libobjdeps="$gltests_libobjdeps $i_dir/\$(DEPDIR)/$i_base.Po" done fi AC_SUBST([gltests_LIBOBJS], [$gltests_libobjs]) AC_SUBST([gltests_LTLIBOBJS], [$gltests_ltlibobjs]) AC_SUBST([gltests_LIBOBJDEPS], [$gltests_libobjdeps]) ]) AC_REQUIRE([gl_CC_GNULIB_WARNINGS]) LIBGNU_LIBDEPS="$gl_libdeps" AC_SUBST([LIBGNU_LIBDEPS]) LIBGNU_LTLIBDEPS="$gl_ltlibdeps" AC_SUBST([LIBGNU_LTLIBDEPS]) ]) # Like AC_LIBOBJ, except that the module name goes # into gl_LIBOBJS instead of into LIBOBJS. AC_DEFUN([gl_LIBOBJ], [ AS_LITERAL_IF([$1], [gl_LIBSOURCES([$1.c])])dnl gl_LIBOBJS="$gl_LIBOBJS $1.$ac_objext" ]) # Like AC_REPLACE_FUNCS, except that the module name goes # into gl_LIBOBJS instead of into LIBOBJS. AC_DEFUN([gl_REPLACE_FUNCS], [ m4_foreach_w([gl_NAME], [$1], [AC_LIBSOURCES(gl_NAME[.c])])dnl AC_CHECK_FUNCS([$1], , [gl_LIBOBJ($ac_func)]) ]) # Like AC_LIBSOURCES, except the directory where the source file is # expected is derived from the gnulib-tool parameterization, # and alloca is special cased (for the alloca-opt module). # We could also entirely rely on EXTRA_lib..._SOURCES. AC_DEFUN([gl_LIBSOURCES], [ m4_foreach([_gl_NAME], [$1], [ m4_if(_gl_NAME, [alloca.c], [], [ m4_define([gl_LIBSOURCES_DIR], [grub-core/lib/gnulib]) m4_append([gl_LIBSOURCES_LIST], _gl_NAME, [ ]) ]) ]) ]) # Like AC_LIBOBJ, except that the module name goes # into gltests_LIBOBJS instead of into LIBOBJS. AC_DEFUN([gltests_LIBOBJ], [ AS_LITERAL_IF([$1], [gltests_LIBSOURCES([$1.c])])dnl gltests_LIBOBJS="$gltests_LIBOBJS $1.$ac_objext" ]) # Like AC_REPLACE_FUNCS, except that the module name goes # into gltests_LIBOBJS instead of into LIBOBJS. AC_DEFUN([gltests_REPLACE_FUNCS], [ m4_foreach_w([gl_NAME], [$1], [AC_LIBSOURCES(gl_NAME[.c])])dnl AC_CHECK_FUNCS([$1], , [gltests_LIBOBJ($ac_func)]) ]) # Like AC_LIBSOURCES, except the directory where the source file is # expected is derived from the gnulib-tool parameterization, # and alloca is special cased (for the alloca-opt module). # We could also entirely rely on EXTRA_lib..._SOURCES. AC_DEFUN([gltests_LIBSOURCES], [ m4_foreach([_gl_NAME], [$1], [ m4_if(_gl_NAME, [alloca.c], [], [ m4_define([gltests_LIBSOURCES_DIR], [tests]) m4_append([gltests_LIBSOURCES_LIST], _gl_NAME, [ ]) ]) ]) ]) # This macro records the list of files which have been installed by # gnulib-tool and may be removed by future gnulib-tool invocations. AC_DEFUN([gl_FILE_LIST], [ build-aux/gitlog-to-changelog lib/_Noreturn.h lib/alloca.c lib/alloca.in.h lib/arg-nonnull.h lib/argp-ba.c lib/argp-eexst.c lib/argp-fmtstream.c lib/argp-fmtstream.h lib/argp-fs-xinl.c lib/argp-help.c lib/argp-namefrob.h lib/argp-parse.c lib/argp-pin.c lib/argp-pv.c lib/argp-pvh.c lib/argp-xinl.c lib/argp.h lib/asnprintf.c lib/assure.h lib/attribute.h lib/base64.c lib/base64.h lib/basename-lgpl.c lib/basename-lgpl.h lib/btowc.c lib/c++defs.h lib/calloc.c lib/cdefs.h lib/chdir-long.c lib/chdir-long.h lib/cloexec.c lib/cloexec.h lib/close.c lib/ctype.in.h lib/dirent.in.h lib/dirfd.c lib/dup-safer-flag.c lib/dup-safer.c lib/dup2.c lib/dynarray.h lib/errno.in.h lib/error.c lib/error.h lib/exitfail.c lib/exitfail.h lib/fchdir.c lib/fcntl.c lib/fcntl.in.h lib/fd-hook.c lib/fd-hook.h lib/fd-safer-flag.c lib/fd-safer.c lib/filename.h lib/filenamecat-lgpl.c lib/filenamecat.h lib/flexmember.h lib/float+.h lib/float.c lib/float.in.h lib/fnmatch.c lib/fnmatch.in.h lib/fnmatch_loop.c lib/free.c lib/fstat.c lib/getcwd-lgpl.c lib/getdelim.c lib/getdtablesize.c lib/getline.c lib/getopt-cdefs.in.h lib/getopt-core.h lib/getopt-ext.h lib/getopt-pfx-core.h lib/getopt-pfx-ext.h lib/getopt.c lib/getopt.in.h lib/getopt1.c lib/getopt_int.h lib/getprogname.c lib/getprogname.h lib/gettext.h lib/glthread/lock.c lib/glthread/lock.h lib/glthread/threadlib.c lib/hard-locale.c lib/hard-locale.h lib/ialloc.c lib/ialloc.h lib/idx.h lib/intprops.h lib/inttypes.in.h lib/isblank.c lib/itold.c lib/langinfo.in.h lib/lc-charset-dispatch.c lib/lc-charset-dispatch.h lib/libc-config.h lib/limits.in.h lib/localcharset.c lib/localcharset.h lib/locale.in.h lib/localeconv.c lib/malloc.c lib/malloc/dynarray-skeleton.c lib/malloc/dynarray.h lib/malloc/dynarray_at_failure.c lib/malloc/dynarray_emplace_enlarge.c lib/malloc/dynarray_finalize.c lib/malloc/dynarray_resize.c lib/malloc/dynarray_resize_clear.c lib/malloca.c lib/malloca.h lib/mbrtowc-impl-utf8.h lib/mbrtowc-impl.h lib/mbrtowc.c lib/mbsinit.c lib/mbsrtowcs-impl.h lib/mbsrtowcs-state.c lib/mbsrtowcs.c lib/mbswidth.c lib/mbswidth.h lib/mbtowc-impl.h lib/mbtowc-lock.c lib/mbtowc-lock.h lib/mbtowc.c lib/memchr.c lib/memchr.valgrind lib/mempcpy.c lib/memrchr.c lib/msvc-inval.c lib/msvc-inval.h lib/msvc-nothrow.c lib/msvc-nothrow.h lib/nl_langinfo-lock.c lib/nl_langinfo.c lib/open.c lib/openat-die.c lib/openat-priv.h lib/openat-proc.c lib/openat.c lib/openat.h lib/pathmax.h lib/pipe-safer.c lib/pipe.c lib/printf-args.c lib/printf-args.h lib/printf-parse.c lib/printf-parse.h lib/progname.c lib/progname.h lib/rawmemchr.c lib/rawmemchr.valgrind lib/realloc.c lib/reallocarray.c lib/regcomp.c lib/regex.c lib/regex.h lib/regex_internal.c lib/regex_internal.h lib/regexec.c lib/save-cwd.c lib/save-cwd.h lib/setlocale-lock.c lib/setlocale_null.c lib/setlocale_null.h lib/size_max.h lib/sleep.c lib/stat-time.c lib/stat-time.h lib/stat-w32.c lib/stat-w32.h lib/stat.c lib/stdalign.in.h lib/stdbool.in.h lib/stddef.in.h lib/stdint.in.h lib/stdio-read.c lib/stdio-write.c lib/stdio.in.h lib/stdlib.in.h lib/strcasecmp.c lib/strchrnul.c lib/strchrnul.valgrind lib/strdup.c lib/streq.h lib/strerror-override.c lib/strerror-override.h lib/strerror.c lib/string.in.h lib/strings.in.h lib/strncasecmp.c lib/strndup.c lib/strnlen.c lib/strnlen1.c lib/strnlen1.h lib/sys_stat.in.h lib/sys_types.in.h lib/sysexits.in.h lib/time.in.h lib/unictype/bitmap.h lib/unistd--.h lib/unistd-safer.h lib/unistd.c lib/unistd.in.h lib/unitypes.in.h lib/uniwidth.in.h lib/uniwidth/cjk.h lib/uniwidth/width.c lib/uniwidth/width0.h lib/uniwidth/width2.h lib/vasnprintf.c lib/vasnprintf.h lib/verify.h lib/vsnprintf.c lib/warn-on-use.h lib/wchar.in.h lib/wcrtomb.c lib/wctype-h.c lib/wctype.in.h lib/wcwidth.c lib/windows-initguard.h lib/windows-mutex.c lib/windows-mutex.h lib/windows-once.c lib/windows-once.h lib/windows-recmutex.c lib/windows-recmutex.h lib/windows-rwlock.c lib/windows-rwlock.h lib/wmemchr-impl.h lib/wmemchr.c lib/wmempcpy.c lib/xalloc-oversized.h lib/xsize.c lib/xsize.h m4/00gnulib.m4 m4/__inline.m4 m4/absolute-header.m4 m4/alloca.m4 m4/argp.m4 m4/base64.m4 m4/btowc.m4 m4/builtin-expect.m4 m4/calloc.m4 m4/chdir-long.m4 m4/close.m4 m4/codeset.m4 m4/ctype_h.m4 m4/dirent_h.m4 m4/dirfd.m4 m4/double-slash-root.m4 m4/dup2.m4 m4/eealloc.m4 m4/errno_h.m4 m4/error.m4 m4/exponentd.m4 m4/extensions.m4 m4/extern-inline.m4 m4/fchdir.m4 m4/fcntl-o.m4 m4/fcntl.m4 m4/fcntl_h.m4 m4/filenamecat.m4 m4/flexmember.m4 m4/float_h.m4 m4/fnmatch.m4 m4/fnmatch_h.m4 m4/free.m4 m4/fstat.m4 m4/getcwd.m4 m4/getdelim.m4 m4/getdtablesize.m4 m4/getline.m4 m4/getopt.m4 m4/getprogname.m4 m4/gnulib-common.m4 m4/include_next.m4 m4/intmax_t.m4 m4/inttypes.m4 m4/inttypes_h.m4 m4/isblank.m4 m4/langinfo_h.m4 m4/largefile.m4 m4/libunistring-base.m4 m4/limits-h.m4 m4/localcharset.m4 m4/locale-fr.m4 m4/locale-ja.m4 m4/locale-zh.m4 m4/locale_h.m4 m4/localeconv.m4 m4/lock.m4 m4/lstat.m4 m4/malloc.m4 m4/malloca.m4 m4/math_h.m4 m4/mbrtowc.m4 m4/mbsinit.m4 m4/mbsrtowcs.m4 m4/mbstate_t.m4 m4/mbswidth.m4 m4/mbtowc.m4 m4/memchr.m4 m4/mempcpy.m4 m4/memrchr.m4 m4/mmap-anon.m4 m4/mode_t.m4 m4/msvc-inval.m4 m4/msvc-nothrow.m4 m4/multiarch.m4 m4/nl_langinfo.m4 m4/nocrash.m4 m4/off_t.m4 m4/open-cloexec.m4 m4/open-slash.m4 m4/open.m4 m4/openat.m4 m4/pathmax.m4 m4/pid_t.m4 m4/pipe.m4 m4/printf.m4 m4/pthread_rwlock_rdlock.m4 m4/rawmemchr.m4 m4/realloc.m4 m4/reallocarray.m4 m4/regex.m4 m4/save-cwd.m4 m4/setlocale_null.m4 m4/size_max.m4 m4/sleep.m4 m4/ssize_t.m4 m4/stat-time.m4 m4/stat.m4 m4/std-gnu11.m4 m4/stdalign.m4 m4/stdbool.m4 m4/stddef_h.m4 m4/stdint.m4 m4/stdint_h.m4 m4/stdio_h.m4 m4/stdlib_h.m4 m4/strcase.m4 m4/strchrnul.m4 m4/strdup.m4 m4/strerror.m4 m4/string_h.m4 m4/strings_h.m4 m4/strndup.m4 m4/strnlen.m4 m4/sys_socket_h.m4 m4/sys_stat_h.m4 m4/sys_types_h.m4 m4/sysexits.m4 m4/threadlib.m4 m4/time_h.m4 m4/unistd-safer.m4 m4/unistd_h.m4 m4/vararrays.m4 m4/vasnprintf.m4 m4/visibility.m4 m4/vsnprintf.m4 m4/warn-on-use.m4 m4/wchar_h.m4 m4/wchar_t.m4 m4/wcrtomb.m4 m4/wctype_h.m4 m4/wcwidth.m4 m4/wint_t.m4 m4/wmemchr.m4 m4/wmempcpy.m4 m4/xsize.m4 m4/year2038.m4 m4/zzgnulib.m4 ]) grub-2.14~git20250718.0e36779/m4/calloc.m40000644000175000017500000000601415036447602014025 00000000000000# calloc.m4 serial 29 # Copyright (C) 2004-2022 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # Written by Jim Meyering. # Determine whether calloc (N, S) returns non-NULL when N*S is zero, # and returns NULL when N*S overflows. # If so, define HAVE_CALLOC. Otherwise, define calloc to rpl_calloc # and arrange to use a calloc wrapper function that does work in that case. # _AC_FUNC_CALLOC_IF([IF-WORKS], [IF-NOT]) # ------------------------------------- # If calloc is compatible with GNU calloc, run IF-WORKS, otherwise, IF-NOT. AC_DEFUN([_AC_FUNC_CALLOC_IF], [ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether calloc (0, n) and calloc (n, 0) return nonnull], [ac_cv_func_calloc_0_nonnull], [if test $cross_compiling != yes; then ac_cv_func_calloc_0_nonnull=yes AC_RUN_IFELSE( [AC_LANG_PROGRAM( [AC_INCLUDES_DEFAULT], [[int result = 0; char * volatile p = calloc (0, 0); if (!p) result |= 1; free (p); return result; ]])], [], [ac_cv_func_calloc_0_nonnull=no]) else case "$host_os" in # Guess yes on glibc systems. *-gnu* | gnu*) ac_cv_func_calloc_0_nonnull="guessing yes" ;; # Guess yes on musl systems. *-musl*) ac_cv_func_calloc_0_nonnull="guessing yes" ;; # Guess yes on native Windows. mingw*) ac_cv_func_calloc_0_nonnull="guessing yes" ;; # If we don't know, obey --enable-cross-guesses. *) ac_cv_func_calloc_0_nonnull="$gl_cross_guess_normal" ;; esac fi ]) AS_CASE([$ac_cv_func_calloc_0_nonnull], [*yes], [$1], [$2]) ]) # gl_FUNC_CALLOC_GNU # ------------------ # Replace calloc if it is not compatible with GNU libc. AC_DEFUN([gl_FUNC_CALLOC_GNU], [ AC_REQUIRE([gl_STDLIB_H_DEFAULTS]) AC_REQUIRE([gl_FUNC_CALLOC_POSIX]) REPLACE_CALLOC_FOR_CALLOC_GNU="$REPLACE_CALLOC_FOR_CALLOC_POSIX" if test $REPLACE_CALLOC_FOR_CALLOC_GNU = 0; then _AC_FUNC_CALLOC_IF([], [REPLACE_CALLOC_FOR_CALLOC_GNU=1]) fi ])# gl_FUNC_CALLOC_GNU # gl_FUNC_CALLOC_POSIX # -------------------- # Test whether 'calloc' is POSIX compliant (sets errno to ENOMEM when it # fails, and doesn't mess up with ptrdiff_t or size_t overflow), # and replace calloc if it is not. AC_DEFUN([gl_FUNC_CALLOC_POSIX], [ AC_REQUIRE([gl_STDLIB_H_DEFAULTS]) AC_REQUIRE([gl_FUNC_MALLOC_POSIX]) if test $REPLACE_MALLOC_FOR_MALLOC_POSIX = 1; then REPLACE_CALLOC_FOR_CALLOC_POSIX=1 fi dnl Although in theory we should also test for size_t overflow, dnl in practice testing for ptrdiff_t overflow suffices dnl since PTRDIFF_MAX <= SIZE_MAX on all known Gnulib porting targets. dnl A separate size_t test would slow down 'configure'. ]) grub-2.14~git20250718.0e36779/m4/libunistring-base.m40000644000175000017500000001454215036447602016216 00000000000000# libunistring-base.m4 serial 7 dnl Copyright (C) 2010-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Paolo Bonzini and Bruno Haible. dnl gl_LIBUNISTRING_MODULE([VERSION], [Module]) dnl Declares that the source files of Module should be compiled, unless we dnl are linking with libunistring and its version is >= the given VERSION. dnl Defines an automake conditional LIBUNISTRING_COMPILE_$MODULE that is dnl true if the source files of Module should be compiled. dnl This macro is to be used for public libunistring API, not for dnl undocumented API. dnl dnl You have to bump the VERSION argument to the next projected version dnl number each time you make a change that affects the behaviour of the dnl functions defined in Module (even if the sources of Module itself do not dnl change). AC_DEFUN([gl_LIBUNISTRING_MODULE], [ AC_REQUIRE([gl_LIBUNISTRING_LIB_PREPARE]) dnl Use the variables HAVE_LIBUNISTRING, LIBUNISTRING_VERSION from dnl gl_LIBUNISTRING_CORE if that macro has been run. gl_CONDITIONAL(AS_TR_CPP([LIBUNISTRING_COMPILE_$2]), [gl_LIBUNISTRING_VERSION_CMP([$1])]) ]) dnl gl_LIBUNISTRING_LIBHEADER([VERSION], [HeaderFile]) dnl Declares that HeaderFile should be created, unless we are linking dnl with libunistring and its version is >= the given VERSION. dnl HeaderFile should be relative to the lib directory and end in '.h'. dnl Prepares for substituting LIBUNISTRING_HEADERFILE (to HeaderFile or empty). dnl dnl When we are linking with the already installed libunistring and its version dnl is < VERSION, we create HeaderFile here, because we may compile functions dnl (via gl_LIBUNISTRING_MODULE above) that are not contained in the installed dnl version. dnl When we are linking with the already installed libunistring and its version dnl is > VERSION, we don't create HeaderFile here: it could cause compilation dnl errors in other libunistring header files if some types are missing. dnl dnl You have to bump the VERSION argument to the next projected version dnl number each time you make a non-comment change to the HeaderFile. AC_DEFUN([gl_LIBUNISTRING_LIBHEADER], [ AC_REQUIRE([gl_LIBUNISTRING_LIB_PREPARE]) dnl Use the variables HAVE_LIBUNISTRING, LIBUNISTRING_VERSION from dnl gl_LIBUNISTRING_CORE if that macro has been run. if gl_LIBUNISTRING_VERSION_CMP([$1]); then dnl It is OK to use a .h file in lib/ from within tests/, but not vice dnl versa. if test -z "$LIBUNISTRING_[]AS_TR_CPP([$2])"; then LIBUNISTRING_[]AS_TR_CPP([$2])="${gl_source_base_prefix}$2" fi else LIBUNISTRING_[]AS_TR_CPP([$2])= fi AC_SUBST([LIBUNISTRING_]AS_TR_CPP([$2])) ]) dnl Miscellaneous preparations/initializations. AC_DEFUN([gl_LIBUNISTRING_LIB_PREPARE], [ dnl Ensure that HAVE_LIBUNISTRING is fully determined at this point. m4_ifdef([gl_LIBUNISTRING], [AC_REQUIRE([gl_LIBUNISTRING])]) AC_REQUIRE([AC_PROG_AWK]) dnl Sed expressions to extract the parts of a version number. changequote(,) gl_libunistring_sed_extract_major='/^[0-9]/{s/^\([0-9]*\).*/\1/p;q;} i\ 0 q ' gl_libunistring_sed_extract_minor='/^[0-9][0-9]*[.][0-9]/{s/^[0-9]*[.]\([0-9]*\).*/\1/p;q;} i\ 0 q ' gl_libunistring_sed_extract_subminor='/^[0-9][0-9]*[.][0-9][0-9]*[.][0-9]/{s/^[0-9]*[.][0-9]*[.]\([0-9]*\).*/\1/p;q;} i\ 0 q ' changequote([,]) if test "$HAVE_LIBUNISTRING" = yes; then LIBUNISTRING_VERSION_MAJOR=`echo "$LIBUNISTRING_VERSION" | sed -n -e "$gl_libunistring_sed_extract_major"` LIBUNISTRING_VERSION_MINOR=`echo "$LIBUNISTRING_VERSION" | sed -n -e "$gl_libunistring_sed_extract_minor"` LIBUNISTRING_VERSION_SUBMINOR=`echo "$LIBUNISTRING_VERSION" | sed -n -e "$gl_libunistring_sed_extract_subminor"` fi ]) dnl gl_LIBUNISTRING_VERSION_CMP([VERSION]) dnl Expands to a shell statement that evaluates to true if LIBUNISTRING_VERSION dnl is less than the VERSION argument. AC_DEFUN([gl_LIBUNISTRING_VERSION_CMP], [ { test "$HAVE_LIBUNISTRING" != yes \ || { dnl AS_LITERAL_IF exists and works fine since autoconf-2.59 at least. AS_LITERAL_IF([$1], [dnl This is the optimized variant, that assumes the argument is a literal: m4_pushdef([requested_version_major], [gl_LIBUNISTRING_ARG_OR_ZERO(m4_bpatsubst([$1], [^\([0-9]*\).*], [\1]), [])]) m4_pushdef([requested_version_minor], [gl_LIBUNISTRING_ARG_OR_ZERO(m4_bpatsubst([$1], [^[0-9]*[.]\([0-9]*\).*], [\1]), [$1])]) m4_pushdef([requested_version_subminor], [gl_LIBUNISTRING_ARG_OR_ZERO(m4_bpatsubst([$1], [^[0-9]*[.][0-9]*[.]\([0-9]*\).*], [\1]), [$1])]) test $LIBUNISTRING_VERSION_MAJOR -lt requested_version_major \ || { test $LIBUNISTRING_VERSION_MAJOR -eq requested_version_major \ && { test $LIBUNISTRING_VERSION_MINOR -lt requested_version_minor \ || { test $LIBUNISTRING_VERSION_MINOR -eq requested_version_minor \ && test $LIBUNISTRING_VERSION_SUBMINOR -lt requested_version_subminor } } } m4_popdef([requested_version_subminor]) m4_popdef([requested_version_minor]) m4_popdef([requested_version_major]) ], [dnl This is the unoptimized variant: requested_version_major=`echo '$1' | sed -n -e "$gl_libunistring_sed_extract_major"` requested_version_minor=`echo '$1' | sed -n -e "$gl_libunistring_sed_extract_minor"` requested_version_subminor=`echo '$1' | sed -n -e "$gl_libunistring_sed_extract_subminor"` test $LIBUNISTRING_VERSION_MAJOR -lt $requested_version_major \ || { test $LIBUNISTRING_VERSION_MAJOR -eq $requested_version_major \ && { test $LIBUNISTRING_VERSION_MINOR -lt $requested_version_minor \ || { test $LIBUNISTRING_VERSION_MINOR -eq $requested_version_minor \ && test $LIBUNISTRING_VERSION_SUBMINOR -lt $requested_version_subminor } } } ]) } }]) dnl gl_LIBUNISTRING_ARG_OR_ZERO([ARG], [ORIG]) expands to ARG if it is not the dnl same as ORIG, otherwise to 0. m4_define([gl_LIBUNISTRING_ARG_OR_ZERO], [m4_if([$1], [$2], [0], [$1])]) grub-2.14~git20250718.0e36779/m4/size_max.m40000644000175000017500000000547615036447602014422 00000000000000# size_max.m4 serial 12 dnl Copyright (C) 2003, 2005-2006, 2008-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. AC_PREREQ([2.61]) AC_DEFUN([gl_SIZE_MAX], [ AC_CHECK_HEADERS([stdint.h]) dnl First test whether the system already has SIZE_MAX. AC_CACHE_CHECK([for SIZE_MAX], [gl_cv_size_max], [ gl_cv_size_max=no AC_EGREP_CPP([Found it], [ #include #if HAVE_STDINT_H #include #endif #ifdef SIZE_MAX Found it #endif ], [gl_cv_size_max=yes]) if test $gl_cv_size_max != yes; then dnl Define it ourselves. Here we assume that the type 'size_t' is not wider dnl than the type 'unsigned long'. Try hard to find a definition that can dnl be used in a preprocessor #if, i.e. doesn't contain a cast. AC_COMPUTE_INT([size_t_bits_minus_1], [sizeof (size_t) * CHAR_BIT - 1], [#include #include ], [size_t_bits_minus_1=]) AC_COMPUTE_INT([fits_in_uint], [sizeof (size_t) <= sizeof (unsigned int)], [#include ], [fits_in_uint=]) if test -n "$size_t_bits_minus_1" && test -n "$fits_in_uint"; then if test $fits_in_uint = 1; then dnl Even though SIZE_MAX fits in an unsigned int, it must be of type dnl 'unsigned long' if the type 'size_t' is the same as 'unsigned long'. AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#include extern size_t foo; extern unsigned long foo; ]], [[]])], [fits_in_uint=0]) fi dnl We cannot use 'expr' to simplify this expression, because 'expr' dnl works only with 'long' integers in the host environment, while we dnl might be cross-compiling from a 32-bit platform to a 64-bit platform. if test $fits_in_uint = 1; then gl_cv_size_max="(((1U << $size_t_bits_minus_1) - 1) * 2 + 1)" else gl_cv_size_max="(((1UL << $size_t_bits_minus_1) - 1) * 2 + 1)" fi else dnl Shouldn't happen, but who knows... gl_cv_size_max='((size_t)~(size_t)0)' fi fi ]) if test "$gl_cv_size_max" != yes; then AC_DEFINE_UNQUOTED([SIZE_MAX], [$gl_cv_size_max], [Define as the maximum value of type 'size_t', if the system doesn't define it.]) fi dnl Don't redefine SIZE_MAX in config.h if config.h is re-included after dnl . Remember that the #undef in AH_VERBATIM gets replaced with dnl #define by AC_DEFINE_UNQUOTED. AH_VERBATIM([SIZE_MAX], [/* Define as the maximum value of type 'size_t', if the system doesn't define it. */ #ifndef SIZE_MAX # undef SIZE_MAX #endif]) ]) grub-2.14~git20250718.0e36779/m4/off_t.m40000644000175000017500000000100615036447602013661 00000000000000# off_t.m4 serial 1 dnl Copyright (C) 2012-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl Check whether to override the 'off_t' type. dnl Set WINDOWS_64_BIT_OFF_T. AC_DEFUN([gl_TYPE_OFF_T], [ m4_ifdef([gl_LARGEFILE], [ AC_REQUIRE([gl_LARGEFILE]) ], [ WINDOWS_64_BIT_OFF_T=0 ]) AC_SUBST([WINDOWS_64_BIT_OFF_T]) ]) grub-2.14~git20250718.0e36779/m4/dirent_h.m40000644000175000017500000000622215036447602014365 00000000000000# dirent_h.m4 serial 19 dnl Copyright (C) 2008-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl Written by Bruno Haible. AC_DEFUN_ONCE([gl_DIRENT_H], [ dnl Ensure to expand the default settings once only, before all statements dnl that occur in other macros. AC_REQUIRE([gl_DIRENT_H_DEFAULTS]) dnl is always overridden, because of GNULIB_POSIXCHECK. gl_CHECK_NEXT_HEADERS([dirent.h]) if test $ac_cv_header_dirent_h = yes; then HAVE_DIRENT_H=1 else HAVE_DIRENT_H=0 fi AC_SUBST([HAVE_DIRENT_H]) dnl Check for declarations of anything we want to poison if the dnl corresponding gnulib module is not in use. gl_WARN_ON_USE_PREPARE([[#include ]], [alphasort closedir dirfd fdopendir opendir readdir rewinddir scandir]) ]) # gl_DIRENT_MODULE_INDICATOR([modulename]) # sets the shell variable that indicates the presence of the given module # to a C preprocessor expression that will evaluate to 1. # This macro invocation must not occur in macros that are AC_REQUIREd. AC_DEFUN([gl_DIRENT_MODULE_INDICATOR], [ dnl Ensure to expand the default settings once only. gl_DIRENT_H_REQUIRE_DEFAULTS gl_MODULE_INDICATOR_SET_VARIABLE([$1]) dnl Define it also as a C macro, for the benefit of the unit tests. gl_MODULE_INDICATOR_FOR_TESTS([$1]) ]) # Initializes the default values for AC_SUBSTed shell variables. # This macro must not be AC_REQUIREd. It must only be invoked, and only # outside of macros or in macros that are not AC_REQUIREd. AC_DEFUN([gl_DIRENT_H_REQUIRE_DEFAULTS], [ m4_defun(GL_MODULE_INDICATOR_PREFIX[_DIRENT_H_MODULE_INDICATOR_DEFAULTS], [ gl_UNISTD_H_REQUIRE_DEFAULTS dnl for REPLACE_FCHDIR gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_OPENDIR]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_READDIR]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_REWINDDIR]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_CLOSEDIR]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_DIRFD]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FDOPENDIR]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SCANDIR]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_ALPHASORT]) ]) m4_require(GL_MODULE_INDICATOR_PREFIX[_DIRENT_H_MODULE_INDICATOR_DEFAULTS]) AC_REQUIRE([gl_DIRENT_H_DEFAULTS]) ]) AC_DEFUN([gl_DIRENT_H_DEFAULTS], [ dnl Assume proper GNU behavior unless another module says otherwise. HAVE_OPENDIR=1; AC_SUBST([HAVE_OPENDIR]) HAVE_READDIR=1; AC_SUBST([HAVE_READDIR]) HAVE_REWINDDIR=1; AC_SUBST([HAVE_REWINDDIR]) HAVE_CLOSEDIR=1; AC_SUBST([HAVE_CLOSEDIR]) HAVE_DECL_DIRFD=1; AC_SUBST([HAVE_DECL_DIRFD]) HAVE_DECL_FDOPENDIR=1;AC_SUBST([HAVE_DECL_FDOPENDIR]) HAVE_FDOPENDIR=1; AC_SUBST([HAVE_FDOPENDIR]) HAVE_SCANDIR=1; AC_SUBST([HAVE_SCANDIR]) HAVE_ALPHASORT=1; AC_SUBST([HAVE_ALPHASORT]) REPLACE_OPENDIR=0; AC_SUBST([REPLACE_OPENDIR]) REPLACE_CLOSEDIR=0; AC_SUBST([REPLACE_CLOSEDIR]) REPLACE_DIRFD=0; AC_SUBST([REPLACE_DIRFD]) REPLACE_FDOPENDIR=0; AC_SUBST([REPLACE_FDOPENDIR]) ]) grub-2.14~git20250718.0e36779/m4/locale_h.m40000644000175000017500000001375615036447602014351 00000000000000# locale_h.m4 serial 28 dnl Copyright (C) 2007, 2009-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN_ONCE([gl_LOCALE_H], [ dnl Ensure to expand the default settings once only, before all statements dnl that occur in other macros. AC_REQUIRE([gl_LOCALE_H_DEFAULTS]) dnl Persuade glibc to define locale_t and the int_p_*, int_n_* dnl members of 'struct lconv'. AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) dnl If is replaced, then must also be replaced. AC_REQUIRE([gl_STDDEF_H]) AC_REQUIRE([gl_LOCALE_T]) dnl Solaris 11.0 defines the int_p_*, int_n_* members of 'struct lconv' dnl only if _LCONV_C99 is defined. AC_REQUIRE([AC_CANONICAL_HOST]) case "$host_os" in solaris*) AC_DEFINE([_LCONV_C99], [1], [Define to 1 on Solaris.]) ;; esac AC_CACHE_CHECK([whether locale.h conforms to POSIX:2001], [gl_cv_header_locale_h_posix2001], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#include int x = LC_MESSAGES; int y = sizeof (((struct lconv *) 0)->decimal_point);]], [[]])], [gl_cv_header_locale_h_posix2001=yes], [gl_cv_header_locale_h_posix2001=no])]) dnl Check whether 'struct lconv' is complete. dnl Bionic libc's 'struct lconv' is just a dummy. dnl On OpenBSD 4.9, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin 1.5.x, dnl mingw, MSVC 9, it lacks the int_p_* and int_n_* members. AC_CACHE_CHECK([whether struct lconv is properly defined], [gl_cv_sys_struct_lconv_ok], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#include struct lconv l; int x = sizeof (l.decimal_point); int y = sizeof (l.int_p_cs_precedes);]], [[]])], [gl_cv_sys_struct_lconv_ok=yes], [gl_cv_sys_struct_lconv_ok=no]) ]) if test $gl_cv_sys_struct_lconv_ok = no; then dnl On native Windows with MSVC, merely define these member names as macros. dnl This avoids trouble in C++ mode. case "$host_os" in mingw*) AC_EGREP_CPP([Special], [ #ifdef _MSC_VER Special #endif ], [], [REPLACE_STRUCT_LCONV=1]) ;; *) REPLACE_STRUCT_LCONV=1 ;; esac fi dnl is always overridden, because of GNULIB_POSIXCHECK. gl_NEXT_HEADERS([locale.h]) dnl Check for declarations of anything we want to poison if the dnl corresponding gnulib module is not in use. gl_WARN_ON_USE_PREPARE([[#include /* Some systems provide declarations in a non-standard header. */ #if HAVE_XLOCALE_H # include #endif ]], [setlocale newlocale duplocale freelocale]) ]) dnl Checks to determine whether the system has the locale_t type, dnl and how to obtain it. AC_DEFUN([gl_LOCALE_T], [ dnl Persuade glibc and Solaris to define locale_t. AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) dnl Check whether use of locale_t requires inclusion of , dnl e.g. on Mac OS X 10.5. If does not define locale_t by dnl itself, we assume that will do so. AC_CACHE_CHECK([whether locale.h defines locale_t], [gl_cv_header_locale_has_locale_t], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#include locale_t x;]], [[]])], [gl_cv_header_locale_has_locale_t=yes], [gl_cv_header_locale_has_locale_t=no]) ]) dnl Check for . AC_CHECK_HEADERS_ONCE([xlocale.h]) if test $ac_cv_header_xlocale_h = yes; then HAVE_XLOCALE_H=1 if test $gl_cv_header_locale_has_locale_t = yes; then gl_cv_header_locale_h_needs_xlocale_h=no else gl_cv_header_locale_h_needs_xlocale_h=yes fi HAVE_LOCALE_T=1 else HAVE_XLOCALE_H=0 gl_cv_header_locale_h_needs_xlocale_h=no if test $gl_cv_header_locale_has_locale_t = yes; then HAVE_LOCALE_T=1 else HAVE_LOCALE_T=0 fi fi AC_SUBST([HAVE_XLOCALE_H]) ]) # gl_LOCALE_MODULE_INDICATOR([modulename]) # sets the shell variable that indicates the presence of the given module # to a C preprocessor expression that will evaluate to 1. # This macro invocation must not occur in macros that are AC_REQUIREd. AC_DEFUN([gl_LOCALE_MODULE_INDICATOR], [ dnl Ensure to expand the default settings once only. gl_LOCALE_H_REQUIRE_DEFAULTS gl_MODULE_INDICATOR_SET_VARIABLE([$1]) dnl Define it also as a C macro, for the benefit of the unit tests. gl_MODULE_INDICATOR_FOR_TESTS([$1]) ]) # Initializes the default values for AC_SUBSTed shell variables. # This macro must not be AC_REQUIREd. It must only be invoked, and only # outside of macros or in macros that are not AC_REQUIREd. AC_DEFUN([gl_LOCALE_H_REQUIRE_DEFAULTS], [ m4_defun(GL_MODULE_INDICATOR_PREFIX[_LOCALE_H_MODULE_INDICATOR_DEFAULTS], [ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LOCALECONV]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SETLOCALE]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SETLOCALE_NULL]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_DUPLOCALE]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LOCALENAME]) ]) m4_require(GL_MODULE_INDICATOR_PREFIX[_LOCALE_H_MODULE_INDICATOR_DEFAULTS]) AC_REQUIRE([gl_LOCALE_H_DEFAULTS]) ]) AC_DEFUN([gl_LOCALE_H_DEFAULTS], [ dnl Assume proper GNU behavior unless another module says otherwise. HAVE_NEWLOCALE=1; AC_SUBST([HAVE_NEWLOCALE]) HAVE_DUPLOCALE=1; AC_SUBST([HAVE_DUPLOCALE]) HAVE_FREELOCALE=1; AC_SUBST([HAVE_FREELOCALE]) REPLACE_LOCALECONV=0; AC_SUBST([REPLACE_LOCALECONV]) REPLACE_SETLOCALE=0; AC_SUBST([REPLACE_SETLOCALE]) REPLACE_NEWLOCALE=0; AC_SUBST([REPLACE_NEWLOCALE]) REPLACE_DUPLOCALE=0; AC_SUBST([REPLACE_DUPLOCALE]) REPLACE_FREELOCALE=0; AC_SUBST([REPLACE_FREELOCALE]) REPLACE_STRUCT_LCONV=0; AC_SUBST([REPLACE_STRUCT_LCONV]) LOCALENAME_ENHANCE_LOCALE_FUNCS=0; AC_SUBST([LOCALENAME_ENHANCE_LOCALE_FUNCS]) ]) grub-2.14~git20250718.0e36779/m4/memrchr.m40000644000175000017500000000124415036447602014225 00000000000000# memrchr.m4 serial 11 dnl Copyright (C) 2002-2003, 2005-2007, 2009-2022 Free Software Foundation, dnl Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_MEMRCHR], [ dnl Persuade glibc to declare memrchr(). AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) AC_REQUIRE([gl_STRING_H_DEFAULTS]) AC_CHECK_DECLS_ONCE([memrchr]) if test $ac_cv_have_decl_memrchr = no; then HAVE_DECL_MEMRCHR=0 fi AC_CHECK_FUNCS([memrchr]) ]) # Prerequisites of lib/memrchr.c. AC_DEFUN([gl_PREREQ_MEMRCHR], [:]) grub-2.14~git20250718.0e36779/m4/absolute-header.m40000644000175000017500000001015115036447602015631 00000000000000# absolute-header.m4 serial 17 dnl Copyright (C) 2006-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Derek Price. # gl_ABSOLUTE_HEADER(HEADER1 HEADER2 ...) # --------------------------------------- # Find the absolute name of a header file, testing first if the header exists. # If the header were sys/inttypes.h, this macro would define # ABSOLUTE_SYS_INTTYPES_H to the '""' quoted absolute name of sys/inttypes.h # in config.h # (e.g. '#define ABSOLUTE_SYS_INTTYPES_H "///usr/include/sys/inttypes.h"'). # The three "///" are to pacify Sun C 5.8, which otherwise would say # "warning: #include of /usr/include/... may be non-portable". # Use '""', not '<>', so that the /// cannot be confused with a C99 comment. # Note: This macro assumes that the header file is not empty after # preprocessing, i.e. it does not only define preprocessor macros but also # provides some type/enum definitions or function/variable declarations. AC_DEFUN([gl_ABSOLUTE_HEADER], [AC_REQUIRE([AC_CANONICAL_HOST]) AC_LANG_PREPROC_REQUIRE()dnl m4_foreach_w([gl_HEADER_NAME], [$1], [AS_VAR_PUSHDEF([gl_absolute_header], [gl_cv_absolute_]m4_defn([gl_HEADER_NAME]))dnl AC_CACHE_CHECK([absolute name of <]m4_defn([gl_HEADER_NAME])[>], [gl_absolute_header], [AS_VAR_PUSHDEF([ac_header_exists], [ac_cv_header_]m4_defn([gl_HEADER_NAME]))dnl AC_CHECK_HEADERS_ONCE(m4_defn([gl_HEADER_NAME]))dnl if test AS_VAR_GET([ac_header_exists]) = yes; then gl_ABSOLUTE_HEADER_ONE(m4_defn([gl_HEADER_NAME])) fi AS_VAR_POPDEF([ac_header_exists])dnl ])dnl AC_DEFINE_UNQUOTED(AS_TR_CPP([ABSOLUTE_]m4_defn([gl_HEADER_NAME])), ["AS_VAR_GET([gl_absolute_header])"], [Define this to an absolute name of <]m4_defn([gl_HEADER_NAME])[>.]) AS_VAR_POPDEF([gl_absolute_header])dnl ])dnl ])# gl_ABSOLUTE_HEADER # gl_ABSOLUTE_HEADER_ONE(HEADER) # ------------------------------ # Like gl_ABSOLUTE_HEADER, except that: # - it assumes that the header exists, # - it uses the current CPPFLAGS, # - it does not cache the result, # - it is silent. AC_DEFUN([gl_ABSOLUTE_HEADER_ONE], [ AC_REQUIRE([AC_CANONICAL_HOST]) AC_LANG_CONFTEST([AC_LANG_SOURCE([[#include <]]m4_dquote([$1])[[>]])]) dnl AIX "xlc -E" and "cc -E" omit #line directives for header files dnl that contain only a #include of other header files and no dnl non-comment tokens of their own. This leads to a failure to dnl detect the absolute name of , , dnl and others. The workaround is to force preservation of comments dnl through option -C. This ensures all necessary #line directives dnl are present. GCC supports option -C as well. case "$host_os" in aix*) gl_absname_cpp="$ac_cpp -C" ;; *) gl_absname_cpp="$ac_cpp" ;; esac changequote(,) case "$host_os" in mingw*) dnl For the sake of native Windows compilers (excluding gcc), dnl treat backslash as a directory separator, like /. dnl Actually, these compilers use a double-backslash as dnl directory separator, inside the dnl # line "filename" dnl directives. gl_dirsep_regex='[/\\]' ;; *) gl_dirsep_regex='\/' ;; esac dnl A sed expression that turns a string into a basic regular dnl expression, for use within "/.../". gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g' gl_header_literal_regex=`echo '$1' \ | sed -e "$gl_make_literal_regex_sed"` gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/ s|^/[^/]|//&| p q }' changequote([,]) dnl eval is necessary to expand gl_absname_cpp. dnl Ultrix and Pyramid sh refuse to redirect output of eval, dnl so use subshell. AS_VAR_SET([gl_cv_absolute_]AS_TR_SH([[$1]]), [`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&AS_MESSAGE_LOG_FD | sed -n "$gl_absolute_header_sed"`]) ]) grub-2.14~git20250718.0e36779/m4/mempcpy.m40000644000175000017500000000133715036447602014245 00000000000000# mempcpy.m4 serial 12 dnl Copyright (C) 2003-2004, 2006-2007, 2009-2022 Free Software Foundation, dnl Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_MEMPCPY], [ dnl Persuade glibc to declare mempcpy(). AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) dnl The mempcpy() declaration in lib/string.in.h uses 'restrict'. AC_REQUIRE([AC_C_RESTRICT]) AC_REQUIRE([gl_STRING_H_DEFAULTS]) AC_CHECK_FUNCS([mempcpy]) if test $ac_cv_func_mempcpy = no; then HAVE_MEMPCPY=0 fi ]) # Prerequisites of lib/mempcpy.c. AC_DEFUN([gl_PREREQ_MEMPCPY], [ : ]) grub-2.14~git20250718.0e36779/m4/pthread_rwlock_rdlock.m40000644000175000017500000001546315036447602017146 00000000000000# pthread_rwlock_rdlock.m4 serial 4 dnl Copyright (C) 2017-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. dnl Inspired by dnl https://github.com/linux-test-project/ltp/blob/master/testcases/open_posix_testsuite/conformance/interfaces/pthread_rwlock_rdlock/2-2.c dnl by Intel Corporation. dnl Test whether in a situation where dnl - an rwlock is taken by a reader and has a writer waiting, dnl - an additional reader requests the lock, dnl - the waiting writer and the requesting reader threads have the same dnl priority, dnl the requesting reader thread gets blocked, so that at some point the dnl waiting writer can acquire the lock. dnl Without such a guarantee, when there a N readers and each of the readers dnl spends more than 1/Nth of the time with the lock held, there is a high dnl probability that the waiting writer will not get the lock in a given finite dnl time, a phenomenon called "writer starvation". dnl Without such a guarantee, applications have a hard time avoiding writer dnl starvation. dnl dnl POSIX:2017 makes this requirement only for implementations that support TPS dnl (Thread Priority Scheduling) and only for the scheduling policies SCHED_FIFO dnl and SCHED_RR, see dnl https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_rwlock_rdlock.html dnl but this test verifies the guarantee regardless of TPS and regardless of dnl scheduling policy. dnl Glibc does not provide this guarantee (and never will on Linux), see dnl https://sourceware.org/bugzilla/show_bug.cgi?id=13701 dnl https://bugzilla.redhat.com/show_bug.cgi?id=1410052 AC_DEFUN([gl_PTHREAD_RWLOCK_RDLOCK_PREFER_WRITER], [ AC_REQUIRE([gl_THREADLIB_EARLY]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether pthread_rwlock_rdlock prefers a writer to a reader], [gl_cv_pthread_rwlock_rdlock_prefer_writer], [save_LIBS="$LIBS" LIBS="$LIBS $LIBMULTITHREAD" AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include #include #include #define SUCCEED() exit (0) #define FAILURE() exit (1) #define UNEXPECTED(n) (exit (10 + (n))) /* The main thread creates the waiting writer and the requesting reader threads in the default way; this guarantees that they have the same priority. We can reuse the main thread as first reader thread. */ static pthread_rwlock_t lock; static pthread_t reader1; static pthread_t writer; static pthread_t reader2; static pthread_t timer; /* Used to pass control from writer to reader2 and from reader2 to timer, as in a relay race. Passing control from one running thread to another running thread is most likely faster than to create the second thread. */ static pthread_mutex_t baton; static void * timer_func (void *ignored) { /* Step 13 (can be before or after step 12): The timer thread takes the baton, then waits a moment to make sure it can tell whether the second reader thread is blocked at step 12. */ if (pthread_mutex_lock (&baton)) UNEXPECTED (13); usleep (100000); /* By the time we get here, it's clear that the second reader thread is blocked at step 12. This is the desired behaviour. */ SUCCEED (); } static void * reader2_func (void *ignored) { int err; /* Step 8 (can be before or after step 7): The second reader thread takes the baton, then waits a moment to make sure the writer thread has reached step 7. */ if (pthread_mutex_lock (&baton)) UNEXPECTED (8); usleep (100000); /* Step 9: The second reader thread requests the lock. */ err = pthread_rwlock_tryrdlock (&lock); if (err == 0) FAILURE (); else if (err != EBUSY) UNEXPECTED (9); /* Step 10: Launch a timer, to test whether the next call blocks. */ if (pthread_create (&timer, NULL, timer_func, NULL)) UNEXPECTED (10); /* Step 11: Release the baton. */ if (pthread_mutex_unlock (&baton)) UNEXPECTED (11); /* Step 12: The second reader thread requests the lock. */ err = pthread_rwlock_rdlock (&lock); if (err == 0) FAILURE (); else UNEXPECTED (12); } static void * writer_func (void *ignored) { /* Step 4: Take the baton, so that the second reader thread does not go ahead too early. */ if (pthread_mutex_lock (&baton)) UNEXPECTED (4); /* Step 5: Create the second reader thread. */ if (pthread_create (&reader2, NULL, reader2_func, NULL)) UNEXPECTED (5); /* Step 6: Release the baton. */ if (pthread_mutex_unlock (&baton)) UNEXPECTED (6); /* Step 7: The writer thread requests the lock. */ if (pthread_rwlock_wrlock (&lock)) UNEXPECTED (7); return NULL; } int main () { reader1 = pthread_self (); /* Step 1: The main thread initializes the lock and the baton. */ if (pthread_rwlock_init (&lock, NULL)) UNEXPECTED (1); if (pthread_mutex_init (&baton, NULL)) UNEXPECTED (1); /* Step 2: The main thread acquires the lock as a reader. */ if (pthread_rwlock_rdlock (&lock)) UNEXPECTED (2); /* Step 3: Create the writer thread. */ if (pthread_create (&writer, NULL, writer_func, NULL)) UNEXPECTED (3); /* Job done. Go to sleep. */ for (;;) { sleep (1); } } ]])], [gl_cv_pthread_rwlock_rdlock_prefer_writer=yes], [gl_cv_pthread_rwlock_rdlock_prefer_writer=no], [case "$host_os" in # Guess no on glibc systems. *-gnu* | gnu*) gl_cv_pthread_rwlock_rdlock_prefer_writer="guessing no" ;; # Guess no on musl systems. *-musl*) gl_cv_pthread_rwlock_rdlock_prefer_writer="guessing no" ;; # Guess no on bionic systems. *-android*) gl_cv_pthread_rwlock_rdlock_prefer_writer="guessing no" ;; # Guess yes on native Windows with the mingw-w64 winpthreads library. # Guess no on native Windows with the gnulib windows-rwlock module. mingw*) if test "$gl_use_threads" = yes || test "$gl_use_threads" = posix; then gl_cv_pthread_rwlock_rdlock_prefer_writer="guessing yes" else gl_cv_pthread_rwlock_rdlock_prefer_writer="guessing no" fi ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_pthread_rwlock_rdlock_prefer_writer="$gl_cross_guess_normal" ;; esac ]) LIBS="$save_LIBS" ]) case "$gl_cv_pthread_rwlock_rdlock_prefer_writer" in *yes) AC_DEFINE([HAVE_PTHREAD_RWLOCK_RDLOCK_PREFER_WRITER], [1], [Define if the 'pthread_rwlock_rdlock' function prefers a writer to a reader.]) ;; esac ]) grub-2.14~git20250718.0e36779/m4/lib-link.m40000644000175000017500000010044315036447570014276 00000000000000# lib-link.m4 serial 26 (gettext-0.18.2) dnl Copyright (C) 2001-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. AC_PREREQ([2.54]) dnl AC_LIB_LINKFLAGS(name [, dependencies]) searches for libname and dnl the libraries corresponding to explicit and implicit dependencies. dnl Sets and AC_SUBSTs the LIB${NAME} and LTLIB${NAME} variables and dnl augments the CPPFLAGS variable. dnl Sets and AC_SUBSTs the LIB${NAME}_PREFIX variable to nonempty if libname dnl was found in ${LIB${NAME}_PREFIX}/$acl_libdirstem. AC_DEFUN([AC_LIB_LINKFLAGS], [ AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) AC_REQUIRE([AC_LIB_RPATH]) pushdef([Name],[m4_translit([$1],[./+-], [____])]) pushdef([NAME],[m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./+-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])]) AC_CACHE_CHECK([how to link with lib[]$1], [ac_cv_lib[]Name[]_libs], [ AC_LIB_LINKFLAGS_BODY([$1], [$2]) ac_cv_lib[]Name[]_libs="$LIB[]NAME" ac_cv_lib[]Name[]_ltlibs="$LTLIB[]NAME" ac_cv_lib[]Name[]_cppflags="$INC[]NAME" ac_cv_lib[]Name[]_prefix="$LIB[]NAME[]_PREFIX" ]) LIB[]NAME="$ac_cv_lib[]Name[]_libs" LTLIB[]NAME="$ac_cv_lib[]Name[]_ltlibs" INC[]NAME="$ac_cv_lib[]Name[]_cppflags" LIB[]NAME[]_PREFIX="$ac_cv_lib[]Name[]_prefix" AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) AC_SUBST([LIB]NAME) AC_SUBST([LTLIB]NAME) AC_SUBST([LIB]NAME[_PREFIX]) dnl Also set HAVE_LIB[]NAME so that AC_LIB_HAVE_LINKFLAGS can reuse the dnl results of this search when this library appears as a dependency. HAVE_LIB[]NAME=yes popdef([NAME]) popdef([Name]) ]) dnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode, [missing-message]) dnl searches for libname and the libraries corresponding to explicit and dnl implicit dependencies, together with the specified include files and dnl the ability to compile and link the specified testcode. The missing-message dnl defaults to 'no' and may contain additional hints for the user. dnl If found, it sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME} dnl and LTLIB${NAME} variables and augments the CPPFLAGS variable, and dnl #defines HAVE_LIB${NAME} to 1. Otherwise, it sets and AC_SUBSTs dnl HAVE_LIB${NAME}=no and LIB${NAME} and LTLIB${NAME} to empty. dnl Sets and AC_SUBSTs the LIB${NAME}_PREFIX variable to nonempty if libname dnl was found in ${LIB${NAME}_PREFIX}/$acl_libdirstem. AC_DEFUN([AC_LIB_HAVE_LINKFLAGS], [ AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) AC_REQUIRE([AC_LIB_RPATH]) pushdef([Name],[m4_translit([$1],[./+-], [____])]) pushdef([NAME],[m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./+-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])]) dnl Search for lib[]Name and define LIB[]NAME, LTLIB[]NAME and INC[]NAME dnl accordingly. AC_LIB_LINKFLAGS_BODY([$1], [$2]) dnl Add $INC[]NAME to CPPFLAGS before performing the following checks, dnl because if the user has installed lib[]Name and not disabled its use dnl via --without-lib[]Name-prefix, he wants to use it. ac_save_CPPFLAGS="$CPPFLAGS" AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) AC_CACHE_CHECK([for lib[]$1], [ac_cv_lib[]Name], [ ac_save_LIBS="$LIBS" dnl If $LIB[]NAME contains some -l options, add it to the end of LIBS, dnl because these -l options might require -L options that are present in dnl LIBS. -l options benefit only from the -L options listed before it. dnl Otherwise, add it to the front of LIBS, because it may be a static dnl library that depends on another static library that is present in LIBS. dnl Static libraries benefit only from the static libraries listed after dnl it. case " $LIB[]NAME" in *" -l"*) LIBS="$LIBS $LIB[]NAME" ;; *) LIBS="$LIB[]NAME $LIBS" ;; esac AC_LINK_IFELSE( [AC_LANG_PROGRAM([[$3]], [[$4]])], [ac_cv_lib[]Name=yes], [ac_cv_lib[]Name='m4_if([$5], [], [no], [[$5]])']) LIBS="$ac_save_LIBS" ]) if test "$ac_cv_lib[]Name" = yes; then HAVE_LIB[]NAME=yes AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the lib][$1 library.]) AC_MSG_CHECKING([how to link with lib[]$1]) AC_MSG_RESULT([$LIB[]NAME]) else HAVE_LIB[]NAME=no dnl If $LIB[]NAME didn't lead to a usable library, we don't need dnl $INC[]NAME either. CPPFLAGS="$ac_save_CPPFLAGS" LIB[]NAME= LTLIB[]NAME= LIB[]NAME[]_PREFIX= fi AC_SUBST([HAVE_LIB]NAME) AC_SUBST([LIB]NAME) AC_SUBST([LTLIB]NAME) AC_SUBST([LIB]NAME[_PREFIX]) popdef([NAME]) popdef([Name]) ]) dnl Determine the platform dependent parameters needed to use rpath: dnl acl_libext, dnl acl_shlibext, dnl acl_libname_spec, dnl acl_library_names_spec, dnl acl_hardcode_libdir_flag_spec, dnl acl_hardcode_libdir_separator, dnl acl_hardcode_direct, dnl acl_hardcode_minus_L. AC_DEFUN([AC_LIB_RPATH], [ dnl Tell automake >= 1.10 to complain if config.rpath is missing. m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([config.rpath])]) AC_REQUIRE([AC_PROG_CC]) dnl we use $CC, $GCC, $LDFLAGS AC_REQUIRE([AC_LIB_PROG_LD]) dnl we use $LD, $with_gnu_ld AC_REQUIRE([AC_CANONICAL_HOST]) dnl we use $host AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir AC_CACHE_CHECK([for shared library run path origin], [acl_cv_rpath], [ CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh . ./conftest.sh rm -f ./conftest.sh acl_cv_rpath=done ]) wl="$acl_cv_wl" acl_libext="$acl_cv_libext" acl_shlibext="$acl_cv_shlibext" acl_libname_spec="$acl_cv_libname_spec" acl_library_names_spec="$acl_cv_library_names_spec" acl_hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" acl_hardcode_direct="$acl_cv_hardcode_direct" acl_hardcode_minus_L="$acl_cv_hardcode_minus_L" dnl Determine whether the user wants rpath handling at all. AC_ARG_ENABLE([rpath], [ --disable-rpath do not hardcode runtime library paths], :, enable_rpath=yes) ]) dnl AC_LIB_FROMPACKAGE(name, package) dnl declares that libname comes from the given package. The configure file dnl will then not have a --with-libname-prefix option but a dnl --with-package-prefix option. Several libraries can come from the same dnl package. This declaration must occur before an AC_LIB_LINKFLAGS or similar dnl macro call that searches for libname. AC_DEFUN([AC_LIB_FROMPACKAGE], [ pushdef([NAME],[m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./+-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])]) define([acl_frompackage_]NAME, [$2]) popdef([NAME]) pushdef([PACK],[$2]) pushdef([PACKUP],[m4_translit(PACK,[abcdefghijklmnopqrstuvwxyz./+-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])]) define([acl_libsinpackage_]PACKUP, m4_ifdef([acl_libsinpackage_]PACKUP, [m4_defn([acl_libsinpackage_]PACKUP)[, ]],)[lib$1]) popdef([PACKUP]) popdef([PACK]) ]) dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and dnl the libraries corresponding to explicit and implicit dependencies. dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables. dnl Also, sets the LIB${NAME}_PREFIX variable to nonempty if libname was found dnl in ${LIB${NAME}_PREFIX}/$acl_libdirstem. AC_DEFUN([AC_LIB_LINKFLAGS_BODY], [ AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) pushdef([NAME],[m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./+-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])]) pushdef([PACK],[m4_ifdef([acl_frompackage_]NAME, [acl_frompackage_]NAME, lib[$1])]) pushdef([PACKUP],[m4_translit(PACK,[abcdefghijklmnopqrstuvwxyz./+-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])]) pushdef([PACKLIBS],[m4_ifdef([acl_frompackage_]NAME, [acl_libsinpackage_]PACKUP, lib[$1])]) dnl Autoconf >= 2.61 supports dots in --with options. pushdef([P_A_C_K],[m4_if(m4_version_compare(m4_defn([m4_PACKAGE_VERSION]),[2.61]),[-1],[m4_translit(PACK,[.],[_])],PACK)]) dnl By default, look in $includedir and $libdir. use_additional=yes AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) AC_ARG_WITH(P_A_C_K[-prefix], [[ --with-]]P_A_C_K[[-prefix[=DIR] search for ]PACKLIBS[ in DIR/include and DIR/lib --without-]]P_A_C_K[[-prefix don't search for ]PACKLIBS[ in includedir and libdir]], [ if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" if test "$acl_libdirstem2" != "$acl_libdirstem" \ && ! test -d "$withval/$acl_libdirstem"; then additional_libdir="$withval/$acl_libdirstem2" fi fi fi ]) dnl Search the library and its dependencies in $additional_libdir and dnl $LDFLAGS. Using breadth-first-seach. LIB[]NAME= LTLIB[]NAME= INC[]NAME= LIB[]NAME[]_PREFIX= dnl HAVE_LIB${NAME} is an indicator that LIB${NAME}, LTLIB${NAME} have been dnl computed. So it has to be reset here. HAVE_LIB[]NAME= rpathdirs= ltrpathdirs= names_already_handled= names_next_round='$1 $2' while test -n "$names_next_round"; do names_this_round="$names_next_round" names_next_round= for name in $names_this_round; do already_handled= for n in $names_already_handled; do if test "$n" = "$name"; then already_handled=yes break fi done if test -z "$already_handled"; then names_already_handled="$names_already_handled $name" dnl See if it was already located by an earlier AC_LIB_LINKFLAGS dnl or AC_LIB_HAVE_LINKFLAGS call. uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./+-|ABCDEFGHIJKLMNOPQRSTUVWXYZ____|'` eval value=\"\$HAVE_LIB$uppername\" if test -n "$value"; then if test "$value" = yes; then eval value=\"\$LIB$uppername\" test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value" eval value=\"\$LTLIB$uppername\" test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value" else dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined dnl that this library doesn't exist. So just drop it. : fi else dnl Search the library lib$name in $additional_libdir and $LDFLAGS dnl and the already constructed $LIBNAME/$LTLIBNAME. found_dir= found_la= found_so= found_a= eval libname=\"$acl_libname_spec\" # typically: libname=lib$name if test -n "$acl_shlibext"; then shrext=".$acl_shlibext" # typically: shrext=.so else shrext= fi if test $use_additional = yes; then dir="$additional_libdir" dnl The same code as in the loop below: dnl First look for a shared library. if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi dnl Then look for a static library. if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi fi if test "X$found_dir" = "X"; then for x in $LDFLAGS $LTLIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) case "$x" in -L*) dir=`echo "X$x" | sed -e 's/^X-L//'` dnl First look for a shared library. if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi dnl Then look for a static library. if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi ;; esac if test "X$found_dir" != "X"; then break fi done fi if test "X$found_dir" != "X"; then dnl Found the library. LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name" if test "X$found_so" != "X"; then dnl Linking with a shared library. We attempt to hardcode its dnl directory into the executable's runpath, unless it's the dnl standard /usr/lib. if test "$enable_rpath" = no \ || test "X$found_dir" = "X/usr/$acl_libdirstem" \ || test "X$found_dir" = "X/usr/$acl_libdirstem2"; then dnl No hardcoding is needed. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" else dnl Use an explicit option to hardcode DIR into the resulting dnl binary. dnl Potentially add DIR to ltrpathdirs. dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. haveit= for x in $ltrpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $found_dir" fi dnl The hardcoding into $LIBNAME is system dependent. if test "$acl_hardcode_direct" = yes; then dnl Using DIR/libNAME.so during linking hardcodes DIR into the dnl resulting binary. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" else if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then dnl Use an explicit option to hardcode DIR into the resulting dnl binary. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" dnl Potentially add DIR to rpathdirs. dnl The rpathdirs will be appended to $LIBNAME at the end. haveit= for x in $rpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $found_dir" fi else dnl Rely on "-L$found_dir". dnl But don't add it if it's already contained in the LDFLAGS dnl or the already constructed $LIBNAME haveit= for x in $LDFLAGS $LIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir" fi if test "$acl_hardcode_minus_L" != no; then dnl FIXME: Not sure whether we should use dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" dnl here. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" else dnl We cannot use $acl_hardcode_runpath_var and LD_RUN_PATH dnl here, because this doesn't fit in flags passed to the dnl compiler. So give up. No hardcoding. This affects only dnl very old systems. dnl FIXME: Not sure whether we should use dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" dnl here. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" fi fi fi fi else if test "X$found_a" != "X"; then dnl Linking with a static library. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a" else dnl We shouldn't come here, but anyway it's good to have a dnl fallback. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name" fi fi dnl Assume the include files are nearby. additional_includedir= case "$found_dir" in */$acl_libdirstem | */$acl_libdirstem/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` if test "$name" = '$1'; then LIB[]NAME[]_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; */$acl_libdirstem2 | */$acl_libdirstem2/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'` if test "$name" = '$1'; then LIB[]NAME[]_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; esac if test "X$additional_includedir" != "X"; then dnl Potentially add $additional_includedir to $INCNAME. dnl But don't add it dnl 1. if it's the standard /usr/include, dnl 2. if it's /usr/local/include and we are using GCC on Linux, dnl 3. if it's already present in $CPPFLAGS or the already dnl constructed $INCNAME, dnl 4. if it doesn't exist as a directory. if test "X$additional_includedir" != "X/usr/include"; then haveit= if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then for x in $CPPFLAGS $INC[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_includedir"; then dnl Really add $additional_includedir to $INCNAME. INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir" fi fi fi fi fi dnl Look for dependencies. if test -n "$found_la"; then dnl Read the .la file. It defines the variables dnl dlname, library_names, old_library, dependency_libs, current, dnl age, revision, installed, dlopen, dlpreopen, libdir. save_libdir="$libdir" case "$found_la" in */* | *\\*) . "$found_la" ;; *) . "./$found_la" ;; esac libdir="$save_libdir" dnl We use only dependency_libs. for dep in $dependency_libs; do case "$dep" in -L*) additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME. dnl But don't add it dnl 1. if it's the standard /usr/lib, dnl 2. if it's /usr/local/lib and we are using GCC on Linux, dnl 3. if it's already present in $LDFLAGS or the already dnl constructed $LIBNAME, dnl 4. if it doesn't exist as a directory. if test "X$additional_libdir" != "X/usr/$acl_libdirstem" \ && test "X$additional_libdir" != "X/usr/$acl_libdirstem2"; then haveit= if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem" \ || test "X$additional_libdir" = "X/usr/local/$acl_libdirstem2"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then haveit= for x in $LDFLAGS $LIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then dnl Really add $additional_libdir to $LIBNAME. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir" fi fi haveit= for x in $LDFLAGS $LTLIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then dnl Really add $additional_libdir to $LTLIBNAME. LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir" fi fi fi fi ;; -R*) dir=`echo "X$dep" | sed -e 's/^X-R//'` if test "$enable_rpath" != no; then dnl Potentially add DIR to rpathdirs. dnl The rpathdirs will be appended to $LIBNAME at the end. haveit= for x in $rpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $dir" fi dnl Potentially add DIR to ltrpathdirs. dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. haveit= for x in $ltrpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $dir" fi fi ;; -l*) dnl Handle this in the next round. names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` ;; *.la) dnl Handle this in the next round. Throw away the .la's dnl directory; it is already contained in a preceding -L dnl option. names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` ;; *) dnl Most likely an immediate library name. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep" LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep" ;; esac done fi else dnl Didn't find the library; assume it is in the system directories dnl known to the linker and runtime loader. (All the system dnl directories known to the linker should also be known to the dnl runtime loader, otherwise the system is severely misconfigured.) LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name" fi fi fi done done if test "X$rpathdirs" != "X"; then if test -n "$acl_hardcode_libdir_separator"; then dnl Weird platform: only the last -rpath option counts, the user must dnl pass all path elements in one option. We can arrange that for a dnl single library, but not when more than one $LIBNAMEs are used. alldirs= for found_dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir" done dnl Note: acl_hardcode_libdir_flag_spec uses $libdir and $wl. acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" else dnl The -rpath options are cumulative. for found_dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$found_dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" done fi fi if test "X$ltrpathdirs" != "X"; then dnl When using libtool, the option that works for both libraries and dnl executables is -R. The -R options are cumulative. for found_dir in $ltrpathdirs; do LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir" done fi popdef([P_A_C_K]) popdef([PACKLIBS]) popdef([PACKUP]) popdef([PACK]) popdef([NAME]) ]) dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR, dnl unless already present in VAR. dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes dnl contains two or three consecutive elements that belong together. AC_DEFUN([AC_LIB_APPENDTOVAR], [ for element in [$2]; do haveit= for x in $[$1]; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X$element"; then haveit=yes break fi done if test -z "$haveit"; then [$1]="${[$1]}${[$1]:+ }$element" fi done ]) dnl For those cases where a variable contains several -L and -l options dnl referring to unknown libraries and directories, this macro determines the dnl necessary additional linker options for the runtime path. dnl AC_LIB_LINKFLAGS_FROM_LIBS([LDADDVAR], [LIBSVALUE], [USE-LIBTOOL]) dnl sets LDADDVAR to linker options needed together with LIBSVALUE. dnl If USE-LIBTOOL evaluates to non-empty, linking with libtool is assumed, dnl otherwise linking without libtool is assumed. AC_DEFUN([AC_LIB_LINKFLAGS_FROM_LIBS], [ AC_REQUIRE([AC_LIB_RPATH]) AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) $1= if test "$enable_rpath" != no; then if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then dnl Use an explicit option to hardcode directories into the resulting dnl binary. rpathdirs= next= for opt in $2; do if test -n "$next"; then dir="$next" dnl No need to hardcode the standard /usr/lib. if test "X$dir" != "X/usr/$acl_libdirstem" \ && test "X$dir" != "X/usr/$acl_libdirstem2"; then rpathdirs="$rpathdirs $dir" fi next= else case $opt in -L) next=yes ;; -L*) dir=`echo "X$opt" | sed -e 's,^X-L,,'` dnl No need to hardcode the standard /usr/lib. if test "X$dir" != "X/usr/$acl_libdirstem" \ && test "X$dir" != "X/usr/$acl_libdirstem2"; then rpathdirs="$rpathdirs $dir" fi next= ;; *) next= ;; esac fi done if test "X$rpathdirs" != "X"; then if test -n ""$3""; then dnl libtool is used for linking. Use -R options. for dir in $rpathdirs; do $1="${$1}${$1:+ }-R$dir" done else dnl The linker is used for linking directly. if test -n "$acl_hardcode_libdir_separator"; then dnl Weird platform: only the last -rpath option counts, the user dnl must pass all path elements in one option. alldirs= for dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$dir" done acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" $1="$flag" else dnl The -rpath options are cumulative. for dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" $1="${$1}${$1:+ }$flag" done fi fi fi fi fi AC_SUBST([$1]) ]) grub-2.14~git20250718.0e36779/m4/sleep.m40000644000175000017500000000447215036447602013706 00000000000000# sleep.m4 serial 11 dnl Copyright (C) 2007-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_SLEEP], [ AC_REQUIRE([gl_UNISTD_H_DEFAULTS]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles dnl We expect to see the declaration of sleep() in a header file. dnl Older versions of mingw have a sleep() function that is an alias to dnl _sleep() in MSVCRT. It has a different signature than POSIX sleep(): dnl it takes the number of milliseconds as argument and returns void. dnl mingw does not declare this function. AC_CHECK_DECLS([sleep], , , [[#include ]]) AC_CHECK_FUNCS_ONCE([sleep]) if test $ac_cv_have_decl_sleep != yes; then HAVE_SLEEP=0 else dnl Cygwin 1.5.x has a bug where sleep can't exceed 49.7 days. AC_CACHE_CHECK([for working sleep], [gl_cv_func_sleep_works], [AC_RUN_IFELSE([AC_LANG_PROGRAM([[ #include #include #include static void handle_alarm (int sig) { if (sig != SIGALRM) _exit (2); } ]], [[ /* Failure to compile this test due to missing alarm is okay, since all such platforms (mingw) also lack sleep. */ unsigned int pentecost = 50 * 24 * 60 * 60; /* 50 days. */ unsigned int remaining; signal (SIGALRM, handle_alarm); alarm (1); remaining = sleep (pentecost); if (remaining > pentecost) return 3; if (remaining <= pentecost - 10) return 4; return 0; ]])], [gl_cv_func_sleep_works=yes], [gl_cv_func_sleep_works=no], [case "$host_os" in # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_sleep_works="guessing yes" ;; # Guess yes on musl systems. *-musl*) gl_cv_func_sleep_works="guessing yes" ;; # Guess no on native Windows. mingw*) gl_cv_func_sleep_works="guessing no" ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_sleep_works="$gl_cross_guess_normal" ;; esac ])]) case "$gl_cv_func_sleep_works" in *yes) ;; *) REPLACE_SLEEP=1 ;; esac fi ]) grub-2.14~git20250718.0e36779/m4/lstat.m40000644000175000017500000000544115036447602013722 00000000000000# serial 33 # Copyright (C) 1997-2001, 2003-2022 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. dnl From Jim Meyering. AC_DEFUN([gl_FUNC_LSTAT], [ AC_REQUIRE([AC_CANONICAL_HOST]) AC_REQUIRE([gl_SYS_STAT_H_DEFAULTS]) dnl If lstat does not exist, the replacement does dnl "#define lstat stat", and lstat.c is a no-op. AC_CHECK_FUNCS_ONCE([lstat]) if test $ac_cv_func_lstat = yes; then AC_REQUIRE([gl_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK]) case $host_os,$gl_cv_func_lstat_dereferences_slashed_symlink in solaris* | *no) REPLACE_LSTAT=1 ;; esac else HAVE_LSTAT=0 fi ]) # Prerequisites of lib/lstat.c. AC_DEFUN([gl_PREREQ_LSTAT], [:]) AC_DEFUN([gl_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK], [ dnl We don't use AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK any more, because it dnl is no longer maintained in Autoconf and because it invokes AC_LIBOBJ. AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether lstat correctly handles trailing slash], [gl_cv_func_lstat_dereferences_slashed_symlink], [rm -f conftest.sym conftest.file echo >conftest.file AC_RUN_IFELSE( [AC_LANG_PROGRAM( [AC_INCLUDES_DEFAULT], [[struct stat sbuf; if (symlink ("conftest.file", "conftest.sym") != 0) return 1; /* Linux will dereference the symlink and fail, as required by POSIX. That is better in the sense that it means we will not have to compile and use the lstat wrapper. */ return lstat ("conftest.sym/", &sbuf) == 0; ]])], [gl_cv_func_lstat_dereferences_slashed_symlink=yes], [gl_cv_func_lstat_dereferences_slashed_symlink=no], [case "$host_os" in linux-* | linux) # Guess yes on Linux systems. gl_cv_func_lstat_dereferences_slashed_symlink="guessing yes" ;; *-gnu* | gnu*) # Guess yes on glibc systems. gl_cv_func_lstat_dereferences_slashed_symlink="guessing yes" ;; mingw*) # Guess no on native Windows. gl_cv_func_lstat_dereferences_slashed_symlink="guessing no" ;; *) # If we don't know, obey --enable-cross-guesses. gl_cv_func_lstat_dereferences_slashed_symlink="$gl_cross_guess_normal" ;; esac ]) rm -f conftest.sym conftest.file ]) case "$gl_cv_func_lstat_dereferences_slashed_symlink" in *yes) AC_DEFINE_UNQUOTED([LSTAT_FOLLOWS_SLASHED_SYMLINK], [1], [Define to 1 if 'lstat' dereferences a symlink specified with a trailing slash.]) ;; esac ]) grub-2.14~git20250718.0e36779/m4/mbtowc.m40000644000175000017500000000106315036447602014062 00000000000000# mbtowc.m4 serial 3 dnl Copyright (C) 2011-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_MBTOWC], [ AC_REQUIRE([gl_STDLIB_H_DEFAULTS]) AC_CHECK_FUNCS([mbtowc]) if test $ac_cv_func_mbtowc = no; then HAVE_MBTOWC=0 else if false; then REPLACE_MBTOWC=1 fi fi ]) # Prerequisites of lib/mbtowc.c. AC_DEFUN([gl_PREREQ_MBTOWC], [ : ]) grub-2.14~git20250718.0e36779/m4/mbsinit.m40000644000175000017500000000240115036447602014231 00000000000000# mbsinit.m4 serial 9 dnl Copyright (C) 2008, 2010-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_MBSINIT], [ AC_REQUIRE([gl_WCHAR_H_DEFAULTS]) AC_REQUIRE([AC_CANONICAL_HOST]) AC_REQUIRE([AC_TYPE_MBSTATE_T]) gl_MBSTATE_T_BROKEN AC_CHECK_FUNCS_ONCE([mbsinit]) if test $ac_cv_func_mbsinit = no; then HAVE_MBSINIT=0 AC_CHECK_DECLS([mbsinit],,, [[ #include ]]) if test $ac_cv_have_decl_mbsinit = yes; then dnl On Minix 3.1.8, the system's declares mbsinit() although dnl it does not have the function. Avoid a collision with gnulib's dnl replacement. REPLACE_MBSINIT=1 fi else if test $REPLACE_MBSTATE_T = 1; then REPLACE_MBSINIT=1 else dnl On mingw, mbsinit() always returns 1, which is inappropriate for dnl states produced by mbrtowc() for an incomplete multibyte character dnl in multibyte locales. case "$host_os" in mingw*) REPLACE_MBSINIT=1 ;; esac fi fi ]) # Prerequisites of lib/mbsinit.c. AC_DEFUN([gl_PREREQ_MBSINIT], [ : ]) grub-2.14~git20250718.0e36779/m4/dirfd.m40000644000175000017500000000513515036447602013663 00000000000000# serial 26 -*- Autoconf -*- dnl Find out how to get the file descriptor associated with an open DIR*. # Copyright (C) 2001-2006, 2008-2022 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. dnl From Jim Meyering AC_DEFUN([gl_FUNC_DIRFD], [ AC_REQUIRE([gl_DIRENT_H_DEFAULTS]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles dnl Persuade glibc to declare dirfd(). AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) AC_CHECK_FUNCS([dirfd]) AC_CHECK_DECLS([dirfd], , , [[#include #include ]]) if test $ac_cv_have_decl_dirfd = no; then HAVE_DECL_DIRFD=0 fi AC_CACHE_CHECK([whether dirfd is a macro], [gl_cv_func_dirfd_macro], [AC_EGREP_CPP([dirent_header_defines_dirfd], [ #include #include #ifdef dirfd dirent_header_defines_dirfd #endif], [gl_cv_func_dirfd_macro=yes], [gl_cv_func_dirfd_macro=no])]) # Use the replacement if we have no function or macro with that name, # or if OS/2 kLIBC whose dirfd() does not work. # Replace only if the system declares dirfd already. case $ac_cv_func_dirfd,$gl_cv_func_dirfd_macro,$host_os,$ac_cv_have_decl_dirfd in no,no,*,yes | *,*,os2*,yes) REPLACE_DIRFD=1 AC_DEFINE([REPLACE_DIRFD], [1], [Define to 1 if gnulib's dirfd() replacement is used.]);; esac ]) dnl Prerequisites of lib/dirfd.c. AC_DEFUN([gl_PREREQ_DIRFD], [ AC_CACHE_CHECK([how to get the file descriptor associated with an open DIR*], [gl_cv_sys_dir_fd_member_name], [ dirfd_save_CFLAGS=$CFLAGS for ac_expr in d_fd dd_fd; do CFLAGS="$CFLAGS -DDIR_FD_MEMBER_NAME=$ac_expr" AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #include #include ]], [[DIR *dir_p = opendir("."); (void) dir_p->DIR_FD_MEMBER_NAME;]])], [dir_fd_found=yes] ) CFLAGS=$dirfd_save_CFLAGS test "$dir_fd_found" = yes && break done test "$dir_fd_found" = yes || ac_expr=no_such_member gl_cv_sys_dir_fd_member_name=$ac_expr ] ) if test $gl_cv_sys_dir_fd_member_name != no_such_member; then AC_DEFINE_UNQUOTED([DIR_FD_MEMBER_NAME], [$gl_cv_sys_dir_fd_member_name], [the name of the file descriptor member of DIR]) fi AH_VERBATIM([DIR_TO_FD], [#ifdef DIR_FD_MEMBER_NAME # define DIR_TO_FD(Dir_p) ((Dir_p)->DIR_FD_MEMBER_NAME) #else # define DIR_TO_FD(Dir_p) -1 #endif ]) ]) grub-2.14~git20250718.0e36779/m4/float_h.m40000644000175000017500000000543515036447602014212 00000000000000# float_h.m4 serial 13 dnl Copyright (C) 2007, 2009-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FLOAT_H], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) GL_GENERATE_FLOAT_H=false REPLACE_FLOAT_LDBL=0 case "$host_os" in aix* | beos* | openbsd* | mirbsd* | irix*) GL_GENERATE_FLOAT_H=true ;; freebsd* | dragonfly*) case "$host_cpu" in changequote(,)dnl i[34567]86 ) changequote([,])dnl GL_GENERATE_FLOAT_H=true ;; x86_64 ) # On x86_64 systems, the C compiler may still be generating # 32-bit code. AC_COMPILE_IFELSE( [AC_LANG_SOURCE( [[#if defined __LP64__ || defined __x86_64__ || defined __amd64__ int ok; #else error fail #endif ]])], [], [GL_GENERATE_FLOAT_H=true]) ;; esac ;; linux*) case "$host_cpu" in powerpc*) GL_GENERATE_FLOAT_H=true ;; esac ;; esac case "$host_os" in aix* | freebsd* | dragonfly* | linux*) if $GL_GENERATE_FLOAT_H; then REPLACE_FLOAT_LDBL=1 fi ;; esac dnl Test against glibc-2.7 Linux/SPARC64 bug. REPLACE_ITOLD=0 AC_CACHE_CHECK([whether conversion from 'int' to 'long double' works], [gl_cv_func_itold_works], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ int i = -1; volatile long double ld; int main () { ld += i * 1.0L; if (ld > 0) return 1; return 0; }]])], [gl_cv_func_itold_works=yes], [gl_cv_func_itold_works=no], [case "$host" in sparc*-*-linux*) AC_COMPILE_IFELSE( [AC_LANG_SOURCE( [[#if defined __LP64__ || defined __arch64__ int ok; #else error fail #endif ]])], [gl_cv_func_itold_works="guessing no"], [gl_cv_func_itold_works="guessing yes"]) ;; # Guess yes on native Windows. mingw*) gl_cv_func_itold_works="guessing yes" ;; *) gl_cv_func_itold_works="guessing yes" ;; esac ]) ]) case "$gl_cv_func_itold_works" in *no) REPLACE_ITOLD=1 dnl We add the workaround to but also to , dnl to increase the chances that the fix function gets pulled in. GL_GENERATE_FLOAT_H=true ;; esac if $GL_GENERATE_FLOAT_H; then gl_NEXT_HEADERS([float.h]) fi AC_SUBST([REPLACE_ITOLD]) ]) grub-2.14~git20250718.0e36779/m4/sys_stat_h.m40000644000175000017500000001205415036447602014751 00000000000000# sys_stat_h.m4 serial 41 -*- Autoconf -*- dnl Copyright (C) 2006-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Eric Blake. dnl Provide a GNU-like . AC_DEFUN_ONCE([gl_SYS_STAT_H], [ AC_REQUIRE([gl_SYS_STAT_H_DEFAULTS]) dnl Check for broken stat macros. AC_REQUIRE([AC_HEADER_STAT]) gl_CHECK_NEXT_HEADERS([sys/stat.h]) dnl Ensure the type mode_t gets defined. AC_REQUIRE([AC_TYPE_MODE_T]) dnl Whether to enable precise timestamps in 'struct stat'. m4_ifdef([gl_WINDOWS_STAT_TIMESPEC], [ AC_REQUIRE([gl_WINDOWS_STAT_TIMESPEC]) ], [ WINDOWS_STAT_TIMESPEC=0 ]) AC_SUBST([WINDOWS_STAT_TIMESPEC]) dnl Whether to ensure that struct stat.st_size is 64-bit wide. m4_ifdef([gl_LARGEFILE], [ AC_REQUIRE([gl_LARGEFILE]) ], [ WINDOWS_64_BIT_ST_SIZE=0 ]) AC_SUBST([WINDOWS_64_BIT_ST_SIZE]) dnl Define types that are supposed to be defined in or dnl . AC_CHECK_TYPE([nlink_t], [], [AC_DEFINE([nlink_t], [int], [Define to the type of st_nlink in struct stat, or a supertype.])], [#include #include ]) dnl Check for declarations of anything we want to poison if the dnl corresponding gnulib module is not in use. gl_WARN_ON_USE_PREPARE([[#include ]], [fchmodat fstat fstatat futimens getumask lchmod lstat mkdirat mkfifo mkfifoat mknod mknodat stat utimensat]) AC_REQUIRE([AC_C_RESTRICT]) ]) # gl_SYS_STAT_MODULE_INDICATOR([modulename]) # sets the shell variable that indicates the presence of the given module # to a C preprocessor expression that will evaluate to 1. # This macro invocation must not occur in macros that are AC_REQUIREd. AC_DEFUN([gl_SYS_STAT_MODULE_INDICATOR], [ dnl Ensure to expand the default settings once only. gl_SYS_STAT_H_REQUIRE_DEFAULTS gl_MODULE_INDICATOR_SET_VARIABLE([$1]) dnl Define it also as a C macro, for the benefit of the unit tests. gl_MODULE_INDICATOR_FOR_TESTS([$1]) ]) # Initializes the default values for AC_SUBSTed shell variables. # This macro must not be AC_REQUIREd. It must only be invoked, and only # outside of macros or in macros that are not AC_REQUIREd. AC_DEFUN([gl_SYS_STAT_H_REQUIRE_DEFAULTS], [ m4_defun(GL_MODULE_INDICATOR_PREFIX[_SYS_STAT_H_MODULE_INDICATOR_DEFAULTS], [ gl_UNISTD_H_REQUIRE_DEFAULTS dnl for REPLACE_FCHDIR gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FCHMODAT]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FSTAT]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FSTATAT]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FUTIMENS]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GETUMASK]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LCHMOD]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_LSTAT]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MKDIR]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MKDIRAT]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MKFIFO]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MKFIFOAT]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MKNOD]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MKNODAT]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STAT]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_UTIMENSAT]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_OVERRIDES_STRUCT_STAT]) dnl Support Microsoft deprecated alias function names by default. gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_CHMOD], [1]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_MKDIR], [1]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_UMASK], [1]) ]) m4_require(GL_MODULE_INDICATOR_PREFIX[_SYS_STAT_H_MODULE_INDICATOR_DEFAULTS]) AC_REQUIRE([gl_SYS_STAT_H_DEFAULTS]) ]) AC_DEFUN([gl_SYS_STAT_H_DEFAULTS], [ dnl Assume proper GNU behavior unless another module says otherwise. HAVE_FCHMODAT=1; AC_SUBST([HAVE_FCHMODAT]) HAVE_FSTATAT=1; AC_SUBST([HAVE_FSTATAT]) HAVE_FUTIMENS=1; AC_SUBST([HAVE_FUTIMENS]) HAVE_GETUMASK=1; AC_SUBST([HAVE_GETUMASK]) HAVE_LCHMOD=1; AC_SUBST([HAVE_LCHMOD]) HAVE_LSTAT=1; AC_SUBST([HAVE_LSTAT]) HAVE_MKDIRAT=1; AC_SUBST([HAVE_MKDIRAT]) HAVE_MKFIFO=1; AC_SUBST([HAVE_MKFIFO]) HAVE_MKFIFOAT=1; AC_SUBST([HAVE_MKFIFOAT]) HAVE_MKNOD=1; AC_SUBST([HAVE_MKNOD]) HAVE_MKNODAT=1; AC_SUBST([HAVE_MKNODAT]) HAVE_UTIMENSAT=1; AC_SUBST([HAVE_UTIMENSAT]) REPLACE_FCHMODAT=0; AC_SUBST([REPLACE_FCHMODAT]) REPLACE_FSTAT=0; AC_SUBST([REPLACE_FSTAT]) REPLACE_FSTATAT=0; AC_SUBST([REPLACE_FSTATAT]) REPLACE_FUTIMENS=0; AC_SUBST([REPLACE_FUTIMENS]) REPLACE_LSTAT=0; AC_SUBST([REPLACE_LSTAT]) REPLACE_MKDIR=0; AC_SUBST([REPLACE_MKDIR]) REPLACE_MKFIFO=0; AC_SUBST([REPLACE_MKFIFO]) REPLACE_MKFIFOAT=0; AC_SUBST([REPLACE_MKFIFOAT]) REPLACE_MKNOD=0; AC_SUBST([REPLACE_MKNOD]) REPLACE_MKNODAT=0; AC_SUBST([REPLACE_MKNODAT]) REPLACE_STAT=0; AC_SUBST([REPLACE_STAT]) REPLACE_UTIMENSAT=0; AC_SUBST([REPLACE_UTIMENSAT]) ]) grub-2.14~git20250718.0e36779/m4/dup2.m40000644000175000017500000000723615036447602013451 00000000000000#serial 27 dnl Copyright (C) 2002, 2005, 2007, 2009-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_DUP2], [ AC_REQUIRE([gl_UNISTD_H_DEFAULTS]) AC_REQUIRE([AC_CANONICAL_HOST]) AC_CACHE_CHECK([whether dup2 works], [gl_cv_func_dup2_works], [AC_RUN_IFELSE([ AC_LANG_PROGRAM( [[#include #include #include #include #include ]GL_MDA_DEFINES[ #ifndef RLIM_SAVED_CUR # define RLIM_SAVED_CUR RLIM_INFINITY #endif #ifndef RLIM_SAVED_MAX # define RLIM_SAVED_MAX RLIM_INFINITY #endif ]], [[int result = 0; int bad_fd = INT_MAX; struct rlimit rlim; if (getrlimit (RLIMIT_NOFILE, &rlim) == 0 && 0 <= rlim.rlim_cur && rlim.rlim_cur <= INT_MAX && rlim.rlim_cur != RLIM_INFINITY && rlim.rlim_cur != RLIM_SAVED_MAX && rlim.rlim_cur != RLIM_SAVED_CUR) bad_fd = rlim.rlim_cur; #ifdef FD_CLOEXEC if (fcntl (1, F_SETFD, FD_CLOEXEC) == -1) result |= 1; #endif if (dup2 (1, 1) != 1) result |= 2; #ifdef FD_CLOEXEC if (fcntl (1, F_GETFD) != FD_CLOEXEC) result |= 4; #endif close (0); if (dup2 (0, 0) != -1) result |= 8; /* Many gnulib modules require POSIX conformance of EBADF. */ if (dup2 (2, bad_fd) == -1 && errno != EBADF) result |= 16; /* Flush out some cygwin core dumps. */ if (dup2 (2, -1) != -1 || errno != EBADF) result |= 32; dup2 (2, 255); dup2 (2, 256); /* On OS/2 kLIBC, dup2() does not work on a directory fd. */ { int fd = open (".", O_RDONLY); if (fd == -1) result |= 64; else if (dup2 (fd, fd + 1) == -1) result |= 128; close (fd); } return result;]]) ], [gl_cv_func_dup2_works=yes], [gl_cv_func_dup2_works=no], [case "$host_os" in mingw*) # on this platform, dup2 always returns 0 for success gl_cv_func_dup2_works="guessing no" ;; cygwin*) # on cygwin 1.5.x, dup2(1,1) returns 0 gl_cv_func_dup2_works="guessing no" ;; aix* | freebsd*) # on AIX 7.1 and FreeBSD 6.1, dup2 (1,toobig) gives EMFILE, # not EBADF. gl_cv_func_dup2_works="guessing no" ;; haiku*) # on Haiku alpha 2, dup2(1, 1) resets FD_CLOEXEC. gl_cv_func_dup2_works="guessing no" ;; *-android*) # implemented using dup3(), which fails if oldfd == newfd gl_cv_func_dup2_works="guessing no" ;; os2*) # on OS/2 kLIBC, dup2() does not work on a directory fd. gl_cv_func_dup2_works="guessing no" ;; *) gl_cv_func_dup2_works="guessing yes" ;; esac]) ]) case "$gl_cv_func_dup2_works" in *yes) ;; *) REPLACE_DUP2=1 AC_CHECK_FUNCS([setdtablesize]) ;; esac dnl Replace dup2() for supporting the gnulib-defined fchdir() function, dnl to keep fchdir's bookkeeping up-to-date. m4_ifdef([gl_FUNC_FCHDIR], [ gl_TEST_FCHDIR if test $HAVE_FCHDIR = 0; then REPLACE_DUP2=1 fi ]) ]) # Prerequisites of lib/dup2.c. AC_DEFUN([gl_PREREQ_DUP2], []) grub-2.14~git20250718.0e36779/m4/wint_t.m40000644000175000017500000000343315036447602014076 00000000000000# wint_t.m4 serial 11 dnl Copyright (C) 2003, 2007-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. dnl Test whether has the 'wint_t' type and whether gnulib's dnl or would, if present, override 'wint_t'. dnl Prerequisite: AC_PROG_CC AC_DEFUN([gt_TYPE_WINT_T], [ AC_CACHE_CHECK([for wint_t], [gt_cv_c_wint_t], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#include wint_t foo = (wchar_t)'\0';]], [[]])], [gt_cv_c_wint_t=yes], [gt_cv_c_wint_t=no])]) if test $gt_cv_c_wint_t = yes; then AC_DEFINE([HAVE_WINT_T], [1], [Define if you have the 'wint_t' type.]) dnl Determine whether gnulib's or would, if present, dnl override 'wint_t'. AC_CACHE_CHECK([whether wint_t is large enough], [gl_cv_type_wint_t_large_enough], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#include int verify[sizeof (wint_t) < sizeof (int) ? -1 : 1]; ]])], [gl_cv_type_wint_t_large_enough=yes], [gl_cv_type_wint_t_large_enough=no])]) if test $gl_cv_type_wint_t_large_enough = no; then GNULIBHEADERS_OVERRIDE_WINT_T=1 else GNULIBHEADERS_OVERRIDE_WINT_T=0 fi else GNULIBHEADERS_OVERRIDE_WINT_T=0 fi AC_SUBST([GNULIBHEADERS_OVERRIDE_WINT_T]) ]) dnl Prerequisites of the 'wint_t' override. AC_DEFUN([gl_TYPE_WINT_T_PREREQ], [ AC_CHECK_HEADERS_ONCE([crtdefs.h]) if test $ac_cv_header_crtdefs_h = yes; then HAVE_CRTDEFS_H=1 else HAVE_CRTDEFS_H=0 fi AC_SUBST([HAVE_CRTDEFS_H]) ]) grub-2.14~git20250718.0e36779/m4/fnmatch_h.m40000644000175000017500000000564415036447602014527 00000000000000# fnmatch_h.m4 serial 8 dnl Copyright (C) 2009-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. AC_DEFUN_ONCE([gl_FNMATCH_H], [ AC_REQUIRE([gl_FNMATCH_H_DEFAULTS]) m4_ifdef([gl_ANSI_CXX], [AC_REQUIRE([gl_ANSI_CXX])]) AC_CHECK_HEADERS_ONCE([fnmatch.h]) gl_CHECK_NEXT_HEADERS([fnmatch.h]) dnl Persuade glibc to declare FNM_CASEFOLD etc. dnl This is only needed if gl_fnmatch_required = GNU. It would be possible dnl to avoid this dependency for gl_FUNC_FNMATCH_POSIX by putting dnl gl_FUNC_FNMATCH_GNU into a separate .m4 file. AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) if test $ac_cv_header_fnmatch_h = yes; then HAVE_FNMATCH_H=1 else HAVE_FNMATCH_H=0 fi AC_SUBST([HAVE_FNMATCH_H]) m4_ifdef([gl_POSIXCHECK], [GL_GENERATE_FNMATCH_H=true], [GL_GENERATE_FNMATCH_H=false if m4_ifdef([gl_ANSI_CXX], [test "$CXX" != no], [false]); then dnl Override always, to support the C++ GNULIB_NAMESPACE. GL_GENERATE_FNMATCH_H=true else if test $ac_cv_header_fnmatch_h != yes; then dnl Provide a substitute file. GL_GENERATE_FNMATCH_H=true fi fi ]) dnl Check for declarations of anything we want to poison if the dnl corresponding gnulib module is not in use. gl_WARN_ON_USE_PREPARE([[#include ]], [fnmatch]) ]) dnl Unconditionally enables the replacement of . AC_DEFUN([gl_REPLACE_FNMATCH_H], [ gl_FNMATCH_H_REQUIRE_DEFAULTS GL_GENERATE_FNMATCH_H=true ]) # gl_FNMATCH_MODULE_INDICATOR([modulename]) # sets the shell variable that indicates the presence of the given module # to a C preprocessor expression that will evaluate to 1. # This macro invocation must not occur in macros that are AC_REQUIREd. AC_DEFUN([gl_FNMATCH_MODULE_INDICATOR], [ dnl Ensure to expand the default settings once only. gl_FNMATCH_H_REQUIRE_DEFAULTS gl_MODULE_INDICATOR_SET_VARIABLE([$1]) dnl Define it also as a C macro, for the benefit of the unit tests. gl_MODULE_INDICATOR_FOR_TESTS([$1]) ]) # Initializes the default values for AC_SUBSTed shell variables. # This macro must not be AC_REQUIREd. It must only be invoked, and only # outside of macros or in macros that are not AC_REQUIREd. AC_DEFUN([gl_FNMATCH_H_REQUIRE_DEFAULTS], [ m4_defun(GL_MODULE_INDICATOR_PREFIX[_FNMATCH_H_MODULE_INDICATOR_DEFAULTS], [ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FNMATCH]) ]) m4_require(GL_MODULE_INDICATOR_PREFIX[_FNMATCH_H_MODULE_INDICATOR_DEFAULTS]) AC_REQUIRE([gl_FNMATCH_H_DEFAULTS]) ]) AC_DEFUN([gl_FNMATCH_H_DEFAULTS], [ dnl Assume POSIX behavior unless another module says otherwise. HAVE_FNMATCH=1; AC_SUBST([HAVE_FNMATCH]) REPLACE_FNMATCH=0; AC_SUBST([REPLACE_FNMATCH]) ]) grub-2.14~git20250718.0e36779/m4/getprogname.m40000644000175000017500000000263315036447602015103 00000000000000# getprogname.m4 - check for getprogname or replacements for it # Copyright (C) 2016-2022 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 4 AC_DEFUN([gl_FUNC_GETPROGNAME], [ AC_CHECK_FUNCS_ONCE([getprogname getexecname]) AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) ac_found=0 AC_CHECK_DECLS([program_invocation_name], [ac_found=1], [], [#include ]) AC_CHECK_DECLS([program_invocation_short_name], [ac_found=1], [], [#include ]) AC_CHECK_DECLS([__argv], [ac_found=1], [], [#include ]) # Incur the cost of this test only if none of the above worked. if test $ac_found = 0; then # On OpenBSD 5.1, using the global __progname variable appears to be # the only way to implement getprogname. AC_CACHE_CHECK([whether __progname is defined in default libraries], [gl_cv_var___progname], [ gl_cv_var___progname= AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[extern char *__progname;]], [[return *__progname;]] )], [gl_cv_var___progname=yes] ) ] ) if test "$gl_cv_var___progname" = yes; then AC_DEFINE([HAVE_VAR___PROGNAME], 1, [Define if you have a global __progname variable]) fi fi ]) grub-2.14~git20250718.0e36779/m4/lcmessage.m40000644000175000017500000000253315036447570014541 00000000000000# lcmessage.m4 serial 7 (gettext-0.18.2) dnl Copyright (C) 1995-2002, 2004-2005, 2008-2013 Free Software Foundation, dnl Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1995. # Check whether LC_MESSAGES is available in . AC_DEFUN([gt_LC_MESSAGES], [ AC_CACHE_CHECK([for LC_MESSAGES], [gt_cv_val_LC_MESSAGES], [AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[#include ]], [[return LC_MESSAGES]])], [gt_cv_val_LC_MESSAGES=yes], [gt_cv_val_LC_MESSAGES=no])]) if test $gt_cv_val_LC_MESSAGES = yes; then AC_DEFINE([HAVE_LC_MESSAGES], [1], [Define if your file defines LC_MESSAGES.]) fi ]) grub-2.14~git20250718.0e36779/m4/pathmax.m40000644000175000017500000000215515036447602014234 00000000000000# pathmax.m4 serial 11 dnl Copyright (C) 2002-2003, 2005-2006, 2009-2022 Free Software Foundation, dnl Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_PATHMAX], [ dnl Prerequisites of lib/pathmax.h. AC_CHECK_HEADERS_ONCE([sys/param.h]) ]) # Expands to a piece of C program that defines PATH_MAX in the same way as # "pathmax.h" will do. AC_DEFUN([gl_PATHMAX_SNIPPET], [[ /* Arrange to define PATH_MAX, like "pathmax.h" does. */ #if HAVE_UNISTD_H # include #endif #include #if defined HAVE_SYS_PARAM_H && !defined PATH_MAX && !defined MAXPATHLEN # include #endif #if !defined PATH_MAX && defined MAXPATHLEN # define PATH_MAX MAXPATHLEN #endif #ifdef __hpux # undef PATH_MAX # define PATH_MAX 1024 #endif #if defined _WIN32 && ! defined __CYGWIN__ # undef PATH_MAX # define PATH_MAX 260 #endif ]]) # Prerequisites of gl_PATHMAX_SNIPPET. AC_DEFUN([gl_PATHMAX_SNIPPET_PREREQ], [ AC_CHECK_HEADERS_ONCE([unistd.h sys/param.h]) ]) grub-2.14~git20250718.0e36779/m4/ssize_t.m40000644000175000017500000000146315036447602014253 00000000000000# ssize_t.m4 serial 5 (gettext-0.18.2) dnl Copyright (C) 2001-2003, 2006, 2010-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. dnl Test whether ssize_t is defined. AC_DEFUN([gt_TYPE_SSIZE_T], [ AC_CACHE_CHECK([for ssize_t], [gt_cv_ssize_t], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#include ]], [[int x = sizeof (ssize_t *) + sizeof (ssize_t); return !x;]])], [gt_cv_ssize_t=yes], [gt_cv_ssize_t=no])]) if test $gt_cv_ssize_t = no; then AC_DEFINE([ssize_t], [int], [Define as a signed type of the same size as size_t.]) fi ]) grub-2.14~git20250718.0e36779/m4/stdio_h.m40000644000175000017500000002540515036447602014226 00000000000000# stdio_h.m4 serial 59 dnl Copyright (C) 2007-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN_ONCE([gl_STDIO_H], [ AC_REQUIRE([gl_STDIO_H_DEFAULTS]) AH_VERBATIM([MINGW_ANSI_STDIO], [/* Use GNU style printf and scanf. */ #ifndef __USE_MINGW_ANSI_STDIO # undef __USE_MINGW_ANSI_STDIO #endif ]) AC_DEFINE([__USE_MINGW_ANSI_STDIO]) gl_NEXT_HEADERS([stdio.h]) dnl Determine whether __USE_MINGW_ANSI_STDIO makes printf and dnl inttypes.h behave like gnu instead of system; we must give our dnl printf wrapper the right attribute to match. AC_CACHE_CHECK([which flavor of printf attribute matches inttypes macros], [gl_cv_func_printf_attribute_flavor], [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #define __STDC_FORMAT_MACROS 1 #include #include /* For non-mingw systems, compilation will trivially succeed. For mingw, compilation will succeed for older mingw (system printf, "I64d") and fail for newer mingw (gnu printf, "lld"). */ #if (defined _WIN32 && ! defined __CYGWIN__) && \ (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)) extern char PRIdMAX_probe[sizeof PRIdMAX == sizeof "I64d" ? 1 : -1]; #endif ]])], [gl_cv_func_printf_attribute_flavor=system], [gl_cv_func_printf_attribute_flavor=gnu])]) if test "$gl_cv_func_printf_attribute_flavor" = gnu; then AC_DEFINE([GNULIB_PRINTF_ATTRIBUTE_FLAVOR_GNU], [1], [Define to 1 if printf and friends should be labeled with attribute "__gnu_printf__" instead of "__printf__"]) fi dnl This ifdef is an optimization, to avoid performing a configure check whose dnl result is not used. But it does not make the test of dnl GNULIB_STDIO_H_NONBLOCKING or GNULIB_NONBLOCKING redundant. m4_ifdef([gl_NONBLOCKING_IO], [ gl_NONBLOCKING_IO if test $gl_cv_have_nonblocking != yes; then REPLACE_STDIO_READ_FUNCS=1 fi ]) dnl This ifdef is an optimization, to avoid performing a configure check whose dnl result is not used. But it does not make the test of dnl GNULIB_STDIO_H_SIGPIPE or GNULIB_SIGPIPE redundant. m4_ifdef([gl_SIGNAL_SIGPIPE], [ gl_SIGNAL_SIGPIPE if test $gl_cv_header_signal_h_SIGPIPE != yes; then REPLACE_STDIO_WRITE_FUNCS=1 fi ]) dnl This ifdef is an optimization, to avoid performing a configure check whose dnl result is not used. But it does not make the test of dnl GNULIB_STDIO_H_NONBLOCKING or GNULIB_NONBLOCKING redundant. m4_ifdef([gl_NONBLOCKING_IO], [ gl_NONBLOCKING_IO if test $gl_cv_have_nonblocking != yes; then REPLACE_STDIO_WRITE_FUNCS=1 fi ]) dnl Check for declarations of anything we want to poison if the dnl corresponding gnulib module is not in use, and which is not dnl guaranteed by both C89 and C11. gl_WARN_ON_USE_PREPARE([[#include ]], [dprintf fpurge fseeko ftello getdelim getline gets pclose popen renameat snprintf tmpfile vdprintf vsnprintf]) AC_REQUIRE([AC_C_RESTRICT]) AC_CHECK_DECLS_ONCE([fcloseall]) if test $ac_cv_have_decl_fcloseall = no; then HAVE_DECL_FCLOSEALL=0 fi ]) # gl_STDIO_MODULE_INDICATOR([modulename]) # sets the shell variable that indicates the presence of the given module # to a C preprocessor expression that will evaluate to 1. # This macro invocation must not occur in macros that are AC_REQUIREd. AC_DEFUN([gl_STDIO_MODULE_INDICATOR], [ dnl Ensure to expand the default settings once only. gl_STDIO_H_REQUIRE_DEFAULTS gl_MODULE_INDICATOR_SET_VARIABLE([$1]) dnl Define it also as a C macro, for the benefit of the unit tests. gl_MODULE_INDICATOR_FOR_TESTS([$1]) ]) # Initializes the default values for AC_SUBSTed shell variables. # This macro must not be AC_REQUIREd. It must only be invoked, and only # outside of macros or in macros that are not AC_REQUIREd. AC_DEFUN([gl_STDIO_H_REQUIRE_DEFAULTS], [ m4_defun(GL_MODULE_INDICATOR_PREFIX[_STDIO_H_MODULE_INDICATOR_DEFAULTS], [ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_DPRINTF]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FCLOSE]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FDOPEN]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FFLUSH]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FGETC]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FGETS]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FOPEN]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FOPEN_GNU]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FPRINTF]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FPRINTF_POSIX]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FPURGE]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FPUTC]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FPUTS]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FREAD]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FREOPEN]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FSCANF]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FSEEK]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FSEEKO]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FTELL]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FTELLO]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FWRITE]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GETC]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GETCHAR]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GETDELIM]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_GETLINE]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_OBSTACK_PRINTF]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_OBSTACK_PRINTF_POSIX]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_PCLOSE]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_PERROR]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_POPEN]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_PRINTF]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_PRINTF_POSIX]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_PUTC]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_PUTCHAR]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_PUTS]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_REMOVE]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_RENAME]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_RENAMEAT]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SCANF]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SNPRINTF]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SPRINTF_POSIX]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STDIO_H_NONBLOCKING]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STDIO_H_SIGPIPE]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_TMPFILE]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_VASPRINTF]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_VFSCANF]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_VSCANF]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_VDPRINTF]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_VFPRINTF]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_VFPRINTF_POSIX]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_VPRINTF]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_VPRINTF_POSIX]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_VSNPRINTF]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_VSPRINTF_POSIX]) dnl Support Microsoft deprecated alias function names by default. gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_FCLOSEALL], [1]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_FDOPEN], [1]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_FILENO], [1]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_GETW], [1]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_PUTW], [1]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_TEMPNAM], [1]) ]) m4_require(GL_MODULE_INDICATOR_PREFIX[_STDIO_H_MODULE_INDICATOR_DEFAULTS]) AC_REQUIRE([gl_STDIO_H_DEFAULTS]) ]) AC_DEFUN([gl_STDIO_H_DEFAULTS], [ dnl Assume proper GNU behavior unless another module says otherwise. HAVE_DECL_FCLOSEALL=1; AC_SUBST([HAVE_DECL_FCLOSEALL]) HAVE_DECL_FPURGE=1; AC_SUBST([HAVE_DECL_FPURGE]) HAVE_DECL_FSEEKO=1; AC_SUBST([HAVE_DECL_FSEEKO]) HAVE_DECL_FTELLO=1; AC_SUBST([HAVE_DECL_FTELLO]) HAVE_DECL_GETDELIM=1; AC_SUBST([HAVE_DECL_GETDELIM]) HAVE_DECL_GETLINE=1; AC_SUBST([HAVE_DECL_GETLINE]) HAVE_DECL_OBSTACK_PRINTF=1; AC_SUBST([HAVE_DECL_OBSTACK_PRINTF]) HAVE_DECL_SNPRINTF=1; AC_SUBST([HAVE_DECL_SNPRINTF]) HAVE_DECL_VSNPRINTF=1; AC_SUBST([HAVE_DECL_VSNPRINTF]) HAVE_DPRINTF=1; AC_SUBST([HAVE_DPRINTF]) HAVE_FSEEKO=1; AC_SUBST([HAVE_FSEEKO]) HAVE_FTELLO=1; AC_SUBST([HAVE_FTELLO]) HAVE_PCLOSE=1; AC_SUBST([HAVE_PCLOSE]) HAVE_POPEN=1; AC_SUBST([HAVE_POPEN]) HAVE_RENAMEAT=1; AC_SUBST([HAVE_RENAMEAT]) HAVE_VASPRINTF=1; AC_SUBST([HAVE_VASPRINTF]) HAVE_VDPRINTF=1; AC_SUBST([HAVE_VDPRINTF]) REPLACE_DPRINTF=0; AC_SUBST([REPLACE_DPRINTF]) REPLACE_FCLOSE=0; AC_SUBST([REPLACE_FCLOSE]) REPLACE_FDOPEN=0; AC_SUBST([REPLACE_FDOPEN]) REPLACE_FFLUSH=0; AC_SUBST([REPLACE_FFLUSH]) REPLACE_FOPEN=0; AC_SUBST([REPLACE_FOPEN]) REPLACE_FOPEN_FOR_FOPEN_GNU=0; AC_SUBST([REPLACE_FOPEN_FOR_FOPEN_GNU]) REPLACE_FPRINTF=0; AC_SUBST([REPLACE_FPRINTF]) REPLACE_FPURGE=0; AC_SUBST([REPLACE_FPURGE]) REPLACE_FREOPEN=0; AC_SUBST([REPLACE_FREOPEN]) REPLACE_FSEEK=0; AC_SUBST([REPLACE_FSEEK]) REPLACE_FSEEKO=0; AC_SUBST([REPLACE_FSEEKO]) REPLACE_FTELL=0; AC_SUBST([REPLACE_FTELL]) REPLACE_FTELLO=0; AC_SUBST([REPLACE_FTELLO]) REPLACE_GETDELIM=0; AC_SUBST([REPLACE_GETDELIM]) REPLACE_GETLINE=0; AC_SUBST([REPLACE_GETLINE]) REPLACE_OBSTACK_PRINTF=0; AC_SUBST([REPLACE_OBSTACK_PRINTF]) REPLACE_PERROR=0; AC_SUBST([REPLACE_PERROR]) REPLACE_POPEN=0; AC_SUBST([REPLACE_POPEN]) REPLACE_PRINTF=0; AC_SUBST([REPLACE_PRINTF]) REPLACE_REMOVE=0; AC_SUBST([REPLACE_REMOVE]) REPLACE_RENAME=0; AC_SUBST([REPLACE_RENAME]) REPLACE_RENAMEAT=0; AC_SUBST([REPLACE_RENAMEAT]) REPLACE_SNPRINTF=0; AC_SUBST([REPLACE_SNPRINTF]) REPLACE_SPRINTF=0; AC_SUBST([REPLACE_SPRINTF]) REPLACE_STDIO_READ_FUNCS=0; AC_SUBST([REPLACE_STDIO_READ_FUNCS]) REPLACE_STDIO_WRITE_FUNCS=0; AC_SUBST([REPLACE_STDIO_WRITE_FUNCS]) REPLACE_TMPFILE=0; AC_SUBST([REPLACE_TMPFILE]) REPLACE_VASPRINTF=0; AC_SUBST([REPLACE_VASPRINTF]) REPLACE_VDPRINTF=0; AC_SUBST([REPLACE_VDPRINTF]) REPLACE_VFPRINTF=0; AC_SUBST([REPLACE_VFPRINTF]) REPLACE_VPRINTF=0; AC_SUBST([REPLACE_VPRINTF]) REPLACE_VSNPRINTF=0; AC_SUBST([REPLACE_VSNPRINTF]) REPLACE_VSPRINTF=0; AC_SUBST([REPLACE_VSPRINTF]) ]) grub-2.14~git20250718.0e36779/m4/intmax.m40000644000175000017500000000214315036447570014073 00000000000000# intmax.m4 serial 6 (gettext-0.18.2) dnl Copyright (C) 2002-2005, 2008-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. dnl Test whether the system has the 'intmax_t' type, but don't attempt to dnl find a replacement if it is lacking. AC_DEFUN([gt_TYPE_INTMAX_T], [ AC_REQUIRE([gl_AC_HEADER_INTTYPES_H]) AC_REQUIRE([gl_AC_HEADER_STDINT_H]) AC_CACHE_CHECK([for intmax_t], [gt_cv_c_intmax_t], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[ #include #include #if HAVE_STDINT_H_WITH_UINTMAX #include #endif #if HAVE_INTTYPES_H_WITH_UINTMAX #include #endif ]], [[intmax_t x = -1; return !x;]])], [gt_cv_c_intmax_t=yes], [gt_cv_c_intmax_t=no])]) if test $gt_cv_c_intmax_t = yes; then AC_DEFINE([HAVE_INTMAX_T], [1], [Define if you have the 'intmax_t' type in or .]) fi ]) grub-2.14~git20250718.0e36779/m4/inttypes-pri.m40000644000175000017500000000234515036447570015246 00000000000000# inttypes-pri.m4 serial 7 (gettext-0.18.2) dnl Copyright (C) 1997-2002, 2006, 2008-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. AC_PREREQ([2.53]) # Define PRI_MACROS_BROKEN if exists and defines the PRI* # macros to non-string values. This is the case on AIX 4.3.3. AC_DEFUN([gt_INTTYPES_PRI], [ AC_CHECK_HEADERS([inttypes.h]) if test $ac_cv_header_inttypes_h = yes; then AC_CACHE_CHECK([whether the inttypes.h PRIxNN macros are broken], [gt_cv_inttypes_pri_broken], [ AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[ #include #ifdef PRId32 char *p = PRId32; #endif ]], [[]])], [gt_cv_inttypes_pri_broken=no], [gt_cv_inttypes_pri_broken=yes]) ]) fi if test "$gt_cv_inttypes_pri_broken" = yes; then AC_DEFINE_UNQUOTED([PRI_MACROS_BROKEN], [1], [Define if exists and defines unusable PRI* macros.]) PRI_MACROS_BROKEN=1 else PRI_MACROS_BROKEN=0 fi AC_SUBST([PRI_MACROS_BROKEN]) ]) grub-2.14~git20250718.0e36779/m4/open-slash.m40000644000175000017500000000345515036447602014647 00000000000000# open-slash.m4 serial 2 dnl Copyright (C) 2007-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl Tests whether open() and creat() recognize a trailing slash. dnl Sets gl_cv_func_open_slash. AC_DEFUN([gl_OPEN_TRAILING_SLASH_BUG], [ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles dnl open("foo/") should not create a file when the file name has a dnl trailing slash. FreeBSD only has the problem on symlinks. AC_CHECK_FUNCS_ONCE([lstat]) AC_CACHE_CHECK([whether open recognizes a trailing slash], [gl_cv_func_open_slash], [# Assume that if we have lstat, we can also check symlinks. if test $ac_cv_func_lstat = yes; then touch conftest.tmp ln -s conftest.tmp conftest.lnk fi AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #if HAVE_UNISTD_H # include #endif ]GL_MDA_DEFINES[ int main () { int result = 0; #if HAVE_LSTAT if (open ("conftest.lnk/", O_RDONLY) != -1) result |= 1; #endif if (open ("conftest.sl/", O_CREAT, 0600) >= 0) result |= 2; return result; }]])], [gl_cv_func_open_slash=yes], [gl_cv_func_open_slash=no], [ changequote(,)dnl case "$host_os" in freebsd* | aix* | hpux* | solaris2.[0-9] | solaris2.[0-9].*) gl_cv_func_open_slash="guessing no" ;; *) gl_cv_func_open_slash="guessing yes" ;; esac changequote([,])dnl ]) rm -f conftest.sl conftest.tmp conftest.lnk ]) case "$gl_cv_func_open_slash" in *no) AC_DEFINE([OPEN_TRAILING_SLASH_BUG], [1], [Define to 1 if open() fails to recognize a trailing slash.]) ;; esac ]) grub-2.14~git20250718.0e36779/m4/00gnulib.m40000644000175000017500000000701115036447602014206 00000000000000# 00gnulib.m4 serial 8 dnl Copyright (C) 2009-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl This file must be named something that sorts before all other dnl gnulib-provided .m4 files. It is needed until the clang fix has dnl been included in Autoconf. # The following definitions arrange to use a compiler option # -Werror=implicit-function-declaration in AC_CHECK_DECL, when the # compiler is clang. Without it, clang implicitly declares "known" # library functions in C mode, but not in C++ mode, which would cause # Gnulib to omit a declaration and thus later produce an error in C++ # mode. As of clang 9.0, these "known" functions are identified through # LIBBUILTIN invocations in the LLVM source file # llvm/tools/clang/include/clang/Basic/Builtins.def. # It's not possible to AC_REQUIRE the extra tests from AC_CHECK_DECL, # because AC_CHECK_DECL, like other Autoconf built-ins, is not supposed # to AC_REQUIRE anything: some configure.ac files have their first # AC_CHECK_DECL executed conditionally. Therefore append the extra tests # to AC_PROG_CC. AC_DEFUN([gl_COMPILER_CLANG], [ dnl AC_REQUIRE([AC_PROG_CC]) AC_CACHE_CHECK([whether the compiler is clang], [gl_cv_compiler_clang], [dnl Use _AC_COMPILE_IFELSE instead of AC_EGREP_CPP, to avoid error dnl "circular dependency of AC_LANG_COMPILER(C)" if AC_PROG_CC has dnl not yet been invoked. _AC_COMPILE_IFELSE( [AC_LANG_PROGRAM([[ #ifdef __clang__ barfbarf #endif ]],[[]]) ], [gl_cv_compiler_clang=no], [gl_cv_compiler_clang=yes]) ]) ]) AC_DEFUN([gl_COMPILER_PREPARE_CHECK_DECL], [ dnl AC_REQUIRE([AC_PROG_CC]) dnl AC_REQUIRE([gl_COMPILER_CLANG]) AC_CACHE_CHECK([for compiler option needed when checking for declarations], [gl_cv_compiler_check_decl_option], [if test $gl_cv_compiler_clang = yes; then dnl Test whether the compiler supports the option dnl '-Werror=implicit-function-declaration'. save_ac_compile="$ac_compile" ac_compile="$ac_compile -Werror=implicit-function-declaration" dnl Use _AC_COMPILE_IFELSE instead of AC_COMPILE_IFELSE, to avoid a dnl warning "AC_COMPILE_IFELSE was called before AC_USE_SYSTEM_EXTENSIONS". _AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]],[[]])], [gl_cv_compiler_check_decl_option='-Werror=implicit-function-declaration'], [gl_cv_compiler_check_decl_option=none]) ac_compile="$save_ac_compile" else gl_cv_compiler_check_decl_option=none fi ]) if test "x$gl_cv_compiler_check_decl_option" != xnone; then ac_compile_for_check_decl="$ac_compile $gl_cv_compiler_check_decl_option" else ac_compile_for_check_decl="$ac_compile" fi ]) dnl Redefine _AC_CHECK_DECL_BODY so that it references ac_compile_for_check_decl dnl instead of ac_compile. If, for whatever reason, the override of AC_PROG_CC dnl in zzgnulib.m4 is inactive, use the original ac_compile. m4_define([_AC_CHECK_DECL_BODY], [ ac_save_ac_compile="$ac_compile" if test -n "$ac_compile_for_check_decl"; then ac_compile="$ac_compile_for_check_decl" fi] m4_defn([_AC_CHECK_DECL_BODY])[ ac_compile="$ac_save_ac_compile" ]) # gl_00GNULIB # ----------- # Witness macro that this file has been included. Needed to force # Automake to include this file prior to all other gnulib .m4 files. AC_DEFUN([gl_00GNULIB]) grub-2.14~git20250718.0e36779/m4/mbrtowc.m40000644000175000017500000005564615036447602014264 00000000000000# mbrtowc.m4 serial 38 -*- coding: utf-8 -*- dnl Copyright (C) 2001-2002, 2004-2005, 2008-2022 Free Software Foundation, dnl Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_MBRTOWC], [ AC_REQUIRE([gl_WCHAR_H_DEFAULTS]) AC_REQUIRE([gl_PTHREADLIB]) AC_CHECK_HEADERS_ONCE([threads.h]) AC_REQUIRE([AC_TYPE_MBSTATE_T]) gl_MBSTATE_T_BROKEN AC_CHECK_FUNCS_ONCE([mbrtowc]) if test $ac_cv_func_mbrtowc = no; then HAVE_MBRTOWC=0 AC_CHECK_DECLS([mbrtowc],,, [[ #include ]]) if test $ac_cv_have_decl_mbrtowc = yes; then dnl On Minix 3.1.8, the system's declares mbrtowc() although dnl it does not have the function. Avoid a collision with gnulib's dnl replacement. REPLACE_MBRTOWC=1 fi else if test $REPLACE_MBSTATE_T = 1; then REPLACE_MBRTOWC=1 else gl_MBRTOWC_NULL_ARG1 gl_MBRTOWC_NULL_ARG2 gl_MBRTOWC_RETVAL gl_MBRTOWC_NUL_RETVAL gl_MBRTOWC_STORES_INCOMPLETE gl_MBRTOWC_EMPTY_INPUT gl_MBRTOWC_C_LOCALE case "$gl_cv_func_mbrtowc_null_arg1" in *yes) ;; *) AC_DEFINE([MBRTOWC_NULL_ARG1_BUG], [1], [Define if the mbrtowc function has the NULL pwc argument bug.]) REPLACE_MBRTOWC=1 ;; esac case "$gl_cv_func_mbrtowc_null_arg2" in *yes) ;; *) AC_DEFINE([MBRTOWC_NULL_ARG2_BUG], [1], [Define if the mbrtowc function has the NULL string argument bug.]) REPLACE_MBRTOWC=1 ;; esac case "$gl_cv_func_mbrtowc_retval" in *yes) ;; *) AC_DEFINE([MBRTOWC_RETVAL_BUG], [1], [Define if the mbrtowc function returns a wrong return value.]) REPLACE_MBRTOWC=1 ;; esac case "$gl_cv_func_mbrtowc_nul_retval" in *yes) ;; *) AC_DEFINE([MBRTOWC_NUL_RETVAL_BUG], [1], [Define if the mbrtowc function does not return 0 for a NUL character.]) REPLACE_MBRTOWC=1 ;; esac case "$gl_cv_func_mbrtowc_stores_incomplete" in *no) ;; *) AC_DEFINE([MBRTOWC_STORES_INCOMPLETE_BUG], [1], [Define if the mbrtowc function stores a wide character when reporting incomplete input.]) REPLACE_MBRTOWC=1 ;; esac case "$gl_cv_func_mbrtowc_empty_input" in *yes) ;; *) AC_DEFINE([MBRTOWC_EMPTY_INPUT_BUG], [1], [Define if the mbrtowc function does not return (size_t) -2 for empty input.]) REPLACE_MBRTOWC=1 ;; esac case "$gl_cv_func_mbrtowc_C_locale_sans_EILSEQ" in *yes) ;; *) AC_DEFINE([MBRTOWC_IN_C_LOCALE_MAYBE_EILSEQ], [1], [Define if the mbrtowc function may signal encoding errors in the C locale.]) REPLACE_MBRTOWC=1 ;; esac fi fi if test $REPLACE_MBSTATE_T = 1; then case "$host_os" in mingw*) LIB_MBRTOWC= ;; *) gl_WEAK_SYMBOLS case "$gl_cv_have_weak" in *yes) LIB_MBRTOWC= ;; *) LIB_MBRTOWC="$LIBPTHREAD" ;; esac ;; esac else LIB_MBRTOWC= fi dnl LIB_MBRTOWC is expected to be '-pthread' or '-lpthread' on AIX dnl with gcc or xlc, and empty otherwise. AC_SUBST([LIB_MBRTOWC]) ]) dnl Test whether mbsinit() and mbrtowc() need to be overridden in a way that dnl redefines the semantics of the given mbstate_t type. dnl Result is REPLACE_MBSTATE_T. dnl When this is set to 1, we replace both mbsinit() and mbrtowc(), in order to dnl avoid inconsistencies. AC_DEFUN([gl_MBSTATE_T_BROKEN], [ AC_REQUIRE([gl_WCHAR_H_DEFAULTS]) AC_REQUIRE([AC_CANONICAL_HOST]) AC_REQUIRE([AC_TYPE_MBSTATE_T]) AC_CHECK_FUNCS_ONCE([mbsinit]) AC_CHECK_FUNCS_ONCE([mbrtowc]) dnl On native Windows, we know exactly how mbsinit() behaves and don't need dnl to override it, even if - like on MSVC - mbsinit() is only defined as dnl an inline function, not as a global function. if case "$host_os" in mingw*) true ;; *) test $ac_cv_func_mbsinit = yes ;; esac \ && test $ac_cv_func_mbrtowc = yes; then gl_MBRTOWC_INCOMPLETE_STATE gl_MBRTOWC_SANITYCHECK REPLACE_MBSTATE_T=0 case "$gl_cv_func_mbrtowc_incomplete_state" in *yes) ;; *) REPLACE_MBSTATE_T=1 ;; esac case "$gl_cv_func_mbrtowc_sanitycheck" in *yes) ;; *) REPLACE_MBSTATE_T=1 ;; esac else REPLACE_MBSTATE_T=1 fi ]) dnl Test whether mbrtowc puts the state into non-initial state when parsing an dnl incomplete multibyte character. dnl Result is gl_cv_func_mbrtowc_incomplete_state. AC_DEFUN([gl_MBRTOWC_INCOMPLETE_STATE], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([gt_LOCALE_JA]) AC_REQUIRE([gt_LOCALE_FR_UTF8]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether mbrtowc handles incomplete characters], [gl_cv_func_mbrtowc_incomplete_state], [ dnl Initial guess, used when cross-compiling or when no suitable locale dnl is present. changequote(,)dnl case "$host_os" in # Guess no on AIX and OSF/1. aix* | osf*) gl_cv_func_mbrtowc_incomplete_state="guessing no" ;; # Guess yes otherwise. *) gl_cv_func_mbrtowc_incomplete_state="guessing yes" ;; esac changequote([,])dnl if test $LOCALE_JA != none; then AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include #include int main () { if (setlocale (LC_ALL, "$LOCALE_JA") != NULL) { const char input[] = "B\217\253\344\217\251\316er"; /* "Büßer" */ mbstate_t state; wchar_t wc; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2)) if (mbsinit (&state)) return 2; } return 0; }]])], [gl_cv_func_mbrtowc_incomplete_state=yes], [gl_cv_func_mbrtowc_incomplete_state=no], [:]) else if test $LOCALE_FR_UTF8 != none; then AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include #include int main () { if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL) { const char input[] = "B\303\274\303\237er"; /* "Büßer" */ mbstate_t state; wchar_t wc; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2)) if (mbsinit (&state)) return 2; } return 0; }]])], [gl_cv_func_mbrtowc_incomplete_state=yes], [gl_cv_func_mbrtowc_incomplete_state=no], [:]) fi fi ]) ]) dnl Test whether mbrtowc works not worse than mbtowc. dnl Result is gl_cv_func_mbrtowc_sanitycheck. AC_DEFUN([gl_MBRTOWC_SANITYCHECK], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([gt_LOCALE_ZH_CN]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether mbrtowc works as well as mbtowc], [gl_cv_func_mbrtowc_sanitycheck], [ dnl Initial guess, used when cross-compiling or when no suitable locale dnl is present. changequote(,)dnl case "$host_os" in # Guess no on Solaris 8. solaris2.8) gl_cv_func_mbrtowc_sanitycheck="guessing no" ;; # Guess yes otherwise. *) gl_cv_func_mbrtowc_sanitycheck="guessing yes" ;; esac changequote([,])dnl if test $LOCALE_ZH_CN != none; then AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include #include #include int main () { /* This fails on Solaris 8: mbrtowc returns 2, and sets wc to 0x00F0. mbtowc returns 4 (correct) and sets wc to 0x5EDC. */ if (setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL) { char input[] = "B\250\271\201\060\211\070er"; /* "Büßer" */ mbstate_t state; wchar_t wc; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (&wc, input + 3, 6, &state) != 4 && mbtowc (&wc, input + 3, 6) == 4) return 2; } return 0; }]])], [gl_cv_func_mbrtowc_sanitycheck=yes], [gl_cv_func_mbrtowc_sanitycheck=no], [:]) fi ]) ]) dnl Test whether mbrtowc supports a NULL pwc argument correctly. dnl Result is gl_cv_func_mbrtowc_null_arg1. AC_DEFUN([gl_MBRTOWC_NULL_ARG1], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([gt_LOCALE_FR_UTF8]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether mbrtowc handles a NULL pwc argument], [gl_cv_func_mbrtowc_null_arg1], [ dnl Initial guess, used when cross-compiling or when no suitable locale dnl is present. changequote(,)dnl case "$host_os" in # Guess no on Solaris. solaris*) gl_cv_func_mbrtowc_null_arg1="guessing no" ;; # Guess yes otherwise. *) gl_cv_func_mbrtowc_null_arg1="guessing yes" ;; esac changequote([,])dnl if test $LOCALE_FR_UTF8 != none; then AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include #include #include int main () { int result = 0; if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL) { char input[] = "\303\237er"; mbstate_t state; wchar_t wc; size_t ret; memset (&state, '\0', sizeof (mbstate_t)); wc = (wchar_t) 0xBADFACE; ret = mbrtowc (&wc, input, 5, &state); if (ret != 2) result |= 1; if (!mbsinit (&state)) result |= 2; memset (&state, '\0', sizeof (mbstate_t)); ret = mbrtowc (NULL, input, 5, &state); if (ret != 2) /* Solaris 7 fails here: ret is -1. */ result |= 4; if (!mbsinit (&state)) result |= 8; } return result; }]])], [gl_cv_func_mbrtowc_null_arg1=yes], [gl_cv_func_mbrtowc_null_arg1=no], [:]) fi ]) ]) dnl Test whether mbrtowc supports a NULL string argument correctly. dnl Result is gl_cv_func_mbrtowc_null_arg2. AC_DEFUN([gl_MBRTOWC_NULL_ARG2], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([gt_LOCALE_FR_UTF8]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether mbrtowc handles a NULL string argument], [gl_cv_func_mbrtowc_null_arg2], [ dnl Initial guess, used when cross-compiling or when no suitable locale dnl is present. changequote(,)dnl case "$host_os" in # Guess no on OSF/1. osf*) gl_cv_func_mbrtowc_null_arg2="guessing no" ;; # Guess yes otherwise. *) gl_cv_func_mbrtowc_null_arg2="guessing yes" ;; esac changequote([,])dnl if test $LOCALE_FR_UTF8 != none; then AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include #include int main () { if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL) { mbstate_t state; wchar_t wc; int ret; memset (&state, '\0', sizeof (mbstate_t)); wc = (wchar_t) 0xBADFACE; mbrtowc (&wc, NULL, 5, &state); /* Check that wc was not modified. */ if (wc != (wchar_t) 0xBADFACE) return 2; } return 0; }]])], [gl_cv_func_mbrtowc_null_arg2=yes], [gl_cv_func_mbrtowc_null_arg2=no], [:]) fi ]) ]) dnl Test whether mbrtowc, when parsing the end of a multibyte character, dnl correctly returns the number of bytes that were needed to complete the dnl character (not the total number of bytes of the multibyte character). dnl Result is gl_cv_func_mbrtowc_retval. AC_DEFUN([gl_MBRTOWC_RETVAL], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([gt_LOCALE_FR_UTF8]) AC_REQUIRE([gt_LOCALE_JA]) AC_REQUIRE([AC_CANONICAL_HOST]) AC_CACHE_CHECK([whether mbrtowc has a correct return value], [gl_cv_func_mbrtowc_retval], [ dnl Initial guess, used when cross-compiling or when no suitable locale dnl is present. changequote(,)dnl case "$host_os" in # Guess no on HP-UX, Solaris, native Windows. hpux* | solaris* | mingw*) gl_cv_func_mbrtowc_retval="guessing no" ;; # Guess yes otherwise. *) gl_cv_func_mbrtowc_retval="guessing yes" ;; esac changequote([,])dnl if test $LOCALE_FR_UTF8 != none || test $LOCALE_JA != none \ || { case "$host_os" in mingw*) true;; *) false;; esac; }; then AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include #include int main () { int result = 0; int found_some_locale = 0; /* This fails on Solaris. */ if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL) { char input[] = "B\303\274\303\237er"; /* "Büßer" */ mbstate_t state; wchar_t wc; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2)) { input[1] = '\0'; if (mbrtowc (&wc, input + 2, 5, &state) != 1) result |= 1; } found_some_locale = 1; } /* This fails on HP-UX 11.11. */ if (setlocale (LC_ALL, "$LOCALE_JA") != NULL) { char input[] = "B\217\253\344\217\251\316er"; /* "Büßer" */ mbstate_t state; wchar_t wc; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2)) { input[1] = '\0'; if (mbrtowc (&wc, input + 2, 5, &state) != 2) result |= 2; } found_some_locale = 1; } /* This fails on native Windows. */ if (setlocale (LC_ALL, "Japanese_Japan.932") != NULL) { char input[] = "<\223\372\226\173\214\352>"; /* "<日本語>" */ mbstate_t state; wchar_t wc; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (&wc, input + 3, 1, &state) == (size_t)(-2)) { input[3] = '\0'; if (mbrtowc (&wc, input + 4, 4, &state) != 1) result |= 4; } found_some_locale = 1; } if (setlocale (LC_ALL, "Chinese_Taiwan.950") != NULL) { char input[] = "<\244\351\245\273\273\171>"; /* "<日本語>" */ mbstate_t state; wchar_t wc; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (&wc, input + 3, 1, &state) == (size_t)(-2)) { input[3] = '\0'; if (mbrtowc (&wc, input + 4, 4, &state) != 1) result |= 8; } found_some_locale = 1; } if (setlocale (LC_ALL, "Chinese_China.936") != NULL) { char input[] = "<\310\325\261\276\325\132>"; /* "<日本語>" */ mbstate_t state; wchar_t wc; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (&wc, input + 3, 1, &state) == (size_t)(-2)) { input[3] = '\0'; if (mbrtowc (&wc, input + 4, 4, &state) != 1) result |= 16; } found_some_locale = 1; } return (found_some_locale ? result : 77); }]])], [gl_cv_func_mbrtowc_retval=yes], [if test $? != 77; then gl_cv_func_mbrtowc_retval=no fi ], [:]) fi ]) ]) dnl Test whether mbrtowc, when parsing a NUL character, correctly returns 0. dnl Result is gl_cv_func_mbrtowc_nul_retval. AC_DEFUN([gl_MBRTOWC_NUL_RETVAL], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([gt_LOCALE_ZH_CN]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether mbrtowc returns 0 when parsing a NUL character], [gl_cv_func_mbrtowc_nul_retval], [ dnl Initial guess, used when cross-compiling or when no suitable locale dnl is present. changequote(,)dnl case "$host_os" in # Guess no on Solaris 8 and 9. solaris2.[89]) gl_cv_func_mbrtowc_nul_retval="guessing no" ;; # Guess yes otherwise. *) gl_cv_func_mbrtowc_nul_retval="guessing yes" ;; esac changequote([,])dnl if test $LOCALE_ZH_CN != none; then AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include #include int main () { /* This fails on Solaris 8 and 9. */ if (setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL) { mbstate_t state; wchar_t wc; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (&wc, "", 1, &state) != 0) return 2; } return 0; }]])], [gl_cv_func_mbrtowc_nul_retval=yes], [gl_cv_func_mbrtowc_nul_retval=no], [:]) fi ]) ]) dnl Test whether mbrtowc stores a wide character when reporting incomplete dnl input. AC_DEFUN([gl_MBRTOWC_STORES_INCOMPLETE], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether mbrtowc stores incomplete characters], [gl_cv_func_mbrtowc_stores_incomplete], [ dnl Initial guess, used when cross-compiling or when no suitable locale dnl is present. changequote(,)dnl case "$host_os" in # Guess yes on native Windows. mingw*) gl_cv_func_mbrtowc_stores_incomplete="guessing yes" ;; *) gl_cv_func_mbrtowc_stores_incomplete="guessing no" ;; esac changequote([,])dnl case "$host_os" in mingw*) AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include #include int main () { int result = 0; if (setlocale (LC_ALL, "French_France.65001") != NULL) { wchar_t wc = (wchar_t) 0xBADFACE; mbstate_t state; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (&wc, "\303", 1, &state) == (size_t)(-2) && wc != (wchar_t) 0xBADFACE) result |= 1; } if (setlocale (LC_ALL, "Japanese_Japan.932") != NULL) { wchar_t wc = (wchar_t) 0xBADFACE; mbstate_t state; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (&wc, "\226", 1, &state) == (size_t)(-2) && wc != (wchar_t) 0xBADFACE) result |= 2; } if (setlocale (LC_ALL, "Chinese_Taiwan.950") != NULL) { wchar_t wc = (wchar_t) 0xBADFACE; mbstate_t state; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (&wc, "\245", 1, &state) == (size_t)(-2) && wc != (wchar_t) 0xBADFACE) result |= 4; } if (setlocale (LC_ALL, "Chinese_China.936") != NULL) { wchar_t wc = (wchar_t) 0xBADFACE; mbstate_t state; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (&wc, "\261", 1, &state) == (size_t)(-2) && wc != (wchar_t) 0xBADFACE) result |= 8; } return result; }]])], [gl_cv_func_mbrtowc_stores_incomplete=no], [gl_cv_func_mbrtowc_stores_incomplete=yes], [:]) ;; *) AC_REQUIRE([gt_LOCALE_FR_UTF8]) if test $LOCALE_FR_UTF8 != none; then AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include #include int main () { if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL) { wchar_t wc = (wchar_t) 0xBADFACE; mbstate_t state; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (&wc, "\303", 1, &state) == (size_t)(-2) && wc != (wchar_t) 0xBADFACE) return 1; } return 0; }]])], [gl_cv_func_mbrtowc_stores_incomplete=no], [gl_cv_func_mbrtowc_stores_incomplete=yes], [:]) fi ;; esac ]) ]) dnl Test whether mbrtowc returns the correct value on empty input. AC_DEFUN([gl_MBRTOWC_EMPTY_INPUT], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether mbrtowc works on empty input], [gl_cv_func_mbrtowc_empty_input], [ dnl Initial guess, used when cross-compiling or when no suitable locale dnl is present. changequote(,)dnl case "$host_os" in # Guess no on AIX and glibc systems. aix* | *-gnu* | gnu*) gl_cv_func_mbrtowc_empty_input="guessing no" ;; # Guess yes on native Windows. mingw*) gl_cv_func_mbrtowc_empty_input="guessing yes" ;; *) gl_cv_func_mbrtowc_empty_input="guessing yes" ;; esac changequote([,])dnl AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include static wchar_t wc; static mbstate_t mbs; int main (void) { return mbrtowc (&wc, "", 0, &mbs) != (size_t) -2; }]])], [gl_cv_func_mbrtowc_empty_input=yes], [gl_cv_func_mbrtowc_empty_input=no], [:]) ]) ]) dnl Test whether mbrtowc reports encoding errors in the C locale. dnl Although POSIX was never intended to allow this, the GNU C Library dnl and other implementations do it. See: dnl https://sourceware.org/bugzilla/show_bug.cgi?id=19932 AC_DEFUN([gl_MBRTOWC_C_LOCALE], [ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether the C locale is free of encoding errors], [gl_cv_func_mbrtowc_C_locale_sans_EILSEQ], [ dnl Initial guess, used when cross-compiling or when no suitable locale dnl is present. gl_cv_func_mbrtowc_C_locale_sans_EILSEQ="$gl_cross_guess_normal" AC_RUN_IFELSE( [AC_LANG_PROGRAM( [[#include #include #include ]], [[ int i; char *locale = setlocale (LC_ALL, "C"); if (! locale) return 2; for (i = CHAR_MIN; i <= CHAR_MAX; i++) { char c = i; wchar_t wc; mbstate_t mbs = { 0, }; size_t ss = mbrtowc (&wc, &c, 1, &mbs); if (1 < ss) return 3; } return 0; ]])], [gl_cv_func_mbrtowc_C_locale_sans_EILSEQ=yes], [gl_cv_func_mbrtowc_C_locale_sans_EILSEQ=no], [case "$host_os" in # Guess yes on native Windows. mingw*) gl_cv_func_mbrtowc_C_locale_sans_EILSEQ="guessing yes" ;; esac ]) ]) ]) # Prerequisites of lib/mbrtowc.c and lib/lc-charset-dispatch.c. AC_DEFUN([gl_PREREQ_MBRTOWC], [ AC_REQUIRE([AC_C_INLINE]) : ]) # Prerequisites of lib/mbtowc-lock.c. AC_DEFUN([gl_PREREQ_MBTOWC_LOCK], [ gl_VISIBILITY ]) dnl From Paul Eggert dnl This is an override of an autoconf macro. AC_DEFUN([AC_FUNC_MBRTOWC], [ dnl Same as AC_FUNC_MBRTOWC in autoconf-2.60. AC_CACHE_CHECK([whether mbrtowc and mbstate_t are properly declared], [gl_cv_func_mbrtowc], [AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[#include ]], [[wchar_t wc; char const s[] = ""; size_t n = 1; mbstate_t state; return ! (sizeof state && (mbrtowc) (&wc, s, n, &state));]])], [gl_cv_func_mbrtowc=yes], [gl_cv_func_mbrtowc=no])]) if test $gl_cv_func_mbrtowc = yes; then AC_DEFINE([HAVE_MBRTOWC], [1], [Define to 1 if mbrtowc and mbstate_t are properly declared.]) fi ]) grub-2.14~git20250718.0e36779/m4/lib-ld.m40000644000175000017500000000714315036447570013743 00000000000000# lib-ld.m4 serial 6 dnl Copyright (C) 1996-2003, 2009-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl Subroutines of libtool.m4, dnl with replacements s/_*LT_PATH/AC_LIB_PROG/ and s/lt_/acl_/ to avoid dnl collision with libtool.m4. dnl From libtool-2.4. Sets the variable with_gnu_ld to yes or no. AC_DEFUN([AC_LIB_PROG_LD_GNU], [AC_CACHE_CHECK([if the linker ($LD) is GNU ld], [acl_cv_prog_gnu_ld], [# I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 /dev/null 2>&1 \ && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \ || PATH_SEPARATOR=';' } fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by $CC]) case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [[\\/]]* | ?:[[\\/]]*) re_direlt='/[[^/]][[^/]]*/\.\./' # Canonicalize the pathname of ld ac_prog=`echo "$ac_prog"| sed 's%\\\\%/%g'` while echo "$ac_prog" | grep "$re_direlt" > /dev/null 2>&1; do ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi AC_CACHE_VAL([acl_cv_path_LD], [if test -z "$LD"; then acl_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$acl_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then acl_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$acl_cv_path_LD" -v 2>&1 has the 'wchar_t' type. dnl Prerequisite: AC_PROG_CC AC_DEFUN([gt_TYPE_WCHAR_T], [ AC_CACHE_CHECK([for wchar_t], [gt_cv_c_wchar_t], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#include wchar_t foo = (wchar_t)'\0';]], [[]])], [gt_cv_c_wchar_t=yes], [gt_cv_c_wchar_t=no])]) if test $gt_cv_c_wchar_t = yes; then AC_DEFINE([HAVE_WCHAR_T], [1], [Define if you have the 'wchar_t' type.]) fi ]) grub-2.14~git20250718.0e36779/m4/gnulib-common.m40000644000175000017500000012107615036447602015344 00000000000000# gnulib-common.m4 serial 72 dnl Copyright (C) 2007-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_PREREQ([2.62]) # gl_COMMON # is expanded unconditionally through gnulib-tool magic. AC_DEFUN([gl_COMMON], [ dnl Use AC_REQUIRE here, so that the code is expanded once only. AC_REQUIRE([gl_00GNULIB]) AC_REQUIRE([gl_COMMON_BODY]) AC_REQUIRE([gl_ZZGNULIB]) ]) AC_DEFUN([gl_COMMON_BODY], [ AH_VERBATIM([_GL_GNUC_PREREQ], [/* True if the compiler says it groks GNU C version MAJOR.MINOR. */ #if defined __GNUC__ && defined __GNUC_MINOR__ # define _GL_GNUC_PREREQ(major, minor) \ ((major) < __GNUC__ + ((minor) <= __GNUC_MINOR__)) #else # define _GL_GNUC_PREREQ(major, minor) 0 #endif ]) AH_VERBATIM([_Noreturn], [/* The _Noreturn keyword of C11. */ #ifndef _Noreturn # if (defined __cplusplus \ && ((201103 <= __cplusplus && !(__GNUC__ == 4 && __GNUC_MINOR__ == 7)) \ || (defined _MSC_VER && 1900 <= _MSC_VER)) \ && 0) /* [[noreturn]] is not practically usable, because with it the syntax extern _Noreturn void func (...); would not be valid; such a declaration would only be valid with 'extern' and '_Noreturn' swapped, or without the 'extern' keyword. However, some AIX system header files and several gnulib header files use precisely this syntax with 'extern'. */ # define _Noreturn [[noreturn]] # elif ((!defined __cplusplus || defined __clang__) \ && (201112 <= (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0) \ || (!defined __STRICT_ANSI__ \ && (_GL_GNUC_PREREQ (4, 7) \ || (defined __apple_build_version__ \ ? 6000000 <= __apple_build_version__ \ : 3 < __clang_major__ + (5 <= __clang_minor__)))))) /* _Noreturn works as-is. */ # elif _GL_GNUC_PREREQ (2, 8) || defined __clang__ || 0x5110 <= __SUNPRO_C # define _Noreturn __attribute__ ((__noreturn__)) # elif 1200 <= (defined _MSC_VER ? _MSC_VER : 0) # define _Noreturn __declspec (noreturn) # else # define _Noreturn # endif #endif ]) AH_VERBATIM([isoc99_inline], [/* Work around a bug in Apple GCC 4.0.1 build 5465: In C99 mode, it supports the ISO C 99 semantics of 'extern inline' (unlike the GNU C semantics of earlier versions), but does not display it by setting __GNUC_STDC_INLINE__. __APPLE__ && __MACH__ test for Mac OS X. __APPLE_CC__ tests for the Apple compiler and its version. __STDC_VERSION__ tests for the C99 mode. */ #if defined __APPLE__ && defined __MACH__ && __APPLE_CC__ >= 5465 && !defined __cplusplus && __STDC_VERSION__ >= 199901L && !defined __GNUC_STDC_INLINE__ # define __GNUC_STDC_INLINE__ 1 #endif]) AH_VERBATIM([attribute], [/* Attributes. */ #if (defined __has_attribute \ && (!defined __clang_minor__ \ || 3 < __clang_major__ + (5 <= __clang_minor__))) # define _GL_HAS_ATTRIBUTE(attr) __has_attribute (__##attr##__) #else # define _GL_HAS_ATTRIBUTE(attr) _GL_ATTR_##attr # define _GL_ATTR_alloc_size _GL_GNUC_PREREQ (4, 3) # define _GL_ATTR_always_inline _GL_GNUC_PREREQ (3, 2) # define _GL_ATTR_artificial _GL_GNUC_PREREQ (4, 3) # define _GL_ATTR_cold _GL_GNUC_PREREQ (4, 3) # define _GL_ATTR_const _GL_GNUC_PREREQ (2, 95) # define _GL_ATTR_deprecated _GL_GNUC_PREREQ (3, 1) # define _GL_ATTR_diagnose_if 0 # define _GL_ATTR_error _GL_GNUC_PREREQ (4, 3) # define _GL_ATTR_externally_visible _GL_GNUC_PREREQ (4, 1) # define _GL_ATTR_fallthrough _GL_GNUC_PREREQ (7, 0) # define _GL_ATTR_format _GL_GNUC_PREREQ (2, 7) # define _GL_ATTR_leaf _GL_GNUC_PREREQ (4, 6) # define _GL_ATTR_malloc _GL_GNUC_PREREQ (3, 0) # ifdef _ICC # define _GL_ATTR_may_alias 0 # else # define _GL_ATTR_may_alias _GL_GNUC_PREREQ (3, 3) # endif # define _GL_ATTR_noinline _GL_GNUC_PREREQ (3, 1) # define _GL_ATTR_nonnull _GL_GNUC_PREREQ (3, 3) # define _GL_ATTR_nonstring _GL_GNUC_PREREQ (8, 0) # define _GL_ATTR_nothrow _GL_GNUC_PREREQ (3, 3) # define _GL_ATTR_packed _GL_GNUC_PREREQ (2, 7) # define _GL_ATTR_pure _GL_GNUC_PREREQ (2, 96) # define _GL_ATTR_returns_nonnull _GL_GNUC_PREREQ (4, 9) # define _GL_ATTR_sentinel _GL_GNUC_PREREQ (4, 0) # define _GL_ATTR_unused _GL_GNUC_PREREQ (2, 7) # define _GL_ATTR_warn_unused_result _GL_GNUC_PREREQ (3, 4) #endif #ifdef __has_c_attribute # define _GL_HAS_C_ATTRIBUTE(attr) __has_c_attribute (__##attr##__) #else # define _GL_HAS_C_ATTRIBUTE(attr) 0 #endif ]dnl There is no _GL_ATTRIBUTE_ALIGNED; use stdalign's _Alignas instead. [ /* _GL_ATTRIBUTE_ALLOC_SIZE ((N)) declares that the Nth argument of the function is the size of the returned memory block. _GL_ATTRIBUTE_ALLOC_SIZE ((M, N)) declares that the Mth argument multiplied by the Nth argument of the function is the size of the returned memory block. */ /* Applies to: function, pointer to function, function types. */ #if _GL_HAS_ATTRIBUTE (alloc_size) # define _GL_ATTRIBUTE_ALLOC_SIZE(args) __attribute__ ((__alloc_size__ args)) #else # define _GL_ATTRIBUTE_ALLOC_SIZE(args) #endif /* _GL_ATTRIBUTE_ALWAYS_INLINE tells that the compiler should always inline the function and report an error if it cannot do so. */ /* Applies to: function. */ #if _GL_HAS_ATTRIBUTE (always_inline) # define _GL_ATTRIBUTE_ALWAYS_INLINE __attribute__ ((__always_inline__)) #else # define _GL_ATTRIBUTE_ALWAYS_INLINE #endif /* _GL_ATTRIBUTE_ARTIFICIAL declares that the function is not important to show in stack traces when debugging. The compiler should omit the function from stack traces. */ /* Applies to: function. */ #if _GL_HAS_ATTRIBUTE (artificial) # define _GL_ATTRIBUTE_ARTIFICIAL __attribute__ ((__artificial__)) #else # define _GL_ATTRIBUTE_ARTIFICIAL #endif /* _GL_ATTRIBUTE_COLD declares that the function is rarely executed. */ /* Applies to: functions. */ /* Avoid __attribute__ ((cold)) on MinGW; see thread starting at . Also, Oracle Studio 12.6 requires 'cold' not '__cold__'. */ #if _GL_HAS_ATTRIBUTE (cold) && !defined __MINGW32__ # ifndef __SUNPRO_C # define _GL_ATTRIBUTE_COLD __attribute__ ((__cold__)) # else # define _GL_ATTRIBUTE_COLD __attribute__ ((cold)) # endif #else # define _GL_ATTRIBUTE_COLD #endif /* _GL_ATTRIBUTE_CONST declares that it is OK for a compiler to omit duplicate calls to the function with the same arguments. This attribute is safe for a function that neither depends on nor affects observable state, and always returns exactly once - e.g., does not loop forever, and does not call longjmp. (This attribute is stricter than _GL_ATTRIBUTE_PURE.) */ /* Applies to: functions. */ #if _GL_HAS_ATTRIBUTE (const) # define _GL_ATTRIBUTE_CONST __attribute__ ((__const__)) #else # define _GL_ATTRIBUTE_CONST #endif /* _GL_ATTRIBUTE_DEALLOC (F, I) declares that the function returns pointers that can be freed by passing them as the Ith argument to the function F. _GL_ATTRIBUTE_DEALLOC_FREE declares that the function returns pointers that can be freed via 'free'; it can be used only after declaring 'free'. */ /* Applies to: functions. Cannot be used on inline functions. */ #if _GL_GNUC_PREREQ (11, 0) # define _GL_ATTRIBUTE_DEALLOC(f, i) __attribute__ ((__malloc__ (f, i))) #else # define _GL_ATTRIBUTE_DEALLOC(f, i) #endif /* If gnulib's or has already defined this macro, continue to use this earlier definition, since may not have been included yet. */ #ifndef _GL_ATTRIBUTE_DEALLOC_FREE # define _GL_ATTRIBUTE_DEALLOC_FREE _GL_ATTRIBUTE_DEALLOC (free, 1) #endif /* _GL_ATTRIBUTE_DEPRECATED: Declares that an entity is deprecated. The compiler may warn if the entity is used. */ /* Applies to: - function, variable, - struct, union, struct/union member, - enumeration, enumeration item, - typedef, in C++ also: namespace, class, template specialization. */ #if _GL_HAS_C_ATTRIBUTE (deprecated) # define _GL_ATTRIBUTE_DEPRECATED [[__deprecated__]] #elif _GL_HAS_ATTRIBUTE (deprecated) # define _GL_ATTRIBUTE_DEPRECATED __attribute__ ((__deprecated__)) #else # define _GL_ATTRIBUTE_DEPRECATED #endif /* _GL_ATTRIBUTE_ERROR(msg) requests an error if a function is called and the function call is not optimized away. _GL_ATTRIBUTE_WARNING(msg) requests a warning if a function is called and the function call is not optimized away. */ /* Applies to: functions. */ #if _GL_HAS_ATTRIBUTE (error) # define _GL_ATTRIBUTE_ERROR(msg) __attribute__ ((__error__ (msg))) # define _GL_ATTRIBUTE_WARNING(msg) __attribute__ ((__warning__ (msg))) #elif _GL_HAS_ATTRIBUTE (diagnose_if) # define _GL_ATTRIBUTE_ERROR(msg) __attribute__ ((__diagnose_if__ (1, msg, "error"))) # define _GL_ATTRIBUTE_WARNING(msg) __attribute__ ((__diagnose_if__ (1, msg, "warning"))) #else # define _GL_ATTRIBUTE_ERROR(msg) # define _GL_ATTRIBUTE_WARNING(msg) #endif /* _GL_ATTRIBUTE_EXTERNALLY_VISIBLE declares that the entity should remain visible to debuggers etc., even with '-fwhole-program'. */ /* Applies to: functions, variables. */ #if _GL_HAS_ATTRIBUTE (externally_visible) # define _GL_ATTRIBUTE_EXTERNALLY_VISIBLE __attribute__ ((externally_visible)) #else # define _GL_ATTRIBUTE_EXTERNALLY_VISIBLE #endif /* _GL_ATTRIBUTE_FALLTHROUGH declares that it is not a programming mistake if the control flow falls through to the immediately following 'case' or 'default' label. The compiler should not warn in this case. */ /* Applies to: Empty statement (;), inside a 'switch' statement. */ /* Always expands to something. */ #if _GL_HAS_C_ATTRIBUTE (fallthrough) # define _GL_ATTRIBUTE_FALLTHROUGH [[__fallthrough__]] #elif _GL_HAS_ATTRIBUTE (fallthrough) # define _GL_ATTRIBUTE_FALLTHROUGH __attribute__ ((__fallthrough__)) #else # define _GL_ATTRIBUTE_FALLTHROUGH ((void) 0) #endif /* _GL_ATTRIBUTE_FORMAT ((ARCHETYPE, STRING-INDEX, FIRST-TO-CHECK)) declares that the STRING-INDEXth function argument is a format string of style ARCHETYPE, which is one of: printf, gnu_printf scanf, gnu_scanf, strftime, gnu_strftime, strfmon, or the same thing prefixed and suffixed with '__'. If FIRST-TO-CHECK is not 0, arguments starting at FIRST-TO_CHECK are suitable for the format string. */ /* Applies to: functions. */ #if _GL_HAS_ATTRIBUTE (format) # define _GL_ATTRIBUTE_FORMAT(spec) __attribute__ ((__format__ spec)) #else # define _GL_ATTRIBUTE_FORMAT(spec) #endif /* _GL_ATTRIBUTE_LEAF declares that if the function is called from some other compilation unit, it executes code from that unit only by return or by exception handling. This declaration lets the compiler optimize that unit more aggressively. */ /* Applies to: functions. */ #if _GL_HAS_ATTRIBUTE (leaf) # define _GL_ATTRIBUTE_LEAF __attribute__ ((__leaf__)) #else # define _GL_ATTRIBUTE_LEAF #endif /* _GL_ATTRIBUTE_MALLOC declares that the function returns a pointer to freshly allocated memory. */ /* Applies to: functions. */ #if _GL_HAS_ATTRIBUTE (malloc) # define _GL_ATTRIBUTE_MALLOC __attribute__ ((__malloc__)) #else # define _GL_ATTRIBUTE_MALLOC #endif /* _GL_ATTRIBUTE_MAY_ALIAS declares that pointers to the type may point to the same storage as pointers to other types. Thus this declaration disables strict aliasing optimization. */ /* Applies to: types. */ /* Oracle Studio 12.6 mishandles may_alias despite __has_attribute OK. */ #if _GL_HAS_ATTRIBUTE (may_alias) && !defined __SUNPRO_C # define _GL_ATTRIBUTE_MAY_ALIAS __attribute__ ((__may_alias__)) #else # define _GL_ATTRIBUTE_MAY_ALIAS #endif /* _GL_ATTRIBUTE_MAYBE_UNUSED declares that it is not a programming mistake if the entity is not used. The compiler should not warn if the entity is not used. */ /* Applies to: - function, variable, - struct, union, struct/union member, - enumeration, enumeration item, - typedef, in C++ also: class. */ /* In C++ and C2x, this is spelled [[__maybe_unused__]]. GCC's syntax is __attribute__ ((__unused__)). clang supports both syntaxes. */ #if _GL_HAS_C_ATTRIBUTE (maybe_unused) # define _GL_ATTRIBUTE_MAYBE_UNUSED [[__maybe_unused__]] #else # define _GL_ATTRIBUTE_MAYBE_UNUSED _GL_ATTRIBUTE_UNUSED #endif /* Alternative spelling of this macro, for convenience. */ #define _GL_UNUSED _GL_ATTRIBUTE_MAYBE_UNUSED /* Earlier spellings of this macro. */ #define _UNUSED_PARAMETER_ _GL_ATTRIBUTE_MAYBE_UNUSED /* _GL_ATTRIBUTE_NODISCARD declares that the caller of the function should not discard the return value. The compiler may warn if the caller does not use the return value, unless the caller uses something like ignore_value. */ /* Applies to: function, enumeration, class. */ #if _GL_HAS_C_ATTRIBUTE (nodiscard) # define _GL_ATTRIBUTE_NODISCARD [[__nodiscard__]] #elif _GL_HAS_ATTRIBUTE (warn_unused_result) # define _GL_ATTRIBUTE_NODISCARD __attribute__ ((__warn_unused_result__)) #else # define _GL_ATTRIBUTE_NODISCARD #endif /* _GL_ATTRIBUTE_NOINLINE tells that the compiler should not inline the function. */ /* Applies to: functions. */ #if _GL_HAS_ATTRIBUTE (noinline) # define _GL_ATTRIBUTE_NOINLINE __attribute__ ((__noinline__)) #else # define _GL_ATTRIBUTE_NOINLINE #endif /* _GL_ATTRIBUTE_NONNULL ((N1, N2,...)) declares that the arguments N1, N2,... must not be NULL. _GL_ATTRIBUTE_NONNULL () declares that all pointer arguments must not be null. */ /* Applies to: functions. */ #if _GL_HAS_ATTRIBUTE (nonnull) # define _GL_ATTRIBUTE_NONNULL(args) __attribute__ ((__nonnull__ args)) #else # define _GL_ATTRIBUTE_NONNULL(args) #endif /* _GL_ATTRIBUTE_NONSTRING declares that the contents of a character array is not meant to be NUL-terminated. */ /* Applies to: struct/union members and variables that are arrays of element type '[[un]signed] char'. */ #if _GL_HAS_ATTRIBUTE (nonstring) # define _GL_ATTRIBUTE_NONSTRING __attribute__ ((__nonstring__)) #else # define _GL_ATTRIBUTE_NONSTRING #endif /* There is no _GL_ATTRIBUTE_NORETURN; use _Noreturn instead. */ /* _GL_ATTRIBUTE_NOTHROW declares that the function does not throw exceptions. */ /* Applies to: functions. */ #if _GL_HAS_ATTRIBUTE (nothrow) && !defined __cplusplus # define _GL_ATTRIBUTE_NOTHROW __attribute__ ((__nothrow__)) #else # define _GL_ATTRIBUTE_NOTHROW #endif /* _GL_ATTRIBUTE_PACKED declares: For struct members: The member has the smallest possible alignment. For struct, union, class: All members have the smallest possible alignment, minimizing the memory required. */ /* Applies to: struct members, struct, union, in C++ also: class. */ #if _GL_HAS_ATTRIBUTE (packed) # define _GL_ATTRIBUTE_PACKED __attribute__ ((__packed__)) #else # define _GL_ATTRIBUTE_PACKED #endif /* _GL_ATTRIBUTE_PURE declares that It is OK for a compiler to omit duplicate calls to the function with the same arguments if observable state is not changed between calls. This attribute is safe for a function that does not affect observable state, and always returns exactly once. (This attribute is looser than _GL_ATTRIBUTE_CONST.) */ /* Applies to: functions. */ #if _GL_HAS_ATTRIBUTE (pure) # define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__)) #else # define _GL_ATTRIBUTE_PURE #endif /* _GL_ATTRIBUTE_RETURNS_NONNULL declares that the function's return value is a non-NULL pointer. */ /* Applies to: functions. */ #if _GL_HAS_ATTRIBUTE (returns_nonnull) # define _GL_ATTRIBUTE_RETURNS_NONNULL __attribute__ ((__returns_nonnull__)) #else # define _GL_ATTRIBUTE_RETURNS_NONNULL #endif /* _GL_ATTRIBUTE_SENTINEL(pos) declares that the variadic function expects a trailing NULL argument. _GL_ATTRIBUTE_SENTINEL () - The last argument is NULL (requires C99). _GL_ATTRIBUTE_SENTINEL ((N)) - The (N+1)st argument from the end is NULL. */ /* Applies to: functions. */ #if _GL_HAS_ATTRIBUTE (sentinel) # define _GL_ATTRIBUTE_SENTINEL(pos) __attribute__ ((__sentinel__ pos)) #else # define _GL_ATTRIBUTE_SENTINEL(pos) #endif /* A helper macro. Don't use it directly. */ #if _GL_HAS_ATTRIBUTE (unused) # define _GL_ATTRIBUTE_UNUSED __attribute__ ((__unused__)) #else # define _GL_ATTRIBUTE_UNUSED #endif ]dnl There is no _GL_ATTRIBUTE_VISIBILITY; see m4/visibility.m4 instead. [ /* _GL_UNUSED_LABEL; declares that it is not a programming mistake if the immediately preceding label is not used. The compiler should not warn if the label is not used. */ /* Applies to: label (both in C and C++). */ /* Note that g++ < 4.5 does not support the '__attribute__ ((__unused__)) ;' syntax. But clang does. */ #if !(defined __cplusplus && !_GL_GNUC_PREREQ (4, 5)) || defined __clang__ # define _GL_UNUSED_LABEL _GL_ATTRIBUTE_UNUSED #else # define _GL_UNUSED_LABEL #endif ]) AH_VERBATIM([async_safe], [/* The _GL_ASYNC_SAFE marker should be attached to functions that are signal handlers (for signals other than SIGABRT, SIGPIPE) or can be invoked from such signal handlers. Such functions have some restrictions: * All functions that it calls should be marked _GL_ASYNC_SAFE as well, or should be listed as async-signal-safe in POSIX section 2.4.3. Note that malloc(), sprintf(), and fwrite(), in particular, are NOT async-signal-safe. * All memory locations (variables and struct fields) that these functions access must be marked 'volatile'. This holds for both read and write accesses. Otherwise the compiler might optimize away stores to and reads from such locations that occur in the program, depending on its data flow analysis. For example, when the program contains a loop that is intended to inspect a variable set from within a signal handler while (!signal_occurred) ; the compiler is allowed to transform this into an endless loop if the variable 'signal_occurred' is not declared 'volatile'. Additionally, recall that: * A signal handler should not modify errno (except if it is a handler for a fatal signal and ends by raising the same signal again, thus provoking the termination of the process). If it invokes a function that may clobber errno, it needs to save and restore the value of errno. */ #define _GL_ASYNC_SAFE ]) AH_VERBATIM([micro_optimizations], [/* _GL_CMP (n1, n2) performs a three-valued comparison on n1 vs. n2, where n1 and n2 are expressions without side effects, that evaluate to real numbers (excluding NaN). It returns 1 if n1 > n2 0 if n1 == n2 -1 if n1 < n2 The naïve code (n1 > n2 ? 1 : n1 < n2 ? -1 : 0) produces a conditional jump with nearly all GCC versions up to GCC 10. This variant (n1 < n2 ? -1 : n1 > n2) produces a conditional with many GCC versions up to GCC 9. The better code (n1 > n2) - (n1 < n2) from Hacker's Delight § 2-9 avoids conditional jumps in all GCC versions >= 3.4. */ #define _GL_CMP(n1, n2) (((n1) > (n2)) - ((n1) < (n2))) ]) dnl Hint which direction to take regarding cross-compilation guesses: dnl When a user installs a program on a platform they are not intimately dnl familiar with, --enable-cross-guesses=conservative is the appropriate dnl choice. It implements the "If we don't know, assume the worst" principle. dnl However, when an operating system developer (on a platform which is not dnl yet known to gnulib) builds packages for their platform, they want to dnl expose, not hide, possible platform bugs; in this case, dnl --enable-cross-guesses=risky is the appropriate choice. dnl Sets the variables dnl gl_cross_guess_normal (to be used when 'yes' is good and 'no' is bad), dnl gl_cross_guess_inverted (to be used when 'no' is good and 'yes' is bad). AC_ARG_ENABLE([cross-guesses], [AS_HELP_STRING([--enable-cross-guesses={conservative|risky}], [specify policy for cross-compilation guesses])], [if test "x$enableval" != xconservative && test "x$enableval" != xrisky; then AC_MSG_WARN([invalid argument supplied to --enable-cross-guesses]) enableval=conservative fi gl_cross_guesses="$enableval"], [gl_cross_guesses=conservative]) if test $gl_cross_guesses = risky; then gl_cross_guess_normal="guessing yes" gl_cross_guess_inverted="guessing no" else gl_cross_guess_normal="guessing no" gl_cross_guess_inverted="guessing yes" fi dnl Preparation for running test programs: dnl Tell glibc to write diagnostics from -D_FORTIFY_SOURCE=2 to stderr, not dnl to /dev/tty, so they can be redirected to log files. Such diagnostics dnl arise e.g., in the macros gl_PRINTF_DIRECTIVE_N, gl_SNPRINTF_DIRECTIVE_N. LIBC_FATAL_STDERR_=1 export LIBC_FATAL_STDERR_ ]) # gl_MODULE_INDICATOR_INIT_VARIABLE([variablename]) # gl_MODULE_INDICATOR_INIT_VARIABLE([variablename], [initialvalue]) # initializes the shell variable that indicates the presence of the given module # as a C preprocessor expression. AC_DEFUN([gl_MODULE_INDICATOR_INIT_VARIABLE], [ GL_MODULE_INDICATOR_PREFIX[]_[$1]=m4_if([$2], , [0], [$2]) AC_SUBST(GL_MODULE_INDICATOR_PREFIX[]_[$1]) ]) # gl_MODULE_INDICATOR_CONDITION # expands to a C preprocessor expression that evaluates to 1 or 0, depending # whether a gnulib module that has been requested shall be considered present # or not. m4_define([gl_MODULE_INDICATOR_CONDITION], [1]) # gl_MODULE_INDICATOR_SET_VARIABLE([modulename]) # sets the shell variable that indicates the presence of the given module to # a C preprocessor expression that will evaluate to 1. AC_DEFUN([gl_MODULE_INDICATOR_SET_VARIABLE], [ gl_MODULE_INDICATOR_SET_VARIABLE_AUX( [GL_MODULE_INDICATOR_PREFIX[]_GNULIB_[]m4_translit([[$1]], [abcdefghijklmnopqrstuvwxyz./-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])], [gl_MODULE_INDICATOR_CONDITION]) ]) # gl_MODULE_INDICATOR_SET_VARIABLE_AUX([variable]) # modifies the shell variable to include the gl_MODULE_INDICATOR_CONDITION. # The shell variable's value is a C preprocessor expression that evaluates # to 0 or 1. AC_DEFUN([gl_MODULE_INDICATOR_SET_VARIABLE_AUX], [ m4_if(m4_defn([gl_MODULE_INDICATOR_CONDITION]), [1], [ dnl Simplify the expression VALUE || 1 to 1. $1=1 ], [gl_MODULE_INDICATOR_SET_VARIABLE_AUX_OR([$1], [gl_MODULE_INDICATOR_CONDITION])]) ]) # gl_MODULE_INDICATOR_SET_VARIABLE_AUX_OR([variable], [condition]) # modifies the shell variable to include the given condition. The shell # variable's value is a C preprocessor expression that evaluates to 0 or 1. AC_DEFUN([gl_MODULE_INDICATOR_SET_VARIABLE_AUX_OR], [ dnl Simplify the expression 1 || CONDITION to 1. if test "$[]$1" != 1; then dnl Simplify the expression 0 || CONDITION to CONDITION. if test "$[]$1" = 0; then $1=$2 else $1="($[]$1 || $2)" fi fi ]) # gl_MODULE_INDICATOR([modulename]) # defines a C macro indicating the presence of the given module # in a location where it can be used. # | Value | Value | # | in lib/ | in tests/ | # --------------------------------------------+---------+-----------+ # Module present among main modules: | 1 | 1 | # --------------------------------------------+---------+-----------+ # Module present among tests-related modules: | 0 | 1 | # --------------------------------------------+---------+-----------+ # Module not present at all: | 0 | 0 | # --------------------------------------------+---------+-----------+ AC_DEFUN([gl_MODULE_INDICATOR], [ AC_DEFINE_UNQUOTED([GNULIB_]m4_translit([[$1]], [abcdefghijklmnopqrstuvwxyz./-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ___]), [gl_MODULE_INDICATOR_CONDITION], [Define to a C preprocessor expression that evaluates to 1 or 0, depending whether the gnulib module $1 shall be considered present.]) ]) # gl_MODULE_INDICATOR_FOR_TESTS([modulename]) # defines a C macro indicating the presence of the given module # in lib or tests. This is useful to determine whether the module # should be tested. # | Value | Value | # | in lib/ | in tests/ | # --------------------------------------------+---------+-----------+ # Module present among main modules: | 1 | 1 | # --------------------------------------------+---------+-----------+ # Module present among tests-related modules: | 1 | 1 | # --------------------------------------------+---------+-----------+ # Module not present at all: | 0 | 0 | # --------------------------------------------+---------+-----------+ AC_DEFUN([gl_MODULE_INDICATOR_FOR_TESTS], [ AC_DEFINE([GNULIB_TEST_]m4_translit([[$1]], [abcdefghijklmnopqrstuvwxyz./-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ___]), [1], [Define to 1 when the gnulib module $1 should be tested.]) ]) # gl_ASSERT_NO_GNULIB_POSIXCHECK # asserts that there will never be a need to #define GNULIB_POSIXCHECK. # and thereby enables an optimization of configure and config.h. # Used by Emacs. AC_DEFUN([gl_ASSERT_NO_GNULIB_POSIXCHECK], [ dnl Override gl_WARN_ON_USE_PREPARE. dnl But hide this definition from 'aclocal'. AC_DEFUN([gl_W][ARN_ON_USE_PREPARE], []) ]) # gl_ASSERT_NO_GNULIB_TESTS # asserts that there will be no gnulib tests in the scope of the configure.ac # and thereby enables an optimization of config.h. # Used by Emacs. AC_DEFUN([gl_ASSERT_NO_GNULIB_TESTS], [ dnl Override gl_MODULE_INDICATOR_FOR_TESTS. AC_DEFUN([gl_MODULE_INDICATOR_FOR_TESTS], []) ]) # Test whether exists. # Set HAVE_FEATURES_H. AC_DEFUN([gl_FEATURES_H], [ AC_CHECK_HEADERS_ONCE([features.h]) if test $ac_cv_header_features_h = yes; then HAVE_FEATURES_H=1 else HAVE_FEATURES_H=0 fi AC_SUBST([HAVE_FEATURES_H]) ]) # gl_PROG_CC_C99 # Modifies the value of the shell variable CC in an attempt to make $CC # understand ISO C99 source code. AC_DEFUN([gl_PROG_CC_C99], [ dnl Just use AC_PROG_CC_C99. dnl When AC_PROG_CC_C99 and AC_PROG_CC_STDC are used together, the substituted dnl value of CC will contain the C99 enabling options twice. But this is only dnl a cosmetic problem. dnl With Autoconf >= 2.70, use AC_PROG_CC since it implies AC_PROG_CC_C99; dnl this avoids a "warning: The macro `AC_PROG_CC_C99' is obsolete." m4_version_prereq([2.70], [AC_REQUIRE([AC_PROG_CC])], [AC_REQUIRE([AC_PROG_CC_C99])]) ]) # gl_PROG_AR_RANLIB # Determines the values for AR, ARFLAGS, RANLIB that fit with the compiler. # The user can set the variables AR, ARFLAGS, RANLIB if he wants to override # the values. AC_DEFUN([gl_PROG_AR_RANLIB], [ dnl Minix 3 comes with two toolchains: The Amsterdam Compiler Kit compiler dnl as "cc", and GCC as "gcc". They have different object file formats and dnl library formats. In particular, the GNU binutils programs ar and ranlib dnl produce libraries that work only with gcc, not with cc. AC_REQUIRE([AC_PROG_CC]) dnl The '][' hides this use from 'aclocal'. AC_BEFORE([$0], [A][M_PROG_AR]) AC_CACHE_CHECK([for Minix Amsterdam compiler], [gl_cv_c_amsterdam_compiler], [ AC_EGREP_CPP([Amsterdam], [ #ifdef __ACK__ Amsterdam #endif ], [gl_cv_c_amsterdam_compiler=yes], [gl_cv_c_amsterdam_compiler=no]) ]) dnl Don't compete with AM_PROG_AR's decision about AR/ARFLAGS if we are not dnl building with __ACK__. if test $gl_cv_c_amsterdam_compiler = yes; then if test -z "$AR"; then AR='cc -c.a' fi if test -z "$ARFLAGS"; then ARFLAGS='-o' fi else dnl AM_PROG_AR was added in automake v1.11.2. AM_PROG_AR does not AC_SUBST dnl ARFLAGS variable (it is filed into Makefile.in directly by automake dnl script on-demand, if not specified by ./configure of course). dnl Don't AC_REQUIRE the AM_PROG_AR otherwise the code for __ACK__ above dnl will be ignored. Also, pay attention to call AM_PROG_AR in else block dnl because AM_PROG_AR is written so it could re-set AR variable even for dnl __ACK__. It may seem like its easier to avoid calling the macro here, dnl but we need to AC_SUBST both AR/ARFLAGS (thus those must have some good dnl default value and automake should usually know them). dnl dnl The '][' hides this use from 'aclocal'. m4_ifdef([A][M_PROG_AR], [A][M_PROG_AR], [:]) fi dnl In case the code above has not helped with setting AR/ARFLAGS, use dnl Automake-documented default values for AR and ARFLAGS, but prefer dnl ${host}-ar over ar (useful for cross-compiling). AC_CHECK_TOOL([AR], [ar], [ar]) if test -z "$ARFLAGS"; then ARFLAGS='cr' fi AC_SUBST([AR]) AC_SUBST([ARFLAGS]) if test -z "$RANLIB"; then if test $gl_cv_c_amsterdam_compiler = yes; then RANLIB=':' else dnl Use the ranlib program if it is available. AC_PROG_RANLIB fi fi AC_SUBST([RANLIB]) ]) # AC_C_RESTRICT # This definition is copied from post-2.70 Autoconf and overrides the # AC_C_RESTRICT macro from autoconf 2.60..2.70. m4_version_prereq([2.70.1], [], [ AC_DEFUN([AC_C_RESTRICT], [AC_CACHE_CHECK([for C/C++ restrict keyword], [ac_cv_c_restrict], [ac_cv_c_restrict=no # Put '__restrict__' first, to avoid problems with glibc and non-GCC; see: # https://lists.gnu.org/archive/html/bug-autoconf/2016-02/msg00006.html # Put 'restrict' last, because C++ lacks it. for ac_kw in __restrict__ __restrict _Restrict restrict; do AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[typedef int *int_ptr; int foo (int_ptr $ac_kw ip) { return ip[0]; } int bar (int [$ac_kw]); /* Catch GCC bug 14050. */ int bar (int ip[$ac_kw]) { return ip[0]; } ]], [[int s[1]; int *$ac_kw t = s; t[0] = 0; return foo (t) + bar (t); ]])], [ac_cv_c_restrict=$ac_kw]) test "$ac_cv_c_restrict" != no && break done ]) AH_VERBATIM([restrict], [/* Define to the equivalent of the C99 'restrict' keyword, or to nothing if this is not supported. Do not define if restrict is supported only directly. */ #undef restrict /* Work around a bug in older versions of Sun C++, which did not #define __restrict__ or support _Restrict or __restrict__ even though the corresponding Sun C compiler ended up with "#define restrict _Restrict" or "#define restrict __restrict__" in the previous line. This workaround can be removed once we assume Oracle Developer Studio 12.5 (2016) or later. */ #if defined __SUNPRO_CC && !defined __RESTRICT && !defined __restrict__ # define _Restrict # define __restrict__ #endif]) case $ac_cv_c_restrict in restrict) ;; no) AC_DEFINE([restrict], []) ;; *) AC_DEFINE_UNQUOTED([restrict], [$ac_cv_c_restrict]) ;; esac ])# AC_C_RESTRICT ]) # gl_BIGENDIAN # is like AC_C_BIGENDIAN, except that it can be AC_REQUIREd. # Note that AC_REQUIRE([AC_C_BIGENDIAN]) does not work reliably because some # macros invoke AC_C_BIGENDIAN with arguments. AC_DEFUN([gl_BIGENDIAN], [ AC_C_BIGENDIAN ]) # A temporary file descriptor. # Must be less than 10, because dash 0.5.8 does not support redirections # with multi-digit file descriptors. m4_define([GL_TMP_FD], 9) # gl_SILENT(command) # executes command, but without the normal configure output. # This is useful when you want to invoke AC_CACHE_CHECK (or AC_CHECK_FUNC etc.) # inside another AC_CACHE_CHECK. AC_DEFUN([gl_SILENT], [ exec GL_TMP_FD>&AS_MESSAGE_FD AS_MESSAGE_FD>/dev/null $1 exec AS_MESSAGE_FD>&GL_TMP_FD GL_TMP_FD>&- ]) # gl_CACHE_VAL_SILENT(cache-id, command-to-set-it) # is like AC_CACHE_VAL(cache-id, command-to-set-it), except that it does not # output a spurious "(cached)" mark in the midst of other configure output. # This macro should be used instead of AC_CACHE_VAL when it is not surrounded # by an AC_MSG_CHECKING/AC_MSG_RESULT pair. AC_DEFUN([gl_CACHE_VAL_SILENT], [ gl_SILENT([ AC_CACHE_VAL([$1], [$2]) ]) ]) # gl_CONDITIONAL(conditional, condition) # is like AM_CONDITIONAL(conditional, condition), except that it does not # produce an error # configure: error: conditional "..." was never defined. # Usually this means the macro was only invoked conditionally. # when only invoked conditionally. Instead, in that case, both the _TRUE # and the _FALSE case are disabled. AC_DEFUN([gl_CONDITIONAL], [ pushdef([AC_CONFIG_COMMANDS_PRE], [:])dnl AM_CONDITIONAL([$1], [$2]) popdef([AC_CONFIG_COMMANDS_PRE])dnl if test -z "${[$1]_TRUE}" && test -z "${[$1]_FALSE}"; then [$1]_TRUE='#' [$1]_FALSE='#' fi ]) # gl_CC_ALLOW_WARNINGS # sets and substitutes a variable GL_CFLAG_ALLOW_WARNINGS, to a $(CC) option # that reverts a preceding '-Werror' option, if available. # This is expected to be '-Wno-error' on gcc, clang (except clang/MSVC), xlclang # and empty otherwise. AC_DEFUN([gl_CC_ALLOW_WARNINGS], [ AC_REQUIRE([AC_PROG_CC]) AC_CACHE_CHECK([for C compiler option to allow warnings], [gl_cv_cc_wallow], [rm -f conftest* echo 'int dummy;' > conftest.c AC_TRY_COMMAND([${CC-cc} $CFLAGS $CPPFLAGS -c conftest.c 2>conftest1.err]) >/dev/null AC_TRY_COMMAND([${CC-cc} $CFLAGS $CPPFLAGS -Wno-error -c conftest.c 2>conftest2.err]) >/dev/null dnl Test the number of error output lines, because AIX xlc accepts the dnl option '-Wno-error', just to produce a warning dnl "Option -Wno-error was incorrectly specified. The option will be ignored." dnl afterwards. if test $? = 0 && test `wc -l < conftest1.err` = `wc -l < conftest2.err`; then gl_cv_cc_wallow='-Wno-error' else gl_cv_cc_wallow=none fi rm -f conftest* ]) case "$gl_cv_cc_wallow" in none) GL_CFLAG_ALLOW_WARNINGS='' ;; *) GL_CFLAG_ALLOW_WARNINGS="$gl_cv_cc_wallow" ;; esac AC_SUBST([GL_CFLAG_ALLOW_WARNINGS]) ]) # gl_CXX_ALLOW_WARNINGS # sets and substitutes a variable GL_CXXFLAG_ALLOW_WARNINGS, to a $(CC) option # that reverts a preceding '-Werror' option, if available. AC_DEFUN([gl_CXX_ALLOW_WARNINGS], [ dnl Requires AC_PROG_CXX or gl_PROG_ANSI_CXX. if test -n "$CXX" && test "$CXX" != no; then AC_CACHE_CHECK([for C++ compiler option to allow warnings], [gl_cv_cxx_wallow], [rm -f conftest* echo 'int dummy;' > conftest.cc AC_TRY_COMMAND([${CXX-c++} $CXXFLAGS $CPPFLAGS -c conftest.cc 2>conftest1.err]) >/dev/null AC_TRY_COMMAND([${CXX-c++} $CXXFLAGS $CPPFLAGS -Wno-error -c conftest.cc 2>conftest2.err]) >/dev/null dnl Test the number of error output lines, because AIX xlC accepts the dnl option '-Wno-error', just to produce a warning dnl "Option -Wno-error was incorrectly specified. The option will be ignored." dnl afterwards. if test $? = 0 && test `wc -l < conftest1.err` = `wc -l < conftest2.err`; then gl_cv_cxx_wallow='-Wno-error' else gl_cv_cxx_wallow=none fi rm -f conftest* ]) case "$gl_cv_cxx_wallow" in none) GL_CXXFLAG_ALLOW_WARNINGS='' ;; *) GL_CXXFLAG_ALLOW_WARNINGS="$gl_cv_cxx_wallow" ;; esac else GL_CXXFLAG_ALLOW_WARNINGS='' fi AC_SUBST([GL_CXXFLAG_ALLOW_WARNINGS]) ]) # gl_CC_GNULIB_WARNINGS # sets and substitutes a variable GL_CFLAG_GNULIB_WARNINGS, to a $(CC) option # set that enables or disables warnings as suitable for the Gnulib coding style. AC_DEFUN([gl_CC_GNULIB_WARNINGS], [ AC_REQUIRE([gl_CC_ALLOW_WARNINGS]) dnl Assume that the compiler supports -Wno-* options only if it also supports dnl -Wno-error. GL_CFLAG_GNULIB_WARNINGS='' if test -n "$GL_CFLAG_ALLOW_WARNINGS"; then dnl Enable these warning options: dnl dnl GCC clang dnl -Wno-cast-qual >= 3 >= 3.9 dnl -Wno-conversion >= 3 >= 3.9 dnl -Wno-float-conversion >= 4.9 >= 3.9 dnl -Wno-float-equal >= 3 >= 3.9 dnl -Wimplicit-fallthrough >= 7 >= 3.9 dnl -Wno-pedantic >= 4.8 >= 3.9 dnl -Wno-sign-compare >= 3 >= 3.9 dnl -Wno-sign-conversion >= 4.3 >= 3.9 dnl -Wno-type-limits >= 4.3 >= 3.9 dnl -Wno-undef >= 3 >= 3.9 dnl -Wno-unsuffixed-float-constants >= 4.5 dnl -Wno-unused-function >= 3 >= 3.9 dnl -Wno-unused-parameter >= 3 >= 3.9 dnl cat > conftest.c <<\EOF #if __GNUC__ >= 3 || (__clang_major__ + (__clang_minor__ >= 9) > 3) -Wno-cast-qual -Wno-conversion -Wno-float-equal -Wno-sign-compare -Wno-undef -Wno-unused-function -Wno-unused-parameter #endif #if __GNUC__ + (__GNUC_MINOR__ >= 9) > 4 || (__clang_major__ + (__clang_minor__ >= 9) > 3) -Wno-float-conversion #endif #if __GNUC__ >= 7 || (__clang_major__ + (__clang_minor__ >= 9) > 3) -Wimplicit-fallthrough #endif #if __GNUC__ + (__GNUC_MINOR__ >= 8) > 4 || (__clang_major__ + (__clang_minor__ >= 9) > 3) -Wno-pedantic #endif #if __GNUC__ + (__GNUC_MINOR__ >= 3) > 4 || (__clang_major__ + (__clang_minor__ >= 9) > 3) -Wno-sign-conversion -Wno-type-limits #endif #if __GNUC__ + (__GNUC_MINOR__ >= 5) > 4 -Wno-unsuffixed-float-constants #endif EOF gl_command="$CC $CFLAGS $CPPFLAGS -E conftest.c > conftest.out" if AC_TRY_EVAL([gl_command]); then gl_options=`grep -v '#' conftest.out` for word in $gl_options; do GL_CFLAG_GNULIB_WARNINGS="$GL_CFLAG_GNULIB_WARNINGS $word" done fi rm -f conftest.c conftest.out fi AC_SUBST([GL_CFLAG_GNULIB_WARNINGS]) ]) dnl gl_CONDITIONAL_HEADER([foo.h]) dnl takes a shell variable GL_GENERATE_FOO_H (with value true or false) as input dnl and produces dnl - an AC_SUBSTed variable FOO_H that is either a file name or empty, based dnl on whether GL_GENERATE_FOO_H is true or false, dnl - an Automake conditional GL_GENERATE_FOO_H that evaluates to the value of dnl the shell variable GL_GENERATE_FOO_H. AC_DEFUN([gl_CONDITIONAL_HEADER], [ m4_pushdef([gl_header_name], AS_TR_SH(m4_toupper($1))) m4_pushdef([gl_generate_var], [GL_GENERATE_]AS_TR_SH(m4_toupper($1))) m4_pushdef([gl_generate_cond], [GL_GENERATE_]AS_TR_SH(m4_toupper($1))) case "$gl_generate_var" in false) gl_header_name='' ;; true) dnl It is OK to use a .h file in lib/ from within tests/, but not vice dnl versa. if test -z "$gl_header_name"; then gl_header_name="${gl_source_base_prefix}$1" fi ;; *) echo "*** gl_generate_var is not set correctly" 1>&2; exit 1 ;; esac AC_SUBST(gl_header_name) gl_CONDITIONAL(gl_generate_cond, [$gl_generate_var]) m4_popdef([gl_generate_cond]) m4_popdef([gl_generate_var]) m4_popdef([gl_header_name]) ]) dnl Expands to some code for use in .c programs that, on native Windows, defines dnl the Microsoft deprecated alias function names to the underscore-prefixed dnl actual function names. With this macro, these function names are available dnl without linking with '-loldnames' and without generating warnings. dnl Usage: Use it after all system header files are included. dnl #include <...> dnl #include <...> dnl ]GL_MDA_DEFINES[ dnl ... AC_DEFUN([GL_MDA_DEFINES],[ AC_REQUIRE([_GL_MDA_DEFINES]) [$gl_mda_defines] ]) AC_DEFUN([_GL_MDA_DEFINES], [gl_mda_defines=' #if defined _WIN32 && !defined __CYGWIN__ #define access _access #define chdir _chdir #define chmod _chmod #define close _close #define creat _creat #define dup _dup #define dup2 _dup2 #define ecvt _ecvt #define execl _execl #define execle _execle #define execlp _execlp #define execv _execv #define execve _execve #define execvp _execvp #define execvpe _execvpe #define fcloseall _fcloseall #define fcvt _fcvt #define fdopen _fdopen #define fileno _fileno #define gcvt _gcvt #define getcwd _getcwd #define getpid _getpid #define getw _getw #define isatty _isatty #define j0 _j0 #define j1 _j1 #define jn _jn #define lfind _lfind #define lsearch _lsearch #define lseek _lseek #define memccpy _memccpy #define mkdir _mkdir #define mktemp _mktemp #define open _open #define putenv _putenv #define putw _putw #define read _read #define rmdir _rmdir #define strdup _strdup #define swab _swab #define tempnam _tempnam #define tzset _tzset #define umask _umask #define unlink _unlink #define utime _utime #define wcsdup _wcsdup #define write _write #define y0 _y0 #define y1 _y1 #define yn _yn #endif ' ]) grub-2.14~git20250718.0e36779/m4/locale-ja.m40000644000175000017500000001316715036447602014426 00000000000000# locale-ja.m4 serial 15 dnl Copyright (C) 2003, 2005-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. dnl Determine the name of a japanese locale with EUC-JP encoding. AC_DEFUN([gt_LOCALE_JA], [ AC_REQUIRE([AC_CANONICAL_HOST]) AC_REQUIRE([AM_LANGINFO_CODESET]) AC_CACHE_CHECK([for a traditional japanese locale], [gt_cv_locale_ja], [ AC_LANG_CONFTEST([AC_LANG_SOURCE([[ #include #include #if HAVE_LANGINFO_CODESET # include #endif #include #include struct tm t; char buf[16]; int main () { /* On BeOS and Haiku, locales are not implemented in libc. Rather, libintl imitates locale dependent behaviour by looking at the environment variables, and all locales use the UTF-8 encoding. */ #if defined __BEOS__ || defined __HAIKU__ return 1; #else /* Check whether the given locale name is recognized by the system. */ # if defined _WIN32 && !defined __CYGWIN__ /* On native Windows, setlocale(category, "") looks at the system settings, not at the environment variables. Also, when an encoding suffix such as ".65001" or ".54936" is specified, it succeeds but sets the LC_CTYPE category of the locale to "C". */ if (setlocale (LC_ALL, getenv ("LC_ALL")) == NULL || strcmp (setlocale (LC_CTYPE, NULL), "C") == 0) return 1; # else if (setlocale (LC_ALL, "") == NULL) return 1; # endif /* Check whether nl_langinfo(CODESET) is nonempty and not "ASCII" or "646". On Mac OS X 10.3.5 (Darwin 7.5) in the fr_FR locale, nl_langinfo(CODESET) is empty, and the behaviour of Tcl 8.4 in this locale is not useful. On OpenBSD 4.0, when an unsupported locale is specified, setlocale() succeeds but then nl_langinfo(CODESET) is "646". In this situation, some unit tests fail. On MirBSD 10, when an unsupported locale is specified, setlocale() succeeds but then nl_langinfo(CODESET) is "UTF-8". */ # if HAVE_LANGINFO_CODESET { const char *cs = nl_langinfo (CODESET); if (cs[0] == '\0' || strcmp (cs, "ASCII") == 0 || strcmp (cs, "646") == 0 || strcmp (cs, "UTF-8") == 0) return 1; } # endif # ifdef __CYGWIN__ /* On Cygwin, avoid locale names without encoding suffix, because the locale_charset() function relies on the encoding suffix. Note that LC_ALL is set on the command line. */ if (strchr (getenv ("LC_ALL"), '.') == NULL) return 1; # endif /* Check whether MB_CUR_MAX is > 1. This excludes the dysfunctional locales on Cygwin 1.5.x. */ if (MB_CUR_MAX == 1) return 1; /* Check whether in a month name, no byte in the range 0x80..0x9F occurs. This excludes the UTF-8 encoding (except on MirBSD). */ { const char *p; t.tm_year = 1975 - 1900; t.tm_mon = 2 - 1; t.tm_mday = 4; if (strftime (buf, sizeof (buf), "%B", &t) < 2) return 1; for (p = buf; *p != '\0'; p++) if ((unsigned char) *p >= 0x80 && (unsigned char) *p < 0xa0) return 1; } return 0; #endif } ]])]) if AC_TRY_EVAL([ac_link]) && test -s conftest$ac_exeext; then case "$host_os" in # Handle native Windows specially, because there setlocale() interprets # "ar" as "Arabic" or "Arabic_Saudi Arabia.1256", # "fr" or "fra" as "French" or "French_France.1252", # "ge"(!) or "deu"(!) as "German" or "German_Germany.1252", # "ja" as "Japanese" or "Japanese_Japan.932", # and similar. mingw*) # Note that on native Windows, the Japanese locale is # Japanese_Japan.932, and CP932 is very different from EUC-JP, so we # cannot use it here. gt_cv_locale_ja=none ;; *) # Setting LC_ALL is not enough. Need to set LC_TIME to empty, because # otherwise on Mac OS X 10.3.5 the LC_TIME=C from the beginning of the # configure script would override the LC_ALL setting. Likewise for # LC_CTYPE, which is also set at the beginning of the configure script. # Test for the AIX locale name. if (LC_ALL=ja_JP LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then gt_cv_locale_ja=ja_JP else # Test for the locale name with explicit encoding suffix. if (LC_ALL=ja_JP.EUC-JP LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then gt_cv_locale_ja=ja_JP.EUC-JP else # Test for the HP-UX, OSF/1, NetBSD locale name. if (LC_ALL=ja_JP.eucJP LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then gt_cv_locale_ja=ja_JP.eucJP else # Test for the IRIX, FreeBSD locale name. if (LC_ALL=ja_JP.EUC LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then gt_cv_locale_ja=ja_JP.EUC else # Test for the Solaris 7 locale name. if (LC_ALL=ja LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then gt_cv_locale_ja=ja else # Special test for NetBSD 1.6. if test -f /usr/share/locale/ja_JP.eucJP/LC_CTYPE; then gt_cv_locale_ja=ja_JP.eucJP else # None found. gt_cv_locale_ja=none fi fi fi fi fi fi ;; esac fi rm -fr conftest* ]) LOCALE_JA=$gt_cv_locale_ja AC_SUBST([LOCALE_JA]) ]) grub-2.14~git20250718.0e36779/m4/msvc-inval.m40000644000175000017500000000133415036447602014647 00000000000000# msvc-inval.m4 serial 1 dnl Copyright (C) 2011-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_MSVC_INVAL], [ AC_CHECK_FUNCS_ONCE([_set_invalid_parameter_handler]) if test $ac_cv_func__set_invalid_parameter_handler = yes; then HAVE_MSVC_INVALID_PARAMETER_HANDLER=1 AC_DEFINE([HAVE_MSVC_INVALID_PARAMETER_HANDLER], [1], [Define to 1 on MSVC platforms that have the "invalid parameter handler" concept.]) else HAVE_MSVC_INVALID_PARAMETER_HANDLER=0 fi AC_SUBST([HAVE_MSVC_INVALID_PARAMETER_HANDLER]) ]) grub-2.14~git20250718.0e36779/m4/fcntl_h.m40000644000175000017500000000520615036447602014207 00000000000000# serial 20 # Configure fcntl.h. dnl Copyright (C) 2006-2007, 2009-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl Written by Paul Eggert. AC_DEFUN_ONCE([gl_FCNTL_H], [ AC_REQUIRE([gl_FCNTL_H_DEFAULTS]) AC_REQUIRE([gl_FCNTL_O_FLAGS]) gl_NEXT_HEADERS([fcntl.h]) dnl Ensure the type pid_t gets defined. AC_REQUIRE([AC_TYPE_PID_T]) dnl Ensure the type mode_t gets defined. AC_REQUIRE([AC_TYPE_MODE_T]) dnl Check for declarations of anything we want to poison if the dnl corresponding gnulib module is not in use, if it is not common dnl enough to be declared everywhere. gl_WARN_ON_USE_PREPARE([[#include ]], [fcntl openat]) ]) # gl_FCNTL_MODULE_INDICATOR([modulename]) # sets the shell variable that indicates the presence of the given module # to a C preprocessor expression that will evaluate to 1. # This macro invocation must not occur in macros that are AC_REQUIREd. AC_DEFUN([gl_FCNTL_MODULE_INDICATOR], [ dnl Ensure to expand the default settings once only. gl_FCNTL_H_REQUIRE_DEFAULTS gl_MODULE_INDICATOR_SET_VARIABLE([$1]) dnl Define it also as a C macro, for the benefit of the unit tests. gl_MODULE_INDICATOR_FOR_TESTS([$1]) ]) # Initializes the default values for AC_SUBSTed shell variables. # This macro must not be AC_REQUIREd. It must only be invoked, and only # outside of macros or in macros that are not AC_REQUIREd. AC_DEFUN([gl_FCNTL_H_REQUIRE_DEFAULTS], [ m4_defun(GL_MODULE_INDICATOR_PREFIX[_FCNTL_H_MODULE_INDICATOR_DEFAULTS], [ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_CREAT]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FCNTL]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_NONBLOCKING]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_OPEN]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_OPENAT]) dnl Support Microsoft deprecated alias function names by default. gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_CREAT], [1]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_OPEN], [1]) ]) m4_require(GL_MODULE_INDICATOR_PREFIX[_FCNTL_H_MODULE_INDICATOR_DEFAULTS]) AC_REQUIRE([gl_FCNTL_H_DEFAULTS]) ]) AC_DEFUN([gl_FCNTL_H_DEFAULTS], [ dnl Assume proper GNU behavior unless another module says otherwise. HAVE_FCNTL=1; AC_SUBST([HAVE_FCNTL]) HAVE_OPENAT=1; AC_SUBST([HAVE_OPENAT]) REPLACE_CREAT=0; AC_SUBST([REPLACE_CREAT]) REPLACE_FCNTL=0; AC_SUBST([REPLACE_FCNTL]) REPLACE_OPEN=0; AC_SUBST([REPLACE_OPEN]) REPLACE_OPENAT=0; AC_SUBST([REPLACE_OPENAT]) ]) grub-2.14~git20250718.0e36779/m4/codeset.m40000644000175000017500000000152515036447602014220 00000000000000# codeset.m4 serial 5 (gettext-0.18.2) dnl Copyright (C) 2000-2002, 2006, 2008-2014, 2016, 2019-2022 Free Software dnl Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. AC_DEFUN([AM_LANGINFO_CODESET], [ AC_CACHE_CHECK([for nl_langinfo and CODESET], [am_cv_langinfo_codeset], [AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[#include ]], [[char* cs = nl_langinfo(CODESET); return !cs;]])], [am_cv_langinfo_codeset=yes], [am_cv_langinfo_codeset=no]) ]) if test $am_cv_langinfo_codeset = yes; then AC_DEFINE([HAVE_LANGINFO_CODESET], [1], [Define if you have and nl_langinfo(CODESET).]) fi ]) grub-2.14~git20250718.0e36779/m4/nls.m40000644000175000017500000000231515036447570013370 00000000000000# nls.m4 serial 5 (gettext-0.18) dnl Copyright (C) 1995-2003, 2005-2006, 2008-2013 Free Software Foundation, dnl Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1995-2000. dnl Bruno Haible , 2000-2003. AC_PREREQ([2.50]) AC_DEFUN([AM_NLS], [ AC_MSG_CHECKING([whether NLS is requested]) dnl Default is enabled NLS AC_ARG_ENABLE([nls], [ --disable-nls do not use Native Language Support], USE_NLS=$enableval, USE_NLS=yes) AC_MSG_RESULT([$USE_NLS]) AC_SUBST([USE_NLS]) ]) grub-2.14~git20250718.0e36779/m4/gettext.m40000644000175000017500000003561515036447570014271 00000000000000# gettext.m4 serial 66 (gettext-0.18.2) dnl Copyright (C) 1995-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1995-2000. dnl Bruno Haible , 2000-2006, 2008-2010. dnl Macro to add for using GNU gettext. dnl Usage: AM_GNU_GETTEXT([INTLSYMBOL], [NEEDSYMBOL], [INTLDIR]). dnl INTLSYMBOL can be one of 'external', 'no-libtool', 'use-libtool'. The dnl default (if it is not specified or empty) is 'no-libtool'. dnl INTLSYMBOL should be 'external' for packages with no intl directory, dnl and 'no-libtool' or 'use-libtool' for packages with an intl directory. dnl If INTLSYMBOL is 'use-libtool', then a libtool library dnl $(top_builddir)/intl/libintl.la will be created (shared and/or static, dnl depending on --{enable,disable}-{shared,static} and on the presence of dnl AM-DISABLE-SHARED). If INTLSYMBOL is 'no-libtool', a static library dnl $(top_builddir)/intl/libintl.a will be created. dnl If NEEDSYMBOL is specified and is 'need-ngettext', then GNU gettext dnl implementations (in libc or libintl) without the ngettext() function dnl will be ignored. If NEEDSYMBOL is specified and is dnl 'need-formatstring-macros', then GNU gettext implementations that don't dnl support the ISO C 99 formatstring macros will be ignored. dnl INTLDIR is used to find the intl libraries. If empty, dnl the value '$(top_builddir)/intl/' is used. dnl dnl The result of the configuration is one of three cases: dnl 1) GNU gettext, as included in the intl subdirectory, will be compiled dnl and used. dnl Catalog format: GNU --> install in $(datadir) dnl Catalog extension: .mo after installation, .gmo in source tree dnl 2) GNU gettext has been found in the system's C library. dnl Catalog format: GNU --> install in $(datadir) dnl Catalog extension: .mo after installation, .gmo in source tree dnl 3) No internationalization, always use English msgid. dnl Catalog format: none dnl Catalog extension: none dnl If INTLSYMBOL is 'external', only cases 2 and 3 can occur. dnl The use of .gmo is historical (it was needed to avoid overwriting the dnl GNU format catalogs when building on a platform with an X/Open gettext), dnl but we keep it in order not to force irrelevant filename changes on the dnl maintainers. dnl AC_DEFUN([AM_GNU_GETTEXT], [ dnl Argument checking. ifelse([$1], [], , [ifelse([$1], [external], , [ifelse([$1], [no-libtool], , [ifelse([$1], [use-libtool], , [errprint([ERROR: invalid first argument to AM_GNU_GETTEXT ])])])])]) ifelse(ifelse([$1], [], [old])[]ifelse([$1], [no-libtool], [old]), [old], [AC_DIAGNOSE([obsolete], [Use of AM_GNU_GETTEXT without [external] argument is deprecated.])]) ifelse([$2], [], , [ifelse([$2], [need-ngettext], , [ifelse([$2], [need-formatstring-macros], , [errprint([ERROR: invalid second argument to AM_GNU_GETTEXT ])])])]) define([gt_included_intl], ifelse([$1], [external], ifdef([AM_GNU_GETTEXT_][INTL_SUBDIR], [yes], [no]), [yes])) define([gt_libtool_suffix_prefix], ifelse([$1], [use-libtool], [l], [])) gt_NEEDS_INIT AM_GNU_GETTEXT_NEED([$2]) AC_REQUIRE([AM_PO_SUBDIRS])dnl ifelse(gt_included_intl, yes, [ AC_REQUIRE([AM_INTL_SUBDIR])dnl ]) dnl Prerequisites of AC_LIB_LINKFLAGS_BODY. AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) AC_REQUIRE([AC_LIB_RPATH]) dnl Sometimes libintl requires libiconv, so first search for libiconv. dnl Ideally we would do this search only after the dnl if test "$USE_NLS" = "yes"; then dnl if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then dnl tests. But if configure.in invokes AM_ICONV after AM_GNU_GETTEXT dnl the configure script would need to contain the same shell code dnl again, outside any 'if'. There are two solutions: dnl - Invoke AM_ICONV_LINKFLAGS_BODY here, outside any 'if'. dnl - Control the expansions in more detail using AC_PROVIDE_IFELSE. dnl Since AC_PROVIDE_IFELSE is only in autoconf >= 2.52 and not dnl documented, we avoid it. ifelse(gt_included_intl, yes, , [ AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY]) ]) dnl Sometimes, on Mac OS X, libintl requires linking with CoreFoundation. gt_INTL_MACOSX dnl Set USE_NLS. AC_REQUIRE([AM_NLS]) ifelse(gt_included_intl, yes, [ BUILD_INCLUDED_LIBINTL=no USE_INCLUDED_LIBINTL=no ]) LIBINTL= LTLIBINTL= POSUB= dnl Add a version number to the cache macros. case " $gt_needs " in *" need-formatstring-macros "*) gt_api_version=3 ;; *" need-ngettext "*) gt_api_version=2 ;; *) gt_api_version=1 ;; esac gt_func_gnugettext_libc="gt_cv_func_gnugettext${gt_api_version}_libc" gt_func_gnugettext_libintl="gt_cv_func_gnugettext${gt_api_version}_libintl" dnl If we use NLS figure out what method if test "$USE_NLS" = "yes"; then gt_use_preinstalled_gnugettext=no ifelse(gt_included_intl, yes, [ AC_MSG_CHECKING([whether included gettext is requested]) AC_ARG_WITH([included-gettext], [ --with-included-gettext use the GNU gettext library included here], nls_cv_force_use_gnu_gettext=$withval, nls_cv_force_use_gnu_gettext=no) AC_MSG_RESULT([$nls_cv_force_use_gnu_gettext]) nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext" if test "$nls_cv_force_use_gnu_gettext" != "yes"; then ]) dnl User does not insist on using GNU NLS library. Figure out what dnl to use. If GNU gettext is available we use this. Else we have dnl to fall back to GNU NLS library. if test $gt_api_version -ge 3; then gt_revision_test_code=' #ifndef __GNU_GETTEXT_SUPPORTED_REVISION #define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) #endif changequote(,)dnl typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; changequote([,])dnl ' else gt_revision_test_code= fi if test $gt_api_version -ge 2; then gt_expression_test_code=' + * ngettext ("", "", 0)' else gt_expression_test_code= fi AC_CACHE_CHECK([for GNU gettext in libc], [$gt_func_gnugettext_libc], [AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[ #include $gt_revision_test_code extern int _nl_msg_cat_cntr; extern int *_nl_domain_bindings; ]], [[ bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_domain_bindings ]])], [eval "$gt_func_gnugettext_libc=yes"], [eval "$gt_func_gnugettext_libc=no"])]) if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then dnl Sometimes libintl requires libiconv, so first search for libiconv. ifelse(gt_included_intl, yes, , [ AM_ICONV_LINK ]) dnl Search for libintl and define LIBINTL, LTLIBINTL and INCINTL dnl accordingly. Don't use AC_LIB_LINKFLAGS_BODY([intl],[iconv]) dnl because that would add "-liconv" to LIBINTL and LTLIBINTL dnl even if libiconv doesn't exist. AC_LIB_LINKFLAGS_BODY([intl]) AC_CACHE_CHECK([for GNU gettext in libintl], [$gt_func_gnugettext_libintl], [gt_save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $INCINTL" gt_save_LIBS="$LIBS" LIBS="$LIBS $LIBINTL" dnl Now see whether libintl exists and does not depend on libiconv. AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[ #include $gt_revision_test_code extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias (const char *); ]], [[ bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("") ]])], [eval "$gt_func_gnugettext_libintl=yes"], [eval "$gt_func_gnugettext_libintl=no"]) dnl Now see whether libintl exists and depends on libiconv. if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" != yes; } && test -n "$LIBICONV"; then LIBS="$LIBS $LIBICONV" AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[ #include $gt_revision_test_code extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias (const char *); ]], [[ bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("") ]])], [LIBINTL="$LIBINTL $LIBICONV" LTLIBINTL="$LTLIBINTL $LTLIBICONV" eval "$gt_func_gnugettext_libintl=yes" ]) fi CPPFLAGS="$gt_save_CPPFLAGS" LIBS="$gt_save_LIBS"]) fi dnl If an already present or preinstalled GNU gettext() is found, dnl use it. But if this macro is used in GNU gettext, and GNU dnl gettext is already preinstalled in libintl, we update this dnl libintl. (Cf. the install rule in intl/Makefile.in.) if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" = "yes"; } \ || { { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; } \ && test "$PACKAGE" != gettext-runtime \ && test "$PACKAGE" != gettext-tools; }; then gt_use_preinstalled_gnugettext=yes else dnl Reset the values set by searching for libintl. LIBINTL= LTLIBINTL= INCINTL= fi ifelse(gt_included_intl, yes, [ if test "$gt_use_preinstalled_gnugettext" != "yes"; then dnl GNU gettext is not found in the C library. dnl Fall back on included GNU gettext library. nls_cv_use_gnu_gettext=yes fi fi if test "$nls_cv_use_gnu_gettext" = "yes"; then dnl Mark actions used to generate GNU NLS library. BUILD_INCLUDED_LIBINTL=yes USE_INCLUDED_LIBINTL=yes LIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LIBICONV $LIBTHREAD" LTLIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LTLIBICONV $LTLIBTHREAD" LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'` fi CATOBJEXT= if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then dnl Mark actions to use GNU gettext tools. CATOBJEXT=.gmo fi ]) if test -n "$INTL_MACOSX_LIBS"; then if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then dnl Some extra flags are needed during linking. LIBINTL="$LIBINTL $INTL_MACOSX_LIBS" LTLIBINTL="$LTLIBINTL $INTL_MACOSX_LIBS" fi fi if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then AC_DEFINE([ENABLE_NLS], [1], [Define to 1 if translation of program messages to the user's native language is requested.]) else USE_NLS=no fi fi AC_MSG_CHECKING([whether to use NLS]) AC_MSG_RESULT([$USE_NLS]) if test "$USE_NLS" = "yes"; then AC_MSG_CHECKING([where the gettext function comes from]) if test "$gt_use_preinstalled_gnugettext" = "yes"; then if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then gt_source="external libintl" else gt_source="libc" fi else gt_source="included intl directory" fi AC_MSG_RESULT([$gt_source]) fi if test "$USE_NLS" = "yes"; then if test "$gt_use_preinstalled_gnugettext" = "yes"; then if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then AC_MSG_CHECKING([how to link with libintl]) AC_MSG_RESULT([$LIBINTL]) AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCINTL]) fi dnl For backward compatibility. Some packages may be using this. AC_DEFINE([HAVE_GETTEXT], [1], [Define if the GNU gettext() function is already present or preinstalled.]) AC_DEFINE([HAVE_DCGETTEXT], [1], [Define if the GNU dcgettext() function is already present or preinstalled.]) fi dnl We need to process the po/ directory. POSUB=po fi ifelse(gt_included_intl, yes, [ dnl If this is used in GNU gettext we have to set BUILD_INCLUDED_LIBINTL dnl to 'yes' because some of the testsuite requires it. if test "$PACKAGE" = gettext-runtime || test "$PACKAGE" = gettext-tools; then BUILD_INCLUDED_LIBINTL=yes fi dnl Make all variables we use known to autoconf. AC_SUBST([BUILD_INCLUDED_LIBINTL]) AC_SUBST([USE_INCLUDED_LIBINTL]) AC_SUBST([CATOBJEXT]) dnl For backward compatibility. Some configure.ins may be using this. nls_cv_header_intl= nls_cv_header_libgt= dnl For backward compatibility. Some Makefiles may be using this. DATADIRNAME=share AC_SUBST([DATADIRNAME]) dnl For backward compatibility. Some Makefiles may be using this. INSTOBJEXT=.mo AC_SUBST([INSTOBJEXT]) dnl For backward compatibility. Some Makefiles may be using this. GENCAT=gencat AC_SUBST([GENCAT]) dnl For backward compatibility. Some Makefiles may be using this. INTLOBJS= if test "$USE_INCLUDED_LIBINTL" = yes; then INTLOBJS="\$(GETTOBJS)" fi AC_SUBST([INTLOBJS]) dnl Enable libtool support if the surrounding package wishes it. INTL_LIBTOOL_SUFFIX_PREFIX=gt_libtool_suffix_prefix AC_SUBST([INTL_LIBTOOL_SUFFIX_PREFIX]) ]) dnl For backward compatibility. Some Makefiles may be using this. INTLLIBS="$LIBINTL" AC_SUBST([INTLLIBS]) dnl Make all documented variables known to autoconf. AC_SUBST([LIBINTL]) AC_SUBST([LTLIBINTL]) AC_SUBST([POSUB]) ]) dnl gt_NEEDS_INIT ensures that the gt_needs variable is initialized. m4_define([gt_NEEDS_INIT], [ m4_divert_text([DEFAULTS], [gt_needs=]) m4_define([gt_NEEDS_INIT], []) ]) dnl Usage: AM_GNU_GETTEXT_NEED([NEEDSYMBOL]) AC_DEFUN([AM_GNU_GETTEXT_NEED], [ m4_divert_text([INIT_PREPARE], [gt_needs="$gt_needs $1"]) ]) dnl Usage: AM_GNU_GETTEXT_VERSION([gettext-version]) AC_DEFUN([AM_GNU_GETTEXT_VERSION], []) grub-2.14~git20250718.0e36779/m4/include_next.m40000644000175000017500000002103415036447602015250 00000000000000# include_next.m4 serial 26 dnl Copyright (C) 2006-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Paul Eggert and Derek Price. dnl Sets INCLUDE_NEXT, INCLUDE_NEXT_AS_FIRST_DIRECTIVE, PRAGMA_SYSTEM_HEADER, dnl and PRAGMA_COLUMNS. dnl dnl INCLUDE_NEXT expands to 'include_next' if the compiler supports it, or to dnl 'include' otherwise. dnl dnl INCLUDE_NEXT_AS_FIRST_DIRECTIVE expands to 'include_next' if the compiler dnl supports it in the special case that it is the first include directive in dnl the given file, or to 'include' otherwise. dnl dnl PRAGMA_SYSTEM_HEADER can be used in files that contain #include_next, dnl so as to avoid GCC warnings when the gcc option -pedantic is used. dnl '#pragma GCC system_header' has the same effect as if the file was found dnl through the include search path specified with '-isystem' options (as dnl opposed to the search path specified with '-I' options). Namely, gcc dnl does not warn about some things, and on some systems (Solaris and Interix) dnl __STDC__ evaluates to 0 instead of to 1. The latter is an undesired side dnl effect; we are therefore careful to use 'defined __STDC__' or '1' instead dnl of plain '__STDC__'. dnl dnl PRAGMA_COLUMNS can be used in files that override system header files, so dnl as to avoid compilation errors on HP NonStop systems when the gnulib file dnl is included by a system header file that does a "#pragma COLUMNS 80" (which dnl has the effect of truncating the lines of that file and all files that it dnl includes to 80 columns) and the gnulib file has lines longer than 80 dnl columns. AC_DEFUN([gl_INCLUDE_NEXT], [ AC_LANG_PREPROC_REQUIRE() AC_CACHE_CHECK([whether the preprocessor supports include_next], [gl_cv_have_include_next], [rm -rf conftestd1a conftestd1b conftestd2 mkdir conftestd1a conftestd1b conftestd2 dnl IBM C 9.0, 10.1 (original versions, prior to the 2009-01 updates) on dnl AIX 6.1 support include_next when used as first preprocessor directive dnl in a file, but not when preceded by another include directive. Check dnl for this bug by including . dnl Additionally, with this same compiler, include_next is a no-op when dnl used in a header file that was included by specifying its absolute dnl file name. Despite these two bugs, include_next is used in the dnl compiler's . By virtue of the second bug, we need to use dnl include_next as well in this case. cat < conftestd1a/conftest.h #define DEFINED_IN_CONFTESTD1 #include_next #ifdef DEFINED_IN_CONFTESTD2 int foo; #else #error "include_next doesn't work" #endif EOF cat < conftestd1b/conftest.h #define DEFINED_IN_CONFTESTD1 #include #include_next #ifdef DEFINED_IN_CONFTESTD2 int foo; #else #error "include_next doesn't work" #endif EOF cat < conftestd2/conftest.h #ifndef DEFINED_IN_CONFTESTD1 #error "include_next test doesn't work" #endif #define DEFINED_IN_CONFTESTD2 EOF gl_save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$gl_save_CPPFLAGS -Iconftestd1b -Iconftestd2" dnl We intentionally avoid using AC_LANG_SOURCE here. AC_COMPILE_IFELSE([AC_LANG_DEFINES_PROVIDED[#include ]], [gl_cv_have_include_next=yes], [CPPFLAGS="$gl_save_CPPFLAGS -Iconftestd1a -Iconftestd2" AC_COMPILE_IFELSE([AC_LANG_DEFINES_PROVIDED[#include ]], [gl_cv_have_include_next=buggy], [gl_cv_have_include_next=no]) ]) CPPFLAGS="$gl_save_CPPFLAGS" rm -rf conftestd1a conftestd1b conftestd2 ]) PRAGMA_SYSTEM_HEADER= if test $gl_cv_have_include_next = yes; then INCLUDE_NEXT=include_next INCLUDE_NEXT_AS_FIRST_DIRECTIVE=include_next if test -n "$GCC"; then PRAGMA_SYSTEM_HEADER='#pragma GCC system_header' fi else if test $gl_cv_have_include_next = buggy; then INCLUDE_NEXT=include INCLUDE_NEXT_AS_FIRST_DIRECTIVE=include_next else INCLUDE_NEXT=include INCLUDE_NEXT_AS_FIRST_DIRECTIVE=include fi fi AC_SUBST([INCLUDE_NEXT]) AC_SUBST([INCLUDE_NEXT_AS_FIRST_DIRECTIVE]) AC_SUBST([PRAGMA_SYSTEM_HEADER]) dnl HP NonStop systems, which define __TANDEM, limit the line length dnl after including some system header files. AC_CACHE_CHECK([whether source code line length is unlimited], [gl_cv_source_line_length_unlimited], [AC_EGREP_CPP([choke me], [ #ifdef __TANDEM choke me #endif ], [gl_cv_source_line_length_unlimited=no], [gl_cv_source_line_length_unlimited=yes]) ]) if test $gl_cv_source_line_length_unlimited = no; then PRAGMA_COLUMNS="#pragma COLUMNS 10000" else PRAGMA_COLUMNS= fi AC_SUBST([PRAGMA_COLUMNS]) ]) # gl_CHECK_NEXT_HEADERS(HEADER1 HEADER2 ...) # ------------------------------------------ # For each arg foo.h, if #include_next works, define NEXT_FOO_H to be # ''; otherwise define it to be # '"///usr/include/foo.h"', or whatever other absolute file name is suitable. # Also, if #include_next works as first preprocessing directive in a file, # define NEXT_AS_FIRST_DIRECTIVE_FOO_H to be ''; otherwise define it to # be # '"///usr/include/foo.h"', or whatever other absolute file name is suitable. # That way, a header file with the following line: # #@INCLUDE_NEXT@ @NEXT_FOO_H@ # or # #@INCLUDE_NEXT_AS_FIRST_DIRECTIVE@ @NEXT_AS_FIRST_DIRECTIVE_FOO_H@ # behaves (after sed substitution) as if it contained # #include_next # even if the compiler does not support include_next. # The three "///" are to pacify Sun C 5.8, which otherwise would say # "warning: #include of /usr/include/... may be non-portable". # Use '""', not '<>', so that the /// cannot be confused with a C99 comment. # Note: This macro assumes that the header file is not empty after # preprocessing, i.e. it does not only define preprocessor macros but also # provides some type/enum definitions or function/variable declarations. # # This macro also checks whether each header exists, by invoking # AC_CHECK_HEADERS_ONCE or AC_CHECK_HEADERS on each argument. AC_DEFUN([gl_CHECK_NEXT_HEADERS], [ gl_NEXT_HEADERS_INTERNAL([$1], [check]) ]) # gl_NEXT_HEADERS(HEADER1 HEADER2 ...) # ------------------------------------ # Like gl_CHECK_NEXT_HEADERS, except do not check whether the headers exist. # This is suitable for headers like that are standardized by C89 # and therefore can be assumed to exist. AC_DEFUN([gl_NEXT_HEADERS], [ gl_NEXT_HEADERS_INTERNAL([$1], [assume]) ]) # The guts of gl_CHECK_NEXT_HEADERS and gl_NEXT_HEADERS. AC_DEFUN([gl_NEXT_HEADERS_INTERNAL], [ AC_REQUIRE([gl_INCLUDE_NEXT]) AC_REQUIRE([AC_CANONICAL_HOST]) m4_if([$2], [check], [AC_CHECK_HEADERS_ONCE([$1]) ]) m4_foreach_w([gl_HEADER_NAME], [$1], [AS_VAR_PUSHDEF([gl_next_header], [gl_cv_next_]m4_defn([gl_HEADER_NAME])) if test $gl_cv_have_include_next = yes; then AS_VAR_SET([gl_next_header], ['<'gl_HEADER_NAME'>']) else AC_CACHE_CHECK( [absolute name of <]m4_defn([gl_HEADER_NAME])[>], [gl_next_header], [m4_if([$2], [check], [AS_VAR_PUSHDEF([gl_header_exists], [ac_cv_header_]m4_defn([gl_HEADER_NAME])) if test AS_VAR_GET([gl_header_exists]) = yes; then AS_VAR_POPDEF([gl_header_exists]) ]) gl_ABSOLUTE_HEADER_ONE(gl_HEADER_NAME) AS_VAR_COPY([gl_header], [gl_cv_absolute_]AS_TR_SH(gl_HEADER_NAME)) AS_VAR_SET([gl_next_header], ['"'$gl_header'"']) m4_if([$2], [check], [else AS_VAR_SET([gl_next_header], ['<'gl_HEADER_NAME'>']) fi ]) ]) fi AC_SUBST( AS_TR_CPP([NEXT_]m4_defn([gl_HEADER_NAME])), [AS_VAR_GET([gl_next_header])]) if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next' gl_next_as_first_directive='<'gl_HEADER_NAME'>' else # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include' gl_next_as_first_directive=AS_VAR_GET([gl_next_header]) fi AC_SUBST( AS_TR_CPP([NEXT_AS_FIRST_DIRECTIVE_]m4_defn([gl_HEADER_NAME])), [$gl_next_as_first_directive]) AS_VAR_POPDEF([gl_next_header])]) ]) # Autoconf 2.68 added warnings for our use of AC_COMPILE_IFELSE; # this fallback is safe for all earlier autoconf versions. m4_define_default([AC_LANG_DEFINES_PROVIDED]) grub-2.14~git20250718.0e36779/m4/wcrtomb.m40000644000175000017500000001103515036447602014244 00000000000000# wcrtomb.m4 serial 17 dnl Copyright (C) 2008-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_WCRTOMB], [ AC_REQUIRE([gl_WCHAR_H_DEFAULTS]) AC_REQUIRE([AC_TYPE_MBSTATE_T]) gl_MBSTATE_T_BROKEN AC_CHECK_FUNCS_ONCE([wcrtomb]) if test $ac_cv_func_wcrtomb = no; then HAVE_WCRTOMB=0 AC_CHECK_DECLS([wcrtomb],,, [[ #include ]]) if test $ac_cv_have_decl_wcrtomb = yes; then dnl On Minix 3.1.8, the system's declares wcrtomb() although dnl it does not have the function. Avoid a collision with gnulib's dnl replacement. REPLACE_WCRTOMB=1 fi else dnl We don't actually need to override wcrtomb when redefining the semantics dnl of the mbstate_t type. Tested on 32-bit AIX. dnl if test $REPLACE_MBSTATE_T = 1; then dnl REPLACE_WCRTOMB=1 dnl fi if test $REPLACE_WCRTOMB = 0; then dnl On Android 4.3, wcrtomb produces wrong characters in the C locale. dnl On AIX 4.3, OSF/1 5.1 and Solaris <= 11.3, wcrtomb (NULL, 0, NULL) dnl sometimes returns 0 instead of 1. AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([gt_LOCALE_FR]) AC_REQUIRE([gt_LOCALE_FR_UTF8]) AC_REQUIRE([gt_LOCALE_JA]) AC_REQUIRE([gt_LOCALE_ZH_CN]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether wcrtomb works in the C locale], [gl_cv_func_wcrtomb_works], [AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include #include int main () { mbstate_t state; char out[64]; int count; memset (&state, 0, sizeof (state)); out[0] = 'x'; count = wcrtomb (out, L'a', &state); return !(count == 1 && out[0] == 'a'); }]])], [gl_cv_func_wcrtomb_works=yes], [gl_cv_func_wcrtomb_works=no], [case "$host_os" in # Guess no on Android. linux*-android*) gl_cv_func_wcrtomb_works="guessing no";; # Guess yes otherwise. *) gl_cv_func_wcrtomb_works="guessing yes";; esac ]) ]) case "$gl_cv_func_wcrtomb_works" in *yes) ;; *) AC_DEFINE([WCRTOMB_C_LOCALE_BUG], [1], [Define if the wcrtomb function does not work in the C locale.]) REPLACE_WCRTOMB=1 ;; esac fi if test $REPLACE_WCRTOMB = 0; then AC_CACHE_CHECK([whether wcrtomb return value is correct], [gl_cv_func_wcrtomb_retval], [ dnl Initial guess, used when cross-compiling or when no suitable locale dnl is present. changequote(,)dnl case "$host_os" in # Guess no on AIX 4, OSF/1, Solaris, native Windows. aix4* | osf* | solaris* | mingw*) gl_cv_func_wcrtomb_retval="guessing no" ;; # Guess yes otherwise. *) gl_cv_func_wcrtomb_retval="guessing yes" ;; esac changequote([,])dnl if test $LOCALE_FR != none || test $LOCALE_FR_UTF8 != none || test $LOCALE_JA != none || test $LOCALE_ZH_CN != none; then AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include #include #include int main () { int result = 0; if (setlocale (LC_ALL, "$LOCALE_FR") != NULL) { if (wcrtomb (NULL, 0, NULL) != 1) result |= 1; } if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL) { if (wcrtomb (NULL, 0, NULL) != 1) result |= 2; { wchar_t wc = (wchar_t) 0xBADFACE; if (mbtowc (&wc, "\303\274", 2) == 2) if (wcrtomb (NULL, wc, NULL) != 1) result |= 2; } } if (setlocale (LC_ALL, "$LOCALE_JA") != NULL) { if (wcrtomb (NULL, 0, NULL) != 1) result |= 4; } if (setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL) { if (wcrtomb (NULL, 0, NULL) != 1) result |= 8; } return result; }]])], [gl_cv_func_wcrtomb_retval=yes], [gl_cv_func_wcrtomb_retval=no], [:]) fi ]) case "$gl_cv_func_wcrtomb_retval" in *yes) ;; *) AC_DEFINE([WCRTOMB_RETVAL_BUG], [1], [Define if the wcrtomb function has an incorrect return value.]) REPLACE_WCRTOMB=1 ;; esac fi fi ]) # Prerequisites of lib/wcrtomb.c. AC_DEFUN([gl_PREREQ_WCRTOMB], [ : ]) grub-2.14~git20250718.0e36779/m4/fchdir.m40000644000175000017500000000457415036447602014040 00000000000000# fchdir.m4 serial 27 dnl Copyright (C) 2006-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_FCHDIR], [ AC_REQUIRE([gl_UNISTD_H_DEFAULTS]) AC_REQUIRE([gl_DIRENT_H_DEFAULTS]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CHECK_DECLS_ONCE([fchdir]) if test $ac_cv_have_decl_fchdir = no; then HAVE_DECL_FCHDIR=0 fi AC_REQUIRE([gl_TEST_FCHDIR]) if test $HAVE_FCHDIR = 0; then AC_DEFINE([REPLACE_FCHDIR], [1], [Define to 1 if gnulib's fchdir() replacement is used.]) dnl We must also replace anything that can manipulate a directory fd, dnl to keep our bookkeeping up-to-date. We don't have to replace dnl fstatat, since no platform has fstatat but lacks fchdir. AC_CACHE_CHECK([whether open can visit directories], [gl_cv_func_open_directory_works], [AC_RUN_IFELSE( [AC_LANG_PROGRAM( [[#include ]GL_MDA_DEFINES], [[return open(".", O_RDONLY) < 0;]])], [gl_cv_func_open_directory_works=yes], [gl_cv_func_open_directory_works=no], [case "$host_os" in # Guess yes on Linux systems. linux-* | linux) gl_cv_func_open_directory_works="guessing yes" ;; # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_open_directory_works="guessing yes" ;; # Guess no on native Windows. mingw*) gl_cv_func_open_directory_works="guessing no" ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_open_directory_works="$gl_cross_guess_normal" ;; esac ])]) case "$gl_cv_func_open_directory_works" in *yes) ;; *) AC_DEFINE([REPLACE_OPEN_DIRECTORY], [1], [Define to 1 if open() should work around the inability to open a directory.]) ;; esac fi ]) # Determine whether to use the overrides in lib/fchdir.c. AC_DEFUN([gl_TEST_FCHDIR], [ AC_REQUIRE([gl_UNISTD_H_DEFAULTS]) AC_CHECK_FUNCS_ONCE([fchdir]) if test $ac_cv_func_fchdir = no; then HAVE_FCHDIR=0 fi ]) # Prerequisites of lib/fchdir.c. AC_DEFUN([gl_PREREQ_FCHDIR], [:]) grub-2.14~git20250718.0e36779/m4/stdint_h.m40000644000175000017500000000174315036447602014410 00000000000000# stdint_h.m4 serial 9 dnl Copyright (C) 1997-2004, 2006, 2008-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Paul Eggert. # Define HAVE_STDINT_H_WITH_UINTMAX if exists, # doesn't clash with , and declares uintmax_t. AC_DEFUN([gl_AC_HEADER_STDINT_H], [ AC_CACHE_CHECK([for stdint.h], [gl_cv_header_stdint_h], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#include #include ]], [[uintmax_t i = (uintmax_t) -1; return !i;]])], [gl_cv_header_stdint_h=yes], [gl_cv_header_stdint_h=no])]) if test $gl_cv_header_stdint_h = yes; then AC_DEFINE_UNQUOTED([HAVE_STDINT_H_WITH_UINTMAX], [1], [Define if exists, doesn't clash with , and declares uintmax_t. ]) fi ]) grub-2.14~git20250718.0e36779/m4/largefile.m40000644000175000017500000001520015036447602014517 00000000000000# Enable large files on systems where this is not the default. # Enable support for files on Linux file systems with 64-bit inode numbers. # Copyright 1992-1996, 1998-2022 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # The following macro works around a problem in Autoconf's AC_FUNC_FSEEKO: # It does not set _LARGEFILE_SOURCE=1 on HP-UX/ia64 32-bit, although this # setting of _LARGEFILE_SOURCE is needed so that declares fseeko # and ftello in C++ mode as well. AC_DEFUN([gl_SET_LARGEFILE_SOURCE], [ AC_REQUIRE([AC_CANONICAL_HOST]) AC_FUNC_FSEEKO case "$host_os" in hpux*) AC_DEFINE([_LARGEFILE_SOURCE], [1], [Define to 1 to make fseeko visible on some hosts (e.g. glibc 2.2).]) ;; esac ]) # Work around a problem in Autoconf through at least 2.71 on glibc 2.34+ # with _TIME_BITS. Also, work around a problem in autoconf <= 2.69: # AC_SYS_LARGEFILE does not configure for large inodes on Mac OS X 10.5, # or configures them incorrectly in some cases. m4_version_prereq([2.70], [], [ # _AC_SYS_LARGEFILE_TEST_INCLUDES # ------------------------------- m4_define([_AC_SYS_LARGEFILE_TEST_INCLUDES], [#include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31)) int off_t_is_large[[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]];[]dnl ]) ])# m4_version_prereq 2.70 # _AC_SYS_LARGEFILE_MACRO_VALUE(C-MACRO, VALUE, # CACHE-VAR, # DESCRIPTION, # PROLOGUE, [FUNCTION-BODY]) # -------------------------------------------------------- m4_define([_AC_SYS_LARGEFILE_MACRO_VALUE], [AC_CACHE_CHECK([for $1 value needed for large files], [$3], [while :; do m4_ifval([$6], [AC_LINK_IFELSE], [AC_COMPILE_IFELSE])( [AC_LANG_PROGRAM([$5], [$6])], [$3=no; break]) m4_ifval([$6], [AC_LINK_IFELSE], [AC_COMPILE_IFELSE])( [AC_LANG_PROGRAM([#undef $1 #define $1 $2 $5], [$6])], [$3=$2; break]) $3=unknown break done]) case $$3 in #( no | unknown) ;; *) AC_DEFINE_UNQUOTED([$1], [$$3], [$4]);; esac rm -rf conftest*[]dnl ])# _AC_SYS_LARGEFILE_MACRO_VALUE # AC_SYS_LARGEFILE # ---------------- # By default, many hosts won't let programs access large files; # one must use special compiler options to get large-file access to work. # For more details about this brain damage please see: # http://www.unix.org/version2/whatsnew/lfs20mar.html # Additionally, on Linux file systems with 64-bit inodes a file that happens # to have a 64-bit inode number cannot be accessed by 32-bit applications on # Linux x86/x86_64. This can occur with file systems such as XFS and NFS. AC_DEFUN([AC_SYS_LARGEFILE], [AC_ARG_ENABLE(largefile, [ --disable-largefile omit support for large files]) AS_IF([test "$enable_largefile" != no], [AC_CACHE_CHECK([for special C compiler options needed for large files], ac_cv_sys_largefile_CC, [ac_cv_sys_largefile_CC=no if test "$GCC" != yes; then ac_save_CC=$CC while :; do # IRIX 6.2 and later do not support large files by default, # so use the C compiler's -n32 option if that helps. AC_LANG_CONFTEST([AC_LANG_PROGRAM([_AC_SYS_LARGEFILE_TEST_INCLUDES])]) AC_COMPILE_IFELSE([], [break]) CC="$CC -n32" AC_COMPILE_IFELSE([], [ac_cv_sys_largefile_CC=' -n32'; break]) break done CC=$ac_save_CC rm -f conftest.$ac_ext fi]) if test "$ac_cv_sys_largefile_CC" != no; then CC=$CC$ac_cv_sys_largefile_CC fi _AC_SYS_LARGEFILE_MACRO_VALUE(_FILE_OFFSET_BITS, 64, ac_cv_sys_file_offset_bits, [Number of bits in a file offset, on hosts where this is settable.], [_AC_SYS_LARGEFILE_TEST_INCLUDES]) AS_CASE([$ac_cv_sys_file_offset_bits], [unknown], [_AC_SYS_LARGEFILE_MACRO_VALUE([_LARGE_FILES], [1], [ac_cv_sys_large_files], [Define for large files, on AIX-style hosts.], [_AC_SYS_LARGEFILE_TEST_INCLUDES])], [64], [gl_YEAR2038_BODY([])])]) ])# AC_SYS_LARGEFILE # Enable large files on systems where this is implemented by Gnulib, not by the # system headers. # Set the variables WINDOWS_64_BIT_OFF_T, WINDOWS_64_BIT_ST_SIZE if Gnulib # overrides ensure that off_t or 'struct size.st_size' are 64-bit, respectively. AC_DEFUN([gl_LARGEFILE], [ AC_REQUIRE([AC_CANONICAL_HOST]) case "$host_os" in mingw*) dnl Native Windows. dnl mingw64 defines off_t to a 64-bit type already, if dnl _FILE_OFFSET_BITS=64, which is ensured by AC_SYS_LARGEFILE. AC_CACHE_CHECK([for 64-bit off_t], [gl_cv_type_off_t_64], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#include int verify_off_t_size[sizeof (off_t) >= 8 ? 1 : -1]; ]], [[]])], [gl_cv_type_off_t_64=yes], [gl_cv_type_off_t_64=no]) ]) if test $gl_cv_type_off_t_64 = no; then WINDOWS_64_BIT_OFF_T=1 else WINDOWS_64_BIT_OFF_T=0 fi dnl Some mingw versions define, if _FILE_OFFSET_BITS=64, 'struct stat' dnl to 'struct _stat32i64' or 'struct _stat64' (depending on dnl _USE_32BIT_TIME_T), which has a 32-bit st_size member. AC_CACHE_CHECK([for 64-bit st_size], [gl_cv_member_st_size_64], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#include struct stat buf; int verify_st_size_size[sizeof (buf.st_size) >= 8 ? 1 : -1]; ]], [[]])], [gl_cv_member_st_size_64=yes], [gl_cv_member_st_size_64=no]) ]) if test $gl_cv_member_st_size_64 = no; then WINDOWS_64_BIT_ST_SIZE=1 else WINDOWS_64_BIT_ST_SIZE=0 fi ;; *) dnl Nothing to do on gnulib's side. dnl A 64-bit off_t is dnl - already the default on Mac OS X, FreeBSD, NetBSD, OpenBSD, IRIX, dnl OSF/1, Cygwin, dnl - enabled by _FILE_OFFSET_BITS=64 (ensured by AC_SYS_LARGEFILE) on dnl glibc, HP-UX, Solaris, dnl - enabled by _LARGE_FILES=1 (ensured by AC_SYS_LARGEFILE) on AIX, dnl - impossible to achieve on Minix 3.1.8. WINDOWS_64_BIT_OFF_T=0 WINDOWS_64_BIT_ST_SIZE=0 ;; esac ]) grub-2.14~git20250718.0e36779/m4/mbsrtowcs.m40000644000175000017500000001027015036447602014612 00000000000000# mbsrtowcs.m4 serial 14 dnl Copyright (C) 2008-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_MBSRTOWCS], [ AC_REQUIRE([gl_WCHAR_H_DEFAULTS]) AC_REQUIRE([AC_TYPE_MBSTATE_T]) gl_MBSTATE_T_BROKEN AC_CHECK_FUNCS_ONCE([mbsrtowcs]) if test $ac_cv_func_mbsrtowcs = no; then HAVE_MBSRTOWCS=0 AC_CHECK_DECLS([mbsrtowcs],,, [[ #include ]]) if test $ac_cv_have_decl_mbsrtowcs = yes; then dnl On Minix 3.1.8, the system's declares mbsrtowcs() although dnl it does not have the function. Avoid a collision with gnulib's dnl replacement. REPLACE_MBSRTOWCS=1 fi else if test $REPLACE_MBSTATE_T = 1; then REPLACE_MBSRTOWCS=1 else gl_MBSRTOWCS_WORKS case "$gl_cv_func_mbsrtowcs_works" in *yes) ;; *) REPLACE_MBSRTOWCS=1 ;; esac fi fi ]) dnl Test whether mbsrtowcs works. dnl Result is gl_cv_func_mbsrtowcs_works. AC_DEFUN([gl_MBSRTOWCS_WORKS], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([gt_LOCALE_FR]) AC_REQUIRE([gt_LOCALE_FR_UTF8]) AC_REQUIRE([gt_LOCALE_JA]) AC_REQUIRE([gt_LOCALE_ZH_CN]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether mbsrtowcs works], [gl_cv_func_mbsrtowcs_works], [ dnl Initial guess, used when cross-compiling or when no suitable locale dnl is present. changequote(,)dnl case "$host_os" in # Guess no on HP-UX, Solaris, mingw. hpux* | solaris* | mingw*) gl_cv_func_mbsrtowcs_works="guessing no" ;; # Guess yes otherwise. *) gl_cv_func_mbsrtowcs_works="guessing yes" ;; esac changequote([,])dnl if test $LOCALE_FR != none || test $LOCALE_FR_UTF8 != none || test $LOCALE_JA != none || test $LOCALE_ZH_CN != none; then AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include #include int main () { int result = 0; /* Test whether the function supports a NULL destination argument. This fails on native Windows. */ if (setlocale (LC_ALL, "$LOCALE_FR") != NULL) { const char input[] = "\337er"; const char *src = input; mbstate_t state; memset (&state, '\0', sizeof (mbstate_t)); if (mbsrtowcs (NULL, &src, 1, &state) != 3 || src != input) result |= 1; } /* Test whether the function works when started with a conversion state in non-initial state. This fails on HP-UX 11.11 and Solaris 10. */ if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL) { const char input[] = "B\303\274\303\237er"; mbstate_t state; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (NULL, input + 1, 1, &state) == (size_t)(-2)) if (!mbsinit (&state)) { const char *src = input + 2; if (mbsrtowcs (NULL, &src, 10, &state) != 4) result |= 2; } } if (setlocale (LC_ALL, "$LOCALE_JA") != NULL) { const char input[] = "<\306\374\313\334\270\354>"; mbstate_t state; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (NULL, input + 3, 1, &state) == (size_t)(-2)) if (!mbsinit (&state)) { const char *src = input + 4; if (mbsrtowcs (NULL, &src, 10, &state) != 3) result |= 4; } } if (setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL) { const char input[] = "B\250\271\201\060\211\070er"; mbstate_t state; memset (&state, '\0', sizeof (mbstate_t)); if (mbrtowc (NULL, input + 1, 1, &state) == (size_t)(-2)) if (!mbsinit (&state)) { const char *src = input + 2; if (mbsrtowcs (NULL, &src, 10, &state) != 4) result |= 8; } } return result; }]])], [gl_cv_func_mbsrtowcs_works=yes], [gl_cv_func_mbsrtowcs_works=no], [:]) fi ]) ]) # Prerequisites of lib/mbsrtowcs.c. AC_DEFUN([gl_PREREQ_MBSRTOWCS], [ : ]) grub-2.14~git20250718.0e36779/m4/visibility.m40000644000175000017500000000662215036447602014764 00000000000000# visibility.m4 serial 8 dnl Copyright (C) 2005, 2008, 2010-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. dnl Tests whether the compiler supports the command-line option dnl -fvisibility=hidden and the function and variable attributes dnl __attribute__((__visibility__("hidden"))) and dnl __attribute__((__visibility__("default"))). dnl Does *not* test for __visibility__("protected") - which has tricky dnl semantics (see the 'vismain' test in glibc) and does not exist e.g. on dnl Mac OS X. dnl Does *not* test for __visibility__("internal") - which has processor dnl dependent semantics. dnl Does *not* test for #pragma GCC visibility push(hidden) - which is dnl "really only recommended for legacy code". dnl Set the variable CFLAG_VISIBILITY. dnl Defines and sets the variable HAVE_VISIBILITY. AC_DEFUN([gl_VISIBILITY], [ AC_REQUIRE([AC_PROG_CC]) CFLAG_VISIBILITY= HAVE_VISIBILITY=0 if test -n "$GCC"; then dnl First, check whether -Werror can be added to the command line, or dnl whether it leads to an error because of some other option that the dnl user has put into $CC $CFLAGS $CPPFLAGS. AC_CACHE_CHECK([whether the -Werror option is usable], [gl_cv_cc_vis_werror], [gl_save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -Werror" AC_COMPILE_IFELSE( [AC_LANG_PROGRAM([[]], [[]])], [gl_cv_cc_vis_werror=yes], [gl_cv_cc_vis_werror=no]) CFLAGS="$gl_save_CFLAGS" ]) dnl Now check whether visibility declarations are supported. AC_CACHE_CHECK([for simple visibility declarations], [gl_cv_cc_visibility], [gl_save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -fvisibility=hidden" dnl We use the option -Werror and a function dummyfunc, because on some dnl platforms (Cygwin 1.7) the use of -fvisibility triggers a warning dnl "visibility attribute not supported in this configuration; ignored" dnl at the first function definition in every compilation unit, and we dnl don't want to use the option in this case. if test $gl_cv_cc_vis_werror = yes; then CFLAGS="$CFLAGS -Werror" fi AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[extern __attribute__((__visibility__("hidden"))) int hiddenvar; extern __attribute__((__visibility__("default"))) int exportedvar; extern __attribute__((__visibility__("hidden"))) int hiddenfunc (void); extern __attribute__((__visibility__("default"))) int exportedfunc (void); void dummyfunc (void); int hiddenvar; int exportedvar; int hiddenfunc (void) { return 51; } int exportedfunc (void) { return 1225736919; } void dummyfunc (void) {} ]], [[]])], [gl_cv_cc_visibility=yes], [gl_cv_cc_visibility=no]) CFLAGS="$gl_save_CFLAGS" ]) if test $gl_cv_cc_visibility = yes; then CFLAG_VISIBILITY="-fvisibility=hidden" HAVE_VISIBILITY=1 fi fi AC_SUBST([CFLAG_VISIBILITY]) AC_SUBST([HAVE_VISIBILITY]) AC_DEFINE_UNQUOTED([HAVE_VISIBILITY], [$HAVE_VISIBILITY], [Define to 1 or 0, depending whether the compiler supports simple visibility declarations.]) ]) grub-2.14~git20250718.0e36779/m4/extensions.m40000644000175000017500000002033315036447602014767 00000000000000# serial 22 -*- Autoconf -*- # Enable extensions on systems that normally disable them. # Copyright (C) 2003, 2006-2022 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. dnl Define to empty for the benefit of Autoconf 2.69 and earlier, so that dnl AC_USE_SYSTEM_EXTENSIONS (below) can be used unchanged from Autoconf 2.70+. m4_ifndef([AC_CHECK_INCLUDES_DEFAULT], [AC_DEFUN([AC_CHECK_INCLUDES_DEFAULT], [])]) # This definition of AC_USE_SYSTEM_EXTENSIONS is stolen from git # Autoconf. Perhaps we can remove this once we can assume Autoconf # is recent-enough everywhere, but since Autoconf mutates rapidly # enough in this area it's likely we'll need to redefine # AC_USE_SYSTEM_EXTENSIONS for quite some time. # If autoconf reports a warning # warning: AC_COMPILE_IFELSE was called before AC_USE_SYSTEM_EXTENSIONS # or warning: AC_RUN_IFELSE was called before AC_USE_SYSTEM_EXTENSIONS # the fix is # 1) to ensure that AC_USE_SYSTEM_EXTENSIONS is never directly invoked # but always AC_REQUIREd, # 2) to ensure that for each occurrence of # AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) # or # AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) # the corresponding gnulib module description has 'extensions' among # its dependencies. This will ensure that the gl_USE_SYSTEM_EXTENSIONS # invocation occurs in gl_EARLY, not in gl_INIT. m4_version_prereq([2.70.1], [], [ # AC_USE_SYSTEM_EXTENSIONS # ------------------------ # Enable extensions on systems that normally disable them, # typically due to standards-conformance issues. # We unconditionally define as many of the known feature-enabling # as possible, reserving conditional behavior for macros that are # known to cause problems on some platforms (such as __EXTENSIONS__). AC_DEFUN_ONCE([AC_USE_SYSTEM_EXTENSIONS], [AC_BEFORE([$0], [AC_PREPROC_IFELSE])dnl AC_BEFORE([$0], [AC_COMPILE_IFELSE])dnl AC_BEFORE([$0], [AC_LINK_IFELSE])dnl AC_BEFORE([$0], [AC_RUN_IFELSE])dnl AC_BEFORE([$0], [AC_CHECK_INCLUDES_DEFAULT])dnl dnl #undef in AH_VERBATIM gets replaced with #define by AC_DEFINE. dnl Use a different key than __EXTENSIONS__, as that name broke existing dnl configure.ac when using autoheader 2.62. dnl The macros below are in alphabetical order ignoring leading _ or __ dnl prefixes. AH_VERBATIM([USE_SYSTEM_EXTENSIONS], [/* Enable extensions on AIX 3, Interix. */ #ifndef _ALL_SOURCE # undef _ALL_SOURCE #endif /* Enable general extensions on macOS. */ #ifndef _DARWIN_C_SOURCE # undef _DARWIN_C_SOURCE #endif /* Enable general extensions on Solaris. */ #ifndef __EXTENSIONS__ # undef __EXTENSIONS__ #endif /* Enable GNU extensions on systems that have them. */ #ifndef _GNU_SOURCE # undef _GNU_SOURCE #endif /* Enable X/Open compliant socket functions that do not require linking with -lxnet on HP-UX 11.11. */ #ifndef _HPUX_ALT_XOPEN_SOCKET_API # undef _HPUX_ALT_XOPEN_SOCKET_API #endif /* Identify the host operating system as Minix. This macro does not affect the system headers' behavior. A future release of Autoconf may stop defining this macro. */ #ifndef _MINIX # undef _MINIX #endif /* Enable general extensions on NetBSD. Enable NetBSD compatibility extensions on Minix. */ #ifndef _NETBSD_SOURCE # undef _NETBSD_SOURCE #endif /* Enable OpenBSD compatibility extensions on NetBSD. Oddly enough, this does nothing on OpenBSD. */ #ifndef _OPENBSD_SOURCE # undef _OPENBSD_SOURCE #endif /* Define to 1 if needed for POSIX-compatible behavior. */ #ifndef _POSIX_SOURCE # undef _POSIX_SOURCE #endif /* Define to 2 if needed for POSIX-compatible behavior. */ #ifndef _POSIX_1_SOURCE # undef _POSIX_1_SOURCE #endif /* Enable POSIX-compatible threading on Solaris. */ #ifndef _POSIX_PTHREAD_SEMANTICS # undef _POSIX_PTHREAD_SEMANTICS #endif /* Enable extensions specified by ISO/IEC TS 18661-5:2014. */ #ifndef __STDC_WANT_IEC_60559_ATTRIBS_EXT__ # undef __STDC_WANT_IEC_60559_ATTRIBS_EXT__ #endif /* Enable extensions specified by ISO/IEC TS 18661-1:2014. */ #ifndef __STDC_WANT_IEC_60559_BFP_EXT__ # undef __STDC_WANT_IEC_60559_BFP_EXT__ #endif /* Enable extensions specified by ISO/IEC TS 18661-2:2015. */ #ifndef __STDC_WANT_IEC_60559_DFP_EXT__ # undef __STDC_WANT_IEC_60559_DFP_EXT__ #endif /* Enable extensions specified by ISO/IEC TS 18661-4:2015. */ #ifndef __STDC_WANT_IEC_60559_FUNCS_EXT__ # undef __STDC_WANT_IEC_60559_FUNCS_EXT__ #endif /* Enable extensions specified by ISO/IEC TS 18661-3:2015. */ #ifndef __STDC_WANT_IEC_60559_TYPES_EXT__ # undef __STDC_WANT_IEC_60559_TYPES_EXT__ #endif /* Enable extensions specified by ISO/IEC TR 24731-2:2010. */ #ifndef __STDC_WANT_LIB_EXT2__ # undef __STDC_WANT_LIB_EXT2__ #endif /* Enable extensions specified by ISO/IEC 24747:2009. */ #ifndef __STDC_WANT_MATH_SPEC_FUNCS__ # undef __STDC_WANT_MATH_SPEC_FUNCS__ #endif /* Enable extensions on HP NonStop. */ #ifndef _TANDEM_SOURCE # undef _TANDEM_SOURCE #endif /* Enable X/Open extensions. Define to 500 only if necessary to make mbstate_t available. */ #ifndef _XOPEN_SOURCE # undef _XOPEN_SOURCE #endif ])dnl AC_REQUIRE([AC_CHECK_INCLUDES_DEFAULT])dnl _AC_CHECK_HEADER_ONCE([wchar.h]) _AC_CHECK_HEADER_ONCE([minix/config.h]) dnl Defining __EXTENSIONS__ may break the system headers on some systems. dnl (FIXME: Which ones?) AC_CACHE_CHECK([whether it is safe to define __EXTENSIONS__], [ac_cv_safe_to_define___extensions__], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM([[ # define __EXTENSIONS__ 1 ]AC_INCLUDES_DEFAULT])], [ac_cv_safe_to_define___extensions__=yes], [ac_cv_safe_to_define___extensions__=no])]) dnl HP-UX 11.11 defines mbstate_t only if _XOPEN_SOURCE is defined to dnl 500, regardless of whether compiling with -Ae or -D_HPUX_SOURCE=1. dnl But defining _XOPEN_SOURCE may turn *off* extensions on platforms dnl not covered by turn-on-extensions macros (notably Dragonfly, Free, dnl and OpenBSD, which don't have any equivalent of _NETBSD_SOURCE) so dnl it should only be defined when necessary. AC_CACHE_CHECK([whether _XOPEN_SOURCE should be defined], [ac_cv_should_define__xopen_source], [ac_cv_should_define__xopen_source=no AS_IF([test $ac_cv_header_wchar_h = yes], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM([[ #include mbstate_t x;]])], [], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM([[ #define _XOPEN_SOURCE 500 #include mbstate_t x;]])], [ac_cv_should_define__xopen_source=yes])])])]) AC_DEFINE([_ALL_SOURCE]) AC_DEFINE([_DARWIN_C_SOURCE]) AC_DEFINE([_GNU_SOURCE]) AC_DEFINE([_HPUX_ALT_XOPEN_SOCKET_API]) AC_DEFINE([_NETBSD_SOURCE]) AC_DEFINE([_OPENBSD_SOURCE]) AC_DEFINE([_POSIX_PTHREAD_SEMANTICS]) AC_DEFINE([__STDC_WANT_IEC_60559_ATTRIBS_EXT__]) AC_DEFINE([__STDC_WANT_IEC_60559_BFP_EXT__]) AC_DEFINE([__STDC_WANT_IEC_60559_DFP_EXT__]) AC_DEFINE([__STDC_WANT_IEC_60559_FUNCS_EXT__]) AC_DEFINE([__STDC_WANT_IEC_60559_TYPES_EXT__]) AC_DEFINE([__STDC_WANT_LIB_EXT2__]) AC_DEFINE([__STDC_WANT_MATH_SPEC_FUNCS__]) AC_DEFINE([_TANDEM_SOURCE]) AS_IF([test $ac_cv_header_minix_config_h = yes], [MINIX=yes AC_DEFINE([_MINIX]) AC_DEFINE([_POSIX_SOURCE]) AC_DEFINE([_POSIX_1_SOURCE], [2])], [MINIX=]) AS_IF([test $ac_cv_safe_to_define___extensions__ = yes], [AC_DEFINE([__EXTENSIONS__])]) AS_IF([test $ac_cv_should_define__xopen_source = yes], [AC_DEFINE([_XOPEN_SOURCE], [500])]) ])# AC_USE_SYSTEM_EXTENSIONS ]) # gl_USE_SYSTEM_EXTENSIONS # ------------------------ # Enable extensions on systems that normally disable them, # typically due to standards-conformance issues. AC_DEFUN_ONCE([gl_USE_SYSTEM_EXTENSIONS], [ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) dnl On OpenBSD 6.8 with GCC, the include files contain a couple of dnl definitions that are only activated with an explicit -D_ISOC11_SOURCE. dnl That's because this version of GCC (4.2.1) supports the option dnl '-std=gnu99' but not the option '-std=gnu11'. AC_REQUIRE([AC_CANONICAL_HOST]) case "$host_os" in openbsd*) AC_DEFINE([_ISOC11_SOURCE], [1], [Define to enable the declarations of ISO C 11 types and functions.]) ;; esac ]) grub-2.14~git20250718.0e36779/m4/intl.m40000644000175000017500000002561015036447570013545 00000000000000# intl.m4 serial 25 (gettext-0.18.3) dnl Copyright (C) 1995-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1995-2000. dnl Bruno Haible , 2000-2009. AC_PREREQ([2.60]) dnl Checks for all prerequisites of the intl subdirectory, dnl except for INTL_LIBTOOL_SUFFIX_PREFIX (and possibly LIBTOOL), INTLOBJS, dnl USE_INCLUDED_LIBINTL, BUILD_INCLUDED_LIBINTL. AC_DEFUN([AM_INTL_SUBDIR], [ AC_REQUIRE([AC_PROG_INSTALL])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([gt_GLIBC2])dnl AC_REQUIRE([AC_PROG_RANLIB])dnl AC_REQUIRE([gl_VISIBILITY])dnl AC_REQUIRE([gt_INTL_SUBDIR_CORE])dnl AC_REQUIRE([AC_TYPE_LONG_LONG_INT])dnl AC_REQUIRE([gt_TYPE_WCHAR_T])dnl AC_REQUIRE([gt_TYPE_WINT_T])dnl AC_REQUIRE([gl_AC_HEADER_INTTYPES_H]) AC_REQUIRE([gt_TYPE_INTMAX_T]) AC_REQUIRE([gt_PRINTF_POSIX]) AC_REQUIRE([gl_GLIBC21])dnl AC_REQUIRE([gl_XSIZE])dnl AC_REQUIRE([gl_FCNTL_O_FLAGS])dnl AC_REQUIRE([gt_INTL_MACOSX])dnl AC_REQUIRE([gl_EXTERN_INLINE])dnl dnl Support for automake's --enable-silent-rules. case "$enable_silent_rules" in yes) INTL_DEFAULT_VERBOSITY=0;; no) INTL_DEFAULT_VERBOSITY=1;; *) INTL_DEFAULT_VERBOSITY=1;; esac AC_SUBST([INTL_DEFAULT_VERBOSITY]) AC_CHECK_TYPE([ptrdiff_t], , [AC_DEFINE([ptrdiff_t], [long], [Define as the type of the result of subtracting two pointers, if the system doesn't define it.]) ]) AC_CHECK_HEADERS([features.h stddef.h stdlib.h string.h]) AC_CHECK_FUNCS([asprintf fwprintf newlocale putenv setenv setlocale \ snprintf strnlen wcslen wcsnlen mbrtowc wcrtomb]) dnl Use the _snprintf function only if it is declared (because on NetBSD it dnl is defined as a weak alias of snprintf; we prefer to use the latter). AC_CHECK_DECLS([_snprintf, _snwprintf], , , [#include ]) dnl Use the *_unlocked functions only if they are declared. dnl (because some of them were defined without being declared in Solaris dnl 2.5.1 but were removed in Solaris 2.6, whereas we want binaries built dnl on Solaris 2.5.1 to run on Solaris 2.6). AC_CHECK_DECLS([getc_unlocked], , , [#include ]) case $gt_cv_func_printf_posix in *yes) HAVE_POSIX_PRINTF=1 ;; *) HAVE_POSIX_PRINTF=0 ;; esac AC_SUBST([HAVE_POSIX_PRINTF]) if test "$ac_cv_func_asprintf" = yes; then HAVE_ASPRINTF=1 else HAVE_ASPRINTF=0 fi AC_SUBST([HAVE_ASPRINTF]) if test "$ac_cv_func_snprintf" = yes; then HAVE_SNPRINTF=1 else HAVE_SNPRINTF=0 fi AC_SUBST([HAVE_SNPRINTF]) if test "$ac_cv_func_newlocale" = yes; then HAVE_NEWLOCALE=1 else HAVE_NEWLOCALE=0 fi AC_SUBST([HAVE_NEWLOCALE]) if test "$ac_cv_func_wprintf" = yes; then HAVE_WPRINTF=1 else HAVE_WPRINTF=0 fi AC_SUBST([HAVE_WPRINTF]) AM_LANGINFO_CODESET gt_LC_MESSAGES dnl Compilation on mingw and Cygwin needs special Makefile rules, because dnl 1. when we install a shared library, we must arrange to export dnl auxiliary pointer variables for every exported variable, dnl 2. when we install a shared library and a static library simultaneously, dnl the include file specifies __declspec(dllimport) and therefore we dnl must arrange to define the auxiliary pointer variables for the dnl exported variables _also_ in the static library. if test "$enable_shared" = yes; then case "$host_os" in mingw* | cygwin*) is_woe32dll=yes ;; *) is_woe32dll=no ;; esac else is_woe32dll=no fi WOE32DLL=$is_woe32dll AC_SUBST([WOE32DLL]) dnl On mingw and Cygwin, we can activate special Makefile rules which add dnl version information to the shared libraries and executables. case "$host_os" in mingw* | cygwin*) is_woe32=yes ;; *) is_woe32=no ;; esac WOE32=$is_woe32 AC_SUBST([WOE32]) if test $WOE32 = yes; then dnl Check for a program that compiles Windows resource files. AC_CHECK_TOOL([WINDRES], [windres]) fi dnl Determine whether when creating a library, "-lc" should be passed to dnl libtool or not. On many platforms, it is required for the libtool option dnl -no-undefined to work. On HP-UX, however, the -lc - stored by libtool dnl in the *.la files - makes it impossible to create multithreaded programs, dnl because libtool also reorders the -lc to come before the -pthread, and dnl this disables pthread_create() . case "$host_os" in hpux*) LTLIBC="" ;; *) LTLIBC="-lc" ;; esac AC_SUBST([LTLIBC]) dnl Rename some macros and functions used for locking. AH_BOTTOM([ #define __libc_lock_t gl_lock_t #define __libc_lock_define gl_lock_define #define __libc_lock_define_initialized gl_lock_define_initialized #define __libc_lock_init gl_lock_init #define __libc_lock_lock gl_lock_lock #define __libc_lock_unlock gl_lock_unlock #define __libc_lock_recursive_t gl_recursive_lock_t #define __libc_lock_define_recursive gl_recursive_lock_define #define __libc_lock_define_initialized_recursive gl_recursive_lock_define_initialized #define __libc_lock_init_recursive gl_recursive_lock_init #define __libc_lock_lock_recursive gl_recursive_lock_lock #define __libc_lock_unlock_recursive gl_recursive_lock_unlock #define glthread_in_use libintl_thread_in_use #define glthread_lock_init_func libintl_lock_init_func #define glthread_lock_lock_func libintl_lock_lock_func #define glthread_lock_unlock_func libintl_lock_unlock_func #define glthread_lock_destroy_func libintl_lock_destroy_func #define glthread_rwlock_init_multithreaded libintl_rwlock_init_multithreaded #define glthread_rwlock_init_func libintl_rwlock_init_func #define glthread_rwlock_rdlock_multithreaded libintl_rwlock_rdlock_multithreaded #define glthread_rwlock_rdlock_func libintl_rwlock_rdlock_func #define glthread_rwlock_wrlock_multithreaded libintl_rwlock_wrlock_multithreaded #define glthread_rwlock_wrlock_func libintl_rwlock_wrlock_func #define glthread_rwlock_unlock_multithreaded libintl_rwlock_unlock_multithreaded #define glthread_rwlock_unlock_func libintl_rwlock_unlock_func #define glthread_rwlock_destroy_multithreaded libintl_rwlock_destroy_multithreaded #define glthread_rwlock_destroy_func libintl_rwlock_destroy_func #define glthread_recursive_lock_init_multithreaded libintl_recursive_lock_init_multithreaded #define glthread_recursive_lock_init_func libintl_recursive_lock_init_func #define glthread_recursive_lock_lock_multithreaded libintl_recursive_lock_lock_multithreaded #define glthread_recursive_lock_lock_func libintl_recursive_lock_lock_func #define glthread_recursive_lock_unlock_multithreaded libintl_recursive_lock_unlock_multithreaded #define glthread_recursive_lock_unlock_func libintl_recursive_lock_unlock_func #define glthread_recursive_lock_destroy_multithreaded libintl_recursive_lock_destroy_multithreaded #define glthread_recursive_lock_destroy_func libintl_recursive_lock_destroy_func #define glthread_once_func libintl_once_func #define glthread_once_singlethreaded libintl_once_singlethreaded #define glthread_once_multithreaded libintl_once_multithreaded ]) ]) dnl Checks for the core files of the intl subdirectory: dnl dcigettext.c dnl eval-plural.h dnl explodename.c dnl finddomain.c dnl gettextP.h dnl gmo.h dnl hash-string.h hash-string.c dnl l10nflist.c dnl libgnuintl.h.in (except the *printf stuff) dnl loadinfo.h dnl loadmsgcat.c dnl localealias.c dnl log.c dnl plural-exp.h plural-exp.c dnl plural.y dnl Used by libglocale. AC_DEFUN([gt_INTL_SUBDIR_CORE], [ AC_REQUIRE([AC_C_INLINE])dnl AC_REQUIRE([AC_TYPE_SIZE_T])dnl AC_REQUIRE([gl_AC_HEADER_STDINT_H]) AC_REQUIRE([AC_FUNC_ALLOCA])dnl AC_REQUIRE([AC_FUNC_MMAP])dnl AC_REQUIRE([gt_INTDIV0])dnl AC_REQUIRE([gl_AC_TYPE_UINTMAX_T])dnl AC_REQUIRE([gt_INTTYPES_PRI])dnl AC_REQUIRE([gl_LOCK])dnl AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[int foo (int a) { a = __builtin_expect (a, 10); return a == 10 ? 0 : 1; }]], [[]])], [AC_DEFINE([HAVE_BUILTIN_EXPECT], [1], [Define to 1 if the compiler understands __builtin_expect.])]) AC_CHECK_HEADERS([argz.h inttypes.h limits.h unistd.h sys/param.h]) AC_CHECK_FUNCS([getcwd getegid geteuid getgid getuid mempcpy munmap \ stpcpy strcasecmp strdup strtoul tsearch uselocale argz_count \ argz_stringify argz_next __fsetlocking]) dnl Use the *_unlocked functions only if they are declared. dnl (because some of them were defined without being declared in Solaris dnl 2.5.1 but were removed in Solaris 2.6, whereas we want binaries built dnl on Solaris 2.5.1 to run on Solaris 2.6). AC_CHECK_DECLS([feof_unlocked, fgets_unlocked], , , [#include ]) AM_ICONV dnl intl/plural.c is generated from intl/plural.y. It requires bison, dnl because plural.y uses bison specific features. It requires at least dnl bison-1.26 because earlier versions generate a plural.c that doesn't dnl compile. dnl bison is only needed for the maintainer (who touches plural.y). But in dnl order to avoid separate Makefiles or --enable-maintainer-mode, we put dnl the rule in general Makefile. Now, some people carelessly touch the dnl files or have a broken "make" program, hence the plural.c rule will dnl sometimes fire. To avoid an error, defines BISON to ":" if it is not dnl present or too old. AC_CHECK_PROGS([INTLBISON], [bison]) if test -z "$INTLBISON"; then ac_verc_fail=yes else dnl Found it, now check the version. AC_MSG_CHECKING([version of bison]) changequote(<<,>>)dnl ac_prog_version=`$INTLBISON --version 2>&1 | sed -n 's/^.*GNU Bison.* \([0-9]*\.[0-9.]*\).*$/\1/p'` case $ac_prog_version in '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;; 1.2[6-9]* | 1.[3-9][0-9]* | [2-9].*) changequote([,])dnl ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;; *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;; esac AC_MSG_RESULT([$ac_prog_version]) fi if test $ac_verc_fail = yes; then INTLBISON=: fi ]) grub-2.14~git20250718.0e36779/m4/exponentd.m40000644000175000017500000000755215036447602014604 00000000000000# exponentd.m4 serial 3 dnl Copyright (C) 2007-2008, 2010-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_DOUBLE_EXPONENT_LOCATION], [ AC_CACHE_CHECK([where to find the exponent in a 'double'], [gl_cv_cc_double_expbit0], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include #include #include #define NWORDS \ ((sizeof (double) + sizeof (unsigned int) - 1) / sizeof (unsigned int)) typedef union { double value; unsigned int word[NWORDS]; } memory_double; static unsigned int ored_words[NWORDS]; static unsigned int anded_words[NWORDS]; static void add_to_ored_words (double x) { memory_double m; size_t i; /* Clear it first, in case sizeof (double) < sizeof (memory_double). */ memset (&m, 0, sizeof (memory_double)); m.value = x; for (i = 0; i < NWORDS; i++) { ored_words[i] |= m.word[i]; anded_words[i] &= m.word[i]; } } int main () { size_t j; FILE *fp = fopen ("conftest.out", "w"); if (fp == NULL) return 1; for (j = 0; j < NWORDS; j++) anded_words[j] = ~ (unsigned int) 0; add_to_ored_words (0.25); add_to_ored_words (0.5); add_to_ored_words (1.0); add_to_ored_words (2.0); add_to_ored_words (4.0); /* Remove bits that are common (e.g. if representation of the first mantissa bit is explicit). */ for (j = 0; j < NWORDS; j++) ored_words[j] &= ~anded_words[j]; /* Now find the nonzero word. */ for (j = 0; j < NWORDS; j++) if (ored_words[j] != 0) break; if (j < NWORDS) { size_t i; for (i = j + 1; i < NWORDS; i++) if (ored_words[i] != 0) { fprintf (fp, "unknown"); return (fclose (fp) != 0); } for (i = 0; ; i++) if ((ored_words[j] >> i) & 1) { fprintf (fp, "word %d bit %d", (int) j, (int) i); return (fclose (fp) != 0); } } fprintf (fp, "unknown"); return (fclose (fp) != 0); } ]])], [gl_cv_cc_double_expbit0=`cat conftest.out`], [gl_cv_cc_double_expbit0="unknown"], [ dnl On ARM, there are two 'double' floating-point formats, used by dnl different sets of instructions: The older FPA instructions assume dnl that they are stored in big-endian word order, while the words dnl (like integer types) are stored in little-endian byte order. dnl The newer VFP instructions assume little-endian order dnl consistently. AC_EGREP_CPP([mixed_endianness], [ #if defined arm || defined __arm || defined __arm__ mixed_endianness #endif ], [gl_cv_cc_double_expbit0="unknown"], [ pushdef([AC_MSG_CHECKING],[:])dnl pushdef([AC_MSG_RESULT],[:])dnl pushdef([AC_MSG_RESULT_UNQUOTED],[:])dnl AC_C_BIGENDIAN( [gl_cv_cc_double_expbit0="word 0 bit 20"], [gl_cv_cc_double_expbit0="word 1 bit 20"], [gl_cv_cc_double_expbit0="unknown"]) popdef([AC_MSG_RESULT_UNQUOTED])dnl popdef([AC_MSG_RESULT])dnl popdef([AC_MSG_CHECKING])dnl ]) ]) rm -f conftest.out ]) case "$gl_cv_cc_double_expbit0" in word*bit*) word=`echo "$gl_cv_cc_double_expbit0" | sed -e 's/word //' -e 's/ bit.*//'` bit=`echo "$gl_cv_cc_double_expbit0" | sed -e 's/word.*bit //'` AC_DEFINE_UNQUOTED([DBL_EXPBIT0_WORD], [$word], [Define as the word index where to find the exponent of 'double'.]) AC_DEFINE_UNQUOTED([DBL_EXPBIT0_BIT], [$bit], [Define as the bit index in the word where to find bit 0 of the exponent of 'double'.]) ;; esac ]) grub-2.14~git20250718.0e36779/m4/error.m40000644000175000017500000000200315036447602013713 00000000000000#serial 15 # Copyright (C) 1996-1998, 2001-2004, 2009-2022 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_ERROR], [ dnl We don't use AC_FUNC_ERROR_AT_LINE any more, because it is no longer dnl maintained in Autoconf and because it invokes AC_LIBOBJ. AC_CACHE_CHECK([for error_at_line], [ac_cv_lib_error_at_line], [AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[#include ]], [[error_at_line (0, 0, "", 0, "an error occurred");]])], [ac_cv_lib_error_at_line=yes], [ac_cv_lib_error_at_line=no])]) ]) # Prerequisites of lib/error.c. AC_DEFUN([gl_PREREQ_ERROR], [ dnl Use system extensions on Android, so that AC_FUNC_STRERROR_R dnl discovers the GNU API for strerror_r on Android API level 23 and later. AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) AC_REQUIRE([AC_FUNC_STRERROR_R]) : ]) grub-2.14~git20250718.0e36779/m4/regex.m40000644000175000017500000003575015036447602013713 00000000000000# serial 73 # Copyright (C) 1996-2001, 2003-2022 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. dnl Initially derived from code in GNU grep. dnl Mostly written by Jim Meyering. AC_PREREQ([2.50]) AC_DEFUN([gl_REGEX], [ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_ARG_WITH([included-regex], [AS_HELP_STRING([--without-included-regex], [don't compile regex; this is the default on systems with recent-enough versions of the GNU C Library (use with caution on other systems).])]) case $with_included_regex in #( yes|no) ac_use_included_regex=$with_included_regex ;; '') # If the system regex support is good enough that it passes the # following run test, then default to *not* using the included regex.c. # If cross compiling, assume the test would fail and use the included # regex.c. AC_CHECK_DECLS_ONCE([alarm]) AC_CHECK_HEADERS_ONCE([malloc.h]) AC_CACHE_CHECK([for working re_compile_pattern], [gl_cv_func_re_compile_pattern_working], [AC_RUN_IFELSE( [AC_LANG_PROGRAM( [[#include #include #include #include #if defined M_CHECK_ACTION || HAVE_DECL_ALARM # include # include #endif #if HAVE_MALLOC_H # include #endif #ifdef M_CHECK_ACTION /* Exit with distinguishable exit code. */ static void sigabrt_no_core (int sig) { raise (SIGTERM); } #endif ]], [[int result = 0; static struct re_pattern_buffer regex; unsigned char folded_chars[UCHAR_MAX + 1]; int i; const char *s; struct re_registers regs; /* Some builds of glibc go into an infinite loop on this test. Use alarm to force death, and mallopt to avoid malloc recursion in diagnosing the corrupted heap. */ #if HAVE_DECL_ALARM signal (SIGALRM, SIG_DFL); alarm (2); #endif #ifdef M_CHECK_ACTION signal (SIGABRT, sigabrt_no_core); mallopt (M_CHECK_ACTION, 2); #endif if (setlocale (LC_ALL, "en_US.UTF-8")) { { /* https://sourceware.org/ml/libc-hacker/2006-09/msg00008.html This test needs valgrind to catch the bug on Debian GNU/Linux 3.1 x86, but it might catch the bug better on other platforms and it shouldn't hurt to try the test here. */ static char const pat[] = "insert into"; static char const data[] = "\xFF\0\x12\xA2\xAA\xC4\xB1,K\x12\xC4\xB1*\xACK"; re_set_syntax (RE_SYNTAX_GREP | RE_HAT_LISTS_NOT_NEWLINE | RE_ICASE); memset (®ex, 0, sizeof regex); s = re_compile_pattern (pat, sizeof pat - 1, ®ex); if (s) result |= 1; else { if (re_search (®ex, data, sizeof data - 1, 0, sizeof data - 1, ®s) != -1) result |= 1; regfree (®ex); } } { /* This test is from glibc bug 15078. The test case is from Andreas Schwab in . */ static char const pat[] = "[^x]x"; static char const data[] = /* */ "\xe1\x80\x80" "\xe1\x80\xbb" "\xe1\x80\xbd" "\xe1\x80\x94" "\xe1\x80\xba" "\xe1\x80\xaf" "\xe1\x80\x95" "\xe1\x80\xba" "x"; re_set_syntax (0); memset (®ex, 0, sizeof regex); s = re_compile_pattern (pat, sizeof pat - 1, ®ex); if (s) result |= 1; else { i = re_search (®ex, data, sizeof data - 1, 0, sizeof data - 1, 0); if (i != 0 && i != 21) result |= 1; regfree (®ex); } } if (! setlocale (LC_ALL, "C")) return 1; } /* This test is from glibc bug 3957, reported by Andrew Mackey. */ re_set_syntax (RE_SYNTAX_EGREP | RE_HAT_LISTS_NOT_NEWLINE); memset (®ex, 0, sizeof regex); s = re_compile_pattern ("a[^x]b", 6, ®ex); if (s) result |= 2; else { /* This should fail, but succeeds for glibc-2.5. */ if (re_search (®ex, "a\nb", 3, 0, 3, ®s) != -1) result |= 2; regfree (®ex); } /* This regular expression is from Spencer ere test number 75 in grep-2.3. */ re_set_syntax (RE_SYNTAX_POSIX_EGREP); memset (®ex, 0, sizeof regex); for (i = 0; i <= UCHAR_MAX; i++) folded_chars[i] = i; regex.translate = folded_chars; s = re_compile_pattern ("a[[:@:>@:]]b\n", 11, ®ex); /* This should fail with _Invalid character class name_ error. */ if (!s) { result |= 4; regfree (®ex); } /* Ensure that [b-a] is diagnosed as invalid, when using RE_NO_EMPTY_RANGES. */ re_set_syntax (RE_SYNTAX_POSIX_EGREP | RE_NO_EMPTY_RANGES); memset (®ex, 0, sizeof regex); s = re_compile_pattern ("a[b-a]", 6, ®ex); if (s == 0) { result |= 8; regfree (®ex); } /* This should succeed, but does not for glibc-2.1.3. */ memset (®ex, 0, sizeof regex); s = re_compile_pattern ("{1", 2, ®ex); if (s) result |= 8; else regfree (®ex); /* The following example is derived from a problem report against gawk from Jorge Stolfi . */ memset (®ex, 0, sizeof regex); s = re_compile_pattern ("[an\371]*n", 7, ®ex); if (s) result |= 8; else { /* This should match, but does not for glibc-2.2.1. */ if (re_match (®ex, "an", 2, 0, ®s) != 2) result |= 8; else { free (regs.start); free (regs.end); } regfree (®ex); } memset (®ex, 0, sizeof regex); s = re_compile_pattern ("x", 1, ®ex); if (s) result |= 8; else { /* glibc-2.2.93 does not work with a negative RANGE argument. */ if (re_search (®ex, "wxy", 3, 2, -2, ®s) != 1) result |= 8; else { free (regs.start); free (regs.end); } regfree (®ex); } /* The version of regex.c in older versions of gnulib ignored RE_ICASE. Detect that problem too. */ re_set_syntax (RE_SYNTAX_EMACS | RE_ICASE); memset (®ex, 0, sizeof regex); s = re_compile_pattern ("x", 1, ®ex); if (s) result |= 16; else { if (re_search (®ex, "WXY", 3, 0, 3, ®s) < 0) result |= 16; else { free (regs.start); free (regs.end); } regfree (®ex); } /* Catch a bug reported by Vin Shelton in https://lists.gnu.org/r/bug-coreutils/2007-06/msg00089.html */ re_set_syntax (RE_SYNTAX_POSIX_BASIC & ~RE_CONTEXT_INVALID_DUP & ~RE_NO_EMPTY_RANGES); memset (®ex, 0, sizeof regex); s = re_compile_pattern ("[[:alnum:]_-]\\\\+\$", 16, ®ex); if (s) result |= 32; else regfree (®ex); /* REG_STARTEND was added to glibc on 2004-01-15. Reject older versions. */ if (! REG_STARTEND) result |= 64; /* Matching with the compiled form of this regexp would provoke an assertion failure prior to glibc-2.28: regexec.c:1375: pop_fail_stack: Assertion 'num >= 0' failed With glibc-2.28, compilation fails and reports the invalid back reference. */ re_set_syntax (RE_SYNTAX_POSIX_EGREP); memset (®ex, 0, sizeof regex); s = re_compile_pattern ("0|()0|\\\\1|0", 10, ®ex); if (!s) { memset (®s, 0, sizeof regs); i = re_search (®ex, "x", 1, 0, 1, ®s); if (i != -1) result |= 64; if (0 <= i) { free (regs.start); free (regs.end); } regfree (®ex); } else { if (strcmp (s, "Invalid back reference")) result |= 64; } /* glibc bug 11053. */ re_set_syntax (RE_SYNTAX_POSIX_BASIC); memset (®ex, 0, sizeof regex); static char const pat_sub2[] = "\\\\(a*\\\\)*a*\\\\1"; s = re_compile_pattern (pat_sub2, sizeof pat_sub2 - 1, ®ex); if (s) result |= 64; else { memset (®s, 0, sizeof regs); static char const data[] = "a"; int datalen = sizeof data - 1; i = re_search (®ex, data, datalen, 0, datalen, ®s); if (i != 0) result |= 64; else if (regs.num_regs < 2) result |= 64; else if (! (regs.start[0] == 0 && regs.end[0] == 1)) result |= 64; else if (! (regs.start[1] == 0 && regs.end[1] == 0)) result |= 64; regfree (®ex); free (regs.start); free (regs.end); } #if 0 /* It would be nice to reject hosts whose regoff_t values are too narrow (including glibc on hosts with 64-bit ptrdiff_t and 32-bit int), but we should wait until glibc implements this feature. Otherwise, support for equivalence classes and multibyte collation symbols would always be broken except when compiling --without-included-regex. */ if (sizeof (regoff_t) < sizeof (ptrdiff_t) || sizeof (regoff_t) < sizeof (ssize_t)) result |= 64; #endif return result; ]])], [gl_cv_func_re_compile_pattern_working=yes], [gl_cv_func_re_compile_pattern_working=no], [case "$host_os" in # Guess no on native Windows. mingw*) gl_cv_func_re_compile_pattern_working="guessing no" ;; # Otherwise obey --enable-cross-guesses. *) gl_cv_func_re_compile_pattern_working="$gl_cross_guess_normal" ;; esac ]) ]) case "$gl_cv_func_re_compile_pattern_working" in #( *yes) ac_use_included_regex=no;; #( *no) ac_use_included_regex=yes;; esac ;; *) AC_MSG_ERROR([Invalid value for --with-included-regex: $with_included_regex]) ;; esac if test $ac_use_included_regex = yes; then AC_DEFINE([_REGEX_INCLUDE_LIMITS_H], [1], [Define if you want to include , so that it consistently overrides 's RE_DUP_MAX.]) AC_DEFINE([_REGEX_LARGE_OFFSETS], [1], [Define if you want regoff_t to be at least as wide POSIX requires.]) AC_DEFINE([re_syntax_options], [rpl_re_syntax_options], [Define to rpl_re_syntax_options if the replacement should be used.]) AC_DEFINE([re_set_syntax], [rpl_re_set_syntax], [Define to rpl_re_set_syntax if the replacement should be used.]) AC_DEFINE([re_compile_pattern], [rpl_re_compile_pattern], [Define to rpl_re_compile_pattern if the replacement should be used.]) AC_DEFINE([re_compile_fastmap], [rpl_re_compile_fastmap], [Define to rpl_re_compile_fastmap if the replacement should be used.]) AC_DEFINE([re_search], [rpl_re_search], [Define to rpl_re_search if the replacement should be used.]) AC_DEFINE([re_search_2], [rpl_re_search_2], [Define to rpl_re_search_2 if the replacement should be used.]) AC_DEFINE([re_match], [rpl_re_match], [Define to rpl_re_match if the replacement should be used.]) AC_DEFINE([re_match_2], [rpl_re_match_2], [Define to rpl_re_match_2 if the replacement should be used.]) AC_DEFINE([re_set_registers], [rpl_re_set_registers], [Define to rpl_re_set_registers if the replacement should be used.]) AC_DEFINE([re_comp], [rpl_re_comp], [Define to rpl_re_comp if the replacement should be used.]) AC_DEFINE([re_exec], [rpl_re_exec], [Define to rpl_re_exec if the replacement should be used.]) AC_DEFINE([regcomp], [rpl_regcomp], [Define to rpl_regcomp if the replacement should be used.]) AC_DEFINE([regexec], [rpl_regexec], [Define to rpl_regexec if the replacement should be used.]) AC_DEFINE([regerror], [rpl_regerror], [Define to rpl_regerror if the replacement should be used.]) AC_DEFINE([regfree], [rpl_regfree], [Define to rpl_regfree if the replacement should be used.]) fi ]) # Prerequisites of lib/regex.c and lib/regex_internal.c. AC_DEFUN([gl_PREREQ_REGEX], [ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) AC_REQUIRE([AC_C_INLINE]) AC_REQUIRE([AC_C_RESTRICT]) AC_REQUIRE([AC_TYPE_MBSTATE_T]) AC_REQUIRE([gl_EEMALLOC]) AC_CHECK_HEADERS([libintl.h]) AC_CHECK_FUNCS_ONCE([isblank iswctype]) AC_CHECK_DECLS([isblank], [], [], [[#include ]]) ]) grub-2.14~git20250718.0e36779/m4/memchr.m40000644000175000017500000000652015036447602014045 00000000000000# memchr.m4 serial 18 dnl Copyright (C) 2002-2004, 2009-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN_ONCE([gl_FUNC_MEMCHR], [ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles dnl Check for prerequisites for memory fence checks. gl_FUNC_MMAP_ANON AC_CHECK_HEADERS_ONCE([sys/mman.h]) AC_CHECK_FUNCS_ONCE([mprotect]) AC_REQUIRE([gl_STRING_H_DEFAULTS]) # Detect platform-specific bugs in some versions of glibc: # memchr should not dereference anything with length 0 # https://bugzilla.redhat.com/show_bug.cgi?id=499689 # memchr should not dereference overestimated length after a match # https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=521737 # https://sourceware.org/bugzilla/show_bug.cgi?id=10162 # memchr should cast the second argument to 'unsigned char'. # This bug exists in Android 4.3. # Assume that memchr works on platforms that lack mprotect. AC_CACHE_CHECK([whether memchr works], [gl_cv_func_memchr_works], [AC_RUN_IFELSE([AC_LANG_PROGRAM([[ #include #if HAVE_SYS_MMAN_H # include # include # include # include # ifndef MAP_FILE # define MAP_FILE 0 # endif #endif ]], [[ int result = 0; char *fence = NULL; #if HAVE_SYS_MMAN_H && HAVE_MPROTECT # if HAVE_MAP_ANONYMOUS const int flags = MAP_ANONYMOUS | MAP_PRIVATE; const int fd = -1; # else /* !HAVE_MAP_ANONYMOUS */ const int flags = MAP_FILE | MAP_PRIVATE; int fd = open ("/dev/zero", O_RDONLY, 0666); if (fd >= 0) # endif { int pagesize = getpagesize (); char *two_pages = (char *) mmap (NULL, 2 * pagesize, PROT_READ | PROT_WRITE, flags, fd, 0); if (two_pages != (char *)(-1) && mprotect (two_pages + pagesize, pagesize, PROT_NONE) == 0) fence = two_pages + pagesize; } #endif if (fence) { /* Test against bugs on glibc systems. */ if (memchr (fence, 0, 0)) result |= 1; strcpy (fence - 9, "12345678"); if (memchr (fence - 9, 0, 79) != fence - 1) result |= 2; if (memchr (fence - 1, 0, 3) != fence - 1) result |= 4; /* Test against bug on AIX 7.2. */ if (memchr (fence - 4, '6', 16) != fence - 4) result |= 8; } /* Test against bug on Android 4.3. */ { char input[3]; input[0] = 'a'; input[1] = 'b'; input[2] = 'c'; if (memchr (input, 0x789abc00 | 'b', 3) != input + 1) result |= 16; } return result; ]])], [gl_cv_func_memchr_works=yes], [gl_cv_func_memchr_works=no], [case "$host_os" in # Guess no on Android. linux*-android*) gl_cv_func_memchr_works="guessing no" ;; # Guess yes on native Windows. mingw*) gl_cv_func_memchr_works="guessing yes" ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_memchr_works="$gl_cross_guess_normal" ;; esac ]) ]) case "$gl_cv_func_memchr_works" in *yes) ;; *) REPLACE_MEMCHR=1 ;; esac ]) # Prerequisites of lib/memchr.c. AC_DEFUN([gl_PREREQ_MEMCHR], [ AC_CHECK_HEADERS([bp-sym.h]) ]) grub-2.14~git20250718.0e36779/m4/stdalign.m40000644000175000017500000000444715036447602014405 00000000000000# Check for stdalign.h that conforms to C11. dnl Copyright 2011-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. # Prepare for substituting if it is not supported. AC_DEFUN([gl_STDALIGN_H], [ AC_CACHE_CHECK([for working stdalign.h], [gl_cv_header_working_stdalign_h], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#include #include #include /* Test that alignof yields a result consistent with offsetof. This catches GCC bug 52023 . */ #ifdef __cplusplus template struct alignof_helper { char a; t b; }; # define ao(type) offsetof (alignof_helper, b) #else # define ao(type) offsetof (struct { char a; type b; }, b) #endif char test_double[ao (double) % _Alignof (double) == 0 ? 1 : -1]; char test_long[ao (long int) % _Alignof (long int) == 0 ? 1 : -1]; char test_alignof[alignof (double) == _Alignof (double) ? 1 : -1]; /* Test _Alignas only on platforms where gnulib can help. */ #if \ ((defined __cplusplus && 201103 <= __cplusplus) \ || (__TINYC__ && defined __attribute__) \ || (defined __APPLE__ && defined __MACH__ \ ? 4 < __GNUC__ + (1 <= __GNUC_MINOR__) \ : __GNUC__) \ || (__ia64 && (61200 <= __HP_cc || 61200 <= __HP_aCC)) \ || __ICC || 0x590 <= __SUNPRO_C || 0x0600 <= __xlC__ \ || 1300 <= _MSC_VER) struct alignas_test { char c; char alignas (8) alignas_8; }; char test_alignas[offsetof (struct alignas_test, alignas_8) == 8 ? 1 : -1]; #endif ]])], [gl_cv_header_working_stdalign_h=yes], [gl_cv_header_working_stdalign_h=no])]) if test $gl_cv_header_working_stdalign_h = yes; then GL_GENERATE_STDALIGN_H=false else GL_GENERATE_STDALIGN_H=true fi ]) grub-2.14~git20250718.0e36779/m4/wmempcpy.m40000644000175000017500000000120415036447602014425 00000000000000# wmempcpy.m4 serial 1 dnl Copyright (C) 2020-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_WMEMPCPY], [ AC_REQUIRE([gl_WCHAR_H_DEFAULTS]) dnl Persuade glibc to declare wmempcpy(). AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) dnl The wmempcpy() declaration in lib/wchar.in.h uses 'restrict'. AC_REQUIRE([AC_C_RESTRICT]) AC_CHECK_FUNCS_ONCE([wmempcpy]) if test $ac_cv_func_wmempcpy = no; then HAVE_WMEMPCPY=0 fi ]) grub-2.14~git20250718.0e36779/m4/chdir-long.m40000644000175000017500000000205415036447602014616 00000000000000#serial 17 # Use Gnulib's robust chdir function. # It can handle arbitrarily long directory names, which means # that when it is given the name of an existing directory, it # never fails with ENAMETOOLONG. # Arrange to compile chdir-long.c only on systems that define PATH_MAX. dnl Copyright (C) 2004-2007, 2009-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. # Written by Jim Meyering. AC_DEFUN([gl_FUNC_CHDIR_LONG], [ AC_REQUIRE([gl_PATHMAX_SNIPPET_PREREQ]) AC_CACHE_CHECK([whether this system supports file names of any length], [gl_cv_have_unlimited_file_name_length], [AC_EGREP_CPP([have_arbitrary_file_name_length_limit], gl_PATHMAX_SNIPPET[ #ifdef PATH_MAX have_arbitrary_file_name_length_limit #endif], [gl_cv_have_unlimited_file_name_length=no], [gl_cv_have_unlimited_file_name_length=yes])]) ]) AC_DEFUN([gl_PREREQ_CHDIR_LONG], [:]) grub-2.14~git20250718.0e36779/m4/intdiv0.m40000644000175000017500000000455215036447570014156 00000000000000# intdiv0.m4 serial 6 (gettext-0.18.2) dnl Copyright (C) 2002, 2007-2008, 2010-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. AC_DEFUN([gt_INTDIV0], [ AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_CACHE_CHECK([whether integer division by zero raises SIGFPE], gt_cv_int_divbyzero_sigfpe, [ gt_cv_int_divbyzero_sigfpe= changequote(,)dnl case "$host_os" in macos* | darwin[6-9]* | darwin[1-9][0-9]*) # On Mac OS X 10.2 or newer, just assume the same as when cross- # compiling. If we were to perform the real test, 1 Crash Report # dialog window would pop up. case "$host_cpu" in i[34567]86 | x86_64) gt_cv_int_divbyzero_sigfpe="guessing yes" ;; esac ;; esac changequote([,])dnl if test -z "$gt_cv_int_divbyzero_sigfpe"; then AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include static void sigfpe_handler (int sig) { /* Exit with code 0 if SIGFPE, with code 1 if any other signal. */ exit (sig != SIGFPE); } int x = 1; int y = 0; int z; int nan; int main () { signal (SIGFPE, sigfpe_handler); /* IRIX and AIX (when "xlc -qcheck" is used) yield signal SIGTRAP. */ #if (defined (__sgi) || defined (_AIX)) && defined (SIGTRAP) signal (SIGTRAP, sigfpe_handler); #endif /* Linux/SPARC yields signal SIGILL. */ #if defined (__sparc__) && defined (__linux__) signal (SIGILL, sigfpe_handler); #endif z = x / y; nan = y / y; exit (2); } ]])], [gt_cv_int_divbyzero_sigfpe=yes], [gt_cv_int_divbyzero_sigfpe=no], [ # Guess based on the CPU. changequote(,)dnl case "$host_cpu" in alpha* | i[34567]86 | x86_64 | m68k | s390*) gt_cv_int_divbyzero_sigfpe="guessing yes";; *) gt_cv_int_divbyzero_sigfpe="guessing no";; esac changequote([,])dnl ]) fi ]) case "$gt_cv_int_divbyzero_sigfpe" in *yes) value=1;; *) value=0;; esac AC_DEFINE_UNQUOTED([INTDIV0_RAISES_SIGFPE], [$value], [Define if integer division by zero raises signal SIGFPE.]) ]) grub-2.14~git20250718.0e36779/m4/zzgnulib.m40000644000175000017500000000152215036447602014433 00000000000000# zzgnulib.m4 serial 1 dnl Copyright (C) 2020-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl This file must be named something that sorts after all other dnl package- or gnulib-provided .m4 files - at least for those packages dnl that redefine AC_PROG_CC. dnl Redefine AC_PROG_CC so that it ends with invocations of gl_COMPILER_CLANG dnl and gl_COMPILER_PREPARE_CHECK_DECL. m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC])[ gl_COMPILER_CLANG gl_COMPILER_PREPARE_CHECK_DECL ]) # gl_ZZGNULIB # ----------- # Witness macro that this file has been included. Needed to force # Automake to include this file after all other gnulib .m4 files. AC_DEFUN([gl_ZZGNULIB]) grub-2.14~git20250718.0e36779/m4/wcwidth.m40000644000175000017500000000657715036447602014257 00000000000000# wcwidth.m4 serial 34 dnl Copyright (C) 2006-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_WCWIDTH], [ AC_REQUIRE([gl_WCHAR_H_DEFAULTS]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles dnl Persuade glibc to declare wcwidth(). AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) AC_REQUIRE([gt_TYPE_WCHAR_T]) AC_REQUIRE([gt_TYPE_WINT_T]) AC_CHECK_HEADERS_ONCE([wchar.h]) AC_CHECK_FUNCS_ONCE([wcwidth]) AC_CHECK_DECLS([wcwidth], [], [], [[ #include ]]) if test $ac_cv_have_decl_wcwidth != yes; then HAVE_DECL_WCWIDTH=0 fi if test $ac_cv_func_wcwidth != yes; then AC_CACHE_CHECK([whether wcwidth is a macro], [gl_cv_func_wcwidth_macro], [AC_EGREP_CPP([wchar_header_defines_wcwidth], [ #include #ifdef wcwidth wchar_header_defines_wcwidth #endif], [gl_cv_func_wcwidth_macro=yes], [gl_cv_func_wcwidth_macro=no]) ]) fi if test $ac_cv_func_wcwidth = yes || test $gl_cv_func_wcwidth_macro = yes; then HAVE_WCWIDTH=1 dnl On Mac OS X 10.3, wcwidth(0x0301) (COMBINING ACUTE ACCENT) returns 1. dnl On NetBSD 9.0, OpenBSD 5.0, MidnightBSD 1.1, dnl wcwidth(0x05B0) (HEBREW POINT SHEVA) returns 1. dnl On NetBSD 9.0, MidnightBSD 1.1, OSF/1 5.1, dnl wcwidth(0x200B) (ZERO WIDTH SPACE) returns 1. dnl On OpenBSD 5.8, wcwidth(0xFF1A) (FULLWIDTH COLON) returns 0. dnl This leads to bugs in 'ls' (coreutils). dnl On Solaris 11.4, wcwidth(0x2202) (PARTIAL DIFFERENTIAL) returns 2, dnl even in Western locales. AC_CACHE_CHECK([whether wcwidth works reasonably in UTF-8 locales], [gl_cv_func_wcwidth_works], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include #if !HAVE_DECL_WCWIDTH extern # ifdef __cplusplus "C" # endif int wcwidth (int); #endif int main () { int result = 0; if (setlocale (LC_ALL, "en_US.UTF-8") != NULL) { if (wcwidth (0x0301) > 0) result |= 1; if (wcwidth (0x05B0) > 0) result |= 2; if (wcwidth (0x200B) > 0) result |= 4; if (wcwidth (0xFF1A) == 0) result |= 8; if (wcwidth (0x2202) > 1) result |= 16; } return result; }]])], [gl_cv_func_wcwidth_works=yes], [gl_cv_func_wcwidth_works=no], [ changequote(,)dnl case "$host_os" in # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_wcwidth_works="guessing yes";; # Guess yes on musl systems. *-musl*) gl_cv_func_wcwidth_works="guessing yes";; # Guess yes on AIX 7 systems. aix[7-9]*) gl_cv_func_wcwidth_works="guessing yes";; *) gl_cv_func_wcwidth_works="$gl_cross_guess_normal";; esac changequote([,])dnl ]) ]) case "$gl_cv_func_wcwidth_works" in *yes) ;; *no) REPLACE_WCWIDTH=1 ;; esac else HAVE_WCWIDTH=0 fi dnl We don't substitute HAVE_WCWIDTH. We assume that if the system does not dnl have the wcwidth function, then it does not declare it. ]) # Prerequisites of lib/wcwidth.c. AC_DEFUN([gl_PREREQ_WCWIDTH], [ AC_REQUIRE([AC_C_INLINE]) : ]) grub-2.14~git20250718.0e36779/m4/locale-zh.m40000644000175000017500000001261215036447602014447 00000000000000# locale-zh.m4 serial 15 dnl Copyright (C) 2003, 2005-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. dnl Determine the name of a chinese locale with GB18030 encoding. AC_DEFUN([gt_LOCALE_ZH_CN], [ AC_REQUIRE([AC_CANONICAL_HOST]) AC_REQUIRE([AM_LANGINFO_CODESET]) AC_CACHE_CHECK([for a transitional chinese locale], [gt_cv_locale_zh_CN], [ AC_LANG_CONFTEST([AC_LANG_SOURCE([[ #include #include #include #if HAVE_LANGINFO_CODESET # include #endif #include #include struct tm t; char buf[16]; int main () { /* On BeOS and Haiku, locales are not implemented in libc. Rather, libintl imitates locale dependent behaviour by looking at the environment variables, and all locales use the UTF-8 encoding. */ #if defined __BEOS__ || defined __HAIKU__ return 1; #else /* Check whether the given locale name is recognized by the system. */ # if defined _WIN32 && !defined __CYGWIN__ /* On native Windows, setlocale(category, "") looks at the system settings, not at the environment variables. Also, when an encoding suffix such as ".65001" or ".54936" is specified, it succeeds but sets the LC_CTYPE category of the locale to "C". */ if (setlocale (LC_ALL, getenv ("LC_ALL")) == NULL || strcmp (setlocale (LC_CTYPE, NULL), "C") == 0) return 1; # else if (setlocale (LC_ALL, "") == NULL) return 1; # endif /* Check whether nl_langinfo(CODESET) is nonempty and not "ASCII" or "646". On Mac OS X 10.3.5 (Darwin 7.5) in the fr_FR locale, nl_langinfo(CODESET) is empty, and the behaviour of Tcl 8.4 in this locale is not useful. On OpenBSD 4.0, when an unsupported locale is specified, setlocale() succeeds but then nl_langinfo(CODESET) is "646". In this situation, some unit tests fail. On MirBSD 10, when an unsupported locale is specified, setlocale() succeeds but then nl_langinfo(CODESET) is "UTF-8". */ # if HAVE_LANGINFO_CODESET { const char *cs = nl_langinfo (CODESET); if (cs[0] == '\0' || strcmp (cs, "ASCII") == 0 || strcmp (cs, "646") == 0 || strcmp (cs, "UTF-8") == 0) return 1; } # endif # ifdef __CYGWIN__ /* On Cygwin, avoid locale names without encoding suffix, because the locale_charset() function relies on the encoding suffix. Note that LC_ALL is set on the command line. */ if (strchr (getenv ("LC_ALL"), '.') == NULL) return 1; # endif /* Check whether in a month name, no byte in the range 0x80..0x9F occurs. This excludes the UTF-8 encoding (except on MirBSD). */ { const char *p; t.tm_year = 1975 - 1900; t.tm_mon = 2 - 1; t.tm_mday = 4; if (strftime (buf, sizeof (buf), "%B", &t) < 2) return 1; for (p = buf; *p != '\0'; p++) if ((unsigned char) *p >= 0x80 && (unsigned char) *p < 0xa0) return 1; } /* Check whether a typical GB18030 multibyte sequence is recognized as a single wide character. This excludes the GB2312 and GBK encodings. */ if (mblen ("\203\062\332\066", 5) != 4) return 1; return 0; #endif } ]])]) if AC_TRY_EVAL([ac_link]) && test -s conftest$ac_exeext; then case "$host_os" in # Handle native Windows specially, because there setlocale() interprets # "ar" as "Arabic" or "Arabic_Saudi Arabia.1256", # "fr" or "fra" as "French" or "French_France.1252", # "ge"(!) or "deu"(!) as "German" or "German_Germany.1252", # "ja" as "Japanese" or "Japanese_Japan.932", # and similar. mingw*) # Test for the hypothetical native Windows locale name. if (LC_ALL=Chinese_China.54936 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then gt_cv_locale_zh_CN=Chinese_China.54936 else # None found. gt_cv_locale_zh_CN=none fi ;; solaris2.8) # On Solaris 8, the locales zh_CN.GB18030, zh_CN.GBK, zh.GBK are # broken. One witness is the test case in gl_MBRTOWC_SANITYCHECK. # Another witness is that "LC_ALL=zh_CN.GB18030 bash -c true" dumps core. gt_cv_locale_zh_CN=none ;; *) # Setting LC_ALL is not enough. Need to set LC_TIME to empty, because # otherwise on Mac OS X 10.3.5 the LC_TIME=C from the beginning of the # configure script would override the LC_ALL setting. Likewise for # LC_CTYPE, which is also set at the beginning of the configure script. # Test for the locale name without encoding suffix. if (LC_ALL=zh_CN LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then gt_cv_locale_zh_CN=zh_CN else # Test for the locale name with explicit encoding suffix. if (LC_ALL=zh_CN.GB18030 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then gt_cv_locale_zh_CN=zh_CN.GB18030 else # None found. gt_cv_locale_zh_CN=none fi fi ;; esac else # If there was a link error, due to mblen(), the system is so old that # it certainly doesn't have a chinese locale. gt_cv_locale_zh_CN=none fi rm -fr conftest* ]) LOCALE_ZH_CN=$gt_cv_locale_zh_CN AC_SUBST([LOCALE_ZH_CN]) ]) grub-2.14~git20250718.0e36779/m4/localeconv.m40000644000175000017500000000114715036447602014717 00000000000000# localeconv.m4 serial 1 dnl Copyright (C) 2012-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_LOCALECONV], [ AC_REQUIRE([gl_LOCALE_H_DEFAULTS]) AC_REQUIRE([gl_LOCALE_H]) if test $REPLACE_STRUCT_LCONV = 1; then REPLACE_LOCALECONV=1 fi ]) # Prerequisites of lib/localeconv.c. AC_DEFUN([gl_PREREQ_LOCALECONV], [ AC_CHECK_MEMBERS([struct lconv.decimal_point], [], [], [[#include ]]) ]) grub-2.14~git20250718.0e36779/m4/uintmax_t.m40000644000175000017500000000213115036447570014600 00000000000000# uintmax_t.m4 serial 12 dnl Copyright (C) 1997-2004, 2007-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Paul Eggert. AC_PREREQ([2.13]) # Define uintmax_t to 'unsigned long' or 'unsigned long long' # if it is not already defined in or . AC_DEFUN([gl_AC_TYPE_UINTMAX_T], [ AC_REQUIRE([gl_AC_HEADER_INTTYPES_H]) AC_REQUIRE([gl_AC_HEADER_STDINT_H]) if test $gl_cv_header_inttypes_h = no && test $gl_cv_header_stdint_h = no; then AC_REQUIRE([AC_TYPE_UNSIGNED_LONG_LONG_INT]) test $ac_cv_type_unsigned_long_long_int = yes \ && ac_type='unsigned long long' \ || ac_type='unsigned long' AC_DEFINE_UNQUOTED([uintmax_t], [$ac_type], [Define to unsigned long or unsigned long long if and don't define.]) else AC_DEFINE([HAVE_UINTMAX_T], [1], [Define if you have the 'uintmax_t' type in or .]) fi ]) grub-2.14~git20250718.0e36779/m4/string_h.m40000644000175000017500000001604715036447602014414 00000000000000# Configure a GNU-like replacement for . # Copyright (C) 2007-2022 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 34 # Written by Paul Eggert. AC_DEFUN_ONCE([gl_STRING_H], [ dnl Ensure to expand the default settings once only, before all statements dnl that occur in other macros. AC_REQUIRE([gl_STRING_H_DEFAULTS]) gl_NEXT_HEADERS([string.h]) dnl Check for declarations of anything we want to poison if the dnl corresponding gnulib module is not in use, and which is not dnl guaranteed by C89. gl_WARN_ON_USE_PREPARE([[#include ]], [ffsl ffsll memmem mempcpy memrchr rawmemchr stpcpy stpncpy strchrnul strdup strncat strndup strnlen strpbrk strsep strcasestr strtok_r strerror_r strerrorname_np sigabbrev_np sigdescr_np strsignal strverscmp]) AC_REQUIRE([AC_C_RESTRICT]) ]) # gl_STRING_MODULE_INDICATOR([modulename]) # sets the shell variable that indicates the presence of the given module # to a C preprocessor expression that will evaluate to 1. # This macro invocation must not occur in macros that are AC_REQUIREd. AC_DEFUN([gl_STRING_MODULE_INDICATOR], [ dnl Ensure to expand the default settings once only. gl_STRING_H_REQUIRE_DEFAULTS gl_MODULE_INDICATOR_SET_VARIABLE([$1]) dnl Define it also as a C macro, for the benefit of the unit tests. gl_MODULE_INDICATOR_FOR_TESTS([$1]) ]) # Initializes the default values for AC_SUBSTed shell variables. # This macro must not be AC_REQUIREd. It must only be invoked, and only # outside of macros or in macros that are not AC_REQUIREd. AC_DEFUN([gl_STRING_H_REQUIRE_DEFAULTS], [ m4_defun(GL_MODULE_INDICATOR_PREFIX[_STRING_H_MODULE_INDICATOR_DEFAULTS], [ gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_EXPLICIT_BZERO]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FFSL]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_FFSLL]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MEMCHR]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MEMMEM]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MEMPCPY]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MEMRCHR]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_RAWMEMCHR]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STPCPY]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STPNCPY]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRCHRNUL]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRDUP]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRNCAT]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRNDUP]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRNLEN]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRPBRK]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRSEP]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRSTR]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRCASESTR]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRTOK_R]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MBSLEN]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MBSNLEN]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MBSCHR]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MBSRCHR]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MBSSTR]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MBSCASECMP]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MBSNCASECMP]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MBSPCASECMP]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MBSCASESTR]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MBSCSPN]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MBSPBRK]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MBSSPN]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MBSSEP]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MBSTOK_R]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRERROR]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRERROR_R]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRERRORNAME_NP]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SIGABBREV_NP]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SIGDESCR_NP]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRSIGNAL]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRVERSCMP]) dnl Support Microsoft deprecated alias function names by default. gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_MEMCCPY], [1]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_STRDUP], [1]) ]) m4_require(GL_MODULE_INDICATOR_PREFIX[_STRING_H_MODULE_INDICATOR_DEFAULTS]) dnl Make sure the shell variable for GNULIB_FREE_POSIX is initialized. gl_STDLIB_H_REQUIRE_DEFAULTS AC_REQUIRE([gl_STRING_H_DEFAULTS]) ]) AC_DEFUN([gl_STRING_H_DEFAULTS], [ HAVE_MBSLEN=0; AC_SUBST([HAVE_MBSLEN]) dnl Assume proper GNU behavior unless another module says otherwise. HAVE_EXPLICIT_BZERO=1; AC_SUBST([HAVE_EXPLICIT_BZERO]) HAVE_FFSL=1; AC_SUBST([HAVE_FFSL]) HAVE_FFSLL=1; AC_SUBST([HAVE_FFSLL]) HAVE_DECL_MEMMEM=1; AC_SUBST([HAVE_DECL_MEMMEM]) HAVE_MEMPCPY=1; AC_SUBST([HAVE_MEMPCPY]) HAVE_DECL_MEMRCHR=1; AC_SUBST([HAVE_DECL_MEMRCHR]) HAVE_RAWMEMCHR=1; AC_SUBST([HAVE_RAWMEMCHR]) HAVE_STPCPY=1; AC_SUBST([HAVE_STPCPY]) HAVE_STPNCPY=1; AC_SUBST([HAVE_STPNCPY]) HAVE_STRCHRNUL=1; AC_SUBST([HAVE_STRCHRNUL]) HAVE_DECL_STRDUP=1; AC_SUBST([HAVE_DECL_STRDUP]) HAVE_DECL_STRNDUP=1; AC_SUBST([HAVE_DECL_STRNDUP]) HAVE_DECL_STRNLEN=1; AC_SUBST([HAVE_DECL_STRNLEN]) HAVE_STRPBRK=1; AC_SUBST([HAVE_STRPBRK]) HAVE_STRSEP=1; AC_SUBST([HAVE_STRSEP]) HAVE_STRCASESTR=1; AC_SUBST([HAVE_STRCASESTR]) HAVE_DECL_STRTOK_R=1; AC_SUBST([HAVE_DECL_STRTOK_R]) HAVE_DECL_STRERROR_R=1; AC_SUBST([HAVE_DECL_STRERROR_R]) HAVE_STRERRORNAME_NP=1; AC_SUBST([HAVE_STRERRORNAME_NP]) HAVE_SIGABBREV_NP=1; AC_SUBST([HAVE_SIGABBREV_NP]) HAVE_SIGDESCR_NP=1; AC_SUBST([HAVE_SIGDESCR_NP]) HAVE_DECL_STRSIGNAL=1; AC_SUBST([HAVE_DECL_STRSIGNAL]) HAVE_STRVERSCMP=1; AC_SUBST([HAVE_STRVERSCMP]) REPLACE_FFSLL=0; AC_SUBST([REPLACE_FFSLL]) REPLACE_MEMCHR=0; AC_SUBST([REPLACE_MEMCHR]) REPLACE_MEMMEM=0; AC_SUBST([REPLACE_MEMMEM]) REPLACE_STPNCPY=0; AC_SUBST([REPLACE_STPNCPY]) REPLACE_STRCHRNUL=0; AC_SUBST([REPLACE_STRCHRNUL]) REPLACE_STRDUP=0; AC_SUBST([REPLACE_STRDUP]) REPLACE_STRNCAT=0; AC_SUBST([REPLACE_STRNCAT]) REPLACE_STRNDUP=0; AC_SUBST([REPLACE_STRNDUP]) REPLACE_STRNLEN=0; AC_SUBST([REPLACE_STRNLEN]) REPLACE_STRSTR=0; AC_SUBST([REPLACE_STRSTR]) REPLACE_STRCASESTR=0; AC_SUBST([REPLACE_STRCASESTR]) REPLACE_STRTOK_R=0; AC_SUBST([REPLACE_STRTOK_R]) REPLACE_STRERROR=0; AC_SUBST([REPLACE_STRERROR]) REPLACE_STRERROR_R=0; AC_SUBST([REPLACE_STRERROR_R]) REPLACE_STRERRORNAME_NP=0; AC_SUBST([REPLACE_STRERRORNAME_NP]) REPLACE_STRSIGNAL=0; AC_SUBST([REPLACE_STRSIGNAL]) UNDEFINE_STRTOK_R=0; AC_SUBST([UNDEFINE_STRTOK_R]) ]) grub-2.14~git20250718.0e36779/m4/printf.m40000644000175000017500000021352715036447602014103 00000000000000# printf.m4 serial 73 dnl Copyright (C) 2003, 2007-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl Test whether the *printf family of functions supports the 'j', 'z', 't', dnl 'L' size specifiers. (ISO C99, POSIX:2001) dnl Result is gl_cv_func_printf_sizes_c99. AC_DEFUN([gl_PRINTF_SIZES_C99], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([gl_AC_HEADER_STDINT_H]) AC_REQUIRE([gl_AC_HEADER_INTTYPES_H]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether printf supports size specifiers as in C99], [gl_cv_func_printf_sizes_c99], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include #include #include #if HAVE_STDINT_H_WITH_UINTMAX # include #endif #if HAVE_INTTYPES_H_WITH_UINTMAX # include #endif static char buf[100]; int main () { int result = 0; #if HAVE_STDINT_H_WITH_UINTMAX || HAVE_INTTYPES_H_WITH_UINTMAX buf[0] = '\0'; if (sprintf (buf, "%ju %d", (uintmax_t) 12345671, 33, 44, 55) < 0 || strcmp (buf, "12345671 33") != 0) result |= 1; #else result |= 1; #endif buf[0] = '\0'; if (sprintf (buf, "%zu %d", (size_t) 12345672, 33, 44, 55) < 0 || strcmp (buf, "12345672 33") != 0) result |= 2; buf[0] = '\0'; if (sprintf (buf, "%tu %d", (ptrdiff_t) 12345673, 33, 44, 55) < 0 || strcmp (buf, "12345673 33") != 0) result |= 4; buf[0] = '\0'; if (sprintf (buf, "%Lg %d", (long double) 1.5, 33, 44, 55) < 0 || strcmp (buf, "1.5 33") != 0) result |= 8; return result; }]])], [gl_cv_func_printf_sizes_c99=yes], [gl_cv_func_printf_sizes_c99=no], [ case "$host_os" in changequote(,)dnl # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_printf_sizes_c99="guessing yes";; # Guess yes on musl systems. *-musl*) gl_cv_func_printf_sizes_c99="guessing yes";; # Guess yes on FreeBSD >= 5. freebsd[1-4].*) gl_cv_func_printf_sizes_c99="guessing no";; freebsd* | kfreebsd*) gl_cv_func_printf_sizes_c99="guessing yes";; midnightbsd*) gl_cv_func_printf_sizes_c99="guessing yes";; # Guess yes on Mac OS X >= 10.3. darwin[1-6].*) gl_cv_func_printf_sizes_c99="guessing no";; darwin*) gl_cv_func_printf_sizes_c99="guessing yes";; # Guess yes on OpenBSD >= 3.9. openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*) gl_cv_func_printf_sizes_c99="guessing no";; openbsd*) gl_cv_func_printf_sizes_c99="guessing yes";; # Guess yes on Solaris >= 2.10. solaris2.[1-9][0-9]*) gl_cv_func_printf_sizes_c99="guessing yes";; solaris*) gl_cv_func_printf_sizes_c99="guessing no";; # Guess yes on NetBSD >= 3. netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*) gl_cv_func_printf_sizes_c99="guessing no";; netbsd*) gl_cv_func_printf_sizes_c99="guessing yes";; # Guess yes on Android. linux*-android*) gl_cv_func_printf_sizes_c99="guessing yes";; changequote([,])dnl # Guess yes on MSVC, no on mingw. mingw*) AC_EGREP_CPP([Known], [ #ifdef _MSC_VER Known #endif ], [gl_cv_func_printf_sizes_c99="guessing yes"], [gl_cv_func_printf_sizes_c99="guessing no"]) ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_printf_sizes_c99="$gl_cross_guess_normal";; esac ]) ]) ]) dnl Test whether the *printf family of functions supports 'long double' dnl arguments together with the 'L' size specifier. (ISO C99, POSIX:2001) dnl Result is gl_cv_func_printf_long_double. AC_DEFUN([gl_PRINTF_LONG_DOUBLE], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether printf supports 'long double' arguments], [gl_cv_func_printf_long_double], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include static char buf[10000]; int main () { int result = 0; buf[0] = '\0'; if (sprintf (buf, "%Lf %d", 1.75L, 33, 44, 55) < 0 || strcmp (buf, "1.750000 33") != 0) result |= 1; buf[0] = '\0'; if (sprintf (buf, "%Le %d", 1.75L, 33, 44, 55) < 0 || strcmp (buf, "1.750000e+00 33") != 0) result |= 2; buf[0] = '\0'; if (sprintf (buf, "%Lg %d", 1.75L, 33, 44, 55) < 0 || strcmp (buf, "1.75 33") != 0) result |= 4; return result; }]])], [gl_cv_func_printf_long_double=yes], [gl_cv_func_printf_long_double=no], [case "$host_os" in # Guess no on BeOS. beos*) gl_cv_func_printf_long_double="guessing no";; # Guess yes on Android. linux*-android*) gl_cv_func_printf_long_double="guessing yes";; # Guess yes on MSVC, no on mingw. mingw*) AC_EGREP_CPP([Known], [ #ifdef _MSC_VER Known #endif ], [gl_cv_func_printf_long_double="guessing yes"], [gl_cv_func_printf_long_double="guessing no"]) ;; *) gl_cv_func_printf_long_double="guessing yes";; esac ]) ]) ]) dnl Test whether the *printf family of functions supports infinite and NaN dnl 'double' arguments and negative zero arguments in the %f, %e, %g dnl directives. (ISO C99, POSIX:2001) dnl Result is gl_cv_func_printf_infinite. AC_DEFUN([gl_PRINTF_INFINITE], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether printf supports infinite 'double' arguments], [gl_cv_func_printf_infinite], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include static int strisnan (const char *string, size_t start_index, size_t end_index) { if (start_index < end_index) { if (string[start_index] == '-') start_index++; if (start_index + 3 <= end_index && memcmp (string + start_index, "nan", 3) == 0) { start_index += 3; if (start_index == end_index || (string[start_index] == '(' && string[end_index - 1] == ')')) return 1; } } return 0; } static int have_minus_zero () { static double plus_zero = 0.0; double minus_zero = - plus_zero; return memcmp (&plus_zero, &minus_zero, sizeof (double)) != 0; } static char buf[10000]; static double zero = 0.0; int main () { int result = 0; if (sprintf (buf, "%f", 1.0 / zero) < 0 || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0)) result |= 1; if (sprintf (buf, "%f", -1.0 / zero) < 0 || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0)) result |= 1; if (sprintf (buf, "%f", zero / zero) < 0 || !strisnan (buf, 0, strlen (buf))) result |= 2; if (sprintf (buf, "%e", 1.0 / zero) < 0 || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0)) result |= 4; if (sprintf (buf, "%e", -1.0 / zero) < 0 || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0)) result |= 4; if (sprintf (buf, "%e", zero / zero) < 0 || !strisnan (buf, 0, strlen (buf))) result |= 8; if (sprintf (buf, "%g", 1.0 / zero) < 0 || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0)) result |= 16; if (sprintf (buf, "%g", -1.0 / zero) < 0 || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0)) result |= 16; if (sprintf (buf, "%g", zero / zero) < 0 || !strisnan (buf, 0, strlen (buf))) result |= 32; /* This test fails on HP-UX 10.20. */ if (have_minus_zero ()) if (sprintf (buf, "%g", - zero) < 0 || strcmp (buf, "-0") != 0) result |= 64; return result; }]])], [gl_cv_func_printf_infinite=yes], [gl_cv_func_printf_infinite=no], [ case "$host_os" in changequote(,)dnl # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_printf_infinite="guessing yes";; # Guess yes on musl systems. *-musl*) gl_cv_func_printf_infinite="guessing yes";; # Guess yes on FreeBSD >= 6. freebsd[1-5].*) gl_cv_func_printf_infinite="guessing no";; freebsd* | kfreebsd*) gl_cv_func_printf_infinite="guessing yes";; midnightbsd*) gl_cv_func_printf_infinite="guessing yes";; # Guess yes on Mac OS X >= 10.3. darwin[1-6].*) gl_cv_func_printf_infinite="guessing no";; darwin*) gl_cv_func_printf_infinite="guessing yes";; # Guess yes on HP-UX >= 11. hpux[7-9]* | hpux10*) gl_cv_func_printf_infinite="guessing no";; hpux*) gl_cv_func_printf_infinite="guessing yes";; # Guess yes on NetBSD >= 3. netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*) gl_cv_func_printf_infinite="guessing no";; netbsd*) gl_cv_func_printf_infinite="guessing yes";; # Guess yes on OpenBSD >= 6.0. openbsd[1-5].*) gl_cv_func_printf_infinite="guessing no";; openbsd*) gl_cv_func_printf_infinite="guessing yes";; # Guess yes on BeOS. beos*) gl_cv_func_printf_infinite="guessing yes";; # Guess no on Android. linux*-android*) gl_cv_func_printf_infinite="guessing no";; changequote([,])dnl # Guess yes on MSVC, no on mingw. mingw*) AC_EGREP_CPP([Known], [ #ifdef _MSC_VER Known #endif ], [gl_cv_func_printf_infinite="guessing yes"], [gl_cv_func_printf_infinite="guessing no"]) ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_printf_infinite="$gl_cross_guess_normal";; esac ]) ]) ]) dnl Test whether the *printf family of functions supports infinite and NaN dnl 'long double' arguments in the %f, %e, %g directives. (ISO C99, POSIX:2001) dnl Result is gl_cv_func_printf_infinite_long_double. AC_DEFUN([gl_PRINTF_INFINITE_LONG_DOUBLE], [ AC_REQUIRE([gl_PRINTF_LONG_DOUBLE]) AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([gl_BIGENDIAN]) AC_REQUIRE([gl_LONG_DOUBLE_VS_DOUBLE]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles dnl The user can set or unset the variable gl_printf_safe to indicate dnl that he wishes a safe handling of non-IEEE-754 'long double' values. if test -n "$gl_printf_safe"; then AC_DEFINE([CHECK_PRINTF_SAFE], [1], [Define if you wish *printf() functions that have a safe handling of non-IEEE-754 'long double' values.]) fi case "$gl_cv_func_printf_long_double" in *yes) AC_CACHE_CHECK([whether printf supports infinite 'long double' arguments], [gl_cv_func_printf_infinite_long_double], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ ]GL_NOCRASH[ #include #include #include static int strisnan (const char *string, size_t start_index, size_t end_index) { if (start_index < end_index) { if (string[start_index] == '-') start_index++; if (start_index + 3 <= end_index && memcmp (string + start_index, "nan", 3) == 0) { start_index += 3; if (start_index == end_index || (string[start_index] == '(' && string[end_index - 1] == ')')) return 1; } } return 0; } static char buf[10000]; static long double zeroL = 0.0L; int main () { int result = 0; nocrash_init(); if (sprintf (buf, "%Lf", 1.0L / zeroL) < 0 || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0)) result |= 1; if (sprintf (buf, "%Lf", -1.0L / zeroL) < 0 || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0)) result |= 1; if (sprintf (buf, "%Lf", zeroL / zeroL) < 0 || !strisnan (buf, 0, strlen (buf))) result |= 1; if (sprintf (buf, "%Le", 1.0L / zeroL) < 0 || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0)) result |= 1; if (sprintf (buf, "%Le", -1.0L / zeroL) < 0 || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0)) result |= 1; if (sprintf (buf, "%Le", zeroL / zeroL) < 0 || !strisnan (buf, 0, strlen (buf))) result |= 1; if (sprintf (buf, "%Lg", 1.0L / zeroL) < 0 || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0)) result |= 1; if (sprintf (buf, "%Lg", -1.0L / zeroL) < 0 || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0)) result |= 1; if (sprintf (buf, "%Lg", zeroL / zeroL) < 0 || !strisnan (buf, 0, strlen (buf))) result |= 1; #if CHECK_PRINTF_SAFE && ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_)) && !HAVE_SAME_LONG_DOUBLE_AS_DOUBLE /* Representation of an 80-bit 'long double' as an initializer for a sequence of 'unsigned int' words. */ # ifdef WORDS_BIGENDIAN # define LDBL80_WORDS(exponent,manthi,mantlo) \ { ((unsigned int) (exponent) << 16) | ((unsigned int) (manthi) >> 16), \ ((unsigned int) (manthi) << 16) | ((unsigned int) (mantlo) >> 16), \ (unsigned int) (mantlo) << 16 \ } # else # define LDBL80_WORDS(exponent,manthi,mantlo) \ { mantlo, manthi, exponent } # endif { /* Quiet NaN. */ static union { unsigned int word[4]; long double value; } x = { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) }; if (sprintf (buf, "%Lf", x.value) < 0 || !strisnan (buf, 0, strlen (buf))) result |= 2; if (sprintf (buf, "%Le", x.value) < 0 || !strisnan (buf, 0, strlen (buf))) result |= 2; if (sprintf (buf, "%Lg", x.value) < 0 || !strisnan (buf, 0, strlen (buf))) result |= 2; } { /* Signalling NaN. */ static union { unsigned int word[4]; long double value; } x = { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) }; if (sprintf (buf, "%Lf", x.value) < 0 || !strisnan (buf, 0, strlen (buf))) result |= 2; if (sprintf (buf, "%Le", x.value) < 0 || !strisnan (buf, 0, strlen (buf))) result |= 2; if (sprintf (buf, "%Lg", x.value) < 0 || !strisnan (buf, 0, strlen (buf))) result |= 2; } { /* Pseudo-NaN. */ static union { unsigned int word[4]; long double value; } x = { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) }; if (sprintf (buf, "%Lf", x.value) <= 0) result |= 4; if (sprintf (buf, "%Le", x.value) <= 0) result |= 4; if (sprintf (buf, "%Lg", x.value) <= 0) result |= 4; } { /* Pseudo-Infinity. */ static union { unsigned int word[4]; long double value; } x = { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) }; if (sprintf (buf, "%Lf", x.value) <= 0) result |= 8; if (sprintf (buf, "%Le", x.value) <= 0) result |= 8; if (sprintf (buf, "%Lg", x.value) <= 0) result |= 8; } { /* Pseudo-Zero. */ static union { unsigned int word[4]; long double value; } x = { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) }; if (sprintf (buf, "%Lf", x.value) <= 0) result |= 16; if (sprintf (buf, "%Le", x.value) <= 0) result |= 16; if (sprintf (buf, "%Lg", x.value) <= 0) result |= 16; } { /* Unnormalized number. */ static union { unsigned int word[4]; long double value; } x = { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) }; if (sprintf (buf, "%Lf", x.value) <= 0) result |= 32; if (sprintf (buf, "%Le", x.value) <= 0) result |= 32; if (sprintf (buf, "%Lg", x.value) <= 0) result |= 32; } { /* Pseudo-Denormal. */ static union { unsigned int word[4]; long double value; } x = { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) }; if (sprintf (buf, "%Lf", x.value) <= 0) result |= 64; if (sprintf (buf, "%Le", x.value) <= 0) result |= 64; if (sprintf (buf, "%Lg", x.value) <= 0) result |= 64; } #endif return result; }]])], [gl_cv_func_printf_infinite_long_double=yes], [gl_cv_func_printf_infinite_long_double=no], [case "$host_cpu" in # Guess no on ia64, x86_64, i386. ia64 | x86_64 | i*86) gl_cv_func_printf_infinite_long_double="guessing no";; *) case "$host_os" in changequote(,)dnl # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_printf_infinite_long_double="guessing yes";; # Guess yes on musl systems. *-musl*) gl_cv_func_printf_infinite_long_double="guessing yes";; # Guess yes on FreeBSD >= 6. freebsd[1-5].*) gl_cv_func_printf_infinite_long_double="guessing no";; freebsd* | kfreebsd*) gl_cv_func_printf_infinite_long_double="guessing yes";; midnightbsd*) gl_cv_func_printf_infinite_long_double="guessing yes";; # Guess yes on HP-UX >= 11. hpux[7-9]* | hpux10*) gl_cv_func_printf_infinite_long_double="guessing no";; hpux*) gl_cv_func_printf_infinite_long_double="guessing yes";; # Guess yes on OpenBSD >= 6.0. openbsd[1-5].*) gl_cv_func_printf_infinite_long_double="guessing no";; openbsd*) gl_cv_func_printf_infinite_long_double="guessing yes";; # Guess no on Android. linux*-android*) gl_cv_func_printf_infinite_long_double="guessing no";; changequote([,])dnl # Guess yes on MSVC, no on mingw. mingw*) AC_EGREP_CPP([Known], [ #ifdef _MSC_VER Known #endif ], [gl_cv_func_printf_infinite_long_double="guessing yes"], [gl_cv_func_printf_infinite_long_double="guessing no"]) ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_printf_infinite_long_double="$gl_cross_guess_normal";; esac ;; esac ]) ]) ;; *) gl_cv_func_printf_infinite_long_double="irrelevant" ;; esac ]) dnl Test whether the *printf family of functions supports the 'a' and 'A' dnl conversion specifier for hexadecimal output of floating-point numbers. dnl (ISO C99, POSIX:2001) dnl Result is gl_cv_func_printf_directive_a. AC_DEFUN([gl_PRINTF_DIRECTIVE_A], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether printf supports the 'a' and 'A' directives], [gl_cv_func_printf_directive_a], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include static char buf[100]; static double zero = 0.0; int main () { int result = 0; if (sprintf (buf, "%a %d", 3.1416015625, 33, 44, 55) < 0 || (strcmp (buf, "0x1.922p+1 33") != 0 && strcmp (buf, "0x3.244p+0 33") != 0 && strcmp (buf, "0x6.488p-1 33") != 0 && strcmp (buf, "0xc.91p-2 33") != 0)) result |= 1; if (sprintf (buf, "%A %d", -3.1416015625, 33, 44, 55) < 0 || (strcmp (buf, "-0X1.922P+1 33") != 0 && strcmp (buf, "-0X3.244P+0 33") != 0 && strcmp (buf, "-0X6.488P-1 33") != 0 && strcmp (buf, "-0XC.91P-2 33") != 0)) result |= 2; /* This catches a FreeBSD 13.0 bug: it doesn't round. */ if (sprintf (buf, "%.2a %d", 1.51, 33, 44, 55) < 0 || (strcmp (buf, "0x1.83p+0 33") != 0 && strcmp (buf, "0x3.05p-1 33") != 0 && strcmp (buf, "0x6.0ap-2 33") != 0 && strcmp (buf, "0xc.14p-3 33") != 0)) result |= 4; /* This catches a Mac OS X 10.12.4 (Darwin 16.5) bug: it doesn't round. */ if (sprintf (buf, "%.0a %d", 1.51, 33, 44, 55) < 0 || (strcmp (buf, "0x2p+0 33") != 0 && strcmp (buf, "0x3p-1 33") != 0 && strcmp (buf, "0x6p-2 33") != 0 && strcmp (buf, "0xcp-3 33") != 0)) result |= 4; /* This catches a FreeBSD 6.1 bug. See */ if (sprintf (buf, "%010a %d", 1.0 / zero, 33, 44, 55) < 0 || buf[0] == '0') result |= 8; /* This catches a Mac OS X 10.3.9 (Darwin 7.9) bug. */ if (sprintf (buf, "%.1a", 1.999) < 0 || (strcmp (buf, "0x1.0p+1") != 0 && strcmp (buf, "0x2.0p+0") != 0 && strcmp (buf, "0x4.0p-1") != 0 && strcmp (buf, "0x8.0p-2") != 0)) result |= 16; /* This catches the same Mac OS X 10.3.9 (Darwin 7.9) bug and also a glibc 2.4 bug . */ if (sprintf (buf, "%.1La", 1.999L) < 0 || (strcmp (buf, "0x1.0p+1") != 0 && strcmp (buf, "0x2.0p+0") != 0 && strcmp (buf, "0x4.0p-1") != 0 && strcmp (buf, "0x8.0p-2") != 0)) result |= 32; return result; }]])], [gl_cv_func_printf_directive_a=yes], [gl_cv_func_printf_directive_a=no], [ case "$host_os" in # Guess yes on glibc >= 2.5 systems. *-gnu* | gnu*) AC_EGREP_CPP([BZ2908], [ #include #ifdef __GNU_LIBRARY__ #if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 5) || (__GLIBC__ > 2)) && !defined __UCLIBC__ BZ2908 #endif #endif ], [gl_cv_func_printf_directive_a="guessing yes"], [gl_cv_func_printf_directive_a="guessing no"]) ;; # Guess yes on musl systems. *-musl*) gl_cv_func_printf_directive_a="guessing yes";; # Guess no on Android. linux*-android*) gl_cv_func_printf_directive_a="guessing no";; # Guess no on native Windows. mingw*) gl_cv_func_printf_directive_a="guessing no";; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_printf_directive_a="$gl_cross_guess_normal";; esac ]) ]) ]) dnl Test whether the *printf family of functions supports the %F format dnl directive. (ISO C99, POSIX:2001) dnl Result is gl_cv_func_printf_directive_f. AC_DEFUN([gl_PRINTF_DIRECTIVE_F], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether printf supports the 'F' directive], [gl_cv_func_printf_directive_f], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include static char buf[100]; static double zero = 0.0; int main () { int result = 0; if (sprintf (buf, "%F %d", 1234567.0, 33, 44, 55) < 0 || strcmp (buf, "1234567.000000 33") != 0) result |= 1; if (sprintf (buf, "%F", 1.0 / zero) < 0 || (strcmp (buf, "INF") != 0 && strcmp (buf, "INFINITY") != 0)) result |= 2; /* This catches a Cygwin 1.5.x bug. */ if (sprintf (buf, "%.F", 1234.0) < 0 || strcmp (buf, "1234") != 0) result |= 4; return result; }]])], [gl_cv_func_printf_directive_f=yes], [gl_cv_func_printf_directive_f=no], [ case "$host_os" in changequote(,)dnl # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_printf_directive_f="guessing yes";; # Guess yes on musl systems. *-musl*) gl_cv_func_printf_directive_f="guessing yes";; # Guess yes on FreeBSD >= 6. freebsd[1-5].*) gl_cv_func_printf_directive_f="guessing no";; freebsd* | kfreebsd*) gl_cv_func_printf_directive_f="guessing yes";; midnightbsd*) gl_cv_func_printf_directive_f="guessing yes";; # Guess yes on Mac OS X >= 10.3. darwin[1-6].*) gl_cv_func_printf_directive_f="guessing no";; darwin*) gl_cv_func_printf_directive_f="guessing yes";; # Guess yes on OpenBSD >= 6.0. openbsd[1-5].*) gl_cv_func_printf_directive_f="guessing no";; openbsd*) gl_cv_func_printf_directive_f="guessing yes";; # Guess yes on Solaris >= 2.10. solaris2.[1-9][0-9]*) gl_cv_func_printf_directive_f="guessing yes";; solaris*) gl_cv_func_printf_directive_f="guessing no";; # Guess no on Android. linux*-android*) gl_cv_func_printf_directive_f="guessing no";; changequote([,])dnl # Guess yes on MSVC, no on mingw. mingw*) AC_EGREP_CPP([Known], [ #ifdef _MSC_VER Known #endif ], [gl_cv_func_printf_directive_f="guessing yes"], [gl_cv_func_printf_directive_f="guessing no"]) ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_printf_directive_f="$gl_cross_guess_normal";; esac ]) ]) ]) dnl Test whether the *printf family of functions supports the %n format dnl directive. (ISO C99, POSIX:2001) dnl Result is gl_cv_func_printf_directive_n. AC_DEFUN([gl_PRINTF_DIRECTIVE_N], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether printf supports the 'n' directive], [gl_cv_func_printf_directive_n], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include #include #ifdef _MSC_VER #include /* See page about "Parameter Validation" on msdn.microsoft.com. */ static void cdecl invalid_parameter_handler (const wchar_t *expression, const wchar_t *function, const wchar_t *file, unsigned int line, uintptr_t dummy) { exit (1); } #endif static char fmtstring[10]; static char buf[100]; int main () { int count = -1; #ifdef _MSC_VER _set_invalid_parameter_handler (invalid_parameter_handler); #endif /* Copy the format string. Some systems (glibc with _FORTIFY_SOURCE=2) support %n in format strings in read-only memory but not in writable memory. */ strcpy (fmtstring, "%d %n"); if (sprintf (buf, fmtstring, 123, &count, 33, 44, 55) < 0 || strcmp (buf, "123 ") != 0 || count != 4) return 1; return 0; }]])], [gl_cv_func_printf_directive_n=yes], [gl_cv_func_printf_directive_n=no], [case "$host_os" in # Guess no on glibc when _FORTIFY_SOURCE >= 2. *-gnu* | gnu*) AC_COMPILE_IFELSE( [AC_LANG_SOURCE( [[#if _FORTIFY_SOURCE >= 2 error fail #endif ]])], [gl_cv_func_printf_directive_n="guessing yes"], [gl_cv_func_printf_directive_n="guessing no"]) ;; # Guess no on Android. linux*-android*) gl_cv_func_printf_directive_n="guessing no";; # Guess no on native Windows. mingw*) gl_cv_func_printf_directive_n="guessing no";; *) gl_cv_func_printf_directive_n="guessing yes";; esac ]) ]) ]) dnl Test whether the *printf family of functions supports the %ls format dnl directive and in particular, when a precision is specified, whether dnl the functions stop converting the wide string argument when the number dnl of bytes that have been produced by this conversion equals or exceeds dnl the precision. dnl Result is gl_cv_func_printf_directive_ls. AC_DEFUN([gl_PRINTF_DIRECTIVE_LS], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether printf supports the 'ls' directive], [gl_cv_func_printf_directive_ls], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include #include int main () { int result = 0; char buf[100]; /* Test whether %ls works at all. This test fails on OpenBSD 4.0, IRIX 6.5, Solaris 2.6, Haiku, but not on Cygwin 1.5. */ { static const wchar_t wstring[] = { 'a', 'b', 'c', 0 }; buf[0] = '\0'; if (sprintf (buf, "%ls", wstring) < 0 || strcmp (buf, "abc") != 0) result |= 1; } /* This test fails on IRIX 6.5, Solaris 2.6, Cygwin 1.5, Haiku (with an assertion failure inside libc), but not on OpenBSD 4.0. */ { static const wchar_t wstring[] = { 'a', 0 }; buf[0] = '\0'; if (sprintf (buf, "%ls", wstring) < 0 || strcmp (buf, "a") != 0) result |= 2; } /* Test whether precisions in %ls are supported as specified in ISO C 99 section 7.19.6.1: "If a precision is specified, no more than that many bytes are written (including shift sequences, if any), and the array shall contain a null wide character if, to equal the multibyte character sequence length given by the precision, the function would need to access a wide character one past the end of the array." This test fails on Solaris 10. */ { static const wchar_t wstring[] = { 'a', 'b', (wchar_t) 0xfdfdfdfd, 0 }; buf[0] = '\0'; if (sprintf (buf, "%.2ls", wstring) < 0 || strcmp (buf, "ab") != 0) result |= 8; } return result; }]])], [gl_cv_func_printf_directive_ls=yes], [gl_cv_func_printf_directive_ls=no], [ changequote(,)dnl case "$host_os" in # Guess yes on OpenBSD >= 6.0. openbsd[1-5].*) gl_cv_func_printf_directive_ls="guessing no";; openbsd*) gl_cv_func_printf_directive_ls="guessing yes";; irix*) gl_cv_func_printf_directive_ls="guessing no";; solaris*) gl_cv_func_printf_directive_ls="guessing no";; cygwin*) gl_cv_func_printf_directive_ls="guessing no";; beos* | haiku*) gl_cv_func_printf_directive_ls="guessing no";; # Guess no on Android. linux*-android*) gl_cv_func_printf_directive_ls="guessing no";; # Guess yes on native Windows. mingw*) gl_cv_func_printf_directive_ls="guessing yes";; *) gl_cv_func_printf_directive_ls="guessing yes";; esac changequote([,])dnl ]) ]) ]) dnl Test whether the *printf family of functions supports POSIX/XSI format dnl strings with positions. (POSIX:2001) dnl Result is gl_cv_func_printf_positions. AC_DEFUN([gl_PRINTF_POSITIONS], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether printf supports POSIX/XSI format strings with positions], [gl_cv_func_printf_positions], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include /* The string "%2$d %1$d", with dollar characters protected from the shell's dollar expansion (possibly an autoconf bug). */ static char format[] = { '%', '2', '$', 'd', ' ', '%', '1', '$', 'd', '\0' }; static char buf[100]; int main () { sprintf (buf, format, 33, 55); return (strcmp (buf, "55 33") != 0); }]])], [gl_cv_func_printf_positions=yes], [gl_cv_func_printf_positions=no], [ changequote(,)dnl case "$host_os" in netbsd[1-3]* | netbsdelf[1-3]* | netbsdaout[1-3]* | netbsdcoff[1-3]*) gl_cv_func_printf_positions="guessing no";; beos*) gl_cv_func_printf_positions="guessing no";; # Guess yes on Android. linux*-android*) gl_cv_func_printf_positions="guessing yes";; # Guess no on native Windows. mingw* | pw*) gl_cv_func_printf_positions="guessing no";; *) gl_cv_func_printf_positions="guessing yes";; esac changequote([,])dnl ]) ]) ]) dnl Test whether the *printf family of functions supports POSIX/XSI format dnl strings with the ' flag for grouping of decimal digits. (POSIX:2001) dnl Result is gl_cv_func_printf_flag_grouping. AC_DEFUN([gl_PRINTF_FLAG_GROUPING], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether printf supports the grouping flag], [gl_cv_func_printf_flag_grouping], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include static char buf[100]; int main () { if (sprintf (buf, "%'d %d", 1234567, 99) < 0 || buf[strlen (buf) - 1] != '9') return 1; return 0; }]])], [gl_cv_func_printf_flag_grouping=yes], [gl_cv_func_printf_flag_grouping=no], [ changequote(,)dnl case "$host_os" in cygwin*) gl_cv_func_printf_flag_grouping="guessing no";; netbsd*) gl_cv_func_printf_flag_grouping="guessing no";; # Guess no on Android. linux*-android*) gl_cv_func_printf_flag_grouping="guessing no";; # Guess no on native Windows. mingw* | pw*) gl_cv_func_printf_flag_grouping="guessing no";; *) gl_cv_func_printf_flag_grouping="guessing yes";; esac changequote([,])dnl ]) ]) ]) dnl Test whether the *printf family of functions supports the - flag correctly. dnl (ISO C99.) See dnl dnl Result is gl_cv_func_printf_flag_leftadjust. AC_DEFUN([gl_PRINTF_FLAG_LEFTADJUST], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether printf supports the left-adjust flag correctly], [gl_cv_func_printf_flag_leftadjust], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include static char buf[100]; int main () { /* Check that a '-' flag is not annihilated by a negative width. */ if (sprintf (buf, "a%-*sc", -3, "b") < 0 || strcmp (buf, "ab c") != 0) return 1; return 0; }]])], [gl_cv_func_printf_flag_leftadjust=yes], [gl_cv_func_printf_flag_leftadjust=no], [ changequote(,)dnl case "$host_os" in # Guess yes on HP-UX 11. hpux11*) gl_cv_func_printf_flag_leftadjust="guessing yes";; # Guess no on HP-UX 10 and older. hpux*) gl_cv_func_printf_flag_leftadjust="guessing no";; # Guess yes on Android. linux*-android*) gl_cv_func_printf_flag_leftadjust="guessing yes";; # Guess yes on native Windows. mingw*) gl_cv_func_printf_flag_leftadjust="guessing yes";; # Guess yes otherwise. *) gl_cv_func_printf_flag_leftadjust="guessing yes";; esac changequote([,])dnl ]) ]) ]) dnl Test whether the *printf family of functions supports padding of non-finite dnl values with the 0 flag correctly. (ISO C99 + TC1 + TC2.) See dnl dnl Result is gl_cv_func_printf_flag_zero. AC_DEFUN([gl_PRINTF_FLAG_ZERO], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether printf supports the zero flag correctly], [gl_cv_func_printf_flag_zero], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include static char buf[100]; static double zero = 0.0; int main () { if (sprintf (buf, "%010f", 1.0 / zero, 33, 44, 55) < 0 || (strcmp (buf, " inf") != 0 && strcmp (buf, " infinity") != 0)) return 1; return 0; }]])], [gl_cv_func_printf_flag_zero=yes], [gl_cv_func_printf_flag_zero=no], [ changequote(,)dnl case "$host_os" in # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_printf_flag_zero="guessing yes";; # Guess yes on musl systems. *-musl*) gl_cv_func_printf_flag_zero="guessing yes";; # Guess yes on BeOS. beos*) gl_cv_func_printf_flag_zero="guessing yes";; # Guess no on Android. linux*-android*) gl_cv_func_printf_flag_zero="guessing no";; # Guess no on native Windows. mingw*) gl_cv_func_printf_flag_zero="guessing no";; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_printf_flag_zero="$gl_cross_guess_normal";; esac changequote([,])dnl ]) ]) ]) dnl Test whether the *printf family of functions supports large precisions. dnl On mingw, precisions larger than 512 are treated like 512, in integer, dnl floating-point or pointer output. On Solaris 10/x86, precisions larger dnl than 510 in floating-point output crash the program. On Solaris 10/SPARC, dnl precisions larger than 510 in floating-point output yield wrong results. dnl On AIX 7.1, precisions larger than 998 in floating-point output yield dnl wrong results. On BeOS, precisions larger than 1044 crash the program. dnl Result is gl_cv_func_printf_precision. AC_DEFUN([gl_PRINTF_PRECISION], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether printf supports large precisions], [gl_cv_func_printf_precision], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include static char buf[5000]; int main () { int result = 0; #ifdef __BEOS__ /* On BeOS, this would crash and show a dialog box. Avoid the crash. */ return 1; #endif if (sprintf (buf, "%.4000d %d", 1, 33, 44) < 4000 + 3) result |= 1; if (sprintf (buf, "%.4000f %d", 1.0, 33, 44) < 4000 + 5) result |= 2; if (sprintf (buf, "%.511f %d", 1.0, 33, 44) < 511 + 5 || buf[0] != '1') result |= 4; if (sprintf (buf, "%.999f %d", 1.0, 33, 44) < 999 + 5 || buf[0] != '1') result |= 4; return result; }]])], [gl_cv_func_printf_precision=yes], [gl_cv_func_printf_precision=no], [ changequote(,)dnl case "$host_os" in # Guess no only on Solaris, native Windows, and BeOS systems. solaris*) gl_cv_func_printf_precision="guessing no" ;; mingw* | pw*) gl_cv_func_printf_precision="guessing no" ;; beos*) gl_cv_func_printf_precision="guessing no" ;; # Guess yes on Android. linux*-android*) gl_cv_func_printf_precision="guessing yes" ;; *) gl_cv_func_printf_precision="guessing yes" ;; esac changequote([,])dnl ]) ]) ]) dnl Test whether the *printf family of functions recovers gracefully in case dnl of an out-of-memory condition, or whether it crashes the entire program. dnl Result is gl_cv_func_printf_enomem. AC_DEFUN([gl_PRINTF_ENOMEM], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([gl_MULTIARCH]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether printf survives out-of-memory conditions], [gl_cv_func_printf_enomem], [ gl_cv_func_printf_enomem="guessing no" if test "$cross_compiling" = no; then if test $APPLE_UNIVERSAL_BUILD = 0; then AC_LANG_CONFTEST([AC_LANG_SOURCE([[ ]GL_NOCRASH[ #include #include #include #include #include int main() { struct rlimit limit; int ret; nocrash_init (); /* Some printf implementations allocate temporary space with malloc. */ /* On BSD systems, malloc() is limited by RLIMIT_DATA. */ #ifdef RLIMIT_DATA if (getrlimit (RLIMIT_DATA, &limit) < 0) return 77; if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000) limit.rlim_max = 5000000; limit.rlim_cur = limit.rlim_max; if (setrlimit (RLIMIT_DATA, &limit) < 0) return 77; #endif /* On Linux systems, malloc() is limited by RLIMIT_AS. */ #ifdef RLIMIT_AS if (getrlimit (RLIMIT_AS, &limit) < 0) return 77; if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000) limit.rlim_max = 5000000; limit.rlim_cur = limit.rlim_max; if (setrlimit (RLIMIT_AS, &limit) < 0) return 77; #endif /* Some printf implementations allocate temporary space on the stack. */ #ifdef RLIMIT_STACK if (getrlimit (RLIMIT_STACK, &limit) < 0) return 77; if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000) limit.rlim_max = 5000000; limit.rlim_cur = limit.rlim_max; if (setrlimit (RLIMIT_STACK, &limit) < 0) return 77; #endif ret = printf ("%.5000000f", 1.0); return !(ret == 5000002 || (ret < 0 && errno == ENOMEM)); } ]])]) if AC_TRY_EVAL([ac_link]) && test -s conftest$ac_exeext; then (./conftest 2>&AS_MESSAGE_LOG_FD result=$? _AS_ECHO_LOG([\$? = $result]) if test $result != 0 && test $result != 77; then result=1; fi exit $result ) >/dev/null 2>/dev/null case $? in 0) gl_cv_func_printf_enomem="yes" ;; 77) gl_cv_func_printf_enomem="guessing no" ;; *) gl_cv_func_printf_enomem="no" ;; esac else gl_cv_func_printf_enomem="guessing no" fi rm -fr conftest* else dnl A universal build on Apple Mac OS X platforms. dnl The result would be 'no' in 32-bit mode and 'yes' in 64-bit mode. dnl But we need a configuration result that is valid in both modes. gl_cv_func_printf_enomem="guessing no" fi fi if test "$gl_cv_func_printf_enomem" = "guessing no"; then changequote(,)dnl case "$host_os" in # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_printf_enomem="guessing yes";; # Guess yes on Solaris. solaris*) gl_cv_func_printf_enomem="guessing yes";; # Guess yes on AIX. aix*) gl_cv_func_printf_enomem="guessing yes";; # Guess yes on HP-UX/hppa. hpux*) case "$host_cpu" in hppa*) gl_cv_func_printf_enomem="guessing yes";; *) gl_cv_func_printf_enomem="guessing no";; esac ;; # Guess yes on IRIX. irix*) gl_cv_func_printf_enomem="guessing yes";; # Guess yes on OSF/1. osf*) gl_cv_func_printf_enomem="guessing yes";; # Guess yes on BeOS. beos*) gl_cv_func_printf_enomem="guessing yes";; # Guess yes on Haiku. haiku*) gl_cv_func_printf_enomem="guessing yes";; # Guess no on Android. linux*-android*) gl_cv_func_printf_enomem="guessing no";; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_printf_enomem="$gl_cross_guess_normal";; esac changequote([,])dnl fi ]) ]) dnl Test whether the snprintf function exists. (ISO C99, POSIX:2001) dnl Result is ac_cv_func_snprintf. AC_DEFUN([gl_SNPRINTF_PRESENCE], [ AC_CHECK_FUNCS_ONCE([snprintf]) ]) dnl Test whether the string produced by the snprintf function is always NUL dnl terminated. (ISO C99, POSIX:2001) dnl Result is gl_cv_func_snprintf_truncation_c99. AC_DEFUN_ONCE([gl_SNPRINTF_TRUNCATION_C99], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_REQUIRE([gl_SNPRINTF_PRESENCE]) AC_CACHE_CHECK([whether snprintf truncates the result as in C99], [gl_cv_func_snprintf_truncation_c99], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include #if HAVE_SNPRINTF # define my_snprintf snprintf #else # include static int my_snprintf (char *buf, int size, const char *format, ...) { va_list args; int ret; va_start (args, format); ret = vsnprintf (buf, size, format, args); va_end (args); return ret; } #endif static char buf[100]; int main () { strcpy (buf, "ABCDEF"); my_snprintf (buf, 3, "%d %d", 4567, 89); if (memcmp (buf, "45\0DEF", 6) != 0) return 1; return 0; }]])], [gl_cv_func_snprintf_truncation_c99=yes], [gl_cv_func_snprintf_truncation_c99=no], [ changequote(,)dnl case "$host_os" in # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_snprintf_truncation_c99="guessing yes";; # Guess yes on musl systems. *-musl*) gl_cv_func_snprintf_truncation_c99="guessing yes";; # Guess yes on FreeBSD >= 5. freebsd[1-4].*) gl_cv_func_snprintf_truncation_c99="guessing no";; freebsd* | kfreebsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";; midnightbsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";; # Guess yes on Mac OS X >= 10.3. darwin[1-6].*) gl_cv_func_snprintf_truncation_c99="guessing no";; darwin*) gl_cv_func_snprintf_truncation_c99="guessing yes";; # Guess yes on OpenBSD >= 3.9. openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*) gl_cv_func_snprintf_truncation_c99="guessing no";; openbsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";; # Guess yes on Solaris >= 2.6. solaris2.[0-5] | solaris2.[0-5].*) gl_cv_func_snprintf_truncation_c99="guessing no";; solaris*) gl_cv_func_snprintf_truncation_c99="guessing yes";; # Guess yes on AIX >= 4. aix[1-3]*) gl_cv_func_snprintf_truncation_c99="guessing no";; aix*) gl_cv_func_snprintf_truncation_c99="guessing yes";; # Guess yes on HP-UX >= 11. hpux[7-9]* | hpux10*) gl_cv_func_snprintf_truncation_c99="guessing no";; hpux*) gl_cv_func_snprintf_truncation_c99="guessing yes";; # Guess yes on IRIX >= 6.5. irix6.5) gl_cv_func_snprintf_truncation_c99="guessing yes";; # Guess yes on OSF/1 >= 5. osf[3-4]*) gl_cv_func_snprintf_truncation_c99="guessing no";; osf*) gl_cv_func_snprintf_truncation_c99="guessing yes";; # Guess yes on NetBSD >= 3. netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*) gl_cv_func_snprintf_truncation_c99="guessing no";; netbsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";; # Guess yes on BeOS. beos*) gl_cv_func_snprintf_truncation_c99="guessing yes";; # Guess yes on Android. linux*-android*) gl_cv_func_snprintf_truncation_c99="guessing yes";; # Guess no on native Windows. mingw*) gl_cv_func_snprintf_truncation_c99="guessing no";; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_snprintf_truncation_c99="$gl_cross_guess_normal";; esac changequote([,])dnl ]) ]) ]) dnl Test whether the return value of the snprintf function is the number dnl of bytes (excluding the terminating NUL) that would have been produced dnl if the buffer had been large enough. (ISO C99, POSIX:2001) dnl For example, this test program fails on IRIX 6.5: dnl --------------------------------------------------------------------- dnl #include dnl int main() dnl { dnl static char buf[8]; dnl int retval = snprintf (buf, 3, "%d", 12345); dnl return retval >= 0 && retval < 3; dnl } dnl --------------------------------------------------------------------- dnl Result is gl_cv_func_snprintf_retval_c99. AC_DEFUN_ONCE([gl_SNPRINTF_RETVAL_C99], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_REQUIRE([gl_SNPRINTF_PRESENCE]) AC_CACHE_CHECK([whether snprintf returns a byte count as in C99], [gl_cv_func_snprintf_retval_c99], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include #if HAVE_SNPRINTF # define my_snprintf snprintf #else # include static int my_snprintf (char *buf, int size, const char *format, ...) { va_list args; int ret; va_start (args, format); ret = vsnprintf (buf, size, format, args); va_end (args); return ret; } #endif static char buf[100]; int main () { strcpy (buf, "ABCDEF"); if (my_snprintf (buf, 3, "%d %d", 4567, 89) != 7) return 1; if (my_snprintf (buf, 0, "%d %d", 4567, 89) != 7) return 2; if (my_snprintf (NULL, 0, "%d %d", 4567, 89) != 7) return 3; return 0; }]])], [gl_cv_func_snprintf_retval_c99=yes], [gl_cv_func_snprintf_retval_c99=no], [case "$host_os" in changequote(,)dnl # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_snprintf_retval_c99="guessing yes";; # Guess yes on musl systems. *-musl*) gl_cv_func_snprintf_retval_c99="guessing yes";; # Guess yes on FreeBSD >= 5. freebsd[1-4].*) gl_cv_func_snprintf_retval_c99="guessing no";; freebsd* | kfreebsd*) gl_cv_func_snprintf_retval_c99="guessing yes";; midnightbsd*) gl_cv_func_snprintf_retval_c99="guessing yes";; # Guess yes on Mac OS X >= 10.3. darwin[1-6].*) gl_cv_func_snprintf_retval_c99="guessing no";; darwin*) gl_cv_func_snprintf_retval_c99="guessing yes";; # Guess yes on OpenBSD >= 3.9. openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*) gl_cv_func_snprintf_retval_c99="guessing no";; openbsd*) gl_cv_func_snprintf_retval_c99="guessing yes";; # Guess yes on Solaris >= 2.10. solaris2.[1-9][0-9]*) gl_cv_func_printf_sizes_c99="guessing yes";; solaris*) gl_cv_func_printf_sizes_c99="guessing no";; # Guess yes on AIX >= 4. aix[1-3]*) gl_cv_func_snprintf_retval_c99="guessing no";; aix*) gl_cv_func_snprintf_retval_c99="guessing yes";; # Guess yes on NetBSD >= 3. netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*) gl_cv_func_snprintf_retval_c99="guessing no";; netbsd*) gl_cv_func_snprintf_retval_c99="guessing yes";; # Guess yes on BeOS. beos*) gl_cv_func_snprintf_retval_c99="guessing yes";; # Guess yes on Android. linux*-android*) gl_cv_func_snprintf_retval_c99="guessing yes";; changequote([,])dnl # Guess yes on MSVC, no on mingw. mingw*) AC_EGREP_CPP([Known], [ #ifdef _MSC_VER Known #endif ], [gl_cv_func_snprintf_retval_c99="guessing yes"], [gl_cv_func_snprintf_retval_c99="guessing no"]) ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_snprintf_retval_c99="$gl_cross_guess_normal";; esac ]) ]) ]) dnl Test whether the snprintf function supports the %n format directive dnl also in truncated portions of the format string. (ISO C99, POSIX:2001) dnl Result is gl_cv_func_snprintf_directive_n. AC_DEFUN([gl_SNPRINTF_DIRECTIVE_N], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_REQUIRE([gl_SNPRINTF_PRESENCE]) AC_CACHE_CHECK([whether snprintf fully supports the 'n' directive], [gl_cv_func_snprintf_directive_n], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include #if HAVE_SNPRINTF # define my_snprintf snprintf #else # include static int my_snprintf (char *buf, int size, const char *format, ...) { va_list args; int ret; va_start (args, format); ret = vsnprintf (buf, size, format, args); va_end (args); return ret; } #endif static char fmtstring[10]; static char buf[100]; int main () { int count = -1; /* Copy the format string. Some systems (glibc with _FORTIFY_SOURCE=2) support %n in format strings in read-only memory but not in writable memory. */ strcpy (fmtstring, "%d %n"); my_snprintf (buf, 4, fmtstring, 12345, &count, 33, 44, 55); if (count != 6) return 1; return 0; }]])], [gl_cv_func_snprintf_directive_n=yes], [gl_cv_func_snprintf_directive_n=no], [ case "$host_os" in # Guess no on glibc when _FORTIFY_SOURCE >= 2. *-gnu* | gnu*) AC_COMPILE_IFELSE( [AC_LANG_SOURCE( [[#if _FORTIFY_SOURCE >= 2 error fail #endif ]])], [gl_cv_func_snprintf_directive_n="guessing yes"], [gl_cv_func_snprintf_directive_n="guessing no"]) ;; changequote(,)dnl # Guess yes on musl systems. *-musl*) gl_cv_func_snprintf_directive_n="guessing yes";; # Guess yes on FreeBSD >= 5. freebsd[1-4].*) gl_cv_func_snprintf_directive_n="guessing no";; freebsd* | kfreebsd*) gl_cv_func_snprintf_directive_n="guessing yes";; midnightbsd*) gl_cv_func_snprintf_directive_n="guessing yes";; # Guess yes on Mac OS X >= 10.3. darwin[1-6].*) gl_cv_func_snprintf_directive_n="guessing no";; darwin*) gl_cv_func_snprintf_directive_n="guessing yes";; # Guess yes on Solaris >= 2.6. solaris2.[0-5] | solaris2.[0-5].*) gl_cv_func_snprintf_directive_n="guessing no";; solaris*) gl_cv_func_snprintf_directive_n="guessing yes";; # Guess yes on AIX >= 4. aix[1-3]*) gl_cv_func_snprintf_directive_n="guessing no";; aix*) gl_cv_func_snprintf_directive_n="guessing yes";; # Guess yes on IRIX >= 6.5. irix6.5) gl_cv_func_snprintf_directive_n="guessing yes";; # Guess yes on OSF/1 >= 5. osf[3-4]*) gl_cv_func_snprintf_directive_n="guessing no";; osf*) gl_cv_func_snprintf_directive_n="guessing yes";; # Guess yes on NetBSD >= 3. netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*) gl_cv_func_snprintf_directive_n="guessing no";; netbsd*) gl_cv_func_snprintf_directive_n="guessing yes";; # Guess yes on BeOS. beos*) gl_cv_func_snprintf_directive_n="guessing yes";; # Guess no on Android. linux*-android*) gl_cv_func_snprintf_directive_n="guessing no";; # Guess no on native Windows. mingw*) gl_cv_func_snprintf_directive_n="guessing no";; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_snprintf_directive_n="$gl_cross_guess_normal";; changequote([,])dnl esac ]) ]) ]) dnl Test whether the snprintf function, when passed a size = 1, writes any dnl output without bounds in this case, behaving like sprintf. This is the dnl case on Linux libc5. dnl Result is gl_cv_func_snprintf_size1. AC_DEFUN([gl_SNPRINTF_SIZE1], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_REQUIRE([gl_SNPRINTF_PRESENCE]) AC_CACHE_CHECK([whether snprintf respects a size of 1], [gl_cv_func_snprintf_size1], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #if HAVE_SNPRINTF # define my_snprintf snprintf #else # include static int my_snprintf (char *buf, int size, const char *format, ...) { va_list args; int ret; va_start (args, format); ret = vsnprintf (buf, size, format, args); va_end (args); return ret; } #endif int main() { static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' }; my_snprintf (buf, 1, "%d", 12345); return buf[1] != 'E'; }]])], [gl_cv_func_snprintf_size1=yes], [gl_cv_func_snprintf_size1=no], [case "$host_os" in # Guess yes on Android. linux*-android*) gl_cv_func_snprintf_size1="guessing yes" ;; # Guess yes on native Windows. mingw*) gl_cv_func_snprintf_size1="guessing yes" ;; *) gl_cv_func_snprintf_size1="guessing yes" ;; esac ]) ]) ]) dnl Test whether the vsnprintf function, when passed a zero size, produces no dnl output. (ISO C99, POSIX:2001) dnl For example, snprintf nevertheless writes a NUL byte in this case dnl on OSF/1 5.1: dnl --------------------------------------------------------------------- dnl #include dnl int main() dnl { dnl static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' }; dnl snprintf (buf, 0, "%d", 12345); dnl return buf[0] != 'D'; dnl } dnl --------------------------------------------------------------------- dnl And vsnprintf writes any output without bounds in this case, behaving like dnl vsprintf, on HP-UX 11 and OSF/1 5.1: dnl --------------------------------------------------------------------- dnl #include dnl #include dnl static int my_snprintf (char *buf, int size, const char *format, ...) dnl { dnl va_list args; dnl int ret; dnl va_start (args, format); dnl ret = vsnprintf (buf, size, format, args); dnl va_end (args); dnl return ret; dnl } dnl int main() dnl { dnl static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' }; dnl my_snprintf (buf, 0, "%d", 12345); dnl return buf[0] != 'D'; dnl } dnl --------------------------------------------------------------------- dnl Result is gl_cv_func_vsnprintf_zerosize_c99. AC_DEFUN([gl_VSNPRINTF_ZEROSIZE_C99], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_CACHE_CHECK([whether vsnprintf respects a zero size as in C99], [gl_cv_func_vsnprintf_zerosize_c99], [ AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include static int my_snprintf (char *buf, int size, const char *format, ...) { va_list args; int ret; va_start (args, format); ret = vsnprintf (buf, size, format, args); va_end (args); return ret; } int main() { static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' }; my_snprintf (buf, 0, "%d", 12345); return buf[0] != 'D'; }]])], [gl_cv_func_vsnprintf_zerosize_c99=yes], [gl_cv_func_vsnprintf_zerosize_c99=no], [ changequote(,)dnl case "$host_os" in # Guess yes on glibc systems. *-gnu* | gnu*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";; # Guess yes on musl systems. *-musl*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";; # Guess yes on FreeBSD >= 5. freebsd[1-4].*) gl_cv_func_vsnprintf_zerosize_c99="guessing no";; freebsd* | kfreebsd*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";; midnightbsd*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";; # Guess yes on Mac OS X >= 10.3. darwin[1-6].*) gl_cv_func_vsnprintf_zerosize_c99="guessing no";; darwin*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";; # Guess yes on Cygwin. cygwin*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";; # Guess yes on Solaris >= 2.6. solaris2.[0-5] | solaris2.[0-5].*) gl_cv_func_vsnprintf_zerosize_c99="guessing no";; solaris*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";; # Guess yes on AIX >= 4. aix[1-3]*) gl_cv_func_vsnprintf_zerosize_c99="guessing no";; aix*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";; # Guess yes on IRIX >= 6.5. irix6.5) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";; # Guess yes on NetBSD >= 3. netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*) gl_cv_func_vsnprintf_zerosize_c99="guessing no";; netbsd*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";; # Guess yes on BeOS. beos*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";; # Guess yes on Android. linux*-android*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";; # Guess yes on native Windows. mingw* | pw*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_vsnprintf_zerosize_c99="$gl_cross_guess_normal";; esac changequote([,])dnl ]) ]) ]) dnl The results of these tests on various platforms are: dnl dnl 1 = gl_PRINTF_SIZES_C99 dnl 2 = gl_PRINTF_LONG_DOUBLE dnl 3 = gl_PRINTF_INFINITE dnl 4 = gl_PRINTF_INFINITE_LONG_DOUBLE dnl 5 = gl_PRINTF_DIRECTIVE_A dnl 6 = gl_PRINTF_DIRECTIVE_F dnl 7 = gl_PRINTF_DIRECTIVE_N dnl 8 = gl_PRINTF_DIRECTIVE_LS dnl 9 = gl_PRINTF_POSITIONS dnl 10 = gl_PRINTF_FLAG_GROUPING dnl 11 = gl_PRINTF_FLAG_LEFTADJUST dnl 12 = gl_PRINTF_FLAG_ZERO dnl 13 = gl_PRINTF_PRECISION dnl 14 = gl_PRINTF_ENOMEM dnl 15 = gl_SNPRINTF_PRESENCE dnl 16 = gl_SNPRINTF_TRUNCATION_C99 dnl 17 = gl_SNPRINTF_RETVAL_C99 dnl 18 = gl_SNPRINTF_DIRECTIVE_N dnl 19 = gl_SNPRINTF_SIZE1 dnl 20 = gl_VSNPRINTF_ZEROSIZE_C99 dnl dnl 1 = checking whether printf supports size specifiers as in C99... dnl 2 = checking whether printf supports 'long double' arguments... dnl 3 = checking whether printf supports infinite 'double' arguments... dnl 4 = checking whether printf supports infinite 'long double' arguments... dnl 5 = checking whether printf supports the 'a' and 'A' directives... dnl 6 = checking whether printf supports the 'F' directive... dnl 7 = checking whether printf supports the 'n' directive... dnl 8 = checking whether printf supports the 'ls' directive... dnl 9 = checking whether printf supports POSIX/XSI format strings with positions... dnl 10 = checking whether printf supports the grouping flag... dnl 11 = checking whether printf supports the left-adjust flag correctly... dnl 12 = checking whether printf supports the zero flag correctly... dnl 13 = checking whether printf supports large precisions... dnl 14 = checking whether printf survives out-of-memory conditions... dnl 15 = checking for snprintf... dnl 16 = checking whether snprintf truncates the result as in C99... dnl 17 = checking whether snprintf returns a byte count as in C99... dnl 18 = checking whether snprintf fully supports the 'n' directive... dnl 19 = checking whether snprintf respects a size of 1... dnl 20 = checking whether vsnprintf respects a zero size as in C99... dnl dnl . = yes, # = no. dnl dnl 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 dnl glibc 2.5 . . . . . . . . . . . . . . . . . . . . dnl glibc 2.3.6 . . . . # . . . . . . . . . . . . . . . dnl FreeBSD 13.0 . . . . # . . . . . . . . # . . . . . . dnl FreeBSD 5.4, 6.1 . . . . # . . . . . . # . # . . . . . . dnl Mac OS X 10.13.5 . . . # # . # . . . . . . . . . . # . . dnl Mac OS X 10.5.8 . . . # # . . . . . . # . . . . . . . . dnl Mac OS X 10.3.9 . . . . # . . . . . . # . # . . . . . . dnl OpenBSD 6.0, 6.7 . . . . # . . . . . . . . # . . . . . . dnl OpenBSD 3.9, 4.0 . . # # # # . # . # . # . # . . . . . . dnl Cygwin 1.7.0 (2009) . . . # . . . ? . . . . . ? . . . . . . dnl Cygwin 1.5.25 (2008) . . . # # . . # . . . . . # . . . . . . dnl Cygwin 1.5.19 (2006) # . . # # # . # . # . # # # . . . . . . dnl Solaris 11.4 . . # # # . . # . . . # . . . . . . . . dnl Solaris 11.3 . . . . # . . # . . . . . . . . . . . . dnl Solaris 11.0 . . # # # . . # . . . # . . . . . . . . dnl Solaris 10 . . # # # . . # . . . # # . . . . . . . dnl Solaris 2.6 ... 9 # . # # # # . # . . . # # . . . # . . . dnl Solaris 2.5.1 # . # # # # . # . . . # . . # # # # # # dnl AIX 7.1 . . # # # . . . . . . # # . . . . . . . dnl AIX 5.2 . . # # # . . . . . . # . . . . . . . . dnl AIX 4.3.2, 5.1 # . # # # # . . . . . # . . . . # . . . dnl HP-UX 11.31 . . . . # . . . . . . # . . . . # # . . dnl HP-UX 11.{00,11,23} # . . . # # . . . . . # . . . . # # . # dnl HP-UX 10.20 # . # . # # . ? . . # # . . . . # # ? # dnl IRIX 6.5 # . # # # # . # . . . # . . . . # . . . dnl OSF/1 5.1 # . # # # # . . . . . # . . . . # . . # dnl OSF/1 4.0d # . # # # # . . . . . # . . # # # # # # dnl NetBSD 9.0 . . . . # . . . . . . . . . . . . . . . dnl NetBSD 5.0 . . . # # . . . . . . # . # . . . . . . dnl NetBSD 4.0 . ? ? ? ? ? . ? . ? ? ? ? ? . . . ? ? ? dnl NetBSD 3.0 . . . . # # . ? # # ? # . # . . . . . . dnl Haiku . . . # # # . # . . . . . ? . . ? . . . dnl BeOS # # . # # # . ? # . ? . # ? . . ? . . . dnl Android 4.3 . . # # # # # # . # . # . # . . . # . . dnl old mingw / msvcrt # # # # # # . . # # . # # ? . # # # . . dnl MSVC 9 # # # # # # # . # # . # # ? # # # # . . dnl mingw 2009-2011 . # . # . . . . # # . . . ? . . . . . . dnl mingw-w64 2011 # # # # # # . . # # . # # ? . # # # . . grub-2.14~git20250718.0e36779/m4/lib-prefix.m40000644000175000017500000002042215036447570014634 00000000000000# lib-prefix.m4 serial 7 (gettext-0.18) dnl Copyright (C) 2001-2005, 2008-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. dnl AC_LIB_ARG_WITH is synonymous to AC_ARG_WITH in autoconf-2.13, and dnl similar to AC_ARG_WITH in autoconf 2.52...2.57 except that is doesn't dnl require excessive bracketing. ifdef([AC_HELP_STRING], [AC_DEFUN([AC_LIB_ARG_WITH], [AC_ARG_WITH([$1],[[$2]],[$3],[$4])])], [AC_DEFUN([AC_][LIB_ARG_WITH], [AC_ARG_WITH([$1],[$2],[$3],[$4])])]) dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed dnl to access previously installed libraries. The basic assumption is that dnl a user will want packages to use other packages he previously installed dnl with the same --prefix option. dnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate dnl libraries, but is otherwise very convenient. AC_DEFUN([AC_LIB_PREFIX], [ AC_BEFORE([$0], [AC_LIB_LINKFLAGS]) AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) dnl By default, look in $includedir and $libdir. use_additional=yes AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) AC_LIB_ARG_WITH([lib-prefix], [ --with-lib-prefix[=DIR] search for libraries in DIR/include and DIR/lib --without-lib-prefix don't search for libraries in includedir and libdir], [ if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" fi fi ]) if test $use_additional = yes; then dnl Potentially add $additional_includedir to $CPPFLAGS. dnl But don't add it dnl 1. if it's the standard /usr/include, dnl 2. if it's already present in $CPPFLAGS, dnl 3. if it's /usr/local/include and we are using GCC on Linux, dnl 4. if it doesn't exist as a directory. if test "X$additional_includedir" != "X/usr/include"; then haveit= for x in $CPPFLAGS; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then if test -d "$additional_includedir"; then dnl Really add $additional_includedir to $CPPFLAGS. CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }-I$additional_includedir" fi fi fi fi dnl Potentially add $additional_libdir to $LDFLAGS. dnl But don't add it dnl 1. if it's the standard /usr/lib, dnl 2. if it's already present in $LDFLAGS, dnl 3. if it's /usr/local/lib and we are using GCC on Linux, dnl 4. if it doesn't exist as a directory. if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then haveit= for x in $LDFLAGS; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then if test -n "$GCC"; then case $host_os in linux*) haveit=yes;; esac fi fi if test -z "$haveit"; then if test -d "$additional_libdir"; then dnl Really add $additional_libdir to $LDFLAGS. LDFLAGS="${LDFLAGS}${LDFLAGS:+ }-L$additional_libdir" fi fi fi fi fi ]) dnl AC_LIB_PREPARE_PREFIX creates variables acl_final_prefix, dnl acl_final_exec_prefix, containing the values to which $prefix and dnl $exec_prefix will expand at the end of the configure script. AC_DEFUN([AC_LIB_PREPARE_PREFIX], [ dnl Unfortunately, prefix and exec_prefix get only finally determined dnl at the end of configure. if test "X$prefix" = "XNONE"; then acl_final_prefix="$ac_default_prefix" else acl_final_prefix="$prefix" fi if test "X$exec_prefix" = "XNONE"; then acl_final_exec_prefix='${prefix}' else acl_final_exec_prefix="$exec_prefix" fi acl_save_prefix="$prefix" prefix="$acl_final_prefix" eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" prefix="$acl_save_prefix" ]) dnl AC_LIB_WITH_FINAL_PREFIX([statement]) evaluates statement, with the dnl variables prefix and exec_prefix bound to the values they will have dnl at the end of the configure script. AC_DEFUN([AC_LIB_WITH_FINAL_PREFIX], [ acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" $1 exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" ]) dnl AC_LIB_PREPARE_MULTILIB creates dnl - a variable acl_libdirstem, containing the basename of the libdir, either dnl "lib" or "lib64" or "lib/64", dnl - a variable acl_libdirstem2, as a secondary possible value for dnl acl_libdirstem, either the same as acl_libdirstem or "lib/sparcv9" or dnl "lib/amd64". AC_DEFUN([AC_LIB_PREPARE_MULTILIB], [ dnl There is no formal standard regarding lib and lib64. dnl On glibc systems, the current practice is that on a system supporting dnl 32-bit and 64-bit instruction sets or ABIs, 64-bit libraries go under dnl $prefix/lib64 and 32-bit libraries go under $prefix/lib. We determine dnl the compiler's default mode by looking at the compiler's library search dnl path. If at least one of its elements ends in /lib64 or points to a dnl directory whose absolute pathname ends in /lib64, we assume a 64-bit ABI. dnl Otherwise we use the default, namely "lib". dnl On Solaris systems, the current practice is that on a system supporting dnl 32-bit and 64-bit instruction sets or ABIs, 64-bit libraries go under dnl $prefix/lib/64 (which is a symlink to either $prefix/lib/sparcv9 or dnl $prefix/lib/amd64) and 32-bit libraries go under $prefix/lib. AC_REQUIRE([AC_CANONICAL_HOST]) acl_libdirstem=lib acl_libdirstem2= case "$host_os" in solaris*) dnl See Solaris 10 Software Developer Collection > Solaris 64-bit Developer's Guide > The Development Environment dnl . dnl "Portable Makefiles should refer to any library directories using the 64 symbolic link." dnl But we want to recognize the sparcv9 or amd64 subdirectory also if the dnl symlink is missing, so we set acl_libdirstem2 too. AC_CACHE_CHECK([for 64-bit host], [gl_cv_solaris_64bit], [AC_EGREP_CPP([sixtyfour bits], [ #ifdef _LP64 sixtyfour bits #endif ], [gl_cv_solaris_64bit=yes], [gl_cv_solaris_64bit=no]) ]) if test $gl_cv_solaris_64bit = yes; then acl_libdirstem=lib/64 case "$host_cpu" in sparc*) acl_libdirstem2=lib/sparcv9 ;; i*86 | x86_64) acl_libdirstem2=lib/amd64 ;; esac fi ;; *) searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'` if test -n "$searchpath"; then acl_save_IFS="${IFS= }"; IFS=":" for searchdir in $searchpath; do if test -d "$searchdir"; then case "$searchdir" in */lib64/ | */lib64 ) acl_libdirstem=lib64 ;; */../ | */.. ) # Better ignore directories of this form. They are misleading. ;; *) searchdir=`cd "$searchdir" && pwd` case "$searchdir" in */lib64 ) acl_libdirstem=lib64 ;; esac ;; esac fi done IFS="$acl_save_IFS" fi ;; esac test -n "$acl_libdirstem2" || acl_libdirstem2="$acl_libdirstem" ]) grub-2.14~git20250718.0e36779/m4/strcase.m40000644000175000017500000000177415036447602014244 00000000000000# strcase.m4 serial 12 dnl Copyright (C) 2002, 2005-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_STRCASE], [ gl_FUNC_STRCASECMP gl_FUNC_STRNCASECMP ]) AC_DEFUN([gl_FUNC_STRCASECMP], [ AC_REQUIRE([gl_STRINGS_H_DEFAULTS]) AC_CHECK_FUNCS([strcasecmp]) if test $ac_cv_func_strcasecmp = no; then HAVE_STRCASECMP=0 fi ]) AC_DEFUN([gl_FUNC_STRNCASECMP], [ AC_REQUIRE([gl_STRINGS_H_DEFAULTS]) AC_CHECK_FUNCS([strncasecmp]) if test $ac_cv_func_strncasecmp = yes; then HAVE_STRNCASECMP=1 else HAVE_STRNCASECMP=0 fi AC_CHECK_DECLS([strncasecmp]) if test $ac_cv_have_decl_strncasecmp = no; then HAVE_DECL_STRNCASECMP=0 fi ]) # Prerequisites of lib/strcasecmp.c. AC_DEFUN([gl_PREREQ_STRCASECMP], [ : ]) # Prerequisites of lib/strncasecmp.c. AC_DEFUN([gl_PREREQ_STRNCASECMP], [ : ]) grub-2.14~git20250718.0e36779/m4/setlocale_null.m40000644000175000017500000000722215036447602015577 00000000000000# setlocale_null.m4 serial 5 dnl Copyright (C) 2019-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_SETLOCALE_NULL], [ AC_REQUIRE([AC_CANONICAL_HOST]) AC_REQUIRE([gl_PTHREADLIB]) AC_CHECK_HEADERS_ONCE([threads.h]) AC_CACHE_CHECK([whether setlocale (LC_ALL, NULL) is multithread-safe], [gl_cv_func_setlocale_null_all_mtsafe], [case "$host_os" in # Guess no on musl libc, macOS, FreeBSD, NetBSD, OpenBSD, AIX, Haiku, Cygwin. *-musl* | darwin* | freebsd* | midnightbsd* | netbsd* | openbsd* | aix* | haiku* | cygwin*) gl_cv_func_setlocale_null_all_mtsafe=no ;; # Guess yes on glibc, HP-UX, IRIX, Solaris, native Windows. *-gnu* | gnu* | hpux* | irix* | solaris* | mingw*) gl_cv_func_setlocale_null_all_mtsafe=yes ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_setlocale_null_all_mtsafe="$gl_cross_guess_normal" ;; esac ]) dnl On platforms without multithreading, there is no issue. case "$host_os" in mingw*) ;; *) if test $gl_pthread_api = no && test $ac_cv_header_threads_h = no; then gl_cv_func_setlocale_null_all_mtsafe="trivially yes" fi ;; esac case "$gl_cv_func_setlocale_null_all_mtsafe" in *yes) SETLOCALE_NULL_ALL_MTSAFE=1 ;; *) SETLOCALE_NULL_ALL_MTSAFE=0 ;; esac AC_DEFINE_UNQUOTED([SETLOCALE_NULL_ALL_MTSAFE], [$SETLOCALE_NULL_ALL_MTSAFE], [Define to 1 if setlocale (LC_ALL, NULL) is multithread-safe.]) dnl This is about a single category (not LC_ALL). AC_CACHE_CHECK([whether setlocale (category, NULL) is multithread-safe], [gl_cv_func_setlocale_null_one_mtsafe], [case "$host_os" in # Guess no on OpenBSD, AIX. openbsd* | aix*) gl_cv_func_setlocale_null_one_mtsafe=no ;; # Guess yes on glibc, musl libc, macOS, FreeBSD, NetBSD, HP-UX, IRIX, Solaris, Haiku, Cygwin, native Windows. *-gnu* | gnu* | *-musl* | darwin* | freebsd* | midnightbsd* | netbsd* | hpux* | irix* | solaris* | haiku* | cygwin* | mingw*) gl_cv_func_setlocale_null_one_mtsafe=yes ;; # If we don't know, obey --enable-cross-guesses. *) gl_cv_func_setlocale_null_one_mtsafe="$gl_cross_guess_normal" ;; esac ]) dnl On platforms without multithreading, there is no issue. case "$host_os" in mingw*) ;; *) if test $gl_pthread_api = no && test $ac_cv_header_threads_h = no; then gl_cv_func_setlocale_null_one_mtsafe="trivially yes" fi ;; esac case "$gl_cv_func_setlocale_null_one_mtsafe" in *yes) SETLOCALE_NULL_ONE_MTSAFE=1 ;; *) SETLOCALE_NULL_ONE_MTSAFE=0 ;; esac AC_DEFINE_UNQUOTED([SETLOCALE_NULL_ONE_MTSAFE], [$SETLOCALE_NULL_ONE_MTSAFE], [Define to 1 if setlocale (category, NULL) is multithread-safe.]) dnl Determine link dependencies of lib/setlocale_null.c and lib/setlocale-lock.c. if test $SETLOCALE_NULL_ALL_MTSAFE = 0 || test $SETLOCALE_NULL_ONE_MTSAFE = 0; then case "$host_os" in mingw*) LIB_SETLOCALE_NULL= ;; *) gl_WEAK_SYMBOLS case "$gl_cv_have_weak" in *yes) LIB_SETLOCALE_NULL= ;; *) LIB_SETLOCALE_NULL="$LIBPTHREAD" ;; esac ;; esac else LIB_SETLOCALE_NULL= fi dnl LIB_SETLOCALE_NULL is expected to be '-pthread' or '-lpthread' on AIX dnl with gcc or xlc, and empty otherwise. AC_SUBST([LIB_SETLOCALE_NULL]) ]) # Prerequisites of lib/setlocale-lock.c. AC_DEFUN([gl_PREREQ_SETLOCALE_LOCK], [ gl_VISIBILITY ]) grub-2.14~git20250718.0e36779/m4/pipe.m40000644000175000017500000000066015036447602013526 00000000000000# pipe.m4 serial 2 dnl Copyright (C) 2010-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_PIPE], [ AC_REQUIRE([gl_UNISTD_H_DEFAULTS]) AC_CHECK_FUNCS_ONCE([pipe]) if test $ac_cv_func_pipe != yes; then HAVE_PIPE=0 fi ]) grub-2.14~git20250718.0e36779/m4/stdint.m40000644000175000017500000004273115036447602014103 00000000000000# stdint.m4 serial 61 dnl Copyright (C) 2001-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Paul Eggert and Bruno Haible. dnl Test whether is supported or must be substituted. AC_PREREQ([2.61]) AC_DEFUN_ONCE([gl_STDINT_H], [ AC_PREREQ([2.59])dnl AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_REQUIRE([gl_LIMITS_H]) AC_REQUIRE([gt_TYPE_WINT_T]) dnl For backward compatibility. Some packages may still be testing these dnl macros. AC_DEFINE([HAVE_LONG_LONG_INT], [1], [Define to 1 if the system has the type 'long long int'.]) AC_DEFINE([HAVE_UNSIGNED_LONG_LONG_INT], [1], [Define to 1 if the system has the type 'unsigned long long int'.]) dnl Check for , in the same way as gl_WCHAR_H does. AC_CHECK_HEADERS_ONCE([wchar.h]) if test $ac_cv_header_wchar_h = yes; then HAVE_WCHAR_H=1 else HAVE_WCHAR_H=0 fi AC_SUBST([HAVE_WCHAR_H]) dnl Check for . AC_CHECK_HEADERS_ONCE([inttypes.h]) if test $ac_cv_header_inttypes_h = yes; then HAVE_INTTYPES_H=1 else HAVE_INTTYPES_H=0 fi AC_SUBST([HAVE_INTTYPES_H]) dnl Check for . AC_CHECK_HEADERS_ONCE([sys/types.h]) if test $ac_cv_header_sys_types_h = yes; then HAVE_SYS_TYPES_H=1 else HAVE_SYS_TYPES_H=0 fi AC_SUBST([HAVE_SYS_TYPES_H]) gl_CHECK_NEXT_HEADERS([stdint.h]) if test $ac_cv_header_stdint_h = yes; then HAVE_STDINT_H=1 else HAVE_STDINT_H=0 fi AC_SUBST([HAVE_STDINT_H]) dnl Now see whether we need a substitute . if test $ac_cv_header_stdint_h = yes; then AC_CACHE_CHECK([whether stdint.h conforms to C99], [gl_cv_header_working_stdint_h], [gl_cv_header_working_stdint_h=no AC_COMPILE_IFELSE([ AC_LANG_PROGRAM([[ #define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1 /* work if build isn't clean */ #define __STDC_CONSTANT_MACROS 1 #define __STDC_LIMIT_MACROS 1 #include /* Dragonfly defines WCHAR_MIN, WCHAR_MAX only in . */ #if !(defined WCHAR_MIN && defined WCHAR_MAX) #error "WCHAR_MIN, WCHAR_MAX not defined in " #endif ] gl_STDINT_INCLUDES [ #ifdef INT8_MAX int8_t a1 = INT8_MAX; int8_t a1min = INT8_MIN; #endif #ifdef INT16_MAX int16_t a2 = INT16_MAX; int16_t a2min = INT16_MIN; #endif #ifdef INT32_MAX int32_t a3 = INT32_MAX; int32_t a3min = INT32_MIN; #endif #ifdef INT64_MAX int64_t a4 = INT64_MAX; int64_t a4min = INT64_MIN; #endif #ifdef UINT8_MAX uint8_t b1 = UINT8_MAX; #else typedef int b1[(unsigned char) -1 != 255 ? 1 : -1]; #endif #ifdef UINT16_MAX uint16_t b2 = UINT16_MAX; #endif #ifdef UINT32_MAX uint32_t b3 = UINT32_MAX; #endif #ifdef UINT64_MAX uint64_t b4 = UINT64_MAX; #endif int_least8_t c1 = INT8_C (0x7f); int_least8_t c1max = INT_LEAST8_MAX; int_least8_t c1min = INT_LEAST8_MIN; int_least16_t c2 = INT16_C (0x7fff); int_least16_t c2max = INT_LEAST16_MAX; int_least16_t c2min = INT_LEAST16_MIN; int_least32_t c3 = INT32_C (0x7fffffff); int_least32_t c3max = INT_LEAST32_MAX; int_least32_t c3min = INT_LEAST32_MIN; int_least64_t c4 = INT64_C (0x7fffffffffffffff); int_least64_t c4max = INT_LEAST64_MAX; int_least64_t c4min = INT_LEAST64_MIN; uint_least8_t d1 = UINT8_C (0xff); uint_least8_t d1max = UINT_LEAST8_MAX; uint_least16_t d2 = UINT16_C (0xffff); uint_least16_t d2max = UINT_LEAST16_MAX; uint_least32_t d3 = UINT32_C (0xffffffff); uint_least32_t d3max = UINT_LEAST32_MAX; uint_least64_t d4 = UINT64_C (0xffffffffffffffff); uint_least64_t d4max = UINT_LEAST64_MAX; int_fast8_t e1 = INT_FAST8_MAX; int_fast8_t e1min = INT_FAST8_MIN; int_fast16_t e2 = INT_FAST16_MAX; int_fast16_t e2min = INT_FAST16_MIN; int_fast32_t e3 = INT_FAST32_MAX; int_fast32_t e3min = INT_FAST32_MIN; int_fast64_t e4 = INT_FAST64_MAX; int_fast64_t e4min = INT_FAST64_MIN; uint_fast8_t f1 = UINT_FAST8_MAX; uint_fast16_t f2 = UINT_FAST16_MAX; uint_fast32_t f3 = UINT_FAST32_MAX; uint_fast64_t f4 = UINT_FAST64_MAX; #ifdef INTPTR_MAX intptr_t g = INTPTR_MAX; intptr_t gmin = INTPTR_MIN; #endif #ifdef UINTPTR_MAX uintptr_t h = UINTPTR_MAX; #endif intmax_t i = INTMAX_MAX; uintmax_t j = UINTMAX_MAX; /* Check that SIZE_MAX has the correct type, if possible. */ #if 201112 <= __STDC_VERSION__ int k = _Generic (SIZE_MAX, size_t: 0); #elif (2 <= __GNUC__ || 4 <= __clang_major__ || defined __IBM__TYPEOF__ \ || (0x5110 <= __SUNPRO_C && !__STDC__)) extern size_t k; extern __typeof__ (SIZE_MAX) k; #endif #include /* for CHAR_BIT */ #define TYPE_MINIMUM(t) \ ((t) ((t) 0 < (t) -1 ? (t) 0 : ~ TYPE_MAXIMUM (t))) #define TYPE_MAXIMUM(t) \ ((t) ((t) 0 < (t) -1 \ ? (t) -1 \ : ((((t) 1 << (sizeof (t) * CHAR_BIT - 2)) - 1) * 2 + 1))) struct s { int check_PTRDIFF: PTRDIFF_MIN == TYPE_MINIMUM (ptrdiff_t) && PTRDIFF_MAX == TYPE_MAXIMUM (ptrdiff_t) ? 1 : -1; /* Detect bug in FreeBSD 6.0/ia64 and FreeBSD 13.0/arm64. */ int check_SIG_ATOMIC: SIG_ATOMIC_MIN == TYPE_MINIMUM (sig_atomic_t) && SIG_ATOMIC_MAX == TYPE_MAXIMUM (sig_atomic_t) ? 1 : -1; int check_SIZE: SIZE_MAX == TYPE_MAXIMUM (size_t) ? 1 : -1; int check_WCHAR: WCHAR_MIN == TYPE_MINIMUM (wchar_t) && WCHAR_MAX == TYPE_MAXIMUM (wchar_t) ? 1 : -1; /* Detect bug in mingw. */ int check_WINT: WINT_MIN == TYPE_MINIMUM (wint_t) && WINT_MAX == TYPE_MAXIMUM (wint_t) ? 1 : -1; /* Detect bugs in glibc 2.4 and Solaris 10 stdint.h, among others. */ int check_UINT8_C: (-1 < UINT8_C (0)) == (-1 < (uint_least8_t) 0) ? 1 : -1; int check_UINT16_C: (-1 < UINT16_C (0)) == (-1 < (uint_least16_t) 0) ? 1 : -1; /* Detect bugs in OpenBSD 3.9 stdint.h. */ #ifdef UINT8_MAX int check_uint8: (uint8_t) -1 == UINT8_MAX ? 1 : -1; #endif #ifdef UINT16_MAX int check_uint16: (uint16_t) -1 == UINT16_MAX ? 1 : -1; #endif #ifdef UINT32_MAX int check_uint32: (uint32_t) -1 == UINT32_MAX ? 1 : -1; #endif #ifdef UINT64_MAX int check_uint64: (uint64_t) -1 == UINT64_MAX ? 1 : -1; #endif int check_uint_least8: (uint_least8_t) -1 == UINT_LEAST8_MAX ? 1 : -1; int check_uint_least16: (uint_least16_t) -1 == UINT_LEAST16_MAX ? 1 : -1; int check_uint_least32: (uint_least32_t) -1 == UINT_LEAST32_MAX ? 1 : -1; int check_uint_least64: (uint_least64_t) -1 == UINT_LEAST64_MAX ? 1 : -1; int check_uint_fast8: (uint_fast8_t) -1 == UINT_FAST8_MAX ? 1 : -1; int check_uint_fast16: (uint_fast16_t) -1 == UINT_FAST16_MAX ? 1 : -1; int check_uint_fast32: (uint_fast32_t) -1 == UINT_FAST32_MAX ? 1 : -1; int check_uint_fast64: (uint_fast64_t) -1 == UINT_FAST64_MAX ? 1 : -1; int check_uintptr: (uintptr_t) -1 == UINTPTR_MAX ? 1 : -1; int check_uintmax: (uintmax_t) -1 == UINTMAX_MAX ? 1 : -1; int check_size: (size_t) -1 == SIZE_MAX ? 1 : -1; }; ]])], [dnl Determine whether the various *_MIN, *_MAX macros are usable dnl in preprocessor expression. We could do it by compiling a test dnl program for each of these macros. It is faster to run a program dnl that inspects the macro expansion. dnl This detects a bug on HP-UX 11.23/ia64. AC_RUN_IFELSE([ AC_LANG_PROGRAM([[ #define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1 /* work if build isn't clean */ #define __STDC_CONSTANT_MACROS 1 #define __STDC_LIMIT_MACROS 1 #include ] gl_STDINT_INCLUDES [ #include #include #define MVAL(macro) MVAL1(macro) #define MVAL1(expression) #expression static const char *macro_values[] = { #ifdef INT8_MAX MVAL (INT8_MAX), #endif #ifdef INT16_MAX MVAL (INT16_MAX), #endif #ifdef INT32_MAX MVAL (INT32_MAX), #endif #ifdef INT64_MAX MVAL (INT64_MAX), #endif #ifdef UINT8_MAX MVAL (UINT8_MAX), #endif #ifdef UINT16_MAX MVAL (UINT16_MAX), #endif #ifdef UINT32_MAX MVAL (UINT32_MAX), #endif #ifdef UINT64_MAX MVAL (UINT64_MAX), #endif NULL }; ]], [[ const char **mv; for (mv = macro_values; *mv != NULL; mv++) { const char *value = *mv; /* Test whether it looks like a cast expression. */ if (strncmp (value, "((unsigned int)"/*)*/, 15) == 0 || strncmp (value, "((unsigned short)"/*)*/, 17) == 0 || strncmp (value, "((unsigned char)"/*)*/, 16) == 0 || strncmp (value, "((int)"/*)*/, 6) == 0 || strncmp (value, "((signed short)"/*)*/, 15) == 0 || strncmp (value, "((signed char)"/*)*/, 14) == 0) return mv - macro_values + 1; } return 0; ]])], [gl_cv_header_working_stdint_h=yes], [], [case "$host_os" in # Guess yes on native Windows. mingw*) gl_cv_header_working_stdint_h="guessing yes" ;; # In general, assume it works. *) gl_cv_header_working_stdint_h="guessing yes" ;; esac ]) ]) ]) fi HAVE_C99_STDINT_H=0 HAVE_SYS_BITYPES_H=0 HAVE_SYS_INTTYPES_H=0 GL_GENERATE_STDINT_H=true case "$gl_cv_header_working_stdint_h" in *yes) HAVE_C99_STDINT_H=1 dnl Now see whether the system works without dnl __STDC_CONSTANT_MACROS/__STDC_LIMIT_MACROS defined. dnl If not, there would be problems when stdint.h is included from C++. AC_CACHE_CHECK([whether stdint.h works without ISO C predefines], [gl_cv_header_stdint_without_STDC_macros], [gl_cv_header_stdint_without_STDC_macros=no AC_COMPILE_IFELSE([ AC_LANG_PROGRAM([[ #define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1 /* work if build isn't clean */ #include ] gl_STDINT_INCLUDES [ intmax_t im = INTMAX_MAX; int32_t i32 = INT32_C (0x7fffffff); ]])], [gl_cv_header_stdint_without_STDC_macros=yes]) ]) if test $gl_cv_header_stdint_without_STDC_macros = no; then AC_DEFINE([__STDC_CONSTANT_MACROS], [1], [Define to 1 if the system predates C++11.]) AC_DEFINE([__STDC_LIMIT_MACROS], [1], [Define to 1 if the system predates C++11.]) fi AC_CACHE_CHECK([whether stdint.h has UINTMAX_WIDTH etc.], [gl_cv_header_stdint_width], [gl_cv_header_stdint_width=no AC_COMPILE_IFELSE( [AC_LANG_PROGRAM([[ /* Work if build is not clean. */ #define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1 #ifndef __STDC_WANT_IEC_60559_BFP_EXT__ #define __STDC_WANT_IEC_60559_BFP_EXT__ 1 #endif #include ]gl_STDINT_INCLUDES[ int iw = UINTMAX_WIDTH; ]])], [gl_cv_header_stdint_width=yes])]) if test "$gl_cv_header_stdint_width" = yes; then GL_GENERATE_STDINT_H=false fi ;; *) dnl Check for , and for dnl (used in Linux libc4 >= 4.6.7 and libc5). AC_CHECK_HEADERS([sys/inttypes.h sys/bitypes.h]) if test $ac_cv_header_sys_inttypes_h = yes; then HAVE_SYS_INTTYPES_H=1 fi if test $ac_cv_header_sys_bitypes_h = yes; then HAVE_SYS_BITYPES_H=1 fi gl_STDINT_TYPE_PROPERTIES ;; esac dnl The substitute stdint.h needs the substitute limit.h's _GL_INTEGER_WIDTH. gl_REPLACE_LIMITS_H AC_SUBST([HAVE_C99_STDINT_H]) AC_SUBST([HAVE_SYS_BITYPES_H]) AC_SUBST([HAVE_SYS_INTTYPES_H]) ]) dnl gl_STDINT_BITSIZEOF(TYPES, INCLUDES) dnl Determine the size of each of the given types in bits. AC_DEFUN([gl_STDINT_BITSIZEOF], [ dnl Use a shell loop, to avoid bloating configure, and dnl - extra AH_TEMPLATE calls, so that autoheader knows what to put into dnl config.h.in, dnl - extra AC_SUBST calls, so that the right substitutions are made. m4_foreach_w([gltype], [$1], [AH_TEMPLATE([BITSIZEOF_]m4_translit(gltype,[abcdefghijklmnopqrstuvwxyz ],[ABCDEFGHIJKLMNOPQRSTUVWXYZ_]), [Define to the number of bits in type ']gltype['.])]) for gltype in $1 ; do AC_CACHE_CHECK([for bit size of $gltype], [gl_cv_bitsizeof_${gltype}], [AC_COMPUTE_INT([result], [sizeof ($gltype) * CHAR_BIT], [$2 #include ], [result=unknown]) eval gl_cv_bitsizeof_${gltype}=\$result ]) eval result=\$gl_cv_bitsizeof_${gltype} if test $result = unknown; then dnl Use a nonempty default, because some compilers, such as IRIX 5 cc, dnl do a syntax check even on unused #if conditions and give an error dnl on valid C code like this: dnl #if 0 dnl # if > 32 dnl # endif dnl #endif result=0 fi GLTYPE=`echo "$gltype" | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'` AC_DEFINE_UNQUOTED([BITSIZEOF_${GLTYPE}], [$result]) eval BITSIZEOF_${GLTYPE}=\$result done m4_foreach_w([gltype], [$1], [AC_SUBST([BITSIZEOF_]m4_translit(gltype,[abcdefghijklmnopqrstuvwxyz ],[ABCDEFGHIJKLMNOPQRSTUVWXYZ_]))]) ]) dnl gl_CHECK_TYPES_SIGNED(TYPES, INCLUDES) dnl Determine the signedness of each of the given types. dnl Define HAVE_SIGNED_TYPE if type is signed. AC_DEFUN([gl_CHECK_TYPES_SIGNED], [ dnl Use a shell loop, to avoid bloating configure, and dnl - extra AH_TEMPLATE calls, so that autoheader knows what to put into dnl config.h.in, dnl - extra AC_SUBST calls, so that the right substitutions are made. m4_foreach_w([gltype], [$1], [AH_TEMPLATE([HAVE_SIGNED_]m4_translit(gltype,[abcdefghijklmnopqrstuvwxyz ],[ABCDEFGHIJKLMNOPQRSTUVWXYZ_]), [Define to 1 if ']gltype[' is a signed integer type.])]) for gltype in $1 ; do AC_CACHE_CHECK([whether $gltype is signed], [gl_cv_type_${gltype}_signed], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM([$2[ int verify[2 * (($gltype) -1 < ($gltype) 0) - 1];]])], result=yes, result=no) eval gl_cv_type_${gltype}_signed=\$result ]) eval result=\$gl_cv_type_${gltype}_signed GLTYPE=`echo $gltype | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'` if test "$result" = yes; then AC_DEFINE_UNQUOTED([HAVE_SIGNED_${GLTYPE}], [1]) eval HAVE_SIGNED_${GLTYPE}=1 else eval HAVE_SIGNED_${GLTYPE}=0 fi done m4_foreach_w([gltype], [$1], [AC_SUBST([HAVE_SIGNED_]m4_translit(gltype,[abcdefghijklmnopqrstuvwxyz ],[ABCDEFGHIJKLMNOPQRSTUVWXYZ_]))]) ]) dnl gl_INTEGER_TYPE_SUFFIX(TYPES, INCLUDES) dnl Determine the suffix to use for integer constants of the given types. dnl Define t_SUFFIX for each such type. AC_DEFUN([gl_INTEGER_TYPE_SUFFIX], [ dnl Use a shell loop, to avoid bloating configure, and dnl - extra AH_TEMPLATE calls, so that autoheader knows what to put into dnl config.h.in, dnl - extra AC_SUBST calls, so that the right substitutions are made. m4_foreach_w([gltype], [$1], [AH_TEMPLATE(m4_translit(gltype,[abcdefghijklmnopqrstuvwxyz ],[ABCDEFGHIJKLMNOPQRSTUVWXYZ_])[_SUFFIX], [Define to l, ll, u, ul, ull, etc., as suitable for constants of type ']gltype['.])]) for gltype in $1 ; do AC_CACHE_CHECK([for $gltype integer literal suffix], [gl_cv_type_${gltype}_suffix], [eval gl_cv_type_${gltype}_suffix=no eval result=\$gl_cv_type_${gltype}_signed if test "$result" = yes; then glsufu= else glsufu=u fi for glsuf in "$glsufu" ${glsufu}l ${glsufu}ll ${glsufu}i64; do case $glsuf in '') gltype1='int';; l) gltype1='long int';; ll) gltype1='long long int';; i64) gltype1='__int64';; u) gltype1='unsigned int';; ul) gltype1='unsigned long int';; ull) gltype1='unsigned long long int';; ui64)gltype1='unsigned __int64';; esac AC_COMPILE_IFELSE( [AC_LANG_PROGRAM([$2[ extern $gltype foo; extern $gltype1 foo;]])], [eval gl_cv_type_${gltype}_suffix=\$glsuf]) eval result=\$gl_cv_type_${gltype}_suffix test "$result" != no && break done]) GLTYPE=`echo $gltype | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'` eval result=\$gl_cv_type_${gltype}_suffix test "$result" = no && result= eval ${GLTYPE}_SUFFIX=\$result AC_DEFINE_UNQUOTED([${GLTYPE}_SUFFIX], [$result]) done m4_foreach_w([gltype], [$1], [AC_SUBST(m4_translit(gltype,[abcdefghijklmnopqrstuvwxyz ],[ABCDEFGHIJKLMNOPQRSTUVWXYZ_])[_SUFFIX])]) ]) dnl gl_STDINT_INCLUDES AC_DEFUN([gl_STDINT_INCLUDES], [[ #include #include #if HAVE_WCHAR_H # include #endif ]]) dnl gl_STDINT_TYPE_PROPERTIES dnl Compute HAVE_SIGNED_t, BITSIZEOF_t and t_SUFFIX, for all the types t dnl of interest to stdint.in.h. AC_DEFUN([gl_STDINT_TYPE_PROPERTIES], [ AC_REQUIRE([gl_MULTIARCH]) if test $APPLE_UNIVERSAL_BUILD = 0; then gl_STDINT_BITSIZEOF([ptrdiff_t size_t], [gl_STDINT_INCLUDES]) fi gl_STDINT_BITSIZEOF([sig_atomic_t wchar_t wint_t], [gl_STDINT_INCLUDES]) gl_CHECK_TYPES_SIGNED([sig_atomic_t wchar_t wint_t], [gl_STDINT_INCLUDES]) gl_cv_type_ptrdiff_t_signed=yes gl_cv_type_size_t_signed=no if test $APPLE_UNIVERSAL_BUILD = 0; then gl_INTEGER_TYPE_SUFFIX([ptrdiff_t size_t], [gl_STDINT_INCLUDES]) fi gl_INTEGER_TYPE_SUFFIX([sig_atomic_t wchar_t wint_t], [gl_STDINT_INCLUDES]) dnl If wint_t is smaller than 'int', it cannot satisfy the ISO C 99 dnl requirement that wint_t is "unchanged by default argument promotions". dnl In this case gnulib's and override wint_t. dnl Set the variable BITSIZEOF_WINT_T accordingly. if test $GNULIBHEADERS_OVERRIDE_WINT_T = 1; then BITSIZEOF_WINT_T=32 fi ]) grub-2.14~git20250718.0e36779/m4/base64.m40000644000175000017500000000066415036447602013661 00000000000000# base64.m4 serial 4 dnl Copyright (C) 2004, 2006, 2009-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_BASE64], [ gl_PREREQ_BASE64 ]) # Prerequisites of lib/base64.c. AC_DEFUN([gl_PREREQ_BASE64], [ AC_REQUIRE([AC_C_RESTRICT]) ]) grub-2.14~git20250718.0e36779/m4/xsize.m40000644000175000017500000000062615036447602013735 00000000000000# xsize.m4 serial 5 dnl Copyright (C) 2003-2004, 2008-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_XSIZE], [ dnl Prerequisites of lib/xsize.h. AC_REQUIRE([gl_SIZE_MAX]) AC_CHECK_HEADERS([stdint.h]) ]) grub-2.14~git20250718.0e36779/m4/iconv.m40000644000175000017500000002162015036447570013712 00000000000000# iconv.m4 serial 18 (gettext-0.18.2) dnl Copyright (C) 2000-2002, 2007-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. AC_DEFUN([AM_ICONV_LINKFLAGS_BODY], [ dnl Prerequisites of AC_LIB_LINKFLAGS_BODY. AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) AC_REQUIRE([AC_LIB_RPATH]) dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV dnl accordingly. AC_LIB_LINKFLAGS_BODY([iconv]) ]) AC_DEFUN([AM_ICONV_LINK], [ dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and dnl those with the standalone portable GNU libiconv installed). AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV dnl accordingly. AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY]) dnl Add $INCICONV to CPPFLAGS before performing the following checks, dnl because if the user has installed libiconv and not disabled its use dnl via --without-libiconv-prefix, he wants to use it. The first dnl AC_LINK_IFELSE will then fail, the second AC_LINK_IFELSE will succeed. am_save_CPPFLAGS="$CPPFLAGS" AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCICONV]) AC_CACHE_CHECK([for iconv], [am_cv_func_iconv], [ am_cv_func_iconv="no, consider installing GNU libiconv" am_cv_lib_iconv=no AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[ #include #include ]], [[iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd);]])], [am_cv_func_iconv=yes]) if test "$am_cv_func_iconv" != yes; then am_save_LIBS="$LIBS" LIBS="$LIBS $LIBICONV" AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[ #include #include ]], [[iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd);]])], [am_cv_lib_iconv=yes] [am_cv_func_iconv=yes]) LIBS="$am_save_LIBS" fi ]) if test "$am_cv_func_iconv" = yes; then AC_CACHE_CHECK([for working iconv], [am_cv_func_iconv_works], [ dnl This tests against bugs in AIX 5.1, AIX 6.1..7.1, HP-UX 11.11, dnl Solaris 10. am_save_LIBS="$LIBS" if test $am_cv_lib_iconv = yes; then LIBS="$LIBS $LIBICONV" fi AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include int main () { int result = 0; /* Test against AIX 5.1 bug: Failures are not distinguishable from successful returns. */ { iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8"); if (cd_utf8_to_88591 != (iconv_t)(-1)) { static const char input[] = "\342\202\254"; /* EURO SIGN */ char buf[10]; const char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_utf8_to_88591, (char **) &inptr, &inbytesleft, &outptr, &outbytesleft); if (res == 0) result |= 1; iconv_close (cd_utf8_to_88591); } } /* Test against Solaris 10 bug: Failures are not distinguishable from successful returns. */ { iconv_t cd_ascii_to_88591 = iconv_open ("ISO8859-1", "646"); if (cd_ascii_to_88591 != (iconv_t)(-1)) { static const char input[] = "\263"; char buf[10]; const char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_ascii_to_88591, (char **) &inptr, &inbytesleft, &outptr, &outbytesleft); if (res == 0) result |= 2; iconv_close (cd_ascii_to_88591); } } /* Test against AIX 6.1..7.1 bug: Buffer overrun. */ { iconv_t cd_88591_to_utf8 = iconv_open ("UTF-8", "ISO-8859-1"); if (cd_88591_to_utf8 != (iconv_t)(-1)) { static const char input[] = "\304"; static char buf[2] = { (char)0xDE, (char)0xAD }; const char *inptr = input; size_t inbytesleft = 1; char *outptr = buf; size_t outbytesleft = 1; size_t res = iconv (cd_88591_to_utf8, (char **) &inptr, &inbytesleft, &outptr, &outbytesleft); if (res != (size_t)(-1) || outptr - buf > 1 || buf[1] != (char)0xAD) result |= 4; iconv_close (cd_88591_to_utf8); } } #if 0 /* This bug could be worked around by the caller. */ /* Test against HP-UX 11.11 bug: Positive return value instead of 0. */ { iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591"); if (cd_88591_to_utf8 != (iconv_t)(-1)) { static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337"; char buf[50]; const char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_88591_to_utf8, (char **) &inptr, &inbytesleft, &outptr, &outbytesleft); if ((int)res > 0) result |= 8; iconv_close (cd_88591_to_utf8); } } #endif /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is provided. */ if (/* Try standardized names. */ iconv_open ("UTF-8", "EUC-JP") == (iconv_t)(-1) /* Try IRIX, OSF/1 names. */ && iconv_open ("UTF-8", "eucJP") == (iconv_t)(-1) /* Try AIX names. */ && iconv_open ("UTF-8", "IBM-eucJP") == (iconv_t)(-1) /* Try HP-UX names. */ && iconv_open ("utf8", "eucJP") == (iconv_t)(-1)) result |= 16; return result; }]])], [am_cv_func_iconv_works=yes], [am_cv_func_iconv_works=no], [ changequote(,)dnl case "$host_os" in aix* | hpux*) am_cv_func_iconv_works="guessing no" ;; *) am_cv_func_iconv_works="guessing yes" ;; esac changequote([,])dnl ]) LIBS="$am_save_LIBS" ]) case "$am_cv_func_iconv_works" in *no) am_func_iconv=no am_cv_lib_iconv=no ;; *) am_func_iconv=yes ;; esac else am_func_iconv=no am_cv_lib_iconv=no fi if test "$am_func_iconv" = yes; then AC_DEFINE([HAVE_ICONV], [1], [Define if you have the iconv() function and it works.]) fi if test "$am_cv_lib_iconv" = yes; then AC_MSG_CHECKING([how to link with libiconv]) AC_MSG_RESULT([$LIBICONV]) else dnl If $LIBICONV didn't lead to a usable library, we don't need $INCICONV dnl either. CPPFLAGS="$am_save_CPPFLAGS" LIBICONV= LTLIBICONV= fi AC_SUBST([LIBICONV]) AC_SUBST([LTLIBICONV]) ]) dnl Define AM_ICONV using AC_DEFUN_ONCE for Autoconf >= 2.64, in order to dnl avoid warnings like dnl "warning: AC_REQUIRE: `AM_ICONV' was expanded before it was required". dnl This is tricky because of the way 'aclocal' is implemented: dnl - It requires defining an auxiliary macro whose name ends in AC_DEFUN. dnl Otherwise aclocal's initial scan pass would miss the macro definition. dnl - It requires a line break inside the AC_DEFUN_ONCE and AC_DEFUN expansions. dnl Otherwise aclocal would emit many "Use of uninitialized value $1" dnl warnings. m4_define([gl_iconv_AC_DEFUN], m4_version_prereq([2.64], [[AC_DEFUN_ONCE( [$1], [$2])]], [m4_ifdef([gl_00GNULIB], [[AC_DEFUN_ONCE( [$1], [$2])]], [[AC_DEFUN( [$1], [$2])]])])) gl_iconv_AC_DEFUN([AM_ICONV], [ AM_ICONV_LINK if test "$am_cv_func_iconv" = yes; then AC_MSG_CHECKING([for iconv declaration]) AC_CACHE_VAL([am_cv_proto_iconv], [ AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[ #include #include extern #ifdef __cplusplus "C" #endif #if defined(__STDC__) || defined(_MSC_VER) || defined(__cplusplus) size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft); #else size_t iconv(); #endif ]], [[]])], [am_cv_proto_iconv_arg1=""], [am_cv_proto_iconv_arg1="const"]) am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"]) am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'` AC_MSG_RESULT([ $am_cv_proto_iconv]) AC_DEFINE_UNQUOTED([ICONV_CONST], [$am_cv_proto_iconv_arg1], [Define as const if the declaration of iconv() needs const.]) dnl Also substitute ICONV_CONST in the gnulib generated . m4_ifdef([gl_ICONV_H_DEFAULTS], [AC_REQUIRE([gl_ICONV_H_DEFAULTS]) if test -n "$am_cv_proto_iconv_arg1"; then ICONV_CONST="const" fi ]) fi ]) grub-2.14~git20250718.0e36779/m4/strndup.m40000644000175000017500000000326515036447602014274 00000000000000# strndup.m4 serial 23 dnl Copyright (C) 2002-2003, 2005-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_STRNDUP], [ dnl Persuade glibc to declare strndup(). AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_REQUIRE([gl_STRING_H_DEFAULTS]) AC_CHECK_DECLS_ONCE([strndup]) AC_CHECK_FUNCS_ONCE([strndup]) if test $ac_cv_have_decl_strndup = no; then HAVE_DECL_STRNDUP=0 fi if test $ac_cv_func_strndup = yes; then HAVE_STRNDUP=1 # AIX 4.3.3, AIX 5.1 have a function that fails to add the terminating '\0'. AC_CACHE_CHECK([for working strndup], [gl_cv_func_strndup_works], [AC_RUN_IFELSE([ AC_LANG_PROGRAM([[#include #include ]], [[ #if !HAVE_DECL_STRNDUP extern #ifdef __cplusplus "C" #endif char *strndup (const char *, size_t); #endif int result; char *s; s = strndup ("some longer string", 15); free (s); s = strndup ("shorter string", 13); result = s[13] != '\0'; free (s); return result;]])], [gl_cv_func_strndup_works=yes], [gl_cv_func_strndup_works=no], [ changequote(,)dnl case $host_os in aix | aix[3-6]*) gl_cv_func_strndup_works="guessing no";; *) gl_cv_func_strndup_works="guessing yes";; esac changequote([,])dnl ])]) case $gl_cv_func_strndup_works in *no) REPLACE_STRNDUP=1 ;; esac else HAVE_STRNDUP=0 fi ]) grub-2.14~git20250718.0e36779/m4/nl_langinfo.m40000644000175000017500000000527615036447602015067 00000000000000# nl_langinfo.m4 serial 8 dnl Copyright (C) 2009-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_NL_LANGINFO], [ AC_REQUIRE([gl_LANGINFO_H_DEFAULTS]) AC_REQUIRE([gl_LANGINFO_H]) AC_CHECK_FUNCS_ONCE([nl_langinfo]) AC_REQUIRE([AC_CANONICAL_HOST]) AC_REQUIRE([gl_FUNC_SETLOCALE_NULL]) AC_REQUIRE([gl_PTHREADLIB]) AC_CHECK_HEADERS_ONCE([threads.h]) if test $ac_cv_func_nl_langinfo = yes; then # On Irix 6.5, YESEXPR is defined, but nl_langinfo(YESEXPR) is broken. AC_CACHE_CHECK([whether YESEXPR works], [gl_cv_func_nl_langinfo_yesexpr_works], [AC_RUN_IFELSE( [AC_LANG_PROGRAM([[#include ]], [[return !*nl_langinfo(YESEXPR); ]])], [gl_cv_func_nl_langinfo_yesexpr_works=yes], [gl_cv_func_nl_langinfo_yesexpr_works=no], [ case "$host_os" in # Guess no on irix systems. irix*) gl_cv_func_nl_langinfo_yesexpr_works="guessing no";; # Guess yes elsewhere. *) gl_cv_func_nl_langinfo_yesexpr_works="guessing yes";; esac ]) ]) case $gl_cv_func_nl_langinfo_yesexpr_works in *yes) FUNC_NL_LANGINFO_YESEXPR_WORKS=1 ;; *) FUNC_NL_LANGINFO_YESEXPR_WORKS=0 ;; esac AC_DEFINE_UNQUOTED([FUNC_NL_LANGINFO_YESEXPR_WORKS], [$FUNC_NL_LANGINFO_YESEXPR_WORKS], [Define to 1 if nl_langinfo (YESEXPR) returns a non-empty string.]) # On Solaris 10 and Solaris 11.3, nl_langinfo is not multithread-safe. case "$host_os" in solaris*) NL_LANGINFO_MTSAFE=0 ;; *) NL_LANGINFO_MTSAFE=1 ;; esac AC_DEFINE_UNQUOTED([NL_LANGINFO_MTSAFE], [$NL_LANGINFO_MTSAFE], [Define to 1 if nl_langinfo is multithread-safe.]) if test $HAVE_LANGINFO_CODESET = 1 \ && test $HAVE_LANGINFO_T_FMT_AMPM = 1 \ && test $HAVE_LANGINFO_ALTMON = 1 \ && test $HAVE_LANGINFO_ERA = 1 \ && test $FUNC_NL_LANGINFO_YESEXPR_WORKS = 1 \ && test $NL_LANGINFO_MTSAFE = 1; then : else REPLACE_NL_LANGINFO=1 AC_DEFINE([REPLACE_NL_LANGINFO], [1], [Define if nl_langinfo exists but is overridden by gnulib.]) fi else HAVE_NL_LANGINFO=0 fi if test $HAVE_NL_LANGINFO = 0 || test $HAVE_LANGINFO_CODESET = 0; then LIB_NL_LANGINFO="$LIB_SETLOCALE_NULL" else LIB_NL_LANGINFO= fi dnl LIB_NL_LANGINFO is expected to be empty everywhere. AC_SUBST([LIB_NL_LANGINFO]) ]) # Prerequisites of lib/nl_langinfo-lock.c. AC_DEFUN([gl_PREREQ_NL_LANGINFO_LOCK], [ gl_VISIBILITY ]) grub-2.14~git20250718.0e36779/m4/rawmemchr.m40000644000175000017500000000116315036447602014555 00000000000000# rawmemchr.m4 serial 3 dnl Copyright (C) 2003, 2007-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_RAWMEMCHR], [ dnl Persuade glibc to declare rawmemchr(). AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) AC_REQUIRE([gl_STRING_H_DEFAULTS]) AC_CHECK_FUNCS([rawmemchr]) if test $ac_cv_func_rawmemchr = no; then HAVE_RAWMEMCHR=0 fi ]) # Prerequisites of lib/strchrnul.c. AC_DEFUN([gl_PREREQ_RAWMEMCHR], [:]) grub-2.14~git20250718.0e36779/m4/strchrnul.m40000644000175000017500000000276015036447602014620 00000000000000# strchrnul.m4 serial 10 dnl Copyright (C) 2003, 2007, 2009-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_STRCHRNUL], [ dnl Persuade glibc to declare strchrnul(). AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) AC_REQUIRE([gl_STRING_H_DEFAULTS]) AC_CHECK_FUNCS([strchrnul]) if test $ac_cv_func_strchrnul = no; then HAVE_STRCHRNUL=0 else AC_CACHE_CHECK([whether strchrnul works], [gl_cv_func_strchrnul_works], [AC_RUN_IFELSE([AC_LANG_PROGRAM([[ #include /* for strchrnul */ ]], [[const char *buf = "a"; return strchrnul (buf, 'b') != buf + 1; ]])], [gl_cv_func_strchrnul_works=yes], [gl_cv_func_strchrnul_works=no], [dnl Cygwin 1.7.9 introduced strchrnul, but it was broken until 1.7.10 AC_EGREP_CPP([Lucky user], [ #if defined __CYGWIN__ #include #if CYGWIN_VERSION_DLL_COMBINED > CYGWIN_VERSION_DLL_MAKE_COMBINED (1007, 9) Lucky user #endif #else Lucky user #endif ], [gl_cv_func_strchrnul_works="guessing yes"], [gl_cv_func_strchrnul_works="guessing no"]) ]) ]) case "$gl_cv_func_strchrnul_works" in *yes) ;; *) REPLACE_STRCHRNUL=1 ;; esac fi ]) # Prerequisites of lib/strchrnul.c. AC_DEFUN([gl_PREREQ_STRCHRNUL], [:]) grub-2.14~git20250718.0e36779/m4/extern-inline.m40000644000175000017500000001277415036452432015360 00000000000000dnl 'extern inline' a la ISO C99. dnl Copyright 2012-2022 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_EXTERN_INLINE], [ AC_CACHE_CHECK([whether ctype.h defines __header_inline], [gl_cv_have___header_inline], [AC_PREPROC_IFELSE( [AC_LANG_SOURCE([[#include #ifndef __header_inline #error " does not define __header_inline" #endif ]])], [gl_cv_have___header_inline=yes], [gl_cv_have___header_inline=no])]) if test "$gl_cv_have___header_inline" = yes; then AC_DEFINE([HAVE___HEADER_INLINE], [1], [Define to 1 if ctype.h defines __header_inline.]) fi AH_VERBATIM([HAVE___HEADER_INLINE_1], [/* Please see the Gnulib manual for how to use these macros. Suppress extern inline with HP-UX cc, as it appears to be broken; see . Suppress extern inline with Sun C in standards-conformance mode, as it mishandles inline functions that call each other. E.g., for 'inline void f (void) { } inline void g (void) { f (); }', c99 incorrectly complains 'reference to static identifier "f" in extern inline function'. This bug was observed with Oracle Developer Studio 12.6 (Sun C 5.15 SunOS_sparc 2017/05/30). Suppress extern inline (with or without __attribute__ ((__gnu_inline__))) on configurations that mistakenly use 'static inline' to implement functions or macros in standard C headers like . For example, if isdigit is mistakenly implemented via a static inline function, a program containing an extern inline function that calls isdigit may not work since the C standard prohibits extern inline functions from calling static functions (ISO C 99 section 6.7.4.(3). This bug is known to occur on: OS X 10.8 and earlier; see: https://lists.gnu.org/r/bug-gnulib/2012-12/msg00023.html DragonFly; see http://muscles.dragonflybsd.org/bulk/clang-master-potential/20141111_102002/logs/ah-tty-0.3.12.log FreeBSD; see: https://lists.gnu.org/r/bug-gnulib/2014-07/msg00104.html OS X 10.9 has a macro __header_inline indicating the bug is fixed for C and for clang but remains for g++; see . Assume DragonFly and FreeBSD will be similar. GCC 4.3 and above with -std=c99 or -std=gnu99 implements ISO C99 inline semantics, unless -fgnu89-inline is used. It defines a macro __GNUC_STDC_INLINE__ to indicate this situation or a macro __GNUC_GNU_INLINE__ to indicate the opposite situation. GCC 4.2 with -std=c99 or -std=gnu99 implements the GNU C inline semantics but warns, unless -fgnu89-inline is used: warning: C99 inline functions are not supported; using GNU89 warning: to disable this warning use -fgnu89-inline or the gnu_inline function attribute It defines a macro __GNUC_GNU_INLINE__ to indicate this situation. */ #if (((defined __APPLE__ && defined __MACH__) \ || defined __DragonFly__ || defined __FreeBSD__) \ && (defined HAVE___HEADER_INLINE \ ? (defined __cplusplus && defined __GNUC_STDC_INLINE__ \ && ! defined __clang__) \ : ((! defined _DONT_USE_CTYPE_INLINE_ \ && (defined __GNUC__ || defined __cplusplus)) \ || (defined _FORTIFY_SOURCE && 0 < _FORTIFY_SOURCE \ && defined __GNUC__ && ! defined __cplusplus)))) # define _GL_EXTERN_INLINE_STDHEADER_BUG #endif #if ((__GNUC__ \ ? defined __GNUC_STDC_INLINE__ && __GNUC_STDC_INLINE__ \ : (199901L <= __STDC_VERSION__ \ && !defined __HP_cc \ && !defined __PGI \ && !(defined __SUNPRO_C && __STDC__))) \ && !defined _GL_EXTERN_INLINE_STDHEADER_BUG) # define _GL_INLINE inline # define _GL_EXTERN_INLINE extern inline # define _GL_EXTERN_INLINE_IN_USE #elif (2 < __GNUC__ + (7 <= __GNUC_MINOR__) && !defined __STRICT_ANSI__ \ && !defined _GL_EXTERN_INLINE_STDHEADER_BUG) # if defined __GNUC_GNU_INLINE__ && __GNUC_GNU_INLINE__ /* __gnu_inline__ suppresses a GCC 4.2 diagnostic. */ # define _GL_INLINE extern inline __attribute__ ((__gnu_inline__)) # else # define _GL_INLINE extern inline # endif # define _GL_EXTERN_INLINE extern # define _GL_EXTERN_INLINE_IN_USE #else # define _GL_INLINE _GL_UNUSED static # define _GL_EXTERN_INLINE _GL_UNUSED static #endif /* In GCC 4.6 (inclusive) to 5.1 (exclusive), suppress bogus "no previous prototype for 'FOO'" and "no previous declaration for 'FOO'" diagnostics, when FOO is an inline function in the header; see and . */ #if __GNUC__ == 4 && 6 <= __GNUC_MINOR__ # if defined __GNUC_STDC_INLINE__ && __GNUC_STDC_INLINE__ # define _GL_INLINE_HEADER_CONST_PRAGMA # else # define _GL_INLINE_HEADER_CONST_PRAGMA \ _Pragma ("GCC diagnostic ignored \"-Wsuggest-attribute=const\"") # endif # define _GL_INLINE_HEADER_BEGIN \ _Pragma ("GCC diagnostic push") \ _Pragma ("GCC diagnostic ignored \"-Wmissing-prototypes\"") \ _Pragma ("GCC diagnostic ignored \"-Wmissing-declarations\"") \ _GL_INLINE_HEADER_CONST_PRAGMA # define _GL_INLINE_HEADER_END \ _Pragma ("GCC diagnostic pop") #else # define _GL_INLINE_HEADER_BEGIN # define _GL_INLINE_HEADER_END #endif]) ]) grub-2.14~git20250718.0e36779/ABOUT-NLS0000644000175000017500000026713315036447570013254 000000000000001 Notes on the Free Translation Project *************************************** Free software is going international! The Free Translation Project is a way to get maintainers of free software, translators, and users all together, so that free software will gradually become able to speak many languages. A few packages already provide translations for their messages. If you found this `ABOUT-NLS' file inside a distribution, you may assume that the distributed package does use GNU `gettext' internally, itself available at your nearest GNU archive site. But you do _not_ need to install GNU `gettext' prior to configuring, installing or using this package with messages translated. Installers will find here some useful hints. These notes also explain how users should proceed for getting the programs to use the available translations. They tell how people wanting to contribute and work on translations can contact the appropriate team. 1.1 INSTALL Matters =================== Some packages are "localizable" when properly installed; the programs they contain can be made to speak your own native language. Most such packages use GNU `gettext'. Other packages have their own ways to internationalization, predating GNU `gettext'. By default, this package will be installed to allow translation of messages. It will automatically detect whether the system already provides the GNU `gettext' functions. Installers may use special options at configuration time for changing the default behaviour. The command: ./configure --disable-nls will _totally_ disable translation of messages. When you already have GNU `gettext' installed on your system and run configure without an option for your new package, `configure' will probably detect the previously built and installed `libintl' library and will decide to use it. If not, you may have to to use the `--with-libintl-prefix' option to tell `configure' where to look for it. Internationalized packages usually have many `po/LL.po' files, where LL gives an ISO 639 two-letter code identifying the language. Unless translations have been forbidden at `configure' time by using the `--disable-nls' switch, all available translations are installed together with the package. However, the environment variable `LINGUAS' may be set, prior to configuration, to limit the installed set. `LINGUAS' should then contain a space separated list of two-letter codes, stating which languages are allowed. 1.2 Using This Package ====================== As a user, if your language has been installed for this package, you only have to set the `LANG' environment variable to the appropriate `LL_CC' combination. If you happen to have the `LC_ALL' or some other `LC_xxx' environment variables set, you should unset them before setting `LANG', otherwise the setting of `LANG' will not have the desired effect. Here `LL' is an ISO 639 two-letter language code, and `CC' is an ISO 3166 two-letter country code. For example, let's suppose that you speak German and live in Germany. At the shell prompt, merely execute `setenv LANG de_DE' (in `csh'), `export LANG; LANG=de_DE' (in `sh') or `export LANG=de_DE' (in `bash'). This can be done from your `.login' or `.profile' file, once and for all. You might think that the country code specification is redundant. But in fact, some languages have dialects in different countries. For example, `de_AT' is used for Austria, and `pt_BR' for Brazil. The country code serves to distinguish the dialects. The locale naming convention of `LL_CC', with `LL' denoting the language and `CC' denoting the country, is the one use on systems based on GNU libc. On other systems, some variations of this scheme are used, such as `LL' or `LL_CC.ENCODING'. You can get the list of locales supported by your system for your language by running the command `locale -a | grep '^LL''. Not all programs have translations for all languages. By default, an English message is shown in place of a nonexistent translation. If you understand other languages, you can set up a priority list of languages. This is done through a different environment variable, called `LANGUAGE'. GNU `gettext' gives preference to `LANGUAGE' over `LANG' for the purpose of message handling, but you still need to have `LANG' set to the primary language; this is required by other parts of the system libraries. For example, some Swedish users who would rather read translations in German than English for when Swedish is not available, set `LANGUAGE' to `sv:de' while leaving `LANG' to `sv_SE'. Special advice for Norwegian users: The language code for Norwegian bokma*l changed from `no' to `nb' recently (in 2003). During the transition period, while some message catalogs for this language are installed under `nb' and some older ones under `no', it's recommended for Norwegian users to set `LANGUAGE' to `nb:no' so that both newer and older translations are used. In the `LANGUAGE' environment variable, but not in the `LANG' environment variable, `LL_CC' combinations can be abbreviated as `LL' to denote the language's main dialect. For example, `de' is equivalent to `de_DE' (German as spoken in Germany), and `pt' to `pt_PT' (Portuguese as spoken in Portugal) in this context. 1.3 Translating Teams ===================== For the Free Translation Project to be a success, we need interested people who like their own language and write it well, and who are also able to synergize with other translators speaking the same language. Each translation team has its own mailing list. The up-to-date list of teams can be found at the Free Translation Project's homepage, `http://translationproject.org/', in the "Teams" area. If you'd like to volunteer to _work_ at translating messages, you should become a member of the translating team for your own language. The subscribing address is _not_ the same as the list itself, it has `-request' appended. For example, speakers of Swedish can send a message to `sv-request@li.org', having this message body: subscribe Keep in mind that team members are expected to participate _actively_ in translations, or at solving translational difficulties, rather than merely lurking around. If your team does not exist yet and you want to start one, or if you are unsure about what to do or how to get started, please write to `coordinator@translationproject.org' to reach the coordinator for all translator teams. The English team is special. It works at improving and uniformizing the terminology in use. Proven linguistic skills are praised more than programming skills, here. 1.4 Available Packages ====================== Languages are not equally supported in all packages. The following matrix shows the current state of internationalization, as of June 2010. The matrix shows, in regard of each package, for which languages PO files have been submitted to translation coordination, with a translation percentage of at least 50%. Ready PO files af am an ar as ast az be be@latin bg bn_IN bs ca +--------------------------------------------------+ a2ps | [] [] | aegis | | ant-phone | | anubis | | aspell | [] [] | bash | | bfd | | bibshelf | [] | binutils | | bison | | bison-runtime | [] | bluez-pin | [] [] | bombono-dvd | | buzztard | | cflow | | clisp | | coreutils | [] [] | cpio | | cppi | | cpplib | [] | cryptsetup | | dfarc | | dialog | [] [] | dico | | diffutils | [] | dink | | doodle | | e2fsprogs | [] | enscript | [] | exif | | fetchmail | [] | findutils | [] | flex | [] | freedink | | gas | | gawk | [] [] | gcal | [] | gcc | | gettext-examples | [] [] [] [] | gettext-runtime | [] [] | gettext-tools | [] [] | gip | [] | gjay | | gliv | [] | glunarclock | [] [] | gnubiff | | gnucash | [] | gnuedu | | gnulib | | gnunet | | gnunet-gtk | | gnutls | | gold | | gpe-aerial | | gpe-beam | | gpe-bluetooth | | gpe-calendar | | gpe-clock | [] | gpe-conf | | gpe-contacts | | gpe-edit | | gpe-filemanager | | gpe-go | | gpe-login | | gpe-ownerinfo | [] | gpe-package | | gpe-sketchbook | | gpe-su | [] | gpe-taskmanager | [] | gpe-timesheet | [] | gpe-today | [] | gpe-todo | | gphoto2 | | gprof | [] | gpsdrive | | gramadoir | | grep | | grub | [] [] | gsasl | | gss | | gst-plugins-bad | [] | gst-plugins-base | [] | gst-plugins-good | [] | gst-plugins-ugly | [] | gstreamer | [] [] [] | gtick | | gtkam | [] | gtkorphan | [] | gtkspell | [] [] [] | gutenprint | | hello | [] | help2man | | hylafax | | idutils | | indent | [] [] | iso_15924 | | iso_3166 | [] [] [] [] [] [] [] | iso_3166_2 | | iso_4217 | | iso_639 | [] [] [] [] | iso_639_3 | | jwhois | | kbd | | keytouch | [] | keytouch-editor | | keytouch-keyboa... | [] | klavaro | [] | latrine | | ld | [] | leafpad | [] [] | libc | [] [] | libexif | () | libextractor | | libgnutls | | libgpewidget | | libgpg-error | | libgphoto2 | | libgphoto2_port | | libgsasl | | libiconv | [] | libidn | | lifelines | | liferea | [] [] | lilypond | | linkdr | [] | lordsawar | | lprng | | lynx | [] | m4 | | mailfromd | | mailutils | | make | | man-db | | man-db-manpages | | minicom | | mkisofs | | myserver | | nano | [] [] | opcodes | | parted | | pies | | popt | | psmisc | | pspp | [] | pwdutils | | radius | [] | recode | [] [] | rosegarden | | rpm | | rush | | sarg | | screem | | scrollkeeper | [] [] [] | sed | [] [] | sharutils | [] [] | shishi | | skencil | | solfege | | solfege-manual | | soundtracker | | sp | | sysstat | | tar | [] | texinfo | | tin | | unicode-han-tra... | | unicode-transla... | | util-linux-ng | [] | vice | | vmm | | vorbis-tools | | wastesedge | | wdiff | | wget | [] [] | wyslij-po | | xchat | [] [] [] [] | xdg-user-dirs | [] [] [] [] [] [] [] [] [] | xkeyboard-config | [] [] | +--------------------------------------------------+ af am an ar as ast az be be@latin bg bn_IN bs ca 6 0 1 2 3 19 1 10 3 28 3 1 38 crh cs da de el en en_GB en_ZA eo es et eu fa +-------------------------------------------------+ a2ps | [] [] [] [] [] [] [] | aegis | [] [] [] | ant-phone | [] () | anubis | [] [] | aspell | [] [] [] [] [] | bash | [] [] [] | bfd | [] | bibshelf | [] [] [] | binutils | [] | bison | [] [] | bison-runtime | [] [] [] [] | bluez-pin | [] [] [] [] [] [] | bombono-dvd | [] | buzztard | [] [] [] | cflow | [] [] | clisp | [] [] [] [] | coreutils | [] [] [] [] | cpio | | cppi | | cpplib | [] [] [] | cryptsetup | [] | dfarc | [] [] [] | dialog | [] [] [] [] [] | dico | | diffutils | [] [] [] [] [] [] | dink | [] [] [] | doodle | [] | e2fsprogs | [] [] [] | enscript | [] [] [] | exif | () [] [] | fetchmail | [] [] () [] [] [] | findutils | [] [] [] | flex | [] [] | freedink | [] [] [] | gas | [] | gawk | [] [] [] | gcal | [] | gcc | [] [] | gettext-examples | [] [] [] [] | gettext-runtime | [] [] [] [] | gettext-tools | [] [] [] | gip | [] [] [] [] | gjay | [] | gliv | [] [] [] | glunarclock | [] [] | gnubiff | () | gnucash | [] () () () () | gnuedu | [] [] | gnulib | [] [] | gnunet | | gnunet-gtk | [] | gnutls | [] [] | gold | [] | gpe-aerial | [] [] [] [] | gpe-beam | [] [] [] [] | gpe-bluetooth | [] [] | gpe-calendar | [] | gpe-clock | [] [] [] [] | gpe-conf | [] [] [] | gpe-contacts | [] [] [] | gpe-edit | [] [] | gpe-filemanager | [] [] [] | gpe-go | [] [] [] [] | gpe-login | [] [] | gpe-ownerinfo | [] [] [] [] | gpe-package | [] [] [] | gpe-sketchbook | [] [] [] [] | gpe-su | [] [] [] [] | gpe-taskmanager | [] [] [] [] | gpe-timesheet | [] [] [] [] | gpe-today | [] [] [] [] | gpe-todo | [] [] [] | gphoto2 | [] [] () [] [] [] | gprof | [] [] [] | gpsdrive | [] [] [] | gramadoir | [] [] [] | grep | [] | grub | [] [] | gsasl | [] | gss | | gst-plugins-bad | [] [] [] [] [] | gst-plugins-base | [] [] [] [] [] | gst-plugins-good | [] [] [] [] [] [] | gst-plugins-ugly | [] [] [] [] [] [] | gstreamer | [] [] [] [] [] | gtick | [] () [] | gtkam | [] [] () [] [] | gtkorphan | [] [] [] [] | gtkspell | [] [] [] [] [] [] [] | gutenprint | [] [] [] | hello | [] [] [] [] | help2man | [] | hylafax | [] [] | idutils | [] [] | indent | [] [] [] [] [] [] [] | iso_15924 | [] () [] [] | iso_3166 | [] [] [] [] () [] [] [] () | iso_3166_2 | () | iso_4217 | [] [] [] () [] [] | iso_639 | [] [] [] [] () [] [] | iso_639_3 | [] | jwhois | [] | kbd | [] [] [] [] [] | keytouch | [] [] | keytouch-editor | [] [] | keytouch-keyboa... | [] | klavaro | [] [] [] [] | latrine | [] () | ld | [] [] | leafpad | [] [] [] [] [] [] | libc | [] [] [] [] | libexif | [] [] () | libextractor | | libgnutls | [] | libgpewidget | [] [] | libgpg-error | [] [] | libgphoto2 | [] () | libgphoto2_port | [] () [] | libgsasl | | libiconv | [] [] [] [] [] | libidn | [] [] [] | lifelines | [] () | liferea | [] [] [] [] [] | lilypond | [] [] [] | linkdr | [] [] [] | lordsawar | [] | lprng | | lynx | [] [] [] [] | m4 | [] [] [] [] | mailfromd | | mailutils | [] | make | [] [] [] | man-db | | man-db-manpages | | minicom | [] [] [] [] | mkisofs | | myserver | | nano | [] [] [] | opcodes | [] [] | parted | [] [] | pies | | popt | [] [] [] [] [] | psmisc | [] [] [] | pspp | [] | pwdutils | [] | radius | [] | recode | [] [] [] [] [] [] | rosegarden | () () () | rpm | [] [] [] | rush | | sarg | | screem | | scrollkeeper | [] [] [] [] [] | sed | [] [] [] [] [] [] | sharutils | [] [] [] [] | shishi | | skencil | [] () [] | solfege | [] [] [] | solfege-manual | [] [] | soundtracker | [] [] [] | sp | [] | sysstat | [] [] [] | tar | [] [] [] [] | texinfo | [] [] [] | tin | [] [] | unicode-han-tra... | | unicode-transla... | | util-linux-ng | [] [] [] [] | vice | () () | vmm | [] | vorbis-tools | [] [] | wastesedge | [] | wdiff | [] [] | wget | [] [] [] | wyslij-po | | xchat | [] [] [] [] [] | xdg-user-dirs | [] [] [] [] [] [] [] [] [] | xkeyboard-config | [] [] [] [] [] [] | +-------------------------------------------------+ crh cs da de el en en_GB en_ZA eo es et eu fa 5 64 105 117 18 1 8 0 28 89 18 19 0 fi fr ga gl gu he hi hr hu hy id is it ja ka kn +----------------------------------------------------+ a2ps | [] [] [] [] | aegis | [] [] | ant-phone | [] [] | anubis | [] [] [] [] | aspell | [] [] [] [] | bash | [] [] [] [] | bfd | [] [] [] | bibshelf | [] [] [] [] [] | binutils | [] [] [] | bison | [] [] [] [] | bison-runtime | [] [] [] [] [] [] | bluez-pin | [] [] [] [] [] [] [] [] | bombono-dvd | [] | buzztard | [] | cflow | [] [] [] | clisp | [] | coreutils | [] [] [] [] [] | cpio | [] [] [] [] | cppi | [] [] | cpplib | [] [] [] | cryptsetup | [] [] [] | dfarc | [] [] [] | dialog | [] [] [] [] [] [] [] | dico | | diffutils | [] [] [] [] [] [] [] [] [] | dink | [] | doodle | [] [] | e2fsprogs | [] [] | enscript | [] [] [] [] | exif | [] [] [] [] [] [] | fetchmail | [] [] [] [] | findutils | [] [] [] [] [] [] | flex | [] [] [] | freedink | [] [] [] | gas | [] [] | gawk | [] [] [] [] () [] | gcal | [] | gcc | [] | gettext-examples | [] [] [] [] [] [] [] | gettext-runtime | [] [] [] [] [] [] | gettext-tools | [] [] [] [] | gip | [] [] [] [] [] [] | gjay | [] | gliv | [] () | glunarclock | [] [] [] [] | gnubiff | () [] () | gnucash | () () () () () [] | gnuedu | [] [] | gnulib | [] [] [] [] [] [] | gnunet | | gnunet-gtk | [] | gnutls | [] [] | gold | [] [] | gpe-aerial | [] [] [] | gpe-beam | [] [] [] [] | gpe-bluetooth | [] [] [] [] | gpe-calendar | [] [] | gpe-clock | [] [] [] [] [] | gpe-conf | [] [] [] [] | gpe-contacts | [] [] [] [] | gpe-edit | [] [] [] | gpe-filemanager | [] [] [] [] | gpe-go | [] [] [] [] [] | gpe-login | [] [] [] | gpe-ownerinfo | [] [] [] [] [] | gpe-package | [] [] [] | gpe-sketchbook | [] [] [] [] | gpe-su | [] [] [] [] [] [] | gpe-taskmanager | [] [] [] [] [] | gpe-timesheet | [] [] [] [] [] | gpe-today | [] [] [] [] [] [] [] | gpe-todo | [] [] [] | gphoto2 | [] [] [] [] [] [] | gprof | [] [] [] [] | gpsdrive | [] [] [] | gramadoir | [] [] [] | grep | [] [] | grub | [] [] [] [] | gsasl | [] [] [] [] [] | gss | [] [] [] [] [] | gst-plugins-bad | [] [] [] [] [] [] | gst-plugins-base | [] [] [] [] [] [] | gst-plugins-good | [] [] [] [] [] [] | gst-plugins-ugly | [] [] [] [] [] [] | gstreamer | [] [] [] [] [] | gtick | [] [] [] [] [] | gtkam | [] [] [] [] [] | gtkorphan | [] [] [] | gtkspell | [] [] [] [] [] [] [] [] [] | gutenprint | [] [] [] [] | hello | [] [] [] | help2man | [] [] | hylafax | [] | idutils | [] [] [] [] [] [] | indent | [] [] [] [] [] [] [] [] | iso_15924 | [] () [] [] | iso_3166 | [] () [] [] [] [] [] [] [] [] [] [] | iso_3166_2 | () [] [] [] | iso_4217 | [] () [] [] [] [] | iso_639 | [] () [] [] [] [] [] [] [] | iso_639_3 | () [] [] | jwhois | [] [] [] [] [] | kbd | [] [] | keytouch | [] [] [] [] [] [] | keytouch-editor | [] [] [] [] [] | keytouch-keyboa... | [] [] [] [] [] | klavaro | [] [] | latrine | [] [] [] | ld | [] [] [] [] | leafpad | [] [] [] [] [] [] [] () | libc | [] [] [] [] [] | libexif | [] | libextractor | | libgnutls | [] [] | libgpewidget | [] [] [] [] | libgpg-error | [] [] | libgphoto2 | [] [] [] | libgphoto2_port | [] [] [] | libgsasl | [] [] [] [] [] | libiconv | [] [] [] [] [] [] | libidn | [] [] [] [] | lifelines | () | liferea | [] [] [] [] | lilypond | [] [] | linkdr | [] [] [] [] [] | lordsawar | | lprng | [] | lynx | [] [] [] [] [] | m4 | [] [] [] [] [] [] | mailfromd | | mailutils | [] [] | make | [] [] [] [] [] [] [] [] [] | man-db | [] [] | man-db-manpages | [] | minicom | [] [] [] [] [] | mkisofs | [] [] [] [] | myserver | | nano | [] [] [] [] [] [] | opcodes | [] [] [] [] | parted | [] [] [] [] | pies | | popt | [] [] [] [] [] [] [] [] [] | psmisc | [] [] [] | pspp | | pwdutils | [] [] | radius | [] [] | recode | [] [] [] [] [] [] [] [] | rosegarden | () () () () () | rpm | [] [] | rush | | sarg | [] | screem | [] [] | scrollkeeper | [] [] [] [] | sed | [] [] [] [] [] [] [] [] | sharutils | [] [] [] [] [] [] [] | shishi | [] | skencil | [] | solfege | [] [] [] [] | solfege-manual | [] [] | soundtracker | [] [] | sp | [] () | sysstat | [] [] [] [] [] | tar | [] [] [] [] [] [] [] | texinfo | [] [] [] [] | tin | [] | unicode-han-tra... | | unicode-transla... | [] [] | util-linux-ng | [] [] [] [] [] [] | vice | () () () | vmm | [] | vorbis-tools | [] | wastesedge | () () | wdiff | [] | wget | [] [] [] [] [] [] [] [] | wyslij-po | [] [] [] | xchat | [] [] [] [] [] [] [] [] [] | xdg-user-dirs | [] [] [] [] [] [] [] [] [] [] [] [] [] | xkeyboard-config | [] [] [] [] [] | +----------------------------------------------------+ fi fr ga gl gu he hi hr hu hy id is it ja ka kn 105 121 53 20 4 8 3 5 53 2 120 5 84 67 0 4 ko ku ky lg lt lv mk ml mn mr ms mt nb nds ne +-----------------------------------------------+ a2ps | [] | aegis | | ant-phone | | anubis | [] [] | aspell | [] | bash | | bfd | | bibshelf | [] [] | binutils | | bison | [] | bison-runtime | [] [] [] [] [] | bluez-pin | [] [] [] [] [] | bombono-dvd | | buzztard | | cflow | | clisp | | coreutils | [] | cpio | | cppi | | cpplib | | cryptsetup | | dfarc | [] | dialog | [] [] [] [] [] | dico | | diffutils | [] [] | dink | | doodle | | e2fsprogs | | enscript | | exif | [] | fetchmail | | findutils | | flex | | freedink | [] | gas | | gawk | | gcal | | gcc | | gettext-examples | [] [] [] [] | gettext-runtime | [] | gettext-tools | [] | gip | [] [] | gjay | | gliv | | glunarclock | [] | gnubiff | | gnucash | () () () () | gnuedu | | gnulib | | gnunet | | gnunet-gtk | | gnutls | [] | gold | | gpe-aerial | [] | gpe-beam | [] | gpe-bluetooth | [] [] | gpe-calendar | [] | gpe-clock | [] [] [] [] [] | gpe-conf | [] [] | gpe-contacts | [] [] | gpe-edit | [] | gpe-filemanager | [] [] | gpe-go | [] [] [] | gpe-login | [] | gpe-ownerinfo | [] [] | gpe-package | [] [] | gpe-sketchbook | [] [] | gpe-su | [] [] [] [] [] [] | gpe-taskmanager | [] [] [] [] [] [] | gpe-timesheet | [] [] | gpe-today | [] [] [] [] | gpe-todo | [] [] | gphoto2 | | gprof | [] | gpsdrive | | gramadoir | | grep | | grub | | gsasl | | gss | | gst-plugins-bad | [] [] [] [] | gst-plugins-base | [] [] | gst-plugins-good | [] [] | gst-plugins-ugly | [] [] [] [] [] | gstreamer | | gtick | | gtkam | [] | gtkorphan | [] [] | gtkspell | [] [] [] [] [] [] [] | gutenprint | | hello | [] [] [] | help2man | | hylafax | | idutils | | indent | | iso_15924 | [] [] | iso_3166 | [] [] () [] [] [] [] [] | iso_3166_2 | | iso_4217 | [] [] | iso_639 | [] [] | iso_639_3 | [] | jwhois | [] | kbd | | keytouch | [] | keytouch-editor | [] | keytouch-keyboa... | [] | klavaro | [] | latrine | [] | ld | | leafpad | [] [] [] | libc | [] | libexif | | libextractor | | libgnutls | [] | libgpewidget | [] [] | libgpg-error | | libgphoto2 | | libgphoto2_port | | libgsasl | | libiconv | | libidn | | lifelines | | liferea | | lilypond | | linkdr | | lordsawar | | lprng | | lynx | | m4 | | mailfromd | | mailutils | | make | [] | man-db | | man-db-manpages | | minicom | [] | mkisofs | | myserver | | nano | [] [] | opcodes | | parted | | pies | | popt | [] [] [] | psmisc | | pspp | | pwdutils | | radius | | recode | | rosegarden | | rpm | | rush | | sarg | | screem | | scrollkeeper | [] [] | sed | | sharutils | | shishi | | skencil | | solfege | [] | solfege-manual | | soundtracker | | sp | | sysstat | [] | tar | [] | texinfo | [] | tin | | unicode-han-tra... | | unicode-transla... | | util-linux-ng | | vice | | vmm | | vorbis-tools | | wastesedge | | wdiff | | wget | [] | wyslij-po | | xchat | [] [] [] | xdg-user-dirs | [] [] [] [] [] [] [] [] | xkeyboard-config | [] [] [] | +-----------------------------------------------+ ko ku ky lg lt lv mk ml mn mr ms mt nb nds ne 20 5 10 1 13 48 4 2 2 4 24 10 20 3 1 nl nn or pa pl ps pt pt_BR ro ru rw sk sl sq sr +---------------------------------------------------+ a2ps | [] [] [] [] [] [] [] [] | aegis | [] [] [] | ant-phone | [] [] | anubis | [] [] [] | aspell | [] [] [] [] [] | bash | [] [] | bfd | [] | bibshelf | [] [] | binutils | [] [] | bison | [] [] [] | bison-runtime | [] [] [] [] [] [] [] | bluez-pin | [] [] [] [] [] [] [] [] | bombono-dvd | [] () | buzztard | [] [] | cflow | [] | clisp | [] [] | coreutils | [] [] [] [] [] [] | cpio | [] [] [] | cppi | [] | cpplib | [] | cryptsetup | [] | dfarc | [] | dialog | [] [] [] [] | dico | [] | diffutils | [] [] [] [] [] [] | dink | () | doodle | [] [] | e2fsprogs | [] [] | enscript | [] [] [] [] [] | exif | [] [] [] () [] | fetchmail | [] [] [] [] | findutils | [] [] [] [] [] | flex | [] [] [] [] [] | freedink | [] [] | gas | | gawk | [] [] [] [] | gcal | | gcc | [] | gettext-examples | [] [] [] [] [] [] [] [] | gettext-runtime | [] [] [] [] [] [] [] [] [] | gettext-tools | [] [] [] [] [] [] | gip | [] [] [] [] [] | gjay | | gliv | [] [] [] [] [] [] | glunarclock | [] [] [] [] [] | gnubiff | [] () | gnucash | [] () () () | gnuedu | [] | gnulib | [] [] [] [] | gnunet | | gnunet-gtk | | gnutls | [] [] | gold | | gpe-aerial | [] [] [] [] [] [] [] | gpe-beam | [] [] [] [] [] [] [] | gpe-bluetooth | [] [] | gpe-calendar | [] [] [] [] | gpe-clock | [] [] [] [] [] [] [] [] | gpe-conf | [] [] [] [] [] [] [] | gpe-contacts | [] [] [] [] [] | gpe-edit | [] [] [] | gpe-filemanager | [] [] [] | gpe-go | [] [] [] [] [] [] [] [] | gpe-login | [] [] | gpe-ownerinfo | [] [] [] [] [] [] [] [] | gpe-package | [] [] | gpe-sketchbook | [] [] [] [] [] [] [] | gpe-su | [] [] [] [] [] [] [] [] | gpe-taskmanager | [] [] [] [] [] [] [] [] | gpe-timesheet | [] [] [] [] [] [] [] [] | gpe-today | [] [] [] [] [] [] [] [] | gpe-todo | [] [] [] [] [] | gphoto2 | [] [] [] [] [] [] [] [] | gprof | [] [] [] | gpsdrive | [] [] | gramadoir | [] [] | grep | [] [] [] [] | grub | [] [] [] | gsasl | [] [] [] [] | gss | [] [] [] | gst-plugins-bad | [] [] [] [] [] [] | gst-plugins-base | [] [] [] [] [] | gst-plugins-good | [] [] [] [] [] | gst-plugins-ugly | [] [] [] [] [] [] | gstreamer | [] [] [] [] [] | gtick | [] [] [] | gtkam | [] [] [] [] [] [] | gtkorphan | [] | gtkspell | [] [] [] [] [] [] [] [] [] [] | gutenprint | [] [] | hello | [] [] [] [] | help2man | [] [] | hylafax | [] | idutils | [] [] [] [] [] | indent | [] [] [] [] [] [] [] | iso_15924 | [] [] [] [] | iso_3166 | [] [] [] [] [] () [] [] [] [] [] [] [] [] | iso_3166_2 | [] [] [] | iso_4217 | [] [] [] [] [] [] [] [] | iso_639 | [] [] [] [] [] [] [] [] [] | iso_639_3 | [] [] | jwhois | [] [] [] [] | kbd | [] [] [] | keytouch | [] [] [] | keytouch-editor | [] [] [] | keytouch-keyboa... | [] [] [] | klavaro | [] [] | latrine | [] [] | ld | | leafpad | [] [] [] [] [] [] [] [] [] | libc | [] [] [] [] | libexif | [] [] () [] | libextractor | | libgnutls | [] [] | libgpewidget | [] [] [] | libgpg-error | [] [] | libgphoto2 | [] [] | libgphoto2_port | [] [] [] [] [] | libgsasl | [] [] [] [] [] | libiconv | [] [] [] [] [] | libidn | [] [] | lifelines | [] [] | liferea | [] [] [] [] [] () () [] | lilypond | [] | linkdr | [] [] [] | lordsawar | | lprng | [] | lynx | [] [] [] | m4 | [] [] [] [] [] | mailfromd | [] | mailutils | [] | make | [] [] [] [] | man-db | [] [] [] | man-db-manpages | [] [] [] | minicom | [] [] [] [] | mkisofs | [] [] [] | myserver | | nano | [] [] [] [] | opcodes | [] [] | parted | [] [] [] [] | pies | [] | popt | [] [] [] [] | psmisc | [] [] [] | pspp | [] [] | pwdutils | [] | radius | [] [] [] | recode | [] [] [] [] [] [] [] [] | rosegarden | () () | rpm | [] [] [] | rush | [] [] | sarg | | screem | | scrollkeeper | [] [] [] [] [] [] [] [] | sed | [] [] [] [] [] [] [] [] [] | sharutils | [] [] [] [] | shishi | [] | skencil | [] [] | solfege | [] [] [] [] | solfege-manual | [] [] [] | soundtracker | [] | sp | | sysstat | [] [] [] [] | tar | [] [] [] [] | texinfo | [] [] [] [] | tin | [] | unicode-han-tra... | | unicode-transla... | | util-linux-ng | [] [] [] [] [] | vice | [] | vmm | [] | vorbis-tools | [] [] | wastesedge | [] | wdiff | [] [] | wget | [] [] [] [] [] [] [] | wyslij-po | [] [] [] | xchat | [] [] [] [] [] [] [] [] [] | xdg-user-dirs | [] [] [] [] [] [] [] [] [] [] [] [] [] [] | xkeyboard-config | [] [] [] | +---------------------------------------------------+ nl nn or pa pl ps pt pt_BR ro ru rw sk sl sq sr 135 10 4 7 105 1 29 62 47 91 3 54 46 9 37 sv sw ta te tg th tr uk vi wa zh_CN zh_HK zh_TW +---------------------------------------------------+ a2ps | [] [] [] [] [] | 27 aegis | [] | 9 ant-phone | [] [] [] [] | 9 anubis | [] [] [] [] | 15 aspell | [] [] [] | 20 bash | [] [] [] | 12 bfd | [] | 6 bibshelf | [] [] [] | 16 binutils | [] [] | 8 bison | [] [] | 12 bison-runtime | [] [] [] [] [] [] | 29 bluez-pin | [] [] [] [] [] [] [] [] | 37 bombono-dvd | [] | 4 buzztard | [] | 7 cflow | [] [] [] | 9 clisp | | 10 coreutils | [] [] [] [] | 22 cpio | [] [] [] [] [] [] | 13 cppi | [] [] | 5 cpplib | [] [] [] [] [] [] | 14 cryptsetup | [] [] | 7 dfarc | [] | 9 dialog | [] [] [] [] [] [] [] | 30 dico | [] | 2 diffutils | [] [] [] [] [] [] | 30 dink | | 4 doodle | [] [] | 7 e2fsprogs | [] [] [] | 11 enscript | [] [] [] [] | 17 exif | [] [] [] | 16 fetchmail | [] [] [] | 17 findutils | [] [] [] [] [] | 20 flex | [] [] [] [] | 15 freedink | [] | 10 gas | [] | 4 gawk | [] [] [] [] | 18 gcal | [] [] | 5 gcc | [] [] [] | 7 gettext-examples | [] [] [] [] [] [] [] | 34 gettext-runtime | [] [] [] [] [] [] [] | 29 gettext-tools | [] [] [] [] [] [] | 22 gip | [] [] [] [] | 22 gjay | [] | 3 gliv | [] [] [] | 14 glunarclock | [] [] [] [] [] | 19 gnubiff | [] [] | 4 gnucash | () [] () [] () | 10 gnuedu | [] [] | 7 gnulib | [] [] [] [] | 16 gnunet | [] | 1 gnunet-gtk | [] [] [] | 5 gnutls | [] [] [] | 10 gold | [] | 4 gpe-aerial | [] [] [] | 18 gpe-beam | [] [] [] | 19 gpe-bluetooth | [] [] [] | 13 gpe-calendar | [] [] [] [] | 12 gpe-clock | [] [] [] [] [] | 28 gpe-conf | [] [] [] [] | 20 gpe-contacts | [] [] [] | 17 gpe-edit | [] [] [] | 12 gpe-filemanager | [] [] [] [] | 16 gpe-go | [] [] [] [] [] | 25 gpe-login | [] [] [] | 11 gpe-ownerinfo | [] [] [] [] [] | 25 gpe-package | [] [] [] | 13 gpe-sketchbook | [] [] [] | 20 gpe-su | [] [] [] [] [] | 30 gpe-taskmanager | [] [] [] [] [] | 29 gpe-timesheet | [] [] [] [] [] | 25 gpe-today | [] [] [] [] [] [] | 30 gpe-todo | [] [] [] [] | 17 gphoto2 | [] [] [] [] [] | 24 gprof | [] [] [] | 15 gpsdrive | [] [] [] | 11 gramadoir | [] [] [] | 11 grep | [] [] [] | 10 grub | [] [] [] | 14 gsasl | [] [] [] [] | 14 gss | [] [] [] | 11 gst-plugins-bad | [] [] [] [] | 26 gst-plugins-base | [] [] [] [] [] | 24 gst-plugins-good | [] [] [] [] | 24 gst-plugins-ugly | [] [] [] [] [] | 29 gstreamer | [] [] [] [] | 22 gtick | [] [] [] | 13 gtkam | [] [] [] | 20 gtkorphan | [] [] [] | 14 gtkspell | [] [] [] [] [] [] [] [] [] | 45 gutenprint | [] | 10 hello | [] [] [] [] [] [] | 21 help2man | [] [] | 7 hylafax | [] | 5 idutils | [] [] [] [] | 17 indent | [] [] [] [] [] [] | 30 iso_15924 | () [] () [] [] | 16 iso_3166 | [] [] () [] [] () [] [] [] () | 53 iso_3166_2 | () [] () [] | 9 iso_4217 | [] () [] [] () [] [] | 26 iso_639 | [] [] [] () [] () [] [] [] [] | 38 iso_639_3 | [] () | 8 jwhois | [] [] [] [] [] | 16 kbd | [] [] [] [] [] | 15 keytouch | [] [] [] | 16 keytouch-editor | [] [] [] | 14 keytouch-keyboa... | [] [] [] | 14 klavaro | [] | 11 latrine | [] [] [] | 10 ld | [] [] [] [] | 11 leafpad | [] [] [] [] [] [] | 33 libc | [] [] [] [] [] | 21 libexif | [] () | 7 libextractor | [] | 1 libgnutls | [] [] [] | 9 libgpewidget | [] [] [] | 14 libgpg-error | [] [] [] | 9 libgphoto2 | [] [] | 8 libgphoto2_port | [] [] [] [] | 14 libgsasl | [] [] [] | 13 libiconv | [] [] [] [] | 21 libidn | () [] [] | 11 lifelines | [] | 4 liferea | [] [] [] | 21 lilypond | [] | 7 linkdr | [] [] [] [] [] | 17 lordsawar | | 1 lprng | [] | 3 lynx | [] [] [] [] | 17 m4 | [] [] [] [] | 19 mailfromd | [] [] | 3 mailutils | [] | 5 make | [] [] [] [] | 21 man-db | [] [] [] | 8 man-db-manpages | | 4 minicom | [] [] | 16 mkisofs | [] [] | 9 myserver | | 0 nano | [] [] [] [] | 21 opcodes | [] [] [] | 11 parted | [] [] [] [] [] | 15 pies | [] [] | 3 popt | [] [] [] [] [] [] | 27 psmisc | [] [] | 11 pspp | | 4 pwdutils | [] [] | 6 radius | [] [] | 9 recode | [] [] [] [] | 28 rosegarden | () | 0 rpm | [] [] [] | 11 rush | [] [] | 4 sarg | | 1 screem | [] | 3 scrollkeeper | [] [] [] [] [] | 27 sed | [] [] [] [] [] | 30 sharutils | [] [] [] [] [] | 22 shishi | [] | 3 skencil | [] [] | 7 solfege | [] [] [] [] | 16 solfege-manual | [] | 8 soundtracker | [] [] [] | 9 sp | [] | 3 sysstat | [] [] | 15 tar | [] [] [] [] [] [] | 23 texinfo | [] [] [] [] [] | 17 tin | | 4 unicode-han-tra... | | 0 unicode-transla... | | 2 util-linux-ng | [] [] [] [] | 20 vice | () () | 1 vmm | [] | 4 vorbis-tools | [] | 6 wastesedge | | 2 wdiff | [] [] | 7 wget | [] [] [] [] [] | 26 wyslij-po | [] [] | 8 xchat | [] [] [] [] [] [] | 36 xdg-user-dirs | [] [] [] [] [] [] [] [] [] [] | 63 xkeyboard-config | [] [] [] | 22 +---------------------------------------------------+ 85 teams sv sw ta te tg th tr uk vi wa zh_CN zh_HK zh_TW 178 domains 119 1 3 3 0 10 65 51 155 17 98 7 41 2618 Some counters in the preceding matrix are higher than the number of visible blocks let us expect. This is because a few extra PO files are used for implementing regional variants of languages, or language dialects. For a PO file in the matrix above to be effective, the package to which it applies should also have been internationalized and distributed as such by its maintainer. There might be an observable lag between the mere existence a PO file and its wide availability in a distribution. If June 2010 seems to be old, you may fetch a more recent copy of this `ABOUT-NLS' file on most GNU archive sites. The most up-to-date matrix with full percentage details can be found at `http://translationproject.org/extra/matrix.html'. 1.5 Using `gettext' in new packages =================================== If you are writing a freely available program and want to internationalize it you are welcome to use GNU `gettext' in your package. Of course you have to respect the GNU Library General Public License which covers the use of the GNU `gettext' library. This means in particular that even non-free programs can use `libintl' as a shared library, whereas only free software can use `libintl' as a static library or use modified versions of `libintl'. Once the sources are changed appropriately and the setup can handle the use of `gettext' the only thing missing are the translations. The Free Translation Project is also available for packages which are not developed inside the GNU project. Therefore the information given above applies also for every other Free Software Project. Contact `coordinator@translationproject.org' to make the `.pot' files available to the translation teams. grub-2.14~git20250718.0e36779/INSTALL0000644000175000017500000003425515036447510013045 00000000000000-*- Text -*- This is the GRUB. Welcome. This file contains instructions for compiling and installing the GRUB. Where this document refers to packages names, they are named according to the Debian 11 package repositories. These packages can be found by searching https://packages.debian.org/. The Requirements ================ GRUB depends on some software packages installed into your system. If you don't have any of them, please obtain and install them before configuring the GRUB. * GCC 5.1.0 or later Experimental support for clang 8.0.0 or later (results in much bigger binaries) for i386, x86_64, arm (including thumb), arm64, mips(el), powerpc, sparc64 * GNU Make * GNU Bison 2.3 or later * GNU gettext * GNU binutils 2.9.1.0.23 or later * Flex 2.5.35 or later * pkg-config * GNU patch * Other standard GNU/Unix tools * a libc with large file support (e.g. glibc 2.1 or later) On GNU/Linux, you also need: * libdevmapper 1.02.34 or later (recommended) For optional grub-emu features, you need: * SDL (recommended) * libpciaccess (optional) To build GRUB's graphical terminal (gfxterm), you need: * FreeType 2.1.5 or later * GNU Unifont To build grub-mkfont the unicode fonts are required (xfonts-unifont package on Debian). If you use a development snapshot or want to hack on GRUB you may need the following. * Python 3 (NOTE: python 2.6 should still work, but it's not tested) * Autoconf 2.64 or later * Automake 1.14 or later Your distro may package cross-compiling toolchains such as the following incomplete list on Debian: gcc-aarch64-linux-gnu, gcc-arm-linux-gnueabihf, gcc-mips-linux-gnu, gcc-mipsel-linux-gnu, gcc-powerpc64-linux-gnu, gcc-riscv64-linux-gnu, gcc-sparc64-linux-gnu, mingw-w64 and mingw-w64-tools. More cross compiling toolchains can be found at the following trusted sites: * https://mirrors.kernel.org/pub/tools/crosstool/ * https://toolchains.bootlin.com/ Prerequisites for make-check: * qemu, specifically the binary "qemu-system-ARCH" where ARCH is the architecture GRUB has been built for; the "qemu-system" package on Debian will install all needed qemu architectures * OVMF, for EFI platforms (packages ovmf, ovmf-ia32, qemu-efi-arm, and qemu-efi-aarch64) * OpenBIOS, for ieee1275 platforms (packages openbios-ppc and openbios-sparc) * xorriso 1.2.9 or later, for grub-mkrescue and grub-shell * wamerican, for grub-fs-tester * mtools, FAT tools for EFI platforms * xfonts-unifont, for the functional tests * swtpm-tools and tpm2-tools, for TPM2 key protector tests * If running a Linux kernel the following modules must be loaded: - fuse, loop - btrfs, erofs, ext4, f2fs, fat, hfs, hfsplus, jfs, mac-roman, minix, nilfs2, reiserfs, udf, xfs - On newer kernels, the exfat kernel modules may be used instead of the exfat FUSE filesystem * The following are Debian named packages required mostly for the full suite of filesystem testing (but some are needed by other tests as well): - btrfs-progs, dosfstools, e2fsprogs, erofs-utils, exfatprogs, exfat-fuse, f2fs-tools, genromfs, hfsprogs, jfsutils, nilfs-tools, ntfs-3g, reiserfsprogs, squashfs-tools, reiserfsprogs, udftools, xfsprogs, zfs-fuse - exfat-fuse, if not using the exfat kernel module - gzip, lzop, xz-utils - attr, cpio, g++, gawk, parted, recode, tar, util-linux Note that `make check' will run and many tests may complete successfully with only a subset of these prerequisites. However, some tests may be skipped or fail due to missing prerequisites. To build the documentation you'll need: * texinfo, for the info and html documentation * texlive, for building the dvi and pdf documentation (optional) To use the gdb_grub GDB script you'll need: * readelf (binutils package) * objdump (binutils package) * GNU Debugger > 7, built with python support (gdb package) * Python >= 3.5 (python3 package) Configuring the GRUB ==================== The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, a file `config.cache' that saves the results of its tests to speed up reconfiguring, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.ac' is used to create `configure' by a program called `autoconf'. You only need `configure.in' if you want to change it or regenerate `configure' using a newer version of `autoconf'. Building the GRUB ================= The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code. 2. Skip this and following step if you use release tarball and proceed to step 4. If you want translations type `./linguas.sh'. 3. Type `./bootstrap'. The autogen.sh (called by bootstrap) uses python. By default autodetect it, but it can be overridden by setting the PYTHON variable. 4. Type `./configure' to configure the package for your system. If you're using `csh' on an old version of System V, you might need to type `sh ./configure' instead to prevent `csh' from trying to execute `configure' itself. Running `configure' takes awhile. While running, it prints some messages telling which features it is checking for. 6. Type `make' to compile the package. 7. Optionally, type `make check' to run any self-tests that come with the package. Note that many of the tests require root privileges in order to run. 8. Type `make install' to install the programs and any data files and documentation. 9. Type `make html' or `make pdf' to generate the html or pdf documentation. Note, these are not built by default. 10. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. Cross-compiling the GRUB ======================== GRUB defines 3 platforms: - "Build" is the one which build systems runs on. - "Host" is where you execute GRUB utils. - "Target" is where GRUB itself runs. For grub-emu host and target must be the same but may differ from build. If build and host are different make check isn't available. If build and host are different man pages are not generated. As an example imagine you have a build system running on FreeBSD on sparc which prepares packages for developers running amd64 GNU/Linux laptop and they need to make images for ARM board running U-boot. In this case: build=sparc64-freebsd host=amd64-linux-gnu target=arm-uboot For this example the configure line might look like (more details below) (some options are optional and included here for completeness but some rarely used options are omitted): ./configure --build=sparc64-freebsd --host=x86_64-linux-gnu \ --target=arm-linux-gnueabihf --with-platform=efi \ BUILD_CC=gcc BUILD_PKG_CONFIG=pkg-config \ HOST_CC=x86_64-linux-gnu-gcc HOST_CFLAGS='-g -O2' \ PKG_CONFIG=x86_64-linux-gnu-pkg-config TARGET_CC=arm-linux-gnueabihf-gcc \ TARGET_CFLAGS='-Os -march=armv8.3-a' TARGET_CCASFLAGS='-march=armv8.3-a' \ TARGET_OBJCOPY=arm-linux-gnueabihf-objcopy \ TARGET_STRIP=arm-linux-gnueabihf-strip TARGET_NM=arm-linux-gnueabihf-nm \ TARGET_RANLIB=arm-linux-gnueabihf-ranlib LEX=flex Note, that the autoconf 2.65 manual states that when using the --host argument to configure, the --build argument should be specified as well. Not sending --build, enters a compatibility mode that will be removed in the future. Normally, for building a GRUB on amd64 with tools to run on amd64 to generate images to run on ARM, using your Linux distribution's packaged cross compiler, the following would suffice: ./configure --target=arm-linux-gnueabihf --with-platform=efi You need to use following options to specify tools and platforms. For minimum version look at prerequisites. All tools not mentioned in this section under corresponding platform are not needed for the platform in question. - For build 1. --build= to autoconf name of build. 2. BUILD_CC= to gcc able to compile for build. This is used, for example, to compile build-gentrigtables which is then run to generate sin and cos tables. 3. BUILD_CFLAGS= for C options for build. 4. BUILD_CPPFLAGS= for C preprocessor options for build. 5. BUILD_LDFLAGS= for linker options for build. 6. BUILD_PKG_CONFIG= for pkg-config for build (optional). - For host 1. --host= to autoconf name of host. 2. CC= for gcc able to compile for host. 3. CFLAGS= for C options for host. 4. HOST_CC= for gcc able to compile for host. 5. HOST_CFLAGS= for C options for host. 6. HOST_CPPFLAGS= for C preprocessor options for host. 7. HOST_LDFLAGS= for linker options for host. 8. PKG_CONFIG= for pkg-config for host (optional). 9. Libdevmapper if any must be in standard linker folders (-ldevmapper) (optional). 10. Libfuse if any must be in standard linker folders (-lfuse) (optional). 11. Libzfs if any must be in standard linker folders (-lzfs) (optional). 12. Liblzma if any must be in standard linker folders (-llzma) (optional). Note: The HOST_* variables override not prefixed variables. - For target 1. --target= to autoconf cpu name of target. 2. --with-platform to choose firmware. 3. TARGET_CC= for gcc able to compile for target. 4. TARGET_CFLAGS= for C options for target. 5. TARGET_CPPFLAGS= for C preprocessor options for target. 6. TARGET_CCASFLAGS= for assembler options for target. 7. TARGET_LDFLAGS= for linker options for target. 8. TARGET_OBJCOPY= for objcopy for target. 9. TARGET_STRIP= for strip for target. 10. TARGET_NM= for nm for target. 11. TARGET_RANLIB= for ranlib for target. Note: If the TARGET_* variables are not specified then they will default to be the same as the host variables. If host variables are not specified then the TARGET_* variables will default to be the same as not prefixed variables. - Additionally for emu, for host and target. 1. SDL is looked for in standard linker directories (-lSDL) (optional) 2. libpciaccess is looked for in standard linker directories (-lpciaccess) (optional) - Platform-agnostic tools and data. 1. make is the tool you execute after ./configure. 2. Bison is specified in YACC= variable 3. Flex is specified in LEX= variable 4. GNU unifont and Djvu sans are looked for in standard directories. Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. Installation Names ================== By default, `make install' will install the package's files in `/usr/local/bin', `/usr/local/man', etc. You can specify an installation prefix by giving `configure' the option `--prefix=PATH'. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you give `configure' the option `--exec-prefix=PATH', the package will use PATH as the prefix for installing programs and libraries. Documentation and other data files will still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=PATH' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Please note, however, that the GRUB knows where it is located in the filesystem. If you have installed it in an unusual location, the system might not work properly, or at all. The chief utility of these options for the GRUB is to allow you to "install" in some alternate location, and then copy these to the actual root filesystem later. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Operation Controls ================== `configure' recognizes the following options to control how it operates. `--cache-file=FILE' Use and save the results of the tests in FILE instead of `./config.cache'. Set FILE to `/dev/null' to disable caching, for debugging `configure'. `--help' Print a summary of the options to `configure', and exit. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `--version' Print the version of Autoconf used to generate the `configure' script, and exit. grub-2.14~git20250718.0e36779/ChangeLog0000644000175000017500000422746515036452572013605 000000000000002025-07-11 Vladimir Serbinenko docs: Write how to import new libgcrypt Reviewed-by: Daniel Kiper 2025-07-11 Vladimir Serbinenko libgcrypt: Fix a memory leak Fixes: CID 468917 Reviewed-by: Daniel Kiper 2025-07-11 Vladimir Serbinenko libgcrypt: Don't use 64-bit division on platforms where it's slow Reviewed-by: Daniel Kiper util/import_gcry: Fix pylint warnings Reviewed-by: Daniel Kiper util/import_gcry: Make compatible with Python 3.4 Reviewed-by: Daniel Kiper libgcrypt: Import blake family of hashes Reviewed-by: Daniel Kiper 2025-07-11 Vladimir Serbinenko libgcrypt: Ignore sign-compare warnings libgcrypt itself is compiled with -Wno-sign-compare. Do the same for consistency. Reviewed-by: Daniel Kiper 2025-07-11 Vladimir Serbinenko libgcrypt: Remove now unneeded compilation flag HAVE_STRTOUL is now defined in stdlib.h. Include it in g10lib.h rather than defining on command line. Reviewed-by: Daniel Kiper 2025-07-11 Vladimir Serbinenko libgcrypt: Fix Coverity warnings Reviewed-by: Daniel Kiper 2025-07-11 Vladimir Serbinenko keccak: Disable acceleration with SSE asm Libgcrypt code assumes that on x64 all SSE registers are fair game. While it's true that CPUs in question support it, we disable it in our compilation options. Disable the offending optimization. Reviewed-by: Daniel Kiper 2025-07-11 Vladimir Serbinenko tests: Add DSA and RSA SEXP tests This allows us to test purely the integration of the implementation of DSA and RSA from libgcrypt without concerning with additional code. Reviewed-by: Daniel Kiper 2025-07-11 Vladimir Serbinenko libgcrypt: Adjust import script, definitions and API users for libgcrypt 1.11 This patches modifies the GRUB-libgcrypt API to match new libgcrypt 1.11. Reviewed-by: Daniel Kiper 2025-07-11 Vladimir Serbinenko b64dec: Add harness for compilation in GRUB environment Reviewed-by: Daniel Kiper 2025-07-11 Vladimir Serbinenko b64dec: Import b64dec from gpg-error Imported from libgpg-error 1.51. Reviewed-by: Daniel Kiper 2025-07-11 Vladimir Serbinenko libgcrypt: Import libgcrypt 1.11 We currently use an old version of libgcrypt which results in us having fewer ciphers and missing on many other improvements. Reviewed-by: Daniel Kiper 2025-07-11 Mate Kukri loader/efi/linux: Use shim loader image handle where available Not reusing these handles will result in image measurements showing up twice in the event log. On the occasion add missing grub_free() call. Reviewed-by: Daniel Kiper 2025-07-11 Mate Kukri loader/efi/chainloader: Use shim loader image handle where available Not reusing these handles will result in image measurements showing up twice in the event log. Reviewed-by: Daniel Kiper 2025-07-11 Mate Kukri efi/sb: Add API for retrieving shim loader image handles Not reusing these handles will result in image measurements showing up twice in the event log. Reviewed-by: Daniel Kiper 2025-07-11 Mate Kukri efi/sb: Add support for the shim loader protocol Use loader protocol for image verification where available, otherwise fall back to the old shim lock protocol. Reviewed-by: Daniel Kiper 2025-07-11 Julian Andres Klode efi: Provide wrappers for load_image, start_image and unload_image These can be used to register a different implementation later, for example, when shim provides a protocol with those functions. Reviewed-by: Daniel Kiper 2025-07-11 Frediano Ziglio loader/arm64/xen_boot: Consider alignment calling grub_arch_efi_linux_boot_image() The Xen image is loaded with an alignment, not always at "start". Reviewed-by: Daniel Kiper Reviewed-by: Sudhakar Kuppusamy 2025-07-11 Frediano Ziglio loader/arm64/xen_boot: Use bool instead of int More readable, could consume less space. Reviewed-by: Sudhakar Kuppusamy Reviewed-by: Daniel Kiper 2025-07-11 Frediano Ziglio loader/arm64/xen_boot: Remove correctly all modules loaded by xen_module command We need to use FOR_LIST_ELEMENTS_SAFE() instead of FOR_LIST_ELEMENTS() as single_binary_unload(), called during the loop, is changing the list using grub_list_remove(). Given the environment probably the old code simply removed only the first module on the list not freeing all the others. Reviewed-by: Daniel Kiper Reviewed-by: Sudhakar Kuppusamy 2025-07-11 Gary Lin dl: Fix grub_dl_is_persistent() for emu When attempting to build grub-emu the compilation failed with the following error message: include/grub/dl.h: In function ‘grub_dl_is_persistent’: include/grub/dl.h:262:1: error: no return statement in function returning non-void [-Werror=return-type] To avoid the error make the function always return 0. Fixes: ba8eadde6be1 (dl: Provide a fake grub_dl_set_persistent() and grub_dl_is_persistent() for the emu target) Cc: Daniel Axtens Cc: Sudhakar Kuppusamy Reviewed-by: Sudhakar Kuppusamy Reviewed-by: Daniel Kiper 2025-06-26 Lidong Chen loader/i386/pc/linux: Fix resource leak In grub_cmd_initrd(), memory is allocated for variable initrd_ctx before calling grub_relocator_alloc_chunk_align_safe(). When the function call fails, initrd_ctx should be freed before exiting grub_cmd_initrd(). Fixes: CID 473852 Reviewed-by: Sudhakar Kuppusamy Reviewed-by: Daniel Kiper 2025-06-26 Adriano Cordova loader/efi/linux: Unload previous Linux kernel/initrd before updating kernel size Unload previous Linux kernel/initrd before updating the global variable kernel_size. Otherwise the previous Linux kernel gets deallocated with the kernel_size of the Linux kernel that is being currently loaded. Reviewed-by: Daniel Kiper 2025-06-26 Frediano Ziglio loader/efi/linux: Correctly terminate load_options member If a simple string for arguments are passed it should be NUL terminated. This is true for other code but not for "linux" command. Reviewed-by: Daniel Kiper 2025-06-26 Frediano Ziglio loader/efi/linux: Use sizeof() instead of constant This is more consistent with the above code using sizeof(grub_efi_char16_t). Reviewed-by: Daniel Kiper 2025-06-26 Frediano Ziglio loader/efi/linux: Use proper type for len variable Although the length should not exceed 2^31 grub_size_t is more suitable for that variable. len is used to compute the size of buffers which in C is a size_t, not a int. It is used for GRUB_EFI_BYTES_TO_PAGES which expects unsigned values. It is assigned to load_options_size which is unsigned, not signed. Reviewed-by: Daniel Kiper 2025-06-26 Frediano Ziglio loader/efi/linux: Do not pass excessive size for source string The size passed to grub_utf8_to_utf16() for the source string is used as a limit for the string if NUL character is not encountered. However, len, which is "strlen(src) * 2 + 2" is surely greater than strlen(src). Pass the exact correct length. Reviewed-by: Daniel Kiper 2025-06-26 Frediano Ziglio loader/efi/linux: Remove useless assignment If the following allocation fails this would leave load_options NULL while load_options_size not valid. If the allocation succeed load_options_size is overwritten. Reviewed-by: Daniel Kiper 2025-06-26 Frediano Ziglio include/grub/charset.h: Update documentation (grub_size_t) -1 is never returned, the function always return a not negative values. This is important for overflows considerations. Reviewed-by: Daniel Kiper 2025-06-26 Lidong Chen Revert "lzma: Make sure we don't dereference past array" Commit 40e261b89b71 (lib/LzmaEnc: Validate "len" before subtracting) ensures that the variable len is at least 2. As a result, GetLenToPosState(len) never returns a value greater than or equal to kNumLenToPosStates, making the changes introduced in the commit 16c0dbf4bc6a (lzma: Make sure we don't dereference past array) unreachable and no longer necessary. This reverts commit 16c0dbf4bc6a (lzma: Make sure we don't dereference past array). Fixes: CID 481982 Reviewed-by: Daniel Kiper 2025-06-26 Andrew Hamilton tests/util/grub-shell: Correct netboot and file_filter test failure Correct a test failure in netboot_test and file_filter_test caused by an issue cleaning up the tmp directory created for netboot. Netboot creates a subdirectory in the tmp folder that causes the rmdir to fail - so cleanup the subdirectory first. Fixes: 1d59f39b5f1b (tests/util/grub-shell: Remove the work directory on successful run and debug is not on) Tested-by: Leo Sandoval Reviewed-by: Daniel Kiper 2025-06-26 Lidong Chen normal/charset: Fix underflow and overflow in loop init In bidi_line_wrap(), "kk - 1" in the for loop init, "i = kk - 1", underflows when "kk" (unsigned int) is 0. Assigning the result of "kk - 1" to signed int "i" may cause overflow. To address both issues, cast "kk" to a signed type before subtraction to ensure safe arithmetic and assignment. Fixed: CID 473874 Reviewed-by: Daniel Kiper Reviewed-by: Sudhakar Kuppusamy 2025-06-26 Daniel Axtens dl: Provide a fake grub_dl_set_persistent() and grub_dl_is_persistent() for the emu target Trying to start grub-emu with a module that calls grub_dl_set_persistent() and grub_dl_is_persistent() will crash because grub-emu fakes modules and passes NULL to the module init function. Provide an empty function for the emu case. Fixes: ee7808e2197c (dl: Add support for persistent modules) Reviewed-by: Stefan Berger Reviewed-by: Avnish Chouhan Reviewed-by: Daniel Kiper 2025-06-26 Andrew Hamilton util/grub-protect: Correct uninit "err" variable In function protect_tpm2_export_tpm2key(), the "err" variable is uninitialized in the normal (error free) path, so ensure this defaults to GRUB_ERR_NONE. This causes the GRUB build to fail with clang (observed with clang-14). Fixes: 5934bf51c (util/grub-protect: Support NV index mode) Reviewed-by: Sudhakar Kuppusamy Reviewed-by: Daniel Kiper 2025-06-26 Lidong Chen gnulib: Bring back the fix for resolving unused variable issue This patch resolved a minor issue spotted by Coverity: a983d36bd917 (gnulib/regexec: Resolve unused variable) But, it was removed by the Gnulib update: 2b7902459803 (Update gnulib version and drop most gnulib patches) It caused Coverity to continue to flag the issue. Daniel Kiper suggested to bring back the patch a983d36bd917 (gnulib/regexec: Resolve unused variable). Fixes: CID 292459 Reviewed-by: Daniel Kiper 2025-06-26 Andrew Hamilton gnulib: Add patch to allow GRUB w/GCC-15 compile Pull in Gnulib fix to allow lib/base64.c to compile using GCC 15 or newer. Pulled from Gnulib commit 25df6dc425 (Silence some -Wunterminated-string-initialization warnings.) GCC 15 adds a new compiler warning "-Wunterminated-string-initialization" that will trigger what is considered a false-positive in lib/base64.c as this array is not treated as a string but an array of characters so the lack of NUL string terminator is expected. GCC team has added ability to flag such instances of arrays that the compiler may think are strings as "nonstring" arrays to avoid this warning: __attribute__((nonstring)). Fixes: https://savannah.gnu.org/bugs/?66470 Reviewed-by: Sudhakar Kuppusamy Reviewed-by: Daniel Kiper 2025-06-17 Alec Brown gnulib/regexec: Fix resource leak In the function merge_state_with_log(), memory is allocated for the variable next_nodes when creating a union of the variables table_nodes and log_nodes. However, if next_state->entrance_nodes is NULL, then table_nodes becomes NULL and we still allocate memory to copy the content of log_nodes. This can cause a resource leak since we only free the memory for next_nodes if table_nodes isn't NULL. To prevent this, we need to check that next_state->entrance_nodes isn't NULL before allocating memory for the union. This issue has been fixed in the latest version of gnulib and I've backported this change to maintain consistency. This issue was found by a Coverity scan of GRUB2 under the CID 473887. Fixes: CID 473887 Reviewed-by: Daniel Kiper 2025-06-17 Alec Brown gnulib/regcomp: Fix resource leak In the functions create_initial_state() and calc_eclosure_iter(), memory is allocated for the elems member of a re_node_set structure but that memory isn't freed on error. Before returning an error, a call to re_node_set_free() should be made to prevent the resource leak. This issue has been fixed in the latest version of gnulib and I've backported this change to maintain consistency. This issue was found by a Coverity scan of GRUB2 under the following CIDs: 473869, 473888. Fixes: CID 473869 Fixes: CID 473888 Reviewed-by: Daniel Kiper 2025-06-17 Gary Lin tests/tpm2_key_protector_test: Add tests for SHA-384 PCR bank Add a few more tests to seal and unseal the key with the SHA-384 PCR bank instead of the default SHA-256 PCR bank. Reviewed-by: Sudhakar Kuppusamy Reviewed-by: Stefan Berger Reviewed-by: Daniel Kiper 2025-06-17 Gary Lin tpm2_key_protector: Dump the PCR bank for key unsealing TPM 2.0 Key File format stores the PCR selection in the parameters for TPM2_PolicyPCR and it already contains the selected PCR bank. Currently, tpm2_key_protector dumped the PCR bank specified by the --bank option, and it may not be the PCR bank for key unsealing. To dump the real PCR bank for key unsealing, this commit records the PCR bank used by TPM2_PolicyPCR and dumps PCR values from that bank when necessary. Reviewed-by: Stefan Berger Reviewed-by: Sudhakar Kuppusamy Reviewed-by: Daniel Kiper 2025-06-17 Gary Lin util/grub-protect: Fix the hash algorithm of PCR digest For tpm2_key_protector and grub-protect, SHA-256 is chosen as the hash algorithm for the TPM session. However, grub-protect mistakenly used the hash algorithm of the PCR bank to calculate PCR digest. If the user chose a PCR bank other than SHA-256, grub-protect created a non-SHA-256 PCR digest to seal the key. But, tpm2_key_protector expects a SHA-256 PCR digest to the TPM unsealing session, so it would fail due to digest mismatch. This commit fixes the hash algorithm of PCR digest in grub-protect to avoid the potential unsealing failure. Fixes: https://github.com/lcp/grub2/issues/4 Reviewed-by: Stefan Berger Reviewed-by: Sudhakar Kuppusamy Reviewed-by: Daniel Kiper 2025-06-17 Andrew Hamilton build: Add new header files to dist to allow building from tar Several new header files have been added to GRUB which need to be manually added to the dist archive. This allows building from the tar archive created by "make dist". Reviewed-by: Daniel Kiper 2025-06-17 Andrew Hamilton build: Remove extra_deps.lst from EXTRA_DIST This file is auto-generated based on the selected platform and should not be included in the source tarball. Fixes: 6744840b (build: Track explicit module dependencies in Makefile.core.def) Reviewed-by: Daniel Kiper 2025-06-17 Lidong Chen lib/LzmaEnc: Validate "len" before subtracting In LzmaEnc_CodeOneBlock(), both GetOptimumFast() and GetOptimum() returns a value of greater or equal to 1, which is assigned to "len". But since LZMA_MATCH_LEN_MIN == 2, "len" should be validated before performing "len - LZMA_MATCH_LEN_MIN" to avoid underflow when "len" equals to 1. Fixes: CID 51508 Reviewed-by: Daniel Kiper Reviewed-by: Sudhakar Kuppusamy 2025-06-12 Lidong Chen osdep/unix/hostdisk: Fix signed integer overflow The potential overflow issue arises at "size += ret;" because "size" is of type ssize_t (signed) while "len" is size_t (unsigned). Repeatedly adding read sizes, "ret", to "size" can potentially exceed the maximum value of ssize_t, causing it to overflow into a negative or incorrect value. The fix is to ensure "len" is within the range of SSIZE_MAX. Fixes: CID 473850 Fixes: CID 473863 Reviewed-by: Daniel Kiper 2025-05-29 Egor Ignatov disk/luks2: Add attempting to decrypt message to align with luks and geli modules Reviewed-by: Daniel Kiper 2025-05-29 Renaud Métrich osdep/linux/getroot: Detect DDF container similar to IMSM Similarly to Intel IMSM, there are BIOS and UEFI implementations that support DDF containers natively. DDF and IMSM are very similar in handling, especially these should not be considered as RAID abstraction. This fixes the requirement of having a device map when probing DDF containers. Fixes: https://issues.redhat.com/browse/RHEL-44336 Reviewed-by: Daniel Kiper 2025-05-29 Andrew Hamilton fs/fshelp: Avoid possible NULL pointer deference Avoid attempting to defererence a NULL pointer to call read_symlink() when the given filesystem does not provide a read_symlink() function. This could be triggered if the calling filesystem had a file marked as a symlink. This appears possible for HFS and was observed during fuzzing of NTFS. Reviewed-by: Vladimir Serbinenko Reviewed-by: Daniel Kiper 2025-05-29 Andrew Hamilton fs/ntfs: Correct possible infinite loops/hangs Correct several infinite loops/hangs found during fuzzing. The issues fixed here could occur if certain specific malformed NTFS file systems were presented to GRUB. Currently, GRUB does not allow NTFS file system access when lockdown mode is enforced, so these should be of minimal impact. The changes made in this commit generally correct issues such as attempting to iterate through a buffer using a length read from the NTFS file system without confirming the length is larger than 0. Reviewed-by: Daniel Kiper 2025-05-29 Andrew Hamilton fs/ntfs: Correct possible access violations Correct several memory access violations found during fuzzing. The issues fixed here could occur if certain specific malformed NTFS file systems were presented to GRUB. Currently, GRUB does not allow NTFS file system access when lockdown mode is enforced, so these should be of minimal impact. The changes made in this commit generally correct issues where pointers into data buffers were being calculated using lengths read from the NTFS file system without sufficient bounds/sanity checking; or attempting to access elements of a structure to free them, when the structure pointer is NULL. Reviewed-by: Daniel Kiper 2025-05-29 Andrew Hamilton fs/ntfs: Correct attribute vs attribute list validation Correct ntfs_test test failures around attempting to validate attribute list entries as attributes. The NTFS code uses common logic in some places to parse both attributes and attribute_lists which complicates validation. Attribute lists contain different headers including a different size of the length field (2 bytes) at offset 4 instead of the 4 byte length field used in attributes at offset 4. There are other differences as well, but attempting to validate attribute list types using attribute header validation was causing failure of the NTFS test suite. This change restores some of the validation logic which may be shared between attributes and attribute lists to be closer to the original logic prior to fixes for previous CVEs. A following commit will address some of the implications of removing this validation logic by correcting some fuzzer failures (some which are exposed by removing the validation in some of the cases). Fixes: 067b6d225 (fs/ntfs: Implement attribute verification) Reviewed-by: Daniel Kiper 2025-05-29 Andrew Hamilton fs/ntfs: Correct regression with run list calculation Correct ntfs_test test failures around attempting to validate attribute run list values. The calculation was incorrect for the "curr" variable. With previous calculation, some file systems would fail validation despite being well-formed and valid. This was caused by incrementing "curr" by min_size which included both the (already accounted for) min_size as well as the size of the run list. Correct by making a new variable "run_size" to denote the current run list size to increment both "curr" and "min_size" separately. Fixes: 067b6d225 (fs/ntfs: Implement attribute verification) Reviewed-by: Daniel Kiper 2025-05-29 Shreenidhi Shedi lib/envblk: Ignore empty new lines while parsing env files Environment files may contain empty lines, which should be ignored during parsing. Currently, these lines are not skipped and resulting in incorrect behavior. This patch adds a check to skip empty lines along with those starting with "#". Reviewed-by: Alexey Makhalov Reviewed-by: Daniel Kiper 2025-05-29 Glenn Washburn fs/zfs: Fix another memory leak in ZFS code Commit b66c6f918 (fs/zfs: Fix a number of memory leaks in ZFS code) fixes many of the same leaks detected in bug #63846 except one, which is fixed here. Fixes: https://savannah.gnu.org/bugs/?63846 Fixes: b66c6f918 (fs/zfs: Fix a number of memory leaks in ZFS code) Reviewed-by: Daniel Kiper 2025-05-29 Glenn Washburn tests: Disable gfxterm_menu and cmdline_cat tests Those tests fail depending on the version of unifont. As we don't distribute our own unifont it fails for most users. Disable them so that they don't mask real failures. They can be reinstated once we solve unifont problem. Reviewed-by: Daniel Kiper 2025-05-06 Michael Chang cryptocheck: Add --quiet option The option can be used to suppress output if we only want to test the return value of the command. Also, mention this option in the documentation. Reviewed-by: Daniel Kiper 2025-05-06 Maxim Suhanov disk/cryptodisk: Wipe the passphrase from memory Switching to another EFI boot application while there are secrets in RAM is dangerous, because not all firmware is wiping memory on free. To reduce the attack surface, wipe the passphrase acquired when unlocking an encrypted volume. Reviewed-by: Daniel Kiper 2025-05-06 Maxim Suhanov disk/cryptodisk: Add the "erase secrets" function This commit adds the grub_cryptodisk_erasesecrets() function to wipe master keys from all cryptodisks. This function is EFI-only. Since there is no easy way to "force unmount" a given encrypted disk, this function renders all mounted cryptodisks unusable. An attempt to read them will return garbage. This is why this function must be used in "no way back" conditions. Currently, it is used when unloading the cryptodisk module and when performing the "exit" command (it is often used to switch to the next EFI application). This function is not called when performing the "chainloader" command, because the callee may return to GRUB. For this reason, users are encouraged to use "exit" instead of "chainloader" to execute third-party boot applications. This function does not guarantee that all secrets are wiped from RAM. Console output, chunks from disk read requests and other may remain. This function does not clear the IV prefix and rekey key for geli disks. Also, this commit adds the relevant documentation improvements. Reviewed-by: Daniel Kiper 2025-05-06 Maxim Suhanov docs: Document available crypto disks checks Document the --cryptodisk-only argument. Also, document the "cryptocheck" command invoked when that argument is processed. Reviewed-by: Daniel Kiper 2025-05-06 Maxim Suhanov commands/search: Add the diskfilter support When the --cryptodisk-only argument is given, also check the target device using the "cryptocheck" command, if available. This extends the checks to common layouts like LVM-on-LUKS, so the --cryptodisk-only argument transparently handles such setups. Reviewed-by: Daniel Kiper 2025-05-06 Maxim Suhanov disk/diskfilter: Introduce the "cryptocheck" command This command examines a given diskfilter device, e.g., an LVM disk, and checks if underlying disks, physical volumes, are cryptodisks, e.g., LUKS disks, this layout is called "LVM-on-LUKS". The return value is 0 when all underlying disks (of a given device) are cryptodisks (1 if at least one disk is unencrypted or in an unknown state). Users are encouraged to include the relevant check before loading anything from an LVM disk that is supposed to be encrypted. This further supports the CLI authentication, blocking bypass attempts when booting from an encrypted LVM disk. Reviewed-by: Daniel Kiper 2025-05-06 Maxim Suhanov commands/search: Introduce the --cryptodisk-only argument This allows users to restrict the "search" command's scope to encrypted disks only. Typically, this command is used to "rebase" $root and $prefix before loading additional configuration files via "source" or "configfile". Unfortunately, this leads to security problems, like CVE-2023-4001, when an unexpected, attacker-controlled device is chosen by the "search" command. The --cryptodisk-only argument allows users to ensure that the file system picked is encrypted. This feature supports the CLI authentication, blocking bypass attempts. Reviewed-by: Daniel Kiper 2025-05-06 Maxim Suhanov kern/rescue_reader: Block the rescue mode until the CLI authentication This further mitigates potential misuse of the CLI after the root device has been successfully unlocked via TPM. Fixes: CVE-2025-4382 Reviewed-by: Daniel Kiper 2025-04-23 Eric Sandeen fs/xfs: Fix large extent counters incompat feature support When large extent counter / NREXT64 support was added to GRUB, it missed a couple of direct reads of nextents which need to be changed to the new NREXT64-aware helper as well. Without this, we'll have mis-reads of some directories with this feature enabled. The large extent counter fix likely raced on merge with commit 07318ee7e (fs/xfs: Fix XFS directory extent parsing) which added the new direct nextents reads just prior, causing this issue. Fixes: aa7c1322671e (fs/xfs: Add large extent counters incompat feature support) Reviewed-by: Anthony Iliopoulos Reviewed-by: Jon DeVree Reviewed-by: Vladimir Serbinenko Reviewed-by: Daniel Kiper 2025-04-10 Egor Ignatov util/grub-install: Include raid5rec module for RAID 4 as well RAID 4 requires the same recovery module as RAID 5. Extend the condition to cover both RAID levels. Reviewed-by: Daniel Kiper 2025-04-10 Vladimir Serbinenko loader/ia64/efi/linux: Reset grub_errno on failure to allocate The code goes on to allocate memory in another region on failure, hence it should discard the error. Reviewed-by: Daniel Kiper 2025-04-10 Vladimir Serbinenko lib/datetime: Specify license in emu module Other platforms specify license in platform-specific files but corresponding code for emu is in kernel, so datetime ends up without license section. Reviewed-by: Daniel Kiper 2025-04-10 Vladimir Serbinenko configure: Add -mno-relax on riscv* Without this option compiler sometimes emits R_RISCV_ALIGN relocs. Unlike other relocs this one requires the linker to do NOP deletions and we can't ignore them. Just instruct compiler not to emit them. Reviewed-by: Daniel Kiper 2025-04-10 Gary Lin docs: Document the long options of tpm2_key_protect_init Add the long options of tpm2_key_protect_init along with the short options. Reviewed-by: Daniel Kiper 2025-04-10 Gary Lin INSTALL: Document the packages needed for TPM2 key protector tests The TPM2 key protector tests require two external packages: swtpm-tools and tpm2-tools. Add those two packages to the INSTALL file to inform the user to install those packages before starting the TPM2 key protector tests. Reviewed-by: Daniel Kiper Reviewed-by: Stefan Berger 2025-04-10 Gary Lin docs: Update NV index mode of TPM2 key protector This commit updates the NV index mode section and the grub-protect section to reflect the recent changes in TPM2 key protector and grub-protect. Reviewed-by: Daniel Kiper 2025-04-10 Gary Lin tests/tpm2_key_protector_test: Add more NV index mode tests Two more NV index test cases are added to test key sealing and unsealing with the NV index handle 0x1000000. Reviewed-by: Stefan Berger Reviewed-by: Daniel Kiper 2025-04-10 Gary Lin tests/tpm2_key_protector_test: Reset "ret" on fail Reset "ret" to 0 when a test case fails so that the other test cases could continue. Also set the exit status to 1 when encountering a failure to reflect the test result. Reviewed-by: Stefan Berger Reviewed-by: Daniel Kiper 2025-04-10 Gary Lin tests/tpm2_key_protector_test: Simplify the NV index mode test Since grub-protect already supports NV index mode, tpm2_seal_nv() is replaced with one grub-protect command to simplify the test script. "tpm2_evictcontrol" is also replaced with "grub-protect --tpm2-evict". Reviewed-by: Stefan Berger Reviewed-by: Daniel Kiper 2025-04-10 Gary Lin util/grub-protect: Support NV index mode This commit implements the missing NV index mode support in grub-protect. NV index mode stores the sealed key in the TPM non-volatile memory (NVRAM) instead of a file. There are two supported types of TPM handles. 1. Persistent handle (0x81000000~0x81FFFFFF) Only the raw format is supported due to the limitation of persistent handles. This grub-protect command seals the key into the persistent handle 0x81000000. # grub-protect \ --protector=tpm2 \ --action=add \ --tpm2-bank=sha256 \ --tpm2-pcrs=7,11 \ --tpm2-keyfile=luks-key \ --tpm2-nvindex=0x81000000 2. NV index handle (0x1000000~0x1FFFFFF) Both TPM 2.0 Key File format and the raw format are supported by NV index handles. Here is the grub-protect command to seal the key in TPM 2.0 Key File format into the NV index handle 0x1000000. # grub-protect \ --protector=tpm2 \ --action=add \ --tpm2key \ --tpm2-bank=sha256 \ --tpm2-pcrs=7,11 \ --tpm2-keyfile=luks-key \ --tpm2-nvindex=0x1000000 Besides the "add" action, the corresponding "remove" action is also introduced. To remove the data from a persistent or NV index handle, just use "--tpm2-nvindex=HANDLE" combining with "--tpm2-evict". This sample command removes the data from the NV index handle 0x1000000. # grub-protect \ --protector=tpm2 \ --action=remove \ --tpm2-evict \ --tpm2-nvindex=0x1000000 Also set and check the boolean variables with true/false instead of 1/0. Reviewed-by: Stefan Berger Reviewed-by: Daniel Kiper 2025-04-10 Gary Lin tpm2_key_protector: Support NV index handles Previously, NV index mode only supported persistent handles which are only for TPM objects. On the other hand, the "NV index" handle allows the user-defined data, so it can be an alternative to the key file and support TPM 2.0 Key File format immediately. The following tpm2-tools commands store the given key file, sealed.tpm, in either TPM 2.0 Key File format or the raw format into the NV index handle 0x1000000. # tpm2_nvdefine -C o \ -a "ownerread|ownerwrite" \ -s $(stat -c %s sealed.tpm) \ 0x1000000 # tpm2_nvwrite -C o -i sealed.tpm 0x1000000 To unseal the key in GRUB, add the "tpm2_key_protector_init" command to grub.cfg: tpm2_key_protector_init --mode=nv --nvindex=0x1000000 cryptomount -u --protector tpm2 To remove the NV index handle: # tpm2_nvundefine -C o 0x1000000 Reviewed-by: Daniel Kiper 2025-04-10 Gary Lin tpm2_key_protector: Unseal key from a buffer Extract the logic to handle the file buffer from the SRK recover function to prepare to load the sealed key from the NV index handle, so the NV index mode can share the same code path in the later patch. The SRK recover function now only reads the file and sends the file buffer to the new function. Besides this, to avoid introducing more options for the NV index mode, the file format is detected automatically before unmarshaling the data, so there is no need to use the command option to specify the file format anymore. In other words, "-T" and "-k" are the same now. Also update grub.text to address the change. Reviewed-by: Stefan Berger Reviewed-by: Daniel Kiper 2025-04-10 Gary Lin tss2: Add TPM 2.0 NV index commands The following TPM 2.0 commands are introduced to tss2 to access the TPM non-volatile memory associated with the NV index handles: - TPM2_NV_DefineSpace, - TPM2_NV_UndefineSpace, - TPM2_NV_ReadPublic, - TPM2_NV_Read, - TPM2_NV_Write. The related marshal/unmarshal functions are also introduced. Reviewed-by: Stefan Berger Reviewed-by: Daniel Kiper 2025-04-10 Gary Lin tss2: Fix the missing authCommand grub_tpm2_readpublic() and grub_tpm2_testparms() didn't check authCommand when marshaling the input data buffer. Currently, there is no caller using non-NULL authCommand. However, to avoid the potential issue, the conditional check is added to insert authCommand into the input buffer if necessary. Also fix a few pointer checks. Reviewed-by: Stefan Berger Reviewed-by: Daniel Kiper 2025-04-10 Gary Lin tpm2_key_protector: Add tpm2_dump_pcr command The user may need to inspect the TPM 2.0 PCR values with the GRUB shell, so the new tpm2_dump_pcr command is added to print all PCRs of the specified bank. Also update the document for the new command. Tested-by: Stefan Berger Reviewed-by: Daniel Kiper 2025-04-10 Gary Lin tpm2_key_protector: Dump PCRs on policy fail PCR mismatch is one common cause of TPM key unsealing fail. Since the system may be compromised, it is not safe to boot into OS to get the PCR values and TPM eventlog for the further investigation. To provide some hints, GRUB now dumps PCRs on policy fail, so the user can check the current PCR values. PCR 0~15 are chosen to cover the firmware, bootloader, and OS. The sample output: PCR Mismatch! Check firmware and bootloader before typing passphrase! TPM PCR [sha256]: 00: 17401f37710984c1d8a03a81fff3ab567ae9291bac61e21715b890ee28879738 01: 7a114329ba388445a96e8db2a072785937c1b7a8803ed7cc682b87f3ff3dd7a8 02: 11c2776849e8e24b7d80c926cbc4257871bffa744dadfefd3ed049ce25143e05 03: 6c33b362073e28e30b47302bbdd3e6f9cee4debca3a304e646f8c68245724350 04: 62d38838483ecfd2484ee3a2e5450d8ca3b35fc72cda6a8c620f9f43521c37d1 05: d8a85cb37221ab7d1f2cc5f554dbe0463acb6784b5b8dc3164ccaa66d8fff0e1 06: 9262e37cbe71ed4daf815b4a4881fb7251c9d371092dde827557d5368121e10e 07: 219d542233be492d62b079ffe46cf13396a8c27e520e88b08eaf2e6d3b7e70f5 08: de1f61c973b673e505adebe0d7e8fb65fde6c24dd4ab4fbaff9e28b18df6ecd3 09: c1de7274fa3e879a16d7e6e7629e3463d95f68adcfd17c477183846dccc41c89 10: 0000000000000000000000000000000000000000000000000000000000000000 11: 0000000000000000000000000000000000000000000000000000000000000000 12: 0000000000000000000000000000000000000000000000000000000000000000 13: 0000000000000000000000000000000000000000000000000000000000000000 14: 9ab9ebe4879a7f4dd00c04f37e79cfd69d0dd7a8bcc6b01135525b67676a3e40 15: 0000000000000000000000000000000000000000000000000000000000000000 16: 0000000000000000000000000000000000000000000000000000000000000000 17: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 18: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 19: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 20: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 21: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 22: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 23: 0000000000000000000000000000000000000000000000000000000000000000 error: failed to unseal sealed key (TPM2_Unseal: 0x99d). error: no key protector provided a usable key for luks (af16e48f-746b-4a12-aae1-c14dcee429e0). If the user happens to have the PCR values for key sealing, the PCR dump can be used to identify the changed PCRs and narrow down the scope for closer inspection. Please note that the PCR dump is trustworthy only if the GRUB binary is authentic, so the user has to check the GRUB binary thoroughly before using the PCR dump. Reviewed-by: Stefan Berger Reviewed-by: Daniel Kiper 2025-04-04 Patrick Colp loader/i386/linux: Update linux_kernel_params to match upstream Update linux_kernel_params to match the v6.13.7 upstream version of boot_params. Refactor most things out into structs, as the Linux kernel does. edid_info should be a struct with "unsigned char dummy[128]" and efi_info should be a struct as well, starting at 0x1c0. However, for backwards compatibility, GRUB can have efi_systab at 0x1b8 and padding at 0x1bc (or padding at both spots). This cuts into the end of edid_info. Make edid_info inline and only make it go up to 0x1b8. Reviewed-by: Daniel Kiper 2025-04-04 Lidong Chen loader/xnu: Fix memory leak In grub_xnu_load_kext_from_dir(), when the call to grub_device_open() failed, it simply cleaned up previously allocated memory and returned GRUB_ERR_NONE. However, it neglected to free ctx->newdirname which is allocated before the call to grub_device_open(). Fixes: CID 473859 Reviewed-by: Vladimir Serbinenko Reviewed-by: Daniel Kiper 2025-04-04 Lidong Chen fs/btrfs: Fix memory leaks Fix memory leaks in grub_btrfs_extent_read() and grub_btrfs_dir(). Fixes: CID 473842 Fixes: CID 473871 Reviewed-by: Vladimir Serbinenko Reviewed-by: Daniel Kiper 2025-04-04 Lidong Chen loader/i386/linux: Fix resource leak In grub_cmd_initrd(), initrd_ctx is allocated before calling grub_relocator_alloc_chunk_align(). When that function fails, initrd_ctx should be freed before exiting grub_cmd_initrd(). Fixes: CID 473852 Reviewed-by: Daniel Kiper 2025-04-04 Lidong Chen lib/reloacator: Fix memory leaks Fix memory leaks in grub_relocator_alloc_chunk_align(). Fixes: CID 473844 Reviewed-by: Vladimir Serbinenko Reviewed-by: Daniel Kiper 2025-04-04 Lidong Chen disk/ldm: Fix memory leaks Fix memory leaks in make_vg() with new helper functions, free_pv() and free_lv(). Additionally, correct a check after allocating comp->segments->nodes that mistakenly checked lv->segments->nodes instead, likely due to a copy-paste error. Fixes: CID 473878 Fixes: CID 473884 Fixes: CID 473889 Fixes: CID 473890 Reviewed-by: Vladimir Serbinenko Reviewed-by: Daniel Kiper 2025-03-26 Andrew Hamilton fs/ntfs: Fix NULL pointer dereference and possible infinite loop A regression was introduced recently as a part of the series of filesystem related patches to address some CVEs found in GRUB. This issue may cause either an infinite loop at startup when accessing certain valid NTFS filesystems, or may cause a crash due to a NULL pointer dereference on systems where NULL address is invalid (such as may happen when calling grub-mount from the operating system level). Correct this issue by checking that at->attr_cur is within bounds inside find_attr(). Fixes: https://savannah.gnu.org/bugs/?66855 Fixes: aff263187 (fs/ntfs: Fix out-of-bounds read) Reviewed-by: Daniel Kiper 2025-03-26 Nicolas Frayer net/drivers/ieee1275/ofnet: Add missing grub_malloc() The grub_malloc() has been inadvertently removed from the code after it has been modified to use safe math functions. Fixes: 4beeff8a (net: Use safe math macros to prevent overflows) Tested-by: Marta Lewandowska Reviewed-by: Daniel Kiper 2025-03-26 Avnish Chouhan kern/ieee1275/init: Increase MIN_RMA size for CAS negotiation on PowerPC machines Change RMA size from 512 MB to 768 MB which will result in more memory at boot time for PowerPC. When vTPM, Secure Boot or FADump are enabled on PowerPC the 512 MB RMA memory is not sufficient for boot. With this 512 MB RMA, GRUB runs out of memory and fails to boot the machine. Sometimes even usage of CDROM requires more memory for installation and along with the options mentioned above exhausts the boot memory which results in boot failures. Increasing the RMA size will resolves multiple out of memory issues observed on PowerPC machines. Failure details (GRUB debug console dump): kern/ieee1275/init.c:550: mm requested region of size 8513000, flags 1 kern/ieee1275/init.c:563: Cannot satisfy allocation and retain minimum runtime space kern/ieee1275/init.c:550: mm requested region of size 8513000, flags 0 kern/ieee1275/init.c:563: Cannot satisfy allocation and retain minimum runtime space kern/file.c:215: Closing `/ppc/ppc64/initrd.img' ... kern/disk.c:297: Closing `ieee1275//vdevice/v-scsi@30000067/disk@8300000000000000'... kern/disk.c:311: Closing `ieee1275//vdevice/v-scsi@30000067/disk@8300000000000000' succeeded. kern/file.c:225: Closing `/ppc/ppc64/initrd.img' failed with 3. kern/file.c:148: Opening `/ppc/ppc64/initrd.img' succeeded. error: ../../grub-core/kern/mm.c:552:out of memory. Reviewed-by: Daniel Kiper 2025-03-26 Stuart Hayes fs/zfs: Fix a number of memory leaks in ZFS code Without this fix the GRUB failed to boot linux with "out of memory" after trying to run a "search --fs-uuid..." on a system that has 7 ZFS pools across about 80 drives. Reviewed-by: Vladimir Serbinenko Reviewed-by: Daniel Kiper 2025-03-26 Glenn Washburn tests/util/grub-shell: Remove the work directory on successful run and debug is not on This removes a lot of empty grub-shell working directories in the TMPDIR directory. Tested-by: Thomas Schmitt Reviewed-by: Daniel Kiper 2025-03-26 Thomas Schmitt tests/grub_cmd_cryptomount: Remove temporary directories if successful and debug is not on grub_cmd_cryptomount creates a directory per subtest. If a subtest is successful and debugging is not on, the directory should be empty. So, it can be deleted. Tested-by: Thomas Schmitt Reviewed-by: Daniel Kiper 2025-03-26 Glenn Washburn tests/grub_cmd_cryptomount: Default TMPDIR to /tmp This fixes behavior where grub_cmd_cryptomount temporary files, which are some times not cleaned up, are left in the / directory. Set TMPDIR if your system does not have /tmp or it can not be used for some reason. Reported-by: Thomas Schmitt Tested-by: Thomas Schmitt Reviewed-by: Daniel Kiper 2025-03-26 Glenn Washburn tests/grub_cmd_cryptomount: Cleanup the cryptsetup script unless debug is enabled This fixes an issue where the grub_cmd_cryptomount test leaves a file with an ambiguous name in the / directory when TMPDIR is not set. Reported-by: Thomas Schmitt Tested-by: Thomas Schmitt Reviewed-by: Daniel Kiper 2025-03-26 Glenn Washburn tests: Cleanup generated files on expected failure in grub_cmd_cryptomount grub-shell-luks-tester only cleans up generated files when the test it runs returns success. Sometimes tests are run that should fail. Add a --xfail argument to grub-shell-luks-tester and pass it from grub_cmd_cryptomount when invoking a test that is expected to fail. Reported-by: Thomas Schmitt Tested-by: Thomas Schmitt Reviewed-by: Daniel Kiper 2025-03-26 Glenn Washburn tests/util/grub-shell-luks-tester: Add missing line to create RET variable in cleanup Set the RET variable to the exit status of the script, as was assumed in the cleanup() function. Reported-by: Thomas Schmitt Tested-by: Thomas Schmitt Reviewed-by: Daniel Kiper 2025-03-26 Glenn Washburn tests/util/grub-shell-luks-tester: Find cryptodisk by UUID GRUB has the capability to search all the disks for a cryptodisk of a given UUID. Use this instead of hardcoding which disk is the cryptodisk, which can change when devices are added or removed, or potentially when QEMU is upgraded. This can not be done for the detached header tests because the header contains the UUID. Also, capitalize comment lines for consistency. Reviewed-by: Daniel Kiper 2025-03-26 Glenn Washburn tests/util/grub-shell: Default qemuopts to envvar $GRUB_QEMU_OPTS Fix a regression where qemuopts was mistakenly defaulted to the empty string. This prevents the sending of arbitrary QEMU options to tests, which may be desirable for overriding the machine type. There was a concern that allowing the tester to accept arbitrary options would add headaches for another developer trying to diagnose why a test failed on the testers machine because he could not be sure if any additional options were passed to make the test fail. However, all the options are recorded in the run.sh generated script, so this concern is unwarranted. Fixes: 6d729ced70 (tests/util/grub-shell: Add $GRUB_QEMU_OPTS to run.sh to easily see unofficial QEMU arguments) Reviewed-by: Daniel Kiper 2025-03-05 Patrick Plenefisch disk/lvm: Add informational messages in error cases of ignored features Reviewed-by: Daniel Kiper 2025-03-05 Patrick Plenefisch disk/lvm: Add support for cachevol LV Mark cachevol LV's as ignored features, which is true only if they are configured as "writethrough". This patch does not let GRUB boot from "writeback" cache-enabled LV's. Reviewed-by: Daniel Kiper 2025-03-05 Patrick Plenefisch disk/lvm: Add support for integrity LV The LV matching must be done after processing the ignored feature indirections, as integrity volumes & caches may have several levels of indirection that the segments must be shifted through. Reviewed-by: Daniel Kiper 2025-03-05 Patrick Plenefisch lvm: Match all LVM segments before validation The PV matching must be completely finished before validating a volume, otherwise referenced RAID stripes may not have PV data applied yet. This change is required for integrity & cachevol support. Reviewed-by: Daniel Kiper 2025-03-05 Patrick Plenefisch disk/lvm: Remove unused cache_pool The cache_pool is never read or used, remove it. Reviewed-by: Daniel Kiper 2025-03-05 Patrick Plenefisch disk/lvm: Make cache_lv more generic as ignored_feature_lv This patch isn't necessary by itself, but when combined with subsequent patches it enhances readability as ignored_features_lv is then used for multiple types of extra LV's, not just cache LV's. Reviewed-by: Daniel Kiper 2025-03-05 Glenn Washburn commands/ls: Add directory header for dir args Like the GNU ls, first print a line with the directory path before printing files in the directory, which will not have a directory component, but only if there is more than one argument. Reviewed-by: Daniel Kiper 2025-03-05 Glenn Washburn commands/ls: Print full paths for file args For arguments that are paths to files, print the full path of the file. Reviewed-by: Daniel Kiper 2025-03-05 Glenn Washburn commands/ls: Output path for single file arguments given with path Reviewed-by: Daniel Kiper 2025-03-05 Glenn Washburn commands/ls: Show modification time for file paths The modification time for paths to files was not being printed because the grub_dirhook_info, which contains the mtime, was initialized to NULL. Instead of calling print_file() directly, use fs->fs_dir() to call print_file() with a properly filled in grub_dirhook_info. This has the added benefit of reducing code complexity. Reviewed-by: Daniel Kiper 2025-03-05 Glenn Washburn commands/ls: Merge print_files_long() and print_files() into print_file() Simplify the code by removing logic around which file printer to call. Reviewed-by: Daniel Kiper 2025-03-05 Glenn Washburn commands/ls: Return proper GRUB_ERR_* for functions returning type grub_err_t Also, remove unused code. Reviewed-by: Daniel Kiper 2025-03-05 Glenn Washburn commands/acpi: Use options enum to index command options Reviewed-by: Daniel Kiper 2025-03-05 Andrew Hamilton docs: Capture additional commands restricted by lockdown Update documentation to capture that all memrw commands, the minicmd dump command, and raw memory dumping via hexdump are restricted when lockdown is enabled. This aligns to recent GRUB code updates. Reviewed-by: Daniel Kiper 2025-03-05 Andrew Hamilton docs: Document restricted filesystems in lockdown Document which filesystems are not allowed when lockdown is enabled to align to recent GRUB changes. Reviewed-by: Daniel Kiper 2025-03-05 Vladimir Serbinenko loader/i386/bsd: Fix type passed for the kernel FreeBSD loader always passes "elf kernel". We currently pass "elf64 kernel" when loading 64-bit kernel. The -CURRENT, HEAD, kernel accepts only "elf kernel". Older kernel accepts either. Tested with FreeBSD and DragonFlyBSD. Reference: https://cgit.freebsd.org/src/commit/?id=b72ae900d4348118829fe04abdc11b620930c30f Reviewed-by: Daniel Kiper 2025-03-05 Vladimir Serbinenko kern/partition: Unbreak support for nested partitions When using syntax "hd0,gtp3,dfly1" then ptr points to trailing part, ",dfly1". So, it's improper to consider it as an invalid partition. Reviewed-by: Daniel Kiper 2025-03-05 Andrew Hamilton lib/tss2/tss2_structs.h: Fix clang build - remove duplicate typedef grub-core/lib/tss2/tss2_structs.h contains a duplicate typedef as follows: typedef TPMS_SCHEME_HASH_t TPMS_SCHEME_KDF2_t; This causes a build failure when compiling with clang. Remove the duplicate typedef which allows successfully building GRUB with clang. Reviewed-by: Ross Philipson Reviewed-by: Gary Lin Reviewed-by: Daniel Kiper 2025-03-05 Yuri Zaporozhets include/grub/mm.h: Remove duplicate inclusion of grub/err.h The header is included twice. Fix that. Reviewed-by: Daniel Kiper 2025-03-05 James Le Cuirot script/execute: Don't let trailing blank lines determine the return code The grub_script_execute_sourcecode() parses and executes code one line at a time, updating the return code each time because only the last line determines the final status. However, trailing new lines were also executed, masking any failure on the previous line. Fix this by only trying to execute the command when there is actually one present. This has presumably never been noticed because this code is not used by regular functions, only in special cases like eval and menu entries. The latter generally don't return at all, having booted an OS. When failing to boot, upstream GRUB triggers the fallback mechanism regardless of the return code. We noticed the problem while using Red Hat's patches, which change this behaviour to take account of the return code. In that case, a failure takes you back to the menu rather than triggering a fallback. Reviewed-by: Daniel Kiper 2025-03-05 Glenn Washburn gitignore: Ignore generated files from libtasn The commit 504058e8 (libtasn1: Compile into asn1 module) generates files into the grub-core/lib/libtasn1-grub directory and commit 99cda678 (asn1_test: Test module for libtasn1) generates files into the grub-core/tests/asn1/tests directory. Ignore these directories as they are not under revision control. Reviewed-by: Daniel Kiper 2025-03-05 Pascal Hambourg util/grub.d/30_os-prober.in: Conditionally show or hide chain and efi menu entries On systems which support multiple boot platforms such as BIOS and EFI, it makes no sense to show menu entries which are not supported by the current boot platform. Menu entries generated from os-prober "chain" boot type use boot sector chainloading which is supported on PC BIOS platform only. Show "chain" menu entries only if boot platform is PC BIOS. Show "efi" menu entries only if boot platform is EFI. This is aimed to allow os-prober to report both EFI and PC BIOS boot loaders regardless of the current boot mode on x86 systems which support both EFI and legacy BIOS boot, in order to generate a config file which can be used with either BIOS or EFI boot. Reviewed-by: Daniel Kiper 2025-02-26 Pascal Hambourg util/grub.d/30_os-prober.in: Fix GRUB_OS_PROBER_SKIP_LIST for non-EFI GRUB documentation states: GRUB_OS_PROBER_SKIP_LIST List of space-separated FS UUIDs of filesystems to be ignored from os-prober output. For efi chainloaders it’s @ But the actual behaviour does not match this description. GRUB_OS_PROBER_SKIP_LIST="" does nothing. In order to skip non-EFI bootloaders, you must set GRUB_OS_PROBER_SKIP_LIST="@" which is both absurd, and are redundant, and wrong, such as /dev/sd* may not be persistent across boots. Also, any non-word character is accepted as a separator, including "-" and "@" which may be present in UUIDs. This can cause false positives because of partial UUID match. This patch fixes these flaws while retaining some backward compatibility with previous behaviour which may be expected by existing setups: - also accept @/dev/* (with warning) for non-EFI bootloaders, - also accept comma and semicolon as separator. Fixes: 55e706c9 (Add GRUB_OS_PROBER_SKIP_LIST to selectively skipping systems) Reviewed-by: Daniel Kiper 2025-02-26 Glenn Washburn docs: Do not reference non-existent --dumb option This appears to be a relic from GRUB legacy that used a --dumb option for its terminal command. The proper way to do this in GRUB2 is to set the terminal to "dumb" via the terminfo command. Fixes: https://savannah.gnu.org/bugs/?66302 Reported-by: Jernej Jakob Reviewed-by: Daniel Kiper 2025-02-26 Glenn Washburn docs: Replace @lbracechar{} and @rbracechar{} with @{ and @} Support for @lbracechar{} and @rbracechar{} was added in GNU Texinfo 5.0 but many older systems may have versions lower than this. Use @{ and @} to support a wider range of GNU Texinfo versions. Reviewed-by: Daniel Kiper 2025-02-26 Egor Ignatov fs/xfs: Fix grub_xfs_iterate_dir() return value in case of failure Commit ef7850c757 (fs/xfs: Fix issues found while fuzzing the XFS filesystem) introduced multiple boundary checks in grub_xfs_iterate_dir() but handled the error incorrectly returning error code instead of 0. Fix it. Also change the error message so that it doesn't match the message in grub_xfs_read_inode(). Fixes: ef7850c757 (fs/xfs: Fix issues found while fuzzing the XFS filesystem) Reviewed-by: Daniel Kiper 2025-02-26 Darrick J. Wong fs/xfs: Add new superblock features added in Linux 6.12/6.13 The Linux port of XFS added a few new features in 2024. The existing GRUB driver doesn't attempt to read or write any of the new metadata, so, all three can be added to the incompat allowlist. On the occasion align XFS_SB_FEAT_INCOMPAT_NREXT64 value. Reviewed-by: Daniel Kiper 2025-02-26 Michael Chang fs/ext2: Rework out-of-bounds read for inline and external extents Previously, the number of extent entries was not properly capped based on the actual available space. This could lead to insufficient reads for external extents since the computation was based solely on the inline extent layout. In this patch, when processing the extent header we determine whether the header is stored inline, i.e. at inode->blocks.dir_blocks, or in an external extent block. We then clamp the number of entries accordingly (using max_inline_ext for inline extents and max_external_ext for external extent blocks). This change ensures that only the valid number of extent entries is processed preventing out-of-bound reads and potential filesystem corruption. Fixes: 7e2f750f0a (fs/ext2: Fix out-of-bounds read for inline extents) Tested-by: Christian Hesse Reviewed-by: Daniel Kiper 2025-02-26 Leo Sandoval disk/ahci: Remove conditional operator for endtime The conditional makes no sense when the two possible expressions have the same value, so, remove it (perhaps the compiler does it for us but better to remove it). This change makes spinup argument unused. So, drop it as well. Reviewed-by: Daniel Kiper 2025-02-26 Benjamin Herrenschmidt term/ns8250-spcr: Return if redirection is disabled The Microsoft spec for SPCR says "The base address of the Serial Port register set described using the ACPI Generic Address Structure, or 0 if console redirection is disabled". So, return early if redirection is disabled (base address = 0). If this check is not done we may get invalid ports on machines with redirection disabled and boot may hang when reading the grub.cfg file. Reviewed-by: Leo Sandoval Reviewed-by: Daniel Kiper 2025-02-26 Lukas Fink commands/file: Fix NULL dereference in the knetbsd tests The pointer returned by grub_elf_file() is not checked to verify it is not NULL before use. A NULL pointer may be returned when the given file does not have a valid ELF header. Fixes: https://savannah.gnu.org/bugs/?61960 Reviewed-by: Ross Philipson Reviewed-by: Daniel Kiper 2025-02-26 Heinrich Schuchardt gdb_helper: Typo hueristic %s/hueristic/heuristic/ Reviewed-by: Ross Philipson Reviewed-by: Daniel Kiper 2025-02-26 Ruihan Li kern/efi/mm: Reset grub_mm_add_region_fn after ExitBootServices() call The EFI Boot Services can be used after ExitBootServices() call because the GRUB code still may allocate memory. An example call stack is: grub_multiboot_boot grub_multiboot2_make_mbi grub_efi_finish_boot_services b->exit_boot_services normal_boot grub_relocator32_boot grub_relocator_alloc_chunk_align_safe grub_relocator_alloc_chunk_align grub_malloc grub_memalign grub_mm_add_region_fn [= grub_efi_mm_add_regions] grub_efi_allocate_any_pages grub_efi_allocate_pages_real b->allocate_pages This can lead to confusing errors. After ExitBootServices() call b->allocate_pages may point to the NULL address resulting in something like: !!!! X64 Exception Type - 01(#DB - Debug) CPU Apic ID - 00000000 !!!! RIP - 000000000000201F, CS - 0000000000000038, RFLAGS - 0000000000200002 RAX - 000000007F9EE010, RCX - 0000000000000001, RDX - 0000000000000002 RBX - 0000000000000006, RSP - 00000000001CFBEC, RBP - 0000000000000000 RSI - 0000000000000000, RDI - 00000000FFFFFFFF R8 - 0000000000000006, R9 - 000000007FEDFFB8, R10 - 0000000000000000 R11 - 0000000000000475, R12 - 0000000000000001, R13 - 0000000000000002 R14 - 00000000FFFFFFFF, R15 - 000000007E432C08 DS - 0000000000000030, ES - 0000000000000030, FS - 0000000000000030 GS - 0000000000000030, SS - 0000000000000030 CR0 - 0000000080010033, CR2 - 0000000000000000, CR3 - 000000007FC01000 CR4 - 0000000000000668, CR8 - 0000000000000000 DR0 - 0000000000000000, DR1 - 0000000000000000, DR2 - 0000000000000000 DR3 - 0000000000000000, DR6 - 00000000FFFF0FF0, DR7 - 0000000000000400 GDTR - 000000007F9DE000 0000000000000047, LDTR - 0000000000000000 IDTR - 000000007F470018 0000000000000FFF, TR - 0000000000000000 FXSAVE_STATE - 00000000001CF840 Ideally we would like to avoid all memory allocations after exiting EFI Boot Services altogether but that requires significant code changes. This patch adds a simple workaround that resets grub_mm_add_region_fn to NULL after ExitBootServices() call, so: - Memory allocations have a better chance of succeeding because grub_memalign() will try to reclaim the disk cache if it sees a NULL in grub_mm_add_region_fn. - At worst it will fail to allocate memory but it will explicitly tell users that it's out of memory, which is still much better than the current situation where it fails in a fairly random way and triggers a CPU fault. Reviewed-by: Daniel Kiper 2025-02-26 Duan Yayong i386/tsc: The GRUB menu gets stuck due to unserialized rdtsc This patch is used to fix GRUB menu gets stuck in server AC poweron/poweroff stress test of x86_64, which is reproduced with 1/200 ratio. The root cause analysis as below: Q: What's the code logic? A: The grub_tsc_init() function will init tsc by setting grub_tsc_rate, which call stack is: grub_tsc_init() -> grub_tsc_calibrate_from_pmtimer() -> grub_divmod64() Among, grub_divmod64() function needs tsc_diff as the second parameter. In grub_pmtimer_wait_count_tsc(), we will call grub_get_tsc() function to get time stamp counter value to assign to start_tsc variable, and get into while (1) loop space to get end_tsc variable value with same function, after 3580 ticks, return "end_tsc - start_tsc". Actually, rdtsc instruction will be called in grub_get_tsc, but rdtsc instruction is not reliable (for the reason see the next question), which will cause tsc_diff to be a very big number larger than (1UL << 32) or a negative number, so that grub_tsc_rate will be zero. When run_menu() function is startup, and calls grub_tsc_get_time_ms() function to get current time to check if timeout time reach, at this time, grub_tsc_get_time_ms() function will return zero due to zero grub_tsc_rate variable, then GRUB menu gets stuck... Q: What's the difference between rdtsc and rdtscp instructions in x86_64 architecture? Here is more explanations from Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 2B (December 2024): https://cdrdv2.intel.com/v1/dl/getContent/671241 A: In page 4-558 -> RDTSC—Read Time-Stamp Counter: The RDTSC instruction is not a serializing instruction. It does not necessarily wait until all previous instructions have been executed before reading the counter. Similarly, subsequent instructions may begin execution before the read operation is performed. The following items may guide software seeking to order executions of RDTSC: - If software requires RDTSC to be executed only after all previous instructions have executed and all previous loads are globally visible, it can execute LFENCE immediately before RDTSC. - If software requires RDTSC to be executed only after all previous instructions have executed and all previous loads and stores are globally visible, it can execute the sequence MFENCE;LFENCE immediately before RDTSC. - If software requires RDTSC to be executed prior to execution of any subsequent instruction (including any memory accesses), it can execute the sequence LFENCE immediately after RDTSC. A: In page 4-560 -> RDTSCP—Read Time-Stamp Counter and Processor ID: The RDTSCP instruction is not a serializing instruction, but it does wait until all previous instructions have executed and all previous loads are globally visible. But it does not wait for previous stores to be globally visible, and subsequent instructions may begin execution before the read operation is performed. The following items may guide software seeking to order executions of RDTSCP: - If software requires RDTSCP to be executed only after all previous stores are globally visible, it can execute MFENCE immediately before RDTSCP. - If software requires RDTSCP to be executed prior to execution of any subsequent instruction (including any memory accesses), it can execute LFENCE immediately after RDTSCP. Q: Why there is a cpuid serializing instruction before rdtsc instruction, but "grub_get_tsc" still cannot work as expect? A: From Intel® 64 and IA-32 Architectures Software Developer's Manual Volume 2A: Instruction Set Reference, A-L (December 2024): https://cdrdv2.intel.com/v1/dl/getContent/671199 In page 3-222 -> CPUID—CPU Identification: CPUID can be executed at any privilege level to serialize instruction execution. Serializing instruction execution guarantees that any modifications to flags, registers, and memory for previous instructions are completed before the next instruction is fetched and executed. So we only kept the instruction rdtsc and its previous instruction in order currently. But it is still out-of-order possibility between rdtsc instruction and its subsequent instruction. Q: Why do we do this fix? A: In the one hand, add cpuid instruction after rdtsc instruction to make sure rdtsc instruction to be executed prior to execution of any subsequent instruction, about serializing execution that all previous instructions have been executed before rdtsc, there is a cpuid usage in original code. In the other hand, using cpuid instruction rather than lfence can make sure a forward compatibility for previous HW. Base this fix, we did 1500 cycles power on/off stress test, and did not reproduce this issue again. Fixes: https://savannah.gnu.org/bugs/?66257 Reviewed-by: Daniel Kiper 2025-02-26 Duan Yayong kern/i386/tsc_pmtimer: The GRUB menu gets stuck due to failed calibration The grub_divmod64() may return 0 but grub_tsc_calibrate_from_pmtimer() still returns 1 saying calibration succeeded. Of course it is not true. So, return 0 when grub_divmod64() returns 0. This way other calibration functions can be called subsequently. Reviewed-by: Daniel Kiper 2025-02-26 Sergii Dmytruk loader/i386/linux: Fix cleanup if kernel doesn't support 64-bit addressing Simply returning from grub_cmd_linux() doesn't free "file" resource nor calls grub_dl_ref(my_mod). Jump to "fail" label for proper cleanup like other error checks do. Reviewed-by: Daniel Kiper 2025-02-13 Alec Brown loader/i386/bsd: Use safe math to avoid underflow The operation kern_end - kern_start may underflow when we input it into grub_relocator_alloc_chunk_addr() call. To avoid this we can use safe math for this subtraction. Fixes: CID 73845 Reviewed-by: Daniel Kiper 2025-02-13 Alec Brown loader/i386/linux: Cast left shift to grub_uint32_t The Coverity complains that we might overflow into a negative value when setting linux_params.kernel_alignment to (1 << align). We can remedy this by casting it to grub_uint32_t. Fixes: CID 473876 Reviewed-by: Daniel Kiper 2025-02-13 Lidong Chen kern/misc: Add sanity check after grub_strtoul() call When the format string, fmt0, includes a positional argument grub_strtoul() or grub_strtoull() is called to extract the argument position. However, the returned argument position isn't fully validated. If the format is something like "%0$x" then these functions return 0 which leads to an underflow in the calculation of the args index, curn. The fix is to add a check to ensure the extracted argument position is greater than 0 before computing curn. Additionally, replace one grub_strtoull() with grub_strtoul() and change curn type to make code more correct. Fixes: CID 473841 Reviewed-by: Daniel Kiper 2025-02-13 Lidong Chen kern/partition: Add sanity check after grub_strtoul() call The current code incorrectly assumes that both the input and the values returned by grub_strtoul() are always valid which can lead to potential errors. This fix ensures proper validation to prevent any unintended issues. Fixes: CID 473843 Reviewed-by: Daniel Kiper 2025-02-13 Alec Brown normal/menu: Use safe math to avoid an integer overflow The Coverity indicates that the variable current_entry might overflow. To prevent this use safe math when adding GRUB_MENU_PAGE_SIZE to current_entry. On the occasion fix limiting condition which was broken. Fixes: CID 473853 Reviewed-by: Daniel Kiper 2025-02-13 Alec Brown bus/usb/ehci: Define GRUB_EHCI_TOGGLE as grub_uint32_t The Coverity indicates that GRUB_EHCI_TOGGLE is an int that contains a negative value and we are using it for the variable token which is grub_uint32_t. To remedy this we can cast the definition to grub_uint32_t. Fixes: CID 473851 Reviewed-by: Daniel Kiper 2025-02-13 Lidong Chen misc: Ensure consistent overflow error messages Update the overflow error messages to make them consistent across the GRUB code. Reviewed-by: Daniel Kiper 2025-02-13 Lidong Chen osdep/unix/getroot: Fix potential underflow The entry_len is initialized in grub_find_root_devices_from_mountinfo() to 0 before the while loop iterates through /proc/self/mountinfo. If the file is empty or contains only invalid entries entry_len remains 0 causing entry_len - 1 in the subsequent for loop initialization to underflow. To prevent this add a check to ensure entry_len > 0 before entering the for loop. Fixes: CID 473877 Reviewed-by: Daniel Kiper Reviewed-by: Ross Philipson 2025-02-13 Lidong Chen script/execute: Fix potential underflow and NULL dereference The result is initialized to 0 in grub_script_arglist_to_argv(). If the for loop condition is not met both result.args and result.argc remain 0 causing result.argc - 1 to underflow and/or result.args NULL dereference. Fix the issues by adding relevant checks. Fixes: CID 473880 Reviewed-by: Daniel Kiper 2025-02-13 Alec Brown fs/sfs: Check if allocated memory is NULL When using grub_zalloc(), if we are out of memory, this function can fail. After allocating memory, we should check if grub_zalloc() returns NULL. If so, we should handle this error. Fixes: CID 473856 Reviewed-by: Ross Philipson Reviewed-by: Daniel Kiper 2025-02-13 Alec Brown net: Check if returned pointer for allocated memory is NULL When using grub_malloc(), the function can fail if we are out of memory. After allocating memory we should check if this function returned NULL and handle this error if it did. Reviewed-by: Daniel Kiper 2025-02-13 Lidong Chen net: Prevent overflows when allocating memory for arrays Use grub_calloc() when allocating memory for arrays to ensure proper overflow checks are in place. Reviewed-by: Daniel Kiper 2025-02-13 Lidong Chen net: Use safe math macros to prevent overflows Replace direct arithmetic operations with macros from include/grub/safemath.h to prevent potential overflow issues when calculating the memory sizes. Reviewed-by: Daniel Kiper 2025-02-13 Lidong Chen fs/zfs: Add missing NULL check after grub_strdup() call Reviewed-by: Daniel Kiper 2025-02-13 Lidong Chen fs/zfs: Check if returned pointer for allocated memory is NULL When using grub_malloc() or grub_zalloc(), these functions can fail if we are out of memory. After allocating memory we should check if these functions returned NULL and handle this error if they did. Reviewed-by: Daniel Kiper 2025-02-13 Lidong Chen fs/zfs: Prevent overflows when allocating memory for arrays Use grub_calloc() when allocating memory for arrays to ensure proper overflow checks are in place. Reviewed-by: Daniel Kiper 2025-02-13 Lidong Chen fs/zfs: Use safe math macros to prevent overflows Replace direct arithmetic operations with macros from include/grub/safemath.h to prevent potential overflow issues when calculating the memory sizes. Reviewed-by: Daniel Kiper 2025-02-13 Lidong Chen fs: Prevent overflows when assigning returned values from read_number() The direct assignment of the unsigned long long value returned by read_number() can potentially lead to an overflow on a 32-bit systems. The fix replaces the direct assignments with calls to grub_cast() which detects the overflows and safely assigns the values if no overflow is detected. Reviewed-by: Daniel Kiper 2025-02-13 Lidong Chen fs: Prevent overflows when allocating memory for arrays Use grub_calloc() when allocating memory for arrays to ensure proper overflow checks are in place. The HFS+ and squash4 security vulnerabilities were reported by Jonathan Bar Or . Fixes: CVE-2025-0678 Fixes: CVE-2025-1125 Reviewed-by: Daniel Kiper 2025-02-13 Lidong Chen fs: Use safe math macros to prevent overflows Replace direct arithmetic operations with macros from include/grub/safemath.h to prevent potential overflow issues when calculating the memory sizes. Reviewed-by: Daniel Kiper 2025-02-13 Alec Brown disk/ieee1275/ofdisk: Call grub_ieee1275_close() when grub_malloc() fails In the dev_iterate() function a handle is opened but isn't closed when grub_malloc() returns NULL. We should fix this by closing it on error. Reviewed-by: Daniel Kiper 2025-02-13 Alec Brown disk: Check if returned pointer for allocated memory is NULL When using grub_malloc(), grub_zalloc() or grub_calloc(), these functions can fail if we are out of memory. After allocating memory we should check if these functions returned NULL and handle this error if they did. On the occasion make a NULL check in ATA code more obvious. Reviewed-by: Daniel Kiper 2025-02-13 Alec Brown disk: Prevent overflows when allocating memory for arrays Use grub_calloc() when allocating memory for arrays to ensure proper overflow checks are in place. Reviewed-by: Daniel Kiper 2025-02-13 Alec Brown disk: Use safe math macros to prevent overflows Replace direct arithmetic operations with macros from include/grub/safemath.h to prevent potential overflow issues when calculating the memory sizes. Reviewed-by: Daniel Kiper 2025-02-13 Daniel Axtens fs: Disable many filesystems under lockdown The idea is to permit the following: btrfs, cpio, exfat, ext, f2fs, fat, hfsplus, iso9660, squash4, tar, xfs and zfs. The JFS, ReiserFS, romfs, UDF and UFS security vulnerabilities were reported by Jonathan Bar Or . Fixes: CVE-2025-0677 Fixes: CVE-2025-0684 Fixes: CVE-2025-0685 Fixes: CVE-2025-0686 Fixes: CVE-2025-0689 Suggested-by: Daniel Axtens Reviewed-by: Daniel Kiper 2025-02-13 Daniel Axtens fs/bfs: Disable under lockdown The BFS is not fuzz-clean. Don't allow it to be loaded under lockdown. This will also disable the AFS. Fixes: CVE-2024-45778 Fixes: CVE-2024-45779 Reported-by: Nils Langius Reviewed-by: Daniel Kiper 2025-02-13 B Horn commands/hexdump: Disable memory reading in lockdown mode Reported-by: B Horn Reviewed-by: Daniel Kiper 2025-02-13 B Horn commands/memrw: Disable memory reading in lockdown mode With the rest of module being blocked in lockdown mode it does not make a lot of sense to leave memory reading enabled. This also goes in par with disabling the dump command. Reported-by: B Horn Reviewed-by: Daniel Kiper 2025-02-13 B Horn commands/minicmd: Block the dump command in lockdown mode The dump enables a user to read memory which should not be possible in lockdown mode. Fixes: CVE-2025-1118 Reported-by: B Horn Reported-by: Jonathan Bar Or Reviewed-by: Daniel Kiper 2025-02-13 Lidong Chen commands/test: Stack overflow due to unlimited recursion depth The test_parse() evaluates test expression recursively. Due to lack of recursion depth check a specially crafted expression may cause a stack overflow. The recursion is only triggered by the parentheses usage and it can be unlimited. However, sensible expressions are unlikely to contain more than a few parentheses. So, this patch limits the recursion depth to 100, which should be sufficient. Reported-by: Nils Langius Reviewed-by: Daniel Kiper 2025-02-13 Jonathan Bar Or commands/read: Fix an integer overflow when supplying more than 2^31 characters The grub_getline() function currently has a signed integer variable "i" that can be overflown when user supplies more than 2^31 characters. It results in a memory corruption of the allocated line buffer as well as supplying large negative values to grub_realloc(). Fixes: CVE-2025-0690 Reported-by: Jonathan Bar Or Reviewed-by: Daniel Kiper 2025-02-13 Lidong Chen gettext: Integer overflow leads to heap OOB write The size calculation of the translation buffer in grub_gettext_getstr_from_position() may overflow to 0 leading to heap OOB write. This patch fixes the issue by using grub_add() and checking for an overflow. Fixes: CVE-2024-45777 Reported-by: Nils Langius Reviewed-by: Daniel Kiper Reviewed-by: Alec Brown 2025-02-13 Lidong Chen gettext: Integer overflow leads to heap OOB write or read Calculation of ctx->grub_gettext_msg_list size in grub_mofile_open() may overflow leading to subsequent OOB write or read. This patch fixes the issue by replacing grub_zalloc() and explicit multiplication with grub_calloc() which does the same thing in safe manner. Fixes: CVE-2024-45776 Reported-by: Nils Langius Reviewed-by: Daniel Kiper Reviewed-by: Alec Brown 2025-02-13 B Horn gettext: Remove variables hooks on module unload The gettext module does not entirely cleanup after itself in its GRUB_MOD_FINI() leaving a few variables hooks in place. It is not possible to unload gettext module because normal module depends on it. Though fix the issues for completeness. Fixes: CVE-2025-0622 Reported-by: B Horn Reviewed-by: Daniel Kiper 2025-02-13 B Horn normal: Remove variables hooks on module unload The normal module does not entirely cleanup after itself in its GRUB_MOD_FINI() leaving a few variables hooks in place. It is not possible to unload normal module now but fix the issues for completeness. On the occasion replace 0s with NULLs for "pager" variable hooks unregister. Fixes: CVE-2025-0622 Reported-by: B Horn Reviewed-by: Daniel Kiper 2025-02-13 B Horn commands/pgp: Unregister the "check_signatures" hooks on module unload If the hooks are not removed they can be called after the module has been unloaded leading to an use-after-free. Fixes: CVE-2025-0622 Reported-by: B Horn Reviewed-by: Daniel Kiper 2025-02-13 B Horn commands/ls: Fix NULL dereference The grub_strrchr() may return NULL when the dirname do not contain "/". This can happen on broken filesystems. Reported-by: B Horn Reviewed-by: Daniel Kiper 2025-02-13 Lidong Chen commands/extcmd: Missing check for failed allocation The grub_extcmd_dispatcher() calls grub_arg_list_alloc() to allocate a grub_arg_list struct but it does not verify the allocation was successful. In case of failed allocation the NULL state pointer can be accessed in parse_option() through grub_arg_parse() which may lead to a security issue. Fixes: CVE-2024-45775 Reported-by: Nils Langius Reviewed-by: Daniel Kiper Reviewed-by: Alec Brown 2025-02-13 B Horn kern/dl: Check for the SHF_INFO_LINK flag in grub_dl_relocate_symbols() The grub_dl_relocate_symbols() iterates through the sections in an ELF looking for relocation sections. According to the spec [1] the SHF_INFO_LINK flag should be set if the sh_info field is meant to be a section index. [1] https://refspecs.linuxbase.org/elf/gabi4+/ch4.sheader.html Reported-by: B Horn Reviewed-by: Daniel Kiper 2025-02-13 B Horn kern/dl: Use correct segment in grub_dl_set_mem_attrs() The previous code would never actually call grub_update_mem_attrs() as sh_info will always be zero for the sections that exist in memory. Reported-by: B Horn Reviewed-by: Daniel Kiper 2025-02-13 B Horn kern/dl: Fix for an integer overflow in grub_dl_ref() It was possible to overflow the value of mod->ref_count, a signed integer, by repeatedly invoking insmod on an already loaded module. This led to a use-after-free. As once ref_count was overflowed it became possible to unload the module while there was still references to it. This resolves the issue by using grub_add() to check if the ref_count will overflow and then stops further increments. Further changes were also made to grub_dl_unref() to check for the underflow condition and the reference count was changed to an unsigned 64-bit integer. Reported-by: B Horn Reviewed-by: Daniel Kiper 2025-02-13 Daniel Axtens video/readers/jpeg: Do not permit duplicate SOF0 markers in JPEG Otherwise a subsequent header could change the height and width allowing future OOB writes. Fixes: CVE-2024-45774 Reported-by: Nils Langius Reviewed-by: Daniel Kiper 2025-02-13 B Horn net/tftp: Fix stack buffer overflow in tftp_open() An overly long filename can be passed to tftp_open() which would cause grub_normalize_filename() to write out of bounds. Fixed by adding an extra argument to grub_normalize_filename() for the space available, making it act closer to a strlcpy(). As several fixed strings are strcpy()'d after into the same buffer, their total length is checked to see if they exceed the remaining space in the buffer. If so, return an error. On the occasion simplify code a bit by removing unneeded rrqlen zeroing. Reported-by: B Horn Reviewed-by: Daniel Kiper 2025-02-13 B Horn net: Fix OOB write in grub_net_search_config_file() The function included a call to grub_strcpy() which copied data from an environment variable to a buffer allocated in grub_cmd_normal(). The grub_cmd_normal() didn't consider the length of the environment variable. So, the copy operation could exceed the allocation and lead to an OOB write. Fix the issue by replacing grub_strcpy() with grub_strlcpy() and pass the underlying buffers size to the grub_net_search_config_file(). Fixes: CVE-2025-0624 Reported-by: B Horn Reviewed-by: Daniel Kiper 2025-01-23 B Horn net: Remove variables hooks when interface is unregisted The grub_net_network_level_interface_unregister(), previously implemented in a header, did not remove the variables hooks that were registered in grub_net_network_level_interface_register(). Fix this by implementing the same logic used to register the variables and move the function into the grub-core/net/net.c. Reviewed-by: Daniel Kiper 2025-01-23 B Horn net: Unregister net_default_ip and net_default_mac variables hooks on unload The net module is a dependency of normal. So, it shouldn't be possible to unload the net. Though unregister variables hooks as a precaution. It also gets in line with unregistering the other net module hooks. Reviewed-by: Daniel Kiper 2025-01-23 B Horn script/execute: Limit the recursion depth If unbounded recursion is allowed it becomes possible to collide the stack with the heap. As UEFI firmware often lacks guard pages this becomes an exploitable issue as it is possible in some cases to do a controlled overwrite of a section of this heap region with arbitrary data. Reported-by: B Horn Reviewed-by: Daniel Kiper 2025-01-23 B Horn kern/partition: Limit recursion in part_iterate() The part_iterate() is used by grub_partition_iterate() as a callback in the partition iterate functions. However, part_iterate() may also call the partition iterate functions which may lead to recursion. Fix potential issue by limiting the recursion depth. Reviewed-by: Daniel Kiper 2025-01-23 B Horn kern/disk: Limit recursion depth The grub_disk_read() may trigger other disk reads, e.g. via loopbacks. This may lead to very deep recursion which can corrupt the heap. So, fix the issue by limiting reads depth. Reported-by: B Horn Reviewed-by: Daniel Kiper 2025-01-23 B Horn disk/loopback: Reference tracking for the loopback It was possible to delete a loopback while there were still references to it. This led to an exploitable use-after-free. Fixed by implementing a reference counting in the grub_loopback struct. Reported-by: B Horn Reviewed-by: Daniel Kiper 2025-01-23 Michael Chang disk/cryptodisk: Require authentication after TPM unlock for CLI access The GRUB may use TPM to verify the integrity of boot components and the result can determine whether a previously sealed key can be released. If everything checks out, showing nothing has been tampered with, the key is released and GRUB unlocks the encrypted root partition for the next stage of booting. However, the liberal Command Line Interface (CLI) can be misused by anyone in this case to access files in the encrypted partition one way or another. Despite efforts to keep the CLI secure by preventing utility command output from leaking file content, many techniques in the wild could still be used to exploit the CLI, enabling attacks or learning methods to attack. It's nearly impossible to account for all scenarios where a hack could be applied. Therefore, to mitigate potential misuse of the CLI after the root device has been successfully unlocked via TPM, the user should be required to authenticate using the LUKS password. This added layer of security ensures that only authorized users can access the CLI reducing the risk of exploitation or unauthorized access to the encrypted partition. Fixes: CVE-2024-49504 Reviewed-by: Daniel Kiper 2025-01-23 B Horn kern/file: Implement filesystem reference counting The grub_file_open() and grub_file_close() should be the only places that allow a reference to a filesystem to stay open. So, add grub_dl_t to grub_fs_t and set this in the GRUB_MOD_INIT() for each filesystem to avoid issues when filesystems forget to do it themselves or do not track their own references, e.g. squash4. The fs_label(), fs_uuid(), fs_mtime() and fs_read() should all ref and unref in the same function but it is essentially redundant in GRUB single threaded model. Reviewed-by: Daniel Kiper 2025-01-23 B Horn kern/file: Ensure file->data is set This is to avoid a generic issue were some filesystems would not set data and also not set a grub_errno. This meant it was possible for many filesystems to grub_dl_unref() themselves multiple times resulting in it being possible to unload the filesystems while there were still references to them, e.g., via a loopback. Reported-by: B Horn Reviewed-by: Daniel Kiper 2025-01-23 B Horn fs/xfs: Ensuring failing to mount sets a grub_errno It was previously possible for grub_xfs_mount() to return NULL without setting grub_errno if the XFS version was invalid. This resulted in it being possible for grub_dl_unref() to be called twice allowing the XFS module to be unloaded while there were still references to it. Fixing this problem in general by ensuring a grub_errno is set if the fail label is reached. Reported-by: B Horn Reviewed-by: Daniel Kiper 2025-01-23 Michael Chang fs/xfs: Fix out-of-bounds read The number of records in the root key array read from disk was not being validated against the size of the root node. This could lead to an out-of-bounds read. This patch adds a check to ensure that the number of records in the root key array does not exceed the expected size of a root node read from disk. If this check detects an out-of-bounds condition the operation is aborted to prevent random errors due to metadata corruption. Reported-by: Daniel Axtens Reviewed-by: Daniel Kiper 2025-01-23 B Horn fs/ntfs: Implement attribute verification It was possible to read OOB when an attribute had a size that exceeded the allocated buffer. This resolves that by making sure all attributes that get read are fully in the allocated space by implementing a function to validate them. Defining the offsets in include/grub/ntfs.h but they are only used in the validation function and not across the rest of the NTFS code. Reviewed-by: Daniel Kiper 2025-01-23 B Horn fs/ntfs: Use a helper function to access attributes Right now to access the next attribute the code reads the length of the current attribute and adds that to the current pointer. This is error prone as bounds checking needs to be performed all over the place. So, implement a helper and ensure its used across find_attr() and read_attr(). This commit does *not* implement full bounds checking. It is just the preparation work for this to be added into the helper. Reviewed-by: Daniel Kiper 2025-01-23 B Horn fs/ntfs: Track the end of the MFT attribute buffer The end of the attribute buffer should be stored alongside the rest of the attribute struct as right now it is not possible to implement bounds checking when accessing attributes sequentially. This is done via: - updating init_attr() to set at->end and check is is not initially out of bounds, - implementing checks as init_attr() had its type change in its callers, - updating the value of at->end when needed. Reviewed-by: Daniel Kiper 2025-01-23 Michael Chang fs/ntfs: Fix out-of-bounds read When parsing NTFS file records the presence of the 0xFF marker indicates the end of the attribute list. This value signifies that there are no more attributes to process. However, when the end marker is missing due to corrupted metadata the loop continues to read beyond the attribute list resulting in out-of-bounds reads and potentially entering an infinite loop. This patch adds a check to provide a stop condition for the loop ensuring it stops at the end of the attribute list or at the end of the Master File Table. This guards against out-of-bounds reads and prevents infinite loops. Reported-by: Daniel Axtens Reviewed-by: Daniel Kiper 2025-01-23 Michael Chang fs/ext2: Fix out-of-bounds read for inline extents When inline extents are used, i.e. the extent tree depth equals zero, a maximum of four entries can fit into the inode's data block. If the extent header states a number of entries greater than four the current ext2 implementation causes an out-of-bounds read. Fix this issue by capping the number of extents to four when reading inline extents. Reported-by: Daniel Axtens Reviewed-by: Daniel Kiper 2025-01-23 Lidong Chen fs/jfs: Inconsistent signed/unsigned types usage in return values The getblk() returns a value of type grub_int64_t which is assigned to iagblk and inoblk, both of type grub_uint64_t, in grub_jfs_read_inode() via grub_jfs_blkno(). This patch fixes the type mismatch in the functions. Additionally, the getblk() will return 0 instead of -1 on failure cases. This change is safe because grub_errno is always set in getblk() to indicate errors and it is later checked in the callers. Reviewed-by: Alec Brown Reviewed-by: Ross Philipson Reviewed-by: Daniel Kiper 2025-01-23 Lidong Chen fs/jfs: Use full 40 bits offset and address for a data extent An extent's logical offset and address are represented as a 40-bit value split into two parts: the most significant 8 bits and the least significant 32 bits. Currently the JFS code uses only the least significant 32 bits value for offsets and addresses assuming the data size will never exceed the 32-bit range. This approach ignores the most significant 8 bits potentially leading to incorrect offsets and addresses for larger values. The patch fixes it by incorporating the most significant 8 bits into the calculation to get the full 40-bits value for offsets and addresses. https://jfs.sourceforge.net/project/pub/jfslayout.pdf "off1,off2 is a 40-bit field, containing the logical offset of the first block in the extent. ... addr1,addr2 is a 40-bit field, containing the address of the extent." Reviewed-by: Alec Brown Reviewed-by: Ross Philipson Reviewed-by: Daniel Kiper 2025-01-23 Lidong Chen fs/jfs: Fix OOB read caused by invalid dir slot index While fuzz testing JFS with ASAN enabled an OOB read was detected in grub_jfs_opendir(). The issue occurred due to an invalid directory slot index in the first entry of the sorted directory slot array in the inode directory header. The fix ensures the slot index is validated before accessing it. Given that an internal or a leaf node in a directory B+ tree is a 4 KiB in size and each directory slot is always 32 bytes, the max number of slots in a node is 128. The validation ensures that the slot index doesn't exceed this limit. [1] https://jfs.sourceforge.net/project/pub/jfslayout.pdf JFS will allocate 4K of disk space for an internal node of the B+ tree. An internal node looks the same as a leaf node. - page 10 Fixed number of Directory Slots depending on the size of the node. These are the slots to be used for storing the directory slot array and the directory entries or router entries. A directory slot is always 32 bytes. ... A Directory Slot Array which is a sorted array of indices to the directory slots that are currently in use. ... An internal or a leaf node in the directory B+ tree is a 4K page. - page 25 Reviewed-by: Daniel Kiper Reviewed-by: Alec Brown 2025-01-23 Lidong Chen fs/jfs: Fix OOB read in jfs_getent() The JFS fuzzing revealed an OOB read in grub_jfs_getent(). The crash was caused by an invalid leaf nodes count, diro->dirpage->header.count, which was larger than the maximum number of leaf nodes allowed in an inode. This fix is to ensure that the leaf nodes count is validated in grub_jfs_opendir() before calling grub_jfs_getent(). On the occasion replace existing raw numbers with newly defined constant. Reviewed-by: Daniel Kiper Reviewed-by: Alec Brown 2025-01-23 Michael Chang fs/iso9660: Fix invalid free The ctx->filename can point to either a string literal or a dynamically allocated string. The ctx->filename_alloc field is used to indicate the type of allocation. An issue has been identified where ctx->filename is reassigned to a string literal in susp_iterate_dir() but ctx->filename_alloc is not correctly handled. This oversight causes a memory leak and an invalid free operation later. The fix involves checking ctx->filename_alloc, freeing the allocated string if necessary and clearing ctx->filename_alloc for string literals. Reported-by: Daniel Axtens Reviewed-by: Daniel Kiper 2025-01-23 B Horn fs/iso9660: Set a grub_errno if mount fails It was possible for a grub_errno to not be set if mount of an ISO 9660 filesystem failed when set_rockridge() returned 0. This isn't known to be exploitable as the other filesystems due to filesystem helper checking the requested file type. Though fixing as a precaution. Reported-by: B Horn Reviewed-by: Daniel Kiper 2025-01-23 B Horn fs/hfsplus: Set a grub_errno if mount fails It was possible for mount to fail but not set grub_errno. This led to a possible double decrement of the module reference count if the NULL page was mapped. Fixing in general as a similar bug was fixed in commit 61b13c187 (fs/hfsplus: Set grub_errno to prevent NULL pointer access) and there are likely more variants around. Fixes: CVE-2024-45783 Reported-by: B Horn Reviewed-by: Daniel Kiper 2025-01-23 B Horn fs/f2fs: Set a grub_errno if mount fails It was previously possible for grub_errno to not be set when grub_f2fs_mount() failed if nat_bitmap_ptr() returned NULL. This issue is solved by ensuring a grub_errno is set in the fail case. Reported-by: B Horn Reviewed-by: Daniel Kiper 2025-01-23 Lidong Chen fs/tar: Integer overflow leads to heap OOB write Both namesize and linksize are derived from hd.size, a 12-digit octal number parsed by read_number(). Later direct arithmetic calculation like "namesize + 1" and "linksize + 1" may exceed the maximum value of grub_size_t leading to heap OOB write. This patch fixes the issue by using grub_add() and checking for an overflow. Fixes: CVE-2024-45780 Reported-by: Nils Langius Reviewed-by: Daniel Kiper Reviewed-by: Alec Brown 2025-01-16 B Horn fs/tar: Initialize name in grub_cpio_find_file() It was possible to iterate through grub_cpio_find_file() without allocating name and not setting mode to GRUB_ARCHELP_ATTR_END, which would cause the uninitialized value for name to be used as an argument for canonicalize() in grub_archelp_dir(). Reported-by: B Horn Reviewed-by: Daniel Kiper 2025-01-16 B Horn fs/hfs: Fix stack OOB write with grub_strcpy() Replaced with grub_strlcpy(). Fixes: CVE-2024-45782 Fixes: CVE-2024-56737 Fixes: https://savannah.gnu.org/bugs/?66599 Reported-by: B Horn Reviewed-by: Daniel Kiper 2024-12-02 B Horn fs/ufs: Fix a heap OOB write grub_strcpy() was used to copy a symlink name from the filesystem image to a heap allocated buffer. This led to a OOB write to adjacent heap allocations. Fix by using grub_strlcpy(). Fixes: CVE-2024-45781 Reported-by: B Horn Reviewed-by: Daniel Kiper 2024-12-02 B Horn misc: Implement grub_strlcpy() grub_strlcpy() acts the same way as strlcpy() does on most *NIX, returning the length of src and ensuring dest is always NUL terminated except when size is 0. Reviewed-by: Daniel Kiper 2024-11-28 Stefan Berger tpm2_key_protector: Enable build for powerpc_ieee1275 Reviewed-by: Daniel Kiper 2024-11-28 Stefan Berger ieee1275/tcg2: Add TCG2 driver for ieee1275 PowerPC firmware Follow recent extensions of EFI support providing a TCG2 driver with a public API for getting the maximum TPM command size and passing a TPM command through to the TPM 2. Implement this functionality using ieee1275 PowerPC firmware API calls. Move tcg2.c into the TCG2 driver. Reviewed-by: Daniel Kiper 2024-11-28 Stefan Berger ieee1275/tcg2: Refactor grub_ieee1275_tpm_init() Move tpm_get_tpm_version() into grub_ieee1275_tpm_init() and invalidate grub_ieee1275_tpm_ihandle in case no TPM 2 could be detected. Try the initialization only once so that grub_tpm_present() will always return the same result. Use the grub_ieee1275_tpm_ihandle as indicator for an available TPM instead of grub_ieee1275_tpm_version, which can now be removed. Reviewed-by: Daniel Kiper 2024-11-28 Stefan Berger ieee1275/ibmvpm: Move TPM initialization functions to own file Move common initialization functions from the ibmvtpm driver module into tcg2.c that will be moved into the new TCG2 driver in a subsequent patch. Make the functions available to the ibmvtpm driver as public functions and variables. Reviewed-by: Daniel Kiper 2024-11-28 Stefan Berger ieee1275: Consolidate repeated definitions of IEEE1275_IHANDLE_INVALID Consolidate repeated definitions of IEEE1275_IHANDLE_INVALID that are cast to the type grub_ieee1275_ihandle_t. On the occasion add "GRUB_" prefix to the constant name. Reviewed-by: Daniel Kiper 2024-11-28 Stefan Berger term/ieee1275/serial: Cast 0 to proper type Cast 0 to proper type grub_ieee1275_ihandle_t. This type is used for struct grub_serial_port's handle that assigns or compares with IEEE1275_IHANDLE_INVALID. Reviewed-by: Daniel Kiper 2024-11-28 Stefan Berger tss2: Adjust bit fields for big endian targets The TPM bit fields need to be in reverse order for big endian targets, such as ieee1275 PowerPC platforms that run GRUB in big endian mode. Reviewed-by: Gary Lin Reviewed-by: Daniel Kiper 2024-11-28 Gary Lin docs: Document TPM2 key protector Update the user manual to address TPM2 key protector including the two related commands, tpm2_key_protector_init and tpm2_key_protector_clear, and the user-space utility: grub-protect. Reviewed-by: Daniel Kiper Reviewed-by: Stefan Berger Tested-by: Stefan Berger 2024-11-28 Gary Lin tests: Add tpm2_key_protector_test For the tpm2_key_protector module, the TCG2 command submission function is the only difference between a QEMU instance and grub-emu. To test TPM2 key unsealing with a QEMU instance, it requires an extra OS image to invoke grub-protect to seal the LUKS key, rather than a simple grub-shell rescue CD image. On the other hand, grub-emu can share the emulated TPM2 device with the host, so that we can seal the LUKS key on host and test key unsealing with grub-emu. This test script firstly creates a simple LUKS image to be loaded as a loopback device in grub-emu. Then an emulated TPM2 device is created by "swtpm chardev" and PCR 0 and 1 are extended. There are several test cases in the script to test various settings. Each test case uses grub-protect or tpm2-tools to seal the LUKS password with PCR 0 and PCR 1. Then grub-emu is launched to load the LUKS image, try to mount the image with tpm2_key_protector_init and cryptomount, and verify the result. Based on the idea from Michael Chang. Cc: Michael Chang Cc: Stefan Berger Cc: Glenn Washburn Reviewed-by: Daniel Kiper Reviewed-by: Stefan Berger Tested-by: Stefan Berger 2024-11-28 Gary Lin tpm2_key_protector: Add grub-emu support As a preparation to test tpm2_key_protector with grub-emu, the new option, --tpm-device, is introduced to specify the TPM device for grub-emu so that grub-emu can access an emulated TPM device from the host. Since grub-emu can directly access the device on host, it's easy to implement the essential TCG2 command submission function with the read/write functions and enable tpm2_key_protector module for grub-emu, so that we can further test TPM2 key unsealing with grub-emu. Reviewed-by: Stefan Berger Reviewed-by: Daniel Kiper Tested-by: Stefan Berger 2024-11-28 Gary Lin diskfilter: Look up cryptodisk devices first When using disk auto-unlocking with TPM 2.0, the typical grub.cfg may look like this: tpm2_key_protector_init --tpm2key=(hd0,gpt1)/boot/grub/sealed.tpm cryptomount -u -P tpm2 search --fs-uuid --set=root Since the disk search order is based on the order of module loading, the attacker could insert a malicious disk with the same FS-UUID root to trick GRUB to boot into the malicious root and further dump memory to steal the unsealed key. Do defend against such an attack, we can specify the hint provided by "grub-probe" to search the encrypted partition first: search --fs-uuid --set=root --hint='cryptouuid/' However, for LVM on an encrypted partition, the search hint provided by "grub-probe" is: --hint='lvmid//' It doesn't guarantee to look up the logical volume from the encrypted partition, so the attacker may have the chance to fool GRUB to boot into the malicious disk. To minimize the attack surface, this commit tweaks the disk device search in diskfilter to look up cryptodisk devices first and then others, so that the auto-unlocked disk will be found first, not the attacker's disk. Cc: Fabian Vogt Reviewed-by: Stefan Berger Reviewed-by: Daniel Kiper Tested-by: Stefan Berger 2024-11-28 Gary Lin cryptodisk: Wipe out the cached keys from protectors An attacker may insert a malicious disk with the same crypto UUID and trick GRUB to mount the fake root. Even though the key from the key protector fails to unlock the fake root, it's not wiped out cleanly so the attacker could dump the memory to retrieve the secret key. To defend such attack, wipe out the cached key when we don't need it. Cc: Fabian Vogt Reviewed-by: Stefan Berger Reviewed-by: Daniel Kiper Tested-by: Stefan Berger 2024-11-28 Patrick Colp cryptodisk: Fallback to passphrase If a protector is specified, but it fails to unlock the disk, fall back to asking for the passphrase. Before requesting the passphrase, the error from the key protector(s) has to be cleared, or the later code, e.g., LUKS code, may stop as grub_errno is set. This commit prints error from the key protector(s) and sets grub_errno to GRUB_ERR_NONE to have a fresh start. Reviewed-by: Stefan Berger Reviewed-by: Daniel Kiper Tested-by: Stefan Berger 2024-11-28 Patrick Colp tpm2_key_protector: Implement NV index Currently with the TPM2 protector, only SRK mode is supported and NV index support is just a stub. Implement the NV index option. Note: This only extends support on the unseal path. grub-protect has not been updated. tpm2-tools can be used to insert a key into the NV index. An example of inserting a key using tpm2-tools: # Get random key. tpm2_getrandom 32 > key.dat # Create primary object. tpm2_createprimary -C o -g sha256 -G ecc -c primary.ctx # Create policy object. `pcrs.dat` contains the PCR values to seal against. tpm2_startauthsession -S session.dat tpm2_policypcr -S session.dat -l sha256:7,11 -f pcrs.dat -L policy.dat tpm2_flushcontext session.dat # Seal key into TPM. cat key.dat | tpm2_create -C primary.ctx -u key.pub -r key.priv -L policy.dat -i- tpm2_load -C primary.ctx -u key.pub -r key.priv -n sealing.name -c sealing.ctx tpm2_evictcontrol -C o -c sealing.ctx 0x81000000 Then to unseal the key in GRUB, add this to grub.cfg: tpm2_key_protector_init --mode=nv --nvindex=0x81000000 --pcrs=7,11 cryptomount -u --protector tpm2 Reviewed-by: Stefan Berger Reviewed-by: Daniel Kiper Tested-by: Stefan Berger 2024-11-28 Gary Lin tpm2_key_protector: Support authorized policy This commit handles the TPM2_PolicyAuthorize command from the key file in TPM 2.0 Key File format. TPM2_PolicyAuthorize is the essential command to support authorized policy which allows the users to sign TPM policies with their own keys. Per TPM 2.0 Key File [1], CommandPolicy for TPM2_PolicyAuthorize comprises "TPM2B_PUBLIC pubkey", "TPM2B_DIGEST policy_ref", and "TPMT_SIGNATURE signature". To verify the signature, the current policy digest is hashed with the hash algorithm written in "signature", and then "signature" is verified with the hashed policy digest and "pubkey". Once TPM accepts "signature", TPM2_PolicyAuthorize is invoked to authorize the signed policy. To create the key file with authorized policy, here are the pcr-oracle [2] commands: # Generate the RSA key and create the authorized policy file $ pcr-oracle \ --rsa-generate-key \ --private-key policy-key.pem \ --auth authorized.policy \ create-authorized-policy 0,2,4,7,9 # Seal the secret with the authorized policy $ pcr-oracle \ --key-format tpm2.0 \ --auth authorized.policy \ --input disk-secret.txt \ --output sealed.key \ seal-secret # Sign the predicted PCR policy $ pcr-oracle \ --key-format tpm2.0 \ --private-key policy-key.pem \ --from eventlog \ --stop-event "grub-file=grub.cfg" \ --after \ --input sealed.key \ --output /boot/efi/efi/grub/sealed.tpm \ sign 0,2,4,7,9 Then specify the key file and the key protector to grub.cfg in the EFI system partition: tpm2_key_protector_init -a RSA --tpm2key=(hd0,gpt1)/efi/grub/sealed.tpm cryptomount -u -P tpm2 For any change in the boot components, just run the "sign" command again to update the signature in sealed.tpm, and TPM can unseal the key file with the updated PCR policy. [1] https://www.hansenpartnership.com/draft-bottomley-tpm2-keys.html [2] https://github.com/okirch/pcr-oracle Reviewed-by: Stefan Berger Reviewed-by: Daniel Kiper Tested-by: Stefan Berger 2024-11-28 Hernan Gatta util/grub-protect: Add new tool To utilize the key protectors framework, there must be a way to protect full-disk encryption keys in the first place. The grub-protect tool includes support for the TPM2 key protector but other protectors that require setup ahead of time can be supported in the future. For the TPM2 key protector, the intended flow is for a user to have a LUKS 1 or LUKS 2-protected fully-encrypted disk. The user then creates a new LUKS key file, say by reading /dev/urandom into a file, and creates a new LUKS key slot for this key. Then, the user invokes the grub-protect tool to seal this key file to a set of PCRs using the system's TPM 2.0. The resulting sealed key file is stored in an unencrypted partition such as the EFI System Partition (ESP) so that GRUB may read it. The user also has to ensure the cryptomount command is included in GRUB's boot script and that it carries the requisite key protector (-P) parameter. Sample usage: $ dd if=/dev/urandom of=luks-key bs=1 count=32 $ sudo cryptsetup luksAddKey /dev/sdb1 luks-key --pbkdf=pbkdf2 --hash=sha512 To seal the key with TPM 2.0 Key File (recommended): $ sudo grub-protect --action=add \ --protector=tpm2 \ --tpm2-pcrs=0,2,4,7,9 \ --tpm2key \ --tpm2-keyfile=luks-key \ --tpm2-outfile=/boot/efi/efi/grub/sealed.tpm Or, to seal the key with the raw sealed key: $ sudo grub-protect --action=add \ --protector=tpm2 \ --tpm2-pcrs=0,2,4,7,9 \ --tpm2-keyfile=luks-key \ --tpm2-outfile=/boot/efi/efi/grub/sealed.key Then, in the boot script, for TPM 2.0 Key File: tpm2_key_protector_init --tpm2key=(hd0,gpt1)/efi/grub/sealed.tpm cryptomount -u -P tpm2 Or, for the raw sealed key: tpm2_key_protector_init --keyfile=(hd0,gpt1)/efi/grub/sealed.key --pcrs=0,2,4,7,9 cryptomount -u -P tpm2 The benefit of using TPM 2.0 Key File is that the PCR set is already written in the key file, so there is no need to specify PCRs when invoking tpm2_key_protector_init. Reviewed-by: Stefan Berger Reviewed-by: Daniel Kiper Tested-by: Stefan Berger 2024-11-28 Hernan Gatta cryptodisk: Support key protectors Add a new parameter to cryptomount to support the key protectors framework: -P. The parameter is used to automatically retrieve a key from specified key protectors. The parameter may be repeated to specify any number of key protectors. These are tried in order until one provides a usable key for any given disk. Reviewed-by: Glenn Washburn Reviewed-by: Stefan Berger Reviewed-by: Daniel Kiper Tested-by: Stefan Berger 2024-11-28 Hernan Gatta key_protector: Add TPM2 Key Protector The TPM2 key protector is a module that enables the automatic retrieval of a fully-encrypted disk's unlocking key from a TPM 2.0. The theory of operation is such that the module accepts various arguments, most of which are optional and therefore possess reasonable defaults. One of these arguments is the keyfile/tpm2key parameter, which is mandatory. There are two supported key formats: 1. Raw Sealed Key (--keyfile) When sealing a key with TPM2_Create, the public portion of the sealed key is stored in TPM2B_PUBLIC, and the private portion is in TPM2B_PRIVATE. The raw sealed key glues the fully marshalled TPM2B_PUBLIC and TPM2B_PRIVATE into one file. 2. TPM 2.0 Key (--tpm2key) The following is the ASN.1 definition of TPM 2.0 Key File: TPMPolicy ::= SEQUENCE { CommandCode [0] EXPLICIT INTEGER CommandPolicy [1] EXPLICIT OCTET STRING } TPMAuthPolicy ::= SEQUENCE { Name [0] EXPLICIT UTF8STRING OPTIONAL Policy [1] EXPLICIT SEQUENCE OF TPMPolicy } TPMKey ::= SEQUENCE { type OBJECT IDENTIFIER emptyAuth [0] EXPLICIT BOOLEAN OPTIONAL policy [1] EXPLICIT SEQUENCE OF TPMPolicy OPTIONAL secret [2] EXPLICIT OCTET STRING OPTIONAL authPolicy [3] EXPLICIT SEQUENCE OF TPMAuthPolicy OPTIONAL description [4] EXPLICIT UTF8String OPTIONAL, rsaParent [5] EXPLICIT BOOLEAN OPTIONAL, parent INTEGER pubkey OCTET STRING privkey OCTET STRING } The TPM2 key protector only expects a "sealed" key in DER encoding, so "type" is always 2.23.133.10.1.5, "emptyAuth" is "TRUE", and "secret" is empty. "policy" and "authPolicy" are the possible policy command sequences to construct the policy digest to unseal the key. Similar to the raw sealed key, the public portion (TPM2B_PUBLIC) of the sealed key is stored in "pubkey", and the private portion (TPM2B_PRIVATE) is in "privkey". For more details: https://www.hansenpartnership.com/draft-bottomley-tpm2-keys.html This sealed key file is created via the grub-protect tool. The tool utilizes the TPM's sealing functionality to seal (i.e., encrypt) an unlocking key using a Storage Root Key (SRK) to the values of various Platform Configuration Registers (PCRs). These PCRs reflect the state of the system as it boots. If the values are as expected, the system may be considered trustworthy, at which point the TPM allows for a caller to utilize the private component of the SRK to unseal (i.e., decrypt) the sealed key file. The caller, in this case, is this key protector. The TPM2 key protector registers two commands: - tpm2_key_protector_init: Initializes the state of the TPM2 key protector for later usage, clearing any previous state, too, if any. - tpm2_key_protector_clear: Clears any state set by tpm2_key_protector_init. The way this is expected to be used requires the user to, either interactively or, normally, via a boot script, initialize/configure the key protector and then specify that it be used by the "cryptomount" command (modifications to this command are in a different patch). For instance, to unseal the raw sealed key file: tpm2_key_protector_init --keyfile=(hd0,gpt1)/efi/grub/sealed-1.key cryptomount -u -P tpm2 tpm2_key_protector_init --keyfile=(hd0,gpt1)/efi/grub/sealed-2.key --pcrs=7,11 cryptomount -u -P tpm2 Or, to unseal the TPM 2.0 Key file: tpm2_key_protector_init --tpm2key=(hd0,gpt1)/efi/grub/sealed-1.tpm cryptomount -u -P tpm2 tpm2_key_protector_init --tpm2key=(hd0,gpt1)/efi/grub/sealed-2.tpm --pcrs=7,11 cryptomount -u -P tpm2 If a user does not initialize the key protector and attempts to use it anyway, the protector returns an error. Before unsealing the key, the TPM2 key protector follows the "TPMPolicy" sequences to enforce the TPM policy commands to construct a valid policy digest to unseal the key. For the TPM 2.0 Key files, "authPolicy" may contain multiple "TPMPolicy" sequences, the TPM2 key protector iterates "authPolicy" to find a valid sequence to unseal key. If "authPolicy" is empty or all sequences in "authPolicy" fail, the protector tries the one from "policy". In case "policy" is also empty, the protector creates a "TPMPolicy" sequence based on the given PCR selection. For the raw sealed key, the TPM2 key protector treats the key file as a TPM 2.0 Key file without "authPolicy" and "policy", so the "TPMPolicy" sequence is always based on the PCR selection from the command parameters. This commit only supports one policy command: TPM2_PolicyPCR. The command set will be extended to support advanced features, such as authorized policy, in the later commits. Cc: James Bottomley Reviewed-by: Daniel Kiper Reviewed-by: Stefan Berger Tested-by: Stefan Berger 2024-11-28 Gary Lin tss2: Add TPM2 Software Stack (TSS2) support A Trusted Platform Module (TPM) Software Stack (TSS) provides logic to compose and submit TPM commands and parse responses. A limited number of TPM commands may be accessed via the EFI TCG2 protocol. This protocol exposes functionality that is primarily geared toward TPM usage within the context of Secure Boot. For all other TPM commands, however, such as sealing and unsealing, this protocol does not provide any help, with the exception of passthrough command submission. The SubmitCommand method allows a caller to send raw commands to the system's TPM and to receive the corresponding response. These command/response pairs are formatted using the TPM wire protocol. To construct commands in this way, and to parse the TPM's response, it is necessary to, first, possess knowledge of the various TPM structures, and, second, of the TPM wire protocol itself. As such, this patch includes implementations of various grub_tpm2_* functions (inventoried below), and logic to write and read command and response buffers, respectively, using the TPM wire protocol. Functions: - grub_tpm2_create(), - grub_tpm2_createprimary(), - grub_tpm2_evictcontrol(), - grub_tpm2_flushcontext(), - grub_tpm2_load(), - grub_tpm2_pcr_read(), - grub_tpm2_policygetdigest(), - grub_tpm2_policypcr(), - grub_tpm2_readpublic(), - grub_tpm2_startauthsession(), - grub_tpm2_unseal(), - grub_tpm2_loadexternal(), - grub_tpm2_hash(), - grub_tpm2_verifysignature(), - grub_tpm2_policyauthorize(), - grub_tpm2_testparms(). Reviewed-by: Daniel Kiper Reviewed-by: Stefan Berger Tested-by: Stefan Berger 2024-11-28 Gary Lin tss2: Add TPM2 types and Marshal/Unmarshal functions This commit adds the necessary TPM2 types and structs as the preparation for the TPM2 Software Stack (TSS2) support. The Marshal/Unmarshal functions are also added to handle the data structure to be submitted to TPM2 commands and to be received from the response. Reviewed-by: Daniel Kiper Reviewed-by: Stefan Berger Tested-by: Stefan Berger 2024-11-28 Gary Lin tss2: Add TPM2 buffer handling functions As the preparation to support TPM2 Software Stack (TSS2), this commit implements the TPM2 buffer handling functions to pack data for the TPM2 commands and unpack the data from the response. Cc: Stefan Berger Reviewed-by: Daniel Kiper Tested-by: Stefan Berger 2024-11-28 Hernan Gatta key_protector: Add key protectors framework A key protector encapsulates functionality to retrieve an unlocking key for a fully-encrypted disk from a specific source. A key protector module registers itself with the key protectors framework when it is loaded and unregisters when unloaded. Additionally, a key protector may accept parameters that describe how it should operate. The key protectors framework, besides offering registration and unregistration functions, also offers a one-stop routine for finding and invoking a key protector by name. If a key protector with the specified name exists and if an unlocking key is successfully retrieved by it, the function returns to the caller the retrieved key and its length. Cc: Vladimir Serbinenko Reviewed-by: Stefan Berger Reviewed-by: Daniel Kiper Tested-by: Stefan Berger 2024-11-28 Gary Lin libtasn1: Add the documentation Document libtasn1 in docs/grub-dev.texi and add the upgrade steps. Also add the patches to make libtasn1 compatible with GRUB code. Reviewed-by: Vladimir Serbinenko Reviewed-by: Daniel Kiper Tested-by: Stefan Berger 2024-11-28 Daniel Axtens asn1_test: Test module for libtasn1 Import tests from libtasn1 that use functionality we import. This test module is integrated into functional_test so that the user can run the test in GRUB shell. This doesn't test the full decoder but that will be exercised in test suites for coming patch sets. Add testcase target in accordance with commit 5e10be48e5 (tests: Add check-native and check-nonnative make targets). Cc: Vladimir Serbinenko Reviewed-by: Daniel Kiper Tested-by: Stefan Berger 2024-11-28 Daniel Axtens libtasn1: Compile into asn1 module Create a wrapper file that specifies the module license. Set up the makefile so it is built. Reviewed-by: Daniel Kiper Tested-by: Stefan Berger 2024-11-28 Gary Lin asn1_test: Enable the testcase only when GRUB_LONG_MAX is larger than GRUB_INT_MAX There is a testcase to test the values larger than "int" but smaller than "long". However, for some architectures, "long" and "int" are the same and the compiler may issue a warning like this: grub-core/tests/asn1/tests/Test_overflow.c:48:50: error: left shift of negative value [-Werror=shift-negative-value] unsigned long num = ((long) GRUB_UINT_MAX) << 2; ^~ To avoid unnecessary error the testcase is enabled only when GRUB_LONG_MAX is larger than GRUB_INT_MAX. Reviewed-by: Daniel Kiper Tested-by: Stefan Berger 2024-11-28 Gary Lin asn1_test: Use the grub-specific functions and types This commit converts functions and types to the grub-specific ones: - LONG_MAX -> GRUB_LONG_MAX, - INT_MAX -> GRUB_INT_MAX, - UINT_MAX -> GRUB_UINT_MAX, - size_t -> grub_size_t, - memcmp() -> grub_memcmp(), - memcpy() -> grub_memcpy(), - free() -> grub_free(), - strcmp() -> grub_strcmp(). Reviewed-by: Daniel Kiper Tested-by: Stefan Berger 2024-11-28 Gary Lin asn1_test: Print the error messages with grub_printf() This commit replaces printf() and fprintf() with grub_printf() to print the error messages for the testcases. Besides, asn1_strerror() is used to convert the result code to strings instead of asn1_perror(). Reviewed-by: Daniel Kiper Tested-by: Stefan Berger 2024-11-28 Gary Lin asn1_test: Remove "verbose" and the unnecessary printf() This commit removes the "verbose" variables and the unnecessary printf() to simplify the output. Reviewed-by: Daniel Kiper Tested-by: Stefan Berger 2024-11-28 Gary Lin asn1_test: Return either 0 or 1 to reflect the results Some testcases use exit() to end the test. Since all the asn1 testcases are invoked as functions, this commit replaces exit() with return to reflect the test results, so that the main test function can check the results. Reviewed-by: Daniel Kiper Tested-by: Stefan Berger 2024-11-28 Gary Lin asn1_test: Rename the main functions to the test names This commit changes the main functions in the testcases to the test names so that the real "main" test function can invokes them. Reviewed-by: Daniel Kiper Tested-by: Stefan Berger 2024-11-28 Gary Lin asn1_test: Include asn1_test.h only This commit removes all the headers and only uses asn1_test.h. To avoid including int.h from grub-core/lib/libtasn1-grub/lib, CONST_DOWN is defined in reproducers.c. Reviewed-by: Daniel Kiper Tested-by: Stefan Berger 2024-11-28 Gary Lin libtasn1: Fix the potential buffer overrun In _asn1_tag_der(), the first while loop for the long form may end up with a "k" value with "ASN1_MAX_TAG_SIZE" and cause the buffer overrun in the second while loop. This commit tweaks the conditional check to avoid producing a too large "k". This is a quick fix and may differ from the official upstream fix. libtasn1 issue: https://gitlab.com/gnutls/libtasn1/-/issues/49 Reviewed-by: Daniel Kiper Tested-by: Stefan Berger 2024-11-28 Gary Lin libtasn1: Use grub_divmod64() for division Replace a 64-bit division with a call to grub_divmod64(), preventing creation of __udivdi3() calls on 32-bit platforms. Reviewed-by: Daniel Kiper Tested-by: Stefan Berger 2024-11-28 Gary Lin libtasn1: Adjust the header paths in libtasn1.h Since libtasn1.h is the header to be included by users, including the standard POSIX headers in libtasn1.h would force the user to add the CFLAGS/CPPFLAGS for the POSIX headers. This commit adjusts the header paths to use the grub headers instead of the standard POSIX headers, so that users only need to include libtasn1.h to use libtasn1 functions. Reviewed-by: Daniel Kiper Tested-by: Stefan Berger 2024-11-28 Gary Lin libtasn1: Replace strcat() with _asn1_str_cat() strcat() is not available in GRUB. This commit replaces strcat() and _asn1_strcat() with the bounds-checking _asn1_str_cat(). Reviewed-by: Daniel Kiper Tested-by: Stefan Berger 2024-11-28 Gary Lin libtasn1: Replace strcat() with strcpy() in _asn1_str_cat() strcat() is not available in GRUB. This commit replaces strcat() with strcpy() in _asn1_str_cat() as the preparation to replace other strcat() with the bounds-checking _asn1_str_cat(). Reviewed-by: Daniel Kiper Tested-by: Stefan Berger 2024-11-28 Gary Lin libtasn1: Disable code not needed in GRUB We don't expect to be able to write ASN.1, only read it, so we can disable some code. Do that with #if 0/#endif, rather than deletion. This means that the difference between upstream and GRUB is smaller, which should make updating libtasn1 easier in the future. With these exclusions we also avoid the need for minmax.h, which is convenient because it means we don't have to import it from gnulib. Reviewed-by: Daniel Kiper Tested-by: Stefan Berger 2024-11-28 Daniel Axtens libtasn1: Import libtasn1-4.19.0 Import a very trimmed-down set of libtasn1 files: curl -L -O https://ftp.gnu.org/gnu/libtasn1/libtasn1-4.19.0.tar.gz tar xvzf libtasn1-4.19.0.tar.gz rm -rf grub-core/lib/libtasn1 mkdir -p grub-core/lib/libtasn1/lib mkdir -p grub-core/lib/libtasn1/tests cp libtasn1-4.19.0/{README.md,COPYING} grub-core/lib/libtasn1 cp libtasn1-4.19.0/lib/{coding.c,decoding.c,element.c,element.h,errors.c,gstr.c,gstr.h,int.h,parser_aux.c,parser_aux.h,structure.c,structure.h} grub-core/libtasn1/lib cp libtasn1-4.19.0/lib/includes/libtasn1.h grub-core/lib/libtasn1 cp libtasn1-4.19.0/tests/{CVE-2018-1000654-1_asn1_tab.h,CVE-2018-1000654-2_asn1_tab.h,CVE-2018-1000654.c,object-id-decoding.c,object-id-encoding.c,octet-string.c,reproducers.c,Test_overflow.c,Test_simple.c,Test_strings.c} grub-core/lib/libtasn1/tests rm -rf libtasn1-4.19.0* Reviewed-by: Vladimir Serbinenko Reviewed-by: Daniel Kiper Tested-by: Stefan Berger 2024-11-28 Daniel Axtens posix_wrap: Tweaks in preparation for libtasn1 Cc: Vladimir Serbinenko Reviewed-by: Daniel Kiper Tested-by: Stefan Berger 2024-11-28 Rasmus Villemoes kern/fs: Honour file->read_hook() in grub_fs_blocklist_read() Unlike files accessed via a normal file system, the file->read_hook() is not honoured when using blocklist notation. This means that when trying to use a dedicated, 1 KiB, raw partition for the environment block and hence does something like save_env --file=(hd0,gpt9)0+2 X Y Z this fails with "sparse file not allowed", which is rather unexpected, as I've explicitly said exactly which blocks should be used. Adding a little debugging reveals that grub_file_size(file) is 1024 as expected, but total_length is 0, simply because the callback was never invoked, so blocklists is an empty list. Fix that by honouring the ->read_hook() set by the caller, also when a "file" is specified with blocklist notation. Reviewed-by: Vladimir Serbinenko Reviewed-by: Daniel Kiper 2024-11-28 Glenn Washburn docs: Fix incorrect and potentially confusing language and minor formatting Reviewed-by: Vladimir Serbinenko Reviewed-by: Daniel Kiper 2024-10-31 Andrew Hamilton docs: Correct GRUB config file name for network boot Correct the documentation for the grub.cfg searching via network that will be done based on ethernet type, -01, which was missing, and a given MAC address. Fixes: https://savannah.gnu.org/bugs/?65152 Reviewed-by: Daniel Kiper 2024-10-31 Andrew Hamilton docs: Correct chainloader UEFI secure boot info Correct documentation for UEFI secure boot to remove statement that chainloader does not work with secure boot. This was fixed by the commit 6d05264 (kern/efi/sb: Add chainloaded image as shim's verifiable object). Fixes: https://savannah.gnu.org/bugs/?62004 Reviewed-by: Daniel Kiper 2024-10-31 Andrew Hamilton docs: Correct PXE environment variables descriptions Correct documentation for pxe_default_server, pxe_default_gatway and pxe_blksize. Only pxe_default_server is actually used (alias for net_default_server). So, capture this and remove the other two. Fixes: https://savannah.gnu.org/bugs/?54480 Reviewed-by: Daniel Kiper 2024-10-31 Valentin Gehrke loader/multiboot: Do not add modules before successful download Multiboot modules that could not be read successfully, e.g. via network, should not be added to the list of modules to forward to the operating system that is to be booted subsequently. This patch is necessary because even if a grub.cfg checks whether or not a module was successfully downloaded, it is futile to retry a failed download as the corrupted module will be forwarded either way. Reviewed-by: Daniel Kiper 2024-10-31 Sudhakar Kuppusamy grub-mkimage: Add SBAT metadata into ELF note for PowerPC targets The SBAT metadata is read from CSV file and transformed into an ELF note with the -s option. Reviewed-by: Daniel Kiper 2024-10-31 Sudhakar Kuppusamy grub-mkimage: Create new ELF note for SBAT In order to store the SBAT data we create a new ELF note. The string ".sbat", zero-padded to 4 byte alignment, shall be entered in the name field. The string "SBAT"'s ASCII values, 0x53424154, should be entered in the type field. Reviewed-by: Daniel Kiper 2024-10-31 Leo Sandoval commands/legacycfg: Avoid closing file twice An internal (at Red Hat) static soure code scan detected an use-after-free scenario: Error: USE_AFTER_FREE (CWE-416): grub-2.06/grub-core/commands/legacycfg.c:194: freed_arg: "grub_file_close" frees "file". grub-2.06/grub-core/commands/legacycfg.c:201: deref_arg: Calling "grub_file_close" dereferences freed pointer "file". # 199| if (!args) # 200| { # 201|-> grub_file_close (file); # 202| grub_free (suffix); # 203| grub_free (entrysrc); So, remove the extra file close call. Reviewed-by: Daniel Kiper 2024-10-31 Daniel Kiper nx: Rename GRUB_DL_ALIGN to DL_ALIGN Rename has been skipped by mistake in the original commit. Fixes: 94649c026 (nx: Set page permissions for loaded modules) Tested-by: Sudeep Holla Reviewed-by: Ross Philipson 2024-10-31 Benjamin Herrenschmidt kern/acpi: Fix out of bounds access in grub_acpi_xsdt_find_table() The calculation of the size of the table was incorrect (copy/pasta from grub_acpi_rsdt_find_table() I assume...). The entries are 64-bit long. This causes us to access beyond the end of the table which is causing crashes during boot on some systems. Typically this is causing a crash on VMWare when using UEFI and enabling serial autodetection, as grub_acpi_find_table (GRUB_ACPI_SPCR_SIGNATURE); will goes past the end of the table (the SPCR table doesn't exits). Reviewed-by: Vladimir Serbinenko Reviewed-by: Daniel Kiper Reviewed-by: Ross Philipson Tested-by: Renata Ravanelli 2024-10-11 Mate Kukri nx: Set the NX compatible flag for the GRUB EFI images For NX the GRUB binary has to announce that it is compatible with the NX feature. This implies that when loading the executable GRUB image several attributes are true: - the binary doesn't need an executable stack, - the binary doesn't need sections to be both executable and writable, - the binary knows how to use the EFI Memory Attributes Protocol on code it is loading. This patch: - adds a definition for the PE DLL Characteristics flag GRUB_PE32_NX_COMPAT, - changes grub-mkimage to set that flag. Reviewed-by: Daniel Kiper 2024-10-11 Mate Kukri nx: Set page permissions for loaded modules For NX we need to set write and executable permissions on the sections of GRUB modules when we load them. All allocatable sections are marked readable. In addition: - SHF_WRITE sections are marked as writable, - and SHF_EXECINSTR sections are marked as executable. Where relevant for the platform the tramp and GOT areas are marked non-writable. Reviewed-by: Daniel Kiper 2024-10-11 Mate Kukri nx: Add memory attribute get/set API For NX we need to set the page access permission attributes for write and execute permissions. This patch adds two new primitives, grub_set_mem_attrs() and grub_clear_mem_attrs(), and associated constants definitions used for that purpose. For most platforms it adds a dummy implementation. On EFI platforms it implements the primitives using the EFI Memory Attribute Protocol, defined in UEFI 2.10 specification. Reviewed-by: Daniel Kiper 2024-10-11 Mate Kukri modules: Load module sections at page-aligned addresses Currently we load module sections at whatever alignment gcc+ld happened to dump into the ELF section header which is often less then the page size. Since NX protections are page based this alignment must be rounded up to page size on platforms supporting NX protections. This patch switches EFI platforms to load module sections at 4 KiB page-aligned addresses. It then changes the allocation size computation and the loader code in grub_dl_load_segments() to align the locations and sizes up to these boundaries and fills any added padding with zeros. All of this happens before relocations are applied, so the relocations factor that in with no change. Reviewed-by: Daniel Kiper 2024-10-10 Peter Jones modules: Don't allocate space for non-allocable sections Currently when loading GRUB modules we allocate space for all sections including those without SHF_ALLOC set. We then copy the sections that /do/ have SHF_ALLOC set into the allocated memory leaving some of our allocation untouched forever. Additionally, on platforms with GOT fixups and trampolines we currently compute alignment round-ups for the sections and sections with sh_size = 0. This patch removes the extra space from the allocation computation and makes the allocation computation loop skip empty sections as the loading loop does. Reviewed-By: Vladimir Serbinenko Reviewed-by: Daniel Kiper 2024-10-10 Peter Jones modules: Strip .llvm_addrsig sections and similar Currently GRUB modules built with Clang or GCC have several sections which we don't actually need or support. We already have a list of sections to skip in genmod.sh and this patch adds the following sections to that list (as well as a few newlines): - .note.gnu.property - .llvm* Note that the glob there won't work without a new enough linker but the failure is just reversion to the status quo. So, that's not a big problem. Reviewed-By: Vladimir Serbinenko Reviewed-by: Daniel Kiper 2024-10-10 Peter Jones modules: Make .module_license read-only Currently .module_license is set writable, that is, the section has the SHF_WRITE flag set, in the module's ELF headers. This probably never actually matters but it can't possibly be correct. The patch sets that data as "const" which causes that flag not to be set. Reviewed-By: Vladimir Serbinenko Reviewed-by: Daniel Kiper 2024-10-10 Daniel Kiper i386/memory: Rename PAGE_SIZE to GRUB_PAGE_SIZE and make it global This is an x86-specific thing and should be available globally. Reviewed-by: Ross Philipson Reviewed-by: Daniel Kiper 2024-10-10 Daniel Kiper i386/memory: Rename PAGE_SHIFT to GRUB_PAGE_SHIFT This fixes naming inconsistency that goes against coding style as well as helps to avoid potential conflicts and confusion as this constant is used in multiple places. Reviewed-by: Ross Philipson Reviewed-by: Daniel Kiper 2024-10-10 Daniel Kiper i386/msr: Extract and improve MSR support detection code Currently rdmsr and wrmsr commands have own MSR support detection code. This code is the same. So, it is duplicated. Additionally, this code cannot be reused by others. Hence, extract this code to a function and make it public. By the way, improve a code a bit. Additionally, use GRUB_ERR_BAD_DEVICE instead of GRUB_ERR_BUG to signal an error because errors encountered by this new routine are not bugs. Reviewed-by: Ross Philipson Reviewed-by: Daniel Kiper 2024-10-10 Daniel Kiper i386/msr: Rename grub_msr_read() and grub_msr_write() Use more obvious names which match corresponding instructions: * grub_msr_read() => grub_rdmsr(), * grub_msr_write() => grub_wrmsr(). Reviewed-by: Ross Philipson Reviewed-by: Daniel Kiper 2024-10-10 Daniel Kiper i386/msr: Merge rdmsr.h and wrmsr.h into msr.h It does not make sense to have separate headers for individual static functions. So, make one common place to store them. Reviewed-by: Ross Philipson Reviewed-by: Daniel Kiper 2024-10-10 Michael Chang commands/tpm: Skip loopback image measurement The loopback image is configured to function as a disk by being mapped as a block device. Instead of measuring the entire block device we should focus on tracking the individual files accessed from it. For example, we do not directly measure block devices like hd0 disk but the files opened from it. This method is important to avoid running out of memory since loopback images can be very large. Trying to read and measure the whole image at once could cause out of memory errors and disrupt the boot process. Reviewed-by: Daniel Kiper 2024-10-10 Michael Chang net/drivers/efi/efinet: Skip virtual VLAN devices during card enumeration Similarly to the issue described in commit c52ae4057 (efinet: skip virtual IPv4 and IPv6 devices during card enumeration) the UEFI PXE driver creates additional VLAN child devices when a VLAN ID is configured on a network interface associated with a physical NIC. These virtual VLAN devices must be skipped during card enumeration to ensure that the subsequent SNP exclusive open operation targets the correct physical card instances. Otherwise packet transfer would fail. A device path example with VLAN nodes: /MAC(123456789ABC,0x1)/Vlan(20)/IPv4(0.0.0.0,0x0,DHCP,0.0.0.0,0.0.0.0,0.0.0.0) Reviewed-by: Daniel Kiper 2024-10-10 Michael Chang efi/console: Properly clear leftover artifacts from the screen A regression in GRUB 2.12 causes the GRUB screen to become cluttered with artifacts from the previous screen whether it's the UEFI post UI, UEFI shell or any graphical UI running before GRUB. This issue occurs in situations like booting GRUB from the UEFI shell and going straight to the rescue or command shell causing visual discomfort. The regression was introduced by commit 2d7c3abd8 (efi/console: Do not set text-mode until it is actually needed). To address the screen flickering issue this commit suppresses the text-mode setting until the first output is requested. Before text-mode is set any attempt to clear the screen has no effect. This inactive period renders the clear screen ineffective in early boot stages, potentially leaving leftover artifacts that will clutter the GRUB console display, as there is no guarantee there will always be a clear screen after the first output. The issue is fixed by ensuring grub_console_cls() to work through lazy mode-setting, while also avoiding screen clearing for the hidden menu which the flicker-free patch aims to improve. Fixes: 2d7c3abd8 (efi/console: Do not set text-mode until we actually need it) Reviewed-by: Daniel Kiper 2024-10-10 Heinrich Schuchardt kern/riscv/efi/init: Use time register in grub_efi_get_time_ms() The cycle register is not guaranteed to count at constant frequency. If it is counting at all depends on the state the performance monitoring unit. Use the time register to measure time. Reviewed-by: Daniel Kiper 2024-09-05 Frediano Ziglio loader/efi/linux: Reset freed pointer Avoid dangling pointer. Code should not be reached but better safe than sorry. Reviewed-by: Daniel Kiper 2024-09-05 Frediano Ziglio loader/efi/linux: Reuse len variable Reviewed-by: Daniel Kiper 2024-09-05 Frediano Ziglio lib/x86_64/relocator_asm: Use .quad instead of .long They are single 64-bit values. Used in other assembly files too. Reviewed-by: Vladimir Serbinenko Reviewed-by: Daniel Kiper 2024-09-05 Frediano Ziglio lib/x86_64/relocator_asm: Fix comment in code The instruction uses a 64-bit immediate. Reviewed-by: Daniel Kiper 2024-09-05 Frediano Ziglio loader/efi/linux: Update comment The function called is grub_utf8_to_utf16(). Reviewed-by: Vladimir Serbinenko Reviewed-by: Daniel Kiper 2024-09-05 Vladimir Serbinenko util/grub-mkimagexx: Explicitly move modules to __bss_start for MIPS targets Assembly code looks for modules at __bss_start. Make this position explicit rather than matching BSS alignment and module alignment. Reviewed-by: Daniel Kiper 2024-09-05 Vladimir Serbinenko include/grub/offsets.h: Set mod_align to 4 on MIPS Module structure has natural alignment of 4. Respect it explicitly rather than relying on the fact that _end is usually aligned. Reviewed-by: Daniel Kiper 2024-09-05 Vladimir Serbinenko gentpl: Put boot/mips/startup_raw.S into beginning of the image Otherwise it breaks the decompressors for MIPS targets. Reviewed-by: Daniel Kiper 2024-09-05 Vladimir Serbinenko configure: Add -mno-gpopt option for mips and mipsel targets Without it compiler generates GPREL16 references which do not work with our memory layout. Reviewed-by: Daniel Kiper 2024-09-05 Vladimir Serbinenko lib/xzembed/xz_dec_bcj: Silence warning when no BCJ is available BCJ is not available for all platforms hence arguments may end up unused. Reviewed-by: Daniel Kiper 2024-09-05 Vladimir Serbinenko fs/erofs: Replace 64-bit modulo with bitwise operations Otherwise depending on compiler we end up with umoddi3 reference and failed module dependency resolution. Reviewed-by: Daniel Kiper 2024-09-05 Vladimir Serbinenko configure: Look for .otf fonts Reviewed-by: Daniel Kiper 2024-09-05 Mate Kukri loader/efi/chainloader: Do not print device path of chainloaded file Users have no reason to see this and it can break graphical boot. Reviewed-by: Daniel Kiper 2024-09-05 Andrew Hamilton docs: Document all GRUB modules Add documentation for all GRUB modules contained in the source code tree. When possible, cross-references to additional detail on commands was added from their corresponding module documentation. In addition, documentation for the file command was added. Reviewed-by: Daniel Kiper 2024-09-05 Michael Chang commands/bli: Fix crash in get_part_uuid() The get_part_uuid() function made an assumption that the target GRUB device is a partition device and accessed device->disk->partition without checking for NULL. There are four situations where this assumption is problematic: 1. The device is a net device instead of a disk. 2. The device is an abstraction device, like LVM, RAID, or CRYPTO, which is mostly logical "disk" ((lvmid/) and so on). 3. Firmware RAID may present the ESP to GRUB as an EFI disk (hd0) device if it is contained within a Linux software RAID. 4. When booting from a CD-ROM, the ESP is a VFAT image indexed by the El Torito boot catalog. The boot device is set to (cd0), corresponding to the CD-ROM image mounted as an ISO 9660 filesystem. As a result, get_part_uuid() could lead to a NULL pointer dereference and trigger a synchronous exception during boot if the ESP falls into one of these categories. This patch fixes the problem by adding the necessary checks to handle cases where the ESP is not a partition device. Additionally, to avoid disrupting the boot process, this patch relaxes the severity of the errors in this context to non-critical. Errors will be logged, but they will not prevent the boot process from continuing. Fixes: e0fa7dc84 (bli: Add a module for the Boot Loader Interface) Reviewed-By: Oliver Steffen Reviewed-by: Daniel Kiper 2024-06-20 Thomas Schmitt util/grub-mkrescue: Check existence of option arguments As reported by Victoriia Egorova in bug 65880, grub-mkrescue does not verify that the expected argument of an option like -d or -k does really exist in argv. So, check the loop counter before incrementing it inside the loop which copies argv to argp_argv. Issue an error message similar to what older versions of grub-mkrescue did with a missing argument, e.g. 2.02. Fixes: https://savannah.gnu.org/bugs/index.php?65880 Reviewed-by: Daniel Kiper 2024-06-20 Tobias Heider loader/efi/fdt: Add fdtdump command to access device tree The fdtdump command allows dumping arbitrary device tree properties and saving them to a variable similar to the smbios command. This is useful in scripts where further actions such as selecting a kernel or loading another device tree depend on the compatible or model values of the device tree provided by the firmware. For now only the root level properties of the dtb are exposed. Reviewed-by: Daniel Kiper 2024-06-20 Vladimir Serbinenko osdep/devmapper/getroot: Unmark 2 strings for translation First they're use macros so they can't be translated as-is. Second there is no point in translating them as they're too technical. Reviewed-by: Daniel Kiper 2024-06-20 Vladimir Serbinenko loader/emu/linux: Fix determination of program name Current code works only if package matches binary name transformation rules. It's often true but is not guaranteed. Fixes: https://savannah.gnu.org/bugs/?64410 Reviewed-by: Daniel Kiper 2024-06-20 Vladimir Serbinenko disk/cryptodisk: Fix translatable message Fixes: https://savannah.gnu.org/bugs/?64408 Reviewed-by: Daniel Kiper 2024-06-20 Vladimir Serbinenko tests: Add test for ZFS zstd Reviewed-by: Daniel Kiper fs/zfs/zfs: Add support for zstd compression Reviewed-by: Daniel Kiper 2024-06-20 Mate Kukri kern/efi/mm: Detect calls to grub_efi_drop_alloc() with wrong page counts Silently keeping entries in the list if the address matches, but the page count doesn't is a bad idea, and can lead to double frees. grub_efi_free_pages() have already freed parts of this block by this point, and thus keeping the whole block in the list and freeing it again at exit can lead to double frees. Reviewed-by: Daniel Kiper 2024-06-20 Mate Kukri kern/efi/mm: Change grub_efi_allocate_pages_real() to call semantically correct free function If the firmware happens to return 0 as an address of allocated pages, grub_efi_allocate_pages_real() tries to allocate a new set of pages, and then free the ones at address 0. However at that point grub_efi_store_alloc() wasn't yet called, so freeing the pages at 0 using grub_efi_free_pages() which calls grub_efi_drop_alloc() isn't necessary, so let's call b->free_pages() instead. The call to grub_efi_drop_alloc() doesn't seem particularly harmful, because it seems to do nothing if the allocation it is asked to drop isn't on the list, but the call to it is obviously unnecessary here. Reviewed-by: Daniel Kiper 2024-06-20 Mate Kukri kern/efi/mm: Change grub_efi_mm_add_regions() to keep track of map allocation size If the map was too big for the initial allocation, it was freed and replaced with a bigger one, but the free call still used the hard-coded size. Seems like this wasn't hit for a long time, because most firmware maps fit into 12K. This bug was triggered on Project Mu firmware with a big memory map, and results in the heap getting trashed and the firmware ASSERTING on corrupted heap guard values when GRUB exits. Reviewed-by: Daniel Kiper 2024-06-20 Yifan Zhao tests/util/grub-fs-tester: Fix EROFS label tests in grub-fs-tester mkfs.erofs with version < 1.6 does not support the -L option. Let's detect the version of mkfs.erofs and skip the label tests if it is not supported. Suggested-by: Glenn Washburn Reviewed-by: Daniel Kiper 2024-06-20 Glenn Washburn tests: Switch to requiring exfatprogs from exfat-utils The current Debian stable, now 12, has dropped the exfat-utils package that the exfat filesystem test requires to run. There is an exfatprogs package that replaces exfat-utils, though it is not a drop-in replacement because mkfs.exfat has differing command line option names. Note, that we're not yet switching to using the exfat kernel module because this allows the testings on kernels that do not have the module. Update mkfs.exfat usage to adhere to the different exfatprogs usage. Also, the exfatprogs mkfs.exfat, following the exfat specification more closely, only allows a maximum of 22 bytes of UTF-16 characters in the volume label compared to 30 bytes from exfat-utils. So the exfat label test is updated accordingly. Update documentation to note that exfatprogs is now needed and also exfat-fuse, which is needed do the fuse mount. Reviewed-by: Daniel Kiper 2024-06-20 Glenn Washburn tests/util/grub-shell-luks-tester: Fix detached header test getting wrong header path When $detached_header was set 1, $luksdiskfile was set to the LUKS header file path with "${detached_header:-$luksfile}" appended, which evaluates to "1". Fix this by using two statements to set $luksdiskfile. The first sets it to the header file if $detached_header is set, otherwise leave it unset. The second statement sets it to itself if it is already set, otherwise it is set to $luksfile. Fixes: a7b540e6e (tests: Add cryptomount functional test) Reviewed-by: Daniel Kiper 2024-06-20 Glenn Washburn tests/util/grub-shell: Add flexibility in QEMU firmware handling First look for firmware files in the source directory and then, if not found, look for them in locations where Debian installs them. Prefer to use the unified firmware file and, if not found, use the pflash firmware files split in to code and variables. By looking for files in the source directory first, system firmware files can be overridden and it can be ensured that the tests can be run regardless of the distro or where the system firmware files are stored. If no firmware files are found, print an error message and exit with error. If a firmware VARS file is found, use it with snapshot mode enabled, which makes the VARS writable to the virtual machine, but does not write back the changes to the file. This allows using the readonly system VARS file without copying it or using it in readonly mode, which causes the ARM machine to fail. This also gives tests effectively their own ephemeral VARS file that can be written to without causing side-effects for other tests. Reviewed-by: Daniel Kiper 2024-06-20 Glenn Washburn tests/util/grub-shell: Use pflash instead of -bios to load UEFI firmware According to the OVMF whitepaper [1]: IMPORTANT: Never pass OVMF.fd to qemu with the -bios option. That option maps the firmware image as ROM into the guest's address space, and forces OVMF to emulate non-volatile variables with a fallback driver that is bound to have insufficient and confusing semantics. Use the pflash interface instead. Currently the unified firmware file is used, which contains both firmware code and variable sections. By enabling snapshot on the pflash device, the firmware can be loaded in such a way that variables can be written to without writing to the backing file. Since pflash does no searching for firmware paths that are not absolute, unlike the -bios option, also make firmware paths absolute. Additionally, update the previous firmware paths or file names that did not correspond to ones installed by Debian. Use the q35 machine, instead of the default i440fx, for i386-efi because the default machine type does not emulate a flash device, which is now needed to load the firmware. [1] http://www.linux-kvm.org/downloads/lersek/ovmf-whitepaper-c770f8c.txt Reviewed-by: Daniel Kiper 2024-06-20 Glenn Washburn tests/util/grub-shell: Print gdbinfo if on EFI platform Allow using GDB to debug a failing QEMU test. This output does not cause issues for tests because it happens before the trim line, and so will be ignored. Reviewed-by: Daniel Kiper 2024-06-20 Glenn Washburn configure: Add Debian/Ubuntu DejaVu font path Reviewed-by: Daniel Kiper 2024-06-20 Udo Steinberg term/ns8250-spcr: Add one more 16550 debug type Type 0x01 was introduced with the ACPI DBGP table and type 0x12 was introduced with the ACPI DBG2 table. Type 0x12 is used by the ACPI SPCR table on recent AWS bare-metal instances (c6i/c7i). Also give each debug type a proper name. Reviewed-by: Glenn Washburn Reviewed-by: Daniel Kiper 2024-06-20 Vladimir Serbinenko loader/i386/multiboot_mbi: Fix handling of errors in broken aout-kludge Current code in some codepaths neither discards nor reports errors. Properly surface the error. While on it split 2 cases of unrelated variables both named err. Reviewed-by: Daniel Kiper 2024-06-20 Michael Chang net/drivers/ieee1275/ofnet: Remove 200 ms timeout in get_card_packet() to reduce input latency When GRUB image is netbooted on ppc64le, the keyboard input exhibits significant latency, reports even say that characters are processed about once per second. This issue makes interactively trying to debug a ppc64le config very difficult. It seems that the latency is largely caused by a 200 ms timeout in the idle event loop, during which the network card interface is consistently polled for incoming packets. Often, no packets arrive during this period, so the timeout nearly always expires, which blocks the response to key inputs. Furthermore, this 200 ms timeout might not need to be enforced at this basic layer, considering that GRUB performs synchronous reads and its timeout management is actually handled by higher layers, not directly in the card instance. Additionally, the idle polling, which reacts to unsolicited packets like ICMP and SLAAC, would be fine at a less frequent polling interval, rather than needing a timeout for receiving a response. For these reasons, we believe the timeout in get_card_packet() should be effectively removed. According to test results, the delay has disappeared, and it is now much easier to use interactively. Signed-Off-by: Michael Chang Tested-by: Tony Jones Reviewed-by: Daniel Kiper 2024-06-06 Hector Cao commands/efi/tpm: Re-enable measurements on confidential computing platforms The measurements for confidential computing has been introduced in the commit 4c76565b6 (efi/tpm: Add EFI_CC_MEASUREMENT_PROTOCOL support). Recently the patch 30708dfe3 (tpm: Disable the tpm verifier if the TPM device is not present) has been introduced to optimize the memory usage when a TPM device is not available on platforms. This fix prevents the tpm module to be loaded on confidential computing platforms, e.g. Intel machines with TDX enabled, where the TPM device is not available. In this patch, we propose to load the tpm module for this use case by generalizing the tpm feature detection in order to cover CC platforms. Basically, we do it by detecting the availability of the EFI_CC_MEASUREMENT_PROTOCOL EFI protocol. Fixes: https://savannah.gnu.org/bugs/?65821 Fixes: 30708dfe3 (tpm: Disable the tpm verifier if the TPM device is not present) Reviewed-by: Daniel Kiper Reviewed-by: Kuppuswamy Sathyanarayanan 2024-06-06 Tianjia Zhang util/grub-mkpasswd-pbkdf2: Simplify the main function implementation Allocate memory if needed, while saving the corresponding release operation, reducing the amount of code and code complexity. Reviewed-by: Daniel Kiper 2024-06-06 Avnish Chouhan kern/ieee1275/init: Add IEEE 1275 Radix support for KVM on Power This patch adds support for Radix, Xive and Radix_gtse in Options vector5 which is required for KVM LPARs. KVM LPARs ONLY support Radix and not the Hash. Not enabling Radix on any PowerVM KVM LPARs will result in boot failure. Reviewed-by: Daniel Kiper 2024-06-06 Vladimir Serbinenko fs/zfs/zfs: Mark vdev_zaps_v2 and head_errlog as supported We don't need any actual adjustments as we don't use the affected structures. Reviewed-by: Daniel Kiper 2024-06-06 Vladimir Serbinenko types: Add missing casts in compile-time byteswaps Without them, e.g., 0x80LL on 64-bit target is 32-bit byte-swapped to 0xffffffff80000000 instead of correct 0x80000000. Reviewed-by: Daniel Kiper 2024-06-06 Vladimir Serbinenko font: Add Fedora-specific font paths Reviewed-by: Daniel Kiper fs/bfs: Fix improper grub_free() on non-existing files Reviewed-by: Daniel Kiper 2024-06-06 Daniel Axtens io/gzio: Properly init a table ARRAY_SIZE() is the count of elements, but the element size is 4 bytes, so this was only initing the first 1/4th of the table. Detected with valgrind. This should only matter in error paths, and I've not been able to identify any actual misbehaviour that results from reading in-bounds but uninited data. Reviewed-by: Daniel Kiper 2024-06-06 Daniel Axtens io/gzio: Abort early when get_byte() reads nothing This isn't intended to be a functional change, but it makes a lot of failures a lot faster, which is extremely helpful for fuzzing. Without this change, we keep trying and trying to read more bytes into our buffer, never being able to (read always returns 0) and so we just return old buffer contents over and over until the decompression process fails some other way. Reviewed-by: Daniel Kiper 2024-06-06 Alec Brown cli_lock: Add build option to block command line interface Add functionality to disable command line interface access and editing of GRUB menu entries if GRUB image is built with --disable-cli. Reviewed-by: Vladimir Serbinenko Reviewed-by: Daniel Kiper 2024-05-23 Yifan Zhao fs/erofs: Add tests for EROFS in grub-fs-tester This patch introduces three EROFS tests which cover compact, extended and chunk-based inodes respectively. Reviewed-by: Glenn Washburn Reviewed-by: Daniel Kiper 2024-05-23 Yifan Zhao fs/erofs: Add support for the EROFS The EROFS [1] is a lightweight read-only filesystem designed for performance which has already been shipped in most Linux distributions as well as widely used in several scenarios, such as Android system partitions, container images and rootfs for embedded devices. This patch brings in the EROFS uncompressed support. Now, it's possible to boot directly through GRUB with an EROFS rootfs. Support for the EROFS compressed files will be added later. [1] https://erofs.docs.kernel.org Tested-by: Daniel Axtens Reviewed-by: Daniel Kiper 2024-05-23 Gao Xiang safemath: Add ALIGN_UP_OVF() which checks for an overflow The following EROFS patch will use this helper to handle ALIGN_UP() overflow. Reviewed-by: Daniel Kiper 2024-05-23 Jonathan Davies docs: Fix spelling mistakes Reviewed-by: Daniel Kiper 2024-05-23 Pascal Hambourg util/grub.d/00_header.in: Quote background image pathname in output This is required if the pathname contains spaces or GRUB shell metacharacters else the generated config file check will fail. Reviewed-by: Daniel Kiper 2024-05-23 Rogier disk/lvm: GRUB fails to detect LVM volumes due to an incorrect computation of mda_end When handling a regular LVM volume, GRUB can fail with the message: error: disk `lvmid/******-****-****-****-****-****-****/******-****-****-****-****-****-******' not found. If the condition which triggers this exists, grub-probe will report the error mentioned above. Similarly, the GRUB boot code will fail to detect LVM volumes, resulting in a failure to boot off of LVM disks/partitions. The condition can be created on any LVM VG by an LVM configuration change, so any system with /boot on LVM can become unbootable at "any" time (after any LVM configuration change). The problem is caused by an incorrect computation of mda_end in disk/lvm.c, when the metadata area wraps around. Apparently, this can start happening at around 220 metadata changes to the VG. Fixes: 879c4a834 (lvm: Fix two more potential data-dependent alloc overflows) Fixes: https://savannah.gnu.org/bugs/?61620 Reviewed-by: Daniel Kiper Tested-By: Michael Chang 2024-05-09 Forest disk/cryptodisk: Allow user to retry failed passphrase Give the user a chance to re-enter their cryptodisk passphrase after a typo, rather than immediately failing (and likely dumping them into a GRUB shell). By default, we allow 3 tries before giving up. A value in the cryptodisk_passphrase_tries environment variable will override this default. The user can give up early by entering an empty passphrase, just as they could before this patch. Reviewed-by: Daniel Kiper 2024-05-09 Lidong Chen disk/mdraid1x_linux: Prevent infinite recursion The test corpus for version-1 RAID generated an infinite recursion in grub_partition_iterate() while attempting to read the superblock. The reason for the issue was that the data region overlapped with the superblock. The infinite call loop looks like this: grub_partition_iterate() -> partmap->iterate() -> -> grub_disk_read() -> grub_disk_read_small() -> -> grub_disk_read_small_real() -> grub_diskfilter_read() -> -> read_lv() -> read_segment() -> grub_diskfilter_read_node() -> -> grub_disk_read() -> grub_disk_read_small() -> ... The fix adds checks for both the superblock region and the data region when parsing the superblock metadata in grub_mdraid_detect(). Reviewed-by: Daniel Kiper 2024-05-09 Ard Biesheuvel efi: Fix stack protector issues The "ground truth" stack protector cookie value is kept in a global variable, and loaded in every function prologue and epilogue to store it into resp. compare it with the stack slot holding the cookie. If the comparison fails, the program aborts, and this might occur spuriously when the global variable changes values between the entry and exit of a function. This implies that assigning the global variable at boot should not involve any instrumented function calls, unless special care is taken to ensure that the live call stack is synchronized, which is non-trivial. So avoid any function calls, including grub_memcpy(), which is unnecessary given that the stack cookie is always a suitably aligned variable of the native word size. While at it, leave the last byte 0x0 to avoid inadvertent unbounded strings on the stack. Note that the use of __attribute__((optimize)) is described as unsuitable for production use in the GCC documentation, so let's drop this as well now that it is no longer needed. Reviewed-by: Daniel Kiper 2024-05-09 Oliver Steffen build: Track explicit module dependencies in Makefile.core.def Add a new keyword, "depends", to the module definition syntax used in Makefile.core.def. This allows specifying explicit module dependencies together with the module definition. Do not track the "extra_deps.lst" file in the repository anymore, it is now auto-generated. Make use of this new keyword in the bli module definition. Reviewed-by: Daniel Kiper 2024-04-11 Daniel Kiper windows: Add _stack_chk_guard/_stack_chk_fail symbols for Windows 64-bit target Otherwise the GRUB cannot start due to missing symbols when stack protector is enabled on EFI platforms. Reviewed-by: Vladimir Serbinenko 2024-04-11 Gary Lin util/bash-completion: Fix for bash-completion 2.12 _split_longopt() was the bash-completion private API and removed since bash-completion 2.12. This commit initializes the bash-completion general variables with _init_completion() to avoid the potential "command not found" error. Although bash-completion 2.12 introduces _comp_initialize() to deprecate _init_completion(), _init_completion() is still chosen for the better backward compatibility. Reviewed-by: Daniel Kiper 2024-04-11 Vladimir 'phcoder' Serbinenko util/grub-fstest: Add a new command zfs-bootfs It is useful to check zfs-bootfs command. Reviewed-by: Daniel Kiper 2024-04-11 Vladimir 'phcoder' Serbinenko efi: Enable CMOS on x86 EFI platforms The CMOS actually exists on most EFI platforms and in some cases is used to store useful data that makes it justifiable for GRUB to read/write it. As for date and time keep using EFI API and not CMOS one. Reviewed-by: Daniel Kiper 2024-04-11 Vladimir 'phcoder' Serbinenko acpi: Mark MADT entries as packed No alignment is guaranteed and in fact on my IA-64 SAPIC is aligned to 4 bytes instead of 8 and causes a trap. It affects only rarely used lsacpi command and so went unnoticed. Reviewed-by: Daniel Kiper 2024-04-11 Michael Chang gfxmenu/view: Resolve false grub_errno disrupting boot process When enabling gfxmenu and choosing to boot the Xen hypervisor from its menu, an error occurred: error: ../../grub-core/video/bitmap_scale.c:42:null src bitmap in grub_video_create_scaled. The error is returned by grub_video_bitmap_create_scaled() when the source pixmap is not there. The init_background() uses it to scale up the background image so it can fully fit into the screen resolution. However not all backgrounds are set by a image, i.e. the "desktop-image" property of the theme file. Instead a color code may be used, for example OpenSUSE's green background uses "desktop-color" property: desktop-color: "#0D202F" So it is absolutely fine to call init_background() without a raw pixmap if color code is used. A missing check has to be added to ensure the grub_errno will not be erroneously set and gets in the way of ensuing boot process. The reason it happens sporadically is due to grub_errno is reset to GRUB_ERR_NONE in other places if a function's error return can be ignored. In particular this hunk in grub_gfxmenu_create_box() does the majority of the reset of grub_errno returned by init_background(), but the path may not be always chosen. grub_video_bitmap_load (&box->raw_pixmaps[i], path); grub_free (path); /* Ignore missing pixmaps. */ grub_errno = GRUB_ERR_NONE; In any case, we cannot account on such random behavior and should only return grub_errno if it is justified. On the occasion move the grub_video_bitmap struct definition to the beginning of the function. Reviewed-by: Daniel Kiper 2024-04-11 Jon DeVree fs/xfs: Handle non-continuous data blocks in directory extents The directory extent list does not have to be a continuous list of data blocks. When GRUB tries to read a non-existant member of the list, grub_xfs_read_file() will return a block of zero'ed memory. Checking for a zero'ed magic number is sufficient to skip this non-existant data block. Prior to commit 07318ee7e (fs/xfs: Fix XFS directory extent parsing) this was handled as a subtle side effect of reading the (non-existant) tail data structure. Since the block was zero'ed the computation of the number of directory entries in the block would return 0 as well. Fixes: 07318ee7e (fs/xfs: Fix XFS directory extent parsing) Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=2254370 Reviewed-By: Vladimir Serbinenko Reviewed-by: Daniel Kiper 2024-02-15 Julian Andres Klode Revert "templates: Reinstate unused version comparison functions with warning" We reinstated these functions before the 2.12 release with a warning such that users upgrading to 2.12 who had custom scripts using them would not get broken in the upgrade and agreed to remove them after the 2.12 release. This removes them accordingly. This reverts commit e7a831963 (templates: Reinstate unused version comparison functions with warning). Cc: Mathieu Desnoyers Cc: Daniel Kiper Reviewed-by: Daniel Kiper 2024-02-15 Gary Lin util/bash-completion: Load scripts on demand There are two system directories for bash-completion scripts. One is /usr/share/bash-completion/completions/ and the other is /etc/bash_completion.d/. The "etc" scripts are loaded in advance and for backward compatibility while the "usr" scripts are loaded on demand. To load scripts on demand it requires a corresponding script for every command. So, the main bash-completion script is split into several subscripts for different "grub-*" commands. To share the code the real completion functions are still implemented in "grub" and each subscript sources "grub" and invokes the corresponding function. Reviewed-by: Daniel Kiper 2024-01-25 Samuel Thibault util/grub.d/10_hurd.in: Find proper ld.so on 64-bit systems The 64-bit ABI defines ld.so to be /lib/ld-x86-64.so.1. Reviewed-by: Daniel Kiper 2024-01-25 Samuel Thibault osdep/hurd/getroot: Fix 64-bit build The file_get_fs_options() takes a mach_msg_type_number_t, 32-bit, not a size_t, 64-bit on 64-bit platforms. Reviewed-by: Vladimir Serbinenko Reviewed-by: Daniel Kiper 2024-01-25 Alec Brown loader/i386/multiboot_mbi: Clean up redundant code In grub-core/loader/i386/multiboot_mbi.c, Coverity spotted redundant code where the variable err was being set to GRUB_ERR_NONE and then being overwritten later without being used. Since this is unnecessary, we can remove the code that sets err to GRUB_ERR_NONE. Fixes: CID 428877 Reviewed-by: Daniel Kiper 2024-01-25 Alec Brown osdep/unix/getroot: Clean up redundant code In grub-core/osdep/unix/getroot.c, Coverity spotted redundant code where the double pointer os_dev was being set to 0 and then being overwritten later without being used. Since this is unnecessary, we can remove the code that sets os_dev to 0. Fixes: CID 428875 Reviewed-by: Daniel Kiper 2024-01-25 Alec Brown fs/jfs: Clean up redundant code In grub-core/fs/jfs.c, Coverity spotted redundant code where the pointer diro was being set to 0 and then being overwritten later without being used. Since this is unnecessary, we can remove the code that sets diro to 0. Fixes: CID 428876 Reviewed-by: Daniel Kiper 2024-01-25 Gary Lin tests: Switch password quality check off for luks2 test When adding/changing the password for the luks2 partition, cryptsetup may reject the command due to the weak password. Since this is only for testing, add "--force-password" to switch password quality check off to avoid the unexpected failure. Reviewed-by: Glenn Washburn Reviewed-by: Daniel Kiper 2023-12-22 Oskari Pirhonen build: Include grub-core/extra_deps.lst in dist Fixes build failure due to the extra_deps.lst file not existing in the tarball. Found while trying to package GRUB 2.12 for Gentoo. make[3]: *** No rule to make target '/var/tmp/portage/sys-boot/grub-2.12/work/grub-2.12/grub-core/extra_deps.lst', needed by 'syminfo.lst'. Stop. Fixes: 89fbe0cac (grub-core/Makefile.am: Make path to extra_deps.lst relative to $(top_srcdir)/grub-core) Fixes: 154dcb1ae (build: Allow explicit module dependencies) Reviewed-by: Daniel Kiper 2023-12-20 Daniel Kiper Bump version to 2.13 Release 2.12 2023-12-20 Glenn Washburn efi: Add support for reproducible builds Having randomly generated bytes in the binary output breaks reproducible builds. Since build timestamps are usually the source of irreproducibility there is a standard which defines an environment variable SOURCE_DATE_EPOCH to be used when set for build timestamps. According to the standard [1], the value of SOURCE_DATE_EPOCH is a base-10 integer of the number of seconds since the UNIX epoch. Currently, this is a 10 digit number that fits into 32-bits, but will not shortly after the year 2100. So to be future-proof only use the least significant 32-bits. On 64-bit architectures, where the canary is also 64-bits, there is an extra 32-bits that can be filled to provide more entropy. The first byte is NUL to filter out string buffer overflow attacks and the remaining 24-bits are set to static random bytes. [1] https://reproducible-builds.org/specs/source-date-epoch Reviewed-by: Daniel Kiper 2023-12-20 Glenn Washburn efi: Generate stack protector canary at build time if urandom is available Generating the canary at build time allows the canary to be different for every build which could limit the effectiveness of certain exploits. Fallback to the statically generated random bytes if /dev/urandom is not readable, e.g. Windows. On 32-bit architectures, which use a 32-bit canary, reduce the canary to 4 bytes with one byte being NUL to filter out string buffer overflow attacks. Reviewed-by: Daniel Kiper 2023-12-20 Glenn Washburn efi: Initialize canary to non-zero value The canary, __stack_chk_guard, is in the BSS and so will get initialized to zero if it is not explicitly initialized. If the UEFI firmware does not support the RNG protocol, then the canary will not be randomized and will be zero. This seems like a possibly easier value to write by an attacker. Initialize canary to static random bytes, so that it is still random when there is no RNG protocol. Set at least one byte to NUL to protect against string buffer overflow attacks [1]. Code that writes NUL terminated strings will terminate when a NUL is encountered in the input byte stream. So the attacker will not be able to forge the canary by including it in the input stream without terminating the string operation and thus limiting the stack corruption. [1] https://www.sans.org/blog/stack-canaries-gingerly-sidestepping-the-cage/ Reviewed-by: Daniel Kiper 2023-12-14 Alec Brown gfxmenu/gui_image: Fix double free of bitmap In grub-core/gfxmenu/gui_image.c, Coverity detected a double free in the function load_image(). The function checks if self->bitmap and self->raw_bitmap aren't NULL and then frees them. In the case self->bitmap and self->raw_bitmap are the same, only self->raw_bitmap is freed which would also free the memory used by self->bitmap. However, in this case self->bitmap isn't being set to NULL which could lead to a double free later in the code. After self->raw_bitmap is freed, it gets set to the variable bitmap. If this variable is NULL, the code could have a path that would free self->bitmap a second time in the function rescale_image(). Fixes: CID 292472 Reviewed-by: Daniel Kiper 2023-12-13 Qiumiao Zhang commands/acpi: Fix calculation of ACPI tables addresses when processing RSDT and XSDT According to the ACPI specification the XSDT Entry field contains an array of 64-bit physical addresses which points to other DESCRIPTION_HEADERs. However, the entry_ptr iterator is defined as a 32-bit pointer. It means each 64-bit entry in the XSDT table is treated as two separate 32-bit entries then. Fix the issue by using correct addresses sizes when processing RSDT and XSDT tables. Reviewed-by: Daniel Kiper 2023-12-13 Vladimir Serbinenko libnvpair: Support prefixed nvlist symbol names as found on NetBSD NetBSD uses slightly different function names for the same functions. Reviewed-by: Daniel Kiper 2023-12-13 Vladimir Serbinenko bootstrap: Don't check gettext version NetBSD gettext is older than the check but we don't actually need 0.18.3, older one works fine. This is needed to make bootstrap work on NetBSD. Reviewed-by: Daniel Kiper 2023-12-13 Vladimir Serbinenko kern/mm: Use %x and cast for displaying sizeof() There is some variance in how compiler treats sizeof() especially on 32-bit platforms where it can be naturally either int or long. Explicit cast solves the issue. Reviewed-by: Daniel Kiper 2023-12-13 Vladimir Serbinenko configure: Add RPATH for freetype on NetBSD Without this build-time mkfont fails dynamic linking. This is not ideal but improves the situation until a better solution is available. Reviewed-by: Daniel Kiper 2023-12-13 Vladimir Serbinenko configure: Add *BSD font paths *BSD puts fonts in other places. Add them to the list. Reviewed-by: Daniel Kiper 2023-12-13 Vladimir Serbinenko autogen: Accept python3.10 as a python alternative NetBSD doesn't provide python or python3. Reviewed-by: Daniel Kiper 2023-12-12 Vladimir Serbinenko build: Rename HAVE_LIBZFS to USE_LIBZFS The HAVE_LIBZFS is defined by libzfs test and hence conflicts with manual definition. On NetBSD it ends up detecting zfs but not detecting nvpair and creates confusion. Split them. Reviewed-by: Daniel Kiper 2023-12-12 Vladimir Serbinenko gnulib: Tolerate always_inline attribute being ignored It's not critical, -Werror on it is inappropriate. We don't want to modify gnulib too much. This warning is pretty much irrelevant. Reviewed-by: Daniel Kiper 2023-12-12 Vladimir Serbinenko util/editenv: Don't use %m formatter It's not available on NetBSD outside of syslog. Using strerror() is more reliable as we retrieve errno immediately rather than down the stack. Reviewed-by: Daniel Kiper 2023-12-12 Vladimir Serbinenko osdep/bsd/hostdisk: Fix NetBSD compilation Wrong function and variable name cause a stupid compilation error on NetBSD and OpenBSD. Only NetBSD and OpenBSD use this file. No other platform is affected. Additionally, define RAW_FLOPPY_MAJOR constant if it is missing. Reviewed-by: Daniel Kiper 2023-12-12 Vladimir Serbinenko osdep/generic/blocklist: Fix compilation After recent change in blocklist types we have a type mismatch. Fixing it requires a wrapper or large changes. I feel like wrapper makes more sense. Without this patch we end up with a compilation problem and without wrapping callback data is not passed properly anymore. Reviewed-by: Daniel Kiper 2023-12-12 Vladimir Serbinenko disk/diskfilter: Remove unused variable Variable e is set but never used. We can just remove it now. Reviewed-by: Daniel Kiper 2023-12-12 Vladimir Serbinenko build: Tolerate unused-but-set in generated lexer/bison files We don't really control the small aspects of generated files and NetBSD version has an unused variable that is then detected by gcc as warning that is then promoted to error. Reviewed-by: Daniel Kiper 2023-12-12 Vladimir Serbinenko loader/i386/bsdXX: Fix loading after unaligned module Current code implicitly assumes that aligning chunk_size + *kern_end is the same as aligning on curload which is not the case because chunk_size starts at zero even if *kern_end is unaligned and ALIGN_PAGE moved curload to an aligned position but not *kern_end + chunk_size. This fixes booting of FreeBSD with zfs module. Reviewed-by: Daniel Kiper 2023-12-12 Mate Kukri grub-core/Makefile.am: Make path to extra_deps.lst relative to $(top_srcdir)/grub-core The commit 154dcb1ae (build: Allow explicit module dependencies) broke out of tree builds by introducing the extra_deps.lst file into the source tree but referencing it just by name in grub-core/Makefile.am. Fix it by adding $(top_srcdir)/grub-core to the path. Fixes: 154dcb1ae (build: Allow explicit module dependencies) Reviewed-by: Daniel Kiper 2023-12-12 Mate Kukri util/grub-install: Move platdir path canonicalization after files were copied to grubdir The commit 3f9eace2d (util/grub-install: Delay copying files to {grubdir,platdir} after install_device was validated) delaying copying of files caused a regression when installing without an existing directory structure. This patch ensures that the platform directory actually exists by the time the code tries to canonicalize its filename. Fixes: 3f9eace2d (util/grub-install: Delay copying files to {grubdir,platdir} after install_device was validated) Reviewed-by: Daniel Kiper 2023-12-12 Michael Chang util/grub-mkstandalone: Ensure deterministic tar file creation by sorting contents The add_tar_files() function currently iterates through a directory's content using readdir(), which doesn't guarantee a specific order. This lack of deterministic behavior impacts reproducibility in the build process. This commit resolves the issue by introducing sorting functionality. The list retrieved by readdir() is now sorted alphabetically before incorporation into the tar archive, ensuring consistent and predictable file ordering within the archive. On the occasion fix tfp memory leak. Reviewed-by: Daniel Kiper 2023-12-12 Michael Chang util/grub-mkstandalone: Ensure stable timestamps for generated images This change mirrors a previous fix [1] but is specific to images generated by grub-mkstandalone. The former fix, commit 85a7be241 (util/mkimage: Use stable timestamp when generating binaries.), focused on utilizing a stable timestamp during binary generation in the util/mkimage context. This commit extends that approach to the images produced by grub-mkstandalone, ensuring consistency and stability in timestamps across all generated binaries. [1] 85a7be241 util/mkimage: Use stable timestamp when generating binaries. Reviewed-by: Daniel Kiper 2023-12-05 Mate Kukri net/http: Fix gcc-13 errors relating to type signedness Replace definition of HTTP_PORT with a pre-processor macro that converts the constant to the correct grub_uint16_t type. Change "port" local variable definition in http_establish() to have the same type. Reviewed-by: Daniel Kiper templates: Reinstate unused version comparison functions with warning Revert the commit a79c567f6 (templates: Remove unused version comparison functions) and add a warning to the functions that they are deprecated. Removing the functions directly caused a lot of upgrade issues with custom user scripts that called the functions. In Debian and Ubuntu, grub-mkconfig is invoked as a post-installation script and would fail, causing upgrades to fail halfway through and putting the package manager into an inconsistent state. FWIW, we get one bug per 2 weeks basically, for an interim Ubuntu release which generally does not receive much usage, that is a high number. The proposal is to pick this for 2.12 and directly after the release remove it again. Then users will have time to fix their scripts without systems breaking immediately. This reverts commit a79c567f6 (templates: Remove unused version comparison functions). Cc: Mathieu Desnoyers Cc: Daniel Kiper Reviewed-by: Daniel Kiper 2023-12-05 Mate Kukri util/grub-install: Delay copying files to {grubdir,platdir} after install_device was validated Previously grub-install copied modules to grubdir before doing any validation on the install_device. When grub-install was called with an invalid install_device, modules were already copied to /boot before it found out and was forced to rely on atexit() rollback. This patch delays copying the modules after at least some install_device validation was done, and thus reduces reliance on successful rollback. Reviewed-by: Daniel Kiper 2023-12-05 Julian Andres Klode efi: Set shim_lock_enabled even if validation is disabled If validation has been disabled via MokSbState, secure boot on the firmware is still enabled, and the kernel fails to boot. This is a bit hacky, because shim_lock is not *fully* enabled, but it triggers the right code paths. Ultimately, all this will be resolved by shim gaining it's own image loading and starting protocol, so this is more a temporary workaround. Fixes: 6425c12cd (efi: Fallback to legacy mode if shim is loaded on x86 archs) Cc: Peter Jones Cc: Michael Chang Reviewed-by: Daniel Kiper 2023-12-05 Oliver Steffen docs: Improve bli module documentation Improve the documentation of the bli module and explain in more detail what it does. Make clear that GPT formatted drives are expected and other partition formats are ignored. Also reorder and reword this section a bit. Reviewed-by: Daniel Kiper 2023-12-05 Oliver Steffen bli: Add explicit dependency on the part_gpt module The bli module has a "hidden" dependency on the part_gpt module, which is not picked up automatically by the build system. One purpose of the bli module is to communicate the GPT UUID of the partition GRUB was launched from to Linux user-space (systemd-gpt-auto-generator). Without the part_gpt module, bli is not able to obtain the UUID. Since bli does its work in the module initialization function, the order in which the modules are loaded is also important: part_gpt needs to be loaded before the bli module. To solve this, track this dependency explicitly. Note that the Boot Loader Interface specification, which bli aims to implement, requires GPT formatted drives. The bli module ignores all other partition formats. Reviewed-by: Daniel Kiper 2023-12-05 Oliver Steffen build: Allow explicit module dependencies The build system deduces inter-module dependencies from the symbols required and exported by the modules. This works well, except for some rare cases where the dependency is indirect or hidden. A module might not make use of any function of some other module, but still expect its functionality to be available to GRUB. To solve this, introduce a new file, currently empty, called extra_deps.lst to track these cases manually. This file gets processed in the same way as the automatically generated syminfo.lst, making it possible to inject data into the dependency resolver. Since *.lst files are set to be ignored by git, add an exception for extra_deps.lst. Additionally, introduce a new keyword for the syminfo.lst syntax: "depends" allows specifying a module dependency directly: depends ... Reviewed-by: Daniel Kiper 2023-12-05 Stefan Berger kern/ieee1275/init/ppc64: Display upper_mem_limit when debugging Display upper_mem_limit and its rounded-down value in MiB. Reviewed-by: Daniel Kiper 2023-12-05 Stefan Berger kern/ieee1275/init/ppc64: Fix a comment Reviewed-by: Daniel Kiper 2023-12-05 Stefan Berger kern/ieee1275/ieee1275: Display successful memory claims when debugging Display successful memory claims with exact address and rounded-down MiB location and rounded-up size in MiB. Reviewed-by: Daniel Kiper Cc: Eric Snowberg Cc: Hari Bathini Cc: Pavithra Prakash Cc: Michael Ellerman Cc: Carolyn Scherrer Cc: Mahesh Salgaonkar Cc: Sourabh Jain 2023-12-05 Stefan Berger loader/powerpc/ieee1275: Use new allocation function for kernel and initrd On PowerVM and KVM on Power use the new memory allocation function that honors restrictions on which memory GRUB can actually use. In the request structure indicate the request for a single memory block along with address alignment restrictions. Request direct usage of the memory block by setting init_region to false (prevent it from being added to GRUB's heap). Initialize the found addr to -1, so that -1 will be returned to the loader in case no memory could be allocated. Report an out-of-memory error in case the initrd could not be loaded. Reviewed-by: Daniel Kiper Cc: Hari Bathini Cc: Pavithra Prakash Cc: Michael Ellerman Cc: Carolyn Scherrer Cc: Mahesh Salgaonkar Cc: Sourabh Jain 2023-12-05 Stefan Berger kern/ieee1275/cmain/ppc64: Introduce flags to identify KVM and PowerVM Introduce flags to identify PowerVM and KVM on Power and set them where each type of host has been detected. Reviewed-by: Daniel Kiper Cc: Hari Bathini Cc: Pavithra Prakash Cc: Michael Ellerman Cc: Carolyn Scherrer Cc: Mahesh Salgaonkar Cc: Sourabh Jain 2023-12-05 Stefan Berger kern/ieee1275/init/ppc64: Rename regions_claim() to grub_regions_claim() Rename regions_claim() to grub_regions_claim() to make it available for memory allocation. The ieee1275 loader will use this function on PowerVM and KVM on Power and thus avoid usage of memory that it is not allowed to use. Reviewed-by: Daniel Kiper Cc: Hari Bathini Cc: Pavithra Prakash Cc: Michael Ellerman Cc: Carolyn Scherrer Cc: Mahesh Salgaonkar Cc: Sourabh Jain 2023-12-05 Stefan Berger kern/ieee1275/init/ppc64: Add support for alignment requirements Add support for memory alignment requirements and adjust a candidate address to it before checking whether the block is large enough. This must be done in this order since the alignment adjustment can make a block smaller than what was requested. None of the current callers has memory alignment requirements but the ieee1275 loader for kernel and initrd will use it to convey them. Reviewed-by: Daniel Kiper Cc: Hari Bathini Cc: Pavithra Prakash Cc: Michael Ellerman Cc: Carolyn Scherrer Cc: Mahesh Salgaonkar Cc: Sourabh Jain 2023-12-05 Stefan Berger kern/ieee1275/init/ppc64: Return allocated address using context Return the allocated address of the memory block in the request structure if a memory allocation was actually done. Leave the address untouched otherwise. This enables a caller who wants to use the allocated memory directly, rather than adding the memory to the heap, to see where memory was allocated. None of the current callers need this but the converted ieee1275 loader will make use of it. Reviewed-by: Daniel Kiper Cc: Hari Bathini Cc: Pavithra Prakash Cc: Michael Ellerman Cc: Carolyn Scherrer Cc: Mahesh Salgaonkar Cc: Sourabh Jain 2023-12-05 Stefan Berger kern/ieee1275/init/ppc64: Decide by request whether to initialize region Let the regions_claim() request structure's init_region determine whether to call grub_mm_init_region() on it. This allows for adding memory to GRUB's memory heap if init_region is set to true, or direct usage of the memory otherwise. Set all current callers' init_region to true since they want to add memory regions to GRUB's heap. Reviewed-by: Daniel Kiper Cc: Hari Bathini Cc: Pavithra Prakash Cc: Michael Ellerman Cc: Carolyn Scherrer Cc: Mahesh Salgaonkar Cc: Sourabh Jain 2023-12-05 Stefan Berger kern/ieee1275/init/ppc64: Introduce a request for regions_claim() The regions_claim() function limits the allocation of memory regions by excluding certain memory areas from being used by GRUB. This for example includes a gap between 640MB and 768MB as well as an upper limit beyond which no memory may be used when an fadump is present. However, the ieee1275 loader for kernel and initrd currently does not use regions_claim() for memory allocation on PowerVM and KVM on Power and therefore may allocate memory in those areas that it should not use. To make the regions_claim() function more flexible and ultimately usable for the ieee1275 loader, introduce a request structure to pass various parameters to the regions_claim() function that describe the properties of requested memory chunks. In a first step, move the total and flags variables into this structure. Reviewed-by: Daniel Kiper Cc: Hari Bathini Cc: Pavithra Prakash Cc: Michael Ellerman Cc: Carolyn Scherrer Cc: Mahesh Salgaonkar Cc: Sourabh Jain 2023-11-22 Anthony Iliopoulos fs/xfs: Add large extent counters incompat feature support XFS introduced 64-bit extent counters for inodes via a series of upstream commits and the feature was marked as stable in v6.5 via commit 61d7e8274cd8 (xfs: drop EXPERIMENTAL tag for large extent counts). Further, xfsprogs release v6.5.0 switched this feature on by default in mkfs.xfs via commit e5b18d7d1d96 (mkfs: enable large extent counts by default). Filesystems formatted with large extent count support, nrext64=1, are thus currently not recognizable by GRUB, since this is an incompat feature. Add the required support so that those filesystems and inodes with large extent counters can be read by GRUB. Reviewed-by: Andrey Albershteyn Reviewed-by: Daniel Kiper Tested-by: Marta Lewandowska Tested-by: Sebastian Andrzej Siewior 2023-11-08 Vladimir Serbinenko gpt: Add compile time asserts for guid and gpt_partentry sizes With new alignment specification it's easy to screw up. Fortunately if it happens the size will be bigger than intended. Compile time assert will catch this. Reviewed-by: Daniel Kiper 2023-11-08 Vladimir Serbinenko types: Split aligned and packed guids On ia64 alignment requirements are strict. When we pass a pointer to UUID it needs to be at least 4-byte aligned or EFI will crash. On the other hand in device path there is no padding for UUID, so we need 2 types in one formor another. Make 4-byte aligned and unaligned types The code is structured in a way to accept unaligned inputs in most cases and supply 4-byte aligned outputs. Efiemu case is a bit ugly because there inputs and outputs are reversed and so we need careful casts to account for this inversion. Reviewed-by: Daniel Kiper 2023-11-06 Vladimir Serbinenko gpt_partition: Mark grub_gpt_partentry as having natural alignment gpt_partition contains grub_guid. We need to decide whether the whole structure is unaligned and then we need to use packed_guid. But we never have unaligned part entries as we read them in an aligned buffer from disk. Hence just make it all aligned. 2023-11-06 Vladimir Serbinenko efi: Deduplicate configuration table search function We do table search in many places doing exactly the same algorithm. The only minor variance in users is which table is used if several entries are present. As specification mandates uniqueness and even if it ever isn't, first entry is good enough, unify this code and always use the first entry. Reviewed-by: Daniel Kiper 2023-11-06 Vladimir Serbinenko lsefi: Add missing static qualifier known_protocols isn't used anywhere else and even misses grub_ prefix, so let's make it local (static). Reviewed-by: Daniel Kiper 2023-11-06 Vladimir Serbinenko types: Fix typo Just a small grammar mistake. Reviewed-by: Daniel Kiper 2023-10-30 Qiumiao Zhang util/grub-mount: Check file path sanity The function argp_parser() in util/grub-mount.c lacks a check on the sanity of the file path when parsing parameters. This results in a segmentation fault if a partition is mounted to a non-existent path. Reviewed-by: Daniel Kiper 2023-10-30 Richard Marko configure: Make the DJVU_FONT_SOURCE configurable with --with-dejavufont=FILE Font might be located in different location, the default font might not be available on all systems or other font might be preferred. Reviewed-by: Daniel Kiper 2023-10-30 Mads Kiilerich configure: Make the Unifont FONT_SOURCE configurable with --with-unifont=FILE Font might be located in different location, the default font might not be available on all systems or other font might be preferred. Reviewed-by: Daniel Kiper 2023-10-30 Jon DeVree fs/xfs: Fix XFS directory extent parsing The XFS directory entry parsing code has never been completely correct for extent based directories. The parser correctly handles the case where the directory is contained in a single extent, but then mistakenly assumes the data blocks for the multiple extent case are each identical to the single extent case. The difference in the format of the data blocks between the two cases is tiny enough that its gone unnoticed for a very long time. A recent change introduced some additional bounds checking into the XFS parser. Like GRUB's existing parser, it is correct for the single extent case but incorrect for the multiple extent case. When parsing a directory with multiple extents, this new bounds checking is sometimes (but not always) tripped and triggers an "invalid XFS directory entry" error. This probably would have continued to go unnoticed but the /boot/grub/ directory is large enough that it often has multiple extents. The difference between the two cases is that when there are multiple extents, the data blocks do not contain a trailer nor do they contain any leaf information. That information is stored in a separate set of extents dedicated to just the leaf information. These extents come after the directory entry extents and are not included in the inode size. So the existing parser already ignores the leaf extents. The only reason to read the trailer/leaf information at all is so that the parser can avoid misinterpreting that data as directory entries. So this updates the parser as follows: For the single extent case the parser doesn't change much: 1. Read the size of the leaf information from the trailer 2. Set the end pointer for the parser to the start of the leaf information. (The previous bounds checking set the end pointer to the start of the trailer, so this is actually a small improvement.) 3. Set the entries variable to the expected number of directory entries. For the multiple extent case: 1. Set the end pointer to the end of the block. 2. Do not set up the entries variable. Figuring out how many entries are in each individual block is complex and does not seem worth it when it appears to be safe to just iterate over the entire block. The bounds check itself was also dependent upon the faulty XFS parser because it accidentally used "filename + length - 1". Presumably this was able to pass the fuzzer because in the old parser there was always 8 bytes of slack space between the tail pointer and the actual end of the block. Since this is no longer the case the bounds check needs to be updated to "filename + length + 1" in order to prevent a regression in the handling of corrupt fliesystems. Notes: * When there is only one extent there will only ever be one block. If more than one block is required then XFS will always switch to holding leaf information in a separate extent. * B-tree based directories seems to be parsed properly by the same code that handles multiple extents. This is unlikely to ever occur within /boot though because its only used when there are an extremely large number of directory entries. Fixes: ef7850c75 (fs/xfs: Fix issues found while fuzzing the XFS filesystem) Fixes: b2499b29c (Adds support for the XFS filesystem.) Fixes: https://savannah.gnu.org/bugs/?64376 Reviewed-by: Daniel Kiper Tested-by: Sebastian Andrzej Siewior Tested-by: Marta Lewandowska 2023-10-30 Lidong Chen fs/xfs: Incorrect short form directory data boundary check After parsing of the current entry, the entry pointer is advanced to the next entry at the end of the "for" loop. In case where the last entry is at the end of the data boundary, the advanced entry pointer can point off the data boundary. The subsequent boundary check for the advanced entry pointer can cause a failure. The fix is to include the boundary check into the "for" loop condition. Reviewed-by: Daniel Kiper Tested-by: Sebastian Andrzej Siewior Tested-by: Marta Lewandowska 2023-10-12 Vladimir 'phcoder' Serbinenko Revert "zfsinfo: Correct a check for error allocating memory" Original commit is wrong because grub_file_get_device_name() may return NULL if we use implicit $root. Additionally, the grub_errno is guaranteed to be GRUB_ERR_NONE at the beginning of a command. So, everything should work as expected and Coverity report, CID 73668, WRT to this code should be treated as false positive. This reverts commit 7aab03418 (zfsinfo: Correct a check for error allocating memory). Fixes: 7aab03418 (zfsinfo: Correct a check for error allocating memory) Reviewed-by: Daniel Kiper 2023-10-12 ValdikSS disk/i386/pc/biosdisk: Read up to 63 sectors in LBA mode Current code imposes limitations on the amount of sectors read in a single call according to CHS layout of the disk even in LBA read mode. There's no need to obey CHS layout restrictions for LBA reads on LBA disks. It only slows down booting process. See: https://lore.kernel.org/grub-devel/d42a11fa-2a59-b5e7-08b1-d2c60444bb99@valdikss.org.ru/ Reviewed-by: Daniel Kiper 2023-10-12 ValdikSS kern/i386/pc/init: Flush cache only on VIA C3 and earlier The code flushes the cache on VIA processors unconditionally which is excessive. Check for cpuid family and execute wbinvd only on C3 and earlier. Fixes: https://savannah.gnu.org/bugs/?45149 Fixes: 25492a0f0 (Add wbinvd around bios call.) Reviewed-by: Daniel Kiper 2023-10-12 Fabian Vogt fs/btrfs: Zero file data not backed by extents Implicit holes in file data need to be zeroed explicitly, instead of just leaving the data in the buffer uninitialized. This led to kernels randomly failing to boot in "fun" ways when loaded from btrfs with the no_holes feature enabled, because large blocks of zeros in the kernel file contained random data instead. Reviewed-by: Daniel Kiper Reviewed-by: Qu Wenruo 2023-10-12 Stefan Berger kern/ieee1275/init: Restrict high memory in presence of fadump on ppc64 When a kernel dump is present then restrict the high memory regions to avoid allocating memory where the kernel dump resides. Use the ibm,kernel-dump node under /rtas to determine whether a kernel dump exists and up to which limit GRUB can use available memory. Set the upper_mem_limit to the size of the kernel dump section of type REAL_MODE_REGION and therefore only allow GRUB's memory usage for high addresses from RMO_ADDR_MAX to upper_mem_limit. This means that GRUB can use high memory in the range of RMO_ADDR_MAX (768MB) to upper_mem_limit and the kernel-dump memory regions above upper_mem_limit remain untouched. This change has no effect on memory allocations below linux_rmo_save (typically at 640MB). Also, fall back to allocating below rmo_linux_save in case the chunk of memory there would be larger than the chunk of memory above RMO_ADDR_MAX. This can for example occur if a free memory area is found starting at 300MB extending up to 1GB but a kernel dump is located at 768MB and therefore does not allow the allocation of the high memory area but requiring to use the chunk starting at 300MB to avoid an unnecessary out-of-memory condition. Reviewed-by: Hari Bathini Cc: Pavithra Prakash Cc: Michael Ellerman Cc: Carolyn Scherrer Cc: Mahesh Salgaonkar Cc: Sourabh Jain Reviewed-by: Daniel Kiper 2023-10-12 Glenn Washburn tests/util/grub-shell: Enable RNG device to better test stack smashing In certain firmwares, e.g. OVMF, the RNG protocol is not enabled unless there is an RNG device. When not enabled, GRUB fails to initialize the stack guard with random bytes. For testing, this is not a big issue, but there have been bugs found in the initialization. So turn this on for EFI platforms to catch any regressions. Reviewed-by: Daniel Kiper 2023-10-12 Glenn Washburn kern/efi/init: Disable stack smashing protection on grub_efi_init() GCC is electing to instrument grub_efi_init() to give it stack smashing protection when configuring with --enable-stack-protector on the x86_64-efi target. In the function prologue, the canary at the top of the stack frame is set to the value of the stack guard. And in the epilogue, the canary is checked to verify if it is equal to the guard and if not to call the stack check fail function. The issue is that grub_efi_init() sets up the guard by initializing it with random bytes, if the firmware supports the RNG protocol. So in its prologue the canary will be set with the value of the uninitialized guard, likely NUL bytes. Then the guard is initialized, and finally the epilogue checks the canary against the guard, which will almost certainly be different. This causes the code path for a smashed stack to be taken, causing the machine to print out a message that stack smashing was detected, wait 5 seconds, and then reboot. Disable grub_efi_init() instrumentation so there is no stack smashing false positive generated. Reviewed-by: Daniel Kiper 2023-10-12 Glenn Washburn disk/cryptodisk: Add support for LUKS2 in (proc)/luks_script The sector size in bytes is added to each line and it is allowed to be 6 decimal digits long, which covers the most common cases of 512 and 4096 byte sectors with space for two additional digits as future-proofing. The size allocation is updated to reflect this additional field. Also make clearer the size allocation calculation. Reviewed-by: Daniel Kiper 2023-10-12 Glenn Washburn disk/cryptodisk: Optimize luks_script_get() Use the return value of grub_snprintf() to move the string pointer forward, instead of incrementing the string pointer iteratively until a NULL byte is reached. Move the space out of the format string argument, a small optimization, but also makes the spacing clearer. Also, use the new PRIxGRUB_OFFSET instead of PRIuGRUB_UINT64_T to accurately reflect the format string for this type. Reviewed-by: Daniel Kiper 2023-10-12 Glenn Washburn term/serial: Ensure proper NULL termination after grub_strncpy() A large enough argument to the --port option could cause a string buffer to be not NULL terminated because grub_strncpy() does not guarantee NULL termination if copied string is longer than max characters to copy. Fixes: 712309eaae04 (term/serial: Use grub_strncpy() instead of grub_snprintf() when only copying string) Reviewed-by: Daniel Kiper 2023-10-12 Heinrich Schuchardt commands/efi/lsefisystab: Print the UEFI specification revision in human readable form E.g. 2.10 instead of 00020064 and 2.3.1 instead of 0002001f. See UEFI 2.10 specification, chapter 4.2.1 EFI_TABLE_HEADER. Reviewed-by: Daniel Kiper 2023-10-03 Maxim Suhanov fs/ntfs: Make code more readable Move some calls used to access NTFS attribute header fields into functions with human-readable names. Suggested-by: Daniel Kiper Reviewed-by: Daniel Kiper 2023-10-03 Maxim Suhanov fs/ntfs: Fix an OOB read when parsing a volume label This fix introduces checks to ensure that an NTFS volume label is always read from the corresponding file record segment. The current NTFS code allows the volume label string to be read from an arbitrary, attacker-chosen memory location. However, the bytes read are always treated as UTF-16LE. So, the final string displayed is mostly unreadable and it can't be easily converted back to raw bytes. The lack of this check is a minor issue, likely not causing a significant data leak. Reported-by: Maxim Suhanov Reviewed-by: Daniel Kiper 2023-10-03 Maxim Suhanov fs/ntfs: Fix an OOB read when parsing bitmaps for index attributes This fix introduces checks to ensure that bitmaps for directory indices are never read beyond their actual sizes. The lack of this check is a minor issue, likely not exploitable in any way. Reported-by: Maxim Suhanov Reviewed-by: Daniel Kiper 2023-10-03 Maxim Suhanov fs/ntfs: Fix an OOB read when parsing directory entries from resident and non-resident index attributes This fix introduces checks to ensure that index entries are never read beyond the corresponding directory index. The lack of this check is a minor issue, likely not exploitable in any way. Reported-by: Maxim Suhanov Reviewed-by: Daniel Kiper 2023-10-03 Maxim Suhanov fs/ntfs: Fix an OOB read when reading data from the resident $DATA attribute When reading a file containing resident data, i.e., the file data is stored in the $DATA attribute within the NTFS file record, not in external clusters, there are no checks that this resident data actually fits the corresponding file record segment. When parsing a specially-crafted file system image, the current NTFS code will read the file data from an arbitrary, attacker-chosen memory offset and of arbitrary, attacker-chosen length. This allows an attacker to display arbitrary chunks of memory, which could contain sensitive information like password hashes or even plain-text, obfuscated passwords from BS EFI variables. This fix implements a check to ensure that resident data is read from the corresponding file record segment only. Fixes: CVE-2023-4693 Reported-by: Maxim Suhanov Reviewed-by: Daniel Kiper 2023-10-03 Maxim Suhanov fs/ntfs: Fix an OOB write when parsing the $ATTRIBUTE_LIST attribute for the $MFT file When parsing an extremely fragmented $MFT file, i.e., the file described using the $ATTRIBUTE_LIST attribute, current NTFS code will reuse a buffer containing bytes read from the underlying drive to store sector numbers, which are consumed later to read data from these sectors into another buffer. These sectors numbers, two 32-bit integers, are always stored at predefined offsets, 0x10 and 0x14, relative to first byte of the selected entry within the $ATTRIBUTE_LIST attribute. Usually, this won't cause any problem. However, when parsing a specially-crafted file system image, this may cause the NTFS code to write these integers beyond the buffer boundary, likely causing the GRUB memory allocator to misbehave or fail. These integers contain values which are controlled by on-disk structures of the NTFS file system. Such modification and resulting misbehavior may touch a memory range not assigned to the GRUB and owned by firmware or another EFI application/driver. This fix introduces checks to ensure that these sector numbers are never written beyond the boundary. Fixes: CVE-2023-4692 Reported-by: Maxim Suhanov Reviewed-by: Daniel Kiper 2023-10-03 Michael Chang kern/acpi: Skip NULL entries in RSDT and XSDT During attempts to configure a serial console, a Page Fault Exception and system reset were encountered, specifically on release 2.12~rc1. This issue was not present in prior versions and seemed to affect only a specific machine, potentially pointing to hardware or firmware flaw. After investigation, it was discovered that the invalid page access occurred during the discovery of serial MMIO ports as specified by ACPI's SPCR table [1]. The recent change uncovered an issue in GRUB's ACPI driver. In certain cases, the XSDT/RSDT root table might contain a NULL entry as a terminator, depending on how the tables are assembled. GRUB cannot blindly trust the address in the root table to be valid and should perform a sanity check for NULL entries. This patch introduces this simple check. This fix is also inspired by a related Linux kernel fix [2]. [1] 7b192ec4c term/ns8250: Use ACPI SPCR table when available to configure serial [2] 0f929fbf0 ACPICA: Tables: Add new mechanism to skip NULL entries in RSDT and XSDT. Reviewed-by: Daniel Kiper 2023-10-03 Glenn Washburn util/grub-install-common: Print usable grub-mkimage command When grub-install is run with the verbose option, it will print a log message indicating the grub-mkimage command and arguments used. GRUB no longer calls the grub-mkimage binary internally, however the command logged is a command that if run should effectively be what grub-install used. However, as this has changed some of the newer options have been incorrectly added so that the printed command fails when run separately. This change makes the displayed command run as intended. Reviewed-by: Daniel Kiper 2023-10-03 Glenn Washburn util/grub-install-common: Minor improvements to printing of grub-mkimage command This is a preparatory patch to make the following patch less cluttered. The only visible change made here is to not print extra spaces when either or both --note or --disable-shim-lock are not given and to not print an extra space at the end of the command. The latter is done by constructing the trailing argument string with spaces in front of each argument rather than trailing. The allocation of the argument string is made precise, which has the benefit of saving a few bytes, but more importantly self-documenting what the needed allocated bytes are. Also, unneeded braces are removed from an if block. Reviewed-by: Daniel Kiper 2023-10-03 Vladimir 'phcoder' Serbinenko lib/i386/relocator64: Fix 64-bit FreeBSD boot on BIOS The commit 80948f532d (lib/i386/relocator64: Build fixes for i386) has broken 64-bit FreeBSD boot on BIOS. This patch fixes the issue. Fixes: 80948f532d (lib/i386/relocator64: Build fixes for i386) Reviewed-by: Daniel Kiper 2023-09-22 Anthony PERARD templates/linux_xen: Fix XSM entries generation It turns out that setting $xen_version in linux_entry_xsm() override $xen_version in the loop over $reverse_sorted_xen_list. This means that only one entry per Xen version is going to enable XSM, but all further entries are going to have "(XSM enabled)" in their titles without enabling XSM. When a "xenpolicy-$xen_version" file was found for the current $xen_version, it would overwrite $xen_version to add "(XSM enabled)" to the menu entry title. Once updated, the next call to linux_entry_xsm() would also have this modified $xen_version and would look for the file "xenpolicy-*(XSM enabled)" and fail. Reviewed-by: Daniel Kiper 2023-09-22 Xiaotian Wu loongarch: Eliminate cmodel compilation warnings In the configure phase, the "-mcmodel=large" CFLAGS passed the test, but because it has not been implemented in gcc, the following warning will appear when compiling: gcc: warning: 'large' is not supported, now cmodel is set to 'normal' Reviewed-by: Daniel Kiper 2023-09-22 Glenn Washburn configure: Enable -fno-omit-frame-pointer for backtrace module The backtrace module is written assuming that the frame pointer is in %ebp. By default, -Os optimization level is used, which enables the gcc option -fomit-frame-pointer. This breaks the backtrace functionality. Enabling this may cause an unnoticeable performance cost and virtually no size increase. The backtrace command on x86_64 and probably i386 is broken due to the above rationale. I've not verified, but presumably the backtrace that used to be printed for an unhandled CPU exception is also broken. Do any distros handle this? Considering that, to my knowledge, no one has complained about this in the over 13 years that -Os has been used, has this code actually been useful? Is it worth disabling -fomit-frame-pointer? Though, I don't see much downside right now in disabling it. Alternatively, we could disable/remove the backtrace code. I think it would be nice to keep it and have it working. Nowadays, presumably QEMU makes the GDB stub rarely used as I imagine most are developing in a virtual machines. Also, the GDB stub does not work in UEFI. So, if anyone is using it on real hardware, they are doing so on pretty old machines. The lack of a GDB stub does not seem to be a pain point because no one has got it working on UEFI. This patch gets the backtrace command working on x86_64-efi in QEMU for me. However, it hangs when run on my laptop. Not sure what's going on there. Reviewed-by: Daniel Kiper 2023-09-22 Ard Biesheuvel loader/efi/linux: Implement x86 mixed mode using legacy boot Recent mixed-mode Linux kernels, i.e., v4.0 or newer, can access EFI runtime services at OS runtime even when the OS was not entered via the EFI stub. This is because, instead of reverting back to the firmware's segment selectors, GDTs and IDTs, the 64-bit kernel simply calls 32-bit runtime services using compatibility mode, i.e., the same mode used for 32-bit user space, without taking down all interrupt handling, exception handling, etc. This means that GRUB's legacy x86 boot mode is sufficient to make use of this: 32-bit i686 builds of GRUB can already boot 64-bit kernels in EFI enlightened mode, but without going via the EFI stub, and provide all the metadata that the OS needs to map the EFI runtime regions and call EFI runtime services successfully. It does mean that GRUB should not attempt to invoke the firmware's LoadImage()/StartImage() methods on kernel builds that it knows cannot be started natively. So, add a check for this in the native EFI boot path and fall back to legacy x86 mode in such cases. Note that in the general case, booting non-native images of the same native word size, e.g., x64 EFI apps on arm64 firmware, might be supported by means of emulation. So, let's only disallow images that use a non-native word size. This will also permit booting i686 kernels on x86_64 builds, although without access to runtime services, as this is not supported by Linux. This change on top of 2.12-rc1 is sufficient to boot ordinary Linux mixed mode builds and get full access to the EFI runtime services. Cc: Daniel Kiper Cc: Steve McIntyre Cc: Julian Andres Klode Acked-by: Dimitri John Ledkov Reviewed-by: Daniel Kiper 2023-09-22 Ard Biesheuvel loader/i386/linux: Prefer entry in long mode when booting via EFI The x86_64 Linux kernel can be booted in 32-bit mode, in which case the startup code creates a set of preliminary page tables that map the first 4 GiB of physical memory 1:1 and enables paging. This is a prerequisite for 64-bit execution and can therefore only be implemented in 32-bit code. The x86_64 Linux kernel can also be booted in 64-bit mode directly: this implies that paging is already enabled and it is the responsibility of the bootloader to ensure that the active page tables cover the entire loaded image, including its BSS space, the size of which is described in the image's setup header. Given that the EFI spec mandates execution in long mode for x86_64 and stipulates that all system memory is mapped 1:1, the Linux/x86 requirements for 64-bit entry can be met trivially when booting on x86_64 via EFI. So, enter via the 64-bit entry point in this case. This involves inspecting the xloadflags field in the setup header to check whether the 64-bit entry point is supported. This field was introduced in Linux version v3.8 (early 2013). This change ensures that all EFI firmware tables and other assets passed by the firmware or bootloader in memory remain mapped and accessible throughout the early startup code. Avoiding the drop out of long mode will also be needed to support upcoming CPU designs that no longer implement 32-bit mode at all (as recently announced by Intel [0]). [0] https://www.intel.com/content/www/us/en/developer/articles/technical/envisioning-future-simplified-architecture.html Cc: Daniel Kiper Cc: Julian Andres Klode Reviewed-by: Daniel Kiper 2023-09-18 Vladimir Serbinenko ZFS: Check bonustype in addition to dnode type Some dnodes are shared with properties zap. This is used e.g. for quotas. Then dnode type is 0xc4 and GRUB stumbles on this. Check bonus type and if it's ok then ignore dnode type mismatch Reviewed-by: Daniel Kiper 2023-09-18 Vladimir Serbinenko ZFS: Don't iterate over null objsets Reading them is harmless but useless as they are empty by definition Reviewed-by: Daniel Kiper 2023-09-18 Vladimir Serbinenko ZFS: Fix invalid memcmp We ended up comparing over unset values as we had dnode_phys on one side and dnode on another Reviewed-by: Daniel Kiper 2023-09-18 Vladimir Serbinenko ZFS: support inode type embed into its ID This is a speedup used in some ZFS version. This trips GRUB and makes it unable to access directories. Just skip it for now and revisit if we ever need this speedup. Reviewed-by: Daniel Kiper 2023-08-31 Heinrich Schuchardt video/efi_gop: Require shadow if PixelBltOnly If the EFI graphics pixel format is PixelBltOnly, we cannot write directly to the frame buffer. We need the shadow frame buffer which we copy via the BitBlt operation to the hardware. If the pixel format is PixelBltOnly and allocation of the shadow frame buffer fails, we must raise an error to signal that the EFI GOP protocol is not usable. Reviewed-by: Daniel Kiper 2023-08-31 Glenn Washburn docs: Add menu to prevent older makeinfo versions from failing It has been reported that makeinfo version 4.13a complains and returns error when menus for chapter structuring commands are not present. It is also known that newer makeinfos, such as version 6.7, will create default menus when needed. Since the menu will be created regardless, explicitly create it to support older makeinfo versions. This also enables building to be successful when an older makeinfo is installed because in that case info files are attempted to be generated with the "all" target. Reported-by: Olaf Hering Reviewed-by: Daniel Kiper Tested-by: Olaf Hering 2023-08-31 Glenn Washburn docs: Use @ref instead of @xref The @xref command is meant to be used at the beginning of a sentence because its expansion creates a "See " prefix on all output formats, and on older makeinfo versions is strict about enforcing a "." or "," after the command. The @ref command has no such restriction and is just the link, which allows more control over output. This also fixes an issue where there was a repeated "see" in the output. Reported-by: Olaf Hering Reviewed-by: Daniel Kiper Tested-by: Olaf Hering 2023-08-31 Glenn Washburn tests/util/grub-shell-luks-tester: Allow setting timeout Allow using the envvar GRUB_SHELL_LUKS_TIMEOUT to change the default timeout. If not specified, use value of GRUB_SHELL_DEFAULT_TIMEOUT. And if that is not specified, fallback to original 600s timeout. Reviewed-by: Daniel Kiper 2023-08-31 Glenn Washburn disk/cryptodisk: Fix missing change when updating to use grub_uuidcasecmp() This was causing the cryptomount command to return failure even though the crypto device was successfully added. Of course, this meant that any script using the return code would behave unexpectedly. Fixes: 3cf2e848bc03 (disk/cryptodisk: Allows UUIDs to be compared in a dash-insensitive manner) Suggested-by: Olaf Hering Reviewed-by: Patrich Steinhardt Reviewed-by: Daniel Kiper 2023-08-31 Glenn Washburn kern/misc: Make grub_vsnprintf() C99/POSIX conformant To comply with C99 and POSIX standards, snprintf() should return the number of bytes that would be written to the string (excluding the terminating NUL byte) if the buffer size was big enough. Before this change, the return value was the minimum of the standard return and the length of the buffer. Rarely is the return value of grub_snprintf() or grub_vsnprintf() used with current code, and the few places where it is used do not need to be changed. Reviewed-by: Daniel Kiper 2023-08-31 Glenn Washburn tests: Add serial_test This test is meant to test output via various serial devices. Currently, only the PCI serial device is tested. Reviewed-by: Daniel Kiper 2023-08-31 Glenn Washburn tests/util/grub-shell: Allow explicitly using other serial ports for output While here, move "-qemu=*" case to be next to the "--qemu-opts=*" case. This causes no change in logic, but is more logically located. Reviewed-by: Daniel Kiper 2023-08-31 Glenn Washburn tests/util/grub-shell-luks-tester: Do not remove generated files when test fails to allow debugging Reviewed-by: Daniel Kiper tests/util/grub-shell: Convert spaces to TABs Reviewed-by: Daniel Kiper 2023-08-14 Glenn Washburn commands/ls: Print "????????????" if unable to get file size In long list mode, if the file can not be opened, the file is not printed. Instead, print the file but print the size as "????????????". Reviewed-by: Daniel Kiper 2023-08-14 Glenn Washburn commands/ls: Send correct dirname to print functions For each non-directory path argument to the ls command, the full path was being sent to the print functions, instead of the dirname. The long output print function expected dirname to be the directory containing the file and so could not open the file to get the file size because the generated path was incorrect. This caused the output to be a blank line. Reviewed-by: Daniel Kiper 2023-08-14 Glenn Washburn fs/archelp: If path given to grub_archelp_dir() is not a directory return error Specifically, return GRUB_ERR_BAD_FILE_TYPE because this is what is expected by the ls command when it is given a path to a non-directory. This fixes a bug where calling ls with a list of non-directory paths outputs a blank line for each such argument. Reviewed-by: Daniel Kiper 2023-08-14 Glenn Washburn commands/videoinfo: Prevent crash when run while video driver already active The videoinfo command will initialize all non-active video adapters. Video drivers tend to zero out the global framebuffer object on initialization. This is not a problem when there is no active video adapter. However, when there is, then outputting to the video adapter will cause a crash because methods in the framebuffer object are reinitialized. For example, this command sequence will cause a crash. terminal_output --append gfxterm; videoinfo When running in a QEMU headless with GRUB built for the x86_64-efi target, the first command initializes the Bochs video adapter, which, among other things, sets the set_page() member function. Then when videoinfo is run, all non-Bochs video adapters will be initialized, each one wiping the framebuffer and thus setting set_page to NULL. Soon after the videoinfo command finishes there will be a call to grub_refresh(), which will ultimately call the framebuffer's set_page which will be NULL and cause a crash when called. Reviewed-by: Daniel Kiper 2023-08-14 Glenn Washburn docs: Improve initrd documentation A list of improvements: * Remove reference to "initial ramdisk" and replace with "initrd". This then covers the case of ramdisk and ramfs, which is the usual method with kernels 2.6 and newer. * Add sentence with URL to initrd documentation Linux kernel. * Add a section documenting how to have the initrd command generate a new-style initrd via a specially crafted argument and include an example. * Update initrd16 to refer to the initrd section and make note that initrd16 is only on the pc platform. Reviewed-by: Oskari Pirhonen Reviewed-by: Paul Menzel Reviewed-by: Daniel Kiper 2023-08-14 Glenn Washburn term/ns8250-spcr: Continue processing SPCR table even if revision is < 2 According to commit 0231d00082 (ACPI: SPCR: Make SPCR available to x86) to the Linux kernel, "On x86, many systems have a valid SPCR table but the table version is not 2 so the table version check must be a warning." Reviewed-by: Benjamin Herrenschmidt Reviewed-by: Daniel Kiper 2023-08-14 Glenn Washburn docs: A note to cat that hexdump should be used for binary data The cat command should not be used to print binary data because it can show bytes not in the binary data and not show bytes that are in the data, which can lead to confusion. This happens because cat does some processing of the data stream, namely trying to decode substrings as UTF-8. Reviewed-by: Oskari Pirhonen Reviewed-by: Daniel Kiper 2023-08-14 Glenn Washburn docs: Document hexdump command Reviewed-by: Oskari Pirhonen Reviewed-by: Daniel Kiper docs: Group usage of user-space utilities into single chapter Reviewed-by: Oskari Pirhonen Reviewed-by: Daniel Kiper 2023-08-14 Qiumiao Zhang util/grub-mount: Fix memory leak in fuse_getattr() Reviewed-by: Daniel Kiper 2023-08-14 Michał Grzelak configure: Fix SDL2 typo by referencing value During configuration of SDL2, variable enable_grub_emu_sdl2 is checked whether to throw an error message. However, error could not happen because two unequal strings were compared. Fix this by referencing value of enable_grub_emu_sdl2, not name. Fixes: 17d6ac1a7 (emu: Add SDL2 support) Reviewed-by: Julian Andres Klode Reviewed-by: Daniel Kiper Reviewed-by: Paul Menzel 2023-08-14 Glenn Washburn docs: Add missing assumption Also reword a prior sentence to be more clear. Fixes: 5a3d2b4742df (docs: Add debugging chapter to development documentation) Reviewed-by: Oskari Pirhonen Reviewed-by: Daniel Kiper 2023-08-14 Oskari Pirhonen util/grub.d/25_bli.in: Fix shebang on unmerged-usr On an unmerged-usr system, grub-mkconfig errors out with the following error due to /usr/bin/sh not existing: /usr/sbin/grub-mkconfig: /etc/grub.d/25_bli: /usr/bin/sh: bad interpreter: No such file or directory Use a /bin/sh shebang to fix the error as well as match the other existing files. Fixes: 158a6583e (util/grub.d/25_bli.in: Activate bli module on EFI) Reviewed-by: Glenn Washburn Reviewed-by: Daniel Kiper Reviewed-by: Oliver Steffen 2023-08-14 Glenn Washburn tests/util/grub-shell-luks-tester: Allow GRUB_SHELL_LUKS_DEFAULT_DEBUG and GRUB_TEST_DEFAULT_DEBUG to specify the debug level to grub-shell Reviewed-by: Daniel Kiper 2023-08-14 Glenn Washburn tests/util/grub-shell: Allow setting the value of debug regardless of its previous state This allows an invocation of grub-shell to set the value of debug regardless of the global default environment variable GRUB_SHELL_DEFAULT_DEBUG. Reviewed-by: Daniel Kiper 2023-08-14 Glenn Washburn tests/util/grub-shell: Allow setting default timeout via GRUB_SHELL_DEFAULT_TIMEOUT envvar Reviewed-by: Daniel Kiper 2023-08-14 Glenn Washburn tests/util/grub-shell: Add --verbose to grub-mkrescue when $debug is greater than 2 Since this is fairly verbose output, do not enable first level of debug is turned on. Reviewed-by: Daniel Kiper 2023-07-10 Daniel Kiper Release 2.12~rc1 2023-07-03 Daniel Kiper efi: Fallback to legacy mode if shim is loaded on x86 archs The LoadImage() provided by the shim does not consult MOK when loading an image. So, simply signature verification fails when it should not. This means we cannot use Linux EFI stub to start the kernel when the shim is loaded. We have to fallback to legacy mode on x86 architectures. This is not possible on other architectures due to lack of legacy mode. This is workaround which should disappear when the shim provides LoadImage() which looks up MOK during signature verification. On the occasion align constants in include/grub/efi/sb.h. Reviewed-by: Ard Biesheuvel 2023-07-03 Daniel Kiper efi: Drop __grub_efi_api attribute from shim_lock->verify() function ... because (surprisingly) it does not use specific EFI calling convention... Fixes: 6a080b9cd (efi: Add calling convention annotation to all prototypes) Reviewed-by: Ard Biesheuvel 2023-07-03 Samuel Thibault templates: Start pci-arbiter before acpi on Hurd acpi actually needs to access PCI, while pci-arbiter will not be making use of ACPI, so we need to start acpi first. Reviewed-by: Daniel Kiper 2023-07-03 Michał Grzelak configure.ac: Fix typo by adding missing $ During configuration of SDL, variable enable_grub_emu_sdl is checked whether to throw an error message. However, error could not happen because two unequal strings were compared. Fix this by referencing value of enable_grub_emu_sdl, not name. Fixes: 17d6ac1a7 (emu: Add SDL2 support) Reviewed-by: Daniel Kiper 2023-07-03 Glenn Washburn docs: Minor corrections When referring to initrd16 the link for initrd16 should be used, not a link for initrd. Also, correct the spelling of additionally and add a comma after it to correct its grammatical usage. Reviewed-by: Daniel Kiper 2023-07-03 Glenn Washburn kern/misc: Add space after comma in function argument list Reviewed-by: Daniel Kiper commands/regexp: Fix typo Reviewed-by: Daniel Kiper 2023-07-03 Glenn Washburn term/serial: Use grub_strncpy() instead of grub_snprintf() when only copying string Using grub_strncpy() instead of grub_snprintf() is less overhead and indicates clearly that the dest should be the same string as the source. Also fix indentation. Reviewed-by: Daniel Kiper 2023-07-03 Glenn Washburn loader/linux: Print debug message for each generated newc path generated Reviewed-by: Daniel Kiper 2023-07-03 Glenn Washburn include/grub/types.h: Add PRI*GRUB_OFFSET and PRI*GRUB_DISK_ADDR These are currently always the same as PRI*GRUB_UINT64_T, but they may not be in the future. Reviewed-by: Daniel Kiper 2023-07-03 Glenn Washburn kern/misc: Support octal printf format code Also add parenthesis to nested ternary operator to improve clarity. Reviewed-by: Daniel Kiper 2023-07-03 Glenn Washburn gitignore: Ignore python bytecode files Python bytecode files, which end in .pyc, may be generated by the build system as needed and should not go into the git repository. Reviewed-by: Daniel Kiper 2023-07-03 Glenn Washburn loader/linux: Only emit newc directory once When creating at runtime a newc initrd via arguments to initrd with "newc:" prefixes, only emit a directory path record once. The original code intended to do that by bailing out of emitting the record when the record to be created matches an existing record. However, this does not happen because grub_memcmp() is improperly checked. Generating duplicate newc directory records does not cause any problems because the Linux unpacker will skip it once it sees the directory already exists. This fix saves a little processing and makes the generated newc cpio archive a little smaller. Fixes: 92750e4c60 (Add ability to generate newc additions on runtime.) Reviewed-by: Daniel Kiper 2023-07-03 Glenn Washburn loader/efi/linux: Fix formatting and remove unneeded parenthesis Reviewed-by: Daniel Kiper 2023-07-03 Glenn Washburn loader/efi/linux: Print EFI status as hex number instead of uint EFI status codes are of different classes depending on the first byte and all error status codes defined in appendix D of the main spec start from 1 and have the high bit set. When printing as a uint, the decimal is a very large number that needs have the high bit cleared get the spec error code. This can be easily visually done by a human if the number is printed as hex. Reviewed-by: Daniel Kiper 2023-07-03 Oskari Pirhonen docs: Minor edits to debugging chapter Small set of wording and grammatical edits which did not make it in time for the original review of the chapter. Reviewed-by: Glenn Washburn Reviewed-by: Daniel Kiper 2023-06-22 Daniel Kiper lib/relocator: Fix OOB write when initializing lo->freebytes[] Fixes: CID 96636 Reviewed-by: Vladimir Serbinenko 2023-06-22 Daniel Kiper lib/relocator: Enforce GRUB_RELOCATOR_FIRMWARE_REQUESTS_QUANT divisibility by 8 Most of leftover code blindly assumes GRUB_RELOCATOR_FIRMWARE_REQUESTS_QUANT divisibility by 8. So, enforce this at compile time. Reviewed-by: Vladimir Serbinenko 2023-06-22 Julian Andres Klode emu: Add SDL2 support So all we did with the surface in SDL1 was split into window, surface, renderer and texture. Instead of drawing into the surface and then flipping, you build your pixels, then update a texture and then copy the texture to the renderer. Here we use an empty RGB surface to hold our pixels, which enables us to keep most of the code the same. The SDL1 code has been adjusted to refer to "surface" instead of "window" when trying to access the properties of the surface. This approaches the configuration by adding a new --enable-grub-emu-sdl2 argument. If set to yes, or auto detected, it disables SDL1 support automatically. This duplicates the sdl module block in Makefile.core.def which may be something to be aware of, but we also don't want to build separate module. Fixes: https://bugs.debian.org/1038035 Reviewed-by: Daniel Kiper 2023-06-22 Julian Andres Klode emu: SDL style fixes These should be quite obvious and will make the SDL2 patch easier to read then doing it inline there. Reviewed-by: Daniel Kiper 2023-06-22 Michał Grzelak tpm: Enable boot despite unknown firmware failure Currently booting the system is prevented when call to EFI firmware hash_log_extend_event() returns unknown error. Solve this by following convention used in commit a4356538d (commands/tpm: Don't propagate measurement failures to the verifiers layer). Let the system to be bootable by default when unknown TPM error is encountered. Check environment variable tpm_fail_fatal to fallback to previous behaviour. Reviewed-by: Daniel Kiper 2023-06-22 Daniel Kiper bootstrap: Fix patching warnings Currently bootstrap complains in the following way when patching gnulib files: patching file argp-help.c Hunk #1 succeeded at 52 (offset 1 line). Hunk #2 succeeded at 1548 (offset 115 lines). patching file mbswidth.c patching file mbswidth.h Hunk #1 succeeded at 40 (offset -5 lines). Let's fix it by amending line numbers in the patch. Reviewed-by: Alec Brown 2023-06-22 Daniel Kiper efi: Add missing __grub_efi_api attributes The commit bb4aa6e06 (efi: Drop all uses of efi_call_XX() wrappers) did not add some __grub_efi_api attributes to the EFI calls. Lack of them led to hangs on x86_64-efi target. So, let's add missing __grub_efi_api attributes. Fixes: bb4aa6e06 (efi: Drop all uses of efi_call_XX() wrappers) Reported-by: Christian Hesse Reported-by: Robin Candau Tested-by: Robin Candau Tested-by: Christian Hesse Reviewed-by: Peter Jones 2023-06-22 Julian Andres Klode disk: Generalize MD_MAX_DISKS to GRUB_MDRAID_MAX_DISKS Move the constant from grub-core/osdep/linux/getroot.c to include/grub/disk.h and then reuse it in place of the hardcoded 1024 limit in diskfilter. Fixes: 2a5e3c1f2 (disk/diskfilter: Don't make a RAID array with more than 1024 disks) Cc: Daniel Axtens Cc: Kees Cook Reviewed-by: Kees Cook Reviewed-by: Daniel Kiper 2023-06-22 Xiaotian Wu loongarch: Disable relaxation relocations A working GRUB cannot be built with upcoming binutils and GCC, because linker relaxation was added [1] causing new unsupported relocations to appear in modules. So we pass -mno-relax to GCC if it is supported, to disable relaxation and make GRUB forward-compatible with new toolchains. While similar code already exists for sparc64 in configure.ac, sparc64 sets LDFLAGS while LoongArch requires CFLAGS to be set. If we only set LDFLAGS on LoongArch, GCC will still generate relaxation relocations in the .o files, so the sparc64 code cannot be reused. [1] https://sourceware.org/git/?p=binutils-gdb.git;a=commit;h=56576f4a722b7398d35802ecf7d4185c27d6d69b Reviewed-by: Daniel Kiper 2023-06-13 Xiaotian Wu loongarch: Add ELF relocation types documentation and comments See https://github.com/loongson/la-abi-specs/blob/release/laelf.adoc#relocations Reviewed-by: Daniel Kiper 2023-06-13 Xiaotian Wu loongarch: Rename function names According to the relocation documentation, the following function names are renamed to show their exact meaning: - from grub_loongarch64_xxx64_hi12() to grub_loongarch64_abs64_hi12(), - from grub_loongarch64_xxx64_hi12() to grub_loongarch64_abs64_lo20(). Reviewed-by: Daniel Kiper 2023-06-13 Xiaotian Wu util/grub-mkimagexx: Optimize code using pc variable We already have the pc variable, no need to calculate it again. Reviewed-by: Daniel Kiper 2023-06-13 Xiaotian Wu kern/{arm64,loongarch64}/dl_helper: Use the correct format specifier for formatted output Use PRIxGRUB_INT64_T format specifier for grub_int64_t type and drop redundant casts. Reviewed-by: Daniel Kiper 2023-06-13 Qiumiao Zhang kern/acpi: Use xsdt_addr if present According to the ACPI specification, in ACPI 2.0 or later, an ACPI-compatible OS must use the XSDT if present. So, we should use xsdt_addr instead of rsdt_addr if xsdt_addr is valid. Reviewed-by: Daniel Kiper 2023-06-13 Qiumiao Zhang commands/acpi: Use xsdt_addr if present According to the ACPI specification, in ACPI 2.0 or later, an ACPI-compatible OS must use the XSDT if present. So, we should use xsdt_addr instead of rsdt_addr if xsdt_addr is valid. Reviewed-by: Daniel Kiper 2023-06-13 Lidong Chen fs/udf: Fix out of bounds access Implemented a boundary check before advancing the allocation descriptors pointer. Reviewed-by: Darren Kenny Reviewed-by: Daniel Kiper 2023-06-13 Glenn Washburn docs: Add debugging chapter to development documentation Debugging GRUB can be tricky and require arcane knowledge. This will help those unfamiliar with the process to get started debugging GRUB with less effort. Reviewed-by: Daniel Kiper 2023-06-13 Darren Kenny fs/xfs: Fix issues found while fuzzing the XFS filesystem While performing fuzz testing with XFS filesystem images with ASAN enabled, several issues were found where the memory accesses are made beyond the data that is allocated into the struct grub_xfs_data structure's data field. The existing structure didn't store the size of the memory allocated into the buffer in the data field and had no way to check it. To resolve these issues, the data size is stored to enable checks into the data buffer. With these checks in place, the fuzzing corpus no longer cause any crashes. Reviewed-by: Daniel Kiper 2023-06-13 Alexander Kanavin util/import_unicode.py: Ensure output is deterministic Ensure the generated unidata.c file is deterministic by sorting the keys of the dict. Reviewed-by: Daniel Kiper 2023-06-13 Alexander Kanavin grub-core/genmoddep.awk: Ensure output is deterministic The output in moddep.lst generated from syminfo.lst using genmoddep.awk is not deterministic since the order of the dependencies on each line can vary depending on how awk sorts the values in the array. Be deterministic in the output by sorting the dependencies on each line. Reviewed-by: Daniel Kiper 2023-06-13 Alexander Kanavin gentpl.py: Ensure output is deterministic The output of the SOURCES lines in grub-core/Makefile.core.am, generated from grub-core/Makefile.core.def with gentpl.py is not deterministic due to missing sorting of the list used to generate it. Add such a sort. Reviewed-by: Daniel Kiper 2023-06-01 Glenn Washburn gdb: Add gdbinfo command for printing the load address of the EFI application EFI firmware determines where to load the GRUB EFI at runtime, and so the addresses of debug symbols are not known ahead of time. There is a command defined in the gdb_grub script which will load the debug symbols at the appropriate addresses, if given the application load address for GRUB. So add a command named "gdbinfo" to allow the user to print this GDB command string with the application load address on-demand. For the outputted GDB command to have any effect when entered into a GDB session, GDB should have been started with the script as an argument to the -x option or sourced into an active GDB session before running the outputted command. Documentation for the gdbinfo command is also added. Co-developed-by: Peter Jones Reviewed-by: Daniel Kiper 2023-06-01 Glenn Washburn loader/efi/chainloader: Do not require a $root visible to EFI firmware when chainloading The EFI chainloader checks that a device path can be created for the $root device before allowing chainloading to a given file. This is probably to ensure that the given file can be accessed and loaded by the firmware. However, since GRUB is loading the image itself, the firmware need not be able to access the file location of the image. So remove this check. Also, this fixes an issue where chainloading an image file on a location that is accessible by the firmware, e.g. (hd0,1)/efi/boot.efi, would fail when root is a location inaccessible by the firmware, e.g. memdisk. Use GRUB_EFI_BYTES_TO_PAGES() instead of doing the calculation explicitly. Add comment noting the section where the load options for the chainloaded EFI application is constructed. Reviewed-by: Ard Biesheuvel Reviewed-by: Daniel Kiper 2023-06-01 Glenn Washburn docs: Document extra arguments to chainloader on EFI Extra arguments given to chainloader on EFI platforms will be sent to the chainloaded application. Also, minor edit in the chainloading section to note that chainloading can be a jump via the firmware and not necessarily in real mode (which does not exist on some architectures). Reviewed-by: Ard Biesheuvel Reviewed-by: Daniel Kiper 2023-06-01 Oliver Steffen util/grub.d/25_bli.in: Activate bli module on EFI Add a new configuration drop-in file that loads the bli module and runs the command if booting on the EFI platform. Reviewed-by: Daniel Kiper 2023-06-01 Oliver Steffen bli: Add a module for the Boot Loader Interface Add a new module named bli. It implements a small but quite useful part of the Boot Loader Interface [0]. This interface uses EFI variables for communication between the boot loader and the operating system. When loaded, this module sets two EFI variables under the vendor GUID 4a67b082-0a4c-41cf-b6c7-440b29bb8c4f: - LoaderInfo: contains GRUB + . This allows the running operating system to identify the boot loader used during boot. - LoaderDevicePartUUID: contains the partition UUID of the EFI System Partition (ESP). This is used by systemd-gpt-auto-generator [1] to find the root partitions (and others too), via partition type IDs [2]. This module is available on EFI platforms only. The bli module relies on the part_gpt module which has to be loaded beforehand to make the GPT partitions discoverable. Update the documentation, add a new chapter "Modules" and describe the bli module there. [0] https://systemd.io/BOOT_LOADER_INTERFACE/ [1] https://www.freedesktop.org/software/systemd/man/systemd-gpt-auto-generator.html [2] https://uapi-group.org/specifications/specs/discoverable_partitions_specification/ Reviewed-by: Daniel Kiper 2023-06-01 Oliver Steffen kern: Check for NULL when closing devices and disks Add checks for NULL pointers to grub_device_close() and grub_disk_close() to make these functions more robust. Reviewed-by: Daniel Kiper 2023-06-01 Oliver Steffen docs: Reword section headings Reword some section headings, remove "The List of" from titles. While grammatically correct, this phrase can be omitted to increase readability, especially in the table of contents. Reviewed-by: Daniel Kiper 2023-06-01 Oliver Steffen efi: Add grub_efi_set_variable_to_string() Add a function that sets an EFI variable to a string value. The string is converted from UTF-8 to UTF-16. Reviewed-by: Daniel Kiper 2023-06-01 Oliver Steffen kern/misc, kern/efi: Extract UTF-8 to UTF-16 code Create a new function for UTF-8 to UTF-16 conversion called grub_utf8_to_utf16_alloc() in the grub-code/kern/misc.c and replace charset conversion code used in some places in the EFI code. It is modeled after the grub_utf8_to_ucs4_alloc() like functions in include/grub/charset.h. It can't live in include/grub/charset.h, because it needs to be reachable from the kern/efi code. Add a check for integer overflow and remove redundant NUL-termination. Reviewed-by: Daniel Kiper 2023-06-01 Oliver Steffen include/grub/types.h: Add GRUB_SSIZE_MAX In the same way as GRUB_SIZE_MAX, add GRUB_SSIZE_MAX. Reviewed-by: Daniel Kiper 2023-06-01 Oliver Steffen guid: Make use of GUID printf format specifier Use the new printf format specifier %pG. Fixes the text representation of GUIDs in the output of the lsefisystab command (missing 4th dash). Reviewed-by: Daniel Kiper 2023-06-01 Oliver Steffen kern/misc: Add a format specifier GUIDs Extend the printf format specifier for pointers (%p) to accept a suffix specifier G to print GUIDs: %pG can be used to print grub_guid structs. This does not interfere with the -Wformat checking of gcc. Note that the data type is not checked though (%p accepts void *). Reviewed-by: Daniel Kiper 2023-06-01 Oliver Steffen guid: Unify GUID types There are 3 implementations of a GUID in GRUB. Replace them with a common one, placed in types.h. It uses the "packed" flavor of the GUID structs, the alignment attribute is dropped, since it is not required. Reviewed-by: Daniel Kiper 2023-06-01 Oliver Steffen efi: Add grub_efi_set_variable_with_attributes() Add a function to the EFI module that allows setting EFI variables with specific attributes. This is useful for marking variables as volatile, for example. Reviewed-by: Daniel Kiper 2023-05-25 Alec Brown kern/efi/mm: Fix use-after-free in finish boot services In grub-core/kern/efi/mm.c, grub_efi_finish_boot_services() has an instance where the memory for the variable finish_mmap_buf is freed, but on the next iteration of a while loop, grub_efi_get_memory_map() uses finish_mmap_buf. To prevent this, we can set finish_mmap_buf to NULL after the free. Reviewed-by: Daniel Kiper 2023-05-25 Ard Biesheuvel efi: Handle NULL return value when getting loaded image protocol The EFI spec mandates that the handle produced by the LoadImage boot service has a LoadedImage protocol instance installed on it, but for robustness, we should still deal with a NULL return value from the helper routine that obtains this protocol pointer. If this happens, don't try to start the image but unload it and return an error. Reviewed-by: Daniel Kiper 2023-05-25 Ard Biesheuvel efi: Use generic EFI loader for x86_64 and i386 Switch the x86 based EFI platform builds to the generic EFI loader, which exposes the initrd via the LoadFile2 protocol instead of the x86-specific setup header. This will launch the Linux kernel via its EFI stub, which performs its own initialization in the EFI boot services context before calling ExitBootServices() and performing the bare metal Linux boot. Given that only Linux kernel versions v5.8 and later support this initrd loading method, the existing x86 loader is retained as a fallback, which will also be used for Linux kernels built without the EFI stub. In this case, GRUB calls ExitBootServices() before entering the Linux kernel, and all EFI related information is provided to the kernel via struct boot_params in the setup header, as before. Note that this means that booting EFI stub kernels older than v5.8 is not supported even when not using an initrd at all. Also, the EFI handover protocol, which has no basis in the UEFI specification, is not implemented. Reviewed-by: Daniel Kiper 2023-05-25 Ard Biesheuvel efi: Remove x86_64 call wrappers The call wrappers are no longer needed now that GCC can generate function calls using MS calling convention, so let's get rid of them. Reviewed-by: Daniel Kiper 2023-05-25 Ard Biesheuvel efi: Drop all uses of efi_call_XX() wrappers Now that GCC can generate function calls using the correct calling convention for us, we can stop using the efi_call_XX() wrappers, and just dereference the function pointers directly. This avoids the untyped variadic wrapper routines, which means better type checking for the method calls. Reviewed-by: Daniel Kiper 2023-05-25 Ard Biesheuvel efi: Add calling convention annotation to all prototypes UEFI mandates MS calling convention on x86_64, which was not supported on GCC when UEFI support was first introduced into GRUB. However, now we can use the ms_abi function type attribute to annotate functions and function pointers as adhering to the MS calling convention, and the compiler will generate the correct instruction sequence for us. So let's add the appropriate annotation to all the function prototypes. This will allow us to drop the special call wrappers in a subsequent patch. Reviewed-by: Daniel Kiper 2023-05-25 Ard Biesheuvel efi: Make EFI PXE protocol methods non-callable The grub_efi_pxe_t struct definition has placeholders for the various protocol method pointers, given that they are never called in the code, and the prototypes have been omitted, and therefore do not comply with the UEFI spec. So let's convert them into void* pointers, so they cannot be called inadvertently. Reviewed-by: Daniel Kiper 2023-05-25 Alec Brown loader/multiboot_elfxx: Check program header offset doesn't exceed constraints In grub-core/loader/multiboot_elfxx.c, we need to make sure that the program header offset is less than the file size along with the MULTIBOOT_SEARCH constant. We can do so by setting the variable phlimit to the minimum value of the two limits and check it each time we change program header index to insure that the program header offset isn't outside of the limits. Fixes: CID 314029 Fixes: CID 314038 Reviewed-by: Daniel Kiper 2023-05-25 Alec Brown loader/multiboot_elfxx: Check section header region before allocating memory In grub-core/loader/multiboot_elfxx.c, space is being allocated for the section header region, but isn't verifying if the region is within the file's size. Before calling grub_calloc(), we can add a conditional to check if the section header region is smaller than the file size. Fixes: CID 314029 Fixes: CID 314038 Reviewed-by: Daniel Kiper 2023-05-25 Alec Brown loader/multiboot_elfxx: Check program memory isn't larger than allocated memory size In grub-core/loader/multiboot_elfxx.c, the code is filling an area of memory with grub_memset() but doesn't check if there is space in the allocated memory before doing so. To make sure we aren't zeroing memory past the allocated memory region, we need to check that the offset into the allocated memory region plus the memory size of the program is smaller than the allocated memory size. Fixes: CID 314029 Fixes: CID 314038 Reviewed-by: Daniel Kiper 2023-05-25 WANG Xuerui kern/loongarch64/dl_helper: Avoid undefined behavior when popping from an empty reloc stack The return value of grub_loongarch64_stack_pop() is unsigned, so -1 should not be used in the first place. Replacing with 0 is enough to avoid the UB in this edge case. Technically though, proper error handling is needed throughout the management of the reloc stack, so no unexpected behavior will happen even in case of malformed object code input (right now, pushes become no-ops when the stack is full, and garbage results if the stack does not contain enough operands for an op). The refactor would touch some more places so would be best done in a separate series. Fixes: CID 407777 Fixes: CID 407778 Reviewed-by: Daniel Kiper 2023-05-25 Peter Zijlstra (Intel) pci: Rename GRUB_PCI_CLASS_* Glenn suggested to rename the existing PCI_CLASS defines to have explicit class and subclass names. Suggested-by: Glenn Washburn Reviewed-by: Daniel Kiper 2023-05-25 Peter Zijlstra (Intel) term/serial: Add support for PCI serial devices Loosely based on early_pci_serial_init() from Linux, allow GRUB to make use of PCI serial devices. Specifically, my Alderlake NUC exposes the Intel AMT SoL UART as a PCI enumerated device but doesn't include it in the EFI tables. Tested and confirmed working on a "Lenovo P360 Tiny" with Intel AMT enabled. This specific machine has (from lspci -vv): 00:16.3 Serial controller: Intel Corporation Device 7aeb (rev 11) (prog-if 02 [16550]) DeviceName: Onboard - Other Subsystem: Lenovo Device 330e Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx- Status: Cap+ 66MHz+ UDF- FastB2B+ ParErr- DEVSEL=fast >TAbort- SERR- Reviewed-by: Daniel Kiper 2023-05-17 Glenn Washburn tests/util/grub-fs-tester: Avoid failing some file system tests due to file system filling up On some systems /usr/share/dict/american-english can be larger than the available space on the filesystem being tested (e.g. vfat12a). This causes a failure of the filesystem test and is not a real test failure. Instead, use dd to copy at most 1 MiB of data to the filesystem, which is enough for our purposes and will not fill any of the tested filesystems. Reviewed-by: Daniel Kiper 2023-05-17 Glenn Washburn docs: Command-line and menu entry commands are now separated The menu entry commands now have their own section. Change the wording in the section that they were in to reflect this. Reviewed-by: Daniel Kiper 2023-05-17 Roger Pau Monné lib/relocator: Always enforce the requested alignment in malloc_in_range() On failure to allocate from grub_relocator_firmware_alloc_region() in malloc_in_range() the function would stop enforcing the alignment, and the following was returned: lib/relocator.c:431: trying to allocate in 0x200000-0xffbf9fff aligned 0x200000 size 0x406000 lib/relocator.c:1197: allocated: 0x74de2000+0x406000 lib/relocator.c:1407: allocated 0x74de2000/0x74de2000 Fix this by making sure that target always contains a suitably aligned address. After the change the return from the function is: lib/relocator.c:431: trying to allocate in 0x200000-0xffb87fff aligned 0x200000 size 0x478000 lib/relocator.c:1204: allocated: 0x74c00000+0x478000 lib/relocator.c:1414: allocated 0x74c00000/0x74c00000 Fixes: 3a5768645c05 (First version of allocation from firmware) Reviewed-by: Daniel Kiper 2023-05-17 Benjamin Herrenschmidt term/ns8250: Fix incorrect usage of access_size The access_size is part of a union, so doesn't technically exist for a PIO port (i.e., not MMIO), but we set it anyways. This doesn't cause a bug today because the other leg of the union doesn't have anything overlapping with it now, but it's bad, I will punish myself for writing it that way :-) In the meantime, fix this and actually name the struct inside the union for clarity of intent and to avoid such issue in the future. Reviewed-by: Daniel Kiper 2023-05-17 Ákos Nagy util/grub-install-common: Fix the key of the --core-compress option Commit f23bc6510 (Transform -C option to grub-mkstandalone to --core-compress available in all grub-install flavours.) declared a new long option for specifying the compression method to use for the core image. However, the option key has not been replaced in the parser function, it still expects the old one formerly used by grub-mkstandalone. Because of this the option is not recognized by any of the utils for which it is listed as supported. Reviewed-by: Daniel Kiper 2023-05-17 Lidong Chen fs/hfsplus: Set grub_errno to prevent NULL pointer access When an invalid node size is detected in grub_hfsplus_mount(), data pointer is freed. Thus, file->data is not set. The code should also set the grub_errno when that happens to indicate an error and to avoid accessing the uninitialized file->data in grub_file_close(). Reviewed-by: Daniel Kiper 2023-05-17 Lidong Chen fs/hfsplus: Prevent out of bound access in catalog file A corrupted hfsplus can have a catalog key that is out of range. This can lead to out of bound access when advancing the pointer to access catalog file info. The valid range of a catalog key is specified in HFS Plus Technical Note TN1150 [1]. [1] https://developer.apple.com/library/archive/technotes/tn/tn1150.html Reviewed-by: Daniel Kiper 2023-05-17 Lidong Chen fs/hfsplus: Validate btree node size The invalid btree node size can cause crashes when parsing the btree. The fix is to ensure the btree node size is within the valid range defined in the HFS Plus technical note, TN1150 [1]. [1] https://developer.apple.com/library/archive/technotes/tn/tn1150.html Reviewed-by: Daniel Kiper 2023-05-17 Glenn Washburn INSTALL: Use exfat-utils package instead of exfatprogs The exfat-utils package is an older package complementing exfat-fuse, and was the only exfat tools for a long time. The exfat filesystem testing code was written with these tools in mind. A newer project exfatprogs appears to be of better quality and functionality and was written to complement the somewhat new exfat kernel module. Ideally we should be using the newer exfatprogs. However, the command line interface for mkfs.exfat is different between the two. So we can't use the exfatprogs tools until the test scripts have been updated to account for this. Recommend installing exfat-utils instead of exfatprogs for now. Reviewed-by: Daniel Kiper 2023-05-17 Glenn Washburn INSTALL: Document that building grub-mkfont requires xfonts-unifont Reviewed-by: Daniel Kiper 2023-05-17 Renaud Métrich net/dns: Fix lookup error when no IPv6 is returned When trying to resolve DNS names into IP addresses, the DNS code fails from time to time with the following error: -------- 8< ---------------- 8< ---------------- 8< ---------------- 8< -------- error: ../../grub-core/net/dns.c:688:no DNS record found. -------- 8< ---------------- 8< ---------------- 8< ---------------- 8< -------- This happens when both IPv4 and IPv6 queries are performed against the DNS server (e.g. 8.8.8.8) but there is no IP returned for IPv6 query, as shown below: -------- 8< ---------------- 8< ---------------- 8< ---------------- 8< -------- grub> net_del_dns 192.168.122.1 grub> net_add_dns 8.8.8.8 grub> net_nslookup ipv4.test-ipv6.com error: ../../grub-core/net/dns.c:688:no DNS record found. grub> net_nslookup ipv4.test-ipv6.com 216.218.228.115 -------- 8< ---------------- 8< ---------------- 8< ---------------- 8< -------- The root cause is the code exiting prematurely when the data->addresses buffer has been allocated in recv_hook(), even if there was no address returned last time recv_hook() executed. Reviewed-by: Daniel Kiper 2023-05-17 Renaud Métrich net/dns: Add debugging messages in recv_hook() function Reviewed-by: Daniel Kiper net/dns: Simplify error handling of recv_hook() function Reviewed-by: Daniel Kiper 2023-05-17 Renaud Métrich net/dns: Fix removal of DNS server When deleting the DNS server, we get the following error message: -------- 8< ---------------- 8< ---------------- 8< ---------------- 8< -------- grub> net_del_dns 192.168.122.1 error: ../../grub-core/net/dns.c:646:no DNS reply received. -------- 8< ---------------- 8< ---------------- 8< ---------------- 8< -------- This happens because the implementation is broken, it does a "add" internally instead of a "delete". Reviewed-by: Daniel Kiper 2023-05-17 Xiaotian Wu tests: Add LoongArch to various test cases I ran the test suite on a 3A5000 desktop, a LoongArch architecture machine, using Archlinux for LoongArch distro, see https://github.com/loongarchlinux. Some software versions are: * linux 6.3.0-rc4 * gcc 13.0.1 20230312 * binutils 2.40 * qemu 7.2.0 The test results of running "make check" with qemu 7.2 are as follows: ================================= GRUB 2.11: ./test-suite.log ================================= # TOTAL: 85 # PASS: 73 # SKIP: 8 # XFAIL: 0 # FAIL: 2 # XPASS: 0 # ERROR: 2 .. contents:: :depth: 2 ERROR: f2fs_test ================ mount: /tmp/grub-fs-tester.20230418175640563815408.f2fs.UDs/f2fs_rw: unknown filesystem type 'f2fs'. dmesg(1) may have more information after failed mount system call. MOUNT FAILED. ERROR f2fs_test (exit status: 99) FAIL: hfs_test ============== recode: Request `utf8..macroman' is erroneous mkfs.hfs: name required with -v option FAIL hfs_test (exit status: 1) ERROR: zfs_test =============== zpool not installed; cannot test zfs. ERROR zfs_test (exit status: 99) SKIP: pata_test =============== SKIP pata_test (exit status: 77) SKIP: ahci_test =============== SKIP ahci_test (exit status: 77) SKIP: uhci_test =============== SKIP uhci_test (exit status: 77) SKIP: ohci_test =============== SKIP ohci_test (exit status: 77) SKIP: ehci_test =============== SKIP ehci_test (exit status: 77) SKIP: fddboot_test ================== SKIP fddboot_test (exit status: 77) SKIP: netboot_test ================== SKIP netboot_test (exit status: 77) SKIP: pseries_test ================== SKIP pseries_test (exit status: 77) FAIL: grub_func_test ==================== WARNING: Image format was not specified for '/tmp/grub-shell.HeTAD8Ty3U/grub.iso' and probing guessed raw. Automatically detecting the format is dangerous for raw images, write operations on block 0 will be restricted. Specify the 'raw' format explicitly to remove the restrictions. Functional test failure: shift_test: ... gfxterm_menu_640x480xi16:3 failed: 0xce34981e vs 0xd9f04953 tests/video_checksum.c:checksum:615: assert failed: 0 Checksum gfxterm_menu_640x480xi16:2 failed: 0xa8fb749d vs 0xbf3fa5d0 tests/video_checksum.c:checksum:615: assert failed: 0 Checksum gfxterm_menu_640x480xi16:1 failed: 0xce34981e vs 0xd9f04953 gfxterm_menu: FAIL ... videotest_checksum: videotest_checksum: PASS exfctest: exfctest: PASS TEST FAILURE FAIL grub_func_test (exit status: 1) We got 2 errors: * f2fs_test The kernel uses 16k pages, causing failures when loading the f2fs kernel module, see https://github.com/torvalds/linux/blob/master/fs/f2fs/super.c#L4670 This error can be ignored. * zfs_test zfs does not support the LoongArch architecture and is not compatible with the 6.3 kernel. This error can be ignored. We got 2 failures: * hfs_test I use recode 3.7.14-1 on Archlinux, running `recode -l` gives no output `MacRoman`, so we get this error. On Linux systems that support LoongArch, there is currently no need to use HFS, so this failure can be ignored. * grub_func_test I don't know the reason for this failure. I guess it may be related to qemu's edk2. In the previous review, I was told that the failure here is the expected behavior. So, we can ignore this failure. Reviewed-by: Daniel Kiper 2023-05-17 Xiaotian Wu tests: Fix timezone inconsistency in squashfs_test The image timestamp was not returned in UTC, but the following logic expected and used UTC. This patch fixes the test failure like described below: unsquashfs -s /tmp/grub-fs-tester.20230407111703613257436.squash4_gzip.9R4/squash4_gzip_512_4096_1_0.img grep '^Creation' awk '{print $6 " " $7 " " $8 " " $9 " " $10; }' FSTIME='Fri Apr 7 11:17:05 2023' date -d 'Fri Apr 7 11:17:05 2023' -u '+%Y-%m-%d %H:%M:%S' FSTIME='2023-04-07 11:17:05' date -d '2023-04-07 11:17:05 UTC -1 second' -u '+%Y-%m-%d %H:%M:%S' FSTIMEM1='2023-04-07 11:17:04' date -d '2023-04-07 11:17:05 UTC -2 second' -u '+%Y-%m-%d %H:%M:%S' FSTIMEM2='2023-04-07 11:17:03' date -d '2023-04-07 11:17:05 UTC -3 second' -u '+%Y-%m-%d %H:%M:%S' FSTIMEM3='2023-04-07 11:17:02' grep -F 'Last modification time 2023-04-07 11:17:05' echo 'Device loop0: Filesystem type squash4 - Last modification time 2023-04-07 03:17:05 Friday - Sector size 512B - Total size 10680KiB' echo 'Device loop0: Filesystem type squash4 - Last modification time 2023-04-07 03:17:05 Friday - Sector size 512B - Total size 10680KiB' grep -F 'Last modification time 2023-04-07 11:17:04' echo 'Device loop0: Filesystem type squash4 - Last modification time 2023-04-07 03:17:05 Friday - Sector size 512B - Total size 10680KiB' grep -F 'Last modification time 2023-04-07 11:17:03' echo 'Device loop0: Filesystem type squash4 - Last modification time 2023-04-07 03:17:05 Friday - Sector size 512B - Total size 10680KiB' grep -F 'Last modification time 2023-04-07 11:17:02' echo FSTIME FAIL Reviewed-by: Glenn Washburn Reviewed-by: Daniel Kiper 2023-05-17 Xiaotian Wu loongarch: Add to build system This patch adds LoongArch to the GRUB build system and various tools, so GRUB can be built on LoongArch as a UEFI application. Reviewed-by: Daniel Kiper 2023-05-17 Xiaotian Wu loongarch: Add auxiliary files Add support for manipulating architectural cache and timers, and EFI memory maps. Reviewed-by: Daniel Kiper 2023-05-17 Xiaotian Wu loongarch: Add support for ELF psABI v2.00 relocations A new set of relocation types was added in the LoongArch ELF psABI v2.00 spec [1], [2] to replace the stack-based scheme in v1.00. Toolchain support is available from binutils 2.40 and gcc 13 onwards. This patch adds support for the new relocation types, that are simpler to handle (in particular, stack operations are gone). Support for the v1.00 relocs are kept for now, for compatibility with older toolchains. [1] https://github.com/loongson/LoongArch-Documentation/pull/57 [2] https://loongson.github.io/LoongArch-Documentation/LoongArch-ELF-ABI-EN.html#_appendix_revision_history Reviewed-by: Daniel Kiper 2023-05-17 Xiaotian Wu loongarch: Add support for ELF psABI v1.00 relocations This patch adds support of the stack-based LoongArch relocations throughout GRUB, including tools, dynamic linkage, and support for conversion of ELF relocations into PE ones. A stack machine is required to handle these per the spec [1] (see the R_LARCH_SOP types), of which a simple implementation is included. These relocations are produced by binutils 2.38 and 2.39, while the newer v2.00 relocs require more recent toolchain (binutils 2.40+ & gcc 13+, or LLVM 16+). GCC 13 has not been officially released as of early 2023, so support for v1.00 relocs are expected to stay relevant for a while. [1] https://loongson.github.io/LoongArch-Documentation/LoongArch-ELF-ABI-EN.html#_relocations Reviewed-by: Daniel Kiper 2023-05-17 Xiaotian Wu loongarch: Add early startup code On entry, we need to save the system table pointer as well as our image handle. Add an early startup file that saves them and then brings us into our main function. Reviewed-by: Daniel Kiper 2023-05-17 Xiaotian Wu loongarch: Add setjmp implementation This patch adds a setjmp implementation for LoongArch. Reviewed-by: Daniel Kiper 2023-05-17 Xiaotian Wu elf: Add LoongArch definitions Add ELF e_machine ID [1] and relocations types [2] for LoongArch to the current in-repo definitions. [1] https://loongson.github.io/LoongArch-Documentation/LoongArch-ELF-ABI-EN.html#_e_machine_identifies_the_machine [2] https://loongson.github.io/LoongArch-Documentation/LoongArch-ELF-ABI-EN.html#_relocations Reviewed-by: Daniel Kiper 2023-05-17 Xiaotian Wu pe: Add LoongArch definitions Add PE machine types [1] and relocation types [2] for LoongArch to the current in-repo definitions. [1] https://learn.microsoft.com/en-us/windows/win32/debug/pe-format#machine-types [2] https://learn.microsoft.com/en-us/windows/win32/debug/pe-format#base-relocation-types Reviewed-by: Daniel Kiper 2023-05-16 Chris Coulson font: Try opening fonts from the bundled memdisk GRUB since 93a786a00 (kern/efi/sb: Enforce verification of font files) has enforced verification of font files in secure boot mode. In order to continue to be able to load some default fonts, vendors may bundle them with their signed EFI image by adding them to the built-in memdisk. This change makes the font loader try loading fonts from the memdisk before the prefix path when attempting to load a font file by specifying its filename, which avoids having to make changes to GRUB configurations in order to accommodate memdisk bundled fonts. It expects the directory structure to be the same as fonts stored in the prefix path, i.e. /fonts/.pf2. Reviewed-by: Steve McIntyre <93sam@debian.org> Tested-by: Steve McIntyre <93sam@debian.org> Reviewed-by: Robbie Harwood Reviewed-by: Daniel Kiper 2023-05-16 Robbie Harwood Aaron Miller Peter Jones net: Read bracketed IPv6 addrs and port numbers Allow specifying port numbers for http and tftp paths and allow IPv6 addresses to be recognized with brackets around them, which is required to specify a port number. Reviewed-by: Daniel Kiper 2023-05-16 Robbie Harwood Revert "net/http: Allow use of non-standard TCP/IP ports" The notation introduced in ac8a37dda (net/http: Allow use of non-standard TCP/IP ports) contradicts that used in downstream distributions including Fedora, RHEL, Debian, Ubuntu, and others. Revert it and apply the downstream notation which was originally proposed to the GRUB in 2016. This reverts commit ac8a37dda (net/http: Allow use of non-standard TCP/IP ports). Reviewed-by: Daniel Kiper 2023-05-16 Riku Viitanen term/at_keyboard: Add timeout to fix hang on HP EliteBooks This fixes the GRUB on Coreboot on HP EliteBooks by implementing a 200 ms timeout. The GRUB used to hang. Fixes: https://ticket.coreboot.org/issues/141 Reviewed-by: Daniel Kiper 2023-04-13 Glenn Washburn tests/util/grub-fs-tester: Add missing redirect to /dev/null In filesystem timestamp test, a check is done to verify that the timestamp for a file as reported in Linux by the filesystem is within a few seconds of the timestamp as reported by GRUB. This is done by grepping the output of GRUB's ls command for the timestamp as reported by the filesystem in Linux and for each of 3 seconds past that timestamp. All of these checks except one redirect the output of grep to /dev/null. Fix this exception to behave as the other checks. Reviewed-by: Daniel Kiper 2023-04-13 Mukesh Kumar Chaurasiya disk: Replace transform_sector() function with grub_disk_to_native_sector() The transform_sector() function is not very clear in what it's doing and confusing. The GRUB already has a function which is doing the same thing in a very self explanatory way, i.e., grub_disk_to_native_sector(). So, it's much better to use self explanatory one than transform_sector(). Reviewed-by: Daniel Kiper 2023-04-13 Thomas Schmitt tests: Add test for iso9660 delayed CE hop The ISO filesystem image iso9660_early_ce.iso exposes the unusual situation that the Rock Ridge name entry of its only file is located after a CE entry which points to the next continuation area. The correct behavior is to read the Rock Ridge name and to only then load the next continuation area. If GRUB performs this correctly, then the name "RockRidgeName:x" will be read and reported by grub-fstest. If GRUB wrongly performs the CE hop immediately when encountering the CE entry, then the dull ISO 9660 name "rockridg" will not be overridden and be put out by grub-fstest. Tested-by: Lidong Chen Reviewed-by: Daniel Kiper 2023-04-13 Thomas Schmitt fs/iso9660: Delay CE hop until end of current SUSP area The SUSP specs demand that the reading of the next SUSP area which is depicted by a CE entry shall be delayed until reading of the current SUSP area is completed. Up to now GRUB immediately ends reading of the current area and loads the new one. So, buffer the parameters of a found CE entry and perform checks and reading of new data only after the reader loop has ended. Tested-by: Lidong Chen Reviewed-by: Daniel Kiper 2023-03-29 Avnish Chouhan kern/ieee1275/init: Extended support in Vec5 This patch enables multiple options in Vec5 which are required and solves the boot issues seen on some machines which are looking for these specific options. 1. LPAR: Client program supports logical partitioning and associated hcall()s. 2. SPLPAR: Client program supports the Shared Processor LPAR Option. 3. DYN_RCON_MEM: Client program supports the “ibm,dynamic-reconfiguration-memory” property and it may be presented in the device tree. 4. LARGE_PAGES: Client supports pages larger than 4 KB. 5. DONATE_DCPU_CLS: Client supports donating dedicated processor cycles. 6. PCI_EXP: Client supports PCI Express implementations utilizing Message Signaled Interrupts (MSIs). 7. CMOC: Enables the Cooperative Memory Over-commitment Option. 8. EXT_CMO: Enables the Extended Cooperative Memory Over-commit Option. 9. ASSOC_REF: Enables “ibm,associativity” and “ibm,associativity-reference-points” properties. 10. AFFINITY: Enables Platform Resource Reassignment Notification. 11. NUMA: Supports NUMA Distance Lookup Table Option. 12. HOTPLUG_INTRPT: Supports Hotplug Interrupts. 13. HPT_RESIZE: Enable Hash Page Table Resize Option. 14. MAX_CPU: Defines maximum number of CPUs supported. 15. PFO_HWRNG: Supports Random Number Generator. 16. PFO_HW_COMP: Supports Compression Engine. 17. PFO_ENCRYPT: Supports Encryption Engine. 18. SUB_PROCESSORS: Supports Sub-Processors. 19. DY_MEM_V2: Client program supports the “ibm,dynamic-memory-v2” property in the “ibm,dynamic-reconfiguration-memory” node and it may be presented in the device tree. 20. DRC_INFO: Client program supports the “ibm,drc-info” property definition and it may be presented in the device tree. Reviewed-by: Daniel Kiper 2023-03-29 Avnish Chouhan kern/ieee1275/init: Convert plain numbers to constants in Vec5 This patch converts the plain numbers used in Vec5 properties to constants. 1. LPAR: Client program supports logical partitioning and associated hcall()s. 2. SPLPAR: Client program supports the Shared Processor LPAR Option. 3. CMO: Enables the Cooperative Memory Over-commitment Option. 4. MAX_CPU: Defines maximum number of CPUs supported. Reviewed-by: Daniel Kiper 2023-03-29 Robbie Harwood loader/emu/linux: Work around systemctl kexec returning Per systemctl(1), it "is asynchronous; it will return after the reboot operation is enqueued, without waiting for it to complete". This differs from kexec(8), which calls reboot(2) and therefore does not return. When not using fallback, this confusingly results in: error trying to perform 'systemctl kexec': 0 Aborted. Press any key to exit. on screen for a bit, followed by successful kexec. To reduce the likelihood of hitting this case, add a delay on successful return. Ultimately, the systemd interface is racy: we can't avoid it entirely unless we never fallback on success. Reviewed-by: Daniel Kiper 2023-03-29 Michael Chang tpm: Disable the tpm verifier if the TPM device is not present When the tpm module is loaded, the verifier reads entire file into memory, measures it and uses verified content as a backing buffer for file accesses. However, this process may result in high memory utilization for file operations, sometimes causing a system to run out of memory which may finally lead to boot failure. To address this issue, among others, the commit 887f98f0d (mm: Allow dynamically requesting additional memory regions) have optimized memory management by dynamically allocating heap space to maximize memory usage and reduce threat of memory exhaustion. But in some cases problems may still arise, e.g., when large ISO images are mounted using loopback or when dealing with embedded systems with limited memory resources. Unfortunately current implementation of the tpm module doesn't allow elimination of the back buffer once it is loaded. Even if the TPM device is not present or it has been explicitly disabled. This may unnecessary allocate a lot memory. To solve this issue, a patch has been developed to detect the TPM status at module load and skip verifier registration if the device is missing or deactivated. This prevents allocation of memory for the back buffer, avoiding wasting memory when no real measure boot functionality is performed. Disabling the TPM device in the system can reduce memory usage in the GRUB. It is useful in scenarios where high memory utilization is a concern and measurements of loaded artifacts are not necessary. Reviewed-by: Daniel Kiper 2023-03-29 Glenn Washburn INSTALL: Document programs and packages needed for using gdb_grub script Now that the gdb_grub script uses the Python API in GDB, a GDB with Python support must be used. Note that this means a GDB with version greater than 7.0 must be used. This should not be an issue since that was released over a decade ago. Also, the minimum version of Python must be 3.5, which was released around 8 years ago. Reviewed-by: Daniel Kiper 2023-03-29 Atish Patra RISC-V: Use common linux loader RISC-V doesn't have to do anything very different from other architectures to loader EFI stub linux kernel. As a result, just use the common linux loader instead of defining a RISC-V specific linux loader. Reviewed-by: Daniel Kiper 2023-03-29 Atish Patra efi: Remove arch specific image headers for RISC-V, ARM64 and ARM The arch specific image header details are not very useful as most of the GRUB just looks at the PE/COFF spec parameters (PE32 magic and header offset). Remove the arch specific images headers and define a generic arch headers that provide enough PE/COFF fields for the GRUB to parse kernel images correctly. Reviewed-by: Daniel Kiper 2023-03-29 Atish Patra loader/efi: Move ARM64 linux loader to common code ARM64 linux loader code is written in such a way that it can be reused across different architectures without much change. Move it to common code so that RISC-V doesn't have to define a separate loader. Reviewed-by: Daniel Kiper 2023-03-14 Alec Brown util/grub-module-verifierXX: Add module_size parameter to functions for sanity checking In grub-module-verifierXX.c, the function grub_module_verifyXX() performs an initial check that the ELF section headers are within the module's size, but doesn't check if the sections being accessed have contents that are within the module's size. In particular, we need to check that sh_offset and sh_size are less than the module's size. However, for some section header types we don't need to make these checks. For the type SHT_NULL, the section header is marked as inactive and the rest of the members within the section header have undefined values, so we don't need to check for sh_offset or sh_size. In the case of the type SHT_NOBITS, sh_offset has a conceptual offset which may be beyond the module size. Also, this type's sh_size may have a non-zero size, but a section of this type will take up no space in the module. This can all be checked in the function get_shdr(), but in order to do so, the parameter module_size must be added to functions so that the value of the module size can be used in get_shdr() from grub_module_verifyXX(). Also, had to rework some for loops to ensure the index passed to get_shdr() is within bounds. Reviewed-by: Daniel Kiper 2023-03-14 Glenn Washburn gdb: Add extra early initialization symbols for i386-pc Add symbols for boot.image, disk.image, and lzma_decompress.image if the target is i386-pc. This is only done for i386-pc because that is the only target that uses the images. By loading the symbols for these images, these images can be more easily debugged by allowing the setting of break- points in that code and to see easily get the value of data symbols. Reviewed-by: Daniel Kiper 2023-03-14 Glenn Washburn gdb: Modify gdb prompt when running gdb_grub script This will let users know that the GDB session is using the GRUB gdb scripts. Reviewed-by: Daniel Kiper 2023-03-14 Glenn Washburn gdb: Allow running user-defined commands at GRUB start A new command, run_on_start, for things to do before GRUB starts executing. Currently, this is setting up the loading of module symbols as they are loaded and allowing user-defined script to be run if a command named "onstart" exists. On some platforms, notably x86, software breakpoints set in GDB before the GRUB image is loaded will be cleared when the image is loaded. This is because the breakpoints work by overwriting the memory of the break- point location with a special instruction which when hit will cause the debugger to stop execution. Just before execution is resumed by the debugger, the original instruction bytes are put back. When a breakpoint is set before the GRUB image is loaded, the special debugger instruction will be written to memory and when the GRUB image is loaded by the firmware, which has no knowledge of the debugger, the debugger instruction is overwritten. To the GDB user, GDB will show the breakpoint as set, but it will never be hit. Furthermore, GDB now becomes confused, such that even deleting and re-setting the breakpoint after the GRUB image is loaded will not allow for a working breakpoint. To work around this, in run_on_start, first a watchpoint is set on _start, which will be triggered when the firmware starts loading the GRUB image. When the _start watchpoint is hit, the current breakpoints are saved to a file and then deleted by GDB before they can be overwritten by the firmware and confuse GDB. Then a temporary software breakpoint is set on _start, which will get triggered when the firmware hands off to GRUB to execute. In that breakpoint load the previously saved and deleted breakpoints now that there is no worry of them getting overwritten by the firmware. This is needed for runtime_load_module to work when it is run before the GRUB image is loaded. Note that watchpoints are generally types of hardware breakpoints on x86, so its deleted as soon as it gets triggered so that a minimal set of hardware breakpoints are used, allowing more for the user. Reviewed-by: Daniel Kiper 2023-03-14 Glenn Washburn gdb: Add functions to make loading from dynamically positioned targets easier Many targets, such as EFI, load GRUB at addresses that are determined at runtime. So the load addresses in kernel.exec will almost certainly be wrong. Given the address of the start of the text segment, these functions will tell GDB to load the symbols at the proper locations. It is left up to the user to determine how to get the text address of the loaded GRUB image. Reviewed-by: Daniel Kiper 2023-03-14 Glenn Washburn gdb: Replace module symbol loading implementation with Python one Remove gmodule.pl and rewrite as a python in gdb_helper.py. This removes Perl dependency for the GRUB GDB script, but adds Python as a dependency. This is more desirable because Python is tightly integrated with GDB and can do things not even available to GDB native scripting language. GDB must be built with Python, however this is not a major limitation because every major distro non-end-of-life versions build GDB with Python support. And GDB has had support for Python since around 7.1-ish, which is about a decade. This re-implementation has an added feature. If there is a user defined command named "onload_", then that command will be executed after the symbols for the specified module are loaded. When debugging a module it can be desirable to set break points on code in the module. This is difficult in GRUB because, at GDB start, the module is not loaded and on EFI platforms its not known ahead of time where the module will be loaded. So allow users to create an "onload_" command which will be run when the module with name "modname" is loaded. Another addition is a new convenience function is defined $is_user_command(), which returns true if its string argument is the name of a user-defined command. A secondary benefit of these changes is that the script does not write temporary files and has better error handling capabilities. Reviewed-by: Daniel Kiper 2023-03-14 Glenn Washburn gdb: Only connect to remote target once when first sourced The gdb_grub script was originally meant to be run once when GDB first starts up via the -x argument. So it runs commands unconditionally assuming that the script has not been run before. Its nice to be able to source the script again when developing the script to modify/add commands. So only run the commands not defined in user-defined commands, if a variable $runonce has already been set and when those commands have been run to set $runonce. Reviewed-by: Daniel Kiper 2023-03-14 Glenn Washburn gdb: Conditionally run GDB script logic for dynamically or statically positioned GRUB There are broadly two classes of targets to consider when loading symbols for GRUB, targets that determine where to load GRUB at runtime (dynamically positioned) and those that do not (statically positioned). For statically positioned targets, symbol loading is determined at link time, so nothing more needs to be known to load the symbols. For dynamically positioned targets, such as EFI targets, at runtime symbols should be offset by an amount that depends on where the runtime chose to load GRUB. It is important to not load symbols statically for dynamic targets because then when subsequently loading the symbols correctly one must take care to remove the existing static symbols, otherwise there will be two sets of symbols and GDB seems to prefer the ones loaded first (i.e. the static ones). Use autoconf variables to generate a gdb_grub for a particular target, which conditionally run startup code depending on if the target uses static or dynamic loading. Reviewed-by: Daniel Kiper 2023-03-14 Glenn Washburn gdb: Move runtime module loading into runtime_load_module By moving this code into a function, it can be run re-utilized while gdb is running, not just when loading the script. This will also be useful in some following changes which will make a separate script path for targets which statically vs dynamically position GRUB code. Reviewed-by: Daniel Kiper 2023-03-07 Michael Chang osdep/devmapper/getroot: Fix build error on 32-bit host The gcc build has failed for 32-bit host (e.g. i386-emu and arm-emu) due to mismatch between format specifier and data type. ../grub-core/osdep/devmapper/getroot.c: In function 'grub_util_pull_devmapper': ../grub-core/osdep/devmapper/getroot.c:265:75: error: format '%lu' expects argument of type 'long unsigned int', but argument 2 has type 'int' [-Werror=format=] ../grub-core/osdep/devmapper/getroot.c:276:80: error: format '%lu' expects argument of type 'long unsigned int', but argument 2 has type 'int' [-Werror=format=] This patch fixes the problem by casting the type of calculated offset to grub_size_t and use platform PRIuGRUB_SIZE as format specifier. Reviewed-by: Daniel Kiper 2023-03-07 Stefan Berger commands/ieee1275/ibmvtpm: Add support for trusted boot using a vTPM 2.0 Add support for trusted boot using a vTPM 2.0 on the IBM IEEE1275 PowerPC platform. With this patch grub now measures text and binary data into the TPM's PCRs 8 and 9 in the same way as the x86_64 platform does. This patch requires Daniel Axtens's patches for claiming more memory. Note: The tpm_init() function cannot be called from GRUB_MOD_INIT() since it does not find the device nodes upon module initialization and therefore the call to tpm_init() must be deferred to grub_tpm_measure(). For vTPM support to work on PowerVM, system driver levels 1010.30 or 1020.00 are required. Note: Previous versions of firmware levels with the 2hash-ext-log API call have a bug that, once this API call is invoked, has the effect of disabling the vTPM driver under Linux causing an error message to be displayed in the Linux kernel log. Those users will have to update their machines to the firmware levels mentioned above. Cc: Eric Snowberg Reviewed-by: Daniel Kiper Tested-by: Nageswara R Sastry Reviewed-by: Robbie Harwood 2023-03-07 Daniel Axtens commands/memtools: Add memtool module with memory allocation stress-test When working on memory, it's nice to be able to test your work. Add a memtest module. When compiled with --enable-mm-debug, it exposes 3 commands: * lsmem - print all allocations and free space in all regions * lsfreemem - print free space in all regions * stress_big_allocs - stress test large allocations: - how much memory can we allocate in one chunk? - how many 1MB chunks can we allocate? - check that gap-filling works with a 1MB aligned 900kB alloc + a 100kB alloc. Reviewed-by: Daniel Kiper Tested-by: Nageswara R Sastry Reviewed-by: Robbie Harwood 2023-03-07 Diego Domingos ieee1275: Implement vec5 for cas negotiation As a legacy support, if the vector 5 is not implemented, Power Hypervisor will consider the max CPUs as 64 instead 256 currently supported during client-architecture-support negotiation. This patch implements the vector 5 and set the MAX CPUs to 256 while setting the others values to 0 (default). Acked-by: Daniel Axtens Tested-by: Nageswara R Sastry Reviewed-by: Robbie Harwood Reviewed-by: Daniel Kiper 2023-03-07 Daniel Axtens ieee1275: Support runtime memory claiming On powerpc-ieee1275, we are running out of memory trying to verify anything. This is because: - we have to load an entire file into memory to verify it. This is difficult to change with appended signatures. - We only have 32MB of heap. - Distro kernels are now often around 30MB. So we want to be able to claim more memory from OpenFirmware for our heap at runtime. There are some complications: - The grub mm code isn't the only thing that will make claims on memory from OpenFirmware: * PFW/SLOF will have claimed some for their own use. * The ieee1275 loader will try to find other bits of memory that we haven't claimed to place the kernel and initrd when we go to boot. * Once we load Linux, it will also try to claim memory. It claims memory without any reference to /memory/available, it just starts at min(top of RMO, 768MB) and works down. So we need to avoid this area. See arch/powerpc/kernel/prom_init.c as of v5.11. - The smallest amount of memory a ppc64 KVM guest can have is 256MB. It doesn't work with distro kernels but can work with custom kernels. We should maintain support for that. (ppc32 can boot with even less, and we shouldn't break that either.) - Even if a VM has more memory, the memory OpenFirmware makes available as Real Memory Area can be restricted. Even with our CAS work, an LPAR on a PowerVM box is likely to have only 512MB available to OpenFirmware even if it has many gigabytes of memory allocated. What should we do? We don't know in advance how big the kernel and initrd are going to be, which makes figuring out how much memory we can take a bit tricky. To figure out how much memory we should leave unused, I looked at: - an Ubuntu 20.04.1 ppc64le pseries KVM guest: vmlinux: ~30MB initrd: ~50MB - a RHEL8.2 ppc64le pseries KVM guest: vmlinux: ~30MB initrd: ~30MB So to give us a little wriggle room, I think we want to leave at least 128MB for the loader to put vmlinux and initrd in memory and leave Linux with space to satisfy its early allocations. Allow other space to be allocated at runtime. Tested-by: Stefan Berger Tested-by: Nageswara R Sastry Reviewed-by: Robbie Harwood Reviewed-by: Daniel Kiper 2023-03-07 Daniel Axtens ieee1275: Drop len -= 1 quirk in heap_init This was apparently "required by some firmware": commit dc9468500919 (2007-02-12 Hollis Blanchard ). It's not clear what firmware that was, and what platform from 14 years ago which exhibited the bug then is still both in use and buggy now. It doesn't cause issues on qemu (mac99 or pseries) or under PFW for Power8. I don't have access to old Mac hardware, but if anyone feels especially strongly we can put it under some feature flag. I really want to disable it under pseries because it will mess with region merging. Reviewed-by: Daniel Kiper Tested-by: Nageswara R Sastry Reviewed-by: Robbie Harwood 2023-03-07 Daniel Axtens ieee1275: Request memory with ibm, client-architecture-support On PowerVM, the first time we boot a Linux partition, we may only get 256MB of real memory area, even if the partition has more memory. This isn't enough to reliably verify a kernel. Fortunately, the Power Architecture Platform Reference (PAPR) defines a method we can call to ask for more memory: the broad and powerful ibm,client-architecture-support (CAS) method. CAS can do an enormous amount of things on a PAPR platform: as well as asking for memory, you can set the supported processor level, the interrupt controller, hash vs radix mmu, and so on. If: - we are running under what we think is PowerVM (compatible property of / begins with "IBM"), and - the full amount of RMA is less than 512MB (as determined by the reg property of /memory) then call CAS as follows: (refer to the Linux on Power Architecture Reference, LoPAR, which is public, at B.5.2.3): - Use the "any" PVR value and supply 2 option vectors. - Set option vector 1 (PowerPC Server Processor Architecture Level) to "ignore". - Set option vector 2 with default or Linux-like options, including a min-rma-size of 512MB. - Set option vector 3 to request Floating Point, VMX and Decimal Floating point, but don't abort the boot if we can't get them. - Set option vector 4 to request a minimum VP percentage to 1%, which is what Linux requests, and is below the default of 10%. Without this, some systems with very large or very small configurations fail to boot. This will cause a CAS reboot and the partition will restart with 512MB of RMA. Importantly, grub will notice the 512MB and not call CAS again. Notes about the choices of parameters: - A partition can be configured with only 256MB of memory, which would mean this request couldn't be satisfied, but PFW refuses to load with only 256MB of memory, so it's a bit moot. SLOF will run fine with 256MB, but we will never call CAS under qemu/SLOF because /compatible won't begin with "IBM".) - unspecified CAS vectors take on default values. Some of these values might restrict the ability of certain hardware configurations to boot. This is why we need to specify the VP percentage in vector 4, which is in turn why we need to specify vector 3. Finally, we should have enough memory to verify a kernel, and we will reach Linux. One of the first things Linux does while still running under OpenFirmware is to call CAS with a much fuller set of options (including asking for 512MB of memory). Linux includes a much more restrictive set of PVR values and processor support levels, and this CAS invocation will likely induce another reboot. On this reboot grub will again notice the higher RMA, and not call CAS. We will get to Linux again, Linux will call CAS again, but because the values are now set for Linux this will not induce another CAS reboot and we will finally boot all the way to userspace. On all subsequent boots, everything will be configured with 512MB of RMA, so there will be no further CAS reboots from grub. (phyp is super sticky with the RMA size - it persists even on cold boots. So if you've ever booted Linux in a partition, you'll probably never have grub call CAS. It'll only ever fire the first time a partition loads grub, or if you deliberately lower the amount of memory your partition has below 512MB.) Reviewed-by: Daniel Kiper Tested-by: Nageswara R Sastry Reviewed-by: Robbie Harwood 2023-02-28 Khem Raj RISC-V: Handle R_RISCV_CALL_PLT reloc GNU assembler starting 2.40 release always generates R_RISCV_CALL_PLT reloc for call in assembler [1], similarly LLVM does not make distinction between R_RISCV_CALL_PLT and R_RISCV_CALL [2]. Fixes "grub-mkimage: error: relocation 0x13 is not implemented yet.". [1] https://sourceware.org/git/?p=binutils-gdb.git;a=commit;h=70f35d72ef04cd23771875c1661c9975044a749c [2] https://reviews.llvm.org/D132530 Reviewed-by: Daniel Kiper 2023-02-28 John Paul Adrian Glaubitz osdep/hurd/getroot: Remove unused variables in grub_util_find_hurd_root_device() Found during a test build on Debian/hurd-i386 with --disable-werror enabled: In file included from grub-core/osdep/getroot.c:12: grub-core/osdep/hurd/getroot.c: In function ‘grub_util_find_hurd_root_device’: grub-core/osdep/hurd/getroot.c:126:13: error: unused variable ‘next’ [-Werror=unused-variable] 126 | char *next; | ^~~~ grub-core/osdep/hurd/getroot.c:125:14: error: unused variable ‘size’ [-Werror=unused-variable] 125 | size_t size; | ^~~~ Fixes: e981b0a24 (osdep/hurd/getroot: Use "part:" qualifier) Reviewed-by: Samuel Thibault Reviewed-by: Daniel Kiper 2023-02-28 Glenn Washburn gdb: If no modules have been loaded, do not try to load module symbols This prevents load_all_modules from failing when called before any modules have been loaded. Failures in GDB user-defined functions cause any function which called them to also fail. Reviewed-by: Daniel Kiper 2023-02-28 Glenn Washburn gdb: Prevent wrapping when writing to .segments.tmp GDB logging is redirected to write .segments.tmp, which means that GDB will wrap lines longer than what it thinks is the screen width (typically 80 characters). When wrapping does occur it causes gmodule.pl to misbehave. So disable line wrapping by using GDB's "with" command so that its guaranteed to return the width to the previous value upon command completion. Also disable command tracing when dumping the module sections because that output will go to .segments.tmp and thus cause gmodule.pl to misbehave. Reviewed-by: Daniel Kiper 2023-02-28 Glenn Washburn gdb: Fix redirection issue in dump_module_sections An error in any GDB command causes it to immediately abort with an error, this includes any command that calls that command. This leads to an issue in dump_module_sections where an error causes the command to exit without turning off file redirection. The user then ends up with a GDB command line where commands output nothing to the console. Instead do the work of dump_module_sections in the command dump_module_sections_helper and run the command using GDB's pipe command which does the redirection and undoes the redirection when it finishes regardless of any errors in the command. Also, remove .segments.tmp file prior to loading modules in case one was left from a previous run. Reviewed-by: Daniel Kiper 2023-02-28 Glenn Washburn efi: Allow expression as func argument to efi_call_* macros on all platforms On EFI platforms where EFI calls do not require a wrapper (notably i386-efi and arm64-efi), the func argument needs to be wrapped in parenthesis to allow valid syntax when func is an expression which evaluates to a function pointer. On EFI platforms that do need a wrapper, this was never an issue because func is passed to the C function wrapper as an argument and thus does not need parenthesis to be evaluated. Reviewed-by: Daniel Kiper 2023-02-28 Jeremy Szu loader/i386/linux: Correct wrong initrd address for debug The "addr" is used to request the memory with specific ranges but the real loadable address come from the relocator. Thus, print the final retrieved addresses, virtual and physical, for initrd. On the occasion migrate to PRIxGRUB_ADDR and PRIxGRUB_SIZE format specifiers. Reviewed-by: Daniel Kiper 2023-02-28 Glenn Washburn INSTALL: Document that the functional test requires the package xfonts-unifont Reviewed-by: Thomas Schmitt Reviewed-by: Daniel Kiper 2023-02-28 Glenn Washburn tests: Return hard error for functional test when unicode.pf2 does not exist The functional test requires unicode.pf2 to run successfully, so explicitly have the test return ERROR when its not found. Tested-by: Thomas Schmitt Reviewed-by: Daniel Kiper 2023-02-28 Glenn Washburn tests: grub_cmd_cryptomount should hard error when pre-requisites are not met Tests should be SKIP'd only when they do not apply to a particular target. Hard errors are for when the test should run but can not be setup properly. Reviewed-by: Daniel Kiper 2023-02-28 Glenn Washburn tests: Add pathological iso9660 filesystem tests These are not added to grub-fs-tester because they are not generated and none of the filesystem tests are run on these ISOs. The test is to run the command "ls /" on the ISO, and a failure is determined if the command times out, has non-zero return value or has any output. Tested-by: Thomas Schmitt Reviewed-by: Daniel Kiper 2023-02-14 Mukesh Kumar Chaurasiya osdep/linux/hostdisk: Modify sector by sysfs as disk sector The disk sector size provided by sysfs file system considers the sector size of 512 irrespective of disk sector size, thus causing the read by the GRUB to an incorrect offset from what was originally intended. Considering the 512 sector size of sysfs data the actual sector needs to be modified corresponding to disk sector size. Reviewed-by: Daniel Kiper 2023-02-14 Glenn Washburn tests/util/grub-fs-tester: Use shell variable instead of autoconf By using a shell variable that is set once by the expansion of an autoconf variable, the resulting script is more readable. Reviewed-by: Daniel Kiper 2023-02-14 Glenn Washburn tests/util/grub-fs-tester: Remove unused variable Reviewed-by: Daniel Kiper 2023-02-14 Alec Brown net/bootp: Fix unchecked return value In the function send_dhcp_packet(), added an error check for the return value of grub_netbuff_push(). Fixes: CID 404614 Reviewed-by: Daniel Kiper 2023-02-02 Zhang Boyang mm: Avoid complex heap growth math in hot path We do a lot of math about heap growth in hot path of grub_memalign(). However, the result is only used if out of memory is encountered, which is seldom. This patch moves these calculations away from hot path. These calculations are now only done if out of memory is encountered. This change can also help compiler to optimize integer overflow checks away. Reviewed-by: Daniel Kiper 2023-02-02 Zhang Boyang mm: Preallocate some space when adding new regions When grub_memalign() encounters out-of-memory, it will try grub_mm_add_region_fn() to request more memory from system firmware. However, it doesn't preallocate memory space for future allocation requests. In extreme cases, it requires one call to grub_mm_add_region_fn() for each memory allocation request. This can be very slow. This patch introduces GRUB_MM_HEAP_GROW_EXTRA, the minimal heap growth granularity. The new region size is now set to the bigger one of its original value and GRUB_MM_HEAP_GROW_EXTRA. Thus, it will result in some memory space preallocated if current allocations request is small. The value of GRUB_MM_HEAP_GROW_EXTRA is set to 1MB. If this value is smaller, the cost of small memory allocations will be higher. If this value is larger, more memory will be wasted and it might cause out-of-memory on machines with small amount of RAM. Reviewed-by: Daniel Kiper 2023-02-02 Zhang Boyang mm: Adjust new region size to take management overhead into account When grub_memalign() encounters out-of-memory, it will try grub_mm_add_region_fn() to request more memory from system firmware. However, the size passed to it doesn't take region management overhead into account. Adding a memory area of "size" bytes may result in a heap region of less than "size" bytes really available. Thus, the new region may not be adequate for current allocation request, confusing out-of-memory handling code. This patch introduces GRUB_MM_MGMT_OVERHEAD to address the region management overhead (e.g. metadata, padding). The value of this new constant must be large enough to make sure grub_memalign(align, size) always succeeds after a successful call to grub_mm_init_region(addr, size + align + GRUB_MM_MGMT_OVERHEAD), for any given addr and size (assuming no integer overflow). The size passed to grub_mm_add_region_fn() is now correctly adjusted, thus if grub_mm_add_region_fn() succeeded, current allocation request can always succeed. Reviewed-by: Daniel Kiper 2023-02-02 Glenn Washburn tests/util/grub-shell: Add $GRUB_QEMU_OPTS to run.sh to easily see unofficial QEMU arguments When re-running a failed test, even the non-standard grub-shell QEMU arguments should be preserved in the run.sh to more precisely replay the failed test run. Reviewed-by: Daniel Kiper 2023-02-02 Glenn Washburn tests/util/grub-shell: Create run.sh in working directory for easily running test again Now it becomes trivial to re-run a test from the output in its working directory. This also makes it easy to send a reproducible failing test to the mailing list. This has allowed a refactor so that the duplicated code to call QEMU has be condensed (e.g. the use of timeout and file descriptor redirection). The run.sh script will pass any arguments given to QEMU. This allows QEMU to be easily started in a state ready for GDB to be attached. Reviewed-by: Daniel Kiper 2023-02-02 Glenn Washburn tests: Allow turning on shell tracing from environment variables This allows turning on shell tracing for grub-shell and grub-fs-tester when its not practical or not possible to use command line arguments (e.g. from "make check"). Turn on tracing when the envvar is an integer greater than 1, since these can generate a lot of output. Since this change uses the environment variables to set the default value for debug in grub-shell, this allows enabling grub-shell's debug mode which will preserve various generated output files that are helpful for debugging tests. Reviewed-by: Daniel Kiper 2023-02-02 Glenn Washburn misc: Move *printf function declarations to same location Reviewed-by: Daniel Kiper 2023-02-02 Thomas Schmitt fs/iso9660: Prevent skipping CE or ST at start of continuation area If processing of a SUSP CE entry leads to a continuation area which begins by entry CE or ST, then these entries were skipped without interpretation. In case of CE this would lead to premature end of processing the SUSP entries of the file. In case of ST this could cause following non-SUSP bytes to be interpreted as SUSP entries. Tested-by: Lidong Chen Reviewed-by: Thomas Schmitt Reviewed-by: Daniel Kiper 2023-02-02 Lidong Chen fs/iso9660: Incorrect check for entry boundary An SL entry consists of the entry info and the component area. The entry info should take up 5 bytes instead of sizeof(*entry). The area after the first 5 bytes is the component area. It is incorrect to use the sizeof(*entry) to check the entry boundary. Reviewed-by: Thomas Schmitt Reviewed-by: Daniel Kiper 2023-02-02 Lidong Chen fs/iso9660: Avoid reading past the entry boundary Added a check for the SP entry data boundary before reading it. Reviewed-by: Thomas Schmitt Reviewed-by: Daniel Kiper 2023-02-02 Lidong Chen fs/iso9660: Prevent read past the end of system use area In the code, the for loop advanced the entry pointer to the next entry before checking if the next entry is within the system use area boundary. Another issue in the code was that there is no check for the size of system use area. For a corrupted system, the size of system use area can be less than the size of minimum SUSP entry size (4 bytes). These can cause buffer overrun. The fixes added the checks to ensure the read is valid and within the boundary. Reviewed-by: Thomas Schmitt Reviewed-by: Daniel Kiper 2023-02-02 Lidong Chen fs/iso9660: Add check to prevent infinite loop There is no check for the end of block when reading directory extents. It resulted in read_node() always read from the same offset in the while loop, thus caused infinite loop. The fix added a check for the end of the block and ensure the read is within directory boundary. Reviewed-by: Thomas Schmitt Reviewed-by: Daniel Kiper 2023-02-01 Pierre-Louis Bonicoli grub-fs-tester: Add LUKS1 and LUKS2 support The logical sector size used by LUKS1 is 512 bytes and LUKS2 uses 512 to 4069 bytes. The default password used is "pass", but can be overridden by setting the PASS environment variable. The device mapper name is set to the name of the temp directory so that its easy to correlate device mapper name with a particular test run. Also since this name is unique per test run, multiple simultaneous test runs are allowed. Note that cryptsetup is passing the --disable-locks parameter to allow cryptsetup run successfully when /run/lock/cryptsetup is not accessible. Since the device mapper name is unique per test run, there is no need to worry about locking the device to serialize access. Tested-by: Glenn Washburn Reviewed-by: Patrick Steinhardt Reviewed-by: Daniel Kiper 2023-02-01 Josselin Poiret osdep/devmapper/getroot: Set up cheated LUKS2 cryptodisk mount from DM parameters This lets a LUKS2 cryptodisk have its cipher and hash filled out, otherwise they wouldn't be initialized if cheat mounted. Tested-by: Glenn Washburn Reviewed-by: Patrick Steinhardt Reviewed-by: Daniel Kiper 2023-02-01 Josselin Poiret osdep/devmapper/getroot: Have devmapper recognize LUKS2 Changes UUID comparisons so that LUKS1 and LUKS2 are both recognized as being LUKS cryptodisks. Tested-by: Glenn Washburn Reviewed-by: Patrick Steinhardt Reviewed-by: Daniel Kiper 2023-02-01 Fabian Vogt disk/cryptodisk: When cheatmounting, use the sector info of the cheat device When using grub-probe with cryptodisk, the mapped block device from the host is used directly instead of decrypting the source device in GRUB code. In that case, the sector size and count of the host device needs to be used. This is especially important when using LUKS2, which does not assign total_sectors and log_sector_size when scanning, but only later when the segments in the JSON area are evaluated. With an unset log_sector_size, grub_device_open() complains. This fixes grub-probe failing with "error: sector sizes of 1 bytes aren't supported yet.". Reviewed-by: Patrick Steinhardt Tested-by: Glenn Washburn Reviewed-by: Glenn Washburn Reviewed-by: Patrick Steinhardt Reviewed-by: Daniel Kiper 2023-01-19 Daniel Axtens fs/f2fs: Fix off-by-one error in nat journal entries check Oops. You're allowed to have up to n = NAT_JOURNAL_ENTRIES entries _inclusive_, because the loop below uses i < n, not i <= n. D'oh. Fixes: 4bd9877f6216 (fs/f2fs: Do not read past the end of nat journal entries) Reported-by: программист нект Tested-by: программист нект Reviewed-by: Daniel Kiper 2023-01-19 Nicholas Vinson gentpl.py: Remove .interp section from .img files When building .img files, a .interp section from the .image files will sometimes be copied into the .img file. This additional section pushes the .img file beyond the 512-byte limit and causes grub-install to fail to run for i386-pc platforms. Reviewed-by: Daniel Kiper 2023-01-19 Glenn Washburn tests: Add cryptomount functional test The grub_cmd_cryptomount make check test performs some functional testing of cryptomount and by extension the underlying cryptodisk infrastructure. A utility test script named grub-shell-luks-tester is created to handle the complexities of the testing, making it simpler to add new test cases in grub_cmd_cryptomount. Reviewed-by: Daniel Kiper 2023-01-19 Glenn Washburn tests/util/grub-shell: Add halt_cmd variable to testcase namespace This allows test case scripts to use the appropriate halt command for the built architecture to end execution early. Otherwise, test case scripts have no way to know the appropriate mechanism for halting the test case early. Reviewed-by: Daniel Kiper 2023-01-19 Glenn Washburn tests/util/grub-shell: Trim line should always be matched from the beginning of the line When turning on shell tracing the trim line will be output before we actually want to start the trim. However, in this case the trim line never starts from the beginning of the line. So start trimming from the correct line by matching from the beginning of the line. Reviewed-by: Daniel Kiper 2023-01-19 Glenn Washburn tests/util/grub-shell: Allow specifying non-default trim line contents This will be useful for tests that have unwanted output from setup. This is not documented because its only intended to be internal at the moment. Also, --no-trim is allowed to explicitly turn off trim. Reviewed-by: Daniel Kiper 2023-01-19 Glenn Washburn tests/util/grub-shell: Only cleanup working directory file if QEMU does not fail or timeout This keeps the generated files to aid in diagnosing the source of the failure. Reviewed-by: Daniel Kiper 2023-01-19 Glenn Washburn tests/util/grub-shell: Set exit status to QEMU exit status This allows us to test if unexpected output in test scripts is because of a bug in GRUB, because there was an error in QEMU, or QEMU was killed due to a timeout. Reviewed-by: Daniel Kiper 2023-01-19 Glenn Washburn io/gzio: Remove confusing, out-dated comment The "transparent" parameter to grub_gzio_open() was removed in 2010, fc2ef1172c (* grub-core/io/gzio.c (grub_gzio_open): Removed "transparent" parameter.) Reviewed-by: Daniel Kiper 2023-01-19 Glenn Washburn efi: Fix spacing Reviewed-by: Daniel Kiper misc: Fix spacing Reviewed-by: Daniel Kiper misc: Spelling fixes Reviewed-by: Daniel Kiper gdb: Unregister gdbstub_break command when unloading module Reviewed-by: Daniel Kiper 2023-01-19 Glenn Washburn tests: Fix help test to reflect updated help output Commit f5759a878 (normal/help: Add paging instructions to normal and help prompts) changed the output of the help command, which broke the help test. This change allows the test to pass. On the occasion do s/outpu/output/. Reviewed-by: Daniel Kiper 2023-01-19 Benjamin Herrenschmidt term/serial: Improve detection of duplicate serial ports We currently rely on some pretty fragile comparison by name to identify whether a serial port being configured is identical Reviewed-by: Daniel Kiper 2023-01-19 Benjamin Herrenschmidt term/serial: Avoid double lookup of serial ports The various functions to add a port used to return port->name, and the callers would immediately iterate all registered ports to "find" the one just created by comparing that return value with ... port->name. This is a waste of cycles and code. Instead, have those functions return "port" directly. Reviewed-by: Daniel Kiper 2023-01-19 Benjamin Herrenschmidt term/serial: Replace usage of memcmp() with strncmp() We are comparing strings after all. Reviewed-by: Daniel Kiper 2023-01-19 Benjamin Herrenschmidt term/serial: Add ability to specify MMIO ports via "serial" command This adds the ability to explicitly add an MMIO based serial port via the "serial" command. The syntax is: serial --port=mmio,{.b,.w,.l,.q} Reviewed-by: Daniel Kiper 2023-01-19 Benjamin Herrenschmidt term/ns8250: Support more MMIO access sizes It is common for PCI based UARTs to use larger than one byte access sizes. This adds support for this and uses the information present in SPCR accordingly. Reviewed-by: Daniel Kiper 2023-01-19 Benjamin Herrenschmidt term/ns8250: Use ACPI SPCR table when available to configure serial "serial auto" is now equivalent to just "serial" and will use the SPCR to discover the port if present, otherwise defaults to "com0" as before. This allows to support MMIO ports specified by ACPI which is needed on AWS EC2 "metal" instances, and will enable GRUB to pickup the port configuration specified by ACPI in other cases. Reviewed-by: Daniel Kiper 2023-01-19 Benjamin Herrenschmidt term/ns8250: Add configuration parameter when adding ports This will allow ports to be added with a pre-set configuration. Reviewed-by: Daniel Kiper 2023-01-19 Benjamin Herrenschmidt term/ns8250: Move base clock definition to a header And while at it, unify it as clock frequency in Hz, to match the value in grub_serial_config struct and do the division by 16 in one common place. This will simplify adding SPCR support. Reviewed-by: Daniel Kiper 2023-01-19 Benjamin Herrenschmidt term/ns8250: Add base support for MMIO UARTs This adds the ability for the driver to access UARTs via MMIO instead of PIO selectively at runtime, and exposes a new function to add an MMIO port. In an ideal world, MMIO accessors would be generic and have architecture specific memory barriers. However, existing drivers don't have them and most of those "bare metal" drivers tend to be for x86 which doesn't need them. If necessary, those can be added later. Reviewed-by: Daniel Kiper 2023-01-18 Benjamin Herrenschmidt acpi: Add SPCR and generic address definitions This adds the definition of the two ACPI tables according to the spec. Reviewed-by: Daniel Kiper 2023-01-18 Benjamin Herrenschmidt kern/acpi: Export a generic grub_acpi_find_table() And convert grub_acpi_find_fadt() to use it. Reviewed-by: Daniel Kiper 2023-01-10 Maxim Fomin kern/fs: Fix possible integer overflow in i386-pc mode with large partitions The i386-pc mode supports MBR partition scheme where maximum partition size is 2 TiB. In case of large partitions left shift expression with unsigned long int "length" object may cause integer overflow making calculated partition size less than true value. This issue is fixed by increasing the size of "length" integer type. Reviewed-by: Daniel Kiper 2023-01-10 Glenn Washburn commands/cmp: Only return success when both files have the same contents This allows the cmp command to be used in GRUB scripts to conditionally run commands based on whether two files are the same. The command is now quiet by default and the -v switch can be given to enable verbose mode, the previous behavior. Update documentation accordingly. Suggested-by: Li Gen Reviewed-by: Daniel Kiper 2023-01-10 Glenn Washburn docs: Remove text about cryptodisk UUIDs no being able to use dashes This was fixed here: 3cf2e848bc (disk/cryptodisk: Allows UUIDs to be compared in a dash-insensitive manner). Reviewed-by: Daniel Kiper 2023-01-10 Glenn Washburn tests/util/grub-shell: Add GRUB output logfile with grub-shell --debug This allows seeing full QEMU output of grub-shell, which can be invaluable when debugging failing tests. Reviewed-by: Daniel Kiper 2023-01-10 Marek Marczykowski-Górecki templates/linux_xen: Fix detecting XSM policy The xenpolicy variable was left set from previous function call. This resulted in all-but-first menu entries including XSM policy, even if it did not exist. Fix this by initializing the xenpolicy variable. Reviewed-by: Daniel Kiper 2023-01-10 Zhang Boyang font: Reject fonts with negative max_char_width or max_char_height If max_char_width or max_char_height are negative wrong values can be propagated by grub_font_get_max_char_width() or grub_font_get_max_char_height(). Prevent this from happening. Reviewed-by: Daniel Kiper 2023-01-10 Zhang Boyang font: Assign null_font to unknown_glyph Like glyphs in ascii_font_glyph[], assign null_font to unknown_glyph->font in order to prevent grub_font_get_*() from dereferencing NULL pointer. Reviewed-by: Daniel Kiper 2023-01-10 Zhang Boyang font: Check return value of grub_malloc() in ascii_glyph_lookup() There is a problem in ascii_glyph_lookup(). It doesn't check the return value of grub_malloc(). If memory can't be allocated, then NULL pointer will be written to. This patch fixes the problem by fallbacking to unknown_glyph when grub_malloc() returns NULL. Reviewed-by: Daniel Kiper 2023-01-10 Maxim Fomin disk/plainmount: Support plain encryption mode This patch adds support for plain encryption mode, plain dm-crypt, via new module/command named "plainmount". Reviewed-by: Daniel Kiper Reviewed-by: Glenn Washburn 2023-01-10 Pete Batard util/grub-mkrescue: Search by file UUID rather than partition UUID for EFI boot The final piece needed to add UEFI file system transposition support is to ensure the boot media can be located regardless of how the boot partition was instantiated. Especially, we do not want to be reliant on brittle partition UUIDs, as these only work if a boot media is duplicated at the block level and not at the file system level. To accomplish this for EFI boot, we now create a UUID file in a .disk/ directory, that can then be searched for. Note: The switch from make_image_fwdisk_abs() to make_image_abs() is needed in order to use the search functionality. Reviewed-by: Daniel Kiper 2023-01-10 Pete Batard util/grub-mkrescue: Preserve a copy of the EFI bootloaders on the ISO 9660 file system To enable file system transposition support for UEFI, we also must ensure that there exists a copy of the EFI bootloaders, that are currently embedded in the efi.img for xorriso, at their expected UEFI location on the ISO 9660 file system. This is accomplished by removing the use of a temporary directory to create the efi/ content, to instead place it at the root of the ISO 9660 content. Reviewed-by: Daniel Kiper 2023-01-10 Pete Batard util/grub-mkrescue: Add support for FAT and NTFS on EFI boot In order to add file system transposition support for UEFI, i.e. the ability to copy the content of an grub-mkrescue ISO 9660 image onto user-formatted media, and have that boot on UEFI systems, the first thing we need to do is add support for the file systems that are natively handled by UEFI. This mandatorily includes FAT, but we also include NTFS as the latter is also commonly supported on modern x64 platforms. Reviewed-by: Daniel Kiper 2022-12-07 t.feng util/bash-completion: Disable SC2120 shellcheck warning SC2120 (warning): function references arguments, but none are ever passed. In grub-completion.bash.in line 63: __grub_get_options_from_help () { ^-- SC2120 (warning) local prog if [ $# -ge 1 ]; then prog="$1" The arg of __grub_get_options_from_help() is optional. So, the current code meets the exception and does not need to be modified. Ignoring the warning then. More: https://github.com/koalaman/shellcheck/wiki/SC2120 Reviewed-by: Daniel Kiper 2022-12-07 t.feng util/bash-completion: Fix SC2155 shellcheck warning SC2155 (warning): Declare and assign separately to avoid masking return values. The exit status of the command is overridden by the exit status of the creation of the local variable. In grub-completion.bash.in line 115: local config_file=$(__grub_dir)/grub.cfg ^---------^ SC2155 (warning) In grub-completion.bash.in line 126: local grub_dir=$(__grub_dir) ^------^ SC2155 (warning) More: https://github.com/koalaman/shellcheck/wiki/SC2155 Reviewed-by: Daniel Kiper 2022-12-07 t.feng util/bash-completion: Fix SC2207 shellcheck warning SC2207 (warning): Prefer mapfile or read -a to split command output (or quote to avoid splitting). In grub-completion.bash.in line 56: COMPREPLY=($(compgen -P "${2-}" -W "${1-}" -S "${4-}" -- "$cur")) ^-- SC2207 (warning) In grub-completion.bash.in line 119: COMPREPLY=( $(compgen \ ^-- SC2207 (warning) In grub-completion.bash.in line 128: COMPREPLY=( $( compgen -f -X '!*/*.mod' -- "${grub_dir}/$cur" | { ^-- SC2207 (warning) COMPREPLY=($(command)) are doing unquoted command expansion in an array. This will invoke the shell's sloppy word splitting and glob expansion. If we want to split the output into lines or words, use read -r and loops will be better. This prevents the shell from doing unwanted splitting and glob expansion, and therefore avoiding problems with output containing spaces or special characters. More: https://github.com/koalaman/shellcheck/wiki/SC2207 Reviewed-by: Daniel Kiper 2022-12-07 t.feng util/bash-completion: Fix SC2070 shellcheck error SC2070 (error): -n doesn't work with unquoted arguments. Quote or use [[ ]]. In grub-completion.bash.in line 130: [ -n $tmp ] && { ^--^ SC2070 (error) More: https://github.com/koalaman/shellcheck/wiki/SC2070 Reviewed-by: Daniel Kiper 2022-12-07 Steve McIntyre kern/file: Fix error handling in grub_file_open() grub_file_open() calls grub_file_get_device_name(), but doesn't check the return. Instead, it checks if grub_errno is set. However, nothing initialises grub_errno here when grub_file_open() starts. This means that trying to open one file that doesn't exist and then trying to open another file that does will (incorrectly) also fail to open that second file. Let's fix that. Reviewed-by: Daniel Kiper 2022-12-07 Jeremy Szu loader/i386/linux: Fix initrd maximum address overflow The current i386 initrd is limited under 1 GiB memory and it works with most compressed initrds (also initrd_addr_max case reported by kernel). addr = (addr_max - aligned_size) & ~0xFFF; Above line is used to calculate the reasonable address to store the initrd. However, if initrd size is greater than 1 GiB or initrd_addr_max, then it will get overflow, especially on x86_64 arch. Therefore, add a check point to prevent it overflows as well as having a debug log for complex story of initrd addresses. Reviewed-by: Daniel Kiper 2022-12-07 Dimitri John Ledkov templates: Enable fwsetup on EFI platforms only Only perform call to fwsetup if one is on EFI platform. On all other platforms fwsetup command does not exists, and thus returns 0 and a useless uefi-firmware menu entry gets generated. Reviewed-by: Daniel Kiper 2022-12-07 t.feng fs/xfs: Fix memory leaks in XFS module Reviewed-by: Daniel Kiper 2022-12-07 t.feng fs/squash4: Fix memory leaks in grub_squash_iterate_dir() Fixes: 20dd511c8 (Handle "." and ".." on squashfs) Reviewed-by: Daniel Kiper 2022-12-07 t.feng fs/iso9660: Fix memory leaks in grub_iso9660_susp_iterate() Fixes: 99373ce47 (* grub-core/fs/iso9660.c: Remove nested functions) Reviewed-by: Thomas Schmitt Reviewed-by: Daniel Kiper 2022-12-07 t.feng fs/hfsplus: Fix memory leak in grub_hfsplus_btree_search() Fixes: 58ea11d5b (fs/hfsplus: Don't fetch a key beyond the end of the node) Reviewed-by: Daniel Kiper 2022-12-07 t.feng fs/bfs: Fix memory leak in read_bfs_file() The l1_entries and l2_entries were not freed at the end of file read. Fixes: 5825b3794 (BFS implementation based on the specification) Reviewed-by: Daniel Kiper 2022-12-07 t.feng fs/ntfs: Fix memory leaks in grub_ntfs_read_symlink() Fixes: 5773fb641 (Support NTFS reparse points) Reviewed-by: Daniel Kiper 2022-12-07 t.feng fs/minix: Fix memory leaks in grub_minix_lookup_symlink() Fixes: a07e6ad01 (* grub-core/fs/minix.c: Remove variable length arrays) Reviewed-by: Daniel Kiper 2022-12-07 t.feng fs/btrfs: Fix memory leak in find_path() Fixes: 82591fa6e (Make / in btrfs refer to real root) Reviewed-by: Daniel Kiper 2022-12-07 t.feng fs/affs: Fix memory leaks in grub_affs_create_node() The hashtable is not freed if GRUB_AFFS_FILETYPE_HARDLINK and grub_disk_read() failed. If grub_affs_create_node() returns non-zero the hashtable should be freed too. By the way, the hashtable argument is unused in grub_affs_create_node(). So, we can remove the argument and free it in grub_affs_iterate_dir(). It allocates the memory and it should be responsible for releasing it. This is why commit ebf32bc4e9 (fs/affs: Fix resource leaks) missed this memory leak. Fixes: ebf32bc4e9 (fs/affs: Fix resource leaks) Reviewed-by: Daniel Kiper 2022-12-07 Ryan Cohen normal/cmdline: Fix two related integer underflows An unchecked decrement operation in cl_print() would cause a few integers to underflow. Where an output terminal's state is stored in cl_term, the values cl_term->ystart and cl_term->pos.y both underflow. This can be replicated with the following steps: 1. Get to the GRUB command line 2. Hold down the "d" key (or any key that enters a visible character) until it fills the entire row 3. Press "HOME" and then press "CTRL-k". This will clear every character entered in step 2 4. Continuously press "CTRL-y" until the terminal scrolls the original prompt ("grub> ") passed the terminal's top row. Now, no prompt should be visible. This step causes cl_term->ystart to underflow 5. Press "HOME" and then "d" (or any visible character). This can have different visual effects for different systems, but it will always cause cl_term->pos.y to underflow On BIOS systems, these underflows cause the output terminal to completely stop displaying anything. Characters can still be entered and commands can be run, but nothing will display on the terminal. From here, you can only get the display working by running a command to switch the current output terminal to a different type: terminal_output On UEFI systems, these replication steps do not break the output terminal. Until you press "ENTER", the cursor stops responding to input, but you can press "ENTER" after step 5 and the command line will work properly again. This patch is mostly important for BIOS systems where the output terminal is rendered unusable after the underflows occur. This patch adds two checks, one for each variable. It ensures that cl_term->ystart does not decrement passed 0. It also ensures that cl_term->pos.y does not get set passed the terminal's bottom row. When the previously listed replication steps are followed with this patch, the terminal's cursor will be set to the top row and the command line is still usable, even on BIOS systems. Reviewed-by: Daniel Kiper 2022-12-07 Ryan Cohen term/i386/pc/vga_text: Prevent out-of-bounds writes to VGA text buffer Coordinates passed to screen_write_char() did not have any checks to ensure they are not out-of-bounds. This adds an if statement to prevent out-of-bounds writes to the VGA text buffer. Reviewed-by: Daniel Kiper 2022-12-07 Gary Lin loader/linux: Ensure the newc pathname is NULL-terminated Per "man 5 cpio", the namesize in the cpio header includes the trailing NUL byte of the pathname and the pathname is followed by NUL bytes, but the current implementation ignores the trailing NUL byte when making the newc header. Although make_header() tries to pad the pathname string, the padding won't happen when strlen(name) + sizeof(struct newc_head) is a multiple of 4, and the non-NULL-terminated pathname may lead to unexpected results. Assume that a file is created with 'echo -n aaaa > /boot/test12' and loaded by grub2: linux /boot/vmlinuz initrd newc:test12:/boot/test12 /boot/initrd The initrd command eventually invoked grub_initrd_load() and sent 't''e''s''t''1''2' to make_header() to generate the header: 00000070 30 37 30 37 30 31 33 30 31 43 41 30 44 45 30 30 |070701301CA0DE00| 00000080 30 30 38 31 41 34 30 30 30 30 30 33 45 38 30 30 |0081A4000003E800| 00000090 30 30 30 30 36 34 30 30 30 30 30 30 30 31 36 33 |0000640000000163| 000000a0 37 36 45 34 35 32 30 30 30 30 30 30 30 34 30 30 |76E4520000000400| 000000b0 30 30 30 30 30 38 30 30 30 30 30 30 31 33 30 30 |0000080000001300| 000000c0 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 |0000000000000000| 000000d0 30 30 30 30 30 36 30 30 30 30 30 30 30 30 74 65 |00000600000000te| ^namesize 000000e0 73 74 31 32 61 61 61 61 30 37 30 37 30 31 30 30 |st12aaaa07070100| ^^ end of the pathname Since strlen("test12") + sizeof(struct newc_head) is 116 = 29 * 4, make_header() didn't pad the pathname, and the file content followed "test12" immediately. This violates the cpio format and may trigger such error during linux boot: Initramfs unpacking failed: ZSTD-compressed data is trunc To avoid the potential problems, this commit counts the trailing NUL byte in when calling make_header() and adjusts the initrd size accordingly. Now the header becomes 00000070 30 37 30 37 30 31 33 30 31 43 41 30 44 45 30 30 |070701301CA0DE00| 00000080 30 30 38 31 41 34 30 30 30 30 30 33 45 38 30 30 |0081A4000003E800| 00000090 30 30 30 30 36 34 30 30 30 30 30 30 30 31 36 33 |0000640000000163| 000000a0 37 36 45 34 35 32 30 30 30 30 30 30 30 34 30 30 |76E4520000000400| 000000b0 30 30 30 30 30 38 30 30 30 30 30 30 31 33 30 30 |0000080000001300| 000000c0 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 |0000000000000000| 000000d0 30 30 30 30 30 37 30 30 30 30 30 30 30 30 74 65 |00000700000000te| ^namesize 000000e0 73 74 31 32 00 00 00 00 61 61 61 61 30 37 30 37 |st12....aaaa0707| ^^ end of the pathname Besides the trailing NUL byte, make_header() pads 3 more NUL bytes, and the user can safely read the pathname without a further check. To conform to the cpio format, the headers for "TRAILER!!!" are also adjusted to include the trailing NUL byte, not ignore it. Reviewed-by: Daniel Kiper 2022-12-07 Jagannathan Raman fs/udf: Validate length of AED in grub_udf_read_block() Validate the length of Allocation Extent Descriptor in grub_udf_read_block(), based on the details in UDF spec. v2.01 section 2.3.11. Fixes: CID 314037 Reviewed-by: Daniel Kiper 2022-12-07 Ismael Luceno util/grub-install: Ensure a functional /dev/nvram This enables an early failure; for i386-ieee1275 and powerpc-ieee1275 on Linux, without /dev/nvram the system may be left in an unbootable state. Reviewed-by: Daniel Kiper 2022-12-07 Ismael Luceno templates: Set defaults using var substitution Reviewed-by: Daniel Kiper 2022-12-07 Glenn Washburn tests: Put all generated files into working dir and use better file names When running tests there are many invocations of grub-shell, and because the output files are all random names in the same tmp directory, it becomes more work to figure out which files went with which grub-shell invocations. So all generated files from one invocation of grub-shell are put into a randomly named directory, so as not to collide with other grub-shell invocations. And now that the generated files can be put in a location where they will not get stepped on, and they can be named sensible names. Reviewed-by: Daniel Kiper 2022-11-14 Zhang Boyang normal/charset: Fix an integer overflow in grub_unicode_aglomerate_comb() The out->ncomb is a bit-field of 8 bits. So, the max possible value is 255. However, code in grub_unicode_aglomerate_comb() doesn't check for an overflow when incrementing out->ncomb. If out->ncomb is already 255, after incrementing it will get 0 instead of 256, and cause illegal memory access in subsequent processing. This patch introduces GRUB_UNICODE_NCOMB_MAX to represent the max acceptable value of ncomb. The code now checks for this limit and ignores additional combining characters when limit is reached. Reported-by: Daniel Axtens Reviewed-by: Daniel Kiper 2022-11-14 Zhang Boyang font: Assign null_font to glyphs in ascii_font_glyph[] The calculations in blit_comb() need information from glyph's font, e.g. grub_font_get_xheight(main_glyph->font). However, main_glyph->font is NULL if main_glyph comes from ascii_font_glyph[]. Therefore grub_font_get_*() crashes because of NULL pointer. There is already a solution, the null_font. So, assign it to those glyphs in ascii_font_glyph[]. Reported-by: Daniel Axtens Reviewed-by: Daniel Kiper 2022-11-14 Zhang Boyang font: Harden grub_font_blit_glyph() and grub_font_blit_glyph_mirror() As a mitigation and hardening measure add sanity checks to grub_font_blit_glyph() and grub_font_blit_glyph_mirror(). This patch makes these two functions do nothing if target blitting area isn't fully contained in target bitmap. Therefore, if complex calculations in caller overflows and malicious coordinates are given, we are still safe because any coordinates which result in out-of-bound-write are rejected. However, this patch only checks for invalid coordinates, and doesn't provide any protection against invalid source glyph or destination glyph, e.g. mismatch between glyph size and buffer size. This hardening measure is designed to mitigate possible overflows in blit_comb(). If overflow occurs, it may return invalid bounding box during dry run and call grub_font_blit_glyph() with malicious coordinates during actual blitting. However, we are still safe because the scratch glyph itself is valid, although its size makes no sense, and any invalid coordinates are rejected. It would be better to call grub_fatal() if illegal parameter is detected. However, doing this may end up in a dangerous recursion because grub_fatal() would print messages to the screen and we are in the progress of drawing characters on the screen. Reported-by: Daniel Axtens Reviewed-by: Daniel Kiper 2022-11-14 Zhang Boyang font: Fix an integer underflow in blit_comb() The expression (ctx.bounds.height - combining_glyphs[i]->height) / 2 may evaluate to a very big invalid value even if both ctx.bounds.height and combining_glyphs[i]->height are small integers. For example, if ctx.bounds.height is 10 and combining_glyphs[i]->height is 12, this expression evaluates to 2147483647 (expected -1). This is because coordinates are allowed to be negative but ctx.bounds.height is an unsigned int. So, the subtraction operates on unsigned ints and underflows to a very big value. The division makes things even worse. The quotient is still an invalid value even if converted back to int. This patch fixes the problem by casting ctx.bounds.height to int. As a result the subtraction will operate on int and grub_uint16_t which will be promoted to an int. So, the underflow will no longer happen. Other uses of ctx.bounds.height (and ctx.bounds.width) are also casted to int, to ensure coordinates are always calculated on signed integers. Fixes: CVE-2022-3775 Reported-by: Daniel Axtens Reviewed-by: Daniel Kiper 2022-11-14 Zhang Boyang fbutil: Fix integer overflow Expressions like u64 = u32 * u32 are unsafe because their products are truncated to u32 even if left hand side is u64. This patch fixes all problems like that one in fbutil. To get right result not only left hand side have to be u64 but it's also necessary to cast at least one of the operands of all leaf operators of right hand side to u64, e.g. u64 = u32 * u32 + u32 * u32 should be u64 = (u64)u32 * u32 + (u64)u32 * u32. For 1-bit bitmaps grub_uint64_t have to be used. It's safe because any combination of values in (grub_uint64_t)u32 * u32 + u32 expression will not overflow grub_uint64_t. Other expressions like ptr + u32 * u32 + u32 * u32 are also vulnerable. They should be ptr + (grub_addr_t)u32 * u32 + (grub_addr_t)u32 * u32. This patch also adds a comment to grub_video_fb_get_video_ptr() which says it's arguments must be valid and no sanity check is performed (like its siblings in grub-core/video/fb/fbutil.c). Reviewed-by: Daniel Kiper 2022-11-14 Zhang Boyang kern/efi/sb: Enforce verification of font files As a mitigation and hardening measure enforce verification of font files. Then only trusted font files can be load. This will reduce the attack surface at cost of losing the ability of end-users to customize fonts if e.g. UEFI Secure Boot is enabled. Vendors can always customize fonts because they have ability to pack fonts into their GRUB bundles. This goal is achieved by: * Removing GRUB_FILE_TYPE_FONT from shim lock verifier's skip-verification list. * Adding GRUB_FILE_TYPE_FONT to lockdown verifier's defer-auth list, so font files must be verified by a verifier before they can be loaded. Suggested-by: Daniel Kiper Reviewed-by: Daniel Kiper 2022-11-14 Zhang Boyang font: Fix integer underflow in binary search of char index If search target is less than all entries in font->index then "hi" variable is set to -1, which translates to SIZE_MAX and leads to errors. This patch fixes the problem by replacing the entire binary search code with the libstdc++'s std::lower_bound() implementation. Reviewed-by: Daniel Kiper 2022-11-14 Zhang Boyang font: Fix integer overflow in BMP index The BMP index (font->bmp_idx) is designed as a reverse lookup table of char entries (font->char_index), in order to speed up lookups for BMP chars (i.e. code < 0x10000). The values in BMP index are the subscripts of the corresponding char entries, stored in grub_uint16_t, while 0xffff means not found. This patch fixes the problem of large subscript truncated to grub_uint16_t, leading BMP index to return wrong char entry or report false miss. The code now checks for bounds and uses BMP index as a hint, and fallbacks to binary-search if necessary. On the occasion add a comment about BMP index is initialized to 0xffff. Reviewed-by: Daniel Kiper 2022-11-14 Zhang Boyang font: Fix integer overflow in ensure_comb_space() In fact it can't overflow at all because glyph_id->ncomb is only 8-bit wide. But let's keep safe if somebody changes the width of glyph_id->ncomb in the future. This patch also fixes the inconsistency between render_max_comb_glyphs and render_combining_glyphs when grub_malloc() returns NULL. Reviewed-by: Daniel Kiper 2022-11-14 Zhang Boyang font: Remove grub_font_dup_glyph() Remove grub_font_dup_glyph() since nobody is using it since 2013, and I'm too lazy to fix the integer overflow problem in it. Reviewed-by: Daniel Kiper 2022-11-14 Zhang Boyang font: Fix several integer overflows in grub_font_construct_glyph() This patch fixes several integer overflows in grub_font_construct_glyph(). Glyphs of invalid size, zero or leading to an overflow, are rejected. The inconsistency between "glyph" and "max_glyph_size" when grub_malloc() returns NULL is fixed too. Fixes: CVE-2022-2601 Reported-by: Zhang Boyang Reviewed-by: Daniel Kiper 2022-11-14 Zhang Boyang font: Fix size overflow in grub_font_get_glyph_internal() The length of memory allocation and file read may overflow. This patch fixes the problem by using safemath macros. There is a lot of code repetition like "(x * y + 7) / 8". It is unsafe if overflow happens. This patch introduces grub_video_bitmap_calc_1bpp_bufsz(). It is safe replacement for such code. It has safemath-like prototype. This patch also introduces grub_cast(value, pointer), it casts value to typeof(*pointer) then store the value to *pointer. It returns true when overflow occurs or false if there is no overflow. The semantics of arguments and return value are designed to be consistent with other safemath macros. Reviewed-by: Daniel Kiper 2022-11-14 Zhang Boyang font: Reject glyphs exceeds font->max_glyph_width or font->max_glyph_height Check glyph's width and height against limits specified in font's metadata. Reject the glyph (and font) if such limits are exceeded. Reviewed-by: Daniel Kiper 2022-11-14 t.feng loader/multiboot_elfxx: Fix memory leak The commit eb33e61b3 (multiboot: fix memory leak) did not fix all issues. Fix all of them right now. Fixes: eb33e61b3 (multiboot: fix memory leak) Reviewed-by: Daniel Kiper 2022-11-14 Damian Szuberski docs: Correct GRUB_DISABLE_LINUX_PARTUUID documentation Reviewed-by: Daniel Kiper 2022-11-14 Arsen Arsenović osdep/unix/getroot: Pass -P to zpool status zpool status by default prints basenames of VDEVs, which means that GRUB would have to go around guessing to see whether a VDEV exists. Instead, it'd be more robust to simply tell zpool to give us full paths to VDEVs via -P. Reviewed-by: Daniel Kiper 2022-11-14 Robbie Harwood normal/help: Add paging instructions to normal and help prompts This is not an ideal solution, as interactive users must always run a command in order to get the behavior they want, but it avoids problematic interactions between prompting and sourcing files. Reviewed-by: Daniel Kiper 2022-11-14 Robbie Harwood commands/tpm: Don't propagate measurement failures to the verifiers layer Currently if an EFI firmware fails to do a TPM measurement for a file, the error will be propagated to the verifiers framework which will prevent it to be opened. This mean that buggy firmwares will lead to the system not booting because files won't be allowed to be loaded. But a failure to do a TPM measurement isn't expected to be a fatal error that causes the system to be unbootable. To avoid this, don't return errors from .write and .verify_string callbacks and just print a debug message in the case of a TPM measurement failure. Add an environment variable, tpm_fail_fatal, to restore the previous behavior. Also-authored-by: Javier Martinez Canillas Reviewed-by: Daniel Kiper 2022-11-14 Robbie Harwood kern/env: Add function for retrieving variables as booleans Reviewed-by: Daniel Kiper 2022-11-14 Robbie Harwood types: Make bool generally available Add an include on stdbool.h, making the bool type generally available within the GRUB without needing to add a file-specific include every time it would be used. Reviewed-by: Daniel Kiper 2022-11-14 Raymund Will loader: Add support for grub-emu to kexec Linux menu entries The GRUB emulator is used as a debugging utility but it could also be used as a user-space bootloader if there is support to boot an operating system. The Linux kernel is already able to (re)boot another kernel via the kexec boot mechanism. So the grub-emu tool could rely on this feature and have linux and initrd commands that are used to pass a kernel, initramfs image and command line parameters to kexec for booting a selected menu entry. By default the systemctl kexec option is used so systemd can shutdown all of the running services before doing a reboot using kexec. But if this is not present, it can fall back to executing the kexec user-space tool directly. The ability to force a kexec-reboot when systemctl kexec fails must only be used in controlled environments to avoid possible filesystem corruption and data loss. Reviewed-by: Daniel Kiper 2022-11-14 Denton Liu templates: Introduce GRUB_TOP_LEVEL_* vars A user may wish to use an image that is not sorted as the "latest" version as the top-level entry. For example, in Arch Linux, if a user has the LTS and regular kernels installed, "/boot/vmlinuz-linux-lts" gets sorted as the "latest" compared to "/boot/vmlinuz-linux", meaning the LTS kernel becomes the top-level entry. However, a user may wish to use the regular kernel as the top-level default with the LTS only existing as a backup. This need can be seen in Arch Linux's AUR with two user-submitted packages[0][1] providing an update hook which patches /etc/grub.d/10_linux to move the desired kernel to the top-level. This patch serves to solve this in a more generic way. Introduce the GRUB_TOP_LEVEL, GRUB_TOP_LEVEL_XEN and GRUB_TOP_LEVEL_OS_PROBER variables to allow users to specify the top-level entry. Create grub_move_to_front() as a helper function which moves entries to the front of a list. This function does the heavy lifting of moving the menu entry to the front in each script. In 10_netbsd, since there isn't an explicit list variable, extract the items that are being iterated through into a list so that we can optionally apply grub_move_to_front() to the list before the loop. [0]: https://aur.archlinux.org/packages/grub-linux-default-hook [1]: https://aur.archlinux.org/packages/grub-linux-rt-default-hook Reviewed-by: Oskari Pirhonen Reviewed-by: Daniel Kiper 2022-10-27 Alec Brown video/readers: Add artificial limit to image dimensions In grub-core/video/readers/jpeg.c, the height and width of a JPEG image don't have an upper limit for how big the JPEG image can be. In Coverity, this is getting flagged as an untrusted loop bound. This issue can also seen in PNG and TGA format images as well but Coverity isn't flagging it. To prevent this, the constant IMAGE_HW_MAX_PX is being added to include/grub/bitmap.h, which has a value of 16384, to act as an artificial limit and restrict the height and width of images. This value was picked as it is double the current max resolution size, which is 8K. Fixes: CID 292450 Reviewed-by: Darren Kenny Reviewed-by: Daniel Kiper 2022-10-27 Daniel Axtens disk/diskfilter: Don't make a RAID array with more than 1024 disks This is "belt and braces" with commit 12e20a6a695f (disk/diskfilter: Check calloc() result for NULL): we end up trying to use too much memory in situations like corrupted Linux software RAID setups purporting to use a huge number of disks. Simply refuse to permit such configurations. 1024 is a bit arbitrary, yes, and I feel a bit like I'm tempting fate here, but I think 1024 disks in an array (that GRUB has to read to boot!) should be enough for anyone. Reviewed-by: Daniel Kiper 2022-10-27 Ard Biesheuvel arm64/efi/linux: Ignore FDT unless we need to modify it Now that we implemented support for the LoadFile2 protocol for initrd loading, there is no longer a need to pass the initrd parameters via the device tree. This means that when the LoadFile2 protocol is being used, there is no reason to update the device tree in the first place, and so we can ignore it entirely. The only remaining reason to deal with the devicetree is if we are using the "devicetree" command to load one from disk, so tweak the logic in grub_fdt_install() to take that into account. Reviewed-by: Leif Lindholm Reviewed-by: Daniel Kiper 2022-10-27 Ard Biesheuvel arm64/efi/linux: Implement LoadFile2 initrd loading protocol for Linux Recent Linux kernels will invoke the LoadFile2 protocol installed on a well-known vendor media path to load the initrd if it is exposed by the firmware. Using this method is preferred for two reasons: - the Linux kernel is in charge of allocating the memory, and so it can implement any placement policy it wants (given that these tend to change between kernel versions), - it is no longer necessary to modify the device tree provided by the firmware. So let's install this protocol when handling the "initrd" command if such a recent kernel was detected (based on the PE/COFF image version), and defer loading the initrd contents until the point where the kernel invokes the LoadFile2 protocol. Reviewed-by: Heinrich Schuchardt Tested-by: Ilias Apalodimas Reviewed-by: Ilias Apalodimas Reviewed-by: Daniel Kiper 2022-10-27 Ard Biesheuvel efi/efinet: Don't close connections at fini_hw() time When GRUB runs on top of EFI firmware, it only has access to block and network device abstractions exposed by the firmware, and it is up to the firmware to quiesce the underlying hardware when exiting boot services and handing over to the OS. This is especially important for network devices, to prevent incoming packets from being DMA'd straight into memory after the OS has taken over but before it has managed to reconfigure the network hardware. GRUB handles this by means of the grub_net_fini_hw() preboot hook, which is executed before calling into the booted image. This means that all network devices disappear or become inoperable before the EFI stub executes on EFI targeted builds. This is problematic as it prevents the EFI stub from calling back into GRUB provided protocols such as LoadFile2 for the initrd, which we will provide in a subsequent patch. So add a flag that indicates to the network core that EFI network devices should not be closed when grub_net_fini_hw() is called. Reviewed-by: Heinrich Schuchardt Reviewed-by: Daniel Kiper 2022-10-27 Ard Biesheuvel loader/arm64/linux: Account for COFF headers appearing at unexpected offsets The way we load the Linux and PE/COFF image headers depends on a fixed placement of the COFF header at offset 0x40 into the file. This is a reasonable default, given that this is where Linux emits it today. However, in order to comply with the PE/COFF spec, which allows this header to appear anywhere in the file, let's ensure that we read the header from where it actually appears in the file if it is not located at offset 0x40. Reviewed-by: Daniel Kiper 2022-10-27 Ard Biesheuvel arm/linux: Unify ARM/arm64 vs Xen PE/COFF header handling Xen has its own version of the image header, to account for the additional PE/COFF header fields. Since we are adding references to those in the shared EFI loader code, update the common definitions and drop the Xen specific one which no longer has a purpose. Since in both cases, the call to grub_arch_efi_linux_check_image() is preceded by a load of the image header, let's move the load into that function, and rename it to grub_arch_efi_linux_load_image_header(). Reviewed-by: Daniel Kiper 2022-10-27 Ard Biesheuvel efi: Move MS-DOS stub out of generic PE header definition The PE/COFF spec permits the COFF signature and file header to appear anywhere in the file, and the actual offset is recorded in 4 byte little endian field at offset 0x3c of the image. When GRUB is emitted as a PE/COFF binary, we reuse the 128 byte MS-DOS stub (even for non-x86 architectures), putting the COFF signature and file header at offset 0x80. However, other PE/COFF images may use different values, and non-x86 Linux kernels use an offset of 0x40 instead. So let's get rid of the grub_pe32_header struct from pe32.h, given that it does not represent anything defined by the PE/COFF spec. Instead, introduce a minimal struct grub_msdos_image_header type based on the PE/COFF spec's description of the image header, and use the offset recorded at file position 0x3c to discover the actual location of the PE signature and the COFF image header. The remaining fields are moved into a struct grub_pe_image_header, which we will use later to access COFF header fields of arbitrary images (and which may therefore appear at different offsets) Reviewed-by: Daniel Kiper 2022-10-27 Jagannathan Raman kern/buffer: Handle NULL input pointer in grub_buffer_free() The grub_buffer_free() should handle NULL input pointer, similar to grub_free(). If the pointer is not referencing any memory location, grub_buffer_free() need not perform any function. Fixes: CID 396931 Reviewed-by: Ross Philipson Reviewed-by: Daniel Kiper 2022-10-27 Jagannathan Raman fs/zfs/zfs: Update dangling dn_new pointer in dnode_get_path() The dnode_get_path() traverses dnode structures to locate the dnode leaf of a given path. When the leaf is a symlink to another path, it restarts the traversal either from root or from a different path. In such cases, dn_new must be re-initialized Passes "make check". Fixes: CID 86750 Reviewed-by: Ross Philipson Reviewed-by: Daniel Kiper 2022-10-27 Darren Kenny build: Update to reflect minimum clang version 8.0 After doing some validation with clang from versions 3.8 and up, the builds prior to version 8.0.0 fail due to the use of safemath functions at link time. Reviewed-by: Daniel Kiper 2022-10-27 Darren Kenny configure: Fix building with clang Building the current code with clang and the latest gnulib fails due to the use of a variable-length-array (vla) warning, which turns in to an error due to the presence of the -Werror during the build. The gnulib team stated that their code should not be built with -Werror. At present, the only way to do this is for the complete code-base, by using the --disable-werror option to configure. Rather than doing this, and failing to gain any benefit that it provides, instead, if building with clang, this patch makes it possible to specifically not error on vlas, while retaining the -Werror functionality otherwise. Reviewed-by: Daniel Kiper 2022-10-27 Darren Kenny gnulib: Provide abort() implementation for gnulib The recent gnulib updates require an implementation of abort(), but the current macro provided by changeset: cd37d3d3916c gnulib: Drop no-abort.patch to config.h.in does not work with the clang compiler since it doesn't provide a __builtin_trap() implementation, so this element of the changeset needs to be reverted, and replaced. After some discussion with Vladimir 'phcoder' Serbinenko and Daniel Kiper it was suggested to bring back in the change from the changeset: db7337a3d353 * grub-core/gnulib/regcomp.c (regerror): ... Which implements abort() as an inline call to grub_abort(), but since that was made static by changeset: a8f15bceeafe * grub-core/kern/misc.c (grub_abort): Make static it is also necessary to revert the specific part that makes it a static function too. Another implementation of abort() was found in grub-core/kern/compiler-rt.c which needs to also be removed to be consistent. Reviewed-by: Daniel Kiper 2022-10-27 Alec Brown disk/cryptodisk: Fix unintentional integer overflow In the function grub_cryptodisk_endecrypt(), a for loop is incrementing the variable i by (1U << log_sector_size). The variable i is of type grub_size_t which is a 64-bit unsigned integer on x86_64 architecture. On the other hand, 1U is a 32-bit unsigned integer. By performing a left shift on a 32-bit value and assigning it to a 64-bit variable, the 64-bit variable may have incorrect values in the high 32-bits if the shift has an overflow. To avoid this, we replace 1U with (grub_size_t)1. Fixes: CID 307788 Reviewed-by: Darren Kenny Reviewed-by: Patrick Steinhardt Reviewed-by: Daniel Kiper 2022-10-27 Zhang Boyang mm: Try invalidate disk caches last when out of memory Every heap grow will cause all disk caches invalidated which decreases performance severely. This patch moves disk cache invalidation code to the last of memory squeezing measures. So, disk caches are released only when there are no other ways to get free memory. Reviewed-by: Daniel Kiper Reviewed-by: Patrick Steinhardt 2022-10-27 Qiumiao Zhang util/grub-mkfont: Use valid conversion specifiers in printf() and fprintf() For printf()/fprintf() functions, unsigned integers should use %u as the valid conversion specifier instead of %d. Reviewed-by: Daniel Kiper 2022-10-27 Chris Coulson efi: Compile kernel.img with -fshort-wchar on all EFI targets The stack check logs a console message on failure, and the EFI API expects a NULL terminated UCS-2 string. In order to define a UCS-2 string literal, kernel.img on amd64 and i386 EFI targets is built with -fshort-wchar. Also compile kernel.img on other EFI targets with -fshort-wchar. Fixes: 37ddd94 (kern/efi/init: Log a console error during a stack check failure) Reported-by: Glenn Washburn Reviewed-by: Daniel Kiper 2022-10-11 Benjamin Herrenschmidt normal/menu: Add Ctrl-L to refresh the menu This is useful on cloud instances with remote serial ports as it can be difficult to connect "fast enough" to get the initial menu display Reviewed-by: Daniel Kiper 2022-10-11 Michael Chang util/grub-install: Set point of no return for powerpc-ieee1275 install The point of no return is used to define a point where no change should be reverted in a wake of fatal error that consequently aborts the process. The powerpc-ieee1275 install apparently missed this point of no return definition that newly installed modules could be inadvertently reverted after successful image embedding so that boot failure is incurred due to inconsistent state. Reviewed-by: Daniel Kiper 2022-10-11 Daniel Axtens disk/diskfilter: Check calloc() result for NULL With wildly corrupt inputs, we can end up trying to calloc a very large amount of memory, which will fail and give us a NULL pointer. We need to check that to avoid a crash. (And, even if we blocked such inputs, it is good practice to check the results of allocations anyway.) Reviewed-by: Daniel Kiper 2022-10-11 Glenn Washburn disk/cryptodisk: Allows UUIDs to be compared in a dash-insensitive manner A user can now specify UUID strings with dashes, instead of having to remove dashes. This is backwards-compatibility preserving and also fixes a source of user confusion over the inconsistency with how UUIDs are specified between file system UUIDs and cryptomount UUIDs. Since cryptsetup, the reference implementation for LUKS, displays and generates UUIDs with dashes there has been additional confusion when using the UUID strings from cryptsetup as exact input into GRUB does not find the expected cryptodisk. A new function grub_uuidcasecmp() is added that is general enough to be used other places where UUIDs are being compared. Reviewed-by: Patrick Steinhardt Reviewed-by: Daniel Kiper 2022-10-11 Glenn Washburn kern/corecmd: Quote variable values when displayed by the set command Variable values may contain spaces at the end or newlines. However, when displayed without quotes this is not obvious and can lead to confusion as to the actual contents of variables. Also for some variables grub_env_get() returns a NULL pointer instead of a pointer to an empty string and previously would be printed as "var=(null)". Now such variables will be displayed as "var=''". Reviewed-by: Daniel Kiper 2022-10-11 Samuel Thibault templates: Add support for acpi on Hurd This adds acpi as bootstrap module whenever it is available. This opens the path for proper IRQ routing for fully-userland disk drivers. Reviewed-by: Daniel Kiper 2022-10-11 Peter Jones util/grub-module-verifierXX: Enable running standalone checkers Allow treating util/grub-module-verifierXX.c as a file you can build directly so syntax checkers like vim's "syntastic" plugin, which uses "gcc -x c -fsyntax-only" to build it, will work. One still has to do whatever setup is required to make it pick the right include dirs, which -I options we use, etc., but this makes it so you can do the checking on the file you're editing, rather than on a different file. Reviewed-by: Daniel Kiper 2022-10-04 Tuan Phan kern/compiler-rt: Fix __clzsi2() logic Fix the incorrect return value of __clzsi2() function. Fixes: e795b90 (RISC-V: Add libgcc helpers for clz) Reviewed-by: Daniel Kiper 2022-10-04 Daniel Axtens efi: Increase default memory allocation to 32 MiB We have multiple reports of things being slower with a 1 MiB initial static allocation, and a report (more difficult to nail down) of a boot failure as a result of the smaller initial allocation. Make the initial memory allocation 32 MiB. Reviewed-by: Daniel Kiper 2022-10-04 Christian Hesse templates: Filter C.UTF-8 locale for translation In addition to C locale there is also C.UTF-8 locale now. Filter that as well, by using ${grub_lang}, which contains a stripped value. This fixes the following message and resulting boot failure: error: file `/boot/grub/locale/C.gmo' not found. Reviewed-by: Daniel Kiper 2022-10-04 Steve McIntyre tests: Explicitly unset SOURCE_DATE_EPOCH before running fs tests In some filesystem utils like mksquashfs, they will silently change behaviour and cause timestamps to unexpectedly change. Build environments like Debian's set SOURCE_DATE_EPOCH in the environment, so remove it. Reproducible builds are good and useful for shipped artifacts, but this causes build-time tests to fail. Reviewed-by: Daniel Kiper 2022-10-04 Heinrich Schuchardt commands/efi/lsefisystab: Short text for EFI_CONFORMANCE_PROFILES_TABLE The EFI_CONFORMANCE_PROFILES_TABLE_GUID is used for a table of GUIDs for conformance profiles (cf. UEFI specification 2.10, 4.6.5 EFI_CONFORMANCE_PROFILE_TABLE). The lsefisystab command is used to display installed EFI configuration tables. Currently it only shows the GUID but not a short text for the table. Provide a short text for the EFI_CONFORMANCE_PROFILES_TABLE_GUID. Reviewed-by: Daniel Kiper 2022-10-04 Theodore Ts'o fs/ext2: Ignore the large_dir incompat feature Recently, ext4 added the large_dir feature, which adds support for a 3 level htree directory support. The GRUB supports existing file systems with htree directories by ignoring their existence, and since the index nodes for the hash tree look like deleted directory entries (by design), the GRUB can simply do a brute force O(n) linear search of directories. The same is true for 3 level deep htrees indicated by large_dir feature flag. Hence, it is safe for the GRUB to ignore the large_dir incompat feature. Fixes: https://savannah.gnu.org/bugs/?61606 Reviewed-by: Daniel Kiper 2022-10-04 Glenn Washburn disk/loopback: Support transparent decompression of backing file A new option is added to the loopback command, -D or --decompress, which when specified transparently decompresses the backing file. This allows compressed images to be used as if they were uncompressed. Add documentation to support this change. Suggested-by: Li Gen Reviewed-by: Daniel Kiper 2022-10-04 Glenn Washburn configure: Add -DGRUB_HAS_PCI when compiling C/C++ files on targets that support PCI The list of targets that support PCI is in gentpl.py. However, there is no support for generating makefile script from a .def file that will apply globally to the makefile, but on a per target basis. So instead, use gentpl.py in configure to get the list of targets and check if the current build target is one of them. If it is, set the automake conditional COND_HAVE_PCI. Then in conf/Makefile.common add -DGRUB_HAS_PCI for the platform if COND_HAVE_PCI is true. Reviewed-by: Daniel Kiper 2022-10-04 Li Gen commands/read: Fix overflow in grub_getline() Store returned value from grub_getkey() in int instead of char to prevent throwing away the extended bits. This was a problem because, for instance, the left arrow key press would return (GRUB_TERM_EXTENDED | 0x4b), which would have the GRUB_TERM_EXTENDED thrown away leaving 0x4b or 'K'. These extended keys should either work as intended or do nothing. This change has them do nothing, instead of inserting a key not pressed by the user. Reviewed-by: Daniel Kiper 2022-10-04 Li Gen efi: Correct function prototype for register_key_notify() method of grub_efi_simple_text_input_ex_interface The register_key_notify() method should have an output parameter which is a pointer to the unique handle assigned to the registered notification. Reviewed-by: Daniel Kiper 2022-10-04 Masahiro Matsuya net/drivers/ieee1275/ofnet: Fix incorrect netmask The netmask configured in firmware is not respected on ppc64 (big endian). When 255.255.252.0 is set as netmask in firmware, the following is the value of bootpath string in grub_ieee1275_parse_bootpath(): /vdevice/l-lan@30000002:speed=auto,duplex=auto,192.168.88.10,,192.168.89.113,192.168.88.1,5,5,255.255.252.0,512 The netmask in this bootpath is not a problem, since it's a value specified in firmware. But the value of subnet_mask.ipv4 was set with 0xfffffc00, and __builtin_ctz(~grub_le_to_cpu32(subnet_mask.ipv4)) returned 16 (not 22). As a result, 16 was used for netmask wrongly: 1111 1111 1111 1111 1111 1100 0000 0000 # subnet_mask.ipv4(=0xfffffc00) 0000 0000 1111 1100 1111 1111 1111 1111 # grub_le_to_cpu32(subnet_mask.ipv4) 1111 1111 0000 0011 0000 0000 0000 0000 # ~grub_le_to_cpu32(subnet_mask.ipv4) and the count of zero with __builtin_ctz() can be 16. This patch changes it as below: 1111 1111 1111 1111 1111 1100 0000 0000 # subnet_mask.ipv4(=0xfffffc00) 0000 0000 1111 1100 1111 1111 1111 1111 # grub_le_to_cpu32(subnet_mask.ipv4) 1111 1111 1111 1111 1111 1100 0000 0000 # grub_be_to_cpu32(subnet_mask.ipv4) 0000 0000 0000 0000 0000 0011 1111 1111 # ~grub_be_to_cpu32(subnet_mask.ipv4) The count of zero with __builtin_clz() can be 22 (clz counts the number of one bits preceding the most significant zero bit). Reviewed-by: Daniel Kiper 2022-10-04 Ross Philipson loader/i386/bsd: Initialize BSD relocator state variables Numerous register fields in the relocator state are simply not used depending on the relocator. This causes Coverity to flag these fields but there is no real bug here. Simply initializing the variable to {0} solves the issue. Fixed in the else case too for consistency. Fixes: CID 396932 Reviewed-by: Daniel Kiper 2022-08-20 Andrea G. Monaco docs: Add a link to environment variables This is trivial, but it might save some time to beginners. Reviewed-by: Glenn Washburn Reviewed-by: Daniel Kiper 2022-08-20 Robbie Harwood docs: Fix mismatched brackets in halt command Reviewed-by: Daniel Kiper docs: Document fwsetup command Reviewed-by: Daniel Kiper 2022-08-20 Robbie Harwood efi: Don't display a uefi-firmware entry if it's not supported Add a new --is-supported option to commands/efi/efifwsetup and conditionalize display on it. Reviewed-by: Daniel Kiper 2022-08-19 Javier Martinez Canillas commands/efi/efifwsetup: Print an error if boot to firmware setup is not supported The "fwsetup" command is only registered if the firmware supports booting to the firmware setup UI. But it could be possible that the GRUB config already contains a "fwsetup" entry, because it was generated in a machine that has support for this feature. To prevent users getting an error like: error: ../../grub-core/script/function.c:109:can't find command `fwsetup'. if it is not supported by the firmware, let's just always register the command but print a more accurate message if the firmware doesn't support this option. Reviewed-by: Daniel Kiper 2022-08-19 Javier Martinez Canillas templates: Check for EFI at runtime instead of config generation time The 30_uefi-firmware template checks if an OsIndicationsSupported UEFI var exists and EFI_OS_INDICATIONS_BOOT_TO_FW_UI bit is set, to decide whether a "fwsetup" menu entry would be added or not to the GRUB menu. But this has the problem that it will only work if the configuration file was created on an UEFI machine that supports booting to a firmware UI. This for example doesn't support creating GRUB config files when executing on systems that support both UEFI and legacy BIOS booting. Since creating the config file from legacy BIOS wouldn't allow to access the firmware UI. To prevent this, make the template to unconditionally create the grub.cfg snippet but check at runtime if was booted through UEFI to decide if this entry should be added. That way it won't be added when booting with BIOS. There's no need to check if EFI_OS_INDICATIONS_BOOT_TO_FW_UI bit is set, since that's already done by the "fwsetup" command when is executed. Reviewed-by: Daniel Kiper 2022-08-19 Robbie Harwood efi: Make all grub_efi_guid_t variables static This is believed to result in smaller code. Reviewed-by: Daniel Kiper 2022-08-19 Robbie Harwood commands/efi/efifwsetup: Add missing grub_free()s Each call of grub_efi_get_variable() needs a grub_free(). Reviewed-by: Daniel Kiper 2022-08-19 Jagannathan Raman fs/zfs/zfs: Pass pointer to dnode_end_t instead of value to fill_fs_info() Coverity reports that dnode_end_t argument of fill_fs_info() is too large to pass-by-value. Therefore, replace the argument with a pointer. Fixes: CID 73631 Reviewed-by: Darren Kenny Reviewed-by: Daniel Kiper 2022-08-19 Patrick Steinhardt disk/luks2: Fix decoding of digests and salts with escaped chars It was reported in the #grub IRC channel on Libera that decryption of LUKS2 partitions fails with errors about invalid digests and/or salts. In all of these cases, what failed was decoding the Base64 representation of these, where the encoded data contained invalid characters. As it turns out, the root cause is that json-c, which is used by cryptsetup to read and write the JSON header, will escape some characters by prepending a backslash when writing JSON strings by default. Most importantly, json-c also escapes the forward slash, which is part of the Base64 alphabet. Because GRUB doesn't know to unescape such characters, decoding this string will rightfully fail. Interestingly, this issue has until now only been reported by users of Ubuntu 18.04. And a bit of digging in fact reveals that cryptsetup has changed the logic in a054206d (Suppress useless slash escaping in json lib, 2018-04-20), which has been released with cryptsetup v2.0.3. Ubuntu 18.04 is still shipping with cryptsetup v2.0.2 though, which explains why this is not a more frequent issue. Fix the issue by using our new grub_json_unescape() helper function that handles unescaping for us. Reported-by: Afdal Reviewed-by: Daniel Kiper 2022-08-19 Patrick Steinhardt lib/json/json: Add function to unescape JSON-encoded strings JSON strings require certain characters to be encoded, either by using a single reverse solidus character "\" for a set of popular characters, or by using a Unicode representation of "\uXXXXX". The jsmn library doesn't handle unescaping for us, so we must implement this functionality for ourselves. Add a new function grub_json_unescape() that takes a potentially escaped JSON string as input and returns a new unescaped string. Reviewed-by: Daniel Kiper 2022-08-19 Nikita Ermakov loader: Drop argv[] argument in grub_initrd_load() In the case of an error grub_initrd_load() uses argv[] to print the filename that caused the error. It is also possible to obtain the filename from the file handles and there is no need to duplicate that information in argv[], so let's drop it. Reviewed-by: Daniel Kiper 2022-08-19 Alec Brown loader: Update error conditionals to use enums In grub-core/loader/i386/bsdXX.c and grub-core/loader/multiboot_elfxx.c, error conditionals are simplified to statements such as "if (err)". Even though the assumption that non-zero values give errors is correct, it would be clearer and more consistent to compare these conditionals to GRUB_ERR_NONE. Reviewed-by: Darren Kenny Reviewed-by: Daniel Kiper 2022-08-19 Alec Brown util/grub-module-verifierXX: Changed get_shnum() return type In util/grub-module-verifierXX.c, the function get_shnum() returns the variable shnum, which is of the type Elf_Word. In the function, shnum can be obtained by the e_shnum member of an Elf_Ehdr or the sh_size member of an Elf_Shdr. The sh_size member can either be grub_uint32_t or grub_uint64_t, depending on the architecture, but Elf_Word is only grub_uint32_t. To account for when sh_size is grub_uint64_t, we can set shnum to have type Elf_Shnum and have get_shnum() return an Elf_Shnum. Reviewed-by: Darren Kenny Reviewed-by: Daniel Kiper 2022-08-19 Alec Brown elf: Validate number of elf program header table entries In bsdXX.c and multiboot_elfxx.c, e_phnum is used to obtain the number of program header table entries, but it wasn't being checked if the value was there. According to the elf(5) manual page, "If the number of entries in the program header table is larger than or equal to PN_XNUM (0xffff), this member holds PN_XNUM (0xffff) and the real number of entries in the program header table is held in the sh_info member of the initial entry in section header table. Otherwise, the sh_info member of the initial entry contains the value zero." Since this check wasn't being made, grub_elfXX_get_phnum() is being added to elfXX.c to make this check and use e_phnum if it doesn't have PN_XNUM as a value, else use sh_info. We also need to make sure e_phnum isn't greater than PN_XNUM and sh_info isn't less than PN_XNUM. Note that even though elf.c and elfXX.c are located in grub-core/kern, they are compiled as modules and don't need the EXPORT_FUNC() macro to define the functions in elf.h. Also, changed casts of phnum to match variables being set as well as dropped casts when unnecessary. Reviewed-by: Darren Kenny Reviewed-by: Daniel Kiper 2022-08-19 Alec Brown elf: Validate elf section header table index for section name string table In multiboot_elfxx.c, e_shstrndx is used to obtain the section header table index of the section name string table, but it wasn't being checked if the value was there. According to the elf(5) manual page, "If the index of section name string table section is larger than or equal to SHN_LORESERVE (0xff00), this member holds SHN_XINDEX (0xffff) and the real index of the section name string table section is held in the sh_link member of the initial entry in section header table. Otherwise, the sh_link member of the initial entry in section header table contains the value zero." Since this check wasn't being made, grub_elfXX_get_shstrndx() is being added to elfXX.c to make this check and use e_shstrndx if it doesn't have SHN_XINDEX as a value, else use sh_link. We also need to make sure e_shstrndx isn't greater than or equal to SHN_LORESERVE and sh_link isn't less than SHN_LORESERVE. Note that even though elf.c and elfXX.c are located in grub-core/kern, they are compiled as modules and don't need the EXPORT_FUNC() macro to define the functions in elf.h. Reviewed-by: Darren Kenny Reviewed-by: Daniel Kiper 2022-08-19 Alec Brown elf: Validate number of elf section header table entries In bsdXX.c and multiboot_elfxx.c, e_shnum is used to obtain the number of section header table entries, but it wasn't being checked if the value was there. According to the elf(5) manual page, "If the number of entries in the section header table is larger than or equal to SHN_LORESERVE (0xff00), e_shnum holds the value zero and the real number of entries in the section header table is held in the sh_size member of the initial entry in section header table. Otherwise, the sh_size member of the initial entry in the section header table holds the value zero." Since this check wasn't being made, grub_elfXX_get_shnum() is being added to elfXX.c to make this check and use whichever member doesn't have a value of zero. If both are zero, then we must return an error. We also need to make sure that e_shnum doesn't have a value greater than or equal to SHN_LORESERVE and sh_size isn't less than SHN_LORESERVE. In order to get this function to work, the type ElfXX_Shnum is being added where Elf32_Shnum defines Elf32_Word and Elf64_Shnum defines Elf64_Xword. This new type is needed because if shnum obtains a value from sh_size, sh_size could be of type El32_Word for Elf32_Shdr structures or Elf64_Xword for Elf64_Shdr structures. Note that even though elf.c and elfXX.c are located in grub-core/kern, they are compiled as modules and don't need the EXPORT_FUNC() macro to define the functions in elf.h. For a few smaller changes, changed casts of shnum to match variables being set as well as dropped casts when unnecessary and fixed spacing errors in bsdXX.c. Also, shnum is an unsigned integer and is compared to int i in multiboot_elfxx.c, it should be unsigned to match shnum. Reviewed-by: Darren Kenny Reviewed-by: Daniel Kiper 2022-08-19 Mauricio Faria de Oliveira templates/linux_xen: Properly order the multiple initrd files The linux_xen template orders the "early" initrd file(s) _first_ (i.e., before the "real" initrd files) and that seems reasonable, as microcode updates usually come first. However, this usually breaks Linux boot with initrd under Xen because Xen assumes the real initrd is the first multiboot[2] module after the kernel, passing its address over to Linux in Xen's start_info struct. So, if a microcode-only initrd (i.e., without init/userspace) is found by grub-mkconfig, it ends up considered as a normal initrd by the Linux kernel, which cannot do anything with it (as it has no other files) and panic()s unable to mount root if it depends on a initrd to do that (e.g., root=UUID=...). ... Well, since Xen doesn't actually use the provided microcode by default / unless the 'ucode=' option is enabled, this isn't used in the general case (and breaks). Additionally, if an user enables the 'ucode=' option, that either specifies which module is to be used for microcode, or scans all modules (regardless of being first) for that. Thus, for Xen: - it is *not required* to have microcode first, - but it is *required* to have real initrd first So, fix it by ordering the real initrd before early initrd(s). After: # touch /boot/xen /boot/microcode.cpio # grub-mkconfig 2>/dev/null | grep -P '^\t(multiboot|module)' multiboot /boot/xen ... module /boot/vmlinuz-5.4.0-122-generic ... module --nounzip /boot/initrd.img-5.4.0-122-generic module --nounzip /boot/microcode.cpio ... Corner case specific to Xen implementation details: It is actually _possible_ to have a microcode initrd first, but that requires a non-default option (so can't rely on it), and it turns out to be inconsistent with its counterpart (really shouldn't rely on it, as it may get confusing; below). 'ucode=1' does manually specify the first module is microcode _AND_ clears its bit in the module bitmap. The next module is now the 'new first', and gets passed to Linux as initrd. Good. 'ucode=scan' checks all modules for microcode, but does _NOT_ clear a bit if it finds one (reasonable, as it can find that prepended in a "real" initrd anyway, which needs to be used). The first module still gets passed to Linux as initrd. Bad. Fixes: e86f6aafb8de (grub-mkconfig/20_linux_xen: Support multiple early initrd images) Acked-by: Juergen Gross Reviewed-by: Daniel Kiper 2022-08-19 Mauricio Faria de Oliveira templates/linux_xen: Properly load multiple initrd files The linux_xen template can put multiple initrd files in the same multiboot[2] module[2] command, which is against specs. This causes ONLY the _first_ initrd file to be loaded; other files just have filenames in a "cmdline" string of the first initrd file and are NOT loaded. Fix this by inserting a module[2] command per initrd file. Before: # touch /boot/xen /boot/microcode.cpio # grub-mkconfig 2>/dev/null | grep -P '^\t(multiboot|module)' multiboot /boot/xen ... module /boot/vmlinuz-5.4.0-122-generic ... module --nounzip /boot/microcode.cpio /boot/initrd.img-5.4.0-122-generic After: # touch /boot/xen /boot/microcode.cpio # grub-mkconfig 2>/dev/null | grep -P '^\t(multiboot|module)' multiboot /boot/xen ... module /boot/vmlinuz-5.4.0-122-generic ... module --nounzip /boot/microcode.cpio module --nounzip /boot/initrd.img-5.4.0-122-generic Cause: The code was copied from the linux template, which is *apparently* equivalent.. but its initrd command grub_cmd_initrd() *supports* multiple files (see grub_initrd_init()), while module/module2 in grub_cmd_module() *does not* (see grub_multiboot[2]_add_module()). See commit e86f6aafb8de (grub-mkconfig/20_linux_xen: Support multiple early initrd images): 'This is basically a copy of a698240d "grub-mkconfig/10_linux: Support multiple early initrd images" ...' Specs: Both multiboot and multiboot2 specifications mention support for 'multiple boot modules' (struct/tag used for kernel/initrd files): "Boot loaders don’t have to support multiple boot modules, but they are strongly encouraged to" [1,2] However, there is a 1:1 relationship between boot modules and files, more or less clearly; note the usage of singular/plural "module(s)". (Multiboot2, clearly: "One tag appears per module".) Multiboot [1]: "the ‘mods’ fields indicate ... what boot modules were loaded ..., and where they can be found. ‘mods_count’ contains the number of modules loaded" "The first two fields contain the start and end addresses of the boot module itself." Multiboot2 [2]: "This tag indicates ... what boot module was loaded ..., and where it can be found." "The ‘mod_start’ and ‘mod_end’ contain the start and end physical addresses of the boot module itself." "One tag appears per module. This tag type may appear multiple times." And both clearly mention the 'string' field of a boot module, which is to be used by the operating system, not boot loader: "The ‘string’ field provides an arbitrary string to be associated with that particular boot module ... its exact use is specific to the operating system." Links: [1] https://www.gnu.org/software/grub/manual/multiboot/multiboot.html 3.3 Boot information format [2] https://www.gnu.org/software/grub/manual/multiboot2/multiboot.html 3.6.6 Modules Fixes: e86f6aafb8de (grub-mkconfig/20_linux_xen: Support multiple early initrd images) Acked-by: Juergen Gross Reviewed-by: Daniel Kiper 2022-08-19 Glenn Washburn misc: Add cast in grub_strncasecmp() to drop sign when calling grub_tolower() Note this cast was fixed in grub_strcasecmp() in commit ce41ab7aab (* grub-core/kern/misc.c (grub_strcmp): Use unsigned comparison as per common usage and preffered in several parts of code.), but this commit omitted fixing it in grub_strncasecmp(). Reviewed-by: Daniel Kiper 2022-08-19 Glenn Washburn tests/util/grub-shell: Only show grub-mkrescue output if it returns an error The previous behavior ignored an error and the output from grub-mkrescue. This made it difficult to discover that grub-mkrescue was the reason that tests which rely on grub-shell were failing. Even after discovering grub-mkrescue was the culprit, there was no output to indicate why it was failing. It turns out that grub-mkrescue is a thin wrapper around xorriso. So if you do not have xorriso installed it will fail with an error message about not being able to find xorriso. This change will allow grub-mkrescue output to be written to stderr, only if grub-mkrescue fails. If grub-mkrescue succeeds, there will be no output from grub-mkrescue so as not to interfere with the functioning of tests. This change should have no effect on the running of tests or other uses of grub-shell as it only modifies the error path. Also, if grub-mkrescue fails, the script exits early. Since grub-shell needs the ISO image created by grub-mkresue to boot the QEMU instance, a failure here should be considered fatal. Reviewed-by: Daniel Kiper 2022-08-19 Ard Biesheuvel loader/arm64/linux: Remove magic number header field check The "ARM\x64" magic number in the file header identifies an image as one that implements the bare metal boot protocol, allowing the loader to simply move the file to a suitably aligned address in memory, with sufficient headroom for the trailing .bss segment (the required memory size is described in the header as well). Note of this matters for GRUB, as it only supports EFI boot. EFI does not care about this magic number, and nor should GRUB: this prevents us from booting other PE linux images, such as the generic EFI zboot decompressor, which is a pure PE/COFF image, and does not implement the bare metal boot protocol. So drop the magic number check. Reviewed-by: Daniel Kiper 2022-08-19 Darren Kenny util/grub-install-common: Confirm directory creation in grub_install_mkdir_p() Because grub_util_mkdir() is implemented to not return a value on any platform, grub_instal_mkdir_p() can test for success by confirming that the directory requested exists after attempting to create it, otherwise it should fail with an error and exit. While fixing this, a flaw in the logic was shown, where the first match of the path separator, which almost always was the first character in the path (e.g. /boot/grub2) would result in creating a directory with an empty name (i.e. ""). To avoid that, it should skip the handling of the path separator where p is pointing to the first character. Reviewed-by: Daniel Kiper 2022-08-19 Darren Kenny util: Ignore return value for grub_util_mkdir() on all platforms Coverity signaled 2 issues where the return value of grub_util_mkdir() was not being tested. The Windows variant of this code defines the function as having no return value (void), but the UNIX variants all are mapped using a macro to the libc mkdir() function, which returns an int value. To be consistent, the mapping should cast to void to for these too. Fixes: CID 73583 Fixes: CID 73617 Reviewed-by: Daniel Kiper 2022-08-19 Glenn Washburn disk/cryptodisk: Support encrypted volumes using detached headers on a partition Update the read hook to take into account encrypted volumes on a partition. GRUB disk read hooks supply an absolute sector number at which the read is started from. If the encrypted volume is in a partition, the sector number given to the read hook will be offset by the number of the sector at the start of the partition. The read hook then needs to subtract the partition start from the supplied sector to get the correct start sector for the read into the detached header file. Reported-by: brutser Tested-by: brutser Reviewed-by: Daniel Kiper 2022-08-10 Glenn Washburn tests/util/grub-shell: Use shell variable instead of autoconf By using shell variable that are set once by the expansion of an autoconf variable, the resulting shell script is more easily moved and modified from the build/install directory it was generated for. The resulting script is more readable as well. Reviewed-by: Daniel Kiper 2022-08-10 Stefan Agner Makefile: Make grub_fstest.pp depend on config-util.h If you build with "make -j25", sometimes you see: /build/output_generic_x86_64/host/bin/x86_64-buildroot-linux-gnu-gcc -E -DHAVE_CONFIG_H -I. -I.. -Wall -W -DGRUB_UTIL=1 -D_FILE_OFFSET_BITS=64 -I./include -DGRUB_FILE=\"util/grub-fstest.c\" -I. -I.. -I. -I.. -I../include -I./include -I../grub-core/lib/libgcrypt-grub/src/ -I./grub-core/lib/gnulib -I../grub-core/lib/gnulib -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -Os -fno-stack-protector -D_FILE_OFFSET_BITS=64 \ -D'GRUB_MOD_INIT(x)=@MARKER@x@' ../util/grub-fstest.c ../grub-core/kern/emu/hostfs.c ../grub-core/disk/host.c ../grub-core/osdep/init.c > grub_fstest.pp || (rm -f grub_fstest.pp; exit 1) config.status: creating config-util.h ../grub-core/kern/emu/hostfs.c:20:10: fatal error: config-util.h: No such file or directory 20 | #include | ^~~~~~~~~~~~~~~ compilation terminated. Reviewed-by: Daniel Kiper 2022-08-10 Qiumiao Zhang util/grub-mkfont: Fix resource leaks Reviewed-by: Daniel Kiper 2022-08-10 Peter Jones kern/i386/tsc_pmtimer: Make pmtimer tsc calibration not take 51 seconds to fail On my laptop running at 2.4GHz, if I run a VM where tsc calibration using pmtimer will fail presuming a broken pmtimer, it takes ~51 seconds to do so (as measured with the stopwatch on my phone), with a tsc delta of 0x1cd1c85300, or around 125 billion cycles. If instead of trying to wait for 5-200ms to show up on the pmtimer, we try to wait for 5-200us, it decides it's broken in ~0x2626aa0 TSCs, aka ~2.4 million cycles, or more or less instantly. Additionally, this reading the pmtimer was returning 0xffffffff anyway, and that's obviously an invalid return. I've added a check for that and 0 so we don't bother waiting for the test if what we're seeing is dead pins with no response at all. If "debug" includes "pmtimer", you will see one of the following three outcomes. If pmtimer gives all 0 or all 1 bits, you will see: pmtimer: 0xffffff bad_reads: 1 pmtimer: 0xffffff bad_reads: 2 pmtimer: 0xffffff bad_reads: 3 pmtimer: 0xffffff bad_reads: 4 pmtimer: 0xffffff bad_reads: 5 pmtimer: 0xffffff bad_reads: 6 pmtimer: 0xffffff bad_reads: 7 pmtimer: 0xffffff bad_reads: 8 pmtimer: 0xffffff bad_reads: 9 pmtimer: 0xffffff bad_reads: 10 timer is broken; giving up. This outcome was tested using qemu+kvm with UEFI (OVMF) firmware and these options: -machine pc-q35-2.10 -cpu Broadwell-noTSX If pmtimer gives any other bit patterns but is not actually marching forward fast enough to use for clock calibration, you will see: pmtimer delta is 0x0 (1904 iterations) tsc delta is implausible: 0x2626aa0 This outcome was tested using GRUB patched to not ignore bad reads using qemu+kvm with UEFI (OVMF) firmware, and these options: -machine pc-q35-2.10 -cpu Broadwell-noTSX If pmtimer actually works, you'll see something like: pmtimer delta is 0xdff tsc delta is 0x278756 This outcome was tested using qemu+kvm with UEFI (OVMF) firmware, and these options: -machine pc-i440fx-2.4 -cpu Broadwell-noTSX I've also tested this outcome on a real Intel Xeon E3-1275v3 on an Intel Server Board S1200V3RPS using the SDV.RP.B8 "Release" build here: https://www.intel.com/content/www/us/en/download/674448/firmware-update-for-the-intel-server-board-s1200rp-uefi-development-kit-release-vb8.html Reviewed-by: Daniel Kiper 2022-08-10 Glenn Washburn disk/luks2: Continue trying all keyslots even if there are some failures luks2_get_keyslot() can fail for a variety of reasons that do not necessarily mean the next keyslot should not be tried (e.g. a new kdf type). So always try the next slot. This will make GRUB more resilient to non-spec json data that 3rd party systems may add. We do not care if some of the keyslots are unusable, only if there is at least one that is. Reviewed-by: Daniel Kiper 2022-08-10 Glenn Washburn efi: Add efitextmode command for getting/setting the text mode resolution This command is meant to behave similarly to the "mode" command of the EFI Shell application. In addition to allowing mode selection by giving the number of columns and rows as arguments, the command allows specifying the mode number to select the mode. Also supported are the arguments "min" and "max", which set the mode to the minimum and maximum mode respectively as calculated by the columns * rows of that mode. Reviewed-by: Daniel Kiper 2022-07-27 Robbie Harwood fs/fat: Don't error when mtime is 0 In the wild, we occasionally see valid ESPs where some file modification times are 0. For instance: ├── [Dec 31 1979] EFI │ ├── [Dec 31 1979] BOOT │ │ ├── [Dec 31 1979] BOOTX64.EFI │ │ └── [Dec 31 1979] fbx64.efi │ └── [Jun 27 02:41] fedora │ ├── [Dec 31 1979] BOOTX64.CSV │ ├── [Dec 31 1979] fonts │ ├── [Mar 14 03:35] fw │ │ ├── [Mar 14 03:35] fwupd-359c1169-abd6-4a0d-8bce-e4d4713335c1.cap │ │ ├── [Mar 14 03:34] fwupd-9d255c4b-2d88-4861-860d-7ee52ade9463.cap │ │ └── [Mar 14 03:34] fwupd-b36438d8-9128-49d2-b280-487be02d948b.cap │ ├── [Dec 31 1979] fwupdx64.efi │ ├── [May 10 10:47] grub.cfg │ ├── [Jun 3 12:38] grub.cfg.new.new │ ├── [May 10 10:41] grub.cfg.old │ ├── [Jun 27 02:41] grubenv │ ├── [Dec 31 1979] grubx64.efi │ ├── [Dec 31 1979] mmx64.efi │ ├── [Dec 31 1979] shim.efi │ ├── [Dec 31 1979] shimx64.efi │ └── [Dec 31 1979] shimx64-fedora.efi └── [Dec 31 1979] FSCK0000.REC 5 directories, 17 files This causes grub-probe failure, which in turn causes grub-mkconfig failure. They are valid filesystems that appear intact, and the Linux FAT stack is able to mount and manipulate them without complaint. The check for mtime of 0 has been present since 20def1a3c3952982395cd7c3ea7e78638527962b (fat: support file modification times). Reviewed-by: Daniel Kiper 2022-07-27 Robbie Harwood kern/fs: The grub_fs_probe() should dprint errors from filesystems When filesystem detection fails, all that's currently debug-logged is a series of messages like: grub-core/kern/fs.c:56:fs: Detecting ntfs... grub-core/kern/fs.c:76:fs: ntfs detection failed. repeated for each filesystem. Any messages provided to grub_error() by the filesystem are lost, and one has to break out gdb to figure out what went wrong. With this change, one instead sees: grub-core/kern/fs.c:56:fs: Detecting fat... grub-core/osdep/hostdisk.c:357:hostdisk: reusing open device `/path/to/device' grub-core/kern/fs.c:77:fs: error: invalid modification timestamp for /. grub-core/kern/fs.c:79:fs: fat detection failed. in the debug prints. Reviewed-by: Daniel Kiper 2022-07-27 Robbie Harwood util/grub-probe: Document the behavior of multiple -v Reviewed-by: Daniel Kiper 2022-07-27 Ross Philipson lib/relocator: Initialize local relocator subchunk struct to all zeros The way the code is written the tofree variable would never be passed to the free_subchunk() function uninitialized. Coverity cannot determine this and flags the situation as "Using uninitialized value...". The fix is just to initialize the local struct. Fixes: CID 314016 Reviewed-by: Darren Kenny Tested-by: Alec Brown Reviewed-by: Daniel Kiper 2022-07-27 Lu Ken efi/tpm: Add EFI_CC_MEASUREMENT_PROTOCOL support The EFI_CC_MEASUREMENT_PROTOCOL abstracts the measurement for virtual firmware in confidential computing environment. It is similar to the EFI_TCG2_PROTOCOL. It was proposed by Intel and ARM and approved by UEFI organization. It is defined in Intel GHCI specification: https://cdrdv2.intel.com/v1/dl/getContent/726790 . The EDKII header file is available at https://github.com/tianocore/edk2/blob/master/MdePkg/Include/Protocol/CcMeasurement.h . Reviewed-by: Daniel Kiper 2022-07-27 Lu Ken commands/efi/tpm: Use grub_strcpy() instead of grub_memcpy() The event description is a string, so using grub_strcpy() is cleaner than using grub_memcpy(). Reviewed-by: Daniel Kiper 2022-07-27 Lu Ken commands/efi/tpm: Refine the status of log event 1. Use macro GRUB_ERR_NONE instead of hard code 0. 2. Keep lowercase of the first char for the status string of log event. Reviewed-by: Daniel Kiper 2022-07-12 Nicholas Vinson configure: Warn if stack protector is not allowed Introduce ERROR_PLATFORM_NOT_SUPPORT_SSP environment variable to treat the "--enable-stack-protector is only supported on EFI platforms" message as a warning instead of an error. If ERROR_PLATFORM_NOT_SUPPORT_SSP is set to "no" (case-insensitive), then the message will be printed as a warning. Otherwise, it prints as an error. The default behavior is to print the message as an error. For any wrapper build script that has some variation of: for p in SELECTED_GRUB_PLATFORMS; do \ configure --enable-stack-protector \ --with-platform${P} ... || die; \ done make The GRUB will fail to build if SELECTED_GRUB_PLATFORMS contains a platform that does not support SSP. Such wrapper scripts need to work-around this issue by modifying the above for-loop, so it conditionally passes --enable-stack-protector to configure for the proper GRUB platform(s). However, if the above example is modified to have to conditionally pass in --enable-stack-protector, its behavior is effectively the same as the proposed change. Additionally, The list of SSP supported platforms is now in 2 places. One in the configure script and one in the build wrapper script. If the second list is not properly maintained it could mistakenly disable SSP for a platform that later gained support for it. Reviewed-by: Daniel Kiper 2022-07-12 Darren Kenny util/grub-mkfont: Fix tainted loop boundary issues with substitutions With gsub substitutions the offsets should be validated against the number of glyphs in a font face and the memory allocated for the gsub substitution data. Both the number of glyphs and the last address in the allocated data are passed in to process_cursive(), where the number of glyphs validates the end of the range. Enabling memory allocation validation uses two macros, one to simply check the address against the allocated space, and the other to check that the number of items of a given size doesn't extend outside of the allocated space. Fixes: CID 73770 Fixes: CID 314040 Reviewed-by: Daniel Kiper 2022-07-12 Glenn Washburn efi: Add missing header from include/grub/efi/console_control.h Reviewed-by: Daniel Kiper 2022-07-04 Glenn Washburn disk: Replace code that calculates the log of sector size with grub_log2ull() Reviewed-by: Daniel Kiper 2022-07-04 Mathieu Desnoyers templates: Remove unused version comparison functions There are no users left of version_find_latest(), version_test_gt(), and version_test_numeric(). Remove those unused helper functions. Using those helper functions is what caused the quadratic sorting performance issues in the first place, so removing them is a net win. Reviewed-by: Robbie Harwood Reviewed-by: Daniel Kiper 2022-07-04 Mathieu Desnoyers templates/kfreebsd: Fix quadratic algorithm for sorting menu items The current implementation of the 10_kfreebsd script implements its menu items sorting in bash with a quadratic algorithm, calling "sed", "sort", "head", and "grep" to compare versions between individual lines, which is annoyingly slow for kernel developers who can easily end up with 50-100 kernels in their boot partition. This fix is ported from the 10_linux script, which has a similar quadratic code pattern. Cc: debian-bsd@lists.debian.org Reviewed-by: Daniel Kiper 2022-07-04 Mathieu Desnoyers templates/hurd: Fix quadratic algorithm for sorting menu items The current implementation of the 10_hurd script implements its menu items sorting in bash with a quadratic algorithm, calling "sed", "sort", "head", and "grep" to compare versions between individual lines, which is annoyingly slow for kernel developers who can easily end up with 50-100 kernels in their boot partition. This fix is ported from the 10_linux script, which has a similar quadratic code pattern. Cc: Samuel Thibault Tested-by: Samuel Thibault Reviewed-by: Daniel Kiper 2022-07-04 Mathieu Desnoyers templates/linux_xen: Fix quadratic algorithm for sorting menu items The current implementation of the 20_linux_xen script implements its menu items sorting in bash with a quadratic algorithm, calling "sed", "sort", "head", and "grep" to compare versions between individual lines, which is annoyingly slow for kernel developers who can easily end up with 50-100 kernels in their boot partition. This fix is ported from the 10_linux script, which has a similar quadratic code pattern. Cc: xen-devel@lists.xenproject.org Tested-by: Jason Andryuk Reviewed-by: Daniel Kiper 2022-07-04 Mathieu Desnoyers templates/linux: Fix quadratic algorithm for sorting menu items The current implementation of the 10_linux script implements its menu items sorting in bash with a quadratic algorithm, calling "sed", "sort", "head", and "grep" to compare versions between individual lines, which is annoyingly slow for kernel developers who can easily end up with 50-100 kernels in /boot. As an example, on a Intel(R) Core(TM) i7-8650U CPU @ 1.90GHz, running: /usr/sbin/grub-mkconfig > /dev/null With 44 kernels in /boot, this command takes 10-15 seconds to complete. After this fix, the same command runs in 5 seconds. With 116 kernels in /boot, this command takes 40 seconds to complete. After this fix, the same command runs in 8 seconds. For reference, the quadratic algorithm here is: while [ "x$list" != "x" ] ; do <--- outer loop linux=`version_find_latest $list` version_find_latest() for i in "$@" ; do <--- inner loop version_test_gt() fork+exec sed version_test_numeric() version_sort fork+exec sort fork+exec head -n 1 fork+exec grep list=`echo $list | tr ' ' '\n' | fgrep -vx "$linux" | tr '\n' ' '` tr fgrep tr So all commands executed under version_test_gt() are executed O(n^2) times where n is the number of kernel images in /boot. Here is the improved algorithm proposed: - Prepare a list with all the relevant information for ordering by a single sort(1) execution. This is done by renaming ".old" suffixes by " 1" and by suffixing all other files with " 2", thus making sure the ".old" entries will follow the non-old entries in reverse-sorted-order. - Call version_reverse_sort on the list (sort -r -V): A single execution of sort(1). For instance, GNU coreutils' sort will reverse-sort the list in O(n*log(n)) with a merge sort. - Replace the " 1" suffixes by ".old", and remove the " 2" suffixes. - Iterate on the reverse-sorted list to output each menu entry item. Therefore, the algorithm proposed has O(n*log(n)) complexity with GNU coreutils' sort compared to the prior O(n^2) complexity. Moreover, the constant time required for each list entry is much less because sorting is done within a single execution of sort(1) rather than requiring O(n^2) executions of sed(1), sort(1), head(1), and grep(1) in sub-shells. Reviewed-by: Robbie Harwood Reviewed-by: Daniel Kiper 2022-07-04 Glenn Washburn docs: Add documentation on detached header option to cryptomount Reviewed-by: Patrick Steinhardt Reviewed-by: Daniel Kiper 2022-07-04 Glenn Washburn cryptodisk: Add support for using detached header files Using the disk read hook mechanism, setup a read hook on the source disk which will read from the given header file during the scan and recovery cryptodisk backend functions. Disk read hooks are executed after the data has been read from the disk. This is okay, because the read hook is given the read buffer before its sent back to the caller. In this case, the hook can then overwrite the data read from the disk device with data from the header file sent in as the read hook data. This is transparent to the read caller. Since the callers of this function have just opened the source disk, there are no current read hooks, so there's no need to save/restore them nor consider if they should be called or not. This hook assumes that the header is at the start of the volume, which is not the case for some formats (e.g. GELI). So GELI will return an error if a detached header is specified. It also can only be used with formats where the detached header file can be written to the first blocks of the volume and the volume could still be unlocked. So the header file can not be formatted differently from the on-disk header. If these assumpts are not met, detached header file processing must be specially handled in the cryptodisk backend module. The hook will be called potentially many times by a backend. This is fine because of the assumptions mentioned and the read hook reads from absolute offsets and is stateless. Also add a --header (short -H) option to cryptomount which takes a file argument. Reviewed-by: Patrick Steinhardt Reviewed-by: Daniel Kiper 2022-07-04 Glenn Washburn disk: Allow read hook callback to take read buffer to potentially modify it It will be desirable in the future to allow having the read hook modify the data passed back from a read function call on a disk or file. This adds that infrastructure and has no impact on code flow for existing uses of the read hook. Also changed is that now when the read hook callback is called it can also indicate what error code should be sent back to the read caller. Reviewed-by: Patrick Steinhardt Reviewed-by: Daniel Kiper 2022-07-04 Glenn Washburn docs: Document undocumented variables Document the variables net__clientid, net__clientuuid, lockdown, and shim_lock in the list of special environment variables. Reviewed-by: Daniel Kiper 2022-07-04 Patrick Steinhardt kern/efi/mm: Implement runtime addition of pages Adjust the interface of grub_efi_mm_add_regions() to take a set of GRUB_MM_ADD_REGION_* flags, which most notably is currently only the GRUB_MM_ADD_REGION_CONSECUTIVE flag. This allows us to set the function up as callback for the memory subsystem and have it call out to us in case there's not enough pages available in the current heap. Reviewed-by: Daniel Kiper Tested-by: Patrick Steinhardt 2022-07-04 Patrick Steinhardt kern/efi/mm: Pass up errors from add_memory_regions() The function add_memory_regions() is currently only called on system initialization to allocate a fixed amount of pages. As such, it didn't need to return any errors: in case it failed, we cannot proceed anyway. This will change with the upcoming support for requesting more memory from the firmware at runtime, where it doesn't make sense anymore to fail hard. Refactor the function to return an error to prepare for this. Note that this does not change the behaviour when initializing the memory system because grub_efi_mm_init() knows to call grub_fatal() in case grub_efi_mm_add_regions() returns an error. Reviewed-by: Daniel Kiper Tested-by: Patrick Steinhardt 2022-07-04 Patrick Steinhardt kern/efi/mm: Extract function to add memory regions In preparation of support for runtime-allocating additional memory region, this patch extracts the function to retrieve the EFI memory map and add a subset of it to GRUB's own memory regions. Reviewed-by: Daniel Kiper Tested-by: Patrick Steinhardt 2022-07-04 Patrick Steinhardt kern/efi/mm: Always request a fixed number of pages on init When initializing the EFI memory subsystem, we will by default request a quarter of the available memory, bounded by a minimum/maximum value. Given that we're about to extend the EFI memory system to dynamically request additional pages from the firmware as required, this scaling of requested memory based on available memory will not make a lot of sense anymore. Remove this logic as a preparatory patch such that we'll instead defer to the runtime memory allocator. Note that ideally, we'd want to change this after dynamic requesting of pages has been implemented for the EFI platform. But because we'll need to split up initialization of the memory subsystem and the request of pages from the firmware, we'd have to duplicate quite some logic at first only to remove it afterwards again. This seems quite pointless, so we instead have patches slightly out of order. Reviewed-by: Daniel Kiper Tested-by: Patrick Steinhardt 2022-07-04 Patrick Steinhardt mm: Allow dynamically requesting additional memory regions Currently, all platforms will set up their heap on initialization of the platform code. While this works mostly fine, it poses some limitations on memory management on us. Most notably, allocating big chunks of memory in the gigabyte range would require us to pre-request this many bytes from the firmware and add it to the heap from the beginning on some platforms like EFI. As this isn't needed for most configurations, it is inefficient and may even negatively impact some usecases when, e.g., chainloading. Nonetheless, allocating big chunks of memory is required sometimes, where one example is the upcoming support for the Argon2 key derival function in LUKS2. In order to avoid pre-allocating big chunks of memory, this commit implements a runtime mechanism to add more pages to the system. When a given allocation cannot be currently satisfied, we'll call a given callback set up by the platform's own memory management subsystem, asking it to add a memory area with at least "n" bytes. If this succeeds, we retry searching for a valid memory region, which should now succeed. If this fails, we try asking for "n" bytes, possibly spread across multiple regions, in hopes that region merging means that we end up with enough memory for things to work out. Tested-by: Stefan Berger Reviewed-by: Daniel Kiper Tested-by: Patrick Steinhardt 2022-07-04 Patrick Steinhardt mm: Drop unused unloading of modules on OOM In grub_memalign(), there's a commented section which would allow for unloading of unneeded modules in case where there is not enough free memory available to satisfy a request. Given that this code is never compiled in, let's remove it together with grub_dl_unload_unneeded(). Reviewed-by: Daniel Kiper Tested-by: Patrick Steinhardt 2022-07-04 Daniel Axtens mm: Debug support for region operations This is handy for debugging. Enable with "set debug=regions". Reviewed-by: Daniel Kiper Tested-by: Patrick Steinhardt 2022-07-04 Daniel Axtens mm: When adding a region, merge with region after as well as before On x86_64-efi (at least) regions seem to be added from top down. The mm code will merge a new region with an existing region that comes immediately before the new region. This allows larger allocations to be satisfied that would otherwise be the case. On powerpc-ieee1275, however, regions are added from bottom up. So if we add 3x 32MB regions, we can still only satisfy a 32MB allocation, rather than the 96MB allocation we might otherwise be able to satisfy. * Define 'post_size' as being bytes lost to the end of an allocation due to being given weird sizes from firmware that are not multiples of GRUB_MM_ALIGN. * Allow merging of regions immediately _after_ existing regions, not just before. As with the other approach, we create an allocated block to represent the new space and the pass it to grub_free() to get the metadata right. Tested-by: Stefan Berger Reviewed-by: Daniel Kiper Tested-by: Patrick Steinhardt 2022-06-29 Daniel Axtens mm: Assert that we preserve header vs region alignment grub_mm_region_init() does: h = (grub_mm_header_t) (r + 1); where h is a grub_mm_header_t and r is a grub_mm_region_t. Cells are supposed to be GRUB_MM_ALIGN aligned, but while grub_mm_dump ensures this vs the region header, grub_mm_region_init() does not. It's better to be explicit than implicit here: rather than changing grub_mm_region_init() to ALIGN_UP(), require that the struct is explicitly a multiple of the header size. Reviewed-by: Daniel Kiper Tested-by: Patrick Steinhardt 2022-06-28 Daniel Axtens tests: Only pass SeaBIOS fw_opt for x86 non-EFI platforms This breaks the tests on pseries - just restrict it to x86 platforms that don't specify an EFI. Reviewed-by: Daniel Kiper 2022-06-07 Darren Kenny fs/btrfs: Fix more fuzz issues related to chunks The corpus was generating issues in grub_btrfs_read_logical() when attempting to iterate over stripe entries in the superblock's bootmapping. In most cases the reason for the failure was that the number of stripes in chunk->nstripes exceeded the possible space statically allocated in superblock bootmapping space. Each stripe entry in the bootmapping block consists of a grub_btrfs_key followed by a grub_btrfs_chunk_stripe. Another issue that came up was that while calculating the chunk size, in an earlier piece of code in that function, depending on the data provided in the btrfs file system, it would end up calculating a size that was too small to contain even 1 grub_btrfs_chunk_item, which is obviously invalid too. Reviewed-by: Daniel Kiper 2022-06-07 Darren Kenny fs/btrfs: Fix more ASAN and SEGV issues found with fuzzing The fuzzer is generating btrfs file systems that have chunks with invalid combinations of stripes and substripes for the given RAID configurations. After examining the Linux kernel fs/btrfs/tree-checker.c code, it appears that sub-stripes should only be applied to RAID10, and in that case there should only ever be 2 of them. Similarly, RAID single should only have 1 stripe, and RAID1/1C3/1C4 should have 2. 3 or 4 stripes respectively, which is what redundancy corresponds. Some of the chunks ended up with a size of 0, which grub_malloc() still returned memory for and in turn generated ASAN errors later when accessed. While it would be possible to specifically limit the number of stripes, a more correct test was on the combination of the chunk item, and the number of stripes by the size of the chunk stripe structure in comparison to the size of the chunk itself. Reviewed-by: Daniel Kiper 2022-06-07 Darren Kenny fs/btrfs: Fix several fuzz issues with invalid dir item sizing According to the btrfs code in Linux, the structure of a directory item leaf should be of the form: |struct btrfs_dir_item|name|data| in GRUB the name len and data len are in the grub_btrfs_dir_item structure's n and m fields respectively. The combined size of the structure, name and data should be less than the allocated memory, a difference to the Linux kernel's struct btrfs_dir_item is that the grub_btrfs_dir_item has an extra field for where the name is stored, so we adjust for that too. Reviewed-by: Daniel Kiper 2022-06-07 Sudhakar Kuppusamy fs/f2fs: Do not copy file names that are too long A corrupt f2fs file system might specify a name length which is greater than the maximum name length supported by the GRUB f2fs driver. We will allocate enough memory to store the overly long name, but there are only F2FS_NAME_LEN bytes in the source, so we would read past the end of the source. While checking directory entries, do not copy a file name with an invalid length. Reviewed-by: Daniel Kiper 2022-06-07 Sudhakar Kuppusamy fs/f2fs: Do not read past the end of nat bitmap A corrupt f2fs filesystem could have a block offset or a bitmap offset that would cause us to read beyond the bounds of the nat bitmap. Introduce the nat_bitmap_size member in grub_f2fs_data which holds the size of nat bitmap. Set the size when loading the nat bitmap in nat_bitmap_ptr(), and catch when an invalid offset would create a pointer past the end of the allocated space. Check against the bitmap size in grub_f2fs_test_bit() test bit to avoid reading past the end of the nat bitmap. Reviewed-by: Daniel Kiper 2022-06-07 Sudhakar Kuppusamy fs/f2fs: Do not read past the end of nat journal entries A corrupt f2fs file system could specify a nat journal entry count that is beyond the maximum NAT_JOURNAL_ENTRIES. Check if the specified nat journal entry count before accessing the array, and throw an error if it is too large. Reviewed-by: Daniel Kiper 2022-06-07 Daniel Axtens net/http: Error out on headers with LF without CR In a similar vein to the previous patch, parse_line() would write a NUL byte past the end of the buffer if there was an HTTP header with a LF rather than a CRLF. RFC-2616 says: Many HTTP/1.1 header field values consist of words separated by LWS or special characters. These special characters MUST be in a quoted string to be used within a parameter value (as defined in section 3.6). We don't support quoted sections or continuation lines, etc. If we see an LF that's not part of a CRLF, bail out. Fixes: CVE-2022-28734 Reviewed-by: Daniel Kiper 2022-06-07 Daniel Axtens net/http: Fix OOB write for split http headers GRUB has special code for handling an http header that is split across two packets. The code tracks the end of line by looking for a "\n" byte. The code for split headers has always advanced the pointer just past the end of the line, whereas the code that handles unsplit headers does not advance the pointer. This extra advance causes the length to be one greater, which breaks an assumption in parse_line(), leading to it writing a NUL byte one byte past the end of the buffer where we reconstruct the line from the two packets. It's conceivable that an attacker controlled set of packets could cause this to zero out the first byte of the "next" pointer of the grub_mm_region structure following the current_line buffer. Do not advance the pointer in the split header case. Fixes: CVE-2022-28734 Reviewed-by: Daniel Kiper 2022-06-07 Daniel Axtens net/http: Do not tear down socket if it's already been torn down It's possible for data->sock to get torn down in tcp error handling. If we unconditionally tear it down again we will end up doing writes to an offset of the NULL pointer when we go to tear it down again. Detect if it has been torn down and don't do it again. Reviewed-by: Daniel Kiper 2022-06-07 Daniel Axtens net/tftp: Avoid a trivial UAF Under tftp errors, we print a tftp error message from the tftp header. However, the tftph pointer is a pointer inside nb, the netbuff. Previously, we were freeing the nb and then dereferencing it. Don't do that, use it and then free it later. This isn't really _bad_ per se, especially as we're single-threaded, but it trips up fuzzers. Reviewed-by: Daniel Kiper 2022-06-07 Daniel Axtens net/tftp: Prevent a UAF and double-free from a failed seek A malicious tftp server can cause UAFs and a double free. An attempt to read from a network file is handled by grub_net_fs_read(). If the read is at an offset other than the current offset, grub_net_seek_real() is invoked. In grub_net_seek_real(), if a backwards seek cannot be satisfied from the currently received packets, and the underlying transport does not provide a seek method, then grub_net_seek_real() will close and reopen the network protocol layer. For tftp, the ->close() call goes to tftp_close() and frees the tftp_data_t file->data. The file->data pointer is not nulled out after the free. If the ->open() call fails, the file->data will not be reallocated and will continue point to a freed memory block. This could happen from a server refusing to send the requisite ack to the new tftp request, for example. The seek and the read will then fail, but the grub_file continues to exist: the failed seek does not necessarily cause the entire file to be thrown away (e.g. where the file is checked to see if it is gzipped/lzio/xz/etc., a read failure is interpreted as a decompressor passing on the file, not as an invalidation of the entire grub_file_t structure). This means subsequent attempts to read or seek the file will use the old file->data after free. Eventually, the file will be close()d again and file->data will be freed again. Mark a net_fs file that doesn't reopen as broken. Do not permit read() or close() on a broken file (seek is not exposed directly to the file API - it is only called as part of read, so this blocks seeks as well). As an additional defence, null out the ->data pointer if tftp_open() fails. That would have lead to a simple null pointer dereference rather than a mess of UAFs. This may affect other protocols, I haven't checked. Reviewed-by: Daniel Kiper 2022-06-07 Daniel Axtens net/dns: Don't read past the end of the string we're checking against I don't really understand what's going on here but fuzzing found a bug where we read past the end of check_with. That's a C string, so use grub_strlen() to make sure we don't overread it. Reviewed-by: Daniel Kiper 2022-06-07 Daniel Axtens net/dns: Fix double-free addresses on corrupt DNS response grub_net_dns_lookup() takes as inputs a pointer to an array of addresses ("addresses") for the given name, and pointer to a number of addresses ("naddresses"). grub_net_dns_lookup() is responsible for allocating "addresses", and the caller is responsible for freeing it if "naddresses" > 0. The DNS recv_hook will sometimes set and free the addresses array, for example if the packet is too short: if (ptr + 10 >= nb->tail) { if (!*data->naddresses) grub_free (*data->addresses); grub_netbuff_free (nb); return GRUB_ERR_NONE; } Later on the nslookup command code unconditionally frees the "addresses" array. Normally this is fine: the array is either populated with valid data or is NULL. But in these sorts of error cases it is neither NULL nor valid and we get a double-free. Only free "addresses" if "naddresses" > 0. It looks like the other use of grub_net_dns_lookup() is not affected. Reviewed-by: Daniel Kiper 2022-06-07 Daniel Axtens net/netbuff: Block overly large netbuff allocs A netbuff shouldn't be too huge. It's bounded by MTU and TCP segment reassembly. If we are asked to create one that is unreasonably big, refuse. This is a hardening measure: if we hit this code, there's a bug somewhere else that we should catch and fix. This commit: - stops the bug propagating any further. - provides a spot to instrument in e.g. fuzzing to try to catch these bugs. I have put instrumentation (e.g. __builtin_trap() to force a crash) here and have not been able to find any more crashes. Reviewed-by: Daniel Kiper 2022-06-07 Daniel Axtens net/ip: Do IP fragment maths safely We can receive packets with invalid IP fragmentation information. This can lead to rsm->total_len underflowing and becoming very large. Then, in grub_netbuff_alloc(), we add to this very large number, which can cause it to overflow and wrap back around to a small positive number. The allocation then succeeds, but the resulting buffer is too small and subsequent operations can write past the end of the buffer. Catch the underflow here. Fixes: CVE-2022-28733 Reviewed-by: Daniel Kiper 2022-06-07 Daniel Axtens normal/charset: Fix array out-of-bounds formatting unicode for display In some cases attempting to display arbitrary binary strings leads to ASAN splats reading the widthspec array out of bounds. Check the index. If it would be out of bounds, return a width of 1. I don't know if that's strictly correct, but we're not really expecting great display of arbitrary binary data, and it's certainly not worse than an OOB read. Reviewed-by: Daniel Kiper 2022-06-07 Daniel Axtens video/readers/jpeg: Block int underflow -> wild pointer write Certain 1 px wide images caused a wild pointer write in grub_jpeg_ycrcb_to_rgb(). This was caused because in grub_jpeg_decode_data(), we have the following loop: for (; data->r1 < nr1 && (!data->dri || rst); data->r1++, data->bitmap_ptr += (vb * data->image_width - hb * nc1) * 3) We did not check if vb * width >= hb * nc1. On a 64-bit platform, if that turns out to be negative, it will underflow, be interpreted as unsigned 64-bit, then be added to the 64-bit pointer, so we see data->bitmap_ptr jump, e.g.: 0x6180_0000_0480 to 0x6181_0000_0498 ^ ~--- carry has occurred and this pointer is now far away from any object. On a 32-bit platform, it will decrement the pointer, creating a pointer that won't crash but will overwrite random data. Catch the underflow and error out. Fixes: CVE-2021-3697 Reviewed-by: Daniel Kiper 2022-06-07 Daniel Axtens video/readers/jpeg: Refuse to handle multiple start of streams An invalid file could contain multiple start of stream blocks, which would cause us to reallocate and leak our bitmap. Refuse to handle multiple start of streams. Additionally, fix a grub_error() call formatting. Reviewed-by: Daniel Kiper 2022-06-07 Daniel Axtens video/readers/jpeg: Do not reallocate a given huff table Fix a memory leak where an invalid file could cause us to reallocate memory for a huffman table we had already allocated memory for. Reviewed-by: Daniel Kiper 2022-06-07 Daniel Axtens video/readers/jpeg: Abort sooner if a read operation fails Fuzzing revealed some inputs that were taking a long time, potentially forever, because they did not bail quickly upon encountering an I/O error. Try to catch I/O errors sooner and bail out. Reviewed-by: Daniel Kiper 2022-06-07 Daniel Axtens video/readers/png: Sanity check some huffman codes ASAN picked up two OOB global reads: we weren't checking if some code values fit within the cplens or cpdext arrays. Check and throw an error if not. Reviewed-by: Daniel Kiper 2022-06-07 Daniel Axtens video/readers/png: Avoid heap OOB R/W inserting huff table items In fuzzing we observed crashes where a code would attempt to be inserted into a huffman table before the start, leading to a set of heap OOB reads and writes as table entries with negative indices were shifted around and the new code written in. Catch the case where we would underflow the array and bail. Fixes: CVE-2021-3696 Reviewed-by: Daniel Kiper 2022-06-07 Daniel Axtens video/readers/png: Drop greyscale support to fix heap out-of-bounds write A 16-bit greyscale PNG without alpha is processed in the following loop: for (i = 0; i < (data->image_width * data->image_height); i++, d1 += 4, d2 += 2) { d1[R3] = d2[1]; d1[G3] = d2[1]; d1[B3] = d2[1]; } The increment of d1 is wrong. d1 is incremented by 4 bytes per iteration, but there are only 3 bytes allocated for storage. This means that image data will overwrite somewhat-attacker-controlled parts of memory - 3 bytes out of every 4 following the end of the image. This has existed since greyscale support was added in 2013 in commit 3ccf16dff98f (grub-core/video/readers/png.c: Support grayscale). Saving starfield.png as a 16-bit greyscale image without alpha in the gimp and attempting to load it causes grub-emu to crash - I don't think this code has ever worked. Delete all PNG greyscale support. Fixes: CVE-2021-3695 Reviewed-by: Daniel Kiper 2022-06-07 Daniel Axtens video/readers/png: Refuse to handle multiple image headers This causes the bitmap to be leaked. Do not permit multiple image headers. Reviewed-by: Daniel Kiper 2022-06-07 Daniel Axtens video/readers/png: Abort sooner if a read operation fails Fuzzing revealed some inputs that were taking a long time, potentially forever, because they did not bail quickly upon encountering an I/O error. Try to catch I/O errors sooner and bail out. Reviewed-by: Daniel Kiper 2022-06-07 Daniel Axtens kern/file: Do not leak device_name on error in grub_file_open() If we have an error in grub_file_open() before we free device_name, we will leak it. Free device_name in the error path and null out the pointer in the good path once we free it there. Reviewed-by: Daniel Kiper 2022-06-07 Julian Andres Klode kern/efi/sb: Reject non-kernel files in the shim_lock verifier We must not allow other verifiers to pass things like the GRUB modules. Instead of maintaining a blocklist, maintain an allowlist of things that we do not care about. This allowlist really should be made reusable, and shared by the lockdown verifier, but this is the minimal patch addressing security concerns where the TPM verifier was able to mark modules as verified (or the OpenPGP verifier for that matter), when it should not do so on shim-powered secure boot systems. Fixes: CVE-2022-28735 Reviewed-by: Daniel Kiper 2022-06-07 Chris Coulson loader/efi/chainloader: Use grub_loader_set_ex() This ports the EFI chainloader to use grub_loader_set_ex() in order to fix a use-after-free bug that occurs when grub_cmd_chainloader() is executed more than once before a boot attempt is performed. Fixes: CVE-2022-28736 Reviewed-by: Daniel Kiper 2022-06-07 Chris Coulson commands/boot: Add API to pass context to loader Loaders rely on global variables for saving context which is consumed in the boot hook and freed in the unload hook. In the case where a loader command is executed twice, calling grub_loader_set() a second time executes the unload hook, but in some cases this runs when the loader's global context has already been updated, resulting in the updated context being freed and potential use-after-free bugs when the boot hook is subsequently called. This adds a new API, grub_loader_set_ex(), which allows a loader to specify context that is passed to its boot and unload hooks. This is an alternative to requiring that loaders call grub_loader_unset() before mutating their global context. Reviewed-by: Daniel Kiper 2022-06-07 Chris Coulson loader/efi/chainloader: Simplify the loader state The chainloader command retains the source buffer and device path passed to LoadImage(), requiring the unload hook passed to grub_loader_set() to free them. It isn't required to retain this state though - they aren't required by StartImage() or anything else in the boot hook, so clean them up before grub_cmd_chainloader() finishes. Reviewed-by: Daniel Kiper 2022-06-07 Jagannathan Raman fs/zfs/zfs: zfs_mount() - avoid pointer downcasting Coverity reports that while loopis in the following functions uses tainted data as boundary: zfs_mount() -> check_mos_features() -> dnode_get() -> zfs_log2() zfs_mount() -> grub_memmove() The defect type is "Untrusted loop bound" caused as a result of "tainted_data_downcast". Coverity does not like the pointer downcast here and we need to address it. We believe Coverity flags pointer downcast for the following two reasons: 1. External data: The pointer downcast could indicate that the source is external data, which we need to further sanitize - such as verifying its limits. In this case, the data is read from an external source, which is a disk. But, zio_read(), which reads the data from the disk, sanitizes it using a checksum. checksum is the best facility that ZFS offers to verify external data, and we don't believe a better way exists. Therefore, no further action is possible for this. 2. Corruption due to alignment: downcasting a pointer from a strict type to less strict type could result in data corruption. For example, the following cast would corrupt because uint32_t is 4-byte aligned, and won't be able to point to 0x1003 which is not 4-byte aligned. uint8_t *ptr = 0x1003; uint32_t *word = ptr; (incorrect, alignment issues) This patch converts the "osp" pointer in zfs_mount() from a "void" type to "objset_phys_t" type to address this issue. We are not sure if there are any other reasons why Coverity flags the downcast. However, the fix for alignment issue masks/suppresses any other issues from showing up. Fixes: CID 314023 Reviewed-by: Darren Kenny Reviewed-by: Daniel Kiper 2022-06-07 Jagannathan Raman fs/zfs/zfs: make_mdn() - avoid pointer downcasting Coverity reports that the while loop in the following function uses tainted data as boundary: fill_fs_info() -> dnode_get() -> zfs_log2() The tainted originated from: fill_fs_info() -> make_mdn() The defect type is "Untrusted loop bound" caused as a result of "tainted_data_downcast". Coverity does not like the pointer downcast here and we need to address it. We believe Coverity flags pointer downcast for the following two reasons: 1. External data: The pointer downcast could indicate that the source is external data, which we need to further sanitize - such as verifying its limits. In this case, the data is read from an external source, which is a disk. But, zio_read(), which reads the data from the disk, sanitizes it using a checksum. checksum is the best facility that ZFS offers to verify external data, and we don't believe a better way exists. Therefore, no further action is possible for this. 2. Corruption due to alignment: downcasting a pointer from a strict type to less strict type could result in data corruption. For example, the following cast would corrupt because uint32_t is 4-byte aligned, and won't be able to point to 0x1003 which is not 4-byte aligned. uint8_t *ptr = 0x1003; uint32_t *word = ptr; (incorrect, alignment issues) This patch converts the "osp" pointer in make_mdn() from a "void" type to "objset_phys_t" type to address the issue. We are not sure if there are any other reasons why Coverity flags the downcast. However, the fix for alignment issue masks/suppresses any other issues from showing up. Fixes: CID 314020 Reviewed-by: Darren Kenny Reviewed-by: Daniel Kiper 2022-06-07 Alec Brown util/grub-module-verifierXX: Add e_shoff check in get_shdr() In util/grub-module-verifierXX.c, the function get_shdr() is used to obtain the section header at a given index but isn't checking that there is an offset for the section header table. To validate that there is, we can check that e_shoff isn't 0. Reviewed-by: Daniel Kiper Reviewed-by: Darren Kenny 2022-06-07 Alec Brown grub-core/loader/i386/bsdXX: Avoid downcasting (char *) to (Elf_Shdr *) In bsdXX.c, a couple of untrusted loop bound and untrusted allocation size bugs were flagged by Coverity in the functions grub_openbsd_find_ramdisk() and grub_freebsd_load_elfmodule(). These bugs were flagged by coverity because the variable shdr was downcasting from a char pointer to an Elf_Shdr pointer whenever it was used to set the base value in for loops. To avoid this, we need to set shdr as an Elf_Shdr pointer where it is initialized. In the function read_headers(), the function is reading elf section header data from a file and passing it to the variable shdr as data for a char pointer. If we switch the type of shdr to an Elf_Shdr pointer in read_headers() as well as other functions, then we won't need to downcast to an Elf_Shdr pointer. By doing this, the issue becomes masked from Coverity's view. In the following patches, we check limits to ensure the data isn't tainted. Also, switched use of (char *) to (grub_uint8_t *) to give a better indication of pointer arithmetic and not suggest use of a C string. Fixes: CID 314018 Fixes: CID 314030 Fixes: CID 314031 Fixes: CID 314039 Reviewed-by: Daniel Kiper Reviewed-by: Darren Kenny 2022-06-07 Stefan Agner disk/efi/efidisk: Pass buffers with higher alignment Some devices report IoAlign values but seem to require buffers with higher alignment. The UEFI specification is saying: "IoAlign values of 0 and 1 mean that the buffer can be placed anywhere in memory. Otherwise, IoAlign must be a power of 2, and the requirement is that the start address of a buffer must be evenly divisible by IoAlign with no remainder." Some devices report IoAlign of 2, however seem to require 4 bytes aligned buffers. It seems that this got misinterpreted by some vendors assuming IoAlign is 2^IoAlign. There is also such a hint in an example in earlier versions of the Driver Writer's Guide: ScsiPassThruMode.IoAlign = 2; // Data must be alligned on 4-byte boundary Some devices report no alignment requirements at all but seem to read corrupted data or report read errors when passing unaligned buffers. Work around by using an alignment of at least BlockSize (typically 512 bytes) in any case. If IoAlign (interpreted as per UEFI specification) requests a higher alignment than BlockSize, follow IoAlign still. Note: The problem has only noticed with compressed squashfs. It seems that ext4 (and presumably other file system drivers) pass buffers with a higher alignment already. Acked-by: Heinrich Schuchardt Reviewed-by: Daniel Kiper 2022-06-07 Samuel Thibault osdep/hurd/getroot: Use "part:" qualifier When using userland drivers such as rumpdisk, we'd rather make ext2fs use parted-based libstore partitioning support. That can be used for kernelland drivers as well, so we can just make GRUB always use the "part:" qualifier to switch ext2fs to it. grub_util_find_hurd_root_device() then has to understand this syntax and translate it into the /dev/ entry name. Reviewed-by: Daniel Kiper 2022-06-07 Glenn Washburn docs: Add documentation on keyfile option to cryptomount Reviewed-by: Daniel Kiper disk/cryptodisk: Use enum constants as indexes into cryptomount option array Reviewed-by: Daniel Kiper 2022-06-07 John Lane disk/cryptodisk: Add options to cryptomount to support keyfiles Add the options --key-file, --keyfile-offset, and --keyfile-size to cryptomount and code to put read the requested key file data and pass via the cargs struct. Note, key file data is for all intents and purposes equivalent to a password given to cryptomount. So there is no need to enable support for key files in the various crypto backends (e.g. LUKS1) because the key data is passed just as if it were a password. Reviewed-by: Daniel Kiper 2022-06-07 Denis 'GNUtoo' Carikli disk/geli: Unify grub_cryptodisk_dev function names Reviewed-by: Patrick Steinhardt Reviewed-by: Daniel Kiper disk/luks: Unify grub_cryptodisk_dev function names Reviewed-by: Patrick Steinhardt Reviewed-by: Daniel Kiper 2022-06-07 Glenn Washburn util/probe: Remove unused header includes Reviewed-by: Daniel Kiper commands/macbless: Remove whitespace between N_ macro and open parenthesis Reviewed-by: Daniel Kiper 2022-06-07 Glenn Washburn tests: Add /sbin and /usr/sbin to path in partmap test The partmap test requires no elevated privileges. However, it uses parted which can be used as a normal user, but is usually located in /sbin or /usr/bin (eg. on Debian systems). Whereas the normal user does not usually have /sbin or /usr/sbin added to their path, thus parted will not be found causing the test to abort. Add /sbin and /usr/sbin to the path for the partmap test so that the test can run successfully as an unprivileged user. Reviewed-by: Daniel Kiper 2022-06-07 Glenn Washburn tests: Show host determined fs UUID when hfs UUID test fails On failure, the hfs test should show both the host and GRUB determined fs UUID. Prior to this change, both outputs where generated by GRUB, which is less helpful in determining the cause of failure. Reviewed-by: Daniel Kiper 2022-05-24 Glenn Washburn docs: Add section for general undocumented commands The section is an itemized list of commands that are not listed else where in the command sections. Reviewed-by: Daniel Kiper 2022-05-24 Glenn Washburn docs: Add under documented loader commands to beginning of loader section Reviewed-by: Daniel Kiper 2022-05-24 Glenn Washburn docs: Create command section for loader commands Move loader commands documented in the general commands list into the loader command section. Reviewed-by: Daniel Kiper 2022-05-24 Glenn Washburn docs: Markup loader commands with @command tag Also, add period to terminate sentence. Reviewed-by: Daniel Kiper 2022-05-24 Glenn Washburn docs: Make note of i386-pc specific usage of halt command The --no-apm option is only available on the i396-pc target. Reviewed-by: Daniel Kiper 2022-05-24 Glenn Washburn docs: Make note that sendkey is only available on i386-pc Reviewed-by: Daniel Kiper docs: Fix spelling typo and remove unnecessary spaces Reviewed-by: Daniel Kiper 2022-05-24 Glenn Washburn net/net: Fix incorrect condition for calling grub_net_tcp_retransmit() The commit 848724273e4 (net/net: Avoid unnecessary calls to grub_net_tcp_retransmit()) needs to have its condition inverted to avoid unnecessary calls to grub_net_tcp_retransmit(). As it is, it creates many unnecessary calls and does not call grub_net_tcp_retransmit() when needed. The call to grub_net_tcp_retransmit() should only be made when grub_net_cards does _not_ equal NULL, meaning that there are potentially network cards that need TCP retransmission. Fixes: 848724273e4 (net/net: Avoid unnecessary calls to grub_net_tcp_retransmit()) Reviewed-by: Daniel Kiper 2022-05-24 Oskari Pirhonen templates: Improve initramfs detection Add detection for initramfs of the form *.img.old. For example, Gentoo's sys-kernel/genkernel installs it as initramfs-*.img and moves any existing one to initramfs-*.img.old. Apply the same scheme to initrd-*.img and initrd-*.gz files for consistency. Reviewed-by: Daniel Kiper 2022-05-24 Samuel Thibault osdep/hurd: Support device entries with @/dev/disk: qualifier Those are used with non-bootstrap disk drivers, for which libstore has to open /dev/disk before calling device_open on it instead of on the device master port. Normally in that case all /dev/ entries also have the @/dev/disk: qualifier, so we can just drop it. Reviewed-by: Daniel Kiper 2022-05-24 Darren Kenny grub-mkimage: Creating aarch64 images from x86 host is broken A recent fix that made appears to have broken the ability to create an aarch64 boot image on a x86-based host. This was due to an overzealous testing of the architecture when building grub-mkimage and removing the code that build an ARM image when not built on ARM. On the occasion remove redundant break. Fixes: 8541f319 (grub-mkimage: Only check aarch64 relocations when built for aarch64) Tested-by: Selva Ganesan Reviewed-by: Daniel Kiper 2022-05-24 Icenowy Zheng grub-install: Allow to install to non-EFI ESP when --force Although the EFI specification enforces support for FAT ESP, it's free for EFI implementations to implement support for ESPs with other formats (e.g. ext4, ntfs, etc), and at least U-Boot EFI will support ext4 ESP if U-Boot is built with ext4 support. In some situations a GRUB installation on such a non-FAT ESP could be useful (e.g. a NTFS-based USB disk that can dual boot a Windows installation media and a Linux LiveCD). As this is advanced and implementation-dependent behavior, let grub-install allow this kind of installation, but only when --force is specified. Reviewed-by: Daniel Kiper 2022-04-26 Qiumiao Zhang net: Fix NULL pointer dereference when parsing ICMP6_ROUTER_ADVERTISE messages During UEFI PXE boot in IPv6 network, if the DHCP server adopts stateful automatic configuration, then the client receives a ICMP6_ROUTER_ADVERTISE multicast message from the server. This may be received without the interface having a configured network address, so orig_inf will be NULL, which can lead to a NULL dereference when creating the default route. Actually, in this case, the client obtains the default route through DHCPv6 instead of RA messages. So if orig_inf == NULL and route_inf == NULL, we should not set the default route. Fixes: https://savannah.gnu.org/bugs/?62072 Reviewed-by: Daniel Kiper 2022-04-26 Glenn Washburn tests: Ensure that loopback devices and zfs devices are cleaned up ZFS file systems are not unmounted using umount, but instead by exporting them. So export the ZFS file system that has the same label as the one that was created during the test, if such one exists. This is required to delete the loopback device that uses the ZFS image file. Otherwise the added code to delete all loopback devices setup during the test run will never be able to finish because the loopback device can not be deleted while in use. Reviewed-by: Daniel Kiper 2022-04-26 Glenn Washburn tests: Ensure that mountpoints are unmounted before exiting When all tests complete successfully, filesystems mounted by grub-fs-tester will be unmounted before exiting. However, on certain test failures the tester will exit with a failure code and not unmount previously mounted filesystems. Now keep track of mounts and umounts and run an exit handler on exit or process interruption that will umount all mounts that haven't already been unmounted. Reviewed-by: Daniel Kiper 2022-04-20 Glenn Washburn docs: Use correct list format Using "*" to prefix list items leads to undesirable display output for at least the generation of the html documentation. Use the @itemize and @item directives to get itemized list output. Also fix some wording and punctuation issues. Reviewed-by: Daniel Kiper 2022-04-20 Glenn Washburn docs: Clarify meaning of "list" and "cond" for "if" and "while" commands respectively It is not clear from the documentation what a "list" is in the context of the "if" command. Note that its a list of simple commands separated by a ";" and that only the exit status of the last command matters. The same is true for the "cond" parameter to the "while" command. Reviewed-by: Daniel Kiper 2022-04-20 Glenn Washburn docs: Add note that drivemap is only available on i386-pc Reviewed-by: Daniel Kiper 2022-04-20 Glenn Washburn tests: Give grub-fs-tester temp directory a better name Instead of "tmp" the name is prefixed by the name of the scripts (e.g. grub-fs-tester). A timestamp is added in the name to allow for easily seeing a chronological sorting of runs and the name of the filesystem being tested. The random component is set to the minimal possible, 3 characters, because the timestamp should provide enough uniqueness. Reviewed-by: Daniel Kiper 2022-04-20 Glenn Washburn tests: Disable blkid cache usage Using the blkid cache can cause issues when running many file system tests in parallel. We do not need it, as its only there to improve performance, and using the cache does not provide significant performance improvements. Reviewed-by: Daniel Kiper 2022-04-20 Glenn Washburn configure: Fix default -O2 being added when CFLAGS not set Autoconf will set a default CFLAGS of "-g -O2" if CFLAGS is not set. CFLAGS was defaulted to "" early in configure to prevent this. A recent commit ad9ccf660 (configure: Fix various new autotools warnings) added AC_USE_SYSTEM_EXTENSIONS, which pulls in the autoconf CFLAGS check, before we default CFLAGS and thus setting the autoconf default for CFLAGS. Move the default setting of CFLAGS to before AC_USE_SYSTEM_EXTENSIONS so that autoconf will see CFLAGS as set and not give it a default. CFLAGS is also moved above AC_CONFIG_AUX_DIR, because CFLAGS should be defaulted to "" as soon as possible to catch any autoconf macros that try to use some other default. Regardless, this currently has no effect as that macro does not consider the CFLAGS variable. Reviewed-by: Robbie Harwood Reviewed-by: Daniel Kiper 2022-04-20 Darren Kenny video/readers/jpeg: Fix possible invalid loop boundary condition The value of next_marker is adjusted based on the word sized value read from data->file. The updated next_marker value should reference a location in the file just beyond the huffman table, and as such should not have a value larger than the size of the file. Fixes: CID 73657 Reviewed-by: Daniel Kiper 2022-04-20 Michael Chang lib/reed_solomon: Fix array subscript 0 is outside array bounds The grub_absolute_pointer() is a compound expression that can only work within a function. We are out of luck here when the pointer variables require global definition due to ATTRIBUTE_TEXT that have to use fully initialized global definition because of the way linkers work. static gf_single_t * const gf_powx ATTRIBUTE_TEXT = (void *) 0x100000; For the reason given above, use GCC diagnostic pragmas to suppress the array-bounds warning. Reviewed-by: Daniel Kiper 2022-04-20 Michael Chang build: Fix -Werror=array-bounds array subscript 0 is outside array bounds The GRUB is failing to build with GCC-12 in many places like this: In function 'init_cbfsdisk', inlined from 'grub_mod_init' at ../../grub-core/fs/cbfs.c:391:3: ../../grub-core/fs/cbfs.c:345:7: error: array subscript 0 is outside array bounds of 'grub_uint32_t[0]' {aka 'unsigned int[]'} [-Werror=array-bounds] 345 | ptr = *(grub_uint32_t *) 0xfffffffc; | ~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This is caused by GCC regression in 11/12 [1]. In a nut shell, the warning is about detected invalid accesses at non-zero offsets to NULL pointers. Since hardwired constant address is treated as NULL plus an offset in the same underlying code, the warning is therefore triggered. Instead of inserting #pragma all over the places where literal pointers are accessed to avoid diagnosing array-bounds, we can try to borrow the idea from Linux kernel that the absolute_pointer() macro [2][3] is used to disconnect a pointer using literal address from it's original object, hence GCC won't be able to make assumptions on the boundary while doing pointer arithmetic. With that we can greatly reduce the code we have to cover up by making initial literal pointer assignment to use the new wrapper but not having to track everywhere literal pointers are accessed. This also makes code looks cleaner. Please note the grub_absolute_pointer() macro requires to be invoked in a function as long as it is compound expression. Some global variables with literal pointers has been changed to local ones in order to use grub_absolute_pointer() to initialize it. The shuffling is basically done in a selective and careful way that the variable's scope doesn't matter being local or global, for example, the global variable must not get modified at run time throughout. For the record, here's the list of global variables got shuffled in this patch: grub-core/commands/i386/pc/drivemap.c:int13slot grub-core/term/i386/pc/console.c:bios_data_area grub-core/term/ns8250.c:serial_hw_io_addr [1] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99578 [2] https://elixir.bootlin.com/linux/v5.16.14/source/include/linux/compiler.h#L180 [3] https://elixir.bootlin.com/linux/v5.16.14/source/include/linux/compiler-gcc.h#L31 Reviewed-by: Daniel Kiper 2022-04-20 Michael Chang util/mkimage: Fix dangling pointer may be used error The warning is real as long as dangling pointer to tmp_ may be used if o32 and o64 are both NULL. However that is not going to happen and can be ignored safely because the PE_OHDR is being used in a context that either o32 or o64 must have been properly initialized. Sadly compiler seems not to always optimize that unused tmp_ away so explicit suppression remain needed here. ../util/mkimage.c: In function 'grub_install_generate_image': ../util/mkimage.c:1422:41: error: dangling pointer to 'tmp_' may be used [-Werror=dangling-pointer=] 1422 | PE_OHDR (o32, o64, header_size) = grub_host_to_target32 (header_size); ../util/mkimage.c:857:28: note: 'tmp_' declared here 857 | __typeof__((o64)->field) tmp_; \ | ^~~~ Reviewed-by: Daniel Kiper 2022-04-20 Chad Kimes net/drivers/efi/efinet: Configure VLAN from UEFI device used for PXE This patch handles automatic configuration of VLAN when booting from PXE on UEFI hardware. Reviewed-by: Daniel Kiper 2022-04-20 Chad Kimes kern/efi/efi: Print VLAN info in EFI device path Reviewed-by: Daniel Kiper 2022-04-20 Chad Kimes net/net: Add net_set_vlan command Previously there was no way to set the 802.1Q VLAN identifier, despite support for vlantag in the net module. The only location vlantag was being populated was from PXE boot and only for Open Firmware hardware. This commit allows users to manually configure VLAN information for any interface. Example usage: grub> net_ls_addr efinet1 00:11:22:33:44:55 192.0.2.100 grub> net_set_vlan efinet1 100 grub> net_ls_addr efinet1 00:11:22:33:44:55 192.0.2.100 vlan100 grub> net_set_vlan efinet1 0 efinet1 00:11:22:33:44:55 192.0.2.100 Reviewed-by: Daniel Kiper 2022-04-20 Chad Kimes net/net: Add vlan information to net_ls_addr output Example output: grub> net_ls_addr efinet1 00:11:22:33:44:55 192.0.2.100 vlan100 Reviewed-by: Daniel Kiper 2022-04-04 Chris Coulson kern/efi/init: Log a console error during a stack check failure The initial implementation of the stack protector just busy looped in __stack_chk_fail in order to reduce the amount of code being executed after the stack has been compromised because of a lack of firmware memory protections. With future firmware implementations incorporating memory protections such as W^X, call in to boot services when an error occurs in order to log a message to the console before automatically rebooting the machine. Reviewed-by: Daniel Kiper 2022-04-04 Alec Brown loader/i386/xnu: Fix uninitialized scalar variable In the function grub_xnu_boot(), struct grub_relocator32_state state is called but isn't being initialized. This results in the members grub_uint32_t ebx, grub_uint32_t ecx, grub_uint32_t edx, grub_uint32_t edi, and grub_uint32_t esi being filled with junk data from the stack since none of them are being set to any values. We can prevent this by setting state to {0}. Fixes: CID 375035 Reviewed-by: Darren Kenny Reviewed-by: Daniel Kiper 2022-04-04 Alec Brown loader/i386/xnu: Fix uninitialized scalar variable In the function grub_xnu_boot_resume(), struct grub_relocator32_state state is called but isn't being initialized. This results in the members grub_uint32_t ebx, grub_uint32_t ecx, grub_uint32_t edx, grub_uint32_t esi, and grub_uint32_t edi being filled with junk data from the stack since none of them are being set to any values. We can prevent this by setting state to {0}. Fixes: CID 375031 Reviewed-by: Darren Kenny Reviewed-by: Daniel Kiper 2022-04-04 Alec Brown loader/i386/pc/linux: Fix uninitialized scalar variable In the function grub_linux16_boot(), struct grub_relocator16_state state is called but isn't being initialized. This results in the members grub_uint32_t ebx, grub_uint32_t edx, grub_uint32_t esi, and grub_uint32_t ebp being filled with junk data from the stack since none of them are being set to any values. We can prevent this by setting state to {0}. Fixes: CID 375028 Reviewed-by: Darren Kenny Reviewed-by: Daniel Kiper 2022-04-04 Alec Brown loader/i386/bsd: Fix uninitialized scalar variable In the function grub_netbsd_setup_video(), struct grub_netbsd_btinfo_framebuf params is called but isn't being initialized. The member grub_uint8_t reserved[16] isn't set to any values and is instead filled with junk data from the stack. We can prevent this by setting params to {0}. Fixes: CID 375026 Reviewed-by: Darren Kenny Reviewed-by: Daniel Kiper 2022-04-04 Alec Brown net/net: Fix uninitialized scalar variable In the function grub_net_ipv6_get_link_local(), grub_net_network_level_address_t addr is called but isn't being initialized. This results in the member grub_dns_option_t option being filled with junk data from the stack. We can prevent this by setting the option member in addr to 0. Fixes: CID 375033 Reviewed-by: Darren Kenny Reviewed-by: Daniel Kiper 2022-04-04 Alec Brown net/bootp: Fix uninitialized scalar variable In the function grub_net_configure_by_dhcp_ack(), grub_net_network_level_address_t addr is called but isn't being initialized. This results in the member grub_dns_option_t option being filled with junk data from the stack. To prevent this, we can set the option member in addr to 0. Fixes: CID 375036 Reviewed-by: Darren Kenny Reviewed-by: Daniel Kiper 2022-04-04 Alec Brown net/arp: Fix uninitialized scalar variable In the function grub_net_arp_receive(), grub_net_network_level_address_t sender_addr and target_addr are being called but aren't being initialized. In both of these structs, each member is being set to a value except for grub_dns_option_t option. This results in this member being filled with junk data from the stack. To prevent this, we can set the option member in both structs to 0. Fixes: CID 375030 Reviewed-by: Darren Kenny Reviewed-by: Daniel Kiper 2022-04-04 Glenn Washburn net/tcp: Only call grub_get_time_ms() when there are sockets to potentially retransmit for If the machine has network cards found, but there are no tcp open sockets (because the user doesn't use the network to boot), then grub_net_tcp_retransmit() should be a noop. Thus GRUB doesn't need to call grub_get_time_ms(), which does a call into firmware on powerpc-ieee1275, and probably other targets. So only call grub_get_time_ms() if there are tcp sockets. Aside from improving performance, its also useful to stay out of the firmware as much as possible when debugging via QEMU because its a pain to get back in to GRUB execution. grub_net_tcp_retransmit() can get called very frequently via grub_net_poll_cards_idle() when GRUB is waiting for a keypress (grub_getkey_noblock() calls grub_net_poll_cards_idle()). This can be annoying when debugging an issue in GRUB on PowerPC in QEMU with GDB when GRUB is waiting for a keypress because interrupting via GDB nearly always lands in the OpenBIOS firmware's milliseconds call. Reviewed-by: Daniel Kiper 2022-04-04 Glenn Washburn net/net: Avoid unnecessary calls to grub_net_tcp_retransmit() In grub_net_poll_cards_idle_real(), only call grub_net_tcp_retransmit() if there are network cards found. If there are no network card found, there can be no tcp sockets to transmit on. So no need to go through that logic. Reviewed-by: Daniel Kiper 2022-04-04 Glenn Washburn net/net: Unset grub_net_poll_cards_idle when net module has been unloaded This looks like it was a copy/paste error. If the net module is unloaded, grub_net_poll_cards_idle should be NULL so that GRUB does not try to call a function which now doesn't exist. Reviewed-by: Daniel Kiper 2022-04-04 Glenn Washburn INSTALL: Add information on using --build when cross-compiling The autoconf 2.65 manual [1] strongly recommends specifying the --build option when the --host is used. Add this to the example and add a note that this is recommended. [1] https://www.gnu.org/software/autoconf/manual/autoconf-2.65/html_node/Hosts-and-Cross_002dCompilation.html Reviewed-by: Daniel Kiper 2022-04-04 Glenn Washburn configure: Whitespace changes to improve readability Reviewed-by: Daniel Kiper 2022-04-04 Glenn Washburn configure: Remove unused CFLAGS definitions These CFLAGS definitions are reset below them before they have a change to affect anything. The exception is the *-emu case, which is put in the next if block, which is the only place its used before getting reset. Reviewed-by: Daniel Kiper 2022-04-04 Glenn Washburn configure: Remove dead code It appears as though the intent of this code is to define abort() and main() symbols for some configure tests. However, it never gets used because the if is only entered when not building for *-emu, but the next if block only runs when building for *-emu. And the if block after that unconditionally resets CFLAGS. So this code can have no effect. Additionally, s/aclocal.m4/acinclude.m4/ and move grub_ASM_USCORE to put with other marcos defined in acinclude.m4. Reviewed-by: Daniel Kiper 2022-04-04 Glenn Washburn configure: Sort AM_CONDITIONALs alphabetically Reviewed-by: Daniel Kiper 2022-04-04 Glenn Washburn configure: Allow HOST_CC to override CC According to the INSTALL, "The HOST_* variables override not prefixed variables". This change makes it so, instead of previous behavior, which was to ignore the HOST_CC environment variable. Reviewed-by: Daniel Kiper 2022-04-04 Glenn Washburn gdb: Add malloc and free symbols to kernel.exec to improve gdb functionality Add linker flags when linking kernel.exec to have malloc and free point to grub_malloc() and grub_free() respectively. Some gdb functionality depends on gdb locating the symbols "malloc" and "free", such as dynamically creating strings for arguments to injected function calls. A trivial example would the gdb command 'p strlen("astring")'. Make sure not to do this on emu platforms, or an infinite loop occurs because emu has a special grub_malloc() that calls malloc(). Reviewed-by: Daniel Kiper 2022-04-04 Renaud Métrich commands/search: Add new --efidisk-only option for EFI systems When using "search" on EFI systems, we sometimes want to exclude devices that are not EFI disks, e.g. md, lvm. This is typically used when wanting to chainload when having a software raid (md) for EFI partition: with no option, "search --file /EFI/redhat/shimx64.efi" sets root envvar to "md/boot_efi" which cannot be used for chainloading since there is no effective EFI device behind. Reviewed-by: Daniel Kiper 2022-04-04 Renaud Métrich commands/search: Refactor --no-floppy option to have something generic Reviewed-by: Daniel Kiper 2022-04-04 Hans de Goede kern/main: Suppress the "Welcome to GRUB!" message in EFI builds GRUB EFI builds are now often used in combination with flicker-free boot, but this breaks with upstream GRUB because the "Welcome to GRUB!" message will kick the EFI fb into text mode and show the msg, breaking the flicker-free experience. EFI systems are so fast, that when the menu or the countdown are enabled the message will be immediately overwritten, so in these cases not printing the message does not matter. And in case when the timeout_style is set to TIMEOUT_STYLE_HIDDEN, the user has asked GRUB to be quiet (for example to allow flickfree boot) and thus the message should not be printed. Reviewed-by: Robbie Harwood Reviewed-by: Daniel Kiper 2022-04-04 Hans de Goede normal/menu: Don't show "Booting `%s'" msg when auto-booting with TIMEOUT_STYLE_HIDDEN When the user has asked the menu code to be hidden/quiet and the current entry is being autobooted because the timeout has expired don't show the "Booting `%s'" msg. This is necessary to let flicker-free boots really be flicker free, otherwise the "Booting `%s'" msg will kick the EFI fb into text mode and show the msg, breaking the flicker-free experience. Reviewed-by: Robbie Harwood Reviewed-by: Daniel Kiper 2022-03-21 Hans de Goede term/efi/console: Do not set cursor until the first text output To allow flickerfree boot the EFI console code does not call grub_efi_set_text_mode(1) until some text is actually output. Depending on if the output text is because of an error loading, e.g. the .cfg file, or because of showing the menu the cursor needs to be on or off when the first text is shown. So far the cursor was hardcoded to being on, but this is causing drawing artifacts + slow drawing of the menu as reported here: https://bugzilla.redhat.com/show_bug.cgi?id=1946969 Handle the cursorstate in the same way as the colorstate to fix this, when no text has been output yet, just cache the cursorstate and then use the last set value when the first text is output. Fixes: 2d7c3abd871f (efi/console: Do not set text-mode until we actually need it) Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=1946969 Reviewed-by: Daniel Kiper 2022-03-21 Hans de Goede term/efi/console: Do not set colorstate until the first text output GRUB_MOD_INIT(normal) does an unconditional: grub_env_set ("color_normal", "light-gray/black"); which triggers a grub_term_setcolorstate() call. The original version of the "efi/console: Do not set text-mode until we actually need it" patch, https://lists.gnu.org/archive/html/grub-devel/2018-03/msg00125.html, protected against this by caching the requested state in grub_console_setcolorstate() and then only applying it when the first text output actually happens. During refactoring to move the grub_console_setcolorstate() up higher in the grub-core/term/efi/console.c file the code to cache the color-state + bail early was accidentally dropped. Restore the cache the color-state + bail early behavior from the original. Fixes: 2d7c3abd871f (efi/console: Do not set text-mode until we actually need it) Cc: Javier Martinez Canillas Reviewed-by: Daniel Kiper 2022-03-21 Darren Kenny kern/rescue_parser: Ensure that parser allocated memory is not leaked While it would appear unlikely that the memory allocated in *argv in grub_parser_split_cmdline() would be leaked, we should try ensure that it doesn't leak by calling grub_free() before we return from grub_rescue_parse_line(). To avoid a possible double-free, grub_parser_split_cmdline() is being changed to assign *argv = NULL when we've called grub_free() in the fail section. Fixes: CID 96680 Reviewed-by: Daniel Kiper 2022-03-21 Darren Kenny grub-mkimage: Only check aarch64 relocations when built for aarch64 Coverity flagged the switch checks for R_AARCH64_* as being logically dead code, since it could never happen on x86 due to the masking of the values earlier in the code. A check for building on __arm__ (which gcc and clang define) and for MKIMAGE_ELF64 (which GRUB defines) has been added to avoid this dead code being built in. Fixes: CID 158599 Reviewed-by: Daniel Kiper 2022-03-21 Daniel Kiper lib/posix_wrap/errno.h: Add __set_errno() macro $ ./configure --target=x86_64-w64-mingw32 --with-platform=efi --host=x86_64-w64-mingw32 $ make [...] cat syminfo.lst | sort | gawk -f ./genmoddep.awk > moddep.lst || (rm -f moddep.lst; exit 1) __imp__errno in regexp is not defined This happens because grub-core/lib/gnulib/malloc/dynarray_resize.c and grub-core/lib/gnulib/malloc/dynarray_emplace_enlarge.c (both are used by regexp module) from the latest Gnulib call __set_errno() which originally sets errno variable (Windows builds add __imp__ prefix). Of course it is not defined and grub_errno should be used instead. Reviewed-by: Daniel Kiper 2022-03-21 Robbie Harwood configure: Fix various new autotools warnings Reviewed-by: Daniel Kiper 2022-03-21 Robbie Harwood gnulib: Handle warnings introduced by updated gnulib - Fix type of size variable in luks2_verify_key() - Avoid redefinition of SIZE_MAX and ATTRIBUTE_ERROR - Work around gnulib's int types on older compilers Reviewed-by: Daniel Kiper 2022-03-21 Robbie Harwood gnulib: Update gnulib version and drop most gnulib patches In addition to the changes carried in our gnulib patches, several Coverity and code hygiene fixes that were previously downstream are also included in this 3-year gnulib increment. Unfortunately, fix-width.patch is retained. Bump minimum autoconf version from 2.63 to 2.64 and automake from 1.11 to 1.14, as required by gnulib. Sync bootstrap script itself with gnulib. Update regexp module for new dynarray dependency. Reviewed-by: Daniel Kiper 2022-03-21 Robbie Harwood gnulib: Drop no-abort.patch Originally added in commit db7337a3d (grub-core/lib/posix_wrap/stdlib.h (abort): Removed), this patched out all relevant invocations of abort() in gnulib. While it was not documented why at the time, testing suggests that there's no abort() implementation available for gnulib to use. gnulib's position is that the use of abort() is correct here, since it happens when input violates a "shall" from POSIX. Additionally, the code in question is probably not reachable. Since abort() is more friendly to user-space, they prefer to make no change, so we can just carry a define instead (suggested by Paul Eggert). Reviewed-by: Daniel Kiper 2022-03-21 Robbie Harwood gnulib: Drop fix-base64.patch Originally added in commit 9fbdec2f (bootstrap: Add gnulib's base64 module) and subsequently modified in commit 552c9fd08 (gnulib: Fix build of base64 when compiling with memory debugging), fix-base64.patch handled two problems we have using gnulib, which are exercised by the base64 module but not directly caused by it. First, GRUB defines its own bool type, while gnulib expects the equivalent of stdbool.h to be present. Rather than patching gnulib, instead use gnulib's stdbool module to provide a bool type if needed (suggested by Simon Josefsson). Second, our config.h doesn't always inherit config-util.h, which is where gnulib-related options like _GL_ATTRIBUTE_CONST end up. fix-base64.h worked around this by defining the attribute away, but this workaround is better placed in config.h itself, not a gnulib patch. Reviewed-by: Daniel Kiper 2022-03-21 Robbie Harwood config: Where present, ensure config-util.h precedes config.h gnulib defines go in config-util.h, and we need to know whether to provide duplicates in config.h or not. Reviewed-by: Daniel Kiper 2022-03-21 Robbie Harwood config.h.in: Use visual indentation Reviewed-by: Daniel Kiper 2022-03-14 Robbie Harwood INSTALL: Drop mention of libusb The commit 9d25b0da9 (Remove emu libusb support.) dropped use of libusb, but did not remove mention of it from INSTALL file. Reviewed-by: Daniel Kiper 2022-03-14 Daniel Kiper INSTALL: Add more cross-compiling Debian packages The mingw-w64-tools is especially important because with out it some Windows builds may fail due to lack of proper pkg-config. Reviewed-by: Robbie Harwood 2022-03-14 Daniel Kiper configure: Drop ${grub_coredir} unneeded references These are probably stray references left after earlier removals. Reviewed-by: Robbie Harwood 2022-03-14 Daniel Kiper conf/i386-cygwin-img-ld: Do not discard .data and .edata sections $ ./configure --target=i686-w64-mingw32 --with-platform=efi --host=i686-w64-mingw32 [...] checking if __bss_start is defined by the compiler... no checking if edata is defined by the compiler... no checking if _edata is defined by the compiler... no configure: error: none of __bss_start, edata or _edata is defined This happens on machines with quite recent ld due to an error: `edata' referenced in section `.text' of /tmp/cc72w9E4.o: defined in discarded section `.data' of conftest.exe collect2: error: ld returned 1 exit status So, we have to tell linker to not discard .data and .edata sections. The trick comes from ld documentation: 3.6.7 Output Section Discarding The linker will not normally create output sections with no contents. This is for convenience when referring to input sections that may or may not be present in any of the input files. For example: .foo : { *(.foo) } will only create a ‘.foo’ section in the output file if there is a ‘.foo’ section in at least one input file, and if the input sections are not all empty. Other link script directives that allocate space in an output section will also create the output section. So too will assignments to dot even if the assignment does not create space, except for ‘. = 0’, ‘. = . + 0’, ‘. = sym’, ‘. = . + sym’ and ‘. = ALIGN (. != 0, expr, 1)’ when ‘sym’ is an absolute symbol of value 0 defined in the script. This allows you to force output of an empty section with ‘. = .’. This change does not impact generated binaries because the conf/i386-cygwin-img-ld.sc linker script is used only when you run configure. Reviewed-by: Robbie Harwood 2022-03-14 Daniel Kiper commands/i386/pc/sendkey: Fix "writing 1 byte into a region of size 0" build error Latest GCC may complain in that way: commands/i386/pc/sendkey.c: In function ‘grub_sendkey_postboot’: commands/i386/pc/sendkey.c:223:21: error: writing 1 byte into a region of size 0 [-Werror=stringop-overflow=] 223 | *((char *) 0x41a) = 0x1e; | ~~~~~~~~~~~~~~~~~~^~~~~~ The volatile keyword addition helps and additionally assures us the compiler will not optimize out fixed assignments. Reviewed-by: Robbie Harwood 2022-03-14 Daniel Kiper loader/i386/bsd: Initialize ptr variable in grub_bsd_add_meta() Latest GCC may complain in that way: In file included from ../include/grub/disk.h:31, from ../include/grub/file.h:26, from ../include/grub/loader.h:23, from loader/i386/bsd.c:19: loader/i386/bsd.c: In function ‘grub_cmd_openbsd’: ../include/grub/misc.h:71:10: error: ‘ptr’ may be used uninitialized in this function [-Werror=maybe-uninitialized] 71 | return grub_memmove (dest, src, n); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ loader/i386/bsd.c:266:9: note: ‘ptr’ was declared here 266 | void *ptr; | ^~~ So, let's fix it by assigning NULL to ptr in grub_bsd_add_meta(). Reviewed-by: Robbie Harwood 2022-03-14 Daniel Kiper osdep/windows/platform: Disable gcc9 -Waddress-of-packed-member $ ./configure --target=x86_64-w64-mingw32 --with-platform=efi --host=x86_64-w64-mingw32 $ make [...] In file included from grub-core/osdep/platform.c:4: grub-core/osdep/windows/platform.c: In function ‘grub_install_register_efi’: grub-core/osdep/windows/platform.c:382:41: error: taking address of packed member of ‘struct grub_efi_file_path_device_path’ may result in an unaligned pointer value [-Werror=address-of-packed-member] 382 | path16_len = grub_utf8_to_utf16 (filep->path_name, | ~~~~~^~~~~~~~~~~ Disable the -Wadress-of-packaed-member diagnostic for grub_utf8_to_utf16() call which contains filep->path_name reference. It seems safe because the structure is defined according to the UEFI spec and we hope authors did not make any mistake... :-) This fix is similar to the fix in the commit 8e8723a6b (f2fs: Disable gcc9 -Waddress-of-packed-member). Reviewed-by: Robbie Harwood 2022-03-14 Glenn Washburn po: Un-transliterate the %zu format code Commit 45bffae13 (util/resolve: Bail with error if moddep.lst file line is too long) uses the %zu format specifier which has not been used in any translated strings yet. So the sed scripts used for transliterating certain languages need to be updated otherwise creation of the message indexes will fail on an unknown format code. This is essentially the same issue fixed for the %m format code in commit 2e246b6f (po: Fix replacement of %m in sed programs). Also reorder transliteration lines to be more lexicographically ordered. Reviewed-by: Daniel Kiper 2022-03-14 Daniel Axtens net: Check against nb->tail in grub_netbuff_pull() GRUB netbuff structure members track 2 different things: the extent of memory allocated for the packet, and the extent of memory currently being worked on. This works out in the structure as follows: nb->head: beginning of the allocation nb->data: beginning of the working data nb->tail: end of the working data nb->end: end of the allocation The head and end pointers are set in grub_netbuff_alloc() and do not change. The data and tail pointers are initialised to point at start of the allocation (that is, head == data == tail initially), and are then manipulated by grub_netbuff_*() functions. Key functions are as follows: - grub_netbuff_put(): "put" more data into the packet - advance nb->tail - grub_netbuff_unput(): trim the tail of the packet - retract nb->tail - grub_netbuff_pull(): "consume" some packet data - advance nb->data - grub_netbuff_reserve(): reserve space for future headers - advance nb->data and nb->tail - grub_netbuff_push(): "un-consume" data to allow headers to be written - retract nb->data Each of those functions does some form of error checking. For example, grub_netbuff_put() does not allow nb->tail to exceed nb->end, and grub_netbuff_push() does not allow nb->data to be before nb->head. However, grub_netbuff_pull()'s error checking is a bit weird. It advances nb->data and checks that it does not exceed nb->end. That allows you to get into the situation where nb->data > nb->tail, which should not be. Make grub_netbuff_pull() check against both nb->tail and nb->end. In theory just checking against ->tail should be sufficient but the extra check should be cheap and seems like good defensive practice. Reviewed-by: Daniel Kiper 2022-03-14 Fabian Vogt grub-mount: Add support for libfuse3 The libfuse 3.0.0 got released in 2016, with some API changes compared to 2.x. This commit introduces support for 3.x while keeping it compatible with 2.6 as a fallback still. To detect fuse3, switch configure over to use pkg-config, which is simpler yet more reliable than looking for library and header manually. Also set FUSE_USE_VERSION that way, as it depends on the used libfuse version. Now that the CFLAGS are read from pkg-config, use just , which works with 2.x as well as 3.x and is recommended by libfuse upstream. One behavior change of libfuse3 is that FUSE_ATOMIC_O_TRUNC is set by default, which means that open with O_TRUNC is passed as-is instead of calling the truncate operation. With libfuse2, truncate failed with -ENOSYS and that was returned to the application. To make O_TRUNC fail with libfuse3, return -EROFS explicitly if writing was requested. Reviewed-by: Daniel Kiper 2022-03-14 Elyes Haouas include: Remove trailing whitespaces Reviewed-by: Daniel Kiper util: Remove trailing whitespaces Reviewed-by: Daniel Kiper video: Remove trailing whitespaces Reviewed-by: Daniel Kiper tests: Remove trailing whitespaces Reviewed-by: Daniel Kiper term: Remove trailing whitespaces Reviewed-by: Daniel Kiper script: Remove trailing whitespaces Reviewed-by: Daniel Kiper partmap: Remove trailing whitespaces Reviewed-by: Daniel Kiper osdep: Remove trailing whitespaces Reviewed-by: Daniel Kiper normal: Remove trailing whitespaces Reviewed-by: Daniel Kiper net: Remove trailing whitespaces Reviewed-by: Daniel Kiper loader: Remove trailing whitespaces Reviewed-by: Daniel Kiper lib: Remove trailing whitespaces Reviewed-by: Daniel Kiper kern: Remove trailing whitespaces Reviewed-by: Daniel Kiper io: Remove trailing whitespaces Reviewed-by: Daniel Kiper gfxmenu: Remove trailing whitespaces Reviewed-by: Daniel Kiper gfxmenu: Remove trailing whitespaces Reviewed-by: Daniel Kiper fs: Remove trailing whitespaces Reviewed-by: Daniel Kiper font: Remove trailing whitespaces Reviewed-by: Daniel Kiper disk: Remove trailing whitespaces Reviewed-by: Daniel Kiper commands: Remove trailing whitespaces Reviewed-by: Daniel Kiper bus: Remove trailing whitespaces Reviewed-by: Daniel Kiper 2022-03-07 Chad Kimes net/ethernet: Fix VLAN networking on little-endian systems VLAN configuration seems to have never worked on little-endian systems. This is likely because VLANTAG_IDENTIFIER is not byte-swapped before copying into the net buffer, nor is inf->vlantag. We can resolve this by using grub_cpu_to_be16{_compile_time}() and its inverse when copying VLAN info to/from the net buffer. Reviewed-by: Daniel Kiper 2022-03-07 Heinrich Schuchardt commands/efi/lsefisystab: Short text EFI_IMAGE_SECURITY_DATABASE_GUID The EFI_IMAGE_SECURITY_DATABASE_GUID is used for the image execution information table (cf. UEFI specification 2.9, 32.5.3.1 Using The Image Execution Information Table). The lsefisystab command is used to display installed EFI configuration tables. Currently it only shows the GUID but not a short text for the table. Provide a short text for the EFI_IMAGE_SECURITY_DATABASE_GUID. Reviewed-by: Daniel Kiper 2022-03-07 Glenn Washburn tests: Fix whitespace formatting Reviewed-by: Daniel Kiper 2022-03-07 Peter Jones ChangeLog: Retire ChangeLog-2015 ChangeLog-2015 has been untouched for over 7 years now, and any information in it is purely for historical purposes. At the same time, grepping for code winds up matching this file quite a bit, almost never accomplishing anything other than cluttering up your grep results. We don't need this in the main repo, and "git show" will find it if you're looking at the old history of commits on some file. This patch deletes it and the Makefile.am rule to distribute it. Reviewed-by: Daniel Axtens Reviewed-by: Robbie Harwood Reviewed-by: Javier Martinez Canillas Reviewed-by: Daniel Kiper 2022-03-07 Peter Levine templates: Properly handle multiple initrd paths in 30_os-prober os-prober now effectively handles multiple paths passed to initrd, but grub-mkconfig still truncates off any subsequent space-delimited paths. Support proper parsing of space-delimited initrd paths passed from os-prober for distributions, like Manjaro, that require it. Fixes: https://savannah.gnu.org/bugs/?47681 Reviewed-by: Daniel Kiper 2022-03-07 Samuel Thibault templates: Add support for pci-arbiter and rumpdisk on Hurd This adds pci-arbiter and rumpdisk as bootstrap modules whenever they are available. This opens the path for fully-userland disk support. Reviewed-by: Daniel Kiper 2022-03-07 Glenn Washburn mm: Temporarily disable grub_mm_debug while calling grub_vprintf() in grub_printf() To prevent infinite recursion when grub_mm_debug is on, disable it when calling grub_vprintf(). One such call loop is: grub_vprintf() -> parse_printf_args() -> parse_printf_arg_fmt() -> grub_debug_calloc() -> grub_printf() -> grub_vprintf(). Reviewed-by: Daniel Kiper 2022-03-07 Glenn Washburn mm: Export grub_mm_dump() and grub_mm_dump_free() These functions may be useful within modules as well. Export them so that modules can use them. Reviewed-by: Daniel Kiper 2022-03-07 Glenn Washburn configure: Properly handle MM_DEBUG Define MM_DEBUG in config.h when --enable-mm-debug is passed to configure. It was being defined in config-util.h which only gets used when building GRUB utilities for the host side. The enabling of debugging for memory management in include/grub/mm.h explicitly does not happen when compiling for the GRUB utilities. So this debugging code effectively could never be enabled. Note, that MM_DEBUG is defined in an #if directive because the enabling of debugging checks if MM_DEBUG is defined, not what its value is. So even if MM_DEBUG were defined to nothing, the debugging code would still be enabled. Reviewed-by: Daniel Kiper 2022-03-07 Fangrui Song configure: Replace -Wl,-r,-d with -Wl,-r and add -fno-common In GNU ld and ld.lld, -d is used with -r to allocate space to COMMON symbols. This behavior is presumably to work around legacy projects which inspect relocatable output by themselves and do not handle COMMON symbols. The GRUB does not do this. See https://github.com/llvm/llvm-project/issues/53660 -d is quite useless and ld.lld 15.0.0 will make -d no-op. COMMON symbols have special symbol resolution semantics which can cause surprise (see https://maskray.me/blog/2022-02-06-all-about-common-symbols). GCC<10 and Clang<11 defaulted to -fcommon. Just use -fno-common to avoid COMMON symbols. Reviewed-by: Daniel Kiper 2022-03-07 Glenn Washburn tests: Add check-native and check-nonnative make targets This allows for testing only tests that run directly on the build machine or only tests that run in a virtualized environment. When testing multiple targets on the same build machine the native tests only need to be run once for all targets. Whereas, the nonnative tests must be run for each target because the test is potentially compiled differently for each target. Reviewed-by: Daniel Kiper 2022-03-07 Renaud Métrich commands/search: Fix bug stopping iteration when --no-floppy is used When using --no-floppy and a floppy was encountered, iterate_device() was returning 1, causing the iteration to stop instead of continuing. Reviewed-by: Daniel Kiper 2022-03-07 Glenn Washburn Revert "iee1275/datetime: Fix off-by-1 error." This is causing the test grub_cmd_date() to fail because the returned date is one day more than it should be. This reverts commit 607d66116 (iee1275/datetime: Fix off-by-1 error.). Tested-by: Daniel Axtens Reviewed-by: Daniel Kiper 2022-02-08 Glenn Washburn tests: Remove $((BASE#NUM)) bashism in grub-fs-tester This bashism allows converting NUM in base BASE to decimal. Its not needed because the only place its used is to convert from hexidecimal and this can also be done with the more portable $((0xHEXNUM)) syntax. Reviewed-by: Daniel Kiper 2022-02-08 Glenn Washburn tests: Skip pata_test on i386-efi In comparison to other i386 targets, on i386-efi the Q35 QEMU machine type is used to do the testing to be able to make use of the EFI firmware in QEMU. On the Q35 machine type there is no way to use ATA to communicate with an IDE, only AHCI. Reviewed-by: Daniel Kiper 2022-02-08 Glenn Washburn tests: Do not remove image file on error in pata_test The image file can be useful in debugging an issue when the test fails. Reviewed-by: Daniel Kiper 2022-02-08 Alec Brown util/grub-module-verifierXX: Validate elf section header table index for section name string table In grub-module-verifierXX.c, the function find_section() uses the value from grub_target_to_host16 (e->e_shstrndx) to obtain the section header table index of the section name string table, but it wasn't being checked if the value was there. According to the elf(5) manual page, "If the index of section name string table section is larger than or equal to SHN_LORESERVE (0xff00), this member holds SHN_XINDEX (0xffff) and the real index of the section name string table section is held in the sh_link member of the initial entry in section header table. Otherwise, the sh_link member of the initial entry in section header table contains the value zero." Since this check wasn't being made, the function get_shstrndx() is being added to make this check and use e_shstrndx if it doesn't have SHN_XINDEX as a value, else use sh_link. We also need to make sure e_shstrndx isn't greater than or equal to SHN_LORESERVE and sh_link isn't less than SHN_LORESERVE. Note that it may look as though the argument *arch isn't being used, it's actually required in order to use the macros grub_target_to_host*(x) which are unwinded to grub_target_to_host*_real(arch, (x)) based on defines earlier in the file. Reviewed-by: Darren Kenny Reviewed-by: Daniel Kiper 2022-02-08 Alec Brown util/grub-module-verifierXX: Validate number of elf section header table entries In grub-module-verifierXX.c, grub_target_to_host16 (e->e_shnum) is used to obtain the number of section header table entries, but it wasn't being checked if the value was there. According to the elf(5) manual page, "If the number of entries in the section header table is larger than or equal to SHN_LORESERVE (0xff00), e_shnum holds the value zero and the real number of entries in the section header table is held in the sh_size member of the intial entry in section header table. Otherwise, the sh_size member of the initial entry in the section header table holds the value zero." Since this check wasn't being made, the function get_shnum() is being added to make this check and use whichever member doesn't have a value of zero. If both are zero, then we must return an error. We also need to make sure that e_shnum doesn't have a value greater than or equal to SHN_LORESERVE and sh_size isn't less than SHN_LORESERVE. Note that it may look as though the argument *arch isn't being used, it's actually required in order to use the macros grub_target_to_host*(x) which are unwinded to grub_target_to_host*_real(arch, (x)) based on defines earlier in the file. Fixes: CID 314021 Fixes: CID 314027 Fixes: CID 314033 Reviewed-by: Darren Kenny Reviewed-by: Daniel Kiper 2022-02-08 Alec Brown util/grub-module-verifierXX: Add function to calculate section headers Added the function get_shdr() which returns the section header at a given index parameter passed into this function. This helps traverse the section header table and reduces repeated calls to lengthy equations used to obtain section headers. Note that it may look as though the argument *arch isn't being used, it's actually required in order to use the macros grub_target_to_host*(x) which are unwinded to grub_target_to_host*_real(arch, (x)) based on defines earlier in the file. Reviewed-by: Darren Kenny Reviewed-by: Daniel Kiper 2022-02-08 Alec Brown fs/affs: Fix resource leaks In commit 178ac5107389 (affs: Fix memory leaks), fixes were made to grub_affs_iterate_dir() to prevent memory leaks from occurring after it returns without freeing node. However, there were still some instances where node was causing a memory leak when the function returns after calling grub_affs_create_node(). In this function, new memory is allocated to node but doesn't get freed until the hook() function is called near the end. Before hook() is called, node should be freed in grub_affs_create_node() before returning out of it. Fixes: 178ac5107389 (affs: Fix memory leaks) Fixes: CID 73759 Reviewed-by: Darren Kenny Reviewed-by: Daniel Kiper 2022-02-08 Heinrich Schuchardt RISC-V: Adjust -march flags for binutils 2.38 As of version 2.38 binutils defaults to ISA specification version 2019-12-13. This version of the specification has has separated the the csr read/write (csrr*/csrw*) instructions and the fence.i from the I extension and put them into separate Zicsr and Zifencei extensions. This implies that we have to adjust the -march flag passed to the compiler accordingly. Reviewed-by: Daniel Kiper 2022-02-08 Heinrich Schuchardt efi: Correct struct grub_efi_boot_services The UEFI specification defines that the EFI_BOOT_SERVICES.Exit(() service may return EFI_SUCCESS or EFI_INVALID_PARAMETER. So it cannot be __attribute__((noreturn)). Reviewed-by: Daniel Kiper 2022-02-08 Glenn Washburn conf/Makefile.common: Order alphabetically variables Reviewed-by: Daniel Kiper 2022-02-08 Stephen Balousek net/http: Allow use of non-standard TCP/IP ports Allow the use of HTTP servers listening on ports other 80. This is done with an extension to the http notation: (http[,server[,port]]) - or - (http[,server[:port]]) Reviewed-by: Daniel Kiper 2022-02-08 Glenn Washburn Makefile: Only look for @MARKER@ at the start of a line when generating libgrub_a_init.lst Under certain conditions libgrub.pp gets generated with a such that it contains a bunch of CPP defines, at least one of which contains "@MARKER@". This line should not be used when generating libgrub_a_init.lst, otherwise we get compiler errors like: libgrub_a_init.c:22:18: error: stray ‘#’ in program 22 | extern void grub_#define_init (void); | ^ libgrub_a_init.c:22:19: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘define_init’ 22 | extern void grub_#define_init (void); | ^~~~~~~~~~~ libgrub_a_init.c:23:18: error: stray ‘#’ in program 23 | extern void grub_#define_fini (void); | ^ libgrub_a_init.c:23:19: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘define_fini’ 23 | extern void grub_#define_fini (void); | ^~~~~~~~~~~ ... When generating libgrub_a_init.lst only lines starting with "@MARKER@" are desired. Reviewed-by: Daniel Kiper 2022-02-08 Glenn Washburn gentpl.py: Fix issue where sometimes marker files have CPP defines When generating video.lst, modules whose marker file contains the string VIDEO_LIST_MARKER are selected. But when the marker file contains the CPP defines, one of the defines is VIDEO_LIST_MARKER and is present in all marker files, so they are all selected. By removing the defines, the correct modules are selected. Reviewed-by: Daniel Kiper 2022-02-08 Glenn Washburn util/resolve: Bail with error if moddep.lst file line is too long The code reads each line into a buffer of size 1024 and does not check if the line is longer. So a line longer than 1024 will be read as a valid line followed by an invalid line. Then an error confusing to the user is sent with the test "invalid line format". But the line format is perfectly fine, the problem is in GRUB's parser. Check if we've hit a line longer than the size of the buffer, and if so send a more correct and reasonable error. Reviewed-by: Daniel Kiper 2022-02-08 Glenn Washburn util/resolve: Do not read past the end of the array in read_dep_list() If the last non-NULL byte of "buf" is not a white-space character (such as when a read line is longer than the size of "buf"), then "p" will eventually point to the byte after the last byte in "buf". After which "p" will be dereferenced in the while conditional leading to an out of bounds read. Make sure that "p" is inside "buf" before dereferencing it. Reviewed-by: Daniel Kiper 2022-02-07 Glenn Washburn kern/misc: Allow selective disabling of debug facility names Sometimes you only know which debug logging facility names you want to turn off, not necessarily all the ones you want enabled. This patch allows the debug string to contain facility names in the $debug variable which are prefixed with a "-" to disable debug log messages for that conditional. Say you want all debug logging on except for btrfs and scripting, then do: "set debug=all,-btrfs,-scripting" Note, that only the last occurrence of the facility name with or without a leading "-" is considered. So simply appending ",-facilityname" to the $debug variable will disable that conditional. To illustrate, the command "set debug=all,-btrfs,-scripting,btrfs" will enable btrfs. Also, add documentation explaining this new behavior. Reviewed-by: Daniel Kiper 2022-02-07 Glenn Washburn cryptodisk: Fix Coverity use after free bug The Coverity output is: *** CID 366905: Memory - illegal accesses (USE_AFTER_FREE) /grub-core/disk/cryptodisk.c: 1064 in grub_cryptodisk_scan_device_real() 1058 cleanup: 1059 if (askpass) 1060 { 1061 cargs->key_len = 0; 1062 grub_free (cargs->key_data); 1063 } >>> CID 366905: Memory - illegal accesses (USE_AFTER_FREE) >>> Using freed pointer "dev". 1064 return dev; 1065 } 1066 1067 #ifdef GRUB_UTIL 1068 #include 1069 grub_err_t Here the "dev" variable can point to a freed cryptodisk device if the function grub_cryptodisk_insert() fails. This can happen only on a OOM condition, but when this happens grub_cryptodisk_insert() calls grub_free on the passed device. Since grub_cryptodisk_scan_device_real() assumes that grub_cryptodisk_insert() is always successful, it will return the device, though the device was freed. Change grub_cryptodisk_insert() to not free the passed device on failure. Then on grub_cryptodisk_insert() failure, free the device pointer. This is done by going to the label "error", which will call cryptodisk_close() to free the device and set the device pointer to NULL, so that a pointer to freed memory is not returned. Fixes: CID 366905 Reviewed-by: Daniel Kiper 2021-12-23 Daniel Axtens mm: Document grub_mm_init_region() The grub_mm_init_region() does some things that seem magical, especially around region merging. Make it a bit clearer. Reviewed-by: Daniel Kiper 2021-12-23 Daniel Axtens mm: Document grub_free() The grub_free() possesses a surprising number of quirks, and also uses single-letter variable names confusingly to iterate through the free list. Document what's going on. Use prev and cur to iterate over the free list. Reviewed-by: Daniel Kiper 2021-12-23 Daniel Axtens mm: grub_real_malloc(): Make small allocs comment match code Small allocations move the region's *first pointer. The comment says that this happens for allocations under 64K. The code says it's for allocations under 32K. Commit 45bf8b3a7549 changed the code intentionally: make the comment match. Fixes: 45bf8b3a7549 (* grub-core/kern/mm.c (grub_real_malloc): Decrease cut-off of moving the) Reviewed-by: Daniel Kiper 2021-12-23 Daniel Axtens mm: Clarify grub_real_malloc() When iterating through the singly linked list of free blocks, grub_real_malloc() uses p and q for the current and previous blocks respectively. This isn't super clear, so swap to using prev and cur. This makes another quirk more obvious. The comment at the top of grub_real_malloc() might lead you to believe that the function will allocate from *first if there is space in that block. It actually doesn't do that, and it can't do that with the current data structures. If we used up all of *first, we would need to change the ->next of the previous block to point to *first->next, but we can't do that because it's a singly linked list and we don't have access to *first's previous block. What grub_real_malloc() actually does is set *first to the initial previous block, and *first->next is the block we try to allocate from. That allows us to keep all the data structures consistent. Document that. Reviewed-by: Daniel Kiper 2021-12-23 Daniel Axtens mm: Document GRUB internal memory management structures I spent more than a trivial quantity of time figuring out pre_size and whether a memory region's size contains the header cell or not. Document the meanings of all the properties. Hopefully now no-one else has to figure it out! Reviewed-by: Daniel Kiper 2021-12-23 Michael Chang fs/btrfs: Use full btrfs bootloader area Up to now GRUB can only embed to the first 64 KiB before primary superblock of btrfs, effectively limiting the GRUB core size. That could consequently pose restrictions to feature enablement like advanced zstd compression. This patch attempts to utilize full unused area reserved by btrfs for the bootloader outlined in the document [1]: The first 1MiB on each device is unused with the exception of primary superblock that is on the offset 64KiB and spans 4KiB. Apart from that, adjacent sectors to superblock and first block group are not used for embedding in case of overflow and logged access to adjacent sectors could be useful for tracing it up. This patch has been tested to provide out of the box support for btrfs zstd compression with which GRUB has been installed to the partition. [1] https://btrfs.wiki.kernel.org/index.php/Manpage/btrfs(5)#BOOTLOADER_SUPPORT Reviewed-by: Daniel Kiper 2021-12-23 Glenn Washburn tests: Refactor building xorriso command for iso9660 tests The iso9660 tests test creating isos with different combinations of Joliet, Rock Ridge, and ISO 9660 conformance level. Refactor xorriso argument generation for more readability and extensibility. Reviewed-by: Thomas Schmitt Reviewed-by: Daniel Kiper 2021-12-23 Glenn Washburn cryptodisk: Improve handling of partition name in cryptomount password prompt Call grub_partition_get_name() unconditionally to initialize the part variable. Then part will only be NULL when grub_partition_get_name() errors. Note that when source->partition is NULL, then grub_partition_get_name() returns an allocated empty string. So no comma or partition will be printed, as desired. Reviewed-by: Daniel Kiper 2021-12-23 Glenn Washburn cryptodisk: Move global variables into grub_cryptomount_args struct Note that cargs.search_uuid does not need to be initialized in various parts of the cryptomount argument parsing, just once when cargs is declared with a struct initializer. The previous code used a global variable which would retain the value across cryptomount invocations. Reviewed-by: Daniel Kiper 2021-12-23 Glenn Washburn cryptodisk: Refactor password input out of crypto dev modules into cryptodisk The crypto device modules should only be setting up the crypto devices and not getting user input. This has the added benefit of simplifying the code such that three essentially duplicate pieces of code are merged into one. Add documentation of passphrase option for cryptomount as it is now usable. Reviewed-by: Daniel Kiper 2021-12-23 Glenn Washburn cryptodisk: Add infrastructure to pass data from cryptomount to cryptodisk modules Previously, the cryptomount arguments were passed by global variable and function call argument, neither of which are ideal. This change passes data via a grub_cryptomount_args struct, which can be added to over time as opposed to continually adding arguments to the cryptodisk scan and recover_key. As an example, passing a password as a cryptomount argument is implemented. However, the backends are not implemented, so testing this will return a not implemented error. Also, add comments to cryptomount argument parsing to make it more obvious which argument states are being handled. Reviewed-by: Daniel Kiper 2021-12-23 Glenn Washburn cryptodisk: Improve cryptomount -u error message When a cryptmount is specified with a UUID, but no cryptodisk backends find a disk with that UUID, return a more detailed message giving telling the user that they might not have a needed cryptobackend module loaded. Reviewed-by: Daniel Kiper 2021-12-23 Glenn Washburn cryptodisk: Improve error messaging in cryptomount invocations Update such that "cryptomount -u UUID" will not print two error messages when an invalid passphrase is given and the most relevant error message will be displayed. Reviewed-by: Daniel Kiper 2021-12-23 Glenn Washburn cryptodisk: Return failure in cryptomount when no cryptodisk modules are loaded This displays an error notifying the user that they'll want to load a backend module to make cryptomount useful. Reviewed-by: Daniel Kiper 2021-12-23 Glenn Washburn cryptodisk: Refactor to discard have_it global The global "have_it" was never used by the crypto-backends, but was used to determine if a crypto-backend successfully mounted a cryptodisk with a given UUID. This is not needed however, because grub_device_iterate() will return 1 if and only if grub_cryptodisk_scan_device() returns 1. And grub_cryptodisk_scan_device() will now only return 1 if a search_uuid has been specified and a cryptodisk was successfully setup by a crypto-backend or a cryptodisk of the requested UUID is already open. To implement this grub_cryptodisk_scan_device_real() is modified to return a cryptodisk or NULL on failure and having the appropriate grub_errno set to indicated failure. Note that grub_cryptodisk_scan_device_real() will fail now with a new errno GRUB_ERR_BAD_MODULE when none of the cryptodisk backend modules succeed in identifying the source disk. With this change grub_device_iterate() will return 1 when a crypto device is successfully decrypted or when the source device has already been successfully opened. Prior to this change, trying to mount an already successfully opened device would trigger an error with the message "no such cryptodisk found", which is at best misleading. The mount should silently succeed in this case, which is what happens with this patch. Reviewed-by: Daniel Kiper 2021-12-23 Glenn Washburn luks2: Add debug message to align with luks and geli modules Reviewed-by: Daniel Kiper configure: Fix misspelled variable BUILD_LDFAGS -> BUILD_LDFLAGS Reviewed-by: Daniel Kiper 2021-12-23 Michael Chang grub-mkconfig: Restore umask for the grub.cfg The commit ab2e53c8a (grub-mkconfig: Honor a symlink when generating configuration by grub-mkconfig) has inadvertently discarded umask for creating grub.cfg in the process of running grub-mkconfig. The resulting wrong permission (0644) would allow unprivileged users to read GRUB configuration file content. This presents a low confidentiality risk as grub.cfg may contain non-secured plain-text passwords. This patch restores the missing umask and sets the creation file mode to 0600 preventing unprivileged access. Fixes: CVE-2021-3981 Reviewed-by: Daniel Kiper 2021-12-23 Heinrich Schuchardt efi: Create the grub_efi_close_protocol() library function Create a library function for CloseProtocol() and use it for the SNP driver. Reviewed-by: Daniel Kiper 2021-12-23 Heinrich Schuchardt efinet: Correct closing of SNP protocol In the context of the implementation of the EFI_LOAD_FILE2_PROTOCOL for the initial ramdisk it was observed that opening the SNP protocol failed. https://lists.gnu.org/archive/html/grub-devel/2021-10/msg00020.html This is due to an incorrect call to CloseProtocol(). The first parameter of CloseProtocol() is the handle, not the interface. We call OpenProtocol() with ControllerHandle == NULL. Hence we must also call CloseProtcol() with ControllerHandel == NULL. Each call of OpenProtocol() for the same network card handle is expected to return the same interface pointer. If we want to close the protocol which we opened non-exclusively when searching for a card, we have to do this before opening the protocol exclusively. As there is no guarantee that we successfully open the protocol add checks in the transmit and receive functions. Reported-by: Andreas Schwab Reviewed-by: Daniel Kiper 2021-12-23 Colin Watson minilzo: Update to minilzo-2.10 minilzo fails to build on a number of Debian release architectures (armel, mips64el, mipsel, ppc64el) with errors such as: ../../grub-core/lib/minilzo/minilzo.c: In function 'lzo_memops_get_le16': ../../grub-core/lib/minilzo/minilzo.c:3479:11: error: dereferencing type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasing] 3479 | * (lzo_memops_TU2p) (lzo_memops_TU0p) (dd) = * (const lzo_memops_TU2p) (const lzo_memops_TU0p) (ss); \ | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ../../grub-core/lib/minilzo/minilzo.c:3530:5: note: in expansion of macro 'LZO_MEMOPS_COPY2' 3530 | LZO_MEMOPS_COPY2(&v, ss); | ^~~~~~~~~~~~~~~~ The latest upstream version is 2.10, so updating to it seems like a good idea on general principles, and it fixes builds on all the above architectures. The update procedure documented in the GRUB Developers Manual worked; I just updated the version numbers to make it clear that it's been executed recently. Reviewed-by: Daniel Kiper 2021-12-22 Glenn Washburn docs: Add documentation on packages for building documentation Reviewed-by: Daniel Kiper 2021-12-22 Glenn Washburn docs: Fix broken links in development docs Use the Git Book as a reference for documentation on Git as no other link was provided. Other links were broken because they used @url instead of @uref and needed a comma separator between link and link text. Reviewed-by: Daniel Kiper 2021-12-22 Glenn Washburn docs: Update development docs to include information on running test suite Add a section with minimal description on setting up and running the test suite with a link to the INSTALL documentation which is a little more detailed in terms of package requirements. Reviewed-by: Daniel Kiper 2021-12-22 Glenn Washburn docs: Add sentence on where Debian packages can be searched for online Reviewed-by: Daniel Kiper 2021-12-22 Qu Wenruo fs/btrfs: Make extent item iteration to handle gaps The GRUB btrfs implementation can't handle two very basic btrfs file layouts: 1. Mixed inline/regualr extents # mkfs.btrfs -f test.img # mount test.img /mnt/btrfs # xfs_io -f -c "pwrite 0 1k" -c "sync" -c "falloc 0 4k" \ -c "pwrite 4k 4k" /mnt/btrfs/file # umount /mnt/btrfs # ./grub-fstest ./grub-fstest --debug=btrfs ~/test.img hex "/file" Such mixed inline/regular extents case is not recommended layout, but all existing tools and kernel can handle it without problem. 2. NO_HOLES feature # mkfs.btrfs -f test.img -O no_holes # mount test.img /mnt/btrfs # xfs_io -f -c "pwrite 0 4k" -c "pwrite 8k 4k" /mnt/btrfs/file # umount /mnt/btrfs # ./grub-fstest ./grub-fstest --debug=btrfs ~/test.img hex "/file" NO_HOLES feature is going to be the default mkfs feature in the incoming v5.15 release, and kernel has support for it since v4.0. The way GRUB btrfs code iterates through file extents relies on no gap between extents. If any gap is hit, then GRUB btrfs will error out, without any proper reason to help debug the bug. This is a bad assumption, since a long long time ago btrfs has a new feature called NO_HOLES to allow btrfs to skip the padding hole extent to reduce metadata usage. The NO_HOLES feature is already stable since kernel v4.0 and is going to be the default mkfs feature in the incoming v5.15 btrfs-progs release. When there is a extent gap, instead of error out, just try next item. This is still not ideal, as kernel/progs/U-boot all do the iteration item by item, not relying on the file offset continuity. But it will be way more time consuming to correct the whole behavior than starting from scratch to build a proper designed btrfs module for GRUB. Reviewed-by: Daniel Kiper 2021-11-22 Alec Brown disk/ldm: Fix resource leak Commit 23e39f50ca7a (disk/ldm: Make sure comp data is freed before exiting from make_vg()) fixed several spots in make_vg() where comp data was leaking memory when an error was being handled but missed one. To avoid leaking memory, comp should be freed when an error is being handled after comp has been successfully allocated memory in the for loop. Fixes: 23e39f50ca7a (disk/ldm: Make sure comp data is freed before exiting from make_vg()) Fixes: CID 73804 Reviewed-by: Daniel Kiper 2021-11-22 Alec Brown commands/probe: Fix resource leaks Commit 1fc860bb76bb (commands/probe: Fix a resource leak when probing disks), missed other cases where grub_device_close() should be called before a return statement is called. Also found that grub_disk_close() wasn't being called when an error is being returned. To avoid conflict with grub_errno, grub_error_push() should be called before either grub_device_close() or grub_disk_close() is called and grub_error_pop() should be called before grub_errno is returned. Fixes: 1fc860bb76bb (commands/probe: Fix a resource leak when probing disks) Fixes: CID 292443 Reviewed-by: Daniel Kiper 2021-11-22 Michael Chang templates: Filter out POSIX locale for translation The POSIX locale is default or native operating system's locale identical to the C locale, so no translation to human speaking languages are provided. For this reason we should filter out LANG=POSIX as well as LANG=C upon generating grub.cfg to avoid looking up for it's gettext's message catalogs that will consequently result in an unpleasant message: error: file `/boot/grub/locale/POSIX.gmo' not found Reviewed-by: Daniel Kiper 2021-11-02 Darren Kenny io/gzio: Fix possible use of uninitialized variable in huft_build() In huft_build() it is possible to reach the for loop where "r" is being assigned to "q[j]" without "r.v" ever being initialized. Fixes: CID 314024 Reviewed-by: Daniel Kiper 2021-11-02 Darren Kenny fs/zfs/zfs: Fix possible insecure use of chunk size in zap_leaf_array_get() In zap_leaf_array_get() the chunk size passed in is considered tainted by Coverity, and is being used before it is tested for validity. To fix this the assignment of "la" is moved until after the test of the value of "chunk". Fixes: CID 314014 Reviewed-by: Daniel Kiper 2021-11-02 Darren Kenny util/grub-mkfont: Fix memory leak in write_font_pf2() In the function write_font_pf2() memory is allocated for font_name to construct a new name, but it is not released before returning from the function, leaking the allocated memory. Fixes: CID 314015 Reviewed-by: Daniel Kiper 2021-11-02 Darren Kenny util/grub-fstest: Fix resource leaks in cmd_cmp() In the function cmd_cmp() within the while loop, srcnew and destnew are being allocated but are never freed either before leaving scope or in the recursive calls being made to cmd_cmp(). Fixes: CID 314032 Fixes: CID 314045 Reviewed-by: Daniel Kiper 2021-11-02 Darren Kenny util/grub-mkrescue: Fix memory leak in write_part() In the function write_part(), the value of inname is not used beyond the grub_util_fopen() call, so it should be freed to avoid leakage. Fixes: CID 314028 Reviewed-by: Daniel Kiper 2021-11-02 Darren Kenny util/grub-install-common: Fix memory leak in copy_all() The copy_all() function skips a section of code using continue, but fails to free the memory in srcf first, leaking it. Fixes: CID 314026 Reviewed-by: Daniel Kiper 2021-11-02 Robbie Harwood kern/dl: Print module name on license check failure Prior to this change, the GRUB would only indicate that the check had been failed, but not by what module. This made it difficult to track down either the problem module, or debug the false positive further. Before performing the license check, resolve the module name so that it can be printed if the license check fails. Reviewed-by: Daniel Kiper 2021-10-25 Glenn Washburn kern/misc: Add debug log condition to log output Adding the conditional to debug log messages allows the GRUB user to construct the $debug variable without needing to consult the source to find the conditional (especially useful for situations where the source is not readily available). Reviewed-by: Daniel Kiper 2021-10-25 Glenn Washburn tests: In partmap_test, use ${parted} variable when checking for binary Reviewed-by: Daniel Kiper 2021-10-25 Glenn Washburn tests: Test aborts due to missing requirements should be marked as error instead of skipped Many tests abort due to not being root or missing tools, for instance mkfs commands for file system tests. The tests are exited with code 77, which means they were skipped. A skipped test is a test that should not be run, e.g. a test specific to ARM64 should not be run on an x86 build. These aborts are actually a hard error, code 99. That means that the test could not be completed, but not because what was supposed to be tested failed, e.g. in these cases where a missing tool prevents the running of a test. Reviewed-by: Daniel Kiper 2021-10-25 Glenn Washburn tests: Boot PowerPC using PMU instead of CUDA for power management A recent refactoring of CUDA command code has exposed a bug in OpenBIOS [1] which was causing system powerdown and system reset to fail, thus causing the QEMU instance to hang. This in turn caused the grub-shell command to timeout causing it to return an error code when the test actually completed successfully. Since it could be a while before the patch fixing this issue in OpenBIOS filters down to the average distro, switch to PMU to allow powerdowns and reboots to work as expected. [1] https://gitlab.com/qemu-project/qemu/-/issues/624 Reviewed-by: Daniel Kiper 2021-10-14 Kees Cook osdep/linux: Fix md array device enumeration GET_ARRAY_INFO's info.nr_disks does not map to GET_DISK_INFO's disk.number, which is an internal kernel index. If an array has had drives added, removed, etc., there may be gaps in GET_DISK_INFO's results. But since the consumer of devicelist cannot tolerate gaps (it expects to walk a NULL-terminated list of device name strings), the devicelist index (j) must be tracked separately from the disk.number index (i). As part of this, since GRUB wants to only examine active (i.e. present and non-failed) disks, the count of remaining disks (remaining) must be tracked separately from the devicelist index (j). Additionally, drop a line with empty spaces only. Fixes: 49de079bbe1c (... (grub_util_raid_getmembers): Handle "removed" disks) Fixes: 2b00217369ac (... Added support for RAID and LVM) Fixes: https://bugs.launchpad.net/ubuntu/+source/grub2/+bug/1912043 Fixes: https://savannah.gnu.org/bugs/index.php?59887 Reviewed-by: Petr Vorel Reviewed-by: Daniel Kiper 2021-10-14 Glenn Washburn docs: Add fuller accounting of "make check" prerequisites Many of the prerequisites for exercising the full "make check" test suite have not been documented. This adds them along with a note that some tests require elevated privileges to run. Add an incomplete list of cross compiling toolchain packages for Debian and trusted sources for other distros. Add statement at the start of the document to clarify that package names are from Debian 11. Reviewed-by: Daniel Kiper 2021-10-14 Glenn Washburn tests: Do not delete filesystem images on error The filesystem images created for the filesystem test can be useful when debugging why a filesystem test failed. So, keep them around and let the user clean them up. Reviewed-by: Daniel Kiper 2021-10-14 Glenn Washburn tests: Output list of devices when partmap fails Reviewed-by: Daniel Kiper 2021-10-14 Glenn Washburn tests: Skip HFS test only when mac_roman module is not loaded and not loadable Allow the HFS tests to not be skipped if the mac_roman modules is loaded in the kernel, but not accessible to modprobe. Reviewed-by: Daniel Kiper 2021-10-14 Glenn Washburn tests: Change FAT volume label to be with in the valid character range The ";", semi-colon, character is not a valid character for a FAT filesystem label. This test used to succeed because prior to v4.2 of dosfstools mkfs.vfat did not enforce the character restrictions for volume labels. So, change the volume label string to be valid but contain symbol characters to test odd volume labels. Reviewed-by: Daniel Kiper 2021-10-14 Glenn Washburn tests: Only test MINIX3 volumes of 1 KiB block size Apparently there used to be a -B option for mkfs.minix to create a volume with a specified block size. This version is hard to come by and does not appear to be available in Debian distributions. So, remove support for testing a variety of blocks sizes for MINIX3. This allows the MINIX tests to run because they were being skipped due to not finding a mkfs.minix with the -B option. Reviewed-by: Daniel Kiper 2021-10-14 Glenn Washburn tests: mkfs.btrfs now supports only 4 KiB sector sizes and above Reviewed-by: Daniel Kiper tests: Disable ReiserFS tests for old format because newer kernels do not support them Reviewed-by: Daniel Kiper tests: mkreiserfs only supports 4096 block size Reviewed-by: Daniel Kiper tests: Rename variable filtime -> filetime as its meant to be Reviewed-by: Daniel Kiper 2021-10-14 Glenn Washburn tests: Use @BUILD_SHEBANG@ autoconf var instead of literal shell This bring this test in line with the rest of the test scripts. Reviewed-by: Daniel Kiper 2021-10-14 Glenn Washburn tests: Exit with skipped exit code when test not performed These tests were not performed and therefore did not pass, nor fail. This fixes misleading test exit code where, for instance, the pseries_test will pass on i386-pc, which is not a pseries architecture. Reviewed-by: Daniel Kiper 2021-10-14 Glenn Washburn tests: A failure of mktemp should cause the test script to exit with code 99 A test exiting with code 99 means that there was an error in the test itself and not a failure in the thing being tested (also known as a hard error). Reviewed-by: Daniel Kiper 2021-10-14 Glenn Washburn tests: Make setup errors in grub-fs-tester hard errors When a test program fails because it failed to setup the test properly, this does not indicate a failure in what is attempting to be tested because the test is never run. So exit with a hard error exit status to note this difference. This will allow easier detection of tests that are not actually being run and those that are really failing. Reviewed-by: Daniel Kiper 2021-10-14 Glenn Washburn tests: Do not occlude grub-shell return code The script grub-shell does the bulk of the testing. If it returns an error code, that means that the test failed and the test should immediately exit with that error code. When grub-shell is used as a non-terminating command in a pipeline, e.g. when data needs to be extracted from its output, its error code will be occluded by the last command in the pipeline. Refactor tests so that the shell will error with the exit code of grub-shell by breaking up pipelines such that grub-shell is always the last command in the pipeline that it is used in. Reviewed-by: Daniel Kiper 2021-10-14 Glenn Washburn tests: Do not occlude subshell error codes when used as input to the test command When using the output of a subshell as input, its error code is ignored in the context of "set -e". Many test scripts use grub-shell in a subshell with output used as an argument to the test command to test for expected output. Refactor these tests so that the subshell output goes to a shell variable, so that if the subshell errors the script will immediately exit with an error code. Reviewed-by: Daniel Kiper 2021-10-14 Glenn Washburn tests: Add set -e to missing tests This helps to ensure that error codes do not get ignored. Reviewed-by: Daniel Kiper 2021-10-14 Glenn Washburn tests: When checking squashfs fstime, use superblock last modified time Currently, the filesystem timestamp check in grub-fs-tester uses the squashfs image file's last modified timestamp and checks to see if that time stamp is within 3 seconds of the superblock timestamp as determined by grub. The image file's timestamp could be more than 3 seconds off if mksquashfs takes more than 3 seconds to generate the image, as is the case on a virtual machine. Instead use squashfs tools to get the filesystem timestamp directly. Reviewed-by: Daniel Kiper 2021-10-14 Glenn Washburn tests: Fix partmap_test for arm*-efi, disk numbering has changed Perhaps using a newer UEFI firmware is the reason for the created test disk showing up as hd2 instead of hd3. Reviewed-by: Daniel Kiper 2021-10-04 Nikolai Kostrigin docs/grub-dev: Fix typos Reviewed-by: Daniel Kiper 2021-10-04 Michael Chang build: Fix build error with binutils 2.36 The following procedure to build xen/pvgrub is broken. git clone https://git.savannah.gnu.org/git/grub.git cd grub ./bootstrap mkdir build-xen cd build-xen ../configure --with-platform=xen make It fails with the message: /usr/lib64/gcc/x86_64-suse-linux/10/../../../../x86_64-suse-linux/bin/ld: section .note.gnu.property VMA [0000000000400158,0000000000400187] overlaps section .bss VMA [000000000000f000,000000000041e1af] The most significant factor is that new assembler (GNU as) generates the .note.gnu.property section as default. This note section overlaps with .bss because it doesn't reposition with -Wl,-Ttext,0 with which the base address of .text section is set, rather the address of .note.gnu.property is calculated for some reason from 0x400000 where the ELF executable defaults to start. Using -Ttext-segment doesn't help either, though it is said to set the address of the first byte of the text segment according to "man ld". What it actually does is to override the default 0x400000, aka the image base address, to something else. The entire process can be observed in the default linker script used by gcc [1]. Therefore we can't expect it to achieve the same thing as -Ttext given that the first segment where .text resides is offset by SIZEOF_HEADERS plus some sections may be preceding it within the first segment. The end result is .text always has to start with non-zero address with -Wl,-Ttext-segment,0 if using default linker script. It is also worth mentioning that binutils upstream apparently doesn't seem to consider this as a bug [2] and proposed to use -Wl,-Ttext-segment,0 which is not fruitful as what has been tested by Gentoo [3]. As long as GRUB didn't use ISA information encoded in .note.gnu.property, we can safely drop it via -Wa,-mx86-used-note=no assembler option to fix the linker error above. This is considered a better approach than using custom linker script to drop the .note.gnu.property section because object file manipulation can also be hampered one way or the other in that linker script may not be helpful. See also this commit removing the section in the process of objcopy. 6643507ce build: Fix GRUB i386-pc build with Ubuntu gcc [1] In /usr/lib64/ldscripts/elf_x86_64.x or use 'gcc -Wl,--verbose ...' PROVIDE (__executable_start = SEGMENT_START("text-segment", 0x400000)); . = SEGMENT_START("text-segment", 0x400000) + SIZEOF_HEADERS; [2] https://sourceware.org/bugzilla/show_bug.cgi?id=27377 [3] https://bugs.gentoo.org/787221 Reviewed-by: Daniel Kiper 2021-10-04 Michael Chang disk/diskfilter: Use nodes in logical volume's segment as member device Currently the grub_diskfilter_memberlist() function returns all physical volumes added to a volume group to which a logical volume (LV) belongs. However, this is suboptimal as it doesn't fit the intended behavior of returning underlying devices that make up the LV. To give a clear picture, the result should be identical to running commands below to display the logical volumes with underlying physical volumes in use. localhost:~ # lvs -o lv_name,vg_name,devices /dev/system/root LV VG Devices root system /dev/vda2(512) localhost:~ # lvdisplay --maps /dev/system/root --- Logical volume --- ... --- Segments --- Logical extents 0 to 4604: Type linear Physical volume /dev/vda2 Physical extents 512 to 5116 As shown above, we can know system-root LV uses only /dev/vda2 to allocate it's extents, or we can say that /dev/vda2 is the member device comprising the system-root LV. It is important to be precise on the member devices, because that helps to avoid pulling in excessive dependency. Let's use an example to demonstrate why it is needed. localhost:~ # findmnt / TARGET SOURCE FSTYPE OPTIONS / /dev/mapper/system-root ext4 rw,relatime localhost:~ # pvs PV VG Fmt Attr PSize PFree /dev/mapper/data system lvm2 a-- 1020.00m 0 /dev/vda2 system lvm2 a-- 19.99g 0 localhost:~ # cryptsetup status /dev/mapper/data /dev/mapper/data is active and is in use. type: LUKS1 cipher: aes-xts-plain64 keysize: 512 bits key location: dm-crypt device: /dev/vdb sector size: 512 offset: 4096 sectors size: 2093056 sectors mode: read/write localhost:~ # vgs VG #PV #LV #SN Attr VSize VFree system 2 3 0 wz--n- 20.98g 0 localhost:~ # lvs -o lv_name,vg_name,devices LV VG Devices data system /dev/mapper/data(0) root system /dev/vda2(512) swap system /dev/vda2(0) We can learn from above that /dev/mapper/data is an encrypted volume and also gets assigned to volume group "system" as one of it's physical volumes. And also it is not used by root device, /dev/mapper/system-root, for allocating extents, so it shouldn't be taking part in the process of setting up GRUB to access root device. However, running grub-install reports error as volume group "system" contains encrypted volume. error: attempt to install to encrypted disk without cryptodisk enabled. Set `GRUB_ENABLE_CRYPTODISK=y' in file `/etc/default/grub'. Certainly we can enable GRUB_ENABLE_CRYPTODISK=y and move on, but that is not always acceptable since the server may need to be booted unattended. Additionally, typing passphrase for every system startup can be a big hassle of which most users would like to avoid. This patch solves the problem by returning exact physical volume, /dev/vda2, rightly used by system-root from the example above, thus grub-install will not error out because the excessive encrypted device to boot the root device is not configured. Tested-by: Olav Reinert Reviewed-by: Daniel Kiper 2021-10-04 Krzysztof Nowicki fs/ext2: Fix handling of missing sparse extent leafs When a file on ext4 is stored as sparse the data belonging to zero-filled blocks is not written to storage and the extent map is missing entries for these blocks. Such case can happen both for depth 0 extents (leafs) as well as higher-level tables. Consider a scenario of a file which has a zero-filled beginning (e.g. ISO image). In such case real data starts at block 8. If such a file is stored using 2-level extent structure the extent list in the inode will be depth 1 and will have an entry to a depth 0 (leaf) extent header for blocks 8-n. Unfortunately existing GRUB2 ext2 driver is only able to handle missing entries in leaf extent tables, for which the grub_ext2_read_block() function returns 0. In case the whole leaf extent list is missing for a block the function fails with "invalid extent" error. The fix for this problem relies on the grub_ext4_find_leaf() helper function to distinguish two error cases: missing extent and error walking through the extent tree. The existing error message is raised only for the latter case, while for the missing leaf extent zero is returned from grub_ext2_read_block() indicating a sparse block. Reviewed-by: Daniel Kiper 2021-10-04 Daniel Axtens powerpc: Drop Open Hack'Ware - remove GRUB_IEEE1275_FLAG_NO_ANSI Open Hack'Ware was the only user. Reviewed-by: Daniel Kiper 2021-10-04 Daniel Axtens powerpc: Drop Open Hack'Ware - remove GRUB_IEEE1275_FLAG_CANNOT_INTERPRET Open Hack'Ware was the only user. Reviewed-by: Daniel Kiper 2021-10-04 Daniel Axtens powerpc: Drop Open Hack'Ware - remove GRUB_IEEE1275_FLAG_CANNOT_SET_COLORS Open Hack'Ware was the only user. Reviewed-by: Daniel Kiper 2021-10-04 Daniel Axtens powerpc: Drop Open Hack'Ware - remove GRUB_IEEE1275_FLAG_FORCE_CLAIM Open Hack'Ware was the only user. It added a lot of complexity. Reviewed-by: Daniel Kiper 2021-10-04 Daniel Axtens powerpc: Drop Open Hack'Ware Open Hack'Ware was an alternative firmware of powerpc under QEMU. The last commit to any Open Hack'Ware repo I can find is from 2014 [1]. Open Hack'Ware was used for the QEMU "prep" machine type, which was deprecated in QEMU in commit 54c86f5a4844 (hw/ppc: deprecate the machine type 'prep', replaced by '40p') in QEMU v3.1, and had reportedly been broken for years before without anyone noticing. Support was removed in February 2020 by commit b2ce76a0730e (hw/ppc/prep: Remove the deprecated "prep" machine and the OpenHackware BIOS). Open Hack'Ware's limitations require some messy code in GRUB. This complexity is not worth carrying any more. Remove detection of Open Hack'Ware. We will clean up the feature flags in following commits. [1]: https://github.com/qemu/openhackware and https://repo.or.cz/w/openhackware.git are QEMU submodules. They have only small changes on top of OHW v0.4.1, which was imported into QEMU SCM in 2010. I can't find anything resembling an official repo any more. Reviewed-by: Daniel Kiper 2021-09-20 Glenn Washburn docs/grub: Improve search documentation, by adding short options and section on hints Reviewed-by: Daniel Kiper 2021-09-20 Glenn Washburn fs/udf: Fix regression which is preventing symlink access This code was broken by commit 3f05d693 (malloc: Use overflow checking primitives where we do complex allocations), which added overflow checking in many areas. The problem here is that the changes update the local variable sz, which was already in use and which was not updated before the change. So the code using sz was getting a different value of than it would have previously for the same UDF image. This causes the logic getting the destination of the symlink to not realize that its gotten the full destination, but keeps trying to read past the end of the destination. The bytes after the end are generally NULL padding bytes, but that's not a valid component type (ECMA-167 14.16.1.1). So grub_udf_read_symlink() branches to error logic, returning NULL, instead of the symlink destination path. The result of this bug is that the UDF filesystem tests were failing in the symlink test with the grub-fstest error message: grub-fstest: error: cannot open `(loop0)/sym': invalid symlink. This change stores the result of doubling sz in another local variable s, so as not to modify sz. Also remove unnecessary grub_add(), which increased the output by 1, presumably to account for a NULL byte. This isn't needed because an output buffer of size twice sz is already guaranteed to be more than enough to contain the path components converted to UTF-8. The value of sz contains at least 4 bytes for the path component header (ECMA-167 14.16.1), which means that 2 * 4 bytes are allocated but will not be used for UTF-8 characters, so the NULL byte is accounted for. Reviewed-by: Daniel Kiper 2021-09-20 Chris Vogel templates: Add GRUB_CMDLINE_LINUX_RECOVERY When generating grub.cfg using grub-mkconfig and the scripts 10_linux and 20_linux_xen there is no way to add kernel command line parameters _only_ to the recovery entries generated. This is needed to e.g. start a debug shell in installations using systemd using the kernel command line parameter "systemd.debug-shell" or to recover in a system with encrypted root in situations where the decryption of the root filesystem per crypttab in the intiramfs image is broken and the recovery entry should contain information how to decrypt the rootfs (cryptopts=). This patch does not change the default behaviour of the GRUB if GRUB_CMDLINE_LINUX_RECOVERY is not set. If GRUB_CMDLINE_LINUX_RECOVERY is set and the generated recovery entry should include the kernel parameter "single" the parameter must be explicitly included in GRUB_CMDLINE_LINUX_RECOVERY. As far as I know all credits for the idea and the initial implementation go to Kyle Ranking of Purism. Reviewed-by: Daniel Kiper 2021-09-20 Michael Chang emu: Fix executable stack marking The gcc by default assumes executable stack is required if the source object file doesn't have .note.GNU-stack section in place. If any of the source objects doesn't incorporate the GNU-stack note, the resulting program will have executable stack flag set in PT_GNU_STACK program header to instruct program loader or kernel to set up the executable stack when program loads to memory. Usually the .note.GNU-stack section will be generated by gcc automatically if it finds that executable stack is not required. However it doesn't take care of generating .note.GNU-stack section for those object files built from assembler sources. This leads to unnecessary risk of security of exploiting the executable stack because those assembler sources don't actually require stack to be executable to work. The grub-emu and grub-emu-lite are found to flag stack as executable revealed by execstack tool. $ mkdir -p build-emu && cd build-emu $ ../configure --with-platform=emu && make $ execstack -q grub-core/grub-emu grub-core/grub-emu-lite X grub-core/grub-emu X grub-core/grub-emu-lite This patch will add the missing GNU-stack note to the assembler source used by both utilities, therefore the result doesn't count on gcc default behavior and the executable stack is disabled. $ execstack -q grub-core/grub-emu grub-core/grub-emu-lite - grub-core/grub-emu - grub-core/grub-emu-lite Reviewed-by: Daniel Kiper 2021-09-13 Thomas Schmitt tests: Keep grub-fs-tester ziso9660 from failing for wrong reasons The test for the ability to decompress zisofs encoded files is supposed to fail due to the lack of this ability in GRUB. But it fails early with xorriso : FAILURE : -volid: Text too long (1650 > 32) because "ziso9660" is not in the list of filesystems which accept at most 32 bytes in their FSLABEL. If this is fixed, the test returns false success because the xorriso run does not produce any zisofs compressed files. The problem is in the sequence of native xorriso commands used. The command -set_filter_r applies only to the files which are already inserted into the emerging ISO filesystem. In the current sequence no files have been inserted yet by command -add when the last of two -set_filter_r commands is executed. After this is corrected, xorriso refuses to work because the global settings of command -zisofs can be made only before command -set_filter_r has attached zisofs filters to the data files in the emerging ISO. Further: A bug in xorriso causes a false warning about FSLABEL being too long for Joliet. Shortcomings of Joliet cause warnings about symbolic links. Such warnings might distract from the actual reason why the test is expected to fail. So, add "ziso9660" to the 32-byte FSLABEL list. Fix the xorriso run to produce compressed files which for now cause righteous failure of the test. Do this by removing a surplus group of -set_filter_r and -zisofs commands, by moving the other such group behind -add, and by swapping -set_filter_r and -zisofs. Remove the -as mkisofs options which produce a Joliet filesystem tree. Reviewed-by: Daniel Kiper 2021-09-13 Glenn Washburn commands/read: Add silent mode to read command to suppress input echo This conforms to the behavior of the -s option of the Bash read command. docs/grub: Document the -s option for the read command. Reviewed-by: Daniel Kiper 2021-09-13 Glenn Washburn kern/fs: Allow number of blocks in block list to be optional, defaulting length to device length This is primarily useful to do something like "loopback newdev (dev)8+" to create a device that skips the first 4 KiB, which may contain a container header, e.g. a non-standard RAID1 header, that GRUB does not recognize. This would allow that container data to be potentially accessed up to the end of container, which may be necessary for some layouts that store data at the end. There is currently not a good way to programmatically get the number of sectors on a disk to set the appropriate length of the blocklist. Reviewed-by: Daniel Kiper 2021-09-06 Petr Vorel autogen.sh: Detect python It helps to avoid an error on distros which has only python3 binary: ./autogen.sh: line 20: python: command not found Use python3 as the default as python2 is EOL since Jan 2020. However, check also for python which is on most distros, if not all, python2 because code still works on python2. Although it should not be needed keep the possibility to define PYTHON variable. For detection use "command -v" which is POSIX and supported on all common shells (bash, zsh, dash, busybox sh, mksh) instead requiring "which" as an extra dependency (usable on containers). Update the INSTALL file too. Reviewed-by: Daniel Kiper 2021-09-06 Petr Vorel bootstrap: Require GNU patch The bootstrap.conf uses patch, let's require it. Better than multiple messages: ./bootstrap.conf: line 84: patch: command not found Mention it also in the INSTALL file. Reviewed-by: Daniel Kiper 2021-09-06 Thomas Schmitt tests: Let xorriso fixely assume UTF-8 as local character set The iso9660_test fails if the effective locale is not UTF-8. This happens because xorriso needs to convert file names and FSLABEL to UCS-2 when preparing a Joliet tree. The grub-fs-tester obviously intends to use UTF-8 as character set, but xorriso assumes by default the result of nl_langinfo(3) with item CODESET. So, override the result of nl_langinfo(CODESET) by options of xorriso -as mkisofs. Reviewed-by: Daniel Kiper 2021-09-06 Fangrui Song via Grub-devel configure: Check for -falign-jumps=1 beside -falign-loops=1 The Clang does not support -falign-jumps and only recently gained support for -falign-loops. The -falign-jumps=1 should be tested beside -fliang-loops=1 to avoid passing unrecognized options to the Clang: clang-14: error: optimization flag '-falign-jumps=1' is not supported [-Werror,-Wignored-optimization-argument] The -falign-functions=1 is supported by GCC 5.1.0/Clang 3.8.0. So, just add the option unconditionally. Acked-by: Paul Menzel Reviewed-by: Daniel Kiper 2021-09-06 Fangrui Song via Grub-devel configure: Remove obsoleted -malign-{jumps, loops, functions} The GCC warns "cc1: warning: ‘-malign-loops’ is obsolete, use ‘-falign-loops’". The Clang silently ignores -malign-{jumps,loops,functions}. The preferred -falign-* forms have been supported since GCC 3.2. So, just remove -malign-{jumps,loops,functions}. Acked-by: Paul Menzel Reviewed-by: Daniel Kiper 2021-09-06 Erwan Velu fs/xfs: Fix unreadable filesystem with v4 superblock The commit 8b1e5d193 (fs/xfs: Add bigtime incompat feature support) introduced the bigtime support by adding some features in v3 inodes. This change extended grub_xfs_inode struct by 76 bytes but also changed the computation of XFS_V2_INODE_SIZE and XFS_V3_INODE_SIZE. Prior this commit, XFS_V2_INODE_SIZE was 100 bytes. After the commit it's 84 bytes XFS_V2_INODE_SIZE becomes 16 bytes too small. As a result, the data structures aren't properly aligned and the GRUB generates "attempt to read or write outside of partition" errors when trying to read the XFS filesystem: GNU GRUB version 2.11 .... grub> set debug=efi,gpt,xfs grub> insmod part_gpt grub> ls (hd0,gpt1)/ partmap/gpt.c:93: Read a valid GPT header partmap/gpt.c:115: GPT entry 0: start=4096, length=1953125 fs/xfs.c:931: Reading sb fs/xfs.c:270: Validating superblock fs/xfs.c:295: XFS v4 superblock detected fs/xfs.c:962: Reading root ino 128 fs/xfs.c:515: Reading inode (128) - 64, 0 fs/xfs.c:515: Reading inode (739521961424144223) - 344365866970255880, 3840 error: attempt to read or write outside of partition. This commit change the XFS_V2_INODE_SIZE computation by subtracting 76 bytes instead of 92 bytes from the actual size of grub_xfs_inode struct. This 76 bytes value comes from added members: 20 grub_uint8_t unused5 1 grub_uint64_t flags2 48 grub_uint8_t unused6 This patch explicitly splits the v2 and v3 parts of the structure. The unused4 is still ending of the v2 structures and the v3 starts at unused5. Thanks to this we will avoid future corruptions of v2 or v3 inodes. The XFS_V2_INODE_SIZE is returning to its expected size and the filesystem is back to a readable state: GNU GRUB version 2.11 .... grub> set debug=efi,gpt,xfs grub> insmod part_gpt grub> ls (hd0,gpt1)/ partmap/gpt.c:93: Read a valid GPT header partmap/gpt.c:115: GPT entry 0: start=4096, length=1953125 fs/xfs.c:931: Reading sb fs/xfs.c:270: Validating superblock fs/xfs.c:295: XFS v4 superblock detected fs/xfs.c:962: Reading root ino 128 fs/xfs.c:515: Reading inode (128) - 64, 0 fs/xfs.c:515: Reading inode (128) - 64, 0 fs/xfs.c:931: Reading sb fs/xfs.c:270: Validating superblock fs/xfs.c:295: XFS v4 superblock detected fs/xfs.c:962: Reading root ino 128 fs/xfs.c:515: Reading inode (128) - 64, 0 fs/xfs.c:515: Reading inode (128) - 64, 0 fs/xfs.c:515: Reading inode (128) - 64, 0 fs/xfs.c:515: Reading inode (131) - 64, 768 efi/ fs/xfs.c:515: Reading inode (3145856) - 1464904, 0 grub2/ fs/xfs.c:515: Reading inode (132) - 64, 1024 grub/ fs/xfs.c:515: Reading inode (139) - 64, 2816 grub> Fixes: 8b1e5d193 (fs/xfs: Add bigtime incompat feature support) Tested-by: Carlos Maiolino Reviewed-by: Daniel Kiper 2021-09-06 Heinrich Schuchardt libgcrypt: Avoid -Wempty-body in rijndael do_setkey() Avoid a warning lib/libgcrypt-grub/cipher/rijndael.c:229:9: warning: suggest braces around empty body in an ‘if’ statement [-Wempty-body] 229 | ; | ^ Reviewed-by: Daniel Kiper 2021-09-06 Heinrich Schuchardt libgcrypt: Avoid -Wsign-compare in rijndael do_setkey() Avoid a warning lib/libgcrypt-grub/cipher/rijndael.c:352:21: warning: comparison of integer expressions of different signedness: ‘int’ and ‘unsigned int’ [-Wsign-compare] 352 | for (i = 0; i < keylen; i++) | Reviewed-by: Daniel Kiper 2021-09-06 Wouter van Kesteren commands/setpci: Honor write mask argument In the case that one passes a write mask with ":" the write_mask is obtained from grub_strtoul() and then promptly overwritten by 0xffffffff three lines later. This appears to have been so since the initial version of setpci in 2009. I'm surprised no one else has hit this issue in the past 12 years... Reviewed-by: Daniel Kiper 2021-07-22 Jeff Mahoney osdep/linux/hostdisk: Use stat() instead of udevadm for partition lookup The sysfs_partition_path() calls udevadm to resolve the sysfs path for a block device. That can be accomplished by stating the device node and using the major/minor to follow the symlinks in /sys/dev/block/. This cuts the execution time of grub-mkconfig to somewhere near 55% on system without LVM (which uses libdevmapper instead sysfs_partition_path()). Remove udevadm call as it does not help us more than calling stat() directly. Reviewed-by: Daniel Kiper 2021-07-22 Petr Vorel osdep: Introduce include/grub/osdep/major.h and use it ... to factor out fix for glibc 2.25 introduced in 7a5b301e3 (build: Use AC_HEADER_MAJOR to find device macros). Note: Once glibc 2.25 is old enough and this fix is not needed also AC_HEADER_MAJOR in configure.ac should be removed. Reviewed-by: Daniel Kiper 2021-07-22 Daniel Axtens ieee1275: Drop HEAP_MAX_ADDR and HEAP_MIN_SIZE constants The HEAP_MAX_ADDR is confusing. Currently it is set to 32MB, except on ieee1275 on x86, where it is 64MB. There is a comment which purports to explain it: /* If possible, we will avoid claiming heap above this address, because it seems to cause relocation problems with OSes that link at 4 MiB */ This doesn't make a lot of sense when the constants are well above 4MB already. It was not always this way. Prior to commit 7b5d0fe4440c (Increase heap limit) in 2010, HEAP_MAX_SIZE and HEAP_MAX_ADDR were indeed 4MB. However, when the constants were increased the comment was left unchanged. It's been over a decade. It doesn't seem like we have problems with claims over 4MB on powerpc or x86 ieee1275. The SPARC does things completely differently and never used the constant. Drop the constant and the check. The only use of HEAP_MIN_SIZE was to potentially override the HEAP_MAX_ADDR check. It is now unused. Remove it too. Tested-by: Stefan Berger Reviewed-by: Daniel Kiper 2021-07-22 Marius Bakke tests/ahci: Change "ide-drive" deprecated QEMU device name to "ide-hd" The "ide-drive" device was removed in QEMU 6.0. The "ide-hd" has been available for more than 10 years now in QEMU. Thus there shouldn't be any need for backwards compatible names. Reviewed-by: Daniel Kiper 2021-07-22 Javier Martinez Canillas fs/ext2: Ignore checksum seed incompat feature This incompat feature is used to denote that the filesystem stored its metadata checksum seed in the superblock. This is used to allow tune2fs changing the UUID on a mounted metdata_csum filesystem without having to rewrite all the disk metadata. However, the GRUB doesn't use the metadata checksum at all. So, it can just ignore this feature if it is enabled. This is consistent with the GRUB filesystem code in general which just does a best effort to access the filesystem's data. The checksum seed incompat feature has to be removed from the ignore list if the support for metadata checksum verification is added to the GRUB ext2 driver later. Suggested-by: Eric Sandeen Suggested-by: Lukas Czerner Reviewed-by: Lukas Czerner Reviewed-by: Daniel Kiper 2021-06-08 Glenn Washburn zfs: Use grub_uint64_t instead of 1ULL in BF64_*CODE() macros The underlying type of 1ULL does not change across architectures but grub_uint64_t does. This allows using the BF64_*CODE() macros as arguments to format string functions that use the PRI* format string macros that also vary with architecture. Change the grub_error() call, where this was previously an issue and temporarily fixed by casting and using a format string literal code, to now use PRI* macros and remove casting. Reviewed-by: Daniel Kiper 2021-06-08 Daniel Kiper Bump version to 2.11 Skip versions between 2.07 and 2.10 to avoid leading zeros in minor version number. This way version parsing in scripts should be easier. Release 2.06 2021-06-08 Daniel Kiper SECURITY: Add SECURITY file The SECURITY file describes the GRUB project security policy. It is based on https://github.com/wireapp/wire/blob/master/SECURITY.md 2021-06-08 Daniel Kiper MAINTAINERS: Add MAINTAINERS file The MAINTAINERS file provides basic information about the GRUB project and its maintainers. 2021-06-01 Dimitri John Ledkov grub-install: Add backup and restore Refactor clean_grub_dir() to create a backup of all the files, instead of just irrevocably removing them as the first action. If available, register atexit() handler to restore the backup if errors occur before point of no return, or remove the backup if everything was successful. If atexit() is not available, the backup remains on disk for manual recovery. Some platforms defined a point of no return, i.e. after modules & core images were updated. Failures from any commands after that stage are ignored, and backup is cleaned up. For example, on EFI platforms update is not reverted when efibootmgr fails. Extra care is taken to ensure atexit() handler is only invoked by the parent process and not any children forks. Some older GRUB codebases can invoke parent atexit() hooks from forks, which can mess up the backup. This allows safer upgrades of MBR & modules, such that modules/images/fonts/translations are consistent with MBR in case of errors. For example accidental grub-install /dev/non-existent-disk currently clobbers and upgrades modules in /boot/grub, despite not actually updating any MBR. This patch only handles backup and restore of files copied to /boot/grub. This patch does not perform backup (or restoration) of MBR itself or blocklists. Thus when installing i386-pc platform, corruption may still occur with MBR and blocklists which will not be attempted to be automatically recovered. Also add modinfo.sh and *.efi to the cleanup/backup/restore code path, to ensure it is also cleaned, backed up and restored. Reviewed-by: Daniel Kiper 2021-06-01 Dimitri John Ledkov osdep/unix/exec: Avoid atexit() handlers when child execvp() fails The functions grub_util_exec_pipe() and grub_util_exec_pipe_stderr() currently call execvp(). If the call fails for any reason, the child currently calls exit(127). This in turn executes the parents atexit() handlers from the forked child, and then the same handlers are called again from parent. This is usually not desired, and can lead to deadlocks, and undesired behavior. So, change the exit() calls to _exit() calls to avoid calling atexit() handlers from child. Fixes: e75cf4a58 (unix exec: avoid atexit handlers when child exits) Reviewed-by: Daniel Kiper 2021-06-01 Jan (janneke) Nieuwenhuizen lib/i386/relocator64: Build fixes for i386 This fixes cross-compiling to x86 (e.g., the Hurd) from x86-linux of grub-core/lib/i386/relocator64.S This file has six sections that only build with a 64-bit assembler, yet only the first two sections had support for a 32-bit assembler. This patch completes this for the remaining sections. To reproduce, update the GRUB source description in your local Guix archive and run ./pre-inst-env guix build --system=i686-linux --target=i586-pc-gnu grub or install an x86 cross-build environment on x86-linux (32-bit!) and configure to cross build and make, e.g., do something like ./configure \ CC_FOR_BUILD=gcc \ --build=i686-unknown-linux-gnu \ --host=i586-pc-gnu make Additionally, remove a line with redundant spaces. Reviewed-by: Daniel Kiper 2021-06-01 Javier Martinez Canillas fs/xfs: Add needsrepair incompat feature support The XFS now has an incompat feature flag to indicate that a filesystem needs to be repaired. The Linux kernel refuses to mount the filesystem that has it set and only the xfs_repair tool is able to clear that flag. The GRUB doesn't have the concept of mounting filesystems and just attempts to read the files. But it does some sanity checking before attempting to read from the filesystem. Among the things which are tested, is if the super block only has set of incompatible features flags that are supported by GRUB. If it contains any flags that are not listed as supported, reading the XFS filesystem fails. Since the GRUB doesn't attempt to detect if the filesystem is inconsistent nor replays the journal, the filesystem access is a best effort. For this reason, ignore if the filesystem needs to be repaired and just print a debug message. That way, if reading or booting fails later, the user is able to figure out that the failures can be related to broken XFS filesystem. Suggested-by: Eric Sandeen Reviewed-by: Daniel Kiper 2021-06-01 Carlos Maiolino fs/xfs: Add bigtime incompat feature support The XFS filesystem supports a bigtime feature to overcome y2038 problem. This patch makes the GRUB able to support the XFS filesystems with this feature enabled. The XFS counter for the bigtime enabled timestamps starts at 0, which translates to GRUB_INT32_MIN (Dec 31 20:45:52 UTC 1901) in the legacy timestamps. The conversion to Unix timestamps is made before passing the value to other GRUB functions. For this to work properly, GRUB requires an access to flags2 field in the XFS ondisk inode. So, the grub_xfs_inode structure has been updated to cover full ondisk inode. Reviewed-by: Daniel Kiper 2021-06-01 Carlos Maiolino fs: Use 64-bit type for filesystem timestamp Some filesystems nowadays use 64-bit types for timestamps. So, update grub_dirhook_info struct to use an grub_int64_t type to store mtime. This also updates the grub_unixtime2datetime() function to receive a 64-bit timestamp argument and do 64-bit-safe divisions. All the remaining conversion from 32-bit to 64-bit should be safe, as 32-bit to 64-bit attributions will be implicitly casted. The most critical part in the 32-bit to 64-bit conversion is in the function grub_unixtime2datetime() where it needs to deal with the 64-bit type. So, for that, the grub_divmod64() helper has been used. These changes enables the GRUB to support dates beyond y2038. Reviewed-by: Daniel Kiper 2021-05-28 Javier Martinez Canillas types: Define PRI{x,d}GRUB_INT{32,64}_T format specifiers There are already PRI*_T constants defined for unsigned integers but not for signed integers. Add format specifiers for the latter. Suggested-by: Daniel Kiper Reviewed-by: Daniel Kiper 2021-05-28 Tianjia Zhang kern/efi/sb: Remove duplicate efi_shim_lock_guid variable The efi_shim_lock_guid local variable and shim_lock_guid global variable have the same GUID value. Only the latter is retained. Reviewed-by: Daniel Kiper 2021-05-10 Javier Martinez Canillas util/mkimage: Fix wrong PE32+ section sizes for some arches The commit f60ba9e5945 (util/mkimage: Refactor section setup to use a helper) added a helper function to setup PE sections. But it also changed how the raw data offsets were calculated since all the section sizes are aligned. However, for some platforms, i.e ia64-efi and arm64-efi, the kernel image size is not aligned using the section alignment. This leads to the situation in which the mods section offset in its PE section header does not match its real placement in the PE file. So, finally the GRUB is not able to locate and load built-in modules. The problem surfaces on ia64-efi and arm64-efi because both platforms require additional relocation data which is added behind .bss section. So, we have to add some padding behind this extra data to make the beginning of mods section properly aligned in the PE file. Fix it by aligning the kernel_size to the section alignment. That makes the sizes and offsets in the PE section headers to match relevant sections in the PE32+ binary file. Reported-by: John Paul Adrian Glaubitz Tested-by: John Paul Adrian Glaubitz Reviewed-by: Daniel Kiper 2021-05-10 Daniel Kiper term/terminfo: Fix the terminfo command help and documentation Additionally, fix the terminfo spelling mistake in the GRUB development documentation. Reviewed-by: Javier Martinez Canillas 2021-05-10 Daniel Kiper i18n: Align N_() formatting with the rest of GRUB code Reviewed-by: Javier Martinez Canillas 2021-05-10 Daniel Kiper i18n: Format large integers before the translation message - take 2 This is an additional fix which has been missing from the commit 837fe48de (i18n: Format large integers before the translation message). Reviewed-by: Javier Martinez Canillas 2021-04-13 Miguel Ángel Arruga Vivas i18n: Format large integers before the translation message The GNU gettext only supports the ISO C99 macros for integral types. If there is a need to use unsupported formatting macros, e.g. PRIuGRUB_UINT64_T, according to [1] the number to a string conversion should be separated from the code printing message requiring the internationalization. So, the function grub_snprintf() is used to print the numeric values to an intermediate buffer and the internationalized message contains a string format directive. [1] https://www.gnu.org/software/gettext/manual/html_node/Preparing-Strings.html#No-string-concatenation Reviewed-by: Daniel Kiper 2021-04-12 Daniel Axtens video/fb/fbfill: Use unsigned integers for width/height Since commit 7ce3259f67ac (video/fb/fbfill: Fix potential integer overflow), clang builds of grub-emu have failed with messages like: /usr/bin/ld: libgrubmods.a(libgrubmods_a-fbfill.o): in function `grub_video_fbfill_direct24': fbfill.c:(.text+0x28e): undefined reference to `__muloti4' This appears to be due to a weird quirk in how clang compiles grub_mul(dst->mode_info->bytes_per_pixel, width, &rowskip) which is grub_mul(unsigned int, int, &grub_size_t). It looks like clang somewhere promotes everything to 128-bit maths before ultimately reducing down to 64 bit for grub_size_t. I think this is because width is signed, and indeed converting width to an unsigned int makes the problem go away. This conversion also makes more sense generally: - the caller of all the fbfill_directN functions is grub_video_fb_fill_dispatch() and it takes width and height as unsigned ints already, - it doesn't make sense to fill a negative width or height. Convert the width and height arguments and associated loop counters to unsigned ints. Fixes: 7ce3259f67ac (video/fb/fbfill: Fix potential integer overflow) Reviewed-by: Daniel Kiper 2021-04-12 Glenn Washburn docs: Conform badmem and cutmem description indentations with other commands Reviewed-by: Daniel Kiper docs: Add note to cryptomount that UUIDs should be specified without dashes Reviewed-by: Daniel Kiper 2021-04-12 Aru Sahni templates: Fix user-facing typo with an incorrect use of "it's" Since the possessive form of "it" is being used, the apostrophe must be omitted. Reviewed-by: Daniel Kiper 2021-04-12 Colin Watson buffer: Sync up out-of-range error message The messages associated with other similar GRUB_ERR_OUT_OF_RANGE errors were lacking the trailing full stop. Syncing up the strings saves a small amount of precious core image space on i386-pc. DOWN: obj/i386-pc/grub-core/kernel.img (31740 > 31708) - change: -32 DOWN: i386-pc core image (biosdisk ext2 part_msdos) (27453 > 27452) - change: -1 DOWN: i386-pc core image (biosdisk ext2 part_msdos diskfilter mdraid09) (32367 > 32359) - change: -8 Reviewed-by: Daniel Kiper 2021-04-12 Glenn Washburn usb/usbhub: Use GRUB_USB_MAX_CONF macro instead of literal in hub for maximum configs Reviewed-by: Daniel Kiper 2021-04-12 Daniel Drake fs/minix: Avoid mistakenly probing ext2 filesystems The ext2 (and ext3, ext4) filesystems write the number of free inodes to location 0x410. On a MINIX filesystem, that same location is used for the MINIX superblock magic number. If the number of free inodes on an ext2 filesystem is equal to any of the four MINIX superblock magic values plus any multiple of 65536, GRUB's MINIX filesystem code will probe it as a MINIX filesystem. In the case of an OS using ext2 as the root filesystem, since there will ordinarily be some amount of file creation and deletion on every bootup, it effectively means that this situation has a 1:16384 chance of being hit on every reboot. This will cause GRUB's filesystem probing code to mistakenly identify an ext2 filesystem as MINIX. This can be seen by e.g. "search --label" incorrectly indicating that no such ext2 partition with matching label exists, whereas in fact it does. After spotting the rough cause of the issue I was facing here, I borrowed much of the diagnosis/explanation from meierfra who found and investigated the same issue in util-linux in 2010: https://bugs.launchpad.net/ubuntu/+source/util-linux/+bug/518582 This was fixed in util-linux by having the MINIX code check for the ext2 magic. Do the same here. Reviewed-by: Derek Foreman Reviewed-by: Daniel Kiper 2021-03-12 Daniel Kiper Release 2.06~rc1 2021-03-11 Ard Biesheuvel arm/linux: Fix ARM Linux header layout The hdr_offset member of the ARM Linux image header appears at offset 0x3c, matching the PE/COFF spec's placement of the COFF header offset in the MS-DOS header. We're currently off by four, so fix that. Reviewed-by: Daniel Kiper 2021-03-10 Glenn Washburn style: Format string macro should have a space between quotes Reviewed-by: Daniel Kiper 2021-03-10 Glenn Washburn grub/err: Do compile-time format string checking on grub_error() This should help prevent format string errors and thus improve the quality of error reporting. Reviewed-by: Daniel Kiper 2021-03-10 Glenn Washburn fs/zfs/zfs: Use format code "%llu" for 64-bit uint bp->blk_prop in grub_error() This is a temporary, less-intrusive change to get the build to success with compiler format string checking turned on. There is a better fix which addresses this issue, but it needs more testing. Use this change so that format string checking on grub_error() can be turned on until the better change is fully tested. Reviewed-by: Daniel Kiper 2021-03-10 Glenn Washburn fs/hfsplus: Use format code PRIuGRUB_UINT64_T for 64-bit typed fileblock in grub_error() Reviewed-by: Daniel Kiper 2021-03-10 Glenn Washburn dl/elf: Use format code PRIxGRUB_UINT64_T for 64-bit arg in grub_error() The macro ELF_R_TYPE does not change the underlying type. Here its argument is a 64-bit Elf64_Xword. Make sure the format code matches. For the RISC-V architecture, rel->r_info could be either Elf32_Xword or Elf64_Xword depending on if 32 or 64-bit RISC-V is being built. So cast to 64-bit value regardless. Reviewed-by: Daniel Kiper 2021-03-10 Glenn Washburn disk/ata: Use format code PRIxGRUB_UINT64_T for 64-bit uint argument in grub_error() Reviewed-by: Daniel Kiper 2021-03-10 Glenn Washburn loader/i386/pc/linux: Use PRI* macros to get correct format string code across architectures Also remove casting of format string args so that the architecture dependent type is preserved. Reviewed-by: Daniel Kiper 2021-03-10 Glenn Washburn kern/efi/mm: Format string error in grub_error() The second format string argument, GRUB_EFI_MAX_USABLE_ADDRESS, is a macro to a number literal. However, depending on what the target architecture, the type can be 32 or 64 bits. Cast to a 64-bit integer. Also, change the format string literals "%llx" to use PRIxGRUB_UINT64_T. Reviewed-by: Daniel Kiper 2021-03-10 Glenn Washburn commands/pgp: Format code for grub_error() is incorrect The format code is for a 32-bit int, but the argument, keyid, is declared as a 64 bit int. The comment above says keyid is 32-bit. I'm not sure if the comment or declaration is wrong, so force the display of a 64-bit int for now. Reviewed-by: Daniel Kiper 2021-03-10 Glenn Washburn grub_error: Use format code PRIuGRUB_SIZE for variables of type grub_size_t Reviewed-by: Daniel Kiper 2021-03-10 Glenn Washburn disk/dmraid_nvidia: Format string error in grub_error() The grub_error() has a format string expecting two arguments, but only one provided. According to the comments in the struct grub_nv_super definition, the version field looks like a version number where major.minor is encoded as each a byte in the two-byte short. Reviewed-by: Daniel Kiper 2021-03-10 Glenn Washburn video/bochs: grub_error() format string add missing format code Reviewed-by: Daniel Kiper 2021-03-10 Glenn Washburn parttool/msdospart: grub_error() missing format string argument Its obvious from the error message that the variable named "type" was accidentally omitted. Reviewed-by: Daniel Kiper 2021-03-10 Glenn Washburn misc: Format string for grub_error() should be a literal Reviewed-by: Daniel Kiper 2021-03-10 Philip Müller templates: Properly disable the os-prober by default This patch does the following: - really disables os-prober by default in the util/grub-mkconfig.in by setting GRUB_DISABLE_OS_PROBER to true, - fixes the logic in the util/grub.d/30_os-prober.in, - updates the grub_warn() lines. Reason for the code shuffling in the util/grub-mkconfig.in: The default was GRUB_DISABLE_OS_PROBER=false if you don't set GRUB_DISABLE_OS_PROBER at all. To prevent os-prober from starting we have to set it by default to true and shuffle GRUB_DISABLE_OS_PROBER to code section, which is executed by the script. However we still give an option to the user to overwrite it with false, if he wants to execute os-prober after all. Fixes: e3464147 (templates: Disable the os-prober by default) Reported-by: Didier Spaier Reported-by: Lennart Sorensen Reported-by: John Paul Adrian Glaubitz Reviewed-by: Daniel Kiper 2021-03-10 Michael Chang kern/efi/sb: Add chainloaded image as shim's verifiable object While attempting to dual boot Microsoft Windows with UEFI chainloader, it failed with below error when UEFI Secure Boot was enabled: error ../../grub-core/kern/verifiers.c:119:verification requested but nobody cares: /EFI/Microsoft/Boot/bootmgfw.efi. It is a regression, as previously it worked without any problem. It turns out chainloading PE image has been locked down by commit 578c95298 (kern: Add lockdown support). However, we should consider it as verifiable object by shim to allow booting in UEFI Secure Boot mode. The chainloaded PE image could also have trusted signature created by vendor with their pubkey cert in db. For that matters it's usage should not be locked down under UEFI Secure Boot, and instead shim should be allowed to validate a PE binary signature before running it. Fixes: 578c95298 (kern: Add lockdown support) Reviewed-by: Daniel Kiper 2021-03-10 Glenn Washburn disk/pata: Suppress error message "no device connected" This error message comes from the grub_print_error() in grub_pata_device_initialize(), which does not pass on the error, and is raised in check_device(). The function check_device() needs to return this as an error because check_device() is also used in grub_pata_open(), which does pass on this error to indicate that the device can not be used. This is actually not an error when displayed by grub_pata_device_initialize() because it just indicates that there are no pata devices seen. This may be confusing to end users who do not have pata devices yet are loading the pata module (perhaps implicitly via nativedisk). This also causes unnecessary output which may need to be accounted for in functional testing. Instead print to the debug log when check_device() raises this "error" and pop the error from the error stack. If there is another error on the stack then print the error stack as those should be real errors. Acked-by: Paul Menzel Reviewed-by: Daniel Kiper 2021-03-10 Yi Zhao fs/ext2: Fix a file not found error when a symlink filesize is equal to 60 We encountered a file not found error when the symlink filesize is equal to 60: $ ls -l initrd lrwxrwxrwx 1 root root 60 Jan 6 16:37 initrd -> secure-core-image-initramfs-5.10.2-yoctodev-standard.cpio.gz When booting, we got the following error in the GRUB: error: file `/initrd' not found The root cause is that the size of diro->inode.symlink is equal to 60 and a symlink name has to be terminated with NUL there. So, if the symlink filesize is exactly 60 then it is also stored in a separate block rather than in the inode itself. Reviewed-by: Daniel Kiper 2021-03-02 Tianjia Zhang loader/i386/linux: Do not use grub_le_to_cpu32() for relocatable variable The relocatable variable is defined as grub_uint8_t. Relevant member in setup_header structure is also defined as one byte in Linux boot protocol. By semantic definition it is a bool type. It is not appropriate to treat it as a four bytes. This patch fixes the issue. Reviewed-by: Daniel Kiper 2021-03-02 Tianjia Zhang loader/i386/linux: Remove redundant code from in grub_cmd_linux() The preferred_address has been assigned to GRUB_LINUX_BZIMAGE_ADDR during initialization in grub_cmd_linux(). The assignment here is redundant and should be removed. Reviewed-by: Daniel Kiper 2021-03-02 Heinrich Schuchardt efi: The device-tree must be in EfiACPIReclaimMemory According to the Embedded Base Boot Requirements (EBBR) specification the device-tree passed to Linux as a configuration table must reside in EfiACPIReclaimMemory. Reviewed-by: Daniel Kiper 2021-03-02 Heinrich Schuchardt commands/efi/lsefisystab: Add short text for EFI_RT_PROPERTIES_TABLE_GUID UEFI specification 2.8 errata B introduced the EFI_RT_PROPERTIES_TABLE describing the services available at runtime. The lsefisystab command is used to display installed EFI configuration tables. Currently it only shows the GUID but not a short text for the new table. Provide a short text for the EFI_RT_PROPERTIES_TABLE_GUID. Reviewed-by: Daniel Kiper 2021-03-02 Petr Vorel docs/luks2: Mention key derivation function support To give users hint why Argon2, the default in cryptsetup for LUKS2, does not work. Acked-by: Paul Menzel Reviewed-by: Patrick Steinhardt Reviewed-by: Daniel Kiper 2021-03-02 Derek Foreman commands/file: Fix array/enum desync The commit f1957dc8a (RISC-V: Add to build system) added two entries to the options array, but only 1 entry to the enum. This resulted in everything after the insertion point being off by one. This broke at least the "file --is-hibernated-hiberfil" command. Bring the two back in sync by splitting the IS_RISCV_EFI enum entry into two, as is done for other architectures. Reviewed-by: Daniel Kiper 2021-03-02 Marco A Benatto kern/mm: Fix grub_debug_calloc() compilation error Fix compilation error due to missing parameter to grub_printf() when MM_DEBUG is defined. Fixes: 64e26162e (calloc: Make sure we always have an overflow-checking calloc() available) Reviewed-by: Daniel Kiper 2021-03-02 Alex Burmashev templates: Disable the os-prober by default The os-prober is enabled by default what may lead to potentially dangerous use cases and borderline opening attack vectors. This patch disables the os-prober, adds warning messages and updates GRUB_DISABLE_OS_PROBER configuration option documentation. This way we make it clear that the os-prober usage is not recommended. Simplistic nature of this change allows downstream vendors, who really want os-prober to be enabled out of the box in their relevant products, easily revert to it's old behavior. Reported-by: NyankoSec (, https://twitter.com/NyankoSec), working with SSD Secure Disclosure Reviewed-by: Daniel Kiper 2021-03-02 Thomas Frauendorfer | Miray Software gfxmenu/gui: Check printf() format in the gui_progress_bar and gui_label The gui_progress_bar and gui_label components can display the timeout value. The format string can be set through a theme file. This patch adds a validation step to the format string. If a user loads a theme file into the GRUB without this patch then a GUI label with the following settings + label { ... id = "__timeout__" text = "%s" } will interpret the current timeout value as string pointer and print the memory at that position on the screen. It is not desired behavior. Reviewed-by: Daniel Kiper 2021-03-02 Thomas Frauendorfer | Miray Software kern/misc: Add function to check printf() format against expected format The grub_printf_fmt_check() function parses the arguments of an untrusted printf() format and an expected printf() format and then compares the arguments counts and arguments types. The arguments count in the untrusted format string must be less or equal to the arguments count in the expected format string and both arguments types must match. To do this the parse_printf_arg_fmt() helper function is extended in the following way: 1. Add a return value to report errors to the grub_printf_fmt_check(). 2. Add the fmt_check argument to enable stricter format verification: - the function expects that arguments definitions are always terminated by a supported conversion specifier. - positional parameters, "$", are not allowed, as they cannot be validated correctly with the current implementation. For example "%s%1$d" would assign the first args entry twice while leaving the second one unchanged. - Return an error if preallocated space in args is too small and allocation fails for the needed size. The grub_printf_fmt_check() should verify all arguments. So, if validation is not possible for any reason it should return an error. This also adds a case entry to handle "%%", which is the escape sequence to print "%" character. 3. Add the max_args argument to check for the maximum allowed arguments count in a printf() string. This should be set to the arguments count of the expected format. Then the parse_printf_arg_fmt() function will return an error if the arguments count is exceeded. The two additional arguments allow us to use parse_printf_arg_fmt() in printf() and grub_printf_fmt_check() calls. When parse_printf_arg_fmt() is used by grub_printf_fmt_check() the function parse user provided untrusted format string too. So, in that case it is better to be too strict than too lenient. Reviewed-by: Daniel Kiper 2021-03-02 Thomas Frauendorfer | Miray Software kern/misc: Add STRING type for internal printf() format handling Set printf() argument type for "%s" to new type STRING. This is in preparation for a follow up patch to compare a printf() format string against an expected printf() format string. For "%s" the corresponding printf() argument is dereferenced as pointer while all other argument types are defined as integer value. However, when validating a printf() format it is necessary to differentiate "%s" from "%p" and other integers. So, let's do that. Reviewed-by: Daniel Kiper 2021-03-02 Thomas Frauendorfer | Miray Software kern/misc: Split parse_printf_args() into format parsing and va_list handling This patch is preparing for a follow up patch which will use the format parsing part to compare the arguments in a printf() format from an external source against a printf() format with expected arguments. Reviewed-by: Daniel Kiper 2021-03-02 Dimitri John Ledkov shim_lock: Only skip loading shim_lock verifier with explicit consent Commit 32ddc42c (efi: Only register shim_lock verifier if shim_lock protocol is found and SB enabled) reintroduced CVE-2020-15705 which previously only existed in the out-of-tree linuxefi patches and was fixed as part of the BootHole patch series. Under Secure Boot enforce loading shim_lock verifier. Allow skipping shim_lock verifier if SecureBoot/MokSBState EFI variables indicate skipping validations, or if GRUB image is built with --disable-shim-lock. Fixes: 132ddc42c (efi: Only register shim_lock verifier if shim_lock protocol is found and SB enabled) Fixes: CVE-2020-15705 Fixes: CVE-2021-3418 Reported-by: Dimitri John Ledkov Reviewed-by: Daniel Kiper 2021-03-02 Dimitri John Ledkov grub-install-common: Add --sbat option Reviewed-by: Daniel Kiper 2021-03-02 Peter Jones util/mkimage: Add an option to import SBAT metadata into a .sbat section Add a --sbat option to the grub-mkimage tool which allows us to import an SBAT metadata formatted as a CSV file into a .sbat section of the EFI binary. Reviewed-by: Daniel Kiper 2021-03-02 Peter Jones util/mkimage: Refactor section setup to use a helper Add a init_pe_section() helper function to setup PE sections. This makes the code simpler and easier to read. Reviewed-by: Daniel Kiper 2021-03-02 Peter Jones util/mkimage: Improve data_size value calculation According to "Microsoft Portable Executable and Common Object File Format Specification", the Optional Header SizeOfInitializedData field contains: Size of the initialized data section, or the sum of all such sections if there are multiple data sections. Make this explicit by adding the GRUB kernel data size to the sum of all the modules sizes. The ALIGN_UP() is not required by the PE spec but do it to avoid alignment issues. Reviewed-by: Daniel Kiper 2021-03-02 Peter Jones util/mkimage: Reorder PE optional header fields set-up This makes the PE32 and PE32+ header fields set-up easier to follow by setting them closer to the initialization of their related sections. Reviewed-by: Daniel Kiper 2021-03-02 Peter Jones util/mkimage: Unify more of the PE32 and PE32+ header set-up There's quite a bit of code duplication in the code that sets the optional header for PE32 and PE32+. The two are very similar with the exception of a few fields that have type grub_uint64_t instead of grub_uint32_t. Factor out the common code and add a PE_OHDR() macro that simplifies the set-up and make the code more readable. Reviewed-by: Daniel Kiper 2021-03-02 Peter Jones util/mkimage: Always use grub_host_to_target32() to initialize PE stack and heap stuff This change does not impact final result of initialization itself. However, it eases PE code unification in subsequent patches. Reviewed-by: Daniel Kiper 2021-03-02 Peter Jones util/mkimage: Use grub_host_to_target32() instead of grub_cpu_to_le32() The latter doesn't take into account the target image endianness. There is a grub_cpu_to_le32_compile_time() but no compile time variant for function grub_host_to_target32(). So, let's keep using the other one for this case. Reviewed-by: Daniel Kiper 2021-03-02 Javier Martinez Canillas util/mkimage: Remove unused code to add BSS section The code is compiled out so there is no reason to keep it. Additionally, don't set bss_size field since we do not add a BSS section. Reviewed-by: Daniel Kiper 2021-03-02 Chris Coulson kern/efi: Add initial stack protector implementation It works only on UEFI platforms but can be quite easily extended to others architectures and platforms if needed. Reviewed-by: Marco A Benatto Reviewed-by: Javier Martinez Canillas 2021-03-02 Chris Coulson kern/parser: Fix a stack buffer overflow grub_parser_split_cmdline() expands variable names present in the supplied command line in to their corresponding variable contents and uses a 1 kiB stack buffer for temporary storage without sufficient bounds checking. If the function is called with a command line that references a variable with a sufficiently large payload, it is possible to overflow the stack buffer via tab completion, corrupt the stack frame and potentially control execution. Fixes: CVE-2020-27749 Reported-by: Chris Coulson Reviewed-by: Daniel Kiper 2021-03-02 Chris Coulson kern/buffer: Add variable sized heap buffer Add a new variable sized heap buffer type (grub_buffer_t) with simple operations for appending data, accessing the data and maintaining a read cursor. Reviewed-by: Daniel Kiper 2021-03-02 Chris Coulson kern/parser: Refactor grub_parser_split_cmdline() cleanup Introduce a common function epilogue used for cleaning up on all return paths, which will simplify additional error handling to be introduced in a subsequent commit. Reviewed-by: Daniel Kiper 2021-03-02 Chris Coulson kern/parser: Introduce terminate_arg() helper process_char() and grub_parser_split_cmdline() use similar code for terminating the most recent argument. Add a helper function for this. Reviewed-by: Daniel Kiper 2021-03-02 Chris Coulson kern/parser: Introduce process_char() helper grub_parser_split_cmdline() iterates over each command line character. In order to add error checking and to simplify the subsequent error handling, split the character processing in to a separate function. Reviewed-by: Daniel Kiper 2021-03-02 Chris Coulson kern/parser: Fix a memory leak The getline() function supplied to grub_parser_split_cmdline() returns a newly allocated buffer and can be called multiple times, but the returned buffer is never freed. Reviewed-by: Daniel Kiper 2021-03-02 Daniel Axtens fs/btrfs: Squash some uninitialized reads We need to check errors before calling into a function that uses the result. Reviewed-by: Daniel Kiper 2021-03-02 Daniel Axtens fs/btrfs: Validate the number of stripes/parities in RAID5/6 This prevents a divide by zero if nstripes == nparities, and also prevents propagation of invalid values if nstripes ends up less than nparities. Reviewed-by: Daniel Kiper 2021-03-02 Daniel Axtens disk/lvm: Do not allow a LV to be it's own segment's node's LV This prevents infinite recursion in the diskfilter verification code. Reviewed-by: Daniel Kiper 2021-03-02 Daniel Axtens disk/lvm: Sanitize rlocn->offset to prevent wild read rlocn->offset is read directly from disk and added to the metadatabuf pointer to create a pointer to a block of metadata. It's a 64-bit quantity so as long as you don't overflow you can set subsequent pointers to point anywhere in memory. Require that rlocn->offset fits within the metadata buffer size. Reviewed-by: Daniel Kiper 2021-03-02 Daniel Axtens disk/lvm: Do not overread metadata We could reach the end of valid metadata and not realize, leading to some buffer overreads. Check if we have reached the end and bail. Reviewed-by: Daniel Kiper 2021-03-02 Daniel Axtens disk/lvm: Do not crash if an expected string is not found Clean up a bunch of cases where we could have strstr() fail and lead to us dereferencing NULL. We'll still leak memory in some cases (loops don't clean up allocations from earlier iterations if a later iteration fails) but at least we're not crashing. Reviewed-by: Daniel Kiper 2021-03-02 Daniel Axtens disk/lvm: Bail on missing PV list There's an if block for the presence of "physical_volumes {", but if that block is absent, then p remains NULL and a NULL-deref will result when looking for logical volumes. It doesn't seem like LVM makes sense without physical volumes, so error out rather than crashing. Reviewed-by: Daniel Kiper 2021-03-02 Daniel Axtens disk/lvm: Don't blast past the end of the circular metadata buffer This catches at least some OOB reads, and it's possible I suppose that if 2 * mda_size is less than GRUB_LVM_MDA_HEADER_SIZE it might catch some OOB writes too (although that hasn't showed up as a crash in fuzzing yet). It's a bit ugly and I'd appreciate better suggestions. Reviewed-by: Daniel Kiper 2021-03-02 Daniel Axtens disk/lvm: Don't go beyond the end of the data we read from disk We unconditionally trusted offset_xl from the LVM label header, even if it told us that the PV header/disk locations were way off past the end of the data we read from disk. Require that the offset be sane, fixing an OOB read and crash. Fixes: CID 314367, CID 314371 Reviewed-by: Daniel Kiper 2021-03-02 Daniel Axtens io/gzio: Zero gzio->tl/td in init_dynamic_block() if huft_build() fails If huft_build() fails, gzio->tl or gzio->td could contain pointers that are no longer valid. Zero them out. This prevents a double free when grub_gzio_close() comes through and attempts to free them again. Reviewed-by: Daniel Kiper 2021-03-02 Daniel Axtens io/gzio: Catch missing values in huft_build() and bail In huft_build(), "v" is a table of values in order of bit length. The code later (when setting up table entries in "r") assumes that all elements of this array corresponding to a code are initialized and less than N_MAX. However, it doesn't enforce this. With sufficiently manipulated inputs (e.g. from fuzzing), there can be elements of "v" that are not filled. Therefore a lookup into "e" or "d" will use an uninitialized value. This can lead to an invalid/OOB read on those values, often leading to a crash. Reviewed-by: Daniel Kiper 2021-03-02 Daniel Axtens io/gzio: Add init_dynamic_block() clean up if unpacking codes fails init_dynamic_block() didn't clean up gzio->tl and td in some error paths. This left td pointing to part of tl. Then in grub_gzio_close(), when tl was freed the storage for td would also be freed. The code then attempts to free td explicitly, performing a UAF and then a double free. Explicitly clean up tl and td in the error paths. Reviewed-by: Daniel Kiper 2021-03-02 Daniel Axtens io/gzio: Bail if gzio->tl/td is NULL This is an ugly fix that doesn't address why gzio->tl comes to be NULL. However, it seems to be sufficient to patch up a bunch of NULL derefs. It would be good to revisit this in future and see if we can have a cleaner solution that addresses some of the causes of the unexpected NULL pointers. Reviewed-by: Daniel Kiper 2021-03-02 Daniel Axtens fs/nilfs2: Properly bail on errors in grub_nilfs2_btree_node_lookup() We just introduced an error return in grub_nilfs2_btree_node_lookup(). Make sure the callers catch it. At the same time, make sure that grub_nilfs2_btree_node_lookup() always inits the index pointer passed to it. Reviewed-by: Daniel Kiper 2021-03-02 Daniel Axtens fs/nilfs2: Don't search children if provided number is too large NILFS2 reads the number of children a node has from the node. Unfortunately, that's not trustworthy. Check if it's beyond what the filesystem permits and reject it if so. This blocks some OOB reads. I'm not sure how controllable the read is and what could be done with invalidly read data later on. Reviewed-by: Daniel Kiper 2021-03-02 Daniel Axtens fs/nilfs2: Reject too-large keys NILFS2 has up to 7 keys, per the data structure. Do not permit array indices in excess of that. This catches some OOB reads. I don't know how controllable the invalidly read data is or if that could be used later in the program. Reviewed-by: Daniel Kiper 2021-03-02 Daniel Axtens fs/jfs: Catch infinite recursion It's possible with a fuzzed filesystem for JFS to keep getblk()-ing the same data over and over again, leading to stack exhaustion. Check if we'd be calling the function with exactly the same data as was passed in, and if so abort. I'm not sure what the performance impact of this is and am open to better ideas. Reviewed-by: Daniel Kiper 2021-03-02 Daniel Axtens fs/jfs: Limit the extents that getblk() can consider getblk() implicitly trusts that treehead->count is an accurate count of the number of extents. However, that value is read from disk and is not trustworthy, leading to OOB reads and crashes. I am not sure to what extent the data read from OOB can influence subsequent program execution. Require callers to pass in the maximum number of extents for which they have storage. Reviewed-by: Daniel Kiper 2021-03-02 Daniel Axtens fs/jfs: Do not move to leaf level if name length is negative Fuzzing JFS revealed crashes where a negative number would be passed to le_to_cpu16_copy(). There it would be cast to a large positive number and the copy would read and write off the end of the respective buffers. Catch this at the top as well as the bottom of the loop. Reviewed-by: Daniel Kiper 2021-03-02 Daniel Axtens fs/sfs: Fix over-read of root object name There's a read of the name of the root object that assumes that the name is nul-terminated within the root block. This isn't guaranteed - it seems SFS would require you to read multiple blocks to get a full name in general, but maybe that doesn't apply to the root object. Either way, figure out how much space is left in the root block and don't over-read it. This fixes some OOB reads. Reviewed-by: Daniel Kiper 2021-03-02 Daniel Axtens fs/hfs: Disable under lockdown HFS has issues such as infinite mutual recursion that are simply too complex to fix for such a legacy format. So simply do not permit it to be loaded under lockdown. Reviewed-by: Daniel Kiper 2021-03-02 Daniel Axtens fs/hfsplus: Don't use uninitialized data on corrupt filesystems Valgrind identified the following use of uninitialized data: ==2782220== Conditional jump or move depends on uninitialised value(s) ==2782220== at 0x42B364: grub_hfsplus_btree_search (hfsplus.c:566) ==2782220== by 0x42B21D: grub_hfsplus_read_block (hfsplus.c:185) ==2782220== by 0x42A693: grub_fshelp_read_file (fshelp.c:386) ==2782220== by 0x42C598: grub_hfsplus_read_file (hfsplus.c:219) ==2782220== by 0x42C598: grub_hfsplus_mount (hfsplus.c:330) ==2782220== by 0x42B8C5: grub_hfsplus_dir (hfsplus.c:958) ==2782220== by 0x4C1AE6: grub_fs_probe (fs.c:73) ==2782220== by 0x407C94: grub_ls_list_files (ls.c:186) ==2782220== by 0x407C94: grub_cmd_ls (ls.c:284) ==2782220== by 0x4D7130: grub_extcmd_dispatcher (extcmd.c:55) ==2782220== by 0x4045A6: execute_command (grub-fstest.c:59) ==2782220== by 0x4045A6: fstest (grub-fstest.c:433) ==2782220== by 0x4045A6: main (grub-fstest.c:772) ==2782220== Uninitialised value was created by a heap allocation ==2782220== at 0x483C7F3: malloc (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so) ==2782220== by 0x4C0305: grub_malloc (mm.c:42) ==2782220== by 0x42C21D: grub_hfsplus_mount (hfsplus.c:239) ==2782220== by 0x42B8C5: grub_hfsplus_dir (hfsplus.c:958) ==2782220== by 0x4C1AE6: grub_fs_probe (fs.c:73) ==2782220== by 0x407C94: grub_ls_list_files (ls.c:186) ==2782220== by 0x407C94: grub_cmd_ls (ls.c:284) ==2782220== by 0x4D7130: grub_extcmd_dispatcher (extcmd.c:55) ==2782220== by 0x4045A6: execute_command (grub-fstest.c:59) ==2782220== by 0x4045A6: fstest (grub-fstest.c:433) ==2782220== by 0x4045A6: main (grub-fstest.c:772) This happens when the process of reading the catalog file goes sufficiently wrong that there's an attempt to read the extent overflow file, which has not yet been loaded. Keep track of when the extent overflow file is fully loaded and refuse to use it before then. The load valgrind doesn't like is btree->nodesize, and that's then used to allocate a data structure. It looks like there are subsequently a lot of reads based on that pointer so OOB reads are likely, and indeed crashes (albeit difficult-to-replicate ones) have been observed in fuzzing. Reviewed-by: Daniel Kiper 2021-03-02 Daniel Axtens fs/hfsplus: Don't fetch a key beyond the end of the node Otherwise you get a wild pointer, leading to a bunch of invalid reads. Check it falls inside the given node. Reviewed-by: Daniel Kiper 2021-03-02 Daniel Axtens fs/fshelp: Catch impermissibly large block sizes in read helper A fuzzed HFS+ filesystem had log2blocksize = 22. This gave log2blocksize + GRUB_DISK_SECTOR_BITS = 31. 1 << 31 = 0x80000000, which is -1 as an int. This caused some wacky behavior later on in the function, leading to out-of-bounds writes on the destination buffer. Catch log2blocksize + GRUB_DISK_SECTOR_BITS >= 31. We could be stricter, but this is the minimum that will prevent integer size weirdness. Reviewed-by: Daniel Kiper 2021-03-02 Daniel Axtens term/gfxterm: Don't set up a font with glyphs that are too big Catch the case where we have a font so big that it causes the number of rows or columns to be 0. Currently we continue and allocate a virtual_screen.text_buffer of size 0. We then try to use that for glpyhs and things go badly. On the emu platform, malloc() may give us a valid pointer, in which case we'll access heap memory which we shouldn't. Alternatively, it may give us NULL, in which case we'll crash. For other platforms, if I understand grub_memalign() correctly, we will receive a valid but small allocation that we will very likely later overrun. Prevent the creation of a virtual screen that isn't at least 40 cols by 12 rows. This is arbitrary, but it seems that if your width or height is half a standard 80x24 terminal, you're probably going to struggle to read anything anyway. Reviewed-by: Daniel Kiper 2021-03-02 Daniel Axtens video/readers/jpeg: Don't decode data before start of stream When a start of stream marker is encountered, we call grub_jpeg_decode_sos() which allocates space for a bitmap. When a restart marker is encountered, we call grub_jpeg_decode_data() which then fills in that bitmap. If we get a restart marker before the start of stream marker, we will attempt to write to a bitmap_ptr that hasn't been allocated. Catch this and bail out. This fixes an attempt to write to NULL. Reviewed-by: Daniel Kiper 2021-03-02 Daniel Axtens video/readers/jpeg: Catch OOB reads/writes in grub_jpeg_decode_du() The key line is: du[jpeg_zigzag_order[pos]] = val * (int) data->quan_table[qt][pos]; jpeg_zigzag_order is grub_uint8_t[64]. I don't understand JPEG decoders quite well enough to explain what's going on here. However, I observe sometimes pos=64, which leads to an OOB read of the jpeg_zigzag_order global then an OOB write to du. That leads to various unpleasant memory corruption conditions. Catch where pos >= ARRAY_SIZE(jpeg_zigzag_order) and bail. Reviewed-by: Daniel Kiper 2021-03-02 Daniel Axtens video/readers/jpeg: Catch files with unsupported quantization or Huffman tables Our decoder only supports 2 quantization tables. If a file asks for a quantization table with index > 1, reject it. Similarly, our decoder only supports 4 Huffman tables. If a file asks for a Huffman table with index > 3, reject it. This fixes some out of bounds reads. It's not clear what degree of control over subsequent execution could be gained by someone who can carefully set up the contents of memory before loading an invalid JPEG file. Reviewed-by: Daniel Kiper 2021-03-02 Daniel Axtens kern/misc: Always set *end in grub_strtoull() Currently, if there is an error in grub_strtoull(), *end is not set. This differs from the usual behavior of strtoull(), and also means that some callers may use an uninitialized value for *end. Set *end unconditionally. Reviewed-by: Daniel Kiper 2021-03-02 Daniel Axtens commands/menuentry: Fix quoting in setparams_prefix() Commit 9acdcbf32542 (use single quotes in menuentry setparams command) says that expressing a quoted single quote will require 3 characters. It actually requires (and always did require!) 4 characters: str: a'b => a'\''b len: 3 => 6 (2 for the letters + 4 for the quote) This leads to not allocating enough memory and thus out of bounds writes that have been observed to cause heap corruption. Allocate 4 bytes for each single quote. Commit 22e7dbb2bb81 (Fix quoting in legacy parser.) does the same quoting, but it adds 3 as extra overhead on top of the single byte that the quote already needs. So it's correct. Fixes: 9acdcbf32542 (use single quotes in menuentry setparams command) Fixes: CVE-2021-20233 Reported-by: Daniel Axtens Reviewed-by: Daniel Kiper 2021-03-02 Daniel Axtens script/execute: Don't crash on a "for" loop with no items The following crashes the parser: for x in; do 0 done This is because grub_script_arglist_to_argv() doesn't consider the possibility that arglist is NULL. Catch that explicitly. This avoids a NULL pointer dereference. Reviewed-by: Daniel Kiper 2021-03-02 Daniel Axtens lib/arg: Block repeated short options that require an argument Fuzzing found the following crash: search -hhhhhhhhhhhhhf We didn't allocate enough option space for 13 hints because the allocation code counts the number of discrete arguments (i.e. argc). However, the shortopt parsing code will happily keep processing a combination of short options without checking if those short options require an argument. This means you can easily end writing past the allocated option space. This fixes a OOB write which can cause heap corruption. Fixes: CVE-2021-20225 Reported-by: Daniel Axtens Reviewed-by: Daniel Kiper 2021-03-02 Daniel Axtens script/execute: Avoid crash when using "$#" outside a function scope "$#" represents the number of arguments to a function. It is only defined in a function scope, where "scope" is non-NULL. Currently, if we attempt to evaluate "$#" outside a function scope, "scope" will be NULL and we will crash with a NULL pointer dereference. Do not attempt to count arguments for "$#" if "scope" is NULL. This will result in "$#" being interpreted as an empty string if evaluated outside a function scope. Reviewed-by: Daniel Kiper 2021-03-02 Daniel Axtens commands/ls: Require device_name is not NULL before printing This can be triggered with: ls -l (0 0*) and causes a NULL deref in grub_normal_print_device_info(). I'm not sure if there's any implication with the IEEE 1275 platform. Reviewed-by: Daniel Kiper 2021-03-02 Daniel Axtens script/execute: Fix NULL dereference in grub_script_execute_cmdline() Reviewed-by: Daniel Kiper 2021-03-02 Darren Kenny util/glue-efi: Fix incorrect use of a possibly negative value It is possible for the ftell() function to return a negative value, although it is fairly unlikely here, we should be checking for a negative value before we assign it to an unsigned value. Fixes: CID 73744 Reviewed-by: Daniel Kiper 2021-03-02 Darren Kenny util/grub-editenv: Fix incorrect casting of a signed value The return value of ftell() may be negative (-1) on error. While it is probably unlikely to occur, we should not blindly cast to an unsigned value without first testing that it is not negative. Fixes: CID 73856 Reviewed-by: Daniel Kiper 2021-03-02 Daniel Kiper util/grub-install: Fix NULL pointer dereferences Two grub_device_open() calls does not have associated NULL checks for returned values. Fix that and appease the Coverity. Fixes: CID 314583 Reviewed-by: Javier Martinez Canillas 2021-03-02 Paulo Flabiano Smorigo loader/xnu: Check if pointer is NULL before using it Fixes: CID 73654 Reviewed-by: Daniel Kiper 2021-03-02 Marco A Benatto loader/xnu: Free driverkey data when an error is detected in grub_xnu_writetree_toheap() ... to avoid memory leaks. Fixes: CID 96640 Reviewed-by: Daniel Kiper 2021-03-02 Darren Kenny loader/xnu: Fix memory leak The code here is finished with the memory stored in name, but it only frees it if there curvalue is valid, while it could actually free it regardless. The fix is a simple relocation of the grub_free() to before the test of curvalue. Fixes: CID 96646 Reviewed-by: Daniel Kiper 2021-03-02 Darren Kenny loader/bsd: Check for NULL arg up-front The code in the next block suggests that it is possible for .set to be true but .arg may still be NULL. This code assumes that it is never NULL, yet later is testing if it is NULL - that is inconsistent. So we should check first if .arg is not NULL, and remove this check that is being flagged by Coverity since it is no longer required. Fixes: CID 292471 Reviewed-by: Daniel Kiper 2021-03-02 Darren Kenny gfxmenu/gui_list: Remove code that coverity is flagging as dead The test of value for NULL before calling grub_strdup() is not required, since the if condition prior to this has already tested for value being NULL and cannot reach this code if it is. Fixes: CID 73659 Reviewed-by: Daniel Kiper 2021-03-02 Darren Kenny video/readers/jpeg: Test for an invalid next marker reference from a jpeg file While it may never happen, and potentially could be caught at the end of the function, it is worth checking up front for a bad reference to the next marker just in case of a maliciously crafted file being provided. Fixes: CID 73694 Reviewed-by: Daniel Kiper 2021-03-02 Darren Kenny video/fb/video_fb: Fix possible integer overflow It is minimal possibility that the values being used here will overflow. So, change the code to use the safemath function grub_mul() to ensure that doesn't happen. Fixes: CID 73761 Reviewed-by: Daniel Kiper 2021-03-02 Darren Kenny video/fb/video_fb: Fix multiple integer overflows The calculation of the unsigned 64-bit value is being generated by multiplying 2, signed or unsigned, 32-bit integers which may overflow before promotion to unsigned 64-bit. Fix all of them. Fixes: CID 73703, CID 73767, CID 73833 Reviewed-by: Daniel Kiper 2021-03-02 Darren Kenny video/fb/fbfill: Fix potential integer overflow The multiplication of 2 unsigned 32-bit integers may overflow before promotion to unsigned 64-bit. We should ensure that the multiplication is done with overflow detection. Additionally, use grub_sub() for subtraction. Fixes: CID 73640, CID 73697, CID 73702, CID 73823 Reviewed-by: Daniel Kiper 2021-03-02 Darren Kenny video/efi_gop: Remove unnecessary return value of grub_video_gop_fill_mode_info() The return value of grub_video_gop_fill_mode_info() is never able to be anything other than GRUB_ERR_NONE. So, rather than continue to return a value and checking it each time, it is more correct to redefine the function to not return anything and remove checks of its return value altogether. Fixes: CID 96701 Reviewed-by: Daniel Kiper 2021-03-02 Darren Kenny commands/probe: Fix a resource leak when probing disks Every other return statement in this code is calling grub_device_close() to clean up dev before returning. This one should do that too. Fixes: CID 292443 Reviewed-by: Daniel Kiper 2021-03-02 Chris Coulson commands/hashsum: Fix a memory leak check_list() uses grub_file_getline(), which allocates a buffer. If the hash list file contains invalid lines, the function leaks this buffer when it returns an error. Fixes: CID 176635 Reviewed-by: Daniel Kiper 2021-03-02 Darren Kenny normal/completion: Fix leaking of memory when processing a completion It is possible for the code to reach the end of the function without freeing the memory allocated to argv and argc still to be 0. We should always call grub_free(argv). The grub_free() will handle a NULL argument correctly if it reaches that code without the memory being allocated. Fixes: CID 96672 Reviewed-by: Daniel Kiper 2021-03-02 Darren Kenny syslinux: Fix memory leak while parsing In syslinux_parse_real() the 2 points where return is being called didn't release the memory stored in buf which is no longer required. Fixes: CID 176634 Reviewed-by: Daniel Kiper 2021-03-02 Darren Kenny libgcrypt/mpi: Fix possible NULL dereference The code in gcry_mpi_scan() assumes that buffer is not NULL, but there is no explicit check for that, so we add one. Fixes: CID 73757 Reviewed-by: Daniel Kiper 2021-03-02 Darren Kenny libgcrypt/mpi: Fix possible unintended sign extension The array of unsigned char gets promoted to a signed 32-bit int before it is finally promoted to a size_t. There is the possibility that this may result in the signed-bit being set for the intermediate signed 32-bit int. We should ensure that the promotion is to the correct type before we bitwise-OR the values. Fixes: CID 96697 Reviewed-by: Daniel Kiper 2021-03-02 Darren Kenny affs: Fix memory leaks The node structure reference is being allocated but not freed if it reaches the end of the function. If any of the hooks had returned a non-zero value, then node would have been copied in to the context reference, but otherwise node is not stored and should be freed. Similarly, the call to grub_affs_create_node() replaces the allocated memory in node with a newly allocated structure, leaking the existing memory pointed by node. Finally, when dir->parent is set, then we again replace node with newly allocated memory, which seems unnecessary when we copy in the values from dir->parent immediately after. Fixes: CID 73759 Reviewed-by: Daniel Kiper 2021-03-02 Darren Kenny zfsinfo: Correct a check for error allocating memory While arguably the check for grub_errno is correct, we should really be checking the return value from the function since it is always possible that grub_errno was set elsewhere, making this code behave incorrectly. Fixes: CID 73668 Reviewed-by: Daniel Kiper 2021-03-02 Darren Kenny zfs: Fix possible integer overflows In all cases the problem is that the value being acted upon by a left-shift is a 32-bit number which is then being used in the context of a 64-bit number. To avoid overflow we ensure that the number being shifted is 64-bit before the shift is done. Fixes: CID 73684, CID 73695, CID 73764 Reviewed-by: Daniel Kiper 2021-03-02 Paulo Flabiano Smorigo zfs: Fix resource leaks while constructing path There are several exit points in dnode_get_path() that are causing possible memory leaks. In the while(1) the correct exit mechanism should not be to do a direct return, but to instead break out of the loop, setting err first if it is not already set. The reason behind this is that the dnode_path is a linked list, and while doing through this loop, it is being allocated and built up - the only way to correctly unravel it is to traverse it, which is what is being done at the end of the function outside of the loop. Several of the existing exit points correctly did a break, but not all so this change makes that more consistent and should resolve the leaking of memory as found by Coverity. Fixes: CID 73741 Reviewed-by: Daniel Kiper 2021-03-02 Darren Kenny zfs: Fix possible negative shift operation While it is possible for the return value from zfs_log2() to be zero (0), it is quite unlikely, given that the previous assignment to blksz is shifted up by SPA_MINBLOCKSHIFT (9) before 9 is subtracted at the assignment to epbs. But, while unlikely during a normal operation, it may be that a carefully crafted ZFS filesystem could result in a zero (0) value to the dn_datalbkszsec field, which means that the shift left does nothing and assigns zero (0) to blksz, resulting in a negative epbs value. Fixes: CID 73608 Reviewed-by: Daniel Kiper 2021-03-02 Darren Kenny hfsplus: Check that the volume name length is valid HFS+ documentation suggests that the maximum filename and volume name is 255 Unicode characters in length. So, when converting from big-endian to little-endian, we should ensure that the name of the volume has a length that is between 0 and 255, inclusive. Fixes: CID 73641 Reviewed-by: Daniel Kiper 2021-03-02 Darren Kenny disk/cryptodisk: Fix potential integer overflow The encrypt and decrypt functions expect a grub_size_t. So, we need to ensure that the constant bit shift is using grub_size_t rather than unsigned int when it is performing the shift. Fixes: CID 307788 Reviewed-by: Daniel Kiper 2021-03-02 Darren Kenny disk/ldm: Fix memory leak on uninserted lv references The problem here is that the memory allocated to the variable lv is not yet inserted into the list that is being processed at the label fail2. As we can already see at line 342, which correctly frees lv before going to fail2, we should also be doing that at these earlier jumps to fail2. Fixes: CID 73824 Reviewed-by: Daniel Kiper 2021-03-02 Paulo Flabiano Smorigo disk/ldm: If failed then free vg variable too Fixes: CID 73809 Reviewed-by: Daniel Kiper 2021-03-02 Marco A Benatto disk/ldm: Make sure comp data is freed before exiting from make_vg() Several error handling paths in make_vg() do not free comp data before jumping to fail2 label and returning from the function. This will leak memory. So, let's fix all issues of that kind. Fixes: CID 73804 Reviewed-by: Daniel Kiper 2021-03-02 Darren Kenny kern/partition: Check for NULL before dereferencing input string There is the possibility that the value of str comes from an external source and continuing to use it before ever checking its validity is wrong. So, needs fixing. Additionally, drop unneeded part initialization. Fixes: CID 292444 Reviewed-by: Daniel Kiper 2021-03-02 Darren Kenny zstd: Initialize seq_t structure fully While many compilers will initialize this to zero, not all will, so it is better to be sure that fields not being explicitly set are at known values, and there is code that checks this fields value elsewhere in the code. Fixes: CID 292440 Reviewed-by: Daniel Kiper 2021-03-02 Darren Kenny io/lzopio: Resolve unnecessary self-assignment errors These 2 assignments are unnecessary since they are just assigning to themselves. Fixes: CID 73643 Reviewed-by: Daniel Kiper 2021-03-02 Darren Kenny gnulib/regcomp: Fix uninitialized re_token This issue has been fixed in the latest version of gnulib, so to maintain consistency, I've backported that change rather than doing something different. Fixes: CID 73828 Reviewed-by: Daniel Kiper 2021-03-02 Darren Kenny gnulib/regexec: Fix possible null-dereference It appears to be possible that the mctx->state_log field may be NULL, and the name of this function, clean_state_log_if_needed(), suggests that it should be checking that it is valid to be cleaned before assuming that it does. Fixes: CID 86720 Reviewed-by: Daniel Kiper 2021-03-02 Darren Kenny gnulib/argp-help: Fix dereference of a possibly NULL state All other instances of call to __argp_failure() where there is a dgettext() call is first checking whether state is NULL before attempting to dereference it to get the root_argp->argp_domain. Fixes: CID 292436 Reviewed-by: Daniel Kiper 2021-03-02 Darren Kenny gnulib/regcomp: Fix uninitialized token structure The code is assuming that the value of br_token.constraint was initialized to zero when it wasn't. While some compilers will ensure that, not all do, so it is better to fix this explicitly than leave it to chance. Fixes: CID 73749 Reviewed-by: Daniel Kiper 2021-03-02 Darren Kenny gnulib/regexec: Resolve unused variable This is a really minor issue where a variable is being assigned to but not checked before it is overwritten again. The reason for this issue is that we are not building with DEBUG set and this in turn means that the assert() that reads the value of the variable match_last is being processed out. The solution, move the assignment to match_last in to an ifdef DEBUG too. Fixes: CID 292459 Reviewed-by: Daniel Kiper 2021-03-02 Darren Kenny kern/efi/mm: Fix possible NULL pointer dereference The model of grub_efi_get_memory_map() is that if memory_map is NULL, then the purpose is to discover how much memory should be allocated to it for the subsequent call. The problem here is that with grub_efi_is_finished set to 1, there is no check at all that the function is being called with a non-NULL memory_map. While this MAY be true, we shouldn't assume it. The solution to this is to behave as expected, and if memory_map is NULL, then don't try to use it and allow memory_map_size to be filled in, and return 0 as is done later in the code if the buffer is too small (or NULL). Additionally, drop unneeded ret = 1. Fixes: CID 96632 Reviewed-by: Daniel Kiper 2021-03-02 Darren Kenny kern/efi: Fix memory leak on failure Free the memory allocated to name before returning on failure. Fixes: CID 296222 Reviewed-by: Daniel Kiper 2021-03-02 Darren Kenny kern/parser: Fix resource leak if argc == 0 After processing the command-line yet arriving at the point where we are setting argv, we are allocating memory, even if argc == 0, which makes no sense since we never put anything into the allocated argv. The solution is to simply return that we've successfully processed the arguments but that argc == 0, and also ensure that argv is NULL when we're not allocating anything in it. There are only 2 callers of this function, and both are handling a zero value in argc assuming nothing is allocated in argv. Fixes: CID 96680 Reviewed-by: Daniel Kiper 2021-03-02 Darren Kenny net/tftp: Fix dangling memory pointer The static code analysis tool, Parfait, reported that the valid of file->data was left referencing memory that was freed by the call to grub_free(data) where data was initialized from file->data. To ensure that there is no unintentional access to this memory referenced by file->data we should set the pointer to NULL. Reviewed-by: Daniel Kiper 2021-03-02 Darren Kenny net/net: Fix possible dereference to of a NULL pointer It is always possible that grub_zalloc() could fail, so we should check for a NULL return. Otherwise we run the risk of dereferencing a NULL pointer. Fixes: CID 296221 Reviewed-by: Daniel Kiper 2021-03-02 Darren Kenny mmap: Fix memory leak when iterating over mapped memory When returning from grub_mmap_iterate() the memory allocated to present is not being released causing it to leak. Fixes: CID 96655 Reviewed-by: Daniel Kiper 2021-03-02 Javier Martinez Canillas usb: Avoid possible out-of-bound accesses caused by malicious devices The maximum number of configurations and interfaces are fixed but there is no out-of-bound checking to prevent a malicious USB device to report large values for these and cause accesses outside the arrays' memory. Fixes: CVE-2020-25647 Reported-by: Joseph Tartaro Reported-by: Ilja Van Sprundel Reviewed-by: Daniel Kiper 2021-03-02 Javier Martinez Canillas dl: Only allow unloading modules that are not dependencies When a module is attempted to be removed its reference counter is always decremented. This means that repeated rmmod invocations will cause the module to be unloaded even if another module depends on it. This may lead to a use-after-free scenario allowing an attacker to execute arbitrary code and by-pass the UEFI Secure Boot protection. While being there, add the extern keyword to some function declarations in that header file. Fixes: CVE-2020-25632 Reported-by: Chris Coulson Reviewed-by: Daniel Kiper 2021-03-02 Javier Martinez Canillas docs: Document the cutmem command The command is not present in the docs/grub.texi user documentation. Reported-by: Daniel Kiper Reviewed-by: Javier Martinez Canillas 2021-03-02 Javier Martinez Canillas loader/xnu: Don't allow loading extension and packages when locked down The shim_lock verifier validates the XNU kernels but no its extensions and packages. Prevent these to be loaded when the GRUB is locked down. Reviewed-by: Daniel Kiper 2021-03-02 Javier Martinez Canillas gdb: Restrict GDB access when locked down The gdbstub* commands allow to start and control a GDB stub running on local host that can be used to connect from a remote debugger. Restrict this functionality when the GRUB is locked down. Reviewed-by: Daniel Kiper 2021-03-02 Javier Martinez Canillas commands/hdparm: Restrict hdparm command when locked down The command can be used to get/set ATA disk parameters. Some of these can be dangerous since change the disk behavior. Restrict it when locked down. Reviewed-by: Daniel Kiper 2021-03-02 Javier Martinez Canillas commands/setpci: Restrict setpci command when locked down This command can set PCI devices register values, which makes it dangerous in a locked down configuration. Restrict it so can't be used on this setup. Reviewed-by: Daniel Kiper 2021-03-02 Javier Martinez Canillas commands: Restrict commands that can load BIOS or DT blobs when locked down There are some more commands that should be restricted when the GRUB is locked down. Following is the list of commands and reasons to restrict: * fakebios: creates BIOS-like structures for backward compatibility with existing OSes. This should not be allowed when locked down. * loadbios: reads a BIOS dump from storage and loads it. This action should not be allowed when locked down. * devicetree: loads a Device Tree blob and passes it to the OS. It replaces any Device Tree provided by the firmware. This also should not be allowed when locked down. Reviewed-by: Daniel Kiper 2021-03-02 Javier Martinez Canillas mmap: Don't register cutmem and badram commands when lockdown is enforced The cutmem and badram commands can be used to remove EFI memory regions and potentially disable the UEFI Secure Boot. Prevent the commands to be registered if the GRUB is locked down. Fixes: CVE-2020-27779 Reported-by: Teddy Reed Reviewed-by: Daniel Kiper 2021-03-02 Javier Martinez Canillas acpi: Don't register the acpi command when locked down The command is not allowed when lockdown is enforced. Otherwise an attacker can instruct the GRUB to load an SSDT table to overwrite the kernel lockdown configuration and later load and execute unsigned code. Fixes: CVE-2020-14372 Reported-by: Máté Kukri Reviewed-by: Daniel Kiper 2021-03-02 Javier Martinez Canillas efi: Use grub_is_lockdown() instead of hardcoding a disabled modules list Now the GRUB can check if it has been locked down and this can be used to prevent executing commands that can be utilized to circumvent the UEFI Secure Boot mechanisms. So, instead of hardcoding a list of modules that have to be disabled, prevent the usage of commands that can be dangerous. This not only allows the commands to be disabled on other platforms, but also properly separate the concerns. Since the shim_lock verifier logic should be only about preventing to run untrusted binaries and not about defining these kind of policies. Reviewed-by: Daniel Kiper 2021-03-02 Javier Martinez Canillas efi: Lockdown the GRUB when the UEFI Secure Boot is enabled If the UEFI Secure Boot is enabled then the GRUB must be locked down to prevent executing code that can potentially be used to subvert its verification mechanisms. Reviewed-by: Daniel Kiper 2021-03-02 Javier Martinez Canillas kern/lockdown: Set a variable if the GRUB is locked down It may be useful for scripts to determine whether the GRUB is locked down or not. Add the lockdown variable which is set to "y" when the GRUB is locked down. Suggested-by: Dimitri John Ledkov Reviewed-by: Daniel Kiper 2021-03-02 Javier Martinez Canillas kern: Add lockdown support When the GRUB starts on a secure boot platform, some commands can be used to subvert the protections provided by the verification mechanism and could lead to booting untrusted system. To prevent that situation, allow GRUB to be locked down. That way the code may check if GRUB has been locked down and further restrict the commands that are registered or what subset of their functionality could be used. The lockdown support adds the following components: * The grub_lockdown() function which can be used to lockdown GRUB if, e.g., UEFI Secure Boot is enabled. * The grub_is_lockdown() function which can be used to check if the GRUB was locked down. * A verifier that flags OS kernels, the GRUB modules, Device Trees and ACPI tables as GRUB_VERIFY_FLAGS_DEFER_AUTH to defer verification to other verifiers. These files are only successfully verified if another registered verifier returns success. Otherwise, the whole verification process fails. For example, PE/COFF binaries verification can be done by the shim_lock verifier which validates the signatures using the shim_lock protocol. However, the verification is not deferred directly to the shim_lock verifier. The shim_lock verifier is hooked into the verification process instead. * A set of grub_{command,extcmd}_lockdown functions that can be used by code registering command handlers, to only register unsafe commands if the GRUB has not been locked down. Reviewed-by: Daniel Kiper 2021-03-02 Marco A Benatto efi: Move the shim_lock verifier to the GRUB core Move the shim_lock verifier from its own module into the core image. The Secure Boot lockdown mechanism has the intent to prevent the load of any unsigned code or binary when Secure Boot is enabled. The reason is that GRUB must be able to prevent executing untrusted code if UEFI Secure Boot is enabled, without depending on external modules. Reviewed-by: Daniel Kiper 2021-03-02 Marco A Benatto verifiers: Move verifiers API to kernel image Move verifiers API from a module to the kernel image, so it can be used there as well. There are no functional changes in this patch. Reviewed-by: Daniel Kiper 2020-12-18 Glenn Washburn docs: Add documentation of disk size limitations Document the artificially imposed 1 EiB disk size limit and size limitations with LUKS volumes. Fix a few punctuation issues. Reviewed-by: Daniel Kiper 2020-12-18 Glenn Washburn luks2: Use grub_log2ull() to calculate log_sector_size and improve readability Reviewed-by: Daniel Kiper misc: Add grub_log2ull() macro for calculating log base 2 of 64-bit integers Reviewed-by: Daniel Kiper 2020-12-18 Glenn Washburn mips: Enable __clzdi2() This patch is similar to commit 9dab2f51e (sparc: Enable __clzsi2() and __clzdi2()) but for MIPS target and __clzdi2() only, __clzsi2() was already enabled. Suggested-by: Daniel Kiper Reviewed-by: Daniel Kiper 2020-12-18 Glenn Washburn luks2: Better error handling when setting up the cryptodisk Do some sanity checking on data coming from the LUKS2 header. If segment.size is "dynamic", verify that the offset is not past the end of disk. Otherwise, check for errors from grub_strtoull() when converting segment size from string. If a GRUB_ERR_BAD_NUMBER error was returned, then the string was not a valid parsable number, so skip the key. If GRUB_ERR_OUT_OF_RANGE was returned, then there was an overflow in converting to a 64-bit unsigned integer. So this could be a very large disk (perhaps large RAID array). In this case skip the key too. Additionally, enforce some other limits and fail if needed. Reviewed-by: Daniel Kiper 2020-12-18 Glenn Washburn luks2: Do not handle disks of size GRUB_DISK_SIZE_UNKNOWN for now Check to make sure that source disk has a known size. If not, print a message and return error. There are 4 cases where GRUB_DISK_SIZE_UNKNOWN is set (biosdisk, obdisk, ofdisk, and uboot), and in all those cases processing continues. So this is probably a bit conservative. However, 3 of the cases seem pathological, and the other, biosdisk, happens when booting from a CD-ROM. Since I doubt booting from a LUKS2 volume on a CD-ROM is a big use case, we'll error until someone complains. Reviewed-by: Daniel Kiper 2020-12-18 Glenn Washburn luks2: Convert to crypt sectors from GRUB native sectors The function grub_disk_native_sectors(source) returns the number of sectors of source in GRUB native (512-byte) sectors, not source sized sectors. So the conversion needs to use GRUB_DISK_SECTOR_BITS, the GRUB native sector size. Reviewed-by: Daniel Kiper 2020-12-12 Glenn Washburn luks2: Error check segment.sector_size Reviewed-by: Daniel Kiper 2020-12-12 Glenn Washburn cryptodisk: Properly handle non-512 byte sized sectors By default, dm-crypt internally uses an IV that corresponds to 512-byte sectors, even when a larger sector size is specified. What this means is that when using a larger sector size, the IV is incremented every sector. However, the amount the IV is incremented is the number of 512 byte blocks in a sector (i.e. 8 for 4K sectors). Confusingly the IV does not correspond to the number of, for example, 4K sectors. So each 512 byte cipher block in a sector will be encrypted with the same IV and the IV will be incremented afterwards by the number of 512 byte cipher blocks in the sector. There are some encryption utilities which do it the intuitive way and have the IV equal to the sector number regardless of sector size (ie. the fifth sector would have an IV of 4 for each cipher block). And this is supported by dm-crypt with the iv_large_sectors option and also cryptsetup as of 2.3.3 with the --iv-large-sectors, though not with LUKS headers (only with --type plain). However, support for this has not been included as grub does not support plain devices right now. One gotcha here is that the encrypted split keys are encrypted with a hard- coded 512-byte sector size. So even if your data is encrypted with 4K sector sizes, the split key encrypted area must be decrypted with a block size of 512 (ie the IV increments every 512 bytes). This made these changes less aesthetically pleasing than desired. Reviewed-by: Daniel Kiper 2020-12-12 Glenn Washburn luks2: grub_cryptodisk_t->total_sectors is the max number of device native sectors We need to convert the sectors from the size of the underlying device to the cryptodisk sector size; segment.size is in bytes which need to be converted to cryptodisk sectors as well. Also, removed an empty statement. Reviewed-by: Daniel Kiper 2020-12-12 Glenn Washburn cryptodisk: Add macros GRUB_TYPE_U_MAX/MIN(type) to replace literals Add GRUB_TYPE_U_MAX/MIN(type) macros to get the max/min values for an unsigned number with size of type. Reviewed-by: Daniel Kiper 2020-12-12 Glenn Washburn cryptodisk: Add macro GRUB_TYPE_BITS() to replace some literals The new macro GRUB_TYPE_BITS(type) returns the number of bits allocated for type. Reviewed-by: Daniel Kiper 2020-12-12 Glenn Washburn luks2: Add string "index" to user strings using a json index This allows error messages to be more easily distinguishable between indexes and slot keys. The former include the string "index" in the error/debug string, and the later are surrounded in quotes. Reviewed-by: Daniel Kiper 2020-12-12 Glenn Washburn luks2: Rename json index variables to names that they are obviously json indexes Reviewed-by: Daniel Kiper 2020-12-12 Glenn Washburn luks2: Use more intuitive object name instead of json index in user messages Use the object name in the json array rather than the 0 based index in the json array for keyslots, segments, and digests. This is less confusing for the end user. For example, say you have a LUKS2 device with a key in slot 1 and slot 4. When using the password for slot 4 to unlock the device, the messages using the index of the keyslot will mention keyslot 1 (its a zero-based index). Furthermore, with this change the keyslot number will align with the number used to reference the keyslot when using the --key-slot argument to cryptsetup. Reviewed-by: Daniel Kiper 2020-12-12 Glenn Washburn luks2: Add idx member to struct grub_luks2_keyslot/segment/digest This allows code using these structs to know the named key associated with these json data structures. In the future we can use these to provide better error messages to the user. Get rid of idx local variable in luks2_get_keyslot() which was overloaded to be used for both keyslot and segment slot keys. Reviewed-by: Daniel Kiper 2020-12-12 Glenn Washburn luks2: Make sure all fields of output argument in luks2_parse_digest() are written to We should assume that the output argument "out" is uninitialized and could have random data. So, make sure to initialize the segments and keyslots bit fields because potentially not all bits of those fields are written to. Otherwise, the digest could say it belongs to keyslots and segments that it does not. Reviewed-by: Patrick Steinhardt Reviewed-by: Daniel Kiper 2020-12-12 Glenn Washburn luks2: Remove unused argument in grub_error() call Reviewed-by: Patrick Steinhardt Reviewed-by: Daniel Kiper luks2: Convert 8 spaces to tabs Reviewed-by: Patrick Steinhardt Reviewed-by: Daniel Kiper 2020-12-12 Glenn Washburn misc: Add parentheses around ALIGN_UP() and ALIGN_DOWN() arguments This ensures that expected order of operations is preserved when arguments are expressions. Reviewed-by: Patrick Steinhardt Reviewed-by: Daniel Kiper 2020-12-12 Glenn Washburn disk: Rename grub_disk_get_size() to grub_disk_native_sectors() The function grub_disk_get_size() is confusingly named because it actually returns a sector count where the sectors are sized in the GRUB native sector size. Rename to something more appropriate. Suggested-by: Daniel Kiper Reviewed-by: Patrick Steinhardt Reviewed-by: Daniel Kiper 2020-12-12 Glenn Washburn loopback: Do not automaticaly replace existing loopback dev, error instead If there is a loopback device with the same name as the one to be created, instead of closing the old one and replacing it with the new one, return an error instead. If the loopback device was created, its probably being used by something and just replacing it may cause GRUB to crash unexpectedly. This fixes obvious problems like "loopback d (d)/somefile". Its not too onerous to force the user to delete the loopback first with the "-d" switch. Reviewed-by: Daniel Kiper 2020-12-12 Glenn Washburn disk: Move hardcoded max disk size literal to a GRUB_DISK_MAX_SECTORS in disk.h There is a hardcoded maximum disk size that can be read or written from, currently set at 1 EiB in grub_disk_adjust_range(). Move the literal into a macro in disk.h, so our assumptions are more visible. This hard coded limit does not prevent using larger disks, just GRUB won't read/write past the limit. The comment accompanying this restriction didn't quite make sense to me, so its been modified too. Reviewed-by: Daniel Kiper 2020-12-12 Glenn Washburn fs: Fix block lists not being able to address to end of disk sometimes When checking if a block list goes past the end of the disk, make sure the total size of the disk is in GRUB native sector sizes, otherwise there will be blocks at the end of the disk inaccessible by block lists. Reviewed-by: Daniel Kiper 2020-12-12 Vladimir Serbinenko mbr: Document new limitations on MBR gap support Reviewed-by: Daniel Kiper 2020-12-12 Vladimir Serbinenko mbr: Warn if MBR gap is small and user uses advanced modules We don't want to support small MBR gap in pair with anything but the simplest config of biosdisk + part_msdos + simple filesystem. In this path "simple filesystems" are all current filesystems except ZFS and Btrfs. Reviewed-by: Daniel Kiper 2020-12-12 Tianjia Zhang efi/tpm: Extract duplicate code into independent functions Part of the code logic for processing the return value of efi log_extend_event is repetitive and complicated. Extract the repetitive code into an independent function. Reviewed-by: Daniel Kiper 2020-12-12 Tianjia Zhang efi/tpm: Add debug information for device protocol and eventlog Add a number of debug logs to the tpm module. The condition tag for opening debugging is "tpm". On TPM machines, this will bring great convenience to diagnosis and debugging. Reviewed-by: Daniel Kiper 2020-12-12 Daniel Kiper loader/linux: Report the UEFI Secure Boot status to the Linux kernel Now that the GRUB has a grub_efi_get_secureboot() function to check the UEFI Secure Boot status, use it to report that to the Linux kernel. Reviewed-by: Daniel Kiper 2020-12-12 Javier Martinez Canillas efi: Only register shim_lock verifier if shim_lock protocol is found and SB enabled The shim_lock module registers a verifier to call shim's verify, but the handler is registered even when the shim_lock protocol was not installed. This doesn't cause a NULL pointer dereference in shim_lock_write() because the shim_lock_init() function just returns GRUB_ERR_NONE if sl isn't set. But in that case there's no point to even register the shim_lock verifier since won't do anything. Additionally, it is only useful when Secure Boot is enabled. Finally, don't assume that the shim_lock protocol will always be present when the shim_lock_write() function is called, and check for it on every call to this function. Reported-by: Michael Chang Reported-by: Peter Jones Reviewed-by: Daniel Kiper 2020-12-11 Daniel Kiper efi: Add secure boot detection Introduce grub_efi_get_secureboot() function which returns whether UEFI Secure Boot is enabled or not on UEFI systems. Reviewed-by: Daniel Kiper 2020-12-11 Daniel Kiper efi: Add a function to read EFI variables with attributes It will be used to properly detect and report UEFI Secure Boot status to the x86 Linux kernel. The functionality will be added by subsequent patches. Reviewed-by: Daniel Kiper 2020-12-11 Daniel Kiper efi: Return grub_efi_status_t from grub_efi_get_variable() This is needed to properly detect and report UEFI Secure Boot status to the x86 Linux kernel. The functionality will be added by subsequent patches. Reviewed-by: Daniel Kiper 2020-12-11 Daniel Kiper efi: Make shim_lock GUID and protocol type public The GUID will be used to properly detect and report UEFI Secure Boot status to the x86 Linux kernel. The functionality will be added by subsequent patches. The shim_lock protocol type is made public for completeness. Additionally, fix formatting of four preceding GUIDs. Reviewed-by: Daniel Kiper 2020-12-11 Javier Martinez Canillas arm/term: Fix linking error due multiple ps2_state definitions When building with --target=arm-linux-gnu --with-platform=coreboot a linking error occurs caused by multiple definitions of the ps2_state variable. Mark them as static since they aren't used outside their compilation unit. Reviewed-by: Daniel Kiper 2020-12-11 Javier Martinez Canillas include/grub/i386/linux.h: Include missing header This header uses types defined in but does not include it, which leads to compile errors like the following: In file included from ../include/grub/cpu/linux.h:19, from kern/efi/sb.c:21: ../include/grub/i386/linux.h:80:3: error: unknown type name ‘grub_uint64_t’ 80 | grub_uint64_t addr; Reviewed-by: Daniel Kiper 2020-12-11 Javier Martinez Canillas i386: Don't include in coreboot and ieee1275 startup.S Nothing defined in the header file is used in the assembly code but it may lead to build errors if some headers are included through this and contains definitions that are not recognized by the assembler, e.g.: ../include/grub/types.h: Assembler messages: ../include/grub/types.h:76: Error: no such instruction: `typedef signed char grub_int8_t' ../include/grub/types.h:77: Error: no such instruction: `typedef short grub_int16_t' ../include/grub/types.h:78: Error: no such instruction: `typedef int grub_int32_t' Reviewed-by: Daniel Kiper 2020-11-20 Glenn Washburn luks2: Rename index variable "j" to "i" in luks2_get_keyslot() Looping variable "j" was named such because the variable name "i" was taken. Since "i" has been renamed in the previous patch, we can rename "j" to "i". Reviewed-by: Patrick Steinhardt Reviewed-by: Daniel Kiper 2020-11-20 Glenn Washburn luks2: Rename variable "i" to "keyslot_idx" in luks2_get_keyslot() Variables named "i" are usually looping variables. So, rename it to "keyslot_idx" to ease luks2_get_keyslot() reading. Reviewed-by: Patrick Steinhardt Reviewed-by: Daniel Kiper 2020-11-20 Glenn Washburn luks2: Use correct index variable when looping in luks2_get_keyslot() The loop variable "j" should be used to index the digests and segments json array, instead of the variable "i", which is the keyslot index. Reviewed-by: Patrick Steinhardt Reviewed-by: Daniel Kiper 2020-11-20 Glenn Washburn luks2: Rename source disk variable named "disk" to "source" as in luks.c This makes it more obvious to the reader that the disk referred to is the source disk, as opposed to say the disk holding the cryptodisk. Reviewed-by: Patrick Steinhardt Reviewed-by: Daniel Kiper 2020-11-20 Glenn Washburn cryptodisk: Rename "offset" in grub_cryptodisk_t to "offset_sectors" This makes it clear that the offset represents sectors, not bytes, in order to improve readability. Reviewed-by: Patrick Steinhardt Reviewed-by: Daniel Kiper 2020-11-20 Glenn Washburn cryptodisk: Rename "total_length" field in grub_cryptodisk_t to "total_sectors" This creates an alignment with grub_disk_t naming of the same field and is more intuitive as to how it should be used. Reviewed-by: Patrick Steinhardt Reviewed-by: Daniel Kiper 2020-11-20 Glenn Washburn types: Define GRUB_CHAR_BIT based on compiler macro instead of using literal Reviewed-by: Daniel Kiper 2020-11-20 Javier Martinez Canillas include/grub/arm64/linux.h: Include missing header This header uses types defined in but does not include it, which leads to compile errors like the following: ../include/grub/cpu/linux.h:27:3: error: unknown type name ‘grub_uint32_t’ 27 | grub_uint32_t code0; /* Executable code */ | ^~~~~~~~~~~~~ Reviewed-by: Daniel Kiper 2020-11-20 Javier Martinez Canillas include/grub/arm/system.h: Include missing header The header uses the EXPORT_FUNC() macro defined in but doesn't include it, which leads to the following compile error on arm: ../include/grub/cpu/system.h:12:13: error: ‘EXPORT_FUNC’ declared as function returning a function 12 | extern void EXPORT_FUNC(grub_arm_disable_caches_mmu) (void); | ^~~~~~~~~~~ ../include/grub/cpu/system.h:12:1: warning: parameter names (without types) in function declaration 12 | extern void EXPORT_FUNC(grub_arm_disable_caches_mmu) (void); | ^~~~~~ make[3]: *** [Makefile:36581: kern/efi/kernel_exec-sb.o] Error 1 Reviewed-by: Daniel Kiper 2020-11-20 Daniel Axtens docs: grub-install --pubkey has been supported for some time grub-install --pubkey is supported, so we can now document it. Reviewed-by: Daniel Kiper 2020-11-20 Daniel Axtens docs: grub-install is no longer a shell script Since commit cd46aa6cefab in 2013, grub-install hasn't been a shell script. The para doesn't really add that much, especially since it's the user manual, so just drop it. Reviewed-by: Daniel Kiper 2020-10-30 Jacob Kroon Makefile: Remove unused GRUB_PKGLIBDIR definition Reviewed-by: Daniel Kiper 2020-10-30 Daniel Axtens lzma: Fix compilation error under clang 10 Compiling under clang 10 gives: grub-core/lib/LzmaEnc.c:1362:9: error: misleading indentation; statement is not part of the previous 'if' [-Werror,-Wmisleading-indentation] { ^ grub-core/lib/LzmaEnc.c:1358:7: note: previous statement is here if (repIndex == 0) ^ 1 error generated. It's not really that unclear in context: there's a commented-out if-statement. But tweak the alignment anyway so that clang is happy. Reviewed-by: Daniel Kiper 2020-10-30 Cao jin kern/i386/realmode: Update comment Commit b81d609e4c did not update it. Reviewed-by: Daniel Kiper 2020-10-30 Glenn Washburn cryptodisk: Fix cipher IV mode "plain64" always being set as "plain" When setting cipher IV mode, detection is done by prefix matching the cipher IV mode part of the cipher mode string. Since "plain" matches "plain64", we must check for "plain64" first. Otherwise, "plain64" will be detected as "plain". Reviewed-by: Patrick Steinhardt Reviewed-by: Daniel Kiper 2020-09-18 Glenn Washburn crypto: Remove GPG_ERROR_CFLAGS from gpg_err_code_t enum This was probably added by accident when originally creating the file. Reviewed-by: Daniel Kiper 2020-09-18 Glenn Washburn script: Do not allow a delimiter between function name and block start Currently the following is valid syntax but should be a syntax error: grub> function f; { echo HERE; } grub> f HERE This fix is not backward compatible, but current syntax is not documented either and has no functional value. So any scripts with this unintended syntax are technically syntactically incorrect and should not be relying on this behavior. Reviewed-by: Daniel Kiper 2020-09-18 Glenn Washburn docs: Support for loading and concatenating multiple initrds This has been available since January of 2012 but has not been documented. Reviewed-by: Daniel Kiper 2020-09-18 Glenn Washburn lexer: char const * should be const char * Reviewed-by: Daniel Kiper cryptodisk: Use cipher name instead of object in error message Reviewed-by: Daniel Kiper 2020-09-18 Glenn Washburn tests: F2FS test should use MOUNTDEVICE like other tests LODEVICES is not an array variable and should not be accessed as such. This allows the f2fs test to pass as it was failing because a device name had a space prepended to the path. Acked-by: Jaegeuk Kim Tested-by: Paul Menzel Reviewed-by: Daniel Kiper 2020-09-18 Florian La Roche grub-mkconfig: If $hints is not set reduce the output into grub.cfg to just 1 line Reviewed-by: Daniel Kiper 2020-09-18 Petr Vorel travis: Run bootstrap to fix build autogen.sh isn't enough: $ ./autogen.sh Gnulib not yet bootstrapped; run ./bootstrap instead. The command "./autogen.sh" exited with 1. Additionally, using bootstrap requires to install autopoint package. Reviewed-by: Daniel Kiper 2020-09-18 Patrick Steinhardt luks2: Strip dashes off of the UUID The UUID header for LUKS2 uses a format with dashes, same as for LUKS(1). But while we strip these dashes for the latter, we don't for the former. This isn't wrong per se, but it's definitely inconsistent for users as they need to use the dashed format for LUKS2 and the non-dashed format for LUKS when e.g. calling "cryptomount -u $UUID". Fix this inconsistency by stripping dashes off of the LUKS2 UUID. Reviewed-by: Daniel Kiper 2020-09-18 Tianjia Zhang efi/tpm: Remove unused functions and structures Although the tpm_execute() series of functions are defined they are not used anywhere. Several structures in the include/grub/efi/tpm.h header file are not used too. There is even nonexistent grub_tpm_init() declaration in this header. Delete all that unneeded stuff. If somebody needs the functionality implemented in the dropped code then he/she can re-add it later. Now it needlessly increases the GRUB code/image size. Reviewed-by: Daniel Kiper 2020-09-18 Tianjia Zhang shim_lock: Enable module for all EFI architectures Like the tpm the shim_lock module is only enabled for x86_64 target. However, there's nothing specific to x86_64 in the implementation and it can be enabled for all EFI architectures. Reviewed-by: Daniel Kiper 2020-09-18 Daniel Kiper efi/tpm: Fix typo in grub_efi_tpm2_protocol struct Rename get_active_pcr_blanks() to get_active_pcr_banks(). Reviewed-by: Javier Martinez Canillas 2020-09-18 Daniel Kiper i386/efi/init: Drop bogus include Reviewed-by: Javier Martinez Canillas 2020-09-18 Daniel Kiper docs: Fix devicetree command description Specifically fix the subsection and drop bogus reference to the GNU/Linux. Reported-by: Patrick Higgins Reviewed-by: Javier Martinez Canillas 2020-09-18 Martin Whitaker grub-install: Fix inverted test for NLS enabled when copying locales Commit 3d8439da8 (grub-install: Locale depends on nls) attempted to avoid copying locale files to the target directory when NLS was disabled. However the test is inverted, and it does the opposite. Reviewed-by: Javier Martinez Canillas 2020-09-11 Javier Martinez Canillas tftp: Roll-over block counter to prevent data packets timeouts Commit 781b3e5efc3 (tftp: Do not use priority queue) caused a regression when fetching files over TFTP whose size is bigger than 65535 * block size. grub> linux /images/pxeboot/vmlinuz grub> echo $? 0 grub> initrd /images/pxeboot/initrd.img error: timeout reading '/images/pxeboot/initrd.img'. grub> echo $? 28 It is caused by the block number counter being a 16-bit field, which leads to a maximum file size of ((1 << 16) - 1) * block size. Because GRUB sets the block size to 1024 octets (by using the TFTP Blocksize Option from RFC 2348 [0]), the maximum file size that can be transferred is 67107840 bytes. The TFTP PROTOCOL (REVISION 2) RFC 1350 [1] does not mention what a client should do when a file size is bigger than the maximum, but most TFTP hosts support the block number counter to be rolled over. That is, acking a data packet with a block number of 0 is taken as if the 65356th block was acked. It was working before because the block counter roll-over was happening due an overflow. But that got fixed by the mentioned commit, which led to the regression when attempting to fetch files larger than the maximum size. To allow TFTP file transfers of unlimited size again, re-introduce a block counter roll-over so the data packets are acked preventing the timeouts. [0]: https://tools.ietf.org/html/rfc2348 [1]: https://tools.ietf.org/html/rfc1350 Fixes: 781b3e5efc3 (tftp: Do not use priority queue) Suggested-by: Peter Jones Reviewed-by: Daniel Kiper 2020-09-11 Florian La Roche templates: Remove unnecessary trailing semicolon Reviewed-by: Daniel Kiper 2020-09-11 Glenn Washburn cryptodisk: Fix incorrect calculation of start sector Here dev is a grub_cryptodisk_t and dev->offset is offset in sectors of size native to the cryptodisk device. The sector is correctly transformed into native grub sector size, but then added to dev->offset which is not transformed. It would be nice if the type system would help us with this. Reviewed-by: Patrick Steinhardt Reviewed-by: Daniel Kiper 2020-09-11 Glenn Washburn cryptodisk: Unregister cryptomount command when removing module Reviewed-by: Patrick Steinhardt Reviewed-by: Daniel Kiper 2020-09-11 Patrick Steinhardt luks2: Improve error reporting when decrypting/verifying key While we already set up error messages in both luks2_verify_key() and luks2_decrypt_key(), we do not ever print them. This makes it really hard to discover why a given key actually failed to decrypt a disk. Improve this by including the error message in the user-visible output. Reviewed-by: Daniel Kiper 2020-09-11 Patrick Steinhardt luks: Fix out-of-bounds copy of UUID When configuring a LUKS disk, we copy over the UUID from the LUKS header into the new grub_cryptodisk_t structure via grub_memcpy(). As size we mistakenly use the size of the grub_cryptodisk_t UUID field, which is guaranteed to be strictly bigger than the LUKS UUID field we're copying. As a result, the copy always goes out-of-bounds and copies some garbage from other surrounding fields. During runtime, this isn't noticed due to the fact that we always NUL-terminate the UUID and thus never hit the trailing garbage. Fix the issue by using the size of the local stripped UUID field. Reviewed-by: Daniel Kiper 2020-09-11 Patrick Steinhardt json: Remove invalid typedef redefinition The C standard does not allow for typedef redefinitions, even if they map to the same underlying type. In order to avoid including the jsmn.h in json.h and thus exposing jsmn's internals, we have exactly such a forward-declaring typedef in json.h. If enforcing the GNU99 C standard, clang may generate a warning about this non-standard construct. Fix the issue by using a simple "struct jsmntok" forward declaration instead of using a typedef. Tested-by: Chuck Tuffli Reviewed-by: Daniel Kiper 2020-09-11 Cao jin i386/relocator_common: Drop empty #ifdef Reviewed-by: Daniel Kiper 2020-09-11 Ave Milia video/bochs: Fix typo Reviewed-by: Daniel Kiper 2020-07-29 Colin Watson linux: Fix integer overflows in initrd size handling These could be triggered by a crafted filesystem with very large files. Fixes: CVE-2020-15707 Reviewed-by: Jan Setje-Eilers Reviewed-by: Daniel Kiper 2020-07-29 Peter Jones loader/linux: Avoid overflow on initrd size calculation Reviewed-by: Daniel Kiper 2020-07-29 Alexey Makhalov efi: Fix use-after-free in halt/reboot path commit 92bfc33db984 ("efi: Free malloc regions on exit") introduced memory freeing in grub_efi_fini(), which is used not only by exit path but by halt/reboot one as well. As result of memory freeing, code and data regions used by modules, such as halt, reboot, acpi (used by halt) also got freed. After return to module code, CPU executes, filled by UEFI firmware (tested with edk2), 0xAFAFAFAF pattern as a code. Which leads to #UD exception later. grub> halt !!!! X64 Exception Type - 06(#UD - Invalid Opcode) CPU Apic ID - 00000000 !!!! RIP - 0000000003F4EC28, CS - 0000000000000038, RFLAGS - 0000000000200246 RAX - 0000000000000000, RCX - 00000000061DA188, RDX - 0A74C0854DC35D41 RBX - 0000000003E10E08, RSP - 0000000007F0F860, RBP - 0000000000000000 RSI - 00000000064DB768, RDI - 000000000832C5C3 R8 - 0000000000000002, R9 - 0000000000000000, R10 - 00000000061E2E52 R11 - 0000000000000020, R12 - 0000000003EE5C1F, R13 - 00000000061E0FF4 R14 - 0000000003E10D80, R15 - 00000000061E2F60 DS - 0000000000000030, ES - 0000000000000030, FS - 0000000000000030 GS - 0000000000000030, SS - 0000000000000030 CR0 - 0000000080010033, CR2 - 0000000000000000, CR3 - 0000000007C01000 CR4 - 0000000000000668, CR8 - 0000000000000000 DR0 - 0000000000000000, DR1 - 0000000000000000, DR2 - 0000000000000000 DR3 - 0000000000000000, DR6 - 00000000FFFF0FF0, DR7 - 0000000000000400 GDTR - 00000000079EEA98 0000000000000047, LDTR - 0000000000000000 IDTR - 0000000007598018 0000000000000FFF, TR - 0000000000000000 FXSAVE_STATE - 0000000007F0F4C0 Proposal here is to continue to free allocated memory for exit boot services path but keep it for halt/reboot path as it won't be much security concern here. Introduced GRUB_LOADER_FLAG_EFI_KEEP_ALLOCATED_MEMORY loader flag to be used by efi halt/reboot path. Reviewed-by: Darren Kenny Reviewed-by: Daniel Kiper 2020-07-29 Daniel Kiper efi/chainloader: Propagate errors from copy_file_path() Without any error propagated to the caller, make_file_path() would then try to advance the invalid device path node with GRUB_EFI_NEXT_DEVICE_PATH(), which would fail, returning a NULL pointer that would subsequently be dereferenced. Hence, propagate errors from copy_file_path(). Reviewed-by: Daniel Kiper 2020-07-29 Peter Jones efi: Fix some malformed device path arithmetic errors Several places we take the length of a device path and subtract 4 from it, without ever checking that it's >= 4. There are also cases where this kind of malformation will result in unpredictable iteration, including treating the length from one dp node as the type in the next node. These are all errors, no matter where the data comes from. This patch adds a checking macro, GRUB_EFI_DEVICE_PATH_VALID(), which can be used in several places, and makes GRUB_EFI_NEXT_DEVICE_PATH() return NULL and GRUB_EFI_END_ENTIRE_DEVICE_PATH() evaluate as true when the length is too small. Additionally, it makes several places in the code check for and return errors in these cases. Reviewed-by: Daniel Kiper 2020-07-29 Peter Jones emu: Make grub_free(NULL) safe The grub_free() implementation in grub-core/kern/mm.c safely handles NULL pointers, and code at many places depends on this. We don't know that the same is true on all host OSes, so we need to handle the same behavior in grub-emu's implementation. Reviewed-by: Darren Kenny Reviewed-by: Daniel Kiper 2020-07-29 Peter Jones lvm: Fix two more potential data-dependent alloc overflows It appears to be possible to make a (possibly invalid) lvm PV with a metadata size field that overflows our type when adding it to the address we've allocated. Even if it doesn't, it may be possible to do so with the math using the outcome of that as an operand. Check them both. Reviewed-by: Daniel Kiper 2020-07-29 Peter Jones hfsplus: Fix two more overflows Both node->size and node->namelen come from the supplied filesystem, which may be user-supplied. We can't trust them for the math unless we know they don't overflow. Making sure they go through grub_add() or grub_calloc() first will give us that. Reviewed-by: Darren Kenny Reviewed-by: Daniel Kiper 2020-07-29 Alexey Makhalov relocator: Fix grub_relocator_alloc_chunk_align() top memory allocation Current implementation of grub_relocator_alloc_chunk_align() does not allow allocation of the top byte. Assuming input args are: max_addr = 0xfffff000; size = 0x1000; And this is valid. But following overflow protection will unnecessarily move max_addr one byte down (to 0xffffefff): if (max_addr > ~size) max_addr = ~size; ~size + 1 will fix the situation. In addition, check size for non zero to do not zero max_addr. Reviewed-by: Daniel Kiper 2020-07-29 Chris Coulson script: Avoid a use-after-free when redefining a function during execution Defining a new function with the same name as a previously defined function causes the grub_script and associated resources for the previous function to be freed. If the previous function is currently executing when a function with the same name is defined, this results in use-after-frees when processing subsequent commands in the original function. Instead, reject a new function definition if it has the same name as a previously defined function, and that function is currently being executed. Although a behavioural change, this should be backwards compatible with existing configurations because they can't be dependent on the current behaviour without being broken. Fixes: CVE-2020-15706 Reviewed-by: Daniel Kiper 2020-07-29 Chris Coulson script: Remove unused fields from grub_script_function struct Reviewed-by: Daniel Kiper 2020-07-29 Alexey Makhalov relocator: Protect grub_relocator_alloc_chunk_align() max_addr against integer underflow This commit introduces integer underflow mitigation in max_addr calculation in grub_relocator_alloc_chunk_align() invocation. It consists of 2 fixes: 1. Introduced grub_relocator_alloc_chunk_align_safe() wrapper function to perform sanity check for min/max and size values, and to make safe invocation of grub_relocator_alloc_chunk_align() with validated max_addr value. Replace all invocations such as grub_relocator_alloc_chunk_align(..., min_addr, max_addr - size, size, ...) by grub_relocator_alloc_chunk_align_safe(..., min_addr, max_addr, size, ...). 2. Introduced UP_TO_TOP32(s) macro for the cases where max_addr is 32-bit top address (0xffffffff - size + 1) or similar. Reviewed-by: Daniel Kiper 2020-07-29 Alexey Makhalov relocator: Protect grub_relocator_alloc_chunk_addr() input args against integer underflow/overflow Use arithmetic macros from safemath.h to accomplish it. In this commit, I didn't want to be too paranoid to check every possible math equation for overflow/underflow. Only obvious places (with non zero chance of overflow/underflow) were refactored. Reviewed-by: Daniel Kiper 2020-07-29 Alexey Makhalov tftp: Do not use priority queue There is not need to reassemble the order of blocks. Per RFC 1350, server must wait for the ACK, before sending next block. Data packets can be served immediately without putting them to priority queue. Logic to handle incoming packet is this: - if packet block id equal to expected block id, then process the packet, - if packet block id is less than expected - this is retransmit of old packet, then ACK it and drop the packet, - if packet block id is more than expected - that shouldn't happen, just drop the packet. It makes the tftp receive path code simpler, smaller and faster. As a benefit, this change fixes CID# 73624 and CID# 96690, caused by following while loop: while (cmp_block (grub_be_to_cpu16 (tftph->u.data.block), data->block + 1) == 0) where tftph pointer is not moving from one iteration to another, causing to serve same packet again. Luckily, double serving didn't happen due to data->block++ during the first iteration. Fixes: CID 73624, CID 96690 Reviewed-by: Daniel Kiper 2020-07-29 Konrad Rzeszutek Wilk multiboot2: Fix memory leak if grub_create_loader_cmdline() fails Fixes: CID 292468 Reviewed-by: Daniel Kiper 2020-07-29 Konrad Rzeszutek Wilk udf: Fix memory leak Fixes: CID 73796 Reviewed-by: Daniel Kiper Reviewed-by: Jan Setje-Eilers 2020-07-29 Konrad Rzeszutek Wilk term: Fix overflow on user inputs This requires a very weird input from the serial interface but can cause an overflow in input_buf (keys) overwriting the next variable (npending) with the user choice: (pahole output) struct grub_terminfo_input_state { int input_buf[6]; /* 0 24 */ int npending; /* 24 4 */ <- CORRUPT ...snip... The magic string requires causing this is "ESC,O,],0,1,2,q" and we overflow npending with "q" (aka increase npending to 161). The simplest fix is to just to disallow overwrites input_buf, which exactly what this patch does. Fixes: CID 292449 Reviewed-by: Daniel Kiper 2020-07-29 Konrad Rzeszutek Wilk lzma: Make sure we don't dereference past array The two dimensional array p->posSlotEncoder[4][64] is being dereferenced using the GetLenToPosState() macro which checks if len is less than 5, and if so subtracts 2 from it. If len = 0, that is 0 - 2 = 4294967294. Obviously we don't want to dereference that far out so we check if the position found is greater or equal kNumLenToPosStates (4) and bail out. N.B.: Upstream LZMA 18.05 and later has this function completely rewritten without any history. Fixes: CID 51526 Reviewed-by: Daniel Kiper 2020-07-29 Chris Coulson json: Avoid a double-free when parsing fails. When grub_json_parse() succeeds, it returns the root object which contains a pointer to the provided JSON string. Callers are responsible for ensuring that this string outlives the root object and for freeing its memory when it's no longer needed. If grub_json_parse() fails to parse the provided JSON string, it frees the string before returning an error. This results in a double free in luks2_recover_key(), which also frees the same string after grub_json_parse() returns an error. This changes grub_json_parse() to never free the JSON string passed to it, and updates the documentation for it to make it clear that callers are responsible for ensuring that the string outlives the root JSON object. Fixes: CID 292465 Reviewed-by: Daniel Kiper 2020-07-29 Alexey Makhalov xnu: Fix double free in grub_xnu_devprop_add_property() grub_xnu_devprop_add_property() should not free utf8 and utf16 as it get allocated and freed in the caller. Minor improvement: do prop fields initialization after memory allocations. Fixes: CID 292442, CID 292457, CID 292460, CID 292466 Reviewed-by: Daniel Kiper 2020-07-29 Alexey Makhalov gfxmenu: Fix double free in load_image() self->bitmap should be zeroed after free. Otherwise, there is a chance to double free (USE_AFTER_FREE) it later in rescale_image(). Fixes: CID 292472 Reviewed-by: Daniel Kiper 2020-07-29 Daniel Kiper font: Do not load more than one NAME section The GRUB font file can have one NAME section only. Though if somebody crafts a broken font file with many NAME sections and loads it then the GRUB leaks memory. So, prevent against that by loading first NAME section and failing in controlled way on following one. Reported-by: Chris Coulson Reviewed-by: Jan Setje-Eilers 2020-07-29 Peter Jones iso9660: Don't leak memory on realloc() failures Reviewed-by: Daniel Kiper 2020-07-29 Peter Jones malloc: Use overflow checking primitives where we do complex allocations This attempts to fix the places where we do the following where arithmetic_expr may include unvalidated data: X = grub_malloc(arithmetic_expr); It accomplishes this by doing the arithmetic ahead of time using grub_add(), grub_sub(), grub_mul() and testing for overflow before proceeding. Among other issues, this fixes: - allocation of integer overflow in grub_video_bitmap_create() reported by Chris Coulson, - allocation of integer overflow in grub_png_decode_image_header() reported by Chris Coulson, - allocation of integer overflow in grub_squash_read_symlink() reported by Chris Coulson, - allocation of integer overflow in grub_ext2_read_symlink() reported by Chris Coulson, - allocation of integer overflow in read_section_as_string() reported by Chris Coulson. Fixes: CVE-2020-14309, CVE-2020-14310, CVE-2020-14311 Reviewed-by: Daniel Kiper 2020-07-29 Peter Jones calloc: Use calloc() at most places This modifies most of the places we do some form of: X = malloc(Y * Z); to use calloc(Y, Z) instead. Among other issues, this fixes: - allocation of integer overflow in grub_png_decode_image_header() reported by Chris Coulson, - allocation of integer overflow in luks_recover_key() reported by Chris Coulson, - allocation of integer overflow in grub_lvm_detect() reported by Chris Coulson. Fixes: CVE-2020-14308 Reviewed-by: Daniel Kiper 2020-07-29 Peter Jones calloc: Make sure we always have an overflow-checking calloc() available This tries to make sure that everywhere in this source tree, we always have an appropriate version of calloc() (i.e. grub_calloc(), xcalloc(), etc.) available, and that they all safely check for overflow and return NULL when it would occur. Reviewed-by: Daniel Kiper 2020-07-29 Peter Jones safemath: Add some arithmetic primitives that check for overflow This adds a new header, include/grub/safemath.h, that includes easy to use wrappers for __builtin_{add,sub,mul}_overflow() declared like: bool OP(a, b, res) where OP is grub_add, grub_sub or grub_mul. OP() returns true in the case where the operation would overflow and res is not modified. Otherwise, false is returned and the operation is executed. These arithmetic primitives require newer compiler versions. So, bump these requirements in the INSTALL file too. Reviewed-by: Daniel Kiper 2020-07-29 Peter Jones yylex: Make lexer fatal errors actually be fatal When presented with a command that can't be tokenized to anything smaller than YYLMAX characters, the parser calls YY_FATAL_ERROR(errmsg), expecting that will stop further processing, as such: #define YY_DO_BEFORE_ACTION \ yyg->yytext_ptr = yy_bp; \ yyleng = (int) (yy_cp - yy_bp); \ yyg->yy_hold_char = *yy_cp; \ *yy_cp = '\0'; \ if ( yyleng >= YYLMAX ) \ YY_FATAL_ERROR( "token too large, exceeds YYLMAX" ); \ yy_flex_strncpy( yytext, yyg->yytext_ptr, yyleng + 1 , yyscanner); \ yyg->yy_c_buf_p = yy_cp; The code flex generates expects that YY_FATAL_ERROR() will either return for it or do some form of longjmp(), or handle the error in some way at least, and so the strncpy() call isn't in an "else" clause, and thus if YY_FATAL_ERROR() is *not* actually fatal, it does the call with the questionable limit, and predictable results ensue. Unfortunately, our implementation of YY_FATAL_ERROR() is: #define YY_FATAL_ERROR(msg) \ do { \ grub_printf (_("fatal error: %s\n"), _(msg)); \ } while (0) The same pattern exists in yyless(), and similar problems exist in users of YY_INPUT(), several places in the main parsing loop, yy_get_next_buffer(), yy_load_buffer_state(), yyensure_buffer_stack, yy_scan_buffer(), etc. All of these callers expect YY_FATAL_ERROR() to actually be fatal, and the things they do if it returns after calling it are wildly unsafe. Fixes: CVE-2020-10713 Reviewed-by: Daniel Kiper 2020-05-25 Marc Zyngier arm: Fix 32-bit ARM handling of the CTR register When booting on an ARMv8 core that implements either CTR.IDC or CTR.DIC (indicating that some of the cache maintenance operations can be removed when dealing with I/D-cache coherency, GRUB dies with a "Unsupported cache type 0x........" message. This is pretty likely to happen when running in a virtual machine hosted on an arm64 machine (I've triggered it on a system built around a bunch of Cortex-A55 cores, which implements CTR.IDC). It turns out that the way GRUB deals with the CTR register is a bit harsh for anything from ARMv7 onwards. The layout of the register is backward compatible, meaning that nothing that gets added is allowed to break earlier behaviour. In this case, ignoring IDC is completely fine, and only results in unnecessary cache maintenance. We can thus avoid being paranoid, and align the 32bit behaviour with its 64bit equivalent. This patch has the added benefit that it gets rid of a (gnu-specific) case range too. Reviewed-by: Leif Lindholm Reviewed-by: Daniel Kiper 2020-05-25 Ian Jackson templates/20_linux_xen: Support Xen Security Modules (XSM/FLASK) XSM is enabled by adding "flask=enforcing" as a Xen command line argument, and providing the policy file as a grub module. We make entries for both with and without XSM. If XSM is not compiled into Xen, then there are no policy files, so no change to the boot options. Reviewed-by: Daniel Kiper 2020-05-25 Ian Jackson templates/20_linux_xen: Ignore xenpolicy and config files too file_is_not_sym() currently only checks for xen-syms. Extend it to disregard xenpolicy (XSM policy files) and files ending .config (which are built by the Xen upstream build system in some configurations and can therefore end up in /boot). Rename the function accordingly, to file_is_not_xen_garbage(). Reviewed-by: Daniel Kiper 2020-05-25 Javier Martinez Canillas net: Break out nested function Nested functions are not supported in C, but are permitted as an extension in the GNU C dialect. Commit cb2f15c5448 ("normal/main: Search for specific config files for netboot") added a nested function which caused the build to break when compiling with clang. Break that out into a static helper function to make the code portable again. Reported-by: Daniel Axtens Tested-by: Daniel Axtens Reviewed-by: Daniel Kiper 2020-05-25 Javier Martinez Canillas tpm: Enable module for all EFI platforms The module is only enabled for x86_64, but there's nothing specific to x86_64 in the implementation and can be enabled for all EFI platforms. Reviewed-by: Daniel Kiper 2020-05-25 Daniel Kiper INSTALL/configure: Update install doc and configure comment ..to reflect the GRUB build reality in them. Additionally, fix text formatting a bit. Reviewed-by: Leif Lindholm 2020-05-25 Daniel Kiper configure: Set gnu99 C language standard by default Commit d5a32255d (misc: Make grub_strtol() "end" pointers have safer const qualifiers) introduced "restrict" keyword into some functions definitions. This keyword was introduced in C99 standard. However, some compilers by default may use C89 or something different. This behavior leads to the breakage during builds when c89 or gnu89 is in force. So, let's set gnu99 C language standard for all compilers by default. This way a bit random build issue will be fixed and the GRUB source will be build consistently regardless of type and version of the compiler. It was decided to use gnu99 C language standard because it fixes the issue mentioned above and also provides some useful extensions which are used here and there in the GRUB source. Potentially we can use gnu11 too. However, this may reduce pool of older compilers which can be used to build the GRUB. So, let's live with gnu99 until we discover that we strongly require a feature from newer C standard. The user is still able to override C language standard using relevant *_CFLAGS variables. Reviewed-by: Leif Lindholm 2020-05-15 Tianjia Zhang tpm: Rename function grub_tpm_log_event() to grub_tpm_measure() grub_tpm_log_event() and grub_tpm_measure() are two functions that have the same effect. So, keep grub_tpm_log_event() and rename it to grub_tpm_measure(). This way we get also a more clear semantics. Reviewed-by: Daniel Kiper 2020-05-15 Daniel Kiper autogen: Replace -iname with -ipath in find command ..because -iname cannot be used to match paths. Reviewed-by: Javier Martinez Canillas Reviewed-by: Leif Lindholm Reviewed-by: Daniel Axtens 2020-05-15 Daniel Kiper INSTALL: Update configure example ..to make it more relevant. Reviewed-by: Leif Lindholm 2020-05-15 Daniel Kiper configure: Drop unneeded TARGET_CFLAGS expansion Reviewed-by: Javier Martinez Canillas Reviewed-by: Leif Lindholm 2020-05-15 Jacob Kroon docs/grub: Support for probing partition UUID on MSDOS disks Support was implemented in commit c7cb11b21 (probe: Support probing for msdos PARTUUID). Reviewed-by: Daniel Kiper 2020-05-15 Tianjia Zhang verifiers: Add verify string debug message Like grub_verifiers_open(), the grub_verify_string() should also display this debug message, which is very helpful for debugging. Reviewed-by: Daniel Kiper 2020-05-15 Javier Martinez Canillas envblk: Fix buffer overrun when attempting to shrink a variable value If an existing variable is set with a value whose length is smaller than the current value, a memory corruption can happen due copying padding '#' characters outside of the environment block buffer. This is caused by a wrong calculation of the previous free space position after moving backward the characters that followed the old variable value. That position is calculated to fill the remaining of the buffer with the padding '#' characters. But since isn't calculated correctly, it can lead to copies outside of the buffer. The issue can be reproduced by creating a variable with a large value and then try to set a new value that is much smaller: $ grub2-editenv --version grub2-editenv (GRUB) 2.04 $ grub2-editenv env create $ grub2-editenv env set a="$(for i in {1..500}; do var="b$var"; done; echo $var)" $ wc -c env 1024 grubenv $ grub2-editenv env set a="$(for i in {1..50}; do var="b$var"; done; echo $var)" malloc(): corrupted top size Aborted (core dumped) $ wc -c env 0 grubenv Reported-by: Renaud Métrich Reviewed-by: Daniel Kiper 2020-05-15 Hans Ulrich Niedermann docs: Remove docs for non-existing uppermem command Remove all documentation of and mentions of the uppermem command from the docs/grub.texi file. The uppermem command is not implemented in the GRUB source at all and appears to never have been implemented despite former plans to add an uppermem command. To reduce user confusion, this even removes the paragraph describing how GRUB's uppermem command was supposed to complement the Linux kernel's mem= parameter. Reviewed-by: Daniel Kiper 2020-05-15 Hans Ulrich Niedermann docs: Remove docs for non-existing pxe_unload command Remove the documentation of the pxe_unload command from the docs/grub.texi file. The pxe_unload command is not implemented in the grub source at this time at all. It appears to have been removed in commit 671a78acb (cleanup pxe and efi network release). Reviewed-by: Daniel Kiper 2020-05-15 Hans Ulrich Niedermann gitignore: Add a few forgotten file patterns Add a few patterns to .gitignore to cover files which are generated by building grub ("make", "make check", "make dist") but which have been forgotten to add to .gitignore in the past. Reviewed-by: Daniel Kiper 2020-05-15 Hans Ulrich Niedermann gitignore: Add leading slashes where appropriate Going through the list of gitignore patterns without a leading slash, this adds a leading slash where it appears to have been forgotten. Some gitignore patterns like ".deps/" or "Makefile" clearly should match everywhere, so those definitively need no leading slash. For some patterns like "ascii.bitmaps", it is unclear where in the source tree they should match. Those patterns are kept as they are, matching the patterns in the whole tree of subdirectories. Reviewed-by: Daniel Kiper 2020-05-15 Hans Ulrich Niedermann gitignore: Add trailing slashes for directories Add trailing slashes for all patterns matching directories. Note that we do *not* add trailing slashes for *symlinks* to directories. Reviewed-by: Daniel Kiper 2020-05-15 Hans Ulrich Niedermann gitignore: Sort both pattern groups alphabetically Alphabetically sort the two groups of gitignore patterns: * The group of patterns without slashes, matching anywhere in the directory subtree. * The group of patterns with slashes, matching relative to the .gitignore file's directory Reviewed-by: Daniel Kiper 2020-05-15 Hans Ulrich Niedermann gitignore: Group patterns with and without slash Group the .gitignore patterns into two groups: * Pattern not including a slash, i.e. matching files anywhere in the .gitignore file's directory and all of its subdirectories. * Patterns including a slash, i.e. matching only relative to the .gitignore file's directory. Reviewed-by: Daniel Kiper 2020-05-15 Hans Ulrich Niedermann gitignore: Consistent leading slash is easier to read As all gitignore patterns containing a left or middle slash match only relative to the .gitignore file's directory, we write them all in the same manner with a leading slash. This makes the file significantly easier to read. Reviewed-by: Daniel Kiper 2020-05-15 Daniel Kiper mips/cache: Add missing nop's in delay slots Lack of them causes random instructions to be executed before the jump really happens. Reviewed-by: Daniel Kiper 2020-04-21 Patrick Steinhardt luks2: Propagate error when reading area key fails When decrypting a given keyslot, all error cases except for one set up an error and return the error code. The only exception is when we try to read the area key: instead of setting up an error message, we directly print it via grub_dprintf(). Convert the outlier to use grub_error() to allow more uniform handling of errors. Reviewed-by: Daniel Kiper 2020-04-21 Patrick Steinhardt json: Get rid of casts for "jsmntok_t" With the upstream change having landed that adds a name to the previously anonymous "jsmntok" typedef, we can now add a forward declaration for that struct in our code. As a result, we no longer have to store the "tokens" member of "struct grub_json" as a void pointer but can instead use the forward declaration, allowing us to get rid of casts of that field. Reviewed-by: Daniel Kiper 2020-04-21 Patrick Steinhardt json: Update jsmn library to upstream commit 053d3cd Update our embedded version of the jsmn library to upstream commit 053d3cd (Merge pull request #175 from pks-t/pks/struct-type, 2020-04-02). Reviewed-by: Daniel Kiper 2020-04-21 Steve Langasek templates: Output a menu entry for firmware setup on UEFI FastBoot systems The fwsetup command allows to reboot into the EFI firmware setup menu, add a template to include a menu entry on EFI systems that makes use of that command to reboot into the EFI firmware settings. This is useful for users since the hotkey to enter into the EFI setup menu may not be the same on all systems so users can use the menu entry without needing to figure out what key needs to be pressed. Also, if fastboot is enabled in the BIOS then often it is not possible to enter the firmware setup menu. So the entry is again useful for this case. Reviewed-by: Daniel Kiper 2020-04-21 Hans de Goede kern/term: Accept ESC, F4 and holding SHIFT as user interrupt keys On some devices the ESC key is the hotkey to enter the BIOS/EFI setup screen, making it really hard to time pressing it right. Besides that ESC is also pretty hard to discover for a user who does not know it will unhide the menu. This commit makes F4, which was chosen because is not used as a hotkey to enter the BIOS setup by any vendor, also interrupt sleeps / stop the menu countdown. This solves the ESC gets into the BIOS setup and also somewhat solves the discoverability issue, but leaves the timing issue unresolved. This commit fixes the timing issue by also adding support for keeping SHIFT pressed during boot to stop the menu countdown. This matches what Ubuntu is doing, which should also help with discoverability. Reviewed-by: Daniel Kiper 2020-04-21 Hans de Goede efi/console: Do not set text-mode until we actually need it If we're running with a hidden menu we may never need text mode, so do not change the video-mode to text until we actually need it. This allows to boot a machine without unnecessary graphical transitions and provide a seamless boot experience to users. Reviewed-by: Daniel Kiper 2020-04-21 Hans de Goede efi/console: Implement getkeystatus() support Implement getkeystatus() support in the EFI console driver. This is needed because the logic to determine if a key was pressed to make the menu countdown stop will be changed by a later patch to also take into account the SHIFT key being held down. For this reason the EFI console driver has to support getkeystatus() to allow detecting that event. Note that if a non-modifier key gets pressed and repeated calls to getkeystatus() are made then it will return the modifier status at the time of the non-modifier key, until that key-press gets consumed by a getkey() call. This is a side-effect of how the EFI simple-text-input protocol works and cannot be avoided. Reviewed-by: Daniel Kiper 2020-04-21 Hans de Goede efi/console: Add grub_console_read_key_stroke() helper function This is a preparatory patch for adding getkeystatus() support to the EFI console driver. We can get modifier status through the simple_text_input read_key_stroke() method, but if a non-modifier key is (also) pressed the read_key_stroke() call will consume that key from the firmware's queue. The new grub_console_read_key_stroke() helper buffers upto 1 key-stroke. If it has a non-modifier key buffered, it will return that one, if its buffer is empty, it will fills its buffer by getting a new key-stroke. If called with consume=1 it will empty its buffer after copying the key-data to the callers buffer, this is how getkey() will use it. If called with consume=0 it will keep the last key-stroke buffered, this is how getkeystatus() will call it. This means that if a non-modifier key gets pressed, repeated getkeystatus() calls will return the modifiers of that key-press until it is consumed by a getkey() call. Reviewed-by: Daniel Kiper 2020-04-21 Hans de Goede kern/term: Make grub_getkeystatus() helper function available everywhere Move grub_getkeystatushelper() function from grub-core/commands/keystatus.c to grub-core/kern/term.c and export it so that it can be used outside of the keystatus command code too. There's no logic change in this patch. The function definition is moved so it can be called from grub-core/kern/term.c in a subsequent patch. It will be used to determine if a SHIFT key has was held down and use that also to interrupt the countdown, without the need to press a key at the right time. Reviewed-by: Daniel Kiper 2020-04-21 Javier Martinez Canillas efi/console: Move grub_console_set{colorstate,cursor} higher in the file This is just a preparatory patch to move the functions higher in the file, since these will be called by the grub_prepare_for_text_output() function that will be introduced in a later patch. The logic is unchanged by this patch. Functions definitions are just moved to avoid a forward declaration in a later patch, keeping the code clean. Reviewed-by: Daniel Kiper 2020-04-21 Paul Menzel docs/grub: Fix typo in *preferred* Reviewed-by: Daniel Kiper 2020-04-21 Daniel Axtens powerpc/mkimage: Fix CHRP note descsz Currently, an image generated with 'grub-mkimage -n' causes an error when read with 'readelf -a': Displaying notes found at file offset 0x000106f0 with length 0x0000002c: Owner Data size Description readelf: Warning: note with invalid namesz and/or descsz found at offset 0x0 readelf: Warning: type: 0x1275, namesize: 0x00000008, descsize: 0x0000002c, alignment: 4 This is because the descsz of the CHRP note is set to sizeof (struct grub_ieee1275_note) which is the size of the entire note, including name and elf header. The desczs should contain only the contents, not the name and header sizes. Set the descsz instead to 'sizeof (struct grub_ieee1275_note_desc)' Resultant readelf output: Displaying notes found at file offset 0x00010710 with length 0x0000002c: Owner Data size Description PowerPC 0x00000018 Unknown note type: (0x00001275) description data: ff ff ff ff 00 c0 00 00 ff ff ff ff ff ff ff ff ff ff ff ff 00 00 40 00 So far as I can tell this issue has existed for as long as the note generation code has existed, but I guess nothing really checks descsz. Reviewed-by: Daniel Kiper 2020-03-31 Flavio Suligoi efi: Add missed space in GRUB_EFI_GLOBAL_VARIABLE_GUID Reviewed-by: Daniel Kiper 2020-03-31 Michael Chang zfs: Fix gcc10 error -Werror=zero-length-bounds We bumped into the build error while testing gcc-10 pre-release. In file included from ../../include/grub/file.h:22, from ../../grub-core/fs/zfs/zfs.c:34: ../../grub-core/fs/zfs/zfs.c: In function 'zap_leaf_lookup': ../../grub-core/fs/zfs/zfs.c:2263:44: error: array subscript '' is outside the bounds of an interior zero-length array 'grub_uint16_t[0]' {aka 'short unsigned int[0]'} [-Werror=zero-length-bounds] 2263 | for (chunk = grub_zfs_to_cpu16 (l->l_hash[LEAF_HASH (blksft, h, l)], endian); ../../include/grub/types.h:241:48: note: in definition of macro 'grub_le_to_cpu16' 241 | # define grub_le_to_cpu16(x) ((grub_uint16_t) (x)) | ^ ../../grub-core/fs/zfs/zfs.c:2263:16: note: in expansion of macro 'grub_zfs_to_cpu16' 2263 | for (chunk = grub_zfs_to_cpu16 (l->l_hash[LEAF_HASH (blksft, h, l)], endian); | ^~~~~~~~~~~~~~~~~ In file included from ../../grub-core/fs/zfs/zfs.c:48: ../../include/grub/zfs/zap_leaf.h:72:16: note: while referencing 'l_hash' 72 | grub_uint16_t l_hash[0]; | ^~~~~~ Here I'd like to quote from the gcc document [1] which seems best to explain what is going on here. "Although the size of a zero-length array is zero, an array member of this kind may increase the size of the enclosing type as a result of tail padding. The offset of a zero-length array member from the beginning of the enclosing structure is the same as the offset of an array with one or more elements of the same type. The alignment of a zero-length array is the same as the alignment of its elements. Declaring zero-length arrays in other contexts, including as interior members of structure objects or as non-member objects, is discouraged. Accessing elements of zero-length arrays declared in such contexts is undefined and may be diagnosed." The l_hash[0] is apparnetly an interior member to the enclosed structure while l_entries[0] is the trailing member. And the offending code tries to access members in l_hash[0] array that triggers the diagnose. Given that the l_entries[0] is used to get proper alignment to access leaf chunks, we can accomplish the same thing through the ALIGN_UP macro thus eliminating l_entries[0] from the structure. In this way we can pacify the warning as l_hash[0] now becomes the last member to the enclosed structure. [1] https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html Reviewed-by: Daniel Kiper 2020-03-31 Michael Chang mdraid1x_linux: Fix gcc10 error -Werror=array-bounds We bumped into the build error while testing gcc-10 pre-release. ../../grub-core/disk/mdraid1x_linux.c: In function 'grub_mdraid_detect': ../../grub-core/disk/mdraid1x_linux.c:181:15: error: array subscript is outside array bounds of 'grub_uint16_t[0]' {aka 'short unsigned int[0]'} [-Werror=array-bounds] 181 | (char *) &sb.dev_roles[grub_le_to_cpu32 (sb.dev_number)] | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ../../grub-core/disk/mdraid1x_linux.c:98:17: note: while referencing 'dev_roles' 98 | grub_uint16_t dev_roles[0]; /* Role in array, or 0xffff for a spare, or 0xfffe for faulty. */ | ^~~~~~~~~ ../../grub-core/disk/mdraid1x_linux.c:127:33: note: defined here 'sb' 127 | struct grub_raid_super_1x sb; | ^~ cc1: all warnings being treated as errors Apparently gcc issues the warning when trying to access sb.dev_roles array's member, since it is a zero length array as the last element of struct grub_raid_super_1x that is allocated sparsely without extra chunks for the trailing bits, so the warning looks legitimate in this regard. As the whole thing here is doing offset computation, it is undue to use syntax that would imply array member access then take address from it later. Instead we could accomplish the same thing through basic array pointer arithmetic to pacify the warning. Reviewed-by: Daniel Kiper 2020-03-31 Simon Hardy build: Fix GRUB i386-pc build with Ubuntu gcc With recent versions of gcc on Ubuntu a very large lzma_decompress.img file is output. (e.g. 134479600 bytes instead of 2864.) This causes grub-mkimage to fail with: "error: Decompressor is too big." This seems to be caused by a section .note.gnu.property that is placed at an offset such that objcopy needs to pad the img file with zeros. This issue is present on: Ubuntu 19.10 with gcc (Ubuntu 8.3.0-26ubuntu1~19.10) 8.3.0 Ubuntu 19.10 with gcc (Ubuntu 9.2.1-9ubuntu2) 9.2.1 20191008 This issue is not present on: Ubuntu 19.10 with gcc (Ubuntu 7.5.0-3ubuntu1~19.10) 7.5.0 RHEL 8.0 with gcc 8.3.1 20190507 (Red Hat 8.3.1-4) The issue can be fixed by removing the section using objcopy as shown in this patch. Reviewed-by: Daniel Kiper 2020-03-31 Tianjia Zhang efi/tpm: Fix memory leak in grub_tpm1/2_log_event() The memory requested for the event is not released here, causing memory leaks. This patch fixes this problem. Reviewed-by: Javier Martinez Canillas Reviewed-by: Daniel Kiper 2020-03-31 Michael Chang docs: Document notes on LVM cache booting Add notes on LVM cache booting to the GRUB manual to help user understanding the outstanding issue and status. Reviewed-by: Daniel Kiper 2020-03-31 Michael Chang lvm: Add LVM cache logical volume handling The LVM cache logical volume is the logical volume consisting of the original and the cache pool logical volume. The original is usually on a larger and slower storage device while the cache pool is on a smaller and faster one. The performance of the original volume can be improved by storing the frequently used data on the cache pool to utilize the greater performance of faster device. The default cache mode "writethrough" ensures that any data written will be stored both in the cache and on the origin LV, therefore grub can be straight to read the original lv as no data loss is guarenteed. The second cache mode is "writeback", which delays writing from the cache pool back to the origin LV to have increased performance. The drawback is potential data loss if losing the associated cache device. During the boot time grub reads the LVM offline i.e. LVM volumes are not activated and mounted, hence it should be fine to read directly from original lv since all cached data should have been flushed back in the process of taking it offline. It is also not much helpful to the situation by adding fsync calls to the install code. The fsync did not force to write back dirty cache to the original device and rather it would update associated cache metadata to complete the write transaction with the cache device. IOW the writes to cached blocks still go only to the cache device. To write back dirty cache, as LVM cache did not support dirty cache flush per block range, there'no way to do it for file. On the other hand the "cleaner" policy is implemented and can be used to write back "all" dirty blocks in a cache, which effectively drain all dirty cache gradually to attain and last in the "clean" state, which can be useful for shrinking or decommissioning a cache. The result and effect is not what we are looking for here. In conclusion, as it seems no way to enforce file writes to the original device, grub may suffer from power failure as it cannot assemble the cache device and read the dirty data from it. However since the case is only applicable to writeback mode which is sensitive to data lost in nature, I'd still like to propose my (relatively simple) patch and treat reading dirty cache as improvement. Reviewed-by: Daniel Kiper 2020-03-10 Patrick Steinhardt gnulib: Fix build of base64 when compiling with memory debugging When building GRUB with memory management debugging enabled, then the build fails because of `grub_debug_malloc()` and `grub_debug_free()` being undefined in the luks2 module. The cause is that we patch "base64.h" to unconditionaly include "config-util.h", which shouldn't be included for modules at all. As a result, `MM_DEBUG` is defined when building the module, causing it to use the debug memory allocation functions. As these are not built into modules, we end up with a linker error. Fix the issue by removing the include altogether. The sole reason it was included was for the `_GL_ATTRIBUTE_CONST` macro, which we can simply define as empty in case it's not set. Reviewed-by: Daniel Kiper 2020-03-10 Patrick Steinhardt build: Fix option to explicitly disable memory debugging The memory management system supports a debug mode that can be enabled at build time by passing "--enable-mm-debug" to the configure script. Passing the option will cause us define MM_DEBUG as expected, but in fact the reverse option "--disable-mm-debug" will do the exact same thing and also set up the define. This currently causes the build of "lib/gnulib/base64.c" to fail as it tries to use `grub_debug_malloc()` and `grub_debug_free()` even though both symbols aren't defined. Seemingly, `AC_ARG_ENABLE()` will always execute the third argument if either the positive or negative option was passed. Let's thus fix the issue by moving the call to`AC_DEFINE()` into an explicit `if test $xenable_mm_debug` block, similar to how other defines work. Reviewed-by: Daniel Kiper Reviewed-by: Paul Menzel 2020-03-10 David Michael fat: Support file modification times This allows comparing file ages on EFI system partitions. Reviewed-by: Daniel Kiper 2020-03-10 David Michael exfat: Save the matching directory entry struct when searching This provides the node's attributes outside the iterator function so the file modification time can be accessed and reported. Reviewed-by: Daniel Kiper 2020-03-10 Mike Gilbert datetime: Enable the datetime module for the emu platform Fixes a build failure: grub-core/commands/date.c:49: undefined reference to `grub_get_weekday_name' grub-core/commands/ls.c:155: undefined reference to `grub_unixtime2datetime' Bug: https://bugs.gentoo.org/711512 Reviewed-by: Javier Martinez Canillas Tested-by: Javier Martinez Canillas Reviewed-by: Daniel Kiper 2020-03-10 John Paul Adrian Glaubitz build: Add soft-float handling for SuperH (sh4) While GRUB has no platform support for SuperH (sh4) yet, this change adds the target-specific handling of soft-floats such that the GRUB utilities can be built on this target. Reviewed-by: Daniel Kiper 2020-03-10 Peter Jones efi: Fix the type of grub_efi_status_t Currently, in some builds with some checkers, we see: 1. grub-core/disk/efi/efidisk.c:601: error[shiftTooManyBitsSigned]: Shifting signed 64-bit value by 63 bits is undefined behaviour This is because grub_efi_status_t is defined as grub_efi_intn_t, which is signed, and shifting into the sign bit is not defined behavior. UEFI fixed this in the spec in 2.3: 2.3 | Change the defined type of EFI_STATUS from INTN to UINTN | May 7, 2009 And the current EDK2 code has: MdePkg/Include/Base.h-// MdePkg/Include/Base.h-// Status codes common to all execution phases MdePkg/Include/Base.h-// MdePkg/Include/Base.h:typedef UINTN RETURN_STATUS; MdePkg/Include/Base.h- MdePkg/Include/Base.h-/** MdePkg/Include/Base.h- Produces a RETURN_STATUS code with the highest bit set. MdePkg/Include/Base.h- MdePkg/Include/Base.h- @param StatusCode The status code value to convert into a warning code. MdePkg/Include/Base.h- StatusCode must be in the range 0x00000000..0x7FFFFFFF. MdePkg/Include/Base.h- MdePkg/Include/Base.h- @return The value specified by StatusCode with the highest bit set. MdePkg/Include/Base.h- MdePkg/Include/Base.h-**/ MdePkg/Include/Base.h-#define ENCODE_ERROR(StatusCode) ((RETURN_STATUS)(MAX_BIT | (StatusCode))) MdePkg/Include/Base.h- MdePkg/Include/Base.h-/** MdePkg/Include/Base.h- Produces a RETURN_STATUS code with the highest bit clear. MdePkg/Include/Base.h- MdePkg/Include/Base.h- @param StatusCode The status code value to convert into a warning code. MdePkg/Include/Base.h- StatusCode must be in the range 0x00000000..0x7FFFFFFF. MdePkg/Include/Base.h- MdePkg/Include/Base.h- @return The value specified by StatusCode with the highest bit clear. MdePkg/Include/Base.h- MdePkg/Include/Base.h-**/ MdePkg/Include/Base.h-#define ENCODE_WARNING(StatusCode) ((RETURN_STATUS)(StatusCode)) MdePkg/Include/Base.h- MdePkg/Include/Base.h-/** MdePkg/Include/Base.h- Returns TRUE if a specified RETURN_STATUS code is an error code. MdePkg/Include/Base.h- MdePkg/Include/Base.h- This function returns TRUE if StatusCode has the high bit set. Otherwise, FALSE is returned. MdePkg/Include/Base.h- MdePkg/Include/Base.h- @param StatusCode The status code value to evaluate. MdePkg/Include/Base.h- MdePkg/Include/Base.h- @retval TRUE The high bit of StatusCode is set. MdePkg/Include/Base.h- @retval FALSE The high bit of StatusCode is clear. MdePkg/Include/Base.h- MdePkg/Include/Base.h-**/ MdePkg/Include/Base.h-#define RETURN_ERROR(StatusCode) (((INTN)(RETURN_STATUS)(StatusCode)) < 0) ... Uefi/UefiBaseType.h:typedef RETURN_STATUS EFI_STATUS; This patch makes grub's implementation match the Edk2 declaration with regards to the signedness of the type. Reviewed-by: Daniel Kiper 2020-03-10 Peter Jones efi/gop: Add debug output on GOP probing Add debug information to EFI GOP video driver probing function. Reviewed-by: Daniel Kiper 2020-03-10 Peter Jones efi/uga: Use video instead of fb as debug condition All other video drivers use "video" as the debug condition instead of "fb" so change this in the efi/uga driver to make it consistent with the others. Reviewed-by: Daniel Kiper 2020-03-10 Peter Jones efi: Print error messages to grub_efi_allocate_pages_real() No messages were printed in this function, add some to ease debugging. Also, the function returns a void * pointer so return NULL instead of 0 to make the code more readable. Reviewed-by: Daniel Kiper 2020-03-10 Andrei Borzenkov efi/uga: Use 64 bit for fb_base We get 64 bit from PCI BAR but then truncate by assigning to 32 bit. Make sure to check that pointer does not overflow on 32 bit platform. Closes: 50931 Reviewed-by: Daniel Kiper 2020-03-10 Alexander Graf efi/gop: Add support for BLT_ONLY adapters EFI GOP has support for multiple different bitness types of frame buffers and for a special "BLT only" type which is always defined to be RGBx. Because grub2 doesn't ever directly access the frame buffer but instead only renders graphics via the BLT interface anyway, we can easily support these adapters. The reason this has come up now is the emerging support for virtio-gpu in OVMF. That adapter does not have the notion of a memory mapped frame buffer and thus is BLT only. Reviewed-by: Daniel Kiper 2020-03-10 Peter Jones normal/completion: Fix possible NULL pointer dereference Coverity Scan reports that the grub_strrchr() function can return NULL if the character is not found. Check if that's the case for dirfile pointer. Reviewed-by: Daniel Kiper 2020-03-10 Peter Jones kern: Add grub_debug_enabled() Add a grub_debug_enabled() helper function instead of open coding it. Reviewed-by: Daniel Kiper 2020-03-10 Peter Jones Makefile: Make libgrub.pp depend on config-util.h If you build with "make -j48" a lot, sometimes you see: gcc -E -DHAVE_CONFIG_H -I. -I.. -Wall -W -DGRUB_UTIL=1 -D_FILE_OFFSET_BITS=64 -I./include -DGRUB_FILE=\"grub_script.tab.h\" -I. -I.. -I. -I.. -I../include -I./include -I../grub-core/lib/libgcrypt-grub/src/ -I../grub-core/lib/minilzo -I../grub-core/lib/xzembed -DMINILZO_HAVE_CONFIG_H -Wall -W -DGRUB_UTIL=1 -D_FILE_OFFSET_BITS=64 -I./include -DGRUB_FILE=\"grub_script.tab.h\" -I. -I.. -I. -I.. -I../include -I./include -I../grub-core/lib/libgcrypt-grub/src/ -I./grub-core/gnulib -I../grub-core/gnulib -I/builddir/build/BUILD/grub-2.02/grub-aarch64-efi-2.02 -D_FILE_OFFSET_BITS=64 \ -D'GRUB_MOD_INIT(x)=@MARKER@x@' grub_script.tab.h grub_script.yy.h ../grub-core/commands/blocklist.c ../grub-core/commands/macbless.c ../grub-core/commands/xnu_uuid.c ../grub-core/commands/testload.c ../grub-core/commands/ls.c ../grub-core/disk/dmraid_nvidia.c ../grub-core/disk/loopback.c ../grub-core/disk/lvm.c ../grub-core/disk/mdraid_linux.c ../grub-core/disk/mdraid_linux_be.c ../grub-core/disk/mdraid1x_linux.c ../grub-core/disk/raid5_recover.c ../grub-core/disk/raid6_recover.c ../grub-core/font/font.c ../grub-core/gfxmenu/font.c ../grub-core/normal/charset.c ../grub-core/video/fb/fbblit.c ../grub-core/video/fb/fbutil.c ../grub-core/video/fb/fbfill.c ../grub-core/video/fb/video_fb.c ../grub-core/video/video.c ../grub-core/video/capture.c ../grub-core/video/colors.c ../grub-core/unidata.c ../grub-core/io/bufio.c ../grub-core/fs/affs.c ../grub-core/fs/afs.c ../grub-core/fs/bfs.c ../grub-core/fs/btrfs.c ../grub-core/fs/cbfs.c ../grub-core/fs/cpio.c ../grub-core/fs/cpio_be.c ../grub-core/fs/odc.c ../grub-core/fs/newc.c ../grub-core/fs/ext2.c ../grub-core/fs/fat.c ../grub-core/fs/exfat.c ../grub-core/fs/fshelp.c ../grub-core/fs/hfs.c ../grub-core/fs/hfsplus.c ../grub-core/fs/hfspluscomp.c ../grub-core/fs/iso9660.c ../grub-core/fs/jfs.c ../grub-core/fs/minix.c ../grub-core/fs/minix2.c ../grub-core/fs/minix3.c ../grub-core/fs/minix_be.c ../grub-core/fs/minix2_be.c ../grub-core/fs/minix3_be.c ../grub-core/fs/nilfs2.c ../grub-core/fs/ntfs.c ../grub-core/fs/ntfscomp.c ../grub-core/fs/reiserfs.c ../grub-core/fs/romfs.c ../grub-core/fs/sfs.c ../grub-core/fs/squash4.c ../grub-core/fs/tar.c ../grub-core/fs/udf.c ../grub-core/fs/ufs2.c ../grub-core/fs/ufs.c ../grub-core/fs/ufs_be.c ../grub-core/fs/xfs.c ../grub-core/fs/zfs/zfscrypt.c ../grub-core/fs/zfs/zfs.c ../grub-core/fs/zfs/zfsinfo.c ../grub-core/fs/zfs/zfs_lzjb.c ../grub-core/fs/zfs/zfs_lz4.c ../grub-core/fs/zfs/zfs_sha256.c ../grub-core/fs/zfs/zfs_fletcher.c ../grub-core/lib/envblk.c ../grub-core/lib/hexdump.c ../grub-core/lib/LzFind.c ../grub-core/lib/LzmaEnc.c ../grub-core/lib/crc.c ../grub-core/lib/adler32.c ../grub-core/lib/crc64.c ../grub-core/normal/datetime.c ../grub-core/normal/misc.c ../grub-core/partmap/acorn.c ../grub-core/partmap/amiga.c ../grub-core/partmap/apple.c ../grub-core/partmap/sun.c ../grub-core/partmap/plan.c ../grub-core/partmap/dvh.c ../grub-core/partmap/sunpc.c ../grub-core/partmap/bsdlabel.c ../grub-core/partmap/dfly.c ../grub-core/script/function.c ../grub-core/script/lexer.c ../grub-core/script/main.c ../grub-core/script/script.c ../grub-core/script/argv.c ../grub-core/io/gzio.c ../grub-core/io/xzio.c ../grub-core/io/lzopio.c ../grub-core/kern/ia64/dl_helper.c ../grub-core/kern/arm/dl_helper.c ../grub-core/kern/arm64/dl_helper.c ../grub-core/lib/minilzo/minilzo.c ../grub-core/lib/xzembed/xz_dec_bcj.c ../grub-core/lib/xzembed/xz_dec_lzma2.c ../grub-core/lib/xzembed/xz_dec_stream.c ../util/misc.c ../grub-core/kern/command.c ../grub-core/kern/device.c ../grub-core/kern/disk.c ../grub-core/lib/disk.c ../util/getroot.c ../grub-core/osdep/unix/getroot.c ../grub-core/osdep/getroot.c ../grub-core/osdep/devmapper/getroot.c ../grub-core/osdep/relpath.c ../grub-core/kern/emu/hostdisk.c ../grub-core/osdep/devmapper/hostdisk.c ../grub-core/osdep/hostdisk.c ../grub-core/osdep/unix/hostdisk.c ../grub-core/osdep/exec.c ../grub-core/osdep/sleep.c ../grub-core/osdep/password.c ../grub-core/kern/emu/misc.c ../grub-core/kern/emu/mm.c ../grub-core/kern/env.c ../grub-core/kern/err.c ../grub-core/kern/file.c ../grub-core/kern/fs.c ../grub-core/kern/list.c ../grub-core/kern/misc.c ../grub-core/kern/partition.c ../grub-core/lib/crypto.c ../grub-core/disk/luks.c ../grub-core/disk/geli.c ../grub-core/disk/cryptodisk.c ../grub-core/disk/AFSplitter.c ../grub-core/lib/pbkdf2.c ../grub-core/commands/extcmd.c ../grub-core/lib/arg.c ../grub-core/disk/ldm.c ../grub-core/disk/diskfilter.c ../grub-core/partmap/gpt.c ../grub-core/partmap/msdos.c ../grub-core/fs/proc.c ../grub-core/fs/archelp.c > libgrub.pp || (rm -f libgrub.pp; exit 1) rm -f stamp-h1 touch ../config-util.h.in cd . && /bin/sh ./config.status config-util.h config.status: creating config-util.h In file included from ../include/grub/mm.h:25:0, from ../include/grub/disk.h:29, from ../include/grub/file.h:26, from ../grub-core/fs/btrfs.c:21: ./config.h:38:10: fatal error: ./config-util.h: No such file or directory #include ^~~~~~~~~~~~~~~ compilation terminated. make: *** [Makefile:13098: libgrub.pp] Error 1 This is because libgrub.pp is built with -DGRUB_UTIL=1, which means it'll try to include config-util.h, but a parallel make is actually building that file. I think. Reviewed-by: Daniel Kiper 2020-03-10 Peter Jones efi: Print more debug info in our module loader The function that searches the mods section base address does not have any debug information. Add some debugging outputs that could be useful. Reviewed-by: Daniel Kiper 2020-03-10 Peter Jones linux/getroot: Handle rssd storage device names The Micron PCIe SSDs Linux driver (mtip32xx) exposes block devices as /dev/rssd[a-z]+[0-9]*. Add support for these rssd device names. Reviewed-by: Daniel Kiper 2020-03-10 Julian Andres Klode smbios: Add a --linux argument to apply linux modalias-like filtering Linux creates modalias strings by filtering out non-ASCII, space, and colon characters. Provide an option that does the same filtering so people can create a modalias string in GRUB, and then match their modalias patterns against it. Reviewed-by: Daniel Kiper 2020-03-10 Mike Gilbert po: Fix replacement of %m in sed programs When running make dist, I hit this error: rm -f en@arabic.gmo && /usr/bin/gmsgfmt -c --statistics --verbose -o en@arabic.gmo en@arabic.po en@arabic.po:5312: 'msgstr' is not a valid C format string, unlike 'msgid'. Reason: The character that terminates the directive number 3 is not a valid conversion specifier. /usr/bin/gmsgfmt: found 1 fatal error This was caused by "%m" being replaced with foreign Unicode characters. For example: msgid "cannot rename the file %s to %s: %m" msgstr "ﺹﺎﻨﻧﻮﺗ ﺮﻌﻧﺎﻤﻋ ﺖﻬﻋ ﻒִﻴﻠﻋ %s ﺕﻭ %s: %ﻡ" Mimic the workaround used for "%s" by reversing the replacement of "%m" at the end of the sed programs. Reviewed-by: Daniel Kiper 2020-03-10 Colin Watson gettext: Restore patches to po/Makefile.in.in These were inadvertently lost during the conversion to Gnulib (gnulib: Upgrade Gnulib and switch to bootstrap tool; commit 35b909062). The files in po/gettext-patches/ can be imported using "git am" on top of the gettext tag corresponding to AM_GNU_GETTEXT_VERSION in configure.ac (currently 0.18.3). They handle translation of messages in shell files, make msgfmt output in little-endian format, and arrange to use @SHELL@ rather than /bin/sh. There were some changes solely for the purpose of distributing extra files; for ease of maintenance, I've added these to conf/Makefile.extra-dist instead. Fixes: https://savannah.gnu.org/bugs/?57298 Reviewed-by: Daniel Kiper 2020-02-28 Peter Jones misc: Make grub_strtol() "end" pointers have safer const qualifiers Currently the string functions grub_strtol(), grub_strtoul(), and grub_strtoull() don't declare the "end" pointer in such a way as to require the pointer itself or the character array to be immutable to the implementation, nor does the C standard do so in its similar functions, though it does require us not to change any of it. The typical declarations of these functions follow this pattern: long strtol(const char * restrict nptr, char ** restrict endptr, int base); Much of the reason for this is historic, and a discussion of that follows below, after the explanation of this change. (GRUB currently does not include the "restrict" qualifiers, and we name the arguments a bit differently.) The implementation is semantically required to treat the character array as immutable, but such accidental modifications aren't stopped by the compiler, and the semantics for both the callers and the implementation of these functions are sometimes also helped by adding that requirement. This patch changes these declarations to follow this pattern instead: long strtol(const char * restrict nptr, const char ** const restrict endptr, int base); This means that if any modification to these functions accidentally introduces either an errant modification to the underlying character array, or an accidental assignment to endptr rather than *endptr, the compiler should generate an error. (The two uses of "restrict" in this case basically mean strtol() isn't allowed to modify the character array by going through *endptr, and endptr isn't allowed to point inside the array.) It also means the typical use case changes to: char *s = ...; const char *end; long l; l = strtol(s, &end, 10); Or even: const char *p = str; while (p && *p) { long l = strtol(p, &p, 10); ... } This fixes 26 places where we discard our attempts at treating the data safely by doing: const char *p = str; long l; l = strtol(p, (char **)&ptr, 10); It also adds 5 places where we do: char *p = str; while (p && *p) { long l = strtol(p, (const char ** const)&p, 10); ... /* more calls that need p not to be pointer-to-const */ } While moderately distasteful, this is a better problem to have. With one minor exception, I have tested that all of this compiles without relevant warnings or errors, and that /much/ of it behaves correctly, with gcc 9 using 'gcc -W -Wall -Wextra'. The one exception is the changes in grub-core/osdep/aros/hostdisk.c , which I have no idea how to build. Because the C standard defined type-qualifiers in a way that can be confusing, in the past there's been a slow but fairly regular stream of churn within our patches, which add and remove the const qualifier in many of the users of these functions. This change should help avoid that in the future, and in order to help ensure this, I've added an explanation in misc.h so that when someone does get a compiler warning about a type error, they have the fix at hand. The reason we don't have "const" in these calls in the standard is purely anachronistic: C78 (de facto) did not have type qualifiers in the syntax, and the "const" type qualifier was added for C89 (I think; it may have been later). strtol() appears to date from 4.3BSD in 1986, which means it could not be added to those functions in the standard without breaking compatibility, which is usually avoided. The syntax chosen for type qualifiers is what has led to the churn regarding usage of const, and is especially confusing on string functions due to the lack of a string type. Quoting from C99, the syntax is: declarator: pointer[opt] direct-declarator direct-declarator: identifier ( declarator ) direct-declarator [ type-qualifier-list[opt] assignment-expression[opt] ] ... direct-declarator [ type-qualifier-list[opt] * ] ... pointer: * type-qualifier-list[opt] * type-qualifier-list[opt] pointer type-qualifier-list: type-qualifier type-qualifier-list type-qualifier ... type-qualifier: const restrict volatile So the examples go like: const char foo; // immutable object const char *foo; // mutable pointer to object char * const foo; // immutable pointer to mutable object const char * const foo; // immutable pointer to immutable object const char const * const foo; // XXX extra const keyword in the middle const char * const * const foo; // immutable pointer to immutable // pointer to immutable object const char ** const foo; // immutable pointer to mutable pointer // to immutable object Making const left-associative for * and right-associative for everything else may not have been the best choice ever, but here we are, and the inevitable result is people using trying to use const (as they should!), putting it at the wrong place, fighting with the compiler for a bit, and then either removing it or typecasting something in a bad way. I won't go into describing restrict, but its syntax has exactly the same issue as with const. Anyway, the last example above actually represents the *behavior* that's required of strtol()-like functions, so that's our choice for the "end" pointer. Reviewed-by: Daniel Kiper 2020-02-28 Mike Gilbert build: Disable PIE in TARGET_CCASFLAGS if needed PIE should be disabled in assembly sources as well, or else GRUB will fail to boot. Bug: https://bugs.gentoo.org/667852 Reviewed-by: Daniel Kiper Tested-by: John Paul Adrian Glaubitz 2020-02-28 Mike Gilbert build: Move TARGET_* assignments earlier On a 32-bit SPARC userland, configure fails to compile assembly and the build fails: checking for options to compile assembly... configure: error: could not compile assembly config.log shows: asm-tests/sparc64.S: Assembler messages: asm-tests/sparc64.S:5: Error: Architecture mismatch on "lduw [%o4+4],%o4". asm-tests/sparc64.S:5: (Requires v9|v9a|v9b|v9c|v9d|v9e|v9v|v9m|m8; requested architecture is sparclite.) asm-tests/sparc64.S:7: Error: Architecture mismatch on "stw %o5,[%o3]". asm-tests/sparc64.S:7: (Requires v9|v9a|v9b|v9c|v9d|v9e|v9v|v9m|m8; requested architecture is sparclite.) asm-tests/sparc64.S:8: Error: Architecture mismatch on "bne,pt %icc,1b ,pt %icc,1b". asm-tests/sparc64.S:8: (Requires v9|v9a|v9b|v9c|v9d|v9e|v9v|v9m|m8; requested architecture is sparclite.) Simply moving these blocks earlier in configure.ac is sufficient to ensure that the tests are executed with the appropriate flags (specifically -m64 in this case). Bug: https://bugs.gentoo.org/667850 Reviewed-by: Daniel Kiper Tested-by: John Paul Adrian Glaubitz 2020-02-28 Patrick Steinhardt luks2: Add missing newline to debug message The debug message printed when decryption with a keyslot fails is missing its trailing newline. Add it to avoid mangling it with subsequent output. Reviewed-by: Daniel Kiper 2020-02-18 Michael Chang verifiers: Fix calling uninitialized function pointer The necessary check for NULL before use of function ver->close is not taking place in the failure path. This patch simply adds the missing check and fixes the problem that GRUB hangs indefinitely after booting rogue image without valid signature if secure boot is turned on. Now it displays like this for booting rogue UEFI image: error: bad shim signature error: you need to load the kernel first Press any key to continue... and then you can go back to boot menu by pressing any key or after a few seconds expired. Reviewed-by: Javier Martinez Canillas Reviewed-by: Daniel Kiper 2020-02-18 Peter Jones grub-editenv: Make grub-editenv chase symlinks including those across devices The grub-editenv create command will wrongly overwrite /boot/grub2/grubenv with a regular file if grubenv is a symbolic link. But instead, it should create a new file in the path the symlink points to. This lets /boot/grub2/grubenv be a symlink to /boot/efi/EFI/fedora/grubenv even when they're different mount points, which allows grub2-editenv to be the same across platforms (i.e. UEFI vs BIOS). For example, in Fedora the GRUB EFI builds have prefix set to /EFI/fedora (on the EFI System Partition), but for BIOS machine it'll be /boot/grub2 (which may or may not be its own mountpoint). With this patch, on EFI machines we can make /boot/grub2/grubenv a symlink to /boot/efi/EFI/fedora/grubenv, and the same copy of grub-set-default will work on both kinds of systems. Windows doesn't implement a readlink primitive, so the current behaviour is maintained for this operating system. Reviewed-by: Adam Jackson Reviewed-by: Daniel Kiper 2020-02-18 Peter Jones grub-editenv: Add grub_util_readlink() Currently grub-editenv and related tools are not able to follow symbolic links when finding their config file. For example the grub-editenv create command will wrongly overwrite a symlink in /boot/grub2/grubenv with a new regular file, instead of creating a file in the path the symlink points to. A following patch will change that and add support in grub-editenv to follow symbolic links when finding the grub environment variables file. Add a grub_util_readlink() helper function that is just a wrapper around the platform specific function to read the value of a symbolic link. This helper function will be used by the following patch for grub-editenv. The helper function is not added for Windows, since this operating system doesn't have a primitive to read the contents of a symbolic link. Reviewed-by: Adam Jackson Reviewed-by: Daniel Kiper 2020-02-18 Robert Marshall docs: Update info with grub.cfg netboot selection order Add documentation to the GRUB manual that specifies the order netboot clients use to select a GRUB configuration file. Also explain that the feature is enabled by default but can be disabled by setting the "feature_net_search_cfg" environment variable to "n" in an embedded configuration file. Reviewed-by: Daniel Kiper 2020-02-18 Paulo Flabiano Smorigo normal/main: Search for specific config files for netboot This patch implements a search for a specific configuration when the config file is on a remoteserver. It uses the following order: 1) DHCP client UUID option. 2) MAC address (in lower case hexadecimal with dash separators); 3) IP (in upper case hexadecimal) or IPv6; 4) The original grub.cfg file. This procedure is similar to what is used by pxelinux and yaboot: http://www.syslinux.org/wiki/index.php/PXELINUX#config It is enabled by default but can be disabled by setting the environment variable "feature_net_search_cfg" to "n" in an embedded configuration. Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=873406 Reviewed-by: Daniel Kiper 2020-02-18 Paulo Flabiano Smorigo net/dhcp: Set net__client{id, uuid} variables from DHCP options This patch sets a net__clientid and net__clientuuid GRUB environment variables, using the DHCP client ID and UUID options if these are found. In the same way than net__